亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? audio_macosx.c

?? mpg123 是 MPEG 1.0/2.0/2.5 的實時播放軟件
?? C
字號:
/*	audio_macosx: audio output on MacOS X	copyright ?-2006 by the mpg123 project - free software under the terms of the GPL 2	see COPYING and AUTHORS files in distribution or http://mpg123.de	initially written by Guillaume Outters	modified by Nicholas J Humfrey to use SFIFO code	modified by Taihei Monma to use AudioUnit and AudioConverter APIs*/#include "config.h"#include "debug.h"#include "sfifo.h"#include "mpg123.h"#include <CoreServices/CoreServices.h>#include <AudioUnit/AudioUnit.h>#include <AudioToolbox/AudioToolbox.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#define FIFO_DURATION		(0.5f)struct anEnv{	AudioConverterRef converter;	AudioUnit outputUnit;	char play;	int channels;	int last_buffer;	int play_done;	int decode_done;		/* Convertion buffer */	unsigned char * buffer;	size_t buffer_size;		/* Ring buffer */	sfifo_t fifo;};static struct anEnv *env=NULL;static OSStatus playProc(AudioConverterRef inAudioConverter,						 UInt32 *ioNumberDataPackets,                         AudioBufferList *outOutputData,                         AudioStreamPacketDescription **outDataPacketDescription,                         void* inClientData){	long n;		if(env->last_buffer) {		env->play_done = 1;		return noErr;	}		for(n = 0; n < outOutputData->mNumberBuffers; n++)	{		unsigned int wanted = *ioNumberDataPackets * env->channels * 2;		unsigned char *dest;		unsigned int read;		if(env->buffer_size < wanted) {			debug1("Allocating %d byte sample conversion buffer", wanted);			env->buffer = realloc( env->buffer, wanted);			env->buffer_size = wanted;		}		dest = env->buffer;				/* Only play if we have data left */		if ( sfifo_used( &env->fifo ) < wanted ) {			if(!env->decode_done) {				warning("Didn't have any audio data in callback (buffer underflow)");				return -1;			}			wanted = sfifo_used( &env->fifo );			env->last_buffer = 1;		}				/* Read audio from FIFO to SDL's buffer */		read = sfifo_read( &env->fifo, dest, wanted );				if (wanted!=read)			warning2("Error reading from the ring buffer (wanted=%u, read=%u).\n", wanted, read);				outOutputData->mBuffers[n].mDataByteSize = read;		outOutputData->mBuffers[n].mData = dest;	}		return noErr; }static OSStatus convertProc(void *inRefCon, AudioUnitRenderActionFlags *inActionFlags,                            const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber,                            UInt32 inNumFrames, AudioBufferList *ioData){	OSStatus err= noErr;	void *inInputDataProcUserData=NULL;	AudioStreamPacketDescription* outPacketDescription =NULL;		err = AudioConverterFillComplexBuffer(env->converter, playProc, inInputDataProcUserData, &inNumFrames, ioData, outPacketDescription);		return err;}int audio_open(struct audio_info_struct *ai){	UInt32 size;	ComponentDescription desc;	Component comp;	AudioStreamBasicDescription inFormat;	AudioStreamBasicDescription outFormat;	AURenderCallbackStruct  renderCallback;	Boolean outWritable;		/* Allocate memory for data structure */	if (!env) {		env = (struct anEnv*)malloc( sizeof( struct anEnv ) );		if (!env) {			error("failed to malloc memory for 'struct anEnv'");			return -1;		}	}	/* Initialize our environment */	env->play = 0;	env->buffer = NULL;	env->buffer_size = 0;	env->last_buffer = 0;	env->play_done = 0;	env->decode_done = 0;		/* Get the default audio output unit */	desc.componentType = kAudioUnitType_Output; 	desc.componentSubType = kAudioUnitSubType_DefaultOutput;	desc.componentManufacturer = kAudioUnitManufacturer_Apple;	desc.componentFlags = 0;	desc.componentFlagsMask = 0;	comp = FindNextComponent(NULL, &desc);	if(comp == NULL) {		error("FindNextComponent failed");		return(-1);	}		if(OpenAComponent(comp, &(env->outputUnit)))  {		error("OpenAComponent failed");		return (-1);	}		if(AudioUnitInitialize(env->outputUnit)) {		error("AudioUnitInitialize failed");		return (-1);	}		/* Specify the output PCM format */	AudioUnitGetPropertyInfo(env->outputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &size, &outWritable);	if(AudioUnitGetProperty(env->outputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &outFormat, &size)) {		error("AudioUnitGetProperty(kAudioUnitProperty_StreamFormat) failed");		return (-1);	}		if(AudioUnitSetProperty(env->outputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outFormat, size)) {		error("AudioUnitSetProperty(kAudioUnitProperty_StreamFormat) failed");		return (-1);	}		/* Specify the input PCM format */	env->channels = ai->channels;	inFormat.mSampleRate = ai->rate;	inFormat.mChannelsPerFrame = ai->channels;	inFormat.mBitsPerChannel = 16;	inFormat.mBytesPerPacket = 2*inFormat.mChannelsPerFrame;	inFormat.mFramesPerPacket = 1;	inFormat.mBytesPerFrame = 2*inFormat.mChannelsPerFrame;	inFormat.mFormatID = kAudioFormatLinearPCM;#ifdef _BIG_ENDIAN	inFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsBigEndian;#else	inFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;#endif				/* Add our callback - but don't start it yet */	memset(&renderCallback, 0, sizeof(AURenderCallbackStruct));	renderCallback.inputProc = convertProc;	renderCallback.inputProcRefCon = 0;	if(AudioUnitSetProperty(env->outputUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &renderCallback, sizeof(AURenderCallbackStruct))) {		error("AudioUnitSetProperty(kAudioUnitProperty_SetRenderCallback) failed");		return(-1);	}			/* Open an audio I/O stream and create converter */	if (ai->rate > 0 && ai->channels >0 ) {		int ringbuffer_len;		if(AudioConverterNew(&inFormat, &outFormat, &(env->converter))) {			error("AudioConverterNew failed");			return(-1);		}		if(ai->channels == 1) {			SInt32 channelMap[2] = { 0, 0 };			if(AudioConverterSetProperty(env->converter, kAudioConverterChannelMap, sizeof(channelMap), channelMap)) {				error("AudioConverterSetProperty(kAudioConverterChannelMap) failed");				return(-1);			}		}				/* Initialise FIFO */		ringbuffer_len = ai->rate * FIFO_DURATION * sizeof(short) *ai->channels;		debug2( "Allocating %d byte ring-buffer (%f seconds)", ringbuffer_len, (float)FIFO_DURATION);		sfifo_init( &env->fifo, ringbuffer_len );									   	}		return(0);}int audio_get_formats(struct audio_info_struct *ai){	/* Only support Signed 16-bit output */	return AUDIO_FORMAT_SIGNED_16;}int audio_play_samples(struct audio_info_struct *ai, unsigned char *buf, int len){	int written;	/* If there is no room, then sleep for half the length of the FIFO */	while (sfifo_space( &env->fifo ) < len ) {		usleep( (FIFO_DURATION/2) * 1000000 );	}		/* Store converted audio in ring buffer */	written = sfifo_write( &env->fifo, (char*)buf, len);	if (written != len) {		warning( "Failed to write audio to ring buffer" );		return -1;	}		/* Start playback now that we have something to play */	if(!env->play)	{		if(AudioOutputUnitStart(env->outputUnit)) {			error("AudioOutputUnitStart failed");			return(-1);		}		env->play = 1;	}		return len;}int audio_close(struct audio_info_struct *ai){	if (env) {		env->decode_done = 1;		while(!env->play_done && env->play) usleep(10000);				/* No matter the error code, we want to close it (by brute force if necessary) */		AudioConverterDispose(env->converter);		AudioOutputUnitStop(env->outputUnit);		AudioUnitUninitialize(env->outputUnit);		CloseComponent(env->outputUnit);		    /* Free the ring buffer */		sfifo_close( &env->fifo );				/* Free the conversion buffer */		if (env->buffer) free( env->buffer );				/* Free environment data structure */		free(env);		env=NULL;	}		return 0;}void audio_queueflush(struct audio_info_struct *ai){	/* Stop playback */	if(AudioOutputUnitStop(env->outputUnit)) {		error("AudioOutputUnitStop failed");	}	env->play=0;		/* Empty out the ring buffer */	sfifo_flush( &env->fifo );	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人丝袜美腿| 午夜不卡av免费| 精品国产免费人成电影在线观看四季 | 天天操天天色综合| 亚洲人成精品久久久久久| 中文字幕av一区二区三区高| 久久综合久色欧美综合狠狠| 精品国产一区a| 国产亚洲综合性久久久影院| 国产欧美精品一区aⅴ影院| 久久久亚洲精品一区二区三区| 欧美一级精品在线| 337p粉嫩大胆噜噜噜噜噜91av| www久久久久| 中文乱码免费一区二区| 亚洲欧洲av另类| 亚洲午夜久久久久中文字幕久| 亚洲国产综合人成综合网站| 日韩专区在线视频| 国产一区美女在线| 97久久超碰国产精品| 欧美揉bbbbb揉bbbbb| 日韩欧美国产麻豆| 国产精品毛片无遮挡高清| 樱花影视一区二区| 六月婷婷色综合| 91免费版pro下载短视频| 欧美三级韩国三级日本三斤| 久久综合久久综合亚洲| 亚洲免费大片在线观看| 日本中文在线一区| 成人免费观看av| 在线不卡中文字幕| 国产精品麻豆久久久| 亚洲成av人**亚洲成av**| 国产一区在线看| 色国产综合视频| 精品国内二区三区| 亚洲一区二区三区在线| 国产黄色精品网站| 欧美午夜影院一区| 中文字幕 久热精品 视频在线| 午夜亚洲福利老司机| 成人亚洲一区二区一| 欧美一级在线观看| 一区二区三区欧美亚洲| 国产精品综合视频| 51精品秘密在线观看| 一色桃子久久精品亚洲| 精品一区二区三区蜜桃| 欧美亚洲日本国产| 国产精品的网站| 国产福利精品一区| 日韩视频不卡中文| 午夜国产精品一区| 91老师国产黑色丝袜在线| 久久看人人爽人人| 精品无人码麻豆乱码1区2区| 欧美视频三区在线播放| 中文字幕人成不卡一区| 懂色av一区二区在线播放| 日韩一区二区影院| 日韩福利视频导航| 欧美日韩免费一区二区三区 | 国产成人av电影免费在线观看| 欧美日韩和欧美的一区二区| 亚洲欧美综合色| 99久久精品免费观看| 国产欧美日本一区视频| 国产一区二区精品久久99| 欧美一级日韩免费不卡| 亚洲不卡av一区二区三区| 91精品福利视频| 一区二区三区高清在线| 色中色一区二区| 一区二区三区欧美在线观看| 色综合久久久久久久久| 亚洲激情网站免费观看| 97久久超碰精品国产| 亚洲日本在线天堂| 欧洲中文字幕精品| 亚洲国产aⅴ成人精品无吗| 欧美日韩一本到| 日本亚洲最大的色成网站www| 91麻豆精品国产91久久久使用方法| 午夜视频在线观看一区二区三区 | 首页国产欧美日韩丝袜| 911精品国产一区二区在线| 日本大胆欧美人术艺术动态| 欧美一区二区三区视频在线| 麻豆精品国产91久久久久久| 精品国产免费一区二区三区四区 | 国产成人免费视| 国产精品国产自产拍高清av王其 | 亚洲mv大片欧洲mv大片精品| 51久久夜色精品国产麻豆| 久久爱另类一区二区小说| 精品久久免费看| www.欧美色图| 视频一区中文字幕国产| 日韩欧美国产三级电影视频| 国产91富婆露脸刺激对白| 亚洲天天做日日做天天谢日日欢 | 欧美高清视频在线高清观看mv色露露十八| 色综合 综合色| 亚洲 欧美综合在线网络| 日韩午夜激情免费电影| 国产精品一区在线观看乱码| 一区二区三区中文字幕在线观看| 欧美理论电影在线| 成人免费高清在线| 亚洲成av人**亚洲成av**| 久久精品一区二区三区不卡 | 5月丁香婷婷综合| jlzzjlzz亚洲日本少妇| 日韩精品三区四区| 亚洲欧美日韩中文字幕一区二区三区 | 国产91高潮流白浆在线麻豆| 一区2区3区在线看| 国产欧美日韩在线看| 欧美日韩精品一区二区三区蜜桃| 国产中文字幕精品| 五月天亚洲精品| 中文字幕av在线一区二区三区| 欧美挠脚心视频网站| 99久久国产免费看| 国精产品一区一区三区mba视频| 亚洲欧美日韩国产中文在线| 久久综合久色欧美综合狠狠| 欧美日韩免费在线视频| 色综合天天综合在线视频| 国模无码大尺度一区二区三区 | 91麻豆精品国产自产在线| 91在线云播放| 国产成人av电影在线| 久久精品国产精品青草| 午夜影院久久久| 一区二区三区欧美在线观看| 日本一区二区三区国色天香| 欧美本精品男人aⅴ天堂| 欧美人牲a欧美精品| 欧洲另类一二三四区| 99久久精品国产一区二区三区| 国产一区二区三区免费| 美女视频一区在线观看| 蜜臀久久99精品久久久久久9| 亚洲国产一二三| 亚洲成人www| 亚洲一区中文日韩| 亚洲精品视频在线看| 亚洲啪啪综合av一区二区三区| 中文av字幕一区| 国产欧美精品在线观看| 国产精品美女久久福利网站| 欧美激情一区在线| 国产精品美女www爽爽爽| 国产精品久久久久久久久免费丝袜| 日本一区二区三区久久久久久久久不| 国产亚洲美州欧州综合国| 国产日韩欧美精品一区| 日本一区二区电影| 中文字幕一区二区三区色视频| 国产精品人妖ts系列视频| 亚洲欧美另类综合偷拍| 夜夜操天天操亚洲| 日韩一区精品字幕| 亚洲线精品一区二区三区| 日日噜噜夜夜狠狠视频欧美人| 看国产成人h片视频| 国产乱码一区二区三区| 99视频精品免费视频| 欧美日韩免费不卡视频一区二区三区| 欧美日韩久久久| 亚洲精品一区二区三区99 | 91亚洲国产成人精品一区二三| 99v久久综合狠狠综合久久| 欧美午夜在线观看| 精品美女一区二区三区| 日本一区二区电影| 日韩和欧美一区二区三区| 国产综合久久久久久鬼色| 成人激情图片网| 欧美日韩在线综合| 久久精品在线免费观看| 一区二区三区欧美激情| 久久99久久99小草精品免视看| 国产成人精品影院| 欧美日韩国产另类一区| www国产亚洲精品久久麻豆| 亚洲免费av观看| 精油按摩中文字幕久久| 成人ar影院免费观看视频| 制服丝袜av成人在线看| 国产精品情趣视频| 日韩国产在线观看一区| 99视频热这里只有精品免费| 欧美成人性福生活免费看| 亚洲精品国产品国语在线app| 美女一区二区三区| 欧美亚洲高清一区|