/*
 * Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
 *
 * 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.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 THE COPYRIGHT HOLDERS OR
 * 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 Nix_MultiChannelPCMData_h
#define Nix_MultiChannelPCMData_h

#include "Common.h"

namespace Nix {

// A container for multi-channel linear PCM audio data.
class NIX_EXPORT MultiChannelPCMData {
public:
    MultiChannelPCMData(unsigned numberOfChannels, size_t length, double sampleRate);
    ~MultiChannelPCMData();

    unsigned numberOfChannels() const;
    size_t length() const;
    double sampleRate() const;

    // This can return null if Nix was compiled without WebAudio support.
    float* channelData(unsigned channelIndex);

#ifdef BUILDING_NIX__
    void* getInternalData();
#endif

private:
    MultiChannelPCMData(const MultiChannelPCMData&);
    void operator=(const MultiChannelPCMData&);

    void* m_data;
};

} // namespace Nix

#endif // Nix_MultiChannelPCMData_h
