FreeRDP
Loading...
Searching...
No Matches
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 = nullptr;
90 COMMAND_LINE_ARGUMENT_A rdpsnd_fake_args[] = { { nullptr, 0, nullptr, nullptr, nullptr, -1,
91 nullptr, nullptr } };
92 flags =
93 COMMAND_LINE_SIGIL_NONE | COMMAND_LINE_SEPARATOR_COLON | COMMAND_LINE_IGN_UNKNOWN_KEYWORD;
94 status = CommandLineParseArgumentsA(args->argc, args->argv, rdpsnd_fake_args, flags, fake,
95 nullptr, nullptr);
96
97 if (status < 0)
98 return ERROR_INVALID_DATA;
99
100 arg = rdpsnd_fake_args;
101
102 do
103 {
104 if (!(arg->Flags & COMMAND_LINE_VALUE_PRESENT))
105 continue;
106
107 CommandLineSwitchStart(arg) CommandLineSwitchEnd(arg)
108 } while ((arg = CommandLineFindNextArgumentA(arg)) != nullptr);
109
110 return CHANNEL_RC_OK;
111}
112
118FREERDP_ENTRY_POINT(UINT VCAPITYPE fake_freerdp_rdpsnd_client_subsystem_entry(
120{
121 const ADDIN_ARGV* args = nullptr;
122 rdpsndFakePlugin* fake = nullptr;
123 UINT ret = CHANNEL_RC_OK;
124 fake = (rdpsndFakePlugin*)calloc(1, sizeof(rdpsndFakePlugin));
125
126 if (!fake)
127 return CHANNEL_RC_NO_MEMORY;
128
129 fake->device.Open = rdpsnd_fake_open;
130 fake->device.FormatSupported = rdpsnd_fake_format_supported;
131 fake->device.SetVolume = rdpsnd_fake_set_volume;
132 fake->device.Play = rdpsnd_fake_play;
133 fake->device.Close = rdpsnd_fake_close;
134 fake->device.Free = rdpsnd_fake_free;
135 args = pEntryPoints->args;
136
137 if (args->argc > 1)
138 {
139 ret = rdpsnd_fake_parse_addin_args(fake, args);
140
141 if (ret != CHANNEL_RC_OK)
142 {
143 WLog_ERR(TAG, "error parsing arguments");
144 goto error;
145 }
146 }
147
148 pEntryPoints->pRegisterRdpsndDevice(pEntryPoints->rdpsnd, &fake->device);
149 return ret;
150error:
151 rdpsnd_fake_free(&fake->device);
152 return ret;
153}