SoundPool spielt manchmal. Eben nur manchmal.

Status
Dieses Thema wurde gelöst! Zur Lösung springen…
B

BraveSentry

Neues Mitglied
0
Hallo zusammen,

ich benutze einen SoundPool um, naja, Sounds abzuspielen. Das tut er auch meistens. Manchmal, für mich nicht nachvollziehbar, warum, tut er das aber nicht, sondern spielt stattdessen eine Art tiefes Klicken.

Hier der Code dafür:

Code:
open class PingSoundPool(context: Context) {

open var mAttributes = AudioAttributes.Builder()
    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
    .setUsage(AudioAttributes.USAGE_GAME)
    .build()

open var mSoundPool = SoundPool.Builder()
    .setMaxStreams(9)
    .setAudioAttributes(mAttributes)
    .build()

open var babping = mSoundPool.load(context, R.raw.ab830ping, 1)
open var aaping = mSoundPool.load(context, R.raw.a220ping, 1)
open var abbping = mSoundPool.load(context, R.raw.bb233ping, 1)
open var abping = mSoundPool.load(context, R.raw.b247ping, 1)
[und noch ein paar mehr]

open fun loadPings(note: Int) {
println(note.toString())
if (note == 0) {}
if(note == 1)
    mSoundPool.play(acping, 2.55f, 2.55f, 1, 0, 1f)
if(note == 2)
mSoundPool.play(adbping, 2.5f, 2.5f, 1, 0, 1f)
if(note == 3)
    mSoundPool.play(adping, 2.45f, 2.45f, 1, 0, 1f)
if(note == 4)
    mSoundPool.play(aebping, 2.4f, 2.4f, 1, 0, 1f)
[und so weiter]
}

Das ganze wird in meiner MainActivity so integriert:

Code:
companion object {
lateinit var pingSoundPool: PingSoundPool
}

Und in onCreate dann pingSoundPool = PingSoundPool(this)

Zum Abspielen nutze ich dann FullscreenActivity.pingSoundPool.loadPings(note: Int). Das klappt auch, aber, wie gesagt, nicht immer.

Das Ganze passiert sowohl im Emulator, als auch auf echten Geräten. Die Zeile println(note.toString()) gibt mir übrigens immer die entsprechende Zahl aus, egal, ob der Sound tatsächlich spielt oder nicht. Wenn der Sound spielt, wird diese Zahl immer von folgender Nachricht gefolgt: W/AudioTrack: AUDIO_OUTPUT_FLAG_FAST denied by client; transfer 4, track 44100 Hz, output 48000 Hz

Hat jemand ne Idee, woran das liegt und was ich da machen kann?
 
Empfohlene Antwort(en)
Hallo
Ich verstehe nicht so ganz dein Problem. Erkläre mal etwas genauer wann der Fehler auftritt.
Kommt der wenn noch ein Sound abgespielt wird und du jenen neuen dazu haben willst ?
Wird der vorhabende beendet oder lauft der weiter, wenn ein neuer gestartet wird?
Bitte beschreibe etwas genauer.

Die Zeile println(note.toString()) gibt mir übrigens immer die entsprechende Zahl aus, egal, ob der Sound tatsächlich spielt oder nicht.

Ist normal den das ist in UI Thread . wenn der nicht laufen würde könntest du gar keine eingaben machen. Der Sound wir in einen Thread von Sound Pool abgespielt.
Zu mindestens ist das mir so bekannt das Sound Poll eine eigenen Thread benutzt.
Und da wird das Problem sein.


Zu deine Code.

Erstens warum benutzt du vor den Variablen „oben“ ? das brauchst du nur bei einer Klasse die auch abgeleitet werden darf. Sonst nicht.

Was ist das mit dem Companion Objekt und der „lateinit“ Variablen?
Vor allen warum lateinit ? Bin mir nicht sicher das die Variable wirklich immer nicht Null ist.

Auch bei Play wird die Lautstarke nur zwischen 0.0 und 1.0 angegeben nicht 2.5

Ein beenden des Sounds oder abwarten ob der alte Sound zu Ende ist sehe ich nicht in deinem code.
Da wird es bestimmt zu Überschreitungen kommen.

Alle deine Streams haben dieselbe Priorität, also wenn zb. die max zahl der Streams erreicht ist kann es vor kommen das der neue Stream nicht abgespielt wird da der neue die gleiche prio hat wie die gerade laufenden.
Wie lang sind dein deine Sounds?

Auch kann es vorkommen das aufgrund von Ressourcenmangel das Spielen eingestellt wird.


lese dir mal den einleitenden Text durch.
SoundPool | Android Developers
 
Alle Antworten (4)
Hallo
Ich verstehe nicht so ganz dein Problem. Erkläre mal etwas genauer wann der Fehler auftritt.
Kommt der wenn noch ein Sound abgespielt wird und du jenen neuen dazu haben willst ?
Wird der vorhabende beendet oder lauft der weiter, wenn ein neuer gestartet wird?
Bitte beschreibe etwas genauer.

Die Zeile println(note.toString()) gibt mir übrigens immer die entsprechende Zahl aus, egal, ob der Sound tatsächlich spielt oder nicht.

Ist normal den das ist in UI Thread . wenn der nicht laufen würde könntest du gar keine eingaben machen. Der Sound wir in einen Thread von Sound Pool abgespielt.
Zu mindestens ist das mir so bekannt das Sound Poll eine eigenen Thread benutzt.
Und da wird das Problem sein.


Zu deine Code.

Erstens warum benutzt du vor den Variablen „oben“ ? das brauchst du nur bei einer Klasse die auch abgeleitet werden darf. Sonst nicht.

Was ist das mit dem Companion Objekt und der „lateinit“ Variablen?
Vor allen warum lateinit ? Bin mir nicht sicher das die Variable wirklich immer nicht Null ist.

Auch bei Play wird die Lautstarke nur zwischen 0.0 und 1.0 angegeben nicht 2.5

Ein beenden des Sounds oder abwarten ob der alte Sound zu Ende ist sehe ich nicht in deinem code.
Da wird es bestimmt zu Überschreitungen kommen.

Alle deine Streams haben dieselbe Priorität, also wenn zb. die max zahl der Streams erreicht ist kann es vor kommen das der neue Stream nicht abgespielt wird da der neue die gleiche prio hat wie die gerade laufenden.
Wie lang sind dein deine Sounds?

Auch kann es vorkommen das aufgrund von Ressourcenmangel das Spielen eingestellt wird.


lese dir mal den einleitenden Text durch.
SoundPool | Android Developers
 
jogimuc schrieb:
Auch bei Play wird die Lautstarke nur zwischen 0.0 und 1.0 angegeben nicht 2.5

Das war es! Vielen Dank! Versuchsweise habe ich es jetzt alles auf 1.0 gestellt und nun spielt es alles und immer wenn es soll.

Die Sounds sind jeweils ca. 1 sekunde lang. Da muss man sich schon anstrengen, dass da zu viele kommen. Es wird (laut dem verlinkten Einführungstext) auch immer nur der älteste Stream abgeschaltet, wenn es zu viele werden.

Companion objekt & lateinit sind dafür da, dass ich von überall in der App auf den SoundPool zugreifen kann.

Warum ich die variablen Open habe, weiß ich nicht mehr. Kann das irgendwie schaden, wenn ich es open lasse?
 
OK
Das "oben" macht bei deinen Fall nichts aber auch keinen Sinn. Brauchst du nicht mal bei der Klasse . Denn du extendest ja nicht mal die Kasse. Überschreibst sie nicht also brauchst du kein oben.

Denn du erstellst ja eine statische Instanz deiner Klasse (Companion Objekt) da brauchst du kein oben. Frage mich wo du das gelesen hast. Wirkt sich aber nicht nachtteilig aus.

In Java ist eine Klasse immer "oben" kann also abgeleitet (vererbt) werden in Kotlin ist das anderes rum. Da ist eine Klasse immer geschützt und wenn du sie ableiten willst, also von ihr erben, muss sie "oben" sein.

Bei Methoden bedeutet oben das sie
überschrieben werden dürfen (override).

Für eine Variable macht das für mich keinen Sinn. Eine klassenvariable kann man nicht ableiten überschreiben. Den Inhalt ändern ja, das hat aber nichts mit (oben) zu tun.



Wenn die Sounds so kurtz sind wird es keine Probleme mit der Prio geben.
 
Zuletzt bearbeitet:
Ah, jetzt weiß ich wieder, warum "open": Ich hatte versucht, den Nutzer unterschiedliche Sounds laden zu lassen und dazu von PingSoundPool abgeleitet: class PongSoundPool(context: Context) : PingSoundPool(context)
Wenn ich darin dann andere Sounds mit der gleichen var laden will, brauche ich override und für override brauche ich open, also so: override var babping = mSoundPool.load(context, R.raw.ab830pong, 1)
 
Status
Dieses Thema wurde gelöst! Zur Lösung springen…

Ähnliche Themen

R
  • Gesperrt
  • roland-senior
Antworten
2
Aufrufe
799
Fulano
Fulano
F
Antworten
9
Aufrufe
1.287
Jaiel
Jaiel
Zurück
Oben Unten