#pragma once
#ifndef __TSOUND_H__
#define __TSOUND_H__
#include "tmacro.h"
#undef TNZAPI
#ifdef TNZ_IS_AUDIOLIB
#define TNZAPI TNZ_EXPORT_API
#else
#define TNZAPI TNZ_IMPORT_API
#endif
/*----------------------------------------------------------------------- */
#ifndef TSAPI
#define TSAPI extern
#endif
typedef int TS_RESULT;
enum {
TS_NOERROR = 0,
TS_BADFILE,
TS_BADFORMAT,
TS_ENV,
TS_NOT_ALLOCATED,
TS_BADDEVICE,
TS_DEVICEBUSY,
TS_NODRIVER,
TS_PLAYERROR,
TS_RECERROR,
TS_NODATA,
TS_OK_PLAYSTOPPED,
TS_OK_RECSTOPPED
};
typedef unsigned long DWORD;
/*
typedef unsigned char BYTE;
typedef int BOOL;
*/
typedef unsigned char *PBYTE;
typedef const char *TS_STRING;
/*-----------------------------------------------------------------------------
*/
/* Sound data type */
/* MEGACAMBIO!!!! AUDIOFRAME intero */
typedef int AUDIOFRAME; /* -inf , +inf */
typedef float TIME; /* -inf , +inf */
typedef DWORD SAMPLE; /* 0 , +inf */
typedef DWORD TS_SIZE;
typedef float HERTZ; /* 0 , +inf */
typedef float PRESSURE; /* -1.0 , +1.0 */
typedef float AMPLIFICATION;
typedef unsigned int VOLUME; /* 0 , 255 */
/* conversione: tempo -> frame */
#define TS_CINEMA_FRAMEDURATION ((double)1 / 24)
#define TS_PAL_FRAMEDURATION ((double)1 / 25)
#define TS_NTSC_FRAMEDURATION ((double)1 / 30)
/*------------------- DIGITAL AUDIO --------------------*/
/* channels number */
typedef enum { TS_MONO = 1, TS_STEREO = 2 } TS_DIGITAL_CHANNELS;
/*
audio quality (sampling rate)
mu: HERTZ
*/
typedef enum {
TS_RATE_8000 = 8000,
TS_RATE_11025 = 11025,
TS_RATE_16000 = 16000,
TS_RATE_22050 = 22050,
TS_RATE_32000 = 32000,
TS_RATE_44100 = 44100,
TS_RATE_48000 = 48000
} TS_DIGITAL_QUALITY;
#define TS_VOICE_QUALITY TS_RATE_8000
#define TS_PHONE_QUALITY TS_RATE_11025
#define TS_RADIO_QUALITY TS_RATE_22050
#define TS_CD_QUALITY TS_RATE_44100
/*
sample dimension
mu: BIT
*/
typedef enum {
TS_8BIT_SAMPLES = 8,
TS_16BIT_SAMPLES = 16,
#ifndef WIN32
TS_24BIT_SAMPLES = 24
#else
TS_24BIT_SAMPLES = 24
#endif
} TS_DIGITAL_SAMPLES;
/*
bit masks for dwMask
*/
enum {
TS_MASK_DEFAULT = 0, /* per usare param. di default */
TS_MASK_ORIGIN = (1 << 0),
TS_MASK_DURATION = (1 << 1),
TS_MASK_QUALITY = (1 << 2),
TS_MASK_CHANNEL = (1 << 3),
TS_MASK_SAMPLE = (1 << 4),
TS_MASK_FILENAME = (1 << 5),
TS_MASK_ALL = TS_MASK_ORIGIN | TS_MASK_DURATION | TS_MASK_QUALITY |
TS_MASK_CHANNEL | TS_MASK_SAMPLE | TS_MASK_FILENAME,
TS_MASK_CREATE = TS_MASK_QUALITY | TS_MASK_CHANNEL | TS_MASK_SAMPLE
};
/*
internal time unit = SAMPLE
*/
typedef struct _TS_STRACK_INFO {
TIME tmOrigin;
TIME tmDuration;
char *tmFilename;
/* DIGITAL audio dependent part - low level*/
TS_DIGITAL_CHANNELS dChannels;
TS_DIGITAL_QUALITY dSamplingRate;
TS_DIGITAL_SAMPLES dBitsPerSample;
/* --- */
DWORD dwMask;
} * TS_STRACK_INFO;
typedef struct _TS_STRACK *TS_STRACK;
/*
I/O devices
*/
typedef enum {
TS_INPUT_LINE,
TS_INPUT_MIC,
TS_INPUT_DIGITAL,
TS_INPUT_DUMMY /* per aprire in output */
} TS_DEVTYPE;
typedef enum { TS_UNIQUE = 0, TS_RIGHT, TS_LEFT } TS_CHAN;
/*
typedef struct _TS_DEVICE_INFO {
TS_DEVTYPE input_source;
VOLUME input_volume;
VOLUME output_volume;
}*TS_DEVICE_INFO;
*/
typedef struct _TS_DEVICE *TS_DEVICE;
/* ------------------------ FUNCTIONS ------------------------------*/
/* N.B. Tutte le funzioni con from, to (src_from, src_to)
* prendono TUTTA la track se from==TS_BEGIN && to==TS_END
*/
#define ALL -1 /* PROVVISORIO!!!!!*/
#define TS_BEGIN MININT
#define TS_END MAXINT
/*---------------------- Creation/Destruction ----------------------------*/
/* usa i campi di info dichiarati in dwFlagsi, per gli altri usa default */
TNZAPI TSAPI TS_STRACK tsCreateStrack(TS_STRACK_INFO info);
TNZAPI TSAPI TS_RESULT tsDestroyStrack(TS_STRACK strack);
/*---------------------- Conversion Functions -----------------------------*/
/*
secs * tsFrameRate() => num.frames
N.B.:Nessun controllo sui parametri passati (conv.indiscriminata)
*/
TNZAPI TSAPI AUDIOFRAME tsTimeToFrame(TIME time);
TNZAPI TSAPI TIME tsFrameToTime(AUDIOFRAME frames);
TNZAPI TSAPI TIME tsFracFrameToTime(float frac_frames);
TNZAPI TSAPI SAMPLE tsFrameToSample(AUDIOFRAME frames, TS_STRACK strack);
TNZAPI TSAPI AUDIOFRAME tsSampleToFrame(SAMPLE samples, TS_STRACK strack);
TNZAPI TSAPI AUDIOFRAME tsByteToFrame(TS_SIZE bytes, TS_STRACK strack);
TNZAPI TSAPI TS_SIZE tsFrameToByte(AUDIOFRAME frames, TS_STRACK strack);
TNZAPI TSAPI SAMPLE tsTimeToSample(TIME time, TS_STRACK strack);
TNZAPI TSAPI TIME tsSampleToTime(SAMPLE samples, TS_STRACK strack);
TNZAPI TSAPI void tsAreyousure_to_quit(void);
/*--------------------------- File Functions ----------------------------*/
/* riempie tutti i campi della info */
TNZAPI TSAPI TS_RESULT tsFileInfo(TS_STRING szFileName, TS_STRACK_INFO info);
TNZAPI TSAPI TS_STRACK tsLoad(TS_STRING szFileName, AUDIOFRAME from,
AUDIOFRAME to);
TNZAPI TSAPI TS_STRACK tsLoadSubsampled(TS_STRING szFileName,
TS_STRACK_INFO desired_info,
AUDIOFRAME from, AUDIOFRAME to);
/* if from==ALL && to==ALL the whole track is loaded */
/*
TNZAPI TSAPI TS_RESULT tsSave ( TS_STRACK strack, TS_STRING szFileName,
AUDIOFRAME from, AUDIOFRAME to );
*/
TNZAPI TSAPI TS_RESULT tsSave(TS_STRACK strack, TS_STRING szFileName);
/*------------------------- Edit Functions --------------------------------*/
TNZAPI TSAPI void tsDelete(TS_STRACK strack, AUDIOFRAME from, AUDIOFRAME to);
/* cuts a piece of DATA */
TNZAPI TSAPI void tsClear(TS_STRACK strack, AUDIOFRAME from, AUDIOFRAME to);
/* zeroes a piece of DATA */
TNZAPI TSAPI void tsBlank(TS_STRACK strack, AUDIOFRAME point, AUDIOFRAME range);
/* insert zeros into a track */
TNZAPI TSAPI TS_RESULT tsCopy(TS_STRACK src_strack, AUDIOFRAME src_from,
AUDIOFRAME src_to, TS_STRACK dest_strack,
AUDIOFRAME dest_from);
TNZAPI TSAPI TS_RESULT tsInsert(TS_STRACK src_strack, AUDIOFRAME src_from,
AUDIOFRAME src_to, TS_STRACK dest_strack,
AUDIOFRAME dest_from);
/* Insertion of data in an empty track : dest_strack->buffer = NULL */
/* ------------------------Manipolator Functions -------------------------*/
TNZAPI TSAPI TS_RESULT tsConvert(TS_STRACK src_strack,
TS_STRACK_INFO dest_info);
TNZAPI TSAPI TS_RESULT tsAmplify(TS_STRACK strack, AMPLIFICATION amp);
/*----------------------- Miscellanea Functions ---------------------------*/
TNZAPI TSAPI AUDIOFRAME tsGetFrames(TS_STRACK strack);
TNZAPI TSAPI PBYTE tsBuffer(TS_STRACK strack);
/* riempie i campi di info richiesti in dwFlags */
TNZAPI TSAPI TS_RESULT tsInfo(TS_STRACK strack, TS_STRACK_INFO info);
TNZAPI TSAPI PRESSURE tsGetPressure(TS_STRACK strack, TIME time, TS_CHAN chan);
TNZAPI TSAPI PRESSURE tsGetMaxPressure(TS_STRACK strack, TS_CHAN chan);
TNZAPI TSAPI TS_STRING tsAudioFileExtension(void);
#ifndef WIN32
TNZAPI TSAPI int tsSupportDigitalIn(void);
#endif
/* only for tsNewPlay etc. */
TNZAPI TSAPI TBOOL tsNeedsRefill(void);
TNZAPI TSAPI TBOOL
tsRefill(void); /* call at least 4 times per sec while playing, */
/* TRUE means needs to be called again */
/*------------------------ Play/Rec Functions -----------------------------*/
/* default asynch */
TNZAPI TSAPI TS_RESULT tsPlay(TS_STRACK strack, TS_DEVICE dev, AUDIOFRAME from,
AUDIOFRAME to);
TNZAPI TSAPI TS_RESULT tsNewPlay(TS_STRACK strack, TS_DEVICE dev,
AUDIOFRAME from, AUDIOFRAME to);
TNZAPI TSAPI TS_RESULT tsPlayLoop(TS_STRACK strack, TS_DEVICE dev,
AUDIOFRAME from, AUDIOFRAME to);
TNZAPI TSAPI TBOOL tsIsPlaying(TS_STRACK strack, TS_DEVICE dev);
TNZAPI TSAPI TBOOL tsIsNewPlaying(TS_STRACK strack, TS_DEVICE dev);
TNZAPI TSAPI TS_RESULT tsSyncPlay(TS_STRACK strack, TS_DEVICE dev,
AUDIOFRAME from, AUDIOFRAME to);
TNZAPI TSAPI TS_RESULT tsStopPlaying(TS_STRACK strack, TS_DEVICE dev);
TNZAPI TSAPI TS_RESULT tsStopNewPlaying(TS_STRACK strack, TS_DEVICE dev);
TNZAPI TSAPI TS_RESULT tsRecord(TS_STRACK strack, TS_DEVICE dev,
AUDIOFRAME from, AUDIOFRAME to);
TNZAPI TSAPI TBOOL tsIsRecording(TS_STRACK strack, TS_DEVICE dev);
TNZAPI TSAPI TS_RESULT tsSyncRecord(TS_STRACK strack, TS_DEVICE dev,
AUDIOFRAME from, AUDIOFRAME to);
TNZAPI TSAPI TS_RESULT tsStopRecording(TS_STRACK strack, TS_DEVICE dev);
/* TSAPI void tsSetEndPlayCb (void(*end_play_cb)(void));*/
/*------------------------- Device Functions ------------------------------*/
/* dinfo==NIL => usato vol. di default e microfono per input */
/* mode = "w" per Play; "r" per Record */
TNZAPI TSAPI TS_DEVICE tsInitDevice(TS_DEVTYPE type, TS_STRACK_INFO info,
char *mode);
TNZAPI TSAPI TS_RESULT tsCloseDevice(TS_DEVICE dev);
TNZAPI TSAPI TBOOL tsCheckOutput(void);
TNZAPI TSAPI void tsSetVolume(TS_DEVICE dev, VOLUME vol);
TNZAPI TSAPI void tsSetInVolume(TS_DEVICE dev, VOLUME vol);
TNZAPI TSAPI VOLUME tsGetVolume(TS_DEVICE dev);
/*------------------------------------------------------------------------ */
#endif