Опытный
 
Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007
Репутация: нет Всего: 2
|
Добрый день, с обработкой звука сталкиваюсь впервые. И что то у меня не получаеться.... Ниже приведеннй код открывает файл и проходит вроде без ошибок. Но значение переменоой тест = 3116; ?????? Файл проигрываеться нормально, что не так делаю, может он быть упакован(имею виду компрессию), хотя на размер выработки кодировка не должна влиять...... Пидеи он можеть быть 1 2 4 ... 1 - 8 бит один канал и т.д Система ХР ...... Компилятор Билдер 6 ..... Код | int test =(lpwiocb->wBitsPerSample/8) * lpwiocb->lpFmt->wf.nChannels;
|
Код | int wioFileOpen(LPWAVEIOCB lpwiocb, LPSTR lpszFileName) { HMMIO hmmio; MMCKINFO ckRIFF, ckFMT; DWORD dwFmtSize;
// Открываем wav-файл hmmio = mmioOpen((LPSTR)lpszFileName, NULL,MMIO_READ | MMIO_ALLOCBUF); if(!hmmio) {return WIOERR_FILEERROR;}
// Ищем фрагмент "WAVE" memset(&ckRIFF, 0, sizeof(MMCKINFO)); ckRIFF.fccType = mmioFOURCC('W', 'A', 'V', 'E');
if(mmioDescend(hmmio, &ckRIFF, NULL, MMIO_FINDRIFF)) {mmioClose(hmmio,0);return WIOERR_BADFORMAT;}
// Ищем фрагмент "fmt " memset(&ckFMT, 0, sizeof(MMCKINFO)); ckFMT.ckid = mmioFOURCC('f', 'm', 't', ' ');
if(mmioDescend(hmmio, &ckFMT, &ckRIFF, MMIO_FINDCHUNK)) { mmioClose(hmmio,0); return WIOERR_BADFORMAT; }
dwFmtSize = sizeof(PCMWAVEFORMAT); //ckFMT.cksize;//
// Получаем память для загрузки формата звукового файла lpwiocb->lpFmt = (PCMWAVEFORMAT FAR *)GlobalAlloc(GPTR, dwFmtSize);
if(!lpwiocb->lpFmt) { mmioClose(hmmio,0); return WIOERR_NOMEM; }
// Загружаем формат звукового файла if(mmioRead(hmmio, (HPSTR)lpwiocb->lpFmt, dwFmtSize) != (LONG)dwFmtSize) { GlobalFree(lpwiocb->lpFmt); mmioClose(hmmio,0); return WIOERR_READERROR; }
// Проверяем формат звукового файла if(lpwiocb->lpFmt->wf.wFormatTag != WAVE_FORMAT_PCM) { GlobalFree(lpwiocb->lpFmt); mmioClose(hmmio,0); return WIOERR_BADFORMAT; }
// Проверяем способность драйвера работать с указанным форматом if(waveOutOpen(NULL, WAVE_MAPPER, (WAVEFORMATEX FAR *)lpwiocb->lpFmt, NULL, 0L, WAVE_FORMAT_QUERY | WAVE_ALLOWSYNC)) { GlobalFree(lpwiocb->lpFmt); mmioClose(hmmio,0); return WIOERR_BADFORMAT; }
// Вычисляем количество байт, необходимых для // хранения одной выборки звукового сигнала lpwiocb->wBitsPerSample = lpwiocb->lpFmt->wBitsPerSample; //lpwiocb->wBytesPerSample = 0; int test =(lpwiocb->wBitsPerSample/8) * lpwiocb->lpFmt->wf.nChannels; Form1->Memo1->Lines->Add(IntToStr(test)); // Ищем фрагмент "data" mmioAscend(hmmio, &ckFMT, 0); ckFMT.ckid = mmioFOURCC('d', 'a', 't', 'a');
if(mmioDescend(hmmio, &ckFMT, &ckRIFF, MMIO_FINDCHUNK)) { GlobalFree(lpwiocb->lpFmt); mmioClose(hmmio,0); return WIOERR_BADFORMAT; }
// Определяем размер фрагмента сегмента звуковых // данных и его смещение в wav-файле lpwiocb->dwDataSize = ckFMT.cksize; lpwiocb->dwDataOffset = ckFMT.dwDataOffset;
// Проверяем, что файл не пуст if(lpwiocb->dwDataSize == 0L) { GlobalFree(lpwiocb->lpFmt); mmioClose(hmmio,0); return WIOERR_BADFORMAT; }
// Получаем память для заголовка блока lpwiocb->lpWaveHdr = (LPWAVEHDR)GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, sizeof(WAVEHDR)); if(!lpwiocb->lpWaveHdr) return WIOERR_NOMEM;
// Получаем память для звуковых данных lpwiocb->lpData = (HPSTR)GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, lpwiocb->dwDataSize); if(!lpwiocb->lpData) return WIOERR_NOMEM;
// Позиционирование на начало звуковых данных mmioSeek(hmmio, SEEK_SET, lpwiocb->dwDataOffset);
// Читаем звуковые данные mmioRead(hmmio, lpwiocb->lpData, lpwiocb->dwDataSize);
// Закрываем wav-файл mmioClose(hmmio,0);
return WIOERR_NOERROR; }
|
И еще подскажите.... вот я получаю буффер данных. Код | mmioRead(hmmio, lpwiocb->lpData, lpwiocb->dwDataSize);
|
Указатель на буфер у нас lpwiocb->lpData первые восемь бит выработка первого канала, вторые восемь второго, третии первого и т.д. Так если у нас два канала и 8 бит ????? И еще на звуковой карте у нас двухканальное АЦП одновременно делает замеры или поочереди???? Заранее спасибо. Это сообщение отредактировал(а) bass - 18.9.2012, 03:21
|