# AudioFile Playlist



## mcmanu (14. Jun 2011)

Hi Leutz,

Habe folgendes Problem, ich muss für die uni einen Mediaplayer Programmieren
es ist das Letzte testat. Drei tests laufen schon aber drei halt auch nicht.

Der test ButtonLayout,Buttons und testConstructor funktionieren nicht.
die fehlermeldung lautet:
java.lang.RuntimeException: java.lang.RuntimeException: Unknown suffix for AudioFile: "	"


Hier mein Quellcode:
[JAVA=42]package studiplayer.ui;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import studiplayer.audio.AudioFile;
import studiplayer.audio.NotPlayableException;
import studiplayer.audio.PlayList;



@SuppressWarnings("serial")
public class Player extends JFrame implements ActionListener {

    private PlayList playList = null;
    public  static String DEFAULT_PLAYLIST = "playlists/DefaultPlayList.m3u";
    private final String initTime = "00:00";
    private final String preTitle = "Current song: ";
    private JLabel songDescription = new JLabel();
    private JLabel playTime = new JLabel();
    private JButton bplay = new JButton(new ImageIcon("icons/play.png"));
    private JButton bpause = new JButton(new ImageIcon("icons/pause.png"));
    private JButton bstop = new JButton(new ImageIcon("icons/stop.png"));
    private volatile boolean stopped = true;
    private PlayListEditor playListEditor;
    private boolean editorVisible;


    public void setEnabled(boolean b) {
        if(b ==true){
            bplay.setEnabled(true);
            bpause.setEnabled(true);
            bstop.setEnabled(true);
        }
        if(b==false){
            bplay.setEnabled(false);
            bpause.setEnabled(false);
            bstop.setEnabled(false);
        }

    }


    public Player(PlayList pl) {


        playList = pl;


        playListEditor = new PlayListEditor(this, this.playList);
        editorVisible = false;


        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        setTitle("Studiplayer: empty play list");
        if (!playList.isEmpty()) {
            setTitle(preTitle + playList.getCurrentAudioFile().toString());
        }

        JPanel buttons = new JPanel();


        bplay.setActionCommand("AC_PLAY");
        bplay.addActionListener(this);
        buttons.add(bplay);


        bpause.setActionCommand("AC_PAUSE");
        bpause.addActionListener(this);
        buttons.add(bpause);


        bstop.setActionCommand("AC_STOP");
        bstop.addActionListener(this);
        buttons.add(bstop);

        JButton bnext = new JButton(new ImageIcon("icons/next.png"));
        bnext.setActionCommand("AC_NEXT");
        bnext.addActionListener(this);
        buttons.add(bnext);

        JButton bpl = new JButton(new ImageIcon("icons/pl_editor.png"));
        bpl.setActionCommand("AC_LIST");
        bpl.addActionListener(this);
        buttons.add(bpl);


        add(buttons, BorderLayout.CENTER);
        add(buttons, BorderLayout.CENTER);


        bnext.setEnabled(true);
        bpl.setEnabled(true);



            add(songDescription, BorderLayout.NORTH);
            add(playTime, BorderLayout.WEST);
        updateSongInfo(playList.getCurrentAudioFile());

        pack();
        setVisible(true);
    }


    public void actionPerformed(ActionEvent e) {
        AudioFile af;
        String cmd = e.getActionCommand();
        if(cmd.equals("AC_PLAY")){
            playCurrentSong();
            af = playList.getCurrentAudioFile();
            System.out.println("Playing"+af.toString());
            System.out.println("Filename is"+af.getFilename());
            System.out.println("Current index is" + playList.getCurrent());
        }else if(cmd.equals("AC_PAUSE")){
            stopCurrentSong();
            af = playList.getCurrentAudioFile();
            System.out.println("Playing"+af.toString());
            System.out.println("Filename is"+af.getFilename());
            System.out.println("Current index is" + playList.getCurrent());
        }else if(cmd.equals("AC_STOP")){
            stopCurrentSong();
            System.out.println("");
            af = playList.getCurrentAudioFile();
            System.out.println("Playing"+af.toString());
            System.out.println("Filename is"+af.getFilename());
            System.out.println("Current index is" + playList.getCurrent());


        }else if(cmd.equals("AC_NEXT")){
            af = playList.getCurrentAudioFile();
            System.out.println("Playing"+af.toString());
            System.out.println("Filename is"+af.getFilename());
            System.out.println("Current index is" + playList.getCurrent());
            System.out.println("Switching to next audio file");
            if(!stopped){
                stopCurrentSong();
            }
            playList.changeCurrent();
            playCurrentSong();
             af = playList.getCurrentAudioFile();
            if(af !=null){
                System.out.println("Switched to next audio file");
            }else{
                System.out.println("PlayList is empty");
            }
            System.out.println("");

        }else if(cmd.equals("AC_PL")){
            af = playList.getCurrentAudioFile();
            System.out.println("Playing"+af.toString());
            System.out.println("Filename is"+af.getFilename());
            System.out.println("Current index is" + playList.getCurrent());
        }else if(cmd.equals("AC_EDITOR"));
        if(editorVisible){
            editorVisible =false;
        }else{
            editorVisible=true;
        }
        playListEditor.setVisible(editorVisible);
        }



    private void updateSongInfo(AudioFile af) {

        if (af != null) {
            setTitle(preTitle + af.toString());
            songDescription.setText(af.toString());
            playTime.setText(initTime);
        } else {
            setTitle("Studiplayer: empty play list");
            songDescription.setText("no current song");
            playTime.setText("--:--");
        }
    }



    private void playCurrentSong() {

        updateSongInfo(playList.getCurrentAudioFile());

        System.out.println("Playing: "
                + playList.getCurrentAudioFile().toString());
        System.out.println("Filename: "
                + playList.getCurrentAudioFile().getFilename());
        System.out.println("Index: " + playList.getCurrent());
        System.out.println("");

        stopped = false;

        if (playList.getCurrentAudioFile() != null) {
            (new TimerThread()).start();
            (new PlayerThread()).start();
        }

    }


    private void stopCurrentSong() {

        System.out.println("Stopped: "
                + playList.getCurrentAudioFile().toString());
        System.out.println("Filename: "
                + playList.getCurrentAudioFile().getFilename());
        System.out.println("Index: " + playList.getCurrent());
        System.out.println("");

        stopped = true;
        playList.getCurrentAudioFile().stop();

        updateSongInfo(playList.getCurrentAudioFile());
    }


    private class TimerThread extends Thread {
        public void run() {
            while (!stopped && !playList.isEmpty()) {

                playTime.setText(playList.getCurrentAudioFile()
                        .getFormattedPosition());

                try {
                    sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    private class PlayerThread extends Thread {
        public void run() {
            while (!stopped && !playList.isEmpty()) {
                try {
                    playList.getCurrentAudioFile().play();
                } catch (NotPlayableException e) {
                    e.printStackTrace();
                }
                if (!stopped) {
                    playList.changeCurrent();
                    updateSongInfo(playList.getCurrentAudioFile());
                }
            }
        }
    }


    public static void main(String[] pathname) {

        PlayList pl = new PlayList();

        if (pathname.length == 1) {

            try {
                pl.loadFromM3U(pathname[0]);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            try {
                pl.loadFromM3U(DEFAULT_PLAYLIST);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        new Player(pl);
    }
}


[/code]

Könnt ihr mir helfen?

Der Test ist dieser hier:
[JAVA=42] public void testButtons() {
        // Now, start testing
        String eventSequence = "Aktionen: <start>";
        Player player = null;
        PlayList pl = new PlayList("playlists/playList2.m3u");
        player = new Player(pl);
        HashMap<String, JButton> buttonList = fillButtonList(player);
        JButton play = buttonList.get(PLAY);
        JButton pause = buttonList.get(PAUSE);
        JButton stop = buttonList.get(STOP);
        JButton next = buttonList.get(NEXT);

        assertTrue(eventSequence + " Play nicht aktiviert", play.isEnabled());
        assertFalse(eventSequence + " Pause aktiviert", pause.isEnabled());
        assertFalse(eventSequence + " Stop aktiviert", stop.isEnabled());
        assertTrue(eventSequence + " Next nicht aktiviert", next.isEnabled());

        // Press Start
        eventSequence += "<play1>";
        player.actionPerformed(new ActionEvent(player, 0, play
                .getActionCommand()));

        assertFalse(eventSequence + " Play aktiviert", play.isEnabled());
        assertTrue(eventSequence + " Pause nicht aktiviert", pause.isEnabled());
        assertTrue(eventSequence + " Stop nicht aktiviert", stop.isEnabled());
        assertTrue(eventSequence + " Next nicht aktiviert", next.isEnabled());

        // Press Pause
        mySleep(1000L);
        eventSequence += "<pause>";
        player.actionPerformed(new ActionEvent(player, 0, pause
                .getActionCommand()));

        assertFalse(eventSequence + " Play aktiviert", play.isEnabled());
        assertTrue(eventSequence + " Pause nicht aktiviert", pause.isEnabled());
        assertTrue(eventSequence + " Stop nicht aktiviert", stop.isEnabled());
        assertTrue(eventSequence + " Next nicht aktiviert", next.isEnabled());

        // Press play again (nothing should happen)
        mySleep(1000L);
        eventSequence += "<play2>";
        player.actionPerformed(new ActionEvent(player, 0, play
                .getActionCommand()));

        assertFalse(eventSequence + " Play aktiviert", play.isEnabled());
        assertTrue(eventSequence + " Pause nicht aktiviert", pause.isEnabled());
        assertTrue(eventSequence + " Stop nicht aktiviert", stop.isEnabled());
        assertTrue(eventSequence + " Next nicht aktiviert", next.isEnabled());

        // Press Stop
        mySleep(1000L);
        eventSequence += "<stop1>";
        player.actionPerformed(new ActionEvent(player, 0, stop
                .getActionCommand()));
        mySleep(1000L);

        assertTrue(eventSequence + " Play nicht aktiviert", play.isEnabled());
        assertFalse(eventSequence + " Pause aktiviert", pause.isEnabled());
        assertFalse(eventSequence + " Stop aktiviert", stop.isEnabled());
        assertTrue(eventSequence + " Next nicht aktiviert", next.isEnabled());

        // Here, we are stopped

        try {
            Field fieldPlayTime = clazz.getDeclaredField("playTime");
            fieldPlayTime.setAccessible(true);
            JLabel ptime = (JLabel) fieldPlayTime.get(player);
            assertEquals(eventSequence + " Stop setzt playTime nicht zurueck",
                    "00:00", ptime.getText());

            Field fieldPlaylist = clazz.getDeclaredField("playList");
            fieldPlaylist.setAccessible(true);
            pl = (PlayList) fieldPlaylist.get(player);
            AudioFile currentSong = pl.getCurrentAudioFile();
            assertNotNull(eventSequence + " currentSong nicht gesetzt",
                    currentSong);
            /* too fragile
            assertEquals(eventSequence + " currentSong falsch",
                    "Wellenmeister - " + "TANOM Part I: Awakening - "
                            + "TheAbsoluteNecessityOfMeaning - 05:55",
                    currentSong.toString());
            */        
        } catch (NoSuchFieldException e) {
            fail("Attribut existiert nicht " + e);
        } catch (IllegalAccessException e) {
            fail(e.toString());
        }

        // Press Next and start playing
        mySleep(1000L);
        eventSequence += "<next1>";
        player.actionPerformed(new ActionEvent(player, 0, next
                .getActionCommand()));

        // Press Play (nothing should happen)
        mySleep(1000L);
        eventSequence += "<play3>";
        player.actionPerformed(new ActionEvent(player, 0, play
                .getActionCommand()));

        // Next (this changes the song)
        mySleep(1000L);
        eventSequence += "<next2>";
        player.actionPerformed(new ActionEvent(player, 0, next
                .getActionCommand()));
        mySleep(1000L);
        try {
            Field fieldPlaylist = clazz.getDeclaredField("playList");
            fieldPlaylist.setAccessible(true);
            pl = (PlayList) fieldPlaylist.get(player);
            AudioFile currentSong = pl.getCurrentAudioFile();
            Field fieldPlayTime = clazz.getDeclaredField("playTime");
            fieldPlayTime.setAccessible(true);
            JLabel playTime = (JLabel) fieldPlayTime.get(player);
            assertNotNull(eventSequence + " currentSong nicht gesetzt",
                    currentSong);
            /* too fragile
            assertEquals(eventSequence + " currentSong falsch",
                    "wellenmeister - tranquility - 02:21",
                    currentSong.toString());
            */
            String pos1 = playTime.getText();
            mySleep(2000L);
            String pos2 = playTime.getText();
            // Press stop
            eventSequence += "<stop2>";
            player.actionPerformed(new ActionEvent(player, 0, stop
                    .getActionCommand()));
            mySleep(2000L);
            assertTrue(eventSequence + " Abspielzeit nicht aktualisiert",
                    pos1.compareTo(pos2) < 0);
        } catch (NoSuchFieldException e) {
            fail("Attribut existiert nicht " + e);
        } catch (IllegalAccessException e) {
            fail(e.toString());
        }
        studiplayer.basic.BasicPlayer.stop();
        player.dispose();

    }
 public void testButtonLayout() {
        Player player = null;
        PlayList pl = new PlayList("playlists/playList2.m3u");
        player = new Player(pl);

        HashMap<String, JButton> buttonList = fillButtonList(player);
        assertEquals("Anzahl Buttons falsch", 5, buttonList.size());
        String cmdString = "@";
        for (Map.Entry<String, JButton> entry : buttonList.entrySet()) {
            JButton button = entry.getValue();
            String cmd = button.getActionCommand();
            assertFalse("Kein Action Command gesetzt", "".equals(cmd));
            assertTrue("Zweimal gleiches Action Command",
                    cmdString.indexOf("@" + cmd + "@") < 0);
            cmdString += cmd + "@";
        }
        assertNotNull("Kein Button fuer Abspielen", buttonList.get(PLAY));
        assertNotNull("Kein Button fuer Pausieren", buttonList.get(PAUSE));
        assertNotNull("Kein Button fuer Anhalten", buttonList.get(STOP));
        assertNotNull("Kein Button fuer Ueberspringen", buttonList.get(NEXT));
        assertNotNull("Kein Button fuer PlayList-Editor",
                buttonList.get(EDITOR));
        assertNull("Fehlendes oder falsches Icon zu Button",
                buttonList.get(UNKNOWN));
        player.dispose();
    }
 public void testConstructor() {
        try {
            Player player = new Player(new PlayList());
            Field fieldPlayList = clazz.getDeclaredField("playList");
            fieldPlayList.setAccessible(true);
            PlayList pl1 = (PlayList) fieldPlayList.get(player);
            assertEquals("PlayList nicht-leer", 0, pl1.size());
            player.dispose();
        } catch (NoSuchFieldException e) {
            fail("Kein playList-Attribut");
        } catch (IllegalAccessException e) {
            fail(e.toString());
        }
        try {
            PlayList pl = new PlayList("playlists/playList2.m3u");
            Player player = new Player(pl);
            Field fieldPlayList = clazz.getDeclaredField("playList");
            fieldPlayList.setAccessible(true);
            PlayList pl2 = (PlayList) fieldPlayList.get(player);
            assertEquals("Anzahl Lieder in PlayList", 8, pl2.size());
            Field fieldPlayListEditor = clazz
                    .getDeclaredField("playListEditor");
            fieldPlayListEditor.setAccessible(true);
            PlayListEditor ple = (PlayListEditor) fieldPlayListEditor
                    .get(player);
            assertNotNull("PlayListEditor nicht erzeugt", ple);
            AudioFile currentSong = pl2.getCurrentAudioFile();
            assertNotNull("currentSong nicht gesetzt", currentSong);
            assertEquals("currentSong falsch", "Wellenmeister - "
                    + "TANOM Part I: Awakening - "
                    + "TheAbsoluteNecessityOfMeaning - 05:55",
                    currentSong.toString());
            Field fieldSongDescription = clazz
                    .getDeclaredField("songDescription");
            fieldSongDescription.setAccessible(true);
            JLabel songDescription = (JLabel) fieldSongDescription.get(player);
            assertEquals("songDescription falsch", currentSong.toString(),
                    songDescription.getText());
            // FABR: title only needs to contain the getTitle() string
            assertTrue("Titel falsch",
                    player.getTitle().indexOf(currentSong.toString()) > 0);
            player.dispose();
        } catch (NoSuchFieldException e) {
            fail("Kein playList-Attribut");
        } catch (IllegalAccessException e) {
            fail(e.toString());
        }
    }
[/code]


Ne ahnung woran das Liegen könnte?


----------



## L-ectron-X (14. Jun 2011)

Kannst du mal die ganze Fehlermeldung posten? Kommt da noch mehr?
Kannst du die Fehlermeldung nicht irgendwie in einen Zusammenhang mit PlayList bringen?


----------



## mcmanu (14. Jun 2011)

Ja da kommt leidwer noch mehr xDD

java.lang.RuntimeException: java.lang.RuntimeException: Unknown suffix for AudioFile: "	"
	at studiplayer.audio.PlayList.loadFromM3U(PlayList.java:110)
	at studiplayer.audio.PlayList.<init>(PlayList.java:21)
	at studiplayer.cert.PlayerTest.testButtonLayout(PlayerTest.java:123)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at junit.framework.TestCase.runTest(TestCase.java:164)
	at junit.framework.TestCase.runBare(TestCase.java:130)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:120)
	at junit.framework.TestSuite.runTest(TestSuite.java:230)
	at junit.framework.TestSuite.run(TestSuite.java:225)
	at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.RuntimeException: Unknown suffix for AudioFile: "	"
	at studiplayer.audio.AudioFileFactory.getInstance(AudioFileFactory.java:36)
	at studiplayer.audio.PlayList.loadFromM3U(PlayList.java:102)
	... 21 more


----------



## SlaterB (14. Jun 2011)

das Problem liegt doch offensichtlich in PlayList, aufgerufen mit
 PlayList pl = new PlayList("playlists/playList2.m3u");

poste doch den Code von PlayList?
vielleicht auch die Datei, falls die eingelesen und verarbeitet wird, 
oder schau dir selber an was dort Eintrag für Eintrag exakt passiert


----------



## mcmanu (14. Jun 2011)

Ja liegt daran ich versteh aber nicht woran es liegt.

Playlist
[JAVA=42]package studiplayer.audio;
import java.io.File;
import java.io.FileWriter;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Scanner;



@SuppressWarnings("serial")
public class PlayList extends LinkedList<AudioFile> {

    private int current;
    private boolean randomOrder=true;


    public PlayList() {
    }
    public PlayList(String pathname) {

        loadFromM3U(pathname);  //Hier zeig er mir den Fehler an

    }
    public int getCurrent() {
        return current;
    }

    public void setCurrent(int current) {
        this.current = current;

    }

    public AudioFile getCurrentAudioFile() {
        if (this.isEmpty())
            return null;
        else
            return this.get(current);

    }

    public void setRandomOrder(boolean randomOrder) {
        if (randomOrder==true){
        this.randomOrder=true;
        Collections.shuffle(this);
        }
        else
            this.randomOrder=false;


    }

    public void changeCurrent() {

        if (this.size() -1 <= current){
            if (randomOrder==true){
                Collections.shuffle(this);
                setCurrent(0);
            }
            else
                setCurrent(0);
        }
        else
            setCurrent(current+1);
        }

    public void saveAsM3U(String pathname) {

        FileWriter fw = null;

        try {
            fw = new FileWriter(pathname);

            for (int i = 0; i < this.size(); i++) {

                String sep = System.getProperty("line.separator");
                fw.write(this.get(i).getPathname() + sep);
            }

            fw.close();
        }

        catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

    public void loadFromM3U(String pathname) {

        this.clear();
        try {


        Scanner s = new Scanner(new File(pathname));

        while (s.hasNext()) {

            String line = s.nextLine();

        if ((line.charAt(0)!='#')) {
try{
        this.add(AudioFileFactory.getInstance(line));
} catch (NotPlayableException e) {
    e.printStackTrace();
        }
        }
        }
        s.close();
        } catch (Exception e) {
        throw new RuntimeException(e);
        }
    }

        public void sort(SortCriterion order){

                switch (order){
                case AUTHOR:
                        Collections.sort(this, new AuthorComparator());
                        break;
                case TITLE:
                        Collections.sort(this, new TitleComparator());
                        break;
                case ALBUM:
                        Collections.sort(this, new AlbumComparator());
                        break;
                case DURATION:
                        Collections.sort(this, new DurationComparator());
                        break;
                }
            }


    }
[/code]


----------



## SlaterB (14. Jun 2011)

ich hatte mein Posting ja editiert, hast du die letzte Zeile noch nicht gesehen, obwohl sie ja auch offensichtlich ist?
schau dir an was aus der Datei gelesen wird!, wenn da eine Zeile nur aus einem Leerzeichen besteht ist die restliche Folge doch ziemlich klar,

und der Inhalt der Datei ist doch offensichtlich unabhängig von allen geposteten Code, selbst wenn da eine save()-Methode darunter sein sollte, kann immer noch manuell geändert worden sein,
wenn die Daten schlecht sind kann kein Test, kein Code das immer korrigieren,
ändere die Datei oder versuche doch im Code mit trim(), Vergleich auf Leerstring und ähnliches da herum zu schiffen


----------



## mcmanu (14. Jun 2011)

Die dateien sind von der Uni Vorgegeben, sind mp3,wav und ogg files.
PlayList sollte eigentlich nicht geändert werden, und die hat Funktioniert in meinem Vorherigen Testat, deshalb versteh ich nicht ganz warum die tests nicht Funktionieren.


----------



## SlaterB (14. Jun 2011)

es geht nicht um die Musikdateien, sondern um die PlayList, offensichtlich eine Textdatei, die mit Scanner eingelesen wird:


```
String line = s.nextLine();
if ((line.charAt(0)!='#')) {
        this.add(AudioFileFactory.getInstance(line));
```
schau dir hier doch an wie jede line aussieht, System.out.println, 
eine davon wird " " sein, und da meckert dann AudioFileFactory zu recht

kann sein dass dieselbe PlayList auf anderen Computern funktioniert, 
allein Zeilenumbruch-Unterschiede zwischen Windows und anderen Betriebssystemen können schon Ärger machen


----------



## mcmanu (14. Jun 2011)

Achso des meintest du sorry ^^ 
Ja die stelle hab ich noch rumprobiert ^^ danke ich werd mich nochmal hinhocken und schauen ob ich die tests zum laufen bringe ^^ Danke ;-D


----------



## mcmanu (14. Jun 2011)

Nope ich komm ums verecken nicht drauf was da falsch sein könnte oder was fehlt


----------



## SlaterB (14. Jun 2011)

habe ich gesagt dass irgendwas mit dem Code falsch ist?


----------



## mcmanu (14. Jun 2011)

Nein ^^ trozdem komme ich nicht darauf woran es liegt, das mit dem system.out.println habe ich gemacht wird aber kein AudioFile mit " " ausgegeben  xD
Morgen hab ich ja wieder Praktikum in der uni dann weiss ich hoffentlich mehr ^^


----------



## SlaterB (14. Jun 2011)

zumindest könntest du anhand der Ausgabe der Zeilen herausfinden, welche Zeile denn die vor der Exception ist,
vielleicht fehlt die Dateiendung?
dein gesamtes Programm reduziert sich auf eine Zeile 
[c]AudioFileFactory.getInstance("xy was auch immer");[/c]
welche hoffentlich reproduzierbar nicht funktioniert,

wenn auch alles nichts hilft, dann bist du immer von 'drei Tests' auf eine Code-Zeile weiter gekommen, oder klappt auch das nicht?


----------



## mcmanu (14. Jun 2011)

Also meine AudioFileFactory sieht so aus:

[JAVA=42]package studiplayer.audio;
public class AudioFileFactory {

   public static AudioFile getInstance(String pathname) throws NotPlayableException{



       if(pathname.toLowerCase().endsWith(".ogg")) { 

           TaggedFile ogg =new TaggedFile(pathname);

           return ogg;

       }


    if(pathname.toLowerCase().endsWith(".wav")) { 

      WavFile Wav = new WavFile(pathname);

      return Wav;
       }



        if(pathname.toLowerCase().endsWith(".mp3")) { 

            TaggedFile mp3 = new TaggedFile(pathname);
            return mp3;
            }



    if(!pathname.contains(".mp3") && !pathname.contains(".ogg") && !pathname.contains(".wav"))
    {
    throw new RuntimeException("Unknown suffix for AudioFile: \""+ pathname + "\"");
    }

    return null;

   }
}

    [/code]

Darin steht ja auch die Fehlermeldung unknown suffix for Audiofile

es sind genau vier sachen die er mir anzeigt.
beim werfen der exception         throw new RuntimeException(e);
bei der Playlist                         loadFromM3U(pathname);  
beim playertest                        PlayList pl = new PlayList("playlists/playList2.m3u");
und bei der Audiofilefactory die zeile mit dem unknown suffix ...


----------



## SlaterB (14. Jun 2011)

wow, ich dachte bisher, AudioFactory wäre irgendeine Standard-API, 
dass das auch eine Methode von dir ist und du diese trotz der längeren Diskussion nicht gepostet hast überrascht mich einmal mehr, wie wenig Menschen doch mitdenken oder überhaupt denken können,
das muss mir erlaubt sein zu sagen,

dieser nun gepostete Code beweist außerdem ziemlich zweifelsfrei zusammen mit der Fehlermeldung, dass der Parameter Pathname ein Leerstring ist,
was du mit "wird aber kein AudioFile mit " " ausgegeben" meinst usw. ist umso unverständlicher, kann aber vielleicht mit einem häufigen Problem erklärt werden, dass die System.out und System.err-Ausgaben nicht in zeitlich korrekter Reihenfolge erscheinen,

ein naheliegender weiterer einfacher Schritt wäre, die Playlist-Datei hier als Anhang an ein Posting zur Verfügung zu stellen,
wenn nicht gerade vertraulich oder mit tausenden Einträgen dann sollte es eigentlich keine 5 sec dauern die Problemzeile zu finden?
ok, bisschen sehr überheblich, aber ausschließen mag ich langsam nichts mehr


----------



## mcmanu (15. Jun 2011)

Naja was heisst nicht nachdenken, die Audiofilefactory wirft ja nur die Exception.

Meine Playlist war Leer dachte vieleicht lag es daran naja leider nicht, die Tests zeigen mir immer noch den selben fehler an. Ich komme einfach nicht darauf -.-


----------



## SlaterB (15. Jun 2011)

> die Audiofilefactory wirft ja nur die Exception.

ein Programm kann man mit Debugger oder System.out.println() in jede einzelne Zeile zerlegen,
dazu die Textdatei anschauen, noch ein separater Schritt

-----

'ich komme nicht drauf, ich komme nicht drauf, ich komme nicht drauf'
das ist ja hier wie Rumpelstilzchen, man man man

gibt es in deiner Welt keine Möglichkeit, sprachlich auszudrücken, was du alles weißt, verstehst, machen kannst usw?

dir ist inzwischen klar geworden, dass die Reaktion des Programms mit dem Inhalt der Textdatei zusammenhängt?
immerhin,

weitere mögliche Schritte habe ich schon genannt, keine Gedanken, Kommentare oder sonstige Reaktionen dazu?

'Playlist-Datei hier anhängen'
-> sagt dir nix, bringt dir nix, Sonne scheint?

'jede Datei im Programm ausgeben'
-> hast du ja schon versucht, das an sich kann natürlich bei dir schiefgehen, dann kommst du zum ursprünglichen Problem nicht weiter,
aber kein Code posten, keine Ausgabe eines Durchlaufs posten, wieder nichts und nichts?

- wenn du auf irgendeine Weise daran glaubst, dass die Datei eine Leerzeile oder ähnlich schlimmes enthält,
dann die Datei korrigieren oder im Programm jede eingelesene Zeile analysieren und so bei schlechten Zeilen kein AudioFile erstellen?
alles undenkbare Dinge, obwohl auch schon genannt?

zu nichts auf der Welt hast du einen Gedanken, nur überall und immer wieder 'komme nicht drauf'?
du kannst mich schon schocken, das schaffen nicht viele


----------



## mcmanu (15. Jun 2011)

Anhang anzeigen PlayList.java Meine PlayList methode


----------



## SlaterB (15. Jun 2011)

das ist weder die Playlist-Textdatei auf der Festplatte mit der vermuteten Leerzeile,
noch ist das Code, der System.out.println()-Ausgaben oder sonstige Checks bei der Verarbeitung der Playlist der Festplatte enthält,
außerdem hattest du die Klasse schon komplett gepostet

hmm................., ist das hier Versteckte Kamera-Forum? (sorry)


----------



## mcmanu (15. Jun 2011)

ops hoppla sorry war nicht mit absicht.

Kann sie ned hochladen  ungültige datei 

In der Textdatei von Playlist2 steht:


################################################
# This playlist is used for attestation of VA10
#
audiofiles/wellenmeister_awakening.ogg
audiofiles/special.oGg
audiofiles/wellenmeister - tranquility.wav
audiofiles/Rock 812.mp3


audiofiles/wellenmeister_awakening.ogg
audiofiles/special.oGg
audiofiles/wellenmeister - tranquility.wav

#   
audiofiles/Rock 812.mp3


----------



## SlaterB (15. Jun 2011)

und ist daraus nun nicht ziemlich deutlich (in unter 5 sec) zu erkennen, dass zwischen
> audiofiles/Rock 812.mp3
und
> audiofiles/wellenmeister_awakening.ogg
mindestens eine Leerzeile kommt?

du kannst nicht erwarten dass der Scanner das einfach überspringt,
ergo wird mindestens eine line in der 
> String line = s.nextLine();
Schleife ziemlich leer sein,
wenn komplett dann würde 
> if ((line.charAt(0)!='#')) {
schon Fehler werfen, aber offensichtlich sind mindestens Leerzeichen oder Tabs enthalten
(wenn man bei deinem Posting auf Zitieren klickt und den Text markiert sieht man das auch)

die leere Zeile kommt jedenfalls in die Factory und diese wirft die Exception

wo bitte ist in diesem ganzen Vorgang etwas unklar?

-------

was man als nächstes dagegen tun kann ist noch eine andere Frage,
ich habe ja vereinzelt schon dazu geschrieben, ich hoffe dir ist zuzumuten dass trotz der Witzchen zwischendurch noch nachzulesen oder erstmal selber weiter nachzudenken, vielleicht auch über weiteren Einsatz des #-Zeichens in der Datei..


----------



## mcmanu (16. Jun 2011)

Ehm xD Dir ist schon klar das die Playlist vorgegeben ist und nicht verändert werden darf? ^^ daran liegt es nicht ^^


----------



## SlaterB (16. Jun 2011)

deswegen habe ich ja auch alternativ Veränderung der Datei angesprochen, 
Leerzeilen direkt entfernen oder mit # markieren genau wie es vorgesehen ist....


----------



## Mofi (16. Jun 2011)

mcmanu hat gesagt.:


> Ehm xD Dir ist schon klar das die Playlist vorgegeben ist und nicht verändert werden darf? ^^ daran liegt es nicht ^^



Ich versuchs mal möglichst harmlos zuschreiben...

Wenn du dir deine Playlist.txt anschaust, siehst du bestimmte Zeilen die in deinem Programm Exception auslösen werden. Den ersten Schritt und die Zeilen mit den '#' hast du ja erfolgreich schon rausgenommen als Fehlerquelle. Nun musst du einfach einen Schritt weitergehen und auch auf die leeren Zeilen überprüfen und nicht nur auf die Zeilen mit dem '#'.

Wenn du diese Leerzeilen in deinem Code abfängst brauchst du die Playlist.txt auch überhaupt nicht ändern.

Aber sobald in einer anderen Playlist-Datei wieder irgendwas abweicht hast du ein Problem... (nur mal so am Rande erwähnt)

Ich hoffe das hilft ein wenig


----------



## mcmanu (16. Jun 2011)

Du meinst also so?

################################################
# This playlist is used for attestation of VA10
#
audiofiles/wellenmeister_awakening.ogg
audiofiles/special.oGg
audiofiles/wellenmeister - tranquility.wav
audiofiles/Rock 812.mp3
audiofiles/wellenmeister_awakening.ogg
audiofiles/special.oGg
audiofiles/wellenmeister - tranquility.wav
audiofiles/Rock 812.mp3


----------



## SlaterB (16. Jun 2011)

unglaublich aber ja


----------



## mcmanu (16. Jun 2011)

Nope, dieselben Fehler, das ist ja der Grund warum ich es nicht verstehe.

Ich hab jetzt sogar bei der Audiofile factory die if anweisung mit toLowerCase ergänzt Die Tests gehen Trozdem nicht.


----------



## SlaterB (16. Jun 2011)

sämtliche bisherigen Ereignisse und insbesondere der Inhalt der bisherigen Playlist sprechen dafür,
du kannst jetzt noch beliebige andere Fehler eingebaut haben, z.B. änderst du die Datei im falschen Verzeichnis,
vielleicht ist ganz am Ende der Datei noch eine bisher unbemerkte Zeile mit Leerzeichen oder wer weiß was alles,

um wirklich eindeutige Ergebnisse zu bekommen hilft nur eine Ausgabe im Programm,
dann kannst du nämlich unabhängig vom Fehler vorher irgendwelche Dummynamen ändern und siehst an der Ausgabe, das garantiert die richtige Datei gewählt wird

ein Beispielprogramm mit deinen Klassen grob kopiert und unbestechlicher Ausgabe ist folgendes:

```
public class Test
{
    public static void main(String[] args)
    {
        new PlayList2("test.txt");
    }
}


class PlayList2
{

    public PlayList2(String pathname)
    {
        loadFromM3U(pathname);
    }

    public void loadFromM3U(String pathname)
    {
        try
        {
            Scanner s = new Scanner(new File(pathname));
            while (s.hasNext())
            {
                String line = s.nextLine();
                System.out.println("line: " + line);
                if ((line.charAt(0) != '#'))
                {
                    AudioFileFactory2.getInstance(line);
                }
            }
            s.close();
        }
        catch (Exception e)
        {
            System.out.println("Exception: " + e);
        }
    }
}


class AudioFileFactory2
{
    public static Object getInstance(String pathname)
    {
        if (pathname.toLowerCase().endsWith(".ogg"))
        {
            return null;
        }
        if (pathname.toLowerCase().endsWith(".wav"))
        {
            return null;
        }
        if (pathname.toLowerCase().endsWith(".mp3"))
        {
            return null;
        }

        if (!pathname.contains(".mp3") && !pathname.contains(".ogg") && !pathname.contains(".wav"))
        {
            throw new RuntimeException("Unknown suffix for AudioFile: \"" + pathname + "\"");
        }
        return null;
    }
}
```
dazu folgende Test-Datei:

```
################################################
# Diese Playlist enthält Urheberrechtsverletzungen
#
audiofiles/guttenberg.ogg
audiofiles/guttenberg.oGg
audiofiles/guttenberg.wav
audiofiles/Rock 812.mp3
 
audiofiles/wellenmeister_awakening.ogg
audiofiles/special.oGg
audiofiles/wellenmeister - tranquility.wav
audiofiles/Rock 812.mp3
```
ergibt bei mir die Ausgabe

```
line: ################################################
line: # Diese Playlist enthält Urheberrechtsverletzungen
line: #
line: audiofiles/guttenberg.ogg
line: audiofiles/guttenberg.oGg
line: audiofiles/guttenberg.wav
line: audiofiles/Rock 812.mp3
line:  
Exception: java.lang.RuntimeException: Unknown suffix for AudioFile: " "
```
wie von Anfang an komplett klar und zu erwarten,
entferne ich die Leerzeile und ändere zur Sicherheit noch irgendeinen Text,
erscheint der neue Text und die Playlist läuft komplett durch

mit diesem Programm kannst du deine Playlisten testen,
achte wirklich auf Änderungen um sicher zu sein dass du die richtige testest


----------



## mcmanu (19. Jun 2011)

Es lag wirklich nur an der Playlist und an einer stelle hate ich etwas vergessen.
nun zeigt er mir noch ein fehler beim TestSorting an wenn ich das Gesamt package teste, einzeln Funktioniert der test was schon sehr seltsam ist, liegt wohl am OS. 
Danke dir für deine Geduld ^^


----------



## mcmanu (20. Jun 2011)

Hab meinen Player nun endlich Fertig, danke dir für die Hilfe ^^
Wollt noch fragen ob es möglich ist den Player als exe oder als ausführendes Programm zu speichern?
das ich nicht immer über Eclipse den Player starten muss


----------



## SlaterB (20. Jun 2011)

kann ich persönlich nicht sagen, läßt sich glaube ich gut suchen, sonst besser neues Thema


----------



## mcmanu (20. Jun 2011)

Okay ^^ danke


----------

