|
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