Skip to content

Instantly share code, notes, and snippets.

@GRGSIBERIA
Created July 19, 2016 03:19
Show Gist options
  • Save GRGSIBERIA/95d515ff9132057e370ce3ce543d567d to your computer and use it in GitHub Desktop.
Save GRGSIBERIA/95d515ff9132057e370ce3ce543d567d to your computer and use it in GitHub Desktop.
#include "TinyASIO.hpp"
using namespace asio;
// ControllerBaseを継承することで,オリジナルのコントローラを作れます
class OriginalController : public ControllerBase
{
// コールバック関数から呼び出せるようにstaticで宣言する
static InputBuffer* input;
static OutputBuffer* output;
// バッファリング用のコールバック関数
// バッファが満杯になるとASIOから呼び出される
static void BufferSwitch(long index, long)
{
void* outBuf = output->GetBuffer(index); // ASIO側の出力バッファのアドレス
void* inBuf = input->GetBuffer(index); // ASIO側の入力バッファのアドレス
// 入力から出力に流す,BufferSize()でバッファの容量を返す
memcpy(outBuf, inBuf, BufferSize()); // 入力バッファ0 => 出力バッファ0
// 入力ストリームに蓄積する,BufferLength()でバッファの個数を返す
input->Store(inBuf, BufferLength()); // 入力バッファ0 => 入力ストリーム0
// note: 重い処理をかけると音が途切れるので注意
// note: フーリエなどの処理は一度ストリームに蓄積して,コールバック関数外で処理するのがベタです
}
public:
OriginalController(const std::string& driverName) : ControllerBase(driverName)
{
// CreateBufferでバッファの初期化とコールバック関数の登録をする
// 1番の入力チャンネルと0番の出力チャンネルからバッファを生成する
CreateBuffer({channelManager->Inputs(1), channelManager->Outputs(0)}, &BufferSwitch);
input = &bufferManager->Inputs(0); // 入力チャンネル1 => 入力バッファ0
output = &bufferManager->Outputs(0); // 出力チャンネル0 => 出力バッファ0
}
StreamPtr Fetch()
{
// 入力ストリームの内容を取り出す
return input->Fetch();
}
};
InputBuffer* OriginalController::input = nullptr;
OutputBuffer* OriginalController::output = nullptr;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment