root/src/apps/cortex/addons/AudioAdapter/AudioAdapterParams.cpp
/*
 * Copyright (c) 1999-2000, Eric Moon.
 * 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. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR 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.
 */


// AudioAdapterParams.cpp

#include "AudioAdapterParams.h"

#include <Catalog.h>
#include <Debug.h>
#include <ParameterWeb.h>

#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "CortexAudioAdapter"

status_t
_AudioAdapterParams::store(int32 parameterID, const void* data, size_t size)
{
        if (size < sizeof(int32))
                return B_NO_MEMORY;

        const uint32 d = *(uint32*)data;

        switch (parameterID) {
                // input format restrictions (0='wildcard')
                case P_INPUT_FORMAT:
                        inputFormat.format = d;
                        break;
                        
                case P_INPUT_CHANNEL_COUNT:
                        inputFormat.channel_count = d;
                        break;
                
                // output format restrictions (0='wildcard')
                case P_OUTPUT_FORMAT:
                        outputFormat.format = d;
                        break;

                case P_OUTPUT_CHANNEL_COUNT:
                        outputFormat.channel_count = d;
                        break;

                default:
                        return B_BAD_INDEX;
        }
        
        return B_OK;
}

status_t _AudioAdapterParams::retrieve(
        int32                                                                           parameterID,
        void*                                                                           data,
        size_t*                                                                 ioSize) {
        
        if(*ioSize < sizeof(int32)) {
                *ioSize = sizeof(int32);
                return B_NO_MEMORY;
        }
        
        switch(parameterID) {
                // input format restrictions (0='wildcard')
                case P_INPUT_FORMAT:
                        *(uint32*)data = inputFormat.format;
                        break;
                        
                case P_INPUT_CHANNEL_COUNT:
                        *(uint32*)data = inputFormat.channel_count;
                        break;
                
                // output format restrictions (0='wildcard')
                case P_OUTPUT_FORMAT:
                        *(uint32*)data = outputFormat.format;
                        PRINT(("P_OUTPUT_FORMAT retrieved\n")); //+++++
                        break;

                case P_OUTPUT_CHANNEL_COUNT:
                        *(uint32*)data = outputFormat.channel_count;
                        break;

                default:
                        return B_BAD_INDEX;
        }
        
        return B_OK;
}

void _AudioAdapterParams::populateGroup(
        BParameterGroup*                                group) {
        
        BParameterGroup* inputGroup = group->MakeGroup(B_TRANSLATE("Input format"));
        
        BNullParameter* groupName;
        BDiscreteParameter* param;

        groupName = inputGroup->MakeNullParameter(
                0, B_MEDIA_NO_TYPE, B_TRANSLATE("Input format"), B_GENERIC);

        param = inputGroup->MakeDiscreteParameter(
                P_INPUT_FORMAT,
                B_MEDIA_NO_TYPE,
                B_TRANSLATE("Sample format:"),
                B_GENERIC);
        param->AddItem(
                0,
                "*");
        param->AddItem(
                media_multi_audio_format::B_AUDIO_FLOAT,
                "float");
        param->AddItem(
                media_multi_audio_format::B_AUDIO_SHORT,
                "short");
        param->AddItem(
                media_multi_audio_format::B_AUDIO_INT,
                "int32");
        param->AddItem(
                media_multi_audio_format::B_AUDIO_UCHAR,
                "uint8");
        
        param = inputGroup->MakeDiscreteParameter(
                P_INPUT_CHANNEL_COUNT,
                B_MEDIA_NO_TYPE,
                B_TRANSLATE("Channels:"),
                B_GENERIC);
        param->AddItem(
                0,
                "*");
        param->AddItem(
                1,
                B_TRANSLATE("mono"));
        param->AddItem(
                2,
                B_TRANSLATE("stereo"));
        param->AddItem(
                4,
                "4");
        param->AddItem(
                8,
                "8");

        BParameterGroup* outputGroup = group->MakeGroup(B_TRANSLATE("Output format"));

        groupName = outputGroup->MakeNullParameter(
                0, B_MEDIA_NO_TYPE, B_TRANSLATE("Output format"), B_GENERIC);

        param = outputGroup->MakeDiscreteParameter(
                P_OUTPUT_FORMAT,
                B_MEDIA_NO_TYPE,
                B_TRANSLATE("Sample format:"),
                B_GENERIC);
        param->AddItem(
                0,
                "*");
        param->AddItem(
                media_multi_audio_format::B_AUDIO_FLOAT,
                "float");
        param->AddItem(
                media_multi_audio_format::B_AUDIO_SHORT,
                "short");
        param->AddItem(
                media_multi_audio_format::B_AUDIO_INT,
                "int32");
        param->AddItem(
                media_multi_audio_format::B_AUDIO_UCHAR,
                "uint8");
        
        param = outputGroup->MakeDiscreteParameter(
                P_OUTPUT_CHANNEL_COUNT,
                B_MEDIA_NO_TYPE,
                B_TRANSLATE("Channels:"),
                B_GENERIC);
        param->AddItem(
                0,
                "*");
        param->AddItem(
                1,
                B_TRANSLATE("mono"));
        param->AddItem(
                2,
                B_TRANSLATE("stereo"));
        param->AddItem(
                4,
                "4");
        param->AddItem(
                8,
                "8");
}

// END -- AudioAdapterParams.cpp