diff --git a/include/ITANetAudioMessage.h b/include/ITANetAudioMessage.h index f676a3a7b9ef656ed7834e8bf2b9b16a6b6b747e..6868924a1d7c70d15098371dceff6c0d24ab6c8f 100644 --- a/include/ITANetAudioMessage.h +++ b/include/ITANetAudioMessage.h @@ -36,6 +36,7 @@ #include class VistaConnectionIP; +class ITABufferedDataLoggerImplProtocol; //! Network audio messages /** @@ -103,6 +104,8 @@ private: VistaByteBufferDeSerializer m_oIncoming; //!< Deserialization buffer for messages std::vector< VistaType::byte > m_vecIncomingBuffer; // Net IO buffer + + ITABufferedDataLoggerImplProtocol* m_pProtocolLogger; VistaConnectionIP* m_pConnection; //DEBUG diff --git a/src/ITANetAudioMessage.cpp b/src/ITANetAudioMessage.cpp index 29d35eb8274082de1be14c90d6caa22c0e0076eb..255f6756f9ffad11e81705ecd45573d14de45684 100644 --- a/src/ITANetAudioMessage.cpp +++ b/src/ITANetAudioMessage.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -14,6 +15,40 @@ static int S_nMessageIds = 0; +struct ITAProtocolLog : public ITALogDataBase +{ + inline static std::ostream& outputDesc(std::ostream& os) + { + os << "BlockId"; + os << "\t" << "WorldTimeStamp"; + os << "\t" << "MessageType"; + os << "\t" << "Status"; + os << "\t" << "Paketgroesse"; + os << std::endl; + return os; + }; + + inline std::ostream& outputData(std::ostream& os) const + { + os << uiBlockId; + os << "\t" << std::setprecision(12) << dWorldTimeStamp; + os << "\t" << iMessageType; + os << "\t" << iStatus; + os << "\t" << nMessagePayloadSize; + os << std::endl; + return os; + }; + + unsigned int uiBlockId; //!< Block identifier (audio streaming) + double dWorldTimeStamp; + int iMessageType; //!< ... usw + int iStatus; //!< ... usw + VistaType::sint32 nMessagePayloadSize; + +}; + +class ITABufferedDataLoggerImplProtocol : public ITABufferedDataLogger < ITAProtocolLog > {}; + CITANetAudioMessage::CITANetAudioMessage( VistaSerializingToolset::ByteOrderSwapBehavior bSwapBuffers ) : m_vecIncomingBuffer( 2048 ) , m_oOutgoing( 2048 ) @@ -23,13 +58,26 @@ CITANetAudioMessage::CITANetAudioMessage( VistaSerializingToolset::ByteOrderSwap m_oOutgoing.SetByteorderSwapFlag( bSwapBuffers ); m_oIncoming.SetByteorderSwapFlag( bSwapBuffers ); ResetMessage(); + + m_pProtocolLogger = new ITABufferedDataLoggerImplProtocol(); } void CITANetAudioMessage::ResetMessage() { - if( m_oIncoming.GetTailSize() > 0 ) + if (m_oIncoming.GetTailSize() > 0) + { vstr::err() << "CITANetAudioMessage::ResetMessage() called before message was fully processed!" << std::endl; + ITAProtocolLog oLog; + oLog.uiBlockId = m_nMessageId; + oLog.iMessageType = m_nMessageType; + oLog.iStatus = -1; + oLog.nMessagePayloadSize = 0; + oLog.dWorldTimeStamp = ITAClock::getDefaultClock()->getTime(); + + m_pProtocolLogger->log(oLog); + } + // wait till sending is complete -> this prevents us // from deleting the buffer while it is still being read // by the connection @@ -61,11 +109,13 @@ void CITANetAudioMessage::SetConnection( VistaConnectionIP* pConn ) void CITANetAudioMessage::WriteMessage() { + ITAProtocolLog oLog; VistaType::byte* pBuffer = ( VistaType::byte* ) m_oOutgoing.GetBuffer(); VistaType::sint32 iSwapDummy; // rewrite size dummy iSwapDummy = m_oOutgoing.GetBufferSize() - sizeof( VistaType::sint32 ); + oLog.nMessagePayloadSize = iSwapDummy; if( m_oOutgoing.GetByteorderSwapFlag() ) VistaSerializingToolset::Swap4( &iSwapDummy ); std::memcpy( pBuffer, &iSwapDummy, sizeof( VistaType::sint32 ) ); @@ -74,6 +124,7 @@ void CITANetAudioMessage::WriteMessage() // rewrite type dummy iSwapDummy = m_nMessageType; + oLog.iMessageType = m_nMessageType; if( m_oOutgoing.GetByteorderSwapFlag() ) VistaSerializingToolset::Swap4( &iSwapDummy ); std::memcpy( pBuffer, &iSwapDummy, sizeof( VistaType::sint32 ) ); @@ -82,10 +133,13 @@ void CITANetAudioMessage::WriteMessage() // rewrite messageid dummy iSwapDummy = m_nMessageId; + oLog.uiBlockId = m_nMessageId; if( m_oOutgoing.GetByteorderSwapFlag() ) VistaSerializingToolset::Swap4( &iSwapDummy ); std::memcpy( pBuffer, &iSwapDummy, sizeof( VistaType::sint32 ) ); - + oLog.iStatus = 0; + oLog.dWorldTimeStamp = ITAClock::getDefaultClock()->getTime(); + m_pProtocolLogger->log( oLog ); #if NET_AUDIO_SHOW_TRAFFIC vstr::out() << "CITANetAudioMessage [ Writing] " << m_nMessageType << " (id=" << std::setw( 4 ) << m_nMessageId << ")" << std::endl; #endif @@ -113,6 +167,7 @@ void CITANetAudioMessage::WriteMessage() bool CITANetAudioMessage::ReadMessage( int timeout) { + ITAProtocolLog oLog; #if NET_AUDIO_SHOW_TRAFFIC vstr::out() << "CITANetAudioMessage [ Reading ] Waiting for incoming data" << std::endl; #endif @@ -130,6 +185,7 @@ bool CITANetAudioMessage::ReadMessage( int timeout) VistaType::sint32 nMessagePayloadSize; int nBytesRead = m_pConnection->ReadInt32( nMessagePayloadSize ); + oLog.nMessagePayloadSize = nMessagePayloadSize; assert( nBytesRead == sizeof( VistaType::sint32 ) ); #if NET_AUDIO_SHOW_TRAFFIC vstr::out() << "CITANetAudioMessage [ Reading ] Expecting " << nMessagePayloadSize << " bytes message payload" << std::endl; @@ -159,10 +215,15 @@ bool CITANetAudioMessage::ReadMessage( int timeout) } m_iBytesReceivedTotal = 0; + oLog.iStatus = 1; + oLog.dWorldTimeStamp = ITAClock::getDefaultClock()->getTime(); // Transfer data into members m_oIncoming.SetBuffer( &m_vecIncomingBuffer[ 0 ], nMessagePayloadSize, false ); m_nMessageType = ReadInt(); m_nMessageId = ReadInt(); + oLog.iMessageType = m_nMessageType; + oLog.uiBlockId = m_nMessageId; + m_pProtocolLogger->log( oLog ); #if NET_AUDIO_SHOW_TRAFFIC vstr::out() << "CITANetAudioMessage [ Reading ] Finished receiving " << m_nMessageType << " (id=" << std::setw( 4 ) << m_nMessageId << ")" << std::endl; @@ -292,6 +353,7 @@ VistaConnectionIP* CITANetAudioMessage::GetConnection() const void CITANetAudioMessage::ClearConnection() { m_pConnection = NULL; + delete m_pProtocolLogger; } void CITANetAudioMessage::WriteIntVector( const std::vector viData ) @@ -334,6 +396,10 @@ void CITANetAudioMessage::WriteStreamingParameters( const CITANetAudioProtocol:: WriteInt(oParams.iRingBufferSize); WriteInt(oParams.iTargetSampleLatency); WriteDouble(oParams.dTimeIntervalSendInfos); + + + std::string paras = std::string("NetAudioLogProtocol") + std::string("_BS") + std::to_string(oParams.iBlockSize) + std::string("_Ch") + std::to_string(oParams.iChannels) + std::string("_tl") + std::to_string(oParams.iTargetSampleLatency) + std::string(".txt"); + m_pProtocolLogger->setOutputFile(paras); } int CITANetAudioMessage::ReadRingBufferSize() diff --git a/src/ITANetAudioStreamingClient.cpp b/src/ITANetAudioStreamingClient.cpp index 0a7d6e7dec548b507d8a66135f507a6ddc12a0cd..0817ad5d6352c22241e40f5f0595313d54e2ca01 100644 --- a/src/ITANetAudioStreamingClient.cpp +++ b/src/ITANetAudioStreamingClient.cpp @@ -212,4 +212,5 @@ void CITANetAudioStreamingClient::Disconnect() m_pClient->Disconnect(); m_bStopIndicated = false; m_bStopped = false; + m_pMessage->ClearConnection(); } diff --git a/tests/NetAudio/ITANetAudioStreamingClientTest.cpp b/tests/NetAudio/ITANetAudioStreamingClientTest.cpp index 2c4e49f8f55d558241e6a7c50b4e21062dd561a3..a3f0650d57e7a6ad75d2e4da6fc2afb4ee0680d5 100644 --- a/tests/NetAudio/ITANetAudioStreamingClientTest.cpp +++ b/tests/NetAudio/ITANetAudioStreamingClientTest.cpp @@ -18,16 +18,23 @@ int main(int argc, char* argv[]) if (argc != 7) { - fprintf(stderr, "Fehler: Syntax = ServerName ServerPort SampleRate BufferSize Channel RingBufferSize!\n"); + //fprintf(stderr, "Fehler: Syntax = ServerName ServerPort SampleRate BufferSize Channel RingBufferSize!\n"); } - - string sServerName = argv[1]; - unsigned int iServerPort = atoi(argv[2]); - double dSampleRate = strtod(argv[3], NULL); - int iBlockLength = atoi(argv[4]); - int iChannels = atoi(argv[5]); - int iBufferSize = atoi(argv[6]); + /* + string sServerName = argv[1]; + unsigned int iServerPort = atoi(argv[2]); + double dSampleRate = strtod(argv[3], NULL); + int iBlockLength = atoi(argv[4]); + int iChannels = atoi(argv[5]); + int iBufferSize = atoi(argv[6]); + */ + string sServerName = "137.226.61.85"; + unsigned int iServerPort = 12480; + double dSampleRate = 44100.0; + int iBlockLength = 32; + int iChannels = 2; + int iBufferSize = 32*16; cout << "Channel " << iChannels << endl;