32#if JUCE_MAC && ! defined (__MACOSX__)
36namespace OggVorbisNamespace
38#if JUCE_INCLUDE_OGGVORBIS_CODE || ! defined (JUCE_INCLUDE_OGGVORBIS_CODE)
40 #pragma warning (push)
41 #pragma warning (disable: 4267 4127 4244 4996 4100 4701 4702 4013 4133 4206 4305 4189 4706 4995 4365 4456 4457 4459)
43 #pragma clang diagnostic push
44 #pragma clang diagnostic ignored "-Wconversion"
45 #pragma clang diagnostic ignored "-Wshadow"
46 #pragma clang diagnostic ignored "-Wdeprecated-register"
47 #if __has_warning("-Wzero-as-null-pointer-constant")
48 #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
51 #pragma GCC diagnostic push
52 #pragma GCC diagnostic ignored "-Wconversion"
53 #pragma GCC diagnostic ignored "-Wshadow"
54 #pragma GCC diagnostic ignored "-Wsign-conversion"
55 #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
58 #include "oggvorbis/vorbisenc.h"
59 #include "oggvorbis/codec.h"
60 #include "oggvorbis/vorbisfile.h"
62 #include "oggvorbis/bitwise.c"
63 #include "oggvorbis/framing.c"
64 #include "oggvorbis/libvorbis-1.3.2/lib/analysis.c"
65 #include "oggvorbis/libvorbis-1.3.2/lib/bitrate.c"
66 #include "oggvorbis/libvorbis-1.3.2/lib/block.c"
67 #include "oggvorbis/libvorbis-1.3.2/lib/codebook.c"
68 #include "oggvorbis/libvorbis-1.3.2/lib/envelope.c"
69 #include "oggvorbis/libvorbis-1.3.2/lib/floor0.c"
70 #include "oggvorbis/libvorbis-1.3.2/lib/floor1.c"
71 #include "oggvorbis/libvorbis-1.3.2/lib/info.c"
72 #include "oggvorbis/libvorbis-1.3.2/lib/lpc.c"
73 #include "oggvorbis/libvorbis-1.3.2/lib/lsp.c"
74 #include "oggvorbis/libvorbis-1.3.2/lib/mapping0.c"
75 #include "oggvorbis/libvorbis-1.3.2/lib/mdct.c"
76 #include "oggvorbis/libvorbis-1.3.2/lib/psy.c"
77 #include "oggvorbis/libvorbis-1.3.2/lib/registry.c"
78 #include "oggvorbis/libvorbis-1.3.2/lib/res0.c"
79 #include "oggvorbis/libvorbis-1.3.2/lib/sharedbook.c"
80 #include "oggvorbis/libvorbis-1.3.2/lib/smallft.c"
81 #include "oggvorbis/libvorbis-1.3.2/lib/synthesis.c"
82 #include "oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c"
83 #include "oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c"
84 #include "oggvorbis/libvorbis-1.3.2/lib/window.c"
89 #pragma clang diagnostic pop
91 #pragma GCC diagnostic pop
94 #include <vorbis/vorbisenc.h>
95 #include <vorbis/codec.h>
96 #include <vorbis/vorbisfile.h>
104static const char*
const oggFormatName =
"Ogg-Vorbis file";
106const char*
const OggVorbisAudioFormat::encoderName =
"encoder";
107const char*
const OggVorbisAudioFormat::id3title =
"id3title";
108const char*
const OggVorbisAudioFormat::id3artist =
"id3artist";
109const char*
const OggVorbisAudioFormat::id3album =
"id3album";
110const char*
const OggVorbisAudioFormat::id3comment =
"id3comment";
111const char*
const OggVorbisAudioFormat::id3date =
"id3date";
112const char*
const OggVorbisAudioFormat::id3genre =
"id3genre";
113const char*
const OggVorbisAudioFormat::id3trackNumber =
"id3trackNumber";
117class OggReader :
public AudioFormatReader
123 usesFloatingPointData =
true;
147 numChannels = (
unsigned int)
info->channels;
149 sampleRate =
info->rate;
151 reservoir.setSize ((
int) numChannels, (
int) jmin (lengthInSamples, (int64) 4096));
170 while (numSamples > 0)
218 for (
int i = jmin ((
int) numChannels,
reservoir.getNumChannels()); --i >= 0;)
251 offset +=
in->getPosition();
253 offset +=
in->getTotalLength();
255 in->setPosition (offset);
266 return (
long)
static_cast<InputStream*
> (
datasource)->getPosition();
270 OggVorbisNamespace::OggVorbis_File
ovFile;
271 OggVorbisNamespace::ov_callbacks callbacks;
275 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (
OggReader)
279class OggWriter :
public AudioFormatWriter
320 output->write (
og.header, (
size_t)
og.header_len);
321 output->write (
og.body, (
size_t)
og.body_len);
358 const double gain = 1.0 / 0x80000000u;
361 for (
int i = (
int) numChannels; --i >= 0;)
367 for (
int j = 0;
j < numSamples; ++
j)
398 output->write (
og.header, (
size_t)
og.header_len);
399 output->write (
og.body, (
size_t)
og.body_len);
411 OggVorbisNamespace::ogg_stream_state
os;
412 OggVorbisNamespace::ogg_page
og;
413 OggVorbisNamespace::ogg_packet op;
414 OggVorbisNamespace::vorbis_info
vi;
415 OggVorbisNamespace::vorbis_comment
vc;
416 OggVorbisNamespace::vorbis_dsp_state
vd;
417 OggVorbisNamespace::vorbis_block
vb;
427 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (
OggWriter)
432OggVorbisAudioFormat::OggVorbisAudioFormat() : AudioFormat (oggFormatName,
".ogg")
436OggVorbisAudioFormat::~OggVorbisAudioFormat()
440Array<int> OggVorbisAudioFormat::getPossibleSampleRates()
442 return { 8000, 11025, 12000, 16000, 22050, 32000,
443 44100, 48000, 88200, 96000, 176400, 192000 };
446Array<int> OggVorbisAudioFormat::getPossibleBitDepths()
451bool OggVorbisAudioFormat::canDoStereo() {
return true; }
452bool OggVorbisAudioFormat::canDoMono() {
return true; }
453bool OggVorbisAudioFormat::isCompressed() {
return true; }
455AudioFormatReader* OggVorbisAudioFormat::createReaderFor (InputStream* in,
bool deleteStreamIfOpeningFails)
457 std::unique_ptr<OggReader> r (
new OggReader (in));
459 if (r->sampleRate > 0)
462 if (! deleteStreamIfOpeningFails)
468AudioFormatWriter* OggVorbisAudioFormat::createWriterFor (OutputStream* out,
470 unsigned int numChannels,
472 const StringPairArray& metadataValues,
473 int qualityOptionIndex)
478 std::unique_ptr<OggWriter> w (
new OggWriter (out, sampleRate, numChannels,
479 (
unsigned int) bitsPerSample,
480 qualityOptionIndex, metadataValues));
482 return w->ok ? w.release() :
nullptr;
485StringArray OggVorbisAudioFormat::getQualityOptions()
487 return {
"64 kbps",
"80 kbps",
"96 kbps",
"112 kbps",
"128 kbps",
"160 kbps",
488 "192 kbps",
"224 kbps",
"256 kbps",
"320 kbps",
"500 kbps" };
491int OggVorbisAudioFormat::estimateOggFileQuality (
const File& source)
493 if (
auto* in = source.createInputStream())
495 if (
auto r = std::unique_ptr<AudioFormatReader> (createReaderFor (in,
true)))
497 auto lengthSecs = r->lengthInSamples / r->sampleRate;
498 auto approxBitsPerSecond = (int) (source.getSize() * 8 / lengthSecs);
500 auto qualities = getQualityOptions();
502 int bestDiff = 10000;
504 for (
int i = qualities.size(); --i >= 0;)
506 auto diff = std::abs (qualities[i].getIntValue() - approxBitsPerSecond);
int size() const noexcept
static Random & getSystemRandom() noexcept