<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      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):

      http://www.portaudio.com/

       

      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)存格式:

       

      第一個(gè)字節(jié)

      第二個(gè)字節(jié)

      第三個(gè)字節(jié)

      第四個(gè)字節(jié)

      ……

      單聲道

      8位采樣量化

      采樣1

      采樣2

      采樣3

      采樣4

      ……

      聲道0

      聲道0

      聲道0

      聲道0

      ……

       

       

       

       

       

       

      雙聲道

      8位采樣量化

      采樣1

      采樣2

      ……

      聲道0(左)

      聲道1(右)

      聲道0(左)

      聲道1(右)

      ……

       

       

       

       

       

       

      單聲道

      16位采樣量化

      采樣1

      采樣2

      ……

      聲道0

      (低位字節(jié))

      聲道0

      (高位字節(jié))

      聲道0

      (低位字節(jié))

      聲道0

      (高位字節(jié))

      ……

       

       

       

       

       

       

      雙聲道

      16位采樣量化

      采樣1

      ……

      聲道0(左)

      (低位字節(jié))

      聲道0(右)

      (高位字節(jié))

      聲道1(左)

      (低位字節(jié))

      聲道1(右)

      (高位字節(jié))

      ……

      就是這樣的。

       

       

      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

      成員變量說明。

      其他說明

      ……

      ……

       

       

       

       

      posted @ 2015-12-01 19:33  赤勇玄心行天道  閱讀(15300)  評(píng)論(2)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产av国片精品一区二区| 在线精品国产中文字幕| 国产精品麻豆中文字幕| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 久久久av男人的天堂| 亚洲无线一二三四区手机| 久久日韩精品一区二区五区| 国产成人午夜福利在线播放| 国内精品一区二区不卡| 中文字幕第一页国产| 色一乱一伦一图一区二区精品| 婷婷成人丁香五月综合激情| 国产欧美一区二区日本加勒比 | 日韩一区二区三区精彩视频| 国产一区二区三区九九视频| 成人无码特黄特黄AV片在线 | 桃花岛亚洲成在人线AV| 亚洲区一区二区三区精品| 亚洲精品日韩中文字幕| 亚洲嫩模喷白浆在线观看| 久久精品国产久精国产| 日韩中文免费一区二区| 中文字幕日韩一区二区不卡| 亚洲精品久久麻豆蜜桃| 日韩中文字幕亚洲精品| 亚洲国内精品一区二区| 中文字幕乱妇无码AV在线| 久久亚洲国产成人精品性色| 免费国产一级 片内射老| 竹菊影视欧美日韩一区二区三区四区五区| 男女啪啪高潮激烈免费版| 国产成人久久精品二区三| a级黑人大硬长爽猛出猛进 | 国产成熟女人性满足视频| 久久综合88熟人妻| 亚洲国产一区二区精品专| 99精品国产综合久久久久五月天| 玉屏| 久久爱在线视频在线观看| 亚洲国产日韩欧美一区二区三区 | 人妻饥渴偷公乱中文字幕|