first commit
This commit is contained in:
102
src/Services/AudioStreamService.h
Normal file
102
src/Services/AudioStreamService.h
Normal file
@@ -0,0 +1,102 @@
|
||||
#pragma once
|
||||
|
||||
#include <sio_client.h>
|
||||
#include <atomic>
|
||||
#include <spdlog/spdlog.h>
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
|
||||
namespace snoop {
|
||||
|
||||
class AudioStreamService {
|
||||
std::shared_ptr<sio::client> m_client;
|
||||
std::string m_guid;
|
||||
std::atomic<bool> m_isConnected = false;
|
||||
std::atomic<bool> m_isInStreaming = false;
|
||||
std::vector<char> m_audioBuffer;
|
||||
std::mutex m_bufferMutex;
|
||||
const unsigned long long int FLUSH_PERIOD = 5000;
|
||||
const std::vector<char> PACKET_DELIMITER = {
|
||||
static_cast<char>(0xFF),
|
||||
static_cast<char>(0xFE),
|
||||
static_cast<char>(0xFD),
|
||||
static_cast<char>(0xFC)
|
||||
};
|
||||
unsigned long long int m_flushedAt = 0;
|
||||
|
||||
public:
|
||||
explicit AudioStreamService( std::shared_ptr<sio::client> client, std::string guid ) :
|
||||
m_client( std::move( client ) ),
|
||||
m_guid( std::move( guid ) ) {
|
||||
SetupEventListeners();
|
||||
}
|
||||
|
||||
~AudioStreamService() {
|
||||
this->m_isConnected = false;
|
||||
this->m_isInStreaming = false;
|
||||
}
|
||||
|
||||
void SendAudioData( const char* input, size_t size ) {
|
||||
if( !this->m_isConnected || !this->m_isInStreaming ) {
|
||||
return;
|
||||
}
|
||||
|
||||
std::lock_guard lock( m_bufferMutex );
|
||||
this->m_audioBuffer.insert(m_audioBuffer.end(), PACKET_DELIMITER.begin(), PACKET_DELIMITER.end());
|
||||
this->m_audioBuffer.insert( m_audioBuffer.end(), input, input + size );
|
||||
|
||||
auto now = std::chrono::system_clock::now();
|
||||
auto currentTime = std::chrono::duration_cast<std::chrono::milliseconds>( now.time_since_epoch() ).count();
|
||||
if( currentTime >= this->m_flushedAt + FLUSH_PERIOD ) {
|
||||
FlushBuffer();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
void SetupEventListeners() {
|
||||
this->m_client->set_open_listener( [this]() {
|
||||
spdlog::info( "Connected to server" );
|
||||
this->m_client->socket( "/livestream" )->emit( "register_device", m_guid );
|
||||
this->m_isConnected = true;
|
||||
} );
|
||||
|
||||
this->m_client->set_close_listener( [this]( sio::client::close_reason const& reason ) {
|
||||
this->m_isConnected = false;
|
||||
this->m_isInStreaming = false;
|
||||
spdlog::info( "Disconnected from server" );
|
||||
} );
|
||||
|
||||
this->m_client->set_fail_listener( []() {
|
||||
spdlog::info( "Failed to connect to server" );
|
||||
} );
|
||||
|
||||
this->m_client->socket( "/livestream" )->on( "start_streaming", [this]( sio::event& ev ) {
|
||||
spdlog::info( "Start streaming command received" );
|
||||
this->m_isInStreaming = true;
|
||||
auto now = std::chrono::system_clock::now();
|
||||
this->m_flushedAt = std::chrono::duration_cast<std::chrono::milliseconds>( now.time_since_epoch() ).count();
|
||||
} );
|
||||
|
||||
this->m_client->socket( "/livestream" )->on( "stop_streaming", [this]( sio::event& ev ) {
|
||||
spdlog::info( "Stop streaming command received" );
|
||||
this->m_isInStreaming = false;
|
||||
std::lock_guard lock( this->m_bufferMutex );
|
||||
this->m_audioBuffer.clear();
|
||||
} );
|
||||
}
|
||||
|
||||
void FlushBuffer() {
|
||||
if( this->m_audioBuffer.empty() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this->m_client->socket( "/livestream" )->emit( "audio_data",
|
||||
std::make_shared<std::string>( this->m_audioBuffer.data(), this->m_audioBuffer.size() )
|
||||
);
|
||||
this->m_audioBuffer.clear();
|
||||
auto now = std::chrono::system_clock::now();
|
||||
this->m_flushedAt = std::chrono::duration_cast<std::chrono::milliseconds>( now.time_since_epoch() ).count();
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user