関数ポインタ追記
関数ポインタのうまい使い方を書き忘れてた。
同じ書式で重い処理と軽い処理を同居させられます。
例えば、波形を実際にバッファに書き込むような処理の場合
(例がおかしい…)
普通の書き込みは
void Fill( char *play_buf, char *sample_buf ) { ... for( i=0 ; i<buf_len ; i++ ) { // バッファに書き込み play_buf[i] += sample_buf[i]; } ... }
大体こんな感じ。
これに対して、一定サンプル毎に処理しないといけないエフェクト処理が入ることがあります。
その場合は
void FillEfx( char *play_buf, char *sample_buf ) { ... for( i=0 ; i<buf_len ; i++ ) { play_buf[i] += sample_buf[i]; .... // 一定サンプル毎に処理 if( efx_count == efx_span ) { Efx(); efx_count = 0; } efx_count ++; ... } ... }
大体こんな感じ。
見てわかる通り、書き込む度にifが入るので、書き込みのみと比べると大分重いです。
これを多チャンネルで鳴らそうとすると、
... for( i=0 ; i<ch_num ; i++ ) { FillEfx( play_buf, ch_sample[i] ); } ...
こんな感じになるわけで、このままだと部分的に軽い処理にしようと思っても、
全部エフェクト付きの処理にするか、if文で書き込む度に場合分けするしかないです。
しかし、処理する関数の型が同じなのであれば、
関数ポインタにあらかじめ処理内容をいれておけば、
そのままの形で軽い処理を盛り込める上に、
if文を使わずに済むので、処理を差し替えても実処理分以外の負荷はほとんどかからないことになります。
すなわち、
... for( i=0 ; i<ch_num ; i++ ) { // 外見は一緒だけど、処理内容は切り替え可能! (*pFill)( play_buf, ch_sample[i] ); } ...
この形式で結構いろいろなことが出来る…と、そんな感じなお話でした。
(ザックリすぎる…。)