Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Wavein.. waveout.. де-то че-то не работает

3.2K
31 января 2003 года
albynos
1 / / 31.01.2003
Люди, пишу программку для записи/воспроизведения звука
использую api-шные wavein/waveout
2 буффера, один текущий, второй для записи/чтения
во время работы текущего
callback обработчик WIM_DATA и WOM_DONE
все по-идее должно быть идеально
но, звук какими-то рывками, такое ощущение что
waveinstart и waveoutwrite
не возвращают управление до того как отработют весь буфер..
в общем никак не пойму, м.б. кто подскажет или кусочек кода даст ?

я приблизительно так делаю :

procedure TForm1.playbuf;
var
r : integer;
begin
if prevbuf=1 then
pwh:=@wh1
else
pwh:=@wh;
pwh^.dwFlags:=WHDR_PREPARED;
waveOutWrite(h,pwh,sizeof(wh));
end;

procedure waveOutProc(hwi, uMsg: integer; dwInstance, dwParam1,dwParam2: dword);stdcall;
var
m : integer;
begin
case umsg of
WOM_CLOSE : begin
with form1 do
begin
end;
end;
WOM_OPEN : begin
with form1 do
begin
assignfile(playfile,OpenDialog1.FileName);
reset(playfile,1);
l:=filesize(playfile);
nowbuf:=2;
prevbuf:=1;
if l<>0 then
begin
if l>sizeof(bufprev) then
begin
m:=sizeof(bufprev);
end else
begin
m:=l;
Gauge1.Progress:=100;
nowbuf:=prevbuf;
end;
l:=l-m;
BlockRead(playfile,bufprev,m);
end;
if l<>0 then
begin
if l>sizeof(bufnow) then
begin
m:=sizeof(bufnow);
end else
begin
m:=l;
Gauge1.Progress:=100;
end;
l:=l-m;
BlockRead(playfile,bufnow,m);
end;
end;
end;
WOM_DONE : begin
with form1 do
begin
if l=0 then
begin
if nowbuf=prevbuf then
begin
to_outclose:=true;
closefile(playfile);
end else
begin
prevbuf:=nowbuf;
playbuf;
end;
end else
begin
prevbuf:=nowbuf;
playbuf;
if form1.nowbuf=maxbufs then
begin
nowbuf:=1;
end else
begin
inc(nowbuf);
end;
Gauge1.Progress:=round((filesize(playfile)-l)/filesize(playfile)*100);
if l>sizeof(bufnow) then
begin
m:=sizeof(bufnow);
end else
begin
m:=l;
Gauge1.Progress:=100;
end;
l:=l-m;
if nowbuf=1 then BlockRead(playfile,bufprev,m);
if nowbuf=2 then BlockRead(playfile,bufnow,m);
end;
end;
end;
end;
end;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог