ПрограммированиеФорумЗвук

OpenAL Wave файлы

#0
23:26, 29 апр 2020

Всем привет, уважаемые формучане.
Учусь проигрывать звук с wave файлов (в будущем перейду на ogg) и столкнулся со следующей проблемой: на выводе (код ниже) получаю сектор fact. Как понимаю, я где-то прохожу сектор data и не могу понять где. Ткните меня носом в ошибку, чтобы дошло :)

Спасибо за помощь!

FILE* fp(NULL);
  fp = fopen("test.wav", "r");
  if (!fp)
  {
    endWithError((char*)"Cannot open file");
  }
  char type[4];
  DWORD size, chunkSize;
  short formatType, channels;
  DWORD sampleRate, avgBytesPerSec;
  short bytesPerSample, bitsPerSample;
  DWORD dataSize;
  

  fread(type, sizeof(char), 4, fp);
  if (type[0] != 'R' || type[1] != 'I' || type[2] != 'F' || type[3] != 'F')
    return endWithError((char*)"Not RIFF");

  fread(&size, sizeof(DWORD), 1, fp);

  fread(type, sizeof(char), 4, fp);
  if (type[0] != 'W' || type[1] != 'A' || type[2] != 'V' || type[3] != 'E')
    return endWithError((char*)"Not WAVE");

  fread(type, sizeof(char), 4, fp);
    if (type[0] != 'f' || type[1] != 'm' || type[2] != 't' || type[3] != ' ')
    return endWithError((char*)"Not fmt");

  fread(&chunkSize, sizeof(DWORD), 1, fp);
  fread(&formatType, sizeof(short), 1, fp);
  fread(&channels, sizeof(short), 1, fp);
  fread(&sampleRate, sizeof(DWORD), 1, fp);
  fread(&avgBytesPerSec, sizeof(DWORD), 1, fp);
  fread(&bytesPerSample, sizeof(short), 1, fp);
  fread(&bitsPerSample, sizeof(short), 1, fp);
  fread(type, sizeof(char), 4, fp);
  cout << type << endl;
  system("pause");
#1
0:07, 30 апр 2020

У меня было вот так

// u32 = unsigned int
// u16 = unsigned short
// u8 = unsigned char
struct WaveHeader{
  u32 chunkId;    //"RIFF"
  u32 chunkSize;    //file size - 8bytes
  u32 format;      //"WAVE"-be (0x57415645)
  u32 subchunk1Id;  //"fmt"-be (0x666d7420)
  u32 subchunk1Size;  // 16 - PCM
  u16  audioFormat;  // 1  - PCM
  u16 numChannels;  // 1 - mono, 2 - stereo
  u32 sampleRate;    // 44100
  u32 byteRate;    // bytes in sec
  u16 blockAlign;    //
  u16 bitsPerSample;  // 16 bit
  u32 subchunk2Id;  //"data"-be (0x64617461)
  u32 subchunk2Size;  //data size
};

...

WaveHeader  m_header;
...
u32 bytesRead = m_file->read( (u8*)&m_header, sizeof(m_header) );
...
u8  *  m_data = new u8[ m_header.subchunk2Size ];
...
u32 offset = m_file->size() - m_header.subchunk2Size;
m_file->seek( offset, СНАЧАЛА );
m_file->read( m_data , m_header.subchunk2Size );

вроде всё понятно, читаем header ЦЕЛИКОМ, проверяем, m_header.subchunk2Size размер данных, идём на нужную позицию и читаем данные.

#2
1:26, 30 апр 2020

3dhater
Сейчас попробую, спасибо, почему-то сразу не догадался.:-)

#3
9:56, 30 апр 2020

SnikersMan
Читал что в wav-файле теги могут быть в разном порядке.

#4
12:18, 30 апр 2020

s3dworld
Спасибо, в будущем буду учитывать такую вероятность.

#5
23:31, 30 апр 2020

s3dworld
> Читал что в wav-файле теги могут быть в разном порядке.
+ 1

ПрограммированиеФорумЗвук

Тема в архиве.