Вполне! Только потом если оптимизировать будешь старайся уменьшать количество циклов такого типа (причем это касается не только звуков)
For snd.TSound = Each TSound
If (snd\Name = name) Then Return snd
Next
Ведь ты можешь сразу при загрузке звуков получать прямой указатель строку в списке
Я пользуюсь Handle() и Object. () - как-то привык (эх помню времена, когда они вообще были недокументированными)
Вот переделал твой пример - БЕЗ цикла проверки при запуске звука (вот представь что у тебя тысячи звуков
). То есть блитз это сделает своими более шустрыми механизмами. Почитай вроде в последних версиях справки про эти команды написано...
Include "sound_manager.bb"
...
aaa=smLoadSound ("human_voice.mp3")
smPlaySound (aaa)
...
smDeleteAll()
Type TSound
Field Name$
Field Sound
Field Channel
Field Volume
Field Pitch
End Type
Function smLoadSound (filename$, name$="unknown", Volume = 100, Pitch = 0)
snd.TSound = New TSound
snd\Sound = LoadSound (filename)
If (snd\Sound = -1) Then
DebugLog "Sound '" + name + "' is not load!"
Delete snd
EndIf
snd\Name = name
Return Handle(snd) ; <<<<<<<<<<< (!)
End Function
Function smPlaySound (hndl)
snd.TSound = Object.TSound(hndl) ; <<<<<<<<<<< (!)
If snd <> Null Then
If Not ChannelPlaying (snd\Channel) Then snd\Channel = PlaySound (snd\Sound)
Else
DebugLog "Sound '" + name + "' not found!"
EndIf
End Function
Function smStopSound (hndl)
snd.TSound = Object.TSound(hndl) ; <<<<<<<<<<< (!)
If snd <> Null Then
StopChannel (snd\Channel)
Else
DebugLog "Sound '" + name + "' not found!"
EndIf
End Function
Function smDeleteAll ()
For snd.TSound = Each TSound
FreeSound snd\Sound
Delete snd
Next
End Function
Надеюсь не накосячил тут... Сам не компилил.
И еще желательно добавь проверку на одинаковые звуки при загрузке - чтобы память не засорять - то есть проверять есть ли такой звук в менеджере - если есть - то просто передавай этот хендл - правда не зубдь пометить его в списке так как при попытке стереть несуществующий звук выйдет ошибка. Но тут смотри сам по надобности.
Кстати - при загрузке отсутствующего звука ты получишь Object does not exist...
snd.TSound = New TSound
snd\Sound = LoadSound (filename)
If (snd\Sound = -1) Then
DebugLog "Sound '" + name + "' is not load!"
Delete snd
EndIf
snd\Name = name ; <<<< Если отсутствует звук, то тут получишь ошибку - так как ты удалил уже snd выше в условии
PS. Параметр name$ - в принципе нафиг не нужен... Только если соберешься делать скриптовую систему или чего подобное...