XQuartz: Fix a possible buffer overrun in quartzAudio

Also dropped deprecated API while there

Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
This commit is contained in:
Jeremy Huddleston 2010-02-15 16:46:21 -08:00
parent 4127e8e5be
commit 4e8bf12b13

View File

@ -62,7 +62,6 @@ typedef struct QuartzAudioRec {
UInt32 curFrame; UInt32 curFrame;
UInt32 remainingFrames; UInt32 remainingFrames;
UInt32 totalFrames; UInt32 totalFrames;
UInt32 bytesPerFrame;
double sampleRate; double sampleRate;
UInt32 fadeLength; UInt32 fadeLength;
@ -117,9 +116,9 @@ static void QuartzFillBuffer(
unsigned int bufferFrameCount; unsigned int bufferFrameCount;
float multiplier, v; float multiplier, v;
int i; int i;
buffer = (float *)audiobuffer->mData; buffer = (float *)audiobuffer->mData;
bufferFrameCount = audiobuffer->mDataByteSize / data->bytesPerFrame; bufferFrameCount = audiobuffer->mDataByteSize / (sizeof(float) * audiobuffer->mNumberChannels);
frameCount = min(bufferFrameCount, data->remainingFrames); frameCount = min(bufferFrameCount, data->remainingFrames);
@ -141,7 +140,7 @@ static void QuartzFillBuffer(
data->prevFrame = 0; data->prevFrame = 0;
// adjust for space eaten by prev fade // adjust for space eaten by prev fade
buffer += audiobuffer->mNumberChannels*frame; b += audiobuffer->mNumberChannels*frame;
bufferFrameCount -= frame; bufferFrameCount -= frame;
frameCount = min(bufferFrameCount, data->remainingFrames); frameCount = min(bufferFrameCount, data->remainingFrames);
} }
@ -204,7 +203,8 @@ QuartzAudioIOProc(
if (wasPlaying && !data->playing) { if (wasPlaying && !data->playing) {
OSStatus err; OSStatus err;
err = AudioDeviceStop(inDevice, QuartzAudioIOProc); err = AudioDeviceStop(inDevice, QuartzAudioIOProc);
fprintf(stderr, "Error stopping audio device: %ld\n", (long int)err); if(err != noErr)
fprintf(stderr, "Error stopping audio device: %ld\n", (long int)err);
} }
pthread_mutex_unlock(&data->lock); pthread_mutex_unlock(&data->lock);
return 0; return 0;
@ -263,16 +263,17 @@ void QuartzAudioInit(void)
UInt32 propertySize; UInt32 propertySize;
OSStatus status; OSStatus status;
AudioDeviceID outputDevice; AudioDeviceID outputDevice;
AudioStreamBasicDescription outputStreamDescription;
double sampleRate; double sampleRate;
AudioObjectPropertyAddress devicePropertyAddress = { kAudioHardwarePropertyDefaultOutputDevice, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster };
AudioObjectPropertyAddress sampleRatePropertyAddress = { kAudioDevicePropertyNominalSampleRate, kAudioDevicePropertyScopeOutput, kAudioObjectPropertyElementMaster };
// Get the default output device // Get the default output device
propertySize = sizeof(outputDevice); propertySize = sizeof(outputDevice);
status = AudioHardwareGetProperty( status = AudioObjectGetPropertyData(kAudioObjectSystemObject, &devicePropertyAddress,
kAudioHardwarePropertyDefaultOutputDevice, 0, NULL,
&propertySize, &outputDevice); &propertySize, &outputDevice);
if (status) { if (status) {
ErrorF("QuartzAudioInit: AudioHardwareGetProperty returned %ld\n", ErrorF("QuartzAudioInit: AudioObjectGetPropertyData(output device) returned %ld\n",
(long)status); (long)status);
return; return;
} }
@ -282,23 +283,22 @@ void QuartzAudioInit(void)
} }
// Get the basic device description // Get the basic device description
propertySize = sizeof(outputStreamDescription); sampleRate = 0.;
status = AudioDeviceGetProperty(outputDevice, 0, FALSE, propertySize = sizeof(sampleRate);
kAudioDevicePropertyStreamFormat, status = AudioObjectGetPropertyData(outputDevice, &sampleRatePropertyAddress,
&propertySize, &outputStreamDescription); 0, NULL,
&propertySize, &sampleRate);
if (status) { if (status) {
ErrorF("QuartzAudioInit: GetProperty(stream format) returned %ld\n", ErrorF("QuartzAudioInit: AudioObjectGetPropertyData(sample rate) returned %ld\n",
(long)status); (long)status);
return; return;
} }
sampleRate = outputStreamDescription.mSampleRate;
// Fill in the playback data // Fill in the playback data
data.frequency = 0; data.frequency = 0;
data.amplitude = 0; data.amplitude = 0;
data.curFrame = 0; data.curFrame = 0;
data.remainingFrames = 0; data.remainingFrames = 0;
data.bytesPerFrame = outputStreamDescription.mBytesPerFrame;
data.sampleRate = sampleRate; data.sampleRate = sampleRate;
// data.bufferByteCount = bufferByteCount; // data.bufferByteCount = bufferByteCount;
data.playing = FALSE; data.playing = FALSE;