Skip to content

Instantly share code, notes, and snippets.

@tnayuki
Created September 28, 2016 03:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tnayuki/38174e875fa9f958b7c6ed1c97e9458c to your computer and use it in GitHub Desktop.
Save tnayuki/38174e875fa9f958b7c6ed1c97e9458c to your computer and use it in GitHub Desktop.
ASIOドライバーの列挙・初期化・情報取得を行うUnityプラグイン。入出力は未実装。
#include <asiosys.h>
#include <asio.h>
#include <asiodrivers.h>
#include "monoAPI.h"
#define UNITY_ASIO_MAX_DRIVERS 16
extern "C" __declspec(dllexport) MonoArray *UnityASIOEnumerateDrivers() {
AsioDrivers *asioDrivers = new AsioDrivers();
long numberOfDrivers;
char driverNameBuffer[32 * UNITY_ASIO_MAX_DRIVERS];
char *names[UNITY_ASIO_MAX_DRIVERS];
for (int i = 0; i < UNITY_ASIO_MAX_DRIVERS; i++) {
names[i] = driverNameBuffer + 32 * i;
}
numberOfDrivers = asioDrivers->getDriverNames(names, UNITY_ASIO_MAX_DRIVERS);
MonoArray *monoArray = mono_array_new(mono_domain_get(), mono_get_string_class(), numberOfDrivers);
for (int i = 0; i < numberOfDrivers; i++) {
((MonoString **)monoArray->vector)[i] = mono_string_new(mono_domain_get(), &driverNameBuffer[32 * i]);
}
delete asioDrivers;
return monoArray;
}
extern "C" __declspec(dllexport) void UnityASIOLoadDriver(char *driverName) {
AsioDrivers *asioDrivers = new AsioDrivers();
asioDrivers->loadDriver((char *)driverName);
}
extern "C" __declspec(dllexport) void UnityASIOInit() {
ASIODriverInfo adi;
memset(&adi, 0, sizeof(adi));
adi.asioVersion = 0;
adi.sysRef = GetForegroundWindow();
ASIOInit(&adi);
}
extern "C" __declspec(dllexport) void UnityASIOGetChannels(long *numInputChannels, long *numOutputChannels) {
ASIOGetChannels(numInputChannels, numOutputChannels);
}
extern "C" __declspec(dllexport) long UnityASIOCanSampleRate(double sampleRate) {
return ASIOCanSampleRate(sampleRate)/* == ASE_OK*/;
}
extern "C" __declspec(dllexport) double UnityASIOGetSampleRate() {
double sampleRate;
ASIOError error;
error = ASIOGetSampleRate(&sampleRate);
return sampleRate;
}
extern "C" __declspec(dllexport) void UnityASIOControlPanel() {
ASIOControlPanel();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment