247 lines
4.9 KiB
C
247 lines
4.9 KiB
C
|
|
||
|
/*
|
||
|
* Author: JohnXenox aka Aleksandr Igorevich.
|
||
|
*
|
||
|
* PlayNote_lib2.h
|
||
|
*/
|
||
|
|
||
|
#ifndef __PlayNote_lib2_h__
|
||
|
#define __PlayNote_lib2_h__
|
||
|
|
||
|
/*
|
||
|
struct CTRL_INFO
|
||
|
{ int pci_cmd;
|
||
|
int irq;
|
||
|
int glob_cntrl;
|
||
|
int glob_sta;
|
||
|
int codec_io_base;
|
||
|
int ctrl_io_base;
|
||
|
int codec_mem_base;
|
||
|
int ctrl_mem_base;
|
||
|
int codec_id;
|
||
|
};
|
||
|
#define CTRL_INFO_SIZE (9*4)
|
||
|
*/
|
||
|
|
||
|
//====================================//
|
||
|
|
||
|
#define SRV_GETVERSION 0
|
||
|
#define SND_CREATE_BUFF 1
|
||
|
#define SND_DESTROY_BUFF 2
|
||
|
#define SND_SETFORMAT 3
|
||
|
#define SND_GETFORMAT 4
|
||
|
#define SND_RESET 5
|
||
|
#define SND_SETPOS 6
|
||
|
#define SND_GETPOS 7
|
||
|
#define SND_SETBUFF 8
|
||
|
#define SND_OUT 9
|
||
|
#define SND_PLAY 10
|
||
|
#define SND_STOP 11
|
||
|
#define SND_SETVOLUME 12
|
||
|
#define SND_GETVOLUME 13
|
||
|
#define SND_SETPAN 14
|
||
|
#define SND_GETPAN 15
|
||
|
#define SND_GETBUFFSIZE 16
|
||
|
#define SND_GETFREESPACE 17
|
||
|
#define SND_SETTIMEBASE 18
|
||
|
#define SND_GETTIMESTAMP 19
|
||
|
|
||
|
|
||
|
#define DEV_SET_BUFF 4
|
||
|
#define DEV_NOTIFY 5
|
||
|
#define DEV_SET_MASTERVOL 6
|
||
|
#define DEV_GET_MASTERVOL 7
|
||
|
#define DEV_GET_INFO 8
|
||
|
|
||
|
//====================================//
|
||
|
|
||
|
#define SOUND_VERSION 0x0101
|
||
|
#define PCM_ALL 0
|
||
|
|
||
|
#define PCM_OUT 0x08000000
|
||
|
#define PCM_RING 0x10000000
|
||
|
#define PCM_STATIC 0x20000000
|
||
|
#define PCM_FLOAT 0x40000000
|
||
|
#define PCM_FILTER 0x80000000
|
||
|
|
||
|
#define PCM_2_16_48 1
|
||
|
#define PCM_1_16_48 2
|
||
|
#define PCM_2_16_44 3
|
||
|
#define PCM_1_16_44 4
|
||
|
#define PCM_2_16_32 5
|
||
|
#define PCM_1_16_32 6
|
||
|
#define PCM_2_16_24 7
|
||
|
#define PCM_1_16_24 8
|
||
|
#define PCM_2_16_22 9
|
||
|
#define PCM_1_16_22 10
|
||
|
#define PCM_2_16_16 11
|
||
|
#define PCM_1_16_16 12
|
||
|
#define PCM_2_16_12 13
|
||
|
#define PCM_1_16_12 14
|
||
|
#define PCM_2_16_11 15
|
||
|
#define PCM_1_16_11 16
|
||
|
#define PCM_2_16_8 17
|
||
|
#define PCM_1_16_8 18
|
||
|
#define PCM_2_8_48 19
|
||
|
#define PCM_1_8_48 20
|
||
|
#define PCM_2_8_44 21
|
||
|
#define PCM_1_8_44 22
|
||
|
#define PCM_2_8_32 23
|
||
|
#define PCM_1_8_32 24
|
||
|
#define PCM_2_8_24 25
|
||
|
#define PCM_1_8_24 26
|
||
|
#define PCM_2_8_22 27
|
||
|
#define PCM_1_8_22 28
|
||
|
#define PCM_2_8_16 29
|
||
|
#define PCM_1_8_16 30
|
||
|
#define PCM_2_8_12 31
|
||
|
#define PCM_1_8_12 32
|
||
|
#define PCM_2_8_11 33
|
||
|
#define PCM_1_8_11 34
|
||
|
#define PCM_2_8_8 35
|
||
|
#define PCM_1_8_8 36
|
||
|
|
||
|
//====================================//
|
||
|
|
||
|
const char szInfinity[] = "INFINITY";
|
||
|
const char szSound[] = "SOUND";
|
||
|
|
||
|
int *hSound = 0;
|
||
|
int *hrdwSound = 0;
|
||
|
|
||
|
struct MNG_DRV
|
||
|
{
|
||
|
int *handle;
|
||
|
int code;
|
||
|
int **input;
|
||
|
int inp_size;
|
||
|
int **output;
|
||
|
int out_size;
|
||
|
};
|
||
|
|
||
|
static inline void *LoadDriver(void *ptr)
|
||
|
{
|
||
|
void *val;
|
||
|
__asm__ __volatile__("int $0x40":"=a"(val):"a"(68), "b"(16),"c"(ptr));
|
||
|
return val;
|
||
|
}
|
||
|
|
||
|
static inline int ManageDriver(void *ptr)
|
||
|
{
|
||
|
int val;
|
||
|
__asm__ __volatile__("int $0x40":"=a"(val):"a"(68), "b"(17),"c"(ptr));
|
||
|
return val;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
static int _InitSound(int* p_ver)
|
||
|
{
|
||
|
hSound = LoadDriver(&szInfinity);
|
||
|
if(hSound == 0) return -1;
|
||
|
hrdwSound = LoadDriver(&szSound);
|
||
|
|
||
|
struct MNG_DRV MNG_DRV = {
|
||
|
.handle = hSound,
|
||
|
.code = SRV_GETVERSION,
|
||
|
.input = 0,
|
||
|
.inp_size = 0,
|
||
|
.output = &p_ver,
|
||
|
.out_size = 4
|
||
|
};
|
||
|
|
||
|
return ManageDriver(&MNG_DRV);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
static int _CreateBuffer(int format, int size, int *p_str)
|
||
|
{
|
||
|
struct MNG_DRV MNG_DRV = {
|
||
|
.handle = hSound,
|
||
|
.code = SND_CREATE_BUFF,
|
||
|
.input = &(int*)format,
|
||
|
.inp_size = 8,
|
||
|
.output = &p_str,
|
||
|
.out_size = 4
|
||
|
};
|
||
|
|
||
|
return ManageDriver(&MNG_DRV);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
static int _SetBuffer(int *str, int* src, int offs, int size)
|
||
|
{
|
||
|
struct MNG_DRV MNG_DRV = {
|
||
|
.handle = hSound,
|
||
|
.code = SND_SETBUFF,
|
||
|
.input = &(int*)str,
|
||
|
.inp_size = 16,
|
||
|
.output = 0,
|
||
|
.out_size = 0
|
||
|
};
|
||
|
|
||
|
return ManageDriver(&MNG_DRV);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
static int _PlayBuffer(int* str, int flags)
|
||
|
{
|
||
|
struct MNG_DRV MNG_DRV = {
|
||
|
.handle = hSound,
|
||
|
.code = SND_PLAY,
|
||
|
.input = &(int*)str,
|
||
|
.inp_size = 8,
|
||
|
.output = 0,
|
||
|
.out_size = 0
|
||
|
};
|
||
|
|
||
|
return ManageDriver(&MNG_DRV);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
static int _SetBufferPos(int *str, int offs)
|
||
|
{
|
||
|
struct MNG_DRV MNG_DRV = {
|
||
|
.handle = hSound,
|
||
|
.code = SND_SETPOS,
|
||
|
.input = &(int*)str,
|
||
|
.inp_size = 8,
|
||
|
.output = 0,
|
||
|
.out_size = 0
|
||
|
};
|
||
|
|
||
|
return ManageDriver(&MNG_DRV);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
static int _StopBuffer(int* str)
|
||
|
{
|
||
|
struct MNG_DRV MNG_DRV = {
|
||
|
.handle = hSound,
|
||
|
.code = SND_STOP,
|
||
|
.input = &(int*)str,
|
||
|
.inp_size = 4,
|
||
|
.output = 0,
|
||
|
.out_size = 0
|
||
|
};
|
||
|
|
||
|
return ManageDriver(&MNG_DRV);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|