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