WaveIn и WaveOut одновременно как?
frKiller:
Делаю я прогу, которая должна генерить синус на выход, и одновременно считывать его на входе. Сигнал проходит через некий прибор и надо видеть два графика, исходный и полученый на входе. Грабли в том что играть и писать надо СИНХРОННО, потому как сигналы я потом буду сравнивать, в том числе и по фазе! создал я все нужные буферы, в выходной буфер синус запихал и написал:
waveOutWrite(hWaveOut, &WaveOutHdr, sizeof(WaveOutHdr));
waveInAddBuffer(hWaveIn,TempHdr,sizeof(WAVEHDR));
Билдер нафиг завис:(
Ладно.. тогда я решил сделать обычный калбяк на заполнение входного буфера. Типа буфер заполнился, калбяк вызвался, передал следующий буфер для записи и включил заодно выходной буфер на воспроизведение с самого начала.:
void CALLBACK FullBuf(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
if(uMsg==WIM_DATA && hwi==hWaveIn)
{
WAVEHDR * TempHdr= (WAVEHDR *)dwParam1;
TempHdr->lpData;
waveOutReset(hWaveOut);
waveOutWrite(hWaveOut, &WaveOutHdr, sizeof(WaveOutHdr)); какбэ стратуем с нуля
waveInAddBuffer(hWaveIn,TempHdr,sizeof(WAVEHDR)); какбэ начинаем запись одновременно
}
}
Опять все вешается да так что нельзя даже снять задачу.
Как же мне реализовать одновременную запись и воспроизведение?
Zor:
а весь код ввода/вывода на карту можно?
Hammersoft:
1. Синхронно не получится. Проиграется буфер воспроизведения в буфер записи, заполнится (хотя, вроде, можно данные считывать не с заполненного), пройдет много периодов, какая тут уже фаза?
2. Может, хотя бы сначала сделать запись или воспроизведение?
frKiller:
Цитата: Zor от 22 Июнь 2011, 15:34:27
а весь код ввода/вывода на карту можно?
Длинный он сильно.. стандартный код вобщем в инте есть везде - подготавливаются структуры, буферы, вызывается:
mmRes=waveOutOpen(&hWaveOut, WAVE_MAPPER, &WaveFormatOut,(DWORD)FinishedBuf, 0L, CALLBACK_FUNCTION);
MMRESULT mmRes =waveInOpen(&hWaveIn, WAVE_MAPPER, &WaveFormat,(DWORD)FullBuf, 0L, CALLBACK_FUNCTION);
затем по калбячным функциям:
void CALLBACK FullBuf(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
if(uMsg==WIM_DATA && hwi==hWaveIn)
{
WAVEHDR * TempHdr= (WAVEHDR *)dwParam1;
TempHdr->lpData;
здесь некие расчеты с данными из входного буфера, например визуализация
waveInAddBuffer(hWaveIn,TempHdr,sizeof(WAVEHDR));
}
}
void CALLBACK FinishedBuf(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
//если выходной буфер отыграл свое, запускаем его играть заново
waveOutWrite(hWaveOut, &WaveOutHdr, sizeof(WaveOutHdr));
}
в таком виде все прекрасно игрет и пишет ОДНОВРЕМЕННО. НО НЕСИНХРОННО! Можно гитарный процессор забабахать:) Представте себе две синусоиды - одна в накопилась буфере записи, другая лежит изначально в буфере воспроизведения. При СИНХРОННОЙ работе АЦП оне должны накладываться друг на друга. А тут они ползают туда сюда относительно друг друга:(
Вижу два варианта:
1. Использовать фнукцию WaveOutGetPosition дабы определить какой байт выходного буфера играл в тот момент когда входной буфер заполнился. Зная длину обеих буферов легко вычислить какие байты надо сравнивать. Вчера пробовал.. что то мутное дело..
2. Сделать стерео запись с микрофона. На один канал R песать сигнал прямо с выхода (тупо соединить OUT R и MIC IN R через резистор). На другой канал L - сигнал прошедший сквозь схему. Тогда вроде бы должно быть две дорожки абсолютно синхронные по времени, где будет чотко видно как изменился сигнал по сравнению с исходным. Седня попробую
Hammersoft:
Микрофонный вход обычно моно. Линейный всегда стерео.
Навигация