Микширование wav на C++
От: 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);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.