21

Re: Відтворити аудіо файли в циклі

В статті SwingWorker (виконання довгих розрахунків в SWINGу), наголошував:

...
Також, потрібно підкреслити, що об'єкт даного класу, скажімо так, для одноразового використання
...

Тобто кожен раз потрібно створювати новий об'єкт.

Подякували: Lujok1

22 Востаннє редагувалося Lujok (16.02.2016 19:17:52)

Re: Відтворити аудіо файли в циклі

Lujok написав:

Тепер проблема щоб завершити завчаснно
коли файл програється то коли натиснути кнопку stop(stopAudioActionListener) нічого не завершується тільки на консоль зявляеться : System.out.println(" public void done() {////////////////////____ КІНЕЦЬ _____\\\\\\\\\\\\\\ll");

fed_lviv написав:

;)  Спробуйте:
clip.stop();

намагався :

clip.stop();
// та 
сlip.close();

цього достатньо щоб пропустити одну ітерацію цикла for(int n = 0; n < files.length; n++){ ...
тобто один файл припиняє програватися ( метод playSound(  files[n]); викликається двічі ), а потім почина програватися наступний .

23 Востаннє редагувалося Lujok (16.02.2016 20:19:26)

Re: Відтворити аудіо файли в циклі

Спробував прибрати строки в методі playSound :

try{ 
}catch(Exception ex){
 } 

та на вимогу   NetBeansа  записав через throws :

playSound( File soundFile) throws LineUnavailableException, IOException, UnsupportedAudioFileException, InterruptedException{...} 

і ніби запрацювало, тільки кліп при програванні якого була натиснута кнопка стоп  до кінця програє, а потім зупиниться все.
Мене турбує те,  що я нерозумію чому так працює а так ні .

24

Re: Відтворити аудіо файли в циклі

Lujok написав:

намагався :

clip.stop();
// та 
сlip.close();

цього достатньо щоб пропустити одну ітерацію цикла for(int n = 0; n < files.length; n++){ ...
тобто один файл припиняє програватися ( метод playSound(  files[n]); викликається двічі ), а потім почина програватися наступний .

А навіщо двічі?

25 Востаннє редагувалося Lujok (17.02.2016 20:11:18)

Re: Відтворити аудіо файли в циклі

fed_lviv написав:

А навіщо двічі?

clip.stop(); // Зупиняємо
clip.close(); //Закриваємо

ось тут прочитав https://habrahabr.ru/post/191422/

26 Востаннє редагувалося fed_lviv (18.02.2016 16:01:29)

Re: Відтворити аудіо файли в циклі

Ні, я про метод playSound(), навіщо його двічі викликати в кожній ітерації?

@Override
    protected String doInBackground() throws Exception {
        
            for(int n = 0; n < files.length; n++){
                
                      publish(n);
                      playSound(  files[n]);
 
                      publish(n);
                      playSound(  files[n]);
                       
            
        }
            return null;
    
    }

А так, що не зупиняє?

clip.stop();
cancel(true);

Ось, підрихтував, попередній код для декількох файлів:

import java.util.List;

import java.io.File;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.AudioInputStream;

public class First extends JFrame {

    private static Clip clip;
    private static File[] files;
    private MyWork work;
    private JButton butStart = new JButton("Start");
    private JButton butStop = new JButton("Stop");
    private JLabel lab = new JLabel("");

    public First() {
        setTitle("Test");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new FlowLayout());
        add(butStart);
        add(butStop);
        butStop.setEnabled(false);
        setListeners();
        add(lab);
        setSize(400, 200);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private void setListeners() {
        butStart.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                work = new MyWork();
                work.execute();
                butStart.setEnabled(false);
                butStop.setEnabled(true);
            }
        });
        butStop.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                work.cancel(true);
                clip.stop();
                clip.close();
            }
        });
    }

    public static void main(String[] args) throws Exception {
        files = new File("sound").listFiles();
        clip = AudioSystem.getClip();
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new First();
            }
        });
    }

    class MyWork extends SwingWorker<Void, String> {

        @Override
        protected Void doInBackground() throws Exception {
            for (int n = 0; n < files.length; n++) {
                if (isCancelled())
                    return null;
                AudioInputStream inputStream = AudioSystem.getAudioInputStream(files[n]);
                clip.open(inputStream);
                publish(files[n].getName());
                clip.start();
                Thread.sleep(clip.getMicrosecondLength() / 1000);
                clip.stop();
                clip.close();
            }
            return null;
        }

        @Override
        protected void process(List<String> list) {
            lab.setText(list.get(0));
        }

        @Override
        public void done() {
            butStart.setEnabled(true);
            butStop.setEnabled(false);
            lab.setText("");
        }
    }
}

27 Востаннє редагувалося Lujok (18.02.2016 22:22:12)

Re: Відтворити аудіо файли в циклі

fed_lviv написав:

Ні, я про метод playSound(), навіщо його двічі викликати в кожній ітерації?

@Override
    

Між двома викликами playSound ще є запис та відтворення голоса користувача.



У повідомленні 23 я писав :
"... тільки кліп при програванні якого була натиснута кнопка стоп  до кінця програє, а потім зупиниться все."
це не так,  вже все більш менш  нормально, відразу зупиняється (бува підвисає якщо часто клацати старт-стоп) і на лейбелці пише "Кінець". Я тільки не розумію чому коли код в методі playSound ()  був в блоці try{ ...} catch(Exception ex){...} ,

private  void playSound( File soundFile) {
      try{
           Clip clip = AudioSystem.getClip();
           clip.open(AudioSystem.getAudioInputStream(soundFile));
           clip.start();
            Thread.sleep(clip.getMicrosecondLength()/1000);
            Thread.sleep(1000); 
       
       }catch(Exception ex){
           System.out.println("Exception");      
       }   
    }

то не зупинялось ( переходило лише на іншу ітерацію  ),

а коли через throws без трай кетча , то працює

private  void playSound( File soundFile) throws LineUnavailableException, IOException, UnsupportedAudioFileException, InterruptedException {...

28 Востаннє редагувалося fed_lviv (19.02.2016 09:40:05)

Re: Відтворити аудіо файли в циклі

Lujok написав:

Між двома викликами playSound ще є запис та відтворення голоса користувача.

Йой, як у Вас там все заплутано.  :)  То там спочатку, йде музичка, запис користувача, програвання запису користувача? Але в коді я у Вас того не помічав.
Про try-catch - скоріш за все помилка "обробляється" і робота йде далі - тобто наступна ітерація. А коли
throws - обробка помилки передається "вгору", тому і переривається.

Подякували: Lujok1

29

Re: Відтворити аудіо файли в циклі

А  можливо призупинити на деякий час виконання потоку (SwingWorker) і потім продовжити його виконання ?

30 Востаннє редагувалося fed_lviv (21.02.2016 20:07:26)

Re: Відтворити аудіо файли в циклі

Ну в самому SwingWorkerі таке не передбачено, але ж ніхто не забороняє руцями доробити  :)
http://stackoverflow.com/questions/2037 … wingworker
http://stackoverflow.com/questions/2626 … background
Хоч, як на мене, то краще вже, все руцями писати (Thread та  Runnable) без SwingWorker.
P.S. Але наприклад, якщо Вам потрібна пауза, підчас пісеньки. То ніхто не забороняє, щоб кожен раз запускати/призупиняти в SwingWorkerі пісеньку в конкретному місці: 

int position=...
...
worker.execute();
...
clip.setFramePosition(position);
clip.start();
...
worker.cancel(true);
...
position=clip.getFramePosition();
clip.stop();
...
new Work.execute();
...
Подякували: Lujok1