Я пытаюсь получить входную информацию от своей гитары, которую можно воспроизвести через мой компьютер, используя библиотеку portaudio и ASIO sdk.Задержка ввода с обратным вызовом PortAudio и ASIO sdk
Я слежу за некоторыми учебными материалами на официальном сайте, чтобы получить основы. В настоящее время я получил это работает так, что Portaudio слушает входного и выходного устройства правого и у меня есть установка обратного вызова только выводить входной и ничего не делать с ним, как это:
static int paTestCallback(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void *userData)
{
float *out = (float*)outputBuffer;
float* in = (float*)inputBuffer;
for (int i = 0; i<framesPerBuffer; i++)
{
*out++ = *in++; /* left */
*out++ = *in++; /* right */
}
return 0;
}
Этот обратный вызов установки путем вызова этого :
PaError error = Pa_OpenDefaultStream(&stream, 2, 2, paFloat32, 44100, paFramesPerBufferUnspecified, paTestCallback, &data);
Pa_StartStream(stream);
Теперь, это делает работу, но у меня есть много задержки (около 0,5с), когда я бью строку на моей гитаре, и когда я слышу его через мониторы.
Есть ли способ решить эту задержку? Нужно ли переписывать метод обратного вызова?
EDIT:
Итак, я получил задержку быть намного лучше, используя этот код вместо основного Pa_OpenDefaultStream()
int defaultIn = Pa_GetDefaultInputDevice();
int defaultOut = Pa_GetDefaultOutputDevice();
PaStreamParameters *inParam = new PaStreamParameters();
inParam->channelCount = 2;
inParam->device = defaultIn;
inParam->sampleFormat = paFloat32;
inParam->suggestedLatency = 0.05;
PaStreamParameters *outParam = new PaStreamParameters();
outParam->channelCount = 2;
outParam->device = defaultOut;
outParam->sampleFormat = paFloat32;
outParam->suggestedLatency = 0;
error = Pa_OpenStream(&stream, inParam, outParam, 44100, paFramesPerBufferUnspecified, paNoFlag, paTestCallback, &data);
if (error != paNoError) {
Logger::log("[PortAudioManager] Could not open default stream. Exiting function...");
return;
}
Pa_StartStream(stream);
Существует еще немного задержки, хотя, в основном заметно при воспроизведении более чем одно примечание.
EDIT:
я понял, с помощью Ross-Bencina, что устройство ввода окна по умолчанию и устройство вывода не меняет ничего в индексе хоста API, в Portaudio. Кажется, я все время использовал MME. Я сделал следующее, чтобы получить правильный индекс для устройства ASIO:
int hostNr = Pa_GetHostApiCount();
std::vector<const PaHostApiInfo*> infoVertex;
for (int t = 0; t < hostNr; ++t) {
infoVertex.push_back(Pa_GetHostApiInfo(t));
}
Тогда я только что проверил, который является один с ASIO и установить suggestedLatency в обоих PaStreamParameters
до 0, а задержка в настоящее время нет, и звук хороший (хотя сейчас это моно).
Замечательно знать о тех вещах, о которых я думал. Я попытался установить обе задержки на ноль, и это дает мне реальный звук нарезанного звука. О панели управления Asio: нет устройства, когда устройство загружается с помощью portaudio. Он не отображается на панели задач, как если бы я начал играть в Guitar Rig. – Dries
Я также пробовал 'PaAsio_ShowControlPanel (defaultIn, hwnd)', но я получаю сообщение об ошибке, что мое устройство недействительно. Любые мысли по этому поводу? – Dries
Хм. 'Pa_GetDefaultInputDevice' вернет только устройство ASIO, если вы создали PortAudio для * только * ASIO. Если вы также создали, например, WMME или DirectSound, то Pa_GetDefaultInputDevice вернет те, что относятся к ASIO. Возможно, вам нужно будет решить, какое устройство является вашим устройством ASIO. например запустив pa_devs или извлекая устройство ASIO по умолчанию (подробнее просмотрите API перечисления устройств). –