2013-07-22 2 views
1

Я реализую приложение Android для обработки данных звука PCM (для длинных звуков, то есть музыкальных дорожек). Я решил использовать класс AudioTrack для воспроизведения музыки, но не может быть помещен в тот же поток, что и активность, потому что блокирует все приложение - и вот вопрос: следует ли использовать операции AudioTrack в отдельном потоке или в асинхронной задаче (или любой другой вариант)? Что было бы лучше всего? Мне нужно воспроизвести/приостановить/остановить и изменить музыкальные файлы.Лучший способ использования Androids Audiotrack

Теперь я пытаюсь управлять этим потоком java, и его почти нормально - игра в порядке, приостановка почти (его «падение» части звука), но когда я меняю музыкальный файл, предыдущий не останавливается, а theres - смешанный вывод (я думаю, что что-то не так с моей реализацией потока).

И - нет, я не могу использовать MediaPlayer в этом приложении (я хочу изменить данные PCM на лету).

Я искал некоторую помощь в google и здесь, в stackoverflow, но мне ничего не помогло.

Вот моя текущая реализация, если кто-то хочет взглянуть.

public class AudioPlayerManager { 

private AudioTrack track; 
private Thread thread; 
private AudioTrackThread trackThread = new AudioTrackThread(); 

public int getPlayState() { 
    return track.getPlayState(); 
} 

public int getAudioSession() { 
    return track.getAudioSessionId(); 
} 

class AudioTrackThread implements Runnable { 
    private String filePath = "/music/wav/musicfile.wav"; 

    @Override 
    public void run() { 
     try { 
      playWaveFile(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void playWaveFile() throws FileNotFoundException {  
     int minSize = AudioTrack.getMinBufferSize(44100, 
       AudioFormat.CHANNEL_OUT_STEREO, 
       AudioFormat.ENCODING_PCM_16BIT); 
     track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, 
       AudioFormat.CHANNEL_OUT_STEREO, 
       AudioFormat.ENCODING_PCM_16BIT, minSize, 
       AudioTrack.MODE_STREAM); 

     File file = new File(FileListingUtils.getExternalStorageRootFile(), 
       filePath); 
     InputStream is = new FileInputStream(file); 

     byte[] music = new byte[512]; 
     track.play(); 

     try { 
      handleSound(is, music); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     track.stop(); 
     track.release(); 
    } 

    private void handleSound(InputStream is, byte[] music) 
      throws IOException { 
     int i; 
     while ((i = is.read(music)) != -1) { 
      track.write(music, 0, i); 
     } 
    } 
} 

public void playNew() { 
    if (track != null) { 
     track.stop(); 
     //track.flush(); 
     track.release(); 
    } 

    thread = new Thread(trackThread); 
    thread.start(); 
} 

public void playOrResume() { 
    this.track.play(); 
} 

public void pause() { 
    this.track.pause(); 
} 

}

Спасибо за каждую помощь!

M.

ответ

1

Ваш жизненный цикл вашей резьбы не кажется правильным. Во-первых, вам придется закрыть (прерывать) текущий поток каждый раз, когда воспроизведение остановлено или закончено, и создать новый экземпляр потока и закрыть старый поток.

Во-вторых, вы вызываете track.stop() со своей темы. Вы должны внедрить общедоступный метод остановки внутри вашего потока, а затем вставить код завершения, а затем вызвать метод yourthread.stop() в методе playNew().

так вот псевдокод:

public void playNew() { 

//the following if clause should go to thread's stop() method. 
    // if (track != null) { 
    // track.stop(); 
//track.flush(); 
// track.release(); 
// } 
    //create a new thread if its null 
if(thread ==null){ 
thread = new Thread(new AudioTrackThread()); 
thread.start();} 
//stop the current thread 
else{ 
thread.stop(); 
thread=null;} 
} 

о вашей реализации, где-то я читал, что для воспроизведения музыки, обслуживание и поток будет лучше option.Read об услугах и нитей в android documentation.

+0

Благодарим вас за ответ! Но, к сожалению, эффект тот же. Я немного изменил свою реализацию, и теперь все работает отлично, за исключением загрузки следующего трека. Но я вернусь к этому вопросу в будущем. Спасибо! – Michal

+0

Добро пожаловать. Пожалуйста, напишите свой ответ, который может быть полезен другим. –

+1

Где ответ, пожалуйста? –

Смежные вопросы