/* -*- Mode: C; tab-width: 4; -*- */
/***********************************************************************

  umut.h --- UM UTライブラリー ヘッダ

  1998/3/18

***********************************************************************/
#ifndef __UMUT_H__
#define __UMUT_H__

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#pragma pack(push,8)

#ifdef __cplusplus
extern "C" {
#endif

/* ----------------------------------------------------------------------

   variable types and constants

---------------------------------------------------------------------- */

/* return values */
#include "umutret.h"

/* user interface structure/value */
#include "umui.h"

#ifdef WIN32
# ifdef UTDLL_IMPLEMENT
#  define DllExport   __declspec( dllexport )
#  define UTAPI DllExport UTRET __stdcall
# else
#  define DllImport   __declspec( dllimport )
#  define UTAPI DllImport UTRET __stdcall
# endif
#else
# define UTAPI UTRET
#endif

/* それぞれのデバイスの最大個数 */
#define UMUT_DEVNUM_MAX       (8)

/* デバイスの種類 */
#define UMUT_DEVTYPE_NONE     (0)
#define UMUT_DEVTYPE_WAVEOUT  (1)
#define UMUT_DEVTYPE_DSOUND   (2)

/* コンフィグ用PCMフォーマット M:モノラル S:ステレオ */
#define UMUT_PCMFORMAT_11M    (0)
#define UMUT_PCMFORMAT_11S    (1)
#define UMUT_PCMFORMAT_22M    (2)
#define UMUT_PCMFORMAT_22S    (3)
#define UMUT_PCMFORMAT_44M    (4)
#define UMUT_PCMFORMAT_44S    (5)

/* 効果音タイプ(DSound時のみ有効) */
#define UMUT_EFFTYPE_STATIC   (1)
#define UMUT_EFFTYPE_LONG     (2)

/* UTデバイスの状態 */
#define UMUT_STAT_NOTINITED  (1)
#define UMUT_STAT_STOP       (2)
#define UMUT_STAT_PLAY       (3)
#define UMUT_STAT_PAUSE      (4)

/* UMモジュールの状態 */
#define UMUT_MODSTAT_NOTLOADED  (1)
#define UMUT_MODSTAT_STOP       (2)
#define UMUT_MODSTAT_PLAY       (3)
#define UMUT_MODSTAT_PAUSE      (4)
#define UMUT_MODSTAT_RESUME     (5)    /* 8/9:実際にはこない */
#define UMUT_MODSTAT_FADEEND    (6)    /* 8/9:実際にはこない */
#define UMUT_MODSTAT_PLAYSTOP   (7)    /* 演奏の終了(stop指示ではない) */

/* 効果音(チャンネル別)の状態 */
#define UMUT_EFFSTAT_STOP       (2)
#define UMUT_EFFSTAT_PLAY       (3)
#define UMUT_EFFSTAT_PAUSE      (4)

/* 効果音の音量の最大値 */
#define UMUT_EFFVOL_MAX       (100)
#define UMUT_MODVOL_MAX       (280)

/* メッセージ識別子 */
#define UMUT_NOTIFYCODE_TIMER   (1)
#define UMUT_NOTIFYCODE_MOD     (2)
#define UMUT_NOTIFYCODE_EFF     (3)

/* ソースタイプ */
#define UMUT_SRCTYPE_FILE      (0)    /* ファイル                   */
#define UMUT_SRCTYPE_MEM       (1)    /* メモリ上のデータ           */
#define UMUT_SRCTYPE_RESOURCE  (2)    /* リソース (RT_RCDATA)       */

/* prefilter */
#define UMUT_FILTERTYPE_AMP    (1)    /* 音量調節                   */


typedef struct tagUMUTDEVICE {
	int devicetype;               /* システムにあるデバイス */
	int num_of_devices_waveout;   /* デバイスの個数 */
	int num_of_devices_dsound;    /* デバイスの個数 */
	char* aszWaveoutDevDesc[UMUT_DEVNUM_MAX];    /* 文字による情報 */
	char* aszDsoundDevDesc[UMUT_DEVNUM_MAX];     /* 文字による情報 */
} UMUTDEVICE;

typedef struct tagUMUTDEVICEINFOEX {
	int devicetype;          /* デバイスのタイプ */
	int deviceno;            /* デバイスのUMでの番号 */
	int real_devid;          /* WindowsでのデバイスID(WAVE_MAPPERあり) */
	GUID real_guid;          /* WindowsでのGUID(DSound) */
	int formats[6];          /* サポートフォーマット一覧:DSOUND時は不明! */
} UMUTDEVICEINFOEX;

typedef struct tagUMUTOUTCFG {
	int devicetype;        /* デバイスのタイプを指定 */
	int deviceno;          /* デバイスの番号を指定(0〜) */
	int format_device;     /* デバイスのフォーマット */
	int format_mod;        /* UM音楽の生成フォーマット */
	int format_eff;        /* 効果音の生成フォーマット(dsound時は無効) */
	int hokan_mod;         /* TRUEでUM音楽の生成時に線形補間を行う */
	int hokan_eff;         /* TRUEで効果音の生成時に線形補間を行う(dsound時は無効) */
} UMUTOUTCFG;

typedef struct tagUMUTMODINFO {
	long majorversion;		/* 曲がコンパイルされたUMのメジャーバージョン */
	long minorversion;		/* 曲がコンパイルされたUMのマイナーバージョン */
	long nTotalTime_dsec;   /* 曲全体の演奏時間を0.1秒単位で */
	long nStep;				/* 全音符のクロック数(典型的には192) */
	long nInitialTempo;		/* 初期テンポ */
	char szTitle[256];		/* 曲のタイトル文字列(sjis) */
} UMUTMODINFO;

/* そのた音色情報もほしいねえ.. */

typedef struct tagUMUTMODSTAT {
	int  status;            /* UMUT_MODSTAT_xxx : notloaded/stop/play/pause */
	long nPlayTime_dsec;    /* 演奏開始からの経過時間を0.1秒単位で */
	long nTotalTime_dsec;   /* 全体の演奏時間を0.1秒単位で */
	int  nVolume;           /* 音量(0-UMUT_MODVOL_MAX) */
	BOOL fFader;            /* フェーダー動作中はTRUE */
	int  nLoopCount;        /* 全体ループを行った回数 */
} UMUTMODSTAT;

// まだ使わないで!
typedef struct tagUMUTMODSTAT2 {
	int  status;            /* UMUT_MODSTAT_xxx : notloaded/stop/play/pause */
	long nPlayTime_dsec;    /* 演奏開始からの経過時間を0.1秒単位で */
	long nTotalTime_dsec;   /* 全体の演奏時間を0.1秒単位で */
	int  nVolume;           /* 音量(0-UMUT_MODVOL_MAX) */
	BOOL fFader;            /* フェーダー動作中はTRUE */
	int  nLoopCount;        /* 全体ループを行った回数 */
	int  nClockCount;       /* クロックカウント数(参考値) */
} UMUTMODSTAT2;

typedef struct tagUMUTEFFSTAT {
	int  status;            /* UMUT_EFFSTAT_xxx : stop/play/pause */

	long nPlayTime_dsec;    /* 開始からの経過時間を0.1秒単位で */
	long nPlayPosition;     /* 開始からの再生サンプル数 */
	long nTotalSample;      /* 全体のサンプル数 */
	long nSRate;            /* サンプリングレート(Hz) */

	int  nTone;             /* 音色番号(0-15) */
	int  nVolume;           /* 音量(0-UMUT_EFFVOL_MAX) */
	int  nFreq;             /* 音程(40-100000) */
	int  nPan;              /* パン(-100-0-100) */
	BOOL fLoop;             /* ループ再生するならTRUE */
} UMUTEFFSTAT;

typedef struct tagUMUTSRC {
	int   type;             /* UMUTSRCTYPE_xxx */
	void* arg;              /* argument body */
	long  length;           /* argument length(_mem only) */
} UMUTSRC;

typedef struct tagUMUTVERSIONINFO {
	int   versioninfosize;   /* ユーザーがセットして渡す */
	int   majorversion;      /* UMUT自身のバージョン情報 */
	int   minorversion;      /* majorversion, minorversionの２つについては存在を保証 */
    /* 将来追加される可能性がある */
} UMUTVERSIONINFO;

typedef struct tagUMUTPREFILTER {
	int   flags;             /* 処理内容(UMUT_FILTERTYPE_xxx) */
	long  args[8];           /* 処理の引数 */
	void* pNext;            /* 予約済み(NULL) */
} UMUTPREFILTER;

typedef struct tagUMUTERROR {
	UTRET  code;             /* エラーコード(UTERR_xxx) */
	DWORD  arg1;             /* 情報その１ */
	DWORD  arg2;             /* 情報その２ */
	PVOID  data;             /* 情報その３(メモリ経由) */
	DWORD  length;           /* 情報その３にセットされた長さ */
} UMUTERROR;



/* ----------------------------------------------------------------------

   API function prototypes

   コイツらはヘルパーライブラリから呼ぶことにしよう

---------------------------------------------------------------------- */
UTAPI umut_init(UMUTDEVICE* pDevs);
UTAPI umut_end(void);
UTAPI umut_getVersion(UMUTVERSIONINFO* pVInfo);
UTAPI umut_configDevice(const UMUTOUTCFG* pConfig);
UTAPI umut_start(HWND hwnd);
UTAPI umut_stop(void);
UTAPI umut_pause(void);
UTAPI umut_resume(void);
UTAPI umut_enableMMX(void);
UTAPI umut_disableMMX(void);

/* 追加 */
UTAPI umut_getDeviceInfo( int devType, int devNo, UMUTDEVICEINFOEX* pEx );

UTAPI umut_mod_load(const UMUTSRC* source, int nPcmDirs, const char* aszPcmdirs[]);
UTAPI umut_mod_release(void);
UTAPI umut_mod_play(void);
UTAPI umut_mod_stop(void);
UTAPI umut_mod_pause(void);
UTAPI umut_mod_resume(void);
UTAPI umut_mod_volume(int volume);
UTAPI umut_mod_stat(UMUTMODSTAT* pModstat);
UTAPI umut_mod_fade(int vol_start, int vol_stop, long time_sec);
UTAPI umut_mod_flushPcmCache(BOOL fInvalidate);
UTAPI umut_mod_getModuleInfo(const UMUTSRC* pSrc, UMUTMODINFO* pModInfo);

UTAPI umut_eff_load  (int effno, const UMUTSRC* source, int type);
UTAPI umut_eff_loadEx(int effno, const UMUTSRC* source, int type, const UMUTPREFILTER* pPrefilter);
UTAPI umut_eff_release(int effno);
UTAPI umut_eff_play(int chno, int effno);
UTAPI umut_eff_stop(int chno);
UTAPI umut_eff_volume(int chno, int volume);
UTAPI umut_eff_pan(int chno, int pan);
UTAPI umut_eff_frequency(int chno, int rate);
UTAPI umut_eff_stat(int chno, UMUTEFFSTAT* pEffStat);

UTAPI umut_getSystemTime(DWORD* dwTime);
UTAPI umut_registerMessage(int notifycode, UINT windowmessage);  
UTAPI umut_setMessageProperty(int notifycode, DWORD param1, DWORD param2);
UTAPI umut_getLastError(UMUTERROR* pError);

//deleted...
///* obsolete functions */
//UTAPI umut_mod_load_(const char* filename, const char* pcmdir);
//UTAPI umut_eff_load_(int effno, const char* filename, int type);
//UTAPI umut_mod_getUMTitle(char* title, int maxnum);


// 
// COM風インタフェース
//

//CreateIntance ( UMUT.DLL )
UTAPI umut_createUMInstance(DWORD umid, void** ppIUMUnknwon);
//生成したコンポーネントの個数(DllCanUnloadNowに相当)
UTAPI umut_getInstanceCount(int* nCount);


#ifdef __cplusplus
}
#endif

#pragma pack(pop)

#endif  /* __UMUT_H__ */

