src/audio/macosx/SDL_coreaudio.c
changeset 2016 72fa74928062
parent 2003 506851d3efa4
child 2017 df06e6eb65c6
equal deleted inserted replaced
2015:152dcc2f089f 2016:72fa74928062
   205 {
   205 {
   206     OSStatus result = noErr;
   206     OSStatus result = noErr;
   207     Component comp;
   207     Component comp;
   208     ComponentDescription desc;
   208     ComponentDescription desc;
   209     struct AudioUnitInputCallback callback;
   209     struct AudioUnitInputCallback callback;
   210     AudioStreamBasicDescription desc;
   210     AudioStreamBasicDescription strdesc;
   211     SDL_AudioFormat test_format = SDL_FirstAudioFormat(spec->format);
   211     SDL_AudioFormat test_format = SDL_FirstAudioFormat(spec->format);
   212     int valid_datatype = 0;
   212     int valid_datatype = 0;
   213 
   213 
   214     /* Setup a AudioStreamBasicDescription with the requested format */
   214     /* Setup a AudioStreamBasicDescription with the requested format */
   215     memset(&desc, '\0', sizeof (AudioStreamBasicDescription));
   215     memset(&strdesc, '\0', sizeof (AudioStreamBasicDescription));
   216     desc.mFormatID = kAudioFormatLinearPCM;
   216     strdesc.mFormatID = kAudioFormatLinearPCM;
   217     desc.mFormatFlags = kLinearPCMFormatFlagIsPacked;
   217     strdesc.mFormatFlags = kLinearPCMFormatFlagIsPacked;
   218     desc.mChannelsPerFrame = spec->channels;
   218     strdesc.mChannelsPerFrame = spec->channels;
   219     desc.mSampleRate = spec->freq;
   219     strdesc.mSampleRate = spec->freq;
   220     desc.mFramesPerPacket = 1;
   220     strdesc.mFramesPerPacket = 1;
   221 
   221 
   222     while ((!valid_datatype) && (test_format)) {
   222     while ((!valid_datatype) && (test_format)) {
   223         spec->format = test_format;
   223         spec->format = test_format;
   224         desc.mFormatFlags = 0;
       
   225         /* Just a list of valid SDL formats, so people don't pass junk here. */
   224         /* Just a list of valid SDL formats, so people don't pass junk here. */
   226         switch (test_format) {
   225         switch (test_format) {
   227             case AUDIO_U8:
   226             case AUDIO_U8:
   228             case AUDIO_S8:
   227             case AUDIO_S8:
   229             case AUDIO_U16LSB:
   228             case AUDIO_U16LSB:
   233             case AUDIO_S32LSB:
   232             case AUDIO_S32LSB:
   234             case AUDIO_S32MSB:
   233             case AUDIO_S32MSB:
   235             case AUDIO_F32LSB:
   234             case AUDIO_F32LSB:
   236             case AUDIO_F32MSB:
   235             case AUDIO_F32MSB:
   237                 valid_datatype = 1;
   236                 valid_datatype = 1;
   238                 desc.mBitsPerChannel = SDL_AUDIO_BITSIZE(spec->format);
   237                 strdesc.mBitsPerChannel = SDL_AUDIO_BITSIZE(spec->format);
       
   238                 if (SDL_AUDIO_ISBIGENDIAN(spec->format))
       
   239                     strdesc.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian;
   239 
   240 
   240                 if (SDL_AUDIO_ISFLOAT(spec->format))
   241                 if (SDL_AUDIO_ISFLOAT(spec->format))
   241                     desc.mFormatFlags |= kLinearPCMFormatFlagIsFloat;
   242                     strdesc.mFormatFlags |= kLinearPCMFormatFlagIsFloat;
   242                 else if (SDL_AUDIO_ISSIGNED(spec->format))
   243                 else if (SDL_AUDIO_ISSIGNED(spec->format))
   243                     desc.mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger;
   244                     strdesc.mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger;
   244 
       
   245                 if (SDL_AUDIO_ISBIGENDIAN(spec->format))
       
   246                     desc.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian;
       
   247                 break;
   245                 break;
   248         }
   246         }
   249     }
   247     }
   250 
   248 
   251     if (!valid_datatype) {  /* shouldn't happen, but just in case... */
   249     if (!valid_datatype) {  /* shouldn't happen, but just in case... */
   252         SDL_SetError("Unsupported audio format");
   250         SDL_SetError("Unsupported audio format");
   253         return (-1);
   251         return (-1);
   254     }
   252     }
   255 
   253 
   256     desc.mBytesPerFrame =
   254     strdesc.mBytesPerFrame =
   257         desc.mBitsPerChannel * desc.mChannelsPerFrame / 8;
   255         strdesc.mBitsPerChannel * strdesc.mChannelsPerFrame / 8;
   258     desc.mBytesPerPacket =
   256     strdesc.mBytesPerPacket =
   259         desc.mBytesPerFrame * desc.mFramesPerPacket;
   257         strdesc.mBytesPerFrame * strdesc.mFramesPerPacket;
   260 
       
   261 
   258 
   262     /* Locate the default output audio unit */
   259     /* Locate the default output audio unit */
       
   260     memset(&desc, '\0', sizeof (ComponentDescription));
   263     desc.componentType = kAudioUnitComponentType;
   261     desc.componentType = kAudioUnitComponentType;
   264     desc.componentSubType = kAudioUnitSubType_Output;
   262     desc.componentSubType = kAudioUnitSubType_Output;
   265     desc.componentManufacturer = kAudioUnitID_DefaultOutput;
   263     desc.componentManufacturer = kAudioUnitID_DefaultOutput;
   266     desc.componentFlags = 0;
   264     desc.componentFlags = 0;
   267     desc.componentFlagsMask = 0;
   265     desc.componentFlagsMask = 0;