diff options
Diffstat (limited to 'src/multimedia/platform/darwin/camera')
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; |