summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Sorg <jay.sorg@gmail.com>2013-07-19 20:04:47 -0700
committerJay Sorg <jay.sorg@gmail.com>2013-07-19 20:04:47 -0700
commit6709525a8addc5ed9d4a7918ee7e2665c62f4576 (patch)
tree19bc81046516b375c5255ff1c9e48a5db9ecc4d4
parent6a5f1417691b48dadca244544bf552c7cad2013d (diff)
downloadxrdp-proprietary-6709525a8addc5ed9d4a7918ee7e2665c62f4576.tar.gz
xrdp-proprietary-6709525a8addc5ed9d4a7918ee7e2665c62f4576.zip
xrdpvr: update from neutrinolabs
-rw-r--r--xrdpvr/xrdpvr.c59
-rw-r--r--xrdpvr/xrdpvr.h1
-rw-r--r--xrdpvr/xrdpvr_internal.h1
3 files changed, 57 insertions, 4 deletions
diff --git a/xrdpvr/xrdpvr.c b/xrdpvr/xrdpvr.c
index 6f39e975..09a0a6b8 100644
--- a/xrdpvr/xrdpvr.c
+++ b/xrdpvr/xrdpvr.c
@@ -92,11 +92,27 @@ xrdpvr_deinit_player(void *channel, int stream_id)
}
/* do local clean up */
- av_free(g_psi.frame);
- avcodec_close(g_psi.p_audio_codec_ctx);
- avcodec_close(g_psi.p_video_codec_ctx);
+ if (g_psi.frame != 0)
+ {
+ av_free(g_psi.frame);
+ g_psi.frame = 0;
+ }
+ if (g_psi.p_audio_codec_ctx != 0)
+ {
+ avcodec_close(g_psi.p_audio_codec_ctx);
+ g_psi.p_audio_codec_ctx = 0;
+ }
+ if (g_psi.p_video_codec_ctx != 0)
+ {
+ avcodec_close(g_psi.p_video_codec_ctx);
+ g_psi.p_video_codec_ctx = 0;
+ }
//avformat_close_input(&g_psi.p_format_ctx);
- av_close_input_file(g_psi.p_format_ctx);
+ if (g_psi.p_format_ctx != 0)
+ {
+ av_close_input_file(g_psi.p_format_ctx);
+ g_psi.p_format_ctx = 0;
+ }
/* do remote cleanup */
@@ -734,3 +750,38 @@ xrdpvr_write_to_client(void *channel, STREAM *s)
usleep(1000 * 3);
}
}
+
+/**
+ * write set volume to a xrdpvr client
+ *
+ * @param channel opaque handle returned by WTSVirtualChannelOpenEx
+ * @param volume volume 0x0000 to 0xffff
+ *
+ * @return 0 on success, -1 on failure
+ ******************************************************************************/
+int
+xrdpvr_set_volume(void *channel, int volume)
+{
+ STREAM *s;
+ char *cptr;
+ int rv;
+ int len;
+
+ stream_new(s, MAX_BUFSIZE);
+
+ stream_ins_u32_le(s, 0); /* number of bytes to follow */
+ stream_ins_u32_le(s, CMD_SET_VOLUME);
+ stream_ins_u32_le(s, volume);
+
+ /* insert number of bytes in stream */
+ len = stream_length(s) - 4;
+ cptr = s->p;
+ s->p = s->data;
+ stream_ins_u32_le(s, len);
+ s->p = cptr;
+
+ /* write data to virtual channel */
+ rv = xrdpvr_write_to_client(channel, s);
+ stream_free(s);
+ return rv;
+}
diff --git a/xrdpvr/xrdpvr.h b/xrdpvr/xrdpvr.h
index f278a703..1324282c 100644
--- a/xrdpvr/xrdpvr.h
+++ b/xrdpvr/xrdpvr.h
@@ -44,6 +44,7 @@ int xrdpvr_seek_media(int64_t pos, int backward);
int xrdpvr_get_frame(void **av_pkt_ret, int *is_video_frame, int *delay_in_us);
int send_audio_pkt(void *channel, int stream_id, void *pkt_p);
int send_video_pkt(void *channel, int stream_id, void *pkt_p);
+int xrdpvr_set_volume(void *channel, int volume);
#ifdef __cplusplus
}
diff --git a/xrdpvr/xrdpvr_internal.h b/xrdpvr/xrdpvr_internal.h
index 90753a06..ca01941c 100644
--- a/xrdpvr/xrdpvr_internal.h
+++ b/xrdpvr/xrdpvr_internal.h
@@ -61,6 +61,7 @@
#define CMD_WRITE_META_DATA 7
#define CMD_DEINIT_XRDPVR 8
#define CMD_SET_GEOMETRY 9
+#define CMD_SET_VOLUME 10
/* max number of bytes we can send in one pkt */
#define MAX_PDU_SIZE 1600