forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Delphi (http://forum.boolean.name/forumdisplay.php?f=66)
-   -   сам у себя доступ к файлу забрать норовит MCI (http://forum.boolean.name/showthread.php?t=16709)

barsunduk 26.04.2012 21:03

сам у себя доступ к файлу забрать норовит MCI
 
со звуком проблемы возникли в который уж раз. воспроизведение файлов использую нескольких одновременно. структура простая у написанной мной процедуры:
Код:

// проигрывание wav-файла
procedure playFile(Filename: string);
begin
  try
    mciSendString(PChar('Play "' + Filename + '"'), nil, 0, 0);
  except

  end;
end;

но проблема одна возникает - без них не бывает программ. если файл проигрывать дважды через времени краткий период, то плеер ругается страшно, пугает такими словами: "Can not load file filename"
ибо занят уже этот файл процессом другим. ведь другой экземпляр MCI читает тот звук в этот миг.
что мне делать, коль скоро хочу проиграть этот файл я дважды, причем в одно время? может что-то удобнее есть, чем капризный тупой MCI?

reumep 26.04.2012 22:18

Ответ: сам у себя доступ к файлу забрать норовит MCI
 
о боже, учитель посетил нас великий, как мох он зеленый

barsunduk 26.04.2012 23:25

Ответ: сам у себя доступ к файлу забрать норовит MCI
 
Цитата:

Сообщение от reumep (Сообщение 226584)
о боже, учитель посетил нас великий, как мох он зеленый

увы, не учитель. был бы полон ответов тогда я, но не вопросов.
курю мануалы по bass.dll и беседую с буддой. но очень событие воспроизведения завершенье поймать показалось мне сложно, дабы поток я использовать мог для других звуков файлов. а их проиграть мне придется десятки и сотни.

советы бывалого мастера мне попадались:
PHP код:

// если хочешь, чтобы басс тебя дернул, то:
function BASS_StreamCreateFileUser(systemflagsDWORD; var procsBASS_FILEPROCSuserPointer): HSTREAMstdcallexternal bassdll;

  
BASS_FILEPROCS record
    close
FILECLOSEPROC;
    
lengthFILELENPROC;
    
readFILEREADPROC;
    
seekFILESEEKPROC;
  
end;
  
//  Достаточно BASS_ChannelSetSync + BASS_SYNC_END 

но с чем это есть, к сожалению, так и не понял ..(

reumep 26.04.2012 23:47

Ответ: сам у себя доступ к файлу забрать норовит MCI
 
Цитата:

Сообщение от barsunduk (Сообщение 226596)
увы, не учитель. был бы полон ответов тогда я, но не вопросов.

Истинный учитель - не тот учитель, что знает ответы на вопросы все. Сей же учитель зелен весьма и ответов не знает многих, но привел он к философии жизни меня, за что благодарен я ему.
надо меньше порошки от простуды есть, болен я

barsunduk 26.04.2012 23:50

Ответ: сам у себя доступ к файлу забрать норовит MCI
 
и опять не по теме ..(

reumep 26.04.2012 23:54

Ответ: сам у себя доступ к файлу забрать норовит MCI
 
ну, предложить могу костыль тебе я: создай файла два одинаковых, как протия атомы, и их используй
на самом деле не смыслю в дельфи я

barsunduk 27.04.2012 00:39

Ответ: сам у себя доступ к файлу забрать норовит MCI
 
спасибо за совет, но не смогу воспользоваться я им. придется мнооого файлов создавать тогда.

ViNT 27.04.2012 00:56

Ответ: сам у себя доступ к файлу забрать норовит MCI
 
Можно попробовать DXSound из DelphiX использовать, думаю, там таких проблем не будет.

barsunduk 27.04.2012 01:09

Ответ: сам у себя доступ к файлу забрать норовит MCI
 
спасибо за советы. покурю.
но все же либа bass намного проще. события я так и не осилил, но...
как оказалось, легче завести массив потоков и проверять, активны ли они, когда я добавляю новых звуков. все неактивные я чищу и кидаю в них новьё. проблема решена, я полагаю.

PHP код:

var
  
strm: array [0..255of HSTREAM;
 
// ...
 
  
if BASS_ChannelIsActive(strm[i]) = 0 then
  begin
    BASS_StreamFree
(strm[i]);
    
strm[i] := BASS_StreamCreateFile(FalsePChar(Filename), 00{$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
    
BASS_ChannelPlay(strm[i], True);
  
end



Часовой пояс GMT +4, время: 16:09.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot