Может быть, ваша задержка может также представлять время для распаковки данных MP3? Если ваши данные достаточно малы для циклического воспроизведения, можете ли вы использовать API для распаковки MP3 в PCM, а затем просто передать эти несжатые данные в AL?
Другой вариант: вам не нужно использовать только один буфер. Вы можете поставить их в очередь с помощью alSourceQueueBuffers (). При такой потоковой передаче AL может сразу перейти от конца одного буфера к началу следующего. Таким образом, вы можете поставить в очередь данные из двух или трех буферов, затем опросить источник, чтобы увидеть, когда был использован первый, и поставить в очередь другой. По сути, это сделает вас ответственным за зацикливание.