23.08.2014, 16:27. Просмотров 1240. Ответов 2
Есть win32 проект в Студии. Задача - запросить диалог выбора wav файла, проверить что это wav файл, прочитать его хедер, взять оттуда нужные данные в виде чисел - битрейт, количество каналов, формат и т.п. и затем прочитать заранее заданное количество отсчетов в заранее приготовленный для них массив. Причем, если файл будет моно, то отсчеты читаются как есть, если стерео - то при кодировке центральный/разностный считывается только центральный канал, при правый/левый - среднее арифметическое. Если файл будет не 16-битный, то приводим его в 16 бит - домножаем или делим отсчеты на коэффициент. Я сейчас ооочень коряво реализовал чтение моно вавки, но подозреваю что и здесь у меня полно ошибок, например при прочтении хедера даже не могу взять параметры файла. Как это можно сделать по-нормальному? Если будет реализовано по ООП-шному через классы, то разберусь. Если через дополнительные библиотеки - то смотря какие, WinMM.Lib у меня уже так и так используется, а другие не хотелось бы подключать. Хотя если с ними будет красиво и стройно, то тоже придется.
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| void ReadWav_Proc(HWND hWnd)
{
SetWindowTextW(hwndSta1, L"Read...");
HANDLE hFile = INVALID_HANDLE_VALUE;
if((hFile = CreateFile(L"Test.wav", GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) {
SetWindowTextW(hwndSta1, L"Не могу открыть файл");
return;
}
WAVEHDR WaveTestHdr;
DWORD readBytes;
wchar_t buf[20];
if (ReadFile(hFile, &WaveTestHdr, sizeof(WAVEHDR), &readBytes, NULL)) {
wsprintfW(buf, L"%lu", readBytes);
SetWindowTextW(hwndSta1, buf);
} else {
SetWindowTextW(hwndSta1, L"Не могу прочитать хедер файла");
return;
}
if (ReadFile(hFile, waveOut.buf, sizeof(waveOut.buf), &readBytes, NULL)) {
wsprintfW(buf, L"%lu", readBytes);
SetWindowTextW(hwndSta1, buf);
} else {
SetWindowTextW(hwndSta1, L"Не могу прочитать данные файла");
return;
}
CloseHandle(hFile);
} |
|
Добавлено через 1 час 17 минут
UPD заголовки вроде уже читаю C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| typedef struct WAV_HEADER{
char RIFF[4]; // RIFF Header Magic header
unsigned long ChunkSize; // RIFF Chunk Size
char WAVE[4]; // WAVE Header
char fmt[4]; // FMT header
unsigned long Subchunk1Size; // Size of the fmt chunk
unsigned short AudioFormat; // Audio format 1=PCM,6=mulaw,7=alaw, 257=IBM Mu-Law, 258=IBM A-Law, 259=ADPCM
unsigned short NumOfChan; // Number of channels 1=Mono 2=Sterio
unsigned long SamplesPerSec; // Sampling Frequency in Hz
unsigned long bytesPerSec; // bytes per second
unsigned short blockAlign; // 2=16-bit mono, 4=16-bit stereo
unsigned short bitsPerSample; // Number of bits per sample
char Subchunk2ID[4]; // "data" string
unsigned long Subchunk2Size; // Sampled data length
}my_wav_hdr;
my_wav_hdr WaveTestHdr;
DWORD readBytes;
wchar_t buf[500];
if (ReadFile(hFile, &WaveTestHdr, sizeof(WaveTestHdr), &readBytes, NULL)) {
wsprintfW(buf, L"%.4S %lu %.4S %.4S %lu %u %u %lu %lu %u %u %.4S %lu",
WaveTestHdr.RIFF,
WaveTestHdr.ChunkSize,
WaveTestHdr.WAVE,
WaveTestHdr.fmt,
WaveTestHdr.Subchunk1Size,
WaveTestHdr.AudioFormat,
WaveTestHdr.NumOfChan,
WaveTestHdr.SamplesPerSec,
WaveTestHdr.bytesPerSec,
WaveTestHdr.blockAlign,
WaveTestHdr.bitsPerSample,
WaveTestHdr.Subchunk2ID,
WaveTestHdr.Subchunk2Size);
SetWindowTextW(hwndSta1, buf);
} else {
SetWindowTextW(hwndSta1, L"Не могу прочитать хедер файла");
return;
} |
|
Непонятно только, почему структура заголовка вав файла не задефайнена в ММ-библиотеке, пришлось объявлять свою... Или она там кусками задефайнена, т.к. разные вавки имеют различную структуру заголовков?...
0
|