⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pe_iconfig.cpp

📁 这是DVD中伺服部分的核心代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:

/*****************************************************************************
******************************************************************************
**                                                                          **
**  Copyright (c) 2006 Videon Central, Inc.                                 **
**  All rights reserved.                                                    **
**                                                                          **
**  The computer program contained herein contains proprietary information  **
**  which is the property of Videon Central, Inc.  The program may be used  **
**  and/or copied only with the written permission of Videon Central, Inc.  **
**  or in accordance with the terms and conditions stipulated in the        **
**  agreement/contract under which the programs have been supplied.         **
**                                                                          **
******************************************************************************
*****************************************************************************/
/**
 * @file pe_iconfig.cpp
 *
 * $Revision: 1.24 $ 
 *
 * DVD Presentation Engine API source file.
 *
 */

#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>

#include "decoder.h"
#include "vdvd_types.h"
#include "osapi.h"
#include "msg_app.h"
#include "spu_app.h"
#include "pe_app.h"
#include "pe_types.h"
#include "dbgprint.h"
#ifdef DMALLOC
#include "dmalloc.h"
#endif

#define DEBUG_ICONFIG   DBG_ERROR
#define DBG_ON(x)       (DEBUG_ICONFIG >= x)

/* globals for platform api interface */
#if defined(USE_ESI_MULTILAYER) || defined(USE_ESI_OSD)
extern IDirectFB*           pDfb;

void   DFBCHECK(DFBResult err, ...)                              
  {                                                              
    if (err != DFB_OK)                                           
      {                                                          
        fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ );   
        DirectFBErrorFatal( err );                               
      }                                                          
  }                                                              
#endif



    typedef enum
    {
        AUDIO_MIXER_CHANNEL_L,
        AUDIO_MIXER_CHANNEL_R,
        AUDIO_MIXER_CHANNEL_C,
        AUDIO_MIXER_CHANNEL_SL,
        AUDIO_MIXER_CHANNEL_SR,
        AUDIO_MIXER_CHANNEL_LFE,
        AUDIO_MIXER_MAX_CHANNELS

    } AudioMixerChannel;


    typedef enum
    {
        AUDIO_MIXER_STREAM_PRIMARY,
        AUDIO_MIXER_STREAM_MAINAUDIO = AUDIO_MIXER_STREAM_PRIMARY,
        AUDIO_MIXER_STREAM_SECONDARY,
        AUDIO_MIXER_STREAM_SUBAUDIO = AUDIO_MIXER_STREAM_SECONDARY,
        AUDIO_MIXER_STREAM_INTERACTIVE,
        AUDIO_MIXER_STREAM_EFFECTS = AUDIO_MIXER_STREAM_INTERACTIVE,
        AUDIO_MIXER_STREAM_INTERACTIVE1    = AUDIO_MIXER_STREAM_INTERACTIVE,
        AUDIO_MIXER_STREAM_INTERACTIVE2,
        AUDIO_MIXER_STREAM_INTERACTIVE3,
        AUDIO_MIXER_STREAM_INTERACTIVE4,
        AUDIO_MIXER_STREAM_OVERALL,
        AUDIO_MIXER_MAX_STREAMS

    } AudioMixerStream;



static BOOLEAN dotPresent = FALSE;
static BOOLEAN ictPresent = FALSE;
static BOOLEAN ApplyEvent = TRUE;
static MACROVISION_TYPE             g_macrovision       = MACROVISION_TYPE_NONE;
static BOOLEAN                      g_audioMixerMute    = FALSE;
static PE_ICONFIGURE_AUDIO_PAN      g_audioMixerPan     = 0;
static PE_ICONFIGURE_AUDIO_BALANCE  g_audioMixerBalance = 0;
static PE_ICONFIGURE_AUDIO_LEVEL    g_audioMixerGain    = 0;

/* TODO: Add the functionality of primary display to the OSD layer */
static PE_ICONFIGURE_PRIMARY_DISPLAY primaryDisplay = PRIMARY_DISPLAY_HDMI;

/* Updates Line 20 According to CEA/EIA-608-C */
static PE_STATUS PEiConfigureUpdateVBI(PE_HANDLE handle);

/*
 * Create the iConfigure interface.
 *
 * @param PEManager - Handle to PE manager. This can be used to obtain access to the other PE interfaces.
 *
 * @return iConfigure handle.
 */
ICONFIGUREHANDLE *PECreateiConfigure(PE_HANDLE PEManager)
{
    ICONFIGUREHANDLE* iConfig;
    char *str = NULL;

    DbgAssert(PEManager != NULL);

    iConfig = (ICONFIGUREHANDLE*)OS_MemAlloc(sizeof(ICONFIGUREHANDLE));

    if (iConfig != NULL)
    {
        /* Store PEManager handle */
        iConfig->PEManager = PEManager;

        /* set initial state */
        iConfig->DigitalAudio     = AUDIO_STANDBY;
        iConfig->AnalogAudio      = AUDIO_STANDBY;
        iConfig->VideoMute        = VIDEO_MUTE_OFF;
        iConfig->VideoFormat      = VIDEO_STANDBY; /* outputs are disabled at startup */
        // interactive audio configuration (4, 1, 48000, NULL);
        iConfig->CGMS             = 0;
        iConfig->Macrovision      = 0;
        iConfig->primaryDecoder   = NULL;
        iConfig->secondaryDecoder = NULL;
    }

    return (iConfig);
}

/**
 * Delete the iConfigure interface.
 *
 * @param handle [IN] Handle to PE iConfigure.
 *
 * @return PE_STATUS - Error code.
 */
PE_STATUS PEDeleteiConfigure(ICONFIGUREHANDLE *iConfig)
{
    if (iConfig == NULL)
    {
        return (PE_INVALID_HANDLE);
    }

    // shut down interactive audio

    OS_MemFree(iConfig);
    return (PE_SUCCESS);
}


/**
 * Selects the analog audio output to either 2 or 5.1 channels. Additionally,
 * the analog audio output can be muted.
 *
 * @param handle - iConfigure handle.
 * @param AnalogAudio - Desired analog audio output enumeration.
 *
 * @return PE_STATUS - Error code.
 */
PE_STATUS PEiConfigureSetAnalogAudioOutput(PE_HANDLE handle, PE_ICONFIGURE_ANALOG_AUDIO AnalogAudio)
{
    PE_ISTREAMCTRL_AUDIO_TYPE       AudioType;
    PE_ISTREAMCTRL_AUDIO_ATTRIBUTES AudioAttributes;

    if (handle == NULL)
    {
        return (PE_INVALID_HANDLE);
    }

    /* get current Audio Type from iStreamCtrl */
    AudioType = PEiStreamCtrlGetAudioType(handle, &AudioAttributes);

    /* TODO... configure audio outputs based on AnalogAudio and AudioType */
    switch (AudioType)
    {
        case AUDIO_TYPE_AC3:
        case AUDIO_TYPE_DTS:
        case AUDIO_TYPE_PCM:
        case AUDIO_TYPE_MPEG1:
        case AUDIO_TYPE_MPEG2:
        case AUDIO_TYPE_MP3:
        default:
            ((PEHANDLE *)handle)->iConfigure->AnalogAudio = AnalogAudio;
            break;
    }

    return (PE_SUCCESS);
}

/**
 * Returns the current analog audio output state.
 *
 * @param handle - iConfigure handle.
 * @param pAnalogAudio - Pointer to returned enumerated variable indicating the current analog audio output state.
 *
 * @return PE_STATUS - Error code.
 */
PE_STATUS PEiConfigureGetAnalogAudioOutput(PE_HANDLE handle, PE_ICONFIGURE_ANALOG_AUDIO *pAnalogAudio)
{
    if (handle == NULL)
    {
        return (PE_INVALID_HANDLE);
    }
    if (pAnalogAudio == NULL)
    {
        return (PE_NULL_POINTER);
    }

    *pAnalogAudio = ((PEHANDLE*)handle)->iConfigure->AnalogAudio;

    return (PE_SUCCESS);
}

/**
 * PEiConfigureSetDigitalAudioOutput()
 *      Selects the digital audio output to either 2 or 5.1 channels.
 *      Additionally, the digital audio output can be muted.
 *
 * @param
 *      handle    [IN] iConfigure handle.
 *      pDigitalAudio [IN] Desired digital audio output enumeration.
 *
 * @return
 *      PE_STATUS            Error code.
 */
PE_STATUS PEiConfigureSetDigitalAudioOutput(PE_HANDLE handle, PE_ICONFIGURE_DIGITAL_AUDIO DigitalAudio)
{
    PE_STATUS                  status = PE_SUCCESS;


    if (handle == NULL)
    {
        return (PE_INVALID_HANDLE);
    }

    /* get the current spdif settings */

    switch (DigitalAudio)
    {
    case AUDIO_CHANNELS_2:
        /* PCM */
        /* spdif output mode = PCM */
        /* spdif primary audio only = FALSE */
        break;
    case AUDIO_CHANNELS_5p1:
        /* COMPRESSED */
        /* spdif output mode = COMPRESSED */
        /* spdif primary audio only = TRUE */
        break;
    case AUDIO_MUTE:
    default:
        status = PE_FAILURE;
        break;
    }

    /* TODO-SDK - Setup digital audio output */
    /* set spdif settings */


    if (PE_SUCCESS == status)
    {
        DBGPRINT(DBG_ON(DBG_TRACE), ("%s: New settings applied %04x\n", __FUNCTION__, DigitalAudio));
        /* save the current settings */
        ((PEHANDLE *)handle)->iConfigure->DigitalAudio = DigitalAudio;
    }

    return (status);
}

/**
 * PEiConfigureGetDigitalAudioOutput()
 *      Returns the current digital audio output state.
 *
 * @param
 *      handle     [IN] iConfigure handle.
 *      pDigitalAudio [IN] Pointer to returned enumeration variable
 *                         indicating current digital audio output state.
 *
 * @return
 *      PE_STATUS            Error code.
 */
PE_STATUS PEiConfigureGetDigitalAudioOutput(PE_HANDLE handle, PE_ICONFIGURE_DIGITAL_AUDIO *pDigitalAudio)
{
    DBGPRINT(DBG_ON(DBG_TRACE), ("PEiConfigureGetDigitalAudioOutput\n"));

    if (handle == NULL)
    {
        return (PE_INVALID_HANDLE);
    }
    if (pDigitalAudio == NULL)
    {
        return (PE_NULL_POINTER);
    }

    *pDigitalAudio = ((PEHANDLE *)handle)->iConfigure->DigitalAudio;

    return (PE_SUCCESS);
}



/**
 * Get state of meta data processing
 *
 * @param handle - iConfigure handle
 * @param isOn   - current meta data processing state
 *
 * @return PE_STATUS - Error code.
 */
PE_STATUS PEiConfigureAMIsMetaDataProcessingOn(PE_HANDLE handle, BOOLEAN *isOn)
{
   ISTREAMCTRLHANDLE *pStrmCtrl = NULL;
    PE_STATUS         status     = PE_SUCCESS;
    BOOLEAN              fMetaIsOn  = FALSE;

    if (handle == NULL)
    {
        return (PE_INVALID_HANDLE);
    }
    if (isOn == NULL)
    {
        return (PE_NULL_POINTER);
    }

    pStrmCtrl = ((PEHANDLE *)handle)->iStreamCtrl;

    status = PE_NOT_IMPLEMENTED;

    *isOn = fMetaIsOn;

    return (status);
}

/**
 * Enable/Disable audio meta data processing
 *
 * @param handle - iConfigure handle
 * @param setOn  - enable/disable meta data processing
 *
 * @return PE_STATUS - Error code.
 */
PE_STATUS PEiConfigureAMSetMetaDataProcessingOn(PE_HANDLE handle, BOOLEAN setOn)
{
    ISTREAMCTRLHANDLE *pStrmCtrl = NULL;
    PE_STATUS         status     = PE_SUCCESS;

    if (handle == NULL)
    {
        return (PE_INVALID_HANDLE);
    }

    pStrmCtrl = ((PEHANDLE *)handle)->iStreamCtrl;

    status = PE_NOT_IMPLEMENTED;

    return (status);
}

/**
 * Gets the number of input channels
 *
 * @param handle - iConfigure handle
 * @param input  - specifies the audio input type
 * @param iaudio_id  - specifies the iaudio handle if input = interactive
 * @param pan    - the audio pan
 *
 * @return PE_STATUS - Error code.
 */
PE_STATUS PEiConfigureAMGetNumberOfInputChannels(PE_HANDLE handle, PE_ICONFIGURE_AUDIO_INPUT input, 
    PE_ICONFIGURE_AUDIO_INTERACTIVE_ID iaudio_id, UCHAR *numchannels)
{
    PE_STATUS         status     = PE_SUCCESS;
    ISTREAMCTRLHANDLE *pStrmCtrl;

    if (handle == NULL)
    {
        return (PE_INVALID_HANDLE);
    }
    if (((PEHANDLE *)handle)->iStreamCtrl == NULL)
    {
        return (PE_INVALID_HANDLE);
    }

    pStrmCtrl = ((PEHANDLE *)handle)->iStreamCtrl;

    status = PE_NOT_IMPLEMENTED;

    return (status);
}

/**
 * Sets the audio DACs level.
 *
 * @param handle - iConfigure handle
 * @param input  - specifies the audio input type
 * @param level  - the audio level
 *
 * @return PE_STATUS - Error code.
 */
PE_STATUS PEiConfigureAMSetLevel(PE_HANDLE handle, PE_ICONFIGURE_AUDIO_INPUT input,
    PE_ICONFIGURE_AUDIO_INTERACTIVE_ID iaudio_id, PE_ICONFIGURE_AUDIO_LEVEL level)
{
    PE_STATUS           status = PE_SUCCESS;
    ISTREAMCTRLHANDLE   *pStrmCtrl;

    DBGPRINT(DBG_ON(DBG_TRACE), ("PEiConfigureAMSetLevel\n"));

    if (handle == NULL)
    {
        return (PE_INVALID_HANDLE);
    }
    if (level > PE_AUDIO_LEVEL_MAX)
    {
        return (PE_INVALID_AUDIO_VOLUME);
    }
    if (level < PE_AUDIO_LEVEL_MIN)
    {
        return (PE_INVALID_AUDIO_VOLUME);
    }
    if (((PEHANDLE *)handle)->iStreamCtrl == NULL)
    {
        return (PE_INVALID_HANDLE);
    }

    pStrmCtrl = ((PEHANDLE *)handle)->iStreamCtrl;


    // AudioMixer - SetGain
    g_audioMixerGain = level;

    PE_AM_LEVEL_EVENT_INFO event_info;
    BOOLEAN                   mute = FALSE;

    /*
     * send a level changed event
     */
    // AudioMixer - GetMute
    mute = g_audioMixerMute;

    event_info.mute  = mute;
    event_info.level = level;
    peSendEvent(handle, PE_EVENT_AM_LEVEL_CHG, &event_info);

    return (status);
}

/**
 * Returns the current analog audio volume.
 *
 * @param handle - iConfigure handle
 * @param input  - specifies the audio input type
 * @param *level - the audio level
 *
 * @return PE_STATUS - Error code.
 */
PE_STATUS PEiConfigureAMGetLevel(PE_HANDLE handle, PE_ICONFIGURE_AUDIO_INPUT input,
    PE_ICONFIGURE_AUDIO_INTERACTIVE_ID iaudio_id, PE_ICONFIGURE_AUDIO_LEVEL *level)
{
    ISTREAMCTRLHANDLE*  pStrmCtrl   = NULL;
    PE_STATUS           status      = PE_SUCCESS;


    if (handle == NULL)
    {
        return (PE_INVALID_HANDLE);
    }
    if (level == NULL)
    {
        return (PE_NULL_POINTER);
    }
    if (((PEHANDLE *)handle)->iStreamCtrl == NULL)
    {
        return (PE_INVALID_HANDLE);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -