From: Andrei Emeltchenko <Andrei.Emeltchenko.news@gmail.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCHv6 11/11] android/audio: Add write to SCO
Date: Mon, 12 May 2014 11:57:09 +0300 [thread overview]
Message-ID: <1399885029-6358-11-git-send-email-Andrei.Emeltchenko.news@gmail.com> (raw)
In-Reply-To: <1399885029-6358-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
For synchronization interleave read() and write().
---
android/hal-sco.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 74 insertions(+)
diff --git a/android/hal-sco.c b/android/hal-sco.c
index b244333..97f0808 100644
--- a/android/hal-sco.c
+++ b/android/hal-sco.c
@@ -41,6 +41,8 @@
#define OUT_BUFFER_SIZE 2560
#define OUT_STREAM_FRAMES 2560
+#define SOCKET_POLL_TIMEOUT_MS 500
+
static int listen_sk = -1;
static int audio_sk = -1;
@@ -275,6 +277,75 @@ static void downmix_to_mono(struct sco_stream_out *out, const uint8_t *buffer,
}
}
+static bool write_data(struct sco_stream_out *out, const uint8_t *buffer,
+ size_t bytes)
+{
+ struct pollfd pfd;
+ size_t len, written = 0;
+ int ret;
+ uint16_t mtu = /* out->cfg.mtu */ 48;
+ uint8_t read_buf[mtu];
+ bool do_write = false;
+
+ pfd.fd = out->fd;
+ pfd.events = POLLOUT | POLLIN | POLLHUP | POLLNVAL;
+
+ while (bytes > written) {
+
+ /* poll for sending */
+ if (poll(&pfd, 1, SOCKET_POLL_TIMEOUT_MS) == 0) {
+ DBG("timeout fd %d", out->fd);
+ return false;
+ }
+
+ if (pfd.revents & (POLLHUP | POLLNVAL)) {
+ error("error fd %d, events 0x%x", out->fd, pfd.revents);
+ return false;
+ }
+
+ /* FIXME synchronize by time instead of read() */
+ if (pfd.revents & POLLIN) {
+ ret = read(out->fd, read_buf, mtu);
+ if (ret < 0) {
+ error("Error reading fd %d (%s)", out->fd,
+ strerror(errno));
+ return false;
+ }
+
+ do_write = true;
+ }
+
+ if (!do_write)
+ continue;
+
+ len = bytes - written > mtu ? mtu : bytes - written;
+
+ ret = write(out->fd, buffer + written, len);
+ if (ret > 0) {
+ written += ret;
+ do_write = false;
+ continue;
+ }
+
+ if (errno == EAGAIN) {
+ ret = errno;
+ warn("write failed (%d)", ret);
+ continue;
+ }
+
+ if (errno != EINTR) {
+ ret = errno;
+ error("write failed (%d) fd %d bytes %zd", ret, out->fd,
+ bytes);
+ return false;
+ }
+ }
+
+ DBG("written %zd bytes", bytes);
+
+ return true;
+}
+
static ssize_t out_write(struct audio_stream_out *stream, const void *buffer,
size_t bytes)
{
@@ -320,6 +391,9 @@ static ssize_t out_write(struct audio_stream_out *stream, const void *buffer,
DBG("total %zd", total);
+ if (!write_data(out, send_buf, total))
+ return -1;
+
return bytes;
}
--
1.8.3.2
next prev parent reply other threads:[~2014-05-12 8:57 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-12 8:56 [PATCHv6 01/11] android/hal-audio-hsp: Add open_output_stream() Andrei Emeltchenko
2014-05-12 8:57 ` [PATCHv6 02/11] android/audio: Add Audio SCO message API Andrei Emeltchenko
2014-05-12 8:57 ` [PATCHv6 03/11] android/handsfree: Add SCO Audio IPC Andrei Emeltchenko
2014-05-12 8:57 ` [PATCHv6 04/11] android/hal-sco: Implement Audio IPC on Audio HAL Andrei Emeltchenko
2014-05-12 8:57 ` [PATCHv6 05/11] android/ipc: Use error printing error messages Andrei Emeltchenko
2014-05-12 8:57 ` [PATCHv6 06/11] android/haltest: Add testinng for audio SCO HAL Andrei Emeltchenko
2014-05-12 8:57 ` [PATCHv6 07/11] android/audio: Add resampler support Andrei Emeltchenko
2014-05-13 1:29 ` Marcel Holtmann
2014-05-13 10:55 ` Andrei Emeltchenko
2014-05-12 8:57 ` [PATCHv6 08/11] audio/haltest: Make audio_stream static Andrei Emeltchenko
2014-05-12 8:57 ` [PATCHv6 09/11] android/audio: Add downmix support to audio SCO HAL Andrei Emeltchenko
2014-05-12 8:57 ` [PATCHv6 10/11] android/audio: Use resampler interface to resample SCO Andrei Emeltchenko
2014-05-12 8:57 ` Andrei Emeltchenko [this message]
2014-05-13 11:22 ` [PATCHv6 01/11] android/hal-audio-hsp: Add open_output_stream() Luiz Augusto von Dentz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1399885029-6358-11-git-send-email-Andrei.Emeltchenko.news@gmail.com \
--to=andrei.emeltchenko.news@gmail.com \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).