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

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

?? dsound.c

?? 基于sip協議的網絡電話源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
	if (rc == WAIT_OBJECT_0) {	    if (events[0] == strm->play_strm.hEvent)		signalled_dir = PJMEDIA_DIR_PLAYBACK;	    else		signalled_dir = PJMEDIA_DIR_CAPTURE;	} else {	    if (events[1] == strm->play_strm.hEvent)		signalled_dir = PJMEDIA_DIR_PLAYBACK;	    else		signalled_dir = PJMEDIA_DIR_CAPTURE;	}	if (signalled_dir == PJMEDIA_DIR_PLAYBACK) {	    	    struct dsound_stream *dsound_strm;	    /*	     * DirectSound has requested us to feed some frames to	     * playback buffer.	     */	    dsound_strm = &strm->play_strm;	    status = PJ_SUCCESS;	    /* Get frame from application. */	    status = (*strm->play_cb)(strm->user_data, 				      dsound_strm->timestamp.u32.lo,				      strm->buffer,				      bytes_per_frame);	    if (status != PJ_SUCCESS)		break;	    /* Write to DirectSound buffer. */	    AppWriteDataToBuffer( dsound_strm->ds.play.lpDsBuffer, 				  dsound_strm->dwBytePos,				  (LPBYTE)strm->buffer, 				  bytes_per_frame);	    /* Increment position. */	    dsound_strm->dwBytePos += bytes_per_frame;	    if (dsound_strm->dwBytePos >= dsound_strm->dwDsBufferSize)		dsound_strm->dwBytePos -= dsound_strm->dwDsBufferSize;	    dsound_strm->timestamp.u64 += strm->samples_per_frame;	} else {	    /*	     * DirectSound has indicated that it has some frames ready	     * in the capture buffer. Get as much frames as possible to	     * prevent overflows.	     */	    struct dsound_stream *dsound_strm;	    BOOL rc;	    dsound_strm = &strm->rec_strm;	    do {		/* Capture from DirectSound buffer. */		rc = AppReadDataFromBuffer(dsound_strm->ds.capture.lpDsBuffer, 					   dsound_strm->dwBytePos,					   (LPBYTE)strm->buffer, 					   bytes_per_frame);				if (!rc) {		    pj_bzero(strm->buffer, bytes_per_frame);		} 		/* Call callback */		status = (*strm->rec_cb)(strm->user_data, 					 dsound_strm->timestamp.u32.lo, 					 strm->buffer, 					 bytes_per_frame);		/* Quit thread on error. */		if (status != PJ_SUCCESS)		    goto on_error;		/* Increment position. */		dsound_strm->dwBytePos += bytes_per_frame;		if (dsound_strm->dwBytePos >= dsound_strm->dwDsBufferSize)		    dsound_strm->dwBytePos -= dsound_strm->dwDsBufferSize;		dsound_strm->timestamp.u64 += strm->samples_per_frame;		/* Fetch while we have more than 1 frame */	    } while (dsound_captured_size(dsound_strm) > bytes_per_frame);	}    }on_error:    PJ_LOG(5,(THIS_FILE, "DirectSound: thread stopping.."));    return 0;}/* DirectSound enum device callback */static BOOL CALLBACK DSEnumCallback( LPGUID lpGuid, LPCSTR lpcstrDescription,  				     LPCSTR lpcstrModule, LPVOID lpContext){    unsigned index, max = sizeof(dev_info[index].info.name);    pj_bool_t is_capture_device = (lpContext != NULL);    PJ_UNUSED_ARG(lpcstrModule);    /* Put the capture and playback of the same devices to the same      * dev_info item, by looking at the GUID.     */    for (index=0; index<dev_count; ++index) {	if (dev_info[index].lpGuid == lpGuid)	    break;    }    if (index == dev_count)	++dev_count;    else if (dev_count >= MAX_HARDWARE) {	pj_assert(!"Too many DirectSound hardware found");	PJ_LOG(4,(THIS_FILE, "Too many hardware found, some devices will "			     "not be listed"));	return FALSE;    }    strncpy(dev_info[index].info.name, lpcstrDescription, max);    dev_info[index].info.name[max-1] = '\0';    dev_info[index].lpGuid = lpGuid;    dev_info[index].info.default_samples_per_sec = 44100;        /* Just assumed that device supports stereo capture/playback */    if (is_capture_device)	dev_info[index].info.input_count+=2;    else	dev_info[index].info.output_count+=2;    return TRUE;}/* * Init sound library. */PJ_DEF(pj_status_t) pjmedia_snd_init(pj_pool_factory *factory){    HRESULT hr;    unsigned i;    pool_factory = factory;    /* Enumerate sound playback devices */    hr = DirectSoundEnumerate(&DSEnumCallback, NULL);    if (FAILED(hr))	return PJ_RETURN_OS_ERROR(hr);    /* Enumerate sound capture devices */    hr = DirectSoundCaptureEnumerate(&DSEnumCallback, (void*)1);    if (FAILED(hr))	return PJ_RETURN_OS_ERROR(hr);    PJ_LOG(4,(THIS_FILE, "DirectSound initialized, found %d devices:",	      dev_count));    for (i=0; i<dev_count; ++i) {	PJ_LOG(4,(THIS_FILE, " dev_id %d: %s  (in=%d, out=%d)", 		  i, dev_info[i].info.name, 		  dev_info[i].info.input_count, 		  dev_info[i].info.output_count));    }    return PJ_SUCCESS;}/* * Deinitialize sound library. */PJ_DEF(pj_status_t) pjmedia_snd_deinit(void){    return PJ_SUCCESS;}/* * Get device count. */PJ_DEF(int) pjmedia_snd_get_dev_count(void){    return dev_count;}/* * Get device info. */PJ_DEF(const pjmedia_snd_dev_info*) pjmedia_snd_get_dev_info(unsigned index){    if (index == (unsigned)-1) 	index = 0;    PJ_ASSERT_RETURN(index < dev_count, NULL);    return &dev_info[index].info;}/* * Open stream. */static pj_status_t open_stream( pjmedia_dir dir,			        int rec_id,				int play_id,				unsigned clock_rate,				unsigned channel_count,				unsigned samples_per_frame,				unsigned bits_per_sample,				pjmedia_snd_rec_cb rec_cb,				pjmedia_snd_play_cb play_cb,				void *user_data,				pjmedia_snd_stream **p_snd_strm){    pj_pool_t *pool;    pjmedia_snd_stream *strm;    pj_status_t status;    /* Make sure sound subsystem has been initialized with     * pjmedia_snd_init()     */    PJ_ASSERT_RETURN( pool_factory != NULL, PJ_EINVALIDOP );    /* Can only support 16bits per sample */    PJ_ASSERT_RETURN(bits_per_sample == BITS_PER_SAMPLE, PJ_EINVAL);    /* Create and Initialize stream descriptor */    pool = pj_pool_create(pool_factory, "dsound-dev", 1000, 1000, NULL);    PJ_ASSERT_RETURN(pool != NULL, PJ_ENOMEM);    strm = pj_pool_zalloc(pool, sizeof(pjmedia_snd_stream));    strm->dir = dir;    strm->play_id = play_id;    strm->rec_id = rec_id;    strm->pool = pool;    strm->rec_cb = rec_cb;    strm->play_cb = play_cb;    strm->user_data = user_data;    strm->clock_rate = clock_rate;    strm->samples_per_frame = samples_per_frame;    strm->bits_per_sample = bits_per_sample;    strm->channel_count = channel_count;    strm->buffer = pj_pool_alloc(pool, samples_per_frame * BYTES_PER_SAMPLE);    if (!strm->buffer) {	pj_pool_release(pool);	return PJ_ENOMEM;    }    /* Create player stream */    if (dir & PJMEDIA_DIR_PLAYBACK) {	status = init_player_stream( &strm->play_strm, play_id, clock_rate,				     channel_count, samples_per_frame,				     DEFAULT_BUFFER_COUNT );	if (status != PJ_SUCCESS) {	    pjmedia_snd_stream_close(strm);	    return status;	}    }    /* Create capture stream */    if (dir & PJMEDIA_DIR_CAPTURE) {	status = init_capture_stream( &strm->rec_strm, rec_id, clock_rate,				      channel_count, samples_per_frame,				      DEFAULT_BUFFER_COUNT);	if (status != PJ_SUCCESS) {	    pjmedia_snd_stream_close(strm);	    return status;	}    }    /* Create and start the thread */    status = pj_thread_create(pool, "dsound", &dsound_dev_thread, strm,			      0, 0, &strm->thread);    if (status != PJ_SUCCESS) {	pjmedia_snd_stream_close(strm);	return status;    }    *p_snd_strm = strm;    return PJ_SUCCESS;}/* * Open stream. */PJ_DEF(pj_status_t) pjmedia_snd_open_rec( int index,					  unsigned clock_rate,					  unsigned channel_count,					  unsigned samples_per_frame,					  unsigned bits_per_sample,					  pjmedia_snd_rec_cb rec_cb,					  void *user_data,					  pjmedia_snd_stream **p_snd_strm){    PJ_ASSERT_RETURN(rec_cb && p_snd_strm, PJ_EINVAL);    return open_stream( PJMEDIA_DIR_CAPTURE, index, -1,			clock_rate, channel_count, samples_per_frame,			bits_per_sample, rec_cb, NULL, user_data,			p_snd_strm);}PJ_DEF(pj_status_t) pjmedia_snd_open_player( int index,					unsigned clock_rate,					unsigned channel_count,					unsigned samples_per_frame,					unsigned bits_per_sample,					pjmedia_snd_play_cb play_cb,					void *user_data,					pjmedia_snd_stream **p_snd_strm){    PJ_ASSERT_RETURN(play_cb && p_snd_strm, PJ_EINVAL);    return open_stream( PJMEDIA_DIR_PLAYBACK, -1, index,			clock_rate, channel_count, samples_per_frame,			bits_per_sample, NULL, play_cb, user_data,			p_snd_strm);}/* * Open both player and recorder. */PJ_DEF(pj_status_t) pjmedia_snd_open( int rec_id,				      int play_id,				      unsigned clock_rate,				      unsigned channel_count,				      unsigned samples_per_frame,				      unsigned bits_per_sample,				      pjmedia_snd_rec_cb rec_cb,				      pjmedia_snd_play_cb play_cb,				      void *user_data,				      pjmedia_snd_stream **p_snd_strm){    PJ_ASSERT_RETURN(rec_cb && play_cb && p_snd_strm, PJ_EINVAL);    return open_stream( PJMEDIA_DIR_CAPTURE_PLAYBACK, rec_id, play_id,			clock_rate, channel_count, samples_per_frame,			bits_per_sample, rec_cb, play_cb, user_data,			p_snd_strm );}/* * Get stream info. */PJ_DEF(pj_status_t) pjmedia_snd_stream_get_info(pjmedia_snd_stream *strm,						pjmedia_snd_stream_info *pi){    PJ_ASSERT_RETURN(strm && pi, PJ_EINVAL);    pj_bzero(pi, sizeof(*pi));    pi->dir = strm->dir;    pi->play_id = strm->play_id;    pi->rec_id = strm->rec_id;    pi->clock_rate = strm->clock_rate;    pi->channel_count = strm->channel_count;    pi->samples_per_frame = strm->samples_per_frame;    pi->bits_per_sample = strm->bits_per_sample;    pi->rec_latency = 0;    pi->play_latency = 0;    return PJ_SUCCESS;}/* * Start stream. */PJ_DEF(pj_status_t) pjmedia_snd_stream_start(pjmedia_snd_stream *stream){    HRESULT hr;    PJ_UNUSED_ARG(stream);    if (stream->play_strm.ds.play.lpDsBuffer) {	hr = IDirectSoundBuffer_Play(stream->play_strm.ds.play.lpDsBuffer, 				     0, 0, DSBPLAY_LOOPING);	if (FAILED(hr))	    return PJ_RETURN_OS_ERROR(hr);	PJ_LOG(5,(THIS_FILE, "DirectSound playback stream started"));    }        if (stream->rec_strm.ds.capture.lpDsBuffer) {	hr = IDirectSoundCaptureBuffer_Start(stream->rec_strm.ds.capture.lpDsBuffer,					     DSCBSTART_LOOPING );	if (FAILED(hr))	    return PJ_RETURN_OS_ERROR(hr);	PJ_LOG(5,(THIS_FILE, "DirectSound capture stream started"));    }    return PJ_SUCCESS;}/* * Stop stream. */PJ_DEF(pj_status_t) pjmedia_snd_stream_stop(pjmedia_snd_stream *stream){    PJ_ASSERT_RETURN(stream != NULL, PJ_EINVAL);    if (stream->play_strm.ds.play.lpDsBuffer) {	PJ_LOG(5,(THIS_FILE, "Stopping DirectSound playback stream"));	IDirectSoundBuffer_Stop( stream->play_strm.ds.play.lpDsBuffer );    }    if (stream->rec_strm.ds.capture.lpDsBuffer) {	PJ_LOG(5,(THIS_FILE, "Stopping DirectSound capture stream"));	IDirectSoundCaptureBuffer_Stop(stream->rec_strm.ds.capture.lpDsBuffer);    }    return PJ_SUCCESS;}/* * Destroy stream. */PJ_DEF(pj_status_t) pjmedia_snd_stream_close(pjmedia_snd_stream *stream){    PJ_ASSERT_RETURN(stream != NULL, PJ_EINVAL);    pjmedia_snd_stream_stop(stream);    if (stream->thread) {	stream->thread_quit_flag = 1;	pj_thread_join(stream->thread);	pj_thread_destroy(stream->thread);	stream->thread = NULL;    }    if (stream->play_strm.lpDsNotify) {	IDirectSoundNotify_Release( stream->play_strm.lpDsNotify );	stream->play_strm.lpDsNotify = NULL;    }        if (stream->play_strm.hEvent) {	CloseHandle(stream->play_strm.hEvent);	stream->play_strm.hEvent = NULL;    }    if (stream->play_strm.ds.play.lpDsBuffer) {	IDirectSoundBuffer_Release( stream->play_strm.ds.play.lpDsBuffer );	stream->play_strm.ds.play.lpDsBuffer = NULL;    }    if (stream->play_strm.ds.play.lpDs) {	IDirectSound_Release( stream->play_strm.ds.play.lpDs );	stream->play_strm.ds.play.lpDs = NULL;    }    if (stream->rec_strm.lpDsNotify) {	IDirectSoundNotify_Release( stream->rec_strm.lpDsNotify );	stream->rec_strm.lpDsNotify = NULL;    }        if (stream->rec_strm.hEvent) {	CloseHandle(stream->rec_strm.hEvent);	stream->rec_strm.hEvent = NULL;    }    if (stream->rec_strm.ds.capture.lpDsBuffer) {	IDirectSoundCaptureBuffer_Release( stream->rec_strm.ds.capture.lpDsBuffer );	stream->rec_strm.ds.capture.lpDsBuffer = NULL;    }    if (stream->rec_strm.ds.capture.lpDs) {	IDirectSoundCapture_Release( stream->rec_strm.ds.capture.lpDs );	stream->rec_strm.ds.capture.lpDs = NULL;    }    pj_pool_release(stream->pool);    return PJ_SUCCESS;}#endif	/* PJMEDIA_SOUND_IMPLEMENTATION */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲乱码中文字幕综合| 亚洲一区在线观看免费| 97久久精品人人爽人人爽蜜臀| 一区二区三区日韩欧美精品| 精品国产91久久久久久久妲己 | 久久se这里有精品| 亚洲欧洲日韩av| 精品精品欲导航| 欧美日韩中文国产| av电影一区二区| 国产综合色在线视频区| 亚洲一二三级电影| 亚洲视频香蕉人妖| 久久久久久久久久久99999| 欧美一区二区三区免费在线看| 色香色香欲天天天影视综合网| 国产成人亚洲综合色影视| 日本一区中文字幕| 一区二区在线观看av| 国产精品热久久久久夜色精品三区| 欧美一级黄色片| 欧美精品 日韩| 欧美午夜精品一区二区三区| 91久久精品一区二区| av资源站一区| 成人在线综合网| 国产成人午夜精品5599| 久久国产精品无码网站| 日本午夜一本久久久综合| 亚洲午夜久久久久| 一区二区三区四区亚洲| 亚洲男帅同性gay1069| 国产精品久久久久一区二区三区| 久久久99免费| 久久久久久久电影| 国产区在线观看成人精品| 久久精品水蜜桃av综合天堂| 精品福利一区二区三区免费视频| 欧美一级午夜免费电影| 日韩一区二区在线免费观看| 日韩欧美国产不卡| 26uuu国产在线精品一区二区| 欧美mv和日韩mv的网站| 337p日本欧洲亚洲大胆色噜噜| 日韩精品一区在线| 26uuu亚洲综合色| 久久久精品免费免费| 国产精品理论片在线观看| 最新日韩av在线| 亚洲最新视频在线观看| 亚洲国产一区视频| 日韩av一区二| 韩国精品一区二区| 成人精品国产福利| 91视频com| 欧美色手机在线观看| 欧美精品高清视频| 精品国产一区二区三区久久久蜜月| 精品久久久久久最新网址| 国产日韩视频一区二区三区| 国产精品不卡一区二区三区| 亚洲综合一区二区| 日本vs亚洲vs韩国一区三区二区 | 成人av电影在线播放| 99在线热播精品免费| 欧美影片第一页| 91精品国产一区二区三区蜜臀 | 天天av天天翘天天综合网色鬼国产 | 国产精品视频看| 亚洲伦理在线精品| 蜜臀久久久久久久| 成人黄色综合网站| 欧美日韩免费高清一区色橹橹| 日韩美女视频一区二区在线观看| 欧美激情在线一区二区三区| 亚洲国产日韩在线一区模特| 蜜臀va亚洲va欧美va天堂| 成人看片黄a免费看在线| 在线观看中文字幕不卡| 欧美mv和日韩mv的网站| 亚洲欧美偷拍另类a∨色屁股| 日韩激情在线观看| 国产aⅴ精品一区二区三区色成熟| 在线观看三级视频欧美| 久久久久久久久久久黄色| 一区二区三区欧美激情| 久久99精品一区二区三区| 91小视频免费看| 日韩你懂的电影在线观看| 国产精品久久久久久久久久免费看| 亚洲成a人v欧美综合天堂下载 | 2021中文字幕一区亚洲| 综合久久给合久久狠狠狠97色| 日韩电影一区二区三区四区| 成人国产精品免费观看视频| 日韩欧美国产三级| 夜夜操天天操亚洲| www.亚洲国产| 久久一区二区三区四区| 偷拍一区二区三区四区| 色综合中文字幕| 国产午夜精品福利| 日韩av网站免费在线| 91麻豆视频网站| 久久蜜桃av一区精品变态类天堂| 午夜私人影院久久久久| 色婷婷久久久综合中文字幕| 欧美—级在线免费片| 极品尤物av久久免费看| 欧美高清你懂得| 亚洲午夜久久久久久久久电影网| 成人激情午夜影院| 国产视频视频一区| 极品少妇xxxx精品少妇| 制服丝袜一区二区三区| 亚洲精品第一国产综合野| 粉嫩欧美一区二区三区高清影视| 日韩欧美国产系列| 日韩在线卡一卡二| 欧美日韩视频在线第一区| 亚洲人成影院在线观看| 成人免费毛片aaaaa**| 久久综合久久综合九色| 免费看日韩a级影片| 69久久夜色精品国产69蝌蚪网| 亚洲一区二区三区四区在线免费观看| 不卡av免费在线观看| 国产精品国产a级| 成人一道本在线| 日本一区二区电影| 风间由美一区二区av101 | 国产精品色一区二区三区| 国模一区二区三区白浆| 日韩欧美www| 久久99国内精品| 亚洲精品一区在线观看| 久久精工是国产品牌吗| 精品人伦一区二区色婷婷| 狠狠狠色丁香婷婷综合激情| 精品国产乱码久久久久久浪潮| 久久99精品久久久久久国产越南| 日韩美女在线视频| 国产精品自产自拍| 国产欧美一区二区三区鸳鸯浴| 国产高清不卡一区| 国产精品美女久久久久久久久久久 | 国产99久久久国产精品| 欧美激情在线免费观看| 97se亚洲国产综合自在线观| 国产精品第四页| 色播五月激情综合网| 亚洲一区二区三区在线看| 在线不卡的av| 久久99精品国产91久久来源| 国产性色一区二区| 91猫先生在线| 日本伊人色综合网| 久久久亚洲高清| 99精品国产91久久久久久| 亚洲一区二区三区影院| 日韩欧美国产一二三区| 国产成人综合精品三级| 亚洲精品伦理在线| 欧美久久一二区| 精品一区二区三区欧美| 亚洲国产高清aⅴ视频| 色婷婷综合久久久久中文一区二区 | 成人午夜电影小说| 一区二区免费在线播放| 日韩欧美123| 99国产精品久久| 国产精品99久久久久久有的能看| 久久精品一区蜜桃臀影院| 91国偷自产一区二区开放时间 | 美女看a上一区| 国产精品欧美久久久久无广告 | 欧美v国产在线一区二区三区| 国产成人精品免费一区二区| 亚洲精品高清在线| 精品国产免费一区二区三区四区| 成人av动漫在线| 美女久久久精品| 一区二区视频在线看| 精品国产sm最大网站免费看| 一本到不卡免费一区二区| 精品一区二区三区视频在线观看| 中文字幕一区在线观看视频| 91精品国产色综合久久| 不卡欧美aaaaa| 麻豆成人综合网| 亚洲激情综合网| 国产亚洲综合av| 欧美日韩国产在线观看| 成人午夜电影小说| 黄色日韩网站视频| 亚洲午夜久久久久久久久电影网 | 亚洲综合偷拍欧美一区色| 久久久久久久久久电影| 欧美高清精品3d| 91丨九色丨尤物|