diff --git a/include/ITANetAudioProtocol.h b/include/ITANetAudioProtocol.h index 2da1008d807526e11ad55188ff82b579bdd312f7..ed28227e501d3e6ec8f6db8d1b493081b1b0d0cb 100644 --- a/include/ITANetAudioProtocol.h +++ b/include/ITANetAudioProtocol.h @@ -54,6 +54,7 @@ public: static const int NP_CLIENT_OPEN = 100; static const int NP_CLIENT_CLOSE = 101; + static const int NP_CLIENT_WAITING_FOR_SAMPLES = 102; static const int NP_SERVER_CLOSE = 200; static const int NP_SERVER_OPEN = 201; diff --git a/src/ITANetAudioStreamingServer.cpp b/src/ITANetAudioStreamingServer.cpp index dae433209d38a1d9a2bbcd3e980426b502be5f80..e7e2b2c9ed28f17a74154e374ae37c8d02d18035 100644 --- a/src/ITANetAudioStreamingServer.cpp +++ b/src/ITANetAudioStreamingServer.cpp @@ -49,7 +49,8 @@ bool CITANetAudioStreamingServer::Start( const std::string& sAddress, int iPort m_pMessage->WriteInt( 2 * 42 ); m_pMessage->WriteAnswer(); - Run(); + if( m_pInputStream ) + Run(); return true; } @@ -76,7 +77,14 @@ void CITANetAudioStreamingServer::Stop() void CITANetAudioStreamingServer::SetInputStream( ITADatasource* pInStream ) { + if( VistaThreadLoop::IsRunning() ) + ITA_EXCEPT1( MODAL_EXCEPTION, "Streaming loop already running, can not change input stream" ); + m_pInputStream = pInStream; + m_sfTempTransmitBuffer.init( m_pInputStream->GetNumberOfChannels(), m_pInputStream->GetBlocklength(), true ); + + if( m_pConnection ) + Run(); } int CITANetAudioStreamingServer::GetNetStreamBlocklength() const @@ -96,6 +104,28 @@ void CITANetAudioStreamingServer::SetAutomaticUpdateRate() bool CITANetAudioStreamingServer::LoopBody() { + m_pMessage->ResetMessage(); + m_pMessage->SetConnection( m_pConnection ); + m_pMessage->ReadMessage(); // blocking + + switch( m_pMessage->GetMessageType() ) + { + case CITANetAudioProtocol::NP_CLIENT_WAITING_FOR_SAMPLES: + if( m_pInputStream ) + { + for( int i = 0; i < m_pInputStream->GetNumberOfChannels(); i++ ) + { + ITAStreamInfo oStreamInfo; + const float* pfData = m_pInputStream->GetBlockPointer( i, &oStreamInfo ); + m_sfTempTransmitBuffer[ i ].write( pfData, m_pInputStream->GetBlocklength() ); + } + } + + //m_pMessage->WriteSampleFrame( &m_sfTempTransmitBuffer ); + m_pMessage->WriteAnswer(); + break; + } + return true; }