Skip to content

Commit ec762b5

Browse files
committed
Fixes of OutAudioFileStream for MacOS
1 parent 19d499c commit ec762b5

File tree

1 file changed

+44
-39
lines changed

1 file changed

+44
-39
lines changed

src/main/mm/OutAudioFileStream.cpp

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)