diff --git a/include/f1x/openauto/autoapp/Projection/AudioOutput.hpp b/include/f1x/openauto/autoapp/Projection/AudioOutput.hpp index aa868b4..9aa4d41 100644 --- a/include/f1x/openauto/autoapp/Projection/AudioOutput.hpp +++ b/include/f1x/openauto/autoapp/Projection/AudioOutput.hpp @@ -42,23 +42,27 @@ public: void write(const aasdk::common::DataConstBuffer& buffer) override; void start() override; void stop() override; + void suspend() override; uint32_t getSampleSize() const override; uint32_t getChannelCount() const override; uint32_t getSampleRate() const override; signals: void startPlayback(); + void suspendPlayback(); void stopPlayback(); protected slots: void createAudioOutput(); void onStartPlayback(); + void onSuspendPlayback(); void onStopPlayback(); private: QAudioFormat audioFormat_; SequentialBuffer audioBuffer_; std::unique_ptr audioOutput_; + bool playbackStarted_; }; } diff --git a/include/f1x/openauto/autoapp/Projection/IAudioOutput.hpp b/include/f1x/openauto/autoapp/Projection/IAudioOutput.hpp index 4940962..383ad28 100644 --- a/include/f1x/openauto/autoapp/Projection/IAudioOutput.hpp +++ b/include/f1x/openauto/autoapp/Projection/IAudioOutput.hpp @@ -42,6 +42,7 @@ public: virtual void write(const aasdk::common::DataConstBuffer& buffer) = 0; virtual void start() = 0; virtual void stop() = 0; + virtual void suspend() = 0; virtual uint32_t getSampleSize() const = 0; virtual uint32_t getChannelCount() const = 0; virtual uint32_t getSampleRate() const = 0; diff --git a/src/autoapp/Projection/AudioOutput.cpp b/src/autoapp/Projection/AudioOutput.cpp index 812df7f..7b309d5 100644 --- a/src/autoapp/Projection/AudioOutput.cpp +++ b/src/autoapp/Projection/AudioOutput.cpp @@ -30,6 +30,7 @@ namespace projection { AudioOutput::AudioOutput(uint32_t channelCount, uint32_t sampleSize, uint32_t sampleRate) + : playbackStarted_(false) { audioFormat_.setChannelCount(channelCount); audioFormat_.setSampleRate(sampleRate); @@ -40,6 +41,7 @@ AudioOutput::AudioOutput(uint32_t channelCount, uint32_t sampleSize, uint32_t sa this->moveToThread(QApplication::instance()->thread()); connect(this, &AudioOutput::startPlayback, this, &AudioOutput::onStartPlayback); + connect(this, &AudioOutput::suspendPlayback, this, &AudioOutput::onSuspendPlayback); connect(this, &AudioOutput::stopPlayback, this, &AudioOutput::onStopPlayback); QMetaObject::invokeMethod(this, "createAudioOutput", Qt::BlockingQueuedConnection); @@ -74,6 +76,11 @@ void AudioOutput::stop() emit stopPlayback(); } +void AudioOutput::suspend() +{ + emit suspendPlayback(); +} + uint32_t AudioOutput::getSampleSize() const { return audioFormat_.sampleSize(); @@ -91,14 +98,31 @@ uint32_t AudioOutput::getSampleRate() const void AudioOutput::onStartPlayback() { - audioOutput_->start(&audioBuffer_); + if(!playbackStarted_) + { + audioOutput_->start(&audioBuffer_); + playbackStarted_ = true; + } + else + { + audioOutput_->resume(); + } } -void AudioOutput::onStopPlayback() +void AudioOutput::onSuspendPlayback() { audioOutput_->suspend(); } +void AudioOutput::onStopPlayback() +{ + if(playbackStarted_) + { + audioOutput_->stop(); + playbackStarted_ = false; + } +} + } } } diff --git a/src/autoapp/Projection/AudioService.cpp b/src/autoapp/Projection/AudioService.cpp index c2df8f2..3e68c11 100644 --- a/src/autoapp/Projection/AudioService.cpp +++ b/src/autoapp/Projection/AudioService.cpp @@ -142,7 +142,7 @@ void AudioService::onAVChannelStopIndication(const aasdk::proto::messages::AVCha << ", channel: " << aasdk::messenger::channelIdToString(channel_->getId()) << ", session: " << session_; session_ = -1; - audioOutput_->stop(); + audioOutput_->suspend(); channel_->receive(this->shared_from_this()); }