root/src/add-ons/media/media-add-ons/opensound/OpenSoundDevice.h
/*
 * Copyright (c) 2002-2007, Jerome Duval (jerome.duval@free.fr)
 * Distributed under the terms of the MIT License.
 */

#ifndef _OPENSOUNDDEVICE_H
#define _OPENSOUNDDEVICE_H

#include <OS.h>
#include <List.h>
#include <MediaFormats.h>
#include <Locker.h>
#include "soundcard.h"

//
//#define OSS_PREFIX "/dev/audio/oss/"
#define OSS_PREFIX "/dev/oss/"
// should be fixed later
#define OSS_MIXER_DEV "/dev/mixer"

#define MAX_CONTROLS    128
#define MAX_CHANNELS    32
#define NB_BUFFERS              32

#define DEFAULT_BUFFER_SIZE 2048

/* define to support encoded audio (AC3, MPEG, ...) when the card supports it */
//#define ENABLE_NON_RAW_SUPPORT 1
//XXX: make it a BParameter ?

#define ENABLE_REC 1

// timeout in OpenSoundNode::RunThread()
#define MIN_SNOOZING 2000

// pretend we don't drift
#define DISABLE_DRIFT 1


/* bit mask of supported formats for raw_audio */
/* also used to mark the raw_audio node input&outputs */
//XXX: _OE ?
#define AFMT_SUPPORTED_PCM (AFMT_U8|AFMT_S8|\
                                                        AFMT_S16_NE|\
                                                        AFMT_S24_NE|AFMT_S32_NE|\
                                                        AFMT_S16_OE|\
                                                        AFMT_S24_OE|AFMT_S32_OE|\
                                                        AFMT_FLOAT)


extern const int gSupportedFormats[];
extern const char *gSupportedFormatsNames[];

class OpenSoundDeviceEngine;
class OpenSoundDeviceMixer;


class OpenSoundDevice
{
        public:
                explicit OpenSoundDevice(oss_card_info *cardinfo);
                virtual ~OpenSoundDevice(void);

                status_t                        InitDriver();
                virtual status_t InitCheck(void) const;
                
                status_t                        AddEngine(oss_audioinfo *info);
                status_t                        AddMixer(oss_mixerinfo *info);
//              status_t                        AddMidi();

                int32                                   CountEngines();
                int32                                   CountMixers();
                OpenSoundDeviceEngine   *EngineAt(int32 i);
                OpenSoundDeviceMixer    *MixerAt(int32 i);

                OpenSoundDeviceEngine   *NextFreeEngineAt(int32 i, bool rec=false);
                
                BLocker                                 *Locker() { return &fLocker; };

                static float convert_oss_rate_to_media_rate(int rate);
                static int convert_media_rate_to_oss_rate(float rate);
                static uint32 convert_oss_format_to_media_format(int fmt);
                static int convert_oss_format_to_endian(int fmt);
                static int16 convert_oss_format_to_valid_bits(int fmt);
                static int convert_media_format_to_oss_format(uint32 fmt);
                static int select_oss_rate(const oss_audioinfo *info, int rate);
                static int select_oss_format(int fmt);
                
                static status_t get_media_format_description_for(int fmt, media_format_description *desc, int count=1);
                static status_t register_media_formats();
                static status_t get_media_format_for(int fmt, media_format &format);

        public:
                oss_card_info                   fCardInfo;

        private:
                status_t                                fInitCheckStatus;
                BList                                   fEngines;
                BList                                   fMixers;
friend class OpenSoundNode; // ugly
friend class OpenSoundDeviceEngine; // ugly
                audio_buf_info                  fFragments;
                BLocker                                 fLocker;
};

#endif