diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2007-08-15 10:36:16 +0000 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2007-08-15 10:36:16 +0000 |
commit | f802c1c270aadd8e6c019cce1ee6a89f5c784a65 (patch) | |
tree | 3be798d830e2f7cd239cc3eddcbe2b71965e66f6 /audio/pcm_bluetooth.c | |
parent | b1cd269c68b76018c2aabd550d37b3b7348e5cd6 (diff) |
Improve avdtp_write error handling
Diffstat (limited to 'audio/pcm_bluetooth.c')
-rw-r--r-- | audio/pcm_bluetooth.c | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/audio/pcm_bluetooth.c b/audio/pcm_bluetooth.c index 7977c1a6..c75f8af3 100644 --- a/audio/pcm_bluetooth.c +++ b/audio/pcm_bluetooth.c @@ -366,8 +366,7 @@ static snd_pcm_sframes_t bluetooth_a2dp_read(snd_pcm_ioplug_t *io, static int avdtp_write(struct bluetooth_data *data, unsigned int nonblock) { - int count = 0; - int written; + int count = 0, written = 0, ret = 0; struct rtp_header *header; struct rtp_payload *payload; struct bluetooth_a2dp *a2dp = &data->a2dp; @@ -394,8 +393,18 @@ static int avdtp_write(struct bluetooth_data *data, unsigned int nonblock) #ifdef ENABLE_DEBUG gettimeofday(&send_date, NULL); #endif - written = send(data->stream_fd, a2dp->buffer, a2dp->count, + ret = send(data->stream_fd, a2dp->buffer, a2dp->count, nonblock ? MSG_DONTWAIT : 0); + if (ret < 0) { + ret = -errno; + if (errno == EAGAIN) + goto retry; + fprintf(stderr, "send: %s (%d)\n", strerror(errno), + errno); + goto done; + } + + written += ret; #ifdef ENABLE_DEBUG if ((written >= 0 || errno == EAGAIN) && prev_date.tv_sec != 0) { @@ -427,6 +436,7 @@ static int avdtp_write(struct bluetooth_data *data, unsigned int nonblock) a2dp->count -= written; +retry: DBG("send (retry)."); usleep(150000); } @@ -435,9 +445,9 @@ static int avdtp_write(struct bluetooth_data *data, unsigned int nonblock) prev_date = send_date; #endif - /* Send our data */ if (written != a2dp->count) printf("Wrote %d not %d bytes\n", written, a2dp->count); + #ifdef ENABLE_DEBUG else { /* Measure bandwith usage */ @@ -460,13 +470,18 @@ static int avdtp_write(struct bluetooth_data *data, unsigned int nonblock) a2dp->bandwithcount += written; #endif + +done: /* Reset buffer of data to send */ a2dp->count = sizeof(struct rtp_header) + sizeof(struct rtp_payload); a2dp->frame_count = 0; a2dp->samples = 0; a2dp->seq_num++; - return written; + if (written > 0) + return written; + + return ret; } static snd_pcm_sframes_t bluetooth_a2dp_write(snd_pcm_ioplug_t *io, @@ -532,8 +547,14 @@ static snd_pcm_sframes_t bluetooth_a2dp_write(snd_pcm_ioplug_t *io, DBG("encoded = %d a2dp.sbc.len= %d", encoded, a2dp->sbc.len); - if (a2dp->count + a2dp->sbc.len >= data->cfg.pkt_len) - avdtp_write(data, io->nonblock); + if (a2dp->count + a2dp->sbc.len >= data->cfg.pkt_len) { + ret = avdtp_write(data, io->nonblock); + if (ret < 0) { + if (-ret == EPIPE) + ret = -EIO; + goto done; + } + } memcpy(a2dp->buffer + a2dp->count, a2dp->sbc.data, a2dp->sbc.len); a2dp->count += a2dp->sbc.len; |