X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=Opusfile.xs;h=243795f60cf7d4904ff5bdb46bfb5e3bb7223d84;hb=HEAD;hp=7779aa979526305cb509b379cb3d29682ee96be4;hpb=eed4cab11beebd224a0aaf0193a13e929bef6cfe;p=audio-opusfile.git diff --git a/Opusfile.xs b/Opusfile.xs index 7779aa9..243795f 100644 --- a/Opusfile.xs +++ b/Opusfile.xs @@ -75,6 +75,24 @@ op_serialno(of, li = -1) Audio::Opusfile of; int li; +# op_channel_count is not exported; it can be obtained via op_head + +long +op_raw_total(of, li = -1) + Audio::Opusfile of; + int li; +POSTCALL: + if(RETVAL < 0) + croak("op_current_link returned error %ld\n", RETVAL); + +long +op_pcm_total(of, li = -1) + Audio::Opusfile of; + int li; +POSTCALL: + if(RETVAL < 0) + croak("op_current_link returned error %ld\n", RETVAL); + Audio::Opusfile::Head op_head(of, li = -1) Audio::Opusfile of; @@ -85,6 +103,143 @@ op_tags(of, li = -1) Audio::Opusfile of; int li; +int +op_current_link(of) + Audio::Opusfile of; +POSTCALL: + if(RETVAL < 0) + croak("op_current_link returned error %ld\n", RETVAL); + +int +op_bitrate(of, li = -1) + Audio::Opusfile of; + int li; +POSTCALL: + if(RETVAL < 0) + croak("op_bitrate returned error %ld\n", RETVAL); + +long +op_bitrate_instant(of) + Audio::Opusfile of; +POSTCALL: + if(RETVAL < 0) + croak("op_bitrate_instant returned error %ld\n", RETVAL); + +long +op_raw_tell(of) + Audio::Opusfile of; +POSTCALL: + if(RETVAL < 0) + croak("op_raw_tell returned error %ld\n", RETVAL); + +long +op_pcm_tell(of) + Audio::Opusfile of; +POSTCALL: + if(RETVAL < 0) + croak("op_pcm_tell returned error %ld\n", RETVAL); + +NO_OUTPUT int +op_raw_seek(of, offset) + Audio::Opusfile of; + long offset; +POSTCALL: + if(RETVAL) + croak("op_raw_seek returned error %d\n", RETVAL); + +NO_OUTPUT int +op_pcm_seek(of, offset) + Audio::Opusfile of; + long offset; +POSTCALL: + if(RETVAL) + croak("op_pcm_seek returned error %d\n", RETVAL); + +NO_OUTPUT int +op_set_gain_offset(of, gain_type, gain_offset_q8) + Audio::Opusfile of; + int gain_type; + int gain_offset_q8; +POSTCALL: + if(RETVAL) + croak("op_set_gain_offset returned error %d\n", RETVAL); + +void +op_set_dither_enabled(of, enabled) + Audio::Opusfile of; + int enabled; + + +void +op_read(of, bufsize = 1024 * 1024) + Audio::Opusfile of; + int bufsize; +PREINIT: + opus_int16* buf; + int li, ret, chans, i; +PPCODE: + Newx(buf, bufsize, opus_int16); + ret = op_read(of, buf, bufsize, &li); + if(ret < 0) + croak("op_read returned error %d\n", ret); + chans = op_channel_count(of, li); + EXTEND(SP, chans * ret + 1); + PUSHs(sv_2mortal(newSViv(li))); + for(i = 0 ; i < chans * ret ; i++) + PUSHs(sv_2mortal(newSViv(buf[i]))); + +void +op_read_float(of, bufsize = 1024 * 1024) + Audio::Opusfile of; + int bufsize; +PREINIT: + float* buf; + int li, ret, chans, i; +PPCODE: + Newx(buf, bufsize, float); + ret = op_read_float(of, buf, bufsize, &li); + if(ret < 0) + croak("op_read_float returned error %d\n", ret); + chans = op_channel_count(of, li); + EXTEND(SP, chans * ret + 1); + PUSHs(sv_2mortal(newSViv(li))); + for(i = 0 ; i < chans * ret ; i++) + PUSHs(sv_2mortal(newSVnv(buf[i]))); + +void +op_read_stereo(of, bufsize = 1024 * 1024) + Audio::Opusfile of; + int bufsize; +PREINIT: + opus_int16* buf; + int ret, i; +PPCODE: + Newx(buf, bufsize, opus_int16); + ret = op_read_stereo(of, buf, bufsize); + if(ret < 0) + croak("op_read_stereo returned error %d\n", ret); + EXTEND(SP, 2 * ret); + for(i = 0 ; i < 2 * ret ; i++) + PUSHs(sv_2mortal(newSViv(buf[i]))); + +void +op_read_float_stereo(of, bufsize = 1024 * 1024) + Audio::Opusfile of; + int bufsize; +PREINIT: + float* buf; + int ret, i; +PPCODE: + Newx(buf, bufsize, float); + ret = op_read_float_stereo(of, buf, bufsize); + if(ret < 0) + croak("op_read_float_stereo returned error %d\n", ret); + EXTEND(SP, 2 * ret); + for(i = 0 ; i < 2 * ret ; i++) + PUSHs(sv_2mortal(newSVnv(buf[i]))); + + + MODULE = Audio::Opusfile PACKAGE = Audio::Opusfile::Tags PREFIX = opus_tags_ int @@ -234,6 +389,14 @@ CODE: OUTPUT: RETVAL +int +output_gain(head) + Audio::Opusfile::Head head; +CODE: + RETVAL = head->output_gain; +OUTPUT: + RETVAL + int mapping_family(head) Audio::Opusfile::Head head; @@ -261,8 +424,10 @@ OUTPUT: int mapping(head, k) Audio::Opusfile::Head head; - int k; + unsigned k; CODE: + if(k >= OPUS_CHANNEL_COUNT_MAX) + croak("k must be less than %d\n", (int)OPUS_CHANNEL_COUNT_MAX); RETVAL = (int) head->mapping[k]; OUTPUT: RETVAL