От:
Semester
Дата: 11.04.07 11:06
Оценка:
Уважаемые программисты подскажите как из двух wav файлов сделать один. Всем кто ответит бубу очень признателен. Вот исходный код в чем там может быть ошибка. С помощью кода из 2 файлов (один музыка, другой голос) 1 получить можно, но голосовые данные воспроизводятся с шипением.
void __fastcall RecordMixSong (AnsiString FirstSong, AnsiString SecondSong, AnsiString RecordSong)
{
HANDLE hPlayHandle1,
hPlayHandle2,
hPlayHandle3;
DWORD dwFileLen1,
dwFileLen2,
dwFileLen3;
DWORD dwReaded1,
dwReaded2;
DWORD dwWritten,
dwWritten2;
char cData[4],
cData2[4];
WAVEHEADER WaveHdr,
WaveHdr2,
WaveHdr3;
DWORD dwPlayMode,
dwPlayMode2;
DWORD dwHead[2],
dwHead2[2];
hPlayHandle1 = ::CreateFile(FirstSong.c_str(),
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
0);
hPlayHandle2 = ::CreateFile(SecondSong.c_str(),
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
0);
hPlayHandle3 = ::CreateFile(RecordSong.c_str(),
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
0);
dwFileLen1 = ::GetFileSize(hPlayHandle1, NULL);
dwFileLen2 = ::GetFileSize(hPlayHandle2, NULL);
if ((dwFileLen1 <= sizeof(WAVEHEADER)) || (dwFileLen2 <= sizeof(WAVEHEADER)))
{
if (hPlayHandle1 != NULL) CloseHandle(hPlayHandle1);
if (hPlayHandle2 != NULL) CloseHandle(hPlayHandle2);
return;
}
if ((::ReadFile(hPlayHandle1, &WaveHdr, sizeof(WAVEHEADER), &dwReaded1, NULL) == 0) ||
(::ReadFile(hPlayHandle2, &WaveHdr2, sizeof(WAVEHEADER), &dwReaded2, NULL) == 0) )
{
DWORD dwErrorCode = GetLastError();
if (hPlayHandle1 != NULL) CloseHandle(hPlayHandle1);
if (hPlayHandle2 != NULL) CloseHandle(hPlayHandle2);
return;
}
if ((WaveHdr.dwFmtSize <= 20) || (WaveHdr2.dwFmtSize <= 20))
{
switch(WaveHdr.wFormatType)
{
case 0x31:
dwPlayMode = 5;
break;
case 7:
dwPlayMode = 2; // G.711
break;
case 6:
dwPlayMode = 3;
break;
case 1:
dwPlayMode = 4;
break;
default:
CloseHandle(hPlayHandle1);
return;
}
switch(WaveHdr2.wFormatType)
{
case 0x31:
dwPlayMode2 = 5;
break;
case 7:
dwPlayMode2 = 2; // G.711
break;
case 6:
dwPlayMode2 = 3;
break;
case 1:
dwPlayMode2 = 4;
break;
default:
CloseHandle(hPlayHandle2);
return;
}
// Íàõîæäåíèå íà÷àëà äàííûõ
SetFilePointer(hPlayHandle1, 0, NULL, FILE_BEGIN);
SetFilePointer(hPlayHandle2, 0, NULL, FILE_BEGIN);
if (::ReadFile(hPlayHandle1, &WaveHdr, sizeof(DWORD)*5, &dwReaded1, NULL)== 0)
{
DWORD dwErrorCode = GetLastError();
CloseHandle(hPlayHandle1);
return;
}
else
if (::ReadFile(hPlayHandle2, &WaveHdr2, sizeof(DWORD)*5, &dwReaded1, NULL)== 0)
{
DWORD dwErrorCode = GetLastError();
CloseHandle(hPlayHandle2);
return;
}
SetFilePointer(hPlayHandle1, WaveHdr.dwFmtSize, NULL, FILE_CURRENT);
SetFilePointer(hPlayHandle2, WaveHdr2.dwFmtSize, NULL, FILE_CURRENT);
if (::ReadFile(hPlayHandle1, dwHead, sizeof(DWORD)*2, &dwReaded1, NULL)== 0)
{
DWORD dwErrorCode = GetLastError();
CloseHandle(hPlayHandle1);
return;
}
else
if (::ReadFile(hPlayHandle2, dwHead2, sizeof(DWORD)*2, &dwReaded2, NULL)== 0)
{
DWORD dwErrorCode = GetLastError();
CloseHandle(hPlayHandle2);
return;
}
MoveMemory(cData, dwHead, 4);
MoveMemory(cData2, dwHead2, 4);
while ((::memcmp(cData, "data", 4)!= 0) &&
(::memcmp(cData2, "data", 4)!= 0) )
{
SetFilePointer(hPlayHandle1, dwHead[1], NULL, FILE_CURRENT);
SetFilePointer(hPlayHandle2, dwHead2[1], NULL, FILE_CURRENT);
if ((::ReadFile(hPlayHandle1, dwHead, sizeof(DWORD)*2, &dwReaded1, NULL)== 0) ||
(::ReadFile(hPlayHandle2, dwHead2, sizeof(DWORD)*2, &dwReaded2, NULL)== 0) )
{
DWORD dwErrorCode = GetLastError();
CloseHandle(hPlayHandle1);
CloseHandle(hPlayHandle2);
return;
}
MoveMemory(cData, dwHead, 4);
MoveMemory(cData2, dwHead2, 4);
}
}
else
{
SetFilePointer(hPlayHandle1, 0, NULL, FILE_CURRENT);
SetFilePointer(hPlayHandle2, 0, NULL, FILE_CURRENT);
SetFilePointer(hPlayHandle3, 0, NULL, FILE_CURRENT);
if (::ReadFile(hPlayHandle1, &WaveHdr, sizeof(WAVEHEADER), &dwReaded1, NULL)== 0)
{
DWORD dwErrorCode = GetLastError();
CloseHandle(hPlayHandle1);
return;
}
dwPlayMode = WaveHdr.dwSpeed;
dwPlayMode2 = WaveHdr2.dwSpeed;
}
while (true)
{
if ((::ReadFile(hPlayHandle1, &SongMix.FirstValue, sizeof(DWORD), &dwReaded1, NULL) == 0) ||
(::ReadFile(hPlayHandle2, &SongMix.SecondValue, sizeof(DWORD), &dwReaded2, NULL) == 0) )
{
DWORD dwErrorCode = GetLastError();
if (hPlayHandle1 != NULL)
{
CloseHandle(hPlayHandle1);
}
else
if (hPlayHandle2 != NULL)
{
CloseHandle(hPlayHandle2);
}
return;
}
SongMix.RecordValue = 0;
SongMix.RecordValue = (SongMix.SecondValue) + (SongMix.FirstValue);
dwFileLen3 = ::GetFileSize(hPlayHandle3, NULL);
if (dwFileLen3 < 44)
{
WaveHdr.dwDataSize = 0x7DFE7EFE;
WriteFile(hPlayHandle3, &WaveHdr, sizeof(WaveHdr), &dwWritten, NULL);
}
WriteFile(hPlayHandle3, &SongMix.RecordValue, sizeof(DWORD), &dwWritten2, NULL);
if ((dwReaded1 == 0) && (dwReaded2 == 0))
{
break;
}
}
CloseHandle(hPlayHandle1);
CloseHandle(hPlayHandle2);
CloseHandle(hPlayHandle3);
}
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить