⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aqsnd.c

📁 基于osip、eXosip、speex、ffmpeg的VoIP源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
								   &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 + -