3333 VSND_FEATURES_1 ,
3434};
3535
36+ /* supported control messages */
3637enum {
3738 /* jack control requests types */
3839 VIRTIO_SND_R_JACK_INFO = 1 ,
@@ -65,38 +66,30 @@ enum {
6566
6667/* supported PCM frame rates */
6768enum {
68- VIRTIO_SND_PCM_RATE_5512 = 0 , /* 5512 Hz */
69- VIRTIO_SND_PCM_RATE_8000 , /* 8000 Hz */
70- VIRTIO_SND_PCM_RATE_11025 , /* 11025 Hz */
71- VIRTIO_SND_PCM_RATE_16000 , /* 16000 Hz */
72- VIRTIO_SND_PCM_RATE_22050 , /* 22050 Hz */
73- VIRTIO_SND_PCM_RATE_32000 , /* 32000 Hz */
74- VIRTIO_SND_PCM_RATE_44100 , /* 44100 Hz */
75- VIRTIO_SND_PCM_RATE_48000 , /* 48000 Hz */
76- VIRTIO_SND_PCM_RATE_64000 , /* 64000 Hz */
77- VIRTIO_SND_PCM_RATE_88200 , /* 88200 Hz */
78- VIRTIO_SND_PCM_RATE_96000 , /* 96000 Hz */
79- VIRTIO_SND_PCM_RATE_176400 , /* 176400 Hz */
80- VIRTIO_SND_PCM_RATE_192000 , /* 192000 Hz */
81- VIRTIO_SND_PCM_RATE_384000 , /* 384000 Hz */
69+ #define _(rate) VIRTIO_SND_PCM_RATE_##rate
70+ _ (5512 ) = 0 , /* 5512 Hz */
71+ _ (8000 ), /* 8000 Hz */
72+ _ (11025 ), /* 11025 Hz */
73+ _ (16000 ), /* 16000 Hz */
74+ _ (22050 ), /* 22050 Hz */
75+ _ (32000 ), /* 32000 Hz */
76+ _ (44100 ), /* 44100 Hz */
77+ _ (48000 ), /* 48000 Hz */
78+ _ (64000 ), /* 64000 Hz */
79+ _ (88200 ), /* 88200 Hz */
80+ _ (96000 ), /* 96000 Hz */
81+ _ (176400 ), /* 176400 Hz */
82+ _ (192000 ), /* 192000 Hz */
83+ _ (384000 ), /* 384000 Hz */
84+ #undef _
8285};
8386
8487/* supported PCM frames rates mapping */
8588int pcm_rate_tbl [] = {
86- [VIRTIO_SND_PCM_RATE_5512 ] = 5512 ,
87- [VIRTIO_SND_PCM_RATE_8000 ] = 8000 ,
88- [VIRTIO_SND_PCM_RATE_11025 ] = 11025 ,
89- [VIRTIO_SND_PCM_RATE_16000 ] = 16000 ,
90- [VIRTIO_SND_PCM_RATE_22050 ] = 22050 ,
91- [VIRTIO_SND_PCM_RATE_32000 ] = 32000 ,
92- [VIRTIO_SND_PCM_RATE_44100 ] = 44100 ,
93- [VIRTIO_SND_PCM_RATE_48000 ] = 48000 ,
94- [VIRTIO_SND_PCM_RATE_64000 ] = 64000 ,
95- [VIRTIO_SND_PCM_RATE_88200 ] = 88200 ,
96- [VIRTIO_SND_PCM_RATE_96000 ] = 96000 ,
97- [VIRTIO_SND_PCM_RATE_176400 ] = 176400 ,
98- [VIRTIO_SND_PCM_RATE_192000 ] = 192000 ,
99- [VIRTIO_SND_PCM_RATE_384000 ] = 384000 ,
89+ #define _ (rate ) [VIRTIO_SND_PCM_RATE_ ##rate ] = rate
90+ _ (5512 ), _ (8000 ), _ (11025 ), _ (16000 ), _ (22050 ), _ (32000 ), _ (44100 ),
91+ _ (48000 ), _ (64000 ), _ (88200 ), _ (96000 ), _ (176400 ), _ (192000 ), _ (384000 ),
92+ #undef _
10093};
10194
10295/* supported PCM stream features */
@@ -106,74 +99,78 @@ enum {
10699
107100/* supported PCM sample formats */
108101enum {
109- /* analog formats (width / physical width) */
110- VIRTIO_SND_PCM_FMT_IMA_ADPCM = 0 , /* 4 / 4 bits */
111- VIRTIO_SND_PCM_FMT_MU_LAW , /* 8 / 8 bits */
112- VIRTIO_SND_PCM_FMT_A_LAW , /* 8 / 8 bits */
113- VIRTIO_SND_PCM_FMT_S8 , /* 8 / 8 bits */
114- VIRTIO_SND_PCM_FMT_U8 , /* 8 / 8 bits */
115- VIRTIO_SND_PCM_FMT_S16 , /* 16 / 16 bits */
116- VIRTIO_SND_PCM_FMT_U16 , /* 16 / 16 bits */
117- VIRTIO_SND_PCM_FMT_S18_3 , /* 18 / 24 bits */
118- VIRTIO_SND_PCM_FMT_U18_3 , /* 18 / 24 bits */
119- VIRTIO_SND_PCM_FMT_S20_3 , /* 20 / 24 bits */
120- VIRTIO_SND_PCM_FMT_U20_3 , /* 20 / 24 bits */
121- VIRTIO_SND_PCM_FMT_S24_3 , /* 24 / 24 bits */
122- VIRTIO_SND_PCM_FMT_U24_3 , /* 24 / 24 bits */
123- VIRTIO_SND_PCM_FMT_S20 , /* 20 / 32 bits */
124- VIRTIO_SND_PCM_FMT_U20 , /* 20 / 32 bits */
125- VIRTIO_SND_PCM_FMT_S24 , /* 24 / 32 bits */
126- VIRTIO_SND_PCM_FMT_U24 , /* 24 / 32 bits */
127- VIRTIO_SND_PCM_FMT_S32 , /* 32 / 32 bits */
128- VIRTIO_SND_PCM_FMT_U32 , /* 32 / 32 bits */
129- VIRTIO_SND_PCM_FMT_FLOAT , /* 32 / 32 bits */
130- VIRTIO_SND_PCM_FMT_FLOAT64 , /* 64 / 64 bits */
102+ /* analog formats (width / physical width) */
103+ #define _(samp_fmt) VIRTIO_SND_PCM_FMT_##samp_fmt
104+ _ (IMA_ADPCM ) = 0 , /* 4 / 4 bits */
105+ _ (MU_LAW ), /* 8 / 8 bits */
106+ _ (A_LAW ), /* 8 / 8 bits */
107+ _ (S8 ), /* 8 / 8 bits */
108+ _ (U8 ), /* 8 / 8 bits */
109+ _ (S16 ), /* 16 / 16 bits */
110+ _ (U16 ), /* 16 / 16 bits */
111+ _ (S18_3 ), /* 18 / 24 bits */
112+ _ (U18_3 ), /* 18 / 24 bits */
113+ _ (S20_3 ), /* 20 / 24 bits */
114+ _ (U20_3 ), /* 20 / 24 bits */
115+ _ (S24_3 ), /* 24 / 24 bits */
116+ _ (U24_3 ), /* 24 / 24 bits */
117+ _ (S20 ), /* 20 / 32 bits */
118+ _ (U20 ), /* 20 / 32 bits */
119+ _ (S24 ), /* 24 / 32 bits */
120+ _ (U24 ), /* 24 / 32 bits */
121+ _ (S32 ), /* 32 / 32 bits */
122+ _ (U32 ), /* 32 / 32 bits */
123+ _ (FLOAT ), /* 32 / 32 bits */
124+ _ (FLOAT64 ), /* 64 / 64 bits */
131125 /* digital formats (width / physical width) */
132- VIRTIO_SND_PCM_FMT_DSD_U8 , /* 8 / 8 bits */
133- VIRTIO_SND_PCM_FMT_DSD_U16 , /* 16 / 16 bits */
134- VIRTIO_SND_PCM_FMT_DSD_U32 , /* 32 / 32 bits */
135- VIRTIO_SND_PCM_FMT_IEC958_SUBFRAME , /* 32 / 32 bits */
126+ _ (DSD_U8 ), /* 8 / 8 bits */
127+ _ (DSD_U16 ), /* 16 / 16 bits */
128+ _ (DSD_U32 ), /* 32 / 32 bits */
129+ _ (IEC958_SUBFRAME ), /* 32 / 32 bits */
130+ #undef _
136131};
137132
138133/* standard channel position definition */
139134enum {
140- VIRTIO_SND_CHMAP_NONE = 0 , /* undefined */
141- VIRTIO_SND_CHMAP_NA , /* silent */
142- VIRTIO_SND_CHMAP_MONO , /* mono stream */
143- VIRTIO_SND_CHMAP_FL , /* front left */
144- VIRTIO_SND_CHMAP_FR , /* front right */
145- VIRTIO_SND_CHMAP_RL , /* rear left */
146- VIRTIO_SND_CHMAP_RR , /* rear right */
147- VIRTIO_SND_CHMAP_FC , /* front center */
148- VIRTIO_SND_CHMAP_LFE , /* low frequency (LFE) */
149- VIRTIO_SND_CHMAP_SL , /* side left */
150- VIRTIO_SND_CHMAP_SR , /* side right */
151- VIRTIO_SND_CHMAP_RC , /* rear center */
152- VIRTIO_SND_CHMAP_FLC , /* front left center */
153- VIRTIO_SND_CHMAP_FRC , /* front right center */
154- VIRTIO_SND_CHMAP_RLC , /* rear left center */
155- VIRTIO_SND_CHMAP_RRC , /* rear right center */
156- VIRTIO_SND_CHMAP_FLW , /* front left wide */
157- VIRTIO_SND_CHMAP_FRW , /* front right wide */
158- VIRTIO_SND_CHMAP_FLH , /* front left high */
159- VIRTIO_SND_CHMAP_FCH , /* front center high */
160- VIRTIO_SND_CHMAP_FRH , /* front right high */
161- VIRTIO_SND_CHMAP_TC , /* top center */
162- VIRTIO_SND_CHMAP_TFL , /* top front left */
163- VIRTIO_SND_CHMAP_TFR , /* top front right */
164- VIRTIO_SND_CHMAP_TFC , /* top front center */
165- VIRTIO_SND_CHMAP_TRL , /* top rear left */
166- VIRTIO_SND_CHMAP_TRR , /* top rear right */
167- VIRTIO_SND_CHMAP_TRC , /* top rear center */
168- VIRTIO_SND_CHMAP_TFLC , /* top front left center */
169- VIRTIO_SND_CHMAP_TFRC , /* top front right center */
170- VIRTIO_SND_CHMAP_TSL , /* top side left */
171- VIRTIO_SND_CHMAP_TSR , /* top side right */
172- VIRTIO_SND_CHMAP_LLFE , /* left LFE */
173- VIRTIO_SND_CHMAP_RLFE , /* right LFE */
174- VIRTIO_SND_CHMAP_BC , /* bottom center */
175- VIRTIO_SND_CHMAP_BLC , /* bottom left center */
176- VIRTIO_SND_CHMAP_BRC , /* bottom right center */
135+ #define _(chmap_pos) VIRTIO_SND_CHMAP_##chmap_pos
136+ _ (NONE ) = 0 , /* undefined */
137+ _ (NA ), /* silent */
138+ _ (MONO ), /* mono stream */
139+ _ (FL ), /* front left */
140+ _ (FR ), /* front right */
141+ _ (RL ), /* rear left */
142+ _ (RR ), /* rear right */
143+ _ (FC ), /* front center */
144+ _ (LFE ), /* low frequency (LFE) */
145+ _ (SL ), /* side left */
146+ _ (SR ), /* side right */
147+ _ (RC ), /* rear center */
148+ _ (FLC ), /* front left center */
149+ _ (FRC ), /* front right center */
150+ _ (RLC ), /* rear left center */
151+ _ (RRC ), /* rear right center */
152+ _ (FLW ), /* front left wide */
153+ _ (FRW ), /* front right wide */
154+ _ (FLH ), /* front left high */
155+ _ (FCH ), /* front center high */
156+ _ (FRH ), /* front right high */
157+ _ (TC ), /* top center */
158+ _ (TFL ), /* top front left */
159+ _ (TFR ), /* top front right */
160+ _ (TFC ), /* top front center */
161+ _ (TRL ), /* top rear left */
162+ _ (TRR ), /* top rear right */
163+ _ (TRC ), /* top rear center */
164+ _ (TFLC ), /* top front left center */
165+ _ (TFRC ), /* top front right center */
166+ _ (TSL ), /* top side left */
167+ _ (TSR ), /* top side right */
168+ _ (LLFE ), /* left LFE */
169+ _ (RLFE ), /* right LFE */
170+ _ (BC ), /* bottom center */
171+ _ (BLC ), /* bottom left center */
172+ _ (BRC ), /* bottom right center */
173+ #undef _
177174};
178175
179176/* audio data flow direction */
@@ -265,7 +262,7 @@ typedef struct {
265262/* Adapted from DPDK ring buffer. */
266263/* https://github.com/scylladb/dpdk/blob/master/lib/librte_ring/rte_ring.h#L147
267264 */
268- #define VSND_RING_SZ_MASK (uint32_t)(0x0fffffff) /* ring size mask */
265+ #define VSND_RING_SZ_MASK 0x0FFFFFFFULL /* ring size mask */
269266typedef struct {
270267 void * buffer ;
271268 struct prod {
@@ -578,7 +575,7 @@ static void virtio_snd_read_pcm_release(const virtio_snd_pcm_hdr_t *query,
578575double omega = 0.0 ;
579576int totalframesp = 0 ;
580577int totalframesr = 0 ;
581- static void __virtio_snd_frame_dequeue (void * * out ,
578+ static void __virtio_snd_frame_dequeue (void * out ,
582579 uint32_t n ,
583580 uint32_t stream_id )
584581{
@@ -605,10 +602,10 @@ static void __virtio_snd_frame_dequeue(void **out,
605602 uint32_t size = props -> pp .buffer_bytes ;
606603 uint32_t idx = cons_head & mask ;
607604 if (idx + n < size ) {
608- memcpy (* out , props -> ring .buffer + idx , n );
605+ memcpy (out , props -> ring .buffer + idx , n );
609606 } else {
610- memcpy (* out , props -> ring .buffer + idx , size - idx );
611- memcpy (* out + (size - idx ), props -> ring .buffer , n - (size - idx ));
607+ memcpy (out , props -> ring .buffer + idx , size - idx );
608+ memcpy (out + (size - idx ), props -> ring .buffer , n - (size - idx ));
612609 }
613610 asm("" ::: "memory" );
614611
@@ -635,18 +632,18 @@ static void virtio_snd_cb(struct CNFADriver *dev,
635632 totalframesr += framesr ;
636633 totalframesp += framesp ;
637634
638- fprintf (stderr , "start to play\n" );
639635 int channels = dev -> channelsPlay ;
640636 uint32_t id = v_ptr -> stream_id ;
641637 uint32_t out_buf_sz = framesp * channels ;
638+ fprintf (stderr , "start to play with out_buf_sz %" PRIu32 "\n" , out_buf_sz );
642639
643640 /*if (!(playing)) {
644641 memset(out, 0, sizeof(short) * out_buf_sz);
645642 return;
646643 }*/
647644
648645 /* TODO: add single consumer */
649- __virtio_snd_frame_dequeue (( void * * ) & out , out_buf_sz , id );
646+ __virtio_snd_frame_dequeue (out , out_buf_sz , id );
650647#if 0
651648 for (int i = 0 ; i < framesp ; i ++ ) {
652649 // Shift phase, so we run at 440 Hz (A4)
@@ -772,9 +769,9 @@ static void __virtio_snd_frame_enqueue(void *payload,
772769 * prod_head > cons_tail). So 'free_entries' is always between 0
773770 * and size(ring)-1. */
774771 free_entries = mask + cons_tail - prod_head ;
775- fprintf (stderr ,
772+ /* fprintf(stderr,
776773 "mask %" PRIu32 " cons_tail %" PRIu32 " prod_head %" PRIu32 "\n",
777- mask , cons_tail , prod_head );
774+ mask, cons_tail, prod_head);*/
778775
779776 /* Move prod_head. */
780777 if (n > free_entries )
0 commit comments