1212#include <zephyr/zbus/zbus.h>
1313#include <zephyr/kernel.h>
1414#include <zephyr/shell/shell.h>
15- #include <zephyr/net_buf.h>
1615#include <nrfx_clock.h>
1716#include <contin_array.h>
1817#include <tone.h>
@@ -92,7 +91,8 @@ LOG_MODULE_REGISTER(audio_datapath, CONFIG_AUDIO_DATAPATH_LOG_LEVEL);
9291/* How often to print under-run warning */
9392#define UNDERRUN_LOG_INTERVAL_BLKS 5000
9493
95- NET_BUF_POOL_FIXED_DEFINE (pool_i2s_rx , FIFO_NUM_BLKS , BLK_STEREO_SIZE_OCTETS , 8 , net_buf_destroy );
94+ NET_BUF_POOL_FIXED_DEFINE (pool_i2s_rx , FIFO_NUM_BLKS , BLK_STEREO_SIZE_OCTETS ,
95+ sizeof (struct audio_metadata ), NULL );
9696
9797enum drift_comp_state {
9898 DRIFT_STATE_INIT , /* Waiting for data to be received */
@@ -128,7 +128,7 @@ static struct {
128128 void * decoded_data ;
129129
130130 struct {
131- struct data_fifo * fifo ;
131+ struct k_msgq * audio_q ;
132132 } in ;
133133
134134 struct {
@@ -693,69 +693,60 @@ static void audio_datapath_i2s_blk_complete(uint32_t frame_start_ts_us, uint32_t
693693
694694 /********** I2S RX **********/
695695 static int prev_ret ;
696- struct audio_data * rx_audio_block = NULL ;
697- struct net_buf * buf_in ;
696+ struct net_buf * rx_audio_block = NULL ;
698697
699698 if (IS_ENABLED (CONFIG_STREAM_BIDIRECTIONAL ) || (CONFIG_AUDIO_DEV == GATEWAY )) {
700699 if (rx_buf_released == NULL ) {
701700 /* No RX data available */
702701 ERR_CHK_MSG (- ENOMEM , "No RX data available" );
703702 }
704703
705- buf_in = net_buf_alloc (& pool_i2s_rx , K_NO_WAIT );
706- if (buf_in == NULL ) {
707- ERR_CHK_MSG (- ENOMEM , "Out of RX buffers for I2S" );
704+ if (k_msgq_num_free_get (ctrl_blk .in .audio_q ) == 0 || pool_i2s_rx .avail_count == 0 ) {
705+ ret = - ENOMEM ;
706+ } else {
707+ ret = 0 ;
708708 }
709709
710- /* Store RX buffer in net_buf */
711- net_buf_add_mem (buf_in , rx_buf_released , BLK_STEREO_SIZE_OCTETS );
712-
713- /* Get first available audio block */
714- ret = data_fifo_pointer_first_vacant_get (ctrl_blk .in .fifo , (void * )& rx_audio_block ,
715- K_NO_WAIT );
716710 /* If RX FIFO is filled up */
717711 if (ret == - ENOMEM ) {
718- struct audio_data * stale_i2s_data ;
719- size_t stale_i2s_data_size ;
712+ struct net_buf * stale_i2s_data ;
720713
721714 if (ret != prev_ret ) {
722715 LOG_WRN ("I2S RX overrun. Single msg" );
723716 prev_ret = ret ;
724717 }
725718
726- ret = data_fifo_pointer_last_filled_get (ctrl_blk .in .fifo ,
727- (void * )& stale_i2s_data ,
728- & stale_i2s_data_size , K_NO_WAIT );
719+ ret = k_msgq_get (ctrl_blk .in .audio_q , (void * )& stale_i2s_data , K_NO_WAIT );
729720 ERR_CHK (ret );
730721
731- struct net_buf * buf = stale_i2s_data -> data ;
722+ net_buf_unref ( stale_i2s_data ) ;
732723
733- net_buf_unref (buf );
734- data_fifo_block_free (ctrl_blk .in .fifo , stale_i2s_data );
735-
736- ret = data_fifo_pointer_first_vacant_get (
737- ctrl_blk .in .fifo , (void * )& rx_audio_block , K_NO_WAIT );
738724 } else if (ret == 0 && prev_ret == - ENOMEM ) {
739725 LOG_WRN ("I2S RX continuing stream" );
740726 prev_ret = ret ;
741727 }
742728
743- rx_audio_block -> data = buf_in ;
744- rx_audio_block -> data_size = BLK_STEREO_SIZE_OCTETS ;
729+ rx_audio_block = net_buf_alloc (& pool_i2s_rx , K_NO_WAIT );
730+ if (rx_audio_block == NULL ) {
731+ ERR_CHK_MSG (- ENOMEM , "Out of RX buffers for I2S" );
732+ }
733+
734+ /* Store RX buffer in net_buf */
735+ net_buf_add_mem (rx_audio_block , rx_buf_released , BLK_STEREO_SIZE_OCTETS );
736+
737+ struct audio_metadata * meta = net_buf_user_data (rx_audio_block );
745738
746739 /* Add meta data */
747- rx_audio_block -> meta .data_coding = PCM ;
748- rx_audio_block -> meta .data_len_us = 1000 ;
749- rx_audio_block -> meta .sample_rate_hz = CONFIG_AUDIO_SAMPLE_RATE_HZ ;
750- rx_audio_block -> meta .bits_per_sample = CONFIG_AUDIO_BIT_DEPTH_BITS ;
751- rx_audio_block -> meta .carried_bits_per_sample = CONFIG_AUDIO_BIT_DEPTH_BITS ;
752- rx_audio_block -> meta .locations =
753- BT_AUDIO_LOCATION_FRONT_LEFT | BT_AUDIO_LOCATION_FRONT_RIGHT ;
754- rx_audio_block -> meta .bad_data = false;
755-
756- ret = data_fifo_block_lock (ctrl_blk .in .fifo , (void * )& rx_audio_block ,
757- sizeof (struct audio_data ));
758- ERR_CHK_MSG (ret , "Unable to lock block RX" );
740+ meta -> data_coding = PCM ;
741+ meta -> data_len_us = 1000 ;
742+ meta -> sample_rate_hz = CONFIG_AUDIO_SAMPLE_RATE_HZ ;
743+ meta -> bits_per_sample = CONFIG_AUDIO_BIT_DEPTH_BITS ;
744+ meta -> carried_bits_per_sample = CONFIG_AUDIO_BIT_DEPTH_BITS ;
745+ meta -> locations = BT_AUDIO_LOCATION_FRONT_LEFT | BT_AUDIO_LOCATION_FRONT_RIGHT ;
746+ meta -> bad_data = false;
747+
748+ ret = k_msgq_put (ctrl_blk .in .audio_q , (void * )& rx_audio_block , K_NO_WAIT );
749+ ERR_CHK_MSG (ret , "Unable to put RX audio block into queue" );
759750 }
760751
761752 /*** Data exchange ***/
@@ -907,32 +898,29 @@ void audio_datapath_pres_delay_us_get(uint32_t *delay_us)
907898 * delay_us = ctrl_blk .pres_comp .pres_delay_us ;
908899}
909900
910- void audio_datapath_stream_out (struct audio_data * audio_frame )
901+ void audio_datapath_stream_out (struct net_buf * audio_frame )
911902{
912903 if (!ctrl_blk .stream_started ) {
913904 LOG_WRN ("Stream not started" );
914905 return ;
915906 }
916907
917- /*** Check incoming data ***/
918- struct net_buf * audio_buf = audio_frame -> data ;
919-
920- if (!audio_buf -> data ) {
908+ if (audio_frame == NULL ) {
921909 LOG_ERR ("Buffer pointer is NULL" );
922910 }
923911
924- if (audio_frame -> meta .reference_ts_us == ctrl_blk .prev_pres_sdu_ref_us &&
925- audio_frame -> meta .reference_ts_us != 0 ) {
926- LOG_WRN ("Duplicate sdu_ref_us (%d) - Dropping audio frame" ,
927- audio_frame -> meta .reference_ts_us );
912+ /*** Check incoming data ***/
913+ struct audio_metadata * meta = net_buf_user_data (audio_frame );
914+
915+ if (meta -> reference_ts_us == ctrl_blk .prev_pres_sdu_ref_us && meta -> reference_ts_us != 0 ) {
916+ LOG_WRN ("Duplicate sdu_ref_us (%d) - Dropping audio frame" , meta -> reference_ts_us );
928917 return ;
929918 }
930919
931920 bool sdu_ref_not_consecutive = false;
932921
933922 if (ctrl_blk .prev_pres_sdu_ref_us ) {
934- uint32_t sdu_ref_delta_us =
935- audio_frame -> meta .reference_ts_us - ctrl_blk .prev_pres_sdu_ref_us ;
923+ uint32_t sdu_ref_delta_us = meta -> reference_ts_us - ctrl_blk .prev_pres_sdu_ref_us ;
936924
937925 /* Check if the delta is from two consecutive frames */
938926 if (sdu_ref_delta_us <
@@ -946,8 +934,8 @@ void audio_datapath_stream_out(struct audio_data *audio_frame)
946934 sdu_ref_delta_us );
947935
948936 /* Estimate sdu_ref_us */
949- audio_frame -> meta . reference_ts_us = ctrl_blk .prev_pres_sdu_ref_us +
950- CONFIG_AUDIO_FRAME_DURATION_US ;
937+ meta -> reference_ts_us = ctrl_blk .prev_pres_sdu_ref_us +
938+ CONFIG_AUDIO_FRAME_DURATION_US ;
951939 }
952940 } else {
953941 LOG_INF ("sdu_ref_us not from consecutive frames (diff: %d us)" ,
@@ -956,12 +944,11 @@ void audio_datapath_stream_out(struct audio_data *audio_frame)
956944 }
957945 }
958946
959- ctrl_blk .prev_pres_sdu_ref_us = audio_frame -> meta . reference_ts_us ;
947+ ctrl_blk .prev_pres_sdu_ref_us = meta -> reference_ts_us ;
960948
961949 /*** Presentation compensation ***/
962950 if (ctrl_blk .pres_comp .enabled ) {
963- audio_datapath_presentation_compensation (audio_frame -> meta .data_rx_ts_us ,
964- audio_frame -> meta .reference_ts_us ,
951+ audio_datapath_presentation_compensation (meta -> data_rx_ts_us , meta -> reference_ts_us ,
965952 sdu_ref_not_consecutive );
966953 }
967954
@@ -1012,26 +999,25 @@ void audio_datapath_stream_out(struct audio_data *audio_frame)
1012999 }
10131000
10141001 /* Record producer block start reference */
1015- ctrl_blk .out .prod_blk_ts [out_blk_idx ] =
1016- audio_frame -> meta .data_rx_ts_us + (i * BLK_PERIOD_US );
1002+ ctrl_blk .out .prod_blk_ts [out_blk_idx ] = meta -> data_rx_ts_us + (i * BLK_PERIOD_US );
10171003
10181004 out_blk_idx = NEXT_IDX (out_blk_idx );
10191005 }
10201006
10211007 ctrl_blk .out .prod_blk_idx = out_blk_idx ;
10221008}
10231009
1024- int audio_datapath_start (struct data_fifo * fifo_rx )
1010+ int audio_datapath_start (struct k_msgq * audio_q_rx )
10251011{
1026- __ASSERT_NO_MSG (fifo_rx != NULL );
1012+ __ASSERT_NO_MSG (audio_q_rx != NULL );
10271013
10281014 if (!ctrl_blk .datapath_initialized ) {
10291015 LOG_WRN ("Audio datapath not initialized" );
10301016 return - ECANCELED ;
10311017 }
10321018
10331019 if (!ctrl_blk .stream_started ) {
1034- ctrl_blk .in .fifo = fifo_rx ;
1020+ ctrl_blk .in .audio_q = audio_q_rx ;
10351021
10361022 /* Clear counters and mute initial audio */
10371023 memset (& ctrl_blk .out , 0 , sizeof (ctrl_blk .out ));
0 commit comments