+ Antworten
Ergebnis 1 bis 17 von 17

Thema: Wav-Sound abspielen

  1. #1
    User double Themenstarter

    Registriert seit
    08.01.2016
    Fachbeiträge
    97
    Genannt
    1 Post(s)
    Hey.

    Ich habe nen Musikplayer. der MP3's ohne Probleme abspielen kann, jedoch kann JLayer anscheinend keine WAV. Ich dachte mir kein Problem, das kann java ansich ja eh schon. Aber egal wie ich es versuche: Ich höre nichts:

    Java Code:
    1. try {
    2.             AudioInputStream old = AudioSystem.getAudioInputStream(f);
    3.             AudioInputStream ais = AudioSystem.getAudioInputStream(new AudioFormat(44100,
    4.                     16,
    5.                     2,
    6.                     true,
    7.                     false), old);
    8.             Clip clip = AudioSystem.getClip();
    9.             clip.open(ais);
    10.             clip.loop(Clip.LOOP_CONTINUOUSLY);
    11.             clip.start();
    12.             AudioClip aClip = Applet.newAudioClip(f.toURI().toURL());
    13.             aClip.play();
    14.         } catch  (IOException ex) {
    15.             ex.printStackTrace();
    16.         } catch (LineUnavailableException ex) {
    17.             ex.printStackTrace();
    18.         } catch (UnsupportedAudioFileException ex) {
    19.             ex.printStackTrace();
    20.         }

    Die File kann ich problemlos im VLC oä abspielen. Aber egal ob ich clip.open(ais); oder clip.open(old); benutze, ich höre nichts und das Programm läuft auch nichtmal ne Sekunde. Es wir auch keine Exception geworfen, habe bereits 3 Wav-Dateien probiert.

  2. #2
    Global Moderator Megabyte Avatar von Spacerat
    Registriert seit
    30.07.2013
    Fachbeiträge
    1.193
    Genannt
    129 Post(s)
    Blog-Einträge
    1
    Es gibt einige Wav-Formate, die die JVM nunmal nicht spielt. JLayer kann daran auch nichts ändern, aber dann müsste auch eine Exception fliegen. Das Problem hier dürfte sein, dass das Programm nicht auf den Clip wartet.
    Java Code:
    1. import static javax.sound.sampled.AudioFormat.Encoding.PCM_SIGNED;
    2. import static javax.sound.sampled.AudioFormat.Encoding.PCM_UNSIGNED;
    3.  
    4. import java.io.File;
    5.  
    6. import javax.sound.sampled.AudioFormat;
    7. import javax.sound.sampled.AudioInputStream;
    8. import javax.sound.sampled.AudioSystem;
    9. import javax.sound.sampled.Clip;
    10. import javax.sound.sampled.LineEvent;
    11. import javax.sound.sampled.LineEvent.Type;
    12. import javax.sound.sampled.LineListener;
    13. import javax.sound.sampled.AudioFormat.Encoding;
    14.  
    15. public class AudioDemo {
    16.     public static void main(String[] args) throws Throwable {
    17.         if(args == null || args.length == 0) {
    18.             args = new String[] {"test.wav"};
    19.         }
    20.         File f = new File(args[0]);
    21.         AudioInputStream ais = ensurePCM(AudioSystem.getAudioInputStream(f));
    22.         Clip c = AudioSystem.getClip();
    23.         c.open(ais);
    24.         c.start();
    25. // ab hier wirds wichtig
    26.         final Thread t = Thread.currentThread();
    27.         c.addLineListener(new LineListener() {
    28.             @Override
    29.             public void update(LineEvent event) {
    30.                 if(event.getType() == Type.STOP) {
    31.                     synchronized(t) {
    32.                         t.notify();
    33.                     }
    34.                 }
    35.             }
    36.         });
    37.         synchronized(t) {
    38.             try {
    39.                 t.wait();
    40.             } catch(InterruptedException e) {
    41.                 // do nothing
    42.             }
    43.         }
    44.     }
    45.  
    46.     private static final AudioInputStream ensurePCM(AudioInputStream source)
    47.     {
    48.         AudioFormat af = source.getFormat();
    49.         Encoding enc = af.getEncoding();
    50.         if(!PCM_SIGNED.equals(enc) && !PCM_UNSIGNED.equals(enc)) {
    51.             int ssb = af.getSampleSizeInBits();
    52.             int c = af.getChannels();
    53.             if(ssb < 8) {
    54.                 ssb = 8;
    55.             }
    56.             int minFs = c * ssb / 8;
    57.             int fs = af.getFrameSize();
    58.             if(fs < minFs) {
    59.                 fs = minFs;
    60.             }
    61.             af = new AudioFormat(
    62.                     AudioFormat.Encoding.PCM_SIGNED,
    63.                     af.getSampleRate(),
    64.                     ssb * 2,
    65.                     af.getChannels(),
    66.                     fs * 2,
    67.                     af.getSampleRate(),
    68.                     af.isBigEndian()
    69.                 );
    70.             source = AudioSystem.getAudioInputStream(af, source);
    71.         }
    72.         return source;
    73.     }
    74. }
    BTW.: Das Umformen eines AudioStreams ist nur dann nötig, wenn das Encoding nicht PCM_SIGNED oder PCM_UNSIGNED ist. Zu diesem Zweck empfieht es sich, diese Umformunf als Utility-Methode (hier "ensurePCM()") auszulagern. Gerne darf man sich fragen, warum es eine solche nicht in der API gibt, bzw. warum die API das Soundformat beim Abspielen nicht automatisch anpasst.
    Kaum macht man's richtig, geht's
    Wer seinen Gegner unterschätzt, ist erst entzückt und dann entsetzt. (Bugs Bunny)
    "Esst mehr Gemüse!" (Clive Owen/Smith - Shoot Em Up)

  3. #3
    User double Themenstarter

    Registriert seit
    08.01.2016
    Fachbeiträge
    97
    Genannt
    1 Post(s)
    Danke, mit der Methode kann ichs dann abspielen. Hätte ich aber auch drauf kommen können. BEvor ich jetz aber anfange, einen neue PLayer-Klasse für Wav-Datein zu schreiben bzw den vorhandenen umschreibe, das er erkennt, welche Endung die Audiodatei hat (Momentan hat er nen einfachen Inputstream), kann ich nciht auch einfach JLayer dazu bringen, das er es abspielt? Ich hoffe mal, wer kennt sich damit aus, ansonsten änder ich den Player halt. Bei ner Wav kommt immer die Exception:
    Java Code:
    1.     at javazoom.jl.decoder.LayerIDecoder$SubbandLayer1Stereo.read_allocation(Unknown Source)
    2.     at javazoom.jl.decoder.LayerIDecoder.readAllocation(Unknown Source)
    3.     at javazoom.jl.decoder.LayerIDecoder.decodeFrame(Unknown Source)
    4.     at javazoom.jl.decoder.Decoder.decodeFrame(Unknown Source)
    5.     at musikplayer.erweiterungen.player.MyPlayer.decodeFrame(MyPlayer.java:158)
    6.     at musikplayer.erweiterungen.player.MyPlayer.play(MyPlayer.java:89)
    7.     at musikplayer.erweiterungen.player.MyPlayer.play(MyPlayer.java:68)
    8.     at musikplayer.PlayerTest.main(PlayerTest.java:28)
    In der Klasse in der Methode wird auf ein Array mit 15 Inhalten zugegriffen, aber es wird der Index 15 gebraucht, einer zuviel. ICh hab das soweit mal zurückverfolgt und es wird anscheinend der Anfangs erzeugte Bitstream immer weitergegeben, aber am Anfang gibt die bitstream.get_bits(4); Methode 0 aus. Hmpf, muss ich nochmal drüberschauen

  4. #4
    Global Moderator Megabyte Avatar von Spacerat
    Registriert seit
    30.07.2013
    Fachbeiträge
    1.193
    Genannt
    129 Post(s)
    Blog-Einträge
    1
    Hmm... der musicplayer scheint etwas ausserhalb von JLayer zu sein. Ist das was eigenes? Dann wäre etwas Code hilfreich.
    Geändert von Spacerat (30.01.2016 um 18:00 Uhr)
    Kaum macht man's richtig, geht's
    Wer seinen Gegner unterschätzt, ist erst entzückt und dann entsetzt. (Bugs Bunny)
    "Esst mehr Gemüse!" (Clive Owen/Smith - Shoot Em Up)

  5. #5
    User double Themenstarter

    Registriert seit
    08.01.2016
    Fachbeiträge
    97
    Genannt
    1 Post(s)
    Das ist was eigenes, und zwar mein Musikplayer in dem ich das einbauen möchte. der "MyPlayer" sSt quasi der Advanced-Player aus JLayer, nur um ne Pause/Resume MEthode erweitert, sowie ne Methode zur Lautstärkeregelung, mehr ist da nicht anders. und der Rest von meinem Projekt hat mit dem Test hier nichts am Hut, da ich es erstmal in meiner Testklasse zum laufen bekommen möchte, bevor ich es in mein Hauptprojekt einbaue.

  6. #6
    Global Moderator Megabyte Avatar von Spacerat
    Registriert seit
    30.07.2013
    Fachbeiträge
    1.193
    Genannt
    129 Post(s)
    Blog-Einträge
    1
    Da ist zumindest soviel anders, dass die JLayer-Methoden nicht mehr funktionieren. Was glaubst du, wo der Fehler wohl steckt? In der JLayer-API oder in deinem Player? Ich tippe ja mal auf letzteres. Von daher kann es hier ohne etwas Code nicht weitergehen.
    Kaum macht man's richtig, geht's
    Wer seinen Gegner unterschätzt, ist erst entzückt und dann entsetzt. (Bugs Bunny)
    "Esst mehr Gemüse!" (Clive Owen/Smith - Shoot Em Up)

  7. #7
    User double Themenstarter

    Registriert seit
    08.01.2016
    Fachbeiträge
    97
    Genannt
    1 Post(s)
    In der JLayer-APi. Ansonsten würde das hier ja funktionieren:
    Java Code:
    1.  File f = new File("D:\\Musik\\Musik-Oberordner\\Favoriten\\Dutty Moonshine - Takin' It Back.wav");
    2.         File f3 = new File("D:\\Musik\\Musik-Oberordner\\Effekte\\trolololol\\trolololol.wav");
    3.         File f2 = new File("D:\\Musik\\Musik-Oberordner\\Favoriten\\SOFT CELL   TAINTED LOVE HQ official video mp4.mp3");
    4.         final Thread t = Thread.currentThread();
    5.         try {
    6.             AudioInputStream old = AudioSystem.getAudioInputStream(f);
    7.             AudioInputStream ais = AudioSystem.getAudioInputStream(new AudioFormat(44100,
    8.                     16,
    9.                     2,
    10.                     true,
    11.                     false), old);
    12.             System.out.println(ais);
    13.             System.out.println(ais.getFormat().getSampleSizeInBits());
    14.             FileInputStream fis = new FileInputStream(f);
    15.             AdvancedPlayer player = new AdvancedPlayer(fis);
    16.             player.setPlayBackListener(new PlaybackListener() {
    17.                 @Override
    18.                 public void playbackFinished(PlaybackEvent evt) {
    19.                     synchronized (t) {
    20.                         System.out.println("Finished");
    21.                         t.notify();
    22.                     }
    23.                 }
    24.  
    25.             });
    26. //            player.setGain(100f);
    27.             player.play();
    28.             synchronized (t) {
    29.                 try {
    30.                     System.out.println("wait");
    31.                     t.wait();
    32.                 } catch (InterruptedException e) {
    33.                     // do nothing
    34.                 }
    35.             }
    36.  
    37.         } catch (JavaLayerException ex) {
    38.             ex.printStackTrace();
    39.         } catch (UnsupportedAudioFileException | IOException ex) {
    40.             ex.printStackTrace();
    41.         }
    Und zum anderen haben die neuen MEthoden von mri keinen EInfluss auf den Player, solange sie nciht aufgerufen werden:
    ORiginal AdvancedPlayer:
    Java Code:
    1. public class AdvancedPlayer
    2. {
    3.     /** The MPEG audio bitstream.*/
    4.     private Bitstream bitstream;
    5.     /** The MPEG audio decoder. */
    6.     private Decoder decoder;
    7.     /** The AudioDevice the audio samples are written to. */
    8.     private AudioDevice audio;
    9.     /** Has the player been closed? */
    10.     private boolean closed = false;
    11.     /** Has the player played back all frames from the stream? */
    12.     private boolean complete = false;
    13.     private int lastPosition = 0;
    14.     /** Listener for the playback process */
    15.     private PlaybackListener listener;
    16.  
    17.     /**
    18.      * Creates a new <code>Player</code> instance.
    19.      */
    20.     public AdvancedPlayer(InputStream stream) throws JavaLayerException
    21.     {
    22.         this(stream, null);
    23.     }
    24.  
    25.     public AdvancedPlayer(InputStream stream, AudioDevice device) throws JavaLayerException
    26.     {
    27.         bitstream = new Bitstream(stream);
    28.  
    29.         if (device!=null) audio = device;
    30.         else audio = FactoryRegistry.systemRegistry().createAudioDevice();
    31.         audio.open(decoder = new Decoder());
    32.     }
    33.  
    34.     public void play() throws JavaLayerException
    35.     {
    36.         play(Integer.MAX_VALUE);
    37.     }
    38.  
    39.     /**
    40.      * Plays a number of MPEG audio frames.
    41.      *
    42.      * @param frames    The number of frames to play.
    43.      * @return  true if the last frame was played, or false if there are
    44.      *          more frames.
    45.      */
    46.     public boolean play(int frames) throws JavaLayerException
    47.     {
    48.         boolean ret = true;
    49.  
    50.         // report to listener
    51.         if(listener != null) listener.playbackStarted(createEvent(PlaybackEvent.STARTED));
    52.  
    53.         while (frames-- > 0 && ret)
    54.         {
    55.             ret = decodeFrame();
    56.         }
    57.  
    58. //      if (!ret)
    59.         {
    60.             // last frame, ensure all data flushed to the audio device.
    61.             AudioDevice out = audio;
    62.             if (out != null)
    63.             {
    64. //              System.out.println(audio.getPosition());
    65.                 out.flush();
    66. //              System.out.println(audio.getPosition());
    67.                 synchronized (this)
    68.                 {
    69.                     complete = (!closed);
    70.                     close();
    71.                 }
    72.  
    73.                 // report to listener
    74.                 if(listener != null) listener.playbackFinished(createEvent(out, PlaybackEvent.STOPPED));
    75.             }
    76.         }
    77.         return ret;
    78.     }
    79.  
    80.     /**
    81.      * Cloases this player. Any audio currently playing is stopped
    82.      * immediately.
    83.      */
    84.     public synchronized void close()
    85.     {
    86.         AudioDevice out = audio;
    87.         if (out != null)
    88.         {
    89.             closed = true;
    90.             audio = null;
    91.             // this may fail, so ensure object state is set up before
    92.             // calling this method.
    93.             out.close();
    94.             lastPosition = out.getPosition();
    95.             try
    96.             {
    97.                 bitstream.close();
    98.             }
    99.             catch (BitstreamException ex)
    100.             {}
    101.         }
    102.     }
    103.  
    104.     /**
    105.      * Decodes a single frame.
    106.      *
    107.      * @return true if there are no more frames to decode, false otherwise.
    108.      */
    109.     protected boolean decodeFrame() throws JavaLayerException
    110.     {
    111.         try
    112.         {
    113.             AudioDevice out = audio;
    114.             if (out == null) return false;
    115.  
    116.             Header h = bitstream.readFrame();
    117.             if (h == null) return false;
    118.  
    119.             // sample buffer set when decoder constructed
    120.             SampleBuffer output = (SampleBuffer) decoder.decodeFrame(h, bitstream);
    121.  
    122.             synchronized (this)
    123.             {
    124.                 out = audio;
    125.                 if(out != null)
    126.                 {
    127.                     out.write(output.getBuffer(), 0, output.getBufferLength());
    128.                 }
    129.             }
    130.  
    131.             bitstream.closeFrame();
    132.         }
    133.         catch (RuntimeException ex)
    134.         {
    135.             throw new JavaLayerException("Exception decoding audio frame", ex);
    136.         }
    137.         return true;
    138.     }
    139.  
    140.     /**
    141.      * skips over a single frame
    142.      * @return false    if there are no more frames to decode, true otherwise.
    143.      */
    144.     protected boolean skipFrame() throws JavaLayerException
    145.     {
    146.         Header h = bitstream.readFrame();
    147.         if (h == null) return false;
    148.         bitstream.closeFrame();
    149.         return true;
    150.     }
    151.  
    152.     /**
    153.      * Plays a range of MPEG audio frames
    154.      * @param start The first frame to play
    155.      * @param end       The last frame to play
    156.      * @return true if the last frame was played, or false if there are more frames.
    157.      */
    158.     public boolean play(final int start, final int end) throws JavaLayerException
    159.     {
    160.         boolean ret = true;
    161.         int offset = start;
    162.         while (offset-- > 0 && ret) ret = skipFrame();
    163.         return play(end - start);
    164.     }
    165.  
    166.     /**
    167.      * Constructs a <code>PlaybackEvent</code>
    168.      */
    169.     private PlaybackEvent createEvent(int id)
    170.     {
    171.         return createEvent(audio, id);
    172.     }
    173.  
    174.     /**
    175.      * Constructs a <code>PlaybackEvent</code>
    176.      */
    177.     private PlaybackEvent createEvent(AudioDevice dev, int id)
    178.     {
    179.         return new PlaybackEvent(this, id, dev.getPosition());
    180.     }
    181.  
    182.     /**
    183.      * sets the <code>PlaybackListener</code>
    184.      */
    185.     public void setPlayBackListener(PlaybackListener listener)
    186.     {
    187.         this.listener = listener;
    188.     }
    189.  
    190.     /**
    191.      * gets the <code>PlaybackListener</code>
    192.      */
    193.     public PlaybackListener getPlayBackListener()
    194.     {
    195.         return listener;
    196.     }
    197.  
    198.     /**
    199.      * closes the player and notifies <code>PlaybackListener</code>
    200.      */
    201.     public void stop()
    202.     {
    203.         listener.playbackFinished(createEvent(PlaybackEvent.STOPPED));
    204.         close();
    205.     }
    206. }
    Meine MyPlayer:
    Java Code:
    1. public class MyPlayer implements Closeable{
    2.  
    3.     /**
    4.      * The MPEG audio bitstream.
    5.      */
    6.     private Bitstream bitstream;
    7.     /**
    8.      * The MPEG audio decoder.
    9.      */
    10.     private Decoder decoder;
    11.     /**
    12.      * The AudioDevice the audio samples are written to.
    13.      */
    14.     private AudioDevice audio;
    15.     /**
    16.      * Has the player been closed?
    17.      */
    18.     private boolean closed = false;
    19.     /**
    20.      * Has the player played back all frames from the stream?
    21.      */
    22.     private boolean complete = false;
    23.     private int lastPosition = 0;
    24.     /**
    25.      * Listener for the playback process
    26.      */
    27.     private MyPlaybackListener listener;
    28.     private volatile boolean paused = false;
    29.  
    30.     /**
    31.      * Creates a new <code>Player</code> instance.
    32.      *
    33.      * @param stream
    34.      * @throws JavaLayerException
    35.      */
    36.     public MyPlayer(InputStream stream) throws JavaLayerException {
    37.         this(stream, null);
    38.     }
    39.  
    40.     public MyPlayer(InputStream stream, AudioDevice device, int gainValue) throws JavaLayerException {
    41.         bitstream = new Bitstream(stream);
    42.         if (device != null) {
    43.             audio = device;
    44.         } else {
    45.             audio = FactoryRegistry.systemRegistry().createAudioDevice();
    46.         }
    47.        
    48.         audio.open(decoder = new Decoder());
    49.     }
    50.  
    51.     public boolean play() throws JavaLayerException {
    52.         return play(Integer.MAX_VALUE);
    53.     }
    54.  
    55.     /**
    56.      * Plays a number of MPEG audio frames.
    57.      *
    58.      * @param frames    The number of frames to play.
    59.      * @return  true if the last frame was played, or false if there are more
    60.      * frames.
    61.      * @throws JavaLayerException
    62.      */
    63.     @SuppressWarnings("SleepWhileInLoop")
    64.     public boolean play(int frames) throws JavaLayerException {
    65.         boolean ret = true;
    66.  
    67.         // report to listener
    68.         if (listener != null) {
    69.             listener.playbackStarted(createEvent(PlaybackEvent.STARTED));
    70.         }
    71.  
    72.         while (frames-- > 0 && ret) {
    73.             ret = decodeFrame();
    74.             while (paused) {
    75.                 try {
    76.                     Thread.sleep(20);
    77.                 } catch (InterruptedException ex) {
    78.                 }
    79.             }
    80.  
    81.         }
    82.  
    83. //        if (!ret) {
    84.         // last frame, ensure all data flushed to the audio device.
    85.         AudioDevice out = audio;
    86.         if (out != null) {
    87. //              System.out.println(audio.getPosition());
    88.             out.flush();
    89. //              System.out.println(audio.getPosition());
    90.             synchronized (this) {
    91.                 complete = (!closed);
    92.                 close();
    93.             }
    94.  
    95.             // report to listener
    96.             if (listener != null) {
    97.                 listener.playbackFinished(createEvent(out, PlaybackEvent.STOPPED));
    98.             }
    99.         }
    100. //        }
    101.         return ret;
    102.     }
    103.  
    104.     /**
    105.      * Cloases this player. Any audio currently playing is stopped immediately.
    106.      */
    107.     @Override
    108.     public synchronized void close() {
    109.         AudioDevice out = audio;
    110.         if (out != null) {
    111.             closed = true;
    112.             audio = null;
    113.             // this may fail, so ensure object state is set up before
    114.             // calling this method.
    115.             out.close();
    116.             lastPosition = out.getPosition();
    117.             try {
    118.                 bitstream.close();
    119.             } catch (BitstreamException ex) {
    120.             }
    121.         }
    122.     }
    123.  
    124.     /**
    125.      * Decodes a single frame.
    126.      *
    127.      * @return true if there are no more frames to decode, false otherwise.
    128.      * @throws JavaLayerException
    129.      */
    130.     protected boolean decodeFrame() throws JavaLayerException {
    131.         try {
    132.             AudioDevice out = audio;
    133.             if (out == null) {
    134.                 return false;
    135.             }
    136.  
    137.             Header h = bitstream.readFrame();
    138.             if (h == null) {
    139.                 return false;
    140.             }
    141.  
    142.             // sample buffer set when decoder constructed
    143.             SampleBuffer output = (SampleBuffer) decoder.decodeFrame(h, bitstream);
    144.  
    145.             synchronized (this) {
    146.                 out = audio;
    147.                 if (out != null) {
    148.                     out.write(output.getBuffer(), 0, output.getBufferLength());
    149.                 }
    150.             }
    151.  
    152.             bitstream.closeFrame();
    153.         } catch (RuntimeException ex) {
    154.             throw new JavaLayerException("Exception decoding audio frame", ex);
    155.         }
    156.         return true;
    157.     }
    158.  
    159.     /**
    160.      * skips over a single frame
    161.      *
    162.      * @return false    if there are no more frames to decode, true otherwise.
    163.      * @throws JavaLayerException
    164.      */
    165.     protected boolean skipFrame() throws JavaLayerException {
    166.         Header h = bitstream.readFrame();
    167.         if (h == null) {
    168.             return false;
    169.         }
    170.         bitstream.closeFrame();
    171.         return true;
    172.     }
    173.  
    174.     public final boolean setGain(float newGain) {
    175.         if (audio instanceof JavaSoundAudioDevice) {
    176.             JavaSoundAudioDevice jsAudio = (JavaSoundAudioDevice) audio;
    177.             if (jsAudio.isSourceNull()) {
    178.                 try {
    179.                     jsAudio.createSource();
    180.                 } catch (JavaLayerException ex) {
    181.                     ex.printStackTrace();
    182.                 }
    183.             }
    184.             return jsAudio.setLineGain(newGain);
    185.         }
    186.         return false;
    187.     }
    188.  
    189.     /**
    190.      * Plays a range of MPEG audio frames
    191.      *
    192.      * @param start The first frame to play
    193.      * @param end   The last frame to play
    194.      * @return true if the last frame was played, or false if there are more
    195.      * frames.
    196.      * @throws JavaLayerException
    197.      */
    198.     public boolean play(final int start, final int end) throws JavaLayerException {
    199.         boolean ret = true;
    200.         int offset = start;
    201.         while (offset-- > 0 && ret) {
    202.             ret = skipFrame();
    203.         }
    204.         return play(end - start);
    205.     }
    206.  
    207.     /**
    208.      * Constructs a <code>PlaybackEvent</code>
    209.      */
    210.     private MyPlaybackEvent createEvent(int id) {
    211.         return createEvent(audio, id);
    212.     }
    213.  
    214.     /**
    215.      * Constructs a <code>PlaybackEvent</code>
    216.      */
    217.     private MyPlaybackEvent createEvent(AudioDevice dev, int id) {
    218.         return new MyPlaybackEvent(this, id, dev.getPosition());
    219.     }
    220.  
    221.     /**
    222.      * sets the <code>PlaybackListener</code>
    223.      *
    224.      * @param listener
    225.      */
    226.     public void setPlayBackListener(MyPlaybackListener listener) {
    227.         this.listener = listener;
    228.     }
    229.  
    230.     /**
    231.      * gets the <code>PlaybackListener</code>
    232.      *
    233.      * @return
    234.      */
    235.     public MyPlaybackListener getPlayBackListener() {
    236.         return listener;
    237.     }
    238.  
    239.     /**
    240.      * closes the player and notifies <code>PlaybackListener</code>
    241.      */
    242.     public void stop() {
    243.         listener.playbackFinished(createEvent(PlaybackEvent.STOPPED));
    244.         complete = true;
    245.         close();
    246.     }
    247.  
    248.     public int getPosition() {
    249.         int position = lastPosition;
    250.  
    251.         AudioDevice out = audio;
    252.         if (out != null) {
    253.             position = out.getPosition();
    254.         }
    255.         return position;
    256.     }
    257.  
    258.     public synchronized boolean isComplete() {
    259.         return complete;
    260.     }
    261.  
    262.     public boolean isPaused() {
    263.         return paused;
    264.     }
    265.  
    266.     public int getLastPosition() {
    267.         return lastPosition;
    268.     }
    269.  
    270.     public synchronized void pause() {
    271.         if (!complete) {
    272.             System.out.println("Pause");
    273.             paused = true;
    274.         }
    275.     }
    276.  
    277.     public synchronized void resume() {
    278.         if (paused) {
    279.             System.out.println("Play");
    280.             paused = false;
    281.         }
    282.     }
    283.    
    284.     public boolean isClosed() {
    285.         return closed;
    286.     }
    287.    
    288. }

    DIe Veränderungen sing eig nur das hier:
    Java Code:
    1.  
    2. public MyPlayer(InputStream stream, AudioDevice device, int gainValue) throws JavaLayerException {
    3.         bitstream = new Bitstream(stream);
    4.         if (device != null) {
    5.             audio = device;
    6.         } else {
    7.             audio = FactoryRegistry.systemRegistry().createAudioDevice();
    8.         }
    9.             setGain(gainValue);
    10.         audio.open(decoder = new Decoder());
    11.     }
    12. public boolean play(int frames) throws JavaLayerException {
    13. //..
    14. ret = decodeFrame();
    15.             while (paused) {
    16.                 try {
    17.                     Thread.sleep(20);
    18.                 } catch (InterruptedException ex) {
    19.                 }
    20.             }
    21. //..
    22. }
    23.  public final boolean setGain(float newGain) {
    24.         if (audio instanceof JavaSoundAudioDevice) {
    25.             JavaSoundAudioDevice jsAudio = (JavaSoundAudioDevice) audio;
    26.             if (jsAudio.isSourceNull()) {
    27.                 try {
    28.                     jsAudio.createSource();
    29.                 } catch (JavaLayerException ex) {
    30.                     ex.printStackTrace();
    31.                 }
    32.             }
    33.             return jsAudio.setLineGain(newGain);
    34.         }
    35.         return false;
    36.     }
    37.  public synchronized void pause() {
    38.         if (!complete) {
    39.             System.out.println("Pause");
    40.             paused = true;
    41.         }
    42.     }
    43.  
    44.     public synchronized void resume() {
    45.         if (paused) {
    46.             System.out.println("Play");
    47.             paused = false;
    48.         }
    49.     }

    Ändert also nicht wirklich was daran, finde ich. Und der originale packt es ja auch nicht. Gleiche Exception

  8. #8
    Global Moderator Megabyte Avatar von Spacerat
    Registriert seit
    30.07.2013
    Fachbeiträge
    1.193
    Genannt
    129 Post(s)
    Blog-Einträge
    1
    Das klappt ja schon mal deswegen nicht, weil der JLayer-Player ein wenig anders funktioniert - du musst nicht warten, bis der Track abgespielt ist. Wenn du wartest, wird der Player anscheinend gestoppt und feuert einen entsprechenden Event. Sicher bin ich mir da zwar nicht, aber so könnte es sein. Ich habe auch irgendwie das Gefühl, dass der JLayer-Player Probleme mit recht kurzen Clips hat und auch sonst ist er nicht das Gelbe vom Ei.
    Lt. StackOverflow kann man in diesem einen Pause-Mechanismus der ganz anderen Art implementieren, dazu benötigt man den PlaybackListener in welchem man nach einem Stop-Event die Frameposition speichert und beim Resume den Player an genau dieser Stelle wieder startet. Lautstärkeregelung und das alles (Pitch, Balance...) funktioniert damit wohl auch nur recht schwer, so dass es meines Erachtens nach schon Sinn macht, sich seinen eigenen Player komplett über die Java eigene Sound-API zusammen zu frickeln, mit Controls und SourceDataLines.

    Ansonsten würde ich erst gar nicht versuchen, einen komplett neuen Player zu programmieren, solange man den alten erweitern kann. Das spart einem im Allgemeinen sehr viel Arbeit.
    Kaum macht man's richtig, geht's
    Wer seinen Gegner unterschätzt, ist erst entzückt und dann entsetzt. (Bugs Bunny)
    "Esst mehr Gemüse!" (Clive Owen/Smith - Shoot Em Up)

  9. Es bedanken sich:
    Darse (01.02.2016)
  10. #9
    User double Themenstarter

    Registriert seit
    08.01.2016
    Fachbeiträge
    97
    Genannt
    1 Post(s)
    Ja das warten beim JLayer ist sinnlos, im Hauptprogramm tue ich es auch nicht, ist hier nur ein Überbleibsel gewesen, da davor dort der Clip war. UNd das warten ansich ändert nichts am abspiel-Algo selbst.
    Zum Pause-Algo: Ja das wäre möglich, aber meine Lösung finde ich deutlich einfacher gelöst und mit sehr wenig AUfwand auch anwendbar.
    Zum lautstärke etc: Ja, das war sogar unmöglich bis ich die JavSoundAudioDevice zum Teil selbst neu geschrieben habe und in der Library ersetzt. Hat mich auch paar Tage gekostet. Nun kann ich dort die Lautstärke mit setLineGain() setzen.

    Und selbst den Player schreiben. Habe ich auch schon oft nachgedacht drüber, aber allein schon als ich gesehen habe wie kompliziert JLayer aufgebaut ist, damit man MP3-abspielen kann, hat mich das abgeschreckt, zumal ich von der Materie ansich noch wenig Ahnung habe.

    habe im Prinzip einfach die 2 Stellen, an denen der Player gestartet wird etwas verändert:
    Java Code:
    1.  try {
    2.                         player.play();
    3.                     } catch (JavaLayerException ex) {
    4.                         myLogger.log(ex);
    5.                         System.out.println("Trying Clip");
    6.                         tryClip();
    7.                     }
    Die exception fliegt, wenn man wav abspielen will. Danach wird der Clip gestartet und versucht das abzuspielen. Das möchte ich jedoch wieder rauslöschen, da ich das sehr unschön finde und mich auch einige Arbeit gekostet hat, da der Player und CLip jeweils anders zu handhaben sind und dadurch einige andere Stellen teils gravierende BUgs ausgelöst haben, die ich bis jetz noch nciht gelöst habe. Entferne ich das ganze wieder funktionierts wieder. Also das kann nciht die lösung sein.. Mal schauen, evtl mach ich den Player dann wirklich selbst

  11. #10
    Global Moderator Megabyte Avatar von Spacerat
    Registriert seit
    30.07.2013
    Fachbeiträge
    1.193
    Genannt
    129 Post(s)
    Blog-Einträge
    1
    Warum sollte man sich einen Player entwickeln, der wiederum von nicht hauseigenen Librarys abhängig ist?

    Schau dir das mal an:

    https://www.dropbox.com/s/4r62j797lg...layer.jar?dl=1

    Die Klasse AudioClip ist weitgehend dokumentiert bis auf die Umstände, warum ich da so ein Heck-Meck um die Lautstärke-Einstellungen mache, aber dieser Heck-Meck ist leider nötig, weil die interne SoundAPI Pegelwerte (in Dezibell) statt lineare (zwischen 0% und 100%) verlangt.

    Die Klasse Test verdeutlicht, wie weit sich der restliche Programieraufwand mit einem korrekt implementierten Player reduziert und die Klasse AudioPlayer liefert einen (denke ich) ausbaufähigen Player mit GUI.

    Getestet habe ich das Ganze schon mal erfolgreich mit MP3s (Vorrausgesetzt die entsprechenden JavaZoom-Pakete sind installiert) und WAVs.
    Geändert von Spacerat (01.02.2016 um 03:08 Uhr)
    Kaum macht man's richtig, geht's
    Wer seinen Gegner unterschätzt, ist erst entzückt und dann entsetzt. (Bugs Bunny)
    "Esst mehr Gemüse!" (Clive Owen/Smith - Shoot Em Up)

  12. Es bedanken sich:
    Darse (01.02.2016)
  13. #11
    User double Themenstarter

    Registriert seit
    08.01.2016
    Fachbeiträge
    97
    Genannt
    1 Post(s)
    Okay, alles klar, schaue ich mir morgen dann mal genauer an.
    Aber davor noch eine Frage:
    wieso gibt mir:
    Java Code:
    1.  
    2. import java.io.File;
    3. import java.io.IOException;
    4. import javax.sound.sampled.AudioFormat;
    5. import javax.sound.sampled.AudioInputStream;
    6. import javax.sound.sampled.AudioSystem;
    7. import javax.sound.sampled.UnsupportedAudioFileException;
    8.  
    9. public class NoJavazoom {
    10.  
    11.     public static void main(String[] args) {
    12.         try {
    13.             File f = new File("D:\\Musik\\Musik-Oberordner\\Favoriten\\SOFT CELL   TAINTED LOVE HQ official video mp4.mp3");
    14.             AudioInputStream old = AudioSystem.getAudioInputStream(f);
    15.             AudioInputStream ais = AudioSystem.getAudioInputStream(new AudioFormat(old.getFormat().getSampleRate(),
    16.                     16,
    17.                     2,
    18.                     true,
    19.                     false), old);
    20.             System.out.println(ais);
    21.             System.out.println(ais.getFormat().getSampleSizeInBits());
    22.             System.out.println(old);
    23.         } catch (UnsupportedAudioFileException | IOException ex) {
    24.             ex.printStackTrace();
    25.         }
    26.     }
    das hier aus:
    Java Code:
    1. javazoom.spi.mpeg.sampled.convert.DecodedMpegAudioInputStream@4c873330
    2. 16
    3. javax.sound.sampled.AudioInputStream@119d7047

    Wieso wird hier javazoom verwendet, obwohl ichs nicht angegeben habe ?

  14. #12
    Global Moderator Megabyte Avatar von Spacerat
    Registriert seit
    30.07.2013
    Fachbeiträge
    1.193
    Genannt
    129 Post(s)
    Blog-Einträge
    1
    Das ist schnell beantwortet. Das MP3-SPI wurde von den selben Leuten entwickelt, die auch JLayer entwickelt haben. Klar, dass die bei anderen Entwicklungen auch auf ihre Libs zurückgreifen, wenn dies erforderlich ist. Kannst dir ja mal die Mühe machen und dir den Quelltext zu Triton, JLayer und MP3SPI ansehen, dann siehst du die Zusammenhänge.
    Kaum macht man's richtig, geht's
    Wer seinen Gegner unterschätzt, ist erst entzückt und dann entsetzt. (Bugs Bunny)
    "Esst mehr Gemüse!" (Clive Owen/Smith - Shoot Em Up)

  15. #13
    User double Themenstarter

    Registriert seit
    08.01.2016
    Fachbeiträge
    97
    Genannt
    1 Post(s)
    Hab e mir den Player von dir mal in ner eigenen Testklasse ausprobiert und muss sagen, er funktioniert tadellos. Finds nur leicht umständlich das ich auf 0.0001f Genauigkeit meine Lautstärke angeben muss, da ansonsten nicht viel Unterschied zu hören ist^^ Aber das übernimmt später eh mein JSlider, also nur halb so wild. UNd deine pause() und resume() Methoden haben gebuggt, habe das mal gefixxt. Bei resume musst du auf position > 0 prüfen, nicht <0, da du in Pause ja die momentane Position setzt und die nie unter 0 ist^^
    Dazu musste ich den CLip sehr umständlich mit
    Java Code:
    1.  
    2.  AudioInputStream old = AudioSystem.getAudioInputStream(f2);
    3.             AudioFormat fmt = old.getFormat();
    4.             AudioClip clip = AudioClip.create(AudioSystem.getAudioInputStream(new AudioFormat(fmt.getSampleRate(), 16, fmt.getChannels(), fmt.getEncoding() == AudioFormat.Encoding.PCM_SIGNED, false), old));
    instanziieren, da er mir ansonsten dauernd BigEndian und 24+bit Formate geliefert hat, die er nicht abspielen kann. aber ansonsten perfekt.
    Habe mich zu dem Anlass entschlossen schwerer Herzens das Projekt aufzugeben und komplett neu zu machen, da es ansonsten zu verworren gewesen wäre, den alten Player zu ersetzen. Und zudem war es sehr unübersichtlich. Bin grad schon recht gut dabei, aber bis ich dazu komme, den Player zu nutzen, dauerts noch etwas^^
    Zumal ich grad schon an etwas sehr einfachem Hänge:
    Java Code:
    1.  private void addFiles(File[] audioFiles) {
    2.         if (audioFiles != null && audioFiles.length > 0) {
    3.  
    4.             List<Song> songs = new ArrayList<>();
    5.             for (File f : audioFiles) {
    6.                 try {
    7.                     songs.add(new Song(f));
    8.                 } catch (UnsupportedAudioFileException | IOException ex) {
    9.                     System.err.println("Fehler!");
    10.                 }
    11.             }
    12.             addFiles(songs);
    13.         }
    14.     }
    15.  
    16.     private void addFiles(List<Song> songs) {
    17.         songs.stream().forEach((song -> {
    18.             int anzahlSongs = songList.size();
    19.             if (anzahlSongs >= musikDateienTabelle.getRowCount()) {
    20.                 ((DefaultTableModel) getTableModel()).addRow(new Vector<>());
    21.             }
    22.             getTableModel().setValueAt(song.getTitle(), anzahlSongs, musikDateienTabelle.getColumn("Titel").getModelIndex());
    23.             getTableModel().setValueAt(Formatter.formatMillis(song.getDuration() / 1000), anzahlSongs, musikDateienTabelle.getColumn("Dauer").getModelIndex());
    24.             getTableModel().setValueAt(song.getInterpret(), anzahlSongs, musikDateienTabelle.getColumn("Interpret").getModelIndex());
    25.             getTableModel().setValueAt(song.getAlbum(), anzahlSongs, musikDateienTabelle.getColumn("Album").getModelIndex());
    26.             songList.add(song);
    27.         }));
    28.     }
    29.  
    30.     private void sort(SongComparator comparator) {
    31.         if (songList.size() > 0) {
    32.             songList.sort(comparator);
    33.             addFiles(songList);
    34.         }
    35.     }
    Über nen Filechooser bekommt erste Methode das Array und leitet an die 2. Weiter. die wiederum fügt meiner Tabelle (Eine langersehnte Verbesserung meines alten Players, die ich schon lange haben wollte) die Dateien hinzu. Das funktioniert auch wunderbar. Allerdings habe ich eine Combobox, die die Tabelle sortieren soll. Allerdings fliegt dabei, mit herkömmlicher foreach-Schleife oder Streams, immer ne Exception:
    Java Code:
    1. Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
    2.     at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1380)
    3.     at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    4.     at com.youtube.mrschesam.musikplayer.gui.Gui.addFiles(Gui.java:486)
    5.     at com.youtube.mrschesam.musikplayer.gui.Gui.sort(Gui.java:503)
    6.     at com.youtube.mrschesam.musikplayer.gui.Gui.sortOptionsActionPerformed(Gui.java:452)
    7.     at com.youtube.mrschesam.musikplayer.gui.Gui.access$500(Gui.java:56)
    8.     at com.youtube.mrschesam.musikplayer.gui.Gui$6.actionPerformed(Gui.java:179)
    9.     at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1258)
    10.     at javax.swing.JComboBox.setSelectedItem(JComboBox.java:586)
    11.     at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:622)
    12.     at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:852)
    13.     at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:290)
    14.     at java.awt.Component.processMouseEvent(Component.java:6535)
    15.     at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    16.     at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:501)
    17.     at java.awt.Component.processEvent(Component.java:6300)
    18.     at java.awt.Container.processEvent(Container.java:2236)
    19.     at java.awt.Component.dispatchEventImpl(Component.java:4891)
    20.     at java.awt.Container.dispatchEventImpl(Container.java:2294)
    21.     at java.awt.Component.dispatchEvent(Component.java:4713)
    22.     at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
    23.     at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
    24.     at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
    25.     at java.awt.Container.dispatchEventImpl(Container.java:2280)
    26.     at java.awt.Window.dispatchEventImpl(Window.java:2750)
    27.     at java.awt.Component.dispatchEvent(Component.java:4713)
    28.     at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    29.     at java.awt.EventQueue.access$500(EventQueue.java:97)
    30.     at java.awt.EventQueue$3.run(EventQueue.java:709)
    31.     at java.awt.EventQueue$3.run(EventQueue.java:703)
    32.     at java.security.AccessController.doPrivileged(Native Method)
    33.     at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    34.     at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    35.     at java.awt.EventQueue$4.run(EventQueue.java:731)
    36.     at java.awt.EventQueue$4.run(EventQueue.java:729)
    37.     at java.security.AccessController.doPrivileged(Native Method)
    38.     at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    39.     at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    40.     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    41.     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    42.     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    43.     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    44.     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    45.     at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
    Gui.486 ist dabei die Zeile songs.stream().forEach((song -> {, aber ich sehe da kein Problem, schließlich ist die Liste ja in Ordnung.

    Edit: Ich bin dumm.. Ich kann ja während ich an einer Liste rumiteriere keine Veränderung an dieser vornehmen... NAja Bin noch müde^^
    Geändert von Darse (01.02.2016 um 12:07 Uhr)

  16. #14
    Global Moderator Viertel Gigabyte Avatar von SlaterB
    Registriert seit
    06.08.2008
    Fachbeiträge
    2.695
    Genannt
    275 Post(s)
    so ein stattliches Posting zusammengeschraubt, Problem auf die richtige Codestelle zurückgeführt
    und zumindest Zusammenhang zur Liste von Songs hergestellt, aber da dann Ende des Gedankengangs?

    'Liste in Ordnung' wird sich letztlich als falsche Aussage erweisen, aber warum überhaupt so ein sicheres Gefühl dazu,
    einfach den Fakten folgen, von außen freilich dann unbeeinflusst doch leichter:

    es gibt eine ConcurrentModificationException, das sollte jede eigene Überzeugung erstmal zertrümmern, Neubewertung schadet nie,
    wenn nicht die Welt Kopf steht dann bedeutet das, dass in der Liste etwas verändert wurde,

    -> was ist das für eine Liste, wo kommt sie her, wer kennt sie noch und fügt was ein,
    nebenläufige Threads wie meist hier sicher keine Frage, höchstwahrscheinlich und einfach ist immer der Schleifencode der Methode selber anzuschauen,
    dort ja auch reichlich Verdächtige (getTableModel()).addRow() fügt irgendwas irgendwo ein, schließlich auch noch songList.add(song); )

    wo kommt denn der Parameter her, was ist das für eine Liste?
    der StackTrace zeigt dass vorher Methode sort() dranwar, kurzes Spiel:
    addFiles(songList);

    die Methode addFiles() wird also mit dem Instanzattribut songList ausgeführt,
    dort wird jeder Eintrag in DIESELBE Liste wieder einfügt,
    sei froh dass du die billige ConcurrentModificationException bekommst, sonst evt. Endlosschleife, immer neu hinein und neu hineinzufügen

    ---------

    wenn du schon ein Instanzattribut songList hast, dann ist es besser zu vermeiden, dieses als Attribut an eine andere Methode der eignen Klasse zu übergeben,
    addFiles() kann doch genauso mit songList arbeiten, machst du dort ja auch,

    dass du songList als zwei verschiedene Dinge benutzt ist ein Dilemma was du erstmal fachlich klären musst, was soll denn passieren?
    eine Liste kann doch nicht gleichzeitig neue (zu übertragene) Einträge wie auch alte (bereits übertragene) Einträge enthalten

    addFiles(File[]) erstellt dagegen seine eigene ArrayList, da mag es funktionieren, aber sort() ist bisher anders,
    was genau planst du?

    ----

    int anzahlSongs = songList.size();
    sieht auch etwas komisch aus, die Bedingung dazu ist ziemlich unabhängig davon, welchen Song du gerade aus der Parameter-Liste bearbeitest

    songList zu sortieren ohne das TableModel zu ändern kann auch böse enden,

    verzichte vielleicht lieber auf eine eigene songList, lasse allein das TableModel eine Liste der Songs verwalten,
    dazu bietet sich ein eigenes TableModel mit getValueAt()-Methode an,

    schau dir hier an
    JTable (Tutorial)© – Byte-Welt Wiki
    wie ein TableModel für Vehicel-Objekte erstellt wird,
    die Objekte können direkt genutzt werden, Liste (oder da veraltet Vector) vorgehalten, Sortierung in Model möglich,

    auch 'musikDateienTabelle.getColumn("Titel").getModelIndex()' usw. fällt weg
    Hansa wird Meister

  17. Es bedanken sich:
    Darse (01.02.2016)
  18. #15
    Global Moderator Megabyte Avatar von Spacerat
    Registriert seit
    30.07.2013
    Fachbeiträge
    1.193
    Genannt
    129 Post(s)
    Blog-Einträge
    1
    1. Ja, da hast du Recht... Ich habe diese Änderung mit "position = -1" (also invalidieren nach Start und Stop) erst nach den ganzen Tests vorgenommen. Resume darf natürlich erst dann vorgenommen werden, wenn position >= 0 ist.

    2. Ich nehme mal an, dass du innerhalb deiner fehlerhaften for-each-Schleife keine Dateien hinzufügen, sondern eher entfernen willst. In diesem Fall nutzt man kein for-each sondern einen Iterator und eine while-Schleife ("while(it.hasNext()) {..."). Wenn man dann während der Iteration über die Elemente ein element aus der Collection entfernen will geht das ganz simpel mit "it.remove()". Vergiss das wieder...
    Geändert von Spacerat (01.02.2016 um 12:40 Uhr)
    Kaum macht man's richtig, geht's
    Wer seinen Gegner unterschätzt, ist erst entzückt und dann entsetzt. (Bugs Bunny)
    "Esst mehr Gemüse!" (Clive Owen/Smith - Shoot Em Up)

  19. #16
    User double Themenstarter

    Registriert seit
    08.01.2016
    Fachbeiträge
    97
    Genannt
    1 Post(s)
    Hatte ja den Edit reingetan, aber anscheinend zu spät^^ Bin dann auch drauf gekommen, das da was gewaltig nicht stimmt und hab dafür dann eine Kopie der Liste in Sort erstellt und diese dann übergeben:
    Java Code:
    1.  private void sort(SongComparator comparator) {
    2.         if (songList.size() > 0) {
    3.             songList.sort(comparator);
    4.             List<Song> sortedList = new ArrayList<>(songList);
    5.             songList.clear();
    6.             anzahlSongs = 0;
    7.             addFiles(new ArrayList<>(sortedList));
    8.         }
    9.     }
    Aber die Idee, das ganz ohne die Liste zu machen, nur mit dem Table Model ist interessant, nur ich weiß nicht wie ich das anstellen soll. In der Tabelle werden ja in 4 Spalten nebeneinander 4 Attribute von meinem Song angezeigt (Momentan Dauer, Titel, Album und Interpret). Wie soll ich darauf meinen Song wiederbekommen? Am besten ohne die anderen, nicht angezeigten, Informationen zu verlieren? Mir fiel dazu nur eine Liste ein, die neben der Tabel alle Lieder speichert.
    Hab das ganze dann so stehen:
    Java Code:
    1. private void addFiles(File[] audioFiles) {
    2.         if (audioFiles != null && audioFiles.length > 0) {
    3.  
    4.             List<Song> songs = new ArrayList<>();
    5.             for (File f : audioFiles) {
    6.                 try {
    7.                     songs.add(new Song(f));
    8.                 } catch (UnsupportedAudioFileException | IOException ex) {
    9.                     ex.printStackTrace();
    10.                 }
    11.             }
    12.             addFiles(songs);
    13.         }
    14.     }
    15.  
    16.     private void addFiles(List<Song> songs) {
    17.         songs.stream().forEach((song -> {
    18.             int anzahlSongs = songList.size();
    19.             if (anzahlSongs >= musikDateienTabelle.getRowCount()) {
    20.                 ((DefaultTableModel) getTableModel()).addRow(new Vector<>());
    21.             }
    22.             getTableModel().setValueAt(song.getTitle(), anzahlSongs, musikDateienTabelle.getColumn("Titel").getModelIndex());
    23.             getTableModel().setValueAt(Formatter.formatMillis(song.getDuration() / 1000), anzahlSongs, musikDateienTabelle.getColumn("Dauer").getModelIndex());
    24.             getTableModel().setValueAt(song.getInterpret(), anzahlSongs, musikDateienTabelle.getColumn("Interpret").getModelIndex());
    25.             getTableModel().setValueAt(song.getAlbum(), anzahlSongs, musikDateienTabelle.getColumn("Album").getModelIndex());
    26.             songList.add(song);
    27.         }));
    28.     }
    29.  
    30.     private void sort(SongComparator comparator) {
    31.         if (songList.size() > 0) {
    32.             songList.sort(comparator);
    33.             List<Song> sortedList = new ArrayList<>(songList);
    34.             songList.clear();
    35.             addFiles(new ArrayList<>(sortedList));
    36.         }
    37.     }

    Wie soll ich das ganze dann ohne die Liste lösen?
    Edit: Habe den Link übersehen. Schaue mir den mal an.

  20. #17
    Global Moderator Viertel Gigabyte Avatar von SlaterB
    Registriert seit
    06.08.2008
    Fachbeiträge
    2.695
    Genannt
    275 Post(s)
    das Tablemodel dort ist schon alt und etwas unnötig detailliert zu Events + Listener, dies hier ginge auch, auch mit einer Methode sort(),

    agiert etwas grob mit fireTableDataChanged() bei jeder kleinen Änderung, aber daran sollte normalerweise nichts bemerkbar oder problematisch sein

    Vehicel vs. Vehicle ist auch noch ein starkes Stück im Wiki..
    Java Code:
    1. class VehicleModel   extends AbstractTableModel {
    2.     private String[] columnNames = new String[]  {"Name", "Fahrgäste", "Räder", "Besitzt Motor"};
    3.     private Class[] columnClasses = new Class[] {String.class, Integer.class, Integer.class, Boolean.class};
    4.     private List<Vehicle> vehicles = new ArrayList<>();
    5.  
    6.     public void addVehicle(Vehicle vehicle) {
    7.         this.vehicles.add(vehicle);
    8.         fireTableDataChanged();
    9.     }
    10.  
    11.     public void sort() {
    12.         Collections.sort(this.vehicles);
    13.         fireTableDataChanged();
    14.     }
    15.  
    16.     @Override
    17.     public int getColumnCount() {
    18.         return this.columnNames.length;
    19.     }
    20.  
    21.     @Override
    22.     public int getRowCount() {
    23.         return this.vehicles.size();
    24.     }
    25.  
    26.     @Override
    27.     public String getColumnName(int column) {
    28.         return this.columnNames[column];
    29.     }
    30.  
    31.     @Override
    32.     public Class getColumnClass(int column) {
    33.         return this.columnClasses[column];
    34.     }
    35.  
    36.     @Override
    37.     public Object getValueAt(int row, int column)    {
    38.         Vehicle v = this.vehicles.get(row);
    39.         switch (column) {
    40.             case 0:
    41.                 return v.getName();
    42.             case 1:
    43.                 return Integer.valueOf(v.getPlaces());
    44.             case 2:
    45.                 return Integer.valueOf(v.getWheels());
    46.             case 3:
    47.                 return v.hasMotor() ? Boolean.TRUE : Boolean.FALSE;
    48.             default:
    49.                 return null;
    50.         }
    51.     }
    52.  
    53.     @Override
    54.     public boolean isCellEditable(int row, int column)  {
    55.         return false;
    56.     }
    57.  
    58.     @Override
    59.     public void setValueAt(Object aValue, int row, int column)  {
    60.         // nicht beachten
    61.     }
    62. }

    wenn dort die Liste abgefragt, kann das die zentrale Speicherung sein,
    längerfristrig vielleicht Logikschicht von GUI zu trennen, aber zumindest in der GUI keine zweite große Liste zu verwalten
    Geändert von SlaterB (01.02.2016 um 13:41 Uhr)
    Hansa wird Meister

+ Antworten Thema als "gelöst" markieren

Direkt antworten Direkt antworten

Zu welchem Kontinent gehört Japan?

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Windows 8.1 Sound Manager
    Von groggy im Forum Software
    Antworten: 2
    Letzter Beitrag: 21.01.2015, 13:06
  2. Mehrere sound byte arrays mixen um sie über eine SourceDataLine auszugeben
    Von IDC im Forum Spiele- und Multimedia-Programmierung
    Antworten: 6
    Letzter Beitrag: 02.01.2015, 17:50
  3. Laggs durch Sound
    Von Bene im Forum Spiele- und Multimedia-Programmierung
    Antworten: 8
    Letzter Beitrag: 04.03.2014, 08:14
  4. Audio Datei abspielen
    Von programmierer12 im Forum Java-Grundlagen
    Antworten: 16
    Letzter Beitrag: 22.11.2013, 07:13
  5. Sounds effektiv abspielen
    Von IDC im Forum Spiele- und Multimedia-Programmierung
    Antworten: 10
    Letzter Beitrag: 30.09.2013, 23:29

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •