- updated APS set_cap() to store output volume setting into stream param.
- updated APS get_param() to return actual volume setting.
- updated symbian_ua application to use the new pjsua-lib APIs: snd_set/get_setting().




git-svn-id: https://svn.pjsip.org/repos/pjproject/branches/projects/aps-direct@2498 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjmedia/src/pjmedia-audiodev/symb_aps_dev.cpp b/pjmedia/src/pjmedia-audiodev/symb_aps_dev.cpp
index 7ae1962..f9bfe8a 100644
--- a/pjmedia/src/pjmedia-audiodev/symb_aps_dev.cpp
+++ b/pjmedia/src/pjmedia-audiodev/symb_aps_dev.cpp
@@ -1130,7 +1130,7 @@
     pj_ansi_strcpy(af->dev_info.name, "S60 APS");
     af->dev_info.default_samples_per_sec = 8000;
     af->dev_info.caps = PJMEDIA_AUD_DEV_CAP_EXT_FORMAT |
-			PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING |
+			//PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING |
 			PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING |
 			PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE |
 			PJMEDIA_AUD_DEV_CAP_VAD |
@@ -1140,13 +1140,27 @@
     af->dev_info.input_count = 1;
     af->dev_info.output_count = 1;
 
-    af->dev_info.ext_fmt_cnt = 6;
+    af->dev_info.ext_fmt_cnt = 5;
+
     af->dev_info.ext_fmt[0].id = PJMEDIA_FORMAT_AMR;
+    af->dev_info.ext_fmt[0].bitrate = 7400;
+    af->dev_info.ext_fmt[0].vad = PJ_TRUE;
+
     af->dev_info.ext_fmt[1].id = PJMEDIA_FORMAT_G729;
+    af->dev_info.ext_fmt[1].bitrate = 8000;
+    af->dev_info.ext_fmt[1].vad = PJ_FALSE;
+
     af->dev_info.ext_fmt[2].id = PJMEDIA_FORMAT_ILBC;
+    af->dev_info.ext_fmt[2].bitrate = 13333;
+    af->dev_info.ext_fmt[2].vad = PJ_TRUE;
+
     af->dev_info.ext_fmt[3].id = PJMEDIA_FORMAT_PCMU;
+    af->dev_info.ext_fmt[3].bitrate = 64000;
+    af->dev_info.ext_fmt[3].vad = PJ_FALSE;
+
     af->dev_info.ext_fmt[4].id = PJMEDIA_FORMAT_PCMA;
-    af->dev_info.ext_fmt[5].id = PJMEDIA_FORMAT_L16;
+    af->dev_info.ext_fmt[4].bitrate = 64000;
+    af->dev_info.ext_fmt[4].vad = PJ_FALSE;
     
     PJ_LOG(4, (THIS_FILE, "APS initialized"));
 
@@ -1206,7 +1220,6 @@
     param->samples_per_frame = af->dev_info.default_samples_per_sec * 20 / 1000;
     param->bits_per_sample = BITS_PER_SAMPLE;
     param->flags = PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE;
-    param->ext_fmt.id = PJMEDIA_FORMAT_L16;
     param->output_route = PJMEDIA_AUD_DEV_ROUTE_EARPIECE;
 
     return PJ_SUCCESS;
@@ -1358,6 +1371,13 @@
     PJ_ASSERT_RETURN(strm && pi, PJ_EINVAL);
 
     pj_memcpy(pi, &strm->param, sizeof(*pi));
+
+    /* Update the output volume setting */
+    if (stream_get_cap(s, PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING,
+		       &pi->output_vol) == PJ_SUCCESS)
+    {
+	pi->flags |= PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING;
+    }
     
     return PJ_SUCCESS;
 }
@@ -1379,6 +1399,9 @@
 	    status = PJ_SUCCESS;
 	}
 	break;
+    
+    /* There is a case that GetMaxGain() stucks, e.g: in N95. */ 
+    /*
     case PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING:
 	if (strm->param.dir & PJMEDIA_DIR_CAPTURE) {
 	    PJ_ASSERT_RETURN(strm->engine, PJ_EINVAL);
@@ -1394,6 +1417,8 @@
 	    }
 	}
 	break;
+    */
+
     case PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING:
 	if (strm->param.dir & PJMEDIA_DIR_PLAYBACK) {
 	    PJ_ASSERT_RETURN(strm->engine, PJ_EINVAL);
@@ -1452,6 +1477,9 @@
 		strm->param.output_route = r; 
 	}
 	break;
+
+    /* There is a case that GetMaxGain() stucks, e.g: in N95. */ 
+    /*
     case PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING:
 	if (strm->param.dir & PJMEDIA_DIR_CAPTURE) {
 	    PJ_ASSERT_RETURN(strm->engine, PJ_EINVAL);
@@ -1466,10 +1494,14 @@
 	    } else {
 		status = PJMEDIA_EAUD_NOTREADY;
 	    }
+	    if (status == PJ_SUCCESS)
+		strm->param.input_vol = *(unsigned*)pval;
 	}
 	break;
+    */
+
     case PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING:
-	if (strm->param.dir & PJMEDIA_DIR_CAPTURE) {
+	if (strm->param.dir & PJMEDIA_DIR_PLAYBACK) {
 	    PJ_ASSERT_RETURN(strm->engine, PJ_EINVAL);
 	    
 	    TInt max_vol = strm->engine->GetMaxVolume();
@@ -1482,6 +1514,8 @@
 	    } else {
 		status = PJMEDIA_EAUD_NOTREADY;
 	    }
+	    if (status == PJ_SUCCESS)
+		strm->param.output_vol = *(unsigned*)pval;
 	}
 	break;
     default: