fix deadlock while resampling on the ffi (#69)
This commit is contained in:
@@ -630,57 +630,56 @@ impl FfiServer {
|
|||||||
) -> FfiResult<proto::RemixAndResampleResponse> {
|
) -> FfiResult<proto::RemixAndResampleResponse> {
|
||||||
let resampler_id = remix
|
let resampler_id = remix
|
||||||
.resampler_handle
|
.resampler_handle
|
||||||
.as_ref()
|
|
||||||
.ok_or(FfiError::InvalidRequest("handle is empty"))?
|
.ok_or(FfiError::InvalidRequest("handle is empty"))?
|
||||||
.id as FfiHandleId;
|
.id as FfiHandleId;
|
||||||
|
|
||||||
let resampler = self
|
let resampler = self
|
||||||
.ffi_handles
|
.ffi_handles
|
||||||
.get(&resampler_id)
|
.get(&resampler_id)
|
||||||
.ok_or(FfiError::InvalidRequest("resampler not found"))?;
|
.ok_or(FfiError::InvalidRequest("resampler not found"))?
|
||||||
|
|
||||||
let resampler = resampler
|
|
||||||
.downcast_ref::<Arc<Mutex<audio_resampler::AudioResampler>>>()
|
.downcast_ref::<Arc<Mutex<audio_resampler::AudioResampler>>>()
|
||||||
.ok_or(FfiError::InvalidRequest("handle is not a resampler"))?;
|
.ok_or(FfiError::InvalidRequest("handle is not a resampler"))?
|
||||||
|
.clone();
|
||||||
let resampler = resampler.clone();
|
|
||||||
|
|
||||||
let buffer_id = remix
|
let buffer_id = remix
|
||||||
.buffer_handle
|
.buffer_handle
|
||||||
.as_ref()
|
|
||||||
.ok_or(FfiError::InvalidRequest("handle is empty"))?
|
.ok_or(FfiError::InvalidRequest("handle is empty"))?
|
||||||
.id as FfiHandleId;
|
.id as FfiHandleId;
|
||||||
|
|
||||||
let buffer = self
|
let data = {
|
||||||
.ffi_handles
|
let buffer = self
|
||||||
.get(&buffer_id)
|
.ffi_handles
|
||||||
.ok_or(FfiError::InvalidRequest("buffer not found"))?;
|
.get(&buffer_id)
|
||||||
|
.ok_or(FfiError::InvalidRequest("buffer not found"))?;
|
||||||
|
|
||||||
let buffer = buffer
|
let buffer = buffer
|
||||||
.downcast_ref::<AudioFrame>()
|
.downcast_ref::<AudioFrame>()
|
||||||
.ok_or(FfiError::InvalidRequest("handle is not a buffer"))?;
|
.ok_or(FfiError::InvalidRequest("handle is not a buffer"))?;
|
||||||
|
|
||||||
let mut resampler = resampler.lock();
|
let mut resampler = resampler.lock();
|
||||||
let data = resampler.remix_and_resample(
|
resampler
|
||||||
&buffer.data,
|
.remix_and_resample(
|
||||||
buffer.samples_per_channel,
|
&buffer.data,
|
||||||
buffer.num_channels,
|
buffer.samples_per_channel,
|
||||||
buffer.sample_rate,
|
buffer.num_channels,
|
||||||
remix.num_channels,
|
buffer.sample_rate,
|
||||||
remix.sample_rate,
|
remix.num_channels,
|
||||||
);
|
remix.sample_rate,
|
||||||
|
)
|
||||||
|
.to_owned()
|
||||||
|
};
|
||||||
|
|
||||||
let samples_per_channel = data.len() / remix.num_channels as usize;
|
let samples_per_channel = data.len() / remix.num_channels as usize;
|
||||||
let frame = AudioFrame {
|
let new_buffer = AudioFrame {
|
||||||
data: data.to_owned(), // Copy?
|
data,
|
||||||
num_channels: remix.num_channels,
|
num_channels: remix.num_channels,
|
||||||
samples_per_channel: samples_per_channel as u32,
|
samples_per_channel: samples_per_channel as u32,
|
||||||
sample_rate: remix.sample_rate,
|
sample_rate: remix.sample_rate,
|
||||||
};
|
};
|
||||||
|
|
||||||
let handle_id = self.next_id() as FfiHandleId;
|
let handle_id = self.next_id() as FfiHandleId;
|
||||||
let buffer_info = proto::AudioFrameBufferInfo::from(handle_id, &frame);
|
let buffer_info = proto::AudioFrameBufferInfo::from(handle_id, &new_buffer);
|
||||||
self.ffi_handles.insert(handle_id, Box::new(frame));
|
self.ffi_handles.insert(handle_id, Box::new(new_buffer));
|
||||||
|
|
||||||
Ok(proto::RemixAndResampleResponse {
|
Ok(proto::RemixAndResampleResponse {
|
||||||
buffer: Some(buffer_info),
|
buffer: Some(buffer_info),
|
||||||
|
|||||||
Reference in New Issue
Block a user