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