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;