Добавлено спустя 5 минут 4 секунды:Ну в 8-ми битном стерео у меня получилось писать данные с обоих каналов. Вот код:
- Код: Выделить всё
// обработчик "данные готовы"
procedure TformMain.MMProcData(var Message: TMessage);
var
temp: pWaveHdr;
recorded: integer;
begin
temp:=address;
if address=@wh1 then address:=@wh2 else address:=@wh1;
// если не остановлено, ставим в очередь
if not stop then
waveInAddBuffer(hwi,address,sizeof(TWaveHdr));
recorded:=address.dwBytesRecorded;
// записываем блок
BlockWrite(fOut,(temp.lpData)^,recorded);
if (address.dwBufferLength=1) and (formMain.Channels=2) then //обработка стерео сигнала 8 бит
Begin
if address=@wh1 then
Begin
label2.Caption:=inttostr(ord(temp^.lpData^));
TrackBar1.Position:=ord(temp^.lpData^);
end
else
Begin
label3.Caption:=inttostr(ord(temp^.lpData^));
TrackBar2.Position:=ord(temp^.lpData^);
end;
end;
n:=n+recorded;
formMain.Label1.Caption:=IntToStr(n);
end;
Но как быть с 16 битами? Ведь в temp^.lpData^ лежит всегда только 8-бит, а для 16 битного стерео не понятно какой из 4-х байт относится к какому каналу и к какой половинке, старшей или младшей.
Т.е. я не пойму:
толи сначала младшая половинка левого, потом старшая половинка левого, потом младшая половинка правого, потом старшая половинка правого,
толи сначала младшая половинка левого, потом младшая половинка правого, потом старшая половинка левого, потом старшая половинка правого,
или вообще еще как-нибудь?
И как потом все это хозяйство правильно раздельно прочитать, а потом правильно сшить воедино?
Вот моя гипотеза, которая не работает:
- Код: Выделить всё
leftchanal:=true; //для случая 16 битного стерео сделать так как было для 8-и битного нельзя,
// там было так:
// в lpData^ всегда (для 8 и 16 бит) лежит 8 бит, и по этому в случае 8-и бит
// @wh1 всегда лежат данные левого канала, а в @wh2 данные правого канала
// Здесь же имеем следующее:
// Еще раз, в lpData^ всегда (для 8 и 16 бит) лежит 8 бит, но данные теперь 16-бит, а значит
// @wh1 всегда лежит младшая половинка (8-бит), а в @wh1 всегда лежит старшая половинка, но для
// нечетных пар @wh1 - @wh2 это данные левого канала, а для четных - данные правого.
// Флаг-переменная leftchanal - это флаг, установка которого в true значит, что сейчас очередь
// левого канала, и в начале мы его как раз и ставим в true, т.к. первая пара-нечетная, но
// в конце обработки пары мы должны опрокидывать этот флаг в противоположное состояние
if (address.dwBufferLength=2) and (formMain.Channels=2) then //обработка стерео сигнала 16 бит
Begin
if address=@wh1 then
Begin
loData:=ord(temp^.lpData^);
end
else
Begin
hiData:=ord(temp^.lpData^);
leftchanal:=not(leftchanal); // опрокидываем флаг
label3.Caption:=inttostr((hiData*256 + loData) div 256)
TrackBar2.Position:=hiData * 256 + loData) div 256;
end;
end;
[/code]
Ну вот собственно и усо.