@@ -369,6 +369,9 @@ static pthread_cond_t virtio_snd_rx_cond = PTHREAD_COND_INITIALIZER;
369369static int tx_ev_notify ;
370370static int rx_ev_notify ;
371371
372+ // FIXME: set these variables into each capture stream;s structure
373+ static int rx_ev_start ;
374+
372375/* vsnd virtq callback type */
373376typedef int (* vsnd_virtq_cb )(virtio_snd_state_t * , /* vsnd state */
374377 const virtio_snd_queue_t * , /* vsnd queue */
@@ -599,7 +602,7 @@ VSND_GEN_TX_QUEUE_HANDLER(flush, 0);
599602 bad_msg_err ? VIRTIO_SND_S_IO_ERR : VIRTIO_SND_S_OK ; \
600603 response -> latency_bytes = 0 ; \
601604 * plen = sizeof (virtio_snd_pcm_status_t ) + ret_len ; \
602- fprintf (stderr , "*** rx get %" PRIu32 " bytes \n" , * plen ); \
605+ fprintf (stderr , "*** rx write %" PRIu32 " bytes \n" , * plen ); \
603606 goto early_continue ; \
604607 } \
605608 \
@@ -616,14 +619,15 @@ VSND_GEN_TX_QUEUE_HANDLER(flush, 0);
616619 early_continue : \
617620 idx ++ ; \
618621 } \
622+ fprintf (stderr , "||| finish iterating virtq list\n" ); \
619623 \
620624 if (bad_msg_err != 0 ) \
621625 goto finally ; \
622626 IIF (WRITE ) \
623627 (/* enque frames */ \
624628 virtio_snd_prop_t * props = & vsnd_props [stream_id ]; \
625629 props -> lock .buf_ev_notity ++ ; \
626- pthread_cond_signal (& props -> lock .readable );, /* flush queue */ \
630+ pthread_cond_signal (& props -> lock .writable );, /* flush queue */ \
627631 ) \
628632 \
629633 /* Tear down the descriptor list and free space. */ \
@@ -837,24 +841,30 @@ static void virtio_snd_read_pcm_prepare(const virtio_snd_pcm_hdr_t *query,
837841 };
838842 uint32_t dir = props -> p .direction ;
839843 PaError err = paNoError ;
840- if (dir == VIRTIO_SND_D_OUTPUT )
844+ if (dir == VIRTIO_SND_D_OUTPUT ) {
841845 err = Pa_OpenStream (& props -> pa_stream , NULL , /* no input */
842846 & params , rate , cnfa_period_frames , paClipOff ,
843847 virtio_snd_tx_stream_cb , & props -> v );
844- else if (dir == VIRTIO_SND_D_INPUT ) {
848+ if (err != paNoError )
849+ goto pa_err ;
850+ } else if (dir == VIRTIO_SND_D_INPUT ) {
845851 err = Pa_OpenStream (& props -> pa_stream , & params , NULL /* no output */ ,
846852 rate , cnfa_period_frames , paClipOff ,
847853 virtio_snd_rx_stream_cb , & props -> v );
848- }
849- if (err != paNoError ) {
850- fprintf (stderr , "Cannot create PortAudio\n" );
851- printf ("PortAudio error: %s\n" , Pa_GetErrorText (err ));
852- return ;
854+ if (err != paNoError )
855+ goto pa_err ;
856+ rx_ev_start = 0 ;
857+ //pthread_cond_signal(&props->lock.readable);
853858 }
854859
855860 * plen = 0 ;
856861
857862 fprintf (stderr , "=== pcm_prepare \n" );
863+ return ;
864+
865+ pa_err :
866+ fprintf (stderr , "Cannot create PortAudio\n" );
867+ printf ("PortAudio error: %s\n" , Pa_GetErrorText (err ));
858868}
859869
860870static void virtio_snd_read_pcm_start (const virtio_snd_pcm_hdr_t * query ,
@@ -880,6 +890,10 @@ static void virtio_snd_read_pcm_start(const virtio_snd_pcm_hdr_t *query,
880890 printf ("PortAudio error: %s\n" , Pa_GetErrorText (err ));
881891 return ;
882892 }
893+ if (props -> p .direction = VIRTIO_SND_D_INPUT ) {
894+ rx_ev_start = 1 ;
895+ //pthread_cond_signal(&props->lock.readable);
896+ }
883897
884898 * plen = 0 ;
885899
@@ -909,6 +923,10 @@ static void virtio_snd_read_pcm_stop(const virtio_snd_pcm_hdr_t *query,
909923 printf ("PortAudio error: %s\n" , Pa_GetErrorText (err ));
910924 return ;
911925 }
926+ if (props -> p .direction == VIRTIO_SND_D_INPUT ) {
927+ rx_ev_start = 0 ;
928+ //pthread_cond_signal(&props->lock.readable);
929+ }
912930
913931 * plen = 0 ;
914932
@@ -1017,9 +1035,11 @@ static void __virtio_snd_rx_frame_dequeue(void *out,
10171035 virtio_snd_prop_t * props = & vsnd_props [stream_id ];
10181036
10191037 pthread_mutex_lock (& props -> lock .lock );
1020- while (props -> lock .buf_ev_notity < 1 ) {
1021- fprintf (stderr , "((( RX deque buf_ev_notity %" PRIu32 "\n" , props -> lock .buf_ev_notity );
1022- pthread_cond_wait (& props -> lock .readable , & props -> lock .lock );
1038+ fprintf (stderr , "((( rx_frame_deque buf_ev_notity %d" " rx_ev_start %d\n" ,
1039+ props -> lock .buf_ev_notity ,
1040+ rx_ev_start );
1041+ while (props -> lock .buf_ev_notity < 1 && rx_ev_start != 1 ) {
1042+ pthread_cond_wait (& props -> lock .readable , & props -> lock .lock );
10231043 }
10241044
10251045 /* Get the PCM frames from queue */
@@ -1042,8 +1062,8 @@ static void __virtio_snd_rx_frame_dequeue(void *out,
10421062 list_del (& node -> q );
10431063 }
10441064
1045- props -> lock . buf_ev_notity -- ;
1046- pthread_cond_signal ( & props -> lock . writable );
1065+ fprintf ( stderr , "((( RX deque get %" PRIu32 " bytes \n" , written_bytes ) ;
1066+
10471067 pthread_mutex_unlock (& props -> lock .lock );
10481068
10491069 fprintf (stderr , "((( RX deque end\n" );
@@ -1226,8 +1246,8 @@ static void __virtio_snd_rx_frame_enqueue(void *payload,
12261246 virtio_snd_prop_t * props = & vsnd_props [stream_id ];
12271247
12281248 pthread_mutex_lock (& props -> lock .lock );
1249+ fprintf (stderr , ")) rx_frame enque buf_ev_notity %d" , props -> lock .buf_ev_notity );
12291250 while (props -> lock .buf_ev_notity > 0 ) {
1230- fprintf (stderr , "buf_ev_notity %d" , props -> lock .buf_ev_notity );
12311251 pthread_cond_wait (& props -> lock .writable , & props -> lock .lock );
12321252 }
12331253
@@ -1259,6 +1279,8 @@ static void __virtio_snd_rx_frame_enqueue(void *payload,
12591279 node -> pos = 0 ;
12601280 list_push (& node -> q , & props -> buf_queue_head );
12611281
1282+ props -> lock .buf_ev_notity -- ;
1283+ pthread_cond_signal (& props -> lock .readable );
12621284 pthread_mutex_unlock (& props -> lock .lock );
12631285 fprintf (stderr , "enque end\n" );
12641286 fprintf (stderr , "+++ virtio_snd_rx_enqueue"
@@ -1488,6 +1510,7 @@ static bool virtio_snd_reg_write(virtio_snd_state_t *vsnd,
14881510 case VSND_QUEUE_RX :
14891511 rx_ev_notify ++ ;
14901512 pthread_cond_signal (& virtio_snd_rx_cond );
1513+ fprintf (stderr , "))) hit RX queue\n" );
14911514 break ;
14921515 default :
14931516 fprintf (stderr , "value %d not supported\n" , value );
0 commit comments