From e229bfab7afeb57d507245cd0b963103fca09d15 Mon Sep 17 00:00:00 2001
From: Jonas Stienen <jst@akustik.rwth-aachen.de>
Date: Mon, 19 Dec 2016 12:16:30 +0100
Subject: [PATCH] Example messaging in net audio

---
 include/ITANetAudioClient.h  | 12 ++++++--
 include/ITANetAudioMessage.h |  2 ++
 src/ITANetAudioClient.cpp    | 56 +++++++++++++++++++-----------------
 src/ITANetAudioMessage.cpp   |  5 ++++
 4 files changed, 46 insertions(+), 29 deletions(-)

diff --git a/include/ITANetAudioClient.h b/include/ITANetAudioClient.h
index 83e329b..3a4821e 100644
--- a/include/ITANetAudioClient.h
+++ b/include/ITANetAudioClient.h
@@ -29,22 +29,28 @@
 #include <string>
 #include <vector>
 
-class CITANetAudioStream;
-class VistaConnectionIP;
 class CITANetAudioMessage;
 class CITANetAudioProtocol;
+class CITANetAudioStream;
+
+class VistaConnectionIP;
 
 class CITANetAudioClient : public VistaThreadLoop
 {
 public:
 
+	//! Create an network audio client tha feeds into a network audio stream
+	/**
+	  * \param pParent ITADataSource-compatible audio stream
+	  */
 	CITANetAudioClient( CITANetAudioStream* pParent );
 	~CITANetAudioClient();
 
 	bool Connect( const std::string& sAddress, int iPort );
 	void Disconnect();
+	bool GetIsConnected() const;
+
 	bool LoopBody();
-	bool GetIsConnected();
 
 private:
 	CITANetAudioStream* m_pParent;
diff --git a/include/ITANetAudioMessage.h b/include/ITANetAudioMessage.h
index bc874bc..6e33fb1 100644
--- a/include/ITANetAudioMessage.h
+++ b/include/ITANetAudioMessage.h
@@ -87,6 +87,8 @@ public:
 	std::vector< int > ReadIntVector();
 	std::vector< float > ReadFloatVector();
 
+	void WriteClientOpen();
+
 private:
 	int m_nMessageType;
 	int m_nMessageId;
diff --git a/src/ITANetAudioClient.cpp b/src/ITANetAudioClient.cpp
index b675584..e17e70c 100644
--- a/src/ITANetAudioClient.cpp
+++ b/src/ITANetAudioClient.cpp
@@ -1,6 +1,8 @@
 #include <ITANetAudioClient.h>
-#include <ITANetAudioStream.h>
+
+#include <ITANetAudioMessage.h>
 #include <ITANetAudioProtocol.h>
+#include <ITANetAudioStream.h>
 
 #include <VistaInterProcComm/Connections/VistaConnectionIP.h>
 
@@ -9,15 +11,19 @@ CITANetAudioClient::CITANetAudioClient( CITANetAudioStream* pParent )
 	, m_pConnection( NULL )
 	, m_bStopIndicated( false )
 {
+	m_pMessage = new CITANetAudioMessage( VistaSerializingToolset::SWAPS_MULTIBYTE_VALUES );
 }
 
 CITANetAudioClient::~CITANetAudioClient()
 {
 	if( m_pConnection )
 	{
-		int iMessageType = CITANetAudioProtocol::NP_CLIENT_CLOSE;
-		m_pConnection->Send( &iMessageType, sizeof( int ) );
+		m_pMessage->ResetMessage();
+		m_pMessage->SetMessageType( CITANetAudioProtocol::NP_CLIENT_CLOSE );
+		m_pMessage->WriteAnswer();
 	}
+
+	delete m_pMessage;
 }
 
 bool CITANetAudioClient::Connect( const std::string& sAddress, int iPort )
@@ -33,22 +39,13 @@ bool CITANetAudioClient::Connect( const std::string& sAddress, int iPort )
 		m_pConnection = NULL;
 		return false;
 	}
+	
+	m_pMessage->SetConnection( m_pConnection );
 
-	int iMessageType = CITANetAudioProtocol::NP_CLIENT_OPEN;
-	m_pConnection->Send( &iMessageType, sizeof( int ) );
-
-	int iNumChannels = ( int ) m_pParent->GetNumberOfChannels();
-	m_pConnection->Send( &iNumChannels, sizeof( int ) );
-	double dSampleRate = m_pParent->GetSampleRate();
-	m_pConnection->Send( &dSampleRate, sizeof( double ) );
-	int iBlockLength = ( int ) m_pParent->GetBlocklength();
-	m_pConnection->Send( &iBlockLength, sizeof( int ) );
-	int iRingBufferSize = ( int ) m_pParent->GetRingBufferSize();
-	m_pConnection->Send( &iRingBufferSize, sizeof( int ) );
-	m_pConnection->WaitForSendFinish();
-
-	int iServerMessageType;
-	m_pConnection->Receive( &iServerMessageType, sizeof( int ) );
+	m_pMessage->ResetMessage();
+	m_pMessage->WriteClientOpen();
+	m_pMessage->WriteMessage();
+	m_pMessage->ReadAnswer();
 
 	Run();
 
@@ -71,19 +68,26 @@ bool CITANetAudioClient::LoopBody()
 	if( m_bStopIndicated )
 		return true;
 
-	// Receive messages
-	while( true )
+	// Receive message
+	m_pMessage->ReadMessage();
+	switch( m_pMessage->GetMessageType() )
 	{
-		m_pConnection->Receive( NULL, 0 ); // @todo: receive messages and react
-
-		int iNumSamples = 12;
-		if( true )
-			m_pParent->Transmit( m_sfReceivingBuffer, iNumSamples );
+	case CITANetAudioProtocol::NP_INVALID:
+		break;
+	case CITANetAudioProtocol::NP_SERVER_SEND_SAMPLES:
+		/*
+		int iNumSamples = m_pMessage->ReadSamples( m_sfReceivingBuffer );
+		m_pParent->Transmit( m_sfReceivingBuffer, iNumSamples );
+		int iFreeSamples = m_pParent->GetRingBufferFreeSamples();
+		m_pMessage->WriteFreeRingBufferSamples( iFreeSamples );
+		m_pMessage->WriteAnswer();
+		*/
+		break;
 	}
 }
 
 
-bool CITANetAudioClient::GetIsConnected()
+bool CITANetAudioClient::GetIsConnected() const
 {
 	if( m_pConnection )
 		return true;
diff --git a/src/ITANetAudioMessage.cpp b/src/ITANetAudioMessage.cpp
index 1903b2f..a006b73 100644
--- a/src/ITANetAudioMessage.cpp
+++ b/src/ITANetAudioMessage.cpp
@@ -376,3 +376,8 @@ std::vector<int> CITANetAudioMessage::ReadIntVector()
 
 	return viData;
 }
+
+void CITANetAudioMessage::WriteClientOpen()
+{
+	SetMessageType( CITANetAudioProtocol::NP_CLIENT_OPEN );
+}
-- 
GitLab