@@ -245,13 +245,13 @@ void Application::PlaySound(const std::string_view& sound) {
245245 p += sizeof (BinaryProtocol3);
246246
247247 auto payload_size = ntohs (p3->payload_size );
248- std::vector< uint8_t > opus ;
249- opus .resize (payload_size);
250- memcpy (opus .data (), p3->payload , payload_size);
248+ AudioStreamPacket packet ;
249+ packet. payload .resize (payload_size);
250+ memcpy (packet. payload .data (), p3->payload , payload_size);
251251 p += payload_size;
252252
253253 std::lock_guard<std::mutex> lock (mutex_);
254- audio_decode_queue_.emplace_back (std::move (opus ));
254+ audio_decode_queue_.emplace_back (std::move (packet ));
255255 }
256256}
257257
@@ -391,11 +391,11 @@ void Application::Start() {
391391 SetDeviceState (kDeviceStateIdle );
392392 Alert (Lang::Strings::ERROR, message.c_str (), " sad" , Lang::Sounds::P3_EXCLAMATION);
393393 });
394- protocol_->OnIncomingAudio ([this ](std::vector< uint8_t > && data ) {
394+ protocol_->OnIncomingAudio ([this ](AudioStreamPacket && packet ) {
395395 const int max_packets_in_queue = 600 / OPUS_FRAME_DURATION_MS;
396396 std::lock_guard<std::mutex> lock (mutex_);
397397 if (audio_decode_queue_.size () < max_packets_in_queue) {
398- audio_decode_queue_.emplace_back (std::move (data ));
398+ audio_decode_queue_.emplace_back (std::move (packet ));
399399 }
400400 });
401401 protocol_->OnAudioChannelOpened ([this , codec, &board]() {
@@ -510,8 +510,12 @@ void Application::Start() {
510510 return ;
511511 }
512512 opus_encoder_->Encode (std::move (data), [this ](std::vector<uint8_t >&& opus) {
513- Schedule ([this , opus = std::move (opus)]() {
514- protocol_->SendAudio (opus);
513+ AudioStreamPacket packet;
514+ packet.payload = std::move (opus);
515+ packet.timestamp = last_output_timestamp_;
516+ last_output_timestamp_ = 0 ;
517+ Schedule ([this , packet = std::move (packet)]() {
518+ protocol_->SendAudio (packet);
515519 });
516520 });
517521 });
@@ -544,10 +548,10 @@ void Application::Start() {
544548 return ;
545549 }
546550
547- std::vector< uint8_t > opus ;
551+ AudioStreamPacket packet ;
548552 // Encode and send the wake word data to the server
549- while (wake_word_detect_.GetWakeWordOpus (opus )) {
550- protocol_->SendAudio (opus );
553+ while (wake_word_detect_.GetWakeWordOpus (packet. payload )) {
554+ protocol_->SendAudio (packet );
551555 }
552556 // Set the chat state to wake word detected
553557 protocol_->SendWakeWordDetected (wake_word);
@@ -671,20 +675,20 @@ void Application::OnAudioOutput() {
671675 return ;
672676 }
673677
674- auto opus = std::move (audio_decode_queue_.front ());
678+ auto packet = std::move (audio_decode_queue_.front ());
675679 audio_decode_queue_.pop_front ();
676680 lock.unlock ();
677681 audio_decode_cv_.notify_all ();
678682
679683 busy_decoding_audio_ = true ;
680- background_task_->Schedule ([this , codec, opus = std::move (opus )]() mutable {
684+ background_task_->Schedule ([this , codec, packet = std::move (packet )]() mutable {
681685 busy_decoding_audio_ = false ;
682686 if (aborted_) {
683687 return ;
684688 }
685689
686690 std::vector<int16_t > pcm;
687- if (!opus_decoder_->Decode (std::move (opus ), pcm)) {
691+ if (!opus_decoder_->Decode (std::move (packet. payload ), pcm)) {
688692 return ;
689693 }
690694 // Resample if the sample rate is different
@@ -695,6 +699,7 @@ void Application::OnAudioOutput() {
695699 pcm = std::move (resampled);
696700 }
697701 codec->OutputData (pcm);
702+ last_output_timestamp_ = packet.timestamp ;
698703 last_output_time_ = std::chrono::steady_clock::now ();
699704 });
700705}
@@ -730,8 +735,12 @@ void Application::OnAudioInput() {
730735 return ;
731736 }
732737 opus_encoder_->Encode (std::move (data), [this ](std::vector<uint8_t >&& opus) {
733- Schedule ([this , opus = std::move (opus)]() {
734- protocol_->SendAudio (opus);
738+ AudioStreamPacket packet;
739+ packet.payload = std::move (opus);
740+ packet.timestamp = last_output_timestamp_;
741+ last_output_timestamp_ = 0 ;
742+ Schedule ([this , packet = std::move (packet)]() {
743+ protocol_->SendAudio (packet);
735744 });
736745 });
737746 });
0 commit comments