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 "-Wshadow"
55 #include "oggvorbis/vorbisenc.h"
56 #include "oggvorbis/codec.h"
57 #include "oggvorbis/vorbisfile.h"
59 #include "oggvorbis/bitwise.c"
60 #include "oggvorbis/framing.c"
61 #include "oggvorbis/libvorbis-1.3.2/lib/analysis.c"
62 #include "oggvorbis/libvorbis-1.3.2/lib/bitrate.c"
63 #include "oggvorbis/libvorbis-1.3.2/lib/block.c"
64 #include "oggvorbis/libvorbis-1.3.2/lib/codebook.c"
65 #include "oggvorbis/libvorbis-1.3.2/lib/envelope.c"
66 #include "oggvorbis/libvorbis-1.3.2/lib/floor0.c"
67 #include "oggvorbis/libvorbis-1.3.2/lib/floor1.c"
68 #include "oggvorbis/libvorbis-1.3.2/lib/info.c"
69 #include "oggvorbis/libvorbis-1.3.2/lib/lpc.c"
70 #include "oggvorbis/libvorbis-1.3.2/lib/lsp.c"
71 #include "oggvorbis/libvorbis-1.3.2/lib/mapping0.c"
72 #include "oggvorbis/libvorbis-1.3.2/lib/mdct.c"
73 #include "oggvorbis/libvorbis-1.3.2/lib/psy.c"
74 #include "oggvorbis/libvorbis-1.3.2/lib/registry.c"
75 #include "oggvorbis/libvorbis-1.3.2/lib/res0.c"
76 #include "oggvorbis/libvorbis-1.3.2/lib/sharedbook.c"
77 #include "oggvorbis/libvorbis-1.3.2/lib/smallft.c"
78 #include "oggvorbis/libvorbis-1.3.2/lib/synthesis.c"
79 #include "oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c"
80 #include "oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c"
81 #include "oggvorbis/libvorbis-1.3.2/lib/window.c"
86 #pragma clang diagnostic pop
88 #pragma GCC diagnostic pop
91 #include <vorbis/vorbisenc.h>
92 #include <vorbis/codec.h>
93 #include <vorbis/vorbisfile.h>
101static const char*
const oggFormatName =
"Ogg-Vorbis file";
114class OggReader :
public AudioFormatReader
120 usesFloatingPointData =
true;
144 numChannels = (
unsigned int)
info->channels;
146 sampleRate =
info->rate;
148 reservoir.setSize ((
int) numChannels, (
int) jmin (lengthInSamples, (int64) 4096));
167 while (numSamples > 0)
215 for (
int i = jmin ((
int) numChannels,
reservoir.getNumChannels()); --i >= 0;)
248 offset +=
in->getPosition();
250 offset +=
in->getTotalLength();
252 in->setPosition (offset);
263 return (
long)
static_cast<InputStream*
> (
datasource)->getPosition();
267 OggVorbisNamespace::OggVorbis_File
ovFile;
268 OggVorbisNamespace::ov_callbacks callbacks;
272 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (
OggReader)
276class OggWriter :
public AudioFormatWriter
317 output->write (
og.header, (
size_t)
og.header_len);
318 output->write (
og.body, (
size_t)
og.body_len);
355 const double gain = 1.0 / 0x80000000u;
358 for (
int i = (
int) numChannels; --i >= 0;)
364 for (
int j = 0;
j < numSamples; ++
j)
395 output->write (
og.header, (
size_t)
og.header_len);
396 output->write (
og.body, (
size_t)
og.body_len);
408 OggVorbisNamespace::ogg_stream_state
os;
409 OggVorbisNamespace::ogg_page
og;
410 OggVorbisNamespace::ogg_packet op;
411 OggVorbisNamespace::vorbis_info
vi;
412 OggVorbisNamespace::vorbis_comment
vc;
413 OggVorbisNamespace::vorbis_dsp_state
vd;
414 OggVorbisNamespace::vorbis_block
vb;
418 auto s = metadata [name];
424 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (
OggWriter)
429OggVorbisAudioFormat::OggVorbisAudioFormat() : AudioFormat (oggFormatName,
".ogg")
433OggVorbisAudioFormat::~OggVorbisAudioFormat()
437Array<int> OggVorbisAudioFormat::getPossibleSampleRates()
439 return { 8000, 11025, 12000, 16000, 22050, 32000,
440 44100, 48000, 88200, 96000, 176400, 192000 };
443Array<int> OggVorbisAudioFormat::getPossibleBitDepths()
448bool OggVorbisAudioFormat::canDoStereo() {
return true; }
449bool OggVorbisAudioFormat::canDoMono() {
return true; }
450bool OggVorbisAudioFormat::isCompressed() {
return true; }
452AudioFormatReader* OggVorbisAudioFormat::createReaderFor (InputStream* in,
bool deleteStreamIfOpeningFails)
454 std::unique_ptr<OggReader> r (
new OggReader (in));
456 if (r->sampleRate > 0)
459 if (! deleteStreamIfOpeningFails)
465AudioFormatWriter* OggVorbisAudioFormat::createWriterFor (OutputStream* out,
467 unsigned int numChannels,
469 const StringPairArray& metadataValues,
470 int qualityOptionIndex)
475 std::unique_ptr<OggWriter> w (
new OggWriter (out, sampleRate, numChannels,
476 (
unsigned int) bitsPerSample,
477 qualityOptionIndex, metadataValues));
479 return w->ok ? w.release() :
nullptr;
482StringArray OggVorbisAudioFormat::getQualityOptions()
484 return {
"64 kbps",
"80 kbps",
"96 kbps",
"112 kbps",
"128 kbps",
"160 kbps",
485 "192 kbps",
"224 kbps",
"256 kbps",
"320 kbps",
"500 kbps" };
488int OggVorbisAudioFormat::estimateOggFileQuality (
const File& source)
490 if (
auto* in = source.createInputStream())
492 if (
auto r = std::unique_ptr<AudioFormatReader> (createReaderFor (in,
true)))
494 auto lengthSecs = r->lengthInSamples / r->sampleRate;
495 auto approxBitsPerSecond = (int) (source.getSize() * 8 / lengthSecs);
497 auto qualities = getQualityOptions();
499 int bestDiff = 10000;
501 for (
int i = qualities.size(); --i >= 0;)
503 auto diff = std::abs (qualities[i].getIntValue() - approxBitsPerSecond);
int size() const noexcept
Returns the current number of elements in the array.
Array()=default
Creates an empty array.
static Random & getSystemRandom() noexcept
The overhead of creating a new Random object is fairly small, but if you want to avoid it,...