📄 aqsnd.c
字号:
&inDevice); if (err) { ms_error("get kAudioHardwarePropertyDefaultInputDevice error %x", err); return; } count = sizeof(char) * 255; AudioDeviceGetProperty(inDevice, 0, false, kAudioDevicePropertyDeviceName, &count, &name); ms_debug("InputDevice name = %s",name); count = sizeof(outDevice); err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &count, &outDevice); if (err) { ms_error("get kAudioHardwarePropertyDefaultOutputDevice error %d", err); return; } count = sizeof(char) * 255; AudioDeviceGetProperty(outDevice, 0, false, kAudioDevicePropertyDeviceName, &count, &name); ms_debug("OutputDevice name = %s", name); UInt32 deviceBufferSize; AudioStreamBasicDescription deviceFormat; count = sizeof(deviceBufferSize); err = AudioDeviceGetProperty(outDevice, 0, false, kAudioDevicePropertyBufferSize, &count, &deviceBufferSize); if (err != kAudioHardwareNoError) { ms_error("get kAudioDevicePropertyBufferSize error %ld", err); return; } ms_debug("deviceBufferSize = %d", deviceBufferSize); count = sizeof(deviceFormat); err = AudioDeviceGetProperty(outDevice, 0, false, kAudioDevicePropertyStreamFormat, &count, &deviceFormat); if (err != kAudioHardwareNoError) { ms_error("get kAudioDevicePropertyStreamFormat error %ld", err); return; } ms_debug("mSampleRate = %g", deviceFormat.mSampleRate); ms_debug("mFormatFlags = %08lX", deviceFormat.mFormatFlags); ms_debug("mBytesPerPacket = %ld", deviceFormat.mBytesPerPacket); ms_debug("mFramesPerPacket = %ld", deviceFormat.mFramesPerPacket); ms_debug("mChannelsPerFrame = %ld", deviceFormat.mChannelsPerFrame); ms_debug("mBytesPerFrame = %ld", deviceFormat.mBytesPerFrame); ms_debug("mBitsPerChannel = %ld", deviceFormat.mBitsPerChannel); count = sizeof(deviceBufferSize); err = AudioDeviceGetProperty(outDevice, 0, false, kAudioDevicePropertyBufferSize, &count, &deviceBufferSize); if (err != kAudioHardwareNoError) { ms_error("get kAudioDevicePropertyBufferSize error %ld", err); return; } ms_debug("deviceBufferSize = %d", deviceBufferSize);#endif MSSndCard *card=aq_card_new(); ms_snd_card_manager_add_card(m,card);}static void aq_start_r(MSSndCard *card){ AQData *d=(AQData*)card->data; ms_debug("aq_start_r"); if(d->read_started == FALSE) { OSStatus aqresult; d->readBufferByteSize = kSecondsPerBuffer * d->rate * (d->bits / 8); d->readAudioFormat.mSampleRate = d->rate; d->readAudioFormat.mFormatID = kAudioFormatLinearPCM; d->readAudioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; d->readAudioFormat.mFramesPerPacket = 1; d->readAudioFormat.mChannelsPerFrame = 1; d->readAudioFormat.mBitsPerChannel = d->bits; d->readAudioFormat.mBytesPerPacket = d->bits / 8; d->readAudioFormat.mBytesPerFrame = d->bits / 8; aqresult = AudioQueueNewInput ( &d->readAudioFormat, readCallback, d, // userData NULL, // run loop NULL, // run loop mode 0, // flags &d->readQueue ); ms_debug("AudioQueueNewInput = %d", aqresult); setupRead(card); AudioQueueStart ( d->readQueue, NULL // start time. NULL means ASAP. ); d->read_started = TRUE; }}static void aq_stop_r(MSSndCard *card){ AQData *d=(AQData*)card->data; if(d->read_started == TRUE) { AudioQueueStop ( d->readQueue, true ); AudioQueueDispose(d->readQueue,true); d->read_started=FALSE; }}static void aq_start_w(MSSndCard *card){ ms_debug("aq_start_w"); AQData *d=(AQData*)card->data; int i; if(d->write_started == FALSE) { OSStatus aqresult; d->writeBufferByteSize = kSecondsPerBuffer * d->rate * (d->bits / 8); d->writeAudioFormat.mSampleRate = d->rate; d->writeAudioFormat.mFormatID = kAudioFormatLinearPCM; d->writeAudioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; d->writeAudioFormat.mFramesPerPacket = 1; d->writeAudioFormat.mChannelsPerFrame = 1; d->writeAudioFormat.mBitsPerChannel = d->bits; d->writeAudioFormat.mBytesPerPacket = d->bits / 8; d->writeAudioFormat.mBytesPerFrame = d->bits / 8; // create the playback audio queue object aqresult = AudioQueueNewOutput ( &d->writeAudioFormat, writeCallback, d, CFRunLoopGetCurrent (), kCFRunLoopCommonModes, 0, // run loop flags &d->writeQueue ); ms_debug("AudioQueueNewOutput = %d", aqresult); setupWrite(card);#if 0 AudioQueueStart ( d->writeQueue, NULL // start time. NULL means ASAP. ); d->write_started = TRUE;#endif d->curWriteBuffer = 0; }}static void aq_stop_w(MSSndCard *card){ AQData *d=(AQData*)card->data; if(d->write_started == TRUE) { AudioQueueStop ( d->writeQueue, true ); AudioQueueDispose(d->writeQueue,true); d->write_started=FALSE; }}static mblk_t *aq_get(MSSndCard *card){ AQData *d=(AQData*)card->data; mblk_t *m; ms_mutex_lock(&d->mutex); m=getq(&d->rq); ms_mutex_unlock(&d->mutex); return m;}static void aq_put(MSSndCard *card, mblk_t *m){ ms_debug("aq_put"); AQData *d=(AQData*)card->data; ms_mutex_lock(&d->mutex); ms_bufferizer_put(d->bufferizer,m); ms_mutex_unlock(&d->mutex); if(d->write_started == FALSE && d->bufferizer->size >= d->writeBufferByteSize) { AudioQueueBufferRef curbuf = d->writeBuffers[d->curWriteBuffer]; if(ms_bufferizer_read(d->bufferizer, curbuf->mAudioData, d->writeBufferByteSize)) { curbuf->mAudioDataByteSize = d->writeBufferByteSize; putWriteAQ(d, d->curWriteBuffer); ++d->curWriteBuffer; } } if(d->write_started == FALSE && d->curWriteBuffer == kNumberAudioDataBuffers) { OSStatus err; err = AudioQueueStart ( d->writeQueue, NULL // start time. NULL means ASAP. ); ms_debug("AudioQueueStart %d", err); d->write_started = TRUE; }}static void aq_read_preprocess(MSFilter *f){ MSSndCard *card=(MSSndCard*)f->data; aq_start_r(card);}static void aq_read_postprocess(MSFilter *f){ MSSndCard *card=(MSSndCard*)f->data; aq_stop_r(card);}static void aq_read_process(MSFilter *f){ MSSndCard *card=(MSSndCard*)f->data; mblk_t *m; while((m=aq_get(card))!=NULL){ ms_queue_put(f->outputs[0],m); }}static void aq_write_preprocess(MSFilter *f){ ms_debug("aq_write_preprocess"); MSSndCard *card=(MSSndCard*)f->data; aq_start_w(card);}static void aq_write_postprocess(MSFilter *f){ ms_debug("aq_write_postprocess"); MSSndCard *card=(MSSndCard*)f->data; aq_stop_w(card);}static void aq_write_process(MSFilter *f){// ms_debug("aq_write_process"); MSSndCard *card=(MSSndCard*)f->data; mblk_t *m; while((m=ms_queue_get(f->inputs[0]))!=NULL){ aq_put(card,m); }}static int set_rate(MSFilter *f, void *arg){ ms_debug("set_rate %d", *((int*)arg)); MSSndCard *card=(MSSndCard*)f->data; AQData *d=(AQData*)card->data; d->rate=*((int*)arg); return 0;}static int set_nchannels(MSFilter *f, void *arg){ ms_debug("set_nchannels %d", *((int*)arg)); MSSndCard *card=(MSSndCard*)f->data; AQData *d=(AQData*)card->data; d->stereo=(*((int*)arg)==2); return 0;}static MSFilterMethod aq_methods[]={ { MS_FILTER_SET_SAMPLE_RATE , set_rate },/* not support yet { MS_FILTER_SET_NCHANNELS , set_nchannels },*/ { 0 , NULL }};MSFilterDesc aq_read_desc={ .id=MS_AQ_READ_ID, .name="MSAQRead", .text="Sound capture filter for MacOS X Audio Queue Service", .category=MS_FILTER_OTHER, .ninputs=0, .noutputs=1, .preprocess=aq_read_preprocess, .process=aq_read_process, .postprocess=aq_read_postprocess, .methods=aq_methods};MSFilterDesc aq_write_desc={ .id=MS_AQ_WRITE_ID, .name="MSAQWrite", .text="Sound playback filter for MacOS X Audio Queue Service", .category=MS_FILTER_OTHER, .ninputs=1, .noutputs=0, .preprocess=aq_write_preprocess, .process=aq_write_process, .postprocess=aq_write_postprocess, .methods=aq_methods};MSFilter *ms_aq_read_new(MSSndCard *card){ ms_debug("ms_aq_read_new"); MSFilter *f=ms_filter_new_from_desc(&aq_read_desc); f->data=card; return f;}MSFilter *ms_aq_write_new(MSSndCard *card){ ms_debug("ms_aq_write_new"); MSFilter *f=ms_filter_new_from_desc(&aq_write_desc); f->data=card; return f;}MS_FILTER_DESC_EXPORT(aq_read_desc)MS_FILTER_DESC_EXPORT(aq_write_desc)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -