프로젝트 소개
Oto(v3)는 사운드를 재생하기 위한 저수준 Go 라이브러리입니다. 오디오 하드웨어에 가깝게 위치하도록 설계되어, 디코딩과 상위 수준의 오디오 처리는 호출자에게 맡깁니다.
플랫폼
Oto는 Cgo 없이 Windows, macOS, Linux, FreeBSD, OpenBSD를 지원합니다. 또한 Android, iOS, WebAssembly(Cgo 불필요), Nintendo Switch, Xbox를 지원 대상으로 나열합니다. 일부 플랫폼에서는 Go가 사용할 C/C++ 컴파일러가 PATH에 있어야 하며, 콘솔 대상은 여전히 작동하는 C/C++ 툴체인이 필요할 수 있습니다.
플랫폼 참고 사항
macOS에서는 AudioToolbox.framework가 필요하지만 자동으로 링크됩니다. iOS에서는 AVFoundation.framework와 AudioToolbox.framework를 Xcode 프로젝트의 링크된 프레임워크에 추가해야 합니다. Linux와 BSD에서 Oto는 순수 Go 패키지 github.com/jfreymuth/pulse를 통해 PulseAudio를 사용합니다. PulseAudio 서버를 찾을 수 없으면 PULSE_SERVER 환경 변수를 설정할 수 있습니다. 접근 가능한 PulseAudio 서버가 없으면 Oto는 ALSA로 폴백하며, 이 역시 Cgo가 필요하지 않습니다. libasound.so.2는 런타임에 동적으로 로드되므로 빌드에 ALSA 개발 헤더가 필요하지 않지만, 런타임에는 공유 라이브러리가 있어야 합니다. FreeBSD에서 CGO_ENABLED=0으로 빌드하려면 순수 Go fakecgo 패키지용 gcflags 설정이 추가로 필요하며, Cgo를 활성화한 네이티브 빌드에는 별도 설정이 필요하지 않습니다.
핵심 개념
두 가지 주요 구성 요소는 Context와 Player입니다. Context는 OS 및 오디오 드라이버와의 상호 작용을 처리하며, 프로그램당 하나의 컨텍스트만 존재할 수 있습니다. 컨텍스트에서 임의 개수의 Player를 만들 수 있으며, 각 Player에는 사운드를 나타내는 바이트를 읽는 io.Reader가 주어집니다. 하나의 io.Reader를 여러 Player가 공유해서는 안 됩니다.
사용법
Context 생성은 SampleRate(일반적으로 44100 또는 48000), ChannelCount(모노는 1, 스테레오는 2), Format(예: oto.FormatSignedInt16LE)과 같은 필드를 가진 oto.NewContextOptions를 사용합니다. oto.NewContext는 컨텍스트, ready 채널, 오류를 반환합니다. 호출자는 사용 전에 ready 채널을 기다린 후 컨텍스트 오류를 확인합니다. Player는 otoCtx.NewPlayer(reader)로 생성되며 일시 정지 상태로 시작하고, Play()는 비동기입니다. IsPlaying()을 폴링하여 완료를 기다릴 수 있고, Seek()를 통해 사운드 내 위치를 재조정할 수 있습니다.
사운드는 파일을 바이트 슬라이스로 읽어 bytes.Reader로 감싸 메모리에서 재생하거나, *os.File을 디코더에 직접 전달하여 스트리밍할 수 있습니다. 스트리밍할 때는 파일 객체를 재생이 끝날 때까지 살려 두고 닫지 않아야 하며, 그렇지 않으면 재생 시 잡음이 발생할 수 있습니다.
고급 사용법
Player는 내부 오디오 데이터 버퍼를 유지하므로, io.Reader에서 읽은 바이트가 오디오 장치에서 이미 재생된 것과 반드시 같지는 않습니다. 데이터는 io.Reader에서 내부 버퍼로, 그다음 오디오 장치로 이동하며, 두 번째 단계의 타이밍은 보장되지 않으므로 약간의 지연이 발생할 수 있습니다. Player.BufferedSize()는 버퍼링된 데이터 양을 보고하고, SetBufferSize()는 기본 버퍼 크기를 조정합니다. NewPlayer는 SetBufferSize, Seek와 같은 메서드를 가진 *oto.Player를 반환합니다.
크로스 컴파일
macOS, Windows, Linux, BSD로의 크로스 컴파일은 GOOS를 darwin, windows, linux 또는 해당 BSD 종류로 설정하여 수행합니다. 다른 플랫폼의 경우 대상 아키텍처 라이브러리를 설치하고 CGO_ENABLED=1을 설정해야 합니다. Go는 기본적으로 크로스 컴파일에서 Cgo를 비활성화하기 때문입니다.
Comments
0 people shared their preference · Deer Point appears after 10 participants
Sign in to join the discussion.