|
|
/////////////////////////////////////////////////////////////////////
//
// Module: rdpsndp.h
//
// Purpose: Sound redirection protocol description
//
// Copyright(C) Microsoft Corporation 2000
//
// History: 4-10-2000 vladimis [created]
//
/////////////////////////////////////////////////////////////////////
#ifndef _VCSND_H
#define _VCSND_H
#ifdef _WIN32
#include <pshpack1.h>
#else
#ifndef RC_INVOKED
#pragma pack(1)
#endif
#endif
#define RDPSND_PROTOCOL_VERSION 0x0005
#define _SNDVC_NAME "RDPSND"
#define DEFAULT_VC_TIMEOUT 30000
// Device capabilities
//
#define TSSNDCAPS_ALIVE 1
#define TSSNDCAPS_VOLUME 2
#define TSSNDCAPS_PITCH 4
#define TSSNDCAPS_INITIALIZED 0x40000000
#define TSSNDCAPS_TERMINATED 0x80000000
// the block size must be bigger than the biggest
// aligned block after acm conversion
// for example, Mobile Voice (WAVE_FORMAT_CU_CODEC) format
// requres more than 4096
// samples per block
//
#define TSSND_BLOCKSIZE ( 8192 * TSSND_NATIVE_BLOCKALIGN )
#define TSSND_BLOCKSONTHENET 4
#define TSSND_NATIVE_BITSPERSAMPLE 16
#define TSSND_NATIVE_CHANNELS 2
#define TSSND_NATIVE_SAMPLERATE 22050
#define TSSND_NATIVE_BLOCKALIGN ((TSSND_NATIVE_BITSPERSAMPLE * \
TSSND_NATIVE_CHANNELS) / 8) #define TSSND_NATIVE_AVGBYTESPERSEC (TSSND_NATIVE_BLOCKALIGN * \
TSSND_NATIVE_SAMPLERATE)
#define RANDOM_KEY_LENGTH 32
#define RDPSND_SIGNATURE_SIZE 8
#define IsDGramWaveSigned( _version_ ) ( _version_ >= 3 )
#define CanUDPFragment( _version_ ) ( _version_ >= 4 )
#define IsDGramWaveAudioSigned( _version_ ) ( _version_ >= 5 )
// Commands/Responses
//
enum { SNDC_NONE, SNDC_CLOSE, SNDC_WAVE, SNDC_SETVOLUME, SNDC_SETPITCH, SNDC_WAVECONFIRM, SNDC_TRAINING, SNDC_FORMATS, SNDC_CRYPTKEY, SNDC_WAVEENCRYPT, SNDC_UDPWAVE, SNDC_UDPWAVELAST };
typedef struct { BYTE Type; BYTE bPad; UINT16 BodySize; // BYTE Body[0];
} SNDPROLOG, *PSNDPROLOG;
typedef struct { SNDPROLOG Prolog; UINT32 dwVolume; } SNDSETVOLUME, *PSNDSETVOLUME;
typedef struct { SNDPROLOG Prolog; UINT32 dwPitch; } SNDSETPITCH, *PSNDSETPITCH;
typedef struct { SNDPROLOG Prolog; UINT16 wTimeStamp; UINT16 wFormatNo; union { BYTE cBlockNo; DWORD dwBlockNo; }; // BYTE Wave[0];
} SNDWAVE, *PSNDWAVE;
#define RDPSND_FRAGNO_EXT 0x80
#define RDPSND_MIN_FRAG_SIZE 0x80
typedef struct { BYTE Type; BYTE cBlockNo; BYTE cFragNo; //
// if RDPSND_FRAGNO_EXT is set
// there will be another byte for the low bits of the frag no
// BYTE Wave[0];
} SNDUDPWAVE, *PSNDUDPWAVE;
typedef struct { BYTE Type; UINT16 wTotalSize; UINT16 wTimeStamp; UINT16 wFormatNo; union { BYTE cBlockNo; DWORD dwBlockNo; }; // BYTE Wave[0];
} SNDUDPWAVELAST, *PSNDUDPWAVELAST;
typedef struct { SNDPROLOG Prolog; UINT16 wTimeStamp; BYTE cConfirmedBlockNo; BYTE bPad; } SNDWAVECONFIRM, *PSNDWAVECONFIRM;
typedef struct { SNDPROLOG Prolog; UINT16 wTimeStamp; UINT16 wPackSize; } SNDTRAINING, *PSNDTRAINING;
typedef struct { SNDPROLOG Prolog; UINT16 wTimeStamp; UINT16 wVersion; } SNDVERSION, *PSNDVERSION;
typedef struct { UINT16 wFormatTag; UINT16 nChannels; UINT32 nSamplesPerSec; UINT32 nAvgBytesPerSec; UINT16 nBlockAlign; UINT16 wBitsPerSample; UINT16 cbSize; //
// extra fomat info
//
} SNDFORMATITEM, *PSNDFORMATITEM;
typedef struct { SNDPROLOG Prolog; UINT32 dwFlags; UINT32 dwVolume; UINT32 dwPitch; UINT16 wDGramPort; UINT16 wNumberOfFormats; BYTE cLastBlockConfirmed; UINT16 wVersion; BYTE bPad; // SNDFORMATITEM pSndFmt[0];
} SNDFORMATMSG, *PSNDFORMATMSG;
typedef struct { SNDPROLOG Prolog; DWORD Reserved; BYTE Seed[RANDOM_KEY_LENGTH]; } SNDCRYPTKEY, *PSNDCRYPTKEY;
#ifdef _WIN32
#include <poppack.h>
#else
#ifndef RC_INVOKED
#pragma pack()
#endif
#endif
#endif // !_VCSND_H
|