Это, наверное, одна из моих собственных ошибок, но я не могу понять, что не так.После попытки повысить производительность моего приложения я переместил буферизацию звука со слоя 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, следовательно, происходит синхронизация).
Есть ли что-то еще, что вызываетошибка сегментации?Возможно, я ответственен за это, но я не могу найти ошибку.