gst_plugins_symbian/gst/devsound/gstdevsoundsrc.c
changeset 28 4ed5253bb6ba
parent 26 69c7080681bf
--- a/gst_plugins_symbian/gst/devsound/gstdevsoundsrc.c	Fri Aug 06 16:36:50 2010 -0500
+++ b/gst_plugins_symbian/gst/devsound/gstdevsoundsrc.c	Tue Aug 24 03:01:45 2010 -0500
@@ -129,6 +129,7 @@
 
 static gint gst_devsound_src_get_rate(gint rate);
 
+static void post_symbian_error ( GstBaseSrc* element, int symbian_error );
 
 typedef struct _GstCustomIfaceUpdate GstCustomIfaceUpdate;
 
@@ -398,13 +399,12 @@
     //gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) devsoundsrc, "StartDevSoundThread ",NULL);
     int ret = open_devsound(&(devsoundsrc->handle));
     
-    if( 0 != ret )
+    if( KErrNone != ret )
         {
         pthread_mutex_lock(&(create_mutex1));
         return_error = ret;
         pthread_cond_signal(&(create_condition1));
-        pthread_mutex_unlock(&(create_mutex1));    
-        //return_error = ret;
+        pthread_mutex_unlock(&(create_mutex1));
         pthread_exit(NULL);
         }
 
@@ -437,10 +437,10 @@
         {
         gst_update_devsound_speech_bitrate(devsoundsrc);
         ret = initialize_devsound(devsoundsrc);
-        if( 0 == ret )
+        if( KErrNone == ret )
             {
                 ret = recordinit(devsoundsrc->handle);
-                if( 0 == ret )
+                if( KErrNone == ret )
                     initproperties(devsoundsrc);
         
             }
@@ -730,7 +730,7 @@
 
     consumer_thread_state = CONSUMER_THREAD_INITIALIZING;
     cmd = OPEN;
-    return_error = 0;
+    return_error = KErrNone;
     //gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) src, "Before Thread Create ",NULL);
     pthread_create(&ds_thread, NULL, StartDevSoundThread, (void *)src);
     //gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) src, "After Thread Create ",NULL);
@@ -744,7 +744,9 @@
         }
     //gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) src, "AFter Mutex Wait in START ",NULL);
     //gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) src, "gst_devsound_src_start EXIT ",NULL);
-        return ret;
+    if ( return_error )
+        post_symbian_error( bsrc,return_error );
+    return ret;
     /* ERRORS */
     }
 
@@ -754,7 +756,6 @@
     GstDevsoundSrc *src= GST_DEVSOUND_SRC(bsrc);
     //gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) src, "gst_devsound_src_stop ENTER ");
     cmd = CLOSE;
-
     pthread_mutex_lock(&(create_mutex1));
     pthread_cond_signal(&(create_condition1));
     pthread_mutex_unlock(&(create_mutex1));
@@ -822,14 +823,14 @@
     {
     GstDevsoundSrc *dsrc= GST_DEVSOUND_SRC(src);
     int bufferpos=0;
-    int ret = 0;
+    int ret = KErrNone;
     
     if(!g_queue_get_length(dataqueue) && (dsrc->eosreceived == TRUE))
         {
         pthread_mutex_lock(&(create_mutex1));
         pthread_cond_signal(&(create_condition1));
         pthread_mutex_unlock(&(create_mutex1));
-        
+        post_symbian_error( src,KErrCancel );
         return GST_FLOW_UNEXPECTED;
         }
     
@@ -838,7 +839,12 @@
     //gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) dsrc, "Before Buffer Alloc in CREATE ",NULL);
     *buf = gst_buffer_try_new_and_alloc(size);
     //gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) dsrc, "AFter Buffer Alloc in CREATE ",NULL);
-
+    if(*buf == NULL)
+    {
+        post_symbian_error( src,KErrNoMemory );
+        return GST_FLOW_UNEXPECTED;
+    }        
+    
     while (size > 0)
         {
         if (dataleft >= size)
@@ -883,12 +889,13 @@
                 //gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) dsrc, "Before WAIT in CREATE ",NULL);
                 if(dsrc->eosreceived == TRUE)
                     {
+                    post_symbian_error( src,KErrCancel );
                     return GST_FLOW_UNEXPECTED;
                     }
                 else
                     {
                     cmd = RECORDING;
-                    return_error = 0;
+                    return_error = KErrNone;
                     pthread_mutex_lock(&(create_mutex1));
                     pthread_cond_signal(&(create_condition1));
                     pthread_mutex_unlock(&(create_mutex1));
@@ -900,19 +907,10 @@
                     }
                 //gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) dsrc, "AFTER WAIT in CREATE ",NULL);
                 }
-            if( KErrInUse == ret || KErrDied  == ret || KErrAccessDenied == ret )
-            {
-                // post error as pre-emption
-                GST_ELEMENT_ERROR (src, RESOURCE, BUSY,
-                    (("Pre-emption error.")),
-                    ("streaming paused because higher priority app requested resource, Err(%d)", ret));
-                
+            if( ret )
+            { 
+                post_symbian_error( src,ret );
                 return GST_FLOW_UNEXPECTED;
-            }     
-            else if( KErrNone != ret )
-            {
-                // no need to post error as base src will post error. 
-                return GST_FLOW_ERROR;
             }
             //gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) dsrc, "Before POP in CREATE ",NULL);
             GST_OBJECT_LOCK(dsrc);
@@ -921,7 +919,8 @@
            
             if(!popBuffer )
             {
-               return GST_FLOW_UNEXPECTED;
+                post_symbian_error( src,KErrNoMemory );
+                return GST_FLOW_UNEXPECTED;
             }
             if(dsrc->firstTimeInit != kPlayed)
                 {        
@@ -990,7 +989,7 @@
             if(cmd == PAUSE)
                 {
                 cmd = RESUME;
-                return_error = 0;
+                return_error = KErrNone;
                 pthread_mutex_lock(&create_mutex1);
                 pthread_cond_signal(&create_condition1);
                 pthread_mutex_unlock(&create_mutex1);
@@ -998,7 +997,10 @@
                 pthread_mutex_lock(&create_mutex1);
                 pthread_cond_wait(&create_condition1, &create_mutex1);
                 if( return_error )
+                    {
+                    post_symbian_error( GST_BASE_SRC(element),return_error );
                     ret = GST_STATE_CHANGE_FAILURE;
+                    }
                 pthread_mutex_unlock(&create_mutex1);
                 }
             break;
@@ -1014,7 +1016,7 @@
           
           case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
               cmd = PAUSE;
-              return_error = 0;
+              return_error = KErrNone;
               pthread_mutex_lock(&create_mutex1);
               pthread_cond_signal(&create_condition1);
               pthread_mutex_unlock(&create_mutex1);
@@ -1022,7 +1024,10 @@
               pthread_mutex_lock(&create_mutex1);
               pthread_cond_wait(&create_condition1, &create_mutex1);
               if( return_error )
-                  ret = GST_STATE_CHANGE_FAILURE;              
+                  {
+                  post_symbian_error( GST_BASE_SRC(element),return_error );
+                  ret = GST_STATE_CHANGE_FAILURE;
+                  }            
               pthread_mutex_unlock(&create_mutex1);
               break;
           default:
@@ -1302,7 +1307,7 @@
             //reset_devsound(sink->handle);
             src->eosreceived = TRUE;
             cmd = STOP;
-            return_error = 0;
+            return_error = KErrNone;
             pthread_mutex_lock(&create_mutex1);
             pthread_cond_signal(&create_condition1);
             pthread_mutex_unlock(&create_mutex1);
@@ -1328,4 +1333,94 @@
     
     return retValue;
     }
-	
+
+static void 
+post_symbian_error ( GstBaseSrc* element, int symbian_error )
+{
+    switch (symbian_error)
+    {
+
+        case KErrNone:
+            break;
+        case KErrNotFound:
+            GST_ELEMENT_ERROR (element, RESOURCE, NOT_FOUND,
+                (("resource not found error.")),
+                ("streaming paused because resource not found, Err(%d)", symbian_error));               
+            break;
+        case KErrCancel:
+            GST_ELEMENT_ERROR (element, RESOURCE, CLOSE,
+                (("resource request canceled.")),
+                ("streaming paused because resource request canceled, Err(%d)", symbian_error));               
+            break;
+        case KErrNoMemory:
+            GST_ELEMENT_ERROR (element, RESOURCE, NO_SPACE_LEFT,
+                (("Error out of memory")),
+                ("streaming paused because of no memory, Err(%d)", symbian_error));               
+            break;
+        case KErrNotSupported:
+            GST_ELEMENT_ERROR (element, RESOURCE, READ,
+                (("resource not supported.")),
+                ("streaming paused because resource not supported, Err(%d)", symbian_error));               
+            break;
+        case KErrNotReady:
+            GST_ELEMENT_ERROR (element, RESOURCE, TOO_LAZY,
+                (("resource is not ready for request.")),
+                ("streaming paused because resource is not ready, Err(%d)", symbian_error));               
+            break;
+        case KErrPermissionDenied:
+            GST_ELEMENT_ERROR (element, RESOURCE, READ,
+                (("Permission Denied.")),
+                ("streaming paused because permission denied, Err(%d)", symbian_error));               
+            break;
+        case KErrTimedOut:
+            GST_ELEMENT_ERROR (element, RESOURCE, TOO_LAZY,
+                (("Timed Out.")),
+                ("streaming paused because timed out, Err(%d)", symbian_error));               
+            break;
+        case KErrHardwareNotAvailable:
+            GST_ELEMENT_ERROR (element, RESOURCE, NOT_FOUND,
+                (("Hardware Not Available.")),
+                ("streaming paused because hardware not available, Err(%d)", symbian_error));               
+            break;
+        case KErrCorrupt:
+            GST_ELEMENT_ERROR (element, RESOURCE, FAILED,
+                (("Corrupted data.")),
+                ("streaming paused because of corrupted data, Err(%d)", symbian_error));               
+            break;
+        case KErrUnderflow:
+            GST_ELEMENT_ERROR (element, STREAM, FAILED,
+                (("Under flow.")),
+                ("streaming paused because of under flow, Err(%d)", symbian_error));               
+            break;
+        case KErrOverflow:
+            GST_ELEMENT_ERROR (element, STREAM, FAILED,
+                (("Over flow.")),
+                ("streaming paused because of over flow, Err(%d)", symbian_error));    
+            break;
+
+        case KErrInUse:
+            GST_ELEMENT_ERROR (element, RESOURCE, BUSY,
+                (("Resource In Use.")),
+                ("streaming paused because resource in use, Err(%d)", symbian_error));            
+            break;
+            
+        case KErrDied:
+            GST_ELEMENT_ERROR (element, RESOURCE, BUSY,
+                (("Error Resource Died.")),
+                ("streaming paused because resource died., Err(%d)", symbian_error));            
+            break;
+            
+        case KErrAccessDenied:            
+            GST_ELEMENT_ERROR (element, RESOURCE, BUSY,
+                (("Resource Access Denied.")),
+                ("streaming paused because resource access denied, Err(%d)", symbian_error));            
+            break;
+            
+        default:
+            GST_ELEMENT_ERROR (element, STREAM, FAILED,
+                (("internal data flow error.")),
+                ("streaming paused because of internal data flow error., Err(%d)", symbian_error));            
+            break;
+    }
+}
+