Skip to content

Commit 607fbc9

Browse files
committed
[WIP] write frames to guest
1 parent 05b22f9 commit 607fbc9

File tree

1 file changed

+38
-15
lines changed

1 file changed

+38
-15
lines changed

virtio-snd.c

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,9 @@ static pthread_cond_t virtio_snd_rx_cond = PTHREAD_COND_INITIALIZER;
369369
static int tx_ev_notify;
370370
static 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 */
373376
typedef 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

860870
static 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

Comments
 (0)