[Redbutton-devel] SF.net SVN: redbutton: [92] redbutton-browser/trunk
Brought to you by:
skilvington
From: <ski...@us...> - 2006-06-11 09:05:36
|
Revision: 92 Author: skilvington Date: 2006-06-11 02:05:19 -0700 (Sun, 11 Jun 2006) ViewCVS: http://svn.sourceforge.net/redbutton/?rev=92&view=rev Log Message: ----------- add ALSA audio output method (still doesn't play sound yet) Modified Paths: -------------- redbutton-browser/trunk/Makefile Added Paths: ----------- redbutton-browser/trunk/MHEGAudioOutput.c redbutton-browser/trunk/MHEGAudioOutput.h Added: redbutton-browser/trunk/MHEGAudioOutput.c =================================================================== --- redbutton-browser/trunk/MHEGAudioOutput.c (rev 0) +++ redbutton-browser/trunk/MHEGAudioOutput.c 2006-06-11 09:05:19 UTC (rev 92) @@ -0,0 +1,120 @@ +/* + * MHEGAudioOutput.c + */ + +#include <stdbool.h> +#include <stdint.h> +#include <stdio.h> +#include <alsa/asoundlib.h> + +#include "MHEGAudioOutput.h" +#include "MHEGEngine.h" +#include "utils.h" + +bool +MHEGAudioOutput_init(MHEGAudioOutput *a) +{ + int err; + + a->ctx = NULL; + + if((err = snd_pcm_open(&a->ctx, ALSA_AUDIO_DEVICE, SND_PCM_STREAM_PLAYBACK, 0)) < 0) + { + error("Unable to open audio device '%s': %s", ALSA_AUDIO_DEVICE, snd_strerror(err)); + return false; + } + + return true; +} + +void +MHEGAudioOutput_fini(MHEGAudioOutput *a) +{ + if(a->ctx != NULL) + { + snd_pcm_close(a->ctx); + a->ctx = NULL; + } + + return; +} + +bool +MHEGAudioOutput_setParams(MHEGAudioOutput *a, snd_pcm_format_t format, unsigned int rate, unsigned int channels) +{ + snd_pcm_hw_params_t *hw_params; + int err; + int dir; + + if(a->ctx == NULL) + return false; + + if((err = snd_pcm_hw_params_malloc(&hw_params)) < 0) + { + error("Unable to set audio parameters: %s", snd_strerror(err)); + return false; + } + + if((err = snd_pcm_hw_params_any(a->ctx, hw_params)) < 0) + { + error("Unable to set audio parameters: %s", snd_strerror(err)); + return false; + } + + /* interleaved samples */ + if((err = snd_pcm_hw_params_set_access(a->ctx, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) + { + error("Unable to set audio parameters: %s", snd_strerror(err)); + return false; + } + + if((err = snd_pcm_hw_params_set_format(a->ctx, hw_params, format)) < 0) + { + error("Unable to set audio parameters: %s", snd_strerror(err)); + return false; + } + + if((err = snd_pcm_hw_params_set_rate_near(a->ctx, hw_params, &rate, &dir)) < 0) + { + error("Unable to set audio parameters: %s", snd_strerror(err)); + return false; + } + + if((err = snd_pcm_hw_params_set_channels(a->ctx, hw_params, channels)) < 0) + { + error("Unable to set audio parameters: %s", snd_strerror(err)); + return false; + } + + if((err = snd_pcm_hw_params(a->ctx, hw_params)) < 0) + { + error("Unable to set audio parameters: %s", snd_strerror(err)); + return false; + } + + snd_pcm_hw_params_free(hw_params); + + return true; +} + +void +MHEGAudioOutput_addSamples(MHEGAudioOutput *a, uint16_t *samples, unsigned int nbytes) +{ + unsigned int nsamples; + + if(a->ctx == NULL) + return; + + /* convert bytes to samples */ + nsamples = snd_pcm_bytes_to_frames(a->ctx, nbytes); + + /* interleaved samples */ + while(snd_pcm_writei(a->ctx, samples, nsamples) < 0) + { + snd_pcm_prepare(a->ctx); + verbose("MHEGAudioOutput: buffer underrun"); + } + + return; +} + Added: redbutton-browser/trunk/MHEGAudioOutput.h =================================================================== --- redbutton-browser/trunk/MHEGAudioOutput.h (rev 0) +++ redbutton-browser/trunk/MHEGAudioOutput.h 2006-06-11 09:05:19 UTC (rev 92) @@ -0,0 +1,27 @@ +/* + * MHEGAudioOutput.h + */ + +#include <stdbool.h> +#include <stdint.h> +#include <alsa/asoundlib.h> + +#ifndef __MHEGAUDIOOUTPUT_H__ +#define __MHEGAUDIOOUTPUT_H__ + +typedef struct +{ + snd_pcm_t *ctx; +} MHEGAudioOutput; + +/* default ALSA device */ +#define ALSA_AUDIO_DEVICE "plughw" + +bool MHEGAudioOutput_init(MHEGAudioOutput *); +void MHEGAudioOutput_fini(MHEGAudioOutput *); + +bool MHEGAudioOutput_setParams(MHEGAudioOutput *, snd_pcm_format_t, unsigned int, unsigned int); + +void MHEGAudioOutput_addSamples(MHEGAudioOutput *, uint16_t *, unsigned int); + +#endif /* __MHEGAUDIOOUTPUT_H__ */ Modified: redbutton-browser/trunk/Makefile =================================================================== --- redbutton-browser/trunk/Makefile 2006-06-09 15:25:30 UTC (rev 91) +++ redbutton-browser/trunk/Makefile 2006-06-11 09:05:19 UTC (rev 92) @@ -4,7 +4,7 @@ DEFS=-D_REENTRANT -D_GNU_SOURCE #DEFS=-DDEBUG_ALLOC -D_REENTRANT -D_GNU_SOURCE INCS=`freetype-config --cflags` -LIBS=-lm -lz -L/usr/X11R6/lib -lX11 -lXt -lXrender -lXft -lpng -lmpeg2 -lmpeg2convert -lavformat -lavcodec -lpthread +LIBS=-lm -lz -L/usr/X11R6/lib -lX11 -lXt -lXrender -lXft -lpng -lmpeg2 -lmpeg2convert -lavformat -lavcodec -lasound -lpthread CLASSES=ActionClass.o \ ApplicationClass.o \ @@ -67,6 +67,7 @@ MHEGTimer.o \ MHEGStreamPlayer.o \ MHEGVideoOutput.o \ + MHEGAudioOutput.o \ ${CLASSES} \ ISO13522-MHEG-5.o \ der_decode.o \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |