Soundboard Tutorial

E

elomanias

Fortgeschrittenes Mitglied
36
Hi Leute
ich will mit n paar freunden ein paar Soundboards erstellen, vorallem zu deutschen serien da fast alle ja englisch sind.

Java erfahrung haben wir
nur würde uns ein tutorial gewaltig helfen.

ich hoffe jemand kann uns helfen

mfg
elomanias
 
Was genau wollt ihr denn da wissen?
Habt ihr euch mal die Guides auf The Developer's Guide | Android Developers durchgelesen?

Ihr fügt einfach einen Button hinzu (Layout und Java)
Dann macht ihr für jeden Button folgendes in der onCreate(..)

Button xy = (Button)findViewById(R.id.buttonXY);
xy.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_file_1);
mp.start();
}
});

Das wäre es dann. R.raw.sound_file_1 ist eine Mp3/Ogg/etc im res/raw-Verzeichnis

Das hätte man aber mit der Dokumentation auch in Sekunden rausfinden können.
 
So hab jetzt nach den Feiertagen etwas an einem Soundboard gearbeitet

hab day layout fertig, die java files fertig nur will der das nicht abspielen
ich drücke auf einen der buttons und nichts passiert

kann mir jemand helfen??

meine java file mit dem OnCeate sieht so aus

Code:
package com.raddieltopo.soundboard.germanemployee;

import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View.OnClickListener;
import android.view.MenuInflater;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

public class GermanEmployee extends Activity implements OnClickListener {
   private MediaPlayer a,b,c,d,e,f,g,h,i,j,k,l; 
   
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       // Native rate is 44.1kHz 16 bit stereo, but
       // to save space we just use MPEG-3 22kHz mono
       a = MediaPlayer.create(this, R.raw.a);
       b = MediaPlayer.create(this, R.raw.b);
       c = MediaPlayer.create(this, R.raw.c);
       d = MediaPlayer.create(this, R.raw.d);
       e = MediaPlayer.create(this, R.raw.e);
       f = MediaPlayer.create(this, R.raw.f);
       g = MediaPlayer.create(this, R.raw.g);
       h = MediaPlayer.create(this, R.raw.h);
       i = MediaPlayer.create(this, R.raw.i);
       j = MediaPlayer.create(this, R.raw.j);
       k = MediaPlayer.create(this, R.raw.k);
       l = MediaPlayer.create(this, R.raw.l);
       
       // Setup click listeners
       setContentView(R.layout.main);
       
       View button0 = this.findViewById(R.id.button0);
       button0.setOnClickListener(this);
       View button1 = this.findViewById(R.id.button1);
       button1.setOnClickListener(this);
       View button2 = this.findViewById(R.id.button2);
       button2.setOnClickListener(this);
       View button3 = this.findViewById(R.id.button3);
       button3.setOnClickListener(this);
       View button4 = this.findViewById(R.id.button4);
       button4.setOnClickListener(this);
       View button5 = this.findViewById(R.id.button5);
       button5.setOnClickListener(this);
       View button6 = this.findViewById(R.id.button6);
       button6.setOnClickListener(this);
       View button7 = this.findViewById(R.id.button7);
       button7.setOnClickListener(this);
       View button8 = this.findViewById(R.id.button8);
       button8.setOnClickListener(this);
       View button9 = this.findViewById(R.id.button9);
       button9.setOnClickListener(this);
       View button10 = this.findViewById(R.id.button10);
       button10.setOnClickListener(this);
       View button11 = this.findViewById(R.id.button11);
       button11.setOnClickListener(this);
   }
 
   @Override
   public void onClick(View v) {
       MediaPlayer mp = null;
       switch (v.getId()) {
       
       case R.id.button0:
           mp=a;
           break;
       case R.id.button1:
           mp=b;
           break;
       case R.id.button2:
           mp=c;
           break;
       case R.id.button3:
           mp=d;
           break;
       case R.id.button4:
           mp=e;
           break;
       case R.id.button5:
           mp=f;
           break;
       case R.id.button6:
           mp=g;
           break;
       case R.id.button7:
           mp=h;
           break;
       case R.id.button8:
           mp=i;
           break;
       case R.id.button9:
           mp=j;
           break;
       case R.id.button10:
           mp=k;
           break;
       case R.id.button11:
           mp=l;
           break;           
       
       }
       
       mp.seekTo(0);
       mp.start();
       
   } 
   
    // Called only the first time the options menu is displayed.
    // Create the menu entries.
    // Menu adds items in the order shown.
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.layout.menu, menu);
        
        // Parameters for menu.add are:
        // group -- Not used here.
        // id -- Used only when you want to handle and identify the click yourself.
        // title
        /*
        menu.add("About...");
        menu.add("Quit");
        */
        return true;
    }
    
    // Activity callback that lets your handle the selection in the class.
    // Return true to indicate that you've got it, false to indicate
    // that it should be handled by a declared handler object for that
    // item (handler objects are discouraged for reasons of efficiency).
    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        
        switch(item.getItemId()) {
        
        case R.id.about:
            startActivity(new Intent(this, activity.class));
            return true;
        
        case R.id.quit:
            finish();
            return true;
           
        }
    
        return false;
    
    }
     
}
 
Zuletzt bearbeitet:
Hast du dir mal die Mühe gemacht, und mit Toasts geschaut, ob die Listener funktionieren?
 
EDIT:

so jetzt läufts :D

nur leider spielt er direkt zu beginn den ersten Sound ab und sobald ich auf den 7. sound gehe stürzt das prog ab

weis jemand rat ??

mfg
elomanias
 
Zuletzt bearbeitet:
ich hätte auch eine frage bezüglich des soundboards (insbesondere wegen sounds). in dem developer's guide, den SeraphimSerapis geschickt hat, steht, dass man den media player mittels stop() anhalten kann und mit reset() und prepare() wieder abspielbar machen. das stoppen funktioniert bei mir, jedoch nicht das wieder neu starten.
hier ist der code:
Code:
final Button button01 = (Button) findViewById(R.id.Button01);
        button01.setOnClickListener(new OnClickListener() {
            boolean button01clicked = false;
            CharSequence button01txt = button01.getText();
            MediaPlayer mp01 = MediaPlayer.create(getBaseContext(), R.raw.sound01);
            public void onClick(View v) {
                if(!button01clicked) {
                    mp01.start();
                    button01clicked = true;
                    button01.setText("-- Stop --");
                } else {
                    mp01.stop();
                    mp01.reset();
                    try {
                        mp01.prepare();
                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    button01clicked = false;
                    button01.setText(button01txt);
                }
            }
        });
der button soll nach dem anklicken seinen text auf "-- stop --" ändern. alternativ wäre mir auch ein programm-globaler stop button sogar noch lieber, aber ich weiß noch nicht wie ich so einen machen kann.

die zweite frage wäre, ob man die länge des sound ermitteln kann und nachdem er zu ende abgespielt ist eine aktion durchführen.

wäre dankbar für eure antworten
 
Zuletzt bearbeitet:
elomanias schrieb:
EDIT:

so jetzt läufts :D

nur leider spielt er direkt zu beginn den ersten Sound ab und sobald ich auf den 7. sound gehe stürzt das prog ab

weis jemand rat ??

mfg
elomanias

ich würde an deiner stelle noch in der switch-case einen default einsetzen und .start() und .seekTo() in eine if mit (mp!=null) { .. }.
das wäre, was mir zuerst dazu einfallen würde.

krümelmonster;131802 schrieb:
]der button soll nach dem anklicken seinen text auf "-- stop --" ändern. alternativ wäre mir auch ein programm-globaler stop button sogar noch lieber, aber ich weiß noch nicht wie ich so einen machen kann.

hallo, du hast einen denkfehler in deinem code.
ein globaler button ginge, indem man eben alle mp objekte stoppen lassen würde.

text auf buttons ändern lassen gilt übrigens als schlechtes design. ich kann es von daher weniger empfehlen.
 
Zuletzt bearbeitet:
SeraphimSerapis schrieb:
ich würde an deiner stelle noch in der switch-case einen default einsetzen und .start() und .seekTo() in eine if mit (mp!=null) { .. }.
das wäre, was mir zuerst dazu einfallen würde.

Hallo Seraph

danke erstmal für deine Hilfe.
hab leider grad voll die denkblokade

kannste mir grad einfach n biepsiel in meinem code schreiben??

mfg
elomanias
 
elomanias schrieb:
Hallo Seraph

danke erstmal für deine Hilfe.
hab leider grad voll die denkblokade

kannste mir grad einfach n biepsiel in meinem code schreiben??

mfg
elomanias

Code:
...
case R.id.button11:
           mp=l;
           break;           
default:
           mp=null;
           break;
       }
       if(mp!=null) {
           mp.seekTo(0);
           mp.start();
       }       
   }
...

so war das gedacht - aber keine garantie, dass es hilft.
ansonsten vtl noch eine exception werfen lassen (zB per toast), was da genau bei deinem einen button schiefgeht.
 
  • Danke
Reaktionen: elomanias
SeraphimSerapis schrieb:
[...]
hallo, du hast einen denkfehler in deinem code.
ein globaler button ginge, indem man eben alle mp objekte stoppen lassen würde.

text auf buttons ändern lassen gilt übrigens als schlechtes design. ich kann es von daher weniger empfehlen.

das problem jedoch ist, dass nach einem stop das neu starten des sounds nicht mehr funktioniert, trotz reset() und prepare()
 
SeraphimSerapis schrieb:
Code:
...
case R.id.button11:
           mp=l;
           break;           
default:
           mp=null;
           break;
       }
       if(mp!=null) {
           mp.seekTo(0);
           mp.start();
       }       
   }
...
so war das gedacht - aber keine garantie, dass es hilft.
ansonsten vtl noch eine exception werfen lassen (zB per toast), was da genau bei deinem einen button schiefgeht.

Hi Seraph
danke erstmal
dank deines code snippets crasht das programm nicht mehr, doch will es die sound jetzt nicht abspielen
wenigstens ein fortschritt.
wobei ich grad auch nicht mehr weiter weiss
wenn du willst kann ich dir die source per mail senden oder hier anhängen, sodass du sie dir genauer angucken kannst.

mfg
elomanias
 
elomanias schrieb:
Hi Seraph
danke erstmal
dank deines code snippets crasht das programm nicht mehr, doch will es die sound jetzt nicht abspielen
wenigstens ein fortschritt.
wobei ich grad auch nicht mehr weiter weiss
wenn du willst kann ich dir die source per mail senden oder hier anhängen, sodass du sie dir genauer angucken kannst.

mfg
elomanias

du kannst mir mal dein projekt samt soundfiles exportieren und mir den link dazu per pn schicken.
ich bastel dann mal daran rum, garantiere aber nicht für eine sofortige lösung.

gruß tim
 
ich habs jetzt mal anders gebaut (mediaplayer als instanzvariable), einen globalen stop button gemacht und nun scheint es zu funktionieren. ich bedanke mich schon mal!

aber die andere frage ist immer noch ob man die länge des sounds ermitteln kann oder ob man rausfinden kann, wann er zu ende abgespielt hat. ich will nämlich verhindern, dass wenn man ausversehen zwei mal den selben button betätigt, dass dann der sound zwei mal übreinander abgespielt wird.
 
krümelmonster;132518 schrieb:
ich habs jetzt mal anders gebaut (mediaplayer als instanzvariable), einen globalen stop button gemacht und nun scheint es zu funktionieren. ich bedanke mich schon mal!

aber die andere frage ist immer noch ob man die länge des sounds ermitteln kann oder ob man rausfinden kann, wann er zu ende abgespielt hat. ich will nämlich verhindern, dass wenn man ausversehen zwei mal den selben button betätigt, dass dann der sound zwei mal übreinander abgespielt wird.

was du auf jeden fall machen könntest, wäre sowas wie eine boolean-variable einführen isPlaying, welche du auf true setzt, wenn du gerade was abspielst, und danach auf false. dann kannste dir das sparen.

edit: hier eine nette grafik für euch

mediaplayer_state_diagram.gif


ich find die jedenfalls nützlich ;)
 
wenn ich diese variable habe kann ich zwar schon verhindern, dass mehrere sounds gleichzeitig abgespielt werden, wie wird diese aber wieder auf false gesetzt? der stop button kann diese funktion übernehmen, jedoch will ich nicht diesen jedes mal drücken, wenn der sound abgespielt wurde. ich brauche so eine art überwacher, der nachschaut, ob der sound zu ende ist und selber diese variable auf false setzt.
 
krümelmonster;132411 schrieb:
das problem jedoch ist, dass nach einem stop das neu starten des sounds nicht mehr funktioniert, trotz reset() und prepare()

hallo, prüfen, ob dein mediaplayer gerade spielt, kannst du doch ganz einfach mit:
Code:
isPlaying()

das liefert dir logischerweise true zurück, wenn er was abspielt, und false, wenn nicht. das kommt dann in eine while.

while (isPlaying()) {
...
}
//Hier logischerweise dann nicht mehr am spielen.

isPlaying()
 
hi Seraph

hab eben festgestellt dass ich durch den tip von gestern von dir
Code:
case R.id.button11:
           mp=l;
           break;           
default:
           mp=null;

den button abspielen kann
wenn ich das weitereditiere für die anderen buttons krieg ich nen fehler dass default bereits definiert ist

vielleicht weisst du wie man das weiter hinbekomt
break;
 
SeraphimSerapis schrieb:
hallo, prüfen, ob dein mediaplayer gerade spielt, kannst du doch ganz einfach mit:
Code:
isPlaying()
das liefert dir logischerweise true zurück, wenn er was abspielt, und false, wenn nicht. das kommt dann in eine while.

while (isPlaying()) {
...
}
//Hier logischerweise dann nicht mehr am spielen.

isPlaying()

danke!
mir war nicht klar, dass es die methode isPlaying() überhaupt gibt. ich dachte, dass du von einer variablen sprachst, die dann aber gesetzt werden sollte.
aber while(isPlaying()) würde ich nicht machen, dann hätte man busy waiting, was der performance nicht gut tun würde.

nun funktioniert alles wie es soll. danke!
 
Zuletzt bearbeitet:
krümelmonster;132630 schrieb:
wenn ich diese variable habe kann ich zwar schon verhindern, dass mehrere sounds gleichzeitig abgespielt werden, wie wird diese aber wieder auf false gesetzt? der stop button kann diese funktion übernehmen, jedoch will ich nicht diesen jedes mal drücken, wenn der sound abgespielt wurde. ich brauche so eine art überwacher, der nachschaut, ob der sound zu ende ist und selber diese variable auf false setzt.

Schau mal hier:MediaPlayer | Android Developers
Da gibts die Methode setOnCompletionListener(MediaPlayer.OnCompletionListener listener)
In dem Listener kannst du dann auch zB. nen Flag zurücksetzen lassen oder beliebige andere Dinge tun.
Aber wenn du es jetzt eh schon anders gelöst hast ists egal.

Gruß
Jarny
 
krümelmonster;133276 schrieb:
danke!
mir war nicht klar, dass es die methode isPlaying() überhaupt gibt. ich dachte, dass du von einer variablen sprachst, die dann aber gesetzt werden sollte.
aber while(isPlaying()) würde ich nicht machen, dann hätte man busy waiting, was der performance nicht gut tun würde.

nun funktioniert alles wie es soll. danke!

war ja auch nur ein beispiel ;)
viel spaß damit.

gruß tim
 

Ähnliche Themen

R
Antworten
1
Aufrufe
1.091
Tiefkuehlpizza
Tiefkuehlpizza
L
Antworten
4
Aufrufe
913
Kardroid
Kardroid
Zurück
Oben Unten