INT32 DAUDIO_GetDirectAudioDeviceCount() {
    return (INT32) getAudioDeviceCount();
}
int startNativeAudio(int inDeviceId, unsigned int channels) {
    if(getAudioDeviceCount() < 1) {
        return -1;
    }
    // stop before
    stopNativeAudio();
    
    // create new
    audio = new RtAudio();
    std::cout << "RtAudio Version " << RtAudio::getVersion() << std::endl;
    
    if(inDeviceId<0) {
        inDeviceId = audio->getDefaultInputDevice();
    }
    
    RtAudio::DeviceInfo deviceInfo = audio->getDeviceInfo(inDeviceId);
    
    unsigned int bufferFrames = _BUFFER_FRAMES;
    unsigned int sampleRate = _SAMPLE_RATE;
    if(channels > deviceInfo.inputChannels) {
        channels = deviceInfo.inputChannels;
    }
    
    // make input parameters
    RtAudio::StreamParameters iParams;
    iParams.deviceId = inDeviceId;
    iParams.nChannels = channels;
    iParams.firstChannel = 0;
    
    // stream options
    RtAudio::StreamOptions options;
//    options.flags |= RTAUDIO_NONINTERLEAVED;
    
    
    bufferBytes = bufferFrames * channels * sizeof(MY_TYPE);
    
    // TODO
    bufferLength = channels * _SAMPLE_RATE;
    currentBufferIndex = 0;
    audioBuffer = (MY_TYPE*)malloc(bufferLength * sizeof(MY_TYPE));
    if(audioBuffer == NULL) {
        stopNativeAudio();
        return -1;
    }
    
    try {
        audio->openStream(NULL, &iParams, RT_FORMAT, sampleRate, &bufferFrames, &input, (void*)&data, &options);
    }
    catch (RtError& e) {
        std::cout << e.getMessage() << std::endl;
        stopNativeAudio();
        return -1;
    }
    data.bufferBytes = bufferBytes;
    data.channels = channels;
    
    try {
        audio->startStream();
    }
    catch (RtError& e) {
        std::cout << e.getMessage() << std::endl;
        stopNativeAudio();
        return -1;
    }
    
    return 0; // success
    
}