blob: 96333cc60dcf15b40c2213a71442e8c56fd3626e [file] [log] [blame]
/*---------------------------------------------------------------------------*
* sample.h *
* *
* Copyright 2007, 2008 Nuance Communciations, Inc. *
* *
* 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 _h_sample_
#define _h_sample_
#include "all_defs.h"
#ifndef _RTT
#include "duk_io.h"
#endif
#include "front.h"
#ifdef _WIN32
#include "windows.h"
#endif
/* The known wave types here
*/
/* #define DEVICE_RAW_PCM 1 */
/* #define DEVICE_MULAW 2 */
#define FILE_FORMATTED 3
/* The known device (op) types here
*/
#define WAVE_DEVICE_INPUT 1
#define WAVE_DEVICE_OUTPUT 2
#define WAVE_FILE_INPUT 3
#define WAVE_FILE_OUTPUT 4
/* The known wave-file types are
** RIFF (R), NIST (N), RAW-PCM (P), RAW-MU-LAW (M)
*/
#if !defined(_WIN32) /* TODO: do we want to support RIFF header files? */
/* Add definition for use in RIFF header r/w */
#if defined unix || defined PSOS || defined POSIX
/* VxWorks simulator defines DWORD and WORD already */
#if !(defined(__vxworks) && (CPU & SIMNT))
typedef asr_uint32_t DWORD;
#endif
typedef unsigned char BYTE;
/* following two lines does not help. It only works when WORD is defined by MACRO: #define WORD unsigned short */
#ifdef WORD
#undef WORD
#endif
#if !(defined(__vxworks) && (CPU & SIMNT))
typedef asr_uint16_t WORD;
#endif
#define WAVE_FORMAT_PCM 0x01
#endif
//typedef DWORD FOURCC; /* a four character code */
#define MAKEFOURCC(ch0, ch1, ch2, ch3) ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
#define mmioFOURCC MAKEFOURCC
/**
* @todo document
*/
typedef struct
{
WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
}
WAVEFORMAT;
/**
* @todo document
*/
typedef struct
{
WAVEFORMAT wf;
WORD wBitsPerSample;
}
PCMWAVEFORMAT;
#else
/* disable nameless union/struct warning in mmsytem.h but restore them to
disallow such code of our own.
*/
#pragma warning (push)
#pragma warning (disable: 4201)
#include <mmsystem.h>
#pragma warning (pop)
#endif
#ifndef _RTT
/**
* @todo document
*/
typedef struct
{
char typ; /* R (RIFF), N (NIST), P (RAW PCM) M (MU-LAW) */
int op; /* read or write */
int endian; /* 0 is little 1 is big */
unsigned long len; /* length of file */
PFile* file; /* pointer to file */
char name[MAX_FILE_NAME]; /* file name */
}
wav_file_info;
#endif
/**
* @todo document
*/
typedef struct
{
char typ; /* -Undefined as yet- */
int op; /* read (i/p) or write (o/p) */
}
wav_device_info;
/**
* @todo document
*/
typedef union {
#ifndef _RTT
wav_file_info file;
#endif
wav_device_info ext;
} gen_device_info;
#define MAXHISTBITS 33 /* one more than bitrange for signed */
/* int bit usage - this could be 17 if */
/* we assume shorts */
/**
* @todo document
*/
typedef struct
{
int nsam;
int sum;
int sum2;
int sumsqu;
int sumsqu2;
int sumabs;
int sumabs2;
int highclip;
int lowclip;
int bithist[MAXHISTBITS];
samdata highclip_level;
samdata lowclip_level;
int max_per10000_clip;
int max_dc_offset;
int high_noise_level_bit;
int low_speech_level_bit;
int min_samples;
}
wave_stats;
/**
* @todo document
*/
typedef struct
{
int wave_type;
int device_type;
int samplerate;
int frame_size;
int window_size;
int num_samples;
samdata *income;
samdata *outgo;
booldata initialised;
float scale;
int offset;
/* The channel object here is the set of data streams used in making frames.
IN CA, it is convenient to store channel as part of CA_Wave (wave_info).
It could have a many-to-one relationship with wave_info. */
front_channel *channel;
gen_device_info device;
wave_stats stats;
booldata do_stats;
}
wave_info;
void reset_sig_check(wave_stats *ws);
void get_sig_check(wave_stats *ws, int *nsam, int *pclowclip, int *pchighclip,
int *dc_offset, int *amp, int *pc5, int *pc95, int* overflow);
void acc_wave_stats(wave_info* wave);
void create_sample_buffer(wave_info *wave, int frame_size, int window_size);
void free_sample_buffer(wave_info *wave);
#ifndef _RTT
int init_wavfile_stream(wave_info *wave, char *filename, int type);
int close_wavfile_stream(wave_info *wave);
int load_wavfile_data(wave_info* wave);
int save_wavfile_data(wave_info* wave);
int seek_wavfile_data(wave_info* wave, long offset, int origin);
int read_riff_header(PFile* waveFile, PCMWAVEFORMAT *pcmWaveFormat, unsigned long *datalen);
void add_riff_header(PFile* waveFile, int samplerate, int bitspersample);
void fix_riff_header(PFile* waveFile, int samplerate, int bitspersample);
#endif
void copy_wave_data(wave_info* dest, wave_info* src);
#endif