]>
Commit | Line | Data |
---|---|---|
1 | package Audio::Opusfile; | |
2 | ||
3 | use 5.014000; | |
4 | use strict; | |
5 | use warnings; | |
6 | use Carp; | |
7 | ||
8 | use parent qw/Exporter/; | |
9 | use AutoLoader; | |
10 | ||
11 | my @constants = | |
12 | qw/OPUS_CHANNEL_COUNT_MAX | |
13 | OP_ABSOLUTE_GAIN | |
14 | OP_DEC_FORMAT_FLOAT | |
15 | OP_DEC_FORMAT_SHORT | |
16 | OP_DEC_USE_DEFAULT | |
17 | OP_EBADHEADER | |
18 | OP_EBADLINK | |
19 | OP_EBADPACKET | |
20 | OP_EBADTIMESTAMP | |
21 | OP_EFAULT | |
22 | OP_EIMPL | |
23 | OP_EINVAL | |
24 | OP_ENOSEEK | |
25 | OP_ENOTAUDIO | |
26 | OP_ENOTFORMAT | |
27 | OP_EOF | |
28 | OP_EREAD | |
29 | OP_EVERSION | |
30 | OP_FALSE | |
31 | OP_GET_SERVER_INFO_REQUEST | |
32 | OP_HEADER_GAIN | |
33 | OP_HOLE | |
34 | OP_HTTP_PROXY_HOST_REQUEST | |
35 | OP_HTTP_PROXY_PASS_REQUEST | |
36 | OP_HTTP_PROXY_PORT_REQUEST | |
37 | OP_HTTP_PROXY_USER_REQUEST | |
38 | OP_PIC_FORMAT_GIF | |
39 | OP_PIC_FORMAT_JPEG | |
40 | OP_PIC_FORMAT_PNG | |
41 | OP_PIC_FORMAT_UNKNOWN | |
42 | OP_PIC_FORMAT_URL | |
43 | OP_SSL_SKIP_CERTIFICATE_CHECK_REQUEST | |
44 | OP_TRACK_GAIN/; | |
45 | ||
46 | our @EXPORT_OK = @constants; | |
47 | our @EXPORT = @constants; | |
48 | ||
49 | our $VERSION = '0.003'; | |
50 | ||
51 | sub AUTOLOAD { | |
52 | # This AUTOLOAD is used to 'autoload' constants from the constant() | |
53 | # XS function. | |
54 | ||
55 | my $constname; | |
56 | our $AUTOLOAD; | |
57 | ($constname = $AUTOLOAD) =~ s/.*:://; | |
58 | croak "&Audio::Opusfile::constant not defined" if $constname eq 'constant'; | |
59 | my ($error, $val) = constant($constname); | |
60 | if ($error) { croak $error; } | |
61 | { | |
62 | no strict 'refs'; | |
63 | # Fixed between 5.005_53 and 5.005_61 | |
64 | #XXX if ($] >= 5.00561) { | |
65 | #XXX *$AUTOLOAD = sub () { $val }; | |
66 | #XXX } | |
67 | #XXX else { | |
68 | *$AUTOLOAD = sub { $val }; | |
69 | #XXX } | |
70 | } | |
71 | goto &$AUTOLOAD; | |
72 | } | |
73 | ||
74 | require XSLoader; | |
75 | XSLoader::load('Audio::Opusfile', $VERSION); | |
76 | require Audio::Opusfile::Tags; | |
77 | require Audio::Opusfile::PictureTag; | |
78 | ||
79 | # Preloaded methods go here. | |
80 | ||
81 | sub new_from_file { | |
82 | my ($class, $file) = @_; | |
83 | open_file($file) | |
84 | } | |
85 | ||
86 | sub new_from_memory { | |
87 | my ($class, $buf) = @_; | |
88 | open_memory($buf) | |
89 | } | |
90 | ||
91 | 1; | |
92 | __END__ | |
93 | ||
94 | =encoding utf-8 | |
95 | ||
96 | =head1 NAME | |
97 | ||
98 | Audio::Opusfile - Very incomplete interface to the libopusfile Ogg Opus library | |
99 | ||
100 | =head1 SYNOPSIS | |
101 | ||
102 | use Audio::Opusfile; | |
103 | my $of = Audio::Opusfile->new_from_file('silence.opus'); | |
104 | my $tags = $of->tags; | |
105 | say $tags->query('TITLE'); # Cellule | |
106 | ||
107 | =head1 DESCRIPTION | |
108 | ||
109 | Opus is a totally open, royalty-free, highly versatile audio codec. | |
110 | Opus is unmatched for interactive speech and music transmission over | |
111 | the Internet, but is also intended for storage and streaming | |
112 | applications. It is standardized by the Internet Engineering Task | |
113 | Force (IETF) as RFC 6716 which incorporated technology from Skype's | |
114 | SILK codec and Xiph.Org's CELT codec. | |
115 | ||
116 | libopusfile is a library for decoding and basic manipulation of Ogg | |
117 | Opus files. | |
118 | ||
119 | Audio::Opusfile is an interface to libopusfile. At the moment its only | |
120 | function is reading metadata and tags from an Ogg Opus file or buffer. | |
121 | Future versions will give access to a larger part of the libopusfile | |
122 | API. | |
123 | ||
124 | Expect the API to change in future versions. | |
125 | ||
126 | =head1 METHODS | |
127 | ||
128 | =over | |
129 | ||
130 | =item Audio::Opusfile->B<new_from_file>(I<$file>) | |
131 | ||
132 | Creates a new Audio::Opusfile object from an Ogg Opus file. | |
133 | ||
134 | Dies if the given file does not exist or is not a valid Ogg Opus file. | |
135 | ||
136 | =item Audio::Opusfile->B<new_from_memory>(I<$buffer>) | |
137 | ||
138 | Creates a new Audio::Opusfile object from a buffer containing Ogg Opus | |
139 | data. | |
140 | ||
141 | Dies if the given buffer does not contain valid data. | |
142 | ||
143 | =item Audio::Opusfile::test(I<$buffer>) | |
144 | ||
145 | Returns true if the given buffer looks like the beginning of a valid | |
146 | Ogg Opus file, false otherwise. | |
147 | ||
148 | Dies if the given buffer does not have sufficient data to tell if it | |
149 | is an Opus stream or if it looks like a Opus stream but parsing it | |
150 | failed. | |
151 | ||
152 | =item B<$of>->head | |
153 | ||
154 | Returns an L<Audio::Opusfile::Head> object corresponding to the file. | |
155 | ||
156 | =item B<$of>->tags | |
157 | ||
158 | Returns an L<Audio::Opusfile::Tags> object corresponding to the file. | |
159 | ||
160 | =item B<$of>->seekable | |
161 | ||
162 | Returns whether or not the data source being read is seekable. | |
163 | ||
164 | =item B<$of>->link_count | |
165 | ||
166 | Returns the number of links in this chained stream. Always returns 1 | |
167 | for unseekable sources. | |
168 | ||
169 | =item B<$of>->serialno([I<$link_index>]) | |
170 | ||
171 | Get the serial number of the given link in a (possibly-chained) Ogg | |
172 | Opus stream. If the given index is greater than the total number of | |
173 | links, this returns the serial number of the last link. | |
174 | ||
175 | If the source is not seekable, I<$link_index> is negative, or | |
176 | I<$link_index> is not given, then this function returns the serial | |
177 | number of the current link. | |
178 | ||
179 | =back | |
180 | ||
181 | =head1 EXPORT | |
182 | ||
183 | All constants are exported by default: | |
184 | ||
185 | OPUS_CHANNEL_COUNT_MAX | |
186 | OP_ABSOLUTE_GAIN | |
187 | OP_DEC_FORMAT_FLOAT | |
188 | OP_DEC_FORMAT_SHORT | |
189 | OP_DEC_USE_DEFAULT | |
190 | OP_EBADHEADER | |
191 | OP_EBADLINK | |
192 | OP_EBADPACKET | |
193 | OP_EBADTIMESTAMP | |
194 | OP_EFAULT | |
195 | OP_EIMPL | |
196 | OP_EINVAL | |
197 | OP_ENOSEEK | |
198 | OP_ENOTAUDIO | |
199 | OP_ENOTFORMAT | |
200 | OP_EOF | |
201 | OP_EREAD | |
202 | OP_EVERSION | |
203 | OP_FALSE | |
204 | OP_GET_SERVER_INFO_REQUEST | |
205 | OP_HEADER_GAIN | |
206 | OP_HOLE | |
207 | OP_HTTP_PROXY_HOST_REQUEST | |
208 | OP_HTTP_PROXY_PASS_REQUEST | |
209 | OP_HTTP_PROXY_PORT_REQUEST | |
210 | OP_HTTP_PROXY_USER_REQUEST | |
211 | OP_PIC_FORMAT_GIF | |
212 | OP_PIC_FORMAT_JPEG | |
213 | OP_PIC_FORMAT_PNG | |
214 | OP_PIC_FORMAT_UNKNOWN | |
215 | OP_PIC_FORMAT_URL | |
216 | OP_SSL_SKIP_CERTIFICATE_CHECK_REQUEST | |
217 | OP_TRACK_GAIN | |
218 | ||
219 | ||
220 | =head1 SEE ALSO | |
221 | ||
222 | L<Audio::Opusfile::Tags>, | |
223 | L<http://opus-codec.org/>, | |
224 | L<http://opus-codec.org/docs/opusfile_api-0.7/index.html> | |
225 | ||
226 | =head1 AUTHOR | |
227 | ||
228 | Marius Gavrilescu, E<lt>marius@ieval.roE<gt> | |
229 | ||
230 | =head1 COPYRIGHT AND LICENSE | |
231 | ||
232 | Copyright (C) 2016 by Marius Gavrilescu | |
233 | ||
234 | This library is free software; you can redistribute it and/or modify | |
235 | it under the same terms as Perl itself, either Perl version 5.24.0 or, | |
236 | at your option, any later version of Perl 5 you may have available. | |
237 | ||
238 | ||
239 | =cut |