[Java] AudioClip multi voicing

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 16-09 13:22
Om sound fx af te spelen gebruik ik javafx.scene.media.AudioClip;

Elk object X heeft de volgende twee methoden (juiste imports zijn uiteraard gedaan):
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class X{

 private AudioClip player;

 //more code 

 public void Play(){
    new Thread(new Runnable() {
      public void run() {
        File soundFile = new File("sound/resources/sound.mp3");
        player = new AudioClip(soundFile.toURI().toString());
        player.play();
      }
    }).start();
  }

 public void stopPlaying(){
    player.stop();
  }
}


Zodra object X gemaakt wordt, wordt deze toegevoegd aan List/ArrayList list en ook gelijk per object de Play() methode aangeroepen. Het afspelen gaat allemaal prima en per object hoor ik sound.mp3 starten. Zodra voor het eerste object de condition true wordt en stopPlaying() wordt aangeroepen, stopt echter het geluid van alle objecten. X objecten die hierna aangemaakt worden, maken ook geen geluid meer.

Java:
1
2
3
4
5
6
7
8
9
for(int index = 0; index < list.size(); index++){
      if(!condition(list.get(index))){
       //move 
      }
      else if(condition(list.get(index))){
            list.get(index).stopPlaying();
           //change image
      }
    }


Dit is mijn eerste (serieuzere) Java creatie. Wat gaat hier mis?

[ Voor 5% gewijzigd door uppie8374 op 31-01-2019 12:17 ]

Rebuilding knowledge database

Beste antwoord (via Janoz op 04-06-2020 09:21)


  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 16-09 13:22
Ik weet dat het lang geleden is dat hier is gepost. Maar ik ben er kortgeleden maar weer eens mee verder gegaan en heb met een verse blik de oplossing gevonden. De stop() methode in de AudioClip library blijkt alle instanties in één keer te stoppen met opzet. Er is binnen deze library geen methode om per instantie het geluid te stoppen. Ik ben overgestapt op javafx.scene.media.MediaPlayer en die werkt wel prima.

Rebuilding knowledge database

Alle reacties


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

- waarom een nieuwe thread per play?
- klopt 'condition()' wel? Wordt niet per ongeluk 'condition' voor alle objecten true?
- waar wordt 'player' gedeclareerd? Is die wel uniek per obejct X?

Acties:
  • 0 Henk 'm!

  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 16-09 13:22
- De nieuwe thread per play was een poging om het probleem op te lossen. Mogelijk lag het probleem erin dat alles in 1 thread werd geperst... maar het loste inderdaad niets op.
- De condition klopt. Aangezien alle overige X objecten wel blijven bewegen.
- Ik heb de code wat aangepast zodat je ziet dat elk X object zijn eigen private AudioClip player heeft.

Rebuilding knowledge database


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Dan heb ik geen idee. De code die je post(afgezien van je nutteloze Threads) lijkt mij correct te kunnen werken.
Ik zou controleren of niet stiekem toch 1 keer stop wordt aangeroepen op de andere instances door een fout in condition().

Acties:
  • 0 Henk 'm!

  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 16-09 13:22
Heb de code nog in post 1 wat aangepast. Er gebeurt nog meer zodra de conditie true is. En dat gebeurt wel altijd netjes.

Rebuilding knowledge database


Acties:
  • +1 Henk 'm!

  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 16-09 13:22
Het schijnt dat bij JavaFX beter het volgende gebruikt kan worden:

Java:
1
2
3
4
5
6
7
8
Runnable task = () -> {
    Platform.runLater(() -> {
        // do something here
    });
};
Thread thread = new Thread(task);
thread.setDaemon(true);
thread.start();


Dit loste wel wat op. Zo werden de geluiden van nieuwe X objecten weer afgespeeld, ook als het eerste object de stopPlaying() methode heeft aangeroepen.

Rebuilding knowledge database


Acties:
  • Beste antwoord
  • +2 Henk 'm!

  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 16-09 13:22
Ik weet dat het lang geleden is dat hier is gepost. Maar ik ben er kortgeleden maar weer eens mee verder gegaan en heb met een verse blik de oplossing gevonden. De stop() methode in de AudioClip library blijkt alle instanties in één keer te stoppen met opzet. Er is binnen deze library geen methode om per instantie het geluid te stoppen. Ik ben overgestapt op javafx.scene.media.MediaPlayer en die werkt wel prima.

Rebuilding knowledge database

Pagina: 1