Commit ad80acb2 authored by Jacob Vosmaer's avatar Jacob Vosmaer

output/osx: remove incorrect memset behavior

In e068d62a I added code that zeros the remainder of the output buffer if there are not enough input frames available. I have now learned that we can signal to the caller of the render callback how much data is in the output buffers. In practice, the input buffer is so large that it does not matter so much how we handle input buffer underruns, but I suppose that saying 'there is no data' is better than 'here is some silence for you'.
parent bd8414f8
......@@ -367,13 +367,6 @@ done:
sake of correctness this callback allows for de-interleaving
anyway, and calculates the expected output layout by examining
the output buffers.
The input buffer is a DynamicFifoBuffer. When a
DynamicFifoBuffer contains less data than we want to read from
it there is no point in doing a second Read(). So in the case
of insufficient audio data in the input buffer, this render
callback will emit silence into the output buffers (memset
zero).
*/
static OSStatus
......@@ -413,7 +406,7 @@ osx_render(void *vdata,
// Acquire mutex when accessing input_buffer
od->mutex.lock();
auto src = input_buffer->Read();
DynamicFifoBuffer<uint8_t>::Range src = input_buffer->Read();
UInt32 available_frames = src.size / input_buffer_frame_size;
// Never write more frames than we were asked
......@@ -429,6 +422,7 @@ osx_render(void *vdata,
for (unsigned int i = 0 ; i < buffer_list->mNumberBuffers; ++i) {
output_buffer = &buffer_list->mBuffers[i];
output_buffer_frame_size = output_buffer->mNumberChannels * sample_size;
output_buffer->mDataByteSize = 0; // Record how much data we actually rendered
for (UInt32 current_frame = 0; current_frame < available_frames; ++current_frame) {
dest = (size_t) output_buffer->mData + current_frame * output_buffer_frame_size;
memcpy(
......@@ -436,6 +430,7 @@ osx_render(void *vdata,
src.data + current_frame * input_buffer_frame_size + sub_frame_offset,
output_buffer_frame_size
);
output_buffer->mDataByteSize += output_buffer_frame_size;
}
sub_frame_offset += output_buffer_frame_size;
}
......@@ -445,19 +440,6 @@ osx_render(void *vdata,
od->condition.signal();
od->mutex.unlock();
if (available_frames < in_number_frames) {
for (unsigned int i = 0 ; i < buffer_list->mNumberBuffers; ++i) {
output_buffer = &buffer_list->mBuffers[i];
output_buffer_frame_size = output_buffer->mNumberChannels * sample_size;
dest = (size_t) output_buffer->mData + available_frames * output_buffer_frame_size;
memset(
(void *) dest,
0,
(in_number_frames - available_frames) * output_buffer_frame_size
);
}
}
return noErr;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment