PortAudio詳解(2015年12月1日更新)
PortAudio詳解
整理者:赤子玄心
QQ:280604597
Email:280604597@qq.com
大家有什么不明白的地方,或者想要詳細(xì)了解的地方可以聯(lián)系我,我會(huì)認(rèn)真回復(fù)的
1 簡(jiǎn)介
PortAudio是一個(gè)免費(fèi)、跨平臺(tái)、開源的音頻I/O庫(kù)。看到I/O可能就想到了文件,但是PortAudio操作的I/O不是文件,而是音頻設(shè)備。它能夠簡(jiǎn)化C/C++的音頻程序的設(shè)計(jì)實(shí)現(xiàn),能夠運(yùn)行在Windows、Macintosh OS X和UNIX之上(Linux的各種版本也不在話下)。使用PortAudio可以在不同的平臺(tái)上遷移應(yīng)用程序,比如你可以把你基于PortAudio的應(yīng)用程序發(fā)展一個(gè)Android版本啊。
PortAudio的API非常簡(jiǎn)單,通過一個(gè)一個(gè)簡(jiǎn)單的回調(diào)函數(shù)或者阻塞的讀/寫接口來錄制或者播放聲音。PortAudio自帶了很多示例程序,比如播放正弦波形的音頻信號(hào),處理音頻輸入,錄制回放音頻,列舉音頻設(shè)備。
PortAudio使用的是自己定義的License,關(guān)鍵點(diǎn)在于:
1、允許在你的項(xiàng)目或程序中免費(fèi)使用PortAudio,商業(yè)軟件也是免費(fèi)使用的。
2、可以不開源你的源碼。
3、禁止刪除PortAudio中的版權(quán)信息。
4、如果你修復(fù)了PortAudio中的bug,請(qǐng)通知社區(qū)。
5、如果你的程序因?yàn)镻ortAudio而崩潰,我們不負(fù)任何責(zé)任。
PortAudio的最新版本是V19。本文討論的就是該版本。
2 PortAudio V19庫(kù)編譯
2.1 準(zhǔn)備
PortAudio官網(wǎng):
PortAudio庫(kù)API英文詳解:
http://www.portaudio.com/docs/v19-doxydocs/portaudio_8h.html#a443ad16338191af364e3be988014cbbe
DirectX SDK下載:
http://www.microsoft.com/en-us/download/details.aspx?id=6812
PortAudio下載:
http://portaudio.com/docs/v19-doxydocs/compile_windows.html
ASIO SDK下載:
http://download.csdn.net/detail/linyiqinggood/6778175
PortAudio是采集和播放音頻的開源庫(kù),可以用于Linux和windows,在windows下依賴DirectX庫(kù)(Directshow)用于驅(qū)動(dòng)聲卡,所以必須安裝DirectX sdk庫(kù)。
安裝DirectX sdk庫(kù)參考:
http://blog.sina.com.cn/s/blog_b5c2c06f01016cu5.html
portaudioV19的安裝集合包下載地址:
http://download.csdn.net/detail/yanmy2012/4655561
2.2 編譯方式
Windows編譯參考http://portaudio.com/docs/v19-doxydocs/compile_windows.html
其他的編譯方式http://portaudio.com/docs/v19-doxydocs/pages.html
由于V19 相對(duì)于V18改了非常多的地方,所以只編譯V19的庫(kù),例程只有較新的才能在V19中編譯通過,有些會(huì)顯示找不到類型和函數(shù)申明。
2.3 編譯過程
下面列出的步驟來建立PortAudio成一個(gè)dll和lib文件。得到的DLL文件可能包含所有五個(gè)目前的win32 PortAudio的API:MME,DirectSound的,WASAPI,WDM / KS和ASIO,根據(jù)下面的步驟9中設(shè)置的預(yù)處理器定義。PortAudio可以被編譯使用Visual C + + Express版是由微軟免費(fèi)提供。如果你有一個(gè)C + +開發(fā)環(huán)境,只需下載并安裝。這些指令已經(jīng)成功觀察到使用Visual Studio 2010和。
1) PortAudio為Windows需要的文件dsound.h的和dsconf.h。下載并安裝DirectX SDK 獲得這些文件。如果你安裝了DirectX SDK!的DirectSound的庫(kù)和頭文件的自動(dòng)加到 Visual C + +中。
如果你得到一個(gè)錯(cuò)誤說缺少dsound.h,或dsconf.h的,你可以添加這些路徑。或者,您可以復(fù)制dsound.h和dsconf.h,到portaudio\。還應(yīng)該有一個(gè)名為“dsound.lib”C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib文件。
2) 支持ASIO,下載ASIO SDK在http://www.steinberg.net/en/company/developer.html。 SDK是免費(fèi)的,但您將需要與斯坦伯格建立一個(gè)開發(fā)者帳號(hào),所以我提供了下載文件,這個(gè)也是從網(wǎng)上收回來的。復(fù)制整個(gè)ASIOSDK2的到src文件夾\hostapi\ASIO\。重命名它,從ASIOSDK2到ASIOSDK。
3) 如果您的Visual Studio 6.0,7.0(VC.NET/2001)或7.1(VC.2003),打開portaudio.dsp并轉(zhuǎn)換如果需要的話。
4) 如果你有Visual Studio 2005中的Visual C + + 2008 Express Edition或Visual Studio 2010中,雙擊portaudio.sln的文件位于在build \ MSVC \。這樣做將打開Visual Studio或Visual C + +。點(diǎn)擊“Finish”如果出現(xiàn)一個(gè)向?qū)Аln文件中包含四種配置:Win32和Win64的發(fā)布和調(diào)試的變種。
對(duì)于Visual Studio 2005中的Visual C + + 2008 Express版或Visual Studio 2010中
5) 打開項(xiàng)目 - > portaudio“屬性”,在樹視圖中選擇“配置屬性”。
6) 選擇“配置”中的“配置”組合框。選擇“所有平臺(tái)”
7) 設(shè)置幾個(gè)選項(xiàng):
C/C++—〉優(yōu)化—〉省略框架指針= YES
C/C++—〉代碼生成—〉運(yùn)行時(shí)庫(kù)/MT
可選:C/C++—〉代碼生成—〉浮點(diǎn)模型=快速
注:對(duì)于大多數(shù)用戶來說,它是沒有必要顯式地設(shè)置結(jié)構(gòu)成員對(duì)齊,默認(rèn)情況下應(yīng)該正常工作。然而,一些語(yǔ)言要求,例如,4字節(jié)對(duì)齊。如果您有portaudio.h結(jié)構(gòu)的成員沒有被正確讀取或?qū)懭氲膯栴},可能有必要顯式地設(shè)置這個(gè)值由C/C++—〉代碼生成—〉結(jié)構(gòu)成員對(duì)齊,將其設(shè)置為一個(gè)適當(dāng)?shù)闹担ㄋ氖枪餐膬r(jià)值)。如果你的編譯器是可配置的,你應(yīng)該確保它被設(shè)置為使用相同的結(jié)構(gòu)成員對(duì)齊值所使用的PortAudio構(gòu)建。
當(dāng)你設(shè)置完這些參數(shù)后點(diǎn)擊“確定”。
預(yù)處理器定義
由于預(yù)處理器定義是不同的,每個(gè)配置和平臺(tái),你需要編輯這些單獨(dú)為每個(gè)配置/平臺(tái)組合,你想修改的“配置”和“平臺(tái)”組合框。
8) 為了抑制的PortAudio運(yùn)行調(diào)試控制臺(tái)輸出項(xiàng)目—〉屬性—〉配置屬性—〉C/C++—〉預(yù)處理器。在該領(lǐng)域的預(yù)處理器定義,找到PA_ENABLE_DEBUG_OUTPUT并刪除它。控制臺(tái)將不輸出調(diào)試信息。
9) 你需要明確地定義你想使用的音頻API的預(yù)處理器定義。對(duì)于Windows提供的API定義是:
PA_USE_ASIO
PA_USE_DS(DirectSound的)
PA_USE_WMME(MME)
PA_USE_WASAPI
PA_USE_WDMKS
PA_USE_SKELETON
對(duì)于每個(gè)這樣的,值為0表示不應(yīng)列入這個(gè)API的支持。值1表示應(yīng)該包括這個(gè)API的支持。
設(shè)置預(yù)處理器定義時(shí),build是配置每個(gè)平臺(tái)的過程。按照這些說明build你感興趣的每一個(gè)配置/平臺(tái)組合。
以上宏在“項(xiàng)目—〉屬性—〉配置屬性—〉C/C++—〉預(yù)處理器—〉預(yù)處理器定義”中定義的。
10) 從“生成”菜單上單擊“生成” - >“生成解決方案”。對(duì)于32位編譯的dll文件創(chuàng)建的這個(gè)過程(portaudio_x86.dll)中可以找到的目錄生成\ MSVC \ WIN32 \發(fā)布。64位編譯的DLL文件被稱為portaudio_x64.dll,被發(fā)現(xiàn)在目錄中生成\ MSVC \ X64 \發(fā)布。
11) 現(xiàn)在,任何項(xiàng)目需要portaudio可以與portaudio_x86.lib(或_x64),包括您可能要添加/刪除一些DLL 相關(guān)的頭(portaudio.h,和/或pa_asio.h,pa_x86_plain_converters.h),入口點(diǎn)。現(xiàn)在,這6個(gè)項(xiàng)目是不是從portaudio.h:
最后會(huì)生成portaudio_x86.lib和portaudio_x86.dll,各兩個(gè)分別是Debug和Release的,不同配置下使用不同dll和lib。
安裝完之后就是測(cè)試,源代碼文件夾test文件夾下有測(cè)試代碼,由于V19 相對(duì)于V18改了非常多的地方,所以只編譯V19的庫(kù),例程只有較新的才能在V19中編譯通過,有些會(huì)顯示找不到類型和函數(shù)申明。
patest_record.c代碼,運(yùn)行過程中會(huì)有5秒的嘟嘟聲(由的算法產(chǎn)生的float點(diǎn)型級(jí)別的聲波),這樣就證明了已經(jīng)安裝成功。
#include "portaudio.h"
#define SAMPLE_RATE (44100)
#define FRAMES_PER_BUFFER (1024)
#define NUM_SECONDS (5)
#define NUM_CHANNELS (2)
#define DITHER_FLAG (0)
#if 1
#define PA_SAMPLE_TYPE paFloat32
typedef float SAMPLE;
#define SAMPLE_SILENCE (0.0f)
#define PRINTF_S_FORMAT "%.8f"
#elif 1
#define PA_SAMPLE_TYPE paInt16
typedef short SAMPLE;
#define SAMPLE_SILENCE (0)
#define PRINTF_S_FORMAT "%d"
#elif 0
#define PA_SAMPLE_TYPE paInt8
typedef char SAMPLE;
#define SAMPLE_SILENCE (0)
#define PRINTF_S_FORMAT "%d"
#else
#define PA_SAMPLE_TYPE paUInt8
typedef unsigned char SAMPLE;
#define SAMPLE_SILENCE (128)
#define PRINTF_S_FORMAT "%d"
#endif
typedef struct
{
int frameIndex;
int maxFrameIndex;
SAMPLE *recordedSamples;
}
paTestData;
static int recordCallback( const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData )
{
paTestData *data = (paTestData*)userData;
const SAMPLE *rptr = (const SAMPLE*)inputBuffer;
SAMPLE *wptr = &data->recordedSamples[data->frameIndex * NUM_CHANNELS];
long framesToCalc;
long i;
int finished;
unsigned long framesLeft = data->maxFrameIndex - data->frameIndex;
(void) outputBuffer;
(void) timeInfo;
(void) statusFlags;
(void) userData;
if( framesLeft < framesPerBuffer )
{
framesToCalc = framesLeft;
finished = paComplete;
}
else
{
framesToCalc = framesPerBuffer;
finished = paContinue;
}
if( inputBuffer == NULL )
{
for( i=0; i
{
*wptr++ = SAMPLE_SILENCE;
if( NUM_CHANNELS == 2 ) *wptr++ = SAMPLE_SILENCE;
}
}
else
{
for( i=0; i
{
*wptr++ = *rptr++;
if( NUM_CHANNELS == 2 ) *wptr++ = *rptr++;
}
}
data->frameIndex += framesToCalc;
return finished;
}
static int playCallback( const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData )
{
paTestData *data = (paTestData*)userData;
SAMPLE *rptr = &data->recordedSamples[data->frameIndex * NUM_CHANNELS];
SAMPLE *wptr = (SAMPLE*)outputBuffer;
unsigned int i;
int finished;
unsigned int framesLeft = data->maxFrameIndex - data->frameIndex;
(void) inputBuffer;
(void) timeInfo;
(void) statusFlags;
(void) userData;
if( framesLeft < framesPerBuffer )
{
for( i=0; i
{
*wptr++ = *rptr++;
if( NUM_CHANNELS == 2 ) *wptr++ = *rptr++;
}
for( ; i
{
*wptr++ = 0;
if( NUM_CHANNELS == 2 ) *wptr++ = 0;
}
data->frameIndex += framesLeft;
finished = paComplete;
}
else
{
for( i=0; i
{
*wptr++ = *rptr++;
if( NUM_CHANNELS == 2 ) *wptr++ = *rptr++;
}
data->frameIndex += framesPerBuffer;
finished = paContinue;
}
return finished;
}
int main(void);
int main(void)
{
PaStreamParameters inputParameters,
outputParameters;
PaStream* stream;
PaError err = paNoError;
paTestData data;
int i;
int totalFrames;
int numSamples;
int numBytes;
SAMPLE max, val;
double average;
printf("patest_record.c\n"); fflush(stdout);
data.maxFrameIndex = totalFrames = NUM_SECONDS * SAMPLE_RATE;
data.frameIndex = 0;
numSamples = totalFrames * NUM_CHANNELS;
numBytes = numSamples * sizeof(SAMPLE);
data.recordedSamples = (SAMPLE *) malloc( numBytes );
if( data.recordedSamples == NULL )
{
printf("Could not allocate record array.\n");
goto done;
}
for( i=0; i
err = Pa_Initialize();
if( err != paNoError ) goto done;
inputParameters.device = Pa_GetDefaultInputDevice();
inputParameters.channelCount = 2;
inputParameters.sampleFormat = PA_SAMPLE_TYPE;
inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultLowInputLatency;
inputParameters.hostApiSpecificStreamInfo = NULL;
err = Pa_OpenStream(
&stream,
&inputParameters,
NULL,
SAMPLE_RATE,
FRAMES_PER_BUFFER,
paClipOff,
recordCallback,
&data );
if( err != paNoError ) goto done;
err = Pa_StartStream( stream );
if( err != paNoError ) goto done;
printf("Now recording!!\n"); fflush(stdout);
while( ( err = Pa_IsStreamActive( stream ) ) == 1 )
{
Pa_Sleep(1000);
printf("index = %d\n", data.frameIndex ); fflush(stdout);
}
if( err < 0 ) goto done;
err = Pa_CloseStream( stream );
if( err != paNoError ) goto done;
max = 0;
average = 0.0;
for( i=0; i
{
val = data.recordedSamples[i];
if( val < 0 ) val = -val;
if( val > max )
{
max = val;
}
average += val;
}
average = average / (double)numSamples;
printf("sample max amplitude = "PRINTF_S_FORMAT"\n", max );
printf("sample average = %lf\n", average );
#if 0
{
FILE *fid;
fid = fopen("recorded.raw", "wb");
if( fid == NULL )
{
printf("Could not open file.");
}
else
{
fwrite( data.recordedSamples, NUM_CHANNELS * sizeof(SAMPLE), totalFrames, fid );
fclose( fid );
printf("Wrote data to 'recorded.raw'\n");
}
}
#endif
data.frameIndex = 0;
outputParameters.device = Pa_GetDefaultOutputDevice();
outputParameters.channelCount = 2;
outputParameters.sampleFormat = PA_SAMPLE_TYPE;
outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
outputParameters.hostApiSpecificStreamInfo = NULL;
printf("Begin playback.\n"); fflush(stdout);
err = Pa_OpenStream(
&stream,
NULL,
&outputParameters,
SAMPLE_RATE,
FRAMES_PER_BUFFER,
paClipOff,
playCallback,
&data );
if( err != paNoError ) goto done;
if( stream )
{
err = Pa_StartStream( stream );
if( err != paNoError ) goto done;
printf("Waiting for playback to finish.\n"); fflush(stdout);
while( ( err = Pa_IsStreamActive( stream ) ) == 1 ) Pa_Sleep(100);
if( err < 0 ) goto done;
err = Pa_CloseStream( stream );
if( err != paNoError ) goto done;
printf("Done.\n"); fflush(stdout);
}
done:
Pa_Terminate();
if( data.recordedSamples )
free( data.recordedSamples );
if( err != paNoError )
{
fprintf( stderr, "An error occured while using the portaudio stream\n" );
fprintf( stderr, "Error number: %d\n", err );
fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
err = 1;
}
return err;
}
3 函數(shù)庫(kù)
3.1 函數(shù)模板(未完成)
|
函數(shù)名稱 |
xxx |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
函數(shù)主要功能說明。 |
|
函數(shù)聲明 |
類型 函數(shù)名 ( 類型 參數(shù)1, 類型 參數(shù)2, …… ); |
|
函數(shù)參數(shù) |
參數(shù)1,[輸入|輸出|輸入&輸出]: 參數(shù)說明。 |
|
參數(shù)2,[輸入|輸出|輸入&輸出]: 參數(shù)說明。 |
|
|
…… |
|
|
返回值 |
返回值1:返回值說明。 返回值2:返回值說明。 …… |
|
錯(cuò)誤碼 |
EXXXX:錯(cuò)誤碼說明。 EXXXX:錯(cuò)誤碼說明。 …… |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
…… …… |
3.2 Pa_Initialize(未完成)
|
函數(shù)名稱 |
Pa_Initialize |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
初始化PortAudio庫(kù)。 |
|
函數(shù)聲明 |
PaError Pa_Initialize ( void ); |
|
函數(shù)參數(shù) |
無 |
|
返回值 |
paNoError枚舉(0x0000):成功。 其他:失敗,返回值就是錯(cuò)誤碼,調(diào)用Pa_GetErrorText()函數(shù)查看錯(cuò)誤碼對(duì)應(yīng)的錯(cuò)誤信息。 |
|
錯(cuò)誤碼 |
EXXXX:錯(cuò)誤碼說明。 EXXXX:錯(cuò)誤碼說明。 …… |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
使用PortAudio函數(shù)庫(kù)之前必須調(diào)用本函數(shù)初始化。 本函數(shù)初始化的內(nèi)部數(shù)據(jù)結(jié)構(gòu),并準(zhǔn)備底層主機(jī)的API使用。除了Pa_GetVersion(),Pa_GetVersionText(),和Pa_GetErrorText()時(shí),該功能必須使用任何其他PortAudio API函數(shù)之前調(diào)用。 如果本函數(shù)被調(diào)用多次,每一次成功的調(diào)用必須有相應(yīng)調(diào)用Pa_Terminate()函數(shù)相匹配。調(diào)用Pa_Initialize的對(duì)()/ Pa_Terminate()可能會(huì)重疊,并且不要求完全嵌套。 如果本函數(shù)返回失敗,不需要調(diào)用Pa_Terminate()函數(shù)來銷毀。 |
3.3 Pa_Terminate(未完成)
|
函數(shù)名稱 |
Pa_Terminate |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
銷毀已經(jīng)初始化的PortAudio庫(kù)。 |
|
函數(shù)聲明 |
PaError Pa_Terminate ( void ); |
|
函數(shù)參數(shù) |
無 |
|
返回值 |
paNoError枚舉(0x0000):成功。 其他:失敗,返回值就是錯(cuò)誤碼,調(diào)用Pa_GetErrorText()函數(shù)查看錯(cuò)誤碼對(duì)應(yīng)的錯(cuò)誤信息。 |
|
錯(cuò)誤碼 |
paNotInitialized枚舉(-10000):沒有初始化PortAudio庫(kù)。 EXXXX:錯(cuò)誤碼說明。 …… |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
本函數(shù)會(huì)銷毀由PortAudio庫(kù)分配的所有資源。 本函數(shù)必須在程序退出之前被調(diào)用,否則可能會(huì)導(dǎo)致嚴(yán)重的資源泄漏,如錄音設(shè)備或播放設(shè)備不可用,除非重新啟動(dòng)操作系統(tǒng)。 |
3.4 Pa_GetErrorText(未完成)
|
函數(shù)名稱 |
Pa_GetErrorText |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
根據(jù)指定的錯(cuò)誤碼獲取對(duì)應(yīng)的錯(cuò)誤信息字符串。 |
|
函數(shù)聲明 |
const char * Pa_GetErrorText ( PaError errorCode ); |
|
函數(shù)參數(shù) |
errorCode,[輸入]: 存放錯(cuò)誤碼的值。 |
|
返回值 |
錯(cuò)誤信息字符串的內(nèi)存指針。 |
|
錯(cuò)誤碼 |
無 |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
如果指定的錯(cuò)誤碼是不存在的,返回的錯(cuò)誤信息字符串為"Invalid error code (value greater than zero)"。 |
3.5 Pa_GetVersion(未完成)
|
函數(shù)名稱 |
Pa_GetVersion |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
以整數(shù)方式獲取當(dāng)前程序正在使用的PortAudio庫(kù)的版本號(hào),例如:1900。 |
|
函數(shù)聲明 |
int Pa_GetVersion ( void ); |
|
函數(shù)參數(shù) |
無 |
|
返回值 |
PortAudio庫(kù)的版本號(hào)的整數(shù)。 |
|
錯(cuò)誤碼 |
無 |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
|
3.6 Pa_GetVersionText(未完成)
|
函數(shù)名稱 |
Pa_GetVersionText |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
以信息字符串方式獲取當(dāng)前程序正在使用的PortAudio庫(kù)的版本號(hào),例如:"PortAudio V19-devel 13 October 2002"。 |
|
函數(shù)聲明 |
int Pa_GetVersionText ( void ); |
|
函數(shù)參數(shù) |
無 |
|
返回值 |
PortAudio庫(kù)的版本號(hào)的信息字符串的內(nèi)存指針。 |
|
錯(cuò)誤碼 |
無 |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
獲取到信息字符串所占用的內(nèi)存由Pa_Terminate()函數(shù)自動(dòng)釋放,不需要手動(dòng)釋放,否則會(huì)出現(xiàn)未知錯(cuò)誤。 |
3.7 Pa_GetDeviceCount(未完成)
|
函數(shù)名稱 |
Pa_GetDeviceCount |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
獲取可用的音頻設(shè)備的數(shù)量。 |
|
函數(shù)聲明 |
PaDeviceIndex Pa_GetDeviceCount ( void ); |
|
函數(shù)參數(shù) |
無 |
|
返回值 |
大于等于0:成功,可用的音頻設(shè)備的數(shù)量。 小于0:失敗,返回值就是錯(cuò)誤碼,調(diào)用Pa_GetErrorText()函數(shù)查看錯(cuò)誤碼對(duì)應(yīng)的錯(cuò)誤信息。 |
|
錯(cuò)誤碼 |
EXXXX:錯(cuò)誤碼說明。 EXXXX:錯(cuò)誤碼說明。 …… |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
|
3.8 Pa_GetDeviceInfo(未完成)
|
函數(shù)名稱 |
Pa_GetDeviceInfo |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
根據(jù)音頻設(shè)備的索引號(hào)獲取音頻設(shè)備的相關(guān)信息。 |
|
函數(shù)聲明 |
const PaDeviceInfo * Pa_GetDeviceInfo ( PaDeviceIndex device ); |
|
函數(shù)參數(shù) |
device,[輸入]: 存放音頻設(shè)備的索引號(hào)。 音頻設(shè)備的索引號(hào)范圍從0開始,到Pa_GetDeviceCount()函數(shù)返回的音頻設(shè)備的數(shù)量減一。 |
|
返回值 |
NULL:失敗,音頻設(shè)備的索引號(hào)超出范圍。 其他:音頻設(shè)備信息結(jié)構(gòu)體的內(nèi)存指針。 |
|
錯(cuò)誤碼 |
EXXXX:錯(cuò)誤碼說明。 EXXXX:錯(cuò)誤碼說明。 …… |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
獲取到音頻設(shè)備信息結(jié)構(gòu)體所占用的內(nèi)存由Pa_Terminate()函數(shù)自動(dòng)釋放,不需要手動(dòng)釋放,否則會(huì)出現(xiàn)未知錯(cuò)誤。 如果不知道該用哪個(gè)音頻輸入設(shè)備,可以調(diào)用Pa_GetDefaultInputDevice()函數(shù)獲取默認(rèn)的音頻輸入設(shè)備。 如果不知道該用哪個(gè)音頻輸出設(shè)備,可以調(diào)用Pa_GetDefaultOutputDevice()函數(shù)獲取默認(rèn)的音頻輸出設(shè)備。 |
3.9 Pa_GetDefaultInputDevice(未完成)
|
函數(shù)名稱 |
Pa_GetDefaultInputDevice |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
獲取操作系統(tǒng)中默認(rèn)的音頻輸入設(shè)備。 |
|
函數(shù)聲明 |
PaDeviceIndex Pa_GetDefaultInputDevice ( void ); |
|
函數(shù)參數(shù) |
無 |
|
返回值 |
paNoDevice宏(-1):沒有音頻輸入設(shè)備。 大于等于0:音頻輸入設(shè)備的索引號(hào)。 |
|
錯(cuò)誤碼 |
無 |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
|
3.10 Pa_GetDefaultOutputDevice(未完成)
|
函數(shù)名稱 |
Pa_GetDefaultOutputDevice |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
獲取操作系統(tǒng)中默認(rèn)的音頻輸入設(shè)備。 |
|
函數(shù)聲明 |
PaDeviceIndex Pa_GetDefaultOutputDevice ( void ); |
|
函數(shù)參數(shù) |
無 |
|
返回值 |
paNoDevice宏(-1):沒有音頻輸出設(shè)備。 大于等于0:音頻輸出設(shè)備的索引號(hào)。 |
|
錯(cuò)誤碼 |
無 |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
|
3.11 Pa_OpenStream(未完成)
|
函數(shù)名稱 |
Pa_OpenStream |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
使用指定的音頻輸入輸出設(shè)備打開一個(gè)音頻流句柄,用于 音頻輸入 或 音頻輸出 或 音頻輸入輸出。 |
|
函數(shù)聲明 |
PaError Pa_OpenStream ( PaStream ** stream, const PaStreamParameters * inputParameters, const PaStreamParameters * outputParameters, double sampleRate, unsigned long framesPerBuffer, PaStreamFlags streamFlags, PaStreamCallback * streamCallback, void * userData ); |
|
函數(shù)參數(shù) |
stream,[輸出]: 存放用于存放音頻流句柄的指針變量的內(nèi)存指針。 存放音頻流句柄的變量類型為PaStream *。 |
|
inputParameters,[輸入]: 。 |
|
|
outputParameters,[輸入|輸出|輸入&輸出]: 參數(shù)說明。 |
|
|
sampleRate,[輸入|輸出|輸入&輸出]: 參數(shù)說明。 |
|
|
framesPerBuffer,[輸入|輸出|輸入&輸出]: 參數(shù)說明。 |
|
|
streamFlags,[輸入|輸出|輸入&輸出]: 參數(shù)說明。 |
|
|
streamCallback,[輸入|輸出|輸入&輸出]: 參數(shù)說明。 |
|
|
userData,[輸入|輸出|輸入&輸出]: 參數(shù)說明。 |
|
|
返回值 |
paNoError枚舉(0x0000):成功。 其他:失敗,返回值就是錯(cuò)誤碼,調(diào)用Pa_GetErrorText()函數(shù)查看錯(cuò)誤碼對(duì)應(yīng)的錯(cuò)誤信息。 |
|
錯(cuò)誤碼 |
EXXXX:錯(cuò)誤碼說明。 EXXXX:錯(cuò)誤碼說明。 …… |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
…… …… |
3.12 Pa_OpenDefaultStream(未完成)
|
函數(shù)名稱 |
Pa_OpenDefaultStream |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
使用操作系統(tǒng)默認(rèn)的音頻輸入輸出設(shè)備打開一個(gè)音頻流句柄,用于 音頻輸入 或 音頻輸出 或 音頻輸入輸出。 |
|
函數(shù)聲明 |
PaError Pa_OpenDefaultStream ( PaStream ** stream, int numInputChannels, int numOutputChannels, PaSampleFormat sampleFormat, double sampleRate, unsigned long framesPerBuffer, PaStreamCallback * streamCallback, void * userData ); |
|
函數(shù)參數(shù) |
stream,[輸入]: 存放用于存放音頻流句柄的指針變量的內(nèi)存指針。 存放音頻流句柄的變量類型為PaStream *。 |
|
numInputChannels,[輸入]: 存放音頻流的音頻輸入聲道個(gè)數(shù),為0表示不需要音頻輸入,為1表示單聲道,為2表示雙聲道立體聲。 |
|
|
numOutputChannels,[輸入]: 存放音頻流的音頻輸出聲道個(gè)數(shù),為0表示不需要音頻輸出,為1表示單聲道,為2表示雙聲道立體聲。 |
|
|
sampleFormat,[輸入]: 存放音頻流的采樣位數(shù)和采樣格式。可以為(選一至一個(gè)): paFloat32宏(0x0001):用一個(gè)32位有符號(hào)浮點(diǎn)型存儲(chǔ)每個(gè)音頻數(shù)據(jù)塊。音頻數(shù)據(jù)范圍最高為1.0,最低為-1.0。 paInt32宏(0x0002):用一個(gè)32位有符號(hào)整型存儲(chǔ)每個(gè)音頻數(shù)據(jù)塊。音頻數(shù)據(jù)范圍最高為2147483647,最低為-2147483648。 paInt24宏(0x0004):用一個(gè)24位有符號(hào)整型存儲(chǔ)每個(gè)音頻數(shù)據(jù)塊。音頻數(shù)據(jù)范圍最高為8388607,最低為-8388608。 paInt16宏(0x0008):用一個(gè)16位有符號(hào)整型存儲(chǔ)每個(gè)音頻數(shù)據(jù)塊。音頻數(shù)據(jù)范圍最高為32767,最低為-32768。 paInt8宏(0x0010):用一個(gè)8位有符號(hào)整型存儲(chǔ)每個(gè)音頻數(shù)據(jù)塊。音頻數(shù)據(jù)范圍最高為127,最低為-128。 paUInt8宏(0x0020):用一個(gè)8位無符號(hào)整型存儲(chǔ)每個(gè)音頻數(shù)據(jù)塊。音頻數(shù)據(jù)范圍最高為255,最低為0。 paCustomFormat宏(0x10000): paNonInterleaved宏(0x80000000): |
|
|
sampleRate,[輸入]: 存放音頻的采樣頻率,單位赫茲。一般可以為:8000、11025、22050、44100。 |
|
|
framesPerBuffer,[輸入]: 存放當(dāng)每次處理完音頻數(shù)據(jù)時(shí),在音頻數(shù)據(jù)輸入輸出緩存中存放的每個(gè)聲道的音頻數(shù)據(jù)塊個(gè)數(shù)。 音頻數(shù)據(jù)輸入輸出緩存在音頻數(shù)據(jù)處理回調(diào)函數(shù)中使用,如果不采用回調(diào)函數(shù)方式,本參數(shù)無意義。 |
|
|
streamCallback,[輸入]: 存放音頻數(shù)據(jù)處理回調(diào)函數(shù)的內(nèi)存指針,表示采用回調(diào)函數(shù)方式進(jìn)行音頻輸入數(shù)據(jù)采樣,或播放音頻數(shù)據(jù)。 音頻數(shù)據(jù)處理回調(diào)函數(shù)是程序自己定義的,且會(huì)一直在另外一個(gè)獨(dú)立的新線程中自動(dòng)被調(diào)用執(zhí)行。參考PaStreamCallback。 如果不采用回調(diào)函數(shù)方式,本參數(shù)就填NULL。
回調(diào)函數(shù)調(diào)用條件: 如果要打開的音頻流只需要音頻輸入,那么每次當(dāng)音頻輸入數(shù)據(jù)采樣完畢,就會(huì)自動(dòng)調(diào)用一次音頻數(shù)據(jù)處理回調(diào)函數(shù)。 如果要打開的音頻流只需要音頻輸出,那么每次當(dāng)音頻輸出數(shù)據(jù)播放完畢,就會(huì)自動(dòng)調(diào)用一次音頻數(shù)據(jù)處理回調(diào)函數(shù)。 如果要打開的音頻流需要音頻輸入和音頻輸出,那么每次當(dāng)音頻輸入數(shù)據(jù)采樣完畢,就會(huì)自動(dòng)調(diào)用一次音頻數(shù)據(jù)處理回調(diào)函數(shù)。因?yàn)椴蓸铀俣群筒シ潘俣仁且粯拥模跃椭徽{(diào)用一次音頻數(shù)據(jù)處理回調(diào)函數(shù)。 |
|
|
userData,[輸入]: 存放音頻數(shù)據(jù)處理回調(diào)函數(shù)被調(diào)用時(shí),傳遞給該函數(shù)的一個(gè)程序自定義參數(shù)。 |
|
|
返回值 |
paNoError枚舉(0x0000):成功。 其他:失敗,返回值就是錯(cuò)誤碼,調(diào)用Pa_GetErrorText()函數(shù)查看錯(cuò)誤碼對(duì)應(yīng)的錯(cuò)誤信息。 |
|
錯(cuò)誤碼 |
EXXXX:錯(cuò)誤碼說明。 EXXXX:錯(cuò)誤碼說明。 …… |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
打開音頻流句柄后,需要調(diào)用Pa_StartStream()函數(shù),才能讓音頻流句柄開始處理音頻數(shù)據(jù)。 如果不采用回調(diào)函數(shù)方式,可以調(diào)用Pa_ReadStream()函數(shù)或Pa_WriteStream()函數(shù)處理音頻數(shù)據(jù)。 |
3.13 Pa_CloseStream(未完成)
|
函數(shù)名稱 |
Pa_CloseStream |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
關(guān)閉一個(gè)已經(jīng)打開的音頻流句柄。 |
|
函數(shù)聲明 |
PaError Pa_CloseStream ( PaStream * stream ); |
|
函數(shù)參數(shù) |
stream,[輸入]: 存放音頻流句柄。 |
|
返回值 |
paNoError枚舉(0x0000):成功。 其他:失敗,返回值就是錯(cuò)誤碼,調(diào)用Pa_GetErrorText()函數(shù)查看錯(cuò)誤碼對(duì)應(yīng)的錯(cuò)誤信息。 |
|
錯(cuò)誤碼 |
EXXXX:錯(cuò)誤碼說明。 EXXXX:錯(cuò)誤碼說明。 …… |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
…… …… |
3.14 PaStreamCallback(未完成)
|
函數(shù)名稱 |
PaStreamCallback |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
頭文件 |
#include "PortAudio.h" |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
函數(shù)功能 |
音頻數(shù)據(jù)處理回調(diào)函數(shù)。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
函數(shù)聲明 |
int PaStreamCallback ( const void * input, void * output, unsigned long frameCount, const PaStreamCallbackTimeInfo * timeInfo, PaStreamCallbackFlags statusFlags, void * userData ) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
函數(shù)參數(shù) |
input,[輸入]: 存放音頻數(shù)據(jù)輸入緩存的內(nèi)存指針,也就是音頻設(shè)備采樣到的音頻數(shù)據(jù)。 音頻數(shù)據(jù)輸入緩存的長(zhǎng)度計(jì)算方法(單位字節(jié)):聲道個(gè)數(shù)×每個(gè)聲道的音頻數(shù)據(jù)塊個(gè)數(shù)×采樣位數(shù)÷8。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
output,[輸出]: 存放音頻數(shù)據(jù)輸出緩存的內(nèi)存指針,也就是需要音頻設(shè)備播放的音頻數(shù)據(jù)。 音頻數(shù)據(jù)輸出緩存的長(zhǎng)度計(jì)算方法(單位字節(jié)):聲道個(gè)數(shù)×每個(gè)聲道的音頻數(shù)據(jù)塊個(gè)數(shù)×采樣位數(shù)÷8 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
frameCount,[輸入]: 存放音頻數(shù)據(jù)輸入輸出緩存中存放的每個(gè)聲道的音頻數(shù)據(jù)塊個(gè)數(shù)。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
timeInfo,[輸入|輸出|輸入&輸出]: 參數(shù)說明。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
statusFlags,[輸入|輸出|輸入&輸出]: 參數(shù)說明。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
userData,[輸入&輸出]: 存放程序自定義參數(shù)。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
返回值 |
返回值1:返回值說明。 返回值2:返回值說明。 …… |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
錯(cuò)誤碼 |
EXXXX:錯(cuò)誤碼說明。 EXXXX:錯(cuò)誤碼說明。 …… |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
其他說明 |
音頻數(shù)據(jù)輸入輸出緩存的內(nèi)存格式:
就是這樣的。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3.15 Pa_StartStream(未完成)
|
函數(shù)名稱 |
Pa_StartStream |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
讓一個(gè)已經(jīng)打開的音頻流句柄開始處理音頻數(shù)據(jù)。 |
|
函數(shù)聲明 |
類型 函數(shù)名 ( 類型 參數(shù)1, 類型 參數(shù)2, …… ); |
|
函數(shù)參數(shù) |
參數(shù)1,[輸入|輸出|輸入&輸出]: 參數(shù)說明。 |
|
參數(shù)2,[輸入|輸出|輸入&輸出]: 參數(shù)說明。 |
|
|
…… |
|
|
返回值 |
返回值1:返回值說明。 返回值2:返回值說明。 …… |
|
錯(cuò)誤碼 |
EXXXX:錯(cuò)誤碼說明。 EXXXX:錯(cuò)誤碼說明。 …… |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
停止處理音頻數(shù)據(jù)需要調(diào)用Pa_StopStream()函數(shù)。 |
3.16 Pa_StopStream(未完成)
|
函數(shù)名稱 |
Pa_StopStream |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
讓一個(gè)已經(jīng)打開的音頻流句柄停止處理音頻數(shù)據(jù)。 |
|
函數(shù)聲明 |
類型 函數(shù)名 ( 類型 參數(shù)1, 類型 參數(shù)2, …… ); |
|
函數(shù)參數(shù) |
參數(shù)1,[輸入|輸出|輸入&輸出]: 參數(shù)說明。 |
|
參數(shù)2,[輸入|輸出|輸入&輸出]: 參數(shù)說明。 |
|
|
…… |
|
|
返回值 |
返回值1:返回值說明。 返回值2:返回值說明。 …… |
|
錯(cuò)誤碼 |
EXXXX:錯(cuò)誤碼說明。 EXXXX:錯(cuò)誤碼說明。 …… |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
…… …… |
3.17 Pa_ReadStream(未完成)
|
函數(shù)名稱 |
Pa_ReadStream |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
從一個(gè)已經(jīng)打開并開始處理音頻數(shù)據(jù)的音頻流句柄,阻塞采集指定長(zhǎng)度的音頻數(shù)據(jù)。 |
|
函數(shù)聲明 |
PaError Pa_ReadStream ( PaStream * stream, void * buffer, unsigned long frames ); |
|
函數(shù)參數(shù) |
stream,[輸入]: 存放音頻流句柄。 |
|
buffer,[輸出]: 存放音頻數(shù)據(jù)輸入緩存的內(nèi)存指針,也就是音頻設(shè)備采樣到的音頻數(shù)據(jù)。 |
|
|
frames,[輸入]: 存放音頻數(shù)據(jù)輸入緩存中存放的每個(gè)聲道的音頻數(shù)據(jù)塊個(gè)數(shù)。 音頻數(shù)據(jù)輸入緩存的長(zhǎng)度計(jì)算方法(單位字節(jié)):聲道個(gè)數(shù)×每個(gè)聲道的音頻數(shù)據(jù)塊個(gè)數(shù)×采樣位數(shù)÷8。 |
|
|
返回值 |
paNoError枚舉(0x0000):成功。 其他:失敗,返回值就是錯(cuò)誤碼,調(diào)用Pa_GetErrorText()函數(shù)查看錯(cuò)誤碼對(duì)應(yīng)的錯(cuò)誤信息。 |
|
錯(cuò)誤碼 |
EXXXX:錯(cuò)誤碼說明。 EXXXX:錯(cuò)誤碼說明。 …… |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
…… …… |
3.18 Pa_WriteStream(未完成)
|
函數(shù)名稱 |
Pa_WriteStream |
|
頭文件 |
#include "PortAudio.h" |
|
庫(kù)文件 |
#pragma comment(lib, "PortAudio_x86.lib或PortAudio_x64.lib") |
|
函數(shù)功能 |
從一個(gè)已經(jīng)打開并開始處理音頻數(shù)據(jù)的音頻流句柄,阻塞播放指定長(zhǎng)度的音頻數(shù)據(jù)。 |
|
函數(shù)聲明 |
PaError Pa_WriteStream ( PaStream * stream, const void * buffer, unsigned long frames ); |
|
函數(shù)參數(shù) |
stream,[輸入]: 存放音頻流句柄。 |
|
buffer,[輸入]: 存放音頻數(shù)據(jù)輸出緩存的內(nèi)存指針,也就是音頻設(shè)備采樣到的音頻數(shù)據(jù)。 |
|
|
frames,[輸入]: 存放音頻數(shù)據(jù)輸出緩存中存放的每個(gè)聲道的音頻數(shù)據(jù)塊個(gè)數(shù)。 音頻數(shù)據(jù)輸出緩存的長(zhǎng)度計(jì)算方法(單位字節(jié)):聲道個(gè)數(shù)×每個(gè)聲道的音頻數(shù)據(jù)塊個(gè)數(shù)×采樣位數(shù)÷8。 |
|
|
返回值 |
paNoError枚舉(0x0000):成功。 其他:失敗,返回值就是錯(cuò)誤碼,調(diào)用Pa_GetErrorText()函數(shù)查看錯(cuò)誤碼對(duì)應(yīng)的錯(cuò)誤信息。 |
|
錯(cuò)誤碼 |
EXXXX:錯(cuò)誤碼說明。 EXXXX:錯(cuò)誤碼說明。 …… |
|
線程安全 |
是 或 否 或 未知,表示此函數(shù)多線程調(diào)用是否會(huì)產(chǎn)生影響 |
|
原子操作 |
是 或 否 或 未知,表示此函數(shù)是否是單一操作,不是多個(gè)步驟的組合 |
|
其他說明 |
…… …… |
4 結(jié)構(gòu)體庫(kù)
4.1 結(jié)構(gòu)體模板(未完成)
|
結(jié)構(gòu)體名稱 |
xxx |
|
頭文件 |
#include "PortAudio.h" |
|
結(jié)構(gòu)體稱呼 |
結(jié)構(gòu)體的中文稱呼。 |
|
結(jié)構(gòu)體說明 |
結(jié)構(gòu)體主要用途說明。 |
|
相關(guān)函數(shù) |
Func1()、Func2()、Func3()… |
|
結(jié)構(gòu)體聲明 |
struct xxx { 類型 成員變量1; 類型 成員變量2; …… }; |
|
成員變量 |
成員變量1: 成員變量說明。 |
|
成員變量2: 成員變量說明。 |
|
|
…… |
|
|
其他說明 |
…… …… |
4.2 PaDeviceInfo(未完成)
|
結(jié)構(gòu)體名稱 |
PaDeviceInfo |
|
頭文件 |
#include <xxx.h> #include <xxx.h> |
|
結(jié)構(gòu)體說明 |
音頻設(shè)備信息結(jié)構(gòu)體,用于存放音頻設(shè)備的相關(guān)信息。 |
|
相關(guān)函數(shù) |
Pa_GetDeviceInfo()、Func2()、Func3()… |
|
結(jié)構(gòu)體聲明 |
typedef struct PaDeviceInfo { int structVersion; const char * name; PaHostApiIndex hostApi; /**< note this is a host API index, not a type id*/
int maxInputChannels; int maxOutputChannels;
/** Default latency values for interactive performance. */ PaTime defaultLowInputLatency; PaTime defaultLowOutputLatency; /** Default latency values for robust non-interactive applications (eg. playing sound files). */ PaTime defaultHighInputLatency; PaTime defaultHighOutputLatency;
double defaultSampleRate; } PaDeviceInfo; |
|
成員變量 |
structVersion: 存放本結(jié)構(gòu)體的版本號(hào),一直為2。 |
|
name: 存放音頻設(shè)備的名稱字符串的內(nèi)存指針,例如: "Microsoft 聲音映射器 - Input", "Speakers (Realtek HD Audio output)"。 |
|
|
hostApi: note this is a host API index, not a type id. |
|
|
maxInputChannels: 存放音頻設(shè)備的最大音頻輸入聲道個(gè)數(shù),為0表示本設(shè)備不支持音頻輸入。 |
|
|
maxOutputChannels: 存放音頻設(shè)備的最大音頻輸出聲道個(gè)數(shù),為0表示本設(shè)備不支持音頻輸出。 |
|
|
defaultLowInputLatency: Default latency values for interactive performance. |
|
|
defaultLowOutputLatency: 成員變量說明。 |
|
|
defaultHighInputLatency: Default latency values for robust non-interactive applications (eg. playing sound files). |
|
|
defaultHighOutputLatency: 成員變量說明。 |
|
|
defaultSampleRate: 存放音頻設(shè)備的默認(rèn)采樣頻率,單位Hz赫茲。 |
|
|
其他說明 |
|
4.3 PaStreamParameters(未完成)
|
結(jié)構(gòu)體名稱 |
PaStreamParameters |
|
頭文件 |
#include "PortAudio.h" |
|
結(jié)構(gòu)體說明 |
結(jié)構(gòu)體主要用途說明。 |
|
相關(guān)函數(shù) |
Pa_OpenStream()、Func2()、Func3()… |
|
結(jié)構(gòu)體聲明 |
typedef struct PaStreamParameters { /** A valid device index in the range 0 to (Pa_GetDeviceCount()-1) specifying the device to be used or the special constant paUseHostApiSpecificDeviceSpecification which indicates that the actual device(s) to use are specified in hostApiSpecificStreamInfo. This field must not be set to paNoDevice. */ PaDeviceIndex device;
/** The number of channels of sound to be delivered to the stream callback or accessed by Pa_ReadStream() or Pa_WriteStream(). It can range from 1 to the value of maxInputChannels in the PaDeviceInfo record for the device specified by the device parameter. */ int channelCount;
/** The sample format of the buffer provided to the stream callback, a_ReadStream() or Pa_WriteStream(). It may be any of the formats described by the PaSampleFormat enumeration. */ PaSampleFormat sampleFormat;
/** The desired latency in seconds. Where practical, implementations should configure their latency based on these parameters, otherwise they may choose the closest viable latency instead. Unless the suggested latency is greater than the absolute upper limit for the device implementations should round the suggestedLatency up to the next practical value - ie to provide an equal or higher latency than suggestedLatency wherever possible. Actual latency values for an open stream may be retrieved using the inputLatency and outputLatency fields of the PaStreamInfo structure returned by Pa_GetStreamInfo(). @see default*Latency in PaDeviceInfo, *Latency in PaStreamInfo */ PaTime suggestedLatency;
/** An optional pointer to a host api specific data structure containing additional information for device setup and/or stream processing. hostApiSpecificStreamInfo is never required for correct operation, if not used it should be set to NULL. */ void *hostApiSpecificStreamInfo;
} PaStreamParameters; |
|
成員變量 |
device: 成員變量說明。 |
|
channelCount: 成員變量說明。 |
|
|
sampleFormat: 成員變量說明。 |
|
|
suggestedLatency: 成員變量說明。 |
|
|
hostApiSpecificStreamInfo: 成員變量說明。 |
|
|
其他說明 |
…… …… |

浙公網(wǎng)安備 33010602011771號(hào)