Zum Inhalt springen

Schnellen, besseren Timer?


Empfohlene Beiträge

Geschrieben

Hallo zusammen,

ich hab mal wieder zugeschlagen, und einen Java-YM Player geschrieben.

Dieser Player "sollte" einen cycle(); (void) eigentlich 100.000 x pro Sekunde ausführen aber das bekomme ich leider nicht hin.

Kann mir jemand sagen, wie man soetwas bewerkstelligen kann, ohne die CPU Last unnötig hoch zu setzen?

Ich verwende momentan eine etwas Unschöne javax.swing.timer Methode mit einer nicht so netten For- Schleife:

Sieht so aus:

    ActionListener updateCycle = new ActionListener() {


        public void actionPerformed(ActionEvent e) {

            cycle();

        }

    };

    Timer cycleUpdate = new Timer(10, updateCycle);

    public void cycle() {

        java.awt.EventQueue.invokeLater(new Runnable() {


            public void run() {

                for (int i = 0; i < CYCLES_PER_SECOND / 50; i++) {

                    if ((audioCount += audioAdd) >= AUDIO_TEST) {

                        try {

                            psg.writeAudio();


                            audioCount -= AUDIO_TEST;

                        } catch (Exception e) {

                            e.printStackTrace();

                        }

                    }

                }

                vSync();

            }

        });

    }

Achja: CYCLES_PER_SECOND = 1000000

Das void vSync sollte 50x pro Sekunde aufgerufen werden, muss aber synchron zum Cycle laufen.

Diese Methode ist wirklich nicht die netteste, aber funktioniert soweit.

Test: Blue Angel 69 for Amstrad CPC

Vielleicht kann mir jemand eine "Elegantere" Lösung geben?

MfG

Markus

Geschrieben (bearbeitet)
Verstehe ich das im allgm. so, dass Du annähernd Echtzeitfähigkeit brauchst?

Dann wäre das wohl eher etwas The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 1

Java an sich, ist nicht dafür ausgelegt in Echtzeit zu arbeiten, die Threadfunktionalität ist leider nicht deterministisch voraussagbar

Es wäre mir schon damit geholfen, einen Pseudo-Code zu haben, welcher aber nicht so Systemlastig ist.

Ich habe es schon mit verschiedenen Threads versucht, aber immer wieder stockt der Player.

(Sieht man an den Indeterminate'd ProgressBars und am "Scope" Display besonders)

Hier mal der komplette Code AYControl:

/*

 * To change this template, choose Tools | Templates

 * and open the template in the editor.

 */

package Player.core;


import Player.core.device.sound.*;

import javax.swing.Timer;

import java.awt.event.*;

import java.io.*;

import net.sourceforge.lhadecompressor.*;

import java.net.URL;

import java.util.zip.*;

import java.util.Iterator;


/**

 *

 * @author Markus

 */

public class AYControl {


    protected AY_3_8910 psg = new AY_3_8910();

    protected final int[] PSG_VALUES = new int[]{

        psg.BC2_MASK,

        psg.BC2_MASK | psg.BC1_MASK,

        psg.BC2_MASK | psg.BDIR_MASK,

        psg.BC2_MASK | psg.BDIR_MASK | psg.BC1_MASK

    };

    protected static final int CYCLES_PER_SECOND = 1000000;

    protected static final int CYCLES_PER_SECOND_ST = 2000000;

    protected static final int AUDIO_TEST = 0x40000000;

    protected int audioAdd = psg.getSoundPlayer().getClockAdder(AUDIO_TEST, CYCLES_PER_SECOND);

    protected int audioCount = 0;

    ActionListener updateCycle = new ActionListener() {


        public void actionPerformed(ActionEvent e) {

            cycle();

        }

    };

    Timer cycleUpdate = new Timer(10, updateCycle);



    public void startScreener(){

        if (screener == null) {

            screener = new Thread() {


                public void run() {

                    Timer screenUpdate = new Timer(50, updateScreen);

                    screenUpdate.start();

                }

                ActionListener updateScreen = new ActionListener() {


                    public void actionPerformed(ActionEvent e) {

                        screenUpdate();

                    }

                };


                public void screenUpdate() {

                    java.awt.EventQueue.invokeLater(new Runnable() {


                        public void run() {

                            if (JavaSound.painted) {

                                JavaSound.painted = false;

                                JavaSound.vu(JavaSound.vum);

                            }

                        }

                    });

                }

            };

            screener.setPriority(Thread.MAX_PRIORITY);

            screener.start();

        }

    }

    public void cycle() {

        java.awt.EventQueue.invokeLater(new Runnable() {


            public void run() {

                for (int i = 0; i < CYCLES_PER_SECOND / 50; i++) {

                    if ((audioCount += audioAdd) >= AUDIO_TEST) {

                        try {

                            psg.writeAudio();


                            audioCount -= AUDIO_TEST;

                        } catch (Exception e) {

                            e.printStackTrace();

                        }

                    }

                }

                vSync();

            }

        });

    }


    Thread screener;


    public void play() {

        psg.setClockSpeed(CYCLES_PER_SECOND);

        psg.reset();

        psg.getSoundPlayer().play();

    }

    public boolean YM_Play;


    public void vSync() {

        if (!YMPlayer.p1.isShowing()) {

            try {

                System.exit(0);

            } catch (Exception e) {

            }

        }

        if (YM_Play) {

            playYM();

        }


    }


    public void start() {

        YMPlayer.p1.setIndeterminate(true);

        YMPlayer.p2.setIndeterminate(true);

        YM_Play = true;

        cycleUpdate.start();

    }


    public void stop() {

        YMPlayer.p1.setIndeterminate(false);

        YMPlayer.p2.setIndeterminate(false);

        YMPlayer.p1.setValue(0);

        YMPlayer.p2.setValue(YMPlayer.p2.getMaximum());

        YM_Seconds = 0;

        YM_Minutes = 0;

        JavaSound.clear();

        ymcount = 0;

        YM_Play = false;

        cycleUpdate.stop();

        YMPlayer.stat.setText("Stopped...");

    }


    public void pause() {

        YMPlayer.p1.setIndeterminate(false);

        YMPlayer.p2.setIndeterminate(false);

        YM_Play = false;

        cycleUpdate.stop();

        YMPlayer.stat.setText("Paused at " + YM_Minutes + ":" + YM_Seconds);

    }

    int vcount = 0;

    int YM_Seconds = 0;

    int YM_Minutes = 0;

    int ymcount = 0;

    int YM_RecCount = 0;

    int YM_registers = 14;

    int YM_size;


    public void Slide(int pos){

        ymcount = pos * 50 * YM_registers;

    }

    public int mountcheck = 0;

    public void playYM() {


        mountcheck++;

        if (mountcheck > 50){

            mountcheck = 0;

            YMPlayer.playlist.setSelectedIndex(YMPlayer.index);

        }

        //int vcount, YM_Minutes, YM_Seconds, msecs

        vcount++;

        YM_size = (YM_RecCount / 50) / YM_registers;

        YMPlayer.ympos.setMaximum(YM_size);

        int lsec = 0, lmin = 0, lpos = 0;

        for (int i = 0; i < YM_size; i++) {

            lpos++;

            lsec++;

            if (lpos == 60) {

                lpos = 0;

                lmin++;

                lsec = 0;

            }

        }


        String llmin = "";

        String llsec = "";

        if (lsec < 10) {

            llsec = "0";

        }

        if (lmin < 10) {

            llmin = "0";

        }


        String length = "["+llmin + lmin + ":" + llsec + lsec+"]";

        YM_size = (ymcount / 50) / YM_registers;

        lsec = 0; lmin = 0; lpos = 0;

        for (int i = 0; i < YM_size; i++) {

            lpos++;

            lsec++;

            if (lpos == 60) {

                lpos = 0;

                lmin++;

                lsec = 0;

            }

        }


        llmin = "";

        llsec = "";

        if (lsec < 10) {

            llsec = "0";

        }

        if (lmin < 10) {

            llmin = "0";

        }


        String posi = "["+llmin + lmin + ":" + llsec + lsec+"]";

        YMPlayer.p1.setValue(ymcount);

        YMPlayer.p2.setValue(YM_RecCount - ymcount);

        YMPlayer.ympos.setValue((ymcount / 50) / YM_registers);

        if (vcount == 50) {

            vcount = 0;

            YMPlayer.stat.setText(length + posi);

        }

        String minutes = "" + YM_Minutes;

        if (YM_Minutes <= 9) {

            minutes = "0" + minutes;

        }

        String seconds = "" + YM_Seconds;

        if (YM_Seconds <= 9) {

            seconds = "0" + seconds;

        }

        String milliseconds = "" + (vcount * 2);

        if (vcount <= 4) {

            milliseconds = "0" + milliseconds;

        }


        if (YM_RecCount >= 1) {

            for (int i = 0; i < YM_registers; i++) {

                if (i == 13) {

                    if (YM_Data[ymcount] != 0x0ff) {

                        psg.setRegister(i, YM_Data[ymcount]);

                    }

                } else {

                    psg.setRegister(i, YM_Data[ymcount]);

                }

                ymcount++;


            }

            if (ymcount >= YM_RecCount) {

                YM_Minutes = 0;

                YM_Seconds = 0;

                ymcount = 0;

                if (webapplet.names != null && webapplet.names.length > 1) {

                    YMPlayer.index++;

                    if (YMPlayer.index >= webapplet.names.length) {

                        YMPlayer.index = 0;

                    }

                    if (YMPlayer.index < webapplet.names.length) {

                        String lo = webapplet.names[YMPlayer.index];

                        loadYM(lo);

                    }

                }

            }

        } else {

            YM_Play = false;

            YMPlayer.info.append("Sorry, no playback-data in buffer\r\n");

        }

    }

    String YMtitle = "";

    String YMauthor = "";

    String YMcreator = "";

    boolean shouldcount = false;

    int begincount = 0;

    boolean YM_Interleaved = false;

    boolean oldYM = false;

    int YM_vbl = 0;

    public static String url = "";


    public void loadYM(final String loadname) {

        java.awt.EventQueue.invokeLater(new Runnable() {


            public void run() {

                ymdata = null;

                System.gc();

                ymdata = new int[400000];

                InputStream result = null;

                File file = null;

                try {

                    result = new URL(url + loadname).openStream();

                } catch (Exception e) {

//            e.printStackTrace();

                    try {

                        file = new File(loadname);

                        result = new FileInputStream(file);

                    } catch (Exception re) {

                        return;

                    }

                }

                if (loadname.toLowerCase().endsWith(".zip")) {

                    try {

                        YMPlayer.info.append("Opening compressed file...\r\n");

                        ZipInputStream str = new ZipInputStream(result);

                        str.getNextEntry();

                        result = str;

                    } catch (Exception e) {

                        e.printStackTrace();

                    }

                }

                try {

                    int count = 0;

                    final BufferedInputStream bos = new BufferedInputStream(result);

                    while (bos.available() != 0) {

                        try {

                            ymdata[count++] = bos.read();

                        } catch (Exception t) {

                            YMPlayer.info.append("Error: File too large / bad format.\r\n");

                            stop();

                            return;

                        }

                    }

                    bos.close();

                    result.close();

                    int[] check = new int[count];

                    System.arraycopy(ymdata, 0, check, 0, check.length);

                    ymdata = new int[count];

                    System.arraycopy(check, 0, ymdata, 0, check.length);

                    if (ymdata[2] == 0x2d) {

                        YMPlayer.info.append("LHA5 crunched file.\r\n");

                        ymdata = unLHA(loadname, ymdata);

                    }

                    loadYM(loadname, 1);


                } catch (final Exception iox) {

                    iox.printStackTrace();

                }


            }

        });

    }

    protected int[] ymdata;

    int checktimer = 0;


    public void loadYM(final String loadnames, int check) {

        System.out.println("Datastream has " + ymdata.length + " bytes");

        YM_Data = new int[ymdata.length];

        YM_DataInterleaved = new int[ymdata.length];

        YM_Minutes = 0;

        YM_Seconds = 0;

        ymcount = 0;

        YMtitle = "";

        YMauthor = "";

        YMcreator = "";

        shouldcount = false;

        begincount = 0;

        YM_RecCount = 0;

        int value0 = 0;

        int value1 = 0;

        int value2 = 0;

        int value3 = 0;

        boolean atari_st_mode = false;

        int YM_length = 0;

        YM_Interleaved = false;

        int ym_read_byte = 0;

        try {

            int len = ymdata.length;

            int ym_filepos = 0;

            while (ym_filepos < len) {

                ym_read_byte = ymdata[ym_filepos];

                if (ym_filepos == 2) {

                    if (ym_read_byte == 0x035 || ym_read_byte == 0x036 || ym_read_byte == 0x033 || ym_read_byte == 0x032) {

                        if (ym_read_byte == 0x033 || ym_read_byte == 0x032) {

                            YM_registers = 14;

                            YM_Interleaved = true;

                            oldYM = true;

                            atari_st_mode = true;

                            if (ym_read_byte == 0x032) {

                                YMPlayer.info.append("opening YM2! file...\r\n");

                            } else {

                                YMPlayer.info.append("opening YM3! file...\r\n");

                            }

                        }

                        if (ym_read_byte == 0x035) {

                            YM_registers = 16;

                            oldYM = false;

                            YMPlayer.info.append("opening YM5! file...\r\n");

                        }

                        if (ym_read_byte == 0x036) {

                            YM_registers = 16;

                            oldYM = false;

                            YMPlayer.info.append("opening YM6! file...\r\n");

                        }

                    } else {

                        YMPlayer.info.append("Wrong format... Cannot playback!\r\n");

                        YM_Interleaved = false;

                        YM_RecCount = 0;

                        stop();

                        return;

                    }

                }

                if (ym_filepos == 12) {

                    value0 = ym_read_byte;

                }

                if (ym_filepos == 13) {

                    value1 = ym_read_byte;

                }

                if (ym_filepos == 14) {

                    value2 = ym_read_byte;

                }

                if (ym_filepos == 15) {

                    value3 = ym_read_byte;

                }

                if (!oldYM && (ym_filepos == 19 && (ym_read_byte & 1) == 1)) {

                    YMPlayer.info.append("Found an interleaved file of " + YM_registers + " registers.\r\n");

                    YM_Interleaved = true;

                }

                if (ym_filepos == 25) {

                    if (ym_read_byte == 0x080) {

                        atari_st_mode = true;

                    }

                    if (ym_read_byte == 0x058) {

                    }

                }


                if (!oldYM && ym_filepos >= 34 && !shouldcount) {

                    if (begincount > 2) {

                        shouldcount = true;

                    }


                    if (ym_read_byte == 0 && begincount < 4) {

                        begincount++;

                    }

                    if (begincount == 0) {

                        if (ym_read_byte != 0) {

                            char c = (char) ym_read_byte;

                            YMtitle += c;

                        }

                    }

                    if (begincount == 1) {

                        if (ym_read_byte != 0) {

                            char c = (char) (ym_read_byte);

                            YMauthor += c;

                        }

                    }

                    if (begincount == 2) {

                        if (ym_read_byte != 0) {

                            char c = (char) (ym_read_byte);

                            YMcreator += c;

                        }

                    }

                }


                if (oldYM && ym_filepos >= 4 && !shouldcount) {

                    YMtitle = "none";

                    YMauthor = "none";

                    YMcreator = "none";

                    shouldcount = true;

                }


                YMPlayer.p1.setString(YMtitle);

                YMPlayer.p2.setString(YMauthor);

                if (shouldcount) {

                    if (!YM_Interleaved) {

                        YM_Data[YM_RecCount] = ymdata[ym_filepos];

                        YM_RecCount++;

                    } else {

                        YM_DataInterleaved[YM_RecCount] = ymdata[ym_filepos];

                        YM_RecCount++;

                    }

                }

                ym_filepos++;

            }


            if (!oldYM) {

                YM_length = (value0 * 256) + (value1 * 256) + (value2 * 256) + (value3);


                System.out.println("YM_RecCount " + YM_RecCount);

                System.out.println("YM_length " + YM_length);

                if (YM_RecCount < YM_length) {

                    System.out.println("Something went wrong.");

                    checktimer++;

                    System.out.println("Retrying " + checktimer + " times");

                    if (checktimer < 5) {

                        loadYM(loadnames);

                    } else {

                        checktimer = 0;

                    }

                    return;

                }

                checktimer = 0;

                YM_registers = (YM_RecCount / YM_length);

                if (YM_registers > 16) {

                    YM_registers = 16;

                }

                YM_vbl = YM_length;

            } else {

                YM_vbl = YM_RecCount / YM_registers;

            }



            ymcount = 0;

            if (YM_Interleaved && !oldYM) {

                int counted = 0;

                for (int jk = 0; jk < YM_registers; jk++) {

                    for (int ik = 0; ik < YM_length; ik++) {

                        YM_Data[jk + ik * YM_registers] = YM_DataInterleaved[counted];

                        counted++;

                    }

                }

            } else if (YM_Interleaved) {

                int counted = 0;

                for (int jk = 0; jk < YM_registers; jk++) {

                    for (int ik = 0; ik < YM_RecCount / YM_registers; ik++) {

                        YM_Data[(ik * YM_registers) + jk] = YM_DataInterleaved[counted];

                        counted++;

                    }

                }

            }

            if (atari_st_mode) {

                YMPlayer.info.append("Atari ST tune found.\r\n");

                psg.changeClockSpeed(CYCLES_PER_SECOND_ST);

            } else {

                YMPlayer.info.append("Amstrad CPC tune found.\r\n");

                psg.changeClockSpeed(CYCLES_PER_SECOND);

            }

            YMPlayer.p2.setMaximum(YM_RecCount);

            YMPlayer.p1.setMaximum(YM_RecCount);

            stop();

            start();

                YMPlayer.info.append("Registers: " + (YM_registers) + "\r\n");

        } catch (final Exception iox) {

            YMPlayer.info.append("can't read file !!!\r\n");

        }

        YMPlayer.info.select(2000000, 2000000);

        YMPlayer.vol.setValue(YMPlayer.gainvol);

    }

    public int[] YM_Data = null;

    public int[] YM_DataInterleaved = null;

    LhaFile lhafile = null;


    protected final int[] unLHA(String name, int[] inpu) {

        int[] d = null;

        try {

            int BUFFSER_SIZE = 1024;

//            YMPlayer.info.append("Opening \"" + name + "\"...\r\n");

            try {

                lhafile = new LhaFile(name);

            } catch (Exception e) {

                YMPlayer.info.append("Bad LHA format:" + e.getMessage() + "\r\n");

            }

            Iterator iter = lhafile.entryIterator();

            while (iter.hasNext()) {

                LhaEntry entry = (LhaEntry) iter.next();

                File dst = entry.getFile();

//                YMPlayer.info.append("EXTRACT FILE        = " + entry.getFile() + "\r\n");

//                YMPlayer.info.append("    METHOD          = " + entry.getMethod() + "\r\n");

//                YMPlayer.info.append("    COMPRESSED SIZE = " + entry.getCompressedSize() + "\r\n");

//                YMPlayer.info.append("    ORIGINAL SIZE   = " + entry.getOriginalSize() + "\r\n");

//                YMPlayer.info.append("    TIME STAMP      = " + entry.getTimeStamp()+"\r\n");


                if (entry.getMethod().equals(LhaEntry.METHOD_SIG_LHD)) {

                    dst.mkdirs();

                } else {

                    File parent = dst.getParentFile();

                    if (parent != null) {

                        parent.mkdirs();

                    }


                    InputStream in = new BufferedInputStream(lhafile.getInputStream(entry),

                            BUFFSER_SIZE);


                    d = new int[800000];

                    int po = 0;

                    while (in.available() != 0) {

                        d[po++] = in.read();

                    }

                    int[] checkf = new int[po];

                    System.arraycopy(d, 0, checkf, 0, checkf.length);

                    d = new int[po];

                    System.arraycopy(checkf, 0, d, 0, checkf.length);

                }

            }


            lhafile.close();

        } catch (Exception e) {

            return inpu;

        }

//        System.out.println("d is " + d.length + " bytes.");

        return d;

    }

}

Übrigens ein Bug hier, welchen ich auch nicht weiss, wie zu beheben:

Im Void LoadYM(String name):

Wenn man den Player als Applet nutzt, lädt er etwas grössere Dateien nicht komplett. Das Resultierende byte[] (In diesem Fall int[]) ist zu klein.

Kann mir hier jemand helfen?

Bearbeitet von Devilmarkus
Geschrieben
Es wäre mir schon damit geholfen, einen Pseudo-Code zu haben, welcher aber nicht so Systemlastig ist.

Mach ein Profiling Deiner Anwendung. Es gibt nicht _den_ Pseudocode, der Dein Problem erschlägt, sondern das Problem kann im Zusammenspiel von mehreren Dingen sein.

Ich habe es schon mit verschiedenen Threads versucht, aber immer wieder stockt der Player.

Wie schon gesagt, das Threadverhalten der VM ist nicht determinisitisch. siehe auch Real time Java - Wikipedia, the free encyclopedia

Das Verhalten der Anwendung passt zu dem genannten Problem, ein Profiling kann Dir Schwachstellen liefern, benötigst Du aber Echtzeit, dann musst Du eben Echtzeitsystematik implementieren

Geschrieben (bearbeitet)

Kann mir denn jemand sagen, was ich im void LoadYM(final String loadname)... falsch mache?

Wie gesagt, als Applet lädt er leider nicht immer das komplette File.

Das int[] ist dann zu klein.

Der Buffer allerdings (= new int[xxxxxx]) ist ausreichend gross angelegt.

Der Fehler scheint hier zu liegen:

                try {

                    int count = 0;

                    final BufferedInputStream bos = new BufferedInputStream(result);

                    while (bos.available() != 0) {

                        try {

                            ymdata[count++] = bos.read();

                        } catch (Exception t) {

                            YMPlayer.info.append("Error: File too large / bad format.\r\n");

                            stop();

                            return;

                        }

                    }

                    bos.close();

                    result.close();

                    int[] check = new int[count];

                    System.arraycopy(ymdata, 0, check, 0, check.length);

                    ymdata = new int[count];

                    System.arraycopy(check, 0, ymdata, 0, check.length);

                    if (ymdata[2] == 0x2d) {

                        YMPlayer.info.append("LHA5 crunched file.\r\n");

                        ymdata = unLHA(loadname, ymdata);

                    }

                    loadYM(loadname, 1);


                } catch (final Exception iox) {

                    iox.printStackTrace();

                }

Bearbeitet von Devilmarkus
Geschrieben
Das Problem könnte am Pfad liegen. Welchen Wert hat denn loadname?

Ich habe ein paar Dinge in die Konsole schreiben lassen:

Using 8 bit unsigned sound

Initialized

AY chip active!

resync: start=0

resync: start=2205

Parameter read: FILE with value:CAMERTO.YM

Opening CAMERTO.YM

WebURL is: http://cpc-live.com/ymtest/CAMERTO.YM

Loadname is: CAMERTO.YM

Found filesize is 381038 bytes.

Available filelength:381038

Datastream has 381038 bytes

YM_RecCount 380932

YM_length 23808

Aber irgendwie funktioniert das nur bei mir korrekt.

Der Link zum Applet ist http://cpc-live.com/ymtest und ich wette, bei ca. 60-70% aller Leute, die den Link testen, steht ein unterschiedlicher Wert in der "filesize".

Hier meine Aktuelle Routine, wie ich die Datei lese:


    public void loadYM(final String loadname) {

        if (loadname == null) {

            return;

        }

        java.awt.EventQueue.invokeLater(new Runnable() {


            public void run() {

                System.out.println("Opening " + loadname);

                System.out.println("WebURL is: " + (url + loadname));

                ymdata = null;

                System.gc();

                InputStream result = null;

                File file = null;

                try {

                    result = new URL(url + loadname).openStream();

                    System.out.println("Loadname is: " + loadname);

                } catch (Exception e) {

//            e.printStackTrace();

                    try {

                        file = new File(loadname);

                        result = new FileInputStream(file);

                    } catch (Exception re) {

                        return;

                    }

                }

                int filesize = 0;

                if (loadname.toLowerCase().endsWith(".zip")) {

                    try {

                        YMPlayer.info.append("Opening compressed file...\r\n");

                        ZipInputStream str = new ZipInputStream(result);

                        filesize = (int) str.getNextEntry().getSize();


                        result = str;

                        System.out.println(result.toString() + " - " + filesize + " bytes...");

                    } catch (Exception e) {

                        e.printStackTrace();

                    }

                }

                try {

                    int counter = 0;

//                    final BufferedInputStream bos = new BufferedInputStream(result);

                    int bytesRead;

                    int size = result.available();

                    System.out.println("Found filesize is " + size + " bytes.");

                    if (filesize < 2) {

                        filesize = 5000000;

                    }

                    if (size < 2) {

                        size = filesize;

                    }

                    ymdata = new int[size];

                    bytesRead = 0;

                    while ((bytesRead = result.read()) != -1) {

                        try {

                            ymdata[counter++] = bytesRead;

                        } catch (Exception t) {

                        }

                    }

                    result.close();

//                    bos.close();

                    if (size == 5000000) {

                        int[] check = new int[counter];

                        System.arraycopy(ymdata, 0, check, 0, check.length);

                        ymdata = new int[counter];

                        System.arraycopy(check, 0, ymdata, 0, check.length);

                    }

                    System.out.println("Available filelength:" + counter);

                    if (ymdata[2] == 0x2d) {

                        YMPlayer.info.append("LHA5 crunched file.\r\n");

                        ymdata = unLHA(loadname, ymdata);

                    }

                    loadYM(loadname, 1);


                } catch (final Exception iox) {

                    iox.printStackTrace();

                    YMPlayer.info.append("Error: File too large / bad format.\r\n");

                    System.out.println("Error: File too large / bad format.");

                    stop();

                    return;

                }


            }

        });

    }

Ich habe den BufferedInputStream wegkommentiert, aber auch mit BufferedInputStream funktioniert es nicht bei Allen.

Geschrieben

Hier mal ein Test auf einem befreundeten Rechner in UK:

Java Plug-in 1.6.0_21

Using JRE version 1.6.0_21-b07 Java HotSpot Client VM

User home directory = C:\Documents and Settings\kthacker

----------------------------------------------------

c: clear console window

f: finalize objects on finalization queue

g: garbage collect

h: display this help message

l: dump classloader list

m: print memory usage

o: trigger logging

q: hide console

Using 8 bit unsigned sound

Initialized

AY chip active!

resync: start=0

resync: start=2205

Parameter read: FILE with value:CAMERTO.YM

Opening CAMERTO.YM

WebURL is: http://cpc-live.com/ymtest/CAMERTO.YM

Loadname is: CAMERTO.YM

Found filesize is 1380 bytes.

Available filelength:381038

Datastream has 1380 bytes

YM_RecCount 1274

YM_length 23808

Something went wrong.

Retrying 1 times

Opening CAMERTO.YM

WebURL is: http://cpc-live.com/ymtest/CAMERTO.YM

Loadname is: CAMERTO.YM

Found filesize is 381038 bytes.

Available filelength:381038

Datastream has 381038 bytes

YM_RecCount 380932

YM_length 23808

Wieso muss die Datei 2x eingelesen werden? Warum wird da beim Ersten Versuch eine falsche Dateigrösse zurückgegeben?

Geschrieben

Deine Java Applets scheinen generell Probleme zu machen (das war bei einem vergangenen Post ebenfalls so).

Unter FF & Safari unter OSX 10.5 & 10.6 lädt das Applet noch nicht einmal, vielleicht solltest Du erst einmal damit beginnen, dass Du solche Dinge beseitigst, denn das wäre die Grundlage für eine vernünftige Entwicklung

Geschrieben

Das Problem scheint im HTML code zu liegen.

codebase="./" scheinen nicht alle Browser zu mögen?!?

Aber ohne Fehlerlog kann ich Dir da nicht helfen.

Die Laderoutine habe ich nun gepatched:

                    int counter = 0;

                    final BufferedInputStream bos = new BufferedInputStream(result);

                    int bytesRead;

                    int size = bos.available();

                    System.out.println("Found filesize is " + size + " bytes.");

                    if (filesize < 2) {

                        filesize = 5000000;

                    }

                    if (size < 2) {

                        size = filesize;

                    }

                    ymdata = new int[size];

                    bytesRead = 0;

                    boolean rebuild = false;

                    while ((bytesRead = bos.read()) != -1) {

                        try {

                            if (counter >= ymdata.length) {

                                int[] redo = new int[ymdata.length];

                                System.arraycopy(ymdata, 0, redo, 0, ymdata.length);

                                ymdata = new int[counter + 4096];

                                if (!rebuild) {

                                    System.out.println("Read stream went wrong! "

                                            + "Filesize was too small. Enlarging buffer size");

                                }

                                rebuild = true;

                                System.arraycopy(redo, 0, ymdata, 0, redo.length);

                            }

                            ymdata[counter++] = bytesRead;

                        } catch (Exception t) {

                        }

                    }

                    result.close();

                    bos.close();

                    if (size == 5000000 || rebuild) {

                        int[] check = new int[counter];

                        System.arraycopy(ymdata, 0, check, 0, check.length);

                        ymdata = new int[counter];

                        System.arraycopy(check, 0, ymdata, 0, check.length);

                    }

So funktioniert das wenigstens schonmal.

Geschrieben

Was mir zu den nicht funktionierenden Applets sonst noch einfällt:

Nicht jedes OS kann 8 bit unsigned stereo Samples spielen.

Von 8bit signed Stereo ganz zu schweigen.

Das liegt aber an Java / Soundanbindung und nicht an meinem Applets.

Die Sound Implementierung in Java ist z.B. auf Linux unter aller Sau.

Geschrieben

Die Sound Implementierung in Java ist z.B. auf Linux unter aller Sau.

Java ist cross-plattform. Wenn Dir das nicht gefällt, dann schreibe Deine Anwendung eben in einer Sprache, die Dir besser gefällt. Ich finde Deine Aussage gerade in Bezug auf Java für falsch und vor allem zeugt das von einer sehr eingeschränkten Sichtweise.

Wenn Du in Java entwickeln willst, dann sollte es Dein Ziel sein mindestens die 3 großen Plattformen fehlerfrei zu unterstützen

Geschrieben (bearbeitet)

Oh ok, verstehe mich nicht Falsch bitte.

Java ansich ist eine sehr geniale Sache.

Nur wirklich schade, dass einige Sachen halt nicht multi-plattform tauglich sind,

wie z.B. die Soundgeschichte.

Das hat im übrigen nicht nur mich geärgert / enttäuscht sondern auch Freunde von mir, die versuchen, einige Sachen an ihr Linux anzupassen.

Schade, dass es eben keine einheitlichen Implementationen gibt.

Also nicht falsch verstehen bitte.

Nur, wenn man halt etwas programmiert und dabei nicht auf externe Libraries zurückgreift, sondern Standard Java verwendet, mit Swing, AWT & Co, sollte man annehmen können, dass es halt sowohl auf Solaris, als auch Linux oder Mac oder wasauchimmer dasselbe ist.

(Ausnahmen sind natürlich Systemspezifische Dinge wie Fonts)

Das Problem beim Sound ist allerdings:

- Das OS ansich unterstützt das Format.

- Die Hardware & Treiber auch.

- Die Java-OS Schnittstelle allerdings nicht.

Beispiel: Mein Emulator (Screenshot: http://cpc-live.com/javacpc_desktop.png )

Läuft auf allen getesteten OS.

Nur: Linux ist zu langsam wegen der schlechten Soundanbindung.

Freunde von mir, die einige Dinge mit entwickeln, haben sich schon die Haare ausgerauft, weil der Code korrekt erscheint, aber die Implementierung quer schlägt.

Bearbeitet von Devilmarkus
Geschrieben

Nur: Linux ist zu langsam wegen der schlechten Soundanbindung.

Freunde von mir, die einige Dinge mit entwickeln, haben sich schon die Haare ausgerauft, weil der Code korrekt erscheint, aber die Implementierung quer schlägt.

Ich meine wenn das ein Problem ist, sprich die Schnittstelle, dann schreib sie neu !? Über JNI kannst Du OS spezifische Libraries nativ einbinden und verwenden. Wenn Du das OOP Design Deiner Schnittstelle machst, musst Du eben nur OS abhängig Deine Klassen aufrufen.

Geschrieben

Mal was anderes: Kann man einem Applet sagen, es soll eine Datei auf dem Server löschen, wenn der Pfad mit temp/ beginnt?

Der Ordner auf dem Server hat natürlich chmod 777 gesetzt.

Ich möchte Useruploads erlauben, und diese sollen sofort wieder gelöscht werden auf dem Server, sobald die Datei geladen wurde.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...