aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkihiko Odaki <akihiko.odaki@gmail.com>2021-06-16 23:17:21 +0900
committerGerd Hoffmann <kraxel@redhat.com>2021-06-17 12:00:26 +0200
commit986bdbc6a29c4d7ef125299c5013783e30dc2cae (patch)
treeebc5afc29f5e8cef2172bfbb8b21925dfde56b32
parent0c29b786e6b5276d43be2be255a8323c628ec790 (diff)
coreaudio: Fix output stream format settings
Before commit 7d6948cd98cf5ad8a3458a4ce7fdbcb79bcd1212, it was coded to retrieve the initial output stream format settings, modify the frame rate, and set again. However, I removed a frame rate modification code by mistake in the commit. It also assumes the initial output stream format is consistent with what QEMU expects, but that expectation is not in the code, which makes it harder to understand and will lead to breakage if the initial settings change. This change explicitly sets all of the output stream settings to solve these problems. Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com> Message-Id: <20210616141721.54091-1-akihiko.odaki@gmail.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r--audio/coreaudio.c48
1 files changed, 13 insertions, 35 deletions
diff --git a/audio/coreaudio.c b/audio/coreaudio.c
index 578ec9b8b2..f570e1ee60 100644
--- a/audio/coreaudio.c
+++ b/audio/coreaudio.c
@@ -39,7 +39,6 @@ typedef struct coreaudioVoiceOut {
int frameSizeSetting;
uint32_t bufferCount;
UInt32 audioDevicePropertyBufferFrameSize;
- AudioStreamBasicDescription outputStreamBasicDescription;
AudioDeviceIOProcID ioprocid;
bool enabled;
} coreaudioVoiceOut;
@@ -114,24 +113,6 @@ static OSStatus coreaudio_set_framesize(AudioDeviceID id, UInt32 *framesize)
framesize);
}
-static OSStatus coreaudio_get_streamformat(AudioDeviceID id,
- AudioStreamBasicDescription *d)
-{
- UInt32 size = sizeof(*d);
- AudioObjectPropertyAddress addr = {
- kAudioDevicePropertyStreamFormat,
- kAudioDevicePropertyScopeOutput,
- kAudioObjectPropertyElementMaster
- };
-
- return AudioObjectGetPropertyData(id,
- &addr,
- 0,
- NULL,
- &size,
- d);
-}
-
static OSStatus coreaudio_set_streamformat(AudioDeviceID id,
AudioStreamBasicDescription *d)
{
@@ -373,6 +354,17 @@ static OSStatus init_out_device(coreaudioVoiceOut *core)
OSStatus status;
AudioValueRange frameRange;
+ AudioStreamBasicDescription streamBasicDescription = {
+ .mBitsPerChannel = core->hw.info.bits,
+ .mBytesPerFrame = core->hw.info.bytes_per_frame,
+ .mBytesPerPacket = core->hw.info.bytes_per_frame,
+ .mChannelsPerFrame = core->hw.info.nchannels,
+ .mFormatFlags = kLinearPCMFormatFlagIsFloat,
+ .mFormatID = kAudioFormatLinearPCM,
+ .mFramesPerPacket = 1,
+ .mSampleRate = core->hw.info.freq
+ };
+
status = coreaudio_get_voice(&core->outputDeviceID);
if (status != kAudioHardwareNoError) {
coreaudio_playback_logerr (status,
@@ -432,29 +424,16 @@ static OSStatus init_out_device(coreaudioVoiceOut *core)
}
core->hw.samples = core->bufferCount * core->audioDevicePropertyBufferFrameSize;
- /* get StreamFormat */
- status = coreaudio_get_streamformat(core->outputDeviceID,
- &core->outputStreamBasicDescription);
- if (status == kAudioHardwareBadObjectError) {
- return 0;
- }
- if (status != kAudioHardwareNoError) {
- coreaudio_playback_logerr (status,
- "Could not get Device Stream properties\n");
- core->outputDeviceID = kAudioDeviceUnknown;
- return status;
- }
-
/* set Samplerate */
status = coreaudio_set_streamformat(core->outputDeviceID,
- &core->outputStreamBasicDescription);
+ &streamBasicDescription);
if (status == kAudioHardwareBadObjectError) {
return 0;
}
if (status != kAudioHardwareNoError) {
coreaudio_playback_logerr (status,
"Could not set samplerate %lf\n",
- core->outputStreamBasicDescription.mSampleRate);
+ streamBasicDescription.mSampleRate);
core->outputDeviceID = kAudioDeviceUnknown;
return status;
}
@@ -598,7 +577,6 @@ static int coreaudio_init_out(HWVoiceOut *hw, struct audsettings *as,
qapi_AudiodevCoreaudioPerDirectionOptions_base(cpdo), as, 11610);
core->bufferCount = cpdo->has_buffer_count ? cpdo->buffer_count : 4;
- core->outputStreamBasicDescription.mSampleRate = (Float64) as->freq;
status = AudioObjectAddPropertyListener(kAudioObjectSystemObject,
&voice_addr, handle_voice_change,