summaryrefslogtreecommitdiff
path: root/recordmydesktop
diff options
context:
space:
mode:
Diffstat (limited to 'recordmydesktop')
-rw-r--r--recordmydesktop/INSTALL12
-rw-r--r--recordmydesktop/configure.ac55
-rw-r--r--recordmydesktop/doc/recordmydesktop.16
-rw-r--r--recordmydesktop/include/rmdfunc.h22
-rw-r--r--recordmydesktop/include/rmdmacro.h9
-rw-r--r--recordmydesktop/include/rmdtypes.h17
-rw-r--r--recordmydesktop/src/cache_audio.c11
-rw-r--r--recordmydesktop/src/capture_sound.c44
-rw-r--r--recordmydesktop/src/encode_sound_buffer.c9
-rw-r--r--recordmydesktop/src/initialize_data.c9
-rw-r--r--recordmydesktop/src/load_cache.c14
-rw-r--r--recordmydesktop/src/opendev.c47
-rw-r--r--recordmydesktop/src/parseargs.c4
13 files changed, 226 insertions, 33 deletions
diff --git a/recordmydesktop/INSTALL b/recordmydesktop/INSTALL
index 14de910..227629f 100644
--- a/recordmydesktop/INSTALL
+++ b/recordmydesktop/INSTALL
@@ -20,7 +20,6 @@ If you got a release tarball, to compile the program you have to go through the
You will need the development headers(i.e. packages ending with -dev or -devel
depending on the distribution you use) for the following:
-alsa (libasound)
X
libICE-dev
libSM-dev
@@ -31,6 +30,13 @@ libogg
libvorbis
libtheora
+If you want to compile with ALSA support, you will also
+need the libasound headers.If they are not found, OSS
+will be used and you must have the sys/soundcard.h header.
+To use OSS regardless of whether or not you have the ALSA
+headers, you can use the --enable-oss switch during
+configuration.
+
Last, you need the regular headers, plus the ones for pthreads
@@ -40,8 +46,4 @@ Of the above, the most likely to be missing are probably those of libXdamage and
but any recent linux distribution should offer an easy way to get them.
-Compiling on *BSD or other *nix flavors is not going to work(because of the alsa dependency)
-but it shouldn't be too much of a hassle to change that(at least by disabling sound capture).
-Future versions might include support for OSS-based sound capture.
-If you are interested in this please let me know.
diff --git a/recordmydesktop/configure.ac b/recordmydesktop/configure.ac
index 16cb218..4661b60 100644
--- a/recordmydesktop/configure.ac
+++ b/recordmydesktop/configure.ac
@@ -32,10 +32,17 @@ if test "x$x_includes" != "x" && test "x$x_includes" != xNONE ; then
CFLAGS="-I$x_includes $CFLAGS";
fi
-
+AC_ARG_ENABLE(oss,
+ [ --enable-oss[=yes] compile with OSS(don't check for ALSA))],
+ [case "${enableval}" in
+ yes) oss=true ;;
+ no) oss=false ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-oss) ;;
+ esac],[oss=false])
AC_CHECK_HEADER([alsa/asoundlib.h])
-AC_CHECK_HEADERS([sys/time.h unistd.h vorbis/vorbisfile.h ])
+AC_CHECK_HEADER([sys/soundcard.h])
+AC_CHECK_HEADERS([sys/time.h unistd.h vorbis/vorbisfile.h fcntl.h])
@@ -52,16 +59,27 @@ AC_CHECK_LIB([SM],[SmcOpenConnection],,AC_MSG_ERROR([Can't find libSM]),)
AC_CHECK_LIB([X11],[XOpenDisplay],,AC_MSG_ERROR([Can't find libX11]),
-L$x_libraries $X_PRE_LIBS)
AC_CHECK_LIB([Xext],[XShmQueryVersion],,AC_MSG_ERROR([Can't find libXext]))
-AC_CHECK_LIB([Xfixes], [XFixesQueryExtension],,AC_MSG_ERROR([Can't find libXfixes]))
-AC_CHECK_LIB([Xdamage], [XDamageQueryExtension],,AC_MSG_ERROR([Can't find libXdamage]))
-AC_CHECK_LIB([vorbis],[vorbis_info_clear],,AC_MSG_ERROR([Can't find libvorbis]))
-AC_CHECK_LIB([vorbisfile],[ov_open],,AC_MSG_ERROR([Can't find libvorbisfile]),-lvorbis)
-AC_CHECK_LIB([vorbisenc],[vorbis_encode_init],,AC_MSG_ERROR([Can't find libvorbisenc]),-lvorbis)
+AC_CHECK_LIB([Xfixes], [XFixesQueryExtension],,
+ AC_MSG_ERROR([Can't find libXfixes]))
+AC_CHECK_LIB([Xdamage], [XDamageQueryExtension],,
+ AC_MSG_ERROR([Can't find libXdamage]))
+AC_CHECK_LIB([vorbis],[vorbis_info_clear],,
+ AC_MSG_ERROR([Can't find libvorbis]))
+AC_CHECK_LIB([vorbisfile],[ov_open],,
+ AC_MSG_ERROR([Can't find libvorbisfile]),-lvorbis)
+AC_CHECK_LIB([vorbisenc],[vorbis_encode_init],,
+ AC_MSG_ERROR([Can't find libvorbisenc]),-lvorbis)
AC_CHECK_LIB([ogg],[ogg_stream_init],,AC_MSG_ERROR([Can't find libogg]))
-AC_CHECK_LIB([theora],[theora_encode_YUVin],,AC_MSG_ERROR([Can't find libtheora]))
-AC_CHECK_LIB([pthread],[pthread_mutex_lock],,AC_MSG_ERROR([Can't find libpthread]))
-AC_CHECK_LIB([asound],[snd_pcm_drain],,AC_MSG_ERROR([Can't find libasound]))
-
+AC_CHECK_LIB([theora],[theora_encode_YUVin],,
+ AC_MSG_ERROR([Can't find libtheora]))
+AC_CHECK_LIB([pthread],[pthread_mutex_lock],,
+ AC_MSG_ERROR([Can't find libpthread]))
+if test x$oss = xfalse; then
+ AC_CHECK_LIB([asound],[snd_pcm_drain],,
+ audio_backend="OSS")
+else
+ audio_backend="OSS"
+fi
# Checks for typedefs, structures, and compiler characteristics.
@@ -76,3 +94,18 @@ AC_CONFIG_FILES([Makefile
doc/Makefile ])
AC_OUTPUT
+echo ""
+echo ""
+echo ""
+echo ""
+echo "****************************************"
+echo ""
+if test x$audio_backend = xOSS; then
+ echo "Audio driver that will be used: OSS"
+else
+ echo "Audio driver that will be used: ALSA"
+fi
+echo ""
+echo "****************************************"
+echo ""
+echo ""
diff --git a/recordmydesktop/doc/recordmydesktop.1 b/recordmydesktop/doc/recordmydesktop.1
index 1b0003c..bb1de6c 100644
--- a/recordmydesktop/doc/recordmydesktop.1
+++ b/recordmydesktop/doc/recordmydesktop.1
@@ -141,7 +141,7 @@ The following error codes indicate the nature of the error:
.br
9 Cannot connect to Xserver.
.br
-10 Color depth is not 24bpp.
+10 Color depth is not 32, 24 or 16bpp.
.br
11 Improper window specification.
.br
@@ -262,12 +262,12 @@ Sound Options:
.TP
.B
\-buffer\-size N(number>0)
- A positive number denoting the desired sound buffer size(in frames).
+ A positive number denoting the desired sound buffer size(in frames for ALSA, bytes for OSS).
.br
.TP
.B
\-device SOUND_DEVICE
- Sound device(default hw0:0).
+ Sound device(default hw0:0 or /dev/dsp, depending on whether ALSA or OSS is used).
.br
.TP
.B
diff --git a/recordmydesktop/include/rmdfunc.h b/recordmydesktop/include/rmdfunc.h
index a4908d5..2f41c4d 100644
--- a/recordmydesktop/include/rmdfunc.h
+++ b/recordmydesktop/include/rmdfunc.h
@@ -283,9 +283,9 @@ void *CaptureSound(ProgData *pdata);
* \param pdata ProgData struct containing all program data
*/
void *EncodeSoundBuffer(ProgData *pdata);
-
+#ifdef HAVE_LIBASOUND
/**
-* Try to open sound device, with the desired parameters,
+* Try to open (alsa) sound device, with the desired parameters,
* and place the obtained ones on their place
*
* \param pcm_dev name of the device
@@ -314,6 +314,24 @@ snd_pcm_t *OpenDev( const char *pcm_dev,
snd_pcm_uframes_t *periodsize,
unsigned int *periodtime,
int *hardpause);
+#else
+/**
+* Try to open (OSS) sound device, with the desired parameters.
+*
+*
+* \param pcm_dev name of the device
+*
+* \param channels desired number of channels
+*
+* \param frequency desired frequency
+*
+*
+* \returns file descriptor of open device,-1 on failure
+*/
+int OpenDev( const char *pcm_dev,
+ unsigned int channels,
+ unsigned int frequency);
+#endif
/**
* Initialize theora,vorbis encoders, and their respective ogg streams.
*
diff --git a/recordmydesktop/include/rmdmacro.h b/recordmydesktop/include/rmdmacro.h
index c14785f..1fe06a4 100644
--- a/recordmydesktop/include/rmdmacro.h
+++ b/recordmydesktop/include/rmdmacro.h
@@ -99,6 +99,11 @@
#define Y_UNIT_BYTES 0x0100
#define UV_UNIT_BYTES 0x0040
+#ifdef HAVE_LIBASOUND
+ #define DEFAULT_AUDIO_DEVICE "hw:0,0"
+#else
+ #define DEFAULT_AUDIO_DEVICE "/dev/dsp"
+#endif
#define CLIP_EVENT_AREA(e,brwin,wgeom){\
if(((e)->area.x<=(brwin)->rgeom.x)&&((e)->area.y<=(brwin)->rgeom.y)&&\
@@ -208,8 +213,8 @@
(args)->shared_thres=75;\
(args)->have_dummy_cursor=0;\
(args)->xfixes_cursor=1;\
- (args)->device=(char *)malloc(8);\
- strcpy((args)->device,"hw:0,0");\
+ (args)->device=(char *)malloc(strlen(DEFAULT_AUDIO_DEVICE)+1);\
+ strcpy((args)->device,DEFAULT_AUDIO_DEVICE);\
(args)->fps=15;\
(args)->channels=1;\
(args)->frequency=22050;\
diff --git a/recordmydesktop/include/rmdtypes.h b/recordmydesktop/include/rmdtypes.h
index 7da30e9..5430ef4 100644
--- a/recordmydesktop/include/rmdtypes.h
+++ b/recordmydesktop/include/rmdtypes.h
@@ -60,7 +60,13 @@
#include <vorbis/codec.h>
#include <vorbis/vorbisenc.h>
#include <ogg/ogg.h>
-#include <alsa/asoundlib.h>
+
+#ifdef HAVE_LIBASOUND
+ #include <alsa/asoundlib.h>
+#else
+ #include <sys/ioctl.h>
+ #include <sys/soundcard.h>
+#endif
//this type exists only
//for comparing the planes at caching.
@@ -137,7 +143,11 @@ typedef struct _ProgArgs{
unsigned int frequency; //desired frequency (default 22050)
unsigned int channels; //no of channels(default 2)
char *device; //default sound device
+#ifdef HAVE_LIBASOUND
snd_pcm_uframes_t buffsize; //buffer size(in frames) for sound capturing
+#else
+ u_int32_t buffsize;
+#endif
int nosound; //do not record sound(default 0)
int noshared; //do not use shared memory extension(default 1)
int nocondshared; //do not use shared memory on large image aquititions
@@ -283,8 +293,13 @@ typedef struct _ProgData{
v_encoding_clean;
int v_enc_thread_waiting, //these indicate a wait
th_enc_thread_waiting; //condition on the above cond vars
+#ifdef HAVE_LIBASOUND
snd_pcm_t *sound_handle;
snd_pcm_uframes_t periodsize;
+#else
+ int sound_handle;
+ u_int32_t periodsize;
+#endif
}ProgData;
diff --git a/recordmydesktop/src/cache_audio.c b/recordmydesktop/src/cache_audio.c
index c8a71da..178bb7c 100644
--- a/recordmydesktop/src/cache_audio.c
+++ b/recordmydesktop/src/cache_audio.c
@@ -30,8 +30,10 @@ void *CacheSoundBuffer(ProgData *pdata){
//It's sound is tiny compared to that of image, so
//compressing would reducethe overall size by only an
//insignificant fraction.
+#ifdef HAVE_LIBASOUND
int framesize=((snd_pcm_format_width(SND_PCM_FORMAT_S16_LE))/8)*
pdata->args.channels;
+#endif
pthread_mutex_t smut;
pthread_mutex_init(&smut,NULL);
while((pdata->running)){
@@ -55,10 +57,13 @@ void *CacheSoundBuffer(ProgData *pdata){
//advance the list
pdata->sound_buffer=pdata->sound_buffer->next;
pthread_mutex_unlock(&pdata->sound_buffer_mutex);
-
- fwrite(buff->data,pdata->periodsize*framesize,1,
+#ifdef HAVE_LIBASOUND
+ fwrite(buff->data,1,pdata->periodsize*framesize,
pdata->cache_data->afp);
-
+#else
+ fwrite(buff->data,1,pdata->args.buffsize,
+ pdata->cache_data->afp);
+#endif
pdata->avd-=pdata->periodtime;
diff --git a/recordmydesktop/src/capture_sound.c b/recordmydesktop/src/capture_sound.c
index 32f2638..d9bb340 100644
--- a/recordmydesktop/src/capture_sound.c
+++ b/recordmydesktop/src/capture_sound.c
@@ -29,9 +29,11 @@
void *CaptureSound(ProgData *pdata){
+#ifdef HAVE_LIBASOUND
int frames=pdata->periodsize;
int framesize=((snd_pcm_format_width(SND_PCM_FORMAT_S16_LE))/8)*
pdata->args.channels;
+#endif
pthread_mutex_t pmut;
pthread_mutex_init(&pmut,NULL);
@@ -42,6 +44,7 @@ void *CaptureSound(ProgData *pdata){
int sret=0;
SndBuffer *newbuf,*tmp;
if(Paused){
+#ifdef HAVE_LIBASOUND
if(!pdata->hard_pause){
snd_pcm_pause(pdata->sound_handle,1);
pthread_cond_wait(&pdata->pause_cond,&pmut);
@@ -68,14 +71,33 @@ void *CaptureSound(ProgData *pdata){
pthread_exit(&errno);
}
}
+#else
+ close(pdata->sound_handle);
+ pthread_cond_wait(&pdata->pause_cond,&pmut);
+ pdata->sound_handle=
+ OpenDev(pdata->args.device,
+ pdata->args.channels,
+ pdata->args.frequency);
+ if(pdata->sound_handle<0){
+ fprintf(stderr,"Couldn't reopen sound device.Exiting\n");
+ pdata->running=0;
+ errno=3;
+ pthread_exit(&errno);
+ }
+#endif
}
//create new buffer
newbuf=(SndBuffer *)malloc(sizeof(SndBuffer *));
+#ifdef HAVE_LIBASOUND
newbuf->data=(signed char *)malloc(frames*framesize);
+#else
+ newbuf->data=(signed char *)malloc(pdata->args.buffsize);
+#endif
newbuf->next=NULL;
//read data into new buffer
+#ifdef HAVE_LIBASOUND
while(sret<frames){
int temp_sret=snd_pcm_readi(pdata->sound_handle,
newbuf->data+framesize*sret,
@@ -94,7 +116,23 @@ void *CaptureSound(ProgData *pdata){
else
sret+=temp_sret;
}
-
+#else
+ sret=0;
+ //oss recording loop
+ do{
+ int temp_sret=read(pdata->sound_handle,
+ &newbuf->data[sret],
+ pdata->args.buffsize);
+ if(temp_sret<0){
+ fprintf(stderr,"An error occured while reading from soundcard"
+ "%s\n"
+ "Error description:\n"
+ "%s\n",pdata->args.device,strerror(errno));
+ }
+ else
+ sret+=temp_sret;
+ }while(sret<pdata->args.buffsize);
+#endif
//queue the new buffer
pthread_mutex_lock(&pdata->sound_buffer_mutex);
tmp=pdata->sound_buffer;
@@ -111,7 +149,11 @@ void *CaptureSound(ProgData *pdata){
//signal that there are data to be proccessed
pthread_cond_signal(&pdata->sound_data_read);
}
+#ifdef HAVE_LIBASOUND
snd_pcm_close(pdata->sound_handle);
+#else
+ close(pdata->sound_handle);
+#endif
pthread_exit(&errno);
}
diff --git a/recordmydesktop/src/encode_sound_buffer.c b/recordmydesktop/src/encode_sound_buffer.c
index 828855c..2ea76cc 100644
--- a/recordmydesktop/src/encode_sound_buffer.c
+++ b/recordmydesktop/src/encode_sound_buffer.c
@@ -28,8 +28,11 @@
#include <recordmydesktop.h>
void *EncodeSoundBuffer(ProgData *pdata){
-
+#ifdef HAVE_LIBASOUND
int sampread=pdata->periodsize;
+#else
+ int sampread=pdata->args.buffsize>>1;
+#endif
pthread_mutex_t smut;
pthread_mutex_init(&smut,NULL);
pdata->v_encoding_clean=0;
@@ -97,7 +100,11 @@ void *EncodeSoundBuffer(ProgData *pdata){
void SyncEncodeSoundBuffer(ProgData *pdata,signed char *buff){
float **vorbis_buffer;
int count=0,i,j;
+#ifdef HAVE_LIBASOUND
int sampread=(buff!=NULL)?pdata->periodsize:0;
+#else
+ int sampread=(buff!=NULL)?(pdata->args.buffsize>>1):0;
+#endif
vorbis_buffer=vorbis_analysis_buffer(&pdata->enc_data->m_vo_dsp,sampread);
for(i=0;i<sampread;i++){
for(j=0;j<pdata->args.channels;j++){
diff --git a/recordmydesktop/src/initialize_data.c b/recordmydesktop/src/initialize_data.c
index 4830c83..8d86856 100644
--- a/recordmydesktop/src/initialize_data.c
+++ b/recordmydesktop/src/initialize_data.c
@@ -119,6 +119,7 @@ int InitializeData(ProgData *pdata,
AllPlanes);
}
if(!pdata->args.nosound){
+#ifdef HAVE_LIBASOUND
pdata->sound_handle=OpenDev( pdata->args.device,
&pdata->args.channels,
&pdata->args.frequency,
@@ -127,6 +128,14 @@ int InitializeData(ProgData *pdata,
&pdata->periodtime,
&pdata->hard_pause);
if(pdata->sound_handle==NULL){
+#else
+ pdata->sound_handle=OpenDev(pdata->args.device,
+ pdata->args.channels,
+ pdata->args.frequency);
+ pdata->periodtime=(1000000*pdata->args.buffsize)/
+ ((pdata->args.channels<<1)*pdata->args.frequency);
+ if(pdata->sound_handle<0){
+#endif
fprintf(stderr,"Error while opening/configuring soundcard %s\n"
"Try running with the --no-sound or specify a "
"correct device.\n",
diff --git a/recordmydesktop/src/load_cache.c b/recordmydesktop/src/load_cache.c
index 6098bc7..a5b1581 100644
--- a/recordmydesktop/src/load_cache.c
+++ b/recordmydesktop/src/load_cache.c
@@ -131,10 +131,14 @@ void *LoadCache(ProgData *pdata){
blocknum_x=pdata->enc_data->yuv.y_width/Y_UNIT_WIDTH,
blocknum_y=pdata->enc_data->yuv.y_height/Y_UNIT_WIDTH,
blockszy=Y_UNIT_BYTES,//size of y plane block in bytes
- blockszuv=UV_UNIT_BYTES,//size of u,v plane blocks in bytes
- framesize=((snd_pcm_format_width(SND_PCM_FORMAT_S16_LE))/8)*
+ blockszuv=UV_UNIT_BYTES;//size of u,v plane blocks in bytes
+#ifdef HAVE_LIBASOUND
+ int framesize=((snd_pcm_format_width(SND_PCM_FORMAT_S16_LE))/8)*
pdata->args.channels;//audio frame size
signed char *sound_data=(signed char *)malloc(pdata->periodsize*framesize);
+#else
+ signed char *sound_data=(signed char *)malloc(pdata->args.buffsize);
+#endif
u_int32_t YBlocks[(yuv->y_width*yuv->y_height)/Y_UNIT_BYTES],
UBlocks[(yuv->uv_width*yuv->uv_height)/UV_UNIT_BYTES],
VBlocks[(yuv->uv_width*yuv->uv_height)/UV_UNIT_BYTES];
@@ -250,7 +254,11 @@ void *LoadCache(ProgData *pdata){
//audio load and encoding
else{
if(!audio_end){
- int nbytes=fread(sound_data,pdata->periodsize*framesize,1,afp);
+#ifdef HAVE_LIBASOUND
+ int nbytes=fread(sound_data,1,pdata->periodsize*framesize,afp);
+#else
+ int nbytes=fread(sound_data,1,pdata->args.buffsize,afp);
+#endif
if(nbytes<=0)
audio_end=1;
else
diff --git a/recordmydesktop/src/opendev.c b/recordmydesktop/src/opendev.c
index 5fc24f7..7810ec6 100644
--- a/recordmydesktop/src/opendev.c
+++ b/recordmydesktop/src/opendev.c
@@ -29,6 +29,7 @@
#include <recordmydesktop.h>
+#ifdef HAVE_LIBASOUND
snd_pcm_t *OpenDev( const char *pcm_dev,
unsigned int *channels,
@@ -114,4 +115,50 @@ snd_pcm_t *OpenDev( const char *pcm_dev,
return mhandle;
}
+#else
+int OpenDev( const char *pcm_dev,
+ unsigned int channels,
+ unsigned int frequency){
+ int fd ;
+ fd=open(pcm_dev,O_RDONLY);
+
+ if(fd!=-1){
+ unsigned int value;
+
+ if(ioctl(fd,SNDCTL_DSP_GETFMTS,&value)<0){
+ fprintf(stderr,"Couldn't get audio format list\n");
+ return -1;
+ }
+ if(value & AFMT_S16_LE){
+ value=AFMT_S16_LE;
+ }
+ else if(value & AFMT_S16_BE){
+ value=AFMT_S16_BE;
+ }
+ else{
+ fprintf(stderr,"Soundcard doesn't support signed 16-bit-data\n");
+ return -1;
+ }
+ if(ioctl(fd,SNDCTL_DSP_SETFMT,&value)<0){
+ fprintf(stderr,"Couldn't set audio format\n" );
+ return -1;
+ }
+ value = channels;
+ if(ioctl(fd,SNDCTL_DSP_CHANNELS,&value)<0){
+ fprintf(stderr,"Cannot set the number of channels\n" );
+ return -1;
+ }
+ value = frequency;
+ if(ioctl(fd,SNDCTL_DSP_SPEED,&value)<0){
+ fprintf(stderr,"Couldn't set audio frequency\n" );
+ return -1;
+ }
+ if(fcntl(fd,F_SETFL,fcntl(fd,F_GETFL) & ~O_NONBLOCK)<0){
+ fprintf(stderr,"Couldn't set audio blocking mode\n" );
+ return -1;
+ }
+ }
+ return fd;
+}
+#endif
diff --git a/recordmydesktop/src/parseargs.c b/recordmydesktop/src/parseargs.c
index 36dbbea..9cda42b 100644
--- a/recordmydesktop/src/parseargs.c
+++ b/recordmydesktop/src/parseargs.c
@@ -81,7 +81,9 @@ int ParseArgs(int argc,char **argv,ProgArgs *arg_return){
"\t-buffer-size N\t\tA positive number denoting the desired"
" sound buffer size(in frames)\n"
- "\t-device SOUND_DEVICE\tSound device(default hw0:0).\n"
+ "\t-device SOUND_DEVICE\tSound device(default "
+ DEFAULT_AUDIO_DEVICE
+ ").\n"
"\t--no-sound\t\tDo not record sound.\n\n"
"Encoding Options\n"
© All Rights Reserved