@@ -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