Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Вниз

проблема с DirectSound   Найти похожие ветки 

 
Kobik   (2005-07-07 18:46) [0]

Занялся звуками в игре и столкнулся с непонятным глюком: на одном компе все нормально работает, а на другом (на котором делаю) выдает ошибку.
Т.е сообщение "Unable to set Coopeative Level1" и дальше естественно звуки не работают

вот процедурка создания главного буфера (место ошибки выделенно жирным):

procedure AppCreateWritePrimaryBuffer(const Handle:HWND);
var BufferDesc  : TDSBUFFERDESC_DX8;
//    Caps        : DSBCaps;
   PCM         : TWaveFormatEx;
begin
FillChar(BufferDesc, SizeOf(TDSBUFFERDESC_DX8),0);
FillChar(PCM, SizeOf(TWaveFormatEx),0);
with BufferDesc do
begin
 PCM.wFormatTag:=WAVE_FORMAT_PCM;
 PCM.nChannels:=2;
 PCM.nSamplesPerSec:=22050;
 PCM.nBlockAlign:=4;
 PCM.nAvgBytesPerSec:=PCM.nSamplesPerSec * PCM.nBlockAlign;
 PCM.wBitsPerSample:=16;
 PCM.cbSize:=0;
 dwSize:=SizeOf(TDSBUFFERDESC_DX8);
 dwFlags:=DSBCAPS_PRIMARYBUFFER;
 dwBufferBytes:=0;
 lpwfxFormat:=nil;
end;
if DirectSound1.SetCooperativeLevel(Handle,DSSCL_WRITEPRIMARY) <> DS_OK
 then Raise Exception.Create("Unable to set Coopeative Level1");
if DirectSound1.CreateSoundBuffer(BufferDesc,DirectSoundBuffer,nil) <> DS_OK
 then Raise Exception.Create("Create Sound Buffer failed");
if DirectSoundBuffer.SetFormat(PCM) <> DS_OK
 then Raise Exception.Create("Unable to Set Format ");
if DirectSound1.SetCooperativeLevel(Handle,DSSCL_NORMAL) <> DS_OK
then Raise Exception.Create("Unable to set Coopeative Level2");
end;

Естественно до этого DirectSound1 создается DirectSoundCreate8(nil, DirectSound1, nil)... там ошибки не возникает.

Из-за чего вообще такое может быть? Звуковуха вроде на месте :)


 
XProger ©   (2005-07-07 22:44) [1]

У меня возникали ошибки на карточках SB Life. Обновление драйвера помогало...

А DSSCL_EXCLUSIVE не подходит?
И что за SetCooperativeLevel(Handle,DSSCL_NORMAL) в конце?


 
Kobik   (2005-07-08 07:08) [2]

Хмм. DSSCL_EXCLUSIVE действительно подошло :)

Собственно этот кусок я взял из единственного примера, который удалось найти в инете. Комментариев там нет. Без SetCooperativeLevel(Handle,DSSCL_NORMAL) вроде все также работает.

Вот еще вопросик такой есть:
Когда юнит стреляет делаю SSB_fire.Play(0,0,0); //(SSB_fire: IDirectSoundBuffer)

Если промежуток между выстрелами короче времени звука (примерно одна секунда), то второго выстрела не слышно. Третий снова слышно, четвертый неслышно и т.д. :)

Попробовал сделать

begin
SSB.Stop;
SSB.Play(0,0,0);
end;


Тогда второй выстрел звучит с какими-то глюками.

А хочется вообще, чтобы следующий выстрел не останавливал первый, а наклаывался на него. Как это сделать? У меня только есть идея сделать несколько буферов с одинаковыми звуками, но как-то это криво...


 
A22 ©   (2005-07-08 11:03) [3]

каждый новый звук - новый буфер


 
Kobik   (2005-07-08 14:57) [4]

>>каждый новый звук - новый буфер
Эээ. Можно поконкретнее что вы имеете ввиду?

То что на каждый тип выстрела свой буфер это итак понятно.

Или вы имеете ввиду что чел выстрелил 20 раз - надо 20 буферов создавать? Это ж наверно сильно тормозить будет...


 
A22 ©   (2005-07-08 15:01) [5]

20 буферов, ничего у меня не тормозило...


 
XProger ©   (2005-07-08 15:32) [6]

Kobik, создавай базовый набор сэмплов, а также массив каналов (64-128 штук) - каждый из который содержит указатель на буфер.
При вызове проигрыша одного из сэмплов дублируй его в один из свободных каналов:
ids.DuplicateSoundBuffer(sample[i].Buffer, Channel[i].Buffer);
А затем Channel[i].Buffer.Play(0, 0, 0);

Только не забывай постоянно проверять каналы на "живучесть". Т.е. по окончании проигрывания ниль буфер:

hr := Channel[i].Buffer.GetStatus(Status);
if (hr = DS_OK) and (status and DSBSTATUS_PLAYING = 0) then
begin
Channel[i].Buffer.Restore;
Channel[i].buffer   := nil;
end


P.S. как видишь, без дублирования никак :)


 
Kobik   (2005-07-08 17:00) [7]

Ок, попробую. Большое спасибо за помощь.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.036 c
6-1123645641
Big Joe
2005-08-10 07:47
2005.11.20
Помогите с сокетом


14-1130181630
Nous Mellon_
2005-10-24 23:20
2005.11.20
Opera + JavaScript = ?


2-1130859825
Grol
2005-11-01 18:43
2005.11.20
Удалить память выделенную под нужды компонента...


3-1128930084
alol
2005-10-10 11:41
2005.11.20
ado и as400


1-1130307574
DVM
2005-10-26 10:19
2005.11.20
Правильно ли я превел с С на Pascal?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский