📄 pe_iconfig.cpp
字号:
/*****************************************************************************
******************************************************************************
** **
** 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 + -