Threads und Sounds

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Firstdeathmaker

Betreff: Threads und Sounds

BeitragDi, Apr 07, 2009 12:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, da bin ich schon wieder. Hab diesmal ein Problem mit LoadSound() und Threads.

So wie es jetzt da steht läuft es nicht, aber wenn man den ausgeklammerten Teil mit reinnimmt, dann spielt er auf einmal die Musik ab. Ich check es einfach nicht...

Code: [AUSKLAPPEN]
SuperStrict

Local s:TSound
Local c:TChannel
Local map:TMap = CreateMap()

Rem
s = LoadSound("data/s1.ogg")
c = PlaySound(s)
Delay 1000
c.stop()
End Rem


Local sfxList:TList = New TList
sfxList.AddLast("data/s1.ogg")
sfxList.AddLast("data/s2.ogg")
sfxList.AddLast("data/s3.ogg")

Local loader:TDataLoader = New TDataLoader
loader.setLoadFunction(LoadSound,0)
loader.setTargetMap(map)
loader.setUrlList(sfxList)
loader.start()

Graphics 400,300
Local cc:Int
While Not loader.isFinished()
   cc:+1
   Cls
   DrawText "Loading: " + Int(loader.getProgress()*100)+"%", (Sin(cc)+1)*GraphicsWidth()/4,10
   Flip
Wend


s:TSound = TSound(MapValueForKey(map,"data/s2.ogg"))
c:TChannel = s.Play()
Print "Sound exists: "+(s<>Null)
Print "Channel exists: "+(c<>Null)
Print "Channel plays: "+c.playing()

Repeat
   Cls
      DrawText("Music should be playing",10,10)
   Flip
Until KeyHit(KEY_ESCAPE)
End


'############## TDataLoader ################
Type TDataLoader
   Field loadFunction:Object(url:Object, flags:Int)
   Field flags:Int
   Field urlList:TList
   Field thread:TThread
   Field targetMap:TMap
   
   Field total:Int
   Field Current:Int
   
   Method setLoadFunction(f:Object(url:Object, flags:Int), flags:Int = 0)
      Self.loadFunction = f
      Self.flags = flags
   End Method
   
   Method setUrlList(urls:TList)
      Self.urlList = urls
   End Method
   
   Method setTargetMap(m:TMap = Null)
      targetMap = m
      If targetMap = Null targetMap = CreateMap()
   End Method
   
   Method start()
      Self.thread = CreateThread(TDataLoader.LoadThread, Self)
   End Method
   
   Function LoadThread:Object(data:Object)
      Local dl:TDataLoader = TDataLoader(data)
      If dl = Null
         Return Null
      EndIf
         
      dl.total = dl.urlList.Count()
      
      For Local url:Object = EachIn dl.urlList
         Local obj:Object = dl.loadFunction(url, dl.flags)
         If obj = Null Print "error occured when loading data"
         MapInsert(dl.targetMap, url, obj)
         dl.Current:+1
      Next
      Return dl
   End Function
   
   Method getProgress:Float()
      If total = 0 Return 1
      Return Float(Current) / total
   End Method
   
   Method getMap:TMap()
      Return Self.targetMap
   End Method
   
   Method isFinished:Byte()
      If ThreadRunning(Self.thread) = False
         DetachThread(Self.thread)
         Return True
      EndIf
      Return False
   End Method
End Type
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

amon

BeitragDi, Apr 07, 2009 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
also bei mir läufts so wie es da steht Smile



[edit] falls du dich wegen dem progress fragst, das geht einfach zu schnell - versuche mal den start aufruf nach dem graphics command zu setzen, dann solltest du auch einen ladefortschritt sehen Smile

Firstdeathmaker

BeitragDi, Apr 07, 2009 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Also bei mir wird einfach kein Sound abgespielt wenn ich das obere ausklammere. (Ich lade ganze Lieder, da dauert das dann schon etwas länger). Also es geht weniger um die Progressanzeige, sondern mehr darum, dass kein Sound abgespielt wird, obwohl der geladen, abgespielt (channel zurückgegeben) und der channel sagt dass der Sound gerade abgespielt wird. Sobald ich aber vorher konventionell etwas lade und abspiele funktioniert auch das zweite.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

amon

BeitragDi, Apr 07, 2009 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, also das am nachmittag war mein notebook, da gings - hier am standpc gehts auch nicht...

[edit] Jetzt wärs die Frage obs am Betriebssystem liegt

Notebook - Vista 64bit
Standpc - XP 32bit

Firstdeathmaker

BeitragDi, Apr 07, 2009 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, ich hab hier auch XP, aber das kann doch nicht sein? Ich seh den Unterschied einfach nicht. Ich werd jetzt auch mal im englischen Forum posten.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

BladeRunner

Moderator

BeitragDi, Apr 07, 2009 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht muss der Mainthread erst das Soundsystem initialisieren bevor es genutzt werden kann? Versuch für einen Workaround wäre es einen kurzen Leersound zu serstellen und den zu beginn deines Programmes zu Laden und wiederzugeben, um genau das zu erreichen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Firstdeathmaker

BeitragDi, Apr 07, 2009 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur zur Info: Der Mainthread startet in beiden Fällen den Abspielvorgang. Aber dein Workaround wäre natürlich eine Möglichkeit.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group