rdpContext* rdpcontext;
BOOL attached;
wStream* data;
+ wStream* buffer;
AUDIO_FORMAT* format;
UINT32 FramesPerPacket;
Stream_Write(audin->data, data, size);
}
- else if (!freerdp_dsp_encode(audin->dsp_context, format, data, size, audin->data))
- return ERROR_INTERNAL_ERROR;
+ else
+ {
+ size_t block = audin->FramesPerPacket;
+ size_t rest = audin->FramesPerPacket % audin->format->nBlockAlign;
+
+ if (rest > 0)
+ block += audin->format->nBlockAlign - rest;
+
+ block *= format->wBitsPerSample / 8 * format->nChannels;
+
+ if (block < size)
+ size = block;
+
+ Stream_SetPosition(audin->buffer, 0);
+
+ if (!Stream_EnsureRemainingCapacity(audin->buffer, 2 * block))
+ return CHANNEL_RC_NO_MEMORY;
+
+ Stream_Write(audin->buffer, data, size);
+ Stream_Zero(audin->buffer, block - size);
+ Stream_SealLength(audin->buffer);
+
+ if (!freerdp_dsp_encode(audin->dsp_context, format, Stream_Buffer(audin->buffer),
+ Stream_Length(audin->buffer), audin->data))
+ return ERROR_INTERNAL_ERROR;
+ }
if (Stream_GetPosition(audin->data) <= 1)
return CHANNEL_RC_OK;
return FALSE;
}
- if (!audin->device->FormatSupported(audin->device, audin->format))
+ if (!supported)
{
if (!freerdp_dsp_context_reset(audin->dsp_context, audin->format))
return FALSE;
freerdp_dsp_context_free(audin->dsp_context);
Stream_Free(audin->data, TRUE);
+ Stream_Free(audin->buffer, TRUE);
free(audin->subsystem);
free(audin->device_name);
free(audin->listener_callback);
audin->log = WLog_Get(TAG);
audin->data = Stream_New(NULL, 4096);
+ audin->buffer = Stream_New(NULL, 4096);
- if (!audin->data)
+ if (!audin->data || !audin->buffer)
goto out;
audin->dsp_context = freerdp_dsp_context_new(TRUE);
buffer_attr.prebuf = (UINT32) - 1;
buffer_attr.minreq = (UINT32) - 1;
/* 500ms latency */
- buffer_attr.fragsize = pulse->bytes_per_frame * pulse->frames_per_packet * pulse->format.nChannels;
+ buffer_attr.fragsize = pulse->bytes_per_frame * pulse->frames_per_packet;
+
+ if (buffer_attr.fragsize % pulse->format.nBlockAlign)
+ buffer_attr.fragsize += pulse->format.nBlockAlign - buffer_attr.fragsize %
+ pulse->format.nBlockAlign;
if (pa_stream_connect_record(pulse->stream,
pulse->device_name,