ITANetAudioStreamingServer.cpp 4.02 KB
Newer Older
Anne's avatar
Anne committed
1 2
#include <ITANetAudioStreamingServer.h>
#include <ITANetAudioServer.h>
3
#include <ITANetAudioMessage.h>
Anne's avatar
Anne committed
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

// ITA includes
#include <ITADataSource.h>
#include <ITAException.h>
#include <ITAStreamInfo.h>

// Vista includes
#include <VistaInterProcComm/Concurrency/VistaThreadLoop.h>
#include <VistaInterProcComm/Connections/VistaConnectionIP.h>
#include <VistaInterProcComm/IPNet/VistaTCPSocket.h>
#include <VistaBase/VistaTimeUtils.h>
#include <VistaInterProcComm/IPNet/VistaIPAddress.h>

// STL
#include <cmath>
#include <cassert>

CITANetAudioStreamingServer::CITANetAudioStreamingServer()
	: m_pInputStream( NULL )
	, m_iUpdateStrategy( AUTO )
24
	, m_pConnection( NULL )
Anne's avatar
Anne committed
25 26 27 28
{
	m_pNetAudioServer = new CITANetAudioServer();
}

29
bool CITANetAudioStreamingServer::Start( const std::string& sAddress, int iPort )
Anne's avatar
Anne committed
30
{
Dipl.-Ing. Jonas Stienen's avatar
Dipl.-Ing. Jonas Stienen committed
31 32 33
	if( !m_pInputStream )
		ITA_EXCEPT1( MODAL_EXCEPTION, "Can not start server without a valid input stream" );

Anne's avatar
Anne committed
34
	// TODO: vorrckgabe noch anfangen zu senden (Samples)
35 36
	if( !m_pNetAudioServer->Start( sAddress, iPort ) ) // blocking
		return false;
37

38
	m_pConnection = m_pNetAudioServer->GetConnection();
39

40 41 42 43
	m_pMessage = new CITANetAudioMessage( m_pConnection->GetByteorderSwapFlag() );
	m_pMessage->ResetMessage();
	m_pMessage->SetConnection( m_pConnection );
	m_pMessage->ReadMessage(); // blocking
44

Dipl.-Ing. Jonas Stienen's avatar
Dipl.-Ing. Jonas Stienen committed
45 46
	assert( m_pMessage->GetMessageType() == CITANetAudioProtocol::NP_CLIENT_OPEN );
	CITANetAudioProtocol::StreamingParameters oClientParams = m_pMessage->ReadStreamingParameters();
47

Dipl.-Ing. Jonas Stienen's avatar
Dipl.-Ing. Jonas Stienen committed
48 49 50 51 52
	bool bOK = false;
	if( m_pInputStream->GetNumberOfChannels() == oClientParams.iChannels &&
		m_pInputStream->GetSampleRate() == oClientParams.dSampleRate &&
		m_pInputStream->GetBlocklength() == oClientParams.iBlockSize )
		bOK = true;
53

54
	m_pMessage->SetAnswerType( CITANetAudioProtocol::NP_SERVER_OPEN );
Dipl.-Ing. Jonas Stienen's avatar
Dipl.-Ing. Jonas Stienen committed
55
	m_pMessage->WriteBool( bOK );
56
	m_pMessage->WriteAnswer();
57

Dipl.-Ing. Jonas Stienen's avatar
Dipl.-Ing. Jonas Stienen committed
58
	Run();
59 60

	return true;
Anne's avatar
Anne committed
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
}

bool CITANetAudioStreamingServer::IsClientConnected() const
{
	return m_pNetAudioServer->IsConnected();
}

std::string CITANetAudioStreamingServer::GetNetworkAddress() const
{
	return m_pNetAudioServer->GetServerAddress();
}

int CITANetAudioStreamingServer::GetNetworkPort() const
{
	return m_pNetAudioServer->GetNetworkPort();
}

void CITANetAudioStreamingServer::Stop() 
{
80
	m_pNetAudioServer->Stop();
Anne's avatar
Anne committed
81 82 83 84
}

void CITANetAudioStreamingServer::SetInputStream( ITADatasource* pInStream )
{
85 86 87
	if( VistaThreadLoop::IsRunning() )
		ITA_EXCEPT1( MODAL_EXCEPTION, "Streaming loop already running, can not change input stream" );

Anne's avatar
Anne committed
88
	m_pInputStream = pInStream;
89 90
	m_sfTempTransmitBuffer.init( m_pInputStream->GetNumberOfChannels(), m_pInputStream->GetBlocklength(), true );

Anne's avatar
Anne committed
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
}

int CITANetAudioStreamingServer::GetNetStreamBlocklength() const
{
	return m_sfTempTransmitBuffer.GetLength();
}

int CITANetAudioStreamingServer::GetNetStreamNumberOfChannels() const
{
	return m_sfTempTransmitBuffer.channels();
}

void CITANetAudioStreamingServer::SetAutomaticUpdateRate()
{
	m_iUpdateStrategy = AUTO;
}

Dipl.-Ing. Jonas Stienen's avatar
Dipl.-Ing. Jonas Stienen committed
108 109
bool CITANetAudioStreamingServer::LoopBody()
{
110 111 112 113 114 115 116
	m_pMessage->ResetMessage();
	m_pMessage->SetConnection( m_pConnection );
	m_pMessage->ReadMessage(); // blocking

	switch( m_pMessage->GetMessageType() )
	{
	case CITANetAudioProtocol::NP_CLIENT_WAITING_FOR_SAMPLES:
Dipl.-Ing. Jonas Stienen's avatar
Dipl.-Ing. Jonas Stienen committed
117
		for( int i = 0; i < m_pInputStream->GetNumberOfChannels(); i++ )
118
		{
Dipl.-Ing. Jonas Stienen's avatar
Dipl.-Ing. Jonas Stienen committed
119 120 121
			ITAStreamInfo oStreamInfo;
			const float* pfData = m_pInputStream->GetBlockPointer( i, &oStreamInfo );
			m_sfTempTransmitBuffer[ i ].write( pfData, m_pInputStream->GetBlocklength() );
122
		}
Dipl.-Ing. Jonas Stienen's avatar
Dipl.-Ing. Jonas Stienen committed
123
		
124 125 126
		//m_pMessage->WriteSampleFrame( &m_sfTempTransmitBuffer );
		m_pMessage->WriteAnswer();
		break;
Dipl.-Ing. Jonas Stienen's avatar
Dipl.-Ing. Jonas Stienen committed
127 128 129 130 131 132 133 134

	case CITANetAudioProtocol::NP_CLIENT_CLOSE:
		m_pMessage->WriteAnswer();
		m_pConnection = NULL;
		StopGently( true );
		Stop();

		return false;
135 136
	}

Dipl.-Ing. Jonas Stienen's avatar
Dipl.-Ing. Jonas Stienen committed
137 138 139
	return true;
}

Anne's avatar
Anne committed
140 141 142 143 144 145 146 147 148
ITADatasource* CITANetAudioStreamingServer::GetInputStream() const
{
	return m_pInputStream;
}

int CITANetAudioStreamingServer::Transmit(const ITASampleFrame& sfNewSamples, int iNumSamples)
{
	return 0;
}