From f794c92d5278aa874429bed3a5571ccaf3b27b8d Mon Sep 17 00:00:00 2001 From: Anne Date: Tue, 10 Jan 2017 19:06:34 +0100 Subject: [PATCH] running MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Serverlog + client Plockpointer überarbeitet + freie Samples aus dem Buffer werden richtig kalkuliert --- include/ITANetAudioStreamingServer.h | 6 ++ src/ITANetAudioStream.cpp | 81 ++++++++++--------- src/ITANetAudioStreamingServer.cpp | 13 ++- .../ITANetAudioStreamingServerTest.cpp | 2 +- 4 files changed, 62 insertions(+), 40 deletions(-) diff --git a/include/ITANetAudioStreamingServer.h b/include/ITANetAudioStreamingServer.h index 4d93ce2..185259d 100644 --- a/include/ITANetAudioStreamingServer.h +++ b/include/ITANetAudioStreamingServer.h @@ -25,11 +25,15 @@ #include #include +#include +#include #include #include #include + +using namespace std; class ITADatasource; class CITANetAudioMessage; @@ -91,6 +95,8 @@ private: int m_iClientRingBufferFreeSamples; friend class CITANetAudioServer; + + ofstream outputFile; }; #endif // INCLUDE_WATCHER_ITA_NET_AUDIO_STREAMING_SERVER diff --git a/src/ITANetAudioStream.cpp b/src/ITANetAudioStream.cpp index 72b679a..6de0212 100644 --- a/src/ITANetAudioStream.cpp +++ b/src/ITANetAudioStream.cpp @@ -49,57 +49,60 @@ bool CITANetAudioStream::GetIsConnected() const const float* CITANetAudioStream::GetBlockPointer( unsigned int uiChannel, const ITAStreamInfo* ) { - ITASampleBuffer& sbOutputStreamBuffer( m_sfOutputStreamBuffer[ uiChannel ] ); - sbOutputStreamBuffer.Zero(); - const float* pfBlockPointer = sbOutputStreamBuffer.GetData(); - - if( !GetIsConnected() ) - return pfBlockPointer; - - m_iStreamingStatus = STREAMING; - - int iCurrentWriteCursor = m_iWriteCursor; // local copy - - if( iCurrentWriteCursor <= m_iReadCursor && GetRingBufferFreeSamples() > 0 ) // Wrap around? - iCurrentWriteCursor += GetRingBufferSize(); // Write pointer always ahead, so unwrap first + outputFile << "GBP "; + if ( !GetIsConnected( ) ) + { + m_sfOutputStreamBuffer[ uiChannel ].Zero( ); + return m_sfOutputStreamBuffer[ uiChannel ].GetData( ); + } - int iReadableSamples = iCurrentWriteCursor - m_iReadCursor; - if ( iReadableSamples > int( GetBlocklength( ) ) ) // samples can be cyclic-copied safely from ring buffer + if ( GetIsRingBufferEmpty( ) ) { - m_sfRingBuffer[ uiChannel ].cyclic_read( sbOutputStreamBuffer.GetData( ), sbOutputStreamBuffer.GetLength( ), m_iReadCursor ); - pfBlockPointer = sbOutputStreamBuffer.GetData( ); + outputFile << "ZERO "; + m_sfOutputStreamBuffer[ uiChannel ].Zero( ); } - else if( iReadableSamples > 0) + // Es ist mindestens ein Block da + else { - // @todo: fade with ITAFade - //std::cerr << "Should fade right now, but skipping samples." << std::endl; + outputFile << "Norm "; + // Es ist mindestens ein Block da + m_sfRingBuffer[ uiChannel ].cyclic_read( m_sfOutputStreamBuffer[ uiChannel ].GetData( ), m_sfOutputStreamBuffer.GetLength( ), m_iReadCursor ); + // weniger als ein Block + // todo fading + } - return pfBlockPointer; + + return m_sfOutputStreamBuffer[uiChannel].GetData(); } void CITANetAudioStream::IncrementBlockPointer() { // Increment read cursor by one audio block and wrap around if exceeding ring buffer - if ( ( GetRingBufferSize() - GetRingBufferFreeSamples( )) >= int( GetBlocklength( ) ) ) + + int iSavedSample = GetRingBufferSize( ) - GetRingBufferFreeSamples( ); + + if ( iSavedSample >= int( GetBlocklength( ) ) ) { + //es wurden Samples abgespielt m_iReadCursor = ( m_iReadCursor + m_sfOutputStreamBuffer.GetLength() ) % m_sfRingBuffer.GetLength(); m_iStreamingStatus = STREAMING; - //outputFile << "incRead "; + outputFile << "incRead "; } else if ( GetIsRingBufferEmpty( ) ) { - //outputFile << "buffer empty "; + m_iStreamingStatus = STOPPED; + outputFile << "buffer empty "; } else { m_iStreamingStatus = BUFFER_UNDERRUN; m_iReadCursor = m_iWriteCursor; - //outputFile << "BufferOverrun "; + outputFile << "BufferOverrun "; } m_bRingBufferFull = false; - //outputFile << "\tRead: " << m_iReadCursor; - //outputFile << "\tWrite : " << m_iWriteCursor; - //outputFile << "\tFreeSamples: " << GetRingBufferFreeSamples ()<< endl; + outputFile << "\tRead: " << m_iReadCursor; + outputFile << "\tWrite : " << m_iWriteCursor; + outputFile << "\tFreeSamples: " << GetRingBufferFreeSamples ()<< endl; m_pNetAudioStreamingClient->TriggerBlockIncrement(); } @@ -112,28 +115,34 @@ int CITANetAudioStream::Transmit( const ITASampleFrame& sfNewSamples, int iNumSa if( iCurrentWriteCursor < iCurrentReadCursor ) iCurrentWriteCursor += GetRingBufferSize(); // Unwrap, because write cursor always ahead - if( GetRingBufferFreeSamples() < iNumSamples ) + if ( m_iWriteCursor == m_iReadCursor ) + { + m_bRingBufferFull = true; + outputFile << " BuffFull: "; + } + else if( GetRingBufferFreeSamples() < iNumSamples ) { // @todo: only partly write //std::cerr << "BUFFER_OVERRUN! Would partly write samples because ring buffer will be full then." << std::endl; m_iWriteCursor = m_iReadCursor; - m_bRingBufferFull = false; - //outputFile << " incSomeWrite: "; + outputFile << " incSomeWrite: "; } else { // write samples into ring buffer m_sfRingBuffer.cyclic_write( sfNewSamples, iNumSamples, 0, iCurrentWriteCursor ); + m_bRingBufferFull = false; // set write curser m_iWriteCursor = ( m_iWriteCursor + iNumSamples ) % GetRingBufferSize( ); - m_bRingBufferFull = true; - //outputFile << " IncWrite: "; + if ( m_iWriteCursor == m_iReadCursor ) + m_bRingBufferFull = true; + outputFile << " IncWrite: "; } - //outputFile << "\tRead: " << m_iReadCursor; - //outputFile << "\tWrite : " << m_iWriteCursor; - //outputFile << "\tFreeSamples: " << GetRingBufferFreeSamples( ) << endl; + outputFile << "\tRead: " << m_iReadCursor; + outputFile << "\tWrite : " << m_iWriteCursor; + outputFile << "\tFreeSamples: " << GetRingBufferFreeSamples( ) << endl; return GetRingBufferFreeSamples(); } diff --git a/src/ITANetAudioStreamingServer.cpp b/src/ITANetAudioStreamingServer.cpp index fc9548f..8c5e3d4 100644 --- a/src/ITANetAudioStreamingServer.cpp +++ b/src/ITANetAudioStreamingServer.cpp @@ -24,7 +24,8 @@ CITANetAudioStreamingServer::CITANetAudioStreamingServer() , m_iUpdateStrategy( AUTO ) , m_pConnection( NULL ) { - m_pNetAudioServer = new CITANetAudioServer(); + m_pNetAudioServer = new CITANetAudioServer( ); + outputFile.open( "ServerLog.txt" ); } bool CITANetAudioStreamingServer::Start( const std::string& sAddress, int iPort ) @@ -89,6 +90,8 @@ int CITANetAudioStreamingServer::GetNetworkPort() const void CITANetAudioStreamingServer::Stop() { m_pNetAudioServer->Stop(); + + outputFile.close( ); } void CITANetAudioStreamingServer::SetInputStream( ITADatasource* pInStream ) @@ -128,9 +131,12 @@ bool CITANetAudioStreamingServer::LoopBody() case CITANetAudioProtocol::NP_CLIENT_WAITING_FOR_SAMPLES: { int iFreeSamples = m_pMessage->ReadInt(); + + outputFile << "freeSamples " << iFreeSamples; if( iFreeSamples >= m_pInputStream->GetBlocklength() ) { - // Send Samples + // Send Samples + outputFile << "SendSamples" << endl; for( int i = 0; i < m_pInputStream->GetNumberOfChannels(); i++ ) { ITAStreamInfo oStreamInfo; @@ -146,7 +152,8 @@ bool CITANetAudioStreamingServer::LoopBody() //std::cout << "Transmitted " << m_pInputStream->GetBlocklength() << " samples, because there where " << iFreeSamples << " free samples on client side" << std::endl; } else - { + { + outputFile << "Waiting" << endl; //std::cout << "Could not transmitt, because there where only " << iFreeSamples << " free samples on client side" << std::endl; // Waiting for Trigger diff --git a/tests/NetAudio/ITANetAudioStreamingServerTest.cpp b/tests/NetAudio/ITANetAudioStreamingServerTest.cpp index f0627be..322a503 100644 --- a/tests/NetAudio/ITANetAudioStreamingServerTest.cpp +++ b/tests/NetAudio/ITANetAudioStreamingServerTest.cpp @@ -16,7 +16,7 @@ static int g_iBlockLength = 256; int main( int , char** ) { ITAStreamFunctionGenerator oGenerator( 2, g_dSampleRate, g_iBlockLength, ITAStreamFunctionGenerator::SINE, 456.78f, 0.81f, true ); - ITAFileDatasource oDatei("01_Empfang_Guten_Tag.wav", g_iBlockLength); + ITAFileDatasource oDatei("Gershwin.wav", g_iBlockLength); CITANetAudioStreamingServer oStreamingServer; oStreamingServer.SetInputStream(&oDatei); -- GitLab