Новичок
Профиль
Группа: Участник
Сообщений: 6
Регистрация: 2.5.2008
Репутация: нет Всего: нет
|
Задача: проиграть несколько разных звуков и записать их в один файл по очереди. Пытаюсь это сделать вот так: | Код |
DWORD GenerateWave(DWORD dwWaveFreq, DWORD dwDuration, RIFF **ppRiff) //генерирует звук { const DWORD dwSamplingRate = 44100; const DWORD dwBitsPerSample = 8; const DWORD dwSamplesCount = dwDuration * dwSamplingRate / 1000; const DWORD dwWaveDataLength = dwSamplesCount * dwBitsPerSample / CHAR_BIT; const DWORD dwRiffSize = sizeof(RIFF) + dwWaveDataLength - 1;
RIFF *pRiff = (RIFF *)new BYTE[dwRiffSize];
pRiff->rID = FOURCC("RIFF"); pRiff->rLen = sizeof(WAVE) - 1 + dwWaveDataLength;
pRiff->rData.wID = FOURCC("WAVE"); pRiff->rData.fID = FOURCC("fmt "); pRiff->rData.nBlockAlign = dwBitsPerSample / CHAR_BIT; pRiff->rData.nChannels = 1; pRiff->rData.nSamplesPerSec = dwSamplingRate; pRiff->rData.FormatSpecific = 8; // hz pRiff->rData.fLen = 16; pRiff->rData.wFormatTag = 1; pRiff->rData.nAvgBytesPerSec = dwSamplingRate * dwBitsPerSample / CHAR_BIT; pRiff->rData.wd.dID = FOURCC("data"); pRiff->rData.wd.dLen = dwWaveDataLength; for(DWORD i = 0; i < dwSamplesCount; ++i) { double dCurrTime = i / (double)dwSamplingRate; // Вычисление амплитуды double dAmplitude = sin(dCurrTime * dwWaveFreq * 2 * M_PI); // Нормализация и запись pRiff->rData.wd.dData[i] = (BYTE)(0.5 * (dAmplitude + 1.0) * UCHAR_MAX); } *ppRiff = pRiff; return dwRiffSize; }
void ReleaseWave(RIFF *pRiff) { BYTE *pData = (BYTE *)pRiff; delete [] pData; }
void TempRec(DWORD dwRiffSize) // создет временный файл { RIFF *pRiff; HANDLE hFile = CreateFile("test.wav", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) { DWORD dwBytes; WriteFile(hFile, pRiff, dwRiffSize, &dwBytes, NULL); CloseHandle(hFile); } }
void Rec (DWORD dwRiffSize) { RIFF *pRiff; RIFF *pBuff = (RIFF *)new BYTE[dwRiffSize]; HANDLE hFile = CreateFile("test.wav", // открывает test.wav GENERIC_READ, // открывает для чтения 0, // не разделяемый NULL, // защита по умолчанию OPEN_EXISTING, // только существующий файл FILE_ATTRIBUTE_NORMAL, // атрибуты обычного файла NULL); // шаблона атрибутов нет // Открывает существующий файл или, если файл не существует, // то создадет его. HANDLE hAppend = CreateFile("TWO.wav", // открывает TWO.wav GENERIC_WRITE, // открывает для записи FILE_SHARE_READ, // допустим несколько читателей NULL, // защита по умолчанию OPEN_ALWAYS, // открывает или создадает FILE_ATTRIBUTE_NORMAL, // атрибуты обычного файла NULL); // шаблона атрибутов нет
if (hAppend == INVALID_HANDLE_VALUE) { printf("Could not open TWO.wav"); // обработка ошибки return ; } // Добавляет первый файл в конец второго файла. // Блокирует второй файл, чтобы предотвратить обращение // другого процесса к нему в ходе записи в файл. Деблокирует // файл тогда, когда окончиться запись. do { if (ReadFile(hFile, pBuff, sizeof(pBuff), &dwBytesRead, NULL)) { dwPos = SetFilePointer(hAppend, 0, NULL, FILE_END); LockFile(hAppend, dwPos, 0, dwRiffSize, 0); WriteFile(hAppend, pBuff, dwBytesRead, &dwBytesWritten, NULL); UnlockFile(hAppend, dwPos, 0, dwBytesRead, 0); } } while (dwBytesRead == sizeof(pBuff)); // Закрывает оба файла. CloseHandle(hFile); CloseHandle(hAppend);
DeleteFile("test.wav"); //удаляет временный delete pRiff; } int main(int argc, char* argv[]) { DWORD dwRiffSize; RIFF *pRiff; dwRiffSize = GenerateWave(900, 1000, &pRiff); //этот звук пригрывает и записывает PlaySound((const char*)pRiff, 0, SND_MEMORY); // проигрывает звук TempRec(dwRiffSize); Rec (dwRiffSize); dwRiffSize = GenerateWave(400, 1000, &pRiff); //а этот только проигрывает PlaySound((const char*)pRiff, 0, SND_MEMORY); // проигрывает звук TempRec(dwRiffSize); Rec (dwRiffSize);
return 0; } |
второй звук в файл не записывается. Подскажите, пож., где ошибка?
|