// Create a new mpg123 decoder instance func NewDecoder(decoder string) (*Decoder, error) { var err C.int var mh *C.mpg123_handle if decoder != "" { mh = C.mpg123_new(nil, &err) } else { cdecoder := C.CString(decoder) defer C.free(unsafe.Pointer(cdecoder)) mh = C.mpg123_new(cdecoder, &err) } if mh == nil { errstring := C.mpg123_plain_strerror(err) defer C.free(unsafe.Pointer(errstring)) return nil, fmt.Errorf("Error initializing mpg123 decoder: %s", errstring) } dec := new(Decoder) dec.handle = mh return dec, nil }
func Open(path string) (*Mp3ReaderSeekerCloser, error) { var errInt C.int handle := C.mpg123_new(nil, &errInt) if err := mpg123Error(errInt); err != nil { return nil, err } cs := C.CString(path) defer C.free(unsafe.Pointer(cs)) if err := mpg123Error(C.mpg123_open(handle, cs)); err != nil { return nil, err } rsc := &Mp3ReaderSeekerCloser{ handle: handle, } runtime.SetFinalizer(rsc, (*Mp3ReaderSeekerCloser).free) return rsc, nil }
// NewDecoder returns a new decoder to be used for decoding mp3 audio data // // The Close method should be called when finished with the decoder so as to // not leak resources. func NewDecoder(r io.Reader) (*Decoder, error) { var e C.int mh := C.mpg123_new(nil, &e) if mh == nil || e != 0 { return nil, toError(e) } err := toError(C.mpg123_open_feed(mh)) if err != nil { return nil, err } C.mpg123_format_none(mh) C.mpg123_format(mh, 44100, C.MPG123_STEREO, C.MPG123_ENC_FLOAT_32) buf := make([]byte, ReadBufferSize) return &Decoder{mh: mh, src: r, buf: buf}, nil }
func DecodeTrack(file string, control chan int) { var v1 *C.mpg123_id3v1 var v2 *C.mpg123_id3v2 m := C.mpg123_new(nil, nil) defer C.mpg123_delete(m) f := C.CString(file) if err := C.mpg123_open(m, f); err != C.MPG123_OK { panic("Error reading file") } defer C.mpg123_close(m) C.mpg123_scan(m) meta := C.mpg123_meta_check(m) if meta == C.MPG123_ID3 && C.mpg123_id3(m, &v1, &v2) == C.MPG123_OK { var title, artist, album, genre string switch false { case v2 == nil: fmt.Println("ID3V2 tag found") title = C.GoString(v2.title.p) artist = C.GoString(v2.artist.p) album = C.GoString(v2.album.p) genre = C.GoString(v2.genre.p) case v1 == nil: fmt.Println("ID3V2 tag found") title = C.GoString(&v1.title[0]) artist = C.GoString(&v1.artist[0]) album = C.GoString(&v1.album[0]) genre = "Unknown" // FIXME convert int to string } fmt.Println(title) fmt.Println(artist) fmt.Println(album) fmt.Println(genre) } default_driver := C.ao_default_driver_id() var format C.ao_sample_format var device *C.ao_device var channels, encoding C.int var rate C.long C.mpg123_getformat(m, &rate, &channels, &encoding) format.bits = 16 format.channels = channels format.rate = C.int(rate) format.byte_format = C.AO_FMT_LITTLE device = C.ao_open_live(default_driver, &format, nil) if device == nil { panic("Error opening device") return } defer C.ao_close(device) var ret C.int var fill C.size_t buf := make([]C.uchar, 1024*16) for { ret = C.mpg123_read(m, (*C.uchar)(unsafe.Pointer(&buf)), 16*1024, &fill) if ret == C.MPG123_DONE { control <- 1 break } C.ao_play(device, (*C.char)(unsafe.Pointer(&buf)), 16*1024) } }