2015-08-31 3 views
2

Я пытаюсь воспроизвести аудио в Go, асинхронно, используя PortAudio. Насколько мне известно, PortAudio обрабатывает собственную поточную передачу, поэтому мне не нужно использовать какие-либо элементы сборки параллельного соединения Go. Я использую libsndfile для загрузки файла (также Go bindings). Вот мой код:PortAudio: отставание воспроизведения по умолчанию для каждого кадра на буфере

type Track struct { 
    stream *portaudio.Stream 
    playhead int 
    buffer []int32 
} 

func LoadTrackFilesize(filename string, loop bool, bytes int) *Track { 
    // Load file 
    var info sndfile.Info 
    soundFile, err := sndfile.Open(filename, sndfile.Read, &info) 
    if err != nil { 
     fmt.Printf("Could not open file: %s\n", filename) 
     panic(err) 
    } 
    buffer := make([]int32, bytes) 
    numRead, err := soundFile.ReadItems(buffer) 
    if err != nil { 
     fmt.Printf("Error reading from file: %s\n", filename) 
     panic(err) 
    } 
    defer soundFile.Close() 

    // Create track 
    track := Track{ 
     buffer: buffer[:numRead], 
    } 

    // Create stream 
    stream, err := portaudio.OpenDefaultStream(
     0, 2, float64(44100), portaudio.FramesPerBufferUnspecified, track.playCallback, 
    ) 
    if err != nil { 
     fmt.Printf("Couldn't get stream for file: %s\n", filename) 
    } 
    track.stream = stream 

    return &track 
} 

func (t *Track) playCallback(out []int32) { 
    for i := range out { 
     out[i] = t.buffer[(t.playhead+i)%len(t.buffer)] 
    } 
    t.playhead += len(out) % len(t.buffer) 
} 

func (t *Track) Play() { 
    t.stream.Start() 
} 

Используя эти функции, после инициализации Portaudio и все остальное, играет звуковую дорожку я поставку - просто. Это очень laggy, и замедляет остальную часть моего приложения (игровой цикл).

Однако, если я изменяю количество кадров на буфер, от FramesPerBufferUnspecified до высокого, скажем, 1024, звук воспроизводится отлично и не мешает остальной части моего приложения.

Почему это? Документация PortAudio предполагает, что использование неопределенного значения будет «выбирать значение для оптимальной задержки», но я определенно этого не вижу.

Кроме того, при воспроизведении с этой очень высокой ценностью я замечаю некоторые незначительные артефакты - маленькие звуковые звуки - в звуке.

Есть ли что-то не так с моей функцией обратного вызова или что-то еще, что может вызвать одну или обе из этих проблем?

Я использую OSX 10.10.5 с Go 1.3.3 и libsndfile и portaudio от Homebrew.

Спасибо.

+0

Я рекомендую обновить до 1.5 и повторить попытку, а затем обновить вопрос, если у вас все еще есть такая же проблема. – OneOfOne

+0

вы можете сделать prof, чтобы узнать «laggy» коды –

+0

@OneOfOne Спасибо, похоже, помогли с первой проблемой - я все равно получаю много этих нечетных звуковых артефактов. –

ответ

1

Переход на комментарий к ответу:

Всегда тест с последней версией Go.

Кроме того, @Joel выяснил, что вам необходимо использовать float32 вместо int32.

 Смежные вопросы

  • Нет связанных вопросов^_^