From 46028c7ea0c7cd37d6c5e6c6196978afc950dce4 Mon Sep 17 00:00:00 2001
From: iovar <iovar@f606c939-3180-4ac9-a4b8-4b8779d57d0a>
Date: Mon, 29 Jan 2007 05:49:07 +0000
Subject: Added support for compilation with OSS, instead of ALSA.

git-svn-id: https://recordmydesktop.svn.sourceforge.net/svnroot/recordmydesktop/trunk@267 f606c939-3180-4ac9-a4b8-4b8779d57d0a
---
 recordmydesktop/src/cache_audio.c         | 11 ++++++--
 recordmydesktop/src/capture_sound.c       | 44 ++++++++++++++++++++++++++++-
 recordmydesktop/src/encode_sound_buffer.c |  9 +++++-
 recordmydesktop/src/initialize_data.c     |  9 ++++++
 recordmydesktop/src/load_cache.c          | 14 +++++++--
 recordmydesktop/src/opendev.c             | 47 +++++++++++++++++++++++++++++++
 recordmydesktop/src/parseargs.c           |  4 ++-
 7 files changed, 129 insertions(+), 9 deletions(-)

(limited to 'recordmydesktop/src')

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"
-- 
cgit v1.2.3