Index: uspace/lib/drv/generic/remote_audio_pcm.c
===================================================================
--- uspace/lib/drv/generic/remote_audio_pcm.c	(revision b4970183584d3b011f21b3b9d7baa1d10beca9b6)
+++ uspace/lib/drv/generic/remote_audio_pcm.c	(revision 2cc5c8357bcdbc4c5d0ca79839a7c7e2aadfde62)
@@ -33,4 +33,5 @@
 
 #include <async.h>
+#include <devman.h>
 #include <ddf/log.h>
 #include <errno.h>
@@ -55,8 +56,28 @@
  * CLIENT SIDE
  */
-int audio_pcm_get_info_str(async_exch_t *exch, const char **name)
-{
-	if (!exch)
-		return EINVAL;
+audio_pcm_sess_t *audio_pcm_open(const char *name)
+{
+	devman_handle_t device_handle = 0;
+	const int ret = devman_fun_get_handle(name, &device_handle, 0);
+	if (ret != EOK)
+		return NULL;
+	return devman_device_connect(EXCHANGE_SERIALIZE, device_handle,
+	    IPC_FLAG_BLOCKING);
+}
+
+audio_pcm_sess_t *audio_pcm_open_service(service_id_t id)
+{
+	return loc_service_connect(EXCHANGE_SERIALIZE, id, IPC_FLAG_BLOCKING);
+}
+
+void audio_pcm_close(audio_pcm_sess_t *sess)
+{
+	if (sess)
+		async_hangup(sess);
+}
+
+int audio_pcm_get_info_str(audio_pcm_sess_t *sess, const char **name)
+{
+	async_exch_t *exch = async_exchange_begin(sess);
 	sysarg_t name_size;
 	const int ret = async_req_1_1(exch,
@@ -69,4 +90,5 @@
 			 * as it waits for read request */
 			async_data_read_start(exch, (void*)-1, 0);
+			async_exchange_end(exch);
 			return ENOMEM;
 		}
@@ -75,16 +97,20 @@
 		if (ret != EOK) {
 			free(name_place);
+			async_exchange_end(exch);
 			return ret;
 		}
 		*name = name_place;
 	}
-	return ret;
-}
-
-int audio_pcm_get_buffer(async_exch_t *exch, void **buffer, size_t *size,
+	async_exchange_end(exch);
+	return ret;
+}
+
+int audio_pcm_get_buffer(audio_pcm_sess_t *sess, void **buffer, size_t *size,
     async_client_conn_t event_rec, void* arg)
 {
-	if (!exch || !buffer || !size)
+	if (!buffer || !size)
 		return EINVAL;
+
+	async_exch_t *exch = async_exchange_begin(sess);
 
 	sysarg_t buffer_size = *size;
@@ -96,8 +122,10 @@
 		int ret = async_share_in_start_0_0(exch, buffer_size, &dst);
 		if (ret != EOK) {
+			async_exchange_end(exch);
 			return ret;
 		}
 		ret = async_connect_to_me(exch, 0, 0, 0, event_rec, arg);
 		if (ret != EOK) {
+			async_exchange_end(exch);
 			return ret;
 		}
@@ -106,20 +134,21 @@
 		*size = buffer_size;
 	}
-	return ret;
-}
-
-int audio_pcm_release_buffer(async_exch_t *exch)
-{
-	if (!exch)
-		return EINVAL;
-	return async_req_1_0(exch, DEV_IFACE_ID(AUDIO_PCM_BUFFER_IFACE),
+	async_exchange_end(exch);
+	return ret;
+}
+
+int audio_pcm_release_buffer(audio_pcm_sess_t *sess)
+{
+	async_exch_t *exch = async_exchange_begin(sess);
+	const int ret = async_req_1_0(exch,
+	    DEV_IFACE_ID(AUDIO_PCM_BUFFER_IFACE),
 	    IPC_M_AUDIO_PCM_RELEASE_BUFFER);
-}
-
-int audio_pcm_start_playback(async_exch_t *exch, unsigned parts,
+	async_exchange_end(exch);
+	return ret;
+}
+
+int audio_pcm_start_playback(audio_pcm_sess_t *sess, unsigned parts,
     unsigned channels, unsigned sample_rate, pcm_sample_format_t format)
 {
-	if (!exch)
-		return EINVAL;
 	if (parts > UINT8_MAX || channels > UINT8_MAX)
 		return EINVAL;
@@ -127,21 +156,26 @@
 	const sysarg_t packed =
 	    (parts << 24) | (channels << 16) | (format & UINT16_MAX);
-	return async_req_3_0(exch, DEV_IFACE_ID(AUDIO_PCM_BUFFER_IFACE),
-	    IPC_M_AUDIO_PCM_START_PLAYBACK, sample_rate, packed);
-}
-
-int audio_pcm_stop_playback(async_exch_t *exch)
-{
-	if (!exch)
-		return EINVAL;
-	return async_req_1_0(exch, DEV_IFACE_ID(AUDIO_PCM_BUFFER_IFACE),
+	async_exch_t *exch = async_exchange_begin(sess);
+	const int ret = async_req_3_0(exch,
+	    DEV_IFACE_ID(AUDIO_PCM_BUFFER_IFACE),
+	    IPC_M_AUDIO_PCM_START_PLAYBACK,
+	    sample_rate, packed);
+	async_exchange_end(exch);
+	return ret;
+}
+
+int audio_pcm_stop_playback(audio_pcm_sess_t *sess)
+{
+	async_exch_t *exch = async_exchange_begin(sess);
+	const int ret = async_req_1_0(exch,
+	    DEV_IFACE_ID(AUDIO_PCM_BUFFER_IFACE),
 	    IPC_M_AUDIO_PCM_STOP_PLAYBACK);
-}
-
-int audio_pcm_start_record(async_exch_t *exch, unsigned parts,
+	async_exchange_end(exch);
+	return ret;
+}
+
+int audio_pcm_start_record(audio_pcm_sess_t *sess, unsigned parts,
     unsigned channels, unsigned sample_rate, pcm_sample_format_t format)
 {
-	if (!exch)
-		return EINVAL;
 	if (parts > UINT8_MAX || channels > UINT8_MAX)
 		return EINVAL;
@@ -149,14 +183,19 @@
 	const sysarg_t packed =
 	    (parts << 24) | (channels << 16) | (format & UINT16_MAX);
-	return async_req_3_0(exch, DEV_IFACE_ID(AUDIO_PCM_BUFFER_IFACE),
-	    IPC_M_AUDIO_PCM_START_RECORD, sample_rate, packed);
-}
-
-int audio_pcm_stop_record(async_exch_t *exch)
-{
-	if (!exch)
-		return EINVAL;
-	return async_req_1_0(exch, DEV_IFACE_ID(AUDIO_PCM_BUFFER_IFACE),
-	    IPC_M_AUDIO_PCM_STOP_RECORD);
+	async_exch_t *exch = async_exchange_begin(sess);
+	const int ret = async_req_3_0(exch,
+	    DEV_IFACE_ID(AUDIO_PCM_BUFFER_IFACE), IPC_M_AUDIO_PCM_START_RECORD,
+	    sample_rate, packed);
+	async_exchange_end(exch);
+	return ret;
+}
+
+int audio_pcm_stop_record(audio_pcm_sess_t *sess)
+{
+	async_exch_t *exch = async_exchange_begin(sess);
+	const int ret = async_req_1_0(exch,
+	    DEV_IFACE_ID(AUDIO_PCM_BUFFER_IFACE), IPC_M_AUDIO_PCM_STOP_RECORD);
+	async_exchange_end(exch);
+	return ret;
 }
 
Index: uspace/lib/drv/include/audio_pcm_iface.h
===================================================================
--- uspace/lib/drv/include/audio_pcm_iface.h	(revision b4970183584d3b011f21b3b9d7baa1d10beca9b6)
+++ uspace/lib/drv/include/audio_pcm_iface.h	(revision 2cc5c8357bcdbc4c5d0ca79839a7c7e2aadfde62)
@@ -39,4 +39,5 @@
 #include <async.h>
 #include <bool.h>
+#include <loc.h>
 #include <pcm_sample_format.h>
 
@@ -50,17 +51,22 @@
 };
 
+typedef async_sess_t audio_pcm_sess_t;
 
-int audio_pcm_get_info_str(async_exch_t *, const char **);
-int audio_pcm_get_buffer(async_exch_t *, void **, size_t *,
+audio_pcm_sess_t *audio_pcm_open(const char *);
+audio_pcm_sess_t *audio_pcm_open_service(service_id_t service);
+void audio_pcm_close(audio_pcm_sess_t *);
+
+int audio_pcm_get_info_str(audio_pcm_sess_t *, const char **);
+int audio_pcm_get_buffer(audio_pcm_sess_t *, void **, size_t *,
     async_client_conn_t, void *);
-int audio_pcm_release_buffer(async_exch_t *);
+int audio_pcm_release_buffer(audio_pcm_sess_t *);
 
-int audio_pcm_start_playback(async_exch_t *, unsigned,
+int audio_pcm_start_playback(audio_pcm_sess_t *, unsigned,
     unsigned, unsigned, pcm_sample_format_t);
-int audio_pcm_stop_playback(async_exch_t *);
+int audio_pcm_stop_playback(audio_pcm_sess_t *);
 
-int audio_pcm_start_record(async_exch_t *, unsigned,
+int audio_pcm_start_record(audio_pcm_sess_t *, unsigned,
     unsigned, unsigned, pcm_sample_format_t);
-int audio_pcm_stop_record(async_exch_t *);
+int audio_pcm_stop_record(audio_pcm_sess_t *);
 
 /** Audio pcm communication interface. */
