This adds a return value to buffer_submit_data() so that ogg123 knows when the buffer has shut down due to an error. Without this it doesn't hang, but it continues to decode the input even though there's no place to write it to. Index: ogg123/buffer.c =================================================================== --- ogg123.orig/buffer.c 2008-05-01 19:32:16.000000000 -0700 +++ ogg123/buffer.c 2008-05-01 19:32:34.000000000 -0700 @@ -283,7 +283,7 @@ } -void submit_data_chunk (buf_t *buf, char *data, size_t size) +int submit_data_chunk (buf_t *buf, char *data, size_t size) { long buf_write_pos; /* offset of first available write location */ size_t write_size; @@ -346,6 +346,7 @@ pthread_cleanup_pop(0); DEBUG("Exit submit_data_chunk"); + return !buf->abort_write; } @@ -520,8 +521,8 @@ /* --- Data buffering functions --- */ -void buffer_submit_data (buf_t *buf, char *data, long nbytes) { - submit_data_chunk (buf, data, nbytes); +int buffer_submit_data (buf_t *buf, char *data, long nbytes) { + return submit_data_chunk (buf, data, nbytes); } size_t buffer_get_data (buf_t *buf, char *data, long nbytes) Index: ogg123/buffer.h =================================================================== --- ogg123.orig/buffer.h 2008-05-01 19:30:59.000000000 -0700 +++ ogg123/buffer.h 2008-05-01 19:32:34.000000000 -0700 @@ -110,7 +110,7 @@ void buffer_thread_kill (buf_t *buf); /* --- Data buffering functions --- */ -void buffer_submit_data (buf_t *buf, char *data, long nbytes); +int buffer_submit_data (buf_t *buf, char *data, long nbytes); size_t buffer_get_data (buf_t *buf, char *data, long nbytes); void buffer_mark_eos (buf_t *buf); Index: ogg123/http_transport.c =================================================================== --- ogg123.orig/http_transport.c 2008-05-01 19:30:59.000000000 -0700 +++ ogg123/http_transport.c 2008-05-01 19:32:34.000000000 -0700 @@ -68,7 +68,8 @@ if (myarg->cancel_flag || sig_request.cancel) return 0; - buffer_submit_data(myarg->buf, ptr, size*nmemb); + if (!buffer_submit_data(myarg->buf, ptr, size*nmemb)) + return 0; if (myarg->cancel_flag || sig_request.cancel) return 0; Index: ogg123/ogg123.c =================================================================== --- ogg123.orig/ogg123.c 2008-05-01 19:30:59.000000000 -0700 +++ ogg123/ogg123.c 2008-05-01 19:35:12.000000000 -0700 @@ -702,9 +702,13 @@ do { if (nthc-- == 0) { - if (audio_buffer) - buffer_submit_data(audio_buffer, convbuffer, ret); - else + if (audio_buffer) { + if (!buffer_submit_data(audio_buffer, convbuffer, ret)) { + status_error(_("Error: buffer write failed.\n")); + eof = eos = 1; + break; + } + } else audio_play_callback(convbuffer, ret, eos, &audio_play_arg); nthc = options.nth - 1;