Implement read callbacks for encoder
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
75c5c45579
commit
3057bde44c
12
callbacks.c
12
callbacks.c
|
@ -42,6 +42,18 @@ decoderReadCallback_cgo(const FLAC__StreamDecoder *decoder,
|
||||||
bytes, data);
|
bytes, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FLAC__StreamEncoderReadStatus
|
||||||
|
encoderReadCallback_cgo(const FLAC__StreamEncoder *encoder,
|
||||||
|
const FLAC__byte buffer[],
|
||||||
|
size_t *bytes,
|
||||||
|
void *data)
|
||||||
|
{
|
||||||
|
return encoderReadCallback((FLAC__StreamEncoder *)encoder,
|
||||||
|
(FLAC__byte *)buffer, bytes, data);
|
||||||
|
}
|
||||||
|
|
||||||
FLAC__StreamEncoderWriteStatus
|
FLAC__StreamEncoderWriteStatus
|
||||||
encoderWriteCallback_cgo(const FLAC__StreamEncoder *encoder,
|
encoderWriteCallback_cgo(const FLAC__StreamEncoder *encoder,
|
||||||
const FLAC__byte buffer[],
|
const FLAC__byte buffer[],
|
||||||
|
|
35
libflac.go
35
libflac.go
|
@ -45,6 +45,12 @@ decoderReadCallback_cgo(const FLAC__StreamDecoder *,
|
||||||
size_t *,
|
size_t *,
|
||||||
void *);
|
void *);
|
||||||
|
|
||||||
|
FLAC__StreamEncoderReadStatus
|
||||||
|
encoderReadCallback_cgo(const FLAC__StreamEncoder *encoder,
|
||||||
|
const FLAC__byte *,
|
||||||
|
size_t *,
|
||||||
|
void *);
|
||||||
|
|
||||||
FLAC__StreamEncoderWriteStatus
|
FLAC__StreamEncoderWriteStatus
|
||||||
encoderWriteCallback_cgo(const FLAC__StreamEncoder *,
|
encoderWriteCallback_cgo(const FLAC__StreamEncoder *,
|
||||||
const FLAC__byte *,
|
const FLAC__byte *,
|
||||||
|
@ -423,6 +429,29 @@ func NewEncoderOgg(name string, channels int, depth int, rate int) (e *Encoder,
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//export encoderReadCallback
|
||||||
|
func encoderReadCallback(e *C.FLAC__StreamEncoder, buffer *C.FLAC__byte, bytes *C.size_t, data unsafe.Pointer) C.FLAC__StreamEncoderReadStatus {
|
||||||
|
encoder := encoderPtrs.get(e)
|
||||||
|
numBytes := int(*bytes)
|
||||||
|
if numBytes <= 0 {
|
||||||
|
return C.FLAC__STREAM_ENCODER_READ_STATUS_ABORT
|
||||||
|
}
|
||||||
|
hdr := reflect.SliceHeader{
|
||||||
|
Data: uintptr(unsafe.Pointer(buffer)),
|
||||||
|
Len: numBytes,
|
||||||
|
Cap: numBytes,
|
||||||
|
}
|
||||||
|
buf := *(*[]byte)(unsafe.Pointer(&hdr))
|
||||||
|
n, err := encoder.writeSeeker.(io.Reader).Read(buf)
|
||||||
|
*bytes = C.size_t(n)
|
||||||
|
if err == io.EOF && n == 0 {
|
||||||
|
return C.FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM
|
||||||
|
} else if err != nil && err != io.EOF {
|
||||||
|
return C.FLAC__STREAM_ENCODER_READ_STATUS_ABORT
|
||||||
|
}
|
||||||
|
return C.FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE
|
||||||
|
}
|
||||||
|
|
||||||
//export encoderWriteCallback
|
//export encoderWriteCallback
|
||||||
func encoderWriteCallback(e *C.FLAC__StreamEncoder, buffer *C.FLAC__byte, bytes C.size_t, samples, current_frame C.unsigned, data unsafe.Pointer) C.FLAC__StreamEncoderWriteStatus {
|
func encoderWriteCallback(e *C.FLAC__StreamEncoder, buffer *C.FLAC__byte, bytes C.size_t, samples, current_frame C.unsigned, data unsafe.Pointer) C.FLAC__StreamEncoderWriteStatus {
|
||||||
encoder := encoderPtrs.get(e)
|
encoder := encoderPtrs.get(e)
|
||||||
|
@ -514,6 +543,10 @@ func NewEncoderWriteSeeker(writer FlacWriter, channels int, depth int, rate int,
|
||||||
|
|
||||||
// NewEncoderWriteSeekerOgg creates a new Encoder object from a FlacWriter.
|
// NewEncoderWriteSeekerOgg creates a new Encoder object from a FlacWriter.
|
||||||
func NewEncoderWriteSeekerOgg(writer FlacWriter, channels int, depth int, rate int, compressionLevel int, streamable bool, blockSize int) (e *Encoder, err error) {
|
func NewEncoderWriteSeekerOgg(writer FlacWriter, channels int, depth int, rate int, compressionLevel int, streamable bool, blockSize int) (e *Encoder, err error) {
|
||||||
|
if _, ok := writer.(io.Reader); !ok {
|
||||||
|
return nil, errors.New("writer must also implement io.Reader")
|
||||||
|
}
|
||||||
|
|
||||||
if channels == 0 {
|
if channels == 0 {
|
||||||
return nil, errors.New("channels must be greater than 0")
|
return nil, errors.New("channels must be greater than 0")
|
||||||
}
|
}
|
||||||
|
@ -541,6 +574,7 @@ func NewEncoderWriteSeekerOgg(writer FlacWriter, channels int, depth int, rate i
|
||||||
C.FLAC__stream_encoder_set_streamable_subset(e.e, C.FLAC__bool(0))
|
C.FLAC__stream_encoder_set_streamable_subset(e.e, C.FLAC__bool(0))
|
||||||
}
|
}
|
||||||
status := C.FLAC__stream_encoder_init_ogg_stream(e.e,
|
status := C.FLAC__stream_encoder_init_ogg_stream(e.e,
|
||||||
|
(C.FLAC__StreamEncoderReadCallback)(unsafe.Pointer(C.encoderReadCallback_cgo)),
|
||||||
(C.FLAC__StreamEncoderWriteCallback)(unsafe.Pointer(C.encoderWriteCallback_cgo)),
|
(C.FLAC__StreamEncoderWriteCallback)(unsafe.Pointer(C.encoderWriteCallback_cgo)),
|
||||||
(C.FLAC__StreamEncoderSeekCallback)(unsafe.Pointer(C.encoderSeekCallback_cgo)),
|
(C.FLAC__StreamEncoderSeekCallback)(unsafe.Pointer(C.encoderSeekCallback_cgo)),
|
||||||
(C.FLAC__StreamEncoderTellCallback)(unsafe.Pointer(C.encoderTellCallback_cgo)),
|
(C.FLAC__StreamEncoderTellCallback)(unsafe.Pointer(C.encoderTellCallback_cgo)),
|
||||||
|
@ -621,6 +655,7 @@ func NewEncoderWriterOgg(writer io.WriteCloser, channels int, depth int, rate in
|
||||||
C.FLAC__stream_encoder_set_streamable_subset(e.e, C.FLAC__bool(0))
|
C.FLAC__stream_encoder_set_streamable_subset(e.e, C.FLAC__bool(0))
|
||||||
}
|
}
|
||||||
status := C.FLAC__stream_encoder_init_ogg_stream(e.e,
|
status := C.FLAC__stream_encoder_init_ogg_stream(e.e,
|
||||||
|
nil,
|
||||||
(C.FLAC__StreamEncoderWriteCallback)(unsafe.Pointer(C.encoderWriteCallback_cgo)),
|
(C.FLAC__StreamEncoderWriteCallback)(unsafe.Pointer(C.encoderWriteCallback_cgo)),
|
||||||
nil,
|
nil,
|
||||||
nil,
|
nil,
|
||||||
|
|
Loading…
Reference in a new issue