예제 #1
0
// 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
}
예제 #2
0
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
}
예제 #3
0
파일: mpg123.go 프로젝트: Wessie/audec
// 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
}
예제 #4
0
파일: mp3.go 프로젝트: deepakjois/gomp3
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)
	}
}