15abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick/* 25abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * Copyright (C) 2010 Google Inc. All rights reserved. 35abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * 45abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * Redistribution and use in source and binary forms, with or without 55abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * modification, are permitted provided that the following conditions 65abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * are met: 75abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * 85abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * 1. Redistributions of source code must retain the above copyright 95abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * notice, this list of conditions and the following disclaimer. 105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * 2. Redistributions in binary form must reproduce the above copyright 115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * notice, this list of conditions and the following disclaimer in the 125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * documentation and/or other materials provided with the distribution. 135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * its contributors may be used to endorse or promote products derived 155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * from this software without specific prior written permission. 165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * 175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick */ 285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#ifndef AudioChannel_h 305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#define AudioChannel_h 315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "AudioArray.h" 335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include <wtf/PassOwnPtr.h> 345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merricknamespace WebCore { 365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// An AudioChannel represents a buffer of non-interleaved floating-point audio samples. 385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// The PCM samples are normally assumed to be in a nominal range -1.0 -> +1.0 39ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochclass AudioChannel { 40ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch WTF_MAKE_NONCOPYABLE(AudioChannel); 415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickpublic: 425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // Memory can be externally referenced, or can be internally allocated with an AudioFloatArray. 435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // Reference an external buffer. 455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick AudioChannel(float* storage, size_t length) 465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick : m_length(length), m_rawPointer(storage) { } 475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // Manage storage for us. 495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick explicit AudioChannel(size_t length) 505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick : m_length(length) 515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick , m_rawPointer(0) 525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_memBuffer = adoptPtr(new AudioFloatArray(length)); 545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // A "blank" audio channel -- must call set() before it's useful... 575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick AudioChannel() 585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick : m_length(0) 595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick , m_rawPointer(0) 605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // Redefine the memory for this channel. 645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // storage represents external memory not managed by this object. 655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick void set(float* storage, size_t length) 665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_memBuffer.clear(); // cleanup managed storage 685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_rawPointer = storage; 695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_length = length; 705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // How many sample-frames do we contain? 735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick size_t length() const { return m_length; } 745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // Direct access to PCM sample data 765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick float* data() { return m_rawPointer ? m_rawPointer : m_memBuffer->data(); } 775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick const float* data() const { return m_rawPointer ? m_rawPointer : m_memBuffer->data(); } 785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // Zeroes out all sample values in buffer. 805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick void zero() 815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (m_memBuffer.get()) 835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_memBuffer->zero(); 845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else 855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick memset(m_rawPointer, 0, sizeof(float) * m_length); 865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // Scales all samples by the same amount. 895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick void scale(double scale); 905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // A simple memcpy() from the source channel 925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick void copyFrom(const AudioChannel* sourceChannel); 935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // Copies the given range from the source channel. 955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick void copyFromRange(const AudioChannel* sourceChannel, unsigned startFrame, unsigned endFrame); 965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // Sums (with unity gain) from the source channel. 985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick void sumFrom(const AudioChannel* sourceChannel); 995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // Returns maximum absolute value (useful for normalization). 1015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick float maxAbsValue() const; 1025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickprivate: 1045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick size_t m_length; 1055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick float* m_rawPointer; 1075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick OwnPtr<AudioFloatArray> m_memBuffer; 1085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}; 1095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} // WebCore 1115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif // AudioChannel_h 113