Проблема с супермощным эквалайзером: звук периодически отключаетсяAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Проблема с супермощным эквалайзером: звук периодически отключается

Сообщение Anonymous »

Я периодически сталкиваюсь с проблемой при использовании библиотеки Superpowered для обработки звука в моем приложении для Android. Я реализую 8-полосный эквалайзер для левого и правого каналов, а также другие эффекты, такие как реверберация. Однако иногда, когда я активирую эквалайзер, звук просто перестает воспроизводиться (становится приглушенным).
Вот краткое описание того, что происходит:
аудиоплеер работает нормально без эквалайзера.
Когда я включаю эквалайзер (как на левом, так и на правом канале), иногда звук работает идеально, но иногда вообще тихо.
Эквалайзер настроен правильно , а начальное усиление для полос во время инициализации установлено на 0 дБ.
Обработка звука выполняется внутри функции audioProcessing, где я применяю эквалайзер и другие эффекты.
Вот фрагмент кода обработки звука:

Код: Выделить всё

static SuperpoweredAndroidAudioIO *audioIO;
static Superpowered::AdvancedAudioPlayer *player;
static SuperpoweredNBandEQ *leftEQ;
static SuperpoweredNBandEQ *rightEQ;
static Superpowered::Waveform *waveform;
static Superpowered::Reverb *reverb;

static const int numberOfBands = 8;
static bool  isProcessStereo = false;

static bool audioProcessing (
void * __unused clientdata,
short int *audio,
int numberOfFrames,
int samplerate
) {

player->outputSamplerate = (unsigned int)samplerate;
float playerOutput[numberOfFrames * 2];  // Buffer intercalado de áudio estéreo

if (player->processStereo(playerOutput, false, (unsigned int)numberOfFrames)) {

reverb->samplerate = samplerate;
reverb->process(playerOutput, playerOutput, numberOfFrames);

float leftChannel[numberOfFrames];
float rightChannel[numberOfFrames];

for (int i = 0; i < numberOfFrames; i++) {
leftChannel[i] = playerOutput[i * 2];      // Canal esquerdo
rightChannel[i] = playerOutput[i * 2 + 1]; // Canal direito
}

// Processar os canais com o equalizador
leftEQ->process(leftChannel, leftChannel, (unsigned int)numberOfFrames);

rightEQ->process(rightChannel, rightChannel, (unsigned int)numberOfFrames);

// Recombinar os canais processados
for (int i = 0; i < numberOfFrames; i++) {
playerOutput[i * 2] = leftChannel[i];
playerOutput[i * 2 + 1] = rightChannel[i];
}

waveform->process(playerOutput, numberOfFrames, -1);
Superpowered::FloatToShortIntInterleave(leftChannel, rightChannel, audio, (unsigned int)numberOfFrames);
isProcessStereo = true;
} else {
isProcessStereo = false;
}

return  isProcessStereo;
}

extern "C"
JNIEXPORT void JNICALL
Java_com_expert_mixer_core_superpowered_SuperpoweredPlayerManager_NativeInit(JNIEnv *env, jobject thiz, jint samplerate,
jint buffersize, jstring tempPath) {
Superpowered::Initialize("ExampleLicenseKey-WillExpire-OnNextUpdate");

const char *str = env->GetStringUTFChars(tempPath, nullptr);
Superpowered::AdvancedAudioPlayer::setTempFolder(str);
env->ReleaseStringUTFChars(tempPath, str);

player = new Superpowered::AdvancedAudioPlayer((unsigned int)samplerate, 0);
waveform = new Superpowered::Waveform(
48000,
0
);

float frequencies[numberOfBands] = {60.0f, 170.0f, 310.0f, 600.0f, 1000.0f, 3000.0f, 6000.0f, 12000.0f};

leftEQ = new SuperpoweredNBandEQ((unsigned int)48000, frequencies);
rightEQ = new SuperpoweredNBandEQ((unsigned int)48000, frequencies);

reverb = new Superpowered::Reverb(48000, 48000);

for (int i = 0; i < numberOfBands;  i++) {
leftEQ->setGainDb(i, 0.0f);
rightEQ->setGainDb(i, 0.0f);
}

audioIO = new SuperpoweredAndroidAudioIO (
samplerate,                     // device native sampling rate
buffersize,                     // device native buffer size
false,                          // enableInput
true,                           // enableOutput
audioProcessing,                // process callback function
nullptr,                           // clientData
-1,                             // inputStreamType (-1 = default)
SL_ANDROID_STREAM_MEDIA         // outputStreamType (-1 = default)
);
}

extern "C"
JNIEXPORT void JNICALL
Java_com_expert_mixer_core_superpowered_SuperpoweredPlayerManager_ToggleEqualizer(JNIEnv *env, jobject thiz, jboolean value) {
leftEQ->enabled = value;
rightEQ->enabled = value;
}
Я уже пробовал следующее:
Сбрасывать усиление эквалайзера каждый раз при инициализации Superpowered.
Убедиться, что эквалайзер включен правильно. перед обработкой звука.
Кто-нибудь сталкивался с этой проблемой или есть предложения, где я могу ошибиться?

Подробнее здесь: https://stackoverflow.com/questions/790 ... rmittently
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»