powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / Разработка под мобильные платформы [игнор отключен] [закрыт для гостей] / Как сгенерировать несколько звуковых сигналов подряд в Android?
7 сообщений из 7, страница 1 из 1
Как сгенерировать несколько звуковых сигналов подряд в Android?
    #38881229
YK13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток

Генерирую звуковой сигнал как здесь показано.
С одним сигналом все Ок. Но вот несколько сигналов подряд сгенерировать не получается. То выдается один, то они накладываются один на другой.
Похожая генерация сигналов на десктопе позволяет реализовать желаемое.
Подскажите please, в чем здесь проблема, возможно есть какие то отличительные от десктопа особенности?
Зараннее благодарен за советы
С уважением
YK13
...
Рейтинг: 0 / 0
Как сгенерировать несколько звуковых сигналов подряд в Android?
    #38881302
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YK13Но вот несколько сигналов подряд сгенерировать не получается.
Обычно люди показывают код, который у них не получается.
...
Рейтинг: 0 / 0
Как сгенерировать несколько звуковых сигналов подряд в Android?
    #38881692
YK13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadmanОбычно люди показывают код, который у них не получается.
Да, полностью согласен

Мой класс который генерит звук
Код: 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.
import java.util.concurrent.TimeUnit;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import mm.multitimer.core.BeepGenerator;

public class Beeper {
	public void generateLongBeep() {	
		byte[] buffer = makeSinWave(44100, 440, 1000, TimeUnit.MILLISECONDS);
		
		AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
				44100, AudioFormat.CHANNEL_OUT_MONO,
				AudioFormat.ENCODING_PCM_8BIT, buffer.length,
				AudioTrack.MODE_STREAM);
				audioTrack.write(buffer, 0, buffer.length);
				audioTrack.play();
	}

	public void generateMiddleBeep() {
		byte[] buffer = makeSinWave(44100, 440, 500, TimeUnit.MILLISECONDS);
		
		AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
				44100, AudioFormat.CHANNEL_OUT_MONO,
				AudioFormat.ENCODING_PCM_8BIT, buffer.length,
				AudioTrack.MODE_STREAM);
				audioTrack.write(buffer, 0, buffer.length);
				audioTrack.play();
	}

	public void generateShortBeep() {
		byte[] buffer = makeSinWave(44100, 440, 130, TimeUnit.MILLISECONDS);
		int s = buffer.length;
		AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
				44100, AudioFormat.CHANNEL_OUT_MONO,
				AudioFormat.ENCODING_PCM_8BIT, s,
				AudioTrack.MODE_STREAM);
				audioTrack.write(buffer, 0, s);
				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;
		}

}



Ну а здесь вызов
Код: 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.
public class MainActivity extends ActionBarActivity{
        Handler handler = new Handler();

////Код........


////Генерация звука
	@Override
	protected void onResume() {
		super.onResume();

		Thread thread = new Thread(new Runnable() {
			   public void run() {
			     handler.post(new Runnable() {
			    	 public void run() {
			    			Beeper bb = new Beeper();
			    			bb.generateMiddleBeep();
			    			bb.generateMiddleBeep();
			    			bb.generateMiddleBeep();
			    	 }
			     });
			   }  
			 });
			 thread.start();
	}
}
...
Рейтинг: 0 / 0
Как сгенерировать несколько звуковых сигналов подряд в Android?
    #38881696
YK13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadmanОбычно люди показывают код, который у них не получается.
Да, полностью согласен

Мой класс который генерит звук
Код: 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.
import java.util.concurrent.TimeUnit;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;

public class Beeper {
	public void generateLongBeep() {	
		byte[] buffer = makeSinWave(44100, 440, 1000, TimeUnit.MILLISECONDS);
		
		AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
				44100, AudioFormat.CHANNEL_OUT_MONO,
				AudioFormat.ENCODING_PCM_8BIT, buffer.length,
				AudioTrack.MODE_STREAM);
				audioTrack.write(buffer, 0, buffer.length);
				audioTrack.play();
	}

	public void generateMiddleBeep() {
		byte[] buffer = makeSinWave(44100, 440, 500, TimeUnit.MILLISECONDS);
		
		AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
				44100, AudioFormat.CHANNEL_OUT_MONO,
				AudioFormat.ENCODING_PCM_8BIT, buffer.length,
				AudioTrack.MODE_STREAM);
				audioTrack.write(buffer, 0, buffer.length);
				audioTrack.play();
	}

	public void generateShortBeep() {
		byte[] buffer = makeSinWave(44100, 440, 130, TimeUnit.MILLISECONDS);
		int s = buffer.length;
		AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
				44100, AudioFormat.CHANNEL_OUT_MONO,
				AudioFormat.ENCODING_PCM_8BIT, s,
				AudioTrack.MODE_STREAM);
				audioTrack.write(buffer, 0, s);
				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;
		}

}



Ну а здесь вызов
Код: 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.
public class MainActivity extends ActionBarActivity{
        Handler handler = new Handler();

////Код........


////Генерация звука
	@Override
	protected void onResume() {
		super.onResume();

		Thread thread = new Thread(new Runnable() {
			   public void run() {
			     handler.post(new Runnable() {
			    	 public void run() {
			    			Beeper bb = new Beeper();
			    			bb.generateMiddleBeep();
			    			bb.generateMiddleBeep();
			    			bb.generateMiddleBeep();
			    	 }
			     });
			   }  
			 });
			 thread.start();
	}
}
...
Рейтинг: 0 / 0
Как сгенерировать несколько звуковых сигналов подряд в Android?
    #38881704
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Устанавливаешь метки на конце бипа и ловишь их http://developer.android.com/intl/ru/reference/android/media/AudioTrack.OnPlaybackPositionUpdateListener.html
Затем начинаешь играть новый звук. Отдельный звук для этого особо не нужен, и так играется фоном.
...
Рейтинг: 0 / 0
Как сгенерировать несколько звуковых сигналов подряд в Android?
    #38882341
YK13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо
Это как раз то что требовалось
...
Рейтинг: 0 / 0
Как сгенерировать несколько звуковых сигналов подряд в Android?
    #38885016
YK13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток всем.
Думал что проблема полностью закрыта. Увы нет :(
Итак "продолжение банкета"

В соответствии с советами wadman изменил класс Beeper
Код: 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() однако это не принесло желаемого результата.
Оговорюсь, что тестировал только на одном устройстве. Когда произошел бы сбой на какам дибо другом устройстве (да и произошел ли бы вообще) сказать не могу.
В режиме отладки кода вызываю все методы шаг за шагом все проходит нормально

Зараннее благодарен за советы
С уважением
YK13
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Разработка под мобильные платформы [игнор отключен] [закрыт для гостей] / Как сгенерировать несколько звуковых сигналов подряд в Android?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]