31#if JUCE_MAC && ! defined (__MACOSX__)
37#if JUCE_INCLUDE_OGGVORBIS_CODE || ! defined (JUCE_INCLUDE_OGGVORBIS_CODE)
38 JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4267 4127 4244 4996 4100 4701 4702 4013 4133 4206 4305 4189 4706 4995 4365 4456 4457 4459 6297 6011 6001 6308 6255 6386 6385 6246 6387 6263 6262 28182)
40 JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-
Wcast-align",
57 #include "oggvorbis/vorbisenc.h"
58 #include "oggvorbis/codec.h"
59 #include "oggvorbis/vorbisfile.h"
61 #include "oggvorbis/bitwise.c"
62 #include "oggvorbis/framing.c"
63 #include "oggvorbis/libvorbis-1.3.7/lib/analysis.c"
64 #include "oggvorbis/libvorbis-1.3.7/lib/bitrate.c"
65 #include "oggvorbis/libvorbis-1.3.7/lib/block.c"
66 #include "oggvorbis/libvorbis-1.3.7/lib/codebook.c"
67 #include "oggvorbis/libvorbis-1.3.7/lib/envelope.c"
68 #include "oggvorbis/libvorbis-1.3.7/lib/floor0.c"
69 #include "oggvorbis/libvorbis-1.3.7/lib/floor1.c"
70 #include "oggvorbis/libvorbis-1.3.7/lib/info.c"
71 #include "oggvorbis/libvorbis-1.3.7/lib/lpc.c"
72 #include "oggvorbis/libvorbis-1.3.7/lib/lsp.c"
73 #include "oggvorbis/libvorbis-1.3.7/lib/mapping0.c"
74 #include "oggvorbis/libvorbis-1.3.7/lib/mdct.c"
75 #include "oggvorbis/libvorbis-1.3.7/lib/psy.c"
76 #include "oggvorbis/libvorbis-1.3.7/lib/registry.c"
77 #include "oggvorbis/libvorbis-1.3.7/lib/res0.c"
78 #include "oggvorbis/libvorbis-1.3.7/lib/sharedbook.c"
79 #include "oggvorbis/libvorbis-1.3.7/lib/smallft.c"
80 #include "oggvorbis/libvorbis-1.3.7/lib/synthesis.c"
81 #include "oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c"
82 #include "oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c"
83 #include "oggvorbis/libvorbis-1.3.7/lib/window.c"
86 JUCE_END_IGNORE_WARNINGS_MSVC
87 JUCE_END_IGNORE_WARNINGS_GCC_LIKE
89 #include <vorbis/vorbisenc.h>
90 #include <vorbis/codec.h>
91 #include <vorbis/vorbisfile.h>
118 usesFloatingPointData =
true;
142 numChannels = (
unsigned int) info->channels;
144 sampleRate = (
double) info->rate;
201 for (
int i =
jmin ((
int) numChannels,
reservoir.getNumChannels()); --i >= 0;)
229 return (
size_t) (
static_cast<InputStream*
> (
datasource)->read (ptr, (
int) (
size *
nmemb))) / size;
234 auto* in =
static_cast<InputStream*
> (
datasource);
237 offset += in->getPosition();
239 offset += in->getTotalLength();
241 in->setPosition (offset);
252 return (
long)
static_cast<InputStream*
> (
datasource)->getPosition();
256 OggVorbisNamespace::OggVorbis_File
ovFile;
257 OggVorbisNamespace::ov_callbacks callbacks;
259 Range<int64> bufferedRange;
268 OggWriter (OutputStream* out,
double rate,
306 output->write (
og.header, (
size_t)
og.header_len);
307 output->write (
og.body, (
size_t)
og.body_len);
344 const double gain = 1.0 / 0x80000000u;
347 for (
int i = (
int) numChannels; --i >= 0;)
353 for (
int j = 0;
j < numSamples; ++
j)
354 dst[
j] = (
float) (src[
j] * gain);
384 output->write (
og.header, (
size_t)
og.header_len);
385 output->write (
og.body, (
size_t)
og.body_len);
397 OggVorbisNamespace::ogg_stream_state
os;
398 OggVorbisNamespace::ogg_page
og;
399 OggVorbisNamespace::ogg_packet op;
400 OggVorbisNamespace::vorbis_info
vi;
401 OggVorbisNamespace::vorbis_comment
vc;
402 OggVorbisNamespace::vorbis_dsp_state
vd;
403 OggVorbisNamespace::vorbis_block
vb;
418OggVorbisAudioFormat::OggVorbisAudioFormat() : AudioFormat (
oggFormatName,
".ogg")
422OggVorbisAudioFormat::~OggVorbisAudioFormat()
426Array<int> OggVorbisAudioFormat::getPossibleSampleRates()
428 return { 8000, 11025, 12000, 16000, 22050, 32000,
429 44100, 48000, 88200, 96000, 176400, 192000 };
432Array<int> OggVorbisAudioFormat::getPossibleBitDepths()
437bool OggVorbisAudioFormat::canDoStereo() {
return true; }
438bool OggVorbisAudioFormat::canDoMono() {
return true; }
439bool OggVorbisAudioFormat::isCompressed() {
return true; }
441AudioFormatReader* OggVorbisAudioFormat::createReaderFor (InputStream* in,
bool deleteStreamIfOpeningFails)
445 if (r->sampleRate > 0)
448 if (! deleteStreamIfOpeningFails)
454AudioFormatWriter* OggVorbisAudioFormat::createWriterFor (OutputStream* out,
456 unsigned int numChannels,
458 const StringPairArray& metadataValues,
459 int qualityOptionIndex)
465 (
unsigned int) bitsPerSample,
466 qualityOptionIndex, metadataValues));
468 return w->ok ? w.release() :
nullptr;
471StringArray OggVorbisAudioFormat::getQualityOptions()
473 return {
"64 kbps",
"80 kbps",
"96 kbps",
"112 kbps",
"128 kbps",
"160 kbps",
474 "192 kbps",
"224 kbps",
"256 kbps",
"320 kbps",
"500 kbps" };
477int OggVorbisAudioFormat::estimateOggFileQuality (
const File& source)
479 if (
auto in = source.createInputStream())
483 auto lengthSecs = (
double) r->lengthInSamples / r->sampleRate;
484 auto approxBitsPerSecond = (
int) ((
double) source.getSize() * 8 / lengthSecs);
486 auto qualities = getQualityOptions();
488 int bestDiff = 10000;
490 for (
int i = qualities.size(); --i >= 0;)
492 auto diff = std::abs (qualities[i].getIntValue() - approxBitsPerSecond);
static Random & getSystemRandom() noexcept
The overhead of creating a new Random object is fairly small, but if you want to avoid it,...
#define JUCE_BEGIN_NO_SANITIZE(warnings)
Disable sanitizers for a range of functions.
constexpr Type jmin(Type a, Type b)
Returns the smaller of two values.
constexpr Type jmax(Type a, Type b)
Returns the larger of two values.
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
Constrains a value to keep it within a given range.
Type unalignedPointerCast(void *ptr) noexcept
Casts a pointer to another type via void*, which suppresses the cast-align warning which sometimes ar...
unsigned int uint32
A platform-independent 32-bit unsigned integer type.
long long int64
A platform-independent 64-bit integer type.
void zeromem(void *memory, size_t numBytes) noexcept
Fills a block of memory with zeros.
static Range< Index > doBufferedRead(Range< Index > rangeToRead, GetBufferedRange &&getBufferedRange, ReadFromReservoir &&readFromReservoir, FillReservoir &&fillReservoir)
Attempts to read the requested range from some kind of input stream, with intermediate buffering in a...