このブログは、パソコンのアレコレを適当に書き綴っていくだけのブログです。

※神田大和の知識は、あくまで趣味程度なので、間違っていることもあります。
間違っていたら生暖かく注意してあげてください。
おはこんばんちは。私です。

全然更新できていません;;
まぁ、まったりやろうかと思います。

さて、近況としては
■第一にJavaについて

まず、mp3再生については、まぁほぼ完成と言いたいところですが、
未来を考えて、Interfaceを実装したいなぁと考えています。
waveとかoggくらいは再生できてもいい気がします。

後は横道にそれて、DB部分の開発も進めています。
具体的には、Javaにはderbyっていうローカルで使用できるDBがありまして、
とりまそれを採用して以降かなと思います。

あとは結構やりたい事が多いです。
Javaでレジストリを弄るAPIがないので、探していると、
フリーっちゃフリーなんですけど、ソースとか全部丸々公開しなきゃならんものだったり、
痒いところに手が届かなかったりと・・・
そこで、この部分もJNIとか使って自作することにしました。
C++の勉強にもなるしねー

形になったら順次公開していこうかと思っております。

更新頻度は、糞遅いですが、こんなでも見てくれる人がいると、少し嬉しいです。

■第2に、Windowsについて
なんだかんだで、Windows8が発売されました。
個人的には、要らない子なので、買うとしても、Server2012かなぁ。

正直、タブレットとパソコンはきっちりと分けた方がいい。
Microsoft的にタブレット展開したいなら、タブレットOSを作成したほうがいいと思う。
結局、二兎を追っている気がしないでもない。

ただ、ハードウェア的には、変態チックは筐体が増えて、歓喜しております。
Vaio Duo 11とかちょっと欲しい。

■第3にアニメについて
[ソードアート・オンライン]
シリカたんがでません(;_;)

[ジョジョ]
面白い!!
普通に画面に ゴゴゴゴゴゴ とか出ててワロタwww
初めてジョジョを見る人でも楽しめるんじゃないかなぁ。
ただし、オープニング、テメーはダメだ。

[ガールズ・パンツァー]
ちょっと、戯れに見てみたら、意外に面白かった。
まだ3話くらいだけど、続けられそうな感じ

[リトルバスターズ]
原作は既にプレイ済みなので、未来はわかる。
しかし、声優のほとんどがオリジナル起用は嬉しい。
違和感なく受け入れられた。
まぁ、ほっちゃんのリキも全然余裕でした。

[厨二病でも恋がしたい]
原作知らんが、自分でも多少厨二病があったんで、
共感できる部分が多い。
僕の考えた最強の武器とか今でも覚えてる。

今回はこんなところで、ではでは。
おはこんばんちは。私です。

MP3プレイヤーを作ると言いつつだいぶ時間が立ちました。
第01回目で、JLayerを使うまでは行ったと思います。

実は、JLayerには、Pause機能がありません。
正確には、途中から音を出す機能がありません。

そこで、Pause機能(ある途中から音楽を再生する機能)を作るところから開始です。

具体的には、以下のとおり(Souce1)
JLayerをそのまま使うのではなく、中身を改変して、音楽を途中から再生する機能を持たせてあげます。
具体的にはSkipFrameというのを作って、一定Frameの再生をしない状態にしてあげます。
。。。とご高説していますが、ここのパクリです。

次に、こいつをスレッド動作させるために、更にクラスを作成(Souce2)
これで、単発のファイルの再生、停止、一時停止が完成しました。

次は、複数ファイルの再生です。
具体的には、1曲再生が終わったら次の曲の再生が始まるようにしたいですね。

また、下のSouceも無駄がなくなるように改良できたらしていこうと思います。

■Souce1(JLayerPausable)
package JMPCommon;

import java.io.IOException;
import java.net.URL;

import javazoom.jl.decoder.Bitstream;
import javazoom.jl.decoder.BitstreamException;
import javazoom.jl.decoder.Decoder;
import javazoom.jl.decoder.Header;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.decoder.SampleBuffer;
import javazoom.jl.player.AudioDevice;
import javazoom.jl.player.FactoryRegistry;

public class JLayerPausable {
    private URL urlToStraemFrom;
    private Bitstream bitstream;
    private Decoder decoder;
    private AudioDevice outDevice;
    private boolean isClosed = false;
    private boolean isComplete = false;
    private int frameIndexCurrent;

    private boolean isPaused = false;;
    private boolean isStop = true;
    private SampleBuffer output;

    public JLayerPausable(URL fileURL) throws JavaLayerException{
        urlToStraemFrom = fileURL;
    }

    public boolean play(int startIndex, int endIndex, int correctionFactorInFrames) throws JavaLayerException{
        isStop = false;
        isPaused = false;
        isClosed = false;

        try {
            bitstream = new Bitstream(urlToStraemFrom.openStream());
        } catch (IOException e) {e.printStackTrace();}

        outDevice = FactoryRegistry.systemRegistry().createAudioDevice();
        outDevice.open(decoder = new Decoder());

        boolean continuFrame = true;
        isPaused = false;
        isStop = false;
        frameIndexCurrent = 0;

        while(continuFrame && frameIndexCurrent < startIndex - correctionFactorInFrames){
            continuFrame = skipFrame();
            frameIndexCurrent++;
        }

        if(endIndex < 0){
            endIndex = Integer.MAX_VALUE;
        }

        while(continuFrame && frameIndexCurrent < endIndex){
            if(isPaused){
                continuFrame = false;
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {}
            }else{
                continuFrame = decodeFrame();
                frameIndexCurrent++;
            }
        }

        if(outDevice != null){
            outDevice.flush();
            synchronized (this) {
                isComplete = (isClosed == false);
                close();
            }
        }

        return isComplete;
    }

    public boolean play(int startIndex) throws JavaLayerException{
        return play(startIndex, -1, 16);
    }

    public boolean play() throws JavaLayerException{
        return play(0);
    }

    public void pause(){
        isStop = true;
        isPaused = true;
        close();
    }

    public void stop(){
        isStop = true;
        isPaused = false;
        close();
        frameIndexCurrent = 0;
    }

    public int getPosition(){
        return frameIndexCurrent;
    }

    public void setPosition(int index){
        if(index < 0){
            index = 0;
        }
        frameIndexCurrent = index;
    }

    public boolean isStop(){
        return isStop;
    }

    public boolean isPause(){
        return isPaused;
    }

    public boolean resume() throws JavaLayerException{
        return play(frameIndexCurrent);
    }

    public synchronized void close(){
        if(outDevice != null){
            isClosed = true;
            outDevice.close();
            outDevice = null;
            try {
                bitstream.close();
            } catch (BitstreamException e) {}
        }
    }

    private boolean skipFrame() throws JavaLayerException{
        boolean ret = false;
        Header header = bitstream.readFrame();
        if(header != null){
            bitstream.closeFrame();
            ret = true;
        }
        return ret;
    }

    private boolean decodeFrame() throws JavaLayerException {
        if (outDevice != null) {
            Header header = bitstream.readFrame();
            if (header != null) {
                output = (SampleBuffer)decoder.decodeFrame(header, bitstream);
                synchronized (this) {
                    if(!isClosed){
                        outDevice.write(output.getBuffer(), 0, output.getBufferLength());
                    }
                }
                bitstream.closeFrame();
            }
        }
        return true;
    }
}

■Souce2(MP3Player)


package JMPCommon;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

import javazoom.jl.decoder.JavaLayerException;

public class MP3Palyer implements Runnable {
    private JLayerPausable player;
    private Thread playThread;
    private String stringURL;

    private int nowIndex = 0;

    public MP3Palyer(File mp3File){
        if(mp3File.isFile() && mp3File.exists()){
            stringURL = "file:///" + mp3File.getAbsolutePath();
        }
    }

    public MP3Palyer(String mp3File){
        this(new File(mp3File));
    }


    public void init(){
        try {
            player = new JLayerPausable(new URL(stringURL));
        } catch (MalformedURLException | JavaLayerException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
    }

    public void play(){
        if(player == null){
            init();
        }
        if(player.isStop() == true){
            startThread();
        }
    }

    public void stop(){
        if(player != null && !player.isStop()){
            player.stop();
            nowIndex = 0;

            playThread = null;
            player =null;
        }
    }

    public void pause() throws MalformedURLException, JavaLayerException{
        if(player != null){
            if(player.isPause() && player.isStop()){
                player.setPosition(nowIndex);
                play();
            } else {
                    player.pause();
                nowIndex = player.getPosition();

                playThread = null;
            }
        }
    }

    public void startThread(){
        //halt_ = false;
        playThread = new Thread(this, "MP3PlayerThread");
        playThread.start();
    }

    @Override
    public void run() {
        // TODO 自動生成されたメソッド・スタブ
        try {
            player.resume();
        } catch (JavaLayerException e) {
            e.printStackTrace();
        }
    }
}