FreeRDP
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Modules Pages
rdpsnd_fake.c
1
21#include <freerdp/config.h>
22
23#include <stdio.h>
24#include <stdlib.h>
25#include <string.h>
26
27#include <winpr/crt.h>
28#include <winpr/stream.h>
29#include <winpr/cmdline.h>
30
31#include <freerdp/types.h>
32#include <freerdp/settings.h>
33
34#include "rdpsnd_main.h"
35
36typedef struct
37{
38 rdpsndDevicePlugin device;
39} rdpsndFakePlugin;
40
41static BOOL rdpsnd_fake_open(WINPR_ATTR_UNUSED rdpsndDevicePlugin* device,
42 WINPR_ATTR_UNUSED const AUDIO_FORMAT* format,
43 WINPR_ATTR_UNUSED UINT32 latency)
44{
45 return TRUE;
46}
47
48static void rdpsnd_fake_close(WINPR_ATTR_UNUSED rdpsndDevicePlugin* device)
49{
50}
51
52static BOOL rdpsnd_fake_set_volume(WINPR_ATTR_UNUSED rdpsndDevicePlugin* device,
53 WINPR_ATTR_UNUSED UINT32 value)
54{
55 return TRUE;
56}
57
58static void rdpsnd_fake_free(rdpsndDevicePlugin* device)
59{
60 rdpsndFakePlugin* fake = (rdpsndFakePlugin*)device;
61
62 if (!fake)
63 return;
64
65 free(fake);
66}
67
68static BOOL rdpsnd_fake_format_supported(WINPR_ATTR_UNUSED rdpsndDevicePlugin* device,
69 WINPR_ATTR_UNUSED const AUDIO_FORMAT* format)
70{
71 return TRUE;
72}
73
74static UINT rdpsnd_fake_play(WINPR_ATTR_UNUSED rdpsndDevicePlugin* device,
75 WINPR_ATTR_UNUSED const BYTE* data, WINPR_ATTR_UNUSED size_t size)
76{
77 return CHANNEL_RC_OK;
78}
79
85static UINT rdpsnd_fake_parse_addin_args(rdpsndFakePlugin* fake, const ADDIN_ARGV* args)
86{
87 int status = 0;
88 DWORD flags = 0;
89 const COMMAND_LINE_ARGUMENT_A* arg = NULL;
90 COMMAND_LINE_ARGUMENT_A rdpsnd_fake_args[] = { { NULL, 0, NULL, NULL, NULL, -1, NULL, NULL } };
91 flags =
92 COMMAND_LINE_SIGIL_NONE | COMMAND_LINE_SEPARATOR_COLON | COMMAND_LINE_IGN_UNKNOWN_KEYWORD;
93 status = CommandLineParseArgumentsA(args->argc, args->argv, rdpsnd_fake_args, flags, fake, NULL,
94 NULL);
95
96 if (status < 0)
97 return ERROR_INVALID_DATA;
98
99 arg = rdpsnd_fake_args;
100
101 do
102 {
103 if (!(arg->Flags & COMMAND_LINE_VALUE_PRESENT))
104 continue;
105
106 CommandLineSwitchStart(arg) CommandLineSwitchEnd(arg)
107 } while ((arg = CommandLineFindNextArgumentA(arg)) != NULL);
108
109 return CHANNEL_RC_OK;
110}
111
117FREERDP_ENTRY_POINT(UINT VCAPITYPE fake_freerdp_rdpsnd_client_subsystem_entry(
119{
120 const ADDIN_ARGV* args = NULL;
121 rdpsndFakePlugin* fake = NULL;
122 UINT ret = CHANNEL_RC_OK;
123 fake = (rdpsndFakePlugin*)calloc(1, sizeof(rdpsndFakePlugin));
124
125 if (!fake)
126 return CHANNEL_RC_NO_MEMORY;
127
128 fake->device.Open = rdpsnd_fake_open;
129 fake->device.FormatSupported = rdpsnd_fake_format_supported;
130 fake->device.SetVolume = rdpsnd_fake_set_volume;
131 fake->device.Play = rdpsnd_fake_play;
132 fake->device.Close = rdpsnd_fake_close;
133 fake->device.Free = rdpsnd_fake_free;
134 args = pEntryPoints->args;
135
136 if (args->argc > 1)
137 {
138 ret = rdpsnd_fake_parse_addin_args(fake, args);
139
140 if (ret != CHANNEL_RC_OK)
141 {
142 WLog_ERR(TAG, "error parsing arguments");
143 goto error;
144 }
145 }
146
147 pEntryPoints->pRegisterRdpsndDevice(pEntryPoints->rdpsnd, &fake->device);
148 return ret;
149error:
150 rdpsnd_fake_free(&fake->device);
151 return ret;
152}