]> Sergey Matveev's repositories - go-opus.git/commitdiff
Access preprocessor defines from CGO
authorHraban Luyat <hraban@0brg.net>
Mon, 13 Jul 2015 16:15:26 +0000 (17:15 +0100)
committerHraban Luyat <hraban@0brg.net>
Mon, 13 Jul 2015 16:15:26 +0000 (17:15 +0100)
Hack involves assigning the preprocessor defines to const values and
then accessing those through CGO.

errors.go
opus.go

index 4514ae0bc7acaf9acf675cb42928c20ba0f262a3..f3f606dd319b1cf96cfa0960badf8e06a019c0e0 100644 (file)
--- a/errors.go
+++ b/errors.go
@@ -5,8 +5,26 @@ import (
 )
 
 /*
-#cgo CFLAGS: -std=c99 -Wall -Werror -pedantic -Ibuild/include
+#cgo CFLAGS: -std=c99 -Wall -Werror -pedantic -Ibuild/include -Ibuild/include/opus
 #include <opus/opus.h>
+#include <opusfile.h>
+
+// Access the preprocessor from CGO
+const int CONST_OP_FALSE = OP_FALSE;
+const int CONST_OP_EOF = OP_EOF;
+const int CONST_OP_HOLE = OP_HOLE;
+const int CONST_OP_EREAD = OP_EREAD;
+const int CONST_OP_EFAULT = OP_EFAULT;
+const int CONST_OP_EIMPL = OP_EIMPL;
+const int CONST_OP_EINVAL = OP_EINVAL;
+const int CONST_OP_ENOTFORMAT = OP_ENOTFORMAT;
+const int CONST_OP_EBADHEADER = OP_EBADHEADER;
+const int CONST_OP_EVERSION = OP_EVERSION;
+const int CONST_OP_ENOTAUDIO = OP_ENOTAUDIO;
+const int CONST_OP_EBADPACKET = OP_EBADPACKET;
+const int CONST_OP_EBADLINK = OP_EBADLINK;
+const int CONST_OP_ENOSEEK = OP_ENOSEEK;
+const int CONST_OP_EBADTIMESTAMP = OP_EBADTIMESTAMP;
 */
 import "C"
 
@@ -14,22 +32,22 @@ type opusFileError int
 
 var opusfileErrcodes = map[C.int]error{}
 
-const (
-       ERR_OP_FALSE         opusFileError = -1
-       ERR_OP_EOF                         = -2
-       ERR_OP_HOLE                        = -3
-       ERR_OP_EREAD                       = -128
-       ERR_OP_EFAULT                      = -129
-       ERR_OP_EIMPL                       = -130
-       ERR_OP_EINVAL                      = -131
-       ERR_OP_ENOTFORMAT                  = -132
-       ERR_OP_EBADHEADER                  = -133
-       ERR_OP_EVERSION                    = -134
-       ERR_OP_ENOTAUDIO                   = -135
-       ERR_OP_EBADPACKET                  = -136
-       ERR_OP_EBADLINK                    = -137
-       ERR_OP_ENOSEEK                     = -138
-       ERR_OP_EBADTIMESTAMP               = -139
+var (
+       ERR_OP_FALSE         = opusFileError(C.CONST_OP_FALSE)
+       ERR_OP_EOF           = opusFileError(C.CONST_OP_EOF)
+       ERR_OP_HOLE          = opusFileError(C.CONST_OP_HOLE)
+       ERR_OP_EREAD         = opusFileError(C.CONST_OP_EREAD)
+       ERR_OP_EFAULT        = opusFileError(C.CONST_OP_EFAULT)
+       ERR_OP_EIMPL         = opusFileError(C.CONST_OP_EIMPL)
+       ERR_OP_EINVAL        = opusFileError(C.CONST_OP_EINVAL)
+       ERR_OP_ENOTFORMAT    = opusFileError(C.CONST_OP_ENOTFORMAT)
+       ERR_OP_EBADHEADER    = opusFileError(C.CONST_OP_EBADHEADER)
+       ERR_OP_EVERSION      = opusFileError(C.CONST_OP_EVERSION)
+       ERR_OP_ENOTAUDIO     = opusFileError(C.CONST_OP_ENOTAUDIO)
+       ERR_OP_EBADPACKET    = opusFileError(C.CONST_OP_EBADPACKET)
+       ERR_OP_EBADLINK      = opusFileError(C.CONST_OP_EBADLINK)
+       ERR_OP_ENOSEEK       = opusFileError(C.CONST_OP_ENOSEEK)
+       ERR_OP_EBADTIMESTAMP = opusFileError(C.CONST_OP_EBADTIMESTAMP)
 )
 
 func (i opusFileError) Error() string {
diff --git a/opus.go b/opus.go
index 47caf59c74f8dbc90da8d99f7473610a653d135f..3d6fc6da3d966ca35c56c4c904a2d284008045ca 100644 (file)
--- a/opus.go
+++ b/opus.go
@@ -17,20 +17,25 @@ package opus
 #cgo LDFLAGS: libopusfile.a libopus.a -logg -lm
 #cgo CFLAGS: -std=c99 -Wall -Werror -pedantic -Ibuild/include
 #include <opus/opus.h>
+
+// Remap #defines to avoid depending on their literal value
+const int CONST_APPLICATION_VOIP = OPUS_APPLICATION_VOIP;
+const int CONST_APPLICATION_AUDIO = OPUS_APPLICATION_AUDIO;
+const int CONST_APPLICATION_RESTRICTED_LOWDELAY = OPUS_APPLICATION_RESTRICTED_LOWDELAY;
 */
 import "C"
 
 type Application int
 
-// These constants should be taken from the library instead of defined here.
-// Unfortunatly, they are #defines, and CGO can't import those.
-const (
+// These variables should be constants, but for interoperability with CGO
+// they're var. Don't change them, though!
+var (
        // Optimize encoding for VOIP
-       APPLICATION_VOIP Application = 2048
+       APPLICATION_VOIP = Application(C.CONST_APPLICATION_VOIP)
        // Optimize encoding for non-voice signals like music
-       APPLICATION_AUDIO Application = 2049
+       APPLICATION_AUDIO = Application(C.CONST_APPLICATION_AUDIO)
        // Optimize encoding for low latency applications
-       APPLICATION_RESTRICTED_LOWDELAY Application = 2051
+       APPLICATION_RESTRICTED_LOWDELAY = Application(C.CONST_APPLICATION_RESTRICTED_LOWDELAY)
 )
 
 const (