SoundPool im Service lädt nicht - oder doch!?

B

BraveSentry

Neues Mitglied
Threadstarter
Ich würde gerne einen SoundPool global laden. Dafür habe ich ihn in einen Service gepackt. In dem Service wird er per Intent geladen und auch die Sounds werden per Intent abgespielt. Laut log werden die sounds auch geladen. Wenn ich sie dann aber abspielen will, bekomme ich ein "sound X not LOADED". Was mache ich falsch?


Das passiert in der mainActivity:
Code:
override fun onCreate(savedInstanceState: Bundle?) {
   var pIntent = Intent(this, SoulSoundService::class.java)
   pIntent.putExtra("Load", "Ein")
   startService(pIntent)
   super.onCreate(savedInstanceState)
   setContentView(com.example.soulfetchnew.R.layout.activity_fullscreen)
   mVisible = false
   }
Das hier in einem Fragment:

Code:
override fun onResume() {
   super.onResume()
   majpentlevelbutton.setOnClickListener {
   playPing()
   it.findNavController().navigate(R.id.action_levelSelectFragment_to_levelFragment)
   }
}

fun playPing(){
   val pIntent = Intent(activity, SoulSoundService::class.java)
   pIntent.putExtra("name", R.raw.dbping)
   activity?.startService(pIntent)
}
Das ist der Service:

Code:
open class SoulSoundService : Service() {

private lateinit var mSoundPool: SoundPool
private val myBinder = MyLocalBinder()

override fun onCreate() {
   val mAttributes = AudioAttributes.Builder()
       .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
       .setUsage(AudioAttributes.USAGE_GAME)
       .build()

   mSoundPool = SoundPool.Builder()
       .setMaxStreams(14)
       .setAudioAttributes(mAttributes)
       .build()
}

override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
   if (intent.hasExtra("Load")) {
       loadPings()
   }
   if (intent.hasExtra("name")) {
       soundID = intent.getIntExtra("Name", soundID)
       playPing(soundID)
   }
   if (intent.hasExtra("Stop")) {
       stopSelf()
   }
   return super.onStartCommand(intent, flags, startId)
}


fun playPing(soundID: Int){
   mSoundPool.play(soundID, 1f, 1f, 1, 1, 1f)
}

fun loadPings() {
   val abping = mSoundPool.load(this, com.example.soulfetchnew.R.raw.abping, 1)
   val aping = mSoundPool.load(this, com.example.soulfetchnew.R.raw.aping, 1)
   val bbping = mSoundPool.load(this, com.example.soulfetchnew.R.raw.bbping, 1)
   val bping = mSoundPool.load(this, com.example.soulfetchnew.R.raw.bping, 1)
   val cping = mSoundPool.load(this, com.example.soulfetchnew.R.raw.cping, 1)
   val dbping = mSoundPool.load(this, com.example.soulfetchnew.R.raw.dbping, 1)
   val dping = mSoundPool.load(this, com.example.soulfetchnew.R.raw.dping, 1)
   val ebping = mSoundPool.load(this, com.example.soulfetchnew.R.raw.ebping, 1)
   val eping = mSoundPool.load(this, com.example.soulfetchnew.R.raw.eping, 1)
   val fping = mSoundPool.load(this, com.example.soulfetchnew.R.raw.fping, 1)
   val gbping = mSoundPool.load(this, com.example.soulfetchnew.R.raw.gbping, 1)
   val gping = mSoundPool.load(this, com.example.soulfetchnew.R.raw.gping, 1)

   mSoundPool.setOnLoadCompleteListener(object: SoundPool.OnLoadCompleteListener {
       override fun onLoadComplete(mSoundPool: SoundPool, sampleId:Int,
                          status:Int) {
           println("SOUNDS ARE LOADED")           
       }
   })
}

Und hier noch das log:

Code:
2019-02-06 14:12:14.225 17449-17449/com.example.soulfetchnew I/Choreographer: Skipped 57 frames!  The application may be doing too much work on its main thread.
2019-02-06 14:12:14.253 17449-17467/com.example.soulfetchnew D/EGL_emulation: eglMakeCurrent: 0xb3485120: ver 3 0 (tinfo 0xb3483780)
2019-02-06 14:12:15.537 17449-17493/com.example.soulfetchnew I/OMXClient: MuxOMX ctor
2019-02-06 14:12:16.434 17449-17496/com.example.soulfetchnew I/OMXClient: MuxOMX ctor
2019-02-06 14:12:17.113 17449-17499/com.example.soulfetchnew I/OMXClient: MuxOMX ctor
2019-02-06 14:12:17.270 17449-17449/com.example.soulfetchnew I/Choreographer: Skipped 183 frames!  The application may be doing too much work on its main thread.
2019-02-06 14:12:17.524 17449-17502/com.example.soulfetchnew I/OMXClient: MuxOMX ctor
2019-02-06 14:12:17.573 17449-17449/com.example.soulfetchnew I/System.out: SOUNDS ARE LOADED
2019-02-06 14:12:17.573 17449-17449/com.example.soulfetchnew I/System.out: SOUNDS ARE LOADED
2019-02-06 14:12:17.705 17449-17449/com.example.soulfetchnew I/System.out: SOUNDS ARE LOADED
2019-02-06 14:12:18.175 17449-17449/com.example.soulfetchnew I/System.out: SOUNDS ARE LOADED
2019-02-06 14:12:18.322 17449-17505/com.example.soulfetchnew I/OMXClient: MuxOMX ctor
2019-02-06 14:12:18.508 17449-17449/com.example.soulfetchnew I/System.out: SOUNDS ARE LOADED
2019-02-06 14:12:19.230 17449-17449/com.example.soulfetchnew I/System.out: SOUNDS ARE LOADED
2019-02-06 14:12:19.242 17449-17508/com.example.soulfetchnew I/OMXClient: MuxOMX ctor
2019-02-06 14:12:19.403 17449-17449/com.example.soulfetchnew I/System.out: SOUNDS ARE LOADED
2019-02-06 14:12:19.412 17449-17511/com.example.soulfetchnew I/OMXClient: MuxOMX ctor
2019-02-06 14:12:19.583 17449-17449/com.example.soulfetchnew I/System.out: SOUNDS ARE LOADED
2019-02-06 14:12:19.591 17449-17514/com.example.soulfetchnew I/OMXClient: MuxOMX ctor
2019-02-06 14:12:19.732 17449-17449/com.example.soulfetchnew I/System.out: SOUNDS ARE LOADED
2019-02-06 14:12:19.739 17449-17517/com.example.soulfetchnew I/OMXClient: MuxOMX ctor
2019-02-06 14:12:19.879 17449-17449/com.example.soulfetchnew I/System.out: SOUNDS ARE LOADED
2019-02-06 14:12:19.886 17449-17520/com.example.soulfetchnew I/OMXClient: MuxOMX ctor
2019-02-06 14:12:20.034 17449-17449/com.example.soulfetchnew I/System.out: SOUNDS ARE LOADED
2019-02-06 14:12:20.044 17449-17523/com.example.soulfetchnew I/OMXClient: MuxOMX ctor
2019-02-06 14:12:20.203 17449-17449/com.example.soulfetchnew I/System.out: SOUNDS ARE LOADED
2019-02-06 14:12:23.141 17449-17454/com.example.soulfetchnew I/art: Do partial code cache collection, code=20KB, data=29KB
2019-02-06 14:12:23.141 17449-17454/com.example.soulfetchnew I/art: After code cache collection, code=20KB, data=29KB
2019-02-06 14:12:23.141 17449-17454/com.example.soulfetchnew I/art: Increasing code cache capacity to 128KB
2019-02-06 14:12:26.787 17449-17454/com.example.soulfetchnew I/art: Do partial code cache collection, code=61KB, data=60KB
2019-02-06 14:12:26.855 17449-17454/com.example.soulfetchnew I/art: After code cache collection, code=60KB, data=60KB
2019-02-06 14:12:26.855 17449-17454/com.example.soulfetchnew I/art: Increasing code cache capacity to 256KB
2019-02-06 14:12:26.917 17449-17449/com.example.soulfetchnew W/SoundPool:   sample 2131623947 not READY
Wenn jemand eine Idee hat, warum das so ist, gerne her damit. Oder ist ein Service für SoundPools überhaupt ungeeignet? Wenn ja, was sollte ich sonst nehmen?
 
J

jogimuc

Erfahrenes Mitglied
Hallo was mir auffällt ist
if (intent.hasExtra("name")) {
soundID = intent.getIntExtra("Name", soundID)
playPing(soundID)
}
ein mal ist name Kleingeschrieben wenn es in die if geht, dann ist der Key aber Groß geschrieben.
somit düfte kein int aus dem Intent geholt werden.

Einenen Default wert hast du auch nicht. Wenn der Key nicht aufgelöst werden kann.
 
B

BraveSentry

Neues Mitglied
Threadstarter
Ich habe die Namen jetzt alle klein geschrieben. Macht leider keinen Unterschied.

Einen default Wert habe ich doch, wenn ich z.b. das hier schreibe, oder?

Code:
interface PutExtraConstants {
    companion object {
        var soundID: Int = R.raw.fping
    }}
 
J

jogimuc

Erfahrenes Mitglied
Nein
Ich meinte "soundID = intent.getIntExtra("Name", soundID)"
Da ist der Parameter nach dem key der wert der benutzt wird wenn der key nicht gefunden wurde. Das müsste in deinem Fall ein Sound Ressource sein.

woher willst du wissen das ein Sound geladen wurde und eine soundid erstellt wurde kann da kein log erkennen von denen Du sprichst.

Und durch den intent der wohl nichts enthält wird dein vermeintlicher default wert mit nichts überschrieben.

und noch etzwas hiermit erstellst du eine neue Variable
private lateinit var mSoundPool: SoundPool
die nicht gleich der objekt Variablen ist.

wenn dann so
class PutExtraConstants {
companion object {
var soundID: Int = R.raw.fping
}}

und der zugriff PutExtraConstants.soundID

Grudlagen Kotlin.
 
Zuletzt bearbeitet:
markus.tullius

markus.tullius

Experte
In deinem Log sind zwei Dinge seltsam:

BraveSentry schrieb:
Code:
2019-02-06 14:12:14.225 17449-17449/com.example.soulfetchnew I/Choreographer: Skipped 57 frames!  The application may be doing too much work on its main thread.
...
2019-02-06 14:12:17.270 17449-17449/com.example.soulfetchnew I/Choreographer: Skipped 183 frames!  The application may be doing too much work on its main thread.

und 

2019-02-06 14:12:17.573 17449-17449/com.example.soulfetchnew I/System.out: SOUNDS ARE LOADED
2019-02-06 14:12:17.573 17449-17449/com.example.soulfetchnew I/System.out: SOUNDS ARE LOADED
2019-02-06 14:12:17.705 17449-17449/com.example.soulfetchnew I/System.out: SOUNDS ARE LOADED
2019-02-06 14:12:18.175 17449-17449/com.example.soulfetchnew I/System.out: SOUNDS ARE LOADED
Anscheinend ist dein App im MainThread komplett ausgelastet. Und die der Song wird innerhalb von 5s 20 mal geladen.

Für mich sieht es so aus, als hätte deine App 20 Service, die alle das gleiche Stück laden. Und das alles geschieht im MainThread, weshalb du die Meldung
The application may be doing too much work on its main thread. bekommst

Da ich nicht den kompletten Code kenne, ist dies nur eine Vermutung:
Du startest immer wieder ein neuen Service, ohne den alten zu beenden. So das mehrere Service gleichzeitig das Musikstück abspielen wollen, und das funktioniert nicht, was zu deinem bekannten Problem führt.
 
Oben Unten