Mazzay Опубликовано 20 апреля, 2017 Поделиться Опубликовано 20 апреля, 2017 Не хочу добавлять компоненты и аудио-файлы в проект ради обычного воспроизведения коротенького щелчка. Никак не могу найти. Android API позволяет воспроизвести просто звук нужной длительности и частоты? Цитата Ссылка на комментарий
0 Mazzay Опубликовано 20 апреля, 2017 Автор Поделиться Опубликовано 20 апреля, 2017 Приведённый здесь пример почему-то не обрезает выбираемые варианты звуков по длительности 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 krapotkin Опубликовано 20 апреля, 2017 Поделиться Опубликовано 20 апреля, 2017 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 Rusland, Kitty, Равиль Зарипов (ZuBy) и 1 другой 4 Цитата Ссылка на комментарий
0 Mazzay Опубликовано 20 апреля, 2017 Автор Поделиться Опубликовано 20 апреля, 2017 (изменено) Спасибо большое! На Билдере получилось так: #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 надо как-то уничтожать. Хотя, это интерфейс… Изменено 20 апреля, 2017 пользователем Mazzay Kitty 1 Цитата Ссылка на комментарий
0 Mazzay Опубликовано 27 апреля, 2017 Автор Поделиться Опубликовано 27 апреля, 2017 (изменено) Многократное щёлканье получилось вот так. В объявлении класса: #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 Изменено 27 апреля, 2017 пользователем Mazzay Rusland 1 Цитата Ссылка на комментарий
Вопрос
Mazzay
Не хочу добавлять компоненты и аудио-файлы в проект ради обычного воспроизведения коротенького щелчка.
Никак не могу найти. Android API позволяет воспроизвести просто звук нужной длительности и частоты?
Ссылка на комментарий
4 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.