Use resume/suspend from audio output to preserve audio resources

This commit is contained in:
michal.szwaj 2018-03-02 21:25:49 +01:00
parent 640c0c6dc9
commit 88aeb591b4
4 changed files with 32 additions and 3 deletions

View File

@ -42,23 +42,27 @@ public:
void write(const aasdk::common::DataConstBuffer& buffer) override; void write(const aasdk::common::DataConstBuffer& buffer) override;
void start() override; void start() override;
void stop() override; void stop() override;
void suspend() override;
uint32_t getSampleSize() const override; uint32_t getSampleSize() const override;
uint32_t getChannelCount() const override; uint32_t getChannelCount() const override;
uint32_t getSampleRate() const override; uint32_t getSampleRate() const override;
signals: signals:
void startPlayback(); void startPlayback();
void suspendPlayback();
void stopPlayback(); void stopPlayback();
protected slots: protected slots:
void createAudioOutput(); void createAudioOutput();
void onStartPlayback(); void onStartPlayback();
void onSuspendPlayback();
void onStopPlayback(); void onStopPlayback();
private: private:
QAudioFormat audioFormat_; QAudioFormat audioFormat_;
SequentialBuffer audioBuffer_; SequentialBuffer audioBuffer_;
std::unique_ptr<QAudioOutput> audioOutput_; std::unique_ptr<QAudioOutput> audioOutput_;
bool playbackStarted_;
}; };
} }

View File

@ -42,6 +42,7 @@ public:
virtual void write(const aasdk::common::DataConstBuffer& buffer) = 0; virtual void write(const aasdk::common::DataConstBuffer& buffer) = 0;
virtual void start() = 0; virtual void start() = 0;
virtual void stop() = 0; virtual void stop() = 0;
virtual void suspend() = 0;
virtual uint32_t getSampleSize() const = 0; virtual uint32_t getSampleSize() const = 0;
virtual uint32_t getChannelCount() const = 0; virtual uint32_t getChannelCount() const = 0;
virtual uint32_t getSampleRate() const = 0; virtual uint32_t getSampleRate() const = 0;

View File

@ -30,6 +30,7 @@ namespace projection
{ {
AudioOutput::AudioOutput(uint32_t channelCount, uint32_t sampleSize, uint32_t sampleRate) AudioOutput::AudioOutput(uint32_t channelCount, uint32_t sampleSize, uint32_t sampleRate)
: playbackStarted_(false)
{ {
audioFormat_.setChannelCount(channelCount); audioFormat_.setChannelCount(channelCount);
audioFormat_.setSampleRate(sampleRate); audioFormat_.setSampleRate(sampleRate);
@ -40,6 +41,7 @@ AudioOutput::AudioOutput(uint32_t channelCount, uint32_t sampleSize, uint32_t sa
this->moveToThread(QApplication::instance()->thread()); this->moveToThread(QApplication::instance()->thread());
connect(this, &AudioOutput::startPlayback, this, &AudioOutput::onStartPlayback); connect(this, &AudioOutput::startPlayback, this, &AudioOutput::onStartPlayback);
connect(this, &AudioOutput::suspendPlayback, this, &AudioOutput::onSuspendPlayback);
connect(this, &AudioOutput::stopPlayback, this, &AudioOutput::onStopPlayback); connect(this, &AudioOutput::stopPlayback, this, &AudioOutput::onStopPlayback);
QMetaObject::invokeMethod(this, "createAudioOutput", Qt::BlockingQueuedConnection); QMetaObject::invokeMethod(this, "createAudioOutput", Qt::BlockingQueuedConnection);
@ -74,6 +76,11 @@ void AudioOutput::stop()
emit stopPlayback(); emit stopPlayback();
} }
void AudioOutput::suspend()
{
emit suspendPlayback();
}
uint32_t AudioOutput::getSampleSize() const uint32_t AudioOutput::getSampleSize() const
{ {
return audioFormat_.sampleSize(); return audioFormat_.sampleSize();
@ -91,14 +98,31 @@ uint32_t AudioOutput::getSampleRate() const
void AudioOutput::onStartPlayback() void AudioOutput::onStartPlayback()
{ {
audioOutput_->start(&audioBuffer_); if(!playbackStarted_)
{
audioOutput_->start(&audioBuffer_);
playbackStarted_ = true;
}
else
{
audioOutput_->resume();
}
} }
void AudioOutput::onStopPlayback() void AudioOutput::onSuspendPlayback()
{ {
audioOutput_->suspend(); audioOutput_->suspend();
} }
void AudioOutput::onStopPlayback()
{
if(playbackStarted_)
{
audioOutput_->stop();
playbackStarted_ = false;
}
}
} }
} }
} }

View File

@ -142,7 +142,7 @@ void AudioService::onAVChannelStopIndication(const aasdk::proto::messages::AVCha
<< ", channel: " << aasdk::messenger::channelIdToString(channel_->getId()) << ", channel: " << aasdk::messenger::channelIdToString(channel_->getId())
<< ", session: " << session_; << ", session: " << session_;
session_ = -1; session_ = -1;
audioOutput_->stop(); audioOutput_->suspend();
channel_->receive(this->shared_from_this()); channel_->receive(this->shared_from_this());
} }