您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: