Родная буферизация аудио - PullRequest
       0

Родная буферизация аудио

1 голос
/ 06 сентября 2011

Это, наверное, одна из моих собственных ошибок, но я не могу понять, что не так.После попытки повысить производительность моего приложения я переместил буферизацию звука со слоя Java на нативный уровень.Обработка аудио (запись / воспроизведение) уже выполняется непосредственно с использованием API OpenSL ES.

Тем не менее, собственная буферизация вызывает сбой моего приложения при каждом его запуске.В качестве буфера я использую простую реализацию Queue, где первый узел - это самые старые данные (FIFO).

struct bufferNode{
    struct bufferNode* next;
    jbyte* data;
};

struct bufferQueue{
    struct bufferNode* first;
    struct bufferNode* last;
    int size;
};

Аудиоданные обозначаются jbyte * в bufferNode.Доступ к очереди осуществляется с помощью этих двух методов и синхронизируется с мьютексом.

void enqueueInBuffer(struct bufferQueue* queue, jbyte* data){
    SLresult result;
    if(queue != NULL){
        if(data != NULL){
            result = pthread_mutex_lock(&recMutex);
            if(result != 0){
                decodeMutexResult(result);
                logErr("EnqueueInBuffer", "Unable to acquire recording mutex");
            } else {
                struct bufferNode* node = (struct bufferNode*)malloc(sizeof(struct bufferNode));
                if(node == NULL){
                    logErr("EnqueueInBuffer", "Insufficient memory available to buffer new audio");
                } else {
                    node->data = data;
                    if(queue->first == NULL){
                        queue->first = queue->last = node;
                    } else {
                        queue->last->next = node;
                        queue->last = node;
                    }
                    queue->size = queue->size + 1;
                    node->next = NULL;
                }
            }
            result = pthread_mutex_unlock(&recMutex);
            if(result != 0){
                decodeMutexResult(result);
                logErr("EnqueueInBuffer", "Unable to release recording mutex");
            }
        } else {
            logErr("EnqueueInBuffer", "Data is NULL");
        }
    } else {
        logErr("EnqueueInBuffer", "Queue is NULL");
    }
}

void dequeueFromBuffer(struct bufferQueue* queue, jbyte* returnData){
    SLresult result;
    result = pthread_mutex_lock(&recMutex);
    if(result != 0){
        decodeMutexResult(result);
        logErr("DequeueFromBuffer", "Unable to acquire recording mutex");
    } else {
        if(queue->first == NULL){
            returnData = NULL;
        } else {
            returnData = queue->first->data;
            struct bufferNode* tmp = queue->first;
            if(queue->first == queue->last){
                queue->first = queue->last = NULL;
            } else {
                queue->first = queue->first->next;
            }
            free(tmp);
            queue->size = queue->size - 1;
        }
    }
    result = pthread_mutex_unlock(&recMutex);
    if(result != 0){
        decodeMutexResult(result);
        logErr("DequeueFromBuffer", "Unable to release recording mutex");
    }
}
  • Где методы регистрации и декодирования являются служебными методами с самообъявлением.Журнал просто записывает сообщение в logcat, в то время как методы декодирования «декодируют» любой возможный номер ошибки из предыдущего вызова метода.

Тем не менее, я продолжаю получать сообщение об ошибке при попытке поставить в очередь аудиоданные.Всякий раз, когда я вызываю метод enqueueInBuffer, я получаю собственную ошибку SIGSEGV с кодом 1 (SEGV_MAPERR).Тем не менее, я не могу найти причину ошибки.И Очередь, и аудиоданные существуют, когда я пытаюсь выполнить вызов метода enqueueInBuffer (который выполняется в обратном вызове OpenSL ES Recorder, следовательно, происходит синхронизация).

Есть ли что-то еще, что вызываетошибка сегментации?Возможно, я ответственен за это, но я не могу найти ошибку.

1 Ответ

1 голос
/ 06 сентября 2011

По-видимому, это было вызвано строкой кода, которая есть в моем обратном вызове OpenSL ES Recorder.

Обратный вызов изначально выглядел так:последняя строка обратного вызова не правильно создала новый индекс.Буферы, которые я использую, находятся в массиве длиной 4.

Изменение последней строки на

queueIndex = (queueIndex + 1) % MAX_RECORDER_BUFFERS;

, кажется, исправило ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...