@@ -114,7 +114,7 @@ namespace lsp
114114
115115 static bool select_sample_format (AudioStreamBasicDescription *info, const audio_stream_t *fmt, size_t codec)
116116 {
117- bzero (& info, sizeof (AudioStreamBasicDescription));
117+ bzero (info, sizeof (AudioStreamBasicDescription));
118118
119119 info->mSampleRate = fmt->srate ;
120120 info->mFormatFlags = 0 ;
@@ -131,17 +131,17 @@ namespace lsp
131131 info->mFormatID = kAudioFormatULaw ;
132132 info->mFormatFlags |= kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger ;
133133 info->mBytesPerPacket = 0 ;
134- info->mBytesPerFrame = uint32_t (8 * sizeof (int8_t ) * fmt->channels );
135134 info->mFramesPerPacket = 1 ;
135+ info->mBytesPerFrame = uint32_t (8 * sizeof (int8_t ) * fmt->channels );
136136 info->mBitsPerChannel = 8 * sizeof (int8_t );
137137 break ;
138138
139139 case CFMT_ALAW:
140140 info->mFormatID = kAudioFormatALaw ;
141141 info->mFormatFlags |= kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger ;
142142 info->mBytesPerPacket = 0 ;
143- info->mBytesPerFrame = uint32_t (8 * sizeof (int8_t ) * fmt->channels );
144143 info->mFramesPerPacket = 1 ;
144+ info->mBytesPerFrame = uint32_t (8 * sizeof (int8_t ) * fmt->channels );
145145 info->mBitsPerChannel = 8 * sizeof (int8_t );
146146 break ;
147147
@@ -185,79 +185,80 @@ namespace lsp
185185 switch (sformat_format (fmt->format ))
186186 {
187187 case SFMT_U8:
188- info->mBytesPerPacket = 0 ;
189- info->mBytesPerFrame = uint32_t (8 * sizeof (uint8_t ) * fmt->channels );
188+ info->mBytesPerPacket = uint32_t (sizeof (uint8_t ) * fmt->channels );
190189 info->mFramesPerPacket = 1 ;
190+ info->mBytesPerFrame = info->mBytesPerPacket ;
191191 info->mBitsPerChannel = 8 * sizeof (uint8_t );
192192 break ;
193193
194194 case SFMT_S8:
195195 info->mFormatFlags |= kAudioFormatFlagIsSignedInteger ;
196- info->mBytesPerPacket = 0 ;
197- info->mBytesPerFrame = uint32_t (8 * sizeof (int8_t ) * fmt->channels );
196+ info->mBytesPerPacket = uint32_t (sizeof (int8_t ) * fmt->channels );
198197 info->mFramesPerPacket = 1 ;
198+ info->mBytesPerFrame = info->mBytesPerPacket ;
199199 info->mBitsPerChannel = 8 * sizeof (int8_t );
200200 break ;
201201
202202 case SFMT_U16:
203- info->mBytesPerPacket = 0 ;
204- info->mBytesPerFrame = uint32_t (8 * sizeof (uint16_t ) * fmt->channels );
203+ info->mBytesPerPacket = uint32_t (sizeof (uint16_t ) * fmt->channels );
205204 info->mFramesPerPacket = 1 ;
205+ info->mBytesPerFrame = info->mBytesPerPacket ;
206206 info->mBitsPerChannel = 8 * sizeof (uint16_t );
207207 break ;
208208
209209 case SFMT_S16:
210210 info->mFormatFlags |= kAudioFormatFlagIsSignedInteger ;
211- info->mBytesPerPacket = 0 ;
212- info->mBytesPerFrame = uint32_t (8 * sizeof (int16_t ) * fmt->channels );
211+ info->mBytesPerPacket = uint32_t (sizeof (int16_t ) * fmt->channels );
213212 info->mFramesPerPacket = 1 ;
213+ info->mBytesPerFrame = info->mBytesPerPacket ;
214214 info->mBitsPerChannel = 8 * sizeof (int16_t );
215215 break ;
216216
217217 case SFMT_U24:
218- info->mBytesPerPacket = 0 ;
219- info->mBytesPerFrame = uint32_t (24 * sizeof (uint8_t ) * fmt->channels );
218+ info->mBytesPerPacket = uint32_t (3 * sizeof (uint8_t ) * fmt->channels );
220219 info->mFramesPerPacket = 1 ;
220+ info->mFramesPerPacket = 1 ;
221+ info->mBytesPerFrame = info->mBytesPerPacket ;
221222 info->mBitsPerChannel = 24 * sizeof (uint8_t );
222223 break ;
223224
224225 case SFMT_S24:
225226 info->mFormatFlags |= kAudioFormatFlagIsSignedInteger ;
226- info->mBytesPerPacket = 0 ;
227- info->mBytesPerFrame = uint32_t (24 * sizeof (int8_t ) * fmt->channels );
227+ info->mBytesPerPacket = uint32_t (3 * sizeof (int8_t ) * fmt->channels );
228228 info->mFramesPerPacket = 1 ;
229+ info->mBytesPerFrame = info->mBytesPerPacket ;
229230 info->mBitsPerChannel = 24 * sizeof (int8_t );
230231 break ;
231232
232233 case SFMT_U32:
233- info->mBytesPerPacket = 0 ;
234- info->mBytesPerFrame = uint32_t (8 * sizeof (uint32_t ) * fmt->channels );
234+ info->mBytesPerPacket = uint32_t (sizeof (uint32_t ) * fmt->channels );
235235 info->mFramesPerPacket = 1 ;
236+ info->mBytesPerFrame = info->mBytesPerPacket ;
236237 info->mBitsPerChannel = 8 * sizeof (uint32_t );
237238 break ;
238239
239240 case SFMT_S32:
240241 info->mFormatFlags |= kAudioFormatFlagIsSignedInteger ;
241- info->mBytesPerPacket = 0 ;
242- info->mBytesPerFrame = uint32_t (8 * sizeof (int32_t ) * fmt->channels );
242+ info->mBytesPerPacket = uint32_t (sizeof (int32_t ) * fmt->channels );
243243 info->mFramesPerPacket = 1 ;
244+ info->mBytesPerFrame = info->mBytesPerPacket ;
244245 info->mBitsPerChannel = 8 * sizeof (int32_t );
245246 break ;
246247
247248 case SFMT_F32:
248249 info->mFormatFlags |= kAudioFormatFlagIsFloat ;
249- info->mBytesPerPacket = 0 ;
250- info->mBytesPerFrame = uint32_t (8 * sizeof (float ) * fmt->channels );
250+ info->mBytesPerPacket = uint32_t (sizeof (f32_t ) * fmt->channels );
251251 info->mFramesPerPacket = 1 ;
252- info->mBitsPerChannel = 8 * sizeof (float );
252+ info->mBytesPerFrame = info->mBytesPerPacket ;
253+ info->mBitsPerChannel = 8 * sizeof (f32_t );
253254 break ;
254255
255256 case SFMT_F64:
256257 info->mFormatFlags |= kAudioFormatFlagIsFloat ;
257- info->mBytesPerPacket = 0 ;
258- info->mBytesPerFrame = uint32_t (8 * sizeof (double ) * fmt->channels );
258+ info->mBytesPerPacket = uint32_t (sizeof (f64_t ) * fmt->channels );
259259 info->mFramesPerPacket = 1 ;
260- info->mBitsPerChannel = 8 * sizeof (double );
260+ info->mBytesPerFrame = info->mBytesPerPacket ;
261+ info->mBitsPerChannel = 8 * sizeof (f64_t );
261262 break ;
262263
263264 default :
@@ -596,10 +597,7 @@ namespace lsp
596597 else if (info.mBitsPerChannel == sizeof (double ) * 8 )
597598 format = mm::SFMT_F64 | be_flag;
598599 else
599- {
600- format = mm::SFMT_F32_CPU;
601600 need_convert = true ;
602- }
603601 }
604602 else if (info.mFormatFlags & kAudioFormatFlagIsSignedInteger )
605603 {
@@ -612,10 +610,7 @@ namespace lsp
612610 else if (info.mBitsPerChannel == sizeof (int32_t ) * 8 )
613611 format = mm::SFMT_S32 | be_flag;
614612 else
615- {
616- format = mm::SFMT_F32_CPU;
617613 need_convert = true ;
618- }
619614 }
620615 else
621616 {
@@ -628,10 +623,7 @@ namespace lsp
628623 else if (info.mBitsPerChannel == sizeof (uint32_t ) * 8 )
629624 format = mm::SFMT_U32 | be_flag;
630625 else
631- {
632- format = mm::SFMT_F32_CPU;
633626 need_convert = true ;
634- }
635627 }
636628 }
637629
@@ -644,11 +636,24 @@ namespace lsp
644636 cvt.mFormatID = kAudioFormatLinearPCM ;
645637 cvt.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked ;
646638
647- cvt.mBytesPerPacket = sizeof (float ) * info.mChannelsPerFrame ;
648- cvt.mFramesPerPacket = 1 ;
649- cvt.mBytesPerFrame = sizeof (float ) * info.mChannelsPerFrame ;
650- cvt.mChannelsPerFrame = info.mChannelsPerFrame ;
651- cvt.mBitsPerChannel = sizeof (float ) * 8 ;
639+ if (info.mBitsPerChannel <= sizeof (f32_t )*8 )
640+ {
641+ cvt.mBytesPerPacket = sizeof (f32_t ) * info.mChannelsPerFrame ;
642+ cvt.mFramesPerPacket = 1 ;
643+ cvt.mBytesPerFrame = sizeof (f32_t ) * info.mChannelsPerFrame ;
644+ cvt.mChannelsPerFrame = info.mChannelsPerFrame ;
645+ cvt.mBitsPerChannel = sizeof (f32_t ) * 8 ;
646+ format = mm::SFMT_F32 | be_flag;
647+ }
648+ else
649+ {
650+ cvt.mBytesPerPacket = sizeof (f64_t ) * info.mChannelsPerFrame ;
651+ cvt.mFramesPerPacket = 1 ;
652+ cvt.mBytesPerFrame = sizeof (f64_t ) * info.mChannelsPerFrame ;
653+ cvt.mChannelsPerFrame = info.mChannelsPerFrame ;
654+ cvt.mBitsPerChannel = sizeof (f64_t ) * 8 ;
655+ format = mm::SFMT_F64 | be_flag;
656+ }
652657
653658 os_res = ExtAudioFileSetProperty (
654659 eaf,
0 commit comments