output/osx: fix up audio format first, then apply it to device
This is a MPD 0.16 regression: when playing a 24 bit file, the switch to 16 bit was made only partially, after mBytesPerPacket and mBytesPerFrame had already been applied. That means mBytesPerFrame referred to 24 bit, and mBitsPerChannel referred to 16 bits. Of course, that cannot work.
This commit is contained in:
parent
3149d1abf9
commit
b5645ab29f
1
NEWS
1
NEWS
|
@ -7,6 +7,7 @@ ver 0.16.1 (2010/??/??)
|
||||||
- mad: work around build failure on Solaris
|
- mad: work around build failure on Solaris
|
||||||
* output:
|
* output:
|
||||||
- solaris: add missing parameter to open_cloexec() cal
|
- solaris: add missing parameter to open_cloexec() cal
|
||||||
|
- osx: fix up audio format first, then apply it to device
|
||||||
|
|
||||||
|
|
||||||
ver 0.16 (2010/12/11)
|
ver 0.16 (2010/12/11)
|
||||||
|
|
|
@ -214,15 +214,6 @@ osx_output_open(void *data, struct audio_format *audio_format, GError **error)
|
||||||
stream_description.mSampleRate = audio_format->sample_rate;
|
stream_description.mSampleRate = audio_format->sample_rate;
|
||||||
stream_description.mFormatID = kAudioFormatLinearPCM;
|
stream_description.mFormatID = kAudioFormatLinearPCM;
|
||||||
stream_description.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger;
|
stream_description.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger;
|
||||||
#if G_BYTE_ORDER == G_BIG_ENDIAN
|
|
||||||
stream_description.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
stream_description.mBytesPerPacket =
|
|
||||||
audio_format_frame_size(audio_format);
|
|
||||||
stream_description.mFramesPerPacket = 1;
|
|
||||||
stream_description.mBytesPerFrame = stream_description.mBytesPerPacket;
|
|
||||||
stream_description.mChannelsPerFrame = audio_format->channels;
|
|
||||||
|
|
||||||
switch (audio_format->format) {
|
switch (audio_format->format) {
|
||||||
case SAMPLE_FORMAT_S8:
|
case SAMPLE_FORMAT_S8:
|
||||||
|
@ -239,6 +230,16 @@ osx_output_open(void *data, struct audio_format *audio_format, GError **error)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if G_BYTE_ORDER == G_BIG_ENDIAN
|
||||||
|
stream_description.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
stream_description.mBytesPerPacket =
|
||||||
|
audio_format_frame_size(audio_format);
|
||||||
|
stream_description.mFramesPerPacket = 1;
|
||||||
|
stream_description.mBytesPerFrame = stream_description.mBytesPerPacket;
|
||||||
|
stream_description.mChannelsPerFrame = audio_format->channels;
|
||||||
|
|
||||||
result = AudioUnitSetProperty(od->au, kAudioUnitProperty_StreamFormat,
|
result = AudioUnitSetProperty(od->au, kAudioUnitProperty_StreamFormat,
|
||||||
kAudioUnitScope_Input, 0,
|
kAudioUnitScope_Input, 0,
|
||||||
&stream_description,
|
&stream_description,
|
||||||
|
|
Loading…
Reference in New Issue