Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> обработка wav 
:(
    Опции темы
bass
Дата 18.9.2012, 03:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
bass
Дата 18.9.2012, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: нет
Всего: 2



Поставил однобайтовое выравнивание вроде все заработало кроме
Код

mmioRead(hmmio, lpwiocb->lpData, lpwiocb->dwDataSize);


Возвращает -1  smile  smile  smile  smile  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1074 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.