[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 44/51] paaudio: get/put_buffer functions
From: |
Kővágó, Zoltán |
Subject: |
[Qemu-devel] [PATCH 44/51] paaudio: get/put_buffer functions |
Date: |
Thu, 14 Jan 2016 14:45:57 +0100 |
This lets us avoid some buffer copying when using mixeng.
Signed-off-by: Kővágó, Zoltán <address@hidden>
---
audio/paaudio.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 83 insertions(+)
diff --git a/audio/paaudio.c b/audio/paaudio.c
index b162c21..4b11f21 100644
--- a/audio/paaudio.c
+++ b/audio/paaudio.c
@@ -96,6 +96,59 @@ static inline int PA_STREAM_IS_GOOD(pa_stream_state_t x)
} \
} while (0);
+static void *qpa_get_buffer_in(HWVoiceIn *hw, size_t *size)
+{
+ PAVoiceIn *p = (PAVoiceIn *) hw;
+ PAConnection *c = p->g->conn;
+ int r;
+
+ pa_threaded_mainloop_lock(c->mainloop);
+
+ CHECK_DEAD_GOTO(c, p->stream, unlock_and_fail,
+ "pa_threaded_mainloop_lock failed\n");
+
+ if (!p->read_length) {
+ r = pa_stream_peek(p->stream, &p->read_data, &p->read_length);
+ CHECK_SUCCESS_GOTO(c, r == 0, unlock_and_fail,
+ "pa_stream_peek failed\n");
+ }
+
+ *size = MIN(p->read_length, *size);
+
+ pa_threaded_mainloop_unlock(c->mainloop);
+ return (void *) p->read_data;
+
+unlock_and_fail:
+ pa_threaded_mainloop_unlock(c->mainloop);
+ *size = 0;
+ return NULL;
+}
+
+static void qpa_put_buffer_in(HWVoiceIn *hw, void *buf, size_t size)
+{
+ PAVoiceIn *p = (PAVoiceIn *) hw;
+ PAConnection *c = p->g->conn;
+ int r;
+
+ pa_threaded_mainloop_lock(c->mainloop);
+
+ CHECK_DEAD_GOTO(c, p->stream, unlock,
+ "pa_threaded_mainloop_lock failed\n");
+
+ assert(buf == p->read_data && size <= p->read_length);
+
+ p->read_data += size;
+ p->read_length -= size;
+
+ if (size && !p->read_length) {
+ r = pa_stream_drop(p->stream);
+ CHECK_SUCCESS_GOTO(c, r == 0, unlock, "pa_stream_drop failed\n");
+ }
+
+unlock:
+ pa_threaded_mainloop_unlock(c->mainloop);
+}
+
static size_t qpa_read(HWVoiceIn *hw, void *data, size_t length)
{
PAVoiceIn *p = (PAVoiceIn *) hw;
@@ -134,6 +187,32 @@ unlock_and_fail:
return 0;
}
+static void *qpa_get_buffer_out(HWVoiceOut *hw, size_t *size)
+{
+ PAVoiceOut *p = (PAVoiceOut *) hw;
+ PAConnection *c = p->g->conn;
+ void *ret;
+ int r;
+
+ pa_threaded_mainloop_lock(c->mainloop);
+
+ CHECK_DEAD_GOTO(c, p->stream, unlock_and_fail,
+ "pa_threaded_mainloop_lock failed\n");
+
+ *size = -1;
+ r = pa_stream_begin_write(p->stream, &ret, size);
+ CHECK_SUCCESS_GOTO(c, r >= 0, unlock_and_fail,
+ "pa_stream_begin_write failed\n");
+
+ pa_threaded_mainloop_unlock(c->mainloop);
+ return ret;
+
+unlock_and_fail:
+ pa_threaded_mainloop_unlock(c->mainloop);
+ *size = 0;
+ return NULL;
+}
+
static size_t qpa_write(HWVoiceOut *hw, void *data, size_t length)
{
PAVoiceOut *p = (PAVoiceOut *) hw;
@@ -668,12 +747,16 @@ static struct audio_pcm_ops qpa_pcm_ops = {
.fini_out = qpa_fini_out,
.write = qpa_write,
.buffer_size_out = qpa_buffer_size_out,
+ .get_buffer_out = qpa_get_buffer_out,
+ .put_buffer_out = qpa_write, /* pa handles it */
.volume_out = qpa_volume_out,
.init_in = qpa_init_in,
.fini_in = qpa_fini_in,
.read = qpa_read,
.buffer_size_in = qpa_buffer_size_in,
+ .get_buffer_in = qpa_get_buffer_in,
+ .put_buffer_in = qpa_put_buffer_in,
.volume_in = qpa_volume_in
};
--
2.7.0
- [Qemu-devel] [PATCH 28/51] audio: api for mixeng code free backends, (continued)
- [Qemu-devel] [PATCH 28/51] audio: api for mixeng code free backends, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 29/51] alsaaudio: port to the new audio backend api, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 31/51] noaudio: port to the new audio backend api, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 26/51] audio: remove read and write pcm_ops, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 27/51] audio: use size_t where makes sense, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 30/51] coreaudio: port to the new audio backend api, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 25/51] paaudio: fix playback glitches, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 36/51] wavaudio: port to the new audio backend api, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 33/51] paaudio: port to the new audio backend api, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 17/51] audio: reduce glob_audio_state usage, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 44/51] paaudio: get/put_buffer functions,
Kővágó, Zoltán <=
- [Qemu-devel] [PATCH 45/51] audio: support more than two channels in volume setting, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 18/51] audio: basic support for multi backend audio, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 37/51] audio: remove remains of the old backend api, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 20/51] audio: audiodev= parameters no longer optional when -audiodev present, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 32/51] ossaudio: port to the new audio backend api, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 42/51] audio: add mixeng option (documentation), Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 43/51] audio: make mixeng optional, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 47/51] audio: basic support for multichannel audio, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 39/51] audio: remove hw->samples, buffer_size_in/out pcm_ops, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 41/51] audio: split ctl_* functions into enable_* and volume_*, Kővágó, Zoltán, 2016/01/14