diff --git a/include/ITANetAudioServer.h b/include/ITANetAudioServer.h index 338ca6c3fb78b48148ee804971f75305df5271c4..65c2ee044d6f450092f49b44c9c2bbd7f8d640c0 100644 --- a/include/ITANetAudioServer.h +++ b/include/ITANetAudioServer.h @@ -23,13 +23,13 @@ #include - #include #include -class VistaTCPSocket; class CITANetAudioStreamingServer; +class VistaConnectionIP; class VistaTCPServer; +class VistaTCPSocket; //! Realizes server functionality for network audio streaming /** @@ -44,15 +44,18 @@ public: std::string GetServerAddress() const; int GetNetworkPort() const; + bool Start( const std::string& sAddress, int iPort ); - VistaTCPSocket* GetSocket() const; - void Disconnect(); + void Stop(); + + VistaConnectionIP* GetConnection() const; bool IsConnected() const; private: VistaTCPServer* m_pServer; VistaTCPSocket* m_pSocket; + VistaConnectionIP* m_pConnection; int m_iServerPort; std::string m_sServerAddress; diff --git a/include/ITANetAudioStreamingServer.h b/include/ITANetAudioStreamingServer.h index a8baf3359279ed4f160956c47d1a4732d5962030..7483485f89dcadc1af6011975240c47756231df8 100644 --- a/include/ITANetAudioStreamingServer.h +++ b/include/ITANetAudioStreamingServer.h @@ -21,6 +21,8 @@ #include +#include + #include #include @@ -29,6 +31,7 @@ class ITADatasource; class CITANetAudioServer; +class CITANetAudioMessage; class VistaTCPSocket; //! Network audio sample server (for connecting a net audio stream) @@ -76,7 +79,9 @@ private: CITANetAudioServer* m_pNetAudioServer; ITASampleFrame m_sfTempTransmitBuffer; ITADatasource* m_pInputStream; - VistaTCPSocket* m_pSocket; + VistaConnectionIP* m_pConnection; + + CITANetAudioMessage* m_pMessage; int m_iUpdateStrategy; int m_iClientRingBufferFreeSamples; diff --git a/src/ITANetAudioMessage.cpp b/src/ITANetAudioMessage.cpp index 158fa2bf5999ce51bcc22da702ec90283161a8e2..d3efa49f31a7acdecf98a06dc0a64d326aadc4a0 100644 --- a/src/ITANetAudioMessage.cpp +++ b/src/ITANetAudioMessage.cpp @@ -82,19 +82,15 @@ void CITANetAudioMessage::WriteMessage() try { - int iSize = m_oOutgoing.GetBufferSize(); - int nRet = m_pConnection->WriteRawBuffer( m_oOutgoing.GetBuffer(), iSize ); + int nRet = m_pConnection->WriteRawBuffer( m_oOutgoing.GetBuffer(), + m_oOutgoing.GetBufferSize() ); + m_pConnection->WaitForSendFinish(); if( nRet != m_oOutgoing.GetBufferSize() ) - { - VistaExceptionBase ex( "ITANetAudioMessage::WriteMessage: Connection error", "CITANetAudioMessage", -1, -1 ); - //throw( ex ); - } + ITA_EXCEPT1( NETWORK_ERROR, "Could not write the expected number of bytes" ); } catch( VistaExceptionBase& ex ) { - std::string sExceptionText = ex.GetExceptionText(); - std::cerr << sExceptionText << std::endl; - //ITA_EXCEPT1(UNKNOWN, sExceptionText.c_str()); + ITA_EXCEPT1( NETWORK_ERROR, ex.GetExceptionText() ); } } @@ -114,7 +110,7 @@ void CITANetAudioMessage::ReadMessage() nReturn = m_pConnection->ReadRawBuffer( &m_vecIncomingBuffer[ 0 ], nMessageSize ); if( nReturn != nMessageSize ) - ITA_EXCEPT1( UNKNOWN, "Protokoll error, Received less bytes than expected" ); + ITA_EXCEPT1( NETWORK_ERROR, "Protokoll error, Received less bytes than expected" ); m_oIncoming.SetBuffer( &m_vecIncomingBuffer[ 0 ], nReturn ); @@ -161,12 +157,15 @@ void CITANetAudioMessage::WriteAnswer() VistaSerializingToolset::Swap4( &iSwapDummy ); memcpy( pBuffer, &iSwapDummy, sizeof( VistaType::sint32 ) ); - try { + try + { int nRet = m_pConnection->WriteRawBuffer( m_oOutgoing.GetBuffer(), m_oOutgoing.GetBufferSize() ); + m_pConnection->WaitForSendFinish(); if( nRet != m_oOutgoing.GetBufferSize() ) ITA_EXCEPT1( UNKNOWN, "Could not write the expected number of bytes" ); } - catch( VistaExceptionBase& ex ) { + catch( VistaExceptionBase& ex ) + { ITA_EXCEPT1( UNKNOWN, ex.GetExceptionText() ); } } @@ -186,7 +185,8 @@ void CITANetAudioMessage::ReadAnswer() nReturn = -1; // Network connection error } - if( nReturn != sizeof( VistaType::sint32 ) ) { + if( nReturn != sizeof( VistaType::sint32 ) ) + { ITA_EXCEPT1( UNKNOWN, "Protokoll error, Received less bytes than expected" ); } @@ -245,6 +245,11 @@ void CITANetAudioMessage::SetAnswerType( int nType ) m_nAnswerType = nType; } +int CITANetAudioMessage::GetAnswerType() const +{ + return m_nAnswerType; +} + int CITANetAudioMessage::GetIncomingMessageSize() const { return m_oIncoming.GetTailSize(); diff --git a/src/ITANetAudioServer.cpp b/src/ITANetAudioServer.cpp index 826b6dde39d515a09d3e88a4eccb7ed6af27ea5f..5a6ee6a594f101ac522225ab879b7e99b64b4c90 100644 --- a/src/ITANetAudioServer.cpp +++ b/src/ITANetAudioServer.cpp @@ -22,12 +22,15 @@ CITANetAudioServer::CITANetAudioServer() : m_pServer( NULL ) , m_pSocket( NULL ) + , m_pConnection( NULL ) , m_iServerPort( -1 ) { }; CITANetAudioServer::~CITANetAudioServer() { + delete m_pConnection; + delete m_pServer; } std::string CITANetAudioServer::GetServerAddress() const @@ -51,28 +54,35 @@ bool CITANetAudioServer::Start(const std::string& sAddress, int iPort) // blocking wait for connection m_pSocket = m_pServer->GetNextClient(); - if (m_pSocket != NULL) - return true; - return false; + if( !m_pSocket ) + return false; + if( m_pSocket->GetIsConnected() ) + m_pConnection = new VistaConnectionIP( m_pSocket ); + + if( !m_pConnection ) + return false; + + return true; } -VistaTCPSocket* CITANetAudioServer::GetSocket() const +VistaConnectionIP* CITANetAudioServer::GetConnection() const { - return m_pSocket; + return m_pConnection; } -void CITANetAudioServer::Disconnect() +void CITANetAudioServer::Stop() { + delete m_pConnection; + m_pConnection = NULL; + m_pSocket = NULL; + delete m_pServer; m_pServer = NULL; } bool CITANetAudioServer::IsConnected() const { - if( !m_pSocket ) - return false; - - return m_pSocket->GetIsConnected(); -} \ No newline at end of file + return m_pConnection ? true : false; +} diff --git a/src/ITANetAudioStreamingClient.cpp b/src/ITANetAudioStreamingClient.cpp index fb25f71b7b6473a6fb2bd7282f728d2c576ce7b5..df9b9f90292532cc0e3aa0ebca700b5badd8cde2 100644 --- a/src/ITANetAudioStreamingClient.cpp +++ b/src/ITANetAudioStreamingClient.cpp @@ -16,13 +16,14 @@ CITANetAudioStreamingClient::CITANetAudioStreamingClient( CITANetAudioStream* pP m_oClientParams.iChannels = pParent->GetNumberOfChannels(); m_oClientParams.dSampleRate = pParent->GetSampleRate(); m_oClientParams.iBlockSize = pParent->GetBlocklength(); + + m_pMessage = new CITANetAudioMessage( VistaSerializingToolset::SWAPS_MULTIBYTE_VALUES ); } CITANetAudioStreamingClient::~CITANetAudioStreamingClient() { if( m_pConnection ) { - m_pMessage->ResetMessage(); m_pMessage->SetMessageType( CITANetAudioProtocol::NP_CLIENT_CLOSE ); m_pMessage->WriteAnswer(); } @@ -38,15 +39,18 @@ bool CITANetAudioStreamingClient::Connect( const std::string& sAddress, int iPor m_pConnection = m_pClient->GetConnection(); + m_pMessage->ResetMessage(); m_pMessage->SetConnection( m_pConnection ); // Validate streaming parameters of server and client - m_pMessage->ResetMessage(); m_pMessage->SetMessageType( CITANetAudioProtocol::NP_CLIENT_OPEN ); m_pMessage->WriteStreamingParameters( m_oClientParams ); m_pMessage->WriteMessage(); m_pMessage->ReadAnswer(); + assert( m_pMessage->GetAnswerType() == CITANetAudioProtocol::NP_SERVER_OPEN ); + bool bOK = m_pMessage->ReadBool(); + CITANetAudioProtocol::StreamingParameters oServerParams = m_pMessage->ReadStreamingParameters(); if( oServerParams == m_oClientParams ) m_oServerParams = oServerParams; diff --git a/src/ITANetAudioStreamingServer.cpp b/src/ITANetAudioStreamingServer.cpp index e1c0570193a4ec1d5cb6464346734ad556008fbc..cd777d077462bd3d2d5b2f5e4acb44e712659974 100644 --- a/src/ITANetAudioStreamingServer.cpp +++ b/src/ITANetAudioStreamingServer.cpp @@ -1,5 +1,6 @@ #include #include +#include // ITA includes #include @@ -9,7 +10,6 @@ // Vista includes #include #include -#include #include #include #include @@ -21,30 +21,37 @@ CITANetAudioStreamingServer::CITANetAudioStreamingServer() : m_pInputStream( NULL ) , m_iUpdateStrategy( AUTO ) - , m_pSocket( NULL ) + , m_pConnection( NULL ) { m_pNetAudioServer = new CITANetAudioServer(); - // TODO: Init members + m_pMessage = new CITANetAudioMessage( VistaSerializingToolset::SWAPS_MULTIBYTE_VALUES ); } -bool CITANetAudioStreamingServer::Start(const std::string& sAddress, int iPort) +bool CITANetAudioStreamingServer::Start( const std::string& sAddress, int iPort ) { // TODO: vorrückgabe noch anfangen zu senden (Samples) - if (m_pNetAudioServer->Start(sAddress, iPort)) + if( m_pNetAudioServer->Start( sAddress, iPort ) ) { - m_pSocket = m_pNetAudioServer->GetSocket(); - // TODO: Init neu mit Netmessage - long nIncomingBytes = m_pSocket->WaitForIncomingData(0); - m_iClientRingBufferFreeSamples = m_iClientRingBufferFreeSamples; + m_pConnection = m_pNetAudioServer->GetConnection(); + + m_pMessage->ResetMessage(); + m_pMessage->SetConnection( m_pConnection ); + m_pMessage->ReadMessage(); - int iMessageID = 1; - m_pSocket->SendRaw(&iMessageID, sizeof(int)); + int nMT = m_pMessage->GetMessageType(); + assert( nMT == CITANetAudioProtocol::NP_CLIENT_OPEN ); + + CITANetAudioProtocol::StreamingParameters oClientParams = m_pMessage->ReadStreamingParameters(); + + m_pMessage->SetAnswerType( CITANetAudioProtocol::NP_SERVER_OPEN ); + m_pMessage->WriteBool( true ); + m_pMessage->WriteAnswer(); Run(); return true; - return true; } + return false; } @@ -65,7 +72,7 @@ int CITANetAudioStreamingServer::GetNetworkPort() const void CITANetAudioStreamingServer::Stop() { - m_pNetAudioServer->Disconnect(); + m_pNetAudioServer->Stop(); } void CITANetAudioStreamingServer::SetInputStream( ITADatasource* pInStream )