20#include <freerdp/config.h> 
   22#include <winpr/wtypes.h> 
   23#include <freerdp/codec/audio.h> 
   24#include <freerdp/codec/dsp.h> 
   26#include <freerdp/server/server-common.h> 
   27#include <freerdp/log.h> 
   29#define TAG FREERDP_TAG("server.common") 
   31size_t server_audin_get_formats(
AUDIO_FORMAT** dst_formats)
 
   34  BYTE adpcm_data_7[] = { 0xf4, 0x07, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00,
 
   35                        0xff, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0xf0, 0x00,
 
   36                        0x00, 0x00, 0xcc, 0x01, 0x30, 0xff, 0x88, 0x01, 0x18, 0xff };
 
   37  BYTE adpcm_data_3[] = { 0xf4, 0x03, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00,
 
   38                        0xff, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0xf0, 0x00,
 
   39                        0x00, 0x00, 0xcc, 0x01, 0x30, 0xff, 0x88, 0x01, 0x18, 0xff };
 
   40  BYTE adpcm_data_1[] = { 0xf4, 0x01, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00,
 
   41                        0xff, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0xf0, 0x00,
 
   42                        0x00, 0x00, 0xcc, 0x01, 0x30, 0xff, 0x88, 0x01, 0x18, 0xff };
 
   43  BYTE adpcm_dvi_data_7[] = { 0xf9, 0x07 };
 
   44  BYTE adpcm_dvi_data_3[] = { 0xf9, 0x03 };
 
   45  BYTE adpcm_dvi_data_1[] = { 0xf9, 0x01 };
 
   46  BYTE gsm610_data[] = { 0x40, 0x01 };
 
   49    { WAVE_FORMAT_AAC_MS, 2, 44100, 24000, 4, 16, 0, NULL },
 
   50    { WAVE_FORMAT_AAC_MS, 2, 44100, 20000, 4, 16, 0, NULL },
 
   51    { WAVE_FORMAT_AAC_MS, 2, 44100, 16000, 4, 16, 0, NULL },
 
   52    { WAVE_FORMAT_AAC_MS, 2, 44100, 12000, 4, 16, 0, NULL },
 
   53    { WAVE_FORMAT_PCM, 2, 44100, 176400, 4, 16, 0, NULL },
 
   54    { WAVE_FORMAT_ADPCM, 2, 44100, 44359, 2048, 4, 32, adpcm_data_7 },
 
   55    { WAVE_FORMAT_DVI_ADPCM, 2, 44100, 44251, 2048, 4, 2, adpcm_dvi_data_7 },
 
   56    { WAVE_FORMAT_ALAW, 2, 22050, 44100, 2, 8, 0, NULL },
 
   57    { WAVE_FORMAT_ADPCM, 2, 22050, 22311, 1024, 4, 32, adpcm_data_3 },
 
   58    { WAVE_FORMAT_DVI_ADPCM, 2, 22050, 22201, 1024, 4, 2, adpcm_dvi_data_3 },
 
   59    { WAVE_FORMAT_ADPCM, 1, 44100, 22179, 1024, 4, 32, adpcm_data_7 },
 
   60    { WAVE_FORMAT_DVI_ADPCM, 1, 44100, 22125, 1024, 4, 2, adpcm_dvi_data_7 },
 
   61    { WAVE_FORMAT_ADPCM, 2, 11025, 11289, 512, 4, 32, adpcm_data_1 },
 
   62    { WAVE_FORMAT_DVI_ADPCM, 2, 11025, 11177, 512, 4, 2, adpcm_dvi_data_1 },
 
   63    { WAVE_FORMAT_ADPCM, 1, 22050, 11155, 512, 4, 32, adpcm_data_3 },
 
   64    { WAVE_FORMAT_DVI_ADPCM, 1, 22050, 11100, 512, 4, 2, adpcm_dvi_data_3 },
 
   65    { WAVE_FORMAT_GSM610, 1, 44100, 8957, 65, 0, 2, gsm610_data },
 
   66    { WAVE_FORMAT_ADPCM, 2, 8000, 8192, 512, 4, 32, adpcm_data_1 },
 
   67    { WAVE_FORMAT_DVI_ADPCM, 2, 8000, 8110, 512, 4, 2, adpcm_dvi_data_1 },
 
   68    { WAVE_FORMAT_ADPCM, 1, 11025, 5644, 256, 4, 32, adpcm_data_1 },
 
   69    { WAVE_FORMAT_DVI_ADPCM, 1, 11025, 5588, 256, 4, 2, adpcm_dvi_data_1 },
 
   70    { WAVE_FORMAT_GSM610, 1, 22050, 4478, 65, 0, 2, gsm610_data },
 
   71    { WAVE_FORMAT_ADPCM, 1, 8000, 4096, 256, 4, 32, adpcm_data_1 },
 
   72    { WAVE_FORMAT_DVI_ADPCM, 1, 8000, 4055, 256, 4, 2, adpcm_dvi_data_1 },
 
   73    { WAVE_FORMAT_GSM610, 1, 11025, 2239, 65, 0, 2, gsm610_data },
 
   74    { WAVE_FORMAT_GSM610, 1, 8000, 1625, 65, 0, 2, gsm610_data },
 
   77    { WAVE_FORMAT_MSG723, 2, 44100, 0, 4, 16, 0, NULL },
 
   78    { WAVE_FORMAT_MSG723, 2, 22050, 0, 4, 16, 0, NULL },
 
   79    { WAVE_FORMAT_MSG723, 1, 44100, 0, 4, 16, 0, NULL },
 
   80    { WAVE_FORMAT_MSG723, 1, 22050, 0, 4, 16, 0, NULL },
 
   81    { WAVE_FORMAT_PCM, 2, 44100, 176400, 4, 16, 0, NULL },
 
   82    { WAVE_FORMAT_PCM, 2, 22050, 88200, 4, 16, 0, NULL },
 
   83    { WAVE_FORMAT_PCM, 1, 44100, 88200, 4, 16, 0, NULL },
 
   84    { WAVE_FORMAT_PCM, 1, 22050, 44100, 4, 16, 0, NULL },
 
   85    { WAVE_FORMAT_MULAW, 2, 44100, 88200, 4, 16, 0, NULL },
 
   86    { WAVE_FORMAT_MULAW, 2, 22050, 44100, 4, 16, 0, NULL },
 
   87    { WAVE_FORMAT_MULAW, 1, 44100, 44100, 4, 16, 0, NULL },
 
   88    { WAVE_FORMAT_MULAW, 1, 22050, 22050, 4, 16, 0, NULL },
 
   89    { WAVE_FORMAT_ALAW, 2, 44100, 88200, 2, 8, 0, NULL },
 
   90    { WAVE_FORMAT_ALAW, 2, 22050, 44100, 2, 8, 0, NULL },
 
   91    { WAVE_FORMAT_ALAW, 1, 44100, 44100, 2, 8, 0, NULL },
 
   92    { WAVE_FORMAT_ALAW, 1, 22050, 22050, 2, 8, 0, NULL }
 
   94  const size_t nrDefaultFormatsMax = ARRAYSIZE(default_supported_audio_formats);
 
   95  size_t nr_formats = 0;
 
   96  AUDIO_FORMAT* formats = audio_formats_new(nrDefaultFormatsMax);
 
  106  for (
size_t x = 0; x < nrDefaultFormatsMax; x++)
 
  108    const AUDIO_FORMAT* format = &default_supported_audio_formats[x];
 
  110    if (freerdp_dsp_supports_format(format, FALSE))
 
  114      if (!audio_format_copy(format, dst))
 
  119  *dst_formats = formats;
 
  122  audio_formats_free(formats, nrDefaultFormatsMax);
 
  126size_t server_rdpsnd_get_formats(
AUDIO_FORMAT** dst_formats)
 
  129  static const AUDIO_FORMAT default_supported_audio_formats[] = {
 
  130    { WAVE_FORMAT_AAC_MS, 2, 44100, 176400, 4, 16, 0, NULL },
 
  131    { WAVE_FORMAT_MPEGLAYER3, 2, 44100, 176400, 4, 16, 0, NULL },
 
  132    { WAVE_FORMAT_MSG723, 2, 44100, 176400, 4, 16, 0, NULL },
 
  133    { WAVE_FORMAT_GSM610, 2, 44100, 176400, 4, 16, 0, NULL },
 
  134    { WAVE_FORMAT_ADPCM, 2, 44100, 176400, 4, 16, 0, NULL },
 
  135    { WAVE_FORMAT_PCM, 2, 44100, 176400, 4, 16, 0, NULL },
 
  136    { WAVE_FORMAT_ALAW, 2, 22050, 44100, 2, 8, 0, NULL },
 
  137    { WAVE_FORMAT_MULAW, 2, 22050, 44100, 2, 8, 0, NULL },
 
  140      audio_formats_new(ARRAYSIZE(default_supported_audio_formats));
 
  142  if (!supported_audio_formats)
 
  146  for (
size_t x = 0; x < ARRAYSIZE(default_supported_audio_formats); x++)
 
  148    const AUDIO_FORMAT* format = &default_supported_audio_formats[x];
 
  150    if (freerdp_dsp_supports_format(format, TRUE))
 
  151      supported_audio_formats[y++] = *format;
 
  155  *dst_formats = supported_audio_formats;
 
  158  audio_formats_free(supported_audio_formats, ARRAYSIZE(default_supported_audio_formats));
 
  166void freerdp_server_warn_unmaintained(
int argc, 
char* argv[])
 
  168  const char* app = (argc > 0) ? argv[0] : 
"INVALID_ARGV";
 
  169  const DWORD log_level = WLOG_WARN;
 
  170  wLog* log = WLog_Get(TAG);
 
  173  if (!WLog_IsLevelActive(log, log_level))
 
  176  WLog_Print_unchecked(log, log_level, 
"[unmaintained] %s server is currently unmaintained!",
 
  178  WLog_Print_unchecked(
 
  180      " If problems occur please check https://github.com/FreeRDP/FreeRDP/issues for " 
  182  WLog_Print_unchecked(
 
  184      "Be prepared to fix issues yourself though as nobody is actively working on this.");
 
  185  WLog_Print_unchecked(
 
  187      " Developers hang out in https://matrix.to/#/#FreeRDP:matrix.org?via=matrix.org " 
  188      "- don't hesitate to ask some questions. (replies might take some time depending " 
  189      "on your timezone) - if you intend using this component write us a message");
 
  192void freerdp_server_warn_experimental(
int argc, 
char* argv[])
 
  194  const char* app = (argc > 0) ? argv[0] : 
"INVALID_ARGV";
 
  195  const DWORD log_level = WLOG_WARN;
 
  196  wLog* log = WLog_Get(TAG);
 
  199  if (!WLog_IsLevelActive(log, log_level))
 
  202  WLog_Print_unchecked(log, log_level, 
"[experimental] %s server is currently experimental!",
 
  204  WLog_Print_unchecked(
 
  206      " If problems occur please check https://github.com/FreeRDP/FreeRDP/issues for " 
  207      "known issues or create a new one!");
 
  208  WLog_Print_unchecked(
 
  210      " Developers hang out in https://matrix.to/#/#FreeRDP:matrix.org?via=matrix.org " 
  211      "- don't hesitate to ask some questions. (replies might take some time depending " 
  212      "on your timezone)");
 
  215void freerdp_server_warn_deprecated(
int argc, 
char* argv[])
 
  217  const char* app = (argc > 0) ? argv[0] : 
"INVALID_ARGV";
 
  218  const DWORD log_level = WLOG_WARN;
 
  219  wLog* log = WLog_Get(TAG);
 
  222  if (!WLog_IsLevelActive(log, log_level))
 
  225  WLog_Print_unchecked(log, log_level, 
"[deprecated] %s server has been deprecated", app);
 
  226  WLog_Print_unchecked(log, log_level, 
"As replacement there is a SDL based client available.");
 
  227  WLog_Print_unchecked(
 
  229      "If you are interested in keeping %s alive get in touch with the developers", app);
 
  230  WLog_Print_unchecked(
 
  232      "The project is hosted at https://github.com/freerdp/freerdp and " 
  233      " developers hang out in https://matrix.to/#/#FreeRDP:matrix.org?via=matrix.org " 
  234      "- don't hesitate to ask some questions. (replies might take some time depending " 
  235      "on your timezone)");