Changeset 1322:8da3bcb947c5 in mediastreamer2
- Timestamp:
- Mar 23, 2011 4:45:35 PM (2 years ago)
- Branch:
- default
- Files:
-
- 3 edited
-
configure.ac (modified) (2 diffs)
-
src/macsnd.c (modified) (15 diffs)
-
src/mssndcard.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
configure.ac
r1319 r1322 336 336 337 337 AC_ARG_ENABLE(macsnd, 338 [ --enable-macsnd Turn on native macosx sound support (default=no)],338 [ --enable-macsnd Turn on Audio Units macosx sound support (default=yes)], 339 339 [case "${enableval}" in 340 340 yes) macsnd=true ;; 341 341 no) macsnd=false ;; 342 342 *) AC_MSG_ERROR(bad value ${enableval} for --enable-macsnd) ;; 343 esac],[macsnd=false]) 344 345 if test "$macsnd" = "true"; then 346 AC_DEFINE(__MACSND_ENABLED__,1,[defined if native macosx sound support is available]) 347 macsnd_enabled=true 348 found_sound=yes 349 fi 350 351 AM_CONDITIONAL(BUILD_MACSND, test x$macsnd_enabled = xtrue) 343 esac],[macsnd=true]) 352 344 353 345 AC_ARG_ENABLE(macaqsnd, 354 [ --enable-macaqsnd Turn on native macosx Audio Queue sound support (default= yes)],346 [ --enable-macaqsnd Turn on native macosx Audio Queue sound support (default=no)], 355 347 [case "${enableval}" in 356 348 yes) macaqsnd=true ;; … … 359 351 esac],[macaqsnd=true]) 360 352 361 if test "$macosx_found" != "yes" ; then 362 macaqsnd=false 363 fi 364 365 if test "$macaqsnd" = "true"; then 366 AC_DEFINE(__MAC_AQ_ENABLED__,1,[defined if native macosx AQ sound support is available]) 367 found_sound=yes 368 fi 369 353 354 355 if test "$macosx_found" = "yes" ; then 356 if test "$macsnd" = "true"; then 357 AC_DEFINE(__MACSND_ENABLED__,1,[defined if native macosx sound support is available]) 358 macsnd_enabled=true 359 found_sound=yes 360 fi 361 if test "$macaqsnd" = "true"; then 362 AC_DEFINE(__MAC_AQ_ENABLED__,1,[defined if native macosx AQ sound support is available]) 363 found_sound=yes 364 macaqsnd=true 365 fi 366 fi 367 368 369 AM_CONDITIONAL(BUILD_MACSND, test x$macsnd_enabled = xtrue) 370 370 AM_CONDITIONAL(BUILD_MACAQSND, test x$macaqsnd = xtrue) 371 371 372 372 AC_ARG_ENABLE(iounit, 373 [ --enable-iounit Turn on native apple iounit support (default=no)],373 [ --enable-iounit Turn on native iOS audio unit support (default=no)], 374 374 [case "${enableval}" in 375 375 yes) iounit=true ;; -
src/macsnd.c
r1321 r1322 60 60 #define CHECK_AURESULT(call) do{ int _err; if ((_err=(call))!=noErr) ms_error( #call ": error [%i] %s %s",_err,GetMacOSStatusErrorString(_err),GetMacOSStatusCommentString(_err)); }while(0) 61 61 62 static void show_format(const char *name, AudioStreamBasicDescription * deviceFormat) 63 { 64 ms_message("Format for %s", name); 65 ms_message("mSampleRate = %g", deviceFormat->mSampleRate); 66 unsigned int fcc= ntohl(deviceFormat->mFormatID); 67 char outName[5]; 68 memcpy(outName,&fcc,4); 69 outName[4] = 0; 70 ms_message("mFormatID = %s", outName); 71 ms_message("mFormatFlags = %08lX", deviceFormat->mFormatFlags); 72 ms_message("mBytesPerPacket = %ld", deviceFormat->mBytesPerPacket); 73 ms_message("mFramesPerPacket = %ld", deviceFormat->mFramesPerPacket); 74 ms_message("mChannelsPerFrame = %ld", deviceFormat->mChannelsPerFrame); 75 ms_message("mBytesPerFrame = %ld", deviceFormat->mBytesPerFrame); 76 ms_message("mBitsPerChannel = %ld", deviceFormat->mBitsPerChannel); 77 } 78 79 62 80 typedef struct AUCommon{ 63 81 int dev; … … 83 101 AudioDeviceID dev; 84 102 int removed; 103 int rate; /*the nominal rate of the device*/ 85 104 } AuCard; 86 105 … … 148 167 { 149 168 MSSndCard *card = ms_snd_card_new(&ca_card_desc); 169 AudioStreamBasicDescription format; 150 170 AuCard *d = (AuCard *) card->data; 171 unsigned int slen; 172 int err; 173 151 174 d->uidname = ms_strdup(uidname); 152 175 d->dev = dev; 153 176 card->name = ms_strdup(name); 154 177 card->capabilities = cap; 178 179 slen = sizeof(format); 180 d->rate=44100; 181 err = AudioDeviceGetProperty(dev, 0, cap & MS_SND_CARD_CAP_CAPTURE, kAudioDevicePropertyStreamFormat, &slen, &format); 182 if (err == kAudioHardwareNoError) { 183 show_format("output device", &format); 184 d->rate=format.mSampleRate; 185 } 155 186 return card; 156 }157 158 static void show_format(const char *name, AudioStreamBasicDescription * deviceFormat)159 {160 ms_message("Format for %s", name);161 ms_message("mSampleRate = %g", deviceFormat->mSampleRate);162 char *the4CCString = (char *) &deviceFormat->mFormatID;163 char outName[5];164 outName[0] = the4CCString[0];165 outName[1] = the4CCString[1];166 outName[2] = the4CCString[2];167 outName[3] = the4CCString[3];168 outName[4] = 0;169 ms_message("mFormatID = %s", outName);170 ms_message("mFormatFlags = %08lX", deviceFormat->mFormatFlags);171 ms_message("mBytesPerPacket = %ld", deviceFormat->mBytesPerPacket);172 ms_message("mFramesPerPacket = %ld", deviceFormat->mFramesPerPacket);173 ms_message("mChannelsPerFrame = %ld", deviceFormat->mChannelsPerFrame);174 ms_message("mBytesPerFrame = %ld", deviceFormat->mBytesPerFrame);175 ms_message("mBitsPerChannel = %ld", deviceFormat->mBitsPerChannel);176 187 } 177 188 … … 222 233 ms_message("CA: devname:%s uidname:%s", devname, uidname); 223 234 224 AudioStreamBasicDescription devicewriteFormat; 225 slen = sizeof(devicewriteFormat); 226 err = AudioDeviceGetProperty(id, 0, is_input, kAudioDevicePropertyStreamFormat, &slen, &devicewriteFormat); 227 if (err == kAudioHardwareNoError) { 228 show_format("output device", &devicewriteFormat); 229 } 235 230 236 return ret; 231 237 } … … 278 284 { 279 285 AURead *d=(AURead*)inRefCon; 280 281 CHECK_AURESULT(AudioUnitRender(d->common.au, inActionFlags, inTimeStamp, inBusNumber, 282 inNumFrames, ioData)); 283 if( ioData==NULL) 284 { 286 AudioBufferList lreadAudioBufferList={0}; 287 mblk_t *rm; 288 OSStatus err; 289 290 291 292 lreadAudioBufferList.mNumberBuffers=1; 293 lreadAudioBufferList.mBuffers[0].mDataByteSize=inNumFrames*sizeof(int16_t)*d->common.nchannels; 294 rm=allocb(lreadAudioBufferList.mBuffers[0].mDataByteSize,0); 295 lreadAudioBufferList.mBuffers[0].mData=rm->b_wptr; 296 lreadAudioBufferList.mBuffers[0].mNumberChannels = 1; 297 298 //ms_message("request to render %i bytes, inNumFrames=%i",lreadAudioBufferList.mBuffers[0].mDataByteSize,inNumFrames); 299 err=AudioUnitRender(d->common.au, inActionFlags, inTimeStamp, inBusNumber, inNumFrames, &lreadAudioBufferList); 300 301 if (err!=noErr){ 302 ms_error("AudioUnitRender() for read returned [%i] %s %s",err,GetMacOSStatusErrorString(err),GetMacOSStatusCommentString(err)); 285 303 return 0; 286 304 } 287 ms_message("Got input buffer of size %i",ioData->mBuffers[0].mDataByteSize); 288 mblk_t *rm=NULL; 289 rm=allocb(ioData->mBuffers[0].mDataByteSize,0); 290 memcpy(rm->b_wptr, ioData->mBuffers[0].mData, ioData->mBuffers[0].mDataByteSize); 291 rm->b_wptr+=ioData->mBuffers[0].mDataByteSize; 305 //ms_message("Got input buffer of size %i",lreadAudioBufferList.mBuffers[0].mDataByteSize); 306 307 rm->b_wptr+=lreadAudioBufferList.mBuffers[0].mDataByteSize; 292 308 293 309 ms_mutex_lock(&d->common.mutex); 294 310 putq(&d->rq,rm); 295 311 ms_mutex_unlock(&d->common.mutex); 296 rm=NULL; 297 312 298 313 return 0; 299 314 } … … 306 321 AudioBufferList *ioData) 307 322 { 308 OSStatus err= noErr;309 323 AUWrite *d=(AUWrite*)inRefCon; 310 324 int read; 325 326 if (ioData->mNumberBuffers!=1) ms_warning("writeRenderProc: %i buffers",ioData->mNumberBuffers); 311 327 ms_mutex_lock(&d->common.mutex); 312 328 read=ms_bufferizer_read(d->buffer,ioData->mBuffers[0].mData,ioData->mBuffers[0].mDataByteSize); … … 315 331 ms_warning("Silence inserted in audio output unit (%i bytes)",ioData->mBuffers[0].mDataByteSize); 316 332 memset(ioData->mBuffers[0].mData,0,ioData->mBuffers[0].mDataByteSize); 317 }318 err = AudioUnitRender(d->common.au, inActionFlags, inTimeStamp, inBusNumber,inNumFrames, ioData);319 if(err != noErr){320 ms_error("AudioUnitRender() failed for write: %i",err);321 333 } 322 334 return 0; … … 375 387 kAudioOutputUnitProperty_CurrentDevice, 376 388 kAudioUnitScope_Global, 377 0,389 output_bus, 378 390 &d->dev, 379 391 sizeof(AudioDeviceID))); 380 392 393 394 param=0; 395 CHECK_AURESULT(AudioUnitSetProperty(d->au, 396 kAudioUnitProperty_ShouldAllocateBuffer, 397 is_read ? kAudioUnitScope_Input : kAudioUnitScope_Output , 398 is_read ? input_bus : output_bus , 399 ¶m, 400 sizeof(param))); 401 381 402 UInt32 asbdsize = sizeof(AudioStreamBasicDescription); 382 403 memset((char *)&asbd, 0, asbdsize); … … 390 411 391 412 show_format(is_read ? "Input audio unit" : "Output audio unit",&asbd); 392 if (asbd.mChannelsPerFrame>1) 393 { 394 asbd.mBytesPerFrame = asbd.mBytesPerFrame / asbd.mChannelsPerFrame; 395 asbd.mBytesPerPacket = asbd.mBytesPerPacket / asbd.mChannelsPerFrame; 396 asbd.mChannelsPerFrame = 1; 397 } 413 414 asbd.mSampleRate=d->rate; 415 416 asbd.mBytesPerPacket=asbd.mBytesPerFrame = 2*d->nchannels; 417 asbd.mChannelsPerFrame = d->nchannels; 418 asbd.mBitsPerChannel=16; 419 asbd.mFormatID=kAudioFormatLinearPCM; 420 asbd.mFormatFlags=kAudioFormatFlagIsPacked|kAudioFormatFlagIsSignedInteger; 421 422 398 423 399 424 CHECK_AURESULT(AudioUnitSetProperty(d->au, 400 425 kAudioUnitProperty_StreamFormat, 401 is_read ? kAudioUnitScope_Input : kAudioUnitScope_Output,402 is_read ? output_bus : input_bus ,426 is_read ? kAudioUnitScope_Output : kAudioUnitScope_Input, 427 is_read ? input_bus : output_bus , 403 428 &asbd, 404 429 sizeof(AudioStreamBasicDescription))); 430 CHECK_AURESULT(AudioUnitGetProperty(d->au, 431 kAudioUnitProperty_StreamFormat, 432 is_read ? kAudioUnitScope_Output : kAudioUnitScope_Input, 433 is_read ? input_bus : output_bus , 434 &asbd, 435 &asbdsize)); 436 437 show_format(is_read ? "Input audio unit after configuration" : "Output audio unit after configuration",&asbd); 438 405 439 406 440 // Get the number of frames in the IO buffer(s) 407 441 param = sizeof(UInt32); 408 UInt32 fAudioSamples;442 UInt32 numFrames; 409 443 CHECK_AURESULT(AudioUnitGetProperty(d->au, 410 444 kAudioDevicePropertyBufferFrameSize, 411 445 kAudioUnitScope_Input, 412 1,413 & fAudioSamples,446 input_bus, 447 &numFrames, 414 448 ¶m)); 415 416 result = AudioUnitInitialize(d->au); 417 if(result != noErr) 418 { 419 ms_error("failed to AudioUnitInitialize input %i", result); 420 return -1; 421 } 449 ms_message("Number of frames per buffer = %i", numFrames); 450 422 451 AURenderCallbackStruct cbs; 423 452 … … 428 457 kAudioOutputUnitProperty_SetInputCallback, 429 458 kAudioUnitScope_Global, 430 0,459 input_bus, 431 460 &cbs, 432 461 sizeof(AURenderCallbackStruct))); … … 435 464 CHECK_AURESULT(AudioUnitSetProperty (d->au, 436 465 kAudioUnitProperty_SetRenderCallback, 437 kAudioUnitScope_ Input,438 0,466 kAudioUnitScope_Global, 467 output_bus, 439 468 &cbs, 440 469 sizeof(AURenderCallbackStruct))); 470 } 471 result = AudioUnitInitialize(d->au); 472 if(result != noErr) 473 { 474 ms_error("failed to AudioUnitInitialize %i , is_read=%i", result,(int)is_read); 475 return -1; 441 476 } 442 477 … … 468 503 469 504 static void au_common_init(AUCommon *d){ 470 d->rate= 8000;505 d->rate=44100; 471 506 d->nchannels=1; 472 507 ms_mutex_init(&d->mutex,NULL); … … 545 580 static int set_rate(MSFilter *f, void *arg){ 546 581 AUCommon *d = (AUCommon *) f->data; 547 d->rate = *((int *) arg);548 return 0;582 /*the hal audio unit does not accept custom rates*/ 583 return (d->rate==*(int*)arg) ? 0 : -1; 549 584 } 550 585 … … 604 639 AURead *d = (AURead *) f->data; 605 640 d->common.dev = wc->dev; 641 d->common.rate=wc->rate; 606 642 return f; 607 643 } … … 613 649 AUWrite *d = (AUWrite *) f->data; 614 650 d->common.dev = wc->dev; 651 d->common.rate=wc->rate; 615 652 return f; 616 653 } -
src/mssndcard.c
r1287 r1322 101 101 102 102 void ms_snd_card_manager_add_card(MSSndCardManager *m, MSSndCard *c){ 103 ms_message("Card %sadded",ms_snd_card_get_string_id(c));103 ms_message("Card '%s' added",ms_snd_card_get_string_id(c)); 104 104 m->cards=ms_list_append(m->cards,c); 105 105 }
Note: See TracChangeset
for help on using the changeset viewer.
