From d454d99d627bb8025bc1f42c03179bc98e562f50 Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 3 May 2015 13:33:24 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0=20que?= =?UTF-8?q?ue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/annimon/everlastingsummer/Lexer.java | 1 + src/com/annimon/everlastingsummer/Parser.java | 19 ++++++++ .../annimon/everlastingsummer/TokenType.java | 1 + .../everlastingsummer/ViewActivity.java | 45 +++++++++++++++++++ 4 files changed, 66 insertions(+) diff --git a/src/com/annimon/everlastingsummer/Lexer.java b/src/com/annimon/everlastingsummer/Lexer.java index 2a50806..e1aa4d9 100644 --- a/src/com/annimon/everlastingsummer/Lexer.java +++ b/src/com/annimon/everlastingsummer/Lexer.java @@ -28,6 +28,7 @@ public final class Lexer { static { KEYWORDS = new HashMap(); KEYWORDS.put("play", TokenType.PLAY); + KEYWORDS.put("queue", TokenType.QUEUE); KEYWORDS.put("stop", TokenType.STOP); KEYWORDS.put("music", TokenType.MUSIC); KEYWORDS.put("ambience", TokenType.AMBIENCE); diff --git a/src/com/annimon/everlastingsummer/Parser.java b/src/com/annimon/everlastingsummer/Parser.java index 9fc4ceb..176bb9e 100644 --- a/src/com/annimon/everlastingsummer/Parser.java +++ b/src/com/annimon/everlastingsummer/Parser.java @@ -146,6 +146,7 @@ public final class Parser { if (match(token, TokenType.COMMAND)) return command(); if (match(token, TokenType.SCENE)) return scene(); if (match(token, TokenType.PLAY)) return play(); + if (match(token, TokenType.QUEUE)) return queue(); if (match(token, TokenType.STOP)) return stop(); if (match(token, TokenType.SHOW)) return show(); @@ -392,6 +393,24 @@ public final class Parser { return false; } + private boolean queue() { + if (match(TokenType.MUSIC)) return queueMusic(); + if (match(TokenType.SOUND)) return queueSound(); + return false; + } + + private boolean queueMusic() { + final String name = consume(TokenType.TEXT).getText(); + ViewActivity.getInstance().addMusicToQueue(name); + return false; + } + + private boolean queueSound() { + final String name = consume(TokenType.TEXT).getText(); + ViewActivity.getInstance().addSoundToQueue(name); + return false; + } + private boolean stop() { if (match(TokenType.MUSIC)) { final FadeInfo fade = matchFade(); diff --git a/src/com/annimon/everlastingsummer/TokenType.java b/src/com/annimon/everlastingsummer/TokenType.java index 5f1f1da..f1fe1e7 100644 --- a/src/com/annimon/everlastingsummer/TokenType.java +++ b/src/com/annimon/everlastingsummer/TokenType.java @@ -25,6 +25,7 @@ public enum TokenType { // ключевые слова PLAY, + QUEUE, STOP, MUSIC, AMBIENCE, diff --git a/src/com/annimon/everlastingsummer/ViewActivity.java b/src/com/annimon/everlastingsummer/ViewActivity.java index d80aed4..99218eb 100644 --- a/src/com/annimon/everlastingsummer/ViewActivity.java +++ b/src/com/annimon/everlastingsummer/ViewActivity.java @@ -3,6 +3,7 @@ package com.annimon.everlastingsummer; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import com.annimon.everlastingsummer.TouchGesture.TouchGestureType; @@ -50,6 +51,7 @@ public final class ViewActivity extends Activity implements TouchGesture.OnTouch private FrameLayout container; private TextView textview; private MediaPlayer musicPlayer, soundPlayer; + private LinkedList musicQueue, soundQueue; private MapPlaces places; private Characters characters; @@ -75,6 +77,9 @@ public final class ViewActivity extends Activity implements TouchGesture.OnTouch container = (FrameLayout) findViewById(R.id.container); textview = (TextView) findViewById(R.id.text); + musicQueue = new LinkedList(); + soundQueue = new LinkedList(); + background.setOnTouchListener(new TouchGesture(this, this)); spriteInContainer = new HashMap(); @@ -367,10 +372,29 @@ public final class ViewActivity extends Activity implements TouchGesture.OnTouch }); } + public void addMusicToQueue(String name) { + if ( (musicPlayer != null) && (musicPlayer.isPlaying()) ) { + // Если музыка играет, просто добавляем в очередь + musicQueue.addLast(name); + } else { + // Воспроизводим + music(name, NO_FADE); + } + } + + public void addSoundToQueue(String name) { + if ( (soundPlayer != null) && (soundPlayer.isPlaying()) ) { + soundQueue.addLast(name); + } else { + sound(name, false, NO_FADE); + } + } + public void music(String name, FadeInfo fade) { try { stopMusic(fade); musicPlayer = new MediaPlayer(); + musicPlayer.setOnCompletionListener(musicCompleteListener); musicPlayer.setDataSource( IOUtil.getFD(PathResolver.music(name)) ); musicPlayer.prepare(); musicPlayer.setVolume(1f, 1f); @@ -394,6 +418,7 @@ public final class ViewActivity extends Activity implements TouchGesture.OnTouch try { stopSound(fade); soundPlayer = new MediaPlayer(); + soundPlayer.setOnCompletionListener(soundCompleteListener); soundPlayer.setDataSource( IOUtil.getFD(PathResolver.sound(name)) ); soundPlayer.prepare(); soundPlayer.setVolume(1f, 1f); @@ -475,4 +500,24 @@ public final class ViewActivity extends Activity implements TouchGesture.OnTouch onMenuItemSelected(item); } }; + + private final MediaPlayer.OnCompletionListener musicCompleteListener = new MediaPlayer.OnCompletionListener() { + + @Override + public void onCompletion(MediaPlayer mp) { + if (musicQueue.size() > 0) { + music(musicQueue.removeFirst(), NO_FADE); + } + } + }; + + private final MediaPlayer.OnCompletionListener soundCompleteListener = new MediaPlayer.OnCompletionListener() { + + @Override + public void onCompletion(MediaPlayer mp) { + if (soundQueue.size() > 0) { + sound(soundQueue.removeFirst(), false, NO_FADE); + } + } + }; }