Перейти к содержанию
Fire Monkey от А до Я
  • 0

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


Mazzay

Вопрос

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

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

Ссылка на комментарий

Рекомендуемые сообщения

  • 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
Ссылка на комментарий
  • 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
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...