142 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
 | |
| ////////////////////////////////////////////////////////////
 | |
| // Headers
 | |
| ////////////////////////////////////////////////////////////
 | |
| #include <SFML/Audio.hpp>
 | |
| #include <SFML/Network.hpp>
 | |
| #include <iostream>
 | |
| 
 | |
| 
 | |
| const sf::Uint8 audioData   = 1;
 | |
| const sf::Uint8 endOfStream = 2;
 | |
| 
 | |
| 
 | |
| ////////////////////////////////////////////////////////////
 | |
| /// Specialization of audio recorder for sending recorded audio
 | |
| /// data through the network
 | |
| ////////////////////////////////////////////////////////////
 | |
| class NetworkRecorder : public sf::SoundRecorder
 | |
| {
 | |
| public:
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// Constructor
 | |
|     ///
 | |
|     /// \param host Remote host to which send the recording data
 | |
|     /// \param port Port of the remote host
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     NetworkRecorder(const sf::IpAddress& host, unsigned short port) :
 | |
|     m_host(host),
 | |
|     m_port(port)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// Destructor
 | |
|     ///
 | |
|     /// \see SoundRecorder::~SoundRecorder()
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     ~NetworkRecorder()
 | |
|     {
 | |
|         // Make sure to stop the recording thread
 | |
|         stop();
 | |
|     }
 | |
| 
 | |
| private:
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \see SoundRecorder::onStart
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     virtual bool onStart()
 | |
|     {
 | |
|         if (m_socket.connect(m_host, m_port) == sf::Socket::Done)
 | |
|         {
 | |
|             std::cout << "Connected to server " << m_host << std::endl;
 | |
|             return true;
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \see SoundRecorder::onProcessSamples
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     virtual bool onProcessSamples(const sf::Int16* samples, std::size_t sampleCount)
 | |
|     {
 | |
|         // Pack the audio samples into a network packet
 | |
|         sf::Packet packet;
 | |
|         packet << audioData;
 | |
|         packet.append(samples, sampleCount * sizeof(sf::Int16));
 | |
| 
 | |
|         // Send the audio packet to the server
 | |
|         return m_socket.send(packet) == sf::Socket::Done;
 | |
|     }
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \see SoundRecorder::onStop
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     virtual void onStop()
 | |
|     {
 | |
|         // Send a "end-of-stream" packet
 | |
|         sf::Packet packet;
 | |
|         packet << endOfStream;
 | |
|         m_socket.send(packet);
 | |
| 
 | |
|         // Close the socket
 | |
|         m_socket.disconnect();
 | |
|     }
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     // Member data
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     sf::IpAddress  m_host;   ///< Address of the remote host
 | |
|     unsigned short m_port;   ///< Remote port
 | |
|     sf::TcpSocket  m_socket; ///< Socket used to communicate with the server
 | |
| };
 | |
| 
 | |
| 
 | |
| ////////////////////////////////////////////////////////////
 | |
| /// Create a client, connect it to a running server and
 | |
| /// start sending him audio data
 | |
| ///
 | |
| ////////////////////////////////////////////////////////////
 | |
| void doClient(unsigned short port)
 | |
| {
 | |
|     // Check that the device can capture audio
 | |
|     if (!sf::SoundRecorder::isAvailable())
 | |
|     {
 | |
|         std::cout << "Sorry, audio capture is not supported by your system" << std::endl;
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     // Ask for server address
 | |
|     sf::IpAddress server;
 | |
|     do
 | |
|     {
 | |
|         std::cout << "Type address or name of the server to connect to: ";
 | |
|         std::cin  >> server;
 | |
|     }
 | |
|     while (server == sf::IpAddress::None);
 | |
| 
 | |
|     // Create an instance of our custom recorder
 | |
|     NetworkRecorder recorder(server, port);
 | |
| 
 | |
|     // Wait for user input...
 | |
|     std::cin.ignore(10000, '\n');
 | |
|     std::cout << "Press enter to start recording audio";
 | |
|     std::cin.ignore(10000, '\n');
 | |
| 
 | |
|     // Start capturing audio data
 | |
|     recorder.start(44100);
 | |
|     std::cout << "Recording... press enter to stop";
 | |
|     std::cin.ignore(10000, '\n');
 | |
|     recorder.stop();
 | |
| }
 |