===========================================================================
*/
+#include "quakedef.h"
+
#include <limits.h>
#include <pthread.h>
#include <CoreAudio/AudioHardware.h>
-#include "quakedef.h"
#include "snd_main.h"
outBuffer = (float*)outOutputData->mBuffers[0].mData;
factor = snd_renderbuffer->format.channels * snd_renderbuffer->format.width;
frameCount = 0;
-
+
// Lock the snd_renderbuffer
if (SndSys_LockRenderBuffer())
{
samples = (const short*)(&snd_renderbuffer->ring[startOffset * factor]);
for (sampleIndex = 0; sampleIndex < sampleCount; sampleIndex++)
outBuffer[sampleIndex] = samples[sampleIndex] * scale;
-
+
outBuffer = &outBuffer[sampleCount];
sampleCount = frameCount * snd_renderbuffer->format.channels - sampleCount;
samples = (const short*)(&snd_renderbuffer->ring[0]);
if (frameCount < submissionChunk)
{
unsigned int missingFrames;
-
+
missingFrames = submissionChunk - frameCount;
- Con_DPrintf("audioDeviceIOProc: %u sample frames missing\n", missingFrames);
+ if (developer.integer >= 1000 && vid_activewindow)
+ Con_Printf("audioDeviceIOProc: %u sample frames missing\n", missingFrames);
memset(&outBuffer[frameCount * snd_renderbuffer->format.channels], 0, missingFrames * sizeof(outBuffer[0]));
}
return true;
Con_Printf("Initializing CoreAudio...\n");
-
- // We only accept 16-bit samples for the moment
- if (requested->width != 2)
+
+ if(requested->width != 2)
{
- // Suggest a 16-bit format instead
- if (suggested != NULL)
+ // we can only do 16bit per sample for now
+ if(suggested != NULL)
{
- memcpy (suggested, requested, sizeof (suggested));
+ memcpy (suggested, requested, sizeof (*suggested));
suggested->width = 2;
}
-
return false;
}
-
+
// Get the output device
propertySize = sizeof(outputDeviceID);
status = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &propertySize, &outputDeviceID);
if (status)
{
- Con_Printf("CoreAudio: AudioDeviceGetProperty() returned %d when getting kAudioHardwarePropertyDefaultOutputDevice\n", status);
+ Con_Printf("CoreAudio: AudioDeviceGetProperty() returned %d when getting kAudioHardwarePropertyDefaultOutputDevice\n", (int)status);
return false;
}
if (outputDeviceID == kAudioDeviceUnknown)
status = AudioDeviceSetProperty(outputDeviceID, NULL, 0, false, kAudioDevicePropertyBufferSize, propertySize, &bufferByteCount);
if (status)
{
- Con_Printf("CoreAudio: AudioDeviceSetProperty() returned %d when setting kAudioDevicePropertyBufferSize to %d\n", status, CHUNK_SIZE);
+ Con_Printf("CoreAudio: AudioDeviceSetProperty() returned %d when setting kAudioDevicePropertyBufferSize to %d\n", (int)status, CHUNK_SIZE);
return false;
}
status = AudioDeviceGetProperty(outputDeviceID, 0, false, kAudioDevicePropertyBufferSize, &propertySize, &bufferByteCount);
if (status)
{
- Con_Printf("CoreAudio: AudioDeviceGetProperty() returned %d when setting kAudioDevicePropertyBufferSize\n", status);
+ Con_Printf("CoreAudio: AudioDeviceGetProperty() returned %d when setting kAudioDevicePropertyBufferSize\n", (int)status);
return false;
}
status = AudioDeviceGetProperty(outputDeviceID, 0, false, kAudioDevicePropertyStreamFormat, &propertySize, &streamDesc);
if (status)
{
- Con_Printf("CoreAudio: AudioDeviceGetProperty() returned %d when getting kAudioDevicePropertyStreamFormat\n", status);
+ Con_Printf("CoreAudio: AudioDeviceGetProperty() returned %d when getting kAudioDevicePropertyStreamFormat\n", (int)status);
return false;
}
+
Con_DPrint (" Hardware format:\n");
Con_DPrintf(" %5d mSampleRate\n", (unsigned int)streamDesc.mSampleRate);
Con_DPrintf(" %c%c%c%c mFormatID\n",
- (streamDesc.mFormatID & 0xff000000) >> 24,
- (streamDesc.mFormatID & 0x00ff0000) >> 16,
- (streamDesc.mFormatID & 0x0000ff00) >> 8,
- (streamDesc.mFormatID & 0x000000ff) >> 0);
- Con_DPrintf(" %5d mBytesPerPacket\n", streamDesc.mBytesPerPacket);
- Con_DPrintf(" %5d mFramesPerPacket\n", streamDesc.mFramesPerPacket);
- Con_DPrintf(" %5d mBytesPerFrame\n", streamDesc.mBytesPerFrame);
- Con_DPrintf(" %5d mChannelsPerFrame\n", streamDesc.mChannelsPerFrame);
- Con_DPrintf(" %5d mBitsPerChannel\n", streamDesc.mBitsPerChannel);
+ (char)(streamDesc.mFormatID >> 24),
+ (char)(streamDesc.mFormatID >> 16),
+ (char)(streamDesc.mFormatID >> 8),
+ (char)(streamDesc.mFormatID >> 0));
+ Con_DPrintf(" %5u mBytesPerPacket\n", (unsigned int)streamDesc.mBytesPerPacket);
+ Con_DPrintf(" %5u mFramesPerPacket\n", (unsigned int)streamDesc.mFramesPerPacket);
+ Con_DPrintf(" %5u mBytesPerFrame\n", (unsigned int)streamDesc.mBytesPerFrame);
+ Con_DPrintf(" %5u mChannelsPerFrame\n", (unsigned int)streamDesc.mChannelsPerFrame);
+ Con_DPrintf(" %5u mBitsPerChannel\n", (unsigned int)streamDesc.mBitsPerChannel);
+
+ // Suggest proper settings if they differ
+ if (requested->channels != streamDesc.mChannelsPerFrame || requested->speed != streamDesc.mSampleRate)
+ {
+ if (suggested != NULL)
+ {
+ memcpy (suggested, requested, sizeof (*suggested));
+ suggested->channels = streamDesc.mChannelsPerFrame;
+ suggested->speed = streamDesc.mSampleRate;
+ }
+ return false;
+ }
if(streamDesc.mFormatID != kAudioFormatLinearPCM)
{
status = AudioDeviceAddIOProc(outputDeviceID, audioDeviceIOProc, NULL);
if (status)
{
- Con_Printf("CoreAudio: AudioDeviceAddIOProc() returned %d\n", status);
+ Con_Printf("CoreAudio: AudioDeviceAddIOProc() returned %d\n", (int)status);
return false;
}
status = AudioDeviceStart(outputDeviceID, audioDeviceIOProc);
if (status)
{
- Con_Printf("CoreAudio: AudioDeviceStart() returned %d\n", status);
+ Con_Printf("CoreAudio: AudioDeviceStart() returned %d\n", (int)status);
pthread_mutex_destroy(&coreaudio_mutex);
AudioDeviceRemoveIOProc(outputDeviceID, audioDeviceIOProc);
return false;
status = AudioDeviceStop(outputDeviceID, audioDeviceIOProc);
if (status)
{
- Con_Printf("AudioDeviceStop: returned %d\n", status);
+ Con_Printf("AudioDeviceStop: returned %d\n", (int)status);
return;
}
s_isRunning = false;
-
+
pthread_mutex_destroy(&coreaudio_mutex);
status = AudioDeviceRemoveIOProc(outputDeviceID, audioDeviceIOProc);
if (status)
{
- Con_Printf("AudioDeviceRemoveIOProc: returned %d\n", status);
+ Con_Printf("AudioDeviceRemoveIOProc: returned %d\n", (int)status);
return;
}