Browse Source

refactor: use smart pointer instead of raw pointer

reviewable/pr5606/r5
sudden6 6 years ago
parent
commit
a8546fe8cb
No known key found for this signature in database
GPG Key ID: 279509B499E032B9
  1. 3
      src/audio/audio.h
  2. 4
      src/audio/backend/alsink.cpp
  3. 4
      src/audio/backend/openal.cpp
  4. 2
      src/audio/backend/openal.h
  5. 5
      src/core/coreav.cpp
  6. 26
      src/core/toxcall.cpp
  7. 11
      src/core/toxcall.h
  8. 4
      src/widget/form/settings/avform.cpp

3
src/audio/audio.h

@ -22,6 +22,7 @@ @@ -22,6 +22,7 @@
#define AUDIO_H
#include <QObject>
#include <memory>
class IAudioSink;
class Audio : public QObject
@ -64,7 +65,7 @@ public: @@ -64,7 +65,7 @@ public:
virtual void stopActive() = 0;
virtual IAudioSink* makeSink() = 0;
virtual std::unique_ptr<IAudioSink> makeSink() = 0;
protected:
// Public default audio settings

4
src/audio/backend/alsink.cpp

@ -80,9 +80,9 @@ void AlSink::kill() @@ -80,9 +80,9 @@ void AlSink::kill()
}
AlSink::AlSink(OpenAL& al, uint sourceId)
: audio{al}
: audio(al)
, sourceId{sourceId}
, killLock{QMutex::Recursive}
, killLock(QMutex::Recursive)
{}
AlSink::operator bool() const

4
src/audio/backend/openal.cpp

@ -247,7 +247,7 @@ bool OpenAL::reinitOutput(const QString& outDevDesc) @@ -247,7 +247,7 @@ bool OpenAL::reinitOutput(const QString& outDevDesc)
* @brief Allocates ressources for a new audio output
* @return AudioSink on success, nullptr on failure
*/
IAudioSink* OpenAL::makeSink()
std::unique_ptr<IAudioSink> OpenAL::makeSink()
{
QMutexLocker locker(&audioLock);
@ -267,7 +267,7 @@ IAudioSink* OpenAL::makeSink() @@ -267,7 +267,7 @@ IAudioSink* OpenAL::makeSink()
sinks.insert(sink);
qDebug() << "Audio source" << sid << "created. Sources active:" << sinks.size();
return sink;
return std::unique_ptr<IAudioSink>{sink};
}
/**

2
src/audio/backend/openal.h

@ -86,7 +86,7 @@ public: @@ -86,7 +86,7 @@ public:
QStringList outDeviceNames();
QStringList inDeviceNames();
IAudioSink* makeSink();
std::unique_ptr<IAudioSink> makeSink();
void destroySink(AlSink& sink);
void subscribeInput();

5
src/core/coreav.cpp

@ -20,7 +20,6 @@ @@ -20,7 +20,6 @@
#include "coreav.h"
#include "core.h"
#include "src/audio/audio.h"
#include "src/model/friend.h"
#include "src/model/group.h"
#include "src/persistence/settings.h"
@ -502,7 +501,7 @@ void CoreAV::groupCallCallback(void* tox, uint32_t group, uint32_t peer, const i @@ -502,7 +501,7 @@ void CoreAV::groupCallCallback(void* tox, uint32_t group, uint32_t peer, const i
return;
}
call.getAudioSink(peerPk)->playAudioBuffer(data, samples, channels, sample_rate);
call.playAudioBuffer(peerPk, data, samples, channels, sample_rate);
}
/**
@ -866,7 +865,7 @@ void CoreAV::audioFrameCallback(ToxAV*, uint32_t friendNum, const int16_t* pcm, @@ -866,7 +865,7 @@ void CoreAV::audioFrameCallback(ToxAV*, uint32_t friendNum, const int16_t* pcm,
return;
}
call.getAudioSink()->playAudioBuffer(pcm, sampleCount, channels, samplingRate);
call.playAudioBuffer(pcm, sampleCount, channels, samplingRate);
}
void CoreAV::videoFrameCallback(ToxAV*, uint32_t friendNum, uint16_t w, uint16_t h,

26
src/core/toxcall.cpp

@ -148,11 +148,11 @@ ToxFriendCall::~ToxFriendCall() @@ -148,11 +148,11 @@ ToxFriendCall::~ToxFriendCall()
void ToxFriendCall::onAudioSinkInvalidated()
{
const auto newSink = Audio::getInstance().makeSink();
auto newSink = Audio::getInstance().makeSink();
audioSinkInvalid = QObject::connect(newSink, &IAudioSink::invalidated,
audioSinkInvalid = QObject::connect(newSink.get(), &IAudioSink::invalidated,
[this]() { this->onAudioSinkInvalidated(); });
sink.reset(newSink);
sink = std::move(newSink);
}
void ToxFriendCall::startTimeout(uint32_t callId)
@ -188,9 +188,12 @@ void ToxFriendCall::setState(const TOXAV_FRIEND_CALL_STATE& value) @@ -188,9 +188,12 @@ void ToxFriendCall::setState(const TOXAV_FRIEND_CALL_STATE& value)
state = value;
}
const std::unique_ptr<IAudioSink>& ToxFriendCall::getAudioSink() const
void ToxFriendCall::playAudioBuffer(const int16_t* data, int samples, unsigned channels,
int sampleRate) const
{
return sink;
if (sink) {
sink->playAudioBuffer(data, samples, channels, sampleRate);
}
}
ToxGroupCall::ToxGroupCall(int GroupNum, CoreAV& av)
@ -239,11 +242,11 @@ void ToxGroupCall::removePeer(ToxPk peerId) @@ -239,11 +242,11 @@ void ToxGroupCall::removePeer(ToxPk peerId)
void ToxGroupCall::addPeer(ToxPk peerId)
{
auto& audio = Audio::getInstance();
IAudioSink* newSink = audio.makeSink();
peers.emplace(peerId, std::unique_ptr<IAudioSink>(newSink));
std::unique_ptr<IAudioSink> newSink = audio.makeSink();
peers.emplace(peerId, std::move(newSink));
QMetaObject::Connection con =
QObject::connect(newSink, &IAudioSink::invalidated,
QObject::connect(newSink.get(), &IAudioSink::invalidated,
[this, peerId]() { this->onAudioSinkInvalidated(peerId); });
sinkInvalid.insert({peerId, con});
@ -265,11 +268,14 @@ void ToxGroupCall::clearPeers() @@ -265,11 +268,14 @@ void ToxGroupCall::clearPeers()
sinkInvalid.clear();
}
const std::unique_ptr<IAudioSink>& ToxGroupCall::getAudioSink(ToxPk peer)
void ToxGroupCall::playAudioBuffer(const ToxPk& peer, const int16_t* data, int samples,
unsigned channels, int sampleRate)
{
if (!havePeer(peer)) {
addPeer(peer);
}
const auto& source = peers.find(peer);
return source->second;
if (source->second) {
source->second->playAudioBuffer(data, samples, channels, sampleRate);
}
}

11
src/core/toxcall.h

@ -77,7 +77,8 @@ public: @@ -77,7 +77,8 @@ public:
TOXAV_FRIEND_CALL_STATE getState() const;
void setState(const TOXAV_FRIEND_CALL_STATE& value);
const std::unique_ptr<IAudioSink>& getAudioSink() const;
void playAudioBuffer(const int16_t* data, int samples, unsigned channels,
int sampleRate) const;
protected:
std::unique_ptr<QTimer> timeoutTimer;
@ -103,15 +104,15 @@ public: @@ -103,15 +104,15 @@ public:
~ToxGroupCall();
ToxGroupCall& operator=(ToxGroupCall&& other) = delete;
void removePeer(ToxPk peerId);
void playAudioBuffer(const ToxPk& peer, const int16_t* data, int samples, unsigned channels, int sampleRate);
private:
void addPeer(ToxPk peerId);
bool havePeer(ToxPk peerId);
void clearPeers();
const std::unique_ptr<IAudioSink>& getAudioSink(ToxPk peer);
private:
std::map<ToxPk, std::unique_ptr<IAudioSink>> peers;
std::map<ToxPk, QMetaObject::Connection> sinkInvalid;
int groupId;

4
src/widget/form/settings/avform.cpp

@ -151,7 +151,7 @@ void AVForm::showEvent(QShowEvent* event) @@ -151,7 +151,7 @@ void AVForm::showEvent(QShowEvent* event)
}
if (audioSink == nullptr) {
audioSink.reset(audio->makeSink());
audioSink = audio->makeSink();
}
GenericForm::showEvent(event);
@ -574,7 +574,7 @@ void AVForm::on_outDevCombobox_currentIndexChanged(int deviceIndex) @@ -574,7 +574,7 @@ void AVForm::on_outDevCombobox_currentIndexChanged(int deviceIndex)
if (oldName != deviceName) {
audioSettings->setOutDev(deviceName);
audio->reinitOutput(deviceName);
audioSink.reset(Audio::getInstance().makeSink());
audioSink = Audio::getInstance().makeSink();
}
playbackSlider->setEnabled(outputEnabled);

Loading…
Cancel
Save