1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

fix(audio): alternate audio fix implementation from #4139

This commit is contained in:
agrecascino 2017-02-05 18:34:41 -05:00 committed by Anthony Recascino
parent 38cecdc780
commit 62ac480171
5 changed files with 37 additions and 4 deletions

View File

@ -534,6 +534,10 @@ void Core::onGroupMessage(Tox*, uint32_t groupId, uint32_t peerId, TOX_MESSAGE_T
void Core::onGroupNamelistChange(Tox*, uint32_t groupId, uint32_t peerId, void Core::onGroupNamelistChange(Tox*, uint32_t groupId, uint32_t peerId,
TOX_CONFERENCE_STATE_CHANGE change, void* core) TOX_CONFERENCE_STATE_CHANGE change, void* core)
{ {
CoreAV* coreAv = static_cast<Core*>(core)->getAv();
if((change == TOX_CONFERENCE_STATE_CHANGE_PEER_EXIT) && (coreAv->isGroupAvEnabled(groupId))) {
CoreAV::invalidateGroupCallPeerSource(groupId, peerId);
}
qDebug() << QString("Group namelist change %1:%2 %3").arg(groupId).arg(peerId).arg(change); qDebug() << QString("Group namelist change %1:%2 %3").arg(groupId).arg(peerId).arg(change);
emit static_cast<Core*>(core)->groupNamelistChanged(groupId, peerId, change); emit static_cast<Core*>(core)->groupNamelistChanged(groupId, peerId, change);
} }

View File

@ -497,13 +497,24 @@ void CoreAV::groupCallCallback(void* tox, int group, int peer,
return; return;
Audio& audio = Audio::getInstance(); Audio& audio = Audio::getInstance();
if (!call.alSource) if (!call.peers[peer])
audio.subscribeOutput(call.alSource); audio.subscribeOutput(call.peers[peer]);
audio.playAudioBuffer(call.alSource, data, samples, channels, audio.playAudioBuffer(call.peers[peer], data, samples, channels,
sample_rate); sample_rate);
} }
/**
* @brief Called from core to make sure the source for that peer is invalidated when they leave.
* @param group Group Index
* @param peer Peer Index
*/
void CoreAV::invalidateGroupCallPeerSource(int group, int peer) {
Audio &audio = Audio::getInstance();
audio.unsubscribeOutput(groupCalls[group].peers[peer]);
groupCalls[group].peers[peer] = 0;
}
/** /**
* @brief Get a call's video source. * @brief Get a call's video source.
* @param friendNum Id of friend in call list. * @param friendNum Id of friend in call list.
@ -662,7 +673,7 @@ void CoreAV::invalidateCallSources()
{ {
for (ToxGroupCall& call : groupCalls) for (ToxGroupCall& call : groupCalls)
{ {
call.alSource = 0; call.peers.clear();
} }
for (ToxFriendCall& call : calls) for (ToxFriendCall& call : calls)

View File

@ -79,6 +79,7 @@ public:
const int16_t* data, unsigned samples, const int16_t* data, unsigned samples,
uint8_t channels, unsigned sample_rate, uint8_t channels, unsigned sample_rate,
void* core); void* core);
static void invalidateGroupCallPeerSource(int group, int peer);
public slots: public slots:
bool startCall(uint32_t friendNum, bool video=false); bool startCall(uint32_t friendNum, bool video=false);

View File

@ -22,6 +22,9 @@
* *
* @var TOXAV_FRIEND_CALL_STATE ToxFriendCall::state * @var TOXAV_FRIEND_CALL_STATE ToxFriendCall::state
* @brief State of the peer (not ours!) * @brief State of the peer (not ours!)
*
* @var QMap ToxGroupCall::peers
* @brief Keeps sources for users in group calls.
*/ */
using namespace std; using namespace std;
@ -192,6 +195,16 @@ ToxGroupCall::ToxGroupCall(ToxGroupCall&& other) noexcept
{ {
} }
ToxGroupCall::~ToxGroupCall()
{
Audio& audio = Audio::getInstance();
for(quint32 v : peers)
{
audio.unsubscribeOutput(v);
}
}
ToxGroupCall &ToxGroupCall::operator=(ToxGroupCall &&other) noexcept ToxGroupCall &ToxGroupCall::operator=(ToxGroupCall &&other) noexcept
{ {
ToxCall::operator =(move(other)); ToxCall::operator =(move(other));

View File

@ -4,6 +4,7 @@
#include <cstdint> #include <cstdint>
#include <QtGlobal> #include <QtGlobal>
#include <QMetaObject> #include <QMetaObject>
#include <QMap>
#include "src/core/indexedlist.h" #include "src/core/indexedlist.h"
@ -69,9 +70,12 @@ struct ToxGroupCall : public ToxCall
ToxGroupCall() = default; ToxGroupCall() = default;
ToxGroupCall(int GroupNum, CoreAV& av); ToxGroupCall(int GroupNum, CoreAV& av);
ToxGroupCall(ToxGroupCall&& other) noexcept; ToxGroupCall(ToxGroupCall&& other) noexcept;
~ToxGroupCall();
ToxGroupCall& operator=(ToxGroupCall&& other) noexcept; ToxGroupCall& operator=(ToxGroupCall&& other) noexcept;
QMap<int, quint32> peers;
// If you add something here, don't forget to override the ctors and move operators! // If you add something here, don't forget to override the ctors and move operators!
}; };