@@ -518,7 +518,7 @@ static void virtio_snd_read_pcm_prepare(const virtio_snd_pcm_hdr_t *query,
518518 * the length of frame). */
519519 /* CNFA only accept frame with signed 16-bit data in little-endian. */
520520 props -> audio_host =
521- CNFAInit (NULL , "semu-virtio-snd" , virtio_snd_cb , rate , 0 , channels , 0 ,
521+ CNFAInit ("ALSA" , "semu-virtio-snd" , virtio_snd_cb , rate , 0 , channels , 0 ,
522522 cnfa_period_frames , NULL , NULL , & props -> v );
523523 pthread_mutex_init (& props -> lock .lock , NULL );
524524 pthread_cond_init (& props -> lock .readable , NULL );
@@ -535,6 +535,7 @@ static void virtio_snd_read_pcm_prepare(const virtio_snd_pcm_hdr_t *query,
535535static void virtio_snd_read_pcm_start (const virtio_snd_pcm_hdr_t * query ,
536536 uint32_t * plen )
537537{
538+ fprintf (stderr , "pcm_start start\n" );
538539 const virtio_snd_pcm_hdr_t * request = query ;
539540 uint32_t stream_id = request -> stream_id ;
540541 uint32_t code = vsnd_props [stream_id ].pp .hdr .hdr .code ;
@@ -554,11 +555,13 @@ static void virtio_snd_read_pcm_start(const virtio_snd_pcm_hdr_t *query,
554555 pthread_cond_signal (& props -> v .ctrl_cond );
555556
556557 * plen = 0 ;
558+ fprintf (stderr , "pcm_start stop\n" );
557559}
558560
559561static void virtio_snd_read_pcm_stop (const virtio_snd_pcm_hdr_t * query ,
560562 uint32_t * plen )
561563{
564+ fprintf (stderr , "pcm_stop start\n" );
562565 const virtio_snd_pcm_hdr_t * request = query ;
563566 uint32_t stream_id = request -> stream_id ;
564567 uint32_t code = vsnd_props [stream_id ].pp .hdr .hdr .code ;
@@ -577,11 +580,13 @@ static void virtio_snd_read_pcm_stop(const virtio_snd_pcm_hdr_t *query,
577580 pthread_cond_signal (& props -> v .ctrl_cond );
578581
579582 * plen = 0 ;
583+ fprintf (stderr , "pcm_stop stop\n" );
580584}
581585
582586static void virtio_snd_read_pcm_release (const virtio_snd_pcm_hdr_t * query ,
583587 uint32_t * plen )
584588{
589+ fprintf (stderr , "pcm_release start\n" );
585590 const virtio_snd_pcm_hdr_t * request = query ;
586591 uint32_t stream_id = request -> stream_id ;
587592 virtio_snd_prop_t * props = & vsnd_props [stream_id ];
@@ -597,12 +602,21 @@ static void virtio_snd_read_pcm_release(const virtio_snd_pcm_hdr_t *query,
597602 props -> pp .hdr .hdr .code = VIRTIO_SND_R_PCM_RELEASE ;
598603
599604 /* Tear down PCM buffer related locking attributes. */
605+ fprintf (stderr , "pcm_release tear down PCM buffer start\n" );
600606 free (props -> intermediate );
607+
608+ /* Explicitly unlock the CVs and mutex. */
609+ pthread_cond_broadcast (& props -> lock .readable );
610+ pthread_cond_broadcast (& props -> lock .writable );
611+ pthread_mutex_unlock (& props -> lock .lock );
612+
601613 pthread_mutex_destroy (& props -> lock .lock );
602614 pthread_cond_destroy (& props -> lock .readable );
603615 pthread_cond_destroy (& props -> lock .writable );
616+ fprintf (stderr , "pcm_release tear down PCM buffer stop\n" );
604617
605618 /* Tear down PCM buffer queue. */
619+ fprintf (stderr , "pcm_release tear down PCM buffer queue\n" );
606620 vsnd_buf_queue_node_t * tmp = NULL ;
607621 vsnd_buf_queue_node_t * node ;
608622 if (!list_empty (& props -> buf_queue_head )) {
@@ -612,13 +626,17 @@ static void virtio_snd_read_pcm_release(const virtio_snd_pcm_hdr_t *query,
612626 }
613627 }
614628
615- CNFAClose (props -> audio_host );
616-
617629 /* Tear down stream related locking attributes. */
630+ pthread_cond_broadcast (& props -> v .ctrl_cond );
631+ pthread_mutex_unlock (& props -> v .ctrl_mutex );
618632 pthread_mutex_destroy (& props -> v .ctrl_mutex );
619633 pthread_cond_destroy (& props -> v .ctrl_cond );
620634
635+ fprintf (stderr , "pcm_release tear down CNFA\n" );
636+ CNFAClose (props -> audio_host );
637+
621638 * plen = 0 ;
639+ fprintf (stderr , "pcm_release stop\n" );
622640}
623641
624642static void __virtio_snd_frame_dequeue (short * out ,
@@ -668,6 +686,7 @@ static void virtio_snd_cb(struct CNFADriver *dev,
668686
669687 pthread_mutex_lock (& v_ptr -> ctrl_mutex );
670688 while (v_ptr -> guest_playing == 0 ) {
689+ fprintf (stderr , "wait ctrl_cond\n" );
671690 memset (out , 0 , sizeof (* out ) * out_buf_sz );
672691 pthread_cond_wait (& v_ptr -> ctrl_cond , & v_ptr -> ctrl_mutex );
673692 }
0 commit comments