Skip to content

Commit 121c401

Browse files
committed
fix: リリースビルドのエンコードメソッドでSIGSEGVが発生する問題を修正
1 parent 425500b commit 121c401

File tree

1 file changed

+32
-21
lines changed
  • crates/shiguredo_fdk_aac/src

1 file changed

+32
-21
lines changed

crates/shiguredo_fdk_aac/src/lib.rs

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -170,35 +170,46 @@ impl Encoder {
170170
return Ok(None);
171171
}
172172

173+
let in_buf = MaybeUninit::<sys::AACENC_BufDesc>::zeroed();
174+
let out_buf = MaybeUninit::<sys::AACENC_BufDesc>::zeroed();
175+
let in_elem_size = 2;
176+
let out_elem_size = 1;
177+
let in_args = MaybeUninit::<sys::AACENC_InArgs>::zeroed();
178+
let mut out_args = MaybeUninit::<sys::AACENC_OutArgs>::zeroed();
173179
unsafe {
174-
let mut in_args = MaybeUninit::<sys::AACENC_InArgs>::zeroed().assume_init();
180+
let mut in_args = in_args.assume_init();
175181
in_args.numInSamples = self.pcm_buf.len() as sys::INT;
176182

177-
let in_identifier = sys::AACENC_BufferIdentifier_IN_AUDIO_DATA as i32;
178-
let in_size = self.pcm_buf.len() as sys::INT * 2;
179-
let in_elem_size = 2i32;
180-
let in_ptr = self.pcm_buf.as_ptr() as *mut c_void;
183+
let mut in_buf = in_buf.assume_init();
184+
185+
// 一時配列を直接フィールドに代入してしまうと、
186+
// リリースビルド時のコンパイラの最適化によってポインタが無効になることがあるので、
187+
// 一度変数を経由する
188+
let mut in_buf_bufs = [self.pcm_buf.as_ptr() as *mut c_void];
189+
let mut in_buf_buf_sizes = [self.pcm_buf.len() as sys::INT * in_elem_size];
190+
let mut in_buf_buf_el_sizes = [in_elem_size];
181191

182-
let mut in_buf = MaybeUninit::<sys::AACENC_BufDesc>::zeroed().assume_init();
183192
in_buf.numBufs = 1;
184-
in_buf.bufs = &in_ptr as *const _ as *mut _; // スタック変数のアドレス
185-
in_buf.bufferIdentifiers = &in_identifier as *const _ as *mut _;
186-
in_buf.bufSizes = &in_size as *const _ as *mut _;
187-
in_buf.bufElSizes = &in_elem_size as *const _ as *mut _;
193+
in_buf.bufs = in_buf_bufs.as_mut_ptr();
194+
in_buf.bufferIdentifiers =
195+
[sys::AACENC_BufferIdentifier_IN_AUDIO_DATA as i32].as_mut_ptr();
196+
in_buf.bufSizes = in_buf_buf_sizes.as_mut_ptr();
197+
in_buf.bufElSizes = in_buf_buf_el_sizes.as_mut_ptr();
188198

189-
let out_identifier = sys::AACENC_BufferIdentifier_OUT_BITSTREAM_DATA as i32;
190-
let out_size = self.encode_buf.len() as sys::INT;
191-
let out_elem_size = 1i32;
192-
let out_ptr = self.encode_buf.as_mut_ptr() as *mut c_void;
199+
let mut out_buf = out_buf.assume_init();
193200

194-
let mut out_buf = MaybeUninit::<sys::AACENC_BufDesc>::zeroed().assume_init();
195-
out_buf.numBufs = 1;
196-
out_buf.bufs = &out_ptr as *const _ as *mut _;
197-
out_buf.bufferIdentifiers = &out_identifier as *const _ as *mut _;
198-
out_buf.bufSizes = &out_size as *const _ as *mut _;
199-
out_buf.bufElSizes = &out_elem_size as *const _ as *mut _;
201+
// in_bufs_* と同様にこちらも変数を経由してポインタを取得する
202+
let mut out_buf_bufs = [self.encode_buf.as_mut_ptr() as *mut c_void];
203+
let mut out_buf_buffer_identifiers =
204+
[sys::AACENC_BufferIdentifier_OUT_BITSTREAM_DATA as i32];
205+
let mut out_buf_buf_sizes = [self.encode_buf.len() as sys::INT];
206+
let mut out_buf_buf_el_sizes = [out_elem_size];
200207

201-
let mut out_args = MaybeUninit::<sys::AACENC_OutArgs>::zeroed();
208+
out_buf.numBufs = 1;
209+
out_buf.bufs = out_buf_bufs.as_mut_ptr();
210+
out_buf.bufferIdentifiers = out_buf_buffer_identifiers.as_mut_ptr();
211+
out_buf.bufSizes = out_buf_buf_sizes.as_mut_ptr();
212+
out_buf.bufElSizes = out_buf_buf_el_sizes.as_mut_ptr();
202213

203214
let code = sys::aacEncEncode(
204215
self.handle.0,

0 commit comments

Comments
 (0)