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:
Jacek Caban 2021-05-13 16:03:19 +02:00 committed by Alexandre Julliard
parent b070eb78cc
commit a5d4079c82
3 changed files with 103 additions and 91 deletions

View File

@ -434,96 +434,6 @@ static void pulse_write(ACImpl *This)
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)
{
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->held_bytes -= adv_bytes;
}else if(This->dataflow == eCapture){
pulse_read(This);
pulse->read(This->pulse_stream);
}
}else{
This->pulse_stream->last_time = now;

View File

@ -851,6 +851,106 @@ static void WINAPI pulse_release_stream(struct pulse_stream *stream, HANDLE time
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 =
{
pulse_lock,
@ -860,6 +960,7 @@ static const struct unix_funcs unix_funcs =
pulse_main_loop,
pulse_create_stream,
pulse_release_stream,
pulse_read,
pulse_test_connect,
};

View File

@ -77,5 +77,6 @@ struct unix_funcs
const WAVEFORMATEX *fmt, UINT32 *channel_count,
struct pulse_stream **ret);
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);
};