]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - snd_coreaudio.c
vary r_drawparticles_drawdistance and r_drawdecals_drawdistance for
[xonotic/darkplaces.git] / snd_coreaudio.c
index 669b82f180adb9ae9257f6ecd195653552124664..c9f6c1e7635dfcc8c84650d47aed5c08b6463caa 100644 (file)
@@ -20,12 +20,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 ===========================================================================
 */
 
+#include "quakedef.h"
+
 #include <limits.h>
 #include <pthread.h>
 
 #include <CoreAudio/AudioHardware.h>
 
-#include "quakedef.h"
 #include "snd_main.h"
 
 
@@ -57,7 +58,7 @@ static OSStatus audioDeviceIOProc(AudioDeviceID inDevice,
        outBuffer = (float*)outOutputData->mBuffers[0].mData;
        factor = snd_renderbuffer->format.channels * snd_renderbuffer->format.width;
        frameCount = 0;
-       
+
        // Lock the snd_renderbuffer
        if (SndSys_LockRenderBuffer())
        {
@@ -82,7 +83,7 @@ static OSStatus audioDeviceIOProc(AudioDeviceID inDevice,
                        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]);
@@ -107,9 +108,10 @@ static OSStatus audioDeviceIOProc(AudioDeviceID inDevice,
        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]));
        }
 
@@ -136,26 +138,24 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested)
                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)
@@ -170,7 +170,7 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested)
        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;
        }
 
@@ -178,7 +178,7 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested)
        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;
        }
 
@@ -196,21 +196,34 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested)
        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)
        {
@@ -222,7 +235,7 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested)
        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;
        }
 
@@ -242,7 +255,7 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested)
        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;
@@ -271,17 +284,17 @@ void SndSys_Shutdown(void)
        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;
        }