diff -r ca7a2ecf71ef phapi/phapi.c
--- a/phapi/phapi.c	Wed Jul 13 15:02:25 2011 +0200
+++ b/phapi/phapi.c	Wed Jul 13 17:13:46 2011 +0200
@@ -436,7 +436,8 @@
 		/* nattype */  "" ,
 		/* codecs */   "" ,"",
 		/* asyncmode */ 0,
-		/* audio_dev */   "" ,
+		/* audio_dev_in */   "" ,
+		/* audio_dev_out */   "" ,
 		/* softboost */ 0,
 		/* no media */ 0,
 		/* no aec */ 0,
@@ -860,9 +861,13 @@
 	}
 
 
-	if (ca->audiodev != phcfg.audio_dev)
-		if (ca->audiodev)
-			osip_free(ca->audiodev);
+	if (ca->audiodev_in != phcfg.audio_dev_in)
+		if (ca->audiodev_in)
+			osip_free(ca->audiodev_in);
+	
+	if (ca->audiodev_out != phcfg.audio_dev_out)
+		if (ca->audiodev_out)
+			osip_free(ca->audiodev_out);
 
 	ph_free_all_streams(ca->streams);
 	if (ca->sdpctx)
@@ -1453,9 +1458,15 @@
 		return -PH_NORESOURCES;
 
 	if (adev)
-		ca0->audiodev = osip_strdup(adev);
-	else if (phcfg.audio_dev) {
-		ca0->audiodev = osip_strdup(phcfg.audio_dev);
+		ca0->audiodev_in = osip_strdup(adev);
+	else 
+	{
+		if (phcfg.audio_dev_in) {
+			ca0->audiodev_in = osip_strdup(phcfg.audio_dev_in);
+		}
+		if (phcfg.audio_dev_out) {
+			ca0->audiodev_out = osip_strdup(phcfg.audio_dev_out);
+		}
 	}
 
 	ca0->user_mflags = streams;
@@ -2182,7 +2193,7 @@
 }
 
 PHAPI_EXPORT int
-phAcceptMcCall(int cid, const char *adev, const char *audioaddr, int port)
+phAcceptMcCall(int cid, const char *adev_in, const char *adev_out, const char *audioaddr, int port)
 {
 	phcall_t *ca;
 	char  local_voice_port[16] = "0";
@@ -2221,10 +2232,18 @@
 
 	eXosip_unlock();
 
-	if (adev)
-	{
-		if (ca->audiodev) osip_free(ca->audiodev);
-		ca->audiodev = osip_strdup(adev);
+	if (adev_in)
+	{
+		if (ca->audiodev_in) 
+			osip_free(ca->audiodev_in);
+		ca->audiodev_in = osip_strdup(adev_in);
+	}
+	
+	if (adev_out)
+	{
+		if (ca->audiodev_out) 
+			osip_free(ca->audiodev_out);
+		ca->audiodev_out = osip_strdup(adev_out);
 	}
 
 	ph_call_media_start(ca, NULL, streams|PH_STREAM_MCSEND, 0);
@@ -2270,8 +2289,10 @@
 	ca->local_sdp_audio_port = mca->local_sdp_audio_port;
 	ca->remote_sdp_audio_port =  mca->remote_sdp_audio_port;
 	strncpy(ca->remote_sdp_audio_ip, mca->remote_sdp_audio_ip, sizeof(ca->remote_sdp_audio_ip));
-	if (mca->audiodev)
-		ca->audiodev = osip_strdup(mca->audiodev);
+	if (mca->audiodev_in)
+		ca->audiodev_in = osip_strdup(mca->audiodev_in);
+	if (mca->audiodev_out)
+		ca->audiodev_out = osip_strdup(mca->audiodev_out);
 
 
 	ph_msession_use(mca->mses);
@@ -2686,7 +2707,7 @@
 	if(!ca1 || !ca2)
 		return -PH_BADCFID;
 
-	if (0 > ph_msession_conf_start(ca1->mses, ca2->mses, ca1->audiodev))
+	if (0 > ph_msession_conf_start(ca1->mses, ca2->mses, ca1->audiodev_in, ca1->audiodev_out))
 		return -PH_NORESOURCES;
 	else
 		return 0;
@@ -3410,11 +3431,19 @@
 
 
 
-PHAPI_EXPORT int phChangeAudioDevices(const char *devstr)
+PHAPI_EXPORT int phChangeAudioDeviceIn(const char *devstr)
 {
 	if (devstr)
-		strncpy(phcfg.audio_dev, devstr, sizeof(phcfg.audio_dev));
-
+		strncpy(phcfg.audio_dev_in, devstr, sizeof(phcfg.audio_dev_in));
+
+	return 0;
+}
+
+PHAPI_EXPORT int phChangeAudioDeviceOut(const char *devstr)
+{
+	if (devstr)
+		strncpy(phcfg.audio_dev_out, devstr, sizeof(phcfg.audio_dev_out));
+	
 	return 0;
 }
 
@@ -4760,12 +4789,15 @@
 	{
 		if (ca->mses->refcnt == 1)
 		{
-			if (!ca->audiodev)
-				ca->audiodev = osip_strdup(phcfg.audio_dev);
+			if (!ca->audiodev_in)
+				ca->audiodev_in = osip_strdup(phcfg.audio_dev_in);
+			
+			if (!ca->audiodev_out)
+				ca->audiodev_out = osip_strdup(phcfg.audio_dev_out);
 
 			if (!ph_msession_stopped(ca->mses))
 			{
-				ph_msession_stop(ca->mses, ca->audiodev,0);
+				ph_msession_stop(ca->mses, ca->audiodev_in, ca->audiodev_out,0);
 			}
 		}
 		ph_msession_free(ca->mses);
@@ -4781,10 +4813,10 @@
 {
 	if (ca->mses)
 	{
-		if (!ca->audiodev)
-			ca->audiodev = osip_strdup(phcfg.audio_dev);
-
-		ph_msession_suspend(ca->mses, PH_MSTREAM_TRAFFIC_IO, ca->audiodev);
+		if (!ca->audiodev_in)
+			ca->audiodev_in = osip_strdup(phcfg.audio_dev_in);
+
+		ph_msession_suspend(ca->mses, PH_MSTREAM_TRAFFIC_IO, ca->audiodev_in,  ca->audiodev_out);
 	}
 
 	return 0;
@@ -4796,9 +4828,13 @@
 {
 	if (ca->mses)
 	{
-		if (!ca->audiodev)
-			ca->audiodev = osip_strdup(phcfg.audio_dev);
-		ph_msession_resume(ca->mses, PH_MSTREAM_TRAFFIC_IO, ca->audiodev,0);
+		if (!ca->audiodev_in)
+			ca->audiodev_in = osip_strdup(phcfg.audio_dev_in);
+		
+		if (!ca->audiodev_out)
+			ca->audiodev_out = osip_strdup(phcfg.audio_dev_out);
+		
+		ph_msession_resume(ca->mses, PH_MSTREAM_TRAFFIC_IO, ca->audiodev_in, ca->audiodev_out, 0);
 	}
 
 	return 0;
@@ -4887,7 +4923,7 @@
 			if(s->activestreams)
 			{
 				osip_mutex_lock(ph_media_stop_mutex);
-				ph_msession_stop(s, phcfg.audio_dev,0);
+				ph_msession_stop(s, phcfg.audio_dev_in, phcfg.audio_dev_out, 0);
 				osip_mutex_unlock(ph_media_stop_mutex);
 			}
 			s->confflags = 0;
@@ -5070,13 +5106,13 @@
 	{
 		if (resumeflag)
 		{
-			if (ph_msession_resume(s, PH_MSTREAM_TRAFFIC_IO, phcfg.audio_dev, use_socket))
+			if (ph_msession_resume(s, PH_MSTREAM_TRAFFIC_IO, phcfg.audio_dev_in, phcfg.audio_dev_out, use_socket))
 			{
 				DBG_SIP_NEGO("SIP_NEGO:ph_call_media_start: just called ph_msession_resume\n");
 				i = -PH_NOMEDIA;
 			}
 		}
-		else if (ph_msession_start(s, ca->audiodev, use_socket))
+		else if (ph_msession_start(s, ca->audiodev_in, ca->audiodev_out, use_socket))
 		{
 			DBG_SIP_NEGO("SIP_NEGO:ph_call_media_start: just called ph_msession_start\n");
 			i = -PH_NOMEDIA;
@@ -5160,8 +5196,12 @@
 			goto done;
 		}
 
-		if (phcfg.audio_dev) {
-			ca->audiodev = osip_strdup(phcfg.audio_dev);
+		if (phcfg.audio_dev_in) {
+			ca->audiodev_in = osip_strdup(phcfg.audio_dev_in);
+		}
+		
+		if (phcfg.audio_dev_out) {
+			ca->audiodev_out = osip_strdup(phcfg.audio_dev_out);
 		}
 
 		info.userData = je->external_reference;
@@ -6844,8 +6884,8 @@
 static void previewVideoStreamRenderCallback(void *user_pointer, const MSPicture *local_view, const MSPicture *remote_view)
 {
 	phVideoFrameReceivedEvent_t info;
-	info.frame_remote = remote_view;
-	info.frame_local = local_view;
+	info.frame_remote = (phPicture_t*)remote_view;
+	info.frame_local = (phPicture_t*)local_view;
 	
 	phcb->onFrameReady(-1,&info);
 }
diff -r ca7a2ecf71ef phapi/phapi.h
--- a/phapi/phapi.h	Wed Jul 13 15:02:25 2011 +0200
+++ b/phapi/phapi.h	Wed Jul 13 17:13:46 2011 +0200
@@ -318,7 +318,7 @@
  * @param audioaddr  multicast ip addres for the audio stream
  * @param port       port number for the audio stream
  */
-PHAPI_EXPORT int phAcceptMcCall(int cid, const char *adev, const char *audioaddr, int port);
+PHAPI_EXPORT int phAcceptMcCall(int cid, const char *adev_in, const char *adev_out, const char *audioaddr, int port);
 
 
 /*
@@ -596,14 +596,16 @@
 
 /**
  * Change Audio devices
- * change the audio devices used by phApi. The change will take effect for
+ * change the audio device used by phApi. The change will take effect for
  * the new calls only.
  *
- * @param  devstr    the same value as in phcfg.audio_dev
+ * @param  devstr    the same value as in phcfg.audio_dev_XXX
  * @return           0 on success, or error code
  * 
  */
-PHAPI_EXPORT int phChangeAudioDevices(const char *devstr);
+PHAPI_EXPORT int phChangeAudioDeviceIn(const char *devstr);
+	
+PHAPI_EXPORT int phChangeAudioDeviceOut(const char *devstr);	
 
 
 /**
@@ -1221,8 +1223,9 @@
                             /* example: PCMU,PCMA,GSM,ILBC,SPEEX   */
 
   int  asyncmode;           /*!< when true phApi creates a separate eXosip polling thread... in client/server mode MUST be TRUE */
-  char audio_dev[64];       /*!< audio device identifier */
-			    /* example: IN=2 OUT=1 ; 2 is input device and 1 is ouput device */
+  char audio_dev_in[128];       /*!< audio device in identifier */
+  char audio_dev_out[128];      /*!< audio device out identifier */
+
   int softboost;            /* to be removed */
   int nomedia;
   int noaec;		    /* when non-zero - disable aec */
diff -r ca7a2ecf71ef phapi/phcall.h
--- a/phapi/phcall.h	Wed Jul 13 15:02:25 2011 +0200
+++ b/phapi/phcall.h	Wed Jul 13 17:13:46 2011 +0200
@@ -61,7 +61,8 @@
   int  nego_mflags;   /* current negociated media flags for the call */
   int  user_mflags;   /* user media flags for the call (flags given by the user when placing or accepting the call) */
   struct ph_msession_s *mses;
-  char *audiodev;
+  char *audiodev_in;
+  char *audiodev_out;
   char *videodev;
   struct _sdp_context *sdpctx;
   struct ph_stream_params *streams[PH_MAX_STREAMS];
diff -r ca7a2ecf71ef phapi/phms.c
--- a/phapi/phms.c	Wed Jul 13 15:02:25 2011 +0200
+++ b/phapi/phms.c	Wed Jul 13 17:13:46 2011 +0200
@@ -134,7 +134,7 @@
 	return prof;
 }
 
-int ph_msession_start(struct ph_msession_s *s, const char *adevice, int use_tr_sock)
+int ph_msession_start(struct ph_msession_s *s, const char *adevice_in, const char *adevice_out, int use_tr_sock)
 {	
 	int ret = 0;
 	phms_audio_stream_t *audio = NULL;
@@ -166,7 +166,7 @@
 	if(s->newstreams & 1<<PH_MSTREAM_AUDIO1)
 	{
 		audio = phms_audio_stream_start(audio1->profile, audio1->localport,audio1->remoteaddr,audio1->remoteport,audio1->remotertcpport,
-				audio1->ipayloads[0].number, audio1->jitter, (audio1->flags)&PH_MSTREAM_FLAG_AEC, s, adevice, use_tr_sock);
+				audio1->ipayloads[0].number, audio1->jitter, (audio1->flags)&PH_MSTREAM_FLAG_AEC, s, adevice_in, adevice_out, use_tr_sock);
 		if(!audio)
 		{
 			osip_mutex_unlock(s->critsec_mstream_init);
@@ -230,7 +230,7 @@
 	struct ph_mstream_params_s *video = &s->streams[PH_MSTREAM_VIDEO1];
 	return (video->streamerData && (video->flags & (PH_MSTREAM_FLAG_RUNNING)));
 }
-int ph_msession_conf_start(struct ph_msession_s *s1, struct ph_msession_s *s2, const char *device)
+int ph_msession_conf_start(struct ph_msession_s *s1, struct ph_msession_s *s2, const char *device_in, const char *device_out)
 {
 	int ret;
 
@@ -378,7 +378,7 @@
 	return ret;
 }
 
-int ph_msession_suspend(struct ph_msession_s *s,  int traffictype, const char *device)
+int ph_msession_suspend(struct ph_msession_s *s,  int traffictype, const char *device_in, const char *device_out)
 {
 	struct ph_mstream_params_s *audio1 = &s->streams[PH_MSTREAM_AUDIO1];
 #ifdef PHAPI_VIDEO_SUPPORT
@@ -465,7 +465,7 @@
 	}
 	return ret;
 }
-int ph_msession_resume(struct ph_msession_s *s, int traffictype, const char *device, int use_tr_sock)
+int ph_msession_resume(struct ph_msession_s *s, int traffictype, const char *device_in,  const char *device_out, int use_tr_sock)
 {
 	int ret = 0;
 	phms_audio_stream_t *audio = NULL;
@@ -522,7 +522,7 @@
 		if(stop_on_hold)
 		{
 			audio = phms_audio_stream_start(audio1->profile, audio1->localport,audio1->remoteaddr,audio1->remoteport,audio1->remotertcpport,
-					audio1->ipayloads[0].number, audio1->jitter, (audio1->flags)&PH_MSTREAM_FLAG_AEC,s,device,use_tr_sock);
+					audio1->ipayloads[0].number, audio1->jitter, (audio1->flags)&PH_MSTREAM_FLAG_AEC,s,device_in,device_out,use_tr_sock);
 		}
 		else
 		{
@@ -586,7 +586,7 @@
 		s->activestreams &= ~(1 << PH_MSTREAM_AUDIO1);
 	}
 }
-void ph_msession_stop(struct ph_msession_s *s, const char *adevid, int use_tr_sock)
+void ph_msession_stop(struct ph_msession_s *s, const char *adevice_in, const char *adevice_out, int use_tr_sock)
 {
 	DBG_MEDIA_ENGINE("MEDIA_ENGINE: entering ph_msession_stop\n");
 	osip_mutex_lock(s->critsec_mstream_init);
@@ -605,7 +605,7 @@
 		phms_stop(s);
 		osip_mutex_unlock(other->critsec_mstream_init);
 		if(!phms_audio_suspended(other) && !phms_video_suspended(other))
-			ph_msession_resume(other, PH_MSTREAM_TRAFFIC_IO, NULL,use_tr_sock);
+			ph_msession_resume(other, PH_MSTREAM_TRAFFIC_IO, adevice_in, adevice_out,use_tr_sock);
 	}
 	osip_mutex_unlock(s->critsec_mstream_init);
 }
diff -r ca7a2ecf71ef phapi/phms.h
--- a/phapi/phms.h	Wed Jul 13 15:02:25 2011 +0200
+++ b/phapi/phms.h	Wed Jul 13 17:13:46 2011 +0200
@@ -241,11 +241,11 @@
 /**
  * @brief start or (modify and restart) the necessary device/streaming engines of the session
  */
-int ph_msession_start(struct ph_msession_s *s, const char *adeviceId, int use_tr_sock);
+int ph_msession_start(struct ph_msession_s *s, const char *adevice_in, const char *adevice_out, int use_tr_sock);
 /**
  * @brief stop the necessary device/streaming engines of the session
  */
-void ph_msession_stop(struct ph_msession_s *s, const char *adeviceId, int use_tr_sock);
+void ph_msession_stop(struct ph_msession_s *s, const char *adevice_in, const char *adevice_out, int use_tr_sock);
 int ph_msession_stopped(struct ph_msession_s *s);
 #define ph_msession_stream_active(s, n)  (s->activestreams & (1 << n))
 int ph_msession_set_recvol(struct ph_msession_s *s,  int level);
@@ -253,10 +253,10 @@
 int ph_msession_send_sound_file(struct ph_msession_s *s, const char *filename);
 int ph_msession_send_dtmf(struct ph_msession_s *s, int dtmf, int mode);
 int ph_msession_is_stream_alive(struct ph_msession_s *s, int timeout);
-int ph_msession_conf_start(struct ph_msession_s *s1, struct ph_msession_s *s2, const char *adevice);
+int ph_msession_conf_start(struct ph_msession_s *s1, struct ph_msession_s *s2, const char *adevice_in, const char *adevice_out);
 int ph_msession_conf_stop(struct ph_msession_s *s1, struct ph_msession_s *s2);
-int ph_msession_suspend(struct ph_msession_s *s,  int traffictype, const char *adevice);
-int ph_msession_resume(struct ph_msession_s *s, int traffictype, const char *adevice, int use_tr_sock);
+int ph_msession_suspend(struct ph_msession_s *s,  int traffictype, const char *adevice_in, const char *adevice_out);
+int ph_msession_resume(struct ph_msession_s *s, int traffictype, const char *adevice_in, const char *adevice_out, int use_tr_sock);
 
 int ph_msession_get_local_stats(struct ph_msession_s *s, rtp_stats_t *lstats);
 
diff -r ca7a2ecf71ef phapi/phms_audiostream.c
--- a/phapi/phms_audiostream.c	Wed Jul 13 15:02:25 2011 +0200
+++ b/phapi/phms_audiostream.c	Wed Jul 13 17:13:46 2011 +0200
@@ -205,56 +205,20 @@
 
 MSSndCard *phms_get_read_soundcard(const char *device)
 {
-	int devlen=0;
-	char *in;
-	char temp[64];
-	ph_config_t *cfg = ph_get_config();
-	if(device == NULL)
-	{
-		device = cfg->audio_dev;
-	}
-
-	devlen = strlen(device);
-	if (devlen != 0)
-	{
-		char *devid;
-		strcpy(temp, device);
-		if ((in = strstr(temp,"IN=")) != NULL)
-		{
-			devid = strtok(in + 3, ";");
-			if (devid != NULL)
-				return ms_snd_card_manager_get_card(ms_snd_card_manager_get(),devid);
-		}
-	}
-	return(ms_snd_card_manager_get_default_capture_card(ms_snd_card_manager_get()));
+	MSSndCard * card = ms_snd_card_manager_get_card(ms_snd_card_manager_get(),device);
+	if(card)
+		return card;
+		
+	return ms_snd_card_manager_get_default_capture_card(ms_snd_card_manager_get());
 }
 
 MSSndCard *phms_get_write_soundcard(const char *device)
 {
-	int devlen=0;
-	char temp[64];
-	char *out;
-	ph_config_t *cfg = ph_get_config();
-
-	if(device == NULL)
-	{
-		device = cfg->audio_dev;
-	}
-
-	devlen = strlen(device);
-	if (devlen != 0)
-	{
-		char *devid;
-		strcpy(temp, device);
-		if ((out = strstr(temp,"OUT=")) != NULL)
-		{
-			devid = strtok(out + 4, ";");
-			if (devid != NULL)
-				return ms_snd_card_manager_get_card(ms_snd_card_manager_get(),devid);
-		}
-
-	}
-	return(ms_snd_card_manager_get_default_playback_card(ms_snd_card_manager_get()));
+	MSSndCard * card = ms_snd_card_manager_get_card(ms_snd_card_manager_get(),device);
+	if(card)
+		return card;
+	
+	return ms_snd_card_manager_get_default_playback_card(ms_snd_card_manager_get());
 }
 
 MSFilter *phms_get_soundread(char *device)
@@ -557,7 +521,7 @@
 }
 
 phms_audio_stream_t*
-phms_audio_stream_start(RtpProfile *prof,int locport,const char *remip,int remport,int rem_rtcp_port,int payload,int jitt_comp,bool_t use_ec, struct ph_msession_s *ms, const char *device, int use_tr_sock)
+phms_audio_stream_start(RtpProfile *prof,int locport,const char *remip,int remport,int rem_rtcp_port,int payload,int jitt_comp,bool_t use_ec, struct ph_msession_s *ms, const char *device_in, const char *device_out, int use_tr_sock)
 {
 	MSSndCard *capt_sndcard = 0, *play_sndcard = 0;
 	AudioStream *stream;
@@ -568,20 +532,20 @@
 	//	ms_reload_snd_card(&pasnd_card_desc);
 #endif
 
-	if ((infile = strstr(device,"INFILE=")) != NULL && (outfile = strstr(device,"OUTFILE=")) != NULL)
+	if ((infile = strstr(device_in,"INFILE=")) != NULL && (outfile = strstr(device_out,"OUTFILE=")) != NULL)
 	{
-		infile = strtok(infile + 7, ";");
+		infile = infile + 7;
 		if (infile == NULL)
 			return NULL;
 
-		outfile = strtok(outfile + 8, ";");
+		outfile = outfile + 8;
 		if (outfile == NULL)
 			return NULL;
 	}
 	else
 	{
-		capt_sndcard=phms_get_read_soundcard(device);
-		play_sndcard=phms_get_write_soundcard(device);
+		capt_sndcard=phms_get_read_soundcard(device_in);
+		play_sndcard=phms_get_write_soundcard(device_out);
 	}
 
 	stream=audio_stream_new(locport, ms_is_ipv6(remip));
diff -r ca7a2ecf71ef phapi/phms_audiostream.h
--- a/phapi/phms_audiostream.h	Wed Jul 13 15:02:25 2011 +0200
+++ b/phapi/phms_audiostream.h	Wed Jul 13 17:13:46 2011 +0200
@@ -46,7 +46,7 @@
 
 
 int phms_audio_init();
-phms_audio_stream_t* phms_audio_stream_start(RtpProfile *prof,int locport,const char *remip,int remport,int rem_rtcp_port, int profile,int jitt_comp,bool_t use_ec, struct ph_msession_s *ms, const char* audiodevice, int use_tr_sock);
+phms_audio_stream_t* phms_audio_stream_start(RtpProfile *prof,int locport,const char *remip,int remport,int rem_rtcp_port, int profile,int jitt_comp,bool_t use_ec, struct ph_msession_s *ms, const char* adevice_in, const char* adevice_out, int use_tr_sock);
 phms_audio_stream_t* phms_audio_stream_start_with_sndcards(RtpProfile *prof,int locport,const char *remip,int remport,int profile,int jitt_comp,MSSndCard *playcard, MSSndCard *captcard, bool_t use_ec);
 void phms_audio_stream_free(AudioStream *stream);
 void phms_audio_stream_stop(AudioStream *stream);
diff -r ca7a2ecf71ef phcpp/phapipp.cpp
--- a/phcpp/phapipp.cpp	Wed Jul 13 15:02:25 2011 +0200
+++ b/phcpp/phapipp.cpp	Wed Jul 13 17:13:46 2011 +0200
@@ -340,11 +340,16 @@
 	return device_map;
 }
 
-void phapi::changeAudioDevices(const char *devstr)
+void phapi::changeAudioDeviceIn(const char *devstr)
 {
-	phChangeAudioDevices(devstr);
+	phChangeAudioDeviceIn(devstr);
 }
 
+void phapi::changeAudioDeviceOut(const char *devstr)
+{
+	phChangeAudioDeviceOut(devstr);
+}
+	
 void phapi::changeVideoDevices(const char *devstr)
 {
 	phChangeVideoDevices(devstr);
diff -r ca7a2ecf71ef phcpp/phapipp.h
--- a/phcpp/phapipp.h	Wed Jul 13 15:02:25 2011 +0200
+++ b/phcpp/phapipp.h	Wed Jul 13 17:13:46 2011 +0200
@@ -147,7 +147,8 @@
 	virtual std::map<char*, char*> getAudioPlaybackDevices();
 	virtual std::map<char*, char*> getVideoWebcamDevices();
 	
-	virtual void changeAudioDevices(const char *devstr);
+	virtual void changeAudioDeviceIn(const char *devstr);
+	virtual void changeAudioDeviceOut(const char *devstr);
 	virtual void changeVideoDevices(const char *devstr);
 
 	virtual int setSoftRecvVolumeGain(int cid, float gain);
@@ -411,7 +412,8 @@
 
 
 	void setUaString(const string& ua) {  phapi::setUaString(cstr(ua)); }
-	void changeAudioDevices(const string& devstr) {  phapi::changeAudioDevices(cstr(devstr)); }
+	void changeAudioDeviceIn(const string& devstr) {  phapi::changeAudioDeviceIn(cstr(devstr)); }
+	void changeAudioDeviceOut(const string& devstr) {  phapi::changeAudioDeviceOut(cstr(devstr)); }
 	void changeAudioCodecList(const string& audio_codecs)
 	{
 		phapi::changeAudioCodecList(cstr(audio_codecs));
diff -r ca7a2ecf71ef phcpp/testphcpp.cpp
--- a/phcpp/testphcpp.cpp	Wed Jul 13 15:02:25 2011 +0200
+++ b/phcpp/testphcpp.cpp	Wed Jul 13 17:13:46 2011 +0200
@@ -388,7 +388,8 @@
 	strcpy(conf->local_audio_rtp_port, "27000");
 	strcpy(conf->local_audio_rtp_port_max, "28000");
 	strcpy(conf->sipport, "8060");
-	strcpy(conf->audio_dev, "default");
+	strcpy(conf->audio_dev_in, "default");
+	strcpy(conf->audio_dev_out, "default");
 	conf->noaec = 1;
 	api.setDebugLevel(0);
 	if (api.init())
