diff --git a/Builds/Linux/Makefile b/Builds/Linux/Makefile
index 8104ece745..eca33e3f89 100644
--- a/Builds/Linux/Makefile
+++ b/Builds/Linux/Makefile
@@ -45,6 +45,7 @@ OBJECTS := \
$(OBJDIR)/juce_ApplicationCommandTarget_90a89aa9.o \
$(OBJDIR)/juce_ApplicationProperties_a76b5c30.o \
$(OBJDIR)/juce_AiffAudioFormat_ffbda971.o \
+ $(OBJDIR)/juce_AudioCDReader_c730f7a6.o \
$(OBJDIR)/juce_AudioFormat_6605d0f9.o \
$(OBJDIR)/juce_AudioFormatManager_949148fe.o \
$(OBJDIR)/juce_AudioSubsectionReader_65f61a0a.o \
@@ -385,6 +386,11 @@ $(OBJDIR)/juce_AiffAudioFormat_ffbda971.o: ../../src/audio/audio_file_formats/ju
@echo "Compiling juce_AiffAudioFormat.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+$(OBJDIR)/juce_AudioCDReader_c730f7a6.o: ../../src/audio/audio_file_formats/juce_AudioCDReader.cpp
+ -@mkdir -p $(OBJDIR)
+ @echo "Compiling juce_AudioCDReader.cpp"
+ @$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
$(OBJDIR)/juce_AudioFormat_6605d0f9.o: ../../src/audio/audio_file_formats/juce_AudioFormat.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling juce_AudioFormat.cpp"
diff --git a/Builds/MacOSX/Juce.xcodeproj/project.pbxproj b/Builds/MacOSX/Juce.xcodeproj/project.pbxproj
index 378ea641d6..f074ce082b 100644
--- a/Builds/MacOSX/Juce.xcodeproj/project.pbxproj
+++ b/Builds/MacOSX/Juce.xcodeproj/project.pbxproj
@@ -12,6 +12,7 @@
CD59C8E60146B04575CD61E6 = { isa = PBXBuildFile; fileRef = 415BD77DF4B2F4760D138735; };
76890501626BFFF310A94F15 = { isa = PBXBuildFile; fileRef = BA97FEDA576503A21D971F1E; };
46151070FA7D3426EC35280F = { isa = PBXBuildFile; fileRef = 1AA8BE2D76E153874FB08197; };
+ 983FCD60625A60993546F850 = { isa = PBXBuildFile; fileRef = 0877D5750D6F21C5231687CA; };
416D6F00E88DC74879B4DF2B = { isa = PBXBuildFile; fileRef = 7D85530D76756C33795ECCE9; };
9C709BC2F4F0EE60BF52FACA = { isa = PBXBuildFile; fileRef = 93006D32B18174D9FE0A5E9E; };
FB21B7E6A7CE55D3C0E3C37E = { isa = PBXBuildFile; fileRef = 59597FA0A88A08937801D198; };
@@ -349,6 +350,7 @@
1AA8BE2D76E153874FB08197 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AiffAudioFormat.cpp; path = ../../src/audio/audio_file_formats/juce_AiffAudioFormat.cpp; sourceTree = SOURCE_ROOT; };
05C5C546E12C6422D865D864 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AiffAudioFormat.h; path = ../../src/audio/audio_file_formats/juce_AiffAudioFormat.h; sourceTree = SOURCE_ROOT; };
1F5A667524FB005D872340E1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioCDBurner.h; path = ../../src/audio/audio_file_formats/juce_AudioCDBurner.h; sourceTree = SOURCE_ROOT; };
+ 0877D5750D6F21C5231687CA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioCDReader.cpp; path = ../../src/audio/audio_file_formats/juce_AudioCDReader.cpp; sourceTree = SOURCE_ROOT; };
1BBE03BB0D71FEEEA440682B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioCDReader.h; path = ../../src/audio/audio_file_formats/juce_AudioCDReader.h; sourceTree = SOURCE_ROOT; };
7D85530D76756C33795ECCE9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioFormat.cpp; path = ../../src/audio/audio_file_formats/juce_AudioFormat.cpp; sourceTree = SOURCE_ROOT; };
013E8938EE1C6B4F63016B55 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioFormat.h; path = ../../src/audio/audio_file_formats/juce_AudioFormat.h; sourceTree = SOURCE_ROOT; };
@@ -1033,6 +1035,7 @@
1AA8BE2D76E153874FB08197,
05C5C546E12C6422D865D864,
1F5A667524FB005D872340E1,
+ 0877D5750D6F21C5231687CA,
1BBE03BB0D71FEEEA440682B,
7D85530D76756C33795ECCE9,
013E8938EE1C6B4F63016B55,
@@ -1898,6 +1901,7 @@
CD59C8E60146B04575CD61E6,
76890501626BFFF310A94F15,
46151070FA7D3426EC35280F,
+ 983FCD60625A60993546F850,
416D6F00E88DC74879B4DF2B,
9C709BC2F4F0EE60BF52FACA,
FB21B7E6A7CE55D3C0E3C37E,
diff --git a/Builds/VisualStudio2005/Juce.vcproj b/Builds/VisualStudio2005/Juce.vcproj
index 571493081b..66d5e407ef 100644
--- a/Builds/VisualStudio2005/Juce.vcproj
+++ b/Builds/VisualStudio2005/Juce.vcproj
@@ -118,6 +118,7 @@
+
diff --git a/Builds/VisualStudio2008/Juce.vcproj b/Builds/VisualStudio2008/Juce.vcproj
index 4018c00755..a3a4c64c3d 100644
--- a/Builds/VisualStudio2008/Juce.vcproj
+++ b/Builds/VisualStudio2008/Juce.vcproj
@@ -118,6 +118,7 @@
+
diff --git a/Builds/VisualStudio2008_DLL/Juce.vcproj b/Builds/VisualStudio2008_DLL/Juce.vcproj
index dc686365fc..c7b24936b9 100644
--- a/Builds/VisualStudio2008_DLL/Juce.vcproj
+++ b/Builds/VisualStudio2008_DLL/Juce.vcproj
@@ -120,6 +120,7 @@
+
diff --git a/Builds/VisualStudio2010/Juce.vcxproj b/Builds/VisualStudio2010/Juce.vcxproj
index 8a1f04740d..5f2053d587 100644
--- a/Builds/VisualStudio2010/Juce.vcxproj
+++ b/Builds/VisualStudio2010/Juce.vcxproj
@@ -128,6 +128,7 @@
+
diff --git a/Builds/VisualStudio2010/Juce.vcxproj.filters b/Builds/VisualStudio2010/Juce.vcxproj.filters
index add560dc15..d25834c473 100644
--- a/Builds/VisualStudio2010/Juce.vcxproj.filters
+++ b/Builds/VisualStudio2010/Juce.vcxproj.filters
@@ -193,6 +193,9 @@
Juce\Source\audio\audio_file_formats
+
+ Juce\Source\audio\audio_file_formats
+
Juce\Source\audio\audio_file_formats
diff --git a/Builds/iPhone/Juce.xcodeproj/project.pbxproj b/Builds/iPhone/Juce.xcodeproj/project.pbxproj
index 12b01bd2a3..dbc4cd2a9f 100644
--- a/Builds/iPhone/Juce.xcodeproj/project.pbxproj
+++ b/Builds/iPhone/Juce.xcodeproj/project.pbxproj
@@ -12,6 +12,7 @@
CD59C8E60146B04575CD61E6 = { isa = PBXBuildFile; fileRef = 415BD77DF4B2F4760D138735; };
76890501626BFFF310A94F15 = { isa = PBXBuildFile; fileRef = BA97FEDA576503A21D971F1E; };
46151070FA7D3426EC35280F = { isa = PBXBuildFile; fileRef = 1AA8BE2D76E153874FB08197; };
+ 983FCD60625A60993546F850 = { isa = PBXBuildFile; fileRef = 0877D5750D6F21C5231687CA; };
416D6F00E88DC74879B4DF2B = { isa = PBXBuildFile; fileRef = 7D85530D76756C33795ECCE9; };
9C709BC2F4F0EE60BF52FACA = { isa = PBXBuildFile; fileRef = 93006D32B18174D9FE0A5E9E; };
FB21B7E6A7CE55D3C0E3C37E = { isa = PBXBuildFile; fileRef = 59597FA0A88A08937801D198; };
@@ -349,6 +350,7 @@
1AA8BE2D76E153874FB08197 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AiffAudioFormat.cpp; path = ../../src/audio/audio_file_formats/juce_AiffAudioFormat.cpp; sourceTree = SOURCE_ROOT; };
05C5C546E12C6422D865D864 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AiffAudioFormat.h; path = ../../src/audio/audio_file_formats/juce_AiffAudioFormat.h; sourceTree = SOURCE_ROOT; };
1F5A667524FB005D872340E1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioCDBurner.h; path = ../../src/audio/audio_file_formats/juce_AudioCDBurner.h; sourceTree = SOURCE_ROOT; };
+ 0877D5750D6F21C5231687CA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioCDReader.cpp; path = ../../src/audio/audio_file_formats/juce_AudioCDReader.cpp; sourceTree = SOURCE_ROOT; };
1BBE03BB0D71FEEEA440682B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioCDReader.h; path = ../../src/audio/audio_file_formats/juce_AudioCDReader.h; sourceTree = SOURCE_ROOT; };
7D85530D76756C33795ECCE9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioFormat.cpp; path = ../../src/audio/audio_file_formats/juce_AudioFormat.cpp; sourceTree = SOURCE_ROOT; };
013E8938EE1C6B4F63016B55 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioFormat.h; path = ../../src/audio/audio_file_formats/juce_AudioFormat.h; sourceTree = SOURCE_ROOT; };
@@ -1033,6 +1035,7 @@
1AA8BE2D76E153874FB08197,
05C5C546E12C6422D865D864,
1F5A667524FB005D872340E1,
+ 0877D5750D6F21C5231687CA,
1BBE03BB0D71FEEEA440682B,
7D85530D76756C33795ECCE9,
013E8938EE1C6B4F63016B55,
@@ -1898,6 +1901,7 @@
CD59C8E60146B04575CD61E6,
76890501626BFFF310A94F15,
46151070FA7D3426EC35280F,
+ 983FCD60625A60993546F850,
416D6F00E88DC74879B4DF2B,
9C709BC2F4F0EE60BF52FACA,
FB21B7E6A7CE55D3C0E3C37E,
diff --git a/Juce.jucer b/Juce.jucer
index 35b401f7b3..93b8a645eb 100644
--- a/Juce.jucer
+++ b/Juce.jucer
@@ -69,6 +69,8 @@
file="src/audio/audio_file_formats/juce_AiffAudioFormat.h"/>
+
& AudioCDReader::getTrackOffsets() const
+{
+ return trackStartSamples;
+}
+
+int AudioCDReader::getCDDBId()
+{
+ int checksum = 0;
+ const int numTracks = getNumTracks();
+
+ for (int i = 0; i < numTracks; ++i)
+ for (int offset = (trackStartSamples.getUnchecked(i) + 88200) / 44100; offset > 0; offset /= 10)
+ checksum += offset % 10;
+
+ const int length = (trackStartSamples.getLast() - trackStartSamples.getFirst()) / 44100;
+
+ // CCLLLLTT: checksum, length, tracks
+ return ((checksum & 0xff) << 24) | (length << 8) | numTracks;
+}
+
+END_JUCE_NAMESPACE
+
+#endif
+/*** End of inlined file: juce_AudioCDReader.cpp ***/
+
+
/*** Start of inlined file: juce_AudioFormatReaderSource.cpp ***/
BEGIN_JUCE_NAMESPACE
@@ -245023,7 +245064,7 @@ public:
CloseHandle (scsiHandle);
}
- bool readTOC (TOC* lpToc, bool useMSF);
+ bool readTOC (TOC* lpToc);
bool readAudio (CDReadBuffer* buffer, CDReadBuffer* overlapBuffer = 0);
void openDrawer (bool shouldBeOpen);
@@ -245581,7 +245622,7 @@ int CDController::getLastIndex()
return 0;
}
-bool CDDeviceHandle::readTOC (TOC* lpToc, bool useMSF)
+bool CDDeviceHandle::readTOC (TOC* lpToc)
{
HANDLE event = CreateEvent (0, TRUE, FALSE, 0);
@@ -245599,7 +245640,7 @@ bool CDDeviceHandle::readTOC (TOC* lpToc, bool useMSF)
s.SRB_CDBLen = 0x0A;
s.SRB_PostProc = event;
s.CDBByte[0] = 0x43;
- s.CDBByte[1] = (BYTE)(useMSF ? 0x02 : 0x00);
+ s.CDBByte[1] = 0x00;
s.CDBByte[7] = 0x03;
s.CDBByte[8] = 0x24;
@@ -245965,11 +246006,6 @@ static int getAddressOf (const TOCTRACK* const t)
(((DWORD)t->addr[2]) << 8) + ((DWORD)t->addr[3]);
}
-static int getMSFAddressOf (const TOCTRACK* const t)
-{
- return 60 * t->addr[1] + t->addr[2];
-}
-
static const int samplesPerFrame = 44100 / 75;
static const int bytesPerFrame = samplesPerFrame * 4;
@@ -246083,7 +246119,6 @@ AudioCDReader::AudioCDReader (void* handle_)
sampleRate = 44100.0;
bitsPerSample = 16;
- lengthInSamples = getPositionOfTrackStart (numTracks);
numChannels = 2;
usesFloatingPointData = false;
@@ -246189,7 +246224,7 @@ bool AudioCDReader::readSamples (int** destSamples, int numDestChannels, int sta
// sometimes the read fails for just the very last couple of blocks, so
// we'll ignore and errors in the last half-second of the disk..
- ok = startSampleInFile > (trackStarts [numTracks] - 20000);
+ ok = startSampleInFile > (trackStartSamples [getNumTracks()] - 20000);
break;
}
}
@@ -246204,50 +246239,35 @@ bool AudioCDReader::isCDStillPresent() const
TOC toc;
zerostruct (toc);
- return ((CDDeviceWrapper*) handle)->cdH->readTOC (&toc, false);
-}
-
-int AudioCDReader::getNumTracks() const
-{
- return numTracks;
-}
-
-int AudioCDReader::getPositionOfTrackStart (int trackNum) const
-{
- using namespace CDReaderHelpers;
- return (trackNum >= 0 && trackNum <= numTracks) ? trackStarts [trackNum] * samplesPerFrame
- : 0;
+ return ((CDDeviceWrapper*) handle)->cdH->readTOC (&toc);
}
void AudioCDReader::refreshTrackLengths()
{
using namespace CDReaderHelpers;
- zeromem (trackStarts, sizeof (trackStarts));
+ trackStartSamples.clear();
zeromem (audioTracks, sizeof (audioTracks));
TOC toc;
zerostruct (toc);
- if (((CDDeviceWrapper*)handle)->cdH->readTOC (&toc, false))
+ if (((CDDeviceWrapper*)handle)->cdH->readTOC (&toc))
{
- numTracks = 1 + toc.lastTrack - toc.firstTrack;
+ int numTracks = 1 + toc.lastTrack - toc.firstTrack;
for (int i = 0; i <= numTracks; ++i)
{
- trackStarts[i] = getAddressOf (&toc.tracks[i]);
- audioTracks[i] = ((toc.tracks[i].ADR & 4) == 0);
+ trackStartSamples.add (samplesPerFrame * getAddressOf (&toc.tracks [i]));
+ audioTracks [i] = ((toc.tracks[i].ADR & 4) == 0);
}
}
- else
- {
- numTracks = 0;
- }
+
+ lengthInSamples = getPositionOfTrackStart (getNumTracks());
}
bool AudioCDReader::isTrackAudio (int trackNum) const
{
- return (trackNum >= 0 && trackNum <= numTracks) ? audioTracks [trackNum]
- : false;
+ return trackNum >= 0 && trackNum < getNumTracks() && audioTracks [trackNum];
}
void AudioCDReader::enableIndexScanning (bool b)
@@ -246393,44 +246413,6 @@ const Array AudioCDReader::findIndexesInTrack (const int trackNumber)
return indexes;
}
-int AudioCDReader::getCDDBId()
-{
- using namespace CDReaderHelpers;
- refreshTrackLengths();
-
- if (numTracks > 0)
- {
- TOC toc;
- zerostruct (toc);
-
- if (((CDDeviceWrapper*) handle)->cdH->readTOC (&toc, true))
- {
- int n = 0;
-
- for (int i = numTracks; --i >= 0;)
- {
- int j = getMSFAddressOf (&toc.tracks[i]);
-
- while (j > 0)
- {
- n += (j % 10);
- j /= 10;
- }
- }
-
- if (n != 0)
- {
- const int t = getMSFAddressOf (&toc.tracks[numTracks])
- - getMSFAddressOf (&toc.tracks[0]);
-
- return ((n % 0xff) << 24) | (t << 8) | numTracks;
- }
- }
- }
-
- return 0;
-}
-
void AudioCDReader::ejectDisk()
{
using namespace CDReaderHelpers;
@@ -261365,16 +261347,6 @@ bool AudioCDReader::isCDStillPresent() const
return false;
}
-int AudioCDReader::getNumTracks() const
-{
- return 0;
-}
-
-int AudioCDReader::getPositionOfTrackStart (int trackNum) const
-{
- return 0;
-}
-
bool AudioCDReader::isTrackAudio (int trackNum) const
{
return false;
@@ -261394,11 +261366,6 @@ const Array AudioCDReader::findIndexesInTrack (const int trackNumber)
return Array();
}
-int AudioCDReader::getCDDBId()
-{
- return 0;
-}
-
#endif
/*** End of inlined file: juce_linux_AudioCDReader.cpp ***/
@@ -261838,34 +261805,30 @@ void SystemStats::initialiseStats()
{
initialised = true;
- #if JUCE_MAC
- // extremely annoying: adding this line stops the apple menu items from working. Of
- // course, not adding it means that carbon windows (e.g. in plugins) won't get
- // any events.
- //NSApplicationLoad();
- [NSApplication sharedApplication];
- #endif
+ #if JUCE_MAC
+ [NSApplication sharedApplication];
+ #endif
- #if JUCE_INTEL
- unsigned int familyModel, extFeatures;
- const unsigned int features = getCPUIDWord (familyModel, extFeatures);
-
- cpuFlags.hasMMX = ((features & (1 << 23)) != 0);
- cpuFlags.hasSSE = ((features & (1 << 25)) != 0);
- cpuFlags.hasSSE2 = ((features & (1 << 26)) != 0);
- cpuFlags.has3DNow = ((extFeatures & (1 << 31)) != 0);
- #else
- cpuFlags.hasMMX = false;
- cpuFlags.hasSSE = false;
- cpuFlags.hasSSE2 = false;
- cpuFlags.has3DNow = false;
- #endif
+ #if JUCE_INTEL
+ unsigned int familyModel, extFeatures;
+ const unsigned int features = getCPUIDWord (familyModel, extFeatures);
- #if JUCE_IOS || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
- cpuFlags.numCpus = (int) [[NSProcessInfo processInfo] activeProcessorCount];
- #else
- cpuFlags.numCpus = (int) MPProcessors();
- #endif
+ cpuFlags.hasMMX = ((features & (1 << 23)) != 0);
+ cpuFlags.hasSSE = ((features & (1 << 25)) != 0);
+ cpuFlags.hasSSE2 = ((features & (1 << 26)) != 0);
+ cpuFlags.has3DNow = ((extFeatures & (1 << 31)) != 0);
+ #else
+ cpuFlags.hasMMX = false;
+ cpuFlags.hasSSE = false;
+ cpuFlags.hasSSE2 = false;
+ cpuFlags.has3DNow = false;
+ #endif
+
+ #if JUCE_IOS || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
+ cpuFlags.numCpus = (int) [[NSProcessInfo processInfo] activeProcessorCount];
+ #else
+ cpuFlags.numCpus = (int) MPProcessors();
+ #endif
mach_timebase_info_data_t timebase;
(void) mach_timebase_info (&timebase);
@@ -265558,6 +265521,9 @@ END_JUCE_NAMESPACE
[self addSubview: hiddenTextField];
hiddenTextField.delegate = self;
+ hiddenTextField.autocapitalizationType = UITextAutocapitalizationTypeNone;
+ hiddenTextField.autocorrectionType = UITextAutocorrectionTypeNo;
+
return self;
}
@@ -274322,20 +274288,97 @@ void AudioCDReader::ejectDisk()
// compiled on its own).
#if JUCE_INCLUDED_FILE && JUCE_USE_CDREADER
-static void juce_findCDs (Array& cds)
+namespace CDReaderHelpers
{
- File volumes ("/Volumes");
- volumes.findChildFiles (cds, File::findDirectories, false);
+ inline const XmlElement* getElementForKey (const XmlElement& xml, const String& key)
+ {
+ forEachXmlChildElementWithTagName (xml, child, "key")
+ if (child->getAllSubText() == key)
+ return child->getNextElement();
+
+ return 0;
+ }
+
+ static int getIntValueForKey (const XmlElement& xml, const String& key, int defaultValue = -1)
+ {
+ const XmlElement* const block = getElementForKey (xml, key);
+ return block != 0 ? block->getAllSubText().getIntValue() : defaultValue;
+ }
+
+ // Get the track offsets for a CD given an XmlElement representing its TOC.Plist.
+ // Returns NULL on success, otherwise a const char* representing an error.
+ static const char* getTrackOffsets (XmlDocument& xmlDocument, Array& offsets)
+ {
+ const ScopedPointer xml (xmlDocument.getDocumentElement());
+ if (xml == 0)
+ return "Couldn't parse XML in file";
+
+ const XmlElement* const dict = xml->getChildByName ("dict");
+ if (dict == 0)
+ return "Couldn't get top level dictionary";
+
+ const XmlElement* const sessions = getElementForKey (*dict, "Sessions");
+ if (sessions == 0)
+ return "Couldn't find sessions key";
+
+ const XmlElement* const session = sessions->getFirstChildElement();
+ if (session == 0)
+ return "Couldn't find first session";
+
+ const int leadOut = getIntValueForKey (*session, "Leadout Block");
+ if (leadOut < 0)
+ return "Couldn't find Leadout Block";
+
+ const XmlElement* const trackArray = getElementForKey (*session, "Track Array");
+ if (trackArray == 0)
+ return "Couldn't find Track Array";
+
+ forEachXmlChildElement (*trackArray, track)
+ {
+ const int trackValue = getIntValueForKey (*track, "Start Block");
+ if (trackValue < 0)
+ return "Couldn't find Start Block in the track";
+
+ offsets.add (trackValue * AudioCDReader::samplesPerFrame - 88200);
+ }
+
+ offsets.add (leadOut * AudioCDReader::samplesPerFrame - 88200);
+ return 0;
+ }
+
+ static void findDevices (Array& cds)
+ {
+ File volumes ("/Volumes");
+ volumes.findChildFiles (cds, File::findDirectories, false);
+
+ for (int i = cds.size(); --i >= 0;)
+ if (! cds.getReference(i).getChildFile (".TOC.plist").exists())
+ cds.remove (i);
+ }
+
+ struct TrackSorter
+ {
+ static int getCDTrackNumber (const File& file)
+ {
+ return file.getFileName().initialSectionContainingOnly ("0123456789").getIntValue();
+ }
+
+ static int compareElements (const File& first, const File& second)
+ {
+ const int firstTrack = getCDTrackNumber (first);
+ const int secondTrack = getCDTrackNumber (second);
- for (int i = cds.size(); --i >= 0;)
- if (! cds.getReference(i).getChildFile (".TOC.plist").exists())
- cds.remove (i);
+ jassert (firstTrack > 0 && secondTrack > 0);
+
+ return firstTrack - secondTrack;
+ }
+ };
}
const StringArray AudioCDReader::getAvailableCDNames()
{
Array cds;
- juce_findCDs (cds);
+ CDReaderHelpers::findDevices (cds);
StringArray names;
@@ -274348,7 +274391,7 @@ const StringArray AudioCDReader::getAvailableCDNames()
AudioCDReader* AudioCDReader::createReaderForCD (const int index)
{
Array cds;
- juce_findCDs (cds);
+ CDReaderHelpers::findDevices (cds);
if (cds[index].exists())
return new AudioCDReader (cds[index]);
@@ -274378,51 +274421,23 @@ void AudioCDReader::refreshTrackLengths()
{
tracks.clear();
trackStartSamples.clear();
- volumeDir.findChildFiles (tracks, File::findFiles | File::ignoreHiddenFiles, false, "*.aiff");
-
- struct CDTrackSorter
- {
- static int getCDTrackNumber (const File& file)
- {
- return file.getFileName()
- .initialSectionContainingOnly ("0123456789")
- .getIntValue();
- }
+ lengthInSamples = 0;
- static int compareElements (const File& first, const File& second)
- {
- const int firstTrack = getCDTrackNumber (first);
- const int secondTrack = getCDTrackNumber (second);
-
- jassert (firstTrack > 0 && secondTrack > 0);
-
- return firstTrack - secondTrack;
- }
- };
+ volumeDir.findChildFiles (tracks, File::findFiles | File::ignoreHiddenFiles, false, "*.aiff");
- CDTrackSorter sorter;
+ CDReaderHelpers::TrackSorter sorter;
tracks.sort (sorter);
- AiffAudioFormat format;
- int sample = 0;
+ const File toc (volumeDir.getChildFile (".TOC.plist"));
- for (int i = 0; i < tracks.size(); ++i)
+ if (toc.exists())
{
- trackStartSamples.add (sample);
-
- FileInputStream* const in = tracks.getReference(i).createInputStream();
-
- if (in != 0)
- {
- ScopedPointer r (format.createReaderFor (in, true));
+ XmlDocument doc (toc);
+ const char* error = CDReaderHelpers::getTrackOffsets (doc, trackStartSamples);
+ (void) error; // could be logged..
- if (r != 0)
- sample += (int) r->lengthInSamples;
- }
+ lengthInSamples = trackStartSamples.getLast() - trackStartSamples.getFirst();
}
-
- trackStartSamples.add (sample);
- lengthInSamples = sample;
}
bool AudioCDReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
@@ -274484,19 +274499,9 @@ bool AudioCDReader::isCDStillPresent() const
return volumeDir.exists();
}
-int AudioCDReader::getNumTracks() const
-{
- return tracks.size();
-}
-
-int AudioCDReader::getPositionOfTrackStart (int trackNum) const
-{
- return trackStartSamples [trackNum];
-}
-
bool AudioCDReader::isTrackAudio (int trackNum) const
{
- return tracks [trackNum] != File::nonexistent;
+ return tracks [trackNum].hasFileExtension (".aiff");
}
void AudioCDReader::enableIndexScanning (bool b)
@@ -274514,11 +274519,6 @@ const Array AudioCDReader::findIndexesInTrack (const int trackNumber)
return Array ();
}
-int AudioCDReader::getCDDBId()
-{
- return 0; //xxx
-}
-
#endif
/*** End of inlined file: juce_mac_AudioCDReader.mm ***/
diff --git a/juce_amalgamated.h b/juce_amalgamated.h
index 4e146b0e38..79390bc73d 100644
--- a/juce_amalgamated.h
+++ b/juce_amalgamated.h
@@ -64,7 +64,7 @@
*/
#define JUCE_MAJOR_VERSION 1
#define JUCE_MINOR_VERSION 52
-#define JUCE_BUILDNUMBER 44
+#define JUCE_BUILDNUMBER 45
/** Current Juce version number.
@@ -338,7 +338,7 @@
reduce code size.
*/
#ifndef JUCE_USE_CDREADER
- #define JUCE_USE_CDREADER 0
+ #define JUCE_USE_CDREADER 1
#endif
/** JUCE_USE_CAMERA: Enables web-cam support using the CameraDevice class (Mac and Windows).
@@ -30460,7 +30460,8 @@ public:
/** Finds the sample offset of the start of a track.
- @param trackNum the track number, where 0 is the first track.
+ @param trackNum the track number, where trackNum = 0 is the first track
+ and trackNum = getNumTracks() means the end of the CD.
*/
int getPositionOfTrackStart (int trackNum) const;
@@ -30470,6 +30471,11 @@ public:
*/
bool isTrackAudio (int trackNum) const;
+ /** Returns an array of sample offsets for the start of each track, followed by
+ the sample position of the end of the CD.
+ */
+ const Array& getTrackOffsets() const;
+
/** Refreshes the object's table of contents.
If the disc has been ejected and a different one put in since this
@@ -30519,21 +30525,22 @@ public:
*/
void ejectDisk();
+ static const int framesPerSecond = 75;
+ static const int samplesPerFrame = 44100 / framesPerSecond;
+
juce_UseDebuggingNewOperator
private:
+ Array trackStartSamples;
#if JUCE_MAC
File volumeDir;
Array tracks;
- Array trackStartSamples;
int currentReaderTrack;
ScopedPointer reader;
AudioCDReader (const File& volume);
#elif JUCE_WINDOWS
- int numTracks;
- int trackStarts[100];
bool audioTracks [100];
void* handle;
bool indexingEnabled;
diff --git a/src/audio/audio_file_formats/juce_AudioCDReader.cpp b/src/audio/audio_file_formats/juce_AudioCDReader.cpp
new file mode 100644
index 0000000000..dc3400cebc
--- /dev/null
+++ b/src/audio/audio_file_formats/juce_AudioCDReader.cpp
@@ -0,0 +1,69 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library - "Jules' Utility Class Extensions"
+ Copyright 2004-10 by Raw Material Software Ltd.
+
+ ------------------------------------------------------------------------------
+
+ JUCE can be redistributed and/or modified under the terms of the GNU General
+ Public License (Version 2), as published by the Free Software Foundation.
+ A copy of the license is included in the JUCE distribution, or can be found
+ online at www.gnu.org/licenses.
+
+ JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ ------------------------------------------------------------------------------
+
+ To release a closed-source product which uses JUCE, commercial licenses are
+ available: visit www.rawmaterialsoftware.com/juce for more information.
+
+ ==============================================================================
+*/
+
+#include "../../core/juce_StandardHeader.h"
+
+#if JUCE_USE_CDREADER
+
+BEGIN_JUCE_NAMESPACE
+
+#include "juce_AudioCDReader.h"
+
+
+//==============================================================================
+int AudioCDReader::getNumTracks() const
+{
+ return trackStartSamples.size() - 1;
+}
+
+int AudioCDReader::getPositionOfTrackStart (int trackNum) const
+{
+ return trackStartSamples [trackNum];
+}
+
+const Array& AudioCDReader::getTrackOffsets() const
+{
+ return trackStartSamples;
+}
+
+int AudioCDReader::getCDDBId()
+{
+ int checksum = 0;
+ const int numTracks = getNumTracks();
+
+ for (int i = 0; i < numTracks; ++i)
+ for (int offset = (trackStartSamples.getUnchecked(i) + 88200) / 44100; offset > 0; offset /= 10)
+ checksum += offset % 10;
+
+ const int length = (trackStartSamples.getLast() - trackStartSamples.getFirst()) / 44100;
+
+ // CCLLLLTT: checksum, length, tracks
+ return ((checksum & 0xff) << 24) | (length << 8) | numTracks;
+}
+
+
+END_JUCE_NAMESPACE
+
+#endif
diff --git a/src/audio/audio_file_formats/juce_AudioCDReader.h b/src/audio/audio_file_formats/juce_AudioCDReader.h
index 34d2d35a14..76e2e78464 100644
--- a/src/audio/audio_file_formats/juce_AudioCDReader.h
+++ b/src/audio/audio_file_formats/juce_AudioCDReader.h
@@ -87,7 +87,8 @@ public:
/** Finds the sample offset of the start of a track.
- @param trackNum the track number, where 0 is the first track.
+ @param trackNum the track number, where trackNum = 0 is the first track
+ and trackNum = getNumTracks() means the end of the CD.
*/
int getPositionOfTrackStart (int trackNum) const;
@@ -97,6 +98,11 @@ public:
*/
bool isTrackAudio (int trackNum) const;
+ /** Returns an array of sample offsets for the start of each track, followed by
+ the sample position of the end of the CD.
+ */
+ const Array& getTrackOffsets() const;
+
/** Refreshes the object's table of contents.
If the disc has been ejected and a different one put in since this
@@ -146,22 +152,24 @@ public:
*/
void ejectDisk();
+ //==============================================================================
+ static const int framesPerSecond = 75;
+ static const int samplesPerFrame = 44100 / framesPerSecond;
+
//==============================================================================
juce_UseDebuggingNewOperator
private:
+ Array trackStartSamples;
#if JUCE_MAC
File volumeDir;
Array tracks;
- Array trackStartSamples;
int currentReaderTrack;
ScopedPointer reader;
AudioCDReader (const File& volume);
#elif JUCE_WINDOWS
- int numTracks;
- int trackStarts[100];
bool audioTracks [100];
void* handle;
bool indexingEnabled;
diff --git a/src/core/juce_StandardHeader.h b/src/core/juce_StandardHeader.h
index 8587c95df1..9ad4633f22 100644
--- a/src/core/juce_StandardHeader.h
+++ b/src/core/juce_StandardHeader.h
@@ -33,7 +33,7 @@
*/
#define JUCE_MAJOR_VERSION 1
#define JUCE_MINOR_VERSION 52
-#define JUCE_BUILDNUMBER 44
+#define JUCE_BUILDNUMBER 45
/** Current Juce version number.
diff --git a/src/native/juce_mac_NativeCode.mm b/src/native/juce_mac_NativeCode.mm
index f21dbf8431..8e4f5e18a0 100644
--- a/src/native/juce_mac_NativeCode.mm
+++ b/src/native/juce_mac_NativeCode.mm
@@ -54,6 +54,7 @@ BEGIN_JUCE_NAMESPACE
#include "../io/streams/juce_BufferedInputStream.h"
#include "../core/juce_PlatformUtilities.h"
#include "../text/juce_LocalisedStrings.h"
+#include "../text/juce_XmlDocument.h"
#include "../utilities/juce_DeletedAtShutdown.h"
#include "../application/juce_Application.h"
#include "../utilities/juce_SystemClipboard.h"
@@ -77,6 +78,7 @@ BEGIN_JUCE_NAMESPACE
#include "../gui/components/filebrowser/juce_FileChooser.h"
#include "../audio/audio_file_formats/juce_AudioCDBurner.h"
#include "../audio/audio_file_formats/juce_AudioCDReader.h"
+#include "../audio/audio_file_formats/juce_AiffAudioFormat.h"
#include "../audio/audio_sources/juce_AudioSource.h"
#include "../audio/dsp/juce_AudioDataConverters.h"
#include "../audio/devices/juce_AudioIODeviceType.h"
diff --git a/src/native/linux/juce_linux_AudioCDReader.cpp b/src/native/linux/juce_linux_AudioCDReader.cpp
index b74a693bc4..2ee64c409f 100644
--- a/src/native/linux/juce_linux_AudioCDReader.cpp
+++ b/src/native/linux/juce_linux_AudioCDReader.cpp
@@ -64,16 +64,6 @@ bool AudioCDReader::isCDStillPresent() const
return false;
}
-int AudioCDReader::getNumTracks() const
-{
- return 0;
-}
-
-int AudioCDReader::getPositionOfTrackStart (int trackNum) const
-{
- return 0;
-}
-
bool AudioCDReader::isTrackAudio (int trackNum) const
{
return false;
@@ -93,9 +83,4 @@ const Array AudioCDReader::findIndexesInTrack (const int trackNumber)
return Array();
}
-int AudioCDReader::getCDDBId()
-{
- return 0;
-}
-
#endif
diff --git a/src/native/mac/juce_iphone_UIViewComponentPeer.mm b/src/native/mac/juce_iphone_UIViewComponentPeer.mm
index aea352fd73..5ad396e9b4 100644
--- a/src/native/mac/juce_iphone_UIViewComponentPeer.mm
+++ b/src/native/mac/juce_iphone_UIViewComponentPeer.mm
@@ -173,6 +173,9 @@ END_JUCE_NAMESPACE
[self addSubview: hiddenTextField];
hiddenTextField.delegate = self;
+ hiddenTextField.autocapitalizationType = UITextAutocapitalizationTypeNone;
+ hiddenTextField.autocorrectionType = UITextAutocorrectionTypeNo;
+
return self;
}
diff --git a/src/native/mac/juce_mac_AudioCDReader.mm b/src/native/mac/juce_mac_AudioCDReader.mm
index 2afc8461ba..4199cf9c73 100644
--- a/src/native/mac/juce_mac_AudioCDReader.mm
+++ b/src/native/mac/juce_mac_AudioCDReader.mm
@@ -28,20 +28,98 @@
#if JUCE_INCLUDED_FILE && JUCE_USE_CDREADER
//==============================================================================
-static void juce_findCDs (Array& cds)
+namespace CDReaderHelpers
{
- File volumes ("/Volumes");
- volumes.findChildFiles (cds, File::findDirectories, false);
+ inline const XmlElement* getElementForKey (const XmlElement& xml, const String& key)
+ {
+ forEachXmlChildElementWithTagName (xml, child, "key")
+ if (child->getAllSubText() == key)
+ return child->getNextElement();
+
+ return 0;
+ }
+
+ static int getIntValueForKey (const XmlElement& xml, const String& key, int defaultValue = -1)
+ {
+ const XmlElement* const block = getElementForKey (xml, key);
+ return block != 0 ? block->getAllSubText().getIntValue() : defaultValue;
+ }
+
+ // Get the track offsets for a CD given an XmlElement representing its TOC.Plist.
+ // Returns NULL on success, otherwise a const char* representing an error.
+ static const char* getTrackOffsets (XmlDocument& xmlDocument, Array& offsets)
+ {
+ const ScopedPointer xml (xmlDocument.getDocumentElement());
+ if (xml == 0)
+ return "Couldn't parse XML in file";
+
+ const XmlElement* const dict = xml->getChildByName ("dict");
+ if (dict == 0)
+ return "Couldn't get top level dictionary";
+
+ const XmlElement* const sessions = getElementForKey (*dict, "Sessions");
+ if (sessions == 0)
+ return "Couldn't find sessions key";
+
+ const XmlElement* const session = sessions->getFirstChildElement();
+ if (session == 0)
+ return "Couldn't find first session";
+
+ const int leadOut = getIntValueForKey (*session, "Leadout Block");
+ if (leadOut < 0)
+ return "Couldn't find Leadout Block";
+
+ const XmlElement* const trackArray = getElementForKey (*session, "Track Array");
+ if (trackArray == 0)
+ return "Couldn't find Track Array";
+
+ forEachXmlChildElement (*trackArray, track)
+ {
+ const int trackValue = getIntValueForKey (*track, "Start Block");
+ if (trackValue < 0)
+ return "Couldn't find Start Block in the track";
+
+ offsets.add (trackValue * AudioCDReader::samplesPerFrame - 88200);
+ }
+
+ offsets.add (leadOut * AudioCDReader::samplesPerFrame - 88200);
+ return 0;
+ }
+
+ static void findDevices (Array& cds)
+ {
+ File volumes ("/Volumes");
+ volumes.findChildFiles (cds, File::findDirectories, false);
+
+ for (int i = cds.size(); --i >= 0;)
+ if (! cds.getReference(i).getChildFile (".TOC.plist").exists())
+ cds.remove (i);
+ }
+
+ struct TrackSorter
+ {
+ static int getCDTrackNumber (const File& file)
+ {
+ return file.getFileName().initialSectionContainingOnly ("0123456789").getIntValue();
+ }
+
+ static int compareElements (const File& first, const File& second)
+ {
+ const int firstTrack = getCDTrackNumber (first);
+ const int secondTrack = getCDTrackNumber (second);
+
+ jassert (firstTrack > 0 && secondTrack > 0);
- for (int i = cds.size(); --i >= 0;)
- if (! cds.getReference(i).getChildFile (".TOC.plist").exists())
- cds.remove (i);
+ return firstTrack - secondTrack;
+ }
+ };
}
+//==============================================================================
const StringArray AudioCDReader::getAvailableCDNames()
{
Array cds;
- juce_findCDs (cds);
+ CDReaderHelpers::findDevices (cds);
StringArray names;
@@ -54,7 +132,7 @@ const StringArray AudioCDReader::getAvailableCDNames()
AudioCDReader* AudioCDReader::createReaderForCD (const int index)
{
Array cds;
- juce_findCDs (cds);
+ CDReaderHelpers::findDevices (cds);
if (cds[index].exists())
return new AudioCDReader (cds[index]);
@@ -84,51 +162,23 @@ void AudioCDReader::refreshTrackLengths()
{
tracks.clear();
trackStartSamples.clear();
- volumeDir.findChildFiles (tracks, File::findFiles | File::ignoreHiddenFiles, false, "*.aiff");
-
- struct CDTrackSorter
- {
- static int getCDTrackNumber (const File& file)
- {
- return file.getFileName()
- .initialSectionContainingOnly ("0123456789")
- .getIntValue();
- }
+ lengthInSamples = 0;
- static int compareElements (const File& first, const File& second)
- {
- const int firstTrack = getCDTrackNumber (first);
- const int secondTrack = getCDTrackNumber (second);
-
- jassert (firstTrack > 0 && secondTrack > 0);
-
- return firstTrack - secondTrack;
- }
- };
+ volumeDir.findChildFiles (tracks, File::findFiles | File::ignoreHiddenFiles, false, "*.aiff");
- CDTrackSorter sorter;
+ CDReaderHelpers::TrackSorter sorter;
tracks.sort (sorter);
- AiffAudioFormat format;
- int sample = 0;
+ const File toc (volumeDir.getChildFile (".TOC.plist"));
- for (int i = 0; i < tracks.size(); ++i)
+ if (toc.exists())
{
- trackStartSamples.add (sample);
+ XmlDocument doc (toc);
+ const char* error = CDReaderHelpers::getTrackOffsets (doc, trackStartSamples);
+ (void) error; // could be logged..
- FileInputStream* const in = tracks.getReference(i).createInputStream();
-
- if (in != 0)
- {
- ScopedPointer r (format.createReaderFor (in, true));
-
- if (r != 0)
- sample += (int) r->lengthInSamples;
- }
+ lengthInSamples = trackStartSamples.getLast() - trackStartSamples.getFirst();
}
-
- trackStartSamples.add (sample);
- lengthInSamples = sample;
}
bool AudioCDReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,
@@ -190,19 +240,9 @@ bool AudioCDReader::isCDStillPresent() const
return volumeDir.exists();
}
-int AudioCDReader::getNumTracks() const
-{
- return tracks.size();
-}
-
-int AudioCDReader::getPositionOfTrackStart (int trackNum) const
-{
- return trackStartSamples [trackNum];
-}
-
bool AudioCDReader::isTrackAudio (int trackNum) const
{
- return tracks [trackNum] != File::nonexistent;
+ return tracks [trackNum].hasFileExtension (".aiff");
}
void AudioCDReader::enableIndexScanning (bool b)
@@ -220,9 +260,4 @@ const Array AudioCDReader::findIndexesInTrack (const int trackNumber)
return Array ();
}
-int AudioCDReader::getCDDBId()
-{
- return 0; //xxx
-}
-
#endif
diff --git a/src/native/mac/juce_mac_SystemStats.mm b/src/native/mac/juce_mac_SystemStats.mm
index 4e862c6abf..0a04870aa5 100644
--- a/src/native/mac/juce_mac_SystemStats.mm
+++ b/src/native/mac/juce_mac_SystemStats.mm
@@ -78,34 +78,30 @@ void SystemStats::initialiseStats()
{
initialised = true;
- #if JUCE_MAC
- // extremely annoying: adding this line stops the apple menu items from working. Of
- // course, not adding it means that carbon windows (e.g. in plugins) won't get
- // any events.
- //NSApplicationLoad();
- [NSApplication sharedApplication];
- #endif
-
- #if JUCE_INTEL
- unsigned int familyModel, extFeatures;
- const unsigned int features = getCPUIDWord (familyModel, extFeatures);
-
- cpuFlags.hasMMX = ((features & (1 << 23)) != 0);
- cpuFlags.hasSSE = ((features & (1 << 25)) != 0);
- cpuFlags.hasSSE2 = ((features & (1 << 26)) != 0);
- cpuFlags.has3DNow = ((extFeatures & (1 << 31)) != 0);
- #else
- cpuFlags.hasMMX = false;
- cpuFlags.hasSSE = false;
- cpuFlags.hasSSE2 = false;
- cpuFlags.has3DNow = false;
- #endif
-
- #if JUCE_IOS || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
- cpuFlags.numCpus = (int) [[NSProcessInfo processInfo] activeProcessorCount];
- #else
- cpuFlags.numCpus = (int) MPProcessors();
- #endif
+ #if JUCE_MAC
+ [NSApplication sharedApplication];
+ #endif
+
+ #if JUCE_INTEL
+ unsigned int familyModel, extFeatures;
+ const unsigned int features = getCPUIDWord (familyModel, extFeatures);
+
+ cpuFlags.hasMMX = ((features & (1 << 23)) != 0);
+ cpuFlags.hasSSE = ((features & (1 << 25)) != 0);
+ cpuFlags.hasSSE2 = ((features & (1 << 26)) != 0);
+ cpuFlags.has3DNow = ((extFeatures & (1 << 31)) != 0);
+ #else
+ cpuFlags.hasMMX = false;
+ cpuFlags.hasSSE = false;
+ cpuFlags.hasSSE2 = false;
+ cpuFlags.has3DNow = false;
+ #endif
+
+ #if JUCE_IOS || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
+ cpuFlags.numCpus = (int) [[NSProcessInfo processInfo] activeProcessorCount];
+ #else
+ cpuFlags.numCpus = (int) MPProcessors();
+ #endif
mach_timebase_info_data_t timebase;
(void) mach_timebase_info (&timebase);
diff --git a/src/native/windows/juce_win32_AudioCDReader.cpp b/src/native/windows/juce_win32_AudioCDReader.cpp
index 9f8bc18b85..260b09e04c 100644
--- a/src/native/windows/juce_win32_AudioCDReader.cpp
+++ b/src/native/windows/juce_win32_AudioCDReader.cpp
@@ -632,7 +632,7 @@ public:
CloseHandle (scsiHandle);
}
- bool readTOC (TOC* lpToc, bool useMSF);
+ bool readTOC (TOC* lpToc);
bool readAudio (CDReadBuffer* buffer, CDReadBuffer* overlapBuffer = 0);
void openDrawer (bool shouldBeOpen);
@@ -1206,7 +1206,7 @@ int CDController::getLastIndex()
}
//==============================================================================
-bool CDDeviceHandle::readTOC (TOC* lpToc, bool useMSF)
+bool CDDeviceHandle::readTOC (TOC* lpToc)
{
HANDLE event = CreateEvent (0, TRUE, FALSE, 0);
@@ -1224,7 +1224,7 @@ bool CDDeviceHandle::readTOC (TOC* lpToc, bool useMSF)
s.SRB_CDBLen = 0x0A;
s.SRB_PostProc = event;
s.CDBByte[0] = 0x43;
- s.CDBByte[1] = (BYTE)(useMSF ? 0x02 : 0x00);
+ s.CDBByte[1] = 0x00;
s.CDBByte[7] = 0x03;
s.CDBByte[8] = 0x24;
@@ -1596,11 +1596,6 @@ static int getAddressOf (const TOCTRACK* const t)
(((DWORD)t->addr[2]) << 8) + ((DWORD)t->addr[3]);
}
-static int getMSFAddressOf (const TOCTRACK* const t)
-{
- return 60 * t->addr[1] + t->addr[2];
-}
-
static const int samplesPerFrame = 44100 / 75;
static const int bytesPerFrame = samplesPerFrame * 4;
@@ -1715,7 +1710,6 @@ AudioCDReader::AudioCDReader (void* handle_)
sampleRate = 44100.0;
bitsPerSample = 16;
- lengthInSamples = getPositionOfTrackStart (numTracks);
numChannels = 2;
usesFloatingPointData = false;
@@ -1821,7 +1815,7 @@ bool AudioCDReader::readSamples (int** destSamples, int numDestChannels, int sta
// sometimes the read fails for just the very last couple of blocks, so
// we'll ignore and errors in the last half-second of the disk..
- ok = startSampleInFile > (trackStarts [numTracks] - 20000);
+ ok = startSampleInFile > (trackStartSamples [getNumTracks()] - 20000);
break;
}
}
@@ -1836,50 +1830,35 @@ bool AudioCDReader::isCDStillPresent() const
TOC toc;
zerostruct (toc);
- return ((CDDeviceWrapper*) handle)->cdH->readTOC (&toc, false);
-}
-
-int AudioCDReader::getNumTracks() const
-{
- return numTracks;
-}
-
-int AudioCDReader::getPositionOfTrackStart (int trackNum) const
-{
- using namespace CDReaderHelpers;
- return (trackNum >= 0 && trackNum <= numTracks) ? trackStarts [trackNum] * samplesPerFrame
- : 0;
+ return ((CDDeviceWrapper*) handle)->cdH->readTOC (&toc);
}
void AudioCDReader::refreshTrackLengths()
{
using namespace CDReaderHelpers;
- zeromem (trackStarts, sizeof (trackStarts));
+ trackStartSamples.clear();
zeromem (audioTracks, sizeof (audioTracks));
TOC toc;
zerostruct (toc);
- if (((CDDeviceWrapper*)handle)->cdH->readTOC (&toc, false))
+ if (((CDDeviceWrapper*)handle)->cdH->readTOC (&toc))
{
- numTracks = 1 + toc.lastTrack - toc.firstTrack;
+ int numTracks = 1 + toc.lastTrack - toc.firstTrack;
for (int i = 0; i <= numTracks; ++i)
{
- trackStarts[i] = getAddressOf (&toc.tracks[i]);
- audioTracks[i] = ((toc.tracks[i].ADR & 4) == 0);
+ trackStartSamples.add (samplesPerFrame * getAddressOf (&toc.tracks [i]));
+ audioTracks [i] = ((toc.tracks[i].ADR & 4) == 0);
}
}
- else
- {
- numTracks = 0;
- }
+
+ lengthInSamples = getPositionOfTrackStart (getNumTracks());
}
bool AudioCDReader::isTrackAudio (int trackNum) const
{
- return (trackNum >= 0 && trackNum <= numTracks) ? audioTracks [trackNum]
- : false;
+ return trackNum >= 0 && trackNum < getNumTracks() && audioTracks [trackNum];
}
void AudioCDReader::enableIndexScanning (bool b)
@@ -2025,44 +2004,6 @@ const Array AudioCDReader::findIndexesInTrack (const int trackNumber)
return indexes;
}
-int AudioCDReader::getCDDBId()
-{
- using namespace CDReaderHelpers;
- refreshTrackLengths();
-
- if (numTracks > 0)
- {
- TOC toc;
- zerostruct (toc);
-
- if (((CDDeviceWrapper*) handle)->cdH->readTOC (&toc, true))
- {
- int n = 0;
-
- for (int i = numTracks; --i >= 0;)
- {
- int j = getMSFAddressOf (&toc.tracks[i]);
-
- while (j > 0)
- {
- n += (j % 10);
- j /= 10;
- }
- }
-
- if (n != 0)
- {
- const int t = getMSFAddressOf (&toc.tracks[numTracks])
- - getMSFAddressOf (&toc.tracks[0]);
-
- return ((n % 0xff) << 24) | (t << 8) | numTracks;
- }
- }
- }
-
- return 0;
-}
-
void AudioCDReader::ejectDisk()
{
using namespace CDReaderHelpers;