winepulse: Move pulse_read to unix lib.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Andrew Eikum <aeikum@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
b070eb78cc
commit
a5d4079c82
|
@ -434,96 +434,6 @@ static void pulse_write(ACImpl *This)
|
||||||
This->pulse_stream->pa_held_bytes -= to_write;
|
This->pulse_stream->pa_held_bytes -= to_write;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pulse_read(ACImpl *This)
|
|
||||||
{
|
|
||||||
size_t bytes = pa_stream_readable_size(This->pulse_stream->stream);
|
|
||||||
|
|
||||||
TRACE("Readable total: %zu, fragsize: %u\n", bytes, pa_stream_get_buffer_attr(This->pulse_stream->stream)->fragsize);
|
|
||||||
|
|
||||||
bytes += This->pulse_stream->peek_len - This->pulse_stream->peek_ofs;
|
|
||||||
|
|
||||||
while (bytes >= This->pulse_stream->period_bytes) {
|
|
||||||
BYTE *dst = NULL, *src;
|
|
||||||
size_t src_len, copy, rem = This->pulse_stream->period_bytes;
|
|
||||||
|
|
||||||
if (This->pulse_stream->started) {
|
|
||||||
LARGE_INTEGER stamp, freq;
|
|
||||||
ACPacket *p, *next;
|
|
||||||
|
|
||||||
if (!(p = (ACPacket*)list_head(&This->pulse_stream->packet_free_head))) {
|
|
||||||
p = (ACPacket*)list_head(&This->pulse_stream->packet_filled_head);
|
|
||||||
if (!p) return;
|
|
||||||
if (!p->discont) {
|
|
||||||
next = (ACPacket*)p->entry.next;
|
|
||||||
next->discont = 1;
|
|
||||||
} else
|
|
||||||
p = (ACPacket*)list_tail(&This->pulse_stream->packet_filled_head);
|
|
||||||
} else {
|
|
||||||
This->pulse_stream->held_bytes += This->pulse_stream->period_bytes;
|
|
||||||
}
|
|
||||||
QueryPerformanceCounter(&stamp);
|
|
||||||
QueryPerformanceFrequency(&freq);
|
|
||||||
p->qpcpos = (stamp.QuadPart * (INT64)10000000) / freq.QuadPart;
|
|
||||||
p->discont = 0;
|
|
||||||
list_remove(&p->entry);
|
|
||||||
list_add_tail(&This->pulse_stream->packet_filled_head, &p->entry);
|
|
||||||
|
|
||||||
dst = p->data;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (rem) {
|
|
||||||
if (This->pulse_stream->peek_len) {
|
|
||||||
copy = min(rem, This->pulse_stream->peek_len - This->pulse_stream->peek_ofs);
|
|
||||||
|
|
||||||
if (dst) {
|
|
||||||
memcpy(dst, This->pulse_stream->peek_buffer + This->pulse_stream->peek_ofs, copy);
|
|
||||||
dst += copy;
|
|
||||||
}
|
|
||||||
|
|
||||||
rem -= copy;
|
|
||||||
This->pulse_stream->peek_ofs += copy;
|
|
||||||
if(This->pulse_stream->peek_len == This->pulse_stream->peek_ofs)
|
|
||||||
This->pulse_stream->peek_len = This->pulse_stream->peek_ofs = 0;
|
|
||||||
|
|
||||||
} else if (pa_stream_peek(This->pulse_stream->stream, (const void**)&src, &src_len) == 0 && src_len) {
|
|
||||||
|
|
||||||
copy = min(rem, src_len);
|
|
||||||
|
|
||||||
if (dst) {
|
|
||||||
if(src)
|
|
||||||
memcpy(dst, src, copy);
|
|
||||||
else
|
|
||||||
silence_buffer(This->pulse_stream->ss.format, dst, copy);
|
|
||||||
|
|
||||||
dst += copy;
|
|
||||||
}
|
|
||||||
|
|
||||||
rem -= copy;
|
|
||||||
|
|
||||||
if (copy < src_len) {
|
|
||||||
if (src_len > This->pulse_stream->peek_buffer_len) {
|
|
||||||
HeapFree(GetProcessHeap(), 0, This->pulse_stream->peek_buffer);
|
|
||||||
This->pulse_stream->peek_buffer = HeapAlloc(GetProcessHeap(), 0, src_len);
|
|
||||||
This->pulse_stream->peek_buffer_len = src_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(src)
|
|
||||||
memcpy(This->pulse_stream->peek_buffer, src + copy, src_len - copy);
|
|
||||||
else
|
|
||||||
silence_buffer(This->pulse_stream->ss.format, This->pulse_stream->peek_buffer, src_len - copy);
|
|
||||||
|
|
||||||
This->pulse_stream->peek_len = src_len - copy;
|
|
||||||
This->pulse_stream->peek_ofs = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
pa_stream_drop(This->pulse_stream->stream);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bytes -= This->pulse_stream->period_bytes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static DWORD WINAPI pulse_timer_cb(void *user)
|
static DWORD WINAPI pulse_timer_cb(void *user)
|
||||||
{
|
{
|
||||||
LARGE_INTEGER delay;
|
LARGE_INTEGER delay;
|
||||||
|
@ -595,7 +505,7 @@ static DWORD WINAPI pulse_timer_cb(void *user)
|
||||||
This->pulse_stream->lcl_offs_bytes %= This->pulse_stream->real_bufsize_bytes;
|
This->pulse_stream->lcl_offs_bytes %= This->pulse_stream->real_bufsize_bytes;
|
||||||
This->pulse_stream->held_bytes -= adv_bytes;
|
This->pulse_stream->held_bytes -= adv_bytes;
|
||||||
}else if(This->dataflow == eCapture){
|
}else if(This->dataflow == eCapture){
|
||||||
pulse_read(This);
|
pulse->read(This->pulse_stream);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
This->pulse_stream->last_time = now;
|
This->pulse_stream->last_time = now;
|
||||||
|
|
|
@ -851,6 +851,106 @@ static void WINAPI pulse_release_stream(struct pulse_stream *stream, HANDLE time
|
||||||
RtlFreeHeap(GetProcessHeap(), 0, stream);
|
RtlFreeHeap(GetProcessHeap(), 0, stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void WINAPI pulse_read(struct pulse_stream *stream)
|
||||||
|
{
|
||||||
|
size_t bytes = pa_stream_readable_size(stream->stream);
|
||||||
|
|
||||||
|
TRACE("Readable total: %zu, fragsize: %u\n", bytes, pa_stream_get_buffer_attr(stream->stream)->fragsize);
|
||||||
|
|
||||||
|
bytes += stream->peek_len - stream->peek_ofs;
|
||||||
|
|
||||||
|
while (bytes >= stream->period_bytes)
|
||||||
|
{
|
||||||
|
BYTE *dst = NULL, *src;
|
||||||
|
size_t src_len, copy, rem = stream->period_bytes;
|
||||||
|
|
||||||
|
if (stream->started)
|
||||||
|
{
|
||||||
|
LARGE_INTEGER stamp, freq;
|
||||||
|
ACPacket *p, *next;
|
||||||
|
|
||||||
|
if (!(p = (ACPacket*)list_head(&stream->packet_free_head)))
|
||||||
|
{
|
||||||
|
p = (ACPacket*)list_head(&stream->packet_filled_head);
|
||||||
|
if (!p) return;
|
||||||
|
if (!p->discont) {
|
||||||
|
next = (ACPacket*)p->entry.next;
|
||||||
|
next->discont = 1;
|
||||||
|
} else
|
||||||
|
p = (ACPacket*)list_tail(&stream->packet_filled_head);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stream->held_bytes += stream->period_bytes;
|
||||||
|
}
|
||||||
|
NtQueryPerformanceCounter(&stamp, &freq);
|
||||||
|
p->qpcpos = (stamp.QuadPart * (INT64)10000000) / freq.QuadPart;
|
||||||
|
p->discont = 0;
|
||||||
|
list_remove(&p->entry);
|
||||||
|
list_add_tail(&stream->packet_filled_head, &p->entry);
|
||||||
|
|
||||||
|
dst = p->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (rem)
|
||||||
|
{
|
||||||
|
if (stream->peek_len)
|
||||||
|
{
|
||||||
|
copy = min(rem, stream->peek_len - stream->peek_ofs);
|
||||||
|
|
||||||
|
if (dst)
|
||||||
|
{
|
||||||
|
memcpy(dst, stream->peek_buffer + stream->peek_ofs, copy);
|
||||||
|
dst += copy;
|
||||||
|
}
|
||||||
|
|
||||||
|
rem -= copy;
|
||||||
|
stream->peek_ofs += copy;
|
||||||
|
if(stream->peek_len == stream->peek_ofs)
|
||||||
|
stream->peek_len = stream->peek_ofs = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (pa_stream_peek(stream->stream, (const void**)&src, &src_len) == 0 && src_len)
|
||||||
|
{
|
||||||
|
copy = min(rem, src_len);
|
||||||
|
|
||||||
|
if (dst) {
|
||||||
|
if(src)
|
||||||
|
memcpy(dst, src, copy);
|
||||||
|
else
|
||||||
|
silence_buffer(stream->ss.format, dst, copy);
|
||||||
|
|
||||||
|
dst += copy;
|
||||||
|
}
|
||||||
|
|
||||||
|
rem -= copy;
|
||||||
|
|
||||||
|
if (copy < src_len)
|
||||||
|
{
|
||||||
|
if (src_len > stream->peek_buffer_len)
|
||||||
|
{
|
||||||
|
RtlFreeHeap(GetProcessHeap(), 0, stream->peek_buffer);
|
||||||
|
stream->peek_buffer = RtlAllocateHeap(GetProcessHeap(), 0, src_len);
|
||||||
|
stream->peek_buffer_len = src_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(src)
|
||||||
|
memcpy(stream->peek_buffer, src + copy, src_len - copy);
|
||||||
|
else
|
||||||
|
silence_buffer(stream->ss.format, stream->peek_buffer, src_len - copy);
|
||||||
|
|
||||||
|
stream->peek_len = src_len - copy;
|
||||||
|
stream->peek_ofs = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pa_stream_drop(stream->stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bytes -= stream->period_bytes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static const struct unix_funcs unix_funcs =
|
static const struct unix_funcs unix_funcs =
|
||||||
{
|
{
|
||||||
pulse_lock,
|
pulse_lock,
|
||||||
|
@ -860,6 +960,7 @@ static const struct unix_funcs unix_funcs =
|
||||||
pulse_main_loop,
|
pulse_main_loop,
|
||||||
pulse_create_stream,
|
pulse_create_stream,
|
||||||
pulse_release_stream,
|
pulse_release_stream,
|
||||||
|
pulse_read,
|
||||||
pulse_test_connect,
|
pulse_test_connect,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -77,5 +77,6 @@ struct unix_funcs
|
||||||
const WAVEFORMATEX *fmt, UINT32 *channel_count,
|
const WAVEFORMATEX *fmt, UINT32 *channel_count,
|
||||||
struct pulse_stream **ret);
|
struct pulse_stream **ret);
|
||||||
void (WINAPI *release_stream)(struct pulse_stream *stream, HANDLE timer);
|
void (WINAPI *release_stream)(struct pulse_stream *stream, HANDLE timer);
|
||||||
|
void (WINAPI *read)(struct pulse_stream *stream);
|
||||||
HRESULT (WINAPI *test_connect)(const char *name, struct pulse_config *config);
|
HRESULT (WINAPI *test_connect)(const char *name, struct pulse_config *config);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue