diff --git a/src/tox_av_voip_model.cpp b/src/tox_av_voip_model.cpp index 781c2930..7b00ced7 100644 --- a/src/tox_av_voip_model.cpp +++ b/src/tox_av_voip_model.cpp @@ -23,10 +23,12 @@ namespace Components { ObjectHandle o; // ptr? }; + // vid struct ToxAVAudioSource { ObjectHandle o; // ptr? }; + // vid } // Components // TODO: make proper adapter @@ -181,6 +183,20 @@ void ToxAVVoIPModel::destroySession(ObjectHandle session) { return; } + // remove lookup + if (session.all_of()) { + auto it_asrc = std::find_if( + _audio_sources.cbegin(), _audio_sources.cend(), + [o = session.get().o](const auto& it) { + return it.second == o; + } + ); + + if (it_asrc != _audio_sources.cend()) { + _audio_sources.erase(it_asrc); + } + } + // destory sources if (auto* ss = session.try_get(); ss != nullptr) { for (const auto ssov : ss->streams) { @@ -405,6 +421,8 @@ bool ToxAVVoIPModel::onEvent(const Events::FriendCallState& e) { o.emplace(incoming_audio); // TODO: tie session to stream + _audio_sources[e.friend_number] = incoming_audio; + _os.throwEventConstruct(incoming_audio); } else if (!s.is_sending_a() && o.all_of()) { // remove asrc? @@ -427,46 +445,20 @@ bool ToxAVVoIPModel::onEvent(const Events::FriendVideoBitrate&) { } bool ToxAVVoIPModel::onEvent(const Events::FriendAudioFrame& e) { - //auto& call = _calls[e.friend_number]; - - // get session? - // get asrc (directly instead?) this is pretty hot - const auto session_contact = _tcm.getContactFriend(e.friend_number); - if (!_cr.valid(session_contact)) { + auto asrc_it = _audio_sources.find(e.friend_number); + if (asrc_it == _audio_sources.cend()) { + // missing src from lookup table return false; } - // jesus this is bad - ObjectHandle asrc; - for (const auto& [ov, voipmodel] : _os.registry().view().each()) { - if (voipmodel != this) { - continue; - } - - auto o = _os.objectHandle(ov); - - if (!o.all_of()) { - continue; - } - if (session_contact != o.get().c) { - continue; - } - - if (!o.all_of()) { - continue; - } - asrc = o.get().o; - break; - } + auto asrc = asrc_it->second; if (!static_cast(asrc)) { // missing src to put frame into ?? return false; } - //assert(call.incoming_asrc.all_of()); assert(asrc.all_of*>()); - //assert(call.incoming_asrc.all_of>()); assert(asrc.all_of>()); asrc.get*>()->push(AudioFrame2{ diff --git a/src/tox_av_voip_model.hpp b/src/tox_av_voip_model.hpp index 6ba15039..55ac8954 100644 --- a/src/tox_av_voip_model.hpp +++ b/src/tox_av_voip_model.hpp @@ -6,12 +6,17 @@ #include "./frame_streams/voip_model.hpp" #include "./tox_av.hpp" +#include + struct ToxAVVoIPModel : protected ToxAVEventI, public VoIPModelI { ObjectStore2& _os; ToxAVI& _av; Contact3Registry& _cr; ToxContactModel2& _tcm; + // for faster lookup + std::unordered_map _audio_sources; + ToxAVVoIPModel(ObjectStore2& os, ToxAVI& av, Contact3Registry& cr, ToxContactModel2& tcm); ~ToxAVVoIPModel(void);