/*----------------------------------------------------------------------------
 *
 * File: 
 * eas_parser.h
 *
 * Contents and purpose:
 * Interface declarations for the generic parser interface
 *
 * This header only contains declarations that are specific
 * to this implementation.  
 *			
 * Copyright Sonic Network Inc. 2005

 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *----------------------------------------------------------------------------
 * Revision Control:
 *   $Revision: 767 $
 *   $Date: 2007-07-19 13:47:31 -0700 (Thu, 19 Jul 2007) $
 *----------------------------------------------------------------------------
*/

#ifndef _EAS_PARSER_H
#define _EAS_PARSER_H

#include "eas_types.h"


/* metadata callback */
typedef struct s_metadata_cb_tag
{
	EAS_METADATA_CBFUNC		callback;
	char					*buffer;
	EAS_VOID_PTR			pUserData;
	EAS_I32					bufferSize;
} S_METADATA_CB;

/* generic parser interface */
typedef struct
{
	EAS_RESULT (* EAS_CONST pfCheckFileType)(struct s_eas_data_tag *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *ppHandle, EAS_I32 offset);
	EAS_RESULT (* EAS_CONST pfPrepare)(struct s_eas_data_tag *pEASData, EAS_VOID_PTR pInstData);
	EAS_RESULT (* EAS_CONST pfTime)(struct s_eas_data_tag *pEASData, EAS_VOID_PTR pInstData, EAS_U32 *pTime);
	EAS_RESULT (* EAS_CONST pfEvent)(struct s_eas_data_tag *pEASData, EAS_VOID_PTR pInstData, EAS_INT parseMode);
	EAS_RESULT (* EAS_CONST pfState)(struct s_eas_data_tag *pEASData, EAS_VOID_PTR pInstData, EAS_STATE *pState);
	EAS_RESULT (* EAS_CONST pfClose)(struct s_eas_data_tag *pEASData, EAS_VOID_PTR pInstData);
	EAS_RESULT (* EAS_CONST pfReset)(struct s_eas_data_tag *pEASData, EAS_VOID_PTR pInstData);
	EAS_RESULT (* EAS_CONST pfPause)(struct s_eas_data_tag *pEASData, EAS_VOID_PTR pInstData);
	EAS_RESULT (* EAS_CONST pfResume)(struct s_eas_data_tag *pEASData, EAS_VOID_PTR pInstData);
	EAS_RESULT (* EAS_CONST pfLocate)(struct s_eas_data_tag *pEASData, EAS_VOID_PTR pInstData, EAS_I32 time, EAS_BOOL *pParserLocate);
	EAS_RESULT (* EAS_CONST pfSetData)(struct s_eas_data_tag *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value);
	EAS_RESULT (* EAS_CONST pfGetData)(struct s_eas_data_tag *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue);
	EAS_RESULT (* EAS_CONST pfGetMetaData)(struct s_eas_data_tag *pEASData, EAS_VOID_PTR pInstData, EAS_I32 *pMediaLength);
} S_FILE_PARSER_INTERFACE;

typedef enum
{
	eParserModePlay,
	eParserModeLocate,
	eParserModeMute,
	eParserModeMetaData
} E_PARSE_MODE;

typedef enum
{
	PARSER_DATA_FILE_TYPE,
	PARSER_DATA_PLAYBACK_RATE,
	PARSER_DATA_TRANSPOSITION,
	PARSER_DATA_VOLUME,
	PARSER_DATA_SYNTH_HANDLE,
	PARSER_DATA_METADATA_CB,
	PARSER_DATA_DLS_COLLECTION,
	PARSER_DATA_EAS_LIBRARY,
	PARSER_DATA_POLYPHONY,
	PARSER_DATA_PRIORITY,
	PARSER_DATA_FORMAT,
	PARSER_DATA_MEDIA_LENGTH,
	PARSER_DATA_JET_CB,
	PARSER_DATA_MUTE_FLAGS,
	PARSER_DATA_SET_MUTE,
	PARSER_DATA_CLEAR_MUTE,
	PARSER_DATA_NOTE_COUNT,
	PARSER_DATA_MAX_PCM_STREAMS,
	PARSER_DATA_GAIN_OFFSET,
	PARSER_DATA_PLAY_MODE
} E_PARSER_DATA;

#endif /* #ifndef _EAS_PARSER_H */
