Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
YK
0 / 0 / 0
Регистрация: 13.09.2014
Сообщений: 7
#1

Генерация нескольких звуковых сигналов в цикле. Не доходит до конца - Android

21.02.2015, 12:27. Просмотров 308. Ответов 0
Метки нет (Все метки)

Всем доброго времени суток

Вот столкнулся с проблемой

Класс который генерирует сигналы
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
public class Beeper {
 
    private static Beeper instance;
    public static Beeper getInstance(){
        if(instance == null){
            instance = new Beeper();
        }
        return instance;
    }
    
    private Beeper(){
        player = new AudioTrackPlayer();
    }
    
    AudioTrackPlayer player; 
    
    public void generateLongBeep() {
        byte[] buffer = makeSinWave(44000, 440, 1000, TimeUnit.MILLISECONDS);
        AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                44000, AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_8BIT, buffer.length,
                AudioTrack.MODE_STREAM);
        audioTrack.setNotificationMarkerPosition((int)(1000 * 44000 / 1000));
        audioTrack.write(buffer, 0, buffer.length);
        while(player.state == AudioTrackPlayer.PLAYER_BUSY);
        audioTrack.setPlaybackPositionUpdateListener(player);
        player.state = AudioTrackPlayer.PLAYER_BUSY;
        audioTrack.play();
    }
 
    public void generateMiddleBeep() {
        byte[] buffer = makeSinWave(44000, 440, 500, TimeUnit.MILLISECONDS);
        AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                44000, AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_8BIT, buffer.length,
                AudioTrack.MODE_STREAM);
        audioTrack.setNotificationMarkerPosition((int)(500 * 44000 / 1000));
        audioTrack.write(buffer, 0, buffer.length);
        while(player.state == AudioTrackPlayer.PLAYER_BUSY);
        audioTrack.setPlaybackPositionUpdateListener(player);
        player.state = AudioTrackPlayer.PLAYER_BUSY;
        audioTrack.play();
    }
 
    public void generateShortBeep() {
        byte[] buffer = makeSinWave(44000, 440, 130, TimeUnit.MILLISECONDS);
        AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                44000, AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_8BIT, buffer.length,
                AudioTrack.MODE_STREAM);
        audioTrack.setNotificationMarkerPosition((int)(130 * 44000 / 1000));
        audioTrack.write(buffer, 0, buffer.length);
        while(player.state == AudioTrackPlayer.PLAYER_BUSY);
        audioTrack.setPlaybackPositionUpdateListener(player);
        player.state = AudioTrackPlayer.PLAYER_BUSY;
        audioTrack.play();
    }
    
    private byte[] makeSinWave (double sampleRate, double frequency, long duration, TimeUnit timeUnit){
        byte[] buffer = new byte[(int) (timeUnit.toMillis(duration) * sampleRate/1000)];
        double period = sampleRate / frequency;
        for (int i = 0; i < buffer.length; i++) {
        double angle = 2d * Math.PI * i / period;
        buffer[i] = (byte) (Math.sin(angle) * 127d);
        }
        return buffer;
    }
    
    public static final int BEEPER_FREE = 0;
    public static final int BEEPER_BUSY = 1;
    
    public int getState(){
        return player.state;
    }
    
    public void setState(int state){
        player.state = state;
    }
    
    class AudioTrackPlayer implements OnPlaybackPositionUpdateListener {
 
        public static final int PLAYER_FREE = 0;
        public static final int PLAYER_BUSY = 1;
        int state;
        
        @Override
        public void onMarkerReached(AudioTrack track) {
            if(track.getPlayState() == AudioTrack.PLAYSTATE_PLAYING){
                
            state = PLAYER_FREE;
            track.stop();
            track.flush();
            track.release();
            }
        }
 
        @Override
        public void onPeriodicNotification(AudioTrack track) {
 
        }
        
    }
}
Обработчик нажатия кнопки
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    @Override
    public void onClick(View arg0) {
        Thread thread = new Thread(new Runnable() {
            public void run() { 
                Beeper.getInstance().setState(Beeper.BEEPER_FREE);
                for(int i = 0; i < 8; i++){
                    try {                           
                            Thread.sleep(10000);
                            Beeper.getInstance().generateShortBeep();
                            Beeper.getInstance().generateShortBeep();
                            Beeper.getInstance().generateShortBeep();
                            
                            Thread.sleep(15000);
                            Beeper.getInstance().generateShortBeep();
                            Beeper.getInstance().generateMiddleBeep();
                            Beeper.getInstance().generateShortBeep();
                    
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }  
        });
        thread.start();
    }
Проблема в том, что после нескольких итераций останавливается после первого или второго сигнала.
Иногда при первом нажатии все проходит нормально и сбой происходит при повторном нажатии.
Пробовал в начале метода run вызывать System.gc() однако это не принесло желаемого результата.
Оговорюсь, что тестировал только на одном устройстве. Когда произошел бы сбой на какам дибо другом устройстве (да и произошел ли бы вообще) сказать не могу.
В режиме отладки кода вызываю все методы шаг за шагом все проходит нормально

Зараннее благодарен за советы
С уважением
YK
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2015, 12:27     Генерация нескольких звуковых сигналов в цикле. Не доходит до конца
Посмотрите здесь:

Android Отследить прокручивание ListView до конца
Android Сдвиг item в ListView не до конца, а под ним кнопка
Телефон не до конца определился ОС Android
Android Подгрузка данных при достижении конца списка
SoundPool - не воспроизводит до конца звук Android
Android Выделить подстроку с конца
Android Генерация Color Palette
Android Генерация случайных чисел
Android Как сделать, чтобы ListView читалось с конца
Android Определить достижение конца экрана
Android Непрерывная генерация сигнала
Проигрывание небольших звуковых файлов Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 03:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru