summaryrefslogtreecommitdiffstats
path: root/src/multimedia/platform/darwin/camera
diff options
context:
space:
mode:
Diffstat (limited to 'src/multimedia/platform/darwin/camera')
-rw-r--r--src/multimedia/platform/darwin/camera/avfcameraimagecapture.mm4
-rw-r--r--src/multimedia/platform/darwin/camera/avfcameraservice.mm63
-rw-r--r--src/multimedia/platform/darwin/camera/avfcameraservice_p.h15
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamerasession.mm7
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamerasession_p.h1
-rw-r--r--src/multimedia/platform/darwin/camera/avfmediaencoder.mm60
-rw-r--r--src/multimedia/platform/darwin/camera/avfmediaencoder_p.h12
7 files changed, 73 insertions, 89 deletions
diff --git a/src/multimedia/platform/darwin/camera/avfcameraimagecapture.mm b/src/multimedia/platform/darwin/camera/avfcameraimagecapture.mm
index 60a4484ff..7536d88d3 100644
--- a/src/multimedia/platform/darwin/camera/avfcameraimagecapture.mm
+++ b/src/multimedia/platform/darwin/camera/avfcameraimagecapture.mm
@@ -301,7 +301,7 @@ QImageEncoderSettings AVFCameraImageCapture::imageSettings() const
}
settings.setResolution(res);
- settings.setFormat(QImageEncoderSettings::JPEG);
+ settings.setFormat(QCameraImageCapture::JPEG);
return settings;
}
@@ -330,7 +330,7 @@ bool AVFCameraImageCapture::applySettings()
return false;
}
- if (m_settings.format() != QImageEncoderSettings::UnspecifiedFormat && m_settings.format() != QImageEncoderSettings::JPEG) {
+ if (m_settings.format() != QCameraImageCapture::UnspecifiedFormat && m_settings.format() != QCameraImageCapture::JPEG) {
qDebugCamera() << Q_FUNC_INFO << "unsupported format:" << m_settings.format();
return false;
}
diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice.mm b/src/multimedia/platform/darwin/camera/avfcameraservice.mm
index 899dd4602..8ee350d02 100644
--- a/src/multimedia/platform/darwin/camera/avfcameraservice.mm
+++ b/src/multimedia/platform/darwin/camera/avfcameraservice.mm
@@ -48,13 +48,14 @@
#include "avfcameraimagecapture_p.h"
#include "avfmediaencoder_p.h"
#include <qmediadevices.h>
+#include <private/qplatformaudioinput_p.h>
+#include <qaudioinput.h>
QT_USE_NAMESPACE
AVFCameraService::AVFCameraService()
{
m_session = new AVFCameraSession(this);
- m_audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
}
AVFCameraService::~AVFCameraService()
@@ -122,57 +123,35 @@ void AVFCameraService::setMediaEncoder(QPlatformMediaEncoder *encoder)
emit encoderChanged();
}
-bool AVFCameraService::isMuted() const
+void AVFCameraService::setAudioInput(QPlatformAudioInput *input)
{
- return m_muted;
-}
-
-void AVFCameraService::setMuted(bool muted)
-{
- if (m_muted != muted) {
- m_muted = muted;
- Q_EMIT mutedChanged(muted);
- }
-}
+ if (m_audioInput == input)
+ return;
+ if (m_audioInput)
+ m_audioInput->q->disconnect(this);
-qreal AVFCameraService::volume() const
-{
- return m_volume;
-}
+ m_audioInput = input;
-void AVFCameraService::setVolume(qreal volume)
-{
- if (m_volume != volume) {
- m_volume = volume;
- Q_EMIT volumeChanged(volume);
+ if (input) {
+ connect(m_audioInput->q, &QAudioInput::destroyed, this, &AVFCameraService::audioInputDestroyed);
+ connect(m_audioInput->q, &QAudioInput::deviceChanged, this, &AVFCameraService::audioInputChanged);
}
+ audioInputChanged();
}
-QAudioDevice AVFCameraService::audioInput() const
-{
- QByteArray id = [[m_audioCaptureDevice uniqueID] UTF8String];
- const QList<QAudioDevice> devices = QMediaDevices::audioInputs();
- for (auto d : devices)
- if (d.id() == id)
- return d;
- return QMediaDevices::defaultAudioInput();
-}
-
-bool AVFCameraService::setAudioInput(const QAudioDevice &id)
+void AVFCameraService::audioInputChanged()
{
- AVCaptureDevice *device = nullptr;
+ m_audioCaptureDevice = nullptr;
+ if (!m_audioInput)
+ return;
- if (!id.isNull()) {
- device = [AVCaptureDevice deviceWithUniqueID: [NSString stringWithUTF8String:id.id().constData()]];
+ QByteArray id = m_audioInput->device.id();
+ if (!id.isEmpty()) {
+ m_audioCaptureDevice = [AVCaptureDevice deviceWithUniqueID: [NSString stringWithUTF8String:id.constData()]];
} else {
- device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
- }
-
- if (device) {
- m_audioCaptureDevice = device;
- return true;
+ m_audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
}
- return false;
+ m_session->updateAudioInput();
}
void AVFCameraService::setVideoPreview(QVideoSink *sink)
diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h
index 5698cda7a..d2c75096e 100644
--- a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h
+++ b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h
@@ -67,7 +67,7 @@ class AVFMediaEncoder;
class AVFCameraService : public QPlatformMediaCaptureSession
{
-Q_OBJECT
+ Q_OBJECT
public:
AVFCameraService();
~AVFCameraService();
@@ -81,12 +81,7 @@ public:
QPlatformMediaEncoder *mediaEncoder() override;
void setMediaEncoder(QPlatformMediaEncoder *encoder) override;
- bool isMuted() const override;
- void setMuted(bool muted) override;
- qreal volume() const override;
- void setVolume(qreal volume) override;
- QAudioDevice audioInput() const override;
- bool setAudioInput(const QAudioDevice &) override;
+ void setAudioInput(QPlatformAudioInput *) override;
void setVideoPreview(QVideoSink *sink) override;
@@ -96,9 +91,11 @@ public:
AVFCameraImageCapture *avfImageCaptureControl() const { return m_imageCaptureControl; }
AVCaptureDevice *audioCaptureDevice() const { return m_audioCaptureDevice; }
+public Q_SLOTS:
+ void audioInputDestroyed() { setAudioInput(nullptr); }
+ void audioInputChanged();
private:
- bool m_muted = false;
- qreal m_volume = 1.0;
+ QPlatformAudioInput *m_audioInput = nullptr;
AVCaptureDevice *m_audioCaptureDevice = nullptr;
AVFCameraSession *m_session = nullptr;
diff --git a/src/multimedia/platform/darwin/camera/avfcamerasession.mm b/src/multimedia/platform/darwin/camera/avfcamerasession.mm
index 745db0ae9..61dd83459 100644
--- a/src/multimedia/platform/darwin/camera/avfcamerasession.mm
+++ b/src/multimedia/platform/darwin/camera/avfcamerasession.mm
@@ -362,6 +362,8 @@ void AVFCameraSession::attachAudioInputDevice()
}
AVCaptureDevice *audioDevice = m_service->audioCaptureDevice();
+ if (!audioDevice)
+ return;
NSError *error = nil;
m_audioInput = [AVCaptureDeviceInput
@@ -429,4 +431,9 @@ void AVFCameraSession::setVideoSink(QVideoSink *sink)
}
}
+void AVFCameraSession::updateAudioInput()
+{
+ attachAudioInputDevice();
+}
+
#include "moc_avfcamerasession_p.cpp"
diff --git a/src/multimedia/platform/darwin/camera/avfcamerasession_p.h b/src/multimedia/platform/darwin/camera/avfcamerasession_p.h
index 530bdc96a..9d863e7fa 100644
--- a/src/multimedia/platform/darwin/camera/avfcamerasession_p.h
+++ b/src/multimedia/platform/darwin/camera/avfcamerasession_p.h
@@ -93,6 +93,7 @@ public:
AVCaptureDeviceInput *audioInput() const {return m_audioInput;}
void setVideoSink(QVideoSink *sink);
+ void updateAudioInput();
public Q_SLOTS:
void setActive(bool active);
diff --git a/src/multimedia/platform/darwin/camera/avfmediaencoder.mm b/src/multimedia/platform/darwin/camera/avfmediaencoder.mm
index 7d1725913..916d9fe7e 100644
--- a/src/multimedia/platform/darwin/camera/avfmediaencoder.mm
+++ b/src/multimedia/platform/darwin/camera/avfmediaencoder.mm
@@ -85,11 +85,11 @@ bool qt_file_exists(NSURL *fileURL)
}
-AVFMediaEncoder::AVFMediaEncoder(QMediaEncoder *parent)
+AVFMediaEncoder::AVFMediaEncoder(QMediaRecorder *parent)
: QObject(parent)
, QPlatformMediaEncoder(parent)
- , m_state(QMediaEncoder::StoppedState)
- , m_lastStatus(QMediaEncoder::StoppedStatus)
+ , m_state(QMediaRecorder::StoppedState)
+ , m_lastStatus(QMediaRecorder::StoppedStatus)
, m_audioSettings(nil)
, m_videoSettings(nil)
//, m_restoreFPS(-1, -1)
@@ -122,12 +122,12 @@ bool AVFMediaEncoder::setOutputLocation(const QUrl &location)
return location.scheme() == QLatin1String("file") || location.scheme().isEmpty();
}
-QMediaEncoder::State AVFMediaEncoder::state() const
+QMediaRecorder::RecorderState AVFMediaEncoder::state() const
{
return m_state;
}
-QMediaEncoder::Status AVFMediaEncoder::status() const
+QMediaRecorder::Status AVFMediaEncoder::status() const
{
return m_lastStatus;
}
@@ -368,7 +368,7 @@ void AVFMediaEncoder::applySettings()
return;
AVFCameraSession *session = m_service->session();
- if (m_state != QMediaEncoder::StoppedState)
+ if (m_state != QMediaRecorder::StoppedState)
return;
const auto flag = (session->activeCameraInfo().isNull())
@@ -427,7 +427,7 @@ void AVFMediaEncoder::setCaptureSession(QPlatformMediaCaptureSession *session)
return;
if (m_service)
- setState(QMediaEncoder::StoppedState);
+ setState(QMediaRecorder::StoppedState);
m_service = captureSession;
if (!m_service)
@@ -437,7 +437,7 @@ void AVFMediaEncoder::setCaptureSession(QPlatformMediaCaptureSession *session)
onCameraChanged();
}
-void AVFMediaEncoder::setState(QMediaEncoder::State state)
+void AVFMediaEncoder::setState(QMediaRecorder::RecorderState state)
{
if (!m_service || !m_service->session()) {
qWarning() << Q_FUNC_INFO << "Encoder is not set to a capture session";
@@ -453,14 +453,14 @@ void AVFMediaEncoder::setState(QMediaEncoder::State state)
return;
switch (state) {
- case QMediaEncoder::RecordingState:
+ case QMediaRecorder::RecordingState:
m_service->session()->setActive(true);
record();
break;
- case QMediaEncoder::PausedState:
- Q_EMIT error(QMediaEncoder::FormatError, tr("Recording pause not supported"));
+ case QMediaRecorder::PausedState:
+ Q_EMIT error(QMediaRecorder::FormatError, tr("Recording pause not supported"));
return;
- case QMediaEncoder::StoppedState:
+ case QMediaRecorder::StoppedState:
// Do not check the camera status, we can stop if we started.
stopWriter();
}
@@ -476,7 +476,7 @@ void AVFMediaEncoder::record()
AVFCamera *cameraControl = m_service->avfCameraControl();
if (!cameraControl || cameraControl->status() != QCamera::ActiveStatus) {
qDebugCamera() << Q_FUNC_INFO << "can not start record while camera is not active";
- Q_EMIT error(QMediaEncoder::ResourceError, tr("Failed to start recording"));
+ Q_EMIT error(QMediaRecorder::ResourceError, tr("Failed to start recording"));
return;
}
@@ -503,13 +503,13 @@ void AVFMediaEncoder::record()
NSURL *nsFileURL = fileURL.toNSURL();
if (!nsFileURL) {
qWarning() << Q_FUNC_INFO << "invalid output URL:" << fileURL;
- Q_EMIT error(QMediaEncoder::ResourceError, tr("Invalid output file URL"));
+ Q_EMIT error(QMediaRecorder::ResourceError, tr("Invalid output file URL"));
return;
}
if (!qt_is_writable_file_URL(nsFileURL)) {
qWarning() << Q_FUNC_INFO << "invalid output URL:" << fileURL
<< "(the location is not writable)";
- Q_EMIT error(QMediaEncoder::ResourceError, tr("Non-writeable file location"));
+ Q_EMIT error(QMediaRecorder::ResourceError, tr("Non-writeable file location"));
return;
}
if (qt_file_exists(nsFileURL)) {
@@ -517,7 +517,7 @@ void AVFMediaEncoder::record()
// Objective-C exception, which is not good at all.
qWarning() << Q_FUNC_INFO << "invalid output URL:" << fileURL
<< "(file already exists)";
- Q_EMIT error(QMediaEncoder::ResourceError, tr("File already exists"));
+ Q_EMIT error(QMediaRecorder::ResourceError, tr("File already exists"));
return;
}
@@ -533,8 +533,8 @@ void AVFMediaEncoder::record()
videoSettings:m_videoSettings
transform:CGAffineTransformMakeRotation(qDegreesToRadians(rotation))]) {
- m_state = QMediaEncoder::RecordingState;
- m_lastStatus = QMediaEncoder::StartingStatus;
+ m_state = QMediaRecorder::RecordingState;
+ m_lastStatus = QMediaRecorder::StartingStatus;
Q_EMIT actualLocationChanged(fileURL);
Q_EMIT stateChanged(m_state);
@@ -551,14 +551,14 @@ void AVFMediaEncoder::record()
[m_writer start];
} else {
[session startRunning];
- Q_EMIT error(QMediaEncoder::FormatError, tr("Failed to start recording"));
+ Q_EMIT error(QMediaRecorder::FormatError, tr("Failed to start recording"));
}
}
void AVFMediaEncoder::assetWriterStarted()
{
- m_lastStatus = QMediaEncoder::RecordingStatus;
- Q_EMIT statusChanged(QMediaEncoder::RecordingStatus);
+ m_lastStatus = QMediaRecorder::RecordingStatus;
+ Q_EMIT statusChanged(QMediaRecorder::RecordingStatus);
}
void AVFMediaEncoder::assetWriterFinished()
@@ -566,8 +566,8 @@ void AVFMediaEncoder::assetWriterFinished()
Q_ASSERT(m_service && m_service->session());
AVFCameraSession *session = m_service->session();
- const QMediaEncoder::Status lastStatus = m_lastStatus;
- const QMediaEncoder::State lastState = m_state;
+ const QMediaRecorder::Status lastStatus = m_lastStatus;
+ const QMediaRecorder::RecorderState lastState = m_state;
unapplySettings();
@@ -576,8 +576,8 @@ void AVFMediaEncoder::assetWriterFinished()
}
[session->captureSession() startRunning];
- m_state = QMediaEncoder::StoppedState;
- m_lastStatus = QMediaEncoder::StoppedStatus;
+ m_state = QMediaRecorder::StoppedState;
+ m_lastStatus = QMediaRecorder::StoppedStatus;
if (m_lastStatus != lastStatus)
Q_EMIT statusChanged(m_lastStatus);
if (m_state != lastState)
@@ -599,12 +599,12 @@ void AVFMediaEncoder::cameraActiveChanged(bool active)
AVFCamera *cameraControl = m_service->avfCameraControl();
Q_ASSERT(cameraControl);
- const QMediaEncoder::Status lastStatus = m_lastStatus;
+ const QMediaRecorder::Status lastStatus = m_lastStatus;
if (!active) {
- if (m_lastStatus == QMediaEncoder::RecordingStatus)
+ if (m_lastStatus == QMediaRecorder::RecordingStatus)
return stopWriter();
- m_lastStatus = QMediaEncoder::StoppedStatus;
+ m_lastStatus = QMediaRecorder::StoppedStatus;
}
if (lastStatus != m_lastStatus)
@@ -613,8 +613,8 @@ void AVFMediaEncoder::cameraActiveChanged(bool active)
void AVFMediaEncoder::stopWriter()
{
- if (m_lastStatus == QMediaEncoder::RecordingStatus) {
- m_lastStatus = QMediaEncoder::FinalizingStatus;
+ if (m_lastStatus == QMediaRecorder::RecordingStatus) {
+ m_lastStatus = QMediaRecorder::FinalizingStatus;
Q_EMIT statusChanged(m_lastStatus);
diff --git a/src/multimedia/platform/darwin/camera/avfmediaencoder_p.h b/src/multimedia/platform/darwin/camera/avfmediaencoder_p.h
index 149adafa7..bd9588e27 100644
--- a/src/multimedia/platform/darwin/camera/avfmediaencoder_p.h
+++ b/src/multimedia/platform/darwin/camera/avfmediaencoder_p.h
@@ -74,14 +74,14 @@ class AVFMediaEncoder : public QObject, public QPlatformMediaEncoder
{
Q_OBJECT
public:
- AVFMediaEncoder(QMediaEncoder *parent);
+ AVFMediaEncoder(QMediaRecorder *parent);
~AVFMediaEncoder() override;
QUrl outputLocation() const override;
bool setOutputLocation(const QUrl &location) override;
- QMediaEncoder::State state() const override;
- QMediaEncoder::Status status() const override;
+ QMediaRecorder::RecorderState state() const override;
+ QMediaRecorder::Status status() const override;
qint64 duration() const override;
@@ -96,7 +96,7 @@ public:
void setCaptureSession(QPlatformMediaCaptureSession *session);
public Q_SLOTS:
- void setState(QMediaEncoder::State state) override;
+ void setState(QMediaRecorder::RecorderState state) override;
private:
@@ -117,8 +117,8 @@ private:
QUrl m_outputLocation;
AVFStorageLocation m_storageLocation;
- QMediaEncoder::State m_state;
- QMediaEncoder::Status m_lastStatus;
+ QMediaRecorder::RecorderState m_state;
+ QMediaRecorder::Status m_lastStatus;
QMediaEncoderSettings m_settings;
NSDictionary *m_audioSettings;