blob: 67876a2e4c913c5d668746e46df77e1f4976acda [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 2008 PacketVideo
*
* 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.
* -------------------------------------------------------------------
*/
#ifndef PVWAVFILEPARSER_H_INCLUDED
#define PVWAVFILEPARSER_H_INCLUDED
//----------------------------------------------------------------------------
// INCLUDES
//----------------------------------------------------------------------------
#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif
#ifndef OSCL_STRING_H_INCLUDED
#include "oscl_string.h"
#endif
#ifndef OSCL_FILE_IO_H_INCLUDED
#include "oscl_file_io.h"
#endif
#ifndef OSCL_MEM_H_INCLUDED
#include "oscl_mem.h"
#endif
#ifndef OSCL_VECTOR_H_INCLUDED
#include "oscl_vector.h"
#endif
//////////////////////////////////WAV File parser
// This enumeration lists the formats currently supported
enum PVWavAudioFormats
{
PVWAV_UNKNOWN_AUDIO_FORMAT = 0,
PVWAV_PCM_AUDIO_FORMAT = 1,
PVWAV_ITU_G711_ALAW = 6,
PVWAV_ITU_G711_ULAW = 7
};
typedef struct
{
int32 AudioFormat;
uint16 NumChannels;
uint16 BlockAlign;
uint16 BitsPerSample;
uint16 BytesPerSample; // takes into account byte alignment
uint32 SampleRate;
uint32 ByteRate;
uint32 NumSamples; // Total number of Samples
bool isLittleEndian; // 1 if data is little endian and 0 if it is big endian
} PVWAVFileInfo;
enum PVWavParserReturnCode
{
// Return codes
PVWAVPARSER_OK = 0,
PVWAVPARSER_READ_ERROR = -1,
PVWAVPARSER_MISC_ERROR = -2,
PVWAVPARSER_UNSUPPORTED_FORMAT = -3,
PVWAVPARSER_END_OF_FILE = -4
};
class PV_Wav_Parser
{
public:
OSCL_IMPORT_REF PV_Wav_Parser()
{
AudioFormat = 0;
NumChannels = 0;
SampleRate = 0;
ByteRate = 0;
BlockAlign = 0;
BitsPerSample = 0;
BytesPerSample = 0;
xLawTable = NULL;
PCMBytesRead = 0;
PCMBytesPresent = 0;
ipWAVFile = NULL;
iHeaderSize = 0;
isLittleEndian = 1; // little endian by default
iEndOfDataSubChunkOffset = 0;
}
OSCL_IMPORT_REF ~PV_Wav_Parser();
//{
// CleanupWAVFile();
//}
// Will parse WAVE File
OSCL_IMPORT_REF PVWavParserReturnCode InitWavParser(OSCL_wString& aClip, Oscl_FileServer* aFileSession);
// Returns number of samples copied to the buffer
OSCL_IMPORT_REF PVWavParserReturnCode GetPCMData(uint8* inBuff, uint32 inBufSize, uint32 NumberOfSamples, uint32& NumSamplesRead);
// Copies Number of Channels, Sampling rate and Bits per sample to input parameters
OSCL_IMPORT_REF bool RetrieveFileInfo(PVWAVFileInfo& aInfo);
//Seek in PCM Data (Seeks the file position to SampleNumber specified so that user can then get PCM data starting from that Sample)
OSCL_IMPORT_REF PVWavParserReturnCode SeekPCMSample(uint32 SampleNumber);
//Set the paser output to uncompressed PCM.
OSCL_IMPORT_REF bool SetOutputToUncompressedPCM(void);
private:
PVWavParserReturnCode ReadData(uint8* buff, uint32 size, uint32& bytesread);
void CleanupWAVFile(void);
//Subchunk 1
uint16 AudioFormat;
uint16 NumChannels;
uint32 SampleRate;
uint32 ByteRate;
uint16 BlockAlign;
uint16 BitsPerSample;
uint16 BytesPerSample;
bool isLittleEndian; // 1 if data is little endian and 0 if it is big endian
short *xLawTable;
// It will be incremented when PCM data is read and compared to Subchunk2_size to determine whether whole file has been read or not
uint32 PCMBytesRead;
uint32 PCMBytesPresent;// PCM data size in bytes
uint32 NumSamples;
uint32 iEndOfDataSubChunkOffset;
// Pointer to input file (File to be opened and file pointer kept with the class. It will be closed when no data is left in file descriptor of class)
Oscl_File* ipWAVFile;
// header size (size of data before data subchunk)
uint32 iHeaderSize;
};
#endif // PVWAVFILEPARSER_H_INCLUDED