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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dsound.c

?? 基于sip協(xié)議的網(wǎng)絡(luò)電話源碼
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/* $Id: dsound.c 974 2007-02-19 01:13:53Z bennylp $ *//*  * Copyright (C) 2003-2007 Benny Prijono <benny@prijono.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  */#include <pjmedia/sound.h>#include <pjmedia/errno.h>#include <pj/assert.h>#include <pj/log.h>#include <pj/os.h>#include <pj/string.h>#if PJMEDIA_SOUND_IMPLEMENTATION == PJMEDIA_SOUND_WIN32_DIRECT_SOUND#ifdef _MSC_VER#   pragma warning(push, 3)#endif#include <windows.h>#include <mmsystem.h>#include <dsound.h>#ifdef _MSC_VER#   pragma warning(pop)#endif#define THIS_FILE	    "dsound.c"#define BITS_PER_SAMPLE	    16#define BYTES_PER_SAMPLE    (BITS_PER_SAMPLE/8)#define MAX_PACKET_BUFFER_COUNT	    PJMEDIA_SOUND_BUFFER_COUNT#define DEFAULT_BUFFER_COUNT	    PJMEDIA_SOUND_BUFFER_COUNT#define MAX_HARDWARE		    16struct dsound_dev_info{    pjmedia_snd_dev_info    info;    LPGUID		    lpGuid;};static unsigned dev_count;static struct dsound_dev_info dev_info[MAX_HARDWARE];/* Individual DirectSound capture/playback stream descriptor */struct dsound_stream{    union     {	struct	{	    LPDIRECTSOUND	    lpDs;	    LPDIRECTSOUNDBUFFER	    lpDsBuffer;	} play;	struct	{	    LPDIRECTSOUNDCAPTURE	lpDs;	    LPDIRECTSOUNDCAPTUREBUFFER	lpDsBuffer;	} capture;    } ds;    HANDLE		    hEvent;    LPDIRECTSOUNDNOTIFY	    lpDsNotify;    DWORD		    dwBytePos;    DWORD		    dwDsBufferSize;    pj_timestamp	    timestamp;};/* Sound stream.    */struct pjmedia_snd_stream{    pjmedia_dir		    dir;		/**< Sound direction.	    */    int			    play_id;		/**< Playback dev id.	    */    int			    rec_id;		/**< Recording dev id.	    */    pj_pool_t		   *pool;		/**< Memory pool.	    */      pjmedia_snd_rec_cb	    rec_cb;		/**< Capture callback.	    */    pjmedia_snd_play_cb	    play_cb;		/**< Playback callback.	    */    void		   *user_data;		/**< Application data.	    */    struct dsound_stream    play_strm;		/**< Playback stream.	    */    struct dsound_stream    rec_strm;		/**< Capture stream.	    */    void		   *buffer;		/**< Temp. frame buffer.    */    unsigned		    clock_rate;		/**< Clock rate.	    */    unsigned		    samples_per_frame;	/**< Samples per frame.	    */    unsigned		    bits_per_sample;	/**< Bits per sample.	    */    unsigned		    channel_count;	/**< Channel count.	    */    pj_thread_t		   *thread;		/**< Thread handle.	    */    pj_bool_t		    thread_quit_flag;	/**< Quit signal to thread  */};static pj_pool_factory *pool_factory;static void init_waveformatex (PCMWAVEFORMAT *pcmwf, 			       unsigned clock_rate,			       unsigned channel_count){    pj_bzero(pcmwf, sizeof(PCMWAVEFORMAT));     pcmwf->wf.wFormatTag = WAVE_FORMAT_PCM;     pcmwf->wf.nChannels = (pj_uint16_t)channel_count;    pcmwf->wf.nSamplesPerSec = clock_rate;    pcmwf->wf.nBlockAlign = (pj_uint16_t)(channel_count * BYTES_PER_SAMPLE);    pcmwf->wf.nAvgBytesPerSec = clock_rate * channel_count * BYTES_PER_SAMPLE;    pcmwf->wBitsPerSample = BITS_PER_SAMPLE;}/* * Initialize DirectSound player device. */static pj_status_t init_player_stream( struct dsound_stream *ds_strm,				       int dev_id,				       unsigned clock_rate,				       unsigned channel_count,				       unsigned samples_per_frame,				       unsigned buffer_count){    HRESULT hr;    HWND hwnd;    PCMWAVEFORMAT pcmwf;     DSBUFFERDESC dsbdesc;    DSBPOSITIONNOTIFY dsPosNotify[MAX_PACKET_BUFFER_COUNT];    unsigned bytes_per_frame;    unsigned i;    PJ_ASSERT_RETURN(buffer_count <= MAX_PACKET_BUFFER_COUNT, PJ_EINVAL);    /* Check device ID */    if (dev_id == -1)	dev_id = 0;    PJ_ASSERT_RETURN(dev_id>=0 && dev_id < (int)dev_count, PJ_EINVAL);    /*     * Create DirectSound device.     */    hr = DirectSoundCreate(dev_info[dev_id].lpGuid, &ds_strm->ds.play.lpDs, 			   NULL);    if (FAILED(hr))	return PJ_RETURN_OS_ERROR(hr);    hwnd = GetForegroundWindow();    if (hwnd == NULL) {	hwnd = GetDesktopWindow();    }        hr = IDirectSound_SetCooperativeLevel( ds_strm->ds.play.lpDs, hwnd, 					   DSSCL_PRIORITY);    if FAILED(hr)	return PJ_RETURN_OS_ERROR(hr);        /*     * Set up wave format structure for initialize DirectSound play     * buffer.      */    init_waveformatex(&pcmwf, clock_rate, channel_count);    bytes_per_frame = samples_per_frame * BYTES_PER_SAMPLE;    /* Set up DSBUFFERDESC structure. */    pj_bzero(&dsbdesc, sizeof(DSBUFFERDESC));     dsbdesc.dwSize = sizeof(DSBUFFERDESC);     dsbdesc.dwFlags = DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPOSITIONNOTIFY |		      DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS;    dsbdesc.dwBufferBytes = buffer_count * bytes_per_frame;    dsbdesc.lpwfxFormat = (LPWAVEFORMATEX)&pcmwf;     /*     * Create DirectSound playback buffer.      */    hr = IDirectSound_CreateSoundBuffer(ds_strm->ds.play.lpDs, &dsbdesc, 					&ds_strm->ds.play.lpDsBuffer, NULL);     if (FAILED(hr) )	return PJ_RETURN_OS_ERROR(hr);    /*     * Create event for play notification.     */    ds_strm->hEvent = CreateEvent( NULL, FALSE, FALSE, NULL);    if (ds_strm->hEvent == NULL)	return pj_get_os_error();    /*     * Setup notification for play.     */    hr = IDirectSoundBuffer_QueryInterface( ds_strm->ds.play.lpDsBuffer, 					    &IID_IDirectSoundNotify, 					    (LPVOID *)&ds_strm->lpDsNotify);     if (FAILED(hr))	return PJ_RETURN_OS_ERROR(hr);        for (i=0; i<buffer_count; ++i) {	dsPosNotify[i].dwOffset = i * bytes_per_frame;	dsPosNotify[i].hEventNotify = ds_strm->hEvent;    }        hr = IDirectSoundNotify_SetNotificationPositions( ds_strm->lpDsNotify, 						      buffer_count, 						      dsPosNotify);    if (FAILED(hr))	return PJ_RETURN_OS_ERROR(hr);    hr = IDirectSoundBuffer_SetCurrentPosition(ds_strm->ds.play.lpDsBuffer, 0);    if (FAILED(hr))	return PJ_RETURN_OS_ERROR(hr);    ds_strm->dwBytePos = 0;    ds_strm->dwDsBufferSize = buffer_count * bytes_per_frame;    ds_strm->timestamp.u64 = 0;    /* Done setting up play device. */    PJ_LOG(5,(THIS_FILE, 	      " DirectSound player \"%s\" initialized (clock_rate=%d, "	      "channel_count=%d, samples_per_frame=%d (%dms))",	      dev_info[dev_id].info.name,	      clock_rate, channel_count, samples_per_frame,	      samples_per_frame * 1000 / clock_rate));    return PJ_SUCCESS;}/* * Initialize DirectSound recorder device */static pj_status_t init_capture_stream( struct dsound_stream *ds_strm,				        int dev_id,				        unsigned clock_rate,				        unsigned channel_count,				        unsigned samples_per_frame,				        unsigned buffer_count){    HRESULT hr;    PCMWAVEFORMAT pcmwf;     DSCBUFFERDESC dscbdesc;    DSBPOSITIONNOTIFY dsPosNotify[MAX_PACKET_BUFFER_COUNT];    unsigned bytes_per_frame;    unsigned i;    PJ_ASSERT_RETURN(buffer_count <= MAX_PACKET_BUFFER_COUNT, PJ_EINVAL);    /* Check device id */    if (dev_id == -1)	dev_id = 0;    PJ_ASSERT_RETURN(dev_id>=0 && dev_id < (int)dev_count, PJ_EINVAL);    /*     * Creating recorder device.     */    hr = DirectSoundCaptureCreate(dev_info[dev_id].lpGuid, 				  &ds_strm->ds.capture.lpDs, NULL);    if (FAILED(hr))	return PJ_RETURN_OS_ERROR(hr);    /* Init wave format to initialize buffer */    init_waveformatex( &pcmwf, clock_rate, channel_count);    bytes_per_frame = samples_per_frame * BYTES_PER_SAMPLE;    /*      * Setup capture buffer using sound buffer structure that was passed     * to play buffer creation earlier.     */    pj_bzero(&dscbdesc, sizeof(DSCBUFFERDESC));    dscbdesc.dwSize = sizeof(DSCBUFFERDESC);     dscbdesc.dwFlags = DSCBCAPS_WAVEMAPPED ;    dscbdesc.dwBufferBytes = buffer_count * bytes_per_frame;     dscbdesc.lpwfxFormat = (LPWAVEFORMATEX)&pcmwf;     hr = IDirectSoundCapture_CreateCaptureBuffer( ds_strm->ds.capture.lpDs,						  &dscbdesc, 						  &ds_strm->ds.capture.lpDsBuffer,						  NULL);    if (FAILED(hr))	return PJ_RETURN_OS_ERROR(hr);    /*     * Create event for play notification.     */    ds_strm->hEvent = CreateEvent( NULL, FALSE, FALSE, NULL);    if (ds_strm->hEvent == NULL)	return pj_get_os_error();    /*     * Setup notifications for recording.     */    hr = IDirectSoundCaptureBuffer_QueryInterface( ds_strm->ds.capture.lpDsBuffer, 						   &IID_IDirectSoundNotify, 						   (LPVOID *)&ds_strm->lpDsNotify);     if (FAILED(hr))	return PJ_RETURN_OS_ERROR(hr);        for (i=0; i<buffer_count; ++i) {	dsPosNotify[i].dwOffset = i * bytes_per_frame;	dsPosNotify[i].hEventNotify = ds_strm->hEvent;    }        hr = IDirectSoundNotify_SetNotificationPositions( ds_strm->lpDsNotify, 						      buffer_count, 						      dsPosNotify);    if (FAILED(hr))	return PJ_RETURN_OS_ERROR(hr);    hr = IDirectSoundCaptureBuffer_GetCurrentPosition( ds_strm->ds.capture.lpDsBuffer, 						       NULL, &ds_strm->dwBytePos );    if (FAILED(hr))	return PJ_RETURN_OS_ERROR(hr);    ds_strm->timestamp.u64 = 0;    ds_strm->dwDsBufferSize = buffer_count * bytes_per_frame;    /* Done setting up recorder device. */    PJ_LOG(5,(THIS_FILE, 	      " DirectSound capture \"%s\" initialized (clock_rate=%d, "	      "channel_count=%d, samples_per_frame=%d (%dms))",	      dev_info[dev_id].info.name,	      clock_rate, channel_count, samples_per_frame,	      samples_per_frame * 1000 / clock_rate));    return PJ_SUCCESS;}static BOOL AppReadDataFromBuffer(LPDIRECTSOUNDCAPTUREBUFFER lpDsb, // The buffer.				  DWORD dwOffset,		    // Our own write cursor.				  LPBYTE lpbSoundData,		    // Start of our data.				  DWORD dwSoundBytes)		    // Size of block to copy.{     LPVOID  lpvPtr1;     DWORD dwBytes1;     LPVOID  lpvPtr2;     DWORD dwBytes2;     HRESULT hr;         // Obtain memory address of write block. This will be in two parts    // if the block wraps around.        hr = IDirectSoundCaptureBuffer_Lock( lpDsb, dwOffset, dwSoundBytes, &lpvPtr1, 					 &dwBytes1, &lpvPtr2, &dwBytes2, 0);         if SUCCEEDED(hr) { 	// Read from pointers. 	pj_memcpy(lpbSoundData, lpvPtr1, dwBytes1); 	if (lpvPtr2 != NULL)	    pj_memcpy(lpbSoundData+dwBytes1, lpvPtr2, dwBytes2); 		// Release the data back to DirectSound. 	hr = IDirectSoundCaptureBuffer_Unlock(lpDsb, lpvPtr1, dwBytes1, lpvPtr2, dwBytes2); 	if SUCCEEDED(hr)	    return TRUE;     }         // Lock, Unlock, or Restore failed.     return FALSE; }static BOOL AppWriteDataToBuffer(LPDIRECTSOUNDBUFFER lpDsb,  // The buffer.				 DWORD dwOffset,	      // Our own write cursor.				 LPBYTE lpbSoundData,	      // Start of our data.				 DWORD dwSoundBytes)	      // Size of block to copy.{     LPVOID  lpvPtr1;     DWORD dwBytes1;     LPVOID  lpvPtr2;     DWORD dwBytes2;     HRESULT hr;         // Obtain memory address of write block. This will be in two parts    // if the block wraps around.        hr = IDirectSoundBuffer_Lock( lpDsb, dwOffset, dwSoundBytes, &lpvPtr1, 				  &dwBytes1, &lpvPtr2, &dwBytes2, 0);         // If the buffer was lost, restore and retry lock.     if (DSERR_BUFFERLOST == hr) { 	IDirectSoundBuffer_Restore(lpDsb); 	hr = IDirectSoundBuffer_Lock( lpDsb, dwOffset, dwSoundBytes, 				      &lpvPtr1, &dwBytes1, &lpvPtr2, &dwBytes2, 0);     }     if SUCCEEDED(hr) { 	pj_memcpy(lpvPtr1, lpbSoundData, dwBytes1); 	if (NULL != lpvPtr2) 	    pj_memcpy(lpvPtr2, lpbSoundData+dwBytes1, dwBytes2); 		hr = IDirectSoundBuffer_Unlock(lpDsb, lpvPtr1, dwBytes1, lpvPtr2, dwBytes2); 	if SUCCEEDED(hr)	    return TRUE;     }         return FALSE; }/* * Check if there are captured frames in DirectSound capture buffer. */static unsigned dsound_captured_size(struct dsound_stream *dsound_strm){    HRESULT hr;    long size_available;    DWORD writePos, readPos;    hr = IDirectSoundCaptureBuffer_GetCurrentPosition(dsound_strm->ds.capture.lpDsBuffer, 						      &writePos, &readPos);    if FAILED(hr)	return PJ_FALSE;    if (readPos < dsound_strm->dwBytePos)	size_available = readPos +		    (dsound_strm->dwDsBufferSize) - dsound_strm->dwBytePos;    else	size_available = readPos - dsound_strm->dwBytePos;    return size_available;}/* * DirectSound capture and playback thread. */static int dsound_dev_thread(void *arg){    pjmedia_snd_stream *strm = arg;    HANDLE events[2];    unsigned eventCount;    unsigned bytes_per_frame;    pj_status_t status;    eventCount = 0;    if (strm->dir & PJMEDIA_DIR_PLAYBACK)	events[eventCount++] = strm->play_strm.hEvent;    if (strm->dir & PJMEDIA_DIR_CAPTURE)	events[eventCount++] = strm->rec_strm.hEvent;    /* Raise self priority. We don't want the audio to be distorted by     * system activity.     */    //SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_HIGHEST);    /* Calculate bytes per frame */    bytes_per_frame = strm->samples_per_frame * BYTES_PER_SAMPLE;    /*     * Loop while not signalled to quit, wait for event objects to be      * signalled by DirectSound capture and play buffer.     */    while (!strm->thread_quit_flag) {		DWORD rc;	pjmedia_dir signalled_dir;	rc = WaitForMultipleObjects(eventCount, events, FALSE, 				    100);	if (rc < WAIT_OBJECT_0 || rc >= WAIT_OBJECT_0+eventCount)	    continue;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合色鬼综合色| 国产清纯在线一区二区www| 中文字幕不卡在线观看| 欧美偷拍一区二区| 天堂久久久久va久久久久| 亚洲国产激情av| 欧美一区二区三区免费在线看| 天堂一区二区在线| 日韩一级精品视频在线观看| 成+人+亚洲+综合天堂| 亚洲精品成人精品456| 久久一夜天堂av一区二区三区| 成人动漫中文字幕| 美腿丝袜亚洲色图| 亚洲一区av在线| **欧美大码日韩| 欧美激情在线一区二区三区| 亚洲高清三级视频| 国产精品国产三级国产aⅴ中文 | 亚洲天堂免费看| 久久久久久久性| 日韩免费高清电影| 欧美日韩一级视频| 91亚洲资源网| 波多野结衣精品在线| 国产精品中文字幕日韩精品| 中文字幕在线观看不卡| 久久精品夜色噜噜亚洲a∨| 97se亚洲国产综合自在线不卡| 亚洲成a人片在线不卡一二三区| 日韩精品中文字幕在线一区| 911精品国产一区二区在线| 在线观看一区二区视频| 色哟哟精品一区| 另类成人小视频在线| 日韩激情一区二区| 日韩精品成人一区二区在线| 午夜久久久影院| 国产精品色哟哟| 国产精品成人免费| 日韩视频在线永久播放| 91美女在线看| 在线观看成人小视频| 欧美日韩在线播放一区| 欧美另类一区二区三区| 日韩视频免费观看高清完整版| 国产不卡在线播放| 成人av资源在线| 色综合久久中文字幕综合网| 日本久久一区二区三区| 欧美三级日韩三级| av成人免费在线| 色狠狠av一区二区三区| 欧美系列日韩一区| 在线不卡a资源高清| 欧美精品一区二区精品网| 欧美亚洲图片小说| 欧美性色欧美a在线播放| 欧美肥妇bbw| 久久综合久久99| 91麻豆精品国产| 欧美变态tickling挠脚心| 久久精品欧美一区二区三区麻豆| 777色狠狠一区二区三区| 色94色欧美sute亚洲线路二| 91精品在线观看入口| 精品国产a毛片| 亚洲欧美日韩中文播放| 美女网站色91| 成人小视频免费观看| 国产精品一级黄| 麻豆精品一区二区三区| 国产成人av一区二区三区在线 | 中文字幕五月欧美| 久久久国产综合精品女国产盗摄| 欧美一区二区在线不卡| 欧美美女bb生活片| 久久老女人爱爱| 夜夜揉揉日日人人青青一国产精品 | 亚洲乱码国产乱码精品精的特点| 国产欧美日韩不卡免费| 亚洲午夜精品17c| 国产精品综合在线视频| 紧缚奴在线一区二区三区| 91视频免费播放| 欧美猛男gaygay网站| 久久精品男人的天堂| 亚洲一二三四区| 国产激情偷乱视频一区二区三区 | 色爱区综合激月婷婷| 欧美zozozo| 亚洲一区影音先锋| 亚洲成人精品影院| 午夜欧美电影在线观看| 日韩电影在线免费看| 麻豆精品在线看| 日本精品一区二区三区四区的功能| 色综合欧美在线视频区| 精品盗摄一区二区三区| 亚洲电影视频在线| a4yy欧美一区二区三区| 欧美成人欧美edvon| 亚洲成人中文在线| 成人免费视频视频在线观看免费| 99久久精品久久久久久清纯| 色香蕉成人二区免费| 久久综合久久久久88| 日韩—二三区免费观看av| 色综合久久天天| 国产欧美日韩在线| 亚洲一区二区在线观看视频| 国产福利电影一区二区三区| 日韩精品最新网址| 国产精品三级av| 国内国产精品久久| 欧美肥胖老妇做爰| 一片黄亚洲嫩模| 91同城在线观看| 国产精品毛片无遮挡高清| 国内精品写真在线观看| 91精品国产麻豆国产自产在线| 久久蜜臀中文字幕| 久久99九九99精品| 欧美一级理论片| 日韩精品一级中文字幕精品视频免费观看| 看电视剧不卡顿的网站| 69精品人人人人| 性久久久久久久| 国产成人精品综合在线观看| 久久久亚洲高清| 一区二区三区精品| 久久电影网站中文字幕| 91精品免费在线观看| 日韩激情一二三区| 欧美一区二区三区电影| 日韩电影在线一区二区三区| 成人av午夜影院| 国产精品成人一区二区三区夜夜夜 | 激情综合网激情| 精品对白一区国产伦| 亚洲综合激情另类小说区| 欧美又粗又大又爽| 亚洲成人动漫在线观看| 欧美日韩三级视频| 秋霞国产午夜精品免费视频| 日韩一区二区三| 国内欧美视频一区二区| 中文字幕av一区二区三区免费看| 美女诱惑一区二区| 欧美成人aa大片| 成人自拍视频在线| 亚洲色欲色欲www在线观看| 色88888久久久久久影院野外| 国产精品拍天天在线| 99视频一区二区| 亚洲一区二区免费视频| 欧美一级国产精品| 国产精品一级在线| 亚洲激情五月婷婷| 欧美一区二区在线视频| 亚洲成人高清在线| 精品国产一区二区三区久久久蜜月| 午夜精品久久久久久不卡8050| 99在线精品视频| 午夜精品在线视频一区| 精品乱码亚洲一区二区不卡| 成人美女视频在线观看| 精品国产乱码久久久久久夜甘婷婷| 亚洲国产美女搞黄色| 色综合久久中文字幕| 奇米亚洲午夜久久精品| 欧美国产禁国产网站cc| 精品1区2区3区| 国产精品一区在线观看乱码| 一区二区三区免费观看| 亚洲精品在线三区| 在线观看网站黄不卡| 亚洲人成亚洲人成在线观看图片| 成人久久18免费网站麻豆 | 成人免费看的视频| 午夜视频在线观看一区二区三区| 欧美性色综合网| 亚洲国产精品视频| 久久午夜电影网| 国产揄拍国内精品对白| 亚洲精品v日韩精品| 日本乱人伦一区| 国产精选一区二区三区| 午夜精品福利一区二区三区av | 欧美精品在线一区二区三区| 国产99久久久国产精品免费看| 国产性天天综合网| 91.麻豆视频| 97国产一区二区| 亚洲日本在线天堂| 26uuuu精品一区二区| 欧美日韩亚洲不卡| 91美女福利视频| 高清国产一区二区| 免费观看30秒视频久久|