diff options
Diffstat (limited to 'src/pulse.c')
| -rw-r--r-- | src/pulse.c | 25 | 
1 files changed, 23 insertions, 2 deletions
| diff --git a/src/pulse.c b/src/pulse.c index 3cd4b2a..c959719 100644 --- a/src/pulse.c +++ b/src/pulse.c @@ -770,6 +770,8 @@ int driver_play(ca_context *c, uint32_t id, ca_proplist *proplist, ca_finish_cal          /* Ok, this sample has an event id, let's try to play it from the cache */          for (;;) { +            ca_bool_t canceled; +              pa_threaded_mainloop_lock(p->mainloop);              /* Let's try to play the sample */ @@ -779,16 +781,35 @@ int driver_play(ca_context *c, uint32_t id, ca_proplist *proplist, ca_finish_cal                  goto finish;              } -            while (pa_operation_get_state(o) != PA_OPERATION_DONE) +            for (;;) { +                pa_operation_state_t state = pa_operation_get_state(o); + +                if (state == PA_OPERATION_DONE) { +                    canceled = FALSE; +                    break; +                } else if (state == PA_OPERATION_CANCELED) { +                    canceled = TRUE; +                    break; +                } +                  pa_threaded_mainloop_wait(p->mainloop); +            }              pa_operation_unref(o);              pa_threaded_mainloop_unlock(p->mainloop); +            /* The operation might have been canceled due to connection termination */ +            if (canceled) { +                ret = CA_ERROR_DISCONNECTED; +                goto finish; +            } +              /* Did we manage to play the sample or did some other error occur? */ -            if (out->error != CA_ERROR_NOTFOUND) +            if (out->error != CA_ERROR_NOTFOUND) { +                ret = out->error;                  goto finish; +            }              /* Hmm, we need to play it directly */              if (cache_control != CA_CACHE_CONTROL_PERMANENT) | 
