Index: polyp/pcm_polyp.c =================================================================== RCS file: /cvsroot/alsa/alsa-plugins/polyp/pcm_polyp.c,v retrieving revision 1.2 diff -u -r1.2 pcm_polyp.c --- polyp/pcm_polyp.c 22 Feb 2006 15:38:52 -0000 1.2 +++ polyp/pcm_polyp.c 7 Mar 2006 16:41:39 -0000 @@ -335,6 +335,8 @@ return err; if (pcm->stream) { + pa_stream_disconnect(pcm->stream); + polyp_wait_stream_state(pcm->p, pcm->stream, PA_STREAM_TERMINATED); pa_stream_unref(pcm->stream); pcm->stream = NULL; } @@ -356,18 +358,12 @@ else pa_stream_connect_record(pcm->stream, pcm->device, &pcm->buffer_attr, 0); - while (1) { - state = pa_stream_get_state(pcm->stream); - - if (state == PA_STREAM_FAILED) - goto error; - - if (state == PA_STREAM_READY) - break; - - err = pa_mainloop_iterate(pcm->p->mainloop, 1, NULL); - if (err < 0) - return -EIO; + err = polyp_wait_stream_state(pcm->p, pcm->stream, PA_STREAM_READY); + if (err < 0) { + fprintf(stderr, "*** POLYPAUDIO: Unable to create stream.\n"); + pa_stream_unref(pcm->stream); + pcm->stream = NULL; + return err; } pcm->last_size = 0; @@ -375,12 +371,6 @@ pcm->offset = 0; return 0; - -error: - fprintf(stderr, "*** POLYPAUDIO: Unable to create stream.\n"); - pa_stream_unref(pcm->stream); - pcm->stream = NULL; - return -EIO; } static int polyp_hw_params(snd_pcm_ioplug_t *io, snd_pcm_hw_params_t *params) @@ -437,8 +427,11 @@ assert(pcm); - if (pcm->stream) + if (pcm->stream) { + pa_stream_disconnect(pcm->stream); + polyp_wait_stream_state(pcm->p, pcm->stream, PA_STREAM_TERMINATED); pa_stream_unref(pcm->stream); + } if (pcm->p) polyp_free(pcm->p); Index: polyp/polyp.c =================================================================== RCS file: /cvsroot/alsa/alsa-plugins/polyp/polyp.c,v retrieving revision 1.2 diff -u -r1.2 polyp.c --- polyp/polyp.c 22 Feb 2006 15:38:52 -0000 1.2 +++ polyp/polyp.c 7 Mar 2006 16:41:39 -0000 @@ -182,6 +182,32 @@ return 0; } +int polyp_wait_stream_state(snd_polyp_t *p, pa_stream *stream, pa_stream_state_t target) +{ + int err; + pa_stream_state_t state; + + assert(p && stream && (p->state == POLYP_STATE_READY)); + + while (1) { + state = pa_stream_get_state(stream); + + if (state == PA_STREAM_FAILED) + return -EIO; + + if (state == target) + break; + + p->state = POLYP_STATE_POLLING; + err = pa_mainloop_iterate(p->mainloop, 1, NULL); + p->state = POLYP_STATE_READY; + if (err < 0) + return -EIO; + } + + return 0; +} + snd_polyp_t *polyp_new() { snd_polyp_t *p; Index: polyp/polyp.h =================================================================== RCS file: /cvsroot/alsa/alsa-plugins/polyp/polyp.h,v retrieving revision 1.1 diff -u -r1.1 polyp.h --- polyp/polyp.h 21 Feb 2006 16:14:00 -0000 1.1 +++ polyp/polyp.h 7 Mar 2006 16:41:39 -0000 @@ -48,6 +48,7 @@ int polyp_check_connection(snd_polyp_t *p); int polyp_wait_operation(snd_polyp_t *p, pa_operation *o); +int polyp_wait_stream_state(snd_polyp_t *p, pa_stream *stream, pa_stream_state_t target); snd_polyp_t *polyp_new(); void polyp_free(snd_polyp_t *p);