Reservierter Channel bleibt stumm

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Ratchet

Betreff: Reservierter Channel bleibt stumm

BeitragDi, Sep 06, 2011 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Leider kann ich nicht den ganzen Quellcode posten, aber es geht mir auch nur darum, ob ihr vielleicht einen Denkanstoß für mich habt, was hier faul sein könnte.

Ich reserviere einen TChannel mit AllocChannel. Dieser ist Teil der Klasse TTrack.
In eine zweiten Klasse TSample wird ein Sound geladen. Diesen möchte ich im Channel von TTrack abspielen. Also übergebe ich meinen Channel an die Play Methode. Es wird aber nichts abgespielt. Übergebe ich keinen Channel, sondern lasse einen neuen erstellen, funktioniert es. Folgender Code ist eine Nachbildung - dummerweise funktioniert dieser!

BlitzMax: [AUSKLAPPEN]
sound: TSample = New TSample
sound.Sound = LoadSound("shoot.wav")
track: TTrack = New TTrack

sound.Play(track.Channel)
Input "Press return key to quit"

Type TTrack
Field Channel: TChannel = AllocChannel()
End Type

Type TSample
Field Sound: TSound

Method Play(Channel: TChannel)
If Channel Then
CueSound(Sound, Channel)
SetChannelRate(Channel, 1)
SetChannelVolume(Channel, 1)
ResumeChannel(Channel)
End If
End Method
End Type


Im echten Quellcode sieht es nicht anders aus:

Funktioniert nicht
BlitzMax: [AUSKLAPPEN]
	Method Play(Channel: TChannel)
...
CueSound(Sample.Sound, Channel)
...


Funktioniert, erzeugt aber einen neuen Channel
BlitzMax: [AUSKLAPPEN]
	Method Play(Channel: TChannel)
...
Channel = CueSound(Sample.Sound)
...


Der Channel ist "gefüllt" (if Channel then ...), habe auch schon das AllocCahnel in die New Metode von TTrack verschoben, Channel als var übergeben, Lautstärke gesetzt, Rate und und und. Ich weiß echt nicht mehr was es sein könnte. Jemand eine Idee?
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Xeres

Moderator

BeitragDi, Sep 06, 2011 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Soundmodule kommen mir schon länger etwas verbuggt vor. Setzt du einen Audiodriver?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragDi, Sep 06, 2011 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hatte seit Jahren keine Probleme mehr mit den Sounds in BMax. Allerdings verzichten wir total darauf einen Channel vorzugeben. Zwar wird immer wieder das gleiche Objekt benutzt, aber jedesmal durch den neuen Channel, den CueSound zurückliefert, überschrieben.

BlitzMax: [AUSKLAPPEN]
AktChannel:TChannel
AktChannel = AllocChannel()
AktChannel = CueSound(Musik)
ResumeChannel AktChannel


Das entspricht deinem Beispiel No II ("..Funktioniert, erzeugt aber einen neuen Channel "). Es könnte gut sein, dass wir das in der Firma irgendwann mal so festgelegt haben, weil der andere Weg vielleicht auch Probleme bereitete.

Mir ist aber auch nichts negatives über diese Art der ständigen Neugenerierung bekannt. Es scheint stabil zu laufen und geht auch nach Hunderten (Tausenden?) von CueSound() nie in die Knie.

Soweit meine Erfahrungen....
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Ratchet

BeitragMi, Sep 07, 2011 10:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
Die Soundmodule kommen mir schon länger etwas verbuggt vor. Setzt du einen Audiodriver?


Ja und Nein. Habe dort auch schon alles erdenkliche probiert. Es ist egal welchen Treiber ich setzte, das Problem bleibt.

@Midimaster: Ich frage mich beim Neugenerieren nur, ob das dann nicht ein Speicherleck wäre. Außerdem geht es mir darum, dass ich nun mal eine festgelegte Anzahl an Channels habe und eben diese auch nutzen möchte/muss/will Wink
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Midimaster

BeitragMi, Sep 07, 2011 10:58
Antworten mit Zitat
Benutzer-Profile anzeigen
wie meinst du das mit der festgelegten Anzahl?

wir nutzen ja auch immer wieder die gleichen Variablen für die Channels. Allerdings steckt dahinter jedesmal eine andere ID oder wenn du so willst Zeiger des OS.

Scheinbar greift man hier aus einem endllosen Pool zu. wir hatten zunächst auch bedenken wegen eines Lecks, aber sind bisher auf keine Grenzen gestoßen. Und wir nutzen Sounds wirklich intensiv.

off-topic:
z.b. unter Monkey haben wir größte Probleme bei den Channels festgestellt und bis heute keine Möglichkeit gefunden unsere Software auch für dieses Target umzusetzen.

Den intensivsten Gebrauch von immer wieder neuen Channels machen wir derzeit bei "Rhythmus-Trainer" ( https://www.blitzforum.de/showcase/448/ ), wo pro Sekunde schon mal 20 individuelle Sounds zusammenkommen und das ganze läuft auch nach einer Stunde ( 3.600*20=72.000 Sounds) immer noch ohne Ausfälle. Dabei werden die Channels intensiv gestreßt, so werden z.b. viele unserer Channel immer wieder mit "fade out" ausgeblendet.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Ratchet

BeitragMi, Sep 07, 2011 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Anzahl lege ich selber fest, da es für meine Art von Programm Gang und Gebe ist (Tracker). Wenn ich acht Tracks habe sind es eben acht Channel. Ständig neue Channels zu erzeugen macht hier einfach keinen Sinn und ich würde es gerne sauber programmieren und nicht mit so einer "Notlösung". Außerdem macht es vieles einfacher was das Handling angeht.
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Midimaster

BeitragMi, Sep 07, 2011 11:23
Antworten mit Zitat
Benutzer-Profile anzeigen
du kannst ja mit 8 Channels arbeiten! Allerdings bekommen die von Betriebssystem immer wieder neue IDs untergeschoben. Für das OS sind es neue Channels, aber Du sprichst sie immer unter den 8 gleichen "Channels" an.

Probier mal das:

BlitzMax: [AUSKLAPPEN]
Method Play(Channel: TChannel)
...
Channel = CueSound(Sample.Sound, Channel)


oder das:

BlitzMax: [AUSKLAPPEN]
Method Play(Channel: TChannel)
If Channel Then StopChannel Channel
Channel = CueSound(Sample.Sound, Channel)



### EDIT ###

Ich habe mal grad im Modul BRL.Audio nachgesehen. Ich glaube hier ist die Lösung. Was Du vorhast klappt nicht bei CueSound:

BlitzMax: [AUSKLAPPEN]
Function CueSound:TChannel( sound:TSound,channel:TChannel=Null )
Return sound.Cue( channel )
End Function


Type TSound
.....
Method Cue:TChannel( alloced_channel:TChannel=Null )
Return New TChannel
End Method
....


Es wird immer ein neuer Channel erzeugt und der wird mit RETURN zurückgegeben. also muss man...

BlitzMax: [AUSKLAPPEN]
	Channel = CueSound(Sample.Sound, Channel)

...schreiben!!!

Ratchet

BeitragMi, Sep 07, 2011 12:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach so, verstehe. Macht natürlich Sinn. Dann war es wohl eher ein Denkfehler von mir was CueSound angeht Very Happy In den Source hatte ich zwar auch schon reingeguckt, aber es wohl nicht richtig interpretiert.
Vielen Dank.
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Xeres

Moderator

BeitragMi, Sep 07, 2011 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann kann man sich auch den Channel als Parameter Sparen, der wird ja für absolut nichts verwendet...
Immerhin sammelt der GC die alten Channel ein und es gibt kein Speicherleck.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragMi, Sep 07, 2011 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Logisch!

Auch den "AllocChannel" kann man sich sparen! Den braucht man nur vorsorglich beim Programmstart, wenn man in der Hauptschleife schon auf ChannelPlaying() testet, bevor vielleicht ein Sound geladen wurde:

BlitzMax: [AUSKLAPPEN]
AktChannel:TChannel
AktChannel = AllocChannel()

Repeat
If ChannelPlaying(AktChannel)=0
AktChannel = CueSound(Musik)
ResumeChannel AktChannel
EndIf
Until....
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group