PortAudioを使い始めようとしています。バンドルされたサンプルファイル「paex_sine.c」を問題なくビルドできます。これは、左チャネルの正弦波と右チャネルの異なる周波数の正弦波です。これはエラーなしで正しく機能します。
私のセットアップは、Puppy LinuxSlacko5.5を実行している32ビットPCです。EMU10k1xチップを搭載したSoundBlasterSB0200を搭載しています。Alsaライブラリはv1.0.26で、ドライバーはv1.0.24です。このコマンドを使用して、すべての5.1チャンネルをテストしました。
%スピーカーテスト-Dplug:surround51 -c6
テストでは、6つのチャネルのそれぞれで適切にサウンドが再生されますが、パイプの破損については不満があります。これは、6つのチャネルすべてのテストプログラムでバッファが十分に大きくないことが原因である可能性があります。
私が抱えている問題は、「paex_sine.c」を2つではなく6つのチャネルで実行するように変更すると、右前と左前のチャネルでのみサウンドが再生されることです。エラーは報告されておらず、2つのチャネルは適切に聞こえます。場合によっては、チャンネルのミュートを解除する必要があると聞きました。AlsaMixerとPuppyの「Retrovol」(AlsaMixerを反映)では、マスター、PCM、サラウンドをミュートせずに最大音量に設定しました。PortAudioに、ミュートを解除する必要のあるミキサーがありますか?スピーカーテストを適切に実行することと、変更されたpaex_sineの例を実行することと、2つのチャネルのみを聞くこととの間を行き来することができます。これが私が変更したpaex_sine.cです:
/ ** @file paex_sine.c @ingroup examples_src @brief正弦波を数秒間再生します。 @author Ross Bencina <rossb@audiomulch.com> @author Phil Burk <philburk@softsynth.com> * / / * * $ Id:paex_sine.c 1752 2011-09-08 03:21:55Z philburk $ * *このプログラムはPortAudioポータブルオーディオライブラリを使用しています。 *詳細については、http://www.portaudio.com/を参照してください。 * Copyright(c)1999-2000 Ross Bencina and Phil Burk * *許可は、これにより、取得するすべての人に無料で付与されます *このソフトウェアと関連するドキュメントファイルのコピー *(「ソフトウェア」)、制限なしにソフトウェアを扱うために、 *使用、コピー、変更、マージ、 *ソフトウェアのコピーを公開、配布、サブライセンス、および/または販売する、 *そして、ソフトウェアが提供された人にそうすることを許可するために、 *次の条件が適用されます。 * *上記の著作権表示およびこの許可通知は *ソフトウェアのすべてのコピーまたは実質的な部分に含まれます。 * *ソフトウェアは「現状有姿」で提供され、いかなる種類の保証もありません。 *明示または黙示を問わず、以下の保証を含みますが、これに限定されません。 *商品性、特定の目的への適合性、および非侵害。 *いかなる場合も、著者または著作権所有者は責任を負わないものとします。 *いかなる請求、損害、またはその他の責任は、 *契約、不法行為、またはその他の方法で、発生した、発生した、または関連した *本ソフトウェアまたは本ソフトウェアの使用またはその他の取引。 * / / * *上記のテキストはPortAudioライセンス全体を構成します。でも、 * PortAudioコミュニティは、以下の拘束力のない要求も行います。 * *ソフトウェアへの変更を配布したい人は誰でも *元の開発者に変更を送信して *正規バージョンに組み込むことができます。それも *これらの拘束力のない要求を *上記のライセンス。 * / #include <stdio.h> #include <math.h> #include "portaudio.h" #define NUM_SECONDS(30) #define SAMPLE_RATE(44100) #define FRAMES_PER_BUFFER(192)//(64) #ifndef M_PI #define M_PI(3.14159265) #endif #define TABLE_SIZE(200) typedef struct {{ float sine [TABLE_SIZE]; int left_phase; int right_phase; int left2_phase; int right2_phase; int left3_phase; int right3_phase; charメッセージ[20]; } paTestData; / *このルーチンは、オーディオが必要なときにPortAudioエンジンによって呼び出されます。 **一部のマシンでは割り込みレベルで呼び出される可能性があるため、何もしないでください **これはmalloc()やfree()の呼び出しのようにシステムを台無しにする可能性があります。 * / static int patestCallback(const void * inputBuffer、void * outputBuffer、 unsigned long framePerBuffer、 const PaStreamCallbackTimeInfo * timeInfo、 PaStreamCallbackFlags statusFlags、 void * userData) {{ paTestData * data =(paTestData *)userData; float * out =(float *)outputBuffer; unsigned long i; (void)timeInfo; /*未使用の変数の警告を防ぎます。* / (void)statusFlags; (void)inputBuffer; for(i = 0; i <framesPerBuffer; i ++) {{ * out ++ = data-> sine [data-> left_phase]; /* 左 */ * out ++ = data-> sine [data-> right_phase]; /* 右 */ * out ++ = data-> sine [data-> left2_phase]; /* 左 */ * out ++ = data-> sine [data-> right2_phase]; /* 右 */ * out ++ = data-> sine [data-> left3_phase]; /* 左 */ * out ++ = data-> sine [data-> right3_phase]; /* 右 */ data-> left_phase + = 1; if(data-> left_phase> = TABLE_SIZE)data-> left_phase-= TABLE_SIZE; data-> right_phase + = 3; / *ピッチが高いので、左右を区別できます。* / if(data-> right_phase> = TABLE_SIZE)data-> right_phase-= TABLE_SIZE; data-> left2_phase + = 5; if(data-> left2_phase> = TABLE_SIZE)data-> left2_phase-= TABLE_SIZE; data-> right2_phase + = 7; / *ピッチが高いので、左右を区別できます。* / if(data-> right2_phase> = TABLE_SIZE)data-> right2_phase-= TABLE_SIZE; data-> left3_phase + = 9; if(data-> left3_phase> = TABLE_SIZE)data-> left3_phase-= TABLE_SIZE; data-> right3_phase + = 11; / *ピッチが高いので、左右を区別できます。* / if(data-> right3_phase> = TABLE_SIZE)data-> right3_phase-= TABLE_SIZE; } paContinueを返します。 } / * *このルーチンは、再生が行われるときにportaudioによって呼び出されます。 * / static void StreamFinished(void * userData) {{ paTestData * data =(paTestData *)userData; printf( "Stream Completed:%s \ n"、data-> message); } / ************************************************* ****************** / int main(void); int main(void) {{ PaStreamParameters outputParameters; PaStream * stream; PaErrorエラー; paTestDataデータ; int i; printf( "PortAudio Test:出力正弦波。SR=%d、BufSize =%d \ n"、SAMPLE_RATE、FRAMES_PER_BUFFER); /*正弦波ウェーブテーブルを初期化します*/ for(i = 0; i <TABLE_SIZE; i ++) {{ data.sine [i] =(float)sin(((double)i /(double)TABLE_SIZE)* M_PI * 2.); } data.left_phase = data.right_phase = 0; data.left2_phase = data.right2_phase = 0; data.left3_phase = data.right3_phase = 0; err = Pa_Initialize(); if(err!= paNoError)goto error; outputParameters.device = Pa_GetDefaultOutputDevice(); /*デフォルトの出力デバイス*/ if(outputParameters.device == paNoDevice){ fprintf(stderr、 "エラー:デフォルトの出力デバイスがありません。\ n"); gotoエラー; } outputParameters.channelCount = 6; /*5.1チャンネル出力*/ outputParameters.sampleFormat = paFloat32; /*32ビット浮動小数点出力*/ outputParameters.suggestedLatency = Pa_GetDeviceInfo(outputParameters.device)-> defaultLowOutputLatency; outputParameters.hostApiSpecificStreamInfo = NULL; err = Pa_OpenStream( &ストリーム、 NULL、/*入力なし*/ &outputParameters、 サンプルレート、 FRAMES_PER_BUFFER、 paClipOff、/ *範囲外のサンプルは出力されないので、わざわざクリッピングしないでください* / patestCallback、 &データ ); if(err!= paNoError)goto error; sprintf(data.message、 "メッセージなし"); err = Pa_SetStreamFinishedCallback(stream、&StreamFinished); if(err!= paNoError)goto error; err = Pa_StartStream(stream); if(err!= paNoError)goto error; printf( "%d秒間再生します。\ n"、NUM_SECONDS); Pa_Sleep(NUM_SECONDS * 1000); err = Pa_StopStream(stream); if(err!= paNoError)goto error; err = Pa_CloseStream(stream); if(err!= paNoError)goto error; Pa_Terminate(); printf("テストが終了しました。\n"); エラーを返します。 エラー: Pa_Terminate(); fprintf(stderr、"portaudioストリームの使用中にエラーが発生しました\n"); fprintf(stderr、 "エラー番号:%d \ n"、err); fprintf(stderr、 "エラーメッセージ:%s \ n"、Pa_GetErrorText(err)); エラーを返します。 }