|
1 | 1 | use super::audio_format::LinearPcmFlags; |
2 | 2 | use super::{AudioUnit, Element, Scope}; |
3 | 3 | use crate::error::{self, Error}; |
4 | | -use std::cmp::Ordering; |
5 | 4 | use std::mem; |
6 | 5 | use std::os::raw::c_void; |
7 | 6 | use std::slice; |
@@ -580,12 +579,14 @@ impl AudioUnit { |
580 | 579 |
|
581 | 580 | let data_byte_size = buffer_frame_size * sample_bytes as u32 * n_channels; |
582 | 581 | let mut data = vec![0u8; data_byte_size as usize]; |
| 582 | + let mut buffer_capacity = data_byte_size as usize; |
583 | 583 | let audio_buffer = sys::AudioBuffer { |
584 | 584 | mDataByteSize: data_byte_size, |
585 | 585 | mNumberChannels: n_channels, |
586 | 586 | mData: data.as_mut_ptr() as *mut _, |
587 | 587 | }; |
588 | 588 | // Relieve ownership of the `Vec` until we're ready to drop the `AudioBufferList`. |
| 589 | + // TODO: This leaks the len & capacity fields, since only the buffer pointer is released |
589 | 590 | mem::forget(data); |
590 | 591 |
|
591 | 592 | let audio_buffer_list = Box::new(sys::AudioBufferList { |
@@ -627,24 +628,21 @@ impl AudioUnit { |
627 | 628 | let n_channels = stream_format.channels; |
628 | 629 | let data_byte_size = |
629 | 630 | in_number_frames as usize * sample_bytes * n_channels as usize; |
630 | | - let ptr = (*audio_buffer_list_ptr).mBuffers.as_ptr() as *const sys::AudioBuffer; |
| 631 | + let ptr = (*audio_buffer_list_ptr).mBuffers.as_ptr() as *mut sys::AudioBuffer; |
631 | 632 | let len = (*audio_buffer_list_ptr).mNumberBuffers as usize; |
632 | 633 |
|
633 | | - let buffers: &[sys::AudioBuffer] = slice::from_raw_parts(ptr, len); |
634 | | - for &buffer in buffers { |
635 | | - let ptr = buffer.mData as *mut u8; |
636 | | - let len = buffer.mDataByteSize as usize; |
637 | | - let cap = len; |
638 | | - let mut vec = Vec::from_raw_parts(ptr, len, cap); |
639 | | - match len.cmp(&data_byte_size) { |
640 | | - Ordering::Greater => { |
641 | | - vec.truncate(data_byte_size); |
642 | | - } |
643 | | - Ordering::Less => { |
644 | | - vec.reserve_exact(data_byte_size - len); |
645 | | - } |
646 | | - Ordering::Equal => {} |
647 | | - } |
| 634 | + let buffers: &mut [sys::AudioBuffer] = slice::from_raw_parts_mut(ptr, len); |
| 635 | + let old_capacity = buffer_capacity; |
| 636 | + for buffer in buffers { |
| 637 | + let current_len = buffer.mDataByteSize as usize; |
| 638 | + let audio_buffer_ptr = buffer.mData as *mut u8; |
| 639 | + let mut vec: Vec<u8> = |
| 640 | + Vec::from_raw_parts(audio_buffer_ptr, current_len, old_capacity); |
| 641 | + vec.resize(data_byte_size, 0u8); |
| 642 | + |
| 643 | + buffer_capacity = vec.capacity(); |
| 644 | + buffer.mData = vec.as_mut_ptr() as *mut _; |
| 645 | + buffer.mDataByteSize = data_byte_size as u32; |
648 | 646 | mem::forget(vec); |
649 | 647 | } |
650 | 648 | } |
|
0 commit comments