Fix WASAPI capture logic
The buffer size handling differs from what render streams uses. Logic is based on https://github.com/microsoft/Windows-universal-samples/blob/master/Samples/WindowsAudioSession/cpp/WASAPICapture.cpp.
This commit is contained in:
parent
36dee482bd
commit
e9043c605a
|
@ -502,25 +502,25 @@ impl EventLoop {
|
|||
let stream_idx = handle_idx - 1;
|
||||
let stream = &mut run_context.streams[stream_idx];
|
||||
|
||||
// The number of frames available for reading/writing.
|
||||
let mut frames_available = match get_available_frames(stream) {
|
||||
Ok(0) => continue, // TODO: Can this happen?
|
||||
Ok(n) => n,
|
||||
Err(err) => {
|
||||
streams_to_remove.push((stream.id.clone(), err));
|
||||
continue;
|
||||
}
|
||||
};
|
||||
|
||||
let sample_size = stream.sample_format.sample_size();
|
||||
|
||||
// Obtaining a pointer to the buffer.
|
||||
match stream.client_flow {
|
||||
|
||||
AudioClientFlow::Capture { capture_client } => {
|
||||
let mut frames_available = 0;
|
||||
// Get the available data in the shared buffer.
|
||||
let mut buffer: *mut BYTE = mem::uninitialized();
|
||||
let mut flags = mem::uninitialized();
|
||||
loop {
|
||||
let hresult = (*capture_client).GetNextPacketSize(&mut frames_available);
|
||||
if let Err(err) = stream_error_from_hresult(hresult) {
|
||||
streams_to_remove.push((stream.id.clone(), err));
|
||||
break; // Identical to continuing the outer loop
|
||||
}
|
||||
if frames_available == 0 {
|
||||
break;
|
||||
}
|
||||
let hresult = (*capture_client).GetBuffer(
|
||||
&mut buffer,
|
||||
&mut frames_available,
|
||||
|
@ -534,7 +534,7 @@ impl EventLoop {
|
|||
continue;
|
||||
} else if let Err(err) = stream_error_from_hresult(hresult) {
|
||||
streams_to_remove.push((stream.id.clone(), err));
|
||||
continue;
|
||||
break; // Identical to continuing the outer loop
|
||||
}
|
||||
|
||||
debug_assert!(!buffer.is_null());
|
||||
|
@ -566,9 +566,20 @@ impl EventLoop {
|
|||
SampleFormat::I16 => capture_callback!(i16, I16),
|
||||
SampleFormat::U16 => capture_callback!(u16, U16),
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
AudioClientFlow::Render { render_client } => {
|
||||
// The number of frames available for writing.
|
||||
let frames_available = match get_available_frames(stream) {
|
||||
Ok(0) => continue, // TODO: Can this happen?
|
||||
Ok(n) => n,
|
||||
Err(err) => {
|
||||
streams_to_remove.push((stream.id.clone(), err));
|
||||
continue;
|
||||
}
|
||||
};
|
||||
|
||||
let mut buffer: *mut BYTE = mem::uninitialized();
|
||||
let hresult = (*render_client).GetBuffer(
|
||||
frames_available,
|
||||
|
|
Loading…
Reference in New Issue