> Note also that in order to use this feature the encoder needs to be configured
> with `SetInBandFEC(true)` and `SetPacketLossPerc(x)` options.
-### Streams (and files)
+### Streams (and Files)
To decode a .opus file (or .ogg with Opus data), or to decode a "Opus stream"
(which is a Ogg stream with Opus data), use the `Stream` interface. It wraps an
For more examples, see the `_test.go` files.
-## Build & installation
+## Build & Installation
This package requires libopus and libopusfile development packages to be
installed on your system. These are available on Debian based systems from
brew install pkg-config opus opusfile
```
+### Building Without `libopusfile`
+
+This package can be built without `libopusfile` by using the build tag `nolibopusfile`.
+This enables the compilation of statically-linked binaries with no external
+dependencies on operating systems without a static `libopusfile`, such as
+[Alpine Linux](https://pkgs.alpinelinux.org/contents?branch=edge&name=opusfile-dev&arch=x86_64&repo=main).
+
+**Note:** this will disable all file and `Stream` APIs.
+
+To enable this feature, add `-tags nolibopusfile` to your `go build` or `go test` commands:
+
+```sh
+# Build
+go build -tags nolibopusfile ...
+
+# Test
+go test -tags nolibopusfile ./...
+```
+
### Using in Docker
If your Dockerized app has this library as a dependency (directly or
+// +build !nolibopusfile
+
// Copyright © Go Opus Authors (see AUTHORS file)
//
// License for use of this code is detailed in the LICENSE file
)
/*
-#cgo pkg-config: opus opusfile
+#cgo pkg-config: opus
#include <opus.h>
-#include <opusfile.h>
*/
import "C"
func (e Error) Error() string {
return fmt.Sprintf("opus: %s", C.GoString(C.opus_strerror(C.int(e))))
}
-
-type StreamError int
-
-var _ error = StreamError(0)
-
-// Libopusfile errors. The names are copied verbatim from the libopusfile
-// library.
-const (
- ErrStreamFalse = StreamError(C.OP_FALSE)
- ErrStreamEOF = StreamError(C.OP_EOF)
- ErrStreamHole = StreamError(C.OP_HOLE)
- ErrStreamRead = StreamError(C.OP_EREAD)
- ErrStreamFault = StreamError(C.OP_EFAULT)
- ErrStreamImpl = StreamError(C.OP_EIMPL)
- ErrStreamInval = StreamError(C.OP_EINVAL)
- ErrStreamNotFormat = StreamError(C.OP_ENOTFORMAT)
- ErrStreamBadHeader = StreamError(C.OP_EBADHEADER)
- ErrStreamVersion = StreamError(C.OP_EVERSION)
- ErrStreamNotAudio = StreamError(C.OP_ENOTAUDIO)
- ErrStreamBadPacked = StreamError(C.OP_EBADPACKET)
- ErrStreamBadLink = StreamError(C.OP_EBADLINK)
- ErrStreamNoSeek = StreamError(C.OP_ENOSEEK)
- ErrStreamBadTimestamp = StreamError(C.OP_EBADTIMESTAMP)
-)
-
-func (i StreamError) Error() string {
- switch i {
- case ErrStreamFalse:
- return "OP_FALSE"
- case ErrStreamEOF:
- return "OP_EOF"
- case ErrStreamHole:
- return "OP_HOLE"
- case ErrStreamRead:
- return "OP_EREAD"
- case ErrStreamFault:
- return "OP_EFAULT"
- case ErrStreamImpl:
- return "OP_EIMPL"
- case ErrStreamInval:
- return "OP_EINVAL"
- case ErrStreamNotFormat:
- return "OP_ENOTFORMAT"
- case ErrStreamBadHeader:
- return "OP_EBADHEADER"
- case ErrStreamVersion:
- return "OP_EVERSION"
- case ErrStreamNotAudio:
- return "OP_ENOTAUDIO"
- case ErrStreamBadPacked:
- return "OP_EBADPACKET"
- case ErrStreamBadLink:
- return "OP_EBADLINK"
- case ErrStreamNoSeek:
- return "OP_ENOSEEK"
- case ErrStreamBadTimestamp:
- return "OP_EBADTIMESTAMP"
- default:
- return "libopusfile error: %d (unknown code)"
- }
-}
//
// License for use of this code is detailed in the LICENSE file
+// +build !nolibopusfile
+
package opus
import (
--- /dev/null
+// Copyright © 2015-2017 Go Opus Authors (see AUTHORS file)
+//
+// License for use of this code is detailed in the LICENSE file
+
+// +build !nolibopusfile
+
+package opus
+
+/*
+#cgo pkg-config: opusfile
+#include <opusfile.h>
+*/
+import "C"
+
+// StreamError represents an error from libopusfile.
+type StreamError int
+
+var _ error = StreamError(0)
+
+// Libopusfile errors. The names are copied verbatim from the libopusfile
+// library.
+const (
+ ErrStreamFalse = StreamError(C.OP_FALSE)
+ ErrStreamEOF = StreamError(C.OP_EOF)
+ ErrStreamHole = StreamError(C.OP_HOLE)
+ ErrStreamRead = StreamError(C.OP_EREAD)
+ ErrStreamFault = StreamError(C.OP_EFAULT)
+ ErrStreamImpl = StreamError(C.OP_EIMPL)
+ ErrStreamInval = StreamError(C.OP_EINVAL)
+ ErrStreamNotFormat = StreamError(C.OP_ENOTFORMAT)
+ ErrStreamBadHeader = StreamError(C.OP_EBADHEADER)
+ ErrStreamVersion = StreamError(C.OP_EVERSION)
+ ErrStreamNotAudio = StreamError(C.OP_ENOTAUDIO)
+ ErrStreamBadPacked = StreamError(C.OP_EBADPACKET)
+ ErrStreamBadLink = StreamError(C.OP_EBADLINK)
+ ErrStreamNoSeek = StreamError(C.OP_ENOSEEK)
+ ErrStreamBadTimestamp = StreamError(C.OP_EBADTIMESTAMP)
+)
+
+func (i StreamError) Error() string {
+ switch i {
+ case ErrStreamFalse:
+ return "OP_FALSE"
+ case ErrStreamEOF:
+ return "OP_EOF"
+ case ErrStreamHole:
+ return "OP_HOLE"
+ case ErrStreamRead:
+ return "OP_EREAD"
+ case ErrStreamFault:
+ return "OP_EFAULT"
+ case ErrStreamImpl:
+ return "OP_EIMPL"
+ case ErrStreamInval:
+ return "OP_EINVAL"
+ case ErrStreamNotFormat:
+ return "OP_ENOTFORMAT"
+ case ErrStreamBadHeader:
+ return "OP_EBADHEADER"
+ case ErrStreamVersion:
+ return "OP_EVERSION"
+ case ErrStreamNotAudio:
+ return "OP_ENOTAUDIO"
+ case ErrStreamBadPacked:
+ return "OP_EBADPACKET"
+ case ErrStreamBadLink:
+ return "OP_EBADLINK"
+ case ErrStreamNoSeek:
+ return "OP_ENOSEEK"
+ case ErrStreamBadTimestamp:
+ return "OP_EBADTIMESTAMP"
+ default:
+ return "libopusfile error: %d (unknown code)"
+ }
+}
//
// License for use of this code is detailed in the LICENSE file
+// +build !nolibopusfile
+
package opus
import (
//
// License for use of this code is detailed in the LICENSE file
+// +build !nolibopusfile
+
package opus
import (