#include
<
unistd.h
>
#include
<
fcntl.h
>
#include
<
sys
/
types.h
>
#include
<
sys
/
stat.h
>
#include
<
sys
/
ioctl.h
>
#include
<
stdlib.h
>
#include
<
stdio.h
>
#include
<
string
.h
>
#include
<
linux
/
soundcard.h
>
#define
OPEN_DSP_FAILED 0x00000001 /*打开 dsp 失败!*/
#define
SAMPLERATE_STATUS 0x00000002 /*samplerate status failed*/
#define
SET_SAMPLERATE_FAILED 0x00000003 /*set samplerate failed*/
#define
CHANNELS_STATUS 0x00000004 /*Channels status failed*/
#define
SET_CHANNELS_FAILED 0x00000005 /*set channels failed*/
#define
FMT_STATUS 0x00000006 /*FMT status failed*/
#define
SET_FMT_FAILED 0x00000007 /*set fmt failed*/
#define
OPEN_FILE_FAILED 0x00000008 /*opem filed failed*/
int
P8100_Audio_Play(
char
*
pathname,
int
nSampleRate,
int
nChannels,
int
fmt)
{
int
dsp_fd,mix_fd,status,arg;
dsp_fd
=
open(
"
/dev/dsp
"
, O_RDWR);
/*
open dsp
*/
if
(dsp_fd
<
0
)
{
return
OPEN_DSP_FAILED;
}
arg
=
nSampleRate;
status
=
ioctl(dsp_fd,SOUND_PCM_WRITE_RATE,
&
arg);
/*
set samplerate
*/
if
(status
<
0
)
{
close(dsp_fd);
return
SAMPLERATE_STATUS;
}
if
(arg
!=
nSampleRate)
{
close(dsp_fd);
return
SET_SAMPLERATE_FAILED;
}
arg
=
nChannels;
/*
set channels
*/
status
=
ioctl(dsp_fd, SOUND_PCM_WRITE_CHANNELS,
&
arg);
if
(status
<
0
)
{
close(dsp_fd);
return
CHANNELS_STATUS;
}
if
( arg
!=
nChannels)
{
close(dsp_fd);
return
SET_CHANNELS_FAILED;
}
arg
=
fmt;
/*
set bit fmt
*/
status
=
ioctl(dsp_fd, SOUND_PCM_WRITE_BITS,
&
arg);
if
(status
<
0
)
{
close(dsp_fd);
return
FMT_STATUS;
}
if
(arg
!=
fmt)
{
close(dsp_fd);
return
SET_FMT_FAILED;
}
/*
到此设置好了DSP的各个参数
*/
FILE
*
file_fd
=
fopen(pathname,
"
r
"
);
if
(file_fd
==
NULL)
{
close(dsp_fd);
return
OPEN_FILE_FAILED;
}
int
num
=
3
*
nChannels
*
nSampleRate
*
fmt
/
8
;
int
get_num;
char
buf[num];
while
(feof(file_fd)
==
0
)
{
get_num
=
fread(buf,
1
,num,file_fd);
write(dsp_fd,buf,get_num);
if
(get_num
!=
num)
{
close(dsp_fd);
fclose(file_fd);
return
0
;
}
}
close(dsp_fd);
fclose(file_fd);
return
0
;
}
/*
*test
*/
int
main()
{
int
value;
value
=
P8100_Audio_Play(
"
/windows/C/WINDOWS/Media/Windows Startup.wav
"
,
44100
,
2
,
16
);
//
注意播放文件的路径哦!!
fprintf(stderr,
"
value is %d
"
,value);
return
0
;}