Title: [279102] trunk/Source/WebCore
Revision
279102
Author
[email protected]
Date
2021-06-21 21:21:54 -0700 (Mon, 21 Jun 2021)

Log Message

Merge AudioFileReaderMac and AudioFileReaderIOS into AudioFileReaderCocoa
https://bugs.webkit.org/show_bug.cgi?id=227205
<rdar://problem/79549527>

Reviewed by Chris Dumez.

Merge AudioFileReaderIOS and AudioFileReaderMac into AudioFileReaderCocoa.
No change in functionality.

* PlatformMac.cmake:
* SourcesCocoa.txt:
* WebCore.xcodeproj/project.pbxproj:
* platform/audio/cocoa/AudioFileReaderCocoa.cpp:
(WebCore::tryCreateAudioBufferList): make method static as it's not used elsewhere.
(WebCore::destroyAudioBufferList): make method static as it's not used elsewhere.
(WebCore::validateAudioBufferList): make method static as it's not used elsewhere.
(WebCore::AudioFileReader::AudioFileReader):
(WebCore::AudioFileReader::~AudioFileReader):
(WebCore::AudioFileReader::readProc):
(WebCore::AudioFileReader::getSizeProc):
(WebCore::AudioFileReader::createBus):
(WebCore::createBusFromAudioFile):
(WebCore::createBusFromInMemoryAudioFile):
* platform/audio/cocoa/AudioFileReaderCocoa.h:
(WebCore::AudioFileReader::data const):
(WebCore::AudioFileReader::dataSize const):
* platform/audio/ios/AudioFileReaderIOS.cpp: Removed.
* platform/audio/ios/AudioFileReaderIOS.h: Removed.
* platform/audio/mac/AudioFileReaderMac.cpp: Removed.
* platform/audio/mac/AudioFileReaderMac.h: Removed.

Modified Paths

Removed Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (279101 => 279102)


--- trunk/Source/WebCore/ChangeLog	2021-06-22 02:15:51 UTC (rev 279101)
+++ trunk/Source/WebCore/ChangeLog	2021-06-22 04:21:54 UTC (rev 279102)
@@ -1,3 +1,36 @@
+2021-06-21  Jean-Yves Avenard  <[email protected]>
+
+        Merge AudioFileReaderMac and AudioFileReaderIOS into AudioFileReaderCocoa
+        https://bugs.webkit.org/show_bug.cgi?id=227205
+        <rdar://problem/79549527>
+
+        Reviewed by Chris Dumez.
+
+        Merge AudioFileReaderIOS and AudioFileReaderMac into AudioFileReaderCocoa.
+        No change in functionality.
+
+        * PlatformMac.cmake:
+        * SourcesCocoa.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/audio/cocoa/AudioFileReaderCocoa.cpp:
+        (WebCore::tryCreateAudioBufferList): make method static as it's not used elsewhere.
+        (WebCore::destroyAudioBufferList): make method static as it's not used elsewhere.
+        (WebCore::validateAudioBufferList): make method static as it's not used elsewhere.
+        (WebCore::AudioFileReader::AudioFileReader):
+        (WebCore::AudioFileReader::~AudioFileReader):
+        (WebCore::AudioFileReader::readProc):
+        (WebCore::AudioFileReader::getSizeProc):
+        (WebCore::AudioFileReader::createBus):
+        (WebCore::createBusFromAudioFile):
+        (WebCore::createBusFromInMemoryAudioFile):
+        * platform/audio/cocoa/AudioFileReaderCocoa.h:
+        (WebCore::AudioFileReader::data const):
+        (WebCore::AudioFileReader::dataSize const):
+        * platform/audio/ios/AudioFileReaderIOS.cpp: Removed.
+        * platform/audio/ios/AudioFileReaderIOS.h: Removed.
+        * platform/audio/mac/AudioFileReaderMac.cpp: Removed.
+        * platform/audio/mac/AudioFileReaderMac.h: Removed.
+
 2021-06-21  Wenson Hsieh  <[email protected]>
 
         [macOS] [WebKitLegacy] Non-actionable "Look Up" action appears when right clicking images

Modified: trunk/Source/WebCore/PlatformMac.cmake (279101 => 279102)


--- trunk/Source/WebCore/PlatformMac.cmake	2021-06-22 02:15:51 UTC (rev 279101)
+++ trunk/Source/WebCore/PlatformMac.cmake	2021-06-22 04:21:54 UTC (rev 279102)
@@ -205,7 +205,6 @@
     platform/audio/cocoa/WebAudioBufferList.cpp
 
     platform/audio/mac/AudioBusMac.mm
-    platform/audio/mac/AudioFileReaderMac.cpp
     platform/audio/mac/AudioHardwareListenerMac.cpp
     platform/audio/mac/FFTFrameMac.cpp
 

Modified: trunk/Source/WebCore/SourcesCocoa.txt (279101 => 279102)


--- trunk/Source/WebCore/SourcesCocoa.txt	2021-06-22 02:15:51 UTC (rev 279101)
+++ trunk/Source/WebCore/SourcesCocoa.txt	2021-06-22 04:21:54 UTC (rev 279102)
@@ -225,13 +225,11 @@
 platform/audio/cocoa/MediaSessionManagerCocoa.mm
 platform/audio/cocoa/WebAudioBufferList.cpp
 platform/audio/ios/AudioOutputUnitAdaptorIOS.cpp @no-unify
-platform/audio/ios/AudioFileReaderIOS.cpp @no-unify
 platform/audio/ios/AudioSessionIOS.mm @no-unify
 platform/audio/ios/MediaSessionHelperIOS.mm @no-unify
 platform/audio/ios/MediaSessionManagerIOS.mm @no-unify
 platform/audio/mac/AudioBusMac.mm
 platform/audio/mac/AudioOutputUnitAdaptorMac.cpp
-platform/audio/mac/AudioFileReaderMac.cpp
 platform/audio/mac/AudioHardwareListenerMac.cpp
 platform/audio/mac/AudioSessionMac.mm
 platform/audio/mac/FFTFrameMac.cpp

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (279101 => 279102)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2021-06-22 02:15:51 UTC (rev 279101)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2021-06-22 04:21:54 UTC (rev 279102)
@@ -4381,8 +4381,6 @@
 		CD5393D4175E018600C07123 /* JSMemoryInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = CD5393D2175E018600C07123 /* JSMemoryInfo.h */; };
 		CD54A762180F9F7000B076C9 /* AudioTrackPrivateMediaSourceAVFObjC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD54A760180F9F7000B076C9 /* AudioTrackPrivateMediaSourceAVFObjC.cpp */; };
 		CD54A763180F9F7000B076C9 /* AudioTrackPrivateMediaSourceAVFObjC.h in Headers */ = {isa = PBXBuildFile; fileRef = CD54A761180F9F7000B076C9 /* AudioTrackPrivateMediaSourceAVFObjC.h */; };
-		CD5596911475B678001D0BD0 /* AudioFileReaderIOS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD55968F1475B678001D0BD0 /* AudioFileReaderIOS.cpp */; };
-		CD5596921475B678001D0BD0 /* AudioFileReaderIOS.h in Headers */ = {isa = PBXBuildFile; fileRef = CD5596901475B678001D0BD0 /* AudioFileReaderIOS.h */; };
 		CD5896E21CD2B15100B3BCC8 /* WebPlaybackControlsManager.h in Headers */ = {isa = PBXBuildFile; fileRef = CD5896E01CD2B15100B3BCC8 /* WebPlaybackControlsManager.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		CD5D27781E8318E000D80A3D /* WebCoreDecompressionSession.h in Headers */ = {isa = PBXBuildFile; fileRef = CD5D27761E8318E000D80A3D /* WebCoreDecompressionSession.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		CD5E5B5F1A15CE54000C609E /* PageConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = CD5E5B5E1A15CE54000C609E /* PageConfiguration.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -15014,8 +15012,6 @@
 		CD54A760180F9F7000B076C9 /* AudioTrackPrivateMediaSourceAVFObjC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioTrackPrivateMediaSourceAVFObjC.cpp; sourceTree = "<group>"; };
 		CD54A761180F9F7000B076C9 /* AudioTrackPrivateMediaSourceAVFObjC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioTrackPrivateMediaSourceAVFObjC.h; sourceTree = "<group>"; };
 		CD54DE4917469C6D005E5B36 /* AudioSessionMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AudioSessionMac.mm; sourceTree = "<group>"; };
-		CD55968F1475B678001D0BD0 /* AudioFileReaderIOS.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioFileReaderIOS.cpp; sourceTree = "<group>"; };
-		CD5596901475B678001D0BD0 /* AudioFileReaderIOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioFileReaderIOS.h; sourceTree = "<group>"; };
 		CD58949321874064004F424A /* ImageBufferUtilitiesCG.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ImageBufferUtilitiesCG.cpp; sourceTree = "<group>"; };
 		CD5896DF1CD2B15100B3BCC8 /* WebPlaybackControlsManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebPlaybackControlsManager.mm; sourceTree = "<group>"; };
 		CD5896E01CD2B15100B3BCC8 /* WebPlaybackControlsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebPlaybackControlsManager.h; sourceTree = "<group>"; };
@@ -17234,8 +17230,6 @@
 		FD31607912B026F700C1A359 /* VectorMath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VectorMath.h; sourceTree = "<group>"; };
 		FD3160B512B0272A00C1A359 /* AudioBusMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AudioBusMac.mm; sourceTree = "<group>"; };
 		FD3160B612B0272A00C1A359 /* AudioOutputUnitAdaptorMac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioOutputUnitAdaptorMac.cpp; sourceTree = "<group>"; };
-		FD3160B812B0272A00C1A359 /* AudioFileReaderMac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioFileReaderMac.cpp; sourceTree = "<group>"; };
-		FD3160B912B0272A00C1A359 /* AudioFileReaderMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioFileReaderMac.h; sourceTree = "<group>"; };
 		FD3160BA12B0272A00C1A359 /* FFTFrameMac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FFTFrameMac.cpp; sourceTree = "<group>"; };
 		FD35918D138DB22000E1EBEC /* AudioParamTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioParamTimeline.cpp; sourceTree = "<group>"; };
 		FD35918E138DB22000E1EBEC /* AudioParamTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioParamTimeline.h; sourceTree = "<group>"; };
@@ -28386,8 +28380,6 @@
 		CD0EEE0D14743E48003EAFA2 /* ios */ = {
 			isa = PBXGroup;
 			children = (
-				CD55968F1475B678001D0BD0 /* AudioFileReaderIOS.cpp */,
-				CD5596901475B678001D0BD0 /* AudioFileReaderIOS.h */,
 				CD0EEE0B14743E35003EAFA2 /* AudioOutputUnitAdaptorIOS.cpp */,
 				CD36C1612607E78600C8C529 /* AudioSessionIOS.h */,
 				CDA79825170A279000D45C55 /* AudioSessionIOS.mm */,
@@ -31461,8 +31453,6 @@
 			isa = PBXGroup;
 			children = (
 				FD3160B512B0272A00C1A359 /* AudioBusMac.mm */,
-				FD3160B812B0272A00C1A359 /* AudioFileReaderMac.cpp */,
-				FD3160B912B0272A00C1A359 /* AudioFileReaderMac.h */,
 				CD2F4A2518D8A3490063746D /* AudioHardwareListenerMac.cpp */,
 				CD2F4A2618D8A3490063746D /* AudioHardwareListenerMac.h */,
 				FD3160B612B0272A00C1A359 /* AudioOutputUnitAdaptorMac.cpp */,
@@ -36666,7 +36656,6 @@
 			files = (
 				A9787CB41F5F5C6600C551C6 /* AccessibilityMediaObject.cpp in Sources */,
 				C1F7B7312448F2AC00124557 /* AGXCompilerService.cpp in Sources */,
-				CD5596911475B678001D0BD0 /* AudioFileReaderIOS.cpp in Sources */,
 				CD0EEE0E14743F39003EAFA2 /* AudioOutputUnitAdaptorIOS.cpp in Sources */,
 				CDA79827170A279100D45C55 /* AudioSessionIOS.mm in Sources */,
 				CD8A7BBB197735FE00CBD643 /* AudioSourceProviderAVFObjC.mm in Sources */,

Modified: trunk/Source/WebCore/platform/audio/cocoa/AudioFileReaderCocoa.cpp (279101 => 279102)


--- trunk/Source/WebCore/platform/audio/cocoa/AudioFileReaderCocoa.cpp	2021-06-22 02:15:51 UTC (rev 279101)
+++ trunk/Source/WebCore/platform/audio/cocoa/AudioFileReaderCocoa.cpp	2021-06-22 04:21:54 UTC (rev 279102)
@@ -32,11 +32,32 @@
 #if ENABLE(WEB_AUDIO)
 #include "AudioFileReaderCocoa.h"
 
+#include "AudioBus.h"
+#include "AudioFileReader.h"
+#include "FloatConversion.h"
+#include "Logging.h"
+#include <CoreFoundation/CoreFoundation.h>
+#include <wtf/CheckedArithmetic.h>
 #include <wtf/FastMalloc.h>
+#include <wtf/RetainPtr.h>
 
+#if PLATFORM(IOS_FAMILY)
+#include <wtf/SoftLinking.h>
+
+SOFT_LINK_FRAMEWORK(AudioToolbox)
+SOFT_LINK(AudioToolbox, AudioFileClose, OSStatus, (AudioFileID inAudioFile), (inAudioFile))
+SOFT_LINK(AudioToolbox, AudioFileOpenWithCallbacks, OSStatus, (void *inClientData, AudioFile_ReadProc inReadFunc, AudioFile_WriteProc inWriteFunc, AudioFile_GetSizeProc inGetSizeFunc, AudioFile_SetSizeProc inSetSizeFunc, AudioFileTypeID inFileTypeHint, AudioFileID *outAudioFile), (inClientData, inReadFunc, inWriteFunc, inGetSizeFunc, inSetSizeFunc, inFileTypeHint, outAudioFile))
+SOFT_LINK(AudioToolbox, ExtAudioFileDispose, OSStatus, (ExtAudioFileRef inExtAudioFile), (inExtAudioFile))
+SOFT_LINK(AudioToolbox, ExtAudioFileGetProperty, OSStatus, (ExtAudioFileRef inExtAudioFile, ExtAudioFilePropertyID inPropertyID, UInt32 *ioPropertyDataSize, void *outPropertyData), (inExtAudioFile, inPropertyID, ioPropertyDataSize, outPropertyData))
+SOFT_LINK(AudioToolbox, ExtAudioFileRead, OSStatus, (ExtAudioFileRef inExtAudioFile, UInt32 *ioNumberFrames, AudioBufferList *ioData), (inExtAudioFile, ioNumberFrames, ioData))
+SOFT_LINK(AudioToolbox, ExtAudioFileSetProperty, OSStatus, (ExtAudioFileRef inExtAudioFile, ExtAudioFilePropertyID inPropertyID, UInt32 inPropertyDataSize, const void *inPropertyData), (inExtAudioFile, inPropertyID, inPropertyDataSize, inPropertyData))
+SOFT_LINK(AudioToolbox, ExtAudioFileWrapAudioFileID, OSStatus, (AudioFileID inFileID, Boolean inForWriting, ExtAudioFileRef *outExtAudioFile), (inFileID, inForWriting, outExtAudioFile))
+SOFT_LINK(AudioToolbox, ExtAudioFileOpenURL, OSStatus, (CFURLRef inURL, ExtAudioFileRef* outExtAudioFile), (inURL, outExtAudioFile))
+#endif
+
 namespace WebCore {
 
-AudioBufferList* tryCreateAudioBufferList(size_t numberOfBuffers)
+static WARN_UNUSED_RETURN AudioBufferList* tryCreateAudioBufferList(size_t numberOfBuffers)
 {
     CheckedSize bufferListSize = sizeof(AudioBufferList) - sizeof(AudioBuffer);
     bufferListSize += numberOfBuffers * sizeof(AudioBuffer);
@@ -52,12 +73,12 @@
     return bufferList;
 }
 
-void destroyAudioBufferList(AudioBufferList* bufferList)
+static inline void destroyAudioBufferList(AudioBufferList* bufferList)
 {
     fastFree(bufferList);
 }
 
-bool validateAudioBufferList(AudioBufferList* bufferList)
+static bool validateAudioBufferList(AudioBufferList* bufferList)
 {
     if (!bufferList)
         return false;
@@ -78,6 +99,189 @@
     return true;
 }
 
+AudioFileReader::AudioFileReader(const char* filePath)
+{
+    auto filePathString = adoptCF(CFStringCreateWithCString(kCFAllocatorDefault, filePath, kCFStringEncodingUTF8));
+    auto urlRef = adoptCF(CFURLCreateWithFileSystemPath(kCFAllocatorDefault, filePathString.get(), kCFURLPOSIXPathStyle, false));
+    if (!urlRef)
+        return;
+    ExtAudioFileOpenURL(urlRef.get(), &m_extAudioFileRef);
 }
 
+AudioFileReader::AudioFileReader(const void* data, size_t dataSize)
+    : m_data(data)
+    , m_dataSize(dataSize)
+{
+    if (AudioFileOpenWithCallbacks(this, readProc, 0, getSizeProc, 0, 0, &m_audioFileID) != noErr)
+        return;
+
+    if (ExtAudioFileWrapAudioFileID(m_audioFileID, false, &m_extAudioFileRef) != noErr)
+        m_extAudioFileRef = 0;
+}
+
+AudioFileReader::~AudioFileReader()
+{
+    if (m_extAudioFileRef)
+        ExtAudioFileDispose(m_extAudioFileRef);
+
+    m_extAudioFileRef = 0;
+
+    if (m_audioFileID)
+        AudioFileClose(m_audioFileID);
+
+    m_audioFileID = 0;
+}
+
+OSStatus AudioFileReader::readProc(void* clientData, SInt64 position, UInt32 requestCount, void* buffer, UInt32* actualCount)
+{
+    auto* audioFileReader = static_cast<AudioFileReader*>(clientData);
+
+    auto dataSize = audioFileReader->dataSize();
+    auto* data = ""
+    size_t bytesToRead = 0;
+
+    if (static_cast<UInt64>(position) < dataSize) {
+        size_t bytesAvailable = dataSize - static_cast<size_t>(position);
+        bytesToRead = requestCount <= bytesAvailable ? requestCount : bytesAvailable;
+        memcpy(buffer, static_cast<const uint8_t*>(data) + position, bytesToRead);
+    }
+
+    if (actualCount)
+        *actualCount = bytesToRead;
+
+    return noErr;
+}
+
+SInt64 AudioFileReader::getSizeProc(void* clientData)
+{
+    return static_cast<AudioFileReader*>(clientData)->dataSize();
+}
+
+RefPtr<AudioBus> AudioFileReader::createBus(float sampleRate, bool mixToMono)
+{
+    if (!m_extAudioFileRef)
+        return nullptr;
+
+    // Get file's data format
+    UInt32 size = sizeof(m_fileDataFormat);
+    if (ExtAudioFileGetProperty(m_extAudioFileRef, kExtAudioFileProperty_FileDataFormat, &size, &m_fileDataFormat) != noErr)
+        return nullptr;
+
+    size_t numberOfChannels = m_fileDataFormat.mChannelsPerFrame;
+
+    // Number of frames
+    SInt64 numberOfFrames64 = 0;
+    size = sizeof(numberOfFrames64);
+    if (ExtAudioFileGetProperty(m_extAudioFileRef, kExtAudioFileProperty_FileLengthFrames, &size, &numberOfFrames64) != noErr || numberOfFrames64 <= 0)
+        return nullptr;
+
+    double fileSampleRate = m_fileDataFormat.mSampleRate;
+
+    // Make client format same number of channels as file format, but tweak a few things.
+    // Client format will be linear PCM (canonical), and potentially change sample-rate.
+    m_clientDataFormat = m_fileDataFormat;
+
+    const int bytesPerFloat = sizeof(Float32);
+    const int bitsPerByte = 8;
+    m_clientDataFormat.mFormatID = kAudioFormatLinearPCM;
+    m_clientDataFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved;
+    m_clientDataFormat.mBytesPerPacket = bytesPerFloat;
+    m_clientDataFormat.mFramesPerPacket = 1;
+    m_clientDataFormat.mBytesPerFrame = bytesPerFloat;
+    m_clientDataFormat.mChannelsPerFrame = numberOfChannels;
+    m_clientDataFormat.mBitsPerChannel = bitsPerByte * bytesPerFloat;
+
+    if (sampleRate)
+        m_clientDataFormat.mSampleRate = sampleRate;
+
+    if (ExtAudioFileSetProperty(m_extAudioFileRef, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &m_clientDataFormat) != noErr)
+        return nullptr;
+
+    // Change numberOfFrames64 to destination sample-rate
+    numberOfFrames64 = numberOfFrames64 * (m_clientDataFormat.mSampleRate / fileSampleRate);
+    size_t numberOfFrames = static_cast<size_t>(numberOfFrames64);
+
+    size_t busChannelCount = mixToMono ? 1 : numberOfChannels;
+
+    // Create AudioBus where we'll put the PCM audio data
+    auto audioBus = AudioBus::create(busChannelCount, numberOfFrames);
+    audioBus->setSampleRate(narrowPrecisionToFloat(m_clientDataFormat.mSampleRate)); // save for later
+
+    // Only allocated in the mixToMono case; deallocated on destruction.
+    AudioFloatArray leftChannel;
+    AudioFloatArray rightChannel;
+
+    AudioBufferList* bufferList = tryCreateAudioBufferList(numberOfChannels);
+    if (!bufferList) {
+        RELEASE_LOG_FAULT(WebAudio, "tryCreateAudioBufferList(%ld) returned null", numberOfChannels);
+        return nullptr;
+    }
+    const size_t bufferSize = numberOfFrames * sizeof(float);
+
+    RELEASE_ASSERT(bufferList->mNumberBuffers == numberOfChannels);
+    if (mixToMono && numberOfChannels == 2) {
+        leftChannel.resize(numberOfFrames);
+        rightChannel.resize(numberOfFrames);
+
+        bufferList->mBuffers[0].mNumberChannels = 1;
+        bufferList->mBuffers[0].mDataByteSize = bufferSize;
+        bufferList->mBuffers[0].mData = leftChannel.data();
+
+        bufferList->mBuffers[1].mNumberChannels = 1;
+        bufferList->mBuffers[1].mDataByteSize = bufferSize;
+        bufferList->mBuffers[1].mData = rightChannel.data();
+    } else {
+        RELEASE_ASSERT(!mixToMono || numberOfChannels == 1);
+
+        // For True-stereo (numberOfChannels == 4)
+        for (size_t i = 0; i < numberOfChannels; ++i) {
+            audioBus->channel(i)->zero();
+            bufferList->mBuffers[i].mNumberChannels = 1;
+            bufferList->mBuffers[i].mDataByteSize = bufferSize;
+            bufferList->mBuffers[i].mData = audioBus->channel(i)->mutableData();
+            ASSERT(bufferList->mBuffers[i].mData);
+        }
+    }
+
+    if (!validateAudioBufferList(bufferList)) {
+        RELEASE_LOG_FAULT(WebAudio, "Generated buffer in AudioFileReader::createBus() did not pass validation");
+        ASSERT_NOT_REACHED();
+        destroyAudioBufferList(bufferList);
+        return nullptr;
+    }
+
+    // Read from the file (or in-memory version)
+    UInt32 framesToRead = numberOfFrames;
+    if (ExtAudioFileRead(m_extAudioFileRef, &framesToRead, bufferList) != noErr) {
+        destroyAudioBufferList(bufferList);
+        return nullptr;
+    }
+
+    if (mixToMono && numberOfChannels == 2) {
+        // Mix stereo down to mono
+        float* destL = audioBus->channel(0)->mutableData();
+        for (size_t i = 0; i < numberOfFrames; ++i)
+            destL[i] = 0.5f * (leftChannel[i] + rightChannel[i]);
+    }
+
+    // Cleanup
+    destroyAudioBufferList(bufferList);
+
+    return audioBus;
+}
+
+RefPtr<AudioBus> createBusFromAudioFile(const char* filePath, bool mixToMono, float sampleRate)
+{
+    AudioFileReader reader(filePath);
+    return reader.createBus(sampleRate, mixToMono);
+}
+
+RefPtr<AudioBus> createBusFromInMemoryAudioFile(const void* data, size_t dataSize, bool mixToMono, float sampleRate)
+{
+    AudioFileReader reader(data, dataSize);
+    return reader.createBus(sampleRate, mixToMono);
+}
+
+} // WebCore
+
 #endif // ENABLE(WEB_AUDIO)

Modified: trunk/Source/WebCore/platform/audio/cocoa/AudioFileReaderCocoa.h (279101 => 279102)


--- trunk/Source/WebCore/platform/audio/cocoa/AudioFileReaderCocoa.h	2021-06-22 02:15:51 UTC (rev 279101)
+++ trunk/Source/WebCore/platform/audio/cocoa/AudioFileReaderCocoa.h	2021-06-22 04:21:54 UTC (rev 279102)
@@ -31,12 +31,41 @@
 
 #if ENABLE(WEB_AUDIO)
 
+#include <AudioToolbox/AudioFile.h>
+#include <AudioToolbox/ExtendedAudioFile.h>
+#include <wtf/RefPtr.h>
+
 namespace WebCore {
 
-WARN_UNUSED_RETURN AudioBufferList* tryCreateAudioBufferList(size_t numberOfBuffers);
-void destroyAudioBufferList(AudioBufferList*);
-bool validateAudioBufferList(AudioBufferList*);
+class AudioBus;
 
+// Wrapper class for AudioFile and ExtAudioFile CoreAudio APIs for reading files and in-memory versions of them...
+
+class AudioFileReader {
+public:
+    explicit AudioFileReader(const char* filePath);
+    explicit AudioFileReader(const void* data, size_t dataSize);
+    ~AudioFileReader();
+
+    RefPtr<AudioBus> createBus(float sampleRate, bool mixToMono); // Returns nullptr on error
+
+    const void* data() const { return m_data; }
+    size_t dataSize() const { return m_dataSize; }
+
+private:
+    static OSStatus readProc(void* clientData, SInt64 position, UInt32 requestCount, void* buffer, UInt32* actualCount);
+    static SInt64 getSizeProc(void* clientData);
+
+    const void* m_data = { nullptr };
+    size_t m_dataSize = { 0 };
+
+    AudioFileID m_audioFileID = { 0 };
+    ExtAudioFileRef m_extAudioFileRef = { nullptr };
+
+    AudioStreamBasicDescription m_fileDataFormat;
+    AudioStreamBasicDescription m_clientDataFormat;
+};
+
 }
 
 #endif // ENABLE(WEB_AUDIO)

Deleted: trunk/Source/WebCore/platform/audio/ios/AudioFileReaderIOS.cpp (279101 => 279102)


--- trunk/Source/WebCore/platform/audio/ios/AudioFileReaderIOS.cpp	2021-06-22 02:15:51 UTC (rev 279101)
+++ trunk/Source/WebCore/platform/audio/ios/AudioFileReaderIOS.cpp	2021-06-22 04:21:54 UTC (rev 279102)
@@ -1,245 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc. All rights reserved.
- * Copyright (C) 2011 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "AudioFileReaderIOS.h"
-
-#if ENABLE(WEB_AUDIO) && PLATFORM(IOS_FAMILY)
-
-#include "AudioBus.h"
-#include "AudioFileReader.h"
-#include "AudioFileReaderCocoa.h"
-#include "Logging.h"
-#include <CoreFoundation/CoreFoundation.h>
-#include <wtf/CheckedArithmetic.h>
-#include <wtf/RetainPtr.h>
-#include <wtf/SoftLinking.h>
-
-SOFT_LINK_FRAMEWORK(AudioToolbox)
-SOFT_LINK(AudioToolbox, AudioFileClose, OSStatus, (AudioFileID inAudioFile), (inAudioFile))
-SOFT_LINK(AudioToolbox, AudioFileOpenWithCallbacks, OSStatus, (void *inClientData, AudioFile_ReadProc inReadFunc, AudioFile_WriteProc inWriteFunc, AudioFile_GetSizeProc inGetSizeFunc, AudioFile_SetSizeProc inSetSizeFunc, AudioFileTypeID inFileTypeHint, AudioFileID *outAudioFile), (inClientData, inReadFunc, inWriteFunc, inGetSizeFunc, inSetSizeFunc, inFileTypeHint, outAudioFile))
-SOFT_LINK(AudioToolbox, ExtAudioFileDispose, OSStatus, (ExtAudioFileRef inExtAudioFile), (inExtAudioFile))
-SOFT_LINK(AudioToolbox, ExtAudioFileGetProperty, OSStatus, (ExtAudioFileRef inExtAudioFile, ExtAudioFilePropertyID inPropertyID, UInt32 *ioPropertyDataSize, void *outPropertyData), (inExtAudioFile, inPropertyID, ioPropertyDataSize, outPropertyData))
-SOFT_LINK(AudioToolbox, ExtAudioFileRead, OSStatus, (ExtAudioFileRef inExtAudioFile, UInt32 *ioNumberFrames, AudioBufferList *ioData), (inExtAudioFile, ioNumberFrames, ioData))
-SOFT_LINK(AudioToolbox, ExtAudioFileSetProperty, OSStatus, (ExtAudioFileRef inExtAudioFile, ExtAudioFilePropertyID inPropertyID, UInt32 inPropertyDataSize, const void *inPropertyData), (inExtAudioFile, inPropertyID, inPropertyDataSize, inPropertyData))
-SOFT_LINK(AudioToolbox, ExtAudioFileWrapAudioFileID, OSStatus, (AudioFileID inFileID, Boolean inForWriting, ExtAudioFileRef *outExtAudioFile), (inFileID, inForWriting, outExtAudioFile))
-SOFT_LINK(AudioToolbox, ExtAudioFileOpenURL, OSStatus, (CFURLRef inURL, ExtAudioFileRef* outExtAudioFile), (inURL, outExtAudioFile))
-
-namespace WebCore {
-
-AudioFileReader::AudioFileReader(const char* filePath)
-    : m_data(0)
-    , m_dataSize(0)
-    , m_audioFileID(0)
-    , m_extAudioFileRef(nullptr)
-{
-    RetainPtr<CFURLRef> urlRef = adoptCF(CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, reinterpret_cast<const UInt8*>(filePath), strlen(filePath), false));
-    if (!urlRef)
-        return;
-    ExtAudioFileOpenURL(urlRef.get(), &m_extAudioFileRef);
-}
-
-AudioFileReader::AudioFileReader(const void* data, size_t dataSize)
-    : m_data(data)
-    , m_dataSize(dataSize)
-    , m_audioFileID(0)
-    , m_extAudioFileRef(nullptr)
-{
-    if (AudioFileOpenWithCallbacks(this, readProc, 0, getSizeProc, 0, 0, &m_audioFileID) != noErr)
-        return;
-
-    if (ExtAudioFileWrapAudioFileID(m_audioFileID, false, &m_extAudioFileRef) != noErr)
-        m_extAudioFileRef = nullptr;
-}
-
-AudioFileReader::~AudioFileReader()
-{
-    if (m_extAudioFileRef)
-        ExtAudioFileDispose(m_extAudioFileRef);
-
-    m_extAudioFileRef = nullptr;
-
-    if (m_audioFileID)
-        AudioFileClose(m_audioFileID);
-
-    m_audioFileID = 0;
-}
-
-OSStatus AudioFileReader::readProc(void* clientData, SInt64 position, UInt32 requestCount, void* buffer, UInt32* actualCount)
-{
-    AudioFileReader* audioFileReader = static_cast<AudioFileReader*>(clientData);
-
-    size_t dataSize = audioFileReader->dataSize();
-    const void* data = ""
-    size_t bytesToRead = 0;
-
-    if (static_cast<UInt64>(position) < dataSize) {
-        size_t bytesAvailable = dataSize - static_cast<size_t>(position);
-        bytesToRead = requestCount <= bytesAvailable ? requestCount : bytesAvailable;
-        memcpy(buffer, static_cast<const uint8_t*>(data) + position, bytesToRead);
-    }
-
-    if (actualCount)
-        *actualCount = bytesToRead;
-
-    return noErr;
-}
-
-SInt64 AudioFileReader::getSizeProc(void* clientData)
-{
-    return static_cast<AudioFileReader*>(clientData)->dataSize();
-}
-
-RefPtr<AudioBus> AudioFileReader::createBus(float sampleRate, bool mixToMono)
-{
-    if (!m_extAudioFileRef)
-        return nullptr;
-
-    // Get file's data format
-    UInt32 size = sizeof(m_fileDataFormat);
-    if (ExtAudioFileGetProperty(m_extAudioFileRef, kExtAudioFileProperty_FileDataFormat, &size, &m_fileDataFormat) != noErr)
-        return nullptr;
-
-    size_t numberOfChannels = m_fileDataFormat.mChannelsPerFrame;
-
-    // Number of frames
-    SInt64 numberOfFrames64 = 0;
-    size = sizeof(numberOfFrames64);
-    if (ExtAudioFileGetProperty(m_extAudioFileRef, kExtAudioFileProperty_FileLengthFrames, &size, &numberOfFrames64) != noErr)
-        return nullptr;
-
-    double fileSampleRate = m_fileDataFormat.mSampleRate;
-
-    // Make client format same number of channels as file format, but tweak a few things.
-    // Client format will be linear PCM (canonical), and potentially change sample-rate.
-    m_clientDataFormat = m_fileDataFormat;
-
-    const int bytesPerFloat = sizeof(Float32);
-    const int bitsPerByte = 8;
-    m_clientDataFormat.mFormatID = kAudioFormatLinearPCM;
-    m_clientDataFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved;
-    m_clientDataFormat.mBytesPerPacket = bytesPerFloat;
-    m_clientDataFormat.mFramesPerPacket = 1;
-    m_clientDataFormat.mBytesPerFrame = bytesPerFloat;
-    m_clientDataFormat.mChannelsPerFrame = numberOfChannels;
-    m_clientDataFormat.mBitsPerChannel = bitsPerByte * bytesPerFloat;
-
-    if (sampleRate)
-        m_clientDataFormat.mSampleRate = sampleRate;
-
-    if (ExtAudioFileSetProperty(m_extAudioFileRef, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &m_clientDataFormat) != noErr)
-        return nullptr;
-
-    // Change numberOfFrames64 to destination sample-rate
-    numberOfFrames64 = numberOfFrames64 * (m_clientDataFormat.mSampleRate / fileSampleRate);
-    size_t numberOfFrames = static_cast<size_t>(numberOfFrames64);
-
-    size_t busChannelCount = mixToMono ? 1 : numberOfChannels;
-
-    // Create AudioBus where we'll put the PCM audio data
-    auto audioBus = AudioBus::create(busChannelCount, numberOfFrames);
-    audioBus->setSampleRate(m_clientDataFormat.mSampleRate); // save for later
-
-    // Only allocated in the mixToMono case; deallocated on destruction.
-    AudioFloatArray leftChannel;
-    AudioFloatArray rightChannel;
-
-    AudioBufferList* bufferList = tryCreateAudioBufferList(numberOfChannels);
-    if (!bufferList) {
-        RELEASE_LOG_FAULT(WebAudio, "tryCreateAudioBufferList(%ld) returned null", numberOfChannels);
-        return nullptr;
-    }
-    const size_t bufferSize = numberOfFrames * sizeof(float);
-
-    RELEASE_ASSERT(bufferList->mNumberBuffers == numberOfChannels);
-    if (mixToMono && numberOfChannels == 2) {
-        leftChannel.resize(numberOfFrames);
-        rightChannel.resize(numberOfFrames);
-
-        bufferList->mBuffers[0].mNumberChannels = 1;
-        bufferList->mBuffers[0].mDataByteSize = bufferSize;
-        bufferList->mBuffers[0].mData = leftChannel.data();
-
-        bufferList->mBuffers[1].mNumberChannels = 1;
-        bufferList->mBuffers[1].mDataByteSize = bufferSize;
-        bufferList->mBuffers[1].mData = rightChannel.data();
-    } else {
-        RELEASE_ASSERT(!mixToMono || numberOfChannels == 1);
-
-        // For True-stereo (numberOfChannels == 4)
-        for (size_t i = 0; i < numberOfChannels; ++i) {
-            audioBus->channel(i)->zero();
-            bufferList->mBuffers[i].mNumberChannels = 1;
-            bufferList->mBuffers[i].mDataByteSize = bufferSize;
-            bufferList->mBuffers[i].mData = audioBus->channel(i)->mutableData();
-            ASSERT(bufferList->mBuffers[i].mData);
-        }
-    }
-
-    if (!validateAudioBufferList(bufferList)) {
-        RELEASE_LOG_FAULT(WebAudio, "Generated buffer in AudioFileReader::createBus() did not pass validation");
-        ASSERT_NOT_REACHED();
-        destroyAudioBufferList(bufferList);
-        return nullptr;
-    }
-
-    // Read from the file (or in-memory version)
-    UInt32 framesToRead = numberOfFrames;
-    if (ExtAudioFileRead(m_extAudioFileRef, &framesToRead, bufferList) != noErr) {
-        destroyAudioBufferList(bufferList);
-        return nullptr;
-    }
-
-    if (mixToMono && numberOfChannels == 2) {
-        // Mix stereo down to mono
-        float* destL = audioBus->channel(0)->mutableData();
-        for (size_t i = 0; i < numberOfFrames; ++i)
-            destL[i] = 0.5f * (leftChannel[i] + rightChannel[i]);
-    }
-
-    destroyAudioBufferList(bufferList);
-
-    return audioBus;
-}
-
-RefPtr<AudioBus> createBusFromAudioFile(const char* filePath, bool mixToMono, float sampleRate)
-{
-    AudioFileReader reader(filePath);
-    return reader.createBus(sampleRate, mixToMono);
-}
-
-RefPtr<AudioBus> createBusFromInMemoryAudioFile(const void* data, size_t dataSize, bool mixToMono, float sampleRate)
-{
-    AudioFileReader reader(data, dataSize);
-    return reader.createBus(sampleRate, mixToMono);
-}
-
-} // WebCore
-
-#endif // ENABLE(WEB_AUDIO) && PLATFORM(IOS_FAMILY)

Deleted: trunk/Source/WebCore/platform/audio/ios/AudioFileReaderIOS.h (279101 => 279102)


--- trunk/Source/WebCore/platform/audio/ios/AudioFileReaderIOS.h	2021-06-22 02:15:51 UTC (rev 279101)
+++ trunk/Source/WebCore/platform/audio/ios/AudioFileReaderIOS.h	2021-06-22 04:21:54 UTC (rev 279102)
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc. All rights reserved.
- * Copyright (C) 2011 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#if PLATFORM(IOS_FAMILY)
-
-#include <AudioToolbox/AudioFile.h>
-#include <AudioToolbox/ExtendedAudioFile.h>
-#include <wtf/RefPtr.h>
-
-namespace WebCore {
-
-class AudioBus;
-
-// Wrapper class for AudioFile and ExtAudioFile CoreAudio APIs for reading files and in-memory versions of them...
-
-class AudioFileReader {
-public:
-    explicit AudioFileReader(const char* filePath);
-    explicit AudioFileReader(const void* data, size_t dataSize);
-    ~AudioFileReader();
-
-    RefPtr<AudioBus> createBus(float sampleRate, bool mixToMono); // Returns nullptr on error
-
-    const void* data() const { return m_data; }
-    size_t dataSize() const { return m_dataSize; }
-
-private:
-    static OSStatus readProc(void* clientData, SInt64 position, UInt32 requestCount, void* buffer, UInt32* actualCount);
-    static SInt64 getSizeProc(void* clientData);
-
-    const void* m_data;
-    size_t m_dataSize;
-
-    AudioFileID m_audioFileID;
-    ExtAudioFileRef m_extAudioFileRef;
-
-    AudioStreamBasicDescription m_fileDataFormat;
-    AudioStreamBasicDescription m_clientDataFormat;
-};
-
-} // namespace WebCore
-
-#endif // PLATFORM(IOS_FAMILY)

Deleted: trunk/Source/WebCore/platform/audio/mac/AudioFileReaderMac.cpp (279101 => 279102)


--- trunk/Source/WebCore/platform/audio/mac/AudioFileReaderMac.cpp	2021-06-22 02:15:51 UTC (rev 279101)
+++ trunk/Source/WebCore/platform/audio/mac/AudioFileReaderMac.cpp	2021-06-22 04:21:54 UTC (rev 279102)
@@ -1,252 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#if ENABLE(WEB_AUDIO)
-
-#if PLATFORM(MAC)
-
-#include "AudioFileReaderMac.h"
-
-#include "AudioBus.h"
-#include "AudioFileReader.h"
-#include "AudioFileReaderCocoa.h"
-#include "FloatConversion.h"
-#include "Logging.h"
-#include <CoreFoundation/CoreFoundation.h>
-#include <wtf/RetainPtr.h>
-
-namespace WebCore {
-
-AudioFileReader::AudioFileReader(const char* filePath)
-    : m_data(nullptr)
-    , m_dataSize(0)
-    , m_audioFileID(0)
-    , m_extAudioFileRef(0)
-{
-    RetainPtr<CFStringRef> filePathString = adoptCF(CFStringCreateWithCString(kCFAllocatorDefault, filePath, kCFStringEncodingUTF8));
-    RetainPtr<CFURLRef> url = "" filePathString.get(), kCFURLPOSIXPathStyle, false));
-    if (!url)
-        return;
-
-    ExtAudioFileOpenURL(url.get(), &m_extAudioFileRef);
-}
-
-AudioFileReader::AudioFileReader(const void* data, size_t dataSize)
-    : m_data(data)
-    , m_dataSize(dataSize)
-    , m_audioFileID(0)
-    , m_extAudioFileRef(0)
-{
-    OSStatus result = AudioFileOpenWithCallbacks(this, readProc, 0, getSizeProc, 0, 0, &m_audioFileID);
-
-    if (result != noErr)
-        return;
-
-    result = ExtAudioFileWrapAudioFileID(m_audioFileID, false, &m_extAudioFileRef);
-    if (result != noErr)
-        m_extAudioFileRef = 0;
-}
-
-AudioFileReader::~AudioFileReader()
-{
-    if (m_extAudioFileRef)
-        ExtAudioFileDispose(m_extAudioFileRef);
-
-    m_extAudioFileRef = 0;
-
-    if (m_audioFileID)
-        AudioFileClose(m_audioFileID);
-        
-    m_audioFileID = 0;
-}
-
-OSStatus AudioFileReader::readProc(void* clientData, SInt64 position, UInt32 requestCount, void* buffer, UInt32* actualCount)
-{
-    AudioFileReader* audioFileReader = static_cast<AudioFileReader*>(clientData);
-
-    size_t dataSize = audioFileReader->dataSize();
-    const void* data = ""
-    size_t bytesToRead = 0;
-
-    if (static_cast<UInt64>(position) < dataSize) {
-        size_t bytesAvailable = dataSize - static_cast<size_t>(position);
-        bytesToRead = requestCount <= bytesAvailable ? requestCount : bytesAvailable;
-        memcpy(buffer, static_cast<const uint8_t*>(data) + position, bytesToRead);
-    } else
-        bytesToRead = 0;
-
-    if (actualCount)
-        *actualCount = bytesToRead;
-
-    return noErr;
-}
-
-SInt64 AudioFileReader::getSizeProc(void* clientData)
-{
-    AudioFileReader* audioFileReader = static_cast<AudioFileReader*>(clientData);
-    return audioFileReader->dataSize();
-}
-
-RefPtr<AudioBus> AudioFileReader::createBus(float sampleRate, bool mixToMono)
-{
-    if (!m_extAudioFileRef)
-        return nullptr;
-
-    // Get file's data format
-    UInt32 size = sizeof(m_fileDataFormat);
-    OSStatus result = ExtAudioFileGetProperty(m_extAudioFileRef, kExtAudioFileProperty_FileDataFormat, &size, &m_fileDataFormat);
-    if (result != noErr)
-        return nullptr;
-
-    // Number of channels
-    size_t numberOfChannels = m_fileDataFormat.mChannelsPerFrame;
-
-    // Number of frames
-    SInt64 numberOfFrames64 = 0;
-    size = sizeof(numberOfFrames64);
-    result = ExtAudioFileGetProperty(m_extAudioFileRef, kExtAudioFileProperty_FileLengthFrames, &size, &numberOfFrames64);
-    if (result != noErr || numberOfFrames64 <= 0)
-        return nullptr;
-
-    // Sample-rate
-    double fileSampleRate = m_fileDataFormat.mSampleRate;
-
-    // Make client format same number of channels as file format, but tweak a few things.
-    // Client format will be linear PCM (canonical), and potentially change sample-rate.
-    m_clientDataFormat = m_fileDataFormat;
-
-    m_clientDataFormat.mFormatID = kAudioFormatLinearPCM;
-    m_clientDataFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked;
-    m_clientDataFormat.mBitsPerChannel = 8 * sizeof(Float32);
-    m_clientDataFormat.mChannelsPerFrame = numberOfChannels;
-    m_clientDataFormat.mFramesPerPacket = 1;
-    m_clientDataFormat.mBytesPerPacket = sizeof(Float32);
-    m_clientDataFormat.mBytesPerFrame = sizeof(Float32);
-    m_clientDataFormat.mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
-
-    if (sampleRate)
-        m_clientDataFormat.mSampleRate = sampleRate;
-
-    result = ExtAudioFileSetProperty(m_extAudioFileRef, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &m_clientDataFormat);
-    if (result != noErr)
-        return nullptr;
-
-    // Change numberOfFrames64 to destination sample-rate
-    numberOfFrames64 = numberOfFrames64 * (m_clientDataFormat.mSampleRate / fileSampleRate);
-    size_t numberOfFrames = static_cast<size_t>(numberOfFrames64);
-
-    size_t busChannelCount = mixToMono ? 1 : numberOfChannels;
-
-    // Create AudioBus where we'll put the PCM audio data
-    auto audioBus = AudioBus::create(busChannelCount, numberOfFrames);
-    audioBus->setSampleRate(narrowPrecisionToFloat(m_clientDataFormat.mSampleRate)); // save for later
-
-    // Only allocated in the mixToMono case
-    AudioFloatArray bufL;
-    AudioFloatArray bufR;
-    float* bufferL = 0;
-    float* bufferR = 0;
-    
-    // Setup AudioBufferList in preparation for reading
-    AudioBufferList* bufferList = tryCreateAudioBufferList(numberOfChannels);
-    if (!bufferList) {
-        RELEASE_LOG_FAULT(WebAudio, "tryCreateAudioBufferList(%ld) returned null", numberOfChannels);
-        return nullptr;
-    }
-
-    RELEASE_ASSERT(bufferList->mNumberBuffers == numberOfChannels);
-    if (mixToMono && numberOfChannels == 2) {
-        bufL.resize(numberOfFrames);
-        bufR.resize(numberOfFrames);
-        bufferL = bufL.data();
-        bufferR = bufR.data();
-
-        bufferList->mBuffers[0].mNumberChannels = 1;
-        bufferList->mBuffers[0].mDataByteSize = numberOfFrames * sizeof(float);
-        bufferList->mBuffers[0].mData = bufferL;
-
-        bufferList->mBuffers[1].mNumberChannels = 1;
-        bufferList->mBuffers[1].mDataByteSize = numberOfFrames * sizeof(float);
-        bufferList->mBuffers[1].mData = bufferR;
-    } else {
-        RELEASE_ASSERT(!mixToMono || numberOfChannels == 1);
-
-        // for True-stereo (numberOfChannels == 4)
-        for (size_t i = 0; i < numberOfChannels; ++i) {
-            bufferList->mBuffers[i].mNumberChannels = 1;
-            bufferList->mBuffers[i].mDataByteSize = numberOfFrames * sizeof(float);
-            bufferList->mBuffers[i].mData = audioBus->channel(i)->mutableData();
-            ASSERT(bufferList->mBuffers[i].mData);
-        }
-    }
-
-    if (!validateAudioBufferList(bufferList)) {
-        RELEASE_LOG_FAULT(WebAudio, "Generated buffer in AudioFileReader::createBus() did not pass validation");
-        ASSERT_NOT_REACHED();
-        destroyAudioBufferList(bufferList);
-        return nullptr;
-    }
-
-    // Read from the file (or in-memory version)
-    UInt32 framesToRead = numberOfFrames;
-    result = ExtAudioFileRead(m_extAudioFileRef, &framesToRead, bufferList);
-    if (result != noErr) {
-        destroyAudioBufferList(bufferList);
-        return nullptr;
-    }
-
-    if (mixToMono && numberOfChannels == 2) {
-        // Mix stereo down to mono
-        float* destL = audioBus->channel(0)->mutableData();
-        for (size_t i = 0; i < numberOfFrames; i++)
-            destL[i] = 0.5f * (bufferL[i] + bufferR[i]);
-    }
-
-    // Cleanup
-    destroyAudioBufferList(bufferList);
-
-    return audioBus;
-}
-
-RefPtr<AudioBus> createBusFromAudioFile(const char* filePath, bool mixToMono, float sampleRate)
-{
-    return AudioFileReader(filePath).createBus(sampleRate, mixToMono);
-}
-
-RefPtr<AudioBus> createBusFromInMemoryAudioFile(const void* data, size_t dataSize, bool mixToMono, float sampleRate)
-{
-    return AudioFileReader(data, dataSize).createBus(sampleRate, mixToMono);
-}
-
-} // namespace WebCore
-
-#endif // PLATFORM(MAC)
-
-#endif // ENABLE(WEB_AUDIO)

Deleted: trunk/Source/WebCore/platform/audio/mac/AudioFileReaderMac.h (279101 => 279102)


--- trunk/Source/WebCore/platform/audio/mac/AudioFileReaderMac.h	2021-06-22 02:15:51 UTC (rev 279101)
+++ trunk/Source/WebCore/platform/audio/mac/AudioFileReaderMac.h	2021-06-22 04:21:54 UTC (rev 279102)
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef AudioFileReaderMac_h
-#define AudioFileReaderMac_h
-
-#include <AudioToolbox/AudioFile.h>
-#include <AudioToolbox/ExtendedAudioFile.h>
-#include <wtf/RefPtr.h>
-
-namespace WebCore {
-
-class AudioBus;
-    
-// Wrapper class for AudioFile and ExtAudioFile CoreAudio APIs for reading files and in-memory versions of them...
-
-class AudioFileReader {
-public:
-    explicit AudioFileReader(const char* filePath);
-    explicit AudioFileReader(const void* data, size_t dataSize);
-    ~AudioFileReader();
-
-    // Returns nullptr if error
-    RefPtr<AudioBus> createBus(float sampleRate, bool mixToMono);
-
-    const void* data() const { return m_data; }
-    size_t dataSize() const { return m_dataSize; }
-
-private:
-    static OSStatus readProc(void* clientData, SInt64 position, UInt32 requestCount, void* buffer, UInt32* actualCount);
-    static SInt64 getSizeProc(void* clientData);
-
-    const void* m_data;
-    size_t m_dataSize;
-
-    AudioFileID m_audioFileID;
-    ExtAudioFileRef m_extAudioFileRef;
-
-    AudioStreamBasicDescription m_fileDataFormat;
-    AudioStreamBasicDescription m_clientDataFormat;
-};
-
-} // namespace WebCore
- 
-#endif // AudioFileReaderMac_h
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to