MacOSでPortAudioを使いたい(参考にするサイトの選択ミス:失敗)
PortAudioとは
PortAudioは、リアルタイムオーディオ入出力用のオープンソースC言語ライブラリーです。ハードウェアのオーディオインターフェイスから、リアルタイムオーディオストリームを取得および出力できる関数を提供しています。ネイティブオーディオAPIを直接処理する複雑さを隠して、オーディオソフトウェアの開発が簡素化できるように設計されています。
PortAudioは、録音、編集、ミキシングアプリケーション、ソフトウェアシンセサイザー、エフェクトプロセッサ、音楽プレーヤー、インターネットテレフォニーアプリケーション、ソフトウェア無線などを実装するために使用されています。
サポートするプラットフォームは、MS Windows、Mac OS X、およびLinuxが含まれ、サードパーティの言語バインディングにより、Java、C ++、C#などの他のプログラミング言語からPortAudioを呼び出すことができます。
p
らしい.とりあえずMac OSで使えそうなので期待.
インストール
最新とはいっても記事は2017年なので(今は2022/8)少し違うところはあるかもしれない.
さっきの記事は,読んでみて手順が多いのとなんかwindowsっぽいのでこの記事の最初のところをやってみる.
で実行した結果は.
MacBook-Air Go % brew install portaudio
Running `brew update --auto-update`...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> New Formulae
agg vineyard
==> Downloading https://ghcr.io/v2/homebrew/core/portaudio/manifests/19.7.0-1
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/portaudio/blobs/sha256:3daf7c4d
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh
######################################################################## 100.0%
==> Pouring portaudio--19.7.0.arm64_big_sur.bottle.1.tar.gz
🍺 /opt/homebrew/Cellar/portaudio/19.7.0: 33 files, 560KB
==> Running `brew cleanup portaudio`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
サイトでは
$ brew install portaudio
Warning: You are using OS X 10.12.
We do not provide support for this pre-release version.
You may encounter build failures or other breakages.
==> Downloading http://www.portaudio.com/archives/pa_stable_v19_20140130.tgz
Already downloaded: /Library/Caches/Homebrew/portaudio-19.20140130.tgz
==> ./configure --prefix=/usr/local/Cellar/portaudio/19.20140130 --enable-mac-un
==> make install
🍺 /usr/local/Cellar/portaudio/19.20140130: 32 files, 449.3K, built in 54 seconds
ちょっと違うけど,サイトの方はすでにダウンロードしてあるから違うんだろうか.
じゃあもう一回実行してみよう.
MacBook-Air Go % brew install portaudio
Warning: portaudio 19.7.0 is already installed and up-to-date.
To reinstall 19.7.0, run:
brew reinstall portaudio
別に既に入ってたからサイトでああなったわけではなさそうだけど,これを見るとちゃんとinstallできてるっぽいので先にすすむ.
実行
でもこれだけだと現在のディレクトリにportaudio.hなんてファイル存在してないし,
my_function.c
#include<stdio.h>
#include<math.h>
#include"portaudio.h"
#define Fs 44100 //サンプリング周波数
#define FRAMES_PER_BUFFER 128 //バッファサイズ
#define pi 3.14159265358979323
/*ユーザ定義データ*/
typedef struct{
float freq; //正弦波の周波数
float index;
}padata;
/* オーディオ処理コールバック関数*/
static int dsp(const void *inputBuffer, //入力
void *outputBuffer, //出力
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo *timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData //ユーザ定義データ
){
padata *data = (padata *)userData;
float *out = (float *)outputBuffer;
long i;
for( i=0; i<framesPerBuffer; i++){
*out++ = 0.7 * sin( 2 * pi * data->freq * data->index / Fs ); //チャンネル1(左)
*out++ = 0.7 * sin( 2 * pi * data->freq * data->index / Fs ); //チャンネル2(右)
data->index+=1.f;
}
return 0;
}
int main(void){
PaStreamParameters outParam; //出力の定義
PaStream *stream;
PaError err;
padata data; //ユーザ定義データ
data.freq = 800.f;
data.index = 0.f;
//PortAudio初期化
Pa_Initialize();
//出力の設定
outParam.device = Pa_GetDefaultOutputDevice(); //デフォルトのオーディオデバイス
outParam.channelCount = 2;
outParam.sampleFormat = paFloat32; //32bit floatで処理
outParam.suggestedLatency = Pa_GetDeviceInfo( outParam.device )->defaultLowOutputLatency;
outParam.hostApiSpecificStreamInfo = NULL;
//PortAudioオープン
Pa_OpenStream(
&stream,
NULL,
&outParam,
Fs,
FRAMES_PER_BUFFER,
paClipOff,
dsp,
&data);
//PortAudioスタート
Pa_StartStream(stream);
//エンターキーが押されるまで待機
getchar();
//PortAudio終了
Pa_StopStream(stream);
Pa_CloseStream(stream);
Pa_Terminate();
return 0;
}
これ,明らかにできなそうでは???
![](https://assets.st-note.com/img/1661948301581-OclvbYUonY.png?width=1200)
やっぱり.
速やかにportaudio.hを手に入れたい.調べる.
これではどうか,なんかoverwriteって.hファイル作ってくれる気がしないんだけど.
MacBook-Air Go % brew link --overwrite portaudio
Warning: Already linked: /opt/homebrew/Cellar/portaudio/19.7.0
To relink, run:
brew unlink portaudio && brew link portaudio
もうしてあるって言われた.当然赤の波線も消えてない.
ここにportaudio.hおいてあった.
ここにもあるけど,ここのはコピペしようとするときに行番号まで入ってくるから使い物にならない.上のgithubのやつと少し行数が違うけど,ほんとにぱっとみた感じは大体同じそうなのでgithubのやつを持ってきた.
my_function.cをコンパイルしてみよう.
MacBook-Air sound_wav % gcc -o my_function my_function.c
Undefined symbols for architecture arm64:
"_Pa_CloseStream", referenced from:
_main in my_function-1ecfb3.o
"_Pa_GetDefaultOutputDevice", referenced from:
_main in my_function-1ecfb3.o
"_Pa_GetDeviceInfo", referenced from:
_main in my_function-1ecfb3.o
"_Pa_Initialize", referenced from:
_main in my_function-1ecfb3.o
"_Pa_OpenStream", referenced from:
_main in my_function-1ecfb3.o
"_Pa_StartStream", referenced from:
_main in my_function-1ecfb3.o
"_Pa_StopStream", referenced from:
_main in my_function-1ecfb3.o
"_Pa_Terminate", referenced from:
_main in my_function-1ecfb3.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
linker command failed with exit codeは,リンクするファイルが足りてないということらしい.さっきコピペして持ってきたportaudio.hが正しくリンクされていないのだろうか.
一応さっきのbrew link --overwrite portaudioをもう一度やってみたが,既にリンクされていると同じことを出力されただけだった.ということは原因は別らしい.
そもそも,my_function.cのimport"portaudio.h"をコメントアウトしたらそこで定義してあるものには赤線が発生するし,portaudio.h内の構造体の名前を一文字消してみてもmy_function.cのその構造体の名前のところに赤線が発生するのでimport自体は問題ないみたいだ.
とりあえず怒られの文で検索.
なんかそれっぽいサイト,これしか見つからなかった.
というか,そもそも参考にしてたサイトをよくみたら
v18.1と違うのは,"portaudio_〇〇.lib" "portaudio_〇〇.dll" をビルドしないといけない点です.v18.1では,各オーディオ環境に応じたインクルードファイルとソースファイルを追加してビルドする方式でしたが,現在のバージョンでは,Windowsベースのオーディオ環境(恐らくDirectSoundとWASAPIとASIO)はlibとdllにまとめられていて,それをリンクすれば全ての環境が使えるようになるみたいです.例えば,同じアプリケーションで複数のオーディオ環境をサポートするようなアプリケーションは,これで作りやすくなったと言えますが,個人的には,事前準備なくソースを追加するだけで音を出せるv18.1の方が楽なので好きです.
もしかして,Mac OSじゃそもそも無理かもしれない.
そっとPCを閉じた.