• 0
Mazzay

Можно ли как-нибудь попроще воспроизвести на Андроиде произвольный звук?

Вопрос

Не хочу добавлять компоненты и аудио-файлы  в проект ради обычного воспроизведения коротенького щелчка.

Никак не могу найти. Android API позволяет воспроизвести просто звук нужной длительности и частоты?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

4 ответа на этот вопрос

  • 0

Приведённый здесь пример почему-то не обрезает выбираемые варианты звуков по длительности ADuration. :(

uses 
  AndroidApi.JNI.Media;

procedure MakeSound(ADuration: Integer);
var
  Volume: Integer;
  StreamType: Integer;
  ToneType: Integer;
  ToneGenerator: JToneGenerator;
begin
  Volume := TJToneGenerator.JavaClass.MAX_VOLUME; // задаем громкость
  StreamType := TJAudioManager.JavaClass.STREAM_ALARM; 
  ToneType := TJToneGenerator.JavaClass.TONE_DTMF_0; // тип звука
  ToneGenerator := TJToneGenerator.JavaClass.init(StreamType, Volume);
  ToneGenerator.startTone(ToneType, ADuration);
end;

Задаваемая длительность может только увеличить время воспроизведения, но не может уменьшить. Может есть какие-нибудь способы обрезать воспроизводимое?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

http://stackoverflow.com/questions/2413426/playing-an-arbitrary-tone-with-android

тут формируют буфер синусом и 

audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                    sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO,
                    AudioFormat.ENCODING_PCM_16BIT, (int)numSamples*2,
                    AudioTrack.MODE_STATIC);
            audioTrack.write(generatedSnd, 0, generatedSnd.length);     // Load the track
            audioTrack.play();        

ну или тут

https://gist.github.com/slightfoot/6330866

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Спасибо большое!

На Билдере получилось так:

#include <AndroidApi.JNI.Media.hpp>

void AndroidSound(double freqHz, int durationMs)
{
	double Pi = 3.14159265358979323846;
	int count = (int)(44100.0 * 2.0 * (durationMs / 1000.0)) & ~1;
	TJavaArray__1<short>* samples = new TJavaArray__1<short>(count);
	for(int i = 0; i < count; i += 2)
	{
		short sample = (short)(Sin(2 * Pi * i / (44100.0 / freqHz)) * 0x7FFF);
		samples->Items[i + 0] = sample;
		samples->Items[i + 1] = sample;
	}

	_di_JAudioTrack audioTrack;
	audioTrack = TJAudioTrack::JavaClass->init(TJAudioManager::JavaClass->STREAM_MUSIC,
		44100, TJAudioFormat::JavaClass->CHANNEL_CONFIGURATION_MONO,
		TJAudioFormat::JavaClass->ENCODING_PCM_16BIT, count * (sizeof(TJavaArray__1<short>) / 8),
		TJAudioTrack::JavaClass->MODE_STATIC);
	if(audioTrack->write((TJavaArray__1<short>*)samples, 0, count)) audioTrack->play();
	delete samples;
}

Только при многократном вызове (у меня при прокрутке щёлкает звуком ScrollBox) получаю ошибку:

Цитата

java.lang.illegalStateException: play() called on uninitialized AudioTrack.

Не пойму, почему. :( Сдаётся мне, переменную audioTrack надо как-то уничтожать. Хотя, это интерфейс…

Изменено пользователем Mazzay
Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Многократное щёлканье получилось вот так.

В объявлении класса:

#ifdef __ANDROID__
	_di_JAudioTrack audioTrack;
	TJavaArray__1<short>* samples;
#endif

В конструкторе:

#ifdef __ANDROID__
	samples = new TJavaArray__1<short>(1);
	samples->Items[0] = 0x0FFF;
	audioTrack = TJAudioTrack::JavaClass->init(TJAudioManager::JavaClass->STREAM_MUSIC,
		11025, TJAudioFormat::JavaClass->CHANNEL_OUT_MONO,
		TJAudioFormat::JavaClass->ENCODING_PCM_16BIT,
		TJAudioTrack::JavaClass->getMinBufferSize(11025, TJAudioFormat::JavaClass->CHANNEL_OUT_MONO, TJAudioFormat::JavaClass->ENCODING_PCM_16BIT),
		TJAudioTrack::JavaClass->MODE_STREAM);
#endif

На событие:

#ifdef __ANDROID__
	audioTrack->write(samples, 0, 1);
	audioTrack->play();
	audioTrack->stop();
#endif

В деструкторе:

#ifdef __ANDROID__
	delete samples;
#endif

 

Изменено пользователем Mazzay
Rusland понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу