From 25016ef157e97f8345e8d1d09c140db0d3078a38 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 21 Jan 2015 14:10:29 -0800 Subject: [PATCH] have RenderingClient handle returned audio frames --- gvr-interface/src/Client.cpp | 23 ++++---- gvr-interface/src/Client.h | 5 +- gvr-interface/src/RenderingClient.cpp | 63 ++++++++++++++++++++++ gvr-interface/src/RenderingClient.h | 3 ++ libraries/audio-client/CMakeLists.txt | 3 ++ libraries/audio-client/src/AudioClient.cpp | 2 + 6 files changed, 89 insertions(+), 10 deletions(-) diff --git a/gvr-interface/src/Client.cpp b/gvr-interface/src/Client.cpp index 68d9ca22d9..185841559f 100644 --- a/gvr-interface/src/Client.cpp +++ b/gvr-interface/src/Client.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -47,6 +48,17 @@ void Client::setupNetworking() { connect(nodeList.data(), &NodeList::limitOfSilentDomainCheckInsReached, nodeList.data(), &NodeList::reset); } +void Client::processVerifiedPacket(const HifiSockAddr& senderSockAddr, const QByteArray& incomingPacket) { + PacketType incomingType = packetTypeForPacket(incomingPacket); + // only process this packet if we have a match on the packet version + switch (incomingType) { + default: + auto nodeList = DependencyManager::get(); + nodeList->processNodeData(senderSockAddr, incomingPacket); + break; + } +} + void Client::processDatagrams() { HifiSockAddr senderSockAddr; @@ -58,16 +70,9 @@ void Client::processDatagrams() { incomingPacket.resize(nodeList->getNodeSocket().pendingDatagramSize()); nodeList->getNodeSocket().readDatagram(incomingPacket.data(), incomingPacket.size(), senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); - + if (nodeList->packetVersionAndHashMatch(incomingPacket)) { - - PacketType incomingType = packetTypeForPacket(incomingPacket); - // only process this packet if we have a match on the packet version - switch (incomingType) { - default: - nodeList->processNodeData(senderSockAddr, incomingPacket); - break; - } + processVerifiedPacket(senderSockAddr, incomingPacket); } } } \ No newline at end of file diff --git a/gvr-interface/src/Client.h b/gvr-interface/src/Client.h index f703d2d7cd..6eb3913ea9 100644 --- a/gvr-interface/src/Client.h +++ b/gvr-interface/src/Client.h @@ -14,14 +14,17 @@ #include +#include + class QThread; class Client : public QObject { Q_OBJECT public: Client(QObject* parent = 0); -private: +protected: void setupNetworking(); + virtual void processVerifiedPacket(const HifiSockAddr& senderSockAddr, const QByteArray& incomingPacket); private slots: void processDatagrams(); }; diff --git a/gvr-interface/src/RenderingClient.cpp b/gvr-interface/src/RenderingClient.cpp index 32a4df2e5a..ed0716d4da 100644 --- a/gvr-interface/src/RenderingClient.cpp +++ b/gvr-interface/src/RenderingClient.cpp @@ -9,8 +9,10 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include #include +#include #include #include "RenderingClient.h" @@ -20,4 +22,65 @@ RenderingClient::RenderingClient(QObject *parent) : { // tell the NodeList which node types all rendering clients will want to know about DependencyManager::get()->addSetOfNodeTypesToNodeInterestSet(NodeSet() << NodeType::AudioMixer); + + // get our audio client setup on its own thread + QThread* audioThread = new QThread(this); + auto audioClient = DependencyManager::set(); + + audioClient->moveToThread(audioThread); + connect(audioThread, &QThread::started, audioClient.data(), &AudioClient::start); + + audioThread->start(); +} + +RenderingClient::~RenderingClient() { + auto audioClient = DependencyManager::get(); + + // stop the audio client + QMetaObject::invokeMethod(audioClient.data(), "stop", Qt::BlockingQueuedConnection); + + // ask the audio thread to quit and wait until it is done + audioClient->thread()->quit(); + audioClient->thread()->wait(); +} + +void RenderingClient::processVerifiedPacket(const HifiSockAddr& senderSockAddr, const QByteArray& incomingPacket) { + PacketType incomingType = packetTypeForPacket(incomingPacket); + // only process this packet if we have a match on the packet version + switch (incomingType) { + case PacketTypeAudioEnvironment: + case PacketTypeAudioStreamStats: + case PacketTypeMixedAudio: + case PacketTypeSilentAudioFrame: { + auto nodeList = DependencyManager::get(); + + if (incomingType == PacketTypeAudioStreamStats) { + QMetaObject::invokeMethod(DependencyManager::get().data(), "parseAudioStreamStatsPacket", + Qt::QueuedConnection, + Q_ARG(QByteArray, incomingPacket)); + } else if (incomingType == PacketTypeAudioEnvironment) { + QMetaObject::invokeMethod(DependencyManager::get().data(), "parseAudioEnvironmentData", + Qt::QueuedConnection, + Q_ARG(QByteArray, incomingPacket)); + } else { + qDebug() << "Processing received audio of" << incomingPacket.size(); + QMetaObject::invokeMethod(DependencyManager::get().data(), "addReceivedAudioToStream", + Qt::QueuedConnection, + Q_ARG(QByteArray, incomingPacket)); + } + + // update having heard from the audio-mixer and record the bytes received + SharedNodePointer audioMixer = nodeList->sendingNodeForPacket(incomingPacket); + + if (audioMixer) { + audioMixer->setLastHeardMicrostamp(usecTimestampNow()); + audioMixer->recordBytesReceived(incomingPacket.size()); + } + + break; + } + default: + Client::processVerifiedPacket(senderSockAddr, incomingPacket); + break; + } } \ No newline at end of file diff --git a/gvr-interface/src/RenderingClient.h b/gvr-interface/src/RenderingClient.h index dcf643e0ed..f20b567548 100644 --- a/gvr-interface/src/RenderingClient.h +++ b/gvr-interface/src/RenderingClient.h @@ -19,6 +19,9 @@ class RenderingClient : public Client { Q_OBJECT public: RenderingClient(QObject* parent = 0); + ~RenderingClient(); +private: + virtual void processVerifiedPacket(const HifiSockAddr& senderSockAddr, const QByteArray& incomingPacket); }; #endif // hifi_RenderingClient_h diff --git a/libraries/audio-client/CMakeLists.txt b/libraries/audio-client/CMakeLists.txt index ba253585cc..4e6b1d48f3 100644 --- a/libraries/audio-client/CMakeLists.txt +++ b/libraries/audio-client/CMakeLists.txt @@ -5,6 +5,9 @@ setup_hifi_library(Network Multimedia) link_hifi_libraries(audio) +# append audio includes to our list of includes to bubble +list(APPEND ${TARGET_NAME}_DEPENDENCY_INCLUDES "${HIFI_LIBRARY_DIR}/audio/src") + set(GVERB_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/gverb") # As Gverb is currently the only reverb library, it's required. diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 2d48b2ddaa..7db7e35e2a 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -378,9 +378,11 @@ void AudioClient::start() { if (!inputFormatSupported) { qDebug() << "Unable to set up audio input because of a problem with input format."; + qDebug() << "The closest format available is" << inputDeviceInfo.nearestFormat(_desiredInputFormat); } if (!outputFormatSupported) { qDebug() << "Unable to set up audio output because of a problem with output format."; + qDebug() << "The closest format available is" << outputDeviceInfo.nearestFormat(_desiredOutputFormat); } if (_audioInput) {