ALSA PCM发声程序
2010-11-30 22:10
197 查看
#include "alsa/asoundlib.h"
//11KHz支持,发声时间加长,音速变慢
#define SAMPLE_RATE 48000
//#define SAMPLE_RATE 11000
//的确是两个声道交叉响
#define CHANNELS 1
//#define CHANNELS 2
//如果latency过小,会使得snd_pcm_writei()丢发声数据,产生short write现象
#define LATENCY (1000000)//1sec
#define NBLOCKS 16
#define BLOCK_SIZE 1024
unsigned char buffer[NBLOCKS*BLOCK_SIZE]; /* Here:some random da
ta :Future: User Layer Sound Data*/
static char *device = "default"; /* playback device */
#define RANDOM_PLAY 1
#define COMMON_PLAY 2
static unsigned char * get_user_layer_pcm_data(int flag)
{
int i;
for (i = 0; i < sizeof(buffer); i++) {
if(flag == RANDOM_PLAY)
buffer[i] = random() & 0xff;
else
buffer[i] = i & 0xff;
}
return buffer;
}
int main(int argc, char ** argv)
{
int i;
int err, ret_code = 0;
snd_pcm_t *handle;
snd_pcm_sframes_t frames;
if(argc == 2)
get_user_layer_pcm_data(RANDOM_PLAY);//Here Future to get pcm data from user layer
else
get_user_layer_pcm_data(COMMON_PLAY);//Here Future to get pcm data from user layer
if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
printf("Playback open error: %s/n", snd_strerror(err));
exit(EXIT_FAILURE);
}
if ((err = snd_pcm_set_params(handle,
SND_PCM_FORMAT_U8,
SND_PCM_ACCESS_RW_INTERLE***ED,/* snd_pcm_readi/snd_pcm_writei access */
CHANNELS, //Channels
SAMPLE_RATE, //sample rate in Hz
1, //soft_resample
LATENCY)) < 0) { /* latency: us 0.5sec */
printf("Playback open error: %s/n", snd_strerror(err));
exit(EXIT_FAILURE);
}
for (i = 0; i < 10; i++) { //play 10 times, every play 16KB snd size
frames = snd_pcm_writei(handle, buffer, sizeof(buffer));
if (frames < 0)
frames = snd_pcm_recover(handle, frames, 0);
if (frames < 0) {
printf("snd_pcm_writei failed: %s/n", snd_strerror(err));
ret_code = -1;
break;
}
if (frames > 0 && frames < (long)sizeof(buffer))
printf("Short write (expected %li, wrote %li)/n", (long)sizeof(buffer), frames);
}
snd_pcm_close(handle);
return ret_code;
}
=======================
Makefile:
#Usage:
#make ==> arm compile
#make ARCH=arm ==>same as above
#make rebuild ==>make clean+make ARCH=arm
#make ARCH=arm rebuild
#make ARCH=i386 ==>x86 compile
#make ARCH=i386 rebuild ==>make clean+make ARCH=i386
#default to compile on arm platform
ARCH=arm
CROSS_COMPILE = arm-
BIN_EXT=
LIBDIR = /pavo/library/lib
INCLUDE_DIR = /pavo/library/include
ifeq ("$(origin ARCH)", "command line")
ARCH = $(ARCH)
endif
ifeq ($(ARCH), i386)
CROSS_COMPILE =
BIN_EXT=.exe
LIBDIR = /usr/lib
INCLUDE_DIR = /usr/include
endif
ifeq ($(ARCH), arm)
CROSS_COMPILE = arm-
BIN_EXT=
LIBDIR = /pavo/library/lib
INCLUDE_DIR = /pavo/library/include
endif
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
LD = $(CROSS_COMPILE)gcc
AS = $(CROSS_COMPILE)as
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB = $(CROSS_COMPILE)RANLIB
TARGET=pcm_play$(BIN_EXT)
SOURCES=pcm_play.c
OBJS=pcm_play.o
del_files :=$(OBJS)
del_files +=pcm_play
del_files +=pcm_play.exe
CFLAGS = -I$(INCLUDE_DIR)
LDFLAGS = -L$(LIBDIR)
LIBS = $(LDFLAGS) -lasound -lm -ldl -lpthread
all:
@echo compiling $@ ...
$(CC) -c $(SOURCES) $(CFLAGS) -o $(OBJS)
$(LD) $(OBJS) -o $(TARGET) $(LIBS) $(CFLAGS)
clean:
@echo "make clean"
@for f in $(del_files); do /
if test -f $$f; then /
echo "$$f exist,rm it"; /
rm -f $$f; /
fi; /
done;
rebuild:clean
make all
//11KHz支持,发声时间加长,音速变慢
#define SAMPLE_RATE 48000
//#define SAMPLE_RATE 11000
//的确是两个声道交叉响
#define CHANNELS 1
//#define CHANNELS 2
//如果latency过小,会使得snd_pcm_writei()丢发声数据,产生short write现象
#define LATENCY (1000000)//1sec
#define NBLOCKS 16
#define BLOCK_SIZE 1024
unsigned char buffer[NBLOCKS*BLOCK_SIZE]; /* Here:some random da
ta :Future: User Layer Sound Data*/
static char *device = "default"; /* playback device */
#define RANDOM_PLAY 1
#define COMMON_PLAY 2
static unsigned char * get_user_layer_pcm_data(int flag)
{
int i;
for (i = 0; i < sizeof(buffer); i++) {
if(flag == RANDOM_PLAY)
buffer[i] = random() & 0xff;
else
buffer[i] = i & 0xff;
}
return buffer;
}
int main(int argc, char ** argv)
{
int i;
int err, ret_code = 0;
snd_pcm_t *handle;
snd_pcm_sframes_t frames;
if(argc == 2)
get_user_layer_pcm_data(RANDOM_PLAY);//Here Future to get pcm data from user layer
else
get_user_layer_pcm_data(COMMON_PLAY);//Here Future to get pcm data from user layer
if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
printf("Playback open error: %s/n", snd_strerror(err));
exit(EXIT_FAILURE);
}
if ((err = snd_pcm_set_params(handle,
SND_PCM_FORMAT_U8,
SND_PCM_ACCESS_RW_INTERLE***ED,/* snd_pcm_readi/snd_pcm_writei access */
CHANNELS, //Channels
SAMPLE_RATE, //sample rate in Hz
1, //soft_resample
LATENCY)) < 0) { /* latency: us 0.5sec */
printf("Playback open error: %s/n", snd_strerror(err));
exit(EXIT_FAILURE);
}
for (i = 0; i < 10; i++) { //play 10 times, every play 16KB snd size
frames = snd_pcm_writei(handle, buffer, sizeof(buffer));
if (frames < 0)
frames = snd_pcm_recover(handle, frames, 0);
if (frames < 0) {
printf("snd_pcm_writei failed: %s/n", snd_strerror(err));
ret_code = -1;
break;
}
if (frames > 0 && frames < (long)sizeof(buffer))
printf("Short write (expected %li, wrote %li)/n", (long)sizeof(buffer), frames);
}
snd_pcm_close(handle);
return ret_code;
}
=======================
Makefile:
#Usage:
#make ==> arm compile
#make ARCH=arm ==>same as above
#make rebuild ==>make clean+make ARCH=arm
#make ARCH=arm rebuild
#make ARCH=i386 ==>x86 compile
#make ARCH=i386 rebuild ==>make clean+make ARCH=i386
#default to compile on arm platform
ARCH=arm
CROSS_COMPILE = arm-
BIN_EXT=
LIBDIR = /pavo/library/lib
INCLUDE_DIR = /pavo/library/include
ifeq ("$(origin ARCH)", "command line")
ARCH = $(ARCH)
endif
ifeq ($(ARCH), i386)
CROSS_COMPILE =
BIN_EXT=.exe
LIBDIR = /usr/lib
INCLUDE_DIR = /usr/include
endif
ifeq ($(ARCH), arm)
CROSS_COMPILE = arm-
BIN_EXT=
LIBDIR = /pavo/library/lib
INCLUDE_DIR = /pavo/library/include
endif
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
LD = $(CROSS_COMPILE)gcc
AS = $(CROSS_COMPILE)as
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB = $(CROSS_COMPILE)RANLIB
TARGET=pcm_play$(BIN_EXT)
SOURCES=pcm_play.c
OBJS=pcm_play.o
del_files :=$(OBJS)
del_files +=pcm_play
del_files +=pcm_play.exe
CFLAGS = -I$(INCLUDE_DIR)
LDFLAGS = -L$(LIBDIR)
LIBS = $(LDFLAGS) -lasound -lm -ldl -lpthread
all:
@echo compiling $@ ...
$(CC) -c $(SOURCES) $(CFLAGS) -o $(OBJS)
$(LD) $(OBJS) -o $(TARGET) $(LIBS) $(CFLAGS)
clean:
@echo "make clean"
@for f in $(del_files); do /
if test -f $$f; then /
echo "$$f exist,rm it"; /
rm -f $$f; /
fi; /
done;
rebuild:clean
make all
相关文章推荐
- ALSA发声 从class到功能模块
- ALSA编写的音频程序
- Android下音频的测试程序tinyalsa(录音,放音,查看声卡信息)
- Android下音频tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)
- 基于ALSA的WAV播放和录音程序
- ALSA之PCM分析
- Linux声卡录音程序之——mp3(通过ALSA操作声卡)
- Linux ALSA声卡驱动之三:PCM设备的创建
- 理解和使用alsa配置-默认静音,必须先用amixer解除主音量和pcm音量的静音
- ALSA的WAV播放和录音程序
- alsa 测试小程序
- Linux ALSA声卡驱动之三:PCM设备的创建 .
- 键盘控制发声的程序,发出6,7,1,2,3,4,5,6,7,i,十个音调
- ALSA声卡驱动三之PCM设备的创建
- alsa的 snd_pcm_readi 和 snd_pcm_writei
- ALSA之PCM分析
- App加载时,检测其它程序是否在发声的代码
- Oss程序迁移到Alsa时遇到的问题
- alsa 无噪音播放pcm
- ALSA之PCM分析