From a7f658ed8db307be326ac9a6a1ce74355d587f0e Mon Sep 17 00:00:00 2001 From: patrickvl Date: Sun, 24 Jun 2018 18:11:04 +0200 Subject: [PATCH 0001/1000] LLE : Extended NV2A color formats --- src/devices/video/EmuNV2A_PGRAPH.cpp | 199 ++++++++++++++------------- src/devices/video/nv2a_int.h | 23 +++- 2 files changed, 127 insertions(+), 95 deletions(-) diff --git a/src/devices/video/EmuNV2A_PGRAPH.cpp b/src/devices/video/EmuNV2A_PGRAPH.cpp index ea37f8cb6..5350f3764 100644 --- a/src/devices/video/EmuNV2A_PGRAPH.cpp +++ b/src/devices/video/EmuNV2A_PGRAPH.cpp @@ -126,8 +126,8 @@ static const GLenum pgraph_stencil_op_map[] = { }; typedef struct ColorFormatInfo { - unsigned int bytes_per_pixel; - bool linear; + unsigned int bytes_per_pixel; // Derived from the total number of channel bits + bool linear; // True for all NV097_SET_TEXTURE_FORMAT_COLOR_LU_* (and _LC_*?) GLint gl_internal_format; GLenum gl_format; GLenum gl_type; @@ -163,7 +163,7 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { /* paletted texture */ //0x0B [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_I8_A8R8G8B8] = - {1, false, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, + {1, false, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // See convert_texture_data //0x0C [NV097_SET_TEXTURE_FORMAT_COLOR_L_DXT1_A1R5G5B5] = {4, false, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 0, GL_RGBA}, @@ -182,16 +182,17 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { //0x13 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_Y8] = {1, true, GL_R8, GL_RED, GL_UNSIGNED_BYTE, {GL_RED, GL_RED, GL_RED, GL_ONE}}, - //0x14 [?] = - {}, - //0x15 [?] = - {}, - //0x16 [?] = - {}, - //0x17 [?] = - {}, - //0x18 [?] = - {}, + //0x14 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_SY8] = + {1, true, GL_R8, GL_RED, GL_BYTE, /* FIXME: This might be signed */ + {GL_RED, GL_RED, GL_RED, GL_ONE}}, // TODO : Verify + //0x15 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X7SY9] = + {2, true}, // TODO : Complete + //0x16 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R8B8] = + {2, true}, // TODO : Complete + //0x17 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_G8B8] = + {2, true}, // TODO : Complete + //0x18 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_SG8SB8] = + {2, true}, // TODO : Complete //0x19 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_A8] = {1, false, GL_R8, GL_RED, GL_UNSIGNED_BYTE, @@ -205,7 +206,7 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { //0x1C [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X1R5G5B5] = {2, true, GL_RGB5, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, //0x1D [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A4R4G4B4] = - {2, false, GL_RGBA4, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV}, + {2, true, GL_RGBA4, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV}, // TODO : Verify this is truely linear //0x1E [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X8R8G8B8] = {4, true, GL_RGB8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, //0x1F [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8] = @@ -221,28 +222,31 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { //0x23 [?] = {}, //0x24 [NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_CR8YB8CB8YA8] = - { 2, true, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV }, // TODO: format conversion - //0x25 [?] = - {}, - //0x26 [?] = - {}, + { 2, true, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, // See convert_texture_data and convert_yuy2_to_rgb + {GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA}}, // TODO : Verify + //0x25 [NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_YB8CR8YA8CB8] = + { 2, true, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, // See convert_texture_data and convert_yuy2_to_rgb + {GL_GREEN, GL_RED, GL_ALPHA, GL_BLUE}}, // TODO : Verify + //0x26 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8CR8CB8Y8] = + { 2, true, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, // See convert_texture_data and convert_yuy2_to_rgb + {GL_ALPHA, GL_RED, GL_BLUE, GL_GREEN}}, // TODO : Verify //0x27 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R6G5B5] = - {2, false, GL_RGB8_SNORM, GL_RGB, GL_BYTE}, /* FIXME: This might be signed */ + {2, false, GL_RGB8_SNORM, GL_RGB, GL_BYTE}, /* FIXME: This might be signed */ // See convert_texture_data //0x28 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_G8B8] = {2, false, GL_RG8_SNORM, GL_RG, GL_BYTE, /* FIXME: This might be signed */ {GL_ZERO, GL_RED, GL_GREEN, GL_ONE}}, //0x29 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R8B8] = {2, false, GL_RG8_SNORM, GL_RG, GL_BYTE, /* FIXME: This might be signed */ {GL_RED, GL_ZERO, GL_GREEN, GL_ONE}}, - //0x2A [?] = - {}, - //0x2B [?] = - {}, - //0x2C [?] = - {}, - //0x2D [?] = - {}, + //0x2A [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_DEPTH_X8_Y24_FIXED] = + {4, false, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, // TODO : Verify + //0x2B [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_DEPTH_X8_Y24_FLOAT] = + {4, false, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV}, // TODO : Verify + //0x2C [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_DEPTH_Y16_FIXED] = + {2, false, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT}, // TODO : Verify + //0x2D [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_DEPTH_Y16_FLOAT] = + {2, false, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_FLOAT}, // TODO : Verify /* TODO: format conversion */ @@ -252,36 +256,39 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { {}, //0x30 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_DEPTH_Y16_FIXED] = {2, true, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT}, - //0x31 [?] = - {}, - //0x32 [?] = - {}, - //0x33 [?] = - {}, - //0x34 [?] = - {}, + //0x31 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_DEPTH_Y16_FLOAT] = + {2, true, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_FLOAT}, // TODO : Verify + //0x32 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_Y16] = + {2, false, GL_R16, GL_RED, GL_UNSIGNED_SHORT, // TODO : Verify + {GL_RED, GL_RED, GL_RED, GL_ONE}}, + //0x33 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_YB_16_YA_16] = + {4, false, GL_R16, GL_RED, GL_UNSIGNED_SHORT, // TODO : Verify + {GL_RED, GL_RED, GL_RED, GL_GREEN}}, + //0x34 [NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_A4V6YB6A4U6YA6] = + {4, true}, // TODO : Complete //0x35 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_Y16] = {2, true, GL_R16, GL_RED, GL_UNSIGNED_SHORT, {GL_RED, GL_RED, GL_RED, GL_ONE}}, - //0x36 [?] = - {}, - //0x37 [?] = - {}, - //0x38 [?] = - {}, - //0x39 [?] = - {}, + //0x36 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_YB16YA16] = + {4, true, GL_R16, GL_RED, GL_UNSIGNED_SHORT, // TODO : Verify + {GL_RED, GL_RED, GL_GREEN, GL_GREEN}}, + //0x37 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R6G5B5] = + {2, false, GL_RGB8_SNORM, GL_RGB, GL_BYTE}, /* FIXME: This might be signed */ // TODO : Verify + //0x38 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R5G5B5A1] = + {2, false}, // TODO : Complete + //0x39 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R4G4B4A4] = + {2, false}, // TODO : Complete //0x3A [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_A8B8G8R8] = {4, false, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, - //0x3B [?] = - {}, + //0x3B [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_B8G8R8A8] = + {4, false, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8}, // TODO : Verify //0x3C [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R8G8B8A8] = {4, false, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}, - //0x3D [?] = - {}, - //0x3E [?] = - {}, + //0x3D [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R5G5B5A1] = + {2, true}, // TODO : Complete + //0x3E [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R4G4B4A4] = + {2, true}, // TODO : Complete //0x3F [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8B8G8R8] = {4, true, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, @@ -4180,53 +4187,57 @@ static uint8_t* convert_texture_data(const TextureShape s, unsigned int row_pitch, unsigned int slice_pitch) { - if (s.color_format == NV097_SET_TEXTURE_FORMAT_COLOR_SZ_I8_A8R8G8B8) { - assert(depth == 1); /* FIXME */ - uint8_t* converted_data = (uint8_t*)g_malloc(width * height * 4); + switch (s.color_format) { + case NV097_SET_TEXTURE_FORMAT_COLOR_SZ_I8_A8R8G8B8: { + assert(depth == 1); /* FIXME */ + uint8_t* converted_data = (uint8_t*)g_malloc(width * height * 4); unsigned int x, y; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - uint8_t index = data[y * row_pitch + x]; - uint32_t color = *(uint32_t*)(palette_data + index * 4); - *(uint32_t*)(converted_data + y * width * 4 + x * 4) = color; - } - } - return converted_data; - } else if (s.color_format - == NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_CR8YB8CB8YA8) { - assert(depth == 1); /* FIXME */ - uint8_t* converted_data = (uint8_t*)g_malloc(width * height * 4); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + uint8_t index = data[y * row_pitch + x]; + uint32_t color = *(uint32_t*)(palette_data + index * 4); + *(uint32_t*)(converted_data + y * width * 4 + x * 4) = color; + } + } + return converted_data; + } + case NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_CR8YB8CB8YA8: + case NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_YB8CR8YA8CB8: + case NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8CR8CB8Y8: { + assert(depth == 1); /* FIXME */ + uint8_t* converted_data = (uint8_t*)g_malloc(width * height * 4); unsigned int x, y; - for (y = 0; y < height; y++) { - const uint8_t* line = &data[y * s.width * 2]; - for (x = 0; x < width; x++) { - uint8_t* pixel = &converted_data[(y * s.width + x) * 4]; - /* FIXME: Actually needs uyvy? */ - convert_yuy2_to_rgb(line, x, &pixel[0], &pixel[1], &pixel[2]); - pixel[3] = 255; - } - } - return converted_data; - } else if (s.color_format - == NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R6G5B5) { - assert(depth == 1); /* FIXME */ - uint8_t *converted_data = (uint8_t*)g_malloc(width * height * 3); + for (y = 0; y < height; y++) { + const uint8_t* line = &data[y * s.width * 2]; + for (x = 0; x < width; x++) { + uint8_t* pixel = &converted_data[(y * s.width + x) * 4]; + /* FIXME: Actually needs uyvy? */ + convert_yuy2_to_rgb(line, x, &pixel[0], &pixel[1], &pixel[2]); + pixel[3] = 255; + } + } + return converted_data; + } + case NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R6G5B5: { + assert(depth == 1); /* FIXME */ + uint8_t *converted_data = (uint8_t*)g_malloc(width * height * 3); unsigned int x, y; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - uint16_t rgb655 = *(uint16_t*)(data + y * row_pitch + x * 2); - int8_t *pixel = (int8_t*)&converted_data[(y * width + x) * 3]; - /* Maps 5 bit G and B signed value range to 8 bit - * signed values. R is probably unsigned. - */ - rgb655 ^= (1 << 9) | (1 << 4); - pixel[0] = ((rgb655 & 0xFC00) >> 10) * 0x7F / 0x3F; - pixel[1] = ((rgb655 & 0x03E0) >> 5) * 0xFF / 0x1F - 0x80; - pixel[2] = (rgb655 & 0x001F) * 0xFF / 0x1F - 0x80; - } - } - return converted_data; - } else { + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + uint16_t rgb655 = *(uint16_t*)(data + y * row_pitch + x * 2); + int8_t *pixel = (int8_t*)&converted_data[(y * width + x) * 3]; + /* Maps 5 bit G and B signed value range to 8 bit + * signed values. R is probably unsigned. + */ + rgb655 ^= (1 << 9) | (1 << 4); + pixel[0] = ((rgb655 & 0xFC00) >> 10) * 0x7F / 0x3F; + pixel[1] = ((rgb655 & 0x03E0) >> 5) * 0xFF / 0x1F - 0x80; + pixel[2] = (rgb655 & 0x001F) * 0xFF / 0x1F - 0x80; + } + } + return converted_data; + } + default: return NULL; } } diff --git a/src/devices/video/nv2a_int.h b/src/devices/video/nv2a_int.h index 9c7e84bb5..1e76174b8 100644 --- a/src/devices/video/nv2a_int.h +++ b/src/devices/video/nv2a_int.h @@ -1379,6 +1379,11 @@ # define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R5G6B5 0x11 # define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8R8G8B8 0x12 # define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_Y8 0x13 +# define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_SY8 0x14 +# define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X7SY9 0x15 +# define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R8B8 0x16 +# define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_G8B8 0x17 +# define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_SG8SB8 0x18 # define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_A8 0x19 # define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_A8Y8 0x1A # define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_AY8 0x1B @@ -1388,14 +1393,30 @@ # define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8 0x1F # define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8Y8 0x20 # define NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_CR8YB8CB8YA8 0x24 +# define NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_YB8CR8YA8CB8 0x25 +# define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8CR8CB8Y8 0x26 # define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R6G5B5 0x27 # define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_G8B8 0x28 # define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R8B8 0x29 -# define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_DEPTH_X8_Y24_FIXED 0x2E +# define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_DEPTH_X8_Y24_FIXED 0x2A +# define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_DEPTH_X8_Y24_FLOAT 0x2B +# define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_DEPTH_Y16_FIXED 0x2C +# define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_DEPTH_Y16_FLOAT 0x2D +# define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_DEPTH_X8_Y24_FIXED 0x2E # define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_DEPTH_Y16_FIXED 0x30 +# define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_DEPTH_Y16_FLOAT 0x31 +# define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_Y16 0x32 +# define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_YB_16_YA_16 0x33 +# define NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_A4V6YB6A4U6YA6 0x34 # define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_Y16 0x35 +# define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_YB16YA16 0x36 +# define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R6G5B5 0x37 +# define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R5G5B5A1 0x38 +# define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R4G4B4A4 0x39 # define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_A8B8G8R8 0x3A # define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R8G8B8A8 0x3C +# define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R5G5B5A1 0x3D +# define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R4G4B4A4 0x3E # define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8B8G8R8 0x3F # define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_B8G8R8A8 0x40 # define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R8G8B8A8 0x41 From d394d2e48cbf79d04f3307d0f8d12153405f462b Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Mon, 25 Jun 2018 14:42:53 +0200 Subject: [PATCH 0002/1000] LLE : Expanded NV2A formats and added conversions (using libyuv row-conversions) for some that cannot map directly to an OpenGL format. --- src/devices/video/EmuNV2A_PGRAPH.cpp | 355 +++++++++++++++------------ 1 file changed, 195 insertions(+), 160 deletions(-) diff --git a/src/devices/video/EmuNV2A_PGRAPH.cpp b/src/devices/video/EmuNV2A_PGRAPH.cpp index 5350f3764..09c4d76d3 100644 --- a/src/devices/video/EmuNV2A_PGRAPH.cpp +++ b/src/devices/video/EmuNV2A_PGRAPH.cpp @@ -125,35 +125,41 @@ static const GLenum pgraph_stencil_op_map[] = { GL_DECR_WRAP, }; +enum FormatEncoding { + linear = 0, + swizzled, // for all NV097_SET_TEXTURE_FORMAT_*_SZ_* + compressed // for all NV097_SET_TEXTURE_FORMAT_*_DXT* +}; + typedef struct ColorFormatInfo { unsigned int bytes_per_pixel; // Derived from the total number of channel bits - bool linear; // True for all NV097_SET_TEXTURE_FORMAT_COLOR_LU_* (and _LC_*?) + FormatEncoding encoding; GLint gl_internal_format; - GLenum gl_format; + GLenum gl_format; // == 0 for compressed formats GLenum gl_type; - GLenum gl_swizzle_mask[4]; + GLint gl_swizzle_mask[4]; } ColorFormatInfo; // Note : Avoid designated initializers to facilitate C++ builds static const ColorFormatInfo kelvin_color_format_map[256] = { //0x00 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_Y8] = - {1, false, GL_R8, GL_RED, GL_UNSIGNED_BYTE, + {1, swizzled, GL_R8, GL_RED, GL_UNSIGNED_BYTE, {GL_RED, GL_RED, GL_RED, GL_ONE}}, //0x01 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_AY8] = - {1, false, GL_R8, GL_RED, GL_UNSIGNED_BYTE, + {1, swizzled, GL_R8, GL_RED, GL_UNSIGNED_BYTE, {GL_RED, GL_RED, GL_RED, GL_RED}}, //0x02 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_A1R5G5B5] = - {2, false, GL_RGB5_A1, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, + {2, swizzled, GL_RGB5_A1, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, //0x03 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_X1R5G5B5] = - {2, false, GL_RGB5, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, + {2, swizzled, GL_RGB5, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, //0x04 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_A4R4G4B4] = - {2, false, GL_RGBA4, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV}, + {2, swizzled, GL_RGBA4, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV}, //0x05 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R5G6B5] = - {2, false, GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5}, + {2, swizzled, GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5}, //0x06 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_A8R8G8B8] = - {4, false, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, + {4, swizzled, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, //0x07 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_X8R8G8B8] = - {4, false, GL_RGB8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, + {4, swizzled, GL_RGB8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, //0x08 [?] = {}, //0x09 [?] = @@ -162,58 +168,61 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { {}, /* paletted texture */ - //0x0B [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_I8_A8R8G8B8] = - {1, false, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // See convert_texture_data + //0x0B [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_I8_A8R8G8B8] = // See convert_texture_data + {1, swizzled, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, //0x0C [NV097_SET_TEXTURE_FORMAT_COLOR_L_DXT1_A1R5G5B5] = - {4, false, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 0, GL_RGBA}, + {4, compressed, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 0, GL_RGBA}, //0x0D [?] = {}, //0x0E [NV097_SET_TEXTURE_FORMAT_COLOR_L_DXT23_A8R8G8B8] = - {4, false, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 0, GL_RGBA}, + {4, compressed, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 0, GL_RGBA}, //0x0F [NV097_SET_TEXTURE_FORMAT_COLOR_L_DXT45_A8R8G8B8] = - {4, false, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 0, GL_RGBA}, + {4, compressed, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 0, GL_RGBA}, //0x10 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A1R5G5B5] = - {2, true, GL_RGB5_A1, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, + {2, linear, GL_RGB5_A1, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, //0x11 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R5G6B5] = - {2, true, GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5}, + {2, linear, GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5}, //0x12 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8R8G8B8] = - {4, true, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, + {4, linear, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, //0x13 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_Y8] = - {1, true, GL_R8, GL_RED, GL_UNSIGNED_BYTE, + {1, linear, GL_R8, GL_RED, GL_UNSIGNED_BYTE, {GL_RED, GL_RED, GL_RED, GL_ONE}}, //0x14 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_SY8] = - {1, true, GL_R8, GL_RED, GL_BYTE, /* FIXME: This might be signed */ + {1, linear, GL_R8, GL_RED, GL_BYTE, {GL_RED, GL_RED, GL_RED, GL_ONE}}, // TODO : Verify - //0x15 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X7SY9] = - {2, true}, // TODO : Complete + //0x15 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X7SY9] = // See convert_texture_data + {2, linear, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify //0x16 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R8B8] = - {2, true}, // TODO : Complete + {2, linear, GL_RG8_SNORM, GL_RG, GL_UNSIGNED_BYTE, + {GL_RED, GL_ZERO, GL_GREEN, GL_ONE}}, // TODO : Verify //0x17 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_G8B8] = - {2, true}, // TODO : Complete + {2, linear, GL_RG8_SNORM, GL_RG, GL_UNSIGNED_BYTE, + {GL_ZERO, GL_RED, GL_GREEN, GL_ONE}}, // TODO : Verify //0x18 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_SG8SB8] = - {2, true}, // TODO : Complete + {2, linear, GL_RG8_SNORM, GL_RG, GL_BYTE, + {GL_ZERO, GL_RED, GL_GREEN, GL_ONE}}, // TODO : Verify //0x19 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_A8] = - {1, false, GL_R8, GL_RED, GL_UNSIGNED_BYTE, + {1, swizzled, GL_R8, GL_RED, GL_UNSIGNED_BYTE, {GL_ONE, GL_ONE, GL_ONE, GL_RED}}, //0x1A [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_A8Y8] = - {2, false, GL_RG8, GL_RG, GL_UNSIGNED_BYTE, + {2, swizzled, GL_RG8, GL_RG, GL_UNSIGNED_BYTE, {GL_GREEN, GL_GREEN, GL_GREEN, GL_RED}}, //0x1B [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_AY8] = - {1, true, GL_R8, GL_RED, GL_UNSIGNED_BYTE, + {1, linear, GL_R8, GL_RED, GL_UNSIGNED_BYTE, {GL_RED, GL_RED, GL_RED, GL_RED}}, //0x1C [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X1R5G5B5] = - {2, true, GL_RGB5, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, + {2, linear, GL_RGB5, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, //0x1D [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A4R4G4B4] = - {2, true, GL_RGBA4, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV}, // TODO : Verify this is truely linear + {2, linear, GL_RGBA4, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV}, // TODO : Verify this is truely linear //0x1E [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X8R8G8B8] = - {4, true, GL_RGB8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, + {4, linear, GL_RGB8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, //0x1F [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8] = - {1, true, GL_R8, GL_RED, GL_UNSIGNED_BYTE, + {1, linear, GL_R8, GL_RED, GL_UNSIGNED_BYTE, {GL_ONE, GL_ONE, GL_ONE, GL_RED}}, //0x20 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8Y8] = - {2, true, GL_RG8, GL_RG, GL_UNSIGNED_BYTE, + {2, linear, GL_RG8, GL_RG, GL_UNSIGNED_BYTE, {GL_GREEN, GL_GREEN, GL_GREEN, GL_RED}}, //0x21 [?] = {}, @@ -221,81 +230,78 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { {}, //0x23 [?] = {}, - //0x24 [NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_CR8YB8CB8YA8] = - { 2, true, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, // See convert_texture_data and convert_yuy2_to_rgb - {GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA}}, // TODO : Verify - //0x25 [NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_YB8CR8YA8CB8] = - { 2, true, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, // See convert_texture_data and convert_yuy2_to_rgb - {GL_GREEN, GL_RED, GL_ALPHA, GL_BLUE}}, // TODO : Verify - //0x26 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8CR8CB8Y8] = - { 2, true, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, // See convert_texture_data and convert_yuy2_to_rgb - {GL_ALPHA, GL_RED, GL_BLUE, GL_GREEN}}, // TODO : Verify + //0x24 [NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_CR8YB8CB8YA8] = // See convert_texture_data calling ____UYVYToARGBRow_C + {2, linear, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}, // TODO : Verify + //0x25 [NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_YB8CR8YA8CB8] = // See convert_texture_data calling ____YUY2ToARGBRow_C + {2, linear, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}, // TODO : Verify + //0x26 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8CR8CB8Y8] = // See convert_texture_data + {2, linear, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}, // TODO : Verify - //0x27 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R6G5B5] = - {2, false, GL_RGB8_SNORM, GL_RGB, GL_BYTE}, /* FIXME: This might be signed */ // See convert_texture_data + //0x27 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R6G5B5] = // See convert_texture_data + {2, swizzled, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, //0x28 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_G8B8] = - {2, false, GL_RG8_SNORM, GL_RG, GL_BYTE, /* FIXME: This might be signed */ + {2, swizzled, GL_RG8_SNORM, GL_RG, GL_UNSIGNED_BYTE, {GL_ZERO, GL_RED, GL_GREEN, GL_ONE}}, //0x29 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R8B8] = - {2, false, GL_RG8_SNORM, GL_RG, GL_BYTE, /* FIXME: This might be signed */ + {2, swizzled, GL_RG8_SNORM, GL_RG, GL_UNSIGNED_BYTE, {GL_RED, GL_ZERO, GL_GREEN, GL_ONE}}, //0x2A [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_DEPTH_X8_Y24_FIXED] = - {4, false, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, // TODO : Verify + {4, swizzled, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, // TODO : Verify //0x2B [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_DEPTH_X8_Y24_FLOAT] = - {4, false, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV}, // TODO : Verify + {4, swizzled, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV}, // TODO : Verify //0x2C [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_DEPTH_Y16_FIXED] = - {2, false, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT}, // TODO : Verify + {2, swizzled, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT}, // TODO : Verify //0x2D [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_DEPTH_Y16_FLOAT] = - {2, false, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_FLOAT}, // TODO : Verify + {2, swizzled, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_FLOAT}, // TODO : Verify /* TODO: format conversion */ //0x2E [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_DEPTH_X8_Y24_FIXED] = - {4, true, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, + {4, linear, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, //0x2F [?] = {}, //0x30 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_DEPTH_Y16_FIXED] = - {2, true, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT}, + {2, linear, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT}, //0x31 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_DEPTH_Y16_FLOAT] = - {2, true, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_FLOAT}, // TODO : Verify + {2, linear, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_FLOAT}, // TODO : Verify //0x32 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_Y16] = - {2, false, GL_R16, GL_RED, GL_UNSIGNED_SHORT, // TODO : Verify + {2, swizzled, GL_R16, GL_RED, GL_UNSIGNED_SHORT, // TODO : Verify {GL_RED, GL_RED, GL_RED, GL_ONE}}, //0x33 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_YB_16_YA_16] = - {4, false, GL_R16, GL_RED, GL_UNSIGNED_SHORT, // TODO : Verify + {4, swizzled, GL_R16, GL_RED, GL_UNSIGNED_SHORT, // TODO : Verify {GL_RED, GL_RED, GL_RED, GL_GREEN}}, //0x34 [NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_A4V6YB6A4U6YA6] = - {4, true}, // TODO : Complete + {4, linear}, // TODO : Complete this declaration //0x35 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_Y16] = - {2, true, GL_R16, GL_RED, GL_UNSIGNED_SHORT, + {2, linear, GL_R16, GL_RED, GL_UNSIGNED_SHORT, {GL_RED, GL_RED, GL_RED, GL_ONE}}, //0x36 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_YB16YA16] = - {4, true, GL_R16, GL_RED, GL_UNSIGNED_SHORT, // TODO : Verify + {4, linear, GL_R16, GL_RED, GL_UNSIGNED_SHORT, // TODO : Verify {GL_RED, GL_RED, GL_GREEN, GL_GREEN}}, - //0x37 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R6G5B5] = - {2, false, GL_RGB8_SNORM, GL_RGB, GL_BYTE}, /* FIXME: This might be signed */ // TODO : Verify - //0x38 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R5G5B5A1] = - {2, false}, // TODO : Complete - //0x39 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R4G4B4A4] = - {2, false}, // TODO : Complete + //0x37 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R6G5B5] = // See convert_texture_data + {2, linear, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, + //0x38 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R5G5B5A1] = // See convert_texture_data + {2, swizzled, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify + //0x39 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R4G4B4A4] = // See convert_texture_data + {2, swizzled, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify //0x3A [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_A8B8G8R8] = - {4, false, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, + {4, swizzled, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify //0x3B [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_B8G8R8A8] = - {4, false, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8}, // TODO : Verify + {4, swizzled, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8}, // TODO : Verify //0x3C [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R8G8B8A8] = - {4, false, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}, - //0x3D [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R5G5B5A1] = - {2, true}, // TODO : Complete - //0x3E [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R4G4B4A4] = - {2, true}, // TODO : Complete + {4, swizzled, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}, + //0x3D [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R5G5B5A1] = // See convert_texture_data + {2, linear, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify + //0x3E [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R4G4B4A4] = // See convert_texture_data + {2, linear, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify //0x3F [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8B8G8R8] = - {4, true, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, + {4, linear, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify //0x40 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_B8G8R8A8] = - {4, true, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8}, + {4, linear, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8}, // TODO : Verify //0x41 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R8G8B8A8] = - {4, true, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}, + {4, linear, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}, // TODO : Verify }; typedef struct SurfaceColorFormatInfo { @@ -366,9 +372,7 @@ static void load_graphics_object(NV2AState *d, hwaddr instance_address, Graphics static GraphicsObject* lookup_graphics_object(PGRAPHState *s, hwaddr instance_address); static float convert_f16_to_float(uint16_t f16); static float convert_f24_to_float(uint32_t f24); -static uint8_t cliptobyte(int x); -static void convert_yuy2_to_rgb(const uint8_t *line, unsigned int ix, uint8_t *r, uint8_t *g, uint8_t* b); -static uint8_t* convert_texture_data(const TextureShape s, const uint8_t *data, const uint8_t *palette_data, unsigned int width, unsigned int height, unsigned int depth, unsigned int row_pitch, unsigned int slice_pitch); +static uint8_t* convert_texture_data(const unsigned int color_format, const uint8_t *data, const uint8_t *palette_data, const unsigned int width, const unsigned int height, const unsigned int depth, const unsigned int row_pitch, const unsigned int slice_pitch); static void upload_gl_texture(GLenum gl_target, const TextureShape s, const uint8_t *texture_data, const uint8_t *palette_data); static TextureBinding* generate_texture(const TextureShape s, const uint8_t *texture_data, const uint8_t *palette_data); static guint texture_key_hash(gconstpointer key); @@ -3164,7 +3168,7 @@ static void pgraph_bind_shaders(PGRAPHState *pg) GET_MASK(pg->regs[NV_PGRAPH_TEXFMT0 + i*4], NV_PGRAPH_TEXFMT0_COLOR); - if (enabled && kelvin_color_format_map[color_format].linear) { + if (enabled && kelvin_color_format_map[color_format].encoding == linear) { state.psh.rect_tex[i] = true; } @@ -3679,7 +3683,7 @@ static void pgraph_bind_textures(NV2AState *d) } unsigned int width, height, depth; - if (f.linear) { + if (f.encoding == linear) { assert(dimensionality == 2); width = rect_width; height = rect_height; @@ -3691,7 +3695,7 @@ static void pgraph_bind_textures(NV2AState *d) /* FIXME: What about 3D mipmaps? */ levels = MIN(levels, max_mipmap_level + 1); - if (f.gl_format != 0) { + if (f.encoding == swizzled) { /* Discard mipmap levels that would be smaller than 1x1. * FIXME: Is this actually needed? * @@ -3757,7 +3761,7 @@ static void pgraph_bind_textures(NV2AState *d) NV2A_DPRINTF(" - 0x%tx\n", texture_data - d->vram_ptr); size_t length = 0; - if (f.linear) { + if (f.encoding == linear) { assert(cubemap == false); assert(dimensionality == 2); length = height * pitch; @@ -3765,7 +3769,7 @@ static void pgraph_bind_textures(NV2AState *d) if (dimensionality >= 2) { unsigned int w = width, h = height; unsigned int level; - if (f.gl_format != 0) { + if (f.encoding == swizzled) { for (level = 0; level < levels; level++) { w = MAX(w, 1); h = MAX(h, 1); length += w * h * f.bytes_per_pixel; @@ -3833,8 +3837,8 @@ static void pgraph_bind_textures(NV2AState *d) glBindTexture(binding->gl_target, binding->gl_texture); - if (f.linear) { - /* somtimes games try to set mipmap min filters on linear textures. + if (f.encoding == linear) { + /* sometimes games try to set mipmap min filters on linear textures. * this could indicate a bug... */ switch (min_filter) { case NV_PGRAPH_TEXFILTER0_MIN_BOX_NEARESTLOD: @@ -4157,37 +4161,23 @@ static float convert_f24_to_float(uint32_t f24) { return *(float*)&i; } -static uint8_t cliptobyte(int x) -{ - return (uint8_t)((x < 0) ? 0 : ((x > 255) ? 255 : x)); -} +extern void __R6G5B5ToARGBRow_C(const uint8* src_r6g5b5, uint8* dst_argb, int width); +extern void ____YUY2ToARGBRow_C(const uint8* src_yuy2, uint8* rgb_buf, int width); +extern void ____UYVYToARGBRow_C(const uint8* src_uyvy, uint8* rgb_buf, int width); +extern void R5G5B5A1ToARGBRow_C(const uint8* src_r5g5b5a1, uint8* dst_argb, int width); +extern void R4G4B4A4ToARGBRow_C(const uint8* src_argb4444, uint8* dst_argb, int width); -static void convert_yuy2_to_rgb(const uint8_t *line, unsigned int ix, - uint8_t *r, uint8_t *g, uint8_t* b) { - int c, d, e; - c = (int)line[ix * 2] - 16; - if (ix % 2) { - d = (int)line[ix * 2 - 1] - 128; - e = (int)line[ix * 2 + 1] - 128; - } else { - d = (int)line[ix * 2 + 1] - 128; - e = (int)line[ix * 2 + 3] - 128; - } - *r = cliptobyte((298 * c + 409 * e + 128) >> 8); - *g = cliptobyte((298 * c - 100 * d - 208 * e + 128) >> 8); - *b = cliptobyte((298 * c + 516 * d + 128) >> 8); -} - -static uint8_t* convert_texture_data(const TextureShape s, +static uint8_t* convert_texture_data(const unsigned int color_format, const uint8_t *data, const uint8_t *palette_data, - unsigned int width, - unsigned int height, - unsigned int depth, - unsigned int row_pitch, - unsigned int slice_pitch) + const unsigned int width, + const unsigned int height, + const unsigned int depth, + const unsigned int row_pitch, + const unsigned int slice_pitch) { - switch (s.color_format) { + // Note : Unswizzle is already done when entering here + switch (color_format) { case NV097_SET_TEXTURE_FORMAT_COLOR_SZ_I8_A8R8G8B8: { assert(depth == 1); /* FIXME */ uint8_t* converted_data = (uint8_t*)g_malloc(width * height * 4); @@ -4201,42 +4191,72 @@ static uint8_t* convert_texture_data(const TextureShape s, } return converted_data; } - case NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_CR8YB8CB8YA8: - case NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_YB8CR8YA8CB8: - case NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8CR8CB8Y8: { + case NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X7SY9: { + assert(false); /* FIXME */ + return NULL; + } + case NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_CR8YB8CB8YA8: { assert(depth == 1); /* FIXME */ uint8_t* converted_data = (uint8_t*)g_malloc(width * height * 4); - unsigned int x, y; + unsigned int y; for (y = 0; y < height; y++) { - const uint8_t* line = &data[y * s.width * 2]; - for (x = 0; x < width; x++) { - uint8_t* pixel = &converted_data[(y * s.width + x) * 4]; - /* FIXME: Actually needs uyvy? */ - convert_yuy2_to_rgb(line, x, &pixel[0], &pixel[1], &pixel[2]); - pixel[3] = 255; - } + const uint8_t* line = &data[y * width * 2]; + uint8_t* pixel = &converted_data[(y * width) * 4]; + ____UYVYToARGBRow_C(line, pixel, width); + } + return converted_data; + } + case NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_YB8CR8YA8CB8: { + assert(depth == 1); /* FIXME */ + uint8_t* converted_data = (uint8_t*)g_malloc(width * height * 4); + unsigned int y; + for (y = 0; y < height; y++) { + const uint8_t* line = &data[y * width * 2]; + uint8_t* pixel = &converted_data[(y * width) * 4]; + ____YUY2ToARGBRow_C(line, pixel, width); } return converted_data; } - case NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R6G5B5: { + case NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8CR8CB8Y8: { + assert(false); /* FIXME */ + return NULL; + } + case NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R6G5B5: + case NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R6G5B5: { assert(depth == 1); /* FIXME */ - uint8_t *converted_data = (uint8_t*)g_malloc(width * height * 3); - unsigned int x, y; + uint8_t *converted_data = (uint8_t*)g_malloc(width * height * 4); + unsigned int y; for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - uint16_t rgb655 = *(uint16_t*)(data + y * row_pitch + x * 2); - int8_t *pixel = (int8_t*)&converted_data[(y * width + x) * 3]; - /* Maps 5 bit G and B signed value range to 8 bit - * signed values. R is probably unsigned. - */ - rgb655 ^= (1 << 9) | (1 << 4); - pixel[0] = ((rgb655 & 0xFC00) >> 10) * 0x7F / 0x3F; - pixel[1] = ((rgb655 & 0x03E0) >> 5) * 0xFF / 0x1F - 0x80; - pixel[2] = (rgb655 & 0x001F) * 0xFF / 0x1F - 0x80; - } + uint16_t rgb655 = *(uint16_t*)(data + y * row_pitch); + int8_t *pixel = (int8_t*)&converted_data[(y * width) * 4]; + __R6G5B5ToARGBRow_C((const uint8*)rgb655, (uint8*)pixel, width); } return converted_data; } + case NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R5G5B5A1: + case NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R5G5B5A1: { + assert(depth == 1); /* FIXME */ + uint8_t *converted_data = (uint8_t*)g_malloc(width * height * 4); + unsigned int y; + for (y = 0; y < height; y++) { + uint16_t r5g5b5a1 = *(uint16_t*)(data + y * row_pitch); + int8_t *pixel = (int8_t*)&converted_data[(y * width) * 4]; + R5G5B5A1ToARGBRow_C((uint8_t *)r5g5b5a1, (uint8_t *)pixel, width); + } + return converted_data; + } + case NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R4G4B4A4: + case NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R4G4B4A4: { + assert(depth == 1); /* FIXME */ + uint8_t *converted_data = (uint8_t*)g_malloc(width * height * 4); + unsigned int y; + for (y = 0; y < height; y++) { + uint16_t r4g4b4a4 = *(uint16_t*)(data + y * row_pitch); + int8_t *pixel = (int8_t*)&converted_data[(y * width) * 4]; + R4G4B4A4ToARGBRow_C((uint8_t *)r4g4b4a4, (uint8_t *)pixel, width); + } + return converted_data; + } default: return NULL; } @@ -4261,7 +4281,13 @@ static void upload_gl_texture(GLenum gl_target, glPixelStorei(GL_UNPACK_ROW_LENGTH, s.pitch / f.bytes_per_pixel); - uint8_t *converted = convert_texture_data(s, texture_data, + uint8_t *unswizzled = NULL; + if (f.encoding == swizzled) { // TODO : Verify this works correctly + unswizzled = (uint8_t*)g_malloc(s.height * s.pitch); + unswizzle_rect(texture_data, s.width, s.height, + unswizzled, s.pitch, f.bytes_per_pixel); + } + uint8_t *converted = convert_texture_data(s.color_format, unswizzled ? unswizzled : texture_data, palette_data, s.width, s.height, 1, s.pitch, 0); @@ -4269,11 +4295,14 @@ static void upload_gl_texture(GLenum gl_target, glTexImage2D(gl_target, 0, f.gl_internal_format, s.width, s.height, 0, f.gl_format, f.gl_type, - converted ? converted : texture_data); + converted ? converted : unswizzled ? unswizzled : texture_data); if (converted) { g_free(converted); } + if (unswizzled) { + g_free(unswizzled); + } glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); break; @@ -4290,7 +4319,7 @@ static void upload_gl_texture(GLenum gl_target, unsigned int level; for (level = 0; level < s.levels; level++) { - if (f.gl_format == 0) { /* compressed */ + if (f.encoding == compressed) { width = MAX(width, 4); height = MAX(height, 4); @@ -4312,11 +4341,14 @@ static void upload_gl_texture(GLenum gl_target, width = MAX(width, 1); height = MAX(height, 1); unsigned int pitch = width * f.bytes_per_pixel; - uint8_t *unswizzled = (uint8_t*)g_malloc(height * pitch); - unswizzle_rect(texture_data, width, height, - unswizzled, pitch, f.bytes_per_pixel); + uint8_t *unswizzled = NULL; + if (f.encoding == swizzled) { + unswizzled = (uint8_t*)g_malloc(height * pitch); + unswizzle_rect(texture_data, width, height, + unswizzled, pitch, f.bytes_per_pixel); + } - uint8_t *converted = convert_texture_data(s, unswizzled, + uint8_t *converted = convert_texture_data(s.color_format, unswizzled ? unswizzled : texture_data, palette_data, width, height, 1, pitch, 0); @@ -4324,12 +4356,14 @@ static void upload_gl_texture(GLenum gl_target, glTexImage2D(gl_target, level, f.gl_internal_format, width, height, 0, f.gl_format, f.gl_type, - converted ? converted : unswizzled); + converted ? converted : unswizzled ? unswizzled : texture_data); if (converted) { g_free(converted); } - g_free(unswizzled); + if (unswizzled) { + g_free(unswizzled); + } texture_data += width * height * f.bytes_per_pixel; } @@ -4344,19 +4378,18 @@ static void upload_gl_texture(GLenum gl_target, unsigned int width = s.width, height = s.height, depth = s.depth; - assert(f.gl_format != 0); /* FIXME: compressed not supported yet */ - assert(f.linear == false); - unsigned int level; for (level = 0; level < s.levels; level++) { unsigned int row_pitch = width * f.bytes_per_pixel; unsigned int slice_pitch = row_pitch * height; - uint8_t *unswizzled = (uint8_t*)g_malloc(slice_pitch * depth); - unswizzle_box(texture_data, width, height, depth, unswizzled, - row_pitch, slice_pitch, f.bytes_per_pixel); - - uint8_t *converted = convert_texture_data(s, unswizzled, + uint8_t *unswizzled = NULL; + if (f.encoding == swizzled) { + unswizzled = (uint8_t*)g_malloc(slice_pitch * depth); + unswizzle_box(texture_data, width, height, depth, unswizzled, + row_pitch, slice_pitch, f.bytes_per_pixel); + } + uint8_t *converted = convert_texture_data(s.color_format, unswizzled ? unswizzled : texture_data, palette_data, width, height, depth, row_pitch, slice_pitch); @@ -4364,12 +4397,14 @@ static void upload_gl_texture(GLenum gl_target, glTexImage3D(gl_target, level, f.gl_internal_format, width, height, depth, 0, f.gl_format, f.gl_type, - converted ? converted : unswizzled); + converted ? converted : unswizzled ? unswizzled : texture_data); if (converted) { g_free(converted); } - g_free(unswizzled); + if (unswizzled) { + g_free(unswizzled); + } texture_data += width * height * depth * f.bytes_per_pixel; @@ -4399,11 +4434,11 @@ static TextureBinding* generate_texture(const TextureShape s, GLenum gl_target; if (s.cubemap) { - assert(f.linear == false); + assert(f.encoding != linear); assert(s.dimensionality == 2); gl_target = GL_TEXTURE_CUBE_MAP; } else { - if (f.linear) { + if (f.encoding == linear) { /* FIXME : Include compressed too? (!= swizzled) */ /* linear textures use unnormalised texcoords. * GL_TEXTURE_RECTANGLE_ARB conveniently also does, but * does not allow repeat and mirror wrap modes. @@ -4430,7 +4465,7 @@ static TextureBinding* generate_texture(const TextureShape s, NV2A_GL_DLABEL(GL_TEXTURE, gl_texture, "format: 0x%02X%s, %d dimensions%s, width: %d, height: %d, depth: %d", - s.color_format, f.linear ? "" : " (SZ)", + s.color_format, {"", " (SZ)", " (DXT)"}[f.encoding], s.dimensionality, s.cubemap ? " (Cubemap)" : "", s.width, s.height, s.depth); @@ -4463,7 +4498,7 @@ static TextureBinding* generate_texture(const TextureShape s, } /* Linear textures don't support mipmapping */ - if (!f.linear) { + if (f.encoding != linear) { glTexParameteri(gl_target, GL_TEXTURE_BASE_LEVEL, s.min_mipmap_level); glTexParameteri(gl_target, GL_TEXTURE_MAX_LEVEL, From a3809ea8af4ce4c30aabf0878b13e8f7936a8220 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Mon, 25 Jun 2018 14:44:03 +0200 Subject: [PATCH 0003/1000] LLE : Fix NV097_CLEAR_SURFACE for NV097_SET_SURFACE_FORMAT_ZETA_Z16 not having a stencil component --- src/devices/video/EmuNV2A_PGRAPH.cpp | 42 ++++++++++++++++------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/src/devices/video/EmuNV2A_PGRAPH.cpp b/src/devices/video/EmuNV2A_PGRAPH.cpp index 09c4d76d3..e92972d9a 100644 --- a/src/devices/video/EmuNV2A_PGRAPH.cpp +++ b/src/devices/video/EmuNV2A_PGRAPH.cpp @@ -2363,24 +2363,32 @@ static void pgraph_handle_method(NV2AState *d, switch(pg->surface_shape.zeta_format) { case NV097_SET_SURFACE_FORMAT_ZETA_Z16: { - uint16_t z = clear_zstencil & 0xFFFF; - /* FIXME: Remove bit for stencil clear? */ - if (pg->surface_shape.z_format) { - gl_clear_depth = convert_f16_to_float(z) / f16_max; - assert(false); /* FIXME: Untested */ - } else { - gl_clear_depth = z / (float)0xFFFF; + if (parameter & NV097_CLEAR_SURFACE_Z) { + gl_mask |= GL_DEPTH_BUFFER_BIT; + uint16_t z = clear_zstencil & 0xFFFF; + if (pg->surface_shape.z_format) { + gl_clear_depth = convert_f16_to_float(z) / f16_max; + assert(false); /* FIXME: Untested */ + } else { + gl_clear_depth = z / (float)0xFFFF; + } } break; } case NV097_SET_SURFACE_FORMAT_ZETA_Z24S8: { - gl_clear_stencil = clear_zstencil & 0xFF; - uint32_t z = clear_zstencil >> 8; - if (pg->surface_shape.z_format) { - gl_clear_depth = convert_f24_to_float(z) / f24_max; - assert(false); /* FIXME: Untested */ - } else { - gl_clear_depth = z / (float)0xFFFFFF; + if (parameter & NV097_CLEAR_SURFACE_STENCIL) { + gl_mask |= GL_STENCIL_BUFFER_BIT; + gl_clear_stencil = clear_zstencil & 0xFF; + } + if (parameter & NV097_CLEAR_SURFACE_Z) { + gl_mask |= GL_DEPTH_BUFFER_BIT; + uint32_t z = clear_zstencil >> 8; + if (pg->surface_shape.z_format) { + gl_clear_depth = convert_f24_to_float(z) / f24_max; + assert(false); /* FIXME: Untested */ + } else { + gl_clear_depth = z / (float)0xFFFFFF; + } } break; } @@ -2389,13 +2397,11 @@ static void pgraph_handle_method(NV2AState *d, assert(false); break; } - if (parameter & NV097_CLEAR_SURFACE_Z) { - gl_mask |= GL_DEPTH_BUFFER_BIT; + if (gl_mask & GL_DEPTH_BUFFER_BIT) { glDepthMask(GL_TRUE); glClearDepth(gl_clear_depth); } - if (parameter & NV097_CLEAR_SURFACE_STENCIL) { - gl_mask |= GL_STENCIL_BUFFER_BIT; + if (gl_mask & GL_STENCIL_BUFFER_BIT) { glStencilMask(0xff); glClearStencil(gl_clear_stencil); } From 9f638cdffcd528a491a9ebb4b3d24955109d755e Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Wed, 27 Jun 2018 22:43:56 +0100 Subject: [PATCH 0004/1000] Fix an issue where Vertex Shaders containing exp instructions without a swizzle failed to compile --- src/CxbxKrnl/EmuD3D8/VertexShader.cpp | 50 +++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/src/CxbxKrnl/EmuD3D8/VertexShader.cpp b/src/CxbxKrnl/EmuD3D8/VertexShader.cpp index 5cf956acf..394858023 100644 --- a/src/CxbxKrnl/EmuD3D8/VertexShader.cpp +++ b/src/CxbxKrnl/EmuD3D8/VertexShader.cpp @@ -1433,6 +1433,44 @@ static boolean VshConvertShader(VSH_XBOX_SHADER *pShader, pIntermediate->ILU = ILU_RCP; } + if (pIntermediate->InstructionType == IMD_ILU && pIntermediate->ILU == ILU_EXP) + { + // EXP on DX8 requires that exactly one swizzle is specified on the output + + // Count how many swizzles are set + int swizzles = 0; + for (int i = 0; i < 4; i++) { + if (pIntermediate->Parameters[0].Parameter.Swizzle[i]) { + swizzles++; + } + } + + // If we had more than 1 swizzle, set the same swizzle on the ouput as the input + // Test case: THP2X + if (swizzles > 1) { + int swizzle = (pIntermediate->Output.Mask[0]) | (pIntermediate->Output.Mask[1] << 1) | (pIntermediate->Output.Mask[2] << 2) | (pIntermediate->Output.Mask[3] << 3); + switch (swizzle) + { + case 1: + VshSetSwizzle(&pIntermediate->Parameters[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X); + break; + case 2: + VshSetSwizzle(&pIntermediate->Parameters[0], SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y); + break; + case 4: + VshSetSwizzle(&pIntermediate->Parameters[0], SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z); + break; + case 8: + VshSetSwizzle(&pIntermediate->Parameters[0], SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W); + break; + case 15: + default: + LOG_TEST_CASE("exp instruction with invalid swizzle"); + break; + } + } + } + if(pIntermediate->Output.Type == IMD_OUTPUT_R) { RUsage[pIntermediate->Output.Address] = TRUE; @@ -2473,17 +2511,17 @@ extern HRESULT XTL::EmuRecompileVshFunction } char* pShaderDisassembly = (char*)malloc(pShader->IntermediateCount * 100); // Should be plenty - DbgVshPrintf("-- Before conversion --\n"); + DbgVshPrintf("-- Before conversion --\n"); VshWriteShader(pShader, pShaderDisassembly, FALSE); - DbgVshPrintf("%s", pShaderDisassembly); - DbgVshPrintf("-----------------------\n"); + DbgVshPrintf("%s", pShaderDisassembly); + DbgVshPrintf("-----------------------\n"); VshConvertShader(pShader, bNoReservedConstants, declaredRegisters); VshWriteShader(pShader, pShaderDisassembly, TRUE); - DbgVshPrintf("-- After conversion ---\n"); - DbgVshPrintf("%s", pShaderDisassembly); - DbgVshPrintf("-----------------------\n"); + DbgVshPrintf("-- After conversion ---\n"); + DbgVshPrintf("%s", pShaderDisassembly); + DbgVshPrintf("-----------------------\n"); // HACK: Azurik. Prevent Direct3D from trying to assemble this. if(!strcmp(pShaderDisassembly, "vs.1.1\n")) From f0917d80331ecf6c1662fc391298684c560d45be Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Tue, 10 Jul 2018 15:37:34 +0200 Subject: [PATCH 0005/1000] HLE : Speed up IsRdtscInstruction() by first checking for our RDTSC patch --- src/CxbxKrnl/CxbxKrnl.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index 0053cbc59..5e44c92d5 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -683,8 +683,13 @@ std::vector g_RdtscPatches; bool IsRdtscInstruction(xbaddr addr) { - if (std::find(g_RdtscPatches.begin(), g_RdtscPatches.end(), addr) != g_RdtscPatches.end()) { - return true; + // First the fastest check - is this a patch? (see PatchRdtsc) + uint8_t* opAddr = (uint8_t*)addr; + if ((opAddr[0] == 0xEF) // OUT DX, EAX + && (opAddr[1] == 0x90)) { // NOP + if (std::find(g_RdtscPatches.begin(), g_RdtscPatches.end(), addr) != g_RdtscPatches.end()) { + return true; + } } return false; From ffff3783c2d7514aa9c3068047d52e4dfcc8fec8 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Tue, 10 Jul 2018 15:42:28 +0200 Subject: [PATCH 0006/1000] HLE : Made EmuException() hot path as short as possible, and handle privileged instructions via EmuX86_EmuX86_DecodeException() too --- src/CxbxKrnl/Emu.cpp | 89 ++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 49 deletions(-) diff --git a/src/CxbxKrnl/Emu.cpp b/src/CxbxKrnl/Emu.cpp index 260c64d73..847c792fa 100644 --- a/src/CxbxKrnl/Emu.cpp +++ b/src/CxbxKrnl/Emu.cpp @@ -216,26 +216,15 @@ void EmuExceptionNonBreakpointUnhandledShow(LPEXCEPTION_POINTERS e) } } -// exception handler bool IsRdtscInstruction(xbaddr addr); -extern int EmuException(LPEXCEPTION_POINTERS e) +LONG NTAPI EmuException(EXCEPTION_POINTERS *e) { g_bEmuException = true; - if (e->ExceptionRecord->ExceptionCode == STATUS_BREAKPOINT) - { - // notify user - if (EmuExceptionBreakpointAsk(e)) - { - // We're allowed to continue : - g_bEmuException = false; - return EXCEPTION_CONTINUE_EXECUTION; - } - } - else - { - // Check if this exception came from rdtsc, but only whe g_PatchCpuFrequency hack is set. - if (e->ExceptionRecord->ExceptionCode == STATUS_PRIVILEGED_INSTRUCTION && !g_SkipRdtscPatching ) - { + switch (e->ExceptionRecord->ExceptionCode) { + case STATUS_PRIVILEGED_INSTRUCTION: + // When the g_SkipRdtscPatching hack is disabled + if (!g_SkipRdtscPatching) { + // Check if this exception came from rdtsc if (IsRdtscInstruction(e->ContextRecord->Eip)) { LARGE_INTEGER PerformanceCount; PerformanceCount.QuadPart = xboxkrnl::KeQueryPerformanceCounter(); @@ -246,45 +235,47 @@ extern int EmuException(LPEXCEPTION_POINTERS e) return EXCEPTION_CONTINUE_EXECUTION; } } - - // Skip past CxbxDebugger-specific exceptions thrown when an unsupported was attached (ie Visual Studio) - if (CxbxDebugger::IsDebuggerException(e->ExceptionRecord->ExceptionCode)) - { - g_bEmuException = false; - return EXCEPTION_CONTINUE_EXECUTION; - } - + // Don't break for other privileged instructions, but fall through to our exception decoder below : + case EXCEPTION_ACCESS_VIOLATION: // Pass the exception to our X86 implementation, to try and execute the failing instruction - if (EmuX86_DecodeException(e)) - { + if (EmuX86_DecodeException(e)) { // We're allowed to continue : g_bEmuException = false; return EXCEPTION_CONTINUE_EXECUTION; } - - // Try to Report this exception to the debugger, which may allow handling of this exception - if (CxbxDebugger::CanReport()) - { - bool DebuggerHandled = false; - CxbxDebugger::ReportAndHandleException(e->ExceptionRecord, DebuggerHandled); + break; + case STATUS_BREAKPOINT: + // notify user + if (EmuExceptionBreakpointAsk(e)) { + // We're allowed to continue : + g_bEmuException = false; + return EXCEPTION_CONTINUE_EXECUTION; + } + break; + } - if (DebuggerHandled) - { - // Bypass exception - g_bEmuException = false; - return EXCEPTION_CONTINUE_SEARCH; - } - else - { - // Kill the process immediately without the Cxbx notifier - EmuExceptionExitProcess(); - } - } - else - { - // notify user - EmuExceptionNonBreakpointUnhandledShow(e); + // Skip past CxbxDebugger-specific exceptions thrown when an unsupported was attached (ie Visual Studio) + if (CxbxDebugger::IsDebuggerException(e->ExceptionRecord->ExceptionCode)) { + g_bEmuException = false; + return EXCEPTION_CONTINUE_EXECUTION; + } + + // Try to Report this exception to the debugger, which may allow handling of this exception + if (CxbxDebugger::CanReport()) { + bool DebuggerHandled = false; + CxbxDebugger::ReportAndHandleException(e->ExceptionRecord, DebuggerHandled); + if (DebuggerHandled) { + // Bypass exception + g_bEmuException = false; + return EXCEPTION_CONTINUE_SEARCH; } + + // Kill the process immediately without the Cxbx notifier + EmuExceptionExitProcess(); + } + else { + // notify user + EmuExceptionNonBreakpointUnhandledShow(e); } // Unhandled exception : From cc6a1b6de5cfb5f997c010adbca1421a405e1264 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Tue, 10 Jul 2018 15:44:17 +0200 Subject: [PATCH 0007/1000] HLE : Use AddVectoredExceptionHandler instead of SEH (Structured Exception Handling) to get control over exception handling with the least amount of overhead (by making sure our handler is executed first). --- src/CxbxKrnl/CxbxKrnl.cpp | 4 ++++ src/CxbxKrnl/Emu.h | 2 +- src/CxbxKrnl/EmuKrnl.h | 4 ++++ src/CxbxKrnl/EmuKrnlKe.cpp | 8 ++++++++ src/CxbxKrnl/EmuKrnlPs.cpp | 8 ++++++++ src/CxbxKrnl/EmuX86.cpp | 3 +++ src/CxbxKrnl/EmuXapi.cpp | 6 +++++- 7 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index 5e44c92d5..265cc26f1 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -188,14 +188,18 @@ void SetupPerTitleKeys() void CxbxLaunchXbe(void(*Entry)()) { +#ifdef USE_SEH __try { +#endif // USE_SEH Entry(); +#ifdef USE_SEH } __except (EmuException(GetExceptionInformation())) { EmuWarning("Problem with ExceptionFilter"); } +#endif // USE_SEH } // Entry point address XOR keys per Xbe type (Retail, Debug or Chihiro) : diff --git a/src/CxbxKrnl/Emu.h b/src/CxbxKrnl/Emu.h index 994f27081..5ff944d3d 100644 --- a/src/CxbxKrnl/Emu.h +++ b/src/CxbxKrnl/Emu.h @@ -48,7 +48,7 @@ inline void NTAPI EmuWarning(const char *szWarningMessage, ...) { } #endif // exception handler -extern int EmuException(LPEXCEPTION_POINTERS e); +extern LONG NTAPI EmuException(EXCEPTION_POINTERS *e); // print call stack trace #ifdef _DEBUG diff --git a/src/CxbxKrnl/EmuKrnl.h b/src/CxbxKrnl/EmuKrnl.h index 2a32f9466..0c03fb115 100644 --- a/src/CxbxKrnl/EmuKrnl.h +++ b/src/CxbxKrnl/EmuKrnl.h @@ -97,14 +97,18 @@ public: m_Pending = false; } +#ifdef USE_SEH __try { +#endif // USE_SEH BOOLEAN(__stdcall *ServiceRoutine)(xboxkrnl::PKINTERRUPT, void*) = (BOOLEAN(__stdcall *)(xboxkrnl::PKINTERRUPT, void*))Interrupt->ServiceRoutine; BOOLEAN result = ServiceRoutine(Interrupt, Interrupt->ServiceContext); +#ifdef USE_SEH } __except (EmuException(GetExceptionInformation())) { EmuWarning("Problem with ExceptionFilter!"); } +#endif // USE_SEH } private: bool m_Asserted = false; diff --git a/src/CxbxKrnl/EmuKrnlKe.cpp b/src/CxbxKrnl/EmuKrnlKe.cpp index f5605043f..0511ff2a1 100644 --- a/src/CxbxKrnl/EmuKrnlKe.cpp +++ b/src/CxbxKrnl/EmuKrnlKe.cpp @@ -161,17 +161,21 @@ DWORD ExecuteDpcQueue() // Set DpcRoutineActive to support KeIsExecutingDpc: KeGetCurrentPrcb()->DpcRoutineActive = TRUE; // Experimental DbgPrintf("KRNL: Global DpcQueue, calling DPC at 0x%.8X\n", pkdpc->DeferredRoutine); +#ifdef USE_SEH __try { +#endif // USE_SEH // Call the Deferred Procedure : pkdpc->DeferredRoutine( pkdpc, pkdpc->DeferredContext, pkdpc->SystemArgument1, pkdpc->SystemArgument2); +#ifdef USE_SEH } __except (EmuException(GetExceptionInformation())) { EmuWarning("Problem with ExceptionFilter!"); } +#endif // USE_SEH KeGetCurrentPrcb()->DpcRoutineActive = FALSE; // Experimental } @@ -205,16 +209,20 @@ DWORD ExecuteDpcQueue() break; // while DbgPrintf("KRNL: Global TimerQueue, calling DPC at 0x%.8X\n", pkdpc->DeferredRoutine); +#ifdef USE_SEH __try { +#endif // USE_SEH pkdpc->DeferredRoutine( pkdpc, pkdpc->DeferredContext, pkdpc->SystemArgument1, pkdpc->SystemArgument2); +#ifdef USE_SEH } __except (EmuException(GetExceptionInformation())) { EmuWarning("Problem with ExceptionFilter!"); } +#endif // USE_SEH } } diff --git a/src/CxbxKrnl/EmuKrnlPs.cpp b/src/CxbxKrnl/EmuKrnlPs.cpp index 0a2114775..f8b49a3a7 100644 --- a/src/CxbxKrnl/EmuKrnlPs.cpp +++ b/src/CxbxKrnl/EmuKrnlPs.cpp @@ -167,8 +167,10 @@ static unsigned int WINAPI PCSTProxy } // use the special calling convention +#ifdef USE_SEH __try { +#endif // USE_SEH // Given the non-standard calling convention (requiring // the first argument in ebp+4) we need the below __asm. // @@ -186,11 +188,13 @@ static unsigned int WINAPI PCSTProxy jmp near esi } +#ifdef USE_SEH } __except (EmuException(GetExceptionInformation())) { EmuWarning("Problem with ExceptionFilter!"); } +#endif // USE_SEH callComplete: @@ -208,15 +212,19 @@ void PspSystemThreadStartup IN PVOID StartContext ) { +#ifdef USE_SEH __try { +#endif // USE_SEH (StartRoutine)(StartContext); +#ifdef USE_SEH } __except (EmuException(GetExceptionInformation())) // TODO : Call PspUnhandledExceptionInSystemThread(GetExceptionInformation()) { EmuWarning("Problem with ExceptionFilter!"); // TODO : Disable? } +#endif // USE_SEH xboxkrnl::PsTerminateSystemThread(STATUS_SUCCESS); } diff --git a/src/CxbxKrnl/EmuX86.cpp b/src/CxbxKrnl/EmuX86.cpp index 6f4605fb4..e8858215e 100644 --- a/src/CxbxKrnl/EmuX86.cpp +++ b/src/CxbxKrnl/EmuX86.cpp @@ -1136,5 +1136,8 @@ opcode_error: void EmuX86_Init() { DbgPrintf("X86 : Initializing distorm version %d\n", distorm_version()); +#ifndef USE_SEH // implies VEH + AddVectoredExceptionHandler(1, EmuException); +#endif // !USE_SEG EmuX86_InitContextRecordOffsetByRegisterType(); } diff --git a/src/CxbxKrnl/EmuXapi.cpp b/src/CxbxKrnl/EmuXapi.cpp index 7b4ec4439..18688280d 100644 --- a/src/CxbxKrnl/EmuXapi.cpp +++ b/src/CxbxKrnl/EmuXapi.cpp @@ -1389,16 +1389,20 @@ typedef struct { } fiber_context_t; void WINAPI EmuFiberStartup(fiber_context_t* context) -{ +{ +#ifdef USE_SEH __try { +#endif //USE_SEH LPFIBER_START_ROUTINE pfStartRoutine = (LPFIBER_START_ROUTINE)context->lpStartRoutine; pfStartRoutine(context->lpParameter); +#ifdef USE_SEH } __except (EmuException(GetExceptionInformation())) { EmuWarning("Problem with ExceptionFilter"); } +#endif //USE_SEH } // ****************************************************************** From f8c023d2e1b204fa616d78cda18230346b4b7171 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Tue, 10 Jul 2018 17:06:11 +0200 Subject: [PATCH 0008/1000] HLE : Simplify and re-order exception handling --- src/CxbxKrnl/Emu.cpp | 87 ++++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 44 deletions(-) diff --git a/src/CxbxKrnl/Emu.cpp b/src/CxbxKrnl/Emu.cpp index 847c792fa..4ffdd6b57 100644 --- a/src/CxbxKrnl/Emu.cpp +++ b/src/CxbxKrnl/Emu.cpp @@ -216,58 +216,50 @@ void EmuExceptionNonBreakpointUnhandledShow(LPEXCEPTION_POINTERS e) } } -bool IsRdtscInstruction(xbaddr addr); -LONG NTAPI EmuException(EXCEPTION_POINTERS *e) -{ - g_bEmuException = true; - switch (e->ExceptionRecord->ExceptionCode) { - case STATUS_PRIVILEGED_INSTRUCTION: - // When the g_SkipRdtscPatching hack is disabled - if (!g_SkipRdtscPatching) { - // Check if this exception came from rdtsc - if (IsRdtscInstruction(e->ContextRecord->Eip)) { - LARGE_INTEGER PerformanceCount; - PerformanceCount.QuadPart = xboxkrnl::KeQueryPerformanceCounter(); - e->ContextRecord->Eax = PerformanceCount.LowPart; - e->ContextRecord->Edx = PerformanceCount.HighPart; - e->ContextRecord->Eip += 2; - g_bEmuException = false; - return EXCEPTION_CONTINUE_EXECUTION; +bool IsRdtscInstruction(xbaddr addr); +bool TryHandleException(EXCEPTION_POINTERS *e) +{ + // Make sure access-violations reach EmuX86_DecodeException() as soon as possible + if (e->ExceptionRecord->ExceptionCode != EXCEPTION_ACCESS_VIOLATION) { + switch (e->ExceptionRecord->ExceptionCode) { + case STATUS_PRIVILEGED_INSTRUCTION: + // When the g_SkipRdtscPatching hack is disabled + if (!g_SkipRdtscPatching) { + // Check if this exception came from rdtsc + if (IsRdtscInstruction(e->ContextRecord->Eip)) { + LARGE_INTEGER PerformanceCount; + PerformanceCount.QuadPart = xboxkrnl::KeQueryPerformanceCounter(); + e->ContextRecord->Eax = PerformanceCount.LowPart; + e->ContextRecord->Edx = PerformanceCount.HighPart; + e->ContextRecord->Eip += 2; + return true; + } + } + break; + case STATUS_BREAKPOINT: + // Let user choose between continue or break + return EmuExceptionBreakpointAsk(e); + default: + // Skip past CxbxDebugger-specific exceptions thrown when an unsupported was attached (ie Visual Studio) + if (CxbxDebugger::IsDebuggerException(e->ExceptionRecord->ExceptionCode)) { + return true; } } - // Don't break for other privileged instructions, but fall through to our exception decoder below : - case EXCEPTION_ACCESS_VIOLATION: - // Pass the exception to our X86 implementation, to try and execute the failing instruction - if (EmuX86_DecodeException(e)) { - // We're allowed to continue : - g_bEmuException = false; - return EXCEPTION_CONTINUE_EXECUTION; - } - break; - case STATUS_BREAKPOINT: - // notify user - if (EmuExceptionBreakpointAsk(e)) { - // We're allowed to continue : - g_bEmuException = false; - return EXCEPTION_CONTINUE_EXECUTION; - } - break; } - - // Skip past CxbxDebugger-specific exceptions thrown when an unsupported was attached (ie Visual Studio) - if (CxbxDebugger::IsDebuggerException(e->ExceptionRecord->ExceptionCode)) { - g_bEmuException = false; - return EXCEPTION_CONTINUE_EXECUTION; + + // Pass the exception to our X86 implementation, to try and execute the failing instruction + if (EmuX86_DecodeException(e)) { + // We're allowed to continue : + return true; } - + // Try to Report this exception to the debugger, which may allow handling of this exception if (CxbxDebugger::CanReport()) { bool DebuggerHandled = false; CxbxDebugger::ReportAndHandleException(e->ExceptionRecord, DebuggerHandled); if (DebuggerHandled) { // Bypass exception - g_bEmuException = false; - return EXCEPTION_CONTINUE_SEARCH; + return false; } // Kill the process immediately without the Cxbx notifier @@ -279,9 +271,16 @@ LONG NTAPI EmuException(EXCEPTION_POINTERS *e) } // Unhandled exception : - g_bEmuException = false; - return EXCEPTION_CONTINUE_SEARCH; + return false; } + +LONG NTAPI EmuException(EXCEPTION_POINTERS *e) +{ + g_bEmuException = true; + LONG result = TryHandleException(e) ? EXCEPTION_CONTINUE_EXECUTION : EXCEPTION_CONTINUE_SEARCH; + g_bEmuException = false; + return result; +} // exception handle for that tough final exit :) int ExitException(LPEXCEPTION_POINTERS e) From a9d1f60b04ad160fdeb198651e2bcf2987153e0c Mon Sep 17 00:00:00 2001 From: patrickvl Date: Wed, 11 Jul 2018 17:34:00 +0200 Subject: [PATCH 0009/1000] HLE : Move IsXboxCodeAddress check into it's own function, and call it first in IsXboxCodeAddress (instead of later, in EmuX86_DecodeException). Also, optimize IsRdtscInstruction() and it's emulation, by calling directly into CxbxRdTsc(). Additionally, use unsigned ULARGE_INTEGER and ULONGLONG variables. --- src/CxbxKrnl/CxbxKrnl.cpp | 15 +++++++------- src/CxbxKrnl/Emu.cpp | 40 ++++++++++++++++++++++++++------------ src/CxbxKrnl/EmuKrnlKe.cpp | 14 ++++++------- src/CxbxKrnl/EmuX86.cpp | 7 +------ 4 files changed, 43 insertions(+), 33 deletions(-) diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index 265cc26f1..5c2dad0a2 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -689,14 +689,13 @@ bool IsRdtscInstruction(xbaddr addr) { // First the fastest check - is this a patch? (see PatchRdtsc) uint8_t* opAddr = (uint8_t*)addr; - if ((opAddr[0] == 0xEF) // OUT DX, EAX - && (opAddr[1] == 0x90)) { // NOP - if (std::find(g_RdtscPatches.begin(), g_RdtscPatches.end(), addr) != g_RdtscPatches.end()) { - return true; - } - } - - return false; + // Note : Check second opcode first, as that's most likely to fail fast + return (opAddr[1] == 0x90) // NOP + && (opAddr[0] == 0xEF) // OUT DX, EAX + // Note : It's not needed to check for g_SkipRdtscPatching, + // as when that's set, the g_RdtscPatches vector will be empty + // anyway, failing this lookup : + && (std::find(g_RdtscPatches.begin(), g_RdtscPatches.end(), addr) != g_RdtscPatches.end()); } void PatchRdtsc(xbaddr addr) diff --git a/src/CxbxKrnl/Emu.cpp b/src/CxbxKrnl/Emu.cpp index 4ffdd6b57..0d64097bd 100644 --- a/src/CxbxKrnl/Emu.cpp +++ b/src/CxbxKrnl/Emu.cpp @@ -216,25 +216,41 @@ void EmuExceptionNonBreakpointUnhandledShow(LPEXCEPTION_POINTERS e) } } +// Returns weither the given address is part of an Xbox managed memory region +bool IsXboxCodeAddress(xbaddr addr) +{ + // TODO : Replace the following with a (fast) check weither + // the given address lies in xbox allocated virtual memory, + // for example by g_VMManager.CheckConflictingVMA(addr, 0). + return (addr >= XBE_IMAGE_BASE) && (addr <= XBE_MAX_VA); + // Note : Not IS_USER_ADDRESS(), that would include host DLL code +} + bool IsRdtscInstruction(xbaddr addr); +ULONGLONG CxbxRdTsc(bool xbox); bool TryHandleException(EXCEPTION_POINTERS *e) { + // Only handle exceptions which originate from Xbox code + if (!IsXboxCodeAddress(e->ContextRecord->Eip)) { + return false; + } + // Make sure access-violations reach EmuX86_DecodeException() as soon as possible if (e->ExceptionRecord->ExceptionCode != EXCEPTION_ACCESS_VIOLATION) { switch (e->ExceptionRecord->ExceptionCode) { case STATUS_PRIVILEGED_INSTRUCTION: - // When the g_SkipRdtscPatching hack is disabled - if (!g_SkipRdtscPatching) { - // Check if this exception came from rdtsc - if (IsRdtscInstruction(e->ContextRecord->Eip)) { - LARGE_INTEGER PerformanceCount; - PerformanceCount.QuadPart = xboxkrnl::KeQueryPerformanceCounter(); - e->ContextRecord->Eax = PerformanceCount.LowPart; - e->ContextRecord->Edx = PerformanceCount.HighPart; - e->ContextRecord->Eip += 2; - return true; - } - } + // Check if this exception came from rdtsc + if (IsRdtscInstruction(e->ContextRecord->Eip)) { + // If so, use a return value that updates with Xbox frequency; + // Avoid the overhead of xboxkrnl::KeQueryPerformanceCounter, + // by calling directly into it's backing implementation: + ULARGE_INTEGER PerformanceCount; + PerformanceCount.QuadPart = CxbxRdTsc(/*xbox=*/true); + e->ContextRecord->Eax = PerformanceCount.LowPart; + e->ContextRecord->Edx = PerformanceCount.HighPart; + e->ContextRecord->Eip += 2; + return true; + } break; case STATUS_BREAKPOINT: // Let user choose between continue or break diff --git a/src/CxbxKrnl/EmuKrnlKe.cpp b/src/CxbxKrnl/EmuKrnlKe.cpp index 0511ff2a1..ab4355cbb 100644 --- a/src/CxbxKrnl/EmuKrnlKe.cpp +++ b/src/CxbxKrnl/EmuKrnlKe.cpp @@ -248,21 +248,21 @@ void InitDpcAndTimerThread() // Xbox Performance Counter Frequency = 733333333 (CPU Clock) #define XBOX_PERFORMANCE_FREQUENCY 733333333 -uint64_t NativeToXbox_FactorForPerformanceFrequency; +ULONGLONG NativeToXbox_FactorForPerformanceFrequency; void ConnectKeInterruptTimeToThunkTable(); // forward -uint64_t CxbxRdTsc(bool xbox) { +ULONGLONG CxbxRdTsc(bool xbox) { LARGE_INTEGER tsc; QueryPerformanceCounter(&tsc); if (xbox && NativeToXbox_FactorForPerformanceFrequency) { - LARGE_INTEGER scaledTsc; + ULARGE_INTEGER scaledTsc; scaledTsc.QuadPart = 1000000000; - scaledTsc.QuadPart *= tsc.QuadPart; + scaledTsc.QuadPart *= (ULONGLONG)tsc.QuadPart; scaledTsc.QuadPart /= NativeToXbox_FactorForPerformanceFrequency; - return (uint64_t)scaledTsc.QuadPart; + return scaledTsc.QuadPart; } return (uint64_t)tsc.QuadPart; @@ -1127,8 +1127,8 @@ XBSYSAPI EXPORTNUM(126) xboxkrnl::ULONGLONG NTAPI xboxkrnl::KeQueryPerformanceCo ULONGLONG ret; //no matter rdtsc is patched or not, we should always return a scaled performance counter here. - DbgPrintf("host tick count : %lu\n", CxbxRdTsc(false)); - ret = CxbxRdTsc(true); + DbgPrintf("host tick count : %lu\n", CxbxRdTsc(/*xbox=*/false)); + ret = CxbxRdTsc(/*xbox=*/true); DbgPrintf("emulated tick count : %lu\n", ret); RETURN(ret); diff --git a/src/CxbxKrnl/EmuX86.cpp b/src/CxbxKrnl/EmuX86.cpp index e8858215e..620588b02 100644 --- a/src/CxbxKrnl/EmuX86.cpp +++ b/src/CxbxKrnl/EmuX86.cpp @@ -1043,11 +1043,6 @@ int EmuX86_OpcodeSize(uint8_t *Eip) bool EmuX86_DecodeException(LPEXCEPTION_POINTERS e) { - // Only decode instructions which reside in the loaded Xbe - if (e->ContextRecord->Eip > XBE_MAX_VA || e->ContextRecord->Eip < XBE_IMAGE_BASE) { - return false; - } - // Decoded instruction information. // Opcode handler note : // If an opcode or one of it's operand can't be decoded, that's a clear failure. @@ -1137,7 +1132,7 @@ void EmuX86_Init() { DbgPrintf("X86 : Initializing distorm version %d\n", distorm_version()); #ifndef USE_SEH // implies VEH - AddVectoredExceptionHandler(1, EmuException); + AddVectoredExceptionHandler(/*FirstHandler=*/ULONG(true), EmuException); #endif // !USE_SEG EmuX86_InitContextRecordOffsetByRegisterType(); } From 97cf31961b7fb258de41eeb4801ba284c2c1ff7d Mon Sep 17 00:00:00 2001 From: RadWolfie Date: Thu, 12 Jul 2018 10:26:25 -0500 Subject: [PATCH 0010/1000] Restore Cxbx's emu exception (SEH) while keep lle exception handler (VEH) --- src/CxbxKrnl/CxbxKrnl.cpp | 4 -- src/CxbxKrnl/Emu.cpp | 76 +++++++++++++++++++++++++++++++++----- src/CxbxKrnl/Emu.h | 3 +- src/CxbxKrnl/EmuKrnlKe.cpp | 9 +---- src/CxbxKrnl/EmuKrnlPs.cpp | 9 ----- src/CxbxKrnl/EmuX86.cpp | 6 +-- src/CxbxKrnl/EmuXapi.cpp | 4 -- 7 files changed, 73 insertions(+), 38 deletions(-) diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index 5c2dad0a2..2b6557735 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -188,18 +188,14 @@ void SetupPerTitleKeys() void CxbxLaunchXbe(void(*Entry)()) { -#ifdef USE_SEH __try { -#endif // USE_SEH Entry(); -#ifdef USE_SEH } __except (EmuException(GetExceptionInformation())) { EmuWarning("Problem with ExceptionFilter"); } -#endif // USE_SEH } // Entry point address XOR keys per Xbe type (Retail, Debug or Chihiro) : diff --git a/src/CxbxKrnl/Emu.cpp b/src/CxbxKrnl/Emu.cpp index 0d64097bd..99d90804d 100644 --- a/src/CxbxKrnl/Emu.cpp +++ b/src/CxbxKrnl/Emu.cpp @@ -196,7 +196,7 @@ bool EmuExceptionBreakpointAsk(LPEXCEPTION_POINTERS e) } return false; -} +} void EmuExceptionNonBreakpointUnhandledShow(LPEXCEPTION_POINTERS e) { @@ -224,12 +224,17 @@ bool IsXboxCodeAddress(xbaddr addr) // for example by g_VMManager.CheckConflictingVMA(addr, 0). return (addr >= XBE_IMAGE_BASE) && (addr <= XBE_MAX_VA); // Note : Not IS_USER_ADDRESS(), that would include host DLL code -} +} + +static thread_local bool bOverrideException; bool IsRdtscInstruction(xbaddr addr); ULONGLONG CxbxRdTsc(bool xbox); -bool TryHandleException(EXCEPTION_POINTERS *e) +bool lleTryHandleException(EXCEPTION_POINTERS *e) { + // Initalize local thread variable + bOverrideException = false; + // Only handle exceptions which originate from Xbox code if (!IsXboxCodeAddress(e->ContextRecord->Eip)) { return false; @@ -253,8 +258,8 @@ bool TryHandleException(EXCEPTION_POINTERS *e) } break; case STATUS_BREAKPOINT: - // Let user choose between continue or break - return EmuExceptionBreakpointAsk(e); + // Pass breakpoint down to EmuException since VEH doesn't have call stack viewable. + return false; default: // Skip past CxbxDebugger-specific exceptions thrown when an unsupported was attached (ie Visual Studio) if (CxbxDebugger::IsDebuggerException(e->ExceptionRecord->ExceptionCode)) { @@ -267,9 +272,62 @@ bool TryHandleException(EXCEPTION_POINTERS *e) if (EmuX86_DecodeException(e)) { // We're allowed to continue : return true; - } + } - // Try to Report this exception to the debugger, which may allow handling of this exception + // Try to report this exception to the debugger, which may allow handling of this exception + if (CxbxDebugger::CanReport()) { + bool DebuggerHandled = false; + CxbxDebugger::ReportAndHandleException(e->ExceptionRecord, DebuggerHandled); + if (!DebuggerHandled) { + // Kill the process immediately without the Cxbx notifier + EmuExceptionExitProcess(); + } + + // Bypass exception + } + else { + // notify user + EmuExceptionNonBreakpointUnhandledShow(e); + } + + // Unhandled exception : + bOverrideException = true; + return false; +} + +// Only for LLE emulation coding (to help performance a little bit better) +LONG NTAPI lleException(EXCEPTION_POINTERS *e) +{ + g_bEmuException = true; + LONG result = lleTryHandleException(e) ? EXCEPTION_CONTINUE_EXECUTION : EXCEPTION_CONTINUE_SEARCH; + g_bEmuException = false; + return result; +} + +// Only for Cxbx emulation coding (to catch all of last resort exception may occur.) +bool EmuTryHandleException(EXCEPTION_POINTERS *e) +{ + + // Check if lle exception is already called here first before emu exception. + if (bOverrideException) { + return false; + } + + // Make sure access-violations reach EmuX86_DecodeException() as soon as possible + if (e->ExceptionRecord->ExceptionCode != EXCEPTION_ACCESS_VIOLATION) { + switch (e->ExceptionRecord->ExceptionCode) { + case STATUS_BREAKPOINT: + // Let user choose between continue or break + return EmuExceptionBreakpointAsk(e); + default: + // Skip past CxbxDebugger-specific exceptions thrown when an unsupported was attached (ie Visual Studio) + if (CxbxDebugger::IsDebuggerException(e->ExceptionRecord->ExceptionCode)) { + return true; + } + } + } + + // Try to report this exception to the debugger, which may allow handling of this exception if (CxbxDebugger::CanReport()) { bool DebuggerHandled = false; CxbxDebugger::ReportAndHandleException(e->ExceptionRecord, DebuggerHandled); @@ -290,10 +348,10 @@ bool TryHandleException(EXCEPTION_POINTERS *e) return false; } -LONG NTAPI EmuException(EXCEPTION_POINTERS *e) +int EmuException(EXCEPTION_POINTERS *e) { g_bEmuException = true; - LONG result = TryHandleException(e) ? EXCEPTION_CONTINUE_EXECUTION : EXCEPTION_CONTINUE_SEARCH; + LONG result = EmuTryHandleException(e) ? EXCEPTION_CONTINUE_EXECUTION : EXCEPTION_CONTINUE_SEARCH; g_bEmuException = false; return result; } diff --git a/src/CxbxKrnl/Emu.h b/src/CxbxKrnl/Emu.h index 5ff944d3d..798fedff6 100644 --- a/src/CxbxKrnl/Emu.h +++ b/src/CxbxKrnl/Emu.h @@ -48,7 +48,8 @@ inline void NTAPI EmuWarning(const char *szWarningMessage, ...) { } #endif // exception handler -extern LONG NTAPI EmuException(EXCEPTION_POINTERS *e); +extern LONG NTAPI lleException(EXCEPTION_POINTERS *e); +int EmuException(EXCEPTION_POINTERS *e); // print call stack trace #ifdef _DEBUG diff --git a/src/CxbxKrnl/EmuKrnlKe.cpp b/src/CxbxKrnl/EmuKrnlKe.cpp index ab4355cbb..effedde1a 100644 --- a/src/CxbxKrnl/EmuKrnlKe.cpp +++ b/src/CxbxKrnl/EmuKrnlKe.cpp @@ -161,21 +161,17 @@ DWORD ExecuteDpcQueue() // Set DpcRoutineActive to support KeIsExecutingDpc: KeGetCurrentPrcb()->DpcRoutineActive = TRUE; // Experimental DbgPrintf("KRNL: Global DpcQueue, calling DPC at 0x%.8X\n", pkdpc->DeferredRoutine); -#ifdef USE_SEH __try { -#endif // USE_SEH // Call the Deferred Procedure : pkdpc->DeferredRoutine( pkdpc, pkdpc->DeferredContext, pkdpc->SystemArgument1, pkdpc->SystemArgument2); -#ifdef USE_SEH } __except (EmuException(GetExceptionInformation())) { EmuWarning("Problem with ExceptionFilter!"); } -#endif // USE_SEH KeGetCurrentPrcb()->DpcRoutineActive = FALSE; // Experimental } @@ -209,20 +205,17 @@ DWORD ExecuteDpcQueue() break; // while DbgPrintf("KRNL: Global TimerQueue, calling DPC at 0x%.8X\n", pkdpc->DeferredRoutine); -#ifdef USE_SEH + __try { -#endif // USE_SEH pkdpc->DeferredRoutine( pkdpc, pkdpc->DeferredContext, pkdpc->SystemArgument1, pkdpc->SystemArgument2); -#ifdef USE_SEH } __except (EmuException(GetExceptionInformation())) { EmuWarning("Problem with ExceptionFilter!"); } -#endif // USE_SEH } } diff --git a/src/CxbxKrnl/EmuKrnlPs.cpp b/src/CxbxKrnl/EmuKrnlPs.cpp index f8b49a3a7..5605f1b30 100644 --- a/src/CxbxKrnl/EmuKrnlPs.cpp +++ b/src/CxbxKrnl/EmuKrnlPs.cpp @@ -167,10 +167,8 @@ static unsigned int WINAPI PCSTProxy } // use the special calling convention -#ifdef USE_SEH __try { -#endif // USE_SEH // Given the non-standard calling convention (requiring // the first argument in ebp+4) we need the below __asm. // @@ -187,14 +185,11 @@ static unsigned int WINAPI PCSTProxy lea ebp, [esp - 4] jmp near esi } - -#ifdef USE_SEH } __except (EmuException(GetExceptionInformation())) { EmuWarning("Problem with ExceptionFilter!"); } -#endif // USE_SEH callComplete: @@ -212,19 +207,15 @@ void PspSystemThreadStartup IN PVOID StartContext ) { -#ifdef USE_SEH __try { -#endif // USE_SEH (StartRoutine)(StartContext); -#ifdef USE_SEH } __except (EmuException(GetExceptionInformation())) // TODO : Call PspUnhandledExceptionInSystemThread(GetExceptionInformation()) { EmuWarning("Problem with ExceptionFilter!"); // TODO : Disable? } -#endif // USE_SEH xboxkrnl::PsTerminateSystemThread(STATUS_SUCCESS); } diff --git a/src/CxbxKrnl/EmuX86.cpp b/src/CxbxKrnl/EmuX86.cpp index 620588b02..8acc23acc 100644 --- a/src/CxbxKrnl/EmuX86.cpp +++ b/src/CxbxKrnl/EmuX86.cpp @@ -1131,8 +1131,8 @@ opcode_error: void EmuX86_Init() { DbgPrintf("X86 : Initializing distorm version %d\n", distorm_version()); -#ifndef USE_SEH // implies VEH - AddVectoredExceptionHandler(/*FirstHandler=*/ULONG(true), EmuException); -#endif // !USE_SEG + + AddVectoredExceptionHandler(/*FirstHandler=*/ULONG(true), lleException); + EmuX86_InitContextRecordOffsetByRegisterType(); } diff --git a/src/CxbxKrnl/EmuXapi.cpp b/src/CxbxKrnl/EmuXapi.cpp index 18688280d..bfcf147e7 100644 --- a/src/CxbxKrnl/EmuXapi.cpp +++ b/src/CxbxKrnl/EmuXapi.cpp @@ -1390,19 +1390,15 @@ typedef struct { void WINAPI EmuFiberStartup(fiber_context_t* context) { -#ifdef USE_SEH __try { -#endif //USE_SEH LPFIBER_START_ROUTINE pfStartRoutine = (LPFIBER_START_ROUTINE)context->lpStartRoutine; pfStartRoutine(context->lpParameter); -#ifdef USE_SEH } __except (EmuException(GetExceptionInformation())) { EmuWarning("Problem with ExceptionFilter"); } -#endif //USE_SEH } // ****************************************************************** From 41119ad6a2216147faf614553d7189e9bc4c848b Mon Sep 17 00:00:00 2001 From: RadWolfie Date: Thu, 12 Jul 2018 11:06:54 -0500 Subject: [PATCH 0011/1000] Move duplicate generic exception method into one function --- src/CxbxKrnl/Emu.cpp | 51 +++++++++++++++++--------------------------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/src/CxbxKrnl/Emu.cpp b/src/CxbxKrnl/Emu.cpp index 99d90804d..15351f772 100644 --- a/src/CxbxKrnl/Emu.cpp +++ b/src/CxbxKrnl/Emu.cpp @@ -224,6 +224,24 @@ bool IsXboxCodeAddress(xbaddr addr) // for example by g_VMManager.CheckConflictingVMA(addr, 0). return (addr >= XBE_IMAGE_BASE) && (addr <= XBE_MAX_VA); // Note : Not IS_USER_ADDRESS(), that would include host DLL code +} + +void genericException(EXCEPTION_POINTERS *e) { + // Try to report this exception to the debugger, which may allow handling of this exception + if (CxbxDebugger::CanReport()) { + bool DebuggerHandled = false; + CxbxDebugger::ReportAndHandleException(e->ExceptionRecord, DebuggerHandled); + if (!DebuggerHandled) { + // Kill the process immediately without the Cxbx notifier + EmuExceptionExitProcess(); + } + + // Bypass exception + } + else { + // notify user + EmuExceptionNonBreakpointUnhandledShow(e); + } } static thread_local bool bOverrideException; @@ -274,21 +292,7 @@ bool lleTryHandleException(EXCEPTION_POINTERS *e) return true; } - // Try to report this exception to the debugger, which may allow handling of this exception - if (CxbxDebugger::CanReport()) { - bool DebuggerHandled = false; - CxbxDebugger::ReportAndHandleException(e->ExceptionRecord, DebuggerHandled); - if (!DebuggerHandled) { - // Kill the process immediately without the Cxbx notifier - EmuExceptionExitProcess(); - } - - // Bypass exception - } - else { - // notify user - EmuExceptionNonBreakpointUnhandledShow(e); - } + genericException(e); // Unhandled exception : bOverrideException = true; @@ -327,22 +331,7 @@ bool EmuTryHandleException(EXCEPTION_POINTERS *e) } } - // Try to report this exception to the debugger, which may allow handling of this exception - if (CxbxDebugger::CanReport()) { - bool DebuggerHandled = false; - CxbxDebugger::ReportAndHandleException(e->ExceptionRecord, DebuggerHandled); - if (DebuggerHandled) { - // Bypass exception - return false; - } - - // Kill the process immediately without the Cxbx notifier - EmuExceptionExitProcess(); - } - else { - // notify user - EmuExceptionNonBreakpointUnhandledShow(e); - } + genericException(e); // Unhandled exception : return false; From 1fc6b87aa3603106d03d06fdf5bd2f67aff93b18 Mon Sep 17 00:00:00 2001 From: RadWolfie Date: Thu, 12 Jul 2018 11:19:35 -0500 Subject: [PATCH 0012/1000] Misc update * Fixed old comment * Added comment for reason override later exception --- src/CxbxKrnl/Emu.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/CxbxKrnl/Emu.cpp b/src/CxbxKrnl/Emu.cpp index 15351f772..44c388291 100644 --- a/src/CxbxKrnl/Emu.cpp +++ b/src/CxbxKrnl/Emu.cpp @@ -292,10 +292,12 @@ bool lleTryHandleException(EXCEPTION_POINTERS *e) return true; } - genericException(e); - - // Unhandled exception : + genericException(e); + + // We do not need EmuException to handle it again. bOverrideException = true; + + // Unhandled exception : return false; } @@ -312,7 +314,7 @@ LONG NTAPI lleException(EXCEPTION_POINTERS *e) bool EmuTryHandleException(EXCEPTION_POINTERS *e) { - // Check if lle exception is already called here first before emu exception. + // Check if lle exception is already called first before emu exception. if (bOverrideException) { return false; } From 2000346cf7652c472c922d12670a29ed5abf0d7e Mon Sep 17 00:00:00 2001 From: RadWolfie Date: Thu, 12 Jul 2018 21:12:03 -0500 Subject: [PATCH 0013/1000] Remove duplicate comment which is not used here. --- src/CxbxKrnl/Emu.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/CxbxKrnl/Emu.cpp b/src/CxbxKrnl/Emu.cpp index 44c388291..8a6d0983f 100644 --- a/src/CxbxKrnl/Emu.cpp +++ b/src/CxbxKrnl/Emu.cpp @@ -319,7 +319,6 @@ bool EmuTryHandleException(EXCEPTION_POINTERS *e) return false; } - // Make sure access-violations reach EmuX86_DecodeException() as soon as possible if (e->ExceptionRecord->ExceptionCode != EXCEPTION_ACCESS_VIOLATION) { switch (e->ExceptionRecord->ExceptionCode) { case STATUS_BREAKPOINT: From 2b8ba74a0d0feb77816809bdefafbc37eb50b448 Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Fri, 13 Jul 2018 08:52:58 +0100 Subject: [PATCH 0014/1000] Update README.md --- README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/README.md b/README.md index a406e3485..a5cb193cd 100644 --- a/README.md +++ b/README.md @@ -17,18 +17,10 @@ Cxbx-Reloaded is an emulator for running Microsoft Xbox (and eventually, Chihiro ## Automated Builds Cxbx-Reloaded is not yet ready for general release, but the latest development builds can be downloaded using the links below: - - - -### Upcoming Release (Alpha Status) -Grab these builds if you wish to preview/alpha test an upcoming release -* [Latest v0.1 Alpha Build (Release)](https://ci.appveyor.com/api/projects/SoullessSentinel/cxbx-reloaded/artifacts/export/Release.zip?branch=v0.1&job=Configuration:%20Release&pr=false) -* [Latest v0.1 Alpha Build (Debug)](https://ci.appveyor.com/api/projects/SoullessSentinel/cxbx-reloaded/artifacts/export/Debug.zip?branch=v0.1&job=Configuration:%20Debug&pr=false) ### Development Builds Grab these builds if you want to test the latest and greatest features. These builds are likely to be more unstable than release builds, and are not recommended for just playing games. From 46a03cb4420c4d4594484ec20a6c745a4fdeacef Mon Sep 17 00:00:00 2001 From: ergo720 Date: Wed, 2 May 2018 12:41:05 +0200 Subject: [PATCH 0015/1000] Created USB devices --- build/win32/Cxbx.vcxproj | 2 + build/win32/Cxbx.vcxproj.filters | 7 ++- src/CxbxKrnl/CxbxKrnl.h | 21 --------- src/devices/EmuNVNet.cpp | 6 +-- src/devices/EmuNVNet.h | 4 +- src/devices/MCPXDevice.cpp | 2 +- src/devices/MCPXDevice.h | 2 +- src/devices/PCIBus.cpp | 4 +- src/devices/PCIBus.h | 2 +- src/devices/PCIDevice.h | 24 +++++++++- src/devices/SMBus.cpp | 4 +- src/devices/SMBus.h | 2 +- src/devices/USBController/USBDevice.cpp | 52 +++++++++++++++++++++ src/devices/USBController/USBDevice.h | 60 +++++++++++++++++++++++++ src/devices/Xbox.cpp | 13 ++++-- src/devices/Xbox.h | 3 ++ src/devices/video/nv2a.cpp | 4 +- src/devices/video/nv2a.h | 7 +-- 18 files changed, 172 insertions(+), 47 deletions(-) create mode 100644 src/devices/USBController/USBDevice.cpp create mode 100644 src/devices/USBController/USBDevice.h diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index 322a89925..f4f72cdf9 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -361,6 +361,7 @@ + @@ -729,6 +730,7 @@ + diff --git a/build/win32/Cxbx.vcxproj.filters b/build/win32/Cxbx.vcxproj.filters index 7c335b606..bce4f2b5a 100644 --- a/build/win32/Cxbx.vcxproj.filters +++ b/build/win32/Cxbx.vcxproj.filters @@ -281,6 +281,9 @@ Emulator + + Hardware + GUI @@ -565,7 +568,9 @@ Emulator - + + Hardware + GUI diff --git a/src/CxbxKrnl/CxbxKrnl.h b/src/CxbxKrnl/CxbxKrnl.h index 1b7604026..9bf123098 100644 --- a/src/CxbxKrnl/CxbxKrnl.h +++ b/src/CxbxKrnl/CxbxKrnl.h @@ -104,27 +104,6 @@ extern "C" { #define CONTIGUOUS_MEMORY_CHIHIRO_SIZE (128 * ONE_MB) #define XBOX_PFN_ADDRESS ((XBOX_PFN_DATABASE_PHYSICAL_PAGE << PAGE_SHIFT) + (PCHAR)KSEG0_BASE) #define CHIHIRO_PFN_ADDRESS ((CHIHIRO_PFN_DATABASE_PHYSICAL_PAGE << PAGE_SHIFT) + (PCHAR)KSEG0_BASE) -#define NV2A_MEMORY_BASE 0xFD000000 // See NV2A_ADDR -#define NV2A_MEMORY_SIZE 0x01000000 // See NV2A_SIZE -#define NV2A_PRAMIN_ADDR 0xFD700000 -#define NV2A_PRAMIN_SIZE 0x100000 -#define NV2A_USER_ADDR 0xFD800000 -#define NV2A_USER_SIZE 0x800000 -#define APU_BASE 0xFE800000 -#define APU_SIZE 0x80000 -#define AC97_BASE 0xFEC00000 -#define AC97_SIZE 0x1000 -#define USB0_BASE 0xFED00000 -#define USB0_SIZE 0x1000 -#define USB1_BASE 0xFED08000 -#define USB1_SIZE 0x1000 -#define NVNet_BASE 0xFEF00000 -#define NVNet_SIZE 0x400 -#define BIOS_BASE 0xFF000000 // this takes into account that the bios covers the top 16 MiB of memory -#define BIOS_XBOX_SIZE 0xFFFE00 -#define BIOS_CHIHIRO_SIZE 0x1000000 -#define MCPX_BASE 0xFFFFFE00 -#define MCPX_SIZE 0x200 #define MAX_VIRTUAL_ADDRESS 0xFFFFFFFF /*! base addresses of various components */ diff --git a/src/devices/EmuNVNet.cpp b/src/devices/EmuNVNet.cpp index 2dff00f47..f63ee5d90 100644 --- a/src/devices/EmuNVNet.cpp +++ b/src/devices/EmuNVNet.cpp @@ -514,14 +514,14 @@ void EmuNVNet_Write(xbaddr addr, uint32_t value, int size) // PCI Device functions -void NVNetDevice::Init() +void NVNetDevice::Init(unsigned int address) { PCIBarRegister r; // Register Memory bar : r.Raw.type = PCI_BAR_TYPE_MEMORY; - r.Memory.address = NVNET_ADDR >> 4; - RegisterBAR(0, NVNET_SIZE, r.value); + r.Memory.address = address >> 4; + RegisterBAR(0, NVNet_SIZE, r.value); // Register IO bar : r.Raw.type = PCI_BAR_TYPE_IO; diff --git a/src/devices/EmuNVNet.h b/src/devices/EmuNVNet.h index be80a8473..e669665fd 100644 --- a/src/devices/EmuNVNet.h +++ b/src/devices/EmuNVNet.h @@ -35,13 +35,11 @@ #include "PCIDevice.h" // For PCIDevice -#define NVNET_ADDR 0xFEF00000 -#define NVNET_SIZE 0x00000400 class NVNetDevice : public PCIDevice { public: // PCI Device functions - void Init(); + void Init(unsigned int address); void Reset(); uint32_t IORead(int barIndex, uint32_t port, unsigned size); void IOWrite(int barIndex, uint32_t port, uint32_t value, unsigned size); diff --git a/src/devices/MCPXDevice.cpp b/src/devices/MCPXDevice.cpp index ec0ff9264..e2a7c4381 100644 --- a/src/devices/MCPXDevice.cpp +++ b/src/devices/MCPXDevice.cpp @@ -49,7 +49,7 @@ MCPXDevice::MCPXDevice(MCPXRevision revision) // PCI Device functions -void MCPXDevice::Init() +void MCPXDevice::Init(unsigned int address) { // m_DeviceId = ?; // m_VendorId = PCI_VENDOR_ID_NVIDIA; diff --git a/src/devices/MCPXDevice.h b/src/devices/MCPXDevice.h index 73a42c375..5141be11c 100644 --- a/src/devices/MCPXDevice.h +++ b/src/devices/MCPXDevice.h @@ -51,7 +51,7 @@ public: MCPXDevice(MCPXRevision revision); // PCI Device functions - void Init(); + void Init(unsigned int address); void Reset(); uint32_t IORead(int barIndex, uint32_t port, unsigned size); diff --git a/src/devices/PCIBus.cpp b/src/devices/PCIBus.cpp index da222ac4f..230a9a73d 100644 --- a/src/devices/PCIBus.cpp +++ b/src/devices/PCIBus.cpp @@ -1,7 +1,7 @@ #include "PCIBus.h" #include -void PCIBus::ConnectDevice(uint32_t deviceId, PCIDevice *pDevice) +void PCIBus::ConnectDevice(uint32_t deviceId, PCIDevice *pDevice, unsigned int address) { if (m_Devices.find(deviceId) != m_Devices.end()) { printf("PCIBus: Attempting to connect two devices to the same device address\n"); @@ -9,7 +9,7 @@ void PCIBus::ConnectDevice(uint32_t deviceId, PCIDevice *pDevice) } m_Devices[deviceId] = pDevice; - pDevice->Init(); + pDevice->Init(address); } void PCIBus::IOWriteConfigAddress(uint32_t pData) diff --git a/src/devices/PCIBus.h b/src/devices/PCIBus.h index 29dc9b6cf..8e84d6b13 100644 --- a/src/devices/PCIBus.h +++ b/src/devices/PCIBus.h @@ -30,7 +30,7 @@ typedef struct { class PCIBus { public: - void ConnectDevice(uint32_t deviceId, PCIDevice *pDevice); + void ConnectDevice(uint32_t deviceId, PCIDevice *pDevice, unsigned int address); bool IORead(uint32_t addr, uint32_t* value, unsigned size); bool IOWrite(uint32_t addr, uint32_t value, unsigned size); diff --git a/src/devices/PCIDevice.h b/src/devices/PCIDevice.h index 270338d05..5a137e089 100644 --- a/src/devices/PCIDevice.h +++ b/src/devices/PCIDevice.h @@ -18,6 +18,28 @@ #define PCI_VENDOR_ID_NVIDIA 0x10DE +// MMIO addresses and sizes for the various xbox devices +#define NV2A_ADDR 0xFD000000 +#define NV2A_SIZE 0x01000000 +#define NV2A_PRAMIN_ADDR 0xFD700000 +#define NV2A_PRAMIN_SIZE 0x100000 +#define NV2A_USER_ADDR 0xFD800000 +#define NV2A_USER_SIZE 0x800000 +#define APU_BASE 0xFE800000 +#define APU_SIZE 0x80000 +#define AC97_BASE 0xFEC00000 +#define AC97_SIZE 0x1000 +#define USB0_BASE 0xFED00000 +#define USB1_BASE 0xFED08000 +#define USB_SIZE 0x1000 +#define NVNet_BASE 0xFEF00000 +#define NVNet_SIZE 0x400 +#define BIOS_BASE 0xFF000000 // this takes into account that the bios covers the top 16 MiB of memory +#define BIOS_XBOX_SIZE 0xFFFE00 +#define BIOS_CHIHIRO_SIZE 0x1000000 +#define MCPX_BASE 0xFFFFFE00 +#define MCPX_SIZE 0x200 + class PCIDevice; typedef struct @@ -65,7 +87,7 @@ typedef struct { class PCIDevice { // PCI Device Interface public: - virtual void Init() = 0; + virtual void Init(unsigned int address) = 0; virtual void Reset() = 0; virtual uint32_t IORead(int barIndex, uint32_t port, unsigned size) = 0; virtual void IOWrite(int barIndex, uint32_t port, uint32_t value, unsigned size) = 0; diff --git a/src/devices/SMBus.cpp b/src/devices/SMBus.cpp index 90b13a268..eaff032e9 100644 --- a/src/devices/SMBus.cpp +++ b/src/devices/SMBus.cpp @@ -2,11 +2,11 @@ #include "SMBus.h" -void SMBus::Init() +void SMBus::Init(unsigned int address) { PCIBarRegister r; r.Raw.type = PCI_BAR_TYPE_IO; - r.IO.address = 0xC000; + r.IO.address = address; RegisterBAR(1, 32, r.value); m_DeviceId = 0x01B4; diff --git a/src/devices/SMBus.h b/src/devices/SMBus.h index e78995de1..f3ac3dda9 100644 --- a/src/devices/SMBus.h +++ b/src/devices/SMBus.h @@ -51,7 +51,7 @@ class SMBus : public PCIDevice { using PCIDevice::PCIDevice; // PCI Functions - void Init(); + void Init(unsigned int address); void Reset(); uint32_t IORead(int barIndex, uint32_t addr, unsigned size = sizeof(uint8_t)); diff --git a/src/devices/USBController/USBDevice.cpp b/src/devices/USBController/USBDevice.cpp new file mode 100644 index 000000000..10ba9c3bc --- /dev/null +++ b/src/devices/USBController/USBDevice.cpp @@ -0,0 +1,52 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * Cxbx->devices->USBController->USBDevice.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** + +#include "USBDevice.h" + + +void USBDevice::Init(unsigned int address) +{ + PCIBarRegister r; + + // Register Memory bar : + r.Raw.type = PCI_BAR_TYPE_MEMORY; + r.Memory.address = address >> 4; + RegisterBAR(0, USB_SIZE, r.value); + + // Taken from https://github.com/docbrown/vxb/wiki/Xbox-Hardware-Information + m_DeviceId = 0x01C2; + m_VendorId = PCI_VENDOR_ID_NVIDIA; +} \ No newline at end of file diff --git a/src/devices/USBController/USBDevice.h b/src/devices/USBController/USBDevice.h new file mode 100644 index 000000000..ba5f1c2fd --- /dev/null +++ b/src/devices/USBController/USBDevice.h @@ -0,0 +1,60 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * Cxbx->devices->USBController->USBDevice.h +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** +#ifndef USBDEVICE_H_ +#define USBDEVICE_H_ + +#include "..\PCIDevice.h" + +class USBDevice : public PCIDevice { + public: + // constructor + USBDevice() {} + // destructor + ~USBDevice() {} + + // PCI Device functions + void Init(unsigned int address); + void Reset() {} + + uint32_t IORead(int barIndex, uint32_t port, unsigned size); + void IOWrite(int barIndex, uint32_t port, uint32_t value, unsigned size); + uint32_t MMIORead(int barIndex, uint32_t addr, unsigned size); + void MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned size); + + +}; + +#endif \ No newline at end of file diff --git a/src/devices/Xbox.cpp b/src/devices/Xbox.cpp index 8f1688def..10a43de32 100644 --- a/src/devices/Xbox.cpp +++ b/src/devices/Xbox.cpp @@ -33,6 +33,7 @@ // * All rights reserved // * // ****************************************************************** + #include "Xbox.h" // For HardwareModel PCIBus* g_PCIBus; @@ -43,6 +44,8 @@ EEPROMDevice* g_EEPROM; NVNetDevice* g_NVNet; NV2ADevice* g_NV2A; ADM1032Device* g_ADM1032; +USBDevice* g_USB0; +USBDevice* g_USB1; MCPXRevision MCPXRevisionFromHardwareModel(HardwareModel hardwareModel) { @@ -127,6 +130,8 @@ void InitXboxHardware(HardwareModel hardwareModel) g_NVNet = new NVNetDevice(); g_NV2A = new NV2ADevice(); g_ADM1032 = new ADM1032Device(); + g_USB0 = new USBDevice(); + g_USB1 = new USBDevice(); // Connect devices to SM bus g_SMBus->ConnectDevice(SMBUS_ADDRESS_SYSTEM_MICRO_CONTROLLER, g_SMC); // W 0x20 R 0x21 @@ -149,12 +154,14 @@ void InitXboxHardware(HardwareModel hardwareModel) } // Connect devices to PCI bus - g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(1, 1)), g_SMBus); - g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(4, 0)), g_NVNet); + g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(1, 1)), g_SMBus, 0xC000); + g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(4, 0)), g_NVNet, NVNet_BASE); //g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(4, 1)), g_MCPX); // MCPX device ID = 0x0808 ? //g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(5, 0)), g_NVAPU); //g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(6, 0)), g_AC97); - g_PCIBus->ConnectDevice(PCI_DEVID(1, PCI_DEVFN(0, 0)), g_NV2A); + g_PCIBus->ConnectDevice(PCI_DEVID(1, PCI_DEVFN(0, 0)), g_NV2A, NV2A_ADDR); + g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(2, 0)), g_USB0, USB0_BASE); + g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(3, 0)), g_USB1, USB1_BASE); // TODO : Handle other SMBUS Addresses, like PIC_ADDRESS, XCALIBUR_ADDRESS // Resources : http://pablot.com/misc/fancontroller.cpp diff --git a/src/devices/Xbox.h b/src/devices/Xbox.h index 634f1ace9..0be572227 100644 --- a/src/devices/Xbox.h +++ b/src/devices/Xbox.h @@ -43,6 +43,7 @@ #include "EmuNVNet.h" // For NVNetDevice #include "ADM1032Device.h" // For ADM1032 #include "devices\video\nv2a.h" // For NV2ADevice +#include "USBController\USBDevice.h" // For USBDevice #define SMBUS_ADDRESS_MCPX 0x10 // = Write; Read = 0x11 #define SMBUS_ADDRESS_TV_ENCODER 0x88 // = Write; Read = 0x89 @@ -78,5 +79,7 @@ extern SMCDevice* g_SMC; extern EEPROMDevice* g_EEPROM; extern NVNetDevice* g_NVNet; extern NV2ADevice* g_NV2A; +extern USBDevice* g_USB0; +extern USBDevice* g_USB1; extern void InitXboxHardware(HardwareModel hardwareModel); \ No newline at end of file diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index 501ca33b9..aede3c54e 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -846,13 +846,13 @@ NV2ADevice::~NV2ADevice() // PCI Device functions -void NV2ADevice::Init() +void NV2ADevice::Init(unsigned int address) { PCIBarRegister r; // Register Memory bar : r.Raw.type = PCI_BAR_TYPE_MEMORY; - r.Memory.address = NV2A_ADDR >> 4; + r.Memory.address = address >> 4; RegisterBAR(0, NV2A_SIZE, r.value); // Register physical memory on bar 1 diff --git a/src/devices/video/nv2a.h b/src/devices/video/nv2a.h index 52c3009c5..62d54f60d 100644 --- a/src/devices/video/nv2a.h +++ b/src/devices/video/nv2a.h @@ -55,11 +55,8 @@ #include "qemu-thread.h" // For qemu_mutex, etc #include "nv2a_shaders.h" // For ShaderBinding -#define NV2A_ADDR 0xFD000000 -#define NV2A_SIZE 0x01000000 - #define NV_PMC_SIZE 0x001000 -#define _NV_PFIFO_SIZE 0x002000 // Underscore prefix to prevent clash with NV_PFIFO_SIZE +#define _NV_PFIFO_SIZE 0x002000 // Underscore prefix to prevent clash with NV_PFIFO_SIZE #define NV_PVIDEO_SIZE 0x001000 #define NV_PTIMER_SIZE 0x001000 #define NV_PFB_SIZE 0x001000 @@ -640,7 +637,7 @@ public: ~NV2ADevice(); // PCI Device functions - void Init(); + void Init(unsigned int address); void Reset(); uint32_t IORead(int barIndex, uint32_t port, unsigned size); From 989429bcc64a27201bfdf9d2a5dcd4828fcf9d53 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Wed, 2 May 2018 12:58:21 +0200 Subject: [PATCH 0016/1000] Added missing copyright text --- src/devices/PCIBus.cpp | 36 ++++++++++++++++++++++ src/devices/PCIBus.h | 36 ++++++++++++++++++++++ src/devices/PCIDevice.cpp | 36 ++++++++++++++++++++++ src/devices/PCIDevice.h | 36 ++++++++++++++++++++++ src/devices/SMBus.cpp | 36 ++++++++++++++++++++++ src/devices/SMBus.h | 36 ++++++++++++++++++++++ src/devices/SMDevice.cpp | 36 ++++++++++++++++++++++ src/devices/SMDevice.h | 36 ++++++++++++++++++++++ src/devices/video/EmuNV2A_DEBUG.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PBUS.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PCOUNTER.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PCRTC.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PFB.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PFIFO.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PGRAPH.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PMC.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PRAMDAC.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PRAMIN.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PRMA.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PRMCIO.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PRMDIO.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PRMFB.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PRMVIO.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PSTRAPS.cpp | 40 +++++++++++++++++++++++++ src/devices/video/EmuNV2A_PTIMER.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PTV.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PVIDEO.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_PVPE.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/EmuNV2A_USER.cpp | 41 ++++++++++++++++++++++++++ src/devices/video/qemu-thread.h | 21 +++++++++++++ 30 files changed, 1169 insertions(+) diff --git a/src/devices/PCIBus.cpp b/src/devices/PCIBus.cpp index 230a9a73d..a02121f86 100644 --- a/src/devices/PCIBus.cpp +++ b/src/devices/PCIBus.cpp @@ -1,3 +1,39 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->PCIBus.h +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + #include "PCIBus.h" #include diff --git a/src/devices/PCIBus.h b/src/devices/PCIBus.h index 8e84d6b13..ba51d6a24 100644 --- a/src/devices/PCIBus.h +++ b/src/devices/PCIBus.h @@ -1,3 +1,39 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->PCIBus.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + #ifndef _PCIMANAGER_H_ #define _PCIMANAGER_H_ diff --git a/src/devices/PCIDevice.cpp b/src/devices/PCIDevice.cpp index c2195dff3..dddbb95ad 100644 --- a/src/devices/PCIDevice.cpp +++ b/src/devices/PCIDevice.cpp @@ -1,3 +1,39 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->PCIDevice.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + #include "PCIDevice.h" bool PCIDevice::GetIOBar(uint32_t port, PCIBar* bar) diff --git a/src/devices/PCIDevice.h b/src/devices/PCIDevice.h index 5a137e089..e3f22ed7e 100644 --- a/src/devices/PCIDevice.h +++ b/src/devices/PCIDevice.h @@ -1,3 +1,39 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->PCIDevice.h +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + #ifndef _PCIDEVICE_H_ #define _PCIDEVICE_H_ diff --git a/src/devices/SMBus.cpp b/src/devices/SMBus.cpp index eaff032e9..01d55bf0b 100644 --- a/src/devices/SMBus.cpp +++ b/src/devices/SMBus.cpp @@ -1,3 +1,39 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->SMBus.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + #include #include "SMBus.h" diff --git a/src/devices/SMBus.h b/src/devices/SMBus.h index f3ac3dda9..9ec7a3bf0 100644 --- a/src/devices/SMBus.h +++ b/src/devices/SMBus.h @@ -1,3 +1,39 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->SMBus.h +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + #ifndef _SMBUS_H_ #define _SMBUS_H_ diff --git a/src/devices/SMDevice.cpp b/src/devices/SMDevice.cpp index b86a33e8d..13161ea92 100644 --- a/src/devices/SMDevice.cpp +++ b/src/devices/SMDevice.cpp @@ -1,2 +1,38 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->SMDevice.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + #include "SMDevice.h" diff --git a/src/devices/SMDevice.h b/src/devices/SMDevice.h index 70cb77294..44d6d5efa 100644 --- a/src/devices/SMDevice.h +++ b/src/devices/SMDevice.h @@ -1,3 +1,39 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->SMDevice.h +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + #ifndef _SMDEVICE_H_ #define _SMDEVICE_H_ diff --git a/src/devices/video/EmuNV2A_DEBUG.cpp b/src/devices/video/EmuNV2A_DEBUG.cpp index 91975d428..cac08307f 100644 --- a/src/devices/video/EmuNV2A_DEBUG.cpp +++ b/src/devices/video/EmuNV2A_DEBUG.cpp @@ -1,3 +1,44 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_DEBUG.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + #define DEBUG_START(DEV) \ const char *DebugNV_##DEV##(xbaddr addr) \ { \ diff --git a/src/devices/video/EmuNV2A_PBUS.cpp b/src/devices/video/EmuNV2A_PBUS.cpp index a30fc2099..dac79600f 100644 --- a/src/devices/video/EmuNV2A_PBUS.cpp +++ b/src/devices/video/EmuNV2A_PBUS.cpp @@ -1,3 +1,44 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PBUS.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + /* PBUS - bus control */ DEVICE_READ32(PBUS) { diff --git a/src/devices/video/EmuNV2A_PCOUNTER.cpp b/src/devices/video/EmuNV2A_PCOUNTER.cpp index eb541cf20..7b0014980 100644 --- a/src/devices/video/EmuNV2A_PCOUNTER.cpp +++ b/src/devices/video/EmuNV2A_PCOUNTER.cpp @@ -1,7 +1,48 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PCOUNTER.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** // TODO: Remove disabled warning once case are add to PCOUNTER switch. #pragma warning(push) #pragma warning(disable: 4065) + DEVICE_READ32(PCOUNTER) { DEVICE_READ32_SWITCH() { diff --git a/src/devices/video/EmuNV2A_PCRTC.cpp b/src/devices/video/EmuNV2A_PCRTC.cpp index 353412f62..eb57ba9f3 100644 --- a/src/devices/video/EmuNV2A_PCRTC.cpp +++ b/src/devices/video/EmuNV2A_PCRTC.cpp @@ -1,3 +1,44 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PCRTC.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + DEVICE_READ32(PCRTC) { DEVICE_READ32_SWITCH() { diff --git a/src/devices/video/EmuNV2A_PFB.cpp b/src/devices/video/EmuNV2A_PFB.cpp index ed2f35581..75dc2ea30 100644 --- a/src/devices/video/EmuNV2A_PFB.cpp +++ b/src/devices/video/EmuNV2A_PFB.cpp @@ -1,3 +1,44 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PFB.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + DEVICE_READ32(PFB) { DEVICE_READ32_SWITCH() { diff --git a/src/devices/video/EmuNV2A_PFIFO.cpp b/src/devices/video/EmuNV2A_PFIFO.cpp index 54476d251..6588d6b24 100644 --- a/src/devices/video/EmuNV2A_PFIFO.cpp +++ b/src/devices/video/EmuNV2A_PFIFO.cpp @@ -1,3 +1,44 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PFIFO.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + typedef struct RAMHTEntry { uint32_t handle; xbaddr instance; diff --git a/src/devices/video/EmuNV2A_PGRAPH.cpp b/src/devices/video/EmuNV2A_PGRAPH.cpp index c17e68574..18d141a2a 100644 --- a/src/devices/video/EmuNV2A_PGRAPH.cpp +++ b/src/devices/video/EmuNV2A_PGRAPH.cpp @@ -1,3 +1,44 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PGRAPH.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + // FIXME #define qemu_mutex_lock_iothread() #define qemu_mutex_unlock_iothread() diff --git a/src/devices/video/EmuNV2A_PMC.cpp b/src/devices/video/EmuNV2A_PMC.cpp index 4b8719b2f..e9a11d6b7 100644 --- a/src/devices/video/EmuNV2A_PMC.cpp +++ b/src/devices/video/EmuNV2A_PMC.cpp @@ -1,3 +1,44 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PMC.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + /* PMC - card master control */ DEVICE_READ32(PMC) { diff --git a/src/devices/video/EmuNV2A_PRAMDAC.cpp b/src/devices/video/EmuNV2A_PRAMDAC.cpp index 2cd190d6c..cf3865e6e 100644 --- a/src/devices/video/EmuNV2A_PRAMDAC.cpp +++ b/src/devices/video/EmuNV2A_PRAMDAC.cpp @@ -1,3 +1,44 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PRAMDAC.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + DEVICE_READ32(PRAMDAC) { DEVICE_READ32_SWITCH() { diff --git a/src/devices/video/EmuNV2A_PRAMIN.cpp b/src/devices/video/EmuNV2A_PRAMIN.cpp index 533be20ec..c00766f5f 100644 --- a/src/devices/video/EmuNV2A_PRAMIN.cpp +++ b/src/devices/video/EmuNV2A_PRAMIN.cpp @@ -1,3 +1,44 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PRAMIN.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + DEVICE_READ32(PRAMIN) { uint32_t result = *((uint32_t*)(d->pramin.ramin_ptr + addr)); diff --git a/src/devices/video/EmuNV2A_PRMA.cpp b/src/devices/video/EmuNV2A_PRMA.cpp index 7f21a4ee2..b57701778 100644 --- a/src/devices/video/EmuNV2A_PRMA.cpp +++ b/src/devices/video/EmuNV2A_PRMA.cpp @@ -1,7 +1,48 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PRMA.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** // TODO: Remove disabled warning once case are add to PRMA switch. #pragma warning(push) #pragma warning(disable: 4065) + DEVICE_READ32(PRMA) { DEVICE_READ32_SWITCH() { diff --git a/src/devices/video/EmuNV2A_PRMCIO.cpp b/src/devices/video/EmuNV2A_PRMCIO.cpp index 6283cf19b..abd460f03 100644 --- a/src/devices/video/EmuNV2A_PRMCIO.cpp +++ b/src/devices/video/EmuNV2A_PRMCIO.cpp @@ -1,3 +1,44 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PRMCIO.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + DEVICE_READ32(PRMCIO) { // vga_ioport_read : diff --git a/src/devices/video/EmuNV2A_PRMDIO.cpp b/src/devices/video/EmuNV2A_PRMDIO.cpp index 21e9447f8..6432d42b0 100644 --- a/src/devices/video/EmuNV2A_PRMDIO.cpp +++ b/src/devices/video/EmuNV2A_PRMDIO.cpp @@ -1,7 +1,48 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PRMDIO.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** // TODO: Remove disabled warning once case are add to PRMDIO switch. #pragma warning(push) #pragma warning(disable: 4065) + DEVICE_READ32(PRMDIO) { DEVICE_READ32_SWITCH() { diff --git a/src/devices/video/EmuNV2A_PRMFB.cpp b/src/devices/video/EmuNV2A_PRMFB.cpp index 176328a1f..af125829f 100644 --- a/src/devices/video/EmuNV2A_PRMFB.cpp +++ b/src/devices/video/EmuNV2A_PRMFB.cpp @@ -1,7 +1,48 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PRMFB.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** // TODO: Remove disabled warning once case are add to PRMFB switch. #pragma warning(push) #pragma warning(disable: 4065) + DEVICE_READ32(PRMFB) { DEVICE_READ32_SWITCH() { diff --git a/src/devices/video/EmuNV2A_PRMVIO.cpp b/src/devices/video/EmuNV2A_PRMVIO.cpp index f9f2b0b90..cd49cce9d 100644 --- a/src/devices/video/EmuNV2A_PRMVIO.cpp +++ b/src/devices/video/EmuNV2A_PRMVIO.cpp @@ -1,7 +1,48 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PRMVIO.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** // TODO: Remove disabled warning once case are add to PRMVIO switch. #pragma warning(push) #pragma warning(disable: 4065) + DEVICE_READ32(PRMVIO) { // vga_ioport_read diff --git a/src/devices/video/EmuNV2A_PSTRAPS.cpp b/src/devices/video/EmuNV2A_PSTRAPS.cpp index cd50beb69..802a17a50 100644 --- a/src/devices/video/EmuNV2A_PSTRAPS.cpp +++ b/src/devices/video/EmuNV2A_PSTRAPS.cpp @@ -1,3 +1,43 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PSTRAPS.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** // TODO: Remove disabled warning once case are add to PSTRAPS switch. #pragma warning(push) diff --git a/src/devices/video/EmuNV2A_PTIMER.cpp b/src/devices/video/EmuNV2A_PTIMER.cpp index d338bcf7a..acc463c0b 100644 --- a/src/devices/video/EmuNV2A_PTIMER.cpp +++ b/src/devices/video/EmuNV2A_PTIMER.cpp @@ -1,3 +1,44 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PTIMER.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + static inline uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c) { union { diff --git a/src/devices/video/EmuNV2A_PTV.cpp b/src/devices/video/EmuNV2A_PTV.cpp index bb4e66b75..7c7b56a2f 100644 --- a/src/devices/video/EmuNV2A_PTV.cpp +++ b/src/devices/video/EmuNV2A_PTV.cpp @@ -1,7 +1,48 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PTV.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** // TODO: Remove disabled warning once case are add to PTV switch. #pragma warning(push) #pragma warning(disable: 4065) + DEVICE_READ32(PTV) { DEVICE_READ32_SWITCH() { diff --git a/src/devices/video/EmuNV2A_PVIDEO.cpp b/src/devices/video/EmuNV2A_PVIDEO.cpp index d66cd5c09..b593d137a 100644 --- a/src/devices/video/EmuNV2A_PVIDEO.cpp +++ b/src/devices/video/EmuNV2A_PVIDEO.cpp @@ -1,3 +1,44 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PVIDEO.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + static void pvideo_vga_invalidate(NV2AState *d) { int y1 = GET_MASK(d->pvideo.regs[NV_PVIDEO_POINT_OUT(0)], diff --git a/src/devices/video/EmuNV2A_PVPE.cpp b/src/devices/video/EmuNV2A_PVPE.cpp index a336c94d7..09a1f62e2 100644 --- a/src/devices/video/EmuNV2A_PVPE.cpp +++ b/src/devices/video/EmuNV2A_PVPE.cpp @@ -1,7 +1,48 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_PVPE.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** // TODO: Remove disabled warning once case are add to PVPE switch. #pragma warning(push) #pragma warning(disable: 4065) + DEVICE_READ32(PVPE) { DEVICE_READ32_SWITCH() { diff --git a/src/devices/video/EmuNV2A_USER.cpp b/src/devices/video/EmuNV2A_USER.cpp index 140d66a00..7a8d4a6bd 100644 --- a/src/devices/video/EmuNV2A_USER.cpp +++ b/src/devices/video/EmuNV2A_USER.cpp @@ -1,3 +1,44 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->devices->video->EmuNV2A_USER.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * nv2a.cpp is heavily based on code from XQEMU +// * Copyright(c) 2012 espes +// * Copyright(c) 2015 Jannik Vogel +// * https://github.com/espes/xqemu/blob/xbox/hw/xbox/nv2a.c +// * (c) 2017-2018 Luke Usher +// * (c) 2018 Patrick van Logchem +// * +// * All rights reserved +// * +// ****************************************************************** + /* USER - PFIFO MMIO and DMA submission area */ DEVICE_READ32(USER) { diff --git a/src/devices/video/qemu-thread.h b/src/devices/video/qemu-thread.h index 4b78cff47..352674794 100644 --- a/src/devices/video/qemu-thread.h +++ b/src/devices/video/qemu-thread.h @@ -1,3 +1,24 @@ +/* +* QEMU Geforce NV2A threads +* +* Copyright (c) 2012 espes +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License version 2 as published by the Free Software Foundation. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, see +* +* Contributions after 2012-01-13 are licensed under the terms of the +* GNU GPL, version 2 or (at your option) any later version. +*/ + #ifndef __QEMU_THREAD_H #define __QEMU_THREAD_H 1 From 403f9cb710d67e0adc8b0b38e929a884b58e020e Mon Sep 17 00:00:00 2001 From: ergo720 Date: Wed, 2 May 2018 18:23:24 +0200 Subject: [PATCH 0017/1000] MMIO support for USB devices --- build/win32/Cxbx.vcxproj | 2 + build/win32/Cxbx.vcxproj.filters | 10 ++- src/devices/USBController/OHCI.cpp | 41 ++++++++++ src/devices/USBController/OHCI.h | 101 ++++++++++++++++++++++++ src/devices/USBController/USBDevice.cpp | 36 ++++++++- src/devices/USBController/USBDevice.h | 9 +-- 6 files changed, 191 insertions(+), 8 deletions(-) create mode 100644 src/devices/USBController/OHCI.cpp create mode 100644 src/devices/USBController/OHCI.h diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index f4f72cdf9..e0d2eeebb 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -361,6 +361,7 @@ + @@ -730,6 +731,7 @@ + diff --git a/build/win32/Cxbx.vcxproj.filters b/build/win32/Cxbx.vcxproj.filters index bce4f2b5a..2b73d6d86 100644 --- a/build/win32/Cxbx.vcxproj.filters +++ b/build/win32/Cxbx.vcxproj.filters @@ -284,7 +284,9 @@ Hardware - + + Hardware + GUI @@ -570,7 +572,11 @@ Hardware - + + + Hardware + + GUI diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp new file mode 100644 index 000000000..bc779e352 --- /dev/null +++ b/src/devices/USBController/OHCI.cpp @@ -0,0 +1,41 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * Cxbx->devices->USBController->OHCI.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** + +#include "OHCI.h" + +// global pointers to the two USB host controllers available on the Xbox +OHCI_State* g_pHostController1 = nullptr; +OHCI_State* g_pHostController2 = nullptr; diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h new file mode 100644 index 000000000..15feb66b1 --- /dev/null +++ b/src/devices/USBController/OHCI.h @@ -0,0 +1,101 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * Cxbx->devices->USBController->OHCI.h +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** + +#ifndef OHCI_H_ +#define OHCI_H_ + +#include +#include "Cxbx.h" + +// All these registers are well documented in the OHCI standard +typedef struct _OHCI_Registers +{ + // Control and Status partition + uint32_t HcRevision; + uint32_t HcControl; + uint32_t HcCommandStatus; + uint32_t HcInterruptStatus; + uint32_t HcInterruptEnable; + uint32_t HcInterruptDisable; + + // Memory Pointer partition + uint32_t HcHCCA; + uint32_t HcPeriodCurrentED; + uint32_t HcControlHeadED; + uint32_t HcControlCurrentED; + uint32_t HcBulkHeadED; + uint32_t HcBulkCurrentED; + uint32_t HcDoneHead; + + // Frame Counter partition + uint32_t HcFmInterval; + uint32_t HcFmRemaining; + uint32_t HcFmNumber; + uint32_t HcPeriodicStart; + uint32_t HcLSThreshold; + + // Root Hub partition + uint32_t HcRhDescriptorA; + uint32_t HcRhDescriptorB; + uint32_t HcRhStatus; + uint32_t HcRhPortStatus1; // 2 ports per HC, for a total of 4 USB ports + uint32_t HcRhPortStatus2; +} +OHCI_Registers; + + +/* OHCI class representing the state of the HC */ +class OHCI_State +{ + public: + // constructor + OHCI_State() {} + // destructor + ~OHCI_State() {} + // read a register + uint32_t ReadRegister(xbaddr addr); + // write a register + void WriteRegister(xbaddr addr, uint32_t value); + + private: + // all the registers available on the OHCI standard + OHCI_Registers Registers; +}; + +extern OHCI_State* g_pHostController1; +extern OHCI_State* g_pHostController2; + +#endif diff --git a/src/devices/USBController/USBDevice.cpp b/src/devices/USBController/USBDevice.cpp index 10ba9c3bc..3ef1b1d38 100644 --- a/src/devices/USBController/USBDevice.cpp +++ b/src/devices/USBController/USBDevice.cpp @@ -35,6 +35,7 @@ // ****************************************************************** #include "USBDevice.h" +#include void USBDevice::Init(unsigned int address) @@ -49,4 +50,37 @@ void USBDevice::Init(unsigned int address) // Taken from https://github.com/docbrown/vxb/wiki/Xbox-Hardware-Information m_DeviceId = 0x01C2; m_VendorId = PCI_VENDOR_ID_NVIDIA; -} \ No newline at end of file + + // TODO: construct the OHCI object +} + +uint32_t USBDevice::MMIORead(int barIndex, uint32_t addr, unsigned size) +{ + // barIndex must be zero since we created the USB devices with a zero index in Init() + assert(barIndex == 0); + + // Figure out the correct OHCI object and read the register + if (addr >= USB1_BASE) { + // USB1 queried + return g_pHostController2->ReadRegister(addr); + } + + // USB0 queried + return g_pHostController1->ReadRegister(addr); +} + +void USBDevice::MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned size) +{ + // barIndex must be zero since we created the USB devices with a zero index in Init() + assert(barIndex == 0); + + // Figure out the correct OHCI object and write the value to the register + if (addr >= USB1_BASE) { + // USB1 queried + g_pHostController2->WriteRegister(addr, value); + return; + } + + // USB0 queried + g_pHostController1->WriteRegister(addr, value); +} diff --git a/src/devices/USBController/USBDevice.h b/src/devices/USBController/USBDevice.h index ba5f1c2fd..07fe757c5 100644 --- a/src/devices/USBController/USBDevice.h +++ b/src/devices/USBController/USBDevice.h @@ -37,6 +37,7 @@ #define USBDEVICE_H_ #include "..\PCIDevice.h" +#include "OHCI.h" class USBDevice : public PCIDevice { public: @@ -49,12 +50,10 @@ class USBDevice : public PCIDevice { void Init(unsigned int address); void Reset() {} - uint32_t IORead(int barIndex, uint32_t port, unsigned size); - void IOWrite(int barIndex, uint32_t port, uint32_t value, unsigned size); + uint32_t IORead(int barIndex, uint32_t port, unsigned size) {} + void IOWrite(int barIndex, uint32_t port, uint32_t value, unsigned size) {} uint32_t MMIORead(int barIndex, uint32_t addr, unsigned size); void MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned size); - - }; -#endif \ No newline at end of file +#endif From b61339f0ea34b8421b206d787aab7f6ea7f3dfc3 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Thu, 3 May 2018 20:13:42 +0200 Subject: [PATCH 0018/1000] Added skeleton HC initialization --- src/devices/USBController/OHCI.cpp | 53 +++++++++++++++++++++ src/devices/USBController/OHCI.h | 62 +++++++++++++++++++++++-- src/devices/USBController/USBDevice.cpp | 15 ++++-- 3 files changed, 120 insertions(+), 10 deletions(-) diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index bc779e352..2569d167b 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -35,7 +35,60 @@ // ****************************************************************** #include "OHCI.h" +#include "..\CxbxKrnl\CxbxKrnl.h" // global pointers to the two USB host controllers available on the Xbox OHCI_State* g_pHostController1 = nullptr; OHCI_State* g_pHostController2 = nullptr; + + +void OHCI_State::HC_Reset(USB_State new_state) +{ + // The usb state can be USB_Suspend if it is a software reset, and USB_Reset if it is a hardware + // reset or cold boot + + // TODO: stop all the list processing here + + // Reset all registers + if (new_state == USB_Reset) { + // Remark: the standard says that RemoteWakeupConnected bit should be set during POST, cleared during hw reset + // and ignored during a sw reset. However, VBox sets it on hw reset and XQEMU clears it. Considering that the Xbox + // doesn't do POST, I will clear it. + HC_Registers.HcControl = 0; + } + else { + HC_Registers.HcControl &= (OHCI_CTL_IR | OHCI_CTL_RWC); + } + HC_Registers.HcControl = ~OHCI_CTL_HCFS; + HC_Registers.HcControl = new_state; + HC_Registers.HcCommandStatus = 0; + HC_Registers.HcInterruptStatus = 0; + HC_Registers.HcInterruptEnable = OHCI_INTR_MASTER_INTERRUPT_ENABLED; // enable interrupts + + HC_Registers.HcHCCA = 0; + HC_Registers.HcPeriodCurrentED = 0; + HC_Registers.HcControlHeadED = HC_Registers.HcControlCurrentED = 0; + HC_Registers.HcBulkHeadED = HC_Registers.HcBulkCurrentED = 0; + HC_Registers.HcDoneHead = 0; + + HC_Registers.HcFmInterval = 0; + HC_Registers.HcFmInterval |= (0x2778 << 16); // TBD according to the standard, using what XQEMU sets (FSLargestDataPacket) + HC_Registers.HcFmInterval |= (0 << 31); // redundant, but we'll do it for the sake of completeness (FrameIntervalToggle) + HC_Registers.HcFmInterval |= 0x2EDF; // bit-time of a frame. 1 frame = 1 ms (FrameInterval) + HC_Registers.HcFmRemaining = 0; + HC_Registers.HcFmNumber = 0; + HC_Registers.HcPeriodicStart = 0; + + HC_Registers.HcRhDescriptorA = OHCI_RHA_NPS | 2; // The xbox lacks the hw to switch off the power on the ports and has 2 ports per HC + HC_Registers.HcRhDescriptorB = 0; // The attached devices are removable and use PowerSwitchingMode to control the power on the ports + for (int i = 0; i < 2; i++) + { + OHCIPort* Port = &HC_Registers.RhPort[i]; + Port->HcRhPortStatus = 0; + //if (Port->port.device && Port->port.device->attached) { + //usb_port_reset(&Port->port); + //} + } + + DbgPrintf("usb-ohci: Reset\n"); +} \ No newline at end of file diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index 15feb66b1..0aaa9a2a0 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -40,6 +40,47 @@ #include #include "Cxbx.h" + +// Abbreviations used: +// OHCI: Open Host Controller Interface; the standard used on the xbox to comunicate with the usb devices +// HC: Host Controller; the hardware which interfaces with the usb device and the usb driver +// HCD: Host Controller Driver; software which talks to the HC, it's linked in the xbe + + +// These macros are used to access the bits in the various registers +// HcControl +#define OHCI_CTL_CBSR ((1<<0)|(1<<1)) // ControlBulkServiceRatio +#define OHCI_CTL_PLE (1<<2) // PeriodicListEnable +#define OHCI_CTL_IE (1<<3) // IsochronousEnable +#define OHCI_CTL_CLE (1<<4) // ControlListEnable +#define OHCI_CTL_BLE (1<<5) // BulkListEnable +#define OHCI_CTL_HCFS ((1<<6)|(1<<7)) // HostControllerFunctionalState +#define OHCI_CTL_IR (1<<8) // InterruptRouting +#define OHCI_CTL_RWC (1<<9) // RemoteWakeupConnected +#define OHCI_CTL_RWE (1<<10) // RemoteWakeupEnable +// HcInterruptEnable, HcInterruptDisable +#define OHCI_INTR_MASTER_INTERRUPT_ENABLED (1<<31) // MasterInterruptEnable +// HcRhDescriptorA +#define OHCI_RHA_PSM (1<<8) // PowerSwitchingMode +#define OHCI_RHA_NPS (1<<9) // NoPowerSwitching +#define OHCI_RHA_DT (1<<10) // DeviceType +#define OHCI_RHA_OCPM (1<<11) // OverCurrentProtectionMode +#define OHCI_RHA_NOCP (1<<12) // NoOverCurrentProtection + +// Struct describing the status of a usb port +struct USBPort { + //USBDevice* device; + //TODO +}; + +// Small struct used to hold the HcRhPortStatus register and the usb port status +typedef struct _OHCIPort +{ + USBPort port; + uint32_t HcRhPortStatus; +} +OHCIPort; + // All these registers are well documented in the OHCI standard typedef struct _OHCI_Registers { @@ -71,11 +112,20 @@ typedef struct _OHCI_Registers uint32_t HcRhDescriptorA; uint32_t HcRhDescriptorB; uint32_t HcRhStatus; - uint32_t HcRhPortStatus1; // 2 ports per HC, for a total of 4 USB ports - uint32_t HcRhPortStatus2; + OHCIPort RhPort[2]; // 2 ports per HC, for a total of 4 USB ports } OHCI_Registers; +// enum indicating the current HC state +typedef enum _USB_State +{ + USB_Reset = 0x00, + USB_Resume = 0x40, + USB_Operational = 0x80, + USB_Suspend = 0xC0, +} +USB_State; + /* OHCI class representing the state of the HC */ class OHCI_State @@ -86,13 +136,15 @@ class OHCI_State // destructor ~OHCI_State() {} // read a register - uint32_t ReadRegister(xbaddr addr); + uint32_t HC_ReadRegister(xbaddr addr); // write a register - void WriteRegister(xbaddr addr, uint32_t value); + void HC_WriteRegister(xbaddr addr, uint32_t value); + // reset the HC to the default state + void HC_Reset(USB_State new_state); private: // all the registers available on the OHCI standard - OHCI_Registers Registers; + OHCI_Registers HC_Registers; }; extern OHCI_State* g_pHostController1; diff --git a/src/devices/USBController/USBDevice.cpp b/src/devices/USBController/USBDevice.cpp index 3ef1b1d38..f597155b8 100644 --- a/src/devices/USBController/USBDevice.cpp +++ b/src/devices/USBController/USBDevice.cpp @@ -51,7 +51,12 @@ void USBDevice::Init(unsigned int address) m_DeviceId = 0x01C2; m_VendorId = PCI_VENDOR_ID_NVIDIA; - // TODO: construct the OHCI object + g_pHostController1 = new OHCI_State; + g_pHostController2 = new OHCI_State; + + // We can use the USB_Reset state to also cold boot the HC during initialization + g_pHostController1->HC_Reset(USB_Reset); + g_pHostController2->HC_Reset(USB_Reset); } uint32_t USBDevice::MMIORead(int barIndex, uint32_t addr, unsigned size) @@ -62,11 +67,11 @@ uint32_t USBDevice::MMIORead(int barIndex, uint32_t addr, unsigned size) // Figure out the correct OHCI object and read the register if (addr >= USB1_BASE) { // USB1 queried - return g_pHostController2->ReadRegister(addr); + return g_pHostController2->HC_ReadRegister(addr); } // USB0 queried - return g_pHostController1->ReadRegister(addr); + return g_pHostController1->HC_ReadRegister(addr); } void USBDevice::MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned size) @@ -77,10 +82,10 @@ void USBDevice::MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned // Figure out the correct OHCI object and write the value to the register if (addr >= USB1_BASE) { // USB1 queried - g_pHostController2->WriteRegister(addr, value); + g_pHostController2->HC_WriteRegister(addr, value); return; } // USB0 queried - g_pHostController1->WriteRegister(addr, value); + g_pHostController1->HC_WriteRegister(addr, value); } From 6aafb25dee2e7fb7edbe7ecb78c07c2d1004c5b2 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Thu, 17 May 2018 01:07:40 +0200 Subject: [PATCH 0019/1000] Virtual and real timers --- build/win32/Cxbx.vcxproj | 2 + build/win32/Cxbx.vcxproj.filters | 9 +- src/CxbxKrnl/Timer.cpp | 170 ++++++++++++++++++++++++ src/CxbxKrnl/Timer.h | 63 +++++++++ src/devices/USBController/OHCI.cpp | 9 +- src/devices/USBController/OHCI.h | 2 +- src/devices/USBController/USBDevice.cpp | 12 +- 7 files changed, 255 insertions(+), 12 deletions(-) create mode 100644 src/CxbxKrnl/Timer.cpp create mode 100644 src/CxbxKrnl/Timer.h diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index e0d2eeebb..0a228a0d5 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -332,6 +332,7 @@ + @@ -636,6 +637,7 @@ %(PreprocessorDefinitions) %(PreprocessorDefinitions) + diff --git a/build/win32/Cxbx.vcxproj.filters b/build/win32/Cxbx.vcxproj.filters index 2b73d6d86..02d983177 100644 --- a/build/win32/Cxbx.vcxproj.filters +++ b/build/win32/Cxbx.vcxproj.filters @@ -286,7 +286,11 @@ Hardware - + + + Emulator + + GUI @@ -575,6 +579,9 @@ Hardware + + + Emulator GUI diff --git a/src/CxbxKrnl/Timer.cpp b/src/CxbxKrnl/Timer.cpp new file mode 100644 index 000000000..ba2898c62 --- /dev/null +++ b/src/CxbxKrnl/Timer.cpp @@ -0,0 +1,170 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * Cxbx->CxbxKrnl->Timer.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** + +#include +#include +#include +#include "Timer.h" + + +#define CLOCK_REALTIME 0 +#define CLOCK_VIRTUALTIME 1 +#define SCALE_S 1000000000ULL +#define SCALE_MS 1000000ULL +#define SCALE_US 1000ULL +#define SCALE_NS 1ULL + + +// Vector storing all the timers created +static std::vector TimerList; +// The frequency of the high resolution timer of the host +static uint64_t ClockFrequency; + + +// Disable a compiler warning relative to uint64_t -> uint32_t conversions in Muldiv64. This function is taken from +// XQEMU so it should be safe regardless +#pragma warning(push) +#pragma warning(disable: 4244) + +// Compute (a*b)/c with a 96 bit intermediate result +static inline uint64_t Muldiv64(uint64_t a, uint32_t b, uint32_t c) +{ + union { + uint64_t ll; + struct { + uint32_t low, high; + } l; + } u, res; + uint64_t rl, rh; + + u.ll = a; + rl = (uint64_t)u.l.low * (uint64_t)b; + rh = (uint64_t)u.l.high * (uint64_t)b; + rh += (rl >> 32); + res.l.high = rh / c; + res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c; + return res.ll; +} + +// Returns the current time of the timer +static inline uint64_t GetTime_NS(TimerObject* Timer) +{ + LARGE_INTEGER li; + QueryPerformanceCounter(&li); + uint64_t Ret = Muldiv64(li.QuadPart, SCALE_S, ClockFrequency); + return Timer->Type == CLOCK_REALTIME ? Ret : Ret / Timer->SlowdownFactor; +} + +#pragma warning(pop) + +// Calculates the next expire time of the timer +static inline uint64_t GetNextExpireTime(TimerObject* Timer) +{ + return GetTime_NS(Timer) + Timer->ExpireTime_MS.load() * SCALE_MS; +} + +// Deallocates the memory of the timer +void Timer_Destroy(TimerObject* Timer) +{ + unsigned int index; + for (unsigned int i = 0; i < TimerList.size(); i++) { + if (Timer == TimerList[i]) { + index = i; + } + } + + delete Timer; + TimerList.erase(TimerList.begin() + index); +} + +// Thread that runs the timer +void ClockThread(TimerObject* Timer) +{ + uint64_t NewExpireTime = GetNextExpireTime(Timer); + + while (true) { + if (GetTime_NS(Timer) > NewExpireTime) { + Timer->Callback(Timer->Opaque); + NewExpireTime = GetNextExpireTime(Timer); + } + if (Timer->Exit.load()) { + Timer_Destroy(Timer); + return; + } + } +} + +// Changes the expire time of a timer +void Timer_ChangeExpireTime(TimerObject* Timer, uint64_t Expire_ms) +{ + Timer->ExpireTime_MS.store(Expire_ms); +} + +// Destroys the timer +void Timer_Exit(TimerObject* Timer) +{ + Timer->Exit.store(true); +} + +// Allocates the memory for the timer object +TimerObject* Timer_Create(pTimerCB Callback, void* Arg, unsigned int Factor) +{ + TimerObject* pTimer = new TimerObject; + pTimer->Type = Factor <= 1 ? CLOCK_REALTIME : CLOCK_VIRTUALTIME; + pTimer->Callback = Callback; + pTimer->ExpireTime_MS.store(0); + pTimer->Exit.store(false); + pTimer->Opaque = Arg; + pTimer->SlowdownFactor = Factor < 1 ? 1 : Factor; + TimerList.emplace_back(pTimer); + + return pTimer; +} + +// Starts the timer +void Timer_Start(TimerObject* Timer, uint64_t Expire_MS) +{ + Timer->ExpireTime_MS.store(Expire_MS); + std::thread(ClockThread, Timer).detach(); +} + +// Retrives the frequency of the high resolution timer of the host +void Timer_Init() +{ + LARGE_INTEGER freq; + QueryPerformanceFrequency(&freq); + ClockFrequency = freq.QuadPart; +} diff --git a/src/CxbxKrnl/Timer.h b/src/CxbxKrnl/Timer.h new file mode 100644 index 000000000..f2f58983b --- /dev/null +++ b/src/CxbxKrnl/Timer.h @@ -0,0 +1,63 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * Cxbx->CxbxKrnl->Timer.h +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** + +#ifndef TIMER_H +#define TIMER_H + +#include + +/* typedef of the timer object and the callback function*/ +typedef void(*pTimerCB)(void*); +typedef struct _TimerObject +{ + int Type; // timer type (virtual or real) + std::atomic_uint64_t ExpireTime_MS; // when the timer expires (ms) + std::atomic_bool Exit; // indicates that the timer should be destroyed + pTimerCB Callback; // function to call when the timer expires + void* Opaque; // opaque argument to pass to the callback + unsigned int SlowdownFactor; // how much the time is slowed down (virtual clocks only) +} +TimerObject; + + +/* Timer exported functions */ +TimerObject* Timer_Create(pTimerCB callback, void* arg, unsigned int Factor); +void Timer_Start(TimerObject* timer, uint64_t Expire_MS); +void Timer_Exit(TimerObject* Timer); +void Timer_ChangeExpireTime(TimerObject* Timer, uint64_t Expire_ms); +void Timer_Init(); + +#endif diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index 2569d167b..5ac135875 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -42,7 +42,7 @@ OHCI_State* g_pHostController1 = nullptr; OHCI_State* g_pHostController2 = nullptr; -void OHCI_State::HC_Reset(USB_State new_state) +void OHCI_State::HC_ChangeState(USB_State new_state) { // The usb state can be USB_Suspend if it is a software reset, and USB_Reset if it is a hardware // reset or cold boot @@ -59,8 +59,8 @@ void OHCI_State::HC_Reset(USB_State new_state) else { HC_Registers.HcControl &= (OHCI_CTL_IR | OHCI_CTL_RWC); } - HC_Registers.HcControl = ~OHCI_CTL_HCFS; - HC_Registers.HcControl = new_state; + HC_Registers.HcControl &= ~OHCI_CTL_HCFS; + HC_Registers.HcControl |= new_state; HC_Registers.HcCommandStatus = 0; HC_Registers.HcInterruptStatus = 0; HC_Registers.HcInterruptEnable = OHCI_INTR_MASTER_INTERRUPT_ENABLED; // enable interrupts @@ -73,7 +73,6 @@ void OHCI_State::HC_Reset(USB_State new_state) HC_Registers.HcFmInterval = 0; HC_Registers.HcFmInterval |= (0x2778 << 16); // TBD according to the standard, using what XQEMU sets (FSLargestDataPacket) - HC_Registers.HcFmInterval |= (0 << 31); // redundant, but we'll do it for the sake of completeness (FrameIntervalToggle) HC_Registers.HcFmInterval |= 0x2EDF; // bit-time of a frame. 1 frame = 1 ms (FrameInterval) HC_Registers.HcFmRemaining = 0; HC_Registers.HcFmNumber = 0; @@ -90,5 +89,5 @@ void OHCI_State::HC_Reset(USB_State new_state) //} } - DbgPrintf("usb-ohci: Reset\n"); + DbgPrintf("Usb-Ohci: Reset\n"); } \ No newline at end of file diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index 0aaa9a2a0..048483938 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -140,7 +140,7 @@ class OHCI_State // write a register void HC_WriteRegister(xbaddr addr, uint32_t value); // reset the HC to the default state - void HC_Reset(USB_State new_state); + void HC_ChangeState(USB_State new_state); private: // all the registers available on the OHCI standard diff --git a/src/devices/USBController/USBDevice.cpp b/src/devices/USBController/USBDevice.cpp index f597155b8..1e81f6a91 100644 --- a/src/devices/USBController/USBDevice.cpp +++ b/src/devices/USBController/USBDevice.cpp @@ -51,12 +51,14 @@ void USBDevice::Init(unsigned int address) m_DeviceId = 0x01C2; m_VendorId = PCI_VENDOR_ID_NVIDIA; - g_pHostController1 = new OHCI_State; - g_pHostController2 = new OHCI_State; + if (address == USB0_BASE) { + g_pHostController1 = new OHCI_State; + g_pHostController1->HC_ChangeState(USB_Reset); + return; + } - // We can use the USB_Reset state to also cold boot the HC during initialization - g_pHostController1->HC_Reset(USB_Reset); - g_pHostController2->HC_Reset(USB_Reset); + g_pHostController2 = new OHCI_State; + g_pHostController2->HC_ChangeState(USB_Reset); } uint32_t USBDevice::MMIORead(int barIndex, uint32_t addr, unsigned size) From 7f0bea988c29cf6e47006d1b6d35860c604ca38d Mon Sep 17 00:00:00 2001 From: ergo720 Date: Thu, 17 May 2018 23:08:02 +0200 Subject: [PATCH 0020/1000] USB/HC initialization stuff --- src/CxbxKrnl/CxbxKrnl.cpp | 2 + src/CxbxKrnl/Timer.cpp | 4 +- src/CxbxKrnl/Timer.h | 4 +- src/devices/USBController/OHCI.cpp | 102 +++++++++++++------ src/devices/USBController/OHCI.h | 67 ++++++++----- src/devices/USBController/USBDevice.cpp | 23 +++-- src/devices/USBController/USBDevice.h | 124 ++++++++++++++++++++++++ 7 files changed, 256 insertions(+), 70 deletions(-) diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index d18d7461d..9f056e341 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -1239,7 +1239,9 @@ __declspec(noreturn) void CxbxKrnlInit // for unicode conversions setlocale(LC_ALL, "English"); + // Initialize time-related variables for the kernel and the timers CxbxInitPerformanceCounters(); + Timer_Init(); #ifdef _DEBUG // CxbxPopupMessage("Attach a Debugger"); // Debug child processes using https://marketplace.visualstudio.com/items?itemName=GreggMiskelly.MicrosoftChildProcessDebuggingPowerTool diff --git a/src/CxbxKrnl/Timer.cpp b/src/CxbxKrnl/Timer.cpp index ba2898c62..fecc8bb59 100644 --- a/src/CxbxKrnl/Timer.cpp +++ b/src/CxbxKrnl/Timer.cpp @@ -50,7 +50,7 @@ // Vector storing all the timers created static std::vector TimerList; -// The frequency of the high resolution timer of the host +// The frequency of the high resolution clock of the host static uint64_t ClockFrequency; @@ -161,7 +161,7 @@ void Timer_Start(TimerObject* Timer, uint64_t Expire_MS) std::thread(ClockThread, Timer).detach(); } -// Retrives the frequency of the high resolution timer of the host +// Retrives the frequency of the high resolution clock of the host void Timer_Init() { LARGE_INTEGER freq; diff --git a/src/CxbxKrnl/Timer.h b/src/CxbxKrnl/Timer.h index f2f58983b..09eb78021 100644 --- a/src/CxbxKrnl/Timer.h +++ b/src/CxbxKrnl/Timer.h @@ -54,8 +54,8 @@ TimerObject; /* Timer exported functions */ -TimerObject* Timer_Create(pTimerCB callback, void* arg, unsigned int Factor); -void Timer_Start(TimerObject* timer, uint64_t Expire_MS); +TimerObject* Timer_Create(pTimerCB Callback, void* Arg, unsigned int Factor); +void Timer_Start(TimerObject* Timer, uint64_t Expire_MS); void Timer_Exit(TimerObject* Timer); void Timer_ChangeExpireTime(TimerObject* Timer, uint64_t Expire_ms); void Timer_Init(); diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index 5ac135875..7078d10d6 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -37,12 +37,46 @@ #include "OHCI.h" #include "..\CxbxKrnl\CxbxKrnl.h" +#define USB_HZ 12000000 + + +typedef enum _USB_SPEED +{ + USB_SPEED_MASK_LOW = 1 << 0, + USB_SPEED_MASK_FULL = 1 << 1, +} +USB_SPEED; + // global pointers to the two USB host controllers available on the Xbox -OHCI_State* g_pHostController1 = nullptr; -OHCI_State* g_pHostController2 = nullptr; +OHCI* g_pHostController1 = nullptr; +OHCI* g_pHostController2 = nullptr; -void OHCI_State::HC_ChangeState(USB_State new_state) +OHCI::OHCI(USBDevice* UsbObj) +{ + UsbInstance = UsbObj; + + for (int i = 0; i < 2; i++) { + UsbInstance->USB_RegisterPort(&Registers.RhPort[i].Port, this, i, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); + } + USB_PacketInit(&UsbPacket); + + // Create the end-of-frame timer. Let's try a factor of 50 (1 virtual ms -> 50 real ms) + pEndOfFrameTimer = Timer_Create(OHCI_FrameBoundaryWrapper, this, 50); + + UsbFrameTime = 1000000ULL; // 1 ms + TicksPerUsbTick = 1000000000ULL / USB_HZ; // 83 + + // Do a hardware reset + OHCI_StateReset(); +} + +void OHCI::OHCI_FrameBoundaryWrapper(void* pVoid) +{ + static_cast(pVoid)->OHCI_FrameBoundaryWorker(); +} + +void OHCI::OHCI_StateReset() { // The usb state can be USB_Suspend if it is a software reset, and USB_Reset if it is a hardware // reset or cold boot @@ -50,39 +84,34 @@ void OHCI_State::HC_ChangeState(USB_State new_state) // TODO: stop all the list processing here // Reset all registers - if (new_state == USB_Reset) { - // Remark: the standard says that RemoteWakeupConnected bit should be set during POST, cleared during hw reset - // and ignored during a sw reset. However, VBox sets it on hw reset and XQEMU clears it. Considering that the Xbox - // doesn't do POST, I will clear it. - HC_Registers.HcControl = 0; - } - else { - HC_Registers.HcControl &= (OHCI_CTL_IR | OHCI_CTL_RWC); - } - HC_Registers.HcControl &= ~OHCI_CTL_HCFS; - HC_Registers.HcControl |= new_state; - HC_Registers.HcCommandStatus = 0; - HC_Registers.HcInterruptStatus = 0; - HC_Registers.HcInterruptEnable = OHCI_INTR_MASTER_INTERRUPT_ENABLED; // enable interrupts + // Remark: the standard says that RemoteWakeupConnected bit should be set during POST, cleared during hw reset + // and ignored during a sw reset. However, VBox sets it on hw reset and XQEMU clears it. Considering that the Xbox + // doesn't do POST, I will clear it. + Registers.HcControl = 0; + Registers.HcControl &= ~OHCI_CTL_HCFS; + Registers.HcControl |= Reset; + Registers.HcCommandStatus = 0; + Registers.HcInterruptStatus = 0; + Registers.HcInterruptEnable = OHCI_INTR_MASTER_INTERRUPT_ENABLED; // enable interrupts - HC_Registers.HcHCCA = 0; - HC_Registers.HcPeriodCurrentED = 0; - HC_Registers.HcControlHeadED = HC_Registers.HcControlCurrentED = 0; - HC_Registers.HcBulkHeadED = HC_Registers.HcBulkCurrentED = 0; - HC_Registers.HcDoneHead = 0; + Registers.HcHCCA = 0; + Registers.HcPeriodCurrentED = 0; + Registers.HcControlHeadED = Registers.HcControlCurrentED = 0; + Registers.HcBulkHeadED = Registers.HcBulkCurrentED = 0; + Registers.HcDoneHead = 0; - HC_Registers.HcFmInterval = 0; - HC_Registers.HcFmInterval |= (0x2778 << 16); // TBD according to the standard, using what XQEMU sets (FSLargestDataPacket) - HC_Registers.HcFmInterval |= 0x2EDF; // bit-time of a frame. 1 frame = 1 ms (FrameInterval) - HC_Registers.HcFmRemaining = 0; - HC_Registers.HcFmNumber = 0; - HC_Registers.HcPeriodicStart = 0; + Registers.HcFmInterval = 0; + Registers.HcFmInterval |= (0x2778 << 16); // TBD according to the standard, using what XQEMU sets (FSLargestDataPacket) + Registers.HcFmInterval |= 0x2EDF; // bit-time of a frame. 1 frame = 1 ms (FrameInterval) + Registers.HcFmRemaining = 0; + Registers.HcFmNumber = 0; + Registers.HcPeriodicStart = 0; - HC_Registers.HcRhDescriptorA = OHCI_RHA_NPS | 2; // The xbox lacks the hw to switch off the power on the ports and has 2 ports per HC - HC_Registers.HcRhDescriptorB = 0; // The attached devices are removable and use PowerSwitchingMode to control the power on the ports + Registers.HcRhDescriptorA = OHCI_RHA_NPS | 2; // The xbox lacks the hw to switch off the power on the ports and has 2 ports per HC + Registers.HcRhDescriptorB = 0; // The attached devices are removable and use PowerSwitchingMode to control the power on the ports for (int i = 0; i < 2; i++) { - OHCIPort* Port = &HC_Registers.RhPort[i]; + OHCIPort* Port = &Registers.RhPort[i]; Port->HcRhPortStatus = 0; //if (Port->port.device && Port->port.device->attached) { //usb_port_reset(&Port->port); @@ -90,4 +119,13 @@ void OHCI_State::HC_ChangeState(USB_State new_state) } DbgPrintf("Usb-Ohci: Reset\n"); -} \ No newline at end of file +} + +void OHCI::USB_PacketInit(USBPacket* packet) +{ + IOVector* vec = &packet->IoVec; + vec->IoVec = new IoVec; + vec->IoVecNumber = 0; + vec->AllocNumber = 1; + vec->Size = 0; +} diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index 048483938..86c712ad9 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -39,6 +39,8 @@ #include #include "Cxbx.h" +#include "USBDevice.h" +#include "..\CxbxKrnl\Timer.h" // Abbreviations used: @@ -67,16 +69,21 @@ #define OHCI_RHA_OCPM (1<<11) // OverCurrentProtectionMode #define OHCI_RHA_NOCP (1<<12) // NoOverCurrentProtection -// Struct describing the status of a usb port -struct USBPort { - //USBDevice* device; - //TODO -}; + +// enum indicating the current HC state +typedef enum _OHCI_State +{ + Reset = 0x00, + Resume = 0x40, + Operational = 0x80, + Suspend = 0xC0, +} +OHCI_State; // Small struct used to hold the HcRhPortStatus register and the usb port status typedef struct _OHCIPort { - USBPort port; + USBPort Port; uint32_t HcRhPortStatus; } OHCIPort; @@ -116,38 +123,46 @@ typedef struct _OHCI_Registers } OHCI_Registers; -// enum indicating the current HC state -typedef enum _USB_State -{ - USB_Reset = 0x00, - USB_Resume = 0x40, - USB_Operational = 0x80, - USB_Suspend = 0xC0, -} -USB_State; - /* OHCI class representing the state of the HC */ -class OHCI_State +class OHCI { public: // constructor - OHCI_State() {} + OHCI(USBDevice* UsbObj); // destructor - ~OHCI_State() {} + ~OHCI() {} // read a register - uint32_t HC_ReadRegister(xbaddr addr); + uint32_t OHCI_ReadRegister(xbaddr Addr); // write a register - void HC_WriteRegister(xbaddr addr, uint32_t value); - // reset the HC to the default state - void HC_ChangeState(USB_State new_state); + void OHCI_WriteRegister(xbaddr Addr, uint32_t Value); + // switch the HC to the reset state + void OHCI_StateReset(); + private: // all the registers available on the OHCI standard - OHCI_Registers HC_Registers; + OHCI_Registers Registers; + // end-of-frame timer + TimerObject* pEndOfFrameTimer; + // the duration of a usb frame + uint64_t UsbFrameTime; + // ticks per usb tick + uint64_t TicksPerUsbTick; + // the usb device instance of this HC + USBDevice* UsbInstance; + // usb packet + USBPacket UsbPacket; + + // end-of-frame callback wrapper + static void OHCI_FrameBoundaryWrapper(void* pVoid); + // end-of-frame callback function + void OHCI_FrameBoundaryWorker(); + // initialize packet struct + void USB_PacketInit(USBPacket* packet); }; -extern OHCI_State* g_pHostController1; -extern OHCI_State* g_pHostController2; +extern OHCI* g_pHostController1; +extern OHCI* g_pHostController2; #endif diff --git a/src/devices/USBController/USBDevice.cpp b/src/devices/USBController/USBDevice.cpp index 1e81f6a91..4a96286e9 100644 --- a/src/devices/USBController/USBDevice.cpp +++ b/src/devices/USBController/USBDevice.cpp @@ -52,13 +52,11 @@ void USBDevice::Init(unsigned int address) m_VendorId = PCI_VENDOR_ID_NVIDIA; if (address == USB0_BASE) { - g_pHostController1 = new OHCI_State; - g_pHostController1->HC_ChangeState(USB_Reset); + g_pHostController1 = new OHCI(this); return; } - g_pHostController2 = new OHCI_State; - g_pHostController2->HC_ChangeState(USB_Reset); + g_pHostController2 = new OHCI(this); } uint32_t USBDevice::MMIORead(int barIndex, uint32_t addr, unsigned size) @@ -69,11 +67,11 @@ uint32_t USBDevice::MMIORead(int barIndex, uint32_t addr, unsigned size) // Figure out the correct OHCI object and read the register if (addr >= USB1_BASE) { // USB1 queried - return g_pHostController2->HC_ReadRegister(addr); + return g_pHostController2->OHCI_ReadRegister(addr); } // USB0 queried - return g_pHostController1->HC_ReadRegister(addr); + return g_pHostController1->OHCI_ReadRegister(addr); } void USBDevice::MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned size) @@ -84,10 +82,19 @@ void USBDevice::MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned // Figure out the correct OHCI object and write the value to the register if (addr >= USB1_BASE) { // USB1 queried - g_pHostController2->HC_WriteRegister(addr, value); + g_pHostController2->OHCI_WriteRegister(addr, value); return; } // USB0 queried - g_pHostController1->HC_WriteRegister(addr, value); + g_pHostController1->OHCI_WriteRegister(addr, value); +} + +void USBDevice::USB_RegisterPort(USBPort* Port, OHCI* Obj, int Index, int SpeedMask) +{ + Port->Opaque = Obj; + Port->PortIndex = Index; + Port->SpeedMask = SpeedMask; + Port->HubCount = 0; + std::snprintf(Port->Path, sizeof(Port->Path), "%d", Index + 1); } diff --git a/src/devices/USBController/USBDevice.h b/src/devices/USBController/USBDevice.h index 07fe757c5..80ab0907b 100644 --- a/src/devices/USBController/USBDevice.h +++ b/src/devices/USBController/USBDevice.h @@ -39,6 +39,126 @@ #include "..\PCIDevice.h" #include "OHCI.h" + +// This is a linux struct for vectored I/O. See readv() and writev() +typedef struct _IoVec +{ + void* Iov_Base; + size_t Iov_Len; +} +IoVec; + +typedef struct _IOVector +{ + IoVec* IoVec; + int IoVecNumber; // TODO + int AllocNumber; // TODO + size_t Size; +} +IOVector; + +// definition of a USB device +typedef struct _USBDev +{ + DeviceState qdev; + USBPort *port; + char *port_path; + char *serial; + void *opaque; + uint32_t flags; + + // Actual connected speed + int speed; + // Supported speeds, not in info because it may be variable (hostdevs) + int speedmask; + uint8_t addr; + char product_desc[32]; + int auto_attach; + int attached; + + int32_t state; + uint8_t setup_buf[8]; + uint8_t data_buf[4096]; + int32_t remote_wakeup; + int32_t setup_state; + int32_t setup_len; + int32_t setup_index; + + USBEndpoint ep_ctl; + USBEndpoint ep_in[USB_MAX_ENDPOINTS]; + USBEndpoint ep_out[USB_MAX_ENDPOINTS]; + + //QLIST_HEAD(, USBDescString) strings; + const USBDesc *usb_desc; // Overrides class usb_desc if not NULL + const USBDescDevice *device; + + int configuration; + int ninterfaces; + int altsetting[USB_MAX_INTERFACES]; + const USBDescConfig *config; + const USBDescIface *ifaces[USB_MAX_INTERFACES]; +} +USBDev; + +typedef struct _USBEndpoint +{ + uint8_t nr; + uint8_t pid; + uint8_t type; + uint8_t ifnum; + int max_packet_size; + bool pipeline; + bool halted; + USBDevice *dev; + //QTAILQ_HEAD(, USBPacket) queue; +} +USBEndpoint; + +// Structure used to hold information about an active USB packet +typedef struct _USBPacket +{ + // Data fields for use by the driver + int Pid; + uint64_t Id; + USBEndpoint* Endpoint; + unsigned int stream; + IOVector IoVec; // used to perform vectored I/O + uint64_t parameter; // control transfers + bool short_not_ok; + bool int_req; + int status; // USB_RET_* status code + int actual_length; // Number of bytes actually transferred + // Internal use by the USB layer + USBPacketState state; + USBCombinedPacket *combined; + //QTAILQ_ENTRY(USBPacket) queue; + //QTAILQ_ENTRY(USBPacket) combined_entry; +} +USBPacket; + +// Struct describing the status of a usb port +typedef struct _USBPort { + USBDev *Dev; + int SpeedMask; // usb speeds supported + int HubCount; // number of hubs attached + char Path[16]; // the number of the port + OHCI* Opaque; // OHCI* to let USBPort access it + int PortIndex; // internal port index, may be used with the Opaque + //QTAILQ_ENTRY(USBPort) next; + // a device is attched + void Attach(USBPort* port); + // a device is detached + void Detach(USBPort* port); + // a device downstream from the device attached to the port (attached through a hub) is detached + void ChildDetach(USBPort* port, USBDev* child); + // TODO + void Wakeup(USBPort* port); + // TODO + void Complete(USBPort* port, USBPacket *p); +} +USBPort; + + class USBDevice : public PCIDevice { public: // constructor @@ -54,6 +174,10 @@ class USBDevice : public PCIDevice { void IOWrite(int barIndex, uint32_t port, uint32_t value, unsigned size) {} uint32_t MMIORead(int barIndex, uint32_t addr, unsigned size); void MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned size); + + // USB specific functions + // register a port with the HC + void USB_RegisterPort(USBPort* Port, OHCI* Obj, int Index, int SpeedMask); }; #endif From f9cb91810fbee4f8d2eb5ed6c113865a96fdf675 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Wed, 23 May 2018 00:04:57 +0200 Subject: [PATCH 0021/1000] Read/write ohci registers --- src/devices/USBController/OHCI.cpp | 246 ++++++++++++++++++++++++++++- src/devices/USBController/OHCI.h | 21 ++- 2 files changed, 260 insertions(+), 7 deletions(-) diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index 7078d10d6..1e8f11165 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -59,7 +59,7 @@ OHCI::OHCI(USBDevice* UsbObj) for (int i = 0; i < 2; i++) { UsbInstance->USB_RegisterPort(&Registers.RhPort[i].Port, this, i, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); } - USB_PacketInit(&UsbPacket); + OHCI_PacketInit(&UsbPacket); // Create the end-of-frame timer. Let's try a factor of 50 (1 virtual ms -> 50 real ms) pEndOfFrameTimer = Timer_Create(OHCI_FrameBoundaryWrapper, this, 50); @@ -87,12 +87,13 @@ void OHCI::OHCI_StateReset() // Remark: the standard says that RemoteWakeupConnected bit should be set during POST, cleared during hw reset // and ignored during a sw reset. However, VBox sets it on hw reset and XQEMU clears it. Considering that the Xbox // doesn't do POST, I will clear it. + Registers.HcRevision = 0x10; Registers.HcControl = 0; Registers.HcControl &= ~OHCI_CTL_HCFS; Registers.HcControl |= Reset; Registers.HcCommandStatus = 0; Registers.HcInterruptStatus = 0; - Registers.HcInterruptEnable = OHCI_INTR_MASTER_INTERRUPT_ENABLED; // enable interrupts + Registers.HcInterrupt = OHCI_INTR_MASTER_INTERRUPT_ENABLED; // enable interrupts Registers.HcHCCA = 0; Registers.HcPeriodCurrentED = 0; @@ -118,10 +119,10 @@ void OHCI::OHCI_StateReset() //} } - DbgPrintf("Usb-Ohci: Reset\n"); + DbgPrintf("Ohci: Reset event.\n"); } -void OHCI::USB_PacketInit(USBPacket* packet) +void OHCI::OHCI_PacketInit(USBPacket* packet) { IOVector* vec = &packet->IoVec; vec->IoVec = new IoVec; @@ -129,3 +130,240 @@ void OHCI::USB_PacketInit(USBPacket* packet) vec->AllocNumber = 1; vec->Size = 0; } + +uint32_t OHCI::OHCI_ReadRegister(xbaddr Addr) +{ + uint32_t ret = 0xFFFFFFFF; + + if (Addr & 3) { + // The standard allows only aligned reads to the registers + DbgPrintf("Ohci: Unaligned read. Ignoring.\n"); + return ret; + } + else { + switch (Addr >> 2) // read the register + { + case 0: // HcRevision + ret = Registers.HcRevision; + break; + + case 1: // HcControl + ret = Registers.HcControl; + break; + + case 2: // HcCommandStatus + ret = Registers.HcCommandStatus; + break; + + case 3: // HcInterruptStatus + ret = Registers.HcInterruptStatus; + break; + + case 4: // HcInterruptEnable + case 5: // HcInterruptDisable + ret = Registers.HcInterrupt; + break; + + case 6: // HcHCCA + ret = Registers.HcHCCA; + break; + + case 7: // HcPeriodCurrentED + ret = Registers.HcPeriodCurrentED; + break; + + case 8: // HcControlHeadED + ret = Registers.HcControlHeadED; + break; + + case 9: // HcControlCurrentED + ret = Registers.HcControlCurrentED; + break; + + case 10: // HcBulkHeadED + ret = Registers.HcBulkHeadED; + break; + + case 11: // HcBulkCurrentED + ret = Registers.HcBulkCurrentED; + break; + + case 12: // HcDoneHead + ret = Registers.HcDoneHead; + break; + + case 13: // HcFmInterval + ret = Registers.HcFmInterval; + break; + + case 14: // HcFmRemaining + // TODO + break; + + case 15: // HcFmNumber + ret = Registers.HcFmNumber; + break; + + case 16: // HcPeriodicStart + ret = Registers.HcPeriodicStart; + break; + + case 17: // HcLSThreshold + ret = Registers.HcLSThreshold; + break; + + case 18: // HcRhDescriptorA + ret = Registers.HcRhDescriptorA; + break; + + case 19: // HcRhDescriptorB + ret = Registers.HcRhDescriptorB; + break; + + case 20: // HcRhStatus + ret = Registers.HcRhStatus; + break; + + // Always report that the port power is on since the Xbox cannot switch off the electrical current to it + case 21: // RhPort 0 + ret = Registers.RhPort[0].HcRhPortStatus | OHCI_PORT_PPS; + break; + + case 22: // RhPort 1 + ret = Registers.RhPort[1].HcRhPortStatus | OHCI_PORT_PPS; + break; + + default: + DbgPrintf("Ohci: Read register operation with bad offset %u. Ignoring.\n", Addr >> 2); + } + return ret; + } +} + +void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) +{ + if (Addr & 3) { + // The standard allows only aligned writes to the registers + DbgPrintf("Ohci: Unaligned write. Ignoring.\n"); + return; + } + else { + switch (Addr >> 2) + { + case 0: // HcRevision + // This register is read-only + break; + + case 1: // HcControl + // TODO + break; + + case 2: // HcCommandStatus + { + // SOC is read-only + Value &= ~OHCI_STATUS_SOC; + + // From the standard: "The Host Controller must ensure that bits written as ‘1’ become set + // in the register while bits written as ‘0’ remain unchanged in the register." + Registers.HcCommandStatus |= Value; + + if (Registers.HcCommandStatus & OHCI_STATUS_HCR) { + // Do a hardware reset + OHCI_StateReset(); + } + } + break; + + case 3: // HcInterruptStatus + // TODO + break; + + case 4: // HcInterruptEnable + // TODO + break; + + case 5: // HcInterruptDisable + // TODO + break; + + case 6: // HcHCCA + // The standard says the minimum alignment is 256 bytes and so bits 0 through 7 are always zero + Registers.HcHCCA = Value & OHCI_HCCA_MASK; + break; + + case 7: // HcPeriodCurrentED + // This register is read-only + break; + + case 8: // HcControlHeadED + Registers.HcControlHeadED = Value & OHCI_EDPTR_MASK; + break; + + case 9: // HcControlCurrentED + Registers.HcControlCurrentED = Value & OHCI_EDPTR_MASK; + break; + + case 10: // HcBulkHeadED + Registers.HcBulkHeadED = Value & OHCI_EDPTR_MASK; + break; + + case 11: // HcBulkCurrentED + Registers.HcBulkCurrentED = Value & OHCI_EDPTR_MASK; + break; + + case 12: // HcDoneHead + // This register is read-only + break; + + case 13: // HcFmInterval + { + if ((Value & OHCI_FMI_FIT) != (Registers.HcFmInterval & OHCI_FMI_FIT)) { + DbgPrintf("Ohci: Changing frame interval duration. New value is %u\n", Value & OHCI_FMI_FI); + } + Registers.HcFmInterval = Value & ~0xC000; + } + break; + + case 14: // HcFmRemaining + // This register is read-only + break; + + case 15: // HcFmNumber + // This register is read-only + break; + + case 16: // HcPeriodicStart + Registers.HcPeriodicStart = Value & 0x3FFF; + break; + + case 17: // HcLSThreshold + Registers.HcLSThreshold = Value & 0xFFF; + break; + + case 18: // HcRhDescriptorA + Registers.HcRhDescriptorA &= ~OHCI_RHA_RW_MASK; + Registers.HcRhDescriptorA |= Value & OHCI_RHA_RW_MASK; // ?? + break; + + case 19: // HcRhDescriptorB + // Don't do anything, the attached devices are all removable and PowerSwitchingMode is always 0 + break; + + case 20: // HcRhStatus + // TODO + break; + + case 21: // RhPort 0 + // TODO + break; + + case 22: // RhPort 1 + // TODO + break; + + default: + DbgPrintf("Ohci: Write register operation with bad offset %u. Ignoring.\n", Addr >> 2); + break; + } + } +} diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index 86c712ad9..48d950534 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -60,14 +60,30 @@ #define OHCI_CTL_IR (1<<8) // InterruptRouting #define OHCI_CTL_RWC (1<<9) // RemoteWakeupConnected #define OHCI_CTL_RWE (1<<10) // RemoteWakeupEnable +// HcCommandStatus +#define OHCI_STATUS_HCR (1<<0) // HostControllerReset +#define OHCI_STATUS_CLF (1<<1) // ControlListFilled +#define OHCI_STATUS_BLF (1<<2) // BulkListFilled +#define OHCI_STATUS_OCR (1<<3) // OwnershipChangeRequest +#define OHCI_STATUS_SOC ((1<<6)|(1<<7)) // SchedulingOverrunCount // HcInterruptEnable, HcInterruptDisable #define OHCI_INTR_MASTER_INTERRUPT_ENABLED (1<<31) // MasterInterruptEnable +// HcHCCA +#define OHCI_HCCA_MASK 0xFFFFFF00 // HCCA mask +// HcControlHeadED +#define OHCI_EDPTR_MASK 0xFFFFFFF0 // endpoint descriptor mask +// HcFmInterval +#define OHCI_FMI_FI 0x00003FFF // FrameInterval +#define OHCI_FMI_FIT 0x80000000 // FrameIntervalToggle // HcRhDescriptorA +#define OHCI_RHA_RW_MASK 0x00000000 // Mask of supported features #define OHCI_RHA_PSM (1<<8) // PowerSwitchingMode #define OHCI_RHA_NPS (1<<9) // NoPowerSwitching #define OHCI_RHA_DT (1<<10) // DeviceType #define OHCI_RHA_OCPM (1<<11) // OverCurrentProtectionMode #define OHCI_RHA_NOCP (1<<12) // NoOverCurrentProtection +// HcRhPortStatus +#define OHCI_PORT_PPS (1<<8) // enum indicating the current HC state @@ -96,8 +112,7 @@ typedef struct _OHCI_Registers uint32_t HcControl; uint32_t HcCommandStatus; uint32_t HcInterruptStatus; - uint32_t HcInterruptEnable; - uint32_t HcInterruptDisable; + uint32_t HcInterrupt; // HcInterruptEnable/Disable are the same so we can merge them together // Memory Pointer partition uint32_t HcHCCA; @@ -159,7 +174,7 @@ class OHCI // end-of-frame callback function void OHCI_FrameBoundaryWorker(); // initialize packet struct - void USB_PacketInit(USBPacket* packet); + void OHCI_PacketInit(USBPacket* packet); }; extern OHCI* g_pHostController1; From 48f861b6e8f1e07622b34691f0c58c5eaf13414d Mon Sep 17 00:00:00 2001 From: ergo720 Date: Wed, 23 May 2018 17:04:20 +0200 Subject: [PATCH 0022/1000] USB state modes + small update to timers --- src/CxbxKrnl/Timer.cpp | 10 ++-- src/CxbxKrnl/Timer.h | 3 +- src/devices/USBController/OHCI.cpp | 77 ++++++++++++++++++++++++++---- src/devices/USBController/OHCI.h | 24 +++++++--- 4 files changed, 92 insertions(+), 22 deletions(-) diff --git a/src/CxbxKrnl/Timer.cpp b/src/CxbxKrnl/Timer.cpp index fecc8bb59..85d6ae95d 100644 --- a/src/CxbxKrnl/Timer.cpp +++ b/src/CxbxKrnl/Timer.cpp @@ -80,7 +80,7 @@ static inline uint64_t Muldiv64(uint64_t a, uint32_t b, uint32_t c) } // Returns the current time of the timer -static inline uint64_t GetTime_NS(TimerObject* Timer) +inline uint64_t GetTime_NS(TimerObject* Timer) { LARGE_INTEGER li; QueryPerformanceCounter(&li); @@ -117,13 +117,13 @@ void ClockThread(TimerObject* Timer) while (true) { if (GetTime_NS(Timer) > NewExpireTime) { + if (Timer->Exit.load()) { + Timer_Destroy(Timer); + return; + } Timer->Callback(Timer->Opaque); NewExpireTime = GetNextExpireTime(Timer); } - if (Timer->Exit.load()) { - Timer_Destroy(Timer); - return; - } } } diff --git a/src/CxbxKrnl/Timer.h b/src/CxbxKrnl/Timer.h index 09eb78021..f9dc64aad 100644 --- a/src/CxbxKrnl/Timer.h +++ b/src/CxbxKrnl/Timer.h @@ -39,7 +39,7 @@ #include -/* typedef of the timer object and the callback function*/ +/* typedef of the timer object and the callback function */ typedef void(*pTimerCB)(void*); typedef struct _TimerObject { @@ -58,6 +58,7 @@ TimerObject* Timer_Create(pTimerCB Callback, void* Arg, unsigned int Factor); void Timer_Start(TimerObject* Timer, uint64_t Expire_MS); void Timer_Exit(TimerObject* Timer); void Timer_ChangeExpireTime(TimerObject* Timer, uint64_t Expire_ms); +inline uint64_t GetTime_NS(TimerObject* Timer); void Timer_Init(); #endif diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index 1e8f11165..e1d1c8328 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -36,6 +36,7 @@ #include "OHCI.h" #include "..\CxbxKrnl\CxbxKrnl.h" +#include "..\CxbxKrnl\Emu.h" // For EmuWarning #define USB_HZ 12000000 @@ -61,9 +62,6 @@ OHCI::OHCI(USBDevice* UsbObj) } OHCI_PacketInit(&UsbPacket); - // Create the end-of-frame timer. Let's try a factor of 50 (1 virtual ms -> 50 real ms) - pEndOfFrameTimer = Timer_Create(OHCI_FrameBoundaryWrapper, this, 50); - UsbFrameTime = 1000000ULL; // 1 ms TicksPerUsbTick = 1000000000ULL / USB_HZ; // 83 @@ -122,6 +120,68 @@ void OHCI::OHCI_StateReset() DbgPrintf("Ohci: Reset event.\n"); } +void OHCI::OHCI_BusStart() +{ + // Create the end-of-frame timer. Let's try a factor of 50 (1 virtual ms -> 50 real ms) + pEOFtimer = Timer_Create(OHCI_FrameBoundaryWrapper, this, 50); + + DbgPrintf("Ohci: Operational event\n"); + + // SOF event + OHCI_SOF(); +} + +void OHCI::OHCI_BusStop() +{ + if (pEOFtimer) { + // Delete existing EOF timer + Timer_Exit(pEOFtimer); + } + pEOFtimer = nullptr; +} + +void OHCI::OHCI_SOF() +{ + SOFtime = GetTime_NS(pEOFtimer); // set current SOF time + Timer_Start(pEOFtimer, SOFtime + UsbFrameTime); // make timer expire at SOF + 1 virtual ms from now + // TODO: interrupt +} + +void OHCI::OHCI_ChangeState(uint32_t Value) +{ + uint32_t OldState = Registers.HcControl & OHCI_CTL_HCFS; + Registers.HcControl = Value; + uint32_t NewState = Registers.HcControl & OHCI_CTL_HCFS; + + // no state change + if (OldState == NewState) { + return; + } + + switch (NewState) + { + case Operational: + OHCI_BusStart(); + break; + + case Suspend: + OHCI_BusStop(); + DbgPrintf("Ohci: Suspend event\n"); + break; + + case Resume: + DbgPrintf("Ohci: Resume event\n"); + break; + + case Reset: + OHCI_StateReset(); + break; + + default: + EmuWarning("Ohci: Unknown USB state mode!"); + } +} + void OHCI::OHCI_PacketInit(USBPacket* packet) { IOVector* vec = &packet->IoVec; @@ -137,7 +197,7 @@ uint32_t OHCI::OHCI_ReadRegister(xbaddr Addr) if (Addr & 3) { // The standard allows only aligned reads to the registers - DbgPrintf("Ohci: Unaligned read. Ignoring.\n"); + EmuWarning("Ohci: Unaligned read. Ignoring."); return ret; } else { @@ -234,7 +294,7 @@ uint32_t OHCI::OHCI_ReadRegister(xbaddr Addr) break; default: - DbgPrintf("Ohci: Read register operation with bad offset %u. Ignoring.\n", Addr >> 2); + EmuWarning("Ohci: Read register operation with bad offset %u. Ignoring.", Addr >> 2); } return ret; } @@ -244,7 +304,7 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) { if (Addr & 3) { // The standard allows only aligned writes to the registers - DbgPrintf("Ohci: Unaligned write. Ignoring.\n"); + EmuWarning("Ohci: Unaligned write. Ignoring."); return; } else { @@ -255,7 +315,7 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) break; case 1: // HcControl - // TODO + OHCI_ChangeState(Value); break; case 2: // HcCommandStatus @@ -362,8 +422,7 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) break; default: - DbgPrintf("Ohci: Write register operation with bad offset %u. Ignoring.\n", Addr >> 2); - break; + EmuWarning("Ohci: Write register operation with bad offset %u. Ignoring.", Addr >> 2); } } } diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index 48d950534..9894bedbd 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -83,7 +83,7 @@ #define OHCI_RHA_OCPM (1<<11) // OverCurrentProtectionMode #define OHCI_RHA_NOCP (1<<12) // NoOverCurrentProtection // HcRhPortStatus -#define OHCI_PORT_PPS (1<<8) +#define OHCI_PORT_PPS (1<<8) // PortPowerStatus // enum indicating the current HC state @@ -139,7 +139,7 @@ typedef struct _OHCI_Registers OHCI_Registers; -/* OHCI class representing the state of the HC */ +// OHCI class representing the state of the HC class OHCI { public: @@ -151,15 +151,15 @@ class OHCI uint32_t OHCI_ReadRegister(xbaddr Addr); // write a register void OHCI_WriteRegister(xbaddr Addr, uint32_t Value); - // switch the HC to the reset state - void OHCI_StateReset(); private: // all the registers available on the OHCI standard OHCI_Registers Registers; // end-of-frame timer - TimerObject* pEndOfFrameTimer; + TimerObject* pEOFtimer; + // time at which a SOF was sent + uint64_t SOFtime; // the duration of a usb frame uint64_t UsbFrameTime; // ticks per usb tick @@ -169,12 +169,22 @@ class OHCI // usb packet USBPacket UsbPacket; - // end-of-frame callback wrapper + // EOF callback wrapper static void OHCI_FrameBoundaryWrapper(void* pVoid); - // end-of-frame callback function + // EOF callback function void OHCI_FrameBoundaryWorker(); // initialize packet struct void OHCI_PacketInit(USBPacket* packet); + // change usb state mode + void OHCI_ChangeState(uint32_t Value); + // switch the HC to the reset state + void OHCI_StateReset(); + // start sending SOF tokens across the usb bus + void OHCI_BusStart(); + // stop sending SOF tokens across the usb bus + void OHCI_BusStop(); + // generate a SOF event, and start a timer for EOF + void OHCI_SOF(); }; extern OHCI* g_pHostController1; From 685227d874cb5b4cf4499dc13af4a32b6339beac Mon Sep 17 00:00:00 2001 From: ergo720 Date: Mon, 28 May 2018 00:49:19 +0200 Subject: [PATCH 0023/1000] Interrupt stuff --- src/devices/USBController/OHCI.cpp | 37 ++++++++++++++++++------- src/devices/USBController/OHCI.h | 13 +++++++-- src/devices/USBController/USBDevice.cpp | 5 ++-- src/devices/USBController/USBDevice.h | 1 - 4 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index e1d1c8328..b76c1c398 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -35,8 +35,7 @@ // ****************************************************************** #include "OHCI.h" -#include "..\CxbxKrnl\CxbxKrnl.h" -#include "..\CxbxKrnl\Emu.h" // For EmuWarning +#include "CxbxKrnl\EmuKrnl.h" // For HalSystemInterrupt #define USB_HZ 12000000 @@ -53,9 +52,10 @@ OHCI* g_pHostController1 = nullptr; OHCI* g_pHostController2 = nullptr; -OHCI::OHCI(USBDevice* UsbObj) +OHCI::OHCI(USBDevice* UsbObj, int Irq) { UsbInstance = UsbObj; + Irq_n = Irq; for (int i = 0; i < 2; i++) { UsbInstance->USB_RegisterPort(&Registers.RhPort[i].Port, this, i, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); @@ -91,7 +91,7 @@ void OHCI::OHCI_StateReset() Registers.HcControl |= Reset; Registers.HcCommandStatus = 0; Registers.HcInterruptStatus = 0; - Registers.HcInterrupt = OHCI_INTR_MASTER_INTERRUPT_ENABLED; // enable interrupts + Registers.HcInterrupt = OHCI_INTR_MIE; // enable interrupts Registers.HcHCCA = 0; Registers.HcPeriodCurrentED = 0; @@ -144,7 +144,7 @@ void OHCI::OHCI_SOF() { SOFtime = GetTime_NS(pEOFtimer); // set current SOF time Timer_Start(pEOFtimer, SOFtime + UsbFrameTime); // make timer expire at SOF + 1 virtual ms from now - // TODO: interrupt + OHCI_SetInterrupt(OHCI_INTR_SF); } void OHCI::OHCI_ChangeState(uint32_t Value) @@ -323,8 +323,8 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) // SOC is read-only Value &= ~OHCI_STATUS_SOC; - // From the standard: "The Host Controller must ensure that bits written as ‘1’ become set - // in the register while bits written as ‘0’ remain unchanged in the register." + // From the standard: "The Host Controller must ensure that bits written as 1 become set + // in the register while bits written as 0 remain unchanged in the register." Registers.HcCommandStatus |= Value; if (Registers.HcCommandStatus & OHCI_STATUS_HCR) { @@ -335,15 +335,18 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) break; case 3: // HcInterruptStatus - // TODO + Registers.HcInterruptStatus &= ~Value; + OHCI_UpdateInterrupt(); break; case 4: // HcInterruptEnable - // TODO + Registers.HcInterrupt |= Value; + OHCI_UpdateInterrupt(); break; case 5: // HcInterruptDisable - // TODO + Registers.HcInterrupt &= ~Value; + OHCI_UpdateInterrupt(); break; case 6: // HcHCCA @@ -426,3 +429,17 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) } } } + +void OHCI::OHCI_UpdateInterrupt() +{ + if ((Registers.HcInterrupt & OHCI_INTR_MIE) && (Registers.HcInterruptStatus & Registers.HcInterrupt)) { + HalSystemInterrupts[Irq_n].Assert(true); + } + else { HalSystemInterrupts[Irq_n].Assert(false); } +} + +void OHCI::OHCI_SetInterrupt(uint32_t Value) +{ + Registers.HcInterruptStatus |= Value; + OHCI_UpdateInterrupt(); +} diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index 9894bedbd..fe5d70c86 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -37,7 +37,6 @@ #ifndef OHCI_H_ #define OHCI_H_ -#include #include "Cxbx.h" #include "USBDevice.h" #include "..\CxbxKrnl\Timer.h" @@ -66,8 +65,10 @@ #define OHCI_STATUS_BLF (1<<2) // BulkListFilled #define OHCI_STATUS_OCR (1<<3) // OwnershipChangeRequest #define OHCI_STATUS_SOC ((1<<6)|(1<<7)) // SchedulingOverrunCount +// HcInterruptStatus +#define OHCI_INTR_SF (1<<2) // Start of frame // HcInterruptEnable, HcInterruptDisable -#define OHCI_INTR_MASTER_INTERRUPT_ENABLED (1<<31) // MasterInterruptEnable +#define OHCI_INTR_MIE (1<<31) // MasterInterruptEnable // HcHCCA #define OHCI_HCCA_MASK 0xFFFFFF00 // HCCA mask // HcControlHeadED @@ -144,7 +145,7 @@ class OHCI { public: // constructor - OHCI(USBDevice* UsbObj); + OHCI(USBDevice* UsbObj, int Irqn); // destructor ~OHCI() {} // read a register @@ -168,6 +169,8 @@ class OHCI USBDevice* UsbInstance; // usb packet USBPacket UsbPacket; + // irq number + int Irq_n; // EOF callback wrapper static void OHCI_FrameBoundaryWrapper(void* pVoid); @@ -185,6 +188,10 @@ class OHCI void OHCI_BusStop(); // generate a SOF event, and start a timer for EOF void OHCI_SOF(); + // change interrupt status + void OHCI_UpdateInterrupt(); + // fire an interrupt + void OHCI_SetInterrupt(uint32_t Value); }; extern OHCI* g_pHostController1; diff --git a/src/devices/USBController/USBDevice.cpp b/src/devices/USBController/USBDevice.cpp index 4a96286e9..4454d0f11 100644 --- a/src/devices/USBController/USBDevice.cpp +++ b/src/devices/USBController/USBDevice.cpp @@ -35,6 +35,7 @@ // ****************************************************************** #include "USBDevice.h" +#include "OHCI.h" #include @@ -52,11 +53,11 @@ void USBDevice::Init(unsigned int address) m_VendorId = PCI_VENDOR_ID_NVIDIA; if (address == USB0_BASE) { - g_pHostController1 = new OHCI(this); + g_pHostController1 = new OHCI(this, 1); return; } - g_pHostController2 = new OHCI(this); + g_pHostController2 = new OHCI(this, 9); } uint32_t USBDevice::MMIORead(int barIndex, uint32_t addr, unsigned size) diff --git a/src/devices/USBController/USBDevice.h b/src/devices/USBController/USBDevice.h index 80ab0907b..2839b0809 100644 --- a/src/devices/USBController/USBDevice.h +++ b/src/devices/USBController/USBDevice.h @@ -37,7 +37,6 @@ #define USBDEVICE_H_ #include "..\PCIDevice.h" -#include "OHCI.h" // This is a linux struct for vectored I/O. See readv() and writev() From 421a5b8754be11a881fe1e97bc38f07a33826675 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Mon, 28 May 2018 21:14:21 +0200 Subject: [PATCH 0024/1000] Usb port stuff (wip) --- src/devices/USBController/OHCI.cpp | 98 ++++++++++++++++--- src/devices/USBController/OHCI.h | 54 +++++++++-- src/devices/USBController/USBDevice.cpp | 34 +++---- src/devices/USBController/USBDevice.h | 121 +++++++++++++++++------- 4 files changed, 234 insertions(+), 73 deletions(-) diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index b76c1c398..669fad9cb 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -47,18 +47,13 @@ typedef enum _USB_SPEED } USB_SPEED; -// global pointers to the two USB host controllers available on the Xbox -OHCI* g_pHostController1 = nullptr; -OHCI* g_pHostController2 = nullptr; - -OHCI::OHCI(USBDevice* UsbObj, int Irq) +OHCI::OHCI(int Irq) { - UsbInstance = UsbObj; Irq_n = Irq; for (int i = 0; i < 2; i++) { - UsbInstance->USB_RegisterPort(&Registers.RhPort[i].Port, this, i, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); + USB_RegisterPort(&Registers.RhPort[i].UsbPort, i, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); } OHCI_PacketInit(&UsbPacket); @@ -79,7 +74,7 @@ void OHCI::OHCI_StateReset() // The usb state can be USB_Suspend if it is a software reset, and USB_Reset if it is a hardware // reset or cold boot - // TODO: stop all the list processing here + OHCI_BusStop(); // Reset all registers // Remark: the standard says that RemoteWakeupConnected bit should be set during POST, cleared during hw reset @@ -112,11 +107,13 @@ void OHCI::OHCI_StateReset() { OHCIPort* Port = &Registers.RhPort[i]; Port->HcRhPortStatus = 0; - //if (Port->port.device && Port->port.device->attached) { - //usb_port_reset(&Port->port); - //} + if (Port->UsbPort.Dev && Port->UsbPort.Dev->Attached) { + USB_PortReset(&Port->UsbPort); + } } + OHCI_StopEndpoints(); + DbgPrintf("Ohci: Reset event.\n"); } @@ -443,3 +440,82 @@ void OHCI::OHCI_SetInterrupt(uint32_t Value) Registers.HcInterruptStatus |= Value; OHCI_UpdateInterrupt(); } + +void OHCI::OHCI_StopEndpoints() +{ + USBDev* dev; + int i, j; + + for (i = 0; i < 2; i++) { + dev = Registers.RhPort[i].UsbPort.Dev; + if (dev && dev->Attached) { + USB_DeviceEPstopped(dev, &dev->EP_ctl); + for (j = 0; j < USB_MAX_ENDPOINTS; j++) { + USB_DeviceEPstopped(dev, &dev->EP_in[j]); + USB_DeviceEPstopped(dev, &dev->EP_out[j]); + } + } + } +} + +void OHCI::OHCI_Detach(USBPort* Port) +{ + OHCIPort* port = &Registers.RhPort[Port->PortIndex]; + uint32_t old_state = port->HcRhPortStatus; + + ohci_async_cancel_device(Port->Dev); + + // set connect status + if (port->HcRhPortStatus & OHCI_PORT_CCS) { + port->HcRhPortStatus &= ~OHCI_PORT_CCS; + port->HcRhPortStatus |= OHCI_PORT_CSC; + } + // disable port + if (port->HcRhPortStatus & OHCI_PORT_PES) { + port->HcRhPortStatus &= ~OHCI_PORT_PES; + port->HcRhPortStatus |= OHCI_PORT_PESC; + } + + DbgPrintf("Ohci: Detached port %d\n", Port->PortIndex); + + if (old_state != port->HcRhPortStatus) { + OHCI_SetInterrupt(OHCI_INTR_RHSC); + } +} + +void OHCI::USB_RegisterPort(USBPort* Port, int Index, int SpeedMask) +{ + Port->PortIndex = Index; + Port->SpeedMask = SpeedMask; + Port->HubCount = 0; + std::snprintf(Port->Path, sizeof(Port->Path), "%d", Index + 1); +} + +void OHCI::USB_DeviceEPstopped(USBDev* Dev, USBEndpoint* EP) +{ + // This seems to be a nop in XQEMU since it doesn't assign the EP_Stopped function (it's nullptr) + USBDeviceClass* klass = USB_DEVICE_GET_CLASS(Dev); + if (klass->EP_Stopped) { + klass->EP_Stopped(Dev, EP); + } +} + +void OHCI::USB_PortReset(USBPort* Port) +{ + USBDev* dev = Port->Dev; + + assert(dev != nullptr); + USB_Detach(Port); + usb_attach(port); + usb_device_reset(dev); +} + +void OHCI::USB_Detach(USBPort* Port) +{ + USBDev* dev = Port->Dev; + + assert(dev != nullptr); + assert(dev->State != USB_STATE_NOTATTACHED); + OHCI_Detach(Port); + dev->State = USB_STATE_NOTATTACHED; +} \ No newline at end of file diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index fe5d70c86..b0cea7eee 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -66,7 +66,15 @@ #define OHCI_STATUS_OCR (1<<3) // OwnershipChangeRequest #define OHCI_STATUS_SOC ((1<<6)|(1<<7)) // SchedulingOverrunCount // HcInterruptStatus +#define OHCI_INTR_SO (1<<0) // Scheduling overrun +#define OHCI_INTR_WD (1<<1) // HcDoneHead writeback #define OHCI_INTR_SF (1<<2) // Start of frame +#define OHCI_INTR_RD (1<<3) // Resume detect +#define OHCI_INTR_UE (1<<4) // Unrecoverable error +#define OHCI_INTR_FNO (1<<5) // Frame number overflow +#define OHCI_INTR_RHSC (1<<6) // Root hub status change +#define OHCI_INTR_OC (1<<30) // Ownership change +#define OHCI_INTR_MIE (1<<31) // Master Interrupt Enable // HcInterruptEnable, HcInterruptDisable #define OHCI_INTR_MIE (1<<31) // MasterInterruptEnable // HcHCCA @@ -84,8 +92,20 @@ #define OHCI_RHA_OCPM (1<<11) // OverCurrentProtectionMode #define OHCI_RHA_NOCP (1<<12) // NoOverCurrentProtection // HcRhPortStatus +#define OHCI_PORT_CCS (1<<0) // CurrentConnectStatus +#define OHCI_PORT_PES (1<<1) // PortEnableStatus +#define OHCI_PORT_PSS (1<<2) // PortSuspendStatus +#define OHCI_PORT_POCI (1<<3) // PortOverCurrentIndicator +#define OHCI_PORT_PRS (1<<4) // PortResetStatus #define OHCI_PORT_PPS (1<<8) // PortPowerStatus - +#define OHCI_PORT_LSDA (1<<9) // LowSpeedDeviceAttached +#define OHCI_PORT_CSC (1<<16) // ConnectStatusChange +#define OHCI_PORT_PESC (1<<17) // PortEnableStatusChange +#define OHCI_PORT_PSSC (1<<18) // PortSuspendStatusChange +#define OHCI_PORT_OCIC (1<<19) // PortOverCurrentIndicatorChange +#define OHCI_PORT_PRSC (1<<20) // PortResetStatusChange +#define OHCI_PORT_WTC (OHCI_PORT_CSC|OHCI_PORT_PESC|OHCI_PORT_PSSC \ + |OHCI_PORT_OCIC|OHCI_PORT_PRSC) // enum indicating the current HC state typedef enum _OHCI_State @@ -100,7 +120,7 @@ OHCI_State; // Small struct used to hold the HcRhPortStatus register and the usb port status typedef struct _OHCIPort { - USBPort Port; + USBPort UsbPort; uint32_t HcRhPortStatus; } OHCIPort; @@ -135,6 +155,8 @@ typedef struct _OHCI_Registers uint32_t HcRhDescriptorA; uint32_t HcRhDescriptorB; uint32_t HcRhStatus; + // I have some doubts here. Both XQEMU and OpenXbox set 4 ports per HC, for a total of 8 usb ports. + // Could it be becasue each gamepad can host 2 memory units? OHCIPort RhPort[2]; // 2 ports per HC, for a total of 4 USB ports } OHCI_Registers; @@ -145,7 +167,7 @@ class OHCI { public: // constructor - OHCI(USBDevice* UsbObj, int Irqn); + OHCI(int Irqn); // destructor ~OHCI() {} // read a register @@ -165,8 +187,6 @@ class OHCI uint64_t UsbFrameTime; // ticks per usb tick uint64_t TicksPerUsbTick; - // the usb device instance of this HC - USBDevice* UsbInstance; // usb packet USBPacket UsbPacket; // irq number @@ -192,9 +212,27 @@ class OHCI void OHCI_UpdateInterrupt(); // fire an interrupt void OHCI_SetInterrupt(uint32_t Value); + // + void OHCI_StopEndpoints(); + // update ohci registers during a device detach + void OHCI_Detach(USBPort* Port); + + // register a port with the HC + void USB_RegisterPort(USBPort* Port, int Index, int SpeedMask); + // + void USB_DeviceEPstopped(USBDev* Dev, USBEndpoint* EP); + // reset a usb port + void USB_PortReset(USBPort* Port); + // a device is attched + void Attach(USBPort* port); + // a device is detached + void USB_Detach(USBPort* port); + // a device downstream from the device attached to the port (attached through a hub) is detached + void ChildDetach(USBPort* port, USBDev* child); + // TODO + void Wakeup(USBPort* port); + // TODO + void Complete(USBPort* port, USBPacket *p); }; -extern OHCI* g_pHostController1; -extern OHCI* g_pHostController2; - #endif diff --git a/src/devices/USBController/USBDevice.cpp b/src/devices/USBController/USBDevice.cpp index 4454d0f11..4e8f2a2c9 100644 --- a/src/devices/USBController/USBDevice.cpp +++ b/src/devices/USBController/USBDevice.cpp @@ -36,7 +36,6 @@ #include "USBDevice.h" #include "OHCI.h" -#include void USBDevice::Init(unsigned int address) @@ -53,11 +52,11 @@ void USBDevice::Init(unsigned int address) m_VendorId = PCI_VENDOR_ID_NVIDIA; if (address == USB0_BASE) { - g_pHostController1 = new OHCI(this, 1); + m_pHostController1 = new OHCI(1); return; } - g_pHostController2 = new OHCI(this, 9); + m_pHostController2 = new OHCI(9); } uint32_t USBDevice::MMIORead(int barIndex, uint32_t addr, unsigned size) @@ -66,13 +65,13 @@ uint32_t USBDevice::MMIORead(int barIndex, uint32_t addr, unsigned size) assert(barIndex == 0); // Figure out the correct OHCI object and read the register - if (addr >= USB1_BASE) { - // USB1 queried - return g_pHostController2->OHCI_ReadRegister(addr); + if (addr >= USB0_BASE) { + // USB0 queried + return m_pHostController1->OHCI_ReadRegister(addr); } - // USB0 queried - return g_pHostController1->OHCI_ReadRegister(addr); + // USB1 queried + return m_pHostController2->OHCI_ReadRegister(addr); } void USBDevice::MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned size) @@ -81,21 +80,12 @@ void USBDevice::MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned assert(barIndex == 0); // Figure out the correct OHCI object and write the value to the register - if (addr >= USB1_BASE) { - // USB1 queried - g_pHostController2->OHCI_WriteRegister(addr, value); + if (addr >= USB0_BASE) { + // USB0 queried + m_pHostController1->OHCI_WriteRegister(addr, value); return; } - // USB0 queried - g_pHostController1->OHCI_WriteRegister(addr, value); -} - -void USBDevice::USB_RegisterPort(USBPort* Port, OHCI* Obj, int Index, int SpeedMask) -{ - Port->Opaque = Obj; - Port->PortIndex = Index; - Port->SpeedMask = SpeedMask; - Port->HubCount = 0; - std::snprintf(Port->Path, sizeof(Port->Path), "%d", Index + 1); + // USB1 queried + m_pHostController2->OHCI_WriteRegister(addr, value); } diff --git a/src/devices/USBController/USBDevice.h b/src/devices/USBController/USBDevice.h index 2839b0809..0759b718c 100644 --- a/src/devices/USBController/USBDevice.h +++ b/src/devices/USBController/USBDevice.h @@ -37,7 +37,23 @@ #define USBDEVICE_H_ #include "..\PCIDevice.h" +#include +#define USB_MAX_ENDPOINTS 15 +#define USB_MAX_INTERFACES 16 + +#define USB_STATE_NOTATTACHED 0 +#define USB_STATE_ATTACHED 1 + +typedef enum USBPacketState { + USB_PACKET_UNDEFINED = 0, + USB_PACKET_SETUP, + USB_PACKET_QUEUED, + USB_PACKET_ASYNC, + USB_PACKET_COMPLETE, + USB_PACKET_CANCELED, +} +USBPacketState; // This is a linux struct for vectored I/O. See readv() and writev() typedef struct _IoVec @@ -56,6 +72,20 @@ typedef struct _IOVector } IOVector; +typedef struct _USBEndpoint +{ + uint8_t nr; + uint8_t pid; + uint8_t type; + uint8_t ifnum; + int max_packet_size; + bool pipeline; + bool halted; + USBDev *dev; + //QTAILQ_HEAD(, USBPacket) queue; +} +USBEndpoint; + // definition of a USB device typedef struct _USBDev { @@ -73,9 +103,9 @@ typedef struct _USBDev uint8_t addr; char product_desc[32]; int auto_attach; - int attached; + int Attached; // device is attached - int32_t state; + int32_t State; // current state of device uint8_t setup_buf[8]; uint8_t data_buf[4096]; int32_t remote_wakeup; @@ -83,9 +113,9 @@ typedef struct _USBDev int32_t setup_len; int32_t setup_index; - USBEndpoint ep_ctl; - USBEndpoint ep_in[USB_MAX_ENDPOINTS]; - USBEndpoint ep_out[USB_MAX_ENDPOINTS]; + USBEndpoint EP_ctl; + USBEndpoint EP_in[USB_MAX_ENDPOINTS]; + USBEndpoint EP_out[USB_MAX_ENDPOINTS]; //QLIST_HEAD(, USBDescString) strings; const USBDesc *usb_desc; // Overrides class usb_desc if not NULL @@ -99,19 +129,56 @@ typedef struct _USBDev } USBDev; -typedef struct _USBEndpoint +typedef struct USBDeviceClass { - uint8_t nr; - uint8_t pid; - uint8_t type; - uint8_t ifnum; - int max_packet_size; - bool pipeline; - bool halted; - USBDevice *dev; - //QTAILQ_HEAD(, USBPacket) queue; + DeviceClass parent_class; + + int(*init)(USBDev *dev); + + // Walk (enabled) downstream ports, check for a matching device. + // Only hubs implement this. + USBDev *(*find_device)(USBDev *dev, uint8_t addr); + + // Called when a packet is canceled. + void(*cancel_packet)(USBDev *dev, USBPacket *p); + + // Called when device is destroyed. + void(*handle_destroy)(USBDev *dev); + + // Attach the device + void(*handle_attach)(USBDev *dev); + + // Reset the device + void(*handle_reset)(USBDev *dev); + + // Process control request. + // Called from handle_packet(). + // Status gets stored in p->status, and if p->status == USB_RET_SUCCESS + // then the number of bytes transferred is stored in p->actual_length + void(*handle_control)(USBDev *dev, USBPacket *p, int request, int value, + int index, int length, uint8_t *data); + + // Process data transfers (both BULK and ISOC). + // Called from handle_packet(). + // Status gets stored in p->status, and if p->status == USB_RET_SUCCESS + // then the number of bytes transferred is stored in p->actual_length + void(*handle_data)(USBDev *dev, USBPacket *p); + + void(*set_interface)(USBDev *dev, int Interface, + int alt_old, int alt_new); + + // Called when the hcd is done queuing packets for an endpoint, only + // necessary for devices which can return USB_RET_ADD_TO_QUEUE. + void(*flush_ep_queue)(USBDev *dev, USBEndpoint *ep); + + // Called by the hcd to let the device know the queue for an endpoint + // has been unlinked / stopped. Optional may be NULL. + void(*EP_Stopped)(USBDev* Dev, USBEndpoint* EP); + + const char *product_desc; + const USBDesc *usb_desc; } -USBEndpoint; +USBDeviceClass; // Structure used to hold information about an active USB packet typedef struct _USBPacket @@ -137,23 +204,12 @@ USBPacket; // Struct describing the status of a usb port typedef struct _USBPort { - USBDev *Dev; + USBDev* Dev; // usb device (if present) int SpeedMask; // usb speeds supported int HubCount; // number of hubs attached char Path[16]; // the number of the port - OHCI* Opaque; // OHCI* to let USBPort access it - int PortIndex; // internal port index, may be used with the Opaque + int PortIndex; // internal port index //QTAILQ_ENTRY(USBPort) next; - // a device is attched - void Attach(USBPort* port); - // a device is detached - void Detach(USBPort* port); - // a device downstream from the device attached to the port (attached through a hub) is detached - void ChildDetach(USBPort* port, USBDev* child); - // TODO - void Wakeup(USBPort* port); - // TODO - void Complete(USBPort* port, USBPacket *p); } USBPort; @@ -174,9 +230,10 @@ class USBDevice : public PCIDevice { uint32_t MMIORead(int barIndex, uint32_t addr, unsigned size); void MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned size); - // USB specific functions - // register a port with the HC - void USB_RegisterPort(USBPort* Port, OHCI* Obj, int Index, int SpeedMask); + + // pointers to the two USB host controllers available on the Xbox + OHCI* m_pHostController1 = nullptr; + OHCI* m_pHostController2 = nullptr; }; #endif From 0fd31a0df647822373c4e90e10a1db7df565086b Mon Sep 17 00:00:00 2001 From: ergo720 Date: Tue, 29 May 2018 09:57:53 +0200 Subject: [PATCH 0025/1000] More usb port stuff --- src/devices/USBController/OHCI.cpp | 210 ++++++++++++++++++++++++-- src/devices/USBController/OHCI.h | 24 ++- src/devices/USBController/USBDevice.h | 5 +- 3 files changed, 221 insertions(+), 18 deletions(-) diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index 669fad9cb..4f014fda3 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -39,6 +39,9 @@ #define USB_HZ 12000000 +#define USB_SPEED_LOW 0 +#define USB_SPEED_FULL 1 + typedef enum _USB_SPEED { @@ -50,7 +53,7 @@ USB_SPEED; OHCI::OHCI(int Irq) { - Irq_n = Irq; + IrqNum = Irq; for (int i = 0; i < 2; i++) { USB_RegisterPort(&Registers.RhPort[i].UsbPort, i, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); @@ -114,7 +117,7 @@ void OHCI::OHCI_StateReset() OHCI_StopEndpoints(); - DbgPrintf("Ohci: Reset event.\n"); + DbgPrintf("Ohci: Reset mode event.\n"); } void OHCI::OHCI_BusStart() @@ -122,7 +125,7 @@ void OHCI::OHCI_BusStart() // Create the end-of-frame timer. Let's try a factor of 50 (1 virtual ms -> 50 real ms) pEOFtimer = Timer_Create(OHCI_FrameBoundaryWrapper, this, 50); - DbgPrintf("Ohci: Operational event\n"); + DbgPrintf("Ohci: Operational mode event\n"); // SOF event OHCI_SOF(); @@ -163,11 +166,11 @@ void OHCI::OHCI_ChangeState(uint32_t Value) case Suspend: OHCI_BusStop(); - DbgPrintf("Ohci: Suspend event\n"); + DbgPrintf("Ohci: Suspend mode event\n"); break; case Resume: - DbgPrintf("Ohci: Resume event\n"); + DbgPrintf("Ohci: Resume mode event\n"); break; case Reset: @@ -175,7 +178,7 @@ void OHCI::OHCI_ChangeState(uint32_t Value) break; default: - EmuWarning("Ohci: Unknown USB state mode!"); + EmuWarning("Ohci: Unknown USB mode!"); } } @@ -410,15 +413,15 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) break; case 20: // HcRhStatus - // TODO + OHCI_SetHubStatus(Value); break; case 21: // RhPort 0 - // TODO + OHCI_PortSetStatus(0, Value); break; case 22: // RhPort 1 - // TODO + OHCI_PortSetStatus(1, Value); break; default: @@ -430,9 +433,9 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) void OHCI::OHCI_UpdateInterrupt() { if ((Registers.HcInterrupt & OHCI_INTR_MIE) && (Registers.HcInterruptStatus & Registers.HcInterrupt)) { - HalSystemInterrupts[Irq_n].Assert(true); + HalSystemInterrupts[IrqNum].Assert(true); } - else { HalSystemInterrupts[Irq_n].Assert(false); } + else { HalSystemInterrupts[IrqNum].Assert(false); } } void OHCI::OHCI_SetInterrupt(uint32_t Value) @@ -458,6 +461,133 @@ void OHCI::OHCI_StopEndpoints() } } +void OHCI::OHCI_SetHubStatus(uint32_t Value) +{ + uint32_t old_state; + + old_state = Registers.HcRhStatus; + + // write 1 to clear OCIC + if (Value & OHCI_RHS_OCIC) { + Registers.HcRhStatus &= ~OHCI_RHS_OCIC; + } + + if (Value & OHCI_RHS_LPS) { + int i; + + for (i = 0; i < 2; i++) { + OHCI_PortPower(i, 0); + } + DbgPrintf("Ohci: powered down all ports\n"); + } + + if (Value & OHCI_RHS_LPSC) { + int i; + + for (i = 0; i < 2; i++) { + OHCI_PortPower(i, 1); + } + DbgPrintf("Ohci: powered up all ports\n"); + } + + if (Value & OHCI_RHS_DRWE) { + Registers.HcRhStatus |= OHCI_RHS_DRWE; + } + + if (Value & OHCI_RHS_CRWE) { + Registers.HcRhStatus &= ~OHCI_RHS_DRWE; + } + + if (old_state != Registers.HcRhStatus) { + OHCI_SetInterrupt(OHCI_INTR_RHSC); + } +} + +void OHCI::OHCI_PortPower(int i, int p) +{ + if (p) { + Registers.RhPort[i].HcRhPortStatus |= OHCI_PORT_PPS; + } + else { + Registers.RhPort[i].HcRhPortStatus &= ~(OHCI_PORT_PPS | + OHCI_PORT_CCS | + OHCI_PORT_PSS | + OHCI_PORT_PRS); + } +} + +void OHCI::OHCI_PortSetStatus(int PortNum, uint32_t Value) +{ + uint32_t old_state; + OHCIPort* port; + + port = &Registers.RhPort[PortNum]; + old_state = port->HcRhPortStatus; + + // Write to clear CSC, PESC, PSSC, OCIC, PRSC + if (Value & OHCI_PORT_WTC) { + port->HcRhPortStatus &= ~(Value & OHCI_PORT_WTC); + } + + if (Value & OHCI_PORT_CCS) { + port->HcRhPortStatus &= ~OHCI_PORT_PES; + } + + OHCI_PortSetIfConnected(PortNum, Value & OHCI_PORT_PES); + + if (OHCI_PortSetIfConnected(PortNum, Value & OHCI_PORT_PSS)) { + DbgPrintf("Ohci: port %d: SUSPEND\n", PortNum); + } + + if (OHCI_PortSetIfConnected(PortNum, Value & OHCI_PORT_PRS)) { + DbgPrintf("Ohci: port %d: RESET\n", PortNum); + USB_DeviceReset(port->UsbPort.Dev); + port->HcRhPortStatus &= ~OHCI_PORT_PRS; + // ??? Should this also set OHCI_PORT_PESC + port->HcRhPortStatus |= OHCI_PORT_PES | OHCI_PORT_PRSC; + } + + // Invert order here to ensure in ambiguous case, device is powered up... + if (Value & OHCI_PORT_LSDA) { + OHCI_PortPower(PortNum, 0); + } + + if (Value & OHCI_PORT_PPS) { + OHCI_PortPower(PortNum, 1); + } + + if (old_state != port->HcRhPortStatus) { + OHCI_SetInterrupt(OHCI_INTR_RHSC); + } +} + +int OHCI::OHCI_PortSetIfConnected(int i, uint32_t Value) +{ + int ret = 1; + + // writing a 0 has no effect + if (Value == 0) { + return 0; + } + + // If CurrentConnectStatus is cleared we set ConnectStatusChange + if (!(Registers.RhPort[i].HcRhPortStatus & OHCI_PORT_CCS)) { + Registers.RhPort[i].HcRhPortStatus |= OHCI_PORT_CSC; + if (Registers.HcRhStatus & OHCI_RHS_DRWE) { + // TODO: CSC is a wakeup event + } + return 0; + } + + if (Registers.RhPort[i].HcRhPortStatus & Value) + ret = 0; + + // set the bit + Registers.RhPort[i].HcRhPortStatus |= Value; + + return ret; +} + void OHCI::OHCI_Detach(USBPort* Port) { OHCIPort* port = &Registers.RhPort[Port->PortIndex]; @@ -483,6 +613,34 @@ void OHCI::OHCI_Detach(USBPort* Port) } } +void OHCI::OHCI_Attach(USBPort* Port) +{ + OHCIPort* port = &Registers.RhPort[Port->PortIndex]; + uint32_t old_state = port->HcRhPortStatus; + + // set connect status + port->HcRhPortStatus |= OHCI_PORT_CCS | OHCI_PORT_CSC; + + // update speed + if (port->UsbPort.Dev->speed == USB_SPEED_LOW) { + port->HcRhPortStatus |= OHCI_PORT_LSDA; + } + else { + port->HcRhPortStatus &= ~OHCI_PORT_LSDA; + } + + // notify of remote-wakeup + if ((Registers.HcControl & OHCI_CTL_HCFS) == Suspend) { + OHCI_SetInterrupt(OHCI_INTR_RD); + } + + DbgPrintf("Ohci: Attached port %d\n", Port->PortIndex); + + if (old_state != port->HcRhPortStatus) { + OHCI_SetInterrupt(OHCI_INTR_RHSC); + } +} + void OHCI::USB_RegisterPort(USBPort* Port, int Index, int SpeedMask) { Port->PortIndex = Index; @@ -506,8 +664,8 @@ void OHCI::USB_PortReset(USBPort* Port) assert(dev != nullptr); USB_Detach(Port); - usb_attach(port); - usb_device_reset(dev); + USB_Attach(Port); + USB_DeviceReset(dev); } void OHCI::USB_Detach(USBPort* Port) @@ -518,4 +676,28 @@ void OHCI::USB_Detach(USBPort* Port) assert(dev->State != USB_STATE_NOTATTACHED); OHCI_Detach(Port); dev->State = USB_STATE_NOTATTACHED; -} \ No newline at end of file +} + +void OHCI::USB_Attach(USBPort* Port) +{ + USBDev *dev = Port->Dev; + + assert(dev != nullptr); + assert(dev->Attached); + assert(dev->State == USB_STATE_NOTATTACHED); + OHCI_Attach(Port); + dev->State = USB_STATE_ATTACHED; + usb_device_handle_attach(dev); +} + +void OHCI::USB_DeviceReset(USBDev* dev) +{ + if (dev == nullptr || !dev->Attached) { + return; + } + + dev->RemoteWakeup = 0; + dev->Addr = 0; + dev->State = USB_STATE_DEFAULT; + usb_device_handle_reset(dev); +} diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index b0cea7eee..20ec3458e 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -91,6 +91,13 @@ #define OHCI_RHA_DT (1<<10) // DeviceType #define OHCI_RHA_OCPM (1<<11) // OverCurrentProtectionMode #define OHCI_RHA_NOCP (1<<12) // NoOverCurrentProtection +// HcRhStatus +#define OHCI_RHS_LPS (1<<0) // LocalPowerStatus +#define OHCI_RHS_OCI (1<<1) // OverCurrentIndicator +#define OHCI_RHS_DRWE (1<<15) // DeviceRemoteWakeupEnable +#define OHCI_RHS_LPSC (1<<16) // LocalPowerStatusChange +#define OHCI_RHS_OCIC (1<<17) // OverCurrentIndicatorChange +#define OHCI_RHS_CRWE (1<<31) // ClearRemoteWakeupEnable // HcRhPortStatus #define OHCI_PORT_CCS (1<<0) // CurrentConnectStatus #define OHCI_PORT_PES (1<<1) // PortEnableStatus @@ -190,7 +197,7 @@ class OHCI // usb packet USBPacket UsbPacket; // irq number - int Irq_n; + int IrqNum; // EOF callback wrapper static void OHCI_FrameBoundaryWrapper(void* pVoid); @@ -214,8 +221,19 @@ class OHCI void OHCI_SetInterrupt(uint32_t Value); // void OHCI_StopEndpoints(); + // update ohci registers during a device attach + void OHCI_Attach(USBPort* Port); // update ohci registers during a device detach void OHCI_Detach(USBPort* Port); + // set root hub status + void OHCI_SetHubStatus(uint32_t Value); + // update power related bits in HcRhPortStatus + void OHCI_PortPower(int i, int p); + // set root hub port status + void OHCI_PortSetStatus(int PortNum, uint32_t Value); + // set a flag in a port status register but only set it if the port is connected, + // if not set ConnectStatusChange flag; if flag is enabled return 1 + int OHCI_PortSetIfConnected(int i, uint32_t Value); // register a port with the HC void USB_RegisterPort(USBPort* Port, int Index, int SpeedMask); @@ -224,7 +242,7 @@ class OHCI // reset a usb port void USB_PortReset(USBPort* Port); // a device is attched - void Attach(USBPort* port); + void USB_Attach(USBPort* port); // a device is detached void USB_Detach(USBPort* port); // a device downstream from the device attached to the port (attached through a hub) is detached @@ -233,6 +251,8 @@ class OHCI void Wakeup(USBPort* port); // TODO void Complete(USBPort* port, USBPacket *p); + // reset a device + void USB_DeviceReset(USBDev* dev); }; #endif diff --git a/src/devices/USBController/USBDevice.h b/src/devices/USBController/USBDevice.h index 0759b718c..0ae8fedac 100644 --- a/src/devices/USBController/USBDevice.h +++ b/src/devices/USBController/USBDevice.h @@ -44,6 +44,7 @@ #define USB_STATE_NOTATTACHED 0 #define USB_STATE_ATTACHED 1 +#define USB_STATE_DEFAULT 2 typedef enum USBPacketState { USB_PACKET_UNDEFINED = 0, @@ -100,7 +101,7 @@ typedef struct _USBDev int speed; // Supported speeds, not in info because it may be variable (hostdevs) int speedmask; - uint8_t addr; + uint8_t Addr; // device address char product_desc[32]; int auto_attach; int Attached; // device is attached @@ -108,7 +109,7 @@ typedef struct _USBDev int32_t State; // current state of device uint8_t setup_buf[8]; uint8_t data_buf[4096]; - int32_t remote_wakeup; + int32_t RemoteWakeup; // wakeup flag int32_t setup_state; int32_t setup_len; int32_t setup_index; From e79c7fa1852ca95d550f69fe0f80cdc1cf9710d5 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Tue, 29 May 2018 10:02:44 +0200 Subject: [PATCH 0026/1000] Updated class member names --- src/devices/USBController/OHCI.cpp | 186 ++++++++++++++--------------- src/devices/USBController/OHCI.h | 14 +-- 2 files changed, 100 insertions(+), 100 deletions(-) diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index 4f014fda3..3d933ba4a 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -53,15 +53,15 @@ USB_SPEED; OHCI::OHCI(int Irq) { - IrqNum = Irq; + m_IrqNum = Irq; for (int i = 0; i < 2; i++) { - USB_RegisterPort(&Registers.RhPort[i].UsbPort, i, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); + USB_RegisterPort(&m_Registers.RhPort[i].UsbPort, i, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); } - OHCI_PacketInit(&UsbPacket); + OHCI_PacketInit(&m_UsbPacket); - UsbFrameTime = 1000000ULL; // 1 ms - TicksPerUsbTick = 1000000000ULL / USB_HZ; // 83 + m_UsbFrameTime = 1000000ULL; // 1 ms + m_TicksPerUsbTick = 1000000000ULL / USB_HZ; // 83 // Do a hardware reset OHCI_StateReset(); @@ -83,32 +83,32 @@ void OHCI::OHCI_StateReset() // Remark: the standard says that RemoteWakeupConnected bit should be set during POST, cleared during hw reset // and ignored during a sw reset. However, VBox sets it on hw reset and XQEMU clears it. Considering that the Xbox // doesn't do POST, I will clear it. - Registers.HcRevision = 0x10; - Registers.HcControl = 0; - Registers.HcControl &= ~OHCI_CTL_HCFS; - Registers.HcControl |= Reset; - Registers.HcCommandStatus = 0; - Registers.HcInterruptStatus = 0; - Registers.HcInterrupt = OHCI_INTR_MIE; // enable interrupts + m_Registers.HcRevision = 0x10; + m_Registers.HcControl = 0; + m_Registers.HcControl &= ~OHCI_CTL_HCFS; + m_Registers.HcControl |= Reset; + m_Registers.HcCommandStatus = 0; + m_Registers.HcInterruptStatus = 0; + m_Registers.HcInterrupt = OHCI_INTR_MIE; // enable interrupts - Registers.HcHCCA = 0; - Registers.HcPeriodCurrentED = 0; - Registers.HcControlHeadED = Registers.HcControlCurrentED = 0; - Registers.HcBulkHeadED = Registers.HcBulkCurrentED = 0; - Registers.HcDoneHead = 0; + m_Registers.HcHCCA = 0; + m_Registers.HcPeriodCurrentED = 0; + m_Registers.HcControlHeadED = m_Registers.HcControlCurrentED = 0; + m_Registers.HcBulkHeadED = m_Registers.HcBulkCurrentED = 0; + m_Registers.HcDoneHead = 0; - Registers.HcFmInterval = 0; - Registers.HcFmInterval |= (0x2778 << 16); // TBD according to the standard, using what XQEMU sets (FSLargestDataPacket) - Registers.HcFmInterval |= 0x2EDF; // bit-time of a frame. 1 frame = 1 ms (FrameInterval) - Registers.HcFmRemaining = 0; - Registers.HcFmNumber = 0; - Registers.HcPeriodicStart = 0; + m_Registers.HcFmInterval = 0; + m_Registers.HcFmInterval |= (0x2778 << 16); // TBD according to the standard, using what XQEMU sets (FSLargestDataPacket) + m_Registers.HcFmInterval |= 0x2EDF; // bit-time of a frame. 1 frame = 1 ms (FrameInterval) + m_Registers.HcFmRemaining = 0; + m_Registers.HcFmNumber = 0; + m_Registers.HcPeriodicStart = 0; - Registers.HcRhDescriptorA = OHCI_RHA_NPS | 2; // The xbox lacks the hw to switch off the power on the ports and has 2 ports per HC - Registers.HcRhDescriptorB = 0; // The attached devices are removable and use PowerSwitchingMode to control the power on the ports + m_Registers.HcRhDescriptorA = OHCI_RHA_NPS | 2; // The xbox lacks the hw to switch off the power on the ports and has 2 ports per HC + m_Registers.HcRhDescriptorB = 0; // The attached devices are removable and use PowerSwitchingMode to control the power on the ports for (int i = 0; i < 2; i++) { - OHCIPort* Port = &Registers.RhPort[i]; + OHCIPort* Port = &m_Registers.RhPort[i]; Port->HcRhPortStatus = 0; if (Port->UsbPort.Dev && Port->UsbPort.Dev->Attached) { USB_PortReset(&Port->UsbPort); @@ -123,7 +123,7 @@ void OHCI::OHCI_StateReset() void OHCI::OHCI_BusStart() { // Create the end-of-frame timer. Let's try a factor of 50 (1 virtual ms -> 50 real ms) - pEOFtimer = Timer_Create(OHCI_FrameBoundaryWrapper, this, 50); + m_pEOFtimer = Timer_Create(OHCI_FrameBoundaryWrapper, this, 50); DbgPrintf("Ohci: Operational mode event\n"); @@ -133,25 +133,25 @@ void OHCI::OHCI_BusStart() void OHCI::OHCI_BusStop() { - if (pEOFtimer) { + if (m_pEOFtimer) { // Delete existing EOF timer - Timer_Exit(pEOFtimer); + Timer_Exit(m_pEOFtimer); } - pEOFtimer = nullptr; + m_pEOFtimer = nullptr; } void OHCI::OHCI_SOF() { - SOFtime = GetTime_NS(pEOFtimer); // set current SOF time - Timer_Start(pEOFtimer, SOFtime + UsbFrameTime); // make timer expire at SOF + 1 virtual ms from now + m_SOFtime = GetTime_NS(m_pEOFtimer); // set current SOF time + Timer_Start(m_pEOFtimer, m_SOFtime + m_UsbFrameTime); // make timer expire at SOF + 1 virtual ms from now OHCI_SetInterrupt(OHCI_INTR_SF); } void OHCI::OHCI_ChangeState(uint32_t Value) { - uint32_t OldState = Registers.HcControl & OHCI_CTL_HCFS; - Registers.HcControl = Value; - uint32_t NewState = Registers.HcControl & OHCI_CTL_HCFS; + uint32_t OldState = m_Registers.HcControl & OHCI_CTL_HCFS; + m_Registers.HcControl = Value; + uint32_t NewState = m_Registers.HcControl & OHCI_CTL_HCFS; // no state change if (OldState == NewState) { @@ -204,56 +204,56 @@ uint32_t OHCI::OHCI_ReadRegister(xbaddr Addr) switch (Addr >> 2) // read the register { case 0: // HcRevision - ret = Registers.HcRevision; + ret = m_Registers.HcRevision; break; case 1: // HcControl - ret = Registers.HcControl; + ret = m_Registers.HcControl; break; case 2: // HcCommandStatus - ret = Registers.HcCommandStatus; + ret = m_Registers.HcCommandStatus; break; case 3: // HcInterruptStatus - ret = Registers.HcInterruptStatus; + ret = m_Registers.HcInterruptStatus; break; case 4: // HcInterruptEnable case 5: // HcInterruptDisable - ret = Registers.HcInterrupt; + ret = m_Registers.HcInterrupt; break; case 6: // HcHCCA - ret = Registers.HcHCCA; + ret = m_Registers.HcHCCA; break; case 7: // HcPeriodCurrentED - ret = Registers.HcPeriodCurrentED; + ret = m_Registers.HcPeriodCurrentED; break; case 8: // HcControlHeadED - ret = Registers.HcControlHeadED; + ret = m_Registers.HcControlHeadED; break; case 9: // HcControlCurrentED - ret = Registers.HcControlCurrentED; + ret = m_Registers.HcControlCurrentED; break; case 10: // HcBulkHeadED - ret = Registers.HcBulkHeadED; + ret = m_Registers.HcBulkHeadED; break; case 11: // HcBulkCurrentED - ret = Registers.HcBulkCurrentED; + ret = m_Registers.HcBulkCurrentED; break; case 12: // HcDoneHead - ret = Registers.HcDoneHead; + ret = m_Registers.HcDoneHead; break; case 13: // HcFmInterval - ret = Registers.HcFmInterval; + ret = m_Registers.HcFmInterval; break; case 14: // HcFmRemaining @@ -261,36 +261,36 @@ uint32_t OHCI::OHCI_ReadRegister(xbaddr Addr) break; case 15: // HcFmNumber - ret = Registers.HcFmNumber; + ret = m_Registers.HcFmNumber; break; case 16: // HcPeriodicStart - ret = Registers.HcPeriodicStart; + ret = m_Registers.HcPeriodicStart; break; case 17: // HcLSThreshold - ret = Registers.HcLSThreshold; + ret = m_Registers.HcLSThreshold; break; case 18: // HcRhDescriptorA - ret = Registers.HcRhDescriptorA; + ret = m_Registers.HcRhDescriptorA; break; case 19: // HcRhDescriptorB - ret = Registers.HcRhDescriptorB; + ret = m_Registers.HcRhDescriptorB; break; case 20: // HcRhStatus - ret = Registers.HcRhStatus; + ret = m_Registers.HcRhStatus; break; // Always report that the port power is on since the Xbox cannot switch off the electrical current to it case 21: // RhPort 0 - ret = Registers.RhPort[0].HcRhPortStatus | OHCI_PORT_PPS; + ret = m_Registers.RhPort[0].HcRhPortStatus | OHCI_PORT_PPS; break; case 22: // RhPort 1 - ret = Registers.RhPort[1].HcRhPortStatus | OHCI_PORT_PPS; + ret = m_Registers.RhPort[1].HcRhPortStatus | OHCI_PORT_PPS; break; default: @@ -325,9 +325,9 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) // From the standard: "The Host Controller must ensure that bits written as 1 become set // in the register while bits written as 0 remain unchanged in the register." - Registers.HcCommandStatus |= Value; + m_Registers.HcCommandStatus |= Value; - if (Registers.HcCommandStatus & OHCI_STATUS_HCR) { + if (m_Registers.HcCommandStatus & OHCI_STATUS_HCR) { // Do a hardware reset OHCI_StateReset(); } @@ -335,23 +335,23 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) break; case 3: // HcInterruptStatus - Registers.HcInterruptStatus &= ~Value; + m_Registers.HcInterruptStatus &= ~Value; OHCI_UpdateInterrupt(); break; case 4: // HcInterruptEnable - Registers.HcInterrupt |= Value; + m_Registers.HcInterrupt |= Value; OHCI_UpdateInterrupt(); break; case 5: // HcInterruptDisable - Registers.HcInterrupt &= ~Value; + m_Registers.HcInterrupt &= ~Value; OHCI_UpdateInterrupt(); break; case 6: // HcHCCA // The standard says the minimum alignment is 256 bytes and so bits 0 through 7 are always zero - Registers.HcHCCA = Value & OHCI_HCCA_MASK; + m_Registers.HcHCCA = Value & OHCI_HCCA_MASK; break; case 7: // HcPeriodCurrentED @@ -359,19 +359,19 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) break; case 8: // HcControlHeadED - Registers.HcControlHeadED = Value & OHCI_EDPTR_MASK; + m_Registers.HcControlHeadED = Value & OHCI_EDPTR_MASK; break; case 9: // HcControlCurrentED - Registers.HcControlCurrentED = Value & OHCI_EDPTR_MASK; + m_Registers.HcControlCurrentED = Value & OHCI_EDPTR_MASK; break; case 10: // HcBulkHeadED - Registers.HcBulkHeadED = Value & OHCI_EDPTR_MASK; + m_Registers.HcBulkHeadED = Value & OHCI_EDPTR_MASK; break; case 11: // HcBulkCurrentED - Registers.HcBulkCurrentED = Value & OHCI_EDPTR_MASK; + m_Registers.HcBulkCurrentED = Value & OHCI_EDPTR_MASK; break; case 12: // HcDoneHead @@ -380,10 +380,10 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) case 13: // HcFmInterval { - if ((Value & OHCI_FMI_FIT) != (Registers.HcFmInterval & OHCI_FMI_FIT)) { + if ((Value & OHCI_FMI_FIT) != (m_Registers.HcFmInterval & OHCI_FMI_FIT)) { DbgPrintf("Ohci: Changing frame interval duration. New value is %u\n", Value & OHCI_FMI_FI); } - Registers.HcFmInterval = Value & ~0xC000; + m_Registers.HcFmInterval = Value & ~0xC000; } break; @@ -396,16 +396,16 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) break; case 16: // HcPeriodicStart - Registers.HcPeriodicStart = Value & 0x3FFF; + m_Registers.HcPeriodicStart = Value & 0x3FFF; break; case 17: // HcLSThreshold - Registers.HcLSThreshold = Value & 0xFFF; + m_Registers.HcLSThreshold = Value & 0xFFF; break; case 18: // HcRhDescriptorA - Registers.HcRhDescriptorA &= ~OHCI_RHA_RW_MASK; - Registers.HcRhDescriptorA |= Value & OHCI_RHA_RW_MASK; // ?? + m_Registers.HcRhDescriptorA &= ~OHCI_RHA_RW_MASK; + m_Registers.HcRhDescriptorA |= Value & OHCI_RHA_RW_MASK; // ?? break; case 19: // HcRhDescriptorB @@ -432,15 +432,15 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) void OHCI::OHCI_UpdateInterrupt() { - if ((Registers.HcInterrupt & OHCI_INTR_MIE) && (Registers.HcInterruptStatus & Registers.HcInterrupt)) { - HalSystemInterrupts[IrqNum].Assert(true); + if ((m_Registers.HcInterrupt & OHCI_INTR_MIE) && (m_Registers.HcInterruptStatus & m_Registers.HcInterrupt)) { + HalSystemInterrupts[m_IrqNum].Assert(true); } - else { HalSystemInterrupts[IrqNum].Assert(false); } + else { HalSystemInterrupts[m_IrqNum].Assert(false); } } void OHCI::OHCI_SetInterrupt(uint32_t Value) { - Registers.HcInterruptStatus |= Value; + m_Registers.HcInterruptStatus |= Value; OHCI_UpdateInterrupt(); } @@ -450,7 +450,7 @@ void OHCI::OHCI_StopEndpoints() int i, j; for (i = 0; i < 2; i++) { - dev = Registers.RhPort[i].UsbPort.Dev; + dev = m_Registers.RhPort[i].UsbPort.Dev; if (dev && dev->Attached) { USB_DeviceEPstopped(dev, &dev->EP_ctl); for (j = 0; j < USB_MAX_ENDPOINTS; j++) { @@ -465,11 +465,11 @@ void OHCI::OHCI_SetHubStatus(uint32_t Value) { uint32_t old_state; - old_state = Registers.HcRhStatus; + old_state = m_Registers.HcRhStatus; // write 1 to clear OCIC if (Value & OHCI_RHS_OCIC) { - Registers.HcRhStatus &= ~OHCI_RHS_OCIC; + m_Registers.HcRhStatus &= ~OHCI_RHS_OCIC; } if (Value & OHCI_RHS_LPS) { @@ -491,14 +491,14 @@ void OHCI::OHCI_SetHubStatus(uint32_t Value) } if (Value & OHCI_RHS_DRWE) { - Registers.HcRhStatus |= OHCI_RHS_DRWE; + m_Registers.HcRhStatus |= OHCI_RHS_DRWE; } if (Value & OHCI_RHS_CRWE) { - Registers.HcRhStatus &= ~OHCI_RHS_DRWE; + m_Registers.HcRhStatus &= ~OHCI_RHS_DRWE; } - if (old_state != Registers.HcRhStatus) { + if (old_state != m_Registers.HcRhStatus) { OHCI_SetInterrupt(OHCI_INTR_RHSC); } } @@ -506,10 +506,10 @@ void OHCI::OHCI_SetHubStatus(uint32_t Value) void OHCI::OHCI_PortPower(int i, int p) { if (p) { - Registers.RhPort[i].HcRhPortStatus |= OHCI_PORT_PPS; + m_Registers.RhPort[i].HcRhPortStatus |= OHCI_PORT_PPS; } else { - Registers.RhPort[i].HcRhPortStatus &= ~(OHCI_PORT_PPS | + m_Registers.RhPort[i].HcRhPortStatus &= ~(OHCI_PORT_PPS | OHCI_PORT_CCS | OHCI_PORT_PSS | OHCI_PORT_PRS); @@ -521,7 +521,7 @@ void OHCI::OHCI_PortSetStatus(int PortNum, uint32_t Value) uint32_t old_state; OHCIPort* port; - port = &Registers.RhPort[PortNum]; + port = &m_Registers.RhPort[PortNum]; old_state = port->HcRhPortStatus; // Write to clear CSC, PESC, PSSC, OCIC, PRSC @@ -571,26 +571,26 @@ int OHCI::OHCI_PortSetIfConnected(int i, uint32_t Value) } // If CurrentConnectStatus is cleared we set ConnectStatusChange - if (!(Registers.RhPort[i].HcRhPortStatus & OHCI_PORT_CCS)) { - Registers.RhPort[i].HcRhPortStatus |= OHCI_PORT_CSC; - if (Registers.HcRhStatus & OHCI_RHS_DRWE) { + if (!(m_Registers.RhPort[i].HcRhPortStatus & OHCI_PORT_CCS)) { + m_Registers.RhPort[i].HcRhPortStatus |= OHCI_PORT_CSC; + if (m_Registers.HcRhStatus & OHCI_RHS_DRWE) { // TODO: CSC is a wakeup event } return 0; } - if (Registers.RhPort[i].HcRhPortStatus & Value) + if (m_Registers.RhPort[i].HcRhPortStatus & Value) ret = 0; // set the bit - Registers.RhPort[i].HcRhPortStatus |= Value; + m_Registers.RhPort[i].HcRhPortStatus |= Value; return ret; } void OHCI::OHCI_Detach(USBPort* Port) { - OHCIPort* port = &Registers.RhPort[Port->PortIndex]; + OHCIPort* port = &m_Registers.RhPort[Port->PortIndex]; uint32_t old_state = port->HcRhPortStatus; ohci_async_cancel_device(Port->Dev); @@ -615,7 +615,7 @@ void OHCI::OHCI_Detach(USBPort* Port) void OHCI::OHCI_Attach(USBPort* Port) { - OHCIPort* port = &Registers.RhPort[Port->PortIndex]; + OHCIPort* port = &m_Registers.RhPort[Port->PortIndex]; uint32_t old_state = port->HcRhPortStatus; // set connect status @@ -630,7 +630,7 @@ void OHCI::OHCI_Attach(USBPort* Port) } // notify of remote-wakeup - if ((Registers.HcControl & OHCI_CTL_HCFS) == Suspend) { + if ((m_Registers.HcControl & OHCI_CTL_HCFS) == Suspend) { OHCI_SetInterrupt(OHCI_INTR_RD); } diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index 20ec3458e..25d45c0be 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -185,19 +185,19 @@ class OHCI private: // all the registers available on the OHCI standard - OHCI_Registers Registers; + OHCI_Registers m_Registers; // end-of-frame timer - TimerObject* pEOFtimer; + TimerObject* m_pEOFtimer; // time at which a SOF was sent - uint64_t SOFtime; + uint64_t m_SOFtime; // the duration of a usb frame - uint64_t UsbFrameTime; + uint64_t m_UsbFrameTime; // ticks per usb tick - uint64_t TicksPerUsbTick; + uint64_t m_TicksPerUsbTick; // usb packet - USBPacket UsbPacket; + USBPacket m_UsbPacket; // irq number - int IrqNum; + int m_IrqNum; // EOF callback wrapper static void OHCI_FrameBoundaryWrapper(void* pVoid); From 716e20fbc4c2975fc96dece4fbbecec583badf08 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Wed, 30 May 2018 21:53:04 +0200 Subject: [PATCH 0027/1000] HCCA stuff (WIP) --- src/devices/USBController/OHCI.cpp | 117 +++++++++++++++++++++++- src/devices/USBController/OHCI.h | 50 +++++++--- src/devices/USBController/USBDevice.cpp | 4 +- 3 files changed, 156 insertions(+), 15 deletions(-) diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index 3d933ba4a..78cfeae3f 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -72,6 +72,120 @@ void OHCI::OHCI_FrameBoundaryWrapper(void* pVoid) static_cast(pVoid)->OHCI_FrameBoundaryWorker(); } +void OHCI::OHCI_FrameBoundaryWorker() +{ + OHCI_HCCA hcca; + + if (OHCI_ReadHCCA(m_Registers.HcHCCA, &hcca)) { + EmuWarning("Ohci: HCCA read error at physical address 0x%X", m_Registers.HcHCCA); + OHCI_FatalError(); + return; + } + + // Process all the lists at the end of the frame + if (m_Registers.HcControl & OHCI_CTL_PLE) { + int n = m_Registers.HcFmNumber & 0x1f; + ohci_service_ed_list(ohci, le32_to_cpu(hcca.intr[n]), 0); + } + + // Cancel all pending packets if either of the lists has been disabled + if (ohci->old_ctl & (~ohci->ctl) & (OHCI_CTL_BLE | OHCI_CTL_CLE)) { + if (ohci->async_td) { + usb_cancel_packet(&ohci->usb_packet); + ohci->async_td = 0; + } + OHCI_StopEndpoints(); + } + ohci->old_ctl = ohci->ctl; + ohci_process_lists(ohci, 0); + + // Stop if UnrecoverableError happened or OHCI_SOF will crash + if (m_Registers.HcInterruptStatus & OHCI_INTR_UE) { + return; + } + + // From the standard: "This bit is loaded from the FrameIntervalToggle field of + // HcFmInterval whenever FrameRemaining reaches 0." + m_Registers.HcFmRemaining = (m_Registers.HcFmRemaining & ~OHCI_FMR_FRT) | (m_Registers.HcFmInterval & OHCI_FMI_FIT); + + // Increment frame number + m_Registers.HcFmNumber = (m_Registers.HcFmNumber + 1) & 0xFFFF; // prevent overflow + hcca.HccaFrameNumber = m_Registers.HcFmNumber; // dropped big -> little endian conversion from XQEMU + + if (m_DoneCount == 0 && !(m_Registers.HcInterruptStatus & OHCI_INTR_WD)) { + if (!m_Registers.HcDoneHead) { + // From the standard: "This is set to zero whenever HC writes the content of this + // register to HCCA. It also sets the WritebackDoneHead of HcInterruptStatus." + CxbxKrnlCleanup("Ohci: HcDoneHead is zero but WritebackDoneHead interrupt is not set!\n"); + } + + if (m_Registers.HcInterrupt & m_Registers.HcInterruptStatus) { + // From the standard: "The least significant bit of this entry is set to 1 to indicate whether an + // unmasked HcInterruptStatus was set when HccaDoneHead was written." It's tecnically incorrect to + // do this to HcDoneHead instead of HccaDoneHead however it doesn't matter since HcDoneHead is + // zeroed below + m_Registers.HcDoneHead |= 1; + } + + hcca.HccaDoneHead = m_Registers.HcDoneHead; // dropped big -> little endian conversion from XQEMU + m_Registers.HcDoneHead = 0; + m_DoneCount = 7; + OHCI_SetInterrupt(OHCI_INTR_WD); + } + + if (m_DoneCount != 7 && m_DoneCount != 0) { + // decrease DelayInterrupt counter + m_DoneCount--; + } + + // Do SOF stuff here + OHCI_SOF(); + + // Writeback HCCA + if (OHCI_WriteHCCA(m_Registers.HcHCCA, &hcca)) { + EmuWarning("Ohci: HCCA write error at physical address 0x%X", m_Registers.HcHCCA); + OHCI_FatalError(); + } +} + +void OHCI::OHCI_FatalError() +{ + // According to the standard, an OHCI will stop operating, and set itself into error state + // (which can be queried by MMIO). Instead of calling directly CxbxKrnlCleanup, we let the + // HCD know the problem so it can try to solve it + + OHCI_SetInterrupt(OHCI_INTR_UE); + OHCI_BusStop(); +} + +bool OHCI::OHCI_ReadHCCA(uint32_t Paddr, OHCI_HCCA* Hcca) +{ + // ergo720: I disassembled various xbe's of my games and discovered that the shared memory between + // HCD and HC is allocated with MmAllocateContiguousMemory which means we can access it from + // the contiguous region. Hopefully XDK revisions didn't alter this... + + if (Paddr != xbnull) { + std::memcpy(Hcca, reinterpret_cast(Paddr + CONTIGUOUS_MEMORY_BASE), sizeof(OHCI_HCCA)); + return false; + } + + return true; // error +} + +bool OHCI::OHCI_WriteHCCA(uint32_t Paddr, OHCI_HCCA* Hcca) +{ + if (Paddr != xbnull) { + // We need to calculate the offset of the HccaFrameNumber member to avoid overwriting HccaInterrruptTable + size_t OffsetoOfFrameNumber = offsetof(OHCI_HCCA, HccaFrameNumber); + + std::memcpy(reinterpret_cast(Paddr + OffsetoOfFrameNumber + CONTIGUOUS_MEMORY_BASE), + reinterpret_cast(Hcca) + OffsetoOfFrameNumber, 8); + return false; + } + + return true; // error +} + void OHCI::OHCI_StateReset() { // The usb state can be USB_Suspend if it is a software reset, and USB_Reset if it is a hardware @@ -114,6 +228,7 @@ void OHCI::OHCI_StateReset() USB_PortReset(&Port->UsbPort); } } + m_DoneCount = 7; OHCI_StopEndpoints(); @@ -122,7 +237,7 @@ void OHCI::OHCI_StateReset() void OHCI::OHCI_BusStart() { - // Create the end-of-frame timer. Let's try a factor of 50 (1 virtual ms -> 50 real ms) + // Create the EOF timer. Let's try a factor of 50 (1 virtual ms -> 50 real ms) m_pEOFtimer = Timer_Create(OHCI_FrameBoundaryWrapper, this, 50); DbgPrintf("Ohci: Operational mode event\n"); diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index 25d45c0be..a9a39688e 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -46,9 +46,12 @@ // OHCI: Open Host Controller Interface; the standard used on the xbox to comunicate with the usb devices // HC: Host Controller; the hardware which interfaces with the usb device and the usb driver // HCD: Host Controller Driver; software which talks to the HC, it's linked in the xbe +// SOF: start of frame; the beginning of a USB-defined frame +// EOF: end of frame; the end of a USB-defined frame +// TD: transfer descriptor; a memory structure used by the HC to transfer a block of data to/from a device endpoint -// These macros are used to access the bits in the various registers +// These macros are used to access the bits of the various registers // HcControl #define OHCI_CTL_CBSR ((1<<0)|(1<<1)) // ControlBulkServiceRatio #define OHCI_CTL_PLE (1<<2) // PeriodicListEnable @@ -66,15 +69,14 @@ #define OHCI_STATUS_OCR (1<<3) // OwnershipChangeRequest #define OHCI_STATUS_SOC ((1<<6)|(1<<7)) // SchedulingOverrunCount // HcInterruptStatus -#define OHCI_INTR_SO (1<<0) // Scheduling overrun -#define OHCI_INTR_WD (1<<1) // HcDoneHead writeback -#define OHCI_INTR_SF (1<<2) // Start of frame -#define OHCI_INTR_RD (1<<3) // Resume detect -#define OHCI_INTR_UE (1<<4) // Unrecoverable error -#define OHCI_INTR_FNO (1<<5) // Frame number overflow -#define OHCI_INTR_RHSC (1<<6) // Root hub status change -#define OHCI_INTR_OC (1<<30) // Ownership change -#define OHCI_INTR_MIE (1<<31) // Master Interrupt Enable +#define OHCI_INTR_SO (1<<0) // SchedulingOverrun +#define OHCI_INTR_WD (1<<1) // WritebackDoneHead +#define OHCI_INTR_SF (1<<2) // StartofFrame +#define OHCI_INTR_RD (1<<3) // ResumeDetected +#define OHCI_INTR_UE (1<<4) // UnrecoverableError +#define OHCI_INTR_FNO (1<<5) // FrameNumberOverflow +#define OHCI_INTR_RHSC (1<<6) // RootHubStatusChange +#define OHCI_INTR_OC (1<<30) // OwnershipChange // HcInterruptEnable, HcInterruptDisable #define OHCI_INTR_MIE (1<<31) // MasterInterruptEnable // HcHCCA @@ -84,6 +86,9 @@ // HcFmInterval #define OHCI_FMI_FI 0x00003FFF // FrameInterval #define OHCI_FMI_FIT 0x80000000 // FrameIntervalToggle +// HcFmRemaining +#define OHCI_FMR_FR 0x00003FFF // FrameRemaining +#define OHCI_FMR_FRT 0x80000000 // FrameRemainingToggle // HcRhDescriptorA #define OHCI_RHA_RW_MASK 0x00000000 // Mask of supported features #define OHCI_RHA_PSM (1<<8) // PowerSwitchingMode @@ -124,6 +129,15 @@ typedef enum _OHCI_State } OHCI_State; +// Host Controller Communications Area +typedef struct _OHCI_HCCA +{ + uint32_t HccaInterrruptTable[32]; + uint16_t HccaFrameNumber, HccaPad1; + uint32_t HccaDoneHead; +} +OHCI_HCCA; + // Small struct used to hold the HcRhPortStatus register and the usb port status typedef struct _OHCIPort { @@ -140,7 +154,8 @@ typedef struct _OHCI_Registers uint32_t HcControl; uint32_t HcCommandStatus; uint32_t HcInterruptStatus; - uint32_t HcInterrupt; // HcInterruptEnable/Disable are the same so we can merge them together + // HcInterruptEnable/Disable are the same so we can merge them together + uint32_t HcInterrupt; // Memory Pointer partition uint32_t HcHCCA; @@ -162,7 +177,7 @@ typedef struct _OHCI_Registers uint32_t HcRhDescriptorA; uint32_t HcRhDescriptorB; uint32_t HcRhStatus; - // I have some doubts here. Both XQEMU and OpenXbox set 4 ports per HC, for a total of 8 usb ports. + // ergo720: I have some doubts here. Both XQEMU and OpenXbox set 4 ports per HC, for a total of 8 usb ports. // Could it be becasue each gamepad can host 2 memory units? OHCIPort RhPort[2]; // 2 ports per HC, for a total of 4 USB ports } @@ -196,13 +211,20 @@ class OHCI uint64_t m_TicksPerUsbTick; // usb packet USBPacket m_UsbPacket; + // ergo720: I believe it's the value of HcControl in the last frame + uint32_t old_ctl; // irq number int m_IrqNum; + // ergo720: I think it's the DelayInterrupt flag in a TD + // -> num of frames to wait before generating an interrupt for this TD + int m_DoneCount; // EOF callback wrapper static void OHCI_FrameBoundaryWrapper(void* pVoid); // EOF callback function void OHCI_FrameBoundaryWorker(); + // inform the HCD that we got a problem here... + void OHCI_FatalError(); // initialize packet struct void OHCI_PacketInit(USBPacket* packet); // change usb state mode @@ -234,6 +256,10 @@ class OHCI // set a flag in a port status register but only set it if the port is connected, // if not set ConnectStatusChange flag; if flag is enabled return 1 int OHCI_PortSetIfConnected(int i, uint32_t Value); + // read the HCCA structure in memory + bool OHCI_ReadHCCA(uint32_t Paddr, OHCI_HCCA* Hcca); + // write the HCCA structure in memory + bool OHCI_WriteHCCA(uint32_t Paddr, OHCI_HCCA* Hcca); // register a port with the HC void USB_RegisterPort(USBPort* Port, int Index, int SpeedMask); diff --git a/src/devices/USBController/USBDevice.cpp b/src/devices/USBController/USBDevice.cpp index 4e8f2a2c9..6990e7fbe 100644 --- a/src/devices/USBController/USBDevice.cpp +++ b/src/devices/USBController/USBDevice.cpp @@ -65,7 +65,7 @@ uint32_t USBDevice::MMIORead(int barIndex, uint32_t addr, unsigned size) assert(barIndex == 0); // Figure out the correct OHCI object and read the register - if (addr >= USB0_BASE) { + if (addr < USB1_BASE) { // USB0 queried return m_pHostController1->OHCI_ReadRegister(addr); } @@ -80,7 +80,7 @@ void USBDevice::MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned assert(barIndex == 0); // Figure out the correct OHCI object and write the value to the register - if (addr >= USB0_BASE) { + if (addr < USB1_BASE) { // USB0 queried m_pHostController1->OHCI_WriteRegister(addr, value); return; From 828822c695cd85e9e87e5b085085b181ad9a8c3b Mon Sep 17 00:00:00 2001 From: ergo720 Date: Thu, 31 May 2018 12:07:10 +0200 Subject: [PATCH 0028/1000] OHCI_GetFrameRemaining --- build/win32/Cxbx.vcxproj | 1 + build/win32/Cxbx.vcxproj.filters | 3 ++ src/Common/Cxbx.cpp | 66 ++++++++++++++++++++++++++++++ src/Cxbx.h | 5 +++ src/CxbxKrnl/Timer.cpp | 28 +------------ src/devices/USBController/OHCI.cpp | 43 +++++++++++++++---- src/devices/USBController/OHCI.h | 2 + 7 files changed, 112 insertions(+), 36 deletions(-) create mode 100644 src/Common/Cxbx.cpp diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index 0a228a0d5..52d87eaa8 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -418,6 +418,7 @@ + diff --git a/build/win32/Cxbx.vcxproj.filters b/build/win32/Cxbx.vcxproj.filters index 02d983177..5263f03de 100644 --- a/build/win32/Cxbx.vcxproj.filters +++ b/build/win32/Cxbx.vcxproj.filters @@ -289,6 +289,9 @@ Emulator + + + GUI GUI diff --git a/src/Common/Cxbx.cpp b/src/Common/Cxbx.cpp new file mode 100644 index 000000000..16f0b48de --- /dev/null +++ b/src/Common/Cxbx.cpp @@ -0,0 +1,66 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * Cxbx->Common->Cxbx.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** + +// The intent of this file is to add general functions which are not kernel specific (for those CxbxKrnl.h should be used instead) + +#include "Cxbx.h" + + +// Disable a compiler warning relative to uint64_t -> uint32_t conversions in Muldiv64. This function is taken from +// XQEMU so it should be safe regardless +#pragma warning(push) +#pragma warning(disable: 4244) + +uint64_t Muldiv64(uint64_t a, uint32_t b, uint32_t c) +{ + union { + uint64_t ll; + struct { + uint32_t low, high; + } l; + } u, res; + uint64_t rl, rh; + + u.ll = a; + rl = (uint64_t)u.l.low * (uint64_t)b; + rh = (uint64_t)u.l.high * (uint64_t)b; + rh += (rl >> 32); + res.l.high = rh / c; + res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c; + return res.ll; +} + +#pragma warning(pop) diff --git a/src/Cxbx.h b/src/Cxbx.h index 56b9ad612..0ee1c62fa 100644 --- a/src/Cxbx.h +++ b/src/Cxbx.h @@ -34,6 +34,8 @@ #ifndef CXBX_H #define CXBX_H +#include + #define FUNC_EXPORTS __pragma(comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)) /*! \name primitive typedefs */ @@ -157,4 +159,7 @@ extern volatile bool g_bPrintfOn; #define CxbxSetThreadName(Name) #endif +// Compute (a*b)/c with a 96 bit intermediate result +inline uint64_t Muldiv64(uint64_t a, uint32_t b, uint32_t c); + #endif diff --git a/src/CxbxKrnl/Timer.cpp b/src/CxbxKrnl/Timer.cpp index 85d6ae95d..5722540e9 100644 --- a/src/CxbxKrnl/Timer.cpp +++ b/src/CxbxKrnl/Timer.cpp @@ -38,6 +38,7 @@ #include #include #include "Timer.h" +#include "Cxbx.h" #define CLOCK_REALTIME 0 @@ -54,31 +55,6 @@ static std::vector TimerList; static uint64_t ClockFrequency; -// Disable a compiler warning relative to uint64_t -> uint32_t conversions in Muldiv64. This function is taken from -// XQEMU so it should be safe regardless -#pragma warning(push) -#pragma warning(disable: 4244) - -// Compute (a*b)/c with a 96 bit intermediate result -static inline uint64_t Muldiv64(uint64_t a, uint32_t b, uint32_t c) -{ - union { - uint64_t ll; - struct { - uint32_t low, high; - } l; - } u, res; - uint64_t rl, rh; - - u.ll = a; - rl = (uint64_t)u.l.low * (uint64_t)b; - rh = (uint64_t)u.l.high * (uint64_t)b; - rh += (rl >> 32); - res.l.high = rh / c; - res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c; - return res.ll; -} - // Returns the current time of the timer inline uint64_t GetTime_NS(TimerObject* Timer) { @@ -88,8 +64,6 @@ inline uint64_t GetTime_NS(TimerObject* Timer) return Timer->Type == CLOCK_REALTIME ? Ret : Ret / Timer->SlowdownFactor; } -#pragma warning(pop) - // Calculates the next expire time of the timer static inline uint64_t GetNextExpireTime(TimerObject* Timer) { diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index 78cfeae3f..53b458b16 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -158,7 +158,7 @@ void OHCI::OHCI_FatalError() OHCI_BusStop(); } -bool OHCI::OHCI_ReadHCCA(uint32_t Paddr, OHCI_HCCA* Hcca) +bool OHCI::OHCI_ReadHCCA(xbaddr Paddr, OHCI_HCCA* Hcca) { // ergo720: I disassembled various xbe's of my games and discovered that the shared memory between // HCD and HC is allocated with MmAllocateContiguousMemory which means we can access it from @@ -172,14 +172,14 @@ bool OHCI::OHCI_ReadHCCA(uint32_t Paddr, OHCI_HCCA* Hcca) return true; // error } -bool OHCI::OHCI_WriteHCCA(uint32_t Paddr, OHCI_HCCA* Hcca) +bool OHCI::OHCI_WriteHCCA(xbaddr Paddr, OHCI_HCCA* Hcca) { if (Paddr != xbnull) { // We need to calculate the offset of the HccaFrameNumber member to avoid overwriting HccaInterrruptTable - size_t OffsetoOfFrameNumber = offsetof(OHCI_HCCA, HccaFrameNumber); + size_t OffsetOfFrameNumber = offsetof(OHCI_HCCA, HccaFrameNumber); - std::memcpy(reinterpret_cast(Paddr + OffsetoOfFrameNumber + CONTIGUOUS_MEMORY_BASE), - reinterpret_cast(Hcca) + OffsetoOfFrameNumber, 8); + std::memcpy(reinterpret_cast(Paddr + OffsetOfFrameNumber + CONTIGUOUS_MEMORY_BASE), + reinterpret_cast(Hcca) + OffsetOfFrameNumber, 8); return false; } @@ -312,7 +312,7 @@ uint32_t OHCI::OHCI_ReadRegister(xbaddr Addr) if (Addr & 3) { // The standard allows only aligned reads to the registers - EmuWarning("Ohci: Unaligned read. Ignoring."); + DbgPrintf("Ohci: Unaligned read. Ignoring."); return ret; } else { @@ -372,7 +372,7 @@ uint32_t OHCI::OHCI_ReadRegister(xbaddr Addr) break; case 14: // HcFmRemaining - // TODO + ret = OHCI_GetFrameRemaining(); break; case 15: // HcFmNumber @@ -419,7 +419,7 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) { if (Addr & 3) { // The standard allows only aligned writes to the registers - EmuWarning("Ohci: Unaligned write. Ignoring."); + DbgPrintf("Ohci: Unaligned write. Ignoring."); return; } else { @@ -559,6 +559,29 @@ void OHCI::OHCI_SetInterrupt(uint32_t Value) OHCI_UpdateInterrupt(); } +uint32_t OHCI::OHCI_GetFrameRemaining() +{ + uint16_t frame; + uint64_t ticks; + + if ((m_Registers.HcControl & OHCI_CTL_HCFS) != Operational) { + return m_Registers.HcFmRemaining & OHCI_FMR_FRT; + } + + // Being in USB operational state guarantees that m_pEOFtimer and m_SOFtime were set already + ticks = GetTime_NS(m_pEOFtimer) - m_SOFtime; + + // Avoid Muldiv64 if possible + if (ticks >= m_UsbFrameTime) { + return m_Registers.HcFmRemaining & OHCI_FMR_FRT; + } + + ticks = Muldiv64(1, ticks, m_TicksPerUsbTick); + frame = static_cast((m_Registers.HcFmInterval & OHCI_FMI_FI) - ticks); + + return (m_Registers.HcFmRemaining & OHCI_FMR_FRT) | frame; +} + void OHCI::OHCI_StopEndpoints() { USBDev* dev; @@ -694,8 +717,9 @@ int OHCI::OHCI_PortSetIfConnected(int i, uint32_t Value) return 0; } - if (m_Registers.RhPort[i].HcRhPortStatus & Value) + if (m_Registers.RhPort[i].HcRhPortStatus & Value) { ret = 0; + } // set the bit m_Registers.RhPort[i].HcRhPortStatus |= Value; @@ -715,6 +739,7 @@ void OHCI::OHCI_Detach(USBPort* Port) port->HcRhPortStatus &= ~OHCI_PORT_CCS; port->HcRhPortStatus |= OHCI_PORT_CSC; } + // disable port if (port->HcRhPortStatus & OHCI_PORT_PES) { port->HcRhPortStatus &= ~OHCI_PORT_PES; diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index a9a39688e..4374a08a4 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -241,6 +241,8 @@ class OHCI void OHCI_UpdateInterrupt(); // fire an interrupt void OHCI_SetInterrupt(uint32_t Value); + // calculate frame time remaining + uint32_t OHCI_GetFrameRemaining(); // void OHCI_StopEndpoints(); // update ohci registers during a device attach From ea164dd769fdfe45b1f3b2e3ea5cbad5a9045b55 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Thu, 31 May 2018 12:59:10 +0200 Subject: [PATCH 0029/1000] Fix SOF timer bug --- src/devices/USBController/OHCI.cpp | 16 +++++++++++----- src/devices/USBController/OHCI.h | 6 +++--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index 53b458b16..869ce9a9a 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -139,7 +139,7 @@ void OHCI::OHCI_FrameBoundaryWorker() } // Do SOF stuff here - OHCI_SOF(); + OHCI_SOF(false); // Writeback HCCA if (OHCI_WriteHCCA(m_Registers.HcHCCA, &hcca)) { @@ -243,7 +243,7 @@ void OHCI::OHCI_BusStart() DbgPrintf("Ohci: Operational mode event\n"); // SOF event - OHCI_SOF(); + OHCI_SOF(true); } void OHCI::OHCI_BusStop() @@ -255,10 +255,16 @@ void OHCI::OHCI_BusStop() m_pEOFtimer = nullptr; } -void OHCI::OHCI_SOF() +void OHCI::OHCI_SOF(bool bCreate) { - m_SOFtime = GetTime_NS(m_pEOFtimer); // set current SOF time - Timer_Start(m_pEOFtimer, m_SOFtime + m_UsbFrameTime); // make timer expire at SOF + 1 virtual ms from now + // set current SOF time + m_SOFtime = GetTime_NS(m_pEOFtimer); + + // make timer expire at SOF + 1 virtual ms from now + if (bCreate) { + Timer_Start(m_pEOFtimer, m_UsbFrameTime); + } + OHCI_SetInterrupt(OHCI_INTR_SF); } diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index 4374a08a4..1838d4894 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -236,7 +236,7 @@ class OHCI // stop sending SOF tokens across the usb bus void OHCI_BusStop(); // generate a SOF event, and start a timer for EOF - void OHCI_SOF(); + void OHCI_SOF(bool bCreate); // change interrupt status void OHCI_UpdateInterrupt(); // fire an interrupt @@ -259,9 +259,9 @@ class OHCI // if not set ConnectStatusChange flag; if flag is enabled return 1 int OHCI_PortSetIfConnected(int i, uint32_t Value); // read the HCCA structure in memory - bool OHCI_ReadHCCA(uint32_t Paddr, OHCI_HCCA* Hcca); + bool OHCI_ReadHCCA(xbaddr Paddr, OHCI_HCCA* Hcca); // write the HCCA structure in memory - bool OHCI_WriteHCCA(uint32_t Paddr, OHCI_HCCA* Hcca); + bool OHCI_WriteHCCA(xbaddr Paddr, OHCI_HCCA* Hcca); // register a port with the HC void USB_RegisterPort(USBPort* Port, int Index, int SpeedMask); From c0bc5545bb0468773a857a6ddf42064ca0930770 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Sat, 2 Jun 2018 17:48:33 +0200 Subject: [PATCH 0030/1000] ED processing stuff --- src/devices/USBController/OHCI.cpp | 226 ++++++++++++++++++++++++-- src/devices/USBController/OHCI.h | 116 ++++--------- src/devices/USBController/USBDevice.h | 13 +- 3 files changed, 258 insertions(+), 97 deletions(-) diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index 869ce9a9a..6498c0434 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -37,6 +37,91 @@ #include "OHCI.h" #include "CxbxKrnl\EmuKrnl.h" // For HalSystemInterrupt +/* These macros are used to access the bits of the various registers */ +// HcControl +#define OHCI_CTL_CBSR ((1<<0)|(1<<1)) // ControlBulkServiceRatio +#define OHCI_CTL_PLE (1<<2) // PeriodicListEnable +#define OHCI_CTL_IE (1<<3) // IsochronousEnable +#define OHCI_CTL_CLE (1<<4) // ControlListEnable +#define OHCI_CTL_BLE (1<<5) // BulkListEnable +#define OHCI_CTL_HCFS ((1<<6)|(1<<7)) // HostControllerFunctionalState +#define OHCI_CTL_IR (1<<8) // InterruptRouting +#define OHCI_CTL_RWC (1<<9) // RemoteWakeupConnected +#define OHCI_CTL_RWE (1<<10) // RemoteWakeupEnable +// HcCommandStatus +#define OHCI_STATUS_HCR (1<<0) // HostControllerReset +#define OHCI_STATUS_CLF (1<<1) // ControlListFilled +#define OHCI_STATUS_BLF (1<<2) // BulkListFilled +#define OHCI_STATUS_OCR (1<<3) // OwnershipChangeRequest +#define OHCI_STATUS_SOC ((1<<6)|(1<<7)) // SchedulingOverrunCount +// HcInterruptStatus +#define OHCI_INTR_SO (1<<0) // SchedulingOverrun +#define OHCI_INTR_WD (1<<1) // WritebackDoneHead +#define OHCI_INTR_SF (1<<2) // StartofFrame +#define OHCI_INTR_RD (1<<3) // ResumeDetected +#define OHCI_INTR_UE (1<<4) // UnrecoverableError +#define OHCI_INTR_FNO (1<<5) // FrameNumberOverflow +#define OHCI_INTR_RHSC (1<<6) // RootHubStatusChange +#define OHCI_INTR_OC (1<<30) // OwnershipChange +// HcInterruptEnable, HcInterruptDisable +#define OHCI_INTR_MIE (1<<31) // MasterInterruptEnable +// HcHCCA +#define OHCI_HCCA_MASK 0xFFFFFF00 // HCCA mask +// HcFmInterval +#define OHCI_FMI_FI 0x00003FFF // FrameInterval +#define OHCI_FMI_FIT 0x80000000 // FrameIntervalToggle +// HcFmRemaining +#define OHCI_FMR_FR 0x00003FFF // FrameRemaining +#define OHCI_FMR_FRT 0x80000000 // FrameRemainingToggle +// HcRhDescriptorA +#define OHCI_RHA_RW_MASK 0x00000000 // Mask of supported features +#define OHCI_RHA_PSM (1<<8) // PowerSwitchingMode +#define OHCI_RHA_NPS (1<<9) // NoPowerSwitching +#define OHCI_RHA_DT (1<<10) // DeviceType +#define OHCI_RHA_OCPM (1<<11) // OverCurrentProtectionMode +#define OHCI_RHA_NOCP (1<<12) // NoOverCurrentProtection +// HcRhStatus +#define OHCI_RHS_LPS (1<<0) // LocalPowerStatus +#define OHCI_RHS_OCI (1<<1) // OverCurrentIndicator +#define OHCI_RHS_DRWE (1<<15) // DeviceRemoteWakeupEnable +#define OHCI_RHS_LPSC (1<<16) // LocalPowerStatusChange +#define OHCI_RHS_OCIC (1<<17) // OverCurrentIndicatorChange +#define OHCI_RHS_CRWE (1<<31) // ClearRemoteWakeupEnable +// HcRhPortStatus +#define OHCI_PORT_CCS (1<<0) // CurrentConnectStatus +#define OHCI_PORT_PES (1<<1) // PortEnableStatus +#define OHCI_PORT_PSS (1<<2) // PortSuspendStatus +#define OHCI_PORT_POCI (1<<3) // PortOverCurrentIndicator +#define OHCI_PORT_PRS (1<<4) // PortResetStatus +#define OHCI_PORT_PPS (1<<8) // PortPowerStatus +#define OHCI_PORT_LSDA (1<<9) // LowSpeedDeviceAttached +#define OHCI_PORT_CSC (1<<16) // ConnectStatusChange +#define OHCI_PORT_PESC (1<<17) // PortEnableStatusChange +#define OHCI_PORT_PSSC (1<<18) // PortSuspendStatusChange +#define OHCI_PORT_OCIC (1<<19) // PortOverCurrentIndicatorChange +#define OHCI_PORT_PRSC (1<<20) // PortResetStatusChange +#define OHCI_PORT_WTC (OHCI_PORT_CSC|OHCI_PORT_PESC|OHCI_PORT_PSSC \ + |OHCI_PORT_OCIC|OHCI_PORT_PRSC) + +/* Bitfields for the first word of an ED */ +#define OHCI_ED_FA_SHIFT 0 +#define OHCI_ED_FA_MASK (0x7F< big endian conversion from XQEMU } // Cancel all pending packets if either of the lists has been disabled @@ -160,9 +247,14 @@ void OHCI::OHCI_FatalError() bool OHCI::OHCI_ReadHCCA(xbaddr Paddr, OHCI_HCCA* Hcca) { - // ergo720: I disassembled various xbe's of my games and discovered that the shared memory between - // HCD and HC is allocated with MmAllocateContiguousMemory which means we can access it from - // the contiguous region. Hopefully XDK revisions didn't alter this... + // ergo720: there could be a peculiar problem if the shared memory between HCD and HC is allocated by the + // VMManager with VirtualAlloc: the physical allocation would not reside in memory.bin and if we tried to + // access the physical address of it, we would access an empty page. In practice, I disassembled various + // xbe's of my games and discovered that this shared memory is allocated with MmAllocateContiguousMemory + // which means we can access it from the contiguous region just fine (lucky) + // ... provided that XDK revisions didn't alter this + + // NOTE: this shared memory contains the HCCA + EDs and TDs if (Paddr != xbnull) { std::memcpy(Hcca, reinterpret_cast(Paddr + CONTIGUOUS_MEMORY_BASE), sizeof(OHCI_HCCA)); @@ -186,6 +278,114 @@ bool OHCI::OHCI_WriteHCCA(xbaddr Paddr, OHCI_HCCA* Hcca) return true; // error } +bool OHCI::OHCI_ReadED(xbaddr Paddr, OHCI_ED* Ed) +{ + return OHCI_GetDwords(Paddr, reinterpret_cast(Ed), sizeof(*Ed) >> 2); // ED is 16 bytes large +} + +bool OHCI::OHCI_WriteED(xbaddr Paddr, OHCI_ED* Ed) +{ + // According to the standard, only the HeadP field is writable by the HC, so we'll write just that + size_t OffsetOfHeadP = offsetof(OHCI_ED, HeadP); + + return OHCI_WriteDwords(Paddr + OffsetOfHeadP, reinterpret_cast(reinterpret_cast(Ed) + OffsetOfHeadP), 1); +} + +bool OHCI::OHCI_GetDwords(xbaddr Paddr, uint32_t* Buffer, int Number) +{ + if (Paddr != xbnull) { + for (int i = 0; i < Number; i++, Buffer++, Paddr += sizeof(*Buffer)) { + std::memcpy(Buffer, reinterpret_cast(Paddr + CONTIGUOUS_MEMORY_BASE), 4); // dropped little -> big endian conversion from XQEMU + } + return false; + } + + return true; // error +} + +bool OHCI::OHCI_WriteDwords(xbaddr Paddr, uint32_t* Buffer, int Number) +{ + if (Paddr != xbnull) { + for (int i = 0; i < Number; i++, Buffer++, Paddr += sizeof(*Buffer)) { + std::memcpy(reinterpret_cast(Paddr + CONTIGUOUS_MEMORY_BASE), Buffer, 4); // dropped big -> little endian conversion from XQEMU + } + return false; + } + + return true; // error +} + +int OHCI::OHCI_ServiceEDlist(xbaddr Head, int Completion) +{ + OHCI_ED ed; + xbaddr next_ed; + xbaddr current; + int active; + + active = 0; + + if (Head == xbnull) { + // no ED here, nothing to do + return 0; + } + + for (current = Head; current; current = next_ed) { + if (OHCI_ReadED(current, &ed)) { + EmuWarning("Ohci: ED read error at physical address 0x%X", current); + OHCI_FatalError(); + return 0; + } + + // From the standard "An Endpoint Descriptor (ED) is a 16-byte, memory resident structure that must be aligned to a + // 16-byte boundary." + next_ed = ed.NextED & OHCI_DPTR_MASK; + + if ((ed.HeadP & OHCI_ED_H) || (ed.Flags & OHCI_ED_K)) { // halted or skip + // Cancel pending packets for ED that have been paused + xbaddr addr = ed.HeadP & OHCI_DPTR_MASK; + if (AsyncTD && addr == AsyncTD) { + usb_cancel_packet(&ohci->usb_packet); + AsyncTD = xbnull; + USB_DeviceEPstopped(m_UsbPacket.Endpoint->Dev, m_UsbPacket.Endpoint); + } + continue; + } + + while ((ed.HeadP & OHCI_DPTR_MASK) != ed.TailP) { // a TD is available to be processed +#ifdef DEBUG_PACKET + DPRINTF("ED @ 0x%.8x fa=%u en=%u d=%u s=%u k=%u f=%u mps=%u " + "h=%u c=%u\n head=0x%.8x tailp=0x%.8x next=0x%.8x\n", cur, + OHCI_BM(ed.flags, ED_FA), OHCI_BM(ed.flags, ED_EN), + OHCI_BM(ed.flags, ED_D), (ed.flags & OHCI_ED_S) != 0, + (ed.flags & OHCI_ED_K) != 0, (ed.flags & OHCI_ED_F) != 0, + OHCI_BM(ed.flags, ED_MPS), (ed.head & OHCI_ED_H) != 0, + (ed.head & OHCI_ED_C) != 0, ed.head & OHCI_DPTR_MASK, + ed.tail & OHCI_DPTR_MASK, ed.next & OHCI_DPTR_MASK); +#endif + active = 1; + + if ((ed.Flags & OHCI_ED_F) == 0) { + // Handle control, interrupt or bulk endpoints + if (ohci_service_td(ohci, &ed)) + break; + } + else { + // Handle isochronous endpoints + if (ohci_service_iso_td(ohci, &ed, completion)) + break; + } + } + + // Writeback ED + if (OHCI_WriteED(current, &ed)) { + OHCI_FatalError(); + return 0; + } + } + + return active; +} + void OHCI::OHCI_StateReset() { // The usb state can be USB_Suspend if it is a software reset, and USB_Reset if it is a hardware @@ -220,6 +420,9 @@ void OHCI::OHCI_StateReset() m_Registers.HcRhDescriptorA = OHCI_RHA_NPS | 2; // The xbox lacks the hw to switch off the power on the ports and has 2 ports per HC m_Registers.HcRhDescriptorB = 0; // The attached devices are removable and use PowerSwitchingMode to control the power on the ports + + m_DoneCount = 7; + for (int i = 0; i < 2; i++) { OHCIPort* Port = &m_Registers.RhPort[i]; @@ -228,7 +431,10 @@ void OHCI::OHCI_StateReset() USB_PortReset(&Port->UsbPort); } } - m_DoneCount = 7; + if (AsyncTD) { + usb_cancel_packet(&ohci->usb_packet); + AsyncTD = xbnull; + } OHCI_StopEndpoints(); @@ -480,19 +686,19 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) break; case 8: // HcControlHeadED - m_Registers.HcControlHeadED = Value & OHCI_EDPTR_MASK; + m_Registers.HcControlHeadED = Value & OHCI_DPTR_MASK; break; case 9: // HcControlCurrentED - m_Registers.HcControlCurrentED = Value & OHCI_EDPTR_MASK; + m_Registers.HcControlCurrentED = Value & OHCI_DPTR_MASK; break; case 10: // HcBulkHeadED - m_Registers.HcBulkHeadED = Value & OHCI_EDPTR_MASK; + m_Registers.HcBulkHeadED = Value & OHCI_DPTR_MASK; break; case 11: // HcBulkCurrentED - m_Registers.HcBulkCurrentED = Value & OHCI_EDPTR_MASK; + m_Registers.HcBulkCurrentED = Value & OHCI_DPTR_MASK; break; case 12: // HcDoneHead diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index 1838d4894..9fa251899 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -43,83 +43,25 @@ // Abbreviations used: -// OHCI: Open Host Controller Interface; the standard used on the xbox to comunicate with the usb devices +// OHCI: Open Host Controller Interface; the standard used on the Xbox to comunicate with the usb devices // HC: Host Controller; the hardware which interfaces with the usb device and the usb driver // HCD: Host Controller Driver; software which talks to the HC, it's linked in the xbe // SOF: start of frame; the beginning of a USB-defined frame // EOF: end of frame; the end of a USB-defined frame +// ED: endpoint descriptor; a memory structure used by the HC to communicate with an endpoint // TD: transfer descriptor; a memory structure used by the HC to transfer a block of data to/from a device endpoint -// These macros are used to access the bits of the various registers -// HcControl -#define OHCI_CTL_CBSR ((1<<0)|(1<<1)) // ControlBulkServiceRatio -#define OHCI_CTL_PLE (1<<2) // PeriodicListEnable -#define OHCI_CTL_IE (1<<3) // IsochronousEnable -#define OHCI_CTL_CLE (1<<4) // ControlListEnable -#define OHCI_CTL_BLE (1<<5) // BulkListEnable -#define OHCI_CTL_HCFS ((1<<6)|(1<<7)) // HostControllerFunctionalState -#define OHCI_CTL_IR (1<<8) // InterruptRouting -#define OHCI_CTL_RWC (1<<9) // RemoteWakeupConnected -#define OHCI_CTL_RWE (1<<10) // RemoteWakeupEnable -// HcCommandStatus -#define OHCI_STATUS_HCR (1<<0) // HostControllerReset -#define OHCI_STATUS_CLF (1<<1) // ControlListFilled -#define OHCI_STATUS_BLF (1<<2) // BulkListFilled -#define OHCI_STATUS_OCR (1<<3) // OwnershipChangeRequest -#define OHCI_STATUS_SOC ((1<<6)|(1<<7)) // SchedulingOverrunCount -// HcInterruptStatus -#define OHCI_INTR_SO (1<<0) // SchedulingOverrun -#define OHCI_INTR_WD (1<<1) // WritebackDoneHead -#define OHCI_INTR_SF (1<<2) // StartofFrame -#define OHCI_INTR_RD (1<<3) // ResumeDetected -#define OHCI_INTR_UE (1<<4) // UnrecoverableError -#define OHCI_INTR_FNO (1<<5) // FrameNumberOverflow -#define OHCI_INTR_RHSC (1<<6) // RootHubStatusChange -#define OHCI_INTR_OC (1<<30) // OwnershipChange -// HcInterruptEnable, HcInterruptDisable -#define OHCI_INTR_MIE (1<<31) // MasterInterruptEnable -// HcHCCA -#define OHCI_HCCA_MASK 0xFFFFFF00 // HCCA mask -// HcControlHeadED -#define OHCI_EDPTR_MASK 0xFFFFFFF0 // endpoint descriptor mask -// HcFmInterval -#define OHCI_FMI_FI 0x00003FFF // FrameInterval -#define OHCI_FMI_FIT 0x80000000 // FrameIntervalToggle -// HcFmRemaining -#define OHCI_FMR_FR 0x00003FFF // FrameRemaining -#define OHCI_FMR_FRT 0x80000000 // FrameRemainingToggle -// HcRhDescriptorA -#define OHCI_RHA_RW_MASK 0x00000000 // Mask of supported features -#define OHCI_RHA_PSM (1<<8) // PowerSwitchingMode -#define OHCI_RHA_NPS (1<<9) // NoPowerSwitching -#define OHCI_RHA_DT (1<<10) // DeviceType -#define OHCI_RHA_OCPM (1<<11) // OverCurrentProtectionMode -#define OHCI_RHA_NOCP (1<<12) // NoOverCurrentProtection -// HcRhStatus -#define OHCI_RHS_LPS (1<<0) // LocalPowerStatus -#define OHCI_RHS_OCI (1<<1) // OverCurrentIndicator -#define OHCI_RHS_DRWE (1<<15) // DeviceRemoteWakeupEnable -#define OHCI_RHS_LPSC (1<<16) // LocalPowerStatusChange -#define OHCI_RHS_OCIC (1<<17) // OverCurrentIndicatorChange -#define OHCI_RHS_CRWE (1<<31) // ClearRemoteWakeupEnable -// HcRhPortStatus -#define OHCI_PORT_CCS (1<<0) // CurrentConnectStatus -#define OHCI_PORT_PES (1<<1) // PortEnableStatus -#define OHCI_PORT_PSS (1<<2) // PortSuspendStatus -#define OHCI_PORT_POCI (1<<3) // PortOverCurrentIndicator -#define OHCI_PORT_PRS (1<<4) // PortResetStatus -#define OHCI_PORT_PPS (1<<8) // PortPowerStatus -#define OHCI_PORT_LSDA (1<<9) // LowSpeedDeviceAttached -#define OHCI_PORT_CSC (1<<16) // ConnectStatusChange -#define OHCI_PORT_PESC (1<<17) // PortEnableStatusChange -#define OHCI_PORT_PSSC (1<<18) // PortSuspendStatusChange -#define OHCI_PORT_OCIC (1<<19) // PortOverCurrentIndicatorChange -#define OHCI_PORT_PRSC (1<<20) // PortResetStatusChange -#define OHCI_PORT_WTC (OHCI_PORT_CSC|OHCI_PORT_PESC|OHCI_PORT_PSSC \ - |OHCI_PORT_OCIC|OHCI_PORT_PRSC) +/* endpoint descriptor */ +typedef struct _OHCI_ED { + uint32_t Flags; + uint32_t TailP; + uint32_t HeadP; + uint32_t NextED; +} +OHCI_ED; -// enum indicating the current HC state +/* enum indicating the current HC state */ typedef enum _OHCI_State { Reset = 0x00, @@ -129,7 +71,7 @@ typedef enum _OHCI_State } OHCI_State; -// Host Controller Communications Area +/* Host Controller Communications Area */ typedef struct _OHCI_HCCA { uint32_t HccaInterrruptTable[32]; @@ -138,7 +80,7 @@ typedef struct _OHCI_HCCA } OHCI_HCCA; -// Small struct used to hold the HcRhPortStatus register and the usb port status +/* Small struct used to hold the HcRhPortStatus register and the usb port status */ typedef struct _OHCIPort { USBPort UsbPort; @@ -146,7 +88,7 @@ typedef struct _OHCIPort } OHCIPort; -// All these registers are well documented in the OHCI standard +/* All these registers are well documented in the OHCI standard */ typedef struct _OHCI_Registers { // Control and Status partition @@ -184,7 +126,7 @@ typedef struct _OHCI_Registers OHCI_Registers; -// OHCI class representing the state of the HC +/* OHCI class representing the state of the HC */ class OHCI { public: @@ -209,7 +151,7 @@ class OHCI uint64_t m_UsbFrameTime; // ticks per usb tick uint64_t m_TicksPerUsbTick; - // usb packet + // pending usb packet to process USBPacket m_UsbPacket; // ergo720: I believe it's the value of HcControl in the last frame uint32_t old_ctl; @@ -218,6 +160,8 @@ class OHCI // ergo720: I think it's the DelayInterrupt flag in a TD // -> num of frames to wait before generating an interrupt for this TD int m_DoneCount; + // the address of the pending TD + xbaddr AsyncTD; // EOF callback wrapper static void OHCI_FrameBoundaryWrapper(void* pVoid); @@ -262,25 +206,35 @@ class OHCI bool OHCI_ReadHCCA(xbaddr Paddr, OHCI_HCCA* Hcca); // write the HCCA structure in memory bool OHCI_WriteHCCA(xbaddr Paddr, OHCI_HCCA* Hcca); + // read an ED in memory + bool OHCI_ReadED(xbaddr Paddr, OHCI_ED* Ed); + // write an ED in memory + bool OHCI_WriteED(xbaddr Paddr, OHCI_ED* Ed); + // read an array of DWORDs in memory + bool OHCI_GetDwords(xbaddr Paddr, uint32_t* Buffer, int Number); + // write an array of DWORDs in memory + bool OHCI_WriteDwords(xbaddr Paddr, uint32_t* Buffer, int Number); + // + int OHCI_ServiceEDlist(xbaddr Head, int Completion); // register a port with the HC void USB_RegisterPort(USBPort* Port, int Index, int SpeedMask); // - void USB_DeviceEPstopped(USBDev* Dev, USBEndpoint* EP); + void USB_DeviceEPstopped(USBDev* Dev, USBEndpoint* Ep); // reset a usb port void USB_PortReset(USBPort* Port); // a device is attched - void USB_Attach(USBPort* port); + void USB_Attach(USBPort* Port); // a device is detached - void USB_Detach(USBPort* port); + void USB_Detach(USBPort* Port); // a device downstream from the device attached to the port (attached through a hub) is detached - void ChildDetach(USBPort* port, USBDev* child); + void ChildDetach(USBPort* Port, USBDev* Child); // TODO - void Wakeup(USBPort* port); + void Wakeup(USBPort* Port); // TODO - void Complete(USBPort* port, USBPacket *p); + void Complete(USBPort* Port, USBPacket *P); // reset a device - void USB_DeviceReset(USBDev* dev); + void USB_DeviceReset(USBDev* Dev); }; #endif diff --git a/src/devices/USBController/USBDevice.h b/src/devices/USBController/USBDevice.h index 0ae8fedac..6b4a69154 100644 --- a/src/devices/USBController/USBDevice.h +++ b/src/devices/USBController/USBDevice.h @@ -56,7 +56,7 @@ typedef enum USBPacketState { } USBPacketState; -// This is a linux struct for vectored I/O. See readv() and writev() +/* This is a linux struct for vectored I/O. See readv() and writev() */ typedef struct _IoVec { void* Iov_Base; @@ -73,6 +73,7 @@ typedef struct _IOVector } IOVector; +/* USB endpoint */ typedef struct _USBEndpoint { uint8_t nr; @@ -82,12 +83,12 @@ typedef struct _USBEndpoint int max_packet_size; bool pipeline; bool halted; - USBDev *dev; + USBDev* Dev; // device this endpoint belongs to //QTAILQ_HEAD(, USBPacket) queue; } USBEndpoint; -// definition of a USB device +/* definition of a USB device */ typedef struct _USBDev { DeviceState qdev; @@ -181,13 +182,13 @@ typedef struct USBDeviceClass } USBDeviceClass; -// Structure used to hold information about an active USB packet +/* Structure used to hold information about an active USB packet */ typedef struct _USBPacket { // Data fields for use by the driver int Pid; uint64_t Id; - USBEndpoint* Endpoint; + USBEndpoint* Endpoint; // endpoint of the packet unsigned int stream; IOVector IoVec; // used to perform vectored I/O uint64_t parameter; // control transfers @@ -203,7 +204,7 @@ typedef struct _USBPacket } USBPacket; -// Struct describing the status of a usb port +/* Struct describing the status of a usb port */ typedef struct _USBPort { USBDev* Dev; // usb device (if present) int SpeedMask; // usb speeds supported From d8c42fc79b021d1d46c9455c1bac0ee64d7bd2b7 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Sat, 2 Jun 2018 19:47:19 +0200 Subject: [PATCH 0031/1000] VMManager identity mapping hack --- src/CxbxKrnl/VMManager.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/CxbxKrnl/VMManager.cpp b/src/CxbxKrnl/VMManager.cpp index 843cf13c2..c11ab993f 100644 --- a/src/CxbxKrnl/VMManager.cpp +++ b/src/CxbxKrnl/VMManager.cpp @@ -169,6 +169,12 @@ dashboard from non-retail xbe?"); // Reserve the xbe image memory. Doing this now allows us to avoid calling XbAllocateVirtualMemory later ConstructVMA(XBE_IMAGE_BASE, ROUND_UP_4K(CxbxKrnl_Xbe->m_Header.dwSizeofImage), UserRegion, ReservedVma, false, XBOX_PAGE_READWRITE); + // ergo720: another hack. On 128 MiB systems, also reserve the 64 MiB following the memory placeholder so that the VMManager + // is forbidden from making allocations there and the LLE OHCI can distinguish identity mapped addresses from contiguous addresses. + // Once LLE CPU and MMU are implemented, this can be removed + if (g_bIsRetail != true) { + ConstructVMA(XBE_IMAGE_BASE + XBE_MAX_VA, XBOX_MEMORY_SIZE, UserRegion, ReservedVma, true); + } if (g_bIsChihiro) { printf(LOG_PREFIX " Page table for Chihiro arcade initialized!\n"); @@ -2401,9 +2407,37 @@ PAddr VMManager::TranslateVAddrToPAddr(const VAddr addr) PAddr PAddr; PMMPTE PointerPte; + MemoryRegionType Type = COUNTRegion; Lock(); + // ergo720: boring, this hack identity maps allocations served by VirtualAlloc to keep the LLE OHCI working (see OHCI_ReadHCCA + // for more details). Once LLE CPU and MMU are implemented, this can be removed + + if (IS_USER_ADDRESS(addr)) { Type = UserRegion; } + else if (IS_PHYSICAL_ADDRESS(addr)) { Type = ContiguousRegion; } + else if (IS_SYSTEM_ADDRESS(addr)) { Type = SystemRegion; } + else if (IS_DEVKIT_ADDRESS(addr)) { Type = DevkitRegion; } + + if (Type != COUNTRegion && Type != ContiguousRegion) { + if (IsValidVirtualAddress(addr)) { + if (Type == UserRegion) { + EmuWarning("Applying identity mapping hack to allocation at address 0x%X", addr); + Unlock(); + RETURN(addr); // committed pages in the user region always use VirtualAlloc + } + VMAIter it = GetVMAIterator(addr, Type); + if (it != m_MemoryRegionArray[Type].RegionMap.end() && it->second.type != FreeVma && it->second.bFragmented) { + EmuWarning("Applying identity mapping hack to allocation at address 0x%X", addr); + Unlock(); + RETURN(addr); // committed pages in the system-devkit regions can use VirtualAlloc because of fragmentation + } + } + else { + goto InvalidAddress; + } + } + PointerPte = GetPdeAddress(addr); if (PointerPte->Hardware.Valid == 0) { // invalid pde -> addr is invalid goto InvalidAddress; From 756760d76b0ac3991d8f86ed813d6429507e0c0b Mon Sep 17 00:00:00 2001 From: ergo720 Date: Sun, 3 Jun 2018 18:58:48 +0200 Subject: [PATCH 0032/1000] Transfer descriptor stuff --- src/devices/USBController/OHCI.cpp | 398 ++++++++++++++++++++++++++++- src/devices/USBController/OHCI.h | 27 +- 2 files changed, 413 insertions(+), 12 deletions(-) diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index 6498c0434..0255928e6 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -109,19 +109,74 @@ #define OHCI_ED_EN_SHIFT 7 #define OHCI_ED_EN_MASK (0xF<> OHCI_##field##_SHIFT) + +#define OHCI_SET_BM(val, field, newval) do { \ + val &= ~OHCI_##field##_MASK; \ + val |= ((newval) << OHCI_##field##_SHIFT) & OHCI_##field##_MASK; \ + } while(0) + +/* Indicates the direction of data flow as specified by the TD */ +#define OHCI_TD_DIR_SETUP 0x0 // to endpoint +#define OHCI_TD_DIR_OUT 0x1 // to endpoint +#define OHCI_TD_DIR_IN 0x2 // from endpoint +#define OHCI_TD_DIR_RESERVED 0x3 + +#define OHCI_CC_NOERROR 0x0 +#define OHCI_CC_CRC 0x1 +#define OHCI_CC_BITSTUFFING 0x2 +#define OHCI_CC_DATATOGGLEMISMATCH 0x3 +#define OHCI_CC_STALL 0x4 +#define OHCI_CC_DEVICENOTRESPONDING 0x5 +#define OHCI_CC_PIDCHECKFAILURE 0x6 +#define OHCI_CC_UNDEXPETEDPID 0x7 +#define OHCI_CC_DATAOVERRUN 0x8 +#define OHCI_CC_DATAUNDERRUN 0x9 +#define OHCI_CC_BUFFEROVERRUN 0xC +#define OHCI_CC_BUFFERUNDERRUN 0xD + +#define USB_TOKEN_SETUP 0x2D +#define USB_TOKEN_IN 0x69 // device -> host +#define USB_TOKEN_OUT 0xE1 // host -> device + +#define USB_RET_SUCCESS (0) +#define USB_RET_NODEV (-1) +#define USB_RET_NAK (-2) +#define USB_RET_STALL (-3) +#define USB_RET_BABBLE (-4) +#define USB_RET_IOERROR (-5) +#define USB_RET_ASYNC (-6) +#define USB_RET_ADD_TO_QUEUE (-7) +#define USB_RET_REMOVE_FROM_QUEUE (-8) + #define USB_HZ 12000000 #define USB_SPEED_LOW 0 @@ -179,7 +234,7 @@ void OHCI::OHCI_FrameBoundaryWorker() if (ohci->old_ctl & (~ohci->ctl) & (OHCI_CTL_BLE | OHCI_CTL_CLE)) { if (ohci->async_td) { usb_cancel_packet(&ohci->usb_packet); - ohci->async_td = 0; + m_AsyncTD = xbnull; } OHCI_StopEndpoints(); } @@ -243,6 +298,7 @@ void OHCI::OHCI_FatalError() OHCI_SetInterrupt(OHCI_INTR_UE); OHCI_BusStop(); + DbgPrintf("Ohci: an unrecoverable error occoured!\n"); } bool OHCI::OHCI_ReadHCCA(xbaddr Paddr, OHCI_HCCA* Hcca) @@ -291,6 +347,83 @@ bool OHCI::OHCI_WriteED(xbaddr Paddr, OHCI_ED* Ed) return OHCI_WriteDwords(Paddr + OffsetOfHeadP, reinterpret_cast(reinterpret_cast(Ed) + OffsetOfHeadP), 1); } +bool OHCI::OHCI_ReadTD(xbaddr Paddr, OHCI_TD* Td) +{ + return OHCI_GetDwords(Paddr, reinterpret_cast(Td), sizeof(*Td) >> 2); // TD is 16 bytes large +} + +bool OHCI::OHCI_WriteTD(xbaddr Paddr, OHCI_TD* Td) +{ + return OHCI_WriteDwords(Paddr, reinterpret_cast(Td), sizeof(*Td) >> 2); +} + +bool OHCI::OHCI_CopyTD(OHCI_TD* Td, uint8_t* Buffer, int Length, bool bIsWrite) +{ + uint32_t ptr, n; + + // Figure out if we are crossing a 4K page boundary + ptr = Td->CurrentBufferPointer; + n = 0x1000 - (ptr & 0xFFF); + if (n > Length) { + n = Length; + } + + if (OHCI_FindAndCopyTD(ptr, Buffer, n, bIsWrite)) { + return true; // error + } + if (n == Length) { + return false; // no bytes left to copy + } + + // From the standard: "If during the data transfer the buffer address contained in the HCfs working copy of + // CurrentBufferPointer crosses a 4K boundary, the upper 20 bits of BufferEnd are copied to the + // working value of CurrentBufferPointer causing the next buffer address to be the 0th byte in the + // same 4K page that contains the last byte of the buffer." + ptr = Td->BufferEnd & ~0xFFFu; + Buffer += n; + if (OHCI_FindAndCopyTD(ptr, Buffer, Length - n, bIsWrite)) { + return true; // error + } + return false; +} + +bool OHCI::OHCI_FindAndCopyTD(xbaddr Paddr, uint8_t* Buffer, int Length, bool bIsWrite) +{ + // ergo720: the buffer pointed to by Paddr can be anywhere in memory (it depends on how the xbe has + // allocated it) so, sadly, we cannot make any assumptions here regarding its location like we did + // in OHCI_ReadHCCA and the problem with VirtualAlloc can arise this time. Because of the hack in + // TranslateVAddrToPAddr, VirtualAlloc allocations are identity mapped and addresses below 0x4000000 + // (Xbox) or 0x8000000 (Chihiro, Devkit) cannot be used by the VMManager for anything but to allocate + // xbe sections. This means that if Paddr is higher than the maximum possible physical address, then + // we know it's an identity mapped address, otherwise it's a contiguous address + + int offset = 0; + + if (Paddr == xbnull) { + return true; // error + } + + if (g_bIsRetail) { + if (Paddr < XBOX_MEMORY_SIZE) { + offset = CONTIGUOUS_MEMORY_BASE; + } + } + else { + if (Paddr < CHIHIRO_MEMORY_SIZE) { + offset = CONTIGUOUS_MEMORY_BASE; + } + } + + if (bIsWrite) { + std::memcpy(reinterpret_cast(Paddr + offset), Buffer, Length); + } + else { + std::memcpy(Buffer, reinterpret_cast(Paddr + offset), Length); + } + + return false; +} + bool OHCI::OHCI_GetDwords(xbaddr Paddr, uint32_t* Buffer, int Number) { if (Paddr != xbnull) { @@ -343,9 +476,9 @@ int OHCI::OHCI_ServiceEDlist(xbaddr Head, int Completion) if ((ed.HeadP & OHCI_ED_H) || (ed.Flags & OHCI_ED_K)) { // halted or skip // Cancel pending packets for ED that have been paused xbaddr addr = ed.HeadP & OHCI_DPTR_MASK; - if (AsyncTD && addr == AsyncTD) { + if (m_AsyncTD && addr == m_AsyncTD) { usb_cancel_packet(&ohci->usb_packet); - AsyncTD = xbnull; + m_AsyncTD = xbnull; USB_DeviceEPstopped(m_UsbPacket.Endpoint->Dev, m_UsbPacket.Endpoint); } continue; @@ -366,12 +499,13 @@ int OHCI::OHCI_ServiceEDlist(xbaddr Head, int Completion) if ((ed.Flags & OHCI_ED_F) == 0) { // Handle control, interrupt or bulk endpoints - if (ohci_service_td(ohci, &ed)) + if (OHCI_ServiceTD(&ed)) { break; + } } else { // Handle isochronous endpoints - if (ohci_service_iso_td(ohci, &ed, completion)) + if (ohci_service_iso_td(ohci, &ed, Completion)) break; } } @@ -386,6 +520,250 @@ int OHCI::OHCI_ServiceEDlist(xbaddr Head, int Completion) return active; } +int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) +{ + int direction; + size_t length = 0, packetlen = 0; +#ifdef DEBUG_PACKET + const char *str = NULL; +#endif + int pid; + int ret; + int i; + USBDev* dev; + USBEndpoint* ep; + OHCI_TD td; + xbaddr addr; + int flag_r; + int completion; + + addr = Ed->HeadP & OHCI_DPTR_MASK; + // See if this TD has already been submitted to the device + completion = (addr == m_AsyncTD); + if (completion && !m_AsyncComplete) { // ?? +#ifdef DEBUG_PACKET + DPRINTF("Skipping async TD\n"); + DbgPrintf("Skipping async TD\n"); +#endif + return 1; + } + if (OHCI_ReadTD(addr, &td)) { + EmuWarning("Ohci: TD read error at physical address 0x%X", addr); + OHCI_FatalError(); + return 0; + } + + // From the standard: "This 2-bit field indicates the direction of data flow and the PID + // to be used for the token. This field is only relevant to the HC if the D field in the ED + // was set to 00b or 11b indicating that the PID determination is deferred to the TD." + direction = OHCI_BM(Ed->Flags, ED_D); + switch (direction) { + case OHCI_TD_DIR_OUT: + case OHCI_TD_DIR_IN: + // Same value + break; + default: + direction = OHCI_BM(td.Flags, TD_DP); + } + + switch (direction) { + case OHCI_TD_DIR_IN: +#ifdef DEBUG_PACKET + str = "in"; +#endif + pid = USB_TOKEN_IN; + break; + case OHCI_TD_DIR_OUT: +#ifdef DEBUG_PACKET + str = "out"; +#endif + pid = USB_TOKEN_OUT; + break; + case OHCI_TD_DIR_SETUP: +#ifdef DEBUG_PACKET + str = "setup"; +#endif + pid = USB_TOKEN_SETUP; + break; + default: + EmuWarning("Ohci: bad direction"); + return 1; + } + + // Check if this TD has a buffer of user data to transfer + if (td.CurrentBufferPointer && td.BufferEnd) { + if ((td.CurrentBufferPointer & 0xFFFFF000) != (td.BufferEnd & 0xFFFFF000)) { + // the buffer crosses a 4K page boundary + length = (td.BufferEnd & 0xFFF) + 0x1001 - (td.CurrentBufferPointer & 0xFFF); + } + else { + // the buffer is within a single page + length = (td.BufferEnd - td.CurrentBufferPointer) + 1; + } + + packetlen = length; + if (length && direction != OHCI_TD_DIR_IN) { + // The endpoint may not allow us to transfer it all now + packetlen = (Ed->Flags & OHCI_ED_MPS_MASK) >> OHCI_ED_MPS_SHIFT; + if (packetlen > length) { + packetlen = length; + } + if (!completion) { + if (OHCI_CopyTD(&td, m_UsbBuffer, packetlen, false)) { + OHCI_FatalError(); + } + } + } + } + + flag_r = (td.Flags & OHCI_TD_R) != 0; +#ifdef DEBUG_PACKET + DPRINTF(" TD @ 0x%.8x %" PRId64 " of %" PRId64 + " bytes %s r=%d cbp=0x%.8x be=0x%.8x\n", + addr, (int64_t)pktlen, (int64_t)len, str, flag_r, td.cbp, td.be); + + if (pktlen > 0 && dir != OHCI_TD_DIR_IN) { + DPRINTF(" data:"); + for (i = 0; i < pktlen; i++) { + printf(" %.2x", ohci->usb_buf[i]); + } + DPRINTF("\n"); + } +#endif + if (completion) { + m_AsyncTD = 0; + m_AsyncComplete = 0; + } + else { + if (m_AsyncTD) { + // From XQEMU: "??? The hardware should allow one active packet per endpoint. + // We only allow one active packet per controller. This should be sufficient + // as long as devices respond in a timely manner." +#ifdef DEBUG_PACKET + DPRINTF("Too many pending packets\n"); +#endif + DbgPrintf("Too many pending packets\n"); + return 1; + } + dev = ohci_find_device(ohci, OHCI_BM(Ed->Flags, ED_FA)); + ep = usb_ep_get(dev, pid, OHCI_BM(Ed->Flags, ED_EN)); + usb_packet_setup(&m_UsbPacket, pid, ep, 0, addr, !flag_r, OHCI_BM(td.Flags, TD_DI) == 0); + usb_packet_addbuf(&m_UsbPacket, ohci->usb_buf, packetlen); + usb_handle_packet(dev, &m_UsbPacket); +#ifdef DEBUG_PACKET + DPRINTF("status=%d\n", ohci->usb_packet.status); +#endif + if (m_UsbPacket.status == USB_RET_ASYNC) { + usb_device_flush_ep_queue(dev, ep); + m_AsyncTD = addr; + return 1; + } + } + if (m_UsbPacket.status == USB_RET_SUCCESS) { + ret = m_UsbPacket.actual_length; + } + else { + ret = m_UsbPacket.status; + } + + if (ret >= 0) { + if (direction == OHCI_TD_DIR_IN) { + if (OHCI_CopyTD(&td, m_UsbBuffer, ret, true)) { + OHCI_FatalError(); + } +#ifdef DEBUG_PACKET + DPRINTF(" data:"); + for (i = 0; i < ret; i++) + printf(" %.2x", ohci->usb_buf[i]); + DPRINTF("\n"); +#endif + } + else { + ret = packetlen; + } + } + + if (ret >= 0) { + if ((td.CurrentBufferPointer & 0xFFF) + ret > 0xFFF) { + td.CurrentBufferPointer = (td.BufferEnd & ~0xFFF) + ((td.CurrentBufferPointer + ret) & 0xFFF); + } + else { + td.CurrentBufferPointer += ret; + } + } + + // Writeback + if (ret == packetlen || (direction == OHCI_TD_DIR_IN && ret >= 0 && flag_r)) { + // Transmission succeeded + if (ret == length) { + td.CurrentBufferPointer = 0; + } + td.Flags |= OHCI_TD_T1; + td.Flags ^= OHCI_TD_T0; + OHCI_SET_BM(td.Flags, TD_CC, OHCI_CC_NOERROR); + OHCI_SET_BM(td.Flags, TD_EC, 0); + + if ((direction != OHCI_TD_DIR_IN) && (ret != length)) { + // Partial packet transfer: TD not ready to retire yet + goto exit_no_retire; + } + + // Setting ED_C is part of the TD retirement process + Ed->HeadP &= ~OHCI_ED_C; + if (td.Flags & OHCI_TD_T0) + Ed->HeadP |= OHCI_ED_C; + } + else { + if (ret >= 0) { + DbgPrintf("Ohci: Underrun\n"); + OHCI_SET_BM(td.Flags, TD_CC, OHCI_CC_DATAUNDERRUN); + } + else { + switch (ret) { + case USB_RET_IOERROR: + case USB_RET_NODEV: + DbgPrintf("Ohci: Received DEV ERROR\n"); + OHCI_SET_BM(td.Flags, TD_CC, OHCI_CC_DEVICENOTRESPONDING); + break; + case USB_RET_NAK: + DbgPrintf("Ohci: Received NAK\n"); + return 1; + case USB_RET_STALL: + DbgPrintf("Ohci: Received STALL\n"); + OHCI_SET_BM(td.Flags, TD_CC, OHCI_CC_STALL); + break; + case USB_RET_BABBLE: + DbgPrintf("Ohci: Received BABBLE\n"); + OHCI_SET_BM(td.Flags, TD_CC, OHCI_CC_DATAOVERRUN); + break; + default: + DbgPrintf("Ohci: Bad device response %d\n", ret); + OHCI_SET_BM(td.Flags, TD_CC, OHCI_CC_UNDEXPETEDPID); + OHCI_SET_BM(td.Flags, TD_EC, 3); + } + } + Ed->HeadP |= OHCI_ED_H; + } + + // Retire this TD + Ed->HeadP &= ~OHCI_DPTR_MASK; + Ed->HeadP |= td.NextTD & OHCI_DPTR_MASK; + td.NextTD = m_Registers.HcDoneHead; + m_Registers.HcDoneHead = addr; + i = OHCI_BM(td.Flags, TD_DI); + if (i < m_DoneCount) + m_DoneCount = i; + if (OHCI_BM(td.Flags, TD_CC) != OHCI_CC_NOERROR) + m_DoneCount = 0; + +exit_no_retire: + if (OHCI_WriteTD(addr, &td)) { + OHCI_FatalError(); + return 1; + } + return OHCI_BM(td.Flags, TD_CC) != OHCI_CC_NOERROR; +} + void OHCI::OHCI_StateReset() { // The usb state can be USB_Suspend if it is a software reset, and USB_Reset if it is a hardware @@ -431,9 +809,9 @@ void OHCI::OHCI_StateReset() USB_PortReset(&Port->UsbPort); } } - if (AsyncTD) { + if (m_AsyncTD) { usb_cancel_packet(&ohci->usb_packet); - AsyncTD = xbnull; + m_AsyncTD = xbnull; } OHCI_StopEndpoints(); diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index 9fa251899..595fa37c7 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -61,6 +61,15 @@ typedef struct _OHCI_ED { } OHCI_ED; +/* general transfer descriptor */ +typedef struct _OHCI_TD { + uint32_t Flags; + uint32_t CurrentBufferPointer; + uint32_t NextTD; + uint32_t BufferEnd; +} +OHCI_TD; + /* enum indicating the current HC state */ typedef enum _OHCI_State { @@ -153,6 +162,8 @@ class OHCI uint64_t m_TicksPerUsbTick; // pending usb packet to process USBPacket m_UsbPacket; + // temporary buffer that holds the user data to transfer in a packet + uint8_t m_UsbBuffer[8192]; // ergo720: I believe it's the value of HcControl in the last frame uint32_t old_ctl; // irq number @@ -161,7 +172,9 @@ class OHCI // -> num of frames to wait before generating an interrupt for this TD int m_DoneCount; // the address of the pending TD - xbaddr AsyncTD; + xbaddr m_AsyncTD; + // ergo720: I think it signals that a TD has been processed completely + bool m_AsyncComplete; // EOF callback wrapper static void OHCI_FrameBoundaryWrapper(void* pVoid); @@ -210,12 +223,22 @@ class OHCI bool OHCI_ReadED(xbaddr Paddr, OHCI_ED* Ed); // write an ED in memory bool OHCI_WriteED(xbaddr Paddr, OHCI_ED* Ed); + // read an TD in memory + bool OHCI_ReadTD(xbaddr Paddr, OHCI_TD* Td); + // write a TD in memory + bool OHCI_WriteTD(xbaddr Paddr, OHCI_TD* Td); + // read/write the contents of a TD from/to main memory + bool OHCI_CopyTD(OHCI_TD* Td, uint8_t* Buffer, int Length, bool bIsWrite); + // find a TD buffer in memory and copy it + bool OHCI_FindAndCopyTD(xbaddr Paddr, uint8_t* Buffer, int Length, bool bIsWrite); // read an array of DWORDs in memory bool OHCI_GetDwords(xbaddr Paddr, uint32_t* Buffer, int Number); // write an array of DWORDs in memory bool OHCI_WriteDwords(xbaddr Paddr, uint32_t* Buffer, int Number); - // + // process an ED list int OHCI_ServiceEDlist(xbaddr Head, int Completion); + // process a TD. Returns nonzero to terminate processing of this endpoint + int OHCI_ServiceTD(OHCI_ED* Ed); // register a port with the HC void USB_RegisterPort(USBPort* Port, int Index, int SpeedMask); From 8ca5cff089ae126838980a12a60a6aca9e239472 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Sun, 3 Jun 2018 19:29:24 +0200 Subject: [PATCH 0033/1000] VMManager: small update to identity map hack --- src/CxbxKrnl/VMManager.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/CxbxKrnl/VMManager.cpp b/src/CxbxKrnl/VMManager.cpp index c11ab993f..b47b7dde2 100644 --- a/src/CxbxKrnl/VMManager.cpp +++ b/src/CxbxKrnl/VMManager.cpp @@ -173,7 +173,7 @@ dashboard from non-retail xbe?"); // is forbidden from making allocations there and the LLE OHCI can distinguish identity mapped addresses from contiguous addresses. // Once LLE CPU and MMU are implemented, this can be removed if (g_bIsRetail != true) { - ConstructVMA(XBE_IMAGE_BASE + XBE_MAX_VA, XBOX_MEMORY_SIZE, UserRegion, ReservedVma, true); + ConstructVMA(XBE_IMAGE_BASE + XBE_MAX_VA, XBOX_MEMORY_SIZE - XBE_MAX_VA, UserRegion, ReservedVma, true); } if (g_bIsChihiro) { @@ -2133,6 +2133,22 @@ xboxkrnl::NTSTATUS VMManager::XbVirtualMemoryStatistics(VAddr addr, xboxkrnl::PM Lock(); + // ergo720: hack. Always report as reserved the region after the memory placeholder and below 0x8000000 if we are emulating + // a 128 MiB system regardless of what VirtualQuery says. Once LLE CPU and MMU are implemented, this can be removed + + if (g_bIsRetail != true && addr >= XBE_IMAGE_BASE + XBE_MAX_VA && addr < CHIHIRO_MEMORY_SIZE) { + memory_statistics->AllocationBase = (void*)(XBE_IMAGE_BASE + XBE_MAX_VA); + memory_statistics->AllocationProtect = XBOX_PAGE_NOACCESS; + memory_statistics->BaseAddress = (void*)ROUND_DOWN_4K(addr); + memory_statistics->RegionSize = CHIHIRO_MEMORY_SIZE - ROUND_DOWN_4K(addr); + memory_statistics->State = XBOX_MEM_RESERVE; + memory_statistics->Protect = XBOX_PAGE_NOACCESS; + memory_statistics->Type = XBOX_MEM_PRIVATE; + + Unlock(); + return STATUS_SUCCESS; + } + // Locate the vma containing the supplied address it = GetVMAIterator(addr, UserRegion); From 0b5c2c911ca25a4035dc7e09b9e8e50157f4e3e3 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Tue, 5 Jun 2018 19:04:35 +0200 Subject: [PATCH 0034/1000] Packet processing stuff and refactored USBDevice class (WIP) --- src/devices/USBController/OHCI.cpp | 133 ++++++++---------------- src/devices/USBController/OHCI.h | 39 ++++--- src/devices/USBController/USBDevice.cpp | 125 +++++++++++++++++++++- src/devices/USBController/USBDevice.h | 95 +++++++++++------ 4 files changed, 250 insertions(+), 142 deletions(-) diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index 0255928e6..129a3185f 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -105,9 +105,9 @@ /* Bitfields for the first word of an ED */ #define OHCI_ED_FA_SHIFT 0 -#define OHCI_ED_FA_MASK (0x7F< host -#define USB_TOKEN_OUT 0xE1 // host -> device - -#define USB_RET_SUCCESS (0) -#define USB_RET_NODEV (-1) -#define USB_RET_NAK (-2) -#define USB_RET_STALL (-3) -#define USB_RET_BABBLE (-4) -#define USB_RET_IOERROR (-5) -#define USB_RET_ASYNC (-6) -#define USB_RET_ADD_TO_QUEUE (-7) -#define USB_RET_REMOVE_FROM_QUEUE (-8) - #define USB_HZ 12000000 #define USB_SPEED_LOW 0 @@ -191,12 +177,13 @@ typedef enum _USB_SPEED USB_SPEED; -OHCI::OHCI(int Irq) +OHCI::OHCI(int Irq, USBDevice* UsbObj) { m_IrqNum = Irq; + m_UsbDevice = UsbObj; for (int i = 0; i < 2; i++) { - USB_RegisterPort(&m_Registers.RhPort[i].UsbPort, i, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); + m_UsbDevice->USB_RegisterPort(&m_Registers.RhPort[i].UsbPort, i, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); } OHCI_PacketInit(&m_UsbPacket); @@ -479,7 +466,7 @@ int OHCI::OHCI_ServiceEDlist(xbaddr Head, int Completion) if (m_AsyncTD && addr == m_AsyncTD) { usb_cancel_packet(&ohci->usb_packet); m_AsyncTD = xbnull; - USB_DeviceEPstopped(m_UsbPacket.Endpoint->Dev, m_UsbPacket.Endpoint); + m_UsbDevice->USB_DeviceEPstopped(m_UsbPacket.Endpoint->Dev, m_UsbPacket.Endpoint); } continue; } @@ -530,7 +517,7 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) int pid; int ret; int i; - USBDev* dev; + XboxDevice* dev; USBEndpoint* ep; OHCI_TD td; xbaddr addr; @@ -566,6 +553,16 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) direction = OHCI_BM(td.Flags, TD_DP); } + // Info: Each USB transaction consists of a + // 1. Token Packet, (Header defining what it expects to follow). + // 2. Optional Data Packet, (Containing the payload). + // 3. Status Packet, (Used to acknowledge transactions and to provide a means of error correction). + + // There are three types of token packets: + // In - Informs the USB device that the host wishes to read information. + // Out - Informs the USB device that the host wishes to send information. + // Setup - Used to begin control transfers. + switch (direction) { case OHCI_TD_DIR_IN: #ifdef DEBUG_PACKET @@ -645,9 +642,9 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) DbgPrintf("Too many pending packets\n"); return 1; } - dev = ohci_find_device(ohci, OHCI_BM(Ed->Flags, ED_FA)); - ep = usb_ep_get(dev, pid, OHCI_BM(Ed->Flags, ED_EN)); - usb_packet_setup(&m_UsbPacket, pid, ep, 0, addr, !flag_r, OHCI_BM(td.Flags, TD_DI) == 0); + dev = OHCI_FindDevice(OHCI_BM(Ed->Flags, ED_FA)); + ep = m_UsbDevice->USB_GetEP(dev, pid, OHCI_BM(Ed->Flags, ED_EN)); + m_UsbDevice->USB_PacketSetup(&m_UsbPacket, pid, ep, 0, addr, !flag_r, OHCI_BM(td.Flags, TD_DI) == 0); usb_packet_addbuf(&m_UsbPacket, ohci->usb_buf, packetlen); usb_handle_packet(dev, &m_UsbPacket); #ifdef DEBUG_PACKET @@ -764,6 +761,24 @@ exit_no_retire: return OHCI_BM(td.Flags, TD_CC) != OHCI_CC_NOERROR; } +XboxDevice* OHCI::OHCI_FindDevice(uint8_t Addr) +{ + XboxDevice* dev; + int i; + + for (i = 0; i < 2; i++) { + if ((m_Registers.RhPort[i].HcRhPortStatus & OHCI_PORT_PES) == 0) { + continue; // port is disabled + } + dev = m_UsbDevice->USB_FindDevice(&m_Registers.RhPort[i].UsbPort, Addr); + if (dev != nullptr) { + return dev; // return found device + } + } + + return nullptr; +} + void OHCI::OHCI_StateReset() { // The usb state can be USB_Suspend if it is a software reset, and USB_Reset if it is a hardware @@ -806,7 +821,7 @@ void OHCI::OHCI_StateReset() OHCIPort* Port = &m_Registers.RhPort[i]; Port->HcRhPortStatus = 0; if (Port->UsbPort.Dev && Port->UsbPort.Dev->Attached) { - USB_PortReset(&Port->UsbPort); + m_UsbDevice->USB_PortReset(&Port->UsbPort); } } if (m_AsyncTD) { @@ -1174,16 +1189,16 @@ uint32_t OHCI::OHCI_GetFrameRemaining() void OHCI::OHCI_StopEndpoints() { - USBDev* dev; + XboxDevice* dev; int i, j; for (i = 0; i < 2; i++) { dev = m_Registers.RhPort[i].UsbPort.Dev; if (dev && dev->Attached) { - USB_DeviceEPstopped(dev, &dev->EP_ctl); + m_UsbDevice->USB_DeviceEPstopped(dev, &dev->EP_ctl); for (j = 0; j < USB_MAX_ENDPOINTS; j++) { - USB_DeviceEPstopped(dev, &dev->EP_in[j]); - USB_DeviceEPstopped(dev, &dev->EP_out[j]); + m_UsbDevice->USB_DeviceEPstopped(dev, &dev->EP_in[j]); + m_UsbDevice->USB_DeviceEPstopped(dev, &dev->EP_out[j]); } } } @@ -1269,7 +1284,7 @@ void OHCI::OHCI_PortSetStatus(int PortNum, uint32_t Value) if (OHCI_PortSetIfConnected(PortNum, Value & OHCI_PORT_PRS)) { DbgPrintf("Ohci: port %d: RESET\n", PortNum); - USB_DeviceReset(port->UsbPort.Dev); + m_UsbDevice->USB_DeviceReset(port->UsbPort.Dev); port->HcRhPortStatus &= ~OHCI_PORT_PRS; // ??? Should this also set OHCI_PORT_PESC port->HcRhPortStatus |= OHCI_PORT_PES | OHCI_PORT_PRSC; @@ -1371,63 +1386,3 @@ void OHCI::OHCI_Attach(USBPort* Port) } } -void OHCI::USB_RegisterPort(USBPort* Port, int Index, int SpeedMask) -{ - Port->PortIndex = Index; - Port->SpeedMask = SpeedMask; - Port->HubCount = 0; - std::snprintf(Port->Path, sizeof(Port->Path), "%d", Index + 1); -} - -void OHCI::USB_DeviceEPstopped(USBDev* Dev, USBEndpoint* EP) -{ - // This seems to be a nop in XQEMU since it doesn't assign the EP_Stopped function (it's nullptr) - USBDeviceClass* klass = USB_DEVICE_GET_CLASS(Dev); - if (klass->EP_Stopped) { - klass->EP_Stopped(Dev, EP); - } -} - -void OHCI::USB_PortReset(USBPort* Port) -{ - USBDev* dev = Port->Dev; - - assert(dev != nullptr); - USB_Detach(Port); - USB_Attach(Port); - USB_DeviceReset(dev); -} - -void OHCI::USB_Detach(USBPort* Port) -{ - USBDev* dev = Port->Dev; - - assert(dev != nullptr); - assert(dev->State != USB_STATE_NOTATTACHED); - OHCI_Detach(Port); - dev->State = USB_STATE_NOTATTACHED; -} - -void OHCI::USB_Attach(USBPort* Port) -{ - USBDev *dev = Port->Dev; - - assert(dev != nullptr); - assert(dev->Attached); - assert(dev->State == USB_STATE_NOTATTACHED); - OHCI_Attach(Port); - dev->State = USB_STATE_ATTACHED; - usb_device_handle_attach(dev); -} - -void OHCI::USB_DeviceReset(USBDev* dev) -{ - if (dev == nullptr || !dev->Attached) { - return; - } - - dev->RemoteWakeup = 0; - dev->Addr = 0; - dev->State = USB_STATE_DEFAULT; - usb_device_handle_reset(dev); -} diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index 595fa37c7..cdecea948 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -41,6 +41,20 @@ #include "USBDevice.h" #include "..\CxbxKrnl\Timer.h" +#define USB_TOKEN_SETUP 0x2D +#define USB_TOKEN_IN 0x69 // device -> host +#define USB_TOKEN_OUT 0xE1 // host -> device + +#define USB_RET_SUCCESS (0) +#define USB_RET_NODEV (-1) +#define USB_RET_NAK (-2) +#define USB_RET_STALL (-3) +#define USB_RET_BABBLE (-4) +#define USB_RET_IOERROR (-5) +#define USB_RET_ASYNC (-6) +#define USB_RET_ADD_TO_QUEUE (-7) +#define USB_RET_REMOVE_FROM_QUEUE (-8) + // Abbreviations used: // OHCI: Open Host Controller Interface; the standard used on the Xbox to comunicate with the usb devices @@ -140,7 +154,7 @@ class OHCI { public: // constructor - OHCI(int Irqn); + OHCI(int Irqn, USBDevice* UsbObj); // destructor ~OHCI() {} // read a register @@ -150,6 +164,8 @@ class OHCI private: + // pointer to g_USB0 or g_USB1 + USBDevice* m_UsbDevice; // all the registers available on the OHCI standard OHCI_Registers m_Registers; // end-of-frame timer @@ -239,25 +255,8 @@ class OHCI int OHCI_ServiceEDlist(xbaddr Head, int Completion); // process a TD. Returns nonzero to terminate processing of this endpoint int OHCI_ServiceTD(OHCI_ED* Ed); - - // register a port with the HC - void USB_RegisterPort(USBPort* Port, int Index, int SpeedMask); - // - void USB_DeviceEPstopped(USBDev* Dev, USBEndpoint* Ep); - // reset a usb port - void USB_PortReset(USBPort* Port); - // a device is attched - void USB_Attach(USBPort* Port); - // a device is detached - void USB_Detach(USBPort* Port); - // a device downstream from the device attached to the port (attached through a hub) is detached - void ChildDetach(USBPort* Port, USBDev* Child); - // TODO - void Wakeup(USBPort* Port); - // TODO - void Complete(USBPort* Port, USBPacket *P); - // reset a device - void USB_DeviceReset(USBDev* Dev); + // find the usb device with the supplied address + XboxDevice* OHCI::OHCI_FindDevice(uint8_t Addr); }; #endif diff --git a/src/devices/USBController/USBDevice.cpp b/src/devices/USBController/USBDevice.cpp index 6990e7fbe..6d2ec7049 100644 --- a/src/devices/USBController/USBDevice.cpp +++ b/src/devices/USBController/USBDevice.cpp @@ -52,11 +52,11 @@ void USBDevice::Init(unsigned int address) m_VendorId = PCI_VENDOR_ID_NVIDIA; if (address == USB0_BASE) { - m_pHostController1 = new OHCI(1); + m_pHostController1 = new OHCI(1, this); return; } - m_pHostController2 = new OHCI(9); + m_pHostController2 = new OHCI(9, this); } uint32_t USBDevice::MMIORead(int barIndex, uint32_t addr, unsigned size) @@ -89,3 +89,124 @@ void USBDevice::MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned // USB1 queried m_pHostController2->OHCI_WriteRegister(addr, value); } + +void USBDevice::USB_RegisterPort(USBPort* Port, int Index, int SpeedMask) +{ + Port->PortIndex = Index; + Port->SpeedMask = SpeedMask; + Port->HubCount = 0; + std::snprintf(Port->Path, sizeof(Port->Path), "%d", Index + 1); +} + +void USBDevice::USB_DeviceEPstopped(XboxDevice* Dev, USBEndpoint* EP) +{ + // This seems to be a nop in XQEMU since it doesn't assign the EP_Stopped function (it's nullptr) + USBDeviceClass* klass = USB_DEVICE_GET_CLASS(Dev); + if (klass->EP_Stopped) { + klass->EP_Stopped(Dev, EP); + } +} + +void USBDevice::USB_PortReset(USBPort* Port) +{ + XboxDevice* dev = Port->Dev; + + assert(dev != nullptr); + USB_Detach(Port); + USB_Attach(Port); + USB_DeviceReset(dev); +} + +void USBDevice::USB_Detach(USBPort* Port) +{ + XboxDevice* dev = Port->Dev; + + assert(dev != nullptr); + assert(dev->State != USB_STATE_NOTATTACHED); + OHCI_Detach(Port); + dev->State = USB_STATE_NOTATTACHED; +} + +void USBDevice::USB_Attach(USBPort* Port) +{ + XboxDevice *dev = Port->Dev; + + assert(dev != nullptr); + assert(dev->Attached); + assert(dev->State == USB_STATE_NOTATTACHED); + OHCI_Attach(Port); + dev->State = USB_STATE_ATTACHED; + usb_device_handle_attach(dev); +} + +void USBDevice::USB_DeviceReset(XboxDevice* dev) +{ + if (dev == nullptr || !dev->Attached) { + return; + } + + dev->RemoteWakeup = 0; + dev->Addr = 0; + dev->State = USB_STATE_DEFAULT; + usb_device_handle_reset(dev); +} + +XboxDevice* USBDevice::USB_FindDevice(USBPort* Port, uint8_t Addr) +{ + XboxDevice* dev = Port->Dev; + + if (dev == nullptr || !dev->Attached || dev->State != USB_STATE_DEFAULT) { + return nullptr; + } + if (dev->Addr == Addr) { + return dev; + } + + return USB_DeviceFindDevice(dev, Addr); +} + +XboxDevice* USBDevice::USB_DeviceFindDevice(XboxDevice* Dev, uint8_t Addr) +{ + USBDeviceClass *klass = USB_DEVICE_GET_CLASS(Dev); + if (klass->find_device) { + return klass->find_device(Dev, Addr); // TODO: usb_hub_find_device + } + + return nullptr; +} + +USBEndpoint* USBDevice::USB_GetEP(XboxDevice* Dev, int Pid, int Ep) +{ + USBEndpoint* eps; + + if (Dev == nullptr) { + return nullptr; + } + eps = (Pid == USB_TOKEN_IN) ? Dev->EP_in : Dev->EP_out; + if (Ep == 0) { + return &Dev->EP_ctl; // EndpointNumber zero represents the default control endpoint + } + assert(pid == USB_TOKEN_IN || pid == USB_TOKEN_OUT); + assert(ep > 0 && ep <= USB_MAX_ENDPOINTS); + + return eps + Ep - 1; +} + +void USBDevice::USB_PacketSetup(USBPacket* p, int Pid, USBEndpoint* Ep, unsigned int Stream, + uint64_t Id, bool ShortNotOK, bool IntReq) +{ + assert(!usb_packet_is_inflight(p)); + assert(p->iov.iov != NULL); + p->Id = Id; + p->Pid = Pid; + p->Endpoint = Ep; + p->Stream = Stream; + p->Status = USB_RET_SUCCESS; + p->ActualLength = 0; + p->Parameter = 0; + p->ShortNotOK = ShortNotOK; + p->IntReq = IntReq; + p->Combined = NULL; + qemu_iovec_reset(&p->iov); + usb_packet_set_state(p, USB_PACKET_SETUP); +} diff --git a/src/devices/USBController/USBDevice.h b/src/devices/USBController/USBDevice.h index 6b4a69154..7831439ff 100644 --- a/src/devices/USBController/USBDevice.h +++ b/src/devices/USBController/USBDevice.h @@ -37,6 +37,7 @@ #define USBDEVICE_H_ #include "..\PCIDevice.h" +#include "..\devices\video\queue.h" #include #define USB_MAX_ENDPOINTS 15 @@ -73,6 +74,9 @@ typedef struct _IOVector } IOVector; +typedef struct _USBPacket USBPacket; +typedef struct _XboxDevice XboxDevice; + /* USB endpoint */ typedef struct _USBEndpoint { @@ -83,13 +87,13 @@ typedef struct _USBEndpoint int max_packet_size; bool pipeline; bool halted; - USBDev* Dev; // device this endpoint belongs to - //QTAILQ_HEAD(, USBPacket) queue; + XboxDevice* Dev; // device this endpoint belongs to + QTAILQ_HEAD(, _USBPacket) Queue; // queue of packets to this endpoint } USBEndpoint; -/* definition of a USB device */ -typedef struct _USBDev +/* definition of an Xbox usb device */ +typedef struct _XboxDevice { DeviceState qdev; USBPort *port; @@ -102,25 +106,25 @@ typedef struct _USBDev int speed; // Supported speeds, not in info because it may be variable (hostdevs) int speedmask; - uint8_t Addr; // device address + uint8_t Addr; // device function address char product_desc[32]; int auto_attach; - int Attached; // device is attached + int Attached; // device is attached - int32_t State; // current state of device + int32_t State; // current state of device uint8_t setup_buf[8]; uint8_t data_buf[4096]; - int32_t RemoteWakeup; // wakeup flag + int32_t RemoteWakeup; // wakeup flag int32_t setup_state; int32_t setup_len; int32_t setup_index; - USBEndpoint EP_ctl; - USBEndpoint EP_in[USB_MAX_ENDPOINTS]; - USBEndpoint EP_out[USB_MAX_ENDPOINTS]; + USBEndpoint EP_ctl; // endpoints for SETUP tokens + USBEndpoint EP_in[USB_MAX_ENDPOINTS]; // endpoints for OUT tokens + USBEndpoint EP_out[USB_MAX_ENDPOINTS]; // endpoints for IN tokens //QLIST_HEAD(, USBDescString) strings; - const USBDesc *usb_desc; // Overrides class usb_desc if not NULL + const USBDesc *usb_desc; // Overrides class usb_desc if not NULL const USBDescDevice *device; int configuration; @@ -129,8 +133,9 @@ typedef struct _USBDev const USBDescConfig *config; const USBDescIface *ifaces[USB_MAX_INTERFACES]; } -USBDev; +XboxDevice; +// ergo720: this could be merged in the OHCI or USBDevice class if possible typedef struct USBDeviceClass { DeviceClass parent_class; @@ -183,30 +188,29 @@ typedef struct USBDeviceClass USBDeviceClass; /* Structure used to hold information about an active USB packet */ -typedef struct _USBPacket +struct _USBPacket { // Data fields for use by the driver - int Pid; - uint64_t Id; - USBEndpoint* Endpoint; // endpoint of the packet - unsigned int stream; - IOVector IoVec; // used to perform vectored I/O - uint64_t parameter; // control transfers - bool short_not_ok; - bool int_req; - int status; // USB_RET_* status code - int actual_length; // Number of bytes actually transferred + int Pid; // Packet ID + uint32_t Id; // Paddr of the TD for this packet + USBEndpoint* Endpoint; // endpoint this packet is transferred to + unsigned int Stream; + IOVector IoVec; // used to perform vectored I/O + uint64_t Parameter; // control transfers + bool ShortNotOK; // the bufferRounding mode of the TD for this packet + bool IntReq; // whether or not to generate an interrupt for this packet (DelayInterrupt of the TD is zero) + int Status; // USB_RET_* status code + int ActualLength; // Number of bytes actually transferred // Internal use by the USB layer - USBPacketState state; - USBCombinedPacket *combined; - //QTAILQ_ENTRY(USBPacket) queue; - //QTAILQ_ENTRY(USBPacket) combined_entry; -} -USBPacket; + USBPacketState State; + //USBCombinedPacket *Combined; + QTAILQ_ENTRY(_USBPacket) Queue; + QTAILQ_ENTRY(_USBPacket) CombinedEntry; +}; /* Struct describing the status of a usb port */ typedef struct _USBPort { - USBDev* Dev; // usb device (if present) + XboxDevice* Dev; // usb device (if present) int SpeedMask; // usb speeds supported int HubCount; // number of hubs attached char Path[16]; // the number of the port @@ -233,9 +237,38 @@ class USBDevice : public PCIDevice { void MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned size); + // USBDevice-specific functions/variables // pointers to the two USB host controllers available on the Xbox OHCI* m_pHostController1 = nullptr; OHCI* m_pHostController2 = nullptr; + + // register a port with the HC + void USB_RegisterPort(USBPort* Port, int Index, int SpeedMask); + // + void USB_DeviceEPstopped(XboxDevice* Dev, USBEndpoint* Ep); + // reset a usb port + void USB_PortReset(USBPort* Port); + // a device is attched + void USB_Attach(USBPort* Port); + // a device is detached + void USB_Detach(USBPort* Port); + // a device downstream from the device attached to the port (attached through a hub) is detached + void ChildDetach(USBPort* Port, XboxDevice* Child); + // TODO + void Wakeup(USBPort* Port); + // TODO + void Complete(USBPort* Port, USBPacket *P); + // reset a device + void USB_DeviceReset(XboxDevice* Dev); + // find the usb device with the supplied address + XboxDevice* USB_FindDevice(USBPort* Port, uint8_t Addr); + // ergo720: can probably be removed by calling directly usb_hub_find_device + XboxDevice* USB_DeviceFindDevice(XboxDevice* Dev, uint8_t Addr); + // find the requested endpoint in the supplied device + USBEndpoint* USB_GetEP(XboxDevice* Dev, int Pid, int Ep); + // setup a packet for transfer + void USB_PacketSetup(USBPacket* p, int Pid, USBEndpoint* Ep, unsigned int Stream, + uint64_t Id, bool ShortNotOK, bool IntReq); }; #endif From 245bedadc3ad3baf01b194b035d87207084289fe Mon Sep 17 00:00:00 2001 From: ergo720 Date: Thu, 7 Jun 2018 14:00:58 +0200 Subject: [PATCH 0035/1000] VMManager reworking (small stuff) --- src/CxbxKrnl/VMManager.cpp | 75 +++++++++++++++++++++++++++----------- src/CxbxKrnl/VMManager.h | 2 +- 2 files changed, 54 insertions(+), 23 deletions(-) diff --git a/src/CxbxKrnl/VMManager.cpp b/src/CxbxKrnl/VMManager.cpp index b47b7dde2..fc69fe3a8 100644 --- a/src/CxbxKrnl/VMManager.cpp +++ b/src/CxbxKrnl/VMManager.cpp @@ -157,7 +157,8 @@ dashboard from non-retail xbe?"); // We also reserve the remaining region from the reserved xbe image memory up to XBE_MAX_VA since we know it's // occupied by our memory placeholder and cannot be allocated anyway. We cannot just call XbAllocateVirtualMemory // since that would result in an increase in the reserved memory usage and also, with XBOX_MEM_RESERVE, the starting - // address will be rounded down to a 64K boundary, which will likely result in an incorrect base address + // address will be rounded down to a 64K boundary, which will likely result in an incorrect base address. Once the + // memory placeholder is gone, this can be removed if (XBE_MAX_VA - CxbxKrnl_Xbe->m_Header.dwSizeofImage - XBE_IMAGE_BASE > 0) { @@ -173,7 +174,7 @@ dashboard from non-retail xbe?"); // is forbidden from making allocations there and the LLE OHCI can distinguish identity mapped addresses from contiguous addresses. // Once LLE CPU and MMU are implemented, this can be removed if (g_bIsRetail != true) { - ConstructVMA(XBE_IMAGE_BASE + XBE_MAX_VA, XBOX_MEMORY_SIZE - XBE_MAX_VA, UserRegion, ReservedVma, true); + ConstructVMA(XBE_IMAGE_BASE + XBE_MAX_VA, XBOX_MEMORY_SIZE - XBE_IMAGE_BASE, UserRegion, ReservedVma, false); } if (g_bIsChihiro) { @@ -1597,6 +1598,7 @@ xboxkrnl::NTSTATUS VMManager::XbAllocateVirtualMemory(VAddr* addr, ULONG ZeroBit VMAIter it; bool bDestructVmaOnFailure = false; bool bUpdatePteProtections = false; + bool bOverflow; // Invalid base address if (CapturedBase > HIGHEST_VMA_ADDRESS) { RETURN(STATUS_INVALID_PARAMETER); } @@ -1660,16 +1662,22 @@ xboxkrnl::NTSTATUS VMManager::XbAllocateVirtualMemory(VAddr* addr, ULONG ZeroBit } else { - // A base address was specified. We could check with CheckConflictingVMA to see if it's already allocated but even it is free, there - // could still be host allocations in the vma. So we just attempt to map the block and see if it fails or not - AlignedCapturedBase = ROUND_DOWN(CapturedBase, X64KB); AlignedCapturedSize = ROUND_UP_4K(CapturedSize); + it = CheckConflictingVMA(AlignedCapturedBase, AlignedCapturedSize, &bOverflow); + + if (it != m_MemoryRegionArray[UserRegion].RegionMap.end()) + { + // Reserved vma, report an error + + status = STATUS_CONFLICTING_ADDRESSES; + goto Exit; + } if ((VAddr)VirtualAlloc((void*)AlignedCapturedBase, AlignedCapturedSize, MEM_RESERVE, ConvertXboxToWinProtection(PatchXboxPermissions(Protect)) & ~(PAGE_WRITECOMBINE | PAGE_NOCACHE)) != AlignedCapturedBase) { - // Something else is already mapped there, report an error + // An host allocation is already mapped there, report an error status = STATUS_CONFLICTING_ADDRESSES; goto Exit; @@ -1704,11 +1712,20 @@ xboxkrnl::NTSTATUS VMManager::XbAllocateVirtualMemory(VAddr* addr, ULONG ZeroBit AlignedCapturedBase = ROUND_DOWN_4K(CapturedBase); AlignedCapturedSize = (PAGES_SPANNED(CapturedBase, CapturedSize)) << PAGE_SHIFT; - it = CheckConflictingVMA(AlignedCapturedBase, AlignedCapturedSize); + it = CheckConflictingVMA(AlignedCapturedBase, AlignedCapturedSize, &bOverflow); - if (it == m_MemoryRegionArray[UserRegion].RegionMap.end() || it->second.type != ReservedVma) + if (it == m_MemoryRegionArray[UserRegion].RegionMap.end() || bOverflow) { - // The specified region is not completely inside a reserved vma + // The specified region is not completely inside a reserved vma or it's free + + status = STATUS_CONFLICTING_ADDRESSES; + goto Exit; + } + + if (AlignedCapturedBase >= XBE_IMAGE_BASE + ROUND_UP_4K(CxbxKrnl_Xbe->m_Header.dwSizeofImage) && + (g_XbeType != true ? AlignedCapturedBase < CHIHIRO_MEMORY_SIZE : AlignedCapturedBase < XBE_MAX_VA)) + { + // We can't commit on the memory placeholder after the xbe image or in the reserved area after it (128 MiB systems only) status = STATUS_CONFLICTING_ADDRESSES; goto Exit; @@ -1771,10 +1788,9 @@ xboxkrnl::NTSTATUS VMManager::XbAllocateVirtualMemory(VAddr* addr, ULONG ZeroBit PointerPte++; } - // Actually commit the requested range. Because of the check done by CheckConflictingVMA, this call shouldn't fail now but we still - // check to see if it succeeds or not... + // Actually commit the requested range but don't if we are committing an xbe section so that XeLoadSection works as expected - if (AlignedCapturedBase >= XBE_MAX_VA) + if (AlignedCapturedBase >= XBE_IMAGE_BASE + ROUND_UP_4K(CxbxKrnl_Xbe->m_Header.dwSizeofImage)) { if (!VirtualAlloc((void*)AlignedCapturedBase, AlignedCapturedSize, MEM_COMMIT, (ConvertXboxToWinProtection(PatchXboxPermissions(Protect))) & ~(PAGE_WRITECOMBINE | PAGE_NOCACHE))) @@ -1834,6 +1850,7 @@ xboxkrnl::NTSTATUS VMManager::XbFreeVirtualMemory(VAddr* addr, size_t* Size, DWO PFN TempPfn; PageType BusyType; VMAIter it; + bool bOverflow; // Only MEM_DECOMMIT and MEM_RELEASE are valid @@ -1856,19 +1873,19 @@ xboxkrnl::NTSTATUS VMManager::XbFreeVirtualMemory(VAddr* addr, size_t* Size, DWO Lock(); - it = CheckConflictingVMA(AlignedCapturedBase, AlignedCapturedSize); + it = CheckConflictingVMA(AlignedCapturedBase, AlignedCapturedSize, &bOverflow); - if (it == m_MemoryRegionArray[UserRegion].RegionMap.end() || it->second.type != ReservedVma) + if (it == m_MemoryRegionArray[UserRegion].RegionMap.end()) { - // Vma not found, report an error + // Free vma, report an error status = STATUS_MEMORY_NOT_ALLOCATED; goto Exit; } - if (it->first + it->second.size - 1 < AlignedCapturedBase + AlignedCapturedSize - 1) + if (bOverflow) { - // The provided ending adddress spans beyond the end of the vma, report an error + // The provided ending adddress is beyond the end of the vma, report an error status = STATUS_UNABLE_TO_FREE_VM; goto Exit; @@ -1991,6 +2008,7 @@ xboxkrnl::NTSTATUS VMManager::XbVirtualProtect(VAddr* addr, size_t* Size, DWORD* MMPTE NewPermsPte; MMPTE OldPermsPte; VMAIter it; + bool bOverflow; // Invalid base address @@ -2009,11 +2027,19 @@ xboxkrnl::NTSTATUS VMManager::XbVirtualProtect(VAddr* addr, size_t* Size, DWORD* Lock(); - it = CheckConflictingVMA(AlignedCapturedBase, AlignedCapturedSize); + it = CheckConflictingVMA(AlignedCapturedBase, AlignedCapturedSize, &bOverflow); - if (it == m_MemoryRegionArray[UserRegion].RegionMap.end() || it->second.type != ReservedVma) + if (it == m_MemoryRegionArray[UserRegion].RegionMap.end()) { - // Vma not found, report an error + // Free vma, report an error + + status = STATUS_CONFLICTING_ADDRESSES; + goto Exit; + } + + if (it->first + it->second.size - 1 < AlignedCapturedBase + AlignedCapturedSize - 1) + { + // The requested ending address is beyond the vma, report an error status = STATUS_CONFLICTING_ADDRESSES; goto Exit; @@ -2648,12 +2674,17 @@ VMAIter VMManager::CheckExistenceVMA(VAddr addr, MemoryRegionType Type, size_t S } } -VMAIter VMManager::CheckConflictingVMA(VAddr addr, size_t Size) +VMAIter VMManager::CheckConflictingVMA(VAddr addr, size_t Size, bool* bOverflow) { + *bOverflow = false; VMAIter it = GetVMAIterator(addr, UserRegion); - if (it != m_MemoryRegionArray[UserRegion].RegionMap.end() && it->first <= addr && it->second.size >= Size) + if (it != m_MemoryRegionArray[UserRegion].RegionMap.end() && it->second.type != FreeVma) { + if (it->first + it->second.size - 1 < addr + Size - 1) { + *bOverflow = true; + } + return it; // conflict } diff --git a/src/CxbxKrnl/VMManager.h b/src/CxbxKrnl/VMManager.h index 5b2c4f6bf..62449c9c3 100644 --- a/src/CxbxKrnl/VMManager.h +++ b/src/CxbxKrnl/VMManager.h @@ -221,7 +221,7 @@ class VMManager : public PhysicalMemory // merges the specified vma with adjacent ones if possible VMAIter MergeAdjacentVMA(VMAIter vma_handle, MemoryRegionType Type); // checks if the specified range is completely inside a vma - VMAIter CheckConflictingVMA(VAddr addr, size_t Size); + VMAIter CheckConflictingVMA(VAddr addr, size_t Size, bool* bOverflow); // changes the access permissions of a block of memory void UpdateMemoryPermissions(VAddr addr, size_t Size, DWORD Perms); // restores persistent memory From 412f6ca686586c3e22bf106b2dbf983e5d7897f5 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Fri, 8 Jun 2018 00:03:43 +0200 Subject: [PATCH 0036/1000] More packet processing stuff (WIP) --- src/Common/Cxbx.cpp | 24 ++++ src/Cxbx.h | 23 +++- src/devices/USBController/OHCI.cpp | 12 +- src/devices/USBController/OHCI.h | 7 +- src/devices/USBController/USBDevice.cpp | 144 ++++++++++++++++++++---- src/devices/USBController/USBDevice.h | 68 +++++------ 6 files changed, 209 insertions(+), 69 deletions(-) diff --git a/src/Common/Cxbx.cpp b/src/Common/Cxbx.cpp index 16f0b48de..d9fe81757 100644 --- a/src/Common/Cxbx.cpp +++ b/src/Common/Cxbx.cpp @@ -37,6 +37,7 @@ // The intent of this file is to add general functions which are not kernel specific (for those CxbxKrnl.h should be used instead) #include "Cxbx.h" +#include // Disable a compiler warning relative to uint64_t -> uint32_t conversions in Muldiv64. This function is taken from @@ -44,6 +45,7 @@ #pragma warning(push) #pragma warning(disable: 4244) +// Compute (a*b)/c with a 96 bit intermediate result uint64_t Muldiv64(uint64_t a, uint32_t b, uint32_t c) { union { @@ -64,3 +66,25 @@ uint64_t Muldiv64(uint64_t a, uint32_t b, uint32_t c) } #pragma warning(pop) + +void IoVecReset(IOVector* qiov) +{ + assert(qiov->AllocNumber != -1); + + qiov->IoVecNumber = 0; + qiov->Size = 0; +} + +void IoVecAdd(IOVector* qiov, void* base, size_t len) +{ + assert(qiov->AllocNumber != -1); + + if (qiov->IoVecNumber == qiov->AllocNumber) { + qiov->AllocNumber = 2 * qiov->AllocNumber + 1; + qiov->IoVecStruct = static_cast(std::realloc(qiov->IoVecStruct, qiov->AllocNumber * sizeof(IOVector))); + } + qiov->IoVecStruct[qiov->IoVecNumber].Iov_Base = base; + qiov->IoVecStruct[qiov->IoVecNumber].Iov_Len = len; + qiov->Size += len; + ++qiov->IoVecNumber; +} diff --git a/src/Cxbx.h b/src/Cxbx.h index 0ee1c62fa..44b13d6e5 100644 --- a/src/Cxbx.h +++ b/src/Cxbx.h @@ -35,6 +35,7 @@ #define CXBX_H #include +#include #define FUNC_EXPORTS __pragma(comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)) @@ -159,7 +160,27 @@ extern volatile bool g_bPrintfOn; #define CxbxSetThreadName(Name) #endif -// Compute (a*b)/c with a 96 bit intermediate result + +/* This is a linux struct for vectored I/O. See readv() and writev() */ +typedef struct _IoVec +{ + void* Iov_Base; // Starting address + size_t Iov_Len; // Number of bytes to transfer +} +IoVec; + +typedef struct _IOVector +{ + IoVec* IoVecStruct; + int IoVecNumber; // TODO + int AllocNumber; // TODO + size_t Size; +} +IOVector; + inline uint64_t Muldiv64(uint64_t a, uint32_t b, uint32_t c); +void IoVecReset(IOVector* qiov); +void IoVecAdd(IOVector* qiov, void* base, size_t len); + #endif diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index 129a3185f..ac96a7d22 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -639,14 +639,14 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) #ifdef DEBUG_PACKET DPRINTF("Too many pending packets\n"); #endif - DbgPrintf("Too many pending packets\n"); + DbgPrintf("Ohci: too many pending packets\n"); return 1; } dev = OHCI_FindDevice(OHCI_BM(Ed->Flags, ED_FA)); ep = m_UsbDevice->USB_GetEP(dev, pid, OHCI_BM(Ed->Flags, ED_EN)); m_UsbDevice->USB_PacketSetup(&m_UsbPacket, pid, ep, 0, addr, !flag_r, OHCI_BM(td.Flags, TD_DI) == 0); - usb_packet_addbuf(&m_UsbPacket, ohci->usb_buf, packetlen); - usb_handle_packet(dev, &m_UsbPacket); + m_UsbDevice->USB_PacketAddBuffer(&m_UsbPacket, m_UsbBuffer, packetlen); + m_UsbDevice->USB_HandlePacket(dev, &m_UsbPacket); #ifdef DEBUG_PACKET DPRINTF("status=%d\n", ohci->usb_packet.status); #endif @@ -905,7 +905,7 @@ void OHCI::OHCI_ChangeState(uint32_t Value) void OHCI::OHCI_PacketInit(USBPacket* packet) { IOVector* vec = &packet->IoVec; - vec->IoVec = new IoVec; + vec->IoVecStruct = new IoVec; vec->IoVecNumber = 0; vec->AllocNumber = 1; vec->Size = 0; @@ -917,7 +917,7 @@ uint32_t OHCI::OHCI_ReadRegister(xbaddr Addr) if (Addr & 3) { // The standard allows only aligned reads to the registers - DbgPrintf("Ohci: Unaligned read. Ignoring."); + DbgPrintf("Ohci: Unaligned read. Ignoring.\n"); return ret; } else { @@ -1024,7 +1024,7 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) { if (Addr & 3) { // The standard allows only aligned writes to the registers - DbgPrintf("Ohci: Unaligned write. Ignoring."); + DbgPrintf("Ohci: Unaligned write. Ignoring.\n"); return; } else { diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index cdecea948..8b37275a3 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -37,7 +37,6 @@ #ifndef OHCI_H_ #define OHCI_H_ -#include "Cxbx.h" #include "USBDevice.h" #include "..\CxbxKrnl\Timer.h" @@ -165,7 +164,7 @@ class OHCI private: // pointer to g_USB0 or g_USB1 - USBDevice* m_UsbDevice; + USBDevice* m_UsbDevice = nullptr; // all the registers available on the OHCI standard OHCI_Registers m_Registers; // end-of-frame timer @@ -177,9 +176,9 @@ class OHCI // ticks per usb tick uint64_t m_TicksPerUsbTick; // pending usb packet to process - USBPacket m_UsbPacket; + USBPacket m_UsbPacket = {}; // temporary buffer that holds the user data to transfer in a packet - uint8_t m_UsbBuffer[8192]; + uint8_t m_UsbBuffer[8192] = {}; // ergo720: I believe it's the value of HcControl in the last frame uint32_t old_ctl; // irq number diff --git a/src/devices/USBController/USBDevice.cpp b/src/devices/USBController/USBDevice.cpp index 6d2ec7049..67d40af74 100644 --- a/src/devices/USBController/USBDevice.cpp +++ b/src/devices/USBController/USBDevice.cpp @@ -36,6 +36,13 @@ #include "USBDevice.h" #include "OHCI.h" +#include "CxbxKrnl\EmuKrnl.h" // For EmuWarning + +#define USB_ENDPOINT_XFER_CONTROL 0 +#define USB_ENDPOINT_XFER_ISOC 1 +#define USB_ENDPOINT_XFER_BULK 2 +#define USB_ENDPOINT_XFER_INT 3 +#define USB_ENDPOINT_XFER_INVALID 255 void USBDevice::Init(unsigned int address) @@ -52,11 +59,11 @@ void USBDevice::Init(unsigned int address) m_VendorId = PCI_VENDOR_ID_NVIDIA; if (address == USB0_BASE) { - m_pHostController1 = new OHCI(1, this); + m_HostController = new OHCI(1, this); return; } - m_pHostController2 = new OHCI(9, this); + m_HostController = new OHCI(9, this); } uint32_t USBDevice::MMIORead(int barIndex, uint32_t addr, unsigned size) @@ -64,14 +71,8 @@ uint32_t USBDevice::MMIORead(int barIndex, uint32_t addr, unsigned size) // barIndex must be zero since we created the USB devices with a zero index in Init() assert(barIndex == 0); - // Figure out the correct OHCI object and read the register - if (addr < USB1_BASE) { - // USB0 queried - return m_pHostController1->OHCI_ReadRegister(addr); - } - - // USB1 queried - return m_pHostController2->OHCI_ReadRegister(addr); + // read the register of the corresponding HC + return m_HostController->OHCI_ReadRegister(addr); } void USBDevice::MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned size) @@ -79,15 +80,8 @@ void USBDevice::MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned // barIndex must be zero since we created the USB devices with a zero index in Init() assert(barIndex == 0); - // Figure out the correct OHCI object and write the value to the register - if (addr < USB1_BASE) { - // USB0 queried - m_pHostController1->OHCI_WriteRegister(addr, value); - return; - } - - // USB1 queried - m_pHostController2->OHCI_WriteRegister(addr, value); + // write the register of the corresponding HC + m_HostController->OHCI_WriteRegister(addr, value); } void USBDevice::USB_RegisterPort(USBPort* Port, int Index, int SpeedMask) @@ -195,8 +189,8 @@ USBEndpoint* USBDevice::USB_GetEP(XboxDevice* Dev, int Pid, int Ep) void USBDevice::USB_PacketSetup(USBPacket* p, int Pid, USBEndpoint* Ep, unsigned int Stream, uint64_t Id, bool ShortNotOK, bool IntReq) { - assert(!usb_packet_is_inflight(p)); - assert(p->iov.iov != NULL); + assert(!USB_IsPacketInflight(p)); + assert(p->IoVec.IoVecStruct != nullptr); p->Id = Id; p->Pid = Pid; p->Endpoint = Ep; @@ -206,7 +200,109 @@ void USBDevice::USB_PacketSetup(USBPacket* p, int Pid, USBEndpoint* Ep, unsigned p->Parameter = 0; p->ShortNotOK = ShortNotOK; p->IntReq = IntReq; - p->Combined = NULL; - qemu_iovec_reset(&p->iov); - usb_packet_set_state(p, USB_PACKET_SETUP); + p->Combined = nullptr; + IoVecReset(&p->IoVec); + p->State = USB_PACKET_SETUP; +} + +bool USBDevice::USB_IsPacketInflight(USBPacket* p) +{ + return (p->State == USB_PACKET_QUEUED || p->State == USB_PACKET_ASYNC); +} + +void USBDevice::USB_PacketAddBuffer(USBPacket* p, void* ptr, size_t len) +{ + IoVecAdd(&p->IoVec, ptr, len); +} + +void USBDevice::USB_HandlePacket(XboxDevice* dev, USBPacket* p) +{ + if (dev == nullptr) { + p->Status = USB_RET_NODEV; + return; + } + assert(dev == p->Endpoint->Dev); + assert(dev->State == USB_STATE_DEFAULT); + USB_PacketCheckState(p, USB_PACKET_SETUP); + assert(p->Endpoint != nullptr); + + // Submitting a new packet clears halt + if (p->Endpoint->Halted) { + assert(QTAILQ_EMPTY(&p->Endpoint->Queue)); + p->Endpoint->Halted = false; + } + + if (QTAILQ_EMPTY(&p->Endpoint->Queue) || p->Endpoint->Pipeline || p->Stream) { + USB_ProcessOne(p); + if (p->Status == USB_RET_ASYNC) { + // hcd drivers cannot handle async for isoc + assert(p->Endpoint->Type != USB_ENDPOINT_XFER_ISOC); + // using async for interrupt packets breaks migration + assert(p->Endpoint->Type != USB_ENDPOINT_XFER_INT || + (dev->flags & (1 << USB_DEV_FLAG_IS_HOST))); + p->State = USB_PACKET_ASYNC; + QTAILQ_INSERT_TAIL(&p->Endpoint->Queue, p, Queue); + } + else if (p->Status == USB_RET_ADD_TO_QUEUE) { + usb_queue_one(p); + } + else { + // When pipelining is enabled usb-devices must always return async, + // otherwise packets can complete out of order! + assert(p->stream || !p->Endpoint->pipeline || + QTAILQ_EMPTY(&p->Endpoint->Queue)); + if (p->Status != USB_RET_NAK) { + p->State = USB_PACKET_COMPLETE; + } + } + } + else { + usb_queue_one(p); + } +} + +void USBDevice::USB_PacketCheckState(USBPacket* p, USBPacketState expected) +{ + if (p->State == expected) { + return; + } + + EmuWarning("Usb: packet state check failed!"); + assert(0); +} + +void USBDevice::USB_ProcessOne(USBPacket* p) +{ + XboxDevice* dev = p->Endpoint->Dev; + + // Handlers expect status to be initialized to USB_RET_SUCCESS, but it + // can be USB_RET_NAK here from a previous usb_process_one() call, + // or USB_RET_ASYNC from going through usb_queue_one(). + p->Status = USB_RET_SUCCESS; + + if (p->Endpoint->Num == 0) { + // Info: All devices must support endpoint zero. This is the endpoint which receives all of the devices control + // and status requests during enumeration and throughout the duration while the device is operational on the bus + if (p->Parameter) { + do_parameter(dev, p); + return; + } + switch (p->Pid) { + case USB_TOKEN_SETUP: + do_token_setup(dev, p); + break; + case USB_TOKEN_IN: + do_token_in(dev, p); + break; + case USB_TOKEN_OUT: + do_token_out(dev, p); + break; + default: + p->Status = USB_RET_STALL; + } + } + else { + // data pipe + usb_device_handle_data(dev, p); + } } diff --git a/src/devices/USBController/USBDevice.h b/src/devices/USBController/USBDevice.h index 7831439ff..4d8b95240 100644 --- a/src/devices/USBController/USBDevice.h +++ b/src/devices/USBController/USBDevice.h @@ -36,9 +36,9 @@ #ifndef USBDEVICE_H_ #define USBDEVICE_H_ +#include "Cxbx.h" #include "..\PCIDevice.h" #include "..\devices\video\queue.h" -#include #define USB_MAX_ENDPOINTS 15 #define USB_MAX_INTERFACES 16 @@ -57,37 +57,20 @@ typedef enum USBPacketState { } USBPacketState; -/* This is a linux struct for vectored I/O. See readv() and writev() */ -typedef struct _IoVec -{ - void* Iov_Base; - size_t Iov_Len; -} -IoVec; - -typedef struct _IOVector -{ - IoVec* IoVec; - int IoVecNumber; // TODO - int AllocNumber; // TODO - size_t Size; -} -IOVector; - typedef struct _USBPacket USBPacket; typedef struct _XboxDevice XboxDevice; /* USB endpoint */ typedef struct _USBEndpoint { - uint8_t nr; + uint8_t Num; // endpoint number uint8_t pid; - uint8_t type; + uint8_t Type; // the type of this endpoint uint8_t ifnum; int max_packet_size; - bool pipeline; - bool halted; - XboxDevice* Dev; // device this endpoint belongs to + bool Pipeline; + bool Halted; // indicates that the endpoint is halted + XboxDevice* Dev; // device this endpoint belongs to QTAILQ_HEAD(, _USBPacket) Queue; // queue of packets to this endpoint } USBEndpoint; @@ -187,10 +170,16 @@ typedef struct USBDeviceClass } USBDeviceClass; +typedef struct _USBCombinedPacket { + _USBPacket* First; + QTAILQ_HEAD(packets_head, _USBPacket) Packets; + IOVector IoVec; +} +USBCombinedPacket; + /* Structure used to hold information about an active USB packet */ struct _USBPacket { - // Data fields for use by the driver int Pid; // Packet ID uint32_t Id; // Paddr of the TD for this packet USBEndpoint* Endpoint; // endpoint this packet is transferred to @@ -203,22 +192,24 @@ struct _USBPacket int ActualLength; // Number of bytes actually transferred // Internal use by the USB layer USBPacketState State; - //USBCombinedPacket *Combined; + USBCombinedPacket* Combined; QTAILQ_ENTRY(_USBPacket) Queue; QTAILQ_ENTRY(_USBPacket) CombinedEntry; }; /* Struct describing the status of a usb port */ typedef struct _USBPort { - XboxDevice* Dev; // usb device (if present) - int SpeedMask; // usb speeds supported - int HubCount; // number of hubs attached - char Path[16]; // the number of the port - int PortIndex; // internal port index - //QTAILQ_ENTRY(USBPort) next; + XboxDevice* Dev; // usb device (if present) + int SpeedMask; // usb speeds supported + int HubCount; // number of hubs attached + char Path[16]; // the number of the port + int PortIndex; // internal port index + QTAILQ_ENTRY(_USBPort) Next; } USBPort; +// Forward declare OHCI class for USBDevice device class +class OHCI; class USBDevice : public PCIDevice { public: @@ -238,9 +229,8 @@ class USBDevice : public PCIDevice { // USBDevice-specific functions/variables - // pointers to the two USB host controllers available on the Xbox - OHCI* m_pHostController1 = nullptr; - OHCI* m_pHostController2 = nullptr; + // pointer to the host controller this device refears to + OHCI* m_HostController = nullptr; // register a port with the HC void USB_RegisterPort(USBPort* Port, int Index, int SpeedMask); @@ -269,6 +259,16 @@ class USBDevice : public PCIDevice { // setup a packet for transfer void USB_PacketSetup(USBPacket* p, int Pid, USBEndpoint* Ep, unsigned int Stream, uint64_t Id, bool ShortNotOK, bool IntReq); + // check if the state of the packet is queued or async + bool USB_IsPacketInflight(USBPacket* p); + // append the user buffer to the packet + void USB_PacketAddBuffer(USBPacket* p, void* ptr, size_t len); + // transfer and process the packet + void USB_HandlePacket(XboxDevice* dev, USBPacket* p); + // check if the packet has the expected state and assert if not + void USB_PacketCheckState(USBPacket* p, USBPacketState expected); + // process the packet + void USB_ProcessOne(USBPacket* p); }; #endif From 95bb9becddebe9133e21e96ded864b47b2b54a6b Mon Sep 17 00:00:00 2001 From: ergo720 Date: Fri, 8 Jun 2018 20:52:21 +0200 Subject: [PATCH 0037/1000] Completed OHCI-side of packet processing --- src/Common/Cxbx.cpp | 48 +++++ src/Cxbx.h | 8 +- src/devices/USBController/OHCI.cpp | 38 ++-- src/devices/USBController/OHCI.h | 16 +- src/devices/USBController/USBDevice.cpp | 276 +++++++++++++++++++++++- src/devices/USBController/USBDevice.h | 39 +++- src/devices/video/EmuNV2A_PTIMER.cpp | 21 +- 7 files changed, 386 insertions(+), 60 deletions(-) diff --git a/src/Common/Cxbx.cpp b/src/Common/Cxbx.cpp index d9fe81757..aa4ae908e 100644 --- a/src/Common/Cxbx.cpp +++ b/src/Common/Cxbx.cpp @@ -38,6 +38,11 @@ #include "Cxbx.h" #include +#include + +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif // Disable a compiler warning relative to uint64_t -> uint32_t conversions in Muldiv64. This function is taken from @@ -88,3 +93,46 @@ void IoVecAdd(IOVector* qiov, void* base, size_t len) qiov->Size += len; ++qiov->IoVecNumber; } + +// This takes "iov_cnt" of "iov" buffers as input and copies sequentially their contents to the "buf" output buffer. +// "offset" indicates the offset inside "bytes" (total lenght of "iov" buffers) where the copy is going to start. +// "offset" must be less than "bytes" or else the assertion will fail. "done" is the number of bytes actually copied +size_t IoVecTobuffer(const IoVec* iov, const unsigned int iov_cnt, size_t offset, void* buf, size_t bytes) +{ + size_t done; + unsigned int i; + for (i = 0, done = 0; (offset || done < bytes) && i < iov_cnt; i++) { + if (offset < iov[i].Iov_Len) { + size_t len = MIN(iov[i].Iov_Len - offset, bytes - done); + std::memcpy(static_cast(buf) + done, static_cast(iov[i].Iov_Base) + offset, len); + done += len; + offset = 0; + } + else { + offset -= iov[i].Iov_Len; + } + } + assert(offset == 0); + return done; +} + +// This does the opposite of IoVecTobuffer: it takes "buf" as input and copies sequentially its contents to the +// "iov" output buffers. +size_t IoVecFromBuffer(const IoVec* iov, unsigned int iov_cnt, size_t offset, void* buf, size_t bytes) +{ + size_t done; + unsigned int i; + for (i = 0, done = 0; (offset || done < bytes) && i < iov_cnt; i++) { + if (offset < iov[i].Iov_Len) { + size_t len = MIN(iov[i].Iov_Len - offset, bytes - done); + memcpy(static_cast(iov[i].Iov_Base) + offset, static_cast(buf) + done, len); + done += len; + offset = 0; + } + else { + offset -= iov[i].Iov_Len; + } + } + assert(offset == 0); + return done; +} \ No newline at end of file diff --git a/src/Cxbx.h b/src/Cxbx.h index 44b13d6e5..e830dc399 100644 --- a/src/Cxbx.h +++ b/src/Cxbx.h @@ -172,9 +172,9 @@ IoVec; typedef struct _IOVector { IoVec* IoVecStruct; - int IoVecNumber; // TODO - int AllocNumber; // TODO - size_t Size; + int IoVecNumber; // number of I/O buffers supplied + int AllocNumber; // number of IoVec structs currently allocated + size_t Size; // total size of all I/O buffers supplied } IOVector; @@ -182,5 +182,7 @@ inline uint64_t Muldiv64(uint64_t a, uint32_t b, uint32_t c); void IoVecReset(IOVector* qiov); void IoVecAdd(IOVector* qiov, void* base, size_t len); +size_t IoVecTobuffer(const IoVec* iov, const unsigned int iov_cnt, size_t offset, void *buf, size_t bytes); +size_t IoVecFromBuffer(const IoVec* iov, unsigned int iov_cnt, size_t offset, void* buf, size_t bytes); #endif diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index ac96a7d22..f6d4efcbf 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -127,11 +127,11 @@ #define OHCI_TD_DI_SHIFT 21 #define OHCI_TD_DI_MASK (7<old_ctl & (~ohci->ctl) & (OHCI_CTL_BLE | OHCI_CTL_CLE)) { - if (ohci->async_td) { - usb_cancel_packet(&ohci->usb_packet); + if (m_OldHcControl & (~m_Registers.HcControl) & (OHCI_CTL_BLE | OHCI_CTL_CLE)) { + if (m_AsyncTD) { + m_UsbDevice->USB_CancelPacket(&m_UsbPacket); m_AsyncTD = xbnull; } OHCI_StopEndpoints(); } - ohci->old_ctl = ohci->ctl; + m_OldHcControl = m_Registers.HcControl; ohci_process_lists(ohci, 0); // Stop if UnrecoverableError happened or OHCI_SOF will crash @@ -464,7 +464,7 @@ int OHCI::OHCI_ServiceEDlist(xbaddr Head, int Completion) // Cancel pending packets for ED that have been paused xbaddr addr = ed.HeadP & OHCI_DPTR_MASK; if (m_AsyncTD && addr == m_AsyncTD) { - usb_cancel_packet(&ohci->usb_packet); + m_UsbDevice->USB_CancelPacket(&m_UsbPacket); m_AsyncTD = xbnull; m_UsbDevice->USB_DeviceEPstopped(m_UsbPacket.Endpoint->Dev, m_UsbPacket.Endpoint); } @@ -650,17 +650,17 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) #ifdef DEBUG_PACKET DPRINTF("status=%d\n", ohci->usb_packet.status); #endif - if (m_UsbPacket.status == USB_RET_ASYNC) { - usb_device_flush_ep_queue(dev, ep); + if (m_UsbPacket.Status == USB_RET_ASYNC) { + m_UsbDevice->USB_DeviceFlushEPqueue(dev, ep); m_AsyncTD = addr; return 1; } } - if (m_UsbPacket.status == USB_RET_SUCCESS) { - ret = m_UsbPacket.actual_length; + if (m_UsbPacket.Status == USB_RET_SUCCESS) { + ret = m_UsbPacket.ActualLength; } else { - ret = m_UsbPacket.status; + ret = m_UsbPacket.Status; } if (ret >= 0) { @@ -785,6 +785,7 @@ void OHCI::OHCI_StateReset() // reset or cold boot OHCI_BusStop(); + m_OldHcControl = 0; // Reset all registers // Remark: the standard says that RemoteWakeupConnected bit should be set during POST, cleared during hw reset @@ -825,7 +826,7 @@ void OHCI::OHCI_StateReset() } } if (m_AsyncTD) { - usb_cancel_packet(&ohci->usb_packet); + m_UsbDevice->USB_CancelPacket(&m_UsbPacket); m_AsyncTD = xbnull; } @@ -1337,7 +1338,7 @@ void OHCI::OHCI_Detach(USBPort* Port) OHCIPort* port = &m_Registers.RhPort[Port->PortIndex]; uint32_t old_state = port->HcRhPortStatus; - ohci_async_cancel_device(Port->Dev); + OHCI_AsyncCancelDevice(Port->Dev); // set connect status if (port->HcRhPortStatus & OHCI_PORT_CCS) { @@ -1386,3 +1387,12 @@ void OHCI::OHCI_Attach(USBPort* Port) } } +void OHCI::OHCI_AsyncCancelDevice(XboxDevice* dev) +{ + if (m_AsyncTD && + m_UsbDevice->USB_IsPacketInflight(&m_UsbPacket) && + m_UsbPacket.Endpoint->Dev == dev) { + m_UsbDevice->USB_CancelPacket(&m_UsbPacket); + m_AsyncTD = 0; + } +} diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index 8b37275a3..ebe984ad5 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -160,6 +160,10 @@ class OHCI uint32_t OHCI_ReadRegister(xbaddr Addr); // write a register void OHCI_WriteRegister(xbaddr Addr, uint32_t Value); + // update ohci registers during a device attach + void OHCI_Attach(USBPort* Port); + // update ohci registers during a device detach + void OHCI_Detach(USBPort* Port); private: @@ -179,8 +183,8 @@ class OHCI USBPacket m_UsbPacket = {}; // temporary buffer that holds the user data to transfer in a packet uint8_t m_UsbBuffer[8192] = {}; - // ergo720: I believe it's the value of HcControl in the last frame - uint32_t old_ctl; + // the value of HcControl in the previous frame + uint32_t m_OldHcControl; // irq number int m_IrqNum; // ergo720: I think it's the DelayInterrupt flag in a TD @@ -217,10 +221,6 @@ class OHCI uint32_t OHCI_GetFrameRemaining(); // void OHCI_StopEndpoints(); - // update ohci registers during a device attach - void OHCI_Attach(USBPort* Port); - // update ohci registers during a device detach - void OHCI_Detach(USBPort* Port); // set root hub status void OHCI_SetHubStatus(uint32_t Value); // update power related bits in HcRhPortStatus @@ -242,7 +242,7 @@ class OHCI bool OHCI_ReadTD(xbaddr Paddr, OHCI_TD* Td); // write a TD in memory bool OHCI_WriteTD(xbaddr Paddr, OHCI_TD* Td); - // read/write the contents of a TD from/to main memory + // read/write the user buffer pointed to by a TD from/to main memory bool OHCI_CopyTD(OHCI_TD* Td, uint8_t* Buffer, int Length, bool bIsWrite); // find a TD buffer in memory and copy it bool OHCI_FindAndCopyTD(xbaddr Paddr, uint8_t* Buffer, int Length, bool bIsWrite); @@ -256,6 +256,8 @@ class OHCI int OHCI_ServiceTD(OHCI_ED* Ed); // find the usb device with the supplied address XboxDevice* OHCI::OHCI_FindDevice(uint8_t Addr); + // cancel a packet when a device is removed + void OHCI_AsyncCancelDevice(XboxDevice* dev); }; #endif diff --git a/src/devices/USBController/USBDevice.cpp b/src/devices/USBController/USBDevice.cpp index 67d40af74..8febc11a9 100644 --- a/src/devices/USBController/USBDevice.cpp +++ b/src/devices/USBController/USBDevice.cpp @@ -44,6 +44,15 @@ #define USB_ENDPOINT_XFER_INT 3 #define USB_ENDPOINT_XFER_INVALID 255 +#define USB_DIR_OUT 0 +#define USB_DIR_IN 0x80 + +#define SETUP_STATE_IDLE 0 +#define SETUP_STATE_SETUP 1 +#define SETUP_STATE_DATA 2 +#define SETUP_STATE_ACK 3 +#define SETUP_STATE_PARAM 4 + void USBDevice::Init(unsigned int address) { @@ -117,7 +126,7 @@ void USBDevice::USB_Detach(USBPort* Port) assert(dev != nullptr); assert(dev->State != USB_STATE_NOTATTACHED); - OHCI_Detach(Port); + m_HostController->OHCI_Detach(Port); dev->State = USB_STATE_NOTATTACHED; } @@ -128,7 +137,7 @@ void USBDevice::USB_Attach(USBPort* Port) assert(dev != nullptr); assert(dev->Attached); assert(dev->State == USB_STATE_NOTATTACHED); - OHCI_Attach(Port); + m_HostController->OHCI_Attach(Port); dev->State = USB_STATE_ATTACHED; usb_device_handle_attach(dev); } @@ -244,7 +253,7 @@ void USBDevice::USB_HandlePacket(XboxDevice* dev, USBPacket* p) QTAILQ_INSERT_TAIL(&p->Endpoint->Queue, p, Queue); } else if (p->Status == USB_RET_ADD_TO_QUEUE) { - usb_queue_one(p); + USB_QueueOne(p); } else { // When pipelining is enabled usb-devices must always return async, @@ -257,10 +266,17 @@ void USBDevice::USB_HandlePacket(XboxDevice* dev, USBPacket* p) } } else { - usb_queue_one(p); + USB_QueueOne(p); } } +void USBDevice::USB_QueueOne(USBPacket* p) +{ + p->State = USB_PACKET_QUEUED; + QTAILQ_INSERT_TAIL(&p->Endpoint->Queue, p, Queue); + p->Status = USB_RET_ASYNC; +} + void USBDevice::USB_PacketCheckState(USBPacket* p, USBPacketState expected) { if (p->State == expected) { @@ -284,18 +300,18 @@ void USBDevice::USB_ProcessOne(USBPacket* p) // Info: All devices must support endpoint zero. This is the endpoint which receives all of the devices control // and status requests during enumeration and throughout the duration while the device is operational on the bus if (p->Parameter) { - do_parameter(dev, p); + USB_DoParameter(dev, p); return; } switch (p->Pid) { case USB_TOKEN_SETUP: - do_token_setup(dev, p); + USB_DoTokenSetup(dev, p); break; case USB_TOKEN_IN: - do_token_in(dev, p); + DoTokenIn(dev, p); break; case USB_TOKEN_OUT: - do_token_out(dev, p); + DoTokenOut(dev, p); break; default: p->Status = USB_RET_STALL; @@ -303,6 +319,248 @@ void USBDevice::USB_ProcessOne(USBPacket* p) } else { // data pipe - usb_device_handle_data(dev, p); + USB_DeviceHandleData(dev, p); + } +} + +void USBDevice::USB_DoParameter(XboxDevice* s, USBPacket* p) +{ + int i, request, value, index; + + for (i = 0; i < 8; i++) { + s->SetupBuffer[i] = p->Parameter >> (i * 8); + } + + s->SetupState = SETUP_STATE_PARAM; + s->SetupLength = (s->SetupBuffer[7] << 8) | s->SetupBuffer[6]; + s->SetupIndex = 0; + + request = (s->SetupBuffer[0] << 8) | s->SetupBuffer[1]; + value = (s->SetupBuffer[3] << 8) | s->SetupBuffer[2]; + index = (s->SetupBuffer[5] << 8) | s->SetupBuffer[4]; + + if (s->SetupLength > sizeof(s->data_buf)) { + DbgPrintf("Usb: ctrl buffer too small (%d > %zu)\n", s->SetupLength, sizeof(s->data_buf)); + p->Status = USB_RET_STALL; + return; + } + + if (p->Pid == USB_TOKEN_OUT) { + USB_PacketCopy(p, s->data_buf, s->SetupLength); + } + + USB_DeviceHandleControl(s, p, request, value, index, s->SetupLength, s->data_buf); + if (p->Status == USB_RET_ASYNC) { + return; + } + + if (p->ActualLength < s->SetupLength) { + s->SetupLength = p->ActualLength; + } + if (p->Pid == USB_TOKEN_IN) { + p->ActualLength = 0; + USB_PacketCopy(p, s->data_buf, s->SetupLength); + } +} + +void USBDevice::USB_DoTokenSetup(XboxDevice* s, USBPacket* p) +{ + int request, value, index; + + // From the standard "Every Setup packet has eight bytes." + if (p->IoVec.Size != 8) { + p->Status = USB_RET_STALL; + return; + } + + // Info: name, offset, size, info (sizes are in bytes) + // bmRequestType, 1, 1, determines the direction of the request, type of request and designated recipient + // bRequest, 1, 1, determines the request being made + // wValue, 2, 2, it is used to pass a parameter to the device, specific to the request + // wIndex, 4, 2, often used in requests to specify an endpoint or an interface + // wLength, 6, 2, number of bytes to transfer if there is a data phase + // The wValue and wIndex fields allow parameters to be passed with the request + + USB_PacketCopy(p, s->SetupBuffer, p->IoVec.Size); + p->ActualLength = 0; + s->SetupLength = (s->SetupBuffer[7] << 8) | s->SetupBuffer[6]; + s->SetupIndex = 0; + + request = (s->SetupBuffer[0] << 8) | s->SetupBuffer[1]; + value = (s->SetupBuffer[3] << 8) | s->SetupBuffer[2]; + index = (s->SetupBuffer[5] << 8) | s->SetupBuffer[4]; + + if (s->SetupBuffer[0] & USB_DIR_IN) { + USB_DeviceHandleControl(s, p, request, value, index, s->SetupLength, s->data_buf); + if (p->Status == USB_RET_ASYNC) { + s->SetupState = SETUP_STATE_SETUP; + } + if (p->Status != USB_RET_SUCCESS) { + return; + } + + if (p->ActualLength < s->SetupLength) { + s->SetupLength = p->ActualLength; + } + s->SetupState = SETUP_STATE_DATA; + } + else { + if (s->SetupLength > sizeof(s->data_buf)) { + DbgPrintf("Usb: ctrl buffer too small (%d > %zu)\n", s->SetupLength, sizeof(s->data_buf)); + p->Status = USB_RET_STALL; + return; + } + if (s->SetupLength == 0) { + s->SetupState = SETUP_STATE_ACK; + } + else { + s->SetupState = SETUP_STATE_DATA; + } + } + + p->ActualLength = 8; +} + +void USBDevice::DoTokenIn(XboxDevice* s, USBPacket* p) +{ + int request, value, index; + + assert(p->ep->nr == 0); + + request = (s->SetupBuffer[0] << 8) | s->SetupBuffer[1]; + value = (s->SetupBuffer[3] << 8) | s->SetupBuffer[2]; + index = (s->SetupBuffer[5] << 8) | s->SetupBuffer[4]; + + switch (s->SetupState) { + case SETUP_STATE_ACK: + if (!(s->SetupBuffer[0] & USB_DIR_IN)) { + USB_DeviceHandleControl(s, p, request, value, index, s->SetupLength, s->data_buf); + if (p->Status == USB_RET_ASYNC) { + return; + } + s->SetupState = SETUP_STATE_IDLE; + p->ActualLength = 0; + } + break; + + case SETUP_STATE_DATA: + if (s->SetupBuffer[0] & USB_DIR_IN) { + int len = s->SetupLength - s->SetupIndex; + if (len > p->IoVec.Size) { + len = p->IoVec.Size; + } + USB_PacketCopy(p, s->data_buf + s->SetupIndex, len); + s->SetupIndex += len; + if (s->SetupIndex >= s->SetupLength) { + s->SetupState = SETUP_STATE_ACK; + } + return; + } + s->SetupState = SETUP_STATE_IDLE; + p->Status = USB_RET_STALL; + break; + + default: + p->Status = USB_RET_STALL; + } +} + +void USBDevice::DoTokenOut(XboxDevice* s, USBPacket* p) +{ + assert(p->ep->nr == 0); + + switch (s->SetupState) { + case SETUP_STATE_ACK: + if (s->SetupBuffer[0] & USB_DIR_IN) { + s->SetupState = SETUP_STATE_IDLE; + /* transfer OK */ + } + else { + /* ignore additional output */ + } + break; + + case SETUP_STATE_DATA: + if (!(s->SetupBuffer[0] & USB_DIR_IN)) { + int len = s->SetupLength - s->SetupIndex; + if (len > p->IoVec.Size) { + len = p->IoVec.Size; + } + USB_PacketCopy(p, s->data_buf + s->SetupIndex, len); + s->SetupIndex += len; + if (s->SetupIndex >= s->SetupLength) { + s->SetupState = SETUP_STATE_ACK; + } + return; + } + s->SetupState = SETUP_STATE_IDLE; + p->Status = USB_RET_STALL; + break; + + default: + p->Status = USB_RET_STALL; + } +} + +void USBDevice::USB_PacketCopy(USBPacket* p, void* ptr, size_t bytes) +{ + IOVector* iov = p->Combined ? &p->Combined->IoVec : &p->IoVec; + + assert(p->ActualLength >= 0); + assert(p->ActualLength + bytes <= iov->Size); + switch (p->Pid) { + case USB_TOKEN_SETUP: + case USB_TOKEN_OUT: + IoVecTobuffer(iov->IoVecStruct, iov->IoVecNumber, p->ActualLength, ptr, bytes); + break; + case USB_TOKEN_IN: + IoVecFromBuffer(iov->IoVecStruct, iov->IoVecNumber, p->ActualLength, ptr, bytes); + break; + default: + CxbxKrnlCleanup("Usb: %s has an invalid pid: %x\n", __func__, p->Pid); + } + p->ActualLength += bytes; +} + +void USBDevice::USB_DeviceHandleControl(XboxDevice* dev, USBPacket* p, int request, int value, int index, int length, uint8_t* data) +{ + USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); + if (klass->handle_control) { + klass->handle_control(dev, p, request, value, index, length, data); // TODO: usb_hub_handle_control + } +} + +void USBDevice::USB_DeviceHandleData(XboxDevice* dev, USBPacket* p) +{ + USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); + if (klass->handle_data) { + klass->handle_data(dev, p); // TODO: usb_hub_handle_data + } +} + +void USBDevice::USB_DeviceFlushEPqueue(XboxDevice* dev, USBEndpoint* ep) +{ + USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); + if (klass->flush_ep_queue) { + klass->flush_ep_queue(dev, ep); // TODO: it's nullptr in XQEMU... + } +} + +void USBDevice::USB_DeviceCancelPacket(XboxDevice* dev, USBPacket* p) +{ + USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); + if (klass->cancel_packet) { + klass->cancel_packet(dev, p); // TODO: it's nullptr in XQEMU... + } +} + +void USBDevice::USB_CancelPacket(USBPacket* p) +{ + bool callback = (p->State == USB_PACKET_ASYNC); + assert(USB_IsPacketInflight(p)); + p->State = USB_PACKET_CANCELED; + QTAILQ_REMOVE(&p->Endpoint->Queue, p, Queue); + if (callback) { + USB_DeviceCancelPacket(p->Endpoint->Dev, p); } } diff --git a/src/devices/USBController/USBDevice.h b/src/devices/USBController/USBDevice.h index 4d8b95240..de0d2881b 100644 --- a/src/devices/USBController/USBDevice.h +++ b/src/devices/USBController/USBDevice.h @@ -95,12 +95,12 @@ typedef struct _XboxDevice int Attached; // device is attached int32_t State; // current state of device - uint8_t setup_buf[8]; + uint8_t SetupBuffer[8]; // holds the IoVec structs copied (control transfers only?) uint8_t data_buf[4096]; int32_t RemoteWakeup; // wakeup flag - int32_t setup_state; - int32_t setup_len; - int32_t setup_index; + int32_t SetupState; // result of a setup tken processing operation + int32_t SetupLength; // number of bytes to transfer as specified by a setup token + int32_t SetupIndex; // index of the parameter in a setup token? USBEndpoint EP_ctl; // endpoints for SETUP tokens USBEndpoint EP_in[USB_MAX_ENDPOINTS]; // endpoints for OUT tokens @@ -180,7 +180,7 @@ USBCombinedPacket; /* Structure used to hold information about an active USB packet */ struct _USBPacket { - int Pid; // Packet ID + int Pid; // Packet ID (used to identify the type of packet that is being sent) uint32_t Id; // Paddr of the TD for this packet USBEndpoint* Endpoint; // endpoint this packet is transferred to unsigned int Stream; @@ -189,7 +189,7 @@ struct _USBPacket bool ShortNotOK; // the bufferRounding mode of the TD for this packet bool IntReq; // whether or not to generate an interrupt for this packet (DelayInterrupt of the TD is zero) int Status; // USB_RET_* status code - int ActualLength; // Number of bytes actually transferred + int ActualLength; // before copy: offset inside IoVec structs; after copy: number of bytes actually transferred // Internal use by the USB layer USBPacketState State; USBCombinedPacket* Combined; @@ -208,7 +208,7 @@ typedef struct _USBPort { } USBPort; -// Forward declare OHCI class for USBDevice device class +// Forward declare OHCI class for USBDevice class class OHCI; class USBDevice : public PCIDevice { @@ -229,7 +229,7 @@ class USBDevice : public PCIDevice { // USBDevice-specific functions/variables - // pointer to the host controller this device refears to + // pointer to the host controller this device refers to OHCI* m_HostController = nullptr; // register a port with the HC @@ -269,6 +269,29 @@ class USBDevice : public PCIDevice { void USB_PacketCheckState(USBPacket* p, USBPacketState expected); // process the packet void USB_ProcessOne(USBPacket* p); + // + void USB_DoParameter(XboxDevice* s, USBPacket* p); + // process a setup token + void USB_DoTokenSetup(XboxDevice* s, USBPacket* p); + // process an input token + void DoTokenIn(XboxDevice* s, USBPacket* p); + // process an output token + void DoTokenOut(XboxDevice* s, USBPacket* p); + // copy the packet data to the buffer pointed to by ptr + void USB_PacketCopy(USBPacket* p, void* ptr, size_t bytes); + // queue a packet to an endpoint + void USB_QueueOne(USBPacket* p); + // + void USB_DeviceHandleControl(XboxDevice* dev, USBPacket* p, int request, int value, int index, int length, uint8_t* data); + // + void USB_DeviceHandleData(XboxDevice* dev, USBPacket* p); + // + void USB_DeviceFlushEPqueue(XboxDevice* dev, USBEndpoint* ep); + // + void USB_DeviceCancelPacket(XboxDevice* dev, USBPacket* p); + // Cancel an active packet. The packed must have been deferred by + // returning USB_RET_ASYNC from handle_packet, and not yet completed + void USB_CancelPacket(USBPacket* p); }; #endif diff --git a/src/devices/video/EmuNV2A_PTIMER.cpp b/src/devices/video/EmuNV2A_PTIMER.cpp index acc463c0b..6ba4c5d5e 100644 --- a/src/devices/video/EmuNV2A_PTIMER.cpp +++ b/src/devices/video/EmuNV2A_PTIMER.cpp @@ -39,24 +39,7 @@ // * // ****************************************************************** -static inline uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c) -{ - union { - uint64_t ll; - struct { - uint32_t low, high; - } l; - } u, res; - uint64_t rl, rh; - - u.ll = a; - rl = (uint64_t)u.l.low * (uint64_t)b; - rh = (uint64_t)u.l.high * (uint64_t)b; - rh += (rl >> 32); - res.l.high = (uint32_t)(rh / c); - res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c; - return res.ll; -} +#include "Cxbx.h" /* PTIMER - time measurement and time-based alarms */ static uint64_t ptimer_get_clock(NV2AState * d) @@ -64,7 +47,7 @@ static uint64_t ptimer_get_clock(NV2AState * d) // Get time in nanoseconds uint64_t time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now().time_since_epoch()).count(); - return muldiv64(time, + return Muldiv64(time, uint32_t(d->pramdac.core_clock_freq * d->ptimer.numerator), CLOCKS_PER_SEC * d->ptimer.denominator); } From b486095e9782f13cf287c093ac914dc18a88a198 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Sat, 9 Jun 2018 12:04:23 +0200 Subject: [PATCH 0038/1000] Control and bulk list processing --- src/devices/USBController/OHCI.cpp | 25 ++++++++++++++++++++++++- src/devices/USBController/OHCI.h | 4 +++- src/devices/USBController/USBDevice.h | 2 +- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index f6d4efcbf..28c3090e3 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -226,7 +226,7 @@ void OHCI::OHCI_FrameBoundaryWorker() OHCI_StopEndpoints(); } m_OldHcControl = m_Registers.HcControl; - ohci_process_lists(ohci, 0); + OHCI_ProcessLists(0); // Stop if UnrecoverableError happened or OHCI_SOF will crash if (m_Registers.HcInterruptStatus & OHCI_INTR_UE) { @@ -1396,3 +1396,26 @@ void OHCI::OHCI_AsyncCancelDevice(XboxDevice* dev) m_AsyncTD = 0; } } + +void OHCI::OHCI_ProcessLists(int completion) +{ + // Only process the control list if it is enabled (HcControl) and has available TD's (HcCommandStatus) + if ((m_Registers.HcControl & OHCI_CTL_CLE) && (m_Registers.HcCommandStatus & OHCI_STATUS_CLF)) { + if (m_Registers.HcControlCurrentED && m_Registers.HcControlCurrentED != m_Registers.HcControlHeadED) { + DbgPrintf("Ohci: head 0x%X, current 0x%X\n", + m_Registers.HcControlHeadED, m_Registers.HcControlCurrentED); + } + if (!OHCI_ServiceEDlist(m_Registers.HcControlHeadED, completion)) { + m_Registers.HcControlCurrentED = 0; + m_Registers.HcCommandStatus &= ~OHCI_STATUS_CLF; + } + } + + // Only process the bulk list if it is enabled (HcControl) and has available TD's (HcCommandStatus) + if ((m_Registers.HcControl & OHCI_CTL_BLE) && (m_Registers.HcCommandStatus & OHCI_STATUS_BLF)) { + if (!OHCI_ServiceEDlist(m_Registers.HcBulkHeadED, completion)) { + m_Registers.HcBulkCurrentED = 0; + m_Registers.HcCommandStatus &= ~OHCI_STATUS_BLF; + } + } +} diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index ebe984ad5..8e233f367 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -250,7 +250,7 @@ class OHCI bool OHCI_GetDwords(xbaddr Paddr, uint32_t* Buffer, int Number); // write an array of DWORDs in memory bool OHCI_WriteDwords(xbaddr Paddr, uint32_t* Buffer, int Number); - // process an ED list + // process an ED list. Returns nonzero if active TD was found int OHCI_ServiceEDlist(xbaddr Head, int Completion); // process a TD. Returns nonzero to terminate processing of this endpoint int OHCI_ServiceTD(OHCI_ED* Ed); @@ -258,6 +258,8 @@ class OHCI XboxDevice* OHCI::OHCI_FindDevice(uint8_t Addr); // cancel a packet when a device is removed void OHCI_AsyncCancelDevice(XboxDevice* dev); + // Process Control and Bulk lists + void OHCI_ProcessLists(int completion); }; #endif diff --git a/src/devices/USBController/USBDevice.h b/src/devices/USBController/USBDevice.h index de0d2881b..f3a06f96a 100644 --- a/src/devices/USBController/USBDevice.h +++ b/src/devices/USBController/USBDevice.h @@ -181,7 +181,7 @@ USBCombinedPacket; struct _USBPacket { int Pid; // Packet ID (used to identify the type of packet that is being sent) - uint32_t Id; // Paddr of the TD for this packet + uint32_t Id; // Paddr of the TD for this packet USBEndpoint* Endpoint; // endpoint this packet is transferred to unsigned int Stream; IOVector IoVec; // used to perform vectored I/O From 36c60e7ca7e2be8703d074071495767d2728275e Mon Sep 17 00:00:00 2001 From: ergo720 Date: Mon, 11 Jun 2018 17:36:49 +0200 Subject: [PATCH 0039/1000] Isochronous TD + changed usb folder structure --- build/win32/Cxbx.vcxproj | 8 +- build/win32/Cxbx.vcxproj.filters | 27 +- src/Common/Cxbx.cpp | 42 +- src/Cxbx.h | 5 + src/devices/{USBController => usb}/OHCI.cpp | 398 ++++++++++++++++-- src/devices/{USBController => usb}/OHCI.h | 25 +- .../{USBController => usb}/USBDevice.cpp | 0 .../{USBController => usb}/USBDevice.h | 0 8 files changed, 444 insertions(+), 61 deletions(-) rename src/devices/{USBController => usb}/OHCI.cpp (76%) rename src/devices/{USBController => usb}/OHCI.h (92%) rename src/devices/{USBController => usb}/USBDevice.cpp (100%) rename src/devices/{USBController => usb}/USBDevice.h (100%) diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index 52d87eaa8..88f63b8fa 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -362,8 +362,8 @@ - - + + @@ -734,8 +734,8 @@ - - + + diff --git a/build/win32/Cxbx.vcxproj.filters b/build/win32/Cxbx.vcxproj.filters index 5263f03de..8cd122ddb 100644 --- a/build/win32/Cxbx.vcxproj.filters +++ b/build/win32/Cxbx.vcxproj.filters @@ -281,17 +281,17 @@ Emulator - - Hardware - - - Hardware - Emulator GUI + + + Hardware\Usb + + + Hardware\Usb GUI @@ -577,14 +577,14 @@ Emulator - - Hardware - - - Hardware - Emulator + + + Hardware\Usb + + + Hardware\Usb GUI @@ -702,6 +702,9 @@ {9efb9cfc-2731-4edb-8dd0-36950b0263df} + + {379f4b26-2444-4fda-90eb-d93e7d5938a2} + {0e125cbe-fb2e-41ef-a381-6effd9fabd35} diff --git a/src/Common/Cxbx.cpp b/src/Common/Cxbx.cpp index aa4ae908e..8fd98fea1 100644 --- a/src/Common/Cxbx.cpp +++ b/src/Common/Cxbx.cpp @@ -36,9 +36,7 @@ // The intent of this file is to add general functions which are not kernel specific (for those CxbxKrnl.h should be used instead) -#include "Cxbx.h" -#include -#include +#include "CxbxKrnl\CxbxKrnl.h" #ifndef MIN #define MIN(a, b) (((a) < (b)) ? (a) : (b)) @@ -135,4 +133,40 @@ size_t IoVecFromBuffer(const IoVec* iov, unsigned int iov_cnt, size_t offset, vo } assert(offset == 0); return done; -} \ No newline at end of file +} + +// ergo720: note that GetDwords and WriteDwords will reliably work only if the allocation was served by MapViewOfFileEx and not +// by VirtualAlloc (see comment on OHCI_ReadHCCA for more details). Once LLE CPU and MMU are implemented, this will no +// longer be the case. Also note that the physical pages can be modified while being read/written + +// read an array of DWORDs in memory +void GetDwords(xbaddr Paddr, uint32_t* Buffer, int Number) +{ + for (int i = 0; i < Number; i++, Buffer++, Paddr += sizeof(*Buffer)) { + std::memcpy(Buffer, reinterpret_cast(Paddr + CONTIGUOUS_MEMORY_BASE), 4); // dropped little -> big endian conversion from XQEMU + } +} + +// write an array of DWORDs in memory +void WriteDwords(xbaddr Paddr, uint32_t* Buffer, int Number) +{ + for (int i = 0; i < Number; i++, Buffer++, Paddr += sizeof(*Buffer)) { + std::memcpy(reinterpret_cast(Paddr + CONTIGUOUS_MEMORY_BASE), Buffer, 4); // dropped big -> little endian conversion from XQEMU + } +} + +// read an array of WORDs in memory +void GetWords(xbaddr Paddr, uint16_t* Buffer, int Number) +{ + for (int i = 0; i < Number; i++, Buffer++, Paddr += sizeof(*Buffer)) { + std::memcpy(Buffer, reinterpret_cast(Paddr + CONTIGUOUS_MEMORY_BASE), 2); // dropped little -> big endian conversion from XQEMU + } +} + +// write an array of WORDs in memory +void WriteWords(xbaddr Paddr, uint16_t* Buffer, int Number) +{ + for (int i = 0; i < Number; i++, Buffer++, Paddr += sizeof(*Buffer)) { + std::memcpy(reinterpret_cast(Paddr + CONTIGUOUS_MEMORY_BASE), Buffer, 2); // dropped big -> little endian conversion from XQEMU + } +} diff --git a/src/Cxbx.h b/src/Cxbx.h index e830dc399..e1c12fc94 100644 --- a/src/Cxbx.h +++ b/src/Cxbx.h @@ -185,4 +185,9 @@ void IoVecAdd(IOVector* qiov, void* base, size_t len); size_t IoVecTobuffer(const IoVec* iov, const unsigned int iov_cnt, size_t offset, void *buf, size_t bytes); size_t IoVecFromBuffer(const IoVec* iov, unsigned int iov_cnt, size_t offset, void* buf, size_t bytes); +void WriteDwords(xbaddr Paddr, uint32_t* Buffer, int Number); +void GetDwords(xbaddr Paddr, uint32_t* Buffer, int Number); +void GetWords(xbaddr Paddr, uint16_t* Buffer, int Number); +void WriteWords(xbaddr Paddr, uint16_t* Buffer, int Number); + #endif diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/usb/OHCI.cpp similarity index 76% rename from src/devices/USBController/OHCI.cpp rename to src/devices/usb/OHCI.cpp index 28c3090e3..d60bd79ce 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -125,7 +125,7 @@ #define OHCI_TD_DP_SHIFT 19 #define OHCI_TD_DP_MASK (3<(Ed), sizeof(*Ed) >> 2); // ED is 16 bytes large + if (Paddr != xbnull) { + GetDwords(Paddr, reinterpret_cast(Ed), sizeof(*Ed) >> 2); // ED is 16 bytes large + return false; + } + return true; // error } bool OHCI::OHCI_WriteED(xbaddr Paddr, OHCI_ED* Ed) { - // According to the standard, only the HeadP field is writable by the HC, so we'll write just that - size_t OffsetOfHeadP = offsetof(OHCI_ED, HeadP); - - return OHCI_WriteDwords(Paddr + OffsetOfHeadP, reinterpret_cast(reinterpret_cast(Ed) + OffsetOfHeadP), 1); + if (Paddr != xbnull) { + // According to the standard, only the HeadP field is writable by the HC, so we'll write just that + size_t OffsetOfHeadP = offsetof(OHCI_ED, HeadP); + WriteDwords(Paddr + OffsetOfHeadP, reinterpret_cast(reinterpret_cast(Ed) + OffsetOfHeadP), 1); + return false; + } + return true; // error } bool OHCI::OHCI_ReadTD(xbaddr Paddr, OHCI_TD* Td) { - return OHCI_GetDwords(Paddr, reinterpret_cast(Td), sizeof(*Td) >> 2); // TD is 16 bytes large + if (Paddr != xbnull) { + GetDwords(Paddr, reinterpret_cast(Td), sizeof(*Td) >> 2); // TD is 16 bytes large + return false; + } + return true; // error } bool OHCI::OHCI_WriteTD(xbaddr Paddr, OHCI_TD* Td) { - return OHCI_WriteDwords(Paddr, reinterpret_cast(Td), sizeof(*Td) >> 2); + if (Paddr != xbnull) { + WriteDwords(Paddr, reinterpret_cast(Td), sizeof(*Td) >> 2); + return false; + } + return true; // error +} + +bool OHCI::OHCI_ReadIsoTD(xbaddr Paddr, OHCI_ISO_TD* td) +{ + if (Paddr != xbnull) { + GetDwords(Paddr, reinterpret_cast(td), 4); + GetWords(Paddr + 16, td->Offset, 8); + return false; + } + return true; // error +} + +bool OHCI::OHCI_WriteIsoTD(xbaddr Paddr, OHCI_ISO_TD* td) +{ + if (Paddr != xbnull) { + WriteDwords(Paddr, reinterpret_cast(td), 4); + WriteWords(Paddr + 16, td->Offset, 8); + return false; + } + return true; // error } bool OHCI::OHCI_CopyTD(OHCI_TD* Td, uint8_t* Buffer, int Length, bool bIsWrite) @@ -374,6 +427,30 @@ bool OHCI::OHCI_CopyTD(OHCI_TD* Td, uint8_t* Buffer, int Length, bool bIsWrite) return false; } +bool OHCI::OHCI_CopyIsoTD(uint32_t start_addr, uint32_t end_addr, uint8_t* Buffer, int Length, bool bIsWrite) +{ + uint32_t ptr, n; + + ptr = start_addr; + n = 0x1000 - (ptr & 0xFFF); + if (n > Length) { + n = Length; + } + + if (OHCI_FindAndCopyTD(ptr, Buffer, n, bIsWrite)) { + return true; // error + } + if (n == Length) { + return false; // no bytes left to copy + } + ptr = end_addr & ~0xfffu; + Buffer += n; + if (OHCI_FindAndCopyTD(ptr, Buffer, Length - n, bIsWrite)) { + return true; // error + } + return false; +} + bool OHCI::OHCI_FindAndCopyTD(xbaddr Paddr, uint8_t* Buffer, int Length, bool bIsWrite) { // ergo720: the buffer pointed to by Paddr can be anywhere in memory (it depends on how the xbe has @@ -411,30 +488,6 @@ bool OHCI::OHCI_FindAndCopyTD(xbaddr Paddr, uint8_t* Buffer, int Length, bool bI return false; } -bool OHCI::OHCI_GetDwords(xbaddr Paddr, uint32_t* Buffer, int Number) -{ - if (Paddr != xbnull) { - for (int i = 0; i < Number; i++, Buffer++, Paddr += sizeof(*Buffer)) { - std::memcpy(Buffer, reinterpret_cast(Paddr + CONTIGUOUS_MEMORY_BASE), 4); // dropped little -> big endian conversion from XQEMU - } - return false; - } - - return true; // error -} - -bool OHCI::OHCI_WriteDwords(xbaddr Paddr, uint32_t* Buffer, int Number) -{ - if (Paddr != xbnull) { - for (int i = 0; i < Number; i++, Buffer++, Paddr += sizeof(*Buffer)) { - std::memcpy(reinterpret_cast(Paddr + CONTIGUOUS_MEMORY_BASE), Buffer, 4); // dropped big -> little endian conversion from XQEMU - } - return false; - } - - return true; // error -} - int OHCI::OHCI_ServiceEDlist(xbaddr Head, int Completion) { OHCI_ED ed; @@ -492,7 +545,7 @@ int OHCI::OHCI_ServiceEDlist(xbaddr Head, int Completion) } else { // Handle isochronous endpoints - if (ohci_service_iso_td(ohci, &ed, Completion)) + if (OHCI_ServiceIsoTD(&ed, Completion)) break; } } @@ -748,10 +801,12 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) td.NextTD = m_Registers.HcDoneHead; m_Registers.HcDoneHead = addr; i = OHCI_BM(td.Flags, TD_DI); - if (i < m_DoneCount) + if (i < m_DoneCount) { m_DoneCount = i; - if (OHCI_BM(td.Flags, TD_CC) != OHCI_CC_NOERROR) + } + if (OHCI_BM(td.Flags, TD_CC) != OHCI_CC_NOERROR) { m_DoneCount = 0; + } exit_no_retire: if (OHCI_WriteTD(addr, &td)) { @@ -1419,3 +1474,276 @@ void OHCI::OHCI_ProcessLists(int completion) } } } + +int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) +{ + int dir; + size_t len = 0; +#ifdef DEBUG_ISOCH + const char *str = NULL; +#endif + int pid; + int ret; + int i; + XboxDevice* dev; + USBEndpoint* ep; + OHCI_ISO_TD iso_td; + uint32_t addr; + uint16_t starting_frame; + int16_t relative_frame_number; + int frame_count; + uint32_t start_offset, next_offset, end_offset = 0; + uint32_t start_addr, end_addr; + + addr = ed->HeadP & OHCI_DPTR_MASK; + + if (OHCI_ReadIsoTD(addr, &iso_td)) { + DbgPrintf("Ohci: ISO_TD read error at physical address 0x%X\n", addr); + OHCI_FatalError(); + return 0; + } + + starting_frame = OHCI_BM(iso_td.Flags, TD_SF); + frame_count = OHCI_BM(iso_td.Flags, TD_FC); + // From the standard: "The Host Controller does an unsigned subtraction of StartingFrame from the 16 bits of + // HcFmNumber to arrive at a signed value for a relative frame number (frame R)." + relative_frame_number = USUB(m_Registers.HcFmNumber & 0xFFFF, starting_frame); + +#ifdef DEBUG_ISOCH + printf("--- ISO_TD ED head 0x%.8x tailp 0x%.8x\n" + "0x%.8x 0x%.8x 0x%.8x 0x%.8x\n" + "0x%.8x 0x%.8x 0x%.8x 0x%.8x\n" + "0x%.8x 0x%.8x 0x%.8x 0x%.8x\n" + "frame_number 0x%.8x starting_frame 0x%.8x\n" + "frame_count 0x%.8x relative %d\n" + "di 0x%.8x cc 0x%.8x\n", + ed->head & OHCI_DPTR_MASK, ed->tail & OHCI_DPTR_MASK, + iso_td.flags, iso_td.bp, iso_td.next, iso_td.be, + iso_td.offset[0], iso_td.offset[1], iso_td.offset[2], iso_td.offset[3], + iso_td.offset[4], iso_td.offset[5], iso_td.offset[6], iso_td.offset[7], + ohci->frame_number, starting_frame, + frame_count, relative_frame_number, + OHCI_BM(iso_td.flags, TD_DI), OHCI_BM(iso_td.flags, TD_CC)); +#endif + + if (relative_frame_number < 0) { + // From the standard: "If the relative frame number is negative, then the current frame is earlier than the 0th frame + // of the Isochronous TD and the Host Controller advances to the next ED." + DbgPrintf("Ohci: ISO_TD R=%d < 0\n", relative_frame_number); + return 1; + } + else if (relative_frame_number > frame_count) { + // From the standard: "If the relative frame number is greater than + // FrameCount, then the Isochronous TD has expired and a error condition exists." + DbgPrintf("Ohci: ISO_TD R=%d > FC=%d\n", relative_frame_number, frame_count); + OHCI_SET_BM(iso_td.Flags, TD_CC, OHCI_CC_DATAOVERRUN); + ed->HeadP &= ~OHCI_DPTR_MASK; + ed->HeadP |= (iso_td.NextTD & OHCI_DPTR_MASK); + iso_td.NextTD = m_Registers.HcDoneHead; + m_Registers.HcDoneHead = addr; + i = OHCI_BM(iso_td.Flags, TD_DI); + if (i < m_DoneCount) { + m_DoneCount = i; + } + if (OHCI_WriteIsoTD(addr, &iso_td)) { + OHCI_FatalError(); + return 1; + } + return 0; + } + + // From the standard: "If the relative frame number is between 0 and FrameCount, then the Host Controller issues + // a token to the endpoint and attempts a data transfer using the buffer described by the Isochronous TD." + + dir = OHCI_BM(ed->Flags, ED_D); + switch (dir) { + case OHCI_TD_DIR_IN: +#ifdef DEBUG_ISOCH + str = "in"; +#endif + pid = USB_TOKEN_IN; + break; + case OHCI_TD_DIR_OUT: +#ifdef DEBUG_ISOCH + str = "out"; +#endif + pid = USB_TOKEN_OUT; + break; + case OHCI_TD_DIR_SETUP: +#ifdef DEBUG_ISOCH + str = "setup"; +#endif + pid = USB_TOKEN_SETUP; + break; + default: + EmuWarning("Ohci: Bad direction %d", dir); + return 1; + } + + if (!iso_td.BufferPage0 || !iso_td.BufferEnd) { + DbgPrintf("Ohci: ISO_TD bp 0x%.8X be 0x%.8X\n", iso_td.BufferPage0, iso_td.BufferEnd); + return 1; + } + + start_offset = iso_td.Offset[relative_frame_number]; + next_offset = iso_td.Offset[relative_frame_number + 1]; + + // From the standard: "If the Host Controller supports checking of the Offsets, if either Offset[R] or Offset[R+1] does + // not have a ConditionCode of NOT ACCESSED or if the Offset[R + 1] is not greater than or equal to Offset[R], then + // an Unrecoverable Error is indicated." + // ergo720: I have a doubt here: according to the standard, the error condition is set if ConditionCode (bits 12-15 of + // Offset[R(+1)] is not 111x (= NOT ACCESSED), however the check below is only triggered if the bits are all zeros + // (= NO ERROR). So, if, for example, these bits are 1100 (= BUFFER OVERRUN), the check won't be triggered when actually + // it should be + + if (!(OHCI_BM(start_offset, TD_PSW_CC) & 0xE) || + ((relative_frame_number < frame_count) && + !(OHCI_BM(next_offset, TD_PSW_CC) & 0xE))) { + DbgPrintf("Ohci: ISO_TD cc != not accessed 0x%.8x 0x%.8x\n", start_offset, next_offset); + return 1; + } + + if ((relative_frame_number < frame_count) && (start_offset > next_offset)) { + printf("Ohci: ISO_TD start_offset=0x%.8x > next_offset=0x%.8x\n", start_offset, next_offset); + return 1; + } + + // From the standard: "Bit 12 of offset R then selects the upper 20 bits of the physical address + // as either BufferPage0 when bit 12 = 0 or the upper 20 bits of BufferEnd when bit 12 = 1." + + if ((start_offset & 0x1000) == 0) { + start_addr = (iso_td.BufferPage0 & OHCI_PAGE_MASK) | + (start_offset & OHCI_OFFSET_MASK); + } + else { + start_addr = (iso_td.BufferEnd & OHCI_PAGE_MASK) | + (start_offset & OHCI_OFFSET_MASK); + } + + // From the standard: "If the data packet is not the last in an Isochronous TD (R not equal to FrameCount), + // then the ending address of the buffer is found by using Offset[R + 1] - 1. This value is then used to create a + // physical address in the same manner as the Offset[R] was used to create the starting physical address." + + if (relative_frame_number < frame_count) { + end_offset = next_offset - 1; + if ((end_offset & 0x1000) == 0) { + end_addr = (iso_td.BufferPage0 & OHCI_PAGE_MASK) | + (end_offset & OHCI_OFFSET_MASK); + } + else { + end_addr = (iso_td.BufferEnd & OHCI_PAGE_MASK) | + (end_offset & OHCI_OFFSET_MASK); + } + } + else { + // From the standard: "If, however, the data packet is the last in an Isochronous TD(R = FrameCount), + // then the value of BufferEnd is the address of the last byte in the buffer." + end_addr = iso_td.BufferEnd; + } + + if ((start_addr & OHCI_PAGE_MASK) != (end_addr & OHCI_PAGE_MASK)) { + len = (end_addr & OHCI_OFFSET_MASK) + 0x1001 + - (start_addr & OHCI_OFFSET_MASK); + } + else { + len = end_addr - start_addr + 1; + } + + if (len && dir != OHCI_TD_DIR_IN) { + if (OHCI_CopyIsoTD(start_addr, end_addr, m_UsbBuffer, len, false)) { + OHCI_FatalError(); + return 1; + } + } + + if (!completion) { + bool int_req = relative_frame_number == frame_count && OHCI_BM(iso_td.Flags, TD_DI) == 0; + dev = OHCI_FindDevice(OHCI_BM(ed->Flags, ED_FA)); + ep = m_UsbDevice->USB_GetEP(dev, pid, OHCI_BM(ed->Flags, ED_EN)); + m_UsbDevice->USB_PacketSetup(&m_UsbPacket, pid, ep, 0, addr, false, int_req); + m_UsbDevice->USB_PacketAddBuffer(&m_UsbPacket, m_UsbBuffer, len); + m_UsbDevice->USB_HandlePacket(dev, &m_UsbPacket); + if (m_UsbPacket.Status == USB_RET_ASYNC) { + m_UsbDevice->USB_DeviceFlushEPqueue(dev, ep); + return 1; + } + } + if (m_UsbPacket.Status == USB_RET_SUCCESS) { + ret = m_UsbPacket.ActualLength; + } + else { + ret = m_UsbPacket.Status; + } + +#ifdef DEBUG_ISOCH + printf("so 0x%.8x eo 0x%.8x\nsa 0x%.8x ea 0x%.8x\ndir %s len %zu ret %d\n", + start_offset, end_offset, start_addr, end_addr, str, len, ret); +#endif + + // From the standard: "After each data packet transfer, the Rth Offset is replaced with a value that indicates the status of + // the data packet transfer.The upper 4 bits of the value are the ConditionCode for the transfer and the lower 12 bits + // represent the size of the transfer.Together, these two fields constitute the Packet Status Word(PacketStatusWord)." + // Writeback + if (dir == OHCI_TD_DIR_IN && ret >= 0 && ret <= len) { + // IN transfer succeeded + if (OHCI_CopyIsoTD(start_addr, end_addr, m_UsbBuffer, ret, true)) { + OHCI_FatalError(); + return 1; + } + OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_CC, OHCI_CC_NOERROR); + OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_SIZE, ret); + } + else if (dir == OHCI_TD_DIR_OUT && ret == len) { + // OUT transfer succeeded + OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_CC, OHCI_CC_NOERROR); + OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_SIZE, 0); + } + else { + // Handle the error condition + if (ret > static_cast(len)) { // Sequence Error + DbgPrintf("Ohci: DataOverrun %d > %zu\n", ret, len); + OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_CC, OHCI_CC_DATAOVERRUN); + OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_SIZE, len); + } + else if (ret >= 0) { // Sequence Error + DbgPrintf("Ohci: DataUnderrun %d\n", ret); + OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_CC, OHCI_CC_DATAUNDERRUN); + } + else { + switch (ret) { + case USB_RET_IOERROR: // Transmission Errors + case USB_RET_NODEV: + OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_CC, OHCI_CC_DEVICENOTRESPONDING); + OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_SIZE, 0); + break; + case USB_RET_NAK: // NAK and STALL + case USB_RET_STALL: + DbgPrintf("Ohci: got NAK/STALL %d\n", ret); + OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_CC, OHCI_CC_STALL); + OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_SIZE, 0); + break; + default: // Unknown Error + DbgPrintf("Ohci: Bad device response %d\n", ret); + OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_CC, OHCI_CC_UNDEXPETEDPID); + break; + } + } + } + + if (relative_frame_number == frame_count) { + // Last data packet of ISO TD - retire the TD to the Done Queue + OHCI_SET_BM(iso_td.Flags, TD_CC, OHCI_CC_NOERROR); + ed->HeadP &= ~OHCI_DPTR_MASK; + ed->HeadP |= (iso_td.NextTD & OHCI_DPTR_MASK); + iso_td.NextTD = m_Registers.HcDoneHead; + m_Registers.HcDoneHead = addr; + i = OHCI_BM(iso_td.Flags, TD_DI); + if (i < m_DoneCount) { + m_DoneCount = i; + } + } + if (OHCI_WriteIsoTD(addr, &iso_td)) { + OHCI_FatalError(); + } + return 1; +} diff --git a/src/devices/USBController/OHCI.h b/src/devices/usb/OHCI.h similarity index 92% rename from src/devices/USBController/OHCI.h rename to src/devices/usb/OHCI.h index 8e233f367..9de272b07 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/usb/OHCI.h @@ -83,6 +83,16 @@ typedef struct _OHCI_TD { } OHCI_TD; +/* Isochronous transfer descriptor */ +typedef struct _OHCI_ISO_TD { + uint32_t Flags; + uint32_t BufferPage0; + uint32_t NextTD; + uint32_t BufferEnd; + uint16_t Offset[8]; +} +OHCI_ISO_TD; + /* enum indicating the current HC state */ typedef enum _OHCI_State { @@ -187,8 +197,7 @@ class OHCI uint32_t m_OldHcControl; // irq number int m_IrqNum; - // ergo720: I think it's the DelayInterrupt flag in a TD - // -> num of frames to wait before generating an interrupt for this TD + // Done Queue Interrupt Counter int m_DoneCount; // the address of the pending TD xbaddr m_AsyncTD; @@ -242,18 +251,22 @@ class OHCI bool OHCI_ReadTD(xbaddr Paddr, OHCI_TD* Td); // write a TD in memory bool OHCI_WriteTD(xbaddr Paddr, OHCI_TD* Td); + // read an iso TD in memory + bool OHCI_ReadIsoTD(xbaddr Paddr, OHCI_ISO_TD* td); + // write an iso TD in memory + bool OHCI_WriteIsoTD(xbaddr Paddr, OHCI_ISO_TD* td); // read/write the user buffer pointed to by a TD from/to main memory bool OHCI_CopyTD(OHCI_TD* Td, uint8_t* Buffer, int Length, bool bIsWrite); + // read/write the user buffer pointed to by a ISO TD from/to main memory + bool OHCI_CopyIsoTD(uint32_t start_addr, uint32_t end_addr, uint8_t* Buffer, int Length, bool bIsWrite); // find a TD buffer in memory and copy it bool OHCI_FindAndCopyTD(xbaddr Paddr, uint8_t* Buffer, int Length, bool bIsWrite); - // read an array of DWORDs in memory - bool OHCI_GetDwords(xbaddr Paddr, uint32_t* Buffer, int Number); - // write an array of DWORDs in memory - bool OHCI_WriteDwords(xbaddr Paddr, uint32_t* Buffer, int Number); // process an ED list. Returns nonzero if active TD was found int OHCI_ServiceEDlist(xbaddr Head, int Completion); // process a TD. Returns nonzero to terminate processing of this endpoint int OHCI_ServiceTD(OHCI_ED* Ed); + // process an isochronous TD + int OHCI_ServiceIsoTD(OHCI_ED* ed, int completion); // find the usb device with the supplied address XboxDevice* OHCI::OHCI_FindDevice(uint8_t Addr); // cancel a packet when a device is removed diff --git a/src/devices/USBController/USBDevice.cpp b/src/devices/usb/USBDevice.cpp similarity index 100% rename from src/devices/USBController/USBDevice.cpp rename to src/devices/usb/USBDevice.cpp diff --git a/src/devices/USBController/USBDevice.h b/src/devices/usb/USBDevice.h similarity index 100% rename from src/devices/USBController/USBDevice.h rename to src/devices/usb/USBDevice.h From 138e103ca4477d86ff3b32555da31ebc2b46009c Mon Sep 17 00:00:00 2001 From: ergo720 Date: Mon, 25 Jun 2018 11:37:33 +0200 Subject: [PATCH 0040/1000] Some refactoring + started Hub device work --- build/win32/Cxbx.vcxproj | 3 + build/win32/Cxbx.vcxproj.filters | 9 + src/CxbxKrnl/CxbxKrnl.cpp | 1 + src/devices/usb/Hub.cpp | 175 +++++++++++++++++ src/devices/usb/Hub.h | 71 +++++++ src/devices/usb/OHCI.cpp | 2 +- src/devices/usb/OHCI.h | 2 +- src/devices/usb/USBDevice.cpp | 2 +- src/devices/usb/USBDevice.h | 173 +---------------- src/devices/usb/UsbCommon.h | 317 +++++++++++++++++++++++++++++++ 10 files changed, 582 insertions(+), 173 deletions(-) create mode 100644 src/devices/usb/Hub.cpp create mode 100644 src/devices/usb/Hub.h create mode 100644 src/devices/usb/UsbCommon.h diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index 88f63b8fa..40b494cc5 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -362,7 +362,9 @@ + + @@ -734,6 +736,7 @@ + diff --git a/build/win32/Cxbx.vcxproj.filters b/build/win32/Cxbx.vcxproj.filters index 8cd122ddb..3fe313af4 100644 --- a/build/win32/Cxbx.vcxproj.filters +++ b/build/win32/Cxbx.vcxproj.filters @@ -292,6 +292,9 @@ Hardware\Usb + + + Hardware\Usb GUI @@ -585,6 +588,12 @@ Hardware\Usb + + + Hardware\Usb + + + Hardware\Usb GUI diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index 9f056e341..c4062ad24 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -70,6 +70,7 @@ namespace xboxkrnl #include "devices\Xbox.h" // For InitXboxHardware() #include "devices\LED.h" // For LED::Sequence #include "EmuSha.h" // For the SHA1 functions +#include "Timer.h" // For Timer_Init /*! thread local storage */ Xbe::TLS *CxbxKrnl_TLS = NULL; diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp new file mode 100644 index 000000000..49b70931c --- /dev/null +++ b/src/devices/usb/Hub.cpp @@ -0,0 +1,175 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * Cxbx->devices->usb->Hub.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** + +#include "Hub.h" + + +USBDescIface::USBDescIface(bool bDefault) +{ + std::memset(this, 0, sizeof(USBDescIface)); + if (bDefault) { + bInterfaceNumber = 0; + bNumEndpoints = 1; + bInterfaceClass = USB_CLASS_HUB; + eps = new USBDescEndpoint(); + eps->bEndpointAddress = USB_DIR_IN | 0x01; + eps->bmAttributes = USB_ENDPOINT_XFER_INT; + eps->wMaxPacketSize = 1 + (NUM_PORTS + 7) / 8; + eps->bInterval = 0xFF; + } +} + +USBDescIface::~USBDescIface() { delete eps; } + +static const USBDescIface desc_iface_hub(true); + +USBDescDevice::USBDescDevice() +{ + std::memset(this, 0, sizeof(USBDescDevice)); + bcdUSB = 0x0110; + bDeviceClass = USB_CLASS_HUB; + bMaxPacketSize0 = 8; + bNumConfigurations = 1; + confs->bNumInterfaces = 1; + confs->bConfigurationValue = 1; + confs->bmAttributes = 0xE0; + confs->nif = 1; + confs->ifs = &desc_iface_hub; +} + +static const USBDescStrings desc_strings = { + [STR_MANUFACTURER] = "Cxbx-Reloaded", + [STR_PRODUCT] = "Cxbx-Reloaded USB Hub", + [STR_SERIALNUMBER] = "314159", +}; + +static const USBDesc desc_hub = { + id.idVendor = 0x0409, + id.idProduct = 0x55AA, + id.bcdDevice = 0x0101, + id.iManufacturer = STR_MANUFACTURER, + id.iProduct = STR_PRODUCT, + id.iSerialNumber = STR_SERIALNUMBER, + full = &desc_device_hub, + str = desc_strings, +}; + +void Hub::Init() +{ + ClassInitFn(); + UsbEpInit(); + rc = usb_claim_port(dev); + if (rc != 0) { + return rc; + } + rc = usb_device_init(dev); + if (rc != 0) { + usb_release_port(dev); + return rc; + } + if (dev->auto_attach) { + rc = usb_device_attach(dev); + if (rc != 0) { + usb_qdev_exit(qdev); + return rc; + } + } +} + +void Hub::ClassInitFn() +{ + //DeviceClass *dc = DEVICE_CLASS(klass); + m_pPeripheralFuncStruct = new USBDeviceClass; + m_pDeviceStruct = new XboxDevice; + + m_pDeviceStruct->ProductDesc = "Cxbx-Reloaded USB Hub"; + QLIST_INIT(&m_pDeviceStruct->Strings); + + { + using namespace std::placeholders; + + m_pPeripheralFuncStruct->init = std::bind(&Hub::UsbHub_Initfn, this, _1); + m_pPeripheralFuncStruct->find_device = std::bind(&Hub::UsbHub_FindDevice, this, _1, _2); + m_pPeripheralFuncStruct->handle_reset = std::bind(&Hub::UsbHub_HandleReset, this, _1); + m_pPeripheralFuncStruct->handle_control = std::bind(&Hub::UsbHub_HandleControl, this, _1, _2, _3, _4, _5, _6, _7); + m_pPeripheralFuncStruct->handle_data = std::bind(&Hub::UsbHub_HandleData, this, _1, _2); + m_pPeripheralFuncStruct->handle_destroy = std::bind(&Hub::UsbHub_HandleDestroy, this, _1); + m_pPeripheralFuncStruct->product_desc = m_pDeviceStruct->ProductDesc.c_str(); + m_pPeripheralFuncStruct->usb_desc = &desc_hub; + } + + //set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); + //dc->fw_name = "hub"; + //dc->vmsd = &vmstate_usb_hub; +} + +void Hub::UsbEpInit() +{ + UsbEpReset(); + QTAILQ_INIT(&m_pDeviceStruct->EP_ctl.Queue); + for (int ep = 0; ep < USB_MAX_ENDPOINTS; ep++) { + QTAILQ_INIT(&m_pDeviceStruct->EP_in[ep].Queue); + QTAILQ_INIT(&m_pDeviceStruct->EP_out[ep].Queue); + } +} + +void Hub::UsbEpReset() +{ + int ep; + + dev->EP_ctl.Num = 0; + dev->EP_ctl.Type = USB_ENDPOINT_XFER_CONTROL; + dev->EP_ctl.ifnum = 0; + dev->EP_ctl.max_packet_size = 64; + dev->EP_ctl.dev = dev; + dev->EP_ctl.pipeline = false; + for (ep = 0; ep < USB_MAX_ENDPOINTS; ep++) { + dev->ep_in[ep].Num = ep + 1; + dev->ep_out[ep].Num = ep + 1; + dev->ep_in[ep].pid = USB_TOKEN_IN; + dev->ep_out[ep].pid = USB_TOKEN_OUT; + dev->ep_in[ep].Type = USB_ENDPOINT_XFER_INVALID; + dev->ep_out[ep].Type = USB_ENDPOINT_XFER_INVALID; + dev->ep_in[ep].ifnum = USB_INTERFACE_INVALID; + dev->ep_out[ep].ifnum = USB_INTERFACE_INVALID; + dev->ep_in[ep].max_packet_size = 0; + dev->ep_out[ep].max_packet_size = 0; + dev->ep_in[ep].dev = dev; + dev->ep_out[ep].dev = dev; + dev->ep_in[ep].pipeline = false; + dev->ep_out[ep].pipeline = false; + } +} diff --git a/src/devices/usb/Hub.h b/src/devices/usb/Hub.h new file mode 100644 index 000000000..00916f7ee --- /dev/null +++ b/src/devices/usb/Hub.h @@ -0,0 +1,71 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * Cxbx->devices->usb->Hub.h +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** + +#include "UsbCommon.h" + + +/* same as Linux kernel root hubs */ +typedef enum ft{ + STR_MANUFACTURER = 1, + STR_PRODUCT, + STR_SERIALNUMBER, +}; + + +/* Class which implements a usb hub */ +class Hub final : public UsbPeripheral +{ + public: + // initialize this peripheral + void Init() override; + + + private: + // initialize various member variables/functions + void ClassInitFn(); + // see USBDeviceClass for comments about these functions + int UsbHub_Initfn(XboxDevice* dev); + XboxDevice* UsbHub_FindDevice(XboxDevice* dev, uint8_t addr); + void UsbHub_HandleReset(XboxDevice* dev); + void UsbHub_HandleControl(XboxDevice* dev, USBPacket* p, + int request, int value, int index, int length, uint8_t* data); + void UsbHub_HandleData(XboxDevice* dev, USBPacket* p); + void UsbHub_HandleDestroy(XboxDevice* dev); + // initialize the endpoints of this peripheral + void UsbEpInit(); + // + void UsbEpReset(); +}; \ No newline at end of file diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index d60bd79ce..4741035d1 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -9,7 +9,7 @@ // * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, // * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, // * -// * Cxbx->devices->USBController->OHCI.cpp +// * Cxbx->devices->usb->OHCI.cpp // * // * This file is part of the Cxbx project. // * diff --git a/src/devices/usb/OHCI.h b/src/devices/usb/OHCI.h index 9de272b07..535d90ccb 100644 --- a/src/devices/usb/OHCI.h +++ b/src/devices/usb/OHCI.h @@ -9,7 +9,7 @@ // * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, // * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, // * -// * Cxbx->devices->USBController->OHCI.h +// * Cxbx->devices->usb->OHCI.h // * // * This file is part of the Cxbx project. // * diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index 8febc11a9..8a1f2a9a1 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -9,7 +9,7 @@ // * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, // * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, // * -// * Cxbx->devices->USBController->USBDevice.cpp +// * Cxbx->devices->usb->USBDevice.cpp // * // * This file is part of the Cxbx project. // * diff --git a/src/devices/usb/USBDevice.h b/src/devices/usb/USBDevice.h index f3a06f96a..a5206a018 100644 --- a/src/devices/usb/USBDevice.h +++ b/src/devices/usb/USBDevice.h @@ -9,7 +9,7 @@ // * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, // * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, // * -// * Cxbx->devices->USBController->USBDevice.h +// * Cxbx->devices->usb->USBDevice.h // * // * This file is part of the Cxbx project. // * @@ -33,180 +33,13 @@ // * All rights reserved // * // ****************************************************************** + #ifndef USBDEVICE_H_ #define USBDEVICE_H_ -#include "Cxbx.h" #include "..\PCIDevice.h" -#include "..\devices\video\queue.h" +#include "UsbCommon.h" -#define USB_MAX_ENDPOINTS 15 -#define USB_MAX_INTERFACES 16 - -#define USB_STATE_NOTATTACHED 0 -#define USB_STATE_ATTACHED 1 -#define USB_STATE_DEFAULT 2 - -typedef enum USBPacketState { - USB_PACKET_UNDEFINED = 0, - USB_PACKET_SETUP, - USB_PACKET_QUEUED, - USB_PACKET_ASYNC, - USB_PACKET_COMPLETE, - USB_PACKET_CANCELED, -} -USBPacketState; - -typedef struct _USBPacket USBPacket; -typedef struct _XboxDevice XboxDevice; - -/* USB endpoint */ -typedef struct _USBEndpoint -{ - uint8_t Num; // endpoint number - uint8_t pid; - uint8_t Type; // the type of this endpoint - uint8_t ifnum; - int max_packet_size; - bool Pipeline; - bool Halted; // indicates that the endpoint is halted - XboxDevice* Dev; // device this endpoint belongs to - QTAILQ_HEAD(, _USBPacket) Queue; // queue of packets to this endpoint -} -USBEndpoint; - -/* definition of an Xbox usb device */ -typedef struct _XboxDevice -{ - DeviceState qdev; - USBPort *port; - char *port_path; - char *serial; - void *opaque; - uint32_t flags; - - // Actual connected speed - int speed; - // Supported speeds, not in info because it may be variable (hostdevs) - int speedmask; - uint8_t Addr; // device function address - char product_desc[32]; - int auto_attach; - int Attached; // device is attached - - int32_t State; // current state of device - uint8_t SetupBuffer[8]; // holds the IoVec structs copied (control transfers only?) - uint8_t data_buf[4096]; - int32_t RemoteWakeup; // wakeup flag - int32_t SetupState; // result of a setup tken processing operation - int32_t SetupLength; // number of bytes to transfer as specified by a setup token - int32_t SetupIndex; // index of the parameter in a setup token? - - USBEndpoint EP_ctl; // endpoints for SETUP tokens - USBEndpoint EP_in[USB_MAX_ENDPOINTS]; // endpoints for OUT tokens - USBEndpoint EP_out[USB_MAX_ENDPOINTS]; // endpoints for IN tokens - - //QLIST_HEAD(, USBDescString) strings; - const USBDesc *usb_desc; // Overrides class usb_desc if not NULL - const USBDescDevice *device; - - int configuration; - int ninterfaces; - int altsetting[USB_MAX_INTERFACES]; - const USBDescConfig *config; - const USBDescIface *ifaces[USB_MAX_INTERFACES]; -} -XboxDevice; - -// ergo720: this could be merged in the OHCI or USBDevice class if possible -typedef struct USBDeviceClass -{ - DeviceClass parent_class; - - int(*init)(USBDev *dev); - - // Walk (enabled) downstream ports, check for a matching device. - // Only hubs implement this. - USBDev *(*find_device)(USBDev *dev, uint8_t addr); - - // Called when a packet is canceled. - void(*cancel_packet)(USBDev *dev, USBPacket *p); - - // Called when device is destroyed. - void(*handle_destroy)(USBDev *dev); - - // Attach the device - void(*handle_attach)(USBDev *dev); - - // Reset the device - void(*handle_reset)(USBDev *dev); - - // Process control request. - // Called from handle_packet(). - // Status gets stored in p->status, and if p->status == USB_RET_SUCCESS - // then the number of bytes transferred is stored in p->actual_length - void(*handle_control)(USBDev *dev, USBPacket *p, int request, int value, - int index, int length, uint8_t *data); - - // Process data transfers (both BULK and ISOC). - // Called from handle_packet(). - // Status gets stored in p->status, and if p->status == USB_RET_SUCCESS - // then the number of bytes transferred is stored in p->actual_length - void(*handle_data)(USBDev *dev, USBPacket *p); - - void(*set_interface)(USBDev *dev, int Interface, - int alt_old, int alt_new); - - // Called when the hcd is done queuing packets for an endpoint, only - // necessary for devices which can return USB_RET_ADD_TO_QUEUE. - void(*flush_ep_queue)(USBDev *dev, USBEndpoint *ep); - - // Called by the hcd to let the device know the queue for an endpoint - // has been unlinked / stopped. Optional may be NULL. - void(*EP_Stopped)(USBDev* Dev, USBEndpoint* EP); - - const char *product_desc; - const USBDesc *usb_desc; -} -USBDeviceClass; - -typedef struct _USBCombinedPacket { - _USBPacket* First; - QTAILQ_HEAD(packets_head, _USBPacket) Packets; - IOVector IoVec; -} -USBCombinedPacket; - -/* Structure used to hold information about an active USB packet */ -struct _USBPacket -{ - int Pid; // Packet ID (used to identify the type of packet that is being sent) - uint32_t Id; // Paddr of the TD for this packet - USBEndpoint* Endpoint; // endpoint this packet is transferred to - unsigned int Stream; - IOVector IoVec; // used to perform vectored I/O - uint64_t Parameter; // control transfers - bool ShortNotOK; // the bufferRounding mode of the TD for this packet - bool IntReq; // whether or not to generate an interrupt for this packet (DelayInterrupt of the TD is zero) - int Status; // USB_RET_* status code - int ActualLength; // before copy: offset inside IoVec structs; after copy: number of bytes actually transferred - // Internal use by the USB layer - USBPacketState State; - USBCombinedPacket* Combined; - QTAILQ_ENTRY(_USBPacket) Queue; - QTAILQ_ENTRY(_USBPacket) CombinedEntry; -}; - -/* Struct describing the status of a usb port */ -typedef struct _USBPort { - XboxDevice* Dev; // usb device (if present) - int SpeedMask; // usb speeds supported - int HubCount; // number of hubs attached - char Path[16]; // the number of the port - int PortIndex; // internal port index - QTAILQ_ENTRY(_USBPort) Next; -} -USBPort; // Forward declare OHCI class for USBDevice class class OHCI; diff --git a/src/devices/usb/UsbCommon.h b/src/devices/usb/UsbCommon.h new file mode 100644 index 000000000..f33ffe472 --- /dev/null +++ b/src/devices/usb/UsbCommon.h @@ -0,0 +1,317 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * Cxbx->devices->usb->UsbCommon.h +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** + +#include "Cxbx.h" +#include "..\devices\video\queue.h" +#include + +#define USB_MAX_ENDPOINTS 15 +#define USB_MAX_INTERFACES 16 + +#define USB_STATE_NOTATTACHED 0 +#define USB_STATE_ATTACHED 1 +#define USB_STATE_DEFAULT 2 + + +typedef enum USBPacketState { + USB_PACKET_UNDEFINED = 0, + USB_PACKET_SETUP, + USB_PACKET_QUEUED, + USB_PACKET_ASYNC, + USB_PACKET_COMPLETE, + USB_PACKET_CANCELED, +} +USBPacketState; + +typedef struct _USBPacket USBPacket; +typedef struct _XboxDevice XboxDevice; +typedef const char* USBDescStrings[256]; + +typedef struct _USBDescOther { + uint8_t length; + const uint8_t *data; +} +USBDescOther; + +typedef struct _USBDescEndpoint { + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; + uint8_t bRefresh; + uint8_t bSynchAddress; + + uint8_t is_audio; /* has bRefresh + bSynchAddress */ + uint8_t *extra; + + /* superspeed endpoint companion */ + uint8_t bMaxBurst; + uint8_t bmAttributes_super; + uint16_t wBytesPerInterval; +} +USBDescEndpoint; + +struct USBDescIface { + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t bInterfaceProtocol; + uint8_t iInterface; + + uint8_t ndesc; + USBDescOther* descs; + USBDescEndpoint* eps; + USBDescIface(bool bDefault); + ~USBDescIface(); +}; + +/* conceptually an Interface Association Descriptor, and releated interfaces */ +typedef struct _USBDescIfaceAssoc { + uint8_t bFirstInterface; + uint8_t bInterfaceCount; + uint8_t bFunctionClass; + uint8_t bFunctionSubClass; + uint8_t bFunctionProtocol; + uint8_t iFunction; + + uint8_t nif; + const USBDescIface* ifs; +} +USBDescIfaceAssoc; + +typedef struct _USBDescConfig { + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; + + /* grouped interfaces */ + uint8_t nif_groups; + const USBDescIfaceAssoc* if_groups; + + /* "normal" interfaces */ + uint8_t nif; + const USBDescIface* ifs; +} +USBDescConfig; + +struct USBDescDevice { + uint16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint8_t bNumConfigurations; + const USBDescConfig* confs; + USBDescDevice(); +}; + +typedef struct _USBDescID { + uint16_t idVendor; + uint16_t idProduct; + uint16_t bcdDevice; + uint8_t iManufacturer; + uint8_t iProduct; + uint8_t iSerialNumber; +} +USBDescID; + +typedef struct _USBDesc { + USBDescID id; + const USBDescDevice* full; + const char* const* str; +} +USBDesc; + +/* USB endpoint */ +typedef struct _USBEndpoint +{ + uint8_t Num; // endpoint number + uint8_t pid; + uint8_t Type; // the type of this endpoint + uint8_t ifnum; + int max_packet_size; + bool Pipeline; + bool Halted; // indicates that the endpoint is halted + XboxDevice* Dev; // device this endpoint belongs to + QTAILQ_HEAD(, _USBPacket) Queue; // queue of packets to this endpoint +} +USBEndpoint; + +/* definition of an Xbox usb device */ +typedef struct _XboxDevice +{ + DeviceState qdev; + USBPort *port; + char *port_path; + char *serial; + void *opaque; + uint32_t flags; + + // Actual connected speed + int speed; + // Supported speeds, not in info because it may be variable (hostdevs) + int speedmask; + uint8_t Addr; // device function address + std::string ProductDesc; // the friendly name of this device + int Attached; // device is attached + + int32_t State; // current state of device + uint8_t SetupBuffer[8]; // holds the IoVec structs copied (control transfers only?) + uint8_t data_buf[4096]; + int32_t RemoteWakeup; // wakeup flag + int32_t SetupState; // result of a setup tken processing operation + int32_t SetupLength; // number of bytes to transfer as specified by a setup token + int32_t SetupIndex; // index of the parameter in a setup token? + + USBEndpoint EP_ctl; // endpoints for SETUP tokens + USBEndpoint EP_in[USB_MAX_ENDPOINTS]; // endpoints for OUT tokens + USBEndpoint EP_out[USB_MAX_ENDPOINTS]; // endpoints for IN tokens + + QLIST_HEAD(, USBDescString) Strings; + const USBDesc *usb_desc; // Overrides class usb_desc if not NULL + const USBDescDevice *device; + + int configuration; + int ninterfaces; + int altsetting[USB_MAX_INTERFACES]; + const USBDescConfig *config; + const USBDescIface *ifaces[USB_MAX_INTERFACES]; +} +XboxDevice; + +typedef struct _USBCombinedPacket { + _USBPacket* First; + QTAILQ_HEAD(packets_head, _USBPacket) Packets; + IOVector IoVec; +} +USBCombinedPacket; + +/* Structure used to hold information about an active USB packet */ +struct _USBPacket +{ + int Pid; // Packet ID (used to identify the type of packet that is being sent) + uint32_t Id; // Paddr of the TD for this packet + USBEndpoint* Endpoint; // endpoint this packet is transferred to + unsigned int Stream; + IOVector IoVec; // used to perform vectored I/O + uint64_t Parameter; // control transfers + bool ShortNotOK; // the bufferRounding mode of the TD for this packet + bool IntReq; // whether or not to generate an interrupt for this packet (DelayInterrupt of the TD is zero) + int Status; // USB_RET_* status code + int ActualLength; // before copy: offset inside IoVec structs; after copy: number of bytes actually transferred + // Internal use by the USB layer + USBPacketState State; + USBCombinedPacket* Combined; + QTAILQ_ENTRY(_USBPacket) Queue; + QTAILQ_ENTRY(_USBPacket) CombinedEntry; +}; + +/* Struct describing the status of a usb port */ +typedef struct _USBPort { + XboxDevice* Dev; // usb device (if present) + int SpeedMask; // usb speeds supported + int HubCount; // number of hubs attached + char Path[16]; // the number of the port + int PortIndex; // internal port index + QTAILQ_ENTRY(_USBPort) Next; +} +USBPort; + +/* Struct which stores general functions/variables regarding the peripheral */ +typedef struct _USBDeviceClass +{ + std::function init; + + // Walk (enabled) downstream ports, check for a matching device. + // Only hubs implement this. + std::function find_device; + + // Called when a packet is canceled. + std::function cancel_packet; + + // Called when device is destroyed. + std::function handle_destroy; + + // Attach the device + std::function handle_attach; + + // Reset the device + std::function handle_reset; + + // Process control request. + // Called from handle_packet(). + // Status gets stored in p->status, and if p->status == USB_RET_SUCCESS + // then the number of bytes transferred is stored in p->actual_length + std::function handle_control; + + // Process data transfers (both BULK and ISOC). + // Called from handle_packet(). + // Status gets stored in p->status, and if p->status == USB_RET_SUCCESS + // then the number of bytes transferred is stored in p->actual_length + std::function handle_data; + + std::function set_interface; + + // Called when the hcd is done queuing packets for an endpoint, only + // necessary for devices which can return USB_RET_ADD_TO_QUEUE. + std::function flush_ep_queue; + + // Called by the hcd to let the device know the queue for an endpoint + // has been unlinked / stopped. Optional may be NULL. + std::function EP_Stopped; + + const char* product_desc; + const USBDesc* usb_desc; +} +USBDeviceClass; + + +/* Abstract class representing a usb peripheral */ +class UsbPeripheral +{ + protected: + USBDeviceClass* m_pPeripheralFuncStruct; + XboxDevice* m_pDeviceStruct; + + virtual void Init() = 0; + +}; From a51bde22b681b682aa7fac6d67be2f7019b62e8e Mon Sep 17 00:00:00 2001 From: ergo720 Date: Sun, 1 Jul 2018 01:19:47 +0200 Subject: [PATCH 0041/1000] More hub work --- src/Cxbx.h | 18 ++- src/devices/Xbox.h | 2 +- src/devices/usb/Hub.cpp | 283 +++++++++++++++++++++++++++------- src/devices/usb/Hub.h | 43 ++++-- src/devices/usb/OHCI.cpp | 23 ++- src/devices/usb/OHCI.h | 43 ++---- src/devices/usb/USBDevice.cpp | 91 +++++------ src/devices/usb/USBDevice.h | 32 ++-- src/devices/usb/UsbCommon.h | 158 ++++++++++--------- 9 files changed, 449 insertions(+), 244 deletions(-) diff --git a/src/Cxbx.h b/src/Cxbx.h index e1c12fc94..37b2be22e 100644 --- a/src/Cxbx.h +++ b/src/Cxbx.h @@ -36,6 +36,7 @@ #include #include +#include #define FUNC_EXPORTS __pragma(comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)) @@ -162,21 +163,19 @@ extern volatile bool g_bPrintfOn; /* This is a linux struct for vectored I/O. See readv() and writev() */ -typedef struct _IoVec +struct IoVec { void* Iov_Base; // Starting address size_t Iov_Len; // Number of bytes to transfer -} -IoVec; +}; -typedef struct _IOVector +struct IOVector { IoVec* IoVecStruct; int IoVecNumber; // number of I/O buffers supplied int AllocNumber; // number of IoVec structs currently allocated size_t Size; // total size of all I/O buffers supplied -} -IOVector; +}; inline uint64_t Muldiv64(uint64_t a, uint32_t b, uint32_t c); @@ -189,5 +188,12 @@ void WriteDwords(xbaddr Paddr, uint32_t* Buffer, int Number); void GetDwords(xbaddr Paddr, uint32_t* Buffer, int Number); void GetWords(xbaddr Paddr, uint16_t* Buffer, int Number); void WriteWords(xbaddr Paddr, uint16_t* Buffer, int Number); + +// Calculate a struct base address from a pointer to a member of it +#ifndef container_of +#define container_of(address, type, field) ((type *)( \ + (int8_t*)(address) - \ + (uint32_t)(&((type *)0)->field))) +#endif #endif diff --git a/src/devices/Xbox.h b/src/devices/Xbox.h index 0be572227..11b0cb442 100644 --- a/src/devices/Xbox.h +++ b/src/devices/Xbox.h @@ -43,7 +43,7 @@ #include "EmuNVNet.h" // For NVNetDevice #include "ADM1032Device.h" // For ADM1032 #include "devices\video\nv2a.h" // For NV2ADevice -#include "USBController\USBDevice.h" // For USBDevice +#include "Usb\USBDevice.h" // For USBDevice #define SMBUS_ADDRESS_MCPX 0x10 // = Write; Read = 0x11 #define SMBUS_ADDRESS_TV_ENCODER 0x88 // = Write; Read = 0x89 diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index 49b70931c..40d4bb4d5 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -34,17 +34,47 @@ // * // ****************************************************************** +#include "OHCI.h" #include "Hub.h" +#define NUM_PORTS 8 + + +// To avoid including Xbox.h +extern USBDevice* g_USB0; +extern USBDevice* g_USB1; + +// This array is used to translate an xbox player to the corresponding usb port +// The port associations are taken from XQEMU +int PlayerToUsbArray[] = { + -1, + 3, + 4, + 1, + 2, +}; + +struct USBHubPort { + USBPort port; // downstream ports of the hub + uint16_t wPortStatus; + uint16_t wPortChange; +}; + +struct USBHubState { + XboxDeviceState dev; + USBEndpoint* intr; + USBHubPort ports[NUM_PORTS]; +}; USBDescIface::USBDescIface(bool bDefault) { std::memset(this, 0, sizeof(USBDescIface)); if (bDefault) { + descs = new USBDescOther(); + eps = new USBDescEndpoint(); bInterfaceNumber = 0; bNumEndpoints = 1; bInterfaceClass = USB_CLASS_HUB; - eps = new USBDescEndpoint(); eps->bEndpointAddress = USB_DIR_IN | 0x01; eps->bmAttributes = USB_ENDPOINT_XFER_INT; eps->wMaxPacketSize = 1 + (NUM_PORTS + 7) / 8; @@ -52,50 +82,64 @@ USBDescIface::USBDescIface(bool bDefault) } } -USBDescIface::~USBDescIface() { delete eps; } +USBDescIface::~USBDescIface() +{ + delete descs; + delete eps; +} static const USBDescIface desc_iface_hub(true); -USBDescDevice::USBDescDevice() +USBDescDevice::USBDescDevice(bool bDefault) { std::memset(this, 0, sizeof(USBDescDevice)); - bcdUSB = 0x0110; - bDeviceClass = USB_CLASS_HUB; - bMaxPacketSize0 = 8; - bNumConfigurations = 1; - confs->bNumInterfaces = 1; - confs->bConfigurationValue = 1; - confs->bmAttributes = 0xE0; - confs->nif = 1; - confs->ifs = &desc_iface_hub; + if (bDefault) { + USBDescConfig* pUSBDescConfig = new USBDescConfig(); + bcdUSB = 0x0110; + bDeviceClass = USB_CLASS_HUB; + bMaxPacketSize0 = 8; + bNumConfigurations = 1; + pUSBDescConfig->bNumInterfaces = 1; + pUSBDescConfig->bConfigurationValue = 1; + pUSBDescConfig->bmAttributes = 0xE0; + pUSBDescConfig->nif = 1; + pUSBDescConfig->ifs = &desc_iface_hub; + confs = pUSBDescConfig; + } } -static const USBDescStrings desc_strings = { - [STR_MANUFACTURER] = "Cxbx-Reloaded", - [STR_PRODUCT] = "Cxbx-Reloaded USB Hub", - [STR_SERIALNUMBER] = "314159", -}; +USBDescDevice::~USBDescDevice() { delete confs; } -static const USBDesc desc_hub = { - id.idVendor = 0x0409, - id.idProduct = 0x55AA, - id.bcdDevice = 0x0101, - id.iManufacturer = STR_MANUFACTURER, - id.iProduct = STR_PRODUCT, - id.iSerialNumber = STR_SERIALNUMBER, - full = &desc_device_hub, - str = desc_strings, -}; +static const USBDescDevice desc_device_hub(true); -void Hub::Init() +static USBDescStrings desc_strings = { nullptr, "Cxbx-Reloaded", "Cxbx-Reloaded USB Hub", "314159" }; + +USBDesc::USBDesc(bool bDefault) +{ + std::memset(this, 0, sizeof(USBDesc)); + if (bDefault) { + id.idVendor = 0x0409; + id.idProduct = 0x55AA; + id.bcdDevice = 0x0101; + id.iManufacturer = STR_MANUFACTURER; + id.iProduct = STR_PRODUCT; + id.iSerialNumber = STR_SERIALNUMBER; + full = &desc_device_hub; + str = desc_strings; + } +} + +static const USBDesc desc_hub(true); + +int Hub::Init(int pport) { ClassInitFn(); UsbEpInit(); - rc = usb_claim_port(dev); + int rc = UsbClaimPort(pport); if (rc != 0) { return rc; } - rc = usb_device_init(dev); + rc = m_UsbDev->USB_DeviceInit(m_pDeviceStruct); if (rc != 0) { usb_release_port(dev); return rc; @@ -109,14 +153,28 @@ void Hub::Init() } } +Hub::~Hub() +{ + HubCleanUp(); +} + +void Hub::HubCleanUp() +{ + delete m_pPeripheralFuncStruct; + delete m_pDeviceStruct; + m_pPeripheralFuncStruct = nullptr; + m_pDeviceStruct = nullptr; +} + void Hub::ClassInitFn() { - //DeviceClass *dc = DEVICE_CLASS(klass); - m_pPeripheralFuncStruct = new USBDeviceClass; - m_pDeviceStruct = new XboxDevice; + m_pPeripheralFuncStruct = new USBDeviceClass(); + m_HubState = new USBHubState(); + m_pDeviceStruct = &m_HubState->dev; m_pDeviceStruct->ProductDesc = "Cxbx-Reloaded USB Hub"; QLIST_INIT(&m_pDeviceStruct->Strings); + m_pDeviceStruct->klass = m_pPeripheralFuncStruct; { using namespace std::placeholders; @@ -130,10 +188,6 @@ void Hub::ClassInitFn() m_pPeripheralFuncStruct->product_desc = m_pDeviceStruct->ProductDesc.c_str(); m_pPeripheralFuncStruct->usb_desc = &desc_hub; } - - //set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); - //dc->fw_name = "hub"; - //dc->vmsd = &vmstate_usb_hub; } void Hub::UsbEpInit() @@ -148,28 +202,137 @@ void Hub::UsbEpInit() void Hub::UsbEpReset() { - int ep; - - dev->EP_ctl.Num = 0; - dev->EP_ctl.Type = USB_ENDPOINT_XFER_CONTROL; - dev->EP_ctl.ifnum = 0; - dev->EP_ctl.max_packet_size = 64; - dev->EP_ctl.dev = dev; - dev->EP_ctl.pipeline = false; - for (ep = 0; ep < USB_MAX_ENDPOINTS; ep++) { - dev->ep_in[ep].Num = ep + 1; - dev->ep_out[ep].Num = ep + 1; - dev->ep_in[ep].pid = USB_TOKEN_IN; - dev->ep_out[ep].pid = USB_TOKEN_OUT; - dev->ep_in[ep].Type = USB_ENDPOINT_XFER_INVALID; - dev->ep_out[ep].Type = USB_ENDPOINT_XFER_INVALID; - dev->ep_in[ep].ifnum = USB_INTERFACE_INVALID; - dev->ep_out[ep].ifnum = USB_INTERFACE_INVALID; - dev->ep_in[ep].max_packet_size = 0; - dev->ep_out[ep].max_packet_size = 0; - dev->ep_in[ep].dev = dev; - dev->ep_out[ep].dev = dev; - dev->ep_in[ep].pipeline = false; - dev->ep_out[ep].pipeline = false; + m_pDeviceStruct->EP_ctl.Num = 0; + m_pDeviceStruct->EP_ctl.Type = USB_ENDPOINT_XFER_CONTROL; + m_pDeviceStruct->EP_ctl.IfNum = 0; + m_pDeviceStruct->EP_ctl.MaxPacketSize = 64; + m_pDeviceStruct->EP_ctl.Dev = m_pDeviceStruct; + m_pDeviceStruct->EP_ctl.Pipeline = false; + for (int ep = 0; ep < USB_MAX_ENDPOINTS; ep++) { + m_pDeviceStruct->EP_in[ep].Num = ep + 1; + m_pDeviceStruct->EP_out[ep].Num = ep + 1; + m_pDeviceStruct->EP_in[ep].pid = USB_TOKEN_IN; + m_pDeviceStruct->EP_out[ep].pid = USB_TOKEN_OUT; + m_pDeviceStruct->EP_in[ep].Type = USB_ENDPOINT_XFER_INVALID; + m_pDeviceStruct->EP_out[ep].Type = USB_ENDPOINT_XFER_INVALID; + m_pDeviceStruct->EP_in[ep].IfNum = USB_INTERFACE_INVALID; + m_pDeviceStruct->EP_out[ep].IfNum = USB_INTERFACE_INVALID; + m_pDeviceStruct->EP_in[ep].MaxPacketSize = 0; + m_pDeviceStruct->EP_out[ep].MaxPacketSize = 0; + m_pDeviceStruct->EP_in[ep].Dev = m_pDeviceStruct; + m_pDeviceStruct->EP_out[ep].Dev = m_pDeviceStruct; + m_pDeviceStruct->EP_in[ep].Pipeline = false; + m_pDeviceStruct->EP_out[ep].Pipeline = false; } } + +int Hub::UsbClaimPort(int pport) +{ + USBPort* port; + int usb_port; + + assert(m_pDeviceStruct->Port == nullptr); + + if (pport > 4 || pport < 1) { return -1; }; + + usb_port = PlayerToUsbArray[pport]; + if (usb_port > 2) { + m_UsbDev = g_USB0; + m_UsbDev->m_HostController->OHCI_AssignUsbPortStruct(usb_port - 3, m_pDeviceStruct); + } + else { + m_UsbDev = g_USB1; + m_UsbDev->m_HostController->OHCI_AssignUsbPortStruct(usb_port - 1, m_pDeviceStruct); + } + + return 0; +} + +int Hub::UsbHub_Initfn(XboxDeviceState* dev) +{ + USBHubState* s = container_of(dev, USBHubState, dev); + USBHubPort *port; + int i; + + if (dev->Port->HubCount == 5) { + DbgPrintf("Hub: chain too deep"); + return -1; + } + + usb_desc_create_serial(dev); + usb_desc_init(dev); + s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1); + for (i = 0; i < NUM_PORTS; i++) { + port = &s->ports[i]; + usb_register_port(usb_bus_from_device(dev), + &port->port, s, i, &usb_hub_port_ops, + USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); + usb_port_location(&port->port, dev->port, i + 1); + } + usb_hub_handle_reset(dev); + return 0; +} + +/* +* This function creates a serial number for a usb device. +* The serial number should: +* (a) Be unique within the emulator. +* (b) Be constant, so you don't get a new one each +* time the guest is started. +* So we are using the physical location to generate a serial number +* from it. It has three pieces: First a fixed, device-specific +* prefix. Second the device path of the host controller (which is +* the pci address in most cases). Third the physical port path. +* Results in serial numbers like this: "314159-0000:00:1d.7-3". +*/ +void Hub::CreateSerial(XboxDeviceState* dev) +{ + DeviceState *hcd = dev->qdev.parent_bus->parent; + const USBDesc* desc = GetUsbDeviceDesc(dev); + int index = desc->id.iSerialNumber; + char serial[64]; + char* path; + int dst; + + if (dev->serial) { + /* 'serial' usb bus property has priority if present */ + usb_desc_set_string(dev, index, dev->serial); + return; + } + + assert(index != 0 && desc->str[index] != NULL); + dst = snprintf(serial, sizeof(serial), "%s", desc->str[index]); + path = qdev_get_dev_path(hcd); + if (path) { + dst += snprintf(serial + dst, sizeof(serial) - dst, "-%s", path); + } + dst += snprintf(serial + dst, sizeof(serial) - dst, "-%s", dev->port->path); + usb_desc_set_string(dev, index, serial); +} + +const USBDesc* Hub::GetUsbDeviceDesc(XboxDeviceState* dev) +{ + USBDeviceClass* klass = dev->klass; + if (dev->usb_desc) { + return dev->usb_desc; + } + return klass->usb_desc; +} + +void usb_desc_set_string(USBDevice *dev, uint8_t index, const char *str) +{ + USBDescString *s; + + QLIST_FOREACH(s, &dev->strings, next) { + if (s->index == index) { + break; + } + } + if (s == NULL) { + s = g_malloc0(sizeof(*s)); + s->index = index; + QLIST_INSERT_HEAD(&dev->strings, s, next); + } + g_free(s->str); + s->str = g_strdup(str); +} diff --git a/src/devices/usb/Hub.h b/src/devices/usb/Hub.h index 00916f7ee..92d685871 100644 --- a/src/devices/usb/Hub.h +++ b/src/devices/usb/Hub.h @@ -34,11 +34,14 @@ // * // ****************************************************************** +#ifndef HUB_H_ +#define HUB_H_ + #include "UsbCommon.h" /* same as Linux kernel root hubs */ -typedef enum ft{ +typedef enum { STR_MANUFACTURER = 1, STR_PRODUCT, STR_SERIALNUMBER, @@ -50,22 +53,42 @@ class Hub final : public UsbPeripheral { public: // initialize this peripheral - void Init() override; + int Init(int pport) override; + // destructor + ~Hub(); private: + // usb device this hub is attached to + USBDevice* m_UsbDev = nullptr; + // hub state + USBHubState* m_HubState = nullptr; + // initialize various member variables/functions void ClassInitFn(); // see USBDeviceClass for comments about these functions - int UsbHub_Initfn(XboxDevice* dev); - XboxDevice* UsbHub_FindDevice(XboxDevice* dev, uint8_t addr); - void UsbHub_HandleReset(XboxDevice* dev); - void UsbHub_HandleControl(XboxDevice* dev, USBPacket* p, + int UsbHub_Initfn(XboxDeviceState* dev); + XboxDeviceState* UsbHub_FindDevice(XboxDeviceState* dev, uint8_t addr); + void UsbHub_HandleReset(XboxDeviceState* dev); + void UsbHub_HandleControl(XboxDeviceState* dev, USBPacket* p, int request, int value, int index, int length, uint8_t* data); - void UsbHub_HandleData(XboxDevice* dev, USBPacket* p); - void UsbHub_HandleDestroy(XboxDevice* dev); + void UsbHub_HandleData(XboxDeviceState* dev, USBPacket* p); + void UsbHub_HandleDestroy(XboxDeviceState* dev); + // TODO: perhaps these can be put in UsbPeripheral... // initialize the endpoints of this peripheral void UsbEpInit(); - // + // destroy hub + void HubCleanUp(); + // reset all endpoints of this peripheral void UsbEpReset(); -}; \ No newline at end of file + // attach this hub to a usb port + int UsbClaimPort(int port); + // get device descriptor + const USBDesc* GetUsbDeviceDesc(XboxDeviceState* dev); + // create a serial number for the device + void CreateSerial(XboxDeviceState* dev); +}; + +extern Hub* g_HubObjArray[4]; + +#endif diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index 4741035d1..a2f152b1c 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -281,7 +281,7 @@ void OHCI::OHCI_FrameBoundaryWorker() } if (m_DoneCount != 7 && m_DoneCount != 0) { - // decrease DelayInterrupt counter + // decrease Done Queue counter m_DoneCount--; } @@ -570,7 +570,7 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) int pid; int ret; int i; - XboxDevice* dev; + XboxDeviceState* dev; USBEndpoint* ep; OHCI_TD td; xbaddr addr; @@ -816,9 +816,9 @@ exit_no_retire: return OHCI_BM(td.Flags, TD_CC) != OHCI_CC_NOERROR; } -XboxDevice* OHCI::OHCI_FindDevice(uint8_t Addr) +XboxDeviceState* OHCI::OHCI_FindDevice(uint8_t Addr) { - XboxDevice* dev; + XboxDeviceState* dev; int i; for (i = 0; i < 2; i++) { @@ -1245,7 +1245,7 @@ uint32_t OHCI::OHCI_GetFrameRemaining() void OHCI::OHCI_StopEndpoints() { - XboxDevice* dev; + XboxDeviceState* dev; int i, j; for (i = 0; i < 2; i++) { @@ -1442,7 +1442,7 @@ void OHCI::OHCI_Attach(USBPort* Port) } } -void OHCI::OHCI_AsyncCancelDevice(XboxDevice* dev) +void OHCI::OHCI_AsyncCancelDevice(XboxDeviceState* dev) { if (m_AsyncTD && m_UsbDevice->USB_IsPacketInflight(&m_UsbPacket) && @@ -1485,7 +1485,7 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) int pid; int ret; int i; - XboxDevice* dev; + XboxDeviceState* dev; USBEndpoint* ep; OHCI_ISO_TD iso_td; uint32_t addr; @@ -1637,7 +1637,7 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) } else { // From the standard: "If, however, the data packet is the last in an Isochronous TD(R = FrameCount), - // then the value of BufferEnd is the address of the last byte in the buffer." + // then the value of BufferEnd is the address of the last byte in the buffer." end_addr = iso_td.BufferEnd; } @@ -1683,6 +1683,7 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) // From the standard: "After each data packet transfer, the Rth Offset is replaced with a value that indicates the status of // the data packet transfer.The upper 4 bits of the value are the ConditionCode for the transfer and the lower 12 bits // represent the size of the transfer.Together, these two fields constitute the Packet Status Word(PacketStatusWord)." + // Writeback if (dir == OHCI_TD_DIR_IN && ret >= 0 && ret <= len) { // IN transfer succeeded @@ -1747,3 +1748,9 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) } return 1; } + +void OHCI::OHCI_AssignUsbPortStruct(int port, XboxDeviceState* dev) +{ + dev->Port = &m_Registers.RhPort[port].UsbPort; + m_Registers.RhPort[port].UsbPort.Dev = dev; +} diff --git a/src/devices/usb/OHCI.h b/src/devices/usb/OHCI.h index 535d90ccb..98acc510d 100644 --- a/src/devices/usb/OHCI.h +++ b/src/devices/usb/OHCI.h @@ -40,10 +40,6 @@ #include "USBDevice.h" #include "..\CxbxKrnl\Timer.h" -#define USB_TOKEN_SETUP 0x2D -#define USB_TOKEN_IN 0x69 // device -> host -#define USB_TOKEN_OUT 0xE1 // host -> device - #define USB_RET_SUCCESS (0) #define USB_RET_NODEV (-1) #define USB_RET_NAK (-2) @@ -66,32 +62,29 @@ /* endpoint descriptor */ -typedef struct _OHCI_ED { +struct OHCI_ED { uint32_t Flags; uint32_t TailP; uint32_t HeadP; uint32_t NextED; -} -OHCI_ED; +}; /* general transfer descriptor */ -typedef struct _OHCI_TD { +struct OHCI_TD { uint32_t Flags; uint32_t CurrentBufferPointer; uint32_t NextTD; uint32_t BufferEnd; -} -OHCI_TD; +}; /* Isochronous transfer descriptor */ -typedef struct _OHCI_ISO_TD { +struct OHCI_ISO_TD { uint32_t Flags; uint32_t BufferPage0; uint32_t NextTD; uint32_t BufferEnd; uint16_t Offset[8]; -} -OHCI_ISO_TD; +}; /* enum indicating the current HC state */ typedef enum _OHCI_State @@ -104,24 +97,22 @@ typedef enum _OHCI_State OHCI_State; /* Host Controller Communications Area */ -typedef struct _OHCI_HCCA +struct OHCI_HCCA { uint32_t HccaInterrruptTable[32]; uint16_t HccaFrameNumber, HccaPad1; uint32_t HccaDoneHead; -} -OHCI_HCCA; +}; /* Small struct used to hold the HcRhPortStatus register and the usb port status */ -typedef struct _OHCIPort +struct OHCIPort { USBPort UsbPort; uint32_t HcRhPortStatus; -} -OHCIPort; +}; /* All these registers are well documented in the OHCI standard */ -typedef struct _OHCI_Registers +struct OHCI_Registers { // Control and Status partition uint32_t HcRevision; @@ -151,11 +142,9 @@ typedef struct _OHCI_Registers uint32_t HcRhDescriptorA; uint32_t HcRhDescriptorB; uint32_t HcRhStatus; - // ergo720: I have some doubts here. Both XQEMU and OpenXbox set 4 ports per HC, for a total of 8 usb ports. - // Could it be becasue each gamepad can host 2 memory units? + // For some reason, both XQEMU and OpenXbox set 4 ports per HC, for a total of 8 usb ports. OHCIPort RhPort[2]; // 2 ports per HC, for a total of 4 USB ports -} -OHCI_Registers; +}; /* OHCI class representing the state of the HC */ @@ -174,6 +163,8 @@ class OHCI void OHCI_Attach(USBPort* Port); // update ohci registers during a device detach void OHCI_Detach(USBPort* Port); + // update the USBPort struct with the device attached + void OHCI_AssignUsbPortStruct(int port, XboxDeviceState* dev); private: @@ -268,9 +259,9 @@ class OHCI // process an isochronous TD int OHCI_ServiceIsoTD(OHCI_ED* ed, int completion); // find the usb device with the supplied address - XboxDevice* OHCI::OHCI_FindDevice(uint8_t Addr); + XboxDeviceState* OHCI::OHCI_FindDevice(uint8_t Addr); // cancel a packet when a device is removed - void OHCI_AsyncCancelDevice(XboxDevice* dev); + void OHCI_AsyncCancelDevice(XboxDeviceState* dev); // Process Control and Bulk lists void OHCI_ProcessLists(int completion); }; diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index 8a1f2a9a1..03c10316b 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -38,15 +38,6 @@ #include "OHCI.h" #include "CxbxKrnl\EmuKrnl.h" // For EmuWarning -#define USB_ENDPOINT_XFER_CONTROL 0 -#define USB_ENDPOINT_XFER_ISOC 1 -#define USB_ENDPOINT_XFER_BULK 2 -#define USB_ENDPOINT_XFER_INT 3 -#define USB_ENDPOINT_XFER_INVALID 255 - -#define USB_DIR_OUT 0 -#define USB_DIR_IN 0x80 - #define SETUP_STATE_IDLE 0 #define SETUP_STATE_SETUP 1 #define SETUP_STATE_DATA 2 @@ -98,21 +89,13 @@ void USBDevice::USB_RegisterPort(USBPort* Port, int Index, int SpeedMask) Port->PortIndex = Index; Port->SpeedMask = SpeedMask; Port->HubCount = 0; + Port->Dev = nullptr; std::snprintf(Port->Path, sizeof(Port->Path), "%d", Index + 1); } -void USBDevice::USB_DeviceEPstopped(XboxDevice* Dev, USBEndpoint* EP) -{ - // This seems to be a nop in XQEMU since it doesn't assign the EP_Stopped function (it's nullptr) - USBDeviceClass* klass = USB_DEVICE_GET_CLASS(Dev); - if (klass->EP_Stopped) { - klass->EP_Stopped(Dev, EP); - } -} - void USBDevice::USB_PortReset(USBPort* Port) { - XboxDevice* dev = Port->Dev; + XboxDeviceState* dev = Port->Dev; assert(dev != nullptr); USB_Detach(Port); @@ -122,7 +105,7 @@ void USBDevice::USB_PortReset(USBPort* Port) void USBDevice::USB_Detach(USBPort* Port) { - XboxDevice* dev = Port->Dev; + XboxDeviceState* dev = Port->Dev; assert(dev != nullptr); assert(dev->State != USB_STATE_NOTATTACHED); @@ -132,7 +115,7 @@ void USBDevice::USB_Detach(USBPort* Port) void USBDevice::USB_Attach(USBPort* Port) { - XboxDevice *dev = Port->Dev; + XboxDeviceState *dev = Port->Dev; assert(dev != nullptr); assert(dev->Attached); @@ -142,7 +125,7 @@ void USBDevice::USB_Attach(USBPort* Port) usb_device_handle_attach(dev); } -void USBDevice::USB_DeviceReset(XboxDevice* dev) +void USBDevice::USB_DeviceReset(XboxDeviceState* dev) { if (dev == nullptr || !dev->Attached) { return; @@ -154,9 +137,9 @@ void USBDevice::USB_DeviceReset(XboxDevice* dev) usb_device_handle_reset(dev); } -XboxDevice* USBDevice::USB_FindDevice(USBPort* Port, uint8_t Addr) +XboxDeviceState* USBDevice::USB_FindDevice(USBPort* Port, uint8_t Addr) { - XboxDevice* dev = Port->Dev; + XboxDeviceState* dev = Port->Dev; if (dev == nullptr || !dev->Attached || dev->State != USB_STATE_DEFAULT) { return nullptr; @@ -168,17 +151,7 @@ XboxDevice* USBDevice::USB_FindDevice(USBPort* Port, uint8_t Addr) return USB_DeviceFindDevice(dev, Addr); } -XboxDevice* USBDevice::USB_DeviceFindDevice(XboxDevice* Dev, uint8_t Addr) -{ - USBDeviceClass *klass = USB_DEVICE_GET_CLASS(Dev); - if (klass->find_device) { - return klass->find_device(Dev, Addr); // TODO: usb_hub_find_device - } - - return nullptr; -} - -USBEndpoint* USBDevice::USB_GetEP(XboxDevice* Dev, int Pid, int Ep) +USBEndpoint* USBDevice::USB_GetEP(XboxDeviceState* Dev, int Pid, int Ep) { USBEndpoint* eps; @@ -224,7 +197,7 @@ void USBDevice::USB_PacketAddBuffer(USBPacket* p, void* ptr, size_t len) IoVecAdd(&p->IoVec, ptr, len); } -void USBDevice::USB_HandlePacket(XboxDevice* dev, USBPacket* p) +void USBDevice::USB_HandlePacket(XboxDeviceState* dev, USBPacket* p) { if (dev == nullptr) { p->Status = USB_RET_NODEV; @@ -289,7 +262,7 @@ void USBDevice::USB_PacketCheckState(USBPacket* p, USBPacketState expected) void USBDevice::USB_ProcessOne(USBPacket* p) { - XboxDevice* dev = p->Endpoint->Dev; + XboxDeviceState* dev = p->Endpoint->Dev; // Handlers expect status to be initialized to USB_RET_SUCCESS, but it // can be USB_RET_NAK here from a previous usb_process_one() call, @@ -323,7 +296,7 @@ void USBDevice::USB_ProcessOne(USBPacket* p) } } -void USBDevice::USB_DoParameter(XboxDevice* s, USBPacket* p) +void USBDevice::USB_DoParameter(XboxDeviceState* s, USBPacket* p) { int i, request, value, index; @@ -363,7 +336,7 @@ void USBDevice::USB_DoParameter(XboxDevice* s, USBPacket* p) } } -void USBDevice::USB_DoTokenSetup(XboxDevice* s, USBPacket* p) +void USBDevice::USB_DoTokenSetup(XboxDeviceState* s, USBPacket* p) { int request, value, index; @@ -421,7 +394,7 @@ void USBDevice::USB_DoTokenSetup(XboxDevice* s, USBPacket* p) p->ActualLength = 8; } -void USBDevice::DoTokenIn(XboxDevice* s, USBPacket* p) +void USBDevice::DoTokenIn(XboxDeviceState* s, USBPacket* p) { int request, value, index; @@ -465,7 +438,7 @@ void USBDevice::DoTokenIn(XboxDevice* s, USBPacket* p) } } -void USBDevice::DoTokenOut(XboxDevice* s, USBPacket* p) +void USBDevice::DoTokenOut(XboxDeviceState* s, USBPacket* p) { assert(p->ep->nr == 0); @@ -522,7 +495,17 @@ void USBDevice::USB_PacketCopy(USBPacket* p, void* ptr, size_t bytes) p->ActualLength += bytes; } -void USBDevice::USB_DeviceHandleControl(XboxDevice* dev, USBPacket* p, int request, int value, int index, int length, uint8_t* data) +int USBDevice::USB_DeviceInit(XboxDeviceState* dev) +{ + USBDeviceClass* klass = dev->klass; + if (klass->init) { + return klass->init(dev); + } + + return 0; +} + +void USBDevice::USB_DeviceHandleControl(XboxDeviceState* dev, USBPacket* p, int request, int value, int index, int length, uint8_t* data) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); if (klass->handle_control) { @@ -530,7 +513,7 @@ void USBDevice::USB_DeviceHandleControl(XboxDevice* dev, USBPacket* p, int reque } } -void USBDevice::USB_DeviceHandleData(XboxDevice* dev, USBPacket* p) +void USBDevice::USB_DeviceHandleData(XboxDeviceState* dev, USBPacket* p) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); if (klass->handle_data) { @@ -538,7 +521,7 @@ void USBDevice::USB_DeviceHandleData(XboxDevice* dev, USBPacket* p) } } -void USBDevice::USB_DeviceFlushEPqueue(XboxDevice* dev, USBEndpoint* ep) +void USBDevice::USB_DeviceFlushEPqueue(XboxDeviceState* dev, USBEndpoint* ep) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); if (klass->flush_ep_queue) { @@ -546,7 +529,7 @@ void USBDevice::USB_DeviceFlushEPqueue(XboxDevice* dev, USBEndpoint* ep) } } -void USBDevice::USB_DeviceCancelPacket(XboxDevice* dev, USBPacket* p) +void USBDevice::USB_DeviceCancelPacket(XboxDeviceState* dev, USBPacket* p) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); if (klass->cancel_packet) { @@ -554,6 +537,24 @@ void USBDevice::USB_DeviceCancelPacket(XboxDevice* dev, USBPacket* p) } } +XboxDeviceState* USBDevice::USB_DeviceFindDevice(XboxDeviceState* Dev, uint8_t Addr) +{ + USBDeviceClass *klass = USB_DEVICE_GET_CLASS(Dev); + if (klass->find_device) { + return klass->find_device(Dev, Addr); // TODO: usb_hub_find_device + } + + return nullptr; +} + +void USBDevice::USB_DeviceEPstopped(XboxDeviceState* Dev, USBEndpoint* EP) +{ + USBDeviceClass* klass = USB_DEVICE_GET_CLASS(Dev); + if (klass->ep_stopped) { + klass->ep_stopped(Dev, EP); + } +} + void USBDevice::USB_CancelPacket(USBPacket* p) { bool callback = (p->State == USB_PACKET_ASYNC); diff --git a/src/devices/usb/USBDevice.h b/src/devices/usb/USBDevice.h index a5206a018..2cb661698 100644 --- a/src/devices/usb/USBDevice.h +++ b/src/devices/usb/USBDevice.h @@ -68,7 +68,7 @@ class USBDevice : public PCIDevice { // register a port with the HC void USB_RegisterPort(USBPort* Port, int Index, int SpeedMask); // - void USB_DeviceEPstopped(XboxDevice* Dev, USBEndpoint* Ep); + void USB_DeviceEPstopped(XboxDeviceState* Dev, USBEndpoint* Ep); // reset a usb port void USB_PortReset(USBPort* Port); // a device is attched @@ -76,19 +76,19 @@ class USBDevice : public PCIDevice { // a device is detached void USB_Detach(USBPort* Port); // a device downstream from the device attached to the port (attached through a hub) is detached - void ChildDetach(USBPort* Port, XboxDevice* Child); + void ChildDetach(USBPort* Port, XboxDeviceState* Child); // TODO void Wakeup(USBPort* Port); // TODO void Complete(USBPort* Port, USBPacket *P); // reset a device - void USB_DeviceReset(XboxDevice* Dev); + void USB_DeviceReset(XboxDeviceState* Dev); // find the usb device with the supplied address - XboxDevice* USB_FindDevice(USBPort* Port, uint8_t Addr); + XboxDeviceState* USB_FindDevice(USBPort* Port, uint8_t Addr); // ergo720: can probably be removed by calling directly usb_hub_find_device - XboxDevice* USB_DeviceFindDevice(XboxDevice* Dev, uint8_t Addr); + XboxDeviceState* USB_DeviceFindDevice(XboxDeviceState* Dev, uint8_t Addr); // find the requested endpoint in the supplied device - USBEndpoint* USB_GetEP(XboxDevice* Dev, int Pid, int Ep); + USBEndpoint* USB_GetEP(XboxDeviceState* Dev, int Pid, int Ep); // setup a packet for transfer void USB_PacketSetup(USBPacket* p, int Pid, USBEndpoint* Ep, unsigned int Stream, uint64_t Id, bool ShortNotOK, bool IntReq); @@ -97,31 +97,33 @@ class USBDevice : public PCIDevice { // append the user buffer to the packet void USB_PacketAddBuffer(USBPacket* p, void* ptr, size_t len); // transfer and process the packet - void USB_HandlePacket(XboxDevice* dev, USBPacket* p); + void USB_HandlePacket(XboxDeviceState* dev, USBPacket* p); // check if the packet has the expected state and assert if not void USB_PacketCheckState(USBPacket* p, USBPacketState expected); // process the packet void USB_ProcessOne(USBPacket* p); // - void USB_DoParameter(XboxDevice* s, USBPacket* p); + void USB_DoParameter(XboxDeviceState* s, USBPacket* p); // process a setup token - void USB_DoTokenSetup(XboxDevice* s, USBPacket* p); + void USB_DoTokenSetup(XboxDeviceState* s, USBPacket* p); // process an input token - void DoTokenIn(XboxDevice* s, USBPacket* p); + void DoTokenIn(XboxDeviceState* s, USBPacket* p); // process an output token - void DoTokenOut(XboxDevice* s, USBPacket* p); + void DoTokenOut(XboxDeviceState* s, USBPacket* p); // copy the packet data to the buffer pointed to by ptr void USB_PacketCopy(USBPacket* p, void* ptr, size_t bytes); // queue a packet to an endpoint void USB_QueueOne(USBPacket* p); + // call usb class init function + int USB_DeviceInit(XboxDeviceState* dev); // - void USB_DeviceHandleControl(XboxDevice* dev, USBPacket* p, int request, int value, int index, int length, uint8_t* data); + void USB_DeviceHandleControl(XboxDeviceState* dev, USBPacket* p, int request, int value, int index, int length, uint8_t* data); // - void USB_DeviceHandleData(XboxDevice* dev, USBPacket* p); + void USB_DeviceHandleData(XboxDeviceState* dev, USBPacket* p); // - void USB_DeviceFlushEPqueue(XboxDevice* dev, USBEndpoint* ep); + void USB_DeviceFlushEPqueue(XboxDeviceState* dev, USBEndpoint* ep); // - void USB_DeviceCancelPacket(XboxDevice* dev, USBPacket* p); + void USB_DeviceCancelPacket(XboxDeviceState* dev, USBPacket* p); // Cancel an active packet. The packed must have been deferred by // returning USB_RET_ASYNC from handle_packet, and not yet completed void USB_CancelPacket(USBPacket* p); diff --git a/src/devices/usb/UsbCommon.h b/src/devices/usb/UsbCommon.h index f33ffe472..127f477d7 100644 --- a/src/devices/usb/UsbCommon.h +++ b/src/devices/usb/UsbCommon.h @@ -34,6 +34,9 @@ // * // ****************************************************************** +#ifndef USBCOMMON_H_ +#define USBCOMMON_H_ + #include "Cxbx.h" #include "..\devices\video\queue.h" #include @@ -45,6 +48,23 @@ #define USB_STATE_ATTACHED 1 #define USB_STATE_DEFAULT 2 +#define USB_CLASS_HUB 9 + +#define USB_ENDPOINT_XFER_CONTROL 0 +#define USB_ENDPOINT_XFER_ISOC 1 +#define USB_ENDPOINT_XFER_BULK 2 +#define USB_ENDPOINT_XFER_INT 3 +#define USB_ENDPOINT_XFER_INVALID 255 + +#define USB_INTERFACE_INVALID 255 + +#define USB_DIR_OUT 0 +#define USB_DIR_IN 0x80 + +#define USB_TOKEN_SETUP 0x2D +#define USB_TOKEN_IN 0x69 // device -> host +#define USB_TOKEN_OUT 0xE1 // host -> device + typedef enum USBPacketState { USB_PACKET_UNDEFINED = 0, @@ -56,17 +76,16 @@ typedef enum USBPacketState { } USBPacketState; -typedef struct _USBPacket USBPacket; -typedef struct _XboxDevice XboxDevice; +struct USBPacket; +struct XboxDeviceState; typedef const char* USBDescStrings[256]; -typedef struct _USBDescOther { +struct USBDescOther { uint8_t length; - const uint8_t *data; -} -USBDescOther; + const uint8_t* data; +}; -typedef struct _USBDescEndpoint { +struct USBDescEndpoint { uint8_t bEndpointAddress; uint8_t bmAttributes; uint16_t wMaxPacketSize; @@ -75,14 +94,13 @@ typedef struct _USBDescEndpoint { uint8_t bSynchAddress; uint8_t is_audio; /* has bRefresh + bSynchAddress */ - uint8_t *extra; + uint8_t* extra; /* superspeed endpoint companion */ uint8_t bMaxBurst; uint8_t bmAttributes_super; uint16_t wBytesPerInterval; -} -USBDescEndpoint; +}; struct USBDescIface { uint8_t bInterfaceNumber; @@ -101,7 +119,7 @@ struct USBDescIface { }; /* conceptually an Interface Association Descriptor, and releated interfaces */ -typedef struct _USBDescIfaceAssoc { +struct USBDescIfaceAssoc { uint8_t bFirstInterface; uint8_t bInterfaceCount; uint8_t bFunctionClass; @@ -111,10 +129,9 @@ typedef struct _USBDescIfaceAssoc { uint8_t nif; const USBDescIface* ifs; -} -USBDescIfaceAssoc; +}; -typedef struct _USBDescConfig { +struct USBDescConfig { uint8_t bNumInterfaces; uint8_t bConfigurationValue; uint8_t iConfiguration; @@ -128,8 +145,7 @@ typedef struct _USBDescConfig { /* "normal" interfaces */ uint8_t nif; const USBDescIface* ifs; -} -USBDescConfig; +}; struct USBDescDevice { uint16_t bcdUSB; @@ -139,50 +155,49 @@ struct USBDescDevice { uint8_t bMaxPacketSize0; uint8_t bNumConfigurations; const USBDescConfig* confs; - USBDescDevice(); + USBDescDevice(bool bDefault); + ~USBDescDevice(); }; -typedef struct _USBDescID { +struct USBDescID { uint16_t idVendor; uint16_t idProduct; uint16_t bcdDevice; uint8_t iManufacturer; uint8_t iProduct; - uint8_t iSerialNumber; -} -USBDescID; + uint8_t iSerialNumber; // index of string descriptor +}; -typedef struct _USBDesc { - USBDescID id; - const USBDescDevice* full; +/* Global USB Descriptor struct */ +struct USBDesc { + USBDescID id; // id-specific info of the device descriptor + const USBDescDevice* full; // remaining fields of the device descriptor const char* const* str; -} -USBDesc; + USBDesc(bool bDefault); +}; /* USB endpoint */ -typedef struct _USBEndpoint +struct USBEndpoint { uint8_t Num; // endpoint number uint8_t pid; uint8_t Type; // the type of this endpoint - uint8_t ifnum; - int max_packet_size; + uint8_t IfNum; // interface number this endpoint belongs to + int MaxPacketSize; bool Pipeline; bool Halted; // indicates that the endpoint is halted - XboxDevice* Dev; // device this endpoint belongs to - QTAILQ_HEAD(, _USBPacket) Queue; // queue of packets to this endpoint -} -USBEndpoint; + XboxDeviceState* Dev; // device this endpoint belongs to + QTAILQ_HEAD(, USBPacket) Queue; // queue of packets to this endpoint +}; /* definition of an Xbox usb device */ -typedef struct _XboxDevice +struct XboxDeviceState { - DeviceState qdev; - USBPort *port; - char *port_path; - char *serial; - void *opaque; + USBPort* Port; // usb port struct of this device + int PortPath; // port index to which this device is attached to + char* Serial; uint32_t flags; + USBDeviceClass* klass; // usb class struct of this device // Actual connected speed int speed; @@ -205,7 +220,7 @@ typedef struct _XboxDevice USBEndpoint EP_out[USB_MAX_ENDPOINTS]; // endpoints for IN tokens QLIST_HEAD(, USBDescString) Strings; - const USBDesc *usb_desc; // Overrides class usb_desc if not NULL + const USBDesc* usb_desc; // Overrides class usb_desc if not NULL const USBDescDevice *device; int configuration; @@ -213,18 +228,16 @@ typedef struct _XboxDevice int altsetting[USB_MAX_INTERFACES]; const USBDescConfig *config; const USBDescIface *ifaces[USB_MAX_INTERFACES]; -} -XboxDevice; +}; -typedef struct _USBCombinedPacket { - _USBPacket* First; - QTAILQ_HEAD(packets_head, _USBPacket) Packets; +struct USBCombinedPacket { + USBPacket* First; + QTAILQ_HEAD(packets_head, USBPacket) Packets; IOVector IoVec; -} -USBCombinedPacket; +}; /* Structure used to hold information about an active USB packet */ -struct _USBPacket +struct USBPacket { int Pid; // Packet ID (used to identify the type of packet that is being sent) uint32_t Id; // Paddr of the TD for this packet @@ -239,70 +252,67 @@ struct _USBPacket // Internal use by the USB layer USBPacketState State; USBCombinedPacket* Combined; - QTAILQ_ENTRY(_USBPacket) Queue; - QTAILQ_ENTRY(_USBPacket) CombinedEntry; + QTAILQ_ENTRY(USBPacket) Queue; + QTAILQ_ENTRY(USBPacket) CombinedEntry; }; /* Struct describing the status of a usb port */ -typedef struct _USBPort { - XboxDevice* Dev; // usb device (if present) +struct USBPort { + XboxDeviceState* Dev; // usb device (if present) int SpeedMask; // usb speeds supported int HubCount; // number of hubs attached char Path[16]; // the number of the port - int PortIndex; // internal port index - QTAILQ_ENTRY(_USBPort) Next; -} -USBPort; + int PortIndex; // internal port index against this HC +}; /* Struct which stores general functions/variables regarding the peripheral */ -typedef struct _USBDeviceClass +struct USBDeviceClass { - std::function init; + std::function init; // Walk (enabled) downstream ports, check for a matching device. // Only hubs implement this. - std::function find_device; + std::function find_device; // Called when a packet is canceled. - std::function cancel_packet; + std::function cancel_packet; // Called when device is destroyed. - std::function handle_destroy; + std::function handle_destroy; // Attach the device - std::function handle_attach; + std::function handle_attach; // Reset the device - std::function handle_reset; + std::function handle_reset; // Process control request. // Called from handle_packet(). // Status gets stored in p->status, and if p->status == USB_RET_SUCCESS // then the number of bytes transferred is stored in p->actual_length - std::function handle_control; // Process data transfers (both BULK and ISOC). // Called from handle_packet(). // Status gets stored in p->status, and if p->status == USB_RET_SUCCESS // then the number of bytes transferred is stored in p->actual_length - std::function handle_data; + std::function handle_data; - std::function set_interface; // Called when the hcd is done queuing packets for an endpoint, only // necessary for devices which can return USB_RET_ADD_TO_QUEUE. - std::function flush_ep_queue; + std::function flush_ep_queue; // Called by the hcd to let the device know the queue for an endpoint // has been unlinked / stopped. Optional may be NULL. - std::function EP_Stopped; + std::function ep_stopped; const char* product_desc; - const USBDesc* usb_desc; -} -USBDeviceClass; + const USBDesc* usb_desc; // device descriptor +}; /* Abstract class representing a usb peripheral */ @@ -310,8 +320,10 @@ class UsbPeripheral { protected: USBDeviceClass* m_pPeripheralFuncStruct; - XboxDevice* m_pDeviceStruct; + XboxDeviceState* m_pDeviceStruct; - virtual void Init() = 0; + virtual int Init(int pport) = 0; }; + +#endif From 0691b8bfb40fa9a37d54d87fb31b1f0d17a2159c Mon Sep 17 00:00:00 2001 From: ergo720 Date: Mon, 2 Jul 2018 01:35:24 +0200 Subject: [PATCH 0042/1000] More hub init + some refactoring --- build/win32/Cxbx.vcxproj | 4 +- build/win32/Cxbx.vcxproj.filters | 10 +- src/Common/{Cxbx.cpp => CxbxCommon.cpp} | 0 src/{Cxbx.h => CxbxCommon.h} | 0 src/CxbxKrnl/CxbxKrnl.h | 2 +- src/devices/usb/Hub.cpp | 187 +++++++++++++++++++----- src/devices/usb/Hub.h | 12 +- src/devices/usb/OHCI.cpp | 21 +-- src/devices/usb/OHCI.h | 1 - src/devices/usb/USBDevice.cpp | 2 + src/devices/usb/USBDevice.h | 4 +- src/devices/usb/UsbCommon.h | 117 ++++++++------- 12 files changed, 250 insertions(+), 110 deletions(-) rename src/Common/{Cxbx.cpp => CxbxCommon.cpp} (100%) rename src/{Cxbx.h => CxbxCommon.h} (100%) diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index 40b494cc5..3df1e1a94 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -295,7 +295,7 @@ - + @@ -420,7 +420,7 @@ - + diff --git a/build/win32/Cxbx.vcxproj.filters b/build/win32/Cxbx.vcxproj.filters index 3fe313af4..dd8666214 100644 --- a/build/win32/Cxbx.vcxproj.filters +++ b/build/win32/Cxbx.vcxproj.filters @@ -284,7 +284,6 @@ Emulator - GUI @@ -295,6 +294,9 @@ Hardware\Usb + + + GUI GUI @@ -343,9 +345,6 @@ Kernel - - Shared - Shared @@ -594,6 +593,9 @@ Hardware\Usb + + + Shared GUI diff --git a/src/Common/Cxbx.cpp b/src/Common/CxbxCommon.cpp similarity index 100% rename from src/Common/Cxbx.cpp rename to src/Common/CxbxCommon.cpp diff --git a/src/Cxbx.h b/src/CxbxCommon.h similarity index 100% rename from src/Cxbx.h rename to src/CxbxCommon.h diff --git a/src/CxbxKrnl/CxbxKrnl.h b/src/CxbxKrnl/CxbxKrnl.h index 9bf123098..e3542e86d 100644 --- a/src/CxbxKrnl/CxbxKrnl.h +++ b/src/CxbxKrnl/CxbxKrnl.h @@ -34,7 +34,7 @@ #ifndef CXBXKRNL_H #define CXBXKRNL_H -#include "Cxbx.h" +#include "CxbxCommon.h" #include "Common/Xbe.h" #undef FIELD_OFFSET // prevent macro redefinition warnings diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index 40d4bb4d5..f562b3991 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -36,6 +36,7 @@ #include "OHCI.h" #include "Hub.h" +#include "..\CxbxKrnl\EmuKrnl.h" // For EmuWarning #define NUM_PORTS 8 @@ -55,15 +56,15 @@ int PlayerToUsbArray[] = { }; struct USBHubPort { - USBPort port; // downstream ports of the hub + USBPort port; // downstream port status uint16_t wPortStatus; uint16_t wPortChange; }; struct USBHubState { - XboxDeviceState dev; + XboxDeviceState dev; // hub device status USBEndpoint* intr; - USBHubPort ports[NUM_PORTS]; + USBHubPort ports[NUM_PORTS]; // downstream ports of the hub }; USBDescIface::USBDescIface(bool bDefault) @@ -83,8 +84,12 @@ USBDescIface::USBDescIface(bool bDefault) } USBDescIface::~USBDescIface() -{ - delete descs; +{ + delete descs; // always one struct of this? + if (bNumEndpoints != 1) { + delete[] eps; + return; + } delete eps; } @@ -108,7 +113,14 @@ USBDescDevice::USBDescDevice(bool bDefault) } } -USBDescDevice::~USBDescDevice() { delete confs; } +USBDescDevice::~USBDescDevice() +{ + if (bNumConfigurations != 1) { + delete[] confs; + return; + } + delete confs; +} static const USBDescDevice desc_device_hub(true); @@ -255,12 +267,12 @@ int Hub::UsbHub_Initfn(XboxDeviceState* dev) int i; if (dev->Port->HubCount == 5) { - DbgPrintf("Hub: chain too deep"); + DbgPrintf("Hub: chain too deep\n"); return -1; } - usb_desc_create_serial(dev); - usb_desc_init(dev); + CreateSerial(dev); + UsbDescInit(dev); s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1); for (i = 0; i < NUM_PORTS; i++) { port = &s->ports[i]; @@ -274,6 +286,7 @@ int Hub::UsbHub_Initfn(XboxDeviceState* dev) } /* +* From XQEMU: * This function creates a serial number for a usb device. * The serial number should: * (a) Be unique within the emulator. @@ -287,52 +300,150 @@ int Hub::UsbHub_Initfn(XboxDeviceState* dev) */ void Hub::CreateSerial(XboxDeviceState* dev) { - DeviceState *hcd = dev->qdev.parent_bus->parent; const USBDesc* desc = GetUsbDeviceDesc(dev); int index = desc->id.iSerialNumber; + USBDescString* s; char serial[64]; char* path; int dst; - if (dev->serial) { - /* 'serial' usb bus property has priority if present */ - usb_desc_set_string(dev, index, dev->serial); - return; - } - assert(index != 0 && desc->str[index] != NULL); - dst = snprintf(serial, sizeof(serial), "%s", desc->str[index]); - path = qdev_get_dev_path(hcd); - if (path) { - dst += snprintf(serial + dst, sizeof(serial) - dst, "-%s", path); - } - dst += snprintf(serial + dst, sizeof(serial) - dst, "-%s", dev->port->path); - usb_desc_set_string(dev, index, serial); + dst = std::snprintf(serial, sizeof(serial), "%s", desc->str[index]); + dst += std::snprintf(serial + dst, sizeof(serial) - dst, "-%s", m_UsbDev->m_PciPath); + dst += std::snprintf(serial + dst, sizeof(serial) - dst, "-%s", dev->Port->Path); + + QLIST_FOREACH(s, &dev->Strings, next) { + if (s->index == index) { + break; + } + } + + if (s == nullptr) { + s = new USBDescString; + s->index = index; + QLIST_INSERT_HEAD(&dev->Strings, s, next); + } + + s->str = serial; } const USBDesc* Hub::GetUsbDeviceDesc(XboxDeviceState* dev) { USBDeviceClass* klass = dev->klass; - if (dev->usb_desc) { - return dev->usb_desc; + if (dev->UsbDesc) { + return dev->UsbDesc; } return klass->usb_desc; } - -void usb_desc_set_string(USBDevice *dev, uint8_t index, const char *str) -{ - USBDescString *s; - QLIST_FOREACH(s, &dev->strings, next) { - if (s->index == index) { +void Hub::UsbDescInit(XboxDeviceState* dev) +{ + const USBDesc* desc = GetUsbDeviceDesc(dev); + + assert(desc != NULL); + dev->Speed = USB_SPEED_FULL; + dev->SpeedMask = 0; + if (desc->full) { + dev->SpeedMask |= USB_SPEED_MASK_FULL; + } + UsbDescSetDefaults(dev); +} + +void Hub::UsbDescSetDefaults(XboxDeviceState* dev) +{ + const USBDesc *desc = GetUsbDeviceDesc(dev); + + assert(desc != NULL); + switch (dev->Speed) { + case USB_SPEED_LOW: + case USB_SPEED_FULL: { + dev->Device = desc->full; break; } + default: + EmuWarning("Unknown speed parameter %d set in %s", dev->ProductDesc.c_str()); } - if (s == NULL) { - s = g_malloc0(sizeof(*s)); - s->index = index; - QLIST_INSERT_HEAD(&dev->strings, s, next); - } - g_free(s->str); - s->str = g_strdup(str); + UsbDescSetConfig(dev, 0); } + +int Hub::UsbDescSetConfig(XboxDeviceState* dev, int value) +{ + int i; + + if (value == 0) { // default configuration + dev->Configuration = 0; + dev->NumInterfaces = 0; + dev->Config = nullptr; + } + else { + for (i = 0; i < dev->Device->bNumConfigurations; i++) { // select the configuration specified + if (dev->Device->confs[i].bConfigurationValue == value) { + dev->Configuration = value; + dev->NumInterfaces = dev->Device->confs[i].bNumInterfaces; + dev->Config = dev->Device->confs + i; + assert(dev->NumInterfaces <= USB_MAX_INTERFACES); + } + } + if (i < dev->Device->bNumConfigurations) { + return -1; + } + } + + for (i = 0; i < dev->NumInterfaces; i++) { // setup all interfaces for the selected configuration + UsbDescSetInterface(dev, i, 0); + } + for (; i < USB_MAX_INTERFACES; i++) { // null the remaining interfaces + dev->AltSetting[i] = 0; + dev->Ifaces[i] = nullptr; + } + + return 0; +} + +int Hub::UsbDescSetInterface(XboxDeviceState* dev, int index, int value) +{ + const USBDescIface* iface; + int old; + + iface = UsbDescFindInterface(dev, index, value); + if (iface == NULL) { + return -1; + } + + old = dev->altsetting[index]; + dev->altsetting[index] = value; + dev->ifaces[index] = iface; + usb_desc_ep_init(dev); + + if (old != value) { + usb_device_set_interface(dev, index, old, value); + } + return 0; +} + +const USBDescIface* Hub::UsbDescFindInterface(XboxDeviceState* dev, int nif, int alt) +{ + const USBDescIface* iface; + int g, i; + + if (!dev->Config) { // no configuration descriptor here, nothing to search + return nullptr; + } + for (g = 0; g < dev->Config->nif_groups; g++) { + for (i = 0; i < dev->config->if_groups[g].nif; i++) { + iface = &dev->config->if_groups[g].ifs[i]; + if (iface->bInterfaceNumber == nif && + iface->bAlternateSetting == alt) { + return iface; + } + } + } + for (i = 0; i < dev->config->nif; i++) { + iface = &dev->config->ifs[i]; + if (iface->bInterfaceNumber == nif && + iface->bAlternateSetting == alt) { + return iface; + } + } + return NULL; +} diff --git a/src/devices/usb/Hub.h b/src/devices/usb/Hub.h index 92d685871..001be4a39 100644 --- a/src/devices/usb/Hub.h +++ b/src/devices/usb/Hub.h @@ -74,7 +74,7 @@ class Hub final : public UsbPeripheral int request, int value, int index, int length, uint8_t* data); void UsbHub_HandleData(XboxDeviceState* dev, USBPacket* p); void UsbHub_HandleDestroy(XboxDeviceState* dev); - // TODO: perhaps these can be put in UsbPeripheral... + // TODO: perhaps these can be put in UsbPeripheral or USBDevice... // initialize the endpoints of this peripheral void UsbEpInit(); // destroy hub @@ -87,6 +87,16 @@ class Hub final : public UsbPeripheral const USBDesc* GetUsbDeviceDesc(XboxDeviceState* dev); // create a serial number for the device void CreateSerial(XboxDeviceState* dev); + // + void UsbDescInit(XboxDeviceState* dev); + // + void UsbDescSetDefaults(XboxDeviceState* dev); + // + int UsbDescSetConfig(XboxDeviceState* dev, int value); + // + int UsbDescSetInterface(XboxDeviceState* dev, int index, int value); + // + const USBDescIface* UsbDescFindInterface(XboxDeviceState* dev, int nif, int alt); }; extern Hub* g_HubObjArray[4]; diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index a2f152b1c..1d8c15728 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -178,30 +178,25 @@ #define USB_HZ 12000000 -#define USB_SPEED_LOW 0 -#define USB_SPEED_FULL 1 - #define USUB(a, b) ((int16_t)((uint16_t)(a) - (uint16_t)(b))) #define OHCI_PAGE_MASK 0xFFFFF000 #define OHCI_OFFSET_MASK 0xFFF -typedef enum _USB_SPEED -{ - USB_SPEED_MASK_LOW = 1 << 0, - USB_SPEED_MASK_FULL = 1 << 1, -} -USB_SPEED; - - OHCI::OHCI(int Irq, USBDevice* UsbObj) { + int offset = 0; + m_IrqNum = Irq; m_UsbDevice = UsbObj; + if (m_IrqNum == 9) { + offset = 2; + } + for (int i = 0; i < 2; i++) { - m_UsbDevice->USB_RegisterPort(&m_Registers.RhPort[i].UsbPort, i, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); + m_UsbDevice->USB_RegisterPort(&m_Registers.RhPort[i].UsbPort, i + offset, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); } OHCI_PacketInit(&m_UsbPacket); @@ -1423,7 +1418,7 @@ void OHCI::OHCI_Attach(USBPort* Port) port->HcRhPortStatus |= OHCI_PORT_CCS | OHCI_PORT_CSC; // update speed - if (port->UsbPort.Dev->speed == USB_SPEED_LOW) { + if (port->UsbPort.Dev->Speed == USB_SPEED_LOW) { port->HcRhPortStatus |= OHCI_PORT_LSDA; } else { diff --git a/src/devices/usb/OHCI.h b/src/devices/usb/OHCI.h index 98acc510d..0a7d0ad56 100644 --- a/src/devices/usb/OHCI.h +++ b/src/devices/usb/OHCI.h @@ -142,7 +142,6 @@ struct OHCI_Registers uint32_t HcRhDescriptorA; uint32_t HcRhDescriptorB; uint32_t HcRhStatus; - // For some reason, both XQEMU and OpenXbox set 4 ports per HC, for a total of 8 usb ports. OHCIPort RhPort[2]; // 2 ports per HC, for a total of 4 USB ports }; diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index 03c10316b..e91c1143c 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -60,10 +60,12 @@ void USBDevice::Init(unsigned int address) if (address == USB0_BASE) { m_HostController = new OHCI(1, this); + m_PciPath = "pci.0:02.0"; return; } m_HostController = new OHCI(9, this); + m_PciPath = "pci.0:03.0"; } uint32_t USBDevice::MMIORead(int barIndex, uint32_t addr, unsigned size) diff --git a/src/devices/usb/USBDevice.h b/src/devices/usb/USBDevice.h index 2cb661698..0343134ce 100644 --- a/src/devices/usb/USBDevice.h +++ b/src/devices/usb/USBDevice.h @@ -63,7 +63,9 @@ class USBDevice : public PCIDevice { // USBDevice-specific functions/variables // pointer to the host controller this device refers to - OHCI* m_HostController = nullptr; + OHCI* m_HostController; + // PCI path of this usb device + const char* m_PciPath; // register a port with the HC void USB_RegisterPort(USBPort* Port, int Index, int SpeedMask); diff --git a/src/devices/usb/UsbCommon.h b/src/devices/usb/UsbCommon.h index 127f477d7..057c3872d 100644 --- a/src/devices/usb/UsbCommon.h +++ b/src/devices/usb/UsbCommon.h @@ -37,7 +37,7 @@ #ifndef USBCOMMON_H_ #define USBCOMMON_H_ -#include "Cxbx.h" +#include "CxbxCommon.h" #include "..\devices\video\queue.h" #include @@ -65,6 +65,16 @@ #define USB_TOKEN_IN 0x69 // device -> host #define USB_TOKEN_OUT 0xE1 // host -> device +#define USB_SPEED_LOW 0 +#define USB_SPEED_FULL 1 + + +typedef enum _USB_SPEED +{ + USB_SPEED_MASK_LOW = 1 << 0, + USB_SPEED_MASK_FULL = 1 << 1, +} +USB_SPEED; typedef enum USBPacketState { USB_PACKET_UNDEFINED = 0, @@ -80,6 +90,13 @@ struct USBPacket; struct XboxDeviceState; typedef const char* USBDescStrings[256]; +/* String descriptor */ +struct USBDescString { + uint8_t index; // index of this string descriptor + std::string str; // the string of this string descriptor + QLIST_ENTRY(USBDescString) next; +}; + struct USBDescOther { uint8_t length; const uint8_t* data; @@ -102,14 +119,15 @@ struct USBDescEndpoint { uint16_t wBytesPerInterval; }; +/* Interface descriptor */ struct USBDescIface { - uint8_t bInterfaceNumber; - uint8_t bAlternateSetting; - uint8_t bNumEndpoints; - uint8_t bInterfaceClass; - uint8_t bInterfaceSubClass; - uint8_t bInterfaceProtocol; - uint8_t iInterface; + uint8_t bInterfaceNumber; // number of interface + uint8_t bAlternateSetting; // value used to select the alternate setting for the interface identified by bInterfaceNumber + uint8_t bNumEndpoints; // number of endpoints used by this interface (excluding endpoint zero) + uint8_t bInterfaceClass; // class code (assigned by the USB) + uint8_t bInterfaceSubClass; // subclass code (assigned by the USB) + uint8_t bInterfaceProtocol; // protocol code (assigned by the USB) + uint8_t iInterface; // index of string descriptor describing this interface uint8_t ndesc; USBDescOther* descs; @@ -131,12 +149,13 @@ struct USBDescIfaceAssoc { const USBDescIface* ifs; }; +/* Configuration descriptor */ struct USBDescConfig { - uint8_t bNumInterfaces; - uint8_t bConfigurationValue; - uint8_t iConfiguration; - uint8_t bmAttributes; - uint8_t bMaxPower; + uint8_t bNumInterfaces; // number of interfaces supported by this configuration + uint8_t bConfigurationValue; // value to use as an argument to the SetConfiguration() request to select this configuration + uint8_t iConfiguration; // index of string descriptor describing this configuration + uint8_t bmAttributes; // configuration characteristics + uint8_t bMaxPower; // maximum power consumption of the USB device in this configuration expressed in 2mA units /* grouped interfaces */ uint8_t nif_groups; @@ -147,25 +166,27 @@ struct USBDescConfig { const USBDescIface* ifs; }; +/* Device descriptor part 1 */ struct USBDescDevice { - uint16_t bcdUSB; - uint8_t bDeviceClass; - uint8_t bDeviceSubClass; - uint8_t bDeviceProtocol; - uint8_t bMaxPacketSize0; - uint8_t bNumConfigurations; - const USBDescConfig* confs; + uint16_t bcdUSB; // USB Specification Release Number in Binary-Coded Decimal (i.e., 2.10 is 210H) + uint8_t bDeviceClass; // class code (assigned by the USB) + uint8_t bDeviceSubClass; // subclass code (assigned by the USB) + uint8_t bDeviceProtocol; // protocol code (assigned by the USB) + uint8_t bMaxPacketSize0; // maximum packet size for endpoint zero (only 8, 16, 32, or 64 are valid) + uint8_t bNumConfigurations; // number of possible configurations + const USBDescConfig* confs; // configuration descriptor in use USBDescDevice(bool bDefault); ~USBDescDevice(); }; +/* Device descriptor part 2 */ struct USBDescID { - uint16_t idVendor; - uint16_t idProduct; - uint16_t bcdDevice; - uint8_t iManufacturer; - uint8_t iProduct; - uint8_t iSerialNumber; // index of string descriptor + uint16_t idVendor; // vendor ID (assigned by the USB) + uint16_t idProduct; // product ID (assigned by the manufacturer) + uint16_t bcdDevice; // device release number in binary-coded decimal + uint8_t iManufacturer; // index of string descriptor describing manufacturer + uint8_t iProduct; // index of string descriptor describing product + uint8_t iSerialNumber; // index of string descriptor describing the device’s serial number }; /* Global USB Descriptor struct */ @@ -186,23 +207,21 @@ struct USBEndpoint int MaxPacketSize; bool Pipeline; bool Halted; // indicates that the endpoint is halted - XboxDeviceState* Dev; // device this endpoint belongs to - QTAILQ_HEAD(, USBPacket) Queue; // queue of packets to this endpoint + XboxDeviceState* Dev; // device this endpoint belongs to + QTAILQ_HEAD(, USBPacket) Queue; // queue of packets to this endpoint }; /* definition of an Xbox usb device */ struct XboxDeviceState { - USBPort* Port; // usb port struct of this device - int PortPath; // port index to which this device is attached to - char* Serial; - uint32_t flags; - USBDeviceClass* klass; // usb class struct of this device - - // Actual connected speed - int speed; - // Supported speeds, not in info because it may be variable (hostdevs) - int speedmask; + USBPort* Port; // usb port struct of this device + int PortPath; // port index to which this device is attached to + char* Serial; + uint32_t flags; + USBDeviceClass* klass; // usb class struct of this device + + int Speed; // actual connected speed + int SpeedMask; // supported speeds, not in info because it may be variable (hostdevs) uint8_t Addr; // device function address std::string ProductDesc; // the friendly name of this device int Attached; // device is attached @@ -219,15 +238,15 @@ struct XboxDeviceState USBEndpoint EP_in[USB_MAX_ENDPOINTS]; // endpoints for OUT tokens USBEndpoint EP_out[USB_MAX_ENDPOINTS]; // endpoints for IN tokens - QLIST_HEAD(, USBDescString) Strings; - const USBDesc* usb_desc; // Overrides class usb_desc if not NULL - const USBDescDevice *device; + QLIST_HEAD(, USBDescString) Strings; // strings of the string descriptor + const USBDesc* UsbDesc; // Overrides class usb_desc if not NULL + const USBDescDevice* Device; // device descriptor part 1 - int configuration; - int ninterfaces; - int altsetting[USB_MAX_INTERFACES]; - const USBDescConfig *config; - const USBDescIface *ifaces[USB_MAX_INTERFACES]; + int Configuration; // number of the selected configuration descriptor + int NumInterfaces; // number of available interface descriptors + int AltSetting[USB_MAX_INTERFACES]; // + const USBDescConfig* Config; // configuration descriptor in use + const USBDescIface* Ifaces[USB_MAX_INTERFACES]; }; struct USBCombinedPacket { @@ -260,8 +279,8 @@ struct USBPacket struct USBPort { XboxDeviceState* Dev; // usb device (if present) int SpeedMask; // usb speeds supported - int HubCount; // number of hubs attached - char Path[16]; // the number of the port + int HubCount; // number of hubs chained + char Path[16]; // the number of the port + 1, used to create a serial number for this device int PortIndex; // internal port index against this HC }; @@ -310,7 +329,7 @@ struct USBDeviceClass // has been unlinked / stopped. Optional may be NULL. std::function ep_stopped; - const char* product_desc; + const char* product_desc; // friendly name of the device const USBDesc* usb_desc; // device descriptor }; From 13b20e6741c8692254cc5598bc72682fe747bd4e Mon Sep 17 00:00:00 2001 From: ergo720 Date: Mon, 2 Jul 2018 22:15:39 +0200 Subject: [PATCH 0043/1000] small OHCI stuff + almost done with Hub initialization --- src/devices/usb/Hub.cpp | 132 ++++++++++++++++++++++++---------- src/devices/usb/Hub.h | 18 +++-- src/devices/usb/OHCI.cpp | 50 ++++++++++++- src/devices/usb/OHCI.h | 10 +-- src/devices/usb/USBDevice.cpp | 82 +++++++++++++++------ src/devices/usb/USBDevice.h | 33 ++++++--- src/devices/usb/UsbCommon.h | 92 ++++++++++++------------ 7 files changed, 289 insertions(+), 128 deletions(-) diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index f562b3991..e9a15c2d9 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -40,6 +40,20 @@ #define NUM_PORTS 8 +#define PORT_STAT_CONNECTION 0x0001 +#define PORT_STAT_ENABLE 0x0002 +#define PORT_STAT_SUSPEND 0x0004 +#define PORT_STAT_OVERCURRENT 0x0008 +#define PORT_STAT_RESET 0x0010 +#define PORT_STAT_POWER 0x0100 +#define PORT_STAT_LOW_SPEED 0x0200 + +#define PORT_STAT_C_CONNECTION 0x0001 +#define PORT_STAT_C_ENABLE 0x0002 +#define PORT_STAT_C_SUSPEND 0x0004 +#define PORT_STAT_C_OVERCURRENT 0x0008 +#define PORT_STAT_C_RESET 0x0010 + // To avoid including Xbox.h extern USBDevice* g_USB0; @@ -57,13 +71,13 @@ int PlayerToUsbArray[] = { struct USBHubPort { USBPort port; // downstream port status - uint16_t wPortStatus; - uint16_t wPortChange; + uint16_t wPortStatus; // Port Status Field, in accordance with the standard + uint16_t wPortChange; // Port Change Field, in accordance with the standard }; struct USBHubState { XboxDeviceState dev; // hub device status - USBEndpoint* intr; + USBEndpoint* intr; // interrupt endpoint of the hub USBHubPort ports[NUM_PORTS]; // downstream ports of the hub }; @@ -153,15 +167,13 @@ int Hub::Init(int pport) } rc = m_UsbDev->USB_DeviceInit(m_pDeviceStruct); if (rc != 0) { - usb_release_port(dev); + UsbReleasePort(m_pDeviceStruct); return rc; } - if (dev->auto_attach) { - rc = usb_device_attach(dev); - if (rc != 0) { - usb_qdev_exit(qdev); - return rc; - } + rc = usb_device_attach(dev); + if (rc != 0) { + usb_qdev_exit(qdev); + return rc; } } @@ -240,7 +252,6 @@ void Hub::UsbEpReset() int Hub::UsbClaimPort(int pport) { - USBPort* port; int usb_port; assert(m_pDeviceStruct->Port == nullptr); @@ -260,10 +271,20 @@ int Hub::UsbClaimPort(int pport) return 0; } +void Hub::UsbReleasePort(XboxDeviceState* dev) +{ + USBPort* port = dev->Port; + + assert(port != nullptr); + + port->Dev = nullptr; + dev->Port = nullptr; +} + int Hub::UsbHub_Initfn(XboxDeviceState* dev) { USBHubState* s = container_of(dev, USBHubState, dev); - USBHubPort *port; + USBHubPort* port; int i; if (dev->Port->HubCount == 5) { @@ -273,18 +294,35 @@ int Hub::UsbHub_Initfn(XboxDeviceState* dev) CreateSerial(dev); UsbDescInit(dev); - s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1); + s->intr = m_UsbDev->USB_GetEP(dev, USB_TOKEN_IN, 1); for (i = 0; i < NUM_PORTS; i++) { port = &s->ports[i]; - usb_register_port(usb_bus_from_device(dev), - &port->port, s, i, &usb_hub_port_ops, - USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); - usb_port_location(&port->port, dev->port, i + 1); + m_UsbDev->USB_RegisterPort(&port->port, i, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); + m_UsbDev->USB_PortLocation(&port->port, dev->Port, i + 1); } - usb_hub_handle_reset(dev); + UsbHub_HandleReset(dev); return 0; } +void Hub::UsbHub_HandleReset(XboxDeviceState* dev) +{ + USBHubState* s = container_of(dev, USBHubState, dev); + USBHubPort* port; + + for (int i = 0; i < NUM_PORTS; i++) { + port = s->ports + i; + port->wPortStatus = PORT_STAT_POWER; + port->wPortChange = 0; + if (port->port.Dev && port->port.Dev->Attached) { + port->wPortStatus |= PORT_STAT_CONNECTION; + port->wPortChange |= PORT_STAT_C_CONNECTION; + if (port->port.Dev->Speed == USB_SPEED_LOW) { + port->wPortStatus |= PORT_STAT_LOW_SPEED; + } + } + } +} + /* * From XQEMU: * This function creates a serial number for a usb device. @@ -406,17 +444,17 @@ int Hub::UsbDescSetInterface(XboxDeviceState* dev, int index, int value) int old; iface = UsbDescFindInterface(dev, index, value); - if (iface == NULL) { + if (iface == nullptr) { return -1; } - old = dev->altsetting[index]; - dev->altsetting[index] = value; - dev->ifaces[index] = iface; - usb_desc_ep_init(dev); + old = dev->AltSetting[index]; + dev->AltSetting[index] = value; + dev->Ifaces[index] = iface; + UsbDescEpInit(dev); if (old != value) { - usb_device_set_interface(dev, index, old, value); + m_UsbDev->USB_DeviceSetInterface(dev, index, old, value); } return 0; } @@ -424,26 +462,46 @@ int Hub::UsbDescSetInterface(XboxDeviceState* dev, int index, int value) const USBDescIface* Hub::UsbDescFindInterface(XboxDeviceState* dev, int nif, int alt) { const USBDescIface* iface; - int g, i; + int i; if (!dev->Config) { // no configuration descriptor here, nothing to search return nullptr; } - for (g = 0; g < dev->Config->nif_groups; g++) { - for (i = 0; i < dev->config->if_groups[g].nif; i++) { - iface = &dev->config->if_groups[g].ifs[i]; - if (iface->bInterfaceNumber == nif && - iface->bAlternateSetting == alt) { - return iface; - } - } - } - for (i = 0; i < dev->config->nif; i++) { - iface = &dev->config->ifs[i]; + for (i = 0; i < dev->Config->nif; i++) { // find the desired interface + iface = &dev->Config->ifs[i]; if (iface->bInterfaceNumber == nif && iface->bAlternateSetting == alt) { return iface; } } - return NULL; + return nullptr; // not found } + +void Hub::UsbDescEpInit(XboxDeviceState* dev) +{ + const USBDescIface *iface; + int i, e, pid, ep; + + UsbEpInit(); // reset endpoints (because we changed descriptors in use?) + for (i = 0; i < dev->NumInterfaces; i++) { + iface = dev->Ifaces[i]; + if (iface == nullptr) { + continue; + } + for (e = 0; e < iface->bNumEndpoints; e++) { + // From the standard: + // "bEndpointAddress: + // Bit 3...0: The endpoint number + // Bit 6...4: Reserved, reset to zero + // Bit 7: Direction -> 0 = OUT endpoint, 1 = IN endpoint + // bmAttributes: + // Bit 1..0: Transfer Type + // 00 = Control, 01 = Isochronous, 10 = Bulk, 11 = Interrupt. All other bits are reserved" + pid = (iface->eps[e].bEndpointAddress & USB_DIR_IN) ? USB_TOKEN_IN : USB_TOKEN_OUT; + ep = iface->eps[e].bEndpointAddress & 0xF; + m_UsbDev->USB_EPsetType(dev, pid, ep, iface->eps[e].bmAttributes & 0x03); + m_UsbDev->USB_EPsetIfnum(dev, pid, ep, iface->bInterfaceNumber); + m_UsbDev->USB_EPsetMaxPacketSize(dev, pid, ep, iface->eps[e].wMaxPacketSize); + } + } +} diff --git a/src/devices/usb/Hub.h b/src/devices/usb/Hub.h index 001be4a39..0b0613021 100644 --- a/src/devices/usb/Hub.h +++ b/src/devices/usb/Hub.h @@ -77,26 +77,30 @@ class Hub final : public UsbPeripheral // TODO: perhaps these can be put in UsbPeripheral or USBDevice... // initialize the endpoints of this peripheral void UsbEpInit(); - // destroy hub + // destroy hub resources void HubCleanUp(); // reset all endpoints of this peripheral void UsbEpReset(); - // attach this hub to a usb port + // reserve a usb port for this hub int UsbClaimPort(int port); + // + void UsbReleasePort(XboxDeviceState* dev); // get device descriptor const USBDesc* GetUsbDeviceDesc(XboxDeviceState* dev); // create a serial number for the device void CreateSerial(XboxDeviceState* dev); - // + // start descriptors initialization void UsbDescInit(XboxDeviceState* dev); - // + // set the descriptors to use for this device void UsbDescSetDefaults(XboxDeviceState* dev); - // + // set the configuration to use int UsbDescSetConfig(XboxDeviceState* dev, int value); - // + // set the interface to use int UsbDescSetInterface(XboxDeviceState* dev, int index, int value); - // + // find the interface to use const USBDescIface* UsbDescFindInterface(XboxDeviceState* dev, int nif, int alt); + // setup endpoints and their descriptors + void UsbDescEpInit(XboxDeviceState* dev); }; extern Hub* g_HubObjArray[4]; diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index 1d8c15728..2b24b5a44 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -187,16 +187,27 @@ OHCI::OHCI(int Irq, USBDevice* UsbObj) { int offset = 0; + USBPortOps* ops; m_IrqNum = Irq; m_UsbDevice = UsbObj; + ops = new USBPortOps(); + { + using namespace std::placeholders; + + ops->attach = std::bind(&OHCI::OHCI_Attach, this, _1); + ops->detach = std::bind(&OHCI::OHCI_Detach, this, _1); + ops->child_detach = std::bind(&OHCI::OHCI_ChildDetach, this, _1); + ops->wakeup = std::bind(&OHCI::OHCI_Wakeup, this, _1); + ops->complete = std::bind(&OHCI::OHCI_AsyncCompletePacket, this, _1, _2); + } if (m_IrqNum == 9) { offset = 2; } for (int i = 0; i < 2; i++) { - m_UsbDevice->USB_RegisterPort(&m_Registers.RhPort[i].UsbPort, i + offset, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); + m_UsbDevice->USB_RegisterPort(&m_Registers.RhPort[i].UsbPort, i + offset, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL, ops); } OHCI_PacketInit(&m_UsbPacket); @@ -1437,6 +1448,43 @@ void OHCI::OHCI_Attach(USBPort* Port) } } +void OHCI::OHCI_ChildDetach(XboxDeviceState* child) +{ + OHCI_AsyncCancelDevice(child); +} + +void OHCI::OHCI_Wakeup(USBPort* port1) +{ + OHCIPort* port = &m_Registers.RhPort[port1->PortIndex]; + uint32_t intr = 0; + if (port->HcRhPortStatus & OHCI_PORT_PSS) { + DbgPrintf("Ohci: port %d: wakeup\n", port1->PortIndex); + port->HcRhPortStatus |= OHCI_PORT_PSSC; + port->HcRhPortStatus &= ~OHCI_PORT_PSS; + intr = OHCI_INTR_RHSC; + } + // Note that the controller can be suspended even if this port is not + if ((m_Registers.HcControl & OHCI_CTL_HCFS) == Suspend) { + DbgPrintf("Ohci: remote-wakeup: SUSPEND->RESUME\n"); + // From the standard: "The only interrupts possible in the USBSUSPEND state are ResumeDetected (the + // Host Controller will have changed the HostControllerFunctionalState to the USBRESUME state) + // and OwnershipChange." + m_Registers.HcControl &= ~OHCI_CTL_HCFS; + m_Registers.HcControl |= Resume; + intr = OHCI_INTR_RD; + } + OHCI_SetInterrupt(intr); +} + +void OHCI::OHCI_AsyncCompletePacket(USBPort* port, USBPacket* packet) +{ +#ifdef DEBUG_PACKET + DPRINTF("Async packet complete\n"); +#endif + m_AsyncComplete = 1; + OHCI_ProcessLists(1); +} + void OHCI::OHCI_AsyncCancelDevice(XboxDeviceState* dev) { if (m_AsyncTD && diff --git a/src/devices/usb/OHCI.h b/src/devices/usb/OHCI.h index 0a7d0ad56..85efceca7 100644 --- a/src/devices/usb/OHCI.h +++ b/src/devices/usb/OHCI.h @@ -158,10 +158,6 @@ class OHCI uint32_t OHCI_ReadRegister(xbaddr Addr); // write a register void OHCI_WriteRegister(xbaddr Addr, uint32_t Value); - // update ohci registers during a device attach - void OHCI_Attach(USBPort* Port); - // update ohci registers during a device detach - void OHCI_Detach(USBPort* Port); // update the USBPort struct with the device attached void OHCI_AssignUsbPortStruct(int port, XboxDeviceState* dev); @@ -263,6 +259,12 @@ class OHCI void OHCI_AsyncCancelDevice(XboxDeviceState* dev); // Process Control and Bulk lists void OHCI_ProcessLists(int completion); + // see USBPortOps struct for info + void OHCI_Attach(USBPort* Port); + void OHCI_Detach(USBPort* Port); + void OHCI_ChildDetach(XboxDeviceState* child); + void OHCI_Wakeup(USBPort* port1); + void OHCI_AsyncCompletePacket(USBPort* port, USBPacket* packet); }; #endif diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index e91c1143c..62d2bb8e9 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -86,13 +86,12 @@ void USBDevice::MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned m_HostController->OHCI_WriteRegister(addr, value); } -void USBDevice::USB_RegisterPort(USBPort* Port, int Index, int SpeedMask) +void USBDevice::USB_RegisterPort(USBPort* Port, int Index, int SpeedMask, USBPortOps* Ops) { Port->PortIndex = Index; Port->SpeedMask = SpeedMask; - Port->HubCount = 0; - Port->Dev = nullptr; - std::snprintf(Port->Path, sizeof(Port->Path), "%d", Index + 1); + Port->Operations = Ops; + USB_PortLocation(Port, nullptr, Index + 1); } void USBDevice::USB_PortReset(USBPort* Port) @@ -164,8 +163,8 @@ USBEndpoint* USBDevice::USB_GetEP(XboxDeviceState* Dev, int Pid, int Ep) if (Ep == 0) { return &Dev->EP_ctl; // EndpointNumber zero represents the default control endpoint } - assert(pid == USB_TOKEN_IN || pid == USB_TOKEN_OUT); - assert(ep > 0 && ep <= USB_MAX_ENDPOINTS); + assert(Pid == USB_TOKEN_IN || Pid == USB_TOKEN_OUT); + assert(Ep > 0 && Ep <= USB_MAX_ENDPOINTS); return eps + Ep - 1; } @@ -509,51 +508,59 @@ int USBDevice::USB_DeviceInit(XboxDeviceState* dev) void USBDevice::USB_DeviceHandleControl(XboxDeviceState* dev, USBPacket* p, int request, int value, int index, int length, uint8_t* data) { - USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); + USBDeviceClass* klass = dev->klass; if (klass->handle_control) { - klass->handle_control(dev, p, request, value, index, length, data); // TODO: usb_hub_handle_control + klass->handle_control(dev, p, request, value, index, length, data); } } void USBDevice::USB_DeviceHandleData(XboxDeviceState* dev, USBPacket* p) { - USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); + USBDeviceClass* klass = dev->klass; if (klass->handle_data) { - klass->handle_data(dev, p); // TODO: usb_hub_handle_data + klass->handle_data(dev, p); } } void USBDevice::USB_DeviceFlushEPqueue(XboxDeviceState* dev, USBEndpoint* ep) { - USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); + USBDeviceClass *klass = dev->klass; if (klass->flush_ep_queue) { - klass->flush_ep_queue(dev, ep); // TODO: it's nullptr in XQEMU... + klass->flush_ep_queue(dev, ep); } } void USBDevice::USB_DeviceCancelPacket(XboxDeviceState* dev, USBPacket* p) { - USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); + USBDeviceClass* klass = dev->klass; if (klass->cancel_packet) { - klass->cancel_packet(dev, p); // TODO: it's nullptr in XQEMU... + klass->cancel_packet(dev, p); } } -XboxDeviceState* USBDevice::USB_DeviceFindDevice(XboxDeviceState* Dev, uint8_t Addr) +XboxDeviceState* USBDevice::USB_DeviceFindDevice(XboxDeviceState* dev, uint8_t Addr) { - USBDeviceClass *klass = USB_DEVICE_GET_CLASS(Dev); + USBDeviceClass* klass = dev->klass; if (klass->find_device) { - return klass->find_device(Dev, Addr); // TODO: usb_hub_find_device + return klass->find_device(dev, Addr); } return nullptr; } -void USBDevice::USB_DeviceEPstopped(XboxDeviceState* Dev, USBEndpoint* EP) +void USBDevice::USB_DeviceEPstopped(XboxDeviceState* dev, USBEndpoint* EP) { - USBDeviceClass* klass = USB_DEVICE_GET_CLASS(Dev); + USBDeviceClass* klass = dev->klass; if (klass->ep_stopped) { - klass->ep_stopped(Dev, EP); + klass->ep_stopped(dev, EP); + } +} + +void USBDevice::USB_DeviceSetInterface(XboxDeviceState* dev, int iface, int alt_old, int alt_new) +{ + USBDeviceClass* klass = dev->klass; + if (klass->set_interface) { + klass->set_interface(dev, iface, alt_old, alt_new); } } @@ -567,3 +574,38 @@ void USBDevice::USB_CancelPacket(USBPacket* p) USB_DeviceCancelPacket(p->Endpoint->Dev, p); } } + +void USBDevice::USB_EPsetType(XboxDeviceState* dev, int pid, int ep, uint8_t type) +{ + USBEndpoint* uep = USB_GetEP(dev, pid, ep); + uep->Type = type; +} + +uint8_t USBDevice::USB_EPsetIfnum(XboxDeviceState* dev, int pid, int ep, uint8_t ifnum) +{ + USBEndpoint* uep = USB_GetEP(dev, pid, ep); + uep->IfNum = ifnum; +} + +void USBDevice::USB_EPsetMaxPacketSize(XboxDeviceState* dev, int pid, int ep, uint16_t raw) +{ + USBEndpoint* uep = USB_GetEP(dev, pid, ep); + + // Dropped from XQEMU the calculation max_packet_size = size * microframes since that's only true + // for high speed (usb 2.0) devices + + uep->MaxPacketSize = raw & 0x7FF; +} + +void USBDevice::USB_PortLocation(USBPort* downstream, USBPort* upstream, int portnr) +{ + if (upstream) { + std::snprintf(downstream->Path, sizeof(downstream->Path), "%s.%d", + upstream->Path, portnr); + downstream->HubCount = upstream->HubCount + 1; + } + else { + std::snprintf(downstream->Path, sizeof(downstream->Path), "%d", portnr); + downstream->HubCount = 0; + } +} \ No newline at end of file diff --git a/src/devices/usb/USBDevice.h b/src/devices/usb/USBDevice.h index 0343134ce..f272a17af 100644 --- a/src/devices/usb/USBDevice.h +++ b/src/devices/usb/USBDevice.h @@ -41,9 +41,10 @@ #include "UsbCommon.h" -// Forward declare OHCI class for USBDevice class +// Forward declare OHCI class for m_HostController pointer class OHCI; +/* Helper class which provides various functionality to both OHCI and usb device classes */ class USBDevice : public PCIDevice { public: // constructor @@ -68,12 +69,12 @@ class USBDevice : public PCIDevice { const char* m_PciPath; // register a port with the HC - void USB_RegisterPort(USBPort* Port, int Index, int SpeedMask); + void USB_RegisterPort(USBPort* Port, int Index, int SpeedMask, USBPortOps* Ops); // void USB_DeviceEPstopped(XboxDeviceState* Dev, USBEndpoint* Ep); // reset a usb port void USB_PortReset(USBPort* Port); - // a device is attched + // a device is attached void USB_Attach(USBPort* Port); // a device is detached void USB_Detach(USBPort* Port); @@ -87,7 +88,7 @@ class USBDevice : public PCIDevice { void USB_DeviceReset(XboxDeviceState* Dev); // find the usb device with the supplied address XboxDeviceState* USB_FindDevice(USBPort* Port, uint8_t Addr); - // ergo720: can probably be removed by calling directly usb_hub_find_device + // XboxDeviceState* USB_DeviceFindDevice(XboxDeviceState* Dev, uint8_t Addr); // find the requested endpoint in the supplied device USBEndpoint* USB_GetEP(XboxDeviceState* Dev, int Pid, int Ep); @@ -114,21 +115,31 @@ class USBDevice : public PCIDevice { void DoTokenOut(XboxDeviceState* s, USBPacket* p); // copy the packet data to the buffer pointed to by ptr void USB_PacketCopy(USBPacket* p, void* ptr, size_t bytes); + // Cancel an active packet. The packed must have been deferred by + // returning USB_RET_ASYNC from handle_packet, and not yet completed + void USB_CancelPacket(USBPacket* p); // queue a packet to an endpoint void USB_QueueOne(USBPacket* p); // call usb class init function int USB_DeviceInit(XboxDeviceState* dev); - // + // call usb class handle_control function void USB_DeviceHandleControl(XboxDeviceState* dev, USBPacket* p, int request, int value, int index, int length, uint8_t* data); - // + // call usb class handle_data function void USB_DeviceHandleData(XboxDeviceState* dev, USBPacket* p); - // + // call usb class flush_ep_queue function void USB_DeviceFlushEPqueue(XboxDeviceState* dev, USBEndpoint* ep); - // + // call usb class cancel_packet function void USB_DeviceCancelPacket(XboxDeviceState* dev, USBPacket* p); - // Cancel an active packet. The packed must have been deferred by - // returning USB_RET_ASYNC from handle_packet, and not yet completed - void USB_CancelPacket(USBPacket* p); + // call usb class set_interface function + void USB_DeviceSetInterface(XboxDeviceState* dev, int iface, int alt_old, int alt_new); + // set the type of the endpoint + void USB_EPsetType(XboxDeviceState* dev, int pid, int ep, uint8_t type); + // set the interface number of the endpoint + uint8_t USB_EPsetIfnum(XboxDeviceState* dev, int pid, int ep, uint8_t ifnum); + // set the maximum packet size parameter of the endpoint + void USB_EPsetMaxPacketSize(XboxDeviceState* dev, int pid, int ep, uint16_t raw); + // assign port numbers (also for hubs) + void USB_PortLocation(USBPort* downstream, USBPort* upstream, int portnr); }; #endif diff --git a/src/devices/usb/UsbCommon.h b/src/devices/usb/UsbCommon.h index 057c3872d..1933a8860 100644 --- a/src/devices/usb/UsbCommon.h +++ b/src/devices/usb/UsbCommon.h @@ -102,21 +102,17 @@ struct USBDescOther { const uint8_t* data; }; +/* Endpoint descriptor */ struct USBDescEndpoint { - uint8_t bEndpointAddress; - uint8_t bmAttributes; - uint16_t wMaxPacketSize; - uint8_t bInterval; - uint8_t bRefresh; - uint8_t bSynchAddress; + uint8_t bEndpointAddress; // the address of the endpoint on the USB device described by this descriptor + uint8_t bmAttributes; // this field describes the endpoint's attributes when it is configured using the bConfigurationValue + uint16_t wMaxPacketSize; // maximum packet size this endpoint is capable of sending or receiving when this configuration is selected + uint8_t bInterval; // interval for polling endpoint for data transfers, expressed in milliseconds. + uint8_t bRefresh; // for audio devices only: the rate at which synchronization feedback is provided + uint8_t bSynchAddress; // for audio devices only: the address of the synchronization endpoint uint8_t is_audio; /* has bRefresh + bSynchAddress */ uint8_t* extra; - - /* superspeed endpoint companion */ - uint8_t bMaxBurst; - uint8_t bmAttributes_super; - uint16_t wBytesPerInterval; }; /* Interface descriptor */ @@ -131,23 +127,16 @@ struct USBDescIface { uint8_t ndesc; USBDescOther* descs; - USBDescEndpoint* eps; + USBDescEndpoint* eps; // endpoints supported by this interface USBDescIface(bool bDefault); ~USBDescIface(); }; -/* conceptually an Interface Association Descriptor, and releated interfaces */ -struct USBDescIfaceAssoc { - uint8_t bFirstInterface; - uint8_t bInterfaceCount; - uint8_t bFunctionClass; - uint8_t bFunctionSubClass; - uint8_t bFunctionProtocol; - uint8_t iFunction; - - uint8_t nif; - const USBDescIface* ifs; -}; +/* +* ergo720: I removed the Interface Association Descriptor (IAD) since, at the time of this writing (2018), the xboxdevwiki documents that all +* known xid devices don't use them and also, according to the corresponding standard, IAD applies to usb revision 2.0 while the xbox uses +* usb revision 1.1 so it shouldn't support them either. If this turns out to be incorrect, then IAD support will have to be added +*/ /* Configuration descriptor */ struct USBDescConfig { @@ -156,14 +145,8 @@ struct USBDescConfig { uint8_t iConfiguration; // index of string descriptor describing this configuration uint8_t bmAttributes; // configuration characteristics uint8_t bMaxPower; // maximum power consumption of the USB device in this configuration expressed in 2mA units - - /* grouped interfaces */ - uint8_t nif_groups; - const USBDescIfaceAssoc* if_groups; - - /* "normal" interfaces */ - uint8_t nif; - const USBDescIface* ifs; + uint8_t nif; // number of interfaces (again) + const USBDescIface* ifs; // interfaces supported by this configuration }; /* Device descriptor part 1 */ @@ -174,7 +157,7 @@ struct USBDescDevice { uint8_t bDeviceProtocol; // protocol code (assigned by the USB) uint8_t bMaxPacketSize0; // maximum packet size for endpoint zero (only 8, 16, 32, or 64 are valid) uint8_t bNumConfigurations; // number of possible configurations - const USBDescConfig* confs; // configuration descriptor in use + const USBDescConfig* confs; // configurations supported by this device USBDescDevice(bool bDefault); ~USBDescDevice(); }; @@ -198,13 +181,12 @@ struct USBDesc { }; /* USB endpoint */ -struct USBEndpoint -{ +struct USBEndpoint { uint8_t Num; // endpoint number uint8_t pid; uint8_t Type; // the type of this endpoint uint8_t IfNum; // interface number this endpoint belongs to - int MaxPacketSize; + int MaxPacketSize; // maximum packet size supported by this endpoint bool Pipeline; bool Halted; // indicates that the endpoint is halted XboxDeviceState* Dev; // device this endpoint belongs to @@ -212,8 +194,7 @@ struct USBEndpoint }; /* definition of an Xbox usb device */ -struct XboxDeviceState -{ +struct XboxDeviceState { USBPort* Port; // usb port struct of this device int PortPath; // port index to which this device is attached to char* Serial; @@ -239,14 +220,14 @@ struct XboxDeviceState USBEndpoint EP_out[USB_MAX_ENDPOINTS]; // endpoints for IN tokens QLIST_HEAD(, USBDescString) Strings; // strings of the string descriptor - const USBDesc* UsbDesc; // Overrides class usb_desc if not NULL + const USBDesc* UsbDesc; // Overrides class usb_desc if not nullptr const USBDescDevice* Device; // device descriptor part 1 - int Configuration; // number of the selected configuration descriptor - int NumInterfaces; // number of available interface descriptors - int AltSetting[USB_MAX_INTERFACES]; // - const USBDescConfig* Config; // configuration descriptor in use - const USBDescIface* Ifaces[USB_MAX_INTERFACES]; + int Configuration; // number of the selected configuration descriptor + int NumInterfaces; // number of available interface descriptors + int AltSetting[USB_MAX_INTERFACES]; // alternate setting numbers for the current interface + const USBDescConfig* Config; // configuration in use + const USBDescIface* Ifaces[USB_MAX_INTERFACES]; // interface in use }; struct USBCombinedPacket { @@ -256,8 +237,7 @@ struct USBCombinedPacket { }; /* Structure used to hold information about an active USB packet */ -struct USBPacket -{ +struct USBPacket { int Pid; // Packet ID (used to identify the type of packet that is being sent) uint32_t Id; // Paddr of the TD for this packet USBEndpoint* Endpoint; // endpoint this packet is transferred to @@ -275,9 +255,26 @@ struct USBPacket QTAILQ_ENTRY(USBPacket) CombinedEntry; }; +struct USBPortOps { + std::function attach; + std::function detach; + /* + * This gets called when a device downstream from the device attached to + * the port (attached through a hub) gets detached. + */ + std::function child_detach; + std::function wakeup; + /* + * Note that port->dev will be different then the device from which + * the packet originated when a hub is involved. + */ + std::function complete; +}; + /* Struct describing the status of a usb port */ struct USBPort { XboxDeviceState* Dev; // usb device (if present) + USBPortOps* Operations; // functions to call when a port event happens int SpeedMask; // usb speeds supported int HubCount; // number of hubs chained char Path[16]; // the number of the port + 1, used to create a serial number for this device @@ -285,8 +282,7 @@ struct USBPort { }; /* Struct which stores general functions/variables regarding the peripheral */ -struct USBDeviceClass -{ +struct USBDeviceClass { std::function init; // Walk (enabled) downstream ports, check for a matching device. From 4e3d0b307ada1cae9b85a8853d17091a37ba35d3 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Tue, 3 Jul 2018 16:08:12 +0200 Subject: [PATCH 0044/1000] Finally finished Hub initialization! --- src/devices/usb/Hub.cpp | 47 +++++++++-------- src/devices/usb/Hub.h | 10 ++-- src/devices/usb/OHCI.cpp | 4 +- src/devices/usb/OHCI.h | 2 +- src/devices/usb/USBDevice.cpp | 95 ++++++++++++++++++++++++----------- src/devices/usb/USBDevice.h | 28 +++++++---- src/devices/usb/UsbCommon.h | 6 +-- 7 files changed, 122 insertions(+), 70 deletions(-) diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index e9a15c2d9..166281a40 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -170,22 +170,16 @@ int Hub::Init(int pport) UsbReleasePort(m_pDeviceStruct); return rc; } - rc = usb_device_attach(dev); - if (rc != 0) { - usb_qdev_exit(qdev); - return rc; - } + m_UsbDev->USB_DeviceAttach(m_pDeviceStruct); + + return 0; } Hub::~Hub() -{ - HubCleanUp(); -} - -void Hub::HubCleanUp() { delete m_pPeripheralFuncStruct; - delete m_pDeviceStruct; + delete m_HubState->ports[0].port.Operations; + delete m_HubState; m_pPeripheralFuncStruct = nullptr; m_pDeviceStruct = nullptr; } @@ -205,7 +199,7 @@ void Hub::ClassInitFn() m_pPeripheralFuncStruct->init = std::bind(&Hub::UsbHub_Initfn, this, _1); m_pPeripheralFuncStruct->find_device = std::bind(&Hub::UsbHub_FindDevice, this, _1, _2); - m_pPeripheralFuncStruct->handle_reset = std::bind(&Hub::UsbHub_HandleReset, this, _1); + m_pPeripheralFuncStruct->handle_reset = std::bind(&Hub::UsbHub_HandleReset, this); m_pPeripheralFuncStruct->handle_control = std::bind(&Hub::UsbHub_HandleControl, this, _1, _2, _3, _4, _5, _6, _7); m_pPeripheralFuncStruct->handle_data = std::bind(&Hub::UsbHub_HandleData, this, _1, _2); m_pPeripheralFuncStruct->handle_destroy = std::bind(&Hub::UsbHub_HandleDestroy, this, _1); @@ -283,8 +277,8 @@ void Hub::UsbReleasePort(XboxDeviceState* dev) int Hub::UsbHub_Initfn(XboxDeviceState* dev) { - USBHubState* s = container_of(dev, USBHubState, dev); USBHubPort* port; + USBPortOps* ops; int i; if (dev->Port->HubCount == 5) { @@ -294,23 +288,34 @@ int Hub::UsbHub_Initfn(XboxDeviceState* dev) CreateSerial(dev); UsbDescInit(dev); - s->intr = m_UsbDev->USB_GetEP(dev, USB_TOKEN_IN, 1); + m_HubState->intr = m_UsbDev->USB_GetEP(dev, USB_TOKEN_IN, 1); + + ops = new USBPortOps(); + { + using namespace std::placeholders; + + ops->attach = std::bind(&Hub::UsbHub_Attach, this, _1); + ops->detach = std::bind(&Hub::UsbHub_Detach, this, _1); + ops->child_detach = std::bind(&Hub::UsbHub_ChildDetach, this, _1, _2); + ops->wakeup = std::bind(&Hub::UsbHub_Wakeup, this, _1); + ops->complete = std::bind(&Hub::UsbHub_Complete, this, _1, _2); + } + for (i = 0; i < NUM_PORTS; i++) { - port = &s->ports[i]; - m_UsbDev->USB_RegisterPort(&port->port, i, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL); + port = &m_HubState->ports[i]; + m_UsbDev->USB_RegisterPort(&port->port, i, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL, ops); m_UsbDev->USB_PortLocation(&port->port, dev->Port, i + 1); } - UsbHub_HandleReset(dev); + UsbHub_HandleReset(); return 0; } -void Hub::UsbHub_HandleReset(XboxDeviceState* dev) -{ - USBHubState* s = container_of(dev, USBHubState, dev); +void Hub::UsbHub_HandleReset() +{ USBHubPort* port; for (int i = 0; i < NUM_PORTS; i++) { - port = s->ports + i; + port = m_HubState->ports + i; port->wPortStatus = PORT_STAT_POWER; port->wPortChange = 0; if (port->port.Dev && port->port.Dev->Attached) { diff --git a/src/devices/usb/Hub.h b/src/devices/usb/Hub.h index 0b0613021..1e908ad7a 100644 --- a/src/devices/usb/Hub.h +++ b/src/devices/usb/Hub.h @@ -69,16 +69,20 @@ class Hub final : public UsbPeripheral // see USBDeviceClass for comments about these functions int UsbHub_Initfn(XboxDeviceState* dev); XboxDeviceState* UsbHub_FindDevice(XboxDeviceState* dev, uint8_t addr); - void UsbHub_HandleReset(XboxDeviceState* dev); + void UsbHub_HandleReset(); void UsbHub_HandleControl(XboxDeviceState* dev, USBPacket* p, int request, int value, int index, int length, uint8_t* data); void UsbHub_HandleData(XboxDeviceState* dev, USBPacket* p); void UsbHub_HandleDestroy(XboxDeviceState* dev); + // see USBPortOps struct for info + void UsbHub_Attach(USBPort* port1); + void UsbHub_Detach(USBPort* port1); + void UsbHub_ChildDetach(USBPort* port1, XboxDeviceState* child); + void UsbHub_Wakeup(USBPort* port1); + void UsbHub_Complete(USBPort* port, USBPacket* packet); // TODO: perhaps these can be put in UsbPeripheral or USBDevice... // initialize the endpoints of this peripheral void UsbEpInit(); - // destroy hub resources - void HubCleanUp(); // reset all endpoints of this peripheral void UsbEpReset(); // reserve a usb port for this hub diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index 2b24b5a44..765455423 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -197,7 +197,7 @@ OHCI::OHCI(int Irq, USBDevice* UsbObj) ops->attach = std::bind(&OHCI::OHCI_Attach, this, _1); ops->detach = std::bind(&OHCI::OHCI_Detach, this, _1); - ops->child_detach = std::bind(&OHCI::OHCI_ChildDetach, this, _1); + ops->child_detach = std::bind(&OHCI::OHCI_ChildDetach, this, nullptr, _2); ops->wakeup = std::bind(&OHCI::OHCI_Wakeup, this, _1); ops->complete = std::bind(&OHCI::OHCI_AsyncCompletePacket, this, _1, _2); } @@ -1448,7 +1448,7 @@ void OHCI::OHCI_Attach(USBPort* Port) } } -void OHCI::OHCI_ChildDetach(XboxDeviceState* child) +void OHCI::OHCI_ChildDetach(USBPort* port, XboxDeviceState* child) { OHCI_AsyncCancelDevice(child); } diff --git a/src/devices/usb/OHCI.h b/src/devices/usb/OHCI.h index 85efceca7..232d4acc8 100644 --- a/src/devices/usb/OHCI.h +++ b/src/devices/usb/OHCI.h @@ -262,7 +262,7 @@ class OHCI // see USBPortOps struct for info void OHCI_Attach(USBPort* Port); void OHCI_Detach(USBPort* Port); - void OHCI_ChildDetach(XboxDeviceState* child); + void OHCI_ChildDetach(USBPort* port, XboxDeviceState* child); void OHCI_Wakeup(USBPort* port1); void OHCI_AsyncCompletePacket(USBPort* port, USBPacket* packet); }; diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index 62d2bb8e9..3b5414603 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -116,14 +116,14 @@ void USBDevice::USB_Detach(USBPort* Port) void USBDevice::USB_Attach(USBPort* Port) { - XboxDeviceState *dev = Port->Dev; + XboxDeviceState* dev = Port->Dev; assert(dev != nullptr); assert(dev->Attached); assert(dev->State == USB_STATE_NOTATTACHED); - m_HostController->OHCI_Attach(Port); + Port->Operations->attach(Port); dev->State = USB_STATE_ATTACHED; - usb_device_handle_attach(dev); + USB_DeviceHandleAttach(dev); } void USBDevice::USB_DeviceReset(XboxDeviceState* dev) @@ -506,6 +506,48 @@ int USBDevice::USB_DeviceInit(XboxDeviceState* dev) return 0; } +XboxDeviceState* USBDevice::USB_DeviceFindDevice(XboxDeviceState* dev, uint8_t Addr) +{ + USBDeviceClass* klass = dev->klass; + if (klass->find_device) { + return klass->find_device(dev, Addr); + } + + return nullptr; +} + +void USBDevice::USB_DeviceCancelPacket(XboxDeviceState* dev, USBPacket* p) +{ + USBDeviceClass* klass = dev->klass; + if (klass->cancel_packet) { + klass->cancel_packet(dev, p); + } +} + +void USBDevice::USB_DeviceHandleDestroy(XboxDeviceState* dev) +{ + USBDeviceClass* klass = dev->klass; + if (klass->handle_destroy) { + klass->handle_destroy(dev); + } +} + +void USBDevice::USB_DeviceHandleAttach(XboxDeviceState* dev) +{ + USBDeviceClass* klass = dev->klass; + if (klass->handle_attach) { + klass->handle_attach(dev); + } +} + +void USBDevice::USB_DeviceHandleReset(XboxDeviceState* dev) +{ + USBDeviceClass* klass = dev->klass; + if (klass->handle_reset) { + klass->handle_reset(dev); + } +} + void USBDevice::USB_DeviceHandleControl(XboxDeviceState* dev, USBPacket* p, int request, int value, int index, int length, uint8_t* data) { USBDeviceClass* klass = dev->klass; @@ -522,6 +564,14 @@ void USBDevice::USB_DeviceHandleData(XboxDeviceState* dev, USBPacket* p) } } +void USBDevice::USB_DeviceSetInterface(XboxDeviceState* dev, int iface, int alt_old, int alt_new) +{ + USBDeviceClass* klass = dev->klass; + if (klass->set_interface) { + klass->set_interface(dev, iface, alt_old, alt_new); + } +} + void USBDevice::USB_DeviceFlushEPqueue(XboxDeviceState* dev, USBEndpoint* ep) { USBDeviceClass *klass = dev->klass; @@ -530,24 +580,6 @@ void USBDevice::USB_DeviceFlushEPqueue(XboxDeviceState* dev, USBEndpoint* ep) } } -void USBDevice::USB_DeviceCancelPacket(XboxDeviceState* dev, USBPacket* p) -{ - USBDeviceClass* klass = dev->klass; - if (klass->cancel_packet) { - klass->cancel_packet(dev, p); - } -} - -XboxDeviceState* USBDevice::USB_DeviceFindDevice(XboxDeviceState* dev, uint8_t Addr) -{ - USBDeviceClass* klass = dev->klass; - if (klass->find_device) { - return klass->find_device(dev, Addr); - } - - return nullptr; -} - void USBDevice::USB_DeviceEPstopped(XboxDeviceState* dev, USBEndpoint* EP) { USBDeviceClass* klass = dev->klass; @@ -556,14 +588,6 @@ void USBDevice::USB_DeviceEPstopped(XboxDeviceState* dev, USBEndpoint* EP) } } -void USBDevice::USB_DeviceSetInterface(XboxDeviceState* dev, int iface, int alt_old, int alt_new) -{ - USBDeviceClass* klass = dev->klass; - if (klass->set_interface) { - klass->set_interface(dev, iface, alt_old, alt_new); - } -} - void USBDevice::USB_CancelPacket(USBPacket* p) { bool callback = (p->State == USB_PACKET_ASYNC); @@ -608,4 +632,15 @@ void USBDevice::USB_PortLocation(USBPort* downstream, USBPort* upstream, int por std::snprintf(downstream->Path, sizeof(downstream->Path), "%d", portnr); downstream->HubCount = 0; } -} \ No newline at end of file +} + +void USBDevice::USB_DeviceAttach(XboxDeviceState* dev) +{ + USBPort* port = dev->Port; + + assert(port != nullptr); + assert(!dev->Attached); + + dev->Attached++; + USB_Attach(port); +} diff --git a/src/devices/usb/USBDevice.h b/src/devices/usb/USBDevice.h index f272a17af..150fd082e 100644 --- a/src/devices/usb/USBDevice.h +++ b/src/devices/usb/USBDevice.h @@ -70,13 +70,13 @@ class USBDevice : public PCIDevice { // register a port with the HC void USB_RegisterPort(USBPort* Port, int Index, int SpeedMask, USBPortOps* Ops); - // - void USB_DeviceEPstopped(XboxDeviceState* Dev, USBEndpoint* Ep); // reset a usb port void USB_PortReset(USBPort* Port); - // a device is attached + // update device status during an attach + void USB_DeviceAttach(XboxDeviceState* dev); + // update port status when a device is attached void USB_Attach(USBPort* Port); - // a device is detached + // update port status when a device is detached void USB_Detach(USBPort* Port); // a device downstream from the device attached to the port (attached through a hub) is detached void ChildDetach(USBPort* Port, XboxDeviceState* Child); @@ -86,8 +86,6 @@ class USBDevice : public PCIDevice { void Complete(USBPort* Port, USBPacket *P); // reset a device void USB_DeviceReset(XboxDeviceState* Dev); - // find the usb device with the supplied address - XboxDeviceState* USB_FindDevice(USBPort* Port, uint8_t Addr); // XboxDeviceState* USB_DeviceFindDevice(XboxDeviceState* Dev, uint8_t Addr); // find the requested endpoint in the supplied device @@ -122,16 +120,26 @@ class USBDevice : public PCIDevice { void USB_QueueOne(USBPacket* p); // call usb class init function int USB_DeviceInit(XboxDeviceState* dev); + // call usb class find_device function + XboxDeviceState* USB_FindDevice(USBPort* Port, uint8_t Addr); + // call usb class cancel_packet function + void USB_DeviceCancelPacket(XboxDeviceState* dev, USBPacket* p); + // call usb class handle_destroy function + void USB_DeviceHandleDestroy(XboxDeviceState* dev); + // call usb class handle_attach function + void USB_DeviceHandleAttach(XboxDeviceState* dev); + // call usb class handle_reset function + void USB_DeviceHandleReset(XboxDeviceState* dev); // call usb class handle_control function void USB_DeviceHandleControl(XboxDeviceState* dev, USBPacket* p, int request, int value, int index, int length, uint8_t* data); // call usb class handle_data function void USB_DeviceHandleData(XboxDeviceState* dev, USBPacket* p); - // call usb class flush_ep_queue function - void USB_DeviceFlushEPqueue(XboxDeviceState* dev, USBEndpoint* ep); - // call usb class cancel_packet function - void USB_DeviceCancelPacket(XboxDeviceState* dev, USBPacket* p); // call usb class set_interface function void USB_DeviceSetInterface(XboxDeviceState* dev, int iface, int alt_old, int alt_new); + // call usb class flush_ep_queue function + void USB_DeviceFlushEPqueue(XboxDeviceState* dev, USBEndpoint* ep); + // call usb class ep_stopped function + void USB_DeviceEPstopped(XboxDeviceState* Dev, USBEndpoint* Ep); // set the type of the endpoint void USB_EPsetType(XboxDeviceState* dev, int pid, int ep, uint8_t type); // set the interface number of the endpoint diff --git a/src/devices/usb/UsbCommon.h b/src/devices/usb/UsbCommon.h index 1933a8860..ee826f3ce 100644 --- a/src/devices/usb/UsbCommon.h +++ b/src/devices/usb/UsbCommon.h @@ -256,13 +256,13 @@ struct USBPacket { }; struct USBPortOps { - std::function attach; - std::function detach; + std::function attach; + std::function detach; /* * This gets called when a device downstream from the device attached to * the port (attached through a hub) gets detached. */ - std::function child_detach; + std::function child_detach; std::function wakeup; /* * Note that port->dev will be different then the device from which From 36038db4facc0cba368f1b22c9244e57e4b44e24 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Tue, 3 Jul 2018 23:11:41 +0200 Subject: [PATCH 0045/1000] Implemented some hub commands + major refactoring --- src/devices/usb/Hub.cpp | 562 ++++++++++++++++++++-------------- src/devices/usb/Hub.h | 41 +-- src/devices/usb/OHCI.cpp | 4 +- src/devices/usb/OHCI.h | 2 +- src/devices/usb/USBDevice.cpp | 248 ++++++++++++++- src/devices/usb/USBDevice.h | 30 +- src/devices/usb/UsbCommon.h | 21 +- 7 files changed, 612 insertions(+), 296 deletions(-) diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index 166281a40..d0b2ab894 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -159,18 +159,18 @@ static const USBDesc desc_hub(true); int Hub::Init(int pport) { - ClassInitFn(); - UsbEpInit(); - int rc = UsbClaimPort(pport); + XboxDeviceState* dev = ClassInitFn(); + m_UsbDev->UsbEpInit(dev); + int rc = UsbHubClaimPort(dev, pport); if (rc != 0) { return rc; } - rc = m_UsbDev->USB_DeviceInit(m_pDeviceStruct); + rc = m_UsbDev->USB_DeviceInit(dev); if (rc != 0) { - UsbReleasePort(m_pDeviceStruct); + UsbHubReleasePort(dev); return rc; } - m_UsbDev->USB_DeviceAttach(m_pDeviceStruct); + m_UsbDev->USB_DeviceAttach(dev); return 0; } @@ -181,91 +181,57 @@ Hub::~Hub() delete m_HubState->ports[0].port.Operations; delete m_HubState; m_pPeripheralFuncStruct = nullptr; - m_pDeviceStruct = nullptr; + m_HubState = nullptr; } -void Hub::ClassInitFn() +XboxDeviceState* Hub::ClassInitFn() { m_pPeripheralFuncStruct = new USBDeviceClass(); m_HubState = new USBHubState(); - m_pDeviceStruct = &m_HubState->dev; - - m_pDeviceStruct->ProductDesc = "Cxbx-Reloaded USB Hub"; - QLIST_INIT(&m_pDeviceStruct->Strings); - m_pDeviceStruct->klass = m_pPeripheralFuncStruct; + XboxDeviceState* dev = &m_HubState->dev; + + dev->ProductDesc = "Cxbx-Reloaded USB Hub"; + QLIST_INIT(&dev->Strings); + dev->klass = m_pPeripheralFuncStruct; { using namespace std::placeholders; - + m_pPeripheralFuncStruct->init = std::bind(&Hub::UsbHub_Initfn, this, _1); m_pPeripheralFuncStruct->find_device = std::bind(&Hub::UsbHub_FindDevice, this, _1, _2); m_pPeripheralFuncStruct->handle_reset = std::bind(&Hub::UsbHub_HandleReset, this); m_pPeripheralFuncStruct->handle_control = std::bind(&Hub::UsbHub_HandleControl, this, _1, _2, _3, _4, _5, _6, _7); m_pPeripheralFuncStruct->handle_data = std::bind(&Hub::UsbHub_HandleData, this, _1, _2); m_pPeripheralFuncStruct->handle_destroy = std::bind(&Hub::UsbHub_HandleDestroy, this, _1); - m_pPeripheralFuncStruct->product_desc = m_pDeviceStruct->ProductDesc.c_str(); + m_pPeripheralFuncStruct->product_desc = dev->ProductDesc.c_str(); m_pPeripheralFuncStruct->usb_desc = &desc_hub; } + + return dev; } -void Hub::UsbEpInit() -{ - UsbEpReset(); - QTAILQ_INIT(&m_pDeviceStruct->EP_ctl.Queue); - for (int ep = 0; ep < USB_MAX_ENDPOINTS; ep++) { - QTAILQ_INIT(&m_pDeviceStruct->EP_in[ep].Queue); - QTAILQ_INIT(&m_pDeviceStruct->EP_out[ep].Queue); - } -} - -void Hub::UsbEpReset() -{ - m_pDeviceStruct->EP_ctl.Num = 0; - m_pDeviceStruct->EP_ctl.Type = USB_ENDPOINT_XFER_CONTROL; - m_pDeviceStruct->EP_ctl.IfNum = 0; - m_pDeviceStruct->EP_ctl.MaxPacketSize = 64; - m_pDeviceStruct->EP_ctl.Dev = m_pDeviceStruct; - m_pDeviceStruct->EP_ctl.Pipeline = false; - for (int ep = 0; ep < USB_MAX_ENDPOINTS; ep++) { - m_pDeviceStruct->EP_in[ep].Num = ep + 1; - m_pDeviceStruct->EP_out[ep].Num = ep + 1; - m_pDeviceStruct->EP_in[ep].pid = USB_TOKEN_IN; - m_pDeviceStruct->EP_out[ep].pid = USB_TOKEN_OUT; - m_pDeviceStruct->EP_in[ep].Type = USB_ENDPOINT_XFER_INVALID; - m_pDeviceStruct->EP_out[ep].Type = USB_ENDPOINT_XFER_INVALID; - m_pDeviceStruct->EP_in[ep].IfNum = USB_INTERFACE_INVALID; - m_pDeviceStruct->EP_out[ep].IfNum = USB_INTERFACE_INVALID; - m_pDeviceStruct->EP_in[ep].MaxPacketSize = 0; - m_pDeviceStruct->EP_out[ep].MaxPacketSize = 0; - m_pDeviceStruct->EP_in[ep].Dev = m_pDeviceStruct; - m_pDeviceStruct->EP_out[ep].Dev = m_pDeviceStruct; - m_pDeviceStruct->EP_in[ep].Pipeline = false; - m_pDeviceStruct->EP_out[ep].Pipeline = false; - } -} - -int Hub::UsbClaimPort(int pport) +int Hub::UsbHubClaimPort(XboxDeviceState* dev, int pport) { int usb_port; - assert(m_pDeviceStruct->Port == nullptr); + assert(dev->Port == nullptr); if (pport > 4 || pport < 1) { return -1; }; usb_port = PlayerToUsbArray[pport]; if (usb_port > 2) { m_UsbDev = g_USB0; - m_UsbDev->m_HostController->OHCI_AssignUsbPortStruct(usb_port - 3, m_pDeviceStruct); + m_UsbDev->m_HostController->OHCI_AssignUsbPortStruct(usb_port - 3, dev); } else { m_UsbDev = g_USB1; - m_UsbDev->m_HostController->OHCI_AssignUsbPortStruct(usb_port - 1, m_pDeviceStruct); + m_UsbDev->m_HostController->OHCI_AssignUsbPortStruct(usb_port - 1, dev); } return 0; } -void Hub::UsbReleasePort(XboxDeviceState* dev) +void Hub::UsbHubReleasePort(XboxDeviceState* dev) { USBPort* port = dev->Port; @@ -286,8 +252,8 @@ int Hub::UsbHub_Initfn(XboxDeviceState* dev) return -1; } - CreateSerial(dev); - UsbDescInit(dev); + m_UsbDev->CreateSerial(dev); + m_UsbDev->UsbDescInit(dev); m_HubState->intr = m_UsbDev->USB_GetEP(dev, USB_TOKEN_IN, 1); ops = new USBPortOps(); @@ -296,7 +262,7 @@ int Hub::UsbHub_Initfn(XboxDeviceState* dev) ops->attach = std::bind(&Hub::UsbHub_Attach, this, _1); ops->detach = std::bind(&Hub::UsbHub_Detach, this, _1); - ops->child_detach = std::bind(&Hub::UsbHub_ChildDetach, this, _1, _2); + ops->child_detach = std::bind(&Hub::UsbHub_ChildDetach, this, _1); ops->wakeup = std::bind(&Hub::UsbHub_Wakeup, this, _1); ops->complete = std::bind(&Hub::UsbHub_Complete, this, _1, _2); } @@ -310,6 +276,24 @@ int Hub::UsbHub_Initfn(XboxDeviceState* dev) return 0; } +XboxDeviceState* Hub::UsbHub_FindDevice(XboxDeviceState* dev, uint8_t addr) +{ + USBHubPort* port; + XboxDeviceState* downstream; + + for (int i = 0; i < NUM_PORTS; i++) { + port = &m_HubState->ports[i]; + if (!(port->wPortStatus & PORT_STAT_ENABLE)) { + continue; + } + downstream = m_UsbDev->USB_FindDevice(&port->port, addr); + if (downstream != nullptr) { + return downstream; + } + } + return nullptr; +} + void Hub::UsbHub_HandleReset() { USBHubPort* port; @@ -328,185 +312,297 @@ void Hub::UsbHub_HandleReset() } } -/* -* From XQEMU: -* This function creates a serial number for a usb device. -* The serial number should: -* (a) Be unique within the emulator. -* (b) Be constant, so you don't get a new one each -* time the guest is started. -* So we are using the physical location to generate a serial number -* from it. It has three pieces: First a fixed, device-specific -* prefix. Second the device path of the host controller (which is -* the pci address in most cases). Third the physical port path. -* Results in serial numbers like this: "314159-0000:00:1d.7-3". -*/ -void Hub::CreateSerial(XboxDeviceState* dev) -{ - const USBDesc* desc = GetUsbDeviceDesc(dev); - int index = desc->id.iSerialNumber; - USBDescString* s; - char serial[64]; - char* path; - int dst; - - assert(index != 0 && desc->str[index] != NULL); - dst = std::snprintf(serial, sizeof(serial), "%s", desc->str[index]); - dst += std::snprintf(serial + dst, sizeof(serial) - dst, "-%s", m_UsbDev->m_PciPath); - dst += std::snprintf(serial + dst, sizeof(serial) - dst, "-%s", dev->Port->Path); - - QLIST_FOREACH(s, &dev->Strings, next) { - if (s->index == index) { - break; - } - } - - if (s == nullptr) { - s = new USBDescString; - s->index = index; - QLIST_INSERT_HEAD(&dev->Strings, s, next); - } - - s->str = serial; -} - -const USBDesc* Hub::GetUsbDeviceDesc(XboxDeviceState* dev) -{ - USBDeviceClass* klass = dev->klass; - if (dev->UsbDesc) { - return dev->UsbDesc; - } - return klass->usb_desc; -} - -void Hub::UsbDescInit(XboxDeviceState* dev) -{ - const USBDesc* desc = GetUsbDeviceDesc(dev); - - assert(desc != NULL); - dev->Speed = USB_SPEED_FULL; - dev->SpeedMask = 0; - if (desc->full) { - dev->SpeedMask |= USB_SPEED_MASK_FULL; - } - UsbDescSetDefaults(dev); -} - -void Hub::UsbDescSetDefaults(XboxDeviceState* dev) +void Hub::UsbHub_HandleControl(XboxDeviceState* dev, USBPacket* p, + int request, int value, int index, int length, uint8_t* data) { - const USBDesc *desc = GetUsbDeviceDesc(dev); + USBHubState *s = (USBHubState *)dev; + int ret; + + ret = usb_desc_handle_control(dev, p, request, value, index, length, data); + if (ret >= 0) { + return; + } + + switch (request) { + case EndpointOutRequest | USB_REQ_CLEAR_FEATURE: + if (value == 0 && index != 0x81) { /* clear ep halt */ + goto fail; + } + break; + /* usb specific requests */ + case GetHubStatus: + data[0] = 0; + data[1] = 0; + data[2] = 0; + data[3] = 0; + p->actual_length = 4; + break; + case GetPortStatus: + { + unsigned int n = index - 1; + USBHubPort *port; + if (n >= NUM_PORTS) { + goto fail; + } + port = &s->ports[n]; + trace_usb_hub_get_port_status(s->dev.addr, index, + port->wPortStatus, + port->wPortChange); + data[0] = port->wPortStatus; + data[1] = port->wPortStatus >> 8; + data[2] = port->wPortChange; + data[3] = port->wPortChange >> 8; + p->actual_length = 4; + } + break; + case SetHubFeature: + case ClearHubFeature: + if (value != 0 && value != 1) { + goto fail; + } + break; + case SetPortFeature: + { + unsigned int n = index - 1; + USBHubPort *port; + USBDevice *dev; + + trace_usb_hub_set_port_feature(s->dev.addr, index, + feature_name(value)); + + if (n >= NUM_PORTS) { + goto fail; + } + port = &s->ports[n]; + dev = port->port.dev; + switch (value) { + case PORT_SUSPEND: + port->wPortStatus |= PORT_STAT_SUSPEND; + break; + case PORT_RESET: + if (dev && dev->attached) { + usb_device_reset(dev); + port->wPortChange |= PORT_STAT_C_RESET; + /* set enable bit */ + port->wPortStatus |= PORT_STAT_ENABLE; + usb_wakeup(s->intr, 0); + } + break; + case PORT_POWER: + break; + default: + goto fail; + } + } + break; + case ClearPortFeature: + { + unsigned int n = index - 1; + USBHubPort *port; + + trace_usb_hub_clear_port_feature(s->dev.addr, index, + feature_name(value)); + + if (n >= NUM_PORTS) { + goto fail; + } + port = &s->ports[n]; + switch (value) { + case PORT_ENABLE: + port->wPortStatus &= ~PORT_STAT_ENABLE; + break; + case PORT_C_ENABLE: + port->wPortChange &= ~PORT_STAT_C_ENABLE; + break; + case PORT_SUSPEND: + port->wPortStatus &= ~PORT_STAT_SUSPEND; + break; + case PORT_C_SUSPEND: + port->wPortChange &= ~PORT_STAT_C_SUSPEND; + break; + case PORT_C_CONNECTION: + port->wPortChange &= ~PORT_STAT_C_CONNECTION; + break; + case PORT_C_OVERCURRENT: + port->wPortChange &= ~PORT_STAT_C_OVERCURRENT; + break; + case PORT_C_RESET: + port->wPortChange &= ~PORT_STAT_C_RESET; + break; + default: + goto fail; + } + } + break; + case GetHubDescriptor: + { + unsigned int n, limit, var_hub_size = 0; + memcpy(data, qemu_hub_hub_descriptor, + sizeof(qemu_hub_hub_descriptor)); + data[2] = NUM_PORTS; + + /* fill DeviceRemovable bits */ + limit = ((NUM_PORTS + 1 + 7) / 8) + 7; + for (n = 7; n < limit; n++) { + data[n] = 0x00; + var_hub_size++; + } + + /* fill PortPwrCtrlMask bits */ + limit = limit + ((NUM_PORTS + 7) / 8); + for (; n < limit; n++) { + data[n] = 0xff; + var_hub_size++; + } + + p->actual_length = sizeof(qemu_hub_hub_descriptor) + var_hub_size; + data[0] = p->actual_length; + break; + } + default: + fail: + p->status = USB_RET_STALL; + break; + } +} + +void Hub::UsbHub_Attach(USBPort* port1) +{ + USBHubPort* port = &m_HubState->ports[port1->PortIndex]; + + port->wPortStatus |= PORT_STAT_CONNECTION; + port->wPortChange |= PORT_STAT_C_CONNECTION; + if (port->port.Dev->Speed == USB_SPEED_LOW) { + port->wPortStatus |= PORT_STAT_LOW_SPEED; + } + else { + port->wPortStatus &= ~PORT_STAT_LOW_SPEED; + } + m_UsbDev->USB_Wakeup(m_HubState->intr); +} + +void Hub::UsbHub_Detach(USBPort* port1) +{ + USBHubPort* port = &m_HubState->ports[port1->PortIndex]; + + m_UsbDev->USB_Wakeup(m_HubState->intr); + + // Let upstream know the device on this port is gone + m_HubState->dev.Port->Operations->child_detach(port1->Dev); + + port->wPortStatus &= ~PORT_STAT_CONNECTION; + port->wPortChange |= PORT_STAT_C_CONNECTION; + if (port->wPortStatus & PORT_STAT_ENABLE) { + port->wPortStatus &= ~PORT_STAT_ENABLE; + port->wPortChange |= PORT_STAT_C_ENABLE; + } + m_UsbDev->USB_Wakeup(m_HubState->intr); +} + +void Hub::UsbHub_ChildDetach(XboxDeviceState* child) +{ + // Pass along to upstream + m_HubState->dev.Port->Operations->child_detach(child); +} + +void Hub::UsbHub_Wakeup(USBPort* port1) +{ + USBHubPort* port = &m_HubState->ports[port1->PortIndex]; + + if (port->wPortStatus & PORT_STAT_SUSPEND) { + port->wPortChange |= PORT_STAT_C_SUSPEND; + m_UsbDev->USB_Wakeup(m_HubState->intr); + } +} + +void Hub::UsbHub_Complete(USBPort* port, USBPacket* packet) +{ + // Just pass it along to upstream + m_HubState->dev.Port->Operations->complete(m_HubState->dev.Port, packet); +} + +int usb_desc_handle_control(USBDevice *dev, USBPacket *p, + int request, int value, int index, int length, uint8_t *data) +{ + const USBDesc *desc = usb_device_get_usb_desc(dev); + int ret = -1; assert(desc != NULL); - switch (dev->Speed) { - case USB_SPEED_LOW: - case USB_SPEED_FULL: { - dev->Device = desc->full; + switch (request) { + case DeviceOutRequest | USB_REQ_SET_ADDRESS: + dev->addr = value; + trace_usb_set_addr(dev->addr); + ret = 0; + break; + + case DeviceRequest | USB_REQ_GET_DESCRIPTOR: + ret = usb_desc_get_descriptor(dev, p, value, data, length); + break; + + case DeviceRequest | USB_REQ_GET_CONFIGURATION: + /* + * 9.4.2: 0 should be returned if the device is unconfigured, otherwise + * the non zero value of bConfigurationValue. + */ + data[0] = dev->config ? dev->config->bConfigurationValue : 0; + p->actual_length = 1; + ret = 0; + break; + case DeviceOutRequest | USB_REQ_SET_CONFIGURATION: + ret = usb_desc_set_config(dev, value); + trace_usb_set_config(dev->addr, value, ret); + break; + + case DeviceRequest | USB_REQ_GET_STATUS: { + const USBDescConfig *config = dev->config ? + dev->config : &dev->device->confs[0]; + + data[0] = 0; + /* + * Default state: Device behavior when this request is received while + * the device is in the Default state is not specified. + * We return the same value that a configured device would return if + * it used the first configuration. + */ + if (config->bmAttributes & 0x40) { + data[0] |= 1 << USB_DEVICE_SELF_POWERED; + } + if (dev->remote_wakeup) { + data[0] |= 1 << USB_DEVICE_REMOTE_WAKEUP; + } + data[1] = 0x00; + p->actual_length = 2; + ret = 0; + break; + } + case DeviceOutRequest | USB_REQ_CLEAR_FEATURE: + if (value == USB_DEVICE_REMOTE_WAKEUP) { + dev->remote_wakeup = 0; + ret = 0; + } + trace_usb_clear_device_feature(dev->addr, value, ret); + break; + case DeviceOutRequest | USB_REQ_SET_FEATURE: + if (value == USB_DEVICE_REMOTE_WAKEUP) { + dev->remote_wakeup = 1; + ret = 0; + } + trace_usb_set_device_feature(dev->addr, value, ret); + break; + + case InterfaceRequest | USB_REQ_GET_INTERFACE: + if (index < 0 || index >= dev->ninterfaces) { break; } - default: - EmuWarning("Unknown speed parameter %d set in %s", dev->ProductDesc.c_str()); - } - UsbDescSetConfig(dev, 0); -} + data[0] = dev->altsetting[index]; + p->actual_length = 1; + ret = 0; + break; + case InterfaceOutRequest | USB_REQ_SET_INTERFACE: + ret = usb_desc_set_interface(dev, index, value); + trace_usb_set_interface(dev->addr, index, value, ret); + break; -int Hub::UsbDescSetConfig(XboxDeviceState* dev, int value) -{ - int i; - - if (value == 0) { // default configuration - dev->Configuration = 0; - dev->NumInterfaces = 0; - dev->Config = nullptr; - } - else { - for (i = 0; i < dev->Device->bNumConfigurations; i++) { // select the configuration specified - if (dev->Device->confs[i].bConfigurationValue == value) { - dev->Configuration = value; - dev->NumInterfaces = dev->Device->confs[i].bNumInterfaces; - dev->Config = dev->Device->confs + i; - assert(dev->NumInterfaces <= USB_MAX_INTERFACES); - } - } - if (i < dev->Device->bNumConfigurations) { - return -1; - } - } - - for (i = 0; i < dev->NumInterfaces; i++) { // setup all interfaces for the selected configuration - UsbDescSetInterface(dev, i, 0); - } - for (; i < USB_MAX_INTERFACES; i++) { // null the remaining interfaces - dev->AltSetting[i] = 0; - dev->Ifaces[i] = nullptr; - } - - return 0; -} - -int Hub::UsbDescSetInterface(XboxDeviceState* dev, int index, int value) -{ - const USBDescIface* iface; - int old; - - iface = UsbDescFindInterface(dev, index, value); - if (iface == nullptr) { - return -1; - } - - old = dev->AltSetting[index]; - dev->AltSetting[index] = value; - dev->Ifaces[index] = iface; - UsbDescEpInit(dev); - - if (old != value) { - m_UsbDev->USB_DeviceSetInterface(dev, index, old, value); - } - return 0; -} - -const USBDescIface* Hub::UsbDescFindInterface(XboxDeviceState* dev, int nif, int alt) -{ - const USBDescIface* iface; - int i; - - if (!dev->Config) { // no configuration descriptor here, nothing to search - return nullptr; - } - for (i = 0; i < dev->Config->nif; i++) { // find the desired interface - iface = &dev->Config->ifs[i]; - if (iface->bInterfaceNumber == nif && - iface->bAlternateSetting == alt) { - return iface; - } - } - return nullptr; // not found -} - -void Hub::UsbDescEpInit(XboxDeviceState* dev) -{ - const USBDescIface *iface; - int i, e, pid, ep; - - UsbEpInit(); // reset endpoints (because we changed descriptors in use?) - for (i = 0; i < dev->NumInterfaces; i++) { - iface = dev->Ifaces[i]; - if (iface == nullptr) { - continue; - } - for (e = 0; e < iface->bNumEndpoints; e++) { - // From the standard: - // "bEndpointAddress: - // Bit 3...0: The endpoint number - // Bit 6...4: Reserved, reset to zero - // Bit 7: Direction -> 0 = OUT endpoint, 1 = IN endpoint - // bmAttributes: - // Bit 1..0: Transfer Type - // 00 = Control, 01 = Isochronous, 10 = Bulk, 11 = Interrupt. All other bits are reserved" - pid = (iface->eps[e].bEndpointAddress & USB_DIR_IN) ? USB_TOKEN_IN : USB_TOKEN_OUT; - ep = iface->eps[e].bEndpointAddress & 0xF; - m_UsbDev->USB_EPsetType(dev, pid, ep, iface->eps[e].bmAttributes & 0x03); - m_UsbDev->USB_EPsetIfnum(dev, pid, ep, iface->bInterfaceNumber); - m_UsbDev->USB_EPsetMaxPacketSize(dev, pid, ep, iface->eps[e].wMaxPacketSize); - } } + return ret; } diff --git a/src/devices/usb/Hub.h b/src/devices/usb/Hub.h index 1e908ad7a..60ff83ec3 100644 --- a/src/devices/usb/Hub.h +++ b/src/devices/usb/Hub.h @@ -49,23 +49,25 @@ typedef enum { /* Class which implements a usb hub */ -class Hub final : public UsbPeripheral +class Hub { public: // initialize this peripheral - int Init(int pport) override; + int Init(int pport); // destructor ~Hub(); private: // usb device this hub is attached to - USBDevice* m_UsbDev = nullptr; + USBDevice* m_UsbDev; // hub state - USBHubState* m_HubState = nullptr; + USBHubState* m_HubState; + // hub class functions + USBDeviceClass* m_pPeripheralFuncStruct; // initialize various member variables/functions - void ClassInitFn(); + XboxDeviceState* ClassInitFn(); // see USBDeviceClass for comments about these functions int UsbHub_Initfn(XboxDeviceState* dev); XboxDeviceState* UsbHub_FindDevice(XboxDeviceState* dev, uint8_t addr); @@ -77,34 +79,13 @@ class Hub final : public UsbPeripheral // see USBPortOps struct for info void UsbHub_Attach(USBPort* port1); void UsbHub_Detach(USBPort* port1); - void UsbHub_ChildDetach(USBPort* port1, XboxDeviceState* child); + void UsbHub_ChildDetach(XboxDeviceState* child); void UsbHub_Wakeup(USBPort* port1); void UsbHub_Complete(USBPort* port, USBPacket* packet); - // TODO: perhaps these can be put in UsbPeripheral or USBDevice... - // initialize the endpoints of this peripheral - void UsbEpInit(); - // reset all endpoints of this peripheral - void UsbEpReset(); // reserve a usb port for this hub - int UsbClaimPort(int port); - // - void UsbReleasePort(XboxDeviceState* dev); - // get device descriptor - const USBDesc* GetUsbDeviceDesc(XboxDeviceState* dev); - // create a serial number for the device - void CreateSerial(XboxDeviceState* dev); - // start descriptors initialization - void UsbDescInit(XboxDeviceState* dev); - // set the descriptors to use for this device - void UsbDescSetDefaults(XboxDeviceState* dev); - // set the configuration to use - int UsbDescSetConfig(XboxDeviceState* dev, int value); - // set the interface to use - int UsbDescSetInterface(XboxDeviceState* dev, int index, int value); - // find the interface to use - const USBDescIface* UsbDescFindInterface(XboxDeviceState* dev, int nif, int alt); - // setup endpoints and their descriptors - void UsbDescEpInit(XboxDeviceState* dev); + int UsbHubClaimPort(XboxDeviceState* dev, int port); + // free the usb port used by this hub + void UsbHubReleasePort(XboxDeviceState* dev); }; extern Hub* g_HubObjArray[4]; diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index 765455423..2b24b5a44 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -197,7 +197,7 @@ OHCI::OHCI(int Irq, USBDevice* UsbObj) ops->attach = std::bind(&OHCI::OHCI_Attach, this, _1); ops->detach = std::bind(&OHCI::OHCI_Detach, this, _1); - ops->child_detach = std::bind(&OHCI::OHCI_ChildDetach, this, nullptr, _2); + ops->child_detach = std::bind(&OHCI::OHCI_ChildDetach, this, _1); ops->wakeup = std::bind(&OHCI::OHCI_Wakeup, this, _1); ops->complete = std::bind(&OHCI::OHCI_AsyncCompletePacket, this, _1, _2); } @@ -1448,7 +1448,7 @@ void OHCI::OHCI_Attach(USBPort* Port) } } -void OHCI::OHCI_ChildDetach(USBPort* port, XboxDeviceState* child) +void OHCI::OHCI_ChildDetach(XboxDeviceState* child) { OHCI_AsyncCancelDevice(child); } diff --git a/src/devices/usb/OHCI.h b/src/devices/usb/OHCI.h index 232d4acc8..85efceca7 100644 --- a/src/devices/usb/OHCI.h +++ b/src/devices/usb/OHCI.h @@ -262,7 +262,7 @@ class OHCI // see USBPortOps struct for info void OHCI_Attach(USBPort* Port); void OHCI_Detach(USBPort* Port); - void OHCI_ChildDetach(USBPort* port, XboxDeviceState* child); + void OHCI_ChildDetach(XboxDeviceState* child); void OHCI_Wakeup(USBPort* port1); void OHCI_AsyncCompletePacket(USBPort* port, USBPacket* packet); }; diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index 3b5414603..c9ca86702 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -104,16 +104,6 @@ void USBDevice::USB_PortReset(USBPort* Port) USB_DeviceReset(dev); } -void USBDevice::USB_Detach(USBPort* Port) -{ - XboxDeviceState* dev = Port->Dev; - - assert(dev != nullptr); - assert(dev->State != USB_STATE_NOTATTACHED); - m_HostController->OHCI_Detach(Port); - dev->State = USB_STATE_NOTATTACHED; -} - void USBDevice::USB_Attach(USBPort* Port) { XboxDeviceState* dev = Port->Dev; @@ -126,6 +116,25 @@ void USBDevice::USB_Attach(USBPort* Port) USB_DeviceHandleAttach(dev); } +void USBDevice::USB_Detach(USBPort* Port) +{ + XboxDeviceState* dev = Port->Dev; + + assert(dev != nullptr); + assert(dev->State != USB_STATE_NOTATTACHED); + m_HostController->OHCI_Detach(Port); + dev->State = USB_STATE_NOTATTACHED; +} + +void USBDevice::USB_Wakeup(USBEndpoint* ep) +{ + XboxDeviceState* dev = ep->Dev; + + if (dev->RemoteWakeup && dev->Port && dev->Port->Operations->wakeup) { + dev->Port->Operations->wakeup(dev->Port); + } +} + void USBDevice::USB_DeviceReset(XboxDeviceState* dev) { if (dev == nullptr || !dev->Attached) { @@ -644,3 +653,222 @@ void USBDevice::USB_DeviceAttach(XboxDeviceState* dev) dev->Attached++; USB_Attach(port); } + +void USBDevice::UsbEpInit(XboxDeviceState* dev) +{ + UsbEpReset(dev); + QTAILQ_INIT(&dev->EP_ctl.Queue); + for (int ep = 0; ep < USB_MAX_ENDPOINTS; ep++) { + QTAILQ_INIT(&dev->EP_in[ep].Queue); + QTAILQ_INIT(&dev->EP_out[ep].Queue); + } +} + +void USBDevice::UsbEpReset(XboxDeviceState* dev) +{ + dev->EP_ctl.Num = 0; + dev->EP_ctl.Type = USB_ENDPOINT_XFER_CONTROL; + dev->EP_ctl.IfNum = 0; + dev->EP_ctl.MaxPacketSize = 64; + dev->EP_ctl.Dev = dev; + dev->EP_ctl.Pipeline = false; + for (int ep = 0; ep < USB_MAX_ENDPOINTS; ep++) { + dev->EP_in[ep].Num = ep + 1; + dev->EP_out[ep].Num = ep + 1; + dev->EP_in[ep].pid = USB_TOKEN_IN; + dev->EP_out[ep].pid = USB_TOKEN_OUT; + dev->EP_in[ep].Type = USB_ENDPOINT_XFER_INVALID; + dev->EP_out[ep].Type = USB_ENDPOINT_XFER_INVALID; + dev->EP_in[ep].IfNum = USB_INTERFACE_INVALID; + dev->EP_out[ep].IfNum = USB_INTERFACE_INVALID; + dev->EP_in[ep].MaxPacketSize = 0; + dev->EP_out[ep].MaxPacketSize = 0; + dev->EP_in[ep].Dev = dev; + dev->EP_out[ep].Dev = dev; + dev->EP_in[ep].Pipeline = false; + dev->EP_out[ep].Pipeline = false; + } +} + +/* +* From XQEMU: +* This function creates a serial number for a usb device. +* The serial number should: +* (a) Be unique within the emulator. +* (b) Be constant, so you don't get a new one each +* time the guest is started. +* So we are using the physical location to generate a serial number +* from it. It has three pieces: First a fixed, device-specific +* prefix. Second the device path of the host controller (which is +* the pci address in most cases). Third the physical port path. +* Results in serial numbers like this: "314159-0000:00:1d.7-3". +*/ +void USBDevice::CreateSerial(XboxDeviceState* dev) +{ + const USBDesc* desc = GetUsbDeviceDesc(dev); + int index = desc->id.iSerialNumber; + USBDescString* s; + char serial[64]; + char* path; + int dst; + + assert(index != 0 && desc->str[index] != NULL); + dst = std::snprintf(serial, sizeof(serial), "%s", desc->str[index]); + dst += std::snprintf(serial + dst, sizeof(serial) - dst, "-%s", m_PciPath); + dst += std::snprintf(serial + dst, sizeof(serial) - dst, "-%s", dev->Port->Path); + + QLIST_FOREACH(s, &dev->Strings, next) { + if (s->index == index) { + break; + } + } + + if (s == nullptr) { + s = new USBDescString; + s->index = index; + QLIST_INSERT_HEAD(&dev->Strings, s, next); + } + + s->str = serial; +} + +const USBDesc* USBDevice::GetUsbDeviceDesc(XboxDeviceState* dev) +{ + USBDeviceClass* klass = dev->klass; + if (dev->UsbDesc) { + return dev->UsbDesc; + } + return klass->usb_desc; +} + +void USBDevice::UsbDescInit(XboxDeviceState* dev) +{ + const USBDesc* desc = GetUsbDeviceDesc(dev); + + assert(desc != NULL); + dev->Speed = USB_SPEED_FULL; + dev->SpeedMask = 0; + if (desc->full) { + dev->SpeedMask |= USB_SPEED_MASK_FULL; + } + UsbDescSetDefaults(dev); +} + +void USBDevice::UsbDescSetDefaults(XboxDeviceState* dev) +{ + const USBDesc *desc = GetUsbDeviceDesc(dev); + + assert(desc != NULL); + switch (dev->Speed) { + case USB_SPEED_LOW: + case USB_SPEED_FULL: { + dev->Device = desc->full; + break; + } + default: + EmuWarning("Unknown speed parameter %d set in %s", dev->ProductDesc.c_str()); + } + UsbDescSetConfig(dev, 0); +} + +int USBDevice::UsbDescSetConfig(XboxDeviceState* dev, int value) +{ + int i; + + if (value == 0) { // default configuration + dev->Configuration = 0; + dev->NumInterfaces = 0; + dev->Config = nullptr; + } + else { + for (i = 0; i < dev->Device->bNumConfigurations; i++) { // select the configuration specified + if (dev->Device->confs[i].bConfigurationValue == value) { + dev->Configuration = value; + dev->NumInterfaces = dev->Device->confs[i].bNumInterfaces; + dev->Config = dev->Device->confs + i; + assert(dev->NumInterfaces <= USB_MAX_INTERFACES); + } + } + if (i < dev->Device->bNumConfigurations) { + return -1; + } + } + + for (i = 0; i < dev->NumInterfaces; i++) { // setup all interfaces for the selected configuration + UsbDescSetInterface(dev, i, 0); + } + for (; i < USB_MAX_INTERFACES; i++) { // null the remaining interfaces + dev->AltSetting[i] = 0; + dev->Ifaces[i] = nullptr; + } + + return 0; +} + +int USBDevice::UsbDescSetInterface(XboxDeviceState* dev, int index, int value) +{ + const USBDescIface* iface; + int old; + + iface = UsbDescFindInterface(dev, index, value); + if (iface == nullptr) { + return -1; + } + + old = dev->AltSetting[index]; + dev->AltSetting[index] = value; + dev->Ifaces[index] = iface; + UsbDescEpInit(dev); + + if (old != value) { + USB_DeviceSetInterface(dev, index, old, value); + } + return 0; +} + +const USBDescIface* USBDevice::UsbDescFindInterface(XboxDeviceState* dev, int nif, int alt) +{ + const USBDescIface* iface; + int i; + + if (!dev->Config) { // no configuration descriptor here, nothing to search + return nullptr; + } + for (i = 0; i < dev->Config->nif; i++) { // find the desired interface + iface = &dev->Config->ifs[i]; + if (iface->bInterfaceNumber == nif && + iface->bAlternateSetting == alt) { + return iface; + } + } + return nullptr; // not found +} + +void USBDevice::UsbDescEpInit(XboxDeviceState* dev) +{ + const USBDescIface *iface; + int i, e, pid, ep; + + UsbEpInit(dev); // reset endpoints (because we changed descriptors in use?) + for (i = 0; i < dev->NumInterfaces; i++) { + iface = dev->Ifaces[i]; + if (iface == nullptr) { + continue; + } + for (e = 0; e < iface->bNumEndpoints; e++) { + // From the standard: + // "bEndpointAddress: + // Bit 3...0: The endpoint number + // Bit 6...4: Reserved, reset to zero + // Bit 7: Direction -> 0 = OUT endpoint, 1 = IN endpoint + // bmAttributes: + // Bit 1..0: Transfer Type + // 00 = Control, 01 = Isochronous, 10 = Bulk, 11 = Interrupt. All other bits are reserved" + pid = (iface->eps[e].bEndpointAddress & USB_DIR_IN) ? USB_TOKEN_IN : USB_TOKEN_OUT; + ep = iface->eps[e].bEndpointAddress & 0xF; + USB_EPsetType(dev, pid, ep, iface->eps[e].bmAttributes & 0x03); + USB_EPsetIfnum(dev, pid, ep, iface->bInterfaceNumber); + USB_EPsetMaxPacketSize(dev, pid, ep, iface->eps[e].wMaxPacketSize); + } + } +} diff --git a/src/devices/usb/USBDevice.h b/src/devices/usb/USBDevice.h index 150fd082e..6c75903ab 100644 --- a/src/devices/usb/USBDevice.h +++ b/src/devices/usb/USBDevice.h @@ -80,14 +80,14 @@ class USBDevice : public PCIDevice { void USB_Detach(USBPort* Port); // a device downstream from the device attached to the port (attached through a hub) is detached void ChildDetach(USBPort* Port, XboxDeviceState* Child); - // TODO - void Wakeup(USBPort* Port); + // update port status when a device is detached + void USB_Wakeup(USBEndpoint* ep); // TODO void Complete(USBPort* Port, USBPacket *P); // reset a device void USB_DeviceReset(XboxDeviceState* Dev); - // - XboxDeviceState* USB_DeviceFindDevice(XboxDeviceState* Dev, uint8_t Addr); + // find the device connected to the supplied port and address + XboxDeviceState* USB_FindDevice(USBPort* Port, uint8_t Addr); // find the requested endpoint in the supplied device USBEndpoint* USB_GetEP(XboxDeviceState* Dev, int Pid, int Ep); // setup a packet for transfer @@ -121,7 +121,7 @@ class USBDevice : public PCIDevice { // call usb class init function int USB_DeviceInit(XboxDeviceState* dev); // call usb class find_device function - XboxDeviceState* USB_FindDevice(USBPort* Port, uint8_t Addr); + XboxDeviceState* USB_DeviceFindDevice(XboxDeviceState* Dev, uint8_t Addr); // call usb class cancel_packet function void USB_DeviceCancelPacket(XboxDeviceState* dev, USBPacket* p); // call usb class handle_destroy function @@ -148,6 +148,26 @@ class USBDevice : public PCIDevice { void USB_EPsetMaxPacketSize(XboxDeviceState* dev, int pid, int ep, uint16_t raw); // assign port numbers (also for hubs) void USB_PortLocation(USBPort* downstream, USBPort* upstream, int portnr); + // initialize the endpoints of this peripheral + void UsbEpInit(XboxDeviceState* dev); + // reset all endpoints of this peripheral + void UsbEpReset(XboxDeviceState* dev); + // create a serial number for the device + void CreateSerial(XboxDeviceState* dev); + // start descriptors initialization + void UsbDescInit(XboxDeviceState* dev); + // get device descriptor + const USBDesc* GetUsbDeviceDesc(XboxDeviceState* dev); + // set the descriptors to use for this device + void UsbDescSetDefaults(XboxDeviceState* dev); + // set the configuration to use + int UsbDescSetConfig(XboxDeviceState* dev, int value); + // set the interface to use + int UsbDescSetInterface(XboxDeviceState* dev, int index, int value); + // find the interface to use + const USBDescIface* UsbDescFindInterface(XboxDeviceState* dev, int nif, int alt); + // setup endpoints and their descriptors + void UsbDescEpInit(XboxDeviceState* dev); }; #endif diff --git a/src/devices/usb/UsbCommon.h b/src/devices/usb/UsbCommon.h index ee826f3ce..69d1e5dc3 100644 --- a/src/devices/usb/UsbCommon.h +++ b/src/devices/usb/UsbCommon.h @@ -113,6 +113,9 @@ struct USBDescEndpoint { uint8_t is_audio; /* has bRefresh + bSynchAddress */ uint8_t* extra; + + // Dropped from XQEMU the parameters bMaxBurst, bmAttributes_super and wBytesPerInterval because those are only defined for + // superspeed (usb 3.0) devices in the superspeed endpoint companion }; /* Interface descriptor */ @@ -201,7 +204,7 @@ struct XboxDeviceState { uint32_t flags; USBDeviceClass* klass; // usb class struct of this device - int Speed; // actual connected speed + int Speed; // actual speed of the connected device int SpeedMask; // supported speeds, not in info because it may be variable (hostdevs) uint8_t Addr; // device function address std::string ProductDesc; // the friendly name of this device @@ -262,7 +265,7 @@ struct USBPortOps { * This gets called when a device downstream from the device attached to * the port (attached through a hub) gets detached. */ - std::function child_detach; + std::function child_detach; std::function wakeup; /* * Note that port->dev will be different then the device from which @@ -278,7 +281,7 @@ struct USBPort { int SpeedMask; // usb speeds supported int HubCount; // number of hubs chained char Path[16]; // the number of the port + 1, used to create a serial number for this device - int PortIndex; // internal port index against this HC + int PortIndex; // internal port index }; /* Struct which stores general functions/variables regarding the peripheral */ @@ -329,16 +332,4 @@ struct USBDeviceClass { const USBDesc* usb_desc; // device descriptor }; - -/* Abstract class representing a usb peripheral */ -class UsbPeripheral -{ - protected: - USBDeviceClass* m_pPeripheralFuncStruct; - XboxDeviceState* m_pDeviceStruct; - - virtual int Init(int pport) = 0; - -}; - #endif From 42f54aeadcae059cf435d8f1b94ff1f7a06e07a3 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Thu, 5 Jul 2018 00:18:35 +0200 Subject: [PATCH 0046/1000] Implemented usb requests commands + small refactoring --- src/CxbxCommon.h | 8 +- src/devices/usb/Hub.cpp | 99 +------ src/devices/usb/Hub.h | 6 +- src/devices/usb/USBDevice.cpp | 485 ++++++++++++++++++++++++++++++---- src/devices/usb/USBDevice.h | 42 ++- src/devices/usb/UsbCommon.h | 134 +++++++++- 6 files changed, 604 insertions(+), 170 deletions(-) diff --git a/src/CxbxCommon.h b/src/CxbxCommon.h index 37b2be22e..1a1bd25cc 100644 --- a/src/CxbxCommon.h +++ b/src/CxbxCommon.h @@ -189,11 +189,7 @@ void GetDwords(xbaddr Paddr, uint32_t* Buffer, int Number); void GetWords(xbaddr Paddr, uint16_t* Buffer, int Number); void WriteWords(xbaddr Paddr, uint16_t* Buffer, int Number); -// Calculate a struct base address from a pointer to a member of it -#ifndef container_of -#define container_of(address, type, field) ((type *)( \ - (int8_t*)(address) - \ - (uint32_t)(&((type *)0)->field))) -#endif +#define GET_WORD_LOW(value) (uint8_t)((value) & 0xFF) +#define GET_WORD_HIGH(value) (uint8_t)(((value) >> 8) & 0xFF) #endif diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index d0b2ab894..98b65006d 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -138,8 +138,6 @@ USBDescDevice::~USBDescDevice() static const USBDescDevice desc_device_hub(true); -static USBDescStrings desc_strings = { nullptr, "Cxbx-Reloaded", "Cxbx-Reloaded USB Hub", "314159" }; - USBDesc::USBDesc(bool bDefault) { std::memset(this, 0, sizeof(USBDesc)); @@ -151,7 +149,6 @@ USBDesc::USBDesc(bool bDefault) id.iProduct = STR_PRODUCT; id.iSerialNumber = STR_SERIALNUMBER; full = &desc_device_hub; - str = desc_strings; } } @@ -160,7 +157,7 @@ static const USBDesc desc_hub(true); int Hub::Init(int pport) { XboxDeviceState* dev = ClassInitFn(); - m_UsbDev->UsbEpInit(dev); + m_UsbDev->USB_EpInit(dev); int rc = UsbHubClaimPort(dev, pport); if (rc != 0) { return rc; @@ -252,8 +249,10 @@ int Hub::UsbHub_Initfn(XboxDeviceState* dev) return -1; } - m_UsbDev->CreateSerial(dev); - m_UsbDev->UsbDescInit(dev); + m_UsbDev->USB_CreateSerial(dev, "314159"); + m_UsbDev->USBDesc_SetString(dev, STR_MANUFACTURER, "Cxbx-Reloaded"); + m_UsbDev->USBDesc_SetString(dev, STR_PRODUCT, "Cxbx-Reloaded USB Hub"); + m_UsbDev->USBDesc_Init(dev); m_HubState->intr = m_UsbDev->USB_GetEP(dev, USB_TOKEN_IN, 1); ops = new USBPortOps(); @@ -318,7 +317,7 @@ void Hub::UsbHub_HandleControl(XboxDeviceState* dev, USBPacket* p, USBHubState *s = (USBHubState *)dev; int ret; - ret = usb_desc_handle_control(dev, p, request, value, index, length, data); + ret = m_UsbDev->USBDesc_HandleControl(dev, p, request, value, index, length, data); if (ret >= 0) { return; } @@ -520,89 +519,3 @@ void Hub::UsbHub_Complete(USBPort* port, USBPacket* packet) // Just pass it along to upstream m_HubState->dev.Port->Operations->complete(m_HubState->dev.Port, packet); } - -int usb_desc_handle_control(USBDevice *dev, USBPacket *p, - int request, int value, int index, int length, uint8_t *data) -{ - const USBDesc *desc = usb_device_get_usb_desc(dev); - int ret = -1; - - assert(desc != NULL); - switch (request) { - case DeviceOutRequest | USB_REQ_SET_ADDRESS: - dev->addr = value; - trace_usb_set_addr(dev->addr); - ret = 0; - break; - - case DeviceRequest | USB_REQ_GET_DESCRIPTOR: - ret = usb_desc_get_descriptor(dev, p, value, data, length); - break; - - case DeviceRequest | USB_REQ_GET_CONFIGURATION: - /* - * 9.4.2: 0 should be returned if the device is unconfigured, otherwise - * the non zero value of bConfigurationValue. - */ - data[0] = dev->config ? dev->config->bConfigurationValue : 0; - p->actual_length = 1; - ret = 0; - break; - case DeviceOutRequest | USB_REQ_SET_CONFIGURATION: - ret = usb_desc_set_config(dev, value); - trace_usb_set_config(dev->addr, value, ret); - break; - - case DeviceRequest | USB_REQ_GET_STATUS: { - const USBDescConfig *config = dev->config ? - dev->config : &dev->device->confs[0]; - - data[0] = 0; - /* - * Default state: Device behavior when this request is received while - * the device is in the Default state is not specified. - * We return the same value that a configured device would return if - * it used the first configuration. - */ - if (config->bmAttributes & 0x40) { - data[0] |= 1 << USB_DEVICE_SELF_POWERED; - } - if (dev->remote_wakeup) { - data[0] |= 1 << USB_DEVICE_REMOTE_WAKEUP; - } - data[1] = 0x00; - p->actual_length = 2; - ret = 0; - break; - } - case DeviceOutRequest | USB_REQ_CLEAR_FEATURE: - if (value == USB_DEVICE_REMOTE_WAKEUP) { - dev->remote_wakeup = 0; - ret = 0; - } - trace_usb_clear_device_feature(dev->addr, value, ret); - break; - case DeviceOutRequest | USB_REQ_SET_FEATURE: - if (value == USB_DEVICE_REMOTE_WAKEUP) { - dev->remote_wakeup = 1; - ret = 0; - } - trace_usb_set_device_feature(dev->addr, value, ret); - break; - - case InterfaceRequest | USB_REQ_GET_INTERFACE: - if (index < 0 || index >= dev->ninterfaces) { - break; - } - data[0] = dev->altsetting[index]; - p->actual_length = 1; - ret = 0; - break; - case InterfaceOutRequest | USB_REQ_SET_INTERFACE: - ret = usb_desc_set_interface(dev, index, value); - trace_usb_set_interface(dev->addr, index, value, ret); - break; - - } - return ret; -} diff --git a/src/devices/usb/Hub.h b/src/devices/usb/Hub.h index 60ff83ec3..889968dac 100644 --- a/src/devices/usb/Hub.h +++ b/src/devices/usb/Hub.h @@ -60,11 +60,11 @@ class Hub private: // usb device this hub is attached to - USBDevice* m_UsbDev; + USBDevice* m_UsbDev = nullptr; // hub state - USBHubState* m_HubState; + USBHubState* m_HubState = nullptr; // hub class functions - USBDeviceClass* m_pPeripheralFuncStruct; + USBDeviceClass* m_pPeripheralFuncStruct = nullptr; // initialize various member variables/functions XboxDeviceState* ClassInitFn(); diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index c9ca86702..1f71d1ffe 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -322,17 +322,17 @@ void USBDevice::USB_DoParameter(XboxDeviceState* s, USBPacket* p) value = (s->SetupBuffer[3] << 8) | s->SetupBuffer[2]; index = (s->SetupBuffer[5] << 8) | s->SetupBuffer[4]; - if (s->SetupLength > sizeof(s->data_buf)) { - DbgPrintf("Usb: ctrl buffer too small (%d > %zu)\n", s->SetupLength, sizeof(s->data_buf)); + if (s->SetupLength > sizeof(s->DataBuffer)) { + DbgPrintf("Usb: ctrl buffer too small (%d > %zu)\n", s->SetupLength, sizeof(s->DataBuffer)); p->Status = USB_RET_STALL; return; } if (p->Pid == USB_TOKEN_OUT) { - USB_PacketCopy(p, s->data_buf, s->SetupLength); + USB_PacketCopy(p, s->DataBuffer, s->SetupLength); } - USB_DeviceHandleControl(s, p, request, value, index, s->SetupLength, s->data_buf); + USB_DeviceHandleControl(s, p, request, value, index, s->SetupLength, s->DataBuffer); if (p->Status == USB_RET_ASYNC) { return; } @@ -342,7 +342,7 @@ void USBDevice::USB_DoParameter(XboxDeviceState* s, USBPacket* p) } if (p->Pid == USB_TOKEN_IN) { p->ActualLength = 0; - USB_PacketCopy(p, s->data_buf, s->SetupLength); + USB_PacketCopy(p, s->DataBuffer, s->SetupLength); } } @@ -374,7 +374,7 @@ void USBDevice::USB_DoTokenSetup(XboxDeviceState* s, USBPacket* p) index = (s->SetupBuffer[5] << 8) | s->SetupBuffer[4]; if (s->SetupBuffer[0] & USB_DIR_IN) { - USB_DeviceHandleControl(s, p, request, value, index, s->SetupLength, s->data_buf); + USB_DeviceHandleControl(s, p, request, value, index, s->SetupLength, s->DataBuffer); if (p->Status == USB_RET_ASYNC) { s->SetupState = SETUP_STATE_SETUP; } @@ -388,8 +388,8 @@ void USBDevice::USB_DoTokenSetup(XboxDeviceState* s, USBPacket* p) s->SetupState = SETUP_STATE_DATA; } else { - if (s->SetupLength > sizeof(s->data_buf)) { - DbgPrintf("Usb: ctrl buffer too small (%d > %zu)\n", s->SetupLength, sizeof(s->data_buf)); + if (s->SetupLength > sizeof(s->DataBuffer)) { + DbgPrintf("Usb: ctrl buffer too small (%d > %zu)\n", s->SetupLength, sizeof(s->DataBuffer)); p->Status = USB_RET_STALL; return; } @@ -417,7 +417,7 @@ void USBDevice::DoTokenIn(XboxDeviceState* s, USBPacket* p) switch (s->SetupState) { case SETUP_STATE_ACK: if (!(s->SetupBuffer[0] & USB_DIR_IN)) { - USB_DeviceHandleControl(s, p, request, value, index, s->SetupLength, s->data_buf); + USB_DeviceHandleControl(s, p, request, value, index, s->SetupLength, s->DataBuffer); if (p->Status == USB_RET_ASYNC) { return; } @@ -432,7 +432,7 @@ void USBDevice::DoTokenIn(XboxDeviceState* s, USBPacket* p) if (len > p->IoVec.Size) { len = p->IoVec.Size; } - USB_PacketCopy(p, s->data_buf + s->SetupIndex, len); + USB_PacketCopy(p, s->DataBuffer + s->SetupIndex, len); s->SetupIndex += len; if (s->SetupIndex >= s->SetupLength) { s->SetupState = SETUP_STATE_ACK; @@ -469,7 +469,7 @@ void USBDevice::DoTokenOut(XboxDeviceState* s, USBPacket* p) if (len > p->IoVec.Size) { len = p->IoVec.Size; } - USB_PacketCopy(p, s->data_buf + s->SetupIndex, len); + USB_PacketCopy(p, s->DataBuffer + s->SetupIndex, len); s->SetupIndex += len; if (s->SetupIndex >= s->SetupLength) { s->SetupState = SETUP_STATE_ACK; @@ -654,9 +654,9 @@ void USBDevice::USB_DeviceAttach(XboxDeviceState* dev) USB_Attach(port); } -void USBDevice::UsbEpInit(XboxDeviceState* dev) +void USBDevice::USB_EpInit(XboxDeviceState* dev) { - UsbEpReset(dev); + USB_EpReset(dev); QTAILQ_INIT(&dev->EP_ctl.Queue); for (int ep = 0; ep < USB_MAX_ENDPOINTS; ep++) { QTAILQ_INIT(&dev->EP_in[ep].Queue); @@ -664,7 +664,7 @@ void USBDevice::UsbEpInit(XboxDeviceState* dev) } } -void USBDevice::UsbEpReset(XboxDeviceState* dev) +void USBDevice::USB_EpReset(XboxDeviceState* dev) { dev->EP_ctl.Num = 0; dev->EP_ctl.Type = USB_ENDPOINT_XFER_CONTROL; @@ -703,36 +703,24 @@ void USBDevice::UsbEpReset(XboxDeviceState* dev) * the pci address in most cases). Third the physical port path. * Results in serial numbers like this: "314159-0000:00:1d.7-3". */ -void USBDevice::CreateSerial(XboxDeviceState* dev) +void USBDevice::USB_CreateSerial(XboxDeviceState* dev, const char* str) { - const USBDesc* desc = GetUsbDeviceDesc(dev); + const USBDesc* desc = USBDesc_GetUsbDeviceDesc(dev); int index = desc->id.iSerialNumber; USBDescString* s; char serial[64]; char* path; int dst; - assert(index != 0 && desc->str[index] != NULL); - dst = std::snprintf(serial, sizeof(serial), "%s", desc->str[index]); + assert(index != 0 && str != nullptr); + dst = std::snprintf(serial, sizeof(serial), "%s", str); dst += std::snprintf(serial + dst, sizeof(serial) - dst, "-%s", m_PciPath); - dst += std::snprintf(serial + dst, sizeof(serial) - dst, "-%s", dev->Port->Path); + std::snprintf(serial + dst, sizeof(serial) - dst, "-%s", dev->Port->Path); - QLIST_FOREACH(s, &dev->Strings, next) { - if (s->index == index) { - break; - } - } - - if (s == nullptr) { - s = new USBDescString; - s->index = index; - QLIST_INSERT_HEAD(&dev->Strings, s, next); - } - - s->str = serial; + USBDesc_SetString(dev, index, serial); } -const USBDesc* USBDevice::GetUsbDeviceDesc(XboxDeviceState* dev) +const USBDesc* USBDevice::USBDesc_GetUsbDeviceDesc(XboxDeviceState* dev) { USBDeviceClass* klass = dev->klass; if (dev->UsbDesc) { @@ -741,9 +729,9 @@ const USBDesc* USBDevice::GetUsbDeviceDesc(XboxDeviceState* dev) return klass->usb_desc; } -void USBDevice::UsbDescInit(XboxDeviceState* dev) +void USBDevice::USBDesc_Init(XboxDeviceState* dev) { - const USBDesc* desc = GetUsbDeviceDesc(dev); + const USBDesc* desc = USBDesc_GetUsbDeviceDesc(dev); assert(desc != NULL); dev->Speed = USB_SPEED_FULL; @@ -751,12 +739,12 @@ void USBDevice::UsbDescInit(XboxDeviceState* dev) if (desc->full) { dev->SpeedMask |= USB_SPEED_MASK_FULL; } - UsbDescSetDefaults(dev); + USBDesc_SetDefaults(dev); } -void USBDevice::UsbDescSetDefaults(XboxDeviceState* dev) +void USBDevice::USBDesc_SetDefaults(XboxDeviceState* dev) { - const USBDesc *desc = GetUsbDeviceDesc(dev); + const USBDesc *desc = USBDesc_GetUsbDeviceDesc(dev); assert(desc != NULL); switch (dev->Speed) { @@ -768,10 +756,10 @@ void USBDevice::UsbDescSetDefaults(XboxDeviceState* dev) default: EmuWarning("Unknown speed parameter %d set in %s", dev->ProductDesc.c_str()); } - UsbDescSetConfig(dev, 0); + USBDesc_SetConfig(dev, 0); } -int USBDevice::UsbDescSetConfig(XboxDeviceState* dev, int value) +int USBDevice::USBDesc_SetConfig(XboxDeviceState* dev, int value) { int i; @@ -795,7 +783,7 @@ int USBDevice::UsbDescSetConfig(XboxDeviceState* dev, int value) } for (i = 0; i < dev->NumInterfaces; i++) { // setup all interfaces for the selected configuration - UsbDescSetInterface(dev, i, 0); + USBDesc_SetInterface(dev, i, 0); } for (; i < USB_MAX_INTERFACES; i++) { // null the remaining interfaces dev->AltSetting[i] = 0; @@ -805,12 +793,12 @@ int USBDevice::UsbDescSetConfig(XboxDeviceState* dev, int value) return 0; } -int USBDevice::UsbDescSetInterface(XboxDeviceState* dev, int index, int value) +int USBDevice::USBDesc_SetInterface(XboxDeviceState* dev, int index, int value) { const USBDescIface* iface; int old; - iface = UsbDescFindInterface(dev, index, value); + iface = USBDesc_FindInterface(dev, index, value); if (iface == nullptr) { return -1; } @@ -818,7 +806,7 @@ int USBDevice::UsbDescSetInterface(XboxDeviceState* dev, int index, int value) old = dev->AltSetting[index]; dev->AltSetting[index] = value; dev->Ifaces[index] = iface; - UsbDescEpInit(dev); + USBDesc_EpInit(dev); if (old != value) { USB_DeviceSetInterface(dev, index, old, value); @@ -826,7 +814,7 @@ int USBDevice::UsbDescSetInterface(XboxDeviceState* dev, int index, int value) return 0; } -const USBDescIface* USBDevice::UsbDescFindInterface(XboxDeviceState* dev, int nif, int alt) +const USBDescIface* USBDevice::USBDesc_FindInterface(XboxDeviceState* dev, int nif, int alt) { const USBDescIface* iface; int i; @@ -844,12 +832,12 @@ const USBDescIface* USBDevice::UsbDescFindInterface(XboxDeviceState* dev, int ni return nullptr; // not found } -void USBDevice::UsbDescEpInit(XboxDeviceState* dev) +void USBDevice::USBDesc_EpInit(XboxDeviceState* dev) { const USBDescIface *iface; int i, e, pid, ep; - UsbEpInit(dev); // reset endpoints (because we changed descriptors in use?) + USB_EpInit(dev); // reset endpoints (because we changed descriptors in use?) for (i = 0; i < dev->NumInterfaces; i++) { iface = dev->Ifaces[i]; if (iface == nullptr) { @@ -872,3 +860,406 @@ void USBDevice::UsbDescEpInit(XboxDeviceState* dev) } } } + +int USBDevice::USBDesc_HandleControl(XboxDeviceState* dev, USBPacket *p, + int request, int value, int index, int length, uint8_t* data) +{ + const USBDesc* desc = USBDesc_GetUsbDeviceDesc(dev); + int ret = -1; + + assert(desc != nullptr); + switch (request) { + case DeviceOutRequest | USB_REQ_SET_ADDRESS: { + // From the standard: "This request sets the device address for all future device accesses. + // The wValue field specifies the device address to use for all subsequent accesses" + dev->Addr = value; + DbgPrintf("Address 0x%X set for device %s", dev->Addr, dev->ProductDesc.c_str()); + ret = 0; + break; + } + + case DeviceRequest | USB_REQ_GET_DESCRIPTOR: { + // From the standard: "This request returns the specified descriptor if the descriptor exists. + // The wValue field specifies the descriptor type in the high byte and the descriptor index in the low byte. + // The wIndex field specifies the Language ID for string descriptors or is reset to zero for other descriptors" + ret = USBDesc_HandleStandardGetDescriptor(dev, p, value, data, length); + break; + } + + case DeviceRequest | USB_REQ_GET_CONFIGURATION: { + // From the standard: "This request returns the current device configuration value. + // If the returned value is zero, the device is not configured" + data[0] = dev->Config ? dev->Config->bConfigurationValue : 0; + p->ActualLength = 1; + ret = 0; + break; + } + + case DeviceOutRequest | USB_REQ_SET_CONFIGURATION: { + // From the standard: "This request sets the device configuration. The lower byte of the wValue field specifies the desired configuration. + // This configuration value must be zero or match a configuration value from a configuration descriptor" + ret = USBDesc_SetConfig(dev, value); + DbgPrintf("Received standard SetConfiguration() request for device at address 0x%X. Configuration selected is %d and returned %d\n", + dev->Addr, value, ret); + break; + } + + case DeviceRequest | USB_REQ_GET_STATUS: { + // From the standard: "This request returns the status for the specified recipient. The Recipient bits of the bmRequestType field + // specify the desired recipient. The data returned is the current status of the specified recipient." + // From XQEMU: + /* Default state: Device behavior when this request is received while + * the device is in the Default state is not specified. + * We return the same value that a configured device would return if + * it used the first configuration. */ + const USBDescConfig* config = dev->Config ? dev->Config : &dev->Device->confs[0]; + data[0] = 0; + if (config->bmAttributes & 0x40) { + data[0] |= 1 << USB_DEVICE_SELF_POWERED; + } + if (dev->RemoteWakeup) { + data[0] |= 1 << USB_DEVICE_REMOTE_WAKEUP; + } + data[1] = 0x00; + p->ActualLength = 2; + ret = 0; + break; + } + + case DeviceOutRequest | USB_REQ_CLEAR_FEATURE: { + // From the standard: "This request is used to clear or disable a specific feature. + // Feature selector values in wValue must be appropriate to the recipient" + if (value == USB_DEVICE_REMOTE_WAKEUP) { + dev->RemoteWakeup = 0; + ret = 0; + } + DbgPrintf("Received standard ClearFeature() request for device at address 0x%X. Feature selected is %d and returned %d\n", + dev->Addr, value, ret); + break; + } + + case DeviceOutRequest | USB_REQ_SET_FEATURE: { + // From the standard: "This request is used to set or enable a specific feature. + // Feature selector values in wValue must be appropriate to the recipient" + if (value == USB_DEVICE_REMOTE_WAKEUP) { + dev->RemoteWakeup = 1; + ret = 0; + } + DbgPrintf("Received standard SetFeature() request for device at address 0x%X. Feature selected is %d and returned %d\n", + dev->Addr, value, ret); + break; + } + + case InterfaceRequest | USB_REQ_GET_INTERFACE: { + // From the standard: "This request returns the selected alternate setting for the specified interface. + // wValue = Zero; wIndex = Interface" + if (index < 0 || index >= dev->NumInterfaces) { + break; + } + data[0] = dev->AltSetting[index]; + p->ActualLength = 1; + ret = 0; + break; + } + + case InterfaceOutRequest | USB_REQ_SET_INTERFACE: { + // From the standard: "This request allows the host to select an alternate setting for the specified interface" + // wValue = Alternative Setting; wIndex = Interface + ret = USBDesc_SetInterface(dev, index, value); + DbgPrintf("Received standard SetInterface() request for device at address 0x%X. Interface selected is %d, Alternative Setting \ +is %d and returned %d\n", dev->Addr, index, value, ret); + break; + } + + default: + } + return ret; +} + +int USBDevice::USBDesc_HandleStandardGetDescriptor(XboxDeviceState* dev, USBPacket* p, + int value, uint8_t* dest, size_t len) +{ + const USBDesc* desc = USBDesc_GetUsbDeviceDesc(dev); + uint8_t buf[256]; + uint8_t type = value >> 8; // recover descriptor type from wValue + uint8_t index = value & 0xFF; // recover descriptor index from wValue + int ret = -1; + int flags = 0; + + // Dropped from XQEMU bcdUSB check for usb 3.0 devices + + // From the standard: "The standard request to a device supports three types of descriptors: DEVICE, CONFIGURATION, and STRING." + + switch (type) { + case USB_DT_DEVICE: { + ret = USB_ReadDeviceDesc(&desc->id, dev->Device, buf, sizeof(buf)); + DbgPrintf("Read operation of device descriptor of device 0x%X returns %d\n", dev->Addr, ret); + break; + } + + case USB_DT_CONFIG: { + if (index < dev->Device->bNumConfigurations) { + ret = USB_ReadConfigurationDesc(dev->Device->confs + index, flags, buf, sizeof(buf)); + } + DbgPrintf("Read operation of configuration descriptor %d of device 0x%X returns %d\n", index, dev->Addr, ret); + break; + } + + case USB_DT_STRING: { + ret = USB_ReadStringDesc(dev, index, buf, sizeof(buf)); + DbgPrintf("Read operation of string descriptor %d of device 0x%X returns %d\n", index, dev->Addr, ret); + break; + } + + // Dropped from XQEMU descriptor types USB_DT_DEVICE_QUALIFIER (6), USB_DT_OTHER_SPEED_CONFIG (7) -> usb 2.0 only and reserved on usb 3.0, + // USB_DT_BOS (15) and USB_DT_DEBUG (10) -> usb 3.0 only + + default: + EmuWarning("%s: device address %d unknown type %d (len %zd)", __func__, dev->Addr, type, len); + break; + } + + if (ret > 0) { + if (ret > len) { + ret = len; + } + std::memcpy(dest, buf, ret); + p->ActualLength = ret; + ret = 0; + } + return ret; +} + +int USBDevice::USB_ReadDeviceDesc(const USBDescID* id, const USBDescDevice* dev, uint8_t* dest, size_t len) +{ + uint8_t bLength = 0x12; // a device descriptor is 18 bytes large + USBDescriptor* d = reinterpret_cast(dest); + + if (len < bLength) { + return -1; + } + + d->bLength = bLength; + d->bDescriptorType = USB_DT_DEVICE; + + d->u.device.bcdUSB_lo = GET_WORD_LOW(dev->bcdUSB); + d->u.device.bcdUSB_hi = GET_WORD_HIGH(dev->bcdUSB); + d->u.device.bDeviceClass = dev->bDeviceClass; + d->u.device.bDeviceSubClass = dev->bDeviceSubClass; + d->u.device.bDeviceProtocol = dev->bDeviceProtocol; + d->u.device.bMaxPacketSize0 = dev->bMaxPacketSize0; + + d->u.device.idVendor_lo = GET_WORD_LOW(id->idVendor); + d->u.device.idVendor_hi = GET_WORD_HIGH(id->idVendor); + d->u.device.idProduct_lo = GET_WORD_LOW(id->idProduct); + d->u.device.idProduct_hi = GET_WORD_HIGH(id->idProduct); + d->u.device.bcdDevice_lo = GET_WORD_LOW(id->bcdDevice); + d->u.device.bcdDevice_hi = GET_WORD_HIGH(id->bcdDevice); + d->u.device.iManufacturer = id->iManufacturer; + d->u.device.iProduct = id->iProduct; + d->u.device.iSerialNumber = id->iSerialNumber; + + d->u.device.bNumConfigurations = dev->bNumConfigurations; + + return bLength; +} + +int USBDevice::USB_ReadConfigurationDesc(const USBDescConfig* conf, int flags, uint8_t* dest, size_t len) +{ + uint8_t bLength = 0x09; // a configuration descriptor is 9 bytes large + uint16_t wTotalLength = 0; + USBDescriptor* d = reinterpret_cast(dest); + int i, rc; + + if (len < bLength) { + return -1; + } + + // From the standard: "A request for a configuration descriptor returns the configuration descriptor, all interface + // descriptors, and endpoint descriptors for all of the interfaces in a single request." + + d->bLength = bLength; + d->bDescriptorType = USB_DT_CONFIG; + + d->u.config.bNumInterfaces = conf->bNumInterfaces; + d->u.config.bConfigurationValue = conf->bConfigurationValue; + d->u.config.iConfiguration = conf->iConfiguration; + d->u.config.bmAttributes = conf->bmAttributes; + d->u.config.bMaxPower = conf->bMaxPower; + wTotalLength += bLength; + + for (i = 0; i < conf->nif; i++) { + rc = USB_ReadInterfaceDesc(conf->ifs + i, flags, dest + wTotalLength, len - wTotalLength); + if (rc < 0) { + return rc; + } + wTotalLength += rc; + } + + d->u.config.wTotalLength_lo = GET_WORD_LOW(wTotalLength); + d->u.config.wTotalLength_hi = GET_WORD_HIGH(wTotalLength); + return wTotalLength; +} + +int USBDevice::USB_ReadInterfaceDesc(const USBDescIface* iface, int flags, uint8_t* dest, size_t len) +{ + uint8_t bLength = 0x09; // a interface descriptor is 9 bytes large + int i, rc, pos = 0; + USBDescriptor* d = reinterpret_cast(dest); + + if (len < bLength) { + return -1; + } + + // From the standard: "The first interface descriptor follows the configuration descriptor. + // The endpoint descriptors for the first interface follow the first interface descriptor. + // If there are additional interfaces, their interface descriptor and endpoint descriptors + // follow the first interface’s endpoint descriptors. Class-specific and/or vendor-specific + // descriptors follow the standard descriptors they extend or modify." + + d->bLength = bLength; + d->bDescriptorType = USB_DT_INTERFACE; + + d->u.iface.bInterfaceNumber = iface->bInterfaceNumber; + d->u.iface.bAlternateSetting = iface->bAlternateSetting; + d->u.iface.bNumEndpoints = iface->bNumEndpoints; + d->u.iface.bInterfaceClass = iface->bInterfaceClass; + d->u.iface.bInterfaceSubClass = iface->bInterfaceSubClass; + d->u.iface.bInterfaceProtocol = iface->bInterfaceProtocol; + d->u.iface.iInterface = iface->iInterface; + pos += bLength; + + for (i = 0; i < iface->ndesc; i++) { + rc = USB_ReadOtherDesc(iface->descs + i, dest + pos, len - pos); + if (rc < 0) { + return rc; + } + pos += rc; + } + + for (i = 0; i < iface->bNumEndpoints; i++) { + rc = USB_ReadEndpointDesc(iface->eps + i, flags, dest + pos, len - pos); + if (rc < 0) { + return rc; + } + pos += rc; + } + + return pos; +} + +int USBDevice::USB_ReadOtherDesc(const USBDescOther* desc, uint8_t* dest, size_t len) +{ + int bLength = desc->length ? desc->length : desc->data[0]; + + if (len < bLength) { + return -1; + } + + std::memcpy(dest, desc->data, bLength); + return bLength; +} + +int USBDevice::USB_ReadEndpointDesc(const USBDescEndpoint* ep, int flags, uint8_t* dest, size_t len) +{ + uint8_t bLength = ep->is_audio ? 0x09 : 0x07; // an endpoint descriptor is 7 bytes large (or 9 if it is an audio device) + uint8_t extralen = ep->extra ? ep->extra[0] : 0; + USBDescriptor* d = reinterpret_cast(dest); + + if (len < bLength + extralen) { + return -1; + } + + d->bLength = bLength; + d->bDescriptorType = USB_DT_ENDPOINT; + + d->u.endpoint.bEndpointAddress = ep->bEndpointAddress; + d->u.endpoint.bmAttributes = ep->bmAttributes; + d->u.endpoint.wMaxPacketSize_lo = GET_WORD_LOW(ep->wMaxPacketSize); + d->u.endpoint.wMaxPacketSize_hi = GET_WORD_HIGH(ep->wMaxPacketSize); + d->u.endpoint.bInterval = ep->bInterval; + if (ep->is_audio) { + d->u.endpoint.bRefresh = ep->bRefresh; + d->u.endpoint.bSynchAddress = ep->bSynchAddress; + } + + // Dropped from XQEMU the reading of SuperSpeed Endpoint Companion descriptors since those are usb 3.0 specific + + if (ep->extra) { + std::memcpy(dest + bLength, ep->extra, extralen); + } + + return bLength + extralen; +} + +int USBDevice::USB_ReadStringDesc(XboxDeviceState* dev, int index, uint8_t* dest, size_t len) +{ + uint8_t bLength, pos, i; + const char* str; + + if (len < 4) { + return -1; + } + + // From the standard: "String index zero for all languages returns a string descriptor + // that contains an array of two-byte LANGID codes supported by the device." + + if (index == 0) { + /* language ids */ + dest[0] = 4; + dest[1] = USB_DT_STRING; + dest[2] = 0x09; + dest[3] = 0x04; // we only support English (United States) + return 4; + } + + str = USBDesc_GetString(dev, index); + if (str == nullptr) { + return 0; + } + + // From the standard: "The UNICODE string descriptor is not NULL-terminated. The string length is + // computed by subtracting two from the value of the first byte of the descriptor" + + bLength = strlen(str) * 2 + 2; + dest[0] = bLength; + dest[1] = USB_DT_STRING; + i = 0; pos = 2; + while (pos + 1 < bLength && pos + 1 < len) { + dest[pos++] = str[i++]; + dest[pos++] = 0; + } + return pos; +} + +void USBDevice::USBDesc_SetString(XboxDeviceState* dev, int index, const char* str) +{ + USBDescString* s; + + QLIST_FOREACH(s, &dev->Strings, next) { + if (s->index == index) { + break; + } + } + + if (s == nullptr) { + s = new USBDescString(); + s->index = index; + QLIST_INSERT_HEAD(&dev->Strings, s, next); + } + + s->str = str; +} + +const char* USBDevice::USBDesc_GetString(XboxDeviceState* dev, int index) +{ + USBDescString* s; + + QLIST_FOREACH(s, &dev->Strings, next) { + if (s->index == index) { + return s->str.c_str(); + } + } + + return nullptr; +} diff --git a/src/devices/usb/USBDevice.h b/src/devices/usb/USBDevice.h index 6c75903ab..0d49c4012 100644 --- a/src/devices/usb/USBDevice.h +++ b/src/devices/usb/USBDevice.h @@ -149,25 +149,47 @@ class USBDevice : public PCIDevice { // assign port numbers (also for hubs) void USB_PortLocation(USBPort* downstream, USBPort* upstream, int portnr); // initialize the endpoints of this peripheral - void UsbEpInit(XboxDeviceState* dev); + void USB_EpInit(XboxDeviceState* dev); // reset all endpoints of this peripheral - void UsbEpReset(XboxDeviceState* dev); + void USB_EpReset(XboxDeviceState* dev); // create a serial number for the device - void CreateSerial(XboxDeviceState* dev); + void USB_CreateSerial(XboxDeviceState* dev, const char* str); // start descriptors initialization - void UsbDescInit(XboxDeviceState* dev); + void USBDesc_Init(XboxDeviceState* dev); // get device descriptor - const USBDesc* GetUsbDeviceDesc(XboxDeviceState* dev); + const USBDesc* USBDesc_GetUsbDeviceDesc(XboxDeviceState* dev); // set the descriptors to use for this device - void UsbDescSetDefaults(XboxDeviceState* dev); + void USBDesc_SetDefaults(XboxDeviceState* dev); // set the configuration to use - int UsbDescSetConfig(XboxDeviceState* dev, int value); + int USBDesc_SetConfig(XboxDeviceState* dev, int value); // set the interface to use - int UsbDescSetInterface(XboxDeviceState* dev, int index, int value); + int USBDesc_SetInterface(XboxDeviceState* dev, int index, int value); // find the interface to use - const USBDescIface* UsbDescFindInterface(XboxDeviceState* dev, int nif, int alt); + const USBDescIface* USBDesc_FindInterface(XboxDeviceState* dev, int nif, int alt); // setup endpoints and their descriptors - void UsbDescEpInit(XboxDeviceState* dev); + void USBDesc_EpInit(XboxDeviceState* dev); + // handle standard control request + int USBDesc_HandleControl(XboxDeviceState *dev, USBPacket *p, + int request, int value, int index, int length, uint8_t *data); + // handle standard GetDescriptor() request + int USBDesc_HandleStandardGetDescriptor(XboxDeviceState* dev, USBPacket* p, + int value, uint8_t* dest, size_t len); + // return the binary rapresentation of a device descriptor + int USB_ReadDeviceDesc(const USBDescID* id, const USBDescDevice* dev, uint8_t* dest, size_t len); + // return the binary rapresentation of configuration descriptors + int USB_ReadConfigurationDesc(const USBDescConfig* conf, int flags, uint8_t* dest, size_t len); + // return the binary rapresentation of interface descriptors + int USB_ReadInterfaceDesc(const USBDescIface* iface, int flags, uint8_t* dest, size_t len); + // return the binary rapresentation of class-specific descriptors + int USB_ReadOtherDesc(const USBDescOther* desc, uint8_t* dest, size_t len); + // return the binary rapresentation of endpoint descriptors + int USB_ReadEndpointDesc(const USBDescEndpoint* ep, int flags, uint8_t* dest, size_t len); + // return the binary rapresentation of string descriptors + int USB_ReadStringDesc(XboxDeviceState* dev, int index, uint8_t* dest, size_t len); + // set a string in the string descriptor with the supplied index + void USBDesc_SetString(XboxDeviceState* dev, int index, const char* str); + // get a string in the string descriptor with the supplied index + const char* USBDesc_GetString(XboxDeviceState* dev, int index); }; #endif diff --git a/src/devices/usb/UsbCommon.h b/src/devices/usb/UsbCommon.h index 69d1e5dc3..dff12bb44 100644 --- a/src/devices/usb/UsbCommon.h +++ b/src/devices/usb/UsbCommon.h @@ -68,6 +68,61 @@ #define USB_SPEED_LOW 0 #define USB_SPEED_FULL 1 +#define USB_DEVICE_SELF_POWERED 0 +#define USB_DEVICE_REMOTE_WAKEUP 1 + +#define USB_TYPE_MASK (0x03 << 5) +#define USB_TYPE_STANDARD (0x00 << 5) +#define USB_TYPE_CLASS (0x01 << 5) +#define USB_TYPE_VENDOR (0x02 << 5) +#define USB_TYPE_RESERVED (0x03 << 5) + +#define USB_RECIP_MASK 0x1F +#define USB_RECIP_DEVICE 0x00 +#define USB_RECIP_INTERFACE 0x01 +#define USB_RECIP_ENDPOINT 0x02 +#define USB_RECIP_OTHER 0x03 + +#define DeviceRequest ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8) +#define DeviceOutRequest ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8) +#define VendorDeviceRequest ((USB_DIR_IN|USB_TYPE_VENDOR|USB_RECIP_DEVICE)<<8) +#define VendorDeviceOutRequest ((USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_DEVICE)<<8) + +#define InterfaceRequest \ + ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8) +#define InterfaceOutRequest \ + ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8) +#define ClassInterfaceRequest \ + ((USB_DIR_IN|USB_TYPE_CLASS|USB_RECIP_INTERFACE)<<8) +#define ClassInterfaceOutRequest \ + ((USB_DIR_OUT|USB_TYPE_CLASS|USB_RECIP_INTERFACE)<<8) +#define VendorInterfaceRequest \ + ((USB_DIR_IN|USB_TYPE_VENDOR|USB_RECIP_INTERFACE)<<8) +#define VendorInterfaceOutRequest \ + ((USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE)<<8) + +#define EndpointRequest ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_ENDPOINT)<<8) +#define EndpointOutRequest \ + ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_ENDPOINT)<<8) + +#define USB_REQ_GET_STATUS 0x00 +#define USB_REQ_CLEAR_FEATURE 0x01 +#define USB_REQ_SET_FEATURE 0x03 +#define USB_REQ_SET_ADDRESS 0x05 +#define USB_REQ_GET_DESCRIPTOR 0x06 +#define USB_REQ_SET_DESCRIPTOR 0x07 +#define USB_REQ_GET_CONFIGURATION 0x08 +#define USB_REQ_SET_CONFIGURATION 0x09 +#define USB_REQ_GET_INTERFACE 0x0A +#define USB_REQ_SET_INTERFACE 0x0B +#define USB_REQ_SYNCH_FRAME 0x0C + +#define USB_DT_DEVICE 0x01 +#define USB_DT_CONFIG 0x02 +#define USB_DT_STRING 0x03 +#define USB_DT_INTERFACE 0x04 +#define USB_DT_ENDPOINT 0x05 + typedef enum _USB_SPEED { @@ -88,7 +143,6 @@ USBPacketState; struct USBPacket; struct XboxDeviceState; -typedef const char* USBDescStrings[256]; /* String descriptor */ struct USBDescString { @@ -97,6 +151,7 @@ struct USBDescString { QLIST_ENTRY(USBDescString) next; }; +// Device-specific class descriptors, if any. No idea if some Xbox devices use this but, if not, this can be removed struct USBDescOther { uint8_t length; const uint8_t* data; @@ -111,8 +166,8 @@ struct USBDescEndpoint { uint8_t bRefresh; // for audio devices only: the rate at which synchronization feedback is provided uint8_t bSynchAddress; // for audio devices only: the address of the synchronization endpoint - uint8_t is_audio; /* has bRefresh + bSynchAddress */ - uint8_t* extra; + uint8_t is_audio; // has bRefresh + bSynchAddress + uint8_t* extra; // class-specific descriptors (if any) associated with this endpoint // Dropped from XQEMU the parameters bMaxBurst, bmAttributes_super and wBytesPerInterval because those are only defined for // superspeed (usb 3.0) devices in the superspeed endpoint companion @@ -128,8 +183,8 @@ struct USBDescIface { uint8_t bInterfaceProtocol; // protocol code (assigned by the USB) uint8_t iInterface; // index of string descriptor describing this interface - uint8_t ndesc; - USBDescOther* descs; + uint8_t ndesc; // number of device-specific class descriptors (if any) + USBDescOther* descs; // pointer to the extra class descriptors USBDescEndpoint* eps; // endpoints supported by this interface USBDescIface(bool bDefault); ~USBDescIface(); @@ -179,10 +234,67 @@ struct USBDescID { struct USBDesc { USBDescID id; // id-specific info of the device descriptor const USBDescDevice* full; // remaining fields of the device descriptor - const char* const* str; USBDesc(bool bDefault); }; +#pragma pack(1) + +// Binary representation of the descriptors +// Dropped from XQEMU usb 2.0 and 3.0 only descriptors +struct USBDescriptor { + uint8_t bLength; + uint8_t bDescriptorType; + union { + struct { + uint8_t bcdUSB_lo; + uint8_t bcdUSB_hi; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint8_t idVendor_lo; + uint8_t idVendor_hi; + uint8_t idProduct_lo; + uint8_t idProduct_hi; + uint8_t bcdDevice_lo; + uint8_t bcdDevice_hi; + uint8_t iManufacturer; + uint8_t iProduct; + uint8_t iSerialNumber; + uint8_t bNumConfigurations; + } device; // device descriptor + struct { + uint8_t wTotalLength_lo; + uint8_t wTotalLength_hi; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; + } config; // configuration descriptor + struct { + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t bInterfaceProtocol; + uint8_t iInterface; + } iface; // interface descriptor + struct { + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint8_t wMaxPacketSize_lo; + uint8_t wMaxPacketSize_hi; + uint8_t bInterval; + uint8_t bRefresh; // only audio ep + uint8_t bSynchAddress; // only audio ep + } endpoint; // endpoint descriptor + } u; +}; + +#pragma pack() + /* USB endpoint */ struct USBEndpoint { uint8_t Num; // endpoint number @@ -211,18 +323,18 @@ struct XboxDeviceState { int Attached; // device is attached int32_t State; // current state of device - uint8_t SetupBuffer[8]; // holds the IoVec structs copied (control transfers only?) - uint8_t data_buf[4096]; + uint8_t SetupBuffer[8]; // setup packet buffer - 8 bytes (control transfers only) + uint8_t DataBuffer[4096]; // buffer where to write the data requested during usb requests int32_t RemoteWakeup; // wakeup flag int32_t SetupState; // result of a setup tken processing operation - int32_t SetupLength; // number of bytes to transfer as specified by a setup token + int32_t SetupLength; // this field specifies the length of the data transferred during the second phase of the control transfer int32_t SetupIndex; // index of the parameter in a setup token? USBEndpoint EP_ctl; // endpoints for SETUP tokens USBEndpoint EP_in[USB_MAX_ENDPOINTS]; // endpoints for OUT tokens USBEndpoint EP_out[USB_MAX_ENDPOINTS]; // endpoints for IN tokens - QLIST_HEAD(, USBDescString) Strings; // strings of the string descriptor + QLIST_HEAD(, USBDescString) Strings; // strings of the string descriptors const USBDesc* UsbDesc; // Overrides class usb_desc if not nullptr const USBDescDevice* Device; // device descriptor part 1 @@ -250,7 +362,7 @@ struct USBPacket { bool ShortNotOK; // the bufferRounding mode of the TD for this packet bool IntReq; // whether or not to generate an interrupt for this packet (DelayInterrupt of the TD is zero) int Status; // USB_RET_* status code - int ActualLength; // before copy: offset inside IoVec structs; after copy: number of bytes actually transferred + int ActualLength; // number of bytes actually written to DataBuffer // Internal use by the USB layer USBPacketState State; USBCombinedPacket* Combined; From 9196c353d2eb6391f5a6245c35435db3b309a829 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Thu, 5 Jul 2018 23:44:19 +0200 Subject: [PATCH 0047/1000] Practically finished Hub device implementation --- src/devices/usb/Hub.cpp | 455 ++++++++++++++++++++++++---------- src/devices/usb/Hub.h | 2 + src/devices/usb/USBDevice.cpp | 13 +- 3 files changed, 328 insertions(+), 142 deletions(-) diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index 98b65006d..9f2100a3f 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -38,6 +38,8 @@ #include "Hub.h" #include "..\CxbxKrnl\EmuKrnl.h" // For EmuWarning +#define LOG_STR_HUB "Hub" + #define NUM_PORTS 8 #define PORT_STAT_CONNECTION 0x0001 @@ -54,6 +56,27 @@ #define PORT_STAT_C_OVERCURRENT 0x0008 #define PORT_STAT_C_RESET 0x0010 +#define ClearHubFeature (0x2000 | USB_REQ_CLEAR_FEATURE) +#define ClearPortFeature (0x2300 | USB_REQ_CLEAR_FEATURE) +#define GetHubDescriptor (0xA000 | USB_REQ_GET_DESCRIPTOR) +#define GetHubStatus (0xA000 | USB_REQ_GET_STATUS) +#define GetPortStatus (0xA300 | USB_REQ_GET_STATUS) +#define SetHubFeature (0x2000 | USB_REQ_SET_FEATURE) +#define SetPortFeature (0x2300 | USB_REQ_SET_FEATURE) + +#define PORT_CONNECTION 0 +#define PORT_ENABLE 1 +#define PORT_SUSPEND 2 +#define PORT_OVERCURRENT 3 +#define PORT_RESET 4 +#define PORT_POWER 8 +#define PORT_LOWSPEED 9 +#define PORT_C_CONNECTION 16 +#define PORT_C_ENABLE 17 +#define PORT_C_SUSPEND 18 +#define PORT_C_OVERCURRENT 19 +#define PORT_C_RESET 20 + // To avoid including Xbox.h extern USBDevice* g_USB0; @@ -154,6 +177,23 @@ USBDesc::USBDesc(bool bDefault) static const USBDesc desc_hub(true); +// Class-specific hub descriptor. Remember to update DeviceRemovable and PortPwrCtrlMask if you change NUM_PORTS since their values depend on +// the number of downstream ports available on the hub! Also note that this descriptor cannot be put in the descs member of the interface descriptor +// because then this descriptor will be retrieved during a standard GetDescriptor request instead of the hub-specific GetHubDescriptor request +static const uint8_t HubDescriptor[] = +{ + 0x0A, // u8 bDescLength; 10 bytes + 0x29, // u8 bDescriptorType; Hub-descriptor + NUM_PORTS, // u8 bNbrPorts; 0x08 + 0x0a, // u16 wHubCharacteristics; (individual port over-current protection, no power switching) + 0x00, + 0x01, // u8 bPwrOn2pwrGood; 2 ms + 0x00, // u8 bHubContrCurrent; 0 mA + 0x00, // u16 DeviceRemovable; all devices are removable + 0x00, + 0xFF, // u8 PortPwrCtrlMask; all 1's for compatibility reasons +}; + int Hub::Init(int pport) { XboxDeviceState* dev = ClassInitFn(); @@ -313,8 +353,7 @@ void Hub::UsbHub_HandleReset() void Hub::UsbHub_HandleControl(XboxDeviceState* dev, USBPacket* p, int request, int value, int index, int length, uint8_t* data) -{ - USBHubState *s = (USBHubState *)dev; +{ int ret; ret = m_UsbDev->USBDesc_HandleControl(dev, p, request, value, index, length, data); @@ -323,148 +362,219 @@ void Hub::UsbHub_HandleControl(XboxDeviceState* dev, USBPacket* p, } switch (request) { - case EndpointOutRequest | USB_REQ_CLEAR_FEATURE: - if (value == 0 && index != 0x81) { /* clear ep halt */ - goto fail; - } - break; - /* usb specific requests */ - case GetHubStatus: - data[0] = 0; - data[1] = 0; - data[2] = 0; - data[3] = 0; - p->actual_length = 4; - break; - case GetPortStatus: - { - unsigned int n = index - 1; - USBHubPort *port; - if (n >= NUM_PORTS) { - goto fail; - } - port = &s->ports[n]; - trace_usb_hub_get_port_status(s->dev.addr, index, - port->wPortStatus, - port->wPortChange); - data[0] = port->wPortStatus; - data[1] = port->wPortStatus >> 8; - data[2] = port->wPortChange; - data[3] = port->wPortChange >> 8; - p->actual_length = 4; - } - break; - case SetHubFeature: - case ClearHubFeature: - if (value != 0 && value != 1) { - goto fail; - } - break; - case SetPortFeature: - { - unsigned int n = index - 1; - USBHubPort *port; - USBDevice *dev; - - trace_usb_hub_set_port_feature(s->dev.addr, index, - feature_name(value)); - - if (n >= NUM_PORTS) { - goto fail; - } - port = &s->ports[n]; - dev = port->port.dev; - switch (value) { - case PORT_SUSPEND: - port->wPortStatus |= PORT_STAT_SUSPEND; - break; - case PORT_RESET: - if (dev && dev->attached) { - usb_device_reset(dev); - port->wPortChange |= PORT_STAT_C_RESET; - /* set enable bit */ - port->wPortStatus |= PORT_STAT_ENABLE; - usb_wakeup(s->intr, 0); + case EndpointOutRequest | USB_REQ_CLEAR_FEATURE: { + // clear ep halt and bEndpointAddress of hub is 0x81 + if (value == 0 && index != 0x81) { + goto fail; } break; - case PORT_POWER: + } + + case GetHubStatus: { + // From the standard: "This request returns the current hub status and the states that have changed since the previous acknowledgment. + // The first word of data contains wHubStatus. The second word of data contains wHubChange" + // We always report that the local power supply is good and that currently there is no over-power condition + data[0] = 0; + data[1] = 0; + data[2] = 0; + data[3] = 0; + p->ActualLength = 4; break; + } + + case GetPortStatus: { + // From the standard: "This request returns the current port status and the current value of the port status change bits. + // The first word of data contains wPortStatus. The second word of data contains wPortChange" + unsigned int n = index - 1; + USBHubPort* port; + if (n >= NUM_PORTS) { + goto fail; + } + port = &m_HubState->ports[n]; + DbgPrintf("%s: %s GetPortStatus -> Address 0x%X, wIndex %d, wPortStatus %d, wPortChange %d\n", + LOG_STR_HUB, __func__, m_HubState->dev.Addr, index, port->wPortStatus, port->wPortChange); + data[0] = port->wPortStatus; + data[1] = port->wPortStatus >> 8; + data[2] = port->wPortChange; + data[3] = port->wPortChange >> 8; + p->ActualLength = 4; + break; + } + + case SetHubFeature: + case ClearHubFeature: { + if (value != 0 && value != 1) { + goto fail; + } + break; + } + + case SetPortFeature: { + // From the standard: "This request sets a value reported in the port status. Features that can be set with this request are PORT_RESET, + // PORT_SUSPEND and PORT_POWER; others features are not required to be set by this request" + unsigned int n = index - 1; + USBHubPort* port; + XboxDeviceState* dev; + + DbgPrintf("%s: %s SetPortFeature -> Address 0x%X, wIndex %d, Feature %s\n", + LOG_STR_HUB, __func__, m_HubState->dev.Addr, index, GetFeatureName(value)); + + if (n >= NUM_PORTS) { + goto fail; + } + port = &m_HubState->ports[n]; + dev = port->port.Dev; + switch (value) { + case PORT_SUSPEND: { + port->wPortStatus |= PORT_STAT_SUSPEND; + break; + } + + case PORT_RESET: { + if (dev && dev->Attached) { + m_UsbDev->USB_DeviceReset(dev); + port->wPortChange |= PORT_STAT_C_RESET; + port->wPortStatus |= PORT_STAT_ENABLE; + m_UsbDev->USB_Wakeup(m_HubState->intr); + } + break; + } + + case PORT_POWER: + break; + + default: + goto fail; + } + break; + } + + case ClearPortFeature: { + // From the standard: "This request resets a value reported in the port status" + unsigned int n = index - 1; + USBHubPort *port; + + DbgPrintf("%s: %s ClearPortFeature -> Address 0x%X, wIndex %d, Feature %s\n", + LOG_STR_HUB, __func__, m_HubState->dev.Addr, index, GetFeatureName(value)); + + if (n >= NUM_PORTS) { + goto fail; + } + port = &m_HubState->ports[n]; + switch (value) { + case PORT_ENABLE: { + port->wPortStatus &= ~PORT_STAT_ENABLE; + break; + } + + case PORT_C_ENABLE: { + port->wPortChange &= ~PORT_STAT_C_ENABLE; + break; + } + + case PORT_SUSPEND: { + port->wPortStatus &= ~PORT_STAT_SUSPEND; + break; + } + + case PORT_C_SUSPEND: { + port->wPortChange &= ~PORT_STAT_C_SUSPEND; + break; + } + + case PORT_C_CONNECTION: { + port->wPortChange &= ~PORT_STAT_C_CONNECTION; + break; + } + + case PORT_C_OVERCURRENT: { + port->wPortChange &= ~PORT_STAT_C_OVERCURRENT; + break; + } + + case PORT_C_RESET: { + port->wPortChange &= ~PORT_STAT_C_RESET; + break; + } + + default: + goto fail; + } + break; + } + + case GetHubDescriptor: { + std::memcpy(data, HubDescriptor, sizeof(HubDescriptor)); + p->ActualLength = sizeof(HubDescriptor); + break; + } + default: - goto fail; - } - } - break; - case ClearPortFeature: - { - unsigned int n = index - 1; - USBHubPort *port; - - trace_usb_hub_clear_port_feature(s->dev.addr, index, - feature_name(value)); - - if (n >= NUM_PORTS) { - goto fail; - } - port = &s->ports[n]; - switch (value) { - case PORT_ENABLE: - port->wPortStatus &= ~PORT_STAT_ENABLE; + fail: + p->Status = USB_RET_STALL; break; - case PORT_C_ENABLE: - port->wPortChange &= ~PORT_STAT_C_ENABLE; - break; - case PORT_SUSPEND: - port->wPortStatus &= ~PORT_STAT_SUSPEND; - break; - case PORT_C_SUSPEND: - port->wPortChange &= ~PORT_STAT_C_SUSPEND; - break; - case PORT_C_CONNECTION: - port->wPortChange &= ~PORT_STAT_C_CONNECTION; - break; - case PORT_C_OVERCURRENT: - port->wPortChange &= ~PORT_STAT_C_OVERCURRENT; - break; - case PORT_C_RESET: - port->wPortChange &= ~PORT_STAT_C_RESET; - break; - default: - goto fail; - } - } - break; - case GetHubDescriptor: - { - unsigned int n, limit, var_hub_size = 0; - memcpy(data, qemu_hub_hub_descriptor, - sizeof(qemu_hub_hub_descriptor)); - data[2] = NUM_PORTS; - - /* fill DeviceRemovable bits */ - limit = ((NUM_PORTS + 1 + 7) / 8) + 7; - for (n = 7; n < limit; n++) { - data[n] = 0x00; - var_hub_size++; - } - - /* fill PortPwrCtrlMask bits */ - limit = limit + ((NUM_PORTS + 7) / 8); - for (; n < limit; n++) { - data[n] = 0xff; - var_hub_size++; - } - - p->actual_length = sizeof(qemu_hub_hub_descriptor) + var_hub_size; - data[0] = p->actual_length; - break; - } - default: - fail: - p->status = USB_RET_STALL; - break; } } +void Hub::UsbHub_HandleData(XboxDeviceState* dev, USBPacket* p) +{ + switch (p->Pid) { + case USB_TOKEN_IN: { + if (p->Endpoint->Num == 1) { + USBHubPort* port; + unsigned int status; + uint8_t buf[4]; + int i, n; + status = 0; + for (i = 0; i < NUM_PORTS; i++) { + port = &m_HubState->ports[i]; + if (port->wPortChange) { + status |= (1 << (i + 1)); + } + } + if (status != 0) { + n = (NUM_PORTS + 1 + 7) / 8; + if (p->IoVec.Size == 1) { /* FreeBSD workaround */ + n = 1; + } + else if (n > p->IoVec.Size) { + p->Status = USB_RET_BABBLE; + return; + } + DbgPrintf("%s: %s Address 0x%X, Status %d\n", LOG_STR_HUB, __func__, m_HubState->dev.Addr, status); + for (i = 0; i < n; i++) { + buf[i] = status >> (8 * i); + } + m_UsbDev->USB_PacketCopy(p, buf, n); + } + else { + p->Status = USB_RET_NAK; /* usb11 11.13.1 */ + } + } + else { + goto fail; + } + break; + } + + case USB_TOKEN_OUT: + default: + fail: + p->Status = USB_RET_STALL; + break; + } +} + +void Hub::UsbHub_HandleDestroy(XboxDeviceState* dev) +{ + for (int i = 0; i < NUM_PORTS; i++) { + if (m_HubState->ports[i].port.Dev) { + // delete downstream device + } + } + // TODO +} + void Hub::UsbHub_Attach(USBPort* port1) { USBHubPort* port = &m_HubState->ports[port1->PortIndex]; @@ -519,3 +629,76 @@ void Hub::UsbHub_Complete(USBPort* port, USBPacket* packet) // Just pass it along to upstream m_HubState->dev.Port->Operations->complete(m_HubState->dev.Port, packet); } + +std::string Hub::GetFeatureName(int feature) +{ + std::string str; + + switch (feature) { + case PORT_CONNECTION: { + str = "connection"; + break; + } + + case PORT_ENABLE: { + str = "enable"; + break; + } + + case PORT_SUSPEND: { + str = "suspend"; + break; + } + + case PORT_OVERCURRENT: { + str = "overcurrent"; + break; + } + + case PORT_RESET: { + str = "reset"; + break; + } + + case PORT_POWER: { + str = "power"; + break; + } + + case PORT_LOWSPEED: { + str = "lowspeed"; + break; + } + + case PORT_C_CONNECTION: { + str = "change_connection"; + break; + } + + case PORT_C_ENABLE: { + str = "change_enable"; + break; + } + + case PORT_C_SUSPEND: { + str = "change_suspend"; + break; + } + + case PORT_C_OVERCURRENT: { + str = "change_overcurrent"; + break; + } + + case PORT_C_RESET: { + str = "change_reset"; + break; + } + + default: + str = "?"; + break; + } + + return str; +} diff --git a/src/devices/usb/Hub.h b/src/devices/usb/Hub.h index 889968dac..b87605745 100644 --- a/src/devices/usb/Hub.h +++ b/src/devices/usb/Hub.h @@ -86,6 +86,8 @@ class Hub int UsbHubClaimPort(XboxDeviceState* dev, int port); // free the usb port used by this hub void UsbHubReleasePort(XboxDeviceState* dev); + // retieve the name of the feature of the usb request + std::string GetFeatureName(int feature); }; extern Hub* g_HubObjArray[4]; diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index 1f71d1ffe..cf6c7beb8 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -144,7 +144,7 @@ void USBDevice::USB_DeviceReset(XboxDeviceState* dev) dev->RemoteWakeup = 0; dev->Addr = 0; dev->State = USB_STATE_DEFAULT; - usb_device_handle_reset(dev); + USB_DeviceHandleReset(dev); } XboxDeviceState* USBDevice::USB_FindDevice(USBPort* Port, uint8_t Addr) @@ -746,7 +746,7 @@ void USBDevice::USBDesc_SetDefaults(XboxDeviceState* dev) { const USBDesc *desc = USBDesc_GetUsbDeviceDesc(dev); - assert(desc != NULL); + assert(desc != nullptr); switch (dev->Speed) { case USB_SPEED_LOW: case USB_SPEED_FULL: { @@ -873,7 +873,7 @@ int USBDevice::USBDesc_HandleControl(XboxDeviceState* dev, USBPacket *p, // From the standard: "This request sets the device address for all future device accesses. // The wValue field specifies the device address to use for all subsequent accesses" dev->Addr = value; - DbgPrintf("Address 0x%X set for device %s", dev->Addr, dev->ProductDesc.c_str()); + DbgPrintf("Address 0x%X set for device %s\n", dev->Addr, dev->ProductDesc.c_str()); ret = 0; break; } @@ -972,6 +972,7 @@ is %d and returned %d\n", dev->Addr, index, value, ret); } default: + break; } return ret; } @@ -1103,7 +1104,7 @@ int USBDevice::USB_ReadConfigurationDesc(const USBDescConfig* conf, int flags, u int USBDevice::USB_ReadInterfaceDesc(const USBDescIface* iface, int flags, uint8_t* dest, size_t len) { - uint8_t bLength = 0x09; // a interface descriptor is 9 bytes large + uint8_t bLength = 0x09; // an interface descriptor is 9 bytes large int i, rc, pos = 0; USBDescriptor* d = reinterpret_cast(dest); @@ -1114,7 +1115,7 @@ int USBDevice::USB_ReadInterfaceDesc(const USBDescIface* iface, int flags, uint8 // From the standard: "The first interface descriptor follows the configuration descriptor. // The endpoint descriptors for the first interface follow the first interface descriptor. // If there are additional interfaces, their interface descriptor and endpoint descriptors - // follow the first interface’s endpoint descriptors. Class-specific and/or vendor-specific + // follow the first interface’s endpoint descriptors. Class-specific and/or vendor-specific // descriptors follow the standard descriptors they extend or modify." d->bLength = bLength; @@ -1202,7 +1203,7 @@ int USBDevice::USB_ReadStringDesc(XboxDeviceState* dev, int index, uint8_t* dest } // From the standard: "String index zero for all languages returns a string descriptor - // that contains an array of two-byte LANGID codes supported by the device." + // that contains an array of two-byte LANGID codes supported by the device" if (index == 0) { /* language ids */ From f4c47fddc96b113908126950876129d920720833 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Sun, 8 Jul 2018 14:50:43 +0200 Subject: [PATCH 0048/1000] Implemented xid gamepad device + updates to hub --- build/win32/Cxbx.vcxproj | 2 + build/win32/Cxbx.vcxproj.filters | 6 + src/Common/CxbxCommon.cpp | 2 +- src/devices/usb/Hub.cpp | 159 ++++++------ src/devices/usb/Hub.h | 21 +- src/devices/usb/OHCI.cpp | 6 - src/devices/usb/OHCI.h | 12 - src/devices/usb/USBDevice.cpp | 14 +- src/devices/usb/USBDevice.h | 5 + src/devices/usb/UsbCommon.h | 20 +- src/devices/usb/XidGamepad.cpp | 432 +++++++++++++++++++++++++++++++ src/devices/usb/XidGamepad.h | 80 ++++++ 12 files changed, 642 insertions(+), 117 deletions(-) create mode 100644 src/devices/usb/XidGamepad.cpp create mode 100644 src/devices/usb/XidGamepad.h diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index 3df1e1a94..06074b041 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -366,6 +366,7 @@ + @@ -739,6 +740,7 @@ + diff --git a/build/win32/Cxbx.vcxproj.filters b/build/win32/Cxbx.vcxproj.filters index dd8666214..5e3f3ec90 100644 --- a/build/win32/Cxbx.vcxproj.filters +++ b/build/win32/Cxbx.vcxproj.filters @@ -297,6 +297,9 @@ GUI + + + Hardware\Usb GUI @@ -596,6 +599,9 @@ Shared + + + Hardware\Usb GUI diff --git a/src/Common/CxbxCommon.cpp b/src/Common/CxbxCommon.cpp index 8fd98fea1..cb85352ba 100644 --- a/src/Common/CxbxCommon.cpp +++ b/src/Common/CxbxCommon.cpp @@ -123,7 +123,7 @@ size_t IoVecFromBuffer(const IoVec* iov, unsigned int iov_cnt, size_t offset, vo for (i = 0, done = 0; (offset || done < bytes) && i < iov_cnt; i++) { if (offset < iov[i].Iov_Len) { size_t len = MIN(iov[i].Iov_Len - offset, bytes - done); - memcpy(static_cast(iov[i].Iov_Base) + offset, static_cast(buf) + done, len); + std::memcpy(static_cast(iov[i].Iov_Base) + offset, static_cast(buf) + done, len); done += len; offset = 0; } diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index 9f2100a3f..a5a7946a5 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -36,7 +36,6 @@ #include "OHCI.h" #include "Hub.h" -#include "..\CxbxKrnl\EmuKrnl.h" // For EmuWarning #define LOG_STR_HUB "Hub" @@ -92,6 +91,13 @@ int PlayerToUsbArray[] = { 2, }; +/* same as Linux kernel root hubs */ +typedef enum { + STR_MANUFACTURER = 1, + STR_PRODUCT, + STR_SERIALNUMBER, +}; + struct USBHubPort { USBPort port; // downstream port status uint16_t wPortStatus; // Port Status Field, in accordance with the standard @@ -104,78 +110,62 @@ struct USBHubState { USBHubPort ports[NUM_PORTS]; // downstream ports of the hub }; -USBDescIface::USBDescIface(bool bDefault) +USBDescIface::USBDescIface() { std::memset(this, 0, sizeof(USBDescIface)); - if (bDefault) { - descs = new USBDescOther(); - eps = new USBDescEndpoint(); - bInterfaceNumber = 0; - bNumEndpoints = 1; - bInterfaceClass = USB_CLASS_HUB; - eps->bEndpointAddress = USB_DIR_IN | 0x01; - eps->bmAttributes = USB_ENDPOINT_XFER_INT; - eps->wMaxPacketSize = 1 + (NUM_PORTS + 7) / 8; - eps->bInterval = 0xFF; - } + eps = new USBDescEndpoint(); + bInterfaceNumber = 0; + bNumEndpoints = 1; + bInterfaceClass = USB_CLASS_HUB; + eps->bEndpointAddress = USB_DIR_IN | 0x01; + eps->bmAttributes = USB_ENDPOINT_XFER_INT; + eps->wMaxPacketSize = 1 + (NUM_PORTS + 7) / 8; + eps->bInterval = 0xFF; } USBDescIface::~USBDescIface() { - delete descs; // always one struct of this? - if (bNumEndpoints != 1) { - delete[] eps; - return; - } delete eps; } -static const USBDescIface desc_iface_hub(true); +static const USBDescIface desc_iface_hub; -USBDescDevice::USBDescDevice(bool bDefault) +USBDescDevice::USBDescDevice() { std::memset(this, 0, sizeof(USBDescDevice)); - if (bDefault) { - USBDescConfig* pUSBDescConfig = new USBDescConfig(); - bcdUSB = 0x0110; - bDeviceClass = USB_CLASS_HUB; - bMaxPacketSize0 = 8; - bNumConfigurations = 1; - pUSBDescConfig->bNumInterfaces = 1; - pUSBDescConfig->bConfigurationValue = 1; - pUSBDescConfig->bmAttributes = 0xE0; - pUSBDescConfig->nif = 1; - pUSBDescConfig->ifs = &desc_iface_hub; - confs = pUSBDescConfig; - } + USBDescConfig* pUSBDescConfig = new USBDescConfig(); + bcdUSB = 0x0110; + bDeviceClass = USB_CLASS_HUB; + bMaxPacketSize0 = 8; + bNumConfigurations = 1; + pUSBDescConfig->bNumInterfaces = 1; + pUSBDescConfig->bConfigurationValue = 1; + pUSBDescConfig->bmAttributes = 0xE0; + pUSBDescConfig->nif = 1; + pUSBDescConfig->ifs = &desc_iface_hub; + confs = pUSBDescConfig; } USBDescDevice::~USBDescDevice() { - if (bNumConfigurations != 1) { - delete[] confs; - return; - } delete confs; } -static const USBDescDevice desc_device_hub(true); +static const USBDescDevice desc_device_hub; -USBDesc::USBDesc(bool bDefault) +USBDesc::USBDesc() { std::memset(this, 0, sizeof(USBDesc)); - if (bDefault) { - id.idVendor = 0x0409; - id.idProduct = 0x55AA; - id.bcdDevice = 0x0101; - id.iManufacturer = STR_MANUFACTURER; - id.iProduct = STR_PRODUCT; - id.iSerialNumber = STR_SERIALNUMBER; - full = &desc_device_hub; - } + id.idVendor = 0x0409; + id.idProduct = 0x55AA; + id.bcdDevice = 0x0101; + id.iManufacturer = STR_MANUFACTURER; + id.iProduct = STR_PRODUCT; + id.iSerialNumber = STR_SERIALNUMBER; + full = &desc_device_hub; } -static const USBDesc desc_hub(true); +static const USBDesc desc_hub; // Class-specific hub descriptor. Remember to update DeviceRemovable and PortPwrCtrlMask if you change NUM_PORTS since their values depend on // the number of downstream ports available on the hub! Also note that this descriptor cannot be put in the descs member of the interface descriptor @@ -196,31 +186,20 @@ static const uint8_t HubDescriptor[] = int Hub::Init(int pport) { + if (pport > 4 || pport < 1) { return -1; }; + XboxDeviceState* dev = ClassInitFn(); - m_UsbDev->USB_EpInit(dev); int rc = UsbHubClaimPort(dev, pport); if (rc != 0) { return rc; } - rc = m_UsbDev->USB_DeviceInit(dev); - if (rc != 0) { - UsbHubReleasePort(dev); - return rc; - } + m_UsbDev->USB_EpInit(dev); + m_UsbDev->USB_DeviceInit(dev); m_UsbDev->USB_DeviceAttach(dev); return 0; } -Hub::~Hub() -{ - delete m_pPeripheralFuncStruct; - delete m_HubState->ports[0].port.Operations; - delete m_HubState; - m_pPeripheralFuncStruct = nullptr; - m_HubState = nullptr; -} - XboxDeviceState* Hub::ClassInitFn() { m_pPeripheralFuncStruct = new USBDeviceClass(); @@ -239,7 +218,7 @@ XboxDeviceState* Hub::ClassInitFn() m_pPeripheralFuncStruct->handle_reset = std::bind(&Hub::UsbHub_HandleReset, this); m_pPeripheralFuncStruct->handle_control = std::bind(&Hub::UsbHub_HandleControl, this, _1, _2, _3, _4, _5, _6, _7); m_pPeripheralFuncStruct->handle_data = std::bind(&Hub::UsbHub_HandleData, this, _1, _2); - m_pPeripheralFuncStruct->handle_destroy = std::bind(&Hub::UsbHub_HandleDestroy, this, _1); + m_pPeripheralFuncStruct->handle_destroy = std::bind(&Hub::UsbHub_HandleDestroy, this); m_pPeripheralFuncStruct->product_desc = dev->ProductDesc.c_str(); m_pPeripheralFuncStruct->usb_desc = &desc_hub; } @@ -249,21 +228,34 @@ XboxDeviceState* Hub::ClassInitFn() int Hub::UsbHubClaimPort(XboxDeviceState* dev, int pport) { + int i; int usb_port; + std::vector::iterator it; assert(dev->Port == nullptr); - if (pport > 4 || pport < 1) { return -1; }; - + i = 0; usb_port = PlayerToUsbArray[pport]; if (usb_port > 2) { m_UsbDev = g_USB0; - m_UsbDev->m_HostController->OHCI_AssignUsbPortStruct(usb_port - 3, dev); } else { m_UsbDev = g_USB1; - m_UsbDev->m_HostController->OHCI_AssignUsbPortStruct(usb_port - 1, dev); } + for (auto port : m_UsbDev->m_FreePorts) { + if (strcmp(port->Path, std::to_string(usb_port).c_str()) == 0) { + break; + } + i++; + } + if (i == 2) { + EmuWarning("Port requested %d not found (in use?)", usb_port); + return -1; + } + it = m_UsbDev->m_FreePorts.begin() + i; + dev->Port = *it; + (*it)->Dev = dev; + m_UsbDev->m_FreePorts.erase(it); return 0; } @@ -284,11 +276,6 @@ int Hub::UsbHub_Initfn(XboxDeviceState* dev) USBPortOps* ops; int i; - if (dev->Port->HubCount == 5) { - DbgPrintf("Hub: chain too deep\n"); - return -1; - } - m_UsbDev->USB_CreateSerial(dev, "314159"); m_UsbDev->USBDesc_SetString(dev, STR_MANUFACTURER, "Cxbx-Reloaded"); m_UsbDev->USBDesc_SetString(dev, STR_PRODUCT, "Cxbx-Reloaded USB Hub"); @@ -565,14 +552,23 @@ void Hub::UsbHub_HandleData(XboxDeviceState* dev, USBPacket* p) } } -void Hub::UsbHub_HandleDestroy(XboxDeviceState* dev) +void Hub::UsbHub_HandleDestroy() { + // Inform upstream that the hub is detached and gone + m_HubState->dev.Port->Operations->detach(m_HubState->dev.Port); + m_UsbDev->m_FreePorts.push_back(m_HubState->dev.Port); + for (int i = 0; i < NUM_PORTS; i++) { if (m_HubState->ports[i].port.Dev) { - // delete downstream device + // Also destroy attached downstream device + m_HubState->ports[i].port.Dev->klass->handle_destroy(); + } + else { + m_UsbDev->USB_UnregisterPort(&m_HubState->ports[i].port); } } - // TODO + UsbHubReleasePort(&m_HubState->dev); + HubCleanUp(); } void Hub::UsbHub_Attach(USBPort* port1) @@ -702,3 +698,12 @@ std::string Hub::GetFeatureName(int feature) return str; } + +void Hub::HubCleanUp() +{ + delete m_pPeripheralFuncStruct; + delete m_HubState->ports[0].port.Operations; + delete m_HubState; + m_pPeripheralFuncStruct = nullptr; + m_HubState = nullptr; +} diff --git a/src/devices/usb/Hub.h b/src/devices/usb/Hub.h index b87605745..70c1f79c2 100644 --- a/src/devices/usb/Hub.h +++ b/src/devices/usb/Hub.h @@ -37,30 +37,26 @@ #ifndef HUB_H_ #define HUB_H_ -#include "UsbCommon.h" +#include "UsbDevice.h" -/* same as Linux kernel root hubs */ -typedef enum { - STR_MANUFACTURER = 1, - STR_PRODUCT, - STR_SERIALNUMBER, -}; +struct USBHubState; // forward declare /* Class which implements a usb hub */ class Hub { public: + // usb device this hub is attached to + USBDevice* m_UsbDev = nullptr; + // initialize this peripheral int Init(int pport); - // destructor - ~Hub(); + // destroy hub resources + void HubCleanUp(); private: - // usb device this hub is attached to - USBDevice* m_UsbDev = nullptr; // hub state USBHubState* m_HubState = nullptr; // hub class functions @@ -75,7 +71,7 @@ class Hub void UsbHub_HandleControl(XboxDeviceState* dev, USBPacket* p, int request, int value, int index, int length, uint8_t* data); void UsbHub_HandleData(XboxDeviceState* dev, USBPacket* p); - void UsbHub_HandleDestroy(XboxDeviceState* dev); + void UsbHub_HandleDestroy(); // see USBPortOps struct for info void UsbHub_Attach(USBPort* port1); void UsbHub_Detach(USBPort* port1); @@ -91,5 +87,6 @@ class Hub }; extern Hub* g_HubObjArray[4]; +extern int PlayerToUsbArray[5]; #endif diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index 2b24b5a44..66be2727a 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -1791,9 +1791,3 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) } return 1; } - -void OHCI::OHCI_AssignUsbPortStruct(int port, XboxDeviceState* dev) -{ - dev->Port = &m_Registers.RhPort[port].UsbPort; - m_Registers.RhPort[port].UsbPort.Dev = dev; -} diff --git a/src/devices/usb/OHCI.h b/src/devices/usb/OHCI.h index 85efceca7..84ad3fcb4 100644 --- a/src/devices/usb/OHCI.h +++ b/src/devices/usb/OHCI.h @@ -40,16 +40,6 @@ #include "USBDevice.h" #include "..\CxbxKrnl\Timer.h" -#define USB_RET_SUCCESS (0) -#define USB_RET_NODEV (-1) -#define USB_RET_NAK (-2) -#define USB_RET_STALL (-3) -#define USB_RET_BABBLE (-4) -#define USB_RET_IOERROR (-5) -#define USB_RET_ASYNC (-6) -#define USB_RET_ADD_TO_QUEUE (-7) -#define USB_RET_REMOVE_FROM_QUEUE (-8) - // Abbreviations used: // OHCI: Open Host Controller Interface; the standard used on the Xbox to comunicate with the usb devices @@ -158,8 +148,6 @@ class OHCI uint32_t OHCI_ReadRegister(xbaddr Addr); // write a register void OHCI_WriteRegister(xbaddr Addr, uint32_t Value); - // update the USBPort struct with the device attached - void OHCI_AssignUsbPortStruct(int port, XboxDeviceState* dev); private: diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index cf6c7beb8..ccc585100 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -92,6 +92,14 @@ void USBDevice::USB_RegisterPort(USBPort* Port, int Index, int SpeedMask, USBPor Port->SpeedMask = SpeedMask; Port->Operations = Ops; USB_PortLocation(Port, nullptr, Index + 1); + m_FreePorts.push_back(Port); +} + +void USBDevice::USB_UnregisterPort(USBPort* Port) +{ + auto it = std::find(m_FreePorts.begin(), m_FreePorts.end(), Port); + assert(it != m_FreePorts.end()); + m_FreePorts.erase(it); } void USBDevice::USB_PortReset(USBPort* Port) @@ -633,13 +641,10 @@ void USBDevice::USB_EPsetMaxPacketSize(XboxDeviceState* dev, int pid, int ep, ui void USBDevice::USB_PortLocation(USBPort* downstream, USBPort* upstream, int portnr) { if (upstream) { - std::snprintf(downstream->Path, sizeof(downstream->Path), "%s.%d", - upstream->Path, portnr); - downstream->HubCount = upstream->HubCount + 1; + std::snprintf(downstream->Path, sizeof(downstream->Path), "%s.%d", upstream->Path, portnr); } else { std::snprintf(downstream->Path, sizeof(downstream->Path), "%d", portnr); - downstream->HubCount = 0; } } @@ -1264,3 +1269,4 @@ const char* USBDevice::USBDesc_GetString(XboxDeviceState* dev, int index) return nullptr; } + diff --git a/src/devices/usb/USBDevice.h b/src/devices/usb/USBDevice.h index 0d49c4012..fc9bc9c97 100644 --- a/src/devices/usb/USBDevice.h +++ b/src/devices/usb/USBDevice.h @@ -39,6 +39,7 @@ #include "..\PCIDevice.h" #include "UsbCommon.h" +#include // Forward declare OHCI class for m_HostController pointer @@ -67,9 +68,13 @@ class USBDevice : public PCIDevice { OHCI* m_HostController; // PCI path of this usb device const char* m_PciPath; + // free usb ports on this device (hubs included) + std::vector m_FreePorts; // register a port with the HC void USB_RegisterPort(USBPort* Port, int Index, int SpeedMask, USBPortOps* Ops); + // free a port with the HC + void USB_UnregisterPort(USBPort* Port); // reset a usb port void USB_PortReset(USBPort* Port); // update device status during an attach diff --git a/src/devices/usb/UsbCommon.h b/src/devices/usb/UsbCommon.h index dff12bb44..a60a26863 100644 --- a/src/devices/usb/UsbCommon.h +++ b/src/devices/usb/UsbCommon.h @@ -39,6 +39,7 @@ #include "CxbxCommon.h" #include "..\devices\video\queue.h" +#include "..\CxbxKrnl\EmuKrnl.h" // For EmuWarning #include #define USB_MAX_ENDPOINTS 15 @@ -123,6 +124,16 @@ #define USB_DT_INTERFACE 0x04 #define USB_DT_ENDPOINT 0x05 +#define USB_RET_SUCCESS (0) +#define USB_RET_NODEV (-1) +#define USB_RET_NAK (-2) +#define USB_RET_STALL (-3) +#define USB_RET_BABBLE (-4) +#define USB_RET_IOERROR (-5) +#define USB_RET_ASYNC (-6) +#define USB_RET_ADD_TO_QUEUE (-7) +#define USB_RET_REMOVE_FROM_QUEUE (-8) + typedef enum _USB_SPEED { @@ -186,7 +197,7 @@ struct USBDescIface { uint8_t ndesc; // number of device-specific class descriptors (if any) USBDescOther* descs; // pointer to the extra class descriptors USBDescEndpoint* eps; // endpoints supported by this interface - USBDescIface(bool bDefault); + USBDescIface(); ~USBDescIface(); }; @@ -216,7 +227,7 @@ struct USBDescDevice { uint8_t bMaxPacketSize0; // maximum packet size for endpoint zero (only 8, 16, 32, or 64 are valid) uint8_t bNumConfigurations; // number of possible configurations const USBDescConfig* confs; // configurations supported by this device - USBDescDevice(bool bDefault); + USBDescDevice(); ~USBDescDevice(); }; @@ -234,7 +245,7 @@ struct USBDescID { struct USBDesc { USBDescID id; // id-specific info of the device descriptor const USBDescDevice* full; // remaining fields of the device descriptor - USBDesc(bool bDefault); + USBDesc(); }; #pragma pack(1) @@ -391,7 +402,6 @@ struct USBPort { XboxDeviceState* Dev; // usb device (if present) USBPortOps* Operations; // functions to call when a port event happens int SpeedMask; // usb speeds supported - int HubCount; // number of hubs chained char Path[16]; // the number of the port + 1, used to create a serial number for this device int PortIndex; // internal port index }; @@ -408,7 +418,7 @@ struct USBDeviceClass { std::function cancel_packet; // Called when device is destroyed. - std::function handle_destroy; + std::function handle_destroy; // Attach the device std::function handle_attach; diff --git a/src/devices/usb/XidGamepad.cpp b/src/devices/usb/XidGamepad.cpp new file mode 100644 index 000000000..ad6e21ab3 --- /dev/null +++ b/src/devices/usb/XidGamepad.cpp @@ -0,0 +1,432 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * Cxbx->devices->usb->XidGamepad.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** + +#include "XidGamepad.h" +#include "USBDevice.h" + +#define USB_CLASS_XID 0x58 +#define USB_DT_XID 0x42 + +#define HID_GET_REPORT 0x01 +#define HID_SET_REPORT 0x09 +#define XID_GET_CAPABILITIES 0x01 + + +#pragma pack(1) + +/* Class-specific xid descriptor */ +struct XIDDesc { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdXid; + uint8_t bType; + uint8_t bSubType; + uint8_t bMaxInputReportSize; + uint8_t bMaxOutputReportSize; + uint16_t wAlternateProductIds[4]; + XIDDesc(); +}; + +/* Struct used by the Get_Report request -> buttons state */ +struct XIDGamepadReport { + uint8_t bReportId; + uint8_t bLength; + uint16_t wButtons; // all non-analog buttons + uint8_t bAnalogButtons[8]; // X, Y, A, B, white, black, left/right trigger + int16_t sThumbLX; // analog stick, left X + int16_t sThumbLY; // analog stick, left Y + int16_t sThumbRX; // analog stick, right X + int16_t sThumbRY; // analog stick, right Y +}; + +/* Struct used by the Set_Report request -> vibration strenght */ +struct XIDGamepadOutputReport { + uint8_t report_id; // From XQEMU: FIXME: is this correct? + uint8_t length; + uint16_t left_actuator_strength; // strenght of left vibration motor + uint16_t right_actuator_strength; // strenght of right vibration motor +}; + +#pragma pack() + +struct USBXIDState { + XboxDeviceState dev; // gamepad device status + USBEndpoint* intr; // interrupt endpoint of the gamepad + + const XIDDesc* xid_desc; // xid-specific descriptor + + //QEMUPutKbdEntry *kbd_entry; + bool in_dirty; // indicates a change in the button's state + XIDGamepadReport in_state; // Get_Report struct + XIDGamepadOutputReport out_state; // Ser_Report struct +}; + +USBDescIface::USBDescIface() +{ + std::memset(this, 0, sizeof(USBDescIface)); + eps = new USBDescEndpoint[2](); + bInterfaceNumber = 0; + bNumEndpoints = 2; + bInterfaceClass = USB_CLASS_XID; + bInterfaceSubClass = 0x42; + bInterfaceProtocol = 0x00; + eps->bEndpointAddress = USB_DIR_IN | 0x02; + eps->bmAttributes = USB_ENDPOINT_XFER_INT; + eps->wMaxPacketSize = 0x20; + eps->bInterval = 4; + eps++; + eps->bEndpointAddress = USB_DIR_OUT | 0x02; + eps->bmAttributes = USB_ENDPOINT_XFER_INT; + eps->wMaxPacketSize = 0x20; + eps->bInterval = 4; +} + +USBDescIface::~USBDescIface() +{ + delete[] eps; +} + +static const USBDescIface desc_iface_xbox_gamepad; + +USBDescDevice::USBDescDevice() +{ + std::memset(this, 0, sizeof(USBDescDevice)); + USBDescConfig* pUSBDescConfig = new USBDescConfig(); + bcdUSB = 0x0110; + bMaxPacketSize0 = 0x40; + bNumConfigurations = 1; + pUSBDescConfig->bNumInterfaces = 1; + pUSBDescConfig->bConfigurationValue = 1; + pUSBDescConfig->bmAttributes = 0x80; + pUSBDescConfig->bMaxPower = 50; + pUSBDescConfig->nif = 1; + pUSBDescConfig->ifs = &desc_iface_xbox_gamepad; + confs = pUSBDescConfig; +} + +USBDescDevice::~USBDescDevice() +{ + delete confs; +} + +static const USBDescDevice desc_device_xbox_gamepad; + +USBDesc::USBDesc() +{ + std::memset(this, 0, sizeof(USBDesc)); + id.idVendor = 0x045E; + id.idProduct = 0x0202; + id.bcdDevice = 0x0100; + full = &desc_device_xbox_gamepad; +} + +static const USBDesc desc_xbox_gamepad; + +XIDDesc::XIDDesc() +{ + bLength = 0x10; + bDescriptorType = USB_DT_XID; + bcdXid = 1; + bType = 1; + bSubType = 1; + bMaxInputReportSize = 0x20; + bMaxOutputReportSize = 0x6; + wAlternateProductIds[0] = -1; + wAlternateProductIds[1] = -1; + wAlternateProductIds[2] = -1; + wAlternateProductIds[3] = -1; +} + +static const XIDDesc desc_xid_xbox_gamepad; + +int XidGamepad::Init(int pport) +{ + if (pport > 4 || pport < 1) { return -1; }; + + XboxDeviceState* dev = ClassInitFn(); + int rc = UsbXidClaimPort(dev, pport); + if (rc != 0) { + return rc; + } + m_UsbDev->USB_EpInit(dev); + m_UsbDev->USB_DeviceInit(dev); + m_UsbDev->USB_DeviceAttach(dev); + + return 0; +} + +XboxDeviceState* XidGamepad::ClassInitFn() +{ + m_pPeripheralFuncStruct = new USBDeviceClass(); + m_XidState = new USBXIDState(); + XboxDeviceState* dev = &m_XidState->dev; + + dev->ProductDesc = "Microsoft Xbox Controller"; + QLIST_INIT(&dev->Strings); + dev->klass = m_pPeripheralFuncStruct; + + { + using namespace std::placeholders; + + m_pPeripheralFuncStruct->init = std::bind(&XidGamepad::UsbXid_Initfn, this, _1); + m_pPeripheralFuncStruct->handle_reset = std::bind(&XidGamepad::UsbXid_HandleReset, this); + m_pPeripheralFuncStruct->handle_control = std::bind(&XidGamepad::UsbXid_HandleControl, this, _1, _2, _3, _4, _5, _6, _7); + m_pPeripheralFuncStruct->handle_data = std::bind(&XidGamepad::UsbXid_HandleData, this, _1, _2); + m_pPeripheralFuncStruct->handle_destroy = std::bind(&XidGamepad::UsbXid_HandleDestroy, this); + m_pPeripheralFuncStruct->handle_attach = std::bind(&XidGamepad::UsbXid_Attach, this, _1); + m_pPeripheralFuncStruct->product_desc = dev->ProductDesc.c_str(); + m_pPeripheralFuncStruct->usb_desc = &desc_xbox_gamepad; + } + + return dev; +} + +int XidGamepad::UsbXidClaimPort(XboxDeviceState* dev, int pport) +{ + int i; + int usb_port; + int port_offset; + std::vector::iterator it; + + assert(dev->Port == nullptr); + + usb_port = PlayerToUsbArray[pport]; + for (int j = 0; j < 4; j++) { + if (g_HubObjArray[j]) { + i = 0; + for (auto port : g_HubObjArray[j]->m_UsbDev->m_FreePorts) { + if (strcmp(port->Path, (std::to_string(usb_port) + ".2").c_str()) == 0) { + m_UsbDev = g_HubObjArray[j]->m_UsbDev; + break; + } + i++; + } + } + } + if (m_UsbDev == nullptr) { + EmuWarning("Port requested %d.%d not found (in use?)", usb_port, 2); + return -1; + } + it = m_UsbDev->m_FreePorts.begin() + i; + dev->Port = *it; + (*it)->Dev = dev; + m_UsbDev->m_FreePorts.erase(it); + + return 0; +} + +void XidGamepad::UsbXidReleasePort(XboxDeviceState* dev) +{ + USBPort* port = dev->Port; + + assert(port != nullptr); + + port->Dev = nullptr; + dev->Port = nullptr; +} + +int XidGamepad::UsbXid_Initfn(XboxDeviceState* dev) +{ + m_UsbDev->USBDesc_Init(dev); + m_XidState->intr = m_UsbDev->USB_GetEP(dev, USB_TOKEN_IN, 2); + + m_XidState->in_state.bLength = sizeof(m_XidState->in_state); + m_XidState->out_state.length = sizeof(m_XidState->out_state); + //m_XidState->kbd_entry = qemu_add_kbd_event_handler(xbox_gamepad_keyboard_event, m_XidState); TODO + m_XidState->xid_desc = &desc_xid_xbox_gamepad; + + return 0; +} + +void XidGamepad::UsbXid_HandleDestroy() +{ + UsbXidReleasePort(&m_XidState->dev); + XidCleanUp(); +} + +void XidGamepad::UsbXid_Attach(XboxDeviceState* dev) +{ + if ((dev->Port->SpeedMask & USB_SPEED_MASK_FULL)) { + dev->Speed = USB_SPEED_FULL; + } + else { + return; + } + m_UsbDev->USBDesc_SetDefaults(dev); +} + +void XidGamepad::UsbXid_HandleReset() +{ + DbgPrintf("Gamepad reset event\n"); +} + +void XidGamepad::UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, + int request, int value, int index, int length, uint8_t* data) +{ + int ret = m_UsbDev->USBDesc_HandleControl(dev, p, request, value, index, length, data); + if (ret >= 0) { + DbgPrintf("Gamepad handled by USBDesc_HandleControl, ret is %d\n", ret); + return; + } + + switch (request) { + // HID-specific requests + case ClassInterfaceRequest | HID_GET_REPORT: { + // From the HID standard: "The Get_Report request allows the host to receive a report via the Control pipe. + // The wValue field specifies the Report Type in the high byte and the Report ID in the low byte. Set Report ID + // to 0 (zero) if Report IDs are not used. 01 = input, 02 = output, 03 = feature, 04-FF = reserved" + DbgPrintf("Gamepad GET_REPORT 0x%X\n", value); + if (value == 0x100) { + assert(m_XidState->in_state.bLength <= length); + // m_XidState->in_state.bReportId++; /* FIXME: I'm not sure if bReportId is just a counter */ + std::memcpy(data, &m_XidState->in_state, m_XidState->in_state.bLength); + p->ActualLength = m_XidState->in_state.bLength; + } + else { + assert(0); + } + break; + } + + case ClassInterfaceOutRequest | HID_SET_REPORT: { + // From the HID standard: "The Set_Report request allows the host to send a report to the device, possibly + // setting the state of input, output, or feature controls. The meaning of the request fields for the Set_Report + // request is the same as for the Get_Report request, however the data direction is reversed and the Report + // Data is sent from host to device." + DbgPrintf("Gamepad SET_REPORT 0x%X\n", value); + if (value == 0x200) { + // Read length, then the entire packet + std::memcpy(&m_XidState->out_state, data, sizeof(m_XidState->out_state)); + assert(m_XidState->out_state.length == sizeof(m_XidState->out_state)); + assert(m_XidState->out_state.length <= length); + //FIXME: Check actuator endianess + DbgPrintf("Set rumble power to left: 0x%X and right: 0x%X\n", + m_XidState->out_state.left_actuator_strength, + m_XidState->out_state.right_actuator_strength); + p->ActualLength = m_XidState->out_state.length; + } + else { + assert(0); + } + break; + } + + // XID-specific requests + case VendorInterfaceRequest | USB_REQ_GET_DESCRIPTOR: { + DbgPrintf("Gamepad GET_DESCRIPTOR 0x%x\n", value); + if (value == 0x4200) { + assert(m_XidState->xid_desc->bLength <= length); + std::memcpy(data, m_XidState->xid_desc, m_XidState->xid_desc->bLength); + p->ActualLength = m_XidState->xid_desc->bLength; + } + else { + assert(0); + } + break; + } + + case VendorInterfaceRequest | XID_GET_CAPABILITIES: { + DbgPrintf("Gamepad XID_GET_CAPABILITIES 0x%x\n", value); + /* FIXME: ! */ + p->Status = USB_RET_STALL; + //assert(false); + break; + } + + case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_DEVICE) << 8) | USB_REQ_GET_DESCRIPTOR: { + /* FIXME: ! */ + DbgPrintf("Gamepad unknown xpad request 0x%X: value = 0x%X\n", request, value); + std::memset(data, 0x00, length); + //FIXME: Intended for the hub: usbd_get_hub_descriptor, UT_READ_CLASS?! + p->Status = USB_RET_STALL; + //assert(false); + break; + } + + case ((USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_ENDPOINT) << 8) | USB_REQ_CLEAR_FEATURE: { + /* FIXME: ! */ + DbgPrintf("Gamepad unknown xpad request 0x%X: value = 0x%X\n", request, value); + std::memset(data, 0x00, length); + p->Status = USB_RET_STALL; + break; + } + + default: + DbgPrintf("Gamepad USB stalled on request 0x%X value 0x%X\n", request, value); + p->Status = USB_RET_STALL; + assert(0); + break; + } +} + +void XidGamepad::UsbXid_HandleData(XboxDeviceState* dev, USBPacket* p) +{ + switch (p->Pid) { + case USB_TOKEN_IN: { + if (p->Endpoint->Num == 2) { + if (m_XidState->in_dirty) { + m_UsbDev->USB_PacketCopy(p, &m_XidState->in_state, m_XidState->in_state.bLength); + m_XidState->in_dirty = false; + } + else { + p->Status = USB_RET_NAK; + } + } + else { + assert(0); + } + break; + } + + case USB_TOKEN_OUT: { + p->Status = USB_RET_STALL; + break; + } + + default: + p->Status = USB_RET_STALL; + assert(0); + break; + } +} + +void XidGamepad::XidCleanUp() +{ + delete m_pPeripheralFuncStruct; + delete m_XidState; + m_pPeripheralFuncStruct = nullptr; + m_XidState = nullptr; +} diff --git a/src/devices/usb/XidGamepad.h b/src/devices/usb/XidGamepad.h new file mode 100644 index 000000000..d4e5d5648 --- /dev/null +++ b/src/devices/usb/XidGamepad.h @@ -0,0 +1,80 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * Cxbx->devices->usb->XidGamepad.h +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** + +#ifndef XIDGAMEPAD_H_ +#define XIDGAMEPAD_H_ + +#include "Hub.h" + + +struct USBXIDState; // forward declare + + +/* Class which implements an xbox gamepad */ +class XidGamepad +{ + public: + // initialize this peripheral + int Init(int pport); + // destroy gamepad resources + void XidCleanUp(); + + + private: + // usb device this gamepad is attached to through the hub + USBDevice* m_UsbDev = nullptr; + // gamepad state + USBXIDState* m_XidState = nullptr; + // gamepad class functions + USBDeviceClass* m_pPeripheralFuncStruct = nullptr; + + // initialize various member variables/functions + XboxDeviceState* ClassInitFn(); + // reserve a usb port for this gamepad + int UsbXidClaimPort(XboxDeviceState* dev, int pport); + // free the usb port used by this gamepad + void UsbXidReleasePort(XboxDeviceState* dev); + // see USBDeviceClass for comments about these functions + int UsbXid_Initfn(XboxDeviceState* dev); + void UsbXid_HandleDestroy(); + void UsbXid_Attach(XboxDeviceState* dev); + void UsbXid_HandleReset(); + void UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, + int request, int value, int index, int length, uint8_t* data); + void UsbXid_HandleData(XboxDeviceState* dev, USBPacket* p); +}; + +#endif \ No newline at end of file From 2680f4b6e8474dfb45bebf610108932ce18eb395 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Sun, 8 Jul 2018 23:41:13 +0200 Subject: [PATCH 0049/1000] Added usb packet logging solution configuration --- build/win32/Cxbx.sln | 50 ++++++++++ build/win32/Cxbx.vcxproj | 164 ++++++++++++++++++++++++++++++++- src/devices/usb/Hub.cpp | 7 -- src/devices/usb/OHCI.cpp | 82 ++++++++--------- src/devices/usb/OHCI.h | 2 +- src/devices/usb/USBDevice.h | 4 - src/devices/usb/UsbCommon.h | 7 ++ src/devices/usb/XidGamepad.cpp | 2 +- 8 files changed, 260 insertions(+), 58 deletions(-) diff --git a/build/win32/Cxbx.sln b/build/win32/Cxbx.sln index 76af6839a..cf635d831 100644 --- a/build/win32/Cxbx.sln +++ b/build/win32/Cxbx.sln @@ -32,6 +32,9 @@ Global Debug_Direct3D9|Any CPU = Debug_Direct3D9|Any CPU Debug_Direct3D9|Win32 = Debug_Direct3D9|Win32 Debug_Direct3D9|x64 = Debug_Direct3D9|x64 + Debug_USB_Packets|Any CPU = Debug_USB_Packets|Any CPU + Debug_USB_Packets|Win32 = Debug_USB_Packets|Win32 + Debug_USB_Packets|x64 = Debug_USB_Packets|x64 Debug|Any CPU = Debug|Any CPU Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 @@ -44,6 +47,11 @@ Global {E7A72D3D-5810-4078-A243-348B59726365}.Debug_Direct3D9|Win32.ActiveCfg = Debug_Direct3D9|Win32 {E7A72D3D-5810-4078-A243-348B59726365}.Debug_Direct3D9|Win32.Build.0 = Debug_Direct3D9|Win32 {E7A72D3D-5810-4078-A243-348B59726365}.Debug_Direct3D9|x64.ActiveCfg = Debug|Win32 + {E7A72D3D-5810-4078-A243-348B59726365}.Debug_USB_Packets|Any CPU.ActiveCfg = Debug_USB_Packets|Win32 + {E7A72D3D-5810-4078-A243-348B59726365}.Debug_USB_Packets|Any CPU.Build.0 = Debug_USB_Packets|Win32 + {E7A72D3D-5810-4078-A243-348B59726365}.Debug_USB_Packets|Win32.ActiveCfg = Debug_USB_Packets|Win32 + {E7A72D3D-5810-4078-A243-348B59726365}.Debug_USB_Packets|Win32.Build.0 = Debug_USB_Packets|Win32 + {E7A72D3D-5810-4078-A243-348B59726365}.Debug_USB_Packets|x64.ActiveCfg = Debug|Win32 {E7A72D3D-5810-4078-A243-348B59726365}.Debug|Any CPU.ActiveCfg = Debug|Win32 {E7A72D3D-5810-4078-A243-348B59726365}.Debug|Win32.ActiveCfg = Debug|Win32 {E7A72D3D-5810-4078-A243-348B59726365}.Debug|Win32.Build.0 = Debug|Win32 @@ -57,6 +65,12 @@ Global {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_Direct3D9|x64.ActiveCfg = Debug|x64 {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_Direct3D9|x64.Build.0 = Debug|x64 + {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_USB_Packets|Any CPU.ActiveCfg = Debug|Win32 + {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_USB_Packets|Any CPU.Build.0 = Debug|Win32 + {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Win32 + {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_USB_Packets|Win32.Build.0 = Debug|Win32 + {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_USB_Packets|x64.ActiveCfg = Debug|x64 + {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_USB_Packets|x64.Build.0 = Debug|x64 {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug|Any CPU.ActiveCfg = Debug|Win32 {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug|Win32.ActiveCfg = Debug|Win32 {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug|Win32.Build.0 = Debug|Win32 @@ -72,6 +86,11 @@ Global {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_Direct3D9|x64.ActiveCfg = Debug|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_Direct3D9|x64.Build.0 = Debug|Any CPU + {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_USB_Packets|Any CPU.ActiveCfg = Debug|Any CPU + {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_USB_Packets|Any CPU.Build.0 = Debug|Any CPU + {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Any CPU + {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_USB_Packets|x64.ActiveCfg = Debug|Any CPU + {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_USB_Packets|x64.Build.0 = Debug|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug|Any CPU.Build.0 = Debug|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug|Win32.ActiveCfg = Debug|Any CPU @@ -87,6 +106,11 @@ Global {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Any CPU {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_Direct3D9|x64.ActiveCfg = Debug|Any CPU {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_Direct3D9|x64.Build.0 = Debug|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_USB_Packets|Any CPU.ActiveCfg = Debug|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_USB_Packets|Any CPU.Build.0 = Debug|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_USB_Packets|x64.ActiveCfg = Debug|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_USB_Packets|x64.Build.0 = Debug|Any CPU {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug|Any CPU.Build.0 = Debug|Any CPU {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug|Win32.ActiveCfg = Debug|Any CPU @@ -102,6 +126,13 @@ Global {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|x64.ActiveCfg = Release|Win32 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|x64.Build.0 = Release|Win32 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|x64.ActiveCfg = Debug|x64 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|x64.Build.0 = Debug|x64 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_USB_Packets|Any CPU.ActiveCfg = Debug|Win32 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Win32 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_USB_Packets|Win32.Build.0 = Debug|Win32 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_USB_Packets|x64.ActiveCfg = Debug|x64 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_USB_Packets|x64.Build.0 = Debug|x64 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug|Any CPU.ActiveCfg = Debug|Win32 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug|Win32.ActiveCfg = Debug|Win32 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug|Win32.Build.0 = Debug|Win32 @@ -139,6 +170,25 @@ Global {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Release|Win32.Build.0 = Release|Win32 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Release|x64.ActiveCfg = Release|x64 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Release|x64.Build.0 = Release|x64 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|x64.ActiveCfg = Release|x64 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|x64.Build.0 = Release|x64 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_Direct3D9|Any CPU.ActiveCfg = Debug|Win32 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Win32 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_Direct3D9|x64.ActiveCfg = Debug|Win32 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_USB_Packets|Any CPU.ActiveCfg = Debug|Win32 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_USB_Packets|Any CPU.Build.0 = Debug|Win32 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Win32 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_USB_Packets|Win32.Build.0 = Debug|Win32 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_USB_Packets|x64.ActiveCfg = Debug|Win32 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug|Win32.ActiveCfg = Debug|Win32 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug|Win32.Build.0 = Debug|Win32 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug|x64.ActiveCfg = Debug|Win32 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Release|Any CPU.ActiveCfg = Release|Win32 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Release|Win32.ActiveCfg = Release|Win32 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Release|Win32.Build.0 = Release|Win32 + {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Release|x64.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index 06074b041..11015f114 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -5,6 +5,10 @@ Debug_Direct3D9 Win32 + + Debug_USB_Packets + Win32 + Debug Win32 @@ -32,6 +36,12 @@ MultiByte $(DefaultPlatformToolset) + + Application + false + MultiByte + $(DefaultPlatformToolset) + Application false @@ -49,6 +59,10 @@ + + + + @@ -57,20 +71,26 @@ <_ProjectFileVersion>10.0.40219.1 false + false false false AllRules.ruleset + AllRules.ruleset AllRules.ruleset + + AllRules.ruleset ..\..\import\DirectX8\include;$(IncludePath) + ..\..\import\DirectX8\include;$(IncludePath) ..\..\import\DirectX9\include;$(IncludePath) ..\..\import\DirectX8\lib;$(LibraryPath) + ..\..\import\DirectX8\lib;$(LibraryPath) $(LibraryPath) ..\..\import\DirectX8\include;$(IncludePath) ..\..\import\DirectX8\lib;$(LibraryPath) @@ -80,6 +100,11 @@ $(Configuration)\$(ProjectName)\ + + Build + + $(Configuration)\$(ProjectName) + Build @@ -150,6 +175,67 @@ Generate version header + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\..\..\bin\debug/Cxbx.tlb + + + + + Disabled + ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\ + NOMINMAX;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;DEBUG_PACKET;DEBUG_ISOCH;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + false + Level3 + true + ProgramDatabase + true + StreamingSIMDExtensions2 + true + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + Include\Win32\Cxbx;%(AdditionalIncludeDirectories) + + + legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;%(AdditionalDependencies) + true + $(Configuration)\;..\..\import\distorm\lib\Win32\;..\..\import\glew-2.0.0\lib\Release\Win32\;%(AdditionalLibraryDirectories) + msvcrt;%(IgnoreSpecificDefaultLibraries) + true + true + Windows + false + + + MachineX86 + false + 0x10000 + true + true + + + true + + + copy $(SolutionDir)..\..\import\glew-2.0.0\bin\Release\Win32\glew32.dll $(TargetDir) + + + + + + + CALL "$(SolutionDir)Version.bat" "$(SolutionDir)..\..\src\Version.h" + Generate version header + + _DEBUG;%(PreprocessorDefinitions) @@ -413,8 +499,10 @@ %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) \cxbx\git\cxbx-ds\resource;%(AdditionalIncludeDirectories) + \cxbx\git\cxbx-ds\resource;%(AdditionalIncludeDirectories) \cxbx\git\cxbx-ds\resource;%(AdditionalIncludeDirectories) %(PreprocessorDefinitions) \cxbx\git\cxbx-ds\resource;%(AdditionalIncludeDirectories) @@ -434,9 +522,11 @@ %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -444,115 +534,143 @@ %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) false %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -576,9 +694,11 @@ %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -588,45 +708,65 @@ %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) - + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -635,9 +775,11 @@ %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -648,8 +790,10 @@ %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) @@ -657,24 +801,30 @@ %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) @@ -682,48 +832,60 @@ %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index a5a7946a5..10e7a3f11 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -91,13 +91,6 @@ int PlayerToUsbArray[] = { 2, }; -/* same as Linux kernel root hubs */ -typedef enum { - STR_MANUFACTURER = 1, - STR_PRODUCT, - STR_SERIALNUMBER, -}; - struct USBHubPort { USBPort port; // downstream port status uint16_t wPortStatus; // Port Status Field, in accordance with the standard diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index 66be2727a..77cafdf5b 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -532,14 +532,14 @@ int OHCI::OHCI_ServiceEDlist(xbaddr Head, int Completion) while ((ed.HeadP & OHCI_DPTR_MASK) != ed.TailP) { // a TD is available to be processed #ifdef DEBUG_PACKET - DPRINTF("ED @ 0x%.8x fa=%u en=%u d=%u s=%u k=%u f=%u mps=%u " - "h=%u c=%u\n head=0x%.8x tailp=0x%.8x next=0x%.8x\n", cur, - OHCI_BM(ed.flags, ED_FA), OHCI_BM(ed.flags, ED_EN), - OHCI_BM(ed.flags, ED_D), (ed.flags & OHCI_ED_S) != 0, - (ed.flags & OHCI_ED_K) != 0, (ed.flags & OHCI_ED_F) != 0, - OHCI_BM(ed.flags, ED_MPS), (ed.head & OHCI_ED_H) != 0, - (ed.head & OHCI_ED_C) != 0, ed.head & OHCI_DPTR_MASK, - ed.tail & OHCI_DPTR_MASK, ed.next & OHCI_DPTR_MASK); + printf("ED @ 0x%.8x fa=%u en=%u d=%u s=%u k=%u f=%u mps=%u " + "h=%u c=%u\n head=0x%.8x tailp=0x%.8x next=0x%.8x\n", current, + OHCI_BM(ed.Flags, ED_FA), OHCI_BM(ed.Flags, ED_EN), + OHCI_BM(ed.Flags, ED_D), (ed.Flags & OHCI_ED_S) != 0, + (ed.Flags & OHCI_ED_K) != 0, (ed.Flags & OHCI_ED_F) != 0, + OHCI_BM(ed.Flags, ED_MPS), (ed.HeadP & OHCI_ED_H) != 0, + (ed.HeadP & OHCI_ED_C) != 0, ed.HeadP & OHCI_DPTR_MASK, + ed.TailP & OHCI_DPTR_MASK, ed.NextED & OHCI_DPTR_MASK); #endif active = 1; @@ -571,7 +571,7 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) int direction; size_t length = 0, packetlen = 0; #ifdef DEBUG_PACKET - const char *str = NULL; + const char *str = nullptr; #endif int pid; int ret; @@ -587,10 +587,7 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) // See if this TD has already been submitted to the device completion = (addr == m_AsyncTD); if (completion && !m_AsyncComplete) { // ?? -#ifdef DEBUG_PACKET - DPRINTF("Skipping async TD\n"); DbgPrintf("Skipping async TD\n"); -#endif return 1; } if (OHCI_ReadTD(addr, &td)) { @@ -674,16 +671,15 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) flag_r = (td.Flags & OHCI_TD_R) != 0; #ifdef DEBUG_PACKET - DPRINTF(" TD @ 0x%.8x %" PRId64 " of %" PRId64 - " bytes %s r=%d cbp=0x%.8x be=0x%.8x\n", - addr, (int64_t)pktlen, (int64_t)len, str, flag_r, td.cbp, td.be); + printf(" TD @ 0x%.8X %lld of %lld bytes %s r=%d cbp=0x%.8X be=0x%.8X\n", + addr, (int64_t)packetlen, (int64_t)length, str, flag_r, td.CurrentBufferPointer, td.BufferEnd); - if (pktlen > 0 && dir != OHCI_TD_DIR_IN) { - DPRINTF(" data:"); - for (i = 0; i < pktlen; i++) { - printf(" %.2x", ohci->usb_buf[i]); + if (packetlen > 0 && direction != OHCI_TD_DIR_IN) { + printf(" data:"); + for (i = 0; i < packetlen; i++) { + printf(" %.2x", m_UsbBuffer[i]); } - DPRINTF("\n"); + printf("\n"); } #endif if (completion) { @@ -695,9 +691,6 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) // From XQEMU: "??? The hardware should allow one active packet per endpoint. // We only allow one active packet per controller. This should be sufficient // as long as devices respond in a timely manner." -#ifdef DEBUG_PACKET - DPRINTF("Too many pending packets\n"); -#endif DbgPrintf("Ohci: too many pending packets\n"); return 1; } @@ -707,7 +700,7 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) m_UsbDevice->USB_PacketAddBuffer(&m_UsbPacket, m_UsbBuffer, packetlen); m_UsbDevice->USB_HandlePacket(dev, &m_UsbPacket); #ifdef DEBUG_PACKET - DPRINTF("status=%d\n", ohci->usb_packet.status); + printf("status=%d\n", m_UsbPacket.Status); #endif if (m_UsbPacket.Status == USB_RET_ASYNC) { m_UsbDevice->USB_DeviceFlushEPqueue(dev, ep); @@ -728,10 +721,11 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) OHCI_FatalError(); } #ifdef DEBUG_PACKET - DPRINTF(" data:"); - for (i = 0; i < ret; i++) - printf(" %.2x", ohci->usb_buf[i]); - DPRINTF("\n"); + printf(" data:"); + for (i = 0; i < ret; i++) { + printf(" %.2X", m_UsbBuffer[i]); + } + printf("\n"); #endif } else { @@ -1479,7 +1473,7 @@ void OHCI::OHCI_Wakeup(USBPort* port1) void OHCI::OHCI_AsyncCompletePacket(USBPort* port, USBPacket* packet) { #ifdef DEBUG_PACKET - DPRINTF("Async packet complete\n"); + printf("Async packet complete\n"); #endif m_AsyncComplete = 1; OHCI_ProcessLists(1); @@ -1523,7 +1517,7 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) int dir; size_t len = 0; #ifdef DEBUG_ISOCH - const char *str = NULL; + const char* str = nullptr; #endif int pid; int ret; @@ -1553,20 +1547,20 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) relative_frame_number = USUB(m_Registers.HcFmNumber & 0xFFFF, starting_frame); #ifdef DEBUG_ISOCH - printf("--- ISO_TD ED head 0x%.8x tailp 0x%.8x\n" - "0x%.8x 0x%.8x 0x%.8x 0x%.8x\n" - "0x%.8x 0x%.8x 0x%.8x 0x%.8x\n" - "0x%.8x 0x%.8x 0x%.8x 0x%.8x\n" - "frame_number 0x%.8x starting_frame 0x%.8x\n" - "frame_count 0x%.8x relative %d\n" - "di 0x%.8x cc 0x%.8x\n", - ed->head & OHCI_DPTR_MASK, ed->tail & OHCI_DPTR_MASK, - iso_td.flags, iso_td.bp, iso_td.next, iso_td.be, - iso_td.offset[0], iso_td.offset[1], iso_td.offset[2], iso_td.offset[3], - iso_td.offset[4], iso_td.offset[5], iso_td.offset[6], iso_td.offset[7], - ohci->frame_number, starting_frame, + printf("--- ISO_TD ED head 0x%.8X tailp 0x%.8X\n" + "0x%.8X 0x%.8X 0x%.8X 0x%.8X\n" + "0x%.8X 0x%.8X 0x%.8X 0x%.8X\n" + "0x%.8X 0x%.8X 0x%.8X 0x%.8X\n" + "frame_number 0x%.8X starting_frame 0x%.8X\n" + "frame_count 0x%.8X relative %d\n" + "di 0x%.8X cc 0x%.8X\n", + ed->HeadP & OHCI_DPTR_MASK, ed->TailP & OHCI_DPTR_MASK, + iso_td.Flags, iso_td.BufferPage0, iso_td.NextTD, iso_td.BufferEnd, + iso_td.Offset[0], iso_td.Offset[1], iso_td.Offset[2], iso_td.Offset[3], + iso_td.Offset[4], iso_td.Offset[5], iso_td.Offset[6], iso_td.Offset[7], + m_Registers.HcFmNumber, starting_frame, frame_count, relative_frame_number, - OHCI_BM(iso_td.flags, TD_DI), OHCI_BM(iso_td.flags, TD_CC)); + OHCI_BM(iso_td.Flags, TD_DI), OHCI_BM(iso_td.Flags, TD_CC)); #endif if (relative_frame_number < 0) { @@ -1719,7 +1713,7 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) } #ifdef DEBUG_ISOCH - printf("so 0x%.8x eo 0x%.8x\nsa 0x%.8x ea 0x%.8x\ndir %s len %zu ret %d\n", + printf("so 0x%.8X eo 0x%.8X\nsa 0x%.8X ea 0x%.8X\ndir %s len %zu ret %d\n", start_offset, end_offset, start_addr, end_addr, str, len, ret); #endif diff --git a/src/devices/usb/OHCI.h b/src/devices/usb/OHCI.h index 84ad3fcb4..e58116a53 100644 --- a/src/devices/usb/OHCI.h +++ b/src/devices/usb/OHCI.h @@ -202,7 +202,7 @@ class OHCI void OHCI_SetInterrupt(uint32_t Value); // calculate frame time remaining uint32_t OHCI_GetFrameRemaining(); - // + // halt the endpoints of the device void OHCI_StopEndpoints(); // set root hub status void OHCI_SetHubStatus(uint32_t Value); diff --git a/src/devices/usb/USBDevice.h b/src/devices/usb/USBDevice.h index fc9bc9c97..56bd0b3e1 100644 --- a/src/devices/usb/USBDevice.h +++ b/src/devices/usb/USBDevice.h @@ -83,12 +83,8 @@ class USBDevice : public PCIDevice { void USB_Attach(USBPort* Port); // update port status when a device is detached void USB_Detach(USBPort* Port); - // a device downstream from the device attached to the port (attached through a hub) is detached - void ChildDetach(USBPort* Port, XboxDeviceState* Child); // update port status when a device is detached void USB_Wakeup(USBEndpoint* ep); - // TODO - void Complete(USBPort* Port, USBPacket *P); // reset a device void USB_DeviceReset(XboxDeviceState* Dev); // find the device connected to the supplied port and address diff --git a/src/devices/usb/UsbCommon.h b/src/devices/usb/UsbCommon.h index a60a26863..2b1c037fb 100644 --- a/src/devices/usb/UsbCommon.h +++ b/src/devices/usb/UsbCommon.h @@ -152,6 +152,13 @@ typedef enum USBPacketState { } USBPacketState; +/* same as Linux kernel root hubs */ +typedef enum { + STR_MANUFACTURER = 1, + STR_PRODUCT, + STR_SERIALNUMBER, +}; + struct USBPacket; struct XboxDeviceState; diff --git a/src/devices/usb/XidGamepad.cpp b/src/devices/usb/XidGamepad.cpp index ad6e21ab3..16bf24a42 100644 --- a/src/devices/usb/XidGamepad.cpp +++ b/src/devices/usb/XidGamepad.cpp @@ -60,7 +60,7 @@ struct XIDDesc { XIDDesc(); }; -/* Struct used by the Get_Report request -> buttons state */ +/* Struct used by the Get_Report request -> button's state */ struct XIDGamepadReport { uint8_t bReportId; uint8_t bLength; From 7bb0ebddd5b3fb0918bca18c53b5819c172849a8 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Mon, 9 Jul 2018 21:12:01 +0200 Subject: [PATCH 0050/1000] Updated logging --- src/devices/usb/Hub.cpp | 4 +- src/devices/usb/OHCI.cpp | 95 ++++++++++++++++++---------------- src/devices/usb/USBDevice.cpp | 68 +++++++++++++----------- src/devices/usb/UsbCommon.h | 5 +- src/devices/usb/XidGamepad.cpp | 20 +++---- 5 files changed, 101 insertions(+), 91 deletions(-) diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index 10e7a3f11..cff78ab43 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -514,7 +514,7 @@ void Hub::UsbHub_HandleData(XboxDeviceState* dev, USBPacket* p) } if (status != 0) { n = (NUM_PORTS + 1 + 7) / 8; - if (p->IoVec.Size == 1) { /* FreeBSD workaround */ + if (p->IoVec.Size == 1) { // FreeBSD workaround n = 1; } else if (n > p->IoVec.Size) { @@ -528,7 +528,7 @@ void Hub::UsbHub_HandleData(XboxDeviceState* dev, USBPacket* p) m_UsbDev->USB_PacketCopy(p, buf, n); } else { - p->Status = USB_RET_NAK; /* usb11 11.13.1 */ + p->Status = USB_RET_NAK; // usb11 11.13.1 } } else { diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index 77cafdf5b..4335897a2 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -37,6 +37,8 @@ #include "OHCI.h" #include "CxbxKrnl\EmuKrnl.h" // For HalSystemInterrupt +#define LOG_STR_OHCI "Ohci" + /* These macros are used to access the bits of the various registers */ // HcControl #define OHCI_CTL_CBSR ((1<<0)|(1<<1)) // ControlBulkServiceRatio @@ -228,7 +230,7 @@ void OHCI::OHCI_FrameBoundaryWorker() OHCI_HCCA hcca; if (OHCI_ReadHCCA(m_Registers.HcHCCA, &hcca)) { - EmuWarning("Ohci: HCCA read error at physical address 0x%X", m_Registers.HcHCCA); + EmuWarning("%s: HCCA read error at physical address 0x%X", m_Registers.HcHCCA, LOG_STR_OHCI); OHCI_FatalError(); return; } @@ -269,7 +271,7 @@ void OHCI::OHCI_FrameBoundaryWorker() if (!m_Registers.HcDoneHead) { // From the standard: "This is set to zero whenever HC writes the content of this // register to HCCA. It also sets the WritebackDoneHead of HcInterruptStatus." - CxbxKrnlCleanup("Ohci: HcDoneHead is zero but WritebackDoneHead interrupt is not set!\n"); + CxbxKrnlCleanup("%s: HcDoneHead is zero but WritebackDoneHead interrupt is not set!\n", LOG_STR_OHCI); } if (m_Registers.HcInterrupt & m_Registers.HcInterruptStatus) { @@ -296,7 +298,7 @@ void OHCI::OHCI_FrameBoundaryWorker() // Writeback HCCA if (OHCI_WriteHCCA(m_Registers.HcHCCA, &hcca)) { - EmuWarning("Ohci: HCCA write error at physical address 0x%X", m_Registers.HcHCCA); + EmuWarning("%s: HCCA write error at physical address 0x%X", LOG_STR_OHCI, m_Registers.HcHCCA); OHCI_FatalError(); } } @@ -309,7 +311,7 @@ void OHCI::OHCI_FatalError() OHCI_SetInterrupt(OHCI_INTR_UE); OHCI_BusStop(); - DbgPrintf("Ohci: an unrecoverable error occoured!\n"); + DbgPrintf("%s: an unrecoverable error occoured!\n", LOG_STR_OHCI); } bool OHCI::OHCI_ReadHCCA(xbaddr Paddr, OHCI_HCCA* Hcca) @@ -510,7 +512,7 @@ int OHCI::OHCI_ServiceEDlist(xbaddr Head, int Completion) for (current = Head; current; current = next_ed) { if (OHCI_ReadED(current, &ed)) { - EmuWarning("Ohci: ED read error at physical address 0x%X", current); + EmuWarning("%s: ED read error at physical address 0x%X", LOG_STR_OHCI, current); OHCI_FatalError(); return 0; } @@ -551,8 +553,9 @@ int OHCI::OHCI_ServiceEDlist(xbaddr Head, int Completion) } else { // Handle isochronous endpoints - if (OHCI_ServiceIsoTD(&ed, Completion)) + if (OHCI_ServiceIsoTD(&ed, Completion)) { break; + } } } @@ -591,7 +594,7 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) return 1; } if (OHCI_ReadTD(addr, &td)) { - EmuWarning("Ohci: TD read error at physical address 0x%X", addr); + EmuWarning("%s: TD read error at physical address 0x%X", LOG_STR_OHCI, addr); OHCI_FatalError(); return 0; } @@ -639,7 +642,7 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) pid = USB_TOKEN_SETUP; break; default: - EmuWarning("Ohci: bad direction"); + EmuWarning("%s: bad direction", LOG_STR_OHCI); return 1; } @@ -691,7 +694,7 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) // From XQEMU: "??? The hardware should allow one active packet per endpoint. // We only allow one active packet per controller. This should be sufficient // as long as devices respond in a timely manner." - DbgPrintf("Ohci: too many pending packets\n"); + DbgPrintf("%s: too many pending packets\n", LOG_STR_OHCI); return 1; } dev = OHCI_FindDevice(OHCI_BM(Ed->Flags, ED_FA)); @@ -765,29 +768,29 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) } else { if (ret >= 0) { - DbgPrintf("Ohci: Underrun\n"); + DbgPrintf("%s: Underrun\n", LOG_STR_OHCI); OHCI_SET_BM(td.Flags, TD_CC, OHCI_CC_DATAUNDERRUN); } else { switch (ret) { case USB_RET_IOERROR: case USB_RET_NODEV: - DbgPrintf("Ohci: Received DEV ERROR\n"); + DbgPrintf("%s: Received DEV ERROR\n", LOG_STR_OHCI); OHCI_SET_BM(td.Flags, TD_CC, OHCI_CC_DEVICENOTRESPONDING); break; case USB_RET_NAK: - DbgPrintf("Ohci: Received NAK\n"); + DbgPrintf("%s: Received NAK\n", LOG_STR_OHCI); return 1; case USB_RET_STALL: - DbgPrintf("Ohci: Received STALL\n"); + DbgPrintf("%s: Received STALL\n", LOG_STR_OHCI); OHCI_SET_BM(td.Flags, TD_CC, OHCI_CC_STALL); break; case USB_RET_BABBLE: - DbgPrintf("Ohci: Received BABBLE\n"); + DbgPrintf("%s: Received BABBLE\n", LOG_STR_OHCI); OHCI_SET_BM(td.Flags, TD_CC, OHCI_CC_DATAOVERRUN); break; default: - DbgPrintf("Ohci: Bad device response %d\n", ret); + DbgPrintf("%s: Bad device response %d\n", LOG_STR_OHCI, ret); OHCI_SET_BM(td.Flags, TD_CC, OHCI_CC_UNDEXPETEDPID); OHCI_SET_BM(td.Flags, TD_EC, 3); } @@ -887,7 +890,7 @@ void OHCI::OHCI_StateReset() OHCI_StopEndpoints(); - DbgPrintf("Ohci: Reset mode event.\n"); + DbgPrintf("%s: Reset mode event.\n", LOG_STR_OHCI); } void OHCI::OHCI_BusStart() @@ -895,7 +898,7 @@ void OHCI::OHCI_BusStart() // Create the EOF timer. Let's try a factor of 50 (1 virtual ms -> 50 real ms) m_pEOFtimer = Timer_Create(OHCI_FrameBoundaryWrapper, this, 50); - DbgPrintf("Ohci: Operational mode event\n"); + DbgPrintf("%s: Operational mode event\n", LOG_STR_OHCI); // SOF event OHCI_SOF(true); @@ -942,11 +945,11 @@ void OHCI::OHCI_ChangeState(uint32_t Value) case Suspend: OHCI_BusStop(); - DbgPrintf("Ohci: Suspend mode event\n"); + DbgPrintf("%s: Suspend mode event\n", LOG_STR_OHCI); break; case Resume: - DbgPrintf("Ohci: Resume mode event\n"); + DbgPrintf("%s: Resume mode event\n", LOG_STR_OHCI); break; case Reset: @@ -954,7 +957,7 @@ void OHCI::OHCI_ChangeState(uint32_t Value) break; default: - EmuWarning("Ohci: Unknown USB mode!"); + EmuWarning("%s: Unknown USB mode!", LOG_STR_OHCI); } } @@ -973,7 +976,7 @@ uint32_t OHCI::OHCI_ReadRegister(xbaddr Addr) if (Addr & 3) { // The standard allows only aligned reads to the registers - DbgPrintf("Ohci: Unaligned read. Ignoring.\n"); + DbgPrintf("%s: Unaligned read. Ignoring.\n", LOG_STR_OHCI); return ret; } else { @@ -1070,7 +1073,7 @@ uint32_t OHCI::OHCI_ReadRegister(xbaddr Addr) break; default: - EmuWarning("Ohci: Read register operation with bad offset %u. Ignoring.", Addr >> 2); + EmuWarning("%s: Read register operation with bad offset %u. Ignoring.", LOG_STR_OHCI, Addr >> 2); } return ret; } @@ -1080,7 +1083,7 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) { if (Addr & 3) { // The standard allows only aligned writes to the registers - DbgPrintf("Ohci: Unaligned write. Ignoring.\n"); + DbgPrintf("%s: Unaligned write. Ignoring.\n", LOG_STR_OHCI); return; } else { @@ -1157,7 +1160,7 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) case 13: // HcFmInterval { if ((Value & OHCI_FMI_FIT) != (m_Registers.HcFmInterval & OHCI_FMI_FIT)) { - DbgPrintf("Ohci: Changing frame interval duration. New value is %u\n", Value & OHCI_FMI_FI); + DbgPrintf("%s: Changing frame interval duration. New value is %u\n", LOG_STR_OHCI, Value & OHCI_FMI_FI); } m_Registers.HcFmInterval = Value & ~0xC000; } @@ -1201,7 +1204,7 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) break; default: - EmuWarning("Ohci: Write register operation with bad offset %u. Ignoring.", Addr >> 2); + EmuWarning("%s: Write register operation with bad offset %u. Ignoring.", LOG_STR_OHCI, Addr >> 2); } } } @@ -1277,7 +1280,7 @@ void OHCI::OHCI_SetHubStatus(uint32_t Value) for (i = 0; i < 2; i++) { OHCI_PortPower(i, 0); } - DbgPrintf("Ohci: powered down all ports\n"); + DbgPrintf("%s: powered down all ports\n", LOG_STR_OHCI); } if (Value & OHCI_RHS_LPSC) { @@ -1286,7 +1289,7 @@ void OHCI::OHCI_SetHubStatus(uint32_t Value) for (i = 0; i < 2; i++) { OHCI_PortPower(i, 1); } - DbgPrintf("Ohci: powered up all ports\n"); + DbgPrintf("%s: powered up all ports\n", LOG_STR_OHCI); } if (Value & OHCI_RHS_DRWE) { @@ -1335,11 +1338,11 @@ void OHCI::OHCI_PortSetStatus(int PortNum, uint32_t Value) OHCI_PortSetIfConnected(PortNum, Value & OHCI_PORT_PES); if (OHCI_PortSetIfConnected(PortNum, Value & OHCI_PORT_PSS)) { - DbgPrintf("Ohci: port %d: SUSPEND\n", PortNum); + DbgPrintf("%s: port %d: SUSPEND\n", LOG_STR_OHCI, PortNum); } if (OHCI_PortSetIfConnected(PortNum, Value & OHCI_PORT_PRS)) { - DbgPrintf("Ohci: port %d: RESET\n", PortNum); + DbgPrintf("%s: port %d: RESET\n", LOG_STR_OHCI, PortNum); m_UsbDevice->USB_DeviceReset(port->UsbPort.Dev); port->HcRhPortStatus &= ~OHCI_PORT_PRS; // ??? Should this also set OHCI_PORT_PESC @@ -1407,7 +1410,7 @@ void OHCI::OHCI_Detach(USBPort* Port) port->HcRhPortStatus |= OHCI_PORT_PESC; } - DbgPrintf("Ohci: Detached port %d\n", Port->PortIndex); + DbgPrintf("%s: Detached port %d\n", LOG_STR_OHCI, Port->PortIndex); if (old_state != port->HcRhPortStatus) { OHCI_SetInterrupt(OHCI_INTR_RHSC); @@ -1435,7 +1438,7 @@ void OHCI::OHCI_Attach(USBPort* Port) OHCI_SetInterrupt(OHCI_INTR_RD); } - DbgPrintf("Ohci: Attached port %d\n", Port->PortIndex); + DbgPrintf("%s: Attached port %d\n", LOG_STR_OHCI, Port->PortIndex); if (old_state != port->HcRhPortStatus) { OHCI_SetInterrupt(OHCI_INTR_RHSC); @@ -1452,14 +1455,14 @@ void OHCI::OHCI_Wakeup(USBPort* port1) OHCIPort* port = &m_Registers.RhPort[port1->PortIndex]; uint32_t intr = 0; if (port->HcRhPortStatus & OHCI_PORT_PSS) { - DbgPrintf("Ohci: port %d: wakeup\n", port1->PortIndex); + DbgPrintf("%s: port %d: wakeup\n", LOG_STR_OHCI, port1->PortIndex); port->HcRhPortStatus |= OHCI_PORT_PSSC; port->HcRhPortStatus &= ~OHCI_PORT_PSS; intr = OHCI_INTR_RHSC; } // Note that the controller can be suspended even if this port is not if ((m_Registers.HcControl & OHCI_CTL_HCFS) == Suspend) { - DbgPrintf("Ohci: remote-wakeup: SUSPEND->RESUME\n"); + DbgPrintf("%s: remote-wakeup: SUSPEND->RESUME\n", LOG_STR_OHCI); // From the standard: "The only interrupts possible in the USBSUSPEND state are ResumeDetected (the // Host Controller will have changed the HostControllerFunctionalState to the USBRESUME state) // and OwnershipChange." @@ -1494,8 +1497,8 @@ void OHCI::OHCI_ProcessLists(int completion) // Only process the control list if it is enabled (HcControl) and has available TD's (HcCommandStatus) if ((m_Registers.HcControl & OHCI_CTL_CLE) && (m_Registers.HcCommandStatus & OHCI_STATUS_CLF)) { if (m_Registers.HcControlCurrentED && m_Registers.HcControlCurrentED != m_Registers.HcControlHeadED) { - DbgPrintf("Ohci: head 0x%X, current 0x%X\n", - m_Registers.HcControlHeadED, m_Registers.HcControlCurrentED); + DbgPrintf("%s: head 0x%X, current 0x%X\n", + LOG_STR_OHCI, m_Registers.HcControlHeadED, m_Registers.HcControlCurrentED); } if (!OHCI_ServiceEDlist(m_Registers.HcControlHeadED, completion)) { m_Registers.HcControlCurrentED = 0; @@ -1535,7 +1538,7 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) addr = ed->HeadP & OHCI_DPTR_MASK; if (OHCI_ReadIsoTD(addr, &iso_td)) { - DbgPrintf("Ohci: ISO_TD read error at physical address 0x%X\n", addr); + DbgPrintf("%s: ISO_TD read error at physical address 0x%X\n", LOG_STR_OHCI, addr); OHCI_FatalError(); return 0; } @@ -1566,13 +1569,13 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) if (relative_frame_number < 0) { // From the standard: "If the relative frame number is negative, then the current frame is earlier than the 0th frame // of the Isochronous TD and the Host Controller advances to the next ED." - DbgPrintf("Ohci: ISO_TD R=%d < 0\n", relative_frame_number); + DbgPrintf("%s: ISO_TD R=%d < 0\n", LOG_STR_OHCI, relative_frame_number); return 1; } else if (relative_frame_number > frame_count) { // From the standard: "If the relative frame number is greater than // FrameCount, then the Isochronous TD has expired and a error condition exists." - DbgPrintf("Ohci: ISO_TD R=%d > FC=%d\n", relative_frame_number, frame_count); + DbgPrintf("%s: ISO_TD R=%d > FC=%d\n", LOG_STR_OHCI, relative_frame_number, frame_count); OHCI_SET_BM(iso_td.Flags, TD_CC, OHCI_CC_DATAOVERRUN); ed->HeadP &= ~OHCI_DPTR_MASK; ed->HeadP |= (iso_td.NextTD & OHCI_DPTR_MASK); @@ -1613,12 +1616,12 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) pid = USB_TOKEN_SETUP; break; default: - EmuWarning("Ohci: Bad direction %d", dir); + EmuWarning("%s: Bad direction %d", LOG_STR_OHCI, dir); return 1; } if (!iso_td.BufferPage0 || !iso_td.BufferEnd) { - DbgPrintf("Ohci: ISO_TD bp 0x%.8X be 0x%.8X\n", iso_td.BufferPage0, iso_td.BufferEnd); + DbgPrintf("%s: ISO_TD bp 0x%.8X be 0x%.8X\n", LOG_STR_OHCI, iso_td.BufferPage0, iso_td.BufferEnd); return 1; } @@ -1636,12 +1639,12 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) if (!(OHCI_BM(start_offset, TD_PSW_CC) & 0xE) || ((relative_frame_number < frame_count) && !(OHCI_BM(next_offset, TD_PSW_CC) & 0xE))) { - DbgPrintf("Ohci: ISO_TD cc != not accessed 0x%.8x 0x%.8x\n", start_offset, next_offset); + DbgPrintf("%s: ISO_TD cc != not accessed 0x%.8x 0x%.8x\n", LOG_STR_OHCI, start_offset, next_offset); return 1; } if ((relative_frame_number < frame_count) && (start_offset > next_offset)) { - printf("Ohci: ISO_TD start_offset=0x%.8x > next_offset=0x%.8x\n", start_offset, next_offset); + printf("%s: ISO_TD start_offset=0x%.8x > next_offset=0x%.8x\n", LOG_STR_OHCI, start_offset, next_offset); return 1; } @@ -1739,12 +1742,12 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) else { // Handle the error condition if (ret > static_cast(len)) { // Sequence Error - DbgPrintf("Ohci: DataOverrun %d > %zu\n", ret, len); + DbgPrintf("%s: DataOverrun %d > %zu\n", LOG_STR_OHCI, ret, len); OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_CC, OHCI_CC_DATAOVERRUN); OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_SIZE, len); } else if (ret >= 0) { // Sequence Error - DbgPrintf("Ohci: DataUnderrun %d\n", ret); + DbgPrintf("%s: DataUnderrun %d\n", LOG_STR_OHCI, ret); OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_CC, OHCI_CC_DATAUNDERRUN); } else { @@ -1756,12 +1759,12 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) break; case USB_RET_NAK: // NAK and STALL case USB_RET_STALL: - DbgPrintf("Ohci: got NAK/STALL %d\n", ret); + DbgPrintf("%s: got NAK/STALL %d\n", LOG_STR_OHCI, ret); OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_CC, OHCI_CC_STALL); OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_SIZE, 0); break; default: // Unknown Error - DbgPrintf("Ohci: Bad device response %d\n", ret); + DbgPrintf("%s: Bad device response %d\n", LOG_STR_OHCI, ret); OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_CC, OHCI_CC_UNDEXPETEDPID); break; } diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index ccc585100..d3e1d2ac2 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -38,6 +38,8 @@ #include "OHCI.h" #include "CxbxKrnl\EmuKrnl.h" // For EmuWarning +#define LOG_STR_USB "Usb" + #define SETUP_STATE_IDLE 0 #define SETUP_STATE_SETUP 1 #define SETUP_STATE_DATA 2 @@ -130,7 +132,7 @@ void USBDevice::USB_Detach(USBPort* Port) assert(dev != nullptr); assert(dev->State != USB_STATE_NOTATTACHED); - m_HostController->OHCI_Detach(Port); + Port->Operations->detach(Port); dev->State = USB_STATE_NOTATTACHED; } @@ -238,8 +240,7 @@ void USBDevice::USB_HandlePacket(XboxDeviceState* dev, USBPacket* p) // hcd drivers cannot handle async for isoc assert(p->Endpoint->Type != USB_ENDPOINT_XFER_ISOC); // using async for interrupt packets breaks migration - assert(p->Endpoint->Type != USB_ENDPOINT_XFER_INT || - (dev->flags & (1 << USB_DEV_FLAG_IS_HOST))); + assert(p->Endpoint->Type != USB_ENDPOINT_XFER_INT); p->State = USB_PACKET_ASYNC; QTAILQ_INSERT_TAIL(&p->Endpoint->Queue, p, Queue); } @@ -249,7 +250,7 @@ void USBDevice::USB_HandlePacket(XboxDeviceState* dev, USBPacket* p) else { // When pipelining is enabled usb-devices must always return async, // otherwise packets can complete out of order! - assert(p->stream || !p->Endpoint->pipeline || + assert(p->Stream || !p->Endpoint->Pipeline || QTAILQ_EMPTY(&p->Endpoint->Queue)); if (p->Status != USB_RET_NAK) { p->State = USB_PACKET_COMPLETE; @@ -274,7 +275,7 @@ void USBDevice::USB_PacketCheckState(USBPacket* p, USBPacketState expected) return; } - EmuWarning("Usb: packet state check failed!"); + EmuWarning("%s: packet state check failed!", LOG_STR_USB); assert(0); } @@ -295,15 +296,21 @@ void USBDevice::USB_ProcessOne(USBPacket* p) return; } switch (p->Pid) { - case USB_TOKEN_SETUP: + case USB_TOKEN_SETUP: { USB_DoTokenSetup(dev, p); break; - case USB_TOKEN_IN: + } + + case USB_TOKEN_IN: { DoTokenIn(dev, p); break; - case USB_TOKEN_OUT: + } + + case USB_TOKEN_OUT: { DoTokenOut(dev, p); break; + } + default: p->Status = USB_RET_STALL; } @@ -331,7 +338,7 @@ void USBDevice::USB_DoParameter(XboxDeviceState* s, USBPacket* p) index = (s->SetupBuffer[5] << 8) | s->SetupBuffer[4]; if (s->SetupLength > sizeof(s->DataBuffer)) { - DbgPrintf("Usb: ctrl buffer too small (%d > %zu)\n", s->SetupLength, sizeof(s->DataBuffer)); + DbgPrintf("%s: ctrl buffer too small (%d > %zu)\n", LOG_STR_USB, s->SetupLength, sizeof(s->DataBuffer)); p->Status = USB_RET_STALL; return; } @@ -389,7 +396,6 @@ void USBDevice::USB_DoTokenSetup(XboxDeviceState* s, USBPacket* p) if (p->Status != USB_RET_SUCCESS) { return; } - if (p->ActualLength < s->SetupLength) { s->SetupLength = p->ActualLength; } @@ -397,7 +403,7 @@ void USBDevice::USB_DoTokenSetup(XboxDeviceState* s, USBPacket* p) } else { if (s->SetupLength > sizeof(s->DataBuffer)) { - DbgPrintf("Usb: ctrl buffer too small (%d > %zu)\n", s->SetupLength, sizeof(s->DataBuffer)); + DbgPrintf("%s: ctrl buffer too small (%d > %zu)\n", LOG_STR_USB, s->SetupLength, sizeof(s->DataBuffer)); p->Status = USB_RET_STALL; return; } @@ -416,7 +422,7 @@ void USBDevice::DoTokenIn(XboxDeviceState* s, USBPacket* p) { int request, value, index; - assert(p->ep->nr == 0); + assert(p->Endpoint->Num == 0); request = (s->SetupBuffer[0] << 8) | s->SetupBuffer[1]; value = (s->SetupBuffer[3] << 8) | s->SetupBuffer[2]; @@ -458,16 +464,16 @@ void USBDevice::DoTokenIn(XboxDeviceState* s, USBPacket* p) void USBDevice::DoTokenOut(XboxDeviceState* s, USBPacket* p) { - assert(p->ep->nr == 0); + assert(p->Endpoint->Num == 0); switch (s->SetupState) { case SETUP_STATE_ACK: if (s->SetupBuffer[0] & USB_DIR_IN) { s->SetupState = SETUP_STATE_IDLE; - /* transfer OK */ + // transfer OK } else { - /* ignore additional output */ + // ignore additional output } break; @@ -508,7 +514,7 @@ void USBDevice::USB_PacketCopy(USBPacket* p, void* ptr, size_t bytes) IoVecFromBuffer(iov->IoVecStruct, iov->IoVecNumber, p->ActualLength, ptr, bytes); break; default: - CxbxKrnlCleanup("Usb: %s has an invalid pid: %x\n", __func__, p->Pid); + CxbxKrnlCleanup("%s: %s has an invalid pid: %x\n", LOG_STR_USB, __func__, p->Pid); } p->ActualLength += bytes; } @@ -545,7 +551,7 @@ void USBDevice::USB_DeviceHandleDestroy(XboxDeviceState* dev) { USBDeviceClass* klass = dev->klass; if (klass->handle_destroy) { - klass->handle_destroy(dev); + klass->handle_destroy(); } } @@ -759,7 +765,7 @@ void USBDevice::USBDesc_SetDefaults(XboxDeviceState* dev) break; } default: - EmuWarning("Unknown speed parameter %d set in %s", dev->ProductDesc.c_str()); + EmuWarning("%s: unknown speed parameter %d set in %s", LOG_STR_USB, dev->ProductDesc.c_str()); } USBDesc_SetConfig(dev, 0); } @@ -878,7 +884,7 @@ int USBDevice::USBDesc_HandleControl(XboxDeviceState* dev, USBPacket *p, // From the standard: "This request sets the device address for all future device accesses. // The wValue field specifies the device address to use for all subsequent accesses" dev->Addr = value; - DbgPrintf("Address 0x%X set for device %s\n", dev->Addr, dev->ProductDesc.c_str()); + DbgPrintf("%s: address 0x%X set for device %s\n", LOG_STR_USB, dev->Addr, dev->ProductDesc.c_str()); ret = 0; break; } @@ -904,8 +910,8 @@ int USBDevice::USBDesc_HandleControl(XboxDeviceState* dev, USBPacket *p, // From the standard: "This request sets the device configuration. The lower byte of the wValue field specifies the desired configuration. // This configuration value must be zero or match a configuration value from a configuration descriptor" ret = USBDesc_SetConfig(dev, value); - DbgPrintf("Received standard SetConfiguration() request for device at address 0x%X. Configuration selected is %d and returned %d\n", - dev->Addr, value, ret); + DbgPrintf("%s: received standard SetConfiguration() request for device at address 0x%X. Configuration selected is %d and returned %d\n", + LOG_STR_USB, dev->Addr, value, ret); break; } @@ -938,8 +944,8 @@ int USBDevice::USBDesc_HandleControl(XboxDeviceState* dev, USBPacket *p, dev->RemoteWakeup = 0; ret = 0; } - DbgPrintf("Received standard ClearFeature() request for device at address 0x%X. Feature selected is %d and returned %d\n", - dev->Addr, value, ret); + DbgPrintf("%s: received standard ClearFeature() request for device at address 0x%X. Feature selected is %d and returned %d\n", + LOG_STR_USB, dev->Addr, value, ret); break; } @@ -950,8 +956,8 @@ int USBDevice::USBDesc_HandleControl(XboxDeviceState* dev, USBPacket *p, dev->RemoteWakeup = 1; ret = 0; } - DbgPrintf("Received standard SetFeature() request for device at address 0x%X. Feature selected is %d and returned %d\n", - dev->Addr, value, ret); + DbgPrintf("%s: received standard SetFeature() request for device at address 0x%X. Feature selected is %d and returned %d\n", + LOG_STR_USB, dev->Addr, value, ret); break; } @@ -971,8 +977,8 @@ int USBDevice::USBDesc_HandleControl(XboxDeviceState* dev, USBPacket *p, // From the standard: "This request allows the host to select an alternate setting for the specified interface" // wValue = Alternative Setting; wIndex = Interface ret = USBDesc_SetInterface(dev, index, value); - DbgPrintf("Received standard SetInterface() request for device at address 0x%X. Interface selected is %d, Alternative Setting \ -is %d and returned %d\n", dev->Addr, index, value, ret); + DbgPrintf("%s; received standard SetInterface() request for device at address 0x%X. Interface selected is %d, Alternative Setting \ +is %d and returned %d\n", LOG_STR_USB, dev->Addr, index, value, ret); break; } @@ -999,7 +1005,7 @@ int USBDevice::USBDesc_HandleStandardGetDescriptor(XboxDeviceState* dev, USBPack switch (type) { case USB_DT_DEVICE: { ret = USB_ReadDeviceDesc(&desc->id, dev->Device, buf, sizeof(buf)); - DbgPrintf("Read operation of device descriptor of device 0x%X returns %d\n", dev->Addr, ret); + DbgPrintf("%s: read operation of device descriptor of device 0x%X returns %d\n", LOG_STR_USB, dev->Addr, ret); break; } @@ -1007,13 +1013,13 @@ int USBDevice::USBDesc_HandleStandardGetDescriptor(XboxDeviceState* dev, USBPack if (index < dev->Device->bNumConfigurations) { ret = USB_ReadConfigurationDesc(dev->Device->confs + index, flags, buf, sizeof(buf)); } - DbgPrintf("Read operation of configuration descriptor %d of device 0x%X returns %d\n", index, dev->Addr, ret); + DbgPrintf("%s: read operation of configuration descriptor %d of device 0x%X returns %d\n", LOG_STR_USB, index, dev->Addr, ret); break; } case USB_DT_STRING: { ret = USB_ReadStringDesc(dev, index, buf, sizeof(buf)); - DbgPrintf("Read operation of string descriptor %d of device 0x%X returns %d\n", index, dev->Addr, ret); + DbgPrintf("%s: read operation of string descriptor %d of device 0x%X returns %d\n", LOG_STR_USB, index, dev->Addr, ret); break; } @@ -1021,7 +1027,7 @@ int USBDevice::USBDesc_HandleStandardGetDescriptor(XboxDeviceState* dev, USBPack // USB_DT_BOS (15) and USB_DT_DEBUG (10) -> usb 3.0 only default: - EmuWarning("%s: device address %d unknown type %d (len %zd)", __func__, dev->Addr, type, len); + EmuWarning("%s: %s has a device address %d of unknown type %d (len %zd)", LOG_STR_USB, __func__, dev->Addr, type, len); break; } diff --git a/src/devices/usb/UsbCommon.h b/src/devices/usb/UsbCommon.h index 2b1c037fb..421c6debf 100644 --- a/src/devices/usb/UsbCommon.h +++ b/src/devices/usb/UsbCommon.h @@ -330,8 +330,7 @@ struct USBEndpoint { struct XboxDeviceState { USBPort* Port; // usb port struct of this device int PortPath; // port index to which this device is attached to - char* Serial; - uint32_t flags; + char* Serial; USBDeviceClass* klass; // usb class struct of this device int Speed; // actual speed of the connected device @@ -344,7 +343,7 @@ struct XboxDeviceState { uint8_t SetupBuffer[8]; // setup packet buffer - 8 bytes (control transfers only) uint8_t DataBuffer[4096]; // buffer where to write the data requested during usb requests int32_t RemoteWakeup; // wakeup flag - int32_t SetupState; // result of a setup tken processing operation + int32_t SetupState; // result of a control transfer processing operation int32_t SetupLength; // this field specifies the length of the data transferred during the second phase of the control transfer int32_t SetupIndex; // index of the parameter in a setup token? diff --git a/src/devices/usb/XidGamepad.cpp b/src/devices/usb/XidGamepad.cpp index 16bf24a42..c86db64ef 100644 --- a/src/devices/usb/XidGamepad.cpp +++ b/src/devices/usb/XidGamepad.cpp @@ -37,6 +37,8 @@ #include "XidGamepad.h" #include "USBDevice.h" +#define LOG_STR_GAMEPAD "Gamepad" + #define USB_CLASS_XID 0x58 #define USB_DT_XID 0x42 @@ -290,7 +292,7 @@ void XidGamepad::UsbXid_Attach(XboxDeviceState* dev) void XidGamepad::UsbXid_HandleReset() { - DbgPrintf("Gamepad reset event\n"); + DbgPrintf("%s reset event\n", LOG_STR_GAMEPAD); } void XidGamepad::UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, @@ -298,7 +300,7 @@ void XidGamepad::UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, { int ret = m_UsbDev->USBDesc_HandleControl(dev, p, request, value, index, length, data); if (ret >= 0) { - DbgPrintf("Gamepad handled by USBDesc_HandleControl, ret is %d\n", ret); + DbgPrintf("%s handled by USBDesc_HandleControl, ret is %d\n", LOG_STR_GAMEPAD, ret); return; } @@ -308,7 +310,7 @@ void XidGamepad::UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, // From the HID standard: "The Get_Report request allows the host to receive a report via the Control pipe. // The wValue field specifies the Report Type in the high byte and the Report ID in the low byte. Set Report ID // to 0 (zero) if Report IDs are not used. 01 = input, 02 = output, 03 = feature, 04-FF = reserved" - DbgPrintf("Gamepad GET_REPORT 0x%X\n", value); + DbgPrintf("%s GET_REPORT 0x%X\n", LOG_STR_GAMEPAD, value); if (value == 0x100) { assert(m_XidState->in_state.bLength <= length); // m_XidState->in_state.bReportId++; /* FIXME: I'm not sure if bReportId is just a counter */ @@ -326,7 +328,7 @@ void XidGamepad::UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, // setting the state of input, output, or feature controls. The meaning of the request fields for the Set_Report // request is the same as for the Get_Report request, however the data direction is reversed and the Report // Data is sent from host to device." - DbgPrintf("Gamepad SET_REPORT 0x%X\n", value); + DbgPrintf("%s SET_REPORT 0x%X\n", LOG_STR_GAMEPAD, value); if (value == 0x200) { // Read length, then the entire packet std::memcpy(&m_XidState->out_state, data, sizeof(m_XidState->out_state)); @@ -346,7 +348,7 @@ void XidGamepad::UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, // XID-specific requests case VendorInterfaceRequest | USB_REQ_GET_DESCRIPTOR: { - DbgPrintf("Gamepad GET_DESCRIPTOR 0x%x\n", value); + DbgPrintf("%s GET_DESCRIPTOR 0x%x\n", LOG_STR_GAMEPAD, value); if (value == 0x4200) { assert(m_XidState->xid_desc->bLength <= length); std::memcpy(data, m_XidState->xid_desc, m_XidState->xid_desc->bLength); @@ -359,7 +361,7 @@ void XidGamepad::UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, } case VendorInterfaceRequest | XID_GET_CAPABILITIES: { - DbgPrintf("Gamepad XID_GET_CAPABILITIES 0x%x\n", value); + DbgPrintf("%s XID_GET_CAPABILITIES 0x%x\n", LOG_STR_GAMEPAD, value); /* FIXME: ! */ p->Status = USB_RET_STALL; //assert(false); @@ -368,7 +370,7 @@ void XidGamepad::UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_DEVICE) << 8) | USB_REQ_GET_DESCRIPTOR: { /* FIXME: ! */ - DbgPrintf("Gamepad unknown xpad request 0x%X: value = 0x%X\n", request, value); + DbgPrintf("%s unknown xpad request 0x%X: value = 0x%X\n", LOG_STR_GAMEPAD, request, value); std::memset(data, 0x00, length); //FIXME: Intended for the hub: usbd_get_hub_descriptor, UT_READ_CLASS?! p->Status = USB_RET_STALL; @@ -378,14 +380,14 @@ void XidGamepad::UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, case ((USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_ENDPOINT) << 8) | USB_REQ_CLEAR_FEATURE: { /* FIXME: ! */ - DbgPrintf("Gamepad unknown xpad request 0x%X: value = 0x%X\n", request, value); + DbgPrintf("%s unknown xpad request 0x%X: value = 0x%X\n", LOG_STR_GAMEPAD, request, value); std::memset(data, 0x00, length); p->Status = USB_RET_STALL; break; } default: - DbgPrintf("Gamepad USB stalled on request 0x%X value 0x%X\n", request, value); + DbgPrintf("%s USB stalled on request 0x%X value 0x%X\n", LOG_STR_GAMEPAD, request, value); p->Status = USB_RET_STALL; assert(0); break; From b24e15a09cbde347f80ea9a71aac2bc6cca1e807 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Mon, 9 Jul 2018 21:40:09 +0200 Subject: [PATCH 0051/1000] USB_DeviceDetach --- src/devices/usb/Hub.cpp | 2 +- src/devices/usb/USBDevice.cpp | 11 +++++++++++ src/devices/usb/USBDevice.h | 2 ++ src/devices/usb/UsbCommon.h | 1 - 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index cff78ab43..844b9eaca 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -548,7 +548,7 @@ void Hub::UsbHub_HandleData(XboxDeviceState* dev, USBPacket* p) void Hub::UsbHub_HandleDestroy() { // Inform upstream that the hub is detached and gone - m_HubState->dev.Port->Operations->detach(m_HubState->dev.Port); + m_UsbDev->USB_DeviceDetach(&m_HubState->dev); m_UsbDev->m_FreePorts.push_back(m_HubState->dev.Port); for (int i = 0; i < NUM_PORTS; i++) { diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index d3e1d2ac2..d8e4b62d1 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -665,6 +665,17 @@ void USBDevice::USB_DeviceAttach(XboxDeviceState* dev) USB_Attach(port); } +void USBDevice::USB_DeviceDetach(XboxDeviceState* dev) +{ + USBPort* port = dev->Port; + + assert(port != nullptr); + assert(dev->Attached); + + USB_Detach(port); + dev->Attached--; +} + void USBDevice::USB_EpInit(XboxDeviceState* dev) { USB_EpReset(dev); diff --git a/src/devices/usb/USBDevice.h b/src/devices/usb/USBDevice.h index 56bd0b3e1..c4e567b41 100644 --- a/src/devices/usb/USBDevice.h +++ b/src/devices/usb/USBDevice.h @@ -79,6 +79,8 @@ class USBDevice : public PCIDevice { void USB_PortReset(USBPort* Port); // update device status during an attach void USB_DeviceAttach(XboxDeviceState* dev); + // update device status during an detach + void USB_DeviceDetach(XboxDeviceState* dev); // update port status when a device is attached void USB_Attach(USBPort* Port); // update port status when a device is detached diff --git a/src/devices/usb/UsbCommon.h b/src/devices/usb/UsbCommon.h index 421c6debf..5a61ab9f6 100644 --- a/src/devices/usb/UsbCommon.h +++ b/src/devices/usb/UsbCommon.h @@ -330,7 +330,6 @@ struct USBEndpoint { struct XboxDeviceState { USBPort* Port; // usb port struct of this device int PortPath; // port index to which this device is attached to - char* Serial; USBDeviceClass* klass; // usb class struct of this device int Speed; // actual speed of the connected device From 002e10003d9aadc744b1e257b1fafde2697b5c7f Mon Sep 17 00:00:00 2001 From: ergo720 Date: Mon, 9 Jul 2018 23:06:35 +0200 Subject: [PATCH 0052/1000] Forgotten to reset a couple of ohci registers --- src/devices/usb/OHCI.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index 4335897a2..4f09456b3 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -75,6 +75,8 @@ // HcFmRemaining #define OHCI_FMR_FR 0x00003FFF // FrameRemaining #define OHCI_FMR_FRT 0x80000000 // FrameRemainingToggle +// LSThreshold +#define OHCI_LS_THRESH 0x628 // LSThreshold // HcRhDescriptorA #define OHCI_RHA_RW_MASK 0x00000000 // Mask of supported features #define OHCI_RHA_PSM (1<<8) // PowerSwitchingMode @@ -869,9 +871,11 @@ void OHCI::OHCI_StateReset() m_Registers.HcFmRemaining = 0; m_Registers.HcFmNumber = 0; m_Registers.HcPeriodicStart = 0; + m_Registers.HcLSThreshold = OHCI_LS_THRESH; m_Registers.HcRhDescriptorA = OHCI_RHA_NPS | 2; // The xbox lacks the hw to switch off the power on the ports and has 2 ports per HC m_Registers.HcRhDescriptorB = 0; // The attached devices are removable and use PowerSwitchingMode to control the power on the ports + m_Registers.HcRhStatus = 0; m_DoneCount = 7; @@ -1376,7 +1380,7 @@ int OHCI::OHCI_PortSetIfConnected(int i, uint32_t Value) if (!(m_Registers.RhPort[i].HcRhPortStatus & OHCI_PORT_CCS)) { m_Registers.RhPort[i].HcRhPortStatus |= OHCI_PORT_CSC; if (m_Registers.HcRhStatus & OHCI_RHS_DRWE) { - // TODO: CSC is a wakeup event + // from XQEMU: TODO, CSC is a wakeup event } return 0; } From 6fea0c3da1832442caf0cd2aab79201f59cc084f Mon Sep 17 00:00:00 2001 From: ergo720 Date: Tue, 10 Jul 2018 00:52:33 +0200 Subject: [PATCH 0053/1000] add linux support to timer functions (untested) --- src/CxbxKrnl/Timer.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/CxbxKrnl/Timer.cpp b/src/CxbxKrnl/Timer.cpp index 5722540e9..c53acd92c 100644 --- a/src/CxbxKrnl/Timer.cpp +++ b/src/CxbxKrnl/Timer.cpp @@ -38,7 +38,10 @@ #include #include #include "Timer.h" -#include "Cxbx.h" +#include "CxbxCommon.h" +#ifdef __linux__ +#include +#endif #define CLOCK_REALTIME 0 @@ -58,9 +61,17 @@ static uint64_t ClockFrequency; // Returns the current time of the timer inline uint64_t GetTime_NS(TimerObject* Timer) { +#ifdef _WIN32 LARGE_INTEGER li; QueryPerformanceCounter(&li); uint64_t Ret = Muldiv64(li.QuadPart, SCALE_S, ClockFrequency); +#elif __linux__ + static struct timespec ts; + clock_gettime(CLOCK_MONOTONIC_RAW, &ts); + uint64_t Ret = Muldiv64(ts.tv_sec, SCALE_S, 1) + ts.tv_nsec; +#else +#error +#endif return Timer->Type == CLOCK_REALTIME ? Ret : Ret / Timer->SlowdownFactor; } @@ -138,7 +149,13 @@ void Timer_Start(TimerObject* Timer, uint64_t Expire_MS) // Retrives the frequency of the high resolution clock of the host void Timer_Init() { +#ifdef _WIN32 LARGE_INTEGER freq; QueryPerformanceFrequency(&freq); ClockFrequency = freq.QuadPart; +#elif __linux__ + ClockFrequency = 0; +#else +#error +#endif } From 04d181757042601c1222d7caa1203c4069a6edef Mon Sep 17 00:00:00 2001 From: ergo720 Date: Sat, 14 Jul 2018 13:33:52 +0200 Subject: [PATCH 0054/1000] Use std::string instead of C-style strings --- src/devices/usb/Hub.cpp | 6 +++--- src/devices/usb/USBDevice.cpp | 16 +++++++--------- src/devices/usb/USBDevice.h | 2 +- src/devices/usb/UsbCommon.h | 2 +- src/devices/usb/XidGamepad.cpp | 2 +- 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index 844b9eaca..c10b474f0 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -236,7 +236,7 @@ int Hub::UsbHubClaimPort(XboxDeviceState* dev, int pport) m_UsbDev = g_USB1; } for (auto port : m_UsbDev->m_FreePorts) { - if (strcmp(port->Path, std::to_string(usb_port).c_str()) == 0) { + if (port->Path == std::to_string(usb_port)) { break; } i++; @@ -270,8 +270,8 @@ int Hub::UsbHub_Initfn(XboxDeviceState* dev) int i; m_UsbDev->USB_CreateSerial(dev, "314159"); - m_UsbDev->USBDesc_SetString(dev, STR_MANUFACTURER, "Cxbx-Reloaded"); - m_UsbDev->USBDesc_SetString(dev, STR_PRODUCT, "Cxbx-Reloaded USB Hub"); + m_UsbDev->USBDesc_SetString(dev, STR_MANUFACTURER, std::string("Cxbx-Reloaded")); + m_UsbDev->USBDesc_SetString(dev, STR_PRODUCT, std::string("Cxbx-Reloaded USB Hub")); m_UsbDev->USBDesc_Init(dev); m_HubState->intr = m_UsbDev->USB_GetEP(dev, USB_TOKEN_IN, 1); diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index d8e4b62d1..443761a76 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -647,10 +647,10 @@ void USBDevice::USB_EPsetMaxPacketSize(XboxDeviceState* dev, int pid, int ep, ui void USBDevice::USB_PortLocation(USBPort* downstream, USBPort* upstream, int portnr) { if (upstream) { - std::snprintf(downstream->Path, sizeof(downstream->Path), "%s.%d", upstream->Path, portnr); + downstream->Path = upstream->Path + '.' + std::to_string(portnr); } else { - std::snprintf(downstream->Path, sizeof(downstream->Path), "%d", portnr); + downstream->Path = std::to_string(portnr); } } @@ -730,14 +730,12 @@ void USBDevice::USB_CreateSerial(XboxDeviceState* dev, const char* str) const USBDesc* desc = USBDesc_GetUsbDeviceDesc(dev); int index = desc->id.iSerialNumber; USBDescString* s; - char serial[64]; - char* path; - int dst; + std::string serial; assert(index != 0 && str != nullptr); - dst = std::snprintf(serial, sizeof(serial), "%s", str); - dst += std::snprintf(serial + dst, sizeof(serial) - dst, "-%s", m_PciPath); - std::snprintf(serial + dst, sizeof(serial) - dst, "-%s", dev->Port->Path); + serial = str + '-'; + serial += m_PciPath; + serial += ('-' + dev->Port->Path); USBDesc_SetString(dev, index, serial); } @@ -1255,7 +1253,7 @@ int USBDevice::USB_ReadStringDesc(XboxDeviceState* dev, int index, uint8_t* dest return pos; } -void USBDevice::USBDesc_SetString(XboxDeviceState* dev, int index, const char* str) +void USBDevice::USBDesc_SetString(XboxDeviceState* dev, int index, std::string& const str) { USBDescString* s; diff --git a/src/devices/usb/USBDevice.h b/src/devices/usb/USBDevice.h index c4e567b41..b43da7e4c 100644 --- a/src/devices/usb/USBDevice.h +++ b/src/devices/usb/USBDevice.h @@ -190,7 +190,7 @@ class USBDevice : public PCIDevice { // return the binary rapresentation of string descriptors int USB_ReadStringDesc(XboxDeviceState* dev, int index, uint8_t* dest, size_t len); // set a string in the string descriptor with the supplied index - void USBDesc_SetString(XboxDeviceState* dev, int index, const char* str); + void USBDesc_SetString(XboxDeviceState* dev, int index, std::string& const str); // get a string in the string descriptor with the supplied index const char* USBDesc_GetString(XboxDeviceState* dev, int index); }; diff --git a/src/devices/usb/UsbCommon.h b/src/devices/usb/UsbCommon.h index 5a61ab9f6..33e2837a3 100644 --- a/src/devices/usb/UsbCommon.h +++ b/src/devices/usb/UsbCommon.h @@ -407,7 +407,7 @@ struct USBPort { XboxDeviceState* Dev; // usb device (if present) USBPortOps* Operations; // functions to call when a port event happens int SpeedMask; // usb speeds supported - char Path[16]; // the number of the port + 1, used to create a serial number for this device + std::string Path; // the number of the port + 1, used to create a serial number for this device int PortIndex; // internal port index }; diff --git a/src/devices/usb/XidGamepad.cpp b/src/devices/usb/XidGamepad.cpp index c86db64ef..2a4ae127d 100644 --- a/src/devices/usb/XidGamepad.cpp +++ b/src/devices/usb/XidGamepad.cpp @@ -230,7 +230,7 @@ int XidGamepad::UsbXidClaimPort(XboxDeviceState* dev, int pport) if (g_HubObjArray[j]) { i = 0; for (auto port : g_HubObjArray[j]->m_UsbDev->m_FreePorts) { - if (strcmp(port->Path, (std::to_string(usb_port) + ".2").c_str()) == 0) { + if (port->Path == (std::to_string(usb_port) + ".2")) { m_UsbDev = g_HubObjArray[j]->m_UsbDev; break; } From a4d869f4e44b48400df2d1fd0627f5969c3e054d Mon Sep 17 00:00:00 2001 From: ergo720 Date: Sat, 14 Jul 2018 16:13:18 +0200 Subject: [PATCH 0055/1000] Also create serial for gamepad as well --- src/devices/usb/Hub.cpp | 2 +- src/devices/usb/USBDevice.cpp | 17 ++++++++--------- src/devices/usb/USBDevice.h | 4 ++-- src/devices/usb/XidGamepad.cpp | 6 ++++++ 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index c10b474f0..fb9e9256f 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -269,7 +269,7 @@ int Hub::UsbHub_Initfn(XboxDeviceState* dev) USBPortOps* ops; int i; - m_UsbDev->USB_CreateSerial(dev, "314159"); + m_UsbDev->USB_CreateSerial(dev, std::string("314159")); m_UsbDev->USBDesc_SetString(dev, STR_MANUFACTURER, std::string("Cxbx-Reloaded")); m_UsbDev->USBDesc_SetString(dev, STR_PRODUCT, std::string("Cxbx-Reloaded USB Hub")); m_UsbDev->USBDesc_Init(dev); diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index 443761a76..af20dc099 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -725,19 +725,18 @@ void USBDevice::USB_EpReset(XboxDeviceState* dev) * the pci address in most cases). Third the physical port path. * Results in serial numbers like this: "314159-0000:00:1d.7-3". */ -void USBDevice::USB_CreateSerial(XboxDeviceState* dev, const char* str) +void USBDevice::USB_CreateSerial(XboxDeviceState* dev, std::string&& str) { const USBDesc* desc = USBDesc_GetUsbDeviceDesc(dev); int index = desc->id.iSerialNumber; - USBDescString* s; - std::string serial; + std::string str2; - assert(index != 0 && str != nullptr); - serial = str + '-'; - serial += m_PciPath; - serial += ('-' + dev->Port->Path); + assert(index != 0 && str.empty() == false); + str += '-'; + str += m_PciPath; + str += ('-' + dev->Port->Path); - USBDesc_SetString(dev, index, serial); + USBDesc_SetString(dev, index, std::move(str)); } const USBDesc* USBDevice::USBDesc_GetUsbDeviceDesc(XboxDeviceState* dev) @@ -1253,7 +1252,7 @@ int USBDevice::USB_ReadStringDesc(XboxDeviceState* dev, int index, uint8_t* dest return pos; } -void USBDevice::USBDesc_SetString(XboxDeviceState* dev, int index, std::string& const str) +void USBDevice::USBDesc_SetString(XboxDeviceState* dev, int index, std::string&& str) { USBDescString* s; diff --git a/src/devices/usb/USBDevice.h b/src/devices/usb/USBDevice.h index b43da7e4c..f88cbdda3 100644 --- a/src/devices/usb/USBDevice.h +++ b/src/devices/usb/USBDevice.h @@ -156,7 +156,7 @@ class USBDevice : public PCIDevice { // reset all endpoints of this peripheral void USB_EpReset(XboxDeviceState* dev); // create a serial number for the device - void USB_CreateSerial(XboxDeviceState* dev, const char* str); + void USB_CreateSerial(XboxDeviceState* dev, std::string&& str); // start descriptors initialization void USBDesc_Init(XboxDeviceState* dev); // get device descriptor @@ -190,7 +190,7 @@ class USBDevice : public PCIDevice { // return the binary rapresentation of string descriptors int USB_ReadStringDesc(XboxDeviceState* dev, int index, uint8_t* dest, size_t len); // set a string in the string descriptor with the supplied index - void USBDesc_SetString(XboxDeviceState* dev, int index, std::string& const str); + void USBDesc_SetString(XboxDeviceState* dev, int index, std::string&& str); // get a string in the string descriptor with the supplied index const char* USBDesc_GetString(XboxDeviceState* dev, int index); }; diff --git a/src/devices/usb/XidGamepad.cpp b/src/devices/usb/XidGamepad.cpp index 2a4ae127d..0523dcc02 100644 --- a/src/devices/usb/XidGamepad.cpp +++ b/src/devices/usb/XidGamepad.cpp @@ -152,6 +152,9 @@ USBDesc::USBDesc() id.idVendor = 0x045E; id.idProduct = 0x0202; id.bcdDevice = 0x0100; + id.iManufacturer = STR_MANUFACTURER; + id.iProduct = STR_PRODUCT; + id.iSerialNumber = STR_SERIALNUMBER; full = &desc_device_xbox_gamepad; } @@ -262,6 +265,9 @@ void XidGamepad::UsbXidReleasePort(XboxDeviceState* dev) int XidGamepad::UsbXid_Initfn(XboxDeviceState* dev) { + m_UsbDev->USB_CreateSerial(dev, std::string("1")); + m_UsbDev->USBDesc_SetString(dev, STR_MANUFACTURER, std::string("Cxbx-Reloaded")); + m_UsbDev->USBDesc_SetString(dev, STR_PRODUCT, std::string("Microsoft Gamepad")); m_UsbDev->USBDesc_Init(dev); m_XidState->intr = m_UsbDev->USB_GetEP(dev, USB_TOKEN_IN, 2); From 45f4f327909a87dfc666b8ae5c40d65c4421f49f Mon Sep 17 00:00:00 2001 From: ergo720 Date: Sat, 14 Jul 2018 17:19:34 +0200 Subject: [PATCH 0056/1000] Amend previous rebasing --- build/win32/Cxbx.sln | 36 +++++++++++++------------------- build/win32/Cxbx.vcxproj.filters | 4 ---- 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/build/win32/Cxbx.sln b/build/win32/Cxbx.sln index cf635d831..8910fd690 100644 --- a/build/win32/Cxbx.sln +++ b/build/win32/Cxbx.sln @@ -124,8 +124,6 @@ Global {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|Any CPU.ActiveCfg = Debug|Win32 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Win32 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|x64.ActiveCfg = Release|Win32 - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|x64.Build.0 = Release|Win32 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|x64.ActiveCfg = Debug|x64 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|x64.Build.0 = Debug|x64 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_USB_Packets|Any CPU.ActiveCfg = Debug|Win32 @@ -140,12 +138,19 @@ Global {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|Any CPU.ActiveCfg = Release|Win32 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|Win32.ActiveCfg = Release|Win32 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|Win32.Build.0 = Release|Win32 - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|x64.ActiveCfg = Release|Win32 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|x64.ActiveCfg = Release|x64 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|x64.Build.0 = Release|x64 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_Direct3D9|Any CPU.ActiveCfg = Release|Win32 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_Direct3D9|Any CPU.Build.0 = Release|Win32 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Win32 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_Direct3D9|x64.ActiveCfg = Debug|Win32 + {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_USB_Packets|Any CPU.ActiveCfg = Release|x64 + {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_USB_Packets|Any CPU.Build.0 = Release|x64 + {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Win32 + {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_USB_Packets|Win32.Build.0 = Debug|Win32 + {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_USB_Packets|x64.ActiveCfg = Debug|x64 + {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_USB_Packets|x64.Build.0 = Debug|x64 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug|Any CPU.ActiveCfg = Debug|Win32 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug|Win32.ActiveCfg = Debug|Win32 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug|Win32.Build.0 = Debug|Win32 @@ -160,6 +165,12 @@ Global {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_Direct3D9|x64.ActiveCfg = Debug|x64 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_Direct3D9|x64.Build.0 = Debug|x64 + {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_USB_Packets|Any CPU.ActiveCfg = Release|Win32 + {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_USB_Packets|Any CPU.Build.0 = Release|Win32 + {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Win32 + {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_USB_Packets|Win32.Build.0 = Debug|Win32 + {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_USB_Packets|x64.ActiveCfg = Debug|x64 + {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_USB_Packets|x64.Build.0 = Debug|x64 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug|Any CPU.ActiveCfg = Debug|Win32 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug|Win32.ActiveCfg = Debug|Win32 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug|Win32.Build.0 = Debug|Win32 @@ -170,25 +181,6 @@ Global {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Release|Win32.Build.0 = Release|Win32 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Release|x64.ActiveCfg = Release|x64 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Release|x64.Build.0 = Release|x64 - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|x64.ActiveCfg = Release|x64 - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|x64.Build.0 = Release|x64 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_Direct3D9|Any CPU.ActiveCfg = Debug|Win32 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Win32 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_Direct3D9|x64.ActiveCfg = Debug|Win32 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_USB_Packets|Any CPU.ActiveCfg = Debug|Win32 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_USB_Packets|Any CPU.Build.0 = Debug|Win32 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Win32 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_USB_Packets|Win32.Build.0 = Debug|Win32 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug_USB_Packets|x64.ActiveCfg = Debug|Win32 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug|Win32.ActiveCfg = Debug|Win32 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug|Win32.Build.0 = Debug|Win32 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Debug|x64.ActiveCfg = Debug|Win32 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Release|Any CPU.ActiveCfg = Release|Win32 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Release|Win32.ActiveCfg = Release|Win32 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Release|Win32.Build.0 = Release|Win32 - {7EE21ADA-3B02-4CD6-A891-C2257A54B061}.Release|x64.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/build/win32/Cxbx.vcxproj.filters b/build/win32/Cxbx.vcxproj.filters index 5e3f3ec90..b3ddc8e78 100644 --- a/build/win32/Cxbx.vcxproj.filters +++ b/build/win32/Cxbx.vcxproj.filters @@ -283,8 +283,6 @@ Emulator - - GUI Hardware\Usb @@ -296,8 +294,6 @@ Hardware\Usb - GUI - Hardware\Usb From e1a76b643c37a10aa55a0281f5e86d5abd73e578 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Sat, 14 Jul 2018 23:32:18 +0200 Subject: [PATCH 0057/1000] Added SDL2 submodule --- .gitmodules | 4 +++ build/win32/Cxbx.sln | 51 ++++++++++++++++++++++++++++++-- build/win32/Cxbx.vcxproj | 16 +++++----- build/win32/Cxbx.vcxproj.filters | 5 ++-- import/SDL-mirror | 1 + 5 files changed, 64 insertions(+), 13 deletions(-) create mode 160000 import/SDL-mirror diff --git a/.gitmodules b/.gitmodules index bfb466842..c0e5ff063 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,7 @@ [submodule "import/XbSymbolDatabase"] path = import/XbSymbolDatabase url = https://github.com/Cxbx-Reloaded/XbSymbolDatabase.git +[submodule "SDL-mirror"] + path = import/SDL-mirror + url = https://github.com/spurious/SDL-mirror + branch = release-2.0.8 diff --git a/build/win32/Cxbx.sln b/build/win32/Cxbx.sln index 8910fd690..bbb26e36f 100644 --- a/build/win32/Cxbx.sln +++ b/build/win32/Cxbx.sln @@ -1,7 +1,6 @@ - Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.27130.2026 +VisualStudioVersion = 15.0.27703.2026 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Cxbx", "Cxbx.vcxproj", "{E7A72D3D-5810-4078-A243-348B59726365}" ProjectSection(ProjectDependencies) = postProject @@ -27,6 +26,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XbSymbolDatabase", "..\..\i EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CxbxVSBC", "CxbxVSBC.vcxproj", "{EFA81330-D410-4232-9A0C-1D8B91B6FFFF}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL2", "..\..\import\SDL-mirror\VisualC\SDL\SDL.vcxproj", "{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL2main", "..\..\import\SDL-mirror\VisualC\SDLmain\SDLmain.vcxproj", "{DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_Direct3D9|Any CPU = Debug_Direct3D9|Any CPU @@ -181,6 +184,50 @@ Global {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Release|Win32.Build.0 = Release|Win32 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Release|x64.ActiveCfg = Release|x64 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Release|x64.Build.0 = Release|x64 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_Direct3D9|Any CPU.ActiveCfg = Release|x64 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_Direct3D9|Any CPU.Build.0 = Release|x64 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Win32 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_Direct3D9|x64.ActiveCfg = Debug|x64 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_Direct3D9|x64.Build.0 = Debug|x64 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_USB_Packets|Any CPU.ActiveCfg = Release|x64 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_USB_Packets|Any CPU.Build.0 = Release|x64 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Win32 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_USB_Packets|Win32.Build.0 = Debug|Win32 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_USB_Packets|x64.ActiveCfg = Debug|x64 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_USB_Packets|x64.Build.0 = Debug|x64 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|Win32.ActiveCfg = Debug|Win32 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|Win32.Build.0 = Debug|Win32 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|x64.ActiveCfg = Debug|x64 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|x64.Build.0 = Debug|x64 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Any CPU.ActiveCfg = Release|Win32 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Win32.ActiveCfg = Release|Win32 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Win32.Build.0 = Release|Win32 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|x64.ActiveCfg = Release|x64 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|x64.Build.0 = Release|x64 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_Direct3D9|Any CPU.ActiveCfg = Release|x64 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_Direct3D9|Any CPU.Build.0 = Release|x64 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Win32 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_Direct3D9|x64.ActiveCfg = Debug|x64 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_Direct3D9|x64.Build.0 = Debug|x64 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_USB_Packets|Any CPU.ActiveCfg = Release|x64 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_USB_Packets|Any CPU.Build.0 = Release|x64 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Win32 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_USB_Packets|Win32.Build.0 = Debug|Win32 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_USB_Packets|x64.ActiveCfg = Debug|x64 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_USB_Packets|x64.Build.0 = Debug|x64 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|Win32.ActiveCfg = Debug|Win32 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|Win32.Build.0 = Debug|Win32 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|x64.ActiveCfg = Debug|x64 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|x64.Build.0 = Debug|x64 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|Any CPU.ActiveCfg = Release|Win32 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|Win32.ActiveCfg = Release|Win32 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|Win32.Build.0 = Release|Win32 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|x64.ActiveCfg = Release|x64 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index 11015f114..e9ec0696e 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -127,7 +127,7 @@ Disabled - ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\ + ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\;..\..\import\SDL-mirror\include NOMINMAX;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -144,7 +144,7 @@ Include\Win32\Cxbx;%(AdditionalIncludeDirectories) - legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;%(AdditionalDependencies) + legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) true $(Configuration)\;..\..\import\distorm\lib\Win32\;..\..\import\glew-2.0.0\lib\Release\Win32\;%(AdditionalLibraryDirectories) libcmt;%(IgnoreSpecificDefaultLibraries) @@ -187,7 +187,7 @@ Disabled - ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\ + ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\;..\..\import\SDL-mirror\include NOMINMAX;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;DEBUG_PACKET;DEBUG_ISOCH;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -205,7 +205,7 @@ Include\Win32\Cxbx;%(AdditionalIncludeDirectories) - legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;%(AdditionalDependencies) + legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) true $(Configuration)\;..\..\import\distorm\lib\Win32\;..\..\import\glew-2.0.0\lib\Release\Win32\;%(AdditionalLibraryDirectories) msvcrt;%(IgnoreSpecificDefaultLibraries) @@ -248,7 +248,7 @@ Disabled - ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\ + ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\;..\..\import\SDL-mirror\include CXBX_USE_D3D9;NOMINMAX;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -265,7 +265,7 @@ Include\Win32\Cxbx;%(AdditionalIncludeDirectories) - legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;%(AdditionalDependencies) + legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) true $(Configuration)\;..\..\import\distorm\lib\Win32\;..\..\import\glew-2.0.0\lib\Release\Win32\;%(AdditionalLibraryDirectories) libcmt;%(IgnoreSpecificDefaultLibraries) @@ -309,7 +309,7 @@ MaxSpeed AnySuitable - ..\..\src;..\..\src\Common;..\..\src\Common\Win32\;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\src\Common\Win32;..\..\import\subhook\ + ..\..\src;..\..\src\Common;..\..\src\Common\Win32\;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\src\Common\Win32;..\..\import\subhook\;..\..\import\SDL-mirror\include NOMINMAX;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreadedDLL @@ -334,7 +334,7 @@ Include\Win32\Cxbx;%(AdditionalIncludeDirectories) - legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;%(AdditionalDependencies) + legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) true $(Configuration)\;..\..\import\distorm\lib\Win32\;..\..\import\glew-2.0.0\lib\Release\Win32\;%(AdditionalLibraryDirectories) libcmt;%(IgnoreSpecificDefaultLibraries) diff --git a/build/win32/Cxbx.vcxproj.filters b/build/win32/Cxbx.vcxproj.filters index b3ddc8e78..637bb7d35 100644 --- a/build/win32/Cxbx.vcxproj.filters +++ b/build/win32/Cxbx.vcxproj.filters @@ -297,7 +297,7 @@ Hardware\Usb - + GUI @@ -599,13 +599,12 @@ Hardware\Usb - + GUI Emulator - diff --git a/import/SDL-mirror b/import/SDL-mirror new file mode 160000 index 000000000..ef5bf55e8 --- /dev/null +++ b/import/SDL-mirror @@ -0,0 +1 @@ +Subproject commit ef5bf55e83c9d0ccf7a02bc2b08b0d6e46e1b6ef From f47c481ee6c121fb40ad9a01219d5e485b109a3f Mon Sep 17 00:00:00 2001 From: ergo720 Date: Mon, 16 Jul 2018 23:55:55 +0200 Subject: [PATCH 0058/1000] Introduced InputDeviceManager --- build/win32/Cxbx.vcxproj | 4 + build/win32/Cxbx.vcxproj.filters | 15 ++ src/Common/Input/InputConfig.cpp | 252 +++++++++++++++++++++++++++++++ src/Common/Input/InputConfig.h | 105 +++++++++++++ src/Common/Input/SDL2_Device.cpp | 199 ++++++++++++++++++++++++ src/Common/Input/SDL2_Device.h | 116 ++++++++++++++ src/Common/Win32/XBController.h | 2 +- src/devices/usb/OHCI.cpp | 6 +- src/devices/usb/XidGamepad.cpp | 4 +- 9 files changed, 696 insertions(+), 7 deletions(-) create mode 100644 src/Common/Input/InputConfig.cpp create mode 100644 src/Common/Input/InputConfig.h create mode 100644 src/Common/Input/SDL2_Device.cpp create mode 100644 src/Common/Input/SDL2_Device.h diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index e9ec0696e..e5fddf549 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -367,6 +367,8 @@ + + @@ -510,6 +512,8 @@ + + diff --git a/build/win32/Cxbx.vcxproj.filters b/build/win32/Cxbx.vcxproj.filters index 637bb7d35..1030ad7c7 100644 --- a/build/win32/Cxbx.vcxproj.filters +++ b/build/win32/Cxbx.vcxproj.filters @@ -309,6 +309,12 @@ Cross Platform\Win32 + + Shared\Input + + + Shared\Input + @@ -605,6 +611,12 @@ Emulator + + Shared\Input + + + Shared\Input + @@ -735,6 +747,9 @@ {3d3739b8-aeee-4bf1-ac1b-8623e7288dda} + + {76faeca9-d66f-43fb-9efa-ffb0668f8843} + diff --git a/src/Common/Input/InputConfig.cpp b/src/Common/Input/InputConfig.cpp new file mode 100644 index 000000000..e368b1e06 --- /dev/null +++ b/src/Common/Input/InputConfig.cpp @@ -0,0 +1,252 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->Common->Input->InputConfig.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** + +#include "InputConfig.h" + + +InputDeviceManager::InputDeviceManager() +{ + if (SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER) < 0) { + CxbxKrnlCleanup("Failed to initialize SDL2 input subsystem. The error was: %s\n", SDL_GetError()); + return; + } +} + +InputDeviceManager::~InputDeviceManager() +{ + SDL_Quit(); +} + +int InputDeviceManager::EnumSdl2Devices() +{ + int NumOfJoysticks; + SDL2Devices* pDev; + SDL_GameController* pController; + std::vector::iterator it; + + NumOfJoysticks = SDL_NumJoysticks(); + if (NumOfJoysticks < 0) { + EmuWarning("Failed to enumerate joysticks. The error was: %s", SDL_GetError()); + return -1; + } + SDL_GameControllerButtonBind; + for (int i = 0; i < NumOfJoysticks; i++) { + if (SDL_IsGameController(i)) { + pDev = new SDL2Devices(); + pDev->m_Index = i; + m_Sdl2Devices.push_back(pDev); + } + // this joystick not supported at the moment + } + + for (it = m_Sdl2Devices.begin(); it != m_Sdl2Devices.end();) { + pController = SDL_GameControllerOpen((*it)->m_Index); + if (pController == nullptr) { + EmuWarning("Failed to open game controller %s. The error was %s\n", SDL_GameControllerNameForIndex((*it)->m_Index), SDL_GetError()); + delete (*it); + it = m_Sdl2Devices.erase(it); + } + else { + printf("Found game controller %s\n", SDL_GameControllerName(pController)); + (*it)->m_Gamepad = pController; + (*it)->m_jyID = SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(pController)); + ++it; + } + } +} + +void InputDeviceManager::StartInputThread() +{ + std::thread(InputThread, this).detach(); +} + +void InputDeviceManager::InputThread(InputDeviceManager* pVoid) +{ + bool bContinue = true; + SDL_Event event; + + if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) { + CxbxKrnlCleanup("Failed to initialize SDL2 video subsystem. The error was: %s\n", SDL_GetError()); + return; + } + + SDL_JoystickEventState(SDL_ENABLE); + SDL_GameControllerEventState(SDL_ENABLE); + + while (bContinue) + { + if (SDL_WaitEvent(&event)) + { + switch (event.type) + { + case SDL_JOYBUTTONUP: + case SDL_JOYBUTTONDOWN: { + pVoid->UpdateButtonState(event.jbutton.which, event.jbutton.button, event.jbutton.state); + break; + } + + case SDL_JOYHATMOTION: { + pVoid->UpdateHatState(event.jhat.which, event.jhat.hat, event.jhat.value); + break; + } + + case SDL_JOYAXISMOTION: { + pVoid->UpdateAxisState(event.jaxis.which, event.jaxis.axis, event.jaxis.value); + break; + } + + case SDL_CONTROLLERBUTTONUP: + case SDL_CONTROLLERBUTTONDOWN: { + pVoid->UpdateButtonState(event.cbutton.which, event.cbutton.button, event.cbutton.state); + break; + } + + case SDL_CONTROLLERAXISMOTION: { + pVoid->UpdateAxisState(event.caxis.which, event.caxis.axis, event.caxis.value); + break; + } + + case SDL_QUIT: { + bContinue = false; + break; + } + + default: + } + } + } +} + +void InputDeviceManager::UpdateButtonState(SDL_JoystickID id, uint8_t button, uint8_t state) +{ + SDL2Devices* ControllerObj = nullptr; + int xbox_button; + + for (auto Obj : m_Sdl2Devices) { + if (Obj->m_jyID == id) { + ControllerObj = Obj; + break; + } + } + + if (ControllerObj == nullptr) { + return; + } + + xbox_button = ControllerObj->GetBoundButton(button); + + if (xbox_button == GAMEPAD_INVALID) { + return; + } + + switch (xbox_button) + { + case GAMEPAD_A: + case GAMEPAD_B: + case GAMEPAD_X: + case GAMEPAD_Y: + case GAMEPAD_BLACK: + case GAMEPAD_WHITE: + case GAMEPAD_LEFT_TRIGGER: + case GAMEPAD_RIGHT_TRIGGER: { + ControllerObj->UpdateAnalogButtonState(xbox_button, state); + break; + } + + case GAMEPAD_BACK: + case GAMEPAD_START: + case GAMEPAD_LEFT_THUMB: + case GAMEPAD_RIGHT_THUMB: + case GAMEPAD_DPAD_UP: + case GAMEPAD_DPAD_DOWN: + case GAMEPAD_DPAD_LEFT: + case GAMEPAD_DPAD_RIGHT: { + ControllerObj->UpdateDigitalButtonState(xbox_button, state); + break; + } + default: + } +} + +void InputDeviceManager::UpdateHatState(SDL_JoystickID id, uint8_t hat_index, uint8_t state) +{ + SDL2Devices* ControllerObj = nullptr; + int xbox_button; + + for (auto Obj : m_Sdl2Devices) { + if (Obj->m_jyID == id) { + ControllerObj = Obj; + break; + } + } + + if (ControllerObj == nullptr) { + return; + } + + xbox_button = ControllerObj->GetBoundButton(hat_index + HAT_CONSTANT); + + if (xbox_button == GAMEPAD_INVALID) { + return; + } + + ControllerObj->UpdateHatState(state); +} + +void InputDeviceManager::UpdateAxisState(SDL_JoystickID id, uint8_t axis_index, int16_t state) +{ + SDL2Devices* ControllerObj = nullptr; + int xbox_button; + + for (auto Obj : m_Sdl2Devices) { + if (Obj->m_jyID == id) { + ControllerObj = Obj; + break; + } + } + + if (ControllerObj == nullptr) { + return; + } + + xbox_button = ControllerObj->GetBoundButton(axis_index); + + if (xbox_button == GAMEPAD_INVALID) { + return; + } + + ControllerObj->UpdateAxisState(xbox_button, state); +} diff --git a/src/Common/Input/InputConfig.h b/src/Common/Input/InputConfig.h new file mode 100644 index 000000000..2b1971f6a --- /dev/null +++ b/src/Common/Input/InputConfig.h @@ -0,0 +1,105 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->Common->Input->InputConfig.h +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** + +#ifndef INPUTCONFIG_H_ +#define INPUTCONFIG_H_ + +#include +#include +#include +#include "..\..\CxbxKrnl\EmuKrnl.h" // For EmuWarning +#include "SDL.h" + +#define GAMEPAD_A 0 +#define GAMEPAD_B 1 +#define GAMEPAD_X 2 +#define GAMEPAD_Y 3 +#define GAMEPAD_BLACK 4 +#define GAMEPAD_WHITE 5 +#define GAMEPAD_LEFT_TRIGGER 6 +#define GAMEPAD_RIGHT_TRIGGER 7 + +#define GAMEPAD_DPAD_UP 8 +#define GAMEPAD_DPAD_DOWN 9 +#define GAMEPAD_DPAD_LEFT 10 +#define GAMEPAD_DPAD_RIGHT 11 +#define GAMEPAD_START 12 +#define GAMEPAD_BACK 13 +#define GAMEPAD_LEFT_THUMB 14 +#define GAMEPAD_RIGHT_THUMB 15 + +#define GAMEPAD_LEFT_THUMB_X 16 +#define GAMEPAD_LEFT_THUMB_Y 17 +#define GAMEPAD_RIGHT_THUMB_X 18 +#define GAMEPAD_RIGHT_THUMB_Y 19 + +#define GAMEPAD_INVALID -1 + +#define HAT_CONSTANT 255 + +#define BUTTON_MASK(button) (1 << ((button) - GAMEPAD_DPAD_UP)) + +#include "SDL2_Device.h" + + +class InputDeviceManager +{ + public: + InputDeviceManager(); + ~InputDeviceManager(); + + int EnumSdl2Devices(); + + + private: + // all enumerated devices currently detected and supported + std::vector m_Sdl2Devices; + + // assign the button binding to the devices + //void AssignBindings(); + // start input event processing thread + void StartInputThread(); + // input thread + static void InputThread(InputDeviceManager* pVoid); + // updates the button state of a joystick + void UpdateButtonState(SDL_JoystickID id, uint8_t button, uint8_t state); + // updates the hat state of a joystick + void UpdateHatState(SDL_JoystickID id, uint8_t hat_index, uint8_t state); + // updates the axis state of a joystick + void UpdateAxisState(SDL_JoystickID id, uint8_t axis_index, int16_t state); +}; + +#endif diff --git a/src/Common/Input/SDL2_Device.cpp b/src/Common/Input/SDL2_Device.cpp new file mode 100644 index 000000000..ab103b2ce --- /dev/null +++ b/src/Common/Input/SDL2_Device.cpp @@ -0,0 +1,199 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->Common->Input->SDL2_Device.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** + +#include "SDL2_Device.h" + + +int SDL2Devices::GetBoundButton(int sdl_key) +{ + int i; + + for (i = 0; i < 8; i++) { + if (m_ButtonMap_Analog[i][1] == sdl_key) { + return m_ButtonMap_Analog[i][0]; + } + } + + for (i = 0; i < 8; i++) { + if (m_ButtonMap_Binary[i][1] == sdl_key) { + return m_ButtonMap_Binary[i][0]; + } + } + + if (m_HatIndex == sdl_key) { + return m_HatIndex; + } + + for (i = 0; i < 4; i++) { + if (m_AxisMap[i][1] == sdl_key) { + return m_AxisMap[i][0]; + } + } + + return GAMEPAD_INVALID; +} + +void SDL2Devices::UpdateAnalogButtonState(uint8_t xbox_button, uint8_t state) +{ + for (int i = 0; i < 6; i++) { + if (m_ButtonMap_Analog[i][0] == xbox_button) { + // At the moment, we don't support intermediate values for the analog buttons, so report them as full pressed or released + m_State.bAnalogButtons[m_ButtonMap_Analog[i][0]] = state ? 0xFF : 0; + bStateDirty = true; + return; + } + } + + if (xbox_button == GAMEPAD_LEFT_TRIGGER) { + m_State.bAnalogButtons[m_ButtonMap_Analog[6][0]] = SDL_GameControllerGetAxis(m_Gamepad, SDL_CONTROLLER_AXIS_TRIGGERLEFT) >> 8; + bStateDirty = true; + return; + } + + if (xbox_button == GAMEPAD_RIGHT_TRIGGER) { + m_State.bAnalogButtons[m_ButtonMap_Analog[7][0]] = SDL_GameControllerGetAxis(m_Gamepad, SDL_CONTROLLER_AXIS_TRIGGERLEFT) >> 8; + bStateDirty = true; + return; + } + + assert(0); +} + +void SDL2Devices::UpdateDigitalButtonState(uint8_t xbox_button, uint8_t state) +{ + for (int i = 0; i < 8; i++) { + if (m_ButtonMap_Binary[i][0] == xbox_button) { + if (state) { + m_State.wButtons |= BUTTON_MASK(m_ButtonMap_Binary[i][0]); + bStateDirty = true; + return; + } + else { + m_State.wButtons &= ~(BUTTON_MASK(m_ButtonMap_Binary[i][0])); + bStateDirty = true; + return; + } + } + } + + assert(0); +} + +void SDL2Devices::UpdateHatState(uint8_t state) +{ + m_State.wButtons &= ~0xF; + + switch (state) + { + case SDL_HAT_LEFTUP: { + m_State.wButtons |= (BUTTON_MASK(m_ButtonMap_Binary[4][0]) | BUTTON_MASK(m_ButtonMap_Binary[6][0])); + break; + } + + case SDL_HAT_UP: { + m_State.wButtons |= BUTTON_MASK(m_ButtonMap_Binary[4][0]); + break; + } + + case SDL_HAT_RIGHTUP: { + m_State.wButtons |= (BUTTON_MASK(m_ButtonMap_Binary[4][0]) | BUTTON_MASK(m_ButtonMap_Binary[7][0])); + break; + } + + case SDL_HAT_RIGHT: { + m_State.wButtons |= (BUTTON_MASK(m_ButtonMap_Binary[7][0])); + break; + } + + case SDL_HAT_RIGHTDOWN: { + m_State.wButtons |= (BUTTON_MASK(m_ButtonMap_Binary[7][0]) | BUTTON_MASK(m_ButtonMap_Binary[5][0])); + break; + } + + case SDL_HAT_DOWN: { + m_State.wButtons |= (BUTTON_MASK(m_ButtonMap_Binary[5][0])); + break; + } + + case SDL_HAT_LEFTDOWN: { + m_State.wButtons |= (BUTTON_MASK(m_ButtonMap_Binary[5][0]) | BUTTON_MASK(m_ButtonMap_Binary[6][0])); + break; + } + + case SDL_HAT_LEFT: { + m_State.wButtons |= (BUTTON_MASK(m_ButtonMap_Binary[6][0])); + break; + } + + case SDL_HAT_CENTERED: { + break; + } + + default: + assert(0); + } + + bStateDirty = true; +} + +void SDL2Devices::UpdateAxisState(uint8_t xbox_button, int16_t state) +{ + switch (xbox_button) + { + case GAMEPAD_LEFT_THUMB_X: { + m_State.sThumbLX = state; + break; + } + + case GAMEPAD_LEFT_THUMB_Y: { + m_State.sThumbLY = -state - 1; // not sure of this yet + break; + } + + case GAMEPAD_RIGHT_THUMB_X: { + m_State.sThumbRX = state; + break; + } + + case GAMEPAD_RIGHT_THUMB_Y: { + m_State.sThumbRY = -state - 1; // not sure of this yet + break; + } + + default: + assert(0); + } +} diff --git a/src/Common/Input/SDL2_Device.h b/src/Common/Input/SDL2_Device.h new file mode 100644 index 000000000..285164d09 --- /dev/null +++ b/src/Common/Input/SDL2_Device.h @@ -0,0 +1,116 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * src->Common->Input->SDL2_Device.h +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** + +#ifndef SDL2DEVICE_H_ +#define SDL2DEVICE_H_ + +#include "InputConfig.h" + + +/* Button state, analogous to XIDGamepadReport */ +struct ButtonState { + std::atomic_uint16_t wButtons; // all non-analog buttons + std::atomic_uint8_t bAnalogButtons[8]; // X, Y, A, B, white, black, left/right trigger + std::atomic_int16_t sThumbLX; // analog stick, left X + std::atomic_int16_t sThumbLY; // analog stick, left Y + std::atomic_int16_t sThumbRX; // analog stick, right X + std::atomic_int16_t sThumbRY; // analog stick, right Y +}; + + +class SDL2Devices +{ + public: + // index of this device + int m_Index; + // game controller object as used by SDL + SDL_GameController* m_Gamepad; + // id of this controller + SDL_JoystickID m_jyID; + + // update analog button state + void UpdateAnalogButtonState(uint8_t xbox_button, uint8_t state); + // update digital button state + void UpdateDigitalButtonState(uint8_t xbox_button, uint8_t state); + // update hat state + void UpdateHatState(uint8_t state); + // update axis state + void UpdateAxisState(uint8_t xbox_button, int16_t state); + // returns the xbox button bound with the sdl key provided + int GetBoundButton(int sdl_key); + // update bBindingsChanged flag + void SetChangedBinding(bool bFlag) { m_bBindingsChanged = bFlag; } + + + private: + // default bindings + const int m_ButtonMap_Analog[8][2] = { + { GAMEPAD_A, SDL_CONTROLLER_BUTTON_A }, + { GAMEPAD_B, SDL_CONTROLLER_BUTTON_B }, + { GAMEPAD_X, SDL_CONTROLLER_BUTTON_X }, + { GAMEPAD_Y, SDL_CONTROLLER_BUTTON_Y }, + { GAMEPAD_BLACK, SDL_CONTROLLER_BUTTON_LEFTSHOULDER }, + { GAMEPAD_WHITE, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER }, + { GAMEPAD_LEFT_TRIGGER, SDL_CONTROLLER_AXIS_TRIGGERLEFT }, + { GAMEPAD_RIGHT_TRIGGER, SDL_CONTROLLER_AXIS_TRIGGERRIGHT }, + }; + const int m_ButtonMap_Binary[8][2] = { + { GAMEPAD_BACK, SDL_CONTROLLER_BUTTON_BACK }, + { GAMEPAD_START, SDL_CONTROLLER_BUTTON_START }, + { GAMEPAD_LEFT_THUMB, SDL_CONTROLLER_BUTTON_LEFTSTICK }, + { GAMEPAD_RIGHT_THUMB, SDL_CONTROLLER_BUTTON_RIGHTSTICK }, + { GAMEPAD_DPAD_UP, SDL_CONTROLLER_BUTTON_DPAD_UP }, + { GAMEPAD_DPAD_DOWN, SDL_CONTROLLER_BUTTON_DPAD_DOWN }, + { GAMEPAD_DPAD_LEFT, SDL_CONTROLLER_BUTTON_DPAD_LEFT }, + { GAMEPAD_DPAD_RIGHT, SDL_CONTROLLER_BUTTON_DPAD_RIGHT }, + }; + const int m_AxisMap[4][2] = { + { GAMEPAD_LEFT_THUMB_X, 0 }, + { GAMEPAD_LEFT_THUMB_Y, 1 }, + { GAMEPAD_RIGHT_THUMB_X, 4 }, + { GAMEPAD_RIGHT_THUMB_Y, 2 }, + }; + // m_HatIndex is added to HAT_CONSTANT to avoid collisions between it and the sdl button indices + int m_HatIndex = HAT_CONSTANT; + // current button state of this controlller + ButtonState m_State; + // signals that the current bindings should be updated + std::atomic_bool m_bBindingsChanged; + // indicates that the button state has been updated since the last time it was read + std::atomic_bool bStateDirty; +}; + +#endif diff --git a/src/Common/Win32/XBController.h b/src/Common/Win32/XBController.h index 1758effd4..742392abe 100644 --- a/src/Common/Win32/XBController.h +++ b/src/Common/Win32/XBController.h @@ -34,7 +34,7 @@ #ifndef XBCONTROLLER_H #define XBCONTROLLER_H -#include "Cxbx.h" +#include "CxbxCommon.h" #include "Common/Error.h" #include "Mutex.h" diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index 4f09456b3..62a564ec0 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -140,15 +140,15 @@ /* Bitfields for the first word of an Isochronous Transfer Desciptor. */ /* CC & DI - same as in the General Transfer Desciptor */ #define OHCI_TD_SF_SHIFT 0 -#define OHCI_TD_SF_MASK (0xffff<in_state.bLength = sizeof(m_XidState->in_state); m_XidState->out_state.length = sizeof(m_XidState->out_state); - //m_XidState->kbd_entry = qemu_add_kbd_event_handler(xbox_gamepad_keyboard_event, m_XidState); TODO m_XidState->xid_desc = &desc_xid_xbox_gamepad; return 0; From 7ab72b4c907118d6bd91895699a66b21f88ed880 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Tue, 17 Jul 2018 00:05:32 +0200 Subject: [PATCH 0059/1000] Replaced Cxbx.h with CxbxCommon.h --- src/Common/CxbxDebugger.cpp | 2 +- src/Common/EmuEEPROM.cpp | 2 +- src/Common/Error.h | 2 +- src/Common/Logging.h | 2 +- src/Common/Win32/XBAudio.h | 2 +- src/Common/Win32/XBVideo.h | 2 +- src/Cxbx/CxbxXbdm.cpp | 2 +- src/CxbxKrnl/DbgConsole.h | 2 +- src/CxbxKrnl/EmuD3D8/PixelShader.h | 2 +- src/CxbxKrnl/EmuD3D8/VertexBuffer.h | 4 ++-- src/CxbxKrnl/EmuD3D8/VertexShader.h | 2 +- src/CxbxKrnl/EmuShared.h | 2 +- src/CxbxKrnl/EmuX86.h | 2 +- src/CxbxKrnl/KernelThunk.cpp | 2 +- src/CxbxKrnl/ResourceTracker.h | 2 +- src/devices/video/EmuNV2A_PTIMER.cpp | 2 +- src/devices/video/nv2a.h | 2 +- 17 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/Common/CxbxDebugger.cpp b/src/Common/CxbxDebugger.cpp index 76673a685..b0f940156 100644 --- a/src/Common/CxbxDebugger.cpp +++ b/src/Common/CxbxDebugger.cpp @@ -32,7 +32,7 @@ // * // ****************************************************************** -#include "Cxbx.h" +#include "CxbxCommon.h" #include "CxbxKrnl/EmuShared.h" #include "CxbxDebugger.h" diff --git a/src/Common/EmuEEPROM.cpp b/src/Common/EmuEEPROM.cpp index d12b537cf..1a0f78c29 100644 --- a/src/Common/EmuEEPROM.cpp +++ b/src/Common/EmuEEPROM.cpp @@ -44,7 +44,7 @@ namespace xboxkrnl #include // For printf #include // For HANDLE, CreateFile, CreateFileMapping, MapViewOfFile -#include "Cxbx.h" // For DbgPrintf +#include "CxbxCommon.h" // For DbgPrintf #include "EmuEEPROM.h" // For EEPROMInfo, EEPROMInfos #include "..\CxbxKrnl\Emu.h" // For EmuWarning #include "..\..\src\devices\LED.h" // For SetLEDSequence diff --git a/src/Common/Error.h b/src/Common/Error.h index 428015ec2..07b071700 100644 --- a/src/Common/Error.h +++ b/src/Common/Error.h @@ -34,7 +34,7 @@ #ifndef ERROR_H #define ERROR_H -#include "Cxbx.h" +#include "CxbxCommon.h" #include diff --git a/src/Common/Logging.h b/src/Common/Logging.h index 5f5e7bff3..def3b4a51 100644 --- a/src/Common/Logging.h +++ b/src/Common/Logging.h @@ -40,7 +40,7 @@ #include // For std::stringstream #include // For std::cout #include // For std::setw -#include "Cxbx.h" // For g_bPrintfOn +#include "CxbxCommon.h" // For g_bPrintfOn // diff --git a/src/Common/Win32/XBAudio.h b/src/Common/Win32/XBAudio.h index d4d28436c..850d8d892 100644 --- a/src/Common/Win32/XBAudio.h +++ b/src/Common/Win32/XBAudio.h @@ -34,7 +34,7 @@ #ifndef XBAUDIO_H #define XBAUDIO_H -#include "Cxbx.h" +#include "CxbxCommon.h" #include "Common/Error.h" #include "Mutex.h" diff --git a/src/Common/Win32/XBVideo.h b/src/Common/Win32/XBVideo.h index 43630e44d..834065249 100644 --- a/src/Common/Win32/XBVideo.h +++ b/src/Common/Win32/XBVideo.h @@ -34,7 +34,7 @@ #ifndef XBVIDEO_H #define XBVIDEO_H -#include "Cxbx.h" +#include "CxbxCommon.h" #include "Common/Error.h" #include "Mutex.h" diff --git a/src/Cxbx/CxbxXbdm.cpp b/src/Cxbx/CxbxXbdm.cpp index c25878876..e8804dfc9 100644 --- a/src/Cxbx/CxbxXbdm.cpp +++ b/src/Cxbx/CxbxXbdm.cpp @@ -42,7 +42,7 @@ #include #include -#include "Cxbx.h" +#include "CxbxCommon.h" #include "Logging.h" namespace xbdm { diff --git a/src/CxbxKrnl/DbgConsole.h b/src/CxbxKrnl/DbgConsole.h index 90e0379f8..589f2ca70 100644 --- a/src/CxbxKrnl/DbgConsole.h +++ b/src/CxbxKrnl/DbgConsole.h @@ -34,7 +34,7 @@ #ifndef DBGCONSOLE_H #define DBGCONSOLE_H -#include "Cxbx.h" +#include "CxbxCommon.h" // debug console input class DbgConsole diff --git a/src/CxbxKrnl/EmuD3D8/PixelShader.h b/src/CxbxKrnl/EmuD3D8/PixelShader.h index 28a80a604..9d7364eda 100644 --- a/src/CxbxKrnl/EmuD3D8/PixelShader.h +++ b/src/CxbxKrnl/EmuD3D8/PixelShader.h @@ -36,7 +36,7 @@ #pragma once -#include "Cxbx.h" +#include "CxbxCommon.h" // dump pixel shader definition to file void DumpPixelShaderDefToFile( X_D3DPIXELSHADERDEF* pPSDef, const char* pszCode ); diff --git a/src/CxbxKrnl/EmuD3D8/VertexBuffer.h b/src/CxbxKrnl/EmuD3D8/VertexBuffer.h index ab3a89f52..38bb60ad2 100755 --- a/src/CxbxKrnl/EmuD3D8/VertexBuffer.h +++ b/src/CxbxKrnl/EmuD3D8/VertexBuffer.h @@ -34,7 +34,7 @@ #ifndef VERTEXBUFFER_H #define VERTEXBUFFER_H -#include "Cxbx.h" +#include "CxbxCommon.h" //#include // Conflict with io.h #define MAX_NBR_STREAMS 16 @@ -126,4 +126,4 @@ extern VOID EmuUpdateActiveTexture(); extern DWORD g_dwPrimPerFrame; -#endif \ No newline at end of file +#endif diff --git a/src/CxbxKrnl/EmuD3D8/VertexShader.h b/src/CxbxKrnl/EmuD3D8/VertexShader.h index fff149950..525192b37 100644 --- a/src/CxbxKrnl/EmuD3D8/VertexShader.h +++ b/src/CxbxKrnl/EmuD3D8/VertexShader.h @@ -34,7 +34,7 @@ #ifndef VERTEXSHADER_H #define VERTEXSHADER_H -#include "Cxbx.h" +#include "CxbxCommon.h" // nv2a microcode header typedef struct diff --git a/src/CxbxKrnl/EmuShared.h b/src/CxbxKrnl/EmuShared.h index 95a3f29b1..d9e31e50f 100644 --- a/src/CxbxKrnl/EmuShared.h +++ b/src/CxbxKrnl/EmuShared.h @@ -34,7 +34,7 @@ #ifndef EMUSHARED_H #define EMUSHARED_H -#include "Cxbx.h" +#include "CxbxCommon.h" #include "Common/Win32/XBController.h" #include "Common/Win32/XBVideo.h" #include "Common/Win32/XBAudio.h" diff --git a/src/CxbxKrnl/EmuX86.h b/src/CxbxKrnl/EmuX86.h index 6b2423c5a..f739a873e 100644 --- a/src/CxbxKrnl/EmuX86.h +++ b/src/CxbxKrnl/EmuX86.h @@ -34,7 +34,7 @@ #ifndef EMUX86_H #define EMUX86_H -#include "Cxbx.h" +#include "CxbxCommon.h" #include #include diff --git a/src/CxbxKrnl/KernelThunk.cpp b/src/CxbxKrnl/KernelThunk.cpp index 644003f92..9c836519a 100644 --- a/src/CxbxKrnl/KernelThunk.cpp +++ b/src/CxbxKrnl/KernelThunk.cpp @@ -41,7 +41,7 @@ namespace xboxkrnl #include }; -#include "Cxbx.h" // For CxbxKrnl_KernelThunkTable +#include "CxbxCommon.h" // For CxbxKrnl_KernelThunkTable #include "CxbxKrnl.h" // For UINT #define FUNC(f) f diff --git a/src/CxbxKrnl/ResourceTracker.h b/src/CxbxKrnl/ResourceTracker.h index 799bfd833..887b48830 100644 --- a/src/CxbxKrnl/ResourceTracker.h +++ b/src/CxbxKrnl/ResourceTracker.h @@ -34,7 +34,7 @@ #ifndef RESOURCETRACKER_H #define RESOURCETRACKER_H -#include "Cxbx.h" +#include "CxbxCommon.h" #include "Common/Win32/Mutex.h" extern class ResourceTracker : public Mutex diff --git a/src/devices/video/EmuNV2A_PTIMER.cpp b/src/devices/video/EmuNV2A_PTIMER.cpp index 6ba4c5d5e..1cd8b6a09 100644 --- a/src/devices/video/EmuNV2A_PTIMER.cpp +++ b/src/devices/video/EmuNV2A_PTIMER.cpp @@ -39,7 +39,7 @@ // * // ****************************************************************** -#include "Cxbx.h" +#include "CxbxCommon.h" /* PTIMER - time measurement and time-based alarms */ static uint64_t ptimer_get_clock(NV2AState * d) diff --git a/src/devices/video/nv2a.h b/src/devices/video/nv2a.h index 62d54f60d..6d732f628 100644 --- a/src/devices/video/nv2a.h +++ b/src/devices/video/nv2a.h @@ -40,7 +40,7 @@ #include "glib_compat.h" // For GHashTable, g_hash_table_new, g_hash_table_lookup, g_hash_table_insert #endif -#include "Cxbx.h" // For xbaddr +#include "CxbxCommon.h" // For xbaddr #include "devices\PCIDevice.h" // For PCIDevice #include From 669b1e8cd13757094aa123b3cc8f9cf435ab38c4 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Tue, 17 Jul 2018 01:09:36 +0200 Subject: [PATCH 0060/1000] Added LLE USB flag --- resource/Cxbx.rc | 1 + src/Cxbx/ResCxbx.h | 1 + src/Cxbx/WndMain.cpp | 16 ++++++++++++++++ src/CxbxKrnl/CxbxKrnl.cpp | 2 ++ src/CxbxKrnl/EmuShared.h | 3 ++- src/CxbxKrnl/HLEIntercept.cpp | 16 +++++++++++++--- src/CxbxKrnl/HLEIntercept.h | 3 ++- 7 files changed, 37 insertions(+), 5 deletions(-) diff --git a/resource/Cxbx.rc b/resource/Cxbx.rc index ca1973cd6..8e3d5f3e4 100644 --- a/resource/Cxbx.rc +++ b/resource/Cxbx.rc @@ -485,6 +485,7 @@ BEGIN POPUP "&LLE (Experimental)", 65535,MFT_STRING,MFS_ENABLED BEGIN MENUITEM "LLE &GPU", ID_EMULATION_LLE_GPU,MFT_STRING,MFS_ENABLED + MENUITEM "LLE &USB", ID_EMULATION_LLE_USB,MFT_STRING,MFS_ENABLED END POPUP "Hacks", 65535,MFT_STRING,MFS_ENABLED BEGIN diff --git a/src/Cxbx/ResCxbx.h b/src/Cxbx/ResCxbx.h index 949c28729..9f0ab17dd 100644 --- a/src/Cxbx/ResCxbx.h +++ b/src/Cxbx/ResCxbx.h @@ -244,6 +244,7 @@ #define ID_EMULATION_LLE_APU 40039 #define ID_EMULATION_LLE_GPU 40040 #define ID_EMULATION_LLE_JIT 40041 +#define ID_EMULATION_LLE_USB 40042 #define ID_SETTINGS_CONFIG_CONTROLLER 40046 #define ID_SETTINGS_CONFIG_VIDEO 40047 #define ID_SETTINGS_CONFIG_AUDIO 40048 diff --git a/src/Cxbx/WndMain.cpp b/src/Cxbx/WndMain.cpp index d91807d3a..6fea5f356 100644 --- a/src/Cxbx/WndMain.cpp +++ b/src/Cxbx/WndMain.cpp @@ -1466,6 +1466,13 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP } break; + case ID_EMULATION_LLE_USB: + { + m_FlagsLLE = m_FlagsLLE ^ LLE_USB; + RefreshMenus(); + } + break; + case ID_EMULATION_START: if (m_Xbe != nullptr) { @@ -1930,6 +1937,9 @@ void WndMain::RefreshMenus() chk_flag = (m_FlagsLLE & LLE_GPU) ? MF_CHECKED : MF_UNCHECKED; CheckMenuItem(settings_menu, ID_EMULATION_LLE_GPU, chk_flag); + chk_flag = (m_FlagsLLE & LLE_USB) ? MF_CHECKED : MF_UNCHECKED; + CheckMenuItem(settings_menu, ID_EMULATION_LLE_USB, chk_flag); + chk_flag = (m_DisablePixelShaders) ? MF_CHECKED : MF_UNCHECKED; CheckMenuItem(settings_menu, ID_HACKS_DISABLEPIXELSHADERS, chk_flag); @@ -2590,12 +2600,18 @@ void WndMain::DrawLedBitmap(HWND hwnd, bool bdefault) if (FlagsLLE & LLE_GPU) { strcat(flagString, "G"); } + if (FlagsLLE & LLE_USB) { + strcat(flagString, "U"); + } if (FlagsLLE & LLE_JIT) { strcat(flagString, "J"); } if (FlagsLLE == 0) { sprintf(flagString, "HLE"); } + else if ((FlagsLLE & LLE_GPU) != 0) { + strcat(flagString, " HLE"); + } } SelectObject(m_LedDC, m_Brushes[ActiveLEDColor]); diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index c4062ad24..580503d51 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -567,6 +567,7 @@ void PrintCurrentConfigurationLog() printf("---------------------------- LLE CONFIG ----------------------------\n"); printf("LLE for APU is %s\n", bLLE_APU ? "enabled" : "disabled"); printf("LLE for GPU is %s\n", bLLE_GPU ? "enabled" : "disabled"); + printf("LLE for USB is %s\n", bLLE_USB ? "enabled" : "disabled"); printf("LLE for JIT is %s\n", bLLE_JIT ? "enabled" : "disabled"); } @@ -1296,6 +1297,7 @@ __declspec(noreturn) void CxbxKrnlInit g_EmuShared->GetFlagsLLE(&CxbxLLE_Flags); bLLE_APU = (CxbxLLE_Flags & LLE_APU) > 0; bLLE_GPU = (CxbxLLE_Flags & LLE_GPU) > 0; + bLLE_USB = (CxbxLLE_Flags & LLE_USB) > 0; bLLE_JIT = (CxbxLLE_Flags & LLE_JIT) > 0; } diff --git a/src/CxbxKrnl/EmuShared.h b/src/CxbxKrnl/EmuShared.h index d9e31e50f..851d73fc2 100644 --- a/src/CxbxKrnl/EmuShared.h +++ b/src/CxbxKrnl/EmuShared.h @@ -51,7 +51,8 @@ enum { enum { LLE_APU = 1 << 0, LLE_GPU = 1 << 1, - LLE_JIT = 1 << 2, + LLE_JIT = 1 << 2, + LLE_USB = 1 << 3, }; // Kernel boot flags diff --git a/src/CxbxKrnl/HLEIntercept.cpp b/src/CxbxKrnl/HLEIntercept.cpp index 673e4571c..315756104 100644 --- a/src/CxbxKrnl/HLEIntercept.cpp +++ b/src/CxbxKrnl/HLEIntercept.cpp @@ -66,7 +66,8 @@ bool g_HLECacheUsed = false; uint32 g_BuildVersion = 0; bool bLLE_APU = false; // Set this to true for experimental APU (sound) LLE -bool bLLE_GPU = false; // Set this to true for experimental GPU (graphics) LLE +bool bLLE_GPU = false; // Set this to true for experimental GPU (graphics) LLE +bool bLLE_USB = false; // Set this to true for experimental USB (input) LLE bool bLLE_JIT = false; // Set this to true for experimental JIT void* GetXboxFunctionPointer(std::string functionName) @@ -282,7 +283,9 @@ void CDECL EmuRegisterSymbol(const char* library_str, if (bLLE_APU && ((library_flag & XbSymbolLib_XACTENG) || (library_flag & XbSymbolLib_DSOUND) > 0)) { // Do nothing if emulating LLE APU } else if (bLLE_GPU && ((library_flag & XbSymbolLib_XGRAPHC) || (library_flag & XbSymbolLib_D3D8) || (library_flag & XbSymbolLib_D3D8LTCG) > 0)) { - // Do nothing if emulating LLE GPU + // Do nothing if emulating LLE GPU + } else if (bLLE_USB && (library_flag & XbSymbolLib_XAPILIB) > 0) { + // Do nothing if emulating LLE USB } else { // Or else check if patch exist then patch it. @@ -343,7 +346,14 @@ void EmuUpdateLLEStatus(uint32_t XbLibScan) bLLE_APU = true; FlagsLLE ^= LLE_APU; EmuOutputMessage(XB_OUTPUT_MESSAGE_INFO, "Fallback to LLE APU."); - } + } + + if ((FlagsLLE & LLE_USB) == false + && (XbLibScan & XbSymbolLib_XAPILIB) == 0) { + bLLE_USB = true; + FlagsLLE ^= LLE_USB; + EmuOutputMessage(XB_OUTPUT_MESSAGE_INFO, "Fallback to LLE USB."); + } g_EmuShared->SetFlagsLLE(&FlagsLLE); } diff --git a/src/CxbxKrnl/HLEIntercept.h b/src/CxbxKrnl/HLEIntercept.h index 507a252bf..17a149593 100644 --- a/src/CxbxKrnl/HLEIntercept.h +++ b/src/CxbxKrnl/HLEIntercept.h @@ -37,7 +37,8 @@ #include extern bool bLLE_APU; // Set this to true for experimental APU (sound) LLE -extern bool bLLE_GPU; // Set this to true for experimental GPU (graphics) LLE +extern bool bLLE_GPU; // Set this to true for experimental GPU (graphics) LLE +extern bool bLLE_USB; // Set this to true for experimental USB (input) LLE extern bool bLLE_JIT; // Set this to true for experimental JIT extern std::map g_SymbolAddresses; From e6de7b99d1346c9bfb5932675b9eaccdda387ca9 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Tue, 17 Jul 2018 21:51:36 +0200 Subject: [PATCH 0061/1000] Removed player to usb port conversion (confirmed as being a bug of XQEMU) --- src/devices/usb/Hub.cpp | 27 ++++++++------------------- src/devices/usb/Hub.h | 3 +-- src/devices/usb/XidGamepad.cpp | 16 +++++++--------- src/devices/usb/XidGamepad.h | 6 +++--- 4 files changed, 19 insertions(+), 33 deletions(-) diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index fb9e9256f..1701a100e 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -81,15 +81,6 @@ extern USBDevice* g_USB0; extern USBDevice* g_USB1; -// This array is used to translate an xbox player to the corresponding usb port -// The port associations are taken from XQEMU -int PlayerToUsbArray[] = { - -1, - 3, - 4, - 1, - 2, -}; struct USBHubPort { USBPort port; // downstream port status @@ -177,12 +168,12 @@ static const uint8_t HubDescriptor[] = 0xFF, // u8 PortPwrCtrlMask; all 1's for compatibility reasons }; -int Hub::Init(int pport) +int Hub::Init(int port) { - if (pport > 4 || pport < 1) { return -1; }; + if (port > 4 || port < 1) { return -1; }; XboxDeviceState* dev = ClassInitFn(); - int rc = UsbHubClaimPort(dev, pport); + int rc = UsbHubClaimPort(dev, port); if (rc != 0) { return rc; } @@ -219,30 +210,28 @@ XboxDeviceState* Hub::ClassInitFn() return dev; } -int Hub::UsbHubClaimPort(XboxDeviceState* dev, int pport) +int Hub::UsbHubClaimPort(XboxDeviceState* dev, int port) { int i; - int usb_port; std::vector::iterator it; assert(dev->Port == nullptr); i = 0; - usb_port = PlayerToUsbArray[pport]; - if (usb_port > 2) { + if (port > 2) { m_UsbDev = g_USB0; } else { m_UsbDev = g_USB1; } - for (auto port : m_UsbDev->m_FreePorts) { - if (port->Path == std::to_string(usb_port)) { + for (auto usb_port : m_UsbDev->m_FreePorts) { + if (usb_port->Path == std::to_string(port)) { break; } i++; } if (i == 2) { - EmuWarning("Port requested %d not found (in use?)", usb_port); + EmuWarning("Port requested %d not found (in use?)", port); return -1; } it = m_UsbDev->m_FreePorts.begin() + i; diff --git a/src/devices/usb/Hub.h b/src/devices/usb/Hub.h index 70c1f79c2..3b2043b62 100644 --- a/src/devices/usb/Hub.h +++ b/src/devices/usb/Hub.h @@ -51,7 +51,7 @@ class Hub USBDevice* m_UsbDev = nullptr; // initialize this peripheral - int Init(int pport); + int Init(int port); // destroy hub resources void HubCleanUp(); @@ -87,6 +87,5 @@ class Hub }; extern Hub* g_HubObjArray[4]; -extern int PlayerToUsbArray[5]; #endif diff --git a/src/devices/usb/XidGamepad.cpp b/src/devices/usb/XidGamepad.cpp index 8d320db03..6c57318fa 100644 --- a/src/devices/usb/XidGamepad.cpp +++ b/src/devices/usb/XidGamepad.cpp @@ -176,12 +176,12 @@ XIDDesc::XIDDesc() static const XIDDesc desc_xid_xbox_gamepad; -int XidGamepad::Init(int pport) +int XidGamepad::Init(int port) { - if (pport > 4 || pport < 1) { return -1; }; + if (port > 4 || port < 1) { return -1; }; XboxDeviceState* dev = ClassInitFn(); - int rc = UsbXidClaimPort(dev, pport); + int rc = UsbXidClaimPort(dev, port); if (rc != 0) { return rc; } @@ -218,21 +218,19 @@ XboxDeviceState* XidGamepad::ClassInitFn() return dev; } -int XidGamepad::UsbXidClaimPort(XboxDeviceState* dev, int pport) +int XidGamepad::UsbXidClaimPort(XboxDeviceState* dev, int port) { int i; - int usb_port; int port_offset; std::vector::iterator it; assert(dev->Port == nullptr); - usb_port = PlayerToUsbArray[pport]; for (int j = 0; j < 4; j++) { if (g_HubObjArray[j]) { i = 0; - for (auto port : g_HubObjArray[j]->m_UsbDev->m_FreePorts) { - if (port->Path == (std::to_string(usb_port) + ".2")) { + for (auto usb_port : g_HubObjArray[j]->m_UsbDev->m_FreePorts) { + if (usb_port->Path == (std::to_string(port) + ".2")) { m_UsbDev = g_HubObjArray[j]->m_UsbDev; break; } @@ -241,7 +239,7 @@ int XidGamepad::UsbXidClaimPort(XboxDeviceState* dev, int pport) } } if (m_UsbDev == nullptr) { - EmuWarning("Port requested %d.%d not found (in use?)", usb_port, 2); + EmuWarning("Port requested %d.%d not found (in use?)", port, 2); return -1; } it = m_UsbDev->m_FreePorts.begin() + i; diff --git a/src/devices/usb/XidGamepad.h b/src/devices/usb/XidGamepad.h index d4e5d5648..661901c98 100644 --- a/src/devices/usb/XidGamepad.h +++ b/src/devices/usb/XidGamepad.h @@ -48,7 +48,7 @@ class XidGamepad { public: // initialize this peripheral - int Init(int pport); + int Init(int port); // destroy gamepad resources void XidCleanUp(); @@ -64,7 +64,7 @@ class XidGamepad // initialize various member variables/functions XboxDeviceState* ClassInitFn(); // reserve a usb port for this gamepad - int UsbXidClaimPort(XboxDeviceState* dev, int pport); + int UsbXidClaimPort(XboxDeviceState* dev, int port); // free the usb port used by this gamepad void UsbXidReleasePort(XboxDeviceState* dev); // see USBDeviceClass for comments about these functions @@ -77,4 +77,4 @@ class XidGamepad void UsbXid_HandleData(XboxDeviceState* dev, USBPacket* p); }; -#endif \ No newline at end of file +#endif From 4e7d4a7eda1fa022fd33007dddde1562c344c969 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Tue, 17 Jul 2018 22:51:53 +0200 Subject: [PATCH 0062/1000] Run all xinput functions as unpatched with LLE USB --- src/CxbxKrnl/EmuXapi.cpp | 80 ++++++++++++++++++++++++++++++++++------ 1 file changed, 68 insertions(+), 12 deletions(-) diff --git a/src/CxbxKrnl/EmuXapi.cpp b/src/CxbxKrnl/EmuXapi.cpp index 75c18e1b4..dd185b9f2 100644 --- a/src/CxbxKrnl/EmuXapi.cpp +++ b/src/CxbxKrnl/EmuXapi.cpp @@ -289,9 +289,13 @@ VOID WINAPI XTL::EMUPATCH(XInitDevices) g_hInputHandle[v] = 0; } */ - - InitXboxControllerHostBridge(); - + if (bLLE_USB) { + XB_trampoline(VOID, WINAPI, XInitDevices, (DWORD, PXDEVICE_PREALLOC_TYPE)); + XB_XInitDevices(dwPreallocTypeCount, PreallocTypes); + } + else { + InitXboxControllerHostBridge(); + } } bool TitleIsJSRF() @@ -392,7 +396,12 @@ DWORD WINAPI XTL::EMUPATCH(XGetDevices) { FUNC_EXPORTS - LOG_FUNC_ONE_ARG(DeviceType); + LOG_FUNC_ONE_ARG(DeviceType); + + if (bLLE_USB) { + XB_trampoline(DWORD, WINAPI, XGetDevices, (PXPP_DEVICE_TYPE)); + RETURN(XB_XGetDevices(DeviceType)); + } UCHAR oldIrql = xboxkrnl::KeRaiseIrqlToDpcLevel(); @@ -445,7 +454,12 @@ BOOL WINAPI XTL::EMUPATCH(XGetDeviceChanges) LOG_FUNC_ARG(DeviceType) LOG_FUNC_ARG(pdwInsertions) LOG_FUNC_ARG(pdwRemovals) - LOG_FUNC_END; + LOG_FUNC_END; + + if (bLLE_USB) { + XB_trampoline(BOOL, WINAPI, XGetDeviceChanges, (PXPP_DEVICE_TYPE, PDWORD, PDWORD)); + RETURN(XB_XGetDeviceChanges(DeviceType, pdwInsertions, pdwRemovals)); + } BOOL ret = FALSE; @@ -520,7 +534,12 @@ HANDLE WINAPI XTL::EMUPATCH(XInputOpen) LOG_FUNC_ARG(dwPort) LOG_FUNC_ARG(dwSlot) LOG_FUNC_ARG(pPollingParameters) - LOG_FUNC_END; + LOG_FUNC_END; + + if (bLLE_USB) { + XB_trampoline(HANDLE, WINAPI, XInputOpen, (PXPP_DEVICE_TYPE, DWORD, DWORD, PX_XINPUT_POLLING_PARAMETERS)); + RETURN(XB_XInputOpen(DeviceType, dwPort, dwSlot, pPollingParameters)); + } X_POLLING_PARAMETERS_HANDLE *pph = 0; //OLD_XINPUT @@ -622,7 +641,13 @@ VOID WINAPI XTL::EMUPATCH(XInputClose) { FUNC_EXPORTS - LOG_FUNC_ONE_ARG(hDevice); + LOG_FUNC_ONE_ARG(hDevice); + + if (bLLE_USB) { + XB_trampoline(VOID, WINAPI, XInputClose, (HANDLE)); + XB_XInputClose(hDevice); + return; + } X_POLLING_PARAMETERS_HANDLE *pph = (X_POLLING_PARAMETERS_HANDLE*)hDevice; DWORD dwPort = pph->dwPort; @@ -675,7 +700,13 @@ DWORD WINAPI XTL::EMUPATCH(XInputPoll) { FUNC_EXPORTS - LOG_FUNC_ONE_ARG(hDevice); + LOG_FUNC_ONE_ARG(hDevice); + + if (bLLE_USB) { + XB_trampoline(DWORD, WINAPI, XInputPoll, (HANDLE)); + RETURN(XB_XInputPoll(hDevice)); + } + //OLD_XINPUT /* X_POLLING_PARAMETERS_HANDLE *pph = (X_POLLING_PARAMETERS_HANDLE*)hDevice; @@ -752,7 +783,12 @@ DWORD WINAPI XTL::EMUPATCH(XInputGetCapabilities) LOG_FUNC_BEGIN LOG_FUNC_ARG(hDevice) LOG_FUNC_ARG_OUT(pCapabilities) - LOG_FUNC_END; + LOG_FUNC_END; + + if (bLLE_USB) { + XB_trampoline(DWORD, WINAPI, XInputGetCapabilities, (HANDLE, PX_XINPUT_CAPABILITIES)); + RETURN(XB_XInputGetCapabilities(hDevice, pCapabilities)); + } DWORD ret = ERROR_DEVICE_NOT_CONNECTED; @@ -1032,7 +1068,12 @@ DWORD WINAPI XTL::EMUPATCH(XInputGetState) LOG_FUNC_BEGIN LOG_FUNC_ARG(hDevice) LOG_FUNC_ARG_OUT(pState) - LOG_FUNC_END; + LOG_FUNC_END; + + if (bLLE_USB) { + XB_trampoline(DWORD, WINAPI, XInputGetState, (HANDLE, PX_XINPUT_STATE)); + RETURN(XB_XInputGetState(hDevice, pState)); + } DWORD ret = ERROR_INVALID_HANDLE; //OLD_XINPUT @@ -1124,6 +1165,11 @@ DWORD WINAPI XTL::EMUPATCH(XInputSetState) LOG_FUNC_ARG(hDevice) LOG_FUNC_ARG(pFeedback) LOG_FUNC_END; + + if (bLLE_USB) { + XB_trampoline(DWORD, WINAPI, XInputSetState, (HANDLE, PX_XINPUT_FEEDBACK)); + RETURN(XB_XInputSetState(hDevice, pFeedback)); + } DWORD ret = ERROR_IO_PENDING; //OLD_XINPUT @@ -1900,7 +1946,12 @@ DWORD WINAPI XTL::EMUPATCH(XGetDeviceEnumerationStatus)() { FUNC_EXPORTS - LOG_FUNC(); + LOG_FUNC(); + + if (bLLE_USB) { + XB_trampoline(DWORD, WINAPI, XGetDeviceEnumerationStatus, ()); + RETURN(XB_XGetDeviceEnumerationStatus()); + } LOG_UNIMPLEMENTED(); @@ -1921,7 +1972,12 @@ DWORD WINAPI XTL::EMUPATCH(XInputGetDeviceDescription) LOG_FUNC_BEGIN LOG_FUNC_ARG(hDevice) LOG_FUNC_ARG(pDescription) - LOG_FUNC_END; + LOG_FUNC_END; + + if (bLLE_USB) { + XB_trampoline(DWORD, WINAPI, XInputGetDeviceDescription, (HANDLE, PVOID)); + RETURN(XB_XInputGetDeviceDescription(hDevice, pDescription)); + } // TODO: Lightgun support? LOG_UNIMPLEMENTED(); From c18e2f6a3805db37c56c94e0938c79fc5d8da1cf Mon Sep 17 00:00:00 2001 From: ergo720 Date: Wed, 18 Jul 2018 23:32:18 +0200 Subject: [PATCH 0063/1000] Connected LLE USB implementation with the rest of the emulator (untested) --- src/Common/Input/InputConfig.cpp | 233 ++++++++++++++++++++++++++++++- src/Common/Input/InputConfig.h | 34 ++++- src/Common/Input/SDL2_Device.cpp | 17 +++ src/Common/Input/SDL2_Device.h | 9 +- src/CxbxKrnl/CxbxKrnl.cpp | 16 ++- src/CxbxKrnl/Timer.cpp | 12 +- src/devices/Xbox.cpp | 19 ++- src/devices/usb/Hub.cpp | 10 ++ src/devices/usb/Hub.h | 8 +- src/devices/usb/OHCI.cpp | 17 ++- src/devices/usb/OHCI.h | 6 +- src/devices/usb/XidGamepad.cpp | 14 +- src/devices/usb/XidGamepad.h | 7 +- 13 files changed, 368 insertions(+), 34 deletions(-) diff --git a/src/Common/Input/InputConfig.cpp b/src/Common/Input/InputConfig.cpp index e368b1e06..1c9843e6b 100644 --- a/src/Common/Input/InputConfig.cpp +++ b/src/Common/Input/InputConfig.cpp @@ -35,8 +35,13 @@ // ****************************************************************** #include "InputConfig.h" +#include "..\devices\usb\XidGamepad.h" +#include "..\..\CxbxKrnl\EmuKrnl.h" // For EmuWarning +#include +InputDeviceManager* g_InputDeviceManager = nullptr; + InputDeviceManager::InputDeviceManager() { if (SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER) < 0) { @@ -53,6 +58,7 @@ InputDeviceManager::~InputDeviceManager() int InputDeviceManager::EnumSdl2Devices() { int NumOfJoysticks; + int NumInvalidJoysticks; SDL2Devices* pDev; SDL_GameController* pController; std::vector::iterator it; @@ -60,16 +66,19 @@ int InputDeviceManager::EnumSdl2Devices() NumOfJoysticks = SDL_NumJoysticks(); if (NumOfJoysticks < 0) { EmuWarning("Failed to enumerate joysticks. The error was: %s", SDL_GetError()); - return -1; + return 0; } - SDL_GameControllerButtonBind; + + NumInvalidJoysticks = 0; + for (int i = 0; i < NumOfJoysticks; i++) { if (SDL_IsGameController(i)) { pDev = new SDL2Devices(); pDev->m_Index = i; m_Sdl2Devices.push_back(pDev); } - // this joystick not supported at the moment + // this joystick is not supported at the moment + NumInvalidJoysticks++; } for (it = m_Sdl2Devices.begin(); it != m_Sdl2Devices.end();) { @@ -78,14 +87,154 @@ int InputDeviceManager::EnumSdl2Devices() EmuWarning("Failed to open game controller %s. The error was %s\n", SDL_GameControllerNameForIndex((*it)->m_Index), SDL_GetError()); delete (*it); it = m_Sdl2Devices.erase(it); + NumInvalidJoysticks++; } else { printf("Found game controller %s\n", SDL_GameControllerName(pController)); (*it)->m_Gamepad = pController; (*it)->m_jyID = SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(pController)); + (*it)->m_Attached = 1; ++it; } } + + return NumOfJoysticks - NumInvalidJoysticks; +} + +int InputDeviceManager::ConnectDeviceToXbox(int port, int type) +{ + int ret = -1; + std::vector::iterator it; + + if (port > 4 || port < 1) { return ret; }; + + for (it = m_Sdl2Devices.begin(); it != m_Sdl2Devices.end(); ++it) { + if ((*it)->m_Index == (port - 1)) { + --port; + break; + } + } + + if (it == m_Sdl2Devices.end()) { + EmuWarning("Attempted to connect a device not yet enumerated.\n"); + return ret; + } + + switch (type) + { + case MS_CONTROLLER_DUKE: { + if (g_HubObjArray[port] == nullptr) { + g_HubObjArray[port] = new Hub; + ret = g_HubObjArray[port]->Init(port); + if (ret) { + delete g_HubObjArray[port]; + g_HubObjArray[port] = nullptr; + break; + } + if (g_XidControllerObjArray[port] == nullptr) { + g_XidControllerObjArray[port] = new XidGamepad; + ret = g_XidControllerObjArray[port]->Init(port); + if (ret) { + g_HubObjArray[port]->HubDestroy(); + delete g_HubObjArray[port]; + g_HubObjArray[port] = nullptr; + delete g_XidControllerObjArray[port]; + g_XidControllerObjArray[port] = nullptr; + } + } + else { + ret = -1; + g_HubObjArray[port]->HubDestroy(); + delete g_HubObjArray[port]; + g_HubObjArray[port] = nullptr; + EmuWarning("Xid controller already present at port %d.2\n", port + 1); + } + } + else { + EmuWarning("Hub already present at port %d\n", port + 1); + } + break; + } + + case MS_CONTROLLER_S: + case LIGHT_GUN: + case STEERING_WHEEL: + case MEMORY_UNIT: + case IR_DONGLE: + case STEEL_BATTALION_CONTROLLER: { + printf("This device type is not yet supported\n"); + break; + } + + default: + EmuWarning("Attempted to attach an unknown device type\n"); + } + + if (!ret) { + (*it)->m_Type = type; + (*it)->m_Attached = 1; + } + + return ret; +} + +void InputDeviceManager::DisconnectDeviceFromXbox(int port) +{ + std::vector::iterator it; + + if (port < 1) { return; } + + for (it = m_Sdl2Devices.begin(); it != m_Sdl2Devices.end(); ++it) { + if ((*it)->m_Index == (port - 1)) { + --port; + break; + } + } + + if (it == m_Sdl2Devices.end()) { + // Not necessarily a bug. This could also be triggered by detaching an unsupported joystick + return; + } + + if (port + 1 > 4) { + delete (*it); + m_Sdl2Devices.erase(it); + return; + } + + switch ((*it)->m_Type) + { + case MS_CONTROLLER_DUKE: { + if (g_HubObjArray[port] != nullptr && g_XidControllerObjArray[port] != nullptr) { + g_HubObjArray[port]->HubDestroy(); + delete g_HubObjArray[port]; + g_HubObjArray[port] = nullptr; + delete g_XidControllerObjArray[port]; + g_XidControllerObjArray[port] = nullptr; + delete (*it); + m_Sdl2Devices.erase(it); + // Here, we could also see if there are detached devices that have a matching type and bound buttons, so that it can immediately + // be used instead of remaining inactive (example: 5 controllers and 1st is detached -> 5th can be used if it has bindings) + } + else { + EmuWarning("Attempted to disconnect a device not attached to the Xbox.\n"); + } + break; + } + + case MS_CONTROLLER_S: + case LIGHT_GUN: + case STEERING_WHEEL: + case MEMORY_UNIT: + case IR_DONGLE: + case STEEL_BATTALION_CONTROLLER: { + printf("This device type is not yet supported\n"); + break; + } + + default: + EmuWarning("Attempted to detach an unknown device type\n"); + } } void InputDeviceManager::StartInputThread() @@ -128,6 +277,29 @@ void InputDeviceManager::InputThread(InputDeviceManager* pVoid) break; } + case SDL_JOYDEVICEADDED: { + bool found = false; + for (auto dev : pVoid->m_Sdl2Devices) { + if (dev->m_Index == event.jdevice.which) { + // already enumerated, skipping + found = true; + break; + } + } + if (!found) { + // for now we only support a single controller at port 1, more will be added later + if (!pVoid->IsValidController(event.jdevice.which) && event.jdevice.which == 0) { + pVoid->ConnectDeviceToXbox(1, MS_CONTROLLER_DUKE); + } + } + break; + } + + case SDL_JOYDEVICEREMOVED: { + pVoid->DisconnectDeviceFromXbox(event.jdevice.which + 1); + break; + } + case SDL_CONTROLLERBUTTONUP: case SDL_CONTROLLERBUTTONDOWN: { pVoid->UpdateButtonState(event.cbutton.which, event.cbutton.button, event.cbutton.state); @@ -139,6 +311,13 @@ void InputDeviceManager::InputThread(InputDeviceManager* pVoid) break; } + case SDL_CONTROLLERDEVICEADDED: { + + } + case SDL_CONTROLLERDEVICEREMOVED: { + + } + case SDL_QUIT: { bContinue = false; break; @@ -250,3 +429,51 @@ void InputDeviceManager::UpdateAxisState(SDL_JoystickID id, uint8_t axis_index, ControllerObj->UpdateAxisState(xbox_button, state); } + +int InputDeviceManager::IsValidController(int index) +{ + SDL2Devices* pDev; + SDL_GameController* pController; + + if (SDL_IsGameController(index)) { + pDev = new SDL2Devices(); + pDev->m_Index = index; + m_Sdl2Devices.push_back(pDev); + } + else { + // this joystick is not supported at the moment + return -1; + } + + pController = SDL_GameControllerOpen(pDev->m_Index); + if (pController == nullptr) { + EmuWarning("Failed to open game controller %s. The error was %s\n", SDL_GameControllerNameForIndex(pDev->m_Index), SDL_GetError()); + delete pDev; + m_Sdl2Devices.erase(m_Sdl2Devices.begin() + index); + return -1; + } + else if (pDev->m_Index > 3) { + printf("More than 4 controllers detected. Putting game controller %s in detached state\n", + SDL_GameControllerName(pController)); + pDev->m_Attached = 0; + return -1; + } + else { + printf("Found game controller %s\n", SDL_GameControllerName(pController)); + pDev->m_Gamepad = pController; + pDev->m_jyID = SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(pController)); + return 0; + } +} + +SDL2Devices* InputDeviceManager::FindDeviceFromXboxPort(int port) +{ + if (port > 4 || port < 1) { return nullptr; }; + + for (auto it = m_Sdl2Devices.begin(); it != m_Sdl2Devices.end(); ++it) { + if ((*it)->m_Index == (port - 1)) { + return *it; + } + } + return nullptr; +} diff --git a/src/Common/Input/InputConfig.h b/src/Common/Input/InputConfig.h index 2b1971f6a..f04cbafff 100644 --- a/src/Common/Input/InputConfig.h +++ b/src/Common/Input/InputConfig.h @@ -39,8 +39,6 @@ #include #include -#include -#include "..\..\CxbxKrnl\EmuKrnl.h" // For EmuWarning #include "SDL.h" #define GAMEPAD_A 0 @@ -51,7 +49,7 @@ #define GAMEPAD_WHITE 5 #define GAMEPAD_LEFT_TRIGGER 6 #define GAMEPAD_RIGHT_TRIGGER 7 - + #define GAMEPAD_DPAD_UP 8 #define GAMEPAD_DPAD_DOWN 9 #define GAMEPAD_DPAD_LEFT 10 @@ -75,13 +73,35 @@ #include "SDL2_Device.h" +/* enum indicating the device type to attach to the virtual xbox */ +typedef enum { + DEVICE_INVALID = 0, + MS_CONTROLLER_DUKE, + MS_CONTROLLER_S, + LIGHT_GUN, + STEERING_WHEEL, + MEMORY_UNIT, + IR_DONGLE, + STEEL_BATTALION_CONTROLLER, +}; + + class InputDeviceManager { public: InputDeviceManager(); ~InputDeviceManager(); - + + // enumerate all available sdl2 controllers int EnumSdl2Devices(); + // start input event processing thread + void StartInputThread(); + // connect the enumerated device to the virtual xbox + int ConnectDeviceToXbox(int port, int type); + // disconnect a device from the emulated xbox + void DisconnectDeviceFromXbox(int port); + // find the device attached to the supplied xbox port + SDL2Devices* FindDeviceFromXboxPort(int port); private: @@ -90,8 +110,6 @@ class InputDeviceManager // assign the button binding to the devices //void AssignBindings(); - // start input event processing thread - void StartInputThread(); // input thread static void InputThread(InputDeviceManager* pVoid); // updates the button state of a joystick @@ -100,6 +118,10 @@ class InputDeviceManager void UpdateHatState(SDL_JoystickID id, uint8_t hat_index, uint8_t state); // updates the axis state of a joystick void UpdateAxisState(SDL_JoystickID id, uint8_t axis_index, int16_t state); + // checks if the controller attached can be used by sdl + int IsValidController(int index); }; +extern InputDeviceManager* g_InputDeviceManager; + #endif diff --git a/src/Common/Input/SDL2_Device.cpp b/src/Common/Input/SDL2_Device.cpp index ab103b2ce..788762af5 100644 --- a/src/Common/Input/SDL2_Device.cpp +++ b/src/Common/Input/SDL2_Device.cpp @@ -35,6 +35,7 @@ // ****************************************************************** #include "SDL2_Device.h" +#include int SDL2Devices::GetBoundButton(int sdl_key) @@ -197,3 +198,19 @@ void SDL2Devices::UpdateAxisState(uint8_t xbox_button, int16_t state) assert(0); } } + +void SDL2Devices::ReadButtonState(uint16_t* wButtons, uint8_t* bAnalogButtons, int16_t* sThumbLX, + int16_t* sThumbLY, int16_t* sThumbRX, int16_t* sThumbRY) +{ + if (bStateDirty) { + *wButtons = m_State.wButtons.load(); + *sThumbLX = m_State.sThumbLX.load(); + *sThumbLY = m_State.sThumbLY.load(); + *sThumbRX = m_State.sThumbRX.load(); + *sThumbRY = m_State.sThumbRY.load(); + for (int i = 0; i < 8; ++i) { + bAnalogButtons[i] = m_State.bAnalogButtons[i].load(); + } + bStateDirty = false; + } +} diff --git a/src/Common/Input/SDL2_Device.h b/src/Common/Input/SDL2_Device.h index 285164d09..e275b393e 100644 --- a/src/Common/Input/SDL2_Device.h +++ b/src/Common/Input/SDL2_Device.h @@ -60,6 +60,10 @@ class SDL2Devices SDL_GameController* m_Gamepad; // id of this controller SDL_JoystickID m_jyID; + // attach/detach state of this controller + int m_Attached; + // indicates the xbox device emulated by this controller + int m_Type = DEVICE_INVALID; // update analog button state void UpdateAnalogButtonState(uint8_t xbox_button, uint8_t state); @@ -73,10 +77,13 @@ class SDL2Devices int GetBoundButton(int sdl_key); // update bBindingsChanged flag void SetChangedBinding(bool bFlag) { m_bBindingsChanged = bFlag; } + // read the current button state of a device + void ReadButtonState(uint16_t* wButtons, uint8_t* bAnalogButtons, int16_t* sThumbLX, + int16_t* sThumbLY, int16_t* sThumbRX, int16_t* sThumbRY); private: - // default bindings + // default bindings (hardcoded for now) const int m_ButtonMap_Analog[8][2] = { { GAMEPAD_A, SDL_CONTROLLER_BUTTON_A }, { GAMEPAD_B, SDL_CONTROLLER_BUTTON_B }, diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index 580503d51..d426c8919 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -71,6 +71,7 @@ namespace xboxkrnl #include "devices\LED.h" // For LED::Sequence #include "EmuSha.h" // For the SHA1 functions #include "Timer.h" // For Timer_Init +#include "..\Common\Input\InputConfig.h" // For the InputDeviceManager /*! thread local storage */ Xbe::TLS *CxbxKrnl_TLS = NULL; @@ -1454,10 +1455,23 @@ __declspec(noreturn) void CxbxKrnlInit EmuHLEIntercept(pXbeHeader); - SetupXboxDeviceTypes(); + if (!bLLE_USB) { + SetupXboxDeviceTypes(); + } InitXboxHardware(HardwareModel::Revision1_5); // TODO : Make configurable + if (bLLE_USB) { + int ret; + g_InputDeviceManager = new InputDeviceManager; + ret = g_InputDeviceManager->EnumSdl2Devices(); + g_InputDeviceManager->StartInputThread(); + if (ret > 0) { + // Temporary: the device type and bindings should be read from emushared, for now always assume one xbox controller + g_InputDeviceManager->ConnectDeviceToXbox(1, MS_CONTROLLER_DUKE); + } + } + // Now the hardware devices exist, couple the EEPROM buffer to it's device g_EEPROM->SetEEPROM((uint8_t*)EEPROM); diff --git a/src/CxbxKrnl/Timer.cpp b/src/CxbxKrnl/Timer.cpp index c53acd92c..70d23d4e4 100644 --- a/src/CxbxKrnl/Timer.cpp +++ b/src/CxbxKrnl/Timer.cpp @@ -33,8 +33,10 @@ // * All rights reserved // * // ****************************************************************** - -#include + +#ifdef _WIN32 +#include +#endif #include #include #include "Timer.h" @@ -106,7 +108,11 @@ void ClockThread(TimerObject* Timer) Timer_Destroy(Timer); return; } - Timer->Callback(Timer->Opaque); + Timer->Callback(Timer->Opaque); + if (Timer->Exit.load()) { + Timer_Destroy(Timer); + return; + } NewExpireTime = GetNextExpireTime(Timer); } } diff --git a/src/devices/Xbox.cpp b/src/devices/Xbox.cpp index 10a43de32..302afff58 100644 --- a/src/devices/Xbox.cpp +++ b/src/devices/Xbox.cpp @@ -34,7 +34,8 @@ // * // ****************************************************************** -#include "Xbox.h" // For HardwareModel +#include "Xbox.h" // For HardwareModel +#include "..\CxbxKrnl\HLEIntercept.h" PCIBus* g_PCIBus; SMBus* g_SMBus; @@ -129,9 +130,11 @@ void InitXboxHardware(HardwareModel hardwareModel) g_EEPROM = new EEPROMDevice(); g_NVNet = new NVNetDevice(); g_NV2A = new NV2ADevice(); - g_ADM1032 = new ADM1032Device(); - g_USB0 = new USBDevice(); - g_USB1 = new USBDevice(); + g_ADM1032 = new ADM1032Device(); + if (bLLE_USB) { + g_USB0 = new USBDevice(); + g_USB1 = new USBDevice(); + } // Connect devices to SM bus g_SMBus->ConnectDevice(SMBUS_ADDRESS_SYSTEM_MICRO_CONTROLLER, g_SMC); // W 0x20 R 0x21 @@ -159,9 +162,11 @@ void InitXboxHardware(HardwareModel hardwareModel) //g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(4, 1)), g_MCPX); // MCPX device ID = 0x0808 ? //g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(5, 0)), g_NVAPU); //g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(6, 0)), g_AC97); - g_PCIBus->ConnectDevice(PCI_DEVID(1, PCI_DEVFN(0, 0)), g_NV2A, NV2A_ADDR); - g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(2, 0)), g_USB0, USB0_BASE); - g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(3, 0)), g_USB1, USB1_BASE); + g_PCIBus->ConnectDevice(PCI_DEVID(1, PCI_DEVFN(0, 0)), g_NV2A, NV2A_ADDR); + if (bLLE_USB) { + g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(2, 0)), g_USB0, USB0_BASE); + g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(3, 0)), g_USB1, USB1_BASE); + } // TODO : Handle other SMBUS Addresses, like PIC_ADDRESS, XCALIBUR_ADDRESS // Resources : http://pablot.com/misc/fancontroller.cpp diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index 1701a100e..42ddda8a0 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -81,6 +81,8 @@ extern USBDevice* g_USB0; extern USBDevice* g_USB1; +Hub* g_HubObjArray[4] = { nullptr }; + struct USBHubPort { USBPort port; // downstream port status @@ -689,3 +691,11 @@ void Hub::HubCleanUp() m_pPeripheralFuncStruct = nullptr; m_HubState = nullptr; } + +void Hub::HubDestroy() +{ + while (m_UsbDev->m_HostController->m_bFrameTime) {} + m_UsbDev->m_HostController->m_bFrameTime = true; + m_pPeripheralFuncStruct->handle_destroy(); + m_UsbDev->m_HostController->m_bFrameTime = false; +} diff --git a/src/devices/usb/Hub.h b/src/devices/usb/Hub.h index 3b2043b62..8da05ccae 100644 --- a/src/devices/usb/Hub.h +++ b/src/devices/usb/Hub.h @@ -50,10 +50,10 @@ class Hub // usb device this hub is attached to USBDevice* m_UsbDev = nullptr; - // initialize this peripheral + // initialize this hub int Init(int port); - // destroy hub resources - void HubCleanUp(); + // start hub destruction + void HubDestroy(); private: @@ -84,6 +84,8 @@ class Hub void UsbHubReleasePort(XboxDeviceState* dev); // retieve the name of the feature of the usb request std::string GetFeatureName(int feature); + // destroy hub resources + void HubCleanUp(); }; extern Hub* g_HubObjArray[4]; diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index 62a564ec0..386609b37 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -194,7 +194,8 @@ OHCI::OHCI(int Irq, USBDevice* UsbObj) USBPortOps* ops; m_IrqNum = Irq; - m_UsbDevice = UsbObj; + m_UsbDevice = UsbObj; + m_bFrameTime = false; ops = new USBPortOps(); { using namespace std::placeholders; @@ -229,11 +230,15 @@ void OHCI::OHCI_FrameBoundaryWrapper(void* pVoid) void OHCI::OHCI_FrameBoundaryWorker() { - OHCI_HCCA hcca; + OHCI_HCCA hcca; + + while (m_bFrameTime) {} + m_bFrameTime = true; if (OHCI_ReadHCCA(m_Registers.HcHCCA, &hcca)) { EmuWarning("%s: HCCA read error at physical address 0x%X", m_Registers.HcHCCA, LOG_STR_OHCI); - OHCI_FatalError(); + OHCI_FatalError(); + m_bFrameTime = false; return; } @@ -257,7 +262,8 @@ void OHCI::OHCI_FrameBoundaryWorker() OHCI_ProcessLists(0); // Stop if UnrecoverableError happened or OHCI_SOF will crash - if (m_Registers.HcInterruptStatus & OHCI_INTR_UE) { + if (m_Registers.HcInterruptStatus & OHCI_INTR_UE) { + m_bFrameTime = false; return; } @@ -302,7 +308,8 @@ void OHCI::OHCI_FrameBoundaryWorker() if (OHCI_WriteHCCA(m_Registers.HcHCCA, &hcca)) { EmuWarning("%s: HCCA write error at physical address 0x%X", LOG_STR_OHCI, m_Registers.HcHCCA); OHCI_FatalError(); - } + } + m_bFrameTime = false; } void OHCI::OHCI_FatalError() diff --git a/src/devices/usb/OHCI.h b/src/devices/usb/OHCI.h index e58116a53..925f86bb1 100644 --- a/src/devices/usb/OHCI.h +++ b/src/devices/usb/OHCI.h @@ -139,7 +139,11 @@ struct OHCI_Registers /* OHCI class representing the state of the HC */ class OHCI { - public: + public: + // Indicates that the timer thread is accessing the OHCI object. Necessary because the input thread from the + // InputDeviceManager will access us when it needs to destroy a device + std::atomic_bool m_bFrameTime; + // constructor OHCI(int Irqn, USBDevice* UsbObj); // destructor diff --git a/src/devices/usb/XidGamepad.cpp b/src/devices/usb/XidGamepad.cpp index 6c57318fa..d93c8335f 100644 --- a/src/devices/usb/XidGamepad.cpp +++ b/src/devices/usb/XidGamepad.cpp @@ -35,7 +35,8 @@ // ****************************************************************** #include "XidGamepad.h" -#include "USBDevice.h" +#include "USBDevice.h" +#include "Common/Input/InputConfig.h" #define LOG_STR_GAMEPAD "Gamepad:" @@ -46,6 +47,8 @@ #define HID_SET_REPORT 0x09 #define XID_GET_CAPABILITIES 0x01 + +XidGamepad* g_XidControllerObjArray[4]; #pragma pack(1) @@ -239,9 +242,10 @@ int XidGamepad::UsbXidClaimPort(XboxDeviceState* dev, int port) } } if (m_UsbDev == nullptr) { - EmuWarning("Port requested %d.%d not found (in use?)", port, 2); + EmuWarning("Port requested %d.2 not found (in use?)", port); return -1; } + m_Port = port; it = m_UsbDev->m_FreePorts.begin() + i; dev->Port = *it; (*it)->Dev = dev; @@ -316,6 +320,12 @@ void XidGamepad::UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, if (value == 0x100) { assert(m_XidState->in_state.bLength <= length); // m_XidState->in_state.bReportId++; /* FIXME: I'm not sure if bReportId is just a counter */ + SDL2Devices* controller = g_InputDeviceManager->FindDeviceFromXboxPort(m_Port); + if (controller != nullptr) { + controller->ReadButtonState(&m_XidState->in_state.wButtons, m_XidState->in_state.bAnalogButtons, + &m_XidState->in_state.sThumbLX, &m_XidState->in_state.sThumbLY, &m_XidState->in_state.sThumbRX, + &m_XidState->in_state.sThumbRY); + } std::memcpy(data, &m_XidState->in_state, m_XidState->in_state.bLength); p->ActualLength = m_XidState->in_state.bLength; } diff --git a/src/devices/usb/XidGamepad.h b/src/devices/usb/XidGamepad.h index 661901c98..35a202c82 100644 --- a/src/devices/usb/XidGamepad.h +++ b/src/devices/usb/XidGamepad.h @@ -42,7 +42,6 @@ struct USBXIDState; // forward declare - /* Class which implements an xbox gamepad */ class XidGamepad { @@ -59,7 +58,9 @@ class XidGamepad // gamepad state USBXIDState* m_XidState = nullptr; // gamepad class functions - USBDeviceClass* m_pPeripheralFuncStruct = nullptr; + USBDeviceClass* m_pPeripheralFuncStruct = nullptr; + // xbox port this gamepad is attached to + int m_Port = 0; // initialize various member variables/functions XboxDeviceState* ClassInitFn(); @@ -77,4 +78,6 @@ class XidGamepad void UsbXid_HandleData(XboxDeviceState* dev, USBPacket* p); }; +extern XidGamepad* g_XidControllerObjArray[4]; + #endif From 06a5cbc5a914580c39e2358d40f32dacf2a589e0 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Thu, 19 Jul 2018 18:54:03 +0200 Subject: [PATCH 0064/1000] Ported back from JayFoxRox's research improved xid requests implementation + other minor xid changes --- src/Common/Input/SDL2_Device.cpp | 4 +- src/Common/Input/SDL2_Device.h | 2 +- src/devices/usb/Hub.cpp | 7 ++ src/devices/usb/OHCI.h | 2 +- src/devices/usb/XidGamepad.cpp | 172 +++++++++++++++++++++++-------- src/devices/usb/XidGamepad.h | 5 +- 6 files changed, 147 insertions(+), 45 deletions(-) diff --git a/src/Common/Input/SDL2_Device.cpp b/src/Common/Input/SDL2_Device.cpp index 788762af5..975da59d9 100644 --- a/src/Common/Input/SDL2_Device.cpp +++ b/src/Common/Input/SDL2_Device.cpp @@ -199,7 +199,7 @@ void SDL2Devices::UpdateAxisState(uint8_t xbox_button, int16_t state) } } -void SDL2Devices::ReadButtonState(uint16_t* wButtons, uint8_t* bAnalogButtons, int16_t* sThumbLX, +bool SDL2Devices::ReadButtonState(uint16_t* wButtons, uint8_t* bAnalogButtons, int16_t* sThumbLX, int16_t* sThumbLY, int16_t* sThumbRX, int16_t* sThumbRY) { if (bStateDirty) { @@ -212,5 +212,7 @@ void SDL2Devices::ReadButtonState(uint16_t* wButtons, uint8_t* bAnalogButtons, i bAnalogButtons[i] = m_State.bAnalogButtons[i].load(); } bStateDirty = false; + return true; } + return false; } diff --git a/src/Common/Input/SDL2_Device.h b/src/Common/Input/SDL2_Device.h index e275b393e..ea7dc2f09 100644 --- a/src/Common/Input/SDL2_Device.h +++ b/src/Common/Input/SDL2_Device.h @@ -78,7 +78,7 @@ class SDL2Devices // update bBindingsChanged flag void SetChangedBinding(bool bFlag) { m_bBindingsChanged = bFlag; } // read the current button state of a device - void ReadButtonState(uint16_t* wButtons, uint8_t* bAnalogButtons, int16_t* sThumbLX, + bool ReadButtonState(uint16_t* wButtons, uint8_t* bAnalogButtons, int16_t* sThumbLX, int16_t* sThumbLY, int16_t* sThumbRX, int16_t* sThumbRY); diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index 42ddda8a0..f985c3053 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -177,12 +177,15 @@ int Hub::Init(int port) XboxDeviceState* dev = ClassInitFn(); int rc = UsbHubClaimPort(dev, port); if (rc != 0) { + m_UsbDev->m_HostController->m_bFrameTime = false; return rc; } m_UsbDev->USB_EpInit(dev); m_UsbDev->USB_DeviceInit(dev); m_UsbDev->USB_DeviceAttach(dev); + m_UsbDev->m_HostController->m_bFrameTime = false; + return 0; } @@ -226,6 +229,10 @@ int Hub::UsbHubClaimPort(XboxDeviceState* dev, int port) else { m_UsbDev = g_USB1; } + + while (m_UsbDev->m_HostController->m_bFrameTime) {} + m_UsbDev->m_HostController->m_bFrameTime = true; + for (auto usb_port : m_UsbDev->m_FreePorts) { if (usb_port->Path == std::to_string(port)) { break; diff --git a/src/devices/usb/OHCI.h b/src/devices/usb/OHCI.h index 925f86bb1..ddf2b4804 100644 --- a/src/devices/usb/OHCI.h +++ b/src/devices/usb/OHCI.h @@ -141,7 +141,7 @@ class OHCI { public: // Indicates that the timer thread is accessing the OHCI object. Necessary because the input thread from the - // InputDeviceManager will access us when it needs to destroy a device + // InputDeviceManager will access us when it needs to create or destroy a device std::atomic_bool m_bFrameTime; // constructor diff --git a/src/devices/usb/XidGamepad.cpp b/src/devices/usb/XidGamepad.cpp index d93c8335f..077490a4c 100644 --- a/src/devices/usb/XidGamepad.cpp +++ b/src/devices/usb/XidGamepad.cpp @@ -36,7 +36,8 @@ #include "XidGamepad.h" #include "USBDevice.h" -#include "Common/Input/InputConfig.h" +#include "Common/Input/InputConfig.h" +#include "OHCI.h" #define LOG_STR_GAMEPAD "Gamepad:" @@ -93,9 +94,10 @@ struct USBXIDState { const XIDDesc* xid_desc; // xid-specific descriptor - bool in_dirty; // indicates a change in the button's state - XIDGamepadReport in_state; // Get_Report struct - XIDGamepadOutputReport out_state; // Ser_Report struct + XIDGamepadReport in_state; // Get_Report struct + XIDGamepadReport in_state_capabilities; // Get_Capabilities struct (in) + XIDGamepadOutputReport out_state; // Set_Report struct + XIDGamepadOutputReport out_state_capabilities; // Get_Capabilities struct (out) }; USBDescIface::USBDescIface() @@ -166,32 +168,35 @@ XIDDesc::XIDDesc() { bLength = 0x10; bDescriptorType = USB_DT_XID; - bcdXid = 1; + bcdXid = 0x100; bType = 1; bSubType = 1; - bMaxInputReportSize = 0x20; - bMaxOutputReportSize = 0x6; - wAlternateProductIds[0] = -1; - wAlternateProductIds[1] = -1; - wAlternateProductIds[2] = -1; - wAlternateProductIds[3] = -1; + bMaxInputReportSize = 20; + bMaxOutputReportSize = 6; + wAlternateProductIds[0] = 0xFFFF; + wAlternateProductIds[1] = 0xFFFF; + wAlternateProductIds[2] = 0xFFFF; + wAlternateProductIds[3] = 0xFFFF; } static const XIDDesc desc_xid_xbox_gamepad; int XidGamepad::Init(int port) { - if (port > 4 || port < 1) { return -1; }; + if (port > 4 || port < 1) { return -1; } XboxDeviceState* dev = ClassInitFn(); int rc = UsbXidClaimPort(dev, port); if (rc != 0) { + m_UsbDev->m_HostController->m_bFrameTime = false; return rc; } m_UsbDev->USB_EpInit(dev); m_UsbDev->USB_DeviceInit(dev); m_UsbDev->USB_DeviceAttach(dev); + m_UsbDev->m_HostController->m_bFrameTime = false; + return 0; } @@ -245,6 +250,10 @@ int XidGamepad::UsbXidClaimPort(XboxDeviceState* dev, int port) EmuWarning("Port requested %d.2 not found (in use?)", port); return -1; } + + while (m_UsbDev->m_HostController->m_bFrameTime) {} + m_UsbDev->m_HostController->m_bFrameTime = true; + m_Port = port; it = m_UsbDev->m_FreePorts.begin() + i; dev->Port = *it; @@ -273,7 +282,18 @@ int XidGamepad::UsbXid_Initfn(XboxDeviceState* dev) m_XidState->intr = m_UsbDev->USB_GetEP(dev, USB_TOKEN_IN, 2); m_XidState->in_state.bLength = sizeof(m_XidState->in_state); + m_XidState->in_state.bReportId = 0; m_XidState->out_state.length = sizeof(m_XidState->out_state); + m_XidState->out_state.report_id = 0; + + std::memset(&m_XidState->in_state_capabilities, 0xFF, sizeof(m_XidState->in_state_capabilities)); + m_XidState->in_state_capabilities.bLength = sizeof(m_XidState->in_state_capabilities); + m_XidState->in_state_capabilities.bReportId = 0; + + std::memset(&m_XidState->out_state_capabilities, 0xFF, sizeof(m_XidState->out_state_capabilities)); + m_XidState->out_state_capabilities.length = sizeof(m_XidState->out_state_capabilities); + m_XidState->out_state_capabilities.report_id = 0; + m_XidState->xid_desc = &desc_xid_xbox_gamepad; return 0; @@ -317,20 +337,35 @@ void XidGamepad::UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, // The wValue field specifies the Report Type in the high byte and the Report ID in the low byte. Set Report ID // to 0 (zero) if Report IDs are not used. 01 = input, 02 = output, 03 = feature, 04-FF = reserved" DbgPrintf("%s GET_REPORT 0x%X\n", LOG_STR_GAMEPAD, value); - if (value == 0x100) { - assert(m_XidState->in_state.bLength <= length); - // m_XidState->in_state.bReportId++; /* FIXME: I'm not sure if bReportId is just a counter */ - SDL2Devices* controller = g_InputDeviceManager->FindDeviceFromXboxPort(m_Port); - if (controller != nullptr) { - controller->ReadButtonState(&m_XidState->in_state.wButtons, m_XidState->in_state.bAnalogButtons, - &m_XidState->in_state.sThumbLX, &m_XidState->in_state.sThumbLY, &m_XidState->in_state.sThumbRX, - &m_XidState->in_state.sThumbRY); + // JayFoxRox's analysis: "This 0x0100 case is for input. + // This is the case where the Xbox wants to read input data from the controller. + // Confirmed with a real Duke controller : + // If the buffer provided by the Xbox is too small, the controller will cut the transfer when the buffer is full (actual_length is patched). + // If the buffer is too large the controller will STALL instead. + // If the buffer has the correct length the full input data is transferred." + if (value == 0x0100) { + if (length <= m_XidState->in_state.bLength) { + SDL2Devices* controller = g_InputDeviceManager->FindDeviceFromXboxPort(m_Port); + if (controller != nullptr) { + controller->ReadButtonState(&m_XidState->in_state.wButtons, m_XidState->in_state.bAnalogButtons, + &m_XidState->in_state.sThumbLX, &m_XidState->in_state.sThumbLY, &m_XidState->in_state.sThumbRX, + &m_XidState->in_state.sThumbRY); + } + else { + // ergo720: this shouldn't really happen. If it does, it either means that m_Port is wrong or there's a bug + // in the InputDeviceManager + p->Status = USB_RET_STALL; + assert(0); + } + std::memcpy(data, &m_XidState->in_state, m_XidState->in_state.bLength); + p->ActualLength = length; + } + else { + p->Status = USB_RET_STALL; } - std::memcpy(data, &m_XidState->in_state, m_XidState->in_state.bLength); - p->ActualLength = m_XidState->in_state.bLength; } else { - assert(0); + p->Status = USB_RET_STALL; } break; } @@ -341,18 +376,28 @@ void XidGamepad::UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, // request is the same as for the Get_Report request, however the data direction is reversed and the Report // Data is sent from host to device." DbgPrintf("%s SET_REPORT 0x%X\n", LOG_STR_GAMEPAD, value); - if (value == 0x200) { - // Read length, then the entire packet - std::memcpy(&m_XidState->out_state, data, sizeof(m_XidState->out_state)); - assert(m_XidState->out_state.length == sizeof(m_XidState->out_state)); - assert(m_XidState->out_state.length <= length); - //FIXME: Check actuator endianess - DbgPrintf("Set rumble power to left: 0x%X and right: 0x%X\n", - m_XidState->out_state.left_actuator_strength, - m_XidState->out_state.right_actuator_strength); - p->ActualLength = m_XidState->out_state.length; + // JayFoxRox's analysis: "The 0x0200 case below is for output. + // This is the case where the Xbox wants to write rumble data to the controller. + // To my knowledge : + // If the buffer provided by the Xbox is too small the transfer will STALL. + // If the buffer is too large the transfer will STALL. + // If the buffer has the correct length the full output data is transferred." + if (value == 0x0200) { + if (length == m_XidState->out_state.length) { + // Read length, then the entire packet + std::memcpy(&m_XidState->out_state, data, sizeof(m_XidState->out_state)); + /* FIXME: This should also be a STALL */ + assert(m_XidState->out_state.length == sizeof(m_XidState->out_state)); + + p->ActualLength = length; + } + else { + p->Status = USB_RET_STALL; + } + UpdateForceFeedback(); } else { + p->Status = USB_RET_STALL; assert(0); } break; @@ -367,6 +412,7 @@ void XidGamepad::UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, p->ActualLength = m_XidState->xid_desc->bLength; } else { + p->Status = USB_RET_STALL; assert(0); } break; @@ -374,9 +420,24 @@ void XidGamepad::UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, case VendorInterfaceRequest | XID_GET_CAPABILITIES: { DbgPrintf("%s XID_GET_CAPABILITIES 0x%x\n", LOG_STR_GAMEPAD, value); - /* FIXME: ! */ - p->Status = USB_RET_STALL; - //assert(false); + if (value == 0x0100) { + if (length > m_XidState->in_state_capabilities.bLength) { + length = m_XidState->in_state_capabilities.bLength; + } + std::memcpy(data, &m_XidState->in_state_capabilities, length); + p->ActualLength = length; + } + else if (value == 0x0200) { + if (length > m_XidState->out_state_capabilities.length) { + length = m_XidState->out_state_capabilities.length; + } + std::memcpy(data, &m_XidState->out_state_capabilities, length); + p->ActualLength = length; + } + else { + p->Status = USB_RET_STALL; + assert(0); + } break; } @@ -411,12 +472,22 @@ void XidGamepad::UsbXid_HandleData(XboxDeviceState* dev, USBPacket* p) switch (p->Pid) { case USB_TOKEN_IN: { if (p->Endpoint->Num == 2) { - if (m_XidState->in_dirty) { - m_UsbDev->USB_PacketCopy(p, &m_XidState->in_state, m_XidState->in_state.bLength); - m_XidState->in_dirty = false; + SDL2Devices* controller = g_InputDeviceManager->FindDeviceFromXboxPort(m_Port); + if (controller != nullptr) { + bool ret; + ret = controller->ReadButtonState(&m_XidState->in_state.wButtons, m_XidState->in_state.bAnalogButtons, + &m_XidState->in_state.sThumbLX, &m_XidState->in_state.sThumbLY, &m_XidState->in_state.sThumbRX, + &m_XidState->in_state.sThumbRY); + if (ret) { + m_UsbDev->USB_PacketCopy(p, &m_XidState->in_state, m_XidState->in_state.bLength); + } + else { + p->Status = USB_RET_NAK; + } } else { - p->Status = USB_RET_NAK; + p->Status = USB_RET_STALL; + assert(0); } } else { @@ -426,7 +497,13 @@ void XidGamepad::UsbXid_HandleData(XboxDeviceState* dev, USBPacket* p) } case USB_TOKEN_OUT: { - p->Status = USB_RET_STALL; + if (p->Endpoint->Num == 2) { + m_UsbDev->USB_PacketCopy(p, &m_XidState->out_state, m_XidState->out_state.length); + UpdateForceFeedback(); + } + else { + assert(0); + } break; } @@ -444,3 +521,16 @@ void XidGamepad::XidCleanUp() m_pPeripheralFuncStruct = nullptr; m_XidState = nullptr; } + +void XidGamepad::UpdateForceFeedback() +{ + // JayFoxRox's remarks: "Xbox -> XID packets were not tested + // The handling out output packets / force feedback was not checked." + // For the above reason we don't implement vibration support for now since the current + // implementation is untested and could potentially contain errors + + /* FIXME: Check actuator endianess */ + DbgPrintf("Set rumble power to left: 0x%X and right: 0x%X\n", + m_XidState->out_state.left_actuator_strength, + m_XidState->out_state.right_actuator_strength); +} diff --git a/src/devices/usb/XidGamepad.h b/src/devices/usb/XidGamepad.h index 35a202c82..bc73cf365 100644 --- a/src/devices/usb/XidGamepad.h +++ b/src/devices/usb/XidGamepad.h @@ -75,7 +75,10 @@ class XidGamepad void UsbXid_HandleReset(); void UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, int request, int value, int index, int length, uint8_t* data); - void UsbXid_HandleData(XboxDeviceState* dev, USBPacket* p); + void UsbXid_HandleData(XboxDeviceState* dev, USBPacket* p); + // this should update the vibration strenght of the real controller this gamepad represents. + // It doesn't do anything at the moment + void UpdateForceFeedback(); }; extern XidGamepad* g_XidControllerObjArray[4]; From 9f6be941f40c5c878e150b7b7f98c8853ef7e82a Mon Sep 17 00:00:00 2001 From: RadWolfie Date: Thu, 19 Jul 2018 13:12:22 -0500 Subject: [PATCH 0065/1000] Restore try/catch from previous pull request. --- src/CxbxKrnl/EmuKrnl.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/CxbxKrnl/EmuKrnl.h b/src/CxbxKrnl/EmuKrnl.h index 0c03fb115..2a32f9466 100644 --- a/src/CxbxKrnl/EmuKrnl.h +++ b/src/CxbxKrnl/EmuKrnl.h @@ -97,18 +97,14 @@ public: m_Pending = false; } -#ifdef USE_SEH __try { -#endif // USE_SEH BOOLEAN(__stdcall *ServiceRoutine)(xboxkrnl::PKINTERRUPT, void*) = (BOOLEAN(__stdcall *)(xboxkrnl::PKINTERRUPT, void*))Interrupt->ServiceRoutine; BOOLEAN result = ServiceRoutine(Interrupt, Interrupt->ServiceContext); -#ifdef USE_SEH } __except (EmuException(GetExceptionInformation())) { EmuWarning("Problem with ExceptionFilter!"); } -#endif // USE_SEH } private: bool m_Asserted = false; From 87e18339413f3a539ae62c816657f5329467a7ff Mon Sep 17 00:00:00 2001 From: ergo720 Date: Fri, 20 Jul 2018 18:29:58 +0200 Subject: [PATCH 0066/1000] Allow cxbxr to build with LLE USB --- build/win32/Cxbx.vcxproj | 13 +-- build/win32/Cxbx.vcxproj.filters | 13 ++- src/Common/CxbxCommon.cpp | 5 +- src/Common/CxbxCommon.h | 74 ++++++++++++ src/Common/CxbxDebugger.cpp | 2 +- src/Common/EmuEEPROM.cpp | 2 +- src/Common/Error.h | 2 +- src/Common/Input/InputConfig.cpp | 11 ++ src/Common/Input/InputConfig.h | 7 +- src/Common/Logging.h | 2 +- src/Common/Win32/XBAudio.h | 2 +- src/Common/Win32/XBController.h | 2 +- src/Common/Win32/XBVideo.h | 2 +- src/{CxbxCommon.h => Cxbx.h} | 35 ------ src/Cxbx/CxbxXbdm.cpp | 2 +- src/CxbxKrnl/CxbxKrnl.h | 2 +- src/CxbxKrnl/DbgConsole.h | 2 +- src/CxbxKrnl/EmuD3D8/PixelShader.h | 2 +- src/CxbxKrnl/EmuD3D8/VertexBuffer.h | 2 +- src/CxbxKrnl/EmuD3D8/VertexShader.h | 2 +- src/CxbxKrnl/EmuShared.h | 2 +- src/CxbxKrnl/EmuX86.h | 2 +- src/CxbxKrnl/KernelThunk.cpp | 2 +- src/CxbxKrnl/ResourceTracker.h | 2 +- src/CxbxKrnl/Timer.cpp | 4 +- src/devices/Xbox.cpp | 1 + src/devices/usb/Hub.cpp | 118 ++++++++++--------- src/devices/usb/OHCI.cpp | 11 +- src/devices/usb/USBDevice.cpp | 28 +++-- src/devices/usb/USBDevice.h | 6 +- src/devices/usb/UsbCommon.h | 127 ++++++++++----------- src/devices/usb/XidGamepad.cpp | 168 ++++++++++++++-------------- src/devices/video/nv2a.h | 2 +- 33 files changed, 368 insertions(+), 289 deletions(-) create mode 100644 src/Common/CxbxCommon.h rename src/{CxbxCommon.h => Cxbx.h} (80%) diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index e5fddf549..2f63af725 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -367,6 +367,7 @@ + @@ -383,7 +384,7 @@ - + @@ -744,16 +745,6 @@ - - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) diff --git a/build/win32/Cxbx.vcxproj.filters b/build/win32/Cxbx.vcxproj.filters index 1030ad7c7..87dbdff57 100644 --- a/build/win32/Cxbx.vcxproj.filters +++ b/build/win32/Cxbx.vcxproj.filters @@ -293,7 +293,6 @@ Hardware\Usb - Hardware\Usb @@ -315,6 +314,9 @@ Shared\Input + + Cross Platform + @@ -599,9 +601,6 @@ Hardware\Usb - - Shared - Hardware\Usb @@ -617,6 +616,12 @@ Shared\Input + + Shared + + + Cross Platform + diff --git a/src/Common/CxbxCommon.cpp b/src/Common/CxbxCommon.cpp index cb85352ba..1bbc5aceb 100644 --- a/src/Common/CxbxCommon.cpp +++ b/src/Common/CxbxCommon.cpp @@ -9,7 +9,7 @@ // * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, // * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, // * -// * Cxbx->Common->Cxbx.cpp +// * Cxbx->Common->CxbxCommon.cpp // * // * This file is part of the Cxbx project. // * @@ -36,7 +36,8 @@ // The intent of this file is to add general functions which are not kernel specific (for those CxbxKrnl.h should be used instead) -#include "CxbxKrnl\CxbxKrnl.h" +#include "CxbxCommon.h" +#include "CxbxKrnl\CxbxKrnl.h" #ifndef MIN #define MIN(a, b) (((a) < (b)) ? (a) : (b)) diff --git a/src/Common/CxbxCommon.h b/src/Common/CxbxCommon.h new file mode 100644 index 000000000..5a8bf3e0e --- /dev/null +++ b/src/Common/CxbxCommon.h @@ -0,0 +1,74 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * Cxbx->Common->CxbxCommon.h +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 ergo720 +// * +// * All rights reserved +// * +// ****************************************************************** + +#ifndef CXBX_COMMON_H +#define CXBX_COMMON_H + +#include "Cxbx.h" +#include +#include + +/* This is a linux struct for vectored I/O. See readv() and writev() */ +struct IoVec +{ + void* Iov_Base; // Starting address + size_t Iov_Len; // Number of bytes to transfer +}; + +struct IOVector +{ + IoVec* IoVecStruct; + int IoVecNumber; // number of I/O buffers supplied + int AllocNumber; // number of IoVec structs currently allocated + size_t Size; // total size of all I/O buffers supplied +}; + +uint64_t Muldiv64(uint64_t a, uint32_t b, uint32_t c); + +void IoVecReset(IOVector* qiov); +void IoVecAdd(IOVector* qiov, void* base, size_t len); +size_t IoVecTobuffer(const IoVec* iov, const unsigned int iov_cnt, size_t offset, void *buf, size_t bytes); +size_t IoVecFromBuffer(const IoVec* iov, unsigned int iov_cnt, size_t offset, void* buf, size_t bytes); + +void WriteDwords(xbaddr Paddr, uint32_t* Buffer, int Number); +void GetDwords(xbaddr Paddr, uint32_t* Buffer, int Number); +void GetWords(xbaddr Paddr, uint16_t* Buffer, int Number); +void WriteWords(xbaddr Paddr, uint16_t* Buffer, int Number); + +#define GET_WORD_LOW(value) (uint8_t)((value) & 0xFF) +#define GET_WORD_HIGH(value) (uint8_t)(((value) >> 8) & 0xFF) + +#endif diff --git a/src/Common/CxbxDebugger.cpp b/src/Common/CxbxDebugger.cpp index b0f940156..76673a685 100644 --- a/src/Common/CxbxDebugger.cpp +++ b/src/Common/CxbxDebugger.cpp @@ -32,7 +32,7 @@ // * // ****************************************************************** -#include "CxbxCommon.h" +#include "Cxbx.h" #include "CxbxKrnl/EmuShared.h" #include "CxbxDebugger.h" diff --git a/src/Common/EmuEEPROM.cpp b/src/Common/EmuEEPROM.cpp index 1a0f78c29..d12b537cf 100644 --- a/src/Common/EmuEEPROM.cpp +++ b/src/Common/EmuEEPROM.cpp @@ -44,7 +44,7 @@ namespace xboxkrnl #include // For printf #include // For HANDLE, CreateFile, CreateFileMapping, MapViewOfFile -#include "CxbxCommon.h" // For DbgPrintf +#include "Cxbx.h" // For DbgPrintf #include "EmuEEPROM.h" // For EEPROMInfo, EEPROMInfos #include "..\CxbxKrnl\Emu.h" // For EmuWarning #include "..\..\src\devices\LED.h" // For SetLEDSequence diff --git a/src/Common/Error.h b/src/Common/Error.h index 07b071700..428015ec2 100644 --- a/src/Common/Error.h +++ b/src/Common/Error.h @@ -34,7 +34,7 @@ #ifndef ERROR_H #define ERROR_H -#include "CxbxCommon.h" +#include "Cxbx.h" #include diff --git a/src/Common/Input/InputConfig.cpp b/src/Common/Input/InputConfig.cpp index 1c9843e6b..4e2deb882 100644 --- a/src/Common/Input/InputConfig.cpp +++ b/src/Common/Input/InputConfig.cpp @@ -34,7 +34,16 @@ // * // ****************************************************************** +#define _XBOXKRNL_DEFEXTRN_ + +// prevent name collisions +namespace xboxkrnl +{ + #include // For PKINTERRUPT, etc. +}; + #include "InputConfig.h" +#include "SDL2_Device.h" #include "..\devices\usb\XidGamepad.h" #include "..\..\CxbxKrnl\EmuKrnl.h" // For EmuWarning #include @@ -324,6 +333,7 @@ void InputDeviceManager::InputThread(InputDeviceManager* pVoid) } default: + break; } } } @@ -377,6 +387,7 @@ void InputDeviceManager::UpdateButtonState(SDL_JoystickID id, uint8_t button, ui break; } default: + break; } } diff --git a/src/Common/Input/InputConfig.h b/src/Common/Input/InputConfig.h index f04cbafff..1d6a28e1d 100644 --- a/src/Common/Input/InputConfig.h +++ b/src/Common/Input/InputConfig.h @@ -70,8 +70,6 @@ #define BUTTON_MASK(button) (1 << ((button) - GAMEPAD_DPAD_UP)) -#include "SDL2_Device.h" - /* enum indicating the device type to attach to the virtual xbox */ typedef enum { @@ -83,7 +81,10 @@ typedef enum { MEMORY_UNIT, IR_DONGLE, STEEL_BATTALION_CONTROLLER, -}; +} +XBOX_INPUT_DEVICE; + +class SDL2Devices; // forward declare class InputDeviceManager diff --git a/src/Common/Logging.h b/src/Common/Logging.h index def3b4a51..5f5e7bff3 100644 --- a/src/Common/Logging.h +++ b/src/Common/Logging.h @@ -40,7 +40,7 @@ #include // For std::stringstream #include // For std::cout #include // For std::setw -#include "CxbxCommon.h" // For g_bPrintfOn +#include "Cxbx.h" // For g_bPrintfOn // diff --git a/src/Common/Win32/XBAudio.h b/src/Common/Win32/XBAudio.h index 850d8d892..d4d28436c 100644 --- a/src/Common/Win32/XBAudio.h +++ b/src/Common/Win32/XBAudio.h @@ -34,7 +34,7 @@ #ifndef XBAUDIO_H #define XBAUDIO_H -#include "CxbxCommon.h" +#include "Cxbx.h" #include "Common/Error.h" #include "Mutex.h" diff --git a/src/Common/Win32/XBController.h b/src/Common/Win32/XBController.h index 742392abe..1758effd4 100644 --- a/src/Common/Win32/XBController.h +++ b/src/Common/Win32/XBController.h @@ -34,7 +34,7 @@ #ifndef XBCONTROLLER_H #define XBCONTROLLER_H -#include "CxbxCommon.h" +#include "Cxbx.h" #include "Common/Error.h" #include "Mutex.h" diff --git a/src/Common/Win32/XBVideo.h b/src/Common/Win32/XBVideo.h index 834065249..43630e44d 100644 --- a/src/Common/Win32/XBVideo.h +++ b/src/Common/Win32/XBVideo.h @@ -34,7 +34,7 @@ #ifndef XBVIDEO_H #define XBVIDEO_H -#include "CxbxCommon.h" +#include "Cxbx.h" #include "Common/Error.h" #include "Mutex.h" diff --git a/src/CxbxCommon.h b/src/Cxbx.h similarity index 80% rename from src/CxbxCommon.h rename to src/Cxbx.h index 1a1bd25cc..56b9ad612 100644 --- a/src/CxbxCommon.h +++ b/src/Cxbx.h @@ -34,10 +34,6 @@ #ifndef CXBX_H #define CXBX_H -#include -#include -#include - #define FUNC_EXPORTS __pragma(comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)) /*! \name primitive typedefs */ @@ -161,35 +157,4 @@ extern volatile bool g_bPrintfOn; #define CxbxSetThreadName(Name) #endif - -/* This is a linux struct for vectored I/O. See readv() and writev() */ -struct IoVec -{ - void* Iov_Base; // Starting address - size_t Iov_Len; // Number of bytes to transfer -}; - -struct IOVector -{ - IoVec* IoVecStruct; - int IoVecNumber; // number of I/O buffers supplied - int AllocNumber; // number of IoVec structs currently allocated - size_t Size; // total size of all I/O buffers supplied -}; - -inline uint64_t Muldiv64(uint64_t a, uint32_t b, uint32_t c); - -void IoVecReset(IOVector* qiov); -void IoVecAdd(IOVector* qiov, void* base, size_t len); -size_t IoVecTobuffer(const IoVec* iov, const unsigned int iov_cnt, size_t offset, void *buf, size_t bytes); -size_t IoVecFromBuffer(const IoVec* iov, unsigned int iov_cnt, size_t offset, void* buf, size_t bytes); - -void WriteDwords(xbaddr Paddr, uint32_t* Buffer, int Number); -void GetDwords(xbaddr Paddr, uint32_t* Buffer, int Number); -void GetWords(xbaddr Paddr, uint16_t* Buffer, int Number); -void WriteWords(xbaddr Paddr, uint16_t* Buffer, int Number); - -#define GET_WORD_LOW(value) (uint8_t)((value) & 0xFF) -#define GET_WORD_HIGH(value) (uint8_t)(((value) >> 8) & 0xFF) - #endif diff --git a/src/Cxbx/CxbxXbdm.cpp b/src/Cxbx/CxbxXbdm.cpp index e8804dfc9..c25878876 100644 --- a/src/Cxbx/CxbxXbdm.cpp +++ b/src/Cxbx/CxbxXbdm.cpp @@ -42,7 +42,7 @@ #include #include -#include "CxbxCommon.h" +#include "Cxbx.h" #include "Logging.h" namespace xbdm { diff --git a/src/CxbxKrnl/CxbxKrnl.h b/src/CxbxKrnl/CxbxKrnl.h index e3542e86d..9bf123098 100644 --- a/src/CxbxKrnl/CxbxKrnl.h +++ b/src/CxbxKrnl/CxbxKrnl.h @@ -34,7 +34,7 @@ #ifndef CXBXKRNL_H #define CXBXKRNL_H -#include "CxbxCommon.h" +#include "Cxbx.h" #include "Common/Xbe.h" #undef FIELD_OFFSET // prevent macro redefinition warnings diff --git a/src/CxbxKrnl/DbgConsole.h b/src/CxbxKrnl/DbgConsole.h index 589f2ca70..90e0379f8 100644 --- a/src/CxbxKrnl/DbgConsole.h +++ b/src/CxbxKrnl/DbgConsole.h @@ -34,7 +34,7 @@ #ifndef DBGCONSOLE_H #define DBGCONSOLE_H -#include "CxbxCommon.h" +#include "Cxbx.h" // debug console input class DbgConsole diff --git a/src/CxbxKrnl/EmuD3D8/PixelShader.h b/src/CxbxKrnl/EmuD3D8/PixelShader.h index 9d7364eda..28a80a604 100644 --- a/src/CxbxKrnl/EmuD3D8/PixelShader.h +++ b/src/CxbxKrnl/EmuD3D8/PixelShader.h @@ -36,7 +36,7 @@ #pragma once -#include "CxbxCommon.h" +#include "Cxbx.h" // dump pixel shader definition to file void DumpPixelShaderDefToFile( X_D3DPIXELSHADERDEF* pPSDef, const char* pszCode ); diff --git a/src/CxbxKrnl/EmuD3D8/VertexBuffer.h b/src/CxbxKrnl/EmuD3D8/VertexBuffer.h index 38bb60ad2..97c725af3 100755 --- a/src/CxbxKrnl/EmuD3D8/VertexBuffer.h +++ b/src/CxbxKrnl/EmuD3D8/VertexBuffer.h @@ -34,7 +34,7 @@ #ifndef VERTEXBUFFER_H #define VERTEXBUFFER_H -#include "CxbxCommon.h" +#include "Cxbx.h" //#include // Conflict with io.h #define MAX_NBR_STREAMS 16 diff --git a/src/CxbxKrnl/EmuD3D8/VertexShader.h b/src/CxbxKrnl/EmuD3D8/VertexShader.h index 525192b37..fff149950 100644 --- a/src/CxbxKrnl/EmuD3D8/VertexShader.h +++ b/src/CxbxKrnl/EmuD3D8/VertexShader.h @@ -34,7 +34,7 @@ #ifndef VERTEXSHADER_H #define VERTEXSHADER_H -#include "CxbxCommon.h" +#include "Cxbx.h" // nv2a microcode header typedef struct diff --git a/src/CxbxKrnl/EmuShared.h b/src/CxbxKrnl/EmuShared.h index 851d73fc2..3c78f8b40 100644 --- a/src/CxbxKrnl/EmuShared.h +++ b/src/CxbxKrnl/EmuShared.h @@ -34,7 +34,7 @@ #ifndef EMUSHARED_H #define EMUSHARED_H -#include "CxbxCommon.h" +#include "Cxbx.h" #include "Common/Win32/XBController.h" #include "Common/Win32/XBVideo.h" #include "Common/Win32/XBAudio.h" diff --git a/src/CxbxKrnl/EmuX86.h b/src/CxbxKrnl/EmuX86.h index f739a873e..6b2423c5a 100644 --- a/src/CxbxKrnl/EmuX86.h +++ b/src/CxbxKrnl/EmuX86.h @@ -34,7 +34,7 @@ #ifndef EMUX86_H #define EMUX86_H -#include "CxbxCommon.h" +#include "Cxbx.h" #include #include diff --git a/src/CxbxKrnl/KernelThunk.cpp b/src/CxbxKrnl/KernelThunk.cpp index 9c836519a..644003f92 100644 --- a/src/CxbxKrnl/KernelThunk.cpp +++ b/src/CxbxKrnl/KernelThunk.cpp @@ -41,7 +41,7 @@ namespace xboxkrnl #include }; -#include "CxbxCommon.h" // For CxbxKrnl_KernelThunkTable +#include "Cxbx.h" // For CxbxKrnl_KernelThunkTable #include "CxbxKrnl.h" // For UINT #define FUNC(f) f diff --git a/src/CxbxKrnl/ResourceTracker.h b/src/CxbxKrnl/ResourceTracker.h index 887b48830..799bfd833 100644 --- a/src/CxbxKrnl/ResourceTracker.h +++ b/src/CxbxKrnl/ResourceTracker.h @@ -34,7 +34,7 @@ #ifndef RESOURCETRACKER_H #define RESOURCETRACKER_H -#include "CxbxCommon.h" +#include "Cxbx.h" #include "Common/Win32/Mutex.h" extern class ResourceTracker : public Mutex diff --git a/src/CxbxKrnl/Timer.cpp b/src/CxbxKrnl/Timer.cpp index 70d23d4e4..782e5acdf 100644 --- a/src/CxbxKrnl/Timer.cpp +++ b/src/CxbxKrnl/Timer.cpp @@ -72,7 +72,7 @@ inline uint64_t GetTime_NS(TimerObject* Timer) clock_gettime(CLOCK_MONOTONIC_RAW, &ts); uint64_t Ret = Muldiv64(ts.tv_sec, SCALE_S, 1) + ts.tv_nsec; #else -#error +#error "Unsupported OS" #endif return Timer->Type == CLOCK_REALTIME ? Ret : Ret / Timer->SlowdownFactor; } @@ -162,6 +162,6 @@ void Timer_Init() #elif __linux__ ClockFrequency = 0; #else -#error +#error "Unsupported OS" #endif } diff --git a/src/devices/Xbox.cpp b/src/devices/Xbox.cpp index 302afff58..558db59c4 100644 --- a/src/devices/Xbox.cpp +++ b/src/devices/Xbox.cpp @@ -35,6 +35,7 @@ // ****************************************************************** #include "Xbox.h" // For HardwareModel +#include "Xbe.h" // Without this HLEIntercept complains about some undefined xbe variables #include "..\CxbxKrnl\HLEIntercept.h" PCIBus* g_PCIBus; diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index f985c3053..f13ceb72c 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -34,8 +34,17 @@ // * // ****************************************************************** +#define _XBOXKRNL_DEFEXTRN_ + +// prevent name collisions +namespace xboxkrnl +{ + #include // For PKINTERRUPT, etc. +}; + #include "OHCI.h" #include "Hub.h" +#include "CxbxKrnl\EmuKrnl.h" // For EmuWarning #define LOG_STR_HUB "Hub" @@ -96,62 +105,61 @@ struct USBHubState { USBHubPort ports[NUM_PORTS]; // downstream ports of the hub }; -USBDescIface::USBDescIface() -{ - std::memset(this, 0, sizeof(USBDescIface)); - eps = new USBDescEndpoint(); - bInterfaceNumber = 0; - bNumEndpoints = 1; - bInterfaceClass = USB_CLASS_HUB; - eps->bEndpointAddress = USB_DIR_IN | 0x01; - eps->bmAttributes = USB_ENDPOINT_XFER_INT; - eps->wMaxPacketSize = 1 + (NUM_PORTS + 7) / 8; - eps->bInterval = 0xFF; -} +static const USBDescEndpoint desc_endp_hub = { + USB_DIR_IN | 0x01, // bEndpointAddress; + USB_ENDPOINT_XFER_INT, // bmAttributes; + 1 + (NUM_PORTS + 7) / 8, // wMaxPacketSize; + 0xFF, // bInterval; + 0, // bRefresh; + 0, // bSynchAddress + 0, // is_audio + nullptr // extra +}; + +static const USBDescIface desc_iface_hub = { + 0, // bInterfaceNumber; + 0, // bAlternateSetting; + 1, // bNumEndpoints; + USB_CLASS_HUB, // bInterfaceClass; + 0, // bInterfaceSubClass + 0, // bInterfaceProtocol + 0, // iInterface + 0, // ndesc + nullptr, // descs + &desc_endp_hub +}; -USBDescIface::~USBDescIface() -{ - delete eps; -} - -static const USBDescIface desc_iface_hub; - -USBDescDevice::USBDescDevice() -{ - std::memset(this, 0, sizeof(USBDescDevice)); - USBDescConfig* pUSBDescConfig = new USBDescConfig(); - bcdUSB = 0x0110; - bDeviceClass = USB_CLASS_HUB; - bMaxPacketSize0 = 8; - bNumConfigurations = 1; - pUSBDescConfig->bNumInterfaces = 1; - pUSBDescConfig->bConfigurationValue = 1; - pUSBDescConfig->bmAttributes = 0xE0; - pUSBDescConfig->nif = 1; - pUSBDescConfig->ifs = &desc_iface_hub; - confs = pUSBDescConfig; -} - -USBDescDevice::~USBDescDevice() -{ - delete confs; -} - -static const USBDescDevice desc_device_hub; - -USBDesc::USBDesc() -{ - std::memset(this, 0, sizeof(USBDesc)); - id.idVendor = 0x0409; - id.idProduct = 0x55AA; - id.bcdDevice = 0x0101; - id.iManufacturer = STR_MANUFACTURER; - id.iProduct = STR_PRODUCT; - id.iSerialNumber = STR_SERIALNUMBER; - full = &desc_device_hub; -} - -static const USBDesc desc_hub; +static const USBDescConfig desc_config_hub = { + 1, // bNumInterfaces + 1, // bConfigurationValue + 0, // iConfiguration + 0xE0, // bmAttributes + 0, // bMaxPower + 1, // nif + &desc_iface_hub +}; + +static const USBDescDevice desc_device_hub = { + 0x0110, // bcdUSB + USB_CLASS_HUB, // bDeviceClass + 0, // bDeviceSubClass + 0, // bDeviceProtocol + 8, // bMaxPacketSize0 + 1, // bNumConfigurations + &desc_config_hub +}; + +static const USBDesc desc_hub = { + { + 0x0409, // idVendor + 0x55AA, // idProduct + 0x0101, // bcdDevice + STR_MANUFACTURER, // iManufacturer + STR_PRODUCT, // iProduct + STR_SERIALNUMBER // iSerialNumber + }, + &desc_device_hub +}; // Class-specific hub descriptor. Remember to update DeviceRemovable and PortPwrCtrlMask if you change NUM_PORTS since their values depend on // the number of downstream ports available on the hub! Also note that this descriptor cannot be put in the descs member of the interface descriptor diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index 386609b37..26d293849 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -33,9 +33,18 @@ // * All rights reserved // * // ****************************************************************** + +#define _XBOXKRNL_DEFEXTRN_ + +/* prevent name collisions */ +namespace xboxkrnl +{ + #include +}; #include "OHCI.h" -#include "CxbxKrnl\EmuKrnl.h" // For HalSystemInterrupt +#include "CxbxKrnl\EmuKrnl.h" // For HalSystemInterrupt +#include "CxbxCommon.h" #define LOG_STR_OHCI "Ohci" diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index af20dc099..0cbd8fd6b 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -33,10 +33,19 @@ // * All rights reserved // * // ****************************************************************** + +#define _XBOXKRNL_DEFEXTRN_ + +// prevent name collisions +namespace xboxkrnl +{ + #include // For PKINTERRUPT, etc. +}; #include "USBDevice.h" #include "OHCI.h" -#include "CxbxKrnl\EmuKrnl.h" // For EmuWarning +#include "CxbxKrnl\EmuKrnl.h" // For EmuWarning +#include "CxbxCommon.h" #define LOG_STR_USB "Usb" @@ -628,7 +637,7 @@ void USBDevice::USB_EPsetType(XboxDeviceState* dev, int pid, int ep, uint8_t typ uep->Type = type; } -uint8_t USBDevice::USB_EPsetIfnum(XboxDeviceState* dev, int pid, int ep, uint8_t ifnum) +void USBDevice::USB_EPsetIfnum(XboxDeviceState* dev, int pid, int ep, uint8_t ifnum) { USBEndpoint* uep = USB_GetEP(dev, pid, ep); uep->IfNum = ifnum; @@ -1031,7 +1040,7 @@ int USBDevice::USBDesc_HandleStandardGetDescriptor(XboxDeviceState* dev, USBPack break; } - // Dropped from XQEMU descriptor types USB_DT_DEVICE_QUALIFIER (6), USB_DT_OTHER_SPEED_CONFIG (7) -> usb 2.0 only and reserved on usb 3.0, + // Dropped from XQEMU descriptor types USB_DT_DEVICE_QUALIFIER (6), USB_DT_OTHER_SPEED_CONFIG (7) -> usb 2.0 only and reserved in usb 3.0, // USB_DT_BOS (15) and USB_DT_DEBUG (10) -> usb 3.0 only default: @@ -1168,9 +1177,9 @@ int USBDevice::USB_ReadInterfaceDesc(const USBDescIface* iface, int flags, uint8 return pos; } -int USBDevice::USB_ReadOtherDesc(const USBDescOther* desc, uint8_t* dest, size_t len) +size_t USBDevice::USB_ReadOtherDesc(const USBDescOther* desc, uint8_t* dest, size_t len) { - int bLength = desc->length ? desc->length : desc->data[0]; + size_t bLength = desc->length ? desc->length : desc->data[0]; if (len < bLength) { return -1; @@ -1182,15 +1191,15 @@ int USBDevice::USB_ReadOtherDesc(const USBDescOther* desc, uint8_t* dest, size_t int USBDevice::USB_ReadEndpointDesc(const USBDescEndpoint* ep, int flags, uint8_t* dest, size_t len) { - uint8_t bLength = ep->is_audio ? 0x09 : 0x07; // an endpoint descriptor is 7 bytes large (or 9 if it is an audio device) - uint8_t extralen = ep->extra ? ep->extra[0] : 0; + size_t bLength = ep->is_audio ? 0x09 : 0x07; // an endpoint descriptor is 7 bytes large (or 9 if it is an audio device) + size_t extralen = ep->extra ? ep->extra[0] : 0; USBDescriptor* d = reinterpret_cast(dest); if (len < bLength + extralen) { return -1; } - d->bLength = bLength; + d->bLength = static_cast(bLength); d->bDescriptorType = USB_DT_ENDPOINT; d->u.endpoint.bEndpointAddress = ep->bEndpointAddress; @@ -1214,7 +1223,8 @@ int USBDevice::USB_ReadEndpointDesc(const USBDescEndpoint* ep, int flags, uint8_ int USBDevice::USB_ReadStringDesc(XboxDeviceState* dev, int index, uint8_t* dest, size_t len) { - uint8_t bLength, pos, i; + size_t bLength, i; + unsigned int pos; const char* str; if (len < 4) { diff --git a/src/devices/usb/USBDevice.h b/src/devices/usb/USBDevice.h index f88cbdda3..401b2cb8f 100644 --- a/src/devices/usb/USBDevice.h +++ b/src/devices/usb/USBDevice.h @@ -57,7 +57,7 @@ class USBDevice : public PCIDevice { void Init(unsigned int address); void Reset() {} - uint32_t IORead(int barIndex, uint32_t port, unsigned size) {} + uint32_t IORead(int barIndex, uint32_t port, unsigned size) { return 0; } void IOWrite(int barIndex, uint32_t port, uint32_t value, unsigned size) {} uint32_t MMIORead(int barIndex, uint32_t addr, unsigned size); void MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned size); @@ -146,7 +146,7 @@ class USBDevice : public PCIDevice { // set the type of the endpoint void USB_EPsetType(XboxDeviceState* dev, int pid, int ep, uint8_t type); // set the interface number of the endpoint - uint8_t USB_EPsetIfnum(XboxDeviceState* dev, int pid, int ep, uint8_t ifnum); + void USB_EPsetIfnum(XboxDeviceState* dev, int pid, int ep, uint8_t ifnum); // set the maximum packet size parameter of the endpoint void USB_EPsetMaxPacketSize(XboxDeviceState* dev, int pid, int ep, uint16_t raw); // assign port numbers (also for hubs) @@ -184,7 +184,7 @@ class USBDevice : public PCIDevice { // return the binary rapresentation of interface descriptors int USB_ReadInterfaceDesc(const USBDescIface* iface, int flags, uint8_t* dest, size_t len); // return the binary rapresentation of class-specific descriptors - int USB_ReadOtherDesc(const USBDescOther* desc, uint8_t* dest, size_t len); + size_t USB_ReadOtherDesc(const USBDescOther* desc, uint8_t* dest, size_t len); // return the binary rapresentation of endpoint descriptors int USB_ReadEndpointDesc(const USBDescEndpoint* ep, int flags, uint8_t* dest, size_t len); // return the binary rapresentation of string descriptors diff --git a/src/devices/usb/UsbCommon.h b/src/devices/usb/UsbCommon.h index 33e2837a3..3efe6135e 100644 --- a/src/devices/usb/UsbCommon.h +++ b/src/devices/usb/UsbCommon.h @@ -39,7 +39,6 @@ #include "CxbxCommon.h" #include "..\devices\video\queue.h" -#include "..\CxbxKrnl\EmuKrnl.h" // For EmuWarning #include #define USB_MAX_ENDPOINTS 15 @@ -157,10 +156,13 @@ typedef enum { STR_MANUFACTURER = 1, STR_PRODUCT, STR_SERIALNUMBER, -}; +} +STRING_DESC_INDEX; +// Forward declarations struct USBPacket; struct XboxDeviceState; +struct USBPortOps; /* String descriptor */ struct USBDescString { @@ -203,9 +205,7 @@ struct USBDescIface { uint8_t ndesc; // number of device-specific class descriptors (if any) USBDescOther* descs; // pointer to the extra class descriptors - USBDescEndpoint* eps; // endpoints supported by this interface - USBDescIface(); - ~USBDescIface(); + const USBDescEndpoint* eps; // endpoints supported by this interface }; /* @@ -234,8 +234,6 @@ struct USBDescDevice { uint8_t bMaxPacketSize0; // maximum packet size for endpoint zero (only 8, 16, 32, or 64 are valid) uint8_t bNumConfigurations; // number of possible configurations const USBDescConfig* confs; // configurations supported by this device - USBDescDevice(); - ~USBDescDevice(); }; /* Device descriptor part 2 */ @@ -252,7 +250,6 @@ struct USBDescID { struct USBDesc { USBDescID id; // id-specific info of the device descriptor const USBDescDevice* full; // remaining fields of the device descriptor - USBDesc(); }; #pragma pack(1) @@ -326,6 +323,63 @@ struct USBEndpoint { QTAILQ_HEAD(, USBPacket) Queue; // queue of packets to this endpoint }; +/* Struct describing the status of a usb port */ +struct USBPort { + XboxDeviceState* Dev; // usb device (if present) + USBPortOps* Operations; // functions to call when a port event happens + int SpeedMask; // usb speeds supported + std::string Path; // the number of the port + 1, used to create a serial number for this device + int PortIndex; // internal port index +}; + +/* Struct which stores general functions/variables regarding the peripheral */ +struct USBDeviceClass { + std::function init; + + // Walk (enabled) downstream ports, check for a matching device. + // Only hubs implement this. + std::function find_device; + + // Called when a packet is canceled. + std::function cancel_packet; + + // Called when device is destroyed. + std::function handle_destroy; + + // Attach the device + std::function handle_attach; + + // Reset the device + std::function handle_reset; + + // Process control request. + // Called from handle_packet(). + // Status gets stored in p->status, and if p->status == USB_RET_SUCCESS + // then the number of bytes transferred is stored in p->actual_length + std::function handle_control; + + // Process data transfers (both BULK and ISOC). + // Called from handle_packet(). + // Status gets stored in p->status, and if p->status == USB_RET_SUCCESS + // then the number of bytes transferred is stored in p->actual_length + std::function handle_data; + + std::function set_interface; + + // Called when the hcd is done queuing packets for an endpoint, only + // necessary for devices which can return USB_RET_ADD_TO_QUEUE. + std::function flush_ep_queue; + + // Called by the hcd to let the device know the queue for an endpoint + // has been unlinked / stopped. Optional may be NULL. + std::function ep_stopped; + + const char* product_desc; // friendly name of the device + const USBDesc* usb_desc; // device descriptor +}; + /* definition of an Xbox usb device */ struct XboxDeviceState { USBPort* Port; // usb port struct of this device @@ -402,61 +456,4 @@ struct USBPortOps { std::function complete; }; -/* Struct describing the status of a usb port */ -struct USBPort { - XboxDeviceState* Dev; // usb device (if present) - USBPortOps* Operations; // functions to call when a port event happens - int SpeedMask; // usb speeds supported - std::string Path; // the number of the port + 1, used to create a serial number for this device - int PortIndex; // internal port index -}; - -/* Struct which stores general functions/variables regarding the peripheral */ -struct USBDeviceClass { - std::function init; - - // Walk (enabled) downstream ports, check for a matching device. - // Only hubs implement this. - std::function find_device; - - // Called when a packet is canceled. - std::function cancel_packet; - - // Called when device is destroyed. - std::function handle_destroy; - - // Attach the device - std::function handle_attach; - - // Reset the device - std::function handle_reset; - - // Process control request. - // Called from handle_packet(). - // Status gets stored in p->status, and if p->status == USB_RET_SUCCESS - // then the number of bytes transferred is stored in p->actual_length - std::function handle_control; - - // Process data transfers (both BULK and ISOC). - // Called from handle_packet(). - // Status gets stored in p->status, and if p->status == USB_RET_SUCCESS - // then the number of bytes transferred is stored in p->actual_length - std::function handle_data; - - std::function set_interface; - - // Called when the hcd is done queuing packets for an endpoint, only - // necessary for devices which can return USB_RET_ADD_TO_QUEUE. - std::function flush_ep_queue; - - // Called by the hcd to let the device know the queue for an endpoint - // has been unlinked / stopped. Optional may be NULL. - std::function ep_stopped; - - const char* product_desc; // friendly name of the device - const USBDesc* usb_desc; // device descriptor -}; - #endif diff --git a/src/devices/usb/XidGamepad.cpp b/src/devices/usb/XidGamepad.cpp index 077490a4c..66d260b56 100644 --- a/src/devices/usb/XidGamepad.cpp +++ b/src/devices/usb/XidGamepad.cpp @@ -33,11 +33,21 @@ // * All rights reserved // * // ****************************************************************** + +#define _XBOXKRNL_DEFEXTRN_ + +// prevent name collisions +namespace xboxkrnl +{ + #include // For PKINTERRUPT, etc. +}; #include "XidGamepad.h" #include "USBDevice.h" #include "Common/Input/InputConfig.h" -#include "OHCI.h" +#include "Common/Input/SDL2_Device.h" +#include "OHCI.h" +#include "CxbxKrnl\EmuKrnl.h" // For EmuWarning #define LOG_STR_GAMEPAD "Gamepad:" @@ -63,7 +73,6 @@ struct XIDDesc { uint8_t bMaxInputReportSize; uint8_t bMaxOutputReportSize; uint16_t wAlternateProductIds[4]; - XIDDesc(); }; /* Struct used by the Get_Report request -> button's state */ @@ -98,88 +107,86 @@ struct USBXIDState { XIDGamepadReport in_state_capabilities; // Get_Capabilities struct (in) XIDGamepadOutputReport out_state; // Set_Report struct XIDGamepadOutputReport out_state_capabilities; // Get_Capabilities struct (out) +}; + +static const USBDescEndpoint desc_endp_xbox_gamepad[2] = { + { + USB_DIR_IN | 0x02, // bEndpointAddress; + USB_ENDPOINT_XFER_INT, // bmAttributes; + 0x20, // wMaxPacketSize; + 4, // bInterval; + 0, // bRefresh; + 0, // bSynchAddress + 0, // is_audio + nullptr // extra + }, + { + USB_DIR_OUT | 0x02, + USB_ENDPOINT_XFER_INT, + 0x20, + 4, + 0, + 0, + 0, + nullptr + } }; -USBDescIface::USBDescIface() -{ - std::memset(this, 0, sizeof(USBDescIface)); - eps = new USBDescEndpoint[2](); - bInterfaceNumber = 0; - bNumEndpoints = 2; - bInterfaceClass = USB_CLASS_XID; - bInterfaceSubClass = 0x42; - bInterfaceProtocol = 0x00; - eps->bEndpointAddress = USB_DIR_IN | 0x02; - eps->bmAttributes = USB_ENDPOINT_XFER_INT; - eps->wMaxPacketSize = 0x20; - eps->bInterval = 4; - eps++; - eps->bEndpointAddress = USB_DIR_OUT | 0x02; - eps->bmAttributes = USB_ENDPOINT_XFER_INT; - eps->wMaxPacketSize = 0x20; - eps->bInterval = 4; -} +static const USBDescIface desc_iface_xbox_gamepad = { + 0, // bInterfaceNumber; + 0, // bAlternateSetting; + 2, // bNumEndpoints; + USB_CLASS_XID, // bInterfaceClass; + 0x42, // bInterfaceSubClass + 0x00, // bInterfaceProtocol + 0, // iInterface + 0, // ndesc + nullptr, // descs + desc_endp_xbox_gamepad +}; + +static const USBDescConfig desc_config_xbox_gamepad = { + 1, // bNumInterfaces + 1, // bConfigurationValue + 0, // iConfiguration + 0x80, // bmAttributes + 50, // bMaxPower + 1, // nif + &desc_iface_xbox_gamepad +}; -USBDescIface::~USBDescIface() -{ - delete[] eps; -} +static const USBDescDevice desc_device_xbox_gamepad = { + 0x0110, // bcdUSB + 0, // bDeviceClass + 0, // bDeviceSubClass + 0, // bDeviceProtocol + 0x40, // bMaxPacketSize0 + 1, // bNumConfigurations + &desc_config_xbox_gamepad +}; -static const USBDescIface desc_iface_xbox_gamepad; +static const USBDesc desc_xbox_gamepad = { + { + 0x045E, // idVendor + 0x0202, // idProduct + 0x0100, // bcdDevice + STR_MANUFACTURER, // iManufacturer + STR_PRODUCT, // iProduct + STR_SERIALNUMBER // iSerialNumber + }, + &desc_device_xbox_gamepad +}; -USBDescDevice::USBDescDevice() -{ - std::memset(this, 0, sizeof(USBDescDevice)); - USBDescConfig* pUSBDescConfig = new USBDescConfig(); - bcdUSB = 0x0110; - bMaxPacketSize0 = 0x40; - bNumConfigurations = 1; - pUSBDescConfig->bNumInterfaces = 1; - pUSBDescConfig->bConfigurationValue = 1; - pUSBDescConfig->bmAttributes = 0x80; - pUSBDescConfig->bMaxPower = 50; - pUSBDescConfig->nif = 1; - pUSBDescConfig->ifs = &desc_iface_xbox_gamepad; - confs = pUSBDescConfig; -} - -USBDescDevice::~USBDescDevice() -{ - delete confs; -} - -static const USBDescDevice desc_device_xbox_gamepad; - -USBDesc::USBDesc() -{ - std::memset(this, 0, sizeof(USBDesc)); - id.idVendor = 0x045E; - id.idProduct = 0x0202; - id.bcdDevice = 0x0100; - id.iManufacturer = STR_MANUFACTURER; - id.iProduct = STR_PRODUCT; - id.iSerialNumber = STR_SERIALNUMBER; - full = &desc_device_xbox_gamepad; -} - -static const USBDesc desc_xbox_gamepad; - -XIDDesc::XIDDesc() -{ - bLength = 0x10; - bDescriptorType = USB_DT_XID; - bcdXid = 0x100; - bType = 1; - bSubType = 1; - bMaxInputReportSize = 20; - bMaxOutputReportSize = 6; - wAlternateProductIds[0] = 0xFFFF; - wAlternateProductIds[1] = 0xFFFF; - wAlternateProductIds[2] = 0xFFFF; - wAlternateProductIds[3] = 0xFFFF; -} - -static const XIDDesc desc_xid_xbox_gamepad; +static const XIDDesc desc_xid_xbox_gamepad = { + 0x10, // bLength + USB_DT_XID, // bDescriptorType + 0x100, // bcdXid + 1, // bType + 1, // bSubType + 20, // bMaxInputReportSize + 6, // bMaxOutputReportSize + { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF } // wAlternateProductIds +}; int XidGamepad::Init(int port) { @@ -229,7 +236,6 @@ XboxDeviceState* XidGamepad::ClassInitFn() int XidGamepad::UsbXidClaimPort(XboxDeviceState* dev, int port) { int i; - int port_offset; std::vector::iterator it; assert(dev->Port == nullptr); @@ -525,7 +531,7 @@ void XidGamepad::XidCleanUp() void XidGamepad::UpdateForceFeedback() { // JayFoxRox's remarks: "Xbox -> XID packets were not tested - // The handling out output packets / force feedback was not checked." + // The handling of output packets / force feedback was not checked." // For the above reason we don't implement vibration support for now since the current // implementation is untested and could potentially contain errors diff --git a/src/devices/video/nv2a.h b/src/devices/video/nv2a.h index 6d732f628..62d54f60d 100644 --- a/src/devices/video/nv2a.h +++ b/src/devices/video/nv2a.h @@ -40,7 +40,7 @@ #include "glib_compat.h" // For GHashTable, g_hash_table_new, g_hash_table_lookup, g_hash_table_insert #endif -#include "CxbxCommon.h" // For xbaddr +#include "Cxbx.h" // For xbaddr #include "devices\PCIDevice.h" // For PCIDevice #include From f31b57830e10cc0ead5e97e706ac7de731c6770a Mon Sep 17 00:00:00 2001 From: ergo720 Date: Sat, 21 Jul 2018 22:20:21 +0200 Subject: [PATCH 0067/1000] Bug fixes (still not good enough) --- src/Common/Input/InputConfig.cpp | 73 ++++++++++++++--------------- src/Common/Input/SDL2_Device.cpp | 4 +- src/Common/Input/SDL2_Device.h | 12 ++--- src/CxbxKrnl/EmuD3D8.cpp | 9 ++-- src/CxbxKrnl/EmuXapi.cpp | 80 +++++--------------------------- src/CxbxKrnl/HLEIntercept.cpp | 7 ++- src/devices/usb/Hub.cpp | 4 +- src/devices/usb/OHCI.h | 6 +-- src/devices/usb/USBDevice.cpp | 5 +- 9 files changed, 73 insertions(+), 127 deletions(-) diff --git a/src/Common/Input/InputConfig.cpp b/src/Common/Input/InputConfig.cpp index 4e2deb882..e6bc626dd 100644 --- a/src/Common/Input/InputConfig.cpp +++ b/src/Common/Input/InputConfig.cpp @@ -53,7 +53,7 @@ InputDeviceManager* g_InputDeviceManager = nullptr; InputDeviceManager::InputDeviceManager() { - if (SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER) < 0) { + if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) < 0) { CxbxKrnlCleanup("Failed to initialize SDL2 input subsystem. The error was: %s\n", SDL_GetError()); return; } @@ -69,7 +69,7 @@ int InputDeviceManager::EnumSdl2Devices() int NumOfJoysticks; int NumInvalidJoysticks; SDL2Devices* pDev; - SDL_GameController* pController; + SDL_Joystick* pJoystick; std::vector::iterator it; NumOfJoysticks = SDL_NumJoysticks(); @@ -81,27 +81,23 @@ int InputDeviceManager::EnumSdl2Devices() NumInvalidJoysticks = 0; for (int i = 0; i < NumOfJoysticks; i++) { - if (SDL_IsGameController(i)) { - pDev = new SDL2Devices(); - pDev->m_Index = i; - m_Sdl2Devices.push_back(pDev); - } - // this joystick is not supported at the moment - NumInvalidJoysticks++; + pDev = new SDL2Devices(); + pDev->m_Index = i; + m_Sdl2Devices.push_back(pDev); } for (it = m_Sdl2Devices.begin(); it != m_Sdl2Devices.end();) { - pController = SDL_GameControllerOpen((*it)->m_Index); - if (pController == nullptr) { - EmuWarning("Failed to open game controller %s. The error was %s\n", SDL_GameControllerNameForIndex((*it)->m_Index), SDL_GetError()); + pJoystick = SDL_JoystickOpen((*it)->m_Index); + if (pJoystick == nullptr) { + EmuWarning("Failed to open joystick %s. The error was %s\n", SDL_GameControllerNameForIndex((*it)->m_Index), SDL_GetError()); delete (*it); it = m_Sdl2Devices.erase(it); NumInvalidJoysticks++; } else { - printf("Found game controller %s\n", SDL_GameControllerName(pController)); - (*it)->m_Gamepad = pController; - (*it)->m_jyID = SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(pController)); + printf("Found joystick %s\n", SDL_JoystickName(pJoystick)); + (*it)->m_Joystick = pJoystick; + (*it)->m_jyID = SDL_JoystickInstanceID(pJoystick); (*it)->m_Attached = 1; ++it; } @@ -134,7 +130,7 @@ int InputDeviceManager::ConnectDeviceToXbox(int port, int type) case MS_CONTROLLER_DUKE: { if (g_HubObjArray[port] == nullptr) { g_HubObjArray[port] = new Hub; - ret = g_HubObjArray[port]->Init(port); + ret = g_HubObjArray[port]->Init(port + 1); if (ret) { delete g_HubObjArray[port]; g_HubObjArray[port] = nullptr; @@ -142,7 +138,7 @@ int InputDeviceManager::ConnectDeviceToXbox(int port, int type) } if (g_XidControllerObjArray[port] == nullptr) { g_XidControllerObjArray[port] = new XidGamepad; - ret = g_XidControllerObjArray[port]->Init(port); + ret = g_XidControllerObjArray[port]->Init(port + 1); if (ret) { g_HubObjArray[port]->HubDestroy(); delete g_HubObjArray[port]; @@ -262,7 +258,6 @@ void InputDeviceManager::InputThread(InputDeviceManager* pVoid) } SDL_JoystickEventState(SDL_ENABLE); - SDL_GameControllerEventState(SDL_ENABLE); while (bContinue) { @@ -309,23 +304,23 @@ void InputDeviceManager::InputThread(InputDeviceManager* pVoid) break; } - case SDL_CONTROLLERBUTTONUP: - case SDL_CONTROLLERBUTTONDOWN: { - pVoid->UpdateButtonState(event.cbutton.which, event.cbutton.button, event.cbutton.state); - break; - } + //case SDL_CONTROLLERBUTTONUP: + //case SDL_CONTROLLERBUTTONDOWN: { + // pVoid->UpdateButtonState(event.cbutton.which, event.cbutton.button, event.cbutton.state); + // break; + //} - case SDL_CONTROLLERAXISMOTION: { - pVoid->UpdateAxisState(event.caxis.which, event.caxis.axis, event.caxis.value); - break; - } + //case SDL_CONTROLLERAXISMOTION: { + // pVoid->UpdateAxisState(event.caxis.which, event.caxis.axis, event.caxis.value); + // break; + //} - case SDL_CONTROLLERDEVICEADDED: { + //case SDL_CONTROLLERDEVICEADDED: { - } - case SDL_CONTROLLERDEVICEREMOVED: { + //} + //case SDL_CONTROLLERDEVICEREMOVED: { - } + //} case SDL_QUIT: { bContinue = false; @@ -386,6 +381,7 @@ void InputDeviceManager::UpdateButtonState(SDL_JoystickID id, uint8_t button, ui ControllerObj->UpdateDigitalButtonState(xbox_button, state); break; } + default: break; } @@ -444,7 +440,7 @@ void InputDeviceManager::UpdateAxisState(SDL_JoystickID id, uint8_t axis_index, int InputDeviceManager::IsValidController(int index) { SDL2Devices* pDev; - SDL_GameController* pController; + SDL_Joystick* pJoystick; if (SDL_IsGameController(index)) { pDev = new SDL2Devices(); @@ -456,23 +452,22 @@ int InputDeviceManager::IsValidController(int index) return -1; } - pController = SDL_GameControllerOpen(pDev->m_Index); - if (pController == nullptr) { + pJoystick = SDL_JoystickOpen(pDev->m_Index); + if (pJoystick == nullptr) { EmuWarning("Failed to open game controller %s. The error was %s\n", SDL_GameControllerNameForIndex(pDev->m_Index), SDL_GetError()); delete pDev; m_Sdl2Devices.erase(m_Sdl2Devices.begin() + index); return -1; } else if (pDev->m_Index > 3) { - printf("More than 4 controllers detected. Putting game controller %s in detached state\n", - SDL_GameControllerName(pController)); + printf("More than 4 controllers detected. Putting game controller %s in detached state\n", SDL_JoystickName(pJoystick)); pDev->m_Attached = 0; return -1; } else { - printf("Found game controller %s\n", SDL_GameControllerName(pController)); - pDev->m_Gamepad = pController; - pDev->m_jyID = SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(pController)); + printf("Found game controller %s\n", SDL_JoystickName(pJoystick)); + pDev->m_Joystick = pJoystick; + pDev->m_jyID = SDL_JoystickInstanceID(pJoystick); return 0; } } diff --git a/src/Common/Input/SDL2_Device.cpp b/src/Common/Input/SDL2_Device.cpp index 975da59d9..ff481e46d 100644 --- a/src/Common/Input/SDL2_Device.cpp +++ b/src/Common/Input/SDL2_Device.cpp @@ -79,13 +79,13 @@ void SDL2Devices::UpdateAnalogButtonState(uint8_t xbox_button, uint8_t state) } if (xbox_button == GAMEPAD_LEFT_TRIGGER) { - m_State.bAnalogButtons[m_ButtonMap_Analog[6][0]] = SDL_GameControllerGetAxis(m_Gamepad, SDL_CONTROLLER_AXIS_TRIGGERLEFT) >> 8; + m_State.bAnalogButtons[m_ButtonMap_Analog[6][0]] = SDL_JoystickGetAxis(m_Joystick, SDL_CONTROLLER_AXIS_TRIGGERLEFT) >> 8; bStateDirty = true; return; } if (xbox_button == GAMEPAD_RIGHT_TRIGGER) { - m_State.bAnalogButtons[m_ButtonMap_Analog[7][0]] = SDL_GameControllerGetAxis(m_Gamepad, SDL_CONTROLLER_AXIS_TRIGGERLEFT) >> 8; + m_State.bAnalogButtons[m_ButtonMap_Analog[7][0]] = SDL_JoystickGetAxis(m_Joystick, SDL_CONTROLLER_AXIS_TRIGGERLEFT) >> 8; bStateDirty = true; return; } diff --git a/src/Common/Input/SDL2_Device.h b/src/Common/Input/SDL2_Device.h index ea7dc2f09..d5bf68d8e 100644 --- a/src/Common/Input/SDL2_Device.h +++ b/src/Common/Input/SDL2_Device.h @@ -54,15 +54,15 @@ struct ButtonState { class SDL2Devices { public: - // index of this device + // index of this joystick int m_Index; - // game controller object as used by SDL - SDL_GameController* m_Gamepad; + // joystick object as used by SDL + SDL_Joystick* m_Joystick; // id of this controller SDL_JoystickID m_jyID; - // attach/detach state of this controller + // attach/detach state of this joystick int m_Attached; - // indicates the xbox device emulated by this controller + // indicates the xbox device emulated by this joystick int m_Type = DEVICE_INVALID; // update analog button state @@ -112,7 +112,7 @@ class SDL2Devices }; // m_HatIndex is added to HAT_CONSTANT to avoid collisions between it and the sdl button indices int m_HatIndex = HAT_CONSTANT; - // current button state of this controlller + // current button state of this joystick ButtonState m_State; // signals that the current bindings should be updated std::atomic_bool m_bBindingsChanged; diff --git a/src/CxbxKrnl/EmuD3D8.cpp b/src/CxbxKrnl/EmuD3D8.cpp index c36a315d9..d88297a9d 100644 --- a/src/CxbxKrnl/EmuD3D8.cpp +++ b/src/CxbxKrnl/EmuD3D8.cpp @@ -1452,9 +1452,12 @@ static DWORD WINAPI EmuRenderWindow(LPVOID lpVoid) SetFocus(CxbxKrnl_hEmuParent); } - // initialize direct input - if(!XTL::EmuDInputInit()) - CxbxKrnlCleanup("Could not initialize DirectInput!"); + // initialize direct input only if LLE USB is off + if (!bLLE_USB) { + if (!XTL::EmuDInputInit()) { + CxbxKrnlCleanup("Could not initialize DirectInput!"); + } + } DbgPrintf("EmuD3D8: Message-Pump thread is running.\n"); diff --git a/src/CxbxKrnl/EmuXapi.cpp b/src/CxbxKrnl/EmuXapi.cpp index dd185b9f2..a7ff95954 100644 --- a/src/CxbxKrnl/EmuXapi.cpp +++ b/src/CxbxKrnl/EmuXapi.cpp @@ -289,13 +289,8 @@ VOID WINAPI XTL::EMUPATCH(XInitDevices) g_hInputHandle[v] = 0; } */ - if (bLLE_USB) { - XB_trampoline(VOID, WINAPI, XInitDevices, (DWORD, PXDEVICE_PREALLOC_TYPE)); - XB_XInitDevices(dwPreallocTypeCount, PreallocTypes); - } - else { - InitXboxControllerHostBridge(); - } + + InitXboxControllerHostBridge(); } bool TitleIsJSRF() @@ -396,12 +391,7 @@ DWORD WINAPI XTL::EMUPATCH(XGetDevices) { FUNC_EXPORTS - LOG_FUNC_ONE_ARG(DeviceType); - - if (bLLE_USB) { - XB_trampoline(DWORD, WINAPI, XGetDevices, (PXPP_DEVICE_TYPE)); - RETURN(XB_XGetDevices(DeviceType)); - } + LOG_FUNC_ONE_ARG(DeviceType); UCHAR oldIrql = xboxkrnl::KeRaiseIrqlToDpcLevel(); @@ -454,12 +444,7 @@ BOOL WINAPI XTL::EMUPATCH(XGetDeviceChanges) LOG_FUNC_ARG(DeviceType) LOG_FUNC_ARG(pdwInsertions) LOG_FUNC_ARG(pdwRemovals) - LOG_FUNC_END; - - if (bLLE_USB) { - XB_trampoline(BOOL, WINAPI, XGetDeviceChanges, (PXPP_DEVICE_TYPE, PDWORD, PDWORD)); - RETURN(XB_XGetDeviceChanges(DeviceType, pdwInsertions, pdwRemovals)); - } + LOG_FUNC_END; BOOL ret = FALSE; @@ -535,11 +520,6 @@ HANDLE WINAPI XTL::EMUPATCH(XInputOpen) LOG_FUNC_ARG(dwSlot) LOG_FUNC_ARG(pPollingParameters) LOG_FUNC_END; - - if (bLLE_USB) { - XB_trampoline(HANDLE, WINAPI, XInputOpen, (PXPP_DEVICE_TYPE, DWORD, DWORD, PX_XINPUT_POLLING_PARAMETERS)); - RETURN(XB_XInputOpen(DeviceType, dwPort, dwSlot, pPollingParameters)); - } X_POLLING_PARAMETERS_HANDLE *pph = 0; //OLD_XINPUT @@ -641,13 +621,7 @@ VOID WINAPI XTL::EMUPATCH(XInputClose) { FUNC_EXPORTS - LOG_FUNC_ONE_ARG(hDevice); - - if (bLLE_USB) { - XB_trampoline(VOID, WINAPI, XInputClose, (HANDLE)); - XB_XInputClose(hDevice); - return; - } + LOG_FUNC_ONE_ARG(hDevice); X_POLLING_PARAMETERS_HANDLE *pph = (X_POLLING_PARAMETERS_HANDLE*)hDevice; DWORD dwPort = pph->dwPort; @@ -701,11 +675,6 @@ DWORD WINAPI XTL::EMUPATCH(XInputPoll) FUNC_EXPORTS LOG_FUNC_ONE_ARG(hDevice); - - if (bLLE_USB) { - XB_trampoline(DWORD, WINAPI, XInputPoll, (HANDLE)); - RETURN(XB_XInputPoll(hDevice)); - } //OLD_XINPUT /* X_POLLING_PARAMETERS_HANDLE *pph = (X_POLLING_PARAMETERS_HANDLE*)hDevice; @@ -783,12 +752,7 @@ DWORD WINAPI XTL::EMUPATCH(XInputGetCapabilities) LOG_FUNC_BEGIN LOG_FUNC_ARG(hDevice) LOG_FUNC_ARG_OUT(pCapabilities) - LOG_FUNC_END; - - if (bLLE_USB) { - XB_trampoline(DWORD, WINAPI, XInputGetCapabilities, (HANDLE, PX_XINPUT_CAPABILITIES)); - RETURN(XB_XInputGetCapabilities(hDevice, pCapabilities)); - } + LOG_FUNC_END; DWORD ret = ERROR_DEVICE_NOT_CONNECTED; @@ -1055,7 +1019,7 @@ void EmuSBCGetState(XTL::PX_SBC_GAMEPAD pSBCGamepad, XTL::PX_XINPUT_GAMEPAD pXIG XboxSBCGamepad = *pSBCGamepad; } // ****************************************************************** -// * patch: InputGetState +// * patch: XInputGetState // ****************************************************************** DWORD WINAPI XTL::EMUPATCH(XInputGetState) ( @@ -1068,12 +1032,7 @@ DWORD WINAPI XTL::EMUPATCH(XInputGetState) LOG_FUNC_BEGIN LOG_FUNC_ARG(hDevice) LOG_FUNC_ARG_OUT(pState) - LOG_FUNC_END; - - if (bLLE_USB) { - XB_trampoline(DWORD, WINAPI, XInputGetState, (HANDLE, PX_XINPUT_STATE)); - RETURN(XB_XInputGetState(hDevice, pState)); - } + LOG_FUNC_END; DWORD ret = ERROR_INVALID_HANDLE; //OLD_XINPUT @@ -1151,7 +1110,7 @@ DWORD WINAPI XTL::EMUPATCH(XInputGetState) } // ****************************************************************** -// * patch: InputSetState +// * patch: XInputSetState // ****************************************************************** DWORD WINAPI XTL::EMUPATCH(XInputSetState) ( @@ -1164,12 +1123,7 @@ DWORD WINAPI XTL::EMUPATCH(XInputSetState) LOG_FUNC_BEGIN LOG_FUNC_ARG(hDevice) LOG_FUNC_ARG(pFeedback) - LOG_FUNC_END; - - if (bLLE_USB) { - XB_trampoline(DWORD, WINAPI, XInputSetState, (HANDLE, PX_XINPUT_FEEDBACK)); - RETURN(XB_XInputSetState(hDevice, pFeedback)); - } + LOG_FUNC_END; DWORD ret = ERROR_IO_PENDING; //OLD_XINPUT @@ -1946,12 +1900,7 @@ DWORD WINAPI XTL::EMUPATCH(XGetDeviceEnumerationStatus)() { FUNC_EXPORTS - LOG_FUNC(); - - if (bLLE_USB) { - XB_trampoline(DWORD, WINAPI, XGetDeviceEnumerationStatus, ()); - RETURN(XB_XGetDeviceEnumerationStatus()); - } + LOG_FUNC(); LOG_UNIMPLEMENTED(); @@ -1972,12 +1921,7 @@ DWORD WINAPI XTL::EMUPATCH(XInputGetDeviceDescription) LOG_FUNC_BEGIN LOG_FUNC_ARG(hDevice) LOG_FUNC_ARG(pDescription) - LOG_FUNC_END; - - if (bLLE_USB) { - XB_trampoline(DWORD, WINAPI, XInputGetDeviceDescription, (HANDLE, PVOID)); - RETURN(XB_XInputGetDeviceDescription(hDevice, pDescription)); - } + LOG_FUNC_END; // TODO: Lightgun support? LOG_UNIMPLEMENTED(); diff --git a/src/CxbxKrnl/HLEIntercept.cpp b/src/CxbxKrnl/HLEIntercept.cpp index 315756104..07f0a456b 100644 --- a/src/CxbxKrnl/HLEIntercept.cpp +++ b/src/CxbxKrnl/HLEIntercept.cpp @@ -284,8 +284,11 @@ void CDECL EmuRegisterSymbol(const char* library_str, // Do nothing if emulating LLE APU } else if (bLLE_GPU && ((library_flag & XbSymbolLib_XGRAPHC) || (library_flag & XbSymbolLib_D3D8) || (library_flag & XbSymbolLib_D3D8LTCG) > 0)) { // Do nothing if emulating LLE GPU - } else if (bLLE_USB && (library_flag & XbSymbolLib_XAPILIB) > 0) { - // Do nothing if emulating LLE USB + } else if (bLLE_USB && ((std::strcmp(symbol_str, "XInitDevices") == 0) || (std::strcmp(symbol_str, "XGetDevices") == 0) || (std::strcmp(symbol_str, "XGetDeviceChanges") == 0) || + (std::strcmp(symbol_str, "XInputOpen") == 0) || (std::strcmp(symbol_str, "XInputClose") == 0) || (std::strcmp(symbol_str, "XInputPoll") == 0) || + (std::strcmp(symbol_str, "XInputGetCapabilities") == 0) || (std::strcmp(symbol_str, "XInputGetState") == 0) || (std::strcmp(symbol_str, "XInputSetState") == 0) || + (std::strcmp(symbol_str, "XGetDeviceEnumerationStatus") == 0) || (std::strcmp(symbol_str, "XInputGetDeviceDescription") == 0) || (std::strcmp(symbol_str, "XID_fCloseDevice") == 0))) { + // Do nothing for the xinput functions if emulating LLE USB } else { // Or else check if patch exist then patch it. diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index f13ceb72c..506a238e4 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -232,10 +232,10 @@ int Hub::UsbHubClaimPort(XboxDeviceState* dev, int port) i = 0; if (port > 2) { - m_UsbDev = g_USB0; + m_UsbDev = g_USB1; } else { - m_UsbDev = g_USB1; + m_UsbDev = g_USB0; } while (m_UsbDev->m_HostController->m_bFrameTime) {} diff --git a/src/devices/usb/OHCI.h b/src/devices/usb/OHCI.h index ddf2b4804..1556a45a1 100644 --- a/src/devices/usb/OHCI.h +++ b/src/devices/usb/OHCI.h @@ -160,7 +160,7 @@ class OHCI // all the registers available on the OHCI standard OHCI_Registers m_Registers; // end-of-frame timer - TimerObject* m_pEOFtimer; + TimerObject* m_pEOFtimer = nullptr; // time at which a SOF was sent uint64_t m_SOFtime; // the duration of a usb frame @@ -178,9 +178,9 @@ class OHCI // Done Queue Interrupt Counter int m_DoneCount; // the address of the pending TD - xbaddr m_AsyncTD; + xbaddr m_AsyncTD = xbnull; // ergo720: I think it signals that a TD has been processed completely - bool m_AsyncComplete; + bool m_AsyncComplete = 0; // EOF callback wrapper static void OHCI_FrameBoundaryWrapper(void* pVoid); diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index 0cbd8fd6b..7e716edaa 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -101,7 +101,8 @@ void USBDevice::USB_RegisterPort(USBPort* Port, int Index, int SpeedMask, USBPor { Port->PortIndex = Index; Port->SpeedMask = SpeedMask; - Port->Operations = Ops; + Port->Operations = Ops; + Port->Dev = nullptr; USB_PortLocation(Port, nullptr, Index + 1); m_FreePorts.push_back(Port); } @@ -761,7 +762,7 @@ void USBDevice::USBDesc_Init(XboxDeviceState* dev) { const USBDesc* desc = USBDesc_GetUsbDeviceDesc(dev); - assert(desc != NULL); + assert(desc != nullptr); dev->Speed = USB_SPEED_FULL; dev->SpeedMask = 0; if (desc->full) { From a70aab8fa600b13fb00646f1a642c4b235b4ac54 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Mon, 23 Jul 2018 11:52:20 +0200 Subject: [PATCH 0068/1000] Added CLI and STI instruction support to EmuX86. Fixes a crash in ohci dpc routine --- src/CxbxKrnl/CxbxKrnl.cpp | 5 ++++- src/CxbxKrnl/EmuX86.cpp | 28 +++++++++++++++++++++++++--- src/devices/usb/OHCI.cpp | 14 ++++++++++++++ 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index d426c8919..2d07028b1 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -108,6 +108,9 @@ bool g_bIsRetail = false; DWORD_PTR g_CPUXbox = 0; DWORD_PTR g_CPUOthers = 0; +// Indicates to enable/disable all interrupts when cli and sti instructions are executed +std::atomic_bool g_bEnableAllInterrupts = true; + // Set by the VMManager during initialization. Exported because it's needed in other parts of the emu size_t g_SystemMaxMemory = 0; @@ -668,7 +671,7 @@ static unsigned int WINAPI CxbxKrnlInterruptThread(PVOID param) InitSoftwareInterrupts(); #endif - while (true) { + while (g_bEnableAllInterrupts) { TriggerPendingConnectedInterrupts(); Sleep(1); } diff --git a/src/CxbxKrnl/EmuX86.cpp b/src/CxbxKrnl/EmuX86.cpp index 6f4605fb4..4808cfa26 100644 --- a/src/CxbxKrnl/EmuX86.cpp +++ b/src/CxbxKrnl/EmuX86.cpp @@ -52,9 +52,11 @@ #include "HLEIntercept.h" // for bLLE_GPU #include -#include "devices\Xbox.h" // For g_PCIBus +#include "devices\Xbox.h" // For g_PCIBus +#include -extern uint32_t GetAPUTime(); +extern uint32_t GetAPUTime(); +extern std::atomic_bool g_bEnableAllInterrupts; // // Read & write handlers handlers for I/O @@ -1010,6 +1012,16 @@ bool EmuX86_Opcode_TEST(LPEXCEPTION_POINTERS e, _DInst& info) // result is thrown away return true; +} + +void EmuX86_Opcode_CLI() +{ + g_bEnableAllInterrupts = false; +} + +void EmuX86_Opcode_STI() +{ + g_bEnableAllInterrupts = true; } bool EmuX86_DecodeOpcode(const uint8_t *Eip, _DInst &info) @@ -1115,7 +1127,17 @@ bool EmuX86_DecodeException(LPEXCEPTION_POINTERS e) // This needs fixing eventually, but should be acceptible to ignore for now! // Chase: Hollywood Stunt Driver hits this EmuWarning("WRMSR instruction ignored"); - break; + break; + case I_CLI: { + // Disable all interrupts + EmuX86_Opcode_CLI(); + break; + } + case I_STI: { + // Enable all interrupts + EmuX86_Opcode_STI(); + break; + } default: EmuWarning("Unhandled instruction : %u", info.opcode); e->ContextRecord->Eip += info.size; diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index 26d293849..23cfa1fd6 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -1090,6 +1090,14 @@ uint32_t OHCI::OHCI_ReadRegister(xbaddr Addr) case 22: // RhPort 1 ret = m_Registers.RhPort[1].HcRhPortStatus | OHCI_PORT_PPS; + break; + + case 23: + ret = 0; + break; + + case 24: + ret = 0; break; default: @@ -1221,6 +1229,12 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) case 22: // RhPort 1 OHCI_PortSetStatus(1, Value); + break; + + case 23: + break; + + case 24: break; default: From 01674b22e70535ff21aadf8ac69a1d11ee1e9281 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Mon, 23 Jul 2018 12:00:06 +0200 Subject: [PATCH 0069/1000] Amend previous commit --- src/CxbxKrnl/CxbxKrnl.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index 2d07028b1..be222041f 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -671,9 +671,11 @@ static unsigned int WINAPI CxbxKrnlInterruptThread(PVOID param) InitSoftwareInterrupts(); #endif - while (g_bEnableAllInterrupts) { - TriggerPendingConnectedInterrupts(); - Sleep(1); + while (true) { + if (g_bEnableAllInterrupts) { + TriggerPendingConnectedInterrupts(); + Sleep(1); + } } return 0; From a54930aa3b61a8831e3159154816b344da16221c Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Tue, 24 Jul 2018 08:31:07 +0100 Subject: [PATCH 0070/1000] Thread safe FS processing using spinlock --- src/CxbxKrnl/EmuFS.cpp | 75 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 2 deletions(-) diff --git a/src/CxbxKrnl/EmuFS.cpp b/src/CxbxKrnl/EmuFS.cpp index c51088eb8..1fcc18f5e 100644 --- a/src/CxbxKrnl/EmuFS.cpp +++ b/src/CxbxKrnl/EmuFS.cpp @@ -128,6 +128,40 @@ NT_TIB *GetNtTib() xboxkrnl::KPCR* KeGetPcr(); +uint32_t fs_lock; + +__declspec(naked) void LockFSInternal() +{ + __asm { + mov eax, 1 + xchg eax, [fs_lock] + test eax, eax + jnz LockFSInternal + ret + } +} + +__declspec(naked) void LockFS() +{ + __asm { + push eax + call LockFSInternal + pop eax + ret + } +} + +__declspec(naked) void UnlockFS() +{ + __asm { + push eax + xor eax, eax + xchg eax, [fs_lock] + pop eax + ret + } +} + void EmuKeSetPcr(xboxkrnl::KPCR *Pcr) { // Store the Xbox KPCR pointer in FS (See KeGetPcr()) @@ -163,7 +197,7 @@ __declspec(naked) void EmuFS_RefreshKPCR() // Backup all registers, call KeGetPcr and then restore all registers // KeGetPcr makes sure a valid KPCR exists for the current thread // and creates it if missing, we backup and restore all registers - // to keep it safe to cal in our patches + // to keep it safe to call in our patches // This function can be later expanded to do nice things // like setup the per-thread KPCR values for us too! __asm { @@ -181,11 +215,13 @@ __declspec(naked) void EmuFS_CmpEsiFs00() // Note : eax must be preserved here, hence the push/pop __asm { + call LockFS call EmuFS_RefreshKPCR push eax mov eax, fs : [TIB_ArbitraryDataSlot] cmp esi, [eax] pop eax + call UnlockFS ret } } @@ -194,9 +230,11 @@ __declspec(naked) void EmuFS_MovEaxFs00() { __asm { + call LockFS call EmuFS_RefreshKPCR mov eax, fs : [TIB_ArbitraryDataSlot] mov eax, [eax] + call UnlockFS ret } } @@ -205,9 +243,11 @@ __declspec(naked) void EmuFS_MovEaxFs20() { __asm { + call LockFS call EmuFS_RefreshKPCR mov eax, fs : [TIB_ArbitraryDataSlot] mov eax, [eax + 20h] + call UnlockFS ret } } @@ -216,9 +256,11 @@ __declspec(naked) void EmuFS_MovEaxFs28() { __asm { + call LockFS call EmuFS_RefreshKPCR mov eax, fs : [TIB_ArbitraryDataSlot] mov eax, [eax + 28h] + call UnlockFS ret } } @@ -227,9 +269,11 @@ __declspec(naked) void EmuFS_MovEaxFs58() { __asm { + call LockFS; call EmuFS_RefreshKPCR mov eax, fs : [TIB_ArbitraryDataSlot] mov eax, [eax + 58h] + call UnlockFS ret } } @@ -238,9 +282,11 @@ __declspec(naked) void EmuFS_MovEbxFs00() { __asm { + call LockFS call EmuFS_RefreshKPCR mov ebx, fs : [TIB_ArbitraryDataSlot] mov ebx, [ebx] + call UnlockFS ret } } @@ -249,9 +295,11 @@ __declspec(naked) void EmuFS_MovEcxFs00() { __asm { + call LockFS call EmuFS_RefreshKPCR mov ecx, fs : [TIB_ArbitraryDataSlot] mov ecx, [ecx] + call UnlockFS ret } } @@ -260,9 +308,11 @@ __declspec(naked) void EmuFS_MovEcxFs04() { __asm { + call LockFS call EmuFS_RefreshKPCR mov ecx, fs : [TIB_ArbitraryDataSlot] mov ecx, [ecx + 04h] + call UnlockFS ret } } @@ -271,9 +321,11 @@ __declspec(naked) void EmuFS_MovEdiFs00() { __asm { + call LockFS call EmuFS_RefreshKPCR mov edi, fs : [TIB_ArbitraryDataSlot] mov edi, [edi] + call UnlockFS ret } } @@ -282,9 +334,11 @@ __declspec(naked) void EmuFS_MovEdiFs04() { __asm { + call LockFS call EmuFS_RefreshKPCR mov edi, fs : [TIB_ArbitraryDataSlot] mov edi, [edi + 04h] + call UnlockFS ret } } @@ -293,9 +347,11 @@ __declspec(naked) void EmuFS_MovEsiFs00() { __asm { + call LockFS call EmuFS_RefreshKPCR mov esi, fs : [TIB_ArbitraryDataSlot] mov esi, [esi] + call UnlockFS ret } } @@ -305,11 +361,14 @@ __declspec(naked) void EmuFS_MovzxEaxBytePtrFs24() // Note : Inlined KeGetCurrentIrql() __asm { + call LockFS call EmuFS_RefreshKPCR mov eax, fs : [TIB_ArbitraryDataSlot] movzx eax, byte ptr[eax + 24h] + call UnlockFS ret } + UnlockFS(); } __declspec(naked) void EmuFS_MovFs00Eax() @@ -317,11 +376,13 @@ __declspec(naked) void EmuFS_MovFs00Eax() // Note : ebx must be preserved here, hence the push/pop __asm { + call LockFS call EmuFS_RefreshKPCR push ebx mov ebx, fs : [TIB_ArbitraryDataSlot] mov [ebx], eax pop ebx + call UnlockFS ret } } @@ -331,11 +392,13 @@ __declspec(naked) void EmuFS_MovFs00Ebx() // Note : eax must be preserved here, hence the push/pop __asm { + call LockFS call EmuFS_RefreshKPCR push eax mov eax, fs : [TIB_ArbitraryDataSlot] mov [eax], ebx pop eax + call UnlockFS ret } } @@ -345,11 +408,13 @@ __declspec(naked) void EmuFS_MovFs00Ecx() // Note : eax must be preserved here, hence the push/pop __asm { + call LockFS call EmuFS_RefreshKPCR push eax mov eax, fs : [TIB_ArbitraryDataSlot] mov [eax], ecx pop eax + call UnlockFS ret } } @@ -359,11 +424,13 @@ __declspec(naked) void EmuFS_MovFs00Esp() // Note : eax must be preserved here, hence the push/pop __asm { + call LockFS call EmuFS_RefreshKPCR push eax mov eax, fs : [TIB_ArbitraryDataSlot] mov [eax], esp pop eax + call UnlockFS ret } } @@ -375,13 +442,15 @@ __declspec(naked) void EmuFS_PushDwordPtrFs00() __asm { + call LockFS call EmuFS_RefreshKPCR pop returnAddr mov temp, eax mov eax, fs : [TIB_ArbitraryDataSlot] - push dword ptr [eax] + push dword ptr[eax] mov eax, temp push returnAddr + call UnlockFS ret } } @@ -393,6 +462,7 @@ __declspec(naked) void EmuFS_PopDwordPtrFs00() __asm { + call LockFS call EmuFS_RefreshKPCR pop returnAddr mov temp, eax @@ -400,6 +470,7 @@ __declspec(naked) void EmuFS_PopDwordPtrFs00() pop dword ptr [eax] mov eax, temp push returnAddr + call UnlockFS ret } } From c8811820ca24051e00ab15ce6b2508bc93b80741 Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Tue, 24 Jul 2018 08:33:31 +0100 Subject: [PATCH 0071/1000] Default fs_lock to 0 --- src/CxbxKrnl/EmuFS.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CxbxKrnl/EmuFS.cpp b/src/CxbxKrnl/EmuFS.cpp index 1fcc18f5e..b4b491371 100644 --- a/src/CxbxKrnl/EmuFS.cpp +++ b/src/CxbxKrnl/EmuFS.cpp @@ -128,7 +128,7 @@ NT_TIB *GetNtTib() xboxkrnl::KPCR* KeGetPcr(); -uint32_t fs_lock; +uint32_t fs_lock = 0; __declspec(naked) void LockFSInternal() { From c581e0b128f65cd8faa76886b949fb847010e7c9 Mon Sep 17 00:00:00 2001 From: CakeLancelot Date: Tue, 24 Jul 2018 13:31:14 -0500 Subject: [PATCH 0072/1000] Update Discord link to be more consistent with other badges --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a5cb193cd..4e8f39373 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-blue.svg)](https://img.shields.io/badge/License-GPL%20v2-blue.svg) [![AppVeyor](https://ci.appveyor.com/api/projects/status/iao43irxl3umbp33?svg=true)](https://ci.appveyor.com/project/SoullessSentinel/cxbx-reloaded) [![Gitter](https://badges.gitter.im/gitterHQ/gitter.svg)](https://gitter.im/Cxbx-Reloaded/Lobby) -or [Discord](https://discord.gg/26Xjx23) +[![Discord](https://discord.gg/26Xjx23)](https://img.shields.io/badge/chat-on%20discord-7289da.svg?logo=discord) Cxbx-Reloaded is an emulator for running Microsoft Xbox (and eventually, Chihiro) games on Microsoft Windows. From a8c488c4852b15ce1e1da3247503006beb5312dd Mon Sep 17 00:00:00 2001 From: CakeLancelot Date: Tue, 24 Jul 2018 13:33:04 -0500 Subject: [PATCH 0073/1000] Oops --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4e8f39373..20b148ac5 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-blue.svg)](https://img.shields.io/badge/License-GPL%20v2-blue.svg) [![AppVeyor](https://ci.appveyor.com/api/projects/status/iao43irxl3umbp33?svg=true)](https://ci.appveyor.com/project/SoullessSentinel/cxbx-reloaded) [![Gitter](https://badges.gitter.im/gitterHQ/gitter.svg)](https://gitter.im/Cxbx-Reloaded/Lobby) -[![Discord](https://discord.gg/26Xjx23)](https://img.shields.io/badge/chat-on%20discord-7289da.svg?logo=discord) +[![Discord](https://img.shields.io/badge/chat-on%20discord-7289da.svg?logo=discord)](https://discord.gg/26Xjx23) Cxbx-Reloaded is an emulator for running Microsoft Xbox (and eventually, Chihiro) games on Microsoft Windows. From 5056f97b8f4d78e0bca9b659ed2326f5213968e2 Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Tue, 24 Jul 2018 23:31:19 +0100 Subject: [PATCH 0074/1000] Unset DepthStencil flag on ARGB conversion: ARGB isn't a valid stencil format --- src/CxbxKrnl/EmuD3D8.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/CxbxKrnl/EmuD3D8.cpp b/src/CxbxKrnl/EmuD3D8.cpp index c36a315d9..c4e10b239 100644 --- a/src/CxbxKrnl/EmuD3D8.cpp +++ b/src/CxbxKrnl/EmuD3D8.cpp @@ -4877,6 +4877,10 @@ void CreateHostResource(XTL::X_D3DResource *pResource, DWORD D3DUsage, int iText if (EmuXBFormatRequiresConversionToARGB(X_Format)) { bConvertToARGB = true; PCFormat = XTL::D3DFMT_A8R8G8B8; + + // Unset D3DUSAGE_DEPTHSTENCIL: It's not possible for ARGB textures to be depth stencils + // Fixes CreateTexture error in Virtua Cop 3 (Chihiro) + D3DUsage &= ~D3DUSAGE_DEPTHSTENCIL; } else { // TODO : Nuance the following, because the Direct3D 8 docs states From 4ac161da82648979988d617e5679c08db9897be4 Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Wed, 25 Jul 2018 11:23:39 +0100 Subject: [PATCH 0075/1000] Fix compilation of D3D9 build With this, the Debug_Direct3D9 build now compiles and successfully runs basic XDK samples (Gamepad, Tutorials, etc) Known Issues: 1. Vertex Shaders are completely broken, any titles using vertex shaders WILL crash 2. Vertex conversion is completely broken, any titles using Xbox specific data types WILL crash This is NOT ready for use in any shape or form, just a step towards the eventual D3D9 port. --- build/win32/Cxbx.vcxproj | 7 +- build/win32/Cxbx.vcxproj.filters | 1 - src/CxbxKrnl/EmuD3D8.cpp | 92 +++++++++++++++++++++------ src/CxbxKrnl/EmuD3D8/PixelShader.cpp | 6 +- src/CxbxKrnl/EmuD3D8/VertexBuffer.cpp | 6 +- src/CxbxKrnl/EmuD3D8/VertexShader.cpp | 9 ++- src/CxbxKrnl/EmuD3D8Types.h | 8 ++- 7 files changed, 98 insertions(+), 31 deletions(-) diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index 322a89925..94b4394ee 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -179,9 +179,9 @@ Include\Win32\Cxbx;%(AdditionalIncludeDirectories) - legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;%(AdditionalDependencies) + legacy_stdio_definitions.lib;d3d9.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr9.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx9.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;%(AdditionalDependencies) true - $(Configuration)\;..\..\import\distorm\lib\Win32\;..\..\import\glew-2.0.0\lib\Release\Win32\;%(AdditionalLibraryDirectories) + $(Configuration)\;..\..\import\distorm\lib\Win32\;..\..\import\glew-2.0.0\lib\Release\Win32\;..\..\import\DirectX9\lib\;%(AdditionalLibraryDirectories) libcmt;%(IgnoreSpecificDefaultLibraries) true true @@ -740,6 +740,9 @@ + + {b8d9afc2-b38f-4714-846d-8a2754f076c9} + {cd2dde93-b45e-4d11-876d-d0056c3dd407} diff --git a/build/win32/Cxbx.vcxproj.filters b/build/win32/Cxbx.vcxproj.filters index 7c335b606..d5b56ec69 100644 --- a/build/win32/Cxbx.vcxproj.filters +++ b/build/win32/Cxbx.vcxproj.filters @@ -571,7 +571,6 @@ Emulator - diff --git a/src/CxbxKrnl/EmuD3D8.cpp b/src/CxbxKrnl/EmuD3D8.cpp index c36a315d9..7199cdc13 100644 --- a/src/CxbxKrnl/EmuD3D8.cpp +++ b/src/CxbxKrnl/EmuD3D8.cpp @@ -130,7 +130,7 @@ struct { // D3D based variables static GUID g_ddguid; // DirectDraw driver GUID static XTL::IDirect3D *g_pDirect3D = nullptr; -static XTL::D3DCAPS g_D3DCaps = {}; // Direct3D Caps +XTL::D3DCAPS g_D3DCaps = {}; // Direct3D Caps // wireframe toggle static int g_iWireframe = 0; @@ -1971,6 +1971,10 @@ static DWORD WINAPI EmuCreateDeviceProxy(LPVOID) // NOTE: It is possible to fix multisampling by having the host backbuffer normal size, the Xbox backbuffer being multisamples // and scaling that way, but that can be done as a future PR g_EmuCDPD.HostPresentationParameters.MultiSampleType = XTL::D3DMULTISAMPLE_NONE; +#ifdef CXBX_USE_D3D9 + g_EmuCDPD.HostPresentationParameters.MultiSampleQuality = 0; +#endif + /* if(g_EmuCDPD.XboxPresentationParameters.MultiSampleType != 0) { // TODO: Check card for multisampling abilities @@ -2056,17 +2060,22 @@ static DWORD WINAPI EmuCreateDeviceProxy(LPVOID) // Dxbx addition : Prevent Direct3D from changing the FPU Control word : g_EmuCDPD.BehaviorFlags |= D3DCREATE_FPU_PRESERVE; - // Address debug DirectX runtime warning in _DEBUG builds // Direct3D8: (WARN) :Device that was created without D3DCREATE_MULTITHREADED is being used by a thread other than the creation thread. - #ifdef _DEBUG - g_EmuCDPD.BehaviorFlags |= D3DCREATE_MULTITHREADED; - #endif + g_EmuCDPD.BehaviorFlags |= D3DCREATE_MULTITHREADED; // For some reason, D3DFMT_D16_LOCKABLE as the AudoDepthStencil causes CreateDevice to fail... + g_EmuCDPD.HostPresentationParameters.EnableAutoDepthStencil = TRUE; if (g_EmuCDPD.HostPresentationParameters.AutoDepthStencilFormat == XTL::D3DFMT_D16_LOCKABLE) { g_EmuCDPD.HostPresentationParameters.AutoDepthStencilFormat = XTL::D3DFMT_D16; } + // DirectX9 doesn't support 0 as a swap effect +#ifdef CXBX_USE_D3D9 + if (g_EmuCDPD.HostPresentationParameters.SwapEffect == 0) { + g_EmuCDPD.HostPresentationParameters.SwapEffect = XTL::D3DSWAPEFFECT_DISCARD; + } +#endif + // redirect to windows Direct3D g_EmuCDPD.hRet = g_pDirect3D->CreateDevice( g_EmuCDPD.Adapter, @@ -2968,9 +2977,15 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_SelectVertexShader) if(VshHandleIsVertexShader(Handle)) { + #ifndef CXBX_USE_D3D9 + CxbxVertexShader *pVertexShader = MapXboxVertexShaderHandleToCxbxVertexShader(Handle); hRet = g_pD3DDevice->SetVertexShader(pVertexShader->Handle); DEBUG_D3DRESULT(hRet, "g_pD3DDevice->SetVertexShader(VshHandleIsVertexShader)"); + #else + hRet = D3D_OK; + EmuWarning("SetVertexShader (non-FVF) unimplemented for D3D9"); + #endif } else if(Handle == NULL) { @@ -2988,8 +3003,13 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_SelectVertexShader) if(pVertexShader != NULL) { +#ifndef CXBX_USE_D3D9 hRet = g_pD3DDevice->SetVertexShader(((CxbxVertexShader *)((X_D3DVertexShader *)g_VertexShaderSlots[Address])->Handle)->Handle); DEBUG_D3DRESULT(hRet, "g_pD3DDevice->SetVertexShader(pVertexShader)"); +#else + hRet = D3D_OK; + EmuWarning("SetVertexShader (non-FVF) unimplemented for D3D9"); +#endif } else { @@ -3471,6 +3491,7 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_CreateVertexShader) DWORD Usage ) { +#ifndef CXBX_USE_D3D9 FUNC_EXPORTS LOG_FUNC_BEGIN @@ -3555,10 +3576,16 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_CreateVertexShader) { hRet = g_pD3DDevice->CreateVertexShader ( +#ifndef CXBX_USE_D3D9 pRecompiledDeclaration, +#endif pRecompiledFunction, - &Handle, - g_dwVertexShaderUsage // TODO: HACK: Xbox has extensions! +#ifdef CXBX_USE_D3D9 + (IDirect3DVertexShader9**)&Handle +#else + &Handle, + g_dwVertexShaderUsage // TODO: HACK: Xbox has extensions! +#endif ); DEBUG_D3DRESULT(hRet, "g_pD3DDevice->CreateVertexShader"); @@ -3589,11 +3616,17 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_CreateVertexShader) hRet = g_pD3DDevice->CreateVertexShader ( - pRecompiledDeclaration, - (DWORD*)pRecompiledBuffer->GetBufferPointer(), - &Handle, - g_dwVertexShaderUsage - ); +#ifndef CXBX_USE_D3D9 + pRecompiledDeclaration, +#endif + (DWORD*)pRecompiledBuffer->GetBufferPointer(), +#ifdef CXBX_USE_D3D9 + (IDirect3DVertexShader9**)&Handle +#else + &Handle, + g_dwVertexShaderUsage // TODO: HACK: Xbox has extensions! +#endif + ); DEBUG_D3DRESULT(hRet, "g_pD3DDevice->CreateVertexShader(fallback)"); } //*/ @@ -3661,6 +3694,9 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_CreateVertexShader) return hRet; +#else + return D3D_OK; +#endif } // LTCG specific D3DDevice_SetVertexShaderConstant function... @@ -5040,7 +5076,7 @@ void CreateHostResource(XTL::X_D3DResource *pResource, DWORD D3DUsage, int iText true, // Lockable &pNewHostSurface #ifdef CXBX_USE_D3D9 - , nullptr, // pSharedHandle + , nullptr // pSharedHandle #endif ); DEBUG_D3DRESULT(hRet, "g_pD3DDevice->CreateRenderTarget"); @@ -6979,7 +7015,6 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_SetVertexShader) HRESULT hRet = D3D_OK; g_CurrentXboxVertexShaderHandle = Handle; - // Store viewport offset and scale in constant registers 58 (c-38) and // 59 (c-37) used for screen space transformation. if(g_VertexShaderConstantMode != X_D3DSCM_NORESERVEDCONSTANTS) @@ -6999,6 +7034,7 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_SetVertexShader) #endif } +#ifndef CXBX_USE_D3D9 DWORD HostVertexShaderHandle; if(VshHandleIsVertexShader(Handle)) { @@ -7051,12 +7087,22 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_SetVertexShader) // TODO : Instead of changing the FVF here, see if (and which) users need to be updated. } } - -#ifdef CXBX_USE_D3D9 - hRet = g_pD3DDevice->SetVertexShader(nullptr); - hRet = g_pD3DDevice->SetFVF(HostVertexShaderHandle); -#else hRet = g_pD3DDevice->SetVertexShader(HostVertexShaderHandle); +#else + if (VshHandleIsVertexShader(Handle)) { +#ifndef CXBX_USE_D3D9 + + CxbxVertexShader *pVertexShader = MapXboxVertexShaderHandleToCxbxVertexShader(Handle); + hRet = g_pD3DDevice->SetVertexShader(pVertexShader->Handle); + DEBUG_D3DRESULT(hRet, "g_pD3DDevice->SetVertexShader(VshHandleIsVertexShader)"); +#else + hRet = D3D_OK; + EmuWarning("SetVertexShader (non-FVF) unimplemented for D3D9"); +#endif + } else { + hRet = g_pD3DDevice->SetVertexShader(nullptr); + hRet = g_pD3DDevice->SetFVF(Handle); + } #endif DEBUG_D3DRESULT(hRet, "g_pD3DDevice->SetVertexShader"); } @@ -8350,6 +8396,7 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_DeleteVertexShader) DWORD Handle ) { +#ifndef CXBX_USE_D3D9 FUNC_EXPORTS LOG_FUNC_ONE_ARG(Handle); @@ -8379,7 +8426,8 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_DeleteVertexShader) } HRESULT hRet = g_pD3DDevice->DeleteVertexShader(HostVertexShaderHandle); - DEBUG_D3DRESULT(hRet, "g_pD3DDevice->DeleteVertexShader"); + DEBUG_D3DRESULT(hRet, "g_pD3DDevice->DeleteVertexShader"); +#endif } // ****************************************************************** @@ -8447,6 +8495,7 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_GetVertexShaderConstant) DWORD ConstantCount ) { +#ifndef CXBX_USE_D3D9 FUNC_EXPORTS LOG_FUNC_BEGIN @@ -8462,7 +8511,8 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_GetVertexShaderConstant) ConstantCount ); - DEBUG_D3DRESULT(hRet, "g_pD3DDevice->GetVertexShaderConstant"); + DEBUG_D3DRESULT(hRet, "g_pD3DDevice->GetVertexShaderConstant"); +#endif } // ****************************************************************** diff --git a/src/CxbxKrnl/EmuD3D8/PixelShader.cpp b/src/CxbxKrnl/EmuD3D8/PixelShader.cpp index 9818d79c8..dbc230b18 100644 --- a/src/CxbxKrnl/EmuD3D8/PixelShader.cpp +++ b/src/CxbxKrnl/EmuD3D8/PixelShader.cpp @@ -4220,7 +4220,11 @@ static const /*pDefines=*/nullptr, /*pInclude=*/nullptr, #endif - /*Flags=*/D3DXASM_SKIPVALIDATION, +#ifndef CXBX_USE_D3D9 + /*Flags=*/D3DXASM_SKIPVALIDATION, +#else + /*Flags=*/0, +#endif #ifndef CXBX_USE_D3D9 /*ppConstants=*/NULL, #endif diff --git a/src/CxbxKrnl/EmuD3D8/VertexBuffer.cpp b/src/CxbxKrnl/EmuD3D8/VertexBuffer.cpp index 718781dae..2626a7da7 100755 --- a/src/CxbxKrnl/EmuD3D8/VertexBuffer.cpp +++ b/src/CxbxKrnl/EmuD3D8/VertexBuffer.cpp @@ -990,7 +990,11 @@ VOID XTL::EmuFlushIVB() CxbxDrawPrimitiveUP(DrawContext); if (bFVF) { - hRet = g_pD3DDevice->SetVertexShader(g_CurrentXboxVertexShaderHandle); +#ifdef CXBX_USE_D3D9 + hRet = g_pD3DDevice->SetFVF(g_CurrentXboxVertexShaderHandle); +#else + hRet = g_pD3DDevice->SetVertexShader(g_CurrentXboxVertexShaderHandle); +#endif //DEBUG_D3DRESULT(hRet, "g_pD3DDevice->SetVertexShader"); } g_InlineVertexBuffer_TableOffset = 0; // Might not be needed (also cleared in D3DDevice_Begin) diff --git a/src/CxbxKrnl/EmuD3D8/VertexShader.cpp b/src/CxbxKrnl/EmuD3D8/VertexShader.cpp index 5cf956acf..fb619e217 100644 --- a/src/CxbxKrnl/EmuD3D8/VertexShader.cpp +++ b/src/CxbxKrnl/EmuD3D8/VertexShader.cpp @@ -2394,6 +2394,7 @@ extern HRESULT XTL::EmuRecompileVshFunction DWORD *pRecompiledDeclaration ) { +#ifndef CXBX_USE_D3D9 VSH_SHADER_HEADER *pShaderHeader = (VSH_SHADER_HEADER*)pFunction; DWORD *pToken; boolean EOI = false; @@ -2506,10 +2507,9 @@ extern HRESULT XTL::EmuRecompileVshFunction } else { - hRet = D3DXAssembleShader(pShaderDisassembly, strlen(pShaderDisassembly), - D3DXASM_SKIPVALIDATION, + D3DXASM_SKIPVALIDATION, NULL, ppRecompiled, &pErrors); @@ -2530,6 +2530,9 @@ extern HRESULT XTL::EmuRecompileVshFunction free(pShader); return hRet; +#else + return D3D_OK; +#endif } extern void XTL::FreeVertexDynamicPatch(CxbxVertexShader *pVertexShader) @@ -2540,6 +2543,7 @@ extern void XTL::FreeVertexDynamicPatch(CxbxVertexShader *pVertexShader) // Checks for failed vertex shaders, and shaders that would need patching boolean VshHandleIsValidShader(DWORD Handle) { +#ifndef CXBX_USE_D3D9 //printf( "VS = 0x%.08X\n", Handle ); XTL::CxbxVertexShader *pVertexShader = XTL::MapXboxVertexShaderHandleToCxbxVertexShader(Handle); @@ -2560,6 +2564,7 @@ boolean VshHandleIsValidShader(DWORD Handle) } */ } +#endif return TRUE; } diff --git a/src/CxbxKrnl/EmuD3D8Types.h b/src/CxbxKrnl/EmuD3D8Types.h index e15bfb728..cd138e93c 100755 --- a/src/CxbxKrnl/EmuD3D8Types.h +++ b/src/CxbxKrnl/EmuD3D8Types.h @@ -48,8 +48,8 @@ #include // for D3DXVECTOR4, etc #include -#include -#pragma comment(lib, "dxerr.lib") // See https://blogs.msdn.microsoft.com/chuckw/2012/04/24/wheres-dxerr-lib/ +#include +//#pragma comment(lib, "dxerr.lib") // See https://blogs.msdn.microsoft.com/chuckw/2012/04/24/wheres-dxerr-lib/ // If the above doesn't compile, install the June 2010 DirectX SDK // from https://www.microsoft.com/en-us/download/details.aspx?id=6812 @@ -66,8 +66,10 @@ #define D3DENUM_NO_WHQL_LEVEL 0 // default in Direct3D 9 // Alias all host Direct3D 9 symbols to generic symbols +#define DXGetErrorString DXGetErrorString9A +#define DXGetErrorDescription DXGetErrorDescription9A #define Direct3DCreate Direct3DCreate9 -#define D3DXAssembleShader D3DXCompileShader +#define D3DXAssembleShader D3DXAssembleShader #define FullScreen_PresentationInterval PresentationInterval // a field in D3DPRESENT_PARAMETERS #define D3DLockData void #define PixelShaderConstantType float From 2561b68823de4f8895ef98c14b95dfee3f1459e3 Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Wed, 25 Jul 2018 11:45:36 +0100 Subject: [PATCH 0076/1000] Oops, forgot to include required libs --- import/DirectX9/include/dxerr9.h | 100 +++++++++++++++++++++++++++++++ import/DirectX9/lib/DxErr9.lib | Bin 0 -> 3710046 bytes import/DirectX9/lib/d3dx9.lib | Bin 0 -> 4383332 bytes 3 files changed, 100 insertions(+) create mode 100644 import/DirectX9/include/dxerr9.h create mode 100644 import/DirectX9/lib/DxErr9.lib create mode 100644 import/DirectX9/lib/d3dx9.lib diff --git a/import/DirectX9/include/dxerr9.h b/import/DirectX9/include/dxerr9.h new file mode 100644 index 000000000..3fc6fba30 --- /dev/null +++ b/import/DirectX9/include/dxerr9.h @@ -0,0 +1,100 @@ +/*==========================================================================; + * + * + * File: dxerr9.h + * Content: DirectX Error Library Include File + * + ****************************************************************************/ + +#ifndef _DXERR9_H_ +#define _DXERR9_H_ + +#ifdef __cplusplus +extern "C" { +#endif //__cplusplus + +// +// DXGetErrorString9 +// +// Desc: Converts a DirectX 9 or earlier HRESULT to a string +// +// Args: HRESULT hr Can be any error code from +// D3D9 D3DX9 D3D8 D3DX8 DDRAW DPLAY8 DMUSIC DSOUND DINPUT DSHOW +// +// Return: Converted string +// +const char* WINAPI DXGetErrorString9A(HRESULT hr); +const WCHAR* WINAPI DXGetErrorString9W(HRESULT hr); + +#ifdef UNICODE +#define DXGetErrorString9 DXGetErrorString9W +#else +#define DXGetErrorString9 DXGetErrorString9A +#endif + + +// +// DXGetErrorDescription9 +// +// Desc: Returns a string description of a DirectX 9 or earlier HRESULT +// +// Args: HRESULT hr Can be any error code from +// D3D9 D3DX9 D3D8 D3DX8 DDRAW DPLAY8 DMUSIC DSOUND DINPUT DSHOW +// +// Return: String description +// +const char* WINAPI DXGetErrorDescription9A(HRESULT hr); +const WCHAR* WINAPI DXGetErrorDescription9W(HRESULT hr); + +#ifdef UNICODE + #define DXGetErrorDescription9 DXGetErrorDescription9W +#else + #define DXGetErrorDescription9 DXGetErrorDescription9A +#endif + + +// +// DXTrace +// +// Desc: Outputs a formatted error message to the debug stream +// +// Args: CHAR* strFile The current file, typically passed in using the +// __FILE__ macro. +// DWORD dwLine The current line number, typically passed in using the +// __LINE__ macro. +// HRESULT hr An HRESULT that will be traced to the debug stream. +// CHAR* strMsg A string that will be traced to the debug stream (may be NULL) +// BOOL bPopMsgBox If TRUE, then a message box will popup also containing the passed info. +// +// Return: The hr that was passed in. +// +HRESULT WINAPI DXTraceA( const char* strFile, DWORD dwLine, HRESULT hr, const char* strMsg, BOOL bPopMsgBox ); +HRESULT WINAPI DXTraceW( const char* strFile, DWORD dwLine, HRESULT hr, const WCHAR* strMsg, BOOL bPopMsgBox ); + +#ifdef UNICODE +#define DXTrace DXTraceW +#else +#define DXTrace DXTraceA +#endif + + +// +// Helper macros +// +#if defined(DEBUG) | defined(_DEBUG) +#define DXTRACE_MSG(str) DXTrace( __FILE__, (DWORD)__LINE__, 0, str, FALSE ) +#define DXTRACE_ERR(str,hr) DXTrace( __FILE__, (DWORD)__LINE__, hr, str, FALSE ) +#define DXTRACE_ERR_MSGBOX(str,hr) DXTrace( __FILE__, (DWORD)__LINE__, hr, str, TRUE ) +#else +#define DXTRACE_MSG(str) (0L) +#define DXTRACE_ERR(str,hr) (hr) +#define DXTRACE_ERR_MSGBOX(str,hr) (hr) +#endif + + +#ifdef __cplusplus +} +#endif //__cplusplus + +#endif // _DXERR9_H_ + diff --git a/import/DirectX9/lib/DxErr9.lib b/import/DirectX9/lib/DxErr9.lib new file mode 100644 index 0000000000000000000000000000000000000000..b08af851e9078d366bc0e741d622ad1e35ab62d2 GIT binary patch literal 3710046 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

0(YHx!Jyu3+So1Ob&= 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

rS_v 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

CVbhOY~p$7}?FSLiyJ@3tW+$QvEp`QwUPw1OM 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

2LGnUo1i|Uc@FM{HYNe-?7GBC>Y7uEbn`g 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%0Dry)6Vo#r^0 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

>(o=gs8$dT8paji}VbmT=Lz7l-N@7Ujyyi@%^ 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 z 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%0DUs{N73)zdnEtXzR(O?{n6L;-mo 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%0DRO7{Jq>6j-&K~vX*FNS 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

T-5X>?T)l=n5^KnI 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�eul3^fS3O(x$=Q=`05ka&CO7qH?@guU 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ãLC9dHKajbTHKB|&4ab?|@RH~#TRoacX>X-~m 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 z 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�{Jz@gi>EB#9Ss11Cwmh#NRb;ziuRNfIyO22PTA z5jSv>#EZCrlO$fm4V)zLB5vR$i5GDLCrP}B8#qbgMclwi>U>3klhpZ&0w<~S6$MUG z=PMeVq|R3qI7ywa0C18zUjm$@&X)iusq-bkN$PwFaFRM-0-U7ImjEZJ^CiGZ>U;@s zk~&`koTSc|04J&QCBRAXLcSz8DPF`4oD?tO22P3>aRVpCi@1T4;ziuRN%10X;3Rau zBsdA3F9}XU=SzZ<(D{oljqCH88zRM>uW#6nd}a8PMrmZSz;olv6ToJ!mt|Kql+%^^EgWfOL&Ny*-!EME4iaPOlMdr(&Cw?Isbj-iyS2cNNLI7`S2`%${GrSqPPM&Da-aPkl@;s#D0;ziuR$wRz|8#o0hUf>2!F~p0wfm00e zB5vR$h!=4KCqcZ38#oEt4{-x0LA;0?I0@oK+`vf?FX9GHf_M=(a1z9exPgEB#9Ss11Cwmh#NQw;ziuRNf0mM22PTA5jSv>#EZCrlO$fm z4V)zLB5vR$X+OjboFwrgZr~(|7jXk8NxX;~I7#9~+`vf^FX9GHlIla;z)2D>;s#EV zco8>nlEjO+fs@qv@_>`n`SO61)cNutUsC5Q0Gy=GR}45wov#>hk~&`koTSbdUVHm@ zKg123q|TQBC#myAoTSbdagsV;0-U7ImjEYKAL0g1Qs+y6lhpYlPEzNKI4NGl4V)A& z;s#Dq=SzT-;ziuRN%10X;G}pFH*gXCE2~I-i zi#Q3LFXE)mGjRhaq4PzYgwB@)C!zBtsSoOWsXnOlrTU=Gm+FH$U#bu4d`aqqI$x6d zpw5@-gF0WT59)lWKB)7h`k>C2q&}$gC8-bUe5pRD^QHQr&X?+gI$x>}>U>G+gF0W5 z`k>C2>VrC8st@XXsXnOlC8!VTd`aqqI$x6dpw5?|KB)60s1NFV3F?D7U-&vVC)fE> zeNg91^+BC4L48o?OHd!w`NHdsIl0c4pgyScrTU=Gmq>3_<)QI&%BfWg#=iDOvG@_e zGM;lW=8u%wSeZDX^3l%xF%=U{a6G;7zU42AqEijN>uvcYTy|MJF8beBXh%pIcbqQI zzvap)BTiRh3+L@%*R}@B<%hRB<2)Hz_IROkFVE)u}Q88G0e zr%8vRyu=?lW!sqt*!5{ESfmV=yBhklrymlsR0%`n%R2L%sRepD`TB&*M@!;5PaYoj zhT_^+OX_8(RZA>i9%(IyjPuT@hdsqaP5jB zUgyO3Ro-d1c0r-}-mqgQSwN+na&vScp7#V}h4%-``K6Y!h-S;3j`+O6b>g#`@sl}a zaV@?saIP*1R@dHY<9f%831W$SbISR>IB&n|l#^~puv~a%8+);#u(Jw}xBuDnY*xTr z?>0Q%)ssd!O~T`;$2+dvWiM*&rJ7UiQELy?oNA9+d#L7Ad(=9RYEHFBtplm%RD0A{ zP@SpXsINW%sesx#Fa^%YcSsyFKEQk|*ZsIN

W%uwQk|*ZsIR0tQ@v4NL3O5j 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�{Jz@gi>EB#9Ss11CYeh#NRb;ziuR z3GW+7Dv297N#aG^z)2D>;s#EVco8>n62yzRfs-U�{MA{ja2wxPg--Uc?QYB=I6{ z;3SC`aRVoz^A!tDQs*lcoFwrgZr~(!zM{cN>U_n3lhpb0f|Jnsa=}UJdn5;|YRN$7kLC!zBt!AaLoi71S zLg$M(;rm}IU&Kl1d`WN;I$si;gwB_wKB)60s1NFVsXnOlrTU=Gm!v+Z^ChVd>U>G+ zgF0V=`k>C2>VrC8st@XXN$P_-Uy}Nu&X=SC2q&}$gC8-bU zd`aqqI$whNpw5@-gF0WT59)kL>VrC8lKP;|m!v+Z^ChSc>U`mA)&RWkP322aAJq9$ zeNg8MuY37&oi9OsQ0L2~KB)60s1NFV3F?D7U#bu4dL|0>`-AKHNNEJOLr zbUmDWz27kU+M_~|q%8Z^!hCA7Kt44^CRTdrShl@pfBd{&diMFC4;yoN82^@Yw=?io zQr7YKaNa0*rBijYhi&y4%9pmf?L4@5iP_!S@EbiwvNAuykEUP zKi0M}`+hVI%YStkkIZ1Rot}rz%oD?T=Eo16L$fonh@3I1@(uXCB_Ykw#K}Xvh#NQs5-;Kg zPEo{*xPem)@gi>E6id8_8#sB17jXk8mv|93aB_(kaRVopco8>na)}pl11I&hB5?yJ zLA;0?I0@oK+`!2tUc?QYT&fRo11Fbw5jSuW#EZCrlOSHi4V(n=B5vR$h!=4KCzp5; zH*gZfi@1T4AYQ}`oCNVAZr~({7jXk8LA;0?I0@PhaRVnoyoeh(3F1ZEz)2D>;s#EF zco8>n62yzRfs-I!#0{JT@gi>EB#0Mr11Cwmh#NQwoi7hK;r$jWUxDBxbiSg%N$7mV zfRoVqiUlXB^W_C6q4VW}lhFBc!AaU;@sQoM*8I4NGl4V)A&;s#EN7jXk8#f!LslhpYV;G}pF zH*j)wz63a_^F!Rg$<_H1;G}pFH*gXLoi71SuFjVLCs*f7fRn59CBVtm`4ZqH zbiO3@L7gu_eNg91P#@I!!skrk(fJb82X(##^+BC4Nqtb~OHd!w`4ZFzb-o1kL7gu_ zeUSPgaicz{^M#+QOt1POaicz{^ChSc>U;_6gF0V=`k>C2pgyScC8-bUdU;_6gF0W5`k>C2pgyScU_D>2X(##^+BC4L48o? z%cVZ3^W{<>)cJC$59)lm)CYCGT~-{L)(KpyXJkz+dUj0HsuZ8LW&@Dy&jr%mk%YewnPyP#Wcz*~$W?#VRev ztWY}4(p%ZA>`(^fm)*(%WyC5YMjt4X^7FBLq0Cri#+Vbzf>{=fxuC3=WwUZyd7$jd zFOQWM%7Il5jQJoR<(JRO5BXx{i?INdQ~4FJ3PQQC%54?03PX96Uty~VlozYK7>h#r zlwVQH56X{KevHMS0?MzLRU9gaRUxZ{RT3(!{7PE>P!X((U@Qd{Req(c(vTlkei+L@ z#gtzet1MI;s}fc@D*!5~`~s{%$R8_zj2@_z^7B|;s5DlkF*;Bg<>%lRZZbHPfeW|F zLjlUKyj1}T#3~SDMaZN4Dq58wFIHZRl_5v@Rkr?s7*^b>VpWC8E5E8%HK+ns6);wZ zDk{I~Rt=~UR+TW;geoh)npQ3753H(KwXHf(RpnR5stZ-asv5?6P<7>3&#DjAz^Vqu z22f4q*T8BB)xxT_)yQfL)lq(p@fS9mz=8alSWTgN%C9N@rg#t>$S=rh1~pKA&8+57 zL#!HEEv%MMW98SwYNGzEtOvf zt0UA3t5z60L9LZvC#y5m2CFt0yFhJ~Ul*$@)DElmRyV6V)Is@mw|YPwvFeDiC)7## z^|X3How4eSF&OHi{DQ6CP*<$FS$(V!sJrqDvHC(iu8+!_H5!D);#D>tp3C}ADW^3=35J( znOM!T7Fvs-*~)K`wHTU%)f|jVpt;I#iM14(ht)ic%b@wnZ<)0mT7cC;YlXEETBQ6| zTC1SNSS`l58d{?KR$FVJrC2S+xE5Nb{MK3#&~mI+sQZl#C-S4ejT#3I>$8!?*>C#4HlyR%ktD>oIPFHej{^<928x zW*af?fHq;49CwYK&}QYg)7k}XQGUCu-OyI$x7*qSZBu@Gti8~7<+s<0f_7k)4tI@c zXs7avwql@NSna|X3+={iH%1rQgV`R80@{n&UW^io!YnK98vCGV<+sn;55-^=gYf_q ztNadF2O(Ga9kdQXLiruC4nq>FT)1l-f%YlCBi2!9KUVuO9)k`jzhl;M=pa@HF`j@9 zVRi`PN$4wuAqgWlqcp5sU{7zeEpyOB_$9NVxq5RHT=b)2V6~|rU zJakI=owqJPe_{0(#*5Ht<#*A#1f9X^493gQS><=xx&ocUsx0mrSE2LD@2YhTx`5RM zjMt%y%I~^$1GdcI<@eZn0^P&v9>%B8edYJmdImkf zsuu1V&!LCP@458?dW6*@j4z?b%I~H13VMRo6O4aDPnF-_)@$e)Rt<62cmq9Ges8RQ zpch!Z!1xw=sr=qr@1R#$y~6k&`dj(Ew?06xv1*RH#z*Ll^809gg8sqkAB>-&x61Fc z^#yu|)jNz|q4&z~tMv`~fK@x(HNHb1mEU*k2lNT6PZ)nfpOxQF>lgF|t1lSQ7VNLe z&$8*iZ}9DkyG9&4j{RNv#j)c;Kj8brifhM%ek#9sc6{g;e1BQ-?F5j8m4z`OWMkDE zca21LA~=y>B0Dh@7pu4!lR)t>i-$2O6d$wr7?VK>FiU_jIg}8yfw*g=uv5T+{8HE{ zp~T8BrJV{&qWn_XsiCCGFSVTpN~ZkM*lD5UScT%Qk2(z zFlK~OW0o3YCMXSNX)tDn(qc9Sca1D|7C4Y!7CS4HUioFUvq2fK%78IDlu`L*w{t+5 zlwS_p2g;1qWZX4;ZC^N$pRb)0%BuWw+PR=?SY^YQ8_KTya@%>J99ZSRm>2TFY$om+ z`RsgfAisQeekiB%%WoHea$%JVV?ijl@+)W;g7RRM2V-F`>TYt*o7z=8Z~*fpU) zlwVD|7E}eRDi~`+RWYlIu?|!XvuYUYLe(*oxNFq2>%oEi>e=<7n#!-f-2keERV|DS zq1wu?q1_0oqx>4#jiI_&9mZXwiQNPaG| zH@iF35vz_EdqAC(Uk|${)ETSJ7<)loFuR4jMz9?W2l5NHdqdrnUvIk))E%qt7(<{Q z$}hz33-!dRC&qqIFU%g`uF>D_4+rw=Zx4WaE58BuK&TH^eJ~D!LX_Vidoa`&tG*bA zK>aX#hP%d4dng>pZ>T*C8le1!*~6iMSPjG&3Jp?zp>`NF7^}e;!=WLVy~bT*ggpWd zC=9DGjANm2%s$}$GtM3d2l5+dkB3Gozw!12 zXcShXFiwOnv9u^yT(jt3T9I<&Vr^YzghNdXc|`2FwTLdE5AARTG!L`nxN9th<}1IY_A+Pz zRtqpLhZbVC5aSAHk@8z%uY?w3wHV_nXbEO%ao1Q4EmeN2?KRLctd?P13oTcEYwZYV zh4PEA*Fh_>T8S|dT7_9=+%?uitCin+djqrvt2G!mLTi=ZMtc(!fmH;?&Coi`)?wTN zMPlZIyT(>%z4F^?Z-X{qwE^RHXruDmZts9LVYLb4PH408+iCBDwqTVPca7c9R^_+b z-UDsJY8%GA(01jw*N%dAV6_8dG_+IsMcXmZF02aUt`Q6ER(`Rz3+=&b4@Lp)Rer*j zP!v{C823TZ%5R^&ABw@M1nxfvpjhR1z&;4MSh*MvK|=W*vJXQND~a(4v`_gRv5!Lg zu_~+XH|5|&essSHfCKr_{U#7j0%IT&33VMpwQ;dH@&y>^O_G{=lR?jiMfnF%5H*n~Jd%-`@OXc*B{T6zK z)hmqepud&VJNrHK8mreBKR|Dk(+4>8!d>7a^pA4-Xn%sBs*O_a^XB6zTu}O!ttC5J}WgBcg^w zMNtfdD+VPYnH)eMkc$W*1d>1y2_`d<2=N-?I=16|?R~iH>R!68ySnSTCZHnT*SeW6 zqUgFSE~xCvV$?`}@29%w%4C4=>;HYd{`E|EJyreGr|W#Gx~8kzei-@^*O%A>&{qm+ z0E7-Szf356t&nW;xS;ie*l)LMV!lyGnx;dCK|E~NH3u}HkQ~~}gzvHs(}sZ|NW-)w z$d1d7oeXJk8nzSC;dJcdAP1ZS`(?r#_Tk!a!V1!GZ3L90kVa@JP_jZw(T<0l3h8)l zBy^lY8VQ1do=??M2`fmcS{gJ$A*E?2Kqjdmmp%WF-saiU8l0r%c;XZWxY1(Oo6{OR&QP9Z>X_R(4bPBFh zut!6uDx}fc8BjW|bnKT2|A75W?M%W7(wW*>&?tp;mX-mXj_Y*nG0oq_8N z?3W4ukbRssjP8$!MrI5yJXG0mdGO*8q#wet7v~!`cxW;0?O!$ZG6SN706{HE; zdC+);be?uTbT+QDu_r?3D5Qzn1<<*;&c%M2@V~cTs9i`{LAp?z1f8dlCTSNz=i@pb zI}@6ykTSK&&;__IzIrdVh0gliMF58ABoeA*VM6IUm87j%un>(Xw7uElko z_ATuu=z4{BljetRz;y%m&5%#w-K-hV7F=7fZ-KfL-Yr@Hx)Im6v|F{?pqmulZQAXS zAD18d4(MiucZYT-WZ*Ke?}Bbocz0=cLjhd3s`fAkB*ByRkPm|3NqZ;&N${jSxIqv+ zX%B@U30@&>q6nnBI4{t?3*7^E5BB$|a4YgIh+e{x$S-h4*XiH_(H)9>jha zdPw0ttUUt#Lg784{TBMA!uzfEDD*2_tEkn#gMO{>ey2SK{RY=>uzwFdtnhxX{Q-Ie z*CW`EL%)UlE%p=8qi}1f)qjM3r||x${Rw&u*JIdELcdpdPilXL{($Qb*iS)^E4-() zzd%pmx{_M`H1tP>_q5gx{R!8fuzR2<6<&|F4f->#KVxr)o>F+*wP&Ee;Mz#7einLK z;XSK82X*7>#@+$-D7+oo^UyY2+pu>++ZEnU?FHx=T-Q>oUxc1jcrR)%LC@iO4*O+j zhr)YVdj)zP*Ynt~LOT`StJ-VO3%G8iR=*CtsPJCb-hf`h^%C}*(8~(%P3 z?pE#L9*_i2+QYpd2%fZu`#=&rX%F{AC~@2HbBnhdvBC40l)?rYAuIa5gpY5ED!aD{h*ej+qN z;hm_T1f?jvlXMq!Jg$-Y$@(c!s=_-(KNU*Dm4=-Tod9s0Kspmc?ImYxBfrtmWKG0-T5H%1=|osMg?K29GGouTl? z>t{n};yM%i9Ox{CcaDB8lz}S)djd2DZVdK$&{()}`uX}qXuQIks9yk`jq7ae3!!rq z-i7)k=v-XqVqXMJPPfC+*>VZ4$VX zbZHMCXcsBG4`>sA*D}HVJGFX-K0}`jHyL{-GzHfb>})6tE(`l&Xe!)P>>Ows+%)W2 z&~&(eQL8V}F9AXDF3~TAW-7c(*;INq2!c0T&xI~lc)5BWl%w$S^f}NhT>qw4=j-_( z2wuKk09~r^3UoI#8`o^?LMT_^73xJ$9VrULrAMK+=F9AXDO7yuLWMV9FNKP56=5%cis1&dBz+-N0#|}v2F+D?W%?p$9Et}>ZMSn!dt2@ zgQ^tXGQAe6##N2I99p9Amg{v;4XzsO70_jHE^2i>v{d2M>novUxRznBf@$Lgz9kBVK+f5;7+GjuZHRs-fDdfv=Y}!>}F_{!fV#oLJbOUt$sPwh^rBM9n=Ij zmRfxUv|8a^p|6M5;97&-0yQhV7JUP>7S~$rE1}EbF2`<#*1?@e`)Gr%PEWQFvax9om3v1NK$Wl?v}FeIwM0D^s31W($- zG>`;u8f{`aNLT6C=~wF=9M|dBL!00>Vc!64hTDwogF4|lvA00iz+Hpg1zihwBVju@ zZq&a8U9XV7rQZbIppb6T{g6)~`SqKjEeh#o-GI7q-9p$7j$8Bq^eu%H&~Jrq!gUk& zZIB<%k9|9IGu+MCcR&W*orLY+xKqCi3Mizz^t+*3aovi24|JPCx<|hkx?LgNtKSFR zf$M(4c5vLUe;c|>A$?o_4sc4`1hU;h8zlMIUkbbTI26_sQ#ngMO`$ey2YM{RY=>uzwFd4EG1Zc5wVbe;oR) zLV8?(0(unJqu76hey5QBsQ(Fi4A*1WPeQ+k`!iuXIR30Z1wF2ip3?sUJ%Q^9?5CkW zDx|0NZs3@Y@RY-r;--cep^&0lypw|`B-}GMS z4P0+v2cb9N{)ey~9RH*5g8r(IcIodxZ{vC!dpGnqg|u6L7wW~;i~SxHgxf>d4vszg z`_L|h^uGQ9^bW3fu>TJ2R!D!>KZM@J^)B{5p!eYZN!SjKf9fAW?<=H_^u5prxIV!C z82Yl4vzi$C(uU<=@b1^XfLk4*q=ckE2Pi#1JJ*4{R{iw z&_1~T5VnKkKl-YxF;W!M!VeDbhfI=GPNP=v*Y}m<=9hV*332AT|_HmF7cQs)< zI7G{D(uX+&NwoZCJqa$!AzHpuPgY2x<*(753h5d&{k8gWAYF^bPIII=hQkfVJ^>nm zYXtU*PzqcM_DRt3aK~f2ppkGRu}_9l;kwY`G{%!mD&tL1nng zu&bd(a68caOB_o;5WFRh8mL_1)i^GLDsWX`FNG=<-crXhs0vpVb}dv5_cHo_xnns9 zg16jJ2h}LNI>!p=GF+Eo*F#GcUcF-_v<%lW>{U=L+?(_Q4UPs71h2u-2-PXPMn@C0 z0@n)c)lj{{TkTi_t;DqwyBS&q7o;y(>sSkd;H`CB4mB#g%N^^WCR|O}S3s*3-W87Z z&>CE8uv?&JxcBH0HaIqbAb1-bS3;L7yel28&^lb}u-l+36keOd1Fgrk9@`7G!2N@M zq219Ag5b3~u7a*qcvm?#Lan%3u{)qPh1cP@8uH-sU~huFaQo;THaj+hAb6V{ozPVZ zuhVf2v=P@v>}#P8g?FvvI_PR#S7TofZG!tZeZ&op8$b}e8yr5UQ{nj>TcB%jU4z{P zU90fA95+JO;kpj{ThR4zU(nm!9Y?sMD^-HGc?>~BMN!5ydio8ce`p7b{(KoUIZZ&E-I zJn3(a2TAaxzZnUF;EkluNd@VC$BLOY-sraRw%(6gY^*gB&L|k~G%CiY1PjJHf?o$m z1=F{saKXk>A=BuVE$(DnrLlj}qVlThryV%6-cU=Y{GEL}-2LL=>vYAOSC3`THrFyOB}xLq$YoQ;4;0*U*_=bNRg}f`L;Q( zAD9n5QB1w1dSGCnZu!!k+hjGCjWtq|{xr@fC~gvGaV4?RCd8G8x!=K=Az*AfI3!~n zHs_n-9>t+D$G1N%I81!1dn;422K=4<{?3E`&I9l5Aqt0{DY$xAaBr|SrMEKey**)P zT5qi@%IV7Pbb6*`ccyzX$;{p}1Wqmw+mt~*M!VC3Zda81>fukUbGF~~@xKUA9&q=U z4S1bvPh69s*=%dm*QV?hAfq?uz0_MC7S7#oII9Ac2NqYC4J?|aoPo-N%2i-^N9TOu zIc4n%6)0y%jo;npO@4BuE%~~A9`0(m4;rNheEU;^%f>s26_$g@21kz{@b;NE5_o`f z6);ROfRn1$+|I4TG1)x9NHR+Mjmb(hg$VZzc>4#c$|RbbM@Z1pbY4g6>|Y**OLRO* zDumP6zO-)VwsaQP*;oW7g;&k_T*a*pb617AAHj|1aPjK9%{ESP$JxySblJ{_8>{^4 z;l?PAlWkz&+H1w$gs+q?3oTT!XTT@hRMR=UO{%s{)hw}*ROTYimdIBLM5ZbcT9$8r zX1P)8s;V{)WDRs3O1)7E((iq3m;1HOq+V66DAi!?UcdXpfVDP?L|38^$w{t>Y6xr^$jf=v z-9E()xxKMD7~8S)C{@-wKCq zxe_naly;ITIGZDhb$%hP2yT}0YY+R~6Xw1fzPc-QXRgh5-9kKUBWUpC;ijI`0gLDd4aaTZ*aJ%6n^5vUXMbYy17ReW}xYILUi1_r$P+SI!2TBm19cI{}-g@g3m8H4oP z@rK*w>(g6@`3CehOUZ2mt19*39f8vRMd-P}RGX#h%Bqxl$=RNIi*!I?y;dHj<@y$j ztAN`KcwNShMT?BmgU6!6jLwXluRXH^j`r%FJzANm#}4Ft-gyGI$=M#(O3&>(Thv-| zSh1B`Y7N=VZz;7l+HcS5US3CmkB-t_qQgu*)&ytjF)479dj!tZUZ2BBak^}$p=qST zxHxRK6}UtZCEHF?MP8zK>9q}|8p@5{AB$X7^~C4tw7-LFV5;5tdh6D$flVpKfvsD8 z-6_89>2$MOz5fV2x(DTy^LE>XPY7sWu4CeBO~%IlCjTrA`*4%L<8YHPQ!24PJ1|T0 z^(5sSZrv@N?DixA$VeiI#mhDpISZH1S-M`iW@FK!&8lTC71ss0m8x_yC~@?bI8m(5 z-V%qhjtiy-mpFn;oZF-lnW|fCvzpT1!G|hpRo0NM+cMOUg~RC94cx0&nHf%yJ{xwX4csyJwesPjy(;UxI`!;C;*J3lyhI zqg0h9*yC$Vq4Tg@hl4wVJ@0-=7qh$9@~Yh*{4`kmmYjO!^iJ?oYE;N4urVdL7gYT5 zZSM?zs=6_{oDYTV3)VhQUk00(;+MYYB^e{p52fsKr$qHbrTgjnLcQAFP!H5^eA!!i z0CYMZxuLrcC(+U$`L5KGT+?x#c-XROr>WSQ?Ko95weX?pTb{M6%J8Q74iA`078Q%S)R&w37xf!8 zRwQLkHLm*?a`I&_%ta9CGLJgiC|D744xNvSrfzN_j!q@qlrx-T+^cg8CT>wWtF zm3DNgiY|k7mo0zpv;U7+}x~=jw;^%Am;a?hlEDMnzO=Mq2&o zgYZbJFz55uKg-Cxk#SLau&4J0Io|CFeif|jj||uIyvZ_b`f{H}b%&8krN;Sr-s6JX zdcFO@JzV-UxUJf}mr>~qernL{dIMgokyY;5Dh(~v=ytgG*lgE59q6F4Q~zlYU2kml z=)SSGtnS>dUBtei1$546CR zlchv@oq@YgmO?VVBqF3kV(UK8JDhZECI6f>bd@vPdWWM4`h4!b^sa8nI;DkB!YtNT|NKQdT*H~Q8vC*Im(#ag^$Et#eA<)RcStVTDmH? zt%ldxb;zUpT{q^=u_E`FDt$Ad)B#j1H`s5LK3Wtv#V%Twtk@4=)}frYfpFY_8dZbV zoVWdz&i2y+9Vk4;$Q>v=hM{VFoR{-L>qmLY9a4B`!fbCwyVoeq2$b9XrD-w*XOK0j z{o=qZMzAvjvqmbMWy8S>J%H1ul;`GAcKu5WJT&-rwmzpqmN^J5!|h^uLgx`)X<2im zJW!fuyzRZ4oBDdR)Q4Zp%X&i(W>-4v+E0%jYRi+q8d=ZDsdTpfLw_Ajt!4vc{H_L6 zXHuI?#p@1p^WaRi?1Pg*RTAs-L)_zVZOU&Wio*EV%hwK)*t@Lk=W;pW7Gc!loetWncO8Byc( zD@d)`6Lp5UK$!ag&g`8=le6P+xolN%QY~Dz&2VECw+(KL;yBq}$0ZN>PFs>16KsOF zdaMbI6=Z6FXU|<#(qr}SigZONp01sNErH$x(qrw1TOxf|>E2y#W(wkZEEFK4D0(a& z&8<4icy#Jt}@1;LXSN-AsT{2tH8&>9Oq$s^s?S8}EYgE#i z>^H|~g*pEQ-A(U>TCb)LL!BQCcq!|&tT#~pb5NRA zydWByxeM$)O8LqpBg&V@pE)^iZf$*Xckh5ZExRvzBzB0}wGvBZVnb)AO(7D%$>XkueVa|WdL1xw)a|%V5sWIr416<1a zPkZ|Uk|FvwP4w+0fmuv4Fx4TG3^LWh#K#f`bwO!Q{4HIpsVR||`Hr;K?WW4*_NK~} zn=6$Yo~;-tb)s_bpzwV?ha)OCO{rWpLE;e&FY-#uqjJ+iDwk+0?X5;>M^?F;smrEP zeIU%q$ZZ9O`84<-iuFa*=rBu#UdNTth&Zf5Ya=Q&T7S|s($I?443nKpjZT+2!QiYD z6?s;6X}V|BAQd^>_qAxi0WG8fU*~R5i2lpzZAZ7}^l|R13KR{bKD<3{hQZgZS(6N1 z-Kn?8EXm#L9gR*u{JoQmSAl8C?f}UlBJBg;FE2Wnwr-& z%4N*q0h?{LebS_5ZENZ`G`3AzwL#Py(><$NuGlcCx#54tox#MZJbg}TXl-2OX;%S( zG9L8X8x6SC20jUups}_r?m~n$%G5skeNoDahRPQ&alcA53^DA};ZMutn}{ z9yazsv#I|)B0i#k*YJNx#78=E`G+LpQ;g39B5eB9t@5sHEUaKZju@W`#;vhFRW|lo zijgU_vC~$Jk36o2eI|JtH+oDDmFK$sWXq+WGxFNV97kPPCWAOxIR>^g8qn=&oF#w7 zIFw&BvNSW@zJs%Hzp+2@&xmyB?nyR57IVKk%PE8Mh`tvOPlN826n8JDl9B0hneKV- ziu}_f_xcGwVw?(DxX0wAjND61k2=dKM6W69n zPuwCyx}rkK6jdbDO*z+*h)^h}UBZ~tSh2Y=0^iu2cgE$0OoOqPiU44){^5upo5*!- z&FhDc^9i%W$|$%H1gpLpwds#+*M%PeG>V2DMQ))$NHibFm{ z$*cfF+C$B{)QOS&X}6G1i9?ntq*&xr;*isoj7QEK->m=Ok@9 zhb;e6>h^J*#q{3#7cw=J8^5%WN5#dNraK6ER2=eXB_s2V66Y6wcTa94&O0pR(Q(M~ zOcERC(Q(K!tk7A9Z`Q-^)P~v!@;estnIOm3!?RSVkOt^@Y5lJwDGeoAWMb=KMog$n zE^PWkBvhJ}Q6du?YD`S1_TT>_5DArGg%X+AIyP2?iq_a?#-&|KN@rgpQ@>BFd#*i_ z_DlW5fY^^&l4w=S`j0{Od`~C1CHbe_+Kk*ea(afJHjeP;WvB(qSkS|m+GP)97{^>od zpN=5EWFcP|7iSqS#Ufv*!oN?5I!|N$h89oB`iACJjcp<4f|k}R>emf+7Orcl_k=ym zTH2aD%`NNWJuJD|bWp2W+M056Yl@bXmgSXZ=3Zu-U0Q#6aw?~ zsj)SeO;l%3L4fNeu>z%yZEFgv3Uk4zs{?UeZl+~I?io!pn#7oKtY~TVw#CPiD3&N> z6Ju)Ts_e|BhLs_VsZBE#D$&T4$W^)XD;6%!%FSJr=gzfK7m2iak10f2a-~9*#1OZX zY@1yW3pd9-JFhY`S7lcepb0T~iiud(vaVxw%laW8OJmY7H6{&NO=iY~(v%fSQ&e_` zkf&stcgpWr*Sx-g0+6yEs#v2lZROw_%$PD`)wKFm(d8Ki%(Bu_zF|#cYhyfqkyRd% zOt2&==;0U5oR*mpWhQ54Wlx(qHEZ(ZC{NhQnVHk4PtVAhGJSe>mb$cJ_vG~8A?Q(;c1}}uX-MlOEMmQVUS#|Ep1Np=ttx-I9AHABg*93 za&x0cZE{Jp=naG9GSbpkM31yZPBh?+$lYtnN-}cOxNp=bP~-&fN5_cwQ{)~y3ZC=} ze>q0H=aK6@3Z9IUKR8CbPmufO81Rxqk4a#QNtAylA~)8OO_YB%gueipt|+-gc()<* z!zj6-$|D23hmhGBC6@^AO=SKaB{vk_81O!^WMGv^gg27G>6tP>#Ux7aCaz6D<^fAi zx}HRMk0Z0=D0njNd)<`lIloo;Ji^>iwxQWR5bq zX_>i$+oi~zevEQw9i!a1W00H6eb0@PLmxzq8zkz|&aXu7dP_D@xe165(A;_%X;VwdAB66XA6r<39@CeT2UYne*jg10(sK2yZbmD=oQ1@moUp zb;vvuC6@^A6=dFxlFJ=JPs%*ZUSu-mu?BOb_$@(ZjU|^Tez{<@BJ*gJT%!2>8JU-& z9%BGl}Qx8 z)fqP1RUBdx;YszpKEr1FK8Khi#qYNnlpTkdM0gckdojaiJ8O(c@wCX1D1Mh9Q)MBw*r|BmRusdv$=3JGC!2bCd`rIw*#5KS#pW+rg7nYWKNMOrla6p zip&B_E)m{DE-XRDcae#A99E+Gw;P#HEV)E@q9?yV=A=v$PvjEeoq^1SQF6IMjQ>^; zeg-o4S#n3xlfOsi*`wgOiO{RaxTcu#a~>gn4aj&bxkTxGfbiEKGbYQ#OAg@;(nFGM zt1TH*GO^yh7rCEVvWf0{F&7>|=3g>k#H4T}%IB5S81r(7Nrd+UGIldEqq0poQCkXc zP&&rpfA7VnOz1q+^V?)D{_z;(q&fcU8018)xMUC$Wz6wzz6e&%gY8Emo;o$y{sXtVPm%We!{Z# zEh|@gmbI*0yR12D=JaJvE$clkUeCHo_{_AOlxF7^^8FlUvc}2zf5wd|ZC=&d($>=C z$(XSCyo`k#xI^>R&FfcZt{TtvE>v8ypE1BWZ!QticAB5peBBWVDBL)e{`246sW0eq#&Nh!9 zZ9M)2(e_=jdH-`Oga4S-Q|Wwk+U2P$ut~ zac!kTUNB4Q9mAVz!9quGJ??&$hr##Xk-{+7ab7))_px_w&+6W}y$(OoRxUmx7Fv=E z!-u%cKZvN5uZdfVhsl%BVb4FIHJE3Z{`Gfvy9G2L{U4yoCrWqXyKhVORH6 zC$5n&rZcPiV;_!c6nKz78u*)6tqP64$MKg-1NXS^)~lQJ^OT3c4uuUyxW zvA!ikv`9u<<2p1>V}sd5pX46$Fw4r0*RiY>bjFQ;rex$TE^EtF|@U9I9ik2iL{N7DFkQyjsCwu0oMI<+4exMcRzyffyp8 z%yQ1jwyMyg-~%)@&natixg2Wp-VxS4d68_pugPKaC+#S7N*aylmTwn@X0~dnT_%?S z7rA4k54NkDHgQ!|(nUs*GrP#qdYZ3$ioeL&vu9Y@z>LscYdjnL$>mkXRgRv24%26> zd4wBCPj-ljKhdGIQBw;ecDecZ~ zbG(7YxBXPpEOcfUI$B3dq6(b>M{ds^y=-85DDE|$EPs+w=rBfdDd6bI+R3}^*|H9^ z*pYhAHs3bgpJpsb^Q}m;`Bu1WC9KFCD0C1r(eq}^P-)I)nV*palWf+u8l#YfRAHCzxr}+<_m*0@USq!IT(f+;G+8s9@(^NjQj8{- z7v^Bp`)p!kloD!(K|vL|vJ2BB7aIJ9E|mrC=DKq_ks7akJLO@VY7~;z6u+y-sCM`( zdZa`K@+sNe?WceeNo_8!Xd_CIdn|Hvy`g`*uW!)d*`7b&MICy5Po)i z?|uFApANK{Wl>Y-zdVIzUAvSDb|To{=5Q&k6^URKeq!vlWS7|Yb4Uc~-;Z_i@DHMb z(2Lqw!bvBY%PLMsFwfbW>y+i3=Fn)2+yY}aYZD(lRCmiuGZv*(87RqWX*aXxY;D>) zke9~5!VIQ585Jx=mGXlsSXFh_082nS9PQ`H))t0c-x0JG_G-Qz=|q9P-HgHUm!` zdXNfdy@GctSm_+Z@CgM4|0ujQ1{tklzBB6$V$ULYYx9T?{hfQ;PvpIF!|{k-oTisK zSe%sB%F4;;9Uc}h+AF9zJJf27w_(FCC9@V|s^$L|<$us{u93wIfyxgTSIh1X7g(32 zleB{EH8+B=F5JikqGY%~G`xGu{Vav++|P~{?aPVQfcJn=+GnKPWOSq%H4d}eFxOWs z>>6On5o+&mM(O@0dvQO<;U>G2*U;yB_p^h9y>|Zqi|icN2BsDU981xRU>okf9Cupl zPqWw(faMvi1yrv-Gh)aZSeo6r*K?eTBk?YV$=QKhcA8+7et&l7hjNt!;*klHv!iZ# z_|<8*Q#Su7AT3XDxcJl}4>5}4WRodlDWcG(9*@IQ;|s>86mLwoD&a=E@ybBO_;lSf zK5e1*b1I@dAV$;;)lwDeQz|SfK^4j&#-Vmkvelu|=}^<80!yQJsqIH1?QS%FV(h%| zBlb29Q*p_@EBmIAAJ@Cn<;7|R&04YE1y07B$_2}-@P;=f(8(eTvm-?DpU}jTADj0X zRIFOb;$lJIzW++kEvn0vVXw4SKg18okgNW_qk-%01ItXsso*)Rql~DUEOMkp{s%E1XUegCDBQI`IZ0f zI9#egOzy9^!m>Ut^!m_obG4!=03FNx6|;6=+MZ zW?^LN7P*D2H1wD5H#Q;IZ)1T%>ttV!!!yixsl$7&k)L9;rvxhc4)~sP2Ihv646tX! zz&r=*`K87z^mQJzc`lF+;O&W(2LmbJuoPy%U%5AMwNt4s0!Nfq>0bZ56klh*&67++ zWVy7{pgF(mdyXvt_Di(7HW1nTe$n;kp1R%2%gv1EjlZe@*FP-NKymtO2uVz{s)IkJ?)8ZHa9f*P;oxae^;Dn z$PYM@)M({>IcuP1}HBtF0!l6wX2T;&%G`+W}gE{BT` zt=jk~p@fj#f&NGN$tua^isNL-0eJdBgHZO%-gM=;ktR;FxieU1Cp+1q$LTCUoV zJUB?yTVbKeiyjiSB!kUPchIm<|82Z<(sLFqv>cc74Efx;HC*OAA4aNim1 zXtI!Hf$-sL3!UK*+}(Z9%sn>cC}dZT)`v)!Y=V=bo`|TGRH8FDOOr|Bd)79-XDms) zhx3Dq#ycBR?L_jQmtMGxBTTB9WINgN*)k+b9)zKFA!7 zyj4`W8g9qlco|gB9xd#k`x|S z8I>Snll`9*Lu>GLJER?@MH)=%E&oD>*2Lquw56C!G60kIRGDHnqAJwJ#246GO72^2 zCjZpA#=Nv98P&9< z@VKTIJDPmksLQSegZ!OMbHsN55DC!c080W;--pCt1Hv$d0(LSivapLm@#Q;IOO|XN zN%YNZJ{8W)=JVmq*6oIiv~Ky^S2VtE8=+2KgMF^@9r}*AjQ^)xWY(Y{`EXp$zreMw0nuMG!nv<9pS{$MlgbylQX>wd7ArBHECELg|lTll)c{ckQYx<5%$2oi$e|o z*t;g|>My{C77(QD~MdB&_E zjpmbOLzufN%-s;?ZVPkY4|5N~nGav`SY) zZdRF0wp`f6CK~co**KDPnE{Txc=6nOoHa-+D-+rE2d#j8rBZ+3t#EM^+s5yLJru%hIGXLsG231=F z5u?+oYE!tr7@a8r_kQ`eN<~QqeoW$cCERXqBiivmb{1QvwKW-f)=n$gx;0;_r#{|O zW_-bZj7|Q^a2{-DZh^lmBooTZ*j&TP1a{ZzObO>gd6}^zoC{>!t@Kpcdh2(LqBLV+ zN??9ZAM=B?`=kD5t2H-B*)(CT-T1=F@6;{jQr*0LR5znH?0Knp9%kHurb+g&FG7k@ z)^A*u5^%lkr$b3E@qQMX_;A`TB%Nl3l*~7|QaBm?xolDm&7ye_&Mca4IJ0QJ4qp}Z z8>xo!4v5V2hBos$FH&47>X~^QyQ!>AF|3VIhx)T6&6*pclT;JAb7TK;k!*75&*$_| zHt34B)7YKGZNib8WJda(Z{8n+6q_}Kb;M$en?VKm8{FmFv(0Dy{i$vOYjxG3U)$ZE81MTLtPpIb1XWtQ& zb=aHD&$-t)*^*9YJKf&h>}{9tDC7F>+CA3YopSd*p&-5;#O8qaDdHURlD}a(hmiut z#-aZJPcn+ryLRGR+P5#c+KioX<74Cjg?W;3f7CzVyK0Q>-cKTB`3Lnk;vr9xSzqWL zMA<5}CV6N+6qpL`GSYgf@@s>;L~%F6%~IU2;c^rw&qDI{kIVKNoUF8Usa5hb6*rQz zSsl)VGb@4IX@b1zS!X2COFWrr|>;k?Y*|I(b$|AnZ^MT<}!=FXrl zwfmjfNgHei)_IbOk2%p}c=vzY2$rwWW$QYGEA__jlMm)|2R(nOEA{cw#noBe+3pEt zyfW}o*;-8=L6{^tS+Z_ll4<+;*kmU?b&Ko_l;b|oey*CDI}YWlVqasp)61A44<$wZ zwc7F^vcApTMa~2 zTqAe1O!L>e)=uy{z8#7Iv+d6-UivrVR;ix;ywPTO-^S6l)GZobsZYDv?J*te-Cf+3 z40n(3>SpY*z}d^rkFpD8dayEGIb|<5PlZwX(k}N)v=VFMW0~15eXVO}FgGopO%_8F5B~*MQgci@57lf_yq0~!wI6&UI zbuFthTADIei`X1*Q$k5zc2Q8)8!urwb25pjD`Ss~lDVXNVPQURz)0-P*JI+N9-0zG zhSk_CHjkba9USeDa6@BzbG@ugj~14Q$Xli6WAkX$*T_10)z|PK=1nu6tIpaL*l54m znY(4D_sfYp0tGfU8Pt7yOzmm(^GI@@^^y%;t*a^ZFALZx>E?4r^zcAhmtR=8Z#aHz zktL3sleTnwUq^q)2210ceBNeK3u5Qk+c7}amR6P~jl!;!iEukYjV%%H(Fd`@@Wh6($IBXgCMXxFuhHva15Q+A9 z5_~b+ud`nmK`u5u(R_oElerR$oM=ZUbM$Vr-E;jDha$*VSjbM0V|S&I>8)7g_}!5N zlbwbvj59X-rbdu&vV4cfA&Y!0@^JMIa&$hcseuH@Ke3Qg;*gJzLr%2sl1y&cIZpg{ z^!^~C@5PK%$aU<(fi5<^@G;9-o+M2(xGYlfj!jphy_qtQl)L}C;oi$5+IpCHVbaXI z^Kx{f>A`vMy-vU{_FnNjD4nQe##k6{zc-VNvu7I!ML zvB-&bYkCq%sgav5d-GS3R6J@Sr-K~3lg?=hIn+-7vU=U>NPPZog%TO!6SZDqR7@xw zm{2M{w?c_bY^c-miD;YH{fTrdxX8qYlBuyssJStFa-C#_5*d>n7m7yMCp*rkD$eKf zIG?T1CR(d!;2j&Ev*KFH7$tMDoH?>H z>vu)sbG?N;M#U!@d2Af=m^kEdO6ES!QWt;y^wWzX$PZe`;}o*mEGMkU2B%_t+`SU* zIkf~yJ4echeW+*Q#C%}g>+HBxNPifcKk@rO$*4oOOaCURsMxs!6&^w!VKuUI8gY^793wcT$a#kGjlsII`Pu*U{S>m}O`EmYX3#DS16fS0JI29LKK9uaB9Giw* zY$~S4-D|p%5&bVFcGtp-E#&EO$TN_QMV=mqJX6Vx5m?NXU!HZ)OpmxKEaaJS$k|+t zMV=XlthAF|G_aTtmbf}1`Qx#WFOEabK{gio;yC14N=78boI4}%R0R2F7V@k(`HUnkVsb$? zYwDGjPke33LoW7SxpDWJqh!VkBxcu)SE5wKRbN#{s{8@7ILXVmYcn4`B-%I zKF>m~j6;^*EjBkQ7Axh4+zvN+_LIOL^DW|M{d(4WpgrP*GR z6ID09v5;%ykY#Q-7P&SKxlYNPO*930)YjpBkvLBtju)mb4tWK>vB-6C$n{D_-fR)% ziXY6`6+v#Ykn7`+SH>aN$04s$G7~|Tr2qW2A_g)zl=-oRyb9#lxq=3+$HsY89CD+Q zq1Y7Ow0Cxoiy(h$AveY$H^m`0#v#)%xcdq@bNpi6_FqSkN25c;td2uogKun{SH~eY zD;YN#AWC9M(e(^qaVWFGLT-*jUd#1ZOdr=XNnhQy^4=; z<(7{PAM^g#$N6-}`TRA`=U;I?{c%1g(U+Mfbg%Pce4;gW3xcsJT_2ay4N6A-g*XT9 z&EeTmIbUTVZ-~qJD^)0}tTH7(S^iNZ=U=u$i3~X(RbH+5=yocNGB@AwQgjgAtZfa8eW*IRVswbvwVa%Q(qJI$&ffl&2&kB z7h9jNj=TG2CG!W)60hZVUX&ZT`x*;*bNKF?!}ki^{W~!}(Rc4u$Z|Q9n$7ASzs1Y? zza+ofR+rzxpPK9ITPxPIvb%H3x`w>)Ki|R7=aV9*MVy+ZLUny^1y}q#_=6YfHdPQSf8(V;^ zkDlze9m$fvn_Yf7?s-Qk{y*MTsnQG7O{Q7mPRMv)3 z7Q{-)t%lg}T5`Iafp=pe|MP~!${mUe^6Tnk*YC>kpTNYp7#wSJ?yQE)rfI9DWQW{? zH|vgUN^Nb#9p0q6uK9`$b#>)xTZM%y*Rr_+yMou5zUKeV5*yj@T()}2;|m(rMcKJQ z$>-&=fp)|*-`m>SxZb)J!Qwyf4PH-ye0ZjuO&->-7O2^?>+*B!GTrlX7nYRd%`43> zP{}s$D;q-0&YC?NoL-_o*yw*tbF z2+m))u&i!=NqGgOD5buj@hXuTEW*`6!Z;(9UaAox%UYYShz?n{xTG`^5^kOdN-L0i z$U6;TX^C`nTtqN$!-mH74HYfY%Ovwykzd;#7C;XwBr@0^f?AbL^m!fy7&y%g?^X70;`Pa}O_Zmu5ax2MkA}SJ-r{_*FwN7jO z`nGj!+CNknQZbh>G53_)pv*gDll~)wiN23{TPYdx$GmM(?PpT}h zD~driV?mOw4-%-2{-a)R6*gR}q(Vj-c(|zys-N^gMRKc{7iIHWSN*SGq8eRRmif&E z^-YBE-v6`n*EFuWd~sugcYQ+NrdZ^bJa(5aDviYtJhieAS!k=LFqO_0`B#Z z*13d66uK?Vd)>POQk=v zdW8IWxpVT03Kz^T%2NSidj#v%rPT}~1g8AnBDsOB1vEAGn*A9w)=rbRoc9kIdp;$=!R>R{M81;r=IOd`eVwD^o zgS%{V6qR3=TU=UDT)eP&;Sg;m<{l)M79(Cmz3G_n=3xaP2|cFqk81V>t@T$~SrZu( zNZ!P@|M-N3v<})Rl(h^$Ee(jLjI~<4tuj!vJT1j015(RJX{UHW;Tnz0~v&YZ%zdGku<3{lDpT4qm^S43w|3%%hgno$k13+Ch&EtpqSyr5(#l{&aC zgoB}p-Sdj)6yz_MJH-9eyRWmSwKUD1X1)Cy30RW5uxMdv(cHqJ0x|}Seie51G)DE2 ze6_M8{2($&I#2qt$P-62P_^pj*btz#d1LPE$$SXt|Bu4TomyE}npc7H&kJRLeo5|} zqN4c)dGm&P#u+pqkn9MR_k!G#xkdSNipz#7?{H5j4NYG8jSg45&|OwoG_QDwatntG zz5N@L{qp3Mm&>PwtUNAhE0~jCKEJWPVNM65RCxqce-G8yZD4=C#^{ohpw&@9tD74d z^Vcxv&{8VfhN|!pV9J#iD{m^hH_G!MUm%(>B_qll?F&Scr)ABYspRDgL{;hwL<`6A zo*r`{Vutzx(H3TXVoZWB5Is6bE_aA85Xqd&+^E?%!OgYh#(jb41pF@>B$sFh*UORH zWXZ~WPVNvpE6X%|*D>PVhTIR2g0~X9hmaXz&9BM76^Y`Pg-pIBmneSn??EXt&6b?Z zpC!WUL?&<)yfK8o51A*T%OJc&`PYiv4M)Kn1>P;l{47c?5#A%nbVteM4xz8c zg7*S4`=jI%;T=LI=_CSR5~X)M*V2%g8YPzq?^0wIM9B>mKY7n+2{QLta$)_qvaLL^1IYdED0mXTr;ZWt zZRGxW6g+uj`2aE_PlmyS%VUWA8;i^oOD<9V{T+;1$ehLd6=IHrmxWBeC6@>AWVxkPw>ApBRzJR%ASlf^%}(}K)lOHTd)Oq4H~bk@1jVPg{E{ecT}MMf$tMqVjMgts10|1@!^n-yFnto;cLA5vk!iBzj+Blq$lPtoCBmCyV_hXOdn~yl z>4SsFIK~hFlL)VaYa@~QmL+$j_WLq2yDd38;f5-=O#DAW=G3t;m?Nck8ZvH6E`*oh zlM)HMCH4RJUz(6d;s0-6nn=H}pyKN>U(Pn|k7rx^(RQ#?+}7}R$kxb`qA~Zgk*7tq zgRR4#H{ROa*m_$^6`y3MjDBP%c>CInz2Y|art}mB*|S#mzV+?31@{Ec^rRGfkKa+~ zkX+s8P&=?sQ1bG1i0C~4*fOwibkyeY`!w0_)~VE_Xa|>VI%m;2<{tH;`CMvO|I-x5 z$+l8X7)@>L7W&x5(RR}vM+kE_U8wMVwC`KxdmKIuXQ@z?#(v-a6oXwo*`Q8 zVu~Qt;Q7JVWwq9N%4C>=bWA0Wp|eS zeEPor|D!WJbLM^C=bYzU=ggjG_{UyI=W43i6|b`5R#Ppm=_a)c)gxO+bXi>=qo9s7 zQ$q)}tFTsmL@l6?Dj+Kc(s~5zhq%;J^Gnhs2<+o3^w(YS7C=VbWHm}NR(<%Z!!GZN z(N6u#l|rE!Ofa)n4?`zy)vm5lCPcr3D%Elv5zIV157pV7+`T5BuNP`u`6L!a7!EY@C+~ z5@FbidR0<;Hykkr(t)Q_6B9SBf4z%wku8LE+!g}rZDy`gU_s?|WLHG3dK&;(6jF<_ z9M&>sP$*x?u3)uOIqj_KgE7%*>*K77cMCCY!3;q$I;`oiN$9XtY2Kql=xkLTA-6+=Dp;`wp|x-jO{>83S{E!{~OZ-CALB+6FnRPEl~&%wabtIBhx3 zs-}(3Z1Z@WT;pLxXCq5lb9Px&bslV$F~bS->AN>HAW+eAOY{#g2`6UpnCfG=A)2-2 z`ymUHN{O&;m#gGkl++j)h#1z^nY^s_hwzE8HVCUm_)vh>M6IXrK^G!}g_%lT6B%_nMwa?* zjmn>tf2i~jQ{NHgFQ@GgdD$AvE&0aXbU)162l^lOSm-9<1Njj!iA~XM<9!`h*y!w zF=iLlX2V2Q4^O~4;5SE{RY%m5PTPsIJJVrnZ%IeBewWou9SDZNhW7RnvtgI@4BGsA zq^FzX@LdY0?Fh*u;$Y}m<+ghiTa*0*6BJ&AQd1*Xp5dXw@}Dpy*9dz*@UhpMDibm* z&&#y+h9M(mOxz@1kPUIZmmPdAn_*%$`5)U;unmW%No(k~+==vq^O@3lB@k_8qYe?UldEBYK~6+l0@w9V5HM zJ7_vb)1?^pK`A~;=HZ&A(GfWCRYDwm7&f!X%L}*`6(rWa*o2M>w&tQ%QR`+o!)HY7 ze;T7!(h#oXSk!Q5`iG}RVHm?F6!2{ljA2D*Du-gStKhRhX7u^E)5!0@=AZc77;h4X zto3722hb1^1sV0Sp0Vwjde~a;`?;|WWr#|ckZI_G+aA@WZ3{zTRkqniqv@UrA3zq!kga3kU{!yP3C;{a{r56msDZ`jy|f1+(!R zOm5a^Nc@C(l`|^hE8ri`en%2Ndtv;Nk_Gen#Lrl`&^CvCW^YpbJWrT*hSOz7*Sy+z zj17VKNb`P#<7`k#@``+~2-9LWA&0FU#DIb@LG{169g1~H0(qBBXu+D!wWKo~+DI7F# zq`xCfvmc0BbvODH`(TsJXiPKNYw`7?U#n}PRxN|Cw+;%F-LN=2HZE#a8SbE^U^;(3 zY=P%BRxUw}u@5m;UZ+fsR)(7#qhplcsKZ7}!uOO~h+%J3MZEf!`PT^VeOG{Wr4ped3vI)*2M=wp-x^a&;B(iLaW={5}aCK*C2_!22f|Z1V@bF2~DDD z4ELj9h_|)~6cO)lxxs3wnK9 zqcVyoQ=|!&%QIrhDC^WBOg1P|K4+(q;VT>wY(ax3joLYvFuIS!1^bu?DJt9$$vUbp zA+u?@StO2qL`seHjz5|iX4by-p(OxcS3}|8$xSs(KJ4`3Bc;dB;^)Ub+e5=g4r-3*KL1tU{YNQjYa5s zqVC#($)31@3Nk>5d|HFv>x0UkWS^QPPuv>^6VD*s1=1;eN<-$Sc?N!``nv@OH^)XD zY7A>+G*t6dC~77#taGNM#;_0VQRC&aATHt3a1)Mj9PZ|I95OG?Tm>IU;hhzd+|{cJ zsYb1EDRod=dxWBpG3?8i8<}(&&Rl|EphZt|;f6M>nVp0j#5fvTU;O{xI2x@|ksEco zfMyQDQTJoUL8BKN!B{ToCin5){zO<~SSPv(H{r21D%USv^`jHqzcGbI9Vof_SqJa% zFjHSfF2WGcN)ranxChSU=MPGO|W@VU#&c zcxgWIK0e<1p}OoFyPhGoZa@;vp36ty;?YlvU?xLszM7{QmoKxPAvRviuqku*uaiB@ z*9&Gc#OBLP3lYA|dPdd+g`wU0IZ%!J>S-a6ku_gts>#00dM4GVy_2^0A6@Z*hxt9h z{BKOEQ7M!A!&ZLC!~C6K<|fs=OOVD`-!$tPP+QG-@i_2_WeOES_Q9t*O|@Oy1jq zIo_`&#lL*ByKJD~MpnTKQ z%P&2>8D^;9Yq(`5CPnVNlL1q5y?J`P+C?Audg`jL@xjkUD8l&GaGF|sTGPd4ap*|g zx%gg$B8+bhN5|137yic4`Z5gl9^}F%uYTT>i@ybPU!DuEpH$GT&hVaKGBU(4wZS-w0n0Z{?+W^E|%d!{(Utf(4_KS<^zcFk-&NMH) z`5EbVPh3TUd8ihb(D5}^pg z+xJ7l2OiW?ym->!V+<>x8*t$d&)ez_gP&lFP=xUfH5@*kp5)o2FHU(vofM%6XSiH5K4%%TCB~Bl_EkJ;bM*=UBDNM{_e50$>>VO}Sg zM}wJ{^4r44zlM+Ti)*xBF0vSgY65i|Q}4M8fha%Z4hiNg7MFMZ$;MsJNaSnK_Ae2N zFupYb3TmO%EWh;7I*&1oAt9Z(b=4G4dfJJKKaQuzYfQ=UV;<+nJf2~A{e)4)%a3Gu zn0pImGCk&7$FB8b)-yeZu7UMqOMdF!;9+)~W+T&MzRVN+nDtDLB@zw54&gp6yk+c#73Lnq9^(L8VzHZ>wqMel3T@Lo z?V|I9ovgFnG@tLZF0H7vEi5ViZ}t!e+X^iAPc6X4%Y44)zqJkMzBUGeStFojp=q>( z@W0y_$#%E19a?Vl6s_%wbnm-vxkp7E$KVUM zTu_oc;F`gMN=jfbV9>0j8L<0NTs#pLUgj-Wm=qwfNn~Y*o43)o=HOoh!e$0*8zHp| z+AB<($vqo|sRsL&gQv23Z$H=RL}+8KPtD+a*4^>&P3r{EZGNI*c*pg>Y;~s?soIE5 z$H6j4{T`La|Ge)%^z@N^0(Z{-Yij}6R=p4gk&0nNgxZ;JmV~Vs%1Vnj(pvWb!w4<+ zvWx2KZrAR=?wzQ?tO#MB@#x_&9Wo*I|y||p@oeb=E(4Jt_* zIHu6yW%00x0?et#F!)+&o?dkU`bH8>fRK;o-177U69NKC zcW}RerLGmORvUP!_wUz#U=s7AQlDb@6{Y?jRz;cwb)Ztu>gXFUZS55g`?>BrRN_lo z;HcESUuzMT9=0raUy_f59F;TMh2!;TPX3g)3W1?(a)EXO5^jDVoY$ifg{6n@O5j!r zEGl}y-66NY|MnJqdb@-yAdMqpI6XdkaOo*942Y8+-$dZ>qXy>m_~;>Meu#Vvfuo(y zKOOw!)VQJ|n#a^KyFn8w1=Ffz``z5Ac)#v&IX@ z_`DXqDJrU0E!}cM;9anHg6nZFzSID_#pw3)0^{b@%f~ywebfpcsqIT(e)PiW@tp=H z>^vT;o?hDGMtfjlI&&N?6*0a5?Q*5SaHM{_Tpc2AZHTzrL&V(~2p6C~xCgkW1XfQk z7oowu1k7H%U?N9<^z`yHUMqMzz5eRC5OFVtfQv_jTSCMg3;{VTrFmKcQNw^psdU{?(Zy3Cso}Ov9r?=C?-4-HlU5L25Lcme`y)Q)E zrVwxz@NEkbw=)nfK>OGa+!2A*E4RzBp!O3moi68^mheZf+^XnJp_dC(9;BBQA>gQg zz9R%2>E-SaaK!gmh`5a*;+_c+w>c0lKzY0jT&=+Bl}9RW>;3H-pVBFrRm>26j#_M=f zuC5hN_hbGKp6-hmSI+%+&-U27Jf3grELA=&t^KKe)awTvc}>cvwLi6~vo_hklW}GL z_EH!7Vtf;}Ww|;~{;_2Px8a*_W;-+UEqmC`ReFSsFp%~wOzLJ{In3P6L~qmCGcaiY zPZ|5^+!jZqp*(uBdeT*3;oFWoU`rf+^h^68PBu(b>&1;UTQ=kyEZCIHk!_Yl&~DI% zaO?{0N}G}0-jVPgWn%u|NHc3U+PFrU#WvCc?4gJrZCjI6vxCxc3!S_i{g98PYa(ri z#h#RCwJQZsQ_r|Eu~p-Yn%c;OMrD4JsQ^0} z$kDSO#fZHMbjh~)0{R%qh{%A53I=MI4V^?N z^^7aa+NjQHR1p^^}YmY4D)**XQ~bnhP|5K z5lB4551OCBuyi;s@C%B@G>kR)%N;$9^WPBg?Pykbi$cn`pNp_X@3I~vmhZ{Azax@4)Ioj zf_0TN@tv?#bJ|2Ho1l~GI@S7_>$F<5|FCP(Ws3Efl6S@}vbwx38{?MMwZ=pl=Cswa~UU_&H%oTAeSI$^J)&=2Cw-tUPvZAmwTKkTxd zPqe)5b*1!#MXg!`#bZy1?8^I$`Ph1JXe_0Jrrieb0BJW*QFb+)=dPanRO`OFqTPyh z_s|^+)6_5}`xy36xr*CtGVZ4S++{sOsf7O#wZ>TM+T*gGKw=NOTxOT`6s6q&7<`eZ z`ok_Nx2Tl^u~!Uj!MkBuRO=a+?SyMi6IBK@B=&gC+am6ra@p!#XkpZnnzXur8)$;$ zOLYVU*=IcA+AQfz;j&M8dEMNp*?P!cb;umGa>PH)&1?so)#b28t8=1>m_<5mDl5n( zG@xCe`SPStr($HWnz7ps`qPrx#*O##!I!$_0ySpC}=R2YK(a&ADA36s7P;WVYD#*8hT{h}G>9SFGO0UnU z!{77dxpf2O*XK-;;fD@nIg`nc?s3eWgrg^O=04h&C4IDSpY*`}U1i8D422_^`|ZR1 zEDcXfU>6{y(GYQf2XN*#`F8fqcL{>M z>{a<{Ue-qSD-6)N7GrbOkSgSuuRu@cZY}BSsLr`ayWnm$uWL1+I9z$qFOUuCHZPmFV$M; zI<6M=QLQ#Qe}mA_0HB#{{??Q%whWvWDO8UTOJNHdR42NA`3k>WIq@x>LpR48#N;;5KH{6+Z_aHt| zzzh`m|4I!*CuCaivYu`?cK-| zphf6VUxQ6(7)sI7!>%#ab&jINb=Jk6p(I+ZGAUM*7)lnaa~9)@>(h>A&!$a$!FD5&9k_QSltYR>7|1W7gNz%+~W?)z*1L)Ve=T*54K<{ znERO2^fphHN4sV;LfGV*fzjd=r013Gu5L=68AFqCzZ!1b#YePhs9K+l&pmM!+wku+N`o@AE|bt;y^p}pp-);JPT5YR+Cnu%J3x)l>JT#RZRMBq%dC{wi# zBQXm$UtHO#E>-S#EtfIBYDhDg^f;uY zOnMFy9}a0V3dg+!i4S<&A#vOvkm#qM5e6grIWCn!;)9?K(js>EQO$3&=7)jjJ>0}# zLn|%I2jjq{!SLL(&q~idd!;rwkxYKKSa0!_^dXLZ#qRG%6sWLF5BYd!e?Vrz( zq1>bcgY%Zc7MZIuqdYq4taFTIn)l?k&62PTJmikU%<-RSTNhaGDP55n-rQ`@G&Pqx zqL1&xygaF9=m!_opi@9c))2YNIvv?Dl&2OX)i~dI2os>+o>Qxe6>G8Rk*I{7&L?rB z_g+VKoYT2Uh;KWc&kM1}>D(#ASf_Kh5O;#a>D(u-wmF@j2{Fs*bP4e#r}K~yw>q82 zgqZ1c)(df;BM;G^z?Jh=N?q^0y?=Aw{U~Z8Qj7Bwq^I5o9ohSPpL32dJ8Zj?_B0q3 z+irDL2g18j8_{Re(6Xw-qqtU!Ca9(emw~mu95Kn|qgPRdYOSa%dPuQ7* zk(aJM)PdqstrG$Th*4}Yz5yx_fRaePv(GbMnQASoD~eZa@eW&AowW>|x%~&D{U0NT z!BdTi#8f{HJvWB%bc(U00>c(D9aZy&RrVEKpDoUKO5K58AVR%FvAwNsH&SoJE^5?T z_r+n?ia%?hpeQ@($zD}v@DRj$6YTUR*yc^(jxWm_{t_;>yW`tRaBv&B2k##$2lFf` zwoD|3rE4F09mrfE%x6D39&aCa=b~EEo2^SZ64e>nyp3rSB|?=I*XwZY>OgZeH7*is zJ1hRAb%CgrMieos9q*W$ZPT6ARB*5plY=8c7 zaL$tv&8ui;HChVvcKA~&)TO91b=IZsiCL*aBW*?LU~5+81vIGy59UQwA+mEYKdP$0 z>f}jWmZ!S*XniNxk`AB)Ws@XUW%5~RRFx^#GOrF5SFGbg^+bhrpr5R!&Z+kfGQ(E= zk`UvZ)%%4Q?|k)1RAlEnN8sVCK1JTY^*)CH=pJE*%^E{>#de9$(o~xz9czCIU-2Py zUUU2fv=6Q&v=7&)CYJ%v@2F$Ee&M0r6vncQiHezud6dazGPBy1fJ%T&Q@bcR0g0qn9A9?GIv_?6P#keBOT4Xg_DfEf-x=57-A6hv=ecSY@(eeH-P;`Vy=# zkSP;u4bL81a9|#B)V&B0K`@QBMA;uh?qL543_DvgY-`B?qh>w~iuI+IVYV7;DV@Am zLnJhp;uoeUH7=_18h)i%_qo%FUT=_hvJ^}#eWRfj?!zv0fp%+gG&(>e94jOjqR>%s z+>@@wjvUjpsYx|c?C&%Cc|DLXKDoIBMa`!^MUeQi-7HA_?#+<+0{`uhG7&1maF=$M zRtNZ^KkdHfVc*y8{s4)GjmB)`ITm(2q)kj(4rwEk-hlKtlW28-OW$eIUy%5;u7lAn zU8qS}kQO3rjNw{HH1Uft%+jPvO}a~y9)e_LA)e8sFCfvYi5SBXP5J>6j~6p6A;oCY zU`?VunOs+EAw9xUutD=X0O=v-r$V})Nk40TCJZk8ZmcHtgme$X-2iDOlfHz+%cvh# z&UtKEka+s0Ytjvx^avzADW!KbJVYGkbG#IKYf_pfO@+iuW{xJ=HR(=B8(CVO(xfe# zR11lhn@f{^(j-2)|75r>kTuU2VkzE`MUJr)N^Oipthg&(PR- zd^r*YX3+A8__*Prr-xLZ7*s6M`$VGVHG0K^k_I6gd_dx&2U;Hd5G^F~fJbQE5F(Ox zjM~03#e~QG^5_EPp#3{z?RS_{I4iqsLh>-#sci@!wbAxHYy4#Mk=D0(UB6tD`a|M% zmdX~D%vuI3^#N-NZ0fNfRzR8s#zu}Rc2>~IcHKm-KwrxTC8;B+9)?q zc8;{bHnRO_6s=}h>Z}&`py}FEd)$P6wg&IzzE&2Q%FPANTW~cEF$P*l-G(E=fJZCQaLP2vv1Sb_7^by2kQZcx+Z?0{CMs2Y zpu9xgc0S;1BY1wIUfb=+wyYf+Hl!9giF)l*q><)XM{q@dQ5=hg!&FguWI=B-9hdE$ zgX$Vr_7MkGCA@TyeJs`97>SXQjRI<6^^pZT8b%XCoBxKPjV}XL)JA#<&=mDrMtIVm zwR54}$+>IC8f(8bx8IE-p%RHy(;q%kdmL8ZSQ(rEwhdt;ft|8;Yy`)$B2iA;e*pYd zZ#b0zRVaEs=OvH;=>r@Q%myOwx+-zaCDQy3cJ~R*?=?+&A5smD2m>w1(jxAP<+KnC zn{LoQRoHMtdsg+{fy_#5#fdE3%AGg~H6PETRa@y{6wCSEZ`5$5E{yKptV%T~PA#VlujqoW^Q@v3=e95vB z5B1nyVlmpQEJi$mx#payj2692WtVMen0Q>VpR+6+27tlq7UqTQ76oI?+_eYIbSL>$ zM)L~boX}-AOafj=?-fSSSY8utKZnsg7i&bw3M!8}$5I{!3trA@%93bsFz327JgJ6C zBN=(*Lq#bh-l*?@#5?}yA#K7D!F0_#bXw`=op&VENu4Z}C^z3a0e@lnjOl$ZWYJP4 z=soEG)BN*}^BogSr2a;{O%YR9vpUC&E2ee4y?~uZM;=~#qJY@SA`DY;=H)@FS-ef$3yJqxR4TlT zwnO4&^f@G6Mn6L0Wpt5O8O=|Fw}E~qbw2*O%V|GkloPiB{Uk0hR$>*%nQKwP%cC(N z#8M6`HLRB8Q<-@^Zd9mqDwL`+2kR=6&N}i6vAV5%%!_Itl#^HHTT~Tn6{MIwMOSF6 zAg;Wn>VyvL_Z@gciU+)g4z4`*0wc|4RP(00=9Ez%PsQa`BKt*&{L`|iT!D(}kWW#i zcQ``VR8)3rVRQyow4zp~qMRI6EKhjtVxS>P*&&)t)NKVu47ByGqNViwk-o&Tykqn7 zv0=@}cS2?Od5ZAAIfgJS?ddn0%gs|9MN1pn?XoV701S$CS}j;CSd61sEEu%Zr-~;i z*1IctWsWWgqwFZw?YsQA5OS~ogxzgv3&ke`0hj+uX=muW}a99(QYJl+! zGv4nRXrStY7aCr#99b&mdUBVwm@-7~X)xMkHe9a=W>`YE8uJ99LBiJ!6+gV@-qC?iN*>w1@{Hyn5l| zK#lzaqa(Y}nQ2ZsFtip5b!1m4t|&VV_o(z}Bv{^1_Ig$Q#S~5U1Q#nqiac#e4?Ju^ zsW!aj#X1lx+oHw%dDc`O(a;Z1xY@2e_8uOQqUcB%cz*#1l9oc%|my*W@j!VomLy4kCNx!X~* zcb6BW9ZioOF|?>6YUOVjX`rCB)+H;fh0Bpkl(J&2STnJC%|K|;-iWqFqmlN!NmB#& zlP0ZK^R93Tq;GNX=>hKwX$k!U=0`&l?*QM2#5+J2B;Eo31c`Tm7ovRlAZ3G80RI@n ze;{$@`ylbyHbCNWY|-w%q4^z!#N$1oNrTW%W`ZxmFh-LmL#knZvmt%Wq{9J(5wszOLKs74s**_5a6F-ZLV_tTnRttOp;#PveUnOraNkhos@ zLwcO?;e;W8+m3)I`#CiAQFsg!Pgwr*X~5)3PKK0*BizuIJPoICh^gkkih*<) zIELR@42fOt!xQgvIr+MeG4d{#uU<4MmHr;Cy#&d@b<6FTVOL*W$bJdREti7i|7`Q+ zokZs2yf-#d)i8!-;Y`IE`|P^2p4vsVj-1gDkHg!74BhcqklB3c$V5-IxQd0L*I4A| z9g2oRPpGS$a*Zbxo1ox6VR!}0hQwVw@p%2nnOcFbeIFwW=bbNVCC0E@1Vi?D7fkZx z3nFuoJYQbSX88LuNBS{S^Du@X!^}lJzongr*)DwB`Y{94g1N09b9;tijTMrw&B3jL zxjmSDwPEpNZturTBblB>wmpKmgCBE8Kjsd8%(Nb842#E^+<}DIce~3ER(iN6)(l&w zIU09-^&I8LObY?VuuQ@6bMw!Cc$m)#-%fta=lL;r@?)mn!Wh;A=P(@K?)^T;!+a%q z!F2{R>b%$1N^0+(+RH%fH0`=+wu+3LJi1^QpSs!wzP>r_?3bSN8HVypZc69MexCFU z73ujm7DY+hM6=?+BWJ6tZ$n2EQ+$Nmq2&xUykM~2n~~jKo&)P z`;Chjv%6o(I6ogA?(~oucXEXB?Kk4! zu;Ti@9zA~|n7bKT>bW}$<<|4QV<%8C-Rb#Vgd&V@E~rI#G&b*sHETVg+KAwU@eP&W z6Ux_`SQinBFutKKW1-@4CimIreKAbAQ+SyW7{+G=q0!wK7LPNz+vcvC>j_mLLNSa_ zC|VaahQ+clSk7EJ1q-6?xST>@7@ttRd_twYasEk9s9F(&n61R@Vj8X(yvT=vrz6boj9;)x+gt7Q9sBL##hgM;NvON=PsU6>j^bb zgd&V@C>p~(q0&<%yC+nJ2*ofy8oSyj)QITS#hy@WL@2`e#)S&)71x;i>_a`F?h~O1 z;~R>`U#@2ehPKbo{<5PbC5-D`oh%5c-&j5y@wn{TawYx$Dog!)#5Vi=#i4+7Rxf0jg9 z>O7&`R!0fr8`oeK%B`{3>G$Jxm}m}${xmU!V;G;fhQQYo*W}L{W_dy_6rl*?8y6~> zSE%8SmCo~ovWrlJ@eMW1C)5kq#(Is^>qRKS_=cjnttW*ePhN_bitc6ykbcATk@&(3=DQ4jM` z!JNjKz052OXQ4#3Fx35Q{mhfo&NOX@BaCl)M!?56r)hq5KAmCc)d8x#q4$N0UiPG? zhhQcfqrRHAvQX~y6s5~6Jn6|5p$Ov}D#It#&{h4%dqT|;p$Ov}YNSu7m*2`q0lG_h zp$J77-@IqCQ0^HTE?_B@)a(5$Gm2qoJ8mST(v^e0^W@zwm`Cxvd)1%OER;9%C_m;g z3_}af^n9|U@`iOD<}HGG3}^N#{+&@t2o^dQxJkI25U#LcB>`qS)QW+e>`1Bh&@b%0J4C@M^DtD;s zL@0*w35BYFQ0}~Uwk<%BxY4o?n_LF$|4aq=UyQ4lMTM@FHrcaFhI)^Wp2;-Y5An z7cfj<<}re~z>j&dA9Dd`_SyvuvO&#fF+i}*Q{)vP7_tQ+;6(=V5@0UnMH8tC* zoHA!Y3E2korghs#6trZe&N`Q(ZylR6Jgm+f1%uo2W-DeQz0fcc$;{oc+|8?) zw;-!z!F_JbSo7o6f)Xfd3YqY_@*&|RZf z=KX7ce0W#joZ(hz#225`LWTZ#w+4#`ksI71yw4cXqBH05xx<$v&w?xVq`zPP%j?LY|6J8n0EvY$p~n3(+K}v0z=`*>Dfs7 z5V)^G;5!x~-;cok(Fz~EtO}b>sq#3z^tGFgm#8?%>E(APo=p>`!{$;6gE2h?(lhCG zO)1B?&w4hJZVM5&E=1g2fp7uJ_deh@39MdzseE5)!KbIcSAl!K6+UVjp8%6^9oGuQ ztEa!K1%@N_>uG=BhI{d)2C(5750b1Fe0uq)0B&h3e0{*TIz+x#fZN^*Un=;hD_Uu#jH z33qKET!8#e1g=zI_3}FseDi^MUEqjcFTdXa^GhpyH(-MCCotuBZ9pyphaTTkz`Q1K zdg-Ir*EPT#5;$%C5+J{)2s0lCoF1P8_u2uoUf^gP(@WpWz|^+FN7IbGz+8C)1h`;) znZV==oL>44f@3By0~RnkL$Lgg0;WLV^!OgV?$a7SC=TZshy49q;dS|dlx z<9hl#2+UD|(@Wn#-1r%o9yc;NwkWB`mj_IV!0GXI!i{;rEXRT?xnTA0ZD95ZoF3mO z-1q{ROKHG?i^QRqz7k+;0;k7!8Ez~C=E<8GUC{I$0p^sz1>^e*m`kf#=bHk|^#T`+ z&j!o`x3tdp1u#DdoF3l@+&BeH((=~%<^i)z;Pm*YJRHCrSi$*%l}GGKgP|7=a(aAJ z9{qutWal`oz69uZ*9#0s>i5t02EqmCuO0;MIf2zn-#$e4DljWn@mPcP&(8q!hQR6Z zk^Xi7V_D7lg6Z#CU}g%O9v|ti0+>5)<$MwNqt`w@0_L#5>G4teegr0wI%>E`9E>kO zc`Onb2E9`UWfaHPIoz6b7ifz^wb%A*;W%>QtG6%k4F@p$@8o>J+D9WW=Jgz>$M+R(p9jndfx~d8Tb~VB)QP5r9XLI{ zdfdAZnDDz9ENFes6c~=w?_aV)#N`CS1*p#xfGZYQy?oGathvBA?%}C3#`{|5%LQhZ!0GY*1e!U(OuC=*1*@kI1G8D+^!Uz!=5=6Rd4Tf;Yj4K{ zh9mXcTRm`%0;?A<{meG}L4%iBmFsn`OXWc zm){e>G8}WU5znGO#X*kpp~p7|m?|$^Aii9LzZICTyl{Ga$ACHGg$u+-n-c#4 zCgyoco!2)a0@S}^U@8SpuRJ>A#x20yv6=G)>rX!d=CHu&@liAT5t!TXQ&)0E9D4bE z7MM2$PLJ!f;o&jIt6!0GY53Xb=IS@II2W9zPZe2)Y3ioogdy$PDP zfuWxjk~87ZqCPGBAuI6c1i!SOUO68q(nQ<^Z2Z;Bmz%U?Adh517 z2EqksM-9N86Ii|UQ9W(*8tN(za>44s31FH8PLGeGi$G;~iz)QwlXGI6b~d+!zVW z*ta+?7~ck9UJy7vK2qB@VCKEe`7}KT(9697!;$)Wc@Vhg1XeFzdOUs=nACSTTd;m| zDll^ePLFRFXchw_zsvcwd13%P-vG=Cfz#uQ1C0XA(*mcB(=GH84cuG6>=iiDpWZsd zZ@?I-p}+-;w*xR&2%HvgfPAC?lidm*bt{vAX)dg zC2+y`UIJ#Hz=gZ{0_5WeFsB4ASUzHRV4W2QIlXw7;$DAXUJy7f-T>vh9hd{H@R42) z0n-=)pJgZBzu_RKmpZ>GcP<1G7Qk^y0l0;Wq)(mnJfB zMjU$On+;5n!0GW(KCT1CE^t~t0_gc(V4eo7K6xTG?2gr)5~CBMhTo=`iL(Vn0YPv0_epK%zA+f zrkA&X*(-2*@seIX2WH`J%0=+{atAPv37j4u<>NVEb_rZCz0?8I5CY%tz;xQflIPKL z0KHrW%m9H4rk5gM<_KJ{eB21kdVvd;kEeloy%jzOl3xqV=nr{5g4Mq=U=|Bpu=K42 zW`n?K=?kEjSAf|raKZHQ6EJ@XT(Eded(o%hAg9F}pg%|kCSBn4_-ML07MQmC7@eoT zYLO30_vHe^k^22)Z{UUstX{lSPp!br5I8L#E#js5nhlt0feWU;&A_}PaKYl;1=5)8Y-F7X_FHL*Uy8Ol?cP0QvYFnC}HHSUx%&z&bS!a(ekVhkKU; z)BPZWdHSmW`A7vON8t4MsNPQoW|6=J)5}_59teT&NnmPP@&(Y#XTTg2xL|s*e1`ch z4syZr(G!^A0v9YF6M-phg>O6Jnh#9>&snq{J-5gQr8`GpI8uLHm;hX{zy{05TwvA; zoR*Ik@kS%E4Zyr0aKZHV1u#DdT(Edg0b}`s=R%7&K)s3wCQ;ym@eKiHVoSaN`6vfw ziNFQR$K$}fB5=XteH$2;zy-_431FI9;p>WsBEH1$kz8CaZSaSUGcEE#=^igI9I0Oq z@_;K5*kJjX2aF&f$SiGl!>7eplXz>Q92i<__Cvd^| zh5|FGC0~GiTo2660v9YFPXMz;;Pm3X05{$N=CiMOK7!46e+4GIj^p(BsGlU`7QF;6 zm|lhflNAErL|_)QuZKwvmhzkLh_Zj`|4#Y^Rp3(P!$)AG?GUTPn9VAcy{R&DRD)7aZh*@m&hcP=V9<0_0;HFw+DsSUzqA=3apd7Vl%gyd!X0 zyaDp@DKOu*!bi`S4Zu`>!?NocF9Y!13C!aH7c70x1G8J;wDbkg%OPM+2wX6|#2mpo zCJu7J;=TF^o|AEq)8Y+~kEutn&X0qf9^Z1@TYLoTdN{}hIxxEgE?7Q(0j62t^zz|E9@`$nID>jX|OACnON0bouGTrj;v z{eXEQ4sv>Yq?apzu?n1)j{xBB)TSUyGpQy_49 z`Pc}KS-_Z2FuI`qUr%5L3Y;Dv=_M7ILV*jWm-)af4}otjFi*AQ3!s-bf%#D2g6ZW~ zV8Vaq`3;s23oyL|E?7Q>0h84V->-;nA~2aJdAx1#M{k^70?b;03zm;pfY~l^!Sb;W zn0kTJ@)1CPO~6=w;pqz&Z!$3H0v9aavA~oIoEC3@_Hhd^w}-%YA23^6@&(ApZeUyj z7c3uSEj=0sxnTLY5SW1i7c3v6ftefvUokMtTk-|S$6dfYDR9B^u@9I-0v9YFKL8Vc zn&&rIKF$ZGr@-m)MPovc2u$i3&es)x0@Y_q_mJN?#(mcNotqRQZg_~ej1Y07L&S{@ z5qE8fxQT&q0ouo8;K~J7uRN&VtpsMBz-i?hpk6%*%vOO5R<8~Lb3)*P#d{W*^Um_p z)#441kDkB`6u4k~slXJr3zm<`z$_BDVEI@J%mc0P?L&X{Brx-vc=|fvk6wTEtH5xic#dk3U&`Ov z5OIHni2El*T=?Jal<~iM{b@vqxORbX0qRRf;4TqZy>h!0N$Lg6NP*MJt%d%gftv!% z^#T{HzN`o434zm#Hx7K8f!QN)TD$@BaTu7NL*V-Zn9l!j9cz36@^LvZ*9cs&d`tso zp1=jm$4$W8EpS@A0rK$-FmHsww*#1OTJip#F;#b#>3*J;K8GezL^(zgtJCBPgDfiE1!SkA*iPLGd1$`l8T*~oDg zVD+ABmjkm-;Pm)n5&i*SUJ*D=e*wzv17N-oxM1b>4=^1~Jbl69jRhuA;DW`Q4$K6B z3l{HEU~Ut*VDa7q%nJe+EZ*(F91yr*@%{x&JK9(Wrx!2v8!^Bn3Y->ifcBOS%!F3> ztVqyQV4i5pIr9OQzPn+(i2fz!(e#ajT(4FVS|-fCd( z7Pw&Xz5~oh0v9aaFM;_*;DW_#j0!V!#?e}ShXON3;DW`Q2h1FS3l{GRVD1pOVEKIm zm^}g)EZ&2_GzeUrgw2z={-c_IY9&A{vl zf$uOdKZn5g2QZz_<9Z2}-^+oyM&R`H_dGh#G+=(FAEdzDj6<)#dh3!f!(JTZ^!TV= zeGbfNfeV(tHkXDOy5MMy?^0lf3S2P0allLqfp0c2)gkcR56m+m@NEI+lMwih0`pr4 ze18MeHJHDU)< z@sPrqw%HZM3k&B~CiS0Ix}cEL)4g-CJfu00iJ?Q*Zk8atsXDyhwa9(L; ze6MS-h!=LjXV1MZe#E>v^JiC-ETFo8w-?ucJ~Vw+=CCebts8b@&$ow}Zv0`GJ&Cd0bDI)VhCP~|Vkpi}`SH)|Q*J6TzZ#Je}WPLG3+ORDp zr=d2*bk*LJKW2TF^2WNuDIae6A?4AJeo1-i>&BEve=|r&7q*cyPPLUzm35RNzCKTS zYTO0VukTzWMO+at{k<+hI{kYu>D;8Nq`t5Blb-B6P?|eui1g@ANy_dzLRxkGNNLhr zW27(5Ia1Vw2~yO<`O^1C3#Es9&5+WsFOj}~Znot7X^v#Qe1UYq%tcbi2bV|#4%{N` zv9FNsd)O}B_FA>H>Em0aU%z)q*EcCr*Yj?dntQI3;)mWTEgO566hGr0DRSX`(!f;@ zNH5;?khJK@4btsf9+l43J}$lW$&=FOhn|u~AKxU!{r;>p*05RnuHB208uPMr%_Uo; ze|o+u_3it*^wGdKBv;B?(uDMPq!FXvlQxd4m2R1^L;5KHed+GPU6O0s9_ikhd!^5c zKa$p!ejbY*sfWXSwknmzm%schJ3scFD(QqR7>OFv!yhm;Zjr!*|~ob*xD-_lysY~b@=xbqDfesNTb|h5Th9Njk38tdtK_p^T`k}7abLOp z_C&e()qe7WoBGQyKbRyxb$hbBWW@lvZ{Y+A)LWcT6!BO zoKbRP>S(!BzcF%$Zdvlr(b@7VhOzSGQ)A^HzZoazf084=@a}lIe)F|*jo6aXM0SR)6SbBFEA9!j+2G*t%r)_>pz?-57;(M{&C}U zdHMPoa`W<;a>?9T@|G#Za(!lrY#LZ9x9xGAd?u<)-rZCt+mFwdFaM%k-m?9A`SKSl zWc!12OGv z@XBG!YYT?G+Oc}rl^Y)(w&b4IhF$CWWSBDZ_^>hehNY~0uw%*-Z(Wq~_V2w?x@Qhd zDR_BA%EgJ}Q_^=#P1!TMB4uayB`KTF+EYr7txXy5)g39jzPvBxz@bM{VvawRGO}rN z%7F7JD;Z9@jF^g(vg&+8-Gm6sX3Wa+3{@3Q#1Zf`Mxk* zn$bQ&8uWHsY1+IF((Z&#QrV#xDe<0I>B4K{r1PWWrHl9XkS@FPaw%bAZz(#iuXOBa zf9bBx1EtuThDc=@lC-SLaB0F1R_VyLQPRcEY{@ihyyP5`CvELqAk9BnD82XLbm_rO z#nQQ3%cQ!p3Teog`BKNemC}Tm#gggV%~H3c%cPtiR!B800N*(t70)seJ8Y(gDX4 z(q6|#Y2wg+@$<^_IwD!W!q*r@> zA&pORNhPUYNyoDfNk^u9EsZWeBK5fGJE?rlF{#^qKSzwrT^uMKCTeH;feS_TaNtmpD6)yk&y-~KFHpx4i z+Q>F@q&zXkEMFJjR^HU7oqWOI_VVjii@fUE4)U^T9pz^$qGaQeXxVXVCwb`I=gAj8 z(OK^Oa*SO3UKjbpkIt8;9=brjs3BHv^H*2-qP7>wg|Tt+uFEf$3$M9EzIf!Na^$3V z`J(H($ptrdm$%=Fe&fCb+49U~@-J`nl+S&5xtw^Ym#qAJh1{w6O8K4WKJvQmSIJ89 z)$-h8H>gGOQ>UlOO>L*k3%bvc%|mC(Z|BaE*HskDtE)@o z`! zwoqRBOQk%h-6HwC%Wjn0r!JP`r`#luU$jJi{EnODj+>Xt_w25chaJ1cyZu8p{Qr0? zM%VFrdCu=r%E3#1qv{;o5;BG{wh#Z01b-I+woW$!WxCuZ!P{<>W! z2$5I<3et)53nt68OY`v!h4 zZ=B-HG52<mp zWuyyUKc4Ip2Yqw0g(6veh>0_~_GGxe^Ntkpxc0!SaL5@g>KeC~7X2B4amV}O@ogw- zt#Avea8bzkc?cE!qqyfO+&c;RFAMj=|E6#wLM+?}vwG62a8FX@(kt8uzruYT&p@8S z-HfZ&3U`Qa;SSNXONHxVb>Br#Qw9`eIo_KC9&#tJcauzA>D7tVVF+$%4%=kT3 z?2LE$9(Eme@osb4)G0;i-LsL+!8jrexi}AG(p;1*m+sM|hp6n?-78TKd5AG~=hkp`u92VEd8;gC8wjK_Sa;$^7RD%ob`)7qb+qh34U$YY|p&T7V$YY(oYUi(yy z#Wlp*FWMy4q&9>n)rc8DD$&7F?#NM2BMnUBZZGDK(`0sQ{CIU~f&t0IVi6`G4oYuD zf{8qyAY?(o4q8{7i6erp4Lxx1yz}!kTt^xvDyQx5){~BQF<51$vibxrt7|Hyyh+Nt zyCDyKcOTA5{lY7Al?`u0Y=~;MnbDzm#E)mSO*_%uv z{-x|LPKG6PV$R5ju7ezD7>`+)xvr4wu|O0BMMgRg6NN$RYk)q6Kcr>@)NCl&K}z%} z7ugeNURpQenoZ#BCoGQaCMC_3f)AnfuZ*HUNtI$g)({~^oBJz4pjeyKde=)Ns`o7x z9;pd@;NpXrTGXgo8|#YBDAqF$>zO($geEbv85OXiM#b9bhwsJkeL}|f zA^dVmo+~raot{AaYbfz*e&QZh18;{aBG{*86()_uc@2}OZ%kxT8P3&ABE_v_QWehp z?tPG!F~6sA=3zH$cXvbLVGnD5-OMY8q4bBFyO~n3-zN>fvB9y7x(frnG)I>R*LFXh zsg9rzNl&n3E{>h3R3?}wITwd1A2&}(h&5IwM31xmHf^ftMY>Y}IE1J2H>}6Oig~n`PDQmJnGvZ#ehAwDau<5X?p~qpDa|G0g2-SKT`RXwM)?)%aO3gn(KJ~UA6(to~Q{GC) z*|~*EK#AzRTd@y=)Voo!XX3BptzzKzMH$j_o8zqtoGT|r zy%?de(v5miAs%C`!pazzL}#oG8xgPASqM9e-A?=tJEcLf6R+cZ$9f9sSkL0OQ_Rz* zDm$j^!Sgw_8k(d;80e{-F9}dPrnVcy22*OQ5r!E!cVtpI&V1eh!9ZV~!GMB^Pc)ki zJp-AIo2;Uq#Q+jk899+%6eu4|Mf;`Z%||RcdzKz(JSG=r;6IEx4>C1~iUc$2J4Rw< zta<3}%J%j@O_dRj)l^aK@6y>|i?H7k4OQi0L?%TjyK0Y^a(GK|Ro4|%o>xZ1lgguW zx#td=T2$9ebF8LXKE)Qft)n4wdBX*aCJMFAP}vp}5QjC!kr9(rGnJ-WGz@RW5yM(8 zS6L3OxuPH#9CU&UGqh)e=oZLOMY%~ioj*9k+#=DHY5y|0Q+FU`JFY+^JXr%E@nq52 zlPsFaaMy~>ZWF=Vc$dgrj7QZnKl))Pubvcp=hWW+jd=l;i> z*@s9sW8+aCNp(YaPjWDVT^Y#~i(_hRq;=pw|7K3GZGxxjXBE4 z4kIrLYm+0AhF@b+of6@^C1Fx-E(Vtzvl1aB6Ak7(iPlpNmN>SPm67n0CKr$(%D zjJ0j0YEN!HJ5voIW25*S2o6ycmWfGcF%=qoLkyO)`r$6tw(N~zQL9!0V{bH7R^i!K zEa;@6&GE-5JWZ&kj##6h#|q3p(mR@z<)m&}Y0~`6njf_!H9f+j4aT^3WkpyJmSfm* zl9JtI|3IuLEx70S0i?zg`A$k3SWFQ0=nPFNU(= zNs3v^gGI{&h9pn&qE^nQ1+TtHlv+jeI6mFCo>Avu^4ItTX_*)^&GtXTDsQHWxd?fA ziON1|^-pw{>FfVMks{f&9)}o5k_NX?Gz%U+PG#thbp`yQ1i*H^%s zOl_zGyztXITKto-=CS|B-j~2vQDpu0<;D;pc%w!{RE&b6qDT_97?C6p76oN7YzmPr z8U{o|U_eC)7m&~*!-xx`A}+W)jx&z?U;+vXE+~xVvS>h*AdC~0fuK>||D38`s_SmS z%=h_z?-kt6>8exzI_K10U0qGaz&MvogWAZ;mxW_!NHr4yVo3E5oBG10s5us)wA?lh z{)t8lDY8b8_8$tae>ud_`RgAy^oY|tmHs3!P~} z|1>x&)hL~2_UEj-fU>TA_VBy_rK5(i~k^PCcbjdLh-ybCD_8 zYo<-?u!#i9TYO`(`D4hb8KE{P23Jo1*S_9@uZPW-1in6Xc3y_YfbLUo)rHWQ`oW<@ z`%a*IR6d&WuJCHkv%f+HVOi4jas1HQAuj|)d%pyAx=n$_ppSlu95|NS!VlmlbKo?L zIx~+@8}u6Ws-?#rnVurr=z;a+`6*emQoLT~QXX|;FuI&Zoq-oNnbVU4FMRIb>>r$F z_U}B&e|6g*+OA!kux@eZvM?sKt7jHhlo_)!E6k7DZVV;dg;8gy;6SK%lAJ13RbnWK z+{&-rHhRA~aR0()#L+t`K~B$5s7KdwXpK3rX5nQ%3Qn*hJE6PHfx8!8)&#}hzqv1p zj94`4~I!k{fzN%-qG zj$<=ZX_sa`cWCCeVPxgyWaZ&rn`VuSV&>P}X8y(hnJ{y(+8_MdPgcGJR;J0XYy|5< zQ_v(Huo^)u^xZGoz2_iK=6mKk#0(|eVdlfwb)f{GG^S!}g!T3%n4|YwmacOwjSe_} zJH_tpvrTOW??%sDo?j(`leO5@W`1>LbyD-Sbjjb2VK@_2p7bia5f!?kWHhJ38$cku(QckAx77fkFGYE!_Fo`@Sf>@8Lsf5Ivel!AJ^}ThvKm<<`UDVFR<*GEglmqfPY~HbeS)BGyxi=CG{EC7 z`{o9B*)(qY3BN>xGC@$333cpe7&$qHQH`Iw{}7|5|G-aXLGsa#ns^F<67r=j4)WA;QACX&@9;~XIGIY z0P~>bIQ$ZM6<-W#aBIAeAI+((feg*Uq&0pEO**$673PP*ofzyd;h7Z%`&OY+2K!=8 z6@IWku%>+Ab}{R+;^w;s`vZ5E53CZw;RgEyt1EZ~p5%;W0w z^7@EfMS-In>_;xN(FgnVVxZk}H1_28w>#KJn=MA1Xv(dw_1BL$MFUMEPC?PI$7!^^ zgMGXoX_@{vQ%B;Q5bw8Vwf5?RT@Pw#Q9A0Jm?q1~m~%y#5I3XVwVBnsf@rJ>F}<{v z$e+*=)J|lNps0?>CcfhK-nh|vSXxZ_tu<)g%yO0>lol?U?YK`by zDr_p=)eAaG__y7lMaZVOmM;=cu`11fef8oI+w`k#iW)Sh)Au%L^dMTAKJ{paKoJ*G zWAr8UV)SD#P0twTSv9IvR*eqOLaMXvMXb=-Z5f`g<1!`(UAF$S@cG{GyUx1%?q4Yc_qdGObyuavqa8PR&;K9LG{}29~ z=)nOE`FCNVbj{*~GCYG0&8{``Yn3N^wbr7x9Qe>onls* zYv}R$`sK~xUDJF`;PI*y6Vu2om0zZ?-=^k21|I(+WjXGfS2h2!yiNISm=WRuXVMW; zqz-j2`wzToKld!2(bbmcZwgJ>6s6|f0y~JB_Y5de-!|CPUYnxfudI#mE5lt2{IzOg zM<;_%`!7GTaOG}IXbQ$qcJ2mwT8AgK&qA``!~=#o{XlSH4ahpf+-T2e{2#8*-+$!D z?YA$!F$ddIi|S~TX;D4xEu3&F@)GSxC7T%Z{E40%((XbkIl=q`DVgsrs%bv3hUPGsdgt}Z z77GA#M_Snw<9U+vz=9sIIz3BY+$C{Fh{<)Pl@YXABXe8U3Vu4*%z8Sv&yPZyH72Dr z3A-w4NLceOs$GE>@HqHh@xZ7c*}uVmMOxMhu{w|xSWpJO;dsvl8)3Gs&rc@Xm5)wY zd|M7}d$_KS_B&ixkBtuPX@kRc30@U%TJLpO3JpF0;$V*Gxb?bTl(|7lPC+{9~FIDt#Y})F7+NPeT zzkvmFARt!G#N#eryD8Z3Ul-oO!l;&Usd`$Y8fr|i$$?w$M63Fu55agPfB&}8G(*eW zwuq{E^U(*2%3E{gmDAr6^cYx|rbZ}A`|4EOMh!xs`V?X6Rh=0*CrY92tIDhuYete6al zgym_An^=4J)TTffbV5v1{I&YHL5}5r3r)(1^cl{PL@TbrH~8o1H%>6(KSWb*}P~U z8VbyHtd+`~Y~D6lvNE2A!WoEBaUBg4B^qzo6i#T*!woOAi$W>-`%#W5u?0cw3VbpA zUXh!k>=m)MNO_X&C3j-eMnuus^+ZC};B6AA59LqT(E9 zxc2JQhNhtBviIt^rZv>pqda3|O1pK0^)aD$JyFuEKijrGX7iTyX+cZOTbypu4yO4I zb&F+tjvzT$e9`Fbm0u<`|AIS6?8l+m$m}|?B_uHS2F?e(WV1aqWqVv*<>P=AHK5X_ zszEv9-VE5i8GNk9`8p>bE;!nJh`gd=KU8YS43idvGT&QGCPIFgv&A%1Y@kwi=D4Pr zG_y}IXS)l1oO4WG6+?XqH^&@Z)pi|a&{}i!7VO_?`#JBVYWqv`_1032$T6Bf@+2xS zx4$(p*%F$vB}%3_mFER0Dl(0paS3XlP0=1^;Ri3H5O>M=Yh~YLC;R^AdjxxRfahd0 zCZPU^#!KWC`U6+>ag7{h;}xzy$gjbCzHH|aWPbBX%f?RIRI(zT9>EzpJ_u8l!bFJ% z4ORqY{BooZZnPfZCdZV&wVL4nt<(fOIN_SmOw@#C|Am@xD`ywg1VK?v5ERt}`3Pms zkzSOA-r6wB$->SJZ_FCBTvnqjm(eP%YeB`;uN;J!nH5-GdyUF8mYU4jHCS~ECERBg z@b24$6lct|n>zU2+pv$Ypt`)^ed6eyVlQ)|AK%Tv+s%UQ{ku{m_*6<7xzHqqV4?w2N0z-`Nx$qAF`I{O-fuarkRBg0!f1^iR(0 zY=2EGkII!flLj=GUSToLo*Xx~7-|>-_HyUYuVgUyzdRA`O!Btz2;r zl0!6T2-hGEtO@4VrC^X;v1n&eIlcbTr;l6&E4l9x7y<7Z#66$8AMAI)Sg8hWR}j6* zJ2rIy)HwXafQ{BIo8!*fv%A1C^8cU38L^j!BG2OPv@A*Qz0)go&8<~NyZ~S>5X*`f zQ{5%X-XiiA8Gw;x~fT_IkdOEwVhTH7nY z9nwM;CQ_v`mRbp;Z8Q&K=24iUru~XYdwP<2he$g=*3NrLwxoASbsV0%wz`@1D%)iF6z@kWoaci64VB9*Lgn zf3G||ag+&X-OI(H4K^YTH?zvSo3j$iXX2Ebq&yl2b70Aya0PO-qd6DIXDtDSnxWt= zDaNqjYI%G^=sr8i3|i&Uk-Fw(d zC-xAY4$+Jmvz3=bYWtmRmry&N0;A+y})TM|?rGPi_0;yJQOuS3zPLbAX9A72mGp5otz*P#yK z(SIo6MU*OfMW=TsYfR3D=yl3-59TQ`aPP87dGT{5p6k3yragVPd!>Tp@+%$73y>IN_l)VO}Ib~XJabm&nz{@k6*stcd!JUs@;$J7<>>qO= z@N#$ZsPJd65pVR5sl&_pW9m!R?WigY&T3_po+#e@#U^I+(+-=4)Id&yYt->}K!;k< ziEv}t5#cl~OXPDj)`ChkX!iC2Q@9wb@Pj@mMeVuqcq;APx926zj1 z!T{&80p4z~0fsi30Yq-U(wJ)B1NDU3G&ptCrbj()wcm?VZ7R^i7hf_cd;PRwLhm9o zrKs|o=7CpmC{#-3CnCq&z!%wC`OPuGT|MCs-^@=$1rCiluqY+C>kQ$Wlasw3@3vYc z{jWQ!8d}grm)HsV%*QX$xE9yjnOcsk(ETr<9Nk~XozPvB`41beyUg>R+KQ=dma%0Z~*a=TR)EeS7lP zD^F{*BCqKwg_GAb5p(BtRl}9PRw%z{kZ;be0H1y46!S$X72i<%72FlDOF2q2mvHIh z(mYwwoC50Ue3qjx@zu~KkxvB^x>Ly(x|c6p*aJ7l+aCRQG)(_LWUmhd?*N9d!Rtr- zc*Wdo)pqOrZP;^x>~k9OP#d#V<-TTNgT^FKSZesNBnoSz0k$CVW$&<_EVXb))zwF5 zs?I>#$ELahl;{tNZHk%=r;iZSD)`lKj1NHx<9-E7828y{p1CwBZO+B;F#e4n7^ws0 zVenUR8d&c@qxO*@8ZXc>K-^i1MwUhlGwC28dHdh!Kxta#7)KZ)dIwtDU;|hk=&v_G zqjjK;+VOUv|7oz={Y9M`&T3;BGwj$1`Th#$v6AnkryLtr{+iLk&k#D%aFnHIj3SR8 z1tkjm9Ai#5+!)W|2X+*6F;Mz3PKD)&Awo+Msa1&4nEdazB!giJQ86alRKr^mMAcf5 zCQa-G95ZD8&0amSXX{u!nkLW9!VCG?wZrjrx*P{_25J3F6e{z$S7~Lu?Yr}Fz?r9= zKEpiD9F`Dx?&FlU@8UF1o#Vx{P+@|Z2&NrXJjD>0XA|Olth%ds*zQShqD@Z<71jk_ z>GO*SN9R^pADCN;C2MqWw_xsak~ry$<}M#~cz3Y5k)dgU0@E5k1PnnP>W0ezx#mD^ ztSF_l-XIJ<-KG|TN`kpk`B|*sd&~~~5|k*-^`Jy)2EhjyiIOaK=QXtq9&SQM#g`{_ zSd^fNkG~E>->Za0sP{icj0i*%+=hIb%-Pjcc%sf)E%l<5IlKJASB!hC!LY2xFCFbL zfaW?WP$1E`36$uw!i@ya?tj9iq`Wg4Jd@`;EutweXS1xgHJd$uI8KLZ6Z#g)VW0z= zCT=uw%@Na9?zgGGKFT@k00=22Z@&X2@^3CEC;zCG68R^_?P??2-|Kwq2$gw5)eF_!IG0cV}`4?U$mZ zfkfWkO9dy9pP18{iHLWajEWQFND$);A%RT!*Bqvo#z+O`{&3aPRYG0aJ4n{gqa3n( zCZ(_bn!K!LtKAKYh}X9k-it&dfSgB1Ch%4pz=iZvUQ$RO%OoeX*icOrw% z<>7sAVV<}%=t|B8fN1V=4xtR9wHJ{=w89%JgZc{z8lhrcX6up?S79rRsLR#1F0_^+ zblDk)E+bh2t6t-vYf~o50G_H*2@v^S3d+g%TX9FuZ=B<&zY~P58o}zL1QJS6d{!@I+mZ}kcO!>T z38Ez(VfC+Z7pnx_z!Jo+nDzqpIWRi+@J^*0mJ}M6z(>Sk>6RC%w;$aSbru8`Rq#4c zA}ekKBC>si$!lFS3pyD4&5c}+6Xx`PawseLn}BR zwCsV$pE!hah?c-a4%Ol=Ru0|I5=6+Mu#@7(>NoR zKQmHNwi{rcurv1+9sjE>Wx?jne!v=Dv?u7HUw7FS?>c=azbq= z>!>2~7fLXrb=KD2q!s7edF|p3N`uxeKBTpakHp%=?Ywqj1>wo73=of`y1;nQf)d%6(8PBMZuq4Nk%i)f=TC$I<8JY)IR!%Uy6qf7SxB=%k%hGXELIk76%sT; z7H$(raqCjca(eZk`~4h3y3hdokX1IyMl`5470uzCZRDjpb7i$KqUxIh7$4{JBAj;gQxObY2YTUWY+ke1KOW@^xzleofXG!VVUtLB-YqS7%72`Qt{}E+m4JfCKypKC~840j8 zXf-LmoNdkd2N2D*h0W({fo3VJmu;4`c+iGD!b8{mK+@j4^k)xiE+NNaLHYLxQ zeIk6geS%+QlYu9O+Ti;ob7nV(x9AMnyLo5~eSQQb)AHudu^#KZvPG*eDLd+-NGDX& zn!YHCRiM`5muh^6t5X1f!X4@|YGHF;b-9R5))2fh6p&(fcDA?ZY-H66RBWte~EwIV$T0@5ynS+{S9w{=rXKpJhJ7Ul{ z$^S**t)J-jN519FXyQ{e{;hZr`4)9`Vx*+>ZDRiaLLn83quHgF0UHirYd#8UEq-kf0G7 zr6IO1IdM&*u8XM4cv}~GswH%x<4|JhGPcol8OKNsDwWBB;9p>U*|ZJEhBC9exwZ0} z)S}8=iA9w^CSqSnQRNCO6tNu%1@{*;aQ@E%Z_zgi$>%5I7ksq|o)~PyPOdidrH{R@r3IB1xeX;h8PBx>bLj}*qb}@S0awbI z^foB*Kyw2q@ucT4sI~Z|^85ax0;J{e2YifEkd5vNaFfU~RDk#v5^v{J0j{}QID{$y zEpLlLLr1s7Dm1f%1dUJuZnkxaZxvxlL|sf<7h19vy3p|}v2-bC2~cc<`%_}Jr}9}S zJ_l4@fPVQYSk5ZEZy9rN=>MPuGs)Zda)a;L_Ex9$6m(fY>Xaz zkw8K*kFRJv4*u{x_DT++VopoQqGO zyr{4^AuoFqc6LlFwWbwK7G37MgqJj`0;|_zs|7D`R3N9DR0dY#D>3j2wWN&SKXp|w)nL zBZm#Lun#uk3cV*aiF4R;5d7iW^Y1x?EKiH3!t!(iO)SgT3JDs)^4~EM+H=~zK(BwA zkzV$+8uUKdIN>X4+F6r)!^A!WWW&|TeL^*TLRV8B;9)j)(p`O^ezDwjZ@*+GYTKm{Ow=}d z&%iP5aND%v-Q=z;PGgw%0!I43rRmQRddFQeF9(14g3y;ka4~2ZNE8G*Y9>}e$QKec zLMzjUk>apC&lRcDP2*0t{8Do!`rG7C4Nm(&zbj^L*=tI69aXP8&MtDZlp) zp#x`P=~BuPpcqFfHsRmBer0BY{iYPXQ$ufJW5g@hNDhc?9KnjjMt%2M?B1Z)LPSw{ z5R_9?R^d+639*m;c2=%2x`pWiDemFi67YvFbS8)3V$f7vWE34*6Dy<2g#?XI=oT>& zvV1TOG@0bf+&1(Gj#3eitIfN*V_Sx~AP3jr&R=qZ)xVf^9S)Z-m_y$DDRr^uz5K43 z@F`z$D_7%m7vFk1dULFR!LnF;v9dz9#NN>Kq3jy|!>6MA*O*JGW)B^CvPh0;Dfj}TD5}~T$6?g zWApVm+6-Tbt}80<^9v3(%U(DKX$9u?!y|yb)N+UNtQRNpT8V^lxVt3-o%3FUltqB8 z=jVHIo<3^~YIL1-V~5)@KCdK(s&D~TBpiG$wW$u}SL2%m_-F+w%APpzE;L&B<4iX? zrd0Z`xBa){tT%J?cHv*Pb`EC%PWY?ZHhPOWa7$Sw`QSChfpxFZ>m#!hGAs5aW>?z!)&w$#&)GKyq1*om;NAInC##9KDK-mRKAnykyQab=j zNOdf#lA!3dGC^h8RG*iZ=1%?N8+m7TIytZQx@CEgB5&zpqt}?%*XQ;*I2ZSLH4g1A z^;|gjnERDSbCOhhOqN5JX zqeHnwXC0W=ifPed{~K*cHV^vo{4)@wJ<(#d;4Ny$1u3pY=3UfOXI2!M{__0fqRln% zp+>vydaTQv`N`NjB0Pz$YA1R-4uLnt>D8p_Y-%?`qwAx@uG(qEk=zCH^f+{BvS%$w z!iPUj2<6wydvvP#7E=LEKTE2bSclXLl6QncqY@mxg8Hibq)h_4?d;L-JobiZA4glhKranI&T@^B@2xY&Ny=WQr2=+Ss+ zNQyN4!~?K=XjCfQ=GU{iTakRHRc#iDiznwTsy=Z`Hww{{tG0Q>+v*jMQB|&_DwQh< zM}Rg7jcNt+(Wq{1f@PN;Kht>%^e?lb@ai$NH{){TH}!(4##f-kBlcQQ;<5WdP<>G6 z6Ajww(2J?x*%Y1ro5OyyLG@s2F{q1~S`MlkQ-255nW^tU^#Nw0aV#pbh_U|x-z5+J zdrG4EY`_R4#*Uq1N*dUd52=A60sYtVyi2#B>v(PyUviTmv9=fF3@hPMEM#PpXo zEDYwvL1=CuhY&n1DT*eQj-vE-b!W(!KHj)u7?%qn8etkUK&lh(M#QlZbs25zLaT;C z7c#w9m(y%rXuxL}S2vn2*VwvrijXff_!9YY0;roJ>N3UFg_gC1E_8BYEM0!rXu3>h zBsv834f+HLorBr}O10v39kX^{f{7bGf27$kdFY5)YnrqaWcF^C;tyUz)UEAO{crRG zmHA1wI3;ys;GQ)@hKq%u`4zWzHQ(rt;0|w4CngS3#VUH`o&^6J)R(Czsjd&wP@ggl zqkUA~6G2^wU#f8)uJ1BMi!xM2Qt{U?Xmy#K-|(Xv83rxhh@BVtNzl#2LB=MDC&ZoP z8$3wr0?~#Faj?G668?=OB-y@B@c&K7MoawelU`|+zi^Crx4Aou}2OrkJL~=E+#an`8_#Ln0%3CG_Y$;;MAoQG!9hyp_0;M@H!^ z`jc5Yg#L6c?LdFJ1m=@H)(2^5g8!gss6lRhaE_$*-4-K!OpNeLV}!R6;j~&8F8xV~ zBNqpG!GgZjg$F3cr20{9*OUi&ZWyFt5ZyhFzh>}$T+4%hVVX)FPXBDXM&y@i_9pK) zs2G+9pJEm&JVe(5yer^8TF@Jlr4na~oHghbvgau-v-hu>nR%0S)8)P0~# zrXB&ch^bdVl`~ZdY9Ujffx3gKouC#l1;U`YCpk3sT&(6J1U(LFzqNAgJ_?00k~pxZ z5!9b-6hd&jdpU%jpD8NiP=~yP~?1k(hweTfG6J6S23Q5uU;SFkcOxJ za062ROT^TlJId6b5vj-MX0L;)smAfRQfDt3KBtrOb8cRb5P80F8Z~^}Jo_+a4^r{; z+vztyM%m7+ z_~BV|13tj@!!sBLcMuh5U=qLxvx7nA5>n%xneT{-RIY;z%~85vG8XjNb~ieG7qRl+T%m{Fi@oi-^yv+9&Cmf&6<)Z}FA}f_N&8*1TTzza}Zt!qI zNwpjiU_5}W9ipGZ#F57Ws+Ul&gGqKZ3z9nA{U#B?Ygq<-aU}a)WbU*M=HcL;`sP1Y z?!h7>K6TZ+j=Fz*40n18o#l^HN^-LY)~>=i)g}K#u4aCcXMThdX09QLf|mvY^T$(u zA6@RvPR1_r^8C6$kX8igt0>jw^t~)BswM@i>&px9fmoQBI+qSuQ8kwlF|amRmoP0a zI5EkX|K5y?gR_$orgb(qQIRXXry6=RKLm9!PQa1yP-S*XUhu~R=&`C~JHCaQh0n82 zuQz8Wm#l+1r*$>2T3nr3QMn6?suY#ApPgcU-@H~p{0C8;gwu>4KBmT_`R zuLT|a(oaXppqkVMzpiioL*>^^%sPC^ulXSweWH-PNJ3Bnq1u8Za`t^pFOmi3T}jn~ zzgmd>m4~WeCLi{<&-R}GUr<+0Sz_#^FWO+v95TeJiuIsDoF*@i^WVlFShbd2s_c*7 zs?7BK2(6;ZyxsnSfXYmto41(l1)b{9oKmO-ajN%>4$>8_EmlM0_Ml$HiY=+EQ2*21TXMPwB8m6u&}VQJ|FrQ9bfNiAq7M45Cud zn!z~SB^vWUEo5pDs7_3+0yUqh7eUQsik=;a&`&_o%plSD9F&N=+YUVfO2kb?0T(g; z4$7HTyoEa&S6bEWEv{}@#}vakt}P}%lAm8u+EnN?()@7DUc}+oQ^aHRX1EheCapn< z+T0ct4M4=;qdh3$#Ngv?kx-NYBt0+}1IUlS8-7`SBZtrsF8afG?*Q_>2Bf|Owe*FuGqxwq4n1NY4tS;aGG^Hv1;L zh82(W%!ApLfhDUD5}0>8uEDyDz!ExiDKKvuuECnrVBJZ9J5rls8KB*KYO}7VZikyf z%sm40_P}Jr&3D;j@29x&gj3ULhrg_cKj{v?R}a6#9X>-3zs?;#Ob_qt4)3amw|9rP z)We&)!>OEm^xFe3TR&<8J>l!!;Vzj5xck%+v(vaxx*9m@c&>sZEL(6Hy(}t z=?;He5C6M6{Bhg_YkHR6)UWi4V2!`@JX`|vSLw0n^=dm+dK&6Uwa^`Yg&yA19o|t7 zKf@hP%UT}%BWMlm^uML1q3$Nt@Iy+c25U|$y{sP_eiv9g5O2C6p4G!2bcdUI_^s~n z-|6AkxWg~k!!L1%cfd`srlfRAKTG0HdW>f77>7~XJQ{riFWV@zOT`nu!5#jZ9!?uz z?D)$myjE#kY2a&z&%(`XxdYO>Qj7g9m-vmi@@lqR*yep_;TN`t=;#-?(NERGlilHT zW{O9;{qVA-+eYD!E7HI34u39u0tYmV6WnkM$W z&QcOC9c~G=ufG~_sU6Ts4LI8lI9ZXQ6k8QU*Mzt2G3z*)I`gK;Y5iayqRt)u1h3!mk@BIv+8WKQJf!hQp7J>4SVW z-|s=uxo?oq_PY-hou3BzY`<4PQA3kzth4<-14ZXEr5az`euqG{W4}ajOZh<2;Wv=a z_Ui^}F#Gkf{f2|0<47Q%?e}|7blL>uv;FP^MW;4EKHKjVQ1rTfs!?bA(Szzl6oFKu z6(}Lgd7$Vu&{U(l?bjdFI`$i3`xS$tH^A{ytL;|~swLz7+4g%26m3{eH9oZcz5q3W z{l2yRj)0;yBg_c=@luUsP(t5RKy6{avu(c&P`_ip zt3Y)}{6u2}sBTPM1BynjiN>{{x-c~XRA;8H2bIaxWKbDQ-3Th3sZvm#n3@UdBBpKy z)sd+=pe|%;9;geLS_rBGQ+I+opQ%59I*+Mkpw4CLeo$vK^`K3yw5i8I(a<{4cnZ`x zOrcRRp2HnEA0LKIPbgQ7gR}vuH4f508x5(t(UA5rQpcj=$rD9Z z7{44bjO%{L~2($9Eimv{oqjr0lbwqEFX`J%LvD@`Rpw?Iax(Lf4CF3MDn@Z5YZOkqsid?hr!)B`Gcr+h zI-+oFRhNBQz*|i#Sxf6U=Ao8`tbcOamd%cR&XLH+2`yZumzRs_^=x)ME-ZRkNJzIM zWGv!QbD2``+p+$TyB)h*tX#fc#v&dy7OfvUv1a`JtHn;NnKBmfsIjO7I3HXm`AE@G`o8W(5$<568Q`bIZZ=8Lqk53dD`MicsnZKZVy7PM_Ro5EUbXd6aTUsi>Nssmarhd2Ys) zTGQPV*QYz0j+OGXV@(lk+$Mbt+vj1IPqFWM@Yo&{L23EV#=VfoD!~qSg^Wf#YUw@4 zjztzD*G|)-J$(H>Y8l8~ePSuJu;idKw8^y>R&|wL>N8dQwAYZ&Q+UcYO!>q?u93*+ zX~^d*v2cUkiDX}QZ`FZ$d{Bz|fTRxXs~yW9lE@u^thRMjkDQY5{26^aIr6lX4HfaI zu`X0%^=UZ*mC~|Lri?{AYAhQ0IB8wDxMzhEtCx&LJZh|qlvsajy?Tceiw+7UM?7jQ zsNqVhHfgu)2Z?*Uj72m}d~KR3h$PbZVJ{{GdecqUC#6j%C%G%igYb zS+zpOA|BN~-IQ2EdKZsz(%K|r5sxSf)zU}QZnwp{GmhJ0T{OM2mQN2$9>(?LFksvKNj z4Y?nDRph=Ja)0LO3NZ<0<;-t$9OS_gxxa>dnTFh7L%y7Ojt4T8@NGTrKof-g4xU^-xxzvISRxPC zkVk09!!_iQ%wt(&#lerBbdZmw;sQ5PAiL%uqu}d|3hp^>)dHu@>?varkJ=Mmt;D+Z zua9EzMQsYXD`hO=QCq)j;GpZ&`n^ z*g^IsArNl7Kz8Nn1o%36T07%4G>2C1Tq0u;kD5CZIhK1=FkX|Vha|tmsT%T4%+nXhR4aSzdSa)8JWC?qq#>7R z$Tw-o)0k%~u2e$%-C42FL4IB$Pt%YwaPi1IO+%i}JTF5iPZUqilwc?y9{xwC221(;0W zhTUBf`3?;kmDz)QhlX6vJXY?sEUU_Kkk?7%a)Ip1okbjrS|f5T`d0qU$(?!`i+I%B zG2x@Ob>*5ocQTKq>7P5V9puQ9oQy!YJ2iP0!`CS-RR`aG$dRY7j72=EJa=&{cWJp( zlV=I@+y`Tmj`5xw>5jzwyrhW3zy^a>GTfhtM9t{~x zo|15nhI}9MjKh`c{fFIh_B+VKCGvfYj9|l*KDvGGN2prr?$gp*&O9{UqqJIYdgvr4 zt;Z$ua!rdrX~@epIKD2ww}bqX zL|&yKKcOM7(vY8I9>xdNbMaxwS#;L z#{cBjGBQyG(#O!!;##BZLRqV&#dX$4Wsj^Hdb{@{PFjT$`5l4mDw*rR>sU2=UdCX@ zs`toP#G_huJ;!qE{*ETkyUfEQWKhR;oq4Gv&nk)huBPdG8uGgu@&@K18IHm4mW)Al z4)SLbd4q<$QA6IKA-~T&r{PMYrhC&<{_0pGa3Z|m-e+W@dPpCUU*t2+YKh}^x(U3pZkT)}rCG*rfSMGGI;YZ6uZZjhjl_`B3%a3yT6#KeF zwfq(!M6!ID#33Hl^8d7BSsHKFwD^>HEG<;aKPr(w)$H?`hWx39T*W**LI(9%UDM|XbFD=F!nVeDE^COo z-?AkD*rgf8zEM%_Qw_dIB{N&%5RYn~opvnCK3`~B>|&lWr$pYZA%CSI@79pNR*+T8zbKKvW@IoLJEf0PGLudwe{y8`sZlMz z2V9XXf04u?9@X*~xX4&OP~^VWwAc$@zwZvZ;-FikX6e+Es_7l$Y3-=(#Ns9(Te=Zk>%$_wfwi> zie&lr5{GzH%hR}Bwa>paEozx(1zqvWI{q&hB3ah#Cy{G4`+TP%*J{Y$Gmm8-wY9lb zB7d(T|DYj%uOS~$kX6e+CXo*?G8m1`(#Ns3XpUx8b7tKCLG~{12WU4xTUpaB&ckxOSgAsVK8!3?uUz$f|AIEaf6!@hmWv^os z=CNc}Eq|v(Zo>Q|zN1xRzW(I(Hk@ z+?L1E#Nj?DafnCNBH4}wf?YFBix$jdX`$xV$>a^!!k6Yjrq42~b+Cno98i!|`&=rK z1B^^*+#r1%``qL5DfaD)YM&Ha9^F1~N*v-*?Q^^x3k17>ro{=&Q;kqUZkfF0YNyog zkjN+ay!N40Wz{|>XvnF|LlBhjs^w2S9bRy$J}>e~8gi47_E}19W^5~YYlsLqrTE3MX3k18Cnii)pPk8%$C6Q0@dF|6$Lq0`A zrYHD*AFXnb%AfN~Pfyj5Pgi7CE#FrnpU%jX#_y$%WBC;> zpJLxhQ7zxbmPfbzI}(R@RLh@X#{$9bbWMvi<_T~4uO)Jt&ugDEHRLo6`78xlwNHyP zggj?4GSNMxk7J(+E}vrG*-`D&)|N-Nk1278N3~BoI~E9bXK7lT%{)ILlzO7eKCPVO zl%MA$^4UJGedz5mwfvl|A-89q@Rr{#k=tv?=W599HRSUYWYzM`)1U_2c|MYvTvi(Y z!Nu|!8Qz*&ODZ; zYJRmiQ>2jYBTdQWNFOJ^Cb@iyeM6$=7wv3`lwZpv4)Lg3WZJPnuuIpp=*&Ep7HS{& z>X{-|XCG$g#znPHH(MSn zr=7GWOB~`+wdiig0>Q4UrbQO>gtyO9iJay0+UH^oIZH#%W*+K8X@q{@I3E`Nal`IS ziJa|YWLJ5aK!R}H`i(KZhv{1|Qy%IUsm*zpv(~xsD zA=I z$OC;|%U_`(57dyaWS*T!ms*ldZqBFps6F+LD+Oc?ioxX}%(Toc!AA@+tPc5;ebu+VVJ>SX%rnafnCN;wn29 z2zEm>Eee>&(n4)XTAw3g75LbyuD!&=G~@yedANeCmggQ4c{n3eD#g;rvCo|@pJE?< zF~icB_|>@m(#Ns<1eZ^-@4Kj$FS6y)Eq{l^As*H8*V(Z^ zu$!o9aXs@`TBvQp;}ZFLA8FwpEn|hoGq1c}L!QJuOOY;AGhSWRe~x4M^%8j!BO}=O zN%{!;xYPQbmewRKt;vcOYF?ybenf7v&&rED>EqLZ!m z_L;6Bmuko}m?ymDpODBiH00lF$TKwLnF_M8{u?}Iv@HLDM4rjWP|5gN`Z$(v*Ma=W z(HQ%JsFt5)%cEQVa*0Dcs(o&@V}W2dQ`6!W<{6GqvV8B{s!JTpPnO8H_`H_CRYSf- zL!Qk%;Vu8PM4qi7-=-nY){t*!o;i@0?5(!^n8uA zPeWe7JY`6iEO6E(_18J2r9vVv(2(!YkQZpk3z=t}M4lA<*WC{CA&IU3M%G?C#XGSi(G(7V0>mbw?3viO*}FKWNBHG~}fU@<(f{ zk&mM0prw(>OBtC`nJIl7`#k3IDfUf|YM(#a^62*YP~s4eYM;C9SRmLf)wEc~JgX2& zE#&y`&q4wg_YV?zna^vVdo<)_8uGo&6W;Ra7qK|Ty&Cd;8uGmw^8E_3I%>K`BHz!* zl*%IM<5>O$mk-u|qFR2rEst*bEfR-#RLlR#js=3<{hAgJFi&{<{2-AZ@Odr&poaW_ zhWrro(2k>H@cXv%#{N#8w(7*<7!NTr(RtFxvCnvyPqB|q3AM_#i0fV-TVczi+h?A{ zAs*E}58JUouzN_;VkPrf_EBeu4@=~gKC%zF%`TaR&o3^YV&AH$T0COQqib3+z5&M3?q}@Jn7@u=Si1OvG1Lz_IcKpN4L)gi9cy!QFChWxyS{DR;?vrpU5PW>zijfEvgvrHk+3j*1-R{0l>Wog;w z$_raMR=q&RA|7b!iuIxrD`9&&GQ!G>OJpqKQDgm8iM6x*rAM4t17s}XQDgm0iM8@^ zUmqvdH8K|QsIgvBVh!5-+&U-LWEqQi)L4I4Vs&pr->$Iqx>d#^9yQj>O025PTZ)`m zcgk4AqsDqgiFNRk!7H3t56W1?gIKOr&{sKD3bGRfyBD;Q@EY@2WlU{Jo|DM0`O>6j z+oX?EQ+%Bzv_W&d@1xd~*KK*MGURB{Ug8jss>K_2ED-Eo)3kV#c`Pl|mZYyle$z)< zxb5=~4f#zCd9{MP_tmxs9GRy`_^MK0- z=RZfa&)c>onwd6=b#i{34Ox zWn>cV!me~BM`@88>hdY}ofXwS@7eO`_L(Jdh)1>020IoAcJFFhY-FDB_E|2GH~PHx zd0#``s3CvAJny6JY=N{N+5Fc6r?q-ZB7Y!|U46=j9Lv&j`0fX;Car|~QpO@4XzGgf zkrL~>+4qleV*Mav5sw;clM*X$=?gD8vHaacn#7~V`dEo|@;y)g;KVvn#v&dy)+b7= zWxFr>)``_t#v&dy)@CKv`6>VWw-YN<#v&dy))pn!z`Y|bc4GCCv4{t;Tz$$vIhMOm z`9RClPnn0dVNss^vf}IQ4)Rcm{HZUELvh-l^l{4kOD>;c-+-uP{xe%1t28)iRZAS= zQMIVDV}W4zsisAUdBT_Z#O@+i$VXbZ?Xy)w4r$2S6l8VJQiep{#>kY)MCs$$XNk+F z*mq4-`)s%6(e3k^#33G4iyd|>5bU;TT71qt;q9|SB7g4l+UE-m`Ew1qT0tK2!$#L= zr)idur<#$8?jd~~`%H5A6#FJewa-pl9^F3oNgU!)?X$~{1%h3*rp1@c6W%_nCGwX( zuYGoF$X{y6Uoj7i!s|9o`UHRPw3+)P@>d%2*BbIy8uA|Ixm_Y(TKftTffu{e(LRvd z*D=pq5I6wjcS`>Gje|T=BG+lihc)Cn z4f#jrX%AGg^UZ}{jCGJriTtC6{F8?KqlR41JmE{rQxdtJk&&>mMfx}`(jk{mv5&r; z6uGqgY|EpUmexH9A5UMwqvq)^b}SI=>NPEnFi&_bx=G|CJ}NEbu9rTJ7JqR06#MAA zO_8;rph)e{s}>G;R4sgVEK7?cnifr%C%hJ0C32G{mKKRQtPC!e&v`DNVqbMsE&R4T zdR`2WIK-oBkzmKNv}i(00P357QM4$Q$j8`P{K+LVBEqf7p({CBfuZkJ34h_I_63Qy zJh~R&l?8w0^hu@VjVbnf1*i!ldxZl84HTGgj(HzUX6lWC-> zK3y=K@c48wsv(LCxl6iHq55?0W~}u1WEyi+pUf=dT8~c`Bgf;DZltL`8JN<0d@_w{ z*vKVMdX`b)@#$i$^!TJ3b5x&B-HdBJKAA?2+b64AMy5euoTRkqYkK_UzCK_vP9Y!V z#I06Zp0;M5@O9_dUW9^^H?`7os)pQJLq07E^7#_^G!6N54f!+;xlI)0ffBimhD_hv zRjtuRL#A@(ynCyTSEozlG!6Mo4LMCiJ}V0H{Sx^s4Y{p`d=?{DAO^mSRn&VTeeJRD z*eO%SW@NBW{taHA-o>TYPb|6e1`$Er6crggd#3m5MW2ey>7Cho#8ne#=HwLQ=I4wU zg^%M2tPA=I8TlVyNUhYb2T=!1+mkz6Yxdy_q75lm|^YVM<7IezV z&BKL5yQ`u7?2y6J$KFs{eDlO!QzuU?xqRX*X@-#n!<;N12$NHm_sQs=H}SgS8**|+ z_GJ&Nbf9QB+*$$ghH7ObGJ`A`3Ii7oh(c2IW8HC+f5QY@st776AW|hOE5~=w=+qru zk-YDm(QQ2Copql%p;PCK^iJKa`_AbiFP-~tN>+Ey?8b$IYDqsb7OC8CP*)VF5uI{I zQI1?ScHHENNb!=GV&tt> zDD642xEJOPxGE>7Kb5~2wOm%6J|$D9Xw?Vh`m#Z}!_qTE0n9*+w=&)pt zajC#X$Vo>Zt7LjgufqVfVEpiHg=`Tu$s<;L*(61Y7cniFNa2v~eY@v%cjSw!H7m^R zesu9h9A&&AUHW#->(WpuN2DWOmxjm7J=%Dkhji}SIj?g=xrQW$2dFh?{rgs{W-YKT2mhzpu6;Vs5E1QRc zJfy)Yk3iu+ns|NFyADb38n@Klx)l|n0oJ6>fa)*+%n%dGWAohfu6gNQ;}pXixBH+5 z8>-s}DI`kgb1WdErQ84Cw=9oD6w;f)@Q5?AUTi3fKdepK;>rFSie!#-C1?TU&3 zZMCe-7@po~SbC>|IBJ3gm083C5iiu>^sd9xyT&P&#|XV<#$~!f8oUmhI6m`=sU=g! zPR3|8r@L2--sxQn2VB|f^4z=u`3;X zim^=Q#IfYY+1=dO?wv9^VN$2AG+lXLQcW=;B3*XB6#`KJHPpHR;tVG%dj>b6;iV ztFdFwX3b=K7RqI==uC1MLu2Bl40|C>3w9->>Ky+Jz}8uBj$&x7M{tSb=pBR2(p+cr z=&m!kl2f(MjcYt@Ypyq_F*MgBxI}R@kHKbXuCsYG*BRW&$%UFiZ}T2Q2QRxD(kZk0 zG~X%Mmi%5MmR`+}cqS{ZQXVB$OIy8LilMI_A*{wR*esoOwlG@9GZ}KU)*;;jT6*i< zY7D*g2yR$Ar(>{Ldh2Xq^v;cI8t7=QgSthuHP;3Pu{75rxM3a5qqEtXYi!{(k83jP z(p&>|i)d-??KorT?PYgE+FD0tvUK(`vBr+{-e6ZkYW0t6KyEk3?jAmds%}P{0J zk-<{Y&EQeb9pnO6Rf}(WDxU|9@05-KWoLRwBUabLtnkIuIEvNXdPik*wD+=UHt;gI zEMaS*k2Ydxp+|7T+J!U*o27-$7N%;(yLjUiZynYxq@9D|)=XolA8Bsl^sUyQF*c`V zgs`06+zcnHODVNzkBEEW$}R}{%qW&6!cC>Zm?1iwZ3B(XYXFVGrM<0%K2M9Gg&x5T z>lEjxsTW#W=xAYzbNs7=t^yr3eXBrwXPYr}_p*o8JSvl=x0lJ2civ!ELTb5o?5^{rT1MVk0K z!rCoWY*t&Zu&iFi!ZNuuQ!_oc;p^3z<2vEVU51kL%EU32aTI2kWUjo9%wiiuVeuM4 z33Ml6WvhE;6+>P(s~gI0pCU3?vbq^qQZ)}6w$SgiOKw=VV3v;Vc~lG?-K=gXTgQkD zmX2-)Pj0w_T;Qq^;(cNvhJ>_DgPgndQD#pu^wp+XVJfDA=aRdp-Q%bz9<9|tcYG^< za+O(6EQu9nH=LbEDxSh(<&w(cl{iuoYECumfsoxhD3h5O$|}5yB382*nZr_5;qYjx zgt_oNiZ<-&m942dw~3*u%IuQGX$_;WSjws_9&Ob?R}!ka4Se2~-u0@fnHkRWHd}q~ zj3I^ryzDOd91}!kvW(zm@|eLJ>`ut4lKR*^hV*&_H>_PXW3X8o=xnTmnonXt7sr!D zr>D?y-BMc0>to{>%Igu_u(t9s*evCBwlK=Ohhq&gfsXEyRW)#Y4`A)`?j1MBFq)U$ zC5BVpqcT|r^D=qLyEoXCkg9LokB!x64SeRTMsCnEXWP_aN2@XH9X5{37LL(lb6S=U z%jq$HSRQw}cC`z;&m)Fb5yy=BKqd}WORw;(VX9$6pZhyaQTQan*~L2|jA0QkyBpGO zilQ=ER`4=;GS(aHPDtjdvdKHT+zP83%91%UgOpcc5VBfDEBsI`xMb3SC zw@i9x&En6<>f9B3{hfQcIoJx%#9oaFSq^{t_-^CIcA4n#ch4xI^ql1>ZQK;YtQx;d zZKuq>pNXa8uMhV=66C+E zfB$~irDLt~;?Y~yxQXNK`*B@5O)ScC?#GVL>N2s5{r*noxU4Q?J7M>c6@T3L3F+O& zIn^H3me*~pYMd@#<#MWNgkfb2(?*EpQrfAq@$gz^j=<|Nb_6bW>Q;_dHJ;0j`)QJVfgb0<+-C+ z{5HPpO`f>$z5KE8GaD$smp>N1>-~thie28WC{}_tYESDEa}4VsUnUn80l)yVo0YlhZQUeizSoFqKZSWsTR`q`M7g2 zOpLIC#p1K13&W?1h~nz%kz!a(WezJ?6c$S+l|_hSot{8Vs7oGq5>~AMNBnuLGP~iN zA&P>hu(%|4C8rxb=b&qw4e;Gy{CnfU9%HY;(abn@hFr%9B@@S&&X_3fa1WyQ@z$OE+bqR8 z9%iT&@<$LQ9=;qSC9mUzv87`zCj3ppFX03nlZhWWoJ(Tl7@aCQmQI{m%0A-K41dxj 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%0D$jC1=FlDk{`c%1#_t}odH9mD+%L~E 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 ajhu*i0E?U66j2NIX-kBs)i0!HO$?Dux}9c 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

=`4vO?WkY!dV_t;kn&aOB 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%0Dh%Xojj}Yf~61}XG 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

sbhl*<#@q~J{ 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�!k(TJsFE_U`LY?W_ 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 *inf(qmGag5WhFnXW|W4J%pfz(A# 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 z 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

5bFcxd++g(Z825uMd|gp*Rc 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�bWtzq4|2e)yU@sKDSz9Ooqir1u_G4%)u~}f$_kJ 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%0ABx=IIfuL+GR-tGOojdr}b}|QaOA;bStdG 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

^s4t-!bnG(SBJyyrmk$^dxFfcJMr!}!s- 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 z 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

    4-W$BU=aJXIBlKfzq)3weaC;2D}tdErR|@KmNw zv&iVO&#nJhx-eIbprbP7nsLCfc4LnN1Ri@FYOUj35z80xa=j-HfXA}UWzb0yCJYdH z-QDs5T=GeFe0Qemx0vWB%NSu(J+yegfg|k#0+%vq=R**A#k8T6yuvq+?_Morh^S`k-^RUANHQubi~X1p4be0N0QzXn+dy7|Bdg76~lj9B)=!-&8Kq7 zr$BB5$abF2f?JkPSV$f_-{4{C*8c8i^4R9V?Q1~?!KrhVDT{K8c?b*k=W~@QFRUEG z@Ey_hEv)H)u?(-i^XA_=Xs9WA5XYLzTE}v&rE4=%?Aa?2$NLTsT?7MD*knR1th@4S z+C+6cgnM0ef#-Z=}e#|xH46O0eA?3-4-9;h^X+(&M(^cbd76L_7N502U5BI-~V{kmz+_FCm23A64TeNTfQW)((pAlQylhVuaMLd12C_!FI>5rzA19(^1 zloBpD4yE+Vb@dg$E6*!HC{zf2CRCf!uJ2r-C?-+b^_?pg?O@bHJZ9!fDagwXXIB8(8clEI&+ zoE`M%sloB&DW^q(0Um-QZ*cf?HAOC^oGhZ~rATQBOvKYyr_$a_DgDuu^3ix#*m*hv zR)XVDO21rJQ|t^Ar{2=r8#ciJr>krfUMAtEG)HjQl-q$D91o?01_O^nWvjU`atuwn zjs17AB?mxCuf-SfUXK`SAEoq1Q~IPGAwjb#Ws5904yE+Vb@eB|D^H%XFVSz-*(kh< z!%t~n!J%(<+zpP0QuH_Qher{(^!DI;Pe0&d^WXTT+-?k$} z6z5$sPBIFPLn-}oT@7Os>j-b2vbPBaPC&Ii=A|HhO8X0rmr{e{p%l}%@Q3@xdCBZ! z`P=upl=e524iHLj04DLCzZ?b;UP|eYrnJl-XH!qvW(bZ$DgAO?t@OL{DG^GJ4 z9}bS8lkEZnN{y2Lm6�B`sKQM-0#Xm zDVzFWU^7&k(lK2qy;5+zd1`Pxl#UggwNQDH*y3Rqmb#SkO6hzjjo+1r((%9x z25yCFqm1i9X@TH)DK$7AN+$>o_dM}p>pS1+U+7Z$h@o_XQ2J+J5|5W)YvHAo{%A@Y z?Fb2y&G)he6�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 diff --git a/import/DirectX8/bin/DXUtils/XFiles/conv3ds.txt b/import/DirectX8/bin/DXUtils/XFiles/conv3ds.txt deleted file mode 100644 index 91e14d6c6..000000000 --- a/import/DirectX8/bin/DXUtils/XFiles/conv3ds.txt +++ /dev/null @@ -1,170 +0,0 @@ -conv3ds -------- - -conv3ds converts 3ds models produced by Autodesk 3D Studio and other -modelling packages into X Files. By default it produces binary X files -with no templates. - - -How to use it -------------- - -At its simplest you can run it with no options and it will (endeavour) to -produce an X file containing a hiearchy of frames. For example: - -conv3ds file.3ds - -will produce an X File file.x. Use Frame::Load to load the frame. - -If the 3ds file contains key frame data then you can produce an X file -which contains an animation set using the -A option. For example: - -conv3ds -A file.3ds - -Use AnimationSet::Load to load the animation. - -If you want to make an X file containing a single mesh made from all the -objects in the 3ds file then use the -m option. - -conv3ds -m file.3ds - -Use MeshBuilder::Load to load the mesh. - - -Other useful options --------------------- - -* The -T option will wrap all the objects and frame hierarchies in a single -"toplevel" frame. This enables you to load all the frames and objects in -the 3ds file with a single call to Frame::Load, using the default options -(ie. Load the first toplevel frame hiearchy in the X file). The frame -containing all the other frames and meshes is called "x3ds_filename" -(without the .3ds extension). When used with the -m option this option has -no affect. - - -* The -s option allows you to specify a scale factor for all the objects -converted in the 3ds file. For example - -conv3ds -s10 file.3ds - -will make all the objects 10 times bigger, and - -conv3ds -s0.1 file.3ds - -will make all the objects 10 times smaller - - -* The -r option reverses the winding order of the faces when the 3ds file is -converted. If after converting the 3ds file and viewing it in D3D, the object -appears "inside-out" try converting it with the -r option. All Lightwave -models (see notes below) exported as 3ds files will need this option. - - -* The -v option turns on verbose output mode. Specifiy an integer with it. -The only useful (currently) integers are: - -v1, print out warnings about bad objects and general information - about what the converter is doing - -v2, print out basic keyframe information, objects being included in the - conversion process, and information about the objects while being saved. - -v3, very verbose (mostly useful for debugging) information. - -The default is -v0. - - -* The -e option allows you to change the extension for texture map files. For -example: - -conv3ds -e"ppm" file.3ds - -and file.3ds contains objects which reference the texture map file brick.gif, -the X file will reference the texture map file brick.ppm. The converter does -not convert the texture map file. The texture map files must also be in the -D3DPATH when the resulting X File is loaded. - -* The -x option forces conv3ds to produce a text X file, not a binary -X file. Text files are larger but can be hand edited easily. - -* The -X option forces conv3ds to include the D3DRM X File templates in -the file. By default the templates are not included. - - -Other options -------------- - -* The -t option specifies that the X File produced will not contain texture -information. - -* The -N option specifies that the X file produced will not contain Normal -information. All the D3DRM Load calls will generate normals for objects -with no normals in the X file. - -* The -c option specifies that the X file produced should not contain -texture coordinates. By default if you use the -m option the outputted mesh -will contain 0,0 uv texture coordinates if the 3ds object had no texture -coordinates. - -* The -f option specifies that the X file produced should not contain any -FrameTransformMatrix. - -* The -z and -Z options allow you to adjust the alpha face color value of -all the materials referenced by objects in the X File. -This is best illustrated with an example: - -conv3ds -z0.1 -Z0.2 file.3ds - -says add 0.1 to all alpha values under 0.2. And - -conv3ds-z"-0.2" -z1 file.3ds - -says subtract 0.2 from the alpha values for all alphas. - -* The -o option allows you to specify the filename for the .X File produced. - -* The -h option tells the converter not to try to resolve any hiearchy -information in the 3ds file (usually produced by the keyframer). Instead all -the objects (when the converter is not used with the -m option) are outputted -in toplevel frames. - - -3ds file produced from lightwave objects ----------------------------------------- - -There are a number of issues with 3ds files exported by the trans3d -plugin for lightwave. These are best handled using the following -options to conv3ds. - -conv3ds -r -N -f -h -T|m trans3dfile.3ds - -All the 3ds objects which we've come across produced by trans3d and the -lightwave object editor need their winding order reversing (otherwise they -appear "inside-out" when displayed) and contain no normal information. - - -Hints and Tips --------------- - -Some of these are pretty obvious but are probably worth saying anyway. - -If, after loading an object produced by conv3ds into the D3DRM viewer, -you can't see the object then try using the -s object -with an integer of say, 100, to increase the X file objects scale. - - -If, after loading the object into the viewer and switching from flat -shading into Gourard shading the object turns dark grey try converting -with the -N option. - -Textures can be the biggest problem. If after converting the object the -textures don't get loaded then make sure that the object is referencing -either .ppm or .bmp files (using the -e option), make sure the textures -width and height is a power of 2, and make sure the textures are stored -in one of the directories in your D3DPATH. - - -Known bugs and problems ------------------------ - -Currently conv3ds can't handle dummy frames used in 3ds animations. -It just ignores them (but will convert any child objects). - diff --git a/import/DirectX8/bin/DXUtils/XFiles/convx.exe b/import/DirectX8/bin/DXUtils/XFiles/convx.exe deleted file mode 100644 index 3987468f14979c791aa1273401bdade69f6d17d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22528 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 I|7hTU0XMb6pa1{> diff --git a/import/DirectX8/bin/DXUtils/XFiles/convxof.exe b/import/DirectX8/bin/DXUtils/XFiles/convxof.exe deleted file mode 100644 index 14ab41634faea02b17a68be7166947dfdce96468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56832 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 D%3fHU diff --git a/import/DirectX8/bin/DXUtils/dbmon.exe b/import/DirectX8/bin/DXUtils/dbmon.exe deleted file mode 100644 index 1638ea64230d82b46e37cd0fef2f37b236af2967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5904 zcmeHLZ%kX)6+aK04G1J|g%jGQ?dxPTrV-{A+K@C+A+cH5AUJ>_uyl`y{op;ze$RS- zj!j!ds5BouH&V0@Q?x&t@*y84OZ9{%Yzx>)<> zBdr1}I_qo}VK_w8Csos~vpsvtGE20* zdaJahp6WpPOp!X@h|vp>1ults710);44fCyy3j)>5h2dktl+R7D~R#tz(h*yAPVy& zKs3(@-lV0VyK56(CHXL7I?M#frz#n@&D$I;=YV#trYKvv*0QKfG|?7Q9TkNAOay^o zzq}62MC(H6ZFbs@0uyV%T0}zb73`Z`7mmy2Z+(7`49b&Rzq03x7_;y9?CHcWYz3q<)4E$FzaP8vT*=K+Jc9xx8K6xYC ztG=6kAogzd{TElVmrkr?2Y;|4c&Xo2=U(rk+)n^IUjZ~z?%7{Z?pMJ7+Df@I;9u;l z%B_7!xetCux!Q-N+@Xo8+~NVs{RlD*A5gBmpz@u}cdJ(_QE^{#EA#lu>|z3%cV}@d z^Ga8@Ack+_@ilgTQJl`Kecx?P6E(MI_Q{~dCX<%APtK}_BTuPDLW?~qYql*PI3PF2 zP!mf0h^bB{G}*D_q?(e`x@v1NIjJQrd#3fy@=;q;9ZjBsY1T~{=Co{0#2gjIJibYMpWNd~js0nLzW%{icOFq*xW>mK=(|AU8 z49nceZOKp3Z`o7k=3<95XGn`?Y{QueYU!wLq#Vl*s?o%{*l)@AnucSj3F8^<<7(?v zcscmCaNWy3lKuh^gi<%R+A$Ov8I4P)gZ>UBAN03i5*Q6H1pTe`kjX#i?{IynOj62UKfImaY=CLjk3UE29FWscfK1E|=&V6&gaogwr{t`?! z{_79Dv(HIx-S!t$9HMr2f(Y&_2 z5c-I5?1(Q0Pji<%3tIv*f%r4&SoCEPM@_-!2bPaqJsr9lE;PtMj-HMz4W16Y z6+Yd6{iy5f68eq0hgFGHPZU*M-+uNTS;~70p`~!4|E;5i$o0YHUw-7eIEMMqpK)IK z|KY~x3Zd0PO`$g5zZgEc{Af}Aje@pZh%64ezTskoNCvOF(Ena6-vAj>zW%ksJ5RrH zhMU_QhLqdfiJnue^XD!)iI(@2>twj%Ux@JWWJMDZN%f z8wZU*`*j6v5j6ZSZrJvL_Ymu#UBLKlz&8LV0rLPIAb6+|^MFObcL8SrDZnh?FrW+Y z1Yi;{4&a*73h+Yz8pihk+`dzlvJKOjBKlrcD&s^^8Bo6z!PE$SXfd$bdJr7=5b24cl zs-vS+AqG;^SUi(s zq1o+372oD`k(8)qI<}RVN+Dy?rd5GHq&rmrTK}0(TdGGicD z&2R~aP7^mUyLL^+5#KUYw;1!?-CPW9^c@d<9KxkxFa+~3i=QY zV%AFobOd-W`X0=={oM1nHLf!J>LStFXUpSLg3Hei9>Fc4Vt5VTIuh(TWaAz*X&TlH zN{|N2CQXqAsk1^RfO{iAdjTDEke_6zk5IJf5M+{gPf;O1gJ@J>xFpf~VJQl`7Nr4G z@F5Fn8`2i&DkuhKCS=FyKG-Vz4#GlO=o*l{CAE>wmtd9UCn;p|T1BY@wPK2DRNb%?$oqTf7cZQwtO9q2^ATg>(X1E%`|dSdE$s_ lJr`KuQ#T0~#BcE0x~*DHJ1%~Aw#6o=sSW6-Hvd0o;6E5e$i4so diff --git a/import/DirectX8/bin/DXUtils/directx.cpl b/import/DirectX8/bin/DXUtils/directx.cpl deleted file mode 100644 index f278af4cf660c04e0cf13dce131630775b54f68b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86016 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 diff --git a/import/DirectX8/bin/DXUtils/dmotest.chm b/import/DirectX8/bin/DXUtils/dmotest.chm deleted file mode 100644 index c9daebb6d55f67c450b7a5e06c1ab0d80034e414..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45301 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 Z(0@L+Mlw;C|qCz{BWw6XAdvfDXW^ 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 J=l>4{{twlsQDguB diff --git a/import/DirectX8/bin/DXUtils/dp8log.exe b/import/DirectX8/bin/DXUtils/dp8log.exe deleted file mode 100644 index f8f3e388eb57f35febb53061fe8b9e7e15da774b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5120 zcmeHKT}&L;6+Xi*_7Z;WvaZ`&^16bS*2xxoF$H64FbpO#3k#UVBvzJTXO`L3?Cf@S zhCpp3yGtInBUC@6Q57kw-1Mbx)I?R)CRL*1;MgQ0l98f@2Nao#hfPUUCy`vMvO4|l zENcU`UDTJhs_*K%_nvdUbMCo6b9cu7)CF=7krS{iqSw)~(qh*SuNGl0+xxpR`gPI! z`(Ed|-rsjpj;1_GEitMIaZgxK)r9UDkvy8AdZMbQy{F$3Pl%GYwDhs6wa|%|k2ddr zyI0L)VR?u8O~{`v`&AFxh2>7wYuf{AJ=!;yE7$B@cDt~w*lk}lEVCH-i~~GT7w4ca zotuyjvSIliEazVp@a`p?TDgX~a#M%7A(x^Sq)jHJR=lxwh$Nd8*`BP8S(s3m* zA}FWtXWGCA^?qEY#@%RHZ&ebv0CXQaz*P3#!l4zD4N79vn-oWg2Bwv&3+F%i8PvgP ze%^O0kTJw-yux_b`1$A2SnjF{;?k2#1;%!{Vh3@ng)*Uul>}qXV9c`I9@v|%X87Uq zsq1iDqpm;;>UA{1pyl4PMv@21r=AC^KNt+gwpqro<=zdGx!Ckk`PBDp_i=9eOo^_V z{Mnc#Ux5*WB%Lu%F2c=VxhtVb-!3p7huV-WcLj4l;Y?q4mcLqTE?oY&z&G>xFUD-ksp?9B%S(~H*!JL76Xdxl0h?xf!Fq zp~I;kO;0ME;WT%xI?MslENgmiY@2y`|J$obU^?jR1K&{OSKwi}kFX@SrLR<4ymGv$ zDZ`7}Pkgt0R%6OF7BExJ^i_MLwi3t9e>>_K7Yq9<->vlIIH&LXS5q#sSI>pS`YpE; z&C}Qovl-VgXMNac$a*0od>Hc0Jd=JW`R;72My|oWXD?tmeb%7mt^qT0zQO;LvDfT8 z;+Q+%$o|HRo#nr6-Q8RamcF;S7*B;>n3-Hz{d)S1DIBM=vCn)njc?pWceN}%p_h&Q zk;z%e`bw>NGh@s*POcc+aqL^b zvD^yk)hA5;6VqiDW&Cr2-fRt`3=PeiQr0x)(vvG>)9Y+{E$X!Yj%8lWo(65!s%~KV z>MqnW`$I>?QMNZ1!Z$NJFUy#vco7N;h?#2En(b8;8KtTMPk6=t8~wpSlfRvjvH_F7 zbB#x)mX+ae&zk<5Vy2YwheFRh{cbPD678{M)bsPN;JqMUuH*j1;h?2;x)*RqBHR0x z|HNJWIJGH>l+-Dxq9PIR7*OLvG8mPf?TK_mp?RsGPr~(^lKl2nOgjsnOdS)%eqD>I zqXAuOCCM=;MD>n@)(?#$^^C-%uucc5EfG%&nv`R<615ljH$)z!Hcb-rTwvHwtjTOx zFq4P|?HqSp(u0zgiY8Qkyp>MyecgPQ@1R#y6rz=aB=XQBMDI{29FoSPI^CjN+fAWU z;iQgmI{r82V7JZm!-8C^QYaKvqq?MyQ5^kINskLrRnSILbeOYEaE#N7u%#s3NI?*E zS<*D3-%v;pV@663Ma1YBdtD5LlA%yI5ohneM9<~qNKX23EsCZI3-B{e*)PEkns4S_z@|LxCu%D5scxn*&5gh=mlt^=&=vZ z7wFrFl^?qu5mL5q6x@3(+;H&FU=2fi3h^4qi(EV#^a12AAeV35R~y8LEH4ROUFeVE zmz%kV2JEpE$U6L4`92+3msb#88ZyggO>_w39{>(gJ@TkUuK~XUh&@6EcnTu1{sbMi z#}m-61viA1s=-Rd@A5?Y1{j-vEQfk3Mh7wlFUFu=sR}aJ!?$1 z#w?5c9y2L-QXZ6ljH;1;0R9O?H0(Wp`1$%JG8x3|RPYn@EHYx69?Y6$mOF3kjC*k6 zCtzjk8D~p{Tuc9Htj)XqpuJ}P?Er_TQ@}X+8L}PAJwZfOc=m`++F7U=nVrz}=eo%G M8Y4U^|AQ;=4|6|7Z2$lO diff --git a/import/DirectX8/bin/DXUtils/dp8log.txt b/import/DirectX8/bin/DXUtils/dp8log.txt deleted file mode 100644 index 027eaff04..000000000 --- a/import/DirectX8/bin/DXUtils/dp8log.txt +++ /dev/null @@ -1,115 +0,0 @@ -DIRECTPLAY® 8 LOGGING UTILITY (DP8LOG.EXE) - -Like many parts of DirectX, the debug version of DirectPlay 8 sends -debugging messages meant to aid you in development to a debug program. -DirectPlay is also able to send this debugging information to a region -of shared memory. The purpose of the dp8log.exe utility is to read and -display the contents of that region of memory. This allows you to obtain -the debug information on machines that do not have a debugger and also -gives you a convenient way to save the debugging information to a file -by redirecting the output from dp8log.exe to a file. - -To display the contents of shared memory simply run dp8log.exe from the -command prompt. The contents of the shared memory will be output to the -standard output device (the screen). If you want to save the debug -output to a file, simply redirect standard output to a file. For example, -the command: - -dp8log > debug.txt - -Will save the debug output in a file called debug.txt in the current -directory. - -Note that the shared memory region only exists while a DirectPlay 8 -application is running and has loaded one or more of the DirectPlay 8 -dlls. When all DirectPlay applications exit or unload the DirectPlay 8 -dlls, the shared memory region is deallocated. This means that you can -only get output from dp8log.exe while one or more of the DirectPlay 8 -dlls are loaded (i.e. the application using DirectPlay 8 is running). - -Also note that all DirectPlay 8 applications share the same area of -shared memory. This means that the debug output will contain output -from all processes using DirectPlay 8. - -You can change the behavior of the DirectPlay 8 debug output by adding -entries to win.ini in the windows directory. - -DirectPlay 8 looks for the [DirectPlay8] section in win.ini, and it -recognizes the following attributes: - -debug=x -log=x -debug.=x -log.=x -verbose=x - -These attributes are described below: - -debug - determines how much information is sent to the debug log, 0 is -the least amount (critical errors only), 9 is the most (practically -everything that DirectPlay does). Note that setting "debug" to a high -level takes a fair amount of CPU time and will lower the performance -of your application. - -DirectPlay is subdivided into a number of components. It is possible to -control the debug level of individual components. The following -compoenents are available: - -core - session layer protocol (e.g. player and group management) -addr - DirectPlay addressing (i.e. IDirectPlay8Address) -lobby - lobby client and lobbied application -protocol - transport protocol (i.e. retries, acks, etc.) -voice - DirectPlay Voice -dpnsvr - the enumeration server/redirector (dpnsvr.exe) -wsock - winsock (IP/IPX) service provider -modem - serial and modem service provider -shared - shared untility functions in DirectPlay - -The "debug" setting sets the default debug level. You can override this -with specific component levels, e.g. - -debug=1 ; sets the default level to 1 -debug.voice=5 ; set voice related debug level to 5 -debug.wsock=0 ; set the winsock service provider debug level to 0 - -The "log" attribute determines where the debug information is sent. -The following values are valid: - -log=0 ; send no debug information -log=1 ; send debug info to debug console (i.e vc++ debug window) -log=2 ; send debug info to shared memory -log=3 ; send debug info to both console and shared memory - -As with the "debug" attribute, you can specify components for the -log attribute. For example: - -log=1 ; default to sending debug information to the debug console -log.voice=3 ; send voice debug information to console and memory -log.wsock=0 ; send winsock service provider debug information to nowhere - -The "verbose" attribute determines how much information is contained -in each debug message. There are two verbosity levels, "0" and "1". -"0" is the default. Example: - -verbose=1 ; sent the verbosity level to 1 - -Experiment with the different verbosity levels and decide which one -serves your purposes best. - -Here is a complete example win.ini section: - -[DirectPlay8] -debug=1 ; set the default debug level to 1 -debug.core=5 ; set the core debug level to 5 -log=1 ; default to sending debug output to console only -log.core=3 ; send the core debug output to both console and memory -verbose=1 ; use verbosity level 1 - -If no [DirectPlay8] section is found in win.ini, DirectPlay defaults -to the following settings: - -[DirectPlay8] -log=1 -debug=0 - -Therefore you will always see critical errors in the debug console. \ No newline at end of file diff --git a/import/DirectX8/bin/DXUtils/dp8parse.dll b/import/DirectX8/bin/DXUtils/dp8parse.dll deleted file mode 100644 index a181b9f1e1945efb893edaad8db6151f5b5b0a59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45568 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 Hs0RK&B|J5p diff --git a/import/DirectX8/bin/DXUtils/dxtex.txt b/import/DirectX8/bin/DXUtils/dxtex.txt deleted file mode 100644 index f9629b823..000000000 --- a/import/DirectX8/bin/DXUtils/dxtex.txt +++ /dev/null @@ -1,176 +0,0 @@ -Readme for the DirectX Texture Tool - - -Purpose and Audience --------------------- -The purpose of this tool is to allow DirectX SDK users to easily create texture -maps that use the DXTn compression formats. Creating a DXTn-compressed -texture is actually not that difficult to do: DirectDraw's Blt function can -do the conversion for you. Advanced developers will probably want to write -their own tools that meet their specific needs. But this tool provides useful -basic functionality. - - -DxTex Functionality -------------------- -Opens BMP and DDS files (See below for a description of the DDS file format) -Opens BMP files as alpha channel, either explicitly or implicitly (via -foo_a.bmp naming) -Saves textures in DDS format -Supports conversion to all five DXTn compression formats -Supports generation of mip maps (using a box filter) -Supports visualization of alpha channel as a greyscale image or via a user- -selectable background color -Supports easy visual comparison of image quality between formats - -Note: DxTex does not currently support textures with surface formats that -do not contain at least an R, G, and B texture (such as D3DFMT_G16R16 and -D3DFMT_A8), although D3DX can load and save such textures in DDS format. - - -User Interface --------------- -DxTex uses a pretty traditional user interface. Each texture map is a -document, and several documents can be open at a time. The one thing that -is a bit unusual about the UI is that each document can hold the texture -in either one or two formats at once while the document is open in DxTex. -For instance, one could import a BMP file, which would automatically create -a 32-bit ARGB texture. One could then choose to convert the texture to -DXT1 format. The document now remembers the image in *both* formats, and -the user can flip between the formats by clicking in the window or by -choosing "Original" and "New" in the View menu. This makes it easy for -the user to observe any artifacts introduced by image compression, and to -try several different compression formats without progressive degradation -of the image For instance, if this technique were not used and the user -converted an image from ARGB to DXT1, all but one bit of alpha would be lost. -If the user then decided to convert to DXT2, there would still be only two -alpha levels. With DxTex's system, the second conversion is done from the -original ARGB format, and the DXT2 image will contain all 16 levels of alpha -supported by DXT2. When the image is saved, the "original" format is -discarded, and only the "new" format is stored. - -There are a few consequences of this system that one must remember: -- If no format conversion has been requested since the document was opened, - the one format is the "original" format and that is the format in which - the image will be written when the document is saved. -- If format conversion has been requested since the document was opened, the - converted format is the "new" format and that is the format in which the - image will be written when the document is saved. -- If a second format conversion is requested, the "new" format from the first - conversion is replaced with the second format. The "original" format will - be unchanged. -- Generating of mip maps applies to both formats simultaneously. -- If the original format has multiple mip maps, and conversion to a new format - is requested, the new format will automatically have multiple mip maps as - well. -It's not as complicated as it sounds: with time, this two-format system -becomes natural and efficient to use. - - -DxTex Performance ------------------ -DxTex uses the Direct3D Reference Rasterizer to draw the textures, -regardless of what 3D hardware is available. So with larger textures -(greater than 256x256), the program may be somewhat slow, depending on your -CPU speed. - - -DDS File Format ---------------- -DxTex's native file format is called "DDS" file format, because it -encapsulates the information in a DirectDrawSurface. It has the following -format: - - DWORD dwMagic (0x20534444, or "DDS ") - DDSURFACEDESC2 ddsd (this provides information about the surface format) - BYTE bData1[] (this is the surface data for the main surface) - [BYTE bData2[]...] (surface data for attached surfaces, if any, follow) - -This format is easy to read and write, and supports features such as alpha -and multiple mip levels, as well as DXTn compression. The "Compress" sample -application on the DirectX SDK demonstrates how to properly import a DDS file. - -The user should note that it is not necessary to use the DDS format in order -to use DXTn-compressed textures, or vice-versa. But the two work well -together. - - -Mip Maps --------- -Mip mapping is a technique that improves image quality and reduces texture -memory bandwidth by providing prefiltered versions of the texture image at -multiple resolutions. - -To generate mip maps in DxTex, the width and height of the source image must -both be powers of 2. Choose "Generate Mip Maps" from the Format menu. -Filtering is done via a simple box filter, i.e., the four nearest pixels are -averaged to produce each destination pixel. More sophisticated filtering can -be found in other image processing programs. - - -Alpha ------ -Many texture formats include an alpha channel, which provides opacity -information at each pixel. DxTex fully supports alpha in textures. When -importing a BMP file, if a file exists of the same size with "_a" at the end -(e.g., foo.bmp and foo_a.bmp), the second file will be loaded as an alpha -channel. The blue channel of the second BMP is stored in the alpha channel. -Once a document is open, the user can explicitly load a BMP file as the alpha -channel via the "Open As Alpha Channel" command on the File menu. - -To view the alpha channel directly without the RGB channels, choose "Alpha -Channel Only" from the View menu. The alpha channel will appear as a -greyscale image. Note that if no alpha channel has been loaded, the alpha -channel will be 100% everywhere and the image will appear solid white when -viewing "Alpha Channel Only". To turn off "Alpha Channel Only", just choose -that menu item a second time. - -In the usual view, the effect of the alpha channel is visible because the -window has a solid background color which shows through the texture where the -alpha channel is less than 100%. The user can change this background color -by choosing "Change Background Color" from the View menu. This choice does -not affect the texture itself or the data that is written when the file is -saved. - -The DXT2 and DXT4 formats use premultiplied alpha, which means that the -red, green, and blue values stored in the surface are already multiplied -by the corresponding alpha value. DirectDraw cannot blit from a surface -containing premultiplied alpha to one containing non-premultiplied alpha, -so some DxTex operations (Open as Alpha Channel, conversion to DXT3, and -conversion to DXT5) are not possible on DXT2 and DXT4 formats. Supporting -textures using these formats is difficult on Direct3D devices which do -not support DXTn textures, because DirectDraw cannot handle blitting them -to a traditional ARGB surface either (unless that ARGB surface uses -premultiplied alpha as well, which is rare). So you may find it easier to -use DXT3 rather than DXT2 and DXT5 rather than DXT4 when possible. - - -Command-Line Options --------------------- -Command-line options can be used to pass input files, an output file name, and -processing options to DxTex. If an output file name is specified, the program -exits automatically after writing the output file, and no user interface is -presented. - -dxtex [infilename] [-a alphaname] [-m] [DXT1|DXT2|DXT3|DXT4|DXT5] [outfilename] - -infilename: The name of the file to load. This can be a BMP or - DDS file. - --a alphaname: If "-a" is specified, the next parameter is the name - of a BMP file to load as the alpha channel. Note: - if no alpha filename is specified, DxTex will still - look for a file named infilename_a.bmp and, if it - exists, use that as the alpha channel. - --m: If this option is specified, mipmaps are generated. - -DXT1|DXT2|DXT3|DXT4|DXT5: Specifies compression format. If no format is - specified, the image will be in ARGB-8888. - -outfilename: Specifies the name of the destination file. If this - is not specified, the user interface will show the - current file and all requested operations. If an - outfilename is specified, the app will exit after - saving the processed file without presenting a user - interface. diff --git a/import/DirectX8/bin/DXUtils/fedit.chm b/import/DirectX8/bin/DXUtils/fedit.chm deleted file mode 100644 index 10ad972c957f95a104c25de2a9f23348a8fa6174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30345 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 j000000000000000000000000000000000002LJ#;ZWODS diff --git a/import/DirectX8/bin/DXUtils/fedit.exe b/import/DirectX8/bin/DXUtils/fedit.exe deleted file mode 100644 index 937b5d8838372917e22f1cd8c2a8d03f628cbe5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168720 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

      C&=332{WC3-J5u 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 B1S9|e diff --git a/import/DirectX8/bin/DXUtils/graphedt.exe b/import/DirectX8/bin/DXUtils/graphedt.exe deleted file mode 100644 index e24cfa2081ea0ee5b1c662d865737619fd9ffa61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155136 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

      il1ahiP&n8eYrOw+t|U9LS?I*P%mQlq*?G@s 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 diff --git a/import/DirectX8/bin/DXUtils/psa.exe b/import/DirectX8/bin/DXUtils/psa.exe deleted file mode 100644 index 6016ad2b8fb102fc09e3c34b1a2861619157b3f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200704 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

      p$HVDniP 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

      Je6-$>p|mH0L&nXqw}pe zm@J8-ak2zvgTzrk-3xP3;;5Z}fN3$scRgtT?F?g@%SY{U2TYK}(Q#%N%oK^E{FcDHAaOK4zXo$n;%L2pz}#8v zyB>6Y)C(p};%M9`fLSkbw0(EOoRv7*FTa9m_L%STQGR#Agi0K3w`7vGlOl1{?Eo>)wB8_?(GsU@511z;PT3wX$0d%& zq4O~RN}LI<OuQ&1k419qy6_WnC%ir$At=*FC>n}$vQ@V4o|ibMtu{jz}Dhe`jERmpHm_)ocl#KgE|m-rAYY zKZe4LlQG z;;3CF!K{%u>VG?6-jX;I+(nqbB#!pC=F4$k2w(bmtA`0`Q7|@%qwP@)vrgh@|J?<1 zQR1jwet>DU!gu+|b%BYNIO+#!F!Lpjw(rw06%t45Jq`1l#L;oE=@Yo`j4yq>wKE;x zLSZII9QCWmVAe6*E|?D_j{4Oln13XWuKToDiQjABOCN9bp!^fZ}kX3S_I5EiKF^Xhj~iksNa{voRK(cmoH)Jt?^wxYL_-J10;_6y#;21 z#F^k8gV`W)H2&>{xgc@We$_C|pY&aij&L1e!X%E)^G3kTk~nIY)i8%7j<(weFyBfX zZMT16I<56x56Z6}Op?UWerbbQC~?$&>tQM+j{5Uym_H?s+Ry(fKSN)9>Eo^6Q$2>j zjF&hQ+zgoY5=Z@cH_QhTNB#5?OpV0R_BB53XXuSDeZ19!=3#?j@+6MNjrlM;B#z2= z1m+WlyAE^nI^X4^{7f)G5=Yx(7)*}D(Q#o8%m#_0_3ni^DRFe%zY25Hdf)Y+_Uix> zB5}0dB$zyjQ?>`p4vC|2;|R5z|3N})i5tf9If{q zm@gzQ0Patib{l-xgZ7VZFvBE{+Sv-TNaB=v1k9@pcM9gZ#F?<(`WrEx;!7WI`!8+Z zelQ~?j>>0;St4=New$#9NgQpDb1*+i9PO8lHu)Jk<4YfJ^`Lg{4>MZg=s1%Lvs&V4 zz1v~lX1Gsa{$x1+&A5MwFMYh#gWCCFm`5d!#``>&r4mQ=*aCBu;XZ`(S6RHFc&3`w(k!xt+x6uALZ8tCQ0Jxe9#87O5$kz z+Xi!5;%Hv?1^@9MU z1;IQjadaHagIOza)Sq|4yeDzg|2~89d(L7ug5@`Q4&YnEgPm(;;7$mhIw1!XdLIJ$3eQ#r1m z;!7WI?QB9?6pT&cXgn>3*(7mve0vGz6NbAE)8<9r<)eOeFHD@o(SDu@vsB_}`)+|b zE^#Kf^Dw_l9L-;v?ZWfk_|nH)J5xOd!HkhOYQG|wGKr)4%O04|8SZD8fZe{!N5_Re zFvBH|+Ib?(YKiLuw;kp)hWiPo%O2n5qvvBEgqa|5{ox*iIUsS=&hNq8kT`0WhI>&y zeCgwD`_jDRL70&eXM(fClu8_pyPIL&k~rEP7hxLg^Ibj~Pj7<>m$(49kucLF&IGp< z=0%C4c77e^8;PU+qXwqaOTOzt+oK=MNQSe+ER#5D=dCdBNF1&AQ<#4xj>hMf`*B|! zU;23KFXUoiiX_eiw-{!J#8Ewtz+7dx-(lJx@LfLIZrx#qOB~H}Cc-S1INH7&VBU~8 z>dzm;)H~?Ad{o~yFb_%`ZMRsMNfJlv~T5=Zqt2=kG|QTe`w`QIVm^`PTwCzuF{ zqk4>jnIUns-sLd+C64AB@51~daWsEv@-prx<4YfJ{h5w~!7wQjNA;Zqvr6JjaNA(s zkvN*yeG2o3#L;}{=2!5$RD9{#|-y9Ow+@@%SY{e z2h4*E7YmamanzqnU^Yq|^@Dvd=OvEH_Z>`=SAExm+POVUD8nVg%#b+h2g_l0N?ZWk zQJBjTNA>s>re%fidQgA98zxHPOmHbM#SFIsW)H)?3G)TR{Rz|di0^t(`2t}q43`cw zi{Vzo>}R-lVZLFw8ki2R$?MSrW*Ea+VdgR1Q!pd>mi;cpHaINb3WW z#Bes4MGRL4Q^9bjVQw&7!((_(0bly~s>cABkql>tDP_3LFvl3~9L%o_chl>*j)||V z9zifE3^xg8g~WBl%ASRJo8dlzsgbw<Odccg3 zI4WNj%qoea`NlSw6AX6+rpY_L%SZF3_An1JTr5ns#L;$}4fCwT(SGzY%qJ2T0Cydx z#k;=iL9R1QxWv(VN5V{(IO+$>U|y9tYQIx3*CoybSN}a+7r>W3-ug4mv-`m$Nt_AJ z2D6Ca%3vxO?ljB|hHLmfj+gk-$6GzBH3jAwiKFdt2<8ikqw)Svm<}KK zE+3s=_JB#2INIMPz$}+Is_!!}Cnb*7dljZhrSJ05_|hIGLgJ{tqhKCmxF=u^NF43I z@4-|{TmYQk3Hr`~+h><+~o#Pw#>mDseRarNYdTIOEo>)wBCU*BN#3VX0gQ4_SgXPy2R1*;~&BNC~?%z4bI|s<@nOaTRo`1^nyu}ILglk zGne7k!t9ecTJPI1-$=n?nh)i{JS}lFe|{0>g2d6hxEkixPkon<&MWSN87^_O zA5DaLLgFaD=U~oA9Od^VjDMBy@=^N*z{E%#wci++#S%yDvH|8DiKBV;r!Wma^Ibl2 zZDB$gE*WN~#8LlS33Eu|s2(4{{KjxiKgaJn@THHp@tN`)43j5uG;Yj?*(Px`4!sI< zN#dx!zreJ;p|n`1297+j`ojKn1vEY{ckj(JK$6Gs-8wissaWuZR`Wsrcp!^yc{PEw9JJEkHb_%fAGV*frbH)~! z?uqYeip|9;Y}0Jn<4oopd#)|Znujw-L;V&Fux!KB$fT&SW{yw;3Ur(>;jZ$(Pa9{y zX4v$uEo)hT5FWhXyIT@&U1?tZV(eqn7VP+F&Zf?@m&^<_A9`reqw7BFbI*+bG9y?2 zbyxT<%h`^7KiSZ~zj1iF-y@ag7k8x{oV)3@mFv5%Z2QrPg^>%kh8o6wdg<*4L&IL2 z6h1n#{Qh5>PVP{0eZ-^RFU&vuQOHv##=hD4(Eb%AH($KI`sd@J>jow7EB=1^!O!FO zY+XL>w$Po4Yr7x$`sjf_Uw`G#sE{^Md$0esrC!hRV>Z8jU{}cfXN`-~@It>knh)6` zgqO95d%j!LFw5%SGuL(cZ`%1Q?^qs=3qEUHHq>x5cIu=nQ-AJ${gJgTEC+(0FMG7X zd&aQk31s@@# zFC4#r>bEnON4%8Mzh=;ss3VO|N46Sxa&hRh@9*?~`d)MYp_w<%-1O2JZGV*9dc9Yeus*X8 z4rvirb7biWTl^P&x1hX!S8~Ge{!?Dtor_y-jb487#bL&7 z7w^f549<>P|4{VfFV9=Bdg*@!UlxVFpIUq)`pGV1)<0@L@ZxPdW)8nC{L!#wxwqv1 zadPN0cMW>d*tO5K;HURg9m{j_|{QYhi+Ke4LHg?aI*9L7oyzV)_AN66&p7k@Y4L)FA8PV>$ z#c^(Limw>GyZyhY)R;XvYPPqa}U>R+xK?A zjDK$#ym)Tw&8tqVzdA_pF^#Wo3CeQkKlj7d?K^17n<8fZtaJoedE>i2qC@Q_#=nz|L(`g zms+nn7ydx=h6T_4{?eRv??-JN{?>yFZvSS)<9~#oOx}4V=J|ou4X!Lq88lE>et;03 zFKoZZgz!8eTr7ki6!PmYgl7u=AtAj)NDmUyX9(#Je->F)uy%Uv;~i)09X~hytA~X4 zoFn+=joNp=U|JBquKpk0E^J>lXtt0ZBrN}&A#P^yGw($%{^00WNj3UEcND?_Lb#Dozed9P8VSC&5N;?e z-%wb-q2O;3!VLu9KuB*TgzF2wzL4Hh2-g#QJt5ssNcR)cm)qJH7k@r5;(%%T_ni_= zEmjEOwPJX@-p5(>;b0-`m#$AY2;sC0eR`Y_4i>`Qg|JBow-CYxA)GcwSf3CM7Q)?y zut^BF5W)r_yjBPs()8=U@^I7nr$4(AyeO+-(X4Hox1|f^&CS&NI3XM&goA}}4al*dm9Kk@g&&D!47JF4uF^!1a<>eY)HI&N{soj9IHtH<*paUZo_mAF1? zVb+s_HYB`!qvk@7H|MRnC;0L4*)4lE-gw8|r+@Dd7yM)7^CzRDw|8#U%P;by^*>kK zVp&@MM%OtXkIlUOzr2Nit(|5mUHR^fhN<%o&v|EIlh~c+sQqp3?|)%m_?YjmW!(R5 z^r4Uy>%WQow(avX#_UYGsoQI>L~nWdxrZkQMx6ZeC0qRi;V4g>TAnY2aDV^om-@WW zXvpS%xx**=?b~>M@92iMu9e{{h88Vq-0?=sZIPdj%rc%emMz8dc^693$F3`RW7U^Y z2fly!fAc%G-f`~dPq&pc{v~GdocsUV@&4iyKQ}1}8FzAg#F~3rd>VhGLzC_suibuo zbNBL_`t+H7TYY!X&cUqz*ikH1xpNZ*3?_{pORno%f!4te$)Q{ga!lTk7WyKYVw< zgJ0iWHh9MyPsBb}v)Y*bb7=ON4sVz@PO+UCb#-~~L49TfHSoU?{(R`4GmhO>`c9jR zne(?)?F@Zl!m(v5x*V^Uv$piL`x*XE@42~XQEbT@W9N3btMQJA z+fMz{R#V>rU9<09eV4nxBwSs2%Yi!vMV16Eow)SfGu!_uN@}O|LxPU^x6-uV5TX8- z4Y&RC;q<#g_U#*3w6*64Yvu+uzQ6tccL(p-IR42y?#%B0$~y&zw*1ds-=qG$Cm1#P zjmGKVTuu7~-~Hx2i#6?YJhklhS0Bk5dib`NPd9()hu13FUB0E?4=V?6*lf%EY~@1( zX09#%&Tnyf=%E*fTYk7^Y4=!ij(^|h4u{Tp=RW+?N*im^QT{$+l|jj&~t6QBBM$xGkPYd>&f z(!5uqR;C_#-R@f9q4mJ4+iT-g|v$MdIhVWA8rLW!L`L zX&WO8f)59u7}xRIpxK2z$K5f!-j3j1rWt9aLmJ%kX7{8Gy>nk0d^n=n;_QEx_C2uY z$Mrk@o;h^k$&+`sYU+Pt_pR;PpE{Bf^5oD@$F6DB`l%&N_B5}w{1~xd*?@~*PZ)M^ zTf>VxVn%h1+|}&FmTA?)u5_DoqQ~5@$HSMr_sjXKpEQgADmM4T9bf$&^2(Msf*&%@ z{`I#{|NiuK|6jwO-aDgL^G)l!rqx_3FFSq4_`+|vzR>XJ!lmDBuK!xk@X&enjFu+b z-(NUlZT6c#e=;$4R@?qVern|Z-Ptiu5Bac5Q1FUx7X2FhMN;ogod>OW!F0yBygywZ z%3B-o!NArJe(b(pbRhoNKY2f&GA_mMW@67DeY{2M*1eDZaK<lP4E*tjVvXwnM9U1q_=SQFVaDLR2_g%hl)Bm=I_&qRi`mn}TgZC#J zBIn)OJ~1--(y2pt+00Lj>U*!>g~YJ2tw*n_H|C#+HE(}B^PctA-s^wJHpku_8oK;) zOs|_;6t>(vp#9Q>&rTY5WEe``4vR01yYkl<>tktQuf3bGc3;QFgZ^q5kkPF%t~dRO z`W~nV+Iw@)j_p1?V|;DK`S;6yd~IdDty`a%aq-R}uRL~Jy~8Pi_1X@M9P!S584)Ed z@A~8R7phLDReXKu-)5(byH=on2d0H?x^?O4_je$?TMc(lZ~Etm180mcM&Wu^;n1gw z{+)Lt2L1hDwz|GoR(?BX%=ZZAs^JAsPPjJdK1}E537?CLIv==v+iBwqUn7kEv3qQy zW&Jbm@ToJ4=A565@Rw?O+D&VY{dz0Hm(}o%M-tzf_|++6MLfdB6Z3x*!dJ4Q*4;kq zq;bh))NkVWTP_LV%R>0abAvX8cZUyC{qm;y`|odua3?jq;@$p#cGaW@U+O=6<^inV zqOQMW+g)krjv^eRhP&^)-edGI^rszI9{p)|ugh=k?0(9)c?qR2O77ME`#GmOoi;v2 z^-Hcdw!09vE@&69v;JvgX)7#WF=xP7A)F?J(}i$}u)f?z-6mYS$G!esAw5k9#|hz0 zld6+bcbzis`w`{om;PqJ6UP%v=D5RQg5TQu{Kt=GyVExbVYA>jO{g3-`&<3FDJzu|1MT zj(S2!Um=7$HksRX?jzWq531YqiPd}FeDs#H#*GaOX-(>H=$Ct{=H_-I&KNg*sfJsg zD*Vhk?Tm5BxA0+im|k3Dk9&Ig?_sOLUN~2{D7#OG0bz$LCOi=4HNEL6}9`+ zSNXRr{cqmIv3=GA9N87K@S8rlvCHB&Z^?h?+FzJ|uc7$^+M`-%j{+foLu~a1ZGHOA z`{LVfn);WdR&RUzb+qRIHNXBs`cxr5>+6?Z4b&{ZDfo{~%gYV{+SS-HSmXt?~XlVT(L~uK1cFay?A^#*56rO ze+!{MU79uTo)a3M{8>`Zzx(?|yDrT%{Y(~UxZzVPigF_w#`%q!s~$cse8U%A&f__3gN>- z_!S|%@4LR&V&hL3HzugZ&x1nxAt9W$Z(YxCe>?4(ukRPqUlPLmgz#P=d{hV@5W;(e z@XJDYw-BBqT<@DLgl7q1@p|#7enbCyDLmXVH~8)W!}ql5)W#Ba^^H;U%?m$oRnw_? zhl^DYl>47g#r<97ddj3LmCxOsGkr}>5W?v~IOK=yyEC#*8W-2c z@h*dF%?!3D8v~k}JgfaiSB!riQX8oOj`RejioREFc=9R~V@M0mnNC+}Pnnq`gd#9=4(^HHG zE^Ikz+>n6sY-zK(-j2Uhw?>^ZZtSauFTMT3*>sE_&-kl;Q+#OC+{aG2@=yEdV&fYf zPaC)Yg7N9_XUpnsd+K@nGiv|o?Dy%1enQwFgd3KxvRz+!%DD9dHU9=e*zoS$JGAS2 zX!6(ADdLlp#+OdheDv_QUkKrALinl>?jeM` z3*iTZa5o`5VMViQOM}zK9aHG|(;=<5klsrO_Y}f`Lim0me4h}0X8Yn+SMGQudhOD- zFVwuc*w{%(?cjZ3x~(smCYJLK|b zvm4wx#XWxfR;3UBDujO#!aob)pM>xYA^f8d{$2=wCxpKh!ruttuZ8eeLikG|{Dly{ zB7`ps;Y&ieWagCy*H)Z0Zk}ssG3xrpUICvaAAP-06CP5UeRGdf#)D7O_&e_T+;b@} zO&;VvUrP(kNqp$sN!R)LrIJGy|6{nm^D;cH_r(1e7m{<>9X`6!*g|_fD0fw4Le&k7 zccJhY?^;aiP}LXP@3lyTalX@i$8C+?n20cqHwbS^DNGB-{y>?GPx|G%%mt^78*JEr&mVi_ za@C-bBOANJe(U1Dzq8$G<0}_XzA$4ugAkr0EWdfxxVPW@2;-L{zqIGNzIqkchn(Sh zYlqHS*xsF=pAbIQ^7Fec1-aKh=AN!67XIU2K3xd!{{GbMSN=F*-0>D|kEgco-f*^W zVbuxaYt7Z|8T`>_=`FuGVchf-!jVsp$o+e9$RUj{8GmBrA3IMP_h;k$@r?tE4bhfW z@tWo5ZXD4t`8e{!Z;7aX%n`z~h43sPERH`VLi$IyX8!NC<2b%OtR7EFu8jC#^J4e$ z`sAA#e~x@^<&ZV~-}||;OK~ex#FBOG?muOmyAsET{^f%Y3fGGbr4^Mcv41$P*Bxzd zz2m7p?)kl;<1>{DE8OX(7X!Lzk8hiTVlEb+LV6s^gX@nGe^39Q@WyH5)+Y>?y52cp zWQY)s@BDAf;x?y^uNI;Iyd3_Z7`{B>#-#@DyVoa%$2@?fniROAoiOYEyvg z3E!#L6HXDJG9lq4))!ebk?(xnb^!Lr?1(kjKx%+p|Ow+Z^em@M|ce!7^cdFkk zFbU&h*6&RlRgK5_*)g;?&L4vxD{HA84|Ch>i+O9~N#m|;^j8`m`|fC^9Ul!d4(_>j z9O+ZlbkoGI2Yx->eLcEFc;2&l$4)a2C!IAu-UjQ#_4!R11-Bi16 zWS`GyebTsdE%J;0-}ZyT`Pu;?yk7{HoNO}Tw&ob`EEo^YKRGV#^M%`%-{H>h(uYwe zTN~ZiPvhU)cK^eJaQ#0>t>2lhjjn#t<%DrTiXm;u!IH72@%^TrYV6K$m$3hy7QD5n zO=DvmjwiiPevB7}d7C{d_1LeA4TDF7{ebao?}vsezZSR8dr4@I zj?sy?H>){eT#|w1!}i}PgzpH@r{7@`!oiFC|8e--DdUk*SYM;$rDuiuUYg%=$o1(b zjO#Ao2Nm^3t`Ba!|6gtRRAFYXdsm$>Zp+2`ANY2E@W|Ki-X4wcJ!<$;$6Ir+E=G8? z8csWX_?j*BgmF$O!f2mELVd*Z_q{^;9wEG22wxViSBuxLLnf>n)lqZ23l_q&V|Q)J zxO~cWJe(zjL+D9$LkmL*e!pSpziv{n5Pm{ATXLt@7sBcz?(X!f!u++fFdlRg!X1Th zW>J2Ywmg|d<1_W)d|kLyXs;zg_;Deu{ye~4-o--tgk0-5?fUYvtR`(Z-=3ih=jBdI z*QPHL@>~ADLqRQ9;e4rDy`Q&GNM9g?=L_L^LU^tao-KsqgzYm+NG}n>Glg)!kREt9 zv%7uzh4k*N5BJAAlr`z`J^Jdyy?ScHQNr>eQTqHsMkXa|{n4ifO)lt(`E_UX$ECX~Ne2+t70(}nOfAv{$G zPZ7eFu;d7BdBc(u!t`Ntf;JqNRcP0SqlUyqYQyFTvsoJ+9x^ms8%|8N4AF)y;_`9P zA=>n)i0%WlVRQ75cx`xOau4118QHT(4{dtV$mEgQFoH?CaMDQq^1XYY%eni*$lm(= zMkXie$`d7Q?~z!cc6oDjT(mY^n3t8W4coKw3bf&?!ujoGVf-oiw&}Rp1JR$>p+Dh# zEz_Q%%Wo`xA*0RDmR_VwpCfF4JARC#^#xN3bm8?ab%#Jx z;J^FgznhuqZ5RA^KeWBI$u~EDOTJpk2Zi=a+s=M$DERwsxw+Y8x!F~9iHe5oy7DPQ z6LmF-YBL{c`)+H#+RDV# z!n)c?iMocWL_L~qrw&!RS#006vCR%_tgbGus7oYjN~N42QZ(>hbTyC>VtZ%nSAX~|Z% zSBWY;tv$(I?V@Jn2b;9Gwy~xXv$~BURH4mbQNB4!W;9k-)tZGh8>SAfxjIzQnI6{zw+Rf!1lH>W zQ2nI6{zw+Yy-@R3dc)qk77FwDV+IssJaX}xJPc22n&hm~a&g>3M)j6~`rtzXq1J!?>jXX@^d7T8REsidB?1g(q9jefvYiHjM zE%}8xgZh*eW@Oo=eo7gt^t2AN)U87-rx=YbQ-vx$tqZAkw622oN^`SwY_EMxDXO?3 zw+VVg5vtIkLB?s@M((hI1${7&52-Dt}vCmbSkL+&05YFk)3PT^6g4dg-&f~2C@tC zGDnwXWc5XxwKH_dv$L&Ps0LN^wzYeTIfE<98J1Nvy09cCTlbjDl%tB?D$0jt zl;#e~D9J6b1OI%bs8XK+pmC?m3bX9N>mr>3s{b^F>|#5G3v>#oQXhPp&O=cFcCjM# zlk;^ls6s1V_DH)M>xt7jYEY%8?M>TvXEE8e)nlefZ=9t9RmxU$Ae^ZNRcIhgwqjN< zdY`fx%20*IC3D0aT5JZ0!s46~a}gr*H%$?$P+w?*vL{y-H;yT+s=x}ItQ1w~T)qj- zs+}~=oV+$b)~iGn+R2*8lH#KBhD6r*@|xiKW0GoA>1o|*Bka>eqX)2`s2)}5`lYF# zTsgG7uDtdXd+jqpEvhZ8u7P#s6BES^iAh-KaY|8z4vV(gtc;SJK?Oyl%d#>GlOs~4 zI#i+Fz^*7~m~`)QWvD`91hednk_>ZJR#=o%TwGxHj+2z53LRCM>-cxPDpXrgdO#he z3e^_YOi5|Uh+)AVJVG6+&>@27F{`McxHvPzE?kj9R9kFN7q37asx35Fnwgtbke!o- zZJ(zQ)fQlJVP0-YNwA2y3Q>jjF?&Thv_7|{Az^Ps3@)#!G~befCI_lS6>3r>?z5Ck zo0RZimO@nNX}iX?sz)rG&F;YZ~fm?fsRb6`%@@hi>Wv%PSgc z>!zWRBh;V@od=oioIA{{uYnm^IlZhlUgjHts3hS_s~ zeo9b<=Fuku&DoYUz15&f*-Yl>5=(k1K@}RW{bq_Y@(c4U>Y)f#>Uqn}$+H(Y2dF_6 z>I!~C_H?5Rf5D3Hq7YT+aA#&p4=2(e_EUi>G*}hpnybHvF|NHbRH>O6q)KyhMq>W< zR)#9nF{rhSVHtS^gX9Docn`&>LR*Zm*_T1uDnS)mkxX#8kUX1itq@gcQxhDPkr|vB zwo-&D^$g|&Cx$yIK@}Rh9;L~N3?BKph~?&#U;6U_R4T; zMX0tgd!`R!{KR_SN*$`y+u3emtoJh6Xn(gz-e5x&n$x_3f}v$23e7c3ju}V_hUJY$ zi<=ao3Ux?}vI|BIYr=k4hAMP&8{Et@N3h14MBTuuYBOp#y`T4sP61Wu`a76Hmidyb z`Z47(llW05fhu+;?0IAKOnj$PKoz<_6wHJ@DK@iTkuh;n)1~-ECx9wu7P8FAQC+zl z8=6kx|8xqdLMQpbEO@sy<&J98$!yTcpbA~adP`E=P?sp5Xy#^Y)wrfp`AnyRDm|?a z9p$>n%-|k!QKH7&LQd3WR8B6hsYq1Hl;ke|$2uKUp)*f!Zt|<9ny)=eP7OWse`-;M z_5sf(Rd!-*x%rkh;P(}y3Uy~$fa>a6bIU$apTOw^*t^P5h0e62Sa$ZPifX*U0soeI zRH5rOXP0IcN3^|CEvlIHoLy|b9_V_ay8rCcy~`Q2o0tZ_gId+Gxe7LdV`F-KOc%m8wP+y*i_Iuwr$n zqKD`vTcA)0s_3z{>FnjJK@~c(+l7;Jfoa8w203jUq6$^?-k&|S0pID1gJH1y4N`b5{Y3*p7-67amQyYdR?0u&Jnno49#_USY zbEC+SYEY${=b`)ud3LfbSd*Qw=NgA=9#wRHP~F(9@`~~Hl==|Oql%uV-~u40W}JCG z1xwvW4XWr)Hqe|eV1t;`|N7dxEc>j*LF!ON@3X}d&1qfJ1`kw-D!Kz?N5kFGYe zSTJS+=CYe2RG|UQt~rNt#*Q_oh2>+a?GkoXiz<2vn_9HlNgb-tK-i?slDhJm`ec(G zl%m?w>=sX|u4>TP-A65|=(8m^yS7=(?Vid|ZE3X@*V%Vzc2|VzU$j+m3fgL;3{~{7 z=4P?9s;;52yxPoZpm$M?Dtc#j8vPD!wp4{`OS3wtuC~##9h9MpK0>(0(9m`&P(_a# zqb64O$xhgZ zn1t-5o0Xx8Zi^V!z#ocGg%(N99uiZ{h%V<0zp6kLI^rbH8In6S8u>{Hs!%UzN@N`P zUKOe>D(U7MRiO%v08QJ{p8AzKRH2pL)Fr#>7s^m=u{rIlpQ}T)MW?&|C+bjzhT^8P z8H|qD2I~}}3iXZvHXXk|P=qRU;vb;Mk$bbAKziTl2O8RH5Tv0K9$i z4b7v9S)Qf`<<}IUirL8F^O#qZp^8};|6u--0#q?wH?%LVP=zXHk%pOvf0H-%uw9>1 zges<~&`H*ERj6WCMEET0NoA;FHj;Om^|dRc4Bf)P2)tYvAI3PR_QoNZ!c0Pot<+4jc}nFRH1vh(vCA(<<-?=%xP0eA~*?} zs~%PK%?xwBt8EUeZKxVMt?5+G)2X0}TR{_ZYbG@|NROYb1XVQ2$T#=d6Xv`nIP*G7 z397jDgPS~w#3|N}RSl}>A;LFy zlQ$|twPn;7E!8PP6}?R6{u2qF9x~YQ6iMs0YX~9NDQ`L%4MK?vrE>)E( zRH4Duc1lrbWUR(fMK@yi6?+4`xT?nP%N43nh0bkkBW8Ukf-&EX94D(o72TS3rX8nF zRD~*fMGJ0aVeKnGtQZDu~hHz`qRAM>pOP4m_Z3odO+=}3RT?7p~pMGc2$56)!Vq;#jDIaM$$Q(D@7H$K$Ov4p7%jpX$nw9 z_m9lNtYUN7Qf2m$17}dY%Qs%Rs z$&XI{tQJ-D0c2?M0Rp^ffc5f&B2>{MyFKAZUZiK1+fnRWb*MrQIol0ThyzG{Llpm7 zIjZQ*VIFcEKh3-aUtaCK0sEywR51s<{G6%ggPxPCg6rG$N>Ii1enad%pGoF<7_692 zRiTPrF~Pk}Yyfw7{YV|E*iLQkz{3qnn0+DnKIn%^QN^tk+~)%|2f#_@1Qql8ouqZo(Spcej`xQG+V(xE1WOMdmH#$>sKu^@o(9ihdwIyVMMU=ven_7*+Ja zC%4diC?#Rzi!_cZ`ZiN`Y0;p}KE3;6@^@(-RrJx&e2s^Fw<$Qh-L3*v++Jx91Ihb~ z`rybdYEeaR%Zz+`njY+6_9W;=RjA?yN4eY_I0}n(of1@W4HZmEptI?<(bcL@MfY=j zy5GEyV}GvJJn&$pW;rJ(pJ=>DIjXoZN1lK+=fQR>T%ZV5+zw&~s^aSM$@U)X`D#$b^sdR~ zePaDM$2lrcMR#}ep|RwHOS3eND(3xn)4)Xgbl6Nyql(!%%qP;!6Nz^AXJ{T(bjLF@ zBeQQWcc&>q725>n-{vQ49#wS5F-J(5#_a1X{kq(K9#Yo~a_zPC96jgLULmUJ*)&kT4~9-{Mkz%V zeG4dpy4wjObONZNM{qNN;EB&_bKl6@B1LLZMfX=@?RBWf3Y4LW9_YYoYw-Av+nRam zP{lSUTSYrTt};~7y)8MHnNw)+kFQs_2U&BkfKY4CUUs zIaV>M=t0t8=?d5bk5+*ydiYPysP;OyQjbuMD)dnZI|PJyav*V&IZP*mD*6)X3!{6pB-GbXrsG=`@FvIpn+9nO7iayaOt}q+K z^fpDmD?$~G?BHEvKAeH~&Cx}FQG_abWXdyN7tm-fh(q{C#i*kDja{Q5`JGBs(Pt0X zGeYnig{Y#N#7INXjy3<3(3#$#PP(=^*s<1*oQ-CVE8D1w)AFDzYt!T0ABK=Pl zs_5gV&YTtRt3VZfk>Ndp`>w`OMUN%eOdfel394v?gMNT%r7BdR?H@edXLmt)xbFo8s6vN};NhF%Y3BMgbToWcDXP$c zKA@&8{}A)E8dRadFfb9vm?zYs3XNvsVh=J)m7@xsU-&$9R9vDKRp_V~SU!GZ7kOA2 zs+c7;tm*Ol0d=Tin$x{RpC`Ik8LCis3FeX*X7X-Ts6xlXK*f%ycc?}c(|36ANRH#T zDn%6<7iEJ)ji@)NL>1bVnk=XtMXpzZDm3miAy_Zhs6Z975qQbKu2hC9evj}^4=z`O zDrO}{pO0Ls6jj_#5qmmwv2s+QgIcg!>_TF|@Xo*HDMS@|&?y>vrzUgMqYB-63A{IY zo~wCOF{`!7xPG=8R57N>z<#D0RPn|i*-ux4D&F`*`*by^VtQ9FqWG(QiZWC&J8SG^ zS%Yd+F`5r3azhe5`&8AaLVd+viJEU_3_izgpBpe^F<^~CRH0>MILcg3PPI4rPf>;{ zw95)BtgWu9kar)(t3VYRQJM&U785E_MW1AtuP!kkN4BHM7>%QfTOu3xTPah9Ds*I) z`O8k!n8z4wJ0~bW6}QR-_$`fAh$^&uNlOKIpujd%s(DnQE-ZOHc34xa232U(YHIx1 zD^!Xqt~vP%gY0ViZg0LCRH5z=oYv$QmrTyekn@@$Do};S#%#=CS#DN_d802_g(c?e zmF;PiUA{reQH55%a_R97W-CM$4`n!YFhe1#Q2*5ylYQRF0V+|2I;2Y5B^^6b8LId> zl^*8c;R;cO&TO>3pockkh&oiElQ4Czr#ah4EvmS^$Ge4fkOEY3z&ofNr~p;mUSrq3 z9ih5u9#!-k8o{W6VX&*FQN>L?Sk=gP(mblTG0CoB#5-slRp_Ls>Fx-!j}la&T}n=h zl0!Pgo+?m<`dJg9L;3E?P{lSR-3$%2QGqJ7vXTwy((j^qRG}G@rKdd|&9qd8D%6jY z&4kQKe^V>g7ke!QJpRH2(5$u=FujJ8mODzpae@|kbxD5lC7jZEB$TypDN@8om7k6{w=e zGP6RYDZ4ytm7t2U*dqd7Y$w?qfT*A%0Q zT_qU}4R!ML!7D0I#rA#(Je@Thi}#WmRIz($dU6`)E1 z%v+$gpFgMoRctrN%FJ$@IMJSR+@}In^htr)Gm;J5qj6NRb2O}caz>SX>f%lXs6wZp z$(0*`vSGF6UDB)udzE*aN>s6%MWj32+^h~&>?{WF8e=Wrpa4~DLjmym&9&-K#g5H# z2+eA!vx{|=Dpaw%xu?7)uTYFCv~2F0B}Xn<7AQa!8u;Y=7{>y9U6tJjFHwRjM1s=^ zBfL|C3zeV>&6Y>x5I)|YQsN&ay zcSJiw395MF9hpv3f+{o&>)iQ=rm1RBg*u)ybZlx=g(`mLykkV25>)YJ9fJm7oe8!F3HJn<&vds`#051O9LosN#hie}}0+6*_vmG0Gbg z-EcKjHLCbg!NceZgO#BQ^-_CW$}cuYqau06J4XSk=tt))2p(WfjKj$|JyepZQ$Q8! zeXdD=3Ygbp6r%cKg)Y(r3VG2j-6i|ikT)C$0eUjiS1&f140Pn9HRrE0nZ_S35 zANWwksG={KEHn=$<74SwyM2|S3UzQd+rd-TXzgGns6s=7BX-?5*Hay;6fPjP|DnC^ z>QF_m8oP8}dy4m0j4B1T&yIOhK+ByKqY4eqZb=KxCo1rnaG;KgP(`1P+1X7Zo!5O; zq6+QTt~q@eV=on`LVIQtp$)ZDhAPFDkSC6k4~*=l4poYk={aq5SH-AO?3)-Elj{a6 zbZ3RALW7rENFQpmJE}&NqJxi2j4@C7qrvT!ph~fN0-{ZAqYhQ*q`}Q-;4&)hcU&}A zg(}5*DQIjkAO3gyQ<_3lDb|Y*b!PuE3o0K_GgauU$jz*GCiSNpR4Havj5hY0LR2Xr zzTwY55BpgmsuauULv8j4)u>YRSMyYTz4@L~^NDWr@fh>q1A4)?iczIlLFPn#kQq^7 zzE*=OMQ6*(NRls=ph_`Z*a0f}i4QckUL~p&M;wy6az0g#Dn-NeQ4=)$kxEo48YZa? zf2bT)iq7DT#`bc-{A#vzSyU%q54J?#y&w_ZwRGT3*R4r7BDs&~{%_VJoZ>YIUr+_Ne6sQk)Q<$$)KovTX@#euF ztu9i9DpfbIA78GjNL~rq`>GeHMwOn{m%i$&tJh{QG|1OSl+?=S67`!I&esW{`VSLo z+O5yg384yow$_`YV2>}somF@Az@9NnCxI$G?NC~%Zr&v916%Tmz>?ai{bZ(23stH< z6&%03C%0xOMHRa}n;aOXsX`UH9Pws8c>zCJ1*%kgr5jhx517kA9aZRTz-z_Z$*^uG zDMXd3yV=dsL{C(WDs({inzcH4J>uqjf=&Qcs$t7JfgYy_RjL&fj0;%KN;RlL+ufc7 zn8RIJ#IIYFD@7F=z?9}RjK}Y(H@F){C#ggg>M<&F3rqVsb-XH6Db=A)jZ%dw)C07w zVBO<>kNh;*2!*KPn+rZHnN&rpP=!t+w7KG{apqw-d{WB&>U)7&R9mw6oU8eWa8-pp z_sLU>Dzxpj-ICf#=8G1`*|&~z)u4)BHKnyxmG)~W#@5!^i^_otQN=@iOC`Z9g{b0t z+rT<}u*ZD1-)+ZZm7(O4WQqB;xPj&;y@!<)735)nIY1$*&{?XTJMU5AyQ3;%`4ysG{dmmF#?WS7@&gRp`<|*I`pE&zbJ6998IwMY*@2cCXz-9jeet zqjlOO)@EA;sG`@Vf;{s$)~d%r|QT+@b(g3Xoq_Sp{&T0#uQJSaH#210Q|^TdP=&UqYpA%Qu4)o~{$Zm0 z4A5mNQKgU>BSz(!PyF`jjX?klH(w>HP@i>e%8vnFq#V#&JKD}tgDSNdJz{hz+L@^aRcezv zdW1DI)SyajMwgE0k9MZ1LA3?buXk^l$!bt-(GSQk$&2Aw`(Cay6(@o7{m1+iiN1 z8dRxGR$*QS+Bsegs?;WbNZ}xuQEE`7HYKI`LtsXzL6zE!%ov&jQ=|q}YLhiE`0djI zHK1i1J$6~k}0-tP-Uq>mD=QImkvZb$Erb< z+L*7evitVYYEW&_^g}yGs6n+wb2!XlYEXqvCGGHAJR;K`?ajO$a_AvY{ZygavO2`7 z-l|YVA5gru`q+i)r3lp)QD3`<_fUi?`Z%6!DFdtgkYElEP={*EuAg~feRNTWD)st6 zd%;}prwUc-?UfE5+CV)-ZWD+~+Bv5U666i%uCXud_ zKoxy0L?ruEPEH4Cm@2a2i;mJs?dFsC_1fLu2QyAiz@X>x6RtK z`NDFYz~5$Pkng}SRp{1$ZQKqeRtF!FcW2+5RHOPAOC3zWWYd0Eit1l1wY_r5vP1eW zYEea>Q75;Noo~JB`B5dReft5D6YY08eyj-9mQYb}@$^4MsJ1kJ$=|bk zUlpp~%mhp(?JXs!QjfeNGfM4Q*6V6eMPEv5 z*BD_UX{%MBO5I9E?m&A^vPuoA)TVNBy}im^sRq@S%y?^FP=jhqroP&Q(wQk?**)MpVT zIe9rHIipHUFl~uCRG}MmwA|T6`DHqqJgg8^>TxJHCnu+Dpt+T0n|wees?@7GyC5%f zbXi7L-?HMu>|EQ6?p2N|^&A&vj5M$yI6b&qA*$#DMY5CI*2+pU29@>c*W3QC&mF2! zrC!0=_4PVl->MGP7M-r&o7AC7J&u+ZYID~sLzQ}PGb}ULq|&ZYger6-3+^n+JFxbN zQt!7Vu2hRE^w3qTwdc&2D@GOCmH{@mg&S&v_Z@8GCYg4rLR6t$Jb=NW+J1#9%*AR@ zg;q^qf_BVpdHJa2JVmHt8fr3gbJU=US)HC4R%?DM!u;}v38$T_7FFn8Rxp$Hj3B$# z9?i~HfGTu^(4~@}bupQ=GnJqU?YdqY!2pGKLxbDar>jI2ItqHy|BB=3s!)Y?fk0*9 zn}CBeB=fc9cG2+j=)svCs#MPIHCaj5pbk~cD#0z@;GJ`mNjp^us?dkFf>|_gg_I-` zh~vlZgE>PL(<{t5l)o16v~XZhg^sa76UMkNiO0AT2vjl4;eJ}fWYREq0YMeBX=P95 z_d3U@L=`i80|$9;j+LoE6(jNsO5FmTpaNCQ1|8m5WqxhTd_c0Wyv{svZ-QyKQx_~1 zs?ewSgH<=YM82~d_d|m;s+et=QJO0|5N^u^aa1vV+IGz3gMucOh8vrKLKV{penPL& zE&1-7_@~dW-!e*-|b#wKJSry_HckARH1X*-uT}d>yn2r1jA}s+herBP)NT`6z}QR1Q*tDsDaS4>BF7 z235@7X5O!Gds{aZsA9%~LizO#^BnXki8}N4vWcd3Rf#HQe=}<=s}|`_nno3~0?gqq zF|yA5WQy(I9h9JoTgQ{DvgNx(_t8A6nDYcPcAB3v!nSXiRwzHUu%|*)G3%fy>}{fH zyQ@SMvkRJake{2K>w0(_Rj6XN?8y9#`mt_1?V<)%D&tmQOEsuMw=IHBiqnMfckAz< z6jjXT%Fiz@%*!n)$tg0KwC$9jird*s`RLt35vrJWvI8VP&d^K=s#xM5RsS*XFbCrh zs+g{tT`IqGwOP}sVn(}&-|+fF9jchlAn$zIpIx!N{8v?|LZ|S-Mk0j~B<&|c*ar`Y;XxWK%qI#_#jNbCz~Fn)&1eUL#Md%M#Kc?i*4?B{d>sN%NwNb{72`OStV+k3fMR52UO zHl94K^H=zjs!_#VX`^NHG-=bOA6JYj2IDD~sFoj9j4B3aK}WQ_STU-YJ=#8$II*h1 zU)~25qKa8t^pvQt?^BH`MrTwsR83CUo6utA`LTOcql(ey^Miv&%HUYgUyNP>3p~!H8c=xmF#jm;;nqIp!nmRpXLB zTXvNqR53>mgY?&8u26s~2G}3Dmy7ZR3Q&bk1qK!r>0pWicp1)&VsThCm#YmL-VL&27>IWI`avCTpsat*lCJU#q3k&dIS$OrguV4s7;Z>8H+sh=yUQ-vyYK4FzxQr!%-%20*YsAZT-%px{h zwdPU9^zzcef-w{1TNA1jpo(t5&yUqSs!#)VhDr;)+d35rP=$KAoEPBMv74!r)u0OX zS80UEiAqq#Er*#e`5~g?G>ZYeKx=`01|@RcN`Qp>6U|m8kxu?2F~=s}j|}l>HzN zR*C9g%EKUgszkM=6;xPm-e?ZqY3{BN)s~>Q-S=0BDm1J&S+lq$iXWs(emtkMYE+@q z=|E@O;kD5G<|?HArcg(g!+cMiB(mV^}Q;BzaLv+ zE@paFRleV8@3enRrg>Vg%EXw)ah;3t?^~JwYrfT8LDc*Iz3M8>1I@u7n%N8BF6B05LCQSfQu7jT?1lX$gskP7hGFYj%~N6Q%gb23mH~Bn7=sn zpzz`wMY~)tnm3D*VZ<5&(=D%LKHHrb|>}6AqxjMwN4Z=tlE(}`Q{#nIQ6S2WLV)N zPi_voy_M^YQQOPPM23~wojf)0*#+jalF2pSSqfxW?M3Q?FApho>KIYTu)>GA+#Fu_ zUT(cpC8CgFh4Iy?tvl^zKI@pA!)hszVYM%*t6Lpr28*OROA2II;nQlat?#~Eo$b^W zqL5+LfmFsH>1L2fwspT0$gt{2>erH=Z*%G;QOK~`kJS7J&-=}(4@DuvsuQW}U;J&5 zQ{Rh1hE-=$3x1#ej#KzmIJ}Ty)y4e9t;6c&&p+iPqUzZPp&_RE{WQSnW@0 zzy*(waSFc&iWf4h4lsXlbNK1RS>|J#vJ%p&L?Oef8>x;xN6mBU3{l9i>Q3tDUH|Co z)Rm%;Vbz1w4KJ)V9U(b~&xt~Y)q$j{PHWZMsr90eVbzn=qYs?0)~TJgHvec|$gnc2 z%v*<#bXj(&Q-_E`hSfo&F5LAjZ+jJqLWY&;3SL{?hUS?AesXP$6NL;bv+$mJ?ETKS zI(5D%WLWhfHKgX73!S=46f&&LM)lhI;Gfx@oO(_aGOX~aWY-T@?{oH5PJJi}8CK?C z;HiFXCRI80jVNSTna$&=4_~`rjZ^=KLWUJSaP8)>eC@*DoobDfQ1e2D)#2tZPMy8B zhdEPEZm)wyA;YRasjX&ww8W`gQOK}5f>guou0x%w5QPk@BT1dUdis2)P8Wp?E1a{t z<@&P2sb-%_F4qE4$gskP<((Q?c(*y6Ce`htkYQy`6g)LQ=SOqWlvFQ>LWb2bq`F@A z-7ZdjED9M`$C6sMetM--e~UtfRR*b1H;%d7soij?VP43v$~1p*Yh%)`2YPdOfGA{G zWsxeI_qFMC$+dBmC}db=le*@$we6f5Dhe4^Ii%80dcf<4WulN_HIUTI+jG5sI8zid ztjuB9TN~dV)^WX?!y7~)!)h?8z0dx?SDboG6f&%GN$q~qxt>}h3K>>INZt1N81MM? zttezznT7Y3>ynL+dTV~$ZOuQL7c#8!%wJsJIQQUh#~=~Bx`;xCRX(Y^yFc=YQv*aH z!)h3*%pZo0a;i`iGOWzWu{VcV`<0*X6z;d;g$%1g^B1>VAOCg1RHtT&LWb3FQoH76 znLi}g2Hv^B3mH~L<}a?T&EIC5jgwS(2M;e~SQVSUIQ7%Y-EVLTZ}Q@W4673J7pLCr zR(PpXABjSS)d*5!M$hc+)Mio0uqq|heB0eWa|#dZ;DrpUk>)RM4lnI~*|SdJu`0Zf zVP(34rzRiR;Pv@qMIpm#G^vOCA8B@`-Bg5)=QaKM6 zT;bGt(iSqTP9XKgq!-6Jb&DuuSe;1f(H7@D?bPF=>lUlR)HLIQaQxr0+%1KTBrwq0)30-? zyC`H>Rgk)A?YbA7!Y7IGLWY$&40~;@c;?x~PMs(U8CD5Wvqy~c#={0t$gnb9!E0;8 z%!^-gZJjF$8CK&+-LUHOSDnIFXyAnmtMTS9ZXFg^xBbScCqyB`s*2QS_g=BlsrN-8 z!)gMlXa71Q)2U6OkYRNSsfjZW{M@P5>E<8J3mI0`<}Yr!E|}7?!Kr?tkYP2E)V$%j z&7H~?g$%12Qu{3Lc&}5(i9&`|Eva2=YrOM~DWZ^JHHp+ey?^n>jq^nz!|GI0vxdBE z{*W92t`da|t2$E8PQPM^Q+J9&hE+YOZ6Gsa2woVbw_L z!u98vi<0DWeJBbUR+CBX-LP??QyWDg!)gktv7h#M&8ZeUn13`cWLTNg3vanDEB$PP zQ+ta-hSfAuEnd7}uv0xnA;W4qsoy``v71vzi$aFgX{6G}KW`J}|C!ftQOK~GVgBOw zuV!C2`^vRdAqp8*r<1BF-`K^esiKf!bq1*mJOA>QQx}LrhSf|`-UkCQOK~GMXJrA$6w;qhoX>SbvCJU?&v$fsqaN0 z!)i9EDXll{?v#Ba#r!)mtj-~|Vb+4BPVKs*`A73YhSj;|FRpK#|LEh-IMrDcGOW%c z^~+xGw{fbUC}dcjPpWe6LytREC<+-?b4Z=N?#q0q5~7e{HJ8+%i!V1PXvwWSLliQs zE+F;&QzZvDHBS^Wtmctwm$-kvQ@4mhhSi0n=DgL-8xNllg$%2UNNq|R?HyBI5rqt^ zi%Hdgw*Q}Q4&N7r3@g*cy}q%{UU*hGxemV;g$ygR@Sa*YcgbB&Z4!kHD{~3tslX=c$c*Px`^BMp4MHx{_3@ZGZE|sM(^BVRaR$ zPai(U8#fk;LWb4Vq)t0)<|a3XcZx!W)itCR95*}Dspmx@!|Ga6Umg5Mu~Q$3LWY&O z!0^`LxsSIsk>r~HNfa`yt|v9;kVoHeszpolkLHC8s~gN;Tt6)THt!Ut+KNJk)s3Xu z&F($jsa~RxVRaL!-FuwT$EjmPA;aosQs2+){DM;>L?OfK7E*I|8|@vt6NEp zdGkE)?CV@n$gsMN)H&z>r`1AV4#2G8kb84d~WLVuzYQxQ^Kkd|JQOK~mhtv%#)9!Ps z&Ccc@%?lY;i_BkK@BQPC>%6wQh(dkYV*8sS6ulsd4HOQOK}*h}1b#Zm)Fe zCQ-<+dYDw34Xa;v>QPb1uv$#2+56ic@6<|B$gp~Z)F(IWV!BUqZM-iE8CFY3&AjQ* zJg2@Cg$%1lNsZmL&>V!5ZT%(+8CH*x`u)Hu-d5hamH9{WLWY$&TzNfeuc}&eYMgAV zwJ2m*Jx=PJk%PxL)kzdGtd^1bYO5bVb*ir@WLP~xYWwW3T01pN6f&%yB(-q*tG_sv z5QPk@r$}A&(mmasI$abptjrGYt;1Ho&GYuk1)`8)wVc#X4_$V&Yip4xWLTLC46m(; z^B(@dspmx@!|GX5gO^X=)u|6fA;ao9Qk#!Hq~57NMIpoLc~S>=zP621JD5=pFJxGm z1FE-N3x<|^+iPD@$go;L>fEmn>gw7$Tof{_UL>{Y690*Xp`wsswUX4&$COQTZ5<~H z8CEZmO5AtYyH3@KLWY$Y$h@_&abACO5N>AvhSw}n$go;v{^E{AGxiz2ol{qeLWY&; zte&cWXy0Ru*uWuzH=;2P>8x?9^UnufYo$R&SWUxHW%Wvl(VJC%4z(qL5+rCaKP2 z+Rt-pm?&genUhGbtyXuJALvxMC}dc@O{#lkr>~uA5QPk@cSx;yZB@Qg=ZQjwmFeQ% z9G)<VM`hu1C!*`p#T7CD&mOQOK}b zN9v0if1U4ChA3oMeMIV+ou`;cvaKRf$gujDRQDmHy%D=o6f&$nA$82)d9z$wr;9>{ z)u*J^uI@P2sfD7DVf7iQ<4*5;ic^b4A;ao(QVVBZ|C3WMi9&{z8OXftwf^p}E_do9 zQOK~`K)UO3VWEy=cWL?OfKD^mBYA28CX6GS1y$_z=~9Ns#pmp6*mib96fH>6s$o72Lz zHAfUOtTvKbw|p0Kuu3l1Ricn#We#%Q9L`v~)n88CCkh!>-;wJ6fBn5<%5qW2urh}$ zudVZc!uQ)I=kN_t$gui>)Xt}^taIvfQOL0Rk<^cmEZfJaUqvCq%Ip~49Nso)(?d>e zy_@+*^FoHz&*m?#AD%I|$PCZP<=RaYGOWzt;;GXfdwmi2M}QWP?*{vg%U2@au=+qQN9UpV*K2gZ9+DvNjgp+S`>Sa;LurfP_*Ve;tOnTC(b)t}A^*5;j zdlWq9)Q_T&Vf7EGtydg1z^T7QA;StE+;aUexBJxDPVL>+#PKp2R$Gz!?C|Sua_R_C z$gpZg>flqZz22$eqL5*QANzH4*m7b|ug{Mag$%2$N!_qH=T6tw*`knP)q>P+SNvl( zX|hLMD+(D__z`0_hx<(Y@g%426NL<`ZAoo@Z~Z||trCR{tL;dQzkG*Voccr*GOY0P z%x(_bwRya^Q=3E~!z!Ir`m8@IoZ4mgplcw*Y6nv9zqxdUQ~QfTh82Eu+RfqrzIra# zsiQ<8!)hl|XH31$oI)nISFtE$ShXb8{f|y>Ih7EF3@iMmwwuG>n{PeKsWU|(!>Sdj zAtT@P`uqY>$gtXlRDRyK-ZjzvqL5*Qp9^<$c*SK;Ep&7Ev?yd)wI;QB?qhE_wO$l5 ztnfKG*Vf8GJDTA+x#pX<3;G5!tnh2-PVM~H!+Sf`Mierv+LAi_hMx|1>R?gGu-cu} zTkR*#a4J_6GOX}B?`{s$PcHC|<|m0lhSeUV_WrEpOxIR}C}ddeN$Swu+nRHXol`f7LWb4eq(-!R&l^Rb5QPk@eMnWz|HRyuNY3GhqL5*=FR7gy zmwV?MzluVJReMq&JiG2>*H%k&7J(NstU8d|s{ejhI@LiGGORk1y5z(qW}%YHb%ZEn zSnWq@;9<-AI+Z618CIQ0&HiYZcg0aI3K>?NNe$0=&^w=R6om|{E~M7pQh1b`!z)A~ z!wR2Xbv>%bo4?dJb-yTNSnW@$-KT9Xcj^UE$gnzqR9@AG-c{RMqL5+Ljnt`M9x>9j zwLugzth$rx^XbBCoccu+GOT)#y7K(3w{xo5oL5}t9=KtGQ-ehz!|GsC2eo>0fm35eA;YRSsSD@S zdVT(MQOL0BL#ljeRkzsW>sb+Jlz45S(C}ddm zCw10kJx+FW*hv&Jtd1bnalk>|{?%I)GOUgy^~gcHdG{QS7KIF}qewlztl6J#4vR%0 z!|G^K9hYv`-KnvnkYP1|ROfboUgFebQOK}5hE&O*&+DDKKol~pjwRK;-SYdLx>po3 ztTISt?RUF3Vy_T|46961XFjymO4rs0qL5*gMe6mBx4PJ=pF|>|N!7l+!aIJA z7ljO~Tv9uJKi0dFI#U!ftcH-fuDqqU4zCu446C7}?!Dw5Z@C^6g$%1aQp0O+ya|cm zwL%m!tnx|i)$MPa2-I3p$gmnlYSJCwU*_8SUKBE{3P@d2_m{bGlAObq`vh$w!>W+f z%01?K*UMc*A;W4osfD)?TNHu)i^>C-wh(dhl+7d27C-C}dcjNUHtnXRmW@9VH4GRwt2qA@lkrPL+y6hE*AdgD7NJjUjb@!9;HqT`CG0Ru!c7%v$lL zYwHbB$grv;m7eyB*EiOSLWWg>)bvfadFQ=2v3 zu&O8Z*n}Ou9(A}VWLPzjnsQ~AOxM;hQOK}rBz4xp{V#Q@LKHHrCX?FcgSG>mnl1_% zR#Qm*T)VE;sf$G+!)hw2&6%HH;na1akYP2ARO0U?&p7pvC}dboCsp6+J8z6yAqp8* zr;)mFZQTQ|tq(*Y!)gYpy>s_8qgk?Vd?yMSR;QC%IOL2kooe1O&AyOfbq1+VA3D#x zdzEafttezz%_Ox;#=2jf>LCglR%enLQrPNmrv`{ZhSgc5KKkSH{!SH&LWb2WQcrh0 zcQ2>Lh(dS#iYR1QokwchYtQrE<5(vO8CK_$`YCIqcTM!OC}dd8A$7^v-@N1U_GTIJ zLWb2`QllPudm|FTYfn+gu)2U$!_H&PoyMd(P!uw(=8<~h!|bP=8XyW8Ru_`mb;o{B zJ5?wO8CDmOT7P}ZN1aNDLWb4Fq;~JV;(DhVL?OfK5>oe{p7_hDGejZ7YCfr-N4{}} zQM~M)>~YpK*VeP5kYRN>sSls% zypvOFMIpoL3R11sbvxOqjiQiYwUE@pOWQ4WYO78`FGhydm88CWZrNc@wH1X7tE)(T zHKpErC#$O{WLRBI>a_{iPIqk`B?=i<*N_@})m(3{EEI(dt7}PZv-G?9uB|dr$gsMO z)C)iSy`xjLqL5*AJ*m}09-i&g`J#|vbpxsGmv7j{scS_c!|Fy-n;Lo@OQ@4?N4Y^{FUiSlvQu@=qPT>y+O`A;aocQokNozQVP&bLXJ< zBE#x7QkTzsCc~-DqL5*AJE>QW_CI~!UlcN|?jW^8#)dmwTSG-5!|F~_xj&bzbLs?9 z$gsML)aHeU6*)CY6f&&tCbjI$b3S(JTv5odx`)(`)BDeL>S|HQuv$dwvYwgGJ9UpJ zWLVux>cmC-eRTb8!>QNR=JB-IGq8Ckh!>kCM7!LT~Rq-|Iyo!|E|o_qX%E zwPUF$WLPaFRk!_wPu(28Dhe4^kCXc5u>7r^S}zJ2R?A4WojJd+Q=3I0!|DlAzy7n% zJ3rjHYtW;RVf7@bX+>{d<=Wa;6f&%yBK3H`(gLS?ib96f)1;PsRC=IO$BIIR)pAnv zcG_>LQ~9EhVf75Db9Zay?aRlDLWb3|q4e@soA2C zVf8$zhdvnXouynQ3K>=}kUF+@{_}1Q7l}fK)e2It|NX}Vr=Ajp467GOb=vWM^B8q< zZM-cC8CEMvJ#^iRCpq<_C}dc@MC$2vbG&y(TJ9fg0%TadOzN?mA=kRL_7#N;t5u}d z_DF1S>L5|buzH2mlNa4O(5XS9kYV*IsXohg@~*#55`_$_)ub+2FmSVLYpN(@SiMH- zv(g>LIki9(GOX5+s(Z1*dnfB2QOK}*ozyQE6nXa?o)d)(t2anpao>+uyE*(w6f&&d zB=u3|$iJQ1`hcKsAj9e{QayjY;a#Wp7KIF}w@E!Q?zd@99V`kNR_~B{XW4EKJC!R6 z8CLI-%KBi>51l$$6f&&VlDc`;2fduC5rqt^_ek|^{qUJi%@BnQtM^F_{CddgPF*4j z8CD;VdUyJMZ#s3WC}dcDNNW4Ze~)(R5mCsn`X8x_4j=!%Q?H0ZhSfS!i_2z}IQ5Yz zWLSMfs(Hmr-q`z#C}dcDOlspkD^GN7ZQCvAy~wcogw%|AH~!>QJ5k86`jpi64WnB+ z)m;=atUe=k<@(+?I(4KdWLSMp>eKq)es`)s6f&&VlWKogT7y$#L?Od!1E~qa|Cr-c zy(nZ@eLaYHE>ReICu=kKB z=j|y+ib96fccjW+>Ak?Ub(|<xbUwQ|5_6 zhSi^>4sO}SyWhJ=6f&$fkt*(S&QLdpuZlv3)n-!rX7BEui+(2x8CHLh>hkC!?<}R2 zxjw=R8CHLjTHN({?<}ROC}dduL+Y~DryY(&@H#>iGOQ4BPnmx5^{f}1!WEo-nGCC~ zNKKml)hSL*6om|{W~64V-Y?UsvqT}osyV6FWkbGk>QYh2u-ckbx5IB7?dNG*N% zPw#nvTSOtlY8O($oS8q_*Ah|4u-cW>4r}lF7>VGuQWP?*T9fMV*p=S9FrSM;hE*F< z2fY9H@vg1kL?Od!H&O%l%RLQOK}rPwMmZ?_CIVYMHrzpuL3yDM^#C}dc5B6aGF z1)m}jymCb$!>Ti>J{32f<5Z<6WLR|}HQ>g!*-o7;3K>>iNj+Y%(R<$JMp4MH+MiUL zyLa)9L`y{>!|DK1rH6I!u9x2wg$%21q)uOQZm^3l{$5;C}ddmCN=zlto@u?A_^H+eMnuj()|?&Tg$%1hNtNw> z=j%@O6@?6|!$@`iZn!zSGk>zLp`wssbvUV`M=#HGDj^CPR{cpOCS{g6HCGfetd1b{ z^C#VZaOzG`$gnz+)HXG9S3C8*C}db2MT+;YcSRw?>S$8+_wHrhUo(HQudhWR!)gGj zh0o8O>{JVLHj5WBtd1ddQOUrmPVFfQ8CJ)V`ta28Z#i|aC}db=kQ(;CRqLD@BnlZ; znWUbmYW|y3Ricn#l|`!O@27ZoZs&e{+b6f&%GNWC=w&vd8Oh(d0_QMF@LhJA4MUa^Wzyeq^fL?Oc}pHxQO z>?@E6ULT4=hSe}qYd-tNyOP>03K>=fr1l%xc^B8#-u;3$kzrLxYUKU@`^KrGL?Od! zIH}wA+ReKwa-t|?SQU}#H}`b!u1JF@WLOoGx?|?`xo!^67ljO~5>f~BKf)WaZx@9O zs}ZF7ev@zZ4)Z7bS}F<|R;8rgy#A$2oqA0aGOR|DS~;nOw_F=UA;W4EsgoAZy3w`u zrzm7tjV9Ink4qb!YJEtse8{jmj?@K5G+XXeFHy*_I-bTao>DM>vai;M2LFo; zt4dP6rXT0M3)4dsGOQA$ZfLdN>#nVAQOK|wOKQX!cY0?;CyGLb)i_dz|MNnPYiqJ7 zWLS+SH7d8{1g9<*g$%1IQpcUX?@NX@@#v-e*13Q@?gnog?m#CN@`(YHk*!|F6rXFs^=WH*QS zZC|{QVKsx)uWOeMaw^T7zu|=ptJ6vKs6Xy&r}hwq468Fp-F?h1-d=gAC}dd8Bz0uo z)!)0eibNs9>P%9@7FX=#RJkZ*Se-@cqb~lp@HL7;hSe-mJ?B3+*R^$?C}dcjO^UCV zuN8$1tJ$QUNW(MO=1=x@zbIr_okMEzjcpb<^^7QFSe;9%`?m&ZTdPGO!|FUzZ=5#& za;MgbLWb4(q<*>cJ9AEG{$yX@ib96f98!;GUboz-X8i+=46C`M&e^5UxlZjN3K>=x zkQ)2XR_{60TNE;^=8<~0^u7^J4HktAs|!he-{sM7ojOqzGOR8l^=qfky)(V(qL5*A zF{xXI^t;TpwNMl?tS%w-&O@(OIki|6GOXs4I()k`o^*NnI3Pxf`RC}db&kwT3Ug$%2Oqz*jyoqb(f zQ$-=e>dF-AQc=jTx{B13yFc}SYwJN#$gsLPg<2&F8CKVj`uVE$-ktWZL?OfK+7xQr zBZDn~46Ex%ty+s`%gvwctBWXPSY4k&9V-eMRyUC9_rdk|xwcLgg$%13NnNt?>ujec zi$aFgO{50DUV4>N7l}fK)y>+lRA6D+OoQ`u9~);Q%{RRhSfu)W_|ILcYgSmC}dbYOzOpkYo2#)Z4`wJ ztHq=WFKzEFSBs;At&I$;M@ZfH&gIKpTWv%k!)ghsHj8GPy~F&;zPgG+hSj5_E;`~h z@BVyWQOK}*j8yx3?(p6V$P zKc8@FmMCOcJwa;PL6_D#HD44mtezzG#S?dU_t|a`g$%2wNKIZk!+UpWxhP~3tyz8CK7bn!VHF-&|XNi$aFgv!s^oyUM#>-eo}0ACY18 z9I1?Md-Zi~brppStLI6bKkv&1r}~LPhSdwCHtyEL8?iG*A;W3~skt@F%yp3YlYNa8 zg$%0~Nv(U~rWc(`h(dY1uzt6ibS|S?X6B- zEeaV{t4RH{_3YD}x^f*qL5*=n$$MCbn@Jw6z6y$klDW{7N8SDk2z$dQxA$lhSle!%HDj`d*A#eQOK}bPwLkBEq-@xeIW`N zRvSp2-(!h4_NHZ|*%vabz97}|z@uJrZM74H4683mb?M#4>xT!4LWb4C`+?$gui`)JLn{u5#)IQOK~`Nb00l%FH%0 zf3mNKL?OfKTT&S>RG#nD3!;!=^&P1-B|Ca|57vr8hSm3^Zd>%r2d=IE6NL<`A4t8p z__mo&Z5D+Ls~<`AJNmjtr&?wPYXuorKapzv%XQ^W^%8{)tDi|-{mb%0oXQe~469#A zjre)~`%aA%g$%1-NuAStLZwruh(d-JuV6vR+~s|{`ToNoO)9fGORX}YI)q0O-_9y3K>>^ zk-A}3d+)CPwpl@sLWb4fq)xl}qHSDT9YrC->K{^lHeR-eQv*aH!z!)0|H+^^Z3mj? zqD{!YP7;L-tF1`2JFnMSPE8Yq46A0OUVEx+o>L1%A;YRUse7KgWtLNSi9&|e)}*o; zuJFcRJC%kuxYipw@WLRxOs`$9c-uo##We4jL8CKhp8vpZ6-g)nVqL5*= z9jPCB*L8MtI8+oethOiBf6SLxI(3pLWLTw>I%@N8w>WjGC}ddeKP84Giqx=Iu>tac*x-XnK-=Qay0&6>dr8CJWJdaq)eU!B@R6f&$@lj`yA>W`c{ zP!uw(+K_sD;O(b6b&M!vSnWn?NybOsU6CSD$gpZl>XOHwzR9(f5QPk@-ASF%by`cO zriwy_RXb8gkInP0d@m4%468jzO*!wS@vg1wMIpm#Pg2)^vEC+vt^1%TWLWJ*YVz^J zyg7Vc6f&&#CROyw$X0F+-xY-nt9?j)zv_4Ip2Jt7kYTkisq623q}a9fmndXdwI_Aa z>py+sRI7o(T0w?Y2T}|7?0Jh*okStSsw1hny(W3<@K906u-cE*^J9L`b8Y2{LWWf* zQmfAR{$;055QPk@&ZHJpH2mUJttezzbs_c5+jAB=HA@sSth$og_{g{?ow{5UGOYF| zb?B02-t&idib96f0i^btztTJEEfa+dt8S#~D?VT2=5VzrWLR}4)j9FpXs13Ag$%16 zq|!@sJ@vCFWLOPvJ=h%g!kYUxE)K*nHdsk9bqL5+Lht&6<-)7#;Po9g; z5`_$_zNDU9bCY+bcd003SoI_IRo@MFy0-2Tg$%1hNX@wO1(Qt9;WAOkusW2~Zy!JO zg;T3UA;ao0Qtk66dE?;+qL5*AIH|HH`}@}^qL5+LpVY&rF7l4Be~CiIsLI5c#&MlX z(4&vA>e`@ld;ecDrdOt=9ceS2O_f|vWzAZc|MD|O*-Q^Fb5baCbZ9y!hB5GL*@-8Gjv?hB7%e z)5)98h)`yr&2;cGC85k9oAI|raVRs`X8d_B3T1L_#-Hcmq0A7Q>E+E&VJI`yX3Qf# z+J6c{nY>VDSSXVp%H)SK!$O(7P^KW185+tIhB8A!nc<;KZYWb^Gkv{f9~{aQ+l;wr z*Yz_flqm^i28J>tLYbUUrZkkv4rNA$GFhR_D4RLho9E0>W^`ye8KKN^HsklPV?&wa zZKjjg)-j>X2{vOc0(Bh@2xU&Rnf<-Y(V@&qHskLXM};zFHq*hI&XJ+a$u`r?%N!BP zl-rEIpY{)B#@I|BZ#svEG8H!CFV|tAOr_2EW9FfuOu}Zmdu<&O%8U(V`h_y%Y^J?8 zoxY*Wc$?|qW%`6NRW{?VpWdO&1e@`f{oqjM6r1tKsDnb8>QJUvC^OM!{C&A+C{trI z{&F1{%GBD-zTUF;2xTUPrqex?In`!5dDH0@%GBA6-=7Z%W$JClUx)jLG7UE49|yaJ zGL1Il_n$7I%w(H6@c#?D3+OhEJPhDzQ)XsJ8z@7dbSz7xvnI;k9KQF}uKwr232yvnve8;o4$$gW>gOEit=`SyRj&FkI&~#Ow*fb9r?!dr3K~ ziP>AqSyjwFVpb8eFAT@V%3}7Da#j+vKg_B$7AuN50A@`xD~LG|W(1k##T*2~>+^DA z4u;`%Y*{gf$hnpgbEuTFw3x$Sc%CjL=5RUJl46d4;n-M0%#kp>{wyx$D43Ddhl`0h zTFjzij)CERUPR2XFx<}zi#ZO4+qICG<6*cD7Zh`XoNECwC&KU?94_W081BRQ#hfhl znNQ3qa;{-wPKDt<{A0ca&B*Zm*Z<^Pzl%8yW+aX2Z(>e|;cMluV$Oi!{pv4b&XjU~ z7IPL1-xvHO=4>hFM=|HX@OAkIG3UbYKI(fh=fRlI&HX*(cVfVlI<%J`-~}%t&h2r(&*=Kh#9R%-*X0kzTmv(L>imJ2YsI`T<~kT&6W$YZy_EB=m>Xbt9eYR2 zjdHHH#oPqL>*`x#ZkBT16myG|^M;sPVMbCPzAolA81CoS#M}e5%VAn zuZK^Ic?gErv8Tj5Ea!Ss%p+o+5c4PuuThVSc?^d4{Evxw9ESV(Q87Bn-#c z!(yI-;l1cXVxETKK73HjGcdf?Js{>;7;e}7VxEKH`F@|6=V5pb-Yez>7+y2)5%VGp z$Kl;#UXpU|67w<)&#ybhyaHoBq4TfHcZhivhTCk!SMXLPR#pqu4~1705g*M`5G}F z!f?B;7W0vmbCsBnVR-IbDdrOxj^``Hd@ARG=5rX1=S#(WA>~{m=1Umv zpNqwO1v8TR`64l2OF0*c`38pDb%B^~VR&shU(9zf+|TEU`CiPqVt#<(xpR(~A7MsP z+s_vBlazCon4iU*Ddra#o~LJs`4xu8>vS={!SMC{G%>%!@HORsV*Y^Pb?j6z!xpgL z1af^&5i=jmNb19r#mo=G^*Kq*a2Ou<6U8hb^*KSzf>O@$VitnoIv*!yVHob8W5p~2 zGlJTFjF?4XcrG6;W-%D<=cB|d4zn_y>qs$6z;K<95VIr<_w(UmmV)7VdYG7{#T+VT z88L^5Sr&%Zjf2H32g7wfNX+suJf;VVSwZS^fS46wcue;fvyzzo#Hxc497;Fm`!0g=1XEWlXJ}yvpLKt8jGF8jD_KTE{Yik z!`JSaV#Z53y<#SanIUEi7@mU#Fh3RZKe!$InDD8JJO2=k3Hyg5fbuiRpmhI&Ui`3&Z`~ zA|?mJ>qfJf$uQimq?k^rPeRNT7#`EOn5j}ulbC5zpO~0`!*IL)C1!gVe&6&@F+0e) z{vqZ+Fg(BhF6O^5y!QT0OcxBVEq@iWBMiUG{)?DA46hs8h?x$<_XS&v>4xDoYAZ24 zFdSoBiYdTw{A?j+1`N-y31WJsobh62!tl6{6H|oYejY1kCzw$*Pd67c3x?O0&BT;o zIOaDM(+9(`v5A;643EXeVk$5^?i-2ehv8?Q8;aQ(hGSy`F;y5Iul2>$q@4A{)M0om z#)uh!;V~U8W)OzoFOL#48-~YXq?kD{9INY!8G_-quOns`7+%9ih}l)jSzF9*FucyM zC1!Uy*P3GXfZ_f88e;Z@;kmrJn7v?lyjBylH_RxSJFAM>N6J}6%)T%@7AuR{4~Ao7 zB{BQM@SbEvF$ci#{8~ZGfiOJZmltyo41Y7QoS1`Q_o|hDJ1k5NJ(0*8ra|R5@{4Zk8gyDYvShFM=|HX@L2pH z=3E$_%ioJRPs;gD%=u!z6>|X$uTkHKxe$i;0AGu_2!`YND=`;~`BKa!V!jY_shH2j zTn5Aa{F#``VYr_^6>|j)uL+-sxe|ug%#X!f1v84~*GFQmhT-}3p_pr6c12*c~)+hT5l;eLKg%*`-7Pu~=C3k=8M8)9yS z;h2A2%xy5-hp&mb9frsKRWWzKaJya+b0-Xs`^#ePg5mY&B{6ry@VkH)#oPnK`|uaU z+zZ3)dS1+ZVxALoznEvmJRs&7F%QD;#l-bchdDfM|+%u_JD);%QVX&7$%gJPb6;rMw#%(E~YKlh7y z4uGm2$2Z^BxS( zi|fR^55w1jYsGv3!|`*Cm=9riysj4Wk(6_ln2%w&f36hsiJa>SF`vSWqH(`m%x5q> z?w5)A9ESJUmx}oUhWqCdF<-*)+__lHS1{c6i^O~l!~J}rm~UV>Rxc3qEex+e=ZpCc zhS#6-#C#9K{d2CEA7FU@bB>rFVfY^8Y%xE>ge z#Vi2BF?NEO1z~u+ju*2K4DU&f6SFYPD4NU1idjVJbBvfp#T+eWF)>GpSsaG@`A9KK z!0_68gqS7eT!)KU3Wl$hhlyDlhWqDGG0Vug4iU4glyk6{?Bg#jGIp zIY7*cFg(BZ7qgO>{lu&+=h|1yDlj}x_Yt!y49D}{VpfCUvDiz@>M-1{J;kgcW)CrI z!th+)UCdfAJYKtrSzFGvtC$fm+&{aBSqFyKgds8O!tmUgBW5HF_u*_YqhLnUnlLD4 zw47@|%os6sG3$w`iCG_p$FwSD0~lUccNVjuoU32VMq(;rHiqGKwJc^67>?&YF`L5h zn3lwB2E*@wW{KGxW;Bi0PGZJNIYlw!VE8^|rkL?Cy#DlxnE=Ckn;BxZfZ;JMh}jZ` zW3@-jR${uvYz@P8o-Sq^F?lh6f#G?&qnN+K@HM4N%->*mp8i+N-(fg@{v+leFx)>o zi1{ZBw|#pt|AHA!@$+vnF&K{dX=0jScuc2?iNkQ6r-(_w@VeS5CJ8f|>O5IYGYr=` zC#D5v1eKE&v#p$~LrhA{Br)4beKKMu!ti*ti)n@7I=6{Q!|+(7#k9e2thS12hv7A0 zqL_@7vz?epQcg-t2h3<1i*3bZypH`<%#JX8 zz4(imyqImoOo!ok-dapI46g}WiRppiaozamW{z05h8EJX*{k4EOUWF|%QKts5z3 z4h+Zhx?+Z4xX$Z{*#(CCaDb$a;{lu&!W`7tSixtHj0KVvdL5SY1%e2{633SwPH*FuYF~ zF6JZ{js9)#gFYB4bniCI+4!(tW@^9T%IPZt*RsF;PsJO;z}1q+IK9ER_$77+7bgVR*m#yO`%-xIVv$c^-!A^Q)K_ zVEDTHiBouQ$Ye3&V5gbur(;@Y?d4nD1fuUBIhiet;Qm z#=skkSH%1XGlI;^Vt#_*I=>|5XDR1JF~7iYyIv6UD-7Q|JTK-q7@qIXiTNFdW9(Tm zf57ls_l%ff3)$~>I5wUZGoP5J#LN%Fb$(LJa2Wn}oIE@nX(UdJ92vyjy1 zQ85d{jG@?gM9d;`u7|}eD&`?Ei@|U|KPYB#82&!<0WnL!a39_;W=R+x_xr>wCFR^J zW@$0^h*?I?b+?#hVR%gM60;l(_s^YTmWSbadWV=5ZbCa0WU^wP)6tgef`#H<0sF?PL}HDS2U*NIsRhTDFv zn6+U>Q+=)xGXiD|nXARD1HMK;kKVAW>Xj*uXDw0 z2E+Y)j+o71__&J>;=s{w3xZF)=Ymi)n)4_&G{U9ER(Bq?m-5Bg7=d94@9AhUfBOVp?E$O*mA{ zwlLhTL&T({oP)(|2g7T^L1HGt@LWDnOskj!#H3+(J=|YR8w{^4`-y3X;WcVsF&P-{ z=Y7OXl5_1XrUQoiXD=~X7+%Nr6qAGDnBPOpWEhUa-NkgmjG^oDZepguaNBnkGZlu{ z%w5DxgW+}!iTO7S$Hp8n+e^xAY)oYaO(@eF}U#QlL1ur+6 zV=9Hl`02^PLb>iHQt7GkjEb9@&LmsL*+z85+uL#-?X8@iNhQ+xemBL|FqF`gh;^kh z*4{=*v7Rp_3VoHHffDtx&5RAyD}GLaj%sadij?16wVhP% z9%?R@>VA*fLfQsOrCc>%uFa@a`>2f0O0lO=dalx6DOGyCezQeni@oK1DO=Cii?w>O z+w1BeOGd$FWs2nn?JW!zy9=70%5-iiRX2$fBr#c^S*Vr^b;)Qe)Mr~){ za)L3PHBsC?Q12fwqfSZ9g?xRWYI>E@5bv2%erS5WdsYHf)%;Z16xASeZs`qZN1>Z4 zgNSS@mZO#KDA=Ute7Bi-{@g-y5TS`ecg5uAD)CaKR_KZ6`|HI@xmfNERe4HbdZIIt ztDtF4iIKjEnX#?(+QUtE+q~w8~V#TYQ(_LW@s(d5hjBleH8kKOF@w%CZ)Vz4CC0hvhU9K}JY4hyt zx%VBnFm&2b(?U7U$i;fhq@`*)si7n@6AJSPS~C~zI#+EFht80Oauas7>`EcbOcx`7ke_g7f?F6eMXl1$i7za$3&hv$`EE-e2y5^11)Sb0(KhQ5lrvBuW`x ztOk%nRXAtzDJe?j7|P>A5YmE?%FLTJBE1a87-$MD&ZA^0%ZXe`rbDI$?Cu8F^RN${ z#@j!e()@t&xEC+MZzo)W-%hl6zazmCN_JyK>WX9hKnfjVhAZ?t_(@UZ37Zt$ftc0= zG1QXEnceRkZ|fe)lllaQ1*Z%4ecsvp!1EGZqQyBu8#zvG29gjpGIk%b7Q6;;}?wMt-1FPn68!;x2ET=*<^rZpULCg<7Ie zF6PZ0S-}fPN%e61j2Xe2V@tIMnwEI^ZZNq+9!YgOARfa$yc}FP;xV^ewACxt=ebJB zyFZP`GL=%X+Y2XKPuz(6){kbt<^IWPUd#O~oK=(ERtdNDP>l+in|R|V2c6#Q9`u$B!xJ1rr&6j%z%wEJVoiqPD(Lc2rkgREnd0LR| z&v*MLc1ACn>Ta?-8yw(db>z(re4|{`$qkYlBxQ$c^@4rc=bhWs)R~SZtxyeSV>mM1 z=njP!W{+*3A1Gc*5L`$J#THV+NBG_8OV;3` zjJ#9t#!-Phzry6R-6rr&Por<$D)RrviEM&9jm=)6zf$#{nnrW|85dNNjtz!L6X!Mw zor*V@oycfV4jy4?6oT86m_xk4a_iGDrr~93c&Sv#xKOJiMZ3?fy;N_w>F}V-Jruo{ zBJ3SMmt_~V>&*DqV&`|dBh_b?iA=RnGiytsnw-;JN}I=p<~%d(jZkA1&CL!}XJB>k zIPQV7b#nnQ6M>&)ce*D;w3(-V{<{K`fk%W*#d@Fr+}tEOJN)Pg)8+xDIaZSGLq<8_ z6!XZmGP_i$)g;TUc&t=%E;`=(39lW|{JC|Ao9h zxm1}QuB7vHylfr><0cG;CKA>BY;UB{)seClxTi=A_Taot1H}>^BRk~{_Sn}1ey|Sq zxOJcu`&8fCiJDU4edb1+4-S5X>mN&-M_1jmvZef>cX%xAK9V-ilD(icn*;OCpip(U z5N6Xb=scXqIk1vA;gsqLZffiV($sW+p?92l9b&fI#r{$OkDXCUEZyE;D4U{tO|*L_ zHi^yy>gK6#6JlxS;RT{MV4=r;wl}=2L}#|YRICSYQxfJ$Ow+ir+qmVWGUma0!8}87 zx~ns3pC`B#a-QOJn72BE{?;&-&J5IMW-9|#d%bmGtLc67*2evfF>kKs`wH25!F$Q% zzJ@cWD)!-)-R`_X@4Vcs0uIN#_bO%LNfKjeC!Ev8T6c3P-|My49no0NP6IV>sgI@2 zMj17Zj=nQKS@UMlzRC!ioi=T*4n?);4=2N)k^V9EA&GsFkto*s&HDsN$Lj=oF&0aE zM|2eE%7Sh;Az@$91a0a>v|%+eb)czlTIJ-qwkZ?On$Rej04$hmL8y$# zZ=2h=#L#i^YNb}2o)0R68b${yZep*RkEVi}wsyz*f~cf+y7S&|XVZYab!{v3n%BbN zR-*lQ+UUMG@*>B?bbp}-u^$9v=M1xI_VwFooiO*l6^d1x<-D?z9Q)GRJ1kgSO`FV> zFE&_A56p2Z>LlUbr&P!fnrpG&0{ffT?WLOf)CNrdyG3KU>a>ArAJaJOAS)pqmhWU#ldbe=9+WcY07aE-L*XY z%ekm~=Wt2rN79Us)itn*HqS0Fo=*$b1oqB%KUn4-dNaJVj( zHkY}ASri7m>0(wtM7>#cTw_xF#n7p=cd^eE{8`56PqO`D%?g&y_n9lC*ASW2OF?=4G~X4fhf6QJqBljfD69**o0nL(_)o z(}SmQXhOm+_RfK{{$rouq(b@kl1|#xzLMFzn3c!*Y1YBeoAYd6zFK#xkSzC_mnt4? zl;&IlOGYKlIvadS5TxTm=oJwpw^S=OBHb$BLTXE~9ipl3Bhe_%R{hr|LBZ|QchUm9 zJ9yJ<(>cK{e57Zwu!Yj%O>Wf0(q{0I)oP{MS_#(XNP^$9?xnm)Gmzkb`Wg&WPu`XL=P5rU7!p@s1>KvU)$9iRt|c%}XzlrzO&&lM9LN zzLQrooZd-yJ2Y+Y5i~hbteV+kZ?YPc5@hOu*tOUWL=u~C4~a2jr2^*OzPUUer9K8lRw$K&(Jv^N%-ov?%FpTJw@?NhS3d~s(V zxCL4ER&^+2o<(^_hO-CxTRrDK!#rv92hg1^_BoFKEGvO9QyOAKXusVL05s=M#$ zLV4x_Z1(e>@Uk$JUSh0g(7sde(OyC6&J=KNBU}=0DxOP%y0=J;ROp_o5pcT2x&3OC z@7_8(5zq*D_kMF1Is0(md~ArXN5e(5wzp60O0-XD%jP`W!6L{iP`(%j?@(gg-jR;wy3)x+Du$GBdUGn-ng}OlO+l@uJU+Z>S}u~(++m(_gi%|2 z8>-QjYRe@%nq%>#QyH^3lzZ}3ZxJ+)FU*rk@AFbzT_;8!rGmKY)5My+;Ms*|TT_hr zBHT~M9khK=>}QxTnV9uMA)9GU`rcLP`VAkXc-L)HXlgF;_YVClG$v#6yK3-OK9md+NMdtfYZ}EG%Cn3Pgf`AtNF^T zf?Fxd>P&QXn8!W#wWD1qBS+@4^T@O}?`Fc9Taw68=6u6xP0u19iW@$tjFcr?#2 zyIM2xw0i~fqSU@M4JRckrRhU_Bp%*kX&UB4b#`)7ZdxYUWs7W!b*5Tkxm0^wmuaS* zMy6j8`*Tr=tXU-H1u}6DG&qTSsGpN;i+4=Rtq7mXt`y-Ew_m#4 zh>=Xwj!Y`<%=mC-du!9QF7#9=9sSj?I43995o^n0!8D7i>99zJBB)`m>FO4<9QcFl zE?>><QC~`xX$x_)j62=dVqSe= z^XJtQHh*6IVDsnI3vFgk*yS~Vg2i1w++~Mq>}|)U)Xd*n;3;}|SAxq`EFEOKSEE?E z)!h4!8ykKkZQmUsF2l*@jTLSQ&2uDsYv61)6P@M>ark6jhIyXvW|+M-?`iQSD4K;T zHk(IF*>3Z-R~b$9xBroJ@8tF!t#|U^kD7wpHTT8kMEfT&-Zw`>JH?+TK<0 zm%70bc#Ial>7dL~(LN+~dp1bVA?Yf; zE)5Eed+l+@(|;V`mWC&CW>4g7=)DrdsV?ozn9WP*Su;|cBYhKoLfx5(91zi_MDxss zp68)RFA4q7nF)_oXU5BRniTv7x6i+AR7!8T(+`n|i_v*CAaBiS#p{tWyH&;zD@0XkH`RaD+xQQUPFf&HcBtNCid{*UE z8c)D-_LEC*DktonGXFN;5*K?zAE-s&sXK?_zTIt|^NP?*w=X{F8H$ta+)?>&7W~t1 zJH=g!YH?GKUiu5Kn7Q2_EZ_}-n?*PB&dW?U2%<;g>0w{de8wIwF`h2=6wM!W#7pMg zRpi#%W_fqJa-8k_xg3Ypbe;#AdDP&1IFA1ILCzWLHlLQv^+#;@$x*_WSsh}L{jHLbGWmfQh!TAi%$>Mh(>FqKt z=HlapZ+a(lJu~s+{hpG|`4=`P!pvIYE}>>}IZ2KFU@vs7G?U4Zp;RwXUVnO_jQ6SD zkKmIDF9jVzbx(A<x_Kt;p9w7$7(aCRLy(ws#i56d2dA>Wo|#x zsYJ>NP|rCpf9>3Lo=BMurmOK*ILM&%g!#*3@23fqLio()G;#B1!%it?WyCiG&XAhF z3-&T5ceF-o$FFhSD#X)M%%e+OZv7_MN7Y^-=2SG|!8CF%PxMKMd$jY%b=?(vyYD0= zu+52diDkT2hmH>YNvhqMcoW_)vS|Mr*ZXBR69fJ)40H4V+lq=Gx07txdPh$hD0a`X z?`ksnYAq-<-QF4Qyyh1F8t7EkeL=0Q2)+^U&S4@TT$o9ShOD`+(3K)*US5T}Ebeb6 zLa;9Xq!9fvC&i5=pLIfe{EB!+rKmm8fzmg{8AH?y3ARs@M^WKV!lH#-@tf{ zqpWa}bM^7koHYh-e!V2qb@fVv!yCN%_ZNu*(LbykUzZVj~nuHCKRW%3v{)f{D{;=#bGUu7ZqsqETVa#Bp={#~@>!WbbWQ zsP;h}GWnqr{*xG*KhG??L`3T1e+v^TDrUY-9J|F9TXZGHC%O_-x9aMMhO!kC%s=xM zY|N7`#!(;(S)LnOIT2_|h^^l+2b z@Zc@BY*6CXdXfg^MW14&6P?k?XudR!23(>u?mckx9_M6A_FI@xC#1}_Fp?B+wr@;A zYD#QkbZX~1)7wRq-C{8hMCrI(rIwwb~n$qAh#Yf{U-kR~APGXju?OT`gp36NcQd`sh z48w2lt5i1TI>0|;lc%~{YkW$8mg89SfT-ASp3=ClsDlik#=`}c6VlXzFGUhT6@^(uE!rq(^M=z z&J=TUt}v~ZR+*eF<8s;{2CFv`_cqueqz+^1wT6jiOhEEy$Dea&{8YpJ)$=LLBP7gY#|A0%YOUu z{c^(<0XC5N%mp^8kSwRE9NNnnZn}-kH*7zd0zm;PtRAy@SjjF?ng7AY=aE(g=~%?^ zhJzW5g&%4KZY3AcK${T}f4X#YtJfJ0J`CQCq?P(ZNw3tZj&-(6pn_J?DnJ+#m&6{i ziX8WW?mL6sJ&f~o=`Ng|ac?xAhyoLVA6Er%LhW*mb1?D};ToCdpaQ%(xv_@y_o-t< zyJOifi3SmL>@Vw)i}Pa!#YaX~Ch#FT`1tCCMZx*w!*WdHZUP@!t|feY;Q|{8A6Jm~ zAo-*mT==~ReP@O9HT44>xXJauvwzf7j$ac&kZNj@CTdFNdYbp03v9f^yA5)m_t35X z0~H#93jaBf=%0WJQWxlzT0<8CB2LY;H&J;tjxIQoO|xM=bn4+>)da9xHDM4^0s>(I+cA* zPfg9v%+JrwPG_G_iJxD-dCab zktaU)m+$?Lez9`oFTnfgsrOd?Qoi3ZQ#pG0<}&!{2P;SaioEYSzEb&fe+R!%x$Ab{ z@BNX=U5D?#kTN*-#%q;{?}v=aG5J3Gp~|s8ulM_Zta41gKlrxFvBUSF3=VbRPzSyN zI&k-A|G4s(;eGtUnaVA_-*KUGyz{EB|NY#@D#s_i|MUAQ$G?g1m%R2u073sd&2 zy%Ly9i{6T1oHrd~<&lbb+VaiN;SU463|&GBeSX6K^NerV(<<4={G6R-YqcmCisVz9o$cKXQY8j5GsOvT5O4cxJlKtMhiz0K{*IpFq{PPhMLj^(`KWs1rYdqQh7dd5~+eHQVXd&4oPGNjio;EV{TvWrACLk2AvG)d7bJU-I$asJu4KN z9u_Mo^OX0&Qa3V5IlV#JYza5B8g6EF+{|jZNuL(DNt24)%$0C6$9qXBd++_xUxm^BpQ~ZfcU(4mcmcw69@H^}M-Hpm>XV}@E!Qb7@ZTfs- zFx(*T-=e;it9^UeS$~|n)ZEkd#-%N9Kfc|6a$A9)9z$yuY2A_8>-EXfVB?{pL2x(J878$^u2gbC6E z3FlfeK%~hY-ad}sM;E5yoH){C)+&<>W4|@py;4GpN_Tz~53aMmW}~yN6BlKQx?im= zdp3EuLP-|mUfe+ss1*sTGiIJ+X4|zuvM7lo$~@K->i|;Fp=Npmea2!i&9hSB$7Lyy z$h#;hbwdR?04ZkS;9yK3mw-(s$^CAa%3-Wp4|L()u7mEbN0nGv7{;BQ{?Oa*Zm!1| z!_2nKnkk=NhzG;u@iGy-;4CgVn4AEJuuRUi^>~N5>TJfM(K2n;ppZ=H@ilWW=wP^- zOlM4&JYThp)hWv|YM$5dy_RRFa0{~wv(%6m<`>Q_%IS%<%CwXQEL@Y!_HRB5jVH5!g_TV<{`@z)i? zEDD%A3mj2?$5@1VAEptZ5j5(}n&}s{iS=~UHsY=R;JT=z6tiV`wQ9|`YsI44n;RRW zT~Ry9j|A1O8ewF*jVLN++Q#T_)ayY1NR7p>6ce(k)%~hn^$S8uYsTu2dJxfeAC2KM z!(E(OFfTCcrZh&l$dH0eN_uvBoGp4LE5qL|!3KsW4OaCyDA zsdvRpQ<8E*rZDG(~hsgK;dDNXH8Au~_sQS$?aDv(aFi}#LCk-+Z{vn8T zcu^}fRGF5JFcM5Twy+1CCzad{LpuJjcG5>ub0j=+gKK0U0CS<5$5xFO*S_j#VlfC(U5#d%3g7&#Q`0;6JLjW=8jij^N28z;Y*$+noEOM;X$FZ@X& zwOKh4%>bo<Nf-@_C;5aMbH*=`Yr*`sbak9eqNK`D5~IavX`?N&hs@=F+xb@8}s) z4N;Dmnv}2J3!CwiJN-dktnzW50r@;DC$8U$+R%e6Dm}rxTMj164Z-AE0IOy8oK~XP z8dN`9r<7RhY;ASQ5?dJ14~JQ?6HybSPwd=l6J zcqFh1{8?6KXV=}t{0j|P#7+rSR3t%FP-+@4Md~-HJQeT?{3>`ECJUIE)Iy#)nI=@H zd6iC*r~+2tP${KXiGmL67tt?%zh1D}-ODQ~21xQoIB9OL( z5=<>0=Q2rAi04u=6f0dtm7sBNT-Yk6TWN)7(vrp?(;+Rj#Cf4G zTFm=Yq1YA_?#)Z9XJ|FG&RkhQW~$RD(cC(G_Ep<%c`J_ZMvIus&rUjI<{+qdzymoa zPU8Tz=5vZ6%fTj7S5_~0b`aT)?X)evpQc!gT|UE{)U~9*N@QW)eS5US^m1%_S{4&G zdIUxNrF|cdkP%}Zg=(lh9M~haMw4Y6v%~mLLb9QBgZ_23I&Y!UICD*8^dbc>u+D)wR+fTF<9yo zWAzwI_LH<8ZCT?$v5i&-Bdb(^qUellA?X&#mbD;8Sd%!BbkXji3Ew80X+3iVkd$)O z&v=Rkm;{Qu-ZtuGII%kNCR~UVm0U)rAY_`8aTuLq(il1#nWmIV#R0OgL zBvJzT2CqxW6)oey7nzf;b=q_atVs}+F)n~4CBex&XP&ojv>Gix2>lQ}OE!OUhui27 zH+Oe>o$EAeO?+A_G#XwQ1l15OJD&<1Y;Ivg9QV-0`b`f%X@S@s^-|2pa3jmDS7~KB zpCMn)!}?FZj~O{^6TF(>*`DE9@VrgGS;Qm1JZYg;6|L2@f~Zc*^@=>HrrCHV^DII0jasATnE{4ekAKW&UcJ_n|K% z@9* z(rB-Kk-H`|Buz!byE2AuPYI3Wa2OJ=v$+Mf^D?DH7#SZTOORU+&QEdLLeLUy5h+Z@ zB_haDQdpw_vltuG>;#U4!A$ZZDx{QR=_$b)$e9t0`=>#Jgcd}hhjV766Ck223xEoV$)KN0$f-7`_=9-4vY(+uC6+TId#<c{2Y<>Yliv~$Ine;vAdLK*9M|MWD_o>bi!frj=}ek2V%;q-Vq)CbQ`<6I z?NxgP=5B^hEveOyV=lCILp&1?VpElzd%6`S1c@SXT|r22MaYs_uENwA|-IyF1l33Ay&?^bkG!4GeQ1q2WJQI~t8Zt-rA_zm*Q4EYE1zrWg5jSDz=ui7B@2b!<6B z#%Z2S!|}jr=vXCqwJJ85q5w~J2Ea`aZ5Y+6TMNSwL$5K+raMg&RHtD$LDi|&T-aj; zwH9yFxHrx=pA-$dlwGqGvOUKKLxUBLdr1|^F`7OfvKEpXW=8oA)>QbpR8qh3?v>yX zCt;YISK?L)KS494qi)A3xCKRcb^uwIiX zthxhL6Px0(hstR+4A|13kBRyIfLt9j<2FDE!-j_quZ`@ABq{OoP8U_{4w5bD)gH7s zsay*)6@h7)N!Kn|)S|lBw3K27hV3`arqil(JE34M#=F>5oNF~#H&fh}(Qv}Zu7%j4 zO{PP^EijDbsI9jqT^n7dok1KgTuw1P!>zjw z%#sl8rV5O~9s|in5sY{Jqm#(CFHjQTFwj8@A7St6?!EHv+3b(#NGhWRG+0UHr zsT!XuUz%xPxK+RE*j6!96;)%k?ZBu7Rnx84gtxEqJ6`t!quwxG*KE=(U9Mheq+7*_ zL`5T1ZtGMhULYJ|B};6N41vNSN3dE%sqQ?+b%C??OWTyI`UxXs{2 zzFUi0Me$5fq0op-y8&}hETvF{S)2P^`9>WXO}l0XfhC3-N-4A3XhmC1xs8m_tw$c6 z{K*%RH`R>pJ(3_gCQd3f;A-5eT%D@n25!^#*;H*#33!$zjT4wy|Bf0a=9WvCy@-jD z{*!SR)sk{rH5zp{Y`K2XwhOUp(JZ5326jtZ|Ks_@aJcC-Yo1Qc$uMUPyP|WLZ1)_i zi3$E=-=#f*15+2+X4Gtm;jN-PLOzPQPQ~gOPSdNls!cHl zFQRG1+JNC{I_QIniZiK*4I{98tbeqM6*&nN2C^Agp5H3fbERiV%ZLSnrq^)opx7M< z(Uj>b+Lh;rb-yOII~Ap)%g}}M4Tm^v1x4wM@7LWL#tg8ow{Df)0H@PJEMj@ZUSvX^ zfdN<0v;ATpqO&?)B3De?R9(l%uBcm8R*a-Y@OyA1v!!WWV=le_Vl z3Bvd2C9fV@qCdm=&2U* zE=WU(FFhd{V`Vv~p_46D5{7-O8M5$KI$AWNCV_06mA|3^V&M)XPKmlb-&v^nEYY19Zpo|rQN^i!%U!_8 zBX~1wEdEY%1n>0pIz6D7Gg|SQX<2X!LrmbHV+|KhXJ)?;f5yY;Ch+(K+APLg>LeP* zXr66j(Gq77&2}3xFtEOc?LnsJJ2qC>FwIIQQ3%VzlG{8*>Eb`&Khcz&iH*tp$l^+? zYS)=Hrswv~0Fl5p*a=KeZj8qBi@N7Arg<=tMd8d)4VhEMq+iss5dDSky4I#%UhQJD z9H?-K8?!jOykOx-Z+{zy)+sO<@4s;9(y3$jKM3M9fw$ehj@j-lX5Zu~(B)z0a?A9c zr6mU^fuGrG{~tOtYt(#*T4#q)i7Je!rbt3C!6Mb zO^0UNk=E^EiBnnFobwyD?bSU>Tie>nq&c49*UXlW(E+Pxbn)TvO0c=J)!D&hCDoos zHQ2>ALspet{Ays%pUsn@Dy{ww!sE12tX>Q>>k2kEQ31)TDrp5Rn#^@blvHJEjtr4( zLMf&a?vfBkTbxx^2c?LV6-9QDJKJq@$y|*Vy_y%AIA!{XgBUMzNxn+n5udmRY1CL! zy;`2+o_W{v5nXoaQVXIJ0KX@^K@uI zttLh_`zZC8k}wjo29&b}Xf?bFAcA=koy@9+8CMd(Hz6xE8&NgitZXh&*cZ5n;+U$e z6S(;h zIEM{CP){a$+R7vdN=E=B$E}N9UL9N>T+Z;u&X=)DyEKKF`jVVwSgGtm5xI^_TRn0o zKKVWy;n*kpA|wJiD|}F=O;Qh|Bq)41OlPliINXb{n^x2FLR;>xQMw*1wPA@SY*>f@ zWZTZ-;%cJoa;I*yM{#%28Vb-eyeWQFXrLgTD|TEIJU>(E-pr4jSh_E z;XF(t;Urlzp||8?UYdN9EPqW4Q^&0k%WfiHz*)^A9A;fSuP)hhR?Xu0T! z8<^k`lr&zCh*mVT2Pi7rrN-2mI3xHnLHf_(BqFIWfs#hapou}A{d_>-| zQ(0qzv*mm3r97Y?IxWA7xhq+iz-t9&t5}#I#GYoXJ}7`BoIIdqRGSUcwCbi(7(`=R zT3*aCiAgWB%^fON-8uRWH)CXffZSx?y!FoVx0AJ0~F&1IOer>5MPre4-Y^ z=#lC&G&xs|1nEWyj3a4=krOQYW>JGkG;mCs2qwsL_reQ^)x|akWu<8uPUx7ni3I^! zB2n^UiQF)>qFSOGb;qmKmq4}_=4sYI(rMKYn@s4hD1DJ;%@3nih*5Kf&tg-wu-P9i zuS!iDTS1wSmb|d)!2QbS-f*#vy@4rQPLml6oo-@PqX}ildDMi@2qCI`^HPz|X49>E z4GXHobN8^(QVvs8Q(zgs>A03>N}59Qi?{$F&!_L>IDwt0=W^IyZnYxB0nC{fOoZ1^ z?O5|m_!Rn4GU&-Tr5=5CI}{Y0qIBi zmT4PR6D|iVSHh>X9(hKQYa^~>%NKU1OsQ=nbUYiU>eB|j7%efoQ>?Aft%iY@=+%t}7K_1q!TGasEP8POhE}B73 zVX*1MZ`SG-rXQrZk~+w<>lg^yRf`-y)o#GjNF7R>Yq5?|gBuc9P4uJErZ4+gaq~h{ zTb|#V7aHmP6M3ly!Z z151cyT0fF{8%9EF;QSZpHd|Q4sbSSAQx_3pX69|2WB4JWE{2KBsEX}n^y(IBIWLFM zZPYzlewSs#xv=H-ML2~~&Vj>zb2|$BC}})s^5myjQFtM*k*-m-?S|jL;F;51M4u6b zXqoK*JC3qU062)EIw~X)8vGg)9lRSYhq+ot!+}+BBVSU64WTCFp-(KR1b|x+giOti z*(QW2pw+M?(^~Q_)xnVkq3>X8kJMyX>Z-5pfB_siFt~QwOl^;PUwhHKnAZ&~xwcx> zR$XlHBiZq0hZa~IUVzuS3;UXs5IL<_{&E}jS8P)?Y-qD-D<}pTyjq+U$68);R&_%I zK-;!!!M_sfA=)3aiRf&ywFu~%X?iA>@CEI*1wRfIzskPkp|QuLfra~2PwhqUyeRyQ z0yOm0ta>o^!fv#e%*CbUmd+y8aBR@QuB*h_Dqf6ECUrlA=}7DhtHd^B4a=`7r3VSx zPU3kG7zt14RGx3lYz8)N*vN@n&vt0n5eu0{Y?(GA9MwGO2$kd5*v6EFUggIF3eYYN zV1{+ssYvHrJDjOu-&(8QB;96hSCyaH&Upd=Zn}+HJ=H1Ute5B%4rc- zFjAOk&x|^2Mk|Cr+-%79dl8L%iH416I9^!GLf4II6;XCD1QfI}w%}Go^x%1L%Yv5F z8qC?Cb_V+!nBgS~35x?3IrD%mCQz#g-dv)C<7_LyTTQQ7x1@W(8&3=MTcf65pzcOZ z?C)-(2ji75rC2rX;>fg)-9(7p?c!*U00&s$h0!84p@JL%4$JK{v9`gb9>P&}7M-YW zF4`B({E(8x0&2KHO%A!)aD{aax-m=LK;)cy%_kpQv`((yR7+Hhyxaq{AS~!4hJtuE z8>PGlEw|w{0%(k&j{`}#fK3YaMPy%JWkFts~b_x!fFxr zzDnxghQ6ZTF7l4^Q1EuDPBMf>Cr@s-vuG}%*DUyx*j?oNf$Jy3PGLf!ITyUPS8&z= z-*N%okdBPCyts%m`j@Czz5w?tTUu=LicB-aJ~*idy!E3KgG)hPYaYIaNY_@B48oPB z&1Y5%@V*NlC^0e^S=X29W?PPS^59;x+N@dFbqEnslafwCnRq;`l)@{Ovri~xGB|>d z<*elCH%)jUA^cCS$HMA*?Wo#@sEWk}J9R6>aeS%w!kCuv6JYdfSBZbdK1wmJkz*gd zU#~aojvRzw2Q2(Z5A~%rIUW`$YA_?@D|7kqKGMONSzVU^_y`-6e6IT>PbU9Wctu)x zY{-VA5iqxli=Qi}*M>t7*2q=L3KVh=!YUc?tUyWIv%S~sxO*tFdcyZ!`AvJjAxQ!RRj4VrO*YE#$3 z>Ou5FrJgttY9TCQm@4X$DQtz-vj7675wXFSSw&uGHt__%sDvf#?ZT`cmg8i_i9)bJ zs8bjNHjD@^1I>rXLW_E6En-fD#s`IZh$7f^+f1D_@>iisC38p(+=x(v=|?bVE+xrO z8jCHf8chtj>u|ZN(u={7ki?JHI*!0-)!jOF`N=}CX?4-J>MS0_gTaVXLtG4LGL|At z9?)zqh8e8i$#aG2ExUm&eKHS09&@HkS|_M!xQ`_l-#f=k{Lhr;kF{R+Z zoSDgRf;TxnQLGzM00WLot4@As#>d4xNK1$1GQFfgm+ z!3n4_aX!C}36)Ay4OUlyJUUc#8;I#oBK&W2SYCVO}Y1@wzd z1O@lrH!!W8$XOs+p+)7A=cgBb}AU z$t<`NR!Ck+A~Df!OC%N;*w)^};m1VBWOpU|!=k5wGkgeOglrNeRsMN7Ltv(WMeOG(+EZ%usskBGyFYv@tt<5vzeLf@-#EaS|^w8*a-j zbkSpr6e6fet&R)Ca;9NyHMMZM1pR2D=b}usIzc;*bP~r^Bfzj4R3>hO*dU6vkfpj; zGL$7O%%o!|aSHh+j zwiY7{=i51d8}5yTZ~#G=s2}uBTJbT`u!CBFwL@Z1tn8;vzQn#nm^XGXgPo2;A$MmH ziwff`8L$Fm2Jc1+19K`^rNrU_&4FQfzsN=_S#652Mr1X8?7|bm$joP#Eek}L;i^Y9 zT3BMnEZcrDI;HILb43wOR{1z2XEAkR!ccnjGQTV`aAh6%iwd3ExRw=RNQikRJ8?>7 z=Lyv%W=m8TEhLC=0#r&+D&hF7f(Qd#%#%ngwNzN!!AzU!FXzVH5#}1O;AhbWq(n0? z6Vl|~e2He@C@dU_TDrKa=+c-2q>!MG#(#Z^^kqI5+dw4U=40!NN z8#UidES1`)a2u?#roeM7?4GL9W)j-O&*BBh(~~UVWR))U+o4;pabc9|0}!s$h_Jq& z8Xqj5zz}nRVxE>Stme9O;JNVBaY3I>p~sf7h9#ATL(_}g@~bt`zJxh&>`f_b5JP?# zOZYBARj@MB-oPZL4|e?1b$)A9NbHr2uPw~w3+aa~y2OwT+nCm*nj&0GX9ZixvgRC_ zMix!c!&js|u(v4KsDVZZwUY%!(J<%c^R`X$`zF;9^!kZSqR67@G8Ggf=!i zPzA0i8M8)|Mz26@l3@pjX5;}LL_cXX5!DUb@E9iY%(m(7x9CO@lFst>W)etWU?7-2k4Zz7qC}>_Ohg@4-$@)sC~J0m5~>PQ;%1QS zFbN|>5mv1+#+le9X<~3LG%1X5Fd+jHk}PrDo#x({vV~D$2?4jRnx5yGO*nZBW~I3M z5`wA1@2mQ-!<>$Dv9J&iAP;w)SjmPigcB`{?jmeEgeo?0k2j}O!#H`-%a$Ey`q+bmkx7l^zN8%O}57r-9crEH)iTny_paWkT_%Z+x~6=*?{E$og;@>?qI z%xPiU5w^?u^~77x?-a!}oVw>-M#18Dt0y6kl8x&5^xWR}e6qU#J(H%{1Fxnh!LeAR zDtVoIO&2>)fw;W7lVpgq8~j#=c01>qF^~JUsCj7Gl{_4gv{e#d za_S>}+8=EX4RPEfd8)K)g^oivMvH@Y(`n8@=NgV=C1!6|!9Y^hz$DiPBCAY_%2`6n zm=-5PQsXFDRSg23v8%$C_zl}wh(HI=&*G)wN^zB#O!qywn?(RwZMaeVaUQCy>^Kgd z;{X%wRN&{n5dKUQCdDl|*n#7O(4Z_~c|@0;G+9WlkxFUNiAH`z5UV>rju12uGG!50 zc~kH`7K4o3u6`O)kKN>~8ni09#D;|dG3Eg!qBxvciiv;=INTwHmJ=$)vsE5}!7O-Q z#ssfEBLun+olX+AcW_4&9b>wXW~ai^CF=|rXI@a?gMizZf9uB89;(vp?Of^1(%Byp zdwX`t$~->LpYg?bUY&X5IXyBSk4MIBhXqXbOoQfZ>ln@f>iDPANqJ<>@FZkF<&Y)A zV=x&=5sjURZN|9X9%7z^j`NE%M1sy!v3qQGhpWOVW}G{8rc-;aR)cYtvb-e>a}r8# zw0p(stY6{!Bdd_zf`#21b!U~WYO@2C!f{@u-jR#b-Cm+Fa{O4{5-lzWQv)R?`wEu} z>WIo;6gmWZZCLF+p1o2WkEOXN*c{L)6C9xpaa|BAR+pWjqpXo} zgU;+0i{at20#yQt)dskt45%Jc>&yr=v+Z82Xhpg#Bq`dKDmmPV#>=b25 zDxDR~a!9Sa$e*@w(gMPC3O+NoN3m;V=kunec~_4B!?2S$Bz3Z{I`SFQhKgrM?JJ`p z!hdZSC74x<6eU%-1OOVxUrV2`s~Kqx#`nq&&;e%%}lM&b<*eSGaJ*La~o^%nbYfMlRK|x zH@Z_2_}p5DF1=?>2G3^_;JMjz%JVa4yK@`ejoG!+bMp%Q?zyScGl=X!*>sYo1Ul=) z-20P9dMUS~R4(0Pj9p#OZIKvN2Y5wAt%&9+w84 z?cEKWDNhC{ELIfbAHlffW$Niee$Tie574IxDJ6+SA;%G=nvYm<&YkB-V=7Uban|sz z31QL@h=S5w;|IeNW62JN=N>Yriv^KM6IkDbP<@vZ0u|ID)tJ-W9NL{>Cr3qOM-a>*yn>3!fryO8 zBui!qq`kS;6VYT8`6)C?0VEapSC*CyViJj7kwKACMmkA;HxD$H))b3$=IutfkuO(j z<~M1cHxO%w=q<*bu1=n*#25Shp|;}4EK^u6O(8`LEu`wpBGQ>Rr=!iUdb-%z6^ch5 zVMg^>vH1A+EUtFInailb)&UUprZW_?azdxmX(F@$uCuHknX!%R6cURK-MJcnqa;GKZbc&ZJaj7i zg7Z8(Ge18!JDq(#C4SD$oS8qzzQ6OH*HtQ&#g#iM^+)cgeBp&VDnIu6J1g&d!=07S zJ#nP+i~s0IpFUbyIeu5=7lOMgAO3;6DnIhxyDHb-c&uVP zbgc5Bv&Skw_Wom)w|($f<&QsmcV*_mG=Xm8~&mFJ4??2=BYhO~i|LrfS z{F@_{$~~16m6zg^|C8TeT6rb@-BUSMIa0ZorJVrWeU-Z_uK_gudl~*oEP_48sN7j8 z{<{}6?#4UK>7|ud;op6X_I-GMUqbsng)*l}yd7ci_k#8j4Skg^=k^5h<7Ij&Xn#xP zB`=Ea>L(THP_o23r zL2vFADaY`O^ponE{=Q25KE|HVQ_^(OLiyxgrZM+2oO=PqzmXQ*&3^G`>F3KbPw!Fi zz6Cr;e4;`vhp6*^DFvcS9LrBCH|JO<0oi`2?WFC8Fz#bzCjCFcO3B;t3D(x`1}yzM z##%Q?=oNUUZT?=gjMw1b%klmee5YTp1tt1+690~|7F2BE>64S7cal+mW#!etrrda4 zQ2AaXQmAF$gJ1GD|NdH*N^O)&>;%%O)e?WHT&O%miPr;tCtF2NUIWM@fWI4mxg;qc zvS4JX$eQu|)DjbauVkg7d|wOLBlx^K`S)`6gmi{vp<Ud`BuE| z7f*NzUc;!pntgKoBY@>PKzY2Bamckb`$?45obDBML{Marxl~eZ;@_mU(O)%kFjcuBs|pS*36^m$INWPc^6_oLo*|L$Z@NuKwk#_nddc0X!{^q1s%C!{Gk zr(bvS1u^n&$WLQeKc`Veh3l4C8_R?8@#jRyyo;z@@q-07m8cRpc@ovk!r&y}yhB-pM=#o4k-|ywY=NxkY>&7tM@OI6Zop8Egn< z)N0MqO_tts&)ZizJD9-FK23+=iImbdP%KiKRw$AZSD23w#YVwQj!97zF7T{COi{K1 z6G~bEFQa`0%uH$-Zn{jJou3uRe3~|yofEnv5>s3`M|>-j&w>_)xx@GxU;9^UD`_x= zawRGGGSS2z-!-q+0zGYEx4FX~vh9mZ&2tG{_vzvJW!eHB;xLj9C7+t&C6kU+-Pk0V z+sQu36roGK6s7$S*dl-$xb#h#b6ahAp>HVZAqTi$+r8>?A7dzMG;x>%v? zyaLL>)Mi@(m2YBtutFoygK0Eg513P-EYMhMtSo=!*MPW5nO5dv5^GG;xMk)x6Z=!; zWQ@7Z;N+SCPs^KIUW<&RS}TcR;#fsv%Ae;|ggwn0Q#?#-GuLV}X$6Lhc2ak<<+P=! zL4kgz?#ohBizVctw?5NpcU_>AQ=LSBGfcMF8GviHjW*Wi#fGxk>~pMHuoYuv8SWxW*E44mQ#cQ1^+&3w$wrr(Sk0uFY0`h?pe$`@awgm65JCw&-CnjfhPBYBcL zdrYu;7*F~zo^%yA!5+qwUY&v*4&zC~N3R~nlU75`xCo|q7*ATBraFu#O}8>+&b8t= zC!*~h#*%-9GvQ51na{H*27rr)Z~$m4kK6}MzH?N7s0ybc`)m^U&T`P>o3eM%u-}8uGl-6 zh(XwL#6U*K=EUo?{t`vMMr0IRd5)7qtwA3l2)9rainB8sBDM{_UPp|ZF2c^w_u}o# zX#ufiC4*x!Ie>`h!@GbD+GBMPs)*r8aXo9|ZfZX?>ZV>B^J4H}I? zMN|>abeq=%zc2?8D^FV4MGAe$gB)-l#;dQv)mg$BK+-Fj%f}-H- z6tO1F*)tlp=|u>^uCE~MYL5r;_B!}SEvb078=4$J%^SG%EksOob*ny!dwB;TcVc(Y z*%I<*;b+rKQLzq68G2TsoV?hXDn?0F)VgU>!0+tY8Ojy$>ylmgoIset3rx%OT--IL&Amg}x*zutFxG1JXvNdRi4CJDO7zg6*#%^!oUdPbF#&Hn%#1 z>l|K$yYJyA*)w<4OS!$BD3dgL1-EpEM#INdym@XzM5XJ%UQm`?26#htOtQLelZz)kjYf=$^Hmf~fXity%@Pf(R`;tmE(ysiUTT8WOD|Fv1^4(m zxV{BgmBO$zo zTNzB;MH@KStdy^ef(^;)PQ$2Cd#=?)WyoPL%BQKur7LQlxDF229@n&80y)*|ot@6w zW)B(^L&Pa&6W0a0EeCf`7PuAV%v7yXPVx@iS}pN{q?Yi`79l9rBaUf?xaTmF z*7We!oc6YBAypAU8PtYRm3n+lwQrUPU?f}>kEh~ zw|Wt^a6xUYg?>6$PK^dx{WMSX@D8rtW4>Mva}}W{hlBogdnMsEgBSU3Eov3TGeO%! zBQk9o(G^Q6G*1RpB+ziXYl!QUir&vSH1zEzu9DTNjbOJD3TzWM{1%-MQ5{O(nU>Kr9NePW zs^aRVLWaCLw3YASoQB!**$u=vMi2WP4zC28J6oL{NR=ika2=K9b{D4D4}5vR!c}Eq zpZfYV_Xe&Rtvb~jnRlh3)Z%S&(_^(y7^ZVAxcJ(wHXV2|#a1#&zzrj?aE)mVce&@w zI|;Rk>#`hNpRQ8}XcEO(9t|+l!LC?K%ZQ>iaj%WvDm5dDkD;Q~njYjE6di*J?HM~Q zyrAhO?x>>e(b}-HiK{bqc1%)n`RwqJCUbRBDYsUc>&P^oBfcN^}XuEVXn#XM^cxvoJK_MBrX?TNxzSK;p<2G#l%gh{Jk zOfsz72JVWraS8gZ)+HQP3_~&SY2Gqs-SFx){G;g;(w76WiWZN1fTA$ccmQM74zbZO zTEe7XOVfRf#Uz9O^B`{pgn^9;=73}$B#lO5{? zYJ`Ks%M|~jU8b1cLX!y`b&EIE(B+F{oB4$kh*XwDtU^K|_7B2bWz&;DkSt*MYGnXrIE}sJoC}R)y?%-pJ|$|^%mm$m@8ApBPf+P_Mcjlp>Relo*`=?z9px-} z^D?PB65-3}arQ#MoTkxbKFT8mI?RISL*o&=`ivux1(b25)Q&Ex0u+SbuPLEe{4r!j zn2HiGK1ZQua?akyRst%NSQWti9*A& zN#qGF!euwKG3@vq8pt7|7s=geJiuro6%r$r25bnwLFSuzH6&YT&SeY(vO@9a zii6cIuJU8bp_&AgkKIqhCtJk=k+|lAZqia^$(0HMEQxU1GB3{ImLbX<>kHeX9VW$W z%r~LDLf4=(g4KbYpWp2@x*L1M%}9LuLg;`q0*-=j!4B zDkZOf)EK!vu+7qb)v(!!DmIMU)Kk(7Rq23b;9BHv)nn zk&>Y`GxS@%&US3~SwZDBW+HBJ=2A0+xRe=46fE2h*o|o8@DRWGhc%6byCH066*h0n2^fG7MS_u2B?71?vZ!On!tS#(m;6@qV%)`o-5 zI#UfH>x2V6!*k`lDEf0z+k(0yv{`$!Q|vj}9Zc*lGCRg9sBGHArs7n}?pV3%^e@LP z&VN1^86NcdJh@PGdrq<)qoHo$4qK`mVbiQ$2d0!?|0m}@*x*9k(UtKiOC26*EGIjf z+>hZCQAs z8#MWP6?`YGBeHIn#+X{COPZbhZNrjAW;DVETXJQLSu#EVg$Gzo_5&1~dRgAgeh@C( ze#2Zxby|W(R%E}LtkcgeQqU$yWg3DHe5fZxW>_b%S5`BFX?E8;J?AzuxsQ@TE4NzC z5Ma(1=L2=JB*cT}N>6SGDUp12IBRaNb6J>u)#R~x4Fcoqa_sW*rJBh-6B@#_s`$UW zy3`q5?$mMnXgr`96e%WUIgiao-Aef-_vwnDB%vEm=w&EqK#1e2m~~TRrBKjB-s2IH zL4Sf)oNZDk6yz+GI&POjqAjWFJQwLuR{t>4kom+k0m;Xy1teAR?A>8|r?ZXOx<_I- zvaJ8WtPpkMn3Y?l=E$9WD)Y5rwfA^-9E8Vie|@yeyJjtevX2(5mEV91cEPmJuC&Vq zFD$c?Mun64v+yvfZJ-s5f>+1TD+7gId zBr%MH-d+%^jH#xjh_f~y^mF^2wyVT@2WSdN$GK-!E0xHuv1)E!b zy{JU}9K6|y9aOibvL1FYK;f#miR5t-Ew(Ix9p>CyCRXcLtA2zt5NtMpHq2YR?ujPILRvA&O;K&X%=MPVDoq?l)4bZ=7iHk zZzGK3uDG5$GyKT`vWCh;$P6oFk!`7*wcV65{9@86wM$@^UYFnU?d=L1#*97jB&<$q z%BY!myX@NSl2kw57*^w6fBW(-yFMG1h7_DSYGcw2G_*Fevck2N8Q6o9Rr@s#pYI!p$X2Bw1W;l9X<} zRfLM2>LL1{E3?HG8^}ocaa~7HHyLe9iR|iX}>|6)8#De@{2dMiZ0+ zk+$tNBYU1M7ne4Uh%lpYjC~gk*BOXy0kDMMjXo_)NN{6JR56x}S* zTj~!+a`art7;tcvn8%HFgB7dmIP$y2W_l!!-ZKtHJ=&m!i$D)9-xLQOR)@{>9WdKm&u6=XI&2?W`hDDyDr5K8A= zT4h5WX0VXT7f-aSBCSCT9h~f;C7K~-Y*Gc&Q^+U~+cY3uyi5v-uE;?_b5a6@BrS!a z&Lk9yNm>dzT}f!@617zFnvzh+ClK~%_ezP$BU6#xq+0@rOA*D+8k%}wH#-*bvKxjP z2gFH7xH^nQc=>i`*de|YV@A`$Vunu0op*m^sZ>26lS_qMMBD}n4S_fSqW^)`=r1b5RYg)sVGj-M87T}7(fzO~kHt8F z$kswJHI=uTHg@tyh;SFj+F3m$yV;<2*wn(D1{|9h_6PE;hHh?))kD8O)b7>bi9;;3 zn^^kNmlQo1^MH~yVb+x{_9fN<`e+?$8$ElBb$GV30OpAGwM#x9s~foBIFl`QK~XQt zbG_7gvbBjl-;4cTnR6gI{384~ZUs`ib2a`(d7(t>mRv<9mXeB){E_4iQV#w6{R-C{ zI*||U9WWnGr(Yy*31nkSC$nZ*HE%FgkU;Gr0*&B+HJh$bR|5D3ECLe~^346!ObjuV z1{}Ir1PhSMeEB|ttPAu-&LKCa*gOrPDIp{DE*-hCG86qYr(GaKZwu`eh*(q>& zmcFboV*lUN>Wl`0JEa0-dNPQPMmwCk_02 z=lUchbcs45dG9A7kWV1wG)7RFq2M5G^e>z17;NrfbEN3W^+QZHi>d40_(nmN3_TL< zj7TZ#Bbvo!csSG3Y^_JTWWaWA@e%x-wo&sI$szOrqzo53yJBytm^4nujBI-M;&zwq zYAG7Bwr-ot%8IffO77i&m2A&0S!}MJJyOopptXz6TsL~rgou&GFAvG=NQ?td)`CJfh(tUDMrQw=wzi(8L1majwI)j9p9cz zQNJRSP=q0*XarW3c6Zb-a?3+ZrpAIV-!m1lr-WC<;gZoOb9rfIgVQ36OiRxa*;^poVoZNtS zDMkVrQi@phlrU+Y4$y4a4Ca>v2qw1_Ez%w|YG8$!47svV?J^H00X%?q=YmpbNP;!3 z`C{%53u+-Meb?&rdTZFw0{0@L$QH9RS|UubN+d`tS81%LSbA~FM#Hp;5Uh+Gkjp($ z`YuMG7PiSt!>whAR2`G!i;jimJ?)^8RfVJ_j@wXIz>I}_PE+Y@j{v2}p=WMLiv9h( zq7_D@C4d^~rLM9!Ckd-#+6;SgT$$yMZ;j{i8AuqUeF_hml~ghaqJHt5by=%aNHQFv zBb3z+Qmmp&8uyw2XUqNzfw8ba?ilUy(CvaZ=FoeZm4$V_Z-jS+ms!?!cW0wL+M#Gn z*skDWoIQ&I@EKOV#KBJj0UHQUvOU0Dd5l>id3kjwSpx+oUtmn0Fo413!R3r8V@HEo zMwg}#XbA@^v>5#LbvK%@f&~BvC<& z@e?Bi=G?-0fL&u|N&xhG{ejti*Ju}QavR&cvA=bCrjXX|AdDT`%$24xb)!{_nK=Q^ zp2&fn_NjBtn3vQ!G+$_wzSo>&izmv}j@b+jUoL?EhYbd2)vV=;M^ZROMXYaR`B`F> zmMe_pBAcCfN==`gR?YIrS4Cz7AFNriy1-noWFvjp-rU;3nJ`H|O-O4_BB24v(Xc!s zCku-t-ea@LH3dOD?T@yHh7e=|OTGJGlOMbk%p%Ph4Eh7HkzQ6i9tWLk*bJp~lPLz0 zGA(E~ksysV{Mb7?%vpfM}7JeMlCFeEZ9Ug5yv=C!yd z&Krs1P(qevp~+ms%#9695++r{)nAI6gCKMzyudh-0e|ZE`;VJwM}j@|pVkMgRCx$zye* zF*Ii=$F**+evRq0Q_$3(&TU3SiUdnIukz=A=db3?V5@Qb<|{>I`CTv(PSi z7bcO?da5EED(UuMb3N&4(p2Z#P7y`6O2I%1?Qa)>3k@&@FBBzBlGU40wPG??zG9{l zJu_1+#h8+5_hKB?(ma2H=EY@?mclRfi64^=izaej-rj^0&4W!!Q%i@{baJKVbvn3% zgLRTRJu3);9u})K^OTmuB$7`>koDY8cuJg1vd@pQ{dfoK3x%!)zuMBgrL4bKH+LxYxjtRQ~ zl)B_`o^=S7f#;d0`1D%(m<`iE?`-Yp6Jl6c4Wq)N$?++k=Gk1@_Uj!zLwveWD^E2k zUk`HdoXcN6&NCpNXXV5PCW_k7gDfgNL9dd7$#O$5$%b)UD9S};b=6u@!kT2ZVHjtp$!X0(D1lF= zS(-Vc36_GCC9fm_&dj0HL3g4ZQz~|OFBu>u%Mt3Fwo|`?VJU?@` zJGar@m|Z(PH?Pp|o|`&7GuQ1>HXRI@5<2U|-0G|kLJ0Y72_X5M)0Z!cPaYO(4@5cD85mm;b_y4!+Y=&PL^)haNhWd7+52GxPIvv(uT!r>4Zu(^IqJ z+dJ>+uf6Nh&Dpc3AKh8Mveg-0c{3hVl82a78x^0f@6zl=782;YS2{a!_9>r7%09cg z_T-?mlYPceceBqxaUGjKvJc4{%syEs9xwO$Yn@(>zC`BkD>e2Qti z?88BPd963hi3bl+);RZcm(BlV(MiPDHW2qe_jnz&;!dndfROepcR$FJ1XV{=Mg9 z<;`7+u<$@zKKdZO{G|LL{u-5&)rV}yMQp7l->bgm+ef3#?wfm?Yu|pV8 zZf7g6IEm6$j#XX;;(KqT&(FQ_+mb7ZPCdBzU8f>Uer;{O8>8=27Gm$9G6t2(n@ReN zp-Sbye63Qse5Xo(^-6c}=H0=%07(8AbT!hOH@lyE`d4NBpY)_p$`OY^FaNiI3kS{9Sw+a~f z%s4q^=-^(fgX3E1O5Bt9@&>>?Bw$JK#>paoufX$jIeLsg4Lu)lk4~WXcR+6gFkcaH zV_%F25}2dClhB;Za7*s}6k$nU#z^vcS+1-S2@KyMTD{?-BMy+Ck(ofo)_ zzj-9zBVahB&=*a47XTMcp!f42atSbZeLg$4f!)2L%k}ORq9|KMJ^? zoalC-cKEn-hT(Uj~syBFCCEH{{pyA9Dv?$9+2Me0Pf#Sp!XZ7 zj~4**^mlV@8D|fE8!-Q;fGg9#ZvmPAC}23na{asGZ&WHT$D3Yd^qxf8YXuAg#7CJv z|0Ljkb^^U`1^!14Nbgy|{pJLEKLvWv9gyDDH&rS>f;YX&%KLhx{nrA90pg>qygvuH zUztGflfeI%2c-8Ca8CX{IVgCQ@%L(^{Z9gh0pg>KzmEa#wWloKzdKZPy7wx zE0*#12GIN81k5D<{uFTcJj9{O=xrhSJ^?d{-VXupCnnH?>sR@i1Je6d!2Rn9^gaNC zx(AqeHZ4b4ee?nIg9@CX@&BkRx*=dDmG>V5?&%5iPJzg$4oL400rzJU=sgO0cg;!8 z_}{Yfb^!N;fGw+EqW7Ky()%pnzBqy2yFu@d4oL5DICt+M2M@0@{-|lZU%)Uxe3X^< zqkwy60=@SD|I-JgS36y)T*RARW&C{~(lD=>d6n_^9N_-_1bY7mDE$dw_RnyVlrN*F z86W+gfRUNA@q)&W{UYH0M4@MB^#1c8a>rTNa=ht9eo9$6{tPfLJ;%UG<#m zf!>FJe+@7vzL!%Qrw6YRFf!jVJ$Mb^zFVQE(*qiM%;o5nmE-Mzdwc>tD#r*gFL^ju z4vn6^0x)k>;B@@`U6A=6zjB4+UIVd1*@EqXLEz#77x_p9S0(C(!#@;QtX|K4@@iI3mebn-+x=JJ_fk03G`kM{3j1c??Zt5@C1540D3e4p~mG2Dpn8=zSPO zI)J&$D=xF6KPY3%6_1MY(YwoJ|jnEJbbc}{^V zlk*n=^Ct?NPM=Bt?r6%A^1o&D9s=BgfGy*X+OKy&dfR~efdkO{+XtlgbAbDm1JL`I z2c-99z`Zzu-YJy#7#Tt3RVKf`4!F|-woHCx?~Mb}dkk<}6X<;a^qvIF(SS3U=)Fe& zz8x?#0U)0GJmPIGz4|AL#ulV6KLoKe9_@^!^@TeqO+p@%KLi z|Ca%?6>)mw{Hq@V%ufioGI}q7%+ClIPO+T7n=QcNO|LR~e-ml{05IQqo`F@yl{W&+ zs(>q_cPA1y0rU7Gr$=yQ@*4r>{R*6}K4?h$j&jaSm6X<;n4E-@+{vR^v zc)bkoGX9=i#@Zj=^eQXwpCaui0CV#K1FPJHKV|fO1u*|gz>TB#S-||p#mV%Jpc8oo zbtHI|(R&_guLsPZ3Al0X?bVkmmG8ovUS;%t4QaE0`M(8RQeI7e{=g%QRPs^QpFaq= zvjVm(-|q*NDqwz1z>U+>F9POICeV8n^zL|jrScfw^ctsEPXOkJ1Y8+^)Q)Zf=4C_} zuW|g%1I7_>W%PQW5dr3(3AjYg8aw�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

      tc|yq2KMFFnwm&kQ8Xfn=V1{LqyN%1RjTb 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 NLVY5L;p)<~{|C2TfMx&y diff --git a/import/DirectX8/lib/d3dx8.lib b/import/DirectX8/lib/d3dx8.lib deleted file mode 100644 index 79ffe8e7295ca3eb2e025cf938bbb5b9d8bd8d6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2150226 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 zou�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�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 z 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

      O2k(>%pw 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 UasMm? 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

      0;m!|k3_fwktCKR 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 diff --git a/import/DirectX8/lib/d3dx8d.lib b/import/DirectX8/lib/d3dx8d.lib deleted file mode 100644 index e8a193475b0b57d0417219426d61e9e93b10b093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53414 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 z 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%0A(Z1lyEMy)Mc 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�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℘32D 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

      mRqn0qt=aPW?A#6F)e>u7;_d9LcRZl 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⩔>6 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

      #X>=zmOzml^_u-?0 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�{Jz@gi>EB&k2d4V)zLB5vR$i5GDL zCrP}B8#qZlUv6-cdcNG?B=vl`F<(;8R{%IkJzsI)B=vm7fs@qpCBRAQ`NG%U{=FaK z22N7XmjEZJ=ZiQ=JzvC0>iH7jB=vj=a8mstZr~*KdEq<9fGa1wgHh?CIsMV!?6A#UI#^n4K~q3272lhE@e!Aa=( zB2Gfj7jaVOnYe+I(DOx{gq|-6PD0O@q&=wTOYK2DUuqBP`BHmO&zIVRdcGv>K|NoR z_Mo0GwFmWlsXeIYOYK2DUuqBP`I58;^?XU%gL=Ny9@O)t_Mo0GwFmWlsXeIYOVS?H z^Cf8y>iJT8P|ugzgL=Ny9@O(CXbco7e3F; z!}WZrJ*ekP?Lj?Xg7%=EFF|`y&lkSln1}2660`^Pe5pOC=SyTVYVxo|dE|_mMZ9l4 zF)UGJh)if*j;o#~CoAs?lTV@x#Z^f<*>d;8>z2PQjZHi3zNgKz2-$tvME(0HM@#xT z?e4Rc_>a7KWaQbZY{|mi?8c4|xhj5_HPM}g-)+;q{)HsivxFtEh<}{u?iVu;?%8h0f$KA6UCJmFV3tYEuB&url z#I>u7d#sZ`*Lr5++Qmf|dBTsMVgXh2$ZfGjd4ZFR6+0Lr7nNPXB3rJqy5RkWG)Tne zBuZ&jz_s|iz`DLXL|uEQz3mx4KA0u-%_A4}<-F6{(^kgaA#%yNo$S@-V%A!Gyo1hX zVsir)cy{9BT{m^C)jT4h`gkW+yy`)(J=AmRJ$mh?o>TA9Yd7_rdXHWQQqQUP=yf3V zoO+M`3hFcU8~wGZ&(v@9*QP#GztLYW^_lvO{>D+Cso&_YpgvQ-(O*G*rhcQpHuahM zjsDuyXX-cl>!m(ZztLYweWre+zk>Qq{YHOn>NE8l{k5sj)Nl0HOMRw(qrZ~+O#McG z1@)Qwjs6PiGxZz&wW-h4Z}eAPOZ`TFCH0y5js6PiGxZz&71U?yH~MQ+pQ+#Iua`bv z>Nol;_1X5Ize1mFH~K5|*>hmnnU!l*ljs6OKo^ABk*5}!a z{;Ky&{YHPKKFNonU z`b_;se^sxj-{`N<=b8Ge`b_;se{Fr91^TP{O#McG)wR@b^jGNfO#QX>c^2ret5{rhTE$vzPXTKF?}j=<_USU+D8})4tH> z*`|G=&$E~Ig+9-M_Juyrg7$?z&o=D~eV%RF7j!N4oA!l1&w}=aKF>Do3w@q#+86pf zdudT>DRJi_EDB?TPqo!btju06UbdR z(#V@fkFl$>dh$NjVLSV+Q%u%K@1AL9lZ@5pjry1NEEwV^J2r9i>1)eaC4ZEVenZ^6 z?5$5$T=F7v=`oA@_)THQ7iN^ZZdT(z_**vcQ=B;Xq(1LGCKFFMc&hy^Q$wD`uUKr$ zdO2AtBaG9znrQV6wEsl#b?e{9Eo*Wj0N>ByCC-iWHXFY*?$GB5o^94euTShMZ|t22 zd>?4D*E=_j9eg5!-%cM8clFp|@1NKB`m7lo_hxZrUOc=IuiSN%cW5_1{=SWyPnB(v;YW1^?o z%?3PR>CCuF>xS}OVhlUqDazX<(LkPK*(!EKY38%Mm%KC~t9A6-DHfbyUR+5T!Fv}jXa9YEhd1tB z1mFF3YCy%+JM8l*B6z!1`2&6q7$VjVAI3{{@`*j!Fu9EA-GYY%U5E|X-$72P^ohM3 zb~>QZVVs@vrL1k2{R2N2oEVpFdS71srVwjttoAO?Fc3cvvPzu4y4tqV4B&jzYH{gq z2QlexFP{8Hl(<>(yXfDc4!{4|E9#Z4C#!}&W39TM7A@EIl6x|_tzSJ)i4l+T$DMIy z<5jKt^7!t$-fP|cc>nfp`F=+u`%dc;e9lX^thp(T@XKA0$Aoe@s>@PwH$h5%*jrQ1 z*!N2u*uI+m$=6WUWtnB^)@7`yZw=(y1nC1`R>>(sjWGHCRT6ht!tmI$eQuEi*jh)}8a@eGnn@=JaEww`)#PVKn7J-jnL=Y(;XO6^37^-j;EaFRhK`l^uG&Z0 z+>L2?@oH{fCXZktlZx^?^9%4S|KxHvIp5d&`fCJlJaJQC+x`>1g}&f>Fv1f!d(?XG z>h}?RMW<%&^xw9rv%aoRI#0iGt-QL=SbSsH$ ze5W41-_%Lw^&cu^ic{>^iu&??*QX-+tz)eGUuEQ`l{Oo&KC>J%#4WFfZD+6h zd=+)`G?G_Nu4Cs@-W0xY$unElyNfn+$+gYf$ZdXw+*Jc!h(8NE%jIJ|){2px<(dn9#j&v` zMK}M3G9bkx(W5}TIN&KOcg)Ty7oONJl6$k@^C`C+T6dF(H@=CngB!_-o;9Kee<(J$ zX(OZRjS+9sW{@ejrWU(LHjp#%djk6Bn<3u6tS3vB{w&^HJt>;7TGH5bT~x!@2=Mc^ za@Eg0;?=M8a>Y51T-{}tc)zC@KHn}RLvDSE-TSGDC*(UmkIbjO5&&IhkcFSWhN=X7DLR4ziBlYsh{1pRt$+Uzq;`E;~jE7U7qkm#XWQBbv@* z3HvAE$4cUL7UR3{0gc--bHYjSwP|x6kSrd*&*G@a(YY$0l`ScMW_m@5Hbr^VgrfZE z;4LC~Y%)HuWG(J0vRVZCzF>nEHRQMbyy8*cOycFXQGCs^$yS@DyG8V|emvFBjdAe_ z%F8AR%kmOCYQ|;c-6Xy4c|IQDVY*IVBdz#0r&9N@(`^;4e zCgZz4HskoYN%3?pzHg8^h@XnPDNe0C$3pHm;Mudj5Wy|>u#`TH`Hm;?qHU%FEai?C zd{~NkV({j-tm%`;ET=|=0)?Ld~`;t1ZNQXbEmGKU%R|Lo>@x zvL^3UHiiX0eJsv~H0B2qX6K{Yj~6vYROVYV7w6L+oU|KUa`UYXGw~+px7wx8HQ+6$ zTwwj%hKi#bI`S!d49LC~Jhpvh&4$vuuA=mZ8Bn+25_|@R8lV ziJAEX%haMP&*PdYhI)6hb7R_apD_zX{nF>yrah(bdr^|h>nT35DWl%9nJ+8J?jv8b z=WExojHg0n#W7Rty&02o-z&lLW$=3U{0_}{(a=;f_rX-|oO?t0`js2S%FqXKUABbq z9G~`!VE0t-r1)z5u{WQ*(58?#Thj!*l58#CM~@2ZK4vCcQMsY)RzIOUv+W1l5LQ)w zY1`?81_?C2=I!Yxx4V7chm7b_5Gq;mDaq_t-r*Rly`)GxzfDopTu%^)t}-~ zpZECME|-Ney%8-Vi?S=ex5f9uon`vZTiL=bFGU*`Bx5sX;Z6I^5R*$)!Ph#9@jK@) z+q;%|u}pKBXv13Uzc;MJ z{3deatm|S{lOybTi6A+l%?+_B`5yMY1HR9bI9goZbCeCp+)C~qIaLgHe_*@YG{^5} zN-DlS>ctz!NzwWIYH{Itb6&0CLy>WQ9$7GZVLqkpC6RSk1L=F|A*(#*nBc)d@|=uk z^Os*0-~7tSy8{#Qk##N9bqrs9>fb)Oeg!ZPo5)h3iBnL$+RyYTEng5!gaYR zzSet^-Pk!s9KO_#S4lLKZ9O>B^L>9fAM^Z#eZ44t7AQU?UtFh<-18H!nL2t{+-q1u zzAKlJ*X~w8Hr@DJ*vGqwd1Z?5`rRw=v-f>Ora$fZyR|P_pLUsS_e^{~I||>s?dr?o z_W5!1aCv$3`$YD3`d;^_cSB@`k1O%Iiw&aEhla;vdU65(|Ffff_07RD<7Bfvu^&i(rWrETpn*X z3$IBSD6XXs;p-0dV5!&rV5us$;FZJb#_c&eieLMZhgt12h~bzwJMfzD|4~nP(wF2x z%lu{eZCrd$Y4BMg!SZs==WJdnE?pnKvTCJE^XXsK+MQNa;K3CbOI|0GS1dV`ZLSid~jlU`K=!xm1+!rJ|s{k`ns1*c-xit$}&!bd~br^lQw{7%07%W`?5-$ z3~JAJY?aJ&bH7Lz+MZ|3yOBi>pT)ACZZFc;=_ga}n!rA=yR3Ok8`&rEFe~x+5xjFm zZSn4FV$oq%M_zBnb5>(lP4Q||Vea=QfX|H&6Xn|H;U}7T@T^Pc$#!ZTd(d`(49veL zu*NPo|CPy4PVe5xyI^<(-#%hAzSqw1gNC(vTv%>iBRniHGT#n%pnZRSCUG|Vz|hvL z*4^Pe#mH8IXD`TS{Rot&dZrOcH@C&>nLdg18Jfnr??vz_BTQ>qnVM{JOkqCcdjK!H zVlu;j3&p+PJA@Zn-+}!Z+)h~G1NpHu@uI9~!vEfJLG;-*M65a(!rP6XA|70rXtgU5 z!5=1YTl=nL<(IyiJX-=EoTr?;b$%PK-7Ld<*Zjsl((mHSS5*D%8-9;~in-UHWXsd^ z<{x{F_OyOIgr83_iREdX+0*4zb6&Y-3i*C$zqotfYV+E4bIGb(eg~f49mWscOe%6u zs_ZT_37;=|{P>Ty!QLxv53<0#z4>41-dO{`^yPbgPh`X1jbo`cHsl$HrI5$$mdxi? z72Z26mmF6wh!wj#h)+n7Ol;mcp6z>Ej;Cwl$7{ST%gWx|#2%IF&AY#A!Inlf<-1Z( zVoQx5EV5D{&lj6QW;}nH+0FfUs`y;;bl6Gu&}z;5ZcZlREB;|~ALir7@ZU1oj_zSQ z%qeW4yEhLFoyXEXFV1ron8fzgD8)ZE%*sDsN+HL;&&+e+cPA%&m`g6Xh_991DZ|qw zPcDAl@#iNWCg!X9_~EsFE?(rBo2@U^n-5C0o0X1!&u&(j#L6XY!Os`Dj@JvMkeTZS z@I<$cvua0j$@b^{_=EjFS=|@O#L$ned9&3A*_%#&eC=>wey6}r>tgoae8ui~mZ0@u zwh%sX#rp9yMLXjAUn%6NVh#DJF%8(7QMu&8oK^YEvt!tXF3H3XYcL-j-jI3f`|;@| z$`U6p@gi>EIT;6>cPDVBH#EZCrlO$fm4V)zLB5vR$i5GDLCqcZ38#qbgMclv%uNz1qi5oac z;ziuRNfIyO22PTA5jSuW#EZCrlO$fm4V>`(uN0EFfs-U�{Jz@gi>EB#9Ss11F*9 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%0DA((Xh4O!rwF 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 z zk$HaW1+|?(C%23Z3u>^u7LoeLh!@)R0GnHOb=y-Ysn{14Jj=Atqy6XHp4dPEqbbL# za4Ss}q_fwbh<j}3!#1{E$wEwXE)G&uN_lJ@E%bFr8 zG%WTnDoB+sj1*a+?%%(xAX$CL8fdz753mi`{b}W;E!@@FJ3~z(EMVZ_*eG1tdco2( zivEitDAxX@$cqS~-vNg+UmMtwmapKmk%^PR7G_RkS=mX}0 zw#q2oUbNxF`qr-cEmQ!#rDXYAIzj6EK`u5Jv?e$P?+|*LPv1H@+x%KU( z^-fE7`-Zc{YbKDnYE(Y*iDw>Mi|?OA^XW+ws+u=I)o|OUu0+AAssD?;H-XRUsQSm} zc@jbzLheHdYgwMsP@b@6p)6hGVF_DVQXqx2(1axvEK3T3(pr_4M#UIKZQZNrYire4 zU##ov>k??Cs~YQ4=%RGfs_09t*4_TU-!n7!&b`k~2>QOi-{=4N{O;#-=bkxp=FFKh zXU@!>yG(j{3(DAfGkzJHp1X5<%U1mV6;!v3!9I0MIF77-T{05&lh}aj)r?!BrPAVZUL4}47&gi+v!PFY3W&QS^;UEFp z_P%&#RgE?Uws)P{j`qInGkDCe?;UdXIN;*U9pU>Klp4Rs!2;^iInptE9Hdd>C|&kn z+~eT75~omr;1|2cK@44|EZCUE4{|w-GnOu9kAuD*a|DOfmvjM2H325wWo_6#{rznI zMC{%L)1m+CKzB9hcu?hWdl#_p@%84%4IP_J_AZE&dj$AosZu`&-5n?wpGC!%yB>7+ zfo|Gc0O073UlY;>4#dJG=k*es!ov;~+e;2i*hUm+Yq9NcSJ0`~6w?(e7UZUEy1mdIbCiVBs^Js%vsP zI#?c)MDPl=pz{_*wX+LH9Gmue=9-*MROd&^>t; zep%36Jrn_s@jdY4lK+Q5_uI4Zs|4L24Zq4B_^krnIIJlq-v$6jclv8W+8aPO746{H<4>SlaTb2m-^%k5 z;8@rLKkDxQ=r%|BIfE8?@bShIh9Bc{#Ec93VfO>E1INwaw+!VL;6Xy1-ERQhdq?6^ zLsKpXw>ZCc2y}nIbEuz!?&c4Y-;7v(he6kt#v{ywTD0!?(LlzI!7nmF_sEC1bUZhf z-%;=zTaInp&%&<`bUz=f)b~KQ_9L{bnpl3vKsRliQqP@*U%D^aHv_rej`8Cz=upj$ z<@Y;Ob0`{lu$d=xXZKkw0T*Gs8xOj&kKs@6_y{1bJ)Q!;#Z&Rv?wvjB?-2Nn#S^n7 zp!)#$jlj#ear~YJn=jA6-0@vK^E(2;-#rtr{edoXn6Lkq#q#?u*vy6zt~%5+KMc64 zPQ0 zv@6jbhF`bs0lLjA&>oY|8M%luXOF%Xy**TocYy zS0iwaYzp(;7`p5=4iUia=nnUi4)08dj_&w1#nDCf*182gtusQ`)81MuTbeg+UB4|| zyJ;)8C`qrbo?Mx(#D;EF)6$c!+`AFs#`L5``W{ghOqR+$;yk%WTqF00`o<6&YW9wB z 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 TcEA-YdW>FDA_q~Sk>vje$l^s{ diff --git a/import/DirectX8/lib/d3dxd.lib b/import/DirectX8/lib/d3dxd.lib deleted file mode 100644 index 752d419083d05d157a1095890251baf8387c424e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 615396 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 gm|i6=VJjF!0T#<=UfFbx)0 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

      jX?g4J`}2s_>T>&X1P&~KFea%zk67W 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 z z7am+wn$hrmQXBH0hIiW7>>^Fi17AZ!{&T}WA1r-c1?4;axkmhUFWpJ*6m6fscGWlH zPb%!z7CYkp7D)~&Y{XxFt;+j6m6m5|uybQRII3l*9X%=kxO;YE{_Nswrv{A2{WWr> zM^R(mS$lS_$qicnPlts!;jQkp+IOrmO~0;ZP7{9R7dKnU2HJn6N0O#|oAp*{86Rl< z9u*zil<&^fyuEE7ZGTgG8=CT6&xb3!OvC!1KjUD-@s9^CtN7^x=3l?j(VgRu9iAS% zY!;OZ@V}Dei+=C$KIH^0-}CL}as0J2+?#z^cB^#0yO&3V(4 z68n!GssGVD*Mcu;wP^0`H8j4dlAsp6n`@nMf;IB`(>|FkcwOkoHfGbY{_AV`t!crx z&Qo{ltH%8@{XqXKE%?S2raE=^qU~E9Kw9z@*DpS<)?@w98@f8TD}SuJXhoX zwce{oJzHMacU5@CaU37@OG1Ne`MslSI<~ov{g2)>JkypRJ2bCp*J3B+9ed{3@&h_o zIn<@L1Mp;S#93Ru{ejN?KFMhPF^eL0{HVU&M>Msrg!-CjXFI<4p}qSa+td86>D9-M ze-&}y>7-zq-X?t}g1oVznq^H|f9LkyWye<-mw2>Q4NM=Y+5eFpZ(Ym3xcMMj|834! zt1CQT(7yG`<1P1r{Pg*PIzp!#apO~V<9;3KaY3jf>=G6)yj{~CdCUA?>j-}}GKpNd zAJ03Ii$*RC#||)&u2kmr833i3c{Oq8Jhg=<1B!Tk@HQlD|Y$Y)*uwU*#=NLR=AL@nf7 z--xLtOxwGma^H{da)Cd0qg^fG)vW0&9GZHdJo9F0P2rr=#j%49I3nNp)|r~ZtI;_x zc3i~$CNlZf#+pJUp*Vl>m0;u@3$kho+iH3Y^a{iM7;?HGtftT+BWCc`Uupcx!lpHa zRoN5l+XiqbuX6iE4Z-p6UZY0DG)8{SZJ~znq_OYFLoq(c``!7qhS0s)jWtvI()8T8 z6H`N|RjtG2mo)-WuD#o?hH%^O!}MQT()h02tyV)Qdf(!C>G~j)r`#*3F3fR!YE?Lz z+TY~<#_Gc6Uh`kvR8srQx}Q~D=oxJ@=#7@f*YZJFb)kCAofQv`D@J>4dC;`Fa4_## zf#M|fFM0UFM(F;B`|}Z9+GF@99||^tWWW7qGaqWtUXOmY5q?{Jsbhn>v_5Qpq_PoC zRs4HhP82P#&X0K;!A|$!!{*IS=wEnT%|@s&s_Q3>2i2dDFH{qbSG9a*{(Co+PrVpZ zO_+Ww#QIb)wQu&N(yD^jKFL_;I<)>}UtU^OSlx1h)91jCnBJ*Z_^QIl39b>xf2I4I z6Rs9m3(ZD2xz#%J9_4MWEwvU3cZ?f3W+Ih0xz1Y)fz1b}Sb4+!1voIcQBXyg(57Jj zhM8f=f4Y%XMR2y}mU}Fv{G*#qs|ZUMu5aIc64gI@OQE#^toSPAsl?Tydd=xEg!oF zSr)?hBi(k*&7}D&deGEDxO{%y;Re4q!ti%IgxZ=}*tlI%l}^aJKgy~kge*RiKCoT@ z@*f^Gtt8CvHScDXz107%$3jKHWUFsQLpn{r`tO*E!o&DwuODot@wItUYA(#_U}sTp zKW%@7PnMbsY3FLZFE~g2&wR?83my$-L~K|^`xD8t0yE*p^rbDUnd5#odHO8NOsLv@ z=1tRct&kt^oHr9jpZ#O_Z*esLrY{OA2sypUgPiw(?D9@b6%Aa;ckm23gKi644*4mN`x+xZw&$#iFV} z(--wD>vP^s&tCq8AE`b3p9`PzdYsuZ#3P!v?|aYrPkFU!FL7wK)fB@!`XcLN-mawI zE}x2~^=D0y@F6dH{_?{|=h5~t?q%uwJZ<(b6(o;n{C$e~_j&bR{q|eV8CpMEzRG%+ zH=%G+{H0ek{HL#kw|PSg&RMscNA0_=r1VYRkxJUim!oL;CcWn0v=D;v{IA0=zq<7{$<{qeG}W*SmF5qar=-}l(**I z<0+OO9FR|ao%JGb)Q!C8z8tkzy*F9U^YRa#JF#FV&5zC7(x-W2#xE>Q-9_v7ySG_S z@=|WP+kAAP;hlX~`Z%xE^2w_oq|o%|yw7@+H~+!CMMc+WeMtIH`XI0Saaz2z6Djy?bv>;fWYY2=UrJBp6_52xi;AHAk^W2R zk-WX{?u@@JqxRt7*Mag@*9g2~NTm6L?!&n^vKBVw10sl ze0}Qd+8URib%=l7TQ+C)!J*#q+orS$4BswP@=iQ znrWW5-rQ_GB(;dQ^W1!=V8+zkqYHKQ0)8ptOUG^Lo;N}2Iri1zb5ga7V&9eck0||lI^+t+=cc}?-ub9!~bek*F)mj z@WPjk2_K92;rl`lJzF>=w`czvXH9CpJ^18{Fcl%_I&i#AZ zRQLCjU-Cn$%{|w`W=5{=gz8EE6)*XFNx{QI`cL=FA7D1FaPLdL(i^7^6C&s5{;@mB z<(K@Iyr*nAQJO6AY<%@o^YCXc`6)Yxo6akkk$Y)s+{7*wi}~5(x{cNyndUj?#>g4L zO^f+wt7gw0wRViBdz?-=%)OXbn;+RRYSVmAe)X2H(>;s%l_e#4(fcQR-W+j99x$Ys zzxr4*-*w*@&(ZO(Zx@U!=0{rdQ$0c!yuc>*^@!%`|VC#XM-jy!NZSGbhWc96A{N5!+)h(}0_H3kIXBP0`760meulFs^ z&dqJ(^tPE*of1BCrgJ03t3kPQ*Mwhv?NY+e8ya)>=8@64j+3OZ7NI5l8T|{hVGDyi zdy~e`d62yWy3bzZdDe6P_T>{w_@cP%9V_;0Ja1jNT-0Vo3EwO4+^e_~^F3R& z>3H#)P{QBweY$b3-$+mEo1f=zxlzKqW)9B1{&b$_?+%O8x4bXm@AmF{-g4{gT;GH< z%dgdW%|D;DPcc6I*W58-i+iCm_E1K%z?*O_I%ARxc}_MqNHiL*II4w z7^njIti~n|d*^$8J~B7I#AP>6zu^OK^;+nAXIAd`Xpc>!TE5}u zY?F-IKXz6wckrZJSHCxW`$>y+ofCk>=JH zmkV5EU`7Q+L&L=0$Rg1a2LhBqOtB$!kQA(4HI}V?3h(u$1s%FGEtl(*we3sK+HS7( zJnq)B+ivArk%FUuX1;Gxx`wS=m%Ub)1cQv+|Mz$9fY|Q-=kuAl=bqQ!Ip=qN=l6Eb z{Q1+~+}}53SIyb;!zSPJCH-}JZ*FhGQ`79(4Nbzz3#xd1U+xP}G(0u`NA*oY{VPTP zo!gh|{OjsRKHj;t>EOe2J=)5?+>?*qSyrC5wJEpa?0rA*_T}C-&N6EEnqOxB#H_7N z+}@Xa#|zw7>yvymtU$*q+{=M6efeC$ zuRg8{<-XH<>Q|xG-!#3jrt#yp#!&8@w`wo#d;W#&(=XjR_aCo?a&KJtl;>jC&$G7_ zyftpd(NOO1|K2sD@~@9I-L*dHg+E*j6it=E=JL+++UhYL_R! z*z``!p~o)1)So-!^CQo`xAxhlt=&7Ge0G0-?w)TRf4#7_HXAbcgzu~Uxj$O;`G!Mj z8?smbqvFSFY?pIq{57RwLHSRcGN<2r;a3@#b6>sdOx=o%pJ!K0yXVi=rI&Nh<_Ftmmh z^N}y3()+!pIpzNd)RYh8{{7K+-u?9PZB6ql2fkUic_4SrYfCoWw@hrhH+p-<>#q#t z-hRuHgp=W4H=Sr%xOMX3fn49Or$2El=gI8Y$saA>_su|V&9)!r9=h`Drfv88|Msg1 z;oQF!x#iW4`s^o;=__B&3+Ik%l{)Ws{VIFm@v_@5J{-pSD$qH=HBTsS8}&K zv2otrP1~Bjk>mNF+;Js$z5m6>e_Zrp(@$O=IFr2WN^bPs%RjPw`DFGlrGw-C?!A($ ze)^@-GWppi|BTbt&wqC%cg9CM~5Pu=$Gri%|hJ-z7YVD6Ux8~x^`pKfcq>4As7 zy6*B|?(4f=eyXSK#q3|a^TWH-r|G%#o{r!9%J!dT=ed5ge4Sg*ZQR~5{oKhHvJ>}g z`@btc)^lTLMIRgU?u$(wTYp{O^1piSRd*nOkGmN6ci>yF z`un&Ogif`ZaCUaxaQHslBTmt!_|xd2$b203#$QjH?iC+lb=)h`zm1@t$7cRI%_z!@MR0p0lCX_Xy4DJKRA0n(W z?nx=E!EF|3aY>a}vo;b}wt5xL85=K4a0Hz~#W+h(`AYHsUF`XgfV)F}K;=xxZ$duG zL+PeFrn9$&`Wd{eMZ+Y0yGdKKFvnBaPeF=m8KWo{K!d-ty}xh?T_LAo$0ew zxln(h2$yb^ddf0;1O9g0!|AT#kWCi5W%0Z$sKOLJr?BGlQKq|%mM#l-1+AA zR3#?T3oE22%|=S5K0m9DSK4IPnRneUS8jY~DKh@uC z_pd-rfu9jnT9Uh}8~ICRS6Drc9LmzLwBM$JZOMt2<3{U3XU} zMoWnf{OlO+F-UE@)si%>mxI*RS2K*QZys@xD=^hH&tO$mkt+MOF+IywdVU!3A>oVhY;c(x!AbO~4xZs+) zW*Y9A-8Tj6fk9SQZN}I-+{0kH)n8btqmH2%jC;sbrluoyXh0r8g{A6w)Q5aPLCqZ~ zGHbc^JffOKQB3D59Vr^t1uv=q6nLmMyGsoIzbervIEU5~~| zt9wlOjb;qSyHcHM64CgXJg18XTHCkW4lJX!!q!0KQMC*pM6lIBR2}F#gs2q=OZ$_v z#Ph?%vSI8Gv$SZuBbutM`X!6$ zq2MYO>_QNUpRslds%~bHrzl;;qAXPpQt%}f+{5xDD{U()mmdsvWzZVRv1t~wMTkL9}MYE|ix@A2qKX{cXW z?2zMcyI?UZh1`zW^z`s@QZ@zF+3G*nu^Gv;GVm((TLfGE5tDZ)qNS6!?%OdFNtt?? zo^%^3TT?%~_yO^Hr6}9lUY|vm5sG8%f5}hIi36?+*XP7x(F;*>-FfXM>1`iCN?7+z zW^>ltAq2GqX`_&^?lXE<@oxWFv+O!wrv49ZU@iAIi&L(4dNMBhtWHrEgYd8}s|OhJ z%5`D&4czq!dcap-r+$P*TdpVF47hfzO0b&M$8EThmBYZPe?bz<#jAg!T$3{*&}Zf0SN-8-T_y!7O@|kh%;{eVs#n5%~cEIuM1-+8CuU1;jAUtuCU3 zH7TZYrA=C6Gp(!)V*8LT*p#Kbr%b7{+5cGQ@asySyp+c(lEttXliA$WiP0}rDiYW9 z&9m9e0No!UVR~Fjp&+#;?cPjHZw05hrd#y!jRh+kgc(p6vD92m6 zESFwU4oT;%mtMYQ9%r_iUA%&|Dmukb&3yksA+A(y0f3;hq9E0UOhT;Ent7s645feL z(M4Wg>rfBiW>fS`3hBZqRE!#&t!rmW3vH=NTe>T(<=OXGO5JJ$z(O9->vSEB%u8PE zZ$@tb_2w8rP2^S)!~R~oKcA5;$MThx2ZN}BwP(}1)$b(|AYxowR4OJFckh{kZmcWE z&{zF<3_;=uR_7tgMqjlJbpg2G;gKH#}WZjU+@f0Y2}Fb3jmC7!xK%QZ^sj~8$5jk*)>UTizJp`?fb z=}tqy6L59Ab+Ox{c8q0(F(M2*QbEK#iU`tqzAWHML>>oixoxfsb1^K8zvxtd3y=xr zdXNLGbz-F$v)cr+p+!4e>tdAF9h6edxz$<7Ph0d3_n^frPOj!W z@+?YIQ?5yfs-C#4GMIVdZ3n2L7PXyn%QlPDk}B=v>if6;)?%*xCz4ZsV;01cY80V3Q^w6 zvEm<4l=H69O_{nk3w#Ta)W*@n$!-k@2Wg>yuu|=wvjyov#CEJhd_QT_<{j_~x@jpib&Px7 zlZ=f4SelfI{bD=q7tS_$)(WHxG2YoGr9-qRX9KRV8*3tzc~Cj2j=`<~ssb*j<#UU* z)vX?y2J8;es?bG7u5Y9K0oy%P1O?844FS(qUR1t=b`Cj*b`kY~G+N--H8Vh~mSANX zdntM_uBrg9Zapa(FyTEKWQWs_vEQT=#2wyV@R@~DEc!7|+1o{k+PeZjna$3l%Eh(g zfwwc21dv*beq3thoP9N4(oVW34|$Z zgJ^Y66*b+egwS|Qr13V+IaqUX_al@n{HNrVm4L)%5))|<+8BU@n`)4@=wP*}nz$jG zdQXHjBf`ugrVmA!DUUk&>MJ5tLK>pvz?1q5HdKgZO6bz;OgumoLWs_jLSt$!wscyZ zTPZ?z@pk_f${0_anADG9x*xCpgJQgt!+}B|A|Da;m%{+h?t2hnFW6v)YXN@`zy*~w zunki(wmPbO&uinsk-kSsmtI-(%F9Nsz>5?SaGM)>l2Q88_W_jbb+<%PN5ofK1KXnB zM&_!WsHjxEABcrcDZ!D2u{C3Z^gfS11RgUtI`VucP-knPfKQQ{tx{*$kVQ^aN0;x} zf@+k@*u#TsUQxOu?JJklTkmVU4+79ZF{HE`n|wRlwJ|KIXe zj#RTrp-QSAM4|gHy{vA<@&xc;pc)8PrR6HL)uzDG@crqn?vm;rJ;?z~!3s&lBk+of z-m`VIoy|(fEW~4QZ;i}|IHigvLmh`)+aCk|V*4O8HF!u^xqv~y0L=aNmv%s^e>)Yw zo~+Tr=)lZ8sRa`8TNL9wQlka9ya4BCZ|!S2WU*u(^dE#&L?}_t`%l|_;}DbvqC}hY z5O2b2>Plb{z>7Wrv0Xs>z#{CmJ1D5+b5aO6^**Kj60Imn+wf~W=G<48gyzxq&3I2g zCf#U~T5b1=eM)S7|I^SEDYITif@o`tqNjxN+B)oONEwQ&r?~Ic_dh!#j+k$4aee zJpz2if&dDB7U16F&^CD8R1AHG|8%)Li8ytG0g@TFlI%7Gme52l44Qpha+*m((ju~BOMnykr6tB_zluqG>6>^C0YC^^4G@zT=L z^w!ejp***zv{Wugn~5^2Qxj$^Ri}Xka|X*1=@6!tmM$eOHx0S;kFZh_@ZwO%p$p~m ziZq9UFT}+Cs8L(uJRtDSAmd^0)sxy0$Exg}U11VN<;_kO2k56a{Xm`qo^sD*){HO? zqe_y1@~sjYmIjoLrFzm~sv)?tvSK+zBI!awl?el&K81255bzkht^i_o5Hr>mbu)f3 zRi;1#Wz!~lALL9Dueat!jZ)$%i`2~5w@{k1rRFox?f|wa(1ldAvIbkmJ)psDD6bTx z>~mATx#Qtnrh$Gq7_zWCK#1Xg^HCJ%DWniO}#B<;r8AZUW@~nDF74O;AEw31P6Ll zI(L15YggiA9{C%JxcM$%rE{?Mor=uU+o{umnH|zSx>)Q#-CD@ii&53R%d}BSu!#5x zsrg$}Oym(fiLMLd!P`Wdu}vdIffTaH_lVKn#ay0dmqJ!BWQ#doULs(zt4q{rTo95){$=&8%NL zQUR-QtJ*@_Y{vf)5$$O$K^X8Dy)!HZ9SaL)c}Ph=LkZ-3KWnkYY$2)|St$y#*PZ zS@=Pj>QAQ`(#wTxNjF21(=Fn-YK!_KL|0?wsjCri9)QG~Ql^$8T#nJ6$wpfoWzY~s z)hwA`mZ>ebqA{y?RR(ABe_1ZXE>*K{L4GX>5@w<_Ee(?hYDO|6)DuLsXiW~QAE0rV zw38Pm=<9g(3bx2K^=oW>1E6_wv|Px`g&cZEstOxa6-vAJoHg^bx8EYpS@S#IEX-62 z`7-66bf`l&-Bji#UBx9VQEcp>@OG5&HE*;_omb>S8}^FDwp8hTeI?3BYdDh}U8w{k zaQJ)0SdV%e&1Yp0`VUMq?cKy=R|b0v?^?q4LQiIp2Y;iO~p+3 zQ@Gc$(q=0~w%!&=$N+6{m_@r={V79E4EUsZ+C+*qiDP?PEJA`?-4ICIXBxQ3`zhAZh4D=uHlxr$i=WJnE0B(`)() zZM?ZmcnE{1+yh;zoS-aDP7f{c>+)i5Q+%1bR3$Tw?6PSY(tr-S92`Mu-Zv(!Hwp5!+)n|b!#6%W?1n~{LmI!4n#2Fs-A%&7qWmcVSr4UW?r$O(^GwPzn zO6{qDo~8)fJmajBu~S3M;f$wMfZ4H2)xZX&1&|D{0p%iA1QtRg7Q#-mTyeqfb0HHZ zvCbjag`mD?Ix33W$)GGND^WjVP&yQ=wH3g7?Y=(%HWUDN1zoya$J?Jeg&3tcoDRc= zUmd{z{S-UaPJ^XEcZD0rV$mZ>{kj+!l6oUt0g>t&L{9EiUb1{Yy| zb=0yf7cb7-K?_j(VOgNKrv$1NVverX8i!f|KB?b=!}VypNp-Rw^srpZQ5ea{6JRf~ zd1p_w`#!}YHI_5DDU+PTsvnmQ{q=uX>`*F4`@x2qvMR!Me**#$-GX#5wd)r~yeJIEIl3go^|s`R4@w8~w2fGf zqDMM6D19E54qEDuc#*1oe>bDp?P7LZyXKM9?+JxPLb{~J31cKRTD-CM03_b}gQh&> zy*sNSBql~Qf>3Vnh4pDF;=t9M&?XMWA7OdpsGy31Xk~t5%$%UzKN$Sgp8^MtwL z)!3VXRP9i_Ip41%h22EOm8eHKz#__z+2m!MoGdTnyk%NgPv|r_rl8Tr>NS6bf z%9VK1NGXZ+&XdBJ-nlkOh{*#IeWm3pGwZc9B~+c-@&)KV{x>y}SLW;nAvp!G)1r1ep}VXGEZF4G774V|4Zk@w)02rK%rm+1ZVaZK^UbEKh3o z>^p=pBO>BawM*N9DM-62g$|66Vlg~QI|e8s%a&qhnLMk0 zfKtOl1spVnNpKRFI|$4UfSFKzN2&U=$eZX4tTk7!@Tk6_ULe_{u8X{hDaPpNVpzQd z+!-Dp|2eGMm8I&h`mlvmE(e{6EK1A;**Zy)WXz(v0h_(FKao_uTwL?PAXMcDhKX)q zcGsdMyeZwP8&x4mEy9!Zs;!117J4wImP8-0w$<@~0v$m9cm|IHQoxU}-3rxnO4YrD z-Zb6i;;L&$8oC0v`UzCx$}#_ma;Piqz8x5>J>8fUAp-oQH7jPTml+g_q-E800 ztl6+Bl(^M1y%>OU>aR66I;ckziSj7j+E}I7(dgp!Vw?IGU@qhu)Kh0OZT_ONBG^0M zmItn?TlrX+B5meP;&teO%^a;wY_#f&zmyzJ)CG-htHGG2Vd(}`Ooenkwq%*hVXG%cAbLZ5XKYYJX~kG$S9AR zBsEoVN~#sIgUVwcETZknYWIsshUJg%dc+8DUEenX=B@`2@D_)?T_r}0rK^Zy25yBd z)aBq5mqW=56MgNp2W~gAaD5e>T{j>MYm9x*`vJ}yD9AsC99{90VRg5ui;L7T`Pw?V z?SX#+r>GNM=MaFwdt?ROU563r9atdT?j5KSQoRF@2pA9l3>2W44S$I@H4XMYg!Y& zXWyF#+XE}=R__EMhqzEKyL#%DwYg4F6WV=}`hc)ZQe%bv;L7@`k7yDG#!*OBD#Ck+ z^YNdx`^F*(i&HTxC7jg4%f*han-SHR7j9tnqX<QC%Z2RG6+5aWE3x*z3B& z+xMDay%a{jkiPHuaMw3b2~1tre<85_m@zb0i4!C3qRl(-Ff(6LYc!<1E*^&31x8Fc zGQiE4%AsBdTupAdxJggS2428WgH5ykb9BihjK!#m36a6klZudDPIZrQ_Kk?nW6|%? z;7=FhF}rXVdCQmyOxji8()V?}4TvNa$odYEel^POdkgIp*?rH`L#U*c?(0O^BER;Ow2%h5=!N^;WuP8F@$~e>S`SpBN3`J;9sa+XkZ#25!1G z0h%aZhY*XGbWnB8(Hpb~ad=C`fMOWnSP*D-2KjO!u{X$x_A*a(22#|1_{<@zRCmTC~aR`7sty48o%a9*=~9v1Van@}wxQSY1T8LFVJ-Bd0f)9kv~gRW7%2M}G3+2n)~ zaBVRf!^p7uU&i~&N;s-O5Pac1lR3G`WS)g@J-$u&9>DhszNe7JoKi^DvS1>k zC_;^)n_%t=aS{ClG=+JF6hvwXn^`O_EemA(Yr%|2xu$nXToY5l>jL}G4>?908z@Yy zwvak0dYN3945gA5ujI;`c=;Z=G8tmcn)<~y%jlKRK;{{$9c=NO$sD4&i2a z-Fyi&UK9V7v?kd^R+2Tm3F-*23B7s905_f`$Uyoda;&lc5heY-Wy+vvF3db34R)^2 ziYWEO>!en@^m(^4r}MJKygt56oj%0qis>GhHzJD4Y_M&_{*ry^P4vwqO!27urm{|n zufYlm6D&lE%x2ioUR92eNb!4RA55#BvTAGPuvV&IgjVW~-aH6^@orT=jrk<)pLxDC zm{>cW<R~ovTL~OHg z8My%GC&~w^$+%YY9@4qn{qgwCY;N#HT>uTqbGFv>G`ha=HMjcdJyp1?G_dqinSIwN zFoMpO^^?-u^OcV=IDsZsV0S7$7$oSSFi3M7nF;3j%H^a-C0GLf3-GcsT6TNzhDzPg zxH)fx^nyGD5n@4LJ;TW!qo}&@hHLUbM|?F;6?v9K@=ZlPY5xjZYg=5@94Y9>c^k;* zz|puRifV6YNJUFp3h4zMMp7yzp;Gu#yhMp6>U@({0Ddr(Uo$}pJ+MA;sFHSXOKPNw z>!r{`HDjgF6YCR(>S_0OrD~lcYS}a7k&{dcMLzSiG&oo$Px1lR#4&AA^d$PDClz2S zv~+3k%C*sX6rCsyhQ-9~$B_AI5i&e>JK3<=eYDLuFWG%1G=(R?3BTTn{a1KcYR;IO z(~Smdz6`ijHw;0MDTg8iS+B(&@*-AcR--(Lrp*4-7bxnj`wAP(ZiE8GUz6vD-S;Y9 z?7Q-HICONus(4L30o(m8=QzlvzYo074Imn=$|dcVMvoaTBR2wd-~;1qTb~HEUE^~d zNawfG>_A_#?%Tq`#%S2>PC}n21$j7>a5XK^MKYvriz2M1u~IuQRe?X9M_Gp7ue`!= z{S|G6F$-LtbKkliFsU1LAoW7voYH2b@Oe38G^x3$w5mTvC9IsBLltY$@+5j@HV>^C zEk27)laQeP9C_7u@B{Ub6*3)@`y}Rt0_Vu;E9ykxa(P=6xup<=v*Jfy=NvIUP-u2`2+^Ld+b}S!D379C_8hq54x|sx_o(qSL54mm3VF7(L2-qu z9!thnrJez6KwPig7r?+)J;EZ}B9THZtML{9G7YtYbk`UuSR3RzxgOJk!ovNSfv!KH zJS@l~oGnP&b*mj{lro(r?>4vkM{Lg4Hsu($^7IcI6B=wY3SmF)O>c9nHyhQ7f5M0W zMd5Q&f*1pK{~~lF%M}(1z~NzHqLjxtvKrFFLRi05o1)*P->o`~t)(2^`taC+$sk7A z%)!;@Gi4p8Y@$#Ha12TYUVR6&idnv}*)d;Lnt&WOIt+)jIpo@(=k32ijux$MZE}@> z!Evk4VF;XUP-?*@d6!BIWVsfDP&Mi!bi5T(f7U(XzU>5BX0OJZ{0i*3zu9`!j0D+Jk8=&a0zMlNt}#t!beYKNoEx{@uA&h zm+%IY=+@yfJE=^3)dnMC$IE!#PCvkpZ2cI1Ck2YbCDk@^03{FnBr1UD=wA4{iW3au zELStiTRbLJy9J0b3n5Osemk{`eB<CEc@5K`7?^Yq+ z$bi&47K)ch7qz@{Ww5V}DiX#}QN!uXh!MXsiavsbh2rJql_83xrXb&2kLYFNOfH=pTZyDi16ETCBqSo&oU}%?6#Gb_y@>6X~GGj`M6= zkmCtm+oDwbl5Cb2+)l{>n|C`E4cHpsv%MsZOLyDqFXKXcQ%$VYoCrsTe;R}oSO=wr zlJ6k9B3Rb+jW($@-14-pSY@*O|nY&lIoV(6io%?{YkaI5N#ktbuRPu}PuAQJ9I;jN~S-8HF zQ&#LQ7>pIC0)QzKw3NWTox>^HcJD`SBt}zWIS10Fl=8}Q4t6#x)NBuM%2Jzx-}`yF z6l#MoJV8dbT7j_zFg@C#wjx3~<%CvS?da={yUS@L4OwG*-&_Au2%3ht5xg zN+^|-$2sTYyy%n$Qui>J$1Crj{HpK6DFWbKWaY#u1k|0{#K6K%7XPLJEhRB{9|xGI zg$L<@iPWf3S-{JSc?>f2f)!vQdQ2kk{KW3_q6MgS0=DByIdb!4X+inL_~r5IT+E9P zHe$FMitU3f7{vyJ*G}`+*-c`Ca)^!TNe%GCPGDg+x&^xnVw1I7SSAOCbwsXm4)5(H2OkGpePaQVA6GiPa{D& zo)(2OiXd9YNssc0Y;~|TM4TMO%Q@6X=Dly!9#3luyPLB`oEa#P-Dm|83N=|aB&R(H zP_RcqF}^Y=8EcTO*hmGG*Hg7WAL}|I+L6|DW+w!V z^mYA8@CVIoIr}nbIb$KXLJ!D!yqt%rw6tLndF~ycnp>3M)EcW8)@0gdRP>11mDan5mXQZm~3&i%kS^)TK%&m@ole>arM)B(nqzj`Kd+R|bdo zl_S_agy^C1PPn?SEN1%(OZk_<#=e5_Ue9RmdLFeB*%cjDobVZj$7ry)Ct$m%Y^0%- zf6T^rA%1aMiEVHg*60Y09>lOlvtea4`p8~D?>+f7(daBTtVd{Ak%rE9j!4|d1tP<` zc*L-}9I{m|NDf2sbrro6QP~I*D7B22&UKe!j|OIXKx4{)o~eQCCm|Wt#Yso>lV6ej zQ;P@cVIgPso>Z~?w-X1U;5=`S^HVJm{ZO1!i$hZfLvW4M^QoFTasOq~E7BzKgh|Y5aiVBoF zr;0ssA1Y#xI9_?yhrvP`iP|lkk_Bi!61s>^{OhV+w6!2ppL#@mG|~!Ms7_s}RZ2gG z5s!KR=m31p*VKa>(Sul)auxD!XNQ=e+M$mjb``mWpITq@PnprGqQFIE1yup-qIc&OW=3#BJqX&Ur5{uD~*53#;x% zW$a%7j5XN{DgDgsf8* zauGHngm!r42~OU~p+V&dq8Elx3Lqm0doM2|LkVS&OZW&}l?KAbfesi5TQ}8P7l(mk z7^xgN`E{&Qxr)2t*xH5yVkwX%{wm(a{+KwjK$8LL;!egdo%|~HZqPSy@^SJgdC_R1 z1t5`PxAizJcSOy=YVRQ%Z(yStj-nHtlV}GP$Dl4JV>QGW$>4SoBlCf|+>o%~nKvV2 z*}RMlCNR-K3ZMqou#4}@BkLnHD^KE=8NXn-55vJho)=cu+LRyj(x5Ip6tJz6YM+53 z!{u2T_@P5z@(fo|i5lXXh0G1v$W^MoIFYn<98z(L_5^$3Q4Fq;1<&y6((5p_+%xh# z8_M!1fFxz+Gun32M47ad-I#ilmPD0T>!s>*M)?XBU4dRG{~(Vw_=GCADETRFB|q7% zJ{rlik0U2yj=61R9&~aa9D5m(+I9I-|MZ%RQfO?=Bq@}(KKZJ>KB#aXoI;)*BYw_@MgLJ6e z0=B^VwevvD*V80qGgkkz_R>41lycpuhgp|mfxzMuR9YWHgQl&LpgG?W^d5m)Ab z?Ja6RHV3w{ddH0PXdX?Kf8^X(^Us#gqm;Ao3MGF`>bsLULVL>A-j4$y{ZVk-fD>zW zfT~jL@ZFQL6Lj&e$f=7`c#$WHILvJl97O_OB#teu?$P+t>Tfk`X?3rjR0WPniIG#H zq2B*bK59(1GW-V7>{8}3s9c0mfwdW9xC}DqKeKQ*2m+478K-c>>oc3v+Xcr0fnOkw zbyLf3YT13YWyuyz%DMmG9XF!GYp*l9Yhyi?I^mq%!Y0D1n1cV#k#=O+oRMXrBKqw5 z-h$(p#A$Bzze&9S3H}ib1hH|38wi|tn=$2M7@`^25ew{K3c=wyz}i~7`rl7NZ^50Y zzR0aQQ9ZLI%!4u`87#VxmV(wEqhV*5a&3dLZZ(C}N7`g1CQy*Uc~h?_!T&Tm%Y%lY zhcTtpA$;3zkKNr}zKzTwu>)4%usRFMEH(-S@YEsI34Eg>qkw48 zB5|xS?ih0n!31b*%e5P>4goCnOT*gue>ct2A!v0Yhi6mJDl|mCgC1B1ao*e{SEw6f zu`9H?bcYt_T}{U+FA(|JP0YK$T^!weAW!78qB^ns1vnAt-fFATQaQCXJt!m>!H6Sf zz$}Ua&6>jq1H^@`MQOAzC6&N<+0I7kr8~VFT5Y z;N?i8&yI5w9GVqwo=VF*COE`Q-S@VMgXGXs#%RvwJA|8YJcbK?R~sI1>w?KN;5rW%JGdovLxZX(3A8-A zoqfU>7(P;rl{pTEvRQ;FaJL1_@ZL}o5g5;yQ|0 z-)R9SbT74>NOd^_>>skIEdu!53@hd~cRhxU3g5otDxf z6lt@)mz{#sd-(<-o}K(Hc8JrI7VVCFc4BxcCDeyJ2thY0!IyuW-hD(ZNl15td|l< zzEmEl+ji;IHrKWSpoB0bP^gcjnrwgZ)*k23>%~PlH1=7bU>CPWb{#=4p)FQJo$!DU zl0(ojvKbQVLBxs(#aJQ~8H(!|lq!9JA}+8bgWGiXHOB=8q%W}FhZ^T|I~^k5K)bg^ zi}p@2Nu%_6`O-eldA9ZltAS8en2uU9PtaZ>4O;6s<*a6{wk~&`tc#~2ygoM{mH_SV zAWXyx(ft7d*ETmyDv2`lxW%e8+}NwlWr*z|SJxyjTc5^C)J15n)s=_Qr@nI0R;n&1 zAH%NOY2&Nou{g`rOF@`eU^$sZ>sP#?8m_UOdQvT3jB60^vVm%>!|LzUKg3F|<2m7y zQr8Lp4d~A3jK@_!d04cnEz6bnwXx7Pk33iiU4ofTQ;T1esPBFOAh7*l9NT0wJQiJv z^6aZ)ZMbn#kF~kjG@M6;c|aO%0@${zXI+)0Av&B377hCkX|c`?osV3u{ucL7INR8T zCSozo+&0V{8X=X!Z1{#KcK<>0;(-CS2dyZ_;gLIPZbJgINm2UUP;i6SZyZ<14pm;n z44J!#F9p6qDE)JeaARY#(mv-CVKSY)oRE(-jI);z@&k(!NXKk#Z=8U*vv8WxZuZtD z!v*3-JS=m>>t`=Xwu%$r+06wunHyP~{po#BAwnScU|pIMHba?N7x5P9>KF90E`eA4DgNBcpJ&7(yYb4rhy?j;w%iw9`Kgdys?PZbA&7C*b9z}>sT){-7i9pvlbA=Zx|8k=fhTV?S^dO!$<&7Pm_dxN z_AN*!2$~0{RgK$7?$4Ul3_2l>Sp#%kQ{S(f*3W3bMJIXM>_9PJ0)GoHJmzE=LTLlC z!C_$5G319G3E(+fg{UkMJfX1wZpHMW5fEq(n7_ohX7Ofljm%pIH^5wk9~W#qcy=qn zzEy~CS6b<5J+9#(Fda*Uxx_|!j&~hDef*!tJK_$CJ$;vyZsdY9KT;fhpIeXDBsh_8 zJzryYBJaA`#py`6Zb@2V=4pg@glv7Ez#;7ulX6Ho340dWsoduBI-N@47VHqZHr{pb*Yuim7^11CcpgR@9Ms zn!G;VK}zJnO@O;AatFXit#CNSEk*m`%uLr3X(`lu+*_pH1-?mIeTrN~b*1h+?lFQn zwBnSQg2HaK9ac5$DW{x4yYC@ZaVIql_Ue=Y5zu=G1~OZai%4mykxa)Ij8Ri?%IiEC zQ`?c;>x$=u=~)#icHi50b=IZWpLrbtT};u%k`WceY9U9vJmmBF0f3-WuuIiG>U+fM?Z@R!he0P!F|0tmG0?sU8Z_fp zB%gw!r0I){SI2&1`p?J}P0A5CunicuIlXG!=Jb0lVF(>=0{wtr5|F`vT1?l)X7vC# z3pjGXvYe$9H~(wdHdi~L1hQgufTV{<0wlX2@`5z>!sUU@Z@|^;W}_(XSHEW06eVMg zpS`ZP?<~1H;sm=|1z^jyiAH_{%SKiSz}D$EcyqSeegC8}rF9xZ zQ!94T^F9x&dd(tDjx17WZZVE_ANf=;J#6-MxW~)5rDGOAHZF1# zPbo(+%!AiX5kqsF@HJMg7l@GA%hoKa>=nnC;wW*?hZv1=azPOuj$k(}MS_WzX#@%& zH+)AELCtA-(pca$0drKv+0zUAXh2<^+K-gF6z3oet2uM*f@&Y=&&#qg|Kz5W+LZ;;yzV zD1kkXyx7!u2ywWvk}h9}K^0(4M3;^EeD;Tg_-Swtr_8pcoY z704^rmU&v@h<2%~UTSv@Htz9j=+?6^#5vmA!NM|TLhHf(0G*a1?ZQ?0h;A*zQB(3@ zCKM=B$DF0E+q5F^uuv1<15=Tw(PH1#y&xj_HN*&a%%6*-S&fzjaL%B6GtyG$4;K_DrUwR+bP1+Y_@EqZBi`4Dc9>B_Tt3N(tC@T}` z+|SYUK3oKqm_YY`^umnFjJbwj$4;M%(}^2sbTl5CGftf7J1C54gtykAIUd}Ml9yLV zJTGn*tPG;x9XK;yO3gYjP~+{p_RTkDj1$H-#-Iyy7Bn{VVBj2rPtGd+8P;Gv#7%4X9w zAh$O<;2b%0KiK#=qeUJAFsH;UB*JZN_CzR)_i5am(KtGQTRKkQI}QtCsN+%jsE&Tb zKd-E8H1~EaC-Irxng9eTBexSE0m%$4%5iI}b8sE+4B4OD0Lm8e(Mg2skMx;U>gQ{2 zx%7&j_OsdFVAZz0LoPj17guAGI<3}roRxB4g#IKgP=w^Icpk><)(7#k1>e{4oqD`6 zx*?{q(A+TJ+*oKqwGHzvQma*JW0fBst~{{7G@O^^GE1!%sm($l{LgT%twx?g zTZU6m{tf_aZK%75F}eFV;gP?g89Ny&V}gdLD@ZjMt0?hGHmh zK)4e|s;qEi{L`+EfBcn8uY}R=u}f%0@B0{|>_rfD4b4ZtF(2tPA02=NIVkg16=5EM z41604ty7OT%(pH^#rM(3?HW-n!4*lrI!9kwq_5fNZyAwu>xg`S9=(gq)mK*OYnoB} zlMg_=8BqdtqJCgPchrvp!j5l`Fj zgn;lgk0*~OhbMRKycpxtiTYH0L-^WyM$Aj06}=xZ59}Si9We*!8}b-&*UTFn=CE$a z@I^aaRUYc4o#{<%bVKGPQj+)OGjkX-JK>%@Pz#7P4%xDsRt;TWfhdQ&da$Yp6|B-{ z5mH^f2PIWm#w(B6$YOT86PNf1HwR{}Q*3X@pbm18O{#qZ>Yp)H%*{kE(UUW{U}1xribeGIalHYyUpeo7Yh zd7S)1TlsQW#7gLTqgu#Sy+c==6oNMV%WXEj1??Ozz`7M_)$pHGGod1pKA>I3c>p&O z+3Y^LD7M;yq-08>c;mh-vLdCV6FcUZc!9qId0N zdA(qa)eoRVfWoUFEty>y;OwZgC_(qqGWDVNSWDoi1)f^i{HZn$j-+5+qUd%j(v8vZ zz(P;=9Woi)Ox3nLec+xh4F2c4hc77`+U9HuS z3Ym?El};>EC!;iauCy+PIsbqbk(eX4AIRs!j;J8Zywgw$+ND3zc(;zcNn^+;*68No z^ap!0a?mx&q<$c8o1;QS?>>vTtao3LFsU&wDti>1LW>!(BtkpxL?J|@ib;#)2W%zqr@JT754_(?3=|JSB9CW3S z4xkBn#%&rnn+wG~jYn%tyb=cmeUx^yv(6^QL7zEFjB1S;r6pIJNr}j-|8<^C7p35q z%b58203FcSpCqqt96+)L1avlfXCC@zX^2j*v*D^;obLLMCbfejZYw%`7>e}e!NALD z=%gvIDh=*AxPXx_RXV`=fm-l=`-oV8bs05x_Q%3;a6TnQl=x*_M;X+%e|LD|I+Rg+ znVW2j(wF%@_N9L5qE7y@M>AWYuB|^u4zps)H0C#Zk{)J}um2nsd&T{gE0>c|Zf020Tgw-g1dv#T;l7UOr3UIp5eteo>eCvk>nH)&Pe9#U;3y~Yralq!_?9a)T` zNERcd3WNbts;Dw10f>NbinDD~yjyW4tD+H?qQp}PC~}?eg=cHa*G5;VR6?z)J0`Qe+x3ZUj|H72uQ+LKl{8yb^}{g^1a)}|S%Y3NL@bE^lA zu>nVf-8Y7+70;KV|D=wB2pMUZhJnsh(C%mm?jxasa;k~663-yVzo@3NBaq=%pWO_y z2Wkdzct75f!bp^M|0R%!-;L|5{Y7ROLXK|4e0Ba(B6K@yTYWzaP=8)Bq^ zYdF9!)peSLm@?IbhRf;FZqg+*s~6v(N^!oQt{Rf--n>R>qg15A;205riAd0;IS{q6 zS2Lln4p+7;U_!8QzcQ?aqmcu;8V2Uyj3ij;q2Vf3dog=Vjq@f5Rcx8Mj+)kX%XGid zo3bnU->E)!vMmQ)c9f}w$ghiUs`pSirvKQfe)4BX&yhPLv>VFk7C?vkU>750XeA!! zL%5ji93cg(JDF*S5!<1(rbjKpnyG9FS^7GHBVU;)j!Q6cU`n(c4C0`t04H`XAE%nd zzEW^rWG2Ra)~{e2WyfCVwsF2XR?XN>0~w=ys*QH5U%^2|#_0_X7u_jVy7pb05)IGi zt3IQVqj1hkW$+vqN~?1`YBDIWVay5%bDiD7J(&k*7n#|8?e^zeoKbE-3~L2sn2_qh zQ0$;CID_KStO}bjA#2hSyb7b$?JCKeLM~LVOj2fd6wL+-S99vuAFw7^N#U%VY!t$^ zt(CA$YDmza%wV;N$?%8FaV~?MQkn3D`Unu;B@2ZArzU zgK%Eo$JZT%DZU*Vk)+p+Z69{`9`H9`zmADxH#b8u^BKKhSL!DuRnTqT*Q;JPtaL zA6HOyAQN~xPU*w(3zy@X<6V!zkOAwpA~qwRII*-86vIK}0^km5&|!uZD&d73$i8b> zFZUuKCA}O|oswSeJE~JgvWE3?D&R2Gr)UT&v&kL|)(WWhuuQ>;G9HTj5{JkZ$kUl? z;UG#XQ!TJ=CJRjS&-CI1FRY}bdq&TzvF*{>_3vfXb%@DiD)NlTz}y_>XX+lDsQr`_ zY}hc*Lt{J>|LahO!?Gi?g3QCU>%4mD56Fh?QFA~Qh`ae=!jR46?bu|H%To0?2KwEkW&_N}VQvk$c7tPXLWJUK3OuIweK_?} zI_`G}Z@&%8RB2y82nmM8q3gKs(_uDQk2){b+)bwTdzDZ3lCRNstDR`AQ2limgfDts z7onRxBSc}#&}KU?ttB;1Mm2}A3ImE2Xq2^rOZv~UJ2a=!T~>kOP)Qz;h_dWPmcZ)Q z7=4hKuG1t&b#;JtgDwd;8AU=6G)8XRy@>s|!@euVU8sJFaQS>(O{=uys-usEvn!Qg zWqQkUV)P&*<=DJo<|c??ErQ zGfczZPU+UxhEbJ4LqH)9A}t~UMdXi4wu(veAnPNp%K)0G$J;U2T_VPcbgtO>Y&g*Q z8pTy2E^>6w?w>?21D!Jdcj70+_j}ZDVdNzXCEXDA9%7u6*tx!kO6iXe;D`b-2-q71 zov>C=s{YT32)RNHf>S9B7deA95aO^X(S7!B6UIf<>Wiosv8dOrHX#gfQ5CHbn^+3R zI&ufXMV0fUpk4ZVH}HGJk$xEKT{hfUGF&}mCDsBk;F?ChZ&X}fPW6Vx>#wa7SII{z zeGoWfT#_hG$YM7I2%}5Y7yiz)o49oXBvQ+Q$fMnbGvfoD>nBDk!crMo1(se?qgx(@p=JH^Ajn7VU4+<>?}r zfXZN(7lREnE-8tu2p|FeUc`{oq?`u<3h@F1o9$206@Qt%%(tx2`RUplvY5$uQyiF_ zvq%Draogz@AAq=QYAdFGosvZF(`mhS}lYKidBOe)1VZGLKmW83iRjwSRJcFaV@w2cObu(mj)gP z%uC$_oMJ1S&OI{yXDKN_>-g7oMaN3K9mf|NZ<;@Qzwpg%`PmaE9`v3|wX|^gPjz1N zI=fRiF|j#C$F)~D-e@?FV8?=IPkp}$GqTK4;s7T*A*t|>o&PB}bFrixw1N=Gb$>m7Wr_CH~GGip_FN7GWgO#yc-GCVj1bFzV zsi)B$?4Zma!2;)#ibQxISY)SyzcT4V;2uy|p2~P=k+;>};K5GjFbac!82c*SVHZ*d zr%?{*W8c?r`Uthb+;H|K;?7X`4M|0uE)(T?4)qy`U=^z!7@%KmgvnUHp8+=y&T$r-t&tMa@vZ>@JU6*FfIF z`0F5`t#shAgZp^g2X_&dw)&gP1UqUuPo;1n3jGTZ{^$t}D>*X}hig&vkEF$%u0)gm zE1KRC^p%W=Wa;=%lee(8gS(gg45qL{qs^ugR9l8Wnp6K)NjyhjaU#S8?y+my-Heh(3 zg$>vmSlEEMmW7SJJjTLl0L-keLfA_OV-_c>%MfNV=MnV`f`IobIBdm`{Sl-*@~1cK zx|D#Q{%iny+|R+kfLMB8(eaMUH=r*3f84zbU{uw$@IOf=Fu=ebLV#$4Mj3Pvtf^od zB-r6G7?9vl2uU;`reM>lB?vRtdI<>~u#RI|`qkUoUTbNq)%M!fR<4&;uX%t#03{-} zGx7?GI^#qMg<{ZX{=c=)nPdW3YioP|-$yue_Ur7u*4k^Yz4qF#N#7N1!r1@p8{Ck8 z0Sd=|>AMM-P5XJ^ws7zO@k}^ncR$felc*2MX_mw-ndRM*<$ewEr0=#-Dpx@TkMiblf}oTQ z6d8!3`g(y6`D21o)srr!NcO~3C2tsu6v9^WbmK_jmLY^ z38z?nS&6KM$NGd-`@A=7mixYBQ?yzqm)bE%4E|oS!C$QX?Q9qt_k8fQ3Kbt!-<%|2 z`j8(Xsd2W?L*ZR@O9w;JjD|;z{L3foKk;+5eguhWreu~8|0(W z+TU*?l{Jk~ZeX7ZJ`PO20S)()+~D*6K6kuR0&NW&l0^ts{e4sQ#g7g5o{{skc#9|N4^6Bw1XhSxu`-abmyCr;J!-~G)p18{hU)nc(X51m+gBr^EhF=?(h4_Te=^I`Y zZ!^N(eZyzPcNpOl`-absKQ7_+23OzkIq`p!@WBl^eZ!06bw;?YZ}@_Em4x?iu=EWt ziF+k{P{T=)MS*=uGJhdnAmO%#_P*f@<9QN3u%Rs_T&;hQTJz11%l>9xzlI2LMn;Om zO4toyr4HghX5$F}w5EJWy}9Fi&aO|jZahMVn%|n5c(AYZhRvCh)dIvHgA1 z;_HZP*ldK-nhnkldFZUp;1s2f(OQB)Y$Oo z8Nq|%?NFfMp)-Q*@s}ic;~Bw&seP;wa;@^|t4Sj;G zzM+X_96sJ~w;8-c6T#}sPRwnnJ0om(;_8Mw&IlWkxTIml8DS$47*&132K#bu*epw* z;yc-2(6Ho;$hkLc?kADIA~L+Aq0ETZ!qw`#K5@j5%tA;+#R4N%i;4h;1d5nQPpl!v zdybg2#8P7BoFhghW)o9%j+h~s0Wun9oFis1lYvYPsrBf6h#wA*?U0iY>4XBZUg-;| zQt(=xB-SeeKPv$rCIYPu?v(P>`T-=aEB*khTW9DyvPh0~%AxPbaiFXz(ZdJB_Q{I9 zaMVx`WG#w$I>jH=GcCc>U#q>^|LI`-X8+h({>j03rr#Zm4+?lDv@nC2W|{m)f9B+3 z+wE6PWBJoP16dQZGjW|Sqnt?2$~zK_-{F60mVfZ90H^Uupw*JtJ)vbPu5?SHd0|xq z!7x8|i9S%;-rHwmM9JJtFJNJR2Xn!CD9AtuE&L)bU2H6sU09v|HT2T{ulpS3_l#to zgI!&FgYSN=_IiI&@Xee3(`Wm=!8bGg*9YGm6c{n#)V1M1zWB<3lCG(2tIS#XTpiZr zNnti@RkZ`c!r0GFY1_c|yOL@HAdKcvy~Ot5n|JsdXZ!ol4z&8x6K^v;k>KpeE)C#O z3nOI%z+k&^rW#`eZWKsxx-TZ1#jvX^^&K#??i%JT+5>Uk;Y0px^$e$7FE?ZRO_!xx zY>g@Cx7`z?c8r@!Ph!yhru2pw9nf2hD+uZ)-=x+*Odyizu{=y#Coqa4QWSd~golG$ zGUInibY{atDbf0-P1)$Q#hUP8E^FARBf~~Zr2)vt{S$K<9!LrIf41TNRPUt?_oaFj zt!#r1&=3qWG8rfvuq3wu!7UlmwTA=k%!9;S9o^l(u*gzQ(D8E!XUrmpx9c^>V!4i~ zb$~Y*PB(EPv7LF|7n3PFtg$`=n-GW(qS;M_jtO2`YQprg_ml|{q@^r-y z6VFEtcYjFy+hi>9>pmo2j|j!~(@;kWK})T_QbTo8ts5&J8|Ac0IVC3{@*SizYG4Sf zwFYh`!X5vnQ4G;5&WNU~a_g13KtXiX8PR;_j?Xf`?!^;*CNPva?ZNOJO~>Mhk1^6D z5tRgX5^yYVSA2jOXCm1rPL}0TGzcy=5$uz3etfr)0MWIi2e#Crz42f6q^LM&iY0NW zB@X|*r+66GdyExK(>28nI%Q4roMbjg2x%8&@)9@d?F*cDZmXI>mh35uWuMT^F~Kd| z_ETH){Eji*7wYBawyHdmB!=|*t>!03{w$v`fz`3S?tb!x3QTQ_)uq|ax!jmh?O{2p z&9Y*Olo~!Bu)VY0lE)b2ysAy)u`u>yawsqF6#hWv-m$1yh}!jOj|AW%?m#t z+j2c?TlR>6LYC{O?6q$Qgd~t~%QwQ$m&SfXDp?fR{W(6_fT#OwR$O;!mkrly?Xu%q ziR-4t46?PT;~cEuQ?eu-mX}U@VfYDQtkUpP(pQiBp#Iv7rnVvA(%qdYh>ELr@CPV8 z_1F2m+-VZKnEa|1c*+(K5F3ss7~IIGwqUn)<)uso#W=vWi@Vi{eP?bm)+)1P$E@8< zY_SJGW;e&nB4JJ)ZPLS-E_80g9E#ymK7G3PQ|741`=-T#p{$J{>L6>Wdm;W`iXqm_S#vzNdq&=r6=CF z0bR(|88~9lic=W^T|MNI+sTsT>J*yP_kL@@TK`=^b6m=O@nKDi$$Bj8=jI20)d$__ z7RsF`FwU7ZS77wuHiq7K3h)^8G{CkSPrCVN@MmHMu$0C(QD!*Ui2EK} z-RXgM7rzt8ad+z?LpnGVe45Dky`)pmG?V+DMpT~MzDy+Khz!GVfZJ9C2r-L;T_{R-{y3t`j*r_#AD%4L*7M* zUbJYnUX)?xG*?{(_0=<+1-Q(BB;e$r5W*&Fcvc?a7!xzW3=`BLeG?GP2!CWU6-tsI z#8g9{Y$Vlp8v$%`b9l$9A$0{8`v-uAgslAY$T^hx`&2~11#TX+PJ7Zq-%uP zP!2xTEA9dvGYz&$3}^dW-RX+EZGnN@e7!2OULemfFJxj5 ztXd~pd)>QNsP!Ecp&LyRw@<2Il;DD){*~f>PSQ@gOs$uAW_7U@Y8tF6G`Yr6 z_wHp}A|hX|%B-7oh5t&q>_{0bL~tl9{NpyOTC>5*tyQf6G(R@^Es?Q_2|=A@dg3yJ zr;;orMSdu==uZr`Qs20m(U|F8?}X*d;%Q!QSzd5-3>9q9Sm1{;iU^7xLGPXUd9h;b|lm27^XZd@oV@AcbKL)qdOhA zS%x%mr^M`vWkKF4q5!D%vQ)-w^Kls%EsTA@D2J(kjTY1T`v4`}VYX9rwt*xvYx+h_ ziRX3t^1$aN1;s$Z5`6tBOXfc9&n;ZW;pc`QDKgHVS$F#K!05U=x|an;k(sQzJSWv2 z{`gc2J|)GoC)xPasIyhW>I!ZN3}O9^F3SKMts*h1u3#LiEPMFCWQ_2(-otW{i@|m_ zB-`c(8@qy?pT-2OzB$YW)t;=o)0M_SZ_f1}T$;x6zLWK9oL;U1`P?ijk2}h6j>pNT z;T?mDPrlP6=1zZB)y9iOfmr;eFn4?hrs3evwdOEb?3l6xoa5r}5-h@ZiJ3EWmzZ4R zKPF*s87~&~l(7S+l+ik<6H1$=VPxi>WQDHp@`M5Ss)3Db%IWDPQ%FrO8s1aZ0}4^ zx@#k4TjOzzo5|8I)Txu-4(BfkOE)0 zwub`Sv@@CUX6@5J{R*c5r8Az~C*#ZU$w~ElVxxPCu*a{~MI1GYSgvzADW!c;J9V9w zX=k#u+1jT|`#erl2@G5eca1?nvlcZYFkC$8R1LT4tqmNNilHCq0qm!qRE+P#X8?AO zb{(bkI$Q=t9r5pH3f^rdh`Rt@c8rmzQ9CuX|D~N8+FxpC650o}Pec11oIN01NCCY> zAF2x$+Vs~h0pa}_lDrMq30wv++3|rI7@G;qHDp;=JdnkYwsT)?r)A{>P5)L9D{nnEacDpdRb4k4R8EHgfs#WVb=|vjJ7y=BHUag-?&?(O##hos=s{FLd_%fyw zd$U_kcDHg{Rvid(Qum1k?HGe@Wd?_{Gk8lQZ)coh)?x}eTH6OQX z>@*i0ncgR_y?AATkp3;mxJ{5Kw| z`8)>C@#jgHd(6vpqSoWhfdob$NToTDFllj35lCjOH zvHgtLXj^nqdt$L%QeyOYKO#}o(;h{PNzAqNckQ4Mkx{Jx*8QY(w}`03XUvG$j}Jm8 zILRpmwR?@=sv=w6t|Rn|Lf2 zrKNq5r{BeCY2W4f6;JkP!gz)|)6(wYd4%T#&$VOH(l+q4^1RPea!Fd+Tjck1-g|gX z@C-$lnaDGj=Sw_y^8AR$l6C?A(l59m!J4)^xo^Z-%4PCWarq8e1#P9aZ$N1fRQe2PXim`y?77`G!h{cybdz>)UU=J*L zgyRod)cQYCIn?#1!h>ZBK6ZmXK2E2q>Cc5B$>e2^N^<}5j2(CQ8ZeWxkiPboj26}K z9oJ*5v~3NP|3u22@}OiNyaw8;hTrD=GCj@h{+UGF63S1zT;Tc1Mt;JB#Tk-QtGHMN zr^P7fTb0Pb?!gigFU6%x5@_>&p`q1F;4^lpyGNx91nS$vd8a_3*2~WkXgUxxNdT-^feM^j(yg=DRp?jc;_~YM(RlS>Kq%mA*?7pY~mvxXkBDT;dy>xY&1D z;sW2e#QDDQi4nfb6Is4bC%CCHG0>Nv=;!-PBHeeTS?6m`a^Z|rl4|(=1}OE;p?d2I zU2CerHg=Sdk?p*tm{aGw-M$PRv$(fHg__9<{fY1k>@>>EdJtL$r>9G3%>a{~WDf35 z#5!w-$3gu1iCL=Qdoiitz5a_cUby3eweJdp)sD#6s~Y~G+3R$GTKt_~YmoUM;Uj!tBOShcdvZZru zT3R^#GG&gZ#^$Hj96&u4k2@XX-3j^_(J!aU#R`7Y1*dH#dv$2>pdd4%Ubd49w51kZo-JjK(%vxR3n&n})lJTLP6iDy60 zVV+lc-r(7MyR0^!=bo=zS>9hJs>)HEd(XXfvZJq|FCmPc};cW!;Klvtem;uq`bV6bmkE*sz~GAx4SN6Ef%v zJs}E6=n2uCLr+K(4m}|{ExW3}E2hs>YhYqX-OnUUM)t3=lcMftVlT9?j4Skn*i2(l z7QK37gPOFloN~BmBn$gMdc%s*=Cp)AYr?52@v*PqKS_=4C4IuF*k?F|fXZi>oHUio zQ93TeR^R)vEK}vfmHI>6vEsGx25aG-kk8cmJdl_a;2@PC-bospz`yw%v0GxIo3WOD z8+$UCo!JpPJsB)IWudGrZJPXnT6cg?x}SJ}U$$!O>Gramob=)TH3K+ub&nQxrQKdT z>s%9`3I-)zS6IKOlZ+;B{dG%YKba(@N>tz=)fy^D!gV*qkuxyX*`QuHxRDgT0p!F5 zM8T)@z`XpKIS{43ruD?bAy2MJ0x@n&xxV(DKOp8zEAN7&}=W(#aAnFpu#ibMMtthV#0ND0vv`i${ot-epDnHrAep3JsALA%{yESmkM8%(5 zuW67_r9zZ@%_RN0sl^H$|U z7g@GZH=(Oh3CFi~zwk)~kxPoeRJZ44)JSPD7M z?(HtICoZXqoSBSKQ!-gkI%<*zQPZb=Tk6j-TK|1M)hk)Nd5}5s2-2tbW!9|}#rP#K5L|C^#y;xqay3Ew;OIa3x1wXk8 zu{qBYWl?QpsnZtCyc;@2qKDf~ZJm1O(8#EDcnuGy-MY6NPle&RSbOFep5fZF08jTA z`8AlQ8<8Tgo{M?9NF`;E5?uZj%mWu*55um;e*^@OdE`e zOEabocudCpnF!J`g$Az$xt0iFTx^fJ^CGis3!`pFDKeox&_T_mMX0}sJ3qRpBkFb% z9d&0L0>f>M43Maa(M2btZkLYAF{5loRDm>l_jnzZYew0Ps6v`mxRciZF#lvdk6jwf zAPv_N-4f)Npw6oVRBsYgeSnR}9-W#ODFW1~fXdmXfs=r0k(>pXsZQdeQ?rR7V5(J6 z5J;xFba;*#Zi}#T10W<)z%ZaN8s9f4by4@26-Kduahnm~H-P%02I`I^Q0CEp(W!O{ zVDDGdZC?n|r8>ZhPjHV%7dfI34H61fY=nvM6Nx^XmgR`dwvh&Tw+zW_7od*Hmjj}U zz}6n&t88im#4KbXxt-+8fl-e=vMk&D_N4h?>|jJvStY&Bnq=9LWp)qHR`$Lwv#kXkyj;8farMmVPRr}JPxU(TP8}4l=YBiA%5ZNa|tS2FGF)t z45>c6n=9!$&?vQ+DIFb+2O8(*6P?{xyQGH@5}g#tkJ57t;E}GbIkl%VgjKU4 ztF{>Z+*X7C%B&J;BmG=Kk4SkDDX%hH9${3d<8w`6L<5)j@ghJ{g;K9< zJeDu8E;V2!jmX@h!l;{a#?xZm5-Adr*`m)ziX7sTz-A*5;To58Iy@UUdXi49F(j=+QYIsE$fn4CD1Pu@ zvK7f1Q>00bMr#IWb&ru>xvm}Ir#r^#zH-$R_8TElisnJ>a(R3~8>E&kS z3DFRpBIqv=g=|)~PBRg|#5*P4swKo?tBxs%PPJ*jM7tz9$M}4)O~)5XC1~zX*Nh#V znrp_}qtocb@}tunx_BuzTZ*C66EGG#w9~0mN%?d@IsxU+c1VJ3T^0b6O@Sn^84;3$ zK(aVT7iJ_VBtRm@%iCdqvN$(7jouUx@_IlJ45ztF5b|{VL>-_}2LzJ@vo(xP4FbOu zEdi39fFe0)5L`N_PzOlSg1s&R)j%5l;_=aGg&KtX9uPFK3rr9Ij(9*IzyM)#M`X69 z2Xx4nEGB9o_yq_FkPkEve4>FU&_Mt}KoSUDNWKX~p?^RrOOWNL=N{c*&*joSc56nG zUpZZmy4TyQ!NY-C9xdZctUSsMc~OS)!t?U!Swmg~LVkFjkS65KiIzFT^MEZkta4RCRQkGcrq9N)l=YG5A4Pcp@=I6%n6i5;$2o2rMVeooo`wFs*6m zb|d*aM6Auu)v2W5Y3O=VurQ!i62O}j4I`6G*9_T7mBElk0!BqZU?dP0mhz--r4i`L zCv%qu!EA*zS&d?W0m@>k2d9xL34(qDf=xi6fdK+dg=888vP*)X6TrfNU?k8WkU)cA zvKuU{o49CIqB;onn%adX2yg{XKtK=}Ai%;pNl!zBzX5_IB-B8VGzo-VpoE11!bqTj zAb|$LZqnggENmYqEL^8qSbnuETp-Fh!qkHD$cC(NQFf@fE$V3t7v)8EvVkG$A7biS3lso6tLoDH{I{!pW;u zQg4o;ckB`cQ4sR%h&(T$Pe(nwBhN)W`y!Ghk;T$T7Bxypi+q8f@Kz)BR&kNX?qnWD zYJ(bE_@G&5v*@HI4`6gfJqMBm#EYe-L%auH7V1U9jI-F@2;B})T@X!IRvtAZ72+g? z`H7}4IT;zqH$4?c6*ImHGp6FeH0Te|AR(lFHnK}F?0|SXp_#@yiQfSs9l)9RZ84HY zfWJiuW_)fSw_D=^kpYwBM@=%tgiO+rONEmyJcR9ryIdL#vNKMB#yU5!(Vw=Y7hZc5egiY_io9x$)6r|L}T+J$LGP3Lc-32xz5<)!+Iqk zOXa>P7D)6QPp5n#_8u}2n~r2CgKNoN)J~~K-qc5%yt9Rsd6Ql!Se9#4e_3ACvsL_5 zMWei3QP0!z9v}5=mUn*Cvq|0%|8aR2L_LqmyHG4hdU$&4rD(LA z;^=!B{BZUXN1o7b*=sM|PV{Xu(cRG7A^Mw%vQt0$cBm*D2i;MAsK_Nr#>mEb>gPfRJb$+h}B8Z5_G-&Entm13#`q3!TNAwvDw!EOQ;1C zq0E>d8C0PbHK|OPfX;+U*BRcwMy~HVHM#6&CE8(SP916!*z96t47PK`kC1F3G%HOZ znxm&G1NO+WuKJpz53`C6S@JNm7Dv4g$1Y2-5J?&_wMo};MVd)6I7DSoI3=zUd z<-I!sE;-T%(BvJMy``=5Rc92NN;5WYF{nwk(BvKBb%@v?LCpA6nm!p(W05UAwS$4A zS%{&(cN(IJ1Qaf%mAP(OtYzYdQ%E=c+eS;*+zLgEUriJ}Sk$I&#)Tl(h5VMcn1MtH zF+ikrei;bi?22H->5w4aV)oXSAW4BG=p=r5+vP1|z-TP83=SLXB*Vh=H%k27Ce)^Mp)xNuu$Wks211k8VY)FaBsL6A>nH2$Rt4uHysD zX8Q;;0uCL^RNOgT;o{Z zjo0B_xX?d2Ix|0Vsgy8tV&qF!DQ{*$^4@&MEgf(=9|&i>ga22k(mWVCo*GR z5-{V;Z0`9~y^)T(pE*&o!M3N<$(a^hK?#CrS{RJdmsz2+9Q5wTP~cc|&$0fUVr!|%sdrYEB4tOJt(=Yr_FktuqDsF8t$ zOdeqdEJMS!!8wWagAuOfVZZC;6cTg&$zs9gc0uC8^^FH3{vjgNAtRi|4=m^)KXKU7w>L$c-&uU4pl25aLU&8!E3Sd#m?ct{Ad0OYPN6TpoC~`QMdeIW>Hy3<# zV}3v&k%NN7p+y{>ZZ@LdfPwSm>bd>O!*W3S?zV8rQKWAY0J{2<$z*MyKw?BaN5_R3 z6d?YMKHmd&ohivU67HPI=$6r^Q5Mir=`4h2 z8i^*8Y{P>b)D@xir=N}zPF@F=#xLrcU5?>J9YOlf3vPj?u4n+DIVZOAhBrt(DuN<#HvG z)u^@8xdQ0j0E*aX*PfV$T7Ib^nQfTHqzEH_{#&Ez=av}sD~8B0dV*0KlX4@lFq%Fu z+BT2E`MOOYAS2$k@HBfg7Q$Mpr%LT8xUqIt)dsh68c|>Z{Z7D6Sp)b`%NRc74e*%N z>^@_Z*&}=3J-A=@u$)mQtxvjmldIoOPU&ef zJ$u+BlYhkI6_C1#V=~m?*MvIUo zVe{k?7d`cpOc17g1WK_%yv&k%IfYjr@;p8&7kfl5 zfs-Rhl<2kA$Sqd!%oKSe#oR(CgI5F(t2d2d@l*|N72xWjHg{dnvE+p3SwmiHc%B%b zrMoejXitMR<~0~>+702~H9~N{)xepvE>OwjWX@>D!bo0ebUJw3B1^1rYjip@x3S0) zl(y_>1_6;gQH`csi57F;bkZ@Vm4TKBG;B06S{dDI6Y3YZ7lxuE}hgOq_{9SLB|aT9da-t^s=Q z6o2m=|2#wT!|!SHQW)M~^*)Tw%_}|46Gm_1d|H_Wm?a%c;+nHr{o=l?K0p-HSynj> zhT&cpqxZx%7~5cTk@d8{loc3aXkQpjD~(X09dNC=@`AM%7zVY>Os=?KjRkgBGsswJ zA*%)4OfCt#yU(%0LU$Hi%1|O|rB+{(%8Wg_Q|l{wg~IG??aqzvJhVmrqSM53KW*Zn z=IFFSyjoA8XO1O%J>56&Vd0$?V^BOW6v3*yW(+(std-Se+L9o2*TZJb0>GfxY*2wz zJrxd_j5-TRMQU05b2 zq!l5cq!A&eSZ4xEiKd?V6A49|H>+_TgRs7|6(SqjqNtCe5E=x|(e5OfMTgXXG%=>- z^sh_*I`!{(Q;8%^YE=|S%@h)r)Em#LlEOcwRLOZMRRT`BQl!zy+APD!BjfNH;bJa{ zWYfsMHzI1XC+tP6*W|p=w!T~adviVd$Drm3d-3kaJBZWw`m1lsQebvh)KsLUL5~V& zk^Y^bf8F}GQ2)w!zQQR3`U#qlTX}Zy?BdzOBO;-_E~8tj0=1zgY};>H-;$&pJ$qzq*lSzAH>Fk%ou>X+|1(Cbp%;X`R*CMR zcI3;}u$Pl~QYz-q>7L|mQWf+ZOK5shAsUQBrx#Ksi9zJ6{jkWw*xg9_lv+9hLr-6n zmNt`T7EdvcmuEgtDUTtz%~1>z=|lA=ZL>)ofu-tE_rI9zUX&r6ZZy=W#Qd|R)8%JL zrw&s(X(>hjf|QajR;1Ks8q}G}RF9~l$3Zza=P^WIM62)7?Yyz~*wRC&R)p<_1y}lb zgD=;%%l;_QG~Qm{CNL zmPG*6ds(EoEb3VhDPABxZ=~4ETN~UDMFsAIk;85B%f^quWfWN-7#{_c1JOmG*#=82 z0?niHo=AD}E-+v(j44O0g6_yNIul4c zBf^Z4z*!Vo#CJXx-M22cq5)U^`56$On}Q9T?B{k zi+C197dd6!fu}5*`H)Os$f61qZBL%OEm4n5Wh{~w#LH%IOzZ)j>C+T0o3{Y+`|KkO z*DM820kTkl98ck&6_|7y6Paq#odcO2I$e7&GS{A+PLSD1I$0~>nIlUg{(dB&st`ik9YFPW9)^Z!E5ikmUx;En#-E zaYB8p@i%Po<38tTc)D%UbZbdqPQ7)#oA&RG{gNoT__3Vhm}CoIXu3V|`Gw&LOjYHD zud_BCNe?%bavolo8%C4oyG@8yONKWEr`sH%af`#)Lk3|~v4^tPc2DO5jYV>!z*3NM;Jlv^8GC3iwmjs^) zKc`PKmxYeWQ>~mX3k8LTrG3Q_vfh&zpz#hm*IG2vvVB<4o@&KPKU}O%V3rZgvuw_E zTk0_9Cx$~KYtj0>p{Z7X|L}mYb!~`C2lO}g;LTjYu=yU@xcjr;%EnzW-pa<^a5R)Z zX_Z6YWF#ABS$!Eh^((OA7Ds2uYJ-gE64udK9w3R=?G8!4kWuQ{Cxe_)9x86 zH(Q+^w?~fdm4n`UNR!cg;-PR&`!>r!cQ>m#iaRD>XI&{rih@F@fI}(eO#j~9eOAl% zv;$-5DrYgS^Y@<@yI9cCxADLrUhMR-;e>={+GU$y`ItX3Cz>g&2w7y3I3PVoF7EYVj?UhTAGB>AF%VLD& zeuyTyP(v=(*lrO-x4Y$RZf@AnSG;hUe1rxxq;L?>hHk$ae0xPP`~%RFvKn9#UnvlOI$`c5-*3znN1wxaUO zoR-{Eo4odvn-tD2enK}~TPy{Ow#I~_x3ntzGTHaq#gSuHa_!modI87WS_3(gYC8PG zG=Q?*H8jQccsfVOCO*>>G)V{5e9DN5$t}gS2)p{)_Do4Dkp4s*=FKj0_9jRy*-Uty z`sozn>sAgIgz!yh6qIm*k*DisPEgS&K5o8G8q7*s@4R69c)kuT>yY{DXYv5uP-`BN zd?z%jpN2g9LW_2UN_K~eTNAV{rb)MMzW-LX)k|YZWQILk6P{qrKJKF;GI6y@O8KlL z681z`Kx9b=fdRw@cUZX=!3>mkZUiztOkg|gZf<2Yj-^E1y4So|rPMcuozOsbf)mXS zT)97Q(JHP}IUpk^<2n^;q2C8vws}^i1#8;V0=e7@q$&aHZ{*wKcItnX4QU zpBPArbdC$%@8{Uq)xlUl|9M4z6^vyB`qkB}viQeS8~L%HFlUh%D*=IHvE6urZPvtj z!J5?rIp8v|x_fwx+Dq7CztvH;o4EeOug}U3)^G<(Y2X6ir1EF-n6zssz`VRY(@u@a zHtiD+$HnHcc1kipt^Wc3;27~+=KCf+CFzY%!|%;M@o?;(!E8&na_AD9uBje2+9$eX z1fC7f85enMa%Cw~FeSeJu@-=lBRGf5kL~S;D7Z>8*+I%pKt8uq{D8@zWc7^|P(hK~X~$2~XUnvK>6&y4XQ7f?JiY1d^a+RfM!@;}=;ud&kg=yHH(WVQZ>Ep_WBt8D$<8u5 zG9ijFH%O}uorf?EHrcx6y!8%^i&|eoI|Om8jcLWUdi&?oinB9bm|PMImDtrcMi9A} z+iHzADO4(^Yk)#KAe5b(;!Y#|Rd9~`gHxe0tmw?z+D-ZwXb$%bY*Zoucs@>#W+wpxD9kWxJA;F6W9RE z;Xp1|@zzh|TJG$O4<^^dFI3VQZl3&J&26f>zp5Ugs=ve+x7$>0ld64D)xM@`-%(3E?W(G{T`ei$ zy@>ZR-e2V%;9b)m-l5)a3T}6(_g@Qcjr?tc$x_QG24kx+e zztYowwwj+r_V!Hid}BGskz`89qt$6?OwdXoeO&C{jqmKe-z8MuX`c~IPkjFagV&ld++8|*9iUczbP&;H+gBP+ubud)=NNyfVR8D zwNG3URo5zsbnI?ibvjn8XB)mDv0KHp4wt*A^*(u(ZIGt9Nb)*nfcOCEnfUaK4Lm)9L` z{W7T2Lz4~Pm$(HT-<4OACVATT_tNA^p@%lMxaixT*)UEz^%w)5hn}g^ZZ^k0{LqBP z3Hv9sOxUY_%F)A!Z=<(ggg_IiC&y*qMIfDgdQX?$`FmKxGJ2<6g&91OH=wvHsdbRD z?)GvLTTRV_l$JUp<=P{4ct~6yhycg$S-@fG;(-2hZwoW-NBpXa-z|0PrIWF8cwzT;kdkPle*<)AGk?g+0W^?oN<2^ zU+(|Wue_&p5@)~nCD66<9eIr}d{SQdU(BG}o;va8`c?2X9aq@hDRJ)eEfP1wr@t$D zP?tAn4-Er~n<+Xafyw(c&Ue&I3xC;LuVRz$tOv+e$FRuTTuhxpi_?4fFOBAD^PIo`9 zaZgE@%zFLqX>o1DHT!vSJ%sDn9&tU2YxGOvLa(<}KO!z^z-f<)OC-gdG$~D_!f~PA z+D2UIABans;5zLR>G3~0-Bw(cCnWX&u4OuxHeB{!NSMf*_34tI2&Hf7Z$-*{_9U@W z9V_3IM4JfsEy?|#KD9O7KX&`n!ZGhjbkT-4Bw8?gzX!9zKT6b+Wj{qIAPQu$f?cnT zlQnP5X@1;^&6FABv!*S3mb;y+AZxTGW!^M9+H$CwX=s`86bU86oKFC{e{9 zlXv>R8cq+Tg{P6w8lGk&Iah14=&rNrm|ap@*1plHjH4|-kNzW;=5NEM=w%?FzfHrC&0y*BVW4gz$P*Vi%ElUby9XN}@Wl6Z~4w&;h*{L<> zcX|3(CLQMd&fTXN$IQT=dJ384sK3#1ZQw~61=3!0M>Yc#xpJFpggg#5R(qb7VMbRe z)sTv&6kT7jnMH*kr}$4%+|0lqQ_8k{?P_R*wYOWweGO^jwzlY( z?TI_YXCHB=yd0kmf$8aT&!N%#!l%3sv*nXsMf`}yGm!FHRh3fO8(WZ(-=XB%2h_&R%d zzU@&JxQ2{o*;Hwx&L}HQl^5kHSF76AXrZVQRc=w`UWY1cR%K0USh~t;JfVh8vxS?( zuigmysIwA)@+s#nEG_Sf-O3eF zu4a5qFe0yAWMMO$&*Lm2%kpPavhCIH&#sR%@TnAhR@wv*dn!H$$kN0|qo!O51D}I} zPwrXxNa^-oq_Rz<96Ha0i4<>*6z_`X{t8mNHBu=E0$=$wdrBF}YC9Xh>m1<}6ff3% zopqiXQEt=3boh`FuuIlF_-9^@Dt}Xzy$1Fs7iG>^e6rqRq``?wm3pd9w~ zJT>y`G`MXl`!8zPZ8kOXwj4G5Sv72`OO2dbU^KQ5rEf|2EB0V}c6fev7)np4A*QPl z(|8SqoV3KflT=o*MU5zy<~>R3cw6IKsV}~g zwmer=koJH`oo%NksfxFy8J9&>>8Q4CoNqfc2V>qMf!1N^<#*{HJTQtwnwGQ+hgW#J zOoG~Y;yi!mc@KudUyi>Vzpy|#VP)^|ybiavlLlIszr`c$ak*uCI<2&V@bb$$D4+M+ z^eVh)c;(N*nv_`nl4e{S$bg|z^3XE7+4tBi_5MqwTP8P8E~!6_x3x zB%>Aw=Zmu}Gf!US!yVe!gm4#o4;n;CHcdor+fkyWXX`IDStH%j8IUhRazvh((*#k+ zm+_6&_|n?dh$}%^vnlK;0LJ~>>HRmt-^;qt9VSR} zuW)rAQX6#s8;JZjwy(b#z8=;z8RJ|GDtswCikNyel|hs8)8tPK#B?OOS+XMld`F1p zRV-qFerW`1Vhe+lY*m5AU^HA+9zp)WK%#$@A3={0VS=zGt7Np52~_lYFna2ZR;qZg&=Or zw(*@P7BSo?U6)%B?3ChMR?CCR8dBZ&+rMs4j)qQedRMePv1 z0@Xv_6%pRAf+@osRH&_nhN~P|WY(&wJ*H7!rEStgT$i_rCkp~z)gdlmm1=4+z!u@U zAfgt;)PfG>+AZ`Gt<2Ra#4Iy3vi-jlmC{5SP5l6=&?`jKgg1%Vr^@~a5e{p{ADg4b zx*cjPqph)CVfJb^X99OUQ@#~w2HIqBdNTr5wKj=K;_D; zlWJMe1j9hE;Y;ud;Z{f}4Mv!}&ENyUZ!1;c)lo@4N@XCSXy{gK_@-CF? zWUfy3mY0ANt*3}rh8ltT>=Lz)0;w!1iQ#YKr&Q^1%TSmGAyBqcxiA_~=C;P)qWX5o zcnV2~pc1f*#BDlICmuFXjhwAjH;U92kG|vEPeeaPe4k52ejI|pt6D|gsNLlZh(4Zv z{8#wF9B9DFA~{-h#kZ>R!HrT6T3Cu4fc;yM_l?Y=B4j9DhRs`uU@%+3NJ3b67u9A| z)rQiACG#}mjN8+lV zcu&OnSoGa!W&yq^yHO_cK5#mkdw0_jYsO9v90e6Z{>9 zw9+A;+qjzN#zl*7!YGl-zh~7)u)U1dH(mPc>#}uwqyUxOB!0WBXs=)3bg1kX>gPBa z>NXEmV+m8`nO>5Gtj-XN(sU5p0c^2v-Ol#Ifx$hP*={Chm+Ku3GmVGV7 zK6RFjZ9WYb?E$9Tsmk^$G>L6{Y0k~(G`?ZLLIq%?Y#6X8ONM1-IeI*A8nCqW3L$$) zTd&Y6#egMh1Eb$w1J-=x9A(nwGahVF6(Zg#_J|sGvC2A12Uyu_pfkEZW4`yS`aHwF z_<7}^F-f0JJE3kwIw9{+WTX?J{}ow?u+ybsw!^wglN*}eV_!N&C(NR#tRhJ6v$X&-$InbRQ|1f((ngE`3Y_2xf3%_H)MEM8yXyUx(x4W(>vbqcADON!;4wMkz(c%@7ZRakyvqu zeVOj|%XGK5(cRwWQe}**MO}i9r!o7`_kKOu_x8;HpUn>`#5}{^Stm{GAGdejO*Y^# ze4Wnjf6?A~Zz?|jpuO`x6R8b4Plh4dh|Bw*ZSP#$o-)j1ww8kO>LcR}#36!_0G~>tMd%c|&pg zE#0~y@nrx}&WNKIrLhk=>*$D;OL86ifZi9Tfns6+M7mV@`>NtS9U@u*U_IvCs6Tkj zNIQ0uQ)cpoMC4p{OcRL#7a2F|@Yh8RB$dqGOR5S+BTI!~w?dW*#M@Dze#}`X(G&(X zD&9aF5<`LLa;6E?^|X;48MR4D=z$fkyh99e6|XCoUx>9Df>uDNQ{?!x0hWLdeKr|D zm%ptl-j~ueFhcm4#tv-=0sAL)1-+C}fWIm{o%0_3{UIUU1O+13>3pTn6n$xaqaJ~X zu3e6|jFCu%5EdMsQ^T-7pt_d7riP*Pj$DFm5fkzX#LWtqSki}8A!MpdA+vU?aOQ+Y z(X{Lqvl~83-kdq!{9myrYfb)~_T;nS1z>CFR+fUZoj)HrHl2}XhxC`R$E&6O2DfSv zF#K^|22mNpG)mY|wC14FrjRoto;c-mCy4nsd8U55rsgu~!Aac*mz2?z{j zit-sen4_7$u0Newe?atc?FE(=QQ%>+GwcNp3IAu?3p(^bED-=pKS6sz9`*JS z_5x>blE2ShkgusdCQrlOX4nhd;?ed3uekm%w->Yt4n6jQMtm^ks8$I*x4qzT9rbbT z1snBODfWUDIv~YfP$vOB_JR%K`zU+ChmJ>AQ}3V5cyt3f8RO9v;?m<$arKTz@5d+O z(ffG+qvO#!$&2ym-DaNaj6DB&bNIimFV=0vc8Ox~e^<)C-%`vCHpgQ-e|w zoWl)gY?D$)cwT%^RiCfaYd=)g%xSCBq`1mR@yf52>ge-rZJttbzIo?Cr4m0>>My@m zwJU6D2>msH0aUuG#uU#Aan-mM8P_svfJV8FbgasnlDf+dbdW$H7qexwY$k8J5acOuO#)4B<2yNc2geokuqzu)SB5G{^7q$ z`5I#rZbeJx1En(Wrp!%hO`>py-|= zKaw!;Wu*oih58`qk?&KsL)EtFqAFWdr7uURm&yCcBN`&#DN24)Req2xO&y!EQD~?O zI|lv-OaR&`c$ccJqJE8n-)WKy?4?kDl~TjaLR-Kc45Zu~MefO>_o~X3v;kP@6)9N| zeiDv0%GyIY2C_;W!Yzmj{|T}?HMf~%DmAL79Q7iFRN8bQt(v2$55ceUby|;ENGqh= z1G??xI$V7Br*k_K@g>b@58LR!OG?ZM6+liMWOJ_K7 zOtFxo$emiY);ue+0Os`_Rlc{>vF&QrpYl}gA64aEVeVse727CJ*!C5kw<&dx@^y;@ zQcVOL=6QohdH|%DI{2Wf1s;*nSkD*B!WtkCRX80;UOQu+Y&ox}GrUg?;o{LR#I7s` zyyYI`v&M5%>^CA~J-Hg><`TivnJx(X{G5z)Sw&*TQ6re6@$kmeOQx;t*Nr zC_~W&PA8>iQ>sHP&$J1~)dQ3oxJgwr^{BpJBfp&ws$<=1`BJ9~;AyBWbP=aFsOqb# zB>Da+UU?ncqtx*YYE6f#-KEriJ{u*u{gUzTYNcNNzKGK`tLcce)OeZx;{fgc#qX)w z1JLZ}JWr}M)Xy5u%%NXWwMSx!rGhkdsMbh5LC9DHw8iIA%c-m7$>1gl)&P>+s+Q|= zgziT+C9$MVbJejobTuB8`lN?f^iAqwo-YfUE9FNj=WU~M5TipNT{fh12-&2HoK#I- zPt{N(1!{S5A)q~|)_4k-ei9tI1Nq&7@n492k4=kWqVEnAbO*R|m7pL&$*&};9xPPr z_vprg2>LhQ#1hL=DaW$AS=hfn`pB zZ*3U-ts$#3Hk|L|AUq?Pn`DJ%vb@w}Z_7@&cIsc!&2Ubn0RbC*Y2zlQ7U%|c{E*y| zU(k7(y*g?|?00$>U7i{OL`m6<4x?2WbQn|_Q;)&@Yci*9MUMevQ;#_|*kGSghT^pK z=O3lc*dYUWQdqXC9+)f%-mi_AJO>v>xp{qA?3Z5@ZUJKS12B3dDY!uC9!S~(%@7qZJt_Cs(J7_IOgQ@Cl zdM@E5b96I<2y=WhhiE;(`P&CK!uc|~VXpO~hBu}S_^dI`CZ}u!6J#MZ=M#Q1fK`y2 z37PAoA=@AjoC7l1pru>sz0P|zkoW1M&ZJV#Ay1aaZn%kjQsv34TcnYSJdqCe40&Sh zBTxDk@o@yp9A||v&QhAK39M|CQ`Pr5Wpmtz0{g4QX8`-avX235Y7rj~*joiyzsMLE z-K(nSILnlp;aoy1nd7YDH?#5cGALAojd$%jXPw65UXxR%h?LWqt~07-`MpN9{2fyC zZs`Gfq-autCZ*?nM*e4u&t8NlSY#&xo=#l`Xfl}Pilx^Up;+eX;pGfE zMK7Zzw;nASiX~s%fUZ?Z<7`%yP0IIz2oJ4hYJnowrvs>q=%Ld{60g+1s&X@;HCP-M5N+UJzAq8-x*G0bD& zUVB(63MB+F#_v*R9>2GW!9e-7@nE&H0CzK5-7cQjd5-ajT8nNf2(z-NdMY^0qS$|0 zIZR^KGWlCQ6-v*7692q{=q^~&P(2m-IZM}&3<3TLlw*BW?UDk_5->+_>kK$XZ#lQB zY8E?H7XgCXDRx#&E7eSLSF^sNx@@BI9aWWYF%Y9p#K>_3ZQLsrR3$Zr^;eZi1-ixT z6ZxU4ZIw>G67ZwSw_Dh(@=aB}f|`0q3^rcN?lM^v2RtjcFc6 zQ?FwO!Rfs^*&BFiGFzZQbnH#QUJxMK-!nIy%n#Cm03G#3ZF!q{k8k55?J?zFN zG%vOfn-F_=WQbEOhOGgr_IV8+q5{rjvxD%sn4}m-9m_O^*~9fqOgN@hE2>r<&r_>j z%u|&Hfk9d03SpSD(8gq__^i+$%a>3@M;{@22@qESF%9sgGe1vAynGKPI{u9B;}Q>s zEMX8%z`~NPIpJ(nbLYk4b2O?3o-!gent{qJgP;I3c!_>XL73zK6r;92WM|b&;D)76 zvyEs;9Xxd7YK&9`wRn|OPA{e_z~~MzI-qI~{cRatZe}#a%qWTT3UIrl4{kP2LBmqH zoZ)+{qYQ**zyj35v6dufRFBfEvT7f61CSz{S_4z8ac4uS9Cd6=r#3XO6tK3efT%pR zW(h_jH}v48-I=*xk&-(# zdsfbsZK;`niBSZI32XNh{Gb~(GN(XFw!y8$V-JXfEyvneC5s)95685Z4`-HgC3#fzZ_VyoqP9!KX7q*!#s z3M6frM9l5zri?(Vq@NRLDYn)Nr20ritZ~5F+f6aQ)d(XZtFWZDJgC3dtxhKNDtE|? zlwyKM+PE+Q;c_I1hGXqV5(k6 zPBJohiS!t7Xfc(ol7A&uQs#)*sP2oY%1rqVsu;64G8%n7^bt+2<{!5E`Un zq#{qL+HKNKO{{#!HCAH%YX+aVF?SdR6PZc+3utU*cxJ#zXD#-t{om4(Rh{C!m!}Cy z`{q-$T_Y7XX%w&8JMx*cRh55IzBiPQ604}K!@7!?0Tkw_)R^lYTbegZfN7W-XjbU2 zZEuvpoLIjcn8DWXmBHM)B0HzQw5WCIyy3?sLIG@TGL?1gEumTEOR6>|v&Oa9TTncx za%7me$X$=T#9EFkUv!fK472Y4C+eExNSMf7CujF5v_FuVBV+suXO*g6Dudrty)HSh zzt33ZhqbLp>vyZM2=MWeq=xr^Q_l8LwU0SB%UhH@SxHDE|}7!?U{{InqN|Q&?>d@atnMF>^RnqAPuYz7l)l(U>r0{7mR8%^r;3PHce5ccfEo}nF+>7JopmBa zz`Q`r{=VnVY+evs+v?MQpTF?Q&Yd%N&b{~CbI(2Z+;i^G-fbl-9Xf*MDMbvt|;rc?CiO zj8X!L5aJTpf6?*7S%mFZj^GbiGA_>?C@;hqUtpP+@Bk}R?f);Z&`Y|S6{>dg7gp%y zdUP$B&RLf_v@Tu!i7riLU0O7(OLIQar3HWtAM!8~UcO7Iz@a|RTc9hzc=mL)%j%_{$tgfo(=wVL zra%sx!!D~qeknOVcM*9BlYJ>UMrbS8-v8&s)&DOghf?%6Rsf_`Lc=T=rd`sKloouc zNy<&yBJs0mr0g98ZKq9=GGl1{u^&?D^ItbCrp=|#v`8eq{%@=jmqVE!woF_P9iOZ( zYq2cQ7K$Y_tx;?ZmP5s~dbko{yHIu^jInH|Wfh!pxf(3)4ni3xc}!qU8K-&T%Sl*U zZv4{&_!9Z}zds3I+UZyU!8oaPdf*s*JHG6BQZ7DsP4i#e^YFG|TakmKek@lA12z2H zhciHE|41`-)|*BTV!m)AhfttjvznhlsO?Vq-fTq5HB*OmX!+!pHa5uz<{Wcb|nWv_=UsQ>1@4#Bs) z>Ij^KHAml#IChDd7e-EOVr>d!X0&=zbPSB>*lO_5guvW`;R9^N>;@qTP#NY3heKWv ziz%znZk6li)8tmqraf(Y1aSrA=2_jOoM2`zRq#%vv`@mJ(;YV zo~CJtHj@T@ZQGwF|8|a(0mFVSLcqw~-a<+X`3xC|2u59aEGzqhgC4GgumQp`MWlKF0rb7xzB=)JqRR7 zjS==+%^>jQ)cJp8>ilw{|9^3z&%AH`%07$u;dse9xh+-n(|-0 z)Y9gHFO9>)d{O@0jl;^f|Au~VRkh1c*=I=@w$Jicl+jOYvFskU#qz(mASl5W%m}YF zI;f4@)|Qix6#UlKV&^5~xVBi`Kyi>Sd=3Rsez}XH`Ac0Q{M7x7ko5b4oC?T{2mTB(>E4O;?7Hr75&^Hqz4c+Rc2QuPLcnMWZ0oSi-;JRXcpmXLVBS-> zhH>0ExYAz0A6b8}!N^?W{kSLZ;?8O{(4h(G9;6RcBP0j>ewMt7H{vi=@@_uJ!Sfq- zB^DXKCI(sQn2V#Z_MAtk1gt^_$%URGa_GDv_(hV-+(PWsb&Qg2n3=lM9jaAF4 zHJP=Se1Q=&b6#sM8c$iT(sI)IA43hsY*zb;Hsjb0waJ8isL637noQ4b!rxG9XLC;Y z-S*RARCI*N8XPC&yc0%1t{&OQ#oAwu-I`Q7dVo%Is-;7hbZG6*xHCA8#|um0Qz#Bc z8~AYk0Q|$*kw{M?E7$NmSM^_5kK^^lYHay>+C`&)P3%&}s7~BuQq*EAC<5aQ86VfY z%{fmqn;{y?;zU3|?D}8>E{?n;(J?EqO9Le69y&$puOorOJ%vE9XcBVX7Hd@U(#LmU|b||wpXw#b-&xY_7I(Z3l`YeSDVzVI>u|`uL_EG2<4~hlqqX;j=dC|0l ztccV8gZMl^ThhFWf89+W2G=x3Se zFw}?7mYE2L-p~OAoj`E@vmh8bQ{vN4_@WYhq!tH>;RvwMpZpxYM5_kfv1gdy2R}$n zhFNNhmx6E$fe#89oxT``X$;i51N23>CwDi^U<+qMFJmel4hiF!4(Oyw?Vcpuk^)1= z_#B5yh6pnF`_Rcv^o41b_=gI-Oj#p~DH~Y~&BzF{LwgG8^q)^T2jg34 z_BL6}8x(A~yU_VsC;pGqe_ZB)Gg3K2F(XQmaFkh1jh&lytE0uign4o$+T zaTM4`fy8w580oYWTufSJXbTxf&LAv_4%kwoM<0e$pMs)A?+4zGyUS1RBGF2%&&?vo6O$NYF~k z8#rz>PL*1Xh9LZqd2RXWR5dy!&&X7LD5FGJIw6uy;~a}zbdVhylYpesD9Yi_q>PtZu}|(6u3wDIO8>fXGF1 ze1o?N;mE}GXeVq^r_DOAYeHF8I+gh zU&0<|1qDk`Fw4Kk3?`OZb@&K7zXB5qKGldXGGgv3q#(|*IPpM7Vv){4*!T@_;E^aq z6yuK_a*072Yh}_AQO`7H=x{gE_g==|Aw0$C#_(l=7nmC%e4p#l>mxxe4u4nRFCKq0 z@HY>Cci?YWKTsEBC3f3hL3bn`QG3ERz-Uk1V0&w*8)C71L^qf&e*WDM@S%%A>?}sS zhV#?|f!{M&whDV%g*~L^Q+w*T&ggW;=Bw#E4Xv)A@gRlQuowr_xKpan#B?RI-=wr+P=z7Kw=zd~>k6;o}`Gz|U z33?hY;6Q06LBqH*#3_s++JOC(a5ceL@tO;CJ}2Xnls>)w0sQ?Ie}BQ>ar}LNKg$KZ zekT6@5iYrJ88{@TU$18!`Gc2&!Cb|bq1=$I%*@DEu1Z(pGZcMxx?(x~!Qj6GNnh<9BNit+b7{FUMF`}q4S%H$<#>o9edsj8$o zGEMdG(oio&3M`mjLo)gEsSPpl+hE}1V8Y{ILWrgjWpJc5ecpPYdVs^4Mlu{TB@jnS zz2lBrxm)l@Iv>K=aWsc^0PK)L%v530ipP>-44qQdfooMAn3P`V zzRV!n4kV=bo&ut{5F!liFxEh?rh3s4_*lTv5%}Y~pmObCW0;N&#j)(IP=((Cov>Vo zZmFKlp;3tJo0romna=rl=#{EY*#K#9dA(9oDA}39q)Pf8W2z)pKupUD>5HWPawgIl zQB{a%rq)vqqB`ki+Hyr*e$gS!ble0^nTDlnPeYV?!ltWwO&2)o&2cT9`G0wB>)`8w43B z2q(J`8xc)_inWqX??wAILafq(JIBauL$PBxTLZ4FAJA$9j`y(CaPOcQJ@_L}eVmB` zQwdJz!GR)l&h{&u6Q_~jy#HP`&uQer876EE12+gP7Kj7RLe{saQ+yXrc`|StzmAf% zBfd|u6$0CKID>OUu-3)0s=Svgf16peVIjguzzI?Vsx=)u1!tPMGbrx_c(R_bG4nq( z=XdCcX_#{8%%L^MIKqYoVIQQGJA;F#4sx4&prE#+DJX$feaMbX9DOeWY6tsZ038Od zF~iW(Qe9FqWd@2SR+Z{XlPxRhOzvSzOIlY_^R*F1OG_GEw7jHcB`q(9mX_)#3jU=_ zORj);c7ge_i%KjeRi4hJOra&_Czq4tc=|6{PJY@_l13#4qbdWwMU|)7rU(#PbFr~_ znHA(#%J|78Bpa)jkre9b(weP-u@vq0904=Yu9^-XEMZ4Rks4d(phKTE(@SV5VhF^l zTC$1>%Vh|e!tcQ512aGoR=GOx79G(%_2+C2-meZom<+MTEgzsk2&P^Gi9~GX`vZ3d z$K}Hl97pkBiA~Bhoiv71d0tgHKXiUFi6NYsT#oaJ-W_Iqd5_s%xgH4g{bYOL&O@ft zH1Uc`HnIo;3L(h84nZergQ{y}?hH=iiNp2~F#!urqIEV~4d6%@Cb_XVqh&ko&(&}n zZ)9%qq}S0>p9Cur45&lLn?Y7$Z;U&Ip~OsvZ0^A^Z?sib)=XPtoj+4WA`BGAp60_7 zy{u?;jJ<=d zL+9CoF9G4Jd0pIclkR2upj1@XA^L(;6MZQ=*VN8#rZ=%mf)^L*s956_Pj%s|+fOlQ z@(#M>n6|S!d@Wr~<>I4T`1)ZNm)py&ILfVf9Uts=QI-|Q@M;lDy}`}ECty3c<*}>T z%lInyMO4H=H`j%6*I_gDx~*~2LhH=1X{HoFeeILo3$4<^=$Q+R!ywVp!kC#0&BGuu z(!xnI7g~lvCP@q948zd?Z@ggyns{m948sUCGo*#H3?tCYlESDGVbVe)tBg@vXl4ns zw9vv57H$UWJp;SeGs3v+7W&3|jnByCc5=DrxtxUA)VQ3vadZj6tSU@59M*M^aHd(^JQ-NF)j<=&Bo{M_H&s?*KpbOT=qd2&}n<-Ix|R!7!SXPzn1zq zAII6Zqla;gYNDRTi@7E*OHF@@E;*(h?2fvSrO<`wxw?*dpS*o*r}^0^Dm z`P@J+iis^^_pQn5bCN!W%PJ&}Fl`@!`O{wUkM24J% zIJ(gq{W?CP`zLC6^hLBC(kJv85^l5iro=eSn6_|y@Rqa&fd;aL!9kmFKZMk!p(3Bt!DSF$?EmfDHLK92O-Oun?jcm zY_GxDE3`8zus>Fp(O7gGNuB$ISLPr_}pBkH^Edq1!%K|GAem zqxC~>(;IqD8DQHH_;SfBG#gQqe2;URx~E_={3&Z*sOr>2tzFbat+g~`W8(m8A?}}P zTY3Lr^EUN>h+5n5-Gnm(tc8WKNz`ae$(!Cq-O%0>AHg}3HHtg;b2OQ2g>q2$7^nC` zjrXjLhv80Zcrxq1!s(r?^SVHDwHpxx=jZZqU@BH2AaddOI7Zys-*H?ozNdk8LhxxW zA6rws__EaW+3aB-sNRc)H*u}+b0_LS;~4~3Kt+`ng$eO2BQkNc5dE0?c-A0@I&(k3 z++xkJBW)IQAG`Z}i^8`)Hi z;YVIr``d|Rq=Am_V0~W)=2iRt6i9^|2X)M*qZ4TW;3USvxyuQV@8`C3au?c>A&2f; z@t!*LFEnu%u!w6?ccAK^cXdR82kvD3dlmyUHkBohVSr-SpF$=Jr>{^!Xl2xDmZa4n zP~dn@`j`#v72(Tgh11uvhjfbHG2BM2XSZFz0v9*}(W!ssGS?cw0t^r+gePjid7&P^ zwEgl$_Hm%7`xzeJ)0gCfe3(9;9zmThj7njt{b+zXu4qY#&o325se`5&BwS2clom8s zZ6gl!EsRoI-VqDsb32+FrJh8H1Cn*XrYx z*NB&}2EGInY8p%00PPgeer6No%7Go+Miaw>7dij$E_o$Xhlfdka~sDOQHh}0#@GT% zwPK|)K82;=LKvG$DTQF$D7EP@h=Up7!T~s>_`(06vf4y$Q`1Clz{iz&q52a}sR^GD z3!&<)hh2eh{jgDr@lgFT~B0hIdd{e$L!HifYy-lb*jQKlnQsZG5MukOK#O z#|W6Fd-2lY((Me-GTBi9|vG{#oas@jQrht0M$o6wl!S}#A_s?%&?ESqyN+d`Ak zCR}xz)!wG55`v!GwF{Hgx%5qllGh+gF!^$?L7ZR|)06^Llr~eKL=`3%unB_AF6yLP zkC`M{onlFCCVL43sncvTUX@unt?>H5gnI(`py5KX8s za8Ml;Ote0ln%NvUaEfbf;95Jm6Z@h6a%bxN0q=tYL8l(BS!P*ydLWpa>-XFZ4?_zj;)sl`aGXQ@=A{&+pX?nLTtz;-#1@XLNo6S8rlPS<+Mj|FIY23F#t z*8)GVwGxh$fM1$n?Jjo3etDin`ewhhp+DGuZzIm|&dL1&K3>>Pucc>XWv`XyQbxDX zUvKaIaAKI=sbgF3y|nvoI5U7PPm7dd6x%<>maKb$ajlfh5a;!~ZEM}EFznnCVqnCl z5rMKF^+@zO9N0na4+_yi0pCVsJE%R#F4o53FHCTiM2ox7A zA{Vwexn9jrP0WCYo0-)kAK#kfP^tQqcxF$RsqLKAi1}3@XUC(S&Ew77pAxQu0AsDu-jqWMR)$4^s7WlW*a{K z$d3j=s=UI7DgH#S`e+`^&ir_J1(2#)M-v3u_|eFCF0cp>R7|Y5h+yKnPPD`9wx5^m z(JA%zE=Nq5-ksKq%CFtYSi|1wv3IKc6cl38L00)@YJ7tf0!zL|qM6t^CqrD@O@hd=(++1lTl zy9L=Tw960e7zpAsXjR=(FMm}qt)mzprfGM@>69qS>(t4e_&{iGu2jEjWusqAc47SL z%f=QM&?F`c-hH3R0y3*gQOog^d)ByMIz1lDJ;rHdS)czz);-1rV!LrzMl;L! z4`v)&5FRQ&{}Xwse0n@c12bB@lv-?;(Vw1FeYG{E@`%tk(+8q>>{g6(3pG}L`f3{A z7RC$dpk0->EEz+{lSd;#^cy9E)KqOwscaPbFsx?Q+*N&-{&w8;N)5h1m~{5sucQX? zq#>Brf9`SNRT3*y2PxBxPOxM<;}gBP(uH$RRFA6k@{{M^AWZcv(Yum#{FN0oF4S)( zkZ-eu5&rH(Z{P<2iR&;)3n%wjq`H~MhAQh>l9FWRqa6h=;9X}J z`Y>94j=t(zYxVpmm4-&Hq~}F3+H2Elhl3dO|_EL8p_G z|1c0l1$NO>AuQMLiqmCeW@QKG?f{^m76k?8K7ypv5S&YSGEs`Q76Y#F; z+tEQ@q4z~EUdaEIWY>AVXOX^EZLL0V%LL)7%0_-%wL_1aEWKb!Nm;T4v_FNGny&VW z%_yHYiEHDrRdXVkC@E^GoBIcgd>yV{D6QgR6Ur*NUo1gZkm_C`oHZ)fuT`z;N1*g{ zs*rByllaBlnTcWgNJS@oiw%BQ>l2UI-W0Gq6UYD!T((8R9M|{sI^hP%UL>XQuGM;- z?LeJw5g(cF9-Hq@55u2PN-MS<;3}u$4foi}EEgK*x6O zSyK{VyXNDEG8Irgw#A6!)*iU(S9Cs3q>_YU_=>GXWef0k2r{5V z{tw2J(bzYud=GgtJd?Kg-VT!_>bY!p+Gg1NHZOqq>K03j!%&7>r0Q|c+6&y_p7~om^GmlAiG>2t zhpVbXpGfw#QWQ^JJiZve;<^IeE<(I_Il+Xrw%L5FG+Qb*27$wjxmxs^lS}B?E7BV! zZz-5Y3OvUBEca~pTy`xoy65H~i<-Z*z$9csIh^aI`c@qR9fQJJhqJt(Hw`0RFW-HD zWX&XWR;;reV(_KjJ9T=`Gn6s^+;6y_dUp{rC0v|NSKUsk-YzO=C*AK_jd=yl)e}+I z?mCKx!Jj;cRs-KxB>Re>pix1-`oBow%gL3}9B$0t%UL@E&|HHRr7Ijj#g7gOE9CPY zOj;5n+^Tz5iu;QOdE}rhF%vpl0asZ_uis|lD%T-VZ!gBL?s*b^iUD1Nc_2~# zXpT10gexS&aCVz#FW|=n?Zu+sQgQJR-YGkDdjUzqZ23nsQPr-hZb!;vMAhTo*rg|}_zxXS;=6L((m^F%Z0qU|Dohx9dM`^*vr#+&5xSc@ddHij&CVYHQ|=Es9dpa$0#&{ynfOSO1ps2xl?bn012E*4&z4 z?Z8+jo)|3SBjg-bhCBf7xW}K5LL%~~canmCBp2xXAN6!*cLrRQmSnaDr%_f4a`4)8*rnL=D1} z9;{-hcB8~nvyQh)zMf`Gr0v^H$bziEdpveGzN>qpy}Nd?KH!!4x)59dqv0oNf*K9sSR4gDud&$nzCkf8Qw_Cg`1Lu{p)(&m`8 zHZ)$R<40%7Nw1L9F^U5^ezs>(oI_rAt4lemRDfJ84)|s|4SQsN>Z92Ms;UqLQsMyHGA+nK=AP#UZj9&^F zmx9D3Whx+6B$o0Mp@Z`AlRR5zh<&5Bn4ZH?d%APKTD5Yf*MCS%Zn!{vRms%FPBZrh zA_TPY>8>eYM*0yraA`iOlrOfI=Zn4N*vB#p_XMs7HMVQ-^EZiq$GfJ$>tJ&nfZWmu zHfe(^2-RL2AJH^EEOJaDII6)xBV=%V9KA`WBgXD3M;3EMAEmg;N6{QPfJa;%xS{N*Bz~^sk*2e1~KQ2ro4*AUd z$W@KS3ySU>R|e+I=Vpv=CzYMKW6Xe$#O9_s`LM0#!|BC(7d^Ppl+V3(;I}$682rxU zAl3{erTN^s1IafTb-MD%eC`-b3~j*W&*yFkelLFC2griHaDzF?Gbb7eGyaTji1#bi zPGQ+YH8^(wrNcv`#-~pX;$Y8`smV9toX_&7s18l2+*xh~d_@L}X*rFOYGQS$9jceb z6380c#oBQU!;+zAQf=tR)t9n)ysIy6^C<53O|QN0mkI4^OE!WGwum5tlXLifE4Rhw=|uEvn=C+wt(n|H) z%!!RjQB;?LIP^XDQ=g&1a4=mShiZ$Z(OBF_4ZNXFZ77z(xQrm?^ ziH)ogtbEB=r<+X+M`ad?4z=04(I6-|ON@ra@$p%MjW+ll@^Y%J+EzsvRcA=>d|Qu< ziNV{eyyau0{qhEgf;ziywp|G`$k09}>B<%XoCWX>#$$G!w8dzz>Mott^OjauVbna# zTO~%E9Xv_GE69H>@@G3|XUZZYE}E7n`R}Fv%ur2LTa3Y*5>^Xe`!1x`w`XQ zWDe+yyL})7MxQzp^%|@lJ5edI)}l;=p-cnP^DOxRw!*i%rZZM!-9QRSsdXJD%u=hJ zpM~Fi;R6@E3wDSfGTP(sr7G2=Cm;s&Ef*D|H z`9>EMp**v++3XfNf+os9rcbHVY7?UQwJ;i&nQZqNOHA?(yd~B7+6~fOW6Q#C8fjU)g|c-byY`7qNJr}Y0gcOWsKo~ z!MD=yOet_s3FD}Q7OB(%YpXl2LtNLclWxa8!tvmi7_xTA9WpHzVF2FgK+W9tLpztV zYlC|(0bmy1MF6UlMlI~4gI~ag(b+N=Af_T4E@cSN)(B`N!J=6!*=yCV6Q(067F!L% zB!U%3$C-X|CG8*pI0;C-)CGJv61d`Z)P5P}hP z94o9tzOD?!U8w9`CBSXcl#EintVi}qi@W5Mub&t~XOXU57Z|>LLe031=XF!5mqESe;oc$tA zYZkFA+Q?P?f>4H2aStG+{8}uF(Fuw2ceOY9QmVlZLU$X117)KQ^4%!jku684$dr5J zC811r&@0PBck_vMYv>NN`zqeV``x3A{1q_Nj3FF&o-O~h10rjJ{4ti-DnKNFN%oQ& zMZ+b#gbkMzHd0CfRb@B~3Q`M?{i$f_Re2M2h*%2StzgK;;#`Q67Xgg~*?2RQ0?62G z`603kEHM_)st-(`0=WBjY;M8U6D_4$vNPnLF{{IjDldX)!(oQe5q z-CAO|l^M%ZFkwr}tiE=m!6&7jhtL>B+#}3@@gLkF#EIT6ye%Eff^8%^(W^E{-I6Pf z!A4;ay9RaGqw2TWdpG@-Hc)8t=!|!*lcBais9;Ml$1Gk9X1nt`OQ^lJ91@{gm$8_!wuRz?fyV%a2}@O6oaj;e01au)J1f#TF>x$TxZyR4U&eqFQR zo8&0qBUBL@D#1!vA{iEwdzKFYC%FO#r9dp2wFV~`V+0117yaT zXXAe8#?|&cBlklWy|D;8C(`$@(bZK}BrTbQ^{fYTxz3%|4vC2ECAYm70-(x^J-f2W zlD#*$Ws+o-N5T36Lymx5sPm$|*Er99zWh`$txK%8iltq;@;YT&P>`h>5MFu(bkCq| zEp&xO_A(}Y;!s^8yI&=H2lxFvOen6>7#$x0;>ZCMlADW(99xxnodg#&b|FbCy`>_f zz2iq2zDde!ft_d*Iu7bdj5I2n7GYCfqRz0@V;cGsHP~+MPBG^5Q^YdNaD`$idZ)k{ z#QqF8&?4_elqi%|B~vW3==i%daXo8ZarBn2u=xmbh>zv=WX9jEa<2L!jSfffF!)HB z9OCHsp-1vlY6UTW)AkHxUNOnMZN&q@ovSepFt)ECIR?uHjPq=i(y$FwU@Hunw^8PM zDYF^oqfg8HYczIftwJfr!Nv^Q9#ePh(fCYI4O_|BqnCgDmw_O5X_{88l-lwD%ajx> z^TA<)={azrE?q7{j=Ws#xLYt_*>)mE0R z>2RrTr9XIwv3Rr;!R^s6a7Xy>mJg*uiuns_Q9!|i)FStN1HnWvRtI+az-)2$R&2M@ zzN=uNZ8xqm5i2=vk2kcFX>nrZagAE;i1m{>F^K+M7)(1Fv>(M5o?HP^V6h1EgyOqw+Ab=1TDvhZo#6s0e0OwovXSz0{TknA=kQtxYW8!z3$Q% zTveG2F%b9)ANJ=t1s%gdKp>tXw-hUbEIugCb3 zr({u6;HMz9cyU?z2CkBZrg-ssK2N;3gfAB_F6AS{i+2iZ2JFu$Mb*pnuD+Xv@t!4N zuB16al++cpKjqHc?aq8s$#C^0Vq=t^+$0zw7#F(w*7C`&zHjkKuD*?YqN}f%zrod) zBTP`fGGKpBxkkKLz)ut}uBQ_2GL4DQSwj3T9bkfD0i{0u%~{vrtAv^_z^SZCj(2dTw| zIJf-~vA2-7iM`+CWI{wAwPCf?XZA5@3=Cap1~#J4f#(PKHw0T z&~cmT#rIJn#L^c~yK2lRQraV8-$w3-cOuPIzHR~u`@YFl&IAiP*XGz7xJn;j+<#@^ zx!Cs~Wl18aa<$l3$W<+(*X>8CWn3i(>qKBSeo#*-@3?p|fvfrs>=SkNefq!#Bs|Z| z#}uhP62@$Ml%37* zs1lkd0C+M(K84+#;p0{-4x(KvE_!%zNeq{=Pb{qkg?`A`a~(fgylCgDDsVUW)_rxO z)@fBVhN=h(3Z`wNmZ;PjEI}|$wZEWn(i^C*{01o$j8elZnSA+5jvFivY(q3r_F>Fp zPUc5L^SHxKBU`O$9~J|wSF2Vb6|^_GuGM*}sKYS*@8DjvKa=VRjwkOYsB!@t@>CrW zA~eN2Xn(;4RxShUK8roK9aKi?@gN@s0TL9B%O@AB1)*zkNQg={u5t=^i8=t{Ck%}O zyTW$NRel6E6iXlZCcg;3n*~nn9bIA)d!yjI(;Fw;0O0qyswQM2cZBf7BMVV57e7|3NimLU z*j9BTG6d(6{PwWS4o}rAB84oXB_Ke)#O|fE9r7C(1=!r3+<*&m0j2pmIlh^$K>P~6WX z0j2BKl|tkaEuHo}Hl;dr!d*DX+4E0QJJgFk8+G3K5lWckG2Q# z5K?|Ln==PcPQASyV$x*TrJq z?z))6r_|eNq9yFb{8da0!AtA~!2m&DZ+~PX9tCJKbJ+NaSV(N`oPBTLC3?ULObQ`p z7^1`tFN8tx>Ps~=#e|0DFR;!webBxm@Gf{_NuV9Sgt=Fpb+P}tfX%x09kwp6as@_; z${safB@9kf5(4`f+_*}gg}lrc<8*;v(=D!#;YxF?CU-%PeK3Q5I*qD&LNqFU3PU6T zRA4h%l^&@VU8pRh$r}6?@he8i#yVImFC!a^k#(bRm3T3!bc1ByEu}rlJ?=BWYT~x< zcBeh5-0RdiBZ9({L1DK%x(@sbFy`dNA>5H!8S=MP)R7@|DQ8+8L_1`nh7Mtum{AFx zl)mP?!i7!q%vLhm^LPEZ|SV0sRwXwMjy ztAX^Q(3shZEkDd>nB8vBCY}NYQKo1U5?4jqwX#N5~mh)>!NA_mOf7BkwIh@zC$Bzx+h<7+=GFY{iX@#JAGr&z6Aj#oe%m7n0zTsqqz?&N2PKR?T12h7l5ys(g-oaqcXqlEf zoL^^v$2CBX!+9qI{6qt+a5&Q#;QK>pRy&-_7z{yItTyoNxr+hvG(dsFnZy8hYJl|) z=R5|m4WTJ=IB#LFuV|TghttLY6Er}v!#SS;Od6oX;Y?RRSsj< zX!$|`J&%#k()DIpVYhMe+w2-Ix3cRD`89T(B_Cwh*|MKq=g7~q>m>Ql?3yG$!LIY= zUAUs%!7VBBgABA--p;P6@-}w8Q+BbdLoR05<#G|b=Ew!?xU$o=Huw}*H@{*Wc9 z-{p5%lDb=NWl8E~xrrqoq2zv++(F5GEJ^(+|B)rB`{c)w6l-U##8UkboYQn!d}hJZ zcmRXyvhTqLtvXp5u+bvF4ec4T^w=yp1$D`izlB$!eky6fxob&8&b7V^zsPtzQvq@+ zGPv0@CebaY@HX|fc9i%3pdP*twl<>HaJ)J9t!>i$_>sfKxy)C zko_-&-yKW$f%mB4v(fa7t!TPzQ{Z1_MiZGPfM^Z8?zH4eAD{b`iXF_0H@Ii#{tj%(;)lu`n;c%fhI-DHccPC+~Tx!mCT5%WIEWe9;v37Q(pO4OzuRv8Yl zTnbmlRhwOXvrERg`sS5KxdOAdnN#3}ECiIVy83LwIjO<(9ewqLZDXZZT=U>grJUNy znqb%MB*M7u#+^hCH#Usb2LFNe2y5`3b?A`fbB4)i7M=a9#<>3tEQj z9nR&r{k?WO)8Wj-?PJ<4ruHn{{&48^1cx&lkWwwf4G!nsxGmIfzv^&i;C2PsTAn*MlFfWI`HNY7s@|ovVd`DG%BHTC{=~=A+y^~f?w;r zSaQ;ZZ)@d$u>K=gTVWa$wMWo*1$0+n#FXR6kSpLw2fHP|&~Vxg zluz(1Ulx{MABLTzJ+l`qTxffx>_fb&7I0)|6Flr}es?mNrD^m&^9}Sd%5u-8C-Sf9 zR+%rA!mqDievt0q&>EgCdnif5{TdBLy@^n~k0=O2Q%H~9v4n&9n^IU0+1ImJ@EPLI z5X+Hi@hsI)8PTn{I1~FU~z>P%!U79e(1SE1T6Jpz0o~Si7Xwpj20aR z&q}>5&rmEP4?EF^yLjB}D#DMZ@O$Bx@>L3Hx!!4f zX?GqxTDo!*kDU88e--W@AG#N2IL)*J=ZsV$)f8j8;9No&9DhH4QS}JsGIWxn4QcZ% z(VGuvNn^fkTWuyN7@3kH_C{|~KwvylJxH>hS0#3@!ojv4@?y$y{lcrTo21m-1<1z{uZ9KVPi~ zbaU80hd1V!rAvjnZ+mB%4gsk$A1TT80wr%`$)_oKEj_QL)FeuIDK(B#dnsk6)RRcj z7$}D56))zjJ!N?B8sYp-vG-Pc;z>q$nwr7bZa5$WJ|` zanj^0ITLaa`*_%WQhCMAI@LXw*kmWY>XXBIn#6Yf%ElU_8g*H$7L2W=>Ey`g)JN%z zC^S?iKgW}~O&$Q=d3G~DlcJ&c>C*UZz$MjWp)W(h6?Jg!jzCLnbt}oag;*v<+jLc% zxequ#TQe?AVB0LRiL!up|=}Vbo=~5rH5> z{K&?H2c#KfmQc4&r(QQvuMg|o!7*{)FakXCdyN2=c_volTbz33dXd#$C!~aW^lQVb zzxb=6>c>F_kjaw~;j;~;oir4OVm}faXW|fb14Oq|Utmdxwi-nPJ2<`zl1}9SqkxDT z#+LqUDVdF@`V25mR&`8DWh+HU!tbuvzz_ouMw&Z{ni6_k2S-aPp+=lebk$WguDsVh zo=V{@^^E7BGUyZwOo?=c_AcsnROTEiqgI2-gYH`WDmbLohVjPT;X^gL>;Px=K~+{t zzAEo7s>_IyBIL+n<-{!ymGg<_!hw=F>3$#(rijV2pq7LQmYp;S>>{8NQE#Ga%Uu`@ ze7x1x!&TB!5222>dg&E+6cK9|5uA^w`EE)9rJWNBnlUxW0-3m37DhUZQQNETWFj=5 zh2;jH4z{(>YvFPwBoe%8I1HY7EQgR&K)B&qwk;c|t_LbM#`zl=uAw*Ypf@MUuhV7x z5V#vW4}^E)Jq;nn=GCI^8EP=5oKCfCww>TAp8%A5)(=73i-yx|^bjBv$VJ^59DiPe zih#n0Fa}MJq9^>gd}%z%iF~&?-|av+VvbQ-A3w=1}rZ2$4E@Gt*Y z$`#I(%mNxT>4P%;CMPD46h{F~FPF^w6P*zi`&}qAGeh1#i;W1v8jN+h11W zQdd=kU){si9-5t-PB!&5`Ko>K+#B4B-inh(OkvWShGx-k4Nm(UifL(7%V~K>D;|K~ zvx47g`nYL-^?npw-9D@qO&v`g5w)MJi|hkw5xLRqm!CyS>27OAM8IkI@Ka!bzx6L` z(3;lY({FdxxA2?7o7JX<`_-%dxG5gw@V7KxF7s$Dvl6c5e#>`Rq;a49b*h>g=;Znf zqj`ABZLKW_43M6f6iKaRwlPQfBDa(0#ThPE(*h@BBp z7z*X?#qpzX3on<)8zOxtBXMtZTjE=1#f!BOKnbo|Xe6(D^DrEG27rFfBGC*jv*Ib< z3n4$rXvSm&{>1U)5v;)ymc3>mkpmDM_xM>(#AzVN4JhG7tzuQ8KMCWL)%va)M0`Er z6Q+g`$1ud=g;>Zn1lR#P^BUI*X)|?#0H7Qw1}dIB9(x@3c=xfr7%95V^~a<70Z?9Q zGj&{&@n|R`D6HG^*zu_Il<{Zi)O0u^SrJzzrHw()ng);o>TktK&J_$s`VcBMfZk*( zVB(Pq=#3Pi6EQE-EKGz%$@8lqgkurN=nPY?2co^b<)rrH+Zq5eC=>H5`ta5jEVwNk zj!ekQo18|3!6kY%H^h;VZCgjToK8FvAlC+j+V$AS;Po}3*f{Fu8^tt>{_r~U9o_aZRzBcbH|7i+!Hupo&IJVNYLH$xD2*9H znKlG^8z3ojjPHGLWsuyfYb_P;6K#lCdA%Ts+scT7gEQbQwE(f?X7>UR(TugDdx51o z&6>5S+h@(@u?u7#onx%GThSVCw=ay`6U<_&F$|!e091J}1ffhnVwsE~5KdmOBBTrN znL{8eK-&R=Y?cU>@1(KkaAK<2877{z-iTw633&JAv1`D^MH=;-4xBR0 z$InTobqGHtnWBt%3zX9t)OxdlVxrBGSv)xq`Kl73r9X~5=r${aM2zbvBp^7D#3fUp zBzyZB_UvutD(#K;#6}}dLs3yFVk6>S=q4@NchZz-t~l8q)az~}(C8diU}~Ir^6ki1 z-Kn^XX+v+C+j6j#h{vnxz0}q0u~a(Aow~X$oIQ5Pub>GOV1rErTJDbT$E1!&-6>`( zZxF8?K*CIki%1wL(SrnJpLp$=${hCO1hv#426X#^=Ym20#-+3j9=%k!-nC3`QR1aB z6(@sGyDA!qOv)H`j~#Q|qiFXSC2Z;h$&3>+;IIHB{Dh@^_)=lg)Co$AG-lcXWCMLb zMKukgxyQ7nINGKRhFf$}8#A&JTM<6|?vzEl5rfdrM_1-qc`ieqiZXJ=cY6Xyu&P2Q zPw2K=jl9)ql*8307Xu`8EB#z$GX^A{nz_nXkaC*kchn(~tMxZmc|YK4pWmzY`Sms* zS4H~)unDy3)zR8!a$xeK7}fm0lRkdB^2)QVz;V zZw%&)8XF@(gl)hN9NjqC^v4EAoZ zof8|Zkha}>NvPQxN~g^9Rpxc^qpG?ERN?T3uFAagB)HDG4sST0D!dIZ6f>w6YH8aP z1=*^)SMg@2RbB>uz>zrpAHxRMZ3mlV-~P zb`=&Q<>Tv3anR~Onk z7>R>-k7a)W`oorH;qzf^iY+;fa=q{j;xXRfvna!58wUansu~o*#10~gV=m6|1<(#L z=w=`W1~yaqZtx*HXr>3XV@kb%DCPOku*6y;gfeVgl5zif;)I7nugdJ(OYlb?k8ExB zIJ~A>G?I-l(Zd-XPR4EU#qEqigsHXVG{u?X9ucRoYQY$KBf}n#Fe9}t(L*$mYlsaf z7>~_jVn>(QSp-jGk39w+ZSZ(SSE{v)$0;Z&0|XyDE(e>KW`}2Sd^C>Dflswqi)bga zjI)BMEuvPrnXp)V1sL1xF_%=3LSo6kS;o;Qcq3l93ITvf!mg~=Gfs|YwTppcEsohr zf4HqAUdO$JQ(|)c>6FItZ|WUs0f-OB0b3SG@@Z+7o~CK`{zxAj;afIXxR>x{Nq>4e zLWwQiK3EM~6C8+!!#|8g#x02KsnvRxWl|hxmF+-19kgw`V>ARCcpJzTQlB? zpEB{6ar6u_4W?1i*AJTwq);++mTOYP-8}R)+0Gm1I+YsI>)1r z+%xkqKRW$UreboxbZ7R9(+^Q>xHz4KhcKtWS-;NuC$}MUnN$wtPC(?$V+sRaw7Hd2?s6 z1Qne#rz&nERVQmYwc{+8(}lMW0pDxD_u3TT^8?>FlUmA(lSn7GGu&tnYZfLChI00O z40m)DB?$BWlyXWe-;W4k8JI5sYcsO?@b@zQjsxC=>pOtgA$=HmdVn7+ieh~RfL_C2 z9YC>EJb=dtcog~HMc#U(fpf*#d@eeO^Bgc|(GMq11fNx$qI5#nZ3ru@*|#Hw&Xr0i zB4>l9iVG@jTQE)Ib)Z^t6lF|T%UF)H=9d$!CZEebvTrrs%;##4pkS+_Rr)-hQUl(^ z-)VH;c*hS}(@&n|68wOD2w2o=2FvNp=ZfAvjoO~xR}M91W|Jv+Qjba`&_%oe=jl_Z zt)T&D5{M^V6+Ra-A$L291FD?ZBG&NSH&A3K9Yor1@T&h&)PqGR3fH+$sd--o@eiZe z11L844YVS-&jm678=$op(2^Y1-X@m4uo1Zs436J=boqw~c(ZXa&?S5E9C_c*=W<(c z-48N@V{*HYvmIBYa|Un)n6!lPXKvASn;vD|ornfMRa6$j()Zz~rufX`B5OD0N z(P(15JuY?!t4vt~+KpN+KZvRvjzg$>qjo%k_$E3n62YwSCA$I|4Ux`c0uT1QSy4j+ z2QQpMY<$*h&z%EDVx*uSHy@5hggkJaY0c+O<9ZIbw}7+XsF4m}O@P-bE~q@S3#iz5 zNe-eQuIhdayusRmJkOmU#JW66t?cH*D37p@i`6|yJurlwVR}vvE54zDPI@q+zSd1E zF^D4xYpjd4R+SxrYcat9Si;20TKX-6=)hNrkigCjJMMrjIl1ru2({vV@D>d{wEqXM zBM~SCjEM;Jw0CdUBF3*?12B#dQRt6aAUp-kM+tK~Fz|PS)SBR0ZqiycOn_Y~K>mvC zD!$)2$loAuoD&mt9sNim3E`=WYjd@K3aW7;@E;hjIhmJsLQx0l0CS> zesGpsd0^kw=z_q{(JuA^^?B9f0I{P5Ld45%MBR_0JJA7eG(z=8hKfG5^ZtS~q{Sfv zXzv28`oJ_Ez=k?lScl?N*83ZsORRHA$1)b-r-d*;RI$@v=s@Q1HWTrJzs=N(CJplU zuq<5Vt>`tiDIrN0dY!AhMtz2n(t(jsyYDo(F0dUyl{)A*5N`7k>cAr^og-^l=M#}C z5uHq&6eX+VG+9v<^n2sJNoah4;y&?|aTrJqAqytx)d{zSSmG2(#;)7AN;7h@^h?4u zctc}XM)5Z_iu)K5gc4ZFJ}t*EYG5c-wcSWPl%`}q9f2OCMlWYW7HHoC$W5k2We2kEY`%}Vieyu({UOH z5c~j1ha++(`B8A$42)tU=BN4K>?{d;f8|(YKt@!&4<^-#r(D@D(R`&`i=}dZko&I> z(G8(|S`HkM2t6SCCFK9aG$Ea>I8DaZ&@glRACK7onY)y(*f&CFi3 zo#x~$AA2uQNf@YZ;8s40GLxVQYyg;UXj}wVvzwxmVD#K~hsM-pwV>}`fO9+eQs>$f zSJ9}lPoWQmb|qY{YD{?SKWb3btBUuDUr~b3kXSP)#H!{&{s*%06FSg(sZKS44@7(* z*kJnnP>Iq2H+|6Z{#%XmOmI4xk-MwNl8<#LEi<}nQgFo4#}OZpc_DB&BIITAufjo9 z(Kme{_J;9c-LC`LN#&1$R6Gp4g&);IPRIYK1%&xqK0uxhZLi>AwSWb}k(LiNBYqf} z)VJaV7|?|be@mwlMz7%J56BZZjo^CuRnUhp130GTG*;QdD79809O{Wf^xy+L2(+{- z@3b`sevfx?p~~f4S_QqpQNdKx5vYuT``BBdhiWqnRJlKfV1BY2wL$!! z%N`)p{7`At4-iFL8kcPPXFvaF#*`Iqn&rEim#aq8hkB`rd!zf5s?X)OQK7_2tku_J%WWot- znr8#KID|^dIzFDvG_c5YQ$EvH@D5thRSrb+?9rGjyMn^4^D?bMG0Hq1n}UyfQpN>b z<@eEy5ik=h8k|Itqiv>Cm?ILqmjuq>ZeCina0{WBJ0kl6A-v^u;Na!3Y<*F+TLqq? z*Kvx@ZLprJN==*HI%H2;AVg{zD;b($kEk+RjW_|Xs6|%R&r7oi-y&=MTD-4XueL)j z;U-tbhSPRfvxM>%0Omg z*fDUF3HA!)HnLd3Fz9F-g<50%L0lUge-xu8H;^?{g@6l>o_in7g2nWQq=#~qf530T zFY&{#5@jQQ2mMgh5|WXP5r$5!4K?*;WJH>^&8Mb!U?8wqFceMo#bW{~lZOcSAl;AA zs)py=asR0;7_2(HDpa%Xkg+g8><$FfNy_2`g{pXSDt~<{KRK1Rqzaqx>`stJnSq2x zCy+>)hT9bc$IeE_T1p@!w__U;YBfN`$&8*LCaQ@B>xR*Ec#RM&%1oD2DT}?gZL-RH zbj2#tao##j=HVT>Y*mqQ?k+KBL6wD+l(9Tc> z8!OI8*^6&$(`f{o;J@nY)G#R+P3DZ_CK3vm{Zu0&2|Fj;^OW1$+;PF=vhr86$~p`JeHl-!vI!~;PDr^2hR=SWp_ z1wWdOADUmG6M9l$%Plz%OB&nQ%*s~Z!68yOvCCt8*1_Ipp{;krlko-YoWfMOtay@V z{knCI9qry+N0^n;6REv2J9^Be}UZMxAy%DUvUDRIHml5ZVVhp01&bXBi zNw4(u;fN#gRf^}74!rgr%*%=1>oP4pZ%{qvh|(+5UUjFP$D`BOGKduV-GB+_UwfC( zVz;EE6_bY4Ff*;!W07zgNlCag)*US>MloL0rNY6n%3CV4>N5LZ44TG0n;Jn!a#^#b zK6N$ePQw<{C@Lm3jC&UQtk#P6m?hy%5Xw+RQ17J><$jO-JfgfD!sNtO`6`ukTonlf zPwDw5o_GQkVduhn?6Twkwf8RYF&+Qk_&K>QSrQtADvMA>6>*DTH*ygq#4Q9tNP;vZ zja@~Bjf7^cpo(g%>Qa}gmbQwbGa*W7imJ9zs;MfQMm1WEAnf!0oSjWhXurQc&;R-V z|Ih39nB=|hnfc89cIKQjGspHLhHh+Efft;LOw&tRZfunMV}}A#J6IERC!=;ip2K5l z@1TkWz1ttB73DTOh=!L9@B$5vgu&+Ss(}2U$7*|n!wps@B3NC(h0;YqeeJWf^IA9q zG)LVwE5Ts9uiZM{*R>fI>&6;N8$xeRyuE;Au0PsRA*E&1)Zzwft+RZ-{u$4iZ=Zh> z_uj~r+3UPl+^wt!2JD!N!uKRAEU|8udZo3q9_UQ&u(32&%5~~RbX}Z`PG5%5is$6o z{HeFpwsaSZR_u7X>*H7jjECfOOieDnYhc6iA$XgB(t>^`@{8x@;_CD_j)$rouXZ}d zS*6t14%5}g=(|J?#yQpohtYHskK^#3OFm$K@L;~{nXEE%!OZtvna!%U;i8e9pt zU9ztj{jmnYj^Ue@BG`>CrC;U-+bPuc_*hf$gDTzqDqW?}DG!)Op$ltDlf?wts`wlw z66EbjP>?f0|2ZwKkd`KnwA8Im%N#qtTrlTBsU~;MeXR4HLy>Dm_>Gs;!^zpkgq%kG zMHDwm-7Sr<@>$6<&iHcV+FGwF-#@{9*X(lR)3=W(xvo#FWc#?K5v{?Pke}qx9P95Q zRT(Da=LjkK6TUHO9jL`I@7hHdlr!$I;{TXOC+qR~%`I`7fD23NArcR7b~d=wHM!H6 z93O){N@FU4H?vM!bOC!<0=vztQ|gKX{cr?hpb;kpn)`M(x!e1>;Z5@K>J@+Oj~Jq{ z>amuQ*1tOr4W!v27Ln7^>3$v7^~`Tx?VQps!8znjWjZEPhz~r74Zd{ZxiC3w8pWJY3S? zaIu$HfmalbkcTgOEjooQt`;9tbF0Q0?Pfjy)#byb&Aq;MJ&}2wE^CXv#gXF{jqxWM zxlSipA~e+lkrpT4;?=d%OX*EkZ0yuMv^Y*mu7?3K7uzQ)X?>aP0tWicMUZ$i_r0La zXGqW8$uV9{P1t-6n&a*l@w=ZuVq9I(BJrS(zBBEH7n1$)E)zA1@h8x~Zj=T=FC;OFm*>ky*JPj3 z<@xkhy+Bi*PcPF8+{*Lmy?cQRu9w7ec|MNmL;CRr8t;8y$5>A?W%a=+JnKL={Y=8d z$Jhc7gE99q`hxNB-lz#WWvb(KytJ0r=cVwANkyygj9x+Cn6wB8XFgJRE>ih%AME{5 z0(X;?6!{osLv=cw>7tkY1wKl8aiq%ad}Y}ZCDHoD0ZK!wlQB$5Mk_>*xQq>hP9e6F zrYGu9QcDpj5=D_Bjn*${SaijL2YP^wHG72BE?oFY$0fr1G8@%fs!raoh&ZM714MnuBA1mDNKWs^qI2 zfLGUf`klM&m%VoT#$wbqE-QFdnSz#&OF0gQwl^SKT2nY4FX5)1SwQO@rFxRQne1^5 zws#|q!!AFDM(u!d`VF@?aDy|1=Mqp(XA;$vB`8ZK)iMq4p6m@YHT)#kwnaaUvnCqa zicnKHA;HyF59UH;KPRqT+q1m0Pav(^4c?0m6T29_=(L+~ZOKP4qSYk5tCeA-7s!F* zutB2K-5Rd3cwlcQuBY}{KDO6P$|!)>)!}Z&RN4ZbY>m;DA6aPXfkVx*?$}2eeXVy6 z+ug0bKQr7%H~Fb~Ztv5j?tJ@ZEbtxTX8viR`Od-#rdpXNB^|nUj5ZSo(V;Qoyq>{$ zm8vmn%Rk2g;^X0dRH4?o5r{}Rn5ph~4VxO!$pIYJCtR%bzD6nG-8jdcdRDSS9Gg~u})7v z?EJ9c>>vC1vH3ZE2*e)lmR0;a$^_+M%~u}2mi~-^k7h4g3|M~}8w6slh|dy_Uiow& zq6X*qV~;()l|;v?I`%{1*!(CBR-}6-VG#iK-_ug8pPc9E<~a^PiP}gzlklu#e!IXh zpLuNqP6WnjaEdyPGsY)eR7I*kqiHl4?? z?Z&R4S7D=;4@KaH(F4y<(3d{5X84+)cAf~fgpR#(oNc^#Ap&^xY-3}?C7vJFE-!J( z@6ahcJoCYIgqq_yk7KDbogj)*!@;bQF(RuE?RLW;6jxFo_b}8XFu-SMm4muGGm-Zq z@4cSU;kJ92e8u*+NBPicy&7Eo+=9*<&rh)Ck8gh%t%O$kDM#+(@D!Zdd%GycdNbhc zZ45+NcWcdZHy^?2hUO!ka_R*y%6svuxrH=fNy8;_PQ3v*t0?GZ`X9=j2a-f<#c&2o zUWP}qoLsxq-SL&LD6O)g76YJqErt;{=id9U@QK#Sc|?q|U?yX1A7S*5Fg_JwY#3o| z9uZ;mj4&CKeM%c1_n=xUotj*~w03g6QV*Qa?~<$;J2ZE`AI>q_`@J%=#7>d^NC3VG zg!4};8XC1&(_-|*;*RJCr44WujQ%0q2TRCs`)9~H;fna8aY%z^X!LL_^k_<}J^Z6> z$G)SW{H7|)G|-D}^De=nFK$PTzRqo z?fFVtLjfIzKV<=}@?oJ|ZI^(&pp)rtL8oTAq7%}4G)rx=Qnt(o&lL(E&wKW>|LT)%o@{aY7uS)RMO)r|{V3pgo z=3kX~o&M_A36^NA=5tg#tzV=0pAVhW7BdP5ybd;CM18_C+|4pvGiwMPd-i8;M%k7v z!?)OIdGl~vGJa{EKiuY`n8)B3HRsK+KE(0mF`TaGaPX6I*U;1+hQoM#OnU>)1`gMl zp0mEBu?}*}467`|6pIcF^08Ln`&DI!Z}=Sk$;ay^W-&o`Ei>ILuEy^yFKL)$M(e3N z+;$V8!57tT?4p?(<8S!t0&ZlJEFraV4W@o|eFQ$}u@mP^;_f`)EIN}GJKYJ<9u@?erg%90j)MZMRli+$+ds!wPd&POPcr3s_^oD zc`7a}cK=0-tS++oUgvpQ^S!_Yp2@By8rb)897^Vy>|W9XMsJp%WoxfAesARvDGQp~ zkP8B$1iPmE!G)1OVRCal6DD*h|_~CGl z;sl7l3CBA-0!bjBr*Ol815PnUSbBPAuR+R_{YD3dRnBT)&d7J4ha;Qvm8VU&BG4x2 zlRvkp5qK}g@@t8jKqahkV<;JK<%ShtI)EoIJ8=#hElCKwf(=tgwSiH#442zQu3;5{ zQN<=#*D$}psEa1o_F+x?C>iM3XLqUHJ`YE#_~KrxAlf#$7FzPi0&Cn!tLc@314 zeGZ?|!~9+<#e<#wbT_EnMh2XPHM*Wu>J1HDgJ?}?KsgrcMrpjliY8cI@EC82#TKDp zT>Gx$`(+qLHofd3{{i&LagnD0c|bRdi<}7T0+s>wmf)Co;578gu+ssTLkyx#W2^;C zdF-StacFfcY0-&M$HIyWkA?jNTn2syt^mIPSAlDQ4JZMAy>~3ER4>lhww}S|JjCT$ zoG2OMqN9)4WN1xw7SVoy46G8SUF=Cg-6^^@xD#X&tUSLdi`}g z^9@HTj14j|YD#&gI?8mX?ahExj5 zZR$Cv@VrClQTmhjz9ZJMX?Z?TNQd&B%hQKT{0`sH(}_%(!sV@-eJG3ufd$TzNY^P}->FxPZFH{;xvE#zp6 zZ2?><&Sxna`hFbzdO2+;LbD|7Hg*aPGfU|FNyM97eLC4a6&D9Rb z)#fUu!{cYVlOx<%($$jAn$}p4W8fPNgwq?4U^?HhH|g4C**uJX5k?K>&n34|Zq{xU zn8)s?pV9zpw_9YOpVBtgZk1%9AFM0=&W7oi9iM5lcEa|7Ze=8*pR5P6cQy@uSayx8 zr|mO53LTDf3WM(8a8tV%zGi55GqtfkWyG8~t2O;fL3d1{)&}n&BbJexa(xZCzN_29+`b^IrId9B< z{aXxqcwYW3qK$RL`$U#qV^N}}qrEko$>CV#bc+0Bzo`{y{kAWf<1ie1z=e>&K5kf? zYHB}f6i#_=pmp3k!#COD3|DbqGn?L+kQI$T8%cwQQ;n2Um+AHbH&zb6C3y6J7j@WQ z8gv|su`{k%GKvE;{7f3IyyJ< zmc>-0oEu4dh-g8ttvF3dcRAT2^+C6BZYvJ;oD+nR-&z)Q+xW31t{67B@2QRkbJym9 z8NMdBQKK-5E8iK$nbEjS^RqXgTS!cy0yBz@xFZfj#5i*8N^WAI?Wbl~{)_U`yn*t1 z6NZ5Dz-}5Utd21;_*w@J!Kf~;J|uXkyvRx^FVdh;ytBVXE`yGFXVVK@dXwKyIl;d; z(4;D%n5v{xWhm!G23=ChXd9Igt~qW`ieegrL{TwSS~4Cgrcd!G9ajeBYYRAfG3bG* z5xhm)hW4WTRRldS?h;pHI@`Ot{!mgaVqyYKD65#5>awEqK2TO`MOm3pR-t@9i6+;ruLO3p2ik9 zXyd8y{yi(xJ$hbz(Z%Iz&kE>@pgY#{s0sUEzQYG#jv8xyiau#ice#CDY%x`?TK+hX z15bXj56n8KHr;*FoY*-k+U6 z&Az}p>wQIg_dfT2d6PrS^)F&4Lus$1MR^Ah`2v(j7m^WuotQ_$u8kE zcbBZ`w_NN|Hd8@XSfz_StPG!*rhpf$%M8=Fd-U5vI(K`;=~ zorofgU2s|91%YbYjP@8yZWnp)E0W_h*Kx3-IqIT} z%iu-H{31TTeGyL*Wo-2^l{+4_flOJbZ_|B^vYZPyZmQyW^+&8Zzx($1+(C~5B0 z8cTek-Cw*KXMgQqh*pS5Ph}!fd;&*fJF4jRYu7;fh9b4uc024kk=zBN4y7ot4hQqo>|_J0GlCD^hN5VLSLFuD7BcUg|6jivkH6(GU zb~uq4Pw%86mEBZ2r5SdAr+Pv*1_&oNQ2kzak%j>&zyT{f@^*a7SZP6AhfN}&E*E>cUND-aGO07f7i z*aQFDfi*x5kPb`&qJiE(2Ve%`_5+jJBlk}$HoGH%^6l z3Ynu)6HF6kWLoTEZ0%#(~ODaLt0PL;l>068>cZAQZ2#Mw$>gQd?EbNICMnZiOktk@{=N*!GyQ{z$llhWhU=OC_; z&XhW$lkO;S4@-0yeO(63>=&P)RByB~UDCRulvK5QK?+YX&74Z5)X$WZgocE)QAv_b zbn3JjN<9yh9OXim!BQyYgBnywYC@v3QAvreqvEF-!&B3TqXncS4w;mkIN2zT6F!AA zq*vz>84?wr=4dG}4|S=k?GdTYCLpy?yF%^0?WjF!T~wR!x2dKL+wD|PIs#FEkv_a@4ju5MwdQ5!! zwD?I>9&r?QWa{Mjltf3vlEymg1Th+^7^Lk=YUj)}CQeuCJkIH2s3|dhjwB5V8#XvB zGN4Pxgp?Esy?R*U6s5WcCC-sb$)vc8iBB;lQa6{1$!EY-jrgT(& z;!N~;=?KL)a%N(BXkt=4dTwOMfKc2bNntZg(}ycrb`%cvjHeI|axpEzVI@83G%IZ> zeoCU0ZT24rp?Z!MPL)XwT&n9ZE8&rOe9hWHP4*9U7S+h%VZ)rI zrVPxFe;${>|HcydU>nvmsluE1z%j2Qt|9oFc^1tS)P7aLC|Z&`W)lxf9-AMRz~7eu zwU?faB$@76v|v1Vmx>!oGQJiiMS!UpHU-xMUvD7E^}z+;C&25#v?C?~OuKY?gK4jq z8<=(y7WzsuZGd|RJR7_Uj0>BT4W0`&f-AvkV7if+2*&+Xo)`3_o`Rn4vq<5!M3p`l zdP*;;Why-#5#zL9q0-Z-Fi!iGD*dY}J>A#gS+zv@rU#I8Pi2PT;cjR{85ILXz!@OH zPm)IfvWuG%#XAUS;=(x#TObTlTYq%$#w`xce7l&kEE(pT72Xc_hc|z}S?3Tx@|*d< zVPz2f$-i_TEZpyf`_r4QY-%F?vdOk->_3M;f1~1KC@Ns+_v63UNfW+L{=Unj?!PX& zRE&jHo##7JM&nUKz&Z9HIz>HO=KNd`JrwIG$U>%SK zP#aDMD6NzaN{<hj+w+$e7`v6McDS+hP z0VMZBp-}mdT^G9~{~hQ+-#?l-E)6o=sTJMttIZ_u2sqt2o*>9D;~pBd<&GS>;jebp zUmc{+TlsrJdIEK$k$lCUCsOEz)M=%<`18SEJ^a;D{nf`pyar126uPStKE*_+t^AVC z4RLBxT(Dfvrn zq_#*ArRO=tmg<1&=kJs&(%4xMPz`seazbqqvrd#2srD%EcG9zoo_-pm^qlG`sS#RN z1EqC4?5KTHJEE|?rBJ0z>mwvRmcjbMWkZD3ND4#WYK%OEOTl=ENUE{@TYCuxQJdWt ze~MMrkHOv$Hh1k$*>(22(CNVRN3Ec`6snw~maafXBRG|xPNER6*_*(}kIJ9JWjlL2 zxM~4IE2ZRaDIvF3gioUsoyy^}38WM=h0xw90^8JpoRrF`!BCZYCRlpfba8jZ2jfLdrRHG!M4xW{e-y(dN< z$6rTjqSOhY4}-j?)LrT!1xbC;!W&8hrAYYf3=EJ4Nn>!$b<}wasf!dKb;WoZB@LFM zr6JN#X}B~(8mahP|l6q<@bmb=%Fuw%MggLywEMEj>M!*eZLr2N-`eCx%2YyfMW%=2G zvK&1~mRkbxfY$(7es8!ee}wQmz|Ank*(gAk%Yb!ApRpU#iF|}1y@p;$XHbp1UTMi_ zS=JyAKFGuC$mclZ(-bSqAH(iLaL9OB{tIq~jzL=CCK-9$1^A4W<+sMkas={eL7ZEV zPj94w+}B1P4+5)^Cq44n3il^ZM?NP)HXivbKt5BDhs(&P z0r~7U0cD5qa*)sV$mci6=jVuH;bd995BI^yV{_#37_c7sT#tOFBA>~~=ThWz!BEs6 z!o2tl?spXBm>YJ%KtLmC^}N8Lr(4xn&J>6G6ZZtRo~vNr&vbjoiHH%dOq-k`|Dy;p@K6=M$ET-Z_kI=}#s zqWO|E4{mT7b-JN)(g7_1Qi>ag*71vIsT_3zWJ&iN4=XBX9S|%8kHlqm)WaigaI;bd zKXlJR8mcE9U;s!_T*Uy@o#X27(Cc7!0Z2WZ9wb?*XB}9bo?@7*!hs`d2Rgt2kW$jD zP7my;oOFOQ9MU79da2TzPDLS=*AhQEzyOfa0nWFLWF|%JOh+1#YDzPuQ>~~S>HwOn zkfQX|a03IiQyt)RL*Xc82PQ>jN$pq%I7_A~993Y{&UNGjb7xZIra3@uL#hOzs2}J^ zBixW)38MN(=_h3GjEnTuVu#KEJF>6g#vxLENfHd`NF!>K^h)_wHixcQaTfv|*~=<7 z57!0tQ*uMOB0cC4Mg3R@TXIACM;yQc{kpRbOm0XIdPKp#Djd>3;s6$~572={I8?=t zD7fjWgRO8wRs4v8n{GPT3OC&zaR3V%hjb($M^IF!q#SM0p{HM6wf1jyTVIgnO8|uW z|9>$X@t2_)jt1`rKWv@|yPlBcp*j13A2vt8ZUx*-1)l*wY^LE}1DOu8w%~`%^Y`$( z8$AtD+Q+>6cyQ83yz`Ubi68RoMIHue^lpA-HSsR~&IoYK2Ygd~GQZCgzj8N7<9G6# zE5Hfw@xIaE89VrBAMosVdB7PrgOszKPksfwW*a{<6ue_AU-JZ*ZQ(7yaWzQi-r;xG zfNyN(+hf6+&HSmRVE;}0@+B986uOZw+yqYAz>P`ZoVR(WcHj@z^OHAZ_Gk`>o{-n}VZXVuVfsn;v~vncTV z6?|9mJ-u{nIe*Or)-LB28t~|4-2C=ky|f{hj|c$YSjuBg-ofqrQf{9JUSj1#Zdd4~ zi%a_>QN+W(yz5Z|kLRb9lX2aK{|}{-5P~Df?y4mx3=X=D$7-?!K5WIsBJi zTD6F0jt7@z^WW~=(o50VJmWR+2U$Eb0PK^+KltiTy_CL?FHHrX%j8ei0r$$}7k2)k zm)4tkok3s^GdGpqM0)1)SFGUO8GK6zaP~Yt<4ar<#=XS5q=LK7@XihRGx0s^z^jaWg8@8mCSUo>Z+dBJI$vr9N4~%}cLW>K_{ZN~*Gp|v zdG1_r(;2)`OR&#$KK?|hUUEy}lhVMI$$YjS_|`NYnfI$+x;~X(nnFB1U{=ixWjnf zlwC#r#Bp0PIC>nv=m(xSmUsI67riul4EHsHm&Wo@Ex_AH^XI<0f_5{CCoTYAjNxB& z1XqmY6+ir}m;6TZ(aXR+M{sjr@VMdp((jj19>e&Wx4|2R^2O2Mf@r?m1za|Szq98j zl*17I%@lCxU>?^PoEF9X3ybyAx=6lvKDclYU(y9!Igq!z`lDXzG?07037$BB_a6*i z8^MF!zyml3{25uX|x81vldg{j; zeGJ|n%ts}IZ3aH21-OHOe|i3bUP{sPj1}NLeR-XM;L1Kc)fH^$!y6y`UN7bJ=FN@Z zb3r_-BUl&257^El++MuFTK-)4_OMX=+4(ifJ3|U zH)Qa-ZoDo34&~F8m(K-bDDDz8f6bg%6qz-rkwdZV#3^^WtmY zpxit0gImD+pX1XfgZ-Z4t6PGN9r<5Bp3_T3&+-`?z+Io^^Wwm3JMe8!fh*c`&x>E9 zT-$TYTj0EQ{PnTmw(a=orr@Q|@E#Y>BL23##arNUZTT;8;G<9TtY+X&PxEcXUm?6U z{LTijTO0oMByd`5p5qTL_U8rH&LG|XJm6jMp;o+o3b<`69{DVIT}!_E=4p&4EqU)f zU~>yTW;Xbij*sjOPSA1FgHvdC&H2yy;K=6u;39BAGrl1b+`AdS?hW4a6hC|JOVr;} ze9i0N?M?aZ31D4Q{-Qs4?UVc)TOrEjNxphFcvTagJ`1dE!jpS}S2X6!UBQ~hJmmNn z$hRMFw*sv3UtBo}b3^|8dtjf2eBVs)ss{W@5ZJE)|HBo$)|b~m zc|tGw`|^dW!S6i5CyfPndV;TQ1Kv}gd)+8N`s?$6ec+?@cpo!3vL1hC0JzA9pLznE z;KO4s9Y_21=C-Zi+1|YS3t%^IJ|zgeqAq{Q9jvR%hkSKRFYTm=)_CwP6-SVNcmD2i zaBp|sU^TeNjgLtHr@8T!oxvJ6zWc#p)SD~ca2jlIzvO+zmoY2+rYOZzIP6Ig~VmpP*nBE=mXZQ?yTqi%;BPOobD!@;{1@1qnc(d2 zS$qrd`15Sp=}&OID`L`oaFg#?#IxYaZ&=aAJ?Mw$*zTp^g0ERZAMoz8?CftJqyK%y zn!OEPa)#}X2G2Xq0$jl~~WPeTpk11sFPlAVi!E#T1i1eRin-+p2PcUr{ z@W2Ary>vJ1kFzTqz{8HQVKLy*pR*=f@c5(box{8IQgS{!FdIDU2z&K8aQ0z#;_3%_ zX-yuhSP$OHS#%8e0Ari#g3o-$VvfI$@%a!-F@vQ;EFuux>>$hkb0_k9fK7QHJo;0X zHU&I)KQp%kuiM8){qP>fv%T!Kwcx9tFvAFN-A~vEA8_|QtV`hzH$uA zkLBFnrk6JDV9EQy#qY8sFM^xB%Sw8H$8Tqrimm8x+t{X0!B@7j?k|DcZe{CwgJ*1E z^B!zL`+kQ#mj`~ZnR#V_!#A@!Vc=Dpm`ww|w2}4x;vI~48yQ;$p0|M=83rzVo4wHx z-0W@k*Y}&zzt*$XZ-bA%#lD{mZt@mu@C@0nV{LA1LVI|Vv5&#JH(7@{;JI(GmU{5F zud{dD!ChWwm0xT`yIsqETnWDZ8vA85c<^iNvJU*g8s=i#fN^jQ`*0UHeKqU(BDiQ3 z^DuyWtzvyW!JA%Xv(LP(mukPtmc9;7TgeW`gTH@;g|r8UzQQ)#T90x7cFK% z-r$(UEarzd^wQZyZ0Qd0utg{@@R@9OH5@!Ro0)ydoW)-L`E|&%*o=?B=N7W=nc$d( z?8hPC?=xBF=HQ8$tmE%%QU7MvkAaiTOkM^qUcffRfp5)chdP3#`AqlVHRL0MJvasS zpU3`K5AOXEo16w7F_-NN22Y*CboIg6vzg|~8npixna3yK{j=EK#o!_nYZ42-Wn?Sb zfqjkaP~~cjFEd%;De&lY_UcCPycbwsBlw*(wy{6BAeA*}0xp}u`u(;FM=+mFHPCbQc);B%9hJr3+MiJc4pN5``@!*^|rs)YT9EbFPwd2^CD=Sc5W7(ub;I(7ey_MkNST-RU+%}f& z3k~<3sSgp=_B2d?uQiCxQK=SzHi!_7LXp3oabYzP+A{_y@Cy z-(Q0E5X`2Y2Wx{_?N7k74Q$yf;9@_?o@^e7}{3rGHpx<|^A*D6g zR|7r+43Zj#rs0wbS$8(|Rim-{bKTXrd0@z=YFzL>p;u$(%bMP5plTMVv1La)riLSr zlusupcg}oQ**VLCZ+7_a^hm)zi)W9$%se$C7{Zs?u zK{as#*Npptl5SH#llZP3vhK9hs{yxWHPm?}eRaOnd6AGGC!F>UM%naHgYu~ckK4!p_3cAx6KD?-wGk&o`%v150rr4-0Rer$?0{pOg3L^qj~{|i=Aa$> z^#n;8z+3Lf__Xzam4`ZO^ABC{9)R(0fZmd$`RvQW$j{!}u>)ww;16+1+}Z!2M?4e< zqIJZLu$1%}!04Cu1;1-H82Y@lqtEXeU2wt5w}K~rb~QLJu3NBYRm!Z87n2V}!ed6E43;bXD`BzYgO6IchV0OkQHzzBe3w3ZQ5N@=1e zeyFhUayJ@8Omol?;F;iIkT)0hX@WZuBY-?mG~~42mi$c=tRsee12OCs1vZlgY#@fb z7)1U($PD|@f@v)Q$yb1eL$0h`gM7A-_Z0Fo;GvMy`dsoqRd8Ek_}?we5GnE;!4bre zmw_mLH(@_QurGKdJpBx&_?2~$FdK!uD>3{RfGB=t9V+ArLhdi*+lAQ~ezq`&3b_qT z@x!a~GfptA8=&ylf<{0-T-eVO+?yEkA`sONtwW(eQUoh2ULoHv%*t9)$d?LpBr)U_ zAd25r*bft2A58h*45s|I687nWyAZ?wQ4r#jbcZAtR@It};h#|iMqWJNz zq<@THWyK=ot6--5hY0(*f_o7|ehx(We?r(N3vNdY`5s|*w$CNPJW$AQfhm6K2ULDB zf@w`m9?YaD|H_MWm}ij%xH~bzF9cEkl{FEtPa=D88)C?J3bV6)FBax-A-@i$_~BIX zH(qcvVpy&NQT`_jdu3ci_sTn>8G>omF8Mzs%yk7X6Fit0@=B1p{|^;% z>Q7YvSzvYle?iDQ6T|-z5T)N)zVSldLdZ7>GYv14zD&Wv#PEL^ME;%Sqb#6+J6hjE z@|7TU|DQwlkOvY&eio$e|I^4G@@I%4|45jjRqQQ-2N1*Z4-m!gChSKFZb0@3#{~&j z_kWX+cO!=XlOT2fPZaXjLcT+oo$YIpFoy~GuV9KFQ7J!hf}bKr_-}yJ{Xavi$1P$e$MS4}{s7zn6u% zzmVSmQ~U@@$^Qhw%JmkO>tR;+f0|2BW6={sehH-R|EXjT`E$gOGhud)Ps@dQh>$-3 ztNVYnko$oD&Gr8<+)?_S{ePnHuOmkM8-zXDSC z|Jh^@c~4@09||+96#E>(5yX(+1X29X{y##9)ct>w@ZXXc`QIYUE`k>d?neyyFCdB^|4Jc@5!{3r z^3@=9|DP-5y@dQ5u)6;z3wb*s|3sLb?Q@AR4;1phz!bl;|HlYW~a3TK74pVH{wi4A|K|vKppbtJR`>sDLjH`9e=N+1N-1B9-~q(2{1Zg+JNxHIA#XtT zsQ>@!`u_#osr!GT@ZXvk;lC%$&i1uPn8Sp;6io3u`+uB}KPBXEg4O*$L&*CG`311L z|4$e4XNCNrFxL^BD>zEX?|~_PXa65ALcUL!y#!kY4-)d*V2a;aKcj@a z5%}-=|BFK2gBa;M4N~|2DMJ3Vkna*^XZ~Im=KezdJDB1}P)hzEzW%=rYjyvB`1=1N zv z}`e{1YAissAeRBOw%jXPA}vJ2~Q~_OHZ`3n9gS7-nbu&?@<-JWxDT zR?PuDumGSkvLjt~IIzP3K7k_H;lK_D^hk-`fSA_eSqYHc$VDC`5CVUs;PqcAr~7~9 z`2R&m|EHv5_h3iSnHRap??4}Y87F{4zgFlgB5@$8(BBydnb5Zz;3Cf!`tcDof;&|F zcEtm4__HIX}w%GK&_X(uS z%PYXtPU&NE6tWqNW-ZMI)7-%bra4?1SO-o4(;P4XOk*K^mX5A*BfvD*q|et;p9=+3 z-|r1Z*OR(}X)e?OOk<)yxFuKzZUt@%_6PfcTZ4VTZNP3|5Gk`yXjLCDW3Ai63g;dQ zE3@5xaocyFE=qdg!#W0so!wr?aJzemc5UPG)%W!dyJEp)a!s6_=CH-D>?>uaxyVn& zy2veo4_|P!7d<5$1B8sD>$^cq`8NR6pUq$#IcTT6(luBIIFsXd)zNm&;QZM_pa3`u z^u`zzC!PDZo@90hkDk14aWQfM_5RhyX%?-asdyEuaI)y&vEM zXn;z5zwj1d11o_Q_-RS&;0vcbCE{_)Sa9uQ0vup)b?p^Fb0?nyas#%oCE#@>LFvDfWg3Y zfWjd^bUzUb&`7Wb*aLhG(DNZ$fAJg;1<-NaRceEap-NxiUah~YsnQ$PX{+?n`QBA} z|6BE)dh?pK4V`-3A=cQTcjG6XT-KHJ8-FW2_2iMS2OD%{>pw|rzy1Bs-8pF*Ic3)mc9m{_)In*_mxZ+xj%x zQSpJ#&z~Q?8(O;U+@H5ge;PP<_35z0!sD;h-TJ|X#y@WkuanqFYsy?~nsp)~YIMIV z+g=R}>bC!*--btR`z5Z==W#*S^()8NHt%dm+@Tbqzy>C3_|#VNe^^e^Sz6>&;PnZV&luB8}0k*rv8j~tL*+y_TTyWwi|lG*1gkGcDaAnV{xfIpwFRxbAS0} z760~{{>c6Nr{c5gy;%6(75#IOV}FV|%2utudP2YQ=O412%X zho@KR{aYQoeCR+>=XmQ}ef-GS!}C8JKCk}43HtADJeTXiRxWCAFI4ZZ-%=8|<>_A+ zY;UK}*tzk_p@eziXMPyjck)Xfg{?-sm}P$@v(GDcdo`XrxpheAyq&#USib7Hu>WiO zrTgCnUCbG+dGbTs&x^OZ1|7=|>*u-mbyJTE9eV}5(DZDp3tesuSTQDW>&q-})c0E! zZr$`rm&;Q>s<&;}+o7@hd^)rqaOK(VU55<+;MDW2m&dxjlXvMz#y#7yX6vuzj2ZPx zZyuf1(r@sf#7XzFmhbXdl~M1?vzOjJb+*9mhpk1*Z5oyFWA(TM9+$x55_nt!>Jl)w zg$c7ug8{Rkf6%MlE7Qjs7S#qb!Xf;Va>|@s!=0H-&N+^g+r9g$^4RB%*JJw{{d?#i zHp7cZJNf=wWmefftaqBLn5H^(UtX=0v{JtC_>uGvn-!O4{1Qk}{?$+{|M};i%3N(< z!?(GHsfM8{eKl;W4NBT!baJ(XEXm|7cPGONd7-xP_v(RtfnE(q*v@n)@tEPW3jbf1 zFY>WKjfZoAwKRsBsJXrn?$vb(y*h7Z{pru1?W0EHV=MKz^zb9-I3m06B}Su zL!!sCY7~pM$hFOgc2Hc6OApOVsKw99o24JM{NIAJon9KA% zC;!%0jj26$c2=VZYpv86ozu3f8b14S^=g>ge!oYJBCJxl3rcbq*vDs>D6^fdUf5C zUZjQ6BVb0`QA47(q=LGwlD-%+HPmgL^ys&9s^+ok)`!2AI`Q z=S9)Od9_lH6{N40C}G1$Tn+WuMtb$w=N!Y-iGc=SU{5qo0R+$|^l7!MHI2*dRA3oJ8J1HJim|i; zzFnPwStdZ{ge&w4VDBp63HB6WG)H*)N@{X+M5oymk$Ec7QakqnbU;-*hyL%CSwhnW z%nrgYwEwc5yG1G`q(!?#zmOtPp1ZY@8`>fM^H5E@@eln$YCA_Ajie9^n?hnVQ%QR? z5=5FvxI+~dI{Y2VL$%@`F%*7LSa|3t)iaa root directory "\DXF\Samples\Multimedia"("Sample Code") to design, develop and test your Application. You may also reproduce and distribute the Sample Code in object code form along with any modifications you make to the Sample Code, provided that you comply with the Distribution Requirements described below. For purposes of this Section, "modifications" shall mean enhancements to the functionality of the Sample Code. - -REDISTRIBUTABLE CODE. Portions of the SOFTWARE PRODUCT are designated as "Redistributable Code". If you choose to distribute the Redistributable Code, you must include the files as specified listed in the SOFTWARE PRODUCTS root directory "\DXF\doc\directxeulas\directx redist.txt". No other modifications, additions, or deletions to the Redistributable Code are permitted without written permission from Microsoft Corporation. Your rights to distribute the Redistributable Code are subject to the Distribution Requirements described below. - -DISTRIBUTION REQUIREMENTS. You may reproduce and distribute an unlimited number of copies of the Sample Code and/or Redistributable Code, (collectively "REDISTRIBUTABLE COMPONENTS")as described above, provided that (a) you distribute the REDISTRIBUTABLE COMPONENTS only as part of, or for use in conjunction with your Application; (b) your Application adds significant and primary functionality to the REDISTRIBUTABLE COMPONENTS; (c) the REDISTRIBUTABLE COMPONENTS only operate in conjunction with Microsoft Windows operating system products including Windows 2000, Windows 95, Windows 98, Windows Me, and subsequent versions thereof, (d) you distribute your Application containing the REDISTRIBUTABLE COMPONENTS pursuant to an End-User License Agreement (which may be "break-the-seal", "click-wrap", or signed), with terms no less protective than those contained herein; (e) you do not permit further redistribution of the REDISTRIBUTABLE COMPONENTS by your end-user customers; (f) you must use the setup utility included with the REDISTRIBUTABLE COMPONENTS to install the Redistributable Code; (g) you do not use Microsoft's name, logo, or trademarks to market your Application; (h) you include all copyright and trademark notices contained in the REDISTRIBUTABLE COMPONENTS; (i) you include a valid copyright notice on your Application; and (j) you agree to indemnify, hold harmless, and defend Microsoft from any against any claims or lawsuits, including attorneys' feeds, that arise or result from the use or distribution of your Application. - -If you distribute the Redistributable Code separately for use with your Application (such as on your web site or as part of an update to your Application), you must include an end user license agreement in the install program for the Redistributable Code in the form of \license\directx end user eula.txt. Contact Microsoft for the applicable royalties due and other licensing terms for all other uses and/or distribution of the REDISTRIBUTABLE COMPONENTS. - -2. COPYRIGHT. - -All title and intellectual property rights in and to the SOFTWARE PRODUCT (including but not limited to any images, photographs, animations, video, audio, music, text and "applets," incorporated into the SOFTWARE PRODUCT), any accompanying printed materials, and any copies of the SOFTWARE PRODUCT, are owned by Microsoft or its suppliers. All title and intellectual property rights in and to the content which may by accessed through use of the SOFTWARE PRODUCT is the property of the respective content owner and may be protected by applicable copyright or other intellectual property laws and treaties . This EULA grants you no rights to use such content. If this SOFTWARE PRODUCT contains documentation which is provided only in electronic form, you may print one copy of such electronic documentation. You may not copy the printed materials accompanying the SOFTWARE PRODUCT. All rights not expressly granted are reserved by Microsoft. - -3. DESCRIPTION OF OTHER RIGHTS AND LIMITATIONS. - -a. Limitations on Reverse Engineering, Decompilation and Disassembly. You may not reverse engineer, decompile, or disassemble the SOFTWARE PRODUCT, except and only to the extent that such activity is expressly permitted by applicable law notwithstanding this limitation. - -b. Rental. You may not rent, lease or lend the SOFTWARE PRODUCT. - -c. Support Services. Microsoft may provide you with support services related to the SOFTWARE PRODUCT ("Support Services"). Use of the Support Services is governed by the Microsoft policies and programs described in the user manual, in "on line" documentation and/or other Microsoft-provided materials. Any supplemental software code provided to you as part of the Support Services shall be considered part of the SOFTWARE PRODUCT and subject to the terms and conditions of this EULA. With respect to technical information you provide to Microsoft as part of the Support Services, Microsoft may use such information for its business purposes, including for product support and development. Microsoft will not utilize such technical information in a form that personally identifies you. - -d. Software Transfer. The initial user of the SOFTWARE PRODUCT may make a one-time permanent transfer of this EULA and SOFTWARE PRODUCT only directly to an end-user. This transfer must include all of the SOFTWARE PRODUCT (including all component parts, the media and printed materials, any upgrades, this EULA, and, if applicable, the Certificate of Authenticity). Such transfer may not be by way of consignment or any other indirect transfer. The transferee of such one-time transfer must agree to comply with the terms of this EULA, including the obligation not to further transfer this EULA and SOFTWARE PRODUCT. - -e. Termination. Without prejudice to any other rights, Microsoft may cancel this EULA if you do not abide with the terms and conditions of this EULA, in which case, you must cease all use or distribution and destroy all copies of the SOFTWARE PRODUCT and all of its component parts. - -4. U.S. GOVERNMENT RESTRICTED RIGHTS. -All SOFTWARE PRODUCT provided to the U.S. Government pursuant to solicitations issued on or after December 1, 1995 is provided with the commercial license rights and restrictions described elsewhere herein. All SOFTWARE PRODUCT provided to the U.S. Government pursuant to solicitations issued prior to December 1, 1995 is provided with "Restricted Rights" as provided for in FAR, 48 CFR 52.227-14 (JUNE 1987) or DFAR, 48 CFR 252.227-7013 (OCT 1988), as applicable. The reseller is responsible for ensuring SOFTWARE PRODUCT is marked with the "Restricted Rights Notice" or "Restricted Rights Legend", as required. All rights not expressly granted are reserved. - -5. EXPORT RESTRICTIONS. - You acknowledge that the SOFTWARE PRODUCT is of U.S.-origin. You agree to comply with all applicable international and national laws that apply to these products, including the U.S. Export Administration Regulations, as well as end-user, end-use and country destination restrictions issued by U.S. and other governments. For additional information see http://www.microsoft.com/exporting/. -6. DISCLAIMER OF WARRANTIES. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, MICROSOFT AND ITS SUPPLIERS PROVIDE TO YOU THE SOFTWARE PRODUCT AND SUPPORT SERVICES (IF ANY) AS IS AND WITH ALL FAULTS; AND HEREBY DISCLAIM ALL OTHER WARRANTIES AND CONDITIONS, EITHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY (IF ANY) WARRANTIES OR CONDITIONS OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF LACK OF VIRUSES, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, AND OF LACK OF NEGLIGENCE OR LACK OF WORKMANLIKE EFFORT, ALL WITH REGARD TO THE SOFTWARE PRODUCT, AND THE PROVISION OF OR FAILURE TO PROVIDE SUPPORT SERVICES. ALSO, THERE IS NO WARRANTY OR CONDITION OF TITLE, QUIET ENJOYMENT, QUIET POSSESSION, AND CORRESPONDENCE TO DESCRIPTION OR NON-INFRINGEMENT WITH REGARD TO THE SOFTWARE PRODUCT. - -7. EXCULSION OF INCIDENTAL, CONSEQUENTIAL AND CERTAIN OTHER DAMAGES. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL MICROSOFT OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, BUT NOT LIMITED TO, DAMAGES FOR LOSS OF BUSINESS PROFITS OR CONFIDENTIAL OR OTHER INFORMATION, FOR BUSINESS INTERRUPTION, FOR PERSONAL INJURY, FOR LOSS OF PRIVACY, FOR FAILURE TO MEET ANY DUTY (INCLUDING OF GOOD FAITH OR OF REASONABLE CARE), FOR NEGLIGENCE, AND FOR ANY OTHER PECUNIARY OR OTHER LOSS WHATSOEVER) ARISING OUT OF OR IN ANY WAY RELATED TO THE USE OF OR INABILITY TO USE THE SOFTWARE PRODUCT, THE PROVISION OF OR FAILURE TO PROVIDE SUPPORT SERVICES, OR OTHERWISE UNDER OR IN CONNECTION WITH ANY PROVISION OF THIS EULA, EVEN IN THE EVENT OF THE FAULT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY, BREACH OF CONTRACT OR BREACH OF WARRANTY OF MICROSOFT OR ANY SUPPLIER, AND EVEN IF MICROSOFT OR ANY SUPPLIER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -8. LIMITATION OF LIABILITY AND REMEDIES. NOTWITHSTANDING ANY DAMAGES THAT YOU MIGHT INCUR FOR ANY REASON WHATSOEVER (INCLUDING, WITHOUT LIMITATION, ALL DAMAGES REFERENCED ABOVE AND ALL DIRECT OR GENERAL DAMAGES), THE ENTIRE LIABILITY OF MICROSOFT AND ANY OF ITS SUPPLIERS UNDER ANY PROVISION OF THIS EULA AND YOUR EXCLUSIVE REMEDY FOR ALL OF THE FOREGOING SHALL BE LIMITED TO THE GREATER OF THE AMOUNT ACTUALLY PAID BY YOU FOR THE SOFTWARE PRODUCT OR U.S.$5.00. THE FOREGOING LIMITATIONS, EXCLUSIONS AND DISCLAIMERS DESCRIBED ABOVE SHALL APPLY TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, EVEN IF ANY REMEDY FAILS ITS ESSENTIAL PURPOSE. - -9. APPLICABLE LAW. If you acquired this SOFTWARE PRODCUT in the United States, this EULA is governed by the laws of the State of Washington. - -If you acquired this SOFTWARE PRODUCT in Canada, this EULA is governed by the laws of the Province of Ontario, Canada. Each of the parties hereto irrevocably attorns to the jurisdiction of the courts of the Province of Ontario and further agrees to commence any litigation which may arise hereunder in the courts located in the Judicial District of York, Province of Ontario. - -If this product was acquired outside the United States, then local law may apply. -10. QUESTIONS? Should you have any questions concerning this Agreement, or if you desire to contact Microsoft for any reason, please contact the Microsoft subsidiary serving your country, or write: Microsoft Sales Information Center/One Microsoft Way/Redmond, WA 98052-6399. - - diff --git a/import/DirectX8/doc/DirectXEULAs/directx redist.txt b/import/DirectX8/doc/DirectXEULAs/directx redist.txt deleted file mode 100644 index 489c14a9c..000000000 --- a/import/DirectX8/doc/DirectXEULAs/directx redist.txt +++ /dev/null @@ -1,19 +0,0 @@ -DirectX Software Development Kit Redistributable Code -------------------------------------------------------------- -Redistributable Code is identified as all of the files in the following -directory on the DirectX 8.0 SDK CD: - - redist/directx8/ - -All files in the above directory must be included in any distribution of -the DirectX 8.0 Redistributable Code with the exception of the Broadcast -Driver Architecture cab files: - - bda.cab - bdant.cab - -Both of which are considered optional DirectX 8.0 redistributable -components and can be removed from your distribution of the DirectX -8.0 redistributable components. - - diff --git a/import/DirectX8/include/DShow.h b/import/DirectX8/include/DShow.h deleted file mode 100644 index 54b6fbfb2..000000000 --- a/import/DirectX8/include/DShow.h +++ /dev/null @@ -1,78 +0,0 @@ -//------------------------------------------------------------------------------ -// File: DShow.h -// -// Desc: DirectShow top-level include file -// -// Copyright (c) 2000-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - -#ifndef __DSHOW_INCLUDED__ -#define __DSHOW_INCLUDED__ - -/////////////////////////////////////////////////////////////////////////// -// Set up constants & pragmas for the compiler -/////////////////////////////////////////////////////////////////////////// -#ifdef _MSC_VER -// disable some level-4 warnings, use #pragma warning(default:###) to re-enable -#pragma warning(disable:4100) // warning C4100: unreferenced formal parameter -#pragma warning(disable:4201) // warning C4201: nonstandard extension used : nameless struct/union -#pragma warning(disable:4511) // warning C4511: copy constructor could not be generated -#pragma warning(disable:4512) // warning C4512: assignment operator could not be generated -#pragma warning(disable:4514) // warning C4514: "unreferenced inline function has been removed" - -#if _MSC_VER>=1100 -#define AM_NOVTABLE __declspec(novtable) -#else -#define AM_NOVTABLE -#endif -#endif // MSC_VER - -/////////////////////////////////////////////////////////////////////////// -// Include standard Windows files -/////////////////////////////////////////////////////////////////////////// -#include -#include -#include -#include -#include - -#ifndef NUMELMS - #define NUMELMS(aa) (sizeof(aa)/sizeof((aa)[0])) -#endif - -/////////////////////////////////////////////////////////////////////////// -// Include DirectShow include files -/////////////////////////////////////////////////////////////////////////// -#include // Generated IDL header file for streams interfaces -#include // ActiveMovie video interfaces and definitions -#include // ActiveMovie audio interfaces and definitions -#include // generated from control.odl -#include // event code definitions -#include // declaration of type GUIDs and well-known clsids -#include // HRESULT status and error definitions -#include // External device control interface defines -#include // audio filter device error event codes -#include // DVD error event codes - -/////////////////////////////////////////////////////////////////////////// -// Define OLE Automation constants -/////////////////////////////////////////////////////////////////////////// -#ifndef OATRUE -#define OATRUE (-1) -#endif // OATRUE -#ifndef OAFALSE -#define OAFALSE (0) -#endif // OAFALSE - -/////////////////////////////////////////////////////////////////////////// -// Define Win64 interfaces if not already defined -/////////////////////////////////////////////////////////////////////////// - -// InterlockedExchangePointer -#ifndef InterlockedExchangePointer -#define InterlockedExchangePointer(Target, Value) \ - (PVOID)InterlockedExchange((PLONG)(Target), (LONG)(Value)) -#endif - - -#endif // __DSHOW_INCLUDED__ diff --git a/import/DirectX8/include/DShowIDL/amstream.idl b/import/DirectX8/include/DShowIDL/amstream.idl deleted file mode 100644 index 2d3bec9f8..000000000 --- a/import/DirectX8/include/DShowIDL/amstream.idl +++ /dev/null @@ -1,336 +0,0 @@ -//------------------------------------------------------------------------------ -// File: AMStream.idl -// -// Desc: -// -// Copyright (c) 1998-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -import "unknwn.idl"; -import "mmstream.idl"; -import "strmif.idl"; - -cpp_quote("#include ") -cpp_quote("#include ") -cpp_quote("#include ") -cpp_quote("#include ") -cpp_quote("#include ") - - - -interface IAMMultiMediaStream; -interface IAMMediaStream; -interface IMediaStreamFilter; -interface IDirectDraw; -interface IDirectDrawSurface; -interface IAMMediaTypeStream; -interface IAMMediaTypeSample; - -// Flags definitions for IAMMultiMediaStream::Initialize -enum { - AMMSF_NOGRAPHTHREAD = 0x00000001 -}; - -// Flags definitions for AddMediaStream and IAMMediaStream::Initialize -enum { - // Don't add a stream - create a default renderer instead - // for the supplied purpose id - AMMSF_ADDDEFAULTRENDERER = 0x00000001, - AMMSF_CREATEPEER = 0x00000002, - - // If no samples are created when we run or the last sample - // is deleted then terminate this stream - AMMSF_STOPIFNOSAMPLES = 0x00000004, - - // If Update is not called keep going - AMMSF_NOSTALL = 0x00000008 -}; - - -// Flag definitions for OpenFile and OpenMoniker -enum { - AMMSF_RENDERTYPEMASK = 0x00000003, - AMMSF_RENDERTOEXISTING = 0x00000000, - AMMSF_RENDERALLSTREAMS = 0x00000001, - AMMSF_NORENDER = 0x00000002, - - AMMSF_NOCLOCK = 0x00000004, - AMMSF_RUN = 0x00000008 -}; - - -typedef [v1_enum] enum { - Disabled = 0, - ReadData = 1, - RenderData = 2 -} OUTPUT_STATE; - - -[ -object, -uuid(7DB01C96-C0C3-11d0-8FF1-00C04FD9189D), -dual, -helpstring("IDirectShowStream Interface"), -pointer_default(unique) -] -interface IDirectShowStream : IDispatch -{ - [propget, id(1), helpstring("property FileName")] HRESULT FileName([out, retval] BSTR *pVal); - [propput, id(1), helpstring("property FileName")] HRESULT FileName([in] BSTR newVal); - [propget, id(2), helpstring("property Video")] HRESULT Video([out, retval] OUTPUT_STATE *pVal); - [propput, id(2), helpstring("propetry Video")] HRESULT Video([in] OUTPUT_STATE newVal); - [propget, id(3), helpstring("property Audio")] HRESULT Audio([out, retval] OUTPUT_STATE *pVal); - [propput, id(3), helpstring("propetry Audio")] HRESULT Audio([in] OUTPUT_STATE newVal); -}; - - -// IAMMultiMediaStream interface -[ -object, -uuid(BEBE595C-9A6F-11d0-8FDE-00C04FD9189D), -pointer_default(unique) -] -interface IAMMultiMediaStream : IMultiMediaStream -{ - HRESULT Initialize( - [in] STREAM_TYPE StreamType, - [in] DWORD dwFlags, - [in] IGraphBuilder *pFilterGraph); - - HRESULT GetFilterGraph( - [out] IGraphBuilder **ppGraphBuilder); - - HRESULT GetFilter( - [out] IMediaStreamFilter **ppFilter); - - HRESULT AddMediaStream( - [in] IUnknown *pStreamObject, - [in] const MSPID *PurposeId, - [in] DWORD dwFlags, - [out] IMediaStream **ppNewStream); - - HRESULT OpenFile( - [in] LPCWSTR pszFileName, - [in] DWORD dwFlags); - - HRESULT OpenMoniker( - [in] IBindCtx *pCtx, - [in] IMoniker *pMoniker, - [in] DWORD dwFlags); - - HRESULT Render( - [in] DWORD dwFlags); -} - - -// IAMMediaStream interface -[ -object, -uuid(BEBE595D-9A6F-11d0-8FDE-00C04FD9189D), -pointer_default(unique) -] -interface IAMMediaStream : IMediaStream -{ - HRESULT Initialize( - [in] IUnknown *pSourceObject, - [in] DWORD dwFlags, - [in] REFMSPID PurposeId, - [in] const STREAM_TYPE StreamType); - - HRESULT SetState( - [in] FILTER_STATE State); - - HRESULT JoinAMMultiMediaStream( - [in] IAMMultiMediaStream *pAMMultiMediaStream); - - HRESULT JoinFilter( - [in] IMediaStreamFilter *pMediaStreamFilter); - - HRESULT JoinFilterGraph( - [in] IFilterGraph *pFilterGraph); -}; - - - - -// IMediaStreamFilter interface -[ -object, -local, -uuid(BEBE595E-9A6F-11d0-8FDE-00C04FD9189D), -pointer_default(unique) -] -interface IMediaStreamFilter : IBaseFilter -{ - HRESULT AddMediaStream( - [in] IAMMediaStream *pAMMediaStream); - - HRESULT GetMediaStream( - [in] REFMSPID idPurpose, - [out] IMediaStream **ppMediaStream); - - HRESULT EnumMediaStreams( - [in] long Index, - [out] IMediaStream **ppMediaStream); - - HRESULT SupportSeeking( - [in] BOOL bRenderer); - - HRESULT ReferenceTimeToStreamTime( - [in] [out] REFERENCE_TIME *pTime); - - HRESULT GetCurrentStreamTime( - [out] REFERENCE_TIME *pCurrentStreamTime); - - HRESULT WaitUntil( - [in] REFERENCE_TIME WaitStreamTime); - - HRESULT Flush( - [in] BOOL bCancelEOS); - - HRESULT EndOfStream(); -}; - - - -[ -object, -local, -uuid(AB6B4AFC-F6E4-11d0-900D-00C04FD9189D), -pointer_default(unique) -] -interface IDirectDrawMediaSampleAllocator : IUnknown -{ - HRESULT GetDirectDraw(IDirectDraw **ppDirectDraw); -}; - - -[ -object, -local, -uuid(AB6B4AFE-F6E4-11d0-900D-00C04FD9189D), -pointer_default(unique) -] -interface IDirectDrawMediaSample : IUnknown -{ - HRESULT GetSurfaceAndReleaseLock( - [out] IDirectDrawSurface **ppDirectDrawSurface, - [out] RECT * pRect); - HRESULT LockMediaSamplePointer(void); -}; - - - - - -[ -object, -local, -uuid(AB6B4AFA-F6E4-11d0-900D-00C04FD9189D), -pointer_default(unique) -] - -interface IAMMediaTypeStream : IMediaStream -{ - HRESULT GetFormat( - [out] AM_MEDIA_TYPE * pMediaType, - [in] DWORD dwFlags); - - HRESULT SetFormat( - [in] AM_MEDIA_TYPE * pMediaType, - [in] DWORD dwFlags); - - HRESULT CreateSample( - [in] long lSampleSize, - [in] BYTE * pbBuffer, - [in] DWORD dwFlags, - [in] IUnknown *pUnkOuter, - [out] IAMMediaTypeSample ** ppAMMediaTypeSample); - - HRESULT GetStreamAllocatorRequirements( - [out] ALLOCATOR_PROPERTIES *pProps); - - HRESULT SetStreamAllocatorRequirements( - [in] ALLOCATOR_PROPERTIES *pProps); -}; - - -[ -object, -local, -uuid(AB6B4AFB-F6E4-11d0-900D-00C04FD9189D), -pointer_default(unique) -] -interface IAMMediaTypeSample : IStreamSample -{ - // - // Unique methods for IAMMediaTypeSample - // - HRESULT SetPointer([in] BYTE *pBuffer, [in] long lSize); - - // - // Mirror of IMediaSample - // - HRESULT GetPointer([out] BYTE ** ppBuffer); - long GetSize(void); - HRESULT GetTime([out] REFERENCE_TIME * pTimeStart, [out] REFERENCE_TIME * pTimeEnd); - HRESULT SetTime([in] REFERENCE_TIME * pTimeStart, [in] REFERENCE_TIME * pTimeEnd); - HRESULT IsSyncPoint(void); - HRESULT SetSyncPoint(BOOL bIsSyncPoint); - HRESULT IsPreroll(void); - HRESULT SetPreroll(BOOL bIsPreroll); - long GetActualDataLength(void); - HRESULT SetActualDataLength(long); - HRESULT GetMediaType(AM_MEDIA_TYPE **ppMediaType); - HRESULT SetMediaType(AM_MEDIA_TYPE *pMediaType); - HRESULT IsDiscontinuity(void); - HRESULT SetDiscontinuity(BOOL bDiscontinuity); - HRESULT GetMediaTime([out] LONGLONG * pTimeStart, [out] LONGLONG * pTimeEnd); - HRESULT SetMediaTime([in] LONGLONG * pTimeStart, [in] LONGLONG * pTimeEnd); -}; - - -[ - uuid(4E6CDE29-C0C4-11d0-8FF1-00C04FD9189D), - version(1.0), - helpstring("DirectShowStream 1.0 Type Library") -] - -library DirectShowStreamLib -{ - importlib("stdole32.tlb"); - importlib("stdole2.tlb"); - - [ - uuid(49c47ce5-9ba4-11d0-8212-00c04fc32c45), - helpstring("DirectShow Multi Media Stream") - ] - coclass AMMultiMediaStream - { - [default] dispinterface IDirectShowStream; - }; -}; - - - -// -// The MIDL compiler wants to produce a CLSID for everything defined in -// our type library, but it also wants to generate huge proxy code, -// so we use DEFINE_GUID for all other classes. It has another interesting -// bug in that it defines CLSID_AMMultiMediaStream within a #ifdef __cplusplus -// block, so we need to define it outside of that scope. -// - -cpp_quote("#ifndef __cplusplus") -cpp_quote("EXTERN_C const CLSID CLSID_AMMultiMediaStream;") -cpp_quote("#endif") - -cpp_quote("DEFINE_GUID(CLSID_AMDirectDrawStream, /* 49c47ce4-9ba4-11d0-8212-00c04fc32c45 */") -cpp_quote("0x49c47ce4, 0x9ba4, 0x11d0, 0x82, 0x12, 0x00, 0xc0, 0x4f, 0xc3, 0x2c, 0x45);") -cpp_quote("DEFINE_GUID(CLSID_AMAudioStream, /* 8496e040-af4c-11d0-8212-00c04fc32c45 */") -cpp_quote("0x8496e040, 0xaf4c, 0x11d0, 0x82, 0x12, 0x00, 0xc0, 0x4f, 0xc3, 0x2c, 0x45);") -cpp_quote("DEFINE_GUID(CLSID_AMAudioData, /* f2468580-af8a-11d0-8212-00c04fc32c45 */") -cpp_quote("0xf2468580, 0xaf8a, 0x11d0, 0x82, 0x12, 0x00, 0xc0, 0x4f, 0xc3, 0x2c, 0x45);") -cpp_quote("DEFINE_GUID(CLSID_AMMediaTypeStream, /* CF0F2F7C-F7BF-11d0-900D-00C04FD9189D */") -cpp_quote("0xcf0f2f7c, 0xf7bf, 0x11d0, 0x90, 0xd, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0x9d);") diff --git a/import/DirectX8/include/DShowIDL/amvpe.idl b/import/DirectX8/include/DShowIDL/amvpe.idl deleted file mode 100644 index 95e77c429..000000000 --- a/import/DirectX8/include/DShowIDL/amvpe.idl +++ /dev/null @@ -1,170 +0,0 @@ -//------------------------------------------------------------------------------ -// File: AMVPE.idl -// -// Desc: -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -import "unknwn.idl"; -import "objidl.idl"; // for IPersist (IFilter's root) - - -/* - * VIDOESIGNALINFO - */ -typedef struct _VIDEOSIGNALINFO -{ - DWORD dwSize; // Size of the structure - DWORD dwVREFHeight; // Specifies the number of lines of data in the vref - BOOL bDoubleClock; // videoport should enable double clocking - BOOL bVACT; // videoport should use an external VACT signal - BOOL bInterlaced; // Indicates that the signal is interlaced - BOOL bHalfline; // Device will write half lines into the frame buffer - BOOL bInvertedPolarity; // Devoce inverts the polarity by default -} AMVIDEOSIGNALINFO; - -typedef struct AMVIDEOSIGNALINFO *LPAMVIDEOSIGNALINFO; - - -interface IVPEConfig; -interface IVPE; - - -/* - * DDVIDEOPORTCONNECT - */ -typedef struct _DDVIDEOPORTCONNECT -{ - DWORD dwSize; // size of the DDVIDEOPORTCONNECT structure - GUID guidTypeID; // Description of video port connection - DWORD dwPortWidth; // Width of the video port - DWORD dwFlags; // Connection flags -} DDVIDEOPORTCONNECT; - -typedef DDVIDEOPORTCONNECT *LPDDVIDEOPORTCONNECT; - - - -/* - * DDPIXELFORMAT - */ -typedef struct _DDPIXELFORMAT -{ - DWORD dwSize; // size of structure - DWORD dwFlags; // pixel format flags - DWORD dwFourCC; // (FOURCC code) - union - { - DWORD dwRGBBitCount; // how many bits per pixel (BD_1,2,4,8,16,24,32) - DWORD dwYUVBitCount; // how many bits per pixel (BD_4,8,16,24,32) - DWORD dwZBufferBitDepth; // how many bits for z buffers (BD_8,16,24,32) - DWORD dwAlphaBitDepth; // how many bits for alpha channels (BD_1,2,4,8) - }; - union - { - DWORD dwRBitMask; // mask for red bit - DWORD dwYBitMask; // mask for Y bits - }; - union - { - DWORD dwGBitMask; // mask for green bits - DWORD dwUBitMask; // mask for U bits - }; - union - { - DWORD dwBBitMask; // mask for blue bits - DWORD dwVBitMask; // mask for V bits - }; - union - { - DWORD dwRGBAlphaBitMask; // mask for alpha channel - DWORD dwYUVAlphaBitMask; // mask for alpha channel - DWORD dwRGBZBitMask; // mask for Z channel - DWORD dwYUVZBitMask; // mask for Z channel - }; -} DDPIXELFORMAT; - -typedef DDPIXELFORMAT * LPDDPIXELFORMAT; - - -[ -object, -uuid(BC29A660-30E3-11d0-9E69-00C04FD7C15B), -pointer_default(unique) -] - -interface IVPEConfig : IUnknown { - - // gets the various connection information structures (guid, portwidth) - // in an array of structures. If the pointer to the array is NULL, first - // parameter returns the total number of formats supported. - HRESULT GetConnectInfo( - [in,out] LPDWORD lpNumConnectInfo, - [out] LPDDVIDEOPORTCONNECT lpddvpConnectInfo - ); - - HRESULT SetConnectInfo( - [in] DDVIDEOPORTCONNECT ddvpConnectInfo - ); - - // gets the various formats supported by the decoder in an array - // of structures. If the pointer to the array is NULL, first parameter - // returns the total number of formats supported. - HRESULT GetVideoFormats( - [in,out] LPDWORD lpNumFormats, - [out] LPDDPIXELFORMAT lpddpfFormats - ); - - // retrives maximum pixels per second rate expected for a given - // format and a given scaling factor. If decoder does not support - // those scaling factors, then it gives the rate and the nearest - // scaling factors. - HRESULT GetMaxPixelRate( - [in] DDPIXELFORMAT ddpfFormat, - [in,out] LPDWORD lpdwZoomHeight, - [in,out] LPDWORD lpdwZoomWidth, - [out] LPDWORD lpdwMaxPixelsPerSecond - ); - - // retrives various properties of the decoder for a given format - HRESULT GetVideoSignalInfo( - [in] DDPIXELFORMAT ddpfFormat, - [out] LPAMVIDEOSIGNALINFO lpAMVideoSignalInfo - ); - - // asks the decoder to ouput in this format. Return value should give - // appropriate error code - HRESULT SetVideoFormat( - [in] DDPIXELFORMAT ddpfFormat - ); - - // asks the decoder to treat even fields like odd fields and visa versa - HRESULT SetInvertPolarity( - ); - - // sets the scaling factors. If decoder does not support these, - // then it sets the values to the nearest factors it can support - HRESULT SetScalingFactors( - [in,out] LPDWORD lpdwZoomHeight, - [in,out] LPDWORD lpdwZoomWidth - ); - - } - - - -[ -object, -uuid(BC29A661-30E3-11d0-9E69-00C04FD7C15B), -pointer_default(unique) -] - -interface IVPE : IUnknown { - HRESULT SetOverlaySurface( - [in] LPUNKNOWN lpOverlaySurface, - [in] INT iNumBackBuffers - ); - -} diff --git a/import/DirectX8/include/DShowIDL/austream.idl b/import/DirectX8/include/DShowIDL/austream.idl deleted file mode 100644 index 008853901..000000000 --- a/import/DirectX8/include/DShowIDL/austream.idl +++ /dev/null @@ -1,106 +0,0 @@ -//------------------------------------------------------------------------------ -// File: AuStream.idl -// -// Desc: Used by MIDL tool to generate austream.h -// -// Copyright (c) 1998-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -import "unknwn.idl"; -import "mmstream.idl"; - -cpp_quote("//") -cpp_quote("// The following declarations within the 'if 0' block are dummy typedefs used to make") -cpp_quote("// the ddstream.idl file build. The actual definitions are contained in DDRAW.H") -cpp_quote("//") -cpp_quote("#if 0") -typedef struct tWAVEFORMATEX WAVEFORMATEX; -cpp_quote ("#endif") - -interface IAudioMediaStream; -interface IAudioStreamSample; -interface IMemoryData; -interface IAudioData; - -// IAudioMediaStream - - -[ -object, -local, -uuid(f7537560-a3be-11d0-8212-00c04fc32c45), -pointer_default(unique) -] -interface IAudioMediaStream : IMediaStream -{ - - HRESULT GetFormat( - [out] WAVEFORMATEX *pWaveFormatCurrent - ); - - HRESULT SetFormat( - [in] const WAVEFORMATEX *lpWaveFormat); - - HRESULT CreateSample( - [in] IAudioData *pAudioData, - [in] DWORD dwFlags, - [out] IAudioStreamSample **ppSample - ); -} - -[ -object, -local, -uuid(345fee00-aba5-11d0-8212-00c04fc32c45), -pointer_default(unique) -] -interface IAudioStreamSample : IStreamSample -{ - HRESULT GetAudioData( - [out] IAudioData **ppAudio - ); -} - - -[ -object, -local, -uuid(327fc560-af60-11d0-8212-00c04fc32c45), -pointer_default(unique) -] -interface IMemoryData : IUnknown -{ - HRESULT SetBuffer( - [in] DWORD cbSize, - [in] BYTE *pbData, - [in] DWORD dwFlags - ); - - HRESULT GetInfo( - [out] DWORD *pdwLength, - [out] BYTE **ppbData, - [out] DWORD *pcbActualData - ); - HRESULT SetActual( - [in] DWORD cbDataValid - ); -} - -[ -object, -local, -uuid(54c719c0-af60-11d0-8212-00c04fc32c45), -pointer_default(unique) -] -interface IAudioData : IMemoryData -{ - HRESULT GetFormat( - [out] WAVEFORMATEX *pWaveFormatCurrent - ); - - HRESULT SetFormat( - [in] const WAVEFORMATEX *lpWaveFormat - ); -} - diff --git a/import/DirectX8/include/DShowIDL/axcore.idl b/import/DirectX8/include/DShowIDL/axcore.idl deleted file mode 100644 index bb8e1a261..000000000 --- a/import/DirectX8/include/DShowIDL/axcore.idl +++ /dev/null @@ -1,1284 +0,0 @@ -//------------------------------------------------------------------------------ -// File: AXCore.idl -// -// Desc: Core streaming interfaces. Other ActiveMovie-only interfaces -// are in AXExtend.idl. -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -// include unknwn.idl and objidl.idl first - -#define CHARS_IN_GUID 39 // 128 bits, plus { - } punctuation and terminal null - // chars NOT BYTES in the standard representation - // e.g. {D3588AB0-0781-11ce-B03A-0020AF0BA770} + null - -cpp_quote("#define CHARS_IN_GUID 39") - - -//===================================================================== -//===================================================================== -// media types & formats -//===================================================================== -//===================================================================== - -// There is a high-level media type (audio, compressed video, -// mpeg video, midi). Within each type, there is a subtype (cinepak, pcm) -// and a length+untyped data block defining the format in a -// type-specific manner. EG for video/cinepak, the data block would be -// a bitmapinfo. -// The contents of the format block are defined by the formattype GUID. -// For example, FORMAT_VideoInfo, FORMAT_WaveFormatEx. In the future, this -// may be a pointer to an object supporting property style interfaces -// in which case the GUID may be something like FORMAT_IUnknown. When -// you are passed a media type you should check the format type, if -// it isn't a type you recognize, then don't touch the format block - -typedef struct _AMMediaType { - GUID majortype; - GUID subtype; - BOOL bFixedSizeSamples; - BOOL bTemporalCompression; - ULONG lSampleSize; - GUID formattype; - IUnknown *pUnk; - ULONG cbFormat; - [size_is(cbFormat)] BYTE * pbFormat; -} AM_MEDIA_TYPE; - -//===================================================================== -//===================================================================== -// pin information -//===================================================================== -//===================================================================== - -// is this an input or output pin -typedef enum _PinDirection { - PINDIR_INPUT, - PINDIR_OUTPUT -} PIN_DIRECTION; - -// other types that need defining -#define MAX_PIN_NAME 128 -cpp_quote("#define MAX_PIN_NAME 128") -cpp_quote("#define MAX_FILTER_NAME 128") -#define MAX_FILTER_NAME 128 - - -//===================================================================== -//===================================================================== -// time information -// -// This represents a time (either reference or stream) in 100ns units. -// The class library contains a CRefTime helper class -// that supports simple comparison and arithmetic operations -//===================================================================== -//===================================================================== - -typedef LONGLONG REFERENCE_TIME; -typedef double REFTIME; - -// Win32 HANDLEs have to be cast to these as the MIDL compiler doesn't -// like the HANDLE type or in fact anything remotely associated with -// them. If this ever gets ported to a MAC environment then these will -// have to become an alertable synchronisation object that it supports - -typedef DWORD_PTR HSEMAPHORE; -typedef DWORD_PTR HEVENT; - -//===================================================================== -//===================================================================== -// Allocator properties -// -// Used to describe the actual properties of an allocator, -// and used to request properties from an allocator or from an upstream -// filter that could create an allocator. See IMemAllocator and -// IMemInputPin. -//===================================================================== -//===================================================================== -typedef struct _AllocatorProperties { - long cBuffers; // count of buffers at this allocator - long cbBuffer; // size of each buffer, excluding any prefix - - // alignment of the buffer - buffer start will be aligned on a multiple of - // this amount - long cbAlign; - - // prefix amount. Each buffer is immediately preceeded by cbPrefix bytes. - // note that GetPointer points to the beginning of the buffer proper. - // the prefix is aligned, i.e. (GetPointer() - cbPrefix) is aligned on cbAlign. - long cbPrefix; -} ALLOCATOR_PROPERTIES; - - - - - -// forward declarations (in alphabetical order - we were getting duplicates) -interface IAMovieSetup; -interface IEnumFilters; -interface IEnumMediaTypes; -interface IEnumPins; -interface IBaseFilter; -interface IFilterGraph; -interface IMediaFilter; -interface IMediaSample; -interface IMemAllocator; -interface IMemAllocatorCallbackTemp; -interface IMemAllocatorNotifyCallbackTemp; -interface IMemInputPin; -interface IPin; -interface IReferenceClock; - - - -//===================================================================== -//===================================================================== -// Defines IPin interface -// -// interface representing a single, unidirection connection point on a -// filter. A Pin will connect to exactly one other pin on another filter. -// This interface represents the interface other objects can call on -// this pin. The interface between the filter and the pin is private to -// the implementation of a specific filter. -// -// During the connection process, one pin will be instructed to take -// the lead: the connect interface on this pin will be calling, passing -// the IPin* for the other pin. This connecting pin will call the -// ReceiveConnection member function on the other pin, as well as presumably -// other format-enumeration and queryinterface calls to establish whether -// the connection is possible. -//===================================================================== -//===================================================================== - -[ -object, -uuid(56a86891-0ad4-11ce-b03a-0020af0ba770), -pointer_default(unique) -] -interface IPin : IUnknown { - - // initiate a connection to another pin. calls ReceiveConnection on the - // other pin. Verifies that the connection is possible and may reject - // it. - // The mediatype parameter is optional. If it is not null, the pin must - // connect using that media type if possible. The subtype and/or format - // type can be GUID_NULL, meaning that the pin can fill them in as desired. - // This allows an application to partially specify the media type to be - // used for the connection, insisting on eg YUV 422 but leaving details - // (such as the image size) to be negotiated between the pins. - HRESULT Connect( - [in] IPin * pReceivePin, // connect yourself to this pin - [in] const AM_MEDIA_TYPE * pmt // (optional) connect using this type - ); - - // called by a connecting pin to make a connection - HRESULT ReceiveConnection( - [in] IPin * pConnector, - [in] const AM_MEDIA_TYPE *pmt // this is the media type we will exchange - ); - - // break a connection - no params since there is only one connection - // possible on this pin - HRESULT Disconnect(void); - - // Find the pin this pin is connected to (if any) - // The pointer returned is AddRef()d - // Fails if the pin is not connected - HRESULT ConnectedTo( - [out] IPin **pPin - ); - - // Return the media type of a connection if the pin is connected - HRESULT ConnectionMediaType( - [out] AM_MEDIA_TYPE *pmt - ); - - // get information about the pin itself - typedef struct _PinInfo { - IBaseFilter *pFilter; // the filter this pin is on - PIN_DIRECTION dir; // am I an input or output pin? - WCHAR achName[MAX_PIN_NAME]; // the name of this pin within this filter - } PIN_INFO; - - HRESULT QueryPinInfo( - [out] PIN_INFO * pInfo - ); - - // We often want to know the direction. Rather than use the - // relatively expensive QueryPinInfo, use this - HRESULT QueryDirection( - [out] PIN_DIRECTION *pPinDir - ); - - // Get an identifier for the pin (allows connections to be saved). - // The storage will be allocated by the filter using CoTaskMemAlloc - // The caller should free it using CoTaskMemFree - HRESULT QueryId( - [out] LPWSTR * Id - ); - - // will the pin accept the format type, S_OK yes, S_FALSE no - HRESULT QueryAccept( - [in] const AM_MEDIA_TYPE *pmt - ); - - // return an enumerator for this pin's preferred media types - HRESULT EnumMediaTypes( - [out] IEnumMediaTypes **ppEnum - ); - - // return an array of IPin* - the pins that this pin internally connects to - // All pins put in the array must be AddReffed (but no others) - // Errors: "Can't say" - FAIL; not enough slots - return S_FALSE - // Default: return E_NOTIMPL - // The filter graph will interpret E_NOTIMPL as any input pin connects to - // all visible output pins and vise versa. - // apPin can be NULL if nPin==0 (not otherwise). - HRESULT QueryInternalConnections( - [out] IPin* *apPin, // array of IPin* - [in, out] ULONG *nPin // on input, the number of slots - // on output the number of pins - ); - - // notify the pin that no more data is expected until a new run - // command is issued. End of stream should be queued and delivered after - // all queued data is delivered. Pass through if there is no queued data. - // Flush should flush any queued EOS. - // returns S_OK unless there is some error. - // input pins only: output pins will normally return E_UNEXPECTED. - HRESULT EndOfStream(void); - - // Flush - - // Enter flush state: do the following steps (in order) - // -- prevent any more Receives succeeding (set a flushing flag) - // -- discard any queued data - // -- free anyone blocked on Receive in your filter - // -- pass BeginFlush to any downstream pins - HRESULT BeginFlush(void); - - // End flush state: do the following steps in order - // -- ensure no more data will be pushed by your filter - // (sync with thread if you have one, stop it pushing and - // discard any queued data) - // -- re-enable Receive (clear internal flushing flag) - // -- pass EndFlush to any downstream pins - HRESULT EndFlush(void); - - // informational: all data arriving after this call is part of a segment - // from StartTime to StopTime, played at rate. This allows filters that - // process buffers containing more than one sample to clip the rendering - // to within the start and stop times. - // - // A source pin will call a destination pin on this method after completing - // delivery of any previous data, and before any Receive calls for the - // new data - HRESULT NewSegment( - [in] REFERENCE_TIME tStart, - [in] REFERENCE_TIME tStop, - [in] double dRate); -} - -typedef IPin *PPIN; - - -//===================================================================== -//===================================================================== -// Defines IEnumPins interface -// -// interface returned from IBaseFilter::EnumPins(). based on IEnumXXXX -//===================================================================== -//===================================================================== - -[ -object, -uuid(56a86892-0ad4-11ce-b03a-0020af0ba770), -pointer_default(unique) -] -interface IEnumPins : IUnknown { - - HRESULT Next( - [in] ULONG cPins, // place this many pins... - [out, size_is(cPins)] IPin ** ppPins, // ...in this array - [out] ULONG * pcFetched // actual count passed - ); - - HRESULT Skip( - [in] ULONG cPins); - - HRESULT Reset(void); - - HRESULT Clone( - [out] IEnumPins **ppEnum - ); -} - -typedef IEnumPins *PENUMPINS; - - -//===================================================================== -//===================================================================== -// Defines IEnumMediaTypes interface -// -// Enumerates the preferred formats for a pin -//===================================================================== -//===================================================================== - -[ -object, -uuid(89c31040-846b-11ce-97d3-00aa0055595a), -pointer_default(unique) -] -interface IEnumMediaTypes : IUnknown { - - // to call this member function pass in the address of a pointer to a - // media type. The interface will allocate the necessary AM_MEDIA_TYPE - // structures and initialise them with the variable format block - - HRESULT Next( - [in] ULONG cMediaTypes, // place this many types... - [out, size_is(cMediaTypes)] - AM_MEDIA_TYPE ** ppMediaTypes, // ...in this array - [out] ULONG * pcFetched // actual count passed - ); - - HRESULT Skip( - [in] ULONG cMediaTypes); - - HRESULT Reset(void); - - HRESULT Clone( - [out] IEnumMediaTypes **ppEnum - ); -} - -typedef IEnumMediaTypes *PENUMMEDIATYPES; - - - -//======================================================================== -//======================================================================== -// Defines IFilterGraph interface -// -// abstraction representing a graph of filters -// This allows filters to be joined into a graph and operated as a unit. -//======================================================================== -//======================================================================== - -[ -object, -uuid(56a8689f-0ad4-11ce-b03a-0020af0ba770), -pointer_default(unique) -] -interface IFilterGraph : IUnknown { - - //========================================================================== - // Low level filter functions - //========================================================================== - - // Add a filter to the graph and name it with *pName. - // If the name is not unique, The request will fail. - // The Filter graph will call the JoinFilterGraph - // member function of the filter to inform it. - // This must be called before attempting Connect, ConnectDirect or Render - // for pins of the filter. - - HRESULT AddFilter - ( [in] IBaseFilter * pFilter, - [in, string] LPCWSTR pName - ); - - - // Remove a filter from the graph. The filter graph implementation - // will inform the filter that it is being removed. - - HRESULT RemoveFilter - ( [in] IBaseFilter * pFilter - ); - - - // Set *ppEnum to be an enumerator for all filters in the graph. - - HRESULT EnumFilters - ( [out] IEnumFilters **ppEnum - ); - - - // Set *ppFilter to be the filter which was added with the name *pName - // Will fail and set *ppFilter to NULL if the name is not in this graph. - - HRESULT FindFilterByName - ( [in, string] LPCWSTR pName, - [out] IBaseFilter ** ppFilter - ); - - //========================================================================== - // Low level connection functions - //========================================================================== - - // Connect these two pins directly (i.e. without intervening filters) - // the media type is optional, and may be partially specified (that is - // the subtype and/or format type may be GUID_NULL). See IPin::Connect - // for details of the media type parameter. - HRESULT ConnectDirect - ( [in] IPin * ppinOut, // the output pin - [in] IPin * ppinIn, // the input pin - [in, unique] const AM_MEDIA_TYPE* pmt // optional mediatype - ); - - // Break the connection that this pin has and reconnect it to the - // same other pin. - - HRESULT Reconnect - ( [in] IPin * ppin // the pin to disconnect and reconnect - ); - - - - // Disconnect this pin, if connected. Successful no-op if not connected. - - HRESULT Disconnect - ( [in] IPin * ppin - ); - - //========================================================================== - // intelligent connectivity - now in IGraphBuilder, axextend.idl - //========================================================================== - - //========================================================================== - // Whole graph functions - //========================================================================== - - // Once a graph is built, it can behave as a (composite) filter. - // To control this filter, QueryInterface for IMediaFilter. - - // The filtergraph will by default ensure that the graph has a sync source - // when it is made to Run. SetSyncSource(NULL) will prevent that and allow - // all the filters to run unsynchronised until further notice. - // SetDefaultSyncSource will set the default sync source (the same as would - // have been set by default on the first call to Run). - HRESULT SetDefaultSyncSource(void); - -} - -typedef IFilterGraph *PFILTERGRAPH; - - - -//========================================================================== -//========================================================================== -// Defines IEnumFilters interface -// -// enumerator interface returned from IFilterGraph::EnumFilters(). -// based on IEnum pseudo-template -//========================================================================== -//========================================================================== - -[ -object, -uuid(56a86893-0ad4-11ce-b03a-0020af0ba770), -pointer_default(unique) -] -interface IEnumFilters : IUnknown { - - HRESULT Next - ( [in] ULONG cFilters, // place this many filters... - [out] IBaseFilter ** ppFilter, // ...in this array of IBaseFilter* - [out] ULONG * pcFetched // actual count passed returned here - ); - - - HRESULT Skip - ( [in] ULONG cFilters - ); - - - HRESULT Reset(void); - - - HRESULT Clone - ( [out] IEnumFilters **ppEnum - ); -} - -typedef IEnumFilters *PENUMFILTERS; - - -//===================================================================== -//===================================================================== -// Defines IMediaFilter interface -// -// multimedia components that provide time-based data will expose this. -// this interface abstracts an object that processes time-based data streams -// and represents a multimedia device (possibly implemented in software). -// it controls the active/running state of the object and its synchronization -// to other objects in the system. -// -// derived from IPersist so that all filter-type objects in a graph -// can have their class id serialised. -//===================================================================== -//===================================================================== - -[ -object, -uuid(56a86899-0ad4-11ce-b03a-0020af0ba770), -pointer_default(unique) -] -interface IMediaFilter : IPersist { - - // tell the filter to transition to the new state. The state transition - // may not be instantaneous (external mechanical activity may be involved, - // for example). The state functions may return before the state - // transition has completed - - // these functions will return S_OK if the transition is complete, S_FALSE if - // the transition is not complete but no error has occurred, or some error value - // if the transition failed. - HRESULT Stop(void); - HRESULT Pause(void); - - // in order to synchronise independent streams, you must pass a time - // value with the Run command. This is the difference between stream - // time and reference time. That is, it is the amount to be added to - // the IMediaSample timestamp to get the time at which that sample - // should be rendered according to the reference clock. - // If we are starting at the beginning of the stream, it will thus be - // simply the time at which the first sample should appear. If we are - // restarting from Paused mode in midstream, then it will be the total - // time we have been paused added to the initial start time. - - // the filtergraph will provide this information to its filters. If you - // are an app calling the filtergraph, it's ok to pass a start time of - // 0, in which case the filter graph will calculate a soon-as-possible - // time. FilterGraphs will accept 0 meaning ASAP; most filters will not. - - HRESULT Run(REFERENCE_TIME tStart); - - - // possible states that the filter could be in - typedef enum _FilterState { - State_Stopped, // not in use - State_Paused, // holding resources, ready to go - State_Running // actively processing media stream - } FILTER_STATE; - - // find out what state the filter is in. - // If timeout is 0, will return immediately - if a state transition is - // not complete, it will return the state being transitioned into, and - // the return code will be VFW_S_STATE_INTERMEDIATE. if no state - // transition is in progress the state will be returned and the return - // code will be S_OK. - // - // If timeout is non-zero, GetState will not return until the state - // transition is complete, or the timeout expires. - // The timeout is in milliseconds. - // You can also pass in INFINITE as a special value for the timeout, in - // which case it will block indefinitely waiting for the state transition - // to complete. If the timeout expires, the state returned is the - // state we are trying to reach, and the return code will be - // VFW_S_STATE_INTERMEDIATE. If no state transition is in progress - // the routine returns immediately with return code S_OK. - - // - // return State is State_Running, State_Paused or State_Stopped. - // return code is S_OK, or VFW_S_STATE_INTERMEDIATE if state - // transition is not complete or an error value if the method failed. - HRESULT GetState( - [in] DWORD dwMilliSecsTimeout, - [out] FILTER_STATE *State); - - - // tell the filter the reference clock to which it should synchronize - // activity. This is most important to rendering filters and may not - // be of any interest to other filters. - HRESULT SetSyncSource( - [in] IReferenceClock * pClock); - - // get the reference clock currently in use (it may be NULL) - HRESULT GetSyncSource( - [out] IReferenceClock ** pClock); -} - -typedef IMediaFilter *PMEDIAFILTER; - - -//===================================================================== -//===================================================================== -// Defines IBaseFilter interface -// -// all multimedia components will expose this interface -// this interface abstracts an object that has typed input and output -// connections and can be dynamically aggregated. -// -// IMediaFilter supports synchronisation and activity state: IBaseFilter -// is derived from that since all filters need to support IMediaFilter, -// whereas a few objects (plug-in control distributors for example) will -// support IMediaFilter but not IBaseFilter. -// -// IMediaFilter is itself derived from IPersist so that every filter -//supports GetClassID() -//===================================================================== -//===================================================================== - -[ -object, -uuid(56a86895-0ad4-11ce-b03a-0020af0ba770), -pointer_default(unique) -] -interface IBaseFilter : IMediaFilter { - - // enumerate all the pins available on this filter - // allows enumeration of all pins only. - // - HRESULT EnumPins( - [out] IEnumPins ** ppEnum // enum interface returned here - ); - - // Convert the external identifier of a pin to an IPin * - // This pin id is quite different from the pin Name in CreatePin. - // In CreatePin the Name is invented by the caller. In FindPin the Id - // must have come from a previous call to IPin::QueryId. Whether or not - // this operation would cause a pin to be created depends on the filter - // design, but if called twice with the same id it should certainly - // return the same pin both times. - HRESULT FindPin( - [in, string] LPCWSTR Id, - [out] IPin ** ppPin - ); - - // find out information about this filter - typedef struct _FilterInfo { - WCHAR achName[MAX_FILTER_NAME]; // maybe null if not part of graph - IFilterGraph * pGraph; // null if not part of graph - } FILTER_INFO; - - HRESULT QueryFilterInfo( - [out] FILTER_INFO * pInfo - ); - - // notify a filter that it has joined a filter graph. It is permitted to - // refuse. The filter should addref and store this interface for later use - // since it may need to notify events to this interface. A null pointer indicates - // that the filter is no longer part of a graph. - HRESULT JoinFilterGraph( - [in] IFilterGraph * pGraph, - [in, string] LPCWSTR pName - ); - - // return a Vendor information string. Optional - may return E_NOTIMPL. - // memory returned should be freed using CoTaskMemFree - HRESULT QueryVendorInfo( - [out, string] LPWSTR* pVendorInfo - ); -} - -typedef IBaseFilter *PFILTER; - - -//===================================================================== -//===================================================================== -// sync and state management -//===================================================================== -//===================================================================== - - -//===================================================================== -//===================================================================== -// Defines IReferenceClock interface -//===================================================================== -//===================================================================== - -[ - object, - uuid(56a86897-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IReferenceClock : IUnknown { - - // get the time now - HRESULT GetTime( - [out] REFERENCE_TIME *pTime - ); - - // ask for an async notification that a time has elapsed - HRESULT AdviseTime( - [in] REFERENCE_TIME baseTime, // base reference time - [in] REFERENCE_TIME streamTime, // stream offset time - [in] HEVENT hEvent, // advise via this event - [out] DWORD_PTR * pdwAdviseCookie // where your cookie goes - ); - - // ask for an async periodic notification that a time has elapsed - HRESULT AdvisePeriodic( - [in] REFERENCE_TIME startTime, // starting at this time - [in] REFERENCE_TIME periodTime, // time between notifications - [in] HSEMAPHORE hSemaphore, // advise via a semaphore - [out] DWORD_PTR * pdwAdviseCookie // where your cookie goes - ); - - // cancel a request for notification - HRESULT Unadvise( - [in] DWORD_PTR dwAdviseCookie); -} - -typedef IReferenceClock *PREFERENCECLOCK; - -//===================================================================== -//===================================================================== -// Defines IReferenceClock2 interface -//===================================================================== -//===================================================================== - -[ - object, - uuid(36b73885-c2c8-11cf-8b46-00805f6cef60), - pointer_default(unique) -] -interface IReferenceClock2 : IReferenceClock { -} - -typedef IReferenceClock2 *PREFERENCECLOCK2; - - -//===================================================================== -//===================================================================== -// Data transport interfaces -//===================================================================== -//===================================================================== - - -//===================================================================== -//===================================================================== -// Defines IMediaSample interface -//===================================================================== -//===================================================================== - -[ - local, - object, - uuid(56a8689a-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IMediaSample : IUnknown { - - // get me a read/write pointer to this buffer's memory. I will actually - // want to use sizeUsed bytes. - HRESULT GetPointer([out] BYTE ** ppBuffer); - - // return the size in bytes of the buffer data area - long GetSize(void); - - // get the stream time at which this sample should start and finish. - HRESULT GetTime( - [out] REFERENCE_TIME * pTimeStart, // put time here - [out] REFERENCE_TIME * pTimeEnd - ); - - // Set the stream time at which this sample should start and finish. - // pTimeStart==pTimeEnd==NULL will invalidate the time stamps in - // this sample - HRESULT SetTime( - [in] REFERENCE_TIME * pTimeStart, // put time here - [in] REFERENCE_TIME * pTimeEnd - ); - - // sync-point property. If true, then the beginning of this - // sample is a sync-point. (note that if AM_MEDIA_TYPE.bTemporalCompression - // is false then all samples are sync points). A filter can start - // a stream at any sync point. S_FALSE if not sync-point, S_OK if true. - - HRESULT IsSyncPoint(void); - HRESULT SetSyncPoint(BOOL bIsSyncPoint); - - // preroll property. If true, this sample is for preroll only and - // shouldn't be displayed. - HRESULT IsPreroll(void); - HRESULT SetPreroll(BOOL bIsPreroll); - - long GetActualDataLength(void); - HRESULT SetActualDataLength(long); - - // these allow for limited format changes in band - if no format change - // has been made when you receive a sample GetMediaType will return S_FALSE - - HRESULT GetMediaType(AM_MEDIA_TYPE **ppMediaType); - HRESULT SetMediaType(AM_MEDIA_TYPE *pMediaType); - - // returns S_OK if there is a discontinuity in the data (this frame is - // not a continuation of the previous stream of data - // - there has been a seek or some dropped samples). - HRESULT IsDiscontinuity(void); - // set the discontinuity property - TRUE if this sample is not a - // continuation, but a new sample after a seek or a dropped sample. - HRESULT SetDiscontinuity(BOOL bDiscontinuity); - - // get the media times for this sample - HRESULT GetMediaTime( - [out] LONGLONG * pTimeStart, - [out] LONGLONG * pTimeEnd - ); - - // Set the media times for this sample - // pTimeStart==pTimeEnd==NULL will invalidate the media time stamps in - // this sample - HRESULT SetMediaTime( - [in] LONGLONG * pTimeStart, - [in] LONGLONG * pTimeEnd - ); -} - -typedef IMediaSample *PMEDIASAMPLE; - -// Values for dwFlags for AM_SAMPLE_PROPERTIES -enum tagAM_SAMPLE_PROPERTY_FLAGS - { AM_SAMPLE_SPLICEPOINT = 0x01, /* Is this a splice point - IE can it be decoded - without reference to - previous data */ - AM_SAMPLE_PREROLL = 0x02, /* Is this a preroll sample */ - AM_SAMPLE_DATADISCONTINUITY = 0x04, /* Set if start of new segment */ - AM_SAMPLE_TYPECHANGED = 0x08, /* Has the type changed */ - AM_SAMPLE_TIMEVALID = 0x10, /* Set if time is valid */ - AM_SAMPLE_TIMEDISCONTINUITY = 0x40, /* time gap in data starts after - this sample - pbBuffer can - be NULL - */ - AM_SAMPLE_FLUSH_ON_PAUSE = 0x80, /* For live data - discard - in paused state - */ - AM_SAMPLE_STOPVALID = 0x100, /* Stop time is valid */ - AM_SAMPLE_ENDOFSTREAM = 0x200, /* End of stream after - this data - This is reserved for - kernel streaming and is - not currently used by - ActiveMovie - */ - AM_STREAM_MEDIA = 0, /* Normal data stream id */ - AM_STREAM_CONTROL = 1 /* Control stream id */ - /* > 7FFFFFFF is application - defined stream - */ - }; - -// Media sample generic properties structure -typedef struct tagAM_SAMPLE2_PROPERTIES { - DWORD cbData; // Length of generic data for extensiblity - // Number of bytes INCLUDING this field - DWORD dwTypeSpecificFlags; // Type specific flag data - DWORD dwSampleFlags; // Flags bits defined by AM_SAMPLE_xxx flags - // All undefined bits RESERVED (set to 0, - // leave on copy) - LONG lActual; // Length of data in buffer - REFERENCE_TIME tStart; // Start time if valid - REFERENCE_TIME tStop; // Stop time if valid - DWORD dwStreamId; // Stream 0 is normal media transport - // Stream 1 is control - AM_MEDIA_TYPE *pMediaType; // Copy of media type - INVALID after Release() - BYTE *pbBuffer; // Pointer to buffer - INVALID after Release() - LONG cbBuffer; // Length of buffer -} AM_SAMPLE2_PROPERTIES; - -//===================================================================== -//===================================================================== -// Defines IMediaSample2 interface -//===================================================================== -//===================================================================== - -[ - local, - object, - uuid(36b73884-c2c8-11cf-8b46-00805f6cef60), - pointer_default(unique) -] -interface IMediaSample2 : IMediaSample { - - // Get sample properties - // - // cbProperties - length of generic data to retrieve - // pbProperties - pointer to generic data buffer - can - // be NULL if cbProperties is NULL - // data conforms to AM_SAMPLE_PROPERTIES - // - HRESULT GetProperties( - [in] DWORD cbProperties, - [out, size_is(cbProperties)] BYTE * pbProperties - ); - // Set sample properties - // - // cbProperties - length of generic data to set - // pbProperties - pointer to generic data buffer - can - // be NULL if cbProperties is NULL - // data conforms to AM_SAMPLE_PROPERTIES - // - // - HRESULT SetProperties( - [in] DWORD cbProperties, - [in, size_is(cbProperties)] const BYTE * pbProperties - ); - - - // // Get the clock associated with the sample - // HRESULT GetClock( - // [out] IReferenceClock2 **ppClock - // ); - - // // Get a pointer to the object containing the data - // // - // // riid - IID of interface required on object - // // ppvobject - Pointer to object containing the data - // // - // // Returns - // // S_OK - Got the object - // // E_NOINTERFACE - object does not support this interface - // // if IUnknown is not supported - // // there is no backing object - // // E_NOTIMPL - samples don't have backing objects - // // - // // - // HRESULT GetBackingObject( - // [in] REFIID riid, - // [out] void **ppvObject - // ); -} - -typedef IMediaSample2 *PMEDIASAMPLE2; - - -// flags for dwFlags in IMemAllocator::GetBuffer -// AM_GBF_PREVFRAMESKIPPED is only significant when asking for a buffer from the -// video renderer. It should be TRUE if and only if the previous frame -// was skipped. It affects quality management. -// AM_GBF_NOTASYNCPOINT indicates to the downstream filter (most likely the -// video renderer) that you are not going to fill this buffer with a sync point -// (keyframe) so now would be a bad time to return a buffer with a dynamic -// format change, because you will be unable to switch to the new format without -// waiting for the next sync point, causing some frames to be dropped. -#define AM_GBF_PREVFRAMESKIPPED 1 -#define AM_GBF_NOTASYNCPOINT 2 -cpp_quote("#define AM_GBF_PREVFRAMESKIPPED 1") -cpp_quote("#define AM_GBF_NOTASYNCPOINT 2") - -// This may not be supported by allocators -cpp_quote("#define AM_GBF_NOWAIT 4") - -// This flag is supported by the VMR's surface allocator -// When set the DDraw surface used for the media sample -// is returned is an un-locked state. Calls the GetPointer on -// the returned media sample will fail and return a NULL pointer -// -cpp_quote("#define AM_GBF_NODDSURFACELOCK 8") - -//===================================================================== -//===================================================================== -// Defines IMemAllocator interface -// -// an allocator of IMediaSample blocks to be used for data transfer between -// pins. Can be provided by input, output or a third party. Release -// the IMediaSample object obtained back to the pool by calling -// IMediaSample::Release. -//===================================================================== -//===================================================================== - -[ - object, - uuid(56a8689c-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IMemAllocator : IUnknown { - - // negotiate buffer sizes, buffer count and alignment. pRequest is filled - // in by the caller with the requested values. pActual will be returned - // by the allocator with the closest that the allocator can come to this. - // Cannot be called unless the allocator is decommitted. - // Calls to GetBuffer need not succeed until Commit is called. - HRESULT SetProperties( - [in] ALLOCATOR_PROPERTIES* pRequest, - [out] ALLOCATOR_PROPERTIES* pActual); - - // return the properties actually being used on this allocator - HRESULT GetProperties( - [out] ALLOCATOR_PROPERTIES* pProps); - - - // commit the memory for the agreed buffers - HRESULT Commit(void); - - // release the memory for the agreed buffers. Any threads waiting in - // GetBuffer will return with an error. GetBuffer calls will always fail - // if called before Commit or after Decommit. - HRESULT Decommit(void); - - // get container for a sample. Blocking, synchronous call to get the - // next free buffer (as represented by an IMediaSample interface). - // on return, the time etc properties will be invalid, but the buffer - // pointer and size will be correct. - // Will only succeed if memory is committed. If GetBuffer is blocked - // waiting for a buffer and Decommit is called on another thread, - // GetBuffer will return with an error. - HRESULT GetBuffer( - [out] IMediaSample **ppBuffer, - [in] REFERENCE_TIME * pStartTime, - [in] REFERENCE_TIME * pEndTime, - [in] DWORD dwFlags - ); - - // put a buffer back on the allocators free list. - // this is typically called by the Release() method of the media - // sample when the reference count goes to 0 - // - HRESULT ReleaseBuffer( - [in] IMediaSample *pBuffer - ); -} - -typedef IMemAllocator *PMEMALLOCATOR; - -//===================================================================== -//===================================================================== -// Defines IMemAllocatorCallbackTemp interface -// -// If the allocator supports IMemAllocator2 then callbacks are -// available -// -//===================================================================== -//===================================================================== -[ - object, - uuid(379a0cf0-c1de-11d2-abf5-00a0c905f375), - pointer_default(unique) -] -interface IMemAllocatorCallbackTemp : IMemAllocator { - - // Set notification interface. pNotify can be NULL - HRESULT SetNotify( - [in] IMemAllocatorNotifyCallbackTemp *pNotify); - - // Get current stats - HRESULT GetFreeCount( - [out] LONG *plBuffersFree); -} - -//===================================================================== -//===================================================================== -// Defines IMemAllocatorNotify interface -// -//===================================================================== -//===================================================================== -[ - object, - uuid(92980b30-c1de-11d2-abf5-00a0c905f375), - pointer_default(unique) -] -interface IMemAllocatorNotifyCallbackTemp : IUnknown { - - // Called whenever ReleaseBuffer is called in the allocator - // Note the caller may have acquired locks and this call may - // occur in any context so generally the implementor of this - // call will just set an event or post a message for another - // thread to take action. - HRESULT NotifyRelease(); -} - -//===================================================================== -//===================================================================== -// Defines IMemInputPin interface -// -// basic shared memory transport interface. -//===================================================================== -//===================================================================== - -[ - object, - uuid(56a8689d-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IMemInputPin : IUnknown { - - // return the allocator interface that this input pin - // would like the output pin to use - HRESULT GetAllocator( - [out] IMemAllocator ** ppAllocator); - - // tell the input pin which allocator the output pin is actually - // going to use. - // If the readonly flag is set, then all samples from this allocator are - // to be treated as read-only, and should be copied before being modified. - HRESULT NotifyAllocator( - [in] IMemAllocator * pAllocator, - [in] BOOL bReadOnly - ); - - // this method is optional (can return E_NOTIMPL). Output pins are not obliged to call - // this method, nor are they obliged to fulfil the request. Input pins making such a - // request should check the allocator in NotifyAllocator to see if it meets their needs. If - // not, the input pin is responsible for any necessary data copy. - // Zero values will be treated as don't care: so a pin can return an alignment value - // and leave the other values 0. - HRESULT GetAllocatorRequirements( [out] ALLOCATOR_PROPERTIES*pProps); - - // here's the next block of data from the stream. AddRef it if - // you need to hold it beyond the end of the Receive call. - // call pSample->Release when done with it. - // - // This is a blocking synchronous call. Usually no blocking - // will occur but if a filter cannot process the sample immediately - // it may use the caller's thread to wait until it can. - HRESULT Receive( - [in] IMediaSample * pSample); - - // Same as Receive but with multiple samples. Useful for - // fragmented streams - HRESULT ReceiveMultiple( - [in, size_is(nSamples)] IMediaSample **pSamples, - [in] long nSamples, - [out] long *nSamplesProcessed); - - // See if Receive might block - // Returns S_OK if it can block, S_FALSE if it can't or some - // failure code (assume it can in this case) - HRESULT ReceiveCanBlock(); -} - -typedef IMemInputPin *PMEMINPUTPIN; - - -//===================================================================== -//===================================================================== -// Defines IAMovieSetup interface -// -// exported by filter to allow it to be self-registering -//===================================================================== -//===================================================================== - -[ -object, -uuid(a3d8cec0-7e5a-11cf-bbc5-00805f6cef20), -pointer_default(unique) -] -interface IAMovieSetup : IUnknown { - - // methods to register and unregister filter, etc. - - HRESULT Register( ); - HRESULT Unregister( ); -} - -typedef IAMovieSetup *PAMOVIESETUP; - - -//===================================================================== -//===================================================================== -// Defines IMediaSeeking interface -// -// Controls seeking (time, bytes, frames, fields and samples) -//===================================================================== -//===================================================================== - -typedef enum AM_SEEKING_SeekingFlags -{ - AM_SEEKING_NoPositioning = 0x00, // No change - AM_SEEKING_AbsolutePositioning = 0x01, // Position is supplied and is absolute - AM_SEEKING_RelativePositioning = 0x02, // Position is supplied and is relative - AM_SEEKING_IncrementalPositioning = 0x03, // (Stop) position relative to current - // Useful for seeking when paused (use +1) - AM_SEEKING_PositioningBitsMask = 0x03, // Useful mask - AM_SEEKING_SeekToKeyFrame = 0x04, // Just seek to key frame (performance gain) - AM_SEEKING_ReturnTime = 0x08, // Plug the media time equivalents back into the supplied LONGLONGs - - AM_SEEKING_Segment = 0x10, // At end just do EC_ENDOFSEGMENT, - // don't do EndOfStream - AM_SEEKING_NoFlush = 0x20 // Don't flush -} AM_SEEKING_SEEKING_FLAGS; - -typedef enum AM_SEEKING_SeekingCapabilities -{ - AM_SEEKING_CanSeekAbsolute = 0x001, - AM_SEEKING_CanSeekForwards = 0x002, - AM_SEEKING_CanSeekBackwards = 0x004, - AM_SEEKING_CanGetCurrentPos = 0x008, - AM_SEEKING_CanGetStopPos = 0x010, - AM_SEEKING_CanGetDuration = 0x020, - AM_SEEKING_CanPlayBackwards = 0x040, - AM_SEEKING_CanDoSegments = 0x080, - AM_SEEKING_Source = 0x100 // Doesn't pass thru used to - // count segment ends -} AM_SEEKING_SEEKING_CAPABILITIES; - -[ - object, - uuid(36b73880-c2c8-11cf-8b46-00805f6cef60), - pointer_default(unique) -] -interface IMediaSeeking : IUnknown { - - // Returns the capability flags - HRESULT GetCapabilities( [out] DWORD * pCapabilities ); - - // And's the capabilities flag with the capabilities requested. - // Returns S_OK if all are present, S_FALSE if some are present, E_FAIL if none. - // *pCababilities is always updated with the result of the 'and'ing and can be - // checked in the case of an S_FALSE return code. - HRESULT CheckCapabilities( [in,out] DWORD * pCapabilities ); - - // returns S_OK if mode is supported, S_FALSE otherwise - HRESULT IsFormatSupported([in] const GUID * pFormat); - HRESULT QueryPreferredFormat([out] GUID * pFormat); - - HRESULT GetTimeFormat([out] GUID *pFormat); - // Returns S_OK if *pFormat is the current time format, otherwise S_FALSE - // This may be used instead of the above and will save the copying of the GUID - HRESULT IsUsingTimeFormat([in] const GUID * pFormat); - - // (may return VFE_E_WRONG_STATE if graph is stopped) - HRESULT SetTimeFormat([in] const GUID * pFormat); - - // return current properties - HRESULT GetDuration([out] LONGLONG *pDuration); - HRESULT GetStopPosition([out] LONGLONG *pStop); - HRESULT GetCurrentPosition([out] LONGLONG *pCurrent); - - // Convert time from one format to another. - // We must be able to convert between all of the formats that we say we support. - // (However, we can use intermediate formats (e.g. MEDIA_TIME).) - // If a pointer to a format is null, it implies the currently selected format. - HRESULT ConvertTimeFormat([out] LONGLONG * pTarget, [in] const GUID * pTargetFormat, - [in] LONGLONG Source, [in] const GUID * pSourceFormat ); - - - // Set current and end positions in one operation - // Either pointer may be null, implying no change - HRESULT SetPositions( [in,out] LONGLONG * pCurrent, [in] DWORD dwCurrentFlags - , [in,out] LONGLONG * pStop, [in] DWORD dwStopFlags ); - - // Get CurrentPosition & StopTime - // Either pointer may be null, implying not interested - HRESULT GetPositions( [out] LONGLONG * pCurrent, - [out] LONGLONG * pStop ); - - // Get earliest / latest times to which we can currently seek "efficiently". - // This method is intended to help with graphs where the source filter has - // a very high latency. Seeking within the returned limits should just - // result in a re-pushing of already cached data. Seeking beyond these - // limits may result in extended delays while the data is fetched (e.g. - // across a slow network). - // (NULL pointer is OK, means caller isn't interested.) - HRESULT GetAvailable( [out] LONGLONG * pEarliest, [out] LONGLONG * pLatest ); - - // Rate stuff - HRESULT SetRate([in] double dRate); - HRESULT GetRate([out] double * pdRate); - - // Preroll - HRESULT GetPreroll([out] LONGLONG * pllPreroll); -} - -typedef IMediaSeeking *PMEDIASEEKING; - -// Flags for IMediaEventEx -cpp_quote("enum tagAM_MEDIAEVENT_FLAGS") -cpp_quote("{") -cpp_quote(" AM_MEDIAEVENT_NONOTIFY = 0x01") -cpp_quote("};") diff --git a/import/DirectX8/include/DShowIDL/axextend.idl b/import/DirectX8/include/DShowIDL/axextend.idl deleted file mode 100644 index f12295f61..000000000 --- a/import/DirectX8/include/DShowIDL/axextend.idl +++ /dev/null @@ -1,9423 +0,0 @@ -//------------------------------------------------------------------------------ -// File: AXExtend.idl -// -// Desc: Extended streaming interface definitions for the ActiveMovie -// streaming and synchronization architecture. Core streaming -// interfaces are in AXCore.idl, and control interfaces for the -// type library are in Control.odl. -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -// include after unknwn.idl, objidl.idl and axcore.idl - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// Separate the updated Windows XP version of this header from the downlevel -// version that shipped with the DirectX 8.0 SDK. Since development -// on BDA technology continued for Windows XP, some changes were made to -// this file in order to improve the interface and functionality. -// -// To maintain compatibility with older applications which rely on the -// DirectX 8.0 versions of these files, the DirectX 8.1 version includes -// both the Windows XP content and the DirectX 8.0 content, which are -// separated by the #if (WINVER >= 0x501) preprocessor directive. -// -// Therefore, if you define WINVER to be 0x501 to specify Windows XP, -// the revised content will be compiled. Otherwise, the original -// DirectX 8.0 content will be used. -// -///////////////////////////////////////////////////////////////////////////// - -#if (WINVER >= 0x501) // Windows XP content - - - -// forward declarations - these are the interfaces declared in this file - -interface IEnumRegFilters; -interface IFileSourceFilter; -interface IFileSinkFilter; -interface IFileSinkFilter2; -interface IGraphBuilder; -interface ICaptureGraphBuilder; -interface ICaptureGraphBuilder2; -interface IAMCopyCaptureFileProgress; -interface IFilterMapper; -interface IFilterMapper2; -interface IMediaEventSink; -interface IOverlay; -interface IOverlayNotify; -interface IOverlayNotify2; -interface IQualityControl; -interface ISeekingPassThru; -interface IAMStreamConfig; -interface IAMDevMemoryAllocator; -interface IAMDevMemoryControl; -interface IConfigInterleaving; -interface IConfigAviMux; -interface IAMVideoCompression; -interface IAMVfwCaptureDialogs; -interface IAMVfwCompressDialogs; -interface IAMDroppedFrames; -interface IAMAudioInputMixer; -interface IAMBufferNegotiation; -interface IAMAnalogVideoDecoder; -interface IAMVideoProcAmp; -interface IAMAnalogVideoEncoder; -interface IAMCameraControl; -interface IAMCrossbar; -interface IAMTVTuner; -interface IKsPropertySet; -interface IAMPhysicalPinInfo; -interface IAMExtDevice; -interface IAMExtTransport; -interface IAMTimecodeReader; -interface IAMTimecodeGenerator; -interface IAMTimecodeDisplay; -interface IDrawVideoImage; -interface IDecimateVideoImage; -interface IAMVideoDecimationProperties; -interface IAMPushSource; -interface IAMAudioRendererStats; -interface IAMLatency; -interface IAMGraphStreams; -interface IAMOverlayFX; -interface IAMOpenProgress; -interface IMpeg2Demultiplexer ; -interface IMPEG2StreamIdMap ; -interface IEnumStreamIdMap ; -interface IAMClockSlave ; - -//========================================================================== -//========================================================================== -// IEnumRegFilters interface -- enumerates registered filters. -// enumerator interface returned from IFilterMapper::EnumMatchingFilters(). -// based on IEnum pseudo-template -//========================================================================== -//========================================================================== - -typedef struct { - CLSID Clsid; // class id of the filter - LPWSTR Name; // name of filter -} REGFILTER; - -[ -object, -uuid(56a868a4-0ad4-11ce-b03a-0020af0ba770), -pointer_default(unique) -] - -// The point of the mapper is to avoid loading filters. By looking in the -// registry we can reduce the number of filters which must be loaded and tried. -// This enumerator returns descriptors of filters (including the GUIDs that -// CoCreateInstance can instantiate). The filters themselves are not loaded. - -interface IEnumRegFilters : IUnknown { - import "unknwn.idl"; - - // The caller must use CoTaskMemFree to free each REGFILTER* returned - // in the array. - HRESULT Next - ( [in] ULONG cFilters, // place this many filters... - [out] REGFILTER ** apRegFilter, // ...in this array of REGFILTER* - [out] ULONG * pcFetched // actual count passed returned here - ); - - // I can't think why anyone would want to skip, so it's not implemented. - // (anyone who thinks they know what they would be skipping over is probably - // missing some piece of the jigsaw). This ALWAYS returns E_NOTIMPL. - - HRESULT Skip( - [in] ULONG cFilters - ); - - HRESULT Reset(void); - - // No cloning either - also ALWAYS returns E_NOTIMPL. - - HRESULT Clone( - [out] IEnumRegFilters **ppEnum - ); -} - - -typedef IEnumRegFilters *PENUMREGFILTERS; - -//======================================================================== -//======================================================================== -// abstraction representing the registered information about filters. -// This allows properties of filters to be looked up without loading them. -//======================================================================== -//======================================================================== - -[ -object, -uuid(56a868a3-0ad4-11ce-b03a-0020af0ba770), -pointer_default(unique) -] -interface IFilterMapper : IUnknown { - import "unknwn.idl"; - - //========================================================================== - // Registration functions. - // A filter should be registered before any other use. - // The registration can be NON_VOLATILE (i.e. permanent, do once ever) - // or VOLATILE (once per boot of the system). - // UnregisterFilter (obviously) removes the registration. - // The action of any of the other calls on unregistered filters is undefined. - // it will either work or you'll get an error, but I'm not saying which. - //========================================================================== - - // Four predefined values controling the order in which filters are tried - // for intelligent graph building. Intermediate values are legal. - // Any value <=MERIT_DO_NOT_USE will mean that the filter will never - // be tried by the filtergrah to automatically complete a connection. - - enum { MERIT_PREFERRED = 0x800000, - MERIT_NORMAL = 0x600000, - MERIT_UNLIKELY = 0x400000, - MERIT_DO_NOT_USE = 0x200000, - MERIT_SW_COMPRESSOR = 0x100000, - MERIT_HW_COMPRESSOR = 0x100050 - }; - - // Register a filter - - HRESULT RegisterFilter - ( [in] CLSID clsid, // GUID of the filter - [in] LPCWSTR Name, // Descriptive name for the filter - [in] DWORD dwMerit // DO_NOT_USE, UNLIKELY, NORMAL or PREFERRED. - ); - - - // Register an identifiable instance of a filter. This deals with cases - // such as two similar sound cards which are driven by the same driver, - // but we want to choose which oif these cards the sound will come out of. - // This is not needed if there is only one instance of the filter - // (e.g. there is only one sound card in the machine) or if all instances - // of the filter are equivalent. - - // The filter itself must have already been registered // ??? Is that true? - HRESULT RegisterFilterInstance - ( [in] CLSID clsid, // GUID of the filter - [in] LPCWSTR Name, // Descriptive name of instance. - [out] CLSID *MRId // Returned Media Resource Id. A - // locally unique id for this instance - // of this filter - ); - - - HRESULT RegisterPin - ( [in] CLSID Filter, // GUID of filter - [in] LPCWSTR Name, // Name of the pin - [in] BOOL bRendered, // The filter renders this input - [in] BOOL bOutput, // TRUE if this is an Output pin - [in] BOOL bZero, // TRUE if OK for zero instances of pin - // In this case you will have to Create - // a pin to have even one instance - [in] BOOL bMany, // TRUE if OK for many instances of pin - [in] CLSID ConnectsToFilter, // Filter it connects to if it has - // subterranean connection, else NULL - [in] LPCWSTR ConnectsToPin // Name of pin it connects to - // NULL for output pins - ); - - HRESULT RegisterPinType - ( [in] CLSID clsFilter, // GUID of filter - [in] LPCWSTR strName, // Descriptive name of the pin - [in] CLSID clsMajorType, // Major type of the data stream - [in] CLSID clsSubType // Sub type of the data stream - ); - - - HRESULT UnregisterFilter - ( [in] CLSID Filter // GUID of filter - ); - - - HRESULT UnregisterFilterInstance - ( [in] CLSID MRId // Media Resource Id of this instance - ); - - - HRESULT UnregisterPin - ( [in] CLSID Filter, // GUID of filter - [in] LPCWSTR Name // Name of the pin - ); - - - // Set *ppEnum to be an enumerator for filters matching the requirements. - - HRESULT EnumMatchingFilters - ( [out] IEnumRegFilters **ppEnum // enumerator returned - , [in] DWORD dwMerit // at least this merit needed - , [in] BOOL bInputNeeded // need at least one input pin - , [in] CLSID clsInMaj // input major type - , [in] CLSID clsInSub // input sub type - , [in] BOOL bRender // must the input be rendered? - , [in] BOOL bOututNeeded // need at least one output pin - , [in] CLSID clsOutMaj // output major type - , [in] CLSID clsOutSub // output sub type - ); - -} - -// structure used to identify media types a pin handles. Used for -// registration through IFilterMapper and IFilterMapper2 -// -typedef struct -{ - const CLSID * clsMajorType; - const CLSID * clsMinorType; -} REGPINTYPES; - -// describes pin for filter registration. Used for registration -// through IFilterMapper and IFilterMapper2 -// -typedef struct -{ - LPWSTR strName; - - // The filter renders this input - BOOL bRendered; - - // This is an Output pin - BOOL bOutput; - - // OK to have zero instances of pin In this case you will have to - // Create a pin to have even one instance - BOOL bZero; - - // OK to create many instance of pin - BOOL bMany; - - const CLSID * clsConnectsToFilter; - const WCHAR * strConnectsToPin; - - UINT nMediaTypes; - const REGPINTYPES * lpMediaType; -} REGFILTERPINS; - -// mediums (as defined in the Windows NT DDK) for registration with -// IFilterMapper2 -// -typedef struct -{ - CLSID clsMedium; - DWORD dw1; - DWORD dw2; -} REGPINMEDIUM; - -// flags for dwFlags in REFILTERPINS2 -enum -{ - // OK to have zero instances of pin In this case you will have to - // Create a pin to have even one instance - REG_PINFLAG_B_ZERO = 0x1, - - // The filter renders this input - REG_PINFLAG_B_RENDERER = 0x2, - - // OK to create many instance of pin - REG_PINFLAG_B_MANY = 0x4, - - // This is an Output pin - REG_PINFLAG_B_OUTPUT = 0x8 -}; - - -// describes pin for filter registration through IFilterMapper2 -typedef struct -{ - // combination of REG_PINFLAG flags - DWORD dwFlags; - - // number of instances of the pin if known - UINT cInstances; - - UINT nMediaTypes; - [size_is(nMediaTypes)] const REGPINTYPES * lpMediaType; - - UINT nMediums; - [size_is(nMediums)] const REGPINMEDIUM *lpMedium; - - // pin category (for Kernel Streaming pins) as defined in the - // Windows NT DDK - const CLSID *clsPinCategory; - -} REGFILTERPINS2; - -// describes filter for registration through IFilterMapper2 -typedef struct -{ - DWORD dwVersion; // 1 or 2 - DWORD dwMerit; - - /* unnamed union */ - [switch_is(dwVersion)] [switch_type(DWORD)] union - { - [case(1)] - - struct - { - ULONG cPins; - [size_is(cPins)] const REGFILTERPINS *rgPins; - }; - - [case(2)] - - struct - { - ULONG cPins2; - [size_is(cPins2)] const REGFILTERPINS2 *rgPins2; - }; - - [default] - ; - } ; - -} REGFILTER2; - - - -[ -object, -uuid(b79bb0b0-33c1-11d1-abe1-00a0c905f375), -pointer_default(unique) -] -interface IFilterMapper2 : IUnknown { - import "unknwn.idl"; - - // create or rename ActiveMovie category - HRESULT CreateCategory - ( [in] REFCLSID clsidCategory, - [in] DWORD dwCategoryMerit, - [in] LPCWSTR Description - ); - - HRESULT UnregisterFilter - ( [in] const CLSID *pclsidCategory, - [in] const OLECHAR *szInstance, - [in] REFCLSID Filter // GUID of filter - ); - - // Register a filter, pins, and media types under a category. - HRESULT RegisterFilter - ( [in] REFCLSID clsidFilter, // GUID of the filter - [in] LPCWSTR Name, // Descriptive name for the filter - - // ppMoniker can be null. or *ppMoniker can contain the - // moniker where this filter data will be written; - // *ppMoniker will be set to null on return. or *ppMoniker - // can be null in which case the moniker will be returned - // with refcount. - [in, out] IMoniker **ppMoniker, - - // can be null - [in] const CLSID *pclsidCategory, - - // cannot be null - [in] const OLECHAR *szInstance, - - // rest of filter and pin registration - [in] const REGFILTER2 *prf2 - ); - - // Set *ppEnum to be an enumerator for filters matching the - // requirements. - HRESULT EnumMatchingFilters - ( [out] IEnumMoniker **ppEnum // enumerator returned - , [in] DWORD dwFlags // 0 - , [in] BOOL bExactMatch // don't match wildcards - , [in] DWORD dwMerit // at least this merit needed - , [in] BOOL bInputNeeded // need at least one input pin - , [in] DWORD cInputTypes // Number of input types to match - // Any match is OK - , [size_is(cInputTypes*2)] const GUID *pInputTypes // input major+subtype pair array - , [in] const REGPINMEDIUM *pMedIn // input medium - , [in] const CLSID *pPinCategoryIn // input pin category - , [in] BOOL bRender // must the input be rendered? - , [in] BOOL bOutputNeeded // need at least one output pin - , [in] DWORD cOutputTypes // Number of output types to match - // Any match is OK - , [size_is(cOutputTypes*2)] const GUID *pOutputTypes // output major+subtype pair array - , [in] const REGPINMEDIUM *pMedOut // output medium - , [in] const CLSID *pPinCategoryOut // output pin category - ); -} - -[ -object, -uuid(b79bb0b1-33c1-11d1-abe1-00a0c905f375), -pointer_default(unique) -] -interface IFilterMapper3 : IFilterMapper2 { - // new interface to allow creating filters using the mapper's devenum instance - // primarily needed for out-of-proc access to a graph - HRESULT GetICreateDevEnum( [out] ICreateDevEnum **ppEnum ); -} - -//======================================================================== -//======================================================================== -// Defines IQualityControl interface -// -// Defines quality messages and allows a quality manager to install itself -// as the sink for quality messages. -//======================================================================== -//======================================================================== - -typedef enum tagQualityMessageType { - Famine, - Flood -} QualityMessageType; - -typedef struct tagQuality { - QualityMessageType Type; - long Proportion; // milli-units. 1000 = no change - // for Flood: - // What proportion of the media samples currently - // coming through are required in the future. - // 800 means please drop another 20% - // For Famine: - // How much to "keep in" e.g. 800 means send me - // 20% less e.g. by dropping 20% of the samples. - // 1100 would mean "I'm coping, send me more". - REFERENCE_TIME Late; - // How much you need to catch up by - REFERENCE_TIME TimeStamp; - // The stream time when this was generated (probably - // corresponds to the start time on some sample). -} Quality; - -typedef IQualityControl *PQUALITYCONTROL; - - -[ -object, -uuid(56a868a5-0ad4-11ce-b03a-0020af0ba770), -pointer_default(unique) -] -interface IQualityControl : IUnknown { - - // Notify the recipient that a quality change is requested. - // pSelf is the IBaseFilter* of the sender. - // this is sent from a filter - // to (the quality manager or) an upstream peer. - HRESULT Notify - ( [in] IBaseFilter * pSelf, - [in] Quality q - ); - - // Notify the recipient that future quality messages are to be sent - // to iqc. If piqc is NULL then quality messages are to default back to - // the upstream peer. - // This is sent from the quality manager to a filter. - // The recipient should hold piqc as a WEAK reference, - // i.e. do not AddRef it, do not Release it. - HRESULT SetSink - ( [in] IQualityControl * piqc - ); -} - -//===================================================================== -//===================================================================== -// Definitions required for overlay transport -//===================================================================== -//===================================================================== - - -// Used to communicate the colour that the IOverlay client wants the window -// painted in so that it can draw directly to the correct clipping region -// A colour key can be described in two alternate ways, the first is by a -// range of one or more (system) palette indices. The second is by defining -// a colour cube with two RGB values, any of which would be acceptable. -// -// The CK values are consistent with GDI PALETTEINDEX and PALETTERGB macros - - -enum { CK_NOCOLORKEY = 0x0, // No color key is required - CK_INDEX = 0x1, // Index into the current system palette - CK_RGB = 0x2 }; // Color key is an RGB value (or range) - -typedef struct tagCOLORKEY { - - DWORD KeyType; // Explains meaning of the structure - DWORD PaletteIndex; // Palette index if available - COLORREF LowColorValue; // Low colour space RGB value - COLORREF HighColorValue; // Defines the high RGB value - -} COLORKEY; - -// When a filter sets up an advise link it can ask that only certain types -// of notifications be sent, for example just palette changes. While this -// doesn't mean that the other notification call backs won't ever be called -// the IOverlay implementation may use this as an efficiency optimisation - -enum { ADVISE_NONE = 0x0, // No notifications required - ADVISE_CLIPPING = 0x1, // Synchronous clip information - ADVISE_PALETTE = 0x2, // Palette change notifications - ADVISE_COLORKEY = 0x4, // Called when colour key changes - ADVISE_POSITION = 0x8, // Likewise when window moves etc - ADVISE_DISPLAY_CHANGE = 0x10 // Called on WM_DISPLAYCHANGE - }; - -const DWORD ADVISE_ALL = ADVISE_CLIPPING | - ADVISE_PALETTE | - ADVISE_COLORKEY | - ADVISE_POSITION; - -const DWORD ADVISE_ALL2 = ADVISE_ALL | - ADVISE_DISPLAY_CHANGE; - -// This isn't defined when you run IDL - -cpp_quote("#ifndef _WINGDI_") - -typedef struct _RGNDATAHEADER { - DWORD dwSize; - DWORD iType; - DWORD nCount; - DWORD nRgnSize; - RECT rcBound; -} RGNDATAHEADER; - -typedef struct _RGNDATA { - RGNDATAHEADER rdh; - char Buffer[1]; -} RGNDATA; - -cpp_quote("#endif") - - -//===================================================================== -//===================================================================== -// Defines IOverlayNotify interface -// -// This interface gives asynchronous notifications of changes to the -// rendering window - such as changes to the exposed window area -//===================================================================== -//===================================================================== - -[ -object, -local, -uuid(56a868a0-0ad4-11ce-b03a-0020af0ba770), -pointer_default(unique) -] -interface IOverlayNotify : IUnknown { - - // IOverlayNotify methods - - // This notifies the filter of palette changes, the filter should copy - // the array of RGBQUADs if it needs to use them after returning. This - // is not called when the palette is actually changed in the display - // but at a short time after (in sync with WM_PALETTECHANGED messages) - - HRESULT OnPaletteChange( - [in] DWORD dwColors, // Number of colours present - [in] const PALETTEENTRY *pPalette); // Array of palette colours - - // This provides synchronous clip changes so that the client is called - // before the window is moved to freeze the video, and then when the - // window has stabilised it is called again to start playback again. - // If the window rect is all zero then the window is invisible, the - // filter must take a copy of the information if it wants to keep it - - HRESULT OnClipChange( - [in] const RECT *pSourceRect, // Region of video to use - [in] const RECT *pDestinationRect, // Where video goes - [in] const RGNDATA *pRgnData); // Defines clipping information - - HRESULT OnColorKeyChange([in] const COLORKEY *pColorKey); - - // The calls to OnClipChange happen in sync with the window. So it is - // called with an empty clip list before the window moves to freeze - // the video, and then when the window has stabilised it is called - // again with the new clip list. The OnPositionChange callback is for - // overlay cards that don't want the expense of synchronous clipping - // updates and just want to know when the source or destination video - // positions change. They will NOT be called in sync with the window - // but at some point after the window has changed (basicly in time - // with WM_SIZE etc messages received). This is therefore suitable - // for overlay cards that don't inlay their data to the frame buffer - // NOTE the destination is NOT clipped to the visible display area - - HRESULT OnPositionChange([in] const RECT *pSourceRect, - [in] const RECT *pDestinationRect); -} - -typedef IOverlayNotify *POVERLAYNOTIFY; - - -//===================================================================== -//===================================================================== -// Defines IOverlayNotify2 interface -// -// This interface gives asynchronous notifications of changes to the -// rendering window - such as changes to the exposed window area -// This is optionally supported by the advise sink for the purposes -// of accepting OnDisplayChange notification. -//===================================================================== -//===================================================================== - -cpp_quote("#if !defined(HMONITOR_DECLARED) && !defined(HMONITOR) && (WINVER < 0x0500)") -cpp_quote("#define HMONITOR_DECLARED") -cpp_quote("#if 0") -typedef HANDLE HMONITOR; -cpp_quote("#endif") -cpp_quote("DECLARE_HANDLE(HMONITOR);") -cpp_quote("#endif") - -[ -object, -local, -uuid(680EFA10-D535-11D1-87C8-00A0C9223196), -pointer_default(unique) -] -interface IOverlayNotify2 : IOverlayNotify { - - // IOverlayNotify2 methods - - HRESULT OnDisplayChange( // ADVISE_DISPLAY_CHANGE - HMONITOR hMonitor); -} - -typedef IOverlayNotify2 *POVERLAYNOTIFY2; - - -//===================================================================== -//===================================================================== -// Defines IOverlay interface -// -// This interface provides information so that a filter can write direct to -// the frame buffer while placing the video in the correct window position -//===================================================================== -//===================================================================== - -[ -object, -local, -uuid(56a868a1-0ad4-11ce-b03a-0020af0ba770), -pointer_default(unique) -] -interface IOverlay : IUnknown { - - // IOverlay methods - - HRESULT GetPalette( - [out] DWORD *pdwColors, // Number of colours present - [out] PALETTEENTRY **ppPalette); // Where to put palette data - - HRESULT SetPalette( - [in] DWORD dwColors, // Number of colours present - [in] PALETTEENTRY *pPalette); // Colours to use for palette - - // If you change the colour key through SetColorKey then all the advise - // links will receive an OnColorKeyChange callback with the new colour - - HRESULT GetDefaultColorKey([out] COLORKEY *pColorKey); - HRESULT GetColorKey([out] COLORKEY *pColorKey); - HRESULT SetColorKey([in,out] COLORKEY *pColorKey); - HRESULT GetWindowHandle([out] HWND *pHwnd); - - // The IOverlay implementation allocates the memory for the clipping - // rectangles as it can be variable in length. The filter calling - // this method should free the memory when it is finished with it - - HRESULT GetClipList([out] RECT *pSourceRect, - [out] RECT *pDestinationRect, - [out] RGNDATA **ppRgnData); - - // Returns the current video source and destination - - HRESULT GetVideoPosition([out] RECT *pSourceRect, - [out] RECT *pDestinationRect); - - HRESULT Advise( - [in] IOverlayNotify *pOverlayNotify, // Notification interface - [in] DWORD dwInterests); // Callbacks interested in - - HRESULT Unadvise(); // Stop the callbacks now -} - -typedef IOverlay *POVERLAY; - - -//===================================================================== -//===================================================================== -// control related interfaces (others are defined in control.odl) -//===================================================================== -//===================================================================== - - -//===================================================================== -//===================================================================== -// Defines IMediaEventSink interface -// -// Exposed by filtergraph. Called by filters to notify events. Will be -// passed on to application by the IMediaControl event methods. -//===================================================================== -//===================================================================== - -[ - object, - uuid(56a868a2-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IMediaEventSink : IUnknown { - - // notify an event. will be queued, but not delivered to - // the application on this thread. - HRESULT Notify( - [in] long EventCode, - [in] LONG_PTR EventParam1, - [in] LONG_PTR EventParam2 - ); -} - -typedef IMediaEventSink *PMEDIAEVENTSINK; - -//===================================================================== -//===================================================================== -// Defines IFileSourceFilter interface -// -// Exposed by source filters to set the file name and media type. -//===================================================================== -//===================================================================== - -[ - object, - uuid(56a868a6-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IFileSourceFilter : IUnknown { - - // Load a file and assign it the given media type - HRESULT Load( - [in] LPCOLESTR pszFileName, // Pointer to absolute path of file to open - [in, unique] const AM_MEDIA_TYPE *pmt // Media type of file - can be NULL - ); - // Get the currently loaded file name - HRESULT GetCurFile( - [out] LPOLESTR *ppszFileName, // Pointer to the path for the current file - [out] AM_MEDIA_TYPE *pmt // Pointer to the media type - ); -} - -typedef IFileSourceFilter *PFILTERFILESOURCE; - -//===================================================================== -//===================================================================== -// Defines IFileSinkFilter interface -// -// Exposed by renderers to set the output file name. -//===================================================================== -//===================================================================== - -[ - object, - uuid(a2104830-7c70-11cf-8bce-00aa00a3f1a6), - pointer_default(unique) -] -interface IFileSinkFilter : IUnknown { - - // Output to this file. default is to open the existing file - HRESULT SetFileName( - [in] LPCOLESTR pszFileName, // Pointer to absolute path of output file - [in, unique] const AM_MEDIA_TYPE *pmt // Media type of file - can be NULL - ); - // Get the current file name - HRESULT GetCurFile( - [out] LPOLESTR *ppszFileName, // Pointer to the path for the current file - [out] AM_MEDIA_TYPE *pmt // Pointer to the media type - ); -} - -typedef IFileSinkFilter *PFILTERFILESINK; - -[ - object, - uuid(00855B90-CE1B-11d0-BD4F-00A0C911CE86), - pointer_default(unique) -] -interface IFileSinkFilter2 : IFileSinkFilter { - - HRESULT SetMode( - [in] DWORD dwFlags // AM_FILESINK_FLAGS - ); - - HRESULT GetMode( - [out] DWORD *pdwFlags // AM_FILESINK_FLAGS - ); -} - -typedef IFileSinkFilter2 *PFILESINKFILTER2; - -typedef enum { - - // create a new file - AM_FILE_OVERWRITE = 0x00000001, - -} AM_FILESINK_FLAGS; - - -// -// Intelligent connectivity for filters - an interface supported by -// filter graphs (since it is an extension to IFilterGraph) that supports -// building of graphs by automatic selection and connection of appropriate -// filters - -[ - object, - uuid(56a868a9-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IGraphBuilder : IFilterGraph { - // Connect these two pins directly or indirectly, using transform filters - // if necessary. - - HRESULT Connect - ( [in] IPin * ppinOut, // the output pin - [in] IPin * ppinIn // the input pin - ); - - - // Connect this output pin directly or indirectly, using transform filters - // if necessary to something that will render it. - - HRESULT Render - ( [in] IPin * ppinOut // the output pin - ); - - - // Build a filter graph that will render this file using this play list. - // If lpwstrPlayList is NULL then it will use the default play list - // which will typically render the whole file. - - HRESULT RenderFile - ( [in] LPCWSTR lpcwstrFile, - [in, unique] LPCWSTR lpcwstrPlayList - ); - - - // Add to the filter graph a source filter for this file. This would - // be the same source filter that would be added by calling Render. - // This call gives you more control over building - // the rest of the graph, e.g. AddFilter() - // and then Connect the two. - // The IBaseFilter* interface exposed by the source filter is returned - // in ppFilter, addrefed already for you - // The filter will be known by the name lpcwstrFIlterName - // nn this filter graph, - HRESULT AddSourceFilter - ( [in] LPCWSTR lpcwstrFileName, - [in, unique] LPCWSTR lpcwstrFilterName, - [out] IBaseFilter* *ppFilter - ); - - - // If this call is made then trace information will be written to the - // file showing the actions taken in attempting to perform an operation. - HRESULT SetLogFile - ( [in] DWORD_PTR hFile // open file handle e.g. from CreateFile - ); - - - // Request that the graph builder should return as soon as possible from - // its current task. - // Note that it is possible fot the following to occur in the following - // sequence: - // Operation begins; Abort is requested; Operation completes normally. - // This would be normal whenever the quickest way to finish an operation - // was to simply continue to the end. - HRESULT Abort(); - - // Return S_OK if the curent operation is to continue, - // return S_FALSE if the current operation is to be aborted. - // This method can be called as a callback from a filter which is doing - // some operation at the request of the graph. - HRESULT ShouldOperationContinue(); - -} - - -// -// New capture graph builder - -[ - object, - uuid(bf87b6e0-8c27-11d0-b3f0-00aa003761c5), - pointer_default(unique) -] -interface ICaptureGraphBuilder : IUnknown { - - // Use this filtergraph - HRESULT SetFiltergraph( - [in] IGraphBuilder *pfg); - - // what filtergraph are you using? - // *ppfg->Release() when you're done with it - HRESULT GetFiltergraph( - [out] IGraphBuilder **ppfg); - - // creates a rendering section in the filtergraph consisting of a MUX - // of some filetype, and a file writer (and connects them together) - // *ppf->Release() when you're done with it - // *ppSink->Release() when you're done with it - HRESULT SetOutputFileName( - [in] const GUID *pType, // type of file to write, eg. MEDIASUBTYPE_Avi - [in] LPCOLESTR lpstrFile, // filename given to file writer - [out] IBaseFilter **ppf, // returns pointer to the MUX - [out] IFileSinkFilter **ppSink);// queried from file writer - - // Looks for an interface on the filter and on the output pin of the given - // category. (Categories: CAPTURE/PREVIEW/VIDEOPORT/VBI etc. or - // NULL for "don't care". - // It will also look upstream and downstream of - // the pin for the interface, to find interfaces on renderers, MUXES, TV - // Tuners, etc. - // Call *ppint->Release() when you're done with it - [local] HRESULT FindInterface( - [in, unique] const GUID *pCategory, // can be NULL for all pins - [in] IBaseFilter *pf, - [in] REFIID riid, - [out] void **ppint); - [call_as(FindInterface)] HRESULT RemoteFindInterface( - [in, unique] const GUID *pCategory, // can be NULL for all pins - [in] IBaseFilter *pf, - [in] REFIID riid, - [out] IUnknown **ppint); - - // Connects the pin of the given category of the source filter to the - // rendering filter, optionally through another filter (compressor?) - // For a non-NULL category, it will instantiate and connect additional - // required filters upstream too, like TV Tuners and Crossbars. - // If there is only one output pin on the source, use a NULL - // category. You can also have pSource be a pin - HRESULT RenderStream( - [in] const GUID *pCategory, // can be NULL if only one output pin - [in] IUnknown *pSource, // filter or pin - [in] IBaseFilter *pfCompressor, - [in] IBaseFilter *pfRenderer); // can be NULL - - // Sends IAMStreamControl messages to the pin of the desired category, eg. - // "capture" or "preview" - // REFERENCE_TIME=NULL means NOW - // REFERENCE_TIME=MAX_TIME means never, or cancel previous request - // NULL controls all capture filters in the graph - you will get one - // notification for each filter with a pin of that category found - // returns S_FALSE if stop will be signalled before last sample is - // rendered. - // return a FAILURE code if the filter does not support IAMStreamControl - HRESULT ControlStream( - [in] const GUID *pCategory, - [in] IBaseFilter *pFilter, - [in] REFERENCE_TIME *pstart, - [in] REFERENCE_TIME *pstop, - [in] WORD wStartCookie, // high word reserved - [in] WORD wStopCookie); // high word reserved - - // creates a pre-allocated file of a given size in bytes - HRESULT AllocCapFile( - [in] LPCOLESTR lpstr, - [in] DWORDLONG dwlSize); - - // Copies the valid file data out of the old, possibly huge old capture - // file into a shorter new file. - // Return S_FALSE from your progress function to abort capture, S_OK to - // continue - HRESULT CopyCaptureFile( - [in] LPOLESTR lpwstrOld, - [in] LPOLESTR lpwstrNew, - [in] int fAllowEscAbort, // pressing ESC will abort? - [in] IAMCopyCaptureFileProgress *pCallback); // implement this to - // get progress -} - - -// -// Capture graph builder "CopyCapturedFile" progress callback - -[ - object, - uuid(670d1d20-a068-11d0-b3f0-00aa003761c5), - pointer_default(unique) -] -interface IAMCopyCaptureFileProgress : IUnknown { - - // If you support this interface somewhere, this function will be called - // periodically while ICaptureGraphBuilder::CopyCaptureFile is executing - // to let you know the progress - // - // Return S_OK from this function to continue. Return S_FALSE to abort the - // copy - HRESULT Progress( - [in] int iProgress); // a number between 0 and 100 (%) -} - - -// -// Capture graph builder that can deal with a single filter having more than -// one pin of each category... some new devices can capture both audio and -// video, for example -// - -[ - object, - uuid(93E5A4E0-2D50-11d2-ABFA-00A0C9C6E38D), - pointer_default(unique) -] -interface ICaptureGraphBuilder2 : IUnknown { - - // Use this filtergraph - HRESULT SetFiltergraph( - [in] IGraphBuilder *pfg); - - // what filtergraph are you using? - // *ppfg->Release() when you're done with it - HRESULT GetFiltergraph( - [out] IGraphBuilder **ppfg); - - // creates a rendering section in the filtergraph consisting of a MUX - // of some filetype, and a file writer (and connects them together) - // *ppf->Release() when you're done with it - // *ppSink->Release() when you're done with it - HRESULT SetOutputFileName( - [in] const GUID *pType, // GUID of MUX filter to use - [in] LPCOLESTR lpstrFile, // filename given to file writer - [out] IBaseFilter **ppf, // returns pointer to the MUX - [out] IFileSinkFilter **ppSink);// queried from file writer - - // Looks for an interface on the filter and on the output pin of the given - // category and type. (Categories: CAPTURE/PREVIEW/VIDEOPORT/VBI etc. or - // NULL for "don't care". Type: MAJORTYPE_Video/Audio etc or NULL) - // !!! Will some filters have >1 capture pin? ie RGB and MPEG? - // It will also look upstream and downstream of - // the pin for the interface, to find interfaces on renderers, MUXES, TV - // Tuners, etc. - // Call *ppint->Release() when you're done with it - [local] HRESULT FindInterface( - [in] const GUID *pCategory, // can be NULL for all pins - [in] const GUID *pType, // Audio/Video/??? or NULL (don't care) - [in] IBaseFilter *pf, - [in] REFIID riid, - [out] void **ppint); - [call_as(FindInterface)] HRESULT RemoteFindInterface( - [in] const GUID *pCategory, // can be NULL for all pins - [in] const GUID *pType, // Audio/Video/??? or NULL (don't care) - [in] IBaseFilter *pf, - [in] REFIID riid, - [out] IUnknown **ppint); - - // Connects the pin of the given category and type of the source filter to - // the rendering filter, optionally through another filter (compressor?) - // (Type is a Majortype, like Video or Audio) - // For a non-NULL category, it will instantiate and connect additional - // required filters upstream too, like TV Tuners and Crossbars. - // If there is only one output pin on the source, use a NULL category - // and type. You can also have pSource be a pin - HRESULT RenderStream( - [in] const GUID *pCategory, // can be NULL if only one output pin - [in] const GUID *pType, // Major type (Video/Audio/etc) - [in] IUnknown *pSource, // filter or pin - [in] IBaseFilter *pfCompressor, - [in] IBaseFilter *pfRenderer); // can be NULL - - // Sends IAMStreamControl messages to the pin of the desired category, - // (eg. "capture" or "preview") and of the desired type (eg. VIDEO or AUDIO) - // A category MUST be given. If a filter is given, a type must be too. - // REFERENCE_TIME=NULL means NOW - // REFERENCE_TIME=MAX_TIME means never, or cancel previous request - // NULL controls all capture filters in the graph - you will get one - // notification for each filter with a pin of that category found - // returns S_FALSE if stop will be signalled before last sample is - // rendered. - // return a FAILURE code if the filter does not support IAMStreamControl - HRESULT ControlStream( - [in] const GUID *pCategory, - [in] const GUID *pType, // Major type (Video/Audio/etc) - [in] IBaseFilter *pFilter, - [in] REFERENCE_TIME *pstart, - [in] REFERENCE_TIME *pstop, - [in] WORD wStartCookie, // high word reserved - [in] WORD wStopCookie); // high word reserved - - // creates a pre-allocated file of a given size in bytes - HRESULT AllocCapFile( - [in] LPCOLESTR lpstr, - [in] DWORDLONG dwlSize); - - // Copies the valid file data out of the old, possibly huge old capture - // file into a shorter new file. - // Return S_FALSE from your progress function to abort capture, S_OK to - // continue - HRESULT CopyCaptureFile( - [in] LPOLESTR lpwstrOld, - [in] LPOLESTR lpwstrNew, - [in] int fAllowEscAbort, // pressing ESC will abort? - [in] IAMCopyCaptureFileProgress *pCallback); // implement this to - // get progress - // Helper fn to find a certain pin on a filter. - HRESULT FindPin( - [in] IUnknown *pSource, - [in] PIN_DIRECTION pindir, // input or output? - [in] const GUID *pCategory, // what category? (or NULL) - [in] const GUID *pType, // what Major type (or NULL) - [in] BOOL fUnconnected, // must it be unconnected? - [in] int num, // which pin matching this? (0 based) - [out] IPin **ppPin); -} - -enum _AM_RENSDEREXFLAGS { - AM_RENDEREX_RENDERTOEXISTINGRENDERERS = 0x01 // Dont add any renderers -}; - -// -// IFilterGraph2 -// -// New methods on for IFilterGraph and IGraphBuilder will have to go here. -// - -[ - object, - uuid(36b73882-c2c8-11cf-8b46-00805f6cef60), - pointer_default(unique) -] -interface IFilterGraph2: IGraphBuilder { - - // Add a Moniker source moniker - HRESULT AddSourceFilterForMoniker( - [in] IMoniker *pMoniker, - [in] IBindCtx *pCtx, - [in, unique] LPCWSTR lpcwstrFilterName, - [out] IBaseFilter **ppFilter - ); - - // Specify the type for a reconnect - // This is better than Reconnect as sometime the parties to a - // reconnection can't remember what type they'd agreed (!) - HRESULT ReconnectEx - ( [in] IPin * ppin, // the pin to disconnect and reconnect - [in, unique] const AM_MEDIA_TYPE *pmt // the type to reconnect with - can be NULL - ); - - // Render a pin without adding any new renderers - HRESULT RenderEx( [in] IPin *pPinOut, // Pin to render - [in] DWORD dwFlags, // flags - [in, out] DWORD *pvContext // Unused - set to NULL - ); - -#if 0 - // Method looks for a filter which supports the specified interface. If such - // a filter exists, an AddRef()'ed pointer to the requested interface is placed - // in *ppInterface. - // - // *ppInterface will be NULL on return if such a filter could not be found, and - // the method will return E_NOINTERFACE. - // - // pdwIndex is an internal index that is used for obtaining subsequent interfaces. - // *pdwIndex should be initialized to zero. It is set on return to a value that - // allows the implementation of FindFilterInterface to search for further interfaces - // if called again. If no more such interfaces exist, the method will return E_NOINTERFACE. - // - // If pdwIndex is NULL, FindFilterInterface returns an interface only if there is just - // a single filter in the graph that supports the interface. Otherwise it returns - // E_NOINTERFACE. - // - HRESULT FindFilterInterface( [in] REFIID iid, [out] void ** ppInterface, [in,out] LPDWORD pdwIndex ); - - // Tries to obtain the interface from the filter graph itself. If this fails, - // it attempts to find the unique filter that supports the interface. - // On failure the method will return E_NOINTERFACE. On success, it returns - // S_OK and an AddRef()'ed pointer to the requested interface in *ppInterface. - // - HRESULT FindInterface( [in] REFIID iid, [out] void ** ppInterface ); - -#endif -} - -// -// StreamBuilder -// aka Graph building with constraints -// aka convergent graphs -// aka Closed captioning - -[ - object, - local, - uuid(56a868bf-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IStreamBuilder : IUnknown { - - // Connect this output pin directly or indirectly, using transform filters - // if necessary to thing(s) that will render it, within this graph - // Move from Initial state to Rendered state. - - HRESULT Render - ( [in] IPin * ppinOut, // the output pin - [in] IGraphBuilder * pGraph // the graph - ); - - // Undo what you did in Render. Return to Initial state. - HRESULT Backout - ( [in] IPin * ppinOut, // the output pin - [in] IGraphBuilder * pGraph // the graph - ); -} - - -// async reader interface - supported by file source filters. Allows -// multiple overlapped reads from different positions - - -[ - object, - uuid(56a868aa-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IAsyncReader : IUnknown -{ - // pass in your preferred allocator and your preferred properties. - // method returns the actual allocator to be used. Call GetProperties - // on returned allocator to learn alignment and prefix etc chosen. - // this allocator will be not be committed and decommitted by - // the async reader, only by the consumer. - // Must call this before calling Request. - HRESULT RequestAllocator( - [in] IMemAllocator* pPreferred, - [in] ALLOCATOR_PROPERTIES* pProps, - [out] IMemAllocator ** ppActual); - - // queue a request for data. - // media sample start and stop times contain the requested absolute - // byte position (start inclusive, stop exclusive). - // may fail if sample not obtained from agreed allocator. - // may fail if start/stop position does not match agreed alignment. - // samples allocated from source pin's allocator may fail - // GetPointer until after returning from WaitForNext. - // Stop position must be aligned - this means it may exceed duration. - // on completion, stop position will be corrected to unaligned - // actual data. - HRESULT Request( - [in] IMediaSample* pSample, - [in] DWORD_PTR dwUser); // user context - - // block until the next sample is completed or the timeout occurs. - // timeout (millisecs) may be 0 or INFINITE. Samples may not - // be delivered in order. If there is a read error of any sort, a - // notification will already have been sent by the source filter, - // and HRESULT will be an error. - // If ppSample is not null, then a Request completed with the result - // code returned. - HRESULT WaitForNext( - [in] DWORD dwTimeout, - [out] IMediaSample** ppSample, // completed sample - [out] DWORD_PTR * pdwUser); // user context - - // sync read of data. Sample passed in must have been acquired from - // the agreed allocator. Start and stop position must be aligned. - // equivalent to a Request/WaitForNext pair, but may avoid the - // need for a thread on the source filter. - HRESULT SyncReadAligned( - [in] IMediaSample* pSample); - - - // sync read. works in stopped state as well as run state. - // need not be aligned. Will fail if read is beyond actual total - // length. - HRESULT SyncRead( - [in] LONGLONG llPosition, // absolute file position - [in] LONG lLength, // nr bytes required - [out, size_is(lLength)] - BYTE* pBuffer); // write data here - - // return total length of stream, and currently available length. - // reads for beyond the available length but within the total length will - // normally succeed but may block for a long period. - HRESULT Length( - [out] LONGLONG* pTotal, - [out] LONGLONG* pAvailable); - - // cause all outstanding reads to return, possibly with a failure code - //(VFW_E_TIMEOUT) indicating they were cancelled. - // Between BeginFlush and EndFlush calls, Request calls will fail and - // WaitForNext calls will always complete immediately. - HRESULT BeginFlush(void); - HRESULT EndFlush(void); -} - - -// interface provided by the filtergraph itself to let other objects -// (especially plug-in distributors, but also apps like graphedt) know -// when the graph has changed. -[ - object, - uuid(56a868ab-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IGraphVersion : IUnknown -{ - // returns the current graph version number - // this is incremented every time there is a change in the - // set of filters in the graph or in their connections - // - // if this is changed since your last enumeration, then re-enumerate - // the graph - HRESULT QueryVersion(LONG* pVersion); -} - - - - -// -// interface describing an object that uses resources. -// -// implement if: you request resources using IResourceManager. You will -// need to pass your implementation of this pointer as an in param. -// -// use if: you are a resource manager who implements IResourceManager -[ - object, - uuid(56a868ad-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IResourceConsumer : IUnknown -{ - // you may acquire the resource specified. - // return values: - // S_OK -- I have successfully acquired it - // S_FALSE -- I will acquire it and call NotifyAcquire afterwards - // VFW_S_NOT_NEEDED: I no longer need the resource - // FAILED(hr)-I tried to acquire it and failed. - - HRESULT - AcquireResource( - [in] LONG idResource); - - - - // Please release the resource. - // return values: - // S_OK -- I have released it (and want it again when available) - // S_FALSE -- I will call NotifyRelease when I have released it - // other something went wrong. - HRESULT - ReleaseResource( - [in] LONG idResource); -} - - - -// interface describing a resource manager that will resolve contention for -// named resources. -// -// implement if: you are a resource manager. The filtergraph will be a resource -// manager, internally delegating to the system wide resource manager -// (when there is one) -// -// use if: you need resources that are limited. Use the resource manager to -// resolve contention by registering the resource with this interface, -// and requesting it from this interface whenever needed. -// -// or use if: you detect focus changes which should affect resource usage. -// Notifying change of focus to the resource manager will cause the resource -// manager to switch contended resources to the objects that have the user's -// focus -[ - object, - uuid(56a868ac-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IResourceManager : IUnknown -{ - // tell the manager how many there are of a resource. - // ok if already registered. will take new count. if new count - // is lower, will de-allocate resources to new count. - // - // You get back a token that will be used in further calls. - // - // Passing a count of 0 will eliminate this resource. There is currently - // no defined way to find the id without knowing the count. - // - HRESULT - Register( - [in] LPCWSTR pName, // this named resource - [in] LONG cResource, // has this many instances - [out] LONG* plToken // token placed here on return - ); - - HRESULT - RegisterGroup( - [in] LPCWSTR pName, // this named resource group - [in] LONG cResource, // has this many resources - [in, size_is(cResource)] - LONG* palTokens, // these are the contained resources - [out] LONG* plToken // group resource id put here on return - ); - - // request the use of a given, registered resource. - // possible return values: - // S_OK == yes you can use it now - // S_FALSE == you will be called back when the resource is available - // other - there is an error. - // - // The priority of this request should be affected by the associated - // focus object -- that is, when SetFocus is called for that focus - // object (or a 'related' object) then my request should be put through. - // - // A filter should pass the filter's IUnknown here. The filtergraph - // will match filters to the filtergraph, and will attempt to trace - // filters to common source filters when checking focus objects. - // The Focus object must be valid for the entire lifetime of the request - // -- until you call CancelRequest or NotifyRelease(id, p, FALSE) - HRESULT - RequestResource( - [in] LONG idResource, - [in] IUnknown* pFocusObject, - [in] IResourceConsumer* pConsumer - ); - - - // notify the resource manager that an acquisition attempt completed. - // Call this method after an AcquireResource method returned - // S_FALSE to indicate asynchronous acquisition. - // HR should be S_OK if the resource was successfully acquired, or a - // failure code if the resource could not be acquired. - HRESULT - NotifyAcquire( - [in] LONG idResource, - [in] IResourceConsumer* pConsumer, - [in] HRESULT hr); - - // Notify the resource manager that you have released a resource. Call - // this in response to a ReleaseResource method, or when you have finished - // with the resource. bStillWant should be TRUE if you still want the - // resource when it is next available, or FALSE if you no longer want - // the resource. - HRESULT - NotifyRelease( - [in] LONG idResource, - [in] IResourceConsumer* pConsumer, - [in] BOOL bStillWant); - - // I don't currently have the resource, and I no longer need it. - HRESULT - CancelRequest( - [in] LONG idResource, - [in] IResourceConsumer* pConsumer); - - // Notify the resource manager that a given object has been given the - // user's focus. In ActiveMovie, this will normally be a video renderer - // whose window has received the focus. The filter graph will switch - // contended resources to (in order): - // requests made with this same focus object - // requests whose focus object shares a common source with this - // requests whose focus object shares a common filter graph - // After calling this, you *must* call ReleaseFocus before the IUnknown - // becomes invalid, unless you can guarantee that another SetFocus - // of a different object is done in the meantime. No addref is held. - // - // The resource manager will hold this pointer until replaced or cancelled, - // and will use it to resolve resource contention. It will call - // QueryInterface for IBaseFilter at least and if found will call methods on - // that interface. - HRESULT - SetFocus( - [in] IUnknown* pFocusObject); - - // Sets the focus to NULL if the current focus object is still - // pFocusObject. Call this when - // the focus object is about to be destroyed to ensure that no-one is - // still referencing the object. - HRESULT - ReleaseFocus( - [in] IUnknown* pFocusObject); - - - -// !!! still need -// -- app override (some form of SetPriority) -// -- enumeration and description of resources - -} - - -// -// Interface representing an object that can be notified about state -// and other changes within a filter graph. The filtergraph will call plug-in -// distributors that expose this optional interface so that they can -// respond to appropriate changes. -// -// Implement if: you are a plug-in distributor (your class id is found -// under HKCR\Interface\\Distributor= for some interface). -// -// Use if: you are the filtergraph. -[ - object, - uuid(56a868af-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IDistributorNotify : IUnknown -{ - // called when graph is entering stop state. Called before - // filters are stopped. - HRESULT Stop(void); - - // called when graph is entering paused state, before filters are - // notified - HRESULT Pause(void); - - // called when graph is entering running state, before filters are - // notified. tStart is the stream-time offset parameter that will be - // given to each filter's IBaseFilter::Run method. - HRESULT Run(REFERENCE_TIME tStart); - - // called when the graph's clock is changing, with the new clock. Addref - // the clock if you hold it beyond this method. Called before - // the filters are notified. - HRESULT SetSyncSource( - [in] IReferenceClock * pClock); - - // called when the set of filters or their connections has changed. - // Called on every AddFilter, RemoveFilter or ConnectDirect (or anything - // that will lead to one of these). - // You don't need to rebuild your list of interesting filters at this point - // but you should release any refcounts you hold on any filters that - // have been removed. - HRESULT NotifyGraphChange(void); -} - -typedef enum { - AM_STREAM_INFO_START_DEFINED = 0x00000001, - AM_STREAM_INFO_STOP_DEFINED = 0x00000002, - AM_STREAM_INFO_DISCARDING = 0x00000004, - AM_STREAM_INFO_STOP_SEND_EXTRA = 0x00000010 -} AM_STREAM_INFO_FLAGS; - -// Stream information -typedef struct { - REFERENCE_TIME tStart; - REFERENCE_TIME tStop; - DWORD dwStartCookie; - DWORD dwStopCookie; - DWORD dwFlags; -} AM_STREAM_INFO; - -// -// IAMStreamControl -// - -[ - object, - uuid(36b73881-c2c8-11cf-8b46-00805f6cef60), - pointer_default(unique) -] -interface IAMStreamControl : IUnknown -{ - // The REFERENCE_TIME pointers may be null, which - // indicates immediately. If the pointer is non-NULL - // and dwCookie is non-zero, then pins should send - // EC_STREAM_CONTROL_STOPPED / EC_STREAM_CONTROL_STARTED - // with an IPin pointer and the cookie, thus allowing - // apps to tie the events back to their requests. - // If either dwCookies is zero, or the pointer is null, - // then no event is sent. - - // If you have a capture pin hooked up to a MUX input pin and they - // both support IAMStreamControl, you'll want the MUX to signal the - // stop so you know the last frame was written out. In order for the - // MUX to know it's finished, the capture pin will have to send one - // extra sample after it was supposed to stop, so the MUX can trigger - // off that. So you would set bSendExtra to TRUE for the capture pin - // Leave it FALSE in all other cases. - - HRESULT StartAt( [in] const REFERENCE_TIME * ptStart, - [in] DWORD dwCookie ); - HRESULT StopAt( [in] const REFERENCE_TIME * ptStop, - [in] BOOL bSendExtra, - [in] DWORD dwCookie ); - HRESULT GetInfo( [out] AM_STREAM_INFO *pInfo); -} - - - -// -// ISeekingPassThru -// - -[ - object, - uuid(36b73883-c2c8-11cf-8b46-00805f6cef60), - pointer_default(unique) -] -interface ISeekingPassThru : IUnknown -{ - HRESULT Init( [in] BOOL bSupportRendering, - [in] IPin *pPin); -} - - - -// -// IAMStreamConfig - pin interface -// - -// A capture filter or compression filter's output pin -// supports this interface - no matter what data type you produce. - -// This interface can be used to set the output format of a pin (as an -// alternative to connecting the pin using a specific media type). -// After setting an output format, the pin will use that format -// the next time it connects to somebody, so you can just Render that -// pin and get a desired format without using Connect(CMediaType) -// Your pin should do that by ONLY OFFERING the media type set in SetFormat -// in its enumeration of media types, and no others. This will ensure that -// that format is indeed used for connection (or at least offer it first). -// An application interested in enumerating accepted mediatypes may have to -// do so BEFORE calling SetFormat. - -// But this interface's GetStreamCaps function can get more information -// about accepted media types than the traditional way of enumerating a pin's -// media types, so it should typically be used instead. -// GetStreamCaps gets information about the kinds of formats allowed... how -// it can stretch and crop, and the frame rate and data rates allowed (for -// video) - -// VIDEO EXAMPLE -// -// GetStreamCaps returns a whole array of {MediaType, Capabilities}. -// Let's say your capture card supports JPEG anywhere between 160x120 and -// 320x240, and also the size 640x480. Also, say it supports RGB24 at -// resolutions between 160x120 and 320x240 but only multiples of 8. You would -// expose these properties by offering a media type of 320 x 240 JPEG -// (if that is your default or preferred size) coupled with -// capabilities saying minimum 160x120 and maximum 320x240 with granularity of -// 1. The next pair you expose is a media type of 640x480 JPEG coupled with -// capabilities of min 640x480 max 640x480. The third pair is media type -// 320x240 RGB24 with capabilities min 160x120 max 320x240 granularity 8. -// In this way you can expose almost every quirk your card might have. -// An application interested in knowing what compression formats you provide -// can get all the pairs and make a list of all the unique sub types of the -// media types. -// -// If a filter's output pin is connected with a media type that has rcSource -// and rcTarget not empty, it means the filter is being asked to stretch the -// rcSource sub-rectangle of its InputSize (the format of the input pin for -// a compressor, and the largest bitmap a capture filter can generate with -// every pixel unique) into the rcTarget sub-rectangle of its output format. -// For instance, if a video compressor has as input 160x120 RGB, and as output -// 320x240 MPEG with an rcSource of (10,10,20,20) and rcTarget of (0,0,100,100) -// this means the compressor is being asked to take a 10x10 piece of the 160x120 -// RGB bitmap, and make it fill the top 100x100 area of a 320x240 bitmap, -// leaving the rest of the 320x240 bitmap untouched. -// A filter does not have to support this and can fail to connect with a -// media type where rcSource and rcTarget are not empty. -// -// Your output pin is connected to the next filter with a certain media -// type (either directly or using the media type passed by SetFormat), -// and you need to look at the AvgBytesPerSecond field of the format -// of that mediatype to see what data rate you are being asked to compress -// the video to, and use that data rate. Using the number of frames per -// second in AvgTimePerFrame, you can figure out how many bytes each frame -// is supposed to be. You can make it smaller, but NEVER EVER make a bigger -// data rate. For a video compressor, your input pin's media type tells you -// the frame rate (use that AvgTimePerFrame). For a capture filter, the -// output media type tells you, so use that AvgTimePerFrame. -// -// The cropping rectangle described below is the same as the rcSrc of the -// output pin's media type. -// -// The output rectangle described below is the same of the width and height -// of the BITMAPINFOHEADER of the media type of the output pin's media type - - -// AUDIO EXAMPLE -// -// This API can return an array of pairs of (media type, capabilities). -// This can be used to expose all kinds of wierd capabilities. Let's say you -// do any PCM frequency from 11,025 to 44,100 at 8 or 16 bit mono or -// stereo, and you also do 48,000 16bit stereo as a special combination. -// You would expose 3 pairs. The first pair would have Min Freq of 11025 and -// Max Freq of 44100, with MaxChannels=2 and MinBits=8 and MaxBits=8 for the -// capabilites structure, and a media type of anything you like, maybe -// 22kHz, 8bit stereo as a default. -// The 2nd pair would be the same except for MinBits=16 and MaxBits=16 in -// the capabilities structure and the media type could be something like -// 44kHz, 16bit stereo as a default (the media type in the pair should always -// be something legal as described by the capabilities structure... the -// structure tells you how you can change the media type to produce other -// legal media types... for instance changing 44kHz to 29010Hz would be legal, -// but changing bits from 16 to 14 would not be.) -// The 3rd pair would be MinFreq=48000 MaxFreq=48000 MaxChannels=2 -// MinBits=16 and MaxBits=16, and the media type would be 48kHz 16bit stereo. -// You can also use the Granularity elements of the structure (like the example -// for video) if you support values that multiples of n, eg. you could say -// minimum bits per sample 8, max 16, and granularity 8 to describe doing -// either 8 or 16 bit all in one structure -// -// If you support non-PCM formats, the media type returned in GetStreamCaps -// can show which non-PCM formats you support (with a default sample rate, -// bit rate and channels) and the capabilities structure going with that -// media type can describe which other sample rates, bit rates and channels -// you support. - -[ - object, - uuid(C6E13340-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) -] -interface IAMStreamConfig : IUnknown -{ - - // this is the structure returned by a VIDEO filter - // - typedef struct _VIDEO_STREAM_CONFIG_CAPS { - - GUID guid; // will be MEDIATYPE_Video - - // the logical or of all the AnalogVideoStandard's supported - // typically zero if not supported - ULONG VideoStandard; - - // the inherent size of the incoming signal... taken from the input - // pin for a compressor, or the largest size a capture filter can - // digitize the signal with every pixel still unique - SIZE InputSize; - - // The input of a compressor filter may have to be connected for these - // to be known - - // smallest rcSrc cropping rect allowed - SIZE MinCroppingSize; - // largest rcSrc cropping rect allowed - SIZE MaxCroppingSize; - // granularity of cropping size - eg only widths a multiple of 4 allowed - int CropGranularityX; - int CropGranularityY; - // alignment of cropping rect - eg rect must start on multiple of 4 - int CropAlignX; - int CropAlignY; - - // The input of a compressor filter may have to be connected for these - // to be known - - // smallest bitmap this pin can produce - SIZE MinOutputSize; - // largest bitmap this pin can produce - SIZE MaxOutputSize; - // granularity of output bitmap size - int OutputGranularityX; - int OutputGranularityY; - // !!! what about alignment of rcTarget inside BIH if different? - - // how well can you stretch in the x direction? 0==not at all - // 1=pixel doubling 2=interpolation(2 taps) 3=better interpolation - // etc. - int StretchTapsX; - int StretchTapsY; - // how well can you shrink in the x direction? 0==not at all - // 1=pixel doubling 2=interpolation(2 taps) 3=better interpolation - // etc. - int ShrinkTapsX; - int ShrinkTapsY; - - // CAPTURE filter only - what frame rates are allowed? - LONGLONG MinFrameInterval; - LONGLONG MaxFrameInterval; - - // what data rates can this pin produce? - LONG MinBitsPerSecond; - LONG MaxBitsPerSecond; - } VIDEO_STREAM_CONFIG_CAPS; - - - // this is the structure returned by an AUDIO filter - // - typedef struct _AUDIO_STREAM_CONFIG_CAPS { - - GUID guid; // will be MEDIATYPE_Audio - ULONG MinimumChannels; - ULONG MaximumChannels; - ULONG ChannelsGranularity; - ULONG MinimumBitsPerSample; - ULONG MaximumBitsPerSample; - ULONG BitsPerSampleGranularity; - ULONG MinimumSampleFrequency; - ULONG MaximumSampleFrequency; - ULONG SampleFrequencyGranularity; - } AUDIO_STREAM_CONFIG_CAPS; - - // - only allowed when pin is not streaming, else the call will FAIL - // - If your output pin is not yet connected, and you can - // connect your output pin with this media type, you should - // succeed the call, and start offering it first (enumerate as format#0) - // from GetMediaType so that this format will be used to connect with - // when you do connect to somebody - // - if your output pin is already connected, and you can provide this - // type, reconnect your pin. If the other pin can't accept it, FAIL - // this call and leave your connection alone. - HRESULT SetFormat( - [in] AM_MEDIA_TYPE *pmt); - - // the format it's connected with, or will connect with - // the application is responsible for calling DeleteMediaType(*ppmt); - HRESULT GetFormat( - [out] AM_MEDIA_TYPE **ppmt); - - // how many different Stream Caps structures are there? - // also, how big is the stream caps structure? - HRESULT GetNumberOfCapabilities( - [out] int *piCount, - [out] int *piSize); // pSCC of GetStreamCaps needs to be this big - - // - gets one of the pairs of {Mediatype, Caps} - // - return S_FALSE if iIndex is too high - // - the application is responsible for calling DeleteMediaType(*ppmt); - // - the first thing pSCC points to is a GUID saying MEDIATYPE_Video - // or MEDIATYPE_Audio, so you can tell if you have a pointer to a - // VIDEO_STREAM_CONFIG_CAPS or an AUDIO_STREAM_CONFIG_CAPS structure - // There could potentially be many more possibilities other than video - // or audio. - HRESULT GetStreamCaps( - [in] int iIndex, // 0 to #caps-1 - [out] AM_MEDIA_TYPE **ppmt, - [out] BYTE *pSCC); - -} - - - -// Interface to control interleaving of different streams in one file -[ -object, -uuid(BEE3D220-157B-11d0-BD23-00A0C911CE86), -pointer_default(unique) -] -interface IConfigInterleaving : IUnknown -{ - import "unknwn.idl"; - - typedef enum - { - // uninterleaved - samples written out in the order they - // arrive. - INTERLEAVE_NONE, - - // approximate interleaving with less overhead for video - // capture - INTERLEAVE_CAPTURE, - - // full, precise interleaving. slower. - INTERLEAVE_FULL, - - // samples written out in the order they arrive. writes are - // buffered - INTERLEAVE_NONE_BUFFERED - - } InterleavingMode; - - HRESULT put_Mode( - [in] InterleavingMode mode - ); - - HRESULT get_Mode( - [out] InterleavingMode *pMode - ); - - HRESULT put_Interleaving( - [in] const REFERENCE_TIME *prtInterleave, - [in] const REFERENCE_TIME *prtPreroll - ); - - HRESULT get_Interleaving( - [out] REFERENCE_TIME *prtInterleave, - [out] REFERENCE_TIME *prtPreroll - ); -} - -// Interface to control the AVI mux -[ -object, -uuid(5ACD6AA0-F482-11ce-8B67-00AA00A3F1A6), -pointer_default(unique) -] -interface IConfigAviMux : IUnknown -{ - import "unknwn.idl"; - - // control whether the AVI mux adjusts the frame rate or audio - // sampling rate for drift when the file is closed. -1 to disables - // this behavior. - HRESULT SetMasterStream([in] LONG iStream); - HRESULT GetMasterStream([out] LONG *pStream); - - // control whether the AVI mux writes out an idx1 index chunk for - // compatibility with older AVI players. - HRESULT SetOutputCompatibilityIndex([in] BOOL fOldIndex); - HRESULT GetOutputCompatibilityIndex([out] BOOL *pfOldIndex); -} - - //--------------------------------------------------------------------- - // CompressionCaps enum - //--------------------------------------------------------------------- - - // This tells you which features of IAMVideoCompression are supported - - // CanCrunch means that it can compress video to a specified data rate - // If so, then the output pin's media type will contain that data rate - // in the format's AvgBytesPerSecond field, and that should be used. - - typedef enum - { - CompressionCaps_CanQuality = 0x01, - CompressionCaps_CanCrunch = 0x02, - CompressionCaps_CanKeyFrame = 0x04, - CompressionCaps_CanBFrame = 0x08, - CompressionCaps_CanWindow = 0x10 - } CompressionCaps; - - - - //--------------------------------------------------------------------- - // IAMVideoCompression interface - // - // Control compression parameters - pin interface - //--------------------------------------------------------------------- - - // This interface is implemented by the output pin of a video capture - // filter or video compressor that provides video data - - // You use this interface to control how video is compressed... how - // many keyframes, etc., and to find information like capabilities and - // the description of this compressor - - [ - object, - uuid(C6E13343-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMVideoCompression : IUnknown - { - // - Only valid if GetInfo's pCapabilities sets - // CompressionCaps_CanKeyFrame - // - KeyFrameRate < 0 means use the compressor default - // - KeyFrames == 0 means only the first frame is a key - HRESULT put_KeyFrameRate ( - [in] long KeyFrameRate); - - HRESULT get_KeyFrameRate ( - [out] long * pKeyFrameRate); - - // - Only valid if GetInfo's pCapabilities sets - // CompressionCaps_CanBFrame - // - If keyframes are every 10, and there are 3 P Frames per key, - // they will be spaced evenly between the key frames and the other - // 6 frames will be B frames - // - PFramesPerKeyFrame < 0 means use the compressor default - HRESULT put_PFramesPerKeyFrame ( - [in] long PFramesPerKeyFrame); - - HRESULT get_PFramesPerKeyFrame ( - [out] long * pPFramesPerKeyFrame); - - // - Only valid if GetInfo's pCapabilities sets - // CompressionCaps_CanQuality - // - Controls image quality - // - If you are compressing to a fixed data rate, a high quality - // means try and use all of the data rate, and a low quality means - // feel free to use much lower than the data rate if you want to. - // - Quality < 0 means use the compressor default - HRESULT put_Quality ( - [in] double Quality); - - HRESULT get_Quality ( - [out] double * pQuality); - - // If you have set a data rate of 100K/sec on a 10fps movie, that - // will normally mean each frame must be <=10K. But a window size - // means every consecutive n frames must average to the data rate, - // but an individual frame (if n > 1) is allowed to exceed the - // frame size suggested by the data rate - HRESULT put_WindowSize ( - [in] DWORDLONG WindowSize); - - HRESULT get_WindowSize ( - [out] DWORDLONG * pWindowSize); - - // - pszVersion might be "Version 2.1.0" - // - pszDescription might be "Danny's awesome video compressor" - // - pcbVersion and pcbDescription will be filled in with the - // required length if they are too short - // - *pCapabilities is a logical OR of some CompressionCaps flags - HRESULT GetInfo( - [out, size_is(*pcbVersion)] WCHAR * pszVersion, - [in,out] int *pcbVersion, - [out, size_is(*pcbDescription)] LPWSTR pszDescription, - [in,out] int *pcbDescription, - [out] long *pDefaultKeyFrameRate, - [out] long *pDefaultPFramesPerKey, - [out] double *pDefaultQuality, - [out] long *pCapabilities //CompressionCaps - ); - - // - this means when this frame number comes along after the graph - // is running, make it a keyframe even if you weren't going to - HRESULT OverrideKeyFrame( - [in] long FrameNumber - ); - - // - Only valid if GetInfo's pCapabilities sets - // CompressionCaps_CanCrunch - // - this means when this frame number comes along after the graph - // is running, make it this many bytes big instead of whatever size - // you were going to make it. - HRESULT OverrideFrameSize( - [in] long FrameNumber, - [in] long Size - ); - - } - - //--------------------------------------------------------------------- - // VfwCaptureDialogs enum - //--------------------------------------------------------------------- - - typedef enum - { - VfwCaptureDialog_Source = 0x01, - VfwCaptureDialog_Format = 0x02, - VfwCaptureDialog_Display = 0x04 - } VfwCaptureDialogs; - - - //--------------------------------------------------------------------- - // VfwCompressDialogs enum - //--------------------------------------------------------------------- - - typedef enum - { - VfwCompressDialog_Config = 0x01, - VfwCompressDialog_About = 0x02, - // returns S_OK if the dialog exists and can be shown, else S_FALSE - VfwCompressDialog_QueryConfig = 0x04, - VfwCompressDialog_QueryAbout = 0x08 - } VfwCompressDialogs; - - - //--------------------------------------------------------------------- - // IAMVfwCaptureDialogs - filter interface - // - // Show a VfW capture driver dialog - SOURCE, FORMAT, or DISPLAY - //--------------------------------------------------------------------- - - // This interface is supported only by Microsoft's Video For Windows - // capture driver Capture Filter. It allows an application to bring up - // one of the 3 driver dialogs that VfW capture drivers have. - - [ - object, - local, - uuid(D8D715A0-6E5E-11D0-B3F0-00AA003761C5), - pointer_default(unique) - ] - interface IAMVfwCaptureDialogs : IUnknown - { - HRESULT HasDialog( - [in] int iDialog // VfwCaptureDialogs enum - ); - - HRESULT ShowDialog( - [in] int iDialog, // VfwCaptureDialogs enum - [in] HWND hwnd - ); - - HRESULT SendDriverMessage( - [in] int iDialog, // VfwCaptureDialogs enum - [in] int uMsg, - [in] long dw1, - [in] long dw2 - ); - - // - iDialog can be one of the VfwCaptureDialogs enums - // - HasDialog returns S_OK if it has the dialog, else S_FALSE - // - ShowDialog can only be called when not streaming or when another - // dialog is not already up - // - SendDriverMessage can send a secret message to the capture driver. - // USE IT AT YOUR OWN RISK! - } - - //--------------------------------------------------------------------- - // IAMVfwCompressDialogs - filter interface - // - // Show a VfW codec driver dialog - CONFIG or ABOUT - //--------------------------------------------------------------------- - - // This interface is supported only by Microsoft's ICM Compressor filter - // (Co). It allows an application to bring up either the Configure or - // About dialogs for the ICM codec that it is currently using. - - [ - object, - local, - uuid(D8D715A3-6E5E-11D0-B3F0-00AA003761C5), - pointer_default(unique) - ] - interface IAMVfwCompressDialogs : IUnknown - { - - // Bring up a dialog for this codec - HRESULT ShowDialog( - [in] int iDialog, // VfwCompressDialogs enum - [in] HWND hwnd - ); - - // Calls ICGetState and gives you the result - HRESULT GetState( - [out, size_is(*pcbState)] LPVOID pState, - [in, out] int *pcbState - ); - - // Calls ICSetState - HRESULT SetState( - [in, size_is(cbState)] LPVOID pState, - [in] int cbState - ); - - // Send a codec specific message - HRESULT SendDriverMessage( - [in] int uMsg, - [in] long dw1, - [in] long dw2 - ); - - // - iDialog can be one of the VfwCaptureDialogs enums - // - ShowDialog can only be called when not streaming or when no other - // dialog is up already - // - an application can call GetState after ShowDialog(CONFIG) to - // see how the compressor was configured and next time the graph - // is used, it can call SetState with the data it saved to return - // the codec to the state configured by the dialog box from last time - // - GetState with a NULL pointer returns the size needed - // - SendDriverMessage can send a secret message to the codec. - // USE IT AT YOUR OWN RISK! - } - - - //--------------------------------------------------------------------- - // IAMDroppedFrames interface - // - // Report status of capture - pin interface - //--------------------------------------------------------------------- - - // A capture filter's video output pin supports this. It reports - // how many frames were not sent (dropped), etc. - - // Every time your filter goes from STOPPED-->PAUSED, you reset all your - // counts to zero. - - // An app may call this all the time while you are capturing to see how - // capturing is going. MAKE SURE you always return as current information - // as possible while you are running. - - // When your capture filter starts running, it starts by sending frame 0, - // then 1, 2, 3, etc. The time stamp of each frame sent should correspond - // to the graph clock's time when the image was digitized. The end time - // is the start time plus the duration of the video frame. - // You should also set the MediaTime of each sample (SetMediaTime) as well. - // This should be the frame number ie (0,1) (1,2) (2,3). - // If a frame is dropped, a downstream filter will be able to tell easily - // not by looking for gaps in the regular time stamps, but by noticing a - // frame number is missing (eg. (1,2) (2,3) (4,5) (5,6) means frame 3 - // was dropped. - - // Using the info provided by this interface, an application can figure out - // the number of frames dropped, the frame rate achieved (the length of - // time the graph was running divided by the number of frames not dropped), - // and the data rate acheived (the length of time the graph was running - // divided by the average frame size). - - // If your filter is running, then paused, and then run again, you need - // to continue to deliver frames as if it was never paused. The first - // frame after the second RUN cannot be time stamped earlier than the last - // frame sent before the pause. - - // Your filter must always increment the MediaTime of each sample sent. - // Never send the same frame # twice, and never go back in time. The - // regular time stamp of a sample can also never go back in time. - - [ - object, - uuid(C6E13344-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMDroppedFrames : IUnknown - { - // Get the number of dropped frames - HRESULT GetNumDropped( - [out] long * plDropped - - ); - - //Get the number of non-dropped frames - HRESULT GetNumNotDropped( - [out] long * plNotDropped - - ); - - // - plArray points to an array of lSize longs. The filter will - // fill it with the frame number of the first lSize frames dropped. - // A filter may not have bothered to remember as many as you asked - // for, so it will set *plNumCopied to the number of frames it filled - // in. - HRESULT GetDroppedInfo( - [in] long lSize, - [out] long * plArray, - [out] long * plNumCopied - ); - - // - This is the average size of the frames it didn't drop (in bytes) - HRESULT GetAverageFrameSize( - [out] long * plAverageSize - - ); - - } - - - - cpp_quote("#define AMF_AUTOMATICGAIN -1.0") - - //--------------------------------------------------------------------- - // IAMAudioInputMixer interface - // - // Sets the recording levels, pan and EQ for the audio card inputs - //--------------------------------------------------------------------- - - // This interface is implemented by each input pin of an audio capture - // filter, to tell it what level, panning, and EQ to use for each input. - // The name of each pin will reflect the type of input, eg. "Line input 1" - // or "Mic". An application uses the pin names to decide how it wants to - // set the recording levels - - // This interface can also be supported by the audio capture filter itself - // to control to overall record level and panning after the mix - - [ - object, - uuid(54C39221-8380-11d0-B3F0-00AA003761C5), - pointer_default(unique) - ] - interface IAMAudioInputMixer : IUnknown - { - // This interface is only supported by the input pins, not the filter - // If disabled, this channel will not be mixed in as part of the - // recorded signal. - HRESULT put_Enable ( - [in] BOOL fEnable); // TRUE=enable FALSE=disable - - //Is this channel enabled? - HRESULT get_Enable ( - [out] BOOL *pfEnable); - - // When set to mono mode, making a stereo recording of this channel - // will have both channels contain the same data... a mixture of the - // left and right signals - HRESULT put_Mono ( - [in] BOOL fMono); // TRUE=mono FALSE=multi channel - - //all channels combined into a mono signal? - HRESULT get_Mono ( - [out] BOOL *pfMono); - - // !!! WILL CARDS BE ABLE TO BOOST THE GAIN? - //Set the record level for this channel - HRESULT put_MixLevel ( - [in] double Level); // 0 = off, 1 = full (unity?) volume - // AMF_AUTOMATICGAIN, if supported, - // means automatic - - //Get the record level for this channel - HRESULT get_MixLevel ( - [out] double *pLevel); - - // For instance, when panned full left, and you make a stereo recording - // of this channel, you will record a silent right channel. - HRESULT put_Pan ( - [in] double Pan); // -1 = full left, 0 = centre, 1 = right - - //Get the pan for this channel - HRESULT get_Pan ( - [out] double *pPan); - - // Boosts the bass of low volume signals before they are recorded - // to compensate for the fact that your ear has trouble hearing quiet - // bass sounds - HRESULT put_Loudness ( - [in] BOOL fLoudness);// TRUE=on FALSE=off - - HRESULT get_Loudness ( - [out] BOOL *pfLoudness); - - // boosts or cuts the treble of the signal before it's recorded by - // a certain amount of dB - HRESULT put_Treble ( - [in] double Treble); // gain in dB (-ve = attenuate) - - //Get the treble EQ for this channel - HRESULT get_Treble ( - [out] double *pTreble); - - // This is the maximum value allowed in put_Treble. ie 6.0 means - // any value between -6.0 and 6.0 is allowed - HRESULT get_TrebleRange ( - [out] double *pRange); // largest value allowed - - // boosts or cuts the bass of the signal before it's recorded by - // a certain amount of dB - HRESULT put_Bass ( - [in] double Bass); // gain in dB (-ve = attenuate) - - // Get the bass EQ for this channel - HRESULT get_Bass ( - [out] double *pBass); - - // This is the maximum value allowed in put_Bass. ie 6.0 means - // any value between -6.0 and 6.0 is allowed - HRESULT get_BassRange ( - [out] double *pRange); // largest value allowed - - } - - - //--------------------------------------------------------------------- - // IAMBufferNegotiation interface - // - // Tells a pin what kinds of buffers to use when connected - //--------------------------------------------------------------------- - - // This interface can be implemented by any pin that will connect to - // another pin using IMemInputPin. All capture filters should support - // this interface. - - // SuggestAllocatorProperties is a way for an application to get - // in on the buffer negotiation process for a pin. This pin will use - // the numbers given to it by the application as its request to the - // allocator. An application can use a negative number for any element - // in the ALLOCATOR_PROPERTIES to mean "don't care". An application must - // call this function before the pin is connected, or it will be too late - // To ensure that an application gets what it wants, it would be wise to - // call this method on both pins being connected together, so the other - // pin doesn't overrule the application's request. - - // GetAllocatorProperties can only be called after a pin is connected and - // it returns the properties of the current allocator being used - - [ - object, - uuid(56ED71A0-AF5F-11D0-B3F0-00AA003761C5), - pointer_default(unique) - ] - interface IAMBufferNegotiation : IUnknown - { - HRESULT SuggestAllocatorProperties ( - [in] const ALLOCATOR_PROPERTIES *pprop); - - HRESULT GetAllocatorProperties ( - [out] ALLOCATOR_PROPERTIES *pprop); - - } - - - //--------------------------------------------------------------------- - // AnalogVideoStandard enum - //--------------------------------------------------------------------- - - typedef enum tagAnalogVideoStandard - { - AnalogVideo_None = 0x00000000, // This is a digital sensor - AnalogVideo_NTSC_M = 0x00000001, // 75 IRE Setup - AnalogVideo_NTSC_M_J = 0x00000002, // Japan, 0 IRE Setup - AnalogVideo_NTSC_433 = 0x00000004, - - AnalogVideo_PAL_B = 0x00000010, - AnalogVideo_PAL_D = 0x00000020, - AnalogVideo_PAL_G = 0x00000040, - AnalogVideo_PAL_H = 0x00000080, - AnalogVideo_PAL_I = 0x00000100, - AnalogVideo_PAL_M = 0x00000200, - AnalogVideo_PAL_N = 0x00000400, - - AnalogVideo_PAL_60 = 0x00000800, - - AnalogVideo_SECAM_B = 0x00001000, - AnalogVideo_SECAM_D = 0x00002000, - AnalogVideo_SECAM_G = 0x00004000, - AnalogVideo_SECAM_H = 0x00008000, - AnalogVideo_SECAM_K = 0x00010000, - AnalogVideo_SECAM_K1 = 0x00020000, - AnalogVideo_SECAM_L = 0x00040000, - AnalogVideo_SECAM_L1 = 0x00080000, - - AnalogVideo_PAL_N_COMBO // Argentina - = 0x00100000 - } AnalogVideoStandard; - - cpp_quote("#define AnalogVideo_NTSC_Mask 0x00000007") - cpp_quote("#define AnalogVideo_PAL_Mask 0x00100FF0") - cpp_quote("#define AnalogVideo_SECAM_Mask 0x000FF000") - - - //--------------------------------------------------------------------- - // TunerInputType enum - //--------------------------------------------------------------------- - - typedef enum tagTunerInputType - { - TunerInputCable, - TunerInputAntenna - } TunerInputType; - - //--------------------------------------------------------------------- - // VideoCopyProtectionType enum - //--------------------------------------------------------------------- - - typedef enum - { - VideoCopyProtectionMacrovisionBasic, - VideoCopyProtectionMacrovisionCBI - } VideoCopyProtectionType; - - //--------------------------------------------------------------------- - // PhysicalConnectorType enum - //--------------------------------------------------------------------- - - typedef enum tagPhysicalConnectorType - { - PhysConn_Video_Tuner = 1, - PhysConn_Video_Composite, - PhysConn_Video_SVideo, - PhysConn_Video_RGB, - PhysConn_Video_YRYBY, - PhysConn_Video_SerialDigital, - PhysConn_Video_ParallelDigital, - PhysConn_Video_SCSI, - PhysConn_Video_AUX, - PhysConn_Video_1394, - PhysConn_Video_USB, - PhysConn_Video_VideoDecoder, - PhysConn_Video_VideoEncoder, - PhysConn_Video_SCART, - PhysConn_Video_Black, - - - PhysConn_Audio_Tuner = 0x1000, - PhysConn_Audio_Line, - PhysConn_Audio_Mic, - PhysConn_Audio_AESDigital, - PhysConn_Audio_SPDIFDigital, - PhysConn_Audio_SCSI, - PhysConn_Audio_AUX, - PhysConn_Audio_1394, - PhysConn_Audio_USB, - PhysConn_Audio_AudioDecoder, - } PhysicalConnectorType; - - - - - //--------------------------------------------------------------------- - // IAMAnalogVideoDecoder interface - //--------------------------------------------------------------------- - - [ - object, - uuid(C6E13350-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMAnalogVideoDecoder : IUnknown - { - - //Gets the supported analog video standards (NTSC/M, PAL/B, SECAM/K1... - HRESULT get_AvailableTVFormats( - [out] long *lAnalogVideoStandard - ); - - //Sets or gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ... - HRESULT put_TVFormat( - [in] long lAnalogVideoStandard - ); - - // Sets or gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ... - HRESULT get_TVFormat( - [out] long * plAnalogVideoStandard - ); - - // True if horizontal sync is locked - HRESULT get_HorizontalLocked ( - [out] long * plLocked); - - // True if connected to a VCR (changes PLL timing) - HRESULT put_VCRHorizontalLocking ( - [in] long lVCRHorizontalLocking); - - HRESULT get_VCRHorizontalLocking ( - [out] long * plVCRHorizontalLocking); - - // Returns the number of lines in the video signal")] - HRESULT get_NumberOfLines ( - [out] long *plNumberOfLines); - - // Enables or disables the output bus - HRESULT put_OutputEnable ( - [in] long lOutputEnable); - - HRESULT get_OutputEnable ( - [out] long *plOutputEnable); - - } - - - //--------------------------------------------------------------------- - // VideoProcAmp Property enum - //--------------------------------------------------------------------- - - typedef enum tagVideoProcAmpProperty - { - VideoProcAmp_Brightness, - VideoProcAmp_Contrast, - VideoProcAmp_Hue, - VideoProcAmp_Saturation, - VideoProcAmp_Sharpness, - VideoProcAmp_Gamma, - VideoProcAmp_ColorEnable, - VideoProcAmp_WhiteBalance, - VideoProcAmp_BacklightCompensation, - VideoProcAmp_Gain - } VideoProcAmpProperty; - - //--------------------------------------------------------------------- - // VideoProcAmp Flags enum - //--------------------------------------------------------------------- - - typedef enum tagVideoProcAmpFlags - { - VideoProcAmp_Flags_Auto = 0x0001, - VideoProcAmp_Flags_Manual = 0x0002 - } VideoProcAmpFlags; - - //--------------------------------------------------------------------- - // IAMVideoProcAmp interface - // - // Adjusts video quality in either the analog or digital domain. - // - //--------------------------------------------------------------------- - - [ - object, - uuid(C6E13360-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMVideoProcAmp : IUnknown - { - // Returns min, max, step size, and default values - HRESULT GetRange( - [in] long Property, // Which property to query - [out] long * pMin, // Range minimum - [out] long * pMax, // Range maxumum - [out] long * pSteppingDelta,// Step size - [out] long * pDefault, // Default value - [out] long * pCapsFlags // VideoProcAmpFlags - - ); - - // Set a VideoProcAmp property - HRESULT Set( - [in] long Property, // VideoProcAmpProperty - [in] long lValue, // Value to set - [in] long Flags // VideoProcAmp_Flags_* - - ); - - // Get a VideoProcAmp property - HRESULT Get( - [in] long Property, // VideoProcAmpProperty - [out] long * lValue, // Current value - [out] long * Flags // VideoProcAmp_Flags_* - ); - } - - - //--------------------------------------------------------------------- - // CameraControl Property enum - //--------------------------------------------------------------------- - - typedef enum tagCameraControlProperty - { - CameraControl_Pan, - CameraControl_Tilt, - CameraControl_Roll, - CameraControl_Zoom, - CameraControl_Exposure, - CameraControl_Iris, - CameraControl_Focus - } CameraControlProperty; - - //--------------------------------------------------------------------- - // CameraControl Flags enum - //--------------------------------------------------------------------- - - typedef enum tagCameraControlFlags - { - CameraControl_Flags_Auto = 0x0001, - CameraControl_Flags_Manual = 0x0002 - } CameraControlFlags; - - //--------------------------------------------------------------------- - // IAMCameraControl interface - // - // Control of local or remote cameras - //--------------------------------------------------------------------- - - [ - object, - uuid(C6E13370-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMCameraControl : IUnknown - { - // Returns min, max, step size, and default values - HRESULT GetRange( - [in] long Property, // Which property to query - [out] long * pMin, // Range minimum - [out] long * pMax, // Range maxumum - [out] long * pSteppingDelta,// Step size - [out] long * pDefault, // Default value - [out] long * pCapsFlags // CamaeraControlFlags - - ); - - // Set a CameraControl property - HRESULT Set( - [in] long Property, // CameraControlProperty - [in] long lValue, // Value to set - [in] long Flags // CameraControl_Flags_* - - ); - - // Get a CameraControl property - HRESULT Get( - [in] long Property, // CameraControlProperty - [out] long * lValue, // Current value - [out] long * Flags // CameraControl_Flags_* - ); - } - - //--------------------------------------------------------------------- - // VideoControl Flags enum - //--------------------------------------------------------------------- - - typedef enum tagVideoControlFlags - { - VideoControlFlag_FlipHorizontal = 0x0001, - VideoControlFlag_FlipVertical = 0x0002, - VideoControlFlag_ExternalTriggerEnable = 0x0004, - VideoControlFlag_Trigger = 0x0008 - - } VideoControlFlags; - - //--------------------------------------------------------------------- - // IAMVideoControl interface - // - // Control of horizontal & vertical flip, external trigger, - // and listing available frame rates - //--------------------------------------------------------------------- - - [ - object, - uuid(6a2e0670-28e4-11d0-a18c-00a0c9118956), - pointer_default(unique) - ] - interface IAMVideoControl : IUnknown - { - // What can the underlying hardware do? - HRESULT GetCaps( - [in] IPin * pPin, // the pin to query or control - [out] long * pCapsFlags // VideoControlFlag_* - - ); - - // Set the mode of operation - HRESULT SetMode( - [in] IPin * pPin, // the pin to query or control - [in] long Mode // VideoControlFlag_* - - ); - - // Get the mode of operation - HRESULT GetMode( - [in] IPin * pPin, // the pin to query or control - [out] long * Mode // VideoControlFlag_* - ); - - // Get actual frame rate info for USB and 1394 - // This is only available when streaming - HRESULT GetCurrentActualFrameRate( - [in] IPin * pPin, // the pin to query or control - [out] LONGLONG * ActualFrameRate // 100 nS units - ); - - // Get max available frame rate info for USB and 1394 - // Returns the max frame rate currently available based on bus bandwidth usage - HRESULT GetMaxAvailableFrameRate( - [in] IPin * pPin, // the pin to query or control - [in] long iIndex, // 0 to IAMStreamConfig->GetNumberOfCapabilities-1 - [in] SIZE Dimensions, // width and height - [out] LONGLONG * MaxAvailableFrameRate // 100 nS units - ); - - // Get List of available frame rates - HRESULT GetFrameRateList( - [in] IPin * pPin, // the pin to query or control - [in] long iIndex, // 0 to IAMStreamConfig->GetNumberOfCapabilities-1 - [in] SIZE Dimensions, // width and height - [out] long * ListSize, // Number of elements in the list - [out] LONGLONG ** FrameRates // Array of framerates in 100 nS units - // or NULL to just get ListSize - ); - - } - - - //--------------------------------------------------------------------- - // IAMCrossbar interface - // - // Controls a routing matrix for analog or digital video or audio - //--------------------------------------------------------------------- - - [ - object, - uuid(C6E13380-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMCrossbar : IUnknown - { - - // How many pins are there? - HRESULT get_PinCounts( - [out] long * OutputPinCount, // count of output pins - [out] long * InputPinCount); // count of input pins - - // True if routing is possible - HRESULT CanRoute ( - [in] long OutputPinIndex, // the output pin - [in] long InputPinIndex); // the input pin - - // Routes an input pin to an output pin - HRESULT Route ( - [in] long OutputPinIndex, // the output pin - [in] long InputPinIndex); // the input pin - - // Returns the input pin connected to a given output pin - HRESULT get_IsRoutedTo ( - [in] long OutputPinIndex, // the output pin - [out] long * InputPinIndex); // the connected input pin - - // Returns a pin which is related to a given pin - // (ie. this audio pin is related to a video pin) - HRESULT get_CrossbarPinInfo ( - [in] BOOL IsInputPin, // TRUE for input pins - [in] long PinIndex, // a pin - [out] long * PinIndexRelated, // Index of related pin - [out] long * PhysicalType); // Physical type of pin - - } - - - //--------------------------------------------------------------------- - // IAMTuner interface - // - // base tuner device - //--------------------------------------------------------------------- - - // predefined subchannel values - typedef enum tagAMTunerSubChannel - { - AMTUNER_SUBCHAN_NO_TUNE = -2, // don't tune - AMTUNER_SUBCHAN_DEFAULT = -1 // use default sub chan - } AMTunerSubChannel; - - // predefined signal strength values - typedef enum tagAMTunerSignalStrength - { - AMTUNER_HASNOSIGNALSTRENGTH = -1, // cannot indicate signal strength - AMTUNER_NOSIGNAL = 0, // no signal available - AMTUNER_SIGNALPRESENT = 1 // signal present - } AMTunerSignalStrength; - - // specifies the mode of operation of the tuner - typedef enum tagAMTunerModeType - { - AMTUNER_MODE_DEFAULT = 0x0000, // default tuner mode - AMTUNER_MODE_TV = 0x0001, // tv - AMTUNER_MODE_FM_RADIO = 0x0002, // fm radio - AMTUNER_MODE_AM_RADIO = 0x0004, // am radio - AMTUNER_MODE_DSS = 0x0008, // dss - } AMTunerModeType; - - // Events reported by IAMTunerNotification - typedef enum tagAMTunerEventType{ - AMTUNER_EVENT_CHANGED = 0x0001, // status changed - } AMTunerEventType; - - interface IAMTunerNotification; - - [ - object, - uuid(211A8761-03AC-11d1-8D13-00AA00BD8339), - pointer_default(unique) - ] - interface IAMTuner : IUnknown - { - // Sets and gets the Channel - HRESULT put_Channel( - [in] long lChannel, - [in] long lVideoSubChannel, - [in] long lAudioSubChannel - ); - HRESULT get_Channel( - [out] long *plChannel, - [out] long *plVideoSubChannel, - [out] long *plAudioSubChannel - ); - - // Gets the minimum and maximum channel available - HRESULT ChannelMinMax( - [out] long *lChannelMin, - [out] long *lChannelMax - ); - - // CountryCode is the same as the international - // long distance telephone dialing prefix - - HRESULT put_CountryCode( - [in] long lCountryCode - ); - HRESULT get_CountryCode( - [out] long *plCountryCode - ); - - HRESULT put_TuningSpace( - [in] long lTuningSpace - ); - HRESULT get_TuningSpace( - [out] long *plTuningSpace - ); - - [local] HRESULT Logon( - [in] HANDLE hCurrentUser - ); - HRESULT Logout(); - - // Signal status for current channel - // signal strength == TUNER_NOSIGNAL, or strength value - HRESULT SignalPresent( - [out] long * plSignalStrength // AMTunerSignalStrength - ); - - // allow multifunction tuner to be switch between modes - HRESULT put_Mode( - [in] AMTunerModeType lMode // AMTunerModeType - ); - HRESULT get_Mode( - [out] AMTunerModeType *plMode // AMTunerModeType - ); - - // retrieve a bitmask of the possible modes - HRESULT GetAvailableModes( - [out] long *plModes // AMTunerModeType - ); - - // allow IAMTuner clients to receive event notification - HRESULT RegisterNotificationCallBack( - [in] IAMTunerNotification *pNotify, - [in] long lEvents // bitmask from AMTunerEventType enumeration - ); - HRESULT UnRegisterNotificationCallBack( - [in] IAMTunerNotification *pNotify - ); - } - - //--------------------------------------------------------------------- - // IAMTunerNotification interface - // - // Provided to IAMTuner if notification callbacks are desired - //--------------------------------------------------------------------- - - [ - object, - uuid(211A8760-03AC-11d1-8D13-00AA00BD8339), - pointer_default(unique) - ] - interface IAMTunerNotification : IUnknown - { - HRESULT OnEvent([in] AMTunerEventType Event); - } - - - //--------------------------------------------------------------------- - // IAMTVTuner interface - // - // Controls an analog TV tuner device - //--------------------------------------------------------------------- - - [ - object, - uuid(211A8766-03AC-11d1-8D13-00AA00BD8339), - pointer_default(unique) - ] - interface IAMTVTuner : IAMTuner - { - // Gets the supported analog video standards (NTSC/M, PAL/B, SECAM/K1, ... - HRESULT get_AvailableTVFormats( - [out] long *lAnalogVideoStandard - ); - - // Gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ...) - HRESULT get_TVFormat( - [out] long * plAnalogVideoStandard - ); - - // Scans for a signal on a given channel - // NOTE: this is equivalent to put_Channel(), SignalStrength() - HRESULT AutoTune( - [in] long lChannel, - [out] long * plFoundSignal - ); - - // Saves the fine tuning information for all channels")] - HRESULT StoreAutoTune(); - - // The number of TV sources plugged into the tuner - HRESULT get_NumInputConnections( - [out] long * plNumInputConnections - ); - - // Sets or gets the tuner input type (Cable or Antenna) - HRESULT put_InputType( - [in] long lIndex, - [in] TunerInputType InputType - ); - HRESULT get_InputType( - [in] long lIndex, - [out] TunerInputType * pInputType - ); - - // Sets or gets the tuner input - HRESULT put_ConnectInput( - [in] long lIndex - ); - HRESULT get_ConnectInput( - [out] long *plIndex - ); - - // Gets the video and audio carrier frequencies - HRESULT get_VideoFrequency( - [out] long *lFreq - ); - HRESULT get_AudioFrequency( - [out] long *lFreq - ); - } - - - //--------------------------------------------------------------------- - // IBPCSatelliteTuner interface - // - // An interface supporting Satellite tuning-related functions - //--------------------------------------------------------------------- - [ - object, - local, - uuid(211A8765-03AC-11d1-8D13-00AA00BD8339), - pointer_default(unique) - ] - interface IBPCSatelliteTuner : IAMTuner - { - HRESULT get_DefaultSubChannelTypes( - [out] long *plDefaultVideoType, // Provider-specific service type - [out] long *plDefaultAudioType // Provider-specific service type - ); - - HRESULT put_DefaultSubChannelTypes( - [in] long lDefaultVideoType, // Provider-specific service type - [in] long lDefaultAudioType // Provider-specific service type - ); - - HRESULT IsTapingPermitted(); // S_OK yes, S_FALSE no - } - - - - //--------------------------------------------------------------------- - // IAMTVAudio interface - // - // TV Audio control - //--------------------------------------------------------------------- - - typedef enum tagTVAudioMode - { - AMTVAUDIO_MODE_MONO = 0x0001, // Mono - AMTVAUDIO_MODE_STEREO = 0x0002, // Stereo - AMTVAUDIO_MODE_LANG_A = 0x0010, // Primary language - AMTVAUDIO_MODE_LANG_B = 0x0020, // 2nd avail language - AMTVAUDIO_MODE_LANG_C = 0x0040, // 3rd avail language - } TVAudioMode; - - // Events reported by IAMTVAudioNotification - typedef enum tagAMTVAudioEventType - { - AMTVAUDIO_EVENT_CHANGED = 0x0001, // mode changed - } AMTVAudioEventType; - - interface IAMTVAudioNotification; - - [ - object, - local, - uuid(83EC1C30-23D1-11d1-99E6-00A0C9560266), - pointer_default(unique) - ] - interface IAMTVAudio : IUnknown - { - // retrieve a bitmask of the formats available in the hardware - HRESULT GetHardwareSupportedTVAudioModes( - [out] long *plModes // TVAudioMode - ); - - // retrieve a bitmask of the possible modes - HRESULT GetAvailableTVAudioModes( - [out] long *plModes // TVAudioMode - ); - - HRESULT get_TVAudioMode( - [out] long *plMode // TVAudioMode - ); - HRESULT put_TVAudioMode( - [in] long lMode // TVAudioMode - ); - - // allow IAMTVAudio clients to receive event notification - HRESULT RegisterNotificationCallBack( - [in] IAMTunerNotification *pNotify, - [in] long lEvents // bitmask from AMTVAudioEventType enumeration - ); - HRESULT UnRegisterNotificationCallBack( - IAMTunerNotification *pNotify - ); - } - - //--------------------------------------------------------------------- - // IAMTVAudioNotification interface - // - // Provided to IAMTVAudio clients if notification callbacks are desired - //--------------------------------------------------------------------- - - [ - object, - local, - uuid(83EC1C33-23D1-11d1-99E6-00A0C9560266), - pointer_default(unique) - ] - interface IAMTVAudioNotification : IUnknown - { - HRESULT OnEvent([in] AMTVAudioEventType Event); - } - - - - - //--------------------------------------------------------------------- - // IAMAnalogVideoEncoder interface - //--------------------------------------------------------------------- - - [ - object, - uuid(C6E133B0-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMAnalogVideoEncoder : IUnknown - { - // Gets the supported analog video standards (NTSC/M, PAL/B, SECAM/K1, ...) - HRESULT get_AvailableTVFormats( - [out] long *lAnalogVideoStandard - ); - - // Sets or gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ...) - HRESULT put_TVFormat( - [in] long lAnalogVideoStandard - ); - - HRESULT get_TVFormat( - [out] long * plAnalogVideoStandard - ); - - // Sets or gets the copy protection - HRESULT put_CopyProtection ( - [in] long lVideoCopyProtection); // VideoCopyProtectionType - - HRESULT get_CopyProtection ( - [out] long *lVideoCopyProtection); // VideoCopyProtectionType - - - // Enables and disables close captioning - HRESULT put_CCEnable ( - [in] long lCCEnable); - - HRESULT get_CCEnable ( - [out] long *lCCEnable); - - } - - // used by IKsPropertySet set AMPROPSETID_Pin - typedef enum { - AMPROPERTY_PIN_CATEGORY, - AMPROPERTY_PIN_MEDIUM - } AMPROPERTY_PIN; - - //--------------------------------------------------------------------- - // IKsPropertySet interface - // - // Sets or gets a property identified by a property set GUID and a - // property ID. - // - // Return codes for all 3 methods: - // E_PROP_SET_UNSUPPORTED the property set is not supported - // E_PROP_ID_UNSUPPORTED the property ID is not supported - // for the specified property set - //--------------------------------------------------------------------- - -cpp_quote("#ifndef _IKsPropertySet_") -cpp_quote("#define _IKsPropertySet_") - - //--------------------------------------------------------------------- - // #defines for IKsPropertySet::QuerySupported return result in pTypeSupport - //--------------------------------------------------------------------- - -cpp_quote("#define KSPROPERTY_SUPPORT_GET 1") -cpp_quote("#define KSPROPERTY_SUPPORT_SET 2") - - - [ - object, - uuid(31EFAC30-515C-11d0-A9AA-00AA0061BE93), - pointer_default(unique) - ] - interface IKsPropertySet : IUnknown - { - [local] HRESULT Set( - [in] REFGUID guidPropSet, - [in] DWORD dwPropID, - [in, size_is(cbInstanceData)] LPVOID pInstanceData, - [in] DWORD cbInstanceData, - [in, size_is(cbPropData)] LPVOID pPropData, - [in] DWORD cbPropData); - - [call_as(Set)] HRESULT RemoteSet( - [in] REFGUID guidPropSet, - [in] DWORD dwPropID, - [in, size_is(cbInstanceData)] byte * pInstanceData, - [in] DWORD cbInstanceData, - [in, size_is(cbPropData)] byte * pPropData, - [in] DWORD cbPropData); - - // To get a property, the caller allocates a buffer which the called - // function fills in. To determine necessary buffer size, call Get with - // pPropData=NULL and cbPropData=0. - [local] HRESULT Get( - [in] REFGUID guidPropSet, - [in] DWORD dwPropID, - [in, size_is(cbInstanceData)] LPVOID pInstanceData, - [in] DWORD cbInstanceData, - [out, size_is(cbPropData)] LPVOID pPropData, - [in] DWORD cbPropData, - [out] DWORD * pcbReturned); - - [call_as(Get)] HRESULT RemoteGet( - [in] REFGUID guidPropSet, - [in] DWORD dwPropID, - [in, size_is(cbInstanceData)] byte * pInstanceData, - [in] DWORD cbInstanceData, - [out, size_is(cbPropData)] byte * pPropData, - [in] DWORD cbPropData, - [out] DWORD * pcbReturned); - // QuerySupported must either return E_NOTIMPL or correctly indicate - // if getting or setting the property set and property is supported. - // S_OK indicates the property set and property ID combination is - HRESULT QuerySupported( - [in] REFGUID guidPropSet, - [in] DWORD dwPropID, - [out] DWORD *pTypeSupport); - } -cpp_quote("#endif // _IKsPropertySet_") - -[ -object, -uuid(6025A880-C0D5-11d0-BD4E-00A0C911CE86), -pointer_default(unique) -] -interface IMediaPropertyBag : IPropertyBag -{ - import "ocidl.idl"; - - typedef IMediaPropertyBag *LPMEDIAPROPERTYBAG; - - // return the i'th element in the property bag - HRESULT EnumProperty( - [in] ULONG iProperty, - [in, out] VARIANT * pvarPropertyName, - [in, out] VARIANT * pvarPropertyValue - ); - -} - - -[ -object, -uuid(5738E040-B67F-11d0-BD4D-00A0C911CE86), -pointer_default(unique) -] -interface IPersistMediaPropertyBag : IPersist -{ - import "ocidl.idl"; - import "unknwn.idl"; - - HRESULT InitNew( - void - ); - - HRESULT Load( - [in] IMediaPropertyBag * pPropBag, - [in] IErrorLog * pErrorLog - ); - - HRESULT Save( - [in] IMediaPropertyBag * pPropBag, - [in] BOOL fClearDirty, - [in] BOOL fSaveAllProperties - ); - - - typedef IPersistMediaPropertyBag * LPPERSISTMEDIAPROPERTYBAG; -} - - - //--------------------------------------------------------------------- - // - // Defines IAMPhysicalPinInfo Interface - // - // Returns an enum and string that describes an input pin's physical type. - // - // Implement if: you have physical input pins such as video or audio (like - // on a video capture card or a VCR) - // - // Use if: you want to communicate to a user available physical input pins - // and allow them to select the active one if there is more than one - //--------------------------------------------------------------------- - - -[ - object, - uuid(F938C991-3029-11cf-8C44-00AA006B6814), - pointer_default(unique) - ] -interface IAMPhysicalPinInfo : IUnknown { - - // Returns VFW_E_NO_ACCEPTABLE_TYPES if not a physical pin - HRESULT GetPhysicalType( - [out] long *pType, // the enum representing the Physical Type - [out] LPOLESTR *ppszType // a friendly name - ); -} -typedef IAMPhysicalPinInfo *PAMPHYSICALPININFO; - - //--------------------------------------------------------------------- - // Defines IAMExtDevice Interface - // - // Base interface for external professional devices - // - // Implement if: the filter controls an external device such as a VCR, - // timecode reader/generator, etc. The intent is to build a object from - // this implementation plus another that specifically describes the device, - // such as IAMExtTransport. - // - // Use if: you want to control and external device such as a VCR - // - // See edevdefs.h for the enumerated parameter list - //--------------------------------------------------------------------- - [ - object, - uuid(B5730A90-1A2C-11cf-8C23-00AA006B6814), - pointer_default(unique) - ] - interface IAMExtDevice : IUnknown - { - // General device capabilities property. See edevdefs.h for supported - // values - HRESULT GetCapability( - [in] long Capability, // identify the property - [out] long *pValue, // return value - [out] double *pdblValue // return value - ); - - // Get external device identification string. Usually the model # - // of the device - HRESULT get_ExternalDeviceID( - [out] LPOLESTR *ppszData // ID string - ); - - HRESULT get_ExternalDeviceVersion( - [out] LPOLESTR *ppszData // revision string - ); - - // Controls the external device's power mode - HRESULT put_DevicePower([in] long PowerMode - ); - HRESULT get_DevicePower([out] long *pPowerMode - ); - - // Some devices need to be reset in some way, i.e., rewinding a VCR - // to the beginning of the tape and resetting the counter to zero. - HRESULT Calibrate( - [in] HEVENT hEvent, - [in] long Mode, - [out] long *pStatus // OATRUE is active, OAFALSE is inactive - ); - - // Selects the device's communications port, i.e.,COM1, IEEE1394, etc. - // See edevdefs.h for enums - HRESULT put_DevicePort([in] long DevicePort - ); - HRESULT get_DevicePort([out] long *pDevicePort - ); - -} -typedef IAMExtDevice *PEXTDEVICE; - - //--------------------------------------------------------------------- - // Defines IAMExtTransport Interface - // - // Contains properties and methods that control behavior of an external - // transport device such as a VTR - // - // Implement if: you control such a device. Intended to be agregated - // with IAMExtDevice. - // - // Use if: you want to control such a device - // - // See edevdefs.h for the parameter lists - //--------------------------------------------------------------------- -[ - object, - uuid(A03CD5F0-3045-11cf-8C44-00AA006B6814), - pointer_default(unique) - ] -interface IAMExtTransport : IUnknown { - - // General transport capabilities property. See edevdefs.h for enums - HRESULT GetCapability( - [in] long Capability, // identify the property - [out] long *pValue, // return value - [out] double *pdblValue // return value - ); - - // For disc-based devices: spinning, or not spinning. - // For tape-based device: threaded, unthreaded or ejected - HRESULT put_MediaState([in] long State - ); - HRESULT get_MediaState([out] long *pState // see edevdefs.h - ); - - // Determines state of unit's front panel - HRESULT put_LocalControl([in] long State - ); - HRESULT get_LocalControl([out] long *pState // OATRUE or OAFALSE - ); - - // Transport status such as Play, Stop, etc. More extensive - // than AM states. - HRESULT GetStatus( - [in] long StatusItem, // see edevdefs.h - [out] long *pValue - ); - - // Parameters such as recording speed, servo reference, ballistics, etc. - HRESULT GetTransportBasicParameters( - [in] long Param, - [out] long *pValue, - [out] LPOLESTR *ppszData - ); - - HRESULT SetTransportBasicParameters( - [in] long Param, - [in] long Value, - [in] LPCOLESTR pszData - ); - - // Parameters such as video output mode - HRESULT GetTransportVideoParameters( - [in] long Param, - [out] long *pValue - ); - - HRESULT SetTransportVideoParameters( - [in] long Param, - [in] long Value - ); - - // Parameters such as audio channel enable - HRESULT GetTransportAudioParameters( - [in] long Param, - [out] long *pValue - ); - - HRESULT SetTransportAudioParameters( - [in] long Param, - [in] long Value - ); - - // Mode is the movement of the transport, i.e., Play, Stop, - // Record, Edit, etc. - HRESULT put_Mode([in] long Mode - ); - HRESULT get_Mode([out] long *pMode - ); - - // Rate is for variable speed control of the the device. This - // can be linked to IMediaControl::Rate() in the implementation - // if desired. - HRESULT put_Rate([in] double dblRate - ); - HRESULT get_Rate([out] double *pdblRate - ); - - // This is a lengthy method, that is, it is in effect until canceled or complete and - // requires housekeeping by the filter. It puts transport in play mode and maintains - // fixed relationship between master time reference and transport position. - HRESULT GetChase( - [out] long *pEnabled, // OATRUE | OAFALSE - [out] long *pOffset, // offset in current time format - [out] HEVENT *phEvent // completion notification - ); - HRESULT SetChase( - [in] long Enable, // OATRUE | OAFALSE - [in] long Offset, // offset in current time format - [in] HEVENT hEvent // completion notification - ); - - // Also a lengthy method: temporarily change transport speed (for synchronizing). - HRESULT GetBump( - [out] long *pSpeed, - [out] long *pDuration // in current time format - ); - HRESULT SetBump( - [in] long Speed, - [in] long Duration // in current time format - ); - - // Enable/Disable transport anti-headclog control. - HRESULT get_AntiClogControl([out] long *pEnabled // OATRUE | OAFALSE - ); - HRESULT put_AntiClogControl([in] long Enable // OATRUE | OAFALSE - ); - - // The following group of properties describes edit events. An edit event can be a - // standard insert or assemble edit or a memorized position called a bookmark. - // A NOTE ABOUT EVENTS: as with all lengthy commands, event objects must be created to - // signal completion or error. - - // Intended usage: an edit event is prepared for use by: - // 1. Registering an edit property set and getting an EditID - // 2. Setting the necessary edit properties - // 3. Setting the edit property set active - - // Please see edevdefs.h for properties and values - - // The reference clock's advance is the mechanism that puts an edit in motion (see - // ED_EDIT_REC_INPOINT). - - // Property set methods - HRESULT GetEditPropertySet( - [in] long EditID, - [out] long *pState // ED_SET_ACTIVE | ED_SET_INACTIVE | ED_SET_INVALID - // | ED_SET_EXECUTING - ); - - HRESULT SetEditPropertySet( - [in, out] long *pEditID, - [in] long State // ED_SET_REGISTER | ED_SET_DELETE | ED_SET_ACTIVE | - ); // ED_SET_INACTIVE - - // the following properties define an edit event such as a bookmark, seek point, or - // actual edit - HRESULT GetEditProperty( - [in] long EditID, - [in] long Param, - [out] long *pValue - ); - HRESULT SetEditProperty( - [in] long EditID, - [in] long Param, - [in] long Value - ); - - // Activates a capable transport's edit control (typically used for "on the fly" editing). - HRESULT get_EditStart([out] long *pValue // OATRUE or OAFALSE - ); - HRESULT put_EditStart([in] long Value // OATRUE or OAFALSE - ); -} -typedef IAMExtTransport *PIAMEXTTRANSPORT; - - //--------------------------------------------------------------------- - // Defines IAMTimecodeReader Interface - // - // Contains properties and methods that define behavior of a - // SMPTE/MIDI Timecode Reader. It is expected that this interface - // will be combined (aggregated) with IAMExtTransport to "build" a pro - // VCR. - // - // Implement if: you control such a device - // - // Use if: you want to control such a device - // - // See edevdefs.h for the parameter lists - //===================================================================== - - -// timecode structures -cpp_quote("#if 0") -cpp_quote("/* the following is what MIDL knows how to remote */") -typedef struct tagTIMECODE { - WORD wFrameRate; // will be replaced by AM defs, but see ED_FORMAT_SMPTE for now - WORD wFrameFract; // fractional frame. full scale is always 0x1000 - DWORD dwFrames; -}TIMECODE; -cpp_quote("#else /* 0 */") -cpp_quote("#ifndef TIMECODE_DEFINED") -cpp_quote("#define TIMECODE_DEFINED") -cpp_quote("typedef union _timecode {") -cpp_quote(" struct {") -cpp_quote(" WORD wFrameRate;") -cpp_quote(" WORD wFrameFract;") -cpp_quote(" DWORD dwFrames;") -cpp_quote(" };") -cpp_quote(" DWORDLONG qw;") -cpp_quote(" } TIMECODE;") -cpp_quote("") -cpp_quote("#endif /* TIMECODE_DEFINED */") -cpp_quote("#endif /* 0 */") - -typedef TIMECODE *PTIMECODE; - -typedef struct tagTIMECODE_SAMPLE { - LONGLONG qwTick; // ActiveMovie 100ns timestamp - TIMECODE timecode; // timecode - DWORD dwUser; // timecode user data (aka user bits) - DWORD dwFlags; // timecode flags - see below -} TIMECODE_SAMPLE; -typedef TIMECODE_SAMPLE *PTIMECODE_SAMPLE; - - -[ - object, - uuid(9B496CE1-811B-11cf-8C77-00AA006B6814), - pointer_default(unique) -] -interface IAMTimecodeReader : IUnknown -{ - // Timecode Reader Mode - gets/sets the following properties - // ED_TCR_SOURCE - timecode gen (readback), LTC, VITC, or Control Track - HRESULT GetTCRMode( - [in] long Param, - [out] long *pValue); - HRESULT SetTCRMode( - [in] long Param, - [in] long Value); - - // Select which line of the vertical interval timecode will be read from (if VITC). - // To read VITC on specific multiple lines, the caller would make successive calls to - // put_VITCLine(), once for each line desired. - HRESULT put_VITCLine( - [in] long Line ); // valid lines are 11-20, 0 means autoselect, - // hi bit set means add to list of lines (for - // readers that test across multiple lines) - HRESULT get_VITCLine( - [out] long *pLine ); // hi bit set means multiple lines are used, - // and successive calls will cycle through the - // line numbers (like an enumerator, only simpler) - - // GetTimecode can be used to obtain the most recent timecode value available in the - // stream. The client can use this to monitor the timecode, parse duplicates and - // discontinuities. The source filter supplying the timecode or possibly a down stream - // filter might want to parse for discontinuities or errors since you have to look at - // every sample to do this properly. - // - - HRESULT GetTimecode( - [out] PTIMECODE_SAMPLE pTimecodeSample) ; - -} -typedef IAMTimecodeReader *PIAMTIMECODEREADER; - - //--------------------------------------------------------------------- - //===================================================================== - // Defines IAMTimecodeGenerator Interface - // - // Contains properties and methods that define behavior of an external - // SMPTE/MIDI Timecode Generator. It is expected that this interface - // will be combined (aggregated) with IAMExtTransport to "build" a pro - // VCR. - // - // Implement if: you control such a device - // - // Use if: you want to control such a device - // - // See edevdefs.h for the parameter lists - //--------------------------------------------------------------------- -[ - object, - uuid(9B496CE0-811B-11cf-8C77-00AA006B6814), - pointer_default(unique) - ] -interface IAMTimecodeGenerator : IUnknown { - - // Timecode Generator Mode - gets/sets the following properties (see - // vcrdefss.h for detailed values): - // ED_TCG_TIMECODE_TYPE - LTC, VITC, or MIDI - // ED_TCG_FRAMERATE - 24, 25, 30 drop or 30 nondrop - // ED_TCG_SYNC_SOURCE - what is driving the bitclock - // ED_TCG_REFERENCE_SOURCE - what is driving the count value - HRESULT GetTCGMode( - [in] long Param, - [out] long *pValue); - - HRESULT SetTCGMode( - [in] long Param, - [in] long Value); - - // Select into which line(s) of the vertical interval timecode will be inserted (if VITC). - // Hi bit set means add this line to any previously set lines. - // To generate VITC on specific multiple lines, the caller would make successive calls to - // put_VITCLine(), once for each line desired. - HRESULT put_VITCLine( - [in] long Line // valid lines are 11-20, 0 means autoselect(this setting - ); // is for TC readers that decode from multiple lines) - HRESULT get_VITCLine( - [out] long *pLine - ); - - // Sets timecode and/or userbit value. If generator is running, takes effect - // immediately. If caller wants to set only timecode, set userbit value to -1L (and - // same for setting userbits only) - // - - HRESULT SetTimecode( - [in] PTIMECODE_SAMPLE pTimecodeSample) ; - - - // GetTimecode can be used to obtain the most recent timecode value available in the - // stream. The client can use this to monitor the timecode and verify the generator is - // working properly - // - - HRESULT GetTimecode( - [out] PTIMECODE_SAMPLE pTimecodeSample) ; - -} -typedef IAMTimecodeGenerator *PIAMTIMECODEGENERATOR; - - //--------------------------------------------------------------------- - // Defines IAMTimecodeDisplay Interface - // - // Contains properties and methods that define behavior of an external - // SMPTE/MIDI Timecode Display device (aka "character generator" for - // making "burn-ins" or "window dubs"). It is expected that this interface - // will be combined (aggregated) with IAMExtTransport and the timecode - // interfaces to "build" a pro VCR. - // - // Implement if: you control such a device - // - // Use if: you want to control such a device - // - // See edevdefs.h for the parameter lists - //--------------------------------------------------------------------- -[ - object, - uuid(9B496CE2-811B-11cf-8C77-00AA006B6814), - pointer_default(unique) - ] -interface IAMTimecodeDisplay : IUnknown -{ - // Enable/disable external device's timecode reader's character generator output. Some - // readers have this feature - this is not intended for rendering inside the PC! - HRESULT GetTCDisplayEnable( - [out] long *pState); // OATRUE | OAFALSE - HRESULT SetTCDisplayEnable( - [in] long State); // OATRUE | OAFALSE - // Timecode reader's character generator output - // characteristics (size, position, intensity, etc.). - HRESULT GetTCDisplay( - [in] long Param, - [out] long *pValue); - HRESULT SetTCDisplay( - [in] long Param, - [in] long Value); - - /* Allowable params and values (see edevdefs.h for details): - ED_TCD_SOURCE - ED_TCR | ED_TCG - ED_TCD_SIZE - ED_SMALL | ED_MED | ED_LARGE - ED_TCD_POSITION - ED_TOP | ED_MIDDLE | ED_BOTTOM or'd with - ED_LEFT | ED_CENTER | ED_RIGHT - ED_TCD_INTENSITY - ED_HIGH | ED_LOW - ED_TCD_TRANSPARENCY // set from 0 to 4, 0 being completely opaque - ED_TCD_INVERT // white on black or black on white - OATRUE | OAFALSE - ED_TCD_BORDER // white border for black chars, black border for white letters - OATRUE | OAFALSE - */ -} -typedef IAMTimecodeDisplay *PIAMTIMECODEDISPLAY; - - -[ - object, - uuid(c6545bf0-e76b-11d0-bd52-00a0c911ce86), - pointer_default(unique) -] -interface IAMDevMemoryAllocator : IUnknown -{ - HRESULT GetInfo( - [out] DWORD *pdwcbTotalFree, - [out] DWORD *pdwcbLargestFree, - [out] DWORD *pdwcbTotalMemory, - [out] DWORD *pdwcbMinimumChunk); - - HRESULT CheckMemory( - [in] const BYTE *pBuffer); - - HRESULT Alloc( - [out] BYTE **ppBuffer, - [in, out] DWORD *pdwcbBuffer); - - HRESULT Free( - [in] BYTE *pBuffer); - - HRESULT GetDevMemoryObject( - [out] IUnknown **ppUnkInnner, - [in] IUnknown *pUnkOuter); -} -typedef IAMDevMemoryAllocator *PAMDEVMEMORYALLOCATOR; - - -[ - object, - uuid(c6545bf1-e76b-11d0-bd52-00a0c911ce86), - pointer_default(unique) -] -interface IAMDevMemoryControl : IUnknown -{ - HRESULT QueryWriteSync(); - - HRESULT WriteSync(); - - HRESULT GetDevId( - [out] DWORD *pdwDevId); - -} -typedef IAMDevMemoryControl *PAMDEVMEMORYCONTROL; - -// Flags for IAMStreamSelection::Info -enum _AMSTREAMSELECTINFOFLAGS { - AMSTREAMSELECTINFO_ENABLED = 0x01, // Enable - off for disable - AMSTREAMSELECTINFO_EXCLUSIVE = 0x02 // Turns off the others in the group - // when enabling this one -}; -// Flags for IAMStreamSelection::Enable -enum _AMSTREAMSELECTENABLEFLAGS { - // Currently valid values are : - // 0 - disable all streams in the group containing this stream - // ..._ENABLE - enable only this stream with in the given group - // and disable all others - // ..._ENABLEALL - send out all streams - AMSTREAMSELECTENABLE_ENABLE = 0x01, // Enable - AMSTREAMSELECTENABLE_ENABLEALL = 0x02 // Enable all streams in the group - // containing this stream -}; - -// Control which logical streams are played and find out information about -// them -// Normally supported by a filter -[ - object, - uuid(c1960960-17f5-11d1-abe1-00a0c905f375), - pointer_default(unique) -] -interface IAMStreamSelect : IUnknown -{ - // Returns total count of streams - HRESULT Count( - [out] DWORD *pcStreams); // Count of logical streams - - // Return info for a given stream - S_FALSE if iIndex out of range - // The first steam in each group is the default - HRESULT Info( - [in] long lIndex, // 0-based index - [out] AM_MEDIA_TYPE **ppmt, // Media type - optional - // Use DeleteMediaType to free - [out] DWORD *pdwFlags, // flags - optional - [out] LCID *plcid, // LCID (returns 0 if none) - optional - [out] DWORD *pdwGroup, // Logical group - optional - [out] WCHAR **ppszName, // Name - optional - free with CoTaskMemFree - // optional - [out] IUnknown **ppObject, // Associated object - optional - // Object may change if Enable is - // called on this interface - // - returns NULL if no associated object - // Returns pin or filter for DShow - [out] IUnknown **ppUnk); // Stream specific interface - - // Enable or disable a given stream - HRESULT Enable( - [in] long lIndex, - [in] DWORD dwFlags); -} -typedef IAMStreamSelect *PAMSTREAMSELECT; - -enum _AMRESCTL_RESERVEFLAGS -{ - AMRESCTL_RESERVEFLAGS_RESERVE = 0x00, // Increment reserve count - AMRESCTL_RESERVEFLAGS_UNRESERVE = 0x01 // Decrement reserve count -}; - -// Reserve resources now so that playback can be subsequently -// guaranteed -// -// Normally supported by a filter -// -[ - object, - uuid(8389d2d0-77d7-11d1-abe6-00a0c905f375), - pointer_default(unique), - local -] -interface IAMResourceControl : IUnknown -{ - // The reserve count is incremented/decremented if and only if - // S_OK is returned - // Unreserve once for every Reserve call - HRESULT Reserve( - [in] DWORD dwFlags, // From _AMRESCTL_RESERVEFLAGS enum - [in] PVOID pvReserved // Must be NULL - ); -} - - -// Set clock adjustments - supported by some clocks -[ - object, - uuid(4d5466b0-a49c-11d1-abe8-00a0c905f375), - pointer_default(unique), - local -] -interface IAMClockAdjust : IUnknown -{ - // Set the following delta to clock times - // The clock will add adjust its times by the given delta - HRESULT SetClockDelta( - [in] REFERENCE_TIME rtDelta - ); -}; - -// Filter miscellaneous status flags - -enum _AM_FILTER_MISC_FLAGS { - AM_FILTER_MISC_FLAGS_IS_RENDERER = 0x00000001, /* Will deliver EC_COMPLETE - at end of media */ - AM_FILTER_MISC_FLAGS_IS_SOURCE = 0x00000002 /* Filter sources data */ -}; - -[ - object, - uuid(2dd74950-a890-11d1-abe8-00a0c905f375), - pointer_default(unique), - local -] -interface IAMFilterMiscFlags : IUnknown -{ - // Get miscellaneous property flags - ULONG GetMiscFlags(void); -}; - - -// Video Image drawing interface -[ - object, - local, - uuid(48efb120-ab49-11d2-aed2-00a0c995e8d5), - pointer_default(unique), -] -interface IDrawVideoImage : IUnknown -{ - HRESULT DrawVideoImageBegin(); - - HRESULT DrawVideoImageEnd(); - - HRESULT DrawVideoImageDraw( - [in] HDC hdc, - [in] LPRECT lprcSrc, - [in] LPRECT lprcDst - ); -} - -// -// Video Image decimation interface -// -// The aim of this interface is to enable a video renderer filter to -// control the decimation properties of a video decoder connected to -// the video renderer -// -// This interface should only be supported by decoders that are capable of -// decimating their output image by an arbitary amount. -// -// -[ - object, - local, - uuid(2e5ea3e0-e924-11d2-b6da-00a0c995e8df), - pointer_default(unique), -] -interface IDecimateVideoImage : IUnknown -{ - // - // Informs the decoder that it should decimate its output - // image to the specified width and height. If the decoder can - // decimate to this size it should return S_OK. - // If the decoder can't perform the requested decimation - // or wants to stop performing the decimation that it is - // currently doing it should return E_FAIL. - // - HRESULT SetDecimationImageSize( - [in] long lWidth, - [in] long lHeight); - - // - // Informs the decoder that it should stop decimating its output image - // and resume normal output. - // - HRESULT ResetDecimationImageSize(); -} - -typedef enum _DECIMATION_USAGE { - DECIMATION_LEGACY, // decimate at ovly then video port then crop - DECIMATION_USE_DECODER_ONLY, // decimate image at the decoder only - DECIMATION_USE_VIDEOPORT_ONLY, // decimate at the video port only - DECIMATION_USE_OVERLAY_ONLY, // decimate at the overlay only - DECIMATION_DEFAULT // decimate at decoder then ovly the vide port then crop -} DECIMATION_USAGE; - -[ - object, - local, - uuid(60d32930-13da-11d3-9ec6-c4fcaef5c7be), - pointer_default(unique), -] -interface IAMVideoDecimationProperties: IUnknown -{ - // - // Queries the current usage of the above IDecimateVideoImage - // interface. - // - HRESULT QueryDecimationUsage( - [out] DECIMATION_USAGE* lpUsage); // from DECIMATION_USAGE enum - - // - // Sets the current usage of the above IDecimateVideoImage - // interface. - // - HRESULT SetDecimationUsage( - [in] DECIMATION_USAGE Usage); // from DECIMATION_USAGE enum -} - -//--------------------------------------------------------------------- -// -// IVideoFrameStep interface -// -//--------------------------------------------------------------------- - -[ - object, - uuid(e46a9787-2b71-444d-a4b5-1fab7b708d6a), - pointer_default(unique), -] -interface IVideoFrameStep : IUnknown -{ - // - // Stop(), Pause(), Run() all cancel Step as does any seeking - // request. - // - // The Step() and CancelStep() methods of this interface - // Cancel any previous step. - // - // When stepping is complete EC_STEP_COMPLETE is signalled. - // - // When the filter graph gets EC_STEP_COMPLETE it automatically - // sets the filter graph into paused state and forwards the - // notification to the application - // - // Returns S_OK if stepping initiated. - // - // dwFrames - // 1 means step 1 frame forward - // 0 is invalid - // n (n > 1) means skip n - 1 frames and show the nth - // - // pStepObject - // NULL - default step object (filter) picked - // non-NULL - use this object for stepping - // - HRESULT Step(DWORD dwFrames, [unique] IUnknown *pStepObject); - - // Can step? - // Returns S_OK if it can, S_FALSE if it can't or error code. - // bMultiple - if TRUE return whether can step n > 1 - HRESULT CanStep(long bMultiple, [unique] IUnknown *pStepObject); - - // Cancel stepping - HRESULT CancelStep(); -} - - - - -//--------------------------------------------------------------------- -// -// IAMPushSource interface -// -// Provides a means for source filters to describe information about the -// data that they source, such as whether the data is live or not, and -// what type of clock was used for timestamps. This information may be -// needed by other clocks in the graph in order to provide accurate -// synchronization. Also provides a way to specify an offset value for -// the filter to use when timestamping the streams it sources. Provides -// support for the IAMLatency interface as well. -// -//--------------------------------------------------------------------- - -enum _AM_PUSHSOURCE_FLAGS { - - // - // The default assumption is that the data is from a live source, - // time stamped with the graph clock, and the source does not - // attempt to rate match the data it delivers. - // The following flags can be used to override this assumption. - // - - // capability flags - AM_PUSHSOURCECAPS_INTERNAL_RM = 0x00000001, // source provides internal support for rate matching - AM_PUSHSOURCECAPS_NOT_LIVE = 0x00000002, // don't treat source data as live - AM_PUSHSOURCECAPS_PRIVATE_CLOCK = 0x00000004, // source data timestamped with clock not - // exposed to the graph - - // request flags, set by user via SetPushSourceFlags method - AM_PUSHSOURCEREQS_USE_STREAM_CLOCK = 0x00010000 // source was requested to timestamp - // using a clock that isn't the graph clock -}; - -// -// Used to set a source filter to run in a "live" mode. -// -[ -object, - uuid(F185FE76-E64E-11d2-B76E-00C04FB6BD3D), - pointer_default(unique) -] -interface IAMPushSource : IAMLatency -{ - // used to discover push source's capabilities. - // may be any combination of the AM_PUSHSOURCE_FLAGS flags. - HRESULT GetPushSourceFlags ( - [out] ULONG *pFlags - ); - - // used to set request flags for a push source. - // may be a combination of the AM_PUSHSOURCE_REQS_xxx flags. - HRESULT SetPushSourceFlags ( - [in] ULONG Flags - ); - - // specify an offset for push source time stamps - HRESULT SetStreamOffset ( - [in] REFERENCE_TIME rtOffset - ); - - // retrieve the offset this push source is using - HRESULT GetStreamOffset ( - [out] REFERENCE_TIME *prtOffset - ); - - // retrieve the maximum stream offset this push source thinks it can support - HRESULT GetMaxStreamOffset ( - [out] REFERENCE_TIME *prtMaxOffset - ); - - // allows the filter graph to tell a push source the maximum latency allowed on the graph - // this allows pins like the video capture preview pin to be more efficient with the amount - // of buffering required to support the maximum graph latency - HRESULT SetMaxStreamOffset ( - [in] REFERENCE_TIME rtMaxOffset - ); -}; - - -// ------------------------------------------------------------------------ -// -// IAMDeviceRemoval interface -// -// Implemented by filters to request and receive WM_DEVICECHANGE -// notifications -// -// ------------------------------------------------------------------------ - -[ - object, - uuid(f90a6130-b658-11d2-ae49-0000f8754b99), - pointer_default(unique) -] -interface IAMDeviceRemoval : IUnknown -{ - - HRESULT DeviceInfo( - [out] CLSID *pclsidInterfaceClass, - [out] WCHAR **pwszSymbolicLink); - - HRESULT Reassociate(); - - HRESULT Disassociate(); -} - -// -// for DV -// -typedef struct { - //for 1st 5/6 DIF seq. - DWORD dwDVAAuxSrc; - DWORD dwDVAAuxCtl; - //for 2nd 5/6 DIF seq. - DWORD dwDVAAuxSrc1; - DWORD dwDVAAuxCtl1; - //for video information - DWORD dwDVVAuxSrc; - DWORD dwDVVAuxCtl; - DWORD dwDVReserved[2]; - -} DVINFO, *PDVINFO; - -// ------------------------------------------------------------------------ -// -// IDVEnc interface -// -// Implemented by DV encoder filters to set Encoder format -// -// ------------------------------------------------------------------------ -enum _DVENCODERRESOLUTION { //resolution - DVENCODERRESOLUTION_720x480 = 2012, - DVENCODERRESOLUTION_360x240 = 2013, - DVENCODERRESOLUTION_180x120 = 2014, - DVENCODERRESOLUTION_88x60 = 2015 -}; -enum _DVENCODERVIDEOFORMAT { //PAL/ntsc - DVENCODERVIDEOFORMAT_NTSC = 2000, - DVENCODERVIDEOFORMAT_PAL = 2001 -}; -enum _DVENCODERFORMAT { // dvsd/dvhd/dvsl - DVENCODERFORMAT_DVSD = 2007, - DVENCODERFORMAT_DVHD = 2008, - DVENCODERFORMAT_DVSL = 2009 -}; -[ - object, - uuid(d18e17a0-aacb-11d0-afb0-00aa00b67a42), - pointer_default(unique) -] -interface IDVEnc : IUnknown -{ - - HRESULT get_IFormatResolution ( - [out] int *VideoFormat, //pal or ntsc - [out] int *DVFormat, //dvsd dvhd dvsl - [out] int *Resolution, //720, 360, 180,88 - [in] BYTE fDVInfo, //TRUE: DVINFO structure exist, FALSE: Do not care DVINFO - [out] DVINFO *sDVInfo //NULL if fDVInfo=FALSE, - ); - - HRESULT put_IFormatResolution ( - [in] int VideoFormat, - [in] int DVFormat, - [in] int Resolution, - [in] BYTE fDVInfo, //TRUE: DVINFO structure exist, FALSE: Do not care DVINFO - [in] DVINFO *sDVInfo //NULL if fDVInfo=FALSE, - ); - -} - -// ------------------------------------------------------------------------ -// -// IDVDec interface -// -// Implemented by DV decoder filters to set decoder size -// -// ------------------------------------------------------------------------ -enum _DVDECODERRESOLUTION { - DVDECODERRESOLUTION_720x480 = 1000, - DVDECODERRESOLUTION_360x240 = 1001, - DVDECODERRESOLUTION_180x120 = 1002, - DVDECODERRESOLUTION_88x60 = 1003 -}; -enum _DVRESOLUTION { - DVRESOLUTION_FULL = 1000, - DVRESOLUTION_HALF = 1001, - DVRESOLUTION_QUARTER = 1002, - DVRESOLUTION_DC = 1003 -}; -[ - object, - uuid(b8e8bd60-0bfe-11d0-af91-00aa00b67a42), - pointer_default(unique) -] -interface IIPDVDec : IUnknown -{ - HRESULT get_IPDisplay ( - [out] int *displayPix // The display pixels arrage - ); - - HRESULT put_IPDisplay ( - [in] int displayPix // Change to this display pixel arrage - ) ; -} - -//------------------------------------------------------------------------ -// -// IDVRGB219 interface -// -// Implemented by both the DV encoder and decoder filters -// Used for enabling the 219 mode in which the Range of RGB24 either received -// by the encoder or produced by the decoder becomes (16,16,16)--(235,235,235) -// instead of (0,0,0)--(255,255,255). -// The interface's method has no effect in case of any other color space than -// RGB 24 -// -//------------------------------------------------------------------------ - -[ - object, - uuid(58473A19-2BC8-4663-8012-25F81BABDDD1), - pointer_default(unique) -] -interface IDVRGB219 : IUnknown -{ - HRESULT SetRGB219 ([in] BOOL bState); // State = True Turn 219 mode on else turn it off. -} - - -// ------------------------------------------------------------------------ -// -// IDVSplitter interface -// -// Implemented by DV splitter filters -// -// ------------------------------------------------------------------------ -[ - object, - uuid(92a3a302-da7c-4a1f-ba7e-1802bb5d2d02) -] -interface IDVSplitter : IUnknown -{ - HRESULT DiscardAlternateVideoFrames( - [in] int nDiscard - ) ; -} - -// Audio Renderer statistics params for IAMAudioRendererStats interface -enum _AM_AUDIO_RENDERER_STAT_PARAM { - AM_AUDREND_STAT_PARAM_BREAK_COUNT = 1, // audio breaks - AM_AUDREND_STAT_PARAM_SLAVE_MODE, // current slave mode, see AM_AUDREND_SLAVE_MODEs - AM_AUDREND_STAT_PARAM_SILENCE_DUR, // silence inserted due to gaps (ms) - AM_AUDREND_STAT_PARAM_LAST_BUFFER_DUR, // duration of the last buffer received - AM_AUDREND_STAT_PARAM_DISCONTINUITIES, // discontinuities seen since running - AM_AUDREND_STAT_PARAM_SLAVE_RATE, // what rate are we currently slaving at? S_FALSE if not slaving - AM_AUDREND_STAT_PARAM_SLAVE_DROPWRITE_DUR, // for waveOut slaving - data dropped or added to stay in-sync - // dwParam1 - dropped duration(ms) - // dwParam2 - paused duration(ms) - AM_AUDREND_STAT_PARAM_SLAVE_HIGHLOWERROR, // highest & lowest clock differences seen - // dwParam1 - high err - // dwParam2 - low err - AM_AUDREND_STAT_PARAM_SLAVE_LASTHIGHLOWERROR, // last high and low errs seen - // dwParam1 - last high err - // dwParam2 - last low err - AM_AUDREND_STAT_PARAM_SLAVE_ACCUMERROR, // error between master/slave clocks - AM_AUDREND_STAT_PARAM_BUFFERFULLNESS, // percent audio buffer fullness - AM_AUDREND_STAT_PARAM_JITTER // input buffer jitter -}; - -//--------------------------------------------------------------------- -// -// IAMAudioRendererStats interface -// -// Interface to get at statistical information that is optionally stored -// in an audio renderer filter. Supported on the filter interface (although -// this might be better for ksproxy if we define it as a pin interface?) -// -//--------------------------------------------------------------------- - -[ -object, - uuid(22320CB2-D41A-11d2-BF7C-D7CB9DF0BF93), - pointer_default(unique) -] -interface IAMAudioRendererStats : IUnknown -{ - // Get value corresponding to the passed in parameter id - HRESULT GetStatParam( - [in] DWORD dwParam, - [out] DWORD *pdwParam1, - [out] DWORD *pdwParam2 - ); -} - -//--------------------------------------------------------------------- -// -// IAMLatency interface -// -// Allows a filter to report the expected latency associated with a data -// stream flowing from its input to output pin. Supported on output pins. -// -//--------------------------------------------------------------------- - -[ -object, - uuid(62EA93BA-EC62-11d2-B770-00C04FB6BD3D), - pointer_default(unique) -] -interface IAMLatency : IUnknown -{ - HRESULT GetLatency( - [in] REFERENCE_TIME *prtLatency - ); -} - - -enum _AM_INTF_SEARCH_FLAGS { - AM_INTF_SEARCH_INPUT_PIN = 0x00000001, // search input pins - AM_INTF_SEARCH_OUTPUT_PIN = 0x00000002, // search output pins - AM_INTF_SEARCH_FILTER = 0x00000004 // search filters -}; - -//--------------------------------------------------------------------- -// -// IAMGraphStreams interface -// -// Interface used to control or search over connected streams of data -// flow within a filter graph. -// -//--------------------------------------------------------------------- - -[ -object, - uuid(632105FA-072E-11d3-8AF9-00C04FB6BD3D), - pointer_default(unique) -] -interface IAMGraphStreams : IUnknown -{ - // Search upstream from the current pin, for the specified interface. - // dwFlags can be any combination of the AM_INTF_SEARCH_FLAGS, and allows - // control over what objects to search. A value of 0 means to search all. - HRESULT FindUpstreamInterface( - [in] IPin *pPin, - [in] REFIID riid, - [out, iid_is(riid)] void **ppvInterface, - [in] DWORD dwFlags ); - - // Enable or disable the graph's setting of a timestamp offset - // on push sources. - HRESULT SyncUsingStreamOffset( [in] BOOL bUseStreamOffset ); - - // allow an app to set the maximum offset used on push source filters - HRESULT SetMaxGraphLatency( [in] REFERENCE_TIME rtMaxGraphLatency ); -} - - -// -// IAMOverlayFX -// -// This interface is exposed by the overlay mixer filter and allows -// an application to apply various "effects" to the overlay surface -// used by the overlay mixer. -// -// The effects that can be applied are described by the AMOVERLAYFX -// enumeration. -// -enum AMOVERLAYFX { - // Normal (ie. top down, left to right) video - AMOVERFX_NOFX = 0x00000000, - - // Mirror the overlay across the vertical axis - AMOVERFX_MIRRORLEFTRIGHT = 0x00000002, - - // Mirror the overlay across the horizontal axis - AMOVERFX_MIRRORUPDOWN = 0x00000004, - - // Deinterlace the overlay, if possible - AMOVERFX_DEINTERLACE = 0x00000008 -}; - -[ -object, - uuid(62fae250-7e65-4460-bfc9-6398b322073c), - pointer_default(unique) -] -interface IAMOverlayFX : IUnknown -{ - // Use this method to determine what overlay effects are currently available - // for the overlay surface used by the overlay mixer filter. - // - HRESULT QueryOverlayFXCaps( - [out] DWORD *lpdwOverlayFXCaps - ); - - // Use this method to apply a new overlay effect to the overlay surface - // used by the overlay mixer filter. This method can be called while the - // filter graph is running, the effect is applied immediately - // - HRESULT SetOverlayFX( - [in] DWORD dwOverlayFX - ); - - // Use this method to determine what effect (if any) is currently being - // applied to the overlay surface by the overlay mixer filter. - // - HRESULT GetOverlayFX( - [out] DWORD *lpdwOverlayFX - ); -} - - - -// IAMOpenProgress interface provides information about current progress through -// a download - -[ -object, -uuid(8E1C39A1-DE53-11cf-AA63-0080C744528D), -pointer_default(unique) -] - -interface IAMOpenProgress : IUnknown -{ - // QueryProgress can be used to query the source filter which supports this interface - // for progress information during a renderfile operation. - HRESULT QueryProgress( - [out] LONGLONG* pllTotal, - [out] LONGLONG* pllCurrent - ); - - // AbortOperation can be used to request an abort of RenderFile operation - // causing it to stop downloading. This methods instructs the exporter of - // the IAMOpenProgress interface to hold up their internal abort flag until - // further notice. - HRESULT AbortOperation( - ); -} - - -/*++ - IMpeg2Demultiplexer - - This interface is implemented by the MPEG-2 Demultiplexer filter, - irrespective of program vs. transport stream splitting functionality. ---*/ -[ - object, - local, - uuid (436eee9c-264f-4242-90e1-4e330c107512), - pointer_default(unique) -] -interface IMpeg2Demultiplexer : IUnknown -{ - /*++ - ------------------------------------------------------------------------ - purpose: Creates an output pin of the specified media type. - - pMediaType media type specifier for the new pin - pszPinName pin name; cannot be a duplicate of an existing pin - ppIPin IPin interface pointer to the newly created pin - --*/ - HRESULT - CreateOutputPin ( - [in] AM_MEDIA_TYPE * pMediaType, - [in] LPWSTR pszPinName, - [out] IPin ** ppIPin - ) ; - - /*++ - ------------------------------------------------------------------------ - purpose: Updates the media type of the specified output pin. If no - connection exists, the media type is updated always. If - the pin is connected, the success/failure of the call will - depend on downstream input pin's accetance/rejection of - the specified media type, and subsequent success/failure - of a reconnect. - - pszPinName pin name - pMediaType new media type specifier - --*/ - HRESULT - SetOutputPinMediaType ( - [in] LPWSTR pszPinName, - [in] AM_MEDIA_TYPE * pMediaType - ) ; - - /*++ - ------------------------------------------------------------------------ - purpose: Deletes the specified output pin. - - pszPinName pin name - --*/ - HRESULT - DeleteOutputPin ( - [in] LPWSTR pszPinName - ) ; -} ; - -//--------------------------------------------------------------------- -// IEnumStreamIdMap interface -//--------------------------------------------------------------------- - -cpp_quote("#define MPEG2_PROGRAM_STREAM_MAP 0x00000000") -cpp_quote("#define MPEG2_PROGRAM_ELEMENTARY_STREAM 0x00000001") -cpp_quote("#define MPEG2_PROGRAM_DIRECTORY_PES_PACKET 0x00000002") -cpp_quote("#define MPEG2_PROGRAM_PACK_HEADER 0x00000003") -cpp_quote("#define MPEG2_PROGRAM_PES_STREAM 0x00000004") -cpp_quote("#define MPEG2_PROGRAM_SYSTEM_HEADER 0x00000005") - -cpp_quote("#define SUBSTREAM_FILTER_VAL_NONE 0x10000000") - -typedef struct { - ULONG stream_id ; // mpeg-2 stream_id - DWORD dwMediaSampleContent ; // #define'd above - ULONG ulSubstreamFilterValue ; // filtering value - int iDataOffset ; // offset to elementary stream -} STREAM_ID_MAP ; - -/*++ - Enumerates the StreamIds mapped on a pin ---*/ -[ - object, - local, - uuid (945C1566-6202-46fc-96C7-D87F289C6534), - pointer_default(unique) -] -interface IEnumStreamIdMap : IUnknown -{ - HRESULT - Next ( - [in] ULONG cRequest, - [in, out, size_is (cRequest)] STREAM_ID_MAP * pStreamIdMap, - [out] ULONG * pcReceived - ) ; - - HRESULT - Skip ( - [in] ULONG cRecords - ) ; - - HRESULT - Reset ( - ) ; - - HRESULT - Clone ( - [out] IEnumStreamIdMap ** ppIEnumStreamIdMap - ) ; -} ; - -/*++ - Implemented on the output pin. - - Provides the ability to map/unmap a stream_id to/from an output pin. ---*/ -[ - object, - local, - uuid (D0E04C47-25B8-4369-925A-362A01D95444), - pointer_default(unique) -] -interface IMPEG2StreamIdMap : IUnknown -{ - HRESULT - MapStreamId ( - [in] ULONG ulStreamId, // mpeg-2 stream_id - [in] DWORD MediaSampleContent, // #define'd above IEnumStreamIdMap - [in] ULONG ulSubstreamFilterValue, // filter value - [in] int iDataOffset // elementary stream offset - ) ; - - HRESULT - UnmapStreamId ( - [in] ULONG culStreamId, // number of stream_id's in pulStreamId - [in] ULONG * pulStreamId // array of stream_id's to unmap - ) ; - - HRESULT - EnumStreamIdMap ( - [out] IEnumStreamIdMap ** ppIEnumStreamIdMap - ) ; -} ; - - -// Register a service provider with the filter graph -[ - object, - local, - uuid(7B3A2F01-0751-48DD-B556-004785171C54), - pointer_default(unique) -] -interface IRegisterServiceProvider : IUnknown -{ - // registers one service into it's internal table.. Object is refcounted. - // register a NULL value to remove the service - HRESULT RegisterService([in] REFGUID guidService, [in] IUnknown *pUnkObject); -}; - - -cpp_quote("#define AM_GETDECODERCAP_QUERY_VMR_SUPPORT 0x00000001") -cpp_quote("#define VMR_NOTSUPPORTED 0x00000000") -cpp_quote("#define VMR_SUPPORTED 0x00000001") - -cpp_quote("#define AM_QUERY_DECODER_VMR_SUPPORT 0x00000001") -cpp_quote("#define AM_QUERY_DECODER_DXVA_1_SUPPORT 0x00000002") - -cpp_quote("#define AM_QUERY_DECODER_DVD_SUPPORT 0x00000003") -cpp_quote("#define AM_QUERY_DECODER_ATSC_SD_SUPPORT 0x00000004") -cpp_quote("#define AM_QUERY_DECODER_ATSC_HD_SUPPORT 0x00000005") - -cpp_quote("#define DECODER_CAP_NOTSUPPORTED 0x00000000") -cpp_quote("#define DECODER_CAP_SUPPORTED 0x00000001") - - -[ - object, - local, - uuid(c0dff467-d499-4986-972b-e1d9090fa941), - pointer_default(unique) -] -interface IAMDecoderCaps : IUnknown -{ - HRESULT GetDecoderCaps([in] DWORD dwCapIndex, [out] DWORD* lpdwCap); -}; - - - -//--------------------------------------------------------------------- -// -// IAMClockSlave interface -// -// When the audio renderer is slaving to a separate graph clock this -// interface provides a way for an app to specify how closely in sync -// the slaving renderer should try to stay to the graph clock. Note that -// using a larger tolerance for a video & audio playback graph will likely -// result in looser a/v sync, so it recommended not to change this setting -// except under special circumstances. -// -//--------------------------------------------------------------------- - -// -// Used to set/get the error tolerance used by a slaving audio renderer -// -[ -object, - uuid(9FD52741-176D-4b36-8F51-CA8F933223BE), - pointer_default(unique) -] -interface IAMClockSlave : IUnknown -{ - // set millisecond value to use for slaving tolerance - // the allowed range is 1 to 1000ms - HRESULT SetErrorTolerance ( - [in] DWORD dwTolerance - ); - - // get millisecond value currently being used for slaving tolerance - HRESULT GetErrorTolerance ( - [out] DWORD *pdwTolerance - ); -}; - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// The following is the original contents of this header from -// the DirectX 8.0 SDK. -// -///////////////////////////////////////////////////////////////////////////// - -#else // DirectX 8.0 content - - - // forward declarations - these are the interfaces declared in this file - - interface IEnumRegFilters; - interface IFileSourceFilter; - interface IFileSinkFilter; - interface IFileSinkFilter2; - interface IGraphBuilder; - interface ICaptureGraphBuilder; - interface ICaptureGraphBuilder2; - interface IAMCopyCaptureFileProgress; - interface IFilterMapper; - interface IFilterMapper2; - interface IMediaEventSink; - interface IOverlay; - interface IOverlayNotify; - interface IOverlayNotify2; - interface IQualityControl; - interface ISeekingPassThru; - interface IAMStreamConfig; - interface IAMDevMemoryAllocator; - interface IAMDevMemoryControl; - interface IConfigInterleaving; - interface IConfigAviMux; - interface IAMVideoCompression; - interface IAMVfwCaptureDialogs; - interface IAMVfwCompressDialogs; - interface IAMDroppedFrames; - interface IAMAudioInputMixer; - interface IAMBufferNegotiation; - interface IAMAnalogVideoDecoder; - interface IAMVideoProcAmp; - interface IAMAnalogVideoEncoder; - interface IAMCameraControl; - interface IAMCrossbar; - interface IAMTVTuner; - interface IKsPropertySet; - interface IAMPhysicalPinInfo; - interface IAMExtDevice; - interface IAMExtTransport; - interface IAMTimecodeReader; - interface IAMTimecodeGenerator; - interface IAMTimecodeDisplay; - interface IDrawVideoImage; - interface IDecimateVideoImage; - interface IAMVideoDecimationProperties; - interface IAMPushSource; - interface IAMAudioRendererStats; - interface IAMLatency; - interface IAMGraphStreams; - interface IAMOverlayFX; - interface IAMOpenProgress; - interface IMpeg2Demultiplexer ; - interface IMPEG2StreamIdMap ; - interface IEnumStreamIdMap ; - - //========================================================================== - //========================================================================== - // IEnumRegFilters interface -- enumerates registered filters. - // enumerator interface returned from IFilterMapper::EnumMatchingFilters(). - // based on IEnum pseudo-template - //========================================================================== - //========================================================================== - - typedef struct { - CLSID Clsid; // class id of the filter - LPWSTR Name; // name of filter - } REGFILTER; - - [ - object, - uuid(56a868a4-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) - ] - - // The point of the mapper is to avoid loading filters. By looking in the - // registry we can reduce the number of filters which must be loaded and tried. - // This enumerator returns descriptors of filters (including the GUIDs that - // CoCreateInstance can instantiate). The filters themselves are not loaded. - - interface IEnumRegFilters : IUnknown { - import "unknwn.idl"; - - // The caller must use CoTaskMemFree to free each REGFILTER* returned - // in the array. - HRESULT Next - ( [in] ULONG cFilters, // place this many filters... - [out] REGFILTER ** apRegFilter, // ...in this array of REGFILTER* - [out] ULONG * pcFetched // actual count passed returned here - ); - - // I can't think why anyone would want to skip, so it's not implemented. - // (anyone who thinks they know what they would be skipping over is probably - // missing some piece of the jigsaw). This ALWAYS returns E_NOTIMPL. - - HRESULT Skip( - [in] ULONG cFilters - ); - - HRESULT Reset(void); - - // No cloning either - also ALWAYS returns E_NOTIMPL. - - HRESULT Clone( - [out] IEnumRegFilters **ppEnum - ); - } - - - typedef IEnumRegFilters *PENUMREGFILTERS; - - //======================================================================== - //======================================================================== - // abstraction representing the registered information about filters. - // This allows properties of filters to be looked up without loading them. - //======================================================================== - //======================================================================== - - [ - object, - uuid(56a868a3-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) - ] - interface IFilterMapper : IUnknown { - import "unknwn.idl"; - - //========================================================================== - // Registration functions. - // A filter should be registered before any other use. - // The registration can be NON_VOLATILE (i.e. permanent, do once ever) - // or VOLATILE (once per boot of the system). - // UnregisterFilter (obviously) removes the registration. - // The action of any of the other calls on unregistered filters is undefined. - // it will either work or you'll get an error, but I'm not saying which. - //========================================================================== - - // Four predefined values controling the order in which filters are tried - // for intelligent graph building. Intermediate values are legal. - // Any value <=MERIT_DO_NOT_USE will mean that the filter will never - // be tried by the filtergrah to automatically complete a connection. - - enum { MERIT_PREFERRED = 0x800000, - MERIT_NORMAL = 0x600000, - MERIT_UNLIKELY = 0x400000, - MERIT_DO_NOT_USE = 0x200000, - MERIT_SW_COMPRESSOR = 0x100000, - MERIT_HW_COMPRESSOR = 0x100050 - }; - - // Register a filter - - HRESULT RegisterFilter - ( [in] CLSID clsid, // GUID of the filter - [in] LPCWSTR Name, // Descriptive name for the filter - [in] DWORD dwMerit // DO_NOT_USE, UNLIKELY, NORMAL or PREFERRED. - ); - - - // Register an identifiable instance of a filter. This deals with cases - // such as two similar sound cards which are driven by the same driver, - // but we want to choose which oif these cards the sound will come out of. - // This is not needed if there is only one instance of the filter - // (e.g. there is only one sound card in the machine) or if all instances - // of the filter are equivalent. - - // The filter itself must have already been registered // ??? Is that true? - HRESULT RegisterFilterInstance - ( [in] CLSID clsid, // GUID of the filter - [in] LPCWSTR Name, // Descriptive name of instance. - [out] CLSID *MRId // Returned Media Resource Id. A - // locally unique id for this instance - // of this filter - ); - - - HRESULT RegisterPin - ( [in] CLSID Filter, // GUID of filter - [in] LPCWSTR Name, // Name of the pin - [in] BOOL bRendered, // The filter renders this input - [in] BOOL bOutput, // TRUE if this is an Output pin - [in] BOOL bZero, // TRUE if OK for zero instances of pin - // In this case you will have to Create - // a pin to have even one instance - [in] BOOL bMany, // TRUE if OK for many instances of pin - [in] CLSID ConnectsToFilter, // Filter it connects to if it has - // subterranean connection, else NULL - [in] LPCWSTR ConnectsToPin // Name of pin it connects to - // NULL for output pins - ); - - HRESULT RegisterPinType - ( [in] CLSID clsFilter, // GUID of filter - [in] LPCWSTR strName, // Descriptive name of the pin - [in] CLSID clsMajorType, // Major type of the data stream - [in] CLSID clsSubType // Sub type of the data stream - ); - - - HRESULT UnregisterFilter - ( [in] CLSID Filter // GUID of filter - ); - - - HRESULT UnregisterFilterInstance - ( [in] CLSID MRId // Media Resource Id of this instance - ); - - - HRESULT UnregisterPin - ( [in] CLSID Filter, // GUID of filter - [in] LPCWSTR Name // Name of the pin - ); - - - // Set *ppEnum to be an enumerator for filters matching the requirements. - - HRESULT EnumMatchingFilters - ( [out] IEnumRegFilters **ppEnum // enumerator returned - , [in] DWORD dwMerit // at least this merit needed - , [in] BOOL bInputNeeded // need at least one input pin - , [in] CLSID clsInMaj // input major type - , [in] CLSID clsInSub // input sub type - , [in] BOOL bRender // must the input be rendered? - , [in] BOOL bOututNeeded // need at least one output pin - , [in] CLSID clsOutMaj // output major type - , [in] CLSID clsOutSub // output sub type - ); - - } - - // structure used to identify media types a pin handles. Used for - // registration through IFilterMapper and IFilterMapper2 - // - typedef struct - { - const CLSID * clsMajorType; - const CLSID * clsMinorType; - } REGPINTYPES; - - // describes pin for filter registration. Used for registration - // through IFilterMapper and IFilterMapper2 - // - typedef struct - { - LPWSTR strName; - - // The filter renders this input - BOOL bRendered; - - // This is an Output pin - BOOL bOutput; - - // OK to have zero instances of pin In this case you will have to - // Create a pin to have even one instance - BOOL bZero; - - // OK to create many instance of pin - BOOL bMany; - - const CLSID * clsConnectsToFilter; - const WCHAR * strConnectsToPin; - - UINT nMediaTypes; - const REGPINTYPES * lpMediaType; - } REGFILTERPINS; - - // mediums (as defined in the Windows NT DDK) for registration with - // IFilterMapper2 - // - typedef struct - { - CLSID clsMedium; - DWORD dw1; - DWORD dw2; - } REGPINMEDIUM; - - // flags for dwFlags in REFILTERPINS2 - enum - { - // OK to have zero instances of pin In this case you will have to - // Create a pin to have even one instance - REG_PINFLAG_B_ZERO = 0x1, - - // The filter renders this input - REG_PINFLAG_B_RENDERER = 0x2, - - // OK to create many instance of pin - REG_PINFLAG_B_MANY = 0x4, - - // This is an Output pin - REG_PINFLAG_B_OUTPUT = 0x8 - }; - - - // describes pin for filter registration through IFilterMapper2 - typedef struct - { - // combination of REG_PINFLAG flags - DWORD dwFlags; - - // number of instances of the pin if known - UINT cInstances; - - UINT nMediaTypes; - [size_is(nMediaTypes)] const REGPINTYPES * lpMediaType; - - UINT nMediums; - [size_is(nMediums)] const REGPINMEDIUM *lpMedium; - - // pin category (for Kernel Streaming pins) as defined in the - // Windows NT DDK - const CLSID *clsPinCategory; - - } REGFILTERPINS2; - - // describes filter for registration through IFilterMapper2 - typedef struct - { - DWORD dwVersion; // 1 or 2 - DWORD dwMerit; - - /* unnamed union */ - [switch_is(dwVersion)] [switch_type(DWORD)] union - { - [case(1)] - - struct - { - ULONG cPins; - [size_is(cPins)] const REGFILTERPINS *rgPins; - }; - - [case(2)] - - struct - { - ULONG cPins2; - [size_is(cPins2)] const REGFILTERPINS2 *rgPins2; - }; - - [default] - ; - } ; - - } REGFILTER2; - - - - [ - object, - uuid(b79bb0b0-33c1-11d1-abe1-00a0c905f375), - pointer_default(unique) - ] - interface IFilterMapper2 : IUnknown { - import "unknwn.idl"; - - // create or rename ActiveMovie category - HRESULT CreateCategory - ( [in] REFCLSID clsidCategory, - [in] DWORD dwCategoryMerit, - [in] LPCWSTR Description - ); - - HRESULT UnregisterFilter - ( [in] const CLSID *pclsidCategory, - [in] const OLECHAR *szInstance, - [in] REFCLSID Filter // GUID of filter - ); - - // Register a filter, pins, and media types under a category. - HRESULT RegisterFilter - ( [in] REFCLSID clsidFilter, // GUID of the filter - [in] LPCWSTR Name, // Descriptive name for the filter - - // ppMoniker can be null. or *ppMoniker can contain the - // moniker where this filter data will be written; - // *ppMoniker will be set to null on return. or *ppMoniker - // can be null in which case the moniker will be returned - // with refcount. - [in, out] IMoniker **ppMoniker, - - // can be null - [in] const CLSID *pclsidCategory, - - // cannot be null - [in] const OLECHAR *szInstance, - - // rest of filter and pin registration - [in] const REGFILTER2 *prf2 - ); - - // Set *ppEnum to be an enumerator for filters matching the - // requirements. - HRESULT EnumMatchingFilters - ( [out] IEnumMoniker **ppEnum // enumerator returned - , [in] DWORD dwFlags // 0 - , [in] BOOL bExactMatch // don't match wildcards - , [in] DWORD dwMerit // at least this merit needed - , [in] BOOL bInputNeeded // need at least one input pin - , [in] DWORD cInputTypes // Number of input types to match - // Any match is OK - , [size_is(cInputTypes*2)] const GUID *pInputTypes // input major+subtype pair array - , [in] const REGPINMEDIUM *pMedIn // input medium - , [in] const CLSID *pPinCategoryIn // input pin category - , [in] BOOL bRender // must the input be rendered? - , [in] BOOL bOutputNeeded // need at least one output pin - , [in] DWORD cOutputTypes // Number of output types to match - // Any match is OK - , [size_is(cOutputTypes*2)] const GUID *pOutputTypes // output major+subtype pair array - , [in] const REGPINMEDIUM *pMedOut // output medium - , [in] const CLSID *pPinCategoryOut // output pin category - ); - } - - [ - object, - uuid(b79bb0b1-33c1-11d1-abe1-00a0c905f375), - pointer_default(unique) - ] - interface IFilterMapper3 : IFilterMapper2 { - // new interface to allow creating filters using the mapper's devenum instance - // primarily needed for out-of-proc access to a graph - HRESULT GetICreateDevEnum( [out] ICreateDevEnum **ppEnum ); - } - - //======================================================================== - //======================================================================== - // Defines IQualityControl interface - // - // Defines quality messages and allows a quality manager to install itself - // as the sink for quality messages. - //======================================================================== - //======================================================================== - - typedef enum tagQualityMessageType { - Famine, - Flood - } QualityMessageType; - - typedef struct tagQuality { - QualityMessageType Type; - long Proportion; // milli-units. 1000 = no change - // for Flood: - // What proportion of the media samples currently - // coming through are required in the future. - // 800 means please drop another 20% - // For Famine: - // How much to "keep in" e.g. 800 means send me - // 20% less e.g. by dropping 20% of the samples. - // 1100 would mean "I'm coping, send me more". - REFERENCE_TIME Late; - // How much you need to catch up by - REFERENCE_TIME TimeStamp; - // The stream time when this was generated (probably - // corresponds to the start time on some sample). - } Quality; - - typedef IQualityControl *PQUALITYCONTROL; - - - [ - object, - uuid(56a868a5-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) - ] - interface IQualityControl : IUnknown { - - // Notify the recipient that a quality change is requested. - // pSelf is the IBaseFilter* of the sender. - // this is sent from a filter - // to (the quality manager or) an upstream peer. - HRESULT Notify - ( [in] IBaseFilter * pSelf, - [in] Quality q - ); - - // Notify the recipient that future quality messages are to be sent - // to iqc. If piqc is NULL then quality messages are to default back to - // the upstream peer. - // This is sent from the quality manager to a filter. - // The recipient should hold piqc as a WEAK reference, - // i.e. do not AddRef it, do not Release it. - HRESULT SetSink - ( [in] IQualityControl * piqc - ); - } - - //===================================================================== - //===================================================================== - // Definitions required for overlay transport - //===================================================================== - //===================================================================== - - - // Used to communicate the colour that the IOverlay client wants the window - // painted in so that it can draw directly to the correct clipping region - // A colour key can be described in two alternate ways, the first is by a - // range of one or more (system) palette indices. The second is by defining - // a colour cube with two RGB values, any of which would be acceptable. - // - // The CK values are consistent with GDI PALETTEINDEX and PALETTERGB macros - - - enum { CK_NOCOLORKEY = 0x0, // No color key is required - CK_INDEX = 0x1, // Index into the current system palette - CK_RGB = 0x2 }; // Color key is an RGB value (or range) - - typedef struct tagCOLORKEY { - - DWORD KeyType; // Explains meaning of the structure - DWORD PaletteIndex; // Palette index if available - COLORREF LowColorValue; // Low colour space RGB value - COLORREF HighColorValue; // Defines the high RGB value - - } COLORKEY; - - // When a filter sets up an advise link it can ask that only certain types - // of notifications be sent, for example just palette changes. While this - // doesn't mean that the other notification call backs won't ever be called - // the IOverlay implementation may use this as an efficiency optimisation - - enum { ADVISE_NONE = 0x0, // No notifications required - ADVISE_CLIPPING = 0x1, // Synchronous clip information - ADVISE_PALETTE = 0x2, // Palette change notifications - ADVISE_COLORKEY = 0x4, // Called when colour key changes - ADVISE_POSITION = 0x8, // Likewise when window moves etc - ADVISE_DISPLAY_CHANGE = 0x10 // Called on WM_DISPLAYCHANGE - }; - - const DWORD ADVISE_ALL = ADVISE_CLIPPING | - ADVISE_PALETTE | - ADVISE_COLORKEY | - ADVISE_POSITION; - - const DWORD ADVISE_ALL2 = ADVISE_ALL | - ADVISE_DISPLAY_CHANGE; - - // This isn't defined when you run IDL - - cpp_quote("#ifndef _WINGDI_") - - typedef struct _RGNDATAHEADER { - DWORD dwSize; - DWORD iType; - DWORD nCount; - DWORD nRgnSize; - RECT rcBound; - } RGNDATAHEADER; - - typedef struct _RGNDATA { - RGNDATAHEADER rdh; - char Buffer[1]; - } RGNDATA; - - cpp_quote("#endif") - - - //===================================================================== - //===================================================================== - // Defines IOverlayNotify interface - // - // This interface gives asynchronous notifications of changes to the - // rendering window - such as changes to the exposed window area - //===================================================================== - //===================================================================== - - [ - object, - local, - uuid(56a868a0-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) - ] - interface IOverlayNotify : IUnknown { - - // IOverlayNotify methods - - // This notifies the filter of palette changes, the filter should copy - // the array of RGBQUADs if it needs to use them after returning. This - // is not called when the palette is actually changed in the display - // but at a short time after (in sync with WM_PALETTECHANGED messages) - - HRESULT OnPaletteChange( - [in] DWORD dwColors, // Number of colours present - [in] const PALETTEENTRY *pPalette); // Array of palette colours - - // This provides synchronous clip changes so that the client is called - // before the window is moved to freeze the video, and then when the - // window has stabilised it is called again to start playback again. - // If the window rect is all zero then the window is invisible, the - // filter must take a copy of the information if it wants to keep it - - HRESULT OnClipChange( - [in] const RECT *pSourceRect, // Region of video to use - [in] const RECT *pDestinationRect, // Where video goes - [in] const RGNDATA *pRgnData); // Defines clipping information - - HRESULT OnColorKeyChange([in] const COLORKEY *pColorKey); - - // The calls to OnClipChange happen in sync with the window. So it is - // called with an empty clip list before the window moves to freeze - // the video, and then when the window has stabilised it is called - // again with the new clip list. The OnPositionChange callback is for - // overlay cards that don't want the expense of synchronous clipping - // updates and just want to know when the source or destination video - // positions change. They will NOT be called in sync with the window - // but at some point after the window has changed (basicly in time - // with WM_SIZE etc messages received). This is therefore suitable - // for overlay cards that don't inlay their data to the frame buffer - // NOTE the destination is NOT clipped to the visible display area - - HRESULT OnPositionChange([in] const RECT *pSourceRect, - [in] const RECT *pDestinationRect); - } - - typedef IOverlayNotify *POVERLAYNOTIFY; - - - //===================================================================== - //===================================================================== - // Defines IOverlayNotify2 interface - // - // This interface gives asynchronous notifications of changes to the - // rendering window - such as changes to the exposed window area - // This is optionally supported by the advise sink for the purposes - // of accepting OnDisplayChange notification. - //===================================================================== - //===================================================================== - - cpp_quote("#if !defined(HMONITOR_DECLARED) && !defined(HMONITOR) && (WINVER < 0x0500)") - cpp_quote("#define HMONITOR_DECLARED") - cpp_quote("#if 0") - typedef HANDLE HMONITOR; - cpp_quote("#endif") - cpp_quote("DECLARE_HANDLE(HMONITOR);") - cpp_quote("#endif") - - [ - object, - local, - uuid(680EFA10-D535-11D1-87C8-00A0C9223196), - pointer_default(unique) - ] - interface IOverlayNotify2 : IOverlayNotify { - - // IOverlayNotify2 methods - - HRESULT OnDisplayChange( // ADVISE_DISPLAY_CHANGE - HMONITOR hMonitor); - } - - typedef IOverlayNotify2 *POVERLAYNOTIFY2; - - - //===================================================================== - //===================================================================== - // Defines IOverlay interface - // - // This interface provides information so that a filter can write direct to - // the frame buffer while placing the video in the correct window position - //===================================================================== - //===================================================================== - - [ - object, - local, - uuid(56a868a1-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) - ] - interface IOverlay : IUnknown { - - // IOverlay methods - - HRESULT GetPalette( - [out] DWORD *pdwColors, // Number of colours present - [out] PALETTEENTRY **ppPalette); // Where to put palette data - - HRESULT SetPalette( - [in] DWORD dwColors, // Number of colours present - [in] PALETTEENTRY *pPalette); // Colours to use for palette - - // If you change the colour key through SetColorKey then all the advise - // links will receive an OnColorKeyChange callback with the new colour - - HRESULT GetDefaultColorKey([out] COLORKEY *pColorKey); - HRESULT GetColorKey([out] COLORKEY *pColorKey); - HRESULT SetColorKey([in,out] COLORKEY *pColorKey); - HRESULT GetWindowHandle([out] HWND *pHwnd); - - // The IOverlay implementation allocates the memory for the clipping - // rectangles as it can be variable in length. The filter calling - // this method should free the memory when it is finished with it - - HRESULT GetClipList([out] RECT *pSourceRect, - [out] RECT *pDestinationRect, - [out] RGNDATA **ppRgnData); - - // Returns the current video source and destination - - HRESULT GetVideoPosition([out] RECT *pSourceRect, - [out] RECT *pDestinationRect); - - HRESULT Advise( - [in] IOverlayNotify *pOverlayNotify, // Notification interface - [in] DWORD dwInterests); // Callbacks interested in - - HRESULT Unadvise(); // Stop the callbacks now - } - - typedef IOverlay *POVERLAY; - - - //===================================================================== - //===================================================================== - // control related interfaces (others are defined in control.odl) - //===================================================================== - //===================================================================== - - - //===================================================================== - //===================================================================== - // Defines IMediaEventSink interface - // - // Exposed by filtergraph. Called by filters to notify events. Will be - // passed on to application by the IMediaControl event methods. - //===================================================================== - //===================================================================== - - [ - object, - uuid(56a868a2-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) - ] - interface IMediaEventSink : IUnknown { - - // notify an event. will be queued, but not delivered to - // the application on this thread. - HRESULT Notify( - [in] long EventCode, - [in] LONG_PTR EventParam1, - [in] LONG_PTR EventParam2 - ); - } - - typedef IMediaEventSink *PMEDIAEVENTSINK; - - //===================================================================== - //===================================================================== - // Defines IFileSourceFilter interface - // - // Exposed by source filters to set the file name and media type. - //===================================================================== - //===================================================================== - - [ - object, - uuid(56a868a6-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) - ] - interface IFileSourceFilter : IUnknown { - - // Load a file and assign it the given media type - HRESULT Load( - [in] LPCOLESTR pszFileName, // Pointer to absolute path of file to open - [in, unique] const AM_MEDIA_TYPE *pmt // Media type of file - can be NULL - ); - // Get the currently loaded file name - HRESULT GetCurFile( - [out] LPOLESTR *ppszFileName, // Pointer to the path for the current file - [out] AM_MEDIA_TYPE *pmt // Pointer to the media type - ); - } - - typedef IFileSourceFilter *PFILTERFILESOURCE; - - //===================================================================== - //===================================================================== - // Defines IFileSinkFilter interface - // - // Exposed by renderers to set the output file name. - //===================================================================== - //===================================================================== - - [ - object, - uuid(a2104830-7c70-11cf-8bce-00aa00a3f1a6), - pointer_default(unique) - ] - interface IFileSinkFilter : IUnknown { - - // Output to this file. default is to open the existing file - HRESULT SetFileName( - [in] LPCOLESTR pszFileName, // Pointer to absolute path of output file - [in, unique] const AM_MEDIA_TYPE *pmt // Media type of file - can be NULL - ); - // Get the current file name - HRESULT GetCurFile( - [out] LPOLESTR *ppszFileName, // Pointer to the path for the current file - [out] AM_MEDIA_TYPE *pmt // Pointer to the media type - ); - } - - typedef IFileSinkFilter *PFILTERFILESINK; - - [ - object, - uuid(00855B90-CE1B-11d0-BD4F-00A0C911CE86), - pointer_default(unique) - ] - interface IFileSinkFilter2 : IFileSinkFilter { - - HRESULT SetMode( - [in] DWORD dwFlags // AM_FILESINK_FLAGS - ); - - HRESULT GetMode( - [out] DWORD *pdwFlags // AM_FILESINK_FLAGS - ); - } - - typedef IFileSinkFilter2 *PFILESINKFILTER2; - - typedef enum { - - // create a new file - AM_FILE_OVERWRITE = 0x00000001, - - } AM_FILESINK_FLAGS; - - - // - // Intelligent connectivity for filters - an interface supported by - // filter graphs (since it is an extension to IFilterGraph) that supports - // building of graphs by automatic selection and connection of appropriate - // filters - - [ - object, - uuid(56a868a9-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) - ] - interface IGraphBuilder : IFilterGraph { - // Connect these two pins directly or indirectly, using transform filters - // if necessary. - - HRESULT Connect - ( [in] IPin * ppinOut, // the output pin - [in] IPin * ppinIn // the input pin - ); - - - // Connect this output pin directly or indirectly, using transform filters - // if necessary to something that will render it. - - HRESULT Render - ( [in] IPin * ppinOut // the output pin - ); - - - // Build a filter graph that will render this file using this play list. - // If lpwstrPlayList is NULL then it will use the default play list - // which will typically render the whole file. - - HRESULT RenderFile - ( [in] LPCWSTR lpcwstrFile, - [in, unique] LPCWSTR lpcwstrPlayList - ); - - - // Add to the filter graph a source filter for this file. This would - // be the same source filter that would be added by calling Render. - // This call gives you more control over building - // the rest of the graph, e.g. AddFilter() - // and then Connect the two. - // The IBaseFilter* interface exposed by the source filter is returned - // in ppFilter, addrefed already for you - // The filter will be known by the name lpcwstrFIlterName - // nn this filter graph, - HRESULT AddSourceFilter - ( [in] LPCWSTR lpcwstrFileName, - [in, unique] LPCWSTR lpcwstrFilterName, - [out] IBaseFilter* *ppFilter - ); - - - // If this call is made then trace information will be written to the - // file showing the actions taken in attempting to perform an operation. - HRESULT SetLogFile - ( [in] DWORD_PTR hFile // open file handle e.g. from CreateFile - ); - - - // Request that the graph builder should return as soon as possible from - // its current task. - // Note that it is possible fot the following to occur in the following - // sequence: - // Operation begins; Abort is requested; Operation completes normally. - // This would be normal whenever the quickest way to finish an operation - // was to simply continue to the end. - HRESULT Abort(); - - // Return S_OK if the curent operation is to continue, - // return S_FALSE if the current operation is to be aborted. - // This method can be called as a callback from a filter which is doing - // some operation at the request of the graph. - HRESULT ShouldOperationContinue(); - - } - - - // - // New capture graph builder - - [ - object, - uuid(bf87b6e0-8c27-11d0-b3f0-00aa003761c5), - pointer_default(unique) - ] - interface ICaptureGraphBuilder : IUnknown { - - // Use this filtergraph - HRESULT SetFiltergraph( - [in] IGraphBuilder *pfg); - - // what filtergraph are you using? - // *ppfg->Release() when you're done with it - HRESULT GetFiltergraph( - [out] IGraphBuilder **ppfg); - - // creates a rendering section in the filtergraph consisting of a MUX - // of some filetype, and a file writer (and connects them together) - // *ppf->Release() when you're done with it - // *ppSink->Release() when you're done with it - HRESULT SetOutputFileName( - [in] const GUID *pType, // type of file to write, eg. MEDIASUBTYPE_Avi - [in] LPCOLESTR lpstrFile, // filename given to file writer - [out] IBaseFilter **ppf, // returns pointer to the MUX - [out] IFileSinkFilter **ppSink);// queried from file writer - - // Looks for an interface on the filter and on the output pin of the given - // category. (Categories: CAPTURE/PREVIEW/VIDEOPORT/VBI etc. or - // NULL for "don't care". - // It will also look upstream and downstream of - // the pin for the interface, to find interfaces on renderers, MUXES, TV - // Tuners, etc. - // Call *ppint->Release() when you're done with it - [local] HRESULT FindInterface( - [in, unique] const GUID *pCategory, // can be NULL for all pins - [in] IBaseFilter *pf, - [in] REFIID riid, - [out] void **ppint); - [call_as(FindInterface)] HRESULT RemoteFindInterface( - [in, unique] const GUID *pCategory, // can be NULL for all pins - [in] IBaseFilter *pf, - [in] REFIID riid, - [out] IUnknown **ppint); - - // Connects the pin of the given category of the source filter to the - // rendering filter, optionally through another filter (compressor?) - // For a non-NULL category, it will instantiate and connect additional - // required filters upstream too, like TV Tuners and Crossbars. - // If there is only one output pin on the source, use a NULL - // category. You can also have pSource be a pin - HRESULT RenderStream( - [in] const GUID *pCategory, // can be NULL if only one output pin - [in] IUnknown *pSource, // filter or pin - [in] IBaseFilter *pfCompressor, - [in] IBaseFilter *pfRenderer); // can be NULL - - // Sends IAMStreamControl messages to the pin of the desired category, eg. - // "capture" or "preview" - // REFERENCE_TIME=NULL means NOW - // REFERENCE_TIME=MAX_TIME means never, or cancel previous request - // NULL controls all capture filters in the graph - you will get one - // notification for each filter with a pin of that category found - // returns S_FALSE if stop will be signalled before last sample is - // rendered. - // return a FAILURE code if the filter does not support IAMStreamControl - HRESULT ControlStream( - [in] const GUID *pCategory, - [in] IBaseFilter *pFilter, - [in] REFERENCE_TIME *pstart, - [in] REFERENCE_TIME *pstop, - [in] WORD wStartCookie, // high word reserved - [in] WORD wStopCookie); // high word reserved - - // creates a pre-allocated file of a given size in bytes - HRESULT AllocCapFile( - [in] LPCOLESTR lpstr, - [in] DWORDLONG dwlSize); - - // Copies the valid file data out of the old, possibly huge old capture - // file into a shorter new file. - // Return S_FALSE from your progress function to abort capture, S_OK to - // continue - HRESULT CopyCaptureFile( - [in] LPOLESTR lpwstrOld, - [in] LPOLESTR lpwstrNew, - [in] int fAllowEscAbort, // pressing ESC will abort? - [in] IAMCopyCaptureFileProgress *pCallback); // implement this to - // get progress - } - - - // - // Capture graph builder "CopyCapturedFile" progress callback - - [ - object, - uuid(670d1d20-a068-11d0-b3f0-00aa003761c5), - pointer_default(unique) - ] - interface IAMCopyCaptureFileProgress : IUnknown { - - // If you support this interface somewhere, this function will be called - // periodically while ICaptureGraphBuilder::CopyCaptureFile is executing - // to let you know the progress - // - // Return S_OK from this function to continue. Return S_FALSE to abort the - // copy - HRESULT Progress( - [in] int iProgress); // a number between 0 and 100 (%) - } - - - // - // Capture graph builder that can deal with a single filter having more than - // one pin of each category... some new devices can capture both audio and - // video, for example - // - - [ - object, - uuid(93E5A4E0-2D50-11d2-ABFA-00A0C9C6E38D), - pointer_default(unique) - ] - interface ICaptureGraphBuilder2 : IUnknown { - - // Use this filtergraph - HRESULT SetFiltergraph( - [in] IGraphBuilder *pfg); - - // what filtergraph are you using? - // *ppfg->Release() when you're done with it - HRESULT GetFiltergraph( - [out] IGraphBuilder **ppfg); - - // creates a rendering section in the filtergraph consisting of a MUX - // of some filetype, and a file writer (and connects them together) - // *ppf->Release() when you're done with it - // *ppSink->Release() when you're done with it - HRESULT SetOutputFileName( - [in] const GUID *pType, // GUID of MUX filter to use - [in] LPCOLESTR lpstrFile, // filename given to file writer - [out] IBaseFilter **ppf, // returns pointer to the MUX - [out] IFileSinkFilter **ppSink);// queried from file writer - - // Looks for an interface on the filter and on the output pin of the given - // category and type. (Categories: CAPTURE/PREVIEW/VIDEOPORT/VBI etc. or - // NULL for "don't care". Type: MAJORTYPE_Video/Audio etc or NULL) - // !!! Will some filters have >1 capture pin? ie RGB and MPEG? - // It will also look upstream and downstream of - // the pin for the interface, to find interfaces on renderers, MUXES, TV - // Tuners, etc. - // Call *ppint->Release() when you're done with it - [local] HRESULT FindInterface( - [in] const GUID *pCategory, // can be NULL for all pins - [in] const GUID *pType, // Audio/Video/??? or NULL (don't care) - [in] IBaseFilter *pf, - [in] REFIID riid, - [out] void **ppint); - [call_as(FindInterface)] HRESULT RemoteFindInterface( - [in] const GUID *pCategory, // can be NULL for all pins - [in] const GUID *pType, // Audio/Video/??? or NULL (don't care) - [in] IBaseFilter *pf, - [in] REFIID riid, - [out] IUnknown **ppint); - - // Connects the pin of the given category and type of the source filter to - // the rendering filter, optionally through another filter (compressor?) - // (Type is a Majortype, like Video or Audio) - // For a non-NULL category, it will instantiate and connect additional - // required filters upstream too, like TV Tuners and Crossbars. - // If there is only one output pin on the source, use a NULL category - // and type. You can also have pSource be a pin - HRESULT RenderStream( - [in] const GUID *pCategory, // can be NULL if only one output pin - [in] const GUID *pType, // Major type (Video/Audio/etc) - [in] IUnknown *pSource, // filter or pin - [in] IBaseFilter *pfCompressor, - [in] IBaseFilter *pfRenderer); // can be NULL - - // Sends IAMStreamControl messages to the pin of the desired category, - // (eg. "capture" or "preview") and of the desired type (eg. VIDEO or AUDIO) - // A category MUST be given. If a filter is given, a type must be too. - // REFERENCE_TIME=NULL means NOW - // REFERENCE_TIME=MAX_TIME means never, or cancel previous request - // NULL controls all capture filters in the graph - you will get one - // notification for each filter with a pin of that category found - // returns S_FALSE if stop will be signalled before last sample is - // rendered. - // return a FAILURE code if the filter does not support IAMStreamControl - HRESULT ControlStream( - [in] const GUID *pCategory, - [in] const GUID *pType, // Major type (Video/Audio/etc) - [in] IBaseFilter *pFilter, - [in] REFERENCE_TIME *pstart, - [in] REFERENCE_TIME *pstop, - [in] WORD wStartCookie, // high word reserved - [in] WORD wStopCookie); // high word reserved - - // creates a pre-allocated file of a given size in bytes - HRESULT AllocCapFile( - [in] LPCOLESTR lpstr, - [in] DWORDLONG dwlSize); - - // Copies the valid file data out of the old, possibly huge old capture - // file into a shorter new file. - // Return S_FALSE from your progress function to abort capture, S_OK to - // continue - HRESULT CopyCaptureFile( - [in] LPOLESTR lpwstrOld, - [in] LPOLESTR lpwstrNew, - [in] int fAllowEscAbort, // pressing ESC will abort? - [in] IAMCopyCaptureFileProgress *pCallback); // implement this to - // get progress - // Helper fn to find a certain pin on a filter. - HRESULT FindPin( - [in] IUnknown *pSource, - [in] PIN_DIRECTION pindir, // input or output? - [in] const GUID *pCategory, // what category? (or NULL) - [in] const GUID *pType, // what Major type (or NULL) - [in] BOOL fUnconnected, // must it be unconnected? - [in] int num, // which pin matching this? (0 based) - [out] IPin **ppPin); - } - - enum _AM_RENSDEREXFLAGS { - AM_RENDEREX_RENDERTOEXISTINGRENDERERS = 0x01 // Dont add any renderers - }; - - // - // IFilterGraph2 - // - // New methods on for IFilterGraph and IGraphBuilder will have to go here. - // - - [ - object, - uuid(36b73882-c2c8-11cf-8b46-00805f6cef60), - pointer_default(unique) - ] - interface IFilterGraph2: IGraphBuilder { - - // Add a Moniker source moniker - HRESULT AddSourceFilterForMoniker( - [in] IMoniker *pMoniker, - [in] IBindCtx *pCtx, - [in, unique] LPCWSTR lpcwstrFilterName, - [out] IBaseFilter **ppFilter - ); - - // Specify the type for a reconnect - // This is better than Reconnect as sometime the parties to a - // reconnection can't remember what type they'd agreed (!) - HRESULT ReconnectEx - ( [in] IPin * ppin, // the pin to disconnect and reconnect - [in, unique] const AM_MEDIA_TYPE *pmt // the type to reconnect with - can be NULL - ); - - // Render a pin without adding any new renderers - HRESULT RenderEx( [in] IPin *pPinOut, // Pin to render - [in] DWORD dwFlags, // flags - [in, out] DWORD *pvContext // Unused - set to NULL - ); - - #if 0 - // Method looks for a filter which supports the specified interface. If such - // a filter exists, an AddRef()'ed pointer to the requested interface is placed - // in *ppInterface. - // - // *ppInterface will be NULL on return if such a filter could not be found, and - // the method will return E_NOINTERFACE. - // - // pdwIndex is an internal index that is used for obtaining subsequent interfaces. - // *pdwIndex should be initialized to zero. It is set on return to a value that - // allows the implementation of FindFilterInterface to search for further interfaces - // if called again. If no more such interfaces exist, the method will return E_NOINTERFACE. - // - // If pdwIndex is NULL, FindFilterInterface returns an interface only if there is just - // a single filter in the graph that supports the interface. Otherwise it returns - // E_NOINTERFACE. - // - HRESULT FindFilterInterface( [in] REFIID iid, [out] void ** ppInterface, [in,out] LPDWORD pdwIndex ); - - // Tries to obtain the interface from the filter graph itself. If this fails, - // it attempts to find the unique filter that supports the interface. - // On failure the method will return E_NOINTERFACE. On success, it returns - // S_OK and an AddRef()'ed pointer to the requested interface in *ppInterface. - // - HRESULT FindInterface( [in] REFIID iid, [out] void ** ppInterface ); - - #endif - } - - // - // StreamBuilder - // aka Graph building with constraints - // aka convergent graphs - // aka Closed captioning - - [ - object, - local, - uuid(56a868bf-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) - ] - interface IStreamBuilder : IUnknown { - - // Connect this output pin directly or indirectly, using transform filters - // if necessary to thing(s) that will render it, within this graph - // Move from Initial state to Rendered state. - - HRESULT Render - ( [in] IPin * ppinOut, // the output pin - [in] IGraphBuilder * pGraph // the graph - ); - - // Undo what you did in Render. Return to Initial state. - HRESULT Backout - ( [in] IPin * ppinOut, // the output pin - [in] IGraphBuilder * pGraph // the graph - ); - } - - - // async reader interface - supported by file source filters. Allows - // multiple overlapped reads from different positions - - - [ - object, - uuid(56a868aa-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) - ] - interface IAsyncReader : IUnknown - { - // pass in your preferred allocator and your preferred properties. - // method returns the actual allocator to be used. Call GetProperties - // on returned allocator to learn alignment and prefix etc chosen. - // this allocator will be not be committed and decommitted by - // the async reader, only by the consumer. - // Must call this before calling Request. - HRESULT RequestAllocator( - [in] IMemAllocator* pPreferred, - [in] ALLOCATOR_PROPERTIES* pProps, - [out] IMemAllocator ** ppActual); - - // queue a request for data. - // media sample start and stop times contain the requested absolute - // byte position (start inclusive, stop exclusive). - // may fail if sample not obtained from agreed allocator. - // may fail if start/stop position does not match agreed alignment. - // samples allocated from source pin's allocator may fail - // GetPointer until after returning from WaitForNext. - // Stop position must be aligned - this means it may exceed duration. - // on completion, stop position will be corrected to unaligned - // actual data. - HRESULT Request( - [in] IMediaSample* pSample, - [in] DWORD_PTR dwUser); // user context - - // block until the next sample is completed or the timeout occurs. - // timeout (millisecs) may be 0 or INFINITE. Samples may not - // be delivered in order. If there is a read error of any sort, a - // notification will already have been sent by the source filter, - // and HRESULT will be an error. - // If ppSample is not null, then a Request completed with the result - // code returned. - HRESULT WaitForNext( - [in] DWORD dwTimeout, - [out] IMediaSample** ppSample, // completed sample - [out] DWORD_PTR * pdwUser); // user context - - // sync read of data. Sample passed in must have been acquired from - // the agreed allocator. Start and stop position must be aligned. - // equivalent to a Request/WaitForNext pair, but may avoid the - // need for a thread on the source filter. - HRESULT SyncReadAligned( - [in] IMediaSample* pSample); - - - // sync read. works in stopped state as well as run state. - // need not be aligned. Will fail if read is beyond actual total - // length. - HRESULT SyncRead( - [in] LONGLONG llPosition, // absolute file position - [in] LONG lLength, // nr bytes required - [out, size_is(lLength)] - BYTE* pBuffer); // write data here - - // return total length of stream, and currently available length. - // reads for beyond the available length but within the total length will - // normally succeed but may block for a long period. - HRESULT Length( - [out] LONGLONG* pTotal, - [out] LONGLONG* pAvailable); - - // cause all outstanding reads to return, possibly with a failure code - //(VFW_E_TIMEOUT) indicating they were cancelled. - // Between BeginFlush and EndFlush calls, Request calls will fail and - // WaitForNext calls will always complete immediately. - HRESULT BeginFlush(void); - HRESULT EndFlush(void); - } - - - // interface provided by the filtergraph itself to let other objects - // (especially plug-in distributors, but also apps like graphedt) know - // when the graph has changed. - [ - object, - uuid(56a868ab-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) - ] - interface IGraphVersion : IUnknown - { - // returns the current graph version number - // this is incremented every time there is a change in the - // set of filters in the graph or in their connections - // - // if this is changed since your last enumeration, then re-enumerate - // the graph - HRESULT QueryVersion(LONG* pVersion); - } - - - - - // - // interface describing an object that uses resources. - // - // implement if: you request resources using IResourceManager. You will - // need to pass your implementation of this pointer as an in param. - // - // use if: you are a resource manager who implements IResourceManager - [ - object, - uuid(56a868ad-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) - ] - interface IResourceConsumer : IUnknown - { - // you may acquire the resource specified. - // return values: - // S_OK -- I have successfully acquired it - // S_FALSE -- I will acquire it and call NotifyAcquire afterwards - // VFW_S_NOT_NEEDED: I no longer need the resource - // FAILED(hr)-I tried to acquire it and failed. - - HRESULT - AcquireResource( - [in] LONG idResource); - - - - // Please release the resource. - // return values: - // S_OK -- I have released it (and want it again when available) - // S_FALSE -- I will call NotifyRelease when I have released it - // other something went wrong. - HRESULT - ReleaseResource( - [in] LONG idResource); - } - - - - // interface describing a resource manager that will resolve contention for - // named resources. - // - // implement if: you are a resource manager. The filtergraph will be a resource - // manager, internally delegating to the system wide resource manager - // (when there is one) - // - // use if: you need resources that are limited. Use the resource manager to - // resolve contention by registering the resource with this interface, - // and requesting it from this interface whenever needed. - // - // or use if: you detect focus changes which should affect resource usage. - // Notifying change of focus to the resource manager will cause the resource - // manager to switch contended resources to the objects that have the user's - // focus - [ - object, - uuid(56a868ac-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) - ] - interface IResourceManager : IUnknown - { - // tell the manager how many there are of a resource. - // ok if already registered. will take new count. if new count - // is lower, will de-allocate resources to new count. - // - // You get back a token that will be used in further calls. - // - // Passing a count of 0 will eliminate this resource. There is currently - // no defined way to find the id without knowing the count. - // - HRESULT - Register( - [in] LPCWSTR pName, // this named resource - [in] LONG cResource, // has this many instances - [out] LONG* plToken // token placed here on return - ); - - HRESULT - RegisterGroup( - [in] LPCWSTR pName, // this named resource group - [in] LONG cResource, // has this many resources - [in, size_is(cResource)] - LONG* palTokens, // these are the contained resources - [out] LONG* plToken // group resource id put here on return - ); - - // request the use of a given, registered resource. - // possible return values: - // S_OK == yes you can use it now - // S_FALSE == you will be called back when the resource is available - // other - there is an error. - // - // The priority of this request should be affected by the associated - // focus object -- that is, when SetFocus is called for that focus - // object (or a 'related' object) then my request should be put through. - // - // A filter should pass the filter's IUnknown here. The filtergraph - // will match filters to the filtergraph, and will attempt to trace - // filters to common source filters when checking focus objects. - // The Focus object must be valid for the entire lifetime of the request - // -- until you call CancelRequest or NotifyRelease(id, p, FALSE) - HRESULT - RequestResource( - [in] LONG idResource, - [in] IUnknown* pFocusObject, - [in] IResourceConsumer* pConsumer - ); - - - // notify the resource manager that an acquisition attempt completed. - // Call this method after an AcquireResource method returned - // S_FALSE to indicate asynchronous acquisition. - // HR should be S_OK if the resource was successfully acquired, or a - // failure code if the resource could not be acquired. - HRESULT - NotifyAcquire( - [in] LONG idResource, - [in] IResourceConsumer* pConsumer, - [in] HRESULT hr); - - // Notify the resource manager that you have released a resource. Call - // this in response to a ReleaseResource method, or when you have finished - // with the resource. bStillWant should be TRUE if you still want the - // resource when it is next available, or FALSE if you no longer want - // the resource. - HRESULT - NotifyRelease( - [in] LONG idResource, - [in] IResourceConsumer* pConsumer, - [in] BOOL bStillWant); - - // I don't currently have the resource, and I no longer need it. - HRESULT - CancelRequest( - [in] LONG idResource, - [in] IResourceConsumer* pConsumer); - - // Notify the resource manager that a given object has been given the - // user's focus. In ActiveMovie, this will normally be a video renderer - // whose window has received the focus. The filter graph will switch - // contended resources to (in order): - // requests made with this same focus object - // requests whose focus object shares a common source with this - // requests whose focus object shares a common filter graph - // After calling this, you *must* call ReleaseFocus before the IUnknown - // becomes invalid, unless you can guarantee that another SetFocus - // of a different object is done in the meantime. No addref is held. - // - // The resource manager will hold this pointer until replaced or cancelled, - // and will use it to resolve resource contention. It will call - // QueryInterface for IBaseFilter at least and if found will call methods on - // that interface. - HRESULT - SetFocus( - [in] IUnknown* pFocusObject); - - // Sets the focus to NULL if the current focus object is still - // pFocusObject. Call this when - // the focus object is about to be destroyed to ensure that no-one is - // still referencing the object. - HRESULT - ReleaseFocus( - [in] IUnknown* pFocusObject); - - - - // !!! still need - // -- app override (some form of SetPriority) - // -- enumeration and description of resources - - } - - - // - // Interface representing an object that can be notified about state - // and other changes within a filter graph. The filtergraph will call plug-in - // distributors that expose this optional interface so that they can - // respond to appropriate changes. - // - // Implement if: you are a plug-in distributor (your class id is found - // under HKCR\Interface\\Distributor= for some interface). - // - // Use if: you are the filtergraph. - [ - object, - uuid(56a868af-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) - ] - interface IDistributorNotify : IUnknown - { - // called when graph is entering stop state. Called before - // filters are stopped. - HRESULT Stop(void); - - // called when graph is entering paused state, before filters are - // notified - HRESULT Pause(void); - - // called when graph is entering running state, before filters are - // notified. tStart is the stream-time offset parameter that will be - // given to each filter's IBaseFilter::Run method. - HRESULT Run(REFERENCE_TIME tStart); - - // called when the graph's clock is changing, with the new clock. Addref - // the clock if you hold it beyond this method. Called before - // the filters are notified. - HRESULT SetSyncSource( - [in] IReferenceClock * pClock); - - // called when the set of filters or their connections has changed. - // Called on every AddFilter, RemoveFilter or ConnectDirect (or anything - // that will lead to one of these). - // You don't need to rebuild your list of interesting filters at this point - // but you should release any refcounts you hold on any filters that - // have been removed. - HRESULT NotifyGraphChange(void); - } - - typedef enum { - AM_STREAM_INFO_START_DEFINED = 0x00000001, - AM_STREAM_INFO_STOP_DEFINED = 0x00000002, - AM_STREAM_INFO_DISCARDING = 0x00000004, - AM_STREAM_INFO_STOP_SEND_EXTRA = 0x00000010 - } AM_STREAM_INFO_FLAGS; - - // Stream information - typedef struct { - REFERENCE_TIME tStart; - REFERENCE_TIME tStop; - DWORD dwStartCookie; - DWORD dwStopCookie; - DWORD dwFlags; - } AM_STREAM_INFO; - - // - // IAMStreamControl - // - - [ - object, - uuid(36b73881-c2c8-11cf-8b46-00805f6cef60), - pointer_default(unique) - ] - interface IAMStreamControl : IUnknown - { - // The REFERENCE_TIME pointers may be null, which - // indicates immediately. If the pointer is non-NULL - // and dwCookie is non-zero, then pins should send - // EC_STREAM_CONTROL_STOPPED / EC_STREAM_CONTROL_STARTED - // with an IPin pointer and the cookie, thus allowing - // apps to tie the events back to their requests. - // If either dwCookies is zero, or the pointer is null, - // then no event is sent. - - // If you have a capture pin hooked up to a MUX input pin and they - // both support IAMStreamControl, you'll want the MUX to signal the - // stop so you know the last frame was written out. In order for the - // MUX to know it's finished, the capture pin will have to send one - // extra sample after it was supposed to stop, so the MUX can trigger - // off that. So you would set bSendExtra to TRUE for the capture pin - // Leave it FALSE in all other cases. - - HRESULT StartAt( [in] const REFERENCE_TIME * ptStart, - [in] DWORD dwCookie ); - HRESULT StopAt( [in] const REFERENCE_TIME * ptStop, - [in] BOOL bSendExtra, - [in] DWORD dwCookie ); - HRESULT GetInfo( [out] AM_STREAM_INFO *pInfo); - } - - - - // - // ISeekingPassThru - // - - [ - object, - uuid(36b73883-c2c8-11cf-8b46-00805f6cef60), - pointer_default(unique) - ] - interface ISeekingPassThru : IUnknown - { - HRESULT Init( [in] BOOL bSupportRendering, - [in] IPin *pPin); - } - - - - // - // IAMStreamConfig - pin interface - // - - // A capture filter or compression filter's output pin - // supports this interface - no matter what data type you produce. - - // This interface can be used to set the output format of a pin (as an - // alternative to connecting the pin using a specific media type). - // After setting an output format, the pin will use that format - // the next time it connects to somebody, so you can just Render that - // pin and get a desired format without using Connect(CMediaType) - // Your pin should do that by ONLY OFFERING the media type set in SetFormat - // in its enumeration of media types, and no others. This will ensure that - // that format is indeed used for connection (or at least offer it first). - // An application interested in enumerating accepted mediatypes may have to - // do so BEFORE calling SetFormat. - - // But this interface's GetStreamCaps function can get more information - // about accepted media types than the traditional way of enumerating a pin's - // media types, so it should typically be used instead. - // GetStreamCaps gets information about the kinds of formats allowed... how - // it can stretch and crop, and the frame rate and data rates allowed (for - // video) - - // VIDEO EXAMPLE - // - // GetStreamCaps returns a whole array of {MediaType, Capabilities}. - // Let's say your capture card supports JPEG anywhere between 160x120 and - // 320x240, and also the size 640x480. Also, say it supports RGB24 at - // resolutions between 160x120 and 320x240 but only multiples of 8. You would - // expose these properties by offering a media type of 320 x 240 JPEG - // (if that is your default or preferred size) coupled with - // capabilities saying minimum 160x120 and maximum 320x240 with granularity of - // 1. The next pair you expose is a media type of 640x480 JPEG coupled with - // capabilities of min 640x480 max 640x480. The third pair is media type - // 320x240 RGB24 with capabilities min 160x120 max 320x240 granularity 8. - // In this way you can expose almost every quirk your card might have. - // An application interested in knowing what compression formats you provide - // can get all the pairs and make a list of all the unique sub types of the - // media types. - // - // If a filter's output pin is connected with a media type that has rcSource - // and rcTarget not empty, it means the filter is being asked to stretch the - // rcSource sub-rectangle of its InputSize (the format of the input pin for - // a compressor, and the largest bitmap a capture filter can generate with - // every pixel unique) into the rcTarget sub-rectangle of its output format. - // For instance, if a video compressor has as input 160x120 RGB, and as output - // 320x240 MPEG with an rcSource of (10,10,20,20) and rcTarget of (0,0,100,100) - // this means the compressor is being asked to take a 10x10 piece of the 160x120 - // RGB bitmap, and make it fill the top 100x100 area of a 320x240 bitmap, - // leaving the rest of the 320x240 bitmap untouched. - // A filter does not have to support this and can fail to connect with a - // media type where rcSource and rcTarget are not empty. - // - // Your output pin is connected to the next filter with a certain media - // type (either directly or using the media type passed by SetFormat), - // and you need to look at the AvgBytesPerSecond field of the format - // of that mediatype to see what data rate you are being asked to compress - // the video to, and use that data rate. Using the number of frames per - // second in AvgTimePerFrame, you can figure out how many bytes each frame - // is supposed to be. You can make it smaller, but NEVER EVER make a bigger - // data rate. For a video compressor, your input pin's media type tells you - // the frame rate (use that AvgTimePerFrame). For a capture filter, the - // output media type tells you, so use that AvgTimePerFrame. - // - // The cropping rectangle described below is the same as the rcSrc of the - // output pin's media type. - // - // The output rectangle described below is the same of the width and height - // of the BITMAPINFOHEADER of the media type of the output pin's media type - - - // AUDIO EXAMPLE - // - // This API can return an array of pairs of (media type, capabilities). - // This can be used to expose all kinds of wierd capabilities. Let's say you - // do any PCM frequency from 11,025 to 44,100 at 8 or 16 bit mono or - // stereo, and you also do 48,000 16bit stereo as a special combination. - // You would expose 3 pairs. The first pair would have Min Freq of 11025 and - // Max Freq of 44100, with MaxChannels=2 and MinBits=8 and MaxBits=8 for the - // capabilites structure, and a media type of anything you like, maybe - // 22kHz, 8bit stereo as a default. - // The 2nd pair would be the same except for MinBits=16 and MaxBits=16 in - // the capabilities structure and the media type could be something like - // 44kHz, 16bit stereo as a default (the media type in the pair should always - // be something legal as described by the capabilities structure... the - // structure tells you how you can change the media type to produce other - // legal media types... for instance changing 44kHz to 29010Hz would be legal, - // but changing bits from 16 to 14 would not be.) - // The 3rd pair would be MinFreq=48000 MaxFreq=48000 MaxChannels=2 - // MinBits=16 and MaxBits=16, and the media type would be 48kHz 16bit stereo. - // You can also use the Granularity elements of the structure (like the example - // for video) if you support values that multiples of n, eg. you could say - // minimum bits per sample 8, max 16, and granularity 8 to describe doing - // either 8 or 16 bit all in one structure - // - // If you support non-PCM formats, the media type returned in GetStreamCaps - // can show which non-PCM formats you support (with a default sample rate, - // bit rate and channels) and the capabilities structure going with that - // media type can describe which other sample rates, bit rates and channels - // you support. - - [ - object, - uuid(C6E13340-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMStreamConfig : IUnknown - { - - // this is the structure returned by a VIDEO filter - // - typedef struct _VIDEO_STREAM_CONFIG_CAPS { - - GUID guid; // will be MEDIATYPE_Video - - // the logical or of all the AnalogVideoStandard's supported - // typically zero if not supported - ULONG VideoStandard; - - // the inherent size of the incoming signal... taken from the input - // pin for a compressor, or the largest size a capture filter can - // digitize the signal with every pixel still unique - SIZE InputSize; - - // The input of a compressor filter may have to be connected for these - // to be known - - // smallest rcSrc cropping rect allowed - SIZE MinCroppingSize; - // largest rcSrc cropping rect allowed - SIZE MaxCroppingSize; - // granularity of cropping size - eg only widths a multiple of 4 allowed - int CropGranularityX; - int CropGranularityY; - // alignment of cropping rect - eg rect must start on multiple of 4 - int CropAlignX; - int CropAlignY; - - // The input of a compressor filter may have to be connected for these - // to be known - - // smallest bitmap this pin can produce - SIZE MinOutputSize; - // largest bitmap this pin can produce - SIZE MaxOutputSize; - // granularity of output bitmap size - int OutputGranularityX; - int OutputGranularityY; - // !!! what about alignment of rcTarget inside BIH if different? - - // how well can you stretch in the x direction? 0==not at all - // 1=pixel doubling 2=interpolation(2 taps) 3=better interpolation - // etc. - int StretchTapsX; - int StretchTapsY; - // how well can you shrink in the x direction? 0==not at all - // 1=pixel doubling 2=interpolation(2 taps) 3=better interpolation - // etc. - int ShrinkTapsX; - int ShrinkTapsY; - - // CAPTURE filter only - what frame rates are allowed? - LONGLONG MinFrameInterval; - LONGLONG MaxFrameInterval; - - // what data rates can this pin produce? - LONG MinBitsPerSecond; - LONG MaxBitsPerSecond; - } VIDEO_STREAM_CONFIG_CAPS; - - - // this is the structure returned by an AUDIO filter - // - typedef struct _AUDIO_STREAM_CONFIG_CAPS { - - GUID guid; // will be MEDIATYPE_Audio - ULONG MinimumChannels; - ULONG MaximumChannels; - ULONG ChannelsGranularity; - ULONG MinimumBitsPerSample; - ULONG MaximumBitsPerSample; - ULONG BitsPerSampleGranularity; - ULONG MinimumSampleFrequency; - ULONG MaximumSampleFrequency; - ULONG SampleFrequencyGranularity; - } AUDIO_STREAM_CONFIG_CAPS; - - // - only allowed when pin is not streaming, else the call will FAIL - // - If your output pin is not yet connected, and you can - // connect your output pin with this media type, you should - // succeed the call, and start offering it first (enumerate as format#0) - // from GetMediaType so that this format will be used to connect with - // when you do connect to somebody - // - if your output pin is already connected, and you can provide this - // type, reconnect your pin. If the other pin can't accept it, FAIL - // this call and leave your connection alone. - HRESULT SetFormat( - [in] AM_MEDIA_TYPE *pmt); - - // the format it's connected with, or will connect with - // the application is responsible for calling DeleteMediaType(*ppmt); - HRESULT GetFormat( - [out] AM_MEDIA_TYPE **ppmt); - - // how many different Stream Caps structures are there? - // also, how big is the stream caps structure? - HRESULT GetNumberOfCapabilities( - [out] int *piCount, - [out] int *piSize); // pSCC of GetStreamCaps needs to be this big - - // - gets one of the pairs of {Mediatype, Caps} - // - return S_FALSE if iIndex is too high - // - the application is responsible for calling DeleteMediaType(*ppmt); - // - the first thing pSCC points to is a GUID saying MEDIATYPE_Video - // or MEDIATYPE_Audio, so you can tell if you have a pointer to a - // VIDEO_STREAM_CONFIG_CAPS or an AUDIO_STREAM_CONFIG_CAPS structure - // There could potentially be many more possibilities other than video - // or audio. - HRESULT GetStreamCaps( - [in] int iIndex, // 0 to #caps-1 - [out] AM_MEDIA_TYPE **ppmt, - [out] BYTE *pSCC); - - } - - - - // Interface to control interleaving of different streams in one file - [ - object, - uuid(BEE3D220-157B-11d0-BD23-00A0C911CE86), - pointer_default(unique) - ] - interface IConfigInterleaving : IUnknown - { - import "unknwn.idl"; - - typedef enum - { - // uninterleaved - samples written out in the order they - // arrive - INTERLEAVE_NONE, - - // approximate interleaving with less overhead for video - // capture - INTERLEAVE_CAPTURE, - - // full, precise interleaving. slower. - INTERLEAVE_FULL - - } InterleavingMode; - - HRESULT put_Mode( - [in] InterleavingMode mode - ); - - HRESULT get_Mode( - [out] InterleavingMode *pMode - ); - - HRESULT put_Interleaving( - [in] const REFERENCE_TIME *prtInterleave, - [in] const REFERENCE_TIME *prtPreroll - ); - - HRESULT get_Interleaving( - [out] REFERENCE_TIME *prtInterleave, - [out] REFERENCE_TIME *prtPreroll - ); - } - - // Interface to control the AVI mux - [ - object, - uuid(5ACD6AA0-F482-11ce-8B67-00AA00A3F1A6), - pointer_default(unique) - ] - interface IConfigAviMux : IUnknown - { - import "unknwn.idl"; - - // control whether the AVI mux adjusts the frame rate or audio - // sampling rate for drift when the file is closed. -1 to disables - // this behavior. - HRESULT SetMasterStream([in] LONG iStream); - HRESULT GetMasterStream([out] LONG *pStream); - - // control whether the AVI mux writes out an idx1 index chunk for - // compatibility with older AVI players. - HRESULT SetOutputCompatibilityIndex([in] BOOL fOldIndex); - HRESULT GetOutputCompatibilityIndex([out] BOOL *pfOldIndex); - } - - //--------------------------------------------------------------------- - // CompressionCaps enum - //--------------------------------------------------------------------- - - // This tells you which features of IAMVideoCompression are supported - - // CanCrunch means that it can compress video to a specified data rate - // If so, then the output pin's media type will contain that data rate - // in the format's AvgBytesPerSecond field, and that should be used. - - typedef enum - { - CompressionCaps_CanQuality = 0x01, - CompressionCaps_CanCrunch = 0x02, - CompressionCaps_CanKeyFrame = 0x04, - CompressionCaps_CanBFrame = 0x08, - CompressionCaps_CanWindow = 0x10 - } CompressionCaps; - - - - //--------------------------------------------------------------------- - // IAMVideoCompression interface - // - // Control compression parameters - pin interface - //--------------------------------------------------------------------- - - // This interface is implemented by the output pin of a video capture - // filter or video compressor that provides video data - - // You use this interface to control how video is compressed... how - // many keyframes, etc., and to find information like capabilities and - // the description of this compressor - - [ - object, - uuid(C6E13343-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMVideoCompression : IUnknown - { - // - Only valid if GetInfo's pCapabilities sets - // CompressionCaps_CanKeyFrame - // - KeyFrameRate < 0 means use the compressor default - // - KeyFrames == 0 means only the first frame is a key - HRESULT put_KeyFrameRate ( - [in] long KeyFrameRate); - - HRESULT get_KeyFrameRate ( - [out] long * pKeyFrameRate); - - // - Only valid if GetInfo's pCapabilities sets - // CompressionCaps_CanBFrame - // - If keyframes are every 10, and there are 3 P Frames per key, - // they will be spaced evenly between the key frames and the other - // 6 frames will be B frames - // - PFramesPerKeyFrame < 0 means use the compressor default - HRESULT put_PFramesPerKeyFrame ( - [in] long PFramesPerKeyFrame); - - HRESULT get_PFramesPerKeyFrame ( - [out] long * pPFramesPerKeyFrame); - - // - Only valid if GetInfo's pCapabilities sets - // CompressionCaps_CanQuality - // - Controls image quality - // - If you are compressing to a fixed data rate, a high quality - // means try and use all of the data rate, and a low quality means - // feel free to use much lower than the data rate if you want to. - // - Quality < 0 means use the compressor default - HRESULT put_Quality ( - [in] double Quality); - - HRESULT get_Quality ( - [out] double * pQuality); - - // If you have set a data rate of 100K/sec on a 10fps movie, that - // will normally mean each frame must be <=10K. But a window size - // means every consecutive n frames must average to the data rate, - // but an individual frame (if n > 1) is allowed to exceed the - // frame size suggested by the data rate - HRESULT put_WindowSize ( - [in] DWORDLONG WindowSize); - - HRESULT get_WindowSize ( - [out] DWORDLONG * pWindowSize); - - // - pszVersion might be "Version 2.1.0" - // - pszDescription might be "Danny's awesome video compressor" - // - pcbVersion and pcbDescription will be filled in with the - // required length if they are too short - // - *pCapabilities is a logical OR of some CompressionCaps flags - HRESULT GetInfo( - [out, size_is(*pcbVersion)] WCHAR * pszVersion, - [in,out] int *pcbVersion, - [out, size_is(*pcbDescription)] LPWSTR pszDescription, - [in,out] int *pcbDescription, - [out] long *pDefaultKeyFrameRate, - [out] long *pDefaultPFramesPerKey, - [out] double *pDefaultQuality, - [out] long *pCapabilities //CompressionCaps - ); - - // - this means when this frame number comes along after the graph - // is running, make it a keyframe even if you weren't going to - HRESULT OverrideKeyFrame( - [in] long FrameNumber - ); - - // - Only valid if GetInfo's pCapabilities sets - // CompressionCaps_CanCrunch - // - this means when this frame number comes along after the graph - // is running, make it this many bytes big instead of whatever size - // you were going to make it. - HRESULT OverrideFrameSize( - [in] long FrameNumber, - [in] long Size - ); - - } - - //--------------------------------------------------------------------- - // VfwCaptureDialogs enum - //--------------------------------------------------------------------- - - typedef enum - { - VfwCaptureDialog_Source = 0x01, - VfwCaptureDialog_Format = 0x02, - VfwCaptureDialog_Display = 0x04 - } VfwCaptureDialogs; - - - //--------------------------------------------------------------------- - // VfwCompressDialogs enum - //--------------------------------------------------------------------- - - typedef enum - { - VfwCompressDialog_Config = 0x01, - VfwCompressDialog_About = 0x02, - // returns S_OK if the dialog exists and can be shown, else S_FALSE - VfwCompressDialog_QueryConfig = 0x04, - VfwCompressDialog_QueryAbout = 0x08 - } VfwCompressDialogs; - - - //--------------------------------------------------------------------- - // IAMVfwCaptureDialogs - filter interface - // - // Show a VfW capture driver dialog - SOURCE, FORMAT, or DISPLAY - //--------------------------------------------------------------------- - - // This interface is supported only by Microsoft's Video For Windows - // capture driver Capture Filter. It allows an application to bring up - // one of the 3 driver dialogs that VfW capture drivers have. - - [ - object, - local, - uuid(D8D715A0-6E5E-11D0-B3F0-00AA003761C5), - pointer_default(unique) - ] - interface IAMVfwCaptureDialogs : IUnknown - { - HRESULT HasDialog( - [in] int iDialog // VfwCaptureDialogs enum - ); - - HRESULT ShowDialog( - [in] int iDialog, // VfwCaptureDialogs enum - [in] HWND hwnd - ); - - HRESULT SendDriverMessage( - [in] int iDialog, // VfwCaptureDialogs enum - [in] int uMsg, - [in] long dw1, - [in] long dw2 - ); - - // - iDialog can be one of the VfwCaptureDialogs enums - // - HasDialog returns S_OK if it has the dialog, else S_FALSE - // - ShowDialog can only be called when not streaming or when another - // dialog is not already up - // - SendDriverMessage can send a secret message to the capture driver. - // USE IT AT YOUR OWN RISK! - } - - //--------------------------------------------------------------------- - // IAMVfwCompressDialogs - filter interface - // - // Show a VfW codec driver dialog - CONFIG or ABOUT - //--------------------------------------------------------------------- - - // This interface is supported only by Microsoft's ICM Compressor filter - // (Co). It allows an application to bring up either the Configure or - // About dialogs for the ICM codec that it is currently using. - - [ - object, - local, - uuid(D8D715A3-6E5E-11D0-B3F0-00AA003761C5), - pointer_default(unique) - ] - interface IAMVfwCompressDialogs : IUnknown - { - - // Bring up a dialog for this codec - HRESULT ShowDialog( - [in] int iDialog, // VfwCompressDialogs enum - [in] HWND hwnd - ); - - // Calls ICGetState and gives you the result - HRESULT GetState( - [out, size_is(*pcbState)] LPVOID pState, - [in, out] int *pcbState - ); - - // Calls ICSetState - HRESULT SetState( - [in, size_is(cbState)] LPVOID pState, - [in] int cbState - ); - - // Send a codec specific message - HRESULT SendDriverMessage( - [in] int uMsg, - [in] long dw1, - [in] long dw2 - ); - - // - iDialog can be one of the VfwCaptureDialogs enums - // - ShowDialog can only be called when not streaming or when no other - // dialog is up already - // - an application can call GetState after ShowDialog(CONFIG) to - // see how the compressor was configured and next time the graph - // is used, it can call SetState with the data it saved to return - // the codec to the state configured by the dialog box from last time - // - GetState with a NULL pointer returns the size needed - // - SendDriverMessage can send a secret message to the codec. - // USE IT AT YOUR OWN RISK! - } - - - //--------------------------------------------------------------------- - // IAMDroppedFrames interface - // - // Report status of capture - pin interface - //--------------------------------------------------------------------- - - // A capture filter's video output pin supports this. It reports - // how many frames were not sent (dropped), etc. - - // Every time your filter goes from STOPPED-->PAUSED, you reset all your - // counts to zero. - - // An app may call this all the time while you are capturing to see how - // capturing is going. MAKE SURE you always return as current information - // as possible while you are running. - - // When your capture filter starts running, it starts by sending frame 0, - // then 1, 2, 3, etc. The time stamp of each frame sent should correspond - // to the graph clock's time when the image was digitized. The end time - // is the start time plus the duration of the video frame. - // You should also set the MediaTime of each sample (SetMediaTime) as well. - // This should be the frame number ie (0,1) (1,2) (2,3). - // If a frame is dropped, a downstream filter will be able to tell easily - // not by looking for gaps in the regular time stamps, but by noticing a - // frame number is missing (eg. (1,2) (2,3) (4,5) (5,6) means frame 3 - // was dropped. - - // Using the info provided by this interface, an application can figure out - // the number of frames dropped, the frame rate achieved (the length of - // time the graph was running divided by the number of frames not dropped), - // and the data rate acheived (the length of time the graph was running - // divided by the average frame size). - - // If your filter is running, then paused, and then run again, you need - // to continue to deliver frames as if it was never paused. The first - // frame after the second RUN cannot be time stamped earlier than the last - // frame sent before the pause. - - // Your filter must always increment the MediaTime of each sample sent. - // Never send the same frame # twice, and never go back in time. The - // regular time stamp of a sample can also never go back in time. - - [ - object, - uuid(C6E13344-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMDroppedFrames : IUnknown - { - // Get the number of dropped frames - HRESULT GetNumDropped( - [out] long * plDropped - - ); - - //Get the number of non-dropped frames - HRESULT GetNumNotDropped( - [out] long * plNotDropped - - ); - - // - plArray points to an array of lSize longs. The filter will - // fill it with the frame number of the first lSize frames dropped. - // A filter may not have bothered to remember as many as you asked - // for, so it will set *plNumCopied to the number of frames it filled - // in. - HRESULT GetDroppedInfo( - [in] long lSize, - [out] long * plArray, - [out] long * plNumCopied - ); - - // - This is the average size of the frames it didn't drop (in bytes) - HRESULT GetAverageFrameSize( - [out] long * plAverageSize - - ); - - } - - - - cpp_quote("#define AMF_AUTOMATICGAIN -1.0") - - //--------------------------------------------------------------------- - // IAMAudioInputMixer interface - // - // Sets the recording levels, pan and EQ for the audio card inputs - //--------------------------------------------------------------------- - - // This interface is implemented by each input pin of an audio capture - // filter, to tell it what level, panning, and EQ to use for each input. - // The name of each pin will reflect the type of input, eg. "Line input 1" - // or "Mic". An application uses the pin names to decide how it wants to - // set the recording levels - - // This interface can also be supported by the audio capture filter itself - // to control to overall record level and panning after the mix - - [ - object, - uuid(54C39221-8380-11d0-B3F0-00AA003761C5), - pointer_default(unique) - ] - interface IAMAudioInputMixer : IUnknown - { - // This interface is only supported by the input pins, not the filter - // If disabled, this channel will not be mixed in as part of the - // recorded signal. - HRESULT put_Enable ( - [in] BOOL fEnable); // TRUE=enable FALSE=disable - - //Is this channel enabled? - HRESULT get_Enable ( - [out] BOOL *pfEnable); - - // When set to mono mode, making a stereo recording of this channel - // will have both channels contain the same data... a mixture of the - // left and right signals - HRESULT put_Mono ( - [in] BOOL fMono); // TRUE=mono FALSE=multi channel - - //all channels combined into a mono signal? - HRESULT get_Mono ( - [out] BOOL *pfMono); - - // !!! WILL CARDS BE ABLE TO BOOST THE GAIN? - //Set the record level for this channel - HRESULT put_MixLevel ( - [in] double Level); // 0 = off, 1 = full (unity?) volume - // AMF_AUTOMATICGAIN, if supported, - // means automatic - - //Get the record level for this channel - HRESULT get_MixLevel ( - [out] double *pLevel); - - // For instance, when panned full left, and you make a stereo recording - // of this channel, you will record a silent right channel. - HRESULT put_Pan ( - [in] double Pan); // -1 = full left, 0 = centre, 1 = right - - //Get the pan for this channel - HRESULT get_Pan ( - [out] double *pPan); - - // Boosts the bass of low volume signals before they are recorded - // to compensate for the fact that your ear has trouble hearing quiet - // bass sounds - HRESULT put_Loudness ( - [in] BOOL fLoudness);// TRUE=on FALSE=off - - HRESULT get_Loudness ( - [out] BOOL *pfLoudness); - - // boosts or cuts the treble of the signal before it's recorded by - // a certain amount of dB - HRESULT put_Treble ( - [in] double Treble); // gain in dB (-ve = attenuate) - - //Get the treble EQ for this channel - HRESULT get_Treble ( - [out] double *pTreble); - - // This is the maximum value allowed in put_Treble. ie 6.0 means - // any value between -6.0 and 6.0 is allowed - HRESULT get_TrebleRange ( - [out] double *pRange); // largest value allowed - - // boosts or cuts the bass of the signal before it's recorded by - // a certain amount of dB - HRESULT put_Bass ( - [in] double Bass); // gain in dB (-ve = attenuate) - - // Get the bass EQ for this channel - HRESULT get_Bass ( - [out] double *pBass); - - // This is the maximum value allowed in put_Bass. ie 6.0 means - // any value between -6.0 and 6.0 is allowed - HRESULT get_BassRange ( - [out] double *pRange); // largest value allowed - - } - - - //--------------------------------------------------------------------- - // IAMBufferNegotiation interface - // - // Tells a pin what kinds of buffers to use when connected - //--------------------------------------------------------------------- - - // This interface can be implemented by any pin that will connect to - // another pin using IMemInputPin. All capture filters should support - // this interface. - - // SuggestAllocatorProperties is a way for an application to get - // in on the buffer negotiation process for a pin. This pin will use - // the numbers given to it by the application as its request to the - // allocator. An application can use a negative number for any element - // in the ALLOCATOR_PROPERTIES to mean "don't care". An application must - // call this function before the pin is connected, or it will be too late - // To ensure that an application gets what it wants, it would be wise to - // call this method on both pins being connected together, so the other - // pin doesn't overrule the application's request. - - // GetAllocatorProperties can only be called after a pin is connected and - // it returns the properties of the current allocator being used - - [ - object, - uuid(56ED71A0-AF5F-11D0-B3F0-00AA003761C5), - pointer_default(unique) - ] - interface IAMBufferNegotiation : IUnknown - { - HRESULT SuggestAllocatorProperties ( - [in] const ALLOCATOR_PROPERTIES *pprop); - - HRESULT GetAllocatorProperties ( - [out] ALLOCATOR_PROPERTIES *pprop); - - } - - - //--------------------------------------------------------------------- - // AnalogVideoStandard enum - //--------------------------------------------------------------------- - - typedef enum tagAnalogVideoStandard - { - AnalogVideo_None = 0x00000000, // This is a digital sensor - AnalogVideo_NTSC_M = 0x00000001, // 75 IRE Setup - AnalogVideo_NTSC_M_J = 0x00000002, // Japan, 0 IRE Setup - AnalogVideo_NTSC_433 = 0x00000004, - - AnalogVideo_PAL_B = 0x00000010, - AnalogVideo_PAL_D = 0x00000020, - AnalogVideo_PAL_G = 0x00000040, - AnalogVideo_PAL_H = 0x00000080, - AnalogVideo_PAL_I = 0x00000100, - AnalogVideo_PAL_M = 0x00000200, - AnalogVideo_PAL_N = 0x00000400, - - AnalogVideo_PAL_60 = 0x00000800, - - AnalogVideo_SECAM_B = 0x00001000, - AnalogVideo_SECAM_D = 0x00002000, - AnalogVideo_SECAM_G = 0x00004000, - AnalogVideo_SECAM_H = 0x00008000, - AnalogVideo_SECAM_K = 0x00010000, - AnalogVideo_SECAM_K1 = 0x00020000, - AnalogVideo_SECAM_L = 0x00040000, - AnalogVideo_SECAM_L1 = 0x00080000, - - AnalogVideo_PAL_N_COMBO // Argentina - = 0x00100000 - } AnalogVideoStandard; - - cpp_quote("#define AnalogVideo_NTSC_Mask 0x00000007") - cpp_quote("#define AnalogVideo_PAL_Mask 0x00100FF0") - cpp_quote("#define AnalogVideo_SECAM_Mask 0x000FF000") - - - //--------------------------------------------------------------------- - // TunerInputType enum - //--------------------------------------------------------------------- - - typedef enum tagTunerInputType - { - TunerInputCable, - TunerInputAntenna - } TunerInputType; - - //--------------------------------------------------------------------- - // VideoCopyProtectionType enum - //--------------------------------------------------------------------- - - typedef enum - { - VideoCopyProtectionMacrovisionBasic, - VideoCopyProtectionMacrovisionCBI - } VideoCopyProtectionType; - - //--------------------------------------------------------------------- - // PhysicalConnectorType enum - //--------------------------------------------------------------------- - - typedef enum tagPhysicalConnectorType - { - PhysConn_Video_Tuner = 1, - PhysConn_Video_Composite, - PhysConn_Video_SVideo, - PhysConn_Video_RGB, - PhysConn_Video_YRYBY, - PhysConn_Video_SerialDigital, - PhysConn_Video_ParallelDigital, - PhysConn_Video_SCSI, - PhysConn_Video_AUX, - PhysConn_Video_1394, - PhysConn_Video_USB, - PhysConn_Video_VideoDecoder, - PhysConn_Video_VideoEncoder, - PhysConn_Video_SCART, - PhysConn_Video_Black, - - - PhysConn_Audio_Tuner = 0x1000, - PhysConn_Audio_Line, - PhysConn_Audio_Mic, - PhysConn_Audio_AESDigital, - PhysConn_Audio_SPDIFDigital, - PhysConn_Audio_SCSI, - PhysConn_Audio_AUX, - PhysConn_Audio_1394, - PhysConn_Audio_USB, - PhysConn_Audio_AudioDecoder, - } PhysicalConnectorType; - - - - - //--------------------------------------------------------------------- - // IAMAnalogVideoDecoder interface - //--------------------------------------------------------------------- - - [ - object, - uuid(C6E13350-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMAnalogVideoDecoder : IUnknown - { - - //Gets the supported analog video standards (NTSC/M, PAL/B, SECAM/K1... - HRESULT get_AvailableTVFormats( - [out] long *lAnalogVideoStandard - ); - - //Sets or gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ... - HRESULT put_TVFormat( - [in] long lAnalogVideoStandard - ); - - // Sets or gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ... - HRESULT get_TVFormat( - [out] long * plAnalogVideoStandard - ); - - // True if horizontal sync is locked - HRESULT get_HorizontalLocked ( - [out] long * plLocked); - - // True if connected to a VCR (changes PLL timing) - HRESULT put_VCRHorizontalLocking ( - [in] long lVCRHorizontalLocking); - - HRESULT get_VCRHorizontalLocking ( - [out] long * plVCRHorizontalLocking); - - // Returns the number of lines in the video signal")] - HRESULT get_NumberOfLines ( - [out] long *plNumberOfLines); - - // Enables or disables the output bus - HRESULT put_OutputEnable ( - [in] long lOutputEnable); - - HRESULT get_OutputEnable ( - [out] long *plOutputEnable); - - } - - - //--------------------------------------------------------------------- - // VideoProcAmp Property enum - //--------------------------------------------------------------------- - - typedef enum tagVideoProcAmpProperty - { - VideoProcAmp_Brightness, - VideoProcAmp_Contrast, - VideoProcAmp_Hue, - VideoProcAmp_Saturation, - VideoProcAmp_Sharpness, - VideoProcAmp_Gamma, - VideoProcAmp_ColorEnable, - VideoProcAmp_WhiteBalance, - VideoProcAmp_BacklightCompensation, - VideoProcAmp_Gain - } VideoProcAmpProperty; - - //--------------------------------------------------------------------- - // VideoProcAmp Flags enum - //--------------------------------------------------------------------- - - typedef enum tagVideoProcAmpFlags - { - VideoProcAmp_Flags_Auto = 0x0001, - VideoProcAmp_Flags_Manual = 0x0002 - } VideoProcAmpFlags; - - //--------------------------------------------------------------------- - // IAMVideoProcAmp interface - // - // Adjusts video quality in either the analog or digital domain. - // - //--------------------------------------------------------------------- - - [ - object, - uuid(C6E13360-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMVideoProcAmp : IUnknown - { - // Returns min, max, step size, and default values - HRESULT GetRange( - [in] long Property, // Which property to query - [out] long * pMin, // Range minimum - [out] long * pMax, // Range maxumum - [out] long * pSteppingDelta,// Step size - [out] long * pDefault, // Default value - [out] long * pCapsFlags // VideoProcAmpFlags - - ); - - // Set a VideoProcAmp property - HRESULT Set( - [in] long Property, // VideoProcAmpProperty - [in] long lValue, // Value to set - [in] long Flags // VideoProcAmp_Flags_* - - ); - - // Get a VideoProcAmp property - HRESULT Get( - [in] long Property, // VideoProcAmpProperty - [out] long * lValue, // Current value - [out] long * Flags // VideoProcAmp_Flags_* - ); - } - - - //--------------------------------------------------------------------- - // CameraControl Property enum - //--------------------------------------------------------------------- - - typedef enum tagCameraControlProperty - { - CameraControl_Pan, - CameraControl_Tilt, - CameraControl_Roll, - CameraControl_Zoom, - CameraControl_Exposure, - CameraControl_Iris, - CameraControl_Focus - } CameraControlProperty; - - //--------------------------------------------------------------------- - // CameraControl Flags enum - //--------------------------------------------------------------------- - - typedef enum tagCameraControlFlags - { - CameraControl_Flags_Auto = 0x0001, - CameraControl_Flags_Manual = 0x0002 - } CameraControlFlags; - - //--------------------------------------------------------------------- - // IAMCameraControl interface - // - // Control of local or remote cameras - //--------------------------------------------------------------------- - - [ - object, - uuid(C6E13370-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMCameraControl : IUnknown - { - // Returns min, max, step size, and default values - HRESULT GetRange( - [in] long Property, // Which property to query - [out] long * pMin, // Range minimum - [out] long * pMax, // Range maxumum - [out] long * pSteppingDelta,// Step size - [out] long * pDefault, // Default value - [out] long * pCapsFlags // CamaeraControlFlags - - ); - - // Set a CameraControl property - HRESULT Set( - [in] long Property, // CameraControlProperty - [in] long lValue, // Value to set - [in] long Flags // CameraControl_Flags_* - - ); - - // Get a CameraControl property - HRESULT Get( - [in] long Property, // CameraControlProperty - [out] long * lValue, // Current value - [out] long * Flags // CameraControl_Flags_* - ); - } - - //--------------------------------------------------------------------- - // VideoControl Flags enum - //--------------------------------------------------------------------- - - typedef enum tagVideoControlFlags - { - VideoControlFlag_FlipHorizontal = 0x0001, - VideoControlFlag_FlipVertical = 0x0002, - VideoControlFlag_ExternalTriggerEnable = 0x0004, - VideoControlFlag_Trigger = 0x0008 - - } VideoControlFlags; - - //--------------------------------------------------------------------- - // IAMVideoControl interface - // - // Control of horizontal & vertical flip, external trigger, - // and listing available frame rates - //--------------------------------------------------------------------- - - [ - object, - uuid(6a2e0670-28e4-11d0-a18c-00a0c9118956), - pointer_default(unique) - ] - interface IAMVideoControl : IUnknown - { - // What can the underlying hardware do? - HRESULT GetCaps( - [in] IPin * pPin, // the pin to query or control - [out] long * pCapsFlags // VideoControlFlag_* - - ); - - // Set the mode of operation - HRESULT SetMode( - [in] IPin * pPin, // the pin to query or control - [in] long Mode // VideoControlFlag_* - - ); - - // Get the mode of operation - HRESULT GetMode( - [in] IPin * pPin, // the pin to query or control - [out] long * Mode // VideoControlFlag_* - ); - - // Get actual frame rate info for USB and 1394 - // This is only available when streaming - HRESULT GetCurrentActualFrameRate( - [in] IPin * pPin, // the pin to query or control - [out] LONGLONG * ActualFrameRate // 100 nS units - ); - - // Get max available frame rate info for USB and 1394 - // Returns the max frame rate currently available based on bus bandwidth usage - HRESULT GetMaxAvailableFrameRate( - [in] IPin * pPin, // the pin to query or control - [in] long iIndex, // 0 to IAMStreamConfig->GetNumberOfCapabilities-1 - [in] SIZE Dimensions, // width and height - [out] LONGLONG * MaxAvailableFrameRate // 100 nS units - ); - - // Get List of available frame rates - HRESULT GetFrameRateList( - [in] IPin * pPin, // the pin to query or control - [in] long iIndex, // 0 to IAMStreamConfig->GetNumberOfCapabilities-1 - [in] SIZE Dimensions, // width and height - [out] long * ListSize, // Number of elements in the list - [out] LONGLONG ** FrameRates // Array of framerates in 100 nS units - // or NULL to just get ListSize - ); - - } - - - //--------------------------------------------------------------------- - // IAMCrossbar interface - // - // Controls a routing matrix for analog or digital video or audio - //--------------------------------------------------------------------- - - [ - object, - uuid(C6E13380-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMCrossbar : IUnknown - { - - // How many pins are there? - HRESULT get_PinCounts( - [out] long * OutputPinCount, // count of output pins - [out] long * InputPinCount); // count of input pins - - // True if routing is possible - HRESULT CanRoute ( - [in] long OutputPinIndex, // the output pin - [in] long InputPinIndex); // the input pin - - // Routes an input pin to an output pin - HRESULT Route ( - [in] long OutputPinIndex, // the output pin - [in] long InputPinIndex); // the input pin - - // Returns the input pin connected to a given output pin - HRESULT get_IsRoutedTo ( - [in] long OutputPinIndex, // the output pin - [out] long * InputPinIndex); // the connected input pin - - // Returns a pin which is related to a given pin - // (ie. this audio pin is related to a video pin) - HRESULT get_CrossbarPinInfo ( - [in] BOOL IsInputPin, // TRUE for input pins - [in] long PinIndex, // a pin - [out] long * PinIndexRelated, // Index of related pin - [out] long * PhysicalType); // Physical type of pin - - } - - - //--------------------------------------------------------------------- - // IAMTuner interface - // - // base tuner device - //--------------------------------------------------------------------- - - // predefined subchannel values - typedef enum tagAMTunerSubChannel - { - AMTUNER_SUBCHAN_NO_TUNE = -2, // don't tune - AMTUNER_SUBCHAN_DEFAULT = -1 // use default sub chan - } AMTunerSubChannel; - - // predefined signal strength values - typedef enum tagAMTunerSignalStrength - { - AMTUNER_HASNOSIGNALSTRENGTH = -1, // cannot indicate signal strength - AMTUNER_NOSIGNAL = 0, // no signal available - AMTUNER_SIGNALPRESENT = 1 // signal present - } AMTunerSignalStrength; - - // specifies the mode of operation of the tuner - typedef enum tagAMTunerModeType - { - AMTUNER_MODE_DEFAULT = 0x0000, // default tuner mode - AMTUNER_MODE_TV = 0x0001, // tv - AMTUNER_MODE_FM_RADIO = 0x0002, // fm radio - AMTUNER_MODE_AM_RADIO = 0x0004, // am radio - AMTUNER_MODE_DSS = 0x0008, // dss - } AMTunerModeType; - - // Events reported by IAMTunerNotification - typedef enum tagAMTunerEventType{ - AMTUNER_EVENT_CHANGED = 0x0001, // status changed - } AMTunerEventType; - - interface IAMTunerNotification; - - [ - object, - uuid(211A8761-03AC-11d1-8D13-00AA00BD8339), - pointer_default(unique) - ] - interface IAMTuner : IUnknown - { - // Sets and gets the Channel - HRESULT put_Channel( - [in] long lChannel, - [in] long lVideoSubChannel, - [in] long lAudioSubChannel - ); - HRESULT get_Channel( - [out] long *plChannel, - [out] long *plVideoSubChannel, - [out] long *plAudioSubChannel - ); - - // Gets the minimum and maximum channel available - HRESULT ChannelMinMax( - [out] long *lChannelMin, - [out] long *lChannelMax - ); - - // CountryCode is the same as the international - // long distance telephone dialing prefix - - HRESULT put_CountryCode( - [in] long lCountryCode - ); - HRESULT get_CountryCode( - [out] long *plCountryCode - ); - - HRESULT put_TuningSpace( - [in] long lTuningSpace - ); - HRESULT get_TuningSpace( - [out] long *plTuningSpace - ); - - [local] HRESULT Logon( - [in] HANDLE hCurrentUser - ); - HRESULT Logout(); - - // Signal status for current channel - // signal strength == TUNER_NOSIGNAL, or strength value - HRESULT SignalPresent( - [out] long * plSignalStrength // AMTunerSignalStrength - ); - - // allow multifunction tuner to be switch between modes - HRESULT put_Mode( - [in] AMTunerModeType lMode // AMTunerModeType - ); - HRESULT get_Mode( - [out] AMTunerModeType *plMode // AMTunerModeType - ); - - // retrieve a bitmask of the possible modes - HRESULT GetAvailableModes( - [out] long *plModes // AMTunerModeType - ); - - // allow IAMTuner clients to receive event notification - HRESULT RegisterNotificationCallBack( - [in] IAMTunerNotification *pNotify, - [in] long lEvents // bitmask from AMTunerEventType enumeration - ); - HRESULT UnRegisterNotificationCallBack( - [in] IAMTunerNotification *pNotify - ); - } - - //--------------------------------------------------------------------- - // IAMTunerNotification interface - // - // Provided to IAMTuner if notification callbacks are desired - //--------------------------------------------------------------------- - - [ - object, - uuid(211A8760-03AC-11d1-8D13-00AA00BD8339), - pointer_default(unique) - ] - interface IAMTunerNotification : IUnknown - { - HRESULT OnEvent([in] AMTunerEventType Event); - } - - - //--------------------------------------------------------------------- - // IAMTVTuner interface - // - // Controls an analog TV tuner device - //--------------------------------------------------------------------- - - [ - object, - uuid(211A8766-03AC-11d1-8D13-00AA00BD8339), - pointer_default(unique) - ] - interface IAMTVTuner : IAMTuner - { - // Gets the supported analog video standards (NTSC/M, PAL/B, SECAM/K1, ... - HRESULT get_AvailableTVFormats( - [out] long *lAnalogVideoStandard - ); - - // Gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ...) - HRESULT get_TVFormat( - [out] long * plAnalogVideoStandard - ); - - // Scans for a signal on a given channel - // NOTE: this is equivalent to put_Channel(), SignalStrength() - HRESULT AutoTune( - [in] long lChannel, - [out] long * plFoundSignal - ); - - // Saves the fine tuning information for all channels")] - HRESULT StoreAutoTune(); - - // The number of TV sources plugged into the tuner - HRESULT get_NumInputConnections( - [out] long * plNumInputConnections - ); - - // Sets or gets the tuner input type (Cable or Antenna) - HRESULT put_InputType( - [in] long lIndex, - [in] TunerInputType InputType - ); - HRESULT get_InputType( - [in] long lIndex, - [out] TunerInputType * pInputType - ); - - // Sets or gets the tuner input - HRESULT put_ConnectInput( - [in] long lIndex - ); - HRESULT get_ConnectInput( - [out] long *plIndex - ); - - // Gets the video and audio carrier frequencies - HRESULT get_VideoFrequency( - [out] long *lFreq - ); - HRESULT get_AudioFrequency( - [out] long *lFreq - ); - } - - - //--------------------------------------------------------------------- - // IBPCSatelliteTuner interface - // - // An interface supporting Satellite tuning-related functions - //--------------------------------------------------------------------- - [ - object, - local, - uuid(211A8765-03AC-11d1-8D13-00AA00BD8339), - pointer_default(unique) - ] - interface IBPCSatelliteTuner : IAMTuner - { - HRESULT get_DefaultSubChannelTypes( - [out] long *plDefaultVideoType, // Provider-specific service type - [out] long *plDefaultAudioType // Provider-specific service type - ); - - HRESULT put_DefaultSubChannelTypes( - [in] long lDefaultVideoType, // Provider-specific service type - [in] long lDefaultAudioType // Provider-specific service type - ); - - HRESULT IsTapingPermitted(); // S_OK yes, S_FALSE no - } - - - - //--------------------------------------------------------------------- - // IAMTVAudio interface - // - // TV Audio control - //--------------------------------------------------------------------- - - typedef enum tagTVAudioMode - { - AMTVAUDIO_MODE_MONO = 0x0001, // Mono - AMTVAUDIO_MODE_STEREO = 0x0002, // Stereo - AMTVAUDIO_MODE_LANG_A = 0x0010, // Primary language - AMTVAUDIO_MODE_LANG_B = 0x0020, // 2nd avail language - AMTVAUDIO_MODE_LANG_C = 0x0040, // 3rd avail language - } TVAudioMode; - - // Events reported by IAMTVAudioNotification - typedef enum tagAMTVAudioEventType - { - AMTVAUDIO_EVENT_CHANGED = 0x0001, // mode changed - } AMTVAudioEventType; - - interface IAMTVAudioNotification; - - [ - object, - local, - uuid(83EC1C30-23D1-11d1-99E6-00A0C9560266), - pointer_default(unique) - ] - interface IAMTVAudio : IUnknown - { - // retrieve a bitmask of the formats available in the hardware - HRESULT GetHardwareSupportedTVAudioModes( - [out] long *plModes // TVAudioMode - ); - - // retrieve a bitmask of the possible modes - HRESULT GetAvailableTVAudioModes( - [out] long *plModes // TVAudioMode - ); - - HRESULT get_TVAudioMode( - [out] long *plMode // TVAudioMode - ); - HRESULT put_TVAudioMode( - [in] long lMode // TVAudioMode - ); - - // allow IAMTVAudio clients to receive event notification - HRESULT RegisterNotificationCallBack( - [in] IAMTunerNotification *pNotify, - [in] long lEvents // bitmask from AMTVAudioEventType enumeration - ); - HRESULT UnRegisterNotificationCallBack( - IAMTunerNotification *pNotify - ); - } - - //--------------------------------------------------------------------- - // IAMTVAudioNotification interface - // - // Provided to IAMTVAudio clients if notification callbacks are desired - //--------------------------------------------------------------------- - - [ - object, - local, - uuid(83EC1C33-23D1-11d1-99E6-00A0C9560266), - pointer_default(unique) - ] - interface IAMTVAudioNotification : IUnknown - { - HRESULT OnEvent([in] AMTVAudioEventType Event); - } - - - - - //--------------------------------------------------------------------- - // IAMAnalogVideoEncoder interface - //--------------------------------------------------------------------- - - [ - object, - uuid(C6E133B0-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMAnalogVideoEncoder : IUnknown - { - // Gets the supported analog video standards (NTSC/M, PAL/B, SECAM/K1, ...) - HRESULT get_AvailableTVFormats( - [out] long *lAnalogVideoStandard - ); - - // Sets or gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ...) - HRESULT put_TVFormat( - [in] long lAnalogVideoStandard - ); - - HRESULT get_TVFormat( - [out] long * plAnalogVideoStandard - ); - - // Sets or gets the copy protection - HRESULT put_CopyProtection ( - [in] long lVideoCopyProtection); // VideoCopyProtectionType - - HRESULT get_CopyProtection ( - [out] long *lVideoCopyProtection); // VideoCopyProtectionType - - - // Enables and disables close captioning - HRESULT put_CCEnable ( - [in] long lCCEnable); - - HRESULT get_CCEnable ( - [out] long *lCCEnable); - - } - - // used by IKsPropertySet set AMPROPSETID_Pin - typedef enum { - AMPROPERTY_PIN_CATEGORY, - AMPROPERTY_PIN_MEDIUM - } AMPROPERTY_PIN; - - //--------------------------------------------------------------------- - // IKsPropertySet interface - // - // Sets or gets a property identified by a property set GUID and a - // property ID. - // - // Return codes for all 3 methods: - // E_PROP_SET_UNSUPPORTED the property set is not supported - // E_PROP_ID_UNSUPPORTED the property ID is not supported - // for the specified property set - //--------------------------------------------------------------------- - - cpp_quote("#ifndef _IKsPropertySet_") - cpp_quote("#define _IKsPropertySet_") - - //--------------------------------------------------------------------- - // #defines for IKsPropertySet::QuerySupported return result in pTypeSupport - //--------------------------------------------------------------------- - - cpp_quote("#define KSPROPERTY_SUPPORT_GET 1") - cpp_quote("#define KSPROPERTY_SUPPORT_SET 2") - - - [ - object, - uuid(31EFAC30-515C-11d0-A9AA-00AA0061BE93), - pointer_default(unique) - ] - interface IKsPropertySet : IUnknown - { - [local] HRESULT Set( - [in] REFGUID guidPropSet, - [in] DWORD dwPropID, - [in, size_is(cbInstanceData)] LPVOID pInstanceData, - [in] DWORD cbInstanceData, - [in, size_is(cbPropData)] LPVOID pPropData, - [in] DWORD cbPropData); - - [call_as(Set)] HRESULT RemoteSet( - [in] REFGUID guidPropSet, - [in] DWORD dwPropID, - [in, size_is(cbInstanceData)] byte * pInstanceData, - [in] DWORD cbInstanceData, - [in, size_is(cbPropData)] byte * pPropData, - [in] DWORD cbPropData); - - // To get a property, the caller allocates a buffer which the called - // function fills in. To determine necessary buffer size, call Get with - // pPropData=NULL and cbPropData=0. - [local] HRESULT Get( - [in] REFGUID guidPropSet, - [in] DWORD dwPropID, - [in, size_is(cbInstanceData)] LPVOID pInstanceData, - [in] DWORD cbInstanceData, - [out, size_is(cbPropData)] LPVOID pPropData, - [in] DWORD cbPropData, - [out] DWORD * pcbReturned); - - [call_as(Get)] HRESULT RemoteGet( - [in] REFGUID guidPropSet, - [in] DWORD dwPropID, - [in, size_is(cbInstanceData)] byte * pInstanceData, - [in] DWORD cbInstanceData, - [out, size_is(cbPropData)] byte * pPropData, - [in] DWORD cbPropData, - [out] DWORD * pcbReturned); - - // QuerySupported must either return E_NOTIMPL or correctly indicate - // if getting or setting the property set and property is supported. - // S_OK indicates the property set and property ID combination is - HRESULT QuerySupported( - [in] REFGUID guidPropSet, - [in] DWORD dwPropID, - [out] DWORD *pTypeSupport); - } - cpp_quote("#endif // _IKsPropertySet_") - - [ - object, - uuid(6025A880-C0D5-11d0-BD4E-00A0C911CE86), - pointer_default(unique) - ] - interface IMediaPropertyBag : IPropertyBag - { - import "ocidl.idl"; - - typedef IMediaPropertyBag *LPMEDIAPROPERTYBAG; - - // return the i'th element in the property bag - HRESULT EnumProperty( - [in] ULONG iProperty, - [in, out] VARIANT * pvarPropertyName, - [in, out] VARIANT * pvarPropertyValue - ); - - } - - - [ - object, - uuid(5738E040-B67F-11d0-BD4D-00A0C911CE86), - pointer_default(unique) - ] - interface IPersistMediaPropertyBag : IPersist - { - import "ocidl.idl"; - import "unknwn.idl"; - - HRESULT InitNew( - void - ); - - HRESULT Load( - [in] IMediaPropertyBag * pPropBag, - [in] IErrorLog * pErrorLog - ); - - HRESULT Save( - [in] IMediaPropertyBag * pPropBag, - [in] BOOL fClearDirty, - [in] BOOL fSaveAllProperties - ); - - - typedef IPersistMediaPropertyBag * LPPERSISTMEDIAPROPERTYBAG; - } - - - //--------------------------------------------------------------------- - // - // Defines IAMPhysicalPinInfo Interface - // - // Returns an enum and string that describes an input pin's physical type. - // - // Implement if: you have physical input pins such as video or audio (like - // on a video capture card or a VCR) - // - // Use if: you want to communicate to a user available physical input pins - // and allow them to select the active one if there is more than one - //--------------------------------------------------------------------- - - - [ - object, - uuid(F938C991-3029-11cf-8C44-00AA006B6814), - pointer_default(unique) - ] - interface IAMPhysicalPinInfo : IUnknown { - - // Returns VFW_E_NO_ACCEPTABLE_TYPES if not a physical pin - HRESULT GetPhysicalType( - [out] long *pType, // the enum representing the Physical Type - [out] LPOLESTR *ppszType // a friendly name - ); - } - typedef IAMPhysicalPinInfo *PAMPHYSICALPININFO; - - //--------------------------------------------------------------------- - // Defines IAMExtDevice Interface - // - // Base interface for external professional devices - // - // Implement if: the filter controls an external device such as a VCR, - // timecode reader/generator, etc. The intent is to build a object from - // this implementation plus another that specifically describes the device, - // such as IAMExtTransport. - // - // Use if: you want to control and external device such as a VCR - // - // See edevdefs.h for the enumerated parameter list - //--------------------------------------------------------------------- - [ - object, - uuid(B5730A90-1A2C-11cf-8C23-00AA006B6814), - pointer_default(unique) - ] - interface IAMExtDevice : IUnknown - { - // General device capabilities property. See edevdefs.h for supported - // values - HRESULT GetCapability( - [in] long Capability, // identify the property - [out] long *pValue, // return value - [out] double *pdblValue // return value - ); - - // Get external device identification string. Usually the model # - // of the device - HRESULT get_ExternalDeviceID( - [out] LPOLESTR *ppszData // ID string - ); - - HRESULT get_ExternalDeviceVersion( - [out] LPOLESTR *ppszData // revision string - ); - - // Controls the external device's power mode - HRESULT put_DevicePower([in] long PowerMode - ); - HRESULT get_DevicePower([out] long *pPowerMode - ); - - // Some devices need to be reset in some way, i.e., rewinding a VCR - // to the beginning of the tape and resetting the counter to zero. - HRESULT Calibrate( - [in] HEVENT hEvent, - [in] long Mode, - [out] long *pStatus // OATRUE is active, OAFALSE is inactive - ); - - // Selects the device's communications port, i.e.,COM1, IEEE1394, etc. - // See edevdefs.h for enums - HRESULT put_DevicePort([in] long DevicePort - ); - HRESULT get_DevicePort([out] long *pDevicePort - ); - - } - typedef IAMExtDevice *PEXTDEVICE; - - //--------------------------------------------------------------------- - // Defines IAMExtTransport Interface - // - // Contains properties and methods that control behavior of an external - // transport device such as a VTR - // - // Implement if: you control such a device. Intended to be agregated - // with IAMExtDevice. - // - // Use if: you want to control such a device - // - // See edevdefs.h for the parameter lists - //--------------------------------------------------------------------- - [ - object, - uuid(A03CD5F0-3045-11cf-8C44-00AA006B6814), - pointer_default(unique) - ] - interface IAMExtTransport : IUnknown { - - // General transport capabilities property. See edevdefs.h for enums - HRESULT GetCapability( - [in] long Capability, // identify the property - [out] long *pValue, // return value - [out] double *pdblValue // return value - ); - - // For disc-based devices: spinning, or not spinning. - // For tape-based device: threaded, unthreaded or ejected - HRESULT put_MediaState([in] long State - ); - HRESULT get_MediaState([out] long *pState // see edevdefs.h - ); - - // Determines state of unit's front panel - HRESULT put_LocalControl([in] long State - ); - HRESULT get_LocalControl([out] long *pState // OATRUE or OAFALSE - ); - - // Transport status such as Play, Stop, etc. More extensive - // than AM states. - HRESULT GetStatus( - [in] long StatusItem, // see edevdefs.h - [out] long *pValue - ); - - // Parameters such as recording speed, servo reference, ballistics, etc. - HRESULT GetTransportBasicParameters( - [in] long Param, - [out] long *pValue, - [out] LPOLESTR *ppszData - ); - - HRESULT SetTransportBasicParameters( - [in] long Param, - [in] long Value, - [in] LPCOLESTR pszData - ); - - // Parameters such as video output mode - HRESULT GetTransportVideoParameters( - [in] long Param, - [out] long *pValue - ); - - HRESULT SetTransportVideoParameters( - [in] long Param, - [in] long Value - ); - - // Parameters such as audio channel enable - HRESULT GetTransportAudioParameters( - [in] long Param, - [out] long *pValue - ); - - HRESULT SetTransportAudioParameters( - [in] long Param, - [in] long Value - ); - - // Mode is the movement of the transport, i.e., Play, Stop, - // Record, Edit, etc. - HRESULT put_Mode([in] long Mode - ); - HRESULT get_Mode([out] long *pMode - ); - - // Rate is for variable speed control of the the device. This - // can be linked to IMediaControl::Rate() in the implementation - // if desired. - HRESULT put_Rate([in] double dblRate - ); - HRESULT get_Rate([out] double *pdblRate - ); - - // This is a lengthy method, that is, it is in effect until canceled or complete and - // requires housekeeping by the filter. It puts transport in play mode and maintains - // fixed relationship between master time reference and transport position. - HRESULT GetChase( - [out] long *pEnabled, // OATRUE | OAFALSE - [out] long *pOffset, // offset in current time format - [out] HEVENT *phEvent // completion notification - ); - HRESULT SetChase( - [in] long Enable, // OATRUE | OAFALSE - [in] long Offset, // offset in current time format - [in] HEVENT hEvent // completion notification - ); - - // Also a lengthy method: temporarily change transport speed (for synchronizing). - HRESULT GetBump( - [out] long *pSpeed, - [out] long *pDuration // in current time format - ); - HRESULT SetBump( - [in] long Speed, - [in] long Duration // in current time format - ); - - // Enable/Disable transport anti-headclog control. - HRESULT get_AntiClogControl([out] long *pEnabled // OATRUE | OAFALSE - ); - HRESULT put_AntiClogControl([in] long Enable // OATRUE | OAFALSE - ); - - // The following group of properties describes edit events. An edit event can be a - // standard insert or assemble edit or a memorized position called a bookmark. - // A NOTE ABOUT EVENTS: as with all lengthy commands, event objects must be created to - // signal completion or error. - - // Intended usage: an edit event is prepared for use by: - // 1. Registering an edit property set and getting an EditID - // 2. Setting the necessary edit properties - // 3. Setting the edit property set active - - // Please see edevdefs.h for properties and values - - // The reference clock's advance is the mechanism that puts an edit in motion (see - // ED_EDIT_REC_INPOINT). - - // Property set methods - HRESULT GetEditPropertySet( - [in] long EditID, - [out] long *pState // ED_SET_ACTIVE | ED_SET_INACTIVE | ED_SET_INVALID - // | ED_SET_EXECUTING - ); - - HRESULT SetEditPropertySet( - [in, out] long *pEditID, - [in] long State // ED_SET_REGISTER | ED_SET_DELETE | ED_SET_ACTIVE | - ); // ED_SET_INACTIVE - - // the following properties define an edit event such as a bookmark, seek point, or - // actual edit - HRESULT GetEditProperty( - [in] long EditID, - [in] long Param, - [out] long *pValue - ); - HRESULT SetEditProperty( - [in] long EditID, - [in] long Param, - [in] long Value - ); - - // Activates a capable transport's edit control (typically used for "on the fly" editing). - HRESULT get_EditStart([out] long *pValue // OATRUE or OAFALSE - ); - HRESULT put_EditStart([in] long Value // OATRUE or OAFALSE - ); - } - typedef IAMExtTransport *PIAMEXTTRANSPORT; - - //--------------------------------------------------------------------- - // Defines IAMTimecodeReader Interface - // - // Contains properties and methods that define behavior of a - // SMPTE/MIDI Timecode Reader. It is expected that this interface - // will be combined (aggregated) with IAMExtTransport to "build" a pro - // VCR. - // - // Implement if: you control such a device - // - // Use if: you want to control such a device - // - // See edevdefs.h for the parameter lists - //===================================================================== - - - // timecode structures - cpp_quote("#if 0") - cpp_quote("/* the following is what MIDL knows how to remote */") - typedef struct tagTIMECODE { - WORD wFrameRate; // will be replaced by AM defs, but see ED_FORMAT_SMPTE for now - WORD wFrameFract; // fractional frame. full scale is always 0x1000 - DWORD dwFrames; - }TIMECODE; - cpp_quote("#else /* 0 */") - cpp_quote("#ifndef TIMECODE_DEFINED") - cpp_quote("#define TIMECODE_DEFINED") - cpp_quote("typedef union _timecode {") - cpp_quote(" struct {") - cpp_quote(" WORD wFrameRate;") - cpp_quote(" WORD wFrameFract;") - cpp_quote(" DWORD dwFrames;") - cpp_quote(" };") - cpp_quote(" DWORDLONG qw;") - cpp_quote(" } TIMECODE;") - cpp_quote("") - cpp_quote("#endif /* TIMECODE_DEFINED */") - cpp_quote("#endif /* 0 */") - - typedef TIMECODE *PTIMECODE; - - typedef struct tagTIMECODE_SAMPLE { - LONGLONG qwTick; // ActiveMovie 100ns timestamp - TIMECODE timecode; // timecode - DWORD dwUser; // timecode user data (aka user bits) - DWORD dwFlags; // timecode flags - see below - } TIMECODE_SAMPLE; - typedef TIMECODE_SAMPLE *PTIMECODE_SAMPLE; - - - [ - object, - uuid(9B496CE1-811B-11cf-8C77-00AA006B6814), - pointer_default(unique) - ] - interface IAMTimecodeReader : IUnknown - { - // Timecode Reader Mode - gets/sets the following properties - // ED_TCR_SOURCE - timecode gen (readback), LTC, VITC, or Control Track - HRESULT GetTCRMode( - [in] long Param, - [out] long *pValue); - HRESULT SetTCRMode( - [in] long Param, - [in] long Value); - - // Select which line of the vertical interval timecode will be read from (if VITC). - // To read VITC on specific multiple lines, the caller would make successive calls to - // put_VITCLine(), once for each line desired. - HRESULT put_VITCLine( - [in] long Line ); // valid lines are 11-20, 0 means autoselect, - // hi bit set means add to list of lines (for - // readers that test across multiple lines) - HRESULT get_VITCLine( - [out] long *pLine ); // hi bit set means multiple lines are used, - // and successive calls will cycle through the - // line numbers (like an enumerator, only simpler) - - // GetTimecode can be used to obtain the most recent timecode value available in the - // stream. The client can use this to monitor the timecode, parse duplicates and - // discontinuities. The source filter supplying the timecode or possibly a down stream - // filter might want to parse for discontinuities or errors since you have to look at - // every sample to do this properly. - // - - HRESULT GetTimecode( - [out] PTIMECODE_SAMPLE pTimecodeSample) ; - - } - typedef IAMTimecodeReader *PIAMTIMECODEREADER; - - //--------------------------------------------------------------------- - //===================================================================== - // Defines IAMTimecodeGenerator Interface - // - // Contains properties and methods that define behavior of an external - // SMPTE/MIDI Timecode Generator. It is expected that this interface - // will be combined (aggregated) with IAMExtTransport to "build" a pro - // VCR. - // - // Implement if: you control such a device - // - // Use if: you want to control such a device - // - // See edevdefs.h for the parameter lists - //--------------------------------------------------------------------- - [ - object, - uuid(9B496CE0-811B-11cf-8C77-00AA006B6814), - pointer_default(unique) - ] - interface IAMTimecodeGenerator : IUnknown { - - // Timecode Generator Mode - gets/sets the following properties (see - // vcrdefss.h for detailed values): - // ED_TCG_TIMECODE_TYPE - LTC, VITC, or MIDI - // ED_TCG_FRAMERATE - 24, 25, 30 drop or 30 nondrop - // ED_TCG_SYNC_SOURCE - what is driving the bitclock - // ED_TCG_REFERENCE_SOURCE - what is driving the count value - HRESULT GetTCGMode( - [in] long Param, - [out] long *pValue); - - HRESULT SetTCGMode( - [in] long Param, - [in] long Value); - - // Select into which line(s) of the vertical interval timecode will be inserted (if VITC). - // Hi bit set means add this line to any previously set lines. - // To generate VITC on specific multiple lines, the caller would make successive calls to - // put_VITCLine(), once for each line desired. - HRESULT put_VITCLine( - [in] long Line // valid lines are 11-20, 0 means autoselect(this setting - ); // is for TC readers that decode from multiple lines) - HRESULT get_VITCLine( - [out] long *pLine - ); - - // Sets timecode and/or userbit value. If generator is running, takes effect - // immediately. If caller wants to set only timecode, set userbit value to -1L (and - // same for setting userbits only) - // - - HRESULT SetTimecode( - [in] PTIMECODE_SAMPLE pTimecodeSample) ; - - - // GetTimecode can be used to obtain the most recent timecode value available in the - // stream. The client can use this to monitor the timecode and verify the generator is - // working properly - // - - HRESULT GetTimecode( - [out] PTIMECODE_SAMPLE pTimecodeSample) ; - - } - typedef IAMTimecodeGenerator *PIAMTIMECODEGENERATOR; - - //--------------------------------------------------------------------- - // Defines IAMTimecodeDisplay Interface - // - // Contains properties and methods that define behavior of an external - // SMPTE/MIDI Timecode Display device (aka "character generator" for - // making "burn-ins" or "window dubs"). It is expected that this interface - // will be combined (aggregated) with IAMExtTransport and the timecode - // interfaces to "build" a pro VCR. - // - // Implement if: you control such a device - // - // Use if: you want to control such a device - // - // See edevdefs.h for the parameter lists - //--------------------------------------------------------------------- - [ - object, - uuid(9B496CE2-811B-11cf-8C77-00AA006B6814), - pointer_default(unique) - ] - interface IAMTimecodeDisplay : IUnknown - { - // Enable/disable external device's timecode reader's character generator output. Some - // readers have this feature - this is not intended for rendering inside the PC! - HRESULT GetTCDisplayEnable( - [out] long *pState); // OATRUE | OAFALSE - HRESULT SetTCDisplayEnable( - [in] long State); // OATRUE | OAFALSE - // Timecode reader's character generator output - // characteristics (size, position, intensity, etc.). - HRESULT GetTCDisplay( - [in] long Param, - [out] long *pValue); - HRESULT SetTCDisplay( - [in] long Param, - [in] long Value); - - /* Allowable params and values (see edevdefs.h for details): - ED_TCD_SOURCE - ED_TCR | ED_TCG - ED_TCD_SIZE - ED_SMALL | ED_MED | ED_LARGE - ED_TCD_POSITION - ED_TOP | ED_MIDDLE | ED_BOTTOM or'd with - ED_LEFT | ED_CENTER | ED_RIGHT - ED_TCD_INTENSITY - ED_HIGH | ED_LOW - ED_TCD_TRANSPARENCY // set from 0 to 4, 0 being completely opaque - ED_TCD_INVERT // white on black or black on white - OATRUE | OAFALSE - ED_TCD_BORDER // white border for black chars, black border for white letters - OATRUE | OAFALSE - */ - } - typedef IAMTimecodeDisplay *PIAMTIMECODEDISPLAY; - - - [ - object, - uuid(c6545bf0-e76b-11d0-bd52-00a0c911ce86), - pointer_default(unique) - ] - interface IAMDevMemoryAllocator : IUnknown - { - HRESULT GetInfo( - [out] DWORD *pdwcbTotalFree, - [out] DWORD *pdwcbLargestFree, - [out] DWORD *pdwcbTotalMemory, - [out] DWORD *pdwcbMinimumChunk); - - HRESULT CheckMemory( - [in] const BYTE *pBuffer); - - HRESULT Alloc( - [out] BYTE **ppBuffer, - [in, out] DWORD *pdwcbBuffer); - - HRESULT Free( - [in] BYTE *pBuffer); - - HRESULT GetDevMemoryObject( - [out] IUnknown **ppUnkInnner, - [in] IUnknown *pUnkOuter); - } - typedef IAMDevMemoryAllocator *PAMDEVMEMORYALLOCATOR; - - - [ - object, - uuid(c6545bf1-e76b-11d0-bd52-00a0c911ce86), - pointer_default(unique) - ] - interface IAMDevMemoryControl : IUnknown - { - HRESULT QueryWriteSync(); - - HRESULT WriteSync(); - - HRESULT GetDevId( - [out] DWORD *pdwDevId); - - } - typedef IAMDevMemoryControl *PAMDEVMEMORYCONTROL; - - // Flags for IAMStreamSelection::Info - enum _AMSTREAMSELECTINFOFLAGS { - AMSTREAMSELECTINFO_ENABLED = 0x01, // Enable - off for disable - AMSTREAMSELECTINFO_EXCLUSIVE = 0x02 // Turns off the others in the group - // when enabling this one - }; - // Flags for IAMStreamSelection::Enable - enum _AMSTREAMSELECTENABLEFLAGS { - // Currently valid values are : - // 0 - disable all streams in the group containing this stream - // ..._ENABLE - enable only this stream with in the given group - // and disable all others - // ..._ENABLEALL - send out all streams - AMSTREAMSELECTENABLE_ENABLE = 0x01, // Enable - AMSTREAMSELECTENABLE_ENABLEALL = 0x02 // Enable all streams in the group - // containing this stream - }; - - // Control which logical streams are played and find out information about - // them - // Normally supported by a filter - [ - object, - uuid(c1960960-17f5-11d1-abe1-00a0c905f375), - pointer_default(unique) - ] - interface IAMStreamSelect : IUnknown - { - // Returns total count of streams - HRESULT Count( - [out] DWORD *pcStreams); // Count of logical streams - - // Return info for a given stream - S_FALSE if iIndex out of range - // The first steam in each group is the default - HRESULT Info( - [in] long lIndex, // 0-based index - [out] AM_MEDIA_TYPE **ppmt, // Media type - optional - // Use DeleteMediaType to free - [out] DWORD *pdwFlags, // flags - optional - [out] LCID *plcid, // LCID (returns 0 if none) - optional - [out] DWORD *pdwGroup, // Logical group - optional - [out] WCHAR **ppszName, // Name - optional - free with CoTaskMemFree - // optional - [out] IUnknown **ppObject, // Associated object - optional - // Object may change if Enable is - // called on this interface - // - returns NULL if no associated object - // Returns pin or filter for DShow - [out] IUnknown **ppUnk); // Stream specific interface - - // Enable or disable a given stream - HRESULT Enable( - [in] long lIndex, - [in] DWORD dwFlags); - } - typedef IAMStreamSelect *PAMSTREAMSELECT; - - enum _AMRESCTL_RESERVEFLAGS - { - AMRESCTL_RESERVEFLAGS_RESERVE = 0x00, // Increment reserve count - AMRESCTL_RESERVEFLAGS_UNRESERVE = 0x01 // Decrement reserve count - }; - - // Reserve resources now so that playback can be subsequently - // guaranteed - // - // Normally supported by a filter - // - [ - object, - uuid(8389d2d0-77d7-11d1-abe6-00a0c905f375), - pointer_default(unique), - local - ] - interface IAMResourceControl : IUnknown - { - // The reserve count is incremented/decremented if and only if - // S_OK is returned - // Unreserve once for every Reserve call - HRESULT Reserve( - [in] DWORD dwFlags, // From _AMRESCTL_RESERVEFLAGS enum - [in] PVOID pvReserved // Must be NULL - ); - } - - - // Set clock adjustments - supported by some clocks - [ - object, - uuid(4d5466b0-a49c-11d1-abe8-00a0c905f375), - pointer_default(unique), - local - ] - interface IAMClockAdjust : IUnknown - { - // Set the following delta to clock times - // The clock will add adjust its times by the given delta - HRESULT SetClockDelta( - [in] REFERENCE_TIME rtDelta - ); - }; - - // Filter miscellaneous status flags - - enum _AM_FILTER_MISC_FLAGS { - AM_FILTER_MISC_FLAGS_IS_RENDERER = 0x00000001, /* Will deliver EC_COMPLETE - at end of media */ - AM_FILTER_MISC_FLAGS_IS_SOURCE = 0x00000002 /* Filter sources data */ - }; - - [ - object, - uuid(2dd74950-a890-11d1-abe8-00a0c905f375), - pointer_default(unique), - local - ] - interface IAMFilterMiscFlags : IUnknown - { - // Get miscellaneous property flags - ULONG GetMiscFlags(void); - }; - - - // Video Image drawing interface - [ - object, - local, - uuid(48efb120-ab49-11d2-aed2-00a0c995e8d5), - pointer_default(unique), - ] - interface IDrawVideoImage : IUnknown - { - HRESULT DrawVideoImageBegin(); - - HRESULT DrawVideoImageEnd(); - - HRESULT DrawVideoImageDraw( - [in] HDC hdc, - [in] LPRECT lprcSrc, - [in] LPRECT lprcDst - ); - } - - // - // Video Image decimation interface - // - // The aim of this interface is to enable a video renderer filter to - // control the decimation properties of a video decoder connected to - // the video renderer - // - // This interface should only be supported by decoders that are capable of - // decimating their output image by an arbitary amount. - // - // - [ - object, - local, - uuid(2e5ea3e0-e924-11d2-b6da-00a0c995e8df), - pointer_default(unique), - ] - interface IDecimateVideoImage : IUnknown - { - // - // Informs the decoder that it should decimate its output - // image to the specified width and height. If the decoder can - // decimate to this size it should return S_OK. - // If the decoder can't perform the requested decimation - // or wants to stop performing the decimation that it is - // currently doing it should return E_FAIL. - // - HRESULT SetDecimationImageSize( - [in] long lWidth, - [in] long lHeight); - - // - // Informs the decoder that it should stop decimating its output image - // and resume normal output. - // - HRESULT ResetDecimationImageSize(); - } - - typedef enum _DECIMATION_USAGE { - DECIMATION_LEGACY, // decimate at ovly then video port then crop - DECIMATION_USE_DECODER_ONLY, // decimate image at the decoder only - DECIMATION_USE_VIDEOPORT_ONLY, // decimate at the video port only - DECIMATION_USE_OVERLAY_ONLY, // decimate at the overlay only - DECIMATION_DEFAULT // decimate at decoder then ovly the vide port then crop - } DECIMATION_USAGE; - - [ - object, - local, - uuid(60d32930-13da-11d3-9ec6-c4fcaef5c7be), - pointer_default(unique), - ] - interface IAMVideoDecimationProperties: IUnknown - { - // - // Queries the current usage of the above IDecimateVideoImage - // interface. - // - HRESULT QueryDecimationUsage( - [out] DECIMATION_USAGE* lpUsage); // from DECIMATION_USAGE enum - - // - // Sets the current usage of the above IDecimateVideoImage - // interface. - // - HRESULT SetDecimationUsage( - [in] DECIMATION_USAGE Usage); // from DECIMATION_USAGE enum - } - - //--------------------------------------------------------------------- - // - // IVideoFrameStep interface - // - //--------------------------------------------------------------------- - - [ - object, - uuid(e46a9787-2b71-444d-a4b5-1fab7b708d6a), - pointer_default(unique), - ] - interface IVideoFrameStep : IUnknown - { - // - // Stop(), Pause(), Run() all cancel Step as does any seeking - // request. - // - // The Step() and CancelStep() methods of this interface - // Cancel any previous step. - // - // When stepping is complete EC_STEP_COMPLETE is signalled. - // - // When the filter graph gets EC_STEP_COMPLETE it automatically - // sets the filter graph into paused state and forwards the - // notification to the application - // - // Returns S_OK if stepping initiated. - // - // dwFrames - // 1 means step 1 frame forward - // 0 is invalid - // n (n > 1) means skip n - 1 frames and show the nth - // - // pStepObject - // NULL - default step object (filter) picked - // non-NULL - use this object for stepping - // - HRESULT Step(DWORD dwFrames, [unique] IUnknown *pStepObject); - - // Can step? - // Returns S_OK if it can, S_FALSE if it can't or error code. - // bMultiple - if TRUE return whether can step n > 1 - HRESULT CanStep(long bMultiple, [unique] IUnknown *pStepObject); - - // Cancel stepping - HRESULT CancelStep(); - } - - - - - //--------------------------------------------------------------------- - // - // IAMPushSource interface - // - // Provides a means for source filters to describe information about the - // data that they source, such as whether the data is live or not, and - // what type of clock was used for timestamps. This information may be - // needed by other clocks in the graph in order to provide accurate - // synchronization. Also provides a way to specify an offset value for - // the filter to use when timestamping the streams it sources. Provides - // support for the IAMLatency interface as well. - // - //--------------------------------------------------------------------- - - enum _AM_PUSHSOURCE_FLAGS { - - // - // The default assumption is that the data is from a live source, - // time stamped with the graph clock, and the source does not - // attempt to rate match the data it delivers. - // The following flags can be used to override this assumption. - // - - // capability flags - AM_PUSHSOURCECAPS_INTERNAL_RM = 0x00000001, // source provides internal support for rate matching - AM_PUSHSOURCECAPS_NOT_LIVE = 0x00000002, // don't treat source data as live - AM_PUSHSOURCECAPS_PRIVATE_CLOCK = 0x00000004, // source data timestamped with clock not - // exposed to the graph - - // request flags, set by user via SetPushSourceFlags method - AM_PUSHSOURCEREQS_USE_STREAM_CLOCK = 0x00010000 // source was requested to timestamp - // using a clock that isn't the graph clock - }; - - // - // Used to set a source filter to run in a "live" mode. - // - [ - object, - uuid(F185FE76-E64E-11d2-B76E-00C04FB6BD3D), - pointer_default(unique) - ] - interface IAMPushSource : IAMLatency - { - // used to discover push source's capabilities. - // may be any combination of the AM_PUSHSOURCE_FLAGS flags. - HRESULT GetPushSourceFlags ( - [out] ULONG *pFlags - ); - - // used to set request flags for a push source. - // may be a combination of the AM_PUSHSOURCE_REQS_xxx flags. - HRESULT SetPushSourceFlags ( - [in] ULONG Flags - ); - - // specify an offset for push source time stamps - HRESULT SetStreamOffset ( - [in] REFERENCE_TIME rtOffset - ); - - // retrieve the offset this push source is using - HRESULT GetStreamOffset ( - [out] REFERENCE_TIME *prtOffset - ); - - // retrieve the maximum stream offset this push source thinks it can support - HRESULT GetMaxStreamOffset ( - [out] REFERENCE_TIME *prtMaxOffset - ); - - // allows the filter graph to tell a push source the maximum latency allowed on the graph - // this allows pins like the video capture preview pin to be more efficient with the amount - // of buffering required to support the maximum graph latency - HRESULT SetMaxStreamOffset ( - [in] REFERENCE_TIME rtMaxOffset - ); - }; - - - // ------------------------------------------------------------------------ - // - // IAMDeviceRemoval interface - // - // Implemented by filters to request and receive WM_DEVICECHANGE - // notifications - // - // ------------------------------------------------------------------------ - - [ - object, - uuid(f90a6130-b658-11d2-ae49-0000f8754b99), - pointer_default(unique) - ] - interface IAMDeviceRemoval : IUnknown - { - - HRESULT DeviceInfo( - [out] CLSID *pclsidInterfaceClass, - [out] WCHAR **pwszSymbolicLink); - - HRESULT Reassociate(); - - HRESULT Disassociate(); - } - - // - // for DV - // - typedef struct { - //for 1st 5/6 DIF seq. - DWORD dwDVAAuxSrc; - DWORD dwDVAAuxCtl; - //for 2nd 5/6 DIF seq. - DWORD dwDVAAuxSrc1; - DWORD dwDVAAuxCtl1; - //for video information - DWORD dwDVVAuxSrc; - DWORD dwDVVAuxCtl; - DWORD dwDVReserved[2]; - - } DVINFO, *PDVINFO; - - // ------------------------------------------------------------------------ - // - // IDVEnc interface - // - // Implemented by DV encoder filters to set Encoder format - // - // ------------------------------------------------------------------------ - enum _DVENCODERRESOLUTION { //resolution - DVENCODERRESOLUTION_720x480 = 2012, - DVENCODERRESOLUTION_360x240 = 2013, - DVENCODERRESOLUTION_180x120 = 2014, - DVENCODERRESOLUTION_88x60 = 2015 - }; - enum _DVENCODERVIDEOFORMAT { //PAL/ntsc - DVENCODERVIDEOFORMAT_NTSC = 2000, - DVENCODERVIDEOFORMAT_PAL = 2001 - }; - enum _DVENCODERFORMAT { // dvsd/dvhd/dvsl - DVENCODERFORMAT_DVSD = 2007, - DVENCODERFORMAT_DVHD = 2008, - DVENCODERFORMAT_DVSL = 2009 - }; - [ - object, - uuid(d18e17a0-aacb-11d0-afb0-00aa00b67a42), - pointer_default(unique) - ] - interface IDVEnc : IUnknown - { - - HRESULT get_IFormatResolution ( - [out] int *VideoFormat, //pal or ntsc - [out] int *DVFormat, //dvsd dvhd dvsl - [out] int *Resolution, //720, 360, 180,88 - [in] BYTE fDVInfo, //TRUE: DVINFO structure exist, FALSE: Do not care DVINFO - [out] DVINFO *sDVInfo //NULL if fDVInfo=FALSE, - ); - - HRESULT put_IFormatResolution ( - [in] int VideoFormat, - [in] int DVFormat, - [in] int Resolution, - [in] BYTE fDVInfo, //TRUE: DVINFO structure exist, FALSE: Do not care DVINFO - [in] DVINFO *sDVInfo //NULL if fDVInfo=FALSE, - ); - - } - - // ------------------------------------------------------------------------ - // - // IDVDec interface - // - // Implemented by DV decoder filters to set decoder size - // - // ------------------------------------------------------------------------ - enum _DVDECODERRESOLUTION { - DVDECODERRESOLUTION_720x480 = 1000, - DVDECODERRESOLUTION_360x240 = 1001, - DVDECODERRESOLUTION_180x120 = 1002, - DVDECODERRESOLUTION_88x60 = 1003 - }; - enum _DVRESOLUTION { - DVRESOLUTION_FULL = 1000, - DVRESOLUTION_HALF = 1001, - DVRESOLUTION_QUARTER = 1002, - DVRESOLUTION_DC = 1003 - }; - [ - object, - uuid(b8e8bd60-0bfe-11d0-af91-00aa00b67a42), - pointer_default(unique) - ] - interface IIPDVDec : IUnknown - { - HRESULT get_IPDisplay ( - [out] int *displayPix // The display pixels arrage - ); - - HRESULT put_IPDisplay ( - [in] int displayPix // Change to this display pixel arrage - ) ; - } - - // ------------------------------------------------------------------------ - // - // IDVSplitter interface - // - // Implemented by DV splitter filters - // - // ------------------------------------------------------------------------ - [ - object, - uuid(92a3a302-da7c-4a1f-ba7e-1802bb5d2d02) - ] - interface IDVSplitter : IUnknown - { - HRESULT DiscardAlternateVideoFrames( - [in] int nDiscard - ) ; - } - - // Audio Renderer statistics params for IAMAudioRendererStats interface - enum _AM_AUDIO_RENDERER_STAT_PARAM { - AM_AUDREND_STAT_PARAM_BREAK_COUNT = 1, // audio breaks - AM_AUDREND_STAT_PARAM_SLAVE_MODE, // current slave mode, see AM_AUDREND_SLAVE_MODEs - AM_AUDREND_STAT_PARAM_SILENCE_DUR, // silence inserted due to gaps (ms) - AM_AUDREND_STAT_PARAM_LAST_BUFFER_DUR, // duration of the last buffer received - AM_AUDREND_STAT_PARAM_DISCONTINUITIES, // discontinuities seen since running - AM_AUDREND_STAT_PARAM_SLAVE_RATE, // what rate are we currently slaving at? S_FALSE if not slaving - AM_AUDREND_STAT_PARAM_SLAVE_DROPWRITE_DUR, // for waveOut slaving - data dropped or added to stay in-sync - // dwParam1 - dropped duration(ms) - // dwParam2 - paused duration(ms) - AM_AUDREND_STAT_PARAM_SLAVE_HIGHLOWERROR, // highest & lowest clock differences seen - // dwParam1 - high err - // dwParam2 - low err - AM_AUDREND_STAT_PARAM_SLAVE_LASTHIGHLOWERROR, // last high and low errs seen - // dwParam1 - last high err - // dwParam2 - last low err - AM_AUDREND_STAT_PARAM_SLAVE_ACCUMERROR, // error between master/slave clocks - AM_AUDREND_STAT_PARAM_BUFFERFULLNESS, // percent audio buffer fullness - AM_AUDREND_STAT_PARAM_JITTER // input buffer jitter - }; - - //--------------------------------------------------------------------- - // - // IAMAudioRendererStats interface - // - // Interface to get at statistical information that is optionally stored - // in an audio renderer filter. Supported on the filter interface (although - // this might be better for ksproxy if we define it as a pin interface?) - // - //--------------------------------------------------------------------- - - [ - object, - uuid(22320CB2-D41A-11d2-BF7C-D7CB9DF0BF93), - pointer_default(unique) - ] - interface IAMAudioRendererStats : IUnknown - { - // Get value corresponding to the passed in parameter id - HRESULT GetStatParam( - [in] DWORD dwParam, - [out] DWORD *pdwParam1, - [out] DWORD *pdwParam2 - ); - } - - //--------------------------------------------------------------------- - // - // IAMLatency interface - // - // Allows a filter to report the expected latency associated with a data - // stream flowing from its input to output pin. Supported on output pins. - // - //--------------------------------------------------------------------- - - [ - object, - uuid(62EA93BA-EC62-11d2-B770-00C04FB6BD3D), - pointer_default(unique) - ] - interface IAMLatency : IUnknown - { - HRESULT GetLatency( - [in] REFERENCE_TIME *prtLatency - ); - } - - - enum _AM_INTF_SEARCH_FLAGS { - AM_INTF_SEARCH_INPUT_PIN = 0x00000001, // search input pins - AM_INTF_SEARCH_OUTPUT_PIN = 0x00000002, // search output pins - AM_INTF_SEARCH_FILTER = 0x00000004 // search filters - }; - - //--------------------------------------------------------------------- - // - // IAMGraphStreams interface - // - // Interface used to control or search over connected streams of data - // flow within a filter graph. - // - //--------------------------------------------------------------------- - - [ - object, - uuid(632105FA-072E-11d3-8AF9-00C04FB6BD3D), - pointer_default(unique) - ] - interface IAMGraphStreams : IUnknown - { - // Search upstream from the current pin, for the specified interface. - // dwFlags can be any combination of the AM_INTF_SEARCH_FLAGS, and allows - // control over what objects to search. A value of 0 means to search all. - HRESULT FindUpstreamInterface( - [in] IPin *pPin, - [in] REFIID riid, - [out, iid_is(riid)] void **ppvInterface, - [in] DWORD dwFlags ); - - // Enable or disable the graph's setting of a timestamp offset - // on push sources. - HRESULT SyncUsingStreamOffset( [in] BOOL bUseStreamOffset ); - - // allow an app to set the maximum offset used on push source filters - HRESULT SetMaxGraphLatency( [in] REFERENCE_TIME rtMaxGraphLatency ); - } - - - // - // IAMOverlayFX - // - // This interface is exposed by the overlay mixer filter and allows - // an application to apply various "effects" to the overlay surface - // used by the overlay mixer. - // - // The effects that can be applied are described by the AMOVERLAYFX - // enumeration. - // - enum AMOVERLAYFX { - // Normal (ie. top down, left to right) video - AMOVERFX_NOFX = 0x00000000, - - // Mirror the overlay across the vertical axis - AMOVERFX_MIRRORLEFTRIGHT = 0x00000002, - - // Mirror the overlay across the horizontal axis - AMOVERFX_MIRRORUPDOWN = 0x00000004, - - // Deinterlace the overlay, if possible - AMOVERFX_DEINTERLACE = 0x00000008 - }; - - [ - object, - uuid(62fae250-7e65-4460-bfc9-6398b322073c), - pointer_default(unique) - ] - interface IAMOverlayFX : IUnknown - { - // Use this method to determine what overlay effects are currently available - // for the overlay surface used by the overlay mixer filter. - // - HRESULT QueryOverlayFXCaps( - [out] DWORD *lpdwOverlayFXCaps - ); - - // Use this method to apply a new overlay effect to the overlay surface - // used by the overlay mixer filter. This method can be called while the - // filter graph is running, the effect is applied immediately - // - HRESULT SetOverlayFX( - [in] DWORD dwOverlayFX - ); - - // Use this method to determine what effect (if any) is currently being - // applied to the overlay surface by the overlay mixer filter. - // - HRESULT GetOverlayFX( - [out] DWORD *lpdwOverlayFX - ); - } - - - - // IAMOpenProgress interface provides information about current progress through - // a download - - // NOTE: The following cpp_quote is there to make sure that we do not break the whistler build when this file is - // updated in Whistler as they are using a private copy of op.h which is removed as a result of moving the IAMOpenProgress - // interface into axextend.idl. Html+time has a private copy of op.h in \\index1\src\newnt\inetcore\mshtml\src\time\include\op.h - // which needs to be removed when integrating into Whistler to avoid any future build breaks. - cpp_quote("#define __OP_H__") - - [ - object, - uuid(8E1C39A1-DE53-11cf-AA63-0080C744528D), - pointer_default(unique) - ] - - interface IAMOpenProgress : IUnknown - { - // QueryProgress can be used to query the source filter which supports this interface - // for progress information during a renderfile operation. - HRESULT QueryProgress( - [out] LONGLONG* pllTotal, - [out] LONGLONG* pllCurrent - ); - - // AbortOperation can be used to request an abort of RenderFile operation - // causing it to stop downloading. This methods instructs the exporter of - // the IAMOpenProgress interface to hold up their internal abort flag until - // further notice. - HRESULT AbortOperation( - ); - } - - /*++ - IMpeg2Demultiplexer - - This interface is implemented by the MPEG-2 Demultiplexer filter, - irrespective of program vs. transport stream splitting functionality. - --*/ - [ - object, - local, - uuid (436eee9c-264f-4242-90e1-4e330c107512), - pointer_default(unique) - ] - interface IMpeg2Demultiplexer : IUnknown - { - /*++ - ------------------------------------------------------------------------ - purpose: Creates an output pin of the specified media type. - - pMediaType media type specifier for the new pin - pszPinName pin name; cannot be a duplicate of an existing pin - ppIPin IPin interface pointer to the newly created pin - --*/ - HRESULT - CreateOutputPin ( - [in] AM_MEDIA_TYPE * pMediaType, - [in] LPWSTR pszPinName, - [out] IPin ** ppIPin - ) ; - - /*++ - ------------------------------------------------------------------------ - purpose: Updates the media type of the specified output pin. If no - connection exists, the media type is updated always. If - the pin is connected, the success/failure of the call will - depend on downstream input pin's accetance/rejection of - the specified media type, and subsequent success/failure - of a reconnect. - - pszPinName pin name - pMediaType new media type specifier - --*/ - HRESULT - SetOutputPinMediaType ( - [in] LPWSTR pszPinName, - [in] AM_MEDIA_TYPE * pMediaType - ) ; - - /*++ - ------------------------------------------------------------------------ - purpose: Deletes the specified output pin. - - pszPinName pin name - --*/ - HRESULT - DeleteOutputPin ( - [in] LPWSTR pszPinName - ) ; - } ; - - //--------------------------------------------------------------------- - // IEnumStreamIdMap interface - //--------------------------------------------------------------------- - - cpp_quote("#define MPEG2_PROGRAM_STREAM_MAP 0x00000000") - cpp_quote("#define MPEG2_PROGRAM_ELEMENTARY_STREAM 0x00000001") - cpp_quote("#define MPEG2_PROGRAM_DIRECTORY_PES_PACKET 0x00000002") - cpp_quote("#define MPEG2_PROGRAM_PACK_HEADER 0x00000003") - cpp_quote("#define MPEG2_PROGRAM_PES_STREAM 0x00000004") - cpp_quote("#define MPEG2_PROGRAM_SYSTEM_HEADER 0x00000005") - - cpp_quote("#define SUBSTREAM_FILTER_VAL_NONE 0x10000000") - - typedef struct { - ULONG stream_id ; // mpeg-2 stream_id - DWORD dwMediaSampleContent ; // #define'd above - ULONG ulSubstreamFilterValue ; // filtering value - int iDataOffset ; // offset to elementary stream - } STREAM_ID_MAP ; - - /*++ - Enumerates the StreamIds mapped on a pin - --*/ - [ - object, - local, - uuid (945C1566-6202-46fc-96C7-D87F289C6534), - pointer_default(unique) - ] - interface IEnumStreamIdMap : IUnknown - { - HRESULT - Next ( - [in] ULONG cRequest, - [in, out, size_is (cRequest)] STREAM_ID_MAP * pStreamIdMap, - [out] ULONG * pcReceived - ) ; - - HRESULT - Skip ( - [in] ULONG cRecords - ) ; - - HRESULT - Reset ( - ) ; - - HRESULT - Clone ( - [out] IEnumStreamIdMap ** ppIEnumStreamIdMap - ) ; - } ; - - /*++ - Implemented on the output pin. - - Provides the ability to map/unmap a stream_id to/from an output pin. - --*/ - [ - object, - local, - uuid (D0E04C47-25B8-4369-925A-362A01D95444), - pointer_default(unique) - ] - interface IMPEG2StreamIdMap : IUnknown - { - HRESULT - MapStreamId ( - [in] ULONG ulStreamId, // mpeg-2 stream_id - [in] DWORD MediaSampleContent, // #define'd above IEnumStreamIdMap - [in] ULONG ulSubstreamFilterValue, // filter value - [in] int iDataOffset // elementary stream offset - ) ; - - HRESULT - UnmapStreamId ( - [in] ULONG culStreamId, // number of stream_id's in pulStreamId - [in] ULONG * pulStreamId // array of stream_id's to unmap - ) ; - - HRESULT - EnumStreamIdMap ( - [out] IEnumStreamIdMap ** ppIEnumStreamIdMap - ) ; - } ; - - -#endif // DirectX 8.0 content diff --git a/import/DirectX8/include/DShowIDL/bdaiface.idl b/import/DirectX8/include/DShowIDL/bdaiface.idl deleted file mode 100644 index 75e7830f5..000000000 --- a/import/DirectX8/include/DShowIDL/bdaiface.idl +++ /dev/null @@ -1,1744 +0,0 @@ -//------------------------------------------------------------------------------ -// File: BDAIface.idl -// -// Desc: This file defines the Ring 3 BDA interfaces that are common to -// all BDA network and device types. -// -// The interfaces specific to a particular Network Type or filter -// implementation are defined in a separate include file for that -// Network Type or filter implementation. -// -// Copyright (c) 1999-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -//--------------------------------------------------------------------- -// IUnknown import idl -//--------------------------------------------------------------------- -#ifndef DO_NO_IMPORTS -import "unknwn.idl"; -import "strmif.idl"; -import "BdaTypes.h"; -#endif - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// Separate the updated Windows XP version of this header from the downlevel -// version that shipped with the DirectX 8.0 SDK. Since development -// on BDA technology continued for Windows XP, some changes were made to -// this file in order to improve the interface and functionality. -// -// To maintain compatibility with older applications which rely on the -// DirectX 8.0 versions of these files, the DirectX 8.1 version includes -// both the Windows XP content and the DirectX 8.0 content, which are -// separated by the #if (WINVER >= 0x501) preprocessor directive. -// -// Therefore, if you define WINVER to be 0x501 to specify Windows XP, -// the revised content will be compiled. Otherwise, the original -// DirectX 8.0 content will be used. -// -///////////////////////////////////////////////////////////////////////////// - -#if (WINVER >= 0x501) // Windows XP content - - - -//--------------------------------------------------------------------- -// -// IBDA_NetworkProvider interface -// -// Implemented by a BDA Network Provider -// -// Used by a BDA device filter to register itself with -// a Network Provider and query information about the -// the current tuning request. -// -//--------------------------------------------------------------------- -[ - object, - uuid(fd501041-8ebe-11ce-8183-00aa00577da2), - pointer_default(unique) -] - -interface IBDA_NetworkProvider : IUnknown -{ - - HRESULT - PutSignalSource ( - [in] ULONG ulSignalSource - ); - - - HRESULT - GetSignalSource ( - [in, out] ULONG * pulSignalSource - ); - - HRESULT - GetNetworkType ( - [in, out] GUID * pguidNetworkType - ); - - HRESULT - PutTuningSpace ( - [in] REFGUID guidTuningSpace - ); - - HRESULT - GetTuningSpace ( - [in, out] GUID * pguidTuingSpace - ); - - HRESULT - RegisterDeviceFilter ( - [in] IUnknown * pUnkFilterControl, - [in, out] ULONG * ppvRegisitrationContext - ); - - HRESULT - UnRegisterDeviceFilter ( - [in] ULONG pvRegistrationContext - ); - -} - - -//--------------------------------------------------------------------- -// -// IBDA_EthernetFilter interface -// -// Implemented by a BDA Network Provider -// -// Used by an Ethernet Network Data Sink filter (eg. IPSink) to -// request that the Network Provider make its best effort to tune -// to the stream(s) on which a list of Ethernet multicast addresses -// may be transmitted. -// -// Addresses in the address list are byte aligned in Network order. -// UlcbAddresses will always be an integer multiple of the -// size of an ethernet address. -// -//--------------------------------------------------------------------- -[ - object, - uuid(71985F43-1CA1-11d3-9CC8-00C04F7971E0), - pointer_default(unique) -] - -interface IBDA_EthernetFilter : IUnknown -{ - HRESULT - GetMulticastListSize ( - [in, out] ULONG * pulcbAddresses - ); - - HRESULT - PutMulticastList ( - [in] ULONG ulcbAddresses, - [in, size_is(ulcbAddresses)] BYTE pAddressList [] - ); - - HRESULT - GetMulticastList ( - [in, out] ULONG * pulcbAddresses, - [out, size_is(*pulcbAddresses)] BYTE pAddressList [] - ); - - HRESULT - PutMulticastMode ( - [in] ULONG ulModeMask - ); - - HRESULT - GetMulticastMode ( - [out] ULONG * pulModeMask - ); - -} - - - -//--------------------------------------------------------------------- -// -// IBDA_IPV4Filter interface -// -// Implemented by a BDA Network Provider -// -// Used by an IPv4 Network Data Sink filter to request -// that the Network Provider make its best effort to tune -// to the stream(s) on which a list of IPv4 multicast addresses -// may be transmitted. -// -// Addresses in the address list are byte aligned in Network order. -// UlcbAddresses will always be an integer multiple of the -// size of an IPv4 address. -// -//--------------------------------------------------------------------- -[ - object, - uuid(71985F44-1CA1-11d3-9CC8-00C04F7971E0), - pointer_default(unique) -] - -interface IBDA_IPV4Filter : IUnknown -{ - - HRESULT - GetMulticastListSize ( - [in, out] ULONG * pulcbAddresses - ); - - HRESULT - PutMulticastList ( - [in] ULONG ulcbAddresses, - [in, size_is(ulcbAddresses)] BYTE pAddressList [] - ); - - HRESULT - GetMulticastList ( - [in, out] ULONG * pulcbAddresses, - [out, size_is(*pulcbAddresses)] BYTE pAddressList [] - ); - - HRESULT - PutMulticastMode ( - [in] ULONG ulModeMask - ); - - HRESULT - GetMulticastMode ( - [out] ULONG* pulModeMask - ); -} - - - -//--------------------------------------------------------------------- -// -// IBDA_IPV6Filter interface -// -// Implemented by a BDA Network Provider -// -// Used by an IPv6 Network Data Sink filter to request -// that the Network Provider make its best effort to tune -// to the stream(s) on which a list of IPv6 multicast addresses -// may be transmitted. -// -// Addresses in the address list are byte aligned in Network order. -// UlcbAddresses will always be an integer multiple of the -// size of an IPv6 address. -// -//--------------------------------------------------------------------- -[ - object, - uuid(E1785A74-2A23-4fb3-9245-A8F88017EF33), - pointer_default(unique) -] - -interface IBDA_IPV6Filter : IUnknown -{ - - HRESULT - GetMulticastListSize ( - [in, out] ULONG * pulcbAddresses - ); - - HRESULT - PutMulticastList ( - [in] ULONG ulcbAddresses, - [in, size_is(ulcbAddresses)] BYTE pAddressList [] - ); - - HRESULT - GetMulticastList ( - [in, out] ULONG * pulcbAddresses, - [out, size_is(*pulcbAddresses)] BYTE pAddressList [] - ); - - HRESULT - PutMulticastMode ( - [in] ULONG ulModeMask - ); - - HRESULT - GetMulticastMode ( - [out] ULONG* pulModeMask - ); -} - - - -//--------------------------------------------------------------------- -// -// IBDA_DeviceControl interface -// -// Implemented by a BDA Device Filter -// -// Used by the Network Provider to commit a series of changes -// on a BDA device filter. The device filter validates and -// accumulates all changes requested after StartChanges(). It -// effects the accumulated list of changes when CommitChanges() is -// called. -// -//--------------------------------------------------------------------- -[ - object, - uuid(FD0A5AF3-B41D-11d2-9C95-00C04F7971E0), - pointer_default(unique) -] - -interface IBDA_DeviceControl : IUnknown -{ - HRESULT - StartChanges ( - void - ); - - HRESULT - CheckChanges ( - void - ); - - HRESULT - CommitChanges ( - void - ); - - HRESULT - GetChangeState ( - [in, out] ULONG * pState - ); - -} - - - -//--------------------------------------------------------------------- -// -// IBDA_PinControl interface -// -// Implemented by a BDA Device Filter's Pin -// -// Used by the Network Provider to determine the BDA PinID and -// PinType on a BDA Filter's Pin -// -//--------------------------------------------------------------------- -[ - object, - uuid(0DED49D5-A8B7-4d5d-97A1-12B0C195874D), - pointer_default(unique) -] - -interface IBDA_PinControl : IUnknown -{ - HRESULT - GetPinID ( - [in, out] ULONG * pulPinID - ); - - HRESULT - GetPinType ( - [in, out] ULONG * pulPinType - ); - - HRESULT - RegistrationContext ( - [in, out] ULONG * pulRegistrationCtx - ); -} - - - -//--------------------------------------------------------------------- -// -// IBDA_SignalProperties interface -// -// Implemented by a BDA Device Filter -// -// BDA Signal Properties is used by a Network Provider to inform -// a BDA Device Filter about the current tuning request. The -// Network Provider will call the Put functions when the BDA -// device is first registered with the Network Provider and whenever -// the current tuning request is modified. -// -//--------------------------------------------------------------------- -[ - object, - uuid(D2F1644B-B409-11d2-BC69-00A0C9EE9E16), - pointer_default(unique) -] - -interface IBDA_SignalProperties : IUnknown -{ - HRESULT - PutNetworkType ( - [in] REFGUID guidNetworkType - ); - - HRESULT - GetNetworkType ( - [in, out] GUID * pguidNetworkType - ); - - HRESULT - PutSignalSource ( - [in] ULONG ulSignalSource - ); - - HRESULT - GetSignalSource ( - [in, out] ULONG * pulSignalSource - ); - - HRESULT - PutTuningSpace ( - [in] REFGUID guidTuningSpace - ); - - HRESULT - GetTuningSpace ( - [in, out] GUID * pguidTuingSpace - ); -} - - -//--------------------------------------------------------------------- -// -// IBDA_SignalStatistics interface -// -// Implemented by a BDA Control Node -// -// A BDA Control Node may return these properties to describe -// the condition of a signal that is being received. -// -// -// -// -//--------------------------------------------------------------------- -[ - object, - uuid(1347D106-CF3A-428a-A5CB-AC0D9A2A4338), - pointer_default(unique) -] - -interface IBDA_SignalStatistics : IUnknown -{ - HRESULT - put_SignalStrength ( - [in] LONG lDbStrength - ); - - HRESULT - get_SignalStrength ( - [in, out] LONG * plDbStrength - ); - - HRESULT - put_SignalQuality ( - [in] LONG lPercentQuality - ); - - HRESULT - get_SignalQuality ( - [in, out] LONG * plPercentQuality - ); - - HRESULT - put_SignalPresent ( - [in] BOOLEAN fPresent - ); - - HRESULT - get_SignalPresent ( - [in, out] BOOLEAN * pfPresent - ); - - HRESULT - put_SignalLocked ( - [in] BOOLEAN fLocked - ); - - HRESULT - get_SignalLocked ( - [in, out] BOOLEAN * pfLocked - ); - - HRESULT - put_SampleTime ( - [in] LONG lmsSampleTime - ); - - HRESULT - get_SampleTime ( - [in, out] LONG * plmsSampleTime - ); -} - - -//--------------------------------------------------------------------- -// -// IBDA_Topology interface -// -// Implemented by a BDA Device Filter -// -// Used by the Network Provider to query a BDA Device Filter's -// possible topologies (template topology) and to configure -// the device with an appropriate topology for the current -// tuning request. It is also used to get an IUnknown to -// a control node which may be used to set specific tuning -// information. -// -//--------------------------------------------------------------------- -[ - object, - uuid(79B56888-7FEA-4690-B45D-38FD3C7849BE), - pointer_default(unique) -] - -interface IBDA_Topology : IUnknown -{ - HRESULT - GetNodeTypes ( - [in, out] ULONG * pulcNodeTypes, - [in] ULONG ulcNodeTypesMax, - [in, out, size_is (ulcNodeTypesMax)] ULONG rgulNodeTypes[] - ); - - HRESULT - GetNodeDescriptors ( - [in, out] ULONG * ulcNodeDescriptors, - [in] ULONG ulcNodeDescriptorsMax, - [in, out, size_is (ulcNodeDescriptorsMax)] BDANODE_DESCRIPTOR rgNodeDescriptors[] - ); - - HRESULT - GetNodeInterfaces ( - [in] ULONG ulNodeType, - [in, out] ULONG * pulcInterfaces, - [in] ULONG ulcInterfacesMax, - [in, out, size_is (ulcInterfacesMax)] GUID rgguidInterfaces[] - ); - - HRESULT - GetPinTypes ( - [in, out] ULONG * pulcPinTypes, - [in] ULONG ulcPinTypesMax, - [in, out, size_is (ulcPinTypesMax)] ULONG rgulPinTypes[] - ); - - HRESULT - GetTemplateConnections ( - [in, out] ULONG * pulcConnections, - [in] ULONG ulcConnectionsMax, - [in, out, size_is (ulcConnectionsMax)] BDA_TEMPLATE_CONNECTION rgConnections[] - ); - - HRESULT - CreatePin ( - [in] ULONG ulPinType, - [in, out] ULONG * pulPinId - ); - - HRESULT - DeletePin ( - [in] ULONG ulPinId - ); - - HRESULT - SetMediaType ( - [in] ULONG ulPinId, - [in] AM_MEDIA_TYPE * pMediaType - ); - - HRESULT - SetMedium ( - [in] ULONG ulPinId, - [in] REGPINMEDIUM * pMedium - ); - - HRESULT - CreateTopology ( - [in] ULONG ulInputPinId, - [in] ULONG ulOutputPinId - ); - - HRESULT - GetControlNode ( - [in] ULONG ulInputPinId, - [in] ULONG ulOutputPinId, - [in] ULONG ulNodeType, - [in, out] IUnknown ** ppControlNode - ); -} - -//--------------------------------------------------------------------- -// IBDA_VoidTransform interface -//--------------------------------------------------------------------- -[ - object, - uuid(71985F46-1CA1-11d3-9CC8-00C04F7971E0), - pointer_default(unique) -] - -interface IBDA_VoidTransform : IUnknown -{ - HRESULT - Start ( - void - ); - - HRESULT - Stop ( - void - ); - -} - -//--------------------------------------------------------------------- -// IBDA_NullTransform interface -//--------------------------------------------------------------------- -[ - object, - uuid(DDF15B0D-BD25-11d2-9CA0-00C04F7971E0), - pointer_default(unique) -] - -interface IBDA_NullTransform : IUnknown -{ - HRESULT - Start ( - void - ); - - HRESULT - Stop ( - void - ); - -} - - -//--------------------------------------------------------------------- -// IBDA_FrequencyFilter interface -//--------------------------------------------------------------------- -[ - object, - uuid(71985F47-1CA1-11d3-9CC8-00C04F7971E0), - pointer_default(unique) -] - -interface IBDA_FrequencyFilter : IUnknown -{ - HRESULT - put_Autotune ( - [in] ULONG ulTransponder - ); - - HRESULT - get_Autotune ( - [in, out] ULONG * pulTransponder - ); - - HRESULT - put_Frequency ( - [in] ULONG ulFrequency - ); - - HRESULT - get_Frequency ( - [in, out] ULONG * pulFrequency - ); - - HRESULT - put_Polarity ( - [in] Polarisation Polarity - ); - - HRESULT - get_Polarity ( - [in, out] Polarisation * pPolarity - ); - - HRESULT - put_Range ( - [in] ULONG ulRange - ); - - HRESULT - get_Range ( - [in, out] ULONG * pulRange - ); - - HRESULT - put_Bandwidth ( - [in] ULONG ulBandwidth - ); - - HRESULT - get_Bandwidth ( - [in, out] ULONG * pulBandwidth - ); - - HRESULT - put_FrequencyMultiplier ( - [in] ULONG ulMultiplier - ); - - HRESULT - get_FrequencyMultiplier ( - [in, out] ULONG * pulMultiplier - ); -} - - -//--------------------------------------------------------------------- -// IBDA_LNBInfo interface -//--------------------------------------------------------------------- -[ - object, - uuid(992CF102-49F9-4719-A664-C4F23E2408F4), - pointer_default(unique) -] - -interface IBDA_LNBInfo : IUnknown -{ - HRESULT - put_LocalOscilatorFrequencyLowBand ( - [in] ULONG ulLOFLow - ); - - HRESULT - get_LocalOscilatorFrequencyLowBand ( - [in, out] ULONG * pulLOFLow - ); - - HRESULT - put_LocalOscilatorFrequencyHighBand ( - [in] ULONG ulLOFHigh - ); - - HRESULT - get_LocalOscilatorFrequencyHighBand ( - [in, out] ULONG * pulLOFHigh - ); - - HRESULT - put_HighLowSwitchFrequency ( - [in] ULONG ulSwitchFrequency - ); - - HRESULT - get_HighLowSwitchFrequency ( - [in, out] ULONG * pulSwitchFrequency - ); -} - - -//--------------------------------------------------------------------- -// IBDA_AutoDemodulate interface -//--------------------------------------------------------------------- -[ - object, - uuid(DDF15B12-BD25-11d2-9CA0-00C04F7971E0), - pointer_default(unique) -] - -interface IBDA_AutoDemodulate : IUnknown -{ - HRESULT - put_AutoDemodulate ( - void - ); -} - -//--------------------------------------------------------------------- -// IBDA_DigitalDemodulator interface -//--------------------------------------------------------------------- -[ - object, - uuid(EF30F379-985B-4d10-B640-A79D5E04E1E0), - pointer_default(unique) -] - -interface IBDA_DigitalDemodulator : IUnknown -{ - HRESULT - put_ModulationType ( - [in] ModulationType * pModulationType - ); - - HRESULT - get_ModulationType ( - [in, out] ModulationType * pModulationType - ); - - HRESULT - put_InnerFECMethod ( - [in] FECMethod * pFECMethod - ); - - HRESULT - get_InnerFECMethod ( - [in, out] FECMethod * pFECMethod - ); - - HRESULT - put_InnerFECRate ( - [in] BinaryConvolutionCodeRate * pFECRate - ); - - HRESULT - get_InnerFECRate ( - [in, out] BinaryConvolutionCodeRate * pFECRate - ); - - HRESULT - put_OuterFECMethod ( - [in] FECMethod * pFECMethod - ); - - HRESULT - get_OuterFECMethod ( - [in, out] FECMethod * pFECMethod - ); - - HRESULT - put_OuterFECRate ( - [in] BinaryConvolutionCodeRate * pFECRate - ); - - HRESULT - get_OuterFECRate ( - [in, out] BinaryConvolutionCodeRate * pFECRate - ); - - HRESULT - put_SymbolRate ( - [in] ULONG * pSymbolRate - ); - - HRESULT - get_SymbolRate ( - [in, out] ULONG * pSymbolRate - ); - - HRESULT - put_SpectralInversion ( - [in] SpectralInversion * pSpectralInversion - ); - - HRESULT - get_SpectralInversion ( - [in, out] SpectralInversion * pSpectralInversion - ); -} - -typedef enum -{ - KSPROPERTY_IPSINK_MULTICASTLIST, - KSPROPERTY_IPSINK_ADAPTER_DESCRIPTION, - KSPROPERTY_IPSINK_ADAPTER_ADDRESS - -} KSPROPERTY_IPSINK; - - - -//--------------------------------------------------------------------- -// IBDA_IPSinkControl interface (mutlimedia\filters.ks\ipsink) -// IBDA_IPSinkInfo interface -// -// IBDA_IPSinkControl is no longer being supported for Ring3 clients. -// Use the BDA_IPSinkInfo interface instead. -//--------------------------------------------------------------------- - -[ - object, - uuid(3F4DC8E2-4050-11d3-8F4B-00C04F7971E2), - pointer_default(unique), - helpstring("Not supported - Use IBDA_IPSinkInfo instead") -] -interface IBDA_IPSinkControl : IUnknown -{ - HRESULT GetMulticastList ( - [in, out] unsigned long *pulcbSize, - [in, out] BYTE **pbBuffer - ); - - - HRESULT GetAdapterIPAddress ( - [in,out] unsigned long *pulcbSize, - [in,out] BYTE **pbBuffer - ); - -} - -[ - object, - uuid(A750108F-492E-4d51-95F7-649B23FF7AD7), - pointer_default(unique) -] -interface IBDA_IPSinkInfo : IUnknown -{ - HRESULT get_MulticastList ( // returns N 6-byte 802.3 IP addreses. - [in, out] ULONG * pulcbAddresses, // 6*N - [out, size_is(*pulcbAddresses)] BYTE **ppbAddressList // Allocated by caller, must deallocate in callee with CoTaskMemFree() - ); - - HRESULT get_AdapterIPAddress ( - [out] BSTR *pbstrBuffer - ); - - HRESULT get_AdapterDescription ( - [out] BSTR *pbstrBuffer - ); -} -// -// mpeg-2 demultiplexer-specific interfaces follow -// - -//--------------------------------------------------------------------- -// IEnumPIDMap interface -//--------------------------------------------------------------------- - -#ifdef REMOVE_THESE -typedef enum { - MEDIA_TRANSPORT_PACKET, // complete TS packet e.g. pass-through mode - MEDIA_ELEMENTARY_STREAM, // PES payloads; audio/video only - MEDIA_MPEG2_PSI, // PAT, PMT, CAT, Private - MEDIA_TRANSPORT_PAYLOAD // gathered TS packet payloads (PES packets, etc...) -} MEDIA_SAMPLE_CONTENT ; - -typedef struct { - ULONG ulPID ; - MEDIA_SAMPLE_CONTENT MediaSampleContent ; -} PID_MAP ; -#endif // REMOVE_THESE - -[ - object, - uuid (afb6c2a2-2c41-11d3-8a60-0000f81e0e4a), - pointer_default(unique) -] -interface IEnumPIDMap : IUnknown -{ - HRESULT - Next ( - [in] ULONG cRequest, - [in, out, size_is (cRequest)] PID_MAP * pPIDMap, - [out] ULONG * pcReceived - ) ; - - HRESULT - Skip ( - [in] ULONG cRecords - ) ; - - HRESULT - Reset ( - ) ; - - HRESULT - Clone ( - [out] IEnumPIDMap ** ppIEnumPIDMap - ) ; -} ; - -//--------------------------------------------------------------------- -// IMPEG2PIDMap interface -//--------------------------------------------------------------------- - -[ - object, - uuid (afb6c2a1-2c41-11d3-8a60-0000f81e0e4a), - pointer_default(unique) -] -interface IMPEG2PIDMap : IUnknown -{ - HRESULT - MapPID ( - [in] ULONG culPID, - [in] ULONG * pulPID, - [in] MEDIA_SAMPLE_CONTENT MediaSampleContent - ) ; - - HRESULT - UnmapPID ( - [in] ULONG culPID, - [in] ULONG * pulPID - ) ; - - HRESULT - EnumPIDMap ( - [out] IEnumPIDMap ** pIEnumPIDMap - ) ; -} ; - - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// The following is the original contents of this header from -// the DirectX 8.0 SDK. -// -///////////////////////////////////////////////////////////////////////////// - -#else // DirectX 8.0 content - - - //--------------------------------------------------------------------- - // - // IBDA_NetworkProvider interface - // - // Implemented by a BDA Network Provider - // - // Used by a BDA device filter to register itself with - // a Network Provider and query information about the - // the current tuning request. - // - //--------------------------------------------------------------------- - [ - object, - uuid(fd501041-8ebe-11ce-8183-00aa00577da2), - pointer_default(unique) - ] - - interface IBDA_NetworkProvider : IUnknown - { - - HRESULT - PutSignalSource ( - [in] ULONG ulSignalSource - ); - - - HRESULT - GetSignalSource ( - [in, out] ULONG * pulSignalSource - ); - - HRESULT - GetNetworkType ( - [in, out] GUID * pguidNetworkType - ); - - HRESULT - PutTuningSpace ( - [in] REFGUID guidTuningSpace - ); - - HRESULT - GetTuningSpace ( - [in, out] GUID * pguidTuingSpace - ); - - HRESULT - RegisterDeviceFilter ( - [in] IUnknown * pUnkFilterControl, - [in, out] ULONG * ppvRegisitrationContext - ); - - HRESULT - UnRegisterDeviceFilter ( - [in] ULONG pvRegistrationContext - ); - - } - - - //--------------------------------------------------------------------- - // - // IBDA_EthernetFilter interface - // - // Implemented by a BDA Network Provider - // - // Used by an Ethernet Network Data Sink filter (eg. IPSink) to - // request that the Network Provider make its best effort to tune - // to the stream(s) on which a list of Ethernet multicast addresses - // may be transmitted. - // - // Addresses in the address list are byte aligned in Network order. - // UlcbAddresses will always be an integer multiple of the - // size of an ethernet address. - // - //--------------------------------------------------------------------- - [ - object, - uuid(71985F43-1CA1-11d3-9CC8-00C04F7971E0), - pointer_default(unique) - ] - - interface IBDA_EthernetFilter : IUnknown - { - HRESULT - GetMulticastListSize ( - [in, out] ULONG * pulcbAddresses - ); - - HRESULT - PutMulticastList ( - [in] ULONG ulcbAddresses, - [in, size_is(ulcbAddresses)] BYTE pAddressList [] - ); - - HRESULT - GetMulticastList ( - [in, out] ULONG * pulcbAddresses, - [out, size_is(*pulcbAddresses)] BYTE pAddressList [] - ); - - HRESULT - PutMulticastMode ( - [in] ULONG ulModeMask - ); - - HRESULT - GetMulticastMode ( - [out] ULONG * pulModeMask - ); - - } - - - - //--------------------------------------------------------------------- - // - // IBDA_IPV4Filter interface - // - // Implemented by a BDA Network Provider - // - // Used by an IPv4 Network Data Sink filter to request - // that the Network Provider make its best effort to tune - // to the stream(s) on which a list of IPv4 multicast addresses - // may be transmitted. - // - // Addresses in the address list are byte aligned in Network order. - // UlcbAddresses will always be an integer multiple of the - // size of an IPv4 address. - // - //--------------------------------------------------------------------- - [ - object, - uuid(71985F44-1CA1-11d3-9CC8-00C04F7971E0), - pointer_default(unique) - ] - - interface IBDA_IPV4Filter : IUnknown - { - - HRESULT - GetMulticastListSize ( - [in, out] ULONG * pulcbAddresses - ); - - HRESULT - PutMulticastList ( - [in] ULONG ulcbAddresses, - [in, size_is(ulcbAddresses)] BYTE pAddressList [] - ); - - HRESULT - GetMulticastList ( - [in, out] ULONG * pulcbAddresses, - [out, size_is(*pulcbAddresses)] BYTE pAddressList [] - ); - - HRESULT - PutMulticastMode ( - [in] ULONG ulModeMask - ); - - HRESULT - GetMulticastMode ( - [out] ULONG* pulModeMask - ); - } - - - - //--------------------------------------------------------------------- - // - // IBDA_IPV6Filter interface - // - // Implemented by a BDA Network Provider - // - // Used by an IPv6 Network Data Sink filter to request - // that the Network Provider make its best effort to tune - // to the stream(s) on which a list of IPv6 multicast addresses - // may be transmitted. - // - // Addresses in the address list are byte aligned in Network order. - // UlcbAddresses will always be an integer multiple of the - // size of an IPv6 address. - // - //--------------------------------------------------------------------- - [ - object, - uuid(E1785A74-2A23-4fb3-9245-A8F88017EF33), - pointer_default(unique) - ] - - interface IBDA_IPV6Filter : IUnknown - { - - HRESULT - GetMulticastListSize ( - [in, out] ULONG * pulcbAddresses - ); - - HRESULT - PutMulticastList ( - [in] ULONG ulcbAddresses, - [in, size_is(ulcbAddresses)] BYTE pAddressList [] - ); - - HRESULT - GetMulticastList ( - [in, out] ULONG * pulcbAddresses, - [out, size_is(*pulcbAddresses)] BYTE pAddressList [] - ); - - HRESULT - PutMulticastMode ( - [in] ULONG ulModeMask - ); - - HRESULT - GetMulticastMode ( - [out] ULONG* pulModeMask - ); - } - - - - //--------------------------------------------------------------------- - // - // IBDA_DeviceControl interface - // - // Implemented by a BDA Device Filter - // - // Used by the Network Provider to commit a series of changes - // on a BDA device filter. The device filter validates and - // accumulates all changes requested after StartChanges(). It - // effects the accumulated list of changes when CommitChanges() is - // called. - // - //--------------------------------------------------------------------- - [ - object, - uuid(FD0A5AF3-B41D-11d2-9C95-00C04F7971E0), - pointer_default(unique) - ] - - interface IBDA_DeviceControl : IUnknown - { - HRESULT - StartChanges ( - void - ); - - HRESULT - CheckChanges ( - void - ); - - HRESULT - CommitChanges ( - void - ); - - HRESULT - GetChangeState ( - [in, out] ULONG * pState - ); - - } - - - - //--------------------------------------------------------------------- - // - // IBDA_PinControl interface - // - // Implemented by a BDA Device Filter's Pin - // - // Used by the Network Provider to determine the BDA PinID and - // PinType on a BDA Filter's Pin - // - //--------------------------------------------------------------------- - [ - object, - uuid(0DED49D5-A8B7-4d5d-97A1-12B0C195874D), - pointer_default(unique) - ] - - interface IBDA_PinControl : IUnknown - { - HRESULT - GetPinID ( - [in, out] ULONG * pulPinID - ); - - HRESULT - GetPinType ( - [in, out] ULONG * pulPinType - ); - } - - //--------------------------------------------------------------------- - // - // IBDA_SignalProperties interface - // - // Implemented by a BDA Device Filter - // - // BDA Signal Properties is used by a Network Provider to inform - // a BDA Device Filter about the current tuning request. The - // Network Provider will call the Put functions when the BDA - // device is first registered with the Network Provider and whenever - // the current tuning request is modified. - // - //--------------------------------------------------------------------- - [ - object, - uuid(D2F1644B-B409-11d2-BC69-00A0C9EE9E16), - pointer_default(unique) - ] - - interface IBDA_SignalProperties : IUnknown - { - HRESULT - PutNetworkType ( - [in] REFGUID guidNetworkType - ); - - HRESULT - GetNetworkType ( - [in, out] GUID * pguidNetworkType - ); - - HRESULT - PutSignalSource ( - [in] ULONG ulSignalSource - ); - - HRESULT - GetSignalSource ( - [in, out] ULONG * pulSignalSource - ); - - HRESULT - PutTuningSpace ( - [in] REFGUID guidTuningSpace - ); - - HRESULT - GetTuningSpace ( - [in, out] GUID * pguidTuingSpace - ); - } - - - //--------------------------------------------------------------------- - // - // IBDA_Topology interface - // - // Implemented by a BDA Device Filter - // - // Used by the Network Provider to query a BDA Device Filter's - // possible topologies (template topology) and to configure - // the device with an appropriate topology for the current - // tuning request. It is also used to get an IUnknown to - // a control node which may be used to set specific tuning - // information. - // - //--------------------------------------------------------------------- - [ - object, - uuid(A14EE835-0A23-11d3-9CC7-00C04F7971E0), - pointer_default(unique) - ] - - interface IBDA_Topology : IUnknown - { - HRESULT - GetNodeTypes ( - [in, out] ULONG * pulcNodeTypes, - [in] ULONG ulcNodeTypesMax, - [in, out, size_is (ulcNodeTypesMax)] ULONG rgulNodeTypes[] - ); - - - HRESULT - GetNodeInterfaces ( - [in] ULONG ulNodeType, - [in, out] ULONG * pulcInterfaces, - [in] ULONG ulcInterfacesMax, - [in, out, size_is (ulcInterfacesMax)] GUID * rgguidInterfaces[] - ); - - HRESULT - GetPinTypes ( - [in, out] ULONG * pulcPinTypes, - [in] ULONG ulcPinTypesMax, - [in, out, size_is (ulcPinTypesMax)] ULONG rgulPinTypes[] - ); - - HRESULT - GetTemplateConnections ( - [in, out] ULONG * pulcConnections, - [in] ULONG ulcConnectionsMax, - [in, out, size_is (ulcConnectionsMax)] BDA_TEMPLATE_CONNECTION rgConnections[] - ); - - HRESULT - CreatePin ( - [in] ULONG ulPinType, - [in, out] ULONG * pulPinId - ); - - HRESULT - DeletePin ( - [in] ULONG ulPinId - ); - - HRESULT - SetMediaType ( - [in] ULONG ulPinId, - [in] AM_MEDIA_TYPE * pMediaType - ); - - HRESULT - SetMedium ( - [in] ULONG ulPinId, - [in] REGPINMEDIUM * pMedium - ); - - HRESULT - CreateTopology ( - [in] ULONG ulInputPinId, - [in] ULONG ulOutputPinId - ); - - HRESULT - GetControlNode ( - [in] ULONG ulInputPinId, - [in] ULONG ulOutputPinId, - [in] ULONG ulNodeType, - [in, out] IUnknown ** ppControlNode - ); - } - - //--------------------------------------------------------------------- - // IBDA_VoidTransform interface - //--------------------------------------------------------------------- - [ - object, - uuid(71985F46-1CA1-11d3-9CC8-00C04F7971E0), - pointer_default(unique) - ] - - interface IBDA_VoidTransform : IUnknown - { - HRESULT - Start ( - void - ); - - HRESULT - Stop ( - void - ); - - } - - //--------------------------------------------------------------------- - // IBDA_NullTransform interface - //--------------------------------------------------------------------- - [ - object, - uuid(DDF15B0D-BD25-11d2-9CA0-00C04F7971E0), - pointer_default(unique) - ] - - interface IBDA_NullTransform : IUnknown - { - HRESULT - Start ( - void - ); - - HRESULT - Stop ( - void - ); - - } - - //--------------------------------------------------------------------- - // IBDA_FrequencyFilter interface - //--------------------------------------------------------------------- - [ - object, - uuid(71985F47-1CA1-11d3-9CC8-00C04F7971E0), - pointer_default(unique) - ] - - interface IBDA_FrequencyFilter : IUnknown - { - HRESULT - put_Autotune ( - [in] ULONG * pulTransponder - ); - - HRESULT - put_Frequency ( - [in] ULONG * pulFrequency - ); - - HRESULT - get_Frequency ( - [in, out] ULONG * pulFrequency - ); - - HRESULT - put_Polarity ( - [in] ULONG * pulPolarity - ); - - HRESULT - get_Polarity ( - [in, out] ULONG * pulPolarity - ); - - HRESULT - put_Range ( - [in] ULONG * pulRange - ); - - HRESULT - get_Range ( - [in, out] ULONG * pulRange - ); - } - - //--------------------------------------------------------------------- - // IBDA_AutoDemodulate interface - //--------------------------------------------------------------------- - [ - object, - uuid(DDF15B12-BD25-11d2-9CA0-00C04F7971E0), - pointer_default(unique) - ] - - interface IBDA_AutoDemodulate : IUnknown - { - HRESULT - put_AutoDemodulate ( - void - ); - } - - //--------------------------------------------------------------------- - // IBDA_DigitalDemodulator interface - //--------------------------------------------------------------------- - [ - object, - uuid(EF30F379-985B-4d10-B640-A79D5E04E1E0), - pointer_default(unique) - ] - - interface IBDA_DigitalDemodulator : IUnknown - { - HRESULT - put_ModulationType ( - [in] ModulationType * pModulationType - ); - - HRESULT - get_ModulationType ( - [in, out] ModulationType * pModulationType - ); - - HRESULT - put_InnerFECMethod ( - [in] FECMethod * pFECMethod - ); - - HRESULT - get_InnerFECMethod ( - [in, out] FECMethod * pFECMethod - ); - - HRESULT - put_InnerFECRate ( - [in] BinaryConvolutionCodeRate * pFECRate - ); - - HRESULT - get_InnerFECRate ( - [in, out] BinaryConvolutionCodeRate * pFECRate - ); - - HRESULT - put_OuterFECMethod ( - [in] FECMethod * pFECMethod - ); - - HRESULT - get_OuterFECMethod ( - [in, out] FECMethod * pFECMethod - ); - - HRESULT - put_OuterFECRate ( - [in] BinaryConvolutionCodeRate * pFECRate - ); - - HRESULT - get_OuterFECRate ( - [in, out] BinaryConvolutionCodeRate * pFECRate - ); - - HRESULT - put_SymbolRate ( - [in] ULONG * pSymbolRate - ); - - HRESULT - get_SymbolRate ( - [in, out] ULONG * pSymbolRate - ); - - HRESULT - put_SpectralInversion ( - [in] SpectralInversion * pSpectralInversion - ); - - HRESULT - get_SpectralInversion ( - [in, out] SpectralInversion * pSpectralInversion - ); - } - - typedef enum - { - KSPROPERTY_IPSINK_MULTICASTLIST, - KSPROPERTY_IPSINK_ADAPTER_DESCRIPTION, - KSPROPERTY_IPSINK_ADAPTER_ADDRESS - - } KSPROPERTY_IPSINK; - - - - //--------------------------------------------------------------------- - // IBDA_IPSinkControl interface - //--------------------------------------------------------------------- - - [ - object, - uuid(3F4DC8E2-4050-11d3-8F4B-00C04F7971E2), - pointer_default(unique) - ] - - interface IBDA_IPSinkControl : IUnknown - { - HRESULT GetMulticastList ( - [in, out] unsigned long *pulcbSize, - [in, out] BYTE **pbBuffer - ); - - - HRESULT GetAdapterIPAddress ( - [in,out] unsigned long *pulcbSize, - [in,out] BYTE **pbBuffer - ); - - } - - // - // mpeg-2 demultiplexer-specific interfaces follow - // - - //--------------------------------------------------------------------- - // IEnumPIDMap interface - //--------------------------------------------------------------------- - - #ifdef REMOVE_THESE - typedef enum { - MEDIA_TRANSPORT_PACKET, // complete TS packet e.g. pass-through mode - MEDIA_ELEMENTARY_STREAM, // PES payloads; audio/video only - MEDIA_MPEG2_PSI, // PAT, PMT, CAT, Private - MEDIA_TRANSPORT_PAYLOAD // gathered TS packet payloads (PES packets, etc...) - } MEDIA_SAMPLE_CONTENT ; - - typedef struct { - ULONG ulPID ; - MEDIA_SAMPLE_CONTENT MediaSampleContent ; - } PID_MAP ; - #endif // REMOVE_THESE - - [ - object, - uuid (afb6c2a2-2c41-11d3-8a60-0000f81e0e4a), - pointer_default(unique) - ] - interface IEnumPIDMap : IUnknown - { - HRESULT - Next ( - [in] ULONG cRequest, - [in, out, size_is (cRequest)] PID_MAP * pPIDMap, - [out] ULONG * pcReceived - ) ; - - HRESULT - Skip ( - [in] ULONG cRecords - ) ; - - HRESULT - Reset ( - ) ; - - HRESULT - Clone ( - [out] IEnumPIDMap ** ppIEnumPIDMap - ) ; - } ; - - //--------------------------------------------------------------------- - // IMPEG2PIDMap interface - //--------------------------------------------------------------------- - - [ - object, - uuid (afb6c2a1-2c41-11d3-8a60-0000f81e0e4a), - pointer_default(unique) - ] - interface IMPEG2PIDMap : IUnknown - { - HRESULT - MapPID ( - [in] ULONG culPID, - [in] ULONG * pulPID, - [in] MEDIA_SAMPLE_CONTENT MediaSampleContent - ) ; - - HRESULT - UnmapPID ( - [in] ULONG culPID, - [in] ULONG * pulPID - ) ; - - HRESULT - EnumPIDMap ( - [out] IEnumPIDMap ** pIEnumPIDMap - ) ; - } ; - - -#endif // DirectX 8.0 content \ No newline at end of file diff --git a/import/DirectX8/include/DShowIDL/control.odl b/import/DirectX8/include/DShowIDL/control.odl deleted file mode 100644 index d2bd0826e..000000000 --- a/import/DirectX8/include/DShowIDL/control.odl +++ /dev/null @@ -1,909 +0,0 @@ -//------------------------------------------------------------------------------ -// File: Control.odl -// -// Desc: -// -// Copyright (c) 1999-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - -// Neutral/English language type library for basic Quartz control interfaces - -// the quartz type library defines the basic control interfaces -[ - uuid(56a868b0-0ad4-11ce-b03a-0020af0ba770), - helpstring("ActiveMovie control type library"), - lcid(0x0000), - version(1.0) -] -library QuartzTypeLib -{ - importlib("STDOLE32.TLB"); - - // types are restricted to be automation-compatible - typedef double REFTIME; // ReferenceTime - typedef LONG_PTR OAEVENT; // should be a HANDLE - typedef LONG_PTR OAHWND; // should be an hwnd - - // from strmif.idl - typedef long OAFilterState; - - // collection interface - represents a collection of IUnknowns - // this is used below to collect filter-info objects, registry-filters - // pin-info objects and wrapped media type objects - [ - uuid(56a868b9-0ad4-11ce-b03a-0020af0ba770), - helpstring("Collection"), - odl, - oleautomation, - dual - ] - interface IAMCollection : IDispatch - { - // number of items in collection - [propget] - HRESULT Count( - [out, retval] LONG* plCount); - - // return IUnknown for contained item by index - HRESULT Item( - [in] long lItem, - [out] IUnknown** ppUnk); - - // return IUnknown for an object that implements IEnumVARIANT on - // this collection - [propget] - HRESULT _NewEnum( - [out, retval] IUnknown** ppUnk); - } - - - // core control providing state control - [ - uuid(56a868b1-0ad4-11ce-b03a-0020af0ba770), - helpstring("IMediaControl interface"), - odl, - oleautomation, - dual - ] - interface IMediaControl : IDispatch - { - // methods - HRESULT Run(); - HRESULT Pause(); - HRESULT Stop(); - - //returns the state. same semantics as IMediaFilter::GetState - - HRESULT GetState( - [in] LONG msTimeout, - [out] OAFilterState* pfs); - - // adds and connects filters needed to play the specified file - // (same as IFilterGraph::RenderFile) - HRESULT RenderFile( - [in] BSTR strFilename); - - // adds to the graph the source filter that can read this file, - // and returns an IFilterInfo object for it (actually returns - // an IDispatch for the IFilterInfo object). - HRESULT AddSourceFilter( - [in] BSTR strFilename, - [out] IDispatch**ppUnk); - - // get a collection of IFilterInfo objects representing the - // filters in the graph (returns IDispatch for an object - // that supports IAMCollection - [propget] - HRESULT FilterCollection( - [out, retval] IDispatch** ppUnk); - - // get a collection of IRegFilter objects representing the - // filters available in the registry - [propget] - HRESULT RegFilterCollection( - [out, retval] IDispatch** ppUnk); - - HRESULT StopWhenReady(); - } - - - // provides an event notification scheme passing events - // asynchronously to applications. See also IMediaEventSink in - // strmif.idl and sdk\h\evcodes.h. - // - // this interface behaves as if events are held on a queue. A call to - // IMediaEventSink::Notify will place an event on this queue. Calling - // GetEvent removes the first item off the queue and returns it. Items are - // returned in the order they were queued (there is no priority scheme). - // The event handle is in a signalled state iff the queue is non-empty. - // - // Apps that issue multiple Run calls without always picking up the - // completion events are advised to call GetEvent or WaitForCompletion - // (with a 0 timeout) repeatedly to remove all events from the queue - // when in stopped or paused state before each Run method. - // - // Parameters to events are actually LONG, IUnknown* or BSTR. You need to - // look at evcode.h for details of parameters to a specific event code. - // In order to correctly free resources, always call FreeEventParams - // after receiving an event. - // - - [ - uuid(56a868b6-0ad4-11ce-b03a-0020af0ba770), - helpstring("IMediaEvent interface"), - odl, - oleautomation, - dual - ] - interface IMediaEvent : IDispatch - { - // get back the event handle. This is manual-reset - // (don't - it's reset by the event mechanism) and remains set - // when events are queued, and reset when the queue is empty. - HRESULT GetEventHandle( - [out] OAEVENT * hEvent); - - // remove the next event notification from the head of the queue and - // return it. Waits up to msTimeout millisecs if there are no events. - // if a timeout occurs without any events, this method will return - // E_ABORT, and the value of the event code and other parameters - // is undefined. - // - // If this call returns successfully the caller MUST call - // FreeEventParams(lEventCode, lParam1, lParam2) to release - // resources held inside the event arguments - // - HRESULT GetEvent( - [out] long * lEventCode, - [out] LONG_PTR * lParam1, - [out] LONG_PTR * lParam2, - [in] long msTimeout - ); - - // Calls GetEvent repeatedly discarding events until it finds a - // completion event (EC_COMPLETE, EC_ERRORABORT, or EC_USERABORT). - // The completion event is removed from the queue and returned - // in pEvCode. Note that the object is still in running mode until - // a Pause or Stop call is made. - // If the timeout occurs, *pEvCode will be 0 and E_ABORT will be - // returned. - HRESULT WaitForCompletion( - [in] long msTimeout, - [out] long * pEvCode); - - // cancels any system handling of the specified event code - // and ensures that the events are passed straight to the application - // (via GetEvent) and not handled. A good example of this is - // EC_REPAINT: default handling for this ensures the painting of the - // window and does not get posted to the app. - HRESULT CancelDefaultHandling( - [in] long lEvCode); - - // restore the normal system default handling that may have been - // cancelled by CancelDefaultHandling(). - HRESULT RestoreDefaultHandling( [in] long lEvCode); - - // Free any resources associated with the parameters to an event. - // Event parameters may be LONGs, IUnknown* or BSTR. No action - // is taken with LONGs. IUnknown are passed addrefed and need a - // Release call. BSTR are allocated by the task allocator and will be - // freed by calling the task allocator. - HRESULT FreeEventParams( - [in] long lEvCode, - [in] LONG_PTR lParam1, - [in] LONG_PTR lParam2 - ); - } - - [ - uuid(56a868c0-0ad4-11ce-b03a-0020af0ba770), - helpstring("IMediaEventEx interface"), - odl - ] - interface IMediaEventEx : IMediaEvent - { - - // Register a window to send messages to when events occur - // Parameters: - // - // hwnd - handle of window to notify - - // pass NULL to stop notification - // lMsg - Message id to pass messages with - // lInstanceData - will come back in lParam - // - // The event information must still be retrived by a call - // to GetEvent when the window message is received. - // - // Multiple events may be notified with one window message. - // - HRESULT SetNotifyWindow( - [in] OAHWND hwnd, - [in] long lMsg, - [in] LONG_PTR lInstanceData - ); - - // Turn events notification on or off - // lNoNotify = 0x00 event notification is ON - // lNoNotify = 0x01 event notification is OFF. The - // handle returned by GetEventHandle will be signalled at - // end of stream - HRESULT SetNotifyFlags( - [in] long lNoNotifyFlags - ); - HRESULT GetNotifyFlags( - [out] long *lplNoNotifyFlags - ); - } - - - - - // seek/cueing for positional media - [ - uuid(56a868b2-0ad4-11ce-b03a-0020af0ba770), - helpstring("IMediaPosition interface"), - odl, - oleautomation, - dual - ] - interface IMediaPosition : IDispatch - { - // properties - - [propget] - HRESULT Duration( - [out, retval] REFTIME* plength); - - [propput] - HRESULT CurrentPosition( - [in] REFTIME llTime); - - [propget] - HRESULT CurrentPosition( - [out, retval] REFTIME* pllTime); - - [propget] - HRESULT StopTime( - [out, retval] REFTIME* pllTime); - [propput] - HRESULT StopTime( - [in] REFTIME llTime); - - [propget] - HRESULT PrerollTime( - [out, retval] REFTIME* pllTime); - [propput] - HRESULT PrerollTime( - [in] REFTIME llTime); - - [propput] - HRESULT Rate( - [in] double dRate); - [propget] - HRESULT Rate( - [out, retval] double * pdRate); - - HRESULT CanSeekForward([out, retval] LONG *pCanSeekForward); - HRESULT CanSeekBackward([out, retval] LONG *pCanSeekBackward); - } - - // basic audio-related functionality - [ - uuid(56a868b3-0ad4-11ce-b03a-0020af0ba770), - helpstring("IBasicAudio interface"), - odl, - oleautomation, - dual - ] - interface IBasicAudio : IDispatch - { - // properties - - [propput] - HRESULT Volume( - [in] long lVolume); - [propget] - HRESULT Volume( - [out, retval] long * plVolume); - - [propput] - HRESULT Balance( - [in] long lBalance); - [propget] - HRESULT Balance( - [out, retval] long * plBalance); - } - - // basic window-related functionality - [ - uuid(56a868b4-0ad4-11ce-b03a-0020af0ba770), - helpstring("IVideoWindow interface"), - odl, - oleautomation, - dual - ] - interface IVideoWindow : IDispatch - { - // properties - - // set and get the window title caption - - [propput] - HRESULT Caption([in] BSTR strCaption); - [propget] - HRESULT Caption([out, retval] BSTR *strCaption); - - // change the window styles (as per Win32) - - [propput] - HRESULT WindowStyle([in] long WindowStyle); - [propget] - HRESULT WindowStyle([out, retval] long *WindowStyle); - - // change the extended window styles (as per Win32) - - [propput] - HRESULT WindowStyleEx([in] long WindowStyleEx); - [propget] - HRESULT WindowStyleEx([out, retval] long *WindowStyleEx); - - [propput] - HRESULT AutoShow([in] long AutoShow); - [propget] - HRESULT AutoShow([out, retval] long *AutoShow); - - // change the window state (as per Win32) - - [propput] - HRESULT WindowState([in] long WindowState); - [propget] - HRESULT WindowState([out, retval] long *WindowState); - - // realise the palette in the background - - [propput] - HRESULT BackgroundPalette([in] long BackgroundPalette); - [propget] - HRESULT BackgroundPalette([out, retval] long *pBackgroundPalette); - - // affect the visibility of the window - - [propput] - HRESULT Visible([in] long Visible); - [propget] - HRESULT Visible([out, retval] long *pVisible); - - // change the desktop position of the video window - - [propput] - HRESULT Left([in] long Left); - [propget] - HRESULT Left([out, retval] long *pLeft); - - [propput] - HRESULT Width([in] long Width); - [propget] - HRESULT Width([out, retval] long *pWidth); - - [propput] - HRESULT Top([in] long Top); - [propget] - HRESULT Top([out, retval] long *pTop); - - [propput] - HRESULT Height([in] long Height); - [propget] - HRESULT Height([out, retval] long *pHeight); - - // change the owning window of the video - - [propput] - HRESULT Owner([in] OAHWND Owner); - [propget] - HRESULT Owner([out, retval] OAHWND *Owner); - - // change the window to receive posted messages - - [propput] - HRESULT MessageDrain([in] OAHWND Drain); - [propget] - HRESULT MessageDrain([out, retval] OAHWND *Drain); - - [propget] - HRESULT BorderColor([out, retval] long *Color); - - [propput] - HRESULT BorderColor([in] long Color); - - [propget] - HRESULT FullScreenMode([out, retval] long *FullScreenMode); - - [propput] - HRESULT FullScreenMode([in] long FullScreenMode); - - // methods - - // ask the renderer to grab it's window the foreground - // and optionally also give the window the input focus - HRESULT SetWindowForeground([in] long Focus); - - // owners should pass WM_PALETTECHANGED and WM_SYSCOLORCHANGE - // messages on the filter graph so they can be distributed - // otherwise child renderers never see these messages go by - - HRESULT NotifyOwnerMessage([in] OAHWND hwnd, - [in] long uMsg, - [in] LONG_PTR wParam, - [in] LONG_PTR lParam - ); - - // get and set the window position on the desktop - - HRESULT SetWindowPosition([in] long Left, - [in] long Top, - [in] long Width, - [in] long Height); - - HRESULT GetWindowPosition([out] long *pLeft, - [out] long *pTop, - [out] long *pWidth, - [out] long *pHeight); - - // get the ideal sizes for the video image playback (client) area - - HRESULT GetMinIdealImageSize([out] long *pWidth,[out] long *pHeight); - HRESULT GetMaxIdealImageSize([out] long *pWidth,[out] long *pHeight); - - // get the restored window size when we're maximised or iconic - - HRESULT GetRestorePosition([out] long *pLeft, - [out] long *pTop, - [out] long *pWidth, - [out] long *pHeight); - - // show and hide cursors useful when fullscreen - HRESULT HideCursor([in] long HideCursor); - HRESULT IsCursorHidden([out] long *CursorHidden); - } - - // basic video-related functionality - [ - uuid(56a868b5-0ad4-11ce-b03a-0020af0ba770), - helpstring("IBasicVideo interface"), - odl, - oleautomation, - dual - ] - interface IBasicVideo : IDispatch - { - // properties - - // Video specific (approximate) bit and frame rates - - [propget] - HRESULT AvgTimePerFrame([out, retval] REFTIME *pAvgTimePerFrame); - - [propget] - HRESULT BitRate([out, retval] long *pBitRate); - - [propget] - HRESULT BitErrorRate([out, retval] long *pBitErrorRate); - - // read the native video size - - [propget] - HRESULT VideoWidth([out, retval] long *pVideoWidth); - - [propget] - HRESULT VideoHeight([out, retval] long *pVideoHeight); - - // change the source rectangle for the video - - [propput] - HRESULT SourceLeft([in] long SourceLeft); - [propget] - HRESULT SourceLeft([out, retval] long *pSourceLeft); - - [propput] - HRESULT SourceWidth([in] long SourceWidth); - [propget] - HRESULT SourceWidth([out, retval] long *pSourceWidth); - - [propput] - HRESULT SourceTop([in] long SourceTop); - [propget] - HRESULT SourceTop([out, retval] long *pSourceTop); - - [propput] - HRESULT SourceHeight([in] long SourceHeight); - [propget] - HRESULT SourceHeight([out, retval] long *pSourceHeight); - - // change the destination rectangle for the video - - [propput] - HRESULT DestinationLeft([in] long DestinationLeft); - [propget] - HRESULT DestinationLeft([out, retval] long *pDestinationLeft); - - [propput] - HRESULT DestinationWidth([in] long DestinationWidth); - [propget] - HRESULT DestinationWidth([out, retval] long *pDestinationWidth); - - [propput] - HRESULT DestinationTop([in] long DestinationTop); - [propget] - HRESULT DestinationTop([out, retval] long *pDestinationTop); - - [propput] - HRESULT DestinationHeight([in] long DestinationHeight); - [propget] - HRESULT DestinationHeight([out, retval] long *pDestinationHeight); - - // methods - - // get and set the source rectangle position - - HRESULT SetSourcePosition([in] long Left, - [in] long Top, - [in] long Width, - [in] long Height); - - HRESULT GetSourcePosition([out] long *pLeft, - [out] long *pTop, - [out] long *pWidth, - [out] long *pHeight); - - HRESULT SetDefaultSourcePosition(); - - // get and set the destination rectangle position - - HRESULT SetDestinationPosition([in] long Left, - [in] long Top, - [in] long Width, - [in] long Height); - - HRESULT GetDestinationPosition([out] long *pLeft, - [out] long *pTop, - [out] long *pWidth, - [out] long *pHeight); - - HRESULT SetDefaultDestinationPosition(); - - // get the native video dimensions - - HRESULT GetVideoSize([out] long *pWidth,[out] long *pHeight); - - // get all or some of the current video palette - - HRESULT GetVideoPaletteEntries([in] long StartIndex, - [in] long Entries, - [out] long *pRetrieved, - [out] long *pPalette); - - HRESULT GetCurrentImage([in,out] long *pBufferSize, - [out] long *pDIBImage); - - // are we using a default source or destination - - HRESULT IsUsingDefaultSource(); - HRESULT IsUsingDefaultDestination(); - } - - // interface extension to IBasicVideo to return preferred aspect ratio - [ - uuid(329bb360-f6ea-11d1-9038-00a0c9697298), - helpstring("IBasicVideo2"), - odl - ] - interface IBasicVideo2 : IBasicVideo - { - // This may not match the native video dimensions because of - // non-square pixels or whatever. - // The video may not always be displayed in the preferred - // aspect ratio for performance reasons - - HRESULT GetPreferredAspectRatio([out] long *plAspectX, - [out] long *plAspectY); - } - - // interface returned to a command that has been queued via IQueueCommand - [ - uuid(56a868b8-0ad4-11ce-b03a-0020af0ba770), - helpstring("IDeferredCommand"), - odl - ] - interface IDeferredCommand : IUnknown - { - HRESULT Cancel(); - HRESULT Confidence( - [out] LONG* pConfidence); - HRESULT Postpone( - [in] REFTIME newtime); - // return value is S_OK if completed. phrResult is set to the - // result of the deferred command. - HRESULT GetHResult( - [out] HRESULT* phrResult); - }; - - // queue an IDispatch-based command for execution at a specified time - [ - uuid(56a868b7-0ad4-11ce-b03a-0020af0ba770), - helpstring("IQueueCommand"), - odl - ] - interface IQueueCommand : IUnknown - { - HRESULT InvokeAtStreamTime( - [out] IDeferredCommand** pCmd, - [in] REFTIME time, // at this streamtime - [in] GUID* iid, // call this interface - [in] long dispidMethod, // ..and this method - [in] short wFlags, // method/property - [in] long cArgs, // count of args - [in] VARIANT* pDispParams, // actual args - [in, out] VARIANT* pvarResult, // return value - [out] short* puArgErr // which arg in error - ); - - HRESULT InvokeAtPresentationTime( - [out] IDeferredCommand** pCmd, - [in] REFTIME time, // at this presentation time - [in] GUID* iid, // call this interface - [in] long dispidMethod, // ..and this method - [in] short wFlags, // method/property - [in] long cArgs, // count of args - [in] VARIANT* pDispParams, // actual args - [in, out] VARIANT* pvarResult, // return value - [out] short* puArgErr // which arg in error - ); - - }; - - - - // the filgraph object (CLSID_Filgraph) - [ - uuid(e436ebb3-524f-11ce-9f53-0020af0ba770), - helpstring("Filtergraph type info") - ] - coclass FilgraphManager - { - [default] interface IMediaControl; - interface IMediaEvent; - interface IMediaPosition; - interface IBasicAudio; - interface IBasicVideo; - interface IVideoWindow; - - }; - - - // represents a filter (you can't QI for IBaseFilter from this object) - [ - uuid(56a868ba-0ad4-11ce-b03a-0020af0ba770), - helpstring("FilterInfo"), - odl, - oleautomation, - dual - ] - interface IFilterInfo : IDispatch - { - // find a pin given an id - returns an object supporting - // IPinInfo - HRESULT FindPin( - [in] BSTR strPinID, - [out] IDispatch** ppUnk); - - // filter name - [propget] - HRESULT Name( - [out, retval] BSTR* strName); - - // Vendor info string - [propget] - HRESULT VendorInfo( - [out, retval] BSTR* strVendorInfo); - - // returns the actual filter object (supports IBaseFilter) - [propget] - HRESULT Filter( - [out, retval] IUnknown **ppUnk); - - // returns an IAMCollection object containing the PinInfo objects - // for this filter - [propget] - HRESULT Pins( - [out, retval] IDispatch ** ppUnk); - - // returns -1 if true or 0 if false (OATRUE/FALSE) - [propget] - HRESULT IsFileSource( - [out, retval] LONG * pbIsSource); - - [propget] - HRESULT Filename( - [out, retval] BSTR* pstrFilename); - - [propput] - HRESULT Filename( - [in] BSTR strFilename); - } - - [ - uuid(56a868bb-0ad4-11ce-b03a-0020af0ba770), - helpstring("Registry Filter Info"), - odl, - oleautomation, - dual - ] - interface IRegFilterInfo : IDispatch - { - // get the name of this filter - [propget] - HRESULT Name( - [out, retval] BSTR* strName); - - - // make an instance of this filter, add it to the graph and - // return an IFilterInfo for it. - HRESULT Filter( - [out] IDispatch** ppUnk); - } - - // wrapper for a media type - [ - uuid(56a868bc-0ad4-11ce-b03a-0020af0ba770), - helpstring("Media Type"), - odl, - oleautomation, - dual - ] - interface IMediaTypeInfo : IDispatch - { - // get the major type GUID as a string - [propget] - HRESULT Type( - [out, retval] BSTR* strType); - - // get the subtype GUID as a string - [propget] - HRESULT Subtype( - [out, retval] BSTR* strType); - } - - [ - uuid(56a868bd-0ad4-11ce-b03a-0020af0ba770), - helpstring("Pin Info"), - odl, - oleautomation, - dual - ] - interface IPinInfo : IDispatch - { - // get the pin object (IUnknown for an object that - // supports IPin - [propget] - HRESULT Pin( - [out, retval] IUnknown** ppUnk); - - // get the PinInfo object for the pin we are connected to - [propget] - HRESULT ConnectedTo( - [out, retval] IDispatch** ppUnk); - - // get the media type on this connection - returns an - // object supporting IMediaTypeInfo - [propget] - HRESULT ConnectionMediaType( - [out, retval] IDispatch** ppUnk); - - - // return the FilterInfo object for the filter this pin - // is part of - [propget] - HRESULT FilterInfo( - [out, retval] IDispatch** ppUnk); - - // get the name of this pin - [propget] - HRESULT Name( - [out, retval] BSTR* ppUnk); - - // pin direction - [propget] - HRESULT Direction( - [out, retval] LONG *ppDirection); - - // PinID - can pass to IFilterInfo::FindPin - [propget] - HRESULT PinID( - [out, retval] BSTR* strPinID); - - // collection of preferred media types (IAMCollection) - [propget] - HRESULT MediaTypes( - [out, retval] IDispatch** ppUnk); - - // Connect to the following pin, using other transform - // filters as necessary. pPin can support either IPin or IPinInfo - HRESULT Connect( - [in] IUnknown* pPin); - - // Connect directly to the following pin, not using any intermediate - // filters - HRESULT ConnectDirect( - [in] IUnknown* pPin); - - // Connect directly to the following pin, using the specified - // media type only. pPin is an object that must support either - // IPin or IPinInfo, and pMediaType must support IMediaTypeInfo. - HRESULT ConnectWithType( - [in] IUnknown * pPin, - [in] IDispatch * pMediaType); - - // disconnect this pin and the corresponding connected pin from - // each other. (Calls IPin::Disconnect on both pins). - HRESULT Disconnect(void); - - // render this pin using any necessary transform and rendering filters - HRESULT Render(void); - } - - //-------------------------------------------------------------------- - // - // IAMStats - statistics - // - // Note that the calls using an index are likely to be much faster - //-------------------------------------------------------------------- - - [ - uuid(bc9bcf80-dcd2-11d2-abf6-00a0c905f375), - helpstring("Statistics"), - odl, - oleautomation, - dual - ] - interface IAMStats : IDispatch { - // Reset all stats - HRESULT Reset(); - - // Get number of stats collected - [propget] - HRESULT Count( - [out, retval] LONG* plCount); - - // Pull out a specific value by position - HRESULT GetValueByIndex([in] long lIndex, - [out] BSTR *szName, - [out] long *lCount, - [out] double *dLast, - [out] double *dAverage, - [out] double *dStdDev, - [out] double *dMin, - [out] double *dMax); - - // Pull out a specific value by name - HRESULT GetValueByName([in] BSTR szName, - [out] long *lIndex, - [out] long *lCount, - [out] double *dLast, - [out] double *dAverage, - [out] double *dStdDev, - [out] double *dMin, - [out] double *dMax); - - - // The calls below are for generators of statistics - - // Return the index for a string - optinally create - HRESULT GetIndex([in] BSTR szName, - [in] long lCreate, - [out] long *plIndex); - - // Add a new value - HRESULT AddValue([in] long lIndex, - [in] double dValue); - } -}; diff --git a/import/DirectX8/include/DShowIDL/ddstream.idl b/import/DirectX8/include/DShowIDL/ddstream.idl deleted file mode 100644 index 8b3a51907..000000000 --- a/import/DirectX8/include/DShowIDL/ddstream.idl +++ /dev/null @@ -1,86 +0,0 @@ -//------------------------------------------------------------------------------ -// File: DDStream.idl -// -// Desc: Used by MIDL tool to generate ddstream.h -// -// Copyright (c) 1998-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -import "unknwn.idl"; -import "mmstream.idl"; - -cpp_quote("//") -cpp_quote("// The following declarations within the 'if 0' block are dummy typedefs used to make") -cpp_quote("// the ddstream.idl file build. The actual definitions are contained in DDRAW.H") -cpp_quote("//") -cpp_quote("#if 0") -typedef void * LPDDSURFACEDESC; -typedef struct tDDSURFACEDESC DDSURFACEDESC; -cpp_quote("#endif") -cpp_quote("#include ") - -enum { - DDSFF_PROGRESSIVERENDER = 0x00000001 -}; - -interface IDirectDraw; -interface IDirectDrawSurface; -interface IDirectDrawPalette; - -interface IDirectDrawMediaStream; -interface IDirectDrawStreamSample; - -// IDirectDrawMediaStream -[ -object, -local, -uuid(F4104FCE-9A70-11d0-8FDE-00C04FD9189D), -pointer_default(unique) -] -interface IDirectDrawMediaStream : IMediaStream -{ - HRESULT GetFormat( - [out] DDSURFACEDESC *pDDSDCurrent, - [out] IDirectDrawPalette **ppDirectDrawPalette, - [out] DDSURFACEDESC *pDDSDDesired, - [out] DWORD *pdwFlags); - - HRESULT SetFormat( - [in] const DDSURFACEDESC *pDDSurfaceDesc, - [in] IDirectDrawPalette *pDirectDrawPalette); - - HRESULT GetDirectDraw( - [out] IDirectDraw **ppDirectDraw); - - HRESULT SetDirectDraw( - [in] IDirectDraw *pDirectDraw); - - HRESULT CreateSample( - [in] IDirectDrawSurface *pSurface, - [in] const RECT *pRect, - [in] DWORD dwFlags, - [out]IDirectDrawStreamSample **ppSample); - - HRESULT GetTimePerFrame( - [out] STREAM_TIME *pFrameTime); -}; - - -// IDirectDrawStreamSample -[ -object, -local, -uuid(F4104FCF-9A70-11d0-8FDE-00C04FD9189D), -pointer_default(unique) -] -interface IDirectDrawStreamSample : IStreamSample -{ - HRESULT GetSurface( - [out] IDirectDrawSurface ** ppDirectDrawSurface, - [out] RECT * pRect); - - HRESULT SetRect( - [in] const RECT * pRect); - -}; diff --git a/import/DirectX8/include/DShowIDL/devenum.idl b/import/DirectX8/include/DShowIDL/devenum.idl deleted file mode 100644 index f034eb23d..000000000 --- a/import/DirectX8/include/DShowIDL/devenum.idl +++ /dev/null @@ -1,38 +0,0 @@ -//------------------------------------------------------------------------------ -// File: DevEnum.idl -// -// Desc: IDL source for devenum.dll. This file will be processed by the -// MIDL tool to produce the type library (devenum.tlb) and marshalling -// code. -// -// Copyright (c) 1998-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -cpp_quote("#define CDEF_CLASS_DEFAULT 0x0001") -cpp_quote("#define CDEF_BYPASS_CLASS_MANAGER 0x0002") -//cpp_quote("#define CDEF_CLASS_LEGACY 0x0004") -cpp_quote("#define CDEF_MERIT_ABOVE_DO_NOT_USE 0x0008") - -// If any of these flags are set, then only the types specified -// by the flags are enumerated -cpp_quote("#define CDEF_DEVMON_CMGR_DEVICE 0x0010") -cpp_quote("#define CDEF_DEVMON_DMO 0x0020") -cpp_quote("#define CDEF_DEVMON_PNP_DEVICE 0x0040") -cpp_quote("#define CDEF_DEVMON_FILTER 0x0080") -cpp_quote("#define CDEF_DEVMON_SELECTIVE_MASK 0x00f0") - -[ - object, - uuid(29840822-5B84-11D0-BD3B-00A0C911CE86), - pointer_default(unique) -] -interface ICreateDevEnum : IUnknown -{ - import "oaidl.idl"; - - HRESULT CreateClassEnumerator( - [in] REFCLSID clsidDeviceClass, - [out] IEnumMoniker ** ppEnumMoniker, - [in] DWORD dwFlags); -} diff --git a/import/DirectX8/include/DShowIDL/dmodshow.idl b/import/DirectX8/include/DShowIDL/dmodshow.idl deleted file mode 100644 index 1a5907c79..000000000 --- a/import/DirectX8/include/DShowIDL/dmodshow.idl +++ /dev/null @@ -1,34 +0,0 @@ -//------------------------------------------------------------------------------ -// File: DMODShow.idl -// -// Desc: This file will be processed by the MIDL tool to -// produce dmodshow.h and proxy-stub code. -// -// Copyright (c) 1999-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -import "unknwn.idl"; -import "objidl.idl"; -import "mediaobj.idl"; - -// 94297043-bd82-4dfd-b0de-8177739c6d20 -cpp_quote("DEFINE_GUID(CLSID_DMOWrapperFilter, 0x94297043,0xbd82,0x4dfd,0xb0,0xde,0x81,0x77,0x73,0x9c,0x6d,0x20);") - -// bcd5796c-bd52-4d30-ab76-70f975b89199 -cpp_quote("DEFINE_GUID(CLSID_DMOFilterCategory,0xbcd5796c,0xbd52,0x4d30,0xab,0x76,0x70,0xf9,0x75,0xb8,0x91,0x99);") - - -[ - object, - uuid(52d6f586-9f0f-4824-8fc8-e32ca04930c2), -] -interface IDMOWrapperFilter : IUnknown -{ - // Init is passed in the clsid (so it can call CoCreateInstance) - // and the catgory under which the DMO lives. - // Note that catDMO can be CLSID_NULL, in which case no special - // category-specific processing will be invoked in the wrapper filter. - HRESULT Init(REFCLSID clsidDMO, REFCLSID catDMO); -} - diff --git a/import/DirectX8/include/DShowIDL/dshowasf.idl b/import/DirectX8/include/DShowIDL/dshowasf.idl deleted file mode 100644 index c0966560a..000000000 --- a/import/DirectX8/include/DShowIDL/dshowasf.idl +++ /dev/null @@ -1,59 +0,0 @@ -//------------------------------------------------------------------------------ -// File: DShowASF.idl -// -// Desc: -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -import "unknwn.idl"; -import "objidl.idl"; -import "strmif.idl"; // for media type and time definitions -import "wmsdkidl.idl"; - -cpp_quote( "EXTERN_GUID( IID_IConfigAsfWriter,0x45086030,0xF7E4,0x486a,0xB5,0x04,0x82,0x6B,0xB5,0x79,0x2A,0x3B );" ) - -interface IConfigAsfWriter; -interface IWMProfile; - -// Interface to control the ASF writer -[ -object, -uuid(45086030-F7E4-486a-B504-826BB5792A3B), -pointer_default(unique) -] -interface IConfigAsfWriter : IUnknown -{ - // - // The user is expected to enumerate profiles using the wmsdk IWMProfileManager - // method and then pass the desired profile index to the ASF Writer filter via this - // method. The filter will then try to configure itself for the selected profile. - // - // NOTE: These 2 XXXProfileId methods are now obsolete because they assume - // version 4.0 WMSDK profiles. To configure the filter for later profile - // versions using a profile index, use the XXXProfile methods which take - // the IWMProfile* directly. - // - HRESULT ConfigureFilterUsingProfileId([in] DWORD dwProfileId); - HRESULT GetCurrentProfileId([out] DWORD *pdwProfileId); - - // - // configure using a pre-defined wmsdk profile guid - // - HRESULT ConfigureFilterUsingProfileGuid([in] REFGUID guidProfile); - HRESULT GetCurrentProfileGuid([out] GUID *pProfileGuid); - - // - // Use these methods when a custom profile setup is preferred - // - HRESULT ConfigureFilterUsingProfile([in] IWMProfile * pProfile); - HRESULT GetCurrentProfile([out] IWMProfile **ppProfile); - - // - // allow app to control whether or not to index file - // - HRESULT SetIndexMode( [in] BOOL bIndexFile ); - HRESULT GetIndexMode( [out] BOOL *pbIndexFile ); -} - diff --git a/import/DirectX8/include/DShowIDL/dvdif.idl b/import/DirectX8/include/DShowIDL/dvdif.idl deleted file mode 100644 index 4cf518711..000000000 --- a/import/DirectX8/include/DShowIDL/dvdif.idl +++ /dev/null @@ -1,2324 +0,0 @@ -//------------------------------------------------------------------------------ -// File: DVDIf.idl -// -// Desc: DirectShow interfaces to control playback of a DVD filter graph. -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -// forward declarations - these are the interfaces declared in this file - -import "unknwn.idl"; -import "objidl.idl"; - -cpp_quote("#include ") - -interface IDvdControl; -interface IDvdInfo; -interface IDirectDraw; -interface IDirectDrawSurface; -interface IDvdGraphBuilder ; -interface IDDrawExclModeVideo; -interface IDDrawExclModeVideoCallback; -interface IDvdCmd; -interface IDvdState; - - -//========================================================================== -//========================================================================== -// -// typedefs used by IDvdControl and IDvdInfo interfaces. -// -//========================================================================== -//========================================================================== - -typedef enum tagDVD_DOMAIN { - // The DVD_DOMAIN is used to indicate the stat of a DVD player. - DVD_DOMAIN_FirstPlay=1, // doing default initialization of a dvd disc - DVD_DOMAIN_VideoManagerMenu, // displaying menus for whole disc - DVD_DOMAIN_VideoTitleSetMenu, // displaying menus for current title set - DVD_DOMAIN_Title, // displaying current title - DVD_DOMAIN_Stop // player is in stopped state -} DVD_DOMAIN; - -typedef enum tagDVD_MENU_ID { - DVD_MENU_Title = 2, // to choose a title from any VTS in a DVD-Video volume - DVD_MENU_Root = 3, // main menu for a specific VTS - DVD_MENU_Subpicture =4, // to choose subpicture stream in a VTS - DVD_MENU_Audio = 5, // to choose audio stream in a VTS - DVD_MENU_Angle = 6, // to choose angle num in a VTS - DVD_MENU_Chapter = 7 // to choose a chapter in a VTS - // the Root menu always provides a means of getting to to Subpicture, Audio, - // Angle and Chapter menus if they exist. -} DVD_MENU_ID; - -typedef enum tagDVD_DISC_SIDE { - DVD_SIDE_A = 1, - DVD_SIDE_B = 2 -} DVD_DISC_SIDE; - - -typedef enum tagDVD_PREFERRED_DISPLAY_MODE -{ - // DVD_PREFERRED_DISPLAY_MODE is used to indicate the user's - // preferred window aspect ratio and preferred method of converion of - // 16*9 content to a 4*3 window aspect ratio. Pan-scan and letterboxing are - // the two conversion methods. This enum is used to indicate only a preference of - // conversion mechinism since some content can only be converted using one - // of these methods. 4*3 content is converted to a 16*9 window always by using - // "reverse" letterboxing where black bars are added to the right and left - // sides of the display instead of the top and bottom of the display as in the 16*9 - // to 4*3 conversion useing letterboxing. - DISPLAY_CONTENT_DEFAULT = 0, // default to content - DISPLAY_16x9 = 1, // 16x9 display - DISPLAY_4x3_PANSCAN_PREFERRED = 2, // 4x3 display with pan-scan preferrence - DISPLAY_4x3_LETTERBOX_PREFERRED = 3 // 4x3 display with letterbox preferrence - -} DVD_PREFERRED_DISPLAY_MODE; - -typedef WORD DVD_REGISTER; -typedef DVD_REGISTER GPRMARRAY[16]; // DVD-Video 1.0 has 16 16-bit General Parameter Registers -typedef DVD_REGISTER SPRMARRAY[24]; // DVD-Video 1.0 has 24 16-bit System Parameter Registers - - - -// these are only for IDVDInfo1 compatibility and require the DVD-Video 1.0 specification -// Please use the IDVDInfo2's DVD_Title/MenuAttributes, DVD_VideoAttributes, DVD_AudioAttributes, and DVD_SubpictureAttributes -typedef struct tagDVD_ATR -{ - // - // Refer to the DVD-Video 1.0 spec to parse these structures. - // - ULONG ulCAT; // VMG_CAT if this is for a volume; or VTS_CAT - // if this is for a Video Title Set (VTS) - BYTE pbATRI[768];// All stream attributes for menu and title from bytes - // 256 to 1023 of VMGI or VTSI. -} DVD_ATR; -typedef BYTE DVD_VideoATR[2]; // video stream attributes. -typedef BYTE DVD_AudioATR[8]; // audio stream attributes. -typedef BYTE DVD_SubpictureATR[6]; // subpicture stream attributes. - -// DVD1.0 Timecode is BCD encoded in this format: 0xHhMmSsFf, where -// H is tens of hours -// h is hours -// M is tens of minutes -// m is minutes -// S is tens of seconds -// s is seconds -// F is tens of frames -// f is frames -// Note that you must know the frame rate to interperate the frame count as time. -typedef enum tagDVD_FRAMERATE -{ - DVD_FPS_25 =1, // 25 frames per second - DVD_FPS_30NonDrop = 3 // exactly 30 frames per second -} DVD_FRAMERATE; - -cpp_quote("typedef struct tagDVD_TIMECODE") -cpp_quote("{") -cpp_quote(" ULONG Hours1 :4; // Hours") -cpp_quote(" ULONG Hours10 :4; // Tens of Hours ") -cpp_quote("") -cpp_quote(" ULONG Minutes1 :4; // Minutes ") -cpp_quote(" ULONG Minutes10:4; // Tens of Minutes ") -cpp_quote("") -cpp_quote(" ULONG Seconds1 :4; // Seconds ") -cpp_quote(" ULONG Seconds10:4; // Tens of Seconds ") -cpp_quote("") -cpp_quote(" ULONG Frames1 :4; // Frames ") -cpp_quote(" ULONG Frames10 :2; // Tens of Frames ") -cpp_quote("") -cpp_quote(" ULONG FrameRateCode: 2; // use DVD_FRAMERATE to indicate frames/sec and drop/non-drop") -cpp_quote("} DVD_TIMECODE;") - -// -// Newer IDVD2 methods can use the HMSF format instead -// Call SetOption( DVD_HMSF_TimeCodeEvents, TRUE) to return EC_DVD_CURRENT_HMSF_TIME -// instead of EC_DVD_CURRENT_TIME events -// -typedef enum tagDVD_TIMECODE_FLAGS -{ - DVD_TC_FLAG_25fps = 0x00000001, // 25 frames per second - DVD_TC_FLAG_30fps = 0x00000002, // 30 frames per second - DVD_TC_FLAG_DropFrame = 0x00000004, // 29.97 instead of 30 fps - DVD_TC_FLAG_Interpolated = 0x00000008, // timecode may be inaccurate - // remainder of bits are reserved and should not be read -} DVD_TIMECODE_FLAGS; - -// this can be cast to/from a ULONG -typedef struct tagDVD_HMSF_TIMECODE -{ - BYTE bHours; - BYTE bMinutes; - BYTE bSeconds; - BYTE bFrames; -} DVD_HMSF_TIMECODE; - -typedef struct tagDVD_PLAYBACK_LOCATION2 -{ - // - // TitleNum & ChapterNum or TitleNum & TimeCode are sufficient to save - // playback location for One_Sequential_PGC_Titles. - // - ULONG TitleNum; // title number for whole disc (TTN not VTS_TTN) - ULONG ChapterNum; // part-of-title number with title. 0xffffffff if not Once_Sequential_PGC_Title - DVD_HMSF_TIMECODE TimeCode; // use DVD_TIMECODE for current playback time. - ULONG TimeCodeFlags; // union of DVD_TIMECODE_EVENT_FLAGS - -} DVD_PLAYBACK_LOCATION2; - -typedef struct tagDVD_PLAYBACK_LOCATION -{ - // - // TitleNum & ChapterNum or TitleNum & TimeCode are sufficient to save - // playback location for One_Sequential_PGC_Titles. - // - ULONG TitleNum; // title number for whole disc (TTN not VTS_TTN) - ULONG ChapterNum; // part-of-title number with title. 0xffffffff if not Once_Sequential_PGC_Title - ULONG TimeCode; // use DVD_TIMECODE for current playback time. 0xffffffff if not Once_Sequential_PGC_Title - -} DVD_PLAYBACK_LOCATION; - -typedef DWORD VALID_UOP_SOMTHING_OR_OTHER; - -typedef enum { - // - // Annex J User Functions --- - // - UOP_FLAG_Play_Title_Or_AtTime = 0x00000001, // Title_Or_Time_Play - UOP_FLAG_Play_Chapter = 0x00000002, // Chapter_Search_Or_Play - UOP_FLAG_Play_Title = 0x00000004, // Title_Play - UOP_FLAG_Stop = 0x00000008, // Stop - UOP_FLAG_ReturnFromSubMenu = 0x00000010, // GoUp - UOP_FLAG_Play_Chapter_Or_AtTime = 0x00000020, // Time_Or_Chapter_Search - UOP_FLAG_PlayPrev_Or_Replay_Chapter = 0x00000040, // Prev_Or_Top_PG_Search - UOP_FLAG_PlayNext_Chapter = 0x00000080, // Next_PG_Search - UOP_FLAG_Play_Forwards = 0x00000100, // Forward_Scan - UOP_FLAG_Play_Backwards = 0x00000200, // Backward_Scan - UOP_FLAG_ShowMenu_Title = 0x00000400, // Title_Menu_Call - UOP_FLAG_ShowMenu_Root = 0x00000800, // Root_Menu_Call - UOP_FLAG_ShowMenu_SubPic = 0x00001000, // SubPic_Menu_Call - UOP_FLAG_ShowMenu_Audio = 0x00002000, // Audio_Menu_Call - UOP_FLAG_ShowMenu_Angle = 0x00004000, // Angle_Menu_Call - UOP_FLAG_ShowMenu_Chapter = 0x00008000, // Chapter_Menu_Call - UOP_FLAG_Resume = 0x00010000, // Resume - UOP_FLAG_Select_Or_Activate_Button = 0x00020000, // Button_Select_Or_Activate - UOP_FLAG_Still_Off = 0x00040000, // Still_Off - UOP_FLAG_Pause_On = 0x00080000, // Pause_On - UOP_FLAG_Select_Audio_Stream = 0x00100000, // Audio_Stream_Change - UOP_FLAG_Select_SubPic_Stream = 0x00200000, // SubPic_Stream_Change - UOP_FLAG_Select_Angle = 0x00400000, // Angle_Change - UOP_FLAG_Select_Karaoke_Audio_Presentation_Mode = 0x00800000, // Karaoke_Audio_Pres_Mode_Change - UOP_FLAG_Select_Video_Mode_Preference = 0x01000000 // Video_Pres_Mode_Change -} VALID_UOP_FLAG ; - -typedef enum { - DVD_CMD_FLAG_None = 0x00000000, - DVD_CMD_FLAG_Flush = 0x00000001, - DVD_CMD_FLAG_SendEvents = 0x00000002, - DVD_CMD_FLAG_Block = 0x00000004, // block end - DVD_CMD_FLAG_StartWhenRendered = 0x00000008, // command "start" when the first frame is rendered - DVD_CMD_FLAG_EndAfterRendered = 0x00000010, // command "ends" after the last frame is rendered -} DVD_CMD_FLAGS; - -// For IDVDControl2::SetOption flags -typedef enum { - DVD_ResetOnStop = 1, // default TRUE - DVD_NotifyParentalLevelChange = 2, // default FALSE - DVD_HMSF_TimeCodeEvents = 3, // default FALSE (send DVD_CURRENT_TIME events) -} DVD_OPTION_FLAG; - -typedef enum { - DVD_Relative_Upper = 1, - DVD_Relative_Lower = 2, - DVD_Relative_Left = 3, - DVD_Relative_Right = 4 -} DVD_RELATIVE_BUTTON; - -// Parental Level Information -typedef enum tagDVD_PARENTAL_LEVEL -{ - DVD_PARENTAL_LEVEL_8 = 0x8000, - DVD_PARENTAL_LEVEL_7 = 0x4000, - DVD_PARENTAL_LEVEL_6 = 0x2000, - DVD_PARENTAL_LEVEL_5 = 0x1000, - DVD_PARENTAL_LEVEL_4 = 0x0800, - DVD_PARENTAL_LEVEL_3 = 0x0400, - DVD_PARENTAL_LEVEL_2 = 0x0200, - DVD_PARENTAL_LEVEL_1 = 0x0100 -} DVD_PARENTAL_LEVEL; - - -typedef enum tagDVD_AUDIO_LANG_EXT -{ - DVD_AUD_EXT_NotSpecified =0, - DVD_AUD_EXT_Captions =1, - DVD_AUD_EXT_VisuallyImpaired =2, - DVD_AUD_EXT_DirectorComments1 =3, - DVD_AUD_EXT_DirectorComments2 =4, -} DVD_AUDIO_LANG_EXT; - -typedef enum tagDVD_SUBPICTURE_LANG_EXT -{ - DVD_SP_EXT_NotSpecified =0, - DVD_SP_EXT_Caption_Normal =1, - DVD_SP_EXT_Caption_Big =2, - DVD_SP_EXT_Caption_Children =3, - DVD_SP_EXT_CC_Normal =5, - DVD_SP_EXT_CC_Big =6, - DVD_SP_EXT_CC_Children =7, - DVD_SP_EXT_Forced =9, - DVD_SP_EXT_DirectorComments_Normal =13, - DVD_SP_EXT_DirectorComments_Big =14, - DVD_SP_EXT_DirectorComments_Children =15, -} DVD_SUBPICTURE_LANG_EXT; - -typedef enum tagDVD_AUDIO_APPMODE -{ - DVD_AudioMode_None = 0, // no special mode - DVD_AudioMode_Karaoke = 1, - DVD_AudioMode_Surround = 2, - DVD_AudioMode_Other = 3, -} DVD_AUDIO_APPMODE; - -typedef enum tagDVD_AUDIO_FORMAT -{ - DVD_AudioFormat_AC3 = 0, - DVD_AudioFormat_MPEG1 = 1, - DVD_AudioFormat_MPEG1_DRC = 2, // MPEG1 with dynamic range control - DVD_AudioFormat_MPEG2 = 3, - DVD_AudioFormat_MPEG2_DRC = 4, // MPEG2 with dynamic range control - DVD_AudioFormat_LPCM = 5, - DVD_AudioFormat_DTS = 6, - DVD_AudioFormat_SDDS = 7, - DVD_AudioFormat_Other = 8 -} DVD_AUDIO_FORMAT; - -// flags for SelectKaraokeAudioPresentationMode -typedef enum tagDVD_KARAOKE_DOWNMIX -{ - DVD_Mix_0to0 = 0x0001, // unused - reserved for future use - DVD_Mix_1to0 = 0x0002, // unused - reserved for future use - DVD_Mix_2to0 = 0x0004, - DVD_Mix_3to0 = 0x0008, - DVD_Mix_4to0 = 0x0010, - DVD_Mix_Lto0 = 0x0020, // mix auxillary L to channel 0 (left speaker) - DVD_Mix_Rto0 = 0x0040, // mix auxillary R to channel 0 (left speaker) - - DVD_Mix_0to1 = 0x0100, // unused - reserved for future use - DVD_Mix_1to1 = 0x0200, // unused - reserved for future use - DVD_Mix_2to1 = 0x0400, - DVD_Mix_3to1 = 0x0800, - DVD_Mix_4to1 = 0x1000, - DVD_Mix_Lto1 = 0x2000, // mix auxillary L to channel 1 (right speaker) - DVD_Mix_Rto1 = 0x4000, // mix auxillary R to channel 1 (right speaker) -} DVD_KARAOKE_DOWNMIX; - - -typedef struct tagDVD_AudioAttributes -{ - DVD_AUDIO_APPMODE AppMode; - BYTE AppModeData; - DVD_AUDIO_FORMAT AudioFormat; // Use GetKaraokeAttributes() - LCID Language; // 0 if no language is present - DVD_AUDIO_LANG_EXT LanguageExtension; // (captions, if for children etc) - BOOL fHasMultichannelInfo; // multichannel attributes are present (Use GetMultiChannelAudioAttributes()) - DWORD dwFrequency; // in hertz (48k, 96k) - BYTE bQuantization; // resolution (16, 20, 24 bits etc), 0 is unknown - BYTE bNumberOfChannels; // 5.1 AC3 has 6 channels - DWORD dwReserved[2]; -} DVD_AudioAttributes; - -typedef struct tagDVD_MUA_MixingInfo -{ - // surround sound mixing information applied when: - // AppMode = DVD_AudioMode_Surround - // AudioFormat = DVD_AudioFormat_LPCM, - // fHasMultichannelInfo=1 modes are all on - // - BOOL fMixTo0; - BOOL fMixTo1; - - // - BOOL fMix0InPhase; - BOOL fMix1InPhase; - - DWORD dwSpeakerPosition; // see ksmedia.h: SPEAKER_FRONT_LEFT, SPEAKER_FRONT_RIGHT, etc -} DVD_MUA_MixingInfo; - -// The alpha coeff is used to mix to ACH0 and beta is used to mix to ACH1 -// -// In general: -// ACH0 = coeff[0].alpha * value[0] + coeff[1].alpha * value[1] + ... -// ACH1 = coeff[0].beta * value[0] + coeff[1].beta * value[1] + ... -typedef struct tagDVD_MUA_Coeff -{ - double log2_alpha; // actual coeff = 2^alpha - double log2_beta; // actual coeff = 2^beta -} DVD_MUA_Coeff; - -typedef struct tagDVD_MultichannelAudioAttributes -{ - // actual Data for each data stream - DVD_MUA_MixingInfo Info[8]; - DVD_MUA_Coeff Coeff[8]; -} DVD_MultichannelAudioAttributes; - -// bitwise OR of these flags descript the contents of each channel -typedef enum tagDVD_KARAOKE_CONTENTS -{ - DVD_Karaoke_GuideVocal1 = 0x0001, - DVD_Karaoke_GuideVocal2 = 0x0002, - DVD_Karaoke_GuideMelody1 = 0x0004, - DVD_Karaoke_GuideMelody2 = 0x0008, - DVD_Karaoke_GuideMelodyA = 0x0010, - DVD_Karaoke_GuideMelodyB = 0x0020, - DVD_Karaoke_SoundEffectA = 0x0040, - DVD_Karaoke_SoundEffectB = 0x0080 -} DVD_KARAOKE_CONTENTS; - -typedef enum tagDVD_KARAOKE_ASSIGNMENT -{ - DVD_Assignment_reserved0 = 0, - DVD_Assignment_reserved1 = 1, - DVD_Assignment_LR = 2, // left right - DVD_Assignment_LRM = 3, // left right middle - DVD_Assignment_LR1 = 4, // left right audio1 - DVD_Assignment_LRM1 = 5, // left right middle audio1 - DVD_Assignment_LR12 = 6, // left right audio1 audio2 - DVD_Assignment_LRM12 = 7 // left right middle audio1 audio2 -} DVD_KARAOKE_ASSIGNMENT; - -typedef struct tagDVD_KaraokeAttributes -{ - BYTE bVersion; - BOOL fMasterOfCeremoniesInGuideVocal1; - BOOL fDuet; // false = solo - DVD_KARAOKE_ASSIGNMENT ChannelAssignment; - WORD wChannelContents[8]; // logical OR of DVD_KARAOKE_CONTENTS -} DVD_KaraokeAttributes; - -typedef enum tagDVD_VIDEO_COMPRESSION -{ - DVD_VideoCompression_Other = 0, - DVD_VideoCompression_MPEG1 = 1, - DVD_VideoCompression_MPEG2 = 2, -} DVD_VIDEO_COMPRESSION; - -typedef struct tagDVD_VideoAttributes -{ - BOOL fPanscanPermitted; // if a 4x3 display, can be shown as PanScan - BOOL fLetterboxPermitted; // if a 4x3 display, can be shown as Letterbox - ULONG ulAspectX; // 4x3 or 16x9 - ULONG ulAspectY; - ULONG ulFrameRate; // 50hz or 60hz - ULONG ulFrameHeight; // 525 (60hz) or 625 (50hz) - DVD_VIDEO_COMPRESSION Compression;// MPEG1 or MPEG2 - - BOOL fLine21Field1InGOP; // true if there is user data in field 1 of GOP of video stream - BOOL fLine21Field2InGOP; // true if there is user data in field 1 of GOP of video stream - - ULONG ulSourceResolutionX; // X source resolution (352,704, or 720) - ULONG ulSourceResolutionY; // Y source resolution (240,480, 288 or 576) - - BOOL fIsSourceLetterboxed; // subpictures and highlights (e.g. subtitles or menu buttons) are only - // displayed in the active video area and cannot be displayed in the top/bottom 'black' bars - BOOL fIsFilmMode; // for 625/50hz systems, is film mode (true) or camera mode (false) -} DVD_VideoAttributes; - -typedef enum tagDVD_SUBPICTURE_TYPE -{ - DVD_SPType_NotSpecified = 0, - DVD_SPType_Language = 1, - DVD_SPType_Other = 2, -} DVD_SUBPICTURE_TYPE; - -typedef enum tagDVD_SUBPICTURE_CODING -{ - DVD_SPCoding_RunLength = 0, - DVD_SPCoding_Extended = 1, - DVD_SPCoding_Other = 2, -} DVD_SUBPICTURE_CODING; - -typedef struct tagDVD_SubpictureAttributes -{ - DVD_SUBPICTURE_TYPE Type; - DVD_SUBPICTURE_CODING CodingMode; - LCID Language; - DVD_SUBPICTURE_LANG_EXT LanguageExtension; -} DVD_SubpictureAttributes; - -typedef enum tagDVD_TITLE_APPMODE -{ - DVD_AppMode_Not_Specified = 0, // no special mode - DVD_AppMode_Karaoke = 1, - DVD_AppMode_Other = 3, -} DVD_TITLE_APPMODE; - -typedef struct tagDVD_TitleMainAttributes -{ - // for Titles - DVD_TITLE_APPMODE AppMode; - - // Attributes about the 'main' video of the menu or title - DVD_VideoAttributes VideoAttributes; - - ULONG ulNumberOfAudioStreams; - DVD_AudioAttributes AudioAttributes[8]; - // present if the multichannel bit is set in the corresponding stream's audio attributes - DVD_MultichannelAudioAttributes MultichannelAudioAttributes[8]; - - ULONG ulNumberOfSubpictureStreams; - DVD_SubpictureAttributes SubpictureAttributes[32]; -} DVD_TitleAttributes; - -typedef struct tagDVD_MenuAttributes -{ - // for VMG only - BOOL fCompatibleRegion[8]; // indeces 0..7 correspond to regions 1..8 - - // Attributes about the main menu (VMGM or VTSM) - DVD_VideoAttributes VideoAttributes; - - BOOL fAudioPresent; - DVD_AudioAttributes AudioAttributes; - - BOOL fSubpicturePresent; - DVD_SubpictureAttributes SubpictureAttributes; -} DVD_MenuAttributes; - -//========================================================================== -//========================================================================== -// IDvdControl interface -- Basic DVD-Video playback control. -// This modeled after the app control of a player specified in Annex J -// of the DVD Video spec. IDvdInfo can be used to get information useful -// in using IDvdControl -//========================================================================== -//========================================================================== - -[ -object, -uuid(A70EFE61-E2A3-11d0-A9BE-00AA0061BE93), -pointer_default(unique) -] - -interface IDvdControl : IUnknown { - import "unknwn.idl"; - - // TitlePlay - // Start playing the specified title number. - // Title numbers range between 1 and 99. - HRESULT TitlePlay - ( [in] ULONG ulTitle - ); - - // ChapterPlay - // Start playing at the specified chapter (or part-of-title) - // within the specified title. Chapters range from 1 to 999. - HRESULT ChapterPlay - ( [in] ULONG ulTitle, - [in] ULONG ulChapter - ); - - // TimePlay - // Start playing at the specified time within the specified title. - // NOTE: the actual start time will be the closest sync point before - // or equal to the specified frame number. - HRESULT TimePlay - ( [in] ULONG ulTitle, - [in] ULONG bcdTime // use DVD_TIMECODE. Framerate code is ignored. - ); - - // StopForResume - // Stop playback after saving resume information. DVD Navigator transfers to the DVD "Stop State" and - // (same as DVD_DOMAIN_Stop), but filter graph remains in DirectShow's Run state. - HRESULT StopForResume(); - - // GoUp - // Start playback of the program chain currently authored as the "GoUp_PGCN". - HRESULT GoUp(); - - // TimeSearch - // Start playing at the specified time within the current title. - // NOTE: the actual start time will be the closest sync point before - // or equal to the specified frame number. - HRESULT TimeSearch - ( [in] ULONG bcdTime // use DVD_TIMECODE. Framerate code is ignored. - ); - - // ChapterSearch - // Start playing at the specified chapter (or part-of-title) within - // the current title. - HRESULT ChapterSearch - ( [in] ULONG ulChapter - ); - - // PrevPGSearch - // Start playing at the beginning of the previous DVD "program". - // For One-Sequential_PGC_Titles (which includes most titles) a program - // is equivalent to a chapter, otherwise a program is part of a chapter. - HRESULT PrevPGSearch(); - - // TopPGSearch - // Start playing from the beginning of they current program. - HRESULT TopPGSearch(); - - // NextPGSearch - // Start playing from the beginning of the next program. - HRESULT NextPGSearch(); - - // ForwardScan - // Set forward play at the specified speed. - // dwSpeed == 1 is normal play - // dwSpeed < 1 is slow play - // dwSpeed > 1 is fast play - // For dwSpeed != 1, audio and subpicture is muted. - HRESULT ForwardScan - ( [in] double dwSpeed - ); - - // BackwardScan - // Set reverse play at the specified speed. - // dwSpeed == 1 is normal play speed in reverse - // dwSpeed < 1 is slow play in reverse - // dwSpeed > 1 is fast play in reverse - // For reverse play, audio and subpicture are always muted. - HRESULT BackwardScan - ( [in] double dwSpeed - ); - - // MenuCall - // Start playback of the Menu specified by an enum DVD_MENU_ID. - HRESULT MenuCall - ( [in] DVD_MENU_ID MenuID - ); - - // Resume - // Returns to title playback in DVD_DOMAIN_Title. This is typically - // done after MenuCall which puts the DVD Navigator in - // DVD_DOMAIN_VideoTitleSetMenu or DVD_DOMAIN_VideoManagerMenu. - HRESULT Resume(); - - // UpperButtonSelect - // Selects the button above the current button. - // "Selecting" a DVD button simply highlights the button but does - // not "Activate" the button. Selecting is the Windows equivalent - // to tabbing to a button but not pressing the space bar or enter key. - // Activating is the Windows equivalent of pressing the space bar or - // enter key after tabbing to a button. - HRESULT UpperButtonSelect(); - - // LowerButtonSelect - // Selects the button below the current button. - HRESULT LowerButtonSelect(); - - // LeftButtonSelect - // Selects the button to the left of the current button. - HRESULT LeftButtonSelect(); - - // RightButtonSelect - // Selects the button to the right of the current button. - HRESULT RightButtonSelect(); - - // ButtonActivate - // Activates current button. - HRESULT ButtonActivate(); - - // ButtonSelectAndActivate - // Selects and then activates the button specified by the user. - // ulButton is intended to be a number entered by a user corresponding - // to button numbers currently displayed on screen. - // Button numbers range from 1 to 36. - HRESULT ButtonSelectAndActivate - ( [in] ULONG ulButton - ); - - // StillOff - // Releases any current still if there are no available buttons. - // This includes VOBU stills, Cell stills, and PGC stills, whether the - // still is infinite. When buttons are available, stills are released by - // activating a button. Note this does not release a Pause. - HRESULT StillOff(); - - // PauseOn - // Freezes playback and any internal timers. This is similar to - // IMediaControl::Pause() - HRESULT PauseOn(); - - // PauseOff - // Releases a Pause. - HRESULT PauseOff(); - - // MenuLanguageSelect - // Selects the default language for menus. Languages are specified with - // Windows standard LCIDs. LCIDs can be created from ISO-639 codes with - // MAKELCID( MAKELANGID(wISO639LangID ,SUBLANG_DEFAULT ), SORT_DEFAULT ) - // NOTE: MAKELANGID seems to have a bug so 'jp' may have to be used - // instead of 'ja' for the ISO639 code for Japanese. - // MenuLanguageSelect may only called from the DVD Stop state (DVD_DOMAIN_Stop). - HRESULT MenuLanguageSelect - ( [in] LCID Language - ); - - // AudioStreamChange - // Changes the current audio stream. - HRESULT AudioStreamChange - ( [in] ULONG ulAudio - ); - - // SubpictureStreamChange - // Changes the current subpicture stream number to nSubpic, and toggles - // its display. - HRESULT SubpictureStreamChange - ( [in] ULONG ulSubPicture, - [in] BOOL bDisplay - ); - - // AngleChange - // Changes the current angle number. - HRESULT AngleChange - ( [in] ULONG ulAngle - ); - - // ParentalLevelSelect - // Selects the current player parental level between 1 and 8. The - // defined parental levels are listed below : - // - // Level Rating - // ----- ------ - // - // 1 G - // 3 PG - // 4 PG13 - // 6 R - // 7 NC17 - // Higher levels can play lower level content; lower levels cannot play - // higher level content. The DVD Navigator provides no restriction on - // setting the parental level. DVD player application may enforce - // restriction on parental level setting, such as password protection for - // raising the current parental level. Parental Management is disabled in - // the Navigator by default. - // - // Note : To disable parental management, pass 0xffffffff for ulParentalLevel - // If parental management is disabled, then the player will play the - // first PGC in a parental block regardless of parental IDs. - // - HRESULT ParentalLevelSelect - ( [in] ULONG ulParentalLevel - ); - - // ParentalCountrySelect - // Sets the country in which to interpret the the Parental Level. - // The country specified using the Alpha-2 code of the ISO-3166 standard, - // with the addition of 'ZZ' - HRESULT ParentalCountrySelect - ( [in] WORD wCountry - ); - - // KaraokeAudioPresentationModeChange - // Sets the Karaoke audio mode. - // NOTE: This and all other Karoke support is currently not implemented. - HRESULT KaraokeAudioPresentationModeChange - ( [in] ULONG ulMode - ); - - // VideoModePreferrence - // The user can specify the preferred display mode that should - // be used to display content. The parameter is a ULONG that has - // one of the values defined in DVD_PREFERRED_DISPLAY_MODE - HRESULT VideoModePreferrence - ( [in] ULONG ulPreferredDisplayMode - ); - - // SetRoot - // Sets the root directory containing the DVD-Video volume. - // Can only be called from the DVD Stop State (DVD_DOMAIN_Stop). - // If the root directory is not successfully set before - // IMediaControl::Play is called, the first drive starting from c: - // containing a VIDEO_TS directory in the top level directory - // will be used as the root. - HRESULT SetRoot - ( [in] LPCWSTR pszPath - ); - - // MouseActivate - // This is typically called in response to a mouse click. - // The specified point within the display window is to see if it is - // within a current DVD button's highlight rect. If it is, that - // button is first selected, then activated. - // NOTE: DVD Buttons do not all necessarily have highlight rects, - // button rects can overlap, and button rects do not always - // correspond to the visual representation of DVD buttons. - HRESULT MouseActivate // typically called after a mouse click - ( [in] POINT point - ); - - // MouseSelect - // This is typically called in response to a mouse move within the - // display window. - // The specified point within the display window is to see if it is - // within a current DVD button's highlight rect. If it is, that - // button is selected. - // NOTE: DVD Buttons do not all necessarily have highlight rects, - // button rects can overlap, and button rects do not always - // correspond to the visual representation of DVD buttons. - HRESULT MouseSelect // typically called after a mouse move - ( [in] POINT point - ); - - // ChapterPlayAutoStop - // Start playing at the specified chapter within the specified title - // and play the number of chapters specified by the third parameter. - // Chapters range from 1 to 999. - HRESULT ChapterPlayAutoStop - ( [in] ULONG ulTitle, // title number - [in] ULONG ulChapter, // chapter number to start playback - [in] ULONG ulChaptersToPlay // number of chapters to play from the start chapter - ); -} - - - -//========================================================================== -//========================================================================== -// IDvdInfo interface -- allow an app to query for attributes of available -// DVD titles and DVD player status. Also allow for control of a DVD -// player beyond Annex J in the DVD spec. -//========================================================================== -//========================================================================== - -[ -object, -uuid(A70EFE60-E2A3-11d0-A9BE-00AA0061BE93), -pointer_default(unique) -] - -interface IDvdInfo : IUnknown { - import "unknwn.idl"; - - // GetCurrentDomain - // Returns the current DVD Domain of the DVD player. - HRESULT GetCurrentDomain - ( [out] DVD_DOMAIN *pDomain - ); - - // GetCurrentLocation - // Returns information sufficient to restart playback of a video - // from the current playback location in titles that don't explicitly - // disable seeking to the current location. - HRESULT GetCurrentLocation - ( [out] DVD_PLAYBACK_LOCATION *pLocation - ); - - // GetTotalTitleTime - // Return the total playback time for the current title. Only works - // for One_Sequential_PGC_Titles. - HRESULT GetTotalTitleTime - ( [out] ULONG * pulTotalTime // use DVD_TIMECODE. - ); - - // GetCurrentButton - // Indicates the number of currently available buttons and the current - // selected button number. If buttons are not present it returns 0 for - // both pulButtonsAvailable and pulCurrentButton - HRESULT GetCurrentButton - ( [out] ULONG * pulButtonsAvailable, - [out] ULONG * pulCurrentButton - ); - - // GetCurrentAngle - // Indicates the number of currently available angles and the current - // selected angle number. If *pnAnglesAvailable==1, then the current - // video is not multiangle. - HRESULT GetCurrentAngle - ( [out] ULONG * pulAnglesAvailable, - [out] ULONG * pulCurrentAngle - ); - - // GetCurrentAudio - // Indicates the number of currently available audio streams and - // the current selected audio stream number. - // This only work when in DVD_DOMAIN_Title. - HRESULT GetCurrentAudio - ( [out] ULONG * pulStreamsAvailable, - [out] ULONG * pulCurrentStream - ); - - // GetCurrentSubpicture - // Indicates the number of currently available subpicture streams, - // the current selected subpicture stream number, and if the - // subpicture display is currently disabled. Subpicture streams - // authored as Forcedly Activated stream will be displayed even if - // subpicture display has been disabled by the app with - // IDVDControl::SubpictureChangeStream. - // This only work when in DVD_DOMAIN_Title. - HRESULT GetCurrentSubpicture - ( [out] ULONG * pulStreamsAvailable, - [out] ULONG * pulCurrentStream, - [out] BOOL * pIsDisabled - ); - - // GetCurrentUOPS - // Indicates which IDVDControl methods are currently valid. DVD titles - // can enable or disable individual user operations at almost any point - // during playback. - HRESULT GetCurrentUOPS - ( [out] VALID_UOP_SOMTHING_OR_OTHER * pUOP - ); - - // GetAllSPRMs - // Returns the current contents of all System Parameter Registers. - // See DVD-Video spec for use of individual registers. - HRESULT GetAllSPRMs - ( [out] SPRMARRAY * pRegisterArray - ); - - // GetAllGPRMs - // Returns the current contents of all General Parameter Registers. - // Use of GPRMs is title specific. - HRESULT GetAllGPRMs - ( [out] GPRMARRAY * pRegisterArray - ); - - // GetAudioLanguage - // Returns the language of the specified stream within the current - // title. Does not return languages for menus. Sets *pLanguage=0 if - // if the stream does not include language. - // Use GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize) - // to create a human readable string name from the result LCID. - HRESULT GetAudioLanguage - ( [in] ULONG ulStream, - [out] LCID * pLanguage - ); - - // GetSubpictureLanguage - // Returns the language of the specified stream within the current - // title. Does not return languages for menus. Sets *pLanguage=0 if - // if the stream does not include language. - // Use GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize) - // to create a human readable string name from the result LCID. - HRESULT GetSubpictureLanguage - ( [in] ULONG ulStream, - [out] LCID * pLanguage - ); - - // GetTitleAttributes - // Returns attributes of all video, audio, and subpicture - // streams for the specified title including menus. - // If nTitle == 0xffffffff, attributes for the current title are returned. - HRESULT GetTitleAttributes - ( [in] ULONG ulTitle, // requested title number - [out] DVD_ATR * pATR - ); - - // GetVMGAttributes - // Returns attributes of all video, audio, and subpicture - // streams for Video Manager Menus. Some menus, such as the DVD_MENU_Title - // are in a separate group of streams called the VMG (Video Manager) and - // are not associated with any particular title number. - HRESULT GetVMGAttributes - ( [out] DVD_ATR * pATR - ); - - // GetCurrentVideoAttributes - // Returns the video attributes for the current title or menu. - HRESULT GetCurrentVideoAttributes - ( [out] DVD_VideoATR *pATR - ); - - // GetCurrentAudioAttributes - // Returns the video attributes for the stream in the current - // title or menu. - HRESULT GetCurrentAudioAttributes - ( [out] DVD_AudioATR *pATR - ); - - // GetCurrentSubpictureAttributes - // Returns the video attributes for the stream in the current - // title or menu. - HRESULT GetCurrentSubpictureAttributes - ( [out] DVD_SubpictureATR *pATR - ); - - - // GetCurrentVolumeInfo - // Returns current DVD volume info. - HRESULT GetCurrentVolumeInfo - ( [out] ULONG *pulNumOfVol, // number of volumes (disc sides?) in a volume set - [out] ULONG *pulThisVolNum, // volume number for this root directory - [out] DVD_DISC_SIDE *pSide, // current disc side - [out] ULONG *pulNumOfTitles // number of titles available in this volume - ); - - - // GetDVDTextInfo - // Returns the TXTDT_MG structure, which can contain text descriptions for title - // name, volume name, producer name, vocalist name, etc. in various languages. - // refer to Section 4.1.6 and Annex A of the DVD-Video spec. - // If the buffer size passed in is insufficient (for example if cbBufSize==0), - // then E_OUTOFMEMORY is returned, and *pcbActualSize is set to the required size. - HRESULT GetDVDTextInfo - ( [out, size_is(ulBufSize)] BYTE *pTextManager, - [in] ULONG ulBufSize, // buffer size passed in - [out] ULONG *pulActualSize // amount of actual data return - ); - - // GetPlayerParentalLevel - // Returns the current parental level and the current country code - // that has been set in the system registers in player. - // See Table 3.3.4-1 of the DVD-Video spec for the defined parental levels. - // Valid Parental Levels = 1..8 if parental management is enabled - // 0xffffffff if parental management is disabled - // See ISO3166 : Alpha-2 Code for the country codes. - HRESULT GetPlayerParentalLevel - ( [out] ULONG *pulParentalLevel, // current parental level - [out] ULONG *pulCountryCode // current country code - ); - - // GetNumberOfChapters - // Returns the number of chapters that are defined for a - // given title. - HRESULT GetNumberOfChapters - ( [in] ULONG ulTitle, // Title for which number of chapters is requested - [out] ULONG *pulNumberOfChapters // Number of chapters for the specified title - ); - - // GetTitleParentalLevels - // Returns the parental levels that are defined for a - // particular title. pParentalLevels will be combination - // of DVD_PARENTAL_LEVEL_8, DVD_PARENTAL_LEVEL_6, or - // DVD_PARENTAL_LEVEL_1 "OR"ed together - HRESULT GetTitleParentalLevels - ( [in] ULONG ulTitle, // Title for which parental levels are requested - [out] ULONG *pulParentalLevels // Parental levels defined for the title "OR"ed together - ); - - // GetRoot - // Returns the root directory that is set in the player. If a valid root - // has been found, it returns the root string. Otherwise, it returns 0 for - // pcbActualSize indicating that a valid root directory has not been found - // or initialized. - // - // !!! used to return LPTSTR. interface was changed to return - // LPSTR (ansi) for compatibility. COM APIs should pass with - // UNICODE strings only. - // - HRESULT GetRoot - ( [out, size_is(ulBufSize)] LPSTR pRoot, // pointer to buffer to get root string - [in] ULONG ulBufSize, // size of buffer passed in - [out] ULONG *pulActualSize // size of actual data returned - ); -} - -//========================================================================== -//========================================================================== -// IDvdCmd interface -- the IDVDControl2 command sequencing object. -// -// For the IDVDControl2 interface, the application can track the status of -// commands that have been issued to the navigator. Each command is identified -// by an IDvdCmd object. The IDvdCmd object stores the results of the command -// at both the start (when the command has begun processing) and the end after -// it has completed. It also allows the app to synchronize with the processing -// of the command. -// -// The command object also allows the app to uniquely identify and correlate -// completion events (if it prefers to process events in a message loop instead -// of creating another process). -// -// Allows the app to track the status of an issued command to the nav. -//========================================================================== -//========================================================================== - -[ -object, -uuid(5a4a97e4-94ee-4a55-9751-74b5643aa27d), -pointer_default(unique) -] - -interface IDvdCmd : IUnknown { - import "unknwn.idl"; - - // - // WaitForStart - // - // Blocks the application until the command has begun. - // - HRESULT WaitForStart(); - - // - // WaitForEnd - // - // Blocks until the command has completed or has been cancelled. - HRESULT WaitForEnd(); -} - -//========================================================================== -//========================================================================== -// IDvdState interface -- the State state object. -// -// Whenever the application wishes to save or restore a location on the disc, -// it needs to store the DVD state into an object. -// The State object supports the IPersistStream -// -//========================================================================== -//========================================================================== - -[ -object, -uuid(86303d6d-1c4a-4087-ab42-f711167048ef), -pointer_default(unique) -] - -interface IDvdState : IUnknown -{ - // - // GetDiscID - // - // Returns the disc ID from which the bookmark was made. - // - HRESULT GetDiscID - ( [out] ULONGLONG* pullUniqueID ); // 64-bit unique id for the disc - - // - // GetParentalLevel - // - // Returns the state's parental level - // - HRESULT GetParentalLevel - ( [out] ULONG* pulParentalLevel ); -} - -//========================================================================== -//========================================================================== -// IDvdControl2 interface -- Basic DVD-Video playback control. -// This is modeled after the app control of a player specified in Annex J -// of the DVD Video spec. IDvdInfo2 can be used to get information useful -// in using IDvdControl2 -//========================================================================== -//========================================================================== - -[ -object, -uuid(33BC7430-EEC0-11D2-8201-00A0C9D74842), -pointer_default(unique) -] - -interface IDvdControl2 : IUnknown { - import "unknwn.idl"; - - // PlayTitle - // - // Start playing from the beginning of the specified title number. - // Annex J: Title_Play - // Title numbers range between 1 and 99. - HRESULT PlayTitle - ( [in] ULONG ulTitle, - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd - ); - - // PlayChapterInTitle - // - // Start playing from the beginning of the given chapter (or part-of-title) number - // within the specified title number. - // Annex J: PTT_Play - // Title numbers range between 1 and 99. - // Chapters range from 1 to 999. - HRESULT PlayChapterInTitle - ( [in] ULONG ulTitle, - [in] ULONG ulChapter, - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd - ); - - // PlayAtTimeInTitle - // - // Start playing from the specified time within the specified title number. - // NOTE: the actual start time will be the closest sync point before - // or equal to the specified frame number. - // Annex J: Time_Play - // Title numbers range between 1 and 99. - HRESULT PlayAtTimeInTitle - ( [in] ULONG ulTitle, - [in] DVD_HMSF_TIMECODE* pStartTime, - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd - ); - - // Stop - // Stop playback by transferring DVD Navigator to the DVD "Stop State" (same - // as DVD_DOMAIN_Stop), but filter graph remains in DirectShow's Run state. - // Annex J: Stop - HRESULT Stop(); - - // ReturnFromSubmenu - // - // Stop playback of current program chain (PGC) and start playing the PGC - // specified by "GoUp_PGCN".in the PGCI. - // If the GoUp_PGCN value is 0xFFFF the Resume() operation is carried out. - // Annex J: GoUp - HRESULT ReturnFromSubmenu( - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd ); - - // PlayAtTime - // Start playing at the specified time within the current title. - // NOTE: the actual start time will be the closest sync point before - // or equal to the specified frame number. - // Annex J: Time_Search - // The time is in BCD format, passed in as a ULONG. - HRESULT PlayAtTime - ( [in] DVD_HMSF_TIMECODE* pTime, - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd - ); - - // PlayChapter - // Start playing at the specified chapter (or part-of-title) within - // the current title. - // Annex J: PTT_Search - // Chapters range from 1 to 999. - HRESULT PlayChapter - ( [in] ULONG ulChapter, - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd - ); - - // PlayPrevChapter - // Start playing at the beginning of the previous DVD "program". - // For One-Sequential_PGC_Titles (which includes most titles) a program - // is equivalent to a chapter, otherwise a program is part of a chapter. - // Annex J: PrevPG_Search - HRESULT PlayPrevChapter( - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd ); - - // ReplayChapter - // Start playing from the beginning of they current program. - // Annex J: TopPG_Search - HRESULT ReplayChapter( - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd ); - - // PlayNextChapter - // Start playing from the beginning of the next program. - // Annex J: NextPG_Search - HRESULT PlayNextChapter( - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd ); - - // PlayForwards - // Set forward play at the specified speed. - // Annex J: Forward_Scan - // dSpeed == 1 is normal play - // dSpeed < 1 is slow play - // dSpeed > 1 is fast play - // For dSpeed != 1, audio and subpicture is muted. - HRESULT PlayForwards - ( [in] double dSpeed, - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd - ); - - // PlayBackwards - // Set reverse play at the specified speed. - // Annex J: Backward_Scan - // dSpeed == 1 is normal play speed in reverse - // dSpeed < 1 is slow play in reverse - // dSpeed > 1 is fast play in reverse - // For reverse play, audio and subpicture are always muted. - HRESULT PlayBackwards - ( [in] double dSpeed, - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd - ); - - // ShowMenu - // Start playback of the Menu specified by an enum DVD_MENU_ID. - // Annex J: Menu_Call - HRESULT ShowMenu - ( [in] DVD_MENU_ID MenuID, - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd - ); - - // Resume - // Returns to title playback in DVD_DOMAIN_Title. This is typically - // done after MenuCall which puts the DVD Navigator in - // DVD_DOMAIN_VideoTitleSetMenu or DVD_DOMAIN_VideoManagerMenu. - // Annex J: Resume - HRESULT Resume( - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd ); - - // SelectRelativeButton - // Moves the selection highlight above, below, to the left of, or to the right of the - // currently selected. - // "Selecting" a DVD button simply highlights the button but does - // not "Activate" the button. Selecting is the Windows equivalent - // to tabbing to a button but not pressing the space bar or enter key. - // Activating is the Windows equivalent of pressing the space bar or - // enter key after tabbing to a button. - // Annex J: Upper_button_Select, Lower_button_Select, Left_button_Select, Right_button_Select - HRESULT SelectRelativeButton( DVD_RELATIVE_BUTTON buttonDir ); - - // ActivateButton - // Activates current button. - // Annex J: Button_Activate - HRESULT ActivateButton(); - - // SelectButton - // Selects a specific button (with the index from 1 to 36). - // ulButton is intended to be a number entered by a user corresponding - // to button numbers currently displayed on screen. - // Button numbers range from 1 to 36. - HRESULT SelectButton - ( [in] ULONG ulButton - ); - - // SelectAndActivateButton - // Selects and then activates the button specified by the user. - // ulButton is intended to be a number entered by a user corresponding - // to button numbers currently displayed on screen. - // Annex J: Button_Select_And_Activate - // Button numbers range from 1 to 36. - HRESULT SelectAndActivateButton - ( [in] ULONG ulButton - ); - - // StillOff - // Releases any current still if there are no available buttons. - // This includes VOBU stills, Cell stills, and PGC stills, whether the - // still is infinite. When buttons are available, stills are released by - // activating a button. Note this does not release a Pause. - // Annex J: Still_Off - HRESULT StillOff(); - - // Pause - // Freezes / unfreezes playback and any internal timers. This is similar to - // IMediaControl::Pause(), but not the same in effect as IMediaControl::Pause - // puts the filter (all filters, if done to the graph) in paused state. - // Annex J: Pause_On and Pause_Off - // bState is TRUE or FALSE to indicate whether to do Puase_on/Pause_Off according - // to Annex J terminology. - HRESULT Pause - ( [in] BOOL bState - ); - - // SelectAudioStream - // Changes the current audio stream to ulAudio. - // Annex J: Audio_Stream_Change - // Audio stream number ranges between 0 and 7 or DEFAULT_AUDIO_STREAM (15 - default based on default language & language extension) - HRESULT SelectAudioStream - ( [in] ULONG ulAudio, - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd - - ); - - // SelectSubpictureStream - // Changes the current subpicture stream number to ulSubPicture - // Annex J: Sub-picture_Stream_Change (first param) - // Subpicture stream number should be between 0 and 31 or 63. - HRESULT SelectSubpictureStream - ( [in] ULONG ulSubPicture, - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd - - ); - - // SetSubpictureState - // Turns on/off current subpicture stream display. - // Annex J: Sub-picture_Stream_Change (second param) - // Subpicture state is On or Off (TRUE or FALSE) - HRESULT SetSubpictureState - ( [in] BOOL bState, - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd - ); - - // SelectAngle - // Changes the current angle number. - // Annex J: Angle_Change - // Angle number is between 1 and 9. - HRESULT SelectAngle - ( [in] ULONG ulAngle, - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd - ); - - // SelectParentalLevel - // Selects the current player parental level. - // Annex J: Parental_Level_Select - // Parental level ranges between 1 and 8. - // The defined parental levels are listed below : - // - // Level Rating - // ----- ------ - // 1 G - // 3 PG - // 4 PG13 - // 6 R - // 7 NC17 - // Higher levels can play lower level content; lower levels cannot play - // higher level content. The DVD Navigator provides no restriction on - // setting the parental level. DVD player application may enforce - // restriction on parental level setting, such as password protection for - // raising the current parental level. Parental Management is disabled in - // the Navigator by default. - // - // Note : To disable parental management, pass 0xffffffff for ulParentalLevel - // If parental management is disabled, then the player will play the - // first PGC in a parental block regardless of parental IDs. - // - HRESULT SelectParentalLevel - ( [in] ULONG ulParentalLevel - ); - - // SelectParentalCountry - // Sets the country in which to interpret the Parental Level. - // Annex J: Parental_Country_Select - // The country specified using the Alpha-2 code of the ISO-3166 standard, - HRESULT SelectParentalCountry - ( [in] BYTE bCountry[2] - ); - - // SelectKaraokeAudioPresentationMode - // Sets the Karaoke audio mode. - // Annex J: Karaoke_Audio_Presentation_Mode_Change - // NOTE: This and all other Karoke support is currently not implemented. - // Mode represents the audio mixing mode for Karaoke (same info as SPRM11). - // Use a bitwise OR of the bits in DVD_KARAOKE_DOWNMIX - HRESULT SelectKaraokeAudioPresentationMode - ( [in] ULONG ulMode - ); - - // SelectVideoModePreference - // The user can specify the (initial) preferred display mode (aspect ratio) - // (wide / letterbox / pan-scan) that should be used to display content - // (16 : 9). - // Annex J: Video_Presentation_Mode_Change - // The parameter is a ULONG that has one of the values defined in - // DVD_PREFERRED_DISPLAY_MODE - HRESULT SelectVideoModePreference - ( [in] ULONG ulPreferredDisplayMode - ); - - // SetDVDDirectory - // Sets the root directory containing the DVD-Video volume. - // Can only be called from the DVD Stop State (DVD_DOMAIN_Stop). - // If the root directory is not successfully set before - // IMediaControl::Play is called, the first drive starting from c: - // containing a VIDEO_TS directory in the top level directory - // will be used as the root. - HRESULT SetDVDDirectory - ( [in] LPCWSTR pszwPath - ); - - // ActivateAtPosition - // This is typically called in response to a mouse click. - // The specified point within the display window is to see if it is - // within a current DVD button's highlight rect. If it is, that - // button is first selected, then activated. - // NOTE: DVD Buttons do not all necessarily have highlight rects, - // button rects can overlap, and button rects do not always - // correspond to the visual representation of DVD buttons. - HRESULT ActivateAtPosition // typically called after a mouse click - ( [in] POINT point - ); - - // SelectAtPosition - // This is typically called in response to a mouse move within the - // display window. - // The specified point within the display window is to see if it is - // within a current DVD button's highlight rect. If it is, that - // button is selected. - // NOTE: DVD Buttons do not all necessarily have highlight rects, - // button rects can overlap, and button rects do not always - // correspond to the visual representation of DVD buttons. - HRESULT SelectAtPosition // typically called after a mouse move - ( [in] POINT point - ); - - // PlayChaptersAutoStop - // Start playing at the specified chapter within the specified title - // and play the number of chapters specified by the third parameter. - // Then the playback stops by sending an event EC_DVD_CHAPTER_AUTOSTOP. - // Title ranges from 1 to 99. - // Chapter (and number of chapters to play) ranges from 1 to 999. - HRESULT PlayChaptersAutoStop - ( [in] ULONG ulTitle, // title number - [in] ULONG ulChapter, // chapter number to start playback - [in] ULONG ulChaptersToPlay, // number of chapters to play from the start chapter - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd - ); - - // AcceptParentalLevelChange - // - // Application's way of informing the Navigator that the required parental - // level change indicated through a previous event was accepted or rejected - // by the app (and unblock the Navigator). - // - // FALSE - reject the disc's request to change the current parental level. - // TRUE - change the parental level as required by the disc. - HRESULT AcceptParentalLevelChange - ( [in] BOOL bAccept - ); - - // SetOption(flag, true/false ) - // Flags: - // - // DVD_ResetOnStop - // Disable reset of the Navigator's internal state on the - // subsequent IMediaControl::Stop() call(s). - // - // FALSE - Navigator does not reset its state on the subsequent Stop calls - // (play from the current location on next Run call). - // TRUE - (default) Navigator resets its state on the subsequent Stop call - // (play from the first play PGC on the Run call after the Stop). - // - // DVD_NotifyParentalLevelChange - // - // Allows the application to indicate to the Navigator that it wants to control - // parent level change (e.g., through a dialog box) and indicate the acceptance - // or rejection of the new parental level to the Navigator through - // AcceptParentalLevelChange(). - // - // FALSE - disable (default). Always reject request by the disc to change parental level. - // TRUE - enable. Navigator will send the app a 'EC_DVD_PARENTAL_LEVEL_CHANGE' event - // and block until AcceptParentalLevelChange() is called by the app. - // - // DVD_HMSF_TimeCodeEvents - // - // Lets the application specify to the Navigator if it wants to get the new time - // event EC_DVD_CURRENT_HMSF_TIME with the HMSF format rather than the older - // EC_DVD_CURRENT_TIME events. - // - // FALSE - disable (default). Older EC_DVD_CURRENT_TIME events are returned. - // TRUE - enable. Navigator will send the app EC_DVD_CURRENT_HMSF_TIME events. - - HRESULT SetOption - ( [in] DVD_OPTION_FLAG flag, - [in] BOOL fState - ); - - // SetState - // - // The navigator will use the location information in the given state object to restore - // the navigator's position to a specific location on the disc. - // A valid state object is returned by either calling GetState(), or by using - // "CoCreateInstance( CLSID_DVDState, NULL, CLSCTX_INPROC_SERVER, IID_IDvdState, (void **) ppState )" - // to create a state object, followed by pState->IPersist::Load() to read it from memory or disk. - // - HRESULT SetState - ( [in] IDvdState* pState, - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd - - ); - - // PlayPeriodInTitleAutoStop - // - // Start playing from the specified time within the specified title number until the specified end time. - // NOTE: the actual start and end times will be the closest sync points before - // or equal to the specified frame number. - // Annex J: Time_Play for a limited range - // Title numbers range between 1 and 99. - HRESULT PlayPeriodInTitleAutoStop - ( [in] ULONG ulTitle, - [in] DVD_HMSF_TIMECODE* pStartTime, - [in] DVD_HMSF_TIMECODE* pEndTime, - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd - ); - - // SetGPRM - // Sets the current contents of a DVD General Parameter Register. - // Use of GPRMs is title specific. - - HRESULT SetGPRM - ( [in] ULONG ulIndex, - [in] WORD wValue, - [in] DWORD dwFlags, - [out] IDvdCmd** ppCmd - ); - - // SelectDefaultMenuLanguage - // Selects the default language for menus. - // Languages are specified with Windows standard LCIDs. LCIDs can be created - // from ISO-639 codes with - // MAKELCID( MAKELANGID(wISO639LangID ,SUBLANG_DEFAULT ), SORT_DEFAULT ). - // SelectMenuLanguage may only called from the DVD Stop state (DVD_DOMAIN_Stop). - // Annex J: Menu_Language_Select - // - // NOT TRUE ANYMORE: - // NOTE: MAKELANGID seems to have a bug so 'jp' may have to be used - // instead of 'ja' for the ISO639 code for Japanese. - HRESULT SelectDefaultMenuLanguage - ( [in] LCID Language - ); - - // SelectDefaultAudioLanguage - // Selects the default audio language. - // Languages are specified with Windows standard LCIDs. - HRESULT SelectDefaultAudioLanguage - ( [in] LCID Language, - [in] DVD_AUDIO_LANG_EXT audioExtension - ); - - // SelectDefaultSubpictureLanguage - // Selects the default subpicture language. - // Languages are specified with Windows standard LCIDs. - HRESULT SelectDefaultSubpictureLanguage - ( [in] LCID Language, - [in] DVD_SUBPICTURE_LANG_EXT subpictureExtension - ); -} - - -//========================================================================== -//========================================================================== -// IDvdInfo2 interface -- allows an app to query for attributes of available -// DVD titles and DVD player status. Also allows for control of a DVD -// player beyond Annex J in the DVD spec. -//========================================================================== -//========================================================================== - -enum DVD_TextStringType { - // disc structure (0x00..0x0f) - DVD_Struct_Volume = 0x01, - DVD_Struct_Title = 0x02, - DVD_Struct_ParentalID = 0x03, - DVD_Struct_PartOfTitle = 0x04, - DVD_Struct_Cell = 0x05, - // stream (0x10..0x1f) - DVD_Stream_Audio = 0x10, - DVD_Stream_Subpicture = 0x11, - DVD_Stream_Angle = 0x12, - // channel in stream (0x20..0x2f) - DVD_Channel_Audio = 0x20, - - // Application information - // General (0x30..0x37) - DVD_General_Name = 0x30, - DVD_General_Comments = 0x31, - - // Title (0x38..0x3f) - DVD_Title_Series = 0x38, - DVD_Title_Movie = 0x39, - DVD_Title_Video = 0x3a, - DVD_Title_Album = 0x3b, - DVD_Title_Song = 0x3c, - DVD_Title_Other = 0x3f, - - // Title (sub) (0x40..0x47) - DVD_Title_Sub_Series = 0x40, - DVD_Title_Sub_Movie = 0x41, - DVD_Title_Sub_Video = 0x42, - DVD_Title_Sub_Album = 0x43, - DVD_Title_Sub_Song = 0x44, - DVD_Title_Sub_Other = 0x47, - - // Title (original) (0x48..0x4f) - DVD_Title_Orig_Series = 0x48, - DVD_Title_Orig_Movie = 0x49, - DVD_Title_Orig_Video = 0x4a, - DVD_Title_Orig_Album = 0x4b, - DVD_Title_Orig_Song = 0x4c, - DVD_Title_Orig_Other = 0x4f, - - // Other info (0x50..0x57) - DVD_Other_Scene = 0x50, - DVD_Other_Cut = 0x51, - DVD_Other_Take = 0x52, - - // Language 0x58..0x5b - // Work 0x5c..0x6b - // Character 0x6c..0x8f - // Data 0x90..0x93 - // Karaoke 0x94..0x9b - // Category 0x9c..0x9f - // Lyrics 0xa0..0xa3 - // Document 0xa4..0xa7 - // Others 0xa8..0xab - // Reserved 0xac..0xaf - // Admin 0xb0..0xb7 - // more admin 0xb8..0xc0 - // Reserved 0xd0..0xdf - // vendor 0xe0..0xef - // extension 0xf0..0xf7 - // reserved 0xf8..0xff -}; - -enum DVD_TextCharSet { - DVD_CharSet_Unicode = 0, - DVD_CharSet_ISO646 = 1, - DVD_CharSet_JIS_Roman_Kanji = 2, - DVD_CharSet_ISO8859_1 = 3, - DVD_CharSet_ShiftJIS_Kanji_Roman_Katakana = 4 -}; - -cpp_quote ("#define DVD_TITLE_MENU 0x000") -cpp_quote ("#define DVD_STREAM_DATA_CURRENT 0x800") -cpp_quote ("#define DVD_STREAM_DATA_VMGM 0x400") -cpp_quote ("#define DVD_STREAM_DATA_VTSM 0x401") -cpp_quote ("#define DVD_DEFAULT_AUDIO_STREAM 0x0f") - -// DVD Decoder Caps data -typedef struct tagDVD_DECODER_CAPS -{ - DWORD dwSize ; // size of this struct - DWORD dwAudioCaps ; // bits indicating audio support (AC3, DTS, SDDS, LPCM etc.) of decoder - double dFwdMaxRateVideo ; // max data rate for video going forward - double dFwdMaxRateAudio ; // ... .. .. ... audio ... ... - double dFwdMaxRateSP ; // ... .. .. ... SP ... ... - double dBwdMaxRateVideo ; // if smooth reverse is not available, this will be set to 0 - double dBwdMaxRateAudio ; // -- ditto -- - double dBwdMaxRateSP ; // -- ditto -- - DWORD dwRes1 ; // reserved for future expansion - DWORD dwRes2 ; // -- ditto -- - DWORD dwRes3 ; // -- ditto -- - DWORD dwRes4 ; // -- ditto -- -} DVD_DECODER_CAPS ; - -// Bits for decoder's audio format support -cpp_quote ("#define DVD_AUDIO_CAPS_AC3 0x00000001") -cpp_quote ("#define DVD_AUDIO_CAPS_MPEG2 0x00000002") -cpp_quote ("#define DVD_AUDIO_CAPS_LPCM 0x00000004") -cpp_quote ("#define DVD_AUDIO_CAPS_DTS 0x00000008") -cpp_quote ("#define DVD_AUDIO_CAPS_SDDS 0x00000010") - - -[ -object, -uuid(34151510-EEC0-11D2-8201-00A0C9D74842), -pointer_default(unique) -] - -interface IDvdInfo2 : IUnknown { - import "unknwn.idl"; - - // GetCurrentDomain - // Returns the current DVD Domain of the DVD player. - HRESULT GetCurrentDomain - ( [out] DVD_DOMAIN *pDomain - ); - - // GetCurrentLocation - // Returns information sufficient to restart playback of a video - // from the current playback location in titles that don't explicitly - // disable seeking to the current location. - HRESULT GetCurrentLocation - ( [out] DVD_PLAYBACK_LOCATION2 *pLocation - ); - - // GetTotalTitleTime - // Returns the total playback time for the current title. Only works - // for One_Sequential_PGC_Titles. - // THIS SHOULD CHANGE, RIGHT? - HRESULT GetTotalTitleTime - ( [out] DVD_HMSF_TIMECODE* pTotalTime, - [out] ULONG* ulTimeCodeFlags // union of DVD_TIMECODE_FLAGS - ); - - // GetCurrentButton - // Indicates the number of currently available buttons and the current - // selected button number. If buttons are not present it returns 0 for - // both pulButtonsAvailable and pulCurrentButton - HRESULT GetCurrentButton - ( [out] ULONG * pulButtonsAvailable, - [out] ULONG * pulCurrentButton - ); - - // GetCurrentAngle - // Indicates the number of currently available angles and the current - // selected angle number. If *pulAnglesAvailable is returned as 1 then - // the current content is not multiangle. - HRESULT GetCurrentAngle - ( [out] ULONG * pulAnglesAvailable, - [out] ULONG * pulCurrentAngle - ); - - // GetCurrentAudio - // Indicates the number of currently available audio streams and - // the currently selected audio stream number. - // This only works inside the Title domain. - HRESULT GetCurrentAudio - ( [out] ULONG * pulStreamsAvailable, - [out] ULONG * pulCurrentStream - ); - - // GetCurrentSubpicture - // Indicates the number of currently available subpicture streams, - // the currently selected subpicture stream number, and if the - // subpicture display is currently disabled. Subpicture streams - // authored as "Forcedly Activated" stream will be displayed even if - // subpicture display has been disabled by the app with - // IDVDControl::SetSubpictureState. - // This only works inside the Title domain. - HRESULT GetCurrentSubpicture - ( [out] ULONG * pulStreamsAvailable, - [out] ULONG * pulCurrentStream, - [out] BOOL * pbIsDisabled - ); - - // GetCurrentUOPS - // Indicates which IDVDControl methods (Annex J user operations) are - // currently valid. DVD titles can enable or disable individual user - // operations at almost any point during playback. - HRESULT GetCurrentUOPS - ( [out] ULONG * pulUOPs - ); - - // GetAllSPRMs - // Returns the current contents of all DVD System Parameter Registers. - // See DVD-Video spec for use of individual registers. - // WE SHOULD DOC THE SPRMs RATHER THAN ASKING TO REFER TO DVD SPEC. - HRESULT GetAllSPRMs - ( [out] SPRMARRAY * pRegisterArray - ); - - // GetAllGPRMs - // Returns the current contents of all DVD General Parameter Registers. - // Use of GPRMs is title specific. - // WE SHOULD DOC THE GPRMs RATHER THAN ASKING TO REFER TO DVD SPEC. - HRESULT GetAllGPRMs - ( [out] GPRMARRAY * pRegisterArray - ); - - // GetAudioLanguage - // Returns the language of the specified stream within the current title. - // Does not return languages for menus. Returns *pLanguage as 0 if the - // stream does not include language. - // Use Win32 API GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize) - // to create a human readable string name from the returned LCID. - HRESULT GetAudioLanguage - ( [in] ULONG ulStream, - [out] LCID * pLanguage - ); - - // GetSubpictureLanguage - // Returns the language of the specified stream within the current title. - // Does not return languages for menus. Returns *pLanguage=0 as 0 if the - // stream does not include language. - // Use Win32 API GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize) - // to create a human readable string name from the returned LCID. - HRESULT GetSubpictureLanguage - ( [in] ULONG ulStream, - [out] LCID * pLanguage - ); - - // GetTitleAttributes - // Returns attributes of all video, audio, and subpicture streams for the - // specified title including menus. - // If 0xffffffff is specified as ulTitle, attributes for the current title - // are returned. - HRESULT GetTitleAttributes - ( [in] ULONG ulTitle, // requested title number - [out] DVD_MenuAttributes * pMenu, - [out] DVD_TitleAttributes * pTitle - ); - - // GetVMGAttributes - // Returns attributes of all video, audio, and subpicture - // streams for Video Manager Menus. This method suppliments GetTitleAttributes() - // for some menus, such as the Title menu, which are in a separate group of - // streams called the VMG (Video Manager) and are not associated with any - // particular title number. - HRESULT GetVMGAttributes - ( [out] DVD_MenuAttributes* pATR - ); - - // GetCurrentVideoAttributes - // Returns the video attributes for the current title or menu. - // - HRESULT GetCurrentVideoAttributes - ( [out] DVD_VideoAttributes * pATR - ); - - // GetAudioAttributes - // Returns the audio attributes for the specified stream in the current title - // or menu. - HRESULT GetAudioAttributes - ( [in] ULONG ulStream, - [out] DVD_AudioAttributes *pATR - ); - - // GetKaraokeChannelContents - // Returns the karaoke contents of each channel of the specified stream in the current title - // or menu. - HRESULT GetKaraokeAttributes - ( [in] ULONG ulStream, - [out] DVD_KaraokeAttributes* pAttributes - ); - - // GetSubpictureAttributes - // Returns the subpicture attributes for the specified stream in the current - // title or menu. - HRESULT GetSubpictureAttributes - ( [in] ULONG ulStream, - [out] DVD_SubpictureAttributes *pATR - ); - - // GetDVDVolumeInfo - // Returns current DVD volume information. - HRESULT GetDVDVolumeInfo - ( [out] ULONG *pulNumOfVolumes, // number of volumes (disc sides?) in a volume set - [out] ULONG *pulVolume, // volume number for current DVD directory - [out] DVD_DISC_SIDE *pSide, // current disc side - [out] ULONG *pulNumOfTitles // number of titles available in this volume - ); - - // GetDVDTextNumberOfLanguages - // Returns the number of text languages for the current DVD directory. - // Should return some error code if no root directory is found. - HRESULT GetDVDTextNumberOfLanguages - ( [out] ULONG * pulNumOfLangs - ); - - // GetDVDTextLanguageInfo - // Returns the text languages information (number of strings, language code, - // char set) for the specified language index. - // Should return some error code if an invalid text index is specified. - HRESULT GetDVDTextLanguageInfo - ( [in] ULONG ulLangIndex, - [out] ULONG* pulNumOfStrings, - [out] LCID* pLangCode, - [out] enum DVD_TextCharSet * pbCharacterSet - ); - - // GetDVDTextStringAsNative - // Returns the text string as an array of bytes for the specified language - // index.and string index. - // Should return some error code if an invalid text or string index is specified. - // It also just returns the length of the string if pchBuffer is specified as NULL. - HRESULT GetDVDTextStringAsNative - ( [in] ULONG ulLangIndex, - [in] ULONG ulStringIndex, - [out] BYTE* pbBuffer, - [in] ULONG ulMaxBufferSize, - [out] ULONG* pulActualSize, - [out] enum DVD_TextStringType* pType - ); - - // GetDVDTextStringAsUnicode - // Returns the text string in Unicode for the specified language index.and string index. - // Should return some error code if an invalid text or string index is specified. - // It also just returns the length of the string if pchBuffer is specified as NULL. - HRESULT GetDVDTextStringAsUnicode - ( [in] ULONG ulLangIndex, - [in] ULONG ulStringIndex, - [out] WCHAR* pchwBuffer, - [in] ULONG ulMaxBufferSize, - [out] ULONG* pulActualSize, - [out] enum DVD_TextStringType* pType - ); - - // GetPlayerParentalLevel - // Returns the current parental level and the current country code that has - // been set in the system registers in player. - // See Table 3.3.4-1 of the DVD-Video spec for the defined parental levels. - // Valid Parental Levels range from 1 to 8 if parental management is enabled. - // Returns 0xffffffff if parental management is disabled - // See ISO3166 : Alpha-2 Code for the country codes. - HRESULT GetPlayerParentalLevel - ( [out] ULONG *pulParentalLevel, // current parental level - [out] BYTE pbCountryCode[2] // current country code - ); - - // GetNumberOfChapters - // Returns the number of chapters that are defined for a - // given title. - HRESULT GetNumberOfChapters - ( [in] ULONG ulTitle, // Title for which number of chapters is requested - [out] ULONG *pulNumOfChapters // Number of chapters for the specified title - ); - - // GetTitleParentalLevels - // Returns the parental levels that are defined for a particular title. - // pulParentalLevels will be combination of DVD_PARENTAL_LEVEL_8, - // DVD_PARENTAL_LEVEL_6, or DVD_PARENTAL_LEVEL_1 OR-ed together - HRESULT GetTitleParentalLevels - ( [in] ULONG ulTitle, // Title for which parental levels are requested - [out] ULONG *pulParentalLevels // Parental levels defined for the title "OR"ed together - ); - - // GetDVDDirectory - // Returns the root directory that is set in the player. If a valid root - // has been found, it returns the root string. Otherwise, it returns 0 for - // pcbActualSize indicating that a valid root directory has not been found - // or initialized. - // - // !!! used to return LPTSTR. interface was changed to return - // LPSTR (ansi) for compatibility. COM APIs should pass with - // UNICODE strings only. - // - HRESULT GetDVDDirectory - ( [out, size_is(ulMaxSize)] LPWSTR pszwPath, // pointer to buffer to get root string - [in] ULONG ulMaxSize, // size of buffer in WCHARs passed in - [out] ULONG *pulActualSize // size of actual data returned (in WCHARs) - ); - - - // IsAudioStreamEnabled - // - // Determines if the specified audio stream is enabled/disabled in the current PGC. - // - // ulStreamNum - audio stream number to test - // pbEnabled - where to place the result - HRESULT IsAudioStreamEnabled - ( [in] ULONG ulStreamNum, // stream number to test - [out] BOOL *pbEnabled // returned state - ); - - // GetDiscID - // - // If pszwPath is specified as NULL, DVD Navigator will use the current path - // that would be returned by GetDVDDirectory() at this point. - // - // Returns a 64-bit identification number for the specified DVD disc. - HRESULT GetDiscID - ( [in] LPCWSTR pszwPath, // root path (should we rather use const WCHAR*?) - [out] ULONGLONG* pullDiscID // 64-bit unique id for the disc - ) ; - - // GetState - // - // The navigator will create a new state object and save the current location into it. - // The state object can be used to restore the navigator the saved location at a later time. - // A new IDvdState object is created (with a single AddRef) and returned in *pStateData. - // The object must be Released() when the application is finished with it. - // - HRESULT GetState - ( [out] IDvdState **pStateData // returned object - ); - - // - // GetMenuLanguages - // - // Navigator gets all of the menu languages for the VMGM and VTSM domains. - // - HRESULT GetMenuLanguages - ( [out] LCID *pLanguages, // data buffer (NULL returns #languages) - [in] ULONG ulMaxLanguages, // maxiumum number of languages to retrieve - [out] ULONG *pulActualLanguages // actual number of languages retrieved - ); - - // - // GetButtonAtPosition - // - // This is typically called in response to a mouse move within the - // display window. - // It returns the button located at the specified point within the display window. - // If no button is present at that position, then VFW_E_DVD_NO_BUTTON is returned. - // Button indices start at 1. - // - // NOTE: DVD Buttons do not all necessarily have highlight rects, - // button rects can overlap, and button rects do not always - // correspond to the visual representation of DVD buttons. - HRESULT GetButtonAtPosition // typically called after a mouse move - ( [in] POINT point, - [out] ULONG *pulButtonIndex - ); - - // - // GetCmdFromEvent - // - // This method maps an EC_DVD_CMD_BEGIN/COMPLETE/CANCEL event's lParam1 into an AddRef'd - // IDvdCmd pointer. You must Release the returned pointer. NULL is returned if the function - // fails. - // - HRESULT GetCmdFromEvent - ( [in] LONG_PTR lParam1, - [out] IDvdCmd **pCmdObj - ); - - // GetDefaultMenuLanguage - // Returns the default language for menus. - HRESULT GetDefaultMenuLanguage - ( [out] LCID * pLanguage - ); - - // GetDefaultAudioLanguage - // Gets the default audio language. - // Languages are specified with Windows standard LCIDs. - HRESULT GetDefaultAudioLanguage - ( [out] LCID* pLanguage, - [out] DVD_AUDIO_LANG_EXT* pAudioExtension - ); - - // GetDefaultSubpictureLanguage - // Gets the default subpicture language. - // Languages are specified with Windows standard LCIDs. - HRESULT GetDefaultSubpictureLanguage - ( [out] LCID* pLanguage, - [out] DVD_SUBPICTURE_LANG_EXT* pSubpictureExtension - ); - - // - // GetDecoderCaps: - // Retrieves the DVD decoder's details about max data rate for video, audio - // and subpicture (going backward and forward) as well as support for various - // types of audio (AC3, MPEG2, DTS, SDDS, LPCM). - // - HRESULT GetDecoderCaps - ( [out] DVD_DECODER_CAPS *pCaps - ) ; - - // - // GetButtonRect: - // Retrieves the coordinates for a given button number - // - HRESULT GetButtonRect - ( [in] ULONG ulButton, - [out] RECT *pRect - ) ; - - // IsSubpictureStreamEnabled - // - // Determines if the specified subpicture stream is enabled/disabled in the current PGC. - // - // ulStreamNum - Subpicture stream number to test - // pbEnabled - where to place the result - HRESULT IsSubpictureStreamEnabled - ( [in] ULONG ulStreamNum, // stream number to test - [out] BOOL *pbEnabled // returned state - ); -} - - - -//========================================================================== -//========================================================================== -// -// typedefs used by IDvdGraphBuilder interface. -// -//========================================================================== -//========================================================================== - -typedef enum _AM_DVD_GRAPH_FLAGS { - AM_DVD_HWDEC_PREFER = 0x01, // default - AM_DVD_HWDEC_ONLY = 0x02, - AM_DVD_SWDEC_PREFER = 0x04, - AM_DVD_SWDEC_ONLY = 0x08, - AM_DVD_NOVPE = 0x100 -} AM_DVD_GRAPH_FLAGS ; - -typedef enum _AM_DVD_STREAM_FLAGS { - AM_DVD_STREAM_VIDEO = 0x01, - AM_DVD_STREAM_AUDIO = 0x02, - AM_DVD_STREAM_SUBPIC = 0x04 -} AM_DVD_STREAM_FLAGS ; - -typedef struct { - HRESULT hrVPEStatus ; // VPE mixing error code (0 => success) - BOOL bDvdVolInvalid ; // Is specified DVD volume invalid? - BOOL bDvdVolUnknown ; // Is DVD volume to be played not specified/not found? - BOOL bNoLine21In ; // video decoder doesn't produce line21 (CC) data - BOOL bNoLine21Out ; // can't show decoded line21 data as CC on video - int iNumStreams ; // number of DVD streams to render - int iNumStreamsFailed ; // number of streams failed to render - DWORD dwFailedStreamsFlag ; // combination of flags to indicate failed streams -} AM_DVD_RENDERSTATUS ; - - -// -// IDvdGraphBuilder interface to build a filter graph for DVD-Video playback. -// - -[ - object, - local, - uuid(FCC152B6-F372-11d0-8E00-00C04FD7C08B), - pointer_default(unique) -] -interface IDvdGraphBuilder : IUnknown { - - // Returns the IGraphBuilder interface for the filtergraph used by the - // CDvdGraphBuilder object. - // Remember to *ppGB->Release() when you're done with it - HRESULT GetFiltergraph - ( [out] IGraphBuilder **ppGB - ) ; - - // Gets specific interface pointers in the DVD-Video playback graph to - // make DVD-Video playback development easier. - // It helps get the following interfaces to control playback/show CC/ - // position window/control volume etc: - // - IDvdControl, IDvdInfo - // - IAMLine21Decoder - // - IVideoWindow, IBasicVideo - // - IBasicAudio - // This method will return - // a) E_INVALIDARG if ppvIF is invalid - // b) E_NOINTERFACE if riid is an IID we don't know about - // c) VFW_E_DVD_GRAPHNOTREADY if the graph has not been built through - // RenderDvdVideoVolume() yet. - // Remember to *ppvIF->Release() when you're done with it - HRESULT GetDvdInterface - ( [in] REFIID riid, // IID of the interface required - [out] void **ppvIF // returns pointer to the required interface - ) ; - - // Builds a filter graph according to user specs for playing back a - // DVD-Video volume. - // This method returns S_FALSE if - // 1. the graph has been either built, but either - // a) VPE mixing doesn't work (app didn't use AM_DVD_NOVPE flag) - // b) video decoder doesn't produce line21 data - // c) line21 data couldn't be rendered (decoding/mixing problem) - // d) the call specified an invalid volume path or DVD Nav couldn't - // locate any DVD-Video volume to be played. - // 2. some streams didn't render (completely), but the others have - // been rendered so that the volume can be partially played back. - // The status is indicated through the fields of the pStatus (out) - // parameter. - // About 1(a), the app will have enough info to tell the user that the - // video won't be visible unless a TV is connected to the NTSC out - // port of the DVD decoder (presumably HW in this case). - // For case 1(b) & (c), the app "can" put up a warning/informative message - // that closed captioning is not available because of the decoder. - // 1(d) helps an app to ask the user to insert a DVD-Video disc if none - // is specified/available in the drive when playback is started. - // This method builds the graph even if - // - an invalid DVD-Video volume is specified - // - the caller uses lpwszPathName = NULL to make the DVD Nav to locate - // the default volume to be played back, but DVD Nav doesn't find a - // default DVD-Video volume to be played back. - // An app can later specify the volume using IDvdControl::SetRoot() - // method. - // #2 will help the app indicate to the user that some of the streams - // can't be played. - // - // The graph is built using filters based on the dwFlags value (to use - // HW decoders or SW decoders or a mix of them). - // The dwFlags value is one of the values in AM_DVD_GRAPH_FLAGS enum - // type. The default value is AM_DVD_HWDEC_PREFER. None of the - // AM_DVD_HWDEC_xxx or AM_DVD_SWDEC_xxx flags can be mixed. However - // AM_DVD_NOVPE can be OR-ed with any of the AM_DVD_HWDEC_xxx flags. - // - // The method returns S_OK if the playback graph is built successfully - // with all the streams completely rendered and a valid DVD-Video volume - // is specified or a default one has been located. - // - // If the dwFlags specify conflicting options, E_INVALIDARG is returned. - // If the graph building fails, the method returns one of the following - // error codes: - // VFW_E_DVD_RENDERFAIL, VFW_E_DVD_DECNOTENOUGH - // - HRESULT RenderDvdVideoVolume - ( [in] LPCWSTR lpcwszPathName, // Can be NULL too - [in] DWORD dwFlags, // 0 is the default (use max HW) - [out] AM_DVD_RENDERSTATUS *pStatus // returns indications of ANY failure - ) ; -} - - -// -// DDraw Exclusive Mode Video standard COM interface for Overlay Mixer -// -[ - object, - local, - uuid(153ACC21-D83B-11d1-82BF-00A0C9696C8F), - pointer_default(unique) -] -interface IDDrawExclModeVideo : IUnknown { - // set a ddraw object to be used by the overlay mixer. If even one of the pins - // of the ovmixer is connected, then it won't start using the new ddraw obect - // immediately but just cache it. It will start using it the next time, all its - // pins are disconnected. - HRESULT SetDDrawObject([in] IDirectDraw *pDDrawObject); - - // gets the ddraw object currently being used by the overlay mixer. If the app has not - // set any ddraw object and the ovmixer has not yet allocated one, then *ppDDrawObject - // will be set to NULL and *pbUsingExternal will be set TO FALSE. Otherwise *pbUsingExternal - // will be set to TRUE if the ovmixer is currently USING an app given ddraw object and FALSE - // othewise - HRESULT GetDDrawObject([out] IDirectDraw **ppDDrawObject, - [out] BOOL *pbUsingExternal); - - // set a primary surface to be used by the overlay mixer. If even one of the pins - // of the ovmixer is connected, then it won't start using the new primary surface - // immediately but just cache it. It will start using it the next time, all its - // pins are disconnected. - // Also when the ovmixer does start using an app given primary surface, it will delete - // its output pin (and not draw its own colorkey) since the app is expected to do the - // window management and drawing colorkey etc on the primary surface - // This function makes sure that the surface provided exposes IDirectDrawSurface3, and - // is consistent with the ddraw object provided. - HRESULT SetDDrawSurface([in] IDirectDrawSurface *pDDrawSurface); - - // gets the ddraw surface currently being used by the overlay mixer. If the app has not - // set any ddraw surface and the ovmixer has not yet allocated one, then *ppDDrawSurface - // will be set to NULL and *pbUsingExternal will be set to FALSE. Otherwise *pbUsingExternal - // will be set to TRUE if the ovmixer is curretnly USING an app given ddraw surface and FALSE - // otherwise - HRESULT GetDDrawSurface([out] IDirectDrawSurface **ppDDrawSurface, - [out] BOOL *pbUsingExternal); - - // set draw paramters on the ovmixer (src and dest rect). Note that if the mode - // of the ovmixer is set to LETTER_BOX, then the ovmixer might show the video in - // only a subrect of *prcTarget (see IMixerPinConfig for details). - HRESULT SetDrawParameters([in] const RECT * prcSource, - [in] const RECT * prcTarget); - - // gets the current video size and picture aspect ratio of the primary stream of the overlay mixer - // The app should look for the evene EC_VIDEO_SIZE_AR_CHANGED and on its receipt - // call this function again - HRESULT GetNativeVideoProps([out] DWORD *pdwVideoWidth, - [out] DWORD *pdwVideoHeight, - [out] DWORD *pdwPictAspectRatioX, - [out] DWORD *pdwPictAspectRatioY); - - // Set the callback interface - the callback interface will be defined in a later release - // Currently returns E_NOTIMPL - HRESULT SetCallbackInterface([in] IDDrawExclModeVideoCallback *pCallback, - [in] DWORD dwFlags); -} - - -// -// DDraw Exclusive Mode Video callbacks -// - -// enum for flags -enum _AM_OVERLAY_NOTIFY_FLAGS { - AM_OVERLAY_NOTIFY_VISIBLE_CHANGE = 0x00000001, - AM_OVERLAY_NOTIFY_SOURCE_CHANGE = 0x00000002, - AM_OVERLAY_NOTIFY_DEST_CHANGE = 0x00000004 -}; -[ - object, - local, - uuid(913c24a0-20ab-11d2-9038-00a0c9697298), - pointer_default(unique) -] -interface IDDrawExclModeVideoCallback : IUnknown { - - // Called once before UpdateOverlay is called with bBefore == TRUE - // and once after it is called with bBefore == FALSE and otherwise - // identical parameters - HRESULT OnUpdateOverlay( - [in] BOOL bBefore, // After UpdateOverlayCalled? - [in] DWORD dwFlags,// _AM_OVERLAY_NOTIFY enum - [in] BOOL bOldVisible, - [in] const RECT *prcOldSrc, - [in] const RECT *prcOldDest, - [in] BOOL bNewVisible, - [in] const RECT *prcNewSrc, - [in] const RECT *prcNewDest); - - // Called when the surface color key is changed - HRESULT OnUpdateColorKey( - [in] const COLORKEY *pKey, - [in] DWORD dwColor); - - // Called when the video size or aspect ratio changes - HRESULT OnUpdateSize( [in] DWORD dwWidth, // Movie pixel width - [in] DWORD dwHeight, // Movie pixel height - [in] DWORD dwARWidth, // Aspect ratio horizontal - [in] DWORD dwARHeight); // Aspect ratio vertical -} diff --git a/import/DirectX8/include/DShowIDL/dxtrans.idl b/import/DirectX8/include/DShowIDL/dxtrans.idl deleted file mode 100644 index dd917f499..000000000 --- a/import/DirectX8/include/DShowIDL/dxtrans.idl +++ /dev/null @@ -1,2322 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright Microsoft Corporation 1997-2001 -// All rights reserved. -// -// File: dxtrans.idl -// -// Overview: -// This is the IDL file for DirectX installable transform coclass, -// interface, and type definitions. -// -//------------------------------------------------------------------------------ - -cpp_quote("#include ") -cpp_quote("#include ") -cpp_quote("#include ") -cpp_quote("#include ") -cpp_quote("#include ") - -//--- Import base idl -import "oaidl.idl"; -import "ocidl.idl"; -import "servprov.idl"; -import "comcat.idl"; - -// -// Since direct draw does not have an IDL, we'll define DDSURFACEDESC to -// be a void, but include ddraw.h in the header file. This makes MIDL happy. -// -#ifndef DDSURFACEDESC -cpp_quote("#if 0") -cpp_quote("// Bogus definition used to make MIDL compiler happy") -typedef void DDSURFACEDESC; -typedef void D3DRMBOX; -typedef void D3DVECTOR; -typedef void D3DRMMATRIX4D; -typedef void* LPSECURITY_ATTRIBUTES; -cpp_quote("#endif") -#endif -//--- Additional includes - -//--- Export -cpp_quote( "#ifdef _DXTRANSIMPL") -cpp_quote( " #define _DXTRANS_IMPL_EXT _declspec(dllexport)") -cpp_quote( "#else") -cpp_quote( " #define _DXTRANS_IMPL_EXT _declspec(dllimport)") -cpp_quote( "#endif") - -//=== Forward References ==================================================== -interface IDXTransformFactory; -interface IDXTransform; -interface IDXTaskManager; -interface IDXSurfaceFactory; -interface IDXSurface; -interface IDXARGBSurfaceInit; -interface IDXRawSurface; -interface IDXARGBReadPtr; -interface IDXARGBReadWritePtr; -interface IDXDCLock; -interface IDXTScale; -interface IDXLookupTable; -interface IDXTBindHost; -interface IBindHost; -interface IDXTScaleOutput; -interface IDXGradient; - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// Separate the updated Windows XP version of this header from the downlevel -// version that shipped with the DirectX 8.0 SDK. Since development -// on BDA technology continued for Windows XP, some changes were made to -// this file in order to improve the interface and functionality. -// -// To maintain compatibility with older applications which rely on the -// DirectX 8.0 versions of these files, the DirectX 8.1 version includes -// both the Windows XP content and the DirectX 8.0 content, which are -// separated by the #if (WINVER >= 0x501) preprocessor directive. -// -// Therefore, if you define WINVER to be 0x501 to specify Windows XP, -// the revised content will be compiled. Otherwise, the original -// DirectX 8.0 content will be used. -// -///////////////////////////////////////////////////////////////////////////// - -#if (WINVER >= 0x501) // Windows XP content - - - -//=== Constants ============================================================= - -cpp_quote("//") -cpp_quote("// All GUIDs for DXTransform are declared in DXTGUID.C in the SDK include directory") -cpp_quote("//") -cpp_quote("EXTERN_C const GUID DDPF_RGB1;") -cpp_quote("EXTERN_C const GUID DDPF_RGB2;") -cpp_quote("EXTERN_C const GUID DDPF_RGB4;") -cpp_quote("EXTERN_C const GUID DDPF_RGB8;") -cpp_quote("EXTERN_C const GUID DDPF_RGB332;") -cpp_quote("EXTERN_C const GUID DDPF_ARGB4444;") -cpp_quote("EXTERN_C const GUID DDPF_RGB565;") -cpp_quote("EXTERN_C const GUID DDPF_BGR565;") -cpp_quote("EXTERN_C const GUID DDPF_RGB555;") -cpp_quote("EXTERN_C const GUID DDPF_ARGB1555;") -cpp_quote("EXTERN_C const GUID DDPF_RGB24;") -cpp_quote("EXTERN_C const GUID DDPF_BGR24;") -cpp_quote("EXTERN_C const GUID DDPF_RGB32;") -cpp_quote("EXTERN_C const GUID DDPF_BGR32;") -cpp_quote("EXTERN_C const GUID DDPF_ABGR32;") -cpp_quote("EXTERN_C const GUID DDPF_ARGB32;") -cpp_quote("EXTERN_C const GUID DDPF_PMARGB32;") -cpp_quote("EXTERN_C const GUID DDPF_A1;") -cpp_quote("EXTERN_C const GUID DDPF_A2;") -cpp_quote("EXTERN_C const GUID DDPF_A4;") -cpp_quote("EXTERN_C const GUID DDPF_A8;") -cpp_quote("EXTERN_C const GUID DDPF_Z8;") -cpp_quote("EXTERN_C const GUID DDPF_Z16;") -cpp_quote("EXTERN_C const GUID DDPF_Z24;") -cpp_quote("EXTERN_C const GUID DDPF_Z32;") -cpp_quote("//") -cpp_quote("// Component categories") -cpp_quote("//") -cpp_quote("EXTERN_C const GUID CATID_DXImageTransform;") -cpp_quote("EXTERN_C const GUID CATID_DX3DTransform;") -cpp_quote("EXTERN_C const GUID CATID_DXAuthoringTransform;") -cpp_quote("EXTERN_C const GUID CATID_DXSurface;") -cpp_quote("//") -cpp_quote("// Service IDs") -cpp_quote("//") -cpp_quote("EXTERN_C const GUID SID_SDirectDraw;") -cpp_quote("EXTERN_C const GUID SID_SDirect3DRM;") -cpp_quote("#define SID_SDXTaskManager CLSID_DXTaskManager") -cpp_quote("#define SID_SDXSurfaceFactory IID_IDXSurfaceFactory") -cpp_quote("#define SID_SDXTransformFactory IID_IDXTransformFactory") -cpp_quote("//") -cpp_quote("// DXTransforms Core Type Library Version Info") -cpp_quote("//") -cpp_quote("#define DXTRANS_TLB_MAJOR_VER 1") -cpp_quote("#define DXTRANS_TLB_MINOR_VER 1") - -//=== Struct & Enum definitions ============================================= - -//=== Interface definitions ================================================= - - -//+----------------------------------------------------------------------------- -// -// IDXBaseObject -// -//------------------------------------------------------------------------------ - - [ - object, - uuid(17B59B2B-9CC8-11d1-9053-00C04FD9189D), - helpstring("IDXBaseObject Interface"), - pointer_default(unique), - local - ] - interface IDXBaseObject : IUnknown - { - HRESULT GetGenerationId( [out]ULONG *pID); - HRESULT IncrementGenerationId([in] BOOL bRefresh); - HRESULT GetObjectSize( [out] ULONG *pcbSize); - }; - - -//+----------------------------------------------------------------------------- -// -// Bounding rectangle and vector structures. -// -//------------------------------------------------------------------------------ - - //--- Dimension identifiers - typedef enum DXBNDID - { - DXB_X = 0, - DXB_Y = 1, - DXB_Z = 2, - DXB_T = 3 - } DXBNDID; - - //--- Bound types - typedef enum DXBNDTYPE - { - DXBT_DISCRETE, - DXBT_DISCRETE64, - DXBT_CONTINUOUS, - DXBT_CONTINUOUS64 - } DXBNDTYPE; - - //--- Discrete bounds (image & sound) - typedef struct DXDBND - { - long Min; - long Max; - } DXDBND; - typedef DXDBND DXDBNDS[4]; - - typedef struct DXDBND64 - { - LONGLONG Min; - LONGLONG Max; - } DXDBND64; - typedef DXDBND64 DXDBNDS64[4]; - - //--- Continuous bounds (geometry) - typedef struct DXCBND - { - float Min; - float Max; - } DXCBND; - typedef DXCBND DXCBNDS[4]; - - typedef struct DXCBND64 - { - double Min; - double Max; - } DXCBND64; - typedef DXCBND64 DXCBNDS64[4]; - - //--- Combined space - typedef union DXBNDS switch( DXBNDTYPE eType ) u - { - case DXBT_DISCRETE: - DXDBND D[4]; - case DXBT_DISCRETE64: - DXDBND64 LD[4]; - case DXBT_CONTINUOUS: - DXCBND C[4]; - case DXBT_CONTINUOUS64: - DXCBND64 LC[4]; - } DXBNDS; - - //--- Discrete 4D vector - typedef long DXDVEC[4]; - typedef LONGLONG DXDVEC64[4]; - - //--- Continous 4D vector - typedef float DXCVEC[4]; - typedef double DXCVEC64[4]; - - //--- Combined space vector - typedef union DXVEC switch( DXBNDTYPE eType ) u - { - case DXBT_DISCRETE: - long D[4]; - case DXBT_DISCRETE64: - LONGLONG LD[4]; - case DXBT_CONTINUOUS: - float C[4]; - case DXBT_CONTINUOUS64: - double LC[4]; - } DXVEC; - - -//+----------------------------------------------------------------------------- -// -// IDXTransformFactory -// -//------------------------------------------------------------------------------ - - [ - object, - uuid(6A950B2B-A971-11d1-81C8-0000F87557DB), - helpstring("IDXTransformFactory Interface"), - pointer_default(unique), - local - ] - interface IDXTransformFactory : IServiceProvider - { - HRESULT SetService( [in]REFGUID guidService, - [in]IUnknown *pUnkService, - [in]BOOL bWeakReference); - - HRESULT CreateTransform( [in, size_is(ulNumInputs)]IUnknown** punkInputs, - [in]ULONG ulNumInputs, - [in, size_is(ulNumOutputs)]IUnknown** punkOutputs, - [in]ULONG ulNumOutputs, - [in]IPropertyBag* pInitProps, [in]IErrorLog* pErrLog, - [in]REFCLSID TransCLSID, [in]REFIID TransIID, - [out, iid_is(TransIID)]void** ppTransform ); - - HRESULT InitializeTransform( [in]IDXTransform* pTransform, - [in, size_is(ulNumInputs)]IUnknown** punkInputs, - [in]ULONG ulNumInputs, - [in, size_is(ulNumOutputs)]IUnknown** punkOutputs, - [in]ULONG ulNumOutputs, - [in]IPropertyBag* pInitProps, [in]IErrorLog* pErrLog ); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXTransform -// -//------------------------------------------------------------------------------ - - typedef enum DXTMISCFLAGS - { - DXTMF_BLEND_WITH_OUTPUT = ( 1L << 0 ), - DXTMF_DITHER_OUTPUT = ( 1L << 1 ), - DXTMF_OPTION_MASK = (0x0000FFFF), // Low word is settable options - DXTMF_VALID_OPTIONS = (DXTMF_BLEND_WITH_OUTPUT | DXTMF_DITHER_OUTPUT), - // - // Status flags can not be changed by call to SetMiscFlags - // - DXTMF_BLEND_SUPPORTED = ( 1L << 16 ), - DXTMF_DITHER_SUPPORTED = ( 1L << 17 ), - DXTMF_INPLACE_OPERATION = ( 1L << 24 ), - DXTMF_BOUNDS_SUPPORTED = ( 1L << 25 ), - DXTMF_PLACEMENT_SUPPORTED = ( 1L << 26 ), - DXTMF_QUALITY_SUPPORTED = ( 1L << 27 ), - DXTMF_OPAQUE_RESULT = ( 1L << 28 ) - } DXTMISCFLAGS; - - typedef enum DXINOUTINFOFLAGS - { - DXINOUTF_OPTIONAL = ( 1L << 0) - } DXINOUTINFOFLAGS; - - [ - object, - uuid(30A5FB78-E11F-11d1-9064-00C04FD9189D), - helpstring("IDXTransform Interface"), - pointer_default(unique), - local - ] - interface IDXTransform : IDXBaseObject - { - HRESULT Setup( [in, size_is(ulNumInputs)] IUnknown * const * punkInputs, - [in]ULONG ulNumInputs, - [in, size_is(ulNumOutputs)] IUnknown * const * punkOutputs, - [in]ULONG ulNumOutputs, - [in]DWORD dwFlags ); - - HRESULT Execute( [in]const GUID* pRequestID, [in]const DXBNDS *pClipBnds, - [in]const DXVEC *pPlacement ); - - HRESULT MapBoundsIn2Out( [in] const DXBNDS *pInBounds, - [in]ULONG ulNumInBnds, - [in]ULONG ulOutIndex, - [out]DXBNDS *pOutBounds ); - - HRESULT MapBoundsOut2In( [in] ULONG ulOutIndex, - [in] const DXBNDS *pOutBounds, - [in] ULONG ulInIndex, - [out]DXBNDS *pInBounds ); - - HRESULT SetMiscFlags( [in] DWORD dwMiscFlags); - HRESULT GetMiscFlags( [out]DWORD * pdwMiscFlags ); - HRESULT GetInOutInfo( [in]BOOL bIsOutput, [in]ULONG ulIndex, - [out]DWORD *pdwFlags, [out, size_is(*pcIDs)] GUID *pIDs, - [in, out] ULONG *pcIDs, - [out] IUnknown **ppUnkCurrentObject); - - HRESULT SetQuality( [in] float fQuality ); - HRESULT GetQuality( [out] float * fQuality ); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXSurfacePick -// -//------------------------------------------------------------------------------ - - [ - object, - uuid(30A5FB79-E11F-11d1-9064-00C04FD9189D), - helpstring("IDXSurfacePick Interface"), - pointer_default(unique), - local - ] - interface IDXSurfacePick : IUnknown - { - HRESULT PointPick([in]const DXVEC *pPoint, - [out]ULONG * pulInputSurfaceIndex, - [out]DXVEC *pInputPoint); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXTBindHost -// -// Overview: -// This interface is used to set a site-specific bind host for a transform. -// Only transforms that need access to a bind host need to implement this -// interface. -// -// For some reason, MIDL does not like IBindHost, so we've declared this -// interface local. -// -//------------------------------------------------------------------------------ - - [ - object, - uuid(D26BCE55-E9DC-11d1-9066-00C04FD9189D), - helpstring("IDXTBindHost Interface"), - pointer_default(unique), - local - ] - interface IDXTBindHost : IUnknown - { - HRESULT SetBindHost([in] IBindHost * pBindHost); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXTaskManager -// -// Overview: -// This interface is used to implement a task managment service provider to -// optimize thread usage. -// -//------------------------------------------------------------------------------ - - typedef void (__stdcall DXTASKPROC)(void *pTaskData, BOOL* pbContinueProcessing ); - typedef DXTASKPROC *PFNDXTASKPROC; - - typedef void (__stdcall DXAPCPROC)(DWORD dwData); - typedef DXAPCPROC *PFNDXAPCPROC; - -cpp_quote("#ifdef __cplusplus") - - cpp_quote("typedef struct DXTMTASKINFO" ) - cpp_quote("{") - cpp_quote(" PFNDXTASKPROC pfnTaskProc; // Pointer to function to execute") - cpp_quote(" PVOID pTaskData; // Pointer to argument data") - cpp_quote(" PFNDXAPCPROC pfnCompletionAPC; // Pointer to completion APC proc") - cpp_quote(" DWORD dwCompletionData; // Pointer to APC proc data") - cpp_quote(" const GUID* pRequestID; // Used to identify groups of tasks") - cpp_quote("} DXTMTASKINFO;") - -cpp_quote("#else") - - typedef struct DXTMTASKINFO - { - PVOID pfnTaskProc; // Pointer to function to execute - PVOID pTaskData; // Pointer to argument data - PVOID pfnCompletionAPC; // Pointer to completion APC proc - DWORD dwCompletionData; // Pointer to APC proc data - const GUID* pRequestID; // Used to identify groups of tasks - } DXTMTASKINFO; - -cpp_quote("#endif") - - [ - object, - uuid(254DBBC1-F922-11d0-883A-3C8B00C10000), - helpstring("IDXTaskManager Interface"), - pointer_default(unique), - local - ] - interface IDXTaskManager : IUnknown - { - HRESULT QueryNumProcessors( [out]ULONG* pulNumProc ); - HRESULT SetThreadPoolSize( [in]ULONG ulNumThreads ); - HRESULT GetThreadPoolSize( [out]ULONG* pulNumThreads ); - HRESULT SetConcurrencyLimit( [in]ULONG ulNumThreads ); - HRESULT GetConcurrencyLimit( [out]ULONG* pulNumThreads ); - HRESULT ScheduleTasks( [in]DXTMTASKINFO TaskInfo[], - [in]HANDLE Events[], - [out]DWORD TaskIDs[], - [in]ULONG ulNumTasks, [in]ULONG ulWaitPeriod ); - HRESULT TerminateTasks( [in]DWORD TaskIDs[], [in]ULONG ulCount, - [in]ULONG ulTimeOut ); - HRESULT TerminateRequest( [in]REFIID RequestID, [in]ULONG ulTimeOut ); - }; - - -//+----------------------------------------------------------------------------- -// -// Sample structures (C++) -// -// Overview: -// We want an operator so that we can cast from a DXSAMPLE to a DWORD, so -// for C++ we will define the structure a special way. -// -//------------------------------------------------------------------------------ - -cpp_quote("#ifdef __cplusplus") - - cpp_quote("/////////////////////////////////////////////////////") - cpp_quote("") - cpp_quote("class DXBASESAMPLE;") - cpp_quote("class DXSAMPLE;") - cpp_quote("class DXPMSAMPLE;") - cpp_quote("") - cpp_quote("/////////////////////////////////////////////////////") - cpp_quote("") - cpp_quote("class DXBASESAMPLE") - cpp_quote("{") - cpp_quote("public:") - cpp_quote(" BYTE Blue;") - cpp_quote(" BYTE Green;") - cpp_quote(" BYTE Red;") - cpp_quote(" BYTE Alpha;") - cpp_quote(" DXBASESAMPLE() {}") - cpp_quote(" DXBASESAMPLE(const BYTE alpha, const BYTE red, const BYTE green, const BYTE blue) :") - cpp_quote(" Alpha(alpha),") - cpp_quote(" Red(red),") - cpp_quote(" Green(green),") - cpp_quote(" Blue(blue) {}") - cpp_quote(" DXBASESAMPLE(const DWORD val) { *this = (*(DXBASESAMPLE *)&val); }") - cpp_quote(" operator DWORD () const {return *((DWORD *)this); }") - cpp_quote(" DWORD operator=(const DWORD val) { return *this = *((DXBASESAMPLE *)&val); }") - cpp_quote("}; // DXBASESAMPLE") - cpp_quote("") - cpp_quote("/////////////////////////////////////////////////////") - cpp_quote("") - cpp_quote("class DXSAMPLE : public DXBASESAMPLE") - cpp_quote("{") - cpp_quote("public:") - cpp_quote(" DXSAMPLE() {}") - cpp_quote(" DXSAMPLE(const BYTE alpha, const BYTE red, const BYTE green, const BYTE blue) :") - cpp_quote(" DXBASESAMPLE(alpha, red, green, blue) {}") - cpp_quote(" DXSAMPLE(const DWORD val) { *this = (*(DXSAMPLE *)&val); }") - cpp_quote(" operator DWORD () const {return *((DWORD *)this); }") - cpp_quote(" DWORD operator=(const DWORD val) { return *this = *((DXSAMPLE *)&val); }") - cpp_quote(" operator DXPMSAMPLE() const;") - cpp_quote("}; // DXSAMPLE") - cpp_quote("") - cpp_quote("/////////////////////////////////////////////////////") - cpp_quote("") - cpp_quote("class DXPMSAMPLE : public DXBASESAMPLE") - cpp_quote("{") - cpp_quote("public:") - cpp_quote(" DXPMSAMPLE() {}") - cpp_quote(" DXPMSAMPLE(const BYTE alpha, const BYTE red, const BYTE green, const BYTE blue) :") - cpp_quote(" DXBASESAMPLE(alpha, red, green, blue) {}") - cpp_quote(" DXPMSAMPLE(const DWORD val) { *this = (*(DXPMSAMPLE *)&val); }") - cpp_quote(" operator DWORD () const {return *((DWORD *)this); }") - cpp_quote(" DWORD operator=(const DWORD val) { return *this = *((DXPMSAMPLE *)&val); }") - cpp_quote(" operator DXSAMPLE() const;") - cpp_quote("}; // DXPMSAMPLE") - cpp_quote("") - cpp_quote("//") - cpp_quote("// The following cast operators are to prevent a direct assignment of a DXSAMPLE to a DXPMSAMPLE") - cpp_quote("//") - cpp_quote("inline DXSAMPLE::operator DXPMSAMPLE() const { return *((DXPMSAMPLE *)this); }") - cpp_quote("inline DXPMSAMPLE::operator DXSAMPLE() const { return *((DXSAMPLE *)this); }") - - -//+----------------------------------------------------------------------------- -// -// Sample structures (IDL, C) -// -//------------------------------------------------------------------------------ - -cpp_quote("#else // !__cplusplus") - - typedef struct DXBASESAMPLE - { - BYTE Blue; - BYTE Green; - BYTE Red; - BYTE Alpha; - } DXBASESAMPLE; - - typedef struct DXSAMPLE - { - BYTE Blue; - BYTE Green; - BYTE Red; - BYTE Alpha; - } DXSAMPLE; - - typedef struct DXPMSAMPLE - { - BYTE Blue; - BYTE Green; - BYTE Red; - BYTE Alpha; - } DXPMSAMPLE; - -cpp_quote("#endif // !__cplusplus") - -//+----------------------------------------------------------------------------- -// -// DXRUNINFO structures. -// -//------------------------------------------------------------------------------ - - typedef enum DXRUNTYPE - { - DXRUNTYPE_CLEAR = 0, // The run is zero Alpha - DXRUNTYPE_OPAQUE = 1, // The run is full Alpha (i.e. 255) - DXRUNTYPE_TRANS = 2, // The run is non-zero Alpha - DXRUNTYPE_UNKNOWN= 3 // The run type is unknown. Caller must inspect. - } DXRUNTYPE; - - const ULONG DX_MAX_RUN_INFO_COUNT = 128; // Defines the maximum number of RUNINFOs in a single row - - - cpp_quote("// Ignore the definition used by MIDL for TLB generation") - cpp_quote("#if 0") - - typedef struct DXRUNINFO - { - ULONG Bitfields; - } DXRUNINFO; - - cpp_quote("#endif // 0") - - // Emit the C definition to the H file directly, as bit fields are not - // supported by MIDL. - - cpp_quote("typedef struct DXRUNINFO") - cpp_quote("{") - cpp_quote(" ULONG Type : 2; // Type") - cpp_quote(" ULONG Count : 30; // Number of samples in run") - cpp_quote("} DXRUNINFO;") - - - typedef enum DXSFCREATE - { - DXSF_FORMAT_IS_CLSID = ( 1L << 0 ), - DXSF_NO_LAZY_DDRAW_LOCK = ( 1L << 1 ) - } DXSFCREATE; - - typedef enum DXBLTOPTIONS - { - DXBOF_DO_OVER = (1L << 0), - DXBOF_DITHER = (1L << 1) - } DXBLTOPTIONS; - - -//+----------------------------------------------------------------------------- -// -// IDXSurfaceModifier -// -//------------------------------------------------------------------------------ - - [ - object, - uuid(144946F5-C4D4-11d1-81D1-0000F87557DB), - helpstring("IDXSurfaceFactory Interface"), - pointer_default(unique), - local - ] - interface IDXSurfaceFactory : IUnknown - { - HRESULT CreateSurface([in] IUnknown *pDirectDraw, - [in] const DDSURFACEDESC * pDDSurfaceDesc, - [in] const GUID * pFormatID, - [in] const DXBNDS *pBounds, - [in] DWORD dwFlags, - [in] IUnknown *punkOuter, - [in] REFIID riid, - [out, iid_is( riid )] void ** ppDXSurface); - - HRESULT CreateFromDDSurface([in] IUnknown *pDDrawSurface, - [in] const GUID *pFormatID, - [in] DWORD dwFlags, - [in] IUnknown *punkOuter, - [in] REFIID riid, - [out, iid_is( riid )] void ** ppDXSurface); - - HRESULT LoadImage( - [in] const LPWSTR pszFileName, - [in] IUnknown *pDirectDraw, - [in] const DDSURFACEDESC * pDDSurfaceDesc, - [in] const GUID *pFormatID, - [in] REFIID riid, - [out, iid_is( riid )] void ** ppDXSurface); - - HRESULT LoadImageFromStream([in] IStream *pStream, - [in] IUnknown *pDirectDraw, - [in] const DDSURFACEDESC * pDDSurfaceDesc, - [in] const GUID *pFormatID, - [in] REFIID riid, - [out, iid_is( riid )] void ** ppDXSurface); - - HRESULT CopySurfaceToNewFormat( [in]IDXSurface* pSrc, - [in] IUnknown *pDirectDraw, - [in] const DDSURFACEDESC * pDDSurfaceDesc, - [in] const GUID *pDestFormatID, - [out] IDXSurface** ppNewSurface ); - - HRESULT CreateD3DRMTexture([in] IDXSurface *pSrc, - [in] IUnknown *pDirectDraw, - [in] IUnknown *pD3DRM3, - [in] REFIID riid, - [out, iid_is(riid)] void **ppTexture3); - - HRESULT BitBlt([in] IDXSurface *pDest, - [in] const DXVEC *pPlacement, - [in] IDXSurface *pSrc, - [in] const DXBNDS *pClipBounds, - [in] DWORD dwFlags); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXSurfaceModifier -// -//------------------------------------------------------------------------------ - - typedef enum DXSURFMODCOMPOP - { - DXSURFMOD_COMP_OVER = 0, - DXSURFMOD_COMP_ALPHA_MASK = 1, - DXSURFMOD_COMP_MAX_VALID = 1 - } DXSURFMODCOMPOP; - - [ - object, - uuid(9EA3B637-C37D-11d1-905E-00C04FD9189D), - helpstring("IDXSurfaceModifier Interface"), - pointer_default(unique), - local - ] - interface IDXSurfaceModifier : IUnknown - { - HRESULT SetFillColor([in] DXSAMPLE Color); - HRESULT GetFillColor([out] DXSAMPLE *pColor); - HRESULT SetBounds([in] const DXBNDS *pBounds ); // Get supported though IDXSurface interface - HRESULT SetBackground([in] IDXSurface *pSurface); - HRESULT GetBackground([out] IDXSurface **ppSurface); - HRESULT SetCompositeOperation([in] DXSURFMODCOMPOP CompOp); - HRESULT GetCompositeOperation([out] DXSURFMODCOMPOP *pCompOp); - // - // The following methods only apply to the FOREGROUND surface - // - HRESULT SetForeground([in] IDXSurface *pSurface, [in] BOOL bTile, [in] const POINT * pOrigin); - HRESULT GetForeground([out] IDXSurface **ppSurface, [out] BOOL *pbTile, [out] POINT * pOrigin); - HRESULT SetOpacity([in] float Opacity); - HRESULT GetOpacity([out] float *pOpacity); - HRESULT SetLookup( [in]IDXLookupTable * pLookupTable ); - HRESULT GetLookup( [out]IDXLookupTable ** ppLookupTable ); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXSurface -// -//------------------------------------------------------------------------------ - - typedef enum DXSAMPLEFORMATENUM - { - DXPF_FLAGSMASK = (0xFFFF0000), // Top word is flags, low word is enum - DXPF_NONPREMULT = (0x00010000), // Flags to be OR'd with pixel formats - DXPF_TRANSPARENCY = (0x00020000), // Color key or one-bit alpha (alpha only 0 or 0xFF) - DXPF_TRANSLUCENCY = (0x00040000), // Alpha can be any value from 0->0xFF - // - // This 3-bit field is used to determine what type of dithering to be used - // - DXPF_2BITERROR = (0x00200000), // 2 bits of error term - DXPF_3BITERROR = (0x00300000), // 3 bits of error term for color (16-bit color) - DXPF_4BITERROR = (0x00400000), // 4 bits of error term (ARGB 4444) - DXPF_5BITERROR = (0x00500000), // 5 bits of error term for color (8-bit color) - DXPF_ERRORMASK = (0x00700000), // Mask of bits used for dithering - - DXPF_NONSTANDARD = (0), // To be used for any surface that is not one of the following formats - // This can be combined with DXPFNONPREMULT if the surface can work - // better in non-premultiplied space. - DXPF_PMARGB32 = (1 | DXPF_TRANSPARENCY | DXPF_TRANSLUCENCY), - DXPF_ARGB32 = (2 | DXPF_NONPREMULT | DXPF_TRANSPARENCY | DXPF_TRANSLUCENCY), - DXPF_ARGB4444 = (3 | DXPF_NONPREMULT | DXPF_TRANSPARENCY | DXPF_TRANSLUCENCY | DXPF_4BITERROR), - DXPF_A8 = (4 | DXPF_TRANSPARENCY | DXPF_TRANSLUCENCY), - DXPF_RGB32 = (5), - DXPF_RGB24 = (6), - DXPF_RGB565 = (7 | DXPF_3BITERROR), - DXPF_RGB555 = (8 | DXPF_3BITERROR), - DXPF_RGB8 = (9 | DXPF_5BITERROR), - DXPF_ARGB1555 = (10 | DXPF_TRANSPARENCY | DXPF_3BITERROR), - DXPF_RGB32_CK = (DXPF_RGB32 | DXPF_TRANSPARENCY), - DXPF_RGB24_CK = (DXPF_RGB24 | DXPF_TRANSPARENCY), - DXPF_RGB555_CK = (DXPF_RGB555 | DXPF_TRANSPARENCY), - DXPF_RGB565_CK = (DXPF_RGB565 | DXPF_TRANSPARENCY), - DXPF_RGB8_CK = (DXPF_RGB8 | DXPF_TRANSPARENCY) - } DXSAMPLEFORMATENUM; - - typedef enum DXLOCKSURF - { - DXLOCKF_READ = 0, - DXLOCKF_READWRITE = (1 << 0), - DXLOCKF_EXISTINGINFOONLY = (1 << 1), // If used in conjunction with WANTRUNINFO will prevent creation of a runmap if one does not exist - DXLOCKF_WANTRUNINFO = (1 << 2), - // - // The flags in the high word should be specific to the type of pointer that - // is requested. These flags define ARGB flags. These flags are advisory and - // are not required to be set for ARGB locks. - // - DXLOCKF_NONPREMULT = (1 << 16), // Caller will request non-premultiplied data - DXLOCKF_VALIDFLAGS = (DXLOCKF_READWRITE | DXLOCKF_EXISTINGINFOONLY | DXLOCKF_WANTRUNINFO | DXLOCKF_NONPREMULT) - } DXLOCKSURF; - - typedef enum DXSURFSTATUS - { - DXSURF_TRANSIENT = (1 << 0), // Data in this surface changes often. - DXSURF_READONLY = (1 << 1), // Surface is read-only - DXSURF_VALIDFLAGS = (DXSURF_TRANSIENT | DXSURF_READONLY) - } DXSURFSTATUS; - - [ - object, - uuid(B39FD73F-E139-11d1-9065-00C04FD9189D), - helpstring("IDXSurface Interface"), - pointer_default(unique), - local - ] - interface IDXSurface : IDXBaseObject - { - HRESULT GetPixelFormat([out] GUID * pFormatID, [out] DXSAMPLEFORMATENUM *pSampleFormatEnum); - HRESULT GetBounds( [out]DXBNDS *pBounds ); - HRESULT GetStatusFlags([out] DWORD * pdwStatusFlags); - HRESULT SetStatusFlags([in] DWORD dwStatusFlags); - HRESULT LockSurface( [in]const DXBNDS *pBounds, [in]ULONG ulTimeOut, [in]DWORD dwFlags, - [in]REFIID riid, [out, iid_is(riid)] void **ppPointer, - [out]ULONG* pulGenerationId ); - HRESULT GetDirectDrawSurface( [in] REFIID riid, - [out, iid_is(riid)] void ** ppSurface); - HRESULT GetColorKey(DXSAMPLE * pColorKey); // Can return E_NOTIMPL - HRESULT SetColorKey(DXSAMPLE ColorKey); // Set color of 0 to get rid of color key, can return E_NOTIMPL - HRESULT LockSurfaceDC( [in] const DXBNDS *pBounds, [in]ULONG ulTimeOut, [in] DWORD dwFlags, - [out] IDXDCLock **ppDCLock); - HRESULT SetAppData(DWORD_PTR dwAppData); - HRESULT GetAppData(DWORD_PTR *pdwAppData); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXSurfaceInit -// -//------------------------------------------------------------------------------ - - [ - object, - uuid(9EA3B639-C37D-11d1-905E-00C04FD9189D), - helpstring("IDXSurfaceInit Interface"), - pointer_default(unique), - local - ] - interface IDXSurfaceInit : IUnknown - { - HRESULT InitSurface([in] IUnknown *pDirectDraw, - [in] const DDSURFACEDESC *pDDSurfaceDesc, - [in] const GUID * pFormatID, - [in] const DXBNDS *pBounds, - [in] DWORD dwFlags); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXARGBSurfaceInit -// -//------------------------------------------------------------------------------ - - [ - object, - uuid(9EA3B63A-C37D-11d1-905E-00C04FD9189D), - helpstring("IDXARGBSurfaceInit Interface"), - pointer_default(unique), - local - ] - interface IDXARGBSurfaceInit : IDXSurfaceInit - { - HRESULT InitFromDDSurface( [in] IUnknown *pDDrawSurface, - [in] const GUID * pFormatID, - [in] DWORD dwFlags); - HRESULT InitFromRawSurface([in] IDXRawSurface *pRawSurface); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXARGBReadPtr -// -//------------------------------------------------------------------------------ - - typedef struct tagDXNATIVETYPEINFO - { - BYTE * pCurrentData; - BYTE * pFirstByte; - long lPitch; - DWORD dwColorKey; - } DXNATIVETYPEINFO; - - typedef struct tagDXPACKEDRECTDESC - { - DXBASESAMPLE *pSamples; - BOOL bPremult; - RECT rect; - long lRowPadding; - } DXPACKEDRECTDESC; - - typedef struct tagDXOVERSAMPLEDESC - { - POINT p; - DXPMSAMPLE Color; - } DXOVERSAMPLEDESC; - - [ - object, - uuid(EAAAC2D6-C290-11d1-905D-00C04FD9189D), - helpstring("IDXARGBReadPtr Interface"), - pointer_default(unique), - local - ] - interface IDXARGBReadPtr : IUnknown - { - HRESULT GetSurface( [in]REFIID riid, [out, iid_is( riid )]void ** ppSurface); - DXSAMPLEFORMATENUM GetNativeType( [out]DXNATIVETYPEINFO *pInfo ); - void Move( [in]long cSamples ); - void MoveToRow( [in]ULONG y ); - void MoveToXY( [in]ULONG x, [in]ULONG y); - ULONG MoveAndGetRunInfo( [in]ULONG Row, [out] const DXRUNINFO** ppInfo ); // Returns count of runs - DXSAMPLE * Unpack( [in]DXSAMPLE* pSamples, [in]ULONG cSamples, [in]BOOL bMove ); - DXPMSAMPLE * UnpackPremult( [in]DXPMSAMPLE* pSamples, [in]ULONG cSamples, [in]BOOL bMove ); - void UnpackRect([in] const DXPACKEDRECTDESC * pRectDesc); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXARGBReadWritePtr -// -//------------------------------------------------------------------------------ - - [ - object, - uuid(EAAAC2D7-C290-11d1-905D-00C04FD9189D), - helpstring("IDXARGBReadWritePtr Interface"), - pointer_default(unique), - local - ] - interface IDXARGBReadWritePtr : IDXARGBReadPtr - { - void PackAndMove( [in]const DXSAMPLE *pSamples, [in]ULONG cSamples ); - void PackPremultAndMove( [in]const DXPMSAMPLE *pSamples, [in]ULONG cSamples ); - void PackRect([in]const DXPACKEDRECTDESC *pRectDesc); - void CopyAndMoveBoth( [in]DXBASESAMPLE *pScratchBuffer, [in]IDXARGBReadPtr *pSrc, - [in]ULONG cSamples, [in]BOOL bIsOpaque ); - void CopyRect( [in] DXBASESAMPLE *pScratchBuffer, - [in] const RECT *pDestRect, [in]IDXARGBReadPtr *pSrc, - [in] const POINT *pSrcOrigin, [in]BOOL bIsOpaque); - void FillAndMove( [in]DXBASESAMPLE *pScratchBuffer, [in]DXPMSAMPLE SampVal, - [in]ULONG cSamples, [in]BOOL bDoOver ); - void FillRect( [in]const RECT *pRect, [in]DXPMSAMPLE SampVal, [in]BOOL bDoOver ); - void OverSample( [in]const DXOVERSAMPLEDESC * pOverDesc); - void OverArrayAndMove([in]DXBASESAMPLE *pScratchBuffer, - [in] const DXPMSAMPLE *pSrc, - [in] ULONG cSamples); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXDCLock -// -//------------------------------------------------------------------------------ - - [ - object, - uuid(0F619456-CF39-11d1-905E-00C04FD9189D), - helpstring("IDXDCLock Interface"), - pointer_default(unique), - local - ] - interface IDXDCLock : IUnknown - { - HDC GetDC(void); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXTScaleOutput -// -// Overview: -// Generic interface that any transform can support which allows caller to -// specify the desired output bounds. -//------------------------------------------------------------------------------ - - [ - object, - uuid(B2024B50-EE77-11d1-9066-00C04FD9189D), - helpstring("IDXTScaleOutput Interface"), - pointer_default(unique), - local - ] - interface IDXTScaleOutput : IUnknown - { - HRESULT SetOutputSize([in] const SIZE OutSize, [in] BOOL bMaintainAspect); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXGradient -// -//------------------------------------------------------------------------------ - - [ - object, - uuid(B2024B51-EE77-11d1-9066-00C04FD9189D), - helpstring("IDXGradient Interface"), - pointer_default(unique), - local - ] - interface IDXGradient : IDXTScaleOutput - { - HRESULT SetGradient(DXSAMPLE StartColor, DXSAMPLE EndColor, BOOL bHorizontal); - HRESULT GetOutputSize([out] SIZE *pOutSize); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXTScale -// -// Overview: -// This is the control interface for the simple scale transform. -// -//------------------------------------------------------------------------------ - - [ - object, - uuid(B39FD742-E139-11d1-9065-00C04FD9189D), - helpstring("IDXTScale Interface"), - pointer_default(unique), - local - ] - interface IDXTScale : IUnknown - { - HRESULT SetScales( [in]float Scales[2] ); - HRESULT GetScales( [out]float Scales[2] ); - HRESULT ScaleFitToSize( [in,out]DXBNDS* pClipBounds, - [in]SIZE FitToSize, [in]BOOL bMaintainAspect ); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXEffect -// -// Overview: -// This interface is used to generically control transforms that are -// transition effects. -// -//------------------------------------------------------------------------------ - - typedef enum DISPIDDXEFFECT - { - DISPID_DXECAPABILITIES = 10000, // Start at 10000 to avoid conflicts with inhereted interfaces - DISPID_DXEPROGRESS, - DISPID_DXESTEP, - DISPID_DXEDURATION, - DISPID_DXE_NEXT_ID - } DISPIDDXBOUNDEDEFFECT; - - typedef enum DXEFFECTTYPE - { - DXTET_PERIODIC = (1 << 0), // Result at 1 is same as result at 0 - DXTET_MORPH = (1 << 1) // Transition between 2 inputs (input 0 to input 1) - } DXEFFECTTYPE; - - [ - object, - uuid(E31FB81B-1335-11d1-8189-0000F87557DB), - helpstring("IDXEffect Interface"), - pointer_default(unique), - dual - ] - interface IDXEffect : IDispatch - { - [propget, id(DISPID_DXECAPABILITIES)] - HRESULT Capabilities([out, retval] long *pVal); - [propget, id(DISPID_DXEPROGRESS)] - HRESULT Progress([out, retval] float *pVal); - [propput, id(DISPID_DXEPROGRESS)] - HRESULT Progress([in] float newVal); - [propget, id(DISPID_DXESTEP)] - HRESULT StepResolution([out, retval] float *pVal); - [propget, id(DISPID_DXEDURATION)] - HRESULT Duration([out, retval] float *pVal); - [propput, id(DISPID_DXEDURATION)] - HRESULT Duration([in] float newVal); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXLookupTable -// -//------------------------------------------------------------------------------ - - [ - object, - uuid(01BAFC7F-9E63-11d1-9053-00C04FD9189D), - helpstring("IDXLookupTable Interface"), - pointer_default(unique), - local - ] - interface IDXLookupTable : IDXBaseObject - { - HRESULT GetTables( [out]BYTE RedLUT[256], - [out]BYTE GreenLUT[256], - [out]BYTE BlueLUT[256], - [out]BYTE AlphaLUT[256] ); - - HRESULT IsChannelIdentity([out] DXBASESAMPLE * pSampleBools); - HRESULT GetIndexValues([in] ULONG Index, [out] DXBASESAMPLE *pSample); - HRESULT ApplyTables([in, out] DXSAMPLE *pSamples, [in] ULONG cSamples); - }; - - -//+----------------------------------------------------------------------------- -// -// IDXRawSurface -// -// Overview: -// User created objects support IDXRawSurface -// -//------------------------------------------------------------------------------ - - typedef struct DXRAWSURFACEINFO - { - BYTE * pFirstByte; - long lPitch; - ULONG Width; - ULONG Height; - const GUID * pPixelFormat; - HDC hdc; - DWORD dwColorKey; // Note: High byte must == 0xFF for color keyed surface. Low 3 bytes are native data type. - DXBASESAMPLE * pPalette; - } DXRAWSURFACEINFO; - - [ - object, - uuid(09756C8A-D96A-11d1-9062-00C04FD9189D), - helpstring("IDXRawSurface Interface"), - pointer_default(unique), - local - ] - interface IDXRawSurface : IUnknown - { - HRESULT GetSurfaceInfo(DXRAWSURFACEINFO * pSurfaceInfo); - }; - - -//+----------------------------------------------------------------------------- -// -// IHTMLDXTransform -// -//------------------------------------------------------------------------------ - - [ - object, - uuid(30E2AB7D-4FDD-4159-B7EA-DC722BF4ADE5), - helpstring("IHTMLDXTransform Interface"), - pointer_default(unique), - local - ] - interface IHTMLDXTransform : IUnknown - { - HRESULT SetHostUrl(BSTR bstrHostUrl); - }; - - -//+----------------------------------------------------------------------------- -// -// ICSSFilterDispatch -// -//------------------------------------------------------------------------------ - - typedef enum DXTFILTER_STATUS - { - DXTFILTER_STATUS_Stopped = 0, - DXTFILTER_STATUS_Applied, - DXTFILTER_STATUS_Playing, - DXTFILTER_STATUS_MAX - } DXTFILTER_STATUS; - - typedef enum DXTFILTER_DISPID - { - DISPID_DXTFilter_Percent = 1, - DISPID_DXTFilter_Duration, - DISPID_DXTFilter_Enabled, - DISPID_DXTFilter_Status, - DISPID_DXTFilter_Apply, - DISPID_DXTFilter_Play, - DISPID_DXTFilter_Stop, - DISPID_DXTFilter_MAX - } DXTFILTER_DISPID; - - [ - object, - uuid(9519152B-9484-4A6C-B6A7-4F25E92D6C6B), - helpstring("ICSSFilterDispatch Interface"), - pointer_default(unique), - dual - ] - interface ICSSFilterDispatch : IDispatch - { - [propget, id(DISPID_DXTFilter_Percent)] HRESULT Percent( [out, retval] float *pVal); - [propput, id(DISPID_DXTFilter_Percent)] HRESULT Percent( [in] float newVal); - [propget, id(DISPID_DXTFilter_Duration)] HRESULT Duration([out, retval] float *pVal); - [propput, id(DISPID_DXTFilter_Duration)] HRESULT Duration([in] float newVal); - [propget, id(DISPID_DXTFilter_Enabled)] HRESULT Enabled( [out, retval] VARIANT_BOOL *pfVal); - [propput, id(DISPID_DXTFilter_Enabled)] HRESULT Enabled( [in] VARIANT_BOOL fVal); - [propget, id(DISPID_DXTFilter_Status)] HRESULT Status( [out, retval] DXTFILTER_STATUS * peVal); - [id(DISPID_DXTFilter_Apply)] HRESULT Apply(); - [id(DISPID_DXTFilter_Play)] HRESULT Play([in, optional] VARIANT varDuration); - [id(DISPID_DXTFilter_Stop)] HRESULT Stop(); - }; - - -//=== CoClass definitions ================================================= - -[ - uuid(54314D1D-35FE-11d1-81A1-0000F87557DB), - version(1.1), - helpstring("Microsoft DirectX Transforms Core Type Library") -] -library DXTRANSLib -{ - importlib("stdole2.tlb"); - - /////////////////////////////// - // DXTransformFactory CoClass - /////////////////////////////// - [ - uuid(D1FE6762-FC48-11D0-883A-3C8B00C10000), - helpstring("DXTransformFactory Class") - ] - coclass DXTransformFactory - { - [default] interface IDXTransformFactory; - interface IDXSurfaceFactory; - }; - - - /////////////////////////////// - // DXTaskManager CoClass - /////////////////////////////// - [ - uuid(4CB26C03-FF93-11d0-817E-0000F87557DB), - helpstring("DXTaskManager Class") - ] - coclass DXTaskManager - { - [default] interface IDXTaskManager; - }; - - - /////////////////////////////// - // DXTScale CoClass - /////////////////////////////// - [ - uuid(555278E2-05DB-11D1-883A-3C8B00C10000), - helpstring("DXTScale Class") - ] - coclass DXTScale - { - [default] interface IDXTScale; - }; - - - /////////////////////////////// - // DXSurface CoClass - /////////////////////////////// - [ - uuid(0E890F83-5F79-11D1-9043-00C04FD9189D), - helpstring("DXSurface Class") - ] - coclass DXSurface - { - [default] interface IDXSurface; - }; - - - /////////////////////////////// - // DXSurfaceModifier CoClass - /////////////////////////////// - [ - uuid(3E669F1D-9C23-11d1-9053-00C04FD9189D), - helpstring("DXSurfaceModifier Class") - ] - coclass DXSurfaceModifier - { - [default] interface IDXSurfaceModifier; - }; - - - /////////////////////////////// - // DXGradient CoClass - /////////////////////////////// - [ - uuid(C6365470-F667-11d1-9067-00C04FD9189D), - helpstring("DXGradient Class") - ] - coclass DXGradient - { - [default] interface IDXGradient; - }; - - - /////////////////////////////// - // DXTFilter CoClass - /////////////////////////////// - [ - uuid(385A91BC-1E8A-4e4a-A7A6-F4FC1E6CA1BD), - helpstring("DXTFilter Class") - ] - coclass DXTFilter - { - [default] interface ICSSFilterDispatch; - }; -}; - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// The following is the original contents of this header from -// the DirectX 8.0 SDK. -// -///////////////////////////////////////////////////////////////////////////// - -#else // DirectX 8.0 content - - - //=== Constants ============================================================= - - cpp_quote("//") - cpp_quote("// All GUIDs for DXTransform are declared in DXTGUID.C in the SDK include directory") - cpp_quote("//") - cpp_quote("EXTERN_C const GUID DDPF_RGB1;") - cpp_quote("EXTERN_C const GUID DDPF_RGB2;") - cpp_quote("EXTERN_C const GUID DDPF_RGB4;") - cpp_quote("EXTERN_C const GUID DDPF_RGB8;") - cpp_quote("EXTERN_C const GUID DDPF_RGB332;") - cpp_quote("EXTERN_C const GUID DDPF_ARGB4444;") - cpp_quote("EXTERN_C const GUID DDPF_RGB565;") - cpp_quote("EXTERN_C const GUID DDPF_BGR565;") - cpp_quote("EXTERN_C const GUID DDPF_RGB555;") - cpp_quote("EXTERN_C const GUID DDPF_ARGB1555;") - cpp_quote("EXTERN_C const GUID DDPF_RGB24;") - cpp_quote("EXTERN_C const GUID DDPF_BGR24;") - cpp_quote("EXTERN_C const GUID DDPF_RGB32;") - cpp_quote("EXTERN_C const GUID DDPF_BGR32;") - cpp_quote("EXTERN_C const GUID DDPF_ABGR32;") - cpp_quote("EXTERN_C const GUID DDPF_ARGB32;") - cpp_quote("EXTERN_C const GUID DDPF_PMARGB32;") - cpp_quote("EXTERN_C const GUID DDPF_A1;") - cpp_quote("EXTERN_C const GUID DDPF_A2;") - cpp_quote("EXTERN_C const GUID DDPF_A4;") - cpp_quote("EXTERN_C const GUID DDPF_A8;") - cpp_quote("EXTERN_C const GUID DDPF_Z8;") - cpp_quote("EXTERN_C const GUID DDPF_Z16;") - cpp_quote("EXTERN_C const GUID DDPF_Z24;") - cpp_quote("EXTERN_C const GUID DDPF_Z32;") - cpp_quote("//") - cpp_quote("// Component categories") - cpp_quote("//") - cpp_quote("EXTERN_C const GUID CATID_DXImageTransform;") - cpp_quote("EXTERN_C const GUID CATID_DX3DTransform;") - cpp_quote("EXTERN_C const GUID CATID_DXAuthoringTransform;") - cpp_quote("EXTERN_C const GUID CATID_DXSurface;") - cpp_quote("//") - cpp_quote("// Service IDs") - cpp_quote("//") - cpp_quote("EXTERN_C const GUID SID_SDirectDraw;") - cpp_quote("EXTERN_C const GUID SID_SDirect3DRM;") - cpp_quote("#define SID_SDXTaskManager CLSID_DXTaskManager") - cpp_quote("#define SID_SDXSurfaceFactory IID_IDXSurfaceFactory") - cpp_quote("#define SID_SDXTransformFactory IID_IDXTransformFactory") - - //=== Struct & Enum definitions ============================================= - - //=== Interface definitions ================================================= - - - [ - uuid(17B59B2B-9CC8-11d1-9053-00C04FD9189D), - helpstring("IDXBaseObject Interface"), - pointer_default(unique) - ] - interface IDXBaseObject : IUnknown - { - HRESULT GetGenerationId( [out]ULONG *pID); - HRESULT IncrementGenerationId([in] BOOL bRefresh); - HRESULT GetObjectSize( [out] ULONG *pcbSize); - } - - //--- Dimension identifiers - typedef enum DXBNDID - { - DXB_X = 0, - DXB_Y = 1, - DXB_Z = 2, - DXB_T = 3 - } DXBNDID; - - //--- Bound types - typedef enum DXBNDTYPE - { - DXBT_DISCRETE, - DXBT_DISCRETE64, - DXBT_CONTINUOUS, - DXBT_CONTINUOUS64 - } DXBNDTYPE; - - //--- Discrete bounds (image & sound) - typedef struct DXDBND - { - long Min; - long Max; - } DXDBND; - typedef DXDBND DXDBNDS[4]; - - typedef struct DXDBND64 - { - LONGLONG Min; - LONGLONG Max; - } DXDBND64; - typedef DXDBND64 DXDBNDS64[4]; - - //--- Continuous bounds (geometry) - typedef struct DXCBND - { - float Min; - float Max; - } DXCBND; - typedef DXCBND DXCBNDS[4]; - - typedef struct DXCBND64 - { - double Min; - double Max; - } DXCBND64; - typedef DXCBND64 DXCBNDS64[4]; - - //--- Combined space - typedef union DXBNDS switch( DXBNDTYPE eType ) u - { - case DXBT_DISCRETE: - DXDBND D[4]; - case DXBT_DISCRETE64: - DXDBND64 LD[4]; - case DXBT_CONTINUOUS: - DXCBND C[4]; - case DXBT_CONTINUOUS64: - DXCBND64 LC[4]; - } DXBNDS; - - //--- Discrete 4D vector - typedef long DXDVEC[4]; - typedef LONGLONG DXDVEC64[4]; - - //--- Continous 4D vector - typedef float DXCVEC[4]; - typedef double DXCVEC64[4]; - - //--- Combined space vector - typedef union DXVEC switch( DXBNDTYPE eType ) u - { - case DXBT_DISCRETE: - long D[4]; - case DXBT_DISCRETE64: - LONGLONG LD[4]; - case DXBT_CONTINUOUS: - float C[4]; - case DXBT_CONTINUOUS64: - double LC[4]; - } DXVEC; - - //--- IDXTransformFactory --------------------------------------------------- - [ - uuid(6A950B2B-A971-11d1-81C8-0000F87557DB), - helpstring("IDXTransformFactory Interface"), - pointer_default(unique) - ] - interface IDXTransformFactory : IServiceProvider - { - HRESULT SetService( [in]REFGUID guidService, - [in]IUnknown *pUnkService, - [in]BOOL bWeakReference); - - HRESULT CreateTransform( [in, size_is(ulNumInputs)]IUnknown** punkInputs, - [in]ULONG ulNumInputs, - [in, size_is(ulNumOutputs)]IUnknown** punkOutputs, - [in]ULONG ulNumOutputs, - [in]IPropertyBag* pInitProps, [in]IErrorLog* pErrLog, - [in]REFCLSID TransCLSID, [in]REFIID TransIID, - [out, iid_is(TransIID)]void** ppTransform ); - - HRESULT InitializeTransform( [in]IDXTransform* pTransform, - [in, size_is(ulNumInputs)]IUnknown** punkInputs, - [in]ULONG ulNumInputs, - [in, size_is(ulNumOutputs)]IUnknown** punkOutputs, - [in]ULONG ulNumOutputs, - [in]IPropertyBag* pInitProps, [in]IErrorLog* pErrLog ); - }; - - //--- IDXTransform ------------------------------------------------- - - typedef enum DXTMISCFLAGS - { - DXTMF_BLEND_WITH_OUTPUT = ( 1L << 0 ), - DXTMF_DITHER_OUTPUT = ( 1L << 1 ), - DXTMF_OPTION_MASK = (0x0000FFFF), // Low word is settable options - DXTMF_VALID_OPTIONS = (DXTMF_BLEND_WITH_OUTPUT | DXTMF_DITHER_OUTPUT), - // - // Status flags can not be changed by call to SetMiscFlags - // - DXTMF_BLEND_SUPPORTED = ( 1L << 16 ), - DXTMF_DITHER_SUPPORTED = ( 1L << 17 ), - DXTMF_INPLACE_OPERATION = ( 1L << 24 ), - DXTMF_BOUNDS_SUPPORTED = ( 1L << 25 ), - DXTMF_PLACEMENT_SUPPORTED = ( 1L << 26 ), - DXTMF_QUALITY_SUPPORTED = ( 1L << 27 ), - DXTMF_OPAQUE_RESULT = ( 1L << 28 ) - } DXTMISCFLAGS; - - - typedef enum DXINOUTINFOFLAGS - { - DXINOUTF_OPTIONAL = ( 1L << 0) - } DXINOUTINFOFLAGS; - - [ - uuid(30A5FB78-E11F-11d1-9064-00C04FD9189D), - helpstring("IDXTransform Interface"), - pointer_default(unique) - ] - interface IDXTransform : IDXBaseObject - { - HRESULT Setup( [in, size_is(ulNumInputs)] IUnknown * const * punkInputs, - [in]ULONG ulNumInputs, - [in, size_is(ulNumOutputs)] IUnknown * const * punkOutputs, - [in]ULONG ulNumOutputs, - [in]DWORD dwFlags ); - HRESULT Execute( [in]const GUID* pRequestID, [in]const DXBNDS *pClipBnds, - [in]const DXVEC *pPlacement ); - HRESULT MapBoundsIn2Out( [in] const DXBNDS *pInBounds, - [in]ULONG ulNumInBnds, - [in]ULONG ulOutIndex, - [out]DXBNDS *pOutBounds ); - HRESULT MapBoundsOut2In( [in] ULONG ulOutIndex, - [in] const DXBNDS *pOutBounds, - [in] ULONG ulInIndex, - [out]DXBNDS *pInBounds ); - HRESULT SetMiscFlags( [in] DWORD dwMiscFlags); - HRESULT GetMiscFlags( [out]DWORD * pdwMiscFlags ); - HRESULT GetInOutInfo( [in]BOOL bIsOutput, [in]ULONG ulIndex, - [out]DWORD *pdwFlags, [out, size_is(*pcIDs)] GUID *pIDs, - [in, out] ULONG *pcIDs, - [out] IUnknown **ppUnkCurrentObject); - HRESULT SetQuality( [in] float fQuality ); - HRESULT GetQuality( [out] float * fQuality ); - }; - - - [ - uuid(30A5FB79-E11F-11d1-9064-00C04FD9189D), - helpstring("IDXSurfacePick Interface"), - pointer_default(unique) - ] - interface IDXSurfacePick : IUnknown - { - HRESULT PointPick([in]const DXVEC *pPoint, - [out]ULONG * pulInputSurfaceIndex, - [out]DXVEC *pInputPoint); - } - - - //--- IDXTBindHost --------------------------------------------------- - // This interface is used to set a site-specific bind host for a transform. - // Only transforms that need access to a bind host need to implement this interface. - - // - // For some reason, MIDL does not like IBindHost, so we've declared this interface local - // - [ - uuid(D26BCE55-E9DC-11d1-9066-00C04FD9189D), - helpstring("IDXTBindHost Interface"), - pointer_default(unique), - local - ] - interface IDXTBindHost : IUnknown - { - HRESULT SetBindHost([in] IBindHost * pBindHost); - } - - //--- IDXTaskManager --------------------------------------------------- - // This interface is used to implement a task managment service provider - // to optimize thread usage. - - // Function type prototypes - typedef void (__stdcall DXTASKPROC)(void *pTaskData, BOOL* pbContinueProcessing ); - typedef DXTASKPROC *PFNDXTASKPROC; - - typedef void (__stdcall DXAPCPROC)(DWORD dwData); - typedef DXAPCPROC *PFNDXAPCPROC; - - cpp_quote("#ifdef __cplusplus") - cpp_quote("typedef struct DXTMTASKINFO" ) - cpp_quote("{") - cpp_quote(" PFNDXTASKPROC pfnTaskProc; // Pointer to function to execute") - cpp_quote(" PVOID pTaskData; // Pointer to argument data") - cpp_quote(" PFNDXAPCPROC pfnCompletionAPC; // Pointer to completion APC proc") - cpp_quote(" DWORD dwCompletionData; // Pointer to APC proc data") - cpp_quote(" const GUID* pRequestID; // Used to identify groups of tasks") - cpp_quote("} DXTMTASKINFO;") - cpp_quote("#else") - typedef struct DXTMTASKINFO - { - PVOID pfnTaskProc; // Pointer to function to execute - PVOID pTaskData; // Pointer to argument data - PVOID pfnCompletionAPC; // Pointer to completion APC proc - DWORD dwCompletionData; // Pointer to APC proc data - const GUID* pRequestID; // Used to identify groups of tasks - } DXTMTASKINFO; - cpp_quote("#endif") - - [ - local, - uuid(254DBBC1-F922-11d0-883A-3C8B00C10000), - helpstring("IDXTaskManager Interface"), - pointer_default(unique) - ] - interface IDXTaskManager : IUnknown - { - HRESULT QueryNumProcessors( [out]ULONG* pulNumProc ); - HRESULT SetThreadPoolSize( [in]ULONG ulNumThreads ); - HRESULT GetThreadPoolSize( [out]ULONG* pulNumThreads ); - HRESULT SetConcurrencyLimit( [in]ULONG ulNumThreads ); - HRESULT GetConcurrencyLimit( [out]ULONG* pulNumThreads ); - HRESULT ScheduleTasks( [in]DXTMTASKINFO TaskInfo[], - [in]HANDLE Events[], - [out]DWORD TaskIDs[], - [in]ULONG ulNumTasks, [in]ULONG ulWaitPeriod ); - HRESULT TerminateTasks( [in]DWORD TaskIDs[], [in]ULONG ulCount, - [in]ULONG ulTimeOut ); - HRESULT TerminateRequest( [in]REFIID RequestID, [in]ULONG ulTimeOut ); - }; - - //--- IDXSurfaceFactory --------------------------------------------------- - // - // We want an operator so that we can cast from a DXSAMPLE to a DWORD, so for C++ we will - // define the structure a special way. - // - - cpp_quote("#ifdef __cplusplus") - cpp_quote("/////////////////////////////////////////////////////") - cpp_quote("") - cpp_quote("class DXBASESAMPLE;") - cpp_quote("class DXSAMPLE;") - cpp_quote("class DXPMSAMPLE;") - cpp_quote("") - cpp_quote("/////////////////////////////////////////////////////") - cpp_quote("") - cpp_quote("class DXBASESAMPLE") - cpp_quote("{") - cpp_quote("public:") - cpp_quote(" BYTE Blue;") - cpp_quote(" BYTE Green;") - cpp_quote(" BYTE Red;") - cpp_quote(" BYTE Alpha;") - cpp_quote(" DXBASESAMPLE() {}") - cpp_quote(" DXBASESAMPLE(const BYTE alpha, const BYTE red, const BYTE green, const BYTE blue) :") - cpp_quote(" Alpha(alpha),") - cpp_quote(" Red(red),") - cpp_quote(" Green(green),") - cpp_quote(" Blue(blue) {}") - cpp_quote(" DXBASESAMPLE(const DWORD val) { *this = (*(DXBASESAMPLE *)&val); }") - cpp_quote(" operator DWORD () const {return *((DWORD *)this); }") - cpp_quote(" DWORD operator=(const DWORD val) { return *this = *((DXBASESAMPLE *)&val); }") - cpp_quote("}; // DXBASESAMPLE") - cpp_quote("") - cpp_quote("/////////////////////////////////////////////////////") - cpp_quote("") - cpp_quote("class DXSAMPLE : public DXBASESAMPLE") - cpp_quote("{") - cpp_quote("public:") - cpp_quote(" DXSAMPLE() {}") - cpp_quote(" DXSAMPLE(const BYTE alpha, const BYTE red, const BYTE green, const BYTE blue) :") - cpp_quote(" DXBASESAMPLE(alpha, red, green, blue) {}") - cpp_quote(" DXSAMPLE(const DWORD val) { *this = (*(DXSAMPLE *)&val); }") - cpp_quote(" operator DWORD () const {return *((DWORD *)this); }") - cpp_quote(" DWORD operator=(const DWORD val) { return *this = *((DXSAMPLE *)&val); }") - cpp_quote(" operator DXPMSAMPLE() const;") - cpp_quote("}; // DXSAMPLE") - cpp_quote("") - cpp_quote("/////////////////////////////////////////////////////") - cpp_quote("") - cpp_quote("class DXPMSAMPLE : public DXBASESAMPLE") - cpp_quote("{") - cpp_quote("public:") - cpp_quote(" DXPMSAMPLE() {}") - cpp_quote(" DXPMSAMPLE(const BYTE alpha, const BYTE red, const BYTE green, const BYTE blue) :") - cpp_quote(" DXBASESAMPLE(alpha, red, green, blue) {}") - cpp_quote(" DXPMSAMPLE(const DWORD val) { *this = (*(DXPMSAMPLE *)&val); }") - cpp_quote(" operator DWORD () const {return *((DWORD *)this); }") - cpp_quote(" DWORD operator=(const DWORD val) { return *this = *((DXPMSAMPLE *)&val); }") - cpp_quote(" operator DXSAMPLE() const;") - cpp_quote("}; // DXPMSAMPLE") - cpp_quote("") - cpp_quote("//") - cpp_quote("// The following cast operators are to prevent a direct assignment of a DXSAMPLE to a DXPMSAMPLE") - cpp_quote("//") - cpp_quote("inline DXSAMPLE::operator DXPMSAMPLE() const { return *((DXPMSAMPLE *)this); }") - cpp_quote("inline DXPMSAMPLE::operator DXSAMPLE() const { return *((DXSAMPLE *)this); }") - - cpp_quote("#else // !__cplusplus") - typedef struct DXBASESAMPLE - { - BYTE Blue; - BYTE Green; - BYTE Red; - BYTE Alpha; - } DXBASESAMPLE; - - typedef struct DXSAMPLE - { - BYTE Blue; - BYTE Green; - BYTE Red; - BYTE Alpha; - } DXSAMPLE; - - typedef struct DXPMSAMPLE - { - BYTE Blue; - BYTE Green; - BYTE Red; - BYTE Alpha; - } DXPMSAMPLE; - cpp_quote("#endif // !__cplusplus") - - typedef enum DXRUNTYPE - { - DXRUNTYPE_CLEAR = 0, // The run is zero Alpha - DXRUNTYPE_OPAQUE = 1, // The run is full Alpha (i.e. 255) - DXRUNTYPE_TRANS = 2, // The run is non-zero Alpha - DXRUNTYPE_UNKNOWN= 3 // The run type is unknown. Caller must inspect. - } DXRUNTYPE; - - const ULONG DX_MAX_RUN_INFO_COUNT = 128; // Defines the maximum number of RUNINFOs in a single row - - - cpp_quote("// Ignore the definition used by MIDL for TLB generation") - cpp_quote("#if 0") - - typedef struct DXRUNINFO - { - ULONG Bitfields; - } DXRUNINFO; - - cpp_quote("#endif // 0") - - // Emit the C definition to the H file directly, as bit fields are not - // supported by MIDL. - - cpp_quote("typedef struct DXRUNINFO") - cpp_quote("{") - cpp_quote(" ULONG Type : 2; // Type") - cpp_quote(" ULONG Count : 30; // Number of samples in run") - cpp_quote("} DXRUNINFO;") - - - typedef enum DXSFCREATE - { - DXSF_FORMAT_IS_CLSID = ( 1L << 0 ), - DXSF_NO_LAZY_DDRAW_LOCK = ( 1L << 1 ) - } DXSFCREATE; - - typedef enum DXBLTOPTIONS - { - DXBOF_DO_OVER = (1L << 0), - DXBOF_DITHER = (1L << 1) - } DXBLTOPTIONS; - - - - [ - uuid(144946F5-C4D4-11d1-81D1-0000F87557DB), - helpstring("IDXSurfaceFactory Interface"), - pointer_default(unique) - ] - interface IDXSurfaceFactory : IUnknown - { - [local] HRESULT CreateSurface([in] IUnknown *pDirectDraw, - [in] const DDSURFACEDESC * pDDSurfaceDesc, - [in] const GUID * pFormatID, - [in] const DXBNDS *pBounds, - [in] DWORD dwFlags, - [in] IUnknown *punkOuter, - [in] REFIID riid, - [out, iid_is( riid )] void ** ppDXSurface); - - HRESULT CreateFromDDSurface([in] IUnknown *pDDrawSurface, - [in] const GUID *pFormatID, - [in] DWORD dwFlags, - [in] IUnknown *punkOuter, - [in] REFIID riid, - [out, iid_is( riid )] void ** ppDXSurface); - - [local] HRESULT LoadImage( - [in] const LPWSTR pszFileName, - [in] IUnknown *pDirectDraw, - [in] const DDSURFACEDESC * pDDSurfaceDesc, - [in] const GUID *pFormatID, - [in] REFIID riid, - [out, iid_is( riid )] void ** ppDXSurface); - - [local] HRESULT LoadImageFromStream([in] IStream *pStream, - [in] IUnknown *pDirectDraw, - [in] const DDSURFACEDESC * pDDSurfaceDesc, - [in] const GUID *pFormatID, - [in] REFIID riid, - [out, iid_is( riid )] void ** ppDXSurface); - - [local] HRESULT CopySurfaceToNewFormat( [in]IDXSurface* pSrc, - [in] IUnknown *pDirectDraw, - [in] const DDSURFACEDESC * pDDSurfaceDesc, - [in] const GUID *pDestFormatID, - [out] IDXSurface** ppNewSurface ); - - [local] HRESULT CreateD3DRMTexture([in] IDXSurface *pSrc, - [in] IUnknown *pDirectDraw, - [in] IUnknown *pD3DRM3, - [in] REFIID riid, - [out, iid_is(riid)] void **ppTexture3); - - HRESULT BitBlt([in] IDXSurface *pDest, - [in] const DXVEC *pPlacement, - [in] IDXSurface *pSrc, - [in] const DXBNDS *pClipBounds, - [in] DWORD dwFlags); - } - - - typedef enum DXSURFMODCOMPOP - { - DXSURFMOD_COMP_OVER = 0, - DXSURFMOD_COMP_ALPHA_MASK = 1, - DXSURFMOD_COMP_MAX_VALID = 1 - } DXSURFMODCOMPOP; - - - [ - uuid(9EA3B637-C37D-11d1-905E-00C04FD9189D), - helpstring("IDXSurfaceModifier Interface"), - pointer_default(unique) - ] - interface IDXSurfaceModifier : IUnknown - { - HRESULT SetFillColor([in] DXSAMPLE Color); - HRESULT GetFillColor([out] DXSAMPLE *pColor); - HRESULT SetBounds([in] const DXBNDS *pBounds ); // Get supported though IDXSurface interface - HRESULT SetBackground([in] IDXSurface *pSurface); - HRESULT GetBackground([out] IDXSurface **ppSurface); - HRESULT SetCompositeOperation([in] DXSURFMODCOMPOP CompOp); - HRESULT GetCompositeOperation([out] DXSURFMODCOMPOP *pCompOp); - // - // The following methods only apply to the FOREGROUND surface - // - HRESULT SetForeground([in] IDXSurface *pSurface, [in] BOOL bTile, [in] const POINT * pOrigin); - HRESULT GetForeground([out] IDXSurface **ppSurface, [out] BOOL *pbTile, [out] POINT * pOrigin); - HRESULT SetOpacity([in] float Opacity); - HRESULT GetOpacity([out] float *pOpacity); - HRESULT SetLookup( [in]IDXLookupTable * pLookupTable ); - HRESULT GetLookup( [out]IDXLookupTable ** ppLookupTable ); - } - - - - //--- IDXSurface --------------------------------------------------- - typedef enum DXSAMPLEFORMATENUM - { - DXPF_FLAGSMASK = (0xFFFF0000), // Top word is flags, low word is enum - DXPF_NONPREMULT = (0x00010000), // Flags to be OR'd with pixel formats - DXPF_TRANSPARENCY = (0x00020000), // Color key or one-bit alpha (alpha only 0 or 0xFF) - DXPF_TRANSLUCENCY = (0x00040000), // Alpha can be any value from 0->0xFF - // - // This 3-bit field is used to determine what type of dithering to be used - // - DXPF_2BITERROR = (0x00200000), // 2 bits of error term - DXPF_3BITERROR = (0x00300000), // 3 bits of error term for color (16-bit color) - DXPF_4BITERROR = (0x00400000), // 4 bits of error term (ARGB 4444) - DXPF_5BITERROR = (0x00500000), // 5 bits of error term for color (8-bit color) - DXPF_ERRORMASK = (0x00700000), // Mask of bits used for dithering - - DXPF_NONSTANDARD = (0), // To be used for any surface that is not one of the following formats - // This can be combined with DXPFNONPREMULT if the surface can work - // better in non-premultiplied space. - DXPF_PMARGB32 = (1 | DXPF_TRANSPARENCY | DXPF_TRANSLUCENCY), - DXPF_ARGB32 = (2 | DXPF_NONPREMULT | DXPF_TRANSPARENCY | DXPF_TRANSLUCENCY), - DXPF_ARGB4444 = (3 | DXPF_NONPREMULT | DXPF_TRANSPARENCY | DXPF_TRANSLUCENCY | DXPF_4BITERROR), - DXPF_A8 = (4 | DXPF_TRANSPARENCY | DXPF_TRANSLUCENCY), - DXPF_RGB32 = (5), - DXPF_RGB24 = (6), - DXPF_RGB565 = (7 | DXPF_3BITERROR), - DXPF_RGB555 = (8 | DXPF_3BITERROR), - DXPF_RGB8 = (9 | DXPF_5BITERROR), - DXPF_ARGB1555 = (10 | DXPF_TRANSPARENCY | DXPF_3BITERROR), - DXPF_RGB32_CK = (DXPF_RGB32 | DXPF_TRANSPARENCY), - DXPF_RGB24_CK = (DXPF_RGB24 | DXPF_TRANSPARENCY), - DXPF_RGB555_CK = (DXPF_RGB555 | DXPF_TRANSPARENCY), - DXPF_RGB565_CK = (DXPF_RGB565 | DXPF_TRANSPARENCY), - DXPF_RGB8_CK = (DXPF_RGB8 | DXPF_TRANSPARENCY) - } DXSAMPLEFORMATENUM; - - - - typedef enum DXLOCKSURF - { - DXLOCKF_READ = 0, - DXLOCKF_READWRITE = (1 << 0), - DXLOCKF_EXISTINGINFOONLY = (1 << 1), // If used in conjunction with WANTRUNINFO will prevent creation of a runmap if one does not exist - DXLOCKF_WANTRUNINFO = (1 << 2), - // - // The flags in the high word should be specific to the type of pointer that - // is requested. These flags define ARGB flags. These flags are advisory and - // are not required to be set for ARGB locks. - // - DXLOCKF_NONPREMULT = (1 << 16), // Caller will request non-premultiplied data - DXLOCKF_VALIDFLAGS = (DXLOCKF_READWRITE | DXLOCKF_EXISTINGINFOONLY | DXLOCKF_WANTRUNINFO | DXLOCKF_NONPREMULT) - } DXLOCKSURF; - - typedef enum DXSURFSTATUS - { - DXSURF_TRANSIENT = (1 << 0), // Data in this surface changes often. - DXSURF_READONLY = (1 << 1), // Surface is read-only - DXSURF_VALIDFLAGS = (DXSURF_TRANSIENT | DXSURF_READONLY) - } DXSURFSTATUS; - - [ - uuid(B39FD73F-E139-11d1-9065-00C04FD9189D), - helpstring("IDXSurface Interface"), - pointer_default(unique) - ] - interface IDXSurface : IDXBaseObject - { - HRESULT GetPixelFormat([out] GUID * pFormatID, [out] DXSAMPLEFORMATENUM *pSampleFormatEnum); - HRESULT GetBounds( [out]DXBNDS *pBounds ); - HRESULT GetStatusFlags([out] DWORD * pdwStatusFlags); - HRESULT SetStatusFlags([in] DWORD dwStatusFlags); - HRESULT LockSurface( [in]const DXBNDS *pBounds, [in]ULONG ulTimeOut, [in]DWORD dwFlags, - [in]REFIID riid, [out, iid_is(riid)] void **ppPointer, - [out]ULONG* pulGenerationId ); - HRESULT GetDirectDrawSurface( [in] REFIID riid, - [out, iid_is(riid)] void ** ppSurface); - HRESULT GetColorKey(DXSAMPLE * pColorKey); // Can return E_NOTIMPL - HRESULT SetColorKey(DXSAMPLE ColorKey); // Set color of 0 to get rid of color key, can return E_NOTIMPL - HRESULT LockSurfaceDC( [in] const DXBNDS *pBounds, [in]ULONG ulTimeOut, [in] DWORD dwFlags, - [out] IDXDCLock **ppDCLock); - HRESULT SetAppData(DWORD_PTR dwAppData); - HRESULT GetAppData(DWORD_PTR *pdwAppData); - } - - //--- IDXSurfaceInit --------------------------------------------------- - [ - uuid(9EA3B639-C37D-11d1-905E-00C04FD9189D), - helpstring("IDXSurfaceInit Interface"), - pointer_default(unique), - local - ] - interface IDXSurfaceInit : IUnknown - { - HRESULT InitSurface([in] IUnknown *pDirectDraw, - [in] const DDSURFACEDESC *pDDSurfaceDesc, - [in] const GUID * pFormatID, - [in] const DXBNDS *pBounds, - [in] DWORD dwFlags); - }; - - - //--- IDXARGBSurfaceInit --------------------------------------------------- - [ - uuid(9EA3B63A-C37D-11d1-905E-00C04FD9189D), - helpstring("IDXARGBSurfaceInit Interface"), - pointer_default(unique), - local - ] - interface IDXARGBSurfaceInit : IDXSurfaceInit - { - HRESULT InitFromDDSurface( [in] IUnknown *pDDrawSurface, - [in] const GUID * pFormatID, - [in] DWORD dwFlags); - HRESULT InitFromRawSurface([in] IDXRawSurface *pRawSurface); - }; - - //--- IDXARGBReadPtr --------------------------------------------------- - typedef struct tagDXNATIVETYPEINFO - { - BYTE * pCurrentData; - BYTE * pFirstByte; - long lPitch; - DWORD dwColorKey; - } DXNATIVETYPEINFO; - - typedef struct tagDXPACKEDRECTDESC - { - DXBASESAMPLE *pSamples; - BOOL bPremult; - RECT rect; - long lRowPadding; - } DXPACKEDRECTDESC; - - typedef struct tagDXOVERSAMPLEDESC - { - POINT p; - DXPMSAMPLE Color; - } DXOVERSAMPLEDESC; - - - [ - uuid(EAAAC2D6-C290-11d1-905D-00C04FD9189D), - helpstring("IDXARGBReadPtr Interface"), - pointer_default(unique), - local - ] - interface IDXARGBReadPtr : IUnknown - { - HRESULT GetSurface( [in]REFIID riid, [out, iid_is( riid )]void ** ppSurface); - DXSAMPLEFORMATENUM GetNativeType( [out]DXNATIVETYPEINFO *pInfo ); - void Move( [in]long cSamples ); - void MoveToRow( [in]ULONG y ); - void MoveToXY( [in]ULONG x, [in]ULONG y); - ULONG MoveAndGetRunInfo( [in]ULONG Row, [out] const DXRUNINFO** ppInfo ); // Returns count of runs - DXSAMPLE * Unpack( [in]DXSAMPLE* pSamples, [in]ULONG cSamples, [in]BOOL bMove ); - DXPMSAMPLE * UnpackPremult( [in]DXPMSAMPLE* pSamples, [in]ULONG cSamples, [in]BOOL bMove ); - void UnpackRect([in] const DXPACKEDRECTDESC * pRectDesc); - }; - - - //--- IDXARGBReadWritePtr --------------------------------------------------- - [ - uuid(EAAAC2D7-C290-11d1-905D-00C04FD9189D), - helpstring("IDXARGBReadWritePtr Interface"), - pointer_default(unique), - local - ] - interface IDXARGBReadWritePtr : IDXARGBReadPtr - { - void PackAndMove( [in]const DXSAMPLE *pSamples, [in]ULONG cSamples ); - void PackPremultAndMove( [in]const DXPMSAMPLE *pSamples, [in]ULONG cSamples ); - void PackRect([in]const DXPACKEDRECTDESC *pRectDesc); - void CopyAndMoveBoth( [in]DXBASESAMPLE *pScratchBuffer, [in]IDXARGBReadPtr *pSrc, - [in]ULONG cSamples, [in]BOOL bIsOpaque ); - void CopyRect( [in] DXBASESAMPLE *pScratchBuffer, - [in] const RECT *pDestRect, [in]IDXARGBReadPtr *pSrc, - [in] const POINT *pSrcOrigin, [in]BOOL bIsOpaque); - void FillAndMove( [in]DXBASESAMPLE *pScratchBuffer, [in]DXPMSAMPLE SampVal, - [in]ULONG cSamples, [in]BOOL bDoOver ); - void FillRect( [in]const RECT *pRect, [in]DXPMSAMPLE SampVal, [in]BOOL bDoOver ); - void OverSample( [in]const DXOVERSAMPLEDESC * pOverDesc); - void OverArrayAndMove([in]DXBASESAMPLE *pScratchBuffer, - [in] const DXPMSAMPLE *pSrc, - [in] ULONG cSamples); - }; - - - [ - uuid(0F619456-CF39-11d1-905E-00C04FD9189D), - helpstring("IDXDCLock Interface"), - pointer_default(unique), - local - ] - interface IDXDCLock : IUnknown - { - HDC GetDC(void); - } - - // - // Generic interface that any transform can support which allows caller to specify the - // desired output bounds. - // - [ - uuid(B2024B50-EE77-11d1-9066-00C04FD9189D), - helpstring("IDXTScaleOutput Interface"), - pointer_default(unique) - ] - interface IDXTScaleOutput : IUnknown - { - HRESULT SetOutputSize([in] const SIZE OutSize, [in] BOOL bMaintainAspect); - }; - - - // - // Simple gradient - // - [ - uuid(B2024B51-EE77-11d1-9066-00C04FD9189D), - helpstring("IDXGradient Interface"), - pointer_default(unique) - ] - interface IDXGradient : IDXTScaleOutput - { - HRESULT SetGradient(DXSAMPLE StartColor, DXSAMPLE EndColor, BOOL bHorizontal); - HRESULT GetOutputSize([out] SIZE *pOutSize); - }; - - //--- IDXTScale -------------------------------------------------------- - // This is the control interface for the simple scale transform - // - [ - uuid(B39FD742-E139-11d1-9065-00C04FD9189D), - helpstring("IDXTScale Interface"), - pointer_default(unique) - ] - interface IDXTScale : IUnknown - { - HRESULT SetScales( [in]float Scales[2] ); - HRESULT GetScales( [out]float Scales[2] ); - HRESULT ScaleFitToSize( [in,out]DXBNDS* pClipBounds, - [in]SIZE FitToSize, [in]BOOL bMaintainAspect ); - }; - - - - //--- IDXEffect ------------------------------------------------- - // This interface is used to generically control transforms that - // are transition effects. - typedef enum DISPIDDXEFFECT - { - DISPID_DXECAPABILITIES = 10000, // Start at 10000 to avoid conflicts with inhereted interfaces - DISPID_DXEPROGRESS, - DISPID_DXESTEP, - DISPID_DXEDURATION, - DISPID_DXE_NEXT_ID - } DISPIDDXBOUNDEDEFFECT; - - typedef enum DXEFFECTTYPE - { - DXTET_PERIODIC = (1 << 0), // Result at 1 is same as result at 0 - DXTET_MORPH = (1 << 1) // Transition between 2 inputs (input 0 to input 1) - } DXEFFECTTYPE; - - - - - [ - object, - uuid(E31FB81B-1335-11d1-8189-0000F87557DB), - dual, - helpstring("IDXEffect Interface"), - pointer_default(unique) - ] - interface IDXEffect : IDispatch - { - [propget, id(DISPID_DXECAPABILITIES)] - HRESULT Capabilities([out, retval] long *pVal); - [propget, id(DISPID_DXEPROGRESS)] - HRESULT Progress([out, retval] float *pVal); - [propput, id(DISPID_DXEPROGRESS)] - HRESULT Progress([in] float newVal); - [propget, id(DISPID_DXESTEP)] - HRESULT StepResolution([out, retval] float *pVal); - [propget, id(DISPID_DXEDURATION)] - HRESULT Duration([out, retval] float *pVal); - [propput, id(DISPID_DXEDURATION)] - HRESULT Duration([in] float newVal); - }; - - //--- IDXLookupTable --------------------------------------------- - [ - uuid(01BAFC7F-9E63-11d1-9053-00C04FD9189D), - helpstring("IDXLookupTable Interface"), - pointer_default(unique) - ] - interface IDXLookupTable : IDXBaseObject - { - HRESULT GetTables( [out]BYTE RedLUT[256], - [out]BYTE GreenLUT[256], - [out]BYTE BlueLUT[256], - [out]BYTE AlphaLUT[256] ); - - HRESULT IsChannelIdentity([out] DXBASESAMPLE * pSampleBools); - HRESULT GetIndexValues([in] ULONG Index, [out] DXBASESAMPLE *pSample); - HRESULT ApplyTables([in, out] DXSAMPLE *pSamples, [in] ULONG cSamples); - }; - - - - typedef struct DXRAWSURFACEINFO - { - BYTE * pFirstByte; - long lPitch; - ULONG Width; - ULONG Height; - const GUID * pPixelFormat; - HDC hdc; - DWORD dwColorKey; // Note: High byte must == 0xFF for color keyed surface. Low 3 bytes are native data type. - DXBASESAMPLE * pPalette; - } DXRAWSURFACEINFO; - - // - // User created objects support IDXRawSurface - // - - [ - uuid(09756C8A-D96A-11d1-9062-00C04FD9189D), - helpstring("IDXRawSurface Interface"), - pointer_default(unique), - local - ] - interface IDXRawSurface : IUnknown - { - HRESULT GetSurfaceInfo(DXRAWSURFACEINFO * pSurfaceInfo); - } - - - //+----------------------------------------------------------------------------- - // - // IHTMLDXTransform - // - //------------------------------------------------------------------------------ - - [ - uuid(30E2AB7D-4FDD-4159-B7EA-DC722BF4ADE5), - helpstring("IHTMLDXTransform Interface"), - pointer_default(unique), - local - ] - interface IHTMLDXTransform : IUnknown - { - HRESULT SetHostUrl(BSTR bstrHostUrl); - } - - - //=== CoClass definitions ================================================= - - [ - uuid(54314D1D-35FE-11d1-81A1-0000F87557DB), - version(1.0), - helpstring("Microsoft DirectX Transform 1.0 Type Library") - ] - library DXTRANSLib - { - importlib("stdole32.tlb"); - importlib("stdole2.tlb"); - - /////////////////////////////// - // DXTransformFactory CoClass - /////////////////////////////// - [ - uuid(D1FE6762-FC48-11D0-883A-3C8B00C10000), - helpstring("DXTransformFactory Class") - ] - coclass DXTransformFactory - { - [default] interface IDXTransformFactory; - interface IDXSurfaceFactory; - }; - - /////////////////////////////// - // DXTaskManager CoClass - /////////////////////////////// - [ - uuid(4CB26C03-FF93-11d0-817E-0000F87557DB), - helpstring("DXTaskManager Class") - ] - coclass DXTaskManager - { - [default] interface IDXTaskManager; - }; - - /////////////////////////////// - // DXTScale CoClass - /////////////////////////////// - [ - uuid(555278E2-05DB-11D1-883A-3C8B00C10000), - helpstring("DXTScale Class") - ] - coclass DXTScale - { - [default] interface IDXTScale; - }; - - /////////////////////////////// - // DXSurface CoClass - /////////////////////////////// - [ - uuid(0E890F83-5F79-11D1-9043-00C04FD9189D), - helpstring("DXSurface Class") - ] - coclass DXSurface - { - [default] interface IDXSurface; - }; - - /////////////////////////////// - // DXSurfaceModifier CoClass - /////////////////////////////// - [ - uuid(3E669F1D-9C23-11d1-9053-00C04FD9189D), - helpstring("DXSurfaceModifier Class") - ] - coclass DXSurfaceModifier - { - [default] interface IDXSurfaceModifier; - }; - - /////////////////////////////// - // DXGradient CoClass - /////////////////////////////// - [ - uuid(C6365470-F667-11d1-9067-00C04FD9189D), - helpstring("DXGradient Class") - ] - coclass DXGradient - { - [default] interface IDXGradient; - }; - }; - - -#endif // DirectX 8.0 content \ No newline at end of file diff --git a/import/DirectX8/include/DShowIDL/dyngraph.idl b/import/DirectX8/include/DShowIDL/dyngraph.idl deleted file mode 100644 index d8a07169e..000000000 --- a/import/DirectX8/include/DShowIDL/dyngraph.idl +++ /dev/null @@ -1,318 +0,0 @@ -//------------------------------------------------------------------------------ -// File: DynGraph.idl -// -// Desc: Dynamic graph interfaces -// -// Copyright (c) 1999-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -interface IPinConnection; -interface IPinFlowControl; -interface IGraphConfig; -interface IGraphConfigCallback; - -//-------------------------------------------------------------------- -// -// IPinConnection - supported by input pins -// -//-------------------------------------------------------------------- -[ - local, - object, - uuid(4a9a62d3-27d4-403d-91e9-89f540e55534), - pointer_default(unique) -] -interface IPinConnection : IUnknown { - - // Do you accept this type chane in your current state? - HRESULT DynamicQueryAccept([in] const AM_MEDIA_TYPE *pmt); - - // Set event when EndOfStream receive - do NOT pass it on - // This condition is cancelled by a flush or Stop - HRESULT NotifyEndOfStream([in] HANDLE hNotifyEvent); - - // Are you an 'end pin' - HRESULT IsEndPin(); - - HRESULT DynamicDisconnect(); -}; - -//-------------------------------------------------------------------- -// -// IPinFlowControl - supported by output pins -// -//-------------------------------------------------------------------- -[ - local, - object, - uuid(c56e9858-dbf3-4f6b-8119-384af2060deb), - pointer_default(unique) -] -interface IPinFlowControl : IUnknown { - // Block processing on this pin - HRESULT Block([in] DWORD dwBlockFlags, [in] HANDLE hEvent); -} - -// block flags -enum _AM_PIN_FLOW_CONTROL_BLOCK_FLAGS { - AM_PIN_FLOW_CONTROL_BLOCK = 0x00000001, // 0 means unblock -}; - - -// Reconnect flags -typedef enum _AM_GRAPH_CONFIG_RECONNECT_FLAGS { - AM_GRAPH_CONFIG_RECONNECT_DIRECTCONNECT = 0x00000001, - AM_GRAPH_CONFIG_RECONNECT_CACHE_REMOVED_FILTERS = 0x00000002, - AM_GRAPH_CONFIG_RECONNECT_USE_ONLY_CACHED_FILTERS = 0x00000004 -} AM_GRAPH_CONFIG_RECONNECT_FLAGS; - -// RemoveFilterEx flags -enum _REM_FILTER_FLAGS { - REMFILTERF_LEAVECONNECTED = 0x00000001 -}; - -typedef enum _AM_FILTER_FLAGS { - AM_FILTER_FLAGS_REMOVABLE = 0x00000001 - } AM_FILTER_FLAGS; - - -//-------------------------------------------------------------------- -// -// IGraphConfig -// -//-------------------------------------------------------------------- - -[ - local, - object, - uuid(03A1EB8E-32BF-4245-8502-114D08A9CB88), - pointer_default(unique) -] -interface IGraphConfig : IUnknown { - HRESULT Reconnect([in] IPin *pOutputPin, - [in] IPin *pInputPin, - [in] const AM_MEDIA_TYPE *pmtFirstConnection, - [in] IBaseFilter *pUsingFilter, // can be NULL - [in] HANDLE hAbortEvent, - [in] DWORD dwFlags); - - HRESULT Reconfigure([in] IGraphConfigCallback *pCallback, - [in] PVOID pvContext, - [in] DWORD dwFlags, - [in] HANDLE hAbortEvent); - - - HRESULT AddFilterToCache([in] IBaseFilter *pFilter); - HRESULT EnumCacheFilter([out] IEnumFilters **pEnum); - HRESULT RemoveFilterFromCache([in]IBaseFilter *pFilter); - - // Get the start time associated with the last Run() call - // If the graph is not running returns VFW_E_WRONG_STATE - HRESULT GetStartTime([out] REFERENCE_TIME *prtStart); - - HRESULT PushThroughData( - [in] IPin *pOutputPin, - [in] IPinConnection *pConnection, - [in] HANDLE hEventAbort); - - HRESULT SetFilterFlags([in] IBaseFilter *pFilter, [in] DWORD dwFlags); - HRESULT GetFilterFlags([in] IBaseFilter *pFilter, [out] DWORD *pdwFlags); - - HRESULT RemoveFilterEx( [in] IBaseFilter *pFilter, DWORD Flags ); -} - -//-------------------------------------------------------------------- -// -// IGraphConfigCallback -// -//-------------------------------------------------------------------- - -[ - local, - object, - uuid(ade0fd60-d19d-11d2-abf6-00a0c905f375), - pointer_default(unique) -] -interface IGraphConfigCallback : IUnknown -{ - HRESULT Reconfigure(PVOID pvContext, DWORD dwFlags); -} - -// Filter Chain Definition -// -// Filter chains have the following properties: -// -// - Each filter chain has one or more filters. -// -// - Each filter in a filter chain has at most one connected input pin and one -// connected output pin. For example, filters A, C, D, F, G, H, I, J and K -// (see the diagram below) can be in a filter chain because each one has at -// most one connected input pin and one connected output pin. -// -// - Any filter in a chain is reachable by any other filter in the chain. -// For example, in the filter chain F-G-H, F can reach H by following the F- -// G connection to G and then following the G-H connection to H. Filters F -// and J cannot be in the same filter chain because J is not reachable from -// F. Anotherwords, there no sequence of connected filters between F and J. -// -// - The start filter is the only filter in the filter chain who's input -// pin is not connected to another filter in the chain. For instance, F is -// the start filter in F-G-H because F's input pin is connected to E and E -// is not in the filter chain. G's input pin is connected to F and H's is -// connected to G. Both F and G are in the filter chain. -// -// - The end filter is the only filter in the filter chain who's output pin -// is not connected to another filter in the chain. For example, in the -// filter chain J-K, K is the end filter because K's output pin is -// connected to L. J's output pin is connected to K and K is in the J-K -// filter chain. -// -// -// --->|---| |---|---> -// | C |--->| D | -// |---| |---|--->|---| |---|--->|---| |---| |---| |---| -// | A |--->| B | | E |--->| F |--->| G |--->| H | -// |---| |---|--->|---|------------>|---| |---| |---| |---| -// | I |---> -// --->|---|---> -// -// |---| |---| |---| -// | J |--->| K |--->| L | -// |---| |---| |---| -// -// Example Filter Graph -// -// -// -// IFilterChain Methods Documentation -// -// HRESULT StartChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter ); -// -// StartChain() switches all the filters in the chain into the running state -// If one of the filters will not switch to the running state, then all the filters -// in the chain are stopped. This method can only be called if the filter graph is -// running. -// -// Parameters: -// - pStartFilter [in] -// The first filter in the filter chain. Note that this can be the same -// filter as pEndFilter . -// -// - pEndFilter [in] -// The last filter in the filter chain. Note that this can be the same -// filter as pStartFilter. If pEndFilter is NULL then the filter chain extends -// from pStartFilter to the last downstream filter which can be in a filter chain. -// For example, IFilterChain::StartChain( A, NULL ) would start filter A. -// IFilterChain::StartChain( G, NULL ) would start filters G and H. -// IFilterChain::StartChain( C, NULL ) would start filters C and D. Finally, -// IFilterChain::StartChain( E, NULL ) would fail because E cannot be in a -// filter chain (see the Filter Chain Definition section for more information). -// -// Return Value: -// An HRESULT. See the Direct Show SDK and COM SDK documentation for more -// information on interpreting HRESULTs. -// -// -// -// -// HRESULT PauseChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter ); -// -// PauseChain() switches all the filters in a chain to the paused state. If it cannot -// switch one of the filtres into the paused state, all the filters in the chain are -// stopped. This method can only be called if the filter graph is paused. -// -// Parameters: -// - pStartFilter [in] -// The first filter in the filter chain. Note that this can be the same -// filter as pEndFilter . -// -// - pEndFilter [in] -// The last filter in the filter chain. Note that this can be the same -// filter as pStartFilter. If pEndFilter is NULL then the filter chain extends -// from pStartFilter to the last downstream filter which can be in a filter chain. -// For example, IFilterChain::StopChain( A, NULL ) would stop filter A. -// IFilterChain::StopChain( G, NULL ) would stop filters G and H. -// IFilterChain::StopChain( C, NULL ) would stop filters C and D. Finally, -// IFilterChain::StopChain( E, NULL ) would fail because E cannot be in a filter -// chain (see the Filter Chain Definition section for more information). -// -// -// Return Value: -// An HRESULT. See the Direct Show SDK and COM SDK documentation for more -// information on interpreting HRESULTs. -// -// -// -// HRESULT StopChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter ); -// -// StopChain() switches all the filters in chain to the stopped state. -// -// Parameters: -// - pStartFilter [in] -// The first filter in the filter chain. Note that this can be the same -// filter as pEndFilter . -// -// - pEndFilter [in] -// The last filter in the filter chain. Note that this can be the same -// filter as pStartFilter. If pEndFilter is NULL then the filter chain extends -// from pStartFilter to the last downstream filter which can be in a filter chain. -// For example, IFilterChain::StopChain( A, NULL ) would stop filter A. -// IFilterChain::StopChain( G, NULL ) would stop filters G and H. -// IFilterChain::StopChain( C, NULL ) would stop filters C and D. Finally, -// IFilterChain::StopChain( E, NULL ) would fail because E cannot be in a filter -// chain (see the Filter Chain Definition section for more information). -// -// -// Return Value: -// An HRESULT. See the Direct Show SDK and COM SDK documentation for more -// information on interpreting HRESULTs. -// -// -// -// -// -// HRESULT RemoveChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter ); -// -// RemoveChain() removes every filter in a chain from the filter graph. -// The filters can be removed while the graph is running. -// -// Parameters: -// - pStartFilter [in] -// The first filter in the filter chain. Note that this can be the same -// filter as pEndFilter . -// -// - pEndFilter [in] -// The last filter in the filter chain. Note that this can be the same -// filter as pStartFilter. If pEndFilter is NULL then the filter chain -// extends from pStartFilter to the last downstream filter which can be in a -// filter chain. For example, IFilterChain::RemoveChain( A, NULL ) would remove -// filter A from the filter graph. IFilterChain::RemoveChain( G, NULL ) would -// remove filters G and H. IFilterChain::RemoveChain( C, NULL ) would remove -// filters C and D. Finally, IFilterChain::RemoveChain( E, NULL ) would fail -// because E cannot be in a filter chain (see the Filter Chain Definition -// section for more information). -// -// -// Return Value: -// An HRESULT. See the Direct Show SDK and COM SDK documentation for more -// information on interpreting HRESULTs. -// -// -[ - local, - object, - uuid(DCFBDCF6-0DC2-45f5-9AB2-7C330EA09C29), - pointer_default(unique) -] -interface IFilterChain : IUnknown -{ - HRESULT StartChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter ); - HRESULT PauseChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter ); - HRESULT StopChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter ); - HRESULT RemoveChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter ); -} - - - - diff --git a/import/DirectX8/include/DShowIDL/iamovie.idl b/import/DirectX8/include/DShowIDL/iamovie.idl deleted file mode 100644 index 87d6b389a..000000000 --- a/import/DirectX8/include/DShowIDL/iamovie.idl +++ /dev/null @@ -1,144 +0,0 @@ -//------------------------------------------------------------------------------ -// File: IAMovie.idl -// -// Desc: -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -[ -object, -uuid(359ace10-7688-11cf-8b23-00805f6cef60), -pointer_default(unique) -] -interface IAMovie : IFilterGraph -{ - // IGraphBuilder - // Connect these two pins directly or indirectly, using transform filters - // if necessary. - - HRESULT Connect - ( [in] IPin * ppinOut, // the output pin - [in] IPin * ppinIn // the input pin - ); - - - // Connect this output pin directly or indirectly, using transform filters - // if necessary to something that will render it. - - HRESULT Render - ( [in] IPin * ppinOut // the output pin - ); - - - // IMediaControl methods - HRESULT Run(); - HRESULT Pause(); - HRESULT Stop(); - - //returns the state. same semantics as IMediaFilter::GetState - - HRESULT GetState( - [in] LONG msTimeout, - [out] FILTER_STATE* pfs); - - // adds and connects filters needed to play the specified file - HRESULT RenderFile( - [in] LPCWSTR strFilename); - - // adds to the graph the source filter that can read this file, - // and returns an IFilterInfo object for it - HRESULT AddSourceFilter( - [in] LPCWSTR strFilename, - [out] IBaseFilter ** ppUnk); - - // get back the event handle. This is manual-reset - // (don't - it's reset by the event mechanism) and remains set - // when events are queued, and reset when the queue is empty. - HRESULT GetEventHandle( - [out] HEVENT * hEvent); - - // remove the next event notification from the head of the queue and - // return it. Waits up to msTimeout millisecs if there are no events. - // if a timeout occurs without any events, this method will return - // E_ABORT, and the value of the event code and other parameters - // is undefined. - HRESULT GetEvent( - [out] long * lEventCode, - [out] long * lParam1, - [out] long * lParam2, - [in] long msTimeout - ); - - // Calls GetEvent repeatedly discarding events until it finds a - // completion event (EC_COMPLETE, EC_ERRORABORT, or EC_USERABORT). - // The completion event is removed from the queue and returned - // in pEvCode. Note that the object is still in running mode until - // a Pause or Stop call is made. - // If the timeout occurs, *pEvCode will be 0 and E_ABORT will be - // returned. - HRESULT WaitForCompletion( - [in] long msTimeout, - [out] long * pEvCode); - - // cancels any system handling of the specified event code - // and ensures that the events are passed straight to the application - // (via GetEvent) and not handled. A good example of this is - // EC_REPAINT: default handling for this ensures the painting of the - // window and does not get posted to the app. - HRESULT CancelDefaultHandling( - [in] long lEvCode); - - // restore the normal system default handling that may have been - // cancelled by CancelDefaultHandling(). - HRESULT RestoreDefaultHandling( [in] long lEvCode); - - // properties - HRESULT get_Duration( - [out] REFTIME* plength); - - HRESULT put_CurrentPosition( - [in] REFTIME llTime); - - HRESULT get_CurrentPosition( - [out] REFTIME* pllTime); - - HRESULT get_StopTime( - [out] REFTIME* pllTime); - - HRESULT put_StopTime( - [in] REFTIME llTime); - - HRESULT get_PrerollTime( - [out] REFTIME* pllTime); - HRESULT put_PrerollTime( - [in] REFTIME llTime); - - HRESULT put_Rate( - [in] double dRate); - HRESULT get_Rate( - [out] double * pdRate); - - /* New methods */ - HRESULT RemoveAllFilters(); - HRESULT Play(); - HRESULT PlayFile([in] LPCWSTR strFilename); - HRESULT EnumFiltersByInterface( [in] REFIID riid, [out] IEnumFilters ** ppEnum ); - HRESULT EnumPins( [out] IEnumPins ** ppEnum ); - HRESULT EnumPinsIn( [out] IEnumPins ** ppEnum ); - HRESULT EnumPinsOut( [out] IEnumPins ** ppEnum ); - HRESULT RenderAll(); - HRESULT RenderNewFile( [in] LPCWSTR strFilename); - - // Free any resources associated with the parameters to an event. - // Event parameters may be LONGs, IUnknown* or BSTR. No action - // is taken with LONGs. IUnknown are passed addrefed and need a - // Release call. BSTR are allocated by the task allocator and will be - // freed by calling the task allocator. - HRESULT FreeEventParams( - [in] long lEvCode, - [in] long lParam1, - [in] long lParam2); -} - diff --git a/import/DirectX8/include/DShowIDL/mediaobj.idl b/import/DirectX8/include/DShowIDL/mediaobj.idl deleted file mode 100644 index 08301f6a1..000000000 --- a/import/DirectX8/include/DShowIDL/mediaobj.idl +++ /dev/null @@ -1,411 +0,0 @@ -//------------------------------------------------------------------------------ -// File: MediaObj.idl -// -// Desc: Define the interfaces for DirectX Media Objects. This file will be -// processed by the MIDL tool to produce mediaobj.h and proxy-stub code. -// -// Copyright (c) 1999-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -import "unknwn.idl"; -import "objidl.idl"; - -// DMO_MEDIA_TYPE structure - -cpp_quote("#ifdef __strmif_h__") -cpp_quote("typedef AM_MEDIA_TYPE DMO_MEDIA_TYPE;") -cpp_quote("#else") -typedef struct _DMOMediaType { - GUID majortype; - GUID subtype; - BOOL bFixedSizeSamples; - BOOL bTemporalCompression; - ULONG lSampleSize; - GUID formattype; - IUnknown *pUnk; - ULONG cbFormat; - [size_is(cbFormat)] BYTE * pbFormat; -} DMO_MEDIA_TYPE; -typedef LONGLONG REFERENCE_TIME; -cpp_quote("#endif") - - -// Per-buffer flags that apply to input buffers -enum _DMO_INPUT_DATA_BUFFER_FLAGS { - DMO_INPUT_DATA_BUFFERF_SYNCPOINT = 0x00000001, - DMO_INPUT_DATA_BUFFERF_TIME = 0x00000002, - DMO_INPUT_DATA_BUFFERF_TIMELENGTH = 0x00000004 -}; - -// Per-buffer flags that apply to output buffers. -enum _DMO_OUTPUT_DATA_BUFFER_FLAGS { - DMO_OUTPUT_DATA_BUFFERF_SYNCPOINT = 0x00000001, - DMO_OUTPUT_DATA_BUFFERF_TIME = 0x00000002, - DMO_OUTPUT_DATA_BUFFERF_TIMELENGTH = 0x00000004, - - // - // This flag means the object could have generated more data for this - // output stream, even with no additional input from any input stream, - // but the output buffer did not have sufficient room. - // - DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE = 0x01000000 -}; - -// Flags returned by GetInputStatus() -enum _DMO_INPUT_STATUS_FLAGS { - // - // ACCEPT_DATA indicates that the input stream is ready to accept - // new data via ProcessInput(). - // - DMO_INPUT_STATUSF_ACCEPT_DATA = 0x00000001 -}; - -// Flags returned by GetInputStreamInfo() -enum _DMO_INPUT_STREAM_INFO_FLAGS { - DMO_INPUT_STREAMF_WHOLE_SAMPLES = 0x00000001, - DMO_INPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER = 0x00000002, - DMO_INPUT_STREAMF_FIXED_SAMPLE_SIZE = 0x00000004, - DMO_INPUT_STREAMF_HOLDS_BUFFERS = 0x00000008 -}; - -// Flags returned by GetOutputStreamInfo() -enum _DMO_OUTPUT_STREAM_INFO_FLAGS { - DMO_OUTPUT_STREAMF_WHOLE_SAMPLES = 0x00000001, - DMO_OUTPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER = 0x00000002, - DMO_OUTPUT_STREAMF_FIXED_SAMPLE_SIZE = 0x00000004, - DMO_OUTPUT_STREAMF_DISCARDABLE = 0x00000008, - DMO_OUTPUT_STREAMF_OPTIONAL = 0x00000010 -}; - -// SetType flags -enum _DMO_SET_TYPE_FLAGS { - DMO_SET_TYPEF_TEST_ONLY = 0x00000001,// check but don't set - DMO_SET_TYPEF_CLEAR = 0x00000002 // unset -}; - -// Process Output Flags -enum _DMO_PROCESS_OUTPUT_FLAGS { - DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER = 0x00000001 // Discard -}; - -// Buffer wrapper interface -[ - object, - uuid(59eff8b9-938c-4a26-82f2-95cb84cdc837) -] -interface IMediaBuffer : IUnknown -{ - HRESULT SetLength( - DWORD cbLength - ); - HRESULT GetMaxLength( - [out] DWORD *pcbMaxLength - ); - HRESULT GetBufferAndLength( - [out] BYTE **ppBuffer, // not filled if NULL - [out] DWORD *pcbLength // not filled if NULL - ); -} - -// -// Output buffer info structure: one of these must be passed in for each -// output stream with every ProcessOutput() call -// All [out] fields should be -// assumed undefined if ProcessOutput() failed -// -typedef struct _DMO_OUTPUT_DATA_BUFFER { - - IMediaBuffer *pBuffer; // [in] can be NULL - - // ProcessOutput() must set any appropriate flags and zero out the rest. - DWORD dwStatus; // [out] DMO_OUTPUT_DATA_BUFFERF_XXX (INCOMPLETE, etc.) - - // - // Each of these is valid if the corresponding flag is set in dwStatus - // - REFERENCE_TIME rtTimestamp; // [out] - REFERENCE_TIME rtTimelength; // [out] -} DMO_OUTPUT_DATA_BUFFER, *PDMO_OUTPUT_DATA_BUFFER; - - -// Interface supported by media objects -[ - object, - uuid(d8ad0f58-5494-4102-97c5-ec798e59bcf4) -] -interface IMediaObject : IUnknown -{ - -// -// Stream enumeration -// - HRESULT GetStreamCount( - [out] DWORD *pcInputStreams, - [out] DWORD *pcOutputStreams - ); - HRESULT GetInputStreamInfo( - DWORD dwInputStreamIndex, // 0-based - [out] DWORD *pdwFlags // HOLDS_BUFFERS - ); - HRESULT GetOutputStreamInfo( - DWORD dwOutputStreamIndex, // 0-based - [out] DWORD *pdwFlags // Media object sets to 0 - ); - -// -// Mediatypes -// - // - // GetType - iterate through media types supported by a stream. - // Returns S_FALSE if the type index is out of range ("no more types"). - // - HRESULT GetInputType( - DWORD dwInputStreamIndex, - DWORD dwTypeIndex, // 0-based - [out] DMO_MEDIA_TYPE *pmt - ); - HRESULT GetOutputType( - DWORD dwOutputStreamIndex, - DWORD dwTypeIndex, // 0-based - [out] DMO_MEDIA_TYPE *pmt - ); - - // - // SetType - tell the object the type of data it will work with. - // - HRESULT SetInputType( - DWORD dwInputStreamIndex, - [in] const DMO_MEDIA_TYPE *pmt, - DWORD dwFlags // test only - ); - HRESULT SetOutputType( - DWORD dwOutputStreamIndex, - [in] const DMO_MEDIA_TYPE *pmt, - DWORD dwFlags // test only - ); - - // - // GetCurrentType - get the last mediatype supplied via SetType. - // Returns S_FALSE if SetType has not been called. - // - HRESULT GetInputCurrentType( - DWORD dwInputStreamIndex, - [out] DMO_MEDIA_TYPE *pmt - ); - HRESULT GetOutputCurrentType( - DWORD dwOutputStreamIndex, - [out] DMO_MEDIA_TYPE *pmt - ); - -// -// SizeInfo -// - // - // GetSizeInfo - Get buffer size requirementes of a stream. - // - // If buffer size depends on the media type used, the object should - // base its response on the most recent media type set for this stream. - // If no mediatype has been set, the object may return an error. - // - HRESULT GetInputSizeInfo( - DWORD dwInputStreamIndex, - [out] DWORD *pcbSize, // size of input 'quantum' - [out] DWORD *pcbMaxLookahead, // max total bytes held - [out] DWORD *pcbAlignment // buffer alignment requirement - ); - HRESULT GetOutputSizeInfo( - DWORD dwOutputStreamIndex, - [out] DWORD *pcbSize, // size of output 'quantum' - [out] DWORD *pcbAlignment // buffer alignment requirement - ); - -// -// Latency methods -// - HRESULT GetInputMaxLatency( - DWORD dwInputStreamIndex, - [out] REFERENCE_TIME *prtMaxLatency - ); - HRESULT SetInputMaxLatency( - DWORD dwInputStreamIndex, - REFERENCE_TIME rtMaxLatency - ); - -// -// Streaming / state methods -// - // - // Flush() - discard any buffered data. - // - HRESULT Flush(); - - // - // Send a discontinuity to an input stream. The object will not - // accept any more data on this input stream until the discontinuity - // has been completely processed, which may involve multiple - // ProcessOutput() calls. - // - HRESULT Discontinuity(DWORD dwInputStreamIndex); - - // - // If a streaming object needs to perform any time consuming - // initialization before it can stream data, it should do it inside - // AllocateStreamingResources() rather than during the first process - // call. - // - // This method is NOT guaranteed to be called before streaming - // starts. If it is not called, the object should perform any - // required initialization during a process call. - // - HRESULT AllocateStreamingResources(); - - // Free anything allocated in AllocateStreamingResources(). - HRESULT FreeStreamingResources(); - - // GetInputStatus - the only flag defined right now is ACCEPT_DATA. - HRESULT GetInputStatus( - DWORD dwInputStreamIndex, - [out] DWORD *dwFlags // ACCEPT_DATA - ); - - // - // Pass one new buffer to an input stream - // - HRESULT ProcessInput( - DWORD dwInputStreamIndex, - IMediaBuffer *pBuffer, // must not be NULL - DWORD dwFlags, // DMO_INPUT_DATA_BUFFERF_XXX (syncpoint, etc.) - REFERENCE_TIME rtTimestamp, // valid if flag set - REFERENCE_TIME rtTimelength // valid if flag set - ); - - // - // ProcessOutput() - generate output for current input buffers - // - // Output stream specific status information is returned in the - // dwStatus member of each buffer wrapper structure. - // - HRESULT ProcessOutput( - DWORD dwFlags, // DMO_PROCESS_OUTPUT_FLAGS - DWORD cOutputBufferCount, // # returned by GetStreamCount() - [in,out,size_is(cOutputBufferCount)] - DMO_OUTPUT_DATA_BUFFER *pOutputBuffers, // one per stream - [out] DWORD *pdwStatus // TBD, must be set to 0 - ); - - // Locking - lock if bLock is TRUE, otherwise unlock - HRESULT Lock(LONG bLock); -}; - - -// -// Interface returned by the DMO enumeration API -// -[ -object, -uuid(2c3cd98a-2bfa-4a53-9c27-5249ba64ba0f) -] -interface IEnumDMO : IUnknown { - HRESULT Next( - DWORD cItemsToFetch, - [out, size_is(cItemsToFetch), length_is(*pcItemsFetched)] CLSID *pCLSID, - [out, size_is(cItemsToFetch), length_is(*pcItemsFetched), string] WCHAR **Names, - [out] DWORD *pcItemsFetched - ); - HRESULT Skip( - DWORD cItemsToSkip - ); - HRESULT Reset(void); - HRESULT Clone( - [out] IEnumDMO **ppEnum - ); -} - - -// Flags for IMediaObjectInPlace::Process -enum _DMO_INPLACE_PROCESS_FLAGS { - DMO_INPLACE_NORMAL = 0x00000000, - DMO_INPLACE_ZERO = 0x00000001 -}; - -[ -object, -uuid(651b9ad0-0fc7-4aa9-9538-d89931010741) -] -interface IMediaObjectInPlace : IUnknown { - - // Proces - Given a buffer of size ulSize, put the output - // of the DMO into the same buffer. - HRESULT Process( - [in] ULONG ulSize, - [in,out,size_is(ulSize)] BYTE* pData, - [in] REFERENCE_TIME refTimeStart, - [in] DWORD dwFlags - ); - - // Create a copy of the In-Place Media Object. This allows - // for very fast initialization of a number of In-Place objects - // in a known state. - HRESULT Clone( - [out] IMediaObjectInPlace **ppMediaObject - ); - - // GetLatency - Returns a REFERENCE_TIME value - // (1 tick = 100ns) which corresponds to the latency time - // processing this effect will add to the graph. This assumes - // the effect cost per buffer is a constant. - HRESULT GetLatency( - [out] REFERENCE_TIME *pLatencyTime - ); -} - -// Quality control status flags -enum _DMO_QUALITY_STATUS_FLAGS { - DMO_QUALITY_STATUS_ENABLED = 0x00000001 -}; - -[ -object, -uuid(65abea96-cf36-453f-af8a-705e98f16260) -] -interface IDMOQualityControl : IUnknown { - HRESULT SetNow( - [in] REFERENCE_TIME rtNow - ); - HRESULT SetStatus( - [in] DWORD dwFlags - ); - HRESULT GetStatus( - [out] DWORD *pdwFlags - ); -} - -// Flags for IVideoOutputOptimizations -enum _DMO_VIDEO_OUTPUT_STREAM_FLAGS { - DMO_VOSF_NEEDS_PREVIOUS_SAMPLE = 0x00000001 -}; - -[ -object, -uuid(be8f4f4e-5b16-4d29-b350-7f6b5d9298ac) -] -interface IDMOVideoOutputOptimizations : IUnknown { - HRESULT QueryOperationModePreferences ( - ULONG ulOutputStreamIndex, - DWORD *pdwRequestedCapabilities - ); - HRESULT SetOperationMode ( - ULONG ulOutputStreamIndex, - DWORD dwEnabledFeatures - ); - HRESULT GetCurrentOperationMode ( - ULONG ulOutputStreamIndex, - DWORD *pdwEnabledFeatures - ); - HRESULT GetCurrentSampleRequirements ( - ULONG ulOutputStreamIndex, - DWORD *pdwRequestedFeatures - ); -} - diff --git a/import/DirectX8/include/DShowIDL/medparam.idl b/import/DirectX8/include/DShowIDL/medparam.idl deleted file mode 100644 index b589922b8..000000000 --- a/import/DirectX8/include/DShowIDL/medparam.idl +++ /dev/null @@ -1,228 +0,0 @@ -//------------------------------------------------------------------------------ -// File: MedParam.idl -// -// Desc: Definition of the IMediaParams and associated interfaces. These -// interfaces are designed to allow communication of curve-following -// behaviors for parameters of objects which require dynamic changes -// to their parameters at run time. All changes are specified by -// timestamp and curve type to ensure the parameters can be set -// at sufficient accuracy with predictable behavior on subsequent -// playback of the same curves. -// -// Copyright (c) 1999-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -import "oaidl.idl"; -import "ocidl.idl"; -import "strmif.idl"; - - -//------------------------------------------------------------------------------ -// Define the semantic type to be used for each parameter. All values passed -// into this interface are 32-bit floats, but the interface can specify that -// the values must be integer, booleans, or enumerated types -//------------------------------------------------------------------------------ -typedef float MP_DATA; // All data is 32-bit floats - -typedef enum _MP_Type { - MPT_INT, // data is signed 23 bit integer (mantissa) - MPT_FLOAT, // data is 32bit IEEE float - MPT_BOOL, // data is true or false (using ANSI C++ definition) - MPT_ENUM, // data is a set (represented by consecutive integers) - MPT_MAX, -} MP_TYPE; - -const MP_DATA MPBOOL_TRUE = 1.0; // Value of true -const MP_DATA MPBOOL_FALSE = 0.0; // Value of false - - -//------------------------------------------------------------------------------ -// Define the types of curves which are supported -//------------------------------------------------------------------------------ -typedef enum _MP_CURVE_TYPE { - MP_CURVE_JUMP = 0x0001, // No interpolation, just jump to next point - MP_CURVE_LINEAR = 0x0002, // Linear interpolation (y follows x from 0.0 to 1.0) - MP_CURVE_SQUARE = 0x0004, // y follow x^2 from 0.0 to 1.0 - MP_CURVE_INVSQUARE = 0x0008, // y follows 1-(x^2) from 0.0 to 1.0 - MP_CURVE_SINE = 0x0010, // y follows sin(x) from -pi/2 to pi/2 -} MP_CURVE_TYPE; - - -//------------------------------------------------------------------------------ -// Capability bits. Used by the object to specify what capabilities it has. -//------------------------------------------------------------------------------ -typedef DWORD MP_CAPS; -// Curve capabilities - If the cap bit is set, that type of curve is supported -const MP_CAPS MP_CAPS_CURVE_JUMP = MP_CURVE_JUMP; -const MP_CAPS MP_CAPS_CURVE_LINEAR = MP_CURVE_LINEAR; -const MP_CAPS MP_CAPS_CURVE_SQUARE = MP_CURVE_SQUARE; -const MP_CAPS MP_CAPS_CURVE_INVSQUARE = MP_CURVE_INVSQUARE; -const MP_CAPS MP_CAPS_CURVE_SINE = MP_CURVE_SINE; - - -//------------------------------------------------------------------------------ -// Structure used to return information about the type and limits of a parameter -//------------------------------------------------------------------------------ -typedef struct _MP_PARAMINFO { - MP_TYPE mpType; // One of MP_TYPE_xxx codes - MP_CAPS mopCaps; // A collection of MP_CAPS flags - - // Minimum and maximum values - MP_DATA mpdMinValue; // minimum legal value - MP_DATA mpdMaxValue; // maximum legal value - MP_DATA mpdNeutralValue; // default or 'center' value - - // Defualt Unit and Label text. These strings will ALWAYS be English - // strings in the UNICODE character set. For international text - // use the GetParamText member function - WCHAR szUnitText[32]; // units of the parameter - WCHAR szLabel[32]; // name of the parameter - -} MP_PARAMINFO; - - -//------------------------------------------------------------------------------ -// Parameter Index types -//------------------------------------------------------------------------------ -typedef DWORD DWORD; -const DWORD DWORD_ALLPARAMS = -1; // Apply this operation to all params - - -//------------------------------------------------------------------------------ -// Defined list of timestamp types -//------------------------------------------------------------------------------ -typedef DWORD MP_TIMEDATA; // Extra data to further define type - -// REFERENCE_TIME (1 tick = 100 nanoseconds, MP_TIMEDATA ignored) -cpp_quote("DEFINE_GUID(GUID_TIME_REFERENCE,") -cpp_quote("0x93ad712b, 0xdaa0, 0x4ffe, 0xbc, 0x81, 0xb0, 0xce, 0x50, 0xf, 0xcd, 0xd9);") - -// Music Time (MP_TIMEDATA = parts/quarter note) -cpp_quote("DEFINE_GUID(GUID_TIME_MUSIC,") -cpp_quote("0x574c49d, 0x5b04, 0x4b15, 0xa5, 0x42, 0xae, 0x28, 0x20, 0x30, 0x11, 0x7b);") - -// Time is measures in samples. MP_TIMEDATA = Samples/sec) -cpp_quote("DEFINE_GUID(GUID_TIME_SAMPLES,") -cpp_quote("0xa8593d05, 0xc43, 0x4984, 0x9a, 0x63, 0x97, 0xaf, 0x9e, 0x2, 0xc4, 0xc0);") - - -//------------------------------------------------------------------------------ -// The value of a given parameter at a specific point in time -//------------------------------------------------------------------------------ -typedef DWORD MP_FLAGS; -const MP_FLAGS MPF_ENVLP_STANDARD = 0x0000; // Use all data provided -const MP_FLAGS MPF_ENVLP_BEGIN_CURRENTVAL = 0x0001; - // Ignore valStart value, use current value as the staring point -const MP_FLAGS MPF_ENVLP_BEGIN_NEUTRALVAL = 0x0002; - // Ignore valStart value, use neutral value as the staring point - -typedef struct _MP_ENVELOPE_SEGMENT { - REFERENCE_TIME rtStart; // Start time in current time format - REFERENCE_TIME rtEnd; // End time in current time format - MP_DATA valStart; // Initial Value - MP_DATA valEnd; // Final Value - MP_CURVE_TYPE iCurve; // One of MP_CURVE_TYPE codes - MP_FLAGS flags; // Special cases -} MP_ENVELOPE_SEGMENT; - -//------------------------------------------------------------------------------ -// Define flags for Punch-in timing -//------------------------------------------------------------------------------ -const MP_FLAGS MPF_PUNCHIN_REFTIME = 0; // Use the reference time as the PI time -const MP_FLAGS MPF_PUNCHIN_NOW = 0x0001; // Punch in at the current clock time -const MP_FLAGS MPF_PUNCHIN_STOPPED = 0x0002; // Return change notifications during - // author time - -//------------------------------------------------------------------------------ -// IMediaParamInfo - Interface used to determine the names, data types and -// units of the parameters which are exposed by the object. This interface -// is used at discovery time, and is not required during run-time since the -// objects parameters are a fixed set and this data can be cached by the -// calling applicaiton. -//------------------------------------------------------------------------------ -[ -object, -uuid(6d6cbb60-a223-44aa-842f-a2f06750be6d), -version(1.0) -] -interface IMediaParamInfo : IUnknown -{ - HRESULT GetParamCount ( - [out] DWORD * pdwParams - ); - HRESULT GetParamInfo ( - [in] DWORD dwParamIndex, - [out] MP_PARAMINFO * pInfo - ); - // returns a series of null terminated strings. strings are in the - // following order: - // Param Label, Units Text, 1st Enum Text, 2nd Enum Text, etc... - HRESULT GetParamText ( - [in] DWORD dwParamIndex, // which param to get text for - [out] WCHAR **ppwchText // returns ptr to CoTaskMemAlloc'd string - ); - - // Returns the number of diffrent time formats this object understands - HRESULT GetNumTimeFormats ( - [out] DWORD * pdwNumTimeFormats - ); - - // Returns the GUID for the ith supported time format - HRESULT GetSupportedTimeFormat( - [in] DWORD dwFormatIndex, - [out] GUID *pguidTimeFormat - ); - - // Returns the current time format - HRESULT GetCurrentTimeFormat ( - [out] GUID *pguidTimeFormat, - [out] MP_TIMEDATA *pTimeData - ); -} - -//------------------------------------------------------------------------------ -// IMediaParams - Interfaes used to actually set the media params and the -// envelopes to follow -//------------------------------------------------------------------------------ -[ -object, -uuid(6d6cbb61-a223-44aa-842f-a2f06750be6e), -version(1.0) -] -interface IMediaParams : IUnknown -{ - // Single param Get/Set methods - HRESULT GetParam ( - [in] DWORD dwParamIndex, - [out] MP_DATA *pValue - ); - HRESULT SetParam ( - [in] DWORD dwParamIndex, - [in] MP_DATA value - ); - - // Envelope methods (param change over time) - HRESULT AddEnvelope ( - [in] DWORD dwParamIndex, - [in] DWORD cSegments, - [in] MP_ENVELOPE_SEGMENT * pEnvelopeSegments - ); - - // Flush all of the envelope information for the given paramter between - // the timestamps specified - HRESULT FlushEnvelope ( - [in] DWORD dwParamIndex, - [in] REFERENCE_TIME refTimeStart, - [in] REFERENCE_TIME refTimeEnd - ); - - // Change the time format being used by the object - HRESULT SetTimeFormat ( - [in] GUID guidTimeFormat, - [in] MP_TIMEDATA mpTimeData - ); -} - - - diff --git a/import/DirectX8/include/DShowIDL/mmstream.idl b/import/DirectX8/include/DShowIDL/mmstream.idl deleted file mode 100644 index 7a77b8a90..000000000 --- a/import/DirectX8/include/DShowIDL/mmstream.idl +++ /dev/null @@ -1,190 +0,0 @@ -//------------------------------------------------------------------------------ -// File: MMStream.idl -// -// Desc: MultiMedia streaming interface IDL file. Used by MIDL tool -// to generate mmstream.h. -// -// Copyright (c) 1998-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -import "unknwn.idl"; - -cpp_quote("#define MS_ERROR_CODE(x) MAKE_HRESULT(1, FACILITY_ITF, (x) + 0x400)") -cpp_quote("#define MS_SUCCESS_CODE(x) MAKE_HRESULT(0, FACILITY_ITF, x)") -cpp_quote("#define MS_S_PENDING MS_SUCCESS_CODE(1)") -cpp_quote("#define MS_S_NOUPDATE MS_SUCCESS_CODE(2)") -cpp_quote("#define MS_S_ENDOFSTREAM MS_SUCCESS_CODE(3)") - -cpp_quote("#define MS_E_SAMPLEALLOC MS_ERROR_CODE(1)") -cpp_quote("#define MS_E_PURPOSEID MS_ERROR_CODE(2)") -cpp_quote("#define MS_E_NOSTREAM MS_ERROR_CODE(3)") -cpp_quote("#define MS_E_NOSEEKING MS_ERROR_CODE(4)") -cpp_quote("#define MS_E_INCOMPATIBLE MS_ERROR_CODE(5)") -cpp_quote("#define MS_E_BUSY MS_ERROR_CODE(6)") -cpp_quote("#define MS_E_NOTINIT MS_ERROR_CODE(7)") -cpp_quote("#define MS_E_SOURCEALREADYDEFINED MS_ERROR_CODE(8)") -cpp_quote("#define MS_E_INVALIDSTREAMTYPE MS_ERROR_CODE(9)") -cpp_quote("#define MS_E_NOTRUNNING MS_ERROR_CODE(10)") - -cpp_quote("// {A35FF56A-9FDA-11d0-8FDF-00C04FD9189D}") -cpp_quote("DEFINE_GUID(MSPID_PrimaryVideo, ") -cpp_quote("0xa35ff56a, 0x9fda, 0x11d0, 0x8f, 0xdf, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0x9d);") - -cpp_quote("// {A35FF56B-9FDA-11d0-8FDF-00C04FD9189D}") -cpp_quote("DEFINE_GUID(MSPID_PrimaryAudio,") -cpp_quote("0xa35ff56b, 0x9fda, 0x11d0, 0x8f, 0xdf, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0x9d);") - -cpp_quote("#if(_WIN32_WINNT < 0x0400)") -typedef void (__stdcall * PAPCFUNC)(DWORD_PTR dwParam); -cpp_quote("#endif") - -typedef LONGLONG STREAM_TIME; - -typedef GUID MSPID; -typedef REFGUID REFMSPID; - -typedef enum { - STREAMTYPE_READ = 0, - STREAMTYPE_WRITE = 1, - STREAMTYPE_TRANSFORM= 2 -} STREAM_TYPE; - -typedef enum { - STREAMSTATE_STOP = 0, - STREAMSTATE_RUN = 1 -} STREAM_STATE; - - -typedef enum { - COMPSTAT_NOUPDATEOK = 0x00000001, - COMPSTAT_WAIT = 0x00000002, - COMPSTAT_ABORT = 0x00000004 -} COMPLETION_STATUS_FLAGS; - -// Flags for GetInformation -enum { - MMSSF_HASCLOCK = 0x00000001, - MMSSF_SUPPORTSEEK = 0x00000002, - MMSSF_ASYNCHRONOUS = 0x00000004 -}; - -// Flags for StreamSample::Update -enum { - SSUPDATE_ASYNC = 0x00000001, - SSUPDATE_CONTINUOUS = 0x00000002 -}; - -interface IMultiMediaStream; -interface IMediaStream; -interface IStreamSample; - -// IMultiMediaStream interface -[ -object, -local, -uuid(B502D1BC-9A57-11d0-8FDE-00C04FD9189D), -pointer_default(unique) -] -interface IMultiMediaStream : IUnknown { - - HRESULT GetInformation( - [out] DWORD *pdwFlags, - [out] STREAM_TYPE *pStreamType); - - HRESULT GetMediaStream( - [in] REFMSPID idPurpose, - [out] IMediaStream **ppMediaStream); - - HRESULT EnumMediaStreams( - [in] long Index, - [out] IMediaStream **ppMediaStream); - - HRESULT GetState( - [out] STREAM_STATE *pCurrentState); - - HRESULT SetState( - [in] STREAM_STATE NewState); - - HRESULT GetTime( - [out] STREAM_TIME *pCurrentTime); - - HRESULT GetDuration( - [out] STREAM_TIME *pDuration); - - HRESULT Seek( - [in] STREAM_TIME SeekTime); - - HRESULT GetEndOfStreamEventHandle( - [out] HANDLE *phEOS); -}; - - -// IMediaStream interface -[ -object, -uuid(B502D1BD-9A57-11d0-8FDE-00C04FD9189D), -pointer_default(unique) -] -interface IMediaStream : IUnknown { - - HRESULT GetMultiMediaStream( - [out] IMultiMediaStream **ppMultiMediaStream); - - HRESULT GetInformation( - [out] MSPID *pPurposeId, - [out] STREAM_TYPE *pType); - - HRESULT SetSameFormat( - [in] IMediaStream *pStreamThatHasDesiredFormat, - [in] DWORD dwFlags); - - HRESULT AllocateSample( - [in] DWORD dwFlags, - [out] IStreamSample **ppSample); - - - HRESULT CreateSharedSample( - [in] IStreamSample *pExistingSample, - [in] DWORD dwFlags, - [out] IStreamSample **ppNewSample); - - HRESULT SendEndOfStream(DWORD dwFlags); -}; - - -// IStreamSample interface -[ -object, -local, -uuid(B502D1BE-9A57-11d0-8FDE-00C04FD9189D), -pointer_default(unique) -] -interface IStreamSample : IUnknown { - - HRESULT GetMediaStream( - [in] IMediaStream **ppMediaStream); - - HRESULT GetSampleTimes( - [out] STREAM_TIME * pStartTime, - [out] STREAM_TIME * pEndTime, - [out] STREAM_TIME * pCurrentTime); - - HRESULT SetSampleTimes( - [in] const STREAM_TIME *pStartTime, - [in] const STREAM_TIME *pEndTime); - - HRESULT Update( - [in] DWORD dwFlags, - [in] HANDLE hEvent, - [in] PAPCFUNC pfnAPC, - [in] DWORD_PTR dwAPCData); - - HRESULT CompletionStatus( - [in] DWORD dwFlags, - [in] DWORD dwMilliseconds); -}; - - - - diff --git a/import/DirectX8/include/DShowIDL/qedit.idl b/import/DirectX8/include/DShowIDL/qedit.idl deleted file mode 100644 index 48493548f..000000000 --- a/import/DirectX8/include/DShowIDL/qedit.idl +++ /dev/null @@ -1,1702 +0,0 @@ -//------------------------------------------------------------------------------ -// File: QEdit.idl -// -// Desc: -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -import "oaidl.idl"; -import "ocidl.idl"; -import "dxtrans.idl"; -import "amstream.idl"; -import "msxml.idl"; - -// -// forward declare -// -interface IAMTimelineGroup; -interface IAMTimelineObj; -interface IAMTimelineEffect; -interface IAMTimelineTrans; -interface IAMTimelineSrc; -interface IAMTimeline; -interface IAMErrorLog; -interface ISampleGrabber; -interface IPropertySetter; - -// used by DEXTER_VALUE's dwInterp var -typedef enum -{ - DEXTERF_JUMP, - DEXTERF_INTERPOLATE -} DEXTERF; - -// used to set values on the property setter -typedef struct -{ - BSTR Name; - DISPID dispID; - LONG nValues; -} DEXTER_PARAM; - -// used to set values on the property setter -typedef struct -{ - VARIANT v; - REFERENCE_TIME rt; - DWORD dwInterp; // one of the DEXTERF_ flags -} DEXTER_VALUE; - -// used by bMethod directly below -enum -{ - DEXTER_AUDIO_JUMP, - DEXTER_AUDIO_INTERPOLATE -}; - -// used to set volumes on the mixer and mixer pins -typedef struct -{ - REFERENCE_TIME rtEnd; //end Time - double dLevel; //end Volume Level - BOOL bMethod; //jump or interpolate -} DEXTER_AUDIO_VOLUMEENVELOPE ; - -// used in IAMTimeline::Get(Set)InsertMode -enum -{ - TIMELINE_INSERT_MODE_INSERT = 1, - TIMELINE_INSERT_MODE_OVERLAY = 2 -}; - -// -// define what main 'things' can be put into the timeline tree. -// these values are used quite a bit with timeline access -// (bitmap mask flags) -typedef enum -{ - TIMELINE_MAJOR_TYPE_COMPOSITE = 1, - TIMELINE_MAJOR_TYPE_TRACK = 2, - TIMELINE_MAJOR_TYPE_SOURCE = 4, - TIMELINE_MAJOR_TYPE_TRANSITION = 8, - TIMELINE_MAJOR_TYPE_EFFECT = 16, - TIMELINE_MAJOR_TYPE_GROUP = 128 -} TIMELINE_MAJOR_TYPE; - -// used in various IAMTimelineXXX "search" functions. Look in this -// file for "SearchDirection" to see where it's used. I didn't want -// to use an enum as an interface param type, so I used a long. Probably -// silly of me. -typedef enum -{ - DEXTERF_BOUNDING = -1, // finds any source whose start <= Time and stop > Time - DEXTERF_EXACTLY_AT = 0, // finds any source that starts exactly at Time - DEXTERF_FORWARDS = 1 // finds any source that starts at or after Time -} DEXTERF_TRACK_SEARCH_FLAGS; - -// right now, the media type in the group contains enough information about -// how we want to recompress. This might not be enough information in the -// future, so we define a structure we can get and set to the group. -// -typedef struct _SCompFmt0 -{ - long nFormatId; - AM_MEDIA_TYPE MediaType; -} SCompFmt0; - -// used in IAMTimelineSrc::Get(Set)StretchMode -// -enum -{ - RESIZEF_STRETCH, - RESIZEF_CROP, - RESIZEF_PRESERVEASPECTRATIO, - RESIZEF_PRESERVEASPECTRATIO_NOLETTERBOX -}; - -// used in IRenderEngine::SetDynamicReconnectLevel -// (bitmap mask flags) -enum -{ - CONNECTF_DYNAMIC_NONE = 0x00000000, - CONNECTF_DYNAMIC_SOURCES = 0x00000001, - CONNECTF_DYNAMIC_EFFECTS = 0x00000002 -}; - -// used in -// IMediaLocator::FindMediaFile -// IRenderEngine::SetSourceNameValidation -// IAMTimeline::ValidateSourceNames -// (bitmap mask flags) -enum -{ - SFN_VALIDATEF_CHECK = 0x00000001, // do a check. Without this set, no check will be done. - SFN_VALIDATEF_POPUP = 0x00000002, // should UI popup show if not found - SFN_VALIDATEF_TELLME = 0x00000004, // warn user about replaced files - SFN_VALIDATEF_REPLACE = 0x00000008, // should it replace names in the tldb if found - SFN_VALIDATEF_USELOCAL = 0x000000010, // use local media preferrably over networked media - SFN_VALIDATEF_NOFIND = 0x000000020, // never find filenames, always use UI popup to find., - // when used, _POPUP must be used as well - SFN_VALIDATEF_IGNOREMUTED = 0x000000040, // ignore muted files in the tldb - SFN_VALIDATEF_END -}; - -// key transitions types -enum -{ - DXTKEY_RGB, - DXTKEY_NONRED, - DXTKEY_LUMINANCE, - DXTKEY_ALPHA, - DXTKEY_HUE -}; - - -//////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////// -// New Property setting Interfaces -//////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////// - -// interface for objects which can save/load IDispatch-able properties -[ - object, - uuid(AE9472BD-B0C3-11D2-8D24-00A0C9441E20), - helpstring("IPropertySetter Interface"), - pointer_default(unique) -] -interface IPropertySetter : IUnknown // IPersist? -{ - // for loading and saving through XML - HRESULT LoadXML([in] IUnknown * pxml); - // !!! doesn't work HRESULT LoadXML([in] IXMLElement * pxml); - HRESULT PrintXML([out] char *pszXML, [in] int cbXML, [out] int *pcbPrinted,[in] int indent); - - // for cloning a portion of the props when splitting the object - //AUTOMATE - HRESULT CloneProps([out] IPropertySetter **ppSetter, - [in] REFERENCE_TIME rtStart, - [in] REFERENCE_TIME rtStop); - - // for loading and saving programmatically - // caller must call this in pre-sorted order, this time must be > all - // previous times - //AUTOMATE - HRESULT AddProp([in] DEXTER_PARAM Param, - [in] DEXTER_VALUE *paValue); - //AUTOMATE - HRESULT GetProps([out] LONG *pcParams, - [out] DEXTER_PARAM **paParam, - [out] DEXTER_VALUE **paValue); - // after calling GetProps, you must call FreeProps to free resources - //AUTOMATE - HRESULT FreeProps([in] LONG cParams, - [in] DEXTER_PARAM *paParam, - [in] DEXTER_VALUE *paValue); - // to empty to property setter, so you can start over again - HRESULT ClearProps(); - - // for persisting - HRESULT SaveToBlob([out] LONG *pcSize, [out] BYTE **ppb); - HRESULT LoadFromBlob([in] LONG cSize, [in] BYTE *pb); - - // to program the object that supports IDispatch with the props - // call with rtNow == -1 to set Static Props when your object instantiates - // errors will be logged, if a log is provided - //AUTOMATE - HRESULT SetProps([in] IUnknown *pTarget, - [in] REFERENCE_TIME rtNow); - -}; - -// supported by our DxtCompositor class, this allows us to draw whatever comes in -// upon only a portion of the output bitmap - -[ - object, - uuid(BB44391E-6ABD-422f-9E2E-385C9DFF51FC), - dual, - helpstring("IDxtCompositor Interface"), - pointer_default(unique) -] -interface IDxtCompositor : IDXEffect -{ - [propget, id(1), helpstring("property OffsetX")] HRESULT OffsetX([out, retval] long *pVal); - [propput, id(1), helpstring("property OffsetX")] HRESULT OffsetX([in] long newVal); - [propget, id(2), helpstring("property OffsetY")] HRESULT OffsetY([out, retval] long *pVal); - [propput, id(2), helpstring("property OffsetY")] HRESULT OffsetY([in] long newVal); - [propget, id(3), helpstring("property Width")] HRESULT Width([out, retval] long *pVal); - [propput, id(3), helpstring("property Width")] HRESULT Width([in] long newVal); - [propget, id(4), helpstring("property Height")] HRESULT Height([out, retval] long *pVal); - [propput, id(4), helpstring("property Height")] HRESULT Height([in] long newVal); - - [propget, id(5), helpstring("property SrcOffsetX")] HRESULT SrcOffsetX([out, retval] long *pVal); - [propput, id(5), helpstring("property SrcOffsetX")] HRESULT SrcOffsetX([in] long newVal); - [propget, id(6), helpstring("property SrcOffsetY")] HRESULT SrcOffsetY([out, retval] long *pVal); - [propput, id(6), helpstring("property SrcOffsetY")] HRESULT SrcOffsetY([in] long newVal); - [propget, id(7), helpstring("property SrcWidth")] HRESULT SrcWidth([out, retval] long *pVal); - [propput, id(7), helpstring("property SrcWidth")] HRESULT SrcWidth([in] long newVal); - [propget, id(8), helpstring("property SrcHeight")] HRESULT SrcHeight([out, retval] long *pVal); - [propput, id(8), helpstring("property SrcHeight")] HRESULT SrcHeight([in] long newVal); -}; - -[ - object, - uuid(4EE9EAD9-DA4D-43d0-9383-06B90C08B12B), - dual, - helpstring("IDxtAlphaSetter Interface"), - pointer_default(unique) -] -interface IDxtAlphaSetter : IDXEffect -{ - // set the alpha to a particular number - [propget, id(1), helpstring("property Alpha")] HRESULT Alpha([out, retval] long *pVal); - [propput, id(1), helpstring("property Alpha")] HRESULT Alpha([in] long newVal); - - // set the alpha to a percentage of it's full value - [propget, id(2), helpstring("property AlphaRamp")] HRESULT AlphaRamp([out, retval] double *pVal); - [propput, id(2), helpstring("property AlphaRamp")] HRESULT AlphaRamp([in] double newVal); -}; - -// Supported by our JPEG DXT, that can do any wipe based on a bitmap -// - -[ - object, - uuid(DE75D011-7A65-11D2-8CEA-00A0C9441E20), - dual, - helpstring("IDxtJpeg Interface"), - pointer_default(unique) -] -interface IDxtJpeg : IDXEffect -{ - [propget, id(1), helpstring("property MaskNum")] HRESULT MaskNum([out, retval] long *); - [propput, id(1), helpstring("property MaskNum")] HRESULT MaskNum([in] long); - [propget, id(2), helpstring("property MaskName")] HRESULT MaskName([out, retval] BSTR *pVal); - [propput, id(2), helpstring("property MaskName")] HRESULT MaskName([in] BSTR newVal); - [propget, id(3), helpstring("property ScaleX")] HRESULT ScaleX([out, retval] double *); - [propput, id(3), helpstring("property ScaleX")] HRESULT ScaleX([in] double); - [propget, id(4), helpstring("property ScaleY")] HRESULT ScaleY([out, retval] double *); - [propput, id(4), helpstring("property ScaleY")] HRESULT ScaleY([in] double); - [propget, id(5), helpstring("property OffsetX")] HRESULT OffsetX([out, retval] long *); - [propput, id(5), helpstring("property OffsetX")] HRESULT OffsetX([in] long); - [propget, id(6), helpstring("property OffsetY")] HRESULT OffsetY([out, retval] long *); - [propput, id(6), helpstring("property OffsetY")] HRESULT OffsetY([in] long); - [propget, id(7), helpstring("property ReplicateX")] HRESULT ReplicateX([out, retval] long *pVal); - [propput, id(7), helpstring("property ReplicateX")] HRESULT ReplicateX([in] long newVal); - [propget, id(8), helpstring("property ReplicateY")] HRESULT ReplicateY([out, retval] long *pVal); - [propput, id(8), helpstring("property ReplicateY")] HRESULT ReplicateY([in] long newVal); - [propget, id(9), helpstring("property BorderColor")] HRESULT BorderColor([out, retval] long *pVal); - [propput, id(9), helpstring("property BorderColor")] HRESULT BorderColor([in] long newVal); - [propget, id(10), helpstring("property BorderWidth")] HRESULT BorderWidth([out, retval] long *pVal); - [propput, id(10), helpstring("property BorderWidth")] HRESULT BorderWidth([in] long newVal); - [propget, id(11), helpstring("property BorderSoftness")] HRESULT BorderSoftness([out, retval] long *pVal); - [propput, id(11), helpstring("property BorderSoftness")] HRESULT BorderSoftness([in] long newVal); - HRESULT ApplyChanges(); - HRESULT LoadDefSettings(); -}; - - // key - [ - object, - uuid(3255de56-38fb-4901-b980-94b438010d7b), - dual, - helpstring("IDxtKey Interface"), - pointer_default(unique) - ] - interface IDxtKey : IDXEffect - { - [propget, id(1), helpstring("property KeyType")] HRESULT KeyType([out, retval] int *); - [propput, id(1), helpstring("property Keytype")] HRESULT KeyType([in] int); - [propget, id(2), helpstring("property Hue")] HRESULT Hue([out, retval] int *); - [propput, id(2), helpstring("property Hue")] HRESULT Hue([in] int ); - [propget, id(3), helpstring("property Luminance")] HRESULT Luminance([out, retval] int *); - [propput, id(3), helpstring("property Luminance")] HRESULT Luminance([in] int ); - [propget, id(4), helpstring("property RGB")] HRESULT RGB([out, retval] DWORD *); - [propput, id(4), helpstring("property RGB")] HRESULT RGB([in] DWORD ); - [propget, id(5), helpstring("property Similarity")] HRESULT Similarity([out,retval] int * ); - [propput, id(5), helpstring("property Similarity")] HRESULT Similarity([in] int ); - [propget, id(6), helpstring("property Invert")] HRESULT Invert([out, retval] BOOL *); - [propput, id(6), helpstring("property Invert")] HRESULT Invert([in] BOOL); - }; - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // This little COM interface will look 'around' for the closest - // path match for a given file. If the file already exists, then - // this interface should hardly do anything. If it's not found, - // it will go look for it and if successful, return S_FALSE. If it - // cannot find the file, it will call the hook, if set and return - // it's return code. if the hook is not set, it is in a type of - // error condition. The Dexter-provided MediaLocator will bring up - // a dialog box asking you to browse for your file. Other COM - // objects may do something else. - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[ - object, - uuid(288581E0-66CE-11d2-918F-00C0DF10D434), - odl, - helpstring("IMediaLocator Interface"), - pointer_default(unique) -] -interface IMediaLocator : IUnknown -{ - // same flags as used by IRenderEngine's SetSourceNameValidation - HRESULT FindMediaFile( BSTR Input, BSTR FilterString, BSTR * pOutput, long Flags ); - HRESULT AddFoundLocation( BSTR DirectoryName ); -}; - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // This object provides caching of duration and stream type - // information for files that would produce a directshow source - // filter. It takes too long to figure this out in DShow right - // now, so this is one way around it. The way it works is that - // you first fill out the Filename property, then call and - // ask how many streams it has, or, set the CurrentStream prop - // and then ask for the per-stream properties, StreamType or - // StreamLength. They both reference the CurrentStream prop that - // you set. I also allowed you (for convenience) to just give - // it a IUnknown Filter that represents an IBaseFilter source - // filter that is NOT currently in a graph. It will use that - // instead. When using this, though, you will not get cached - // values. The cached values are stored in the system's ini file - // called DCBC2A70-70D8-4459-BFFA-E0D61DEA3FDF.INI. Nice, huh? :-) - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[ - object, - uuid(65BD0710-24D2-4ff7-9324-ED2E5D3ABAFA), - odl, - helpstring("IMediaDet Interface"), - pointer_default(unique) -] -interface IMediaDet : IUnknown -{ - [propget, id(1), helpstring("property Filter")] HRESULT Filter([out, retval] IUnknown* *pVal); - [propput, id(1), helpstring("property Filter")] HRESULT Filter([in] IUnknown* newVal); - [propget, id(2), helpstring("property OutputStreams")] HRESULT OutputStreams([out, retval] long *pVal); - [propget, id(3), helpstring("property CurrentStream")] HRESULT CurrentStream([out, retval] long *pVal); - [propput, id(3), helpstring("property CurrentStream")] HRESULT CurrentStream([in] long newVal); - [propget, id(4), helpstring("property StreamType")] HRESULT StreamType([out, retval] GUID *pVal); - [propget, id(5), helpstring("property StreamTypeB")] HRESULT StreamTypeB([out, retval] BSTR *pVal); - [propget, id(6), helpstring("property StreamLength")] HRESULT StreamLength([out, retval] double *pVal); - [propget, id(7), helpstring("property Filename")] HRESULT Filename([out, retval] BSTR *pVal); - [propput, id(7), helpstring("property Filename")] HRESULT Filename([in] BSTR newVal); - [id(8), helpstring("method GetBitmapBits")] HRESULT GetBitmapBits(double StreamTime, long * pBufferSize, char * pBuffer, long Width, long Height); - [id(9), helpstring("method WriteBitmapBits")] HRESULT WriteBitmapBits(double StreamTime, long Width, long Height, BSTR Filename ); - [propget, id(10), helpstring("property StreamMediaType")] HRESULT StreamMediaType([out, retval] AM_MEDIA_TYPE * pVal); - [id(11), helpstring("method GetSampleGrabber")] HRESULT GetSampleGrabber( [out] ISampleGrabber ** ppVal ); - [propget, id(12), helpstring("property FrameRate")] HRESULT FrameRate([out, retval] double *pVal); - [id(13), helpstring("method EnterBitmapGrabMode")] HRESULT EnterBitmapGrabMode( double SeekTime ); -}; - - -// useless interface, don't use it! - -[ - object, - uuid(AE9472BE-B0C3-11D2-8D24-00A0C9441E20), - odl, - helpstring("IGrfCache Interface"), - pointer_default(unique) -] -interface IGrfCache : IDispatch -{ - [id(1), helpstring("method AddFilter")] - HRESULT AddFilter( - IGrfCache * ChainedCache, - LONGLONG ID, - const IBaseFilter * pFilter, - LPCWSTR pName); - - [id(2), helpstring("method ConnectPins")] - HRESULT ConnectPins( - IGrfCache * ChainedCache, - LONGLONG PinID1, - const IPin * pPin1, - LONGLONG PinID2, - const IPin * pPin2); - - [id(3), helpstring("method SetGraph")] - HRESULT SetGraph(const IGraphBuilder * pGraph); - - [id(4), helpstring("method DoConnectionsNow")] - HRESULT DoConnectionsNow(); -}; - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // The RenderEngin builds a graph from the timeline and gives - // you some simple positional commands. - // explained methods: - // SetTimelineObject - tell the render engine who to parse - // ConnectEverything - build up a graph based on the timeline - // ScrapIt - throw away graph and everything - // GetFilterGraph - get the graph that's built up, if any - // SetFilterGraph - allows you to preset the graph that's built up. - // cannot call this if there already is a graph. - - // !!! the following methods are unused/not implemented - - // SetInterestRange - discard COM objects and memory outside of this - // range, if possible. Used for scrubbing on a long timeline and - // freeing up resources - // SetRenderRange - pretend like a portion of the timeline IS the timeline - // and don't connect anything in the graph outside of that range. - // Commit - allocate what's necessary and get prepared to run - // Decommit - free anything possible - // GetCaps - find out some info about the render engine - // DoSmartRecompression - connect compressed sources if - // possible - // in the graph, this will RenderPin( ) on every switcher - // rendering pin. - // SetSourceNameValidation - allows you to set some flags which - // determine how source files are found, if they need to be found. - // FilterString is a list of extensions to find for the media - // files (see OPENFILENAME filters) - // pOverride is a media locator you would like to use instead - // of the built in one - // The flags are defined in the struct immediately below. - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[ - object, - uuid(6BEE3A81-66C9-11d2-918F-00C0DF10D434), - odl, - helpstring("IRenderEngine Interface"), - pointer_default(unique) -] -interface IRenderEngine : IUnknown -{ - HRESULT SetTimelineObject( IAMTimeline * pTimeline ); - HRESULT GetTimelineObject( [out] IAMTimeline ** ppTimeline ); - HRESULT GetFilterGraph( [out] IGraphBuilder ** ppFG ); - HRESULT SetFilterGraph( IGraphBuilder * pFG ); - HRESULT SetInterestRange( REFERENCE_TIME Start, REFERENCE_TIME Stop ); - HRESULT SetInterestRange2( double Start, double Stop ); - HRESULT SetRenderRange( REFERENCE_TIME Start, REFERENCE_TIME Stop ); - HRESULT SetRenderRange2( double Start, double Stop ); - HRESULT GetGroupOutputPin( long Group, [out] IPin ** ppRenderPin ); - HRESULT ScrapIt( ); - HRESULT RenderOutputPins( ); - HRESULT GetVendorString( [out,retval] BSTR * pVendorID ); - HRESULT ConnectFrontEnd( ); - HRESULT SetSourceConnectCallback( IGrfCache * pCallback ); - HRESULT SetDynamicReconnectLevel( long Level ); - HRESULT DoSmartRecompression( ); - HRESULT UseInSmartRecompressionGraph( ); - - HRESULT SetSourceNameValidation( BSTR FilterString, IMediaLocator * pOverride, LONG Flags ); - - // not implemented yet - HRESULT Commit( ); - HRESULT Decommit( ); - HRESULT GetCaps( long Index, long * pReturn ); -}; - -// used for the smart render engine when it needs to find a compressor -[ - object, - uuid(F03FA8DE-879A-4d59-9B2C-26BB1CF83461), - odl, - helpstring("IFindCompressorCB Interface"), - pointer_default(unique) -] -interface IFindCompressorCB : IUnknown -{ - HRESULT GetCompressor( AM_MEDIA_TYPE * pType, AM_MEDIA_TYPE * pCompType, [out] IBaseFilter ** ppFilter ); -} - -[ - object, - uuid(F03FA8CE-879A-4d59-9B2C-26BB1CF83461), - odl, - helpstring("ISmartRenderEngine Interface"), - pointer_default(unique) -] -interface ISmartRenderEngine : IUnknown -{ - HRESULT SetGroupCompressor( long Group, IBaseFilter * pCompressor ); - HRESULT GetGroupCompressor( long Group, IBaseFilter ** pCompressor ); - HRESULT SetFindCompressorCB( IFindCompressorCB * pCallback ); -} - -//////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////// -// TIMELINE TIMELINE TIMELINE TIMELINE TIMELINE TIMELINE -//////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////// - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Every object on the timeline supports at least this interface. - // explained methods: - // Get/SetStartStop - the timeline times at which this object is - // active. Groups and Tracks have start times of zero. - // FixTimes - used by the render engine. Rounds the input times - // to the nearest FPS of the parent Group, for use in setting - // up the big switch. - // GetSubObject - get the sub-object which is associated with this - // timeline object. Each timeline object can carry around a - // pointer to 'something else'. For our Render Engine, this is - // a pointer to a filter that gets put into a graph. - // NOTE: Getting the subobject will FORCE it to load if it's possible - // to force this. If you don't want it to do this, don't call - // this function. - // SetSubObject - see GetSubObject - // SetSubObjectGUID - instead of giving the node a pointer, you can - // instead give it a GUID and see if this works instead. The - // sub-object will attempt to be instantiated when 'necessary' - // which is really when it's asked for with GetSubObject./ - // !!! a better way to do this perhaps? - // GetSubObjectLoaded - ask if the sub-object pointer is set - // Get/SetTimelineType - return the major type which is stored here, - // used by the API user and the render engine. - // Get/SetTimelineSubType - see above - // Get/SetUserID - get and set a number, any number - // GetGenID - every created object has a unique number to it. Used - // by the render engine. - // Get/SetUserName - a storable name, for users of the API - // Get/SetPropertySetter - the object that will set properties for this - // object (it will support IPropertySetter and it is created by - // CPropertySetter) - // Get/SetUserData - gets the persistant data used by the user of - // the API. - // Get/SetMuted - set whether this object should be active or not. - // Setting a parent of other objects off also turns off the - // sub-objects. - // Get/SetLocked - set whether you can edit this object or not. - // Note: the timeline doesn't enforce this, it just stores - // a value for convenience. - // Get/SetDirtyRange - - // RemoveAll - remove this object, and if in the tree already, all it's - // sub objects, including children - // Remove - remove this object, and if in the tree already, all it's - // sub objects, but not kids - // GetTimelineNoRef - called internally by the timeline. - // GetGroupIBelongTo - called internally by the timeline. - // GetEmbedDepth - find out how many tracks we are a part of - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[ - object, - local, - uuid(78530B77-61F9-11D2-8CAD-00A024580902), - odl, - helpstring("IAMTimelineObj Interface"), - pointer_default(unique) -] -interface IAMTimelineObj : IUnknown -{ - [helpstring("method GetStartStop")] - HRESULT GetStartStop(REFERENCE_TIME * pStart, REFERENCE_TIME * pStop); - [helpstring("method GetStartStop2")] - HRESULT GetStartStop2(REFTIME * pStart, REFTIME * pStop); - [helpstring("method FixTimes")] - HRESULT FixTimes(REFERENCE_TIME * pStart, REFERENCE_TIME * pStop); - [helpstring("method FixTimes2")] - HRESULT FixTimes2(REFTIME * pStart, REFTIME * pStop); - [helpstring("method SetStartStop")] - HRESULT SetStartStop(REFERENCE_TIME Start, REFERENCE_TIME Stop); - [helpstring("method SetStartStop2")] - HRESULT SetStartStop2(REFTIME Start, REFTIME Stop); - [helpstring("method GetPropertySetter")] - HRESULT GetPropertySetter([out,retval] IPropertySetter* *pVal); - [helpstring("method SetPropertySetter")] - HRESULT SetPropertySetter(IPropertySetter* newVal); - [helpstring("method GetSubObject")] - HRESULT GetSubObject([out,retval] IUnknown* *pVal); - [helpstring("method SetSubObject")] - HRESULT SetSubObject(IUnknown* newVal); - [helpstring("method SetSubObjectGUID")] - HRESULT SetSubObjectGUID(GUID newVal); - [helpstring("method SetSubObjectGUIDByBSTR")] - HRESULT SetSubObjectGUIDB(BSTR newVal); - [helpstring("method GetSubObjectGUID")] - HRESULT GetSubObjectGUID(GUID * pVal); - [helpstring("method GetSubObjectGUIDByBSTR")] - HRESULT GetSubObjectGUIDB([out,retval] BSTR * pVal); - [helpstring("method GetSubObjectLoaded")] - HRESULT GetSubObjectLoaded(BOOL * pVal); - [helpstring("method GetTimelineType")] - HRESULT GetTimelineType(TIMELINE_MAJOR_TYPE * pVal); - [helpstring("method SetTimelineType")] - HRESULT SetTimelineType(TIMELINE_MAJOR_TYPE newVal); - [helpstring("method GetUserID")] - HRESULT GetUserID(long * pVal); - [helpstring("method SetUserID")] - HRESULT SetUserID(long newVal); - [helpstring("method GetGenID")] - HRESULT GetGenID( long * pVal ); - [helpstring("method GetUserName")] - HRESULT GetUserName([out,retval] BSTR * pVal); - [helpstring("method SetUserName")] - HRESULT SetUserName(BSTR newVal); - [helpstring("method GetUserData")] - HRESULT GetUserData(BYTE * pData, long * pSize); - [helpstring("method SetUserData")] - HRESULT SetUserData(BYTE * pData, long Size); - [helpstring("method GetMuted")] - HRESULT GetMuted(BOOL * pVal); - [helpstring("method SetMuted")] - HRESULT SetMuted(BOOL newVal); - [helpstring("method GetLocked")] - HRESULT GetLocked(BOOL * pVal); - [helpstring("method SetLocked")] - HRESULT SetLocked(BOOL newVal); - [helpstring("method GetDirtyRange")] - HRESULT GetDirtyRange(REFERENCE_TIME * pStart, REFERENCE_TIME * pStop); - [helpstring("method GetDirtyRange")] - HRESULT GetDirtyRange2(REFTIME * pStart, REFTIME * pStop); - [helpstring("method SetDirtyRange")] - HRESULT SetDirtyRange(REFERENCE_TIME Start, REFERENCE_TIME Stop); - [helpstring("method SetDirtyRange")] - HRESULT SetDirtyRange2(REFTIME Start, REFTIME Stop); - [helpstring("method ClearDirty")] - HRESULT ClearDirty( ); - [helpstring("method Remove")] - HRESULT Remove(); - [helpstring("method RemoveAll")] - HRESULT RemoveAll(); - HRESULT GetTimelineNoRef( IAMTimeline ** ppResult ); - HRESULT GetGroupIBelongTo( [out] IAMTimelineGroup ** ppGroup ); - HRESULT GetEmbedDepth( long * pVal ); -}; - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Any object on the timeline that can have an effect put on it - // implements this interface. This includes sources, tracks, and - // compositions. - // explained methods: - // EffectInsBefore - insert an effect at the given priority onto - // this object. The effect's times will be clipped within - // this object's bounds. Use -1 to specify 'at the end' for priority. - // You cannot have two effects at the same priority. - // EffectSwapPriorities - swaparoo two effects. Makes undo easier to - // implement. - // EffectGetCount - get how many effects are applied to this object. - // GetEffect - get the nth effect applied to this object - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -[ - object, - uuid(EAE58537-622E-11d2-8CAD-00A024580902), - odl, - helpstring("IAMTimelineEffectable Interface"), - pointer_default(unique) -] -interface IAMTimelineEffectable : IUnknown -{ - [helpstring("method EffectInsBefore")] - HRESULT EffectInsBefore(IAMTimelineObj * pFX, long priority); - [helpstring("method EffectSwapPriorities")] - HRESULT EffectSwapPriorities(long PriorityA, long PriorityB); - [helpstring("method EffectGetCount")] - HRESULT EffectGetCount(long * pCount); - [helpstring("method GetEffect")] - HRESULT GetEffect([out] IAMTimelineObj ** ppFx, long Which); -}; - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Any effect on the timeline will support at least this interface. - // NOTE: The Start/Stop times on this object are RELATIVE to their - // parent's, as are all start/stop times. - // explained methods: - // EffectGetPriority - finds out this effect's priority related to the others. - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[ - object, - uuid(BCE0C264-622D-11d2-8CAD-00A024580902), - odl, - helpstring("IAMTimelineEffect Interface"), - pointer_default(unique) -] -interface IAMTimelineEffect : IUnknown -{ - [helpstring("method EffectGetPriority")] - HRESULT EffectGetPriority(long * pVal); -}; - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Any object on the timeline that can have a transition put on it - // implements this interface - // explained methods: - // TransAdd - add a transition on this object. Multiple trans's on - // the same object cannot overlap in time. Transitions' times - // must lie within the bounds of their parent. - // TransGetCount - get how many transitions are applied to this - // object. - // GetNextTrans - given a time, get the next transition that happens - // on this object after that time. On exit, the input time is - // set to the start time of the transition. - // GetTransAtTime - find a transition forwards or backwards from - // a given spot. See DEXTERF_TRACK_SEARCH_FLAGS enum. - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[ - object, - uuid(378FA386-622E-11d2-8CAD-00A024580902), - odl, - helpstring("IAMTimelineTransable Interface"), - pointer_default(unique) -] -interface IAMTimelineTransable : IUnknown -{ - [helpstring("method TransAdd")] - HRESULT TransAdd(IAMTimelineObj * pTrans); - [helpstring("method TransGetCount")] - HRESULT TransGetCount(long * pCount); - [helpstring("method GetNextTrans")] - HRESULT GetNextTrans([out] IAMTimelineObj ** ppTrans, REFERENCE_TIME * pInOut); - [helpstring("method GetNextTrans2")] - HRESULT GetNextTrans2([out] IAMTimelineObj ** ppTrans, REFTIME * pInOut); - [helpstring("method GetTransAtTime")] - HRESULT GetTransAtTime( - [out] IAMTimelineObj ** ppObj, - REFERENCE_TIME Time, - long SearchDirection ); - [helpstring("method GetTransAtTime2")] - HRESULT GetTransAtTime2([out] IAMTimelineObj ** ppObj, REFTIME Time, long SearchDirection ); -}; - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Any object on the timeline that can be split into two will - // implement this interface. Namely, source, effects, and transitions - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[ - object, - uuid(A0F840A0-D590-11d2-8D55-00A0C9441E20), - odl, - helpstring("IAMTimelineSplittable Interface"), - pointer_default(unique) -] -interface IAMTimelineSplittable : IUnknown -{ - HRESULT SplitAt(REFERENCE_TIME Time); - HRESULT SplitAt2(REFTIME Time); -}; - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Any trans on the timeline will support at least this interface. - // NOTE: The Start/Stop times on this object are RELATIVE to their - // parent's, as are all start/stop times. - // explained methods: - // GetCutPoint - get where this transition should cut from A to B - // if the transition were not applied. - // GetA2B - get if this transition is to go from A->B or B->A. - // GetBackwards - get if this transition should run backwards. - // GetCutsOnly - force no transition, force doing a cut - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[ - object, - uuid(BCE0C265-622D-11d2-8CAD-00A024580902), - odl, - helpstring("IAMTimelineTrans Interface"), - pointer_default(unique) -] -interface IAMTimelineTrans : IUnknown -{ - [helpstring("method GetCutPoint")] - HRESULT GetCutPoint(REFERENCE_TIME * pTLTime); - [helpstring("method GetCutPoint2")] - HRESULT GetCutPoint2(REFTIME * pTLTime); - [helpstring("method SetCutPoint")] - HRESULT SetCutPoint(REFERENCE_TIME TLTime); - [helpstring("method SetCutPoint2")] - HRESULT SetCutPoint2(REFTIME TLTime); - [helpstring("method GetSwapInputs")] - HRESULT GetSwapInputs( BOOL * pVal ); - [helpstring("method SetSwapInputs")] - HRESULT SetSwapInputs( BOOL pVal ); - [helpstring("method GetCutsOnly")] - HRESULT GetCutsOnly( BOOL * pVal ); - [helpstring("method SetCutsOnly")] - HRESULT SetCutsOnly( BOOL pVal ); -}; - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Sources represent any source media object on the timeline. - // They extend an IAMTimelineObj to include media start and stop - // times, a media name (which could represent darned near anything), - // and a StreamNumber, which defines which stream out of a potential - // many this stream represents from a source clip. - // explained methods: - // ModifyStopTime - like calling SetStartStop, but this method just - // adjusts the tail end of the clip. - // FixMediaTimes - called by the render engine to round times to - // this source clip's parent group's FPS. - // SpliceWithNext - if the next clip after this is the same source - // and this's stop time matches next's start time, the two - // will be joined. - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[ - object, - uuid(78530B79-61F9-11D2-8CAD-00A024580902), - odl, - helpstring("IAMTimelineSrc Interface"), - pointer_default(unique) -] -interface IAMTimelineSrc : IUnknown -{ - [helpstring("method GetMediaTimes")] - HRESULT GetMediaTimes(REFERENCE_TIME * pStart, REFERENCE_TIME * pStop); - [helpstring("method GetMediaTimes2")] - HRESULT GetMediaTimes2(REFTIME * pStart, REFTIME * pStop); - [helpstring("method ModifyStopTime")] - HRESULT ModifyStopTime(REFERENCE_TIME Stop); - [helpstring("method ModifyStopTime2")] - HRESULT ModifyStopTime2(REFTIME Stop); - [helpstring("method FixMediaTimes")] - HRESULT FixMediaTimes(REFERENCE_TIME * pStart, REFERENCE_TIME * pStop); - [helpstring("method FixMediaTimes2")] - HRESULT FixMediaTimes2(REFTIME * pStart, REFTIME * pStop); - [helpstring("method SetMediaTimes")] - HRESULT SetMediaTimes(REFERENCE_TIME Start, REFERENCE_TIME Stop); - [helpstring("method SetMediaTimes2")] - HRESULT SetMediaTimes2(REFTIME Start, REFTIME Stop); - [helpstring("method SetMediaLength")] - HRESULT SetMediaLength(REFERENCE_TIME Length); - [helpstring("method SetMediaLength2")] - HRESULT SetMediaLength2(REFTIME Length); - [helpstring("method GetMediaLength")] - HRESULT GetMediaLength(REFERENCE_TIME * pLength); - [helpstring("method GetMediaLength2")] - HRESULT GetMediaLength2(REFTIME * pLength); - [helpstring("method GetMediaName")] - HRESULT GetMediaName([out,retval] BSTR * pVal); - [helpstring("method SetMediaName")] - HRESULT SetMediaName(BSTR newVal); - [helpstring("method SpliceWithNext")] - HRESULT SpliceWithNext(IAMTimelineObj * pNext); - [helpstring("method GetStreamNumber")] - HRESULT GetStreamNumber(long * pVal); - [helpstring("method SetStreamNumber")] - HRESULT SetStreamNumber(long Val); - HRESULT IsNormalRate( BOOL * pVal ); - - // If a source can't figure out its frames per second, this number - // will be used (eg: Dib sequences). AVI, MPEG, etc. will not need this - // Use 0 fps to prevent a filename like "ski4.jpg" from using a dib seq - [helpstring("method GetDefaultFPS")] - HRESULT GetDefaultFPS(double * pFPS); - [helpstring("method SetDefaultFPS")] - HRESULT SetDefaultFPS(double FPS); - - // !!! This is video specific.. new interface? - // what kind of stretching? Stretch, crop, or preserve aspect ratio? - [helpstring("method GetStretchMode")] - HRESULT GetStretchMode(int * pnStretchMode); - [helpstring("method SetStretchMode")] - HRESULT SetStretchMode(int nStretchMode); -}; - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Tracks are things that can contain media in them. You can add - // and remove sources, effects, and transitions from them. Sources - // are added according to the current insert mode of the timeline. - // If in OVERLAY mode, moving or adding a source to a time that's - // already occupied by another source will wipe out any overlapping - // portion of the underlying source. In InsertMode, everything at - // the insert point is moved down in time to make room for the - // new source. - // explained methods: - // SrcAdd - add the source to this track. The source's start/stop - // times must be set up first. - // GetNextSrc - pass a time in at which you wish to find a source - // and it will return the first source which occurs after the - // given time. - // MoveAllSources - bump a bunch of sources a certain direction - // on the track by a given time. - // GetSourcesCount - how many sources are on this track? - // AreYouBlank - do you contain anything at all? - // GetSrcAtTime - find a source at a given time. SearchDirection - // is which way to search. -1 = backwards, 1 = forwards - // MakeSpace - !!! what does this do, anyhow? - // RemoveSlice - !!! what does this do, anyhow? - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[ - object, - uuid(EAE58538-622E-11d2-8CAD-00A024580902), - odl, - helpstring("IAMTimelineTrack Interface"), - pointer_default(unique) -] -interface IAMTimelineTrack : IUnknown -{ - [helpstring("method SrcAdd")] - HRESULT SrcAdd(IAMTimelineObj * pSource); - [helpstring("method GetNextSrc")] - HRESULT GetNextSrc([out] IAMTimelineObj ** ppSrc, REFERENCE_TIME * pInOut); - [helpstring("method GetNextSrc2")] - HRESULT GetNextSrc2([out] IAMTimelineObj ** ppSrc, REFTIME * pInOut); - [helpstring("method MoveEverythingBy")] - HRESULT MoveEverythingBy( REFERENCE_TIME Start, REFERENCE_TIME MoveBy ); - [helpstring("method MoveEverythingBy2")] - HRESULT MoveEverythingBy2( REFTIME Start, REFTIME MoveBy ); - [helpstring("method GetSourcesCount")] - HRESULT GetSourcesCount( long * pVal ); - [helpstring("method AreYouBlank")] - HRESULT AreYouBlank( long * pVal ); - [helpstring("method GetSrcAtTime")] - HRESULT GetSrcAtTime( - [out] IAMTimelineObj ** ppSrc, - REFERENCE_TIME Time, - long SearchDirection ); - [helpstring("method GetSrcAtTime2")] - HRESULT GetSrcAtTime2([out] IAMTimelineObj ** ppSrc, REFTIME Time, long SearchDirection ); - HRESULT InsertSpace( REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd ); - HRESULT InsertSpace2( REFTIME rtStart, REFTIME rtEnd ); - HRESULT ZeroBetween( REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd ); - HRESULT ZeroBetween2( REFTIME rtStart, REFTIME rtEnd ); - HRESULT GetNextSrcEx(IAMTimelineObj * pLast, [out] IAMTimelineObj **ppNext); -}; - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // This virtual track interface is shared by both the compositions - // and tracks (and groups). - // explained methods: - // TrackGetPriority - used by rendering objects which need to know this. - // SetTrackDirty - !!! not sure if this is useful. - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[ - object, - uuid(A8ED5F80-C2C7-11d2-8D39-00A0C9441E20), - odl, - helpstring("IAMTimelineVirtualTrack Interface"), - pointer_default(unique) -] -interface IAMTimelineVirtualTrack : IUnknown -{ - [helpstring("method TrackGetPriority")] - HRESULT TrackGetPriority(long * pPriority); - [helpstring("method SetTrackDirty")] - HRESULT SetTrackDirty( ); -}; - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Compositions are like tracks in the sense that they also - // implement IAMVirtualTrack and you can put transitions and effects - // on them, but they really are the SUM of those tracks that they - // contain. They are "embedded" compositions. They should only contain - // media of one particular type (like all video or all audio), but - // this is not enforced. You can add a composition to another - // composition with VTrackInsBefore, just like you can add a track. - // The very top composition to which all other comps and tracks belong - // is a Group, which supports I-AMTimelineGroup as well as I-AMTimelineComp. - // explained methods: - // VTrackInsBefore - does NOT mean VideoTrack. Means Virtual Track. - // Adds a virtual track to a composition at a given priority. - // use -1 to mean "at the end" - // VTrackSwapPriorities - switch two vtracks around. - // VTrackGetCount - get how many vtracks this comp contains. - // GetVTrack - you get the idea - // GetCountOfType - Get the total number of these objects this comp - // and all it's vtracks (recursively) contains. !!! this may be dead. - // GetRecursiveLayerOfType - given a number, returns a given track. This - // is done recursively. You need to pass in a pointer to the number, - // and it will be modified upon exit to an unknown value. DO NOT - // CALL THE VERSION WITH THE POINTER! - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[ - object, - uuid(EAE58536-622E-11d2-8CAD-00A024580902), - odl, - helpstring("IAMTimelineComp Interface"), - pointer_default(unique) -] -interface IAMTimelineComp : IUnknown -{ - [helpstring("method VTrackInsBefore")] - HRESULT VTrackInsBefore(IAMTimelineObj * pVirtualTrack, long Priority); - [helpstring("method VTrackSwapPriorities")] - HRESULT VTrackSwapPriorities(long VirtualTrackA, long VirtualTrackB); - [helpstring("method VTrackGetCount")] - HRESULT VTrackGetCount(long * pVal); - [helpstring("method GetVTrack")] - HRESULT GetVTrack([out] IAMTimelineObj ** ppVirtualTrack, long Which); - [helpstring("method GetCountOfType")] - HRESULT GetCountOfType(long * pVal, long * pValWithComps, TIMELINE_MAJOR_TYPE MajorType ); - [helpstring("method GetRecursiveLayerOfType")] - HRESULT GetRecursiveLayerOfType( - [out] IAMTimelineObj ** ppVirtualTrack, - long WhichLayer, - TIMELINE_MAJOR_TYPE Type); - [helpstring("method GetRecursiveLayerOfTypeI (do not call)")] - HRESULT GetRecursiveLayerOfTypeI( - [out] IAMTimelineObj ** ppVirtualTrack, - [in,out] long * pWhichLayer, - TIMELINE_MAJOR_TYPE Type); - HRESULT GetNextVTrack(IAMTimelineObj *pVirtualTrack, [out] IAMTimelineObj **ppNextVirtualTrack); -}; - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Groups represent the topmost composition in a timeline. Every - // group should contain media of only one major type (like all video). - // The timeline can contain multiple groups, see it's interface for - // this. Each group has a particular "media type" that you can get/set - // which help identify it. Each group has an associated FPS which - // is used by the render engine in setting up the big switch. All - // cuts on the timeline will happen rounded to this nearest FPS for - // this particular group. Each group has a priority which enables - // writing out multiple-stream files with 1 or more streams of the - // same type. (Like a 2 video stream AVI file). - // explained methods: - // SetTimeline - this is called internally when the group is added. - // Do not call this. - // GetTimeline - get the timeline this group belongs to. - // GetPriority - get this group's priority - // Get/SetOutputFPS - explained above - // SetMediaTypeForVB - method for VB. Pass in 0 for video, 1 for audio - // SetRecompFormatFromSource - set the recompress format based on the - // source that's loaded or set in the IAMTimelineSrc - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[ - object, - uuid(9EED4F00-B8A6-11d2-8023-00C0DF10D434), - odl, - helpstring("IAMTimelineGroup Interface"), - pointer_default(unique) -] -interface IAMTimelineGroup : IUnknown -{ - [helpstring("method SetTimeline")] - HRESULT SetTimeline( IAMTimeline * pTimeline ); - [helpstring("method GetTimeline")] - HRESULT GetTimeline( [out] IAMTimeline ** ppTimeline ); - [helpstring("method GetPriority")] - HRESULT GetPriority( long * pPriority ); - [helpstring("method GetMediaType")] - HRESULT GetMediaType([out] AM_MEDIA_TYPE *); - [helpstring("method SetMediaType")] - HRESULT SetMediaType([in] AM_MEDIA_TYPE *); - [helpstring("method SetOutputFPS")] - HRESULT SetOutputFPS(double FPS); - [helpstring("method GetOutputFPS")] - HRESULT GetOutputFPS(double * pFPS); - [helpstring("method SetGroupName")] - HRESULT SetGroupName( BSTR pGroupName ); - [helpstring("method GetGroupName")] - HRESULT GetGroupName( [out,retval] BSTR * pGroupName ); - // in preview mode, skip frames. In authoring mode, don't - [helpstring("method SetPreviewMode")] - HRESULT SetPreviewMode( BOOL fPreview ); - [helpstring("method GetPreviewMode")] - HRESULT GetPreviewMode( BOOL *pfPreview ); - [helpstring("method SetMediaTypeForVB")] - HRESULT SetMediaTypeForVB([in] long Val ); - // how many frames ahead switch can run - [helpstring("method GetOutputBuffering")] - HRESULT GetOutputBuffering([out] int *pnBuffer ); - [helpstring("method SetOutputBuffering")] - HRESULT SetOutputBuffering([in] int nBuffer ); - - HRESULT SetSmartRecompressFormat( long * pFormat ); - HRESULT GetSmartRecompressFormat( long ** ppFormat ); - HRESULT IsSmartRecompressFormatSet( BOOL * pVal ); - HRESULT IsRecompressFormatDirty( BOOL * pVal ); - HRESULT ClearRecompressFormatDirty( ); - HRESULT SetRecompFormatFromSource( IAMTimelineSrc * pSource ); -}; - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // The main timeline. This is the base object you use to set - // properties of the timeline as a whole, and to create blank - // objects for use within the timeline. You cannot create the - // objects using COM methods, you must go through the timeline to - // create this. That's because certain information is set before - // handing the object back to you. Every object created by the - // timeline will support at LEAST IAMTimelineObj. For any timeline, - // it can have one or more "groups" that it knows about. Each group - // has the capability to hold a complete sub-tree containing media - // that is all of one type. This logical seperation is used for the - // rendering engine, but is not strictly enforced. - // explained methods: - // CreateEmptyNode - pass in a mid type and it will pass back - // an object of the type you requested. - // AddGroup - add a created group to the tree - // RemGroupFromList - make sure timeline no longer knows about this group. - // does NOT do anything to the group itself. Normally the user - // does not want to call this, it's called from the Group's Remove( ) method. - // GetGroup - get a certain group - // GetGroupCount - get how many groups - // ClearAllGroups - clear everything - // GetInsertMode - ask what the insert mode is, overlay or insert - // SetInsertMode - set whether to insert or overlay - // EnableTransitions - turn transitions on or off as a whole - // EnableEffects - same deal. - // SetIntererstRange - discard sub-objects outside of a given - // time range, to save memory/resources - // Get/SetDefaultFPS - set the 'default' FPS for this timeline, - // the RenderEngine reads this information for setting itself up - // by default. - // GetCountOfType - ask for how many of a given thing are in a given - // group. !!! this may be a useless function. - // !!! not implemented - // IsDirty - asks if anything in the timeline needs to be redrawn - // GetDirtyRange - same deal - // ValidateSourceNames - make sure the filenames in the sources - // really exist. Use the same enum flags as the render engine - // uses for SetSourceNameValidation. Source's filenames will be - // changed to those of the found ones in the timeline. - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[ - object, - uuid(78530B74-61F9-11D2-8CAD-00A024580902), - odl, - helpstring("IAMTimeline Interface"), - pointer_default(unique) -] -interface IAMTimeline : IUnknown -{ - [helpstring("method CreateEmptyNode")] - HRESULT CreateEmptyNode([out] IAMTimelineObj ** ppObj, TIMELINE_MAJOR_TYPE Type ); - HRESULT AddGroup( IAMTimelineObj * pGroup ); - HRESULT RemGroupFromList( IAMTimelineObj * pGroup ); - HRESULT GetGroup( [out] IAMTimelineObj ** ppGroup, long WhichGroup ); - HRESULT GetGroupCount( long * pCount ); - HRESULT ClearAllGroups( ); - HRESULT GetInsertMode( long * pMode ); - [helpstring("method SetInsertMode")] - HRESULT SetInsertMode(long Mode); - [helpstring("method EnableTransitions")] - HRESULT EnableTransitions(BOOL fEnabled); - [helpstring("method TransitionsEnabled")] - HRESULT TransitionsEnabled(BOOL * pfEnabled); - [helpstring("method EnableEffects")] - HRESULT EnableEffects(BOOL fEnabled); - [helpstring("method EffectsEnabled")] - HRESULT EffectsEnabled(BOOL * pfEnabled); - [helpstring("method SetInterestRange")] - HRESULT SetInterestRange(REFERENCE_TIME Start, REFERENCE_TIME Stop); - [helpstring("method GetDuration")] - HRESULT GetDuration(REFERENCE_TIME * pDuration); - [helpstring("method GetDuration2")] - HRESULT GetDuration2(double * pDuration); - [helpstring("method SetDefaultFPS")] - HRESULT SetDefaultFPS(double FPS); - [helpstring("method GetDefaultFPS")] - HRESULT GetDefaultFPS(double * pFPS); - [helpstring("method IsDirty")] - HRESULT IsDirty(BOOL * pDirty); - [helpstring("method GetDirtyRange")] - HRESULT GetDirtyRange(REFERENCE_TIME * pStart, REFERENCE_TIME * pStop); - [helpstring("method GetCountOfType")] - HRESULT GetCountOfType(long Group, long * pVal, long * pValWithComps, TIMELINE_MAJOR_TYPE MajorType ); - HRESULT ValidateSourceNames( long ValidateFlags, IMediaLocator * pOverride, LONG_PTR NotifyEventHandle ); - - HRESULT SetDefaultTransition( GUID * pGuid ); - HRESULT GetDefaultTransition( GUID * pGuid ); - HRESULT SetDefaultEffect( GUID * pGuid ); - HRESULT GetDefaultEffect( GUID * pGuid ); - HRESULT SetDefaultTransitionB( BSTR pGuid ); - HRESULT GetDefaultTransitionB( [out,retval] BSTR * pGuid ); - HRESULT SetDefaultEffectB( BSTR pGuid ); - HRESULT GetDefaultEffectB( [out,retval] BSTR * pGuid ); -}; - -//////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////// -// XML STUFF --- XML STUFF --- XML STUFF --- XML STUFF --- XML -//////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////// - -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// Xml2Dex - converts back and forth between XML and a dexter project -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -[ - object, - uuid(18C628ED-962A-11D2-8D08-00A0C9441E20), - odl, - helpstring("IXml2Dex Interface"), - pointer_default(unique) -] -interface IXml2Dex : IDispatch -{ - [id(1), helpstring("method CreateGraphFromFile")] - HRESULT CreateGraphFromFile([out] IUnknown ** ppGraph, IUnknown * pTimeline, BSTR Filename); - [id(2), helpstring("method WriteGrfFile")] - HRESULT WriteGrfFile(IUnknown * pGraph, BSTR FileName); - [id(3), helpstring("method WriteXMLFile")] - HRESULT WriteXMLFile(IUnknown * pTimeline, BSTR FileName); - [id(5), helpstring("method ReadXMLFile")] - HRESULT ReadXMLFile(IUnknown *pTimeline, BSTR XMLName); - [id(6), helpstring("method Delete")] - HRESULT Delete(IUnknown *pTimeline, double dStart, double dEnd); - [id(7), helpstring("method WriteXMLPart")] - HRESULT WriteXMLPart(IUnknown * pTimeline, double dStart, double dEnd, BSTR FileName); - [id(8), helpstring("method PasteXMLFile")] - HRESULT PasteXMLFile(IUnknown * pTimeline, double dStart, BSTR FileName); - [id(9), helpstring("method CopyXML")] - HRESULT CopyXML(IUnknown * pTimeline, double dStart, double dEnd); - [id(10), helpstring("method PasteXML")] - HRESULT PasteXML(IUnknown * pTimeline, double dStart); - [id(11), helpstring("method Reset")] - HRESULT Reset( ); - [id(12), helpstring("method ReadXML")] - HRESULT ReadXML(IUnknown *pTimeline, IUnknown *pXML); - [id(13), helpstring("method WriteXML")] - HRESULT WriteXML(IUnknown *pTimeline, BSTR *pbstrXML); -}; - -//////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////// -// USEFUL HELPER INTERFACES -//////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////// - -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// IAMErrorLog - an interface that receives error information from -// a timeline or a render engine. -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -[ - object, - uuid(E43E73A2-0EFA-11d3-9601-00A0C9441E20), - odl, - helpstring("IAMErrorLog Interface"), - pointer_default(unique) -] -interface IAMErrorLog : IUnknown -{ - [helpstring("method LogError")] HRESULT LogError(long Severity, BSTR pErrorString, long ErrorCode, long hresult, [in] VARIANT * pExtraInfo ); -}; - -[ - object, - uuid(963566DA-BE21-4eaf-88E9-35704F8F52A1), - odl, - helpstring("IAMSetErrorLog Interface"), - pointer_default(unique) -] -interface IAMSetErrorLog : IUnknown -{ - [propget, helpstring("property ErrorLog")] HRESULT ErrorLog([out, retval] IAMErrorLog * *pVal); - [propput, helpstring("property ErrorLog")] HRESULT ErrorLog([in] IAMErrorLog * newVal); -}; - -[ - object, - uuid(0579154A-2B53-4994-B0D0-E773148EFF85), - local, - helpstring("ISampleGrabberCB Interface"), - pointer_default(unique) -] -interface ISampleGrabberCB : IUnknown -{ - HRESULT SampleCB( double SampleTime, IMediaSample * pSample ); - HRESULT BufferCB( double SampleTime, BYTE * pBuffer, long BufferLen ); -} - -[ - object, - uuid(6B652FFF-11FE-4fce-92AD-0266B5D7C78F), - local, - helpstring("ISampleGrabber Interface"), - pointer_default(unique) -] -interface ISampleGrabber: IUnknown -{ - // set this to have the filter immediate stop after - // garnishing a sample - // - HRESULT SetOneShot( BOOL OneShot ); - - // set what media type we connect to. It can be partially - // specified by setting only the major type, OR the major and - // subtype, OR major, subtype, and the formattype. - // - HRESULT SetMediaType( const AM_MEDIA_TYPE * pType ); - - // after something's connected to this filter, find out - // what it is - // - HRESULT GetConnectedMediaType( AM_MEDIA_TYPE * pType ); - - // call this to buffer incoming samples, so the next two methods will work - // If this is not called, the next two methods will return - // E_INVALIDARG - // - HRESULT SetBufferSamples( BOOL BufferThem ); - - // pass in NULL for pBuffer to get out the buffer size you need to - // allocate. This will NOT return a pointer to a compressed dib - // any longer! It will return the IMediaSample's GetPointer buffer. - // - HRESULT GetCurrentBuffer( [in,out] long * pBufferSize, [out] long * pBuffer ); - - // return the currently buffered sample - // - HRESULT GetCurrentSample( [out,retval] IMediaSample ** ppSample ); - - // if this callback is set, then it will be called for - // every sample passing through the filter. Do not take a long time - // in the callback for smooth playback (obviously!) - // - HRESULT SetCallback( ISampleGrabberCB * pCallback, long WhichMethodToCallback ); -}; - -//////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////// -// THE LIBRARY ITSELF -//////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////// - -[ - uuid(78530B68-61F9-11D2-8CAD-00A024580902), - version(1.0), - helpstring("Dexter 1.0 Type Library") -] -library DexterLib -{ - importlib("stdole32.tlb"); - importlib("stdole2.tlb"); - - [ - uuid(78530B75-61F9-11D2-8CAD-00A024580902), - helpstring("AMTimeline Class") - ] - coclass AMTimeline - { - [default] interface IAMTimeline; - interface IPersistStream; - interface IAMSetErrorLog; - }; - - [ - uuid(78530B78-61F9-11D2-8CAD-00A024580902), - helpstring("IAMTimelineObj Class") - ] - coclass AMTimelineObj - { - [default] interface IAMTimelineObj; - }; - - [ - uuid(78530B7A-61F9-11D2-8CAD-00A024580902), - helpstring("IAMTimelineSrc Class") - ] - coclass AMTimelineSrc - { - [default] interface IAMTimelineSrc; - interface IAMTimelineObj; - interface IAMTimelineEffectable; - interface IAMTimelineSplittable; - }; - - [ - uuid(8F6C3C50-897B-11d2-8CFB-00A0C9441E20), - ] - coclass AMTimelineTrack - { - [default] interface IAMTimelineTrack; - interface IAMTimelineObj; - interface IAMTimelineEffectable; - interface IAMTimelineTransable; - interface IAMTimelineVirtualTrack; - interface IAMTimelineSplittable; - }; - - [ - uuid(74D2EC80-6233-11d2-8CAD-00A024580902), - ] - coclass AMTimelineComp - { - [default] interface IAMTimelineComp; - interface IAMTimelineObj; - interface IAMTimelineEffectable; - interface IAMTimelineTransable; - interface IAMTimelineVirtualTrack; - }; - - [ - uuid(F6D371E1-B8A6-11d2-8023-00C0DF10D434), - ] - coclass AMTimelineGroup - { - [default] interface IAMTimelineGroup; - interface IAMTimelineComp; - interface IAMTimelineObj; - }; - - [ - uuid(74D2EC81-6233-11d2-8CAD-00A024580902), - ] - coclass AMTimelineTrans - { - [default] interface IAMTimelineTrans; - interface IAMTimelineObj; - interface IAMTimelineSplittable; - }; - - [ - uuid(74D2EC82-6233-11d2-8CAD-00A024580902), - ] - coclass AMTimelineEffect - { - [default] interface IAMTimelineEffect; - interface IAMTimelineObj; - interface IAMTimelineSplittable; - interface IPropertyBag; - }; - - [ - uuid(64D8A8E0-80A2-11d2-8CF3-00A0C9441E20), - ] - coclass RenderEngine - { - [default] interface IRenderEngine; - interface IAMSetErrorLog; - }; - - [ - uuid(498B0949-BBE9-4072-98BE-6CCAEB79DC6F), - ] - coclass SmartRenderEngine - { - [default] interface IRenderEngine; - interface ISmartRenderEngine; - interface IAMSetErrorLog; - }; - - [ - uuid(036A9790-C153-11d2-9EF7-006008039E37), - ] - coclass AudMixer - { - [default] interface IBaseFilter; - }; - - [ - uuid(18C628EE-962A-11D2-8D08-00A0C9441E20), - helpstring("Xml2Dex Class") - ] - coclass Xml2Dex - { - [default] interface IXml2Dex; - }; - - [ - uuid(CC1101F2-79DC-11D2-8CE6-00A0C9441E20), - helpstring("MediaLocator Class") - ] - coclass MediaLocator - { - [default] interface IMediaLocator; - }; - - [ - uuid(ADF95821-DED7-11d2-ACBE-0080C75E246E), - helpstring("Varying Property Holder") - ] - coclass PropertySetter - { - [default] interface IPropertySetter; - interface IAMSetErrorLog; - }; - - [ - uuid(65BD0711-24D2-4ff7-9324-ED2E5D3ABAFA), - helpstring("MediaDet Class") - ] - coclass MediaDet - { - [default] interface IMediaDet; - }; - - [ - uuid(C1F400A0-3F08-11d3-9F0B-006008039E37), - helpstring("MsGrab Class") - ] - coclass SampleGrabber - { - [default] interface ISampleGrabber; - }; - - // useful for movie maker and other people - [ - uuid(C1F400A4-3F08-11d3-9F0B-006008039E37), - helpstring("NullRenderer Class") - ] - coclass NullRenderer - { - [default] interface IBaseFilter; - }; - - [ - uuid(BB44391D-6ABD-422f-9E2E-385C9DFF51FC), - helpstring("DxtCompositor Class") - ] - coclass DxtCompositor - { - [default] interface IDxtCompositor; - }; - - [ - uuid(506D89AE-909A-44f7-9444-ABD575896E35), - helpstring("DxtAlphaSetter Class") - ] - coclass DxtAlphaSetter - { - [default] interface IDxtAlphaSetter; - }; - - [ - uuid(DE75D012-7A65-11D2-8CEA-00A0C9441E20), - helpstring("SMPTE wipe DXT") - ] - coclass DxtJpeg - { - [default] interface IDxtJpeg; - }; - - [ - uuid(0cfdd070-581a-11d2-9ee6-006008039e37), - ] - coclass ColorSource - { - [default] interface IBaseFilter; - }; - - [ - uuid(C5B19592-145E-11d3-9F04-006008039E37), - helpstring("DxtKey Class") - ] - coclass DxtKey - { - [default] interface IDxtKey; - }; -}; - -// these are some error codes that we can/will return -enum -{ - E_NOTINTREE = 0x80040400, - E_RENDER_ENGINE_IS_BROKEN = 0x80040401, - E_MUST_INIT_RENDERER = 0x80040402, - E_NOTDETERMINED = 0x80040403, - E_NO_TIMELINE = 0x80040404, - S_WARN_OUTPUTRESET = 40404 -}; - -// These codes are given to the app in IAMErrorLog to help identify what went wrong - -// Filename doesn't exist, or DShow doesn't recognize the filetype -// EXTRA - filename -cpp_quote("#define DEX_IDS_BAD_SOURCE_NAME 1400") - -// Filename doesn't exist or contains unknown data -// EXTRA - filename (maybe no codec?) -cpp_quote("#define DEX_IDS_BAD_SOURCE_NAME2 1401") - -// filename was required, but wasn't given -cpp_quote("#define DEX_IDS_MISSING_SOURCE_NAME 1402") - -// cannot parse data provided by this source -// !!! what source? -cpp_quote("#define DEX_IDS_UNKNOWN_SOURCE 1403") - -// unexpected error - some DShow component not installed correctly -cpp_quote("#define DEX_IDS_INSTALL_PROBLEM 1404") - -// Source filter does not accept filenames -// !!! What source? -cpp_quote("#define DEX_IDS_NO_SOURCE_NAMES 1405") - -// The group's mediatype is not supported -// EXTRA - gives you an integer group number -cpp_quote("#define DEX_IDS_BAD_MEDIATYPE 1406") - -// Invalid stream number for a source -// EXTRA - gives the stream number !!! should identify which source! -cpp_quote("#define DEX_IDS_STREAM_NUMBER 1407") - -// You ran out of memory -cpp_quote("#define DEX_IDS_OUTOFMEMORY 1408") - -// One bitmap in a sequence was not the same type as the others -// EXTRA - gives the bitmap name -cpp_quote("#define DEX_IDS_DIBSEQ_NOTALLSAME 1409") - -// Clip's mediatimes are invalid, or DibSeq too short, or a previous error caused this -// !!! Needs to give the clip name -cpp_quote("#define DEX_IDS_CLIPTOOSHORT 1410") - -// Clsid of FX/Transition is not a DirectX Transform -// EXTRA - gives the CLSID -cpp_quote("#define DEX_IDS_INVALID_DXT 1411") - -// Default FX/Transition Clsid is not a DirectX Transform" -// EXTRA - gives the CLSID -cpp_quote("#define DEX_IDS_INVALID_DEFAULT_DXT 1412") - -// Your version of DX doesn't support 3D transforms" -// EXTRA - gives the CLSID of the 3D transform you tried to use -cpp_quote("#define DEX_IDS_NO_3D 1413") - -// This DirectX Transform is not the right kind, or is broken -// EXTRA - gives the CLSID of the broken transform -cpp_quote("#define DEX_IDS_BROKEN_DXT 1414") - -// No such property exists on an object -// EXTRA - gives the name of the property (if given as a string) -cpp_quote("#define DEX_IDS_NO_SUCH_PROPERTY 1415") - -// Illegal value for a property -// EXTRA - gives the VARIANT value that was illegal -cpp_quote("#define DEX_IDS_ILLEGAL_PROPERTY_VAL 1416") - -// Syntax error in XML file at line: -// EXTRA - gives I4 line number, if available -cpp_quote("#define DEX_IDS_INVALID_XML 1417") - -// Can't find filter specified in XML by Category and Instance -// EXTRA - gives friendly name (instance) -cpp_quote("#define DEX_IDS_CANT_FIND_FILTER 1418") - -// Disk error writing XML file -cpp_quote("#define DEX_IDS_DISK_WRITE_ERROR 1419") - -// Clsid not a valid DShow audio effect filter -// EXTRA - gives the CLSID -cpp_quote("#define DEX_IDS_INVALID_AUDIO_FX 1420") - -// Cannot find compressor for smart recompression type -cpp_quote("#define DEX_IDS_CANT_FIND_COMPRESSOR 1421") - - - -// !!! Here go problems hooking up sources or finding codecs - - -// THE FOLLOWING SHOULD NEVER HAPPEN - please email directx@microsoft.com if they do - -// Unexpected error in parsing the timeline -cpp_quote("#define DEX_IDS_TIMELINE_PARSE 1426") -// Unexpected error building the filtergraph -cpp_quote("#define DEX_IDS_GRAPH_ERROR 1427") -// Unexpected error with the internal grid -cpp_quote("#define DEX_IDS_GRID_ERROR 1428") -// Unexpected error getting an interface -cpp_quote("#define DEX_IDS_INTERFACE_ERROR 1429") - -// these are the enumeration categories for effects -// -cpp_quote("EXTERN_GUID(CLSID_VideoEffects1Category, 0xcc7bfb42, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59);") -cpp_quote("EXTERN_GUID(CLSID_VideoEffects2Category, 0xcc7bfb43, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59);") -cpp_quote("EXTERN_GUID(CLSID_AudioEffects1Category, 0xcc7bfb44, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59);") -cpp_quote("EXTERN_GUID(CLSID_AudioEffects2Category, 0xcc7bfb45, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59);") - diff --git a/import/DirectX8/include/DShowIDL/regbag.idl b/import/DirectX8/include/DShowIDL/regbag.idl deleted file mode 100644 index 133ee81bf..000000000 --- a/import/DirectX8/include/DShowIDL/regbag.idl +++ /dev/null @@ -1,52 +0,0 @@ -//------------------------------------------------------------------------------ -// File: RegBag.idl -// -// Desc: IDL source for RegBag.dll. -// -// Copyright (c) 1999-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -cpp_quote("//+-------------------------------------------------------------------------") -cpp_quote("//") -cpp_quote("// Microsoft Windows") -cpp_quote("// Copyright (C) Microsoft Corporation, 1999-2001.") -cpp_quote("//") -cpp_quote("//--------------------------------------------------------------------------") -cpp_quote("#pragma once") - -#ifndef DO_NO_IMPORTS -import "objidl.idl"; -import "oaidl.idl"; -import "ocidl.idl"; -#endif - -//***************************************************************************** -/////////////////////////////////////////////////////////////////////////////// -// -// Custom Factory interface -// since com doesn't support ctors or initialization parameters on std factory interface -// we have a custom creation interface -// -/////////////////////////////////////////////////////////////////////////////// -//***************************************************************************** -/////////////////////////////////////////////////////////////////////////////////////// -[object, - hidden, restricted, - uuid(8A674B48-1F63-11d3-B64C-00C04F79498E), - helpstring("Create property bag backed by registry"), - pointer_default(unique), - local -] -interface ICreatePropBagOnRegKey : IUnknown { - // NOTE: it is up to the caller to set the correct registry access based on the interface - // and methods the caller intends to use - // IPropertyBag2::GetPropertyInfo and CountProperties require both KEY_QUERY_VALUE and KEY_ENUMERATE_SUBKEYS - // IPropertyBagXXX::Read requires KEY_READ - // IPropertyBagXXX::Write requires KEY_WRITE - // also, you must CoTaskMemFree the name string from GetPropertyInfo - // if you write a value of VT_EMPTY or VT_NULL the property will be removed from the bag and the corresponding - // registry info will be deleted. - HRESULT Create([in] HKEY hkey, [in] LPCOLESTR subkey, [in] DWORD ulOptions, [in] DWORD samDesired, REFIID iid, [out] LPVOID *ppBag); -}; - diff --git a/import/DirectX8/include/DShowIDL/strmif.idl b/import/DirectX8/include/DShowIDL/strmif.idl deleted file mode 100644 index 5ea1dd0ec..000000000 --- a/import/DirectX8/include/DShowIDL/strmif.idl +++ /dev/null @@ -1,56 +0,0 @@ -//------------------------------------------------------------------------------ -// File: StrmIf.idl -// -// Desc: ActiveMovie interface definitions. -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - -// -// Temporarily disable the /W4 compiler warning C4201, which will be -// reported by all apps which include streams.h or dshow.h, which both -// include the strmif.h generated by this IDL file. -// -cpp_quote("//+-------------------------------------------------------------------------") -cpp_quote("//") -cpp_quote("// Copyright (C) Microsoft Corporation, 1999-2001.") -cpp_quote("//") -cpp_quote("//--------------------------------------------------------------------------") -cpp_quote("// Disable /W4 compiler warning C4201: nameless struct/union") -cpp_quote("#pragma warning(disable:4201) // Disable C4201: nameless struct/union") -cpp_quote(" ") // Blank space - -import "unknwn.idl"; -import "objidl.idl"; // for IPersist (IFilter's root) - -#include "devenum.idl" - -// Core interfaces -#include "axcore.idl" - -// Extended, ActiveMovie-only interfaces -#include "axextend.idl" - -#if (WINVER < 0x501) - #include "IAMovie.idl" -#endif - -// Application interfaces for DVD -#include "dvdif.idl" - -// Dynamic graph stuff -#include "dyngraph.idl" - -// This include is only valid when building for Windows XP -#if (WINVER >= 0x501) - - // Video Mixing Renderer - #include "VMRender.idl" - -#endif - -// -// Restore the previous setting for C4201 compiler warning -// -cpp_quote("// Restore the previous setting for C4201 compiler warning") -cpp_quote("#pragma warning(default:4201)") diff --git a/import/DirectX8/include/DShowIDL/tuner.idl b/import/DirectX8/include/DShowIDL/tuner.idl deleted file mode 100644 index 645546cd2..000000000 --- a/import/DirectX8/include/DShowIDL/tuner.idl +++ /dev/null @@ -1,4225 +0,0 @@ -//------------------------------------------------------------------------------ -// File: Tuner.idl -// -// Desc: -// -// Copyright (c) 1999-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -cpp_quote("//+-------------------------------------------------------------------------") -cpp_quote("//") -cpp_quote("// Microsoft Windows") -cpp_quote("// Copyright (C) Microsoft Corporation, 1999-2001.") -cpp_quote("//") -cpp_quote("//--------------------------------------------------------------------------") -cpp_quote("#pragma once") - -#include -#ifndef DO_NO_IMPORTS -import "oaidl.idl"; -import "comcat.idl"; -import "strmif.idl"; -import "bdatypes.h"; -import "regbag.idl"; -#endif - -cpp_quote("#include ") - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// Separate the updated Windows XP version of this header from the downlevel -// version that shipped with the DirectX 8.0 SDK. Since development -// on BDA technology continued for Windows XP, some changes were made to -// this file in order to improve the interface and functionality. -// -// To maintain compatibility with older applications which rely on the -// DirectX 8.0 versions of these files, the DirectX 8.1 version includes -// both the Windows XP content and the DirectX 8.0 content, which are -// separated by the #if (WINVER >= 0x501) preprocessor directive. -// -// Therefore, if you define WINVER to be 0x501 to specify Windows XP, -// the revised content will be compiled. Otherwise, the original -// DirectX 8.0 content will be used. -// -///////////////////////////////////////////////////////////////////////////// - -#if (WINVER >= 0x501) // Windows XP content - - -interface ITuningSpaceContainer; -interface ITuningSpace; -interface IEnumTuningSpaces; -interface ITuneRequest; -interface ITuner; -interface IScanningTuner; -interface IEnumComponentTypes; -interface IComponentTypes; -interface IComponentType; -interface ILanguageComponentType; -interface IEnumComponents; -interface IComponents; -interface IComponent; -interface IMPEG2ComponentType; -interface IMPEG2Component; -interface ILocator; -interface IATSCLocator; -interface IDVBSLocator; -interface IDVBTLocator; - -// tuner.idl: -// interface ITuningSpaceContainer : IDispatch -// interface ITuningSpace : IDispatch -// interface ITuneRequest : IDispatch -// interface IComponentType : IDispatch -// interface ILanguageComponentType : IComponentType -// interface IComponentTypes : IDispatch -// interface IComponent : IDispatch -// interface IComponents : IDispatch -// interface ITVTuningSpace : ITuningSpace -// interface IFMRadioTuningSpace : ITuningSpace -// interface IAMRadioTuningSpace : ITuningSpace -// interface IAnalogTVTuningSpace : ITVTuningSpace -// interface IAnalogTVAudioComponent : IComponent -// interface IAnalogTVDataComponent : IComponent -// interface IChannelTuneRequest : ITuneRequest -// interface IDVBComponent : IComponent -// interface IDVBTuneRequest : ITuneRequest - -// DISPIDs for ITuningSpaces interface -// we don't expect to inherit from this interface and consequently there's -// no chance of collision, thus we'll allow midl to auto assign ids for this one - -// DISPIDs for ITuningSpace interface -enum { -DISPID_TUNER_TS_UNIQUENAME = 1, -DISPID_TUNER_TS_FRIENDLYNAME = 2, -DISPID_TUNER_TS_CLSID = 3, -DISPID_TUNER_TS_NETWORKTYPE = 4, -DISPID_TUNER_TS__NETWORKTYPE = 5, -DISPID_TUNER_TS_CREATETUNEREQUEST = 6, -DISPID_TUNER_TS_ENUMCATEGORYGUIDS = 7, -DISPID_TUNER_TS_ENUMDEVICEMONIKERS = 8, -DISPID_TUNER_TS_DEFAULTPREFERREDCOMPONENTTYPES = 9, -DISPID_TUNER_TS_FREQMAP = 10, -DISPID_TUNER_TS_DEFLOCATOR = 11, -DISPID_TUNER_TS_CLONE = 12, - -// DISPIDs for ITuneRequest interface -DISPID_TUNER_TR_TUNINGSPACE = 1, -DISPID_TUNER_TR_COMPONENTS = 2, -DISPID_TUNER_TR_CLONE = 3, -DISPID_TUNER_TR_LOCATOR = 4, - - -// DISPID for IComponentType interface -DISPID_TUNER_CT_CATEGORY = 1, -DISPID_TUNER_CT_MEDIAMAJORTYPE = 2, -DISPID_TUNER_CT__MEDIAMAJORTYPE = 3, -DISPID_TUNER_CT_MEDIASUBTYPE = 4, -DISPID_TUNER_CT__MEDIASUBTYPE = 5, -DISPID_TUNER_CT_MEDIAFORMATTYPE = 6, -DISPID_TUNER_CT__MEDIAFORMATTYPE = 7, -DISPID_TUNER_CT_MEDIATYPE = 8, -DISPID_TUNER_CT_CLONE = 9, - - -// DISPID for ILanguageComponentType interface -DISPID_TUNER_LCT_LANGID = 100, - -// DISPID for IMPEG2ComponentType interface -DISPID_TUNER_MP2CT_TYPE = 200, - -// DISPID for IATSCComponentType interface -DISPID_TUNER_ATSCCT_FLAGS = 300, - -// DISPID for ILocator interface -DISPID_TUNER_L_CARRFREQ = 1, -DISPID_TUNER_L_INNERFECMETHOD = 2, -DISPID_TUNER_L_INNERFECRATE = 3, -DISPID_TUNER_L_OUTERFECMETHOD = 4, -DISPID_TUNER_L_OUTERFECRATE = 5, -DISPID_TUNER_L_MOD = 6, -DISPID_TUNER_L_SYMRATE = 7, -DISPID_TUNER_L_CLONE = 8, - -// DISPID for IATSCLocator interface -DISPID_TUNER_L_ATSC_PHYS_CHANNEL = 201, -DISPID_TUNER_L_ATSC_TSID = 202, - -// DISPID for IDVBTLocator interface -DISPID_TUNER_L_DVBT_BANDWIDTH = 301, -DISPID_TUNER_L_DVBT_LPINNERFECMETHOD = 302, -DISPID_TUNER_L_DVBT_LPINNERFECRATE = 303, -DISPID_TUNER_L_DVBT_GUARDINTERVAL = 304, -DISPID_TUNER_L_DVBT_HALPHA = 305, -DISPID_TUNER_L_DVBT_TRANSMISSIONMODE = 306, -DISPID_TUNER_L_DVBT_INUSE = 307, - -// DISPID for IDVBSLocator interface -DISPID_TUNER_L_DVBS_POLARISATION = 401, -DISPID_TUNER_L_DVBS_WEST = 402, -DISPID_TUNER_L_DVBS_ORBITAL = 403, -DISPID_TUNER_L_DVBS_AZIMUTH = 404, -DISPID_TUNER_L_DVBS_ELEVATION = 405, - -// DISPID for IDVBCLocator interface - -// DISPIDs for IComponent interface -DISPID_TUNER_C_TYPE = 1, -DISPID_TUNER_C_STATUS = 2, -DISPID_TUNER_C_LANGID = 3, -DISPID_TUNER_C_DESCRIPTION = 4, -DISPID_TUNER_C_CLONE = 5, - -// DISPIDs for IMPEG2Component interface -DISPID_TUNER_C_MP2_PID = 101, -DISPID_TUNER_C_MP2_PCRPID = 102, -DISPID_TUNER_C_MP2_PROGNO = 103, - -// DISPIDs for IDVBTuningSpace interface -DISPID_TUNER_TS_DVB_SYSTEMTYPE = 101, -// DISPIDs for IDVBTuningSpace2 interface -DISPID_TUNER_TS_DVB2_NETWORK_ID = 102, -// DISPIDs for IDVBSTuningSpace interface -DISPID_TUNER_TS_DVBS_LOW_OSC_FREQ = 1001, -DISPID_TUNER_TS_DVBS_HI_OSC_FREQ = 1002, -DISPID_TUNER_TS_DVBS_LNB_SWITCH_FREQ = 1003, -DISPID_TUNER_TS_DVBS_INPUT_RANGE = 1004, -DISPID_TUNER_TS_DVBS_SPECTRAL_INVERSION = 1005, - -// DISPIDs for IAnalogRadioTuningSpace interface -DISPID_TUNER_TS_AR_MINFREQUENCY = 101, -DISPID_TUNER_TS_AR_MAXFREQUENCY = 102, -DISPID_TUNER_TS_AR_STEP = 103, - -// DISPIDs for IAnalogTVTuningSpace interface -DISPID_TUNER_TS_ATV_MINCHANNEL = 101, -DISPID_TUNER_TS_ATV_MAXCHANNEL = 102, -DISPID_TUNER_TS_ATV_INPUTTYPE = 103, -DISPID_TUNER_TS_ATV_COUNTRYCODE = 104, - -// DISPIDs for IATSCTuningSpace interface -DISPID_TUNER_TS_ATSC_MINMINORCHANNEL = 201, -DISPID_TUNER_TS_ATSC_MAXMINORCHANNEL = 202, -DISPID_TUNER_TS_ATSC_MINPHYSCHANNEL = 203, -DISPID_TUNER_TS_ATSC_MAXPHYSCHANNEL = 204, - -// DISPID for IAnalogTVAudioComponent interface -DISPID_CHTUNER_ATVAC_CHANNEL = 101, - -// DISPIDs for IAnalogTVDataComponent interface -DISPID_CHTUNER_ATVDC_SYSTEM = 101, -DISPID_CHTUNER_ATVDC_CONTENT = 102, - -// DISPID for IChannelTuneRequest interface -DISPID_CHTUNER_CTR_CHANNEL = 101, - -// DISPID IATSCChannelTuneRequest -DISPID_CHTUNER_ACTR_MINOR_CHANNEL = 201, - -// DISPIDs for IDVBComponent interface -DISPID_DVBTUNER_DVBC_ATTRIBUTESVALID = 101, -DISPID_DVBTUNER_DVBC_PID = 102, -DISPID_DVBTUNER_DVBC_TAG = 103, -DISPID_DVBTUNER_DVBC_COMPONENTTYPE = 104, - -// DISPIDs for IDVBTuneRequest interface -DISPID_DVBTUNER_ONID = 101, -DISPID_DVBTUNER_TSID = 102, -DISPID_DVBTUNER_SID = 103, - -// DISPIDs for IMPEG2TuneRequest interface -DISPID_MP2TUNER_TSID = 101, -DISPID_MP2TUNER_PROGNO = 102, - -// DISPIDs for IMPEG2TuneRequestFactory interface -DISPID_MP2TUNERFACTORY_CREATETUNEREQUEST = 1, - -}; - - -////////////////////////////////////////////////////////////////////////////////////// -// Tuning Space Container -////////////////////////////////////////////////////////////////////////////////////// -// simple read-only collection of tuning spaces for enumerating subsets of the total -// set of system tuning spaces - [ - object, - uuid(901284E4-33FE-4b69-8D63-634A596F3756), - dual, - oleautomation, - nonextensible, - helpstring("Tuning Space Collection Interface"), - pointer_default(unique) - ] - interface ITuningSpaces : IDispatch - { - - [propget, helpstring("Number of items in the collection")] - HRESULT Count( - [out, retval] long *Count - ); - - [propget, id(DISPID_NEWENUM), hidden, restricted] - HRESULT _NewEnum( - [out, retval] IEnumVARIANT** NewEnum - ); - - [id(DISPID_VALUE), - propget, - helpstring("Find the Tuning Space with the specified Index")] - HRESULT Item( - [in] VARIANT varIndex, - [out, retval] ITuningSpace** TuningSpace - ); - - [propget, hidden, restricted, - helpstring("convenience function so C++ apps don't have to unpack VARIANT")] - HRESULT EnumTuningSpaces( - [out, retval] IEnumTuningSpaces** NewEnum - ); - - } - -////////////////////////////////////////////////////////////////////////////////////// -// Tuning Space Container -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - uuid(5B692E84-E2F1-11d2-9493-00C04F72D980), - dual, - oleautomation, - hidden, - nonextensible, - helpstring("Tuning Space Container Interface"), - pointer_default(unique) - ] - interface ITuningSpaceContainer : IDispatch - { - - [propget, helpstring("Number of items in the collection")] - HRESULT Count( - [out, retval] long *Count - ); - - [propget, id(DISPID_NEWENUM), hidden, restricted] - HRESULT _NewEnum( - [out, retval] IEnumVARIANT** NewEnum - ); - - [id(DISPID_VALUE), - propget, - helpstring("Find the Tuning Space with the specified Index")] - HRESULT Item( - [in] VARIANT varIndex, - [out, retval] ITuningSpace** TuningSpace - ); - [id(DISPID_VALUE), - propput, - helpstring("Change the Tuning Space with the specified Index")] - HRESULT Item([in] VARIANT varIndex, [in] ITuningSpace *TuningSpace); - - [helpstring("Returns the collection of Tuning Spaces with the same implementation")] - HRESULT TuningSpacesForCLSID( - [in] BSTR SpaceCLSID, - [out, retval] ITuningSpaces** NewColl - ); - - [hidden, restricted, - helpstring("Convenience Function for enumerating from C")] - HRESULT _TuningSpacesForCLSID( - [in] REFCLSID SpaceCLSID, - [out, retval] ITuningSpaces** NewColl - ); - - [helpstring("Returns the collection of Tuning Spaces matching the name")] - HRESULT TuningSpacesForName( - [in] BSTR Name, - [out, retval] ITuningSpaces** NewColl - ); - - [helpstring("Find Local ID Number of the specified Tuning Space")] - HRESULT FindID( - [in] ITuningSpace *TuningSpace, - [out, retval] long *ID - ); - - - [id(DISPID_ADDITEM), - helpstring("Add a new Tuning Space to the collection. This tuning space will be persisted unless removed")] - HRESULT Add( - [in] ITuningSpace* TuningSpace, - [out, retval] VARIANT* NewIndex - ); - - [propget, hidden, restricted, helpstring("Convenience Function for enumerating collection from C")] - HRESULT EnumTuningSpaces( - [out, retval] IEnumTuningSpaces **ppEnum - ); - - [id(DISPID_REMOVEITEM), - helpstring("Remove a Tuning Space from the collection. this tuning space will be deleted from the registry")] - HRESULT Remove( - [in] VARIANT Index - ); - - [propget, helpstring("Maximum number of items allowed in the collection")] - HRESULT MaxCount( - [out, retval] long *MaxCount - ); - - // we don't allow script to set this, but we do allow c code to change it. - [propput, hidden, restricted, helpstring("Maximum number of items allowed in the collection")] - HRESULT MaxCount( - [in] long MaxCount - ); - - } - -////////////////////////////////////////////////////////////////////////////////////// -// Tuning Space Interfaces -////////////////////////////////////////////////////////////////////////////////////// - -// note: the network type is the clsid of the tuning space implementation - [ - object, - uuid(061C6E30-E622-11d2-9493-00C04F72D980), - dual, - oleautomation, - nonextensible, - helpstring("Tuning Space Interface"), - pointer_default(unique) - ] - interface ITuningSpace : IDispatch - { - [propget, id(DISPID_TUNER_TS_UNIQUENAME), - helpstring("Unique name of the Tuning Space")] - HRESULT UniqueName( - [out, retval] BSTR *Name - ); - - [propput, id(DISPID_TUNER_TS_UNIQUENAME), - helpstring("Unique name of the Tuning Space")] - HRESULT UniqueName( - [in] BSTR Name - ); - - [propget, id(DISPID_TUNER_TS_FRIENDLYNAME), - helpstring("User-friendly name of the Tuning Space")] - HRESULT FriendlyName( - [out, retval] BSTR *Name - ); - - [propput, id(DISPID_TUNER_TS_FRIENDLYNAME), - helpstring("User-friendly name of the Tuning Space")] - HRESULT FriendlyName( - [in] BSTR Name - ); - - [propget, id(DISPID_TUNER_TS_CLSID), - helpstring("Returns the clsid of the tuning space implementation. provides script access to IPersist:GetClassID")] - HRESULT CLSID( - [out, retval] BSTR* SpaceCLSID - ); - - [propget, id(DISPID_TUNER_TS_NETWORKTYPE), - helpstring("Network Type (Network Proivder CLSID)")] - HRESULT NetworkType( - [out, retval] BSTR *NetworkTypeGuid - ); - [propput, id(DISPID_TUNER_TS_NETWORKTYPE), - helpstring("Network Type (Network Proivder CLSID)")] - HRESULT NetworkType( - [in] BSTR NetworkTypeGuid - ); - - [propget, id(DISPID_TUNER_TS__NETWORKTYPE), - helpstring("Network Type (Network Proivder CLSID)"), hidden, restricted] - HRESULT _NetworkType( - [out, retval] GUID* NetworkTypeGuid - ); - [propput, id(DISPID_TUNER_TS__NETWORKTYPE), - helpstring("Network Type (Network Proivder CLSID)"), hidden, restricted] - HRESULT _NetworkType( - [in] REFCLSID NetworkTypeGuid - ); - - // this method creates the "best" kind of tune request for this tuning space. - // the tuning space may support other kinds of tune requests created via - // other factory mechanisms(for example, see mpeg2tunerequestfactory). but, - // this method is the preferred way to get a tune request as it always returns - // the optimal type of tune request for this space. - [id(DISPID_TUNER_TS_CREATETUNEREQUEST), - helpstring("Create a Tune Request object")] - HRESULT CreateTuneRequest( - [out, retval] ITuneRequest **TuneRequest - ); - - [id(DISPID_TUNER_TS_ENUMCATEGORYGUIDS), hidden, restricted] - HRESULT EnumCategoryGUIDs( - [out, retval] IEnumGUID **ppEnum - ); - - [id(DISPID_TUNER_TS_ENUMDEVICEMONIKERS), hidden, restricted] - HRESULT EnumDeviceMonikers( - [out, retval] IEnumMoniker **ppEnum - ); - - [propget, id(DISPID_TUNER_TS_DEFAULTPREFERREDCOMPONENTTYPES)] - HRESULT DefaultPreferredComponentTypes( - [out, retval] IComponentTypes** ComponentTypes - ); - [propput, id(DISPID_TUNER_TS_DEFAULTPREFERREDCOMPONENTTYPES)] - HRESULT DefaultPreferredComponentTypes( - [in] IComponentTypes* NewComponentTypes - ); - - // the following property is for the network providers to store frequency/channel maps, frequency/transponder maps - // or whatever other mapping from carrier frequencies to frequency identifiers are appropriate for the tuning space - // in question. the bstr is treated as a binary blob. it is expected to contain embedded nulls, and it may be formatted - // internally in whatever fashion the network provider sees fit. - [propget, id(DISPID_TUNER_TS_FREQMAP), hidden, restricted] - HRESULT FrequencyMapping([out, retval] BSTR *pMapping); - [propput, id(DISPID_TUNER_TS_FREQMAP), hidden, restricted] - HRESULT FrequencyMapping(BSTR Mapping); - - // the following property provides a starting point for the initial IScanningTuner after installation - [propget, id(DISPID_TUNER_TS_DEFLOCATOR)] - HRESULT DefaultLocator([out, retval] ILocator **LocatorVal); - [propput, id(DISPID_TUNER_TS_DEFLOCATOR)] - HRESULT DefaultLocator([in]ILocator *LocatorVal); - - HRESULT Clone([out, retval] ITuningSpace **NewTS); - } - -////////////////////////////////////////////////////////////////////////////////////// - [ - hidden, - restricted, - object, - uuid(8B8EB248-FC2B-11d2-9D8C-00C04F72D980), - pointer_default(unique) - ] - interface IEnumTuningSpaces : IUnknown - { - HRESULT Next( - [in] ULONG celt, - [out, size_is(celt), length_is(*pceltFetched)] - ITuningSpace** rgelt, - [out] ULONG* pceltFetched - ); - - HRESULT Skip( - [in] ULONG celt - ); - - HRESULT Reset(void); - - HRESULT Clone( - [out] IEnumTuningSpaces** ppEnum - ); - } - -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(ADA0B268-3B19-4e5b-ACC4-49F852BE13BA), - pointer_default(unique) - ] - interface IDVBTuningSpace : ITuningSpace - { - [propget, id(DISPID_TUNER_TS_DVB_SYSTEMTYPE), - helpstring("Type of DVB System") - ] - HRESULT SystemType( - [out, retval] DVBSystemType *SysType - ); - [propput, id(DISPID_TUNER_TS_DVB_SYSTEMTYPE), - helpstring("Type of DVB System") - ] - HRESULT SystemType( - [in] DVBSystemType SysType - ); - - } - -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(843188B4-CE62-43db-966B-8145A094E040), - pointer_default(unique) - ] - interface IDVBTuningSpace2 : IDVBTuningSpace - { - [propget, id(DISPID_TUNER_TS_DVB2_NETWORK_ID), - helpstring("Network ID of DVB System") - ] - HRESULT NetworkID( - [out, retval] long *NetworkID - ); - [propput, id(DISPID_TUNER_TS_DVB2_NETWORK_ID), - helpstring("Network ID of DVB System") - ] - HRESULT NetworkID( - [in] long NetworkID - ); - - } - -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(CDF7BE60-D954-42fd-A972-78971958E470), - pointer_default(unique) - ] - interface IDVBSTuningSpace : IDVBTuningSpace2 - { - - [propget, id(DISPID_TUNER_TS_DVBS_LOW_OSC_FREQ), - helpstring("Low Oscillator Frequency of DVB System in 10HZ units") - ] - HRESULT LowOscillator( - [out, retval] long *LowOscillator - ); - [propput, id(DISPID_TUNER_TS_DVBS_LOW_OSC_FREQ), - helpstring("Low Oscillator Frequency of DVB System in 10HZ units") - ] - HRESULT LowOscillator( - [in] long LowOscillator - ); - [propget, id(DISPID_TUNER_TS_DVBS_HI_OSC_FREQ), - helpstring("High Oscillator Frequency of DVB System in 10HZ units") - ] - HRESULT HighOscillator( - [out, retval] long *HighOscillator - ); - [propput, id(DISPID_TUNER_TS_DVBS_HI_OSC_FREQ), - helpstring("High Oscillator Frequency of DVB System in 10HZ units") - ] - HRESULT HighOscillator( - [in] long HighOscillator - ); - [propget, id(DISPID_TUNER_TS_DVBS_LNB_SWITCH_FREQ), - helpstring("LNB Switch Frequency of DVB System in 10HZ units") - ] - HRESULT LNBSwitch( - [out, retval] long *LNBSwitch - ); - [propput, id(DISPID_TUNER_TS_DVBS_LNB_SWITCH_FREQ), - helpstring("LNB Switch Frequency of DVB System in 10HZ units") - ] - HRESULT LNBSwitch( - [in] long LNBSwitch - ); - [propget, id(DISPID_TUNER_TS_DVBS_INPUT_RANGE), - helpstring("Which Option/Switch contains the requested signal source") - ] - HRESULT InputRange( - [out, retval] BSTR *InputRange - ); - [propput, id(DISPID_TUNER_TS_DVBS_INPUT_RANGE), - helpstring("Which Option/Switch contains the requested signal source") - ] - HRESULT InputRange( - [in] BSTR InputRange - ); - [propget, id(DISPID_TUNER_TS_DVBS_SPECTRAL_INVERSION), - helpstring("Which Option/Switch contains the requested signal source") - ] - HRESULT SpectralInversion( - [out, retval] SpectralInversion *SpectralInversionVal - ); - [propput, id(DISPID_TUNER_TS_DVBS_SPECTRAL_INVERSION), - helpstring("Which Option/Switch contains the requested signal source") - ] - HRESULT SpectralInversion( - [in] SpectralInversion SpectralInversionVal - ); - - - } - - -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(2A6E293C-2595-11d3-B64C-00C04F79498E), - pointer_default(unique) - ] - interface IAnalogTVTuningSpace : ITuningSpace - { - [propget, id(DISPID_TUNER_TS_ATV_MINCHANNEL), - helpstring("Smallest channel number ever provided by this tuning space") - ] - HRESULT MinChannel( - [out, retval] long *MinChannelVal - ); - [propput, id(DISPID_TUNER_TS_ATV_MINCHANNEL), - helpstring("Smallest channel number ever provided by this tuning space") - ] - HRESULT MinChannel( - [in] long NewMinChannelVal - ); - [propget, id(DISPID_TUNER_TS_ATV_MAXCHANNEL), - helpstring("Largest channel number ever provided by this tuning space") - ] - HRESULT MaxChannel( - [out, retval] long *MaxChannelVal - ); - [propput, id(DISPID_TUNER_TS_ATV_MAXCHANNEL), - helpstring("Largest channel number ever provided by this tuning space") - ] - HRESULT MaxChannel( - [in] long NewMaxChannelVal - ); - [propget, id(DISPID_TUNER_TS_ATV_INPUTTYPE), - helpstring("Input type for this tuning space") - ] - HRESULT InputType([out, retval] TunerInputType *InputTypeVal); - [propput, id(DISPID_TUNER_TS_ATV_INPUTTYPE), - helpstring("Input type for this tuning space") - ] - HRESULT InputType([in] TunerInputType NewInputTypeVal); - [propget, id(DISPID_TUNER_TS_ATV_COUNTRYCODE), - helpstring("International dialing prefix for country of physical broadcast source") - ] - HRESULT CountryCode([out, retval] long *CountryCodeVal); - [propput, id(DISPID_TUNER_TS_ATV_COUNTRYCODE), - helpstring("International dialing prefix for country of physical broadcast source") - ] - HRESULT CountryCode([in] long NewCountryCodeVal); - } - -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(0369B4E2-45B6-11d3-B650-00C04F79498E), - pointer_default(unique) - ] -// note: we inherit ATSC from analog because we need the same properties. -// - the definition of channel is overloaded to be the major channel, -// - input type allows us to distinguish between broadcast and cable frequencies -// which allows us to use the atsc tuning space class for "open cable". -// - country code will allow us to redefine physical channel frequencies -// if any other countries adopt ATSC which may happen in Latin America in particular. - interface IATSCTuningSpace : IAnalogTVTuningSpace - { - [propget, id(DISPID_TUNER_TS_ATSC_MINMINORCHANNEL), - helpstring("Smallest minor channel number ever provided by this tuning space") - ] - HRESULT MinMinorChannel( - [out, retval] long *MinMinorChannelVal - ); - [propput, id(DISPID_TUNER_TS_ATSC_MINMINORCHANNEL), - helpstring("Smallest minor channel number ever provided by this tuning space") - ] - HRESULT MinMinorChannel( - [in] long NewMinMinorChannelVal - ); - [propget, id(DISPID_TUNER_TS_ATSC_MAXMINORCHANNEL), - helpstring("Largest minor channel number ever provided by this tuning space") - ] - HRESULT MaxMinorChannel( - [out, retval] long *MaxMinorChannelVal - ); - [propput, id(DISPID_TUNER_TS_ATSC_MAXMINORCHANNEL), - helpstring("Largest minor channel number ever provided by this tuning space") - ] - HRESULT MaxMinorChannel( - [in] long NewMaxMinorChannelVal - ); - [propget, id(DISPID_TUNER_TS_ATSC_MINPHYSCHANNEL), - helpstring("Smallest physical channel number ever provided by this tuning space") - ] - HRESULT MinPhysicalChannel( - [out, retval] long *MinPhysicalChannelVal - ); - [propput, id(DISPID_TUNER_TS_ATSC_MINPHYSCHANNEL), - helpstring("Smallest physical channel number ever provided by this tuning space") - ] - HRESULT MinPhysicalChannel( - [in] long NewMinPhysicalChannelVal - ); - [propget, id(DISPID_TUNER_TS_ATSC_MAXPHYSCHANNEL), - helpstring("Largest physical channel number ever provided by this tuning space") - ] - HRESULT MaxPhysicalChannel( - [out, retval] long *MaxPhysicalChannelVal - ); - [propput, id(DISPID_TUNER_TS_ATSC_MAXPHYSCHANNEL), - helpstring("Largest physical channel number ever provided by this tuning space") - ] - HRESULT MaxPhysicalChannel( - [in] long NewMaxPhysicalChannelVal - ); - - } - -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(2A6E293B-2595-11d3-B64C-00C04F79498E), - pointer_default(unique) - ] - interface IAnalogRadioTuningSpace : ITuningSpace { - [propget, id(DISPID_TUNER_TS_AR_MINFREQUENCY), - helpstring("Smallest frequency(khz) ever used by this tuning space") - ] - HRESULT MinFrequency( - [out, retval] long *MinFrequencyVal - ); - [propput, id(DISPID_TUNER_TS_AR_MINFREQUENCY), - helpstring("Smallest frequency(khz) ever used by this tuning space") - ] - HRESULT MinFrequency( - [in] long NewMinFrequencyVal - ); - [propget, id(DISPID_TUNER_TS_AR_MAXFREQUENCY), - helpstring("Largest frequency(khz) ever used by this tuning space") - ] - HRESULT MaxFrequency( - [out, retval] long *MaxFrequencyVal - ); - [propput, id(DISPID_TUNER_TS_AR_MAXFREQUENCY), - helpstring("Largest frequency(khz) ever used by this tuning space") - ] - HRESULT MaxFrequency( - [in] long NewMaxFrequencyVal - ); - [propget, id(DISPID_TUNER_TS_AR_STEP), - helpstring("Default step value(khz) to next frequency for this tuning space") - ] - HRESULT Step( - [out, retval] long *StepVal - ); - [propput, id(DISPID_TUNER_TS_AR_STEP), - helpstring("Default step value(khz) to next frequency for this tuning space") - ] - HRESULT Step( - [in] long NewStepVal - ); - } - - -////////////////////////////////////////////////////////////////////////////////////// -// Tune Request Interfaces -////////////////////////////////////////////////////////////////////////////////////// -// tune requests(of any kind) can only be obtained from tune request factories such as -// ITuningSpace::CreateTuneRequest. one reason for this is that we always want to be -// certain that a tune request is bound to the right tuning space. this means we don't -// have to perform consistency checks all over the place. - [ - object, - nonextensible, - uuid(07DDC146-FC3D-11d2-9D8C-00C04F72D980), - dual, - oleautomation, - helpstring("Tune Request Interface"), - pointer_default(unique) - ] - interface ITuneRequest : IDispatch - { - [propget, id(DISPID_TUNER_TR_TUNINGSPACE), - helpstring("Tuning Space object")] - HRESULT TuningSpace( - [out, retval] ITuningSpace **TuningSpace - ); - [propget, id(DISPID_TUNER_TR_COMPONENTS), - helpstring("Components collection")] - HRESULT Components( - [out, retval] IComponents **Components - ); - [id(DISPID_TUNER_TR_CLONE), - helpstring("Create a new copy of this tune request")] - HRESULT Clone( - [out, retval] ITuneRequest **NewTuneRequest - ); - [propget, id(DISPID_TUNER_TR_LOCATOR), - helpstring("Locator Object")] - HRESULT Locator( - [out, retval] ILocator **Locator - ); - [propput, id(DISPID_TUNER_TR_LOCATOR), - helpstring("Locator Object")] - HRESULT Locator( - [in] ILocator *Locator - ); - } - -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - nonextensible, - uuid(0369B4E0-45B6-11d3-B650-00C04F79498E), - dual, - oleautomation, - helpstring("Channel Tune Request Interface"), - pointer_default(unique) - ] - interface IChannelTuneRequest : ITuneRequest - { - [propget, id(DISPID_CHTUNER_CTR_CHANNEL), - helpstring("Channel")] - HRESULT Channel( - [out, retval] long *Channel - ); - [propput, id(DISPID_CHTUNER_CTR_CHANNEL), - helpstring("Channel")] - HRESULT Channel( - [in] long Channel - ); - } - -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - nonextensible, - uuid(0369B4E1-45B6-11d3-B650-00C04F79498E), - dual, - oleautomation, - helpstring("ATSC Channel Tune Request Interface"), - pointer_default(unique) - ] - interface IATSCChannelTuneRequest : IChannelTuneRequest - { - [propget, id(DISPID_CHTUNER_ACTR_MINOR_CHANNEL), - helpstring("Minor Channel")] - HRESULT MinorChannel( - [out, retval] long *MinorChannel - ); - [propput, id(DISPID_CHTUNER_ACTR_MINOR_CHANNEL), - helpstring("Minor Channel")] - HRESULT MinorChannel( - [in] long MinorChannel - ); - } - -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - nonextensible, - uuid(0D6F567E-A636-42bb-83BA-CE4C1704AFA2), - dual, - oleautomation, - helpstring("DVB Tune Request Interface"), - pointer_default(unique) - ] - interface IDVBTuneRequest : ITuneRequest - { - [propget, id(DISPID_DVBTUNER_ONID), - helpstring("Original Network ID")] - HRESULT ONID( - [out, retval] long *ONID - ); - [propput, id(DISPID_DVBTUNER_ONID), - helpstring("Original Network ID")] - HRESULT ONID( - [in] long ONID - ); - [propget, id(DISPID_DVBTUNER_TSID), - helpstring("Transport Stream ID")] - HRESULT TSID( - [out, retval] long *TSID - ); - [propput, id(DISPID_DVBTUNER_TSID), - helpstring("Transport Stream ID")] - HRESULT TSID( - [in] long TSID - ); - [propget, id(DISPID_DVBTUNER_SID), - helpstring("Service ID")] - HRESULT SID( - [out, retval] long *SID - ); - [propput, id(DISPID_DVBTUNER_SID), - helpstring("Service ID")] - HRESULT SID( - [in] long SID - ); - } - -////////////////////////////////////////////////////////////////////////////////////// -/// There are times(for example, reading from a file) when its useful to be able to tune -/// a basic mpeg2 transport stream that contains minimal tables. this requires the least -/// common denominator mpeg2 xport stream id information -/// the following tune request supplies these properties. it can typiclly only be obtained from -/// an mpeg2tunerequestfactory object. no known tune request(at this time) will return this -/// from their createtunerequest() method. in other words, this is not the "best" tune request -/// for any of the current tuning spaces. -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - nonextensible, - uuid(EB7D987F-8A01-42ad-B8AE-574DEEE44D1A), - dual, - oleautomation, - helpstring("MPEG2 Tune Request Interface"), - pointer_default(unique) - ] - interface IMPEG2TuneRequest : ITuneRequest - { - [propget, id(DISPID_MP2TUNER_TSID), - helpstring("Transport Stream ID")] - HRESULT TSID( - [out, retval] long *TSID - ); - [propput, id(DISPID_MP2TUNER_TSID), - helpstring("Transport Stream ID")] - HRESULT TSID( - [in] long TSID - ); - [propget, id(DISPID_MP2TUNER_PROGNO), - helpstring("Program Number ID")] - HRESULT ProgNo( - [out, retval] long *ProgNo - ); - [propput, id(DISPID_MP2TUNER_PROGNO), - helpstring("Program Number ID")] - HRESULT ProgNo( - [in] long ProgNo - ); - } - - [ - object, - nonextensible, - hidden, - uuid(14E11ABD-EE37-4893-9EA1-6964DE933E39), - dual, - oleautomation, - helpstring("MPEG2 Tune Request Factory Interface"), - pointer_default(unique) - ] - interface IMPEG2TuneRequestFactory : IDispatch - { - [id(DISPID_MP2TUNERFACTORY_CREATETUNEREQUEST), - helpstring("Create MPEG2 Tune Request for specified tuning space(if possible)")] - HRESULT CreateTuneRequest( - [in] ITuningSpace *TuningSpace, - [out, retval] IMPEG2TuneRequest **TuneRequest - ); - } - - [ - object, - hidden, - restricted, - nonextensible, - uuid(1B9D5FC3-5BBC-4b6c-BB18-B9D10E3EEEBF), - helpstring("MPEG2 Tune Request Supported Interface"), - pointer_default(unique) - ] - interface IMPEG2TuneRequestSupport : IUnknown - { - } - - -////////////////////////////////////////////////////////////////////////////////////// -// Tuner Interfaces -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(28C52640-018A-11d3-9D8E-00C04F72D980), - helpstring("Tuner Interface"), - pointer_default(unique) - ] - interface ITuner : IUnknown - { - [propget, helpstring("Tuning Space object")] - HRESULT TuningSpace( - [out, retval] ITuningSpace **TuningSpace - ); - - [propput, helpstring("Tuning Space object")] - HRESULT TuningSpace( - [in] ITuningSpace *TuningSpace - ); - - [hidden, restricted, helpstring("Returns an enumerator for Tuning Spaces accepted by this tuner")] - HRESULT EnumTuningSpaces( - [out, retval] IEnumTuningSpaces **ppEnum - ); - - [propget, helpstring("Tune Request object")] - HRESULT TuneRequest( - [out, retval] ITuneRequest **TuneRequest - ); - - [propput, helpstring("Tune Request object")] - HRESULT TuneRequest( - [in] ITuneRequest *TuneRequest - ); - - [helpstring("Validate the tuning request without tuning")] - HRESULT Validate( - [in] ITuneRequest *TuneRequest - ); - - [propget, helpstring("Preferred Component Types collection")] - HRESULT PreferredComponentTypes( - [out, retval] IComponentTypes **ComponentTypes - ); - - [propput, helpstring("Preferred Component Types collection")] - HRESULT PreferredComponentTypes( - [in] IComponentTypes *ComponentTypes - ); - - [propget, helpstring("Signal Strength")] - HRESULT SignalStrength( - [out, retval] long *Strength - ); - - [helpstring("Trigger Signal events (interval in milliseconds; 0 turns off trigger)")] - HRESULT TriggerSignalEvents( - [in] long Interval - ); - } - -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(1DFD0A5C-0284-11d3-9D8E-00C04F72D980), - helpstring("Scanning Tuner Interface"), - pointer_default(unique) - ] - interface IScanningTuner : ITuner - { - [helpstring("Seek to the next valid selection")] - HRESULT SeekUp( - ); - - [helpstring("Seek to the previous valid selection")] - HRESULT SeekDown( - ); - - [helpstring("Scan for valid selections upward")] - HRESULT ScanUp( - [in] long MillisecondsPause - ); - - [helpstring("Scan for valid selections downward")] - HRESULT ScanDown( - [in] long MillisecondsPause - ); - - [helpstring("Enter the device's autoprogram mode")] - HRESULT AutoProgram( - ); - }; - -////////////////////////////////////////////////////////////////////////////////////// -// Component Type Interfaces -////////////////////////////////////////////////////////////////////////////////////// - - // Component Category - - [ - object, - hidden, - nonextensible, - uuid(6A340DC0-0311-11d3-9D8E-00C04F72D980), - dual, - oleautomation, - helpstring("Component Type Interface"), - pointer_default(unique) - ] - interface IComponentType : IDispatch - { - [propget, id(DISPID_TUNER_CT_CATEGORY), - helpstring("General category of component")] - HRESULT Category( - [out, retval] ComponentCategory *Category - ); - [propput, id(DISPID_TUNER_CT_CATEGORY), - helpstring("General category of component")] - HRESULT Category( - [in] ComponentCategory Category - ); - - [propget, id(DISPID_TUNER_CT_MEDIAMAJORTYPE), - helpstring("DirectShow MediaType Major Type Guid")] - HRESULT MediaMajorType( - [out, retval] BSTR *MediaMajorType - ); - [propput, id(DISPID_TUNER_CT_MEDIAMAJORTYPE), - helpstring("DirectShow MediaType Major Type Guid")] - HRESULT MediaMajorType( - [in] BSTR MediaMajorType - ); - [propget, id(DISPID_TUNER_CT__MEDIAMAJORTYPE), - helpstring("DirectShow MediaType Major Type Guid"), hidden, restricted] - HRESULT _MediaMajorType( - [out, retval] GUID* MediaMajorTypeGuid - ); - [propput, id(DISPID_TUNER_CT__MEDIAMAJORTYPE), - helpstring("DirectShow MediaType Major Type Guid"), hidden, restricted] - HRESULT _MediaMajorType( - [in] REFCLSID MediaMajorTypeGuid - ); - [propget, id(DISPID_TUNER_CT_MEDIASUBTYPE), - helpstring("DirectShow MediaType Sub Type Guid")] - HRESULT MediaSubType( - [out, retval] BSTR *MediaSubType - ); - [propput, id(DISPID_TUNER_CT_MEDIASUBTYPE), - helpstring("DirectShow MediaType Sub Type Guid")] - HRESULT MediaSubType( - [in] BSTR MediaSubType - ); - [propget, id(DISPID_TUNER_CT__MEDIASUBTYPE), - helpstring("DirectShow MediaType Sub Type Guid"), hidden, restricted] - HRESULT _MediaSubType( - [out, retval] GUID* MediaSubTypeGuid - ); - [propput, id(DISPID_TUNER_CT__MEDIASUBTYPE), - helpstring("DirectShow MediaType Sub Type Guid"), hidden, restricted] - HRESULT _MediaSubType( - [in] REFCLSID MediaSubTypeGuid - ); - [propget, id(DISPID_TUNER_CT_MEDIAFORMATTYPE), - helpstring("DirectShow MediaType Format Guid")] - HRESULT MediaFormatType( - [out, retval] BSTR *MediaFormatType - ); - [propput, id(DISPID_TUNER_CT_MEDIAFORMATTYPE), - helpstring("DirectShow MediaType Format Guid")] - HRESULT MediaFormatType( - [in] BSTR MediaFormatType - ); - [propget, id(DISPID_TUNER_CT__MEDIAFORMATTYPE), - helpstring("DirectShow MediaType Format Guid"), hidden, restricted] - HRESULT _MediaFormatType( - [out, retval] GUID* MediaFormatTypeGuid - ); - [propput, id(DISPID_TUNER_CT__MEDIAFORMATTYPE), - helpstring("DirectShow MediaType Format Guid"), hidden, restricted] - HRESULT _MediaFormatType( - [in] REFCLSID MediaFormatTypeGuid - ); - - [propget, id(DISPID_TUNER_CT_MEDIATYPE), hidden, restricted, - helpstring("DirectShow MediaType Guid, this only retrieves major, sub, format guids not the entire struct")] - HRESULT MediaType( - [out, retval] AM_MEDIA_TYPE *MediaType - ); - [propput, id(DISPID_TUNER_CT_MEDIATYPE), hidden, restricted, - helpstring("DirectShow MediaType Guid, this only retrieves major, sub, format guids not the entire struct")] - HRESULT MediaType( - [in] AM_MEDIA_TYPE *MediaType - ); - - [id(DISPID_TUNER_CT_CLONE), - helpstring("Create a copy of this component type")] - HRESULT Clone( - [out, retval] IComponentType **NewCT - ); - }; - -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(B874C8BA-0FA2-11d3-9D8E-00C04F72D980), - dual, - oleautomation, - helpstring("Language Component Type Interface"), - pointer_default(unique) - ] - interface ILanguageComponentType : IComponentType - { - [propget, id(DISPID_TUNER_LCT_LANGID), - helpstring("Language Identifier for Substream Content Language")] - HRESULT LangID( - [out, retval] long *LangID - ); - - [propput, id(DISPID_TUNER_LCT_LANGID), - helpstring("Language Identifier for Substream Content Language")] - HRESULT LangID( - [in] long LangID - ); - }; - -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(2C073D84-B51C-48c9-AA9F-68971E1F6E38), - dual, - oleautomation, - helpstring("MPEG2 Component Type Interface"), - pointer_default(unique) - ] - interface IMPEG2ComponentType : ILanguageComponentType - { - [propget, id(DISPID_TUNER_MP2CT_TYPE), - helpstring("MPEG2 Stream Type")] - HRESULT StreamType( - [out, retval] MPEG2StreamType *MP2StreamType - ); - - [propput, id(DISPID_TUNER_MP2CT_TYPE), - helpstring("MPEG2 Stream Type")] - HRESULT StreamType( - [in] MPEG2StreamType MP2StreamType - ); - }; - -////////////////////////////////////////////////////////////////////////////////////// - - [ - object, - hidden, - nonextensible, - uuid(FC189E4D-7BD4-4125-B3B3-3A76A332CC96), - dual, - oleautomation, - helpstring("ATSC Component Type Interface"), - pointer_default(unique) - ] - interface IATSCComponentType : IMPEG2ComponentType - { - [propget, id(DISPID_TUNER_ATSCCT_FLAGS), - helpstring("ATSC Component Type Flags")] - HRESULT Flags( - [out, retval] long *Flags - ); - - [propput, id(DISPID_TUNER_ATSCCT_FLAGS), - helpstring("ATSC Component Type Flags")] - HRESULT Flags( - [in] long flags - ); - }; - -////////////////////////////////////////////////////////////////////////////////////// - [ - hidden, restricted, - object, - uuid(8A674B4A-1F63-11d3-B64C-00C04F79498E), - pointer_default(unique) - ] - interface IEnumComponentTypes : IUnknown - { - HRESULT Next( - [in] ULONG celt, - [out, size_is(celt), length_is(*pceltFetched)] - IComponentType** rgelt, - [out] ULONG* pceltFetched - ); - - HRESULT Skip( - [in] ULONG celt - ); - - HRESULT Reset(void); - - HRESULT Clone( - [out] IEnumComponentTypes** ppEnum - ); - } - - -////////////////////////////////////////////////////////////////////////////////////// -// Component Type Container -////////////////////////////////////////////////////////////////////////////////////// - - [ - object, - hidden, - nonextensible, - uuid(0DC13D4A-0313-11d3-9D8E-00C04F72D980), - dual, - oleautomation, - helpstring("ComponentType Collection Interface"), - pointer_default(unique) - ] - interface IComponentTypes : IDispatch - { - [propget, helpstring("Number of items in the collection")] - HRESULT Count( - [out, retval] long *Count - ); - - [propget, id(DISPID_NEWENUM), hidden, restricted] - HRESULT _NewEnum( - [out, retval] IEnumVARIANT **ppNewEnum - ); - - [hidden, restricted, helpstring("Convenience Function for Use with C")] - HRESULT EnumComponentTypes( - [out, retval] IEnumComponentTypes **ppNewEnum - ); - - [id(DISPID_VALUE), - propget, - helpstring("Get the ComponentType at the specified index")] - HRESULT Item( - [in] VARIANT Index, - [out, retval] IComponentType **ComponentType - ); - - [id(DISPID_VALUE), - propput, - helpstring("Get the ComponentType at the specified index")] - HRESULT Item( - [in] VARIANT Index, - [in] IComponentType *ComponentType - ); - - [id(DISPID_ADDITEM), - helpstring("Append the ComponentType to the collection")] - HRESULT Add( - [in] IComponentType *ComponentType, - [out, retval] VARIANT *NewIndex - ); - - [id(DISPID_REMOVEITEM), - helpstring("Clear the collection")] - HRESULT Remove( - [in] VARIANT Index - ); - - [helpstring("Copy the collection")] - HRESULT Clone([out, retval] IComponentTypes **NewList); - }; - -////////////////////////////////////////////////////////////////////////////////////// -// Component Interfaces -////////////////////////////////////////////////////////////////////////////////////// - - [ - object, - nonextensible, - uuid(1A5576FC-0E19-11d3-9D8E-00C04F72D980), - dual, - oleautomation, - helpstring("Component Interface"), - pointer_default(unique) - ] - interface IComponent : IDispatch - { - [propget, id(DISPID_TUNER_C_TYPE), - helpstring("Component Type")] - HRESULT Type( - [out, retval] IComponentType** CT - ); - - // only loaders initialize components - [hidden, restricted, propput, id(DISPID_TUNER_C_TYPE), - helpstring("Component Type")] - HRESULT Type( - [in] IComponentType* CT - ); - - // NOTE: this langid is *not* the same as the langid - // in the componenttype(if the componenttype is a languagecomponenttype) - // the langid in the component type is the language of the content this - // component is describing. the following langid in the component is the - // language of the descriptive info in the component object. - [propget, id(DISPID_TUNER_C_LANGID), - helpstring("Language Identifier for Description Language")] - HRESULT DescLangID( - [out, retval] long *LangID - ); - - [propput, id(DISPID_TUNER_C_LANGID), - helpstring("Language Identifier for Description Language")] - HRESULT DescLangID( - [in] long LangID - ); - - [propget, id(DISPID_TUNER_C_STATUS), - helpstring("Component Status")] - HRESULT Status( - [out, retval] ComponentStatus *Status - ); - - [propput, id(DISPID_TUNER_C_STATUS), - helpstring("Component Status")] - HRESULT Status( - [in] ComponentStatus Status - ); - - [propget, id(DISPID_TUNER_C_DESCRIPTION), - helpstring("Component Description")] - HRESULT Description( - [out, retval] BSTR *Description - ); - - // restricted: only loaders will initialize components - [hidden, restricted, propput, id(DISPID_TUNER_C_DESCRIPTION), - helpstring("Component Description")] - HRESULT Description( - [in] BSTR Description - ); - - [id(DISPID_TUNER_C_CLONE), - helpstring("Copy Component")] - HRESULT Clone( - [out, retval] IComponent **NewComponent - ); - - }; - -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - nonextensible, - uuid(1493E353-1EB6-473c-802D-8E6B8EC9D2A9), - dual, - oleautomation, - helpstring("MPEG2 Component Interface"), - pointer_default(unique) - ] - interface IMPEG2Component : IComponent - { - [propget, id(DISPID_TUNER_C_MP2_PID), - helpstring("MPEG2 Packet ID for this Substream")] - HRESULT PID( - [out, retval] long *PID - ); - - [propput, id(DISPID_TUNER_C_MP2_PID), - helpstring("MPEG2 Packet ID for this Substream")] - HRESULT PID( - [in] long PID - ); - [propget, id(DISPID_TUNER_C_MP2_PCRPID), - helpstring("MPEG2 Packet ID for this Substream's Timestamps")] - HRESULT PCRPID( - [out, retval] long *PCRPID - ); - - [propput, id(DISPID_TUNER_C_MP2_PCRPID), - helpstring("MPEG2 Packet ID for this Substream's Timestamps")] - HRESULT PCRPID( - [in] long PCRPID - ); - - // program number provides reverse lookup to PAT - [propget, id(DISPID_TUNER_C_MP2_PROGNO), - helpstring("MPEG2 Program Number")] - HRESULT ProgramNumber( - [out, retval] long *ProgramNumber - ); - - [propput, id(DISPID_TUNER_C_MP2_PROGNO), - helpstring("MPEG2 Program Number")] - HRESULT ProgramNumber( - [in] long ProgramNumber - ); - }; - -////////////////////////////////////////////////////////////////////////////////////// - [ - hidden, restricted, - object, - uuid(2A6E2939-2595-11d3-B64C-00C04F79498E), - pointer_default(unique) - ] - interface IEnumComponents : IUnknown - { - HRESULT Next( - [in] ULONG celt, - [out, size_is(celt), length_is(*pceltFetched)] - IComponent** rgelt, - [out] ULONG* pceltFetched - ); - - HRESULT Skip( - [in] ULONG celt - ); - - HRESULT Reset(void); - - HRESULT Clone( - [out] IEnumComponents** ppEnum - ); - } - - -////////////////////////////////////////////////////////////////////////////////////// -// Component Container -////////////////////////////////////////////////////////////////////////////////////// - - [ - object, - nonextensible, - uuid(FCD01846-0E19-11d3-9D8E-00C04F72D980), - dual, - oleautomation, - helpstring("Component Collection Interface"), - pointer_default(unique) - ] - interface IComponents : IDispatch - { - [propget, helpstring("Number of items in the collection")] - HRESULT Count( - [out, retval] long *Count - ); - - [propget, id(DISPID_NEWENUM), hidden, restricted] - HRESULT _NewEnum( - [out, retval] IEnumVARIANT **ppNewEnum - ); - - [hidden, restricted, helpstring("Convenience Function for Use with C")] - HRESULT EnumComponents( - [out, retval] IEnumComponents **ppNewEnum - ); - - [id(DISPID_VALUE), - propget, - helpstring("Get the Component at the specified index")] - HRESULT Item( - [in] VARIANT Index, - [out, retval] IComponent **ppComponent - ); - - [id(DISPID_ADDITEM), - helpstring("Add the Component to the collection")] - HRESULT Add( - [in] IComponent *Component, - [out, retval] VARIANT *NewIndex - ); - - [id(DISPID_REMOVEITEM), - helpstring("Remove the Component at the specified index")] - HRESULT Remove( - [in] VARIANT Index - ); - - [helpstring("Copy the collection")] - HRESULT Clone([out, retval] IComponents **NewList); - }; - -////////////////////////////////////////////////////////////////////////////////////// -// Component Container -////////////////////////////////////////////////////////////////////////////////////// -// this separates the what(general tune request properties) from the where - - - - [ - object, - nonextensible, - uuid(286D7F89-760C-4F89-80C4-66841D2507AA), - dual, - oleautomation, - helpstring("Generic Locator Information"), - pointer_default(unique) - ] - interface ILocator : IDispatch - { - - [propget, id(DISPID_TUNER_L_CARRFREQ), helpstring("Carrier Frequency(DecaHertz)")] - HRESULT CarrierFrequency( - [out, retval] long* Frequency - ); - [propput, id(DISPID_TUNER_L_CARRFREQ), helpstring("Carrier Frequency(DecaHertz)")] - HRESULT CarrierFrequency( - [in] long Frequency - ); - [propget, id(DISPID_TUNER_L_INNERFECMETHOD), helpstring("Inner Fec Type")] - HRESULT InnerFEC( - [out, retval] FECMethod* FEC - ); - [propput, id(DISPID_TUNER_L_INNERFECMETHOD), helpstring("Inner Fec Type")] - HRESULT InnerFEC( - [in] FECMethod FEC - ); - [propget, id(DISPID_TUNER_L_INNERFECRATE), helpstring("Inner Fec Rate")] - HRESULT InnerFECRate( - [out, retval] BinaryConvolutionCodeRate* FEC - ); - [propput, id(DISPID_TUNER_L_INNERFECRATE), helpstring("Inner Fec Rate")] - HRESULT InnerFECRate( - [in] BinaryConvolutionCodeRate FEC - ); - [propget, id(DISPID_TUNER_L_OUTERFECMETHOD), helpstring("Outer Fec Type")] - HRESULT OuterFEC( - [out, retval] FECMethod* FEC - ); - [propput, id(DISPID_TUNER_L_OUTERFECMETHOD), helpstring("Outer Fec Type")] - HRESULT OuterFEC( - [in] FECMethod FEC - ); - [propget, id(DISPID_TUNER_L_OUTERFECRATE), helpstring("Outer Fec Rate")] - HRESULT OuterFECRate( - [out, retval] BinaryConvolutionCodeRate* FEC - ); - [propput, id(DISPID_TUNER_L_OUTERFECRATE), helpstring("Outer Fec Rate")] - HRESULT OuterFECRate( - [in] BinaryConvolutionCodeRate FEC - ); - [propget, id(DISPID_TUNER_L_MOD), helpstring("Modulation Type")] - HRESULT Modulation( - [out, retval] ModulationType* Modulation - ); - [propput, id(DISPID_TUNER_L_MOD), helpstring("Modulation Type")] - HRESULT Modulation( - [in] ModulationType Modulation - ); - [propget, id(DISPID_TUNER_L_SYMRATE), helpstring("Modulation Symbol Rate")] - HRESULT SymbolRate( - [out, retval] long* Rate - ); - [propput, id(DISPID_TUNER_L_SYMRATE), helpstring("Modulation Symbol Rate")] - HRESULT SymbolRate( - [in] long Rate - ); - [id(DISPID_TUNER_L_CLONE), helpstring("Copy the Locator")] - HRESULT Clone([out, retval] ILocator **NewLocator); - }; - -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(BF8D986F-8C2B-4131-94D7-4D3D9FCC21EF), - dual, - oleautomation, - helpstring("ATSC Locator Information"), - pointer_default(unique) - ] - interface IATSCLocator : ILocator - { - [propget, id(DISPID_TUNER_L_ATSC_PHYS_CHANNEL), - helpstring("Physical Channel")] - HRESULT PhysicalChannel( - [out, retval] long *PhysicalChannel - ); - [propput, id(DISPID_TUNER_L_ATSC_PHYS_CHANNEL), - helpstring("Physical Channel")] - HRESULT PhysicalChannel( - [in] long PhysicalChannel - ); - [propget, id(DISPID_TUNER_L_ATSC_TSID), - helpstring("Transport Stream ID")] - HRESULT TSID( - [out, retval] long *TSID - ); - [propput, id(DISPID_TUNER_L_ATSC_TSID), - helpstring("Transport Stream ID")] - HRESULT TSID( - [in] long TSID - ); - }; - -////////////////////////////////////////////////////////////////////////////////////// - - [ - object, - hidden, - nonextensible, - uuid(8664DA16-DDA2-42ac-926A-C18F9127C302), - dual, - oleautomation, - helpstring("DVB Terrestrial Locator Information"), - pointer_default(unique) - ] - interface IDVBTLocator : ILocator - { - [propget, id(DISPID_TUNER_L_DVBT_BANDWIDTH), helpstring("Bandwidth")] - HRESULT Bandwidth( - [out, retval] long* BandWidthVal - ); - [propput, id(DISPID_TUNER_L_DVBT_BANDWIDTH), helpstring("Bandwidth")] - HRESULT Bandwidth( - [in] long BandwidthVal - ); - - [propget, id(DISPID_TUNER_L_DVBT_LPINNERFECMETHOD), helpstring("Inner Fec Type for Low Priority Stream")] - HRESULT LPInnerFEC( - [out, retval] FECMethod* FEC - ); - [propput, id(DISPID_TUNER_L_DVBT_LPINNERFECMETHOD), helpstring("Inner Fec Type for Low Priority Stream")] - HRESULT LPInnerFEC( - [in] FECMethod FEC - ); - [propget, id(DISPID_TUNER_L_DVBT_LPINNERFECRATE), helpstring("Inner Fec Rate for Low Priority Stream")] - HRESULT LPInnerFECRate( - [out, retval] BinaryConvolutionCodeRate* FEC - ); - [propput, id(DISPID_TUNER_L_DVBT_LPINNERFECRATE), helpstring("Inner Fec Rate for Low Priority Stream")] - HRESULT LPInnerFECRate( - [in] BinaryConvolutionCodeRate FEC - ); - [propget, id(DISPID_TUNER_L_DVBT_HALPHA), helpstring("Hierarchical Alpha")] - HRESULT HAlpha( - [out, retval] HierarchyAlpha* Alpha - ); - [propput, id(DISPID_TUNER_L_DVBT_HALPHA), helpstring("Hierarchical Alpha")] - HRESULT HAlpha( - [in] HierarchyAlpha Alpha - ); - [propget, id(DISPID_TUNER_L_DVBT_GUARDINTERVAL), helpstring("Guard Interval")] - HRESULT Guard( - [out, retval] GuardInterval* GI - ); - [propput, id(DISPID_TUNER_L_DVBT_GUARDINTERVAL), helpstring("Guard Interval")] - HRESULT Guard( - [in] GuardInterval GI - ); - [propget, id(DISPID_TUNER_L_DVBT_TRANSMISSIONMODE), helpstring("Transmission Mode")] - HRESULT Mode( - [out, retval] TransmissionMode* mode - ); - [propput, id(DISPID_TUNER_L_DVBT_TRANSMISSIONMODE), helpstring("Transmission Mode")] - HRESULT Mode( - [in] TransmissionMode mode - ); - [propget, id(DISPID_TUNER_L_DVBT_INUSE), helpstring("Hierarchical Alpha")] - HRESULT OtherFrequencyInUse( - [out, retval] VARIANT_BOOL* OtherFrequencyInUseVal - ); - [propput, id(DISPID_TUNER_L_DVBT_INUSE), helpstring("Hierarchical Alpha")] - HRESULT OtherFrequencyInUse( - [in] VARIANT_BOOL OtherFrequencyInUseVal - ); - }; - -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(3D7C353C-0D04-45f1-A742-F97CC1188DC8), - dual, - oleautomation, - helpstring("DVB Satellite Locator Information"), - pointer_default(unique) - ] - interface IDVBSLocator : ILocator - { - - [propget, id(DISPID_TUNER_L_DVBS_POLARISATION), helpstring("Signal Polarisation Type")] - HRESULT SignalPolarisation( - [out, retval] Polarisation* PolarisationVal - ); - [propput, id(DISPID_TUNER_L_DVBS_POLARISATION), helpstring("Signal Polarisation Type")] - HRESULT SignalPolarisation( - [in] Polarisation PolarisationVal - ); - [propget, id(DISPID_TUNER_L_DVBS_WEST), helpstring("VARIANT_TRUE means orbital position specifies west longitude")] - HRESULT WestPosition( - [out, retval] VARIANT_BOOL* WestLongitude - ); - [propput, id(DISPID_TUNER_L_DVBS_WEST), helpstring("VARIANT_TRUE means orbital position specifies west longitude")] - HRESULT WestPosition( - [in] VARIANT_BOOL WestLongitude - ); - [propget, id(DISPID_TUNER_L_DVBS_ORBITAL), helpstring("Longitude in tenths of a degree")] - HRESULT OrbitalPosition( - [out, retval] long* longitude - ); - [propput, id(DISPID_TUNER_L_DVBS_ORBITAL), helpstring("Longitude in tenths of a degree")] - HRESULT OrbitalPosition( - [in] long longitude - ); - [propget, id(DISPID_TUNER_L_DVBS_AZIMUTH), helpstring("Azimuth in tenths of a degree")] - HRESULT Azimuth( - [out, retval] long* Azimuth - ); - [propput, id(DISPID_TUNER_L_DVBS_AZIMUTH), helpstring("Azimuth in tenths of a degree")] - HRESULT Azimuth( - [in] long Azimuth - ); - [propget, id(DISPID_TUNER_L_DVBS_ELEVATION), helpstring("Elevation in tenths of a degree")] - HRESULT Elevation( - [out, retval] long* Elevation - ); - [propput, id(DISPID_TUNER_L_DVBS_ELEVATION), helpstring("Elevation in tenths of a degree")] - HRESULT Elevation( - [in] long Elevation - ); - }; - -////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(6E42F36E-1DD2-43c4-9F78-69D25AE39034), - dual, - oleautomation, - helpstring("DVB Cable Locator Information"), - pointer_default(unique) - ] - interface IDVBCLocator : ILocator - { - }; - -/////////////////////////////////////////////////////////////////////////////////////// -// utility interfaces -/////////////////////////////////////////////////////////////////////////////////////// - - [ - object, - hidden, - nonextensible, - uuid(3B21263F-26E8-489d-AAC4-924F7EFD9511), - helpstring("Broadcast Event Service Firing/Reflecting Interface"), - pointer_default(unique) - ] - interface IBroadcastEvent : IUnknown - { - HRESULT Fire(GUID EventID); - }; - - -////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////// -// TYPELIB & CoClasses -////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////// -[ - uuid(9B085638-018E-11d3-9D8E-00C04F72D980), - version(1.0), - helpstring("Microsoft Tuner 1.0 Type Library") -] -library TunerLib -{ - importlib("stdole2.tlb"); - - // SystemTuningSpaces class - [ - uuid(D02AAC50-027E-11d3-9D8E-00C04F72D980), - helpstring("SystemTuningSpace Class") - ] - coclass SystemTuningSpaces - { - [default] interface ITuningSpaceContainer; - }; - - // NOTE: there is no object factory for this class. the implementation for the underlying - // code is a c++ abstract base class. this coclass is only provided here to - // force vb to expose the base interface to enable polymorphic access to - // derived objects - [ - hidden, restricted, - uuid(5FFDC5E6-B83A-4b55-B6E8-C69E765FE9DB), - helpstring("dummy class to expose base tuning space i/f to VB") - ] - coclass TuningSpace - { - [default] interface ITuningSpace; - }; - - - [ - uuid(A2E30750-6C3D-11d3-B653-00C04F79498E), - helpstring("ATSC Digital Broadcast Tuning Space Class") - ] - coclass ATSCTuningSpace - { - [default] interface IATSCTuningSpace; - }; - - [ - uuid(8A674B4C-1F63-11d3-B64C-00C04F79498E), - helpstring("Analog Radio Tuning Space Class") - ] - coclass AnalogRadioTuningSpace - { - [default] interface IAnalogRadioTuningSpace; - }; - - [ - uuid(8A674B4D-1F63-11d3-B64C-00C04F79498E), - helpstring("Analog TV Tuning Space Class") - ] - coclass AnalogTVTuningSpace - { - [default] interface IAnalogTVTuningSpace; - }; - - [ - uuid(C6B14B32-76AA-4a86-A7AC-5C79AAF58DA7), - helpstring("DVB Tuning Space Class") - ] - coclass DVBTuningSpace - { - [default] interface IDVBTuningSpace2; - interface IDVBTuningSpace; - }; - - [ - uuid(B64016F3-C9A2-4066-96F0-BD9563314726), - helpstring("DVB Satellite Tuning Space Class") - ] - coclass DVBSTuningSpace - { - [default] interface IDVBSTuningSpace; - }; - - - // ComponentTypes container class - [ - uuid(A1A2B1C4-0E3A-11d3-9D8E-00C04F72D980), - helpstring("Component Types Collection Class") - ] - coclass ComponentTypes - { - [default] interface IComponentTypes; - }; - - // ComponentType class - [ - uuid(823535A0-0318-11d3-9D8E-00C04F72D980), - helpstring("ComponentType Class") - ] - coclass ComponentType - { - [default] interface IComponentType; - }; - - // Language ComponentType class - [ - uuid(1BE49F30-0E1B-11d3-9D8E-00C04F72D980), - helpstring("LanguageComponentType Class") - ] - coclass LanguageComponentType - { - [default] interface ILanguageComponentType; - }; - - // MPEG2 ComponentType class - [ - uuid(418008F3-CF67-4668-9628-10DC52BE1D08), - helpstring("MPEG2ComponentType Class") - ] - coclass MPEG2ComponentType - { - [default] interface IMPEG2ComponentType; - }; - - // ATSC ComponentType class - [ - uuid(A8DCF3D5-0780-4ef4-8A83-2CFFAACB8ACE), - helpstring("ATSCComponentType Class") - ] - coclass ATSCComponentType - { - [default] interface IATSCComponentType; - }; - - // Components class - [ - hidden, restricted, - uuid(809B6661-94C4-49e6-B6EC-3F0F862215AA), - helpstring("Components Collection Class") - ] - coclass Components - { - [default] interface IComponents; - }; - - // Component class - // the components can only be created by network provider/tif. client apps - // retrieve them from a filled-in tune request by either loading a persisted tune - // request that has been filled in by a proper guide store loader or by re-getting - // the current tune request property which will have this filled in by the network - // provider - [ - hidden, restricted, - uuid(59DC47A8-116C-11d3-9D8E-00C04F72D980), - helpstring("Component Class") - ] - coclass Component - { - [default] interface IComponent; - }; - - // MPEG2 Component class - [ - hidden, restricted, - uuid(055CB2D7-2969-45cd-914B-76890722F112), - helpstring("MPEG2 Component Class") - ] - coclass MPEG2Component - { - [default] interface IMPEG2Component; - }; - - - // NOTE: there is no object factory for this class. the implementation for the underlying - // code is a c++ abstract base class. this coclass is only provided here to - // force vb to expose the base interface to enable polymorphic access to - // derived objects - [ - hidden, restricted, - uuid(B46E0D38-AB35-4a06-A137-70576B01B39F), - helpstring("dummy class to expose base tune request i/f to VB") - ] - coclass TuneRequest - { - [default] interface ITuneRequest; - }; - - - // NOTE: the tuning request factories should not be invoked directly. - // instead apps should use ITuningSpace::CreateTuningRequest to obtain a correctly - // initialized tuning request of the appropriate type for that space. - // the object factories are provided to allow generic code to a load a previously persisted - // tune request object. - [ - hidden, - restricted, - uuid(0369B4E5-45B6-11d3-B650-00C04F79498E), - helpstring("Channel Tune Request") - ] - coclass ChannelTuneRequest - { - [default] interface IChannelTuneRequest; - }; - - [ - hidden, - restricted, - uuid(0369B4E6-45B6-11d3-B650-00C04F79498E), - helpstring("ATSC Channel Tune Request") - ] - coclass ATSCChannelTuneRequest - { - [default] interface IATSCChannelTuneRequest; - }; - - // NOTE: there is no object factory for this class. the implementation for the underlying - // code is a c++ abstract base class. this coclass is only provided here to - // force vb to expose the base interface to enable polymorphic access to - // derived objects - [ - hidden, restricted, - uuid(0955AC62-BF2E-4cba-A2B9-A63F772D46CF), - helpstring("dummy class to expose mpeg2 request i/f to VB") - ] - coclass MPEG2TuneRequest - { - [default] interface IMPEG2TuneRequest; - }; - - [ - uuid(2C63E4EB-4CEA-41b8-919C-E947EA19A77C), - helpstring("Factory for creating IMPEG2TuneRequest") - ] - coclass MPEG2TuneRequestFactory - { - [default] interface IMPEG2TuneRequestFactory; - }; - - - // NOTE: there is no object factory for this class. the implementation for the underlying - // code is a c++ abstract base class. this coclass is only provided here to - // force vb to expose the base interface to enable polymorphic access to - // derived objects - [ - hidden, restricted, - uuid(0888C883-AC4F-4943-B516-2C38D9B34562), - helpstring("dummy class to expose base locator i/f to VB") - ] - coclass Locator - { - [default] interface ILocator; - }; - - // its not intended that client apps actually create locators. the network - // provider in combination with the transport information filter(TIF) are the - // only modules in the system that actually know the correct values for these objects - // however, for testing purposes, its necessary to allow these to be created. - // instead, normally these will simply be passed around opaquely since they're a - // property of the base tune request interface. - [ - uuid(8872FF1B-98FA-4d7a-8D93-C9F1055F85BB), - helpstring("ATSC Locator") - ] - coclass ATSCLocator - { - [default] interface IATSCLocator; - }; - - [ - uuid(9CD64701-BDF3-4d14-8E03-F12983D86664), - helpstring("DVB-Terrestrial Locator") - ] - coclass DVBTLocator - { - [default] interface IDVBTLocator; - }; - - [ - uuid(1DF7D126-4050-47f0-A7CF-4C4CA9241333), - helpstring("DVB-Satellite Locator") - ] - coclass DVBSLocator - { - [default] interface IDVBSLocator; - }; - - [ - uuid(C531D9FD-9685-4028-8B68-6E1232079F1E), - helpstring("DVB-Cable Locator") - ] - coclass DVBCLocator - { - [default] interface ILocator; - }; - - [ - hidden, - restricted, - uuid(15D6504A-5494-499c-886C-973C9E53B9F1), - helpstring("DVB Tune Request") - ] - coclass DVBTuneRequest - { - [default] interface IDVBTuneRequest; - }; - -// Sample tuner class definition: -// -// [ -// uuid(), -// helpstring("My Tuner object") -// ] -// coclass MyTuner -// { -// [default] interface ITuner; -// interface IMyTunerCustomFeatureInterface; -// }; - -/////////////////////////////////////////////////////////////////////////////////////// -// utility objects -/////////////////////////////////////////////////////////////////////////////////////// - [ - hidden, restricted, - uuid(8A674B49-1F63-11d3-B64C-00C04F79498E), - helpstring("Create property bag backed by registry") - ] - coclass CreatePropBagOnRegKey - { - interface ICreatePropBagOnRegKey; - }; - - [ - hidden, restricted, - uuid(0B3FFB92-0919-4934-9D5B-619C719D0202), - helpstring("DShow Broadcast Event Service Object") - ] - coclass BroadcastEventService - { - interface IBroadcastEvent; - }; - -cpp_quote("#define SID_SBroadcastEventService CLSID_BroadcastEventService") - -} - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// The following is the original contents of this header from -// the DirectX 8.0 SDK. -// -///////////////////////////////////////////////////////////////////////////// - -#else // DirectX 8.0 content - - - interface ITuningSpaceContainer; - interface ITuningSpace; - interface IEnumTuningSpaces; - interface ITuneRequest; - interface ITuner; - interface IScanningTuner; - interface ITunerEvents; - interface IEnumComponentTypes; - interface IComponentTypes; - interface IComponentType; - interface ILanguageComponentType; - interface IEnumComponents; - interface IComponents; - interface IComponent; - interface IMPEG2ComponentType; - interface IMPEG2Component; - interface ILocator; - interface IATSCLocator; - interface IDVBSLocator; - interface IDVBTLocator; - - // tuner.idl: - // interface ITuningSpaceContainer : IDispatch - // interface ITuningSpace : IDispatch - // interface ITuneRequest : IDispatch - // interface IComponentType : IDispatch - // interface ILanguageComponentType : IComponentType - // interface IComponentTypes : IDispatch - // interface IComponent : IDispatch - // interface IComponents : IDispatch - // interface ITVTuningSpace : ITuningSpace - // interface IFMRadioTuningSpace : ITuningSpace - // interface IAMRadioTuningSpace : ITuningSpace - // interface IAnalogTVTuningSpace : ITVTuningSpace - // interface IAnalogTVAudioComponent : IComponent - // interface IAnalogTVDataComponent : IComponent - // interface IChannelTuneRequest : ITuneRequest - // interface IDVBComponent : IComponent - // interface IDVBTuneRequest : ITuneRequest - - // DISPIDs for ITuningSpaces interface - // we don't expect to inherit from this interface and consequently there's - // no chance of collision, thus we'll allow midl to auto assign ids for this one - - // DISPIDs for ITuningSpace interface - enum { - DISPID_TUNER_TS_UNIQUENAME = 1, - DISPID_TUNER_TS_FRIENDLYNAME = 2, - DISPID_TUNER_TS_CLSID = 3, - DISPID_TUNER_TS_NETWORKTYPE = 4, - DISPID_TUNER_TS__NETWORKTYPE = 5, - DISPID_TUNER_TS_CREATETUNEREQUEST = 6, - DISPID_TUNER_TS_ENUMCATEGORYGUIDS = 7, - DISPID_TUNER_TS_ENUMDEVICEMONIKERS = 8, - DISPID_TUNER_TS_DEFAULTPREFERREDCOMPONENTTYPES = 9, - DISPID_TUNER_TS_FREQMAP = 10, - DISPID_TUNER_TS_DEFLOCATOR = 11, - DISPID_TUNER_TS_CLONE = 12, - - // DISPIDs for ITuneRequest interface - DISPID_TUNER_TR_TUNINGSPACE = 1, - DISPID_TUNER_TR_COMPONENTS = 2, - DISPID_TUNER_TR_CLONE = 3, - DISPID_TUNER_TR_LOCATOR = 4, - - - // DISPID for IComponentType interface - DISPID_TUNER_CT_CATEGORY = 1, - DISPID_TUNER_CT_MEDIAMAJORTYPE = 2, - DISPID_TUNER_CT__MEDIAMAJORTYPE = 3, - DISPID_TUNER_CT_MEDIASUBTYPE = 4, - DISPID_TUNER_CT__MEDIASUBTYPE = 5, - DISPID_TUNER_CT_MEDIAFORMATTYPE = 6, - DISPID_TUNER_CT__MEDIAFORMATTYPE = 7, - DISPID_TUNER_CT_MEDIATYPE = 8, - DISPID_TUNER_CT_CLONE = 9, - - - // DISPID for ILanguageComponentType interface - DISPID_TUNER_LCT_LANGID = 100, - - // DISPID for IMPEG2ComponentType interface - DISPID_TUNER_MP2CT_TYPE = 200, - - // DISPID for IATSCComponentType interface - DISPID_TUNER_ATSCCT_FLAGS = 300, - - // DISPID for ILocator interface - DISPID_TUNER_L_CARRFREQ = 1, - DISPID_TUNER_L_INNERFECMETHOD = 2, - DISPID_TUNER_L_INNERFECRATE = 3, - DISPID_TUNER_L_OUTERFECMETHOD = 4, - DISPID_TUNER_L_OUTERFECRATE = 5, - DISPID_TUNER_L_MOD = 6, - DISPID_TUNER_L_SYMRATE = 7, - DISPID_TUNER_L_CLONE = 8, - - // DISPID for IATSCLocator interface - DISPID_TUNER_L_ATSC_PHYS_CHANNEL = 201, - DISPID_TUNER_L_ATSC_TSID = 202, - - // DISPID for IDVBTLocator interface - DISPID_TUNER_L_DVBT_BANDWIDTH = 301, - DISPID_TUNER_L_DVBT_LPINNERFECMETHOD = 302, - DISPID_TUNER_L_DVBT_LPINNERFECRATE = 303, - DISPID_TUNER_L_DVBT_GUARDINTERVAL = 304, - DISPID_TUNER_L_DVBT_HALPHA = 305, - DISPID_TUNER_L_DVBT_TRANSMISSIONMODE = 306, - DISPID_TUNER_L_DVBT_INUSE = 307, - - // DISPID for IDVBSLocator interface - DISPID_TUNER_L_DVBS_POLARISATION = 401, - DISPID_TUNER_L_DVBS_WEST = 402, - DISPID_TUNER_L_DVBS_ORBITAL = 403, - DISPID_TUNER_L_DVBS_AZIMUTH = 404, - DISPID_TUNER_L_DVBS_ELEVATION = 405, - - // DISPID for IDVBCLocator interface - - // DISPIDs for IComponent interface - DISPID_TUNER_C_TYPE = 1, - DISPID_TUNER_C_STATUS = 2, - DISPID_TUNER_C_LANGID = 3, - DISPID_TUNER_C_DESCRIPTION = 4, - DISPID_TUNER_C_CLONE = 5, - - // DISPIDs for IMPEG2Component interface - DISPID_TUNER_C_MP2_PID = 101, - DISPID_TUNER_C_MP2_PCRPID = 102, - DISPID_TUNER_C_MP2_PROGNO = 103, - - // DISPIDs for IDVBTuningSpace interface - DISPID_TUNER_TS_DVB_SYSTEMTYPE = 101, - - // DISPIDs for IAnalogRadioTuningSpace interface - DISPID_TUNER_TS_AR_MINFREQUENCY = 101, - DISPID_TUNER_TS_AR_MAXFREQUENCY = 102, - DISPID_TUNER_TS_AR_STEP = 103, - - // DISPIDs for IAnalogTVTuningSpace interface - DISPID_TUNER_TS_ATV_MINCHANNEL = 101, - DISPID_TUNER_TS_ATV_MAXCHANNEL = 102, - DISPID_TUNER_TS_ATV_INPUTTYPE = 103, - DISPID_TUNER_TS_ATV_COUNTRYCODE = 104, - - // DISPIDs for IATSCTuningSpace interface - DISPID_TUNER_TS_ATSC_MINMINORCHANNEL = 201, - DISPID_TUNER_TS_ATSC_MAXMINORCHANNEL = 202, - DISPID_TUNER_TS_ATSC_MINPHYSCHANNEL = 203, - DISPID_TUNER_TS_ATSC_MAXPHYSCHANNEL = 204, - - // DISPID for IAnalogTVAudioComponent interface - DISPID_CHTUNER_ATVAC_CHANNEL = 101, - - // DISPIDs for IAnalogTVDataComponent interface - DISPID_CHTUNER_ATVDC_SYSTEM = 101, - DISPID_CHTUNER_ATVDC_CONTENT = 102, - - // DISPID for IChannelTuneRequest interface - DISPID_CHTUNER_CTR_CHANNEL = 101, - - // DISPID IATSCChannelTuneRequest - DISPID_CHTUNER_ACTR_MINOR_CHANNEL = 201, - - // DISPIDs for IDVBComponent interface - DISPID_DVBTUNER_DVBC_ATTRIBUTESVALID = 101, - DISPID_DVBTUNER_DVBC_PID = 102, - DISPID_DVBTUNER_DVBC_TAG = 103, - DISPID_DVBTUNER_DVBC_COMPONENTTYPE = 104, - - // DISPIDs for IDVBTuneRequest interface - DISPID_DVBTUNER_ONID = 101, - DISPID_DVBTUNER_TSID = 102, - DISPID_DVBTUNER_SID = 103, - - }; - - - ////////////////////////////////////////////////////////////////////////////////////// - // Tuning Space Container - ////////////////////////////////////////////////////////////////////////////////////// - // simple read-only collection of tuning spaces for enumerating subsets of the total - // set of system tuning spaces - [ - object, - uuid(901284E4-33FE-4b69-8D63-634A596F3756), - dual, - oleautomation, - nonextensible, - helpstring("Tuning Space Collection Interface"), - pointer_default(unique) - ] - interface ITuningSpaces : IDispatch - { - - [propget, helpstring("Number of items in the collection")] - HRESULT Count( - [out, retval] long *Count - ); - - [propget, id(DISPID_NEWENUM), hidden, restricted] - HRESULT _NewEnum( - [out, retval] IEnumVARIANT** NewEnum - ); - - [id(DISPID_VALUE), - propget, - helpstring("Find the Tuning Space with the specified Index")] - HRESULT Item( - [in] VARIANT varIndex, - [out, retval] ITuningSpace** TuningSpace - ); - - [propget, hidden, restricted, - helpstring("convenience function so C++ apps don't have to unpack VARIANT")] - HRESULT EnumTuningSpaces( - [out, retval] IEnumTuningSpaces** NewEnum - ); - - } - - ////////////////////////////////////////////////////////////////////////////////////// - // Tuning Space Container - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - uuid(5B692E84-E2F1-11d2-9493-00C04F72D980), - dual, - oleautomation, - hidden, - nonextensible, - helpstring("Tuning Space Container Interface"), - pointer_default(unique) - ] - interface ITuningSpaceContainer : IDispatch - { - - [propget, helpstring("Number of items in the collection")] - HRESULT Count( - [out, retval] long *Count - ); - - [propget, id(DISPID_NEWENUM), hidden, restricted] - HRESULT _NewEnum( - [out, retval] IEnumVARIANT** NewEnum - ); - - [id(DISPID_VALUE), - propget, - helpstring("Find the Tuning Space with the specified Index")] - HRESULT Item( - [in] VARIANT varIndex, - [out, retval] ITuningSpace** TuningSpace - ); - [id(DISPID_VALUE), - propput, - helpstring("Change the Tuning Space with the specified Index")] - HRESULT Item([in] VARIANT varIndex, [in] ITuningSpace *TuningSpace); - - [helpstring("Returns the collection of Tuning Spaces with the same implementation")] - HRESULT TuningSpacesForCLSID( - [in] BSTR SpaceCLSID, - [out, retval] ITuningSpaces** NewColl - ); - - [hidden, restricted, - helpstring("Convenience Function for enumerating from C")] - HRESULT _TuningSpacesForCLSID( - [in] REFCLSID SpaceCLSID, - [out, retval] ITuningSpaces** NewColl - ); - - [helpstring("Returns the collection of Tuning Spaces matching the name")] - HRESULT TuningSpacesForName( - [in] BSTR Name, - [out, retval] ITuningSpaces** NewColl - ); - - [helpstring("Find Local ID Number of the specified Tuning Space")] - HRESULT FindID( - [in] ITuningSpace *TuningSpace, - [out, retval] long *ID - ); - - - [id(DISPID_ADDITEM), - helpstring("Add a new Tuning Space to the collection. This tuning space will be persisted unless removed")] - HRESULT Add( - [in] ITuningSpace* TuningSpace, - [out, retval] VARIANT* NewIndex - ); - - [propget, hidden, restricted, helpstring("Convenience Function for enumerating collection from C")] - HRESULT EnumTuningSpaces( - [out, retval] IEnumTuningSpaces **ppEnum - ); - - [id(DISPID_REMOVEITEM), - helpstring("Remove a Tuning Space from the collection. this tuning space will be deleted from the registry")] - HRESULT Remove( - [in] VARIANT Index - ); - - [propget, helpstring("Maximum number of items allowed in the collection")] - HRESULT MaxCount( - [out, retval] long *MaxCount - ); - - // we don't allow script to set this, but we do allow c code to change it. - [propput, hidden, restricted, helpstring("Maximum number of items allowed in the collection")] - HRESULT MaxCount( - [in] long MaxCount - ); - - } - - ////////////////////////////////////////////////////////////////////////////////////// - // Tuning Space Interfaces - ////////////////////////////////////////////////////////////////////////////////////// - - // note: the network type is the clsid of the tuning space implementation - [ - object, - uuid(061C6E30-E622-11d2-9493-00C04F72D980), - dual, - oleautomation, - nonextensible, - helpstring("Tuning Space Interface"), - pointer_default(unique) - ] - interface ITuningSpace : IDispatch - { - [propget, id(DISPID_TUNER_TS_UNIQUENAME), - helpstring("Unique name of the Tuning Space")] - HRESULT UniqueName( - [out, retval] BSTR *Name - ); - - [propput, id(DISPID_TUNER_TS_UNIQUENAME), - helpstring("Unique name of the Tuning Space")] - HRESULT UniqueName( - [in] BSTR Name - ); - - [propget, id(DISPID_TUNER_TS_FRIENDLYNAME), - helpstring("User-friendly name of the Tuning Space")] - HRESULT FriendlyName( - [out, retval] BSTR *Name - ); - - [propput, id(DISPID_TUNER_TS_FRIENDLYNAME), - helpstring("User-friendly name of the Tuning Space")] - HRESULT FriendlyName( - [in] BSTR Name - ); - - [propget, id(DISPID_TUNER_TS_CLSID), - helpstring("Returns the clsid of the tuning space implementation. provides script access to IPersist:GetClassID")] - HRESULT CLSID( - [out, retval] BSTR* SpaceCLSID - ); - - [propget, id(DISPID_TUNER_TS_NETWORKTYPE), - helpstring("Network Type (Network Proivder CLSID)")] - HRESULT NetworkType( - [out, retval] BSTR *NetworkTypeGuid - ); - [propput, id(DISPID_TUNER_TS_NETWORKTYPE), - helpstring("Network Type (Network Proivder CLSID)")] - HRESULT NetworkType( - [in] BSTR NetworkTypeGuid - ); - - [propget, id(DISPID_TUNER_TS__NETWORKTYPE), - helpstring("Network Type (Network Proivder CLSID)"), hidden, restricted] - HRESULT _NetworkType( - [out, retval] GUID* NetworkTypeGuid - ); - [propput, id(DISPID_TUNER_TS__NETWORKTYPE), - helpstring("Network Type (Network Proivder CLSID)"), hidden, restricted] - HRESULT _NetworkType( - [in] REFCLSID NetworkTypeGuid - ); - - [id(DISPID_TUNER_TS_CREATETUNEREQUEST), - helpstring("Create a Tune Request object")] - HRESULT CreateTuneRequest( - [out, retval] ITuneRequest **TuneRequest - ); - - [id(DISPID_TUNER_TS_ENUMCATEGORYGUIDS), hidden, restricted] - HRESULT EnumCategoryGUIDs( - [out, retval] IEnumGUID **ppEnum - ); - - [id(DISPID_TUNER_TS_ENUMDEVICEMONIKERS), hidden, restricted] - HRESULT EnumDeviceMonikers( - [out, retval] IEnumMoniker **ppEnum - ); - - [propget, id(DISPID_TUNER_TS_DEFAULTPREFERREDCOMPONENTTYPES)] - HRESULT DefaultPreferredComponentTypes( - [out, retval] IComponentTypes** ComponentTypes - ); - [propput, id(DISPID_TUNER_TS_DEFAULTPREFERREDCOMPONENTTYPES)] - HRESULT DefaultPreferredComponentTypes( - [in] IComponentTypes* NewComponentTypes - ); - - // the following property is for the network providers to store frequency/channel maps, frequency/transponder maps - // or whatever other mapping from carrier frequencies to frequency identifiers are appropriate for the tuning space - // in question. the bstr is treated as a binary blob. it is expected to contain embedded nulls, and it may be formatted - // internally in whatever fashion the network provider sees fit. - [propget, id(DISPID_TUNER_TS_FREQMAP), hidden, restricted] - HRESULT FrequencyMapping([out, retval] BSTR *pMapping); - [propput, id(DISPID_TUNER_TS_FREQMAP), hidden, restricted] - HRESULT FrequencyMapping(BSTR Mapping); - - // the following property provides a starting point for the initial IScanningTuner after installation - [propget, id(DISPID_TUNER_TS_DEFLOCATOR)] - HRESULT DefaultLocator([out, retval] ILocator **LocatorVal); - [propput, id(DISPID_TUNER_TS_DEFLOCATOR)] - HRESULT DefaultLocator([in]ILocator *LocatorVal); - - HRESULT Clone([out, retval] ITuningSpace **NewTS); - } - - ////////////////////////////////////////////////////////////////////////////////////// - [ - hidden, - restricted, - object, - uuid(8B8EB248-FC2B-11d2-9D8C-00C04F72D980), - pointer_default(unique) - ] - interface IEnumTuningSpaces : IUnknown - { - HRESULT Next( - [in] ULONG celt, - [out, size_is(celt), length_is(*pceltFetched)] - ITuningSpace** rgelt, - [out] ULONG* pceltFetched - ); - - HRESULT Skip( - [in] ULONG celt - ); - - HRESULT Reset(void); - - HRESULT Clone( - [out] IEnumTuningSpaces** ppEnum - ); - } - - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(ADA0B268-3B19-4e5b-ACC4-49F852BE13BA), - pointer_default(unique) - ] - interface IDVBTuningSpace : ITuningSpace - { - [propget, id(DISPID_TUNER_TS_DVB_SYSTEMTYPE), - helpstring("Type of DVB System") - ] - HRESULT SystemType( - [out, retval] DVBSystemType *SysType - ); - [propput, id(DISPID_TUNER_TS_DVB_SYSTEMTYPE), - helpstring("Type of DVB System") - ] - HRESULT SystemType( - [in] DVBSystemType SysType - ); - - } - - - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(2A6E293C-2595-11d3-B64C-00C04F79498E), - pointer_default(unique) - ] - interface IAnalogTVTuningSpace : ITuningSpace - { - [propget, id(DISPID_TUNER_TS_ATV_MINCHANNEL), - helpstring("Smallest channel number ever provided by this tuning space") - ] - HRESULT MinChannel( - [out, retval] long *MinChannelVal - ); - [propput, id(DISPID_TUNER_TS_ATV_MINCHANNEL), - helpstring("Smallest channel number ever provided by this tuning space") - ] - HRESULT MinChannel( - [in] long NewMinChannelVal - ); - [propget, id(DISPID_TUNER_TS_ATV_MAXCHANNEL), - helpstring("Largest channel number ever provided by this tuning space") - ] - HRESULT MaxChannel( - [out, retval] long *MaxChannelVal - ); - [propput, id(DISPID_TUNER_TS_ATV_MAXCHANNEL), - helpstring("Largest channel number ever provided by this tuning space") - ] - HRESULT MaxChannel( - [in] long NewMaxChannelVal - ); - [propget, id(DISPID_TUNER_TS_ATV_INPUTTYPE), - helpstring("Input type for this tuning space") - ] - HRESULT InputType([out, retval] TunerInputType *InputTypeVal); - [propput, id(DISPID_TUNER_TS_ATV_INPUTTYPE), - helpstring("Input type for this tuning space") - ] - HRESULT InputType([in] TunerInputType NewInputTypeVal); - [propget, id(DISPID_TUNER_TS_ATV_COUNTRYCODE), - helpstring("International dialing prefix for country of physical broadcast source") - ] - HRESULT CountryCode([out, retval] long *CountryCodeVal); - [propput, id(DISPID_TUNER_TS_ATV_COUNTRYCODE), - helpstring("International dialing prefix for country of physical broadcast source") - ] - HRESULT CountryCode([in] long NewCountryCodeVal); - } - - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(0369B4E2-45B6-11d3-B650-00C04F79498E), - pointer_default(unique) - ] - // note: we inherit ATSC from analog because we need the same properties. - // - the definition of channel is overloaded to be the major channel, - // - input type allows us to distinguish between broadcast and cable frequencies - // which allows us to use the atsc tuning space class for "open cable". - // - country code will allow us to redefine physical channel frequencies - // if any other countries adopt ATSC which may happen in Latin America in particular. - interface IATSCTuningSpace : IAnalogTVTuningSpace - { - [propget, id(DISPID_TUNER_TS_ATSC_MINMINORCHANNEL), - helpstring("Smallest minor channel number ever provided by this tuning space") - ] - HRESULT MinMinorChannel( - [out, retval] long *MinMinorChannelVal - ); - [propput, id(DISPID_TUNER_TS_ATSC_MINMINORCHANNEL), - helpstring("Smallest minor channel number ever provided by this tuning space") - ] - HRESULT MinMinorChannel( - [in] long NewMinMinorChannelVal - ); - [propget, id(DISPID_TUNER_TS_ATSC_MAXMINORCHANNEL), - helpstring("Largest minor channel number ever provided by this tuning space") - ] - HRESULT MaxMinorChannel( - [out, retval] long *MaxMinorChannelVal - ); - [propput, id(DISPID_TUNER_TS_ATSC_MAXMINORCHANNEL), - helpstring("Largest minor channel number ever provided by this tuning space") - ] - HRESULT MaxMinorChannel( - [in] long NewMaxMinorChannelVal - ); - [propget, id(DISPID_TUNER_TS_ATSC_MINPHYSCHANNEL), - helpstring("Smallest physical channel number ever provided by this tuning space") - ] - HRESULT MinPhysicalChannel( - [out, retval] long *MinPhysicalChannelVal - ); - [propput, id(DISPID_TUNER_TS_ATSC_MINPHYSCHANNEL), - helpstring("Smallest physical channel number ever provided by this tuning space") - ] - HRESULT MinPhysicalChannel( - [in] long NewMinPhysicalChannelVal - ); - [propget, id(DISPID_TUNER_TS_ATSC_MAXPHYSCHANNEL), - helpstring("Largest physical channel number ever provided by this tuning space") - ] - HRESULT MaxPhysicalChannel( - [out, retval] long *MaxPhysicalChannelVal - ); - [propput, id(DISPID_TUNER_TS_ATSC_MAXPHYSCHANNEL), - helpstring("Largest physical channel number ever provided by this tuning space") - ] - HRESULT MaxPhysicalChannel( - [in] long NewMaxPhysicalChannelVal - ); - - } - - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(2A6E293B-2595-11d3-B64C-00C04F79498E), - pointer_default(unique) - ] - interface IAnalogRadioTuningSpace : ITuningSpace { - [propget, id(DISPID_TUNER_TS_AR_MINFREQUENCY), - helpstring("Smallest frequency(khz) ever used by this tuning space") - ] - HRESULT MinFrequency( - [out, retval] long *MinFrequencyVal - ); - [propput, id(DISPID_TUNER_TS_AR_MINFREQUENCY), - helpstring("Smallest frequency(khz) ever used by this tuning space") - ] - HRESULT MinFrequency( - [in] long NewMinFrequencyVal - ); - [propget, id(DISPID_TUNER_TS_AR_MAXFREQUENCY), - helpstring("Largest frequency(khz) ever used by this tuning space") - ] - HRESULT MaxFrequency( - [out, retval] long *MaxFrequencyVal - ); - [propput, id(DISPID_TUNER_TS_AR_MAXFREQUENCY), - helpstring("Largest frequency(khz) ever used by this tuning space") - ] - HRESULT MaxFrequency( - [in] long NewMaxFrequencyVal - ); - [propget, id(DISPID_TUNER_TS_AR_STEP), - helpstring("Default step value(khz) to next frequency for this tuning space") - ] - HRESULT Step( - [out, retval] long *StepVal - ); - [propput, id(DISPID_TUNER_TS_AR_STEP), - helpstring("Default step value(khz) to next frequency for this tuning space") - ] - HRESULT Step( - [in] long NewStepVal - ); - } - - - ////////////////////////////////////////////////////////////////////////////////////// - // Tune Request Interfaces - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - nonextensible, - uuid(07DDC146-FC3D-11d2-9D8C-00C04F72D980), - dual, - oleautomation, - helpstring("Tune Request Interface"), - pointer_default(unique) - ] - interface ITuneRequest : IDispatch - { - [propget, id(DISPID_TUNER_TR_TUNINGSPACE), - helpstring("Tuning Space object")] - HRESULT TuningSpace( - [out, retval] ITuningSpace **TuningSpace - ); - [propget, id(DISPID_TUNER_TR_COMPONENTS), - helpstring("Components collection")] - HRESULT Components( - [out, retval] IComponents **Components - ); - [id(DISPID_TUNER_TR_CLONE), - helpstring("Create a new copy of this tune request")] - HRESULT Clone( - [out, retval] ITuneRequest **NewTuneRequest - ); - [propget, id(DISPID_TUNER_TR_LOCATOR), - helpstring("Locator Object")] - HRESULT Locator( - [out, retval] ILocator **Locator - ); - [propput, id(DISPID_TUNER_TR_LOCATOR), - helpstring("Locator Object")] - HRESULT Locator( - [in] ILocator *Locator - ); - } - - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - nonextensible, - uuid(0369B4E0-45B6-11d3-B650-00C04F79498E), - dual, - oleautomation, - helpstring("Channel Tune Request Interface"), - pointer_default(unique) - ] - interface IChannelTuneRequest : ITuneRequest - { - [propget, id(DISPID_CHTUNER_CTR_CHANNEL), - helpstring("Channel")] - HRESULT Channel( - [out, retval] long *Channel - ); - [propput, id(DISPID_CHTUNER_CTR_CHANNEL), - helpstring("Channel")] - HRESULT Channel( - [in] long Channel - ); - } - - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - nonextensible, - uuid(0369B4E1-45B6-11d3-B650-00C04F79498E), - dual, - oleautomation, - helpstring("ATSC Channel Tune Request Interface"), - pointer_default(unique) - ] - interface IATSCChannelTuneRequest : IChannelTuneRequest - { - [propget, id(DISPID_CHTUNER_ACTR_MINOR_CHANNEL), - helpstring("Minor Channel")] - HRESULT MinorChannel( - [out, retval] long *MinorChannel - ); - [propput, id(DISPID_CHTUNER_ACTR_MINOR_CHANNEL), - helpstring("Minor Channel")] - HRESULT MinorChannel( - [in] long MinorChannel - ); - } - - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - nonextensible, - uuid(0D6F567E-A636-42bb-83BA-CE4C1704AFA2), - dual, - oleautomation, - helpstring("DVB Tune Request Interface"), - pointer_default(unique) - ] - interface IDVBTuneRequest : ITuneRequest - { - [propget, id(DISPID_DVBTUNER_ONID), - helpstring("Original Network ID")] - HRESULT ONID( - [out, retval] long *ONID - ); - [propput, id(DISPID_DVBTUNER_ONID), - helpstring("Original Network ID")] - HRESULT ONID( - [in] long ONID - ); - [propget, id(DISPID_DVBTUNER_TSID), - helpstring("Transport Stream ID")] - HRESULT TSID( - [out, retval] long *TSID - ); - [propput, id(DISPID_DVBTUNER_TSID), - helpstring("Transport Stream ID")] - HRESULT TSID( - [in] long TSID - ); - [propget, id(DISPID_DVBTUNER_SID), - helpstring("Service ID")] - HRESULT SID( - [out, retval] long *SID - ); - [propput, id(DISPID_DVBTUNER_SID), - helpstring("Service ID")] - HRESULT SID( - [in] long SID - ); - } - - ////////////////////////////////////////////////////////////////////////////////////// - // Tuner Interfaces - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(28C52640-018A-11d3-9D8E-00C04F72D980), - helpstring("Tuner Interface"), - pointer_default(unique) - ] - interface ITuner : IUnknown - { - [propget, helpstring("Tuning Space object")] - HRESULT TuningSpace( - [out, retval] ITuningSpace **TuningSpace - ); - - [propput, helpstring("Tuning Space object")] - HRESULT TuningSpace( - [in] ITuningSpace *TuningSpace - ); - - [hidden, restricted, helpstring("Returns an enumerator for Tuning Spaces accepted by this tuner")] - HRESULT EnumTuningSpaces( - [out, retval] IEnumTuningSpaces **ppEnum - ); - - [propget, helpstring("Tune Request object")] - HRESULT TuneRequest( - [out, retval] ITuneRequest **TuneRequest - ); - - [propput, helpstring("Tune Request object")] - HRESULT TuneRequest( - [in] ITuneRequest *TuneRequest - ); - - [helpstring("Validate the tuning request without tuning")] - HRESULT Validate( - [in] ITuneRequest *TuneRequest - ); - - [propget, helpstring("Preferred Component Types collection")] - HRESULT PreferredComponentTypes( - [out, retval] IComponentTypes **ComponentTypes - ); - - [propput, helpstring("Preferred Component Types collection")] - HRESULT PreferredComponentTypes( - [in] IComponentTypes *ComponentTypes - ); - - [propget, helpstring("Signal Strength")] - HRESULT SignalStrength( - [out, retval] long *Strength - ); - - [helpstring("Trigger Signal events (interval in milliseconds; 0 turns off trigger)")] - HRESULT TriggerSignalEvents( - [in] long Interval - ); - } - - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(1DFD0A5C-0284-11d3-9D8E-00C04F72D980), - helpstring("Scanning Tuner Interface"), - pointer_default(unique) - ] - interface IScanningTuner : ITuner - { - [helpstring("Seek to the next valid selection")] - HRESULT SeekUp( - ); - - [helpstring("Seek to the previous valid selection")] - HRESULT SeekDown( - ); - - [helpstring("Scan for valid selections upward")] - HRESULT ScanUp( - [in] long MillisecondsPause - ); - - [helpstring("Scan for valid selections downward")] - HRESULT ScanDown( - [in] long MillisecondsPause - ); - - [helpstring("Enter the device's autoprogram mode")] - HRESULT AutoProgram( - ); - }; - - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(68481420-0280-11d3-9D8E-00C04F72D980), - helpstring("Tuner Events Interface"), - pointer_default(unique) - ] - interface ITunerEvents : IUnknown - { - [helpstring("Reports a completed (or failed) tune operation")] - HRESULT OnTune( - [in] ITuneRequest **Request, - [in] long *Strength - ); - } - - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(85E2439E-0E23-11d3-9D8E-00C04F72D980), - helpstring("Signal Events Interface"), - pointer_default(unique) - ] - interface ISignalEvents : IUnknown - { - [helpstring("Reports the signal strength")] - HRESULT OnSignal( - [out] long *Strength - ); - } - - ////////////////////////////////////////////////////////////////////////////////////// - // Component Type Interfaces - ////////////////////////////////////////////////////////////////////////////////////// - - // Component Category - - [ - object, - hidden, - nonextensible, - uuid(6A340DC0-0311-11d3-9D8E-00C04F72D980), - dual, - oleautomation, - helpstring("Component Type Interface"), - pointer_default(unique) - ] - interface IComponentType : IDispatch - { - [propget, id(DISPID_TUNER_CT_CATEGORY), - helpstring("General category of component")] - HRESULT Category( - [out, retval] ComponentCategory *Category - ); - [propput, id(DISPID_TUNER_CT_CATEGORY), - helpstring("General category of component")] - HRESULT Category( - [in] ComponentCategory Category - ); - - [propget, id(DISPID_TUNER_CT_MEDIAMAJORTYPE), - helpstring("DirectShow MediaType Major Type Guid")] - HRESULT MediaMajorType( - [out, retval] BSTR *MediaMajorType - ); - [propput, id(DISPID_TUNER_CT_MEDIAMAJORTYPE), - helpstring("DirectShow MediaType Major Type Guid")] - HRESULT MediaMajorType( - [in] BSTR MediaMajorType - ); - [propget, id(DISPID_TUNER_CT__MEDIAMAJORTYPE), - helpstring("DirectShow MediaType Major Type Guid"), hidden, restricted] - HRESULT _MediaMajorType( - [out, retval] GUID* MediaMajorTypeGuid - ); - [propput, id(DISPID_TUNER_CT__MEDIAMAJORTYPE), - helpstring("DirectShow MediaType Major Type Guid"), hidden, restricted] - HRESULT _MediaMajorType( - [in] REFCLSID MediaMajorTypeGuid - ); - [propget, id(DISPID_TUNER_CT_MEDIASUBTYPE), - helpstring("DirectShow MediaType Sub Type Guid")] - HRESULT MediaSubType( - [out, retval] BSTR *MediaSubType - ); - [propput, id(DISPID_TUNER_CT_MEDIASUBTYPE), - helpstring("DirectShow MediaType Sub Type Guid")] - HRESULT MediaSubType( - [in] BSTR MediaSubType - ); - [propget, id(DISPID_TUNER_CT__MEDIASUBTYPE), - helpstring("DirectShow MediaType Sub Type Guid"), hidden, restricted] - HRESULT _MediaSubType( - [out, retval] GUID* MediaSubTypeGuid - ); - [propput, id(DISPID_TUNER_CT__MEDIASUBTYPE), - helpstring("DirectShow MediaType Sub Type Guid"), hidden, restricted] - HRESULT _MediaSubType( - [in] REFCLSID MediaSubTypeGuid - ); - [propget, id(DISPID_TUNER_CT_MEDIAFORMATTYPE), - helpstring("DirectShow MediaType Format Guid")] - HRESULT MediaFormatType( - [out, retval] BSTR *MediaFormatType - ); - [propput, id(DISPID_TUNER_CT_MEDIAFORMATTYPE), - helpstring("DirectShow MediaType Format Guid")] - HRESULT MediaFormatType( - [in] BSTR MediaFormatType - ); - [propget, id(DISPID_TUNER_CT__MEDIAFORMATTYPE), - helpstring("DirectShow MediaType Format Guid"), hidden, restricted] - HRESULT _MediaFormatType( - [out, retval] GUID* MediaFormatTypeGuid - ); - [propput, id(DISPID_TUNER_CT__MEDIAFORMATTYPE), - helpstring("DirectShow MediaType Format Guid"), hidden, restricted] - HRESULT _MediaFormatType( - [in] REFCLSID MediaFormatTypeGuid - ); - - [propget, id(DISPID_TUNER_CT_MEDIATYPE), hidden, restricted, - helpstring("DirectShow MediaType Guid, this only retrieves major, sub, format guids not the entire struct")] - HRESULT MediaType( - [out, retval] AM_MEDIA_TYPE *MediaType - ); - [propput, id(DISPID_TUNER_CT_MEDIATYPE), hidden, restricted, - helpstring("DirectShow MediaType Guid, this only retrieves major, sub, format guids not the entire struct")] - HRESULT MediaType( - [in] AM_MEDIA_TYPE *MediaType - ); - - [id(DISPID_TUNER_CT_CLONE), - helpstring("Create a copy of this component type")] - HRESULT Clone( - [out, retval] IComponentType **NewCT - ); - }; - - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(B874C8BA-0FA2-11d3-9D8E-00C04F72D980), - dual, - oleautomation, - helpstring("Language Component Type Interface"), - pointer_default(unique) - ] - interface ILanguageComponentType : IComponentType - { - [propget, id(DISPID_TUNER_LCT_LANGID), - helpstring("Language Identifier for Substream Content Language")] - HRESULT LangID( - [out, retval] long *LangID - ); - - [propput, id(DISPID_TUNER_LCT_LANGID), - helpstring("Language Identifier for Substream Content Language")] - HRESULT LangID( - [in] long LangID - ); - }; - - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(2C073D84-B51C-48c9-AA9F-68971E1F6E38), - dual, - oleautomation, - helpstring("MPEG2 Component Type Interface"), - pointer_default(unique) - ] - interface IMPEG2ComponentType : ILanguageComponentType - { - [propget, id(DISPID_TUNER_MP2CT_TYPE), - helpstring("MPEG2 Stream Type")] - HRESULT StreamType( - [out, retval] MPEG2StreamType *MP2StreamType - ); - - [propput, id(DISPID_TUNER_MP2CT_TYPE), - helpstring("MPEG2 Stream Type")] - HRESULT StreamType( - [in] MPEG2StreamType MP2StreamType - ); - }; - - ////////////////////////////////////////////////////////////////////////////////////// - - [ - object, - hidden, - nonextensible, - uuid(FC189E4D-7BD4-4125-B3B3-3A76A332CC96), - dual, - oleautomation, - helpstring("ATSC Component Type Interface"), - pointer_default(unique) - ] - interface IATSCComponentType : IMPEG2ComponentType - { - [propget, id(DISPID_TUNER_ATSCCT_FLAGS), - helpstring("ATSC Component Type Flags")] - HRESULT Flags( - [out, retval] long *Flags - ); - - [propput, id(DISPID_TUNER_ATSCCT_FLAGS), - helpstring("ATSC Component Type Flags")] - HRESULT Flags( - [in] long flags - ); - }; - - ////////////////////////////////////////////////////////////////////////////////////// - [ - hidden, restricted, - object, - uuid(8A674B4A-1F63-11d3-B64C-00C04F79498E), - pointer_default(unique) - ] - interface IEnumComponentTypes : IUnknown - { - HRESULT Next( - [in] ULONG celt, - [out, size_is(celt), length_is(*pceltFetched)] - IComponentType** rgelt, - [out] ULONG* pceltFetched - ); - - HRESULT Skip( - [in] ULONG celt - ); - - HRESULT Reset(void); - - HRESULT Clone( - [out] IEnumComponentTypes** ppEnum - ); - } - - - ////////////////////////////////////////////////////////////////////////////////////// - // Component Type Container - ////////////////////////////////////////////////////////////////////////////////////// - - [ - object, - hidden, - nonextensible, - uuid(0DC13D4A-0313-11d3-9D8E-00C04F72D980), - dual, - oleautomation, - helpstring("ComponentType Collection Interface"), - pointer_default(unique) - ] - interface IComponentTypes : IDispatch - { - [propget, helpstring("Number of items in the collection")] - HRESULT Count( - [out, retval] long *Count - ); - - [propget, id(DISPID_NEWENUM), hidden, restricted] - HRESULT _NewEnum( - [out, retval] IEnumVARIANT **ppNewEnum - ); - - [hidden, restricted, helpstring("Convenience Function for Use with C")] - HRESULT EnumComponentTypes( - [out, retval] IEnumComponentTypes **ppNewEnum - ); - - [id(DISPID_VALUE), - propget, - helpstring("Get the ComponentType at the specified index")] - HRESULT Item( - [in] VARIANT Index, - [out, retval] IComponentType **ComponentType - ); - - [id(DISPID_VALUE), - propput, - helpstring("Get the ComponentType at the specified index")] - HRESULT Item( - [in] VARIANT Index, - [in] IComponentType *ComponentType - ); - - [id(DISPID_ADDITEM), - helpstring("Append the ComponentType to the collection")] - HRESULT Add( - [in] IComponentType *ComponentType, - [out, retval] VARIANT *NewIndex - ); - - [id(DISPID_REMOVEITEM), - helpstring("Clear the collection")] - HRESULT Remove( - [in] VARIANT Index - ); - - [helpstring("Copy the collection")] - HRESULT Clone([out, retval] IComponentTypes **NewList); - }; - - ////////////////////////////////////////////////////////////////////////////////////// - // Component Interfaces - ////////////////////////////////////////////////////////////////////////////////////// - - [ - object, - nonextensible, - uuid(1A5576FC-0E19-11d3-9D8E-00C04F72D980), - dual, - oleautomation, - helpstring("Component Interface"), - pointer_default(unique) - ] - interface IComponent : IDispatch - { - [propget, id(DISPID_TUNER_C_TYPE), - helpstring("Component Type")] - HRESULT Type( - [out, retval] IComponentType** CT - ); - - // only loaders initialize components - [hidden, restricted, propput, id(DISPID_TUNER_C_TYPE), - helpstring("Component Type")] - HRESULT Type( - [in] IComponentType* CT - ); - - // NOTE: this langid is *not* the same as the langid - // in the componenttype(if the componenttype is a languagecomponenttype) - // the langid in the component type is the language of the content this - // component is describing. the following langid in the component is the - // language of the descriptive info in the component object. - [propget, id(DISPID_TUNER_C_LANGID), - helpstring("Language Identifier for Description Language")] - HRESULT DescLangID( - [out, retval] long *LangID - ); - - [propput, id(DISPID_TUNER_C_LANGID), - helpstring("Language Identifier for Description Language")] - HRESULT DescLangID( - [in] long LangID - ); - - [propget, id(DISPID_TUNER_C_STATUS), - helpstring("Component Status")] - HRESULT Status( - [out, retval] ComponentStatus *Status - ); - - [propput, id(DISPID_TUNER_C_STATUS), - helpstring("Component Status")] - HRESULT Status( - [in] ComponentStatus Status - ); - - [propget, id(DISPID_TUNER_C_DESCRIPTION), - helpstring("Component Description")] - HRESULT Description( - [out, retval] BSTR *Description - ); - - // restricted: only loaders will initialize components - [hidden, restricted, propput, id(DISPID_TUNER_C_DESCRIPTION), - helpstring("Component Description")] - HRESULT Description( - [in] BSTR Description - ); - - [id(DISPID_TUNER_C_CLONE), - helpstring("Copy Component")] - HRESULT Clone( - [out, retval] IComponent **NewComponent - ); - - }; - - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - nonextensible, - uuid(1493E353-1EB6-473c-802D-8E6B8EC9D2A9), - dual, - oleautomation, - helpstring("MPEG2 Component Interface"), - pointer_default(unique) - ] - interface IMPEG2Component : IComponent - { - [propget, id(DISPID_TUNER_C_MP2_PID), - helpstring("MPEG2 Packet ID for this Substream")] - HRESULT PID( - [out, retval] long *PID - ); - - [propput, id(DISPID_TUNER_C_MP2_PID), - helpstring("MPEG2 Packet ID for this Substream")] - HRESULT PID( - [in] long PID - ); - [propget, id(DISPID_TUNER_C_MP2_PCRPID), - helpstring("MPEG2 Packet ID for this Substream's Timestamps")] - HRESULT PCRPID( - [out, retval] long *PCRPID - ); - - [propput, id(DISPID_TUNER_C_MP2_PCRPID), - helpstring("MPEG2 Packet ID for this Substream's Timestamps")] - HRESULT PCRPID( - [in] long PCRPID - ); - - // program number provides reverse lookup to PAT - [propget, id(DISPID_TUNER_C_MP2_PROGNO), - helpstring("MPEG2 Program Number")] - HRESULT ProgramNumber( - [out, retval] long *ProgramNumber - ); - - [propput, id(DISPID_TUNER_C_MP2_PROGNO), - helpstring("MPEG2 Program Number")] - HRESULT ProgramNumber( - [in] long ProgramNumber - ); - }; - - ////////////////////////////////////////////////////////////////////////////////////// - [ - hidden, restricted, - object, - uuid(2A6E2939-2595-11d3-B64C-00C04F79498E), - pointer_default(unique) - ] - interface IEnumComponents : IUnknown - { - HRESULT Next( - [in] ULONG celt, - [out, size_is(celt), length_is(*pceltFetched)] - IComponent** rgelt, - [out] ULONG* pceltFetched - ); - - HRESULT Skip( - [in] ULONG celt - ); - - HRESULT Reset(void); - - HRESULT Clone( - [out] IEnumComponents** ppEnum - ); - } - - - ////////////////////////////////////////////////////////////////////////////////////// - // Component Container - ////////////////////////////////////////////////////////////////////////////////////// - - [ - object, - nonextensible, - uuid(FCD01846-0E19-11d3-9D8E-00C04F72D980), - dual, - oleautomation, - helpstring("Component Collection Interface"), - pointer_default(unique) - ] - interface IComponents : IDispatch - { - [propget, helpstring("Number of items in the collection")] - HRESULT Count( - [out, retval] long *Count - ); - - [propget, id(DISPID_NEWENUM), hidden, restricted] - HRESULT _NewEnum( - [out, retval] IEnumVARIANT **ppNewEnum - ); - - [hidden, restricted, helpstring("Convenience Function for Use with C")] - HRESULT EnumComponents( - [out, retval] IEnumComponents **ppNewEnum - ); - - [id(DISPID_VALUE), - propget, - helpstring("Get the Component at the specified index")] - HRESULT Item( - [in] VARIANT Index, - [out, retval] IComponent **ppComponent - ); - - [id(DISPID_ADDITEM), - helpstring("Add the Component to the collection")] - HRESULT Add( - [in] IComponent *Component, - [out, retval] VARIANT *NewIndex - ); - - [id(DISPID_REMOVEITEM), - helpstring("Remove the Component at the specified index")] - HRESULT Remove( - [in] VARIANT Index - ); - - [helpstring("Copy the collection")] - HRESULT Clone([out, retval] IComponents **NewList); - }; - - ////////////////////////////////////////////////////////////////////////////////////// - // Component Container - ////////////////////////////////////////////////////////////////////////////////////// - // this separates the what(general tune request properties) from the where - - - - [ - object, - nonextensible, - uuid(286D7F89-760C-4F89-80C4-66841D2507AA), - dual, - oleautomation, - helpstring("Generic Locator Information"), - pointer_default(unique) - ] - interface ILocator : IDispatch - { - - [propget, id(DISPID_TUNER_L_CARRFREQ), helpstring("Carrier Frequency(DecaHertz)")] - HRESULT CarrierFrequency( - [out, retval] long* Frequency - ); - [propput, id(DISPID_TUNER_L_CARRFREQ), helpstring("Carrier Frequency(DecaHertz)")] - HRESULT CarrierFrequency( - [in] long Frequency - ); - [propget, id(DISPID_TUNER_L_INNERFECMETHOD), helpstring("Inner Fec Type")] - HRESULT InnerFEC( - [out, retval] FECMethod* FEC - ); - [propput, id(DISPID_TUNER_L_INNERFECMETHOD), helpstring("Inner Fec Type")] - HRESULT InnerFEC( - [in] FECMethod FEC - ); - [propget, id(DISPID_TUNER_L_INNERFECRATE), helpstring("Inner Fec Rate")] - HRESULT InnerFECRate( - [out, retval] BinaryConvolutionCodeRate* FEC - ); - [propput, id(DISPID_TUNER_L_INNERFECRATE), helpstring("Inner Fec Rate")] - HRESULT InnerFECRate( - [in] BinaryConvolutionCodeRate FEC - ); - [propget, id(DISPID_TUNER_L_OUTERFECMETHOD), helpstring("Outer Fec Type")] - HRESULT OuterFEC( - [out, retval] FECMethod* FEC - ); - [propput, id(DISPID_TUNER_L_OUTERFECMETHOD), helpstring("Outer Fec Type")] - HRESULT OuterFEC( - [in] FECMethod FEC - ); - [propget, id(DISPID_TUNER_L_OUTERFECRATE), helpstring("Outer Fec Rate")] - HRESULT OuterFECRate( - [out, retval] BinaryConvolutionCodeRate* FEC - ); - [propput, id(DISPID_TUNER_L_OUTERFECRATE), helpstring("Outer Fec Rate")] - HRESULT OuterFECRate( - [in] BinaryConvolutionCodeRate FEC - ); - [propget, id(DISPID_TUNER_L_MOD), helpstring("Modulation Type")] - HRESULT Modulation( - [out, retval] ModulationType* Modulation - ); - [propput, id(DISPID_TUNER_L_MOD), helpstring("Modulation Type")] - HRESULT Modulation( - [in] ModulationType Modulation - ); - [propget, id(DISPID_TUNER_L_SYMRATE), helpstring("Modulation Symbol Rate")] - HRESULT SymbolRate( - [out, retval] long* Rate - ); - [propput, id(DISPID_TUNER_L_SYMRATE), helpstring("Modulation Symbol Rate")] - HRESULT SymbolRate( - [in] long Rate - ); - [id(DISPID_TUNER_L_CLONE), helpstring("Copy the Locator")] - HRESULT Clone([out, retval] ILocator **NewLocator); - }; - - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(BF8D986F-8C2B-4131-94D7-4D3D9FCC21EF), - dual, - oleautomation, - helpstring("ATSC Locator Information"), - pointer_default(unique) - ] - interface IATSCLocator : ILocator - { - [propget, id(DISPID_TUNER_L_ATSC_PHYS_CHANNEL), - helpstring("Physical Channel")] - HRESULT PhysicalChannel( - [out, retval] long *PhysicalChannel - ); - [propput, id(DISPID_TUNER_L_ATSC_PHYS_CHANNEL), - helpstring("Physical Channel")] - HRESULT PhysicalChannel( - [in] long PhysicalChannel - ); - [propget, id(DISPID_TUNER_L_ATSC_TSID), - helpstring("Transport Stream ID")] - HRESULT TSID( - [out, retval] long *TSID - ); - [propput, id(DISPID_TUNER_L_ATSC_TSID), - helpstring("Transport Stream ID")] - HRESULT TSID( - [in] long TSID - ); - }; - - ////////////////////////////////////////////////////////////////////////////////////// - - [ - object, - hidden, - nonextensible, - uuid(8664DA16-DDA2-42ac-926A-C18F9127C302), - dual, - oleautomation, - helpstring("DVB Terrestrial Locator Information"), - pointer_default(unique) - ] - interface IDVBTLocator : ILocator - { - [propget, id(DISPID_TUNER_L_DVBT_BANDWIDTH), helpstring("Bandwidth")] - HRESULT Bandwidth( - [out, retval] long* BandWidthVal - ); - [propput, id(DISPID_TUNER_L_DVBT_BANDWIDTH), helpstring("Bandwidth")] - HRESULT Bandwidth( - [in] long BandwidthVal - ); - - [propget, id(DISPID_TUNER_L_DVBT_LPINNERFECMETHOD), helpstring("Inner Fec Type for Low Priority Stream")] - HRESULT LPInnerFEC( - [out, retval] FECMethod* FEC - ); - [propput, id(DISPID_TUNER_L_DVBT_LPINNERFECMETHOD), helpstring("Inner Fec Type for Low Priority Stream")] - HRESULT LPInnerFEC( - [in] FECMethod FEC - ); - [propget, id(DISPID_TUNER_L_DVBT_LPINNERFECRATE), helpstring("Inner Fec Rate for Low Priority Stream")] - HRESULT LPInnerFECRate( - [out, retval] BinaryConvolutionCodeRate* FEC - ); - [propput, id(DISPID_TUNER_L_DVBT_LPINNERFECRATE), helpstring("Inner Fec Rate for Low Priority Stream")] - HRESULT LPInnerFECRate( - [in] BinaryConvolutionCodeRate FEC - ); - [propget, id(DISPID_TUNER_L_DVBT_HALPHA), helpstring("Hierarchical Alpha")] - HRESULT HAlpha( - [out, retval] HierarchyAlpha* Alpha - ); - [propput, id(DISPID_TUNER_L_DVBT_HALPHA), helpstring("Hierarchical Alpha")] - HRESULT HAlpha( - [in] HierarchyAlpha Alpha - ); - [propget, id(DISPID_TUNER_L_DVBT_GUARDINTERVAL), helpstring("Guard Interval")] - HRESULT Guard( - [out, retval] GuardInterval* GI - ); - [propput, id(DISPID_TUNER_L_DVBT_GUARDINTERVAL), helpstring("Guard Interval")] - HRESULT Guard( - [in] GuardInterval GI - ); - [propget, id(DISPID_TUNER_L_DVBT_TRANSMISSIONMODE), helpstring("Transmission Mode")] - HRESULT Mode( - [out, retval] TransmissionMode* mode - ); - [propput, id(DISPID_TUNER_L_DVBT_TRANSMISSIONMODE), helpstring("Transmission Mode")] - HRESULT Mode( - [in] TransmissionMode mode - ); - [propget, id(DISPID_TUNER_L_DVBT_INUSE), helpstring("Hierarchical Alpha")] - HRESULT OtherFrequencyInUse( - [out, retval] VARIANT_BOOL* OtherFrequencyInUseVal - ); - [propput, id(DISPID_TUNER_L_DVBT_INUSE), helpstring("Hierarchical Alpha")] - HRESULT OtherFrequencyInUse( - [in] VARIANT_BOOL OtherFrequencyInUseVal - ); - }; - - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(3D7C353C-0D04-45f1-A742-F97CC1188DC8), - dual, - oleautomation, - helpstring("DVB Satellite Locator Information"), - pointer_default(unique) - ] - interface IDVBSLocator : ILocator - { - - [propget, id(DISPID_TUNER_L_DVBS_POLARISATION), helpstring("Signal Polarisation Type")] - HRESULT SignalPolarisation( - [out, retval] Polarisation* PolarisationVal - ); - [propput, id(DISPID_TUNER_L_DVBS_POLARISATION), helpstring("Signal Polarisation Type")] - HRESULT SignalPolarisation( - [in] Polarisation PolarisationVal - ); - [propget, id(DISPID_TUNER_L_DVBS_WEST), helpstring("VARIANT_TRUE means orbital position specifies west longitude")] - HRESULT WestPosition( - [out, retval] VARIANT_BOOL* WestLongitude - ); - [propput, id(DISPID_TUNER_L_DVBS_WEST), helpstring("VARIANT_TRUE means orbital position specifies west longitude")] - HRESULT WestPosition( - [in] VARIANT_BOOL WestLongitude - ); - [propget, id(DISPID_TUNER_L_DVBS_ORBITAL), helpstring("Longitude in tenths of a degree")] - HRESULT OrbitalPosition( - [out, retval] long* longitude - ); - [propput, id(DISPID_TUNER_L_DVBS_ORBITAL), helpstring("Longitude in tenths of a degree")] - HRESULT OrbitalPosition( - [in] long longitude - ); - [propget, id(DISPID_TUNER_L_DVBS_AZIMUTH), helpstring("Azimuth in tenths of a degree")] - HRESULT Azimuth( - [out, retval] long* Azimuth - ); - [propput, id(DISPID_TUNER_L_DVBS_AZIMUTH), helpstring("Azimuth in tenths of a degree")] - HRESULT Azimuth( - [in] long Azimuth - ); - [propget, id(DISPID_TUNER_L_DVBS_ELEVATION), helpstring("Elevation in tenths of a degree")] - HRESULT Elevation( - [out, retval] long* Elevation - ); - [propput, id(DISPID_TUNER_L_DVBS_ELEVATION), helpstring("Elevation in tenths of a degree")] - HRESULT Elevation( - [in] long Elevation - ); - }; - - ////////////////////////////////////////////////////////////////////////////////////// - [ - object, - hidden, - nonextensible, - uuid(6E42F36E-1DD2-43c4-9F78-69D25AE39034), - dual, - oleautomation, - helpstring("DVB Cable Locator Information"), - pointer_default(unique) - ] - interface IDVBCLocator : ILocator - { - }; - - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - // TYPELIB & CoClasses - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - [ - uuid(9B085638-018E-11d3-9D8E-00C04F72D980), - version(1.0), - helpstring("Microsoft Tuner 1.0 Type Library") - ] - library TunerLib - { - importlib("stdole2.tlb"); - - // SystemTuningSpaces class - [ - uuid(D02AAC50-027E-11d3-9D8E-00C04F72D980), - helpstring("SystemTuningSpace Class") - ] - coclass SystemTuningSpaces - { - [default] interface ITuningSpaceContainer; - }; - - // NOTE: there is no object factory for this class. the implementation for the underlying - // code is a c++ abstract base class. this coclass is only provided here to - // force vb to expose the base interface to enable polymorphic access to - // derived objects - [ - hidden, restricted, - uuid(5FFDC5E6-B83A-4b55-B6E8-C69E765FE9DB), - helpstring("dummy class to expose base tuning space i/f to VB") - ] - coclass TuningSpace - { - [default] interface ITuningSpace; - }; - - - [ - uuid(A2E30750-6C3D-11d3-B653-00C04F79498E), - helpstring("ATSC Digital Broadcast Tuning Space Class") - ] - coclass ATSCTuningSpace - { - [default] interface IATSCTuningSpace; - }; - - [ - uuid(8A674B4C-1F63-11d3-B64C-00C04F79498E), - helpstring("Analog Radio Tuning Space Class") - ] - coclass AnalogRadioTuningSpace - { - [default] interface IAnalogRadioTuningSpace; - }; - - [ - uuid(8A674B4D-1F63-11d3-B64C-00C04F79498E), - helpstring("Analog TV Tuning Space Class") - ] - coclass AnalogTVTuningSpace - { - [default] interface IAnalogTVTuningSpace; - }; - - [ - uuid(C6B14B32-76AA-4a86-A7AC-5C79AAF58DA7), - helpstring("DVB Tuning Space Class") - ] - coclass DVBTuningSpace - { - [default] interface IDVBTuningSpace; - }; - - - - // ComponentTypes container class - [ - uuid(A1A2B1C4-0E3A-11d3-9D8E-00C04F72D980), - helpstring("Component Types Collection Class") - ] - coclass ComponentTypes - { - [default] interface IComponentTypes; - }; - - // ComponentType class - [ - uuid(823535A0-0318-11d3-9D8E-00C04F72D980), - helpstring("ComponentType Class") - ] - coclass ComponentType - { - [default] interface IComponentType; - }; - - // Language ComponentType class - [ - uuid(1BE49F30-0E1B-11d3-9D8E-00C04F72D980), - helpstring("LanguageComponentType Class") - ] - coclass LanguageComponentType - { - [default] interface ILanguageComponentType; - }; - - // MPEG2 ComponentType class - [ - uuid(418008F3-CF67-4668-9628-10DC52BE1D08), - helpstring("MPEG2ComponentType Class") - ] - coclass MPEG2ComponentType - { - [default] interface IMPEG2ComponentType; - }; - - // ATSC ComponentType class - [ - uuid(A8DCF3D5-0780-4ef4-8A83-2CFFAACB8ACE), - helpstring("ATSCComponentType Class") - ] - coclass ATSCComponentType - { - [default] interface IATSCComponentType; - }; - - // Components class - [ - hidden, restricted, - uuid(809B6661-94C4-49e6-B6EC-3F0F862215AA), - helpstring("Components Collection Class") - ] - coclass Components - { - [default] interface IComponents; - }; - - // Component class - // the components can only be created by network provider/tif. client apps - // retrieve them from a filled-in tune request by either loading a persisted tune - // request that has been filled in by a proper guide store loader or by re-getting - // the current tune request property which will have this filled in by the network - // provider - [ - hidden, restricted, - uuid(59DC47A8-116C-11d3-9D8E-00C04F72D980), - helpstring("Component Class") - ] - coclass Component - { - [default] interface IComponent; - }; - - // MPEG2 Component class - [ - hidden, restricted, - uuid(055CB2D7-2969-45cd-914B-76890722F112), - helpstring("MPEG2 Component Class") - ] - coclass MPEG2Component - { - [default] interface IMPEG2Component; - }; - - - // NOTE: there is no object factory for this class. the implementation for the underlying - // code is a c++ abstract base class. this coclass is only provided here to - // force vb to expose the base interface to enable polymorphic access to - // derived objects - [ - hidden, restricted, - uuid(B46E0D38-AB35-4a06-A137-70576B01B39F), - helpstring("dummy class to expose base tune request i/f to VB") - ] - coclass TuneRequest - { - [default] interface ITuneRequest; - }; - - - // NOTE: the tuning request factories should not be invoked directly. - // instead apps should use ITuningSpace::CreateTuningRequest to obtain a correctly - // initialized tuning request of the appropriate type for that space. - // the object factories are provided to allow generic code to a load a previously persisted - // tune request object. - [ - hidden, - restricted, - uuid(0369B4E5-45B6-11d3-B650-00C04F79498E), - helpstring("Channel Tune Request") - ] - coclass ChannelTuneRequest - { - [default] interface IChannelTuneRequest; - }; - - [ - hidden, - restricted, - uuid(0369B4E6-45B6-11d3-B650-00C04F79498E), - helpstring("ATSC Channel Tune Request") - ] - coclass ATSCChannelTuneRequest - { - [default] interface IATSCChannelTuneRequest; - }; - - - // NOTE: there is no object factory for this class. the implementation for the underlying - // code is a c++ abstract base class. this coclass is only provided here to - // force vb to expose the base interface to enable polymorphic access to - // derived objects - [ - hidden, restricted, - uuid(0888C883-AC4F-4943-B516-2C38D9B34562), - helpstring("dummy class to expose base locator i/f to VB") - ] - coclass Locator - { - [default] interface ILocator; - }; - - // its not intended that client apps actually create locators. the network - // provider in combination with the transport information filter(TIF) are the - // only modules in the system that actually know the correct values for these objects - // however, for testing purposes, its necessary to allow these to be created. - // instead, normally these will simply be passed around opaquely since they're a - // property of the base tune request interface. - [ - uuid(8872FF1B-98FA-4d7a-8D93-C9F1055F85BB), - helpstring("ATSC Locator") - ] - coclass ATSCLocator - { - [default] interface IATSCLocator; - }; - - [ - uuid(9CD64701-BDF3-4d14-8E03-F12983D86664), - helpstring("DVB-Terrestrial Locator") - ] - coclass DVBTLocator - { - [default] interface IDVBTLocator; - }; - - [ - uuid(1DF7D126-4050-47f0-A7CF-4C4CA9241333), - helpstring("DVB-Satellite Locator") - ] - coclass DVBSLocator - { - [default] interface IDVBSLocator; - }; - - [ - uuid(C531D9FD-9685-4028-8B68-6E1232079F1E), - helpstring("DVB-Cable Locator") - ] - coclass DVBCLocator - { - [default] interface ILocator; - }; - - [ - hidden, - restricted, - uuid(15D6504A-5494-499c-886C-973C9E53B9F1), - helpstring("DVB Tune Request") - ] - coclass DVBTuneRequest - { - [default] interface IDVBTuneRequest; - }; - - // Sample tuner class definition: - // - // [ - // uuid(), - // helpstring("My Tuner object") - // ] - // coclass MyTuner - // { - // [default] interface ITuner; - // interface IMyTunerCustomFeatureInterface; - // [default, source] interface ITunerEvents; - // [source] interface ISignalEvents; - // }; - - /////////////////////////////////////////////////////////////////////////////////////// - // utility objects - /////////////////////////////////////////////////////////////////////////////////////// - [ - hidden, restricted, - uuid(8A674B49-1F63-11d3-B64C-00C04F79498E), - helpstring("Create property bag backed by registry") - ] - coclass CreatePropBagOnRegKey - { - interface ICreatePropBagOnRegKey; - }; - - } - - -#endif // DirectX 8.0 content - - -// end of file -- tuner.idl diff --git a/import/DirectX8/include/DShowIDL/videoacc.idl b/import/DirectX8/include/DShowIDL/videoacc.idl deleted file mode 100644 index 6a8703058..000000000 --- a/import/DirectX8/include/DShowIDL/videoacc.idl +++ /dev/null @@ -1,172 +0,0 @@ -//------------------------------------------------------------------------------ -// File: VideoAcc.idl -// -// Desc: An interface exposed by the overlay mixer to help decode samples -// using hardware video acceleration. -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -import "unknwn.idl"; - -cpp_quote("//") -cpp_quote("// The following declarations within the 'if 0' block are dummy typedefs used to make") -cpp_quote("// the motncomp.idl file build. The actual definitions are contained in ddraw.h and amva.h") -cpp_quote("//") -cpp_quote("#if 0") - -typedef void* LPVOID; -typedef void* LPGUID; -typedef void* LPDIRECTDRAWSURFACE; -typedef void* LPDDPIXELFORMAT; -typedef void* LPAMVAInternalMemInfo; -typedef void AMVAUncompDataInfo; -typedef void* LPAMVACompBufferInfo; -typedef void AMVABUFFERINFO; -typedef void AMVAEndFrameInfo; -typedef void* LPAMVAUncompBufferInfo; -typedef void AMVABeginFrameInfo; -typedef IUnknown* IMediaSample; - -cpp_quote("#endif") -cpp_quote("#include ") -cpp_quote("#include ") - - -[ - local, - object, - uuid(256A6A21-FBAD-11d1-82BF-00A0C9696C8F), - helpstring("IAMVideoAcceleratorNotify Interface"), - pointer_default(unique) -] - -// IAMVideoAcceleratorNotify -interface IAMVideoAcceleratorNotify : IUnknown -{ - // get information necessary to allocate uncompressed data buffers - // which is not part of the mediatype format (like how many buffers to allocate etc) - HRESULT GetUncompSurfacesInfo([in] const GUID *pGuid, [in] [out] LPAMVAUncompBufferInfo pUncompBufferInfo); - - // set information regarding allocated uncompressed data buffers - HRESULT SetUncompSurfacesInfo([in] DWORD dwActualUncompSurfacesAllocated); - - // get information necessary to create video accelerator object. It is the caller's responsibility - // to call CoTaskMemFree() on *ppMiscData - HRESULT GetCreateVideoAcceleratorData([in] const GUID *pGuid, [out] LPDWORD pdwSizeMiscData, [out] LPVOID *ppMiscData); -}; - -[ - local, - object, - uuid(256A6A22-FBAD-11d1-82BF-00A0C9696C8F), - helpstring("IAMVideoAccelerator Interface"), - pointer_default(unique) -] - -// IAMVideoAccelerator -interface IAMVideoAccelerator : IUnknown -{ - // pdwNumGuidsSupported is an IN OUT paramter - // pGuidsSupported is an IN OUT paramter - // if pGuidsSupported is NULL, pdwNumGuidsSupported should return back with the - // number of uncompressed pixel formats supported - // Otherwise pGuidsSupported is an array of *pdwNumGuidsSupported structures - HRESULT GetVideoAcceleratorGUIDs([in] [out] LPDWORD pdwNumGuidsSupported, [in] [out] LPGUID pGuidsSupported); - - // pGuid is an IN parameter - // pdwNumFormatsSupported is an IN OUT paramter - // pFormatsSupported is an IN OUT paramter (caller should make sure to set the size of EACH struct) - // if pFormatsSupported is NULL, pdwNumFormatsSupported should return back with - // the number of uncompressed pixel formats supported - // Otherwise pFormatsSupported is an array of *pdwNumFormatsSupported structures - HRESULT GetUncompFormatsSupported( [in] const GUID *pGuid, [in] [out] LPDWORD pdwNumFormatsSupported, - [in] [out] LPDDPIXELFORMAT pFormatsSupported); - - // pGuid is an IN parameter - // pamvaUncompDataInfo is an IN parameter - // pamvaInternalMemInfo is an IN OUT parameter (caller should make sure to set the size of struct) - // currently only gets info about how much scratch memory will the hal allocate for its private use - HRESULT GetInternalMemInfo([in] const GUID *pGuid, [in] const AMVAUncompDataInfo *pamvaUncompDataInfo, - [in] [out] LPAMVAInternalMemInfo pamvaInternalMemInfo); - - // pGuid is an IN parameter - // pamvaUncompDataInfo is an IN parameter - // pdwNumTypesCompBuffers is an IN OUT paramter - // pamvaCompBufferInfo is an IN OUT paramter (caller should make sure to set the size of EACH struct) - // if pamvaCompBufferInfo is NULL, pdwNumTypesCompBuffers should return back with the number of types of - // compressed buffers - // Otherwise pamvaCompBufferInfo is an array of *pdwNumTypesCompBuffers structures - HRESULT GetCompBufferInfo([in] const GUID *pGuid, [in] const AMVAUncompDataInfo *pamvaUncompDataInfo, - [in] [out] LPDWORD pdwNumTypesCompBuffers, [out] LPAMVACompBufferInfo pamvaCompBufferInfo); - - - // pdwNumTypesCompBuffers is an IN OUT paramter - // pamvaCompBufferInfo is an IN OUT paramter (caller should make sure to set the size of EACH struct) - // if pamvaCompBufferInfo is NULL, pdwNumTypesCompBuffers should return back with the number of types of - // compressed buffers - // Otherwise pamvaCompBufferInfo is an array of *pdwNumTypesCompBuffers structures - // only valid to call this after the pins are connected - HRESULT GetInternalCompBufferInfo([in] [out] LPDWORD pdwNumTypesCompBuffers, [out] LPAMVACompBufferInfo pamvaCompBufferInfo); - - // begin a frame, the pMiscData is passed directly to the hal - // only valid to call this after the pins are connected - // Tells the ovmixer which frame is the destination - // frame. Use indices (valid vales are [0 .. pdwNumSurfacesAllocated-1]) to specify frames - HRESULT BeginFrame([in] const AMVABeginFrameInfo *amvaBeginFrameInfo); - - // end a frame, the pMiscData is passed directly to the hal - // only valid to call this after the pins are connected - HRESULT EndFrame([in] const AMVAEndFrameInfo *pEndFrameInfo); - - // lock and obtain access to a single buffer - // only valid to call this after the pins are connected - // Buffers are identified by type and index within that type - // Specifiying read-only will allow access to busy reference - // frames - // Output (uncompressed) frames use a type index of 0xFFFFFFFF - HRESULT GetBuffer( - [in] DWORD dwTypeIndex, - [in] DWORD dwBufferIndex, - [in] BOOL bReadOnly, - [out] LPVOID *ppBuffer, - [out] LONG *lpStride); - - // unlock a single buffer - // Buffers are identified by type and index within that type - // only valid to call this after the pins are connected - HRESULT ReleaseBuffer([in] DWORD dwTypeIndex, [in] DWORD dwBufferIndex); - - // Perform a decompression operation - // Private data can be passed to and from a driver - // identifiers for the corresponding members of pamvaMacroBlockInfo - // pamvaMacroBlockInfo is an IN parameter which is array (of length dwNumBlocks) of structures - // only valid to call this after the pins are connected - HRESULT Execute( - [in] DWORD dwFunction, - [in] LPVOID lpPrivateInputData, - [in] DWORD cbPrivateInputData, - [in] LPVOID lpPrivateOutputDat, - [in] DWORD cbPrivateOutputData, - [in] DWORD dwNumBuffers, - [in] const AMVABUFFERINFO *pamvaBufferInfo); - - // query the decode status of a particular decompression operation - // dwTypeIndex and dwBufferIndex define the buffer whose status is - // being queried - HRESULT QueryRenderStatus([in] DWORD dwTypeIndex, - [in] DWORD dwBufferIndex, - [in] DWORD dwFlags); - - // display a frame. The mediasample contains the timestamps etc for the frame to be displayed - // this call is a non-blocking call - // only valid to call this after the pins are connected - HRESULT DisplayFrame([in] DWORD dwFlipToIndex, [in] IMediaSample *pMediaSample); -}; - - - - - - diff --git a/import/DirectX8/include/activecf.h b/import/DirectX8/include/activecf.h deleted file mode 100644 index 5efd8cfc2..000000000 --- a/import/DirectX8/include/activecf.h +++ /dev/null @@ -1,19 +0,0 @@ -//------------------------------------------------------------------------------ -// File: ActiveCf.h -// -// Desc: Contains the data formats for the transfer of VfW4 filters via the -// clipboard. -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#define CFSTR_VFW_FILTERLIST "Video for Windows 4 Filters" - -typedef struct tagVFW_FILTERLIST{ - UINT cFilters; // number of CLSIDs in aClsId - CLSID aClsId[1]; // ClsId of each filter - -} VFW_FILTERLIST; - - diff --git a/import/DirectX8/include/amaudio.h b/import/DirectX8/include/amaudio.h deleted file mode 100644 index cd6d0532a..000000000 --- a/import/DirectX8/include/amaudio.h +++ /dev/null @@ -1,54 +0,0 @@ -//------------------------------------------------------------------------------ -// File: AMAudio.h -// -// Desc: Audio related definitions and interfaces for ActiveMovie. -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __AMAUDIO__ -#define __AMAUDIO__ - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -#include -#include - -// This is the interface the audio renderer supports to give the application -// access to the direct sound object and the buffers it is using, to allow the -// application to use things like the 3D features of Direct Sound for the -// soundtrack of a movie being played with Active Movie. - -// be nice to our friends in C -#undef INTERFACE -#define INTERFACE IAMDirectSound - -DECLARE_INTERFACE_(IAMDirectSound,IUnknown) -{ - /* IUnknown methods */ - - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID *ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /* IAMDirectSound methods */ - - STDMETHOD(GetDirectSoundInterface)(THIS_ LPDIRECTSOUND *lplpds) PURE; - STDMETHOD(GetPrimaryBufferInterface)(THIS_ LPDIRECTSOUNDBUFFER *lplpdsb) PURE; - STDMETHOD(GetSecondaryBufferInterface)(THIS_ LPDIRECTSOUNDBUFFER *lplpdsb) PURE; - STDMETHOD(ReleaseDirectSoundInterface)(THIS_ LPDIRECTSOUND lpds) PURE; - STDMETHOD(ReleasePrimaryBufferInterface)(THIS_ LPDIRECTSOUNDBUFFER lpdsb) PURE; - STDMETHOD(ReleaseSecondaryBufferInterface)(THIS_ LPDIRECTSOUNDBUFFER lpdsb) PURE; - STDMETHOD(SetFocusWindow)(THIS_ HWND, BOOL) PURE ; - STDMETHOD(GetFocusWindow)(THIS_ HWND *, BOOL*) PURE ; -}; - - -#ifdef __cplusplus -} -#endif // __cplusplus -#endif // __AMAUDIO__ - diff --git a/import/DirectX8/include/amparse.h b/import/DirectX8/include/amparse.h deleted file mode 100644 index ce7a388df..000000000 --- a/import/DirectX8/include/amparse.h +++ /dev/null @@ -1,38 +0,0 @@ -//------------------------------------------------------------------------------ -// File: AMParse.h -// -// Desc: Interface to the parser to get current time. This is useful for -// multifile playback. -// -// Copyright (c) 1996-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __AMPARSE__ -#define __AMPARSE__ - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - - -DEFINE_GUID(IID_IAMParse, -0xc47a3420, 0x005c, 0x11d2, 0x90, 0x38, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x98); - -// -// Parser interface - supported by MPEG-2 splitter filter -// -DECLARE_INTERFACE_(IAMParse, IUnknown) { - STDMETHOD(GetParseTime) (THIS_ - REFERENCE_TIME *prtCurrent - ) PURE; - STDMETHOD(SetParseTime) (THIS_ - REFERENCE_TIME rtCurrent - ) PURE; - STDMETHOD(Flush) (THIS) PURE; -}; - -#ifdef __cplusplus -} -#endif // __cplusplus -#endif // __AMPARSE__ diff --git a/import/DirectX8/include/amstream.h b/import/DirectX8/include/amstream.h deleted file mode 100644 index 01ef02ab5..000000000 --- a/import/DirectX8/include/amstream.h +++ /dev/null @@ -1,2295 +0,0 @@ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 6.00.0347 */ -/* Compiler settings for amstream.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __amstream_h__ -#define __amstream_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __IDirectShowStream_FWD_DEFINED__ -#define __IDirectShowStream_FWD_DEFINED__ -typedef interface IDirectShowStream IDirectShowStream; -#endif /* __IDirectShowStream_FWD_DEFINED__ */ - - -#ifndef __IAMMultiMediaStream_FWD_DEFINED__ -#define __IAMMultiMediaStream_FWD_DEFINED__ -typedef interface IAMMultiMediaStream IAMMultiMediaStream; -#endif /* __IAMMultiMediaStream_FWD_DEFINED__ */ - - -#ifndef __IAMMediaStream_FWD_DEFINED__ -#define __IAMMediaStream_FWD_DEFINED__ -typedef interface IAMMediaStream IAMMediaStream; -#endif /* __IAMMediaStream_FWD_DEFINED__ */ - - -#ifndef __IMediaStreamFilter_FWD_DEFINED__ -#define __IMediaStreamFilter_FWD_DEFINED__ -typedef interface IMediaStreamFilter IMediaStreamFilter; -#endif /* __IMediaStreamFilter_FWD_DEFINED__ */ - - -#ifndef __IDirectDrawMediaSampleAllocator_FWD_DEFINED__ -#define __IDirectDrawMediaSampleAllocator_FWD_DEFINED__ -typedef interface IDirectDrawMediaSampleAllocator IDirectDrawMediaSampleAllocator; -#endif /* __IDirectDrawMediaSampleAllocator_FWD_DEFINED__ */ - - -#ifndef __IDirectDrawMediaSample_FWD_DEFINED__ -#define __IDirectDrawMediaSample_FWD_DEFINED__ -typedef interface IDirectDrawMediaSample IDirectDrawMediaSample; -#endif /* __IDirectDrawMediaSample_FWD_DEFINED__ */ - - -#ifndef __IAMMediaTypeStream_FWD_DEFINED__ -#define __IAMMediaTypeStream_FWD_DEFINED__ -typedef interface IAMMediaTypeStream IAMMediaTypeStream; -#endif /* __IAMMediaTypeStream_FWD_DEFINED__ */ - - -#ifndef __IAMMediaTypeSample_FWD_DEFINED__ -#define __IAMMediaTypeSample_FWD_DEFINED__ -typedef interface IAMMediaTypeSample IAMMediaTypeSample; -#endif /* __IAMMediaTypeSample_FWD_DEFINED__ */ - - -#ifndef __AMMultiMediaStream_FWD_DEFINED__ -#define __AMMultiMediaStream_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class AMMultiMediaStream AMMultiMediaStream; -#else -typedef struct AMMultiMediaStream AMMultiMediaStream; -#endif /* __cplusplus */ - -#endif /* __AMMultiMediaStream_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "unknwn.h" -#include "mmstream.h" -#include "strmif.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void * ); - -/* interface __MIDL_itf_amstream_0000 */ -/* [local] */ - -#include -#include -#include -#include -#include - - - - - - - - -enum __MIDL___MIDL_itf_amstream_0000_0001 - { AMMSF_NOGRAPHTHREAD = 0x1 - } ; - -enum __MIDL___MIDL_itf_amstream_0000_0002 - { AMMSF_ADDDEFAULTRENDERER = 0x1, - AMMSF_CREATEPEER = 0x2, - AMMSF_STOPIFNOSAMPLES = 0x4, - AMMSF_NOSTALL = 0x8 - } ; - -enum __MIDL___MIDL_itf_amstream_0000_0003 - { AMMSF_RENDERTYPEMASK = 0x3, - AMMSF_RENDERTOEXISTING = 0, - AMMSF_RENDERALLSTREAMS = 0x1, - AMMSF_NORENDER = 0x2, - AMMSF_NOCLOCK = 0x4, - AMMSF_RUN = 0x8 - } ; -typedef /* [public][public][public][public][public][v1_enum] */ -enum __MIDL___MIDL_itf_amstream_0000_0004 - { Disabled = 0, - ReadData = 1, - RenderData = 2 - } OUTPUT_STATE; - - - -extern RPC_IF_HANDLE __MIDL_itf_amstream_0000_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_amstream_0000_v0_0_s_ifspec; - -#ifndef __IDirectShowStream_INTERFACE_DEFINED__ -#define __IDirectShowStream_INTERFACE_DEFINED__ - -/* interface IDirectShowStream */ -/* [unique][helpstring][dual][uuid][object] */ - - -EXTERN_C const IID IID_IDirectShowStream; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("7DB01C96-C0C3-11d0-8FF1-00C04FD9189D") - IDirectShowStream : public IDispatch - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_FileName( - /* [retval][out] */ BSTR *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_FileName( - /* [in] */ BSTR newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Video( - /* [retval][out] */ OUTPUT_STATE *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Video( - /* [in] */ OUTPUT_STATE newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Audio( - /* [retval][out] */ OUTPUT_STATE *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Audio( - /* [in] */ OUTPUT_STATE newVal) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDirectShowStreamVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDirectShowStream * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDirectShowStream * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDirectShowStream * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDirectShowStream * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDirectShowStream * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDirectShowStream * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDirectShowStream * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FileName )( - IDirectShowStream * This, - /* [retval][out] */ BSTR *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FileName )( - IDirectShowStream * This, - /* [in] */ BSTR newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Video )( - IDirectShowStream * This, - /* [retval][out] */ OUTPUT_STATE *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Video )( - IDirectShowStream * This, - /* [in] */ OUTPUT_STATE newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Audio )( - IDirectShowStream * This, - /* [retval][out] */ OUTPUT_STATE *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Audio )( - IDirectShowStream * This, - /* [in] */ OUTPUT_STATE newVal); - - END_INTERFACE - } IDirectShowStreamVtbl; - - interface IDirectShowStream - { - CONST_VTBL struct IDirectShowStreamVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDirectShowStream_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDirectShowStream_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDirectShowStream_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDirectShowStream_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IDirectShowStream_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IDirectShowStream_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IDirectShowStream_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IDirectShowStream_get_FileName(This,pVal) \ - (This)->lpVtbl -> get_FileName(This,pVal) - -#define IDirectShowStream_put_FileName(This,newVal) \ - (This)->lpVtbl -> put_FileName(This,newVal) - -#define IDirectShowStream_get_Video(This,pVal) \ - (This)->lpVtbl -> get_Video(This,pVal) - -#define IDirectShowStream_put_Video(This,newVal) \ - (This)->lpVtbl -> put_Video(This,newVal) - -#define IDirectShowStream_get_Audio(This,pVal) \ - (This)->lpVtbl -> get_Audio(This,pVal) - -#define IDirectShowStream_put_Audio(This,newVal) \ - (This)->lpVtbl -> put_Audio(This,newVal) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDirectShowStream_get_FileName_Proxy( - IDirectShowStream * This, - /* [retval][out] */ BSTR *pVal); - - -void __RPC_STUB IDirectShowStream_get_FileName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDirectShowStream_put_FileName_Proxy( - IDirectShowStream * This, - /* [in] */ BSTR newVal); - - -void __RPC_STUB IDirectShowStream_put_FileName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDirectShowStream_get_Video_Proxy( - IDirectShowStream * This, - /* [retval][out] */ OUTPUT_STATE *pVal); - - -void __RPC_STUB IDirectShowStream_get_Video_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDirectShowStream_put_Video_Proxy( - IDirectShowStream * This, - /* [in] */ OUTPUT_STATE newVal); - - -void __RPC_STUB IDirectShowStream_put_Video_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDirectShowStream_get_Audio_Proxy( - IDirectShowStream * This, - /* [retval][out] */ OUTPUT_STATE *pVal); - - -void __RPC_STUB IDirectShowStream_get_Audio_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDirectShowStream_put_Audio_Proxy( - IDirectShowStream * This, - /* [in] */ OUTPUT_STATE newVal); - - -void __RPC_STUB IDirectShowStream_put_Audio_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDirectShowStream_INTERFACE_DEFINED__ */ - - -#ifndef __IAMMultiMediaStream_INTERFACE_DEFINED__ -#define __IAMMultiMediaStream_INTERFACE_DEFINED__ - -/* interface IAMMultiMediaStream */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMMultiMediaStream; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("BEBE595C-9A6F-11d0-8FDE-00C04FD9189D") - IAMMultiMediaStream : public IMultiMediaStream - { - public: - virtual HRESULT STDMETHODCALLTYPE Initialize( - /* [in] */ STREAM_TYPE StreamType, - /* [in] */ DWORD dwFlags, - /* [in] */ IGraphBuilder *pFilterGraph) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFilterGraph( - /* [out] */ IGraphBuilder **ppGraphBuilder) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFilter( - /* [out] */ IMediaStreamFilter **ppFilter) = 0; - - virtual HRESULT STDMETHODCALLTYPE AddMediaStream( - /* [in] */ IUnknown *pStreamObject, - /* [in] */ const MSPID *PurposeId, - /* [in] */ DWORD dwFlags, - /* [out] */ IMediaStream **ppNewStream) = 0; - - virtual HRESULT STDMETHODCALLTYPE OpenFile( - /* [in] */ LPCWSTR pszFileName, - /* [in] */ DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE OpenMoniker( - /* [in] */ IBindCtx *pCtx, - /* [in] */ IMoniker *pMoniker, - /* [in] */ DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE Render( - /* [in] */ DWORD dwFlags) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMMultiMediaStreamVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMMultiMediaStream * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMMultiMediaStream * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMMultiMediaStream * This); - - HRESULT ( STDMETHODCALLTYPE *GetInformation )( - IAMMultiMediaStream * This, - /* [out] */ DWORD *pdwFlags, - /* [out] */ STREAM_TYPE *pStreamType); - - HRESULT ( STDMETHODCALLTYPE *GetMediaStream )( - IAMMultiMediaStream * This, - /* [in] */ REFMSPID idPurpose, - /* [out] */ IMediaStream **ppMediaStream); - - HRESULT ( STDMETHODCALLTYPE *EnumMediaStreams )( - IAMMultiMediaStream * This, - /* [in] */ long Index, - /* [out] */ IMediaStream **ppMediaStream); - - HRESULT ( STDMETHODCALLTYPE *GetState )( - IAMMultiMediaStream * This, - /* [out] */ STREAM_STATE *pCurrentState); - - HRESULT ( STDMETHODCALLTYPE *SetState )( - IAMMultiMediaStream * This, - /* [in] */ STREAM_STATE NewState); - - HRESULT ( STDMETHODCALLTYPE *GetTime )( - IAMMultiMediaStream * This, - /* [out] */ STREAM_TIME *pCurrentTime); - - HRESULT ( STDMETHODCALLTYPE *GetDuration )( - IAMMultiMediaStream * This, - /* [out] */ STREAM_TIME *pDuration); - - HRESULT ( STDMETHODCALLTYPE *Seek )( - IAMMultiMediaStream * This, - /* [in] */ STREAM_TIME SeekTime); - - HRESULT ( STDMETHODCALLTYPE *GetEndOfStreamEventHandle )( - IAMMultiMediaStream * This, - /* [out] */ HANDLE *phEOS); - - HRESULT ( STDMETHODCALLTYPE *Initialize )( - IAMMultiMediaStream * This, - /* [in] */ STREAM_TYPE StreamType, - /* [in] */ DWORD dwFlags, - /* [in] */ IGraphBuilder *pFilterGraph); - - HRESULT ( STDMETHODCALLTYPE *GetFilterGraph )( - IAMMultiMediaStream * This, - /* [out] */ IGraphBuilder **ppGraphBuilder); - - HRESULT ( STDMETHODCALLTYPE *GetFilter )( - IAMMultiMediaStream * This, - /* [out] */ IMediaStreamFilter **ppFilter); - - HRESULT ( STDMETHODCALLTYPE *AddMediaStream )( - IAMMultiMediaStream * This, - /* [in] */ IUnknown *pStreamObject, - /* [in] */ const MSPID *PurposeId, - /* [in] */ DWORD dwFlags, - /* [out] */ IMediaStream **ppNewStream); - - HRESULT ( STDMETHODCALLTYPE *OpenFile )( - IAMMultiMediaStream * This, - /* [in] */ LPCWSTR pszFileName, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *OpenMoniker )( - IAMMultiMediaStream * This, - /* [in] */ IBindCtx *pCtx, - /* [in] */ IMoniker *pMoniker, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *Render )( - IAMMultiMediaStream * This, - /* [in] */ DWORD dwFlags); - - END_INTERFACE - } IAMMultiMediaStreamVtbl; - - interface IAMMultiMediaStream - { - CONST_VTBL struct IAMMultiMediaStreamVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMMultiMediaStream_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMMultiMediaStream_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMMultiMediaStream_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMMultiMediaStream_GetInformation(This,pdwFlags,pStreamType) \ - (This)->lpVtbl -> GetInformation(This,pdwFlags,pStreamType) - -#define IAMMultiMediaStream_GetMediaStream(This,idPurpose,ppMediaStream) \ - (This)->lpVtbl -> GetMediaStream(This,idPurpose,ppMediaStream) - -#define IAMMultiMediaStream_EnumMediaStreams(This,Index,ppMediaStream) \ - (This)->lpVtbl -> EnumMediaStreams(This,Index,ppMediaStream) - -#define IAMMultiMediaStream_GetState(This,pCurrentState) \ - (This)->lpVtbl -> GetState(This,pCurrentState) - -#define IAMMultiMediaStream_SetState(This,NewState) \ - (This)->lpVtbl -> SetState(This,NewState) - -#define IAMMultiMediaStream_GetTime(This,pCurrentTime) \ - (This)->lpVtbl -> GetTime(This,pCurrentTime) - -#define IAMMultiMediaStream_GetDuration(This,pDuration) \ - (This)->lpVtbl -> GetDuration(This,pDuration) - -#define IAMMultiMediaStream_Seek(This,SeekTime) \ - (This)->lpVtbl -> Seek(This,SeekTime) - -#define IAMMultiMediaStream_GetEndOfStreamEventHandle(This,phEOS) \ - (This)->lpVtbl -> GetEndOfStreamEventHandle(This,phEOS) - - -#define IAMMultiMediaStream_Initialize(This,StreamType,dwFlags,pFilterGraph) \ - (This)->lpVtbl -> Initialize(This,StreamType,dwFlags,pFilterGraph) - -#define IAMMultiMediaStream_GetFilterGraph(This,ppGraphBuilder) \ - (This)->lpVtbl -> GetFilterGraph(This,ppGraphBuilder) - -#define IAMMultiMediaStream_GetFilter(This,ppFilter) \ - (This)->lpVtbl -> GetFilter(This,ppFilter) - -#define IAMMultiMediaStream_AddMediaStream(This,pStreamObject,PurposeId,dwFlags,ppNewStream) \ - (This)->lpVtbl -> AddMediaStream(This,pStreamObject,PurposeId,dwFlags,ppNewStream) - -#define IAMMultiMediaStream_OpenFile(This,pszFileName,dwFlags) \ - (This)->lpVtbl -> OpenFile(This,pszFileName,dwFlags) - -#define IAMMultiMediaStream_OpenMoniker(This,pCtx,pMoniker,dwFlags) \ - (This)->lpVtbl -> OpenMoniker(This,pCtx,pMoniker,dwFlags) - -#define IAMMultiMediaStream_Render(This,dwFlags) \ - (This)->lpVtbl -> Render(This,dwFlags) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMMultiMediaStream_Initialize_Proxy( - IAMMultiMediaStream * This, - /* [in] */ STREAM_TYPE StreamType, - /* [in] */ DWORD dwFlags, - /* [in] */ IGraphBuilder *pFilterGraph); - - -void __RPC_STUB IAMMultiMediaStream_Initialize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMultiMediaStream_GetFilterGraph_Proxy( - IAMMultiMediaStream * This, - /* [out] */ IGraphBuilder **ppGraphBuilder); - - -void __RPC_STUB IAMMultiMediaStream_GetFilterGraph_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMultiMediaStream_GetFilter_Proxy( - IAMMultiMediaStream * This, - /* [out] */ IMediaStreamFilter **ppFilter); - - -void __RPC_STUB IAMMultiMediaStream_GetFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMultiMediaStream_AddMediaStream_Proxy( - IAMMultiMediaStream * This, - /* [in] */ IUnknown *pStreamObject, - /* [in] */ const MSPID *PurposeId, - /* [in] */ DWORD dwFlags, - /* [out] */ IMediaStream **ppNewStream); - - -void __RPC_STUB IAMMultiMediaStream_AddMediaStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMultiMediaStream_OpenFile_Proxy( - IAMMultiMediaStream * This, - /* [in] */ LPCWSTR pszFileName, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IAMMultiMediaStream_OpenFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMultiMediaStream_OpenMoniker_Proxy( - IAMMultiMediaStream * This, - /* [in] */ IBindCtx *pCtx, - /* [in] */ IMoniker *pMoniker, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IAMMultiMediaStream_OpenMoniker_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMultiMediaStream_Render_Proxy( - IAMMultiMediaStream * This, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IAMMultiMediaStream_Render_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMMultiMediaStream_INTERFACE_DEFINED__ */ - - -#ifndef __IAMMediaStream_INTERFACE_DEFINED__ -#define __IAMMediaStream_INTERFACE_DEFINED__ - -/* interface IAMMediaStream */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMMediaStream; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("BEBE595D-9A6F-11d0-8FDE-00C04FD9189D") - IAMMediaStream : public IMediaStream - { - public: - virtual HRESULT STDMETHODCALLTYPE Initialize( - /* [in] */ IUnknown *pSourceObject, - /* [in] */ DWORD dwFlags, - /* [in] */ REFMSPID PurposeId, - /* [in] */ const STREAM_TYPE StreamType) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetState( - /* [in] */ FILTER_STATE State) = 0; - - virtual HRESULT STDMETHODCALLTYPE JoinAMMultiMediaStream( - /* [in] */ IAMMultiMediaStream *pAMMultiMediaStream) = 0; - - virtual HRESULT STDMETHODCALLTYPE JoinFilter( - /* [in] */ IMediaStreamFilter *pMediaStreamFilter) = 0; - - virtual HRESULT STDMETHODCALLTYPE JoinFilterGraph( - /* [in] */ IFilterGraph *pFilterGraph) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMMediaStreamVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMMediaStream * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMMediaStream * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMMediaStream * This); - - HRESULT ( STDMETHODCALLTYPE *GetMultiMediaStream )( - IAMMediaStream * This, - /* [out] */ IMultiMediaStream **ppMultiMediaStream); - - HRESULT ( STDMETHODCALLTYPE *GetInformation )( - IAMMediaStream * This, - /* [out] */ MSPID *pPurposeId, - /* [out] */ STREAM_TYPE *pType); - - HRESULT ( STDMETHODCALLTYPE *SetSameFormat )( - IAMMediaStream * This, - /* [in] */ IMediaStream *pStreamThatHasDesiredFormat, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *AllocateSample )( - IAMMediaStream * This, - /* [in] */ DWORD dwFlags, - /* [out] */ IStreamSample **ppSample); - - HRESULT ( STDMETHODCALLTYPE *CreateSharedSample )( - IAMMediaStream * This, - /* [in] */ IStreamSample *pExistingSample, - /* [in] */ DWORD dwFlags, - /* [out] */ IStreamSample **ppNewSample); - - HRESULT ( STDMETHODCALLTYPE *SendEndOfStream )( - IAMMediaStream * This, - DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *Initialize )( - IAMMediaStream * This, - /* [in] */ IUnknown *pSourceObject, - /* [in] */ DWORD dwFlags, - /* [in] */ REFMSPID PurposeId, - /* [in] */ const STREAM_TYPE StreamType); - - HRESULT ( STDMETHODCALLTYPE *SetState )( - IAMMediaStream * This, - /* [in] */ FILTER_STATE State); - - HRESULT ( STDMETHODCALLTYPE *JoinAMMultiMediaStream )( - IAMMediaStream * This, - /* [in] */ IAMMultiMediaStream *pAMMultiMediaStream); - - HRESULT ( STDMETHODCALLTYPE *JoinFilter )( - IAMMediaStream * This, - /* [in] */ IMediaStreamFilter *pMediaStreamFilter); - - HRESULT ( STDMETHODCALLTYPE *JoinFilterGraph )( - IAMMediaStream * This, - /* [in] */ IFilterGraph *pFilterGraph); - - END_INTERFACE - } IAMMediaStreamVtbl; - - interface IAMMediaStream - { - CONST_VTBL struct IAMMediaStreamVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMMediaStream_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMMediaStream_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMMediaStream_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMMediaStream_GetMultiMediaStream(This,ppMultiMediaStream) \ - (This)->lpVtbl -> GetMultiMediaStream(This,ppMultiMediaStream) - -#define IAMMediaStream_GetInformation(This,pPurposeId,pType) \ - (This)->lpVtbl -> GetInformation(This,pPurposeId,pType) - -#define IAMMediaStream_SetSameFormat(This,pStreamThatHasDesiredFormat,dwFlags) \ - (This)->lpVtbl -> SetSameFormat(This,pStreamThatHasDesiredFormat,dwFlags) - -#define IAMMediaStream_AllocateSample(This,dwFlags,ppSample) \ - (This)->lpVtbl -> AllocateSample(This,dwFlags,ppSample) - -#define IAMMediaStream_CreateSharedSample(This,pExistingSample,dwFlags,ppNewSample) \ - (This)->lpVtbl -> CreateSharedSample(This,pExistingSample,dwFlags,ppNewSample) - -#define IAMMediaStream_SendEndOfStream(This,dwFlags) \ - (This)->lpVtbl -> SendEndOfStream(This,dwFlags) - - -#define IAMMediaStream_Initialize(This,pSourceObject,dwFlags,PurposeId,StreamType) \ - (This)->lpVtbl -> Initialize(This,pSourceObject,dwFlags,PurposeId,StreamType) - -#define IAMMediaStream_SetState(This,State) \ - (This)->lpVtbl -> SetState(This,State) - -#define IAMMediaStream_JoinAMMultiMediaStream(This,pAMMultiMediaStream) \ - (This)->lpVtbl -> JoinAMMultiMediaStream(This,pAMMultiMediaStream) - -#define IAMMediaStream_JoinFilter(This,pMediaStreamFilter) \ - (This)->lpVtbl -> JoinFilter(This,pMediaStreamFilter) - -#define IAMMediaStream_JoinFilterGraph(This,pFilterGraph) \ - (This)->lpVtbl -> JoinFilterGraph(This,pFilterGraph) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMMediaStream_Initialize_Proxy( - IAMMediaStream * This, - /* [in] */ IUnknown *pSourceObject, - /* [in] */ DWORD dwFlags, - /* [in] */ REFMSPID PurposeId, - /* [in] */ const STREAM_TYPE StreamType); - - -void __RPC_STUB IAMMediaStream_Initialize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaStream_SetState_Proxy( - IAMMediaStream * This, - /* [in] */ FILTER_STATE State); - - -void __RPC_STUB IAMMediaStream_SetState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaStream_JoinAMMultiMediaStream_Proxy( - IAMMediaStream * This, - /* [in] */ IAMMultiMediaStream *pAMMultiMediaStream); - - -void __RPC_STUB IAMMediaStream_JoinAMMultiMediaStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaStream_JoinFilter_Proxy( - IAMMediaStream * This, - /* [in] */ IMediaStreamFilter *pMediaStreamFilter); - - -void __RPC_STUB IAMMediaStream_JoinFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaStream_JoinFilterGraph_Proxy( - IAMMediaStream * This, - /* [in] */ IFilterGraph *pFilterGraph); - - -void __RPC_STUB IAMMediaStream_JoinFilterGraph_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMMediaStream_INTERFACE_DEFINED__ */ - - -#ifndef __IMediaStreamFilter_INTERFACE_DEFINED__ -#define __IMediaStreamFilter_INTERFACE_DEFINED__ - -/* interface IMediaStreamFilter */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IMediaStreamFilter; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("BEBE595E-9A6F-11d0-8FDE-00C04FD9189D") - IMediaStreamFilter : public IBaseFilter - { - public: - virtual HRESULT STDMETHODCALLTYPE AddMediaStream( - /* [in] */ IAMMediaStream *pAMMediaStream) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMediaStream( - /* [in] */ REFMSPID idPurpose, - /* [out] */ IMediaStream **ppMediaStream) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnumMediaStreams( - /* [in] */ long Index, - /* [out] */ IMediaStream **ppMediaStream) = 0; - - virtual HRESULT STDMETHODCALLTYPE SupportSeeking( - /* [in] */ BOOL bRenderer) = 0; - - virtual HRESULT STDMETHODCALLTYPE ReferenceTimeToStreamTime( - /* [out][in] */ REFERENCE_TIME *pTime) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentStreamTime( - /* [out] */ REFERENCE_TIME *pCurrentStreamTime) = 0; - - virtual HRESULT STDMETHODCALLTYPE WaitUntil( - /* [in] */ REFERENCE_TIME WaitStreamTime) = 0; - - virtual HRESULT STDMETHODCALLTYPE Flush( - /* [in] */ BOOL bCancelEOS) = 0; - - virtual HRESULT STDMETHODCALLTYPE EndOfStream( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaStreamFilterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaStreamFilter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaStreamFilter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaStreamFilter * This); - - HRESULT ( STDMETHODCALLTYPE *GetClassID )( - IMediaStreamFilter * This, - /* [out] */ CLSID *pClassID); - - HRESULT ( STDMETHODCALLTYPE *Stop )( - IMediaStreamFilter * This); - - HRESULT ( STDMETHODCALLTYPE *Pause )( - IMediaStreamFilter * This); - - HRESULT ( STDMETHODCALLTYPE *Run )( - IMediaStreamFilter * This, - REFERENCE_TIME tStart); - - HRESULT ( STDMETHODCALLTYPE *GetState )( - IMediaStreamFilter * This, - /* [in] */ DWORD dwMilliSecsTimeout, - /* [out] */ FILTER_STATE *State); - - HRESULT ( STDMETHODCALLTYPE *SetSyncSource )( - IMediaStreamFilter * This, - /* [in] */ IReferenceClock *pClock); - - HRESULT ( STDMETHODCALLTYPE *GetSyncSource )( - IMediaStreamFilter * This, - /* [out] */ IReferenceClock **pClock); - - HRESULT ( STDMETHODCALLTYPE *EnumPins )( - IMediaStreamFilter * This, - /* [out] */ IEnumPins **ppEnum); - - HRESULT ( STDMETHODCALLTYPE *FindPin )( - IMediaStreamFilter * This, - /* [string][in] */ LPCWSTR Id, - /* [out] */ IPin **ppPin); - - HRESULT ( STDMETHODCALLTYPE *QueryFilterInfo )( - IMediaStreamFilter * This, - /* [out] */ FILTER_INFO *pInfo); - - HRESULT ( STDMETHODCALLTYPE *JoinFilterGraph )( - IMediaStreamFilter * This, - /* [in] */ IFilterGraph *pGraph, - /* [string][in] */ LPCWSTR pName); - - HRESULT ( STDMETHODCALLTYPE *QueryVendorInfo )( - IMediaStreamFilter * This, - /* [string][out] */ LPWSTR *pVendorInfo); - - HRESULT ( STDMETHODCALLTYPE *AddMediaStream )( - IMediaStreamFilter * This, - /* [in] */ IAMMediaStream *pAMMediaStream); - - HRESULT ( STDMETHODCALLTYPE *GetMediaStream )( - IMediaStreamFilter * This, - /* [in] */ REFMSPID idPurpose, - /* [out] */ IMediaStream **ppMediaStream); - - HRESULT ( STDMETHODCALLTYPE *EnumMediaStreams )( - IMediaStreamFilter * This, - /* [in] */ long Index, - /* [out] */ IMediaStream **ppMediaStream); - - HRESULT ( STDMETHODCALLTYPE *SupportSeeking )( - IMediaStreamFilter * This, - /* [in] */ BOOL bRenderer); - - HRESULT ( STDMETHODCALLTYPE *ReferenceTimeToStreamTime )( - IMediaStreamFilter * This, - /* [out][in] */ REFERENCE_TIME *pTime); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentStreamTime )( - IMediaStreamFilter * This, - /* [out] */ REFERENCE_TIME *pCurrentStreamTime); - - HRESULT ( STDMETHODCALLTYPE *WaitUntil )( - IMediaStreamFilter * This, - /* [in] */ REFERENCE_TIME WaitStreamTime); - - HRESULT ( STDMETHODCALLTYPE *Flush )( - IMediaStreamFilter * This, - /* [in] */ BOOL bCancelEOS); - - HRESULT ( STDMETHODCALLTYPE *EndOfStream )( - IMediaStreamFilter * This); - - END_INTERFACE - } IMediaStreamFilterVtbl; - - interface IMediaStreamFilter - { - CONST_VTBL struct IMediaStreamFilterVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaStreamFilter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaStreamFilter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaStreamFilter_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaStreamFilter_GetClassID(This,pClassID) \ - (This)->lpVtbl -> GetClassID(This,pClassID) - - -#define IMediaStreamFilter_Stop(This) \ - (This)->lpVtbl -> Stop(This) - -#define IMediaStreamFilter_Pause(This) \ - (This)->lpVtbl -> Pause(This) - -#define IMediaStreamFilter_Run(This,tStart) \ - (This)->lpVtbl -> Run(This,tStart) - -#define IMediaStreamFilter_GetState(This,dwMilliSecsTimeout,State) \ - (This)->lpVtbl -> GetState(This,dwMilliSecsTimeout,State) - -#define IMediaStreamFilter_SetSyncSource(This,pClock) \ - (This)->lpVtbl -> SetSyncSource(This,pClock) - -#define IMediaStreamFilter_GetSyncSource(This,pClock) \ - (This)->lpVtbl -> GetSyncSource(This,pClock) - - -#define IMediaStreamFilter_EnumPins(This,ppEnum) \ - (This)->lpVtbl -> EnumPins(This,ppEnum) - -#define IMediaStreamFilter_FindPin(This,Id,ppPin) \ - (This)->lpVtbl -> FindPin(This,Id,ppPin) - -#define IMediaStreamFilter_QueryFilterInfo(This,pInfo) \ - (This)->lpVtbl -> QueryFilterInfo(This,pInfo) - -#define IMediaStreamFilter_JoinFilterGraph(This,pGraph,pName) \ - (This)->lpVtbl -> JoinFilterGraph(This,pGraph,pName) - -#define IMediaStreamFilter_QueryVendorInfo(This,pVendorInfo) \ - (This)->lpVtbl -> QueryVendorInfo(This,pVendorInfo) - - -#define IMediaStreamFilter_AddMediaStream(This,pAMMediaStream) \ - (This)->lpVtbl -> AddMediaStream(This,pAMMediaStream) - -#define IMediaStreamFilter_GetMediaStream(This,idPurpose,ppMediaStream) \ - (This)->lpVtbl -> GetMediaStream(This,idPurpose,ppMediaStream) - -#define IMediaStreamFilter_EnumMediaStreams(This,Index,ppMediaStream) \ - (This)->lpVtbl -> EnumMediaStreams(This,Index,ppMediaStream) - -#define IMediaStreamFilter_SupportSeeking(This,bRenderer) \ - (This)->lpVtbl -> SupportSeeking(This,bRenderer) - -#define IMediaStreamFilter_ReferenceTimeToStreamTime(This,pTime) \ - (This)->lpVtbl -> ReferenceTimeToStreamTime(This,pTime) - -#define IMediaStreamFilter_GetCurrentStreamTime(This,pCurrentStreamTime) \ - (This)->lpVtbl -> GetCurrentStreamTime(This,pCurrentStreamTime) - -#define IMediaStreamFilter_WaitUntil(This,WaitStreamTime) \ - (This)->lpVtbl -> WaitUntil(This,WaitStreamTime) - -#define IMediaStreamFilter_Flush(This,bCancelEOS) \ - (This)->lpVtbl -> Flush(This,bCancelEOS) - -#define IMediaStreamFilter_EndOfStream(This) \ - (This)->lpVtbl -> EndOfStream(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaStreamFilter_AddMediaStream_Proxy( - IMediaStreamFilter * This, - /* [in] */ IAMMediaStream *pAMMediaStream); - - -void __RPC_STUB IMediaStreamFilter_AddMediaStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaStreamFilter_GetMediaStream_Proxy( - IMediaStreamFilter * This, - /* [in] */ REFMSPID idPurpose, - /* [out] */ IMediaStream **ppMediaStream); - - -void __RPC_STUB IMediaStreamFilter_GetMediaStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaStreamFilter_EnumMediaStreams_Proxy( - IMediaStreamFilter * This, - /* [in] */ long Index, - /* [out] */ IMediaStream **ppMediaStream); - - -void __RPC_STUB IMediaStreamFilter_EnumMediaStreams_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaStreamFilter_SupportSeeking_Proxy( - IMediaStreamFilter * This, - /* [in] */ BOOL bRenderer); - - -void __RPC_STUB IMediaStreamFilter_SupportSeeking_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaStreamFilter_ReferenceTimeToStreamTime_Proxy( - IMediaStreamFilter * This, - /* [out][in] */ REFERENCE_TIME *pTime); - - -void __RPC_STUB IMediaStreamFilter_ReferenceTimeToStreamTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaStreamFilter_GetCurrentStreamTime_Proxy( - IMediaStreamFilter * This, - /* [out] */ REFERENCE_TIME *pCurrentStreamTime); - - -void __RPC_STUB IMediaStreamFilter_GetCurrentStreamTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaStreamFilter_WaitUntil_Proxy( - IMediaStreamFilter * This, - /* [in] */ REFERENCE_TIME WaitStreamTime); - - -void __RPC_STUB IMediaStreamFilter_WaitUntil_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaStreamFilter_Flush_Proxy( - IMediaStreamFilter * This, - /* [in] */ BOOL bCancelEOS); - - -void __RPC_STUB IMediaStreamFilter_Flush_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaStreamFilter_EndOfStream_Proxy( - IMediaStreamFilter * This); - - -void __RPC_STUB IMediaStreamFilter_EndOfStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaStreamFilter_INTERFACE_DEFINED__ */ - - -#ifndef __IDirectDrawMediaSampleAllocator_INTERFACE_DEFINED__ -#define __IDirectDrawMediaSampleAllocator_INTERFACE_DEFINED__ - -/* interface IDirectDrawMediaSampleAllocator */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IDirectDrawMediaSampleAllocator; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("AB6B4AFC-F6E4-11d0-900D-00C04FD9189D") - IDirectDrawMediaSampleAllocator : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetDirectDraw( - IDirectDraw **ppDirectDraw) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDirectDrawMediaSampleAllocatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDirectDrawMediaSampleAllocator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDirectDrawMediaSampleAllocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDirectDrawMediaSampleAllocator * This); - - HRESULT ( STDMETHODCALLTYPE *GetDirectDraw )( - IDirectDrawMediaSampleAllocator * This, - IDirectDraw **ppDirectDraw); - - END_INTERFACE - } IDirectDrawMediaSampleAllocatorVtbl; - - interface IDirectDrawMediaSampleAllocator - { - CONST_VTBL struct IDirectDrawMediaSampleAllocatorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDirectDrawMediaSampleAllocator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDirectDrawMediaSampleAllocator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDirectDrawMediaSampleAllocator_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDirectDrawMediaSampleAllocator_GetDirectDraw(This,ppDirectDraw) \ - (This)->lpVtbl -> GetDirectDraw(This,ppDirectDraw) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDirectDrawMediaSampleAllocator_GetDirectDraw_Proxy( - IDirectDrawMediaSampleAllocator * This, - IDirectDraw **ppDirectDraw); - - -void __RPC_STUB IDirectDrawMediaSampleAllocator_GetDirectDraw_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDirectDrawMediaSampleAllocator_INTERFACE_DEFINED__ */ - - -#ifndef __IDirectDrawMediaSample_INTERFACE_DEFINED__ -#define __IDirectDrawMediaSample_INTERFACE_DEFINED__ - -/* interface IDirectDrawMediaSample */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IDirectDrawMediaSample; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("AB6B4AFE-F6E4-11d0-900D-00C04FD9189D") - IDirectDrawMediaSample : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetSurfaceAndReleaseLock( - /* [out] */ IDirectDrawSurface **ppDirectDrawSurface, - /* [out] */ RECT *pRect) = 0; - - virtual HRESULT STDMETHODCALLTYPE LockMediaSamplePointer( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDirectDrawMediaSampleVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDirectDrawMediaSample * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDirectDrawMediaSample * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDirectDrawMediaSample * This); - - HRESULT ( STDMETHODCALLTYPE *GetSurfaceAndReleaseLock )( - IDirectDrawMediaSample * This, - /* [out] */ IDirectDrawSurface **ppDirectDrawSurface, - /* [out] */ RECT *pRect); - - HRESULT ( STDMETHODCALLTYPE *LockMediaSamplePointer )( - IDirectDrawMediaSample * This); - - END_INTERFACE - } IDirectDrawMediaSampleVtbl; - - interface IDirectDrawMediaSample - { - CONST_VTBL struct IDirectDrawMediaSampleVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDirectDrawMediaSample_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDirectDrawMediaSample_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDirectDrawMediaSample_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDirectDrawMediaSample_GetSurfaceAndReleaseLock(This,ppDirectDrawSurface,pRect) \ - (This)->lpVtbl -> GetSurfaceAndReleaseLock(This,ppDirectDrawSurface,pRect) - -#define IDirectDrawMediaSample_LockMediaSamplePointer(This) \ - (This)->lpVtbl -> LockMediaSamplePointer(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDirectDrawMediaSample_GetSurfaceAndReleaseLock_Proxy( - IDirectDrawMediaSample * This, - /* [out] */ IDirectDrawSurface **ppDirectDrawSurface, - /* [out] */ RECT *pRect); - - -void __RPC_STUB IDirectDrawMediaSample_GetSurfaceAndReleaseLock_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDirectDrawMediaSample_LockMediaSamplePointer_Proxy( - IDirectDrawMediaSample * This); - - -void __RPC_STUB IDirectDrawMediaSample_LockMediaSamplePointer_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDirectDrawMediaSample_INTERFACE_DEFINED__ */ - - -#ifndef __IAMMediaTypeStream_INTERFACE_DEFINED__ -#define __IAMMediaTypeStream_INTERFACE_DEFINED__ - -/* interface IAMMediaTypeStream */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IAMMediaTypeStream; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("AB6B4AFA-F6E4-11d0-900D-00C04FD9189D") - IAMMediaTypeStream : public IMediaStream - { - public: - virtual HRESULT STDMETHODCALLTYPE GetFormat( - /* [out] */ AM_MEDIA_TYPE *pMediaType, - /* [in] */ DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFormat( - /* [in] */ AM_MEDIA_TYPE *pMediaType, - /* [in] */ DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateSample( - /* [in] */ long lSampleSize, - /* [in] */ BYTE *pbBuffer, - /* [in] */ DWORD dwFlags, - /* [in] */ IUnknown *pUnkOuter, - /* [out] */ IAMMediaTypeSample **ppAMMediaTypeSample) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetStreamAllocatorRequirements( - /* [out] */ ALLOCATOR_PROPERTIES *pProps) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetStreamAllocatorRequirements( - /* [in] */ ALLOCATOR_PROPERTIES *pProps) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMMediaTypeStreamVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMMediaTypeStream * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMMediaTypeStream * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMMediaTypeStream * This); - - HRESULT ( STDMETHODCALLTYPE *GetMultiMediaStream )( - IAMMediaTypeStream * This, - /* [out] */ IMultiMediaStream **ppMultiMediaStream); - - HRESULT ( STDMETHODCALLTYPE *GetInformation )( - IAMMediaTypeStream * This, - /* [out] */ MSPID *pPurposeId, - /* [out] */ STREAM_TYPE *pType); - - HRESULT ( STDMETHODCALLTYPE *SetSameFormat )( - IAMMediaTypeStream * This, - /* [in] */ IMediaStream *pStreamThatHasDesiredFormat, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *AllocateSample )( - IAMMediaTypeStream * This, - /* [in] */ DWORD dwFlags, - /* [out] */ IStreamSample **ppSample); - - HRESULT ( STDMETHODCALLTYPE *CreateSharedSample )( - IAMMediaTypeStream * This, - /* [in] */ IStreamSample *pExistingSample, - /* [in] */ DWORD dwFlags, - /* [out] */ IStreamSample **ppNewSample); - - HRESULT ( STDMETHODCALLTYPE *SendEndOfStream )( - IAMMediaTypeStream * This, - DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *GetFormat )( - IAMMediaTypeStream * This, - /* [out] */ AM_MEDIA_TYPE *pMediaType, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *SetFormat )( - IAMMediaTypeStream * This, - /* [in] */ AM_MEDIA_TYPE *pMediaType, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *CreateSample )( - IAMMediaTypeStream * This, - /* [in] */ long lSampleSize, - /* [in] */ BYTE *pbBuffer, - /* [in] */ DWORD dwFlags, - /* [in] */ IUnknown *pUnkOuter, - /* [out] */ IAMMediaTypeSample **ppAMMediaTypeSample); - - HRESULT ( STDMETHODCALLTYPE *GetStreamAllocatorRequirements )( - IAMMediaTypeStream * This, - /* [out] */ ALLOCATOR_PROPERTIES *pProps); - - HRESULT ( STDMETHODCALLTYPE *SetStreamAllocatorRequirements )( - IAMMediaTypeStream * This, - /* [in] */ ALLOCATOR_PROPERTIES *pProps); - - END_INTERFACE - } IAMMediaTypeStreamVtbl; - - interface IAMMediaTypeStream - { - CONST_VTBL struct IAMMediaTypeStreamVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMMediaTypeStream_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMMediaTypeStream_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMMediaTypeStream_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMMediaTypeStream_GetMultiMediaStream(This,ppMultiMediaStream) \ - (This)->lpVtbl -> GetMultiMediaStream(This,ppMultiMediaStream) - -#define IAMMediaTypeStream_GetInformation(This,pPurposeId,pType) \ - (This)->lpVtbl -> GetInformation(This,pPurposeId,pType) - -#define IAMMediaTypeStream_SetSameFormat(This,pStreamThatHasDesiredFormat,dwFlags) \ - (This)->lpVtbl -> SetSameFormat(This,pStreamThatHasDesiredFormat,dwFlags) - -#define IAMMediaTypeStream_AllocateSample(This,dwFlags,ppSample) \ - (This)->lpVtbl -> AllocateSample(This,dwFlags,ppSample) - -#define IAMMediaTypeStream_CreateSharedSample(This,pExistingSample,dwFlags,ppNewSample) \ - (This)->lpVtbl -> CreateSharedSample(This,pExistingSample,dwFlags,ppNewSample) - -#define IAMMediaTypeStream_SendEndOfStream(This,dwFlags) \ - (This)->lpVtbl -> SendEndOfStream(This,dwFlags) - - -#define IAMMediaTypeStream_GetFormat(This,pMediaType,dwFlags) \ - (This)->lpVtbl -> GetFormat(This,pMediaType,dwFlags) - -#define IAMMediaTypeStream_SetFormat(This,pMediaType,dwFlags) \ - (This)->lpVtbl -> SetFormat(This,pMediaType,dwFlags) - -#define IAMMediaTypeStream_CreateSample(This,lSampleSize,pbBuffer,dwFlags,pUnkOuter,ppAMMediaTypeSample) \ - (This)->lpVtbl -> CreateSample(This,lSampleSize,pbBuffer,dwFlags,pUnkOuter,ppAMMediaTypeSample) - -#define IAMMediaTypeStream_GetStreamAllocatorRequirements(This,pProps) \ - (This)->lpVtbl -> GetStreamAllocatorRequirements(This,pProps) - -#define IAMMediaTypeStream_SetStreamAllocatorRequirements(This,pProps) \ - (This)->lpVtbl -> SetStreamAllocatorRequirements(This,pProps) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeStream_GetFormat_Proxy( - IAMMediaTypeStream * This, - /* [out] */ AM_MEDIA_TYPE *pMediaType, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IAMMediaTypeStream_GetFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeStream_SetFormat_Proxy( - IAMMediaTypeStream * This, - /* [in] */ AM_MEDIA_TYPE *pMediaType, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IAMMediaTypeStream_SetFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeStream_CreateSample_Proxy( - IAMMediaTypeStream * This, - /* [in] */ long lSampleSize, - /* [in] */ BYTE *pbBuffer, - /* [in] */ DWORD dwFlags, - /* [in] */ IUnknown *pUnkOuter, - /* [out] */ IAMMediaTypeSample **ppAMMediaTypeSample); - - -void __RPC_STUB IAMMediaTypeStream_CreateSample_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeStream_GetStreamAllocatorRequirements_Proxy( - IAMMediaTypeStream * This, - /* [out] */ ALLOCATOR_PROPERTIES *pProps); - - -void __RPC_STUB IAMMediaTypeStream_GetStreamAllocatorRequirements_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeStream_SetStreamAllocatorRequirements_Proxy( - IAMMediaTypeStream * This, - /* [in] */ ALLOCATOR_PROPERTIES *pProps); - - -void __RPC_STUB IAMMediaTypeStream_SetStreamAllocatorRequirements_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMMediaTypeStream_INTERFACE_DEFINED__ */ - - -#ifndef __IAMMediaTypeSample_INTERFACE_DEFINED__ -#define __IAMMediaTypeSample_INTERFACE_DEFINED__ - -/* interface IAMMediaTypeSample */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IAMMediaTypeSample; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("AB6B4AFB-F6E4-11d0-900D-00C04FD9189D") - IAMMediaTypeSample : public IStreamSample - { - public: - virtual HRESULT STDMETHODCALLTYPE SetPointer( - /* [in] */ BYTE *pBuffer, - /* [in] */ long lSize) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetPointer( - /* [out] */ BYTE **ppBuffer) = 0; - - virtual long STDMETHODCALLTYPE GetSize( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTime( - /* [out] */ REFERENCE_TIME *pTimeStart, - /* [out] */ REFERENCE_TIME *pTimeEnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTime( - /* [in] */ REFERENCE_TIME *pTimeStart, - /* [in] */ REFERENCE_TIME *pTimeEnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsSyncPoint( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetSyncPoint( - BOOL bIsSyncPoint) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsPreroll( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetPreroll( - BOOL bIsPreroll) = 0; - - virtual long STDMETHODCALLTYPE GetActualDataLength( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetActualDataLength( - long __MIDL_0017) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMediaType( - AM_MEDIA_TYPE **ppMediaType) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMediaType( - AM_MEDIA_TYPE *pMediaType) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsDiscontinuity( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDiscontinuity( - BOOL bDiscontinuity) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMediaTime( - /* [out] */ LONGLONG *pTimeStart, - /* [out] */ LONGLONG *pTimeEnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMediaTime( - /* [in] */ LONGLONG *pTimeStart, - /* [in] */ LONGLONG *pTimeEnd) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMMediaTypeSampleVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMMediaTypeSample * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMMediaTypeSample * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMMediaTypeSample * This); - - HRESULT ( STDMETHODCALLTYPE *GetMediaStream )( - IAMMediaTypeSample * This, - /* [in] */ IMediaStream **ppMediaStream); - - HRESULT ( STDMETHODCALLTYPE *GetSampleTimes )( - IAMMediaTypeSample * This, - /* [out] */ STREAM_TIME *pStartTime, - /* [out] */ STREAM_TIME *pEndTime, - /* [out] */ STREAM_TIME *pCurrentTime); - - HRESULT ( STDMETHODCALLTYPE *SetSampleTimes )( - IAMMediaTypeSample * This, - /* [in] */ const STREAM_TIME *pStartTime, - /* [in] */ const STREAM_TIME *pEndTime); - - HRESULT ( STDMETHODCALLTYPE *Update )( - IAMMediaTypeSample * This, - /* [in] */ DWORD dwFlags, - /* [in] */ HANDLE hEvent, - /* [in] */ PAPCFUNC pfnAPC, - /* [in] */ DWORD_PTR dwAPCData); - - HRESULT ( STDMETHODCALLTYPE *CompletionStatus )( - IAMMediaTypeSample * This, - /* [in] */ DWORD dwFlags, - /* [in] */ DWORD dwMilliseconds); - - HRESULT ( STDMETHODCALLTYPE *SetPointer )( - IAMMediaTypeSample * This, - /* [in] */ BYTE *pBuffer, - /* [in] */ long lSize); - - HRESULT ( STDMETHODCALLTYPE *GetPointer )( - IAMMediaTypeSample * This, - /* [out] */ BYTE **ppBuffer); - - long ( STDMETHODCALLTYPE *GetSize )( - IAMMediaTypeSample * This); - - HRESULT ( STDMETHODCALLTYPE *GetTime )( - IAMMediaTypeSample * This, - /* [out] */ REFERENCE_TIME *pTimeStart, - /* [out] */ REFERENCE_TIME *pTimeEnd); - - HRESULT ( STDMETHODCALLTYPE *SetTime )( - IAMMediaTypeSample * This, - /* [in] */ REFERENCE_TIME *pTimeStart, - /* [in] */ REFERENCE_TIME *pTimeEnd); - - HRESULT ( STDMETHODCALLTYPE *IsSyncPoint )( - IAMMediaTypeSample * This); - - HRESULT ( STDMETHODCALLTYPE *SetSyncPoint )( - IAMMediaTypeSample * This, - BOOL bIsSyncPoint); - - HRESULT ( STDMETHODCALLTYPE *IsPreroll )( - IAMMediaTypeSample * This); - - HRESULT ( STDMETHODCALLTYPE *SetPreroll )( - IAMMediaTypeSample * This, - BOOL bIsPreroll); - - long ( STDMETHODCALLTYPE *GetActualDataLength )( - IAMMediaTypeSample * This); - - HRESULT ( STDMETHODCALLTYPE *SetActualDataLength )( - IAMMediaTypeSample * This, - long __MIDL_0017); - - HRESULT ( STDMETHODCALLTYPE *GetMediaType )( - IAMMediaTypeSample * This, - AM_MEDIA_TYPE **ppMediaType); - - HRESULT ( STDMETHODCALLTYPE *SetMediaType )( - IAMMediaTypeSample * This, - AM_MEDIA_TYPE *pMediaType); - - HRESULT ( STDMETHODCALLTYPE *IsDiscontinuity )( - IAMMediaTypeSample * This); - - HRESULT ( STDMETHODCALLTYPE *SetDiscontinuity )( - IAMMediaTypeSample * This, - BOOL bDiscontinuity); - - HRESULT ( STDMETHODCALLTYPE *GetMediaTime )( - IAMMediaTypeSample * This, - /* [out] */ LONGLONG *pTimeStart, - /* [out] */ LONGLONG *pTimeEnd); - - HRESULT ( STDMETHODCALLTYPE *SetMediaTime )( - IAMMediaTypeSample * This, - /* [in] */ LONGLONG *pTimeStart, - /* [in] */ LONGLONG *pTimeEnd); - - END_INTERFACE - } IAMMediaTypeSampleVtbl; - - interface IAMMediaTypeSample - { - CONST_VTBL struct IAMMediaTypeSampleVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMMediaTypeSample_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMMediaTypeSample_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMMediaTypeSample_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMMediaTypeSample_GetMediaStream(This,ppMediaStream) \ - (This)->lpVtbl -> GetMediaStream(This,ppMediaStream) - -#define IAMMediaTypeSample_GetSampleTimes(This,pStartTime,pEndTime,pCurrentTime) \ - (This)->lpVtbl -> GetSampleTimes(This,pStartTime,pEndTime,pCurrentTime) - -#define IAMMediaTypeSample_SetSampleTimes(This,pStartTime,pEndTime) \ - (This)->lpVtbl -> SetSampleTimes(This,pStartTime,pEndTime) - -#define IAMMediaTypeSample_Update(This,dwFlags,hEvent,pfnAPC,dwAPCData) \ - (This)->lpVtbl -> Update(This,dwFlags,hEvent,pfnAPC,dwAPCData) - -#define IAMMediaTypeSample_CompletionStatus(This,dwFlags,dwMilliseconds) \ - (This)->lpVtbl -> CompletionStatus(This,dwFlags,dwMilliseconds) - - -#define IAMMediaTypeSample_SetPointer(This,pBuffer,lSize) \ - (This)->lpVtbl -> SetPointer(This,pBuffer,lSize) - -#define IAMMediaTypeSample_GetPointer(This,ppBuffer) \ - (This)->lpVtbl -> GetPointer(This,ppBuffer) - -#define IAMMediaTypeSample_GetSize(This) \ - (This)->lpVtbl -> GetSize(This) - -#define IAMMediaTypeSample_GetTime(This,pTimeStart,pTimeEnd) \ - (This)->lpVtbl -> GetTime(This,pTimeStart,pTimeEnd) - -#define IAMMediaTypeSample_SetTime(This,pTimeStart,pTimeEnd) \ - (This)->lpVtbl -> SetTime(This,pTimeStart,pTimeEnd) - -#define IAMMediaTypeSample_IsSyncPoint(This) \ - (This)->lpVtbl -> IsSyncPoint(This) - -#define IAMMediaTypeSample_SetSyncPoint(This,bIsSyncPoint) \ - (This)->lpVtbl -> SetSyncPoint(This,bIsSyncPoint) - -#define IAMMediaTypeSample_IsPreroll(This) \ - (This)->lpVtbl -> IsPreroll(This) - -#define IAMMediaTypeSample_SetPreroll(This,bIsPreroll) \ - (This)->lpVtbl -> SetPreroll(This,bIsPreroll) - -#define IAMMediaTypeSample_GetActualDataLength(This) \ - (This)->lpVtbl -> GetActualDataLength(This) - -#define IAMMediaTypeSample_SetActualDataLength(This,__MIDL_0017) \ - (This)->lpVtbl -> SetActualDataLength(This,__MIDL_0017) - -#define IAMMediaTypeSample_GetMediaType(This,ppMediaType) \ - (This)->lpVtbl -> GetMediaType(This,ppMediaType) - -#define IAMMediaTypeSample_SetMediaType(This,pMediaType) \ - (This)->lpVtbl -> SetMediaType(This,pMediaType) - -#define IAMMediaTypeSample_IsDiscontinuity(This) \ - (This)->lpVtbl -> IsDiscontinuity(This) - -#define IAMMediaTypeSample_SetDiscontinuity(This,bDiscontinuity) \ - (This)->lpVtbl -> SetDiscontinuity(This,bDiscontinuity) - -#define IAMMediaTypeSample_GetMediaTime(This,pTimeStart,pTimeEnd) \ - (This)->lpVtbl -> GetMediaTime(This,pTimeStart,pTimeEnd) - -#define IAMMediaTypeSample_SetMediaTime(This,pTimeStart,pTimeEnd) \ - (This)->lpVtbl -> SetMediaTime(This,pTimeStart,pTimeEnd) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeSample_SetPointer_Proxy( - IAMMediaTypeSample * This, - /* [in] */ BYTE *pBuffer, - /* [in] */ long lSize); - - -void __RPC_STUB IAMMediaTypeSample_SetPointer_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeSample_GetPointer_Proxy( - IAMMediaTypeSample * This, - /* [out] */ BYTE **ppBuffer); - - -void __RPC_STUB IAMMediaTypeSample_GetPointer_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -long STDMETHODCALLTYPE IAMMediaTypeSample_GetSize_Proxy( - IAMMediaTypeSample * This); - - -void __RPC_STUB IAMMediaTypeSample_GetSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeSample_GetTime_Proxy( - IAMMediaTypeSample * This, - /* [out] */ REFERENCE_TIME *pTimeStart, - /* [out] */ REFERENCE_TIME *pTimeEnd); - - -void __RPC_STUB IAMMediaTypeSample_GetTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeSample_SetTime_Proxy( - IAMMediaTypeSample * This, - /* [in] */ REFERENCE_TIME *pTimeStart, - /* [in] */ REFERENCE_TIME *pTimeEnd); - - -void __RPC_STUB IAMMediaTypeSample_SetTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeSample_IsSyncPoint_Proxy( - IAMMediaTypeSample * This); - - -void __RPC_STUB IAMMediaTypeSample_IsSyncPoint_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeSample_SetSyncPoint_Proxy( - IAMMediaTypeSample * This, - BOOL bIsSyncPoint); - - -void __RPC_STUB IAMMediaTypeSample_SetSyncPoint_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeSample_IsPreroll_Proxy( - IAMMediaTypeSample * This); - - -void __RPC_STUB IAMMediaTypeSample_IsPreroll_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeSample_SetPreroll_Proxy( - IAMMediaTypeSample * This, - BOOL bIsPreroll); - - -void __RPC_STUB IAMMediaTypeSample_SetPreroll_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -long STDMETHODCALLTYPE IAMMediaTypeSample_GetActualDataLength_Proxy( - IAMMediaTypeSample * This); - - -void __RPC_STUB IAMMediaTypeSample_GetActualDataLength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeSample_SetActualDataLength_Proxy( - IAMMediaTypeSample * This, - long __MIDL_0017); - - -void __RPC_STUB IAMMediaTypeSample_SetActualDataLength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeSample_GetMediaType_Proxy( - IAMMediaTypeSample * This, - AM_MEDIA_TYPE **ppMediaType); - - -void __RPC_STUB IAMMediaTypeSample_GetMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeSample_SetMediaType_Proxy( - IAMMediaTypeSample * This, - AM_MEDIA_TYPE *pMediaType); - - -void __RPC_STUB IAMMediaTypeSample_SetMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeSample_IsDiscontinuity_Proxy( - IAMMediaTypeSample * This); - - -void __RPC_STUB IAMMediaTypeSample_IsDiscontinuity_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeSample_SetDiscontinuity_Proxy( - IAMMediaTypeSample * This, - BOOL bDiscontinuity); - - -void __RPC_STUB IAMMediaTypeSample_SetDiscontinuity_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeSample_GetMediaTime_Proxy( - IAMMediaTypeSample * This, - /* [out] */ LONGLONG *pTimeStart, - /* [out] */ LONGLONG *pTimeEnd); - - -void __RPC_STUB IAMMediaTypeSample_GetMediaTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMMediaTypeSample_SetMediaTime_Proxy( - IAMMediaTypeSample * This, - /* [in] */ LONGLONG *pTimeStart, - /* [in] */ LONGLONG *pTimeEnd); - - -void __RPC_STUB IAMMediaTypeSample_SetMediaTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMMediaTypeSample_INTERFACE_DEFINED__ */ - - - -#ifndef __DirectShowStreamLib_LIBRARY_DEFINED__ -#define __DirectShowStreamLib_LIBRARY_DEFINED__ - -/* library DirectShowStreamLib */ -/* [helpstring][version][uuid] */ - - -EXTERN_C const IID LIBID_DirectShowStreamLib; - -EXTERN_C const CLSID CLSID_AMMultiMediaStream; - -#ifdef __cplusplus - -class DECLSPEC_UUID("49c47ce5-9ba4-11d0-8212-00c04fc32c45") -AMMultiMediaStream; -#endif -#endif /* __DirectShowStreamLib_LIBRARY_DEFINED__ */ - -/* interface __MIDL_itf_amstream_0410 */ -/* [local] */ - -#ifndef __cplusplus -EXTERN_C const CLSID CLSID_AMMultiMediaStream; -#endif -DEFINE_GUID(CLSID_AMDirectDrawStream, /* 49c47ce4-9ba4-11d0-8212-00c04fc32c45 */ -0x49c47ce4, 0x9ba4, 0x11d0, 0x82, 0x12, 0x00, 0xc0, 0x4f, 0xc3, 0x2c, 0x45); -DEFINE_GUID(CLSID_AMAudioStream, /* 8496e040-af4c-11d0-8212-00c04fc32c45 */ -0x8496e040, 0xaf4c, 0x11d0, 0x82, 0x12, 0x00, 0xc0, 0x4f, 0xc3, 0x2c, 0x45); -DEFINE_GUID(CLSID_AMAudioData, /* f2468580-af8a-11d0-8212-00c04fc32c45 */ -0xf2468580, 0xaf8a, 0x11d0, 0x82, 0x12, 0x00, 0xc0, 0x4f, 0xc3, 0x2c, 0x45); -DEFINE_GUID(CLSID_AMMediaTypeStream, /* CF0F2F7C-F7BF-11d0-900D-00C04FD9189D */ -0xcf0f2f7c, 0xf7bf, 0x11d0, 0x90, 0xd, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0x9d); - - -extern RPC_IF_HANDLE __MIDL_itf_amstream_0410_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_amstream_0410_v0_0_s_ifspec; - -/* Additional Prototypes for ALL interfaces */ - -unsigned long __RPC_USER BSTR_UserSize( unsigned long *, unsigned long , BSTR * ); -unsigned char * __RPC_USER BSTR_UserMarshal( unsigned long *, unsigned char *, BSTR * ); -unsigned char * __RPC_USER BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); -void __RPC_USER BSTR_UserFree( unsigned long *, BSTR * ); - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/amva.h b/import/DirectX8/include/amva.h deleted file mode 100644 index fd46164fe..000000000 --- a/import/DirectX8/include/amva.h +++ /dev/null @@ -1,85 +0,0 @@ -//------------------------------------------------------------------------------ -// File: AMVA.h -// -// Desc: DirectShowMotionComp include file. -// -// Copyright (c) 1997-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __AMVA_INCLUDED__ -#define __AMVA_INCLUDED__ - -#ifdef __cplusplus -extern "C" { -#endif - - -#define AMVA_TYPEINDEX_OUTPUTFRAME 0xFFFFFFFF - -// Flags for QueryRenderStatus -#define AMVA_QUERYRENDERSTATUSF_READ 0x00000001 // Query for read - // set this bit to 0 - // if query for update - -typedef struct _tag_AMVAUncompBufferInfo -{ - DWORD dwMinNumSurfaces; // IN min number of surfaces to be allocated - DWORD dwMaxNumSurfaces; // IN max number of surfaces to be allocated - DDPIXELFORMAT ddUncompPixelFormat; // IN pixel format of surfaces to be allocated -} AMVAUncompBufferInfo, *LPAMVAUncompBufferInfo; - -typedef struct _tag_AMVAUncompDataInfo -{ - DWORD dwUncompWidth; // [in] width of uncompressed data - DWORD dwUncompHeight; // [in] height of uncompressed data - DDPIXELFORMAT ddUncompPixelFormat; // [in] pixel-format of uncompressed data -} AMVAUncompDataInfo, *LPAMVAUncompDataInfo; - -typedef struct _tag_AMVAInternalMemInfo -{ - DWORD dwScratchMemAlloc; // [out] amount of scratch memory will the hal allocate for its private use -} AMVAInternalMemInfo, *LPAMVAInternalMemInfo; - - -typedef struct _tag_AMVACompBufferInfo -{ - DWORD dwNumCompBuffers; // [out] number of buffers reqd for compressed data - DWORD dwWidthToCreate; // [out] Width of surface to create - DWORD dwHeightToCreate; // [out] Height of surface to create - DWORD dwBytesToAllocate; // [out] Total number of bytes used by each surface - DDSCAPS2 ddCompCaps; // [out] caps to create surfaces to store compressed data - DDPIXELFORMAT ddPixelFormat; // [out] fourcc to create surfaces to store compressed data -} AMVACompBufferInfo, *LPAMVACompBufferInfo; - - -// Note that you are NOT allowed to store any pointer in pMiscData -typedef struct _tag_AMVABeginFrameInfo -{ - DWORD dwDestSurfaceIndex; // IN destination buffer in which to decoding this frame - LPVOID pInputData; // IN pointer to misc data - DWORD dwSizeInputData; // IN size of other misc data to begin frame - LPVOID pOutputData; // OUT pointer to data which the VGA is going to fill - DWORD dwSizeOutputData; // IN size of data which the VGA is going to fill -} AMVABeginFrameInfo, *LPAMVABeginFrameInfo; - -// Note that you are NOT allowed to store any pointer in pMiscData -typedef struct _tag_AMVAEndFrameInfo -{ - DWORD dwSizeMiscData; // [in] size of other misc data to begin frame - LPVOID pMiscData; // [in] pointer to misc data -} AMVAEndFrameInfo, *LPAMVAEndFrameInfo; - -typedef struct _tag_AMVABUFFERINFO -{ - DWORD dwTypeIndex; // [in] Type of buffer - DWORD dwBufferIndex; // [in] Buffer index - DWORD dwDataOffset; // [in] offset of relevant data from the beginning of buffer - DWORD dwDataSize; // [in] size of relevant data -} AMVABUFFERINFO, *LPAMVABUFFERINFO; - -#ifdef __cplusplus -}; -#endif - -#endif // _AMVA_INCLUDED diff --git a/import/DirectX8/include/amvideo.h b/import/DirectX8/include/amvideo.h deleted file mode 100644 index ebdbb70d8..000000000 --- a/import/DirectX8/include/amvideo.h +++ /dev/null @@ -1,433 +0,0 @@ -//------------------------------------------------------------------------------ -// File: AMVideo.h -// -// Desc: Video related definitions and interfaces for ActiveMovie. -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __AMVIDEO__ -#define __AMVIDEO__ - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -#include - - -// This is an interface on the video renderer that provides information about -// DirectDraw with respect to its use by the renderer. For example it allows -// an application to get details of the surface and any hardware capabilities -// that are available. It also allows someone to adjust the surfaces that the -// renderer should use and furthermore even set the DirectDraw instance. We -// allow someone to set the DirectDraw instance because DirectDraw can only -// be opened once per process so it helps resolve conflicts. There is some -// duplication in this interface as the hardware/emulated/FOURCCs available -// can all be found through the IDirectDraw interface, this interface allows -// simple access to that information without calling the DirectDraw provider -// itself. The AMDDS prefix is ActiveMovie DirectDraw Switches abbreviated. - -#define AMDDS_NONE 0x00 // No use for DCI/DirectDraw -#define AMDDS_DCIPS 0x01 // Use DCI primary surface -#define AMDDS_PS 0x02 // Use DirectDraw primary -#define AMDDS_RGBOVR 0x04 // RGB overlay surfaces -#define AMDDS_YUVOVR 0x08 // YUV overlay surfaces -#define AMDDS_RGBOFF 0x10 // RGB offscreen surfaces -#define AMDDS_YUVOFF 0x20 // YUV offscreen surfaces -#define AMDDS_RGBFLP 0x40 // RGB flipping surfaces -#define AMDDS_YUVFLP 0x80 // YUV flipping surfaces -#define AMDDS_ALL 0xFF // ALL the previous flags -#define AMDDS_DEFAULT AMDDS_ALL // Use all available surfaces - -#define AMDDS_YUV (AMDDS_YUVOFF | AMDDS_YUVOVR | AMDDS_YUVFLP) -#define AMDDS_RGB (AMDDS_RGBOFF | AMDDS_RGBOVR | AMDDS_RGBFLP) -#define AMDDS_PRIMARY (AMDDS_DCIPS | AMDDS_PS) - -// be nice to our friends in C -#undef INTERFACE -#define INTERFACE IDirectDrawVideo - -DECLARE_INTERFACE_(IDirectDrawVideo, IUnknown) -{ - // IUnknown methods - - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID *ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - // IDirectDrawVideo methods - - STDMETHOD(GetSwitches)(THIS_ DWORD *pSwitches) PURE; - STDMETHOD(SetSwitches)(THIS_ DWORD Switches) PURE; - STDMETHOD(GetCaps)(THIS_ DDCAPS *pCaps) PURE; - STDMETHOD(GetEmulatedCaps)(THIS_ DDCAPS *pCaps) PURE; - STDMETHOD(GetSurfaceDesc)(THIS_ DDSURFACEDESC *pSurfaceDesc) PURE; - STDMETHOD(GetFourCCCodes)(THIS_ DWORD *pCount,DWORD *pCodes) PURE; - STDMETHOD(SetDirectDraw)(THIS_ LPDIRECTDRAW pDirectDraw) PURE; - STDMETHOD(GetDirectDraw)(THIS_ LPDIRECTDRAW *ppDirectDraw) PURE; - STDMETHOD(GetSurfaceType)(THIS_ DWORD *pSurfaceType) PURE; - STDMETHOD(SetDefault)(THIS) PURE; - STDMETHOD(UseScanLine)(THIS_ long UseScanLine) PURE; - STDMETHOD(CanUseScanLine)(THIS_ long *UseScanLine) PURE; - STDMETHOD(UseOverlayStretch)(THIS_ long UseOverlayStretch) PURE; - STDMETHOD(CanUseOverlayStretch)(THIS_ long *UseOverlayStretch) PURE; - STDMETHOD(UseWhenFullScreen)(THIS_ long UseWhenFullScreen) PURE; - STDMETHOD(WillUseFullScreen)(THIS_ long *UseWhenFullScreen) PURE; -}; - - -// be nice to our friends in C -#undef INTERFACE -#define INTERFACE IQualProp - -DECLARE_INTERFACE_(IQualProp, IUnknown) -{ - // IUnknown methods - - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID *ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - // Compare these with the functions in class CGargle in gargle.h - - STDMETHOD(get_FramesDroppedInRenderer)(THIS_ int *pcFrames) PURE; // Out - STDMETHOD(get_FramesDrawn)(THIS_ int *pcFramesDrawn) PURE; // Out - STDMETHOD(get_AvgFrameRate)(THIS_ int *piAvgFrameRate) PURE; // Out - STDMETHOD(get_Jitter)(THIS_ int *iJitter) PURE; // Out - STDMETHOD(get_AvgSyncOffset)(THIS_ int *piAvg) PURE; // Out - STDMETHOD(get_DevSyncOffset)(THIS_ int *piDev) PURE; // Out -}; - - -// This interface allows an application or plug in distributor to control a -// full screen renderer. The Modex renderer supports this interface. When -// connected a renderer should load the display modes it has available -// The number of modes available can be obtained through CountModes. Then -// information on each individual mode is available by calling GetModeInfo -// and IsModeAvailable. An application may enable and disable any modes -// by calling the SetEnabled flag with OATRUE or OAFALSE (not C/C++ TRUE -// and FALSE values) - the current value may be queried by IsModeEnabled - -// A more generic way of setting the modes enabled that is easier to use -// when writing applications is the clip loss factor. This defines the -// amount of video that can be lost when deciding which display mode to -// use. Assuming the decoder cannot compress the video then playing an -// MPEG file (say 352x288) into a 320x200 display will lose about 25% of -// the image. The clip loss factor specifies the upper range permissible. -// To allow typical MPEG video to be played in 320x200 it defaults to 25% - -// be nice to our friends in C -#undef INTERFACE -#define INTERFACE IFullScreenVideo - -DECLARE_INTERFACE_(IFullScreenVideo, IUnknown) -{ - // IUnknown methods - - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID *ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - // IFullScreenVideo methods - - STDMETHOD(CountModes)(THIS_ long *pModes) PURE; - STDMETHOD(GetModeInfo)(THIS_ long Mode,long *pWidth,long *pHeight,long *pDepth) PURE; - STDMETHOD(GetCurrentMode)(THIS_ long *pMode) PURE; - STDMETHOD(IsModeAvailable)(THIS_ long Mode) PURE; - STDMETHOD(IsModeEnabled)(THIS_ long Mode) PURE; - STDMETHOD(SetEnabled)(THIS_ long Mode,long bEnabled) PURE; - STDMETHOD(GetClipFactor)(THIS_ long *pClipFactor) PURE; - STDMETHOD(SetClipFactor)(THIS_ long ClipFactor) PURE; - STDMETHOD(SetMessageDrain)(THIS_ HWND hwnd) PURE; - STDMETHOD(GetMessageDrain)(THIS_ HWND *hwnd) PURE; - STDMETHOD(SetMonitor)(THIS_ long Monitor) PURE; - STDMETHOD(GetMonitor)(THIS_ long *Monitor) PURE; - STDMETHOD(HideOnDeactivate)(THIS_ long Hide) PURE; - STDMETHOD(IsHideOnDeactivate)(THIS) PURE; - STDMETHOD(SetCaption)(THIS_ BSTR strCaption) PURE; - STDMETHOD(GetCaption)(THIS_ BSTR *pstrCaption) PURE; - STDMETHOD(SetDefault)(THIS) PURE; -}; - - -// This adds the accelerator table capabilities in fullscreen. This is being -// added between the original runtime release and the full SDK release. We -// cannot just add the method to IFullScreenVideo as we don't want to force -// applications to have to ship the ActiveMovie support DLLs - this is very -// important to applications that plan on being downloaded over the Internet - -// be nice to our friends in C -#undef INTERFACE -#define INTERFACE IFullScreenVideoEx - -DECLARE_INTERFACE_(IFullScreenVideoEx, IFullScreenVideo) -{ - // IUnknown methods - - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID *ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - // IFullScreenVideo methods - - STDMETHOD(CountModes)(THIS_ long *pModes) PURE; - STDMETHOD(GetModeInfo)(THIS_ long Mode,long *pWidth,long *pHeight,long *pDepth) PURE; - STDMETHOD(GetCurrentMode)(THIS_ long *pMode) PURE; - STDMETHOD(IsModeAvailable)(THIS_ long Mode) PURE; - STDMETHOD(IsModeEnabled)(THIS_ long Mode) PURE; - STDMETHOD(SetEnabled)(THIS_ long Mode,long bEnabled) PURE; - STDMETHOD(GetClipFactor)(THIS_ long *pClipFactor) PURE; - STDMETHOD(SetClipFactor)(THIS_ long ClipFactor) PURE; - STDMETHOD(SetMessageDrain)(THIS_ HWND hwnd) PURE; - STDMETHOD(GetMessageDrain)(THIS_ HWND *hwnd) PURE; - STDMETHOD(SetMonitor)(THIS_ long Monitor) PURE; - STDMETHOD(GetMonitor)(THIS_ long *Monitor) PURE; - STDMETHOD(HideOnDeactivate)(THIS_ long Hide) PURE; - STDMETHOD(IsHideOnDeactivate)(THIS) PURE; - STDMETHOD(SetCaption)(THIS_ BSTR strCaption) PURE; - STDMETHOD(GetCaption)(THIS_ BSTR *pstrCaption) PURE; - STDMETHOD(SetDefault)(THIS) PURE; - - // IFullScreenVideoEx - - STDMETHOD(SetAcceleratorTable)(THIS_ HWND hwnd,HACCEL hAccel) PURE; - STDMETHOD(GetAcceleratorTable)(THIS_ HWND *phwnd,HACCEL *phAccel) PURE; - STDMETHOD(KeepPixelAspectRatio)(THIS_ long KeepAspect) PURE; - STDMETHOD(IsKeepPixelAspectRatio)(THIS_ long *pKeepAspect) PURE; -}; - - -// The SDK base classes contain a base video mixer class. Video mixing in a -// software environment is tricky because we typically have multiple streams -// each sending data at unpredictable times. To work with this we defined a -// pin that is the lead pin, when data arrives on this pin we do a mix. As -// an alternative we may not want to have a lead pin but output samples at -// predefined spaces, like one every 1/15 of a second, this interfaces also -// supports that mode of operations (there is a working video mixer sample) - -// be nice to our friends in C -#undef INTERFACE -#define INTERFACE IBaseVideoMixer - -DECLARE_INTERFACE_(IBaseVideoMixer, IUnknown) -{ - STDMETHOD(SetLeadPin)(THIS_ int iPin) PURE; - STDMETHOD(GetLeadPin)(THIS_ int *piPin) PURE; - STDMETHOD(GetInputPinCount)(THIS_ int *piPinCount) PURE; - STDMETHOD(IsUsingClock)(THIS_ int *pbValue) PURE; - STDMETHOD(SetUsingClock)(THIS_ int bValue) PURE; - STDMETHOD(GetClockPeriod)(THIS_ int *pbValue) PURE; - STDMETHOD(SetClockPeriod)(THIS_ int bValue) PURE; -}; - -#define iPALETTE_COLORS 256 // Maximum colours in palette -#define iEGA_COLORS 16 // Number colours in EGA palette -#define iMASK_COLORS 3 // Maximum three components -#define iTRUECOLOR 16 // Minimum true colour device -#define iRED 0 // Index position for RED mask -#define iGREEN 1 // Index position for GREEN mask -#define iBLUE 2 // Index position for BLUE mask -#define iPALETTE 8 // Maximum colour depth using a palette -#define iMAXBITS 8 // Maximum bits per colour component - - -// Used for true colour images that also have a palette - -typedef struct tag_TRUECOLORINFO { - DWORD dwBitMasks[iMASK_COLORS]; - RGBQUAD bmiColors[iPALETTE_COLORS]; -} TRUECOLORINFO; - - -// The BITMAPINFOHEADER contains all the details about the video stream such -// as the actual image dimensions and their pixel depth. A source filter may -// also request that the sink take only a section of the video by providing a -// clipping rectangle in rcSource. In the worst case where the sink filter -// forgets to check this on connection it will simply render the whole thing -// which isn't a disaster. Ideally a sink filter will check the rcSource and -// if it doesn't support image extraction and the rectangle is not empty then -// it will reject the connection. A filter should use SetRectEmpty to reset a -// rectangle to all zeroes (and IsRectEmpty to later check the rectangle). -// The rcTarget specifies the destination rectangle for the video, for most -// source filters they will set this to all zeroes, a downstream filter may -// request that the video be placed in a particular area of the buffers it -// supplies in which case it will call QueryAccept with a non empty target - -typedef struct tagVIDEOINFOHEADER { - - RECT rcSource; // The bit we really want to use - RECT rcTarget; // Where the video should go - DWORD dwBitRate; // Approximate bit data rate - DWORD dwBitErrorRate; // Bit error rate for this stream - REFERENCE_TIME AvgTimePerFrame; // Average time per frame (100ns units) - - BITMAPINFOHEADER bmiHeader; - -} VIDEOINFOHEADER; - -// make sure the pbmi is initialized before using these macros -#define TRUECOLOR(pbmi) ((TRUECOLORINFO *)(((LPBYTE)&((pbmi)->bmiHeader)) \ - + (pbmi)->bmiHeader.biSize)) -#define COLORS(pbmi) ((RGBQUAD *)(((LPBYTE)&((pbmi)->bmiHeader)) \ - + (pbmi)->bmiHeader.biSize)) -#define BITMASKS(pbmi) ((DWORD *)(((LPBYTE)&((pbmi)->bmiHeader)) \ - + (pbmi)->bmiHeader.biSize)) - -// All the image based filters use this to communicate their media types. It's -// centred principally around the BITMAPINFO. This structure always contains a -// BITMAPINFOHEADER followed by a number of other fields depending on what the -// BITMAPINFOHEADER contains. If it contains details of a palettised format it -// will be followed by one or more RGBQUADs defining the palette. If it holds -// details of a true colour format then it may be followed by a set of three -// DWORD bit masks that specify where the RGB data can be found in the image -// (For more information regarding BITMAPINFOs see the Win32 documentation) - -// The rcSource and rcTarget fields are not for use by filters supplying the -// data. The destination (target) rectangle should be set to all zeroes. The -// source may also be zero filled or set with the dimensions of the video. So -// if the video is 352x288 pixels then set it to (0,0,352,288). These fields -// are mainly used by downstream filters that want to ask the source filter -// to place the image in a different position in an output buffer. So when -// using for example the primary surface the video renderer may ask a filter -// to place the video images in a destination position of (100,100,452,388) -// on the display since that's where the window is positioned on the display - -// !!! WARNING !!! -// DO NOT use this structure unless you are sure that the BITMAPINFOHEADER -// has a normal biSize == sizeof(BITMAPINFOHEADER) ! -// !!! WARNING !!! - -typedef struct tagVIDEOINFO { - - RECT rcSource; // The bit we really want to use - RECT rcTarget; // Where the video should go - DWORD dwBitRate; // Approximate bit data rate - DWORD dwBitErrorRate; // Bit error rate for this stream - REFERENCE_TIME AvgTimePerFrame; // Average time per frame (100ns units) - - BITMAPINFOHEADER bmiHeader; - - union { - RGBQUAD bmiColors[iPALETTE_COLORS]; // Colour palette - DWORD dwBitMasks[iMASK_COLORS]; // True colour masks - TRUECOLORINFO TrueColorInfo; // Both of the above - }; - -} VIDEOINFO; - -// These macros define some standard bitmap format sizes - -#define SIZE_EGA_PALETTE (iEGA_COLORS * sizeof(RGBQUAD)) -#define SIZE_PALETTE (iPALETTE_COLORS * sizeof(RGBQUAD)) -#define SIZE_MASKS (iMASK_COLORS * sizeof(DWORD)) -#define SIZE_PREHEADER (FIELD_OFFSET(VIDEOINFOHEADER,bmiHeader)) -#define SIZE_VIDEOHEADER (sizeof(BITMAPINFOHEADER) + SIZE_PREHEADER) -// !!! for abnormal biSizes -// #define SIZE_VIDEOHEADER(pbmi) ((pbmi)->bmiHeader.biSize + SIZE_PREHEADER) - -// DIBSIZE calculates the number of bytes required by an image - -#define WIDTHBYTES(bits) ((DWORD)(((bits)+31) & (~31)) / 8) -#define DIBWIDTHBYTES(bi) (DWORD)WIDTHBYTES((DWORD)(bi).biWidth * (DWORD)(bi).biBitCount) -#define _DIBSIZE(bi) (DIBWIDTHBYTES(bi) * (DWORD)(bi).biHeight) -#define DIBSIZE(bi) ((bi).biHeight < 0 ? (-1)*(_DIBSIZE(bi)) : _DIBSIZE(bi)) - -// This compares the bit masks between two VIDEOINFOHEADERs - -#define BIT_MASKS_MATCH(pbmi1,pbmi2) \ - (((pbmi1)->dwBitMasks[iRED] == (pbmi2)->dwBitMasks[iRED]) && \ - ((pbmi1)->dwBitMasks[iGREEN] == (pbmi2)->dwBitMasks[iGREEN]) && \ - ((pbmi1)->dwBitMasks[iBLUE] == (pbmi2)->dwBitMasks[iBLUE])) - -// These zero fill different parts of the VIDEOINFOHEADER structure - -// Only use these macros for pbmi's with a normal BITMAPINFOHEADER biSize -#define RESET_MASKS(pbmi) (ZeroMemory((PVOID)(pbmi)->dwBitFields,SIZE_MASKS)) -#define RESET_HEADER(pbmi) (ZeroMemory((PVOID)(pbmi),SIZE_VIDEOHEADER)) -#define RESET_PALETTE(pbmi) (ZeroMemory((PVOID)(pbmi)->bmiColors,SIZE_PALETTE)); - -#if 0 -// !!! This is the right way to do it, but may break existing code -#define RESET_MASKS(pbmi) (ZeroMemory((PVOID)(((LPBYTE)(pbmi)->bmiHeader) + \ - (pbmi)->bmiHeader.biSize,SIZE_MASKS))) -#define RESET_HEADER(pbmi) (ZeroMemory((PVOID)(pbmi), SIZE_PREHEADER + \ - sizeof(BITMAPINFOHEADER))) -#define RESET_PALETTE(pbmi) (ZeroMemory((PVOID)(((LPBYTE)(pbmi)->bmiHeader) + \ - (pbmi)->bmiHeader.biSize,SIZE_PALETTE)) -#endif - -// Other (hopefully) useful bits and bobs - -#define PALETTISED(pbmi) ((pbmi)->bmiHeader.biBitCount <= iPALETTE) -#define PALETTE_ENTRIES(pbmi) ((DWORD) 1 << (pbmi)->bmiHeader.biBitCount) - -// Returns the address of the BITMAPINFOHEADER from the VIDEOINFOHEADER -#define HEADER(pVideoInfo) (&(((VIDEOINFOHEADER *) (pVideoInfo))->bmiHeader)) - - -// MPEG variant - includes a DWORD length followed by the -// video sequence header after the video header. -// -// The sequence header includes the sequence header start code and the -// quantization matrices associated with the first sequence header in the -// stream so is a maximum of 140 bytes long. - -typedef struct tagMPEG1VIDEOINFO { - - VIDEOINFOHEADER hdr; // Compatible with VIDEOINFO - DWORD dwStartTimeCode; // 25-bit Group of pictures time code - // at start of data - DWORD cbSequenceHeader; // Length in bytes of bSequenceHeader - BYTE bSequenceHeader[1]; // Sequence header including - // quantization matrices if any -} MPEG1VIDEOINFO; - -#define MAX_SIZE_MPEG1_SEQUENCE_INFO 140 -#define SIZE_MPEG1VIDEOINFO(pv) (FIELD_OFFSET(MPEG1VIDEOINFO, bSequenceHeader[0]) + (pv)->cbSequenceHeader) -#define MPEG1_SEQUENCE_INFO(pv) ((const BYTE *)(pv)->bSequenceHeader) - - -// Analog video variant - Use this when the format is FORMAT_AnalogVideo -// -// rcSource defines the portion of the active video signal to use -// rcTarget defines the destination rectangle -// both of the above are relative to the dwActiveWidth and dwActiveHeight fields -// dwActiveWidth is currently set to 720 for all formats (but could change for HDTV) -// dwActiveHeight is 483 for NTSC and 575 for PAL/SECAM (but could change for HDTV) - -typedef struct tagAnalogVideoInfo { - RECT rcSource; // Width max is 720, height varies w/ TransmissionStd - RECT rcTarget; // Where the video should go - DWORD dwActiveWidth; // Always 720 (CCIR-601 active samples per line) - DWORD dwActiveHeight; // 483 for NTSC, 575 for PAL/SECAM - REFERENCE_TIME AvgTimePerFrame; // Normal ActiveMovie units (100 nS) -} ANALOGVIDEOINFO; - -// -// AM_KSPROPSETID_FrameStep property set definitions -// -typedef enum { - // Step - AM_PROPERTY_FRAMESTEP_STEP = 0x01, - AM_PROPERTY_FRAMESTEP_CANCEL = 0x02, - - // S_OK for these 2 means we can - S_FALSE if we can't - AM_PROPERTY_FRAMESTEP_CANSTEP = 0x03, - AM_PROPERTY_FRAMESTEP_CANSTEPMULTIPLE = 0x04 -} AM_PROPERTY_FRAMESTEP; - -typedef struct _AM_FRAMESTEP_STEP -{ - // 1 means step 1 frame forward - // 0 is invalid - // n (n > 1) means skip n - 1 frames and show the nth - DWORD dwFramesToStep; -} AM_FRAMESTEP_STEP; - -#ifdef __cplusplus -} -#endif // __cplusplus -#endif // __AMVIDEO__ - diff --git a/import/DirectX8/include/atsmedia.h b/import/DirectX8/include/atsmedia.h deleted file mode 100644 index 3e268a555..000000000 --- a/import/DirectX8/include/atsmedia.h +++ /dev/null @@ -1,34 +0,0 @@ -//------------------------------------------------------------------------------ -// File: ATSMedia.h -// -// Desc: Broadcast Driver Architecture Media Definitions for ATSC -// -// Copyright (c) 1996-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#if !defined(_KSMEDIA_) -#error KSMEDIA.H must be included before BDAMEDIA.H -#endif // !defined(_KSMEDIA_) - -#if !defined(_BDAMEDIA_) -#error BDAMEDIA.H must be included before ATSCMEDIA.H -#endif // !defined(_KSMEDIA_) - -#if !defined(_ATSCMEDIA_) -#define _ATSCMEDIA_ - - -//=========================================================================== -// -// ATSC Network Type -// -//=========================================================================== - -#define STATIC_BDANETWORKTYPE_ATSC\ - 0x71985f51, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("71985F51-1CA1-11d3-9CC8-00C04F7971E0", BDANETWORKTYPE_ATSC); -#define BDANETWORKTYPE_ATSC DEFINE_GUIDNAMED(BDANETWORKTYPE_ATSC) - - -#endif // _ATSCMEDIA_ diff --git a/import/DirectX8/include/audevcod.h b/import/DirectX8/include/audevcod.h deleted file mode 100644 index 98dfbfc28..000000000 --- a/import/DirectX8/include/audevcod.h +++ /dev/null @@ -1,53 +0,0 @@ -//------------------------------------------------------------------------------ -// File: AudEvCod.h -// -// Desc: List of Audio device error event codes and the expected params. -// -// Copyright (c) 1999-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - - -#ifndef __AUDEVCOD__ -#define __AUDEVCOD__ - - -#define EC_SND_DEVICE_ERROR_BASE 0x0200 - -typedef enum _tagSND_DEVICE_ERROR { - - SNDDEV_ERROR_Open=1, - SNDDEV_ERROR_Close=2, - SNDDEV_ERROR_GetCaps=3, - SNDDEV_ERROR_PrepareHeader=4, - SNDDEV_ERROR_UnprepareHeader=5, - SNDDEV_ERROR_Reset=6, - SNDDEV_ERROR_Restart=7, - SNDDEV_ERROR_GetPosition=8, - SNDDEV_ERROR_Write=9, - SNDDEV_ERROR_Pause=10, - SNDDEV_ERROR_Stop=11, - SNDDEV_ERROR_Start=12, - SNDDEV_ERROR_AddBuffer=13, - SNDDEV_ERROR_Query=14, - -} SNDDEV_ERR; - - -// Sound device error event codes -// ============================== -// -// All audio device error events are always passed on to the application, and are -// never processed by the filter graph - - -#define EC_SNDDEV_IN_ERROR (EC_SND_DEVICE_ERROR_BASE + 0x00) -#define EC_SNDDEV_OUT_ERROR (EC_SND_DEVICE_ERROR_BASE + 0x01) -// Parameters: ( DWORD, DWORD) -// lParam1 is an enum SND_DEVICE_ERROR which notifies the app how the device was -// being accessed when the failure occurred. -// -// lParam2 is the error returned from the sound device call. -// - -#endif // __AUDEVCOD__ diff --git a/import/DirectX8/include/austream.h b/import/DirectX8/include/austream.h deleted file mode 100644 index 43f653e50..000000000 --- a/import/DirectX8/include/austream.h +++ /dev/null @@ -1,715 +0,0 @@ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 6.00.0347 */ -/* Compiler settings for austream.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __austream_h__ -#define __austream_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __IAudioMediaStream_FWD_DEFINED__ -#define __IAudioMediaStream_FWD_DEFINED__ -typedef interface IAudioMediaStream IAudioMediaStream; -#endif /* __IAudioMediaStream_FWD_DEFINED__ */ - - -#ifndef __IAudioStreamSample_FWD_DEFINED__ -#define __IAudioStreamSample_FWD_DEFINED__ -typedef interface IAudioStreamSample IAudioStreamSample; -#endif /* __IAudioStreamSample_FWD_DEFINED__ */ - - -#ifndef __IMemoryData_FWD_DEFINED__ -#define __IMemoryData_FWD_DEFINED__ -typedef interface IMemoryData IMemoryData; -#endif /* __IMemoryData_FWD_DEFINED__ */ - - -#ifndef __IAudioData_FWD_DEFINED__ -#define __IAudioData_FWD_DEFINED__ -typedef interface IAudioData IAudioData; -#endif /* __IAudioData_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "unknwn.h" -#include "mmstream.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void * ); - -/* interface __MIDL_itf_austream_0000 */ -/* [local] */ - -// -// The following declarations within the 'if 0' block are dummy typedefs used to make -// the ddstream.idl file build. The actual definitions are contained in DDRAW.H -// -#if 0 -typedef struct tWAVEFORMATEX WAVEFORMATEX; - -#endif - - - - - - -extern RPC_IF_HANDLE __MIDL_itf_austream_0000_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_austream_0000_v0_0_s_ifspec; - -#ifndef __IAudioMediaStream_INTERFACE_DEFINED__ -#define __IAudioMediaStream_INTERFACE_DEFINED__ - -/* interface IAudioMediaStream */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IAudioMediaStream; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("f7537560-a3be-11d0-8212-00c04fc32c45") - IAudioMediaStream : public IMediaStream - { - public: - virtual HRESULT STDMETHODCALLTYPE GetFormat( - /* [out] */ WAVEFORMATEX *pWaveFormatCurrent) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFormat( - /* [in] */ const WAVEFORMATEX *lpWaveFormat) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateSample( - /* [in] */ IAudioData *pAudioData, - /* [in] */ DWORD dwFlags, - /* [out] */ IAudioStreamSample **ppSample) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAudioMediaStreamVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAudioMediaStream * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAudioMediaStream * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAudioMediaStream * This); - - HRESULT ( STDMETHODCALLTYPE *GetMultiMediaStream )( - IAudioMediaStream * This, - /* [out] */ IMultiMediaStream **ppMultiMediaStream); - - HRESULT ( STDMETHODCALLTYPE *GetInformation )( - IAudioMediaStream * This, - /* [out] */ MSPID *pPurposeId, - /* [out] */ STREAM_TYPE *pType); - - HRESULT ( STDMETHODCALLTYPE *SetSameFormat )( - IAudioMediaStream * This, - /* [in] */ IMediaStream *pStreamThatHasDesiredFormat, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *AllocateSample )( - IAudioMediaStream * This, - /* [in] */ DWORD dwFlags, - /* [out] */ IStreamSample **ppSample); - - HRESULT ( STDMETHODCALLTYPE *CreateSharedSample )( - IAudioMediaStream * This, - /* [in] */ IStreamSample *pExistingSample, - /* [in] */ DWORD dwFlags, - /* [out] */ IStreamSample **ppNewSample); - - HRESULT ( STDMETHODCALLTYPE *SendEndOfStream )( - IAudioMediaStream * This, - DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *GetFormat )( - IAudioMediaStream * This, - /* [out] */ WAVEFORMATEX *pWaveFormatCurrent); - - HRESULT ( STDMETHODCALLTYPE *SetFormat )( - IAudioMediaStream * This, - /* [in] */ const WAVEFORMATEX *lpWaveFormat); - - HRESULT ( STDMETHODCALLTYPE *CreateSample )( - IAudioMediaStream * This, - /* [in] */ IAudioData *pAudioData, - /* [in] */ DWORD dwFlags, - /* [out] */ IAudioStreamSample **ppSample); - - END_INTERFACE - } IAudioMediaStreamVtbl; - - interface IAudioMediaStream - { - CONST_VTBL struct IAudioMediaStreamVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAudioMediaStream_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAudioMediaStream_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAudioMediaStream_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAudioMediaStream_GetMultiMediaStream(This,ppMultiMediaStream) \ - (This)->lpVtbl -> GetMultiMediaStream(This,ppMultiMediaStream) - -#define IAudioMediaStream_GetInformation(This,pPurposeId,pType) \ - (This)->lpVtbl -> GetInformation(This,pPurposeId,pType) - -#define IAudioMediaStream_SetSameFormat(This,pStreamThatHasDesiredFormat,dwFlags) \ - (This)->lpVtbl -> SetSameFormat(This,pStreamThatHasDesiredFormat,dwFlags) - -#define IAudioMediaStream_AllocateSample(This,dwFlags,ppSample) \ - (This)->lpVtbl -> AllocateSample(This,dwFlags,ppSample) - -#define IAudioMediaStream_CreateSharedSample(This,pExistingSample,dwFlags,ppNewSample) \ - (This)->lpVtbl -> CreateSharedSample(This,pExistingSample,dwFlags,ppNewSample) - -#define IAudioMediaStream_SendEndOfStream(This,dwFlags) \ - (This)->lpVtbl -> SendEndOfStream(This,dwFlags) - - -#define IAudioMediaStream_GetFormat(This,pWaveFormatCurrent) \ - (This)->lpVtbl -> GetFormat(This,pWaveFormatCurrent) - -#define IAudioMediaStream_SetFormat(This,lpWaveFormat) \ - (This)->lpVtbl -> SetFormat(This,lpWaveFormat) - -#define IAudioMediaStream_CreateSample(This,pAudioData,dwFlags,ppSample) \ - (This)->lpVtbl -> CreateSample(This,pAudioData,dwFlags,ppSample) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAudioMediaStream_GetFormat_Proxy( - IAudioMediaStream * This, - /* [out] */ WAVEFORMATEX *pWaveFormatCurrent); - - -void __RPC_STUB IAudioMediaStream_GetFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAudioMediaStream_SetFormat_Proxy( - IAudioMediaStream * This, - /* [in] */ const WAVEFORMATEX *lpWaveFormat); - - -void __RPC_STUB IAudioMediaStream_SetFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAudioMediaStream_CreateSample_Proxy( - IAudioMediaStream * This, - /* [in] */ IAudioData *pAudioData, - /* [in] */ DWORD dwFlags, - /* [out] */ IAudioStreamSample **ppSample); - - -void __RPC_STUB IAudioMediaStream_CreateSample_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAudioMediaStream_INTERFACE_DEFINED__ */ - - -#ifndef __IAudioStreamSample_INTERFACE_DEFINED__ -#define __IAudioStreamSample_INTERFACE_DEFINED__ - -/* interface IAudioStreamSample */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IAudioStreamSample; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("345fee00-aba5-11d0-8212-00c04fc32c45") - IAudioStreamSample : public IStreamSample - { - public: - virtual HRESULT STDMETHODCALLTYPE GetAudioData( - /* [out] */ IAudioData **ppAudio) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAudioStreamSampleVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAudioStreamSample * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAudioStreamSample * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAudioStreamSample * This); - - HRESULT ( STDMETHODCALLTYPE *GetMediaStream )( - IAudioStreamSample * This, - /* [in] */ IMediaStream **ppMediaStream); - - HRESULT ( STDMETHODCALLTYPE *GetSampleTimes )( - IAudioStreamSample * This, - /* [out] */ STREAM_TIME *pStartTime, - /* [out] */ STREAM_TIME *pEndTime, - /* [out] */ STREAM_TIME *pCurrentTime); - - HRESULT ( STDMETHODCALLTYPE *SetSampleTimes )( - IAudioStreamSample * This, - /* [in] */ const STREAM_TIME *pStartTime, - /* [in] */ const STREAM_TIME *pEndTime); - - HRESULT ( STDMETHODCALLTYPE *Update )( - IAudioStreamSample * This, - /* [in] */ DWORD dwFlags, - /* [in] */ HANDLE hEvent, - /* [in] */ PAPCFUNC pfnAPC, - /* [in] */ DWORD_PTR dwAPCData); - - HRESULT ( STDMETHODCALLTYPE *CompletionStatus )( - IAudioStreamSample * This, - /* [in] */ DWORD dwFlags, - /* [in] */ DWORD dwMilliseconds); - - HRESULT ( STDMETHODCALLTYPE *GetAudioData )( - IAudioStreamSample * This, - /* [out] */ IAudioData **ppAudio); - - END_INTERFACE - } IAudioStreamSampleVtbl; - - interface IAudioStreamSample - { - CONST_VTBL struct IAudioStreamSampleVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAudioStreamSample_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAudioStreamSample_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAudioStreamSample_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAudioStreamSample_GetMediaStream(This,ppMediaStream) \ - (This)->lpVtbl -> GetMediaStream(This,ppMediaStream) - -#define IAudioStreamSample_GetSampleTimes(This,pStartTime,pEndTime,pCurrentTime) \ - (This)->lpVtbl -> GetSampleTimes(This,pStartTime,pEndTime,pCurrentTime) - -#define IAudioStreamSample_SetSampleTimes(This,pStartTime,pEndTime) \ - (This)->lpVtbl -> SetSampleTimes(This,pStartTime,pEndTime) - -#define IAudioStreamSample_Update(This,dwFlags,hEvent,pfnAPC,dwAPCData) \ - (This)->lpVtbl -> Update(This,dwFlags,hEvent,pfnAPC,dwAPCData) - -#define IAudioStreamSample_CompletionStatus(This,dwFlags,dwMilliseconds) \ - (This)->lpVtbl -> CompletionStatus(This,dwFlags,dwMilliseconds) - - -#define IAudioStreamSample_GetAudioData(This,ppAudio) \ - (This)->lpVtbl -> GetAudioData(This,ppAudio) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAudioStreamSample_GetAudioData_Proxy( - IAudioStreamSample * This, - /* [out] */ IAudioData **ppAudio); - - -void __RPC_STUB IAudioStreamSample_GetAudioData_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAudioStreamSample_INTERFACE_DEFINED__ */ - - -#ifndef __IMemoryData_INTERFACE_DEFINED__ -#define __IMemoryData_INTERFACE_DEFINED__ - -/* interface IMemoryData */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IMemoryData; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("327fc560-af60-11d0-8212-00c04fc32c45") - IMemoryData : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetBuffer( - /* [in] */ DWORD cbSize, - /* [in] */ BYTE *pbData, - /* [in] */ DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInfo( - /* [out] */ DWORD *pdwLength, - /* [out] */ BYTE **ppbData, - /* [out] */ DWORD *pcbActualData) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetActual( - /* [in] */ DWORD cbDataValid) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMemoryDataVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMemoryData * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMemoryData * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMemoryData * This); - - HRESULT ( STDMETHODCALLTYPE *SetBuffer )( - IMemoryData * This, - /* [in] */ DWORD cbSize, - /* [in] */ BYTE *pbData, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *GetInfo )( - IMemoryData * This, - /* [out] */ DWORD *pdwLength, - /* [out] */ BYTE **ppbData, - /* [out] */ DWORD *pcbActualData); - - HRESULT ( STDMETHODCALLTYPE *SetActual )( - IMemoryData * This, - /* [in] */ DWORD cbDataValid); - - END_INTERFACE - } IMemoryDataVtbl; - - interface IMemoryData - { - CONST_VTBL struct IMemoryDataVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMemoryData_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMemoryData_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMemoryData_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMemoryData_SetBuffer(This,cbSize,pbData,dwFlags) \ - (This)->lpVtbl -> SetBuffer(This,cbSize,pbData,dwFlags) - -#define IMemoryData_GetInfo(This,pdwLength,ppbData,pcbActualData) \ - (This)->lpVtbl -> GetInfo(This,pdwLength,ppbData,pcbActualData) - -#define IMemoryData_SetActual(This,cbDataValid) \ - (This)->lpVtbl -> SetActual(This,cbDataValid) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMemoryData_SetBuffer_Proxy( - IMemoryData * This, - /* [in] */ DWORD cbSize, - /* [in] */ BYTE *pbData, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IMemoryData_SetBuffer_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMemoryData_GetInfo_Proxy( - IMemoryData * This, - /* [out] */ DWORD *pdwLength, - /* [out] */ BYTE **ppbData, - /* [out] */ DWORD *pcbActualData); - - -void __RPC_STUB IMemoryData_GetInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMemoryData_SetActual_Proxy( - IMemoryData * This, - /* [in] */ DWORD cbDataValid); - - -void __RPC_STUB IMemoryData_SetActual_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMemoryData_INTERFACE_DEFINED__ */ - - -#ifndef __IAudioData_INTERFACE_DEFINED__ -#define __IAudioData_INTERFACE_DEFINED__ - -/* interface IAudioData */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IAudioData; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("54c719c0-af60-11d0-8212-00c04fc32c45") - IAudioData : public IMemoryData - { - public: - virtual HRESULT STDMETHODCALLTYPE GetFormat( - /* [out] */ WAVEFORMATEX *pWaveFormatCurrent) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFormat( - /* [in] */ const WAVEFORMATEX *lpWaveFormat) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAudioDataVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAudioData * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAudioData * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAudioData * This); - - HRESULT ( STDMETHODCALLTYPE *SetBuffer )( - IAudioData * This, - /* [in] */ DWORD cbSize, - /* [in] */ BYTE *pbData, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *GetInfo )( - IAudioData * This, - /* [out] */ DWORD *pdwLength, - /* [out] */ BYTE **ppbData, - /* [out] */ DWORD *pcbActualData); - - HRESULT ( STDMETHODCALLTYPE *SetActual )( - IAudioData * This, - /* [in] */ DWORD cbDataValid); - - HRESULT ( STDMETHODCALLTYPE *GetFormat )( - IAudioData * This, - /* [out] */ WAVEFORMATEX *pWaveFormatCurrent); - - HRESULT ( STDMETHODCALLTYPE *SetFormat )( - IAudioData * This, - /* [in] */ const WAVEFORMATEX *lpWaveFormat); - - END_INTERFACE - } IAudioDataVtbl; - - interface IAudioData - { - CONST_VTBL struct IAudioDataVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAudioData_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAudioData_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAudioData_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAudioData_SetBuffer(This,cbSize,pbData,dwFlags) \ - (This)->lpVtbl -> SetBuffer(This,cbSize,pbData,dwFlags) - -#define IAudioData_GetInfo(This,pdwLength,ppbData,pcbActualData) \ - (This)->lpVtbl -> GetInfo(This,pdwLength,ppbData,pcbActualData) - -#define IAudioData_SetActual(This,cbDataValid) \ - (This)->lpVtbl -> SetActual(This,cbDataValid) - - -#define IAudioData_GetFormat(This,pWaveFormatCurrent) \ - (This)->lpVtbl -> GetFormat(This,pWaveFormatCurrent) - -#define IAudioData_SetFormat(This,lpWaveFormat) \ - (This)->lpVtbl -> SetFormat(This,lpWaveFormat) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAudioData_GetFormat_Proxy( - IAudioData * This, - /* [out] */ WAVEFORMATEX *pWaveFormatCurrent); - - -void __RPC_STUB IAudioData_GetFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAudioData_SetFormat_Proxy( - IAudioData * This, - /* [in] */ const WAVEFORMATEX *lpWaveFormat); - - -void __RPC_STUB IAudioData_SetFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAudioData_INTERFACE_DEFINED__ */ - - -/* Additional Prototypes for ALL interfaces */ - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/aviriff.h b/import/DirectX8/include/aviriff.h deleted file mode 100644 index 5ba2990cc..000000000 --- a/import/DirectX8/include/aviriff.h +++ /dev/null @@ -1,402 +0,0 @@ -//------------------------------------------------------------------------------ -// File: AVIRIFF.h -// -// Desc: Structures and defines for the RIFF AVI file format extended to -// handle very large/long files. -// -// Copyright (c) 1996-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - -// Disable some compiler warnings -#pragma warning(disable: 4097 4511 4512 4514 4705) - - -#if !defined AVIRIFF_H -#define AVIRIFF_H - -#if !defined NUMELMS - #define NUMELMS(aa) (sizeof(aa)/sizeof((aa)[0])) -#endif - -// all structures in this file are packed on word boundaries -// -#include - -/* - * heres the general layout of an AVI riff file (new format) - * - * RIFF (3F??????) AVI <- not more than 1 GB in size - * LIST (size) hdrl - * avih (0038) - * LIST (size) strl - * strh (0038) - * strf (????) - * indx (3ff8) <- size may vary, should be sector sized - * LIST (size) strl - * strh (0038) - * strf (????) - * indx (3ff8) <- size may vary, should be sector sized - * LIST (size) odml - * dmlh (????) - * JUNK (size) <- fill to align to sector - 12 - * LIST (7f??????) movi <- aligned on sector - 12 - * 00dc (size) <- sector aligned - * 01wb (size) <- sector aligned - * ix00 (size) <- sector aligned - * idx1 (00??????) <- sector aligned - * RIFF (7F??????) AVIX - * JUNK (size) <- fill to align to sector -12 - * LIST (size) movi - * 00dc (size) <- sector aligned - * RIFF (7F??????) AVIX <- not more than 2GB in size - * JUNK (size) <- fill to align to sector - 12 - * LIST (size) movi - * 00dc (size) <- sector aligned - * - *-===================================================================*/ - -// -// structures for manipulating RIFF headers -// -#define FCC(ch4) ((((DWORD)(ch4) & 0xFF) << 24) | \ - (((DWORD)(ch4) & 0xFF00) << 8) | \ - (((DWORD)(ch4) & 0xFF0000) >> 8) | \ - (((DWORD)(ch4) & 0xFF000000) >> 24)) - -typedef struct _riffchunk { - FOURCC fcc; - DWORD cb; - } RIFFCHUNK, * LPRIFFCHUNK; -typedef struct _rifflist { - FOURCC fcc; - DWORD cb; - FOURCC fccListType; - } RIFFLIST, * LPRIFFLIST; - -#define RIFFROUND(cb) ((cb) + ((cb)&1)) -#define RIFFNEXT(pChunk) (LPRIFFCHUNK)((LPBYTE)(pChunk) \ - + sizeof(RIFFCHUNK) \ - + RIFFROUND(((LPRIFFCHUNK)pChunk)->cb)) - - -// -// ==================== avi header structures =========================== -// - -// main header for the avi file (compatibility header) -// -#define ckidMAINAVIHEADER FCC('avih') -typedef struct _avimainheader { - FOURCC fcc; // 'avih' - DWORD cb; // size of this structure -8 - DWORD dwMicroSecPerFrame; // frame display rate (or 0L) - DWORD dwMaxBytesPerSec; // max. transfer rate - DWORD dwPaddingGranularity; // pad to multiples of this size; normally 2K. - DWORD dwFlags; // the ever-present flags - #define AVIF_HASINDEX 0x00000010 // Index at end of file? - #define AVIF_MUSTUSEINDEX 0x00000020 - #define AVIF_ISINTERLEAVED 0x00000100 - #define AVIF_TRUSTCKTYPE 0x00000800 // Use CKType to find key frames - #define AVIF_WASCAPTUREFILE 0x00010000 - #define AVIF_COPYRIGHTED 0x00020000 - DWORD dwTotalFrames; // # frames in first movi list - DWORD dwInitialFrames; - DWORD dwStreams; - DWORD dwSuggestedBufferSize; - DWORD dwWidth; - DWORD dwHeight; - DWORD dwReserved[4]; - } AVIMAINHEADER; - -#define ckidODML FCC('odml') -#define ckidAVIEXTHEADER FCC('dmlh') -typedef struct _aviextheader { - FOURCC fcc; // 'dmlh' - DWORD cb; // size of this structure -8 - DWORD dwGrandFrames; // total number of frames in the file - DWORD dwFuture[61]; // to be defined later - } AVIEXTHEADER; - -// -// structure of an AVI stream header riff chunk -// -#define ckidSTREAMLIST FCC('strl') - -#ifndef ckidSTREAMHEADER -#define ckidSTREAMHEADER FCC('strh') -#endif -typedef struct _avistreamheader { - FOURCC fcc; // 'strh' - DWORD cb; // size of this structure - 8 - - FOURCC fccType; // stream type codes - - #ifndef streamtypeVIDEO - #define streamtypeVIDEO FCC('vids') - #define streamtypeAUDIO FCC('auds') - #define streamtypeMIDI FCC('mids') - #define streamtypeTEXT FCC('txts') - #endif - - FOURCC fccHandler; - DWORD dwFlags; - #define AVISF_DISABLED 0x00000001 - #define AVISF_VIDEO_PALCHANGES 0x00010000 - - WORD wPriority; - WORD wLanguage; - DWORD dwInitialFrames; - DWORD dwScale; - DWORD dwRate; // dwRate/dwScale is stream tick rate in ticks/sec - DWORD dwStart; - DWORD dwLength; - DWORD dwSuggestedBufferSize; - DWORD dwQuality; - DWORD dwSampleSize; - struct { - short int left; - short int top; - short int right; - short int bottom; - } rcFrame; - } AVISTREAMHEADER; - - -// -// structure of an AVI stream format chunk -// -#ifndef ckidSTREAMFORMAT -#define ckidSTREAMFORMAT FCC('strf') -#endif -// -// avi stream formats are different for each stream type -// -// BITMAPINFOHEADER for video streams -// WAVEFORMATEX or PCMWAVEFORMAT for audio streams -// nothing for text streams -// nothing for midi streams - - -#pragma warning(disable:4200) -// -// structure of old style AVI index -// -#define ckidAVIOLDINDEX FCC('idx1') -typedef struct _avioldindex { - FOURCC fcc; // 'idx1' - DWORD cb; // size of this structure -8 - struct _avioldindex_entry { - DWORD dwChunkId; - DWORD dwFlags; - - #ifndef AVIIF_LIST - #define AVIIF_LIST 0x00000001 - #define AVIIF_KEYFRAME 0x00000010 - #endif - - #define AVIIF_NO_TIME 0x00000100 - #define AVIIF_COMPRESSOR 0x0FFF0000 // unused? - DWORD dwOffset; // offset of riff chunk header for the data - DWORD dwSize; // size of the data (excluding riff header size) - } aIndex[]; // size of this array - } AVIOLDINDEX; - - -// -// ============ structures for timecode in an AVI file ================= -// - -#ifndef TIMECODE_DEFINED -#define TIMECODE_DEFINED - -// defined -// timecode time structure -// -typedef union _timecode { - struct { - WORD wFrameRate; - WORD wFrameFract; - LONG cFrames; - }; - DWORDLONG qw; - } TIMECODE; - -#endif // TIMECODE_DEFINED - -#define TIMECODE_RATE_30DROP 0 // this MUST be zero - -// struct for all the SMPTE timecode info -// -typedef struct _timecodedata { - TIMECODE time; - DWORD dwSMPTEflags; - DWORD dwUser; - } TIMECODEDATA; - -// dwSMPTEflags masks/values -// -#define TIMECODE_SMPTE_BINARY_GROUP 0x07 -#define TIMECODE_SMPTE_COLOR_FRAME 0x08 - -// -// ============ structures for new style AVI indexes ================= -// - -// index type codes -// -#define AVI_INDEX_OF_INDEXES 0x00 -#define AVI_INDEX_OF_CHUNKS 0x01 -#define AVI_INDEX_OF_TIMED_CHUNKS 0x02 -#define AVI_INDEX_OF_SUB_2FIELD 0x03 -#define AVI_INDEX_IS_DATA 0x80 - -// index subtype codes -// -#define AVI_INDEX_SUB_DEFAULT 0x00 - -// INDEX_OF_CHUNKS subtype codes -// -#define AVI_INDEX_SUB_2FIELD 0x01 - -// meta structure of all avi indexes -// -typedef struct _avimetaindex { - FOURCC fcc; - UINT cb; - WORD wLongsPerEntry; - BYTE bIndexSubType; - BYTE bIndexType; - DWORD nEntriesInUse; - DWORD dwChunkId; - DWORD dwReserved[3]; - DWORD adwIndex[]; - } AVIMETAINDEX; - -#define STDINDEXSIZE 0x4000 -#define NUMINDEX(wLongsPerEntry) ((STDINDEXSIZE-32)/4/(wLongsPerEntry)) -#define NUMINDEXFILL(wLongsPerEntry) ((STDINDEXSIZE/4) - NUMINDEX(wLongsPerEntry)) - -// structure of a super index (INDEX_OF_INDEXES) -// -#define ckidAVISUPERINDEX FCC('indx') -typedef struct _avisuperindex { - FOURCC fcc; // 'indx' - UINT cb; // size of this structure - WORD wLongsPerEntry; // ==4 - BYTE bIndexSubType; // ==0 (frame index) or AVI_INDEX_SUB_2FIELD - BYTE bIndexType; // ==AVI_INDEX_OF_INDEXES - DWORD nEntriesInUse; // offset of next unused entry in aIndex - DWORD dwChunkId; // chunk ID of chunks being indexed, (i.e. RGB8) - DWORD dwReserved[3]; // must be 0 - struct _avisuperindex_entry { - DWORDLONG qwOffset; // 64 bit offset to sub index chunk - DWORD dwSize; // 32 bit size of sub index chunk - DWORD dwDuration; // time span of subindex chunk (in stream ticks) - } aIndex[NUMINDEX(4)]; - } AVISUPERINDEX; -#define Valid_SUPERINDEX(pi) (*(DWORD *)(&((pi)->wLongsPerEntry)) == (4 | (AVI_INDEX_OF_INDEXES << 24))) - -// struct of a standard index (AVI_INDEX_OF_CHUNKS) -// -typedef struct _avistdindex_entry { - DWORD dwOffset; // 32 bit offset to data (points to data, not riff header) - DWORD dwSize; // 31 bit size of data (does not include size of riff header), bit 31 is deltaframe bit - } AVISTDINDEX_ENTRY; -#define AVISTDINDEX_DELTAFRAME ( 0x80000000) // Delta frames have the high bit set -#define AVISTDINDEX_SIZEMASK (~0x80000000) - -typedef struct _avistdindex { - FOURCC fcc; // 'indx' or '##ix' - UINT cb; // size of this structure - WORD wLongsPerEntry; // ==2 - BYTE bIndexSubType; // ==0 - BYTE bIndexType; // ==AVI_INDEX_OF_CHUNKS - DWORD nEntriesInUse; // offset of next unused entry in aIndex - DWORD dwChunkId; // chunk ID of chunks being indexed, (i.e. RGB8) - DWORDLONG qwBaseOffset; // base offset that all index intries are relative to - DWORD dwReserved_3; // must be 0 - AVISTDINDEX_ENTRY aIndex[NUMINDEX(2)]; - } AVISTDINDEX; - -// struct of a time variant standard index (AVI_INDEX_OF_TIMED_CHUNKS) -// -typedef struct _avitimedindex_entry { - DWORD dwOffset; // 32 bit offset to data (points to data, not riff header) - DWORD dwSize; // 31 bit size of data (does not include size of riff header) (high bit is deltaframe bit) - DWORD dwDuration; // how much time the chunk should be played (in stream ticks) - } AVITIMEDINDEX_ENTRY; - -typedef struct _avitimedindex { - FOURCC fcc; // 'indx' or '##ix' - UINT cb; // size of this structure - WORD wLongsPerEntry; // ==3 - BYTE bIndexSubType; // ==0 - BYTE bIndexType; // ==AVI_INDEX_OF_TIMED_CHUNKS - DWORD nEntriesInUse; // offset of next unused entry in aIndex - DWORD dwChunkId; // chunk ID of chunks being indexed, (i.e. RGB8) - DWORDLONG qwBaseOffset; // base offset that all index intries are relative to - DWORD dwReserved_3; // must be 0 - AVITIMEDINDEX_ENTRY aIndex[NUMINDEX(3)]; - DWORD adwTrailingFill[NUMINDEXFILL(3)]; // to align struct to correct size - } AVITIMEDINDEX; - -// structure of a timecode stream -// -typedef struct _avitimecodeindex { - FOURCC fcc; // 'indx' or '##ix' - UINT cb; // size of this structure - WORD wLongsPerEntry; // ==4 - BYTE bIndexSubType; // ==0 - BYTE bIndexType; // ==AVI_INDEX_IS_DATA - DWORD nEntriesInUse; // offset of next unused entry in aIndex - DWORD dwChunkId; // 'time' - DWORD dwReserved[3]; // must be 0 - TIMECODEDATA aIndex[NUMINDEX(sizeof(TIMECODEDATA)/sizeof(LONG))]; - } AVITIMECODEINDEX; - -// structure of a timecode discontinuity list (when wLongsPerEntry == 7) -// -typedef struct _avitcdlindex_entry { - DWORD dwTick; // stream tick time that maps to this timecode value - TIMECODE time; - DWORD dwSMPTEflags; - DWORD dwUser; - TCHAR szReelId[12]; - } AVITCDLINDEX_ENTRY; - -typedef struct _avitcdlindex { - FOURCC fcc; // 'indx' or '##ix' - UINT cb; // size of this structure - WORD wLongsPerEntry; // ==7 (must be 4 or more all 'tcdl' indexes - BYTE bIndexSubType; // ==0 - BYTE bIndexType; // ==AVI_INDEX_IS_DATA - DWORD nEntriesInUse; // offset of next unused entry in aIndex - DWORD dwChunkId; // 'tcdl' - DWORD dwReserved[3]; // must be 0 - AVITCDLINDEX_ENTRY aIndex[NUMINDEX(7)]; - DWORD adwTrailingFill[NUMINDEXFILL(7)]; // to align struct to correct size - } AVITCDLINDEX; - -typedef struct _avifieldindex_chunk { - FOURCC fcc; // 'ix##' - DWORD cb; // size of this structure - WORD wLongsPerEntry; // must be 3 (size of each entry in - // aIndex array) - BYTE bIndexSubType; // AVI_INDEX_2FIELD - BYTE bIndexType; // AVI_INDEX_OF_CHUNKS - DWORD nEntriesInUse; // - DWORD dwChunkId; // '##dc' or '##db' - DWORDLONG qwBaseOffset; // offsets in aIndex array are relative to this - DWORD dwReserved3; // must be 0 - struct _avifieldindex_entry { - DWORD dwOffset; - DWORD dwSize; // size of all fields - // (bit 31 set for NON-keyframes) - DWORD dwOffsetField2; // offset to second field - } aIndex[ ]; -} AVIFIELDINDEX, * PAVIFIELDINDEX; - - -#include - -#endif diff --git a/import/DirectX8/include/basetsd.h.old b/import/DirectX8/include/basetsd.h.old deleted file mode 100644 index c634a5c98..000000000 --- a/import/DirectX8/include/basetsd.h.old +++ /dev/null @@ -1,342 +0,0 @@ -/*++ - -Copyright (c) 1997-1999 Microsoft Corporation - -Module Name: - - basetsd.h - -Abstract: - - Type definitions for the basic sized types. - -Author: - - Jeff Havens (jhavens) 23-Oct-1997 - -Revision History: - ---*/ - -#ifndef _BASETSD_H_ -#define _BASETSD_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef signed char INT8, *PINT8; -typedef signed short INT16, *PINT16; -typedef signed int INT32, *PINT32; -typedef signed __int64 INT64, *PINT64; -typedef unsigned char UINT8, *PUINT8; -typedef unsigned short UINT16, *PUINT16; -typedef unsigned int UINT32, *PUINT32; -typedef unsigned __int64 UINT64, *PUINT64; - -// -// The following types are guaranteed to be signed and 32 bits wide. -// - -typedef signed int LONG32, *PLONG32; - -// -// The following types are guaranteed to be unsigned and 32 bits wide. -// - -typedef unsigned int ULONG32, *PULONG32; -typedef unsigned int DWORD32, *PDWORD32; - -#if !defined(_W64) -#if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -#define _W64 __w64 -#else -#define _W64 -#endif -#endif - -// -// The INT_PTR is guaranteed to be the same size as a pointer. Its -// size with change with pointer size (32/64). It should be used -// anywhere that a pointer is cast to an integer type. UINT_PTR is -// the unsigned variation. -// -// __int3264 is intrinsic to 64b MIDL but not to old MIDL or to C compiler. -// -#if ( 501 < __midl ) - - typedef [public] __int3264 INT_PTR, *PINT_PTR; - typedef [public] unsigned __int3264 UINT_PTR, *PUINT_PTR; - - typedef [public] __int3264 LONG_PTR, *PLONG_PTR; - typedef [public] unsigned __int3264 ULONG_PTR, *PULONG_PTR; - -#else // midl64 -// old midl and C++ compiler - -#if defined(_WIN64) - typedef __int64 INT_PTR, *PINT_PTR; - typedef unsigned __int64 UINT_PTR, *PUINT_PTR; - - typedef __int64 LONG_PTR, *PLONG_PTR; - typedef unsigned __int64 ULONG_PTR, *PULONG_PTR; - - #define __int3264 __int64 - -#else - typedef _W64 int INT_PTR, *PINT_PTR; - typedef _W64 unsigned int UINT_PTR, *PUINT_PTR; - - typedef _W64 long LONG_PTR, *PLONG_PTR; - typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR; - - #define __int3264 __int32 - -#endif -#endif // midl64 - -// -// HALF_PTR is half the size of a pointer it intended for use with -// within strcuture which contain a pointer and two small fields. -// UHALF_PTR is the unsigned variation. -// - -#ifdef _WIN64 - -#define ADDRESS_TAG_BIT 0x40000000000UI64 - -typedef unsigned __int64 HANDLE_PTR; -typedef unsigned int UHALF_PTR, *PUHALF_PTR; -typedef int HALF_PTR, *PHALF_PTR; - -#pragma warning(disable:4311) // type cast truncation -#if _MSC_VER >= 1200 -#pragma warning(push) -#endif -#pragma warning(disable:4305) // type cast truncation - -#if !defined(__midl) -__inline -unsigned long -HandleToULong( - const void *h - ) -{ - return((unsigned long) h ); -} - -__inline -long -HandleToLong( - const void *h - ) -{ - return((long) h ); -} - -__inline -void * -ULongToHandle( - const unsigned long h - ) -{ - return((void *) (UINT_PTR) h ); -} - - -__inline -void * -LongToHandle( - const long h - ) -{ - return((void *) (INT_PTR) h ); -} - - -__inline -unsigned long -PtrToUlong( - const void *p - ) -{ - return((unsigned long) p ); -} - -__inline -unsigned int -PtrToUint( - const void *p - ) -{ - return((unsigned int) p ); -} - -__inline -unsigned short -PtrToUshort( - const void *p - ) -{ - return((unsigned short) p ); -} - -__inline -long -PtrToLong( - const void *p - ) -{ - return((long) p ); -} - -__inline -int -PtrToInt( - const void *p - ) -{ - return((int) p ); -} - -__inline -short -PtrToShort( - const void *p - ) -{ - return((short) p ); -} - -__inline -void * -IntToPtr( - const int i - ) -// Caution: IntToPtr() sign-extends the int value. -{ - return( (void *)(INT_PTR)i ); -} - -__inline -void * -UIntToPtr( - const unsigned int ui - ) -// Caution: UIntToPtr() zero-extends the unsigned int value. -{ - return( (void *)(UINT_PTR)ui ); -} - -__inline -void * -LongToPtr( - const long l - ) -// Caution: LongToPtr() sign-extends the long value. -{ - return( (void *)(LONG_PTR)l ); -} - -__inline -void * -ULongToPtr( - const unsigned long ul - ) -// Caution: ULongToPtr() zero-extends the unsigned long value. -{ - return( (void *)(ULONG_PTR)ul ); -} - -#endif // !_midl -#if _MSC_VER >= 1200 -#pragma warning(pop) // restore 4305 -#endif -#pragma warning(3:4311) // bump 4311 to a level 3 - -#else // !_WIN64 - -#define ADDRESS_TAG_BIT 0x80000000UL - -typedef unsigned short UHALF_PTR, *PUHALF_PTR; -typedef short HALF_PTR, *PHALF_PTR; -typedef _W64 unsigned long HANDLE_PTR; - -#define HandleToULong( h ) ((ULONG)(ULONG_PTR)(h) ) -#define HandleToLong( h ) ((LONG)(LONG_PTR) (h) ) -#define ULongToHandle( ul ) ((HANDLE)(ULONG_PTR) (ul) ) -#define LongToHandle( h ) ((HANDLE)(LONG_PTR) (h) ) -#define PtrToUlong( p ) ((ULONG)(ULONG_PTR) (p) ) -#define PtrToLong( p ) ((LONG)(LONG_PTR) (p) ) -#define PtrToUint( p ) ((UINT)(UINT_PTR) (p) ) -#define PtrToInt( p ) ((INT)(INT_PTR) (p) ) -#define PtrToUshort( p ) ((unsigned short)(ULONG_PTR)(p) ) -#define PtrToShort( p ) ((short)(LONG_PTR)(p) ) -#define IntToPtr( i ) ((VOID *)(INT_PTR)((int)i)) -#define UIntToPtr( ui ) ((VOID *)(UINT_PTR)((unsigned int)ui)) -#define LongToPtr( l ) ((VOID *)(LONG_PTR)((long)l)) -#define ULongToPtr( ul ) ((VOID *)(ULONG_PTR)((unsigned long)ul)) - -#endif // !_WIN64 - -#define HandleToUlong(h) HandleToULong(h) -#define UlongToHandle(ul) ULongToHandle(ul) -#define UlongToPtr(ul) ULongToPtr(ul) -#define UintToPtr(ui) UIntToPtr(ui) - -#define MAXUINT_PTR (~((UINT_PTR)0)) -#define MAXINT_PTR ((INT_PTR)(MAXUINT_PTR >> 1)) -#define MININT_PTR (~MAXINT_PTR) - -#define MAXULONG_PTR (~((ULONG_PTR)0)) -#define MAXLONG_PTR ((LONG_PTR)(MAXULONG_PTR >> 1)) -#define MINLONG_PTR (~MAXLONG_PTR) - -#define MAXUHALF_PTR ((UHALF_PTR)~0) -#define MAXHALF_PTR ((HALF_PTR)(MAXUHALF_PTR >> 1)) -#define MINHALF_PTR (~MAXHALF_PTR) - -// -// SIZE_T used for counts or ranges which need to span the range of -// of a pointer. SSIZE_T is the signed variation. -// - -typedef ULONG_PTR SIZE_T, *PSIZE_T; -typedef LONG_PTR SSIZE_T, *PSSIZE_T; - -// -// Add Windows flavor DWORD_PTR types -// - -typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; - -// -// The following types are guaranteed to be signed and 64 bits wide. -// - -typedef __int64 LONG64, *PLONG64; - - -// -// The following types are guaranteed to be unsigned and 64 bits wide. -// - -typedef unsigned __int64 ULONG64, *PULONG64; -typedef unsigned __int64 DWORD64, *PDWORD64; - -// -// Thread affinity. -// - -typedef ULONG_PTR KAFFINITY; -typedef KAFFINITY *PKAFFINITY; - -#ifdef __cplusplus -} -#endif - -#endif // _BASETSD_H_ diff --git a/import/DirectX8/include/bdaiface.h b/import/DirectX8/include/bdaiface.h deleted file mode 100644 index 5f1044c43..000000000 --- a/import/DirectX8/include/bdaiface.h +++ /dev/null @@ -1,3881 +0,0 @@ -//+------------------------------------------------------------------------- -// -// Microsoft Windows -// Copyright (C) Microsoft Corporation, 1999-2001. -// -//-------------------------------------------------------------------------- - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 6.00.0347 */ -/* Compiler settings for bdaiface.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __bdaiface_h__ -#define __bdaiface_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __IBDA_NetworkProvider_FWD_DEFINED__ -#define __IBDA_NetworkProvider_FWD_DEFINED__ -typedef interface IBDA_NetworkProvider IBDA_NetworkProvider; -#endif /* __IBDA_NetworkProvider_FWD_DEFINED__ */ - - -#ifndef __IBDA_EthernetFilter_FWD_DEFINED__ -#define __IBDA_EthernetFilter_FWD_DEFINED__ -typedef interface IBDA_EthernetFilter IBDA_EthernetFilter; -#endif /* __IBDA_EthernetFilter_FWD_DEFINED__ */ - - -#ifndef __IBDA_IPV4Filter_FWD_DEFINED__ -#define __IBDA_IPV4Filter_FWD_DEFINED__ -typedef interface IBDA_IPV4Filter IBDA_IPV4Filter; -#endif /* __IBDA_IPV4Filter_FWD_DEFINED__ */ - - -#ifndef __IBDA_IPV6Filter_FWD_DEFINED__ -#define __IBDA_IPV6Filter_FWD_DEFINED__ -typedef interface IBDA_IPV6Filter IBDA_IPV6Filter; -#endif /* __IBDA_IPV6Filter_FWD_DEFINED__ */ - - -#ifndef __IBDA_DeviceControl_FWD_DEFINED__ -#define __IBDA_DeviceControl_FWD_DEFINED__ -typedef interface IBDA_DeviceControl IBDA_DeviceControl; -#endif /* __IBDA_DeviceControl_FWD_DEFINED__ */ - - -#ifndef __IBDA_PinControl_FWD_DEFINED__ -#define __IBDA_PinControl_FWD_DEFINED__ -typedef interface IBDA_PinControl IBDA_PinControl; -#endif /* __IBDA_PinControl_FWD_DEFINED__ */ - - -#ifndef __IBDA_SignalProperties_FWD_DEFINED__ -#define __IBDA_SignalProperties_FWD_DEFINED__ -typedef interface IBDA_SignalProperties IBDA_SignalProperties; -#endif /* __IBDA_SignalProperties_FWD_DEFINED__ */ - - -#ifndef __IBDA_SignalStatistics_FWD_DEFINED__ -#define __IBDA_SignalStatistics_FWD_DEFINED__ -typedef interface IBDA_SignalStatistics IBDA_SignalStatistics; -#endif /* __IBDA_SignalStatistics_FWD_DEFINED__ */ - - -#ifndef __IBDA_Topology_FWD_DEFINED__ -#define __IBDA_Topology_FWD_DEFINED__ -typedef interface IBDA_Topology IBDA_Topology; -#endif /* __IBDA_Topology_FWD_DEFINED__ */ - - -#ifndef __IBDA_VoidTransform_FWD_DEFINED__ -#define __IBDA_VoidTransform_FWD_DEFINED__ -typedef interface IBDA_VoidTransform IBDA_VoidTransform; -#endif /* __IBDA_VoidTransform_FWD_DEFINED__ */ - - -#ifndef __IBDA_NullTransform_FWD_DEFINED__ -#define __IBDA_NullTransform_FWD_DEFINED__ -typedef interface IBDA_NullTransform IBDA_NullTransform; -#endif /* __IBDA_NullTransform_FWD_DEFINED__ */ - - -#ifndef __IBDA_FrequencyFilter_FWD_DEFINED__ -#define __IBDA_FrequencyFilter_FWD_DEFINED__ -typedef interface IBDA_FrequencyFilter IBDA_FrequencyFilter; -#endif /* __IBDA_FrequencyFilter_FWD_DEFINED__ */ - - -#ifndef __IBDA_LNBInfo_FWD_DEFINED__ -#define __IBDA_LNBInfo_FWD_DEFINED__ -typedef interface IBDA_LNBInfo IBDA_LNBInfo; -#endif /* __IBDA_LNBInfo_FWD_DEFINED__ */ - - -#ifndef __IBDA_AutoDemodulate_FWD_DEFINED__ -#define __IBDA_AutoDemodulate_FWD_DEFINED__ -typedef interface IBDA_AutoDemodulate IBDA_AutoDemodulate; -#endif /* __IBDA_AutoDemodulate_FWD_DEFINED__ */ - - -#ifndef __IBDA_DigitalDemodulator_FWD_DEFINED__ -#define __IBDA_DigitalDemodulator_FWD_DEFINED__ -typedef interface IBDA_DigitalDemodulator IBDA_DigitalDemodulator; -#endif /* __IBDA_DigitalDemodulator_FWD_DEFINED__ */ - - -#ifndef __IBDA_IPSinkControl_FWD_DEFINED__ -#define __IBDA_IPSinkControl_FWD_DEFINED__ -typedef interface IBDA_IPSinkControl IBDA_IPSinkControl; -#endif /* __IBDA_IPSinkControl_FWD_DEFINED__ */ - - -#ifndef __IBDA_IPSinkInfo_FWD_DEFINED__ -#define __IBDA_IPSinkInfo_FWD_DEFINED__ -typedef interface IBDA_IPSinkInfo IBDA_IPSinkInfo; -#endif /* __IBDA_IPSinkInfo_FWD_DEFINED__ */ - - -#ifndef __IEnumPIDMap_FWD_DEFINED__ -#define __IEnumPIDMap_FWD_DEFINED__ -typedef interface IEnumPIDMap IEnumPIDMap; -#endif /* __IEnumPIDMap_FWD_DEFINED__ */ - - -#ifndef __IMPEG2PIDMap_FWD_DEFINED__ -#define __IMPEG2PIDMap_FWD_DEFINED__ -typedef interface IMPEG2PIDMap IMPEG2PIDMap; -#endif /* __IMPEG2PIDMap_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "unknwn.h" -#include "strmif.h" -#include "BdaTypes.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void * ); - -#ifndef __IBDA_NetworkProvider_INTERFACE_DEFINED__ -#define __IBDA_NetworkProvider_INTERFACE_DEFINED__ - -/* interface IBDA_NetworkProvider */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_NetworkProvider; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("fd501041-8ebe-11ce-8183-00aa00577da2") - IBDA_NetworkProvider : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE PutSignalSource( - /* [in] */ ULONG ulSignalSource) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSignalSource( - /* [out][in] */ ULONG *pulSignalSource) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNetworkType( - /* [out][in] */ GUID *pguidNetworkType) = 0; - - virtual HRESULT STDMETHODCALLTYPE PutTuningSpace( - /* [in] */ REFGUID guidTuningSpace) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTuningSpace( - /* [out][in] */ GUID *pguidTuingSpace) = 0; - - virtual HRESULT STDMETHODCALLTYPE RegisterDeviceFilter( - /* [in] */ IUnknown *pUnkFilterControl, - /* [out][in] */ ULONG *ppvRegisitrationContext) = 0; - - virtual HRESULT STDMETHODCALLTYPE UnRegisterDeviceFilter( - /* [in] */ ULONG pvRegistrationContext) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_NetworkProviderVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_NetworkProvider * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_NetworkProvider * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_NetworkProvider * This); - - HRESULT ( STDMETHODCALLTYPE *PutSignalSource )( - IBDA_NetworkProvider * This, - /* [in] */ ULONG ulSignalSource); - - HRESULT ( STDMETHODCALLTYPE *GetSignalSource )( - IBDA_NetworkProvider * This, - /* [out][in] */ ULONG *pulSignalSource); - - HRESULT ( STDMETHODCALLTYPE *GetNetworkType )( - IBDA_NetworkProvider * This, - /* [out][in] */ GUID *pguidNetworkType); - - HRESULT ( STDMETHODCALLTYPE *PutTuningSpace )( - IBDA_NetworkProvider * This, - /* [in] */ REFGUID guidTuningSpace); - - HRESULT ( STDMETHODCALLTYPE *GetTuningSpace )( - IBDA_NetworkProvider * This, - /* [out][in] */ GUID *pguidTuingSpace); - - HRESULT ( STDMETHODCALLTYPE *RegisterDeviceFilter )( - IBDA_NetworkProvider * This, - /* [in] */ IUnknown *pUnkFilterControl, - /* [out][in] */ ULONG *ppvRegisitrationContext); - - HRESULT ( STDMETHODCALLTYPE *UnRegisterDeviceFilter )( - IBDA_NetworkProvider * This, - /* [in] */ ULONG pvRegistrationContext); - - END_INTERFACE - } IBDA_NetworkProviderVtbl; - - interface IBDA_NetworkProvider - { - CONST_VTBL struct IBDA_NetworkProviderVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_NetworkProvider_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_NetworkProvider_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_NetworkProvider_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_NetworkProvider_PutSignalSource(This,ulSignalSource) \ - (This)->lpVtbl -> PutSignalSource(This,ulSignalSource) - -#define IBDA_NetworkProvider_GetSignalSource(This,pulSignalSource) \ - (This)->lpVtbl -> GetSignalSource(This,pulSignalSource) - -#define IBDA_NetworkProvider_GetNetworkType(This,pguidNetworkType) \ - (This)->lpVtbl -> GetNetworkType(This,pguidNetworkType) - -#define IBDA_NetworkProvider_PutTuningSpace(This,guidTuningSpace) \ - (This)->lpVtbl -> PutTuningSpace(This,guidTuningSpace) - -#define IBDA_NetworkProvider_GetTuningSpace(This,pguidTuingSpace) \ - (This)->lpVtbl -> GetTuningSpace(This,pguidTuingSpace) - -#define IBDA_NetworkProvider_RegisterDeviceFilter(This,pUnkFilterControl,ppvRegisitrationContext) \ - (This)->lpVtbl -> RegisterDeviceFilter(This,pUnkFilterControl,ppvRegisitrationContext) - -#define IBDA_NetworkProvider_UnRegisterDeviceFilter(This,pvRegistrationContext) \ - (This)->lpVtbl -> UnRegisterDeviceFilter(This,pvRegistrationContext) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_NetworkProvider_PutSignalSource_Proxy( - IBDA_NetworkProvider * This, - /* [in] */ ULONG ulSignalSource); - - -void __RPC_STUB IBDA_NetworkProvider_PutSignalSource_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_NetworkProvider_GetSignalSource_Proxy( - IBDA_NetworkProvider * This, - /* [out][in] */ ULONG *pulSignalSource); - - -void __RPC_STUB IBDA_NetworkProvider_GetSignalSource_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_NetworkProvider_GetNetworkType_Proxy( - IBDA_NetworkProvider * This, - /* [out][in] */ GUID *pguidNetworkType); - - -void __RPC_STUB IBDA_NetworkProvider_GetNetworkType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_NetworkProvider_PutTuningSpace_Proxy( - IBDA_NetworkProvider * This, - /* [in] */ REFGUID guidTuningSpace); - - -void __RPC_STUB IBDA_NetworkProvider_PutTuningSpace_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_NetworkProvider_GetTuningSpace_Proxy( - IBDA_NetworkProvider * This, - /* [out][in] */ GUID *pguidTuingSpace); - - -void __RPC_STUB IBDA_NetworkProvider_GetTuningSpace_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_NetworkProvider_RegisterDeviceFilter_Proxy( - IBDA_NetworkProvider * This, - /* [in] */ IUnknown *pUnkFilterControl, - /* [out][in] */ ULONG *ppvRegisitrationContext); - - -void __RPC_STUB IBDA_NetworkProvider_RegisterDeviceFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_NetworkProvider_UnRegisterDeviceFilter_Proxy( - IBDA_NetworkProvider * This, - /* [in] */ ULONG pvRegistrationContext); - - -void __RPC_STUB IBDA_NetworkProvider_UnRegisterDeviceFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_NetworkProvider_INTERFACE_DEFINED__ */ - - -#ifndef __IBDA_EthernetFilter_INTERFACE_DEFINED__ -#define __IBDA_EthernetFilter_INTERFACE_DEFINED__ - -/* interface IBDA_EthernetFilter */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_EthernetFilter; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("71985F43-1CA1-11d3-9CC8-00C04F7971E0") - IBDA_EthernetFilter : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetMulticastListSize( - /* [out][in] */ ULONG *pulcbAddresses) = 0; - - virtual HRESULT STDMETHODCALLTYPE PutMulticastList( - /* [in] */ ULONG ulcbAddresses, - /* [size_is][in] */ BYTE pAddressList[ ]) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMulticastList( - /* [out][in] */ ULONG *pulcbAddresses, - /* [size_is][out] */ BYTE pAddressList[ ]) = 0; - - virtual HRESULT STDMETHODCALLTYPE PutMulticastMode( - /* [in] */ ULONG ulModeMask) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMulticastMode( - /* [out] */ ULONG *pulModeMask) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_EthernetFilterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_EthernetFilter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_EthernetFilter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_EthernetFilter * This); - - HRESULT ( STDMETHODCALLTYPE *GetMulticastListSize )( - IBDA_EthernetFilter * This, - /* [out][in] */ ULONG *pulcbAddresses); - - HRESULT ( STDMETHODCALLTYPE *PutMulticastList )( - IBDA_EthernetFilter * This, - /* [in] */ ULONG ulcbAddresses, - /* [size_is][in] */ BYTE pAddressList[ ]); - - HRESULT ( STDMETHODCALLTYPE *GetMulticastList )( - IBDA_EthernetFilter * This, - /* [out][in] */ ULONG *pulcbAddresses, - /* [size_is][out] */ BYTE pAddressList[ ]); - - HRESULT ( STDMETHODCALLTYPE *PutMulticastMode )( - IBDA_EthernetFilter * This, - /* [in] */ ULONG ulModeMask); - - HRESULT ( STDMETHODCALLTYPE *GetMulticastMode )( - IBDA_EthernetFilter * This, - /* [out] */ ULONG *pulModeMask); - - END_INTERFACE - } IBDA_EthernetFilterVtbl; - - interface IBDA_EthernetFilter - { - CONST_VTBL struct IBDA_EthernetFilterVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_EthernetFilter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_EthernetFilter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_EthernetFilter_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_EthernetFilter_GetMulticastListSize(This,pulcbAddresses) \ - (This)->lpVtbl -> GetMulticastListSize(This,pulcbAddresses) - -#define IBDA_EthernetFilter_PutMulticastList(This,ulcbAddresses,pAddressList) \ - (This)->lpVtbl -> PutMulticastList(This,ulcbAddresses,pAddressList) - -#define IBDA_EthernetFilter_GetMulticastList(This,pulcbAddresses,pAddressList) \ - (This)->lpVtbl -> GetMulticastList(This,pulcbAddresses,pAddressList) - -#define IBDA_EthernetFilter_PutMulticastMode(This,ulModeMask) \ - (This)->lpVtbl -> PutMulticastMode(This,ulModeMask) - -#define IBDA_EthernetFilter_GetMulticastMode(This,pulModeMask) \ - (This)->lpVtbl -> GetMulticastMode(This,pulModeMask) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_EthernetFilter_GetMulticastListSize_Proxy( - IBDA_EthernetFilter * This, - /* [out][in] */ ULONG *pulcbAddresses); - - -void __RPC_STUB IBDA_EthernetFilter_GetMulticastListSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_EthernetFilter_PutMulticastList_Proxy( - IBDA_EthernetFilter * This, - /* [in] */ ULONG ulcbAddresses, - /* [size_is][in] */ BYTE pAddressList[ ]); - - -void __RPC_STUB IBDA_EthernetFilter_PutMulticastList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_EthernetFilter_GetMulticastList_Proxy( - IBDA_EthernetFilter * This, - /* [out][in] */ ULONG *pulcbAddresses, - /* [size_is][out] */ BYTE pAddressList[ ]); - - -void __RPC_STUB IBDA_EthernetFilter_GetMulticastList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_EthernetFilter_PutMulticastMode_Proxy( - IBDA_EthernetFilter * This, - /* [in] */ ULONG ulModeMask); - - -void __RPC_STUB IBDA_EthernetFilter_PutMulticastMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_EthernetFilter_GetMulticastMode_Proxy( - IBDA_EthernetFilter * This, - /* [out] */ ULONG *pulModeMask); - - -void __RPC_STUB IBDA_EthernetFilter_GetMulticastMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_EthernetFilter_INTERFACE_DEFINED__ */ - - -#ifndef __IBDA_IPV4Filter_INTERFACE_DEFINED__ -#define __IBDA_IPV4Filter_INTERFACE_DEFINED__ - -/* interface IBDA_IPV4Filter */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_IPV4Filter; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("71985F44-1CA1-11d3-9CC8-00C04F7971E0") - IBDA_IPV4Filter : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetMulticastListSize( - /* [out][in] */ ULONG *pulcbAddresses) = 0; - - virtual HRESULT STDMETHODCALLTYPE PutMulticastList( - /* [in] */ ULONG ulcbAddresses, - /* [size_is][in] */ BYTE pAddressList[ ]) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMulticastList( - /* [out][in] */ ULONG *pulcbAddresses, - /* [size_is][out] */ BYTE pAddressList[ ]) = 0; - - virtual HRESULT STDMETHODCALLTYPE PutMulticastMode( - /* [in] */ ULONG ulModeMask) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMulticastMode( - /* [out] */ ULONG *pulModeMask) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_IPV4FilterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_IPV4Filter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_IPV4Filter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_IPV4Filter * This); - - HRESULT ( STDMETHODCALLTYPE *GetMulticastListSize )( - IBDA_IPV4Filter * This, - /* [out][in] */ ULONG *pulcbAddresses); - - HRESULT ( STDMETHODCALLTYPE *PutMulticastList )( - IBDA_IPV4Filter * This, - /* [in] */ ULONG ulcbAddresses, - /* [size_is][in] */ BYTE pAddressList[ ]); - - HRESULT ( STDMETHODCALLTYPE *GetMulticastList )( - IBDA_IPV4Filter * This, - /* [out][in] */ ULONG *pulcbAddresses, - /* [size_is][out] */ BYTE pAddressList[ ]); - - HRESULT ( STDMETHODCALLTYPE *PutMulticastMode )( - IBDA_IPV4Filter * This, - /* [in] */ ULONG ulModeMask); - - HRESULT ( STDMETHODCALLTYPE *GetMulticastMode )( - IBDA_IPV4Filter * This, - /* [out] */ ULONG *pulModeMask); - - END_INTERFACE - } IBDA_IPV4FilterVtbl; - - interface IBDA_IPV4Filter - { - CONST_VTBL struct IBDA_IPV4FilterVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_IPV4Filter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_IPV4Filter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_IPV4Filter_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_IPV4Filter_GetMulticastListSize(This,pulcbAddresses) \ - (This)->lpVtbl -> GetMulticastListSize(This,pulcbAddresses) - -#define IBDA_IPV4Filter_PutMulticastList(This,ulcbAddresses,pAddressList) \ - (This)->lpVtbl -> PutMulticastList(This,ulcbAddresses,pAddressList) - -#define IBDA_IPV4Filter_GetMulticastList(This,pulcbAddresses,pAddressList) \ - (This)->lpVtbl -> GetMulticastList(This,pulcbAddresses,pAddressList) - -#define IBDA_IPV4Filter_PutMulticastMode(This,ulModeMask) \ - (This)->lpVtbl -> PutMulticastMode(This,ulModeMask) - -#define IBDA_IPV4Filter_GetMulticastMode(This,pulModeMask) \ - (This)->lpVtbl -> GetMulticastMode(This,pulModeMask) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_IPV4Filter_GetMulticastListSize_Proxy( - IBDA_IPV4Filter * This, - /* [out][in] */ ULONG *pulcbAddresses); - - -void __RPC_STUB IBDA_IPV4Filter_GetMulticastListSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_IPV4Filter_PutMulticastList_Proxy( - IBDA_IPV4Filter * This, - /* [in] */ ULONG ulcbAddresses, - /* [size_is][in] */ BYTE pAddressList[ ]); - - -void __RPC_STUB IBDA_IPV4Filter_PutMulticastList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_IPV4Filter_GetMulticastList_Proxy( - IBDA_IPV4Filter * This, - /* [out][in] */ ULONG *pulcbAddresses, - /* [size_is][out] */ BYTE pAddressList[ ]); - - -void __RPC_STUB IBDA_IPV4Filter_GetMulticastList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_IPV4Filter_PutMulticastMode_Proxy( - IBDA_IPV4Filter * This, - /* [in] */ ULONG ulModeMask); - - -void __RPC_STUB IBDA_IPV4Filter_PutMulticastMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_IPV4Filter_GetMulticastMode_Proxy( - IBDA_IPV4Filter * This, - /* [out] */ ULONG *pulModeMask); - - -void __RPC_STUB IBDA_IPV4Filter_GetMulticastMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_IPV4Filter_INTERFACE_DEFINED__ */ - - -#ifndef __IBDA_IPV6Filter_INTERFACE_DEFINED__ -#define __IBDA_IPV6Filter_INTERFACE_DEFINED__ - -/* interface IBDA_IPV6Filter */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_IPV6Filter; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("E1785A74-2A23-4fb3-9245-A8F88017EF33") - IBDA_IPV6Filter : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetMulticastListSize( - /* [out][in] */ ULONG *pulcbAddresses) = 0; - - virtual HRESULT STDMETHODCALLTYPE PutMulticastList( - /* [in] */ ULONG ulcbAddresses, - /* [size_is][in] */ BYTE pAddressList[ ]) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMulticastList( - /* [out][in] */ ULONG *pulcbAddresses, - /* [size_is][out] */ BYTE pAddressList[ ]) = 0; - - virtual HRESULT STDMETHODCALLTYPE PutMulticastMode( - /* [in] */ ULONG ulModeMask) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMulticastMode( - /* [out] */ ULONG *pulModeMask) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_IPV6FilterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_IPV6Filter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_IPV6Filter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_IPV6Filter * This); - - HRESULT ( STDMETHODCALLTYPE *GetMulticastListSize )( - IBDA_IPV6Filter * This, - /* [out][in] */ ULONG *pulcbAddresses); - - HRESULT ( STDMETHODCALLTYPE *PutMulticastList )( - IBDA_IPV6Filter * This, - /* [in] */ ULONG ulcbAddresses, - /* [size_is][in] */ BYTE pAddressList[ ]); - - HRESULT ( STDMETHODCALLTYPE *GetMulticastList )( - IBDA_IPV6Filter * This, - /* [out][in] */ ULONG *pulcbAddresses, - /* [size_is][out] */ BYTE pAddressList[ ]); - - HRESULT ( STDMETHODCALLTYPE *PutMulticastMode )( - IBDA_IPV6Filter * This, - /* [in] */ ULONG ulModeMask); - - HRESULT ( STDMETHODCALLTYPE *GetMulticastMode )( - IBDA_IPV6Filter * This, - /* [out] */ ULONG *pulModeMask); - - END_INTERFACE - } IBDA_IPV6FilterVtbl; - - interface IBDA_IPV6Filter - { - CONST_VTBL struct IBDA_IPV6FilterVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_IPV6Filter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_IPV6Filter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_IPV6Filter_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_IPV6Filter_GetMulticastListSize(This,pulcbAddresses) \ - (This)->lpVtbl -> GetMulticastListSize(This,pulcbAddresses) - -#define IBDA_IPV6Filter_PutMulticastList(This,ulcbAddresses,pAddressList) \ - (This)->lpVtbl -> PutMulticastList(This,ulcbAddresses,pAddressList) - -#define IBDA_IPV6Filter_GetMulticastList(This,pulcbAddresses,pAddressList) \ - (This)->lpVtbl -> GetMulticastList(This,pulcbAddresses,pAddressList) - -#define IBDA_IPV6Filter_PutMulticastMode(This,ulModeMask) \ - (This)->lpVtbl -> PutMulticastMode(This,ulModeMask) - -#define IBDA_IPV6Filter_GetMulticastMode(This,pulModeMask) \ - (This)->lpVtbl -> GetMulticastMode(This,pulModeMask) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_IPV6Filter_GetMulticastListSize_Proxy( - IBDA_IPV6Filter * This, - /* [out][in] */ ULONG *pulcbAddresses); - - -void __RPC_STUB IBDA_IPV6Filter_GetMulticastListSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_IPV6Filter_PutMulticastList_Proxy( - IBDA_IPV6Filter * This, - /* [in] */ ULONG ulcbAddresses, - /* [size_is][in] */ BYTE pAddressList[ ]); - - -void __RPC_STUB IBDA_IPV6Filter_PutMulticastList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_IPV6Filter_GetMulticastList_Proxy( - IBDA_IPV6Filter * This, - /* [out][in] */ ULONG *pulcbAddresses, - /* [size_is][out] */ BYTE pAddressList[ ]); - - -void __RPC_STUB IBDA_IPV6Filter_GetMulticastList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_IPV6Filter_PutMulticastMode_Proxy( - IBDA_IPV6Filter * This, - /* [in] */ ULONG ulModeMask); - - -void __RPC_STUB IBDA_IPV6Filter_PutMulticastMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_IPV6Filter_GetMulticastMode_Proxy( - IBDA_IPV6Filter * This, - /* [out] */ ULONG *pulModeMask); - - -void __RPC_STUB IBDA_IPV6Filter_GetMulticastMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_IPV6Filter_INTERFACE_DEFINED__ */ - - -#ifndef __IBDA_DeviceControl_INTERFACE_DEFINED__ -#define __IBDA_DeviceControl_INTERFACE_DEFINED__ - -/* interface IBDA_DeviceControl */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_DeviceControl; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("FD0A5AF3-B41D-11d2-9C95-00C04F7971E0") - IBDA_DeviceControl : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE StartChanges( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE CheckChanges( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE CommitChanges( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetChangeState( - /* [out][in] */ ULONG *pState) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_DeviceControlVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_DeviceControl * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_DeviceControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_DeviceControl * This); - - HRESULT ( STDMETHODCALLTYPE *StartChanges )( - IBDA_DeviceControl * This); - - HRESULT ( STDMETHODCALLTYPE *CheckChanges )( - IBDA_DeviceControl * This); - - HRESULT ( STDMETHODCALLTYPE *CommitChanges )( - IBDA_DeviceControl * This); - - HRESULT ( STDMETHODCALLTYPE *GetChangeState )( - IBDA_DeviceControl * This, - /* [out][in] */ ULONG *pState); - - END_INTERFACE - } IBDA_DeviceControlVtbl; - - interface IBDA_DeviceControl - { - CONST_VTBL struct IBDA_DeviceControlVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_DeviceControl_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_DeviceControl_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_DeviceControl_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_DeviceControl_StartChanges(This) \ - (This)->lpVtbl -> StartChanges(This) - -#define IBDA_DeviceControl_CheckChanges(This) \ - (This)->lpVtbl -> CheckChanges(This) - -#define IBDA_DeviceControl_CommitChanges(This) \ - (This)->lpVtbl -> CommitChanges(This) - -#define IBDA_DeviceControl_GetChangeState(This,pState) \ - (This)->lpVtbl -> GetChangeState(This,pState) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_DeviceControl_StartChanges_Proxy( - IBDA_DeviceControl * This); - - -void __RPC_STUB IBDA_DeviceControl_StartChanges_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_DeviceControl_CheckChanges_Proxy( - IBDA_DeviceControl * This); - - -void __RPC_STUB IBDA_DeviceControl_CheckChanges_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_DeviceControl_CommitChanges_Proxy( - IBDA_DeviceControl * This); - - -void __RPC_STUB IBDA_DeviceControl_CommitChanges_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_DeviceControl_GetChangeState_Proxy( - IBDA_DeviceControl * This, - /* [out][in] */ ULONG *pState); - - -void __RPC_STUB IBDA_DeviceControl_GetChangeState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_DeviceControl_INTERFACE_DEFINED__ */ - - -#ifndef __IBDA_PinControl_INTERFACE_DEFINED__ -#define __IBDA_PinControl_INTERFACE_DEFINED__ - -/* interface IBDA_PinControl */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_PinControl; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("0DED49D5-A8B7-4d5d-97A1-12B0C195874D") - IBDA_PinControl : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetPinID( - /* [out][in] */ ULONG *pulPinID) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetPinType( - /* [out][in] */ ULONG *pulPinType) = 0; - - virtual HRESULT STDMETHODCALLTYPE RegistrationContext( - /* [out][in] */ ULONG *pulRegistrationCtx) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_PinControlVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_PinControl * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_PinControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_PinControl * This); - - HRESULT ( STDMETHODCALLTYPE *GetPinID )( - IBDA_PinControl * This, - /* [out][in] */ ULONG *pulPinID); - - HRESULT ( STDMETHODCALLTYPE *GetPinType )( - IBDA_PinControl * This, - /* [out][in] */ ULONG *pulPinType); - - HRESULT ( STDMETHODCALLTYPE *RegistrationContext )( - IBDA_PinControl * This, - /* [out][in] */ ULONG *pulRegistrationCtx); - - END_INTERFACE - } IBDA_PinControlVtbl; - - interface IBDA_PinControl - { - CONST_VTBL struct IBDA_PinControlVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_PinControl_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_PinControl_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_PinControl_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_PinControl_GetPinID(This,pulPinID) \ - (This)->lpVtbl -> GetPinID(This,pulPinID) - -#define IBDA_PinControl_GetPinType(This,pulPinType) \ - (This)->lpVtbl -> GetPinType(This,pulPinType) - -#define IBDA_PinControl_RegistrationContext(This,pulRegistrationCtx) \ - (This)->lpVtbl -> RegistrationContext(This,pulRegistrationCtx) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_PinControl_GetPinID_Proxy( - IBDA_PinControl * This, - /* [out][in] */ ULONG *pulPinID); - - -void __RPC_STUB IBDA_PinControl_GetPinID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_PinControl_GetPinType_Proxy( - IBDA_PinControl * This, - /* [out][in] */ ULONG *pulPinType); - - -void __RPC_STUB IBDA_PinControl_GetPinType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_PinControl_RegistrationContext_Proxy( - IBDA_PinControl * This, - /* [out][in] */ ULONG *pulRegistrationCtx); - - -void __RPC_STUB IBDA_PinControl_RegistrationContext_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_PinControl_INTERFACE_DEFINED__ */ - - -#ifndef __IBDA_SignalProperties_INTERFACE_DEFINED__ -#define __IBDA_SignalProperties_INTERFACE_DEFINED__ - -/* interface IBDA_SignalProperties */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_SignalProperties; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("D2F1644B-B409-11d2-BC69-00A0C9EE9E16") - IBDA_SignalProperties : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE PutNetworkType( - /* [in] */ REFGUID guidNetworkType) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNetworkType( - /* [out][in] */ GUID *pguidNetworkType) = 0; - - virtual HRESULT STDMETHODCALLTYPE PutSignalSource( - /* [in] */ ULONG ulSignalSource) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSignalSource( - /* [out][in] */ ULONG *pulSignalSource) = 0; - - virtual HRESULT STDMETHODCALLTYPE PutTuningSpace( - /* [in] */ REFGUID guidTuningSpace) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTuningSpace( - /* [out][in] */ GUID *pguidTuingSpace) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_SignalPropertiesVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_SignalProperties * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_SignalProperties * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_SignalProperties * This); - - HRESULT ( STDMETHODCALLTYPE *PutNetworkType )( - IBDA_SignalProperties * This, - /* [in] */ REFGUID guidNetworkType); - - HRESULT ( STDMETHODCALLTYPE *GetNetworkType )( - IBDA_SignalProperties * This, - /* [out][in] */ GUID *pguidNetworkType); - - HRESULT ( STDMETHODCALLTYPE *PutSignalSource )( - IBDA_SignalProperties * This, - /* [in] */ ULONG ulSignalSource); - - HRESULT ( STDMETHODCALLTYPE *GetSignalSource )( - IBDA_SignalProperties * This, - /* [out][in] */ ULONG *pulSignalSource); - - HRESULT ( STDMETHODCALLTYPE *PutTuningSpace )( - IBDA_SignalProperties * This, - /* [in] */ REFGUID guidTuningSpace); - - HRESULT ( STDMETHODCALLTYPE *GetTuningSpace )( - IBDA_SignalProperties * This, - /* [out][in] */ GUID *pguidTuingSpace); - - END_INTERFACE - } IBDA_SignalPropertiesVtbl; - - interface IBDA_SignalProperties - { - CONST_VTBL struct IBDA_SignalPropertiesVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_SignalProperties_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_SignalProperties_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_SignalProperties_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_SignalProperties_PutNetworkType(This,guidNetworkType) \ - (This)->lpVtbl -> PutNetworkType(This,guidNetworkType) - -#define IBDA_SignalProperties_GetNetworkType(This,pguidNetworkType) \ - (This)->lpVtbl -> GetNetworkType(This,pguidNetworkType) - -#define IBDA_SignalProperties_PutSignalSource(This,ulSignalSource) \ - (This)->lpVtbl -> PutSignalSource(This,ulSignalSource) - -#define IBDA_SignalProperties_GetSignalSource(This,pulSignalSource) \ - (This)->lpVtbl -> GetSignalSource(This,pulSignalSource) - -#define IBDA_SignalProperties_PutTuningSpace(This,guidTuningSpace) \ - (This)->lpVtbl -> PutTuningSpace(This,guidTuningSpace) - -#define IBDA_SignalProperties_GetTuningSpace(This,pguidTuingSpace) \ - (This)->lpVtbl -> GetTuningSpace(This,pguidTuingSpace) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_SignalProperties_PutNetworkType_Proxy( - IBDA_SignalProperties * This, - /* [in] */ REFGUID guidNetworkType); - - -void __RPC_STUB IBDA_SignalProperties_PutNetworkType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_SignalProperties_GetNetworkType_Proxy( - IBDA_SignalProperties * This, - /* [out][in] */ GUID *pguidNetworkType); - - -void __RPC_STUB IBDA_SignalProperties_GetNetworkType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_SignalProperties_PutSignalSource_Proxy( - IBDA_SignalProperties * This, - /* [in] */ ULONG ulSignalSource); - - -void __RPC_STUB IBDA_SignalProperties_PutSignalSource_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_SignalProperties_GetSignalSource_Proxy( - IBDA_SignalProperties * This, - /* [out][in] */ ULONG *pulSignalSource); - - -void __RPC_STUB IBDA_SignalProperties_GetSignalSource_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_SignalProperties_PutTuningSpace_Proxy( - IBDA_SignalProperties * This, - /* [in] */ REFGUID guidTuningSpace); - - -void __RPC_STUB IBDA_SignalProperties_PutTuningSpace_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_SignalProperties_GetTuningSpace_Proxy( - IBDA_SignalProperties * This, - /* [out][in] */ GUID *pguidTuingSpace); - - -void __RPC_STUB IBDA_SignalProperties_GetTuningSpace_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_SignalProperties_INTERFACE_DEFINED__ */ - - -#ifndef __IBDA_SignalStatistics_INTERFACE_DEFINED__ -#define __IBDA_SignalStatistics_INTERFACE_DEFINED__ - -/* interface IBDA_SignalStatistics */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_SignalStatistics; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("1347D106-CF3A-428a-A5CB-AC0D9A2A4338") - IBDA_SignalStatistics : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE put_SignalStrength( - /* [in] */ LONG lDbStrength) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_SignalStrength( - /* [out][in] */ LONG *plDbStrength) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_SignalQuality( - /* [in] */ LONG lPercentQuality) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_SignalQuality( - /* [out][in] */ LONG *plPercentQuality) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_SignalPresent( - /* [in] */ BOOLEAN fPresent) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_SignalPresent( - /* [out][in] */ BOOLEAN *pfPresent) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_SignalLocked( - /* [in] */ BOOLEAN fLocked) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_SignalLocked( - /* [out][in] */ BOOLEAN *pfLocked) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_SampleTime( - /* [in] */ LONG lmsSampleTime) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_SampleTime( - /* [out][in] */ LONG *plmsSampleTime) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_SignalStatisticsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_SignalStatistics * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_SignalStatistics * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_SignalStatistics * This); - - HRESULT ( STDMETHODCALLTYPE *put_SignalStrength )( - IBDA_SignalStatistics * This, - /* [in] */ LONG lDbStrength); - - HRESULT ( STDMETHODCALLTYPE *get_SignalStrength )( - IBDA_SignalStatistics * This, - /* [out][in] */ LONG *plDbStrength); - - HRESULT ( STDMETHODCALLTYPE *put_SignalQuality )( - IBDA_SignalStatistics * This, - /* [in] */ LONG lPercentQuality); - - HRESULT ( STDMETHODCALLTYPE *get_SignalQuality )( - IBDA_SignalStatistics * This, - /* [out][in] */ LONG *plPercentQuality); - - HRESULT ( STDMETHODCALLTYPE *put_SignalPresent )( - IBDA_SignalStatistics * This, - /* [in] */ BOOLEAN fPresent); - - HRESULT ( STDMETHODCALLTYPE *get_SignalPresent )( - IBDA_SignalStatistics * This, - /* [out][in] */ BOOLEAN *pfPresent); - - HRESULT ( STDMETHODCALLTYPE *put_SignalLocked )( - IBDA_SignalStatistics * This, - /* [in] */ BOOLEAN fLocked); - - HRESULT ( STDMETHODCALLTYPE *get_SignalLocked )( - IBDA_SignalStatistics * This, - /* [out][in] */ BOOLEAN *pfLocked); - - HRESULT ( STDMETHODCALLTYPE *put_SampleTime )( - IBDA_SignalStatistics * This, - /* [in] */ LONG lmsSampleTime); - - HRESULT ( STDMETHODCALLTYPE *get_SampleTime )( - IBDA_SignalStatistics * This, - /* [out][in] */ LONG *plmsSampleTime); - - END_INTERFACE - } IBDA_SignalStatisticsVtbl; - - interface IBDA_SignalStatistics - { - CONST_VTBL struct IBDA_SignalStatisticsVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_SignalStatistics_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_SignalStatistics_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_SignalStatistics_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_SignalStatistics_put_SignalStrength(This,lDbStrength) \ - (This)->lpVtbl -> put_SignalStrength(This,lDbStrength) - -#define IBDA_SignalStatistics_get_SignalStrength(This,plDbStrength) \ - (This)->lpVtbl -> get_SignalStrength(This,plDbStrength) - -#define IBDA_SignalStatistics_put_SignalQuality(This,lPercentQuality) \ - (This)->lpVtbl -> put_SignalQuality(This,lPercentQuality) - -#define IBDA_SignalStatistics_get_SignalQuality(This,plPercentQuality) \ - (This)->lpVtbl -> get_SignalQuality(This,plPercentQuality) - -#define IBDA_SignalStatistics_put_SignalPresent(This,fPresent) \ - (This)->lpVtbl -> put_SignalPresent(This,fPresent) - -#define IBDA_SignalStatistics_get_SignalPresent(This,pfPresent) \ - (This)->lpVtbl -> get_SignalPresent(This,pfPresent) - -#define IBDA_SignalStatistics_put_SignalLocked(This,fLocked) \ - (This)->lpVtbl -> put_SignalLocked(This,fLocked) - -#define IBDA_SignalStatistics_get_SignalLocked(This,pfLocked) \ - (This)->lpVtbl -> get_SignalLocked(This,pfLocked) - -#define IBDA_SignalStatistics_put_SampleTime(This,lmsSampleTime) \ - (This)->lpVtbl -> put_SampleTime(This,lmsSampleTime) - -#define IBDA_SignalStatistics_get_SampleTime(This,plmsSampleTime) \ - (This)->lpVtbl -> get_SampleTime(This,plmsSampleTime) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_SignalStatistics_put_SignalStrength_Proxy( - IBDA_SignalStatistics * This, - /* [in] */ LONG lDbStrength); - - -void __RPC_STUB IBDA_SignalStatistics_put_SignalStrength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_SignalStatistics_get_SignalStrength_Proxy( - IBDA_SignalStatistics * This, - /* [out][in] */ LONG *plDbStrength); - - -void __RPC_STUB IBDA_SignalStatistics_get_SignalStrength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_SignalStatistics_put_SignalQuality_Proxy( - IBDA_SignalStatistics * This, - /* [in] */ LONG lPercentQuality); - - -void __RPC_STUB IBDA_SignalStatistics_put_SignalQuality_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_SignalStatistics_get_SignalQuality_Proxy( - IBDA_SignalStatistics * This, - /* [out][in] */ LONG *plPercentQuality); - - -void __RPC_STUB IBDA_SignalStatistics_get_SignalQuality_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_SignalStatistics_put_SignalPresent_Proxy( - IBDA_SignalStatistics * This, - /* [in] */ BOOLEAN fPresent); - - -void __RPC_STUB IBDA_SignalStatistics_put_SignalPresent_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_SignalStatistics_get_SignalPresent_Proxy( - IBDA_SignalStatistics * This, - /* [out][in] */ BOOLEAN *pfPresent); - - -void __RPC_STUB IBDA_SignalStatistics_get_SignalPresent_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_SignalStatistics_put_SignalLocked_Proxy( - IBDA_SignalStatistics * This, - /* [in] */ BOOLEAN fLocked); - - -void __RPC_STUB IBDA_SignalStatistics_put_SignalLocked_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_SignalStatistics_get_SignalLocked_Proxy( - IBDA_SignalStatistics * This, - /* [out][in] */ BOOLEAN *pfLocked); - - -void __RPC_STUB IBDA_SignalStatistics_get_SignalLocked_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_SignalStatistics_put_SampleTime_Proxy( - IBDA_SignalStatistics * This, - /* [in] */ LONG lmsSampleTime); - - -void __RPC_STUB IBDA_SignalStatistics_put_SampleTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_SignalStatistics_get_SampleTime_Proxy( - IBDA_SignalStatistics * This, - /* [out][in] */ LONG *plmsSampleTime); - - -void __RPC_STUB IBDA_SignalStatistics_get_SampleTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_SignalStatistics_INTERFACE_DEFINED__ */ - - -#ifndef __IBDA_Topology_INTERFACE_DEFINED__ -#define __IBDA_Topology_INTERFACE_DEFINED__ - -/* interface IBDA_Topology */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_Topology; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("79B56888-7FEA-4690-B45D-38FD3C7849BE") - IBDA_Topology : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetNodeTypes( - /* [out][in] */ ULONG *pulcNodeTypes, - /* [in] */ ULONG ulcNodeTypesMax, - /* [size_is][out][in] */ ULONG rgulNodeTypes[ ]) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNodeDescriptors( - /* [out][in] */ ULONG *ulcNodeDescriptors, - /* [in] */ ULONG ulcNodeDescriptorsMax, - /* [size_is][out][in] */ BDANODE_DESCRIPTOR rgNodeDescriptors[ ]) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNodeInterfaces( - /* [in] */ ULONG ulNodeType, - /* [out][in] */ ULONG *pulcInterfaces, - /* [in] */ ULONG ulcInterfacesMax, - /* [size_is][out][in] */ GUID rgguidInterfaces[ ]) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetPinTypes( - /* [out][in] */ ULONG *pulcPinTypes, - /* [in] */ ULONG ulcPinTypesMax, - /* [size_is][out][in] */ ULONG rgulPinTypes[ ]) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTemplateConnections( - /* [out][in] */ ULONG *pulcConnections, - /* [in] */ ULONG ulcConnectionsMax, - /* [size_is][out][in] */ BDA_TEMPLATE_CONNECTION rgConnections[ ]) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreatePin( - /* [in] */ ULONG ulPinType, - /* [out][in] */ ULONG *pulPinId) = 0; - - virtual HRESULT STDMETHODCALLTYPE DeletePin( - /* [in] */ ULONG ulPinId) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMediaType( - /* [in] */ ULONG ulPinId, - /* [in] */ AM_MEDIA_TYPE *pMediaType) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMedium( - /* [in] */ ULONG ulPinId, - /* [in] */ REGPINMEDIUM *pMedium) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateTopology( - /* [in] */ ULONG ulInputPinId, - /* [in] */ ULONG ulOutputPinId) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetControlNode( - /* [in] */ ULONG ulInputPinId, - /* [in] */ ULONG ulOutputPinId, - /* [in] */ ULONG ulNodeType, - /* [out][in] */ IUnknown **ppControlNode) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_TopologyVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_Topology * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_Topology * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_Topology * This); - - HRESULT ( STDMETHODCALLTYPE *GetNodeTypes )( - IBDA_Topology * This, - /* [out][in] */ ULONG *pulcNodeTypes, - /* [in] */ ULONG ulcNodeTypesMax, - /* [size_is][out][in] */ ULONG rgulNodeTypes[ ]); - - HRESULT ( STDMETHODCALLTYPE *GetNodeDescriptors )( - IBDA_Topology * This, - /* [out][in] */ ULONG *ulcNodeDescriptors, - /* [in] */ ULONG ulcNodeDescriptorsMax, - /* [size_is][out][in] */ BDANODE_DESCRIPTOR rgNodeDescriptors[ ]); - - HRESULT ( STDMETHODCALLTYPE *GetNodeInterfaces )( - IBDA_Topology * This, - /* [in] */ ULONG ulNodeType, - /* [out][in] */ ULONG *pulcInterfaces, - /* [in] */ ULONG ulcInterfacesMax, - /* [size_is][out][in] */ GUID rgguidInterfaces[ ]); - - HRESULT ( STDMETHODCALLTYPE *GetPinTypes )( - IBDA_Topology * This, - /* [out][in] */ ULONG *pulcPinTypes, - /* [in] */ ULONG ulcPinTypesMax, - /* [size_is][out][in] */ ULONG rgulPinTypes[ ]); - - HRESULT ( STDMETHODCALLTYPE *GetTemplateConnections )( - IBDA_Topology * This, - /* [out][in] */ ULONG *pulcConnections, - /* [in] */ ULONG ulcConnectionsMax, - /* [size_is][out][in] */ BDA_TEMPLATE_CONNECTION rgConnections[ ]); - - HRESULT ( STDMETHODCALLTYPE *CreatePin )( - IBDA_Topology * This, - /* [in] */ ULONG ulPinType, - /* [out][in] */ ULONG *pulPinId); - - HRESULT ( STDMETHODCALLTYPE *DeletePin )( - IBDA_Topology * This, - /* [in] */ ULONG ulPinId); - - HRESULT ( STDMETHODCALLTYPE *SetMediaType )( - IBDA_Topology * This, - /* [in] */ ULONG ulPinId, - /* [in] */ AM_MEDIA_TYPE *pMediaType); - - HRESULT ( STDMETHODCALLTYPE *SetMedium )( - IBDA_Topology * This, - /* [in] */ ULONG ulPinId, - /* [in] */ REGPINMEDIUM *pMedium); - - HRESULT ( STDMETHODCALLTYPE *CreateTopology )( - IBDA_Topology * This, - /* [in] */ ULONG ulInputPinId, - /* [in] */ ULONG ulOutputPinId); - - HRESULT ( STDMETHODCALLTYPE *GetControlNode )( - IBDA_Topology * This, - /* [in] */ ULONG ulInputPinId, - /* [in] */ ULONG ulOutputPinId, - /* [in] */ ULONG ulNodeType, - /* [out][in] */ IUnknown **ppControlNode); - - END_INTERFACE - } IBDA_TopologyVtbl; - - interface IBDA_Topology - { - CONST_VTBL struct IBDA_TopologyVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_Topology_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_Topology_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_Topology_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_Topology_GetNodeTypes(This,pulcNodeTypes,ulcNodeTypesMax,rgulNodeTypes) \ - (This)->lpVtbl -> GetNodeTypes(This,pulcNodeTypes,ulcNodeTypesMax,rgulNodeTypes) - -#define IBDA_Topology_GetNodeDescriptors(This,ulcNodeDescriptors,ulcNodeDescriptorsMax,rgNodeDescriptors) \ - (This)->lpVtbl -> GetNodeDescriptors(This,ulcNodeDescriptors,ulcNodeDescriptorsMax,rgNodeDescriptors) - -#define IBDA_Topology_GetNodeInterfaces(This,ulNodeType,pulcInterfaces,ulcInterfacesMax,rgguidInterfaces) \ - (This)->lpVtbl -> GetNodeInterfaces(This,ulNodeType,pulcInterfaces,ulcInterfacesMax,rgguidInterfaces) - -#define IBDA_Topology_GetPinTypes(This,pulcPinTypes,ulcPinTypesMax,rgulPinTypes) \ - (This)->lpVtbl -> GetPinTypes(This,pulcPinTypes,ulcPinTypesMax,rgulPinTypes) - -#define IBDA_Topology_GetTemplateConnections(This,pulcConnections,ulcConnectionsMax,rgConnections) \ - (This)->lpVtbl -> GetTemplateConnections(This,pulcConnections,ulcConnectionsMax,rgConnections) - -#define IBDA_Topology_CreatePin(This,ulPinType,pulPinId) \ - (This)->lpVtbl -> CreatePin(This,ulPinType,pulPinId) - -#define IBDA_Topology_DeletePin(This,ulPinId) \ - (This)->lpVtbl -> DeletePin(This,ulPinId) - -#define IBDA_Topology_SetMediaType(This,ulPinId,pMediaType) \ - (This)->lpVtbl -> SetMediaType(This,ulPinId,pMediaType) - -#define IBDA_Topology_SetMedium(This,ulPinId,pMedium) \ - (This)->lpVtbl -> SetMedium(This,ulPinId,pMedium) - -#define IBDA_Topology_CreateTopology(This,ulInputPinId,ulOutputPinId) \ - (This)->lpVtbl -> CreateTopology(This,ulInputPinId,ulOutputPinId) - -#define IBDA_Topology_GetControlNode(This,ulInputPinId,ulOutputPinId,ulNodeType,ppControlNode) \ - (This)->lpVtbl -> GetControlNode(This,ulInputPinId,ulOutputPinId,ulNodeType,ppControlNode) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_Topology_GetNodeTypes_Proxy( - IBDA_Topology * This, - /* [out][in] */ ULONG *pulcNodeTypes, - /* [in] */ ULONG ulcNodeTypesMax, - /* [size_is][out][in] */ ULONG rgulNodeTypes[ ]); - - -void __RPC_STUB IBDA_Topology_GetNodeTypes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_Topology_GetNodeDescriptors_Proxy( - IBDA_Topology * This, - /* [out][in] */ ULONG *ulcNodeDescriptors, - /* [in] */ ULONG ulcNodeDescriptorsMax, - /* [size_is][out][in] */ BDANODE_DESCRIPTOR rgNodeDescriptors[ ]); - - -void __RPC_STUB IBDA_Topology_GetNodeDescriptors_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_Topology_GetNodeInterfaces_Proxy( - IBDA_Topology * This, - /* [in] */ ULONG ulNodeType, - /* [out][in] */ ULONG *pulcInterfaces, - /* [in] */ ULONG ulcInterfacesMax, - /* [size_is][out][in] */ GUID rgguidInterfaces[ ]); - - -void __RPC_STUB IBDA_Topology_GetNodeInterfaces_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_Topology_GetPinTypes_Proxy( - IBDA_Topology * This, - /* [out][in] */ ULONG *pulcPinTypes, - /* [in] */ ULONG ulcPinTypesMax, - /* [size_is][out][in] */ ULONG rgulPinTypes[ ]); - - -void __RPC_STUB IBDA_Topology_GetPinTypes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_Topology_GetTemplateConnections_Proxy( - IBDA_Topology * This, - /* [out][in] */ ULONG *pulcConnections, - /* [in] */ ULONG ulcConnectionsMax, - /* [size_is][out][in] */ BDA_TEMPLATE_CONNECTION rgConnections[ ]); - - -void __RPC_STUB IBDA_Topology_GetTemplateConnections_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_Topology_CreatePin_Proxy( - IBDA_Topology * This, - /* [in] */ ULONG ulPinType, - /* [out][in] */ ULONG *pulPinId); - - -void __RPC_STUB IBDA_Topology_CreatePin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_Topology_DeletePin_Proxy( - IBDA_Topology * This, - /* [in] */ ULONG ulPinId); - - -void __RPC_STUB IBDA_Topology_DeletePin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_Topology_SetMediaType_Proxy( - IBDA_Topology * This, - /* [in] */ ULONG ulPinId, - /* [in] */ AM_MEDIA_TYPE *pMediaType); - - -void __RPC_STUB IBDA_Topology_SetMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_Topology_SetMedium_Proxy( - IBDA_Topology * This, - /* [in] */ ULONG ulPinId, - /* [in] */ REGPINMEDIUM *pMedium); - - -void __RPC_STUB IBDA_Topology_SetMedium_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_Topology_CreateTopology_Proxy( - IBDA_Topology * This, - /* [in] */ ULONG ulInputPinId, - /* [in] */ ULONG ulOutputPinId); - - -void __RPC_STUB IBDA_Topology_CreateTopology_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_Topology_GetControlNode_Proxy( - IBDA_Topology * This, - /* [in] */ ULONG ulInputPinId, - /* [in] */ ULONG ulOutputPinId, - /* [in] */ ULONG ulNodeType, - /* [out][in] */ IUnknown **ppControlNode); - - -void __RPC_STUB IBDA_Topology_GetControlNode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_Topology_INTERFACE_DEFINED__ */ - - -#ifndef __IBDA_VoidTransform_INTERFACE_DEFINED__ -#define __IBDA_VoidTransform_INTERFACE_DEFINED__ - -/* interface IBDA_VoidTransform */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_VoidTransform; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("71985F46-1CA1-11d3-9CC8-00C04F7971E0") - IBDA_VoidTransform : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Start( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Stop( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_VoidTransformVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_VoidTransform * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_VoidTransform * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_VoidTransform * This); - - HRESULT ( STDMETHODCALLTYPE *Start )( - IBDA_VoidTransform * This); - - HRESULT ( STDMETHODCALLTYPE *Stop )( - IBDA_VoidTransform * This); - - END_INTERFACE - } IBDA_VoidTransformVtbl; - - interface IBDA_VoidTransform - { - CONST_VTBL struct IBDA_VoidTransformVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_VoidTransform_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_VoidTransform_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_VoidTransform_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_VoidTransform_Start(This) \ - (This)->lpVtbl -> Start(This) - -#define IBDA_VoidTransform_Stop(This) \ - (This)->lpVtbl -> Stop(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_VoidTransform_Start_Proxy( - IBDA_VoidTransform * This); - - -void __RPC_STUB IBDA_VoidTransform_Start_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_VoidTransform_Stop_Proxy( - IBDA_VoidTransform * This); - - -void __RPC_STUB IBDA_VoidTransform_Stop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_VoidTransform_INTERFACE_DEFINED__ */ - - -#ifndef __IBDA_NullTransform_INTERFACE_DEFINED__ -#define __IBDA_NullTransform_INTERFACE_DEFINED__ - -/* interface IBDA_NullTransform */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_NullTransform; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("DDF15B0D-BD25-11d2-9CA0-00C04F7971E0") - IBDA_NullTransform : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Start( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Stop( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_NullTransformVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_NullTransform * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_NullTransform * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_NullTransform * This); - - HRESULT ( STDMETHODCALLTYPE *Start )( - IBDA_NullTransform * This); - - HRESULT ( STDMETHODCALLTYPE *Stop )( - IBDA_NullTransform * This); - - END_INTERFACE - } IBDA_NullTransformVtbl; - - interface IBDA_NullTransform - { - CONST_VTBL struct IBDA_NullTransformVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_NullTransform_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_NullTransform_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_NullTransform_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_NullTransform_Start(This) \ - (This)->lpVtbl -> Start(This) - -#define IBDA_NullTransform_Stop(This) \ - (This)->lpVtbl -> Stop(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_NullTransform_Start_Proxy( - IBDA_NullTransform * This); - - -void __RPC_STUB IBDA_NullTransform_Start_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_NullTransform_Stop_Proxy( - IBDA_NullTransform * This); - - -void __RPC_STUB IBDA_NullTransform_Stop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_NullTransform_INTERFACE_DEFINED__ */ - - -#ifndef __IBDA_FrequencyFilter_INTERFACE_DEFINED__ -#define __IBDA_FrequencyFilter_INTERFACE_DEFINED__ - -/* interface IBDA_FrequencyFilter */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_FrequencyFilter; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("71985F47-1CA1-11d3-9CC8-00C04F7971E0") - IBDA_FrequencyFilter : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE put_Autotune( - /* [in] */ ULONG ulTransponder) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Autotune( - /* [out][in] */ ULONG *pulTransponder) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_Frequency( - /* [in] */ ULONG ulFrequency) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Frequency( - /* [out][in] */ ULONG *pulFrequency) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_Polarity( - /* [in] */ Polarisation Polarity) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Polarity( - /* [out][in] */ Polarisation *pPolarity) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_Range( - /* [in] */ ULONG ulRange) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Range( - /* [out][in] */ ULONG *pulRange) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_Bandwidth( - /* [in] */ ULONG ulBandwidth) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Bandwidth( - /* [out][in] */ ULONG *pulBandwidth) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_FrequencyMultiplier( - /* [in] */ ULONG ulMultiplier) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_FrequencyMultiplier( - /* [out][in] */ ULONG *pulMultiplier) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_FrequencyFilterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_FrequencyFilter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_FrequencyFilter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_FrequencyFilter * This); - - HRESULT ( STDMETHODCALLTYPE *put_Autotune )( - IBDA_FrequencyFilter * This, - /* [in] */ ULONG ulTransponder); - - HRESULT ( STDMETHODCALLTYPE *get_Autotune )( - IBDA_FrequencyFilter * This, - /* [out][in] */ ULONG *pulTransponder); - - HRESULT ( STDMETHODCALLTYPE *put_Frequency )( - IBDA_FrequencyFilter * This, - /* [in] */ ULONG ulFrequency); - - HRESULT ( STDMETHODCALLTYPE *get_Frequency )( - IBDA_FrequencyFilter * This, - /* [out][in] */ ULONG *pulFrequency); - - HRESULT ( STDMETHODCALLTYPE *put_Polarity )( - IBDA_FrequencyFilter * This, - /* [in] */ Polarisation Polarity); - - HRESULT ( STDMETHODCALLTYPE *get_Polarity )( - IBDA_FrequencyFilter * This, - /* [out][in] */ Polarisation *pPolarity); - - HRESULT ( STDMETHODCALLTYPE *put_Range )( - IBDA_FrequencyFilter * This, - /* [in] */ ULONG ulRange); - - HRESULT ( STDMETHODCALLTYPE *get_Range )( - IBDA_FrequencyFilter * This, - /* [out][in] */ ULONG *pulRange); - - HRESULT ( STDMETHODCALLTYPE *put_Bandwidth )( - IBDA_FrequencyFilter * This, - /* [in] */ ULONG ulBandwidth); - - HRESULT ( STDMETHODCALLTYPE *get_Bandwidth )( - IBDA_FrequencyFilter * This, - /* [out][in] */ ULONG *pulBandwidth); - - HRESULT ( STDMETHODCALLTYPE *put_FrequencyMultiplier )( - IBDA_FrequencyFilter * This, - /* [in] */ ULONG ulMultiplier); - - HRESULT ( STDMETHODCALLTYPE *get_FrequencyMultiplier )( - IBDA_FrequencyFilter * This, - /* [out][in] */ ULONG *pulMultiplier); - - END_INTERFACE - } IBDA_FrequencyFilterVtbl; - - interface IBDA_FrequencyFilter - { - CONST_VTBL struct IBDA_FrequencyFilterVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_FrequencyFilter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_FrequencyFilter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_FrequencyFilter_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_FrequencyFilter_put_Autotune(This,ulTransponder) \ - (This)->lpVtbl -> put_Autotune(This,ulTransponder) - -#define IBDA_FrequencyFilter_get_Autotune(This,pulTransponder) \ - (This)->lpVtbl -> get_Autotune(This,pulTransponder) - -#define IBDA_FrequencyFilter_put_Frequency(This,ulFrequency) \ - (This)->lpVtbl -> put_Frequency(This,ulFrequency) - -#define IBDA_FrequencyFilter_get_Frequency(This,pulFrequency) \ - (This)->lpVtbl -> get_Frequency(This,pulFrequency) - -#define IBDA_FrequencyFilter_put_Polarity(This,Polarity) \ - (This)->lpVtbl -> put_Polarity(This,Polarity) - -#define IBDA_FrequencyFilter_get_Polarity(This,pPolarity) \ - (This)->lpVtbl -> get_Polarity(This,pPolarity) - -#define IBDA_FrequencyFilter_put_Range(This,ulRange) \ - (This)->lpVtbl -> put_Range(This,ulRange) - -#define IBDA_FrequencyFilter_get_Range(This,pulRange) \ - (This)->lpVtbl -> get_Range(This,pulRange) - -#define IBDA_FrequencyFilter_put_Bandwidth(This,ulBandwidth) \ - (This)->lpVtbl -> put_Bandwidth(This,ulBandwidth) - -#define IBDA_FrequencyFilter_get_Bandwidth(This,pulBandwidth) \ - (This)->lpVtbl -> get_Bandwidth(This,pulBandwidth) - -#define IBDA_FrequencyFilter_put_FrequencyMultiplier(This,ulMultiplier) \ - (This)->lpVtbl -> put_FrequencyMultiplier(This,ulMultiplier) - -#define IBDA_FrequencyFilter_get_FrequencyMultiplier(This,pulMultiplier) \ - (This)->lpVtbl -> get_FrequencyMultiplier(This,pulMultiplier) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_FrequencyFilter_put_Autotune_Proxy( - IBDA_FrequencyFilter * This, - /* [in] */ ULONG ulTransponder); - - -void __RPC_STUB IBDA_FrequencyFilter_put_Autotune_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_FrequencyFilter_get_Autotune_Proxy( - IBDA_FrequencyFilter * This, - /* [out][in] */ ULONG *pulTransponder); - - -void __RPC_STUB IBDA_FrequencyFilter_get_Autotune_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_FrequencyFilter_put_Frequency_Proxy( - IBDA_FrequencyFilter * This, - /* [in] */ ULONG ulFrequency); - - -void __RPC_STUB IBDA_FrequencyFilter_put_Frequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_FrequencyFilter_get_Frequency_Proxy( - IBDA_FrequencyFilter * This, - /* [out][in] */ ULONG *pulFrequency); - - -void __RPC_STUB IBDA_FrequencyFilter_get_Frequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_FrequencyFilter_put_Polarity_Proxy( - IBDA_FrequencyFilter * This, - /* [in] */ Polarisation Polarity); - - -void __RPC_STUB IBDA_FrequencyFilter_put_Polarity_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_FrequencyFilter_get_Polarity_Proxy( - IBDA_FrequencyFilter * This, - /* [out][in] */ Polarisation *pPolarity); - - -void __RPC_STUB IBDA_FrequencyFilter_get_Polarity_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_FrequencyFilter_put_Range_Proxy( - IBDA_FrequencyFilter * This, - /* [in] */ ULONG ulRange); - - -void __RPC_STUB IBDA_FrequencyFilter_put_Range_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_FrequencyFilter_get_Range_Proxy( - IBDA_FrequencyFilter * This, - /* [out][in] */ ULONG *pulRange); - - -void __RPC_STUB IBDA_FrequencyFilter_get_Range_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_FrequencyFilter_put_Bandwidth_Proxy( - IBDA_FrequencyFilter * This, - /* [in] */ ULONG ulBandwidth); - - -void __RPC_STUB IBDA_FrequencyFilter_put_Bandwidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_FrequencyFilter_get_Bandwidth_Proxy( - IBDA_FrequencyFilter * This, - /* [out][in] */ ULONG *pulBandwidth); - - -void __RPC_STUB IBDA_FrequencyFilter_get_Bandwidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_FrequencyFilter_put_FrequencyMultiplier_Proxy( - IBDA_FrequencyFilter * This, - /* [in] */ ULONG ulMultiplier); - - -void __RPC_STUB IBDA_FrequencyFilter_put_FrequencyMultiplier_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_FrequencyFilter_get_FrequencyMultiplier_Proxy( - IBDA_FrequencyFilter * This, - /* [out][in] */ ULONG *pulMultiplier); - - -void __RPC_STUB IBDA_FrequencyFilter_get_FrequencyMultiplier_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_FrequencyFilter_INTERFACE_DEFINED__ */ - - -#ifndef __IBDA_LNBInfo_INTERFACE_DEFINED__ -#define __IBDA_LNBInfo_INTERFACE_DEFINED__ - -/* interface IBDA_LNBInfo */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_LNBInfo; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("992CF102-49F9-4719-A664-C4F23E2408F4") - IBDA_LNBInfo : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE put_LocalOscilatorFrequencyLowBand( - /* [in] */ ULONG ulLOFLow) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_LocalOscilatorFrequencyLowBand( - /* [out][in] */ ULONG *pulLOFLow) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_LocalOscilatorFrequencyHighBand( - /* [in] */ ULONG ulLOFHigh) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_LocalOscilatorFrequencyHighBand( - /* [out][in] */ ULONG *pulLOFHigh) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_HighLowSwitchFrequency( - /* [in] */ ULONG ulSwitchFrequency) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_HighLowSwitchFrequency( - /* [out][in] */ ULONG *pulSwitchFrequency) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_LNBInfoVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_LNBInfo * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_LNBInfo * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_LNBInfo * This); - - HRESULT ( STDMETHODCALLTYPE *put_LocalOscilatorFrequencyLowBand )( - IBDA_LNBInfo * This, - /* [in] */ ULONG ulLOFLow); - - HRESULT ( STDMETHODCALLTYPE *get_LocalOscilatorFrequencyLowBand )( - IBDA_LNBInfo * This, - /* [out][in] */ ULONG *pulLOFLow); - - HRESULT ( STDMETHODCALLTYPE *put_LocalOscilatorFrequencyHighBand )( - IBDA_LNBInfo * This, - /* [in] */ ULONG ulLOFHigh); - - HRESULT ( STDMETHODCALLTYPE *get_LocalOscilatorFrequencyHighBand )( - IBDA_LNBInfo * This, - /* [out][in] */ ULONG *pulLOFHigh); - - HRESULT ( STDMETHODCALLTYPE *put_HighLowSwitchFrequency )( - IBDA_LNBInfo * This, - /* [in] */ ULONG ulSwitchFrequency); - - HRESULT ( STDMETHODCALLTYPE *get_HighLowSwitchFrequency )( - IBDA_LNBInfo * This, - /* [out][in] */ ULONG *pulSwitchFrequency); - - END_INTERFACE - } IBDA_LNBInfoVtbl; - - interface IBDA_LNBInfo - { - CONST_VTBL struct IBDA_LNBInfoVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_LNBInfo_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_LNBInfo_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_LNBInfo_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_LNBInfo_put_LocalOscilatorFrequencyLowBand(This,ulLOFLow) \ - (This)->lpVtbl -> put_LocalOscilatorFrequencyLowBand(This,ulLOFLow) - -#define IBDA_LNBInfo_get_LocalOscilatorFrequencyLowBand(This,pulLOFLow) \ - (This)->lpVtbl -> get_LocalOscilatorFrequencyLowBand(This,pulLOFLow) - -#define IBDA_LNBInfo_put_LocalOscilatorFrequencyHighBand(This,ulLOFHigh) \ - (This)->lpVtbl -> put_LocalOscilatorFrequencyHighBand(This,ulLOFHigh) - -#define IBDA_LNBInfo_get_LocalOscilatorFrequencyHighBand(This,pulLOFHigh) \ - (This)->lpVtbl -> get_LocalOscilatorFrequencyHighBand(This,pulLOFHigh) - -#define IBDA_LNBInfo_put_HighLowSwitchFrequency(This,ulSwitchFrequency) \ - (This)->lpVtbl -> put_HighLowSwitchFrequency(This,ulSwitchFrequency) - -#define IBDA_LNBInfo_get_HighLowSwitchFrequency(This,pulSwitchFrequency) \ - (This)->lpVtbl -> get_HighLowSwitchFrequency(This,pulSwitchFrequency) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_LNBInfo_put_LocalOscilatorFrequencyLowBand_Proxy( - IBDA_LNBInfo * This, - /* [in] */ ULONG ulLOFLow); - - -void __RPC_STUB IBDA_LNBInfo_put_LocalOscilatorFrequencyLowBand_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_LNBInfo_get_LocalOscilatorFrequencyLowBand_Proxy( - IBDA_LNBInfo * This, - /* [out][in] */ ULONG *pulLOFLow); - - -void __RPC_STUB IBDA_LNBInfo_get_LocalOscilatorFrequencyLowBand_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_LNBInfo_put_LocalOscilatorFrequencyHighBand_Proxy( - IBDA_LNBInfo * This, - /* [in] */ ULONG ulLOFHigh); - - -void __RPC_STUB IBDA_LNBInfo_put_LocalOscilatorFrequencyHighBand_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_LNBInfo_get_LocalOscilatorFrequencyHighBand_Proxy( - IBDA_LNBInfo * This, - /* [out][in] */ ULONG *pulLOFHigh); - - -void __RPC_STUB IBDA_LNBInfo_get_LocalOscilatorFrequencyHighBand_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_LNBInfo_put_HighLowSwitchFrequency_Proxy( - IBDA_LNBInfo * This, - /* [in] */ ULONG ulSwitchFrequency); - - -void __RPC_STUB IBDA_LNBInfo_put_HighLowSwitchFrequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_LNBInfo_get_HighLowSwitchFrequency_Proxy( - IBDA_LNBInfo * This, - /* [out][in] */ ULONG *pulSwitchFrequency); - - -void __RPC_STUB IBDA_LNBInfo_get_HighLowSwitchFrequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_LNBInfo_INTERFACE_DEFINED__ */ - - -#ifndef __IBDA_AutoDemodulate_INTERFACE_DEFINED__ -#define __IBDA_AutoDemodulate_INTERFACE_DEFINED__ - -/* interface IBDA_AutoDemodulate */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_AutoDemodulate; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("DDF15B12-BD25-11d2-9CA0-00C04F7971E0") - IBDA_AutoDemodulate : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE put_AutoDemodulate( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_AutoDemodulateVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_AutoDemodulate * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_AutoDemodulate * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_AutoDemodulate * This); - - HRESULT ( STDMETHODCALLTYPE *put_AutoDemodulate )( - IBDA_AutoDemodulate * This); - - END_INTERFACE - } IBDA_AutoDemodulateVtbl; - - interface IBDA_AutoDemodulate - { - CONST_VTBL struct IBDA_AutoDemodulateVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_AutoDemodulate_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_AutoDemodulate_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_AutoDemodulate_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_AutoDemodulate_put_AutoDemodulate(This) \ - (This)->lpVtbl -> put_AutoDemodulate(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_AutoDemodulate_put_AutoDemodulate_Proxy( - IBDA_AutoDemodulate * This); - - -void __RPC_STUB IBDA_AutoDemodulate_put_AutoDemodulate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_AutoDemodulate_INTERFACE_DEFINED__ */ - - -#ifndef __IBDA_DigitalDemodulator_INTERFACE_DEFINED__ -#define __IBDA_DigitalDemodulator_INTERFACE_DEFINED__ - -/* interface IBDA_DigitalDemodulator */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_DigitalDemodulator; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("EF30F379-985B-4d10-B640-A79D5E04E1E0") - IBDA_DigitalDemodulator : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE put_ModulationType( - /* [in] */ ModulationType *pModulationType) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_ModulationType( - /* [out][in] */ ModulationType *pModulationType) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_InnerFECMethod( - /* [in] */ FECMethod *pFECMethod) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_InnerFECMethod( - /* [out][in] */ FECMethod *pFECMethod) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_InnerFECRate( - /* [in] */ BinaryConvolutionCodeRate *pFECRate) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_InnerFECRate( - /* [out][in] */ BinaryConvolutionCodeRate *pFECRate) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_OuterFECMethod( - /* [in] */ FECMethod *pFECMethod) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_OuterFECMethod( - /* [out][in] */ FECMethod *pFECMethod) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_OuterFECRate( - /* [in] */ BinaryConvolutionCodeRate *pFECRate) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_OuterFECRate( - /* [out][in] */ BinaryConvolutionCodeRate *pFECRate) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_SymbolRate( - /* [in] */ ULONG *pSymbolRate) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_SymbolRate( - /* [out][in] */ ULONG *pSymbolRate) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_SpectralInversion( - /* [in] */ SpectralInversion *pSpectralInversion) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_SpectralInversion( - /* [out][in] */ SpectralInversion *pSpectralInversion) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_DigitalDemodulatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_DigitalDemodulator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_DigitalDemodulator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_DigitalDemodulator * This); - - HRESULT ( STDMETHODCALLTYPE *put_ModulationType )( - IBDA_DigitalDemodulator * This, - /* [in] */ ModulationType *pModulationType); - - HRESULT ( STDMETHODCALLTYPE *get_ModulationType )( - IBDA_DigitalDemodulator * This, - /* [out][in] */ ModulationType *pModulationType); - - HRESULT ( STDMETHODCALLTYPE *put_InnerFECMethod )( - IBDA_DigitalDemodulator * This, - /* [in] */ FECMethod *pFECMethod); - - HRESULT ( STDMETHODCALLTYPE *get_InnerFECMethod )( - IBDA_DigitalDemodulator * This, - /* [out][in] */ FECMethod *pFECMethod); - - HRESULT ( STDMETHODCALLTYPE *put_InnerFECRate )( - IBDA_DigitalDemodulator * This, - /* [in] */ BinaryConvolutionCodeRate *pFECRate); - - HRESULT ( STDMETHODCALLTYPE *get_InnerFECRate )( - IBDA_DigitalDemodulator * This, - /* [out][in] */ BinaryConvolutionCodeRate *pFECRate); - - HRESULT ( STDMETHODCALLTYPE *put_OuterFECMethod )( - IBDA_DigitalDemodulator * This, - /* [in] */ FECMethod *pFECMethod); - - HRESULT ( STDMETHODCALLTYPE *get_OuterFECMethod )( - IBDA_DigitalDemodulator * This, - /* [out][in] */ FECMethod *pFECMethod); - - HRESULT ( STDMETHODCALLTYPE *put_OuterFECRate )( - IBDA_DigitalDemodulator * This, - /* [in] */ BinaryConvolutionCodeRate *pFECRate); - - HRESULT ( STDMETHODCALLTYPE *get_OuterFECRate )( - IBDA_DigitalDemodulator * This, - /* [out][in] */ BinaryConvolutionCodeRate *pFECRate); - - HRESULT ( STDMETHODCALLTYPE *put_SymbolRate )( - IBDA_DigitalDemodulator * This, - /* [in] */ ULONG *pSymbolRate); - - HRESULT ( STDMETHODCALLTYPE *get_SymbolRate )( - IBDA_DigitalDemodulator * This, - /* [out][in] */ ULONG *pSymbolRate); - - HRESULT ( STDMETHODCALLTYPE *put_SpectralInversion )( - IBDA_DigitalDemodulator * This, - /* [in] */ SpectralInversion *pSpectralInversion); - - HRESULT ( STDMETHODCALLTYPE *get_SpectralInversion )( - IBDA_DigitalDemodulator * This, - /* [out][in] */ SpectralInversion *pSpectralInversion); - - END_INTERFACE - } IBDA_DigitalDemodulatorVtbl; - - interface IBDA_DigitalDemodulator - { - CONST_VTBL struct IBDA_DigitalDemodulatorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_DigitalDemodulator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_DigitalDemodulator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_DigitalDemodulator_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_DigitalDemodulator_put_ModulationType(This,pModulationType) \ - (This)->lpVtbl -> put_ModulationType(This,pModulationType) - -#define IBDA_DigitalDemodulator_get_ModulationType(This,pModulationType) \ - (This)->lpVtbl -> get_ModulationType(This,pModulationType) - -#define IBDA_DigitalDemodulator_put_InnerFECMethod(This,pFECMethod) \ - (This)->lpVtbl -> put_InnerFECMethod(This,pFECMethod) - -#define IBDA_DigitalDemodulator_get_InnerFECMethod(This,pFECMethod) \ - (This)->lpVtbl -> get_InnerFECMethod(This,pFECMethod) - -#define IBDA_DigitalDemodulator_put_InnerFECRate(This,pFECRate) \ - (This)->lpVtbl -> put_InnerFECRate(This,pFECRate) - -#define IBDA_DigitalDemodulator_get_InnerFECRate(This,pFECRate) \ - (This)->lpVtbl -> get_InnerFECRate(This,pFECRate) - -#define IBDA_DigitalDemodulator_put_OuterFECMethod(This,pFECMethod) \ - (This)->lpVtbl -> put_OuterFECMethod(This,pFECMethod) - -#define IBDA_DigitalDemodulator_get_OuterFECMethod(This,pFECMethod) \ - (This)->lpVtbl -> get_OuterFECMethod(This,pFECMethod) - -#define IBDA_DigitalDemodulator_put_OuterFECRate(This,pFECRate) \ - (This)->lpVtbl -> put_OuterFECRate(This,pFECRate) - -#define IBDA_DigitalDemodulator_get_OuterFECRate(This,pFECRate) \ - (This)->lpVtbl -> get_OuterFECRate(This,pFECRate) - -#define IBDA_DigitalDemodulator_put_SymbolRate(This,pSymbolRate) \ - (This)->lpVtbl -> put_SymbolRate(This,pSymbolRate) - -#define IBDA_DigitalDemodulator_get_SymbolRate(This,pSymbolRate) \ - (This)->lpVtbl -> get_SymbolRate(This,pSymbolRate) - -#define IBDA_DigitalDemodulator_put_SpectralInversion(This,pSpectralInversion) \ - (This)->lpVtbl -> put_SpectralInversion(This,pSpectralInversion) - -#define IBDA_DigitalDemodulator_get_SpectralInversion(This,pSpectralInversion) \ - (This)->lpVtbl -> get_SpectralInversion(This,pSpectralInversion) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_DigitalDemodulator_put_ModulationType_Proxy( - IBDA_DigitalDemodulator * This, - /* [in] */ ModulationType *pModulationType); - - -void __RPC_STUB IBDA_DigitalDemodulator_put_ModulationType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_DigitalDemodulator_get_ModulationType_Proxy( - IBDA_DigitalDemodulator * This, - /* [out][in] */ ModulationType *pModulationType); - - -void __RPC_STUB IBDA_DigitalDemodulator_get_ModulationType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_DigitalDemodulator_put_InnerFECMethod_Proxy( - IBDA_DigitalDemodulator * This, - /* [in] */ FECMethod *pFECMethod); - - -void __RPC_STUB IBDA_DigitalDemodulator_put_InnerFECMethod_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_DigitalDemodulator_get_InnerFECMethod_Proxy( - IBDA_DigitalDemodulator * This, - /* [out][in] */ FECMethod *pFECMethod); - - -void __RPC_STUB IBDA_DigitalDemodulator_get_InnerFECMethod_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_DigitalDemodulator_put_InnerFECRate_Proxy( - IBDA_DigitalDemodulator * This, - /* [in] */ BinaryConvolutionCodeRate *pFECRate); - - -void __RPC_STUB IBDA_DigitalDemodulator_put_InnerFECRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_DigitalDemodulator_get_InnerFECRate_Proxy( - IBDA_DigitalDemodulator * This, - /* [out][in] */ BinaryConvolutionCodeRate *pFECRate); - - -void __RPC_STUB IBDA_DigitalDemodulator_get_InnerFECRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_DigitalDemodulator_put_OuterFECMethod_Proxy( - IBDA_DigitalDemodulator * This, - /* [in] */ FECMethod *pFECMethod); - - -void __RPC_STUB IBDA_DigitalDemodulator_put_OuterFECMethod_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_DigitalDemodulator_get_OuterFECMethod_Proxy( - IBDA_DigitalDemodulator * This, - /* [out][in] */ FECMethod *pFECMethod); - - -void __RPC_STUB IBDA_DigitalDemodulator_get_OuterFECMethod_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_DigitalDemodulator_put_OuterFECRate_Proxy( - IBDA_DigitalDemodulator * This, - /* [in] */ BinaryConvolutionCodeRate *pFECRate); - - -void __RPC_STUB IBDA_DigitalDemodulator_put_OuterFECRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_DigitalDemodulator_get_OuterFECRate_Proxy( - IBDA_DigitalDemodulator * This, - /* [out][in] */ BinaryConvolutionCodeRate *pFECRate); - - -void __RPC_STUB IBDA_DigitalDemodulator_get_OuterFECRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_DigitalDemodulator_put_SymbolRate_Proxy( - IBDA_DigitalDemodulator * This, - /* [in] */ ULONG *pSymbolRate); - - -void __RPC_STUB IBDA_DigitalDemodulator_put_SymbolRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_DigitalDemodulator_get_SymbolRate_Proxy( - IBDA_DigitalDemodulator * This, - /* [out][in] */ ULONG *pSymbolRate); - - -void __RPC_STUB IBDA_DigitalDemodulator_get_SymbolRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_DigitalDemodulator_put_SpectralInversion_Proxy( - IBDA_DigitalDemodulator * This, - /* [in] */ SpectralInversion *pSpectralInversion); - - -void __RPC_STUB IBDA_DigitalDemodulator_put_SpectralInversion_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_DigitalDemodulator_get_SpectralInversion_Proxy( - IBDA_DigitalDemodulator * This, - /* [out][in] */ SpectralInversion *pSpectralInversion); - - -void __RPC_STUB IBDA_DigitalDemodulator_get_SpectralInversion_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_DigitalDemodulator_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_bdaiface_0413 */ -/* [local] */ - -typedef /* [public] */ -enum __MIDL___MIDL_itf_bdaiface_0413_0001 - { KSPROPERTY_IPSINK_MULTICASTLIST = 0, - KSPROPERTY_IPSINK_ADAPTER_DESCRIPTION = KSPROPERTY_IPSINK_MULTICASTLIST + 1, - KSPROPERTY_IPSINK_ADAPTER_ADDRESS = KSPROPERTY_IPSINK_ADAPTER_DESCRIPTION + 1 - } KSPROPERTY_IPSINK; - - - -extern RPC_IF_HANDLE __MIDL_itf_bdaiface_0413_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_bdaiface_0413_v0_0_s_ifspec; - -#ifndef __IBDA_IPSinkControl_INTERFACE_DEFINED__ -#define __IBDA_IPSinkControl_INTERFACE_DEFINED__ - -/* interface IBDA_IPSinkControl */ -/* [helpstring][unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_IPSinkControl; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("3F4DC8E2-4050-11d3-8F4B-00C04F7971E2") - IBDA_IPSinkControl : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetMulticastList( - /* [out][in] */ unsigned long *pulcbSize, - /* [out][in] */ BYTE **pbBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAdapterIPAddress( - /* [out][in] */ unsigned long *pulcbSize, - /* [out][in] */ BYTE **pbBuffer) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_IPSinkControlVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_IPSinkControl * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_IPSinkControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_IPSinkControl * This); - - HRESULT ( STDMETHODCALLTYPE *GetMulticastList )( - IBDA_IPSinkControl * This, - /* [out][in] */ unsigned long *pulcbSize, - /* [out][in] */ BYTE **pbBuffer); - - HRESULT ( STDMETHODCALLTYPE *GetAdapterIPAddress )( - IBDA_IPSinkControl * This, - /* [out][in] */ unsigned long *pulcbSize, - /* [out][in] */ BYTE **pbBuffer); - - END_INTERFACE - } IBDA_IPSinkControlVtbl; - - interface IBDA_IPSinkControl - { - CONST_VTBL struct IBDA_IPSinkControlVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_IPSinkControl_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_IPSinkControl_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_IPSinkControl_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_IPSinkControl_GetMulticastList(This,pulcbSize,pbBuffer) \ - (This)->lpVtbl -> GetMulticastList(This,pulcbSize,pbBuffer) - -#define IBDA_IPSinkControl_GetAdapterIPAddress(This,pulcbSize,pbBuffer) \ - (This)->lpVtbl -> GetAdapterIPAddress(This,pulcbSize,pbBuffer) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_IPSinkControl_GetMulticastList_Proxy( - IBDA_IPSinkControl * This, - /* [out][in] */ unsigned long *pulcbSize, - /* [out][in] */ BYTE **pbBuffer); - - -void __RPC_STUB IBDA_IPSinkControl_GetMulticastList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_IPSinkControl_GetAdapterIPAddress_Proxy( - IBDA_IPSinkControl * This, - /* [out][in] */ unsigned long *pulcbSize, - /* [out][in] */ BYTE **pbBuffer); - - -void __RPC_STUB IBDA_IPSinkControl_GetAdapterIPAddress_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_IPSinkControl_INTERFACE_DEFINED__ */ - - -#ifndef __IBDA_IPSinkInfo_INTERFACE_DEFINED__ -#define __IBDA_IPSinkInfo_INTERFACE_DEFINED__ - -/* interface IBDA_IPSinkInfo */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IBDA_IPSinkInfo; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("A750108F-492E-4d51-95F7-649B23FF7AD7") - IBDA_IPSinkInfo : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE get_MulticastList( - /* [out][in] */ ULONG *pulcbAddresses, - /* [size_is][out] */ BYTE **ppbAddressList) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_AdapterIPAddress( - /* [out] */ BSTR *pbstrBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_AdapterDescription( - /* [out] */ BSTR *pbstrBuffer) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBDA_IPSinkInfoVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBDA_IPSinkInfo * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBDA_IPSinkInfo * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBDA_IPSinkInfo * This); - - HRESULT ( STDMETHODCALLTYPE *get_MulticastList )( - IBDA_IPSinkInfo * This, - /* [out][in] */ ULONG *pulcbAddresses, - /* [size_is][out] */ BYTE **ppbAddressList); - - HRESULT ( STDMETHODCALLTYPE *get_AdapterIPAddress )( - IBDA_IPSinkInfo * This, - /* [out] */ BSTR *pbstrBuffer); - - HRESULT ( STDMETHODCALLTYPE *get_AdapterDescription )( - IBDA_IPSinkInfo * This, - /* [out] */ BSTR *pbstrBuffer); - - END_INTERFACE - } IBDA_IPSinkInfoVtbl; - - interface IBDA_IPSinkInfo - { - CONST_VTBL struct IBDA_IPSinkInfoVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBDA_IPSinkInfo_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBDA_IPSinkInfo_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBDA_IPSinkInfo_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBDA_IPSinkInfo_get_MulticastList(This,pulcbAddresses,ppbAddressList) \ - (This)->lpVtbl -> get_MulticastList(This,pulcbAddresses,ppbAddressList) - -#define IBDA_IPSinkInfo_get_AdapterIPAddress(This,pbstrBuffer) \ - (This)->lpVtbl -> get_AdapterIPAddress(This,pbstrBuffer) - -#define IBDA_IPSinkInfo_get_AdapterDescription(This,pbstrBuffer) \ - (This)->lpVtbl -> get_AdapterDescription(This,pbstrBuffer) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBDA_IPSinkInfo_get_MulticastList_Proxy( - IBDA_IPSinkInfo * This, - /* [out][in] */ ULONG *pulcbAddresses, - /* [size_is][out] */ BYTE **ppbAddressList); - - -void __RPC_STUB IBDA_IPSinkInfo_get_MulticastList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_IPSinkInfo_get_AdapterIPAddress_Proxy( - IBDA_IPSinkInfo * This, - /* [out] */ BSTR *pbstrBuffer); - - -void __RPC_STUB IBDA_IPSinkInfo_get_AdapterIPAddress_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBDA_IPSinkInfo_get_AdapterDescription_Proxy( - IBDA_IPSinkInfo * This, - /* [out] */ BSTR *pbstrBuffer); - - -void __RPC_STUB IBDA_IPSinkInfo_get_AdapterDescription_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBDA_IPSinkInfo_INTERFACE_DEFINED__ */ - - -#ifndef __IEnumPIDMap_INTERFACE_DEFINED__ -#define __IEnumPIDMap_INTERFACE_DEFINED__ - -/* interface IEnumPIDMap */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IEnumPIDMap; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("afb6c2a2-2c41-11d3-8a60-0000f81e0e4a") - IEnumPIDMap : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Next( - /* [in] */ ULONG cRequest, - /* [size_is][out][in] */ PID_MAP *pPIDMap, - /* [out] */ ULONG *pcReceived) = 0; - - virtual HRESULT STDMETHODCALLTYPE Skip( - /* [in] */ ULONG cRecords) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - /* [out] */ IEnumPIDMap **ppIEnumPIDMap) = 0; - - }; - -#else /* C style interface */ - - typedef struct IEnumPIDMapVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IEnumPIDMap * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IEnumPIDMap * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IEnumPIDMap * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - IEnumPIDMap * This, - /* [in] */ ULONG cRequest, - /* [size_is][out][in] */ PID_MAP *pPIDMap, - /* [out] */ ULONG *pcReceived); - - HRESULT ( STDMETHODCALLTYPE *Skip )( - IEnumPIDMap * This, - /* [in] */ ULONG cRecords); - - HRESULT ( STDMETHODCALLTYPE *Reset )( - IEnumPIDMap * This); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IEnumPIDMap * This, - /* [out] */ IEnumPIDMap **ppIEnumPIDMap); - - END_INTERFACE - } IEnumPIDMapVtbl; - - interface IEnumPIDMap - { - CONST_VTBL struct IEnumPIDMapVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IEnumPIDMap_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IEnumPIDMap_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IEnumPIDMap_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IEnumPIDMap_Next(This,cRequest,pPIDMap,pcReceived) \ - (This)->lpVtbl -> Next(This,cRequest,pPIDMap,pcReceived) - -#define IEnumPIDMap_Skip(This,cRecords) \ - (This)->lpVtbl -> Skip(This,cRecords) - -#define IEnumPIDMap_Reset(This) \ - (This)->lpVtbl -> Reset(This) - -#define IEnumPIDMap_Clone(This,ppIEnumPIDMap) \ - (This)->lpVtbl -> Clone(This,ppIEnumPIDMap) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IEnumPIDMap_Next_Proxy( - IEnumPIDMap * This, - /* [in] */ ULONG cRequest, - /* [size_is][out][in] */ PID_MAP *pPIDMap, - /* [out] */ ULONG *pcReceived); - - -void __RPC_STUB IEnumPIDMap_Next_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumPIDMap_Skip_Proxy( - IEnumPIDMap * This, - /* [in] */ ULONG cRecords); - - -void __RPC_STUB IEnumPIDMap_Skip_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumPIDMap_Reset_Proxy( - IEnumPIDMap * This); - - -void __RPC_STUB IEnumPIDMap_Reset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumPIDMap_Clone_Proxy( - IEnumPIDMap * This, - /* [out] */ IEnumPIDMap **ppIEnumPIDMap); - - -void __RPC_STUB IEnumPIDMap_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IEnumPIDMap_INTERFACE_DEFINED__ */ - - -#ifndef __IMPEG2PIDMap_INTERFACE_DEFINED__ -#define __IMPEG2PIDMap_INTERFACE_DEFINED__ - -/* interface IMPEG2PIDMap */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IMPEG2PIDMap; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("afb6c2a1-2c41-11d3-8a60-0000f81e0e4a") - IMPEG2PIDMap : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE MapPID( - /* [in] */ ULONG culPID, - /* [in] */ ULONG *pulPID, - /* [in] */ MEDIA_SAMPLE_CONTENT MediaSampleContent) = 0; - - virtual HRESULT STDMETHODCALLTYPE UnmapPID( - /* [in] */ ULONG culPID, - /* [in] */ ULONG *pulPID) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnumPIDMap( - /* [out] */ IEnumPIDMap **pIEnumPIDMap) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMPEG2PIDMapVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMPEG2PIDMap * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMPEG2PIDMap * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMPEG2PIDMap * This); - - HRESULT ( STDMETHODCALLTYPE *MapPID )( - IMPEG2PIDMap * This, - /* [in] */ ULONG culPID, - /* [in] */ ULONG *pulPID, - /* [in] */ MEDIA_SAMPLE_CONTENT MediaSampleContent); - - HRESULT ( STDMETHODCALLTYPE *UnmapPID )( - IMPEG2PIDMap * This, - /* [in] */ ULONG culPID, - /* [in] */ ULONG *pulPID); - - HRESULT ( STDMETHODCALLTYPE *EnumPIDMap )( - IMPEG2PIDMap * This, - /* [out] */ IEnumPIDMap **pIEnumPIDMap); - - END_INTERFACE - } IMPEG2PIDMapVtbl; - - interface IMPEG2PIDMap - { - CONST_VTBL struct IMPEG2PIDMapVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMPEG2PIDMap_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMPEG2PIDMap_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMPEG2PIDMap_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMPEG2PIDMap_MapPID(This,culPID,pulPID,MediaSampleContent) \ - (This)->lpVtbl -> MapPID(This,culPID,pulPID,MediaSampleContent) - -#define IMPEG2PIDMap_UnmapPID(This,culPID,pulPID) \ - (This)->lpVtbl -> UnmapPID(This,culPID,pulPID) - -#define IMPEG2PIDMap_EnumPIDMap(This,pIEnumPIDMap) \ - (This)->lpVtbl -> EnumPIDMap(This,pIEnumPIDMap) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMPEG2PIDMap_MapPID_Proxy( - IMPEG2PIDMap * This, - /* [in] */ ULONG culPID, - /* [in] */ ULONG *pulPID, - /* [in] */ MEDIA_SAMPLE_CONTENT MediaSampleContent); - - -void __RPC_STUB IMPEG2PIDMap_MapPID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMPEG2PIDMap_UnmapPID_Proxy( - IMPEG2PIDMap * This, - /* [in] */ ULONG culPID, - /* [in] */ ULONG *pulPID); - - -void __RPC_STUB IMPEG2PIDMap_UnmapPID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMPEG2PIDMap_EnumPIDMap_Proxy( - IMPEG2PIDMap * This, - /* [out] */ IEnumPIDMap **pIEnumPIDMap); - - -void __RPC_STUB IMPEG2PIDMap_EnumPIDMap_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMPEG2PIDMap_INTERFACE_DEFINED__ */ - - -/* Additional Prototypes for ALL interfaces */ - -unsigned long __RPC_USER BSTR_UserSize( unsigned long *, unsigned long , BSTR * ); -unsigned char * __RPC_USER BSTR_UserMarshal( unsigned long *, unsigned char *, BSTR * ); -unsigned char * __RPC_USER BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); -void __RPC_USER BSTR_UserFree( unsigned long *, BSTR * ); - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/bdamedia.h b/import/DirectX8/include/bdamedia.h deleted file mode 100644 index eb988a96e..000000000 --- a/import/DirectX8/include/bdamedia.h +++ /dev/null @@ -1,2984 +0,0 @@ -//------------------------------------------------------------------------------ -// File: BDAMedia.h -// -// Desc: Broadcast Driver Architecture Multimedia Definitions. -// -// Copyright (c) 1996-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#if !defined(_KSMEDIA_) -#error KSMEDIA.H must be included before BDAMEDIA.H -#endif // !defined(_KSMEDIA_) - -#if !defined(_BDATYPES_) -#error BDATYPES.H must be included before BDAMEDIA.H -#endif // !defined(_BDATYPES_) - -#if !defined(_BDAMEDIA_) -#define _BDAMEDIA_ - -#if defined(__cplusplus) -extern "C" { -#endif // defined(__cplusplus) - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// Separate the updated Windows XP version of this header from the downlevel -// version that shipped with the DirectX 8.0 SDK. Since development -// on BDA technology continued for Windows XP, some changes were made to -// this file in order to improve the interface and functionality. -// -// To maintain compatibility with older applications which rely on the -// DirectX 8.0 versions of these files, the DirectX 8.1 version includes -// both the Windows XP content and the DirectX 8.0 content, which are -// separated by the #if (WINVER >= 0x501) preprocessor directive. -// -// Therefore, if you define WINVER to be 0x501 to specify Windows XP, -// the revised content will be compiled. Otherwise, the original -// DirectX 8.0 content will be used. -// -///////////////////////////////////////////////////////////////////////////// - -#if (WINVER >= 0x501) // Windows XP content - - -//=========================================================================== -// -// KSProperty Set Structure Definitions for BDA -// -//=========================================================================== - -typedef struct _KSP_BDA_NODE_PIN { - KSPROPERTY Property; - ULONG ulNodeType; - ULONG ulInputPinId; - ULONG ulOutputPinId; -} KSP_BDA_NODE_PIN, *PKSP_BDA_NODE_PIN; - - -typedef struct _KSM_BDA_PIN -{ - KSMETHOD Method; - union - { - ULONG PinId; - ULONG PinType; - }; - ULONG Reserved; -} KSM_BDA_PIN, * PKSM_BDA_PIN; - - -typedef struct _KSM_BDA_PIN_PAIR -{ - KSMETHOD Method; - union - { - ULONG InputPinId; - ULONG InputPinType; - }; - union - { - ULONG OutputPinId; - ULONG OutputPinType; - }; -} KSM_BDA_PIN_PAIR, * PKSM_BDA_PIN_PAIR; - - -typedef struct { - KSP_NODE Property; - ULONG EsPid; -} KSP_NODE_ESPID, *PKSP_NODE_ESPID; - - - -//=========================================================================== -// -// BDA Data Range definitions. Includes specifier definitions. -// -//=========================================================================== - -// Antenna Signal Formats -// - -typedef struct tagKS_DATARANGE_BDA_ANTENNA { - KSDATARANGE DataRange; - - // Antenna specifier can go here if required - // -} KS_DATARANGE_BDA_ANTENNA, *PKS_DATARANGE_BDA_ANTENNA; - - - -// Transport Formats -// - -typedef struct tagBDA_TRANSPORT_INFO { - ULONG ulcbPhyiscalPacket; // Size, in bytes, of a physical packet - // (e.g. Satellite link payload size. - ULONG ulcbPhyiscalFrame; // Size, in bytes, of each physical frame - // 0 indicates no HW requirement - ULONG ulcbPhyiscalFrameAlignment; // Capture buffer alignment in bytes - // 0 and 1 indicate no alignment requirements - REFERENCE_TIME AvgTimePerFrame; // Normal ActiveMovie units (100 nS) - -} BDA_TRANSPORT_INFO, *PBDA_TRANSPORT_INFO; - -typedef struct tagKS_DATARANGE_BDA_TRANSPORT { - KSDATARANGE DataRange; - BDA_TRANSPORT_INFO BdaTransportInfo; - - // Transport specifier can go here if required - // -} KS_DATARANGE_BDA_TRANSPORT, *PKS_DATARANGE_BDA_TRANSPORT; - - -//=========================================================================== -// BDA Event Guids -// -// These are sent by the IBroadcastEvent service on the graph. -// To receive, -// 0) Implement IBroadcastEvent in your receiving object - this has one Method on it: Fire() -// 1) QI the graphs service provider for SID_SBroadcastEventService -// for the IID_IBroadcastEvent object -// 2) OR create the event service (CLSID_BroadcastEventService) if not already there -// and register it -// 3) QI that object for it's IConnectionPoint interface (*pCP) -// 4) Advise your object on *pCP (e.g. pCP->Advise(static_cast(this), &dwCookie) -// 5) Unadvise when done.. -// 6) Implement IBroadcastEvent::Fire(GUID gEventID) -// Check for relevant event below and deal with it appropriatly... -//=========================================================================== - -// {9D7E6235-4B7D-425d-A6D1-D717C33B9C4C} -#define STATIC_EVENTID_TuningChanged \ - 0x9d7e6235, 0x4b7d, 0x425d, 0xa6, 0xd1, 0xd7, 0x17, 0xc3, 0x3b, 0x9c, 0x4c -DEFINE_GUIDSTRUCT("9D7E6235-4B7D-425d-A6D1-D717C33B9C4C", EVENTID_TuningChanged); -#define EVENTID_TuningChanged DEFINE_GUIDNAMED(EVENTID_TuningChanged) - -// {2A65C528-2249-4070-AC16-00390CDFB2DD} -#define STATIC_EVENTID_CADenialCountChanged \ - 0x2a65c528, 0x2249, 0x4070, 0xac, 0x16, 0x0, 0x39, 0xc, 0xdf, 0xb2, 0xdd -DEFINE_GUIDSTRUCT("2A65C528-2249-4070-AC16-00390CDFB2DD", EVENTID_CADenialCountChanged); -#define EVENTID_CADenialCountChanged DEFINE_GUIDNAMED(EVENTID_CADenialCountChanged) - -// {6D9CFAF2-702D-4b01-8DFF-6892AD20D191} -#define STATIC_EVENTID_SignalStatusChanged \ - 0x6d9cfaf2, 0x702d, 0x4b01, 0x8d, 0xff, 0x68, 0x92, 0xad, 0x20, 0xd1, 0x91 -DEFINE_GUIDSTRUCT("6D9CFAF2-702D-4b01-8DFF-6892AD20D191", EVENTID_SignalStatusChanged); -#define EVENTID_SignalStatusChanged DEFINE_GUIDNAMED(EVENTID_SignalStatusChanged) - - -//=========================================================================== -// -// BDA Stream Format GUIDs -// -//=========================================================================== - -#define STATIC_KSDATAFORMAT_TYPE_BDA_ANTENNA\ - 0x71985f41, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("71985F41-1CA1-11d3-9CC8-00C04F7971E0", KSDATAFORMAT_TYPE_BDA_ANTENNA); -#define KSDATAFORMAT_TYPE_BDA_ANTENNA DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_BDA_ANTENNA) - - -#define STATIC_KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT\ - 0xf4aeb342, 0x0329, 0x4fdd, 0xa8, 0xfd, 0x4a, 0xff, 0x49, 0x26, 0xc9, 0x78 -DEFINE_GUIDSTRUCT("F4AEB342-0329-4fdd-A8FD-4AFF4926C978", KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT); -#define KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT) - - -#define STATIC_KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT\ - 0x8deda6fd, 0xac5f, 0x4334, 0x8e, 0xcf, 0xa4, 0xba, 0x8f, 0xa7, 0xd0, 0xf0 -DEFINE_GUIDSTRUCT("8DEDA6FD-AC5F-4334-8ECF-A4BA8FA7D0F0", KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT); -#define KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT) - - -#define STATIC_KSDATAFORMAT_TYPE_BDA_IF_SIGNAL\ - 0x61be0b47, 0xa5eb, 0x499b, 0x9a, 0x85, 0x5b, 0x16, 0xc0, 0x7f, 0x12, 0x58 -DEFINE_GUIDSTRUCT("61BE0B47-A5EB-499b-9A85-5B16C07F1258", KSDATAFORMAT_TYPE_BDA_IF_SIGNAL); -#define KSDATAFORMAT_TYPE_BDA_IF_SIGNAL DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_BDA_IF_SIGNAL) - - -#define STATIC_KSDATAFORMAT_TYPE_MPEG2_SECTIONS\ - 0x455f176c, 0x4b06, 0x47ce, 0x9a, 0xef, 0x8c, 0xae, 0xf7, 0x3d, 0xf7, 0xb5 -DEFINE_GUIDSTRUCT("455F176C-4B06-47CE-9AEF-8CAEF73DF7B5", KSDATAFORMAT_TYPE_MPEG2_SECTIONS); -#define KSDATAFORMAT_TYPE_MPEG2_SECTIONS DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MPEG2_SECTIONS) - - -#define STATIC_KSDATAFORMAT_SUBTYPE_ATSC_SI\ - 0xb3c7397c, 0xd303, 0x414d, 0xb3, 0x3c, 0x4e, 0xd2, 0xc9, 0xd2, 0x97, 0x33 -DEFINE_GUIDSTRUCT("B3C7397C-D303-414D-B33C-4ED2C9D29733", KSDATAFORMAT_SUBTYPE_ATSC_SI); -#define KSDATAFORMAT_SUBTYPE_ATSC_SI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ATSC_SI) - - -#define STATIC_KSDATAFORMAT_SUBTYPE_DVB_SI\ - 0xe9dd31a3, 0x221d, 0x4adb, 0x85, 0x32, 0x9a, 0xf3, 0x9, 0xc1, 0xa4, 0x8 -DEFINE_GUIDSTRUCT("e9dd31a3-221d-4adb-8532-9af309c1a408", KSDATAFORMAT_SUBTYPE_DVB_SI); -#define KSDATAFORMAT_SUBTYPE_DVB_SI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DVB_SI) - - -#define STATIC_KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_PSIP\ - 0x762e3f66, 0x336f, 0x48d1, 0xbf, 0x83, 0x2b, 0x0, 0x35, 0x2c, 0x11, 0xf0 -DEFINE_GUIDSTRUCT("762E3F66-336F-48d1-BF83-2B00352C11F0", KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_PSIP); -#define KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_PSIP DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_PSIP) - -#define STATIC_KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_OOB_PSIP\ - 0x951727db, 0xd2ce, 0x4528, 0x96, 0xf6, 0x33, 0x1, 0xfa, 0xbb, 0x2d, 0xe0 -DEFINE_GUIDSTRUCT("951727DB-D2CE-4528-96F6-3301FABB2DE0", KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_OOB_PSIP); -#define KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_OOB_PSIP DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_OOB_PSIP) - -//=========================================================================== -// -// KSPinName Definitions for BDA -// -//=========================================================================== - -// Pin name for a BDA transport pin -// -// {78216A81-CFA8-493e-9711-36A61C08BD9D} -// -#define STATIC_PINNAME_BDA_TRANSPORT \ - 0x78216a81, 0xcfa8, 0x493e, 0x97, 0x11, 0x36, 0xa6, 0x1c, 0x8, 0xbd, 0x9d -DEFINE_GUIDSTRUCT("78216A81-CFA8-493e-9711-36A61C08BD9D", PINNAME_BDA_TRANSPORT); -#define PINNAME_BDA_TRANSPORT DEFINE_GUIDNAMED(PINNAME_BDA_TRANSPORT) - - -// Pin name for a BDA analog video pin -// -// {5C0C8281-5667-486c-8482-63E31F01A6E9} -// -#define STATIC_PINNAME_BDA_ANALOG_VIDEO \ - 0x5c0c8281, 0x5667, 0x486c, 0x84, 0x82, 0x63, 0xe3, 0x1f, 0x1, 0xa6, 0xe9 -DEFINE_GUIDSTRUCT("5C0C8281-5667-486c-8482-63E31F01A6E9", PINNAME_BDA_ANALOG_VIDEO); -#define PINNAME_BDA_ANALOG_VIDEO DEFINE_GUIDNAMED(PINNAME_BDA_ANALOG_VIDEO) - - -// Pin name for a BDA analog audio pin -// -// {D28A580A-9B1F-4b0c-9C33-9BF0A8EA636B} -// -#define STATIC_PINNAME_BDA_ANALOG_AUDIO \ - 0xd28a580a, 0x9b1f, 0x4b0c, 0x9c, 0x33, 0x9b, 0xf0, 0xa8, 0xea, 0x63, 0x6b -DEFINE_GUIDSTRUCT("D28A580A-9B1F-4b0c-9C33-9BF0A8EA636B", PINNAME_BDA_ANALOG_AUDIO); -#define PINNAME_BDA_ANALOG_AUDIO DEFINE_GUIDNAMED(PINNAME_BDA_ANALOG_AUDIO) - - -// Pin name for a BDA FM Radio pin -// -// {D2855FED-B2D3-4eeb-9BD0-193436A2F890} -// -#define STATIC_PINNAME_BDA_FM_RADIO \ - 0xd2855fed, 0xb2d3, 0x4eeb, 0x9b, 0xd0, 0x19, 0x34, 0x36, 0xa2, 0xf8, 0x90 -DEFINE_GUIDSTRUCT("D2855FED-B2D3-4eeb-9BD0-193436A2F890", PINNAME_BDA_FM_RADIO); -#define PINNAME_BDA_FM_RADIO DEFINE_GUIDNAMED(PINNAME_BDA_FM_RADIO) - - -// Pin name for a BDA Intermediate Frequency pin -// -// {1A9D4A42-F3CD-48a1-9AEA-71DE133CBE14} -// -#define STATIC_PINNAME_BDA_IF_PIN \ - 0x1a9d4a42, 0xf3cd, 0x48a1, 0x9a, 0xea, 0x71, 0xde, 0x13, 0x3c, 0xbe, 0x14 -DEFINE_GUIDSTRUCT("1A9D4A42-F3CD-48a1-9AEA-71DE133CBE14", PINNAME_BDA_IF_PIN); -#define PINNAME_BDA_IF_PIN DEFINE_GUIDNAMED(PINNAME_BDA_IF_PIN) - - -// Pin name for a BDA Open Cable PSIP pin -// -// {297BB104-E5C9-4ACE-B123-95C3CBB24D4F} -// -#define STATIC_PINNAME_BDA_OPENCABLE_PSIP_PIN \ - 0x297bb104, 0xe5c9, 0x4ace, 0xb1, 0x23, 0x95, 0xc3, 0xcb, 0xb2, 0x4d, 0x4f -DEFINE_GUIDSTRUCT("297BB104-E5C9-4ACE-B123-95C3CBB24D4F", PINNAME_BDA_OPENCABLE_PSIP_PIN); -#define PINNAME_BDA_OPENCABLE_PSIP_PIN DEFINE_GUIDNAMED(PINNAME_BDA_OPENCABLE_PSIP_PIN) - - -//=========================================================================== -// -// KSProperty Set Definitions for BDA -// -//=========================================================================== - - -//------------------------------------------------------------ -// -// BDA Network Ethernet Filter Property Set -// -// {71985F43-1CA1-11d3-9CC8-00C04F7971E0} -// -#define STATIC_KSPROPSETID_BdaEthernetFilter \ - 0x71985f43, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("71985F43-1CA1-11d3-9CC8-00C04F7971E0", KSPROPSETID_BdaEthernetFilter); -#define KSPROPSETID_BdaEthernetFilter DEFINE_GUIDNAMED(KSPROPSETID_BdaEthernetFilter) - -typedef enum { - KSPROPERTY_BDA_ETHERNET_FILTER_MULTICAST_LIST_SIZE = 0, - KSPROPERTY_BDA_ETHERNET_FILTER_MULTICAST_LIST, - KSPROPERTY_BDA_ETHERNET_FILTER_MULTICAST_MODE -} KSPROPERTY_BDA_ETHERNET_FILTER; - -#define DEFINE_KSPROPERTY_ITEM_BDA_ETHERNET_FILTER_MULTICAST_LIST_SIZE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_ETHERNET_FILTER_MULTICAST_LIST_SIZE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(ULONG),\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_ETHERNET_FILTER_MULTICAST_LIST(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_ETHERNET_FILTER_MULTICAST_LIST,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(BDA_ETHERNET_ADDRESS_LIST),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_ETHERNET_FILTER_MULTICAST_MODE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_ETHERNET_FILTER_MULTICAST_MODE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(BDA_MULTICAST_MODE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - -//------------------------------------------------------------ -// -// BDA Network IPv4 Filter Property Set -// -// {71985F44-1CA1-11d3-9CC8-00C04F7971E0} -// -#define STATIC_KSPROPSETID_BdaIPv4Filter \ - 0x71985f44, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("71985F44-1CA1-11d3-9CC8-00C04F7971E0", KSPROPSETID_BdaIPv4Filter); -#define KSPROPSETID_BdaIPv4Filter DEFINE_GUIDNAMED(KSPROPSETID_BdaIPv4Filter) - -typedef enum { - KSPROPERTY_BDA_IPv4_FILTER_MULTICAST_LIST_SIZE = 0, - KSPROPERTY_BDA_IPv4_FILTER_MULTICAST_LIST, - KSPROPERTY_BDA_IPv4_FILTER_MULTICAST_MODE -} KSPROPERTY_BDA_IPv4_FILTER; - -#define DEFINE_KSPROPERTY_ITEM_BDA_IPv4_FILTER_MULTICAST_LIST_SIZE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_IPv4_FILTER_MULTICAST_LIST_SIZE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(ULONG),\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_IPv4_FILTER_MULTICAST_LIST(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_IPv4_FILTER_MULTICAST_LIST,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(BDA_IPv4_ADDRESS_LIST),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_IPv4_FILTER_MULTICAST_MODE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_IPv4_FILTER_MULTICAST_MODE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(BDA_MULTICAST_MODE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - -//------------------------------------------------------------ -// -// BDA Network IPv6 Filter Property Set -// -// {E1785A74-2A23-4fb3-9245-A8F88017EF33} -// -#define STATIC_KSPROPSETID_BdaIPv6Filter \ - 0xe1785a74, 0x2a23, 0x4fb3, 0x92, 0x45, 0xa8, 0xf8, 0x80, 0x17, 0xef, 0x33 -DEFINE_GUIDSTRUCT("E1785A74-2A23-4fb3-9245-A8F88017EF33", KSPROPSETID_BdaIPv6Filter); -#define KSPROPSETID_BdaIPv6Filter DEFINE_GUIDNAMED(KSPROPSETID_BdaIPv6Filter) - -typedef enum { - KSPROPERTY_BDA_IPv6_FILTER_MULTICAST_LIST_SIZE = 0, - KSPROPERTY_BDA_IPv6_FILTER_MULTICAST_LIST, - KSPROPERTY_BDA_IPv6_FILTER_MULTICAST_MODE -} KSPROPERTY_BDA_IPv6_FILTER; - -#define DEFINE_KSPROPERTY_ITEM_BDA_IPv6_FILTER_MULTICAST_LIST_SIZE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_IPv6_FILTER_MULTICAST_LIST_SIZE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(ULONG),\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_IPv6_FILTER_MULTICAST_LIST(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_IPv6_FILTER_MULTICAST_LIST,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(BDA_IPv6_ADDRESS_LIST),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_IPv6_FILTER_MULTICAST_MODE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_IPv6_FILTER_MULTICAST_MODE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(BDA_MULTICAST_MODE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - -//------------------------------------------------------------ -// -// -// BDA Signal Statistics Property Set -// -// Used to get signal statistics from a control node or a pin. -// Set NodeId == -1 to get properties from the pin. -// -// {1347D106-CF3A-428a-A5CB-AC0D9A2A4338} -// -#define STATIC_KSPROPSETID_BdaSignalStats \ - 0x1347d106, 0xcf3a, 0x428a, 0xa5, 0xcb, 0xac, 0xd, 0x9a, 0x2a, 0x43, 0x38 -DEFINE_GUIDSTRUCT("1347D106-CF3A-428a-A5CB-AC0D9A2A4338", KSPROPSETID_BdaSignalStats); -#define KSPROPSETID_BdaSignalStats DEFINE_GUIDNAMED(KSPROPSETID_BdaSignalStats) - -typedef enum { - KSPROPERTY_BDA_SIGNAL_STRENGTH = 0, - KSPROPERTY_BDA_SIGNAL_QUALITY, - KSPROPERTY_BDA_SIGNAL_PRESENT, - KSPROPERTY_BDA_SIGNAL_LOCKED, - KSPROPERTY_BDA_SAMPLE_TIME -} KSPROPERTY_BDA_SIGNAL_STATS; - -// OPTIONAL -// Carrier strength in mDb (1/1000 of a DB). -// -// A strength of 0 is nominal strength as expected for the given -// type of broadcast network. -// -// Sub-nominal strengths are reported as positive mDb -// -// Super-nominal strengths are reported as negative mDb -// -#define DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_STRENGTH(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_SIGNAL_STRENGTH,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(LONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -// OPTIONAL -// Amount of data successfully extracted from the signal as a percent. -// -// Signal Quality is usually reported by the demodulation node and is -// a representation of how much of the original data could be extracted -// from the signal. -// -// In the case of Analog Signals, this percentage can be -// computed by examining the timing of HSync and VSync as will as by -// looking at information contained in HBlanking and VBlanking intervals. -// -// In the case of Digital Signals, this percentage can be -// computed by examining packet CRCs and FEC confidence values. -// -// 100 percent is ideal. -// 95 percent shows very little (almost unnoticable) artifacts when rendered. -// 90 percent contains few enough artifacts as to be easily viewable. -// 80 percent is the minimum level to be viewable. -// 60 percent is the minimum level to expect data services -// (including EPG) to work. -// 20 percent indicates that the demodulator knows that a properly modulated -// signal exists but can't produce enough data to be useful. -// -#define DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_QUALITY(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_SIGNAL_QUALITY,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(LONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -// REQUIRED -// True if a signal carrier is present. -// -// Should be returned by the RF tuner node. -// -#define DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_PRESENT(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_SIGNAL_PRESENT,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BOOL),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -// REQUIRED -// True if the signal can be locked. -// -// Ususally represents PLL lock when returned by the RF Tuner Node. -// -// Represents Signal Quality of at least 20% when returned by the -// demodulator node. -// -#define DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_LOCKED(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_SIGNAL_LOCKED,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BOOL),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -// OPTIONAL -// Indicates the sample time overwhich signal level and quality are -// averaged. -// -// Each time a signal statistics property is requested, the node should -// report the average value for the last n milliseconds where n is the -// value set by this property. If no value is set or if the driver does -// not support this property, the driver should default to -// 100 millisecond sample times. -// -// The driver may report values for the most recently completed sample -// period. -// -#define DEFINE_KSPROPERTY_ITEM_BDA_SAMPLE_TIME(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_SAMPLE_TIME,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(LONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - -//------------------------------------------------------------ -// -// -// BDA Change Sync Method Set -// -// {FD0A5AF3-B41D-11d2-9C95-00C04F7971E0} -// -#define STATIC_KSMETHODSETID_BdaChangeSync \ - 0xfd0a5af3, 0xb41d, 0x11d2, 0x9c, 0x95, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("FD0A5AF3-B41D-11d2-9C95-00C04F7971E0", KSMETHODSETID_BdaChangeSync); -#define KSMETHODSETID_BdaChangeSync DEFINE_GUIDNAMED(KSMETHODSETID_BdaChangeSync) - -typedef enum { - KSMETHOD_BDA_START_CHANGES = 0, - KSMETHOD_BDA_CHECK_CHANGES, - KSMETHOD_BDA_COMMIT_CHANGES, - KSMETHOD_BDA_GET_CHANGE_STATE -} KSMETHOD_BDA_CHANGE_SYNC; - -#define DEFINE_KSMETHOD_ITEM_BDA_START_CHANGES(MethodHandler, SupportHandler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_BDA_START_CHANGES,\ - KSMETHOD_TYPE_NONE,\ - (MethodHandler),\ - sizeof(KSMETHOD),\ - 0,\ - SupportHandler) - -#define DEFINE_KSMETHOD_ITEM_BDA_CHECK_CHANGES(MethodHandler, SupportHandler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_BDA_CHECK_CHANGES,\ - KSMETHOD_TYPE_NONE,\ - (MethodHandler),\ - sizeof(KSMETHOD),\ - 0,\ - SupportHandler) - -#define DEFINE_KSMETHOD_ITEM_BDA_COMMIT_CHANGES(MethodHandler, SupportHandler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_BDA_COMMIT_CHANGES,\ - KSMETHOD_TYPE_NONE,\ - (MethodHandler),\ - sizeof(KSMETHOD),\ - 0,\ - SupportHandler) - -#define DEFINE_KSMETHOD_ITEM_BDA_GET_CHANGE_STATE(MethodHandler, SupportHandler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_BDA_GET_CHANGE_STATE,\ - KSMETHOD_TYPE_READ,\ - (MethodHandler),\ - sizeof(KSMETHOD),\ - 0,\ - SupportHandler) - - - -//------------------------------------------------------------ -// -// -// BDA Device Configuration Method Set -// -// {71985F45-1CA1-11d3-9CC8-00C04F7971E0} -// -#define STATIC_KSMETHODSETID_BdaDeviceConfiguration \ - 0x71985f45, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("71985F45-1CA1-11d3-9CC8-00C04F7971E0", KSMETHODSETID_BdaDeviceConfiguration); -#define KSMETHODSETID_BdaDeviceConfiguration DEFINE_GUIDNAMED(KSMETHODSETID_BdaDeviceConfiguration) - -typedef enum { - KSMETHOD_BDA_CREATE_PIN_FACTORY = 0, - KSMETHOD_BDA_DELETE_PIN_FACTORY, - KSMETHOD_BDA_CREATE_TOPOLOGY -} KSMETHOD_BDA_DEVICE_CONFIGURATION; - -#define DEFINE_KSMETHOD_ITEM_BDA_CREATE_PIN_FACTORY(MethodHandler, SupportHandler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_BDA_CREATE_PIN_FACTORY,\ - KSMETHOD_TYPE_READ,\ - (MethodHandler),\ - sizeof(KSM_BDA_PIN),\ - sizeof(ULONG),\ - SupportHandler) - -#define DEFINE_KSMETHOD_ITEM_BDA_DELETE_PIN_FACTORY(MethodHandler, SupportHandler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_BDA_DELETE_PIN_FACTORY,\ - KSMETHOD_TYPE_NONE,\ - (MethodHandler),\ - sizeof(KSM_BDA_PIN),\ - 0,\ - SupportHandler) - -#define DEFINE_KSMETHOD_ITEM_BDA_CREATE_TOPOLOGY(MethodHandler, SupportHandler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_BDA_CREATE_TOPOLOGY,\ - KSMETHOD_TYPE_WRITE,\ - (MethodHandler),\ - sizeof(KSM_BDA_PIN_PAIR),\ - 0,\ - SupportHandler) - - - -//------------------------------------------------------------ -// -// -// BDA Topology Property Set -// -// {A14EE835-0A23-11d3-9CC7-00C04F7971E0} -// -#define STATIC_KSPROPSETID_BdaTopology \ - 0xa14ee835, 0x0a23, 0x11d3, 0x9c, 0xc7, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("A14EE835-0A23-11d3-9CC7-00C04F7971E0", KSPROPSETID_BdaTopology); -#define KSPROPSETID_BdaTopology DEFINE_GUIDNAMED(KSPROPSETID_BdaTopology) - -typedef enum { - KSPROPERTY_BDA_NODE_TYPES, - KSPROPERTY_BDA_PIN_TYPES, - KSPROPERTY_BDA_TEMPLATE_CONNECTIONS, - KSPROPERTY_BDA_NODE_METHODS, - KSPROPERTY_BDA_NODE_PROPERTIES, - KSPROPERTY_BDA_NODE_EVENTS, - KSPROPERTY_BDA_CONTROLLING_PIN_ID, - KSPROPERTY_BDA_NODE_DESCRIPTORS - }KSPROPERTY_BDA_TOPOLOGY; - -#define DEFINE_KSPROPERTY_ITEM_BDA_NODE_TYPES(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_NODE_TYPES,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - 0,\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_PIN_TYPES(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_PIN_TYPES,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - 0,\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_TEMPLATE_CONNECTIONS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_TEMPLATE_CONNECTIONS,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof( BDA_TEMPLATE_CONNECTION),\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_NODE_METHODS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_NODE_METHODS,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - 0,\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_NODE_PROPERTIES(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_NODE_PROPERTIES,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - 0,\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_NODE_EVENTS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_NODE_EVENTS,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - 0,\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_CONTROLLING_PIN_ID(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_CONTROLLING_PIN_ID,\ - (GetHandler),\ - sizeof(KSP_BDA_NODE_PIN),\ - sizeof( ULONG),\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_NODE_DESCRIPTORS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_NODE_DESCRIPTORS,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - 0,\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - - - -//------------------------------------------------------------ -// -// -// BDA Pin Control Property Set -// -// {0DED49D5-A8B7-4d5d-97A1-12B0C195874D} -// -#define STATIC_KSPROPSETID_BdaPinControl \ - 0xded49d5, 0xa8b7, 0x4d5d, 0x97, 0xa1, 0x12, 0xb0, 0xc1, 0x95, 0x87, 0x4d -DEFINE_GUIDSTRUCT("0DED49D5-A8B7-4d5d-97A1-12B0C195874D", KSPROPSETID_BdaPinControl); -#define KSPROPSETID_BdaPinControl DEFINE_GUIDNAMED(KSPROPSETID_BdaPinControl) - -typedef enum { - KSPROPERTY_BDA_PIN_ID = 0, - KSPROPERTY_BDA_PIN_TYPE -} KSPROPERTY_BDA_PIN_CONTROL; - -#define DEFINE_KSPROPERTY_ITEM_BDA_PIN_ID(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_PIN_ID,\ - (GetHandler),\ - sizeof( KSPROPERTY),\ - sizeof( ULONG),\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_PIN_TYPE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_PIN_TYPE,\ - (GetHandler),\ - sizeof( KSPROPERTY),\ - sizeof( ULONG),\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - - - -//------------------------------------------------------------ -// -// -// BDA Pin Event Set -// -// {104781CD-50BD-40d5-95FB-087E0E86A591} -// -#define STATIC_KSEVENTSETID_BdaPinEvent \ - 0x104781cd, 0x50bd, 0x40d5, 0x95, 0xfb, 0x08, 0x7e, 0xe, 0x86, 0xa5, 0x91 -DEFINE_GUIDSTRUCT("104781CD-50BD-40d5-95FB-087E0E86A591", KSEVENTSETID_BdaPinEvent); -#define KSEVENTSETID_BdaPinEvent DEFINE_GUIDNAMED(KSEVENTSETID_BdaPinEvent) - -typedef enum { - KSEVENT_BDA_PIN_CONNECTED = 0, - KSEVENT_BDA_PIN_DISCONNECTED -} KSPROPERTY_BDA_PIN_EVENT; - -#define DEFINE_KSEVENT_ITEM_BDA_PIN_CONNECTED(AddHandler, RemoveHandler, SupportHandler)\ - DEFINE_KSEVENT_ITEM(\ - KSEVENT_BDA_PIN_CONNECTED,\ - sizeof( KSEVENTDATA), \ - 0, \ - (AddHandler),\ - (RemoveHandler),\ - (SupportHandler)\ - ) - -#define DEFINE_KSEVENT_ITEM_BDA_PIN_DISCONNECTED(AddHandler, RemoveHandler, SupportHandler)\ - DEFINE_KSEVENT_ITEM(\ - KSEVENT_BDA_PIN_DISCONNECTED,\ - sizeof( KSEVENTDATA), \ - 0, \ - (AddHandler),\ - (RemoveHandler),\ - (SupportHandler)\ - ) - - - -//------------------------------------------------------------ -// -// -// BDA Void Transform Property Set -// -// {71985F46-1CA1-11d3-9CC8-00C04F7971E0} -// -#define STATIC_KSPROPSETID_BdaVoidTransform \ - 0x71985f46, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("71985F46-1CA1-11d3-9CC8-00C04F7971E0", KSPROPSETID_BdaVoidTransform); -#define KSPROPSETID_BdaVoidTransform DEFINE_GUIDNAMED(KSPROPSETID_BdaVoidTransform) - -typedef enum { - KSPROPERTY_BDA_VOID_TRANSFORM_START = 0, - KSPROPERTY_BDA_VOID_TRANSFORM_STOP -} KSPROPERTY_BDA_VOID_TRANSFORM; - -#define DEFINE_KSPROPERTY_ITEM_BDA_VOID_TRANSFORM_START(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_VOID_TRANSFORM_START,\ - FALSE,\ - sizeof(KSPROPERTY),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_VOID_TRANSFORM_STOP(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_VOID_TRANSFORM_STOP,\ - FALSE,\ - sizeof(KSPROPERTY),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - -//------------------------------------------------------------ -// -// -// BDA Null Transform Property Set -// -// {DDF15B0D-BD25-11d2-9CA0-00C04F7971E0} -// -#define STATIC_KSPROPSETID_BdaNullTransform \ - 0xddf15b0d, 0xbd25, 0x11d2, 0x9c, 0xa0, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("DDF15B0D-BD25-11d2-9CA0-00C04F7971E0", KSPROPSETID_BdaNullTransform); -#define KSPROPSETID_BdaNullTransform DEFINE_GUIDNAMED(KSPROPSETID_BdaNullTransform) - -typedef enum { - KSPROPERTY_BDA_NULL_TRANSFORM_START = 0, - KSPROPERTY_BDA_NULL_TRANSFORM_STOP -} KSPROPERTY_BDA_NULL_TRANSFORM; - -#define DEFINE_KSPROPERTY_ITEM_BDA_NULL_TRANSFORM_START(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_NULL_TRANSFORM_START,\ - FALSE,\ - sizeof(KSPROPERTY),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_NULL_TRANSFORM_STOP(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_NULL_TRANSFORM_STOP,\ - FALSE,\ - sizeof(KSPROPERTY),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - -//------------------------------------------------------------ -// -// -// BDA Frequency Filter Property Set -// -// {71985F47-1CA1-11d3-9CC8-00C04F7971E0} -// -#define STATIC_KSPROPSETID_BdaFrequencyFilter \ - 0x71985f47, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("71985F47-1CA1-11d3-9CC8-00C04F7971E0", KSPROPSETID_BdaFrequencyFilter); -#define KSPROPSETID_BdaFrequencyFilter DEFINE_GUIDNAMED(KSPROPSETID_BdaFrequencyFilter) - -typedef enum { - KSPROPERTY_BDA_RF_TUNER_FREQUENCY = 0, - KSPROPERTY_BDA_RF_TUNER_POLARITY, - KSPROPERTY_BDA_RF_TUNER_RANGE, - KSPROPERTY_BDA_RF_TUNER_TRANSPONDER, - KSPROPERTY_BDA_RF_TUNER_BANDWIDTH, - KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER -} KSPROPERTY_BDA_FREQUENCY_FILTER; - -#define DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_FREQUENCY(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_RF_TUNER_FREQUENCY,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_POLARITY(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_RF_TUNER_POLARITY,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_RANGE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_RF_TUNER_RANGE,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_TRANSPONDER(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_RF_TUNER_TRANSPONDER,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_BANDWIDTH(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_RF_TUNER_BANDWIDTH,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_FREQUENCY_MULTIPLIER(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - -//------------------------------------------------------------ -// -// -// BDA LNB Info Property Set -// -// {992CF102-49F9-4719-A664-C4F23E2408F4} -// -#define STATIC_KSPROPSETID_BdaLNBInfo \ - 0x992cf102, 0x49f9, 0x4719, 0xa6, 0x64, 0xc4, 0xf2, 0x3e, 0x24, 0x8, 0xf4 -DEFINE_GUIDSTRUCT("992CF102-49F9-4719-A664-C4F23E2408F4", KSPROPSETID_BdaLNBInfo); -#define KSPROPSETID_BdaLNBInfo DEFINE_GUIDNAMED(KSPROPSETID_BdaLNBInfo) - -typedef enum { - KSPROPERTY_BDA_LNB_LOF_LOW_BAND = 0, - KSPROPERTY_BDA_LNB_LOF_HIGH_BAND, - KSPROPERTY_BDA_LNB_SWITCH_FREQUENCY -} KSPROPERTY_BDA_LNB_INFO; - -#define DEFINE_KSPROPERTY_ITEM_BDA_LNB_LOF_LOW_BAND(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_LNB_LOF_LOW_BAND,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_LNB_LOF_HIGH_BAND(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_LNB_LOF_HIGH_BAND,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_LNB_SWITCH_FREQUENCY(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_LNB_SWITCH_FREQUENCY,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - -//------------------------------------------------------------ -// -// -// BDA Digital Demodulator Property Set -// -// {EF30F379-985B-4d10-B640-A79D5E04E1E0} -// -#define STATIC_KSPROPSETID_BdaDigitalDemodulator \ - 0xef30f379, 0x985b, 0x4d10, 0xb6, 0x40, 0xa7, 0x9d, 0x5e, 0x4, 0xe1, 0xe0 -DEFINE_GUIDSTRUCT("EF30F379-985B-4d10-B640-A79D5E04E1E0", KSPROPSETID_BdaDigitalDemodulator); -#define KSPROPSETID_BdaDigitalDemodulator DEFINE_GUIDNAMED(KSPROPSETID_BdaDigitalDemodulator) - -typedef enum { - KSPROPERTY_BDA_MODULATION_TYPE = 0, - KSPROPERTY_BDA_INNER_FEC_TYPE, - KSPROPERTY_BDA_INNER_FEC_RATE, - KSPROPERTY_BDA_OUTER_FEC_TYPE, - KSPROPERTY_BDA_OUTER_FEC_RATE, - KSPROPERTY_BDA_SYMBOL_RATE, - KSPROPERTY_BDA_SPECTRAL_INVERSION, - KSPROPERTY_BDA_GUARD_INTERVAL, - KSPROPERTY_BDA_TRANSMISSION_MODE -} KSPROPERTY_BDA_DIGITAL_DEMODULATOR; - -#define DEFINE_KSPROPERTY_ITEM_BDA_MODULATION_TYPE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_MODULATION_TYPE,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ModulationType),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_INNER_FEC_TYPE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_INNER_FEC_TYPE,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(FECMethod),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_INNER_FEC_RATE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_INNER_FEC_RATE,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BinaryConvolutionCodeRate),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_OUTER_FEC_TYPE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_OUTER_FEC_TYPE,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(FECMethod),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_OUTER_FEC_RATE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_OUTER_FEC_RATE,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BinaryConvolutionCodeRate),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_SYMBOL_RATE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_SYMBOL_RATE,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_SPECTRAL_INVERSION(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_SPECTRAL_INVERSION,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(SpectralInversion),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_GUARD_INTERVAL(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_GUARD_INTERVAL,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(GuardInterval),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_TRANSMISSION_MODE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_TRANSMISSION_MODE,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(TransmissionMode),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - -//------------------------------------------------------------ -// -// -// BDA Autodemodulate Property Set -// -// {DDF15B12-BD25-11d2-9CA0-00C04F7971E0} -// -#define STATIC_KSPROPSETID_BdaAutodemodulate \ - 0xddf15b12, 0xbd25, 0x11d2, 0x9c, 0xa0, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("DDF15B12-BD25-11d2-9CA0-00C04F7971E0", KSPROPSETID_BdaAutodemodulate); -#define KSPROPSETID_BdaAutodemodulate DEFINE_GUIDNAMED(KSPROPSETID_BdaAutodemodulate) - -typedef enum { - KSPROPERTY_BDA_AUTODEMODULATE_START = 0, - KSPROPERTY_BDA_AUTODEMODULATE_STOP -} KSPROPERTY_BDA_AUTODEMODULATE; - -#define DEFINE_KSPROPERTY_ITEM_BDA_AUTODEMODULATE_START(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_AUTODEMODULATE_START,\ - FALSE,\ - sizeof(KSP_NODE),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_AUTODEMODULATE_STOP(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_AUTODEMODULATE_STOP,\ - FALSE,\ - sizeof(KSP_NODE),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -//------------------------------------------------------------ -// -// -// BDA Table Section Property Set -// -// {516B99C5-971C-4aaf-B3F3-D9FDA8A15E16} -// - -#define STATIC_KSPROPSETID_BdaTableSection \ - 0x516b99c5, 0x971c, 0x4aaf, 0xb3, 0xf3, 0xd9, 0xfd, 0xa8, 0xa1, 0x5e, 0x16 -DEFINE_GUIDSTRUCT("516B99C5-971C-4aaf-B3F3-D9FDA8A15E16", KSPROPSETID_BdaTableSection); -#define KSPROPSETID_BdaTableSection DEFINE_GUIDNAMED(KSPROPSETID_BdaTableSection) - -typedef enum { - KSPROPERTY_BDA_TABLE_SECTION = 0, -} KSPROPERTY_IDS_BDA_TABLE; - -#define DEFINE_KSPROPERTY_ITEM_BDA_TABLE_SECTION(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_TABLE_SECTION,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BDA_TABLE_SECTION),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - -//------------------------------------------------------------ -// -// -// BDA PID Filter Property Set -// -// {D0A67D65-08DF-4fec-8533-E5B550410B85} -// -#define STATIC_KSPROPSETID_BdaPIDFilter \ - 0xd0a67d65, 0x8df, 0x4fec, 0x85, 0x33, 0xe5, 0xb5, 0x50, 0x41, 0xb, 0x85 -DEFINE_GUIDSTRUCT("D0A67D65-08DF-4fec-8533-E5B550410B85", KSPROPSETID_BdaPIDFilter); -#define KSPROPSETID_BdaPIDFilter DEFINE_GUIDNAMED(KSPROPSETID_BdaPIDFilter) - -typedef enum { - KSPROPERTY_BDA_PIDFILTER_MAP_PIDS = 0, - KSPROPERTY_BDA_PIDFILTER_UNMAP_PIDS, - KSPROPERTY_BDA_PIDFILTER_LIST_PIDS -} KSPROPERTY_BDA_PIDFILTER; - -#define DEFINE_KSPROPERTY_ITEM_BDA_PIDFILTER_MAP_PIDS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_PIDFILTER_MAP_PIDS,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BDA_PID_MAP),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_PIDFILTER_UNMAP_PIDS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_PIDFILTER_UNMAP_PIDS,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BDA_PID_UNMAP),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_PIDFILTER_LIST_PIDS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_PIDFILTER_LIST_PIDS,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - -//------------------------------------------------------------ -// -// -// BDA CA Property Set -// -// {B0693766-5278-4ec6-B9E1-3CE40560EF5A} -// -#define STATIC_KSPROPSETID_BdaCA \ - 0xb0693766, 0x5278, 0x4ec6, 0xb9, 0xe1, 0x3c, 0xe4, 0x5, 0x60, 0xef, 0x5a -DEFINE_GUIDSTRUCT("B0693766-5278-4ec6-B9E1-3CE40560EF5A", KSPROPSETID_BdaCA); -#define KSPROPSETID_BdaCA DEFINE_GUIDNAMED(KSPROPSETID_BdaCA) - -typedef enum { - KSPROPERTY_BDA_ECM_MAP_STATUS = 0, - KSPROPERTY_BDA_CA_MODULE_STATUS, - KSPROPERTY_BDA_CA_SMART_CARD_STATUS, - KSPROPERTY_BDA_CA_MODULE_UI, - KSPROPERTY_BDA_CA_SET_PROGRAM_PIDS, - KSPROPERTY_BDA_CA_REMOVE_PROGRAM -} KSPROPERTY_BDA_CA; - -#define DEFINE_KSPROPERTY_ITEM_BDA_ECM_MAP_STATUS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_ECM_MAP_STATUS,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_CA_MODULE_STATUS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_CA_MODULE_STATUS,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_CA_SMART_CARD_STATUS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_CA_SMART_CARD_STATUS,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_CA_MODULE_UI(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_CA_MODULE_UI,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BDA_CA_MODULE_UI),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_CA_SET_PROGRAM_PIDS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_CA_SET_PROGRAM_PIDS,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BDA_PROGRAM_PID_LIST),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_BDA_CA_REMOVE_PROGRAM(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_CA_REMOVE_PROGRAM,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - -//------------------------------------------------------------ -// -// -// BDA CA Event Set -// -// {488C4CCC-B768-4129-8EB1-B00A071F9068} -// -#define STATIC_KSEVENTSETID_BdaCAEvent \ - 0x488c4ccc, 0xb768, 0x4129, 0x8e, 0xb1, 0xb0, 0xa, 0x7, 0x1f, 0x90, 0x68 -DEFINE_GUIDSTRUCT("488C4CCC-B768-4129-8EB1-B00A071F9068", KSEVENTSETID_BdaCAEvent); -#define KSEVENTSETID_BdaCAEvent DEFINE_GUIDNAMED(KSEVENTSETID_BdaCAEvent) - -typedef enum { - KSEVENT_BDA_PROGRAM_FLOW_STATUS_CHANGED = 0, - KSEVENT_BDA_CA_MODULE_STATUS_CHANGED, - KSEVENT_BDA_CA_SMART_CARD_STATUS_CHANGED, - KSEVENT_BDA_CA_MODULE_UI_REQUESTED -} KSPROPERTY_BDA_CA_EVENT; - -#define DEFINE_KSEVENT_BDA_PROGRAM_FLOW_STATUS_CHANGED(AddHandler, RemoveHandler, SupportHandler)\ - DEFINE_KSEVENT_ITEM(\ - KSEVENT_BDA_PROGRAM_FLOW_STATUS_CHANGED,\ - sizeof( KSEVENTDATA), \ - 0, \ - (AddHandler),\ - (RemoveHandler),\ - (SupportHandler)\ - ) - -#define DEFINE_KSEVENT_BDA_CA_MODULE_STATUS_CHANGED(AddHandler, RemoveHandler, SupportHandler)\ - DEFINE_KSEVENT_ITEM(\ - KSEVENT_BDA_CA_MODULE_STATUS_CHANGED,\ - sizeof( KSEVENTDATA), \ - 0, \ - (AddHandler),\ - (RemoveHandler),\ - (SupportHandler)\ - ) - -#define DEFINE_KSEVENT_BDA_CA_SMART_CARD_STATUS_CHANGED(AddHandler, RemoveHandler, SupportHandler)\ - DEFINE_KSEVENT_ITEM(\ - KSEVENT_BDA_CA_SMART_CARD_STATUS_CHANGED,\ - sizeof( KSEVENTDATA), \ - 0, \ - (AddHandler),\ - (RemoveHandler),\ - (SupportHandler)\ - ) - -#define DEFINE_KSEVENT_BDA_CA_MODULE_UI_REQUESTED(AddHandler, RemoveHandler, SupportHandler)\ - DEFINE_KSEVENT_ITEM(\ - KSEVENT_BDA_CA_MODULE_UI_REQUESTED,\ - sizeof( KSEVENTDATA), \ - 0, \ - (AddHandler),\ - (RemoveHandler),\ - (SupportHandler)\ - ) - - -//=========================================================================== -// -// BDA Filter Categories -// -//=========================================================================== - -#define STATIC_KSCATEGORY_BDA_RECEIVER_COMPONENT \ - 0xFD0A5AF4, 0xB41D, 0x11d2, 0x9c, 0x95, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("FD0A5AF4-B41D-11d2-9C95-00C04F7971E0", KSCATEGORY_BDA_RECEIVER_COMPONENT); -#define KSCATEGORY_BDA_RECEIVER_COMPONENT DEFINE_GUIDNAMED(KSCATEGORY_BDA_RECEIVER_COMPONENT) - - -#define STATIC_KSCATEGORY_BDA_NETWORK_TUNER \ - 0x71985f48, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("71985F48-1CA1-11d3-9CC8-00C04F7971E0", KSCATEGORY_BDA_NETWORK_TUNER); -#define KSCATEGORY_BDA_NETWORK_TUNER DEFINE_GUIDNAMED(KSCATEGORY_BDA_NETWORK_TUNER) - - -#define STATIC_KSCATEGORY_BDA_NETWORK_EPG \ - 0x71985f49, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("71985F49-1CA1-11d3-9CC8-00C04F7971E0", KSCATEGORY_BDA_NETWORK_EPG); -#define KSCATEGORY_BDA_NETWORK_EPG DEFINE_GUIDNAMED(KSCATEGORY_BDA_NETWORK_EPG) - - -#define STATIC_KSCATEGORY_BDA_IP_SINK \ - 0x71985f4aL, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x00, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("71985F4A-1CA1-11d3-9CC8-00C04F7971E0", KSCATEGORY_BDA_IP_SINK); -#define KSCATEGORY_IP_SINK DEFINE_GUIDNAMED(KSCATEGORY_BDA_IP_SINK) - - -#define STATIC_KSCATEGORY_BDA_NETWORK_PROVIDER \ - 0x71985f4b, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("71985F4B-1CA1-11d3-9CC8-00C04F7971E0", KSCATEGORY_BDA_NETWORK_PROVIDER); -#define KSCATEGORY_BDA_NETWORK_PROVIDER DEFINE_GUIDNAMED(KSCATEGORY_BDA_NETWORK_PROVIDER) - -// {A2E3074F-6C3D-11d3-B653-00C04F79498E} -#define STATIC_KSCATEGORY_BDA_TRANSPORT_INFORMATION \ - 0xa2e3074f, 0x6c3d, 0x11d3, 0xb6, 0x53, 0x0, 0xc0, 0x4f, 0x79, 0x49, 0x8e -DEFINE_GUIDSTRUCT("A2E3074F-6C3D-11d3-B653-00C04F79498E", KSCATEGORY_BDA_TRANSPORT_INFORMATION); -#define KSCATEGORY_BDA_TRANSPORT_INFORMATION DEFINE_GUIDNAMED(KSCATEGORY_BDA_TRANSPORT_INFORMATION) - - -//=========================================================================== -// -// BDA Node Categories -// -//=========================================================================== - - -#define STATIC_KSNODE_BDA_RF_TUNER \ - 0x71985f4c, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("71985F4C-1CA1-11d3-9CC8-00C04F7971E0", KSNODE_BDA_RF_TUNER); -#define KSNODE_BDA_RF_TUNER DEFINE_GUIDNAMED(KSNODE_BDA_RF_TUNER) - - -#define STATIC_KSNODE_BDA_QAM_DEMODULATOR \ - 0x71985f4d, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("71985F4D-1CA1-11d3-9CC8-00C04F7971E0", KSNODE_BDA_QAM_DEMODULATOR); -#define KSNODE_BDA_QAM_DEMODULATOR DEFINE_GUIDNAMED(KSNODE_BDA_QAM_DEMODULATOR) - - -#define STATIC_KSNODE_BDA_QPSK_DEMODULATOR \ - 0x6390c905, 0x27c1, 0x4d67, 0xbd, 0xb7, 0x77, 0xc5, 0xd, 0x7, 0x93, 0x0 -DEFINE_GUIDSTRUCT("6390C905-27C1-4d67-BDB7-77C50D079300", KSNODE_BDA_QPSK_DEMODULATOR); -#define KSNODE_BDA_QPSK_DEMODULATOR DEFINE_GUIDNAMED(KSNODE_BDA_QPSK_DEMODULATOR) - - -#define STATIC_KSNODE_BDA_8VSB_DEMODULATOR \ - 0x71985f4f, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("71985F4F-1CA1-11d3-9CC8-00C04F7971E0", KSNODE_BDA_8VSB_DEMODULATOR); -#define KSNODE_BDA_8VSB_DEMODULATOR DEFINE_GUIDNAMED(KSNODE_BDA_8VSB_DEMODULATOR) - - -#define STATIC_KSNODE_BDA_COFDM_DEMODULATOR \ - 0x2dac6e05, 0xedbe, 0x4b9c, 0xb3, 0x87, 0x1b, 0x6f, 0xad, 0x7d, 0x64, 0x95 -DEFINE_GUIDSTRUCT("2DAC6E05-EDBE-4b9c-B387-1B6FAD7D6495", KSNODE_BDA_COFDM_DEMODULATOR); -#define KSNODE_BDA_COFDM_DEMODULATOR DEFINE_GUIDNAMED(KSNODE_BDA_COFDM_DEMODULATOR) - - -#define STATIC_KSNODE_BDA_OPENCABLE_POD \ - 0xd83ef8fc, 0xf3b8, 0x45ab, 0x8b, 0x71, 0xec, 0xf7, 0xc3, 0x39, 0xde, 0xb4 -DEFINE_GUIDSTRUCT("D83EF8FC-F3B8-45ab-8B71-ECF7C339DEB4", KSNODE_BDA_OPENCABLE_POD); -#define KSNODE_BDA_OPENCABLE_POD DEFINE_GUIDNAMED(KSNODE_BDA_OPENCABLE_POD) - - -#define STATIC_KSNODE_BDA_COMMON_CA_POD \ - 0xd83ef8fc, 0xf3b8, 0x45ab, 0x8b, 0x71, 0xec, 0xf7, 0xc3, 0x39, 0xde, 0xb4 -DEFINE_GUIDSTRUCT("D83EF8FC-F3B8-45ab-8B71-ECF7C339DEB4", KSNODE_BDA_COMMON_CA_POD); -#define KSNODE_BDA_COMMON_CA_POD DEFINE_GUIDNAMED(KSNODE_BDA_COMMON_CA_POD) - - -#define STATIC_KSNODE_BDA_PID_FILTER \ - 0xf5412789, 0xb0a0, 0x44e1, 0xae, 0x4f, 0xee, 0x99, 0x9b, 0x1b, 0x7f, 0xbe -DEFINE_GUIDSTRUCT("F5412789-B0A0-44e1-AE4F-EE999B1B7FBE", KSNODE_BDA_PID_FILTER); -#define KSNODE_BDA_PID_FILTER DEFINE_GUIDNAMED(KSNODE_BDA_PID_FILTER) - - -#define STATIC_KSNODE_BDA_IP_SINK \ - 0x71985f4e, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 -DEFINE_GUIDSTRUCT("71985F4E-1CA1-11d3-9CC8-00C04F7971E0", KSNODE_BDA_IP_SINK); -#define KSNODE_IP_SINK DEFINE_GUIDNAMED(KSNODE_BDA_IP_SINK) - - -//=========================================================================== -// -// IPSink PINNAME GUID -// -//=========================================================================== - -#define STATIC_PINNAME_IPSINK_INPUT \ - 0x3fdffa70L, 0xac9a, 0x11d2, 0x8f, 0x17, 0x00, 0xc0, 0x4f, 0x79, 0x71, 0xe2 -DEFINE_GUIDSTRUCT("3fdffa70-ac9a-11d2-8f17-00c04f7971e2", PINNAME_IPSINK_INPUT); -#define PINNAME_IPSINK_INPUT DEFINE_GUIDNAMED(PINNAME_IPSINK_INPUT) - - -//=========================================================================== -// -// BDA IPSink Categories/Types -// -//=========================================================================== - - -#define STATIC_KSDATAFORMAT_TYPE_BDA_IP\ - 0xe25f7b8e, 0xcccc, 0x11d2, 0x8f, 0x25, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe2 -DEFINE_GUIDSTRUCT("e25f7b8e-cccc-11d2-8f25-00c04f7971e2", KSDATAFORMAT_TYPE_BDA_IP); -#define KSDATAFORMAT_TYPE_BDA_IP DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_BDA_IP) - -#define STATIC_KSDATAFORMAT_SUBTYPE_BDA_IP\ - 0x5a9a213c, 0xdb08, 0x11d2, 0x8f, 0x32, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe2 -DEFINE_GUIDSTRUCT("5a9a213c-db08-11d2-8f32-00c04f7971e2", KSDATAFORMAT_SUBTYPE_BDA_IP); -#define KSDATAFORMAT_SUBTYPE_BDA_IP DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_BDA_IP) - -#define STATIC_KSDATAFORMAT_SPECIFIER_BDA_IP\ - 0x6b891420, 0xdb09, 0x11d2, 0x8f, 0x32, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe2 -DEFINE_GUIDSTRUCT("6B891420-DB09-11d2-8F32-00C04F7971E2", KSDATAFORMAT_SPECIFIER_BDA_IP); -#define KSDATAFORMAT_SPECIFIER_BDA_IP DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_BDA_IP) - - - -#define STATIC_KSDATAFORMAT_TYPE_BDA_IP_CONTROL\ - 0xdadd5799, 0x7d5b, 0x4b63, 0x80, 0xfb, 0xd1, 0x44, 0x2f, 0x26, 0xb6, 0x21 -DEFINE_GUIDSTRUCT("DADD5799-7D5B-4b63-80FB-D1442F26B621", KSDATAFORMAT_TYPE_BDA_IP_CONTROL); -#define KSDATAFORMAT_TYPE_BDA_IP_CONTROL DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_BDA_IP_CONTROL) - -#define STATIC_KSDATAFORMAT_SUBTYPE_BDA_IP_CONTROL\ - 0x499856e8, 0xe85b, 0x48ed, 0x9b, 0xea, 0x41, 0xd, 0xd, 0xd4, 0xef, 0x81 -DEFINE_GUIDSTRUCT("499856E8-E85B-48ed-9BEA-410D0DD4EF81", KSDATAFORMAT_SUBTYPE_BDA_IP_CONTROL); -#define KSDATAFORMAT_SUBTYPE_BDA_IP_CONTROL DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_BDA_IP_CONTROL) - - -//=========================================================================== -// -// MPE PINNAME GUID -// -//=========================================================================== - -#define STATIC_PINNAME_MPE \ - 0xc1b06d73L, 0x1dbb, 0x11d3, 0x8f, 0x46, 0x00, 0xC0, 0x4f, 0x79, 0x71, 0xE2 -DEFINE_GUIDSTRUCT("C1B06D73-1DBB-11d3-8F46-00C04F7971E2", PINNAME_MPE); -#define PINNAME_MPE DEFINE_GUIDNAMED(PINNAME_MPE) - - -///////////////////////////////////////////////////////////// -// -// BDA MPE Categories/Types -// -#define STATIC_KSDATAFORMAT_TYPE_MPE \ - 0x455f176c, 0x4b06, 0x47ce, 0x9a, 0xef, 0x8c, 0xae, 0xf7, 0x3d, 0xf7, 0xb5 -DEFINE_GUIDSTRUCT("455F176C-4B06-47ce-9AEF-8CAEF73DF7B5", KSDATAFORMAT_TYPE_MPE); -#define KSDATAFORMAT_TYPE_MPE DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MPE) - - -#if defined(__cplusplus) -} -#endif // defined(__cplusplus) - - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// The following is the original contents of this header from -// the DirectX 8.0 SDK. -// -///////////////////////////////////////////////////////////////////////////// - -#else // DirectX 8.0 content - - - //=========================================================================== - // - // KSProperty Set Structure Definitions for BDA - // - //=========================================================================== - - typedef struct _KSP_BDA_NODE_PIN { - KSPROPERTY Property; - ULONG ulNodeType; - ULONG ulInputPinId; - ULONG ulOutputPinId; - } KSP_BDA_NODE_PIN, *PKSP_BDA_NODE_PIN; - - - typedef struct { - KSP_NODE Property; - ULONG EsPid; - } KSP_NODE_ESPID, *PKSP_NODE_ESPID; - - - - //=========================================================================== - // - // BDA Data Range definitions. Includes specifier definitions. - // - //=========================================================================== - - // Antenna Signal Formats - // - - typedef struct tagKS_DATARANGE_BDA_ANTENNA { - KSDATARANGE DataRange; - - // Antenna specifier can go here if required - // - } KS_DATARANGE_BDA_ANTENNA, *PKS_DATARANGE_BDA_ANTENNA; - - - - // Transport Formats - // - - typedef struct tagBDA_TRANSPORT_INFO { - ULONG ulcbPhyiscalPacket; // Size, in bytes, of a physical packet - // (e.g. Satellite link payload size. - ULONG ulcbPhyiscalFrame; // Size, in bytes, of each physical frame - // 0 indicates no HW requirement - ULONG ulcbPhyiscalFrameAlignment; // Capture buffer alignment in bytes - // 0 and 1 indicate no alignment requirements - REFERENCE_TIME AvgTimePerFrame; // Normal ActiveMovie units (100 nS) - - } BDA_TRANSPORT_INFO, *PBDA_TRANSPORT_INFO; - - typedef struct tagKS_DATARANGE_BDA_TRANSPORT { - KSDATARANGE DataRange; - BDA_TRANSPORT_INFO BdaTransportInfo; - - // Transport specifier can go here if required - // - } KS_DATARANGE_BDA_TRANSPORT, *PKS_DATARANGE_BDA_TRANSPORT; - - - - //=========================================================================== - // - // BDA Stream Format GUIDs - // - //=========================================================================== - - #define STATIC_KSDATAFORMAT_TYPE_BDA_ANTENNA\ - 0x71985f41, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("71985F41-1CA1-11d3-9CC8-00C04F7971E0", KSDATAFORMAT_TYPE_BDA_ANTENNA); - #define KSDATAFORMAT_TYPE_BDA_ANTENNA DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_BDA_ANTENNA) - - - #define STATIC_KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT\ - 0xf4aeb342, 0x0329, 0x4fdd, 0xa8, 0xfd, 0x4a, 0xff, 0x49, 0x26, 0xc9, 0x78 - DEFINE_GUIDSTRUCT("F4AEB342-0329-4fdd-A8FD-4AFF4926C978", KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT); - #define KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT) - - - #define STATIC_KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT\ - 0x8deda6fd, 0xac5f, 0x4334, 0x8e, 0xcf, 0xa4, 0xba, 0x8f, 0xa7, 0xd0, 0xf0 - DEFINE_GUIDSTRUCT("8DEDA6FD-AC5F-4334-8ECF-A4BA8FA7D0F0", KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT); - #define KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT) - - - #define STATIC_KSDATAFORMAT_TYPE_BDA_IF_SIGNAL\ - 0x61be0b47, 0xa5eb, 0x499b, 0x9a, 0x85, 0x5b, 0x16, 0xc0, 0x7f, 0x12, 0x58 - DEFINE_GUIDSTRUCT("61BE0B47-A5EB-499b-9A85-5B16C07F1258", KSDATAFORMAT_TYPE_BDA_IF_SIGNAL); - #define KSDATAFORMAT_TYPE_BDA_IF_SIGNAL DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_BDA_IF_SIGNAL) - - - #define STATIC_KSDATAFORMAT_TYPE_MPEG2_SECTIONS\ - 0x455f176c, 0x4b06, 0x47ce, 0x9a, 0xef, 0x8c, 0xae, 0xf7, 0x3d, 0xf7, 0xb5 - DEFINE_GUIDSTRUCT("455F176C-4B06-47CE-9AEF-8CAEF73DF7B5", KSDATAFORMAT_TYPE_MPEG2_SECTIONS); - #define KSDATAFORMAT_TYPE_MPEG2_SECTIONS DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MPEG2_SECTIONS) - - - #define STATIC_KSDATAFORMAT_SUBTYPE_ATSC_SI\ - 0xb3c7397c, 0xd303, 0x414d, 0xb3, 0x3c, 0x4e, 0xd2, 0xc9, 0xd2, 0x97, 0x33 - DEFINE_GUIDSTRUCT("B3C7397C-D303-414D-B33C-4ED2C9D29733", KSDATAFORMAT_SUBTYPE_ATSC_SI); - #define KSDATAFORMAT_SUBTYPE_SUBTYPE_ATSC_SI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ATSC_SI) - - - #define STATIC_KSDATAFORMAT_SUBTYPE_DVB_SI\ - 0xe9dd31a3, 0x221d, 0x4adb, 0x85, 0x32, 0x9a, 0xf3, 0x9, 0xc1, 0xa4, 0x8 - DEFINE_GUIDSTRUCT("e9dd31a3-221d-4adb-8532-9af309c1a408", KSDATAFORMAT_SUBTYPE_DVB_SI); - #define KSDATAFORMAT_SUBTYPE_SUBTYPE_DVB_SI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DVB_SI) - - - #define STATIC_KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_PSIP\ - 0x762e3f66, 0x336f, 0x48d1, 0xbf, 0x83, 0x2b, 0x0, 0x35, 0x2c, 0x11, 0xf0 - DEFINE_GUIDSTRUCT("762E3F66-336F-48d1-BF83-2B00352C11F0", KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_PSIP); - #define KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_PSIP DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_PSIP) - - #define STATIC_KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_OOB_PSIP\ - 0x951727db, 0xd2ce, 0x4528, 0x96, 0xf6, 0x33, 0x1, 0xfa, 0xbb, 0x2d, 0xe0 - DEFINE_GUIDSTRUCT("951727DB-D2CE-4528-96F6-3301FABB2DE0", KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_OOB_PSIP); - #define KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_OOB_PSIP DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_OOB_PSIP) - - //=========================================================================== - // - // KSPinName Definitions for BDA - // - //=========================================================================== - - // Pin name for a BDA transport pin - // - // {78216A81-CFA8-493e-9711-36A61C08BD9D} - // - #define STATIC_PINNAME_BDA_TRANSPORT \ - 0x78216a81, 0xcfa8, 0x493e, 0x97, 0x11, 0x36, 0xa6, 0x1c, 0x8, 0xbd, 0x9d - DEFINE_GUIDSTRUCT("78216A81-CFA8-493e-9711-36A61C08BD9D", PINNAME_BDA_TRANSPORT); - #define PINNAME_BDA_TRANSPORT DEFINE_GUIDNAMED(PINNAME_BDA_TRANSPORT) - - - // Pin name for a BDA analog video pin - // - // {5C0C8281-5667-486c-8482-63E31F01A6E9} - // - #define STATIC_PINNAME_BDA_ANALOG_VIDEO \ - 0x5c0c8281, 0x5667, 0x486c, 0x84, 0x82, 0x63, 0xe3, 0x1f, 0x1, 0xa6, 0xe9 - DEFINE_GUIDSTRUCT("5C0C8281-5667-486c-8482-63E31F01A6E9", PINNAME_BDA_ANALOG_VIDEO); - #define PINNAME_BDA_ANALOG_VIDEO DEFINE_GUIDNAMED(PINNAME_BDA_ANALOG_VIDEO) - - - // Pin name for a BDA analog audio pin - // - // {D28A580A-9B1F-4b0c-9C33-9BF0A8EA636B} - // - #define STATIC_PINNAME_BDA_ANALOG_AUDIO \ - 0xd28a580a, 0x9b1f, 0x4b0c, 0x9c, 0x33, 0x9b, 0xf0, 0xa8, 0xea, 0x63, 0x6b - DEFINE_GUIDSTRUCT("D28A580A-9B1F-4b0c-9C33-9BF0A8EA636B", PINNAME_BDA_ANALOG_AUDIO); - #define PINNAME_BDA_ANALOG_AUDIO DEFINE_GUIDNAMED(PINNAME_BDA_ANALOG_AUDIO) - - - // Pin name for a BDA FM Radio pin - // - // {D2855FED-B2D3-4eeb-9BD0-193436A2F890} - // - #define STATIC_PINNAME_BDA_FM_RADIO \ - 0xd2855fed, 0xb2d3, 0x4eeb, 0x9b, 0xd0, 0x19, 0x34, 0x36, 0xa2, 0xf8, 0x90 - DEFINE_GUIDSTRUCT("D2855FED-B2D3-4eeb-9BD0-193436A2F890", PINNAME_BDA_FM_RADIO); - #define PINNAME_BDA_FM_RADIO DEFINE_GUIDNAMED(PINNAME_BDA_FM_RADIO) - - - // Pin name for a BDA Intermediate Frequency pin - // - // {1A9D4A42-F3CD-48a1-9AEA-71DE133CBE14} - // - #define STATIC_PINNAME_BDA_IF_PIN \ - 0x1a9d4a42, 0xf3cd, 0x48a1, 0x9a, 0xea, 0x71, 0xde, 0x13, 0x3c, 0xbe, 0x14 - DEFINE_GUIDSTRUCT("1A9D4A42-F3CD-48a1-9AEA-71DE133CBE14", PINNAME_BDA_IF_PIN); - #define PINNAME_BDA_IF_PIN DEFINE_GUIDNAMED(PINNAME_BDA_IF_PIN) - - - // Pin name for a BDA Open Cable PSIP pin - // - // {297BB104-E5C9-4ACE-B123-95C3CBB24D4F} - // - #define STATIC_PINNAME_BDA_OPENCABLE_PSIP_PIN \ - 0x297bb104, 0xe5c9, 0x4ace, 0xb1, 0x23, 0x95, 0xc3, 0xcb, 0xb2, 0x4d, 0x4f - DEFINE_GUIDSTRUCT("297BB104-E5C9-4ACE-B123-95C3CBB24D4F", PINNAME_BDA_OPENCABLE_PSIP_PIN); - #define PINNAME_BDA_OPENCABLE_PSIP_PIN DEFINE_GUIDNAMED(PINNAME_BDA_OPENCABLE_PSIP_PIN) - - - //=========================================================================== - // - // KSProperty Set Definitions for BDA - // - //=========================================================================== - - - //------------------------------------------------------------ - // - // BDA Network Ethernet Filter Property Set - // - // {71985F43-1CA1-11d3-9CC8-00C04F7971E0} - // - #define STATIC_KSPROPSETID_BdaEthernetFilter \ - 0x71985f43, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("71985F43-1CA1-11d3-9CC8-00C04F7971E0", KSPROPSETID_BdaEthernetFilter); - #define KSPROPSETID_BdaEthernetFilter DEFINE_GUIDNAMED(KSPROPSETID_BdaEthernetFilter) - - typedef enum { - KSPROPERTY_BDA_ETHERNET_FILTER_MULTICAST_LIST_SIZE = 0, - KSPROPERTY_BDA_ETHERNET_FILTER_MULTICAST_LIST, - KSPROPERTY_BDA_ETHERNET_FILTER_MULTICAST_MODE - } KSPROPERTY_BDA_ETHERNET_FILTER; - - #define DEFINE_KSPROPERTY_ITEM_BDA_ETHERNET_FILTER_MULTICAST_LIST_SIZE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_ETHERNET_FILTER_MULTICAST_LIST_SIZE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(ULONG),\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_ETHERNET_FILTER_MULTICAST_LIST(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_ETHERNET_FILTER_MULTICAST_LIST,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(BDA_ETHERNET_ADDRESS_LIST),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_ETHERNET_FILTER_MULTICAST_MODE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_ETHERNET_FILTER_MULTICAST_MODE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(BDA_MULTICAST_MODE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - - //------------------------------------------------------------ - // - // BDA Network IPv4 Filter Property Set - // - // {71985F44-1CA1-11d3-9CC8-00C04F7971E0} - // - #define STATIC_KSPROPSETID_BdaIPv4Filter \ - 0x71985f44, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("71985F44-1CA1-11d3-9CC8-00C04F7971E0", KSPROPSETID_BdaIPv4Filter); - #define KSPROPSETID_BdaIPv4Filter DEFINE_GUIDNAMED(KSPROPSETID_BdaIPv4Filter) - - typedef enum { - KSPROPERTY_BDA_IPv4_FILTER_MULTICAST_LIST_SIZE = 0, - KSPROPERTY_BDA_IPv4_FILTER_MULTICAST_LIST, - KSPROPERTY_BDA_IPv4_FILTER_MULTICAST_MODE - } KSPROPERTY_BDA_IPv4_FILTER; - - #define DEFINE_KSPROPERTY_ITEM_BDA_IPv4_FILTER_MULTICAST_LIST_SIZE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_IPv4_FILTER_MULTICAST_LIST_SIZE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(ULONG),\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_IPv4_FILTER_MULTICAST_LIST(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_IPv4_FILTER_MULTICAST_LIST,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(BDA_IPv4_ADDRESS_LIST),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_IPv4_FILTER_MULTICAST_MODE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_IPv4_FILTER_MULTICAST_MODE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(BDA_MULTICAST_MODE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - - //------------------------------------------------------------ - // - // BDA Network IPv6 Filter Property Set - // - // {E1785A74-2A23-4fb3-9245-A8F88017EF33} - // - #define STATIC_KSPROPSETID_BdaIPv6Filter \ - 0xe1785a74, 0x2a23, 0x4fb3, 0x92, 0x45, 0xa8, 0xf8, 0x80, 0x17, 0xef, 0x33 - DEFINE_GUIDSTRUCT("E1785A74-2A23-4fb3-9245-A8F88017EF33", KSPROPSETID_BdaIPv6Filter); - #define KSPROPSETID_BdaIPv6Filter DEFINE_GUIDNAMED(KSPROPSETID_BdaIPv6Filter) - - typedef enum { - KSPROPERTY_BDA_IPv6_FILTER_MULTICAST_LIST_SIZE = 0, - KSPROPERTY_BDA_IPv6_FILTER_MULTICAST_LIST, - KSPROPERTY_BDA_IPv6_FILTER_MULTICAST_MODE - } KSPROPERTY_BDA_IPv6_FILTER; - - #define DEFINE_KSPROPERTY_ITEM_BDA_IPv6_FILTER_MULTICAST_LIST_SIZE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_IPv6_FILTER_MULTICAST_LIST_SIZE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(ULONG),\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_IPv6_FILTER_MULTICAST_LIST(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_IPv6_FILTER_MULTICAST_LIST,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(BDA_IPv6_ADDRESS_LIST),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_IPv6_FILTER_MULTICAST_MODE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_IPv6_FILTER_MULTICAST_MODE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(BDA_MULTICAST_MODE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - - //------------------------------------------------------------ - // - // - // BDA Signal Property Set - // - // {D2F1644B-B409-11d2-BC69-00A0C9EE9E16} - // - #define STATIC_KSPROPSETID_BdaSignal \ - 0xd2f1644b, 0xb409, 0x11d2, 0xbc, 0x69, 0x0, 0xa0, 0xc9, 0xee, 0x9e, 0x16 - DEFINE_GUIDSTRUCT("D2F1644B-B409-11d2-BC69-00A0C9EE9E16", KSPROPSETID_BdaSignal); - #define KSPROPSETID_BdaSignal DEFINE_GUIDNAMED(KSPROPSETID_BdaSignal) - - typedef enum { - KSPROPERTY_BDA_SIGNAL_SOURCE = 0, - KSPROPERTY_BDA_SIGNAL_TUNING_SPACE, - KSPROPERTY_BDA_SIGNAL_NETWORK_TYPE, - KSPROPERTY_BDA_SIGNAL_STATE - } KSPROPERTY_BDA_SIGNAL; - - #define DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_SOURCE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_SIGNAL_SOURCE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_TUNING_SPACE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_SIGNAL_TUNING_SPACE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(GUID),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_NETWORK_TYPE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_SIGNAL_NETWORK_TYPE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(GUID),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_STATE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_SIGNAL_STATE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(BDA_SIGNAL_STATE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - - //------------------------------------------------------------ - // - // - // BDA Change Sync Method Set - // - // {FD0A5AF3-B41D-11d2-9C95-00C04F7971E0} - // - #define STATIC_KSMETHODSETID_BdaChangeSync \ - 0xfd0a5af3, 0xb41d, 0x11d2, 0x9c, 0x95, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("FD0A5AF3-B41D-11d2-9C95-00C04F7971E0", KSMETHODSETID_BdaChangeSync); - #define KSMETHODSETID_BdaChangeSync DEFINE_GUIDNAMED(KSMETHODSETID_BdaChangeSync) - - typedef enum { - KSMETHOD_BDA_START_CHANGES = 0, - KSMETHOD_BDA_CHECK_CHANGES, - KSMETHOD_BDA_COMMIT_CHANGES, - KSMETHOD_BDA_GET_CHANGE_STATE - } KSMETHOD_BDA_CHANGE_SYNC; - - #define DEFINE_KSMETHOD_ITEM_BDA_START_CHANGES(MethodHandler, SupportHandler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_BDA_START_CHANGES,\ - KSMETHOD_TYPE_NONE,\ - (MethodHandler),\ - sizeof(KSMETHOD),\ - 0,\ - SupportHandler) - - #define DEFINE_KSMETHOD_ITEM_BDA_CHECK_CHANGES(MethodHandler, SupportHandler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_BDA_CHECK_CHANGES,\ - KSMETHOD_TYPE_NONE,\ - (MethodHandler),\ - sizeof(KSMETHOD),\ - 0,\ - SupportHandler) - - #define DEFINE_KSMETHOD_ITEM_BDA_COMMIT_CHANGES(MethodHandler, SupportHandler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_BDA_COMMIT_CHANGES,\ - KSMETHOD_TYPE_NONE,\ - (MethodHandler),\ - sizeof(KSMETHOD),\ - 0,\ - SupportHandler) - - #define DEFINE_KSMETHOD_ITEM_BDA_GET_CHANGE_STATE(MethodHandler, SupportHandler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_BDA_GET_CHANGE_STATE,\ - KSMETHOD_TYPE_READ,\ - (MethodHandler),\ - sizeof(KSMETHOD),\ - 0,\ - SupportHandler) - - - - //------------------------------------------------------------ - // - // - // BDA Device Configuration Method Set - // - // {71985F45-1CA1-11d3-9CC8-00C04F7971E0} - // - #define STATIC_KSMETHODSETID_BdaDeviceConfiguration \ - 0x71985f45, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("71985F45-1CA1-11d3-9CC8-00C04F7971E0", KSMETHODSETID_BdaDeviceConfiguration); - #define KSMETHODSETID_BdaDeviceConfiguration DEFINE_GUIDNAMED(KSMETHODSETID_BdaDeviceConfiguration) - - typedef enum { - KSMETHOD_BDA_CREATE_PIN_FACTORY = 0, - KSMETHOD_BDA_DELETE_PIN_FACTORY, - KSMETHOD_BDA_CREATE_TOPOLOGY - } KSMETHOD_BDA_DEVICE_CONFIGURATION; - - #define DEFINE_KSMETHOD_ITEM_BDA_CREATE_PIN_FACTORY(MethodHandler, SupportHandler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_BDA_CREATE_PIN_FACTORY,\ - KSMETHOD_TYPE_READ,\ - (MethodHandler),\ - sizeof(KSM_PIN),\ - sizeof(ULONG),\ - SupportHandler) - - #define DEFINE_KSMETHOD_ITEM_BDA_DELETE_PIN_FACTORY(MethodHandler, SupportHandler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_BDA_DELETE_PIN_FACTORY,\ - KSMETHOD_TYPE_NONE,\ - (MethodHandler),\ - sizeof(KSM_PIN),\ - 0,\ - SupportHandler) - - #define DEFINE_KSMETHOD_ITEM_BDA_CREATE_TOPOLOGY(MethodHandler, SupportHandler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_BDA_CREATE_TOPOLOGY,\ - KSMETHOD_TYPE_WRITE,\ - (MethodHandler),\ - sizeof(KSMETHOD),\ - sizeof(KSMULTIPLE_ITEM),\ - SupportHandler) - - - - //------------------------------------------------------------ - // - // - // BDA Topology Property Set - // - // {A14EE835-0A23-11d3-9CC7-00C04F7971E0} - // - #define STATIC_KSPROPSETID_BdaTopology \ - 0xa14ee835, 0x0a23, 0x11d3, 0x9c, 0xc7, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("A14EE835-0A23-11d3-9CC7-00C04F7971E0", KSPROPSETID_BdaTopology); - #define KSPROPSETID_BdaTopology DEFINE_GUIDNAMED(KSPROPSETID_BdaTopology) - - typedef enum { - KSPROPERTY_BDA_NODE_TYPES, - KSPROPERTY_BDA_PIN_TYPES, - KSPROPERTY_BDA_TEMPLATE_CONNECTIONS, - KSPROPERTY_BDA_NODE_METHODS, - KSPROPERTY_BDA_NODE_PROPERTIES, - KSPROPERTY_BDA_NODE_EVENTS, - KSPROPERTY_BDA_CONTROLLING_PIN_ID, - KSPROPERTY_BDA_NODE_DESCRIPTORS - }KSPROPERTY_BDA_TOPOLOGY; - - #define DEFINE_KSPROPERTY_ITEM_BDA_NODE_TYPES(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_NODE_TYPES,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - 0,\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_PIN_TYPES(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_PIN_TYPES,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - 0,\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_TEMPLATE_CONNECTIONS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_TEMPLATE_CONNECTIONS,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof( BDA_TEMPLATE_CONNECTION),\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_NODE_METHODS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_NODE_METHODS,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - 0,\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_NODE_PROPERTIES(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_NODE_PROPERTIES,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - 0,\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_NODE_EVENTS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_NODE_EVENTS,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - 0,\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_CONTROLLING_PIN_ID(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_CONTROLLING_PIN_ID,\ - (GetHandler),\ - sizeof(KSP_BDA_NODE_PIN),\ - sizeof( ULONG),\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_NODE_DESCRIPTORS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_NODE_DESCRIPTORS,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - 0,\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - - - - //------------------------------------------------------------ - // - // - // BDA Pin Control Property Set - // - // {0DED49D5-A8B7-4d5d-97A1-12B0C195874D} - // - #define STATIC_KSPROPSETID_BdaPinControl \ - 0xded49d5, 0xa8b7, 0x4d5d, 0x97, 0xa1, 0x12, 0xb0, 0xc1, 0x95, 0x87, 0x4d - DEFINE_GUIDSTRUCT("0DED49D5-A8B7-4d5d-97A1-12B0C195874D", KSPROPSETID_BdaPinControl); - #define KSPROPSETID_BdaPinControl DEFINE_GUIDNAMED(KSPROPSETID_BdaPinControl) - - typedef enum { - KSPROPERTY_BDA_PIN_ID = 0, - KSPROPERTY_BDA_PIN_TYPE - } KSPROPERTY_BDA_PIN_CONTROL; - - #define DEFINE_KSPROPERTY_ITEM_BDA_PIN_ID(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_PIN_ID,\ - (GetHandler),\ - sizeof( KSPROPERTY),\ - sizeof( ULONG),\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_PIN_TYPE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_PIN_TYPE,\ - (GetHandler),\ - sizeof( KSPROPERTY),\ - sizeof( ULONG),\ - FALSE,\ - NULL, 0, NULL, NULL, 0) - - - - //------------------------------------------------------------ - // - // - // BDA Pin Event Set - // - // {104781CD-50BD-40d5-95FB-087E0E86A591} - // - #define STATIC_KSEVENTSETID_BdaPinEvent \ - 0x104781cd, 0x50bd, 0x40d5, 0x95, 0xfb, 0x08, 0x7e, 0xe, 0x86, 0xa5, 0x91 - DEFINE_GUIDSTRUCT("104781CD-50BD-40d5-95FB-087E0E86A591", KSEVENTSETID_BdaPinEvent); - #define KSEVENTSETID_BdaPinEvent DEFINE_GUIDNAMED(KSEVENTSETID_BdaPinEvent) - - typedef enum { - KSEVENT_BDA_PIN_CONNECTED = 0, - KSEVENT_BDA_PIN_DISCONNECTED - } KSPROPERTY_BDA_PIN_EVENT; - - #define DEFINE_KSEVENT_ITEM_BDA_PIN_CONNECTED(AddHandler, RemoveHandler, SupportHandler)\ - DEFINE_KSEVENT_ITEM(\ - KSEVENT_BDA_PIN_CONNECTED,\ - sizeof( KSEVENTDATA), \ - 0, \ - (AddHandler),\ - (RemoveHandler),\ - (SupportHandler)\ - ) - - #define DEFINE_KSEVENT_ITEM_BDA_PIN_DISCONNECTED(AddHandler, RemoveHandler, SupportHandler)\ - DEFINE_KSEVENT_ITEM(\ - KSEVENT_BDA_PIN_DISCONNECTED,\ - sizeof( KSEVENTDATA), \ - 0, \ - (AddHandler),\ - (RemoveHandler),\ - (SupportHandler)\ - ) - - - - //------------------------------------------------------------ - // - // - // BDA Void Transform Property Set - // - // {71985F46-1CA1-11d3-9CC8-00C04F7971E0} - // - #define STATIC_KSPROPSETID_BdaVoidTransform \ - 0x71985f46, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("71985F46-1CA1-11d3-9CC8-00C04F7971E0", KSPROPSETID_BdaVoidTransform); - #define KSPROPSETID_BdaVoidTransform DEFINE_GUIDNAMED(KSPROPSETID_BdaVoidTransform) - - typedef enum { - KSPROPERTY_BDA_VOID_TRANSFORM_START = 0, - KSPROPERTY_BDA_VOID_TRANSFORM_STOP - } KSPROPERTY_BDA_VOID_TRANSFORM; - - #define DEFINE_KSPROPERTY_ITEM_BDA_VOID_TRANSFORM_START(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_VOID_TRANSFORM_START,\ - FALSE,\ - sizeof(KSPROPERTY),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_VOID_TRANSFORM_STOP(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_VOID_TRANSFORM_STOP,\ - FALSE,\ - sizeof(KSPROPERTY),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - - //------------------------------------------------------------ - // - // - // BDA Null Transform Property Set - // - // {DDF15B0D-BD25-11d2-9CA0-00C04F7971E0} - // - #define STATIC_KSPROPSETID_BdaNullTransform \ - 0xddf15b0d, 0xbd25, 0x11d2, 0x9c, 0xa0, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("DDF15B0D-BD25-11d2-9CA0-00C04F7971E0", KSPROPSETID_BdaNullTransform); - #define KSPROPSETID_BdaNullTransform DEFINE_GUIDNAMED(KSPROPSETID_BdaNullTransform) - - typedef enum { - KSPROPERTY_BDA_NULL_TRANSFORM_START = 0, - KSPROPERTY_BDA_NULL_TRANSFORM_STOP - } KSPROPERTY_BDA_NULL_TRANSFORM; - - #define DEFINE_KSPROPERTY_ITEM_BDA_NULL_TRANSFORM_START(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_NULL_TRANSFORM_START,\ - FALSE,\ - sizeof(KSPROPERTY),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_NULL_TRANSFORM_STOP(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_NULL_TRANSFORM_STOP,\ - FALSE,\ - sizeof(KSPROPERTY),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - - //------------------------------------------------------------ - // - // - // BDA Frequency Filter Property Set - // - // {71985F47-1CA1-11d3-9CC8-00C04F7971E0} - // - #define STATIC_KSPROPSETID_BdaFrequencyFilter \ - 0x71985f47, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("71985F47-1CA1-11d3-9CC8-00C04F7971E0", KSPROPSETID_BdaFrequencyFilter); - #define KSPROPSETID_BdaFrequencyFilter DEFINE_GUIDNAMED(KSPROPSETID_BdaFrequencyFilter) - - typedef enum { - KSPROPERTY_BDA_RF_TUNER_FREQUENCY = 0, - KSPROPERTY_BDA_RF_TUNER_POLARITY, - KSPROPERTY_BDA_RF_TUNER_RANGE, - KSPROPERTY_BDA_RF_TUNER_TRANSPONDER - } KSPROPERTY_BDA_FREQUENCY_FILTER; - - #define DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_FREQUENCY(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_RF_TUNER_FREQUENCY,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_POLARITY(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_RF_TUNER_POLARITY,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_RANGE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_RF_TUNER_RANGE,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_TRANSPONDER(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_RF_TUNER_TRANSPONDER,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - - //------------------------------------------------------------ - // - // - // BDA Digital Demodulator Property Set - // - // {EF30F379-985B-4d10-B640-A79D5E04E1E0} - // - #define STATIC_KSPROPSETID_BdaDigitalDemodulator \ - 0xef30f379, 0x985b, 0x4d10, 0xb6, 0x40, 0xa7, 0x9d, 0x5e, 0x4, 0xe1, 0xe0 - DEFINE_GUIDSTRUCT("EF30F379-985B-4d10-B640-A79D5E04E1E0", KSPROPSETID_BdaDigitalDemodulator); - #define KSPROPSETID_BdaDigitalDemodulator DEFINE_GUIDNAMED(KSPROPSETID_BdaDigitalDemodulator) - - typedef enum { - KSPROPERTY_BDA_MODULATION_TYPE = 0, - KSPROPERTY_BDA_INNER_FEC_TYPE, - KSPROPERTY_BDA_INNER_FEC_RATE, - KSPROPERTY_BDA_OUTER_FEC_TYPE, - KSPROPERTY_BDA_OUTER_FEC_RATE, - KSPROPERTY_BDA_SYMBOL_RATE, - KSPROPERTY_BDA_SPECTRAL_INVERSION, - - } KSPROPERTY_BDA_DIGITAL_DEMODULATOR; - - #define DEFINE_KSPROPERTY_ITEM_BDA_MODULATION_TYPE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_MODULATION_TYPE,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ModulationType),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_INNER_FEC_TYPE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_INNER_FEC_TYPE,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(FECMethod),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_INNER_FEC_RATE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_INNER_FEC_RATE,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BinaryConvolutionCodeRate),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_OUTER_FEC_TYPE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_OUTER_FEC_TYPE,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(FECMethod),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_OUTER_FEC_RATE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_OUTER_FEC_RATE,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BinaryConvolutionCodeRate),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_SYMBOL_RATE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_SYMBOL_RATE,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_SPECTRAL_INVERSION(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_SPECTRAL_INVERSION,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(SpectralInversion),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - - //------------------------------------------------------------ - // - // - // BDA Autodemodulate Property Set - // - // {DDF15B12-BD25-11d2-9CA0-00C04F7971E0} - // - #define STATIC_KSPROPSETID_BdaAutodemodulate \ - 0xddf15b12, 0xbd25, 0x11d2, 0x9c, 0xa0, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("DDF15B12-BD25-11d2-9CA0-00C04F7971E0", KSPROPSETID_BdaAutodemodulate); - #define KSPROPSETID_BdaAutodemodulate DEFINE_GUIDNAMED(KSPROPSETID_BdaAutodemodulate) - - typedef enum { - KSPROPERTY_BDA_AUTODEMODULATE_START = 0, - KSPROPERTY_BDA_AUTODEMODULATE_STOP - } KSPROPERTY_BDA_AUTODEMODULATE; - - #define DEFINE_KSPROPERTY_ITEM_BDA_AUTODEMODULATE_START(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_AUTODEMODULATE_START,\ - FALSE,\ - sizeof(KSP_NODE),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_AUTODEMODULATE_STOP(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_AUTODEMODULATE_STOP,\ - FALSE,\ - sizeof(KSP_NODE),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - //------------------------------------------------------------ - // - // - // BDA PmtProcessor Property Set - // - // {516B99C5-971C-4aaf-B3F3-D9FDA8A15E16} - // - - #define STATIC_KSPROPSETID_BdaPmtProcessor \ - 0x516b99c5, 0x971c, 0x4aaf, 0xb3, 0xf3, 0xd9, 0xfd, 0xa8, 0xa1, 0x5e, 0x16 - DEFINE_GUIDSTRUCT("516B99C5-971C-4aaf-B3F3-D9FDA8A15E16", KSPROPSETID_BdaPmtProcessor); - #define KSPROPSETID_BdaPmtProcessor DEFINE_GUIDNAMED(KSPROPSETID_BdaPmtProcessor) - - typedef enum { - KSPROPERTY_BDA_PMTPROCESSOR_PMT = 0, - } KSPROPERTY_BDA_PMTPROCESSOR; - - #define DEFINE_KSPROPERTY_ITEM_BDA_PMTPROCESSOR_PMT(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_PMTPROCESSOR_PMT,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BDA_PMT),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - //------------------------------------------------------------ - // - // - // BDA Descriptor Property Set - // - // {DE6A1C9E-87DF-48aa-95AA-289B7AA4F49F} - // - - #define STATIC_KSPROPSETID_BdaDescriptor \ - 0xde6a1c9e, 0x87df, 0x48aa, 0x95, 0xaa, 0x28, 0x9b, 0x7a, 0xa4, 0xf4, 0x9f - DEFINE_GUIDSTRUCT("DE6A1C9E-87DF-48aa-95AA-289B7AA4F49F", KSPROPSETID_BdaDescriptor); - #define KSPROPSETID_BdaDescriptor DEFINE_GUIDNAMED(KSPROPSETID_BdaDescriptor) - - typedef enum { - KSPROPERTY_BDA_DESCRIPTOR_CAT_DESC = 0, - KSPROPERTY_BDA_DESCRIPTOR_ES_DESC, - KSPROPERTY_BDA_DESCRIPTOR_PROGRAM_DESC - } KSPROPERTY_BDA_DESCRIPTOR; - - #define DEFINE_KSPROPERTY_ITEM_BDA_DESCRIPTOR_CAT_DESC(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_DESCRIPTOR_CAT_DESC,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BDA_CAT_DESCRIPTOR),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_DESCRIPTOR_ES_DESC(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_DESCRIPTOR_ES_DESC,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BDA_ES_DESCRIPTOR),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_DESCRIPTOR_PROGRAM_DESC(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_DESCRIPTOR_PROGRAM_DESC,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BDA_PROGRAM_DESCRIPTOR),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - - //------------------------------------------------------------ - // - // - // BDA EsMap Property Set - // - // {FA14A8B3-6068-48ef-96DD-53010B985A7D} - // - #define STATIC_KSPROPSETID_BdaEsMap \ - 0xfa14a8b3, 0x6068, 0x48ef, 0x96, 0xdd, 0x53, 0x1, 0xb, 0x98, 0x5a, 0x7d - DEFINE_GUIDSTRUCT("FA14A8B3-6068-48ef-96DD-53010B985A7D", KSPROPSETID_BdaEsMap); - #define KSPROPSETID_BdaEsMap DEFINE_GUIDNAMED(KSPROPSETID_BdaEsMap) - - typedef enum { - KSPROPERTY_BDA_ESMAP_EMM_PIDS = 0, - KSPROPERTY_BDA_ESMAP_ECM_PIDS, - KSPROPERTY_BDA_ESMAP_MAP_LIST, - KSPROPERTY_BDA_ESMAP_UPDATE_MAP, - KSPROPERTY_BDA_ESMAP_REMOVE_MAP - } KSPROPERTY_BDA_ESMAP; - - #define DEFINE_KSPROPERTY_ITEM_BDA_ESMAP_EMM_PIDS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_ESMAP_EMM_PIDS,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_ESMAP_ECM_PIDS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_ESMAP_ECM_PIDS,\ - (GetHandler),\ - sizeof(KSP_NODE_ESPID),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_ESMAP_MAP_LIST(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_ESMAP_MAP_LIST,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_ESMAP_UPDATE_MAP(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_ESMAP_UPDATE_MAP,\ - FALSE,\ - sizeof(KSP_NODE),\ - sizeof(BDA_ES_MAP),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_ESMAP_REMOVE_MAP(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_ESMAP_REMOVE_MAP,\ - FALSE,\ - sizeof(KSP_NODE),\ - sizeof(BDA_ES_MAP),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - //------------------------------------------------------------ - // - // - // BDA PID Filter Property Set - // - // {D0A67D65-08DF-4fec-8533-E5B550410B85} - // - #define STATIC_KSPROPSETID_BdaPIDFilter \ - 0xd0a67d65, 0x8df, 0x4fec, 0x85, 0x33, 0xe5, 0xb5, 0x50, 0x41, 0xb, 0x85 - DEFINE_GUIDSTRUCT("D0A67D65-08DF-4fec-8533-E5B550410B85", KSPROPSETID_BdaPIDFilter); - #define KSPROPSETID_BdaPIDFilter DEFINE_GUIDNAMED(KSPROPSETID_BdaPIDFilter) - - typedef enum { - KSPROPERTY_BDA_PIDFILTER_MAP_PIDS = 0, - KSPROPERTY_BDA_PIDFILTER_UNMAP_PIDS, - KSPROPERTY_BDA_PIDFILTER_LIST_PIDS - } KSPROPERTY_BDA_PIDFILTER; - - #define DEFINE_KSPROPERTY_ITEM_BDA_PIDFILTER_MAP_PIDS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_PIDFILTER_MAP_PIDS,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BDA_PID_MAP),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_PIDFILTER_UNMAP_PIDS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_PIDFILTER_UNMAP_PIDS,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BDA_PID_UNMAP),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_PIDFILTER_LIST_PIDS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_PIDFILTER_LIST_PIDS,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - - //------------------------------------------------------------ - // - // - // BDA CA Property Set - // - // {B0693766-5278-4ec6-B9E1-3CE40560EF5A} - // - #define STATIC_KSPROPSETID_BdaCA \ - 0xb0693766, 0x5278, 0x4ec6, 0xb9, 0xe1, 0x3c, 0xe4, 0x5, 0x60, 0xef, 0x5a - DEFINE_GUIDSTRUCT("B0693766-5278-4ec6-B9E1-3CE40560EF5A", KSPROPSETID_BdaCA); - #define KSPROPSETID_BdaCA DEFINE_GUIDNAMED(KSPROPSETID_BdaCA) - - typedef enum { - KSPROPERTY_BDA_ECM_MAP_STATUS = 0, - KSPROPERTY_BDA_CA_MODULE_STATUS, - KSPROPERTY_BDA_CA_SMART_CARD_STATUS, - KSPROPERTY_BDA_CA_MODULE_UI - } KSPROPERTY_BDA_CA; - - #define DEFINE_KSPROPERTY_ITEM_BDA_ECM_MAP_STATUS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_ECM_MAP_STATUS,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_CA_MODULE_STATUS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_CA_MODULE_STATUS,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_CA_SMART_CARD_STATUS(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_CA_SMART_CARD_STATUS,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(ULONG),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_BDA_CA_MODULE_UI(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_BDA_CA_MODULE_UI,\ - (GetHandler),\ - sizeof(KSP_NODE),\ - sizeof(BDA_CA_MODULE_UI),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - - - //------------------------------------------------------------ - // - // - // BDA CA Event Set - // - // {488C4CCC-B768-4129-8EB1-B00A071F9068} - // - #define STATIC_KSEVENTSETID_BdaCAEvent \ - 0x488c4ccc, 0xb768, 0x4129, 0x8e, 0xb1, 0xb0, 0xa, 0x7, 0x1f, 0x90, 0x68 - DEFINE_GUIDSTRUCT("488C4CCC-B768-4129-8EB1-B00A071F9068", KSEVENTSETID_BdaCAEvent); - #define KSEVENTSETID_BdaCAEvent DEFINE_GUIDNAMED(KSEVENTSETID_BdaCAEvent) - - typedef enum { - KSEVENT_BDA_ECM_MAP_STATUS_CHANGED = 0, - KSEVENT_BDA_CA_MODULE_STATUS_CHANGED, - KSEVENT_BDA_CA_SMART_CARD_STATUS_CHANGED, - KSEVENT_BDA_CA_MODULE_UI_REQUESTED - } KSPROPERTY_BDA_CA_EVENT; - - #define DEFINE_KSEVENT_BDA_ECM_MAP_STATUS_CHANGED(AddHandler, RemoveHandler, SupportHandler)\ - DEFINE_KSEVENT_ITEM(\ - KSEVENT_BDA_ECM_MAP_STATUS_CHANGED,\ - sizeof( KSEVENTDATA), \ - 0, \ - (AddHandler),\ - (RemoveHandler),\ - (SupportHandler)\ - ) - - #define DEFINE_KSEVENT_BDA_CA_MODULE_STATUS_CHANGED(AddHandler, RemoveHandler, SupportHandler)\ - DEFINE_KSEVENT_ITEM(\ - KSEVENT_BDA_CA_MODULE_STATUS_CHANGED,\ - sizeof( KSEVENTDATA), \ - 0, \ - (AddHandler),\ - (RemoveHandler),\ - (SupportHandler)\ - ) - - #define DEFINE_KSEVENT_BDA_CA_SMART_CARD_STATUS_CHANGED(AddHandler, RemoveHandler, SupportHandler)\ - DEFINE_KSEVENT_ITEM(\ - KSEVENT_BDA_CA_SMART_CARD_STATUS_CHANGED,\ - sizeof( KSEVENTDATA), \ - 0, \ - (AddHandler),\ - (RemoveHandler),\ - (SupportHandler)\ - ) - - #define DEFINE_KSEVENT_BDA_CA_MODULE_UI_REQUESTED(AddHandler, RemoveHandler, SupportHandler)\ - DEFINE_KSEVENT_ITEM(\ - KSEVENT_BDA_CA_MODULE_UI_REQUESTED,\ - sizeof( KSEVENTDATA), \ - 0, \ - (AddHandler),\ - (RemoveHandler),\ - (SupportHandler)\ - ) - - - //=========================================================================== - // - // BDA Filter Categories - // - //=========================================================================== - - #define STATIC_KSCATEGORY_BDA_RECEIVER_COMPONENT \ - 0xFD0A5AF4, 0xB41D, 0x11d2, 0x9c, 0x95, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("FD0A5AF4-B41D-11d2-9C95-00C04F7971E0", KSCATEGORY_BDA_RECEIVER_COMPONENT); - #define KSCATEGORY_BDA_RECEIVER_COMPONENT DEFINE_GUIDNAMED(KSCATEGORY_BDA_RECEIVER_COMPONENT) - - - #define STATIC_KSCATEGORY_BDA_NETWORK_TUNER \ - 0x71985f48, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("71985F48-1CA1-11d3-9CC8-00C04F7971E0", KSCATEGORY_BDA_NETWORK_TUNER); - #define KSCATEGORY_BDA_NETWORK_TUNER DEFINE_GUIDNAMED(KSCATEGORY_BDA_NETWORK_TUNER) - - - #define STATIC_KSCATEGORY_BDA_NETWORK_EPG \ - 0x71985f49, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("71985F49-1CA1-11d3-9CC8-00C04F7971E0", KSCATEGORY_BDA_NETWORK_EPG); - #define KSCATEGORY_BDA_NETWORK_EPG DEFINE_GUIDNAMED(KSCATEGORY_BDA_NETWORK_EPG) - - - #define STATIC_KSCATEGORY_BDA_IP_SINK \ - 0x71985f4aL, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x00, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("71985F4A-1CA1-11d3-9CC8-00C04F7971E0", KSCATEGORY_BDA_IP_SINK); - #define KSCATEGORY_IP_SINK DEFINE_GUIDNAMED(KSCATEGORY_BDA_IP_SINK) - - - #define STATIC_KSCATEGORY_BDA_NETWORK_PROVIDER \ - 0x71985f4b, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("71985F4B-1CA1-11d3-9CC8-00C04F7971E0", KSCATEGORY_BDA_NETWORK_PROVIDER); - #define KSCATEGORY_BDA_NETWORK_PROVIDER DEFINE_GUIDNAMED(KSCATEGORY_BDA_NETWORK_PROVIDER) - - // {A2E3074F-6C3D-11d3-B653-00C04F79498E} - #define STATIC_KSCATEGORY_BDA_TRANSPORT_INFORMATION \ - 0xa2e3074f, 0x6c3d, 0x11d3, 0xb6, 0x53, 0x0, 0xc0, 0x4f, 0x79, 0x49, 0x8e - DEFINE_GUIDSTRUCT("A2E3074F-6C3D-11d3-B653-00C04F79498E", KSCATEGORY_BDA_TRANSPORT_INFORMATION); - #define KSCATEGORY_BDA_TRANSPORT_INFORMATION DEFINE_GUIDNAMED(KSCATEGORY_BDA_TRANSPORT_INFORMATION) - - - //=========================================================================== - // - // BDA Node Categories - // - //=========================================================================== - - - #define STATIC_KSNODE_BDA_RF_TUNER \ - 0x71985f4c, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("71985F4C-1CA1-11d3-9CC8-00C04F7971E0", KSNODE_BDA_RF_TUNER); - #define KSNODE_BDA_RF_TUNER DEFINE_GUIDNAMED(KSNODE_BDA_RF_TUNER) - - - #define STATIC_KSNODE_BDA_QAM_DEMODULATOR \ - 0x71985f4d, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("71985F4D-1CA1-11d3-9CC8-00C04F7971E0", KSNODE_BDA_QAM_DEMODULATOR); - #define KSNODE_BDA_QAM_DEMODULATOR DEFINE_GUIDNAMED(KSNODE_BDA_QAM_DEMODULATOR) - - - #define STATIC_KSNODE_BDA_QPSK_DEMODULATOR \ - 0x6390c905, 0x27c1, 0x4d67, 0xbd, 0xb7, 0x77, 0xc5, 0xd, 0x7, 0x93, 0x0 - DEFINE_GUIDSTRUCT("6390C905-27C1-4d67-BDB7-77C50D079300", KSNODE_BDA_QPSK_DEMODULATOR); - #define KSNODE_BDA_QPSK_DEMODULATOR DEFINE_GUIDNAMED(KSNODE_BDA_QPSK_DEMODULATOR) - - - #define STATIC_KSNODE_BDA_8VSB_DEMODULATOR \ - 0x71985f4f, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("71985F4F-1CA1-11d3-9CC8-00C04F7971E0", KSNODE_BDA_8VSB_DEMODULATOR); - #define KSNODE_BDA_8VSB_DEMODULATOR DEFINE_GUIDNAMED(KSNODE_BDA_8VSB_DEMODULATOR) - - - #define STATIC_KSNODE_BDA_OPENCABLE_POD \ - 0xd83ef8fc, 0xf3b8, 0x45ab, 0x8b, 0x71, 0xec, 0xf7, 0xc3, 0x39, 0xde, 0xb4 - DEFINE_GUIDSTRUCT("D83EF8FC-F3B8-45ab-8B71-ECF7C339DEB4", KSNODE_BDA_OPENCABLE_POD); - #define KSNODE_BDA_OPENCABLE_POD DEFINE_GUIDNAMED(KSNODE_BDA_OPENCABLE_POD) - - - #define STATIC_KSNODE_BDA_PID_FILTER \ - 0xf5412789, 0xb0a0, 0x44e1, 0xae, 0x4f, 0xee, 0x99, 0x9b, 0x1b, 0x7f, 0xbe - DEFINE_GUIDSTRUCT("F5412789-B0A0-44e1-AE4F-EE999B1B7FBE", KSNODE_BDA_PID_FILTER); - #define KSNODE_BDA_PID_FILTER DEFINE_GUIDNAMED(KSNODE_BDA_PID_FILTER) - - - #define STATIC_KSNODE_BDA_IP_SINK \ - 0x71985f4e, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 - DEFINE_GUIDSTRUCT("71985F4E-1CA1-11d3-9CC8-00C04F7971E0", KSNODE_BDA_IP_SINK); - #define KSNODE_IP_SINK DEFINE_GUIDNAMED(KSNODE_BDA_IP_SINK) - - - //=========================================================================== - // - // IPSink PINNAME GUID - // - //=========================================================================== - - #define STATIC_PINNAME_IPSINK_INPUT \ - 0x3fdffa70L, 0xac9a, 0x11d2, 0x8f, 0x17, 0x00, 0xc0, 0x4f, 0x79, 0x71, 0xe2 - DEFINE_GUIDSTRUCT("3fdffa70-ac9a-11d2-8f17-00c04f7971e2", PINNAME_IPSINK_INPUT); - #define PINNAME_IPSINK_INPUT DEFINE_GUIDNAMED(PINNAME_IPSINK_INPUT) - - - //=========================================================================== - // - // BDA IPSink Categories/Types - // - //=========================================================================== - - - #define STATIC_KSDATAFORMAT_TYPE_BDA_IP\ - 0xe25f7b8e, 0xcccc, 0x11d2, 0x8f, 0x25, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe2 - DEFINE_GUIDSTRUCT("e25f7b8e-cccc-11d2-8f25-00c04f7971e2", KSDATAFORMAT_TYPE_BDA_IP); - #define KSDATAFORMAT_TYPE_BDA_IP DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_BDA_IP) - - #define STATIC_KSDATAFORMAT_SUBTYPE_BDA_IP\ - 0x5a9a213c, 0xdb08, 0x11d2, 0x8f, 0x32, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe2 - DEFINE_GUIDSTRUCT("5a9a213c-db08-11d2-8f32-00c04f7971e2", KSDATAFORMAT_SUBTYPE_BDA_IP); - #define KSDATAFORMAT_SUBTYPE_BDA_IP DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_BDA_IP) - - #define STATIC_KSDATAFORMAT_SPECIFIER_BDA_IP\ - 0x6b891420, 0xdb09, 0x11d2, 0x8f, 0x32, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe2 - DEFINE_GUIDSTRUCT("6B891420-DB09-11d2-8F32-00C04F7971E2", KSDATAFORMAT_SPECIFIER_BDA_IP); - #define KSDATAFORMAT_SPECIFIER_BDA_IP DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_BDA_IP) - - - - #define STATIC_KSDATAFORMAT_TYPE_BDA_IP_CONTROL\ - 0xdadd5799, 0x7d5b, 0x4b63, 0x80, 0xfb, 0xd1, 0x44, 0x2f, 0x26, 0xb6, 0x21 - DEFINE_GUIDSTRUCT("DADD5799-7D5B-4b63-80FB-D1442F26B621", KSDATAFORMAT_TYPE_BDA_IP_CONTROL); - #define KSDATAFORMAT_TYPE_BDA_IP_CONTROL DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_BDA_IP_CONTROL) - - #define STATIC_KSDATAFORMAT_SUBTYPE_BDA_IP_CONTROL\ - 0x499856e8, 0xe85b, 0x48ed, 0x9b, 0xea, 0x41, 0xd, 0xd, 0xd4, 0xef, 0x81 - DEFINE_GUIDSTRUCT("499856E8-E85B-48ed-9BEA-410D0DD4EF81", KSDATAFORMAT_SUBTYPE_BDA_IP_CONTROL); - #define KSDATAFORMAT_SUBTYPE_BDA_IP_CONTROL DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_BDA_IP_CONTROL) - - - //=========================================================================== - // - // MPE PINNAME GUID - // - //=========================================================================== - - #define STATIC_PINNAME_MPE \ - 0xc1b06d73L, 0x1dbb, 0x11d3, 0x8f, 0x46, 0x00, 0xC0, 0x4f, 0x79, 0x71, 0xE2 - DEFINE_GUIDSTRUCT("C1B06D73-1DBB-11d3-8F46-00C04F7971E2", PINNAME_MPE); - #define PINNAME_MPE DEFINE_GUIDNAMED(PINNAME_MPE) - - - ///////////////////////////////////////////////////////////// - // - // BDA MPE Categories/Types - // - #define STATIC_KSDATAFORMAT_TYPE_MPE \ - 0x455f176c, 0x4b06, 0x47ce, 0x9a, 0xef, 0x8c, 0xae, 0xf7, 0x3d, 0xf7, 0xb5 - DEFINE_GUIDSTRUCT("455F176C-4B06-47ce-9AEF-8CAEF73DF7B5", KSDATAFORMAT_TYPE_MPE); - #define KSDATAFORMAT_TYPE_MPE DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MPE) - - - #if defined(__cplusplus) - } - #endif // defined(__cplusplus) - - -#endif // DirectX 8.0 content - - -#endif // !defined(_BDAMEDIA_) diff --git a/import/DirectX8/include/bdatypes.h b/import/DirectX8/include/bdatypes.h deleted file mode 100644 index 122793d2f..000000000 --- a/import/DirectX8/include/bdatypes.h +++ /dev/null @@ -1,1176 +0,0 @@ -//------------------------------------------------------------------------------ -// File: BDATypes.h -// -// Desc: Typedefs and enums needed by both the WDM drivers and the user mode -// COM interfaces. -// -// Copyright (c) 1999-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef _BDATYPES_ - -#define _BDATYPES_ 1 - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// Separate the updated Windows XP version of this header from the downlevel -// version that shipped with the DirectX 8.0 SDK. Since development -// on BDA technology continued for Windows XP, some changes were made to -// this file in order to improve the interface and functionality. -// -// To maintain compatibility with older applications which rely on the -// DirectX 8.0 versions of these files, the DirectX 8.1 version includes -// both the Windows XP content and the DirectX 8.0 content, which are -// separated by the #if (WINVER >= 0x501) preprocessor directive. -// -// Therefore, if you define WINVER to be 0x501 to specify Windows XP, -// the revised content will be compiled. Otherwise, the original -// DirectX 8.0 content will be used. -// -///////////////////////////////////////////////////////////////////////////// - -#if (WINVER >= 0x501) // Windows XP content - - -/* Utility Macros */ - -#define MIN_DIMENSION 1 - - -#ifdef __midl -#define V1_ENUM [v1_enum] -#else -#define V1_ENUM -#endif - -//=========================================================================== -// -// BDA Topology Structures -// -//=========================================================================== - -typedef struct _BDA_TEMPLATE_CONNECTION -{ - ULONG FromNodeType; - ULONG FromNodePinType; - ULONG ToNodeType; - ULONG ToNodePinType; -}BDA_TEMPLATE_CONNECTION, *PBDA_TEMPLATE_CONNECTION; - - -typedef struct _BDA_TEMPLATE_PIN_JOINT -{ - ULONG uliTemplateConnection; - ULONG ulcInstancesMax; -}BDA_TEMPLATE_PIN_JOINT, *PBDA_TEMPLATE_PIN_JOINT; - - - -//=========================================================================== -// -// BDA Events -// -//=========================================================================== - -// In-band Event IDs -// -typedef enum { - BDA_EVENT_SIGNAL_LOSS = 0, - BDA_EVENT_SIGNAL_LOCK, - BDA_EVENT_DATA_START, - BDA_EVENT_DATA_STOP, - BDA_EVENT_CHANNEL_ACQUIRED, - BDA_EVENT_CHANNEL_LOST, - BDA_EVENT_CHANNEL_SOURCE_CHANGED, - BDA_EVENT_CHANNEL_ACTIVATED, - BDA_EVENT_CHANNEL_DEACTIVATED, - BDA_EVENT_SUBCHANNEL_ACQUIRED, - BDA_EVENT_SUBCHANNEL_LOST, - BDA_EVENT_SUBCHANNEL_SOURCE_CHANGED, - BDA_EVENT_SUBCHANNEL_ACTIVATED, - BDA_EVENT_SUBCHANNEL_DEACTIVATED, - BDA_EVENT_ACCESS_GRANTED, - BDA_EVENT_ACCESS_DENIED, - BDA_EVENT_OFFER_EXTENDED, - BDA_EVENT_PURCHASE_COMPLETED, - BDA_EVENT_SMART_CARD_INSERTED, - BDA_EVENT_SMART_CARD_REMOVED -} BDA_EVENT_ID, *PBDA_EVENT_ID; - - - -//=========================================================================== -// -// KSSTREAM_HEADER extensions for BDA -// -//=========================================================================== - -typedef struct tagKS_BDA_FRAME_INFO { - ULONG ExtendedHeaderSize; // Size of this extended header - DWORD dwFrameFlags; // - ULONG ulEvent; // - ULONG ulChannelNumber; // - ULONG ulSubchannelNumber; // - ULONG ulReason; // -} KS_BDA_FRAME_INFO, *PKS_BDA_FRAME_INFO; - - -//------------------------------------------------------------ -// -// BDA Network Ethernet Filter Property Set -// -// {71985F43-1CA1-11d3-9CC8-00C04F7971E0} -// -typedef struct _BDA_ETHERNET_ADDRESS { - BYTE rgbAddress[6]; -} BDA_ETHERNET_ADDRESS, *PBDA_ETHERNET_ADDRESS; - -typedef struct _BDA_ETHERNET_ADDRESS_LIST { - ULONG ulcAddresses; - BDA_ETHERNET_ADDRESS rgAddressl[MIN_DIMENSION]; -} BDA_ETHERNET_ADDRESS_LIST, * PBDA_ETHERNET_ADDRESS_LIST; - -typedef enum { - BDA_PROMISCUOUS_MULTICAST = 0, - BDA_FILTERED_MULTICAST, - BDA_NO_MULTICAST -} BDA_MULTICAST_MODE, *PBDA_MULTICAST_MODE; - - -//------------------------------------------------------------ -// -// BDA Network IPv4 Filter Property Set -// -// {71985F44-1CA1-11d3-9CC8-00C04F7971E0} -// -typedef struct _BDA_IPv4_ADDRESS { - BYTE rgbAddress[4]; -} BDA_IPv4_ADDRESS, *PBDA_IPv4_ADDRESS; - -typedef struct _BDA_IPv4_ADDRESS_LIST { - ULONG ulcAddresses; - BDA_IPv4_ADDRESS rgAddressl[MIN_DIMENSION]; -} BDA_IPv4_ADDRESS_LIST, * PBDA_IPv4_ADDRESS_LIST; - - -//------------------------------------------------------------ -// -// BDA Network IPv4 Filter Property Set -// -// {E1785A74-2A23-4fb3-9245-A8F88017EF33} -// -typedef struct _BDA_IPv6_ADDRESS { - BYTE rgbAddress[6]; -} BDA_IPv6_ADDRESS, *PBDA_IPv6_ADDRESS; - -typedef struct _BDA_IPv6_ADDRESS_LIST { - ULONG ulcAddresses; - BDA_IPv6_ADDRESS rgAddressl[MIN_DIMENSION]; -} BDA_IPv6_ADDRESS_LIST, * PBDA_IPv6_ADDRESS_LIST; - - -//------------------------------------------------------------ -// -// -// BDA Signal Property Set -// -// {D2F1644B-B409-11d2-BC69-00A0C9EE9E16} -// -typedef enum { - BDA_SIGNAL_UNAVAILABLE = 0, - BDA_SIGNAL_INACTIVE, - BDA_SIGNAL_ACTIVE -} BDA_SIGNAL_STATE, * PBDA_SIGNAL_STATE; - - -//------------------------------------------------------------ -// -// -// BDA Change Sync Method Set -// -// {FD0A5AF3-B41D-11d2-9C95-00C04F7971E0} -// -typedef enum -{ - BDA_CHANGES_COMPLETE = 0, - BDA_CHANGES_PENDING - -} BDA_CHANGE_STATE, * PBDA_CHANGE_STATE; - - -//------------------------------------------------------------ -// -// -// BDA Device Configuration Method Set -// -// {71985F45-1CA1-11d3-9CC8-00C04F7971E0} -// - - -//------------------------------------------------------------ -// -// -// BDA Topology Property Set -// -// {A14EE835-0A23-11d3-9CC7-00C04F7971E0} -// - -typedef struct _BDANODE_DESCRIPTOR -{ - ULONG ulBdaNodeType; // The node type as it is used - // in the BDA template topology - - GUID guidFunction; // GUID from BdaMedia.h describing - // the node's function (e.g. - // KSNODE_BDA_RF_TUNER) - - GUID guidName; // GUID that can be use to look up - // a displayable name for the node. -} BDANODE_DESCRIPTOR, *PBDANODE_DESCRIPTOR; - - -//------------------------------------------------------------ -// -// -// BDA Void Transform Property Set -// -// {71985F46-1CA1-11d3-9CC8-00C04F7971E0} -// - - -//------------------------------------------------------------ -// -// -// BDA Null Transform Property Set -// -// {DDF15B0D-BD25-11d2-9CA0-00C04F7971E0} -// - - -//------------------------------------------------------------ -// -// -// BDA Frequency Filter Property Set -// -// {71985F47-1CA1-11d3-9CC8-00C04F7971E0} -// - - -//------------------------------------------------------------ -// -// -// BDA Autodemodulate Property Set -// -// {DDF15B12-BD25-11d2-9CA0-00C04F7971E0} -// - - -//------------------------------------------------------------ -// -// -// BDA Table Section Property Set -// -// {516B99C5-971C-4aaf-B3F3-D9FDA8A15E16} -// - -typedef struct _BDA_TABLE_SECTION -{ - ULONG ulPrimarySectionId; - ULONG ulSecondarySectionId; - ULONG ulcbSectionLength; - ULONG argbSectionData[MIN_DIMENSION]; -} BDA_TABLE_SECTION, *PBDA_TABLE_SECTION; - - -//------------------------------------------------------------ -// -// -// BDA PID Filter Property Set -// -// {D0A67D65-08DF-4fec-8533-E5B550410B85} -// - -//--------------------------------------------------------------------- -// From IEnumPIDMap interface -//--------------------------------------------------------------------- - -typedef enum { - MEDIA_TRANSPORT_PACKET, // complete TS packet e.g. pass-through mode - MEDIA_ELEMENTARY_STREAM, // PES payloads; audio/video only - MEDIA_MPEG2_PSI, // PAT, PMT, CAT, Private - MEDIA_TRANSPORT_PAYLOAD // gathered TS packet payloads (PES packets, etc...) -} MEDIA_SAMPLE_CONTENT ; - -typedef struct { - ULONG ulPID ; - MEDIA_SAMPLE_CONTENT MediaSampleContent ; -} PID_MAP ; - -typedef struct _BDA_PID_MAP -{ - MEDIA_SAMPLE_CONTENT MediaSampleContent; - ULONG ulcPIDs; - ULONG aulPIDs[MIN_DIMENSION]; -} BDA_PID_MAP, *PBDA_PID_MAP; - -typedef struct _BDA_PID_UNMAP -{ - ULONG ulcPIDs; - ULONG aulPIDs[MIN_DIMENSION]; -} BDA_PID_UNMAP, *PBDA_PID_UNMAP; - - -//------------------------------------------------------------ -// -// -// BDA CA Property Set -// -// {B0693766-5278-4ec6-B9E1-3CE40560EF5A} -// -typedef struct _BDA_CA_MODULE_UI -{ - ULONG ulFormat; - ULONG ulbcDesc; - ULONG ulDesc[MIN_DIMENSION]; -} BDA_CA_MODULE_UI, *PBDA_CA_MODULE_UI; - -typedef struct _BDA_PROGRAM_PID_LIST -{ - ULONG ulProgramNumber; - ULONG ulcPIDs; - ULONG ulPID[MIN_DIMENSION]; -} BDA_PROGRAM_PID_LIST, *PBDA_PROGRAM_PID_LIST; - - -//------------------------------------------------------------ -// -// -// BDA CA Event Set -// -// {488C4CCC-B768-4129-8EB1-B00A071F9068} -// - - - -//============================================================= -// -// -// BDA Tuning Model enumerations -// -// -//============================================================= - -// system type for particular DVB Tuning Space instance -typedef enum DVBSystemType { - DVB_Cable, - DVB_Terrestrial, - DVB_Satellite, -} DVBSystemType; - -//------------------------------------------------------------ -// -// BDA Channel Tune Request - -V1_ENUM enum { - BDA_UNDEFINED_CHANNEL = -1, -}; - - -//------------------------------------------------------------ -// -// BDA Component(substream) -// - -typedef V1_ENUM enum ComponentCategory -{ - CategoryNotSet = -1, - CategoryOther = 0, - CategoryVideo, - CategoryAudio, - CategoryText, - CategoryData, -} ComponentCategory; - -// Component Status -typedef enum ComponentStatus -{ - StatusActive, - StatusInactive, - StatusUnavailable, -} ComponentStatus; - - -//------------------------------------------------------------ -// -// BDA MPEG2 Component Type -// -// from the MPEG2 specification -typedef V1_ENUM enum MPEG2StreamType { - BDA_UNITIALIZED_MPEG2STREAMTYPE = -1, - Reserved1 = 0x0, - ISO_IEC_11172_2_VIDEO = Reserved1 + 1, - ISO_IEC_13818_2_VIDEO = ISO_IEC_11172_2_VIDEO + 1, - ISO_IEC_11172_3_AUDIO = ISO_IEC_13818_2_VIDEO + 1, - ISO_IEC_13818_3_AUDIO = ISO_IEC_11172_3_AUDIO + 1, - ISO_IEC_13818_1_PRIVATE_SECTION = ISO_IEC_13818_3_AUDIO + 1, - ISO_IEC_13818_1_PES = ISO_IEC_13818_1_PRIVATE_SECTION + 1, - ISO_IEC_13522_MHEG = ISO_IEC_13818_1_PES + 1, - ANNEX_A_DSM_CC = ISO_IEC_13522_MHEG + 1, - ITU_T_REC_H_222_1 = ANNEX_A_DSM_CC + 1, - ISO_IEC_13818_6_TYPE_A = ITU_T_REC_H_222_1 + 1, - ISO_IEC_13818_6_TYPE_B = ISO_IEC_13818_6_TYPE_A + 1, - ISO_IEC_13818_6_TYPE_C = ISO_IEC_13818_6_TYPE_B + 1, - ISO_IEC_13818_6_TYPE_D = ISO_IEC_13818_6_TYPE_C + 1, - ISO_IEC_13818_1_AUXILIARY = ISO_IEC_13818_6_TYPE_D + 1, - ISO_IEC_13818_1_RESERVED = ISO_IEC_13818_1_AUXILIARY + 1, - USER_PRIVATE = ISO_IEC_13818_1_RESERVED + 1 -} MPEG2StreamType; - -//------------------------------------------------------------ -// -// mpeg-2 transport stride format block; associated with media -// types MEDIATYPE_Stream/MEDIASUBTYPE_MPEG2_TRANSPORT_STRIDE; -// *all* format blocks associated with above media type *must* -// start with the MPEG2_TRANSPORT_STRIDE structure -// - -typedef struct _MPEG2_TRANSPORT_STRIDE { - DWORD dwOffset ; - DWORD dwPacketLength ; - DWORD dwStride ; -} MPEG2_TRANSPORT_STRIDE, *PMPEG2_TRANSPORT_STRIDE ; - -//------------------------------------------------------------ -// -// BDA ATSC Component Type -// -// -// ATSC made AC3 Audio a descriptor instead of -// defining a user private stream type. -typedef enum ATSCComponentTypeFlags { - // bit flags for various component type properties - ATSCCT_AC3 = 0x00000001, -} ATSCComponentTypeFlags; - - -//------------------------------------------------------------ -// -// BDA Locators -// - - -typedef V1_ENUM enum BinaryConvolutionCodeRate { - BDA_BCC_RATE_NOT_SET = -1, - BDA_BCC_RATE_NOT_DEFINED = 0, - BDA_BCC_RATE_1_2 = 1, // 1/2 - BDA_BCC_RATE_2_3, // 2/3 - BDA_BCC_RATE_3_4, // 3/4 - BDA_BCC_RATE_3_5, - BDA_BCC_RATE_4_5, - BDA_BCC_RATE_5_6, // 5/6 - BDA_BCC_RATE_5_11, - BDA_BCC_RATE_7_8, // 7/8 - BDA_BCC_RATE_MAX, -} BinaryConvolutionCodeRate; - -typedef V1_ENUM enum FECMethod { - BDA_FEC_METHOD_NOT_SET = -1, - BDA_FEC_METHOD_NOT_DEFINED = 0, - BDA_FEC_VITERBI = 1, // FEC is a Viterbi Binary Convolution. - BDA_FEC_RS_204_188, // The FEC is Reed-Solomon 204/188 (outer FEC) - BDA_FEC_MAX, -} FECMethod; - -typedef V1_ENUM enum ModulationType { - BDA_MOD_NOT_SET = -1, - BDA_MOD_NOT_DEFINED = 0, - BDA_MOD_16QAM = 1, - BDA_MOD_32QAM, - BDA_MOD_64QAM, - BDA_MOD_80QAM, - BDA_MOD_96QAM, - BDA_MOD_112QAM, - BDA_MOD_128QAM, - BDA_MOD_160QAM, - BDA_MOD_192QAM, - BDA_MOD_224QAM, - BDA_MOD_256QAM, - BDA_MOD_320QAM, - BDA_MOD_384QAM, - BDA_MOD_448QAM, - BDA_MOD_512QAM, - BDA_MOD_640QAM, - BDA_MOD_768QAM, - BDA_MOD_896QAM, - BDA_MOD_1024QAM, - BDA_MOD_QPSK, - BDA_MOD_BPSK, - BDA_MOD_OQPSK, - BDA_MOD_8VSB, - BDA_MOD_16VSB, - BDA_MOD_ANALOG_AMPLITUDE, // std am - BDA_MOD_ANALOG_FREQUENCY, // std fm - BDA_MOD_MAX, -} ModulationType; - -typedef V1_ENUM enum SpectralInversion { - BDA_SPECTRAL_INVERSION_NOT_SET = -1, - BDA_SPECTRAL_INVERSION_NOT_DEFINED = 0, - BDA_SPECTRAL_INVERSION_AUTOMATIC = 1, - BDA_SPECTRAL_INVERSION_NORMAL, - BDA_SPECTRAL_INVERSION_INVERTED, - BDA_SPECTRAL_INVERSION_MAX -} SpectralInversion; - -typedef V1_ENUM enum Polarisation { - BDA_POLARISATION_NOT_SET = -1, - BDA_POLARISATION_NOT_DEFINED = 0, - BDA_POLARISATION_LINEAR_H = 1, // Linear horizontal polarisation - BDA_POLARISATION_LINEAR_V, // Linear vertical polarisation - BDA_POLARISATION_CIRCULAR_L, // Circular left polarisation - BDA_POLARISATION_CIRCULAR_R, // Circular right polarisation - BDA_POLARISATION_MAX, -} Polarisation; - -typedef V1_ENUM enum GuardInterval { - BDA_GUARD_NOT_SET = -1, - BDA_GUARD_NOT_DEFINED = 0, - BDA_GUARD_1_32 = 1, // Guard interval is 1/32 - BDA_GUARD_1_16, // Guard interval is 1/16 - BDA_GUARD_1_8, // Guard interval is 1/8 - BDA_GUARD_1_4, // Guard interval is 1/4 - BDA_GUARD_MAX, -} GuardInterval; - -typedef V1_ENUM enum HierarchyAlpha { - BDA_HALPHA_NOT_SET = -1, - BDA_HALPHA_NOT_DEFINED = 0, - BDA_HALPHA_1 = 1, // Hierarchy alpha is 1. - BDA_HALPHA_2, // Hierarchy alpha is 2. - BDA_HALPHA_4, // Hierarchy alpha is 4. - BDA_HALPHA_MAX, -} HierarchyAlpha; - -typedef V1_ENUM enum TransmissionMode { - BDA_XMIT_MODE_NOT_SET = -1, - BDA_XMIT_MODE_NOT_DEFINED = 0, - BDA_XMIT_MODE_2K = 1, // Transmission uses 1705 carriers (use a 2K FFT) - BDA_XMIT_MODE_8K, // Transmission uses 6817 carriers (use an 8K FFT) - BDA_XMIT_MODE_MAX, -} TransmissionMode; - -// Settings for Tuner Frequency -// -#define BDA_FREQUENCY_NOT_SET -1 -#define BDA_FREQUENCY_NOT_DEFINED 0 - -// Settings for Tuner Range -// -// Tuner range refers to the setting of LNB High/Low as well as the -// selection of a satellite on a multiple satellite switch. -// -#define BDA_RANGE_NOT_SET -1 -#define BDA_RANGE_NOT_DEFINED 0 - -// Settings for Tuner Channel Bandwidth -// -#define BDA_CHAN_BANDWITH_NOT_SET -1 -#define BDA_CHAN_BANDWITH_NOT_DEFINED 0 - -// Settings for Tuner Frequency Multiplier -// -#define BDA_FREQUENCY_MULTIPLIER_NOT_SET -1 -#define BDA_FREQUENCY_MULTIPLIER_NOT_DEFINED 0 - - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// The following is the original contents of this header from -// the DirectX 8.0 SDK. -// -///////////////////////////////////////////////////////////////////////////// - -#else // DirectX 8.0 content - - /* Utility Macros */ - - #define MIN_DIMENSION 1 - #define NATURAL 4 - #define CACHE_LINE 128 - #define PAGE 4096 - #define ALIGN( pointer, size) (((ULONG)(pointer) + (ULONG)(size) - 1) & ~((ULONG)(size) - 1)) - #define BDA_STRING_CONST(x) {sizeof(L##x)-2, sizeof(L##x), L##x} - - - #ifdef __midl - #define V1_ENUM [v1_enum] - #else - #define V1_ENUM - #endif - - //=========================================================================== - // - // BDA Topology Structures - // - //=========================================================================== - - typedef struct _BDA_TEMPLATE_CONNECTION - { - ULONG FromNodeType; - ULONG FromNodePinType; - ULONG ToNodeType; - ULONG ToNodePinType; - }BDA_TEMPLATE_CONNECTION, *PBDA_TEMPLATE_CONNECTION; - - - typedef struct _BDA_TEMPLATE_PIN_JOINT - { - ULONG uliTemplateConnection; - ULONG ulcInstancesMax; - }BDA_TEMPLATE_PIN_JOINT, *PBDA_TEMPLATE_PIN_JOINT; - - - - //=========================================================================== - // - // BDA Events - // - //=========================================================================== - - // In-band Event IDs - // - typedef enum { - BDA_EVENT_SIGNAL_LOSS = 0, - BDA_EVENT_SIGNAL_LOCK, - BDA_EVENT_DATA_START, - BDA_EVENT_DATA_STOP, - BDA_EVENT_CHANNEL_ACQUIRED, - BDA_EVENT_CHANNEL_LOST, - BDA_EVENT_CHANNEL_SOURCE_CHANGED, - BDA_EVENT_CHANNEL_ACTIVATED, - BDA_EVENT_CHANNEL_DEACTIVATED, - BDA_EVENT_SUBCHANNEL_ACQUIRED, - BDA_EVENT_SUBCHANNEL_LOST, - BDA_EVENT_SUBCHANNEL_SOURCE_CHANGED, - BDA_EVENT_SUBCHANNEL_ACTIVATED, - BDA_EVENT_SUBCHANNEL_DEACTIVATED, - BDA_EVENT_ACCESS_GRANTED, - BDA_EVENT_ACCESS_DENIED, - BDA_EVENT_OFFER_EXTENDED, - BDA_EVENT_PURCHASE_COMPLETED, - BDA_EVENT_SMART_CARD_INSERTED, - BDA_EVENT_SMART_CARD_REMOVED - } BDA_EVENT_ID, *PBDA_EVENT_ID; - - - - //=========================================================================== - // - // KSSTREAM_HEADER extensions for BDA - // - //=========================================================================== - - typedef struct tagKS_BDA_FRAME_INFO { - ULONG ExtendedHeaderSize; // Size of this extended header - DWORD dwFrameFlags; // - ULONG ulEvent; // - ULONG ulChannelNumber; // - ULONG ulSubchannelNumber; // - ULONG ulReason; // - } KS_BDA_FRAME_INFO, *PKS_BDA_FRAME_INFO; - - - //------------------------------------------------------------ - // - // BDA Network Ethernet Filter Property Set - // - // {71985F43-1CA1-11d3-9CC8-00C04F7971E0} - // - typedef struct _BDA_ETHERNET_ADDRESS { - BYTE rgbAddress[6]; - } BDA_ETHERNET_ADDRESS, *PBDA_ETHERNET_ADDRESS; - - typedef struct _BDA_ETHERNET_ADDRESS_LIST { - ULONG ulcAddresses; - BDA_ETHERNET_ADDRESS rgAddressl[MIN_DIMENSION]; - } BDA_ETHERNET_ADDRESS_LIST, * PBDA_ETHERNET_ADDRESS_LIST; - - typedef enum { - BDA_PROMISCUOUS_MULTICAST = 0, - BDA_FILTERED_MULTICAST, - BDA_NO_MULTICAST - } BDA_MULTICAST_MODE, *PBDA_MULTICAST_MODE; - - - //------------------------------------------------------------ - // - // BDA Network IPv4 Filter Property Set - // - // {71985F44-1CA1-11d3-9CC8-00C04F7971E0} - // - typedef struct _BDA_IPv4_ADDRESS { - BYTE rgbAddress[4]; - } BDA_IPv4_ADDRESS, *PBDA_IPv4_ADDRESS; - - typedef struct _BDA_IPv4_ADDRESS_LIST { - ULONG ulcAddresses; - BDA_IPv4_ADDRESS rgAddressl[MIN_DIMENSION]; - } BDA_IPv4_ADDRESS_LIST, * PBDA_IPv4_ADDRESS_LIST; - - - //------------------------------------------------------------ - // - // BDA Network IPv4 Filter Property Set - // - // {E1785A74-2A23-4fb3-9245-A8F88017EF33} - // - typedef struct _BDA_IPv6_ADDRESS { - BYTE rgbAddress[6]; - } BDA_IPv6_ADDRESS, *PBDA_IPv6_ADDRESS; - - typedef struct _BDA_IPv6_ADDRESS_LIST { - ULONG ulcAddresses; - BDA_IPv6_ADDRESS rgAddressl[MIN_DIMENSION]; - } BDA_IPv6_ADDRESS_LIST, * PBDA_IPv6_ADDRESS_LIST; - - - //------------------------------------------------------------ - // - // - // BDA Signal Property Set - // - // {D2F1644B-B409-11d2-BC69-00A0C9EE9E16} - // - typedef enum { - BDA_SIGNAL_UNAVAILABLE = 0, - BDA_SIGNAL_INACTIVE, - BDA_SIGNAL_ACTIVE - } BDA_SIGNAL_STATE, * PBDA_SIGNAL_STATE; - - - //------------------------------------------------------------ - // - // - // BDA Change Sync Method Set - // - // {FD0A5AF3-B41D-11d2-9C95-00C04F7971E0} - // - typedef enum - { - BDA_CHANGES_COMPLETE = 0, - BDA_CHANGES_PENDING - - } BDA_CHANGE_STATE, * PBDA_CHANGE_STATE; - - - //------------------------------------------------------------ - // - // - // BDA Device Configuration Method Set - // - // {71985F45-1CA1-11d3-9CC8-00C04F7971E0} - // - - - //------------------------------------------------------------ - // - // - // BDA Topology Property Set - // - // {A14EE835-0A23-11d3-9CC7-00C04F7971E0} - // - - typedef struct _BDANODE_DESCRIPTOR - { - ULONG ulBdaNodeType; // The node type as it is used - // in the BDA template topology - - GUID guidFunction; // GUID from BdaMedia.h describing - // the node's function (e.g. - // KSNODE_BDA_RF_TUNER) - - GUID guidName; // GUID that can be use to look up - // a displayable name for the node. - } BDANODE_DESCRIPTOR, *PBDANODE_DESCRIPTOR; - - - //------------------------------------------------------------ - // - // - // BDA Void Transform Property Set - // - // {71985F46-1CA1-11d3-9CC8-00C04F7971E0} - // - - - //------------------------------------------------------------ - // - // - // BDA Null Transform Property Set - // - // {DDF15B0D-BD25-11d2-9CA0-00C04F7971E0} - // - - - //------------------------------------------------------------ - // - // - // BDA Frequency Filter Property Set - // - // {71985F47-1CA1-11d3-9CC8-00C04F7971E0} - // - - - //------------------------------------------------------------ - // - // - // BDA Autodemodulate Property Set - // - // {DDF15B12-BD25-11d2-9CA0-00C04F7971E0} - // - - - //------------------------------------------------------------ - // - // - // BDA PmtProcessor Property Set - // - // {516B99C5-971C-4aaf-B3F3-D9FDA8A15E16} - // - - typedef struct _BDA_PMT - { - ULONG ulTableID; - ULONG ulcbSectionLength; - ULONG argbSectionData[MIN_DIMENSION]; - } BDA_PMT, *PBDA_PMT; - - //------------------------------------------------------------ - // - // - // BDA Descriptor Property Set - // - // {DE6A1C9E-87DF-48aa-95AA-289B7AA4F49F} - // - - typedef struct _BDA_CAT_DESCRIPTOR - { - ULONG ulTag; - ULONG ulcbLength; - ULONG argbData[MIN_DIMENSION]; - } BDA_CAT_DESCRIPTOR, *PBDA_CAT_DESCRIPTOR; - - typedef struct _BDA_ES_DESCRIPTOR - { - ULONG ulProgramNum; - ULONG ulContentPID; - ULONG ulTag; - ULONG ulcbLength; - ULONG argbData[MIN_DIMENSION]; - } BDA_ES_DESCRIPTOR, *PBDA_ES_DESCRIPTOR; - - typedef struct _BDA_PROGRAM_DESCRIPTOR - { - ULONG ulProgramNum; - ULONG ulTag; - ULONG ulcbLength; - ULONG argbData[MIN_DIMENSION]; - } BDA_PROGRAM_DESCRIPTOR, *PBDA_PROGRAM_DESCRIPTOR; - - - //------------------------------------------------------------ - // - // - // BDA EsMap Property Set - // - // {FA14A8B3-6068-48ef-96DD-53010B985A7D} - // - - typedef enum - { - ES_MAP_STATE_GOOD_FLOW = 0, - ES_MAP_STATE_NO_CONTENT, - ES_MAP_STATE_NO_ECM, - ES_MAP_STATE_BAD_MAP - } BDA_ES_MAP_STATE, *PBDA_ES_MAP_STATE; - - typedef struct _BDA_ES_MAP - { - ULONG ulContentPID; - ULONG ulProgramNum; - ULONG ulStreamType; - BDA_ES_MAP_STATE mapState; - } BDA_ES_MAP, *PBDA_ES_MAP; - - - //------------------------------------------------------------ - // - // - // BDA PID Filter Property Set - // - // {D0A67D65-08DF-4fec-8533-E5B550410B85} - // - - //--------------------------------------------------------------------- - // From IEnumPIDMap interface - //--------------------------------------------------------------------- - - typedef enum { - MEDIA_TRANSPORT_PACKET, // complete TS packet e.g. pass-through mode - MEDIA_ELEMENTARY_STREAM, // PES payloads; audio/video only - MEDIA_MPEG2_PSI, // PAT, PMT, CAT, Private - MEDIA_TRANSPORT_PAYLOAD // gathered TS packet payloads (PES packets, etc...) - } MEDIA_SAMPLE_CONTENT ; - - typedef struct { - ULONG ulPID ; - MEDIA_SAMPLE_CONTENT MediaSampleContent ; - } PID_MAP ; - - typedef struct _BDA_PID_MAP - { - MEDIA_SAMPLE_CONTENT MediaSampleContent; - ULONG ulcPIDs; - ULONG aulPIDs[MIN_DIMENSION]; - } BDA_PID_MAP, *PBDA_PID_MAP; - - typedef struct _BDA_PID_UNMAP - { - ULONG ulcPIDs; - ULONG aulPIDs[MIN_DIMENSION]; - } BDA_PID_UNMAP, *PBDA_PID_UNMAP; - - - //------------------------------------------------------------ - // - // - // BDA CA Property Set - // - // {B0693766-5278-4ec6-B9E1-3CE40560EF5A} - // - typedef struct _BDA_CA_MODULE_UI - { - ULONG ulFormat; - ULONG ulbcDesc; - ULONG ulDesc[MIN_DIMENSION]; - } BDA_CA_MODULE_UI, *PBDA_CA_MODULE_UI; - - - //------------------------------------------------------------ - // - // - // BDA CA Event Set - // - // {488C4CCC-B768-4129-8EB1-B00A071F9068} - // - - - - //============================================================= - // - // - // BDA Tuning Model enumerations - // - // - //============================================================= - - // system type for particular DVB Tuning Space instance - typedef enum DVBSystemType { - DVB_Cable, - DVB_Terrestrial, - DVB_Satellite, - } DVBSystemType; - - //------------------------------------------------------------ - // - // BDA Channel Tune Request - - V1_ENUM enum { - BDA_UNDEFINED_CHANNEL = -1, - }; - - - //------------------------------------------------------------ - // - // BDA Component(substream) - // - - typedef V1_ENUM enum ComponentCategory - { - CategoryNotSet = -1, - CategoryOther = 0, - CategoryVideo, - CategoryAudio, - CategoryText, - CategoryData, - } ComponentCategory; - - // Component Status - typedef enum ComponentStatus - { - StatusActive, - StatusInactive, - StatusUnavailable, - } ComponentStatus; - - - //------------------------------------------------------------ - // - // BDA MPEG2 Component Type - // - // from the MPEG2 specification - typedef V1_ENUM enum MPEG2StreamType { - BDA_UNITIALIZED_MPEG2STREAMTYPE = -1, - Reserved1 = 0x0, - ISO_IEC_11172_2_VIDEO = Reserved1 + 1, - ISO_IEC_13818_2_VIDEO = ISO_IEC_11172_2_VIDEO + 1, - ISO_IEC_11172_3_AUDIO = ISO_IEC_13818_2_VIDEO + 1, - ISO_IEC_13818_3_AUDIO = ISO_IEC_11172_3_AUDIO + 1, - ISO_IEC_13818_1_PRIVATE_SECTION = ISO_IEC_13818_3_AUDIO + 1, - ISO_IEC_13818_1_PES = ISO_IEC_13818_1_PRIVATE_SECTION + 1, - ISO_IEC_13522_MHEG = ISO_IEC_13818_1_PES + 1, - ANNEX_A_DSM_CC = ISO_IEC_13522_MHEG + 1, - ITU_T_REC_H_222_1 = ANNEX_A_DSM_CC + 1, - ISO_IEC_13818_6_TYPE_A = ITU_T_REC_H_222_1 + 1, - ISO_IEC_13818_6_TYPE_B = ISO_IEC_13818_6_TYPE_A + 1, - ISO_IEC_13818_6_TYPE_C = ISO_IEC_13818_6_TYPE_B + 1, - ISO_IEC_13818_6_TYPE_D = ISO_IEC_13818_6_TYPE_C + 1, - ISO_IEC_13818_1_AUXILIARY = ISO_IEC_13818_6_TYPE_D + 1, - ISO_IEC_13818_1_RESERVED = ISO_IEC_13818_1_AUXILIARY + 1, - USER_PRIVATE = ISO_IEC_13818_1_RESERVED + 1 - } MPEG2StreamType; - - - //------------------------------------------------------------ - // - // BDA ATSC Component Type - // - // - // ATSC made AC3 Audio a descriptor instead of - // defining a user private stream type. - typedef enum ATSCComponentTypeFlags { - // bit flags for various component type properties - ATSCCT_AC3 = 0x00000001, - } ATSCComponentTypeFlags; - - - //------------------------------------------------------------ - // - // BDA Locators - // - - - typedef V1_ENUM enum BinaryConvolutionCodeRate { - BDA_BCC_RATE_NOT_SET = -1, - BDA_BCC_RATE_NOT_DEFINED = 0, - BDA_BCC_RATE_1_2 = 1, // 1/2 - BDA_BCC_RATE_2_3, // 2/3 - BDA_BCC_RATE_3_4, // 3/4 - BDA_BCC_RATE_3_5, - BDA_BCC_RATE_4_5, - BDA_BCC_RATE_5_6, // 5/6 - BDA_BCC_RATE_5_11, - BDA_BCC_RATE_7_8, // 7/8 - BDA_BCC_RATE_MAX, - } BinaryConvolutionCodeRate; - - typedef V1_ENUM enum FECMethod { - BDA_FEC_METHOD_NOT_SET = -1, - BDA_FEC_METHOD_NOT_DEFINED = 0, - BDA_FEC_VITERBI = 1, // FEC is a Viterbi Binary Convolution. - BDA_FEC_RS_204_188, // The FEC is Reed-Solomon 204/188 (outer FEC) - BDA_FEC_MAX, - } FECMethod; - - typedef V1_ENUM enum ModulationType { - BDA_MOD_NOT_SET = -1, - BDA_MOD_NOT_DEFINED = 0, - BDA_MOD_16QAM = 1, - BDA_MOD_32QAM, - BDA_MOD_64QAM, - BDA_MOD_80QAM, - BDA_MOD_96QAM, - BDA_MOD_112QAM, - BDA_MOD_128QAM, - BDA_MOD_160QAM, - BDA_MOD_192QAM, - BDA_MOD_224QAM, - BDA_MOD_256QAM, - BDA_MOD_320QAM, - BDA_MOD_384QAM, - BDA_MOD_448QAM, - BDA_MOD_512QAM, - BDA_MOD_640QAM, - BDA_MOD_768QAM, - BDA_MOD_896QAM, - BDA_MOD_1024QAM, - BDA_MOD_QPSK, - BDA_MOD_BPSK, - BDA_MOD_OQPSK, - BDA_MOD_8VSB, - BDA_MOD_16VSB, - BDA_MOD_ANALOG_AMPLITUDE, // std am - BDA_MOD_ANALOG_FREQUENCY, // std fm - BDA_MOD_MAX, - } ModulationType; - - typedef V1_ENUM enum SpectralInversion { - BDA_SPECTRAL_INVERSION_NOT_SET = -1, - BDA_SPECTRAL_INVERSION_NOT_DEFINED = 0, - BDA_SPECTRAL_INVERSION_AUTOMATIC = 1, - BDA_SPECTRAL_INVERSION_NORMAL, - BDA_SPECTRAL_INVERSION_INVERTED, - BDA_SPECTRAL_INVERSION_MAX - } SpectralInversion; - - typedef V1_ENUM enum Polarisation { - BDA_POLARISATION_NOT_SET = -1, - BDA_POLARISATION_NOT_DEFINED = 0, - BDA_POLARISATION_LINEAR_H = 1, // Linear horizontal polarisation - BDA_POLARISATION_LINEAR_V, // Linear vertical polarisation - BDA_POLARISATION_CIRCULAR_L, // Circular left polarisation - BDA_POLARISATION_CIRCULAR_R, // Circular right polarisation - BDA_POLARISATION_MAX, - } Polarisation; - - typedef V1_ENUM enum GuardInterval { - BDA_GUARD_NOT_SET = -1, - BDA_GUARD_NOT_DEFINED = 0, - BDA_GUARD_1_32 = 1, // Guard interval is 1/32 - BDA_GUARD_1_16, // Guard interval is 1/16 - BDA_GUARD_1_8, // Guard interval is 1/8 - BDA_GUARD_1_4, // Guard interval is 1/4 - BDA_GUARD_MAX, - } GuardInterval; - - typedef V1_ENUM enum HierarchyAlpha { - BDA_HALPHA_NOT_SET = -1, - BDA_HALPHA_NOT_DEFINED = 0, - BDA_HALPHA_1 = 1, // Hierarchy alpha is 1. - BDA_HALPHA_2, // Hierarchy alpha is 2. - BDA_HALPHA_4, // Hierarchy alpha is 4. - BDA_HALPHA_MAX, - } HierarchyAlpha; - - typedef V1_ENUM enum TransmissionMode { - BDA_XMIT_MODE_NOT_SET = -1, - BDA_XMIT_MODE_NOT_DEFINED = 0, - BDA_XMIT_MODE_2K = 1, // Transmission uses 1705 carriers (use a 2K FFT) - BDA_XMIT_MODE_8K, // Transmission uses 6817 carriers (use an 8K FFT) - BDA_XMIT_MODE_MAX, - } TransmissionMode; - - - -#endif // DirectX 8.0 content - - -#endif // not defined _BDATYPES_ - -// end of file -- bdatypes.h diff --git a/import/DirectX8/include/comlite.h b/import/DirectX8/include/comlite.h deleted file mode 100644 index 5fc919323..000000000 --- a/import/DirectX8/include/comlite.h +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// File: COMLite.h -// -// Desc: This header file is to provide a migration path for users of -// ActiveMovie betas 1 and 2. -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef _INC_COMLITE_ -#define _INC_COMLITE_ - -#define QzInitialize CoInitialize -#define QzUninitialize CoUninitialize -#define QzFreeUnusedLibraries CoFreeUnusedLibraries - -#define QzGetMalloc CoGetMalloc -#define QzTaskMemAlloc CoTaskMemAlloc -#define QzTaskMemRealloc CoTaskMemRealloc -#define QzTaskMemFree CoTaskMemFree -#define QzCreateFilterObject CoCreateInstance -#define QzCLSIDFromString CLSIDFromString -#define QzStringFromGUID2 StringFromGUID2 - -#endif // _INC_COMLITE_ diff --git a/import/DirectX8/include/control.h b/import/DirectX8/include/control.h deleted file mode 100644 index 6149244df..000000000 --- a/import/DirectX8/include/control.h +++ /dev/null @@ -1,5544 +0,0 @@ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 6.00.0347 */ -/* Compiler settings for control.odl: - Oicf, W0, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - - -#ifndef __control_h__ -#define __control_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __IAMCollection_FWD_DEFINED__ -#define __IAMCollection_FWD_DEFINED__ -typedef interface IAMCollection IAMCollection; -#endif /* __IAMCollection_FWD_DEFINED__ */ - - -#ifndef __IMediaControl_FWD_DEFINED__ -#define __IMediaControl_FWD_DEFINED__ -typedef interface IMediaControl IMediaControl; -#endif /* __IMediaControl_FWD_DEFINED__ */ - - -#ifndef __IMediaEvent_FWD_DEFINED__ -#define __IMediaEvent_FWD_DEFINED__ -typedef interface IMediaEvent IMediaEvent; -#endif /* __IMediaEvent_FWD_DEFINED__ */ - - -#ifndef __IMediaEventEx_FWD_DEFINED__ -#define __IMediaEventEx_FWD_DEFINED__ -typedef interface IMediaEventEx IMediaEventEx; -#endif /* __IMediaEventEx_FWD_DEFINED__ */ - - -#ifndef __IMediaPosition_FWD_DEFINED__ -#define __IMediaPosition_FWD_DEFINED__ -typedef interface IMediaPosition IMediaPosition; -#endif /* __IMediaPosition_FWD_DEFINED__ */ - - -#ifndef __IBasicAudio_FWD_DEFINED__ -#define __IBasicAudio_FWD_DEFINED__ -typedef interface IBasicAudio IBasicAudio; -#endif /* __IBasicAudio_FWD_DEFINED__ */ - - -#ifndef __IVideoWindow_FWD_DEFINED__ -#define __IVideoWindow_FWD_DEFINED__ -typedef interface IVideoWindow IVideoWindow; -#endif /* __IVideoWindow_FWD_DEFINED__ */ - - -#ifndef __IBasicVideo_FWD_DEFINED__ -#define __IBasicVideo_FWD_DEFINED__ -typedef interface IBasicVideo IBasicVideo; -#endif /* __IBasicVideo_FWD_DEFINED__ */ - - -#ifndef __IBasicVideo2_FWD_DEFINED__ -#define __IBasicVideo2_FWD_DEFINED__ -typedef interface IBasicVideo2 IBasicVideo2; -#endif /* __IBasicVideo2_FWD_DEFINED__ */ - - -#ifndef __IDeferredCommand_FWD_DEFINED__ -#define __IDeferredCommand_FWD_DEFINED__ -typedef interface IDeferredCommand IDeferredCommand; -#endif /* __IDeferredCommand_FWD_DEFINED__ */ - - -#ifndef __IQueueCommand_FWD_DEFINED__ -#define __IQueueCommand_FWD_DEFINED__ -typedef interface IQueueCommand IQueueCommand; -#endif /* __IQueueCommand_FWD_DEFINED__ */ - - -#ifndef __FilgraphManager_FWD_DEFINED__ -#define __FilgraphManager_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class FilgraphManager FilgraphManager; -#else -typedef struct FilgraphManager FilgraphManager; -#endif /* __cplusplus */ - -#endif /* __FilgraphManager_FWD_DEFINED__ */ - - -#ifndef __IFilterInfo_FWD_DEFINED__ -#define __IFilterInfo_FWD_DEFINED__ -typedef interface IFilterInfo IFilterInfo; -#endif /* __IFilterInfo_FWD_DEFINED__ */ - - -#ifndef __IRegFilterInfo_FWD_DEFINED__ -#define __IRegFilterInfo_FWD_DEFINED__ -typedef interface IRegFilterInfo IRegFilterInfo; -#endif /* __IRegFilterInfo_FWD_DEFINED__ */ - - -#ifndef __IMediaTypeInfo_FWD_DEFINED__ -#define __IMediaTypeInfo_FWD_DEFINED__ -typedef interface IMediaTypeInfo IMediaTypeInfo; -#endif /* __IMediaTypeInfo_FWD_DEFINED__ */ - - -#ifndef __IPinInfo_FWD_DEFINED__ -#define __IPinInfo_FWD_DEFINED__ -typedef interface IPinInfo IPinInfo; -#endif /* __IPinInfo_FWD_DEFINED__ */ - - -#ifndef __IAMStats_FWD_DEFINED__ -#define __IAMStats_FWD_DEFINED__ -typedef interface IAMStats IAMStats; -#endif /* __IAMStats_FWD_DEFINED__ */ - - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void * ); - - -#ifndef __QuartzTypeLib_LIBRARY_DEFINED__ -#define __QuartzTypeLib_LIBRARY_DEFINED__ - -/* library QuartzTypeLib */ -/* [version][lcid][helpstring][uuid] */ - -typedef double REFTIME; - -typedef LONG_PTR OAEVENT; - -typedef LONG_PTR OAHWND; - -typedef long OAFilterState; - - -DEFINE_GUID(LIBID_QuartzTypeLib,0x56a868b0,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#ifndef __IAMCollection_INTERFACE_DEFINED__ -#define __IAMCollection_INTERFACE_DEFINED__ - -/* interface IAMCollection */ -/* [object][dual][oleautomation][helpstring][uuid] */ - - -DEFINE_GUID(IID_IAMCollection,0x56a868b9,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868b9-0ad4-11ce-b03a-0020af0ba770") - IAMCollection : public IDispatch - { - public: - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Count( - /* [retval][out] */ LONG *plCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE Item( - /* [in] */ long lItem, - /* [out] */ IUnknown **ppUnk) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( - /* [retval][out] */ IUnknown **ppUnk) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMCollectionVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMCollection * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMCollection * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMCollection * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IAMCollection * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IAMCollection * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IAMCollection * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IAMCollection * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( - IAMCollection * This, - /* [retval][out] */ LONG *plCount); - - HRESULT ( STDMETHODCALLTYPE *Item )( - IAMCollection * This, - /* [in] */ long lItem, - /* [out] */ IUnknown **ppUnk); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( - IAMCollection * This, - /* [retval][out] */ IUnknown **ppUnk); - - END_INTERFACE - } IAMCollectionVtbl; - - interface IAMCollection - { - CONST_VTBL struct IAMCollectionVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMCollection_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMCollection_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMCollection_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMCollection_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IAMCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IAMCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IAMCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IAMCollection_get_Count(This,plCount) \ - (This)->lpVtbl -> get_Count(This,plCount) - -#define IAMCollection_Item(This,lItem,ppUnk) \ - (This)->lpVtbl -> Item(This,lItem,ppUnk) - -#define IAMCollection_get__NewEnum(This,ppUnk) \ - (This)->lpVtbl -> get__NewEnum(This,ppUnk) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IAMCollection_get_Count_Proxy( - IAMCollection * This, - /* [retval][out] */ LONG *plCount); - - -void __RPC_STUB IAMCollection_get_Count_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMCollection_Item_Proxy( - IAMCollection * This, - /* [in] */ long lItem, - /* [out] */ IUnknown **ppUnk); - - -void __RPC_STUB IAMCollection_Item_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IAMCollection_get__NewEnum_Proxy( - IAMCollection * This, - /* [retval][out] */ IUnknown **ppUnk); - - -void __RPC_STUB IAMCollection_get__NewEnum_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMCollection_INTERFACE_DEFINED__ */ - - -#ifndef __IMediaControl_INTERFACE_DEFINED__ -#define __IMediaControl_INTERFACE_DEFINED__ - -/* interface IMediaControl */ -/* [object][dual][oleautomation][helpstring][uuid] */ - - -DEFINE_GUID(IID_IMediaControl,0x56a868b1,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868b1-0ad4-11ce-b03a-0020af0ba770") - IMediaControl : public IDispatch - { - public: - virtual HRESULT STDMETHODCALLTYPE Run( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Pause( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Stop( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetState( - /* [in] */ LONG msTimeout, - /* [out] */ OAFilterState *pfs) = 0; - - virtual HRESULT STDMETHODCALLTYPE RenderFile( - /* [in] */ BSTR strFilename) = 0; - - virtual HRESULT STDMETHODCALLTYPE AddSourceFilter( - /* [in] */ BSTR strFilename, - /* [out] */ IDispatch **ppUnk) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_FilterCollection( - /* [retval][out] */ IDispatch **ppUnk) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RegFilterCollection( - /* [retval][out] */ IDispatch **ppUnk) = 0; - - virtual HRESULT STDMETHODCALLTYPE StopWhenReady( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaControlVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaControl * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaControl * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IMediaControl * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IMediaControl * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IMediaControl * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IMediaControl * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - HRESULT ( STDMETHODCALLTYPE *Run )( - IMediaControl * This); - - HRESULT ( STDMETHODCALLTYPE *Pause )( - IMediaControl * This); - - HRESULT ( STDMETHODCALLTYPE *Stop )( - IMediaControl * This); - - HRESULT ( STDMETHODCALLTYPE *GetState )( - IMediaControl * This, - /* [in] */ LONG msTimeout, - /* [out] */ OAFilterState *pfs); - - HRESULT ( STDMETHODCALLTYPE *RenderFile )( - IMediaControl * This, - /* [in] */ BSTR strFilename); - - HRESULT ( STDMETHODCALLTYPE *AddSourceFilter )( - IMediaControl * This, - /* [in] */ BSTR strFilename, - /* [out] */ IDispatch **ppUnk); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FilterCollection )( - IMediaControl * This, - /* [retval][out] */ IDispatch **ppUnk); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RegFilterCollection )( - IMediaControl * This, - /* [retval][out] */ IDispatch **ppUnk); - - HRESULT ( STDMETHODCALLTYPE *StopWhenReady )( - IMediaControl * This); - - END_INTERFACE - } IMediaControlVtbl; - - interface IMediaControl - { - CONST_VTBL struct IMediaControlVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaControl_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaControl_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaControl_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaControl_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IMediaControl_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IMediaControl_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IMediaControl_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IMediaControl_Run(This) \ - (This)->lpVtbl -> Run(This) - -#define IMediaControl_Pause(This) \ - (This)->lpVtbl -> Pause(This) - -#define IMediaControl_Stop(This) \ - (This)->lpVtbl -> Stop(This) - -#define IMediaControl_GetState(This,msTimeout,pfs) \ - (This)->lpVtbl -> GetState(This,msTimeout,pfs) - -#define IMediaControl_RenderFile(This,strFilename) \ - (This)->lpVtbl -> RenderFile(This,strFilename) - -#define IMediaControl_AddSourceFilter(This,strFilename,ppUnk) \ - (This)->lpVtbl -> AddSourceFilter(This,strFilename,ppUnk) - -#define IMediaControl_get_FilterCollection(This,ppUnk) \ - (This)->lpVtbl -> get_FilterCollection(This,ppUnk) - -#define IMediaControl_get_RegFilterCollection(This,ppUnk) \ - (This)->lpVtbl -> get_RegFilterCollection(This,ppUnk) - -#define IMediaControl_StopWhenReady(This) \ - (This)->lpVtbl -> StopWhenReady(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaControl_Run_Proxy( - IMediaControl * This); - - -void __RPC_STUB IMediaControl_Run_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaControl_Pause_Proxy( - IMediaControl * This); - - -void __RPC_STUB IMediaControl_Pause_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaControl_Stop_Proxy( - IMediaControl * This); - - -void __RPC_STUB IMediaControl_Stop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaControl_GetState_Proxy( - IMediaControl * This, - /* [in] */ LONG msTimeout, - /* [out] */ OAFilterState *pfs); - - -void __RPC_STUB IMediaControl_GetState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaControl_RenderFile_Proxy( - IMediaControl * This, - /* [in] */ BSTR strFilename); - - -void __RPC_STUB IMediaControl_RenderFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaControl_AddSourceFilter_Proxy( - IMediaControl * This, - /* [in] */ BSTR strFilename, - /* [out] */ IDispatch **ppUnk); - - -void __RPC_STUB IMediaControl_AddSourceFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IMediaControl_get_FilterCollection_Proxy( - IMediaControl * This, - /* [retval][out] */ IDispatch **ppUnk); - - -void __RPC_STUB IMediaControl_get_FilterCollection_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IMediaControl_get_RegFilterCollection_Proxy( - IMediaControl * This, - /* [retval][out] */ IDispatch **ppUnk); - - -void __RPC_STUB IMediaControl_get_RegFilterCollection_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaControl_StopWhenReady_Proxy( - IMediaControl * This); - - -void __RPC_STUB IMediaControl_StopWhenReady_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaControl_INTERFACE_DEFINED__ */ - - -#ifndef __IMediaEvent_INTERFACE_DEFINED__ -#define __IMediaEvent_INTERFACE_DEFINED__ - -/* interface IMediaEvent */ -/* [object][dual][oleautomation][helpstring][uuid] */ - - -DEFINE_GUID(IID_IMediaEvent,0x56a868b6,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868b6-0ad4-11ce-b03a-0020af0ba770") - IMediaEvent : public IDispatch - { - public: - virtual HRESULT STDMETHODCALLTYPE GetEventHandle( - /* [out] */ OAEVENT *hEvent) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetEvent( - /* [out] */ long *lEventCode, - /* [out] */ LONG_PTR *lParam1, - /* [out] */ LONG_PTR *lParam2, - /* [in] */ long msTimeout) = 0; - - virtual HRESULT STDMETHODCALLTYPE WaitForCompletion( - /* [in] */ long msTimeout, - /* [out] */ long *pEvCode) = 0; - - virtual HRESULT STDMETHODCALLTYPE CancelDefaultHandling( - /* [in] */ long lEvCode) = 0; - - virtual HRESULT STDMETHODCALLTYPE RestoreDefaultHandling( - /* [in] */ long lEvCode) = 0; - - virtual HRESULT STDMETHODCALLTYPE FreeEventParams( - /* [in] */ long lEvCode, - /* [in] */ LONG_PTR lParam1, - /* [in] */ LONG_PTR lParam2) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaEventVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaEvent * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaEvent * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaEvent * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IMediaEvent * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IMediaEvent * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IMediaEvent * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IMediaEvent * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - HRESULT ( STDMETHODCALLTYPE *GetEventHandle )( - IMediaEvent * This, - /* [out] */ OAEVENT *hEvent); - - HRESULT ( STDMETHODCALLTYPE *GetEvent )( - IMediaEvent * This, - /* [out] */ long *lEventCode, - /* [out] */ LONG_PTR *lParam1, - /* [out] */ LONG_PTR *lParam2, - /* [in] */ long msTimeout); - - HRESULT ( STDMETHODCALLTYPE *WaitForCompletion )( - IMediaEvent * This, - /* [in] */ long msTimeout, - /* [out] */ long *pEvCode); - - HRESULT ( STDMETHODCALLTYPE *CancelDefaultHandling )( - IMediaEvent * This, - /* [in] */ long lEvCode); - - HRESULT ( STDMETHODCALLTYPE *RestoreDefaultHandling )( - IMediaEvent * This, - /* [in] */ long lEvCode); - - HRESULT ( STDMETHODCALLTYPE *FreeEventParams )( - IMediaEvent * This, - /* [in] */ long lEvCode, - /* [in] */ LONG_PTR lParam1, - /* [in] */ LONG_PTR lParam2); - - END_INTERFACE - } IMediaEventVtbl; - - interface IMediaEvent - { - CONST_VTBL struct IMediaEventVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaEvent_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaEvent_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaEvent_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaEvent_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IMediaEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IMediaEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IMediaEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IMediaEvent_GetEventHandle(This,hEvent) \ - (This)->lpVtbl -> GetEventHandle(This,hEvent) - -#define IMediaEvent_GetEvent(This,lEventCode,lParam1,lParam2,msTimeout) \ - (This)->lpVtbl -> GetEvent(This,lEventCode,lParam1,lParam2,msTimeout) - -#define IMediaEvent_WaitForCompletion(This,msTimeout,pEvCode) \ - (This)->lpVtbl -> WaitForCompletion(This,msTimeout,pEvCode) - -#define IMediaEvent_CancelDefaultHandling(This,lEvCode) \ - (This)->lpVtbl -> CancelDefaultHandling(This,lEvCode) - -#define IMediaEvent_RestoreDefaultHandling(This,lEvCode) \ - (This)->lpVtbl -> RestoreDefaultHandling(This,lEvCode) - -#define IMediaEvent_FreeEventParams(This,lEvCode,lParam1,lParam2) \ - (This)->lpVtbl -> FreeEventParams(This,lEvCode,lParam1,lParam2) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaEvent_GetEventHandle_Proxy( - IMediaEvent * This, - /* [out] */ OAEVENT *hEvent); - - -void __RPC_STUB IMediaEvent_GetEventHandle_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaEvent_GetEvent_Proxy( - IMediaEvent * This, - /* [out] */ long *lEventCode, - /* [out] */ LONG_PTR *lParam1, - /* [out] */ LONG_PTR *lParam2, - /* [in] */ long msTimeout); - - -void __RPC_STUB IMediaEvent_GetEvent_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaEvent_WaitForCompletion_Proxy( - IMediaEvent * This, - /* [in] */ long msTimeout, - /* [out] */ long *pEvCode); - - -void __RPC_STUB IMediaEvent_WaitForCompletion_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaEvent_CancelDefaultHandling_Proxy( - IMediaEvent * This, - /* [in] */ long lEvCode); - - -void __RPC_STUB IMediaEvent_CancelDefaultHandling_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaEvent_RestoreDefaultHandling_Proxy( - IMediaEvent * This, - /* [in] */ long lEvCode); - - -void __RPC_STUB IMediaEvent_RestoreDefaultHandling_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaEvent_FreeEventParams_Proxy( - IMediaEvent * This, - /* [in] */ long lEvCode, - /* [in] */ LONG_PTR lParam1, - /* [in] */ LONG_PTR lParam2); - - -void __RPC_STUB IMediaEvent_FreeEventParams_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaEvent_INTERFACE_DEFINED__ */ - - -#ifndef __IMediaEventEx_INTERFACE_DEFINED__ -#define __IMediaEventEx_INTERFACE_DEFINED__ - -/* interface IMediaEventEx */ -/* [object][helpstring][uuid] */ - - -DEFINE_GUID(IID_IMediaEventEx,0x56a868c0,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868c0-0ad4-11ce-b03a-0020af0ba770") - IMediaEventEx : public IMediaEvent - { - public: - virtual HRESULT STDMETHODCALLTYPE SetNotifyWindow( - /* [in] */ OAHWND hwnd, - /* [in] */ long lMsg, - /* [in] */ LONG_PTR lInstanceData) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetNotifyFlags( - /* [in] */ long lNoNotifyFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNotifyFlags( - /* [out] */ long *lplNoNotifyFlags) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaEventExVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaEventEx * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaEventEx * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaEventEx * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IMediaEventEx * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IMediaEventEx * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IMediaEventEx * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IMediaEventEx * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - HRESULT ( STDMETHODCALLTYPE *GetEventHandle )( - IMediaEventEx * This, - /* [out] */ OAEVENT *hEvent); - - HRESULT ( STDMETHODCALLTYPE *GetEvent )( - IMediaEventEx * This, - /* [out] */ long *lEventCode, - /* [out] */ LONG_PTR *lParam1, - /* [out] */ LONG_PTR *lParam2, - /* [in] */ long msTimeout); - - HRESULT ( STDMETHODCALLTYPE *WaitForCompletion )( - IMediaEventEx * This, - /* [in] */ long msTimeout, - /* [out] */ long *pEvCode); - - HRESULT ( STDMETHODCALLTYPE *CancelDefaultHandling )( - IMediaEventEx * This, - /* [in] */ long lEvCode); - - HRESULT ( STDMETHODCALLTYPE *RestoreDefaultHandling )( - IMediaEventEx * This, - /* [in] */ long lEvCode); - - HRESULT ( STDMETHODCALLTYPE *FreeEventParams )( - IMediaEventEx * This, - /* [in] */ long lEvCode, - /* [in] */ LONG_PTR lParam1, - /* [in] */ LONG_PTR lParam2); - - HRESULT ( STDMETHODCALLTYPE *SetNotifyWindow )( - IMediaEventEx * This, - /* [in] */ OAHWND hwnd, - /* [in] */ long lMsg, - /* [in] */ LONG_PTR lInstanceData); - - HRESULT ( STDMETHODCALLTYPE *SetNotifyFlags )( - IMediaEventEx * This, - /* [in] */ long lNoNotifyFlags); - - HRESULT ( STDMETHODCALLTYPE *GetNotifyFlags )( - IMediaEventEx * This, - /* [out] */ long *lplNoNotifyFlags); - - END_INTERFACE - } IMediaEventExVtbl; - - interface IMediaEventEx - { - CONST_VTBL struct IMediaEventExVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaEventEx_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaEventEx_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaEventEx_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaEventEx_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IMediaEventEx_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IMediaEventEx_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IMediaEventEx_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IMediaEventEx_GetEventHandle(This,hEvent) \ - (This)->lpVtbl -> GetEventHandle(This,hEvent) - -#define IMediaEventEx_GetEvent(This,lEventCode,lParam1,lParam2,msTimeout) \ - (This)->lpVtbl -> GetEvent(This,lEventCode,lParam1,lParam2,msTimeout) - -#define IMediaEventEx_WaitForCompletion(This,msTimeout,pEvCode) \ - (This)->lpVtbl -> WaitForCompletion(This,msTimeout,pEvCode) - -#define IMediaEventEx_CancelDefaultHandling(This,lEvCode) \ - (This)->lpVtbl -> CancelDefaultHandling(This,lEvCode) - -#define IMediaEventEx_RestoreDefaultHandling(This,lEvCode) \ - (This)->lpVtbl -> RestoreDefaultHandling(This,lEvCode) - -#define IMediaEventEx_FreeEventParams(This,lEvCode,lParam1,lParam2) \ - (This)->lpVtbl -> FreeEventParams(This,lEvCode,lParam1,lParam2) - - -#define IMediaEventEx_SetNotifyWindow(This,hwnd,lMsg,lInstanceData) \ - (This)->lpVtbl -> SetNotifyWindow(This,hwnd,lMsg,lInstanceData) - -#define IMediaEventEx_SetNotifyFlags(This,lNoNotifyFlags) \ - (This)->lpVtbl -> SetNotifyFlags(This,lNoNotifyFlags) - -#define IMediaEventEx_GetNotifyFlags(This,lplNoNotifyFlags) \ - (This)->lpVtbl -> GetNotifyFlags(This,lplNoNotifyFlags) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaEventEx_SetNotifyWindow_Proxy( - IMediaEventEx * This, - /* [in] */ OAHWND hwnd, - /* [in] */ long lMsg, - /* [in] */ LONG_PTR lInstanceData); - - -void __RPC_STUB IMediaEventEx_SetNotifyWindow_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaEventEx_SetNotifyFlags_Proxy( - IMediaEventEx * This, - /* [in] */ long lNoNotifyFlags); - - -void __RPC_STUB IMediaEventEx_SetNotifyFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaEventEx_GetNotifyFlags_Proxy( - IMediaEventEx * This, - /* [out] */ long *lplNoNotifyFlags); - - -void __RPC_STUB IMediaEventEx_GetNotifyFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaEventEx_INTERFACE_DEFINED__ */ - - -#ifndef __IMediaPosition_INTERFACE_DEFINED__ -#define __IMediaPosition_INTERFACE_DEFINED__ - -/* interface IMediaPosition */ -/* [object][dual][oleautomation][helpstring][uuid] */ - - -DEFINE_GUID(IID_IMediaPosition,0x56a868b2,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868b2-0ad4-11ce-b03a-0020af0ba770") - IMediaPosition : public IDispatch - { - public: - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Duration( - /* [retval][out] */ REFTIME *plength) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_CurrentPosition( - /* [in] */ REFTIME llTime) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CurrentPosition( - /* [retval][out] */ REFTIME *pllTime) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_StopTime( - /* [retval][out] */ REFTIME *pllTime) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_StopTime( - /* [in] */ REFTIME llTime) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PrerollTime( - /* [retval][out] */ REFTIME *pllTime) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_PrerollTime( - /* [in] */ REFTIME llTime) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Rate( - /* [in] */ double dRate) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Rate( - /* [retval][out] */ double *pdRate) = 0; - - virtual HRESULT STDMETHODCALLTYPE CanSeekForward( - /* [retval][out] */ LONG *pCanSeekForward) = 0; - - virtual HRESULT STDMETHODCALLTYPE CanSeekBackward( - /* [retval][out] */ LONG *pCanSeekBackward) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaPositionVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaPosition * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaPosition * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaPosition * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IMediaPosition * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IMediaPosition * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IMediaPosition * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IMediaPosition * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Duration )( - IMediaPosition * This, - /* [retval][out] */ REFTIME *plength); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CurrentPosition )( - IMediaPosition * This, - /* [in] */ REFTIME llTime); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CurrentPosition )( - IMediaPosition * This, - /* [retval][out] */ REFTIME *pllTime); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_StopTime )( - IMediaPosition * This, - /* [retval][out] */ REFTIME *pllTime); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_StopTime )( - IMediaPosition * This, - /* [in] */ REFTIME llTime); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrerollTime )( - IMediaPosition * This, - /* [retval][out] */ REFTIME *pllTime); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PrerollTime )( - IMediaPosition * This, - /* [in] */ REFTIME llTime); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Rate )( - IMediaPosition * This, - /* [in] */ double dRate); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Rate )( - IMediaPosition * This, - /* [retval][out] */ double *pdRate); - - HRESULT ( STDMETHODCALLTYPE *CanSeekForward )( - IMediaPosition * This, - /* [retval][out] */ LONG *pCanSeekForward); - - HRESULT ( STDMETHODCALLTYPE *CanSeekBackward )( - IMediaPosition * This, - /* [retval][out] */ LONG *pCanSeekBackward); - - END_INTERFACE - } IMediaPositionVtbl; - - interface IMediaPosition - { - CONST_VTBL struct IMediaPositionVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaPosition_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaPosition_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaPosition_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaPosition_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IMediaPosition_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IMediaPosition_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IMediaPosition_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IMediaPosition_get_Duration(This,plength) \ - (This)->lpVtbl -> get_Duration(This,plength) - -#define IMediaPosition_put_CurrentPosition(This,llTime) \ - (This)->lpVtbl -> put_CurrentPosition(This,llTime) - -#define IMediaPosition_get_CurrentPosition(This,pllTime) \ - (This)->lpVtbl -> get_CurrentPosition(This,pllTime) - -#define IMediaPosition_get_StopTime(This,pllTime) \ - (This)->lpVtbl -> get_StopTime(This,pllTime) - -#define IMediaPosition_put_StopTime(This,llTime) \ - (This)->lpVtbl -> put_StopTime(This,llTime) - -#define IMediaPosition_get_PrerollTime(This,pllTime) \ - (This)->lpVtbl -> get_PrerollTime(This,pllTime) - -#define IMediaPosition_put_PrerollTime(This,llTime) \ - (This)->lpVtbl -> put_PrerollTime(This,llTime) - -#define IMediaPosition_put_Rate(This,dRate) \ - (This)->lpVtbl -> put_Rate(This,dRate) - -#define IMediaPosition_get_Rate(This,pdRate) \ - (This)->lpVtbl -> get_Rate(This,pdRate) - -#define IMediaPosition_CanSeekForward(This,pCanSeekForward) \ - (This)->lpVtbl -> CanSeekForward(This,pCanSeekForward) - -#define IMediaPosition_CanSeekBackward(This,pCanSeekBackward) \ - (This)->lpVtbl -> CanSeekBackward(This,pCanSeekBackward) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IMediaPosition_get_Duration_Proxy( - IMediaPosition * This, - /* [retval][out] */ REFTIME *plength); - - -void __RPC_STUB IMediaPosition_get_Duration_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IMediaPosition_put_CurrentPosition_Proxy( - IMediaPosition * This, - /* [in] */ REFTIME llTime); - - -void __RPC_STUB IMediaPosition_put_CurrentPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IMediaPosition_get_CurrentPosition_Proxy( - IMediaPosition * This, - /* [retval][out] */ REFTIME *pllTime); - - -void __RPC_STUB IMediaPosition_get_CurrentPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IMediaPosition_get_StopTime_Proxy( - IMediaPosition * This, - /* [retval][out] */ REFTIME *pllTime); - - -void __RPC_STUB IMediaPosition_get_StopTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IMediaPosition_put_StopTime_Proxy( - IMediaPosition * This, - /* [in] */ REFTIME llTime); - - -void __RPC_STUB IMediaPosition_put_StopTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IMediaPosition_get_PrerollTime_Proxy( - IMediaPosition * This, - /* [retval][out] */ REFTIME *pllTime); - - -void __RPC_STUB IMediaPosition_get_PrerollTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IMediaPosition_put_PrerollTime_Proxy( - IMediaPosition * This, - /* [in] */ REFTIME llTime); - - -void __RPC_STUB IMediaPosition_put_PrerollTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IMediaPosition_put_Rate_Proxy( - IMediaPosition * This, - /* [in] */ double dRate); - - -void __RPC_STUB IMediaPosition_put_Rate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IMediaPosition_get_Rate_Proxy( - IMediaPosition * This, - /* [retval][out] */ double *pdRate); - - -void __RPC_STUB IMediaPosition_get_Rate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaPosition_CanSeekForward_Proxy( - IMediaPosition * This, - /* [retval][out] */ LONG *pCanSeekForward); - - -void __RPC_STUB IMediaPosition_CanSeekForward_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaPosition_CanSeekBackward_Proxy( - IMediaPosition * This, - /* [retval][out] */ LONG *pCanSeekBackward); - - -void __RPC_STUB IMediaPosition_CanSeekBackward_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaPosition_INTERFACE_DEFINED__ */ - - -#ifndef __IBasicAudio_INTERFACE_DEFINED__ -#define __IBasicAudio_INTERFACE_DEFINED__ - -/* interface IBasicAudio */ -/* [object][dual][oleautomation][helpstring][uuid] */ - - -DEFINE_GUID(IID_IBasicAudio,0x56a868b3,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868b3-0ad4-11ce-b03a-0020af0ba770") - IBasicAudio : public IDispatch - { - public: - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Volume( - /* [in] */ long lVolume) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Volume( - /* [retval][out] */ long *plVolume) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Balance( - /* [in] */ long lBalance) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Balance( - /* [retval][out] */ long *plBalance) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBasicAudioVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBasicAudio * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBasicAudio * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBasicAudio * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IBasicAudio * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IBasicAudio * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IBasicAudio * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IBasicAudio * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Volume )( - IBasicAudio * This, - /* [in] */ long lVolume); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Volume )( - IBasicAudio * This, - /* [retval][out] */ long *plVolume); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Balance )( - IBasicAudio * This, - /* [in] */ long lBalance); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Balance )( - IBasicAudio * This, - /* [retval][out] */ long *plBalance); - - END_INTERFACE - } IBasicAudioVtbl; - - interface IBasicAudio - { - CONST_VTBL struct IBasicAudioVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBasicAudio_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBasicAudio_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBasicAudio_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBasicAudio_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IBasicAudio_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IBasicAudio_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IBasicAudio_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IBasicAudio_put_Volume(This,lVolume) \ - (This)->lpVtbl -> put_Volume(This,lVolume) - -#define IBasicAudio_get_Volume(This,plVolume) \ - (This)->lpVtbl -> get_Volume(This,plVolume) - -#define IBasicAudio_put_Balance(This,lBalance) \ - (This)->lpVtbl -> put_Balance(This,lBalance) - -#define IBasicAudio_get_Balance(This,plBalance) \ - (This)->lpVtbl -> get_Balance(This,plBalance) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IBasicAudio_put_Volume_Proxy( - IBasicAudio * This, - /* [in] */ long lVolume); - - -void __RPC_STUB IBasicAudio_put_Volume_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IBasicAudio_get_Volume_Proxy( - IBasicAudio * This, - /* [retval][out] */ long *plVolume); - - -void __RPC_STUB IBasicAudio_get_Volume_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IBasicAudio_put_Balance_Proxy( - IBasicAudio * This, - /* [in] */ long lBalance); - - -void __RPC_STUB IBasicAudio_put_Balance_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IBasicAudio_get_Balance_Proxy( - IBasicAudio * This, - /* [retval][out] */ long *plBalance); - - -void __RPC_STUB IBasicAudio_get_Balance_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBasicAudio_INTERFACE_DEFINED__ */ - - -#ifndef __IVideoWindow_INTERFACE_DEFINED__ -#define __IVideoWindow_INTERFACE_DEFINED__ - -/* interface IVideoWindow */ -/* [object][dual][oleautomation][helpstring][uuid] */ - - -DEFINE_GUID(IID_IVideoWindow,0x56a868b4,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868b4-0ad4-11ce-b03a-0020af0ba770") - IVideoWindow : public IDispatch - { - public: - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Caption( - /* [in] */ BSTR strCaption) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Caption( - /* [retval][out] */ BSTR *strCaption) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_WindowStyle( - /* [in] */ long WindowStyle) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_WindowStyle( - /* [retval][out] */ long *WindowStyle) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_WindowStyleEx( - /* [in] */ long WindowStyleEx) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_WindowStyleEx( - /* [retval][out] */ long *WindowStyleEx) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AutoShow( - /* [in] */ long AutoShow) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AutoShow( - /* [retval][out] */ long *AutoShow) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_WindowState( - /* [in] */ long WindowState) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_WindowState( - /* [retval][out] */ long *WindowState) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_BackgroundPalette( - /* [in] */ long BackgroundPalette) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_BackgroundPalette( - /* [retval][out] */ long *pBackgroundPalette) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Visible( - /* [in] */ long Visible) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Visible( - /* [retval][out] */ long *pVisible) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Left( - /* [in] */ long Left) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Left( - /* [retval][out] */ long *pLeft) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Width( - /* [in] */ long Width) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Width( - /* [retval][out] */ long *pWidth) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Top( - /* [in] */ long Top) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Top( - /* [retval][out] */ long *pTop) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Height( - /* [in] */ long Height) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Height( - /* [retval][out] */ long *pHeight) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Owner( - /* [in] */ OAHWND Owner) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Owner( - /* [retval][out] */ OAHWND *Owner) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_MessageDrain( - /* [in] */ OAHWND Drain) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MessageDrain( - /* [retval][out] */ OAHWND *Drain) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_BorderColor( - /* [retval][out] */ long *Color) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_BorderColor( - /* [in] */ long Color) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_FullScreenMode( - /* [retval][out] */ long *FullScreenMode) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_FullScreenMode( - /* [in] */ long FullScreenMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetWindowForeground( - /* [in] */ long Focus) = 0; - - virtual HRESULT STDMETHODCALLTYPE NotifyOwnerMessage( - /* [in] */ OAHWND hwnd, - /* [in] */ long uMsg, - /* [in] */ LONG_PTR wParam, - /* [in] */ LONG_PTR lParam) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetWindowPosition( - /* [in] */ long Left, - /* [in] */ long Top, - /* [in] */ long Width, - /* [in] */ long Height) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetWindowPosition( - /* [out] */ long *pLeft, - /* [out] */ long *pTop, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMinIdealImageSize( - /* [out] */ long *pWidth, - /* [out] */ long *pHeight) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMaxIdealImageSize( - /* [out] */ long *pWidth, - /* [out] */ long *pHeight) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetRestorePosition( - /* [out] */ long *pLeft, - /* [out] */ long *pTop, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight) = 0; - - virtual HRESULT STDMETHODCALLTYPE HideCursor( - /* [in] */ long HideCursor) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsCursorHidden( - /* [out] */ long *CursorHidden) = 0; - - }; - -#else /* C style interface */ - - typedef struct IVideoWindowVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IVideoWindow * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IVideoWindow * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IVideoWindow * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IVideoWindow * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IVideoWindow * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IVideoWindow * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IVideoWindow * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Caption )( - IVideoWindow * This, - /* [in] */ BSTR strCaption); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Caption )( - IVideoWindow * This, - /* [retval][out] */ BSTR *strCaption); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_WindowStyle )( - IVideoWindow * This, - /* [in] */ long WindowStyle); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_WindowStyle )( - IVideoWindow * This, - /* [retval][out] */ long *WindowStyle); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_WindowStyleEx )( - IVideoWindow * This, - /* [in] */ long WindowStyleEx); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_WindowStyleEx )( - IVideoWindow * This, - /* [retval][out] */ long *WindowStyleEx); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AutoShow )( - IVideoWindow * This, - /* [in] */ long AutoShow); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AutoShow )( - IVideoWindow * This, - /* [retval][out] */ long *AutoShow); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_WindowState )( - IVideoWindow * This, - /* [in] */ long WindowState); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_WindowState )( - IVideoWindow * This, - /* [retval][out] */ long *WindowState); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_BackgroundPalette )( - IVideoWindow * This, - /* [in] */ long BackgroundPalette); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BackgroundPalette )( - IVideoWindow * This, - /* [retval][out] */ long *pBackgroundPalette); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Visible )( - IVideoWindow * This, - /* [in] */ long Visible); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Visible )( - IVideoWindow * This, - /* [retval][out] */ long *pVisible); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Left )( - IVideoWindow * This, - /* [in] */ long Left); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Left )( - IVideoWindow * This, - /* [retval][out] */ long *pLeft); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Width )( - IVideoWindow * This, - /* [in] */ long Width); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Width )( - IVideoWindow * This, - /* [retval][out] */ long *pWidth); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Top )( - IVideoWindow * This, - /* [in] */ long Top); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Top )( - IVideoWindow * This, - /* [retval][out] */ long *pTop); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Height )( - IVideoWindow * This, - /* [in] */ long Height); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Height )( - IVideoWindow * This, - /* [retval][out] */ long *pHeight); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Owner )( - IVideoWindow * This, - /* [in] */ OAHWND Owner); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Owner )( - IVideoWindow * This, - /* [retval][out] */ OAHWND *Owner); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_MessageDrain )( - IVideoWindow * This, - /* [in] */ OAHWND Drain); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MessageDrain )( - IVideoWindow * This, - /* [retval][out] */ OAHWND *Drain); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BorderColor )( - IVideoWindow * This, - /* [retval][out] */ long *Color); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_BorderColor )( - IVideoWindow * This, - /* [in] */ long Color); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FullScreenMode )( - IVideoWindow * This, - /* [retval][out] */ long *FullScreenMode); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_FullScreenMode )( - IVideoWindow * This, - /* [in] */ long FullScreenMode); - - HRESULT ( STDMETHODCALLTYPE *SetWindowForeground )( - IVideoWindow * This, - /* [in] */ long Focus); - - HRESULT ( STDMETHODCALLTYPE *NotifyOwnerMessage )( - IVideoWindow * This, - /* [in] */ OAHWND hwnd, - /* [in] */ long uMsg, - /* [in] */ LONG_PTR wParam, - /* [in] */ LONG_PTR lParam); - - HRESULT ( STDMETHODCALLTYPE *SetWindowPosition )( - IVideoWindow * This, - /* [in] */ long Left, - /* [in] */ long Top, - /* [in] */ long Width, - /* [in] */ long Height); - - HRESULT ( STDMETHODCALLTYPE *GetWindowPosition )( - IVideoWindow * This, - /* [out] */ long *pLeft, - /* [out] */ long *pTop, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - HRESULT ( STDMETHODCALLTYPE *GetMinIdealImageSize )( - IVideoWindow * This, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - HRESULT ( STDMETHODCALLTYPE *GetMaxIdealImageSize )( - IVideoWindow * This, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - HRESULT ( STDMETHODCALLTYPE *GetRestorePosition )( - IVideoWindow * This, - /* [out] */ long *pLeft, - /* [out] */ long *pTop, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - HRESULT ( STDMETHODCALLTYPE *HideCursor )( - IVideoWindow * This, - /* [in] */ long HideCursor); - - HRESULT ( STDMETHODCALLTYPE *IsCursorHidden )( - IVideoWindow * This, - /* [out] */ long *CursorHidden); - - END_INTERFACE - } IVideoWindowVtbl; - - interface IVideoWindow - { - CONST_VTBL struct IVideoWindowVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IVideoWindow_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IVideoWindow_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IVideoWindow_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IVideoWindow_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IVideoWindow_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IVideoWindow_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IVideoWindow_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IVideoWindow_put_Caption(This,strCaption) \ - (This)->lpVtbl -> put_Caption(This,strCaption) - -#define IVideoWindow_get_Caption(This,strCaption) \ - (This)->lpVtbl -> get_Caption(This,strCaption) - -#define IVideoWindow_put_WindowStyle(This,WindowStyle) \ - (This)->lpVtbl -> put_WindowStyle(This,WindowStyle) - -#define IVideoWindow_get_WindowStyle(This,WindowStyle) \ - (This)->lpVtbl -> get_WindowStyle(This,WindowStyle) - -#define IVideoWindow_put_WindowStyleEx(This,WindowStyleEx) \ - (This)->lpVtbl -> put_WindowStyleEx(This,WindowStyleEx) - -#define IVideoWindow_get_WindowStyleEx(This,WindowStyleEx) \ - (This)->lpVtbl -> get_WindowStyleEx(This,WindowStyleEx) - -#define IVideoWindow_put_AutoShow(This,AutoShow) \ - (This)->lpVtbl -> put_AutoShow(This,AutoShow) - -#define IVideoWindow_get_AutoShow(This,AutoShow) \ - (This)->lpVtbl -> get_AutoShow(This,AutoShow) - -#define IVideoWindow_put_WindowState(This,WindowState) \ - (This)->lpVtbl -> put_WindowState(This,WindowState) - -#define IVideoWindow_get_WindowState(This,WindowState) \ - (This)->lpVtbl -> get_WindowState(This,WindowState) - -#define IVideoWindow_put_BackgroundPalette(This,BackgroundPalette) \ - (This)->lpVtbl -> put_BackgroundPalette(This,BackgroundPalette) - -#define IVideoWindow_get_BackgroundPalette(This,pBackgroundPalette) \ - (This)->lpVtbl -> get_BackgroundPalette(This,pBackgroundPalette) - -#define IVideoWindow_put_Visible(This,Visible) \ - (This)->lpVtbl -> put_Visible(This,Visible) - -#define IVideoWindow_get_Visible(This,pVisible) \ - (This)->lpVtbl -> get_Visible(This,pVisible) - -#define IVideoWindow_put_Left(This,Left) \ - (This)->lpVtbl -> put_Left(This,Left) - -#define IVideoWindow_get_Left(This,pLeft) \ - (This)->lpVtbl -> get_Left(This,pLeft) - -#define IVideoWindow_put_Width(This,Width) \ - (This)->lpVtbl -> put_Width(This,Width) - -#define IVideoWindow_get_Width(This,pWidth) \ - (This)->lpVtbl -> get_Width(This,pWidth) - -#define IVideoWindow_put_Top(This,Top) \ - (This)->lpVtbl -> put_Top(This,Top) - -#define IVideoWindow_get_Top(This,pTop) \ - (This)->lpVtbl -> get_Top(This,pTop) - -#define IVideoWindow_put_Height(This,Height) \ - (This)->lpVtbl -> put_Height(This,Height) - -#define IVideoWindow_get_Height(This,pHeight) \ - (This)->lpVtbl -> get_Height(This,pHeight) - -#define IVideoWindow_put_Owner(This,Owner) \ - (This)->lpVtbl -> put_Owner(This,Owner) - -#define IVideoWindow_get_Owner(This,Owner) \ - (This)->lpVtbl -> get_Owner(This,Owner) - -#define IVideoWindow_put_MessageDrain(This,Drain) \ - (This)->lpVtbl -> put_MessageDrain(This,Drain) - -#define IVideoWindow_get_MessageDrain(This,Drain) \ - (This)->lpVtbl -> get_MessageDrain(This,Drain) - -#define IVideoWindow_get_BorderColor(This,Color) \ - (This)->lpVtbl -> get_BorderColor(This,Color) - -#define IVideoWindow_put_BorderColor(This,Color) \ - (This)->lpVtbl -> put_BorderColor(This,Color) - -#define IVideoWindow_get_FullScreenMode(This,FullScreenMode) \ - (This)->lpVtbl -> get_FullScreenMode(This,FullScreenMode) - -#define IVideoWindow_put_FullScreenMode(This,FullScreenMode) \ - (This)->lpVtbl -> put_FullScreenMode(This,FullScreenMode) - -#define IVideoWindow_SetWindowForeground(This,Focus) \ - (This)->lpVtbl -> SetWindowForeground(This,Focus) - -#define IVideoWindow_NotifyOwnerMessage(This,hwnd,uMsg,wParam,lParam) \ - (This)->lpVtbl -> NotifyOwnerMessage(This,hwnd,uMsg,wParam,lParam) - -#define IVideoWindow_SetWindowPosition(This,Left,Top,Width,Height) \ - (This)->lpVtbl -> SetWindowPosition(This,Left,Top,Width,Height) - -#define IVideoWindow_GetWindowPosition(This,pLeft,pTop,pWidth,pHeight) \ - (This)->lpVtbl -> GetWindowPosition(This,pLeft,pTop,pWidth,pHeight) - -#define IVideoWindow_GetMinIdealImageSize(This,pWidth,pHeight) \ - (This)->lpVtbl -> GetMinIdealImageSize(This,pWidth,pHeight) - -#define IVideoWindow_GetMaxIdealImageSize(This,pWidth,pHeight) \ - (This)->lpVtbl -> GetMaxIdealImageSize(This,pWidth,pHeight) - -#define IVideoWindow_GetRestorePosition(This,pLeft,pTop,pWidth,pHeight) \ - (This)->lpVtbl -> GetRestorePosition(This,pLeft,pTop,pWidth,pHeight) - -#define IVideoWindow_HideCursor(This,HideCursor) \ - (This)->lpVtbl -> HideCursor(This,HideCursor) - -#define IVideoWindow_IsCursorHidden(This,CursorHidden) \ - (This)->lpVtbl -> IsCursorHidden(This,CursorHidden) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IVideoWindow_put_Caption_Proxy( - IVideoWindow * This, - /* [in] */ BSTR strCaption); - - -void __RPC_STUB IVideoWindow_put_Caption_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IVideoWindow_get_Caption_Proxy( - IVideoWindow * This, - /* [retval][out] */ BSTR *strCaption); - - -void __RPC_STUB IVideoWindow_get_Caption_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IVideoWindow_put_WindowStyle_Proxy( - IVideoWindow * This, - /* [in] */ long WindowStyle); - - -void __RPC_STUB IVideoWindow_put_WindowStyle_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IVideoWindow_get_WindowStyle_Proxy( - IVideoWindow * This, - /* [retval][out] */ long *WindowStyle); - - -void __RPC_STUB IVideoWindow_get_WindowStyle_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IVideoWindow_put_WindowStyleEx_Proxy( - IVideoWindow * This, - /* [in] */ long WindowStyleEx); - - -void __RPC_STUB IVideoWindow_put_WindowStyleEx_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IVideoWindow_get_WindowStyleEx_Proxy( - IVideoWindow * This, - /* [retval][out] */ long *WindowStyleEx); - - -void __RPC_STUB IVideoWindow_get_WindowStyleEx_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IVideoWindow_put_AutoShow_Proxy( - IVideoWindow * This, - /* [in] */ long AutoShow); - - -void __RPC_STUB IVideoWindow_put_AutoShow_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IVideoWindow_get_AutoShow_Proxy( - IVideoWindow * This, - /* [retval][out] */ long *AutoShow); - - -void __RPC_STUB IVideoWindow_get_AutoShow_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IVideoWindow_put_WindowState_Proxy( - IVideoWindow * This, - /* [in] */ long WindowState); - - -void __RPC_STUB IVideoWindow_put_WindowState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IVideoWindow_get_WindowState_Proxy( - IVideoWindow * This, - /* [retval][out] */ long *WindowState); - - -void __RPC_STUB IVideoWindow_get_WindowState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IVideoWindow_put_BackgroundPalette_Proxy( - IVideoWindow * This, - /* [in] */ long BackgroundPalette); - - -void __RPC_STUB IVideoWindow_put_BackgroundPalette_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IVideoWindow_get_BackgroundPalette_Proxy( - IVideoWindow * This, - /* [retval][out] */ long *pBackgroundPalette); - - -void __RPC_STUB IVideoWindow_get_BackgroundPalette_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IVideoWindow_put_Visible_Proxy( - IVideoWindow * This, - /* [in] */ long Visible); - - -void __RPC_STUB IVideoWindow_put_Visible_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IVideoWindow_get_Visible_Proxy( - IVideoWindow * This, - /* [retval][out] */ long *pVisible); - - -void __RPC_STUB IVideoWindow_get_Visible_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IVideoWindow_put_Left_Proxy( - IVideoWindow * This, - /* [in] */ long Left); - - -void __RPC_STUB IVideoWindow_put_Left_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IVideoWindow_get_Left_Proxy( - IVideoWindow * This, - /* [retval][out] */ long *pLeft); - - -void __RPC_STUB IVideoWindow_get_Left_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IVideoWindow_put_Width_Proxy( - IVideoWindow * This, - /* [in] */ long Width); - - -void __RPC_STUB IVideoWindow_put_Width_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IVideoWindow_get_Width_Proxy( - IVideoWindow * This, - /* [retval][out] */ long *pWidth); - - -void __RPC_STUB IVideoWindow_get_Width_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IVideoWindow_put_Top_Proxy( - IVideoWindow * This, - /* [in] */ long Top); - - -void __RPC_STUB IVideoWindow_put_Top_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IVideoWindow_get_Top_Proxy( - IVideoWindow * This, - /* [retval][out] */ long *pTop); - - -void __RPC_STUB IVideoWindow_get_Top_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IVideoWindow_put_Height_Proxy( - IVideoWindow * This, - /* [in] */ long Height); - - -void __RPC_STUB IVideoWindow_put_Height_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IVideoWindow_get_Height_Proxy( - IVideoWindow * This, - /* [retval][out] */ long *pHeight); - - -void __RPC_STUB IVideoWindow_get_Height_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IVideoWindow_put_Owner_Proxy( - IVideoWindow * This, - /* [in] */ OAHWND Owner); - - -void __RPC_STUB IVideoWindow_put_Owner_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IVideoWindow_get_Owner_Proxy( - IVideoWindow * This, - /* [retval][out] */ OAHWND *Owner); - - -void __RPC_STUB IVideoWindow_get_Owner_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IVideoWindow_put_MessageDrain_Proxy( - IVideoWindow * This, - /* [in] */ OAHWND Drain); - - -void __RPC_STUB IVideoWindow_put_MessageDrain_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IVideoWindow_get_MessageDrain_Proxy( - IVideoWindow * This, - /* [retval][out] */ OAHWND *Drain); - - -void __RPC_STUB IVideoWindow_get_MessageDrain_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IVideoWindow_get_BorderColor_Proxy( - IVideoWindow * This, - /* [retval][out] */ long *Color); - - -void __RPC_STUB IVideoWindow_get_BorderColor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IVideoWindow_put_BorderColor_Proxy( - IVideoWindow * This, - /* [in] */ long Color); - - -void __RPC_STUB IVideoWindow_put_BorderColor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IVideoWindow_get_FullScreenMode_Proxy( - IVideoWindow * This, - /* [retval][out] */ long *FullScreenMode); - - -void __RPC_STUB IVideoWindow_get_FullScreenMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IVideoWindow_put_FullScreenMode_Proxy( - IVideoWindow * This, - /* [in] */ long FullScreenMode); - - -void __RPC_STUB IVideoWindow_put_FullScreenMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVideoWindow_SetWindowForeground_Proxy( - IVideoWindow * This, - /* [in] */ long Focus); - - -void __RPC_STUB IVideoWindow_SetWindowForeground_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVideoWindow_NotifyOwnerMessage_Proxy( - IVideoWindow * This, - /* [in] */ OAHWND hwnd, - /* [in] */ long uMsg, - /* [in] */ LONG_PTR wParam, - /* [in] */ LONG_PTR lParam); - - -void __RPC_STUB IVideoWindow_NotifyOwnerMessage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVideoWindow_SetWindowPosition_Proxy( - IVideoWindow * This, - /* [in] */ long Left, - /* [in] */ long Top, - /* [in] */ long Width, - /* [in] */ long Height); - - -void __RPC_STUB IVideoWindow_SetWindowPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVideoWindow_GetWindowPosition_Proxy( - IVideoWindow * This, - /* [out] */ long *pLeft, - /* [out] */ long *pTop, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - -void __RPC_STUB IVideoWindow_GetWindowPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVideoWindow_GetMinIdealImageSize_Proxy( - IVideoWindow * This, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - -void __RPC_STUB IVideoWindow_GetMinIdealImageSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVideoWindow_GetMaxIdealImageSize_Proxy( - IVideoWindow * This, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - -void __RPC_STUB IVideoWindow_GetMaxIdealImageSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVideoWindow_GetRestorePosition_Proxy( - IVideoWindow * This, - /* [out] */ long *pLeft, - /* [out] */ long *pTop, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - -void __RPC_STUB IVideoWindow_GetRestorePosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVideoWindow_HideCursor_Proxy( - IVideoWindow * This, - /* [in] */ long HideCursor); - - -void __RPC_STUB IVideoWindow_HideCursor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVideoWindow_IsCursorHidden_Proxy( - IVideoWindow * This, - /* [out] */ long *CursorHidden); - - -void __RPC_STUB IVideoWindow_IsCursorHidden_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IVideoWindow_INTERFACE_DEFINED__ */ - - -#ifndef __IBasicVideo_INTERFACE_DEFINED__ -#define __IBasicVideo_INTERFACE_DEFINED__ - -/* interface IBasicVideo */ -/* [object][dual][oleautomation][helpstring][uuid] */ - - -DEFINE_GUID(IID_IBasicVideo,0x56a868b5,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868b5-0ad4-11ce-b03a-0020af0ba770") - IBasicVideo : public IDispatch - { - public: - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AvgTimePerFrame( - /* [retval][out] */ REFTIME *pAvgTimePerFrame) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_BitRate( - /* [retval][out] */ long *pBitRate) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_BitErrorRate( - /* [retval][out] */ long *pBitErrorRate) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_VideoWidth( - /* [retval][out] */ long *pVideoWidth) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_VideoHeight( - /* [retval][out] */ long *pVideoHeight) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SourceLeft( - /* [in] */ long SourceLeft) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SourceLeft( - /* [retval][out] */ long *pSourceLeft) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SourceWidth( - /* [in] */ long SourceWidth) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SourceWidth( - /* [retval][out] */ long *pSourceWidth) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SourceTop( - /* [in] */ long SourceTop) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SourceTop( - /* [retval][out] */ long *pSourceTop) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SourceHeight( - /* [in] */ long SourceHeight) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SourceHeight( - /* [retval][out] */ long *pSourceHeight) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_DestinationLeft( - /* [in] */ long DestinationLeft) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_DestinationLeft( - /* [retval][out] */ long *pDestinationLeft) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_DestinationWidth( - /* [in] */ long DestinationWidth) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_DestinationWidth( - /* [retval][out] */ long *pDestinationWidth) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_DestinationTop( - /* [in] */ long DestinationTop) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_DestinationTop( - /* [retval][out] */ long *pDestinationTop) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_DestinationHeight( - /* [in] */ long DestinationHeight) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_DestinationHeight( - /* [retval][out] */ long *pDestinationHeight) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetSourcePosition( - /* [in] */ long Left, - /* [in] */ long Top, - /* [in] */ long Width, - /* [in] */ long Height) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSourcePosition( - /* [out] */ long *pLeft, - /* [out] */ long *pTop, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDefaultSourcePosition( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDestinationPosition( - /* [in] */ long Left, - /* [in] */ long Top, - /* [in] */ long Width, - /* [in] */ long Height) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDestinationPosition( - /* [out] */ long *pLeft, - /* [out] */ long *pTop, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDefaultDestinationPosition( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetVideoSize( - /* [out] */ long *pWidth, - /* [out] */ long *pHeight) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetVideoPaletteEntries( - /* [in] */ long StartIndex, - /* [in] */ long Entries, - /* [out] */ long *pRetrieved, - /* [out] */ long *pPalette) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentImage( - /* [out][in] */ long *pBufferSize, - /* [out] */ long *pDIBImage) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsUsingDefaultSource( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsUsingDefaultDestination( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBasicVideoVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBasicVideo * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBasicVideo * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBasicVideo * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IBasicVideo * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IBasicVideo * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IBasicVideo * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IBasicVideo * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AvgTimePerFrame )( - IBasicVideo * This, - /* [retval][out] */ REFTIME *pAvgTimePerFrame); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BitRate )( - IBasicVideo * This, - /* [retval][out] */ long *pBitRate); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BitErrorRate )( - IBasicVideo * This, - /* [retval][out] */ long *pBitErrorRate); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_VideoWidth )( - IBasicVideo * This, - /* [retval][out] */ long *pVideoWidth); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_VideoHeight )( - IBasicVideo * This, - /* [retval][out] */ long *pVideoHeight); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SourceLeft )( - IBasicVideo * This, - /* [in] */ long SourceLeft); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SourceLeft )( - IBasicVideo * This, - /* [retval][out] */ long *pSourceLeft); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SourceWidth )( - IBasicVideo * This, - /* [in] */ long SourceWidth); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SourceWidth )( - IBasicVideo * This, - /* [retval][out] */ long *pSourceWidth); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SourceTop )( - IBasicVideo * This, - /* [in] */ long SourceTop); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SourceTop )( - IBasicVideo * This, - /* [retval][out] */ long *pSourceTop); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SourceHeight )( - IBasicVideo * This, - /* [in] */ long SourceHeight); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SourceHeight )( - IBasicVideo * This, - /* [retval][out] */ long *pSourceHeight); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_DestinationLeft )( - IBasicVideo * This, - /* [in] */ long DestinationLeft); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DestinationLeft )( - IBasicVideo * This, - /* [retval][out] */ long *pDestinationLeft); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_DestinationWidth )( - IBasicVideo * This, - /* [in] */ long DestinationWidth); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DestinationWidth )( - IBasicVideo * This, - /* [retval][out] */ long *pDestinationWidth); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_DestinationTop )( - IBasicVideo * This, - /* [in] */ long DestinationTop); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DestinationTop )( - IBasicVideo * This, - /* [retval][out] */ long *pDestinationTop); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_DestinationHeight )( - IBasicVideo * This, - /* [in] */ long DestinationHeight); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DestinationHeight )( - IBasicVideo * This, - /* [retval][out] */ long *pDestinationHeight); - - HRESULT ( STDMETHODCALLTYPE *SetSourcePosition )( - IBasicVideo * This, - /* [in] */ long Left, - /* [in] */ long Top, - /* [in] */ long Width, - /* [in] */ long Height); - - HRESULT ( STDMETHODCALLTYPE *GetSourcePosition )( - IBasicVideo * This, - /* [out] */ long *pLeft, - /* [out] */ long *pTop, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - HRESULT ( STDMETHODCALLTYPE *SetDefaultSourcePosition )( - IBasicVideo * This); - - HRESULT ( STDMETHODCALLTYPE *SetDestinationPosition )( - IBasicVideo * This, - /* [in] */ long Left, - /* [in] */ long Top, - /* [in] */ long Width, - /* [in] */ long Height); - - HRESULT ( STDMETHODCALLTYPE *GetDestinationPosition )( - IBasicVideo * This, - /* [out] */ long *pLeft, - /* [out] */ long *pTop, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - HRESULT ( STDMETHODCALLTYPE *SetDefaultDestinationPosition )( - IBasicVideo * This); - - HRESULT ( STDMETHODCALLTYPE *GetVideoSize )( - IBasicVideo * This, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - HRESULT ( STDMETHODCALLTYPE *GetVideoPaletteEntries )( - IBasicVideo * This, - /* [in] */ long StartIndex, - /* [in] */ long Entries, - /* [out] */ long *pRetrieved, - /* [out] */ long *pPalette); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentImage )( - IBasicVideo * This, - /* [out][in] */ long *pBufferSize, - /* [out] */ long *pDIBImage); - - HRESULT ( STDMETHODCALLTYPE *IsUsingDefaultSource )( - IBasicVideo * This); - - HRESULT ( STDMETHODCALLTYPE *IsUsingDefaultDestination )( - IBasicVideo * This); - - END_INTERFACE - } IBasicVideoVtbl; - - interface IBasicVideo - { - CONST_VTBL struct IBasicVideoVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBasicVideo_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBasicVideo_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBasicVideo_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBasicVideo_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IBasicVideo_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IBasicVideo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IBasicVideo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IBasicVideo_get_AvgTimePerFrame(This,pAvgTimePerFrame) \ - (This)->lpVtbl -> get_AvgTimePerFrame(This,pAvgTimePerFrame) - -#define IBasicVideo_get_BitRate(This,pBitRate) \ - (This)->lpVtbl -> get_BitRate(This,pBitRate) - -#define IBasicVideo_get_BitErrorRate(This,pBitErrorRate) \ - (This)->lpVtbl -> get_BitErrorRate(This,pBitErrorRate) - -#define IBasicVideo_get_VideoWidth(This,pVideoWidth) \ - (This)->lpVtbl -> get_VideoWidth(This,pVideoWidth) - -#define IBasicVideo_get_VideoHeight(This,pVideoHeight) \ - (This)->lpVtbl -> get_VideoHeight(This,pVideoHeight) - -#define IBasicVideo_put_SourceLeft(This,SourceLeft) \ - (This)->lpVtbl -> put_SourceLeft(This,SourceLeft) - -#define IBasicVideo_get_SourceLeft(This,pSourceLeft) \ - (This)->lpVtbl -> get_SourceLeft(This,pSourceLeft) - -#define IBasicVideo_put_SourceWidth(This,SourceWidth) \ - (This)->lpVtbl -> put_SourceWidth(This,SourceWidth) - -#define IBasicVideo_get_SourceWidth(This,pSourceWidth) \ - (This)->lpVtbl -> get_SourceWidth(This,pSourceWidth) - -#define IBasicVideo_put_SourceTop(This,SourceTop) \ - (This)->lpVtbl -> put_SourceTop(This,SourceTop) - -#define IBasicVideo_get_SourceTop(This,pSourceTop) \ - (This)->lpVtbl -> get_SourceTop(This,pSourceTop) - -#define IBasicVideo_put_SourceHeight(This,SourceHeight) \ - (This)->lpVtbl -> put_SourceHeight(This,SourceHeight) - -#define IBasicVideo_get_SourceHeight(This,pSourceHeight) \ - (This)->lpVtbl -> get_SourceHeight(This,pSourceHeight) - -#define IBasicVideo_put_DestinationLeft(This,DestinationLeft) \ - (This)->lpVtbl -> put_DestinationLeft(This,DestinationLeft) - -#define IBasicVideo_get_DestinationLeft(This,pDestinationLeft) \ - (This)->lpVtbl -> get_DestinationLeft(This,pDestinationLeft) - -#define IBasicVideo_put_DestinationWidth(This,DestinationWidth) \ - (This)->lpVtbl -> put_DestinationWidth(This,DestinationWidth) - -#define IBasicVideo_get_DestinationWidth(This,pDestinationWidth) \ - (This)->lpVtbl -> get_DestinationWidth(This,pDestinationWidth) - -#define IBasicVideo_put_DestinationTop(This,DestinationTop) \ - (This)->lpVtbl -> put_DestinationTop(This,DestinationTop) - -#define IBasicVideo_get_DestinationTop(This,pDestinationTop) \ - (This)->lpVtbl -> get_DestinationTop(This,pDestinationTop) - -#define IBasicVideo_put_DestinationHeight(This,DestinationHeight) \ - (This)->lpVtbl -> put_DestinationHeight(This,DestinationHeight) - -#define IBasicVideo_get_DestinationHeight(This,pDestinationHeight) \ - (This)->lpVtbl -> get_DestinationHeight(This,pDestinationHeight) - -#define IBasicVideo_SetSourcePosition(This,Left,Top,Width,Height) \ - (This)->lpVtbl -> SetSourcePosition(This,Left,Top,Width,Height) - -#define IBasicVideo_GetSourcePosition(This,pLeft,pTop,pWidth,pHeight) \ - (This)->lpVtbl -> GetSourcePosition(This,pLeft,pTop,pWidth,pHeight) - -#define IBasicVideo_SetDefaultSourcePosition(This) \ - (This)->lpVtbl -> SetDefaultSourcePosition(This) - -#define IBasicVideo_SetDestinationPosition(This,Left,Top,Width,Height) \ - (This)->lpVtbl -> SetDestinationPosition(This,Left,Top,Width,Height) - -#define IBasicVideo_GetDestinationPosition(This,pLeft,pTop,pWidth,pHeight) \ - (This)->lpVtbl -> GetDestinationPosition(This,pLeft,pTop,pWidth,pHeight) - -#define IBasicVideo_SetDefaultDestinationPosition(This) \ - (This)->lpVtbl -> SetDefaultDestinationPosition(This) - -#define IBasicVideo_GetVideoSize(This,pWidth,pHeight) \ - (This)->lpVtbl -> GetVideoSize(This,pWidth,pHeight) - -#define IBasicVideo_GetVideoPaletteEntries(This,StartIndex,Entries,pRetrieved,pPalette) \ - (This)->lpVtbl -> GetVideoPaletteEntries(This,StartIndex,Entries,pRetrieved,pPalette) - -#define IBasicVideo_GetCurrentImage(This,pBufferSize,pDIBImage) \ - (This)->lpVtbl -> GetCurrentImage(This,pBufferSize,pDIBImage) - -#define IBasicVideo_IsUsingDefaultSource(This) \ - (This)->lpVtbl -> IsUsingDefaultSource(This) - -#define IBasicVideo_IsUsingDefaultDestination(This) \ - (This)->lpVtbl -> IsUsingDefaultDestination(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IBasicVideo_get_AvgTimePerFrame_Proxy( - IBasicVideo * This, - /* [retval][out] */ REFTIME *pAvgTimePerFrame); - - -void __RPC_STUB IBasicVideo_get_AvgTimePerFrame_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IBasicVideo_get_BitRate_Proxy( - IBasicVideo * This, - /* [retval][out] */ long *pBitRate); - - -void __RPC_STUB IBasicVideo_get_BitRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IBasicVideo_get_BitErrorRate_Proxy( - IBasicVideo * This, - /* [retval][out] */ long *pBitErrorRate); - - -void __RPC_STUB IBasicVideo_get_BitErrorRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IBasicVideo_get_VideoWidth_Proxy( - IBasicVideo * This, - /* [retval][out] */ long *pVideoWidth); - - -void __RPC_STUB IBasicVideo_get_VideoWidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IBasicVideo_get_VideoHeight_Proxy( - IBasicVideo * This, - /* [retval][out] */ long *pVideoHeight); - - -void __RPC_STUB IBasicVideo_get_VideoHeight_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IBasicVideo_put_SourceLeft_Proxy( - IBasicVideo * This, - /* [in] */ long SourceLeft); - - -void __RPC_STUB IBasicVideo_put_SourceLeft_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IBasicVideo_get_SourceLeft_Proxy( - IBasicVideo * This, - /* [retval][out] */ long *pSourceLeft); - - -void __RPC_STUB IBasicVideo_get_SourceLeft_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IBasicVideo_put_SourceWidth_Proxy( - IBasicVideo * This, - /* [in] */ long SourceWidth); - - -void __RPC_STUB IBasicVideo_put_SourceWidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IBasicVideo_get_SourceWidth_Proxy( - IBasicVideo * This, - /* [retval][out] */ long *pSourceWidth); - - -void __RPC_STUB IBasicVideo_get_SourceWidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IBasicVideo_put_SourceTop_Proxy( - IBasicVideo * This, - /* [in] */ long SourceTop); - - -void __RPC_STUB IBasicVideo_put_SourceTop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IBasicVideo_get_SourceTop_Proxy( - IBasicVideo * This, - /* [retval][out] */ long *pSourceTop); - - -void __RPC_STUB IBasicVideo_get_SourceTop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IBasicVideo_put_SourceHeight_Proxy( - IBasicVideo * This, - /* [in] */ long SourceHeight); - - -void __RPC_STUB IBasicVideo_put_SourceHeight_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IBasicVideo_get_SourceHeight_Proxy( - IBasicVideo * This, - /* [retval][out] */ long *pSourceHeight); - - -void __RPC_STUB IBasicVideo_get_SourceHeight_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IBasicVideo_put_DestinationLeft_Proxy( - IBasicVideo * This, - /* [in] */ long DestinationLeft); - - -void __RPC_STUB IBasicVideo_put_DestinationLeft_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IBasicVideo_get_DestinationLeft_Proxy( - IBasicVideo * This, - /* [retval][out] */ long *pDestinationLeft); - - -void __RPC_STUB IBasicVideo_get_DestinationLeft_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IBasicVideo_put_DestinationWidth_Proxy( - IBasicVideo * This, - /* [in] */ long DestinationWidth); - - -void __RPC_STUB IBasicVideo_put_DestinationWidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IBasicVideo_get_DestinationWidth_Proxy( - IBasicVideo * This, - /* [retval][out] */ long *pDestinationWidth); - - -void __RPC_STUB IBasicVideo_get_DestinationWidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IBasicVideo_put_DestinationTop_Proxy( - IBasicVideo * This, - /* [in] */ long DestinationTop); - - -void __RPC_STUB IBasicVideo_put_DestinationTop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IBasicVideo_get_DestinationTop_Proxy( - IBasicVideo * This, - /* [retval][out] */ long *pDestinationTop); - - -void __RPC_STUB IBasicVideo_get_DestinationTop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IBasicVideo_put_DestinationHeight_Proxy( - IBasicVideo * This, - /* [in] */ long DestinationHeight); - - -void __RPC_STUB IBasicVideo_put_DestinationHeight_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IBasicVideo_get_DestinationHeight_Proxy( - IBasicVideo * This, - /* [retval][out] */ long *pDestinationHeight); - - -void __RPC_STUB IBasicVideo_get_DestinationHeight_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBasicVideo_SetSourcePosition_Proxy( - IBasicVideo * This, - /* [in] */ long Left, - /* [in] */ long Top, - /* [in] */ long Width, - /* [in] */ long Height); - - -void __RPC_STUB IBasicVideo_SetSourcePosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBasicVideo_GetSourcePosition_Proxy( - IBasicVideo * This, - /* [out] */ long *pLeft, - /* [out] */ long *pTop, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - -void __RPC_STUB IBasicVideo_GetSourcePosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBasicVideo_SetDefaultSourcePosition_Proxy( - IBasicVideo * This); - - -void __RPC_STUB IBasicVideo_SetDefaultSourcePosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBasicVideo_SetDestinationPosition_Proxy( - IBasicVideo * This, - /* [in] */ long Left, - /* [in] */ long Top, - /* [in] */ long Width, - /* [in] */ long Height); - - -void __RPC_STUB IBasicVideo_SetDestinationPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBasicVideo_GetDestinationPosition_Proxy( - IBasicVideo * This, - /* [out] */ long *pLeft, - /* [out] */ long *pTop, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - -void __RPC_STUB IBasicVideo_GetDestinationPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBasicVideo_SetDefaultDestinationPosition_Proxy( - IBasicVideo * This); - - -void __RPC_STUB IBasicVideo_SetDefaultDestinationPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBasicVideo_GetVideoSize_Proxy( - IBasicVideo * This, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - -void __RPC_STUB IBasicVideo_GetVideoSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBasicVideo_GetVideoPaletteEntries_Proxy( - IBasicVideo * This, - /* [in] */ long StartIndex, - /* [in] */ long Entries, - /* [out] */ long *pRetrieved, - /* [out] */ long *pPalette); - - -void __RPC_STUB IBasicVideo_GetVideoPaletteEntries_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBasicVideo_GetCurrentImage_Proxy( - IBasicVideo * This, - /* [out][in] */ long *pBufferSize, - /* [out] */ long *pDIBImage); - - -void __RPC_STUB IBasicVideo_GetCurrentImage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBasicVideo_IsUsingDefaultSource_Proxy( - IBasicVideo * This); - - -void __RPC_STUB IBasicVideo_IsUsingDefaultSource_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBasicVideo_IsUsingDefaultDestination_Proxy( - IBasicVideo * This); - - -void __RPC_STUB IBasicVideo_IsUsingDefaultDestination_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBasicVideo_INTERFACE_DEFINED__ */ - - -#ifndef __IBasicVideo2_INTERFACE_DEFINED__ -#define __IBasicVideo2_INTERFACE_DEFINED__ - -/* interface IBasicVideo2 */ -/* [object][helpstring][uuid] */ - - -DEFINE_GUID(IID_IBasicVideo2,0x329bb360,0xf6ea,0x11d1,0x90,0x38,0x00,0xa0,0xc9,0x69,0x72,0x98); - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("329bb360-f6ea-11d1-9038-00a0c9697298") - IBasicVideo2 : public IBasicVideo - { - public: - virtual HRESULT STDMETHODCALLTYPE GetPreferredAspectRatio( - /* [out] */ long *plAspectX, - /* [out] */ long *plAspectY) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBasicVideo2Vtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBasicVideo2 * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBasicVideo2 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBasicVideo2 * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IBasicVideo2 * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IBasicVideo2 * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IBasicVideo2 * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IBasicVideo2 * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AvgTimePerFrame )( - IBasicVideo2 * This, - /* [retval][out] */ REFTIME *pAvgTimePerFrame); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BitRate )( - IBasicVideo2 * This, - /* [retval][out] */ long *pBitRate); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BitErrorRate )( - IBasicVideo2 * This, - /* [retval][out] */ long *pBitErrorRate); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_VideoWidth )( - IBasicVideo2 * This, - /* [retval][out] */ long *pVideoWidth); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_VideoHeight )( - IBasicVideo2 * This, - /* [retval][out] */ long *pVideoHeight); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SourceLeft )( - IBasicVideo2 * This, - /* [in] */ long SourceLeft); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SourceLeft )( - IBasicVideo2 * This, - /* [retval][out] */ long *pSourceLeft); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SourceWidth )( - IBasicVideo2 * This, - /* [in] */ long SourceWidth); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SourceWidth )( - IBasicVideo2 * This, - /* [retval][out] */ long *pSourceWidth); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SourceTop )( - IBasicVideo2 * This, - /* [in] */ long SourceTop); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SourceTop )( - IBasicVideo2 * This, - /* [retval][out] */ long *pSourceTop); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SourceHeight )( - IBasicVideo2 * This, - /* [in] */ long SourceHeight); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SourceHeight )( - IBasicVideo2 * This, - /* [retval][out] */ long *pSourceHeight); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_DestinationLeft )( - IBasicVideo2 * This, - /* [in] */ long DestinationLeft); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DestinationLeft )( - IBasicVideo2 * This, - /* [retval][out] */ long *pDestinationLeft); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_DestinationWidth )( - IBasicVideo2 * This, - /* [in] */ long DestinationWidth); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DestinationWidth )( - IBasicVideo2 * This, - /* [retval][out] */ long *pDestinationWidth); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_DestinationTop )( - IBasicVideo2 * This, - /* [in] */ long DestinationTop); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DestinationTop )( - IBasicVideo2 * This, - /* [retval][out] */ long *pDestinationTop); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_DestinationHeight )( - IBasicVideo2 * This, - /* [in] */ long DestinationHeight); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DestinationHeight )( - IBasicVideo2 * This, - /* [retval][out] */ long *pDestinationHeight); - - HRESULT ( STDMETHODCALLTYPE *SetSourcePosition )( - IBasicVideo2 * This, - /* [in] */ long Left, - /* [in] */ long Top, - /* [in] */ long Width, - /* [in] */ long Height); - - HRESULT ( STDMETHODCALLTYPE *GetSourcePosition )( - IBasicVideo2 * This, - /* [out] */ long *pLeft, - /* [out] */ long *pTop, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - HRESULT ( STDMETHODCALLTYPE *SetDefaultSourcePosition )( - IBasicVideo2 * This); - - HRESULT ( STDMETHODCALLTYPE *SetDestinationPosition )( - IBasicVideo2 * This, - /* [in] */ long Left, - /* [in] */ long Top, - /* [in] */ long Width, - /* [in] */ long Height); - - HRESULT ( STDMETHODCALLTYPE *GetDestinationPosition )( - IBasicVideo2 * This, - /* [out] */ long *pLeft, - /* [out] */ long *pTop, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - HRESULT ( STDMETHODCALLTYPE *SetDefaultDestinationPosition )( - IBasicVideo2 * This); - - HRESULT ( STDMETHODCALLTYPE *GetVideoSize )( - IBasicVideo2 * This, - /* [out] */ long *pWidth, - /* [out] */ long *pHeight); - - HRESULT ( STDMETHODCALLTYPE *GetVideoPaletteEntries )( - IBasicVideo2 * This, - /* [in] */ long StartIndex, - /* [in] */ long Entries, - /* [out] */ long *pRetrieved, - /* [out] */ long *pPalette); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentImage )( - IBasicVideo2 * This, - /* [out][in] */ long *pBufferSize, - /* [out] */ long *pDIBImage); - - HRESULT ( STDMETHODCALLTYPE *IsUsingDefaultSource )( - IBasicVideo2 * This); - - HRESULT ( STDMETHODCALLTYPE *IsUsingDefaultDestination )( - IBasicVideo2 * This); - - HRESULT ( STDMETHODCALLTYPE *GetPreferredAspectRatio )( - IBasicVideo2 * This, - /* [out] */ long *plAspectX, - /* [out] */ long *plAspectY); - - END_INTERFACE - } IBasicVideo2Vtbl; - - interface IBasicVideo2 - { - CONST_VTBL struct IBasicVideo2Vtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBasicVideo2_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBasicVideo2_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBasicVideo2_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBasicVideo2_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IBasicVideo2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IBasicVideo2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IBasicVideo2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IBasicVideo2_get_AvgTimePerFrame(This,pAvgTimePerFrame) \ - (This)->lpVtbl -> get_AvgTimePerFrame(This,pAvgTimePerFrame) - -#define IBasicVideo2_get_BitRate(This,pBitRate) \ - (This)->lpVtbl -> get_BitRate(This,pBitRate) - -#define IBasicVideo2_get_BitErrorRate(This,pBitErrorRate) \ - (This)->lpVtbl -> get_BitErrorRate(This,pBitErrorRate) - -#define IBasicVideo2_get_VideoWidth(This,pVideoWidth) \ - (This)->lpVtbl -> get_VideoWidth(This,pVideoWidth) - -#define IBasicVideo2_get_VideoHeight(This,pVideoHeight) \ - (This)->lpVtbl -> get_VideoHeight(This,pVideoHeight) - -#define IBasicVideo2_put_SourceLeft(This,SourceLeft) \ - (This)->lpVtbl -> put_SourceLeft(This,SourceLeft) - -#define IBasicVideo2_get_SourceLeft(This,pSourceLeft) \ - (This)->lpVtbl -> get_SourceLeft(This,pSourceLeft) - -#define IBasicVideo2_put_SourceWidth(This,SourceWidth) \ - (This)->lpVtbl -> put_SourceWidth(This,SourceWidth) - -#define IBasicVideo2_get_SourceWidth(This,pSourceWidth) \ - (This)->lpVtbl -> get_SourceWidth(This,pSourceWidth) - -#define IBasicVideo2_put_SourceTop(This,SourceTop) \ - (This)->lpVtbl -> put_SourceTop(This,SourceTop) - -#define IBasicVideo2_get_SourceTop(This,pSourceTop) \ - (This)->lpVtbl -> get_SourceTop(This,pSourceTop) - -#define IBasicVideo2_put_SourceHeight(This,SourceHeight) \ - (This)->lpVtbl -> put_SourceHeight(This,SourceHeight) - -#define IBasicVideo2_get_SourceHeight(This,pSourceHeight) \ - (This)->lpVtbl -> get_SourceHeight(This,pSourceHeight) - -#define IBasicVideo2_put_DestinationLeft(This,DestinationLeft) \ - (This)->lpVtbl -> put_DestinationLeft(This,DestinationLeft) - -#define IBasicVideo2_get_DestinationLeft(This,pDestinationLeft) \ - (This)->lpVtbl -> get_DestinationLeft(This,pDestinationLeft) - -#define IBasicVideo2_put_DestinationWidth(This,DestinationWidth) \ - (This)->lpVtbl -> put_DestinationWidth(This,DestinationWidth) - -#define IBasicVideo2_get_DestinationWidth(This,pDestinationWidth) \ - (This)->lpVtbl -> get_DestinationWidth(This,pDestinationWidth) - -#define IBasicVideo2_put_DestinationTop(This,DestinationTop) \ - (This)->lpVtbl -> put_DestinationTop(This,DestinationTop) - -#define IBasicVideo2_get_DestinationTop(This,pDestinationTop) \ - (This)->lpVtbl -> get_DestinationTop(This,pDestinationTop) - -#define IBasicVideo2_put_DestinationHeight(This,DestinationHeight) \ - (This)->lpVtbl -> put_DestinationHeight(This,DestinationHeight) - -#define IBasicVideo2_get_DestinationHeight(This,pDestinationHeight) \ - (This)->lpVtbl -> get_DestinationHeight(This,pDestinationHeight) - -#define IBasicVideo2_SetSourcePosition(This,Left,Top,Width,Height) \ - (This)->lpVtbl -> SetSourcePosition(This,Left,Top,Width,Height) - -#define IBasicVideo2_GetSourcePosition(This,pLeft,pTop,pWidth,pHeight) \ - (This)->lpVtbl -> GetSourcePosition(This,pLeft,pTop,pWidth,pHeight) - -#define IBasicVideo2_SetDefaultSourcePosition(This) \ - (This)->lpVtbl -> SetDefaultSourcePosition(This) - -#define IBasicVideo2_SetDestinationPosition(This,Left,Top,Width,Height) \ - (This)->lpVtbl -> SetDestinationPosition(This,Left,Top,Width,Height) - -#define IBasicVideo2_GetDestinationPosition(This,pLeft,pTop,pWidth,pHeight) \ - (This)->lpVtbl -> GetDestinationPosition(This,pLeft,pTop,pWidth,pHeight) - -#define IBasicVideo2_SetDefaultDestinationPosition(This) \ - (This)->lpVtbl -> SetDefaultDestinationPosition(This) - -#define IBasicVideo2_GetVideoSize(This,pWidth,pHeight) \ - (This)->lpVtbl -> GetVideoSize(This,pWidth,pHeight) - -#define IBasicVideo2_GetVideoPaletteEntries(This,StartIndex,Entries,pRetrieved,pPalette) \ - (This)->lpVtbl -> GetVideoPaletteEntries(This,StartIndex,Entries,pRetrieved,pPalette) - -#define IBasicVideo2_GetCurrentImage(This,pBufferSize,pDIBImage) \ - (This)->lpVtbl -> GetCurrentImage(This,pBufferSize,pDIBImage) - -#define IBasicVideo2_IsUsingDefaultSource(This) \ - (This)->lpVtbl -> IsUsingDefaultSource(This) - -#define IBasicVideo2_IsUsingDefaultDestination(This) \ - (This)->lpVtbl -> IsUsingDefaultDestination(This) - - -#define IBasicVideo2_GetPreferredAspectRatio(This,plAspectX,plAspectY) \ - (This)->lpVtbl -> GetPreferredAspectRatio(This,plAspectX,plAspectY) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBasicVideo2_GetPreferredAspectRatio_Proxy( - IBasicVideo2 * This, - /* [out] */ long *plAspectX, - /* [out] */ long *plAspectY); - - -void __RPC_STUB IBasicVideo2_GetPreferredAspectRatio_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBasicVideo2_INTERFACE_DEFINED__ */ - - -#ifndef __IDeferredCommand_INTERFACE_DEFINED__ -#define __IDeferredCommand_INTERFACE_DEFINED__ - -/* interface IDeferredCommand */ -/* [object][helpstring][uuid] */ - - -DEFINE_GUID(IID_IDeferredCommand,0x56a868b8,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868b8-0ad4-11ce-b03a-0020af0ba770") - IDeferredCommand : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Cancel( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Confidence( - /* [out] */ LONG *pConfidence) = 0; - - virtual HRESULT STDMETHODCALLTYPE Postpone( - /* [in] */ REFTIME newtime) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHResult( - /* [out] */ HRESULT *phrResult) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDeferredCommandVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDeferredCommand * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDeferredCommand * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDeferredCommand * This); - - HRESULT ( STDMETHODCALLTYPE *Cancel )( - IDeferredCommand * This); - - HRESULT ( STDMETHODCALLTYPE *Confidence )( - IDeferredCommand * This, - /* [out] */ LONG *pConfidence); - - HRESULT ( STDMETHODCALLTYPE *Postpone )( - IDeferredCommand * This, - /* [in] */ REFTIME newtime); - - HRESULT ( STDMETHODCALLTYPE *GetHResult )( - IDeferredCommand * This, - /* [out] */ HRESULT *phrResult); - - END_INTERFACE - } IDeferredCommandVtbl; - - interface IDeferredCommand - { - CONST_VTBL struct IDeferredCommandVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDeferredCommand_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDeferredCommand_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDeferredCommand_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDeferredCommand_Cancel(This) \ - (This)->lpVtbl -> Cancel(This) - -#define IDeferredCommand_Confidence(This,pConfidence) \ - (This)->lpVtbl -> Confidence(This,pConfidence) - -#define IDeferredCommand_Postpone(This,newtime) \ - (This)->lpVtbl -> Postpone(This,newtime) - -#define IDeferredCommand_GetHResult(This,phrResult) \ - (This)->lpVtbl -> GetHResult(This,phrResult) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDeferredCommand_Cancel_Proxy( - IDeferredCommand * This); - - -void __RPC_STUB IDeferredCommand_Cancel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDeferredCommand_Confidence_Proxy( - IDeferredCommand * This, - /* [out] */ LONG *pConfidence); - - -void __RPC_STUB IDeferredCommand_Confidence_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDeferredCommand_Postpone_Proxy( - IDeferredCommand * This, - /* [in] */ REFTIME newtime); - - -void __RPC_STUB IDeferredCommand_Postpone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDeferredCommand_GetHResult_Proxy( - IDeferredCommand * This, - /* [out] */ HRESULT *phrResult); - - -void __RPC_STUB IDeferredCommand_GetHResult_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDeferredCommand_INTERFACE_DEFINED__ */ - - -#ifndef __IQueueCommand_INTERFACE_DEFINED__ -#define __IQueueCommand_INTERFACE_DEFINED__ - -/* interface IQueueCommand */ -/* [object][helpstring][uuid] */ - - -DEFINE_GUID(IID_IQueueCommand,0x56a868b7,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868b7-0ad4-11ce-b03a-0020af0ba770") - IQueueCommand : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE InvokeAtStreamTime( - /* [out] */ IDeferredCommand **pCmd, - /* [in] */ REFTIME time, - /* [in] */ GUID *iid, - /* [in] */ long dispidMethod, - /* [in] */ short wFlags, - /* [in] */ long cArgs, - /* [in] */ VARIANT *pDispParams, - /* [out][in] */ VARIANT *pvarResult, - /* [out] */ short *puArgErr) = 0; - - virtual HRESULT STDMETHODCALLTYPE InvokeAtPresentationTime( - /* [out] */ IDeferredCommand **pCmd, - /* [in] */ REFTIME time, - /* [in] */ GUID *iid, - /* [in] */ long dispidMethod, - /* [in] */ short wFlags, - /* [in] */ long cArgs, - /* [in] */ VARIANT *pDispParams, - /* [out][in] */ VARIANT *pvarResult, - /* [out] */ short *puArgErr) = 0; - - }; - -#else /* C style interface */ - - typedef struct IQueueCommandVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IQueueCommand * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IQueueCommand * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IQueueCommand * This); - - HRESULT ( STDMETHODCALLTYPE *InvokeAtStreamTime )( - IQueueCommand * This, - /* [out] */ IDeferredCommand **pCmd, - /* [in] */ REFTIME time, - /* [in] */ GUID *iid, - /* [in] */ long dispidMethod, - /* [in] */ short wFlags, - /* [in] */ long cArgs, - /* [in] */ VARIANT *pDispParams, - /* [out][in] */ VARIANT *pvarResult, - /* [out] */ short *puArgErr); - - HRESULT ( STDMETHODCALLTYPE *InvokeAtPresentationTime )( - IQueueCommand * This, - /* [out] */ IDeferredCommand **pCmd, - /* [in] */ REFTIME time, - /* [in] */ GUID *iid, - /* [in] */ long dispidMethod, - /* [in] */ short wFlags, - /* [in] */ long cArgs, - /* [in] */ VARIANT *pDispParams, - /* [out][in] */ VARIANT *pvarResult, - /* [out] */ short *puArgErr); - - END_INTERFACE - } IQueueCommandVtbl; - - interface IQueueCommand - { - CONST_VTBL struct IQueueCommandVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IQueueCommand_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IQueueCommand_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IQueueCommand_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IQueueCommand_InvokeAtStreamTime(This,pCmd,time,iid,dispidMethod,wFlags,cArgs,pDispParams,pvarResult,puArgErr) \ - (This)->lpVtbl -> InvokeAtStreamTime(This,pCmd,time,iid,dispidMethod,wFlags,cArgs,pDispParams,pvarResult,puArgErr) - -#define IQueueCommand_InvokeAtPresentationTime(This,pCmd,time,iid,dispidMethod,wFlags,cArgs,pDispParams,pvarResult,puArgErr) \ - (This)->lpVtbl -> InvokeAtPresentationTime(This,pCmd,time,iid,dispidMethod,wFlags,cArgs,pDispParams,pvarResult,puArgErr) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IQueueCommand_InvokeAtStreamTime_Proxy( - IQueueCommand * This, - /* [out] */ IDeferredCommand **pCmd, - /* [in] */ REFTIME time, - /* [in] */ GUID *iid, - /* [in] */ long dispidMethod, - /* [in] */ short wFlags, - /* [in] */ long cArgs, - /* [in] */ VARIANT *pDispParams, - /* [out][in] */ VARIANT *pvarResult, - /* [out] */ short *puArgErr); - - -void __RPC_STUB IQueueCommand_InvokeAtStreamTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IQueueCommand_InvokeAtPresentationTime_Proxy( - IQueueCommand * This, - /* [out] */ IDeferredCommand **pCmd, - /* [in] */ REFTIME time, - /* [in] */ GUID *iid, - /* [in] */ long dispidMethod, - /* [in] */ short wFlags, - /* [in] */ long cArgs, - /* [in] */ VARIANT *pDispParams, - /* [out][in] */ VARIANT *pvarResult, - /* [out] */ short *puArgErr); - - -void __RPC_STUB IQueueCommand_InvokeAtPresentationTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IQueueCommand_INTERFACE_DEFINED__ */ - - -DEFINE_GUID(CLSID_FilgraphManager,0xe436ebb3,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#ifdef __cplusplus - -class DECLSPEC_UUID("e436ebb3-524f-11ce-9f53-0020af0ba770") -FilgraphManager; -#endif - -#ifndef __IFilterInfo_INTERFACE_DEFINED__ -#define __IFilterInfo_INTERFACE_DEFINED__ - -/* interface IFilterInfo */ -/* [object][dual][oleautomation][helpstring][uuid] */ - - -DEFINE_GUID(IID_IFilterInfo,0x56a868ba,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868ba-0ad4-11ce-b03a-0020af0ba770") - IFilterInfo : public IDispatch - { - public: - virtual HRESULT STDMETHODCALLTYPE FindPin( - /* [in] */ BSTR strPinID, - /* [out] */ IDispatch **ppUnk) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Name( - /* [retval][out] */ BSTR *strName) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_VendorInfo( - /* [retval][out] */ BSTR *strVendorInfo) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Filter( - /* [retval][out] */ IUnknown **ppUnk) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Pins( - /* [retval][out] */ IDispatch **ppUnk) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsFileSource( - /* [retval][out] */ LONG *pbIsSource) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Filename( - /* [retval][out] */ BSTR *pstrFilename) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Filename( - /* [in] */ BSTR strFilename) = 0; - - }; - -#else /* C style interface */ - - typedef struct IFilterInfoVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IFilterInfo * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IFilterInfo * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IFilterInfo * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IFilterInfo * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IFilterInfo * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IFilterInfo * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IFilterInfo * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - HRESULT ( STDMETHODCALLTYPE *FindPin )( - IFilterInfo * This, - /* [in] */ BSTR strPinID, - /* [out] */ IDispatch **ppUnk); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( - IFilterInfo * This, - /* [retval][out] */ BSTR *strName); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_VendorInfo )( - IFilterInfo * This, - /* [retval][out] */ BSTR *strVendorInfo); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Filter )( - IFilterInfo * This, - /* [retval][out] */ IUnknown **ppUnk); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Pins )( - IFilterInfo * This, - /* [retval][out] */ IDispatch **ppUnk); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsFileSource )( - IFilterInfo * This, - /* [retval][out] */ LONG *pbIsSource); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Filename )( - IFilterInfo * This, - /* [retval][out] */ BSTR *pstrFilename); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Filename )( - IFilterInfo * This, - /* [in] */ BSTR strFilename); - - END_INTERFACE - } IFilterInfoVtbl; - - interface IFilterInfo - { - CONST_VTBL struct IFilterInfoVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IFilterInfo_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IFilterInfo_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IFilterInfo_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IFilterInfo_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IFilterInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IFilterInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IFilterInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IFilterInfo_FindPin(This,strPinID,ppUnk) \ - (This)->lpVtbl -> FindPin(This,strPinID,ppUnk) - -#define IFilterInfo_get_Name(This,strName) \ - (This)->lpVtbl -> get_Name(This,strName) - -#define IFilterInfo_get_VendorInfo(This,strVendorInfo) \ - (This)->lpVtbl -> get_VendorInfo(This,strVendorInfo) - -#define IFilterInfo_get_Filter(This,ppUnk) \ - (This)->lpVtbl -> get_Filter(This,ppUnk) - -#define IFilterInfo_get_Pins(This,ppUnk) \ - (This)->lpVtbl -> get_Pins(This,ppUnk) - -#define IFilterInfo_get_IsFileSource(This,pbIsSource) \ - (This)->lpVtbl -> get_IsFileSource(This,pbIsSource) - -#define IFilterInfo_get_Filename(This,pstrFilename) \ - (This)->lpVtbl -> get_Filename(This,pstrFilename) - -#define IFilterInfo_put_Filename(This,strFilename) \ - (This)->lpVtbl -> put_Filename(This,strFilename) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IFilterInfo_FindPin_Proxy( - IFilterInfo * This, - /* [in] */ BSTR strPinID, - /* [out] */ IDispatch **ppUnk); - - -void __RPC_STUB IFilterInfo_FindPin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IFilterInfo_get_Name_Proxy( - IFilterInfo * This, - /* [retval][out] */ BSTR *strName); - - -void __RPC_STUB IFilterInfo_get_Name_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IFilterInfo_get_VendorInfo_Proxy( - IFilterInfo * This, - /* [retval][out] */ BSTR *strVendorInfo); - - -void __RPC_STUB IFilterInfo_get_VendorInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IFilterInfo_get_Filter_Proxy( - IFilterInfo * This, - /* [retval][out] */ IUnknown **ppUnk); - - -void __RPC_STUB IFilterInfo_get_Filter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IFilterInfo_get_Pins_Proxy( - IFilterInfo * This, - /* [retval][out] */ IDispatch **ppUnk); - - -void __RPC_STUB IFilterInfo_get_Pins_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IFilterInfo_get_IsFileSource_Proxy( - IFilterInfo * This, - /* [retval][out] */ LONG *pbIsSource); - - -void __RPC_STUB IFilterInfo_get_IsFileSource_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IFilterInfo_get_Filename_Proxy( - IFilterInfo * This, - /* [retval][out] */ BSTR *pstrFilename); - - -void __RPC_STUB IFilterInfo_get_Filename_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propput] */ HRESULT STDMETHODCALLTYPE IFilterInfo_put_Filename_Proxy( - IFilterInfo * This, - /* [in] */ BSTR strFilename); - - -void __RPC_STUB IFilterInfo_put_Filename_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IFilterInfo_INTERFACE_DEFINED__ */ - - -#ifndef __IRegFilterInfo_INTERFACE_DEFINED__ -#define __IRegFilterInfo_INTERFACE_DEFINED__ - -/* interface IRegFilterInfo */ -/* [object][dual][oleautomation][helpstring][uuid] */ - - -DEFINE_GUID(IID_IRegFilterInfo,0x56a868bb,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868bb-0ad4-11ce-b03a-0020af0ba770") - IRegFilterInfo : public IDispatch - { - public: - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Name( - /* [retval][out] */ BSTR *strName) = 0; - - virtual HRESULT STDMETHODCALLTYPE Filter( - /* [out] */ IDispatch **ppUnk) = 0; - - }; - -#else /* C style interface */ - - typedef struct IRegFilterInfoVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IRegFilterInfo * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IRegFilterInfo * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IRegFilterInfo * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IRegFilterInfo * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IRegFilterInfo * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IRegFilterInfo * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IRegFilterInfo * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( - IRegFilterInfo * This, - /* [retval][out] */ BSTR *strName); - - HRESULT ( STDMETHODCALLTYPE *Filter )( - IRegFilterInfo * This, - /* [out] */ IDispatch **ppUnk); - - END_INTERFACE - } IRegFilterInfoVtbl; - - interface IRegFilterInfo - { - CONST_VTBL struct IRegFilterInfoVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IRegFilterInfo_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IRegFilterInfo_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IRegFilterInfo_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IRegFilterInfo_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IRegFilterInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IRegFilterInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IRegFilterInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IRegFilterInfo_get_Name(This,strName) \ - (This)->lpVtbl -> get_Name(This,strName) - -#define IRegFilterInfo_Filter(This,ppUnk) \ - (This)->lpVtbl -> Filter(This,ppUnk) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IRegFilterInfo_get_Name_Proxy( - IRegFilterInfo * This, - /* [retval][out] */ BSTR *strName); - - -void __RPC_STUB IRegFilterInfo_get_Name_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRegFilterInfo_Filter_Proxy( - IRegFilterInfo * This, - /* [out] */ IDispatch **ppUnk); - - -void __RPC_STUB IRegFilterInfo_Filter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IRegFilterInfo_INTERFACE_DEFINED__ */ - - -#ifndef __IMediaTypeInfo_INTERFACE_DEFINED__ -#define __IMediaTypeInfo_INTERFACE_DEFINED__ - -/* interface IMediaTypeInfo */ -/* [object][dual][oleautomation][helpstring][uuid] */ - - -DEFINE_GUID(IID_IMediaTypeInfo,0x56a868bc,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868bc-0ad4-11ce-b03a-0020af0ba770") - IMediaTypeInfo : public IDispatch - { - public: - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Type( - /* [retval][out] */ BSTR *strType) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Subtype( - /* [retval][out] */ BSTR *strType) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaTypeInfoVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaTypeInfo * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaTypeInfo * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaTypeInfo * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IMediaTypeInfo * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IMediaTypeInfo * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IMediaTypeInfo * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IMediaTypeInfo * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( - IMediaTypeInfo * This, - /* [retval][out] */ BSTR *strType); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subtype )( - IMediaTypeInfo * This, - /* [retval][out] */ BSTR *strType); - - END_INTERFACE - } IMediaTypeInfoVtbl; - - interface IMediaTypeInfo - { - CONST_VTBL struct IMediaTypeInfoVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaTypeInfo_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaTypeInfo_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaTypeInfo_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaTypeInfo_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IMediaTypeInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IMediaTypeInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IMediaTypeInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IMediaTypeInfo_get_Type(This,strType) \ - (This)->lpVtbl -> get_Type(This,strType) - -#define IMediaTypeInfo_get_Subtype(This,strType) \ - (This)->lpVtbl -> get_Subtype(This,strType) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IMediaTypeInfo_get_Type_Proxy( - IMediaTypeInfo * This, - /* [retval][out] */ BSTR *strType); - - -void __RPC_STUB IMediaTypeInfo_get_Type_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IMediaTypeInfo_get_Subtype_Proxy( - IMediaTypeInfo * This, - /* [retval][out] */ BSTR *strType); - - -void __RPC_STUB IMediaTypeInfo_get_Subtype_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaTypeInfo_INTERFACE_DEFINED__ */ - - -#ifndef __IPinInfo_INTERFACE_DEFINED__ -#define __IPinInfo_INTERFACE_DEFINED__ - -/* interface IPinInfo */ -/* [object][dual][oleautomation][helpstring][uuid] */ - - -DEFINE_GUID(IID_IPinInfo,0x56a868bd,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868bd-0ad4-11ce-b03a-0020af0ba770") - IPinInfo : public IDispatch - { - public: - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Pin( - /* [retval][out] */ IUnknown **ppUnk) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ConnectedTo( - /* [retval][out] */ IDispatch **ppUnk) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ConnectionMediaType( - /* [retval][out] */ IDispatch **ppUnk) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_FilterInfo( - /* [retval][out] */ IDispatch **ppUnk) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Name( - /* [retval][out] */ BSTR *ppUnk) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Direction( - /* [retval][out] */ LONG *ppDirection) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PinID( - /* [retval][out] */ BSTR *strPinID) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MediaTypes( - /* [retval][out] */ IDispatch **ppUnk) = 0; - - virtual HRESULT STDMETHODCALLTYPE Connect( - /* [in] */ IUnknown *pPin) = 0; - - virtual HRESULT STDMETHODCALLTYPE ConnectDirect( - /* [in] */ IUnknown *pPin) = 0; - - virtual HRESULT STDMETHODCALLTYPE ConnectWithType( - /* [in] */ IUnknown *pPin, - /* [in] */ IDispatch *pMediaType) = 0; - - virtual HRESULT STDMETHODCALLTYPE Disconnect( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Render( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IPinInfoVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IPinInfo * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IPinInfo * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IPinInfo * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IPinInfo * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IPinInfo * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IPinInfo * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IPinInfo * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Pin )( - IPinInfo * This, - /* [retval][out] */ IUnknown **ppUnk); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ConnectedTo )( - IPinInfo * This, - /* [retval][out] */ IDispatch **ppUnk); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ConnectionMediaType )( - IPinInfo * This, - /* [retval][out] */ IDispatch **ppUnk); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FilterInfo )( - IPinInfo * This, - /* [retval][out] */ IDispatch **ppUnk); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( - IPinInfo * This, - /* [retval][out] */ BSTR *ppUnk); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Direction )( - IPinInfo * This, - /* [retval][out] */ LONG *ppDirection); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PinID )( - IPinInfo * This, - /* [retval][out] */ BSTR *strPinID); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaTypes )( - IPinInfo * This, - /* [retval][out] */ IDispatch **ppUnk); - - HRESULT ( STDMETHODCALLTYPE *Connect )( - IPinInfo * This, - /* [in] */ IUnknown *pPin); - - HRESULT ( STDMETHODCALLTYPE *ConnectDirect )( - IPinInfo * This, - /* [in] */ IUnknown *pPin); - - HRESULT ( STDMETHODCALLTYPE *ConnectWithType )( - IPinInfo * This, - /* [in] */ IUnknown *pPin, - /* [in] */ IDispatch *pMediaType); - - HRESULT ( STDMETHODCALLTYPE *Disconnect )( - IPinInfo * This); - - HRESULT ( STDMETHODCALLTYPE *Render )( - IPinInfo * This); - - END_INTERFACE - } IPinInfoVtbl; - - interface IPinInfo - { - CONST_VTBL struct IPinInfoVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IPinInfo_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IPinInfo_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IPinInfo_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IPinInfo_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IPinInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IPinInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IPinInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IPinInfo_get_Pin(This,ppUnk) \ - (This)->lpVtbl -> get_Pin(This,ppUnk) - -#define IPinInfo_get_ConnectedTo(This,ppUnk) \ - (This)->lpVtbl -> get_ConnectedTo(This,ppUnk) - -#define IPinInfo_get_ConnectionMediaType(This,ppUnk) \ - (This)->lpVtbl -> get_ConnectionMediaType(This,ppUnk) - -#define IPinInfo_get_FilterInfo(This,ppUnk) \ - (This)->lpVtbl -> get_FilterInfo(This,ppUnk) - -#define IPinInfo_get_Name(This,ppUnk) \ - (This)->lpVtbl -> get_Name(This,ppUnk) - -#define IPinInfo_get_Direction(This,ppDirection) \ - (This)->lpVtbl -> get_Direction(This,ppDirection) - -#define IPinInfo_get_PinID(This,strPinID) \ - (This)->lpVtbl -> get_PinID(This,strPinID) - -#define IPinInfo_get_MediaTypes(This,ppUnk) \ - (This)->lpVtbl -> get_MediaTypes(This,ppUnk) - -#define IPinInfo_Connect(This,pPin) \ - (This)->lpVtbl -> Connect(This,pPin) - -#define IPinInfo_ConnectDirect(This,pPin) \ - (This)->lpVtbl -> ConnectDirect(This,pPin) - -#define IPinInfo_ConnectWithType(This,pPin,pMediaType) \ - (This)->lpVtbl -> ConnectWithType(This,pPin,pMediaType) - -#define IPinInfo_Disconnect(This) \ - (This)->lpVtbl -> Disconnect(This) - -#define IPinInfo_Render(This) \ - (This)->lpVtbl -> Render(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IPinInfo_get_Pin_Proxy( - IPinInfo * This, - /* [retval][out] */ IUnknown **ppUnk); - - -void __RPC_STUB IPinInfo_get_Pin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IPinInfo_get_ConnectedTo_Proxy( - IPinInfo * This, - /* [retval][out] */ IDispatch **ppUnk); - - -void __RPC_STUB IPinInfo_get_ConnectedTo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IPinInfo_get_ConnectionMediaType_Proxy( - IPinInfo * This, - /* [retval][out] */ IDispatch **ppUnk); - - -void __RPC_STUB IPinInfo_get_ConnectionMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IPinInfo_get_FilterInfo_Proxy( - IPinInfo * This, - /* [retval][out] */ IDispatch **ppUnk); - - -void __RPC_STUB IPinInfo_get_FilterInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IPinInfo_get_Name_Proxy( - IPinInfo * This, - /* [retval][out] */ BSTR *ppUnk); - - -void __RPC_STUB IPinInfo_get_Name_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IPinInfo_get_Direction_Proxy( - IPinInfo * This, - /* [retval][out] */ LONG *ppDirection); - - -void __RPC_STUB IPinInfo_get_Direction_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IPinInfo_get_PinID_Proxy( - IPinInfo * This, - /* [retval][out] */ BSTR *strPinID); - - -void __RPC_STUB IPinInfo_get_PinID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IPinInfo_get_MediaTypes_Proxy( - IPinInfo * This, - /* [retval][out] */ IDispatch **ppUnk); - - -void __RPC_STUB IPinInfo_get_MediaTypes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPinInfo_Connect_Proxy( - IPinInfo * This, - /* [in] */ IUnknown *pPin); - - -void __RPC_STUB IPinInfo_Connect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPinInfo_ConnectDirect_Proxy( - IPinInfo * This, - /* [in] */ IUnknown *pPin); - - -void __RPC_STUB IPinInfo_ConnectDirect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPinInfo_ConnectWithType_Proxy( - IPinInfo * This, - /* [in] */ IUnknown *pPin, - /* [in] */ IDispatch *pMediaType); - - -void __RPC_STUB IPinInfo_ConnectWithType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPinInfo_Disconnect_Proxy( - IPinInfo * This); - - -void __RPC_STUB IPinInfo_Disconnect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPinInfo_Render_Proxy( - IPinInfo * This); - - -void __RPC_STUB IPinInfo_Render_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IPinInfo_INTERFACE_DEFINED__ */ - - -#ifndef __IAMStats_INTERFACE_DEFINED__ -#define __IAMStats_INTERFACE_DEFINED__ - -/* interface IAMStats */ -/* [object][dual][oleautomation][helpstring][uuid] */ - - -DEFINE_GUID(IID_IAMStats,0xbc9bcf80,0xdcd2,0x11d2,0xab,0xf6,0x00,0xa0,0xc9,0x05,0xf3,0x75); - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("bc9bcf80-dcd2-11d2-abf6-00a0c905f375") - IAMStats : public IDispatch - { - public: - virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Count( - /* [retval][out] */ LONG *plCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetValueByIndex( - /* [in] */ long lIndex, - /* [out] */ BSTR *szName, - /* [out] */ long *lCount, - /* [out] */ double *dLast, - /* [out] */ double *dAverage, - /* [out] */ double *dStdDev, - /* [out] */ double *dMin, - /* [out] */ double *dMax) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetValueByName( - /* [in] */ BSTR szName, - /* [out] */ long *lIndex, - /* [out] */ long *lCount, - /* [out] */ double *dLast, - /* [out] */ double *dAverage, - /* [out] */ double *dStdDev, - /* [out] */ double *dMin, - /* [out] */ double *dMax) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetIndex( - /* [in] */ BSTR szName, - /* [in] */ long lCreate, - /* [out] */ long *plIndex) = 0; - - virtual HRESULT STDMETHODCALLTYPE AddValue( - /* [in] */ long lIndex, - /* [in] */ double dValue) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMStatsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMStats * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMStats * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMStats * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IAMStats * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IAMStats * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IAMStats * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IAMStats * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - HRESULT ( STDMETHODCALLTYPE *Reset )( - IAMStats * This); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( - IAMStats * This, - /* [retval][out] */ LONG *plCount); - - HRESULT ( STDMETHODCALLTYPE *GetValueByIndex )( - IAMStats * This, - /* [in] */ long lIndex, - /* [out] */ BSTR *szName, - /* [out] */ long *lCount, - /* [out] */ double *dLast, - /* [out] */ double *dAverage, - /* [out] */ double *dStdDev, - /* [out] */ double *dMin, - /* [out] */ double *dMax); - - HRESULT ( STDMETHODCALLTYPE *GetValueByName )( - IAMStats * This, - /* [in] */ BSTR szName, - /* [out] */ long *lIndex, - /* [out] */ long *lCount, - /* [out] */ double *dLast, - /* [out] */ double *dAverage, - /* [out] */ double *dStdDev, - /* [out] */ double *dMin, - /* [out] */ double *dMax); - - HRESULT ( STDMETHODCALLTYPE *GetIndex )( - IAMStats * This, - /* [in] */ BSTR szName, - /* [in] */ long lCreate, - /* [out] */ long *plIndex); - - HRESULT ( STDMETHODCALLTYPE *AddValue )( - IAMStats * This, - /* [in] */ long lIndex, - /* [in] */ double dValue); - - END_INTERFACE - } IAMStatsVtbl; - - interface IAMStats - { - CONST_VTBL struct IAMStatsVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMStats_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMStats_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMStats_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMStats_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IAMStats_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IAMStats_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IAMStats_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IAMStats_Reset(This) \ - (This)->lpVtbl -> Reset(This) - -#define IAMStats_get_Count(This,plCount) \ - (This)->lpVtbl -> get_Count(This,plCount) - -#define IAMStats_GetValueByIndex(This,lIndex,szName,lCount,dLast,dAverage,dStdDev,dMin,dMax) \ - (This)->lpVtbl -> GetValueByIndex(This,lIndex,szName,lCount,dLast,dAverage,dStdDev,dMin,dMax) - -#define IAMStats_GetValueByName(This,szName,lIndex,lCount,dLast,dAverage,dStdDev,dMin,dMax) \ - (This)->lpVtbl -> GetValueByName(This,szName,lIndex,lCount,dLast,dAverage,dStdDev,dMin,dMax) - -#define IAMStats_GetIndex(This,szName,lCreate,plIndex) \ - (This)->lpVtbl -> GetIndex(This,szName,lCreate,plIndex) - -#define IAMStats_AddValue(This,lIndex,dValue) \ - (This)->lpVtbl -> AddValue(This,lIndex,dValue) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMStats_Reset_Proxy( - IAMStats * This); - - -void __RPC_STUB IAMStats_Reset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [propget] */ HRESULT STDMETHODCALLTYPE IAMStats_get_Count_Proxy( - IAMStats * This, - /* [retval][out] */ LONG *plCount); - - -void __RPC_STUB IAMStats_get_Count_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMStats_GetValueByIndex_Proxy( - IAMStats * This, - /* [in] */ long lIndex, - /* [out] */ BSTR *szName, - /* [out] */ long *lCount, - /* [out] */ double *dLast, - /* [out] */ double *dAverage, - /* [out] */ double *dStdDev, - /* [out] */ double *dMin, - /* [out] */ double *dMax); - - -void __RPC_STUB IAMStats_GetValueByIndex_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMStats_GetValueByName_Proxy( - IAMStats * This, - /* [in] */ BSTR szName, - /* [out] */ long *lIndex, - /* [out] */ long *lCount, - /* [out] */ double *dLast, - /* [out] */ double *dAverage, - /* [out] */ double *dStdDev, - /* [out] */ double *dMin, - /* [out] */ double *dMax); - - -void __RPC_STUB IAMStats_GetValueByName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMStats_GetIndex_Proxy( - IAMStats * This, - /* [in] */ BSTR szName, - /* [in] */ long lCreate, - /* [out] */ long *plIndex); - - -void __RPC_STUB IAMStats_GetIndex_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMStats_AddValue_Proxy( - IAMStats * This, - /* [in] */ long lIndex, - /* [in] */ double dValue); - - -void __RPC_STUB IAMStats_AddValue_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMStats_INTERFACE_DEFINED__ */ - -#endif /* __QuartzTypeLib_LIBRARY_DEFINED__ */ - -/* Additional Prototypes for ALL interfaces */ - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/d3d.h b/import/DirectX8/include/d3d.h deleted file mode 100644 index eea7dff4f..000000000 --- a/import/DirectX8/include/d3d.h +++ /dev/null @@ -1,1688 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) Microsoft Corporation. All Rights Reserved. - * - * File: d3d.h - * Content: Direct3D include file - * - ****************************************************************************/ - -#ifndef _D3D_H_ -#define _D3D_H_ - -#ifndef DIRECT3D_VERSION -#define DIRECT3D_VERSION 0x0700 -#endif - -// include this file content only if compiling for <=DX7 interfaces -#if(DIRECT3D_VERSION < 0x0800) - - -#include - -#define COM_NO_WINDOWS_H -#include - -#define D3DAPI WINAPI - -/* - * Interface IID's - */ -#if defined( _WIN32 ) && !defined( _NO_COM) -DEFINE_GUID( IID_IDirect3D, 0x3BBA0080,0x2421,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56 ); -#if(DIRECT3D_VERSION >= 0x0500) -DEFINE_GUID( IID_IDirect3D2, 0x6aae1ec1,0x662a,0x11d0,0x88,0x9d,0x00,0xaa,0x00,0xbb,0xb7,0x6a); -#endif /* DIRECT3D_VERSION >= 0x0500 */ -#if(DIRECT3D_VERSION >= 0x0600) -DEFINE_GUID( IID_IDirect3D3, 0xbb223240,0xe72b,0x11d0,0xa9,0xb4,0x00,0xaa,0x00,0xc0,0x99,0x3e); -#endif /* DIRECT3D_VERSION >= 0x0600 */ -#if(DIRECT3D_VERSION >= 0x0700) -DEFINE_GUID( IID_IDirect3D7, 0xf5049e77,0x4861,0x11d2,0xa4,0x7,0x0,0xa0,0xc9,0x6,0x29,0xa8); -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -#if(DIRECT3D_VERSION >= 0x0500) -DEFINE_GUID( IID_IDirect3DRampDevice, 0xF2086B20,0x259F,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56 ); -DEFINE_GUID( IID_IDirect3DRGBDevice, 0xA4665C60,0x2673,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56 ); -DEFINE_GUID( IID_IDirect3DHALDevice, 0x84E63dE0,0x46AA,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E ); -DEFINE_GUID( IID_IDirect3DMMXDevice, 0x881949a1,0xd6f3,0x11d0,0x89,0xab,0x00,0xa0,0xc9,0x05,0x41,0x29 ); -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#if(DIRECT3D_VERSION >= 0x0600) -DEFINE_GUID( IID_IDirect3DRefDevice, 0x50936643, 0x13e9, 0x11d1, 0x89, 0xaa, 0x0, 0xa0, 0xc9, 0x5, 0x41, 0x29); -DEFINE_GUID( IID_IDirect3DNullDevice, 0x8767df22, 0xbacc, 0x11d1, 0x89, 0x69, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8); -#endif /* DIRECT3D_VERSION >= 0x0600 */ -#if(DIRECT3D_VERSION >= 0x0700) -DEFINE_GUID( IID_IDirect3DTnLHalDevice, 0xf5049e78, 0x4861, 0x11d2, 0xa4, 0x7, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8); -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -/* - * Internal Guid to distinguish requested MMX from MMX being used as an RGB rasterizer - */ - -DEFINE_GUID( IID_IDirect3DDevice, 0x64108800,0x957d,0X11d0,0x89,0xab,0x00,0xa0,0xc9,0x05,0x41,0x29 ); -#if(DIRECT3D_VERSION >= 0x0500) -DEFINE_GUID( IID_IDirect3DDevice2, 0x93281501, 0x8cf8, 0x11d0, 0x89, 0xab, 0x0, 0xa0, 0xc9, 0x5, 0x41, 0x29); -#endif /* DIRECT3D_VERSION >= 0x0500 */ -#if(DIRECT3D_VERSION >= 0x0600) -DEFINE_GUID( IID_IDirect3DDevice3, 0xb0ab3b60, 0x33d7, 0x11d1, 0xa9, 0x81, 0x0, 0xc0, 0x4f, 0xd7, 0xb1, 0x74); -#endif /* DIRECT3D_VERSION >= 0x0600 */ -#if(DIRECT3D_VERSION >= 0x0700) -DEFINE_GUID( IID_IDirect3DDevice7, 0xf5049e79, 0x4861, 0x11d2, 0xa4, 0x7, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8); -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -DEFINE_GUID( IID_IDirect3DTexture, 0x2CDCD9E0,0x25A0,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56 ); -#if(DIRECT3D_VERSION >= 0x0500) -DEFINE_GUID( IID_IDirect3DTexture2, 0x93281502, 0x8cf8, 0x11d0, 0x89, 0xab, 0x0, 0xa0, 0xc9, 0x5, 0x41, 0x29); -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -DEFINE_GUID( IID_IDirect3DLight, 0x4417C142,0x33AD,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E ); - -DEFINE_GUID( IID_IDirect3DMaterial, 0x4417C144,0x33AD,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E ); -#if(DIRECT3D_VERSION >= 0x0500) -DEFINE_GUID( IID_IDirect3DMaterial2, 0x93281503, 0x8cf8, 0x11d0, 0x89, 0xab, 0x0, 0xa0, 0xc9, 0x5, 0x41, 0x29); -#endif /* DIRECT3D_VERSION >= 0x0500 */ -#if(DIRECT3D_VERSION >= 0x0600) -DEFINE_GUID( IID_IDirect3DMaterial3, 0xca9c46f4, 0xd3c5, 0x11d1, 0xb7, 0x5a, 0x0, 0x60, 0x8, 0x52, 0xb3, 0x12); -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -DEFINE_GUID( IID_IDirect3DExecuteBuffer,0x4417C145,0x33AD,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E ); -DEFINE_GUID( IID_IDirect3DViewport, 0x4417C146,0x33AD,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E ); -#if(DIRECT3D_VERSION >= 0x0500) -DEFINE_GUID( IID_IDirect3DViewport2, 0x93281500, 0x8cf8, 0x11d0, 0x89, 0xab, 0x0, 0xa0, 0xc9, 0x5, 0x41, 0x29); -#endif /* DIRECT3D_VERSION >= 0x0500 */ -#if(DIRECT3D_VERSION >= 0x0600) -DEFINE_GUID( IID_IDirect3DViewport3, 0xb0ab3b61, 0x33d7, 0x11d1, 0xa9, 0x81, 0x0, 0xc0, 0x4f, 0xd7, 0xb1, 0x74); -#endif /* DIRECT3D_VERSION >= 0x0600 */ -#if(DIRECT3D_VERSION >= 0x0600) -DEFINE_GUID( IID_IDirect3DVertexBuffer, 0x7a503555, 0x4a83, 0x11d1, 0xa5, 0xdb, 0x0, 0xa0, 0xc9, 0x3, 0x67, 0xf8); -#endif /* DIRECT3D_VERSION >= 0x0600 */ -#if(DIRECT3D_VERSION >= 0x0700) -DEFINE_GUID( IID_IDirect3DVertexBuffer7, 0xf5049e7d, 0x4861, 0x11d2, 0xa4, 0x7, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8); -#endif /* DIRECT3D_VERSION >= 0x0700 */ -#endif - -#ifdef __cplusplus -struct IDirect3D; -struct IDirect3DDevice; -struct IDirect3DLight; -struct IDirect3DMaterial; -struct IDirect3DExecuteBuffer; -struct IDirect3DTexture; -struct IDirect3DViewport; -typedef struct IDirect3D *LPDIRECT3D; -typedef struct IDirect3DDevice *LPDIRECT3DDEVICE; -typedef struct IDirect3DExecuteBuffer *LPDIRECT3DEXECUTEBUFFER; -typedef struct IDirect3DLight *LPDIRECT3DLIGHT; -typedef struct IDirect3DMaterial *LPDIRECT3DMATERIAL; -typedef struct IDirect3DTexture *LPDIRECT3DTEXTURE; -typedef struct IDirect3DViewport *LPDIRECT3DVIEWPORT; - -#if(DIRECT3D_VERSION >= 0x0500) -struct IDirect3D2; -struct IDirect3DDevice2; -struct IDirect3DMaterial2; -struct IDirect3DTexture2; -struct IDirect3DViewport2; -typedef struct IDirect3D2 *LPDIRECT3D2; -typedef struct IDirect3DDevice2 *LPDIRECT3DDEVICE2; -typedef struct IDirect3DMaterial2 *LPDIRECT3DMATERIAL2; -typedef struct IDirect3DTexture2 *LPDIRECT3DTEXTURE2; -typedef struct IDirect3DViewport2 *LPDIRECT3DVIEWPORT2; -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#if(DIRECT3D_VERSION >= 0x0600) -struct IDirect3D3; -struct IDirect3DDevice3; -struct IDirect3DMaterial3; -struct IDirect3DViewport3; -struct IDirect3DVertexBuffer; -typedef struct IDirect3D3 *LPDIRECT3D3; -typedef struct IDirect3DDevice3 *LPDIRECT3DDEVICE3; -typedef struct IDirect3DMaterial3 *LPDIRECT3DMATERIAL3; -typedef struct IDirect3DViewport3 *LPDIRECT3DVIEWPORT3; -typedef struct IDirect3DVertexBuffer *LPDIRECT3DVERTEXBUFFER; -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -#if(DIRECT3D_VERSION >= 0x0700) -struct IDirect3D7; -struct IDirect3DDevice7; -struct IDirect3DVertexBuffer7; -typedef struct IDirect3D7 *LPDIRECT3D7; -typedef struct IDirect3DDevice7 *LPDIRECT3DDEVICE7; -typedef struct IDirect3DVertexBuffer7 *LPDIRECT3DVERTEXBUFFER7; -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -#else - -typedef struct IDirect3D *LPDIRECT3D; -typedef struct IDirect3DDevice *LPDIRECT3DDEVICE; -typedef struct IDirect3DExecuteBuffer *LPDIRECT3DEXECUTEBUFFER; -typedef struct IDirect3DLight *LPDIRECT3DLIGHT; -typedef struct IDirect3DMaterial *LPDIRECT3DMATERIAL; -typedef struct IDirect3DTexture *LPDIRECT3DTEXTURE; -typedef struct IDirect3DViewport *LPDIRECT3DVIEWPORT; - -#if(DIRECT3D_VERSION >= 0x0500) -typedef struct IDirect3D2 *LPDIRECT3D2; -typedef struct IDirect3DDevice2 *LPDIRECT3DDEVICE2; -typedef struct IDirect3DMaterial2 *LPDIRECT3DMATERIAL2; -typedef struct IDirect3DTexture2 *LPDIRECT3DTEXTURE2; -typedef struct IDirect3DViewport2 *LPDIRECT3DVIEWPORT2; -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#if(DIRECT3D_VERSION >= 0x0600) -typedef struct IDirect3D3 *LPDIRECT3D3; -typedef struct IDirect3DDevice3 *LPDIRECT3DDEVICE3; -typedef struct IDirect3DMaterial3 *LPDIRECT3DMATERIAL3; -typedef struct IDirect3DViewport3 *LPDIRECT3DVIEWPORT3; -typedef struct IDirect3DVertexBuffer *LPDIRECT3DVERTEXBUFFER; -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -#if(DIRECT3D_VERSION >= 0x0700) -typedef struct IDirect3D7 *LPDIRECT3D7; -typedef struct IDirect3DDevice7 *LPDIRECT3DDEVICE7; -typedef struct IDirect3DVertexBuffer7 *LPDIRECT3DVERTEXBUFFER7; -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -#endif - -#include "d3dtypes.h" -#include "d3dcaps.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Direct3D interfaces - */ -#undef INTERFACE -#define INTERFACE IDirect3D - -DECLARE_INTERFACE_(IDirect3D, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3D methods ***/ - STDMETHOD(Initialize)(THIS_ REFCLSID) PURE; - STDMETHOD(EnumDevices)(THIS_ LPD3DENUMDEVICESCALLBACK,LPVOID) PURE; - STDMETHOD(CreateLight)(THIS_ LPDIRECT3DLIGHT*,IUnknown*) PURE; - STDMETHOD(CreateMaterial)(THIS_ LPDIRECT3DMATERIAL*,IUnknown*) PURE; - STDMETHOD(CreateViewport)(THIS_ LPDIRECT3DVIEWPORT*,IUnknown*) PURE; - STDMETHOD(FindDevice)(THIS_ LPD3DFINDDEVICESEARCH,LPD3DFINDDEVICERESULT) PURE; -}; - -typedef struct IDirect3D *LPDIRECT3D; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3D_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3D_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3D_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3D_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) -#define IDirect3D_EnumDevices(p,a,b) (p)->lpVtbl->EnumDevices(p,a,b) -#define IDirect3D_CreateLight(p,a,b) (p)->lpVtbl->CreateLight(p,a,b) -#define IDirect3D_CreateMaterial(p,a,b) (p)->lpVtbl->CreateMaterial(p,a,b) -#define IDirect3D_CreateViewport(p,a,b) (p)->lpVtbl->CreateViewport(p,a,b) -#define IDirect3D_FindDevice(p,a,b) (p)->lpVtbl->FindDevice(p,a,b) -#else -#define IDirect3D_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3D_AddRef(p) (p)->AddRef() -#define IDirect3D_Release(p) (p)->Release() -#define IDirect3D_Initialize(p,a) (p)->Initialize(a) -#define IDirect3D_EnumDevices(p,a,b) (p)->EnumDevices(a,b) -#define IDirect3D_CreateLight(p,a,b) (p)->CreateLight(a,b) -#define IDirect3D_CreateMaterial(p,a,b) (p)->CreateMaterial(a,b) -#define IDirect3D_CreateViewport(p,a,b) (p)->CreateViewport(a,b) -#define IDirect3D_FindDevice(p,a,b) (p)->FindDevice(a,b) -#endif - -#if(DIRECT3D_VERSION >= 0x0500) -#undef INTERFACE -#define INTERFACE IDirect3D2 - -DECLARE_INTERFACE_(IDirect3D2, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3D2 methods ***/ - STDMETHOD(EnumDevices)(THIS_ LPD3DENUMDEVICESCALLBACK,LPVOID) PURE; - STDMETHOD(CreateLight)(THIS_ LPDIRECT3DLIGHT*,IUnknown*) PURE; - STDMETHOD(CreateMaterial)(THIS_ LPDIRECT3DMATERIAL2*,IUnknown*) PURE; - STDMETHOD(CreateViewport)(THIS_ LPDIRECT3DVIEWPORT2*,IUnknown*) PURE; - STDMETHOD(FindDevice)(THIS_ LPD3DFINDDEVICESEARCH,LPD3DFINDDEVICERESULT) PURE; - STDMETHOD(CreateDevice)(THIS_ REFCLSID,LPDIRECTDRAWSURFACE,LPDIRECT3DDEVICE2*) PURE; -}; - -typedef struct IDirect3D2 *LPDIRECT3D2; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3D2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3D2_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3D2_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3D2_EnumDevices(p,a,b) (p)->lpVtbl->EnumDevices(p,a,b) -#define IDirect3D2_CreateLight(p,a,b) (p)->lpVtbl->CreateLight(p,a,b) -#define IDirect3D2_CreateMaterial(p,a,b) (p)->lpVtbl->CreateMaterial(p,a,b) -#define IDirect3D2_CreateViewport(p,a,b) (p)->lpVtbl->CreateViewport(p,a,b) -#define IDirect3D2_FindDevice(p,a,b) (p)->lpVtbl->FindDevice(p,a,b) -#define IDirect3D2_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c) -#else -#define IDirect3D2_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3D2_AddRef(p) (p)->AddRef() -#define IDirect3D2_Release(p) (p)->Release() -#define IDirect3D2_EnumDevices(p,a,b) (p)->EnumDevices(a,b) -#define IDirect3D2_CreateLight(p,a,b) (p)->CreateLight(a,b) -#define IDirect3D2_CreateMaterial(p,a,b) (p)->CreateMaterial(a,b) -#define IDirect3D2_CreateViewport(p,a,b) (p)->CreateViewport(a,b) -#define IDirect3D2_FindDevice(p,a,b) (p)->FindDevice(a,b) -#define IDirect3D2_CreateDevice(p,a,b,c) (p)->CreateDevice(a,b,c) -#endif -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#if(DIRECT3D_VERSION >= 0x0600) -#undef INTERFACE -#define INTERFACE IDirect3D3 - -DECLARE_INTERFACE_(IDirect3D3, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3D3 methods ***/ - STDMETHOD(EnumDevices)(THIS_ LPD3DENUMDEVICESCALLBACK,LPVOID) PURE; - STDMETHOD(CreateLight)(THIS_ LPDIRECT3DLIGHT*,LPUNKNOWN) PURE; - STDMETHOD(CreateMaterial)(THIS_ LPDIRECT3DMATERIAL3*,LPUNKNOWN) PURE; - STDMETHOD(CreateViewport)(THIS_ LPDIRECT3DVIEWPORT3*,LPUNKNOWN) PURE; - STDMETHOD(FindDevice)(THIS_ LPD3DFINDDEVICESEARCH,LPD3DFINDDEVICERESULT) PURE; - STDMETHOD(CreateDevice)(THIS_ REFCLSID,LPDIRECTDRAWSURFACE4,LPDIRECT3DDEVICE3*,LPUNKNOWN) PURE; - STDMETHOD(CreateVertexBuffer)(THIS_ LPD3DVERTEXBUFFERDESC,LPDIRECT3DVERTEXBUFFER*,DWORD,LPUNKNOWN) PURE; - STDMETHOD(EnumZBufferFormats)(THIS_ REFCLSID,LPD3DENUMPIXELFORMATSCALLBACK,LPVOID) PURE; - STDMETHOD(EvictManagedTextures)(THIS) PURE; -}; - -typedef struct IDirect3D3 *LPDIRECT3D3; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3D3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3D3_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3D3_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3D3_EnumDevices(p,a,b) (p)->lpVtbl->EnumDevices(p,a,b) -#define IDirect3D3_CreateLight(p,a,b) (p)->lpVtbl->CreateLight(p,a,b) -#define IDirect3D3_CreateMaterial(p,a,b) (p)->lpVtbl->CreateMaterial(p,a,b) -#define IDirect3D3_CreateViewport(p,a,b) (p)->lpVtbl->CreateViewport(p,a,b) -#define IDirect3D3_FindDevice(p,a,b) (p)->lpVtbl->FindDevice(p,a,b) -#define IDirect3D3_CreateDevice(p,a,b,c,d) (p)->lpVtbl->CreateDevice(p,a,b,c,d) -#define IDirect3D3_CreateVertexBuffer(p,a,b,c,d) (p)->lpVtbl->CreateVertexBuffer(p,a,b,c,d) -#define IDirect3D3_EnumZBufferFormats(p,a,b,c) (p)->lpVtbl->EnumZBufferFormats(p,a,b,c) -#define IDirect3D3_EvictManagedTextures(p) (p)->lpVtbl->EvictManagedTextures(p) -#else -#define IDirect3D3_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3D3_AddRef(p) (p)->AddRef() -#define IDirect3D3_Release(p) (p)->Release() -#define IDirect3D3_EnumDevices(p,a,b) (p)->EnumDevices(a,b) -#define IDirect3D3_CreateLight(p,a,b) (p)->CreateLight(a,b) -#define IDirect3D3_CreateMaterial(p,a,b) (p)->CreateMaterial(a,b) -#define IDirect3D3_CreateViewport(p,a,b) (p)->CreateViewport(a,b) -#define IDirect3D3_FindDevice(p,a,b) (p)->FindDevice(a,b) -#define IDirect3D3_CreateDevice(p,a,b,c,d) (p)->CreateDevice(a,b,c,d) -#define IDirect3D3_CreateVertexBuffer(p,a,b,c,d) (p)->CreateVertexBuffer(a,b,c,d) -#define IDirect3D3_EnumZBufferFormats(p,a,b,c) (p)->EnumZBufferFormats(a,b,c) -#define IDirect3D3_EvictManagedTextures(p) (p)->EvictManagedTextures() -#endif -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -#if(DIRECT3D_VERSION >= 0x0700) -#undef INTERFACE -#define INTERFACE IDirect3D7 - -DECLARE_INTERFACE_(IDirect3D7, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3D7 methods ***/ - STDMETHOD(EnumDevices)(THIS_ LPD3DENUMDEVICESCALLBACK7,LPVOID) PURE; - STDMETHOD(CreateDevice)(THIS_ REFCLSID,LPDIRECTDRAWSURFACE7,LPDIRECT3DDEVICE7*) PURE; - STDMETHOD(CreateVertexBuffer)(THIS_ LPD3DVERTEXBUFFERDESC,LPDIRECT3DVERTEXBUFFER7*,DWORD) PURE; - STDMETHOD(EnumZBufferFormats)(THIS_ REFCLSID,LPD3DENUMPIXELFORMATSCALLBACK,LPVOID) PURE; - STDMETHOD(EvictManagedTextures)(THIS) PURE; -}; - -typedef struct IDirect3D7 *LPDIRECT3D7; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3D7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3D7_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3D7_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3D7_EnumDevices(p,a,b) (p)->lpVtbl->EnumDevices(p,a,b) -#define IDirect3D7_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c) -#define IDirect3D7_CreateVertexBuffer(p,a,b,c) (p)->lpVtbl->CreateVertexBuffer(p,a,b,c) -#define IDirect3D7_EnumZBufferFormats(p,a,b,c) (p)->lpVtbl->EnumZBufferFormats(p,a,b,c) -#define IDirect3D7_EvictManagedTextures(p) (p)->lpVtbl->EvictManagedTextures(p) -#else -#define IDirect3D7_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3D7_AddRef(p) (p)->AddRef() -#define IDirect3D7_Release(p) (p)->Release() -#define IDirect3D7_EnumDevices(p,a,b) (p)->EnumDevices(a,b) -#define IDirect3D7_CreateDevice(p,a,b,c) (p)->CreateDevice(a,b,c) -#define IDirect3D7_CreateVertexBuffer(p,a,b,c) (p)->CreateVertexBuffer(a,b,c) -#define IDirect3D7_EnumZBufferFormats(p,a,b,c) (p)->EnumZBufferFormats(a,b,c) -#define IDirect3D7_EvictManagedTextures(p) (p)->EvictManagedTextures() -#endif -#endif /* DIRECT3D_VERSION >= 0x0700 */ -/* - * Direct3D Device interfaces - */ -#undef INTERFACE -#define INTERFACE IDirect3DDevice - -DECLARE_INTERFACE_(IDirect3DDevice, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DDevice methods ***/ - STDMETHOD(Initialize)(THIS_ LPDIRECT3D,LPGUID,LPD3DDEVICEDESC) PURE; - STDMETHOD(GetCaps)(THIS_ LPD3DDEVICEDESC,LPD3DDEVICEDESC) PURE; - STDMETHOD(SwapTextureHandles)(THIS_ LPDIRECT3DTEXTURE,LPDIRECT3DTEXTURE) PURE; - STDMETHOD(CreateExecuteBuffer)(THIS_ LPD3DEXECUTEBUFFERDESC,LPDIRECT3DEXECUTEBUFFER*,IUnknown*) PURE; - STDMETHOD(GetStats)(THIS_ LPD3DSTATS) PURE; - STDMETHOD(Execute)(THIS_ LPDIRECT3DEXECUTEBUFFER,LPDIRECT3DVIEWPORT,DWORD) PURE; - STDMETHOD(AddViewport)(THIS_ LPDIRECT3DVIEWPORT) PURE; - STDMETHOD(DeleteViewport)(THIS_ LPDIRECT3DVIEWPORT) PURE; - STDMETHOD(NextViewport)(THIS_ LPDIRECT3DVIEWPORT,LPDIRECT3DVIEWPORT*,DWORD) PURE; - STDMETHOD(Pick)(THIS_ LPDIRECT3DEXECUTEBUFFER,LPDIRECT3DVIEWPORT,DWORD,LPD3DRECT) PURE; - STDMETHOD(GetPickRecords)(THIS_ LPDWORD,LPD3DPICKRECORD) PURE; - STDMETHOD(EnumTextureFormats)(THIS_ LPD3DENUMTEXTUREFORMATSCALLBACK,LPVOID) PURE; - STDMETHOD(CreateMatrix)(THIS_ LPD3DMATRIXHANDLE) PURE; - STDMETHOD(SetMatrix)(THIS_ D3DMATRIXHANDLE,const LPD3DMATRIX) PURE; - STDMETHOD(GetMatrix)(THIS_ D3DMATRIXHANDLE,LPD3DMATRIX) PURE; - STDMETHOD(DeleteMatrix)(THIS_ D3DMATRIXHANDLE) PURE; - STDMETHOD(BeginScene)(THIS) PURE; - STDMETHOD(EndScene)(THIS) PURE; - STDMETHOD(GetDirect3D)(THIS_ LPDIRECT3D*) PURE; -}; - -typedef struct IDirect3DDevice *LPDIRECT3DDEVICE; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DDevice_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DDevice_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DDevice_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DDevice_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c) -#define IDirect3DDevice_GetCaps(p,a,b) (p)->lpVtbl->GetCaps(p,a,b) -#define IDirect3DDevice_SwapTextureHandles(p,a,b) (p)->lpVtbl->SwapTextureHandles(p,a,b) -#define IDirect3DDevice_CreateExecuteBuffer(p,a,b,c) (p)->lpVtbl->CreateExecuteBuffer(p,a,b,c) -#define IDirect3DDevice_GetStats(p,a) (p)->lpVtbl->GetStats(p,a) -#define IDirect3DDevice_Execute(p,a,b,c) (p)->lpVtbl->Execute(p,a,b,c) -#define IDirect3DDevice_AddViewport(p,a) (p)->lpVtbl->AddViewport(p,a) -#define IDirect3DDevice_DeleteViewport(p,a) (p)->lpVtbl->DeleteViewport(p,a) -#define IDirect3DDevice_NextViewport(p,a,b,c) (p)->lpVtbl->NextViewport(p,a,b,c) -#define IDirect3DDevice_Pick(p,a,b,c,d) (p)->lpVtbl->Pick(p,a,b,c,d) -#define IDirect3DDevice_GetPickRecords(p,a,b) (p)->lpVtbl->GetPickRecords(p,a,b) -#define IDirect3DDevice_EnumTextureFormats(p,a,b) (p)->lpVtbl->EnumTextureFormats(p,a,b) -#define IDirect3DDevice_CreateMatrix(p,a) (p)->lpVtbl->CreateMatrix(p,a) -#define IDirect3DDevice_SetMatrix(p,a,b) (p)->lpVtbl->SetMatrix(p,a,b) -#define IDirect3DDevice_GetMatrix(p,a,b) (p)->lpVtbl->GetMatrix(p,a,b) -#define IDirect3DDevice_DeleteMatrix(p,a) (p)->lpVtbl->DeleteMatrix(p,a) -#define IDirect3DDevice_BeginScene(p) (p)->lpVtbl->BeginScene(p) -#define IDirect3DDevice_EndScene(p) (p)->lpVtbl->EndScene(p) -#define IDirect3DDevice_GetDirect3D(p,a) (p)->lpVtbl->GetDirect3D(p,a) -#else -#define IDirect3DDevice_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DDevice_AddRef(p) (p)->AddRef() -#define IDirect3DDevice_Release(p) (p)->Release() -#define IDirect3DDevice_Initialize(p,a,b,c) (p)->Initialize(a,b,c) -#define IDirect3DDevice_GetCaps(p,a,b) (p)->GetCaps(a,b) -#define IDirect3DDevice_SwapTextureHandles(p,a,b) (p)->SwapTextureHandles(a,b) -#define IDirect3DDevice_CreateExecuteBuffer(p,a,b,c) (p)->CreateExecuteBuffer(a,b,c) -#define IDirect3DDevice_GetStats(p,a) (p)->GetStats(a) -#define IDirect3DDevice_Execute(p,a,b,c) (p)->Execute(a,b,c) -#define IDirect3DDevice_AddViewport(p,a) (p)->AddViewport(a) -#define IDirect3DDevice_DeleteViewport(p,a) (p)->DeleteViewport(a) -#define IDirect3DDevice_NextViewport(p,a,b,c) (p)->NextViewport(a,b,c) -#define IDirect3DDevice_Pick(p,a,b,c,d) (p)->Pick(a,b,c,d) -#define IDirect3DDevice_GetPickRecords(p,a,b) (p)->GetPickRecords(a,b) -#define IDirect3DDevice_EnumTextureFormats(p,a,b) (p)->EnumTextureFormats(a,b) -#define IDirect3DDevice_CreateMatrix(p,a) (p)->CreateMatrix(a) -#define IDirect3DDevice_SetMatrix(p,a,b) (p)->SetMatrix(a,b) -#define IDirect3DDevice_GetMatrix(p,a,b) (p)->GetMatrix(a,b) -#define IDirect3DDevice_DeleteMatrix(p,a) (p)->DeleteMatrix(a) -#define IDirect3DDevice_BeginScene(p) (p)->BeginScene() -#define IDirect3DDevice_EndScene(p) (p)->EndScene() -#define IDirect3DDevice_GetDirect3D(p,a) (p)->GetDirect3D(a) -#endif - -#if(DIRECT3D_VERSION >= 0x0500) -#undef INTERFACE -#define INTERFACE IDirect3DDevice2 - -DECLARE_INTERFACE_(IDirect3DDevice2, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DDevice2 methods ***/ - STDMETHOD(GetCaps)(THIS_ LPD3DDEVICEDESC,LPD3DDEVICEDESC) PURE; - STDMETHOD(SwapTextureHandles)(THIS_ LPDIRECT3DTEXTURE2,LPDIRECT3DTEXTURE2) PURE; - STDMETHOD(GetStats)(THIS_ LPD3DSTATS) PURE; - STDMETHOD(AddViewport)(THIS_ LPDIRECT3DVIEWPORT2) PURE; - STDMETHOD(DeleteViewport)(THIS_ LPDIRECT3DVIEWPORT2) PURE; - STDMETHOD(NextViewport)(THIS_ LPDIRECT3DVIEWPORT2,LPDIRECT3DVIEWPORT2*,DWORD) PURE; - STDMETHOD(EnumTextureFormats)(THIS_ LPD3DENUMTEXTUREFORMATSCALLBACK,LPVOID) PURE; - STDMETHOD(BeginScene)(THIS) PURE; - STDMETHOD(EndScene)(THIS) PURE; - STDMETHOD(GetDirect3D)(THIS_ LPDIRECT3D2*) PURE; - STDMETHOD(SetCurrentViewport)(THIS_ LPDIRECT3DVIEWPORT2) PURE; - STDMETHOD(GetCurrentViewport)(THIS_ LPDIRECT3DVIEWPORT2 *) PURE; - STDMETHOD(SetRenderTarget)(THIS_ LPDIRECTDRAWSURFACE,DWORD) PURE; - STDMETHOD(GetRenderTarget)(THIS_ LPDIRECTDRAWSURFACE *) PURE; - STDMETHOD(Begin)(THIS_ D3DPRIMITIVETYPE,D3DVERTEXTYPE,DWORD) PURE; - STDMETHOD(BeginIndexed)(THIS_ D3DPRIMITIVETYPE,D3DVERTEXTYPE,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(Vertex)(THIS_ LPVOID) PURE; - STDMETHOD(Index)(THIS_ WORD) PURE; - STDMETHOD(End)(THIS_ DWORD) PURE; - STDMETHOD(GetRenderState)(THIS_ D3DRENDERSTATETYPE,LPDWORD) PURE; - STDMETHOD(SetRenderState)(THIS_ D3DRENDERSTATETYPE,DWORD) PURE; - STDMETHOD(GetLightState)(THIS_ D3DLIGHTSTATETYPE,LPDWORD) PURE; - STDMETHOD(SetLightState)(THIS_ D3DLIGHTSTATETYPE,DWORD) PURE; - STDMETHOD(SetTransform)(THIS_ D3DTRANSFORMSTATETYPE,LPD3DMATRIX) PURE; - STDMETHOD(GetTransform)(THIS_ D3DTRANSFORMSTATETYPE,LPD3DMATRIX) PURE; - STDMETHOD(MultiplyTransform)(THIS_ D3DTRANSFORMSTATETYPE,LPD3DMATRIX) PURE; - STDMETHOD(DrawPrimitive)(THIS_ D3DPRIMITIVETYPE,D3DVERTEXTYPE,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(DrawIndexedPrimitive)(THIS_ D3DPRIMITIVETYPE,D3DVERTEXTYPE,LPVOID,DWORD,LPWORD,DWORD,DWORD) PURE; - STDMETHOD(SetClipStatus)(THIS_ LPD3DCLIPSTATUS) PURE; - STDMETHOD(GetClipStatus)(THIS_ LPD3DCLIPSTATUS) PURE; -}; - -typedef struct IDirect3DDevice2 *LPDIRECT3DDEVICE2; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DDevice2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DDevice2_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DDevice2_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DDevice2_GetCaps(p,a,b) (p)->lpVtbl->GetCaps(p,a,b) -#define IDirect3DDevice2_SwapTextureHandles(p,a,b) (p)->lpVtbl->SwapTextureHandles(p,a,b) -#define IDirect3DDevice2_GetStats(p,a) (p)->lpVtbl->GetStats(p,a) -#define IDirect3DDevice2_AddViewport(p,a) (p)->lpVtbl->AddViewport(p,a) -#define IDirect3DDevice2_DeleteViewport(p,a) (p)->lpVtbl->DeleteViewport(p,a) -#define IDirect3DDevice2_NextViewport(p,a,b,c) (p)->lpVtbl->NextViewport(p,a,b,c) -#define IDirect3DDevice2_EnumTextureFormats(p,a,b) (p)->lpVtbl->EnumTextureFormats(p,a,b) -#define IDirect3DDevice2_BeginScene(p) (p)->lpVtbl->BeginScene(p) -#define IDirect3DDevice2_EndScene(p) (p)->lpVtbl->EndScene(p) -#define IDirect3DDevice2_GetDirect3D(p,a) (p)->lpVtbl->GetDirect3D(p,a) -#define IDirect3DDevice2_SetCurrentViewport(p,a) (p)->lpVtbl->SetCurrentViewport(p,a) -#define IDirect3DDevice2_GetCurrentViewport(p,a) (p)->lpVtbl->GetCurrentViewport(p,a) -#define IDirect3DDevice2_SetRenderTarget(p,a,b) (p)->lpVtbl->SetRenderTarget(p,a,b) -#define IDirect3DDevice2_GetRenderTarget(p,a) (p)->lpVtbl->GetRenderTarget(p,a) -#define IDirect3DDevice2_Begin(p,a,b,c) (p)->lpVtbl->Begin(p,a,b,c) -#define IDirect3DDevice2_BeginIndexed(p,a,b,c,d,e) (p)->lpVtbl->BeginIndexed(p,a,b,c,d,e) -#define IDirect3DDevice2_Vertex(p,a) (p)->lpVtbl->Vertex(p,a) -#define IDirect3DDevice2_Index(p,a) (p)->lpVtbl->Index(p,a) -#define IDirect3DDevice2_End(p,a) (p)->lpVtbl->End(p,a) -#define IDirect3DDevice2_GetRenderState(p,a,b) (p)->lpVtbl->GetRenderState(p,a,b) -#define IDirect3DDevice2_SetRenderState(p,a,b) (p)->lpVtbl->SetRenderState(p,a,b) -#define IDirect3DDevice2_GetLightState(p,a,b) (p)->lpVtbl->GetLightState(p,a,b) -#define IDirect3DDevice2_SetLightState(p,a,b) (p)->lpVtbl->SetLightState(p,a,b) -#define IDirect3DDevice2_SetTransform(p,a,b) (p)->lpVtbl->SetTransform(p,a,b) -#define IDirect3DDevice2_GetTransform(p,a,b) (p)->lpVtbl->GetTransform(p,a,b) -#define IDirect3DDevice2_MultiplyTransform(p,a,b) (p)->lpVtbl->MultiplyTransform(p,a,b) -#define IDirect3DDevice2_DrawPrimitive(p,a,b,c,d,e) (p)->lpVtbl->DrawPrimitive(p,a,b,c,d,e) -#define IDirect3DDevice2_DrawIndexedPrimitive(p,a,b,c,d,e,f,g) (p)->lpVtbl->DrawIndexedPrimitive(p,a,b,c,d,e,f,g) -#define IDirect3DDevice2_SetClipStatus(p,a) (p)->lpVtbl->SetClipStatus(p,a) -#define IDirect3DDevice2_GetClipStatus(p,a) (p)->lpVtbl->GetClipStatus(p,a) -#else -#define IDirect3DDevice2_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DDevice2_AddRef(p) (p)->AddRef() -#define IDirect3DDevice2_Release(p) (p)->Release() -#define IDirect3DDevice2_GetCaps(p,a,b) (p)->GetCaps(a,b) -#define IDirect3DDevice2_SwapTextureHandles(p,a,b) (p)->SwapTextureHandles(a,b) -#define IDirect3DDevice2_GetStats(p,a) (p)->GetStats(a) -#define IDirect3DDevice2_AddViewport(p,a) (p)->AddViewport(a) -#define IDirect3DDevice2_DeleteViewport(p,a) (p)->DeleteViewport(a) -#define IDirect3DDevice2_NextViewport(p,a,b,c) (p)->NextViewport(a,b,c) -#define IDirect3DDevice2_EnumTextureFormats(p,a,b) (p)->EnumTextureFormats(a,b) -#define IDirect3DDevice2_BeginScene(p) (p)->BeginScene() -#define IDirect3DDevice2_EndScene(p) (p)->EndScene() -#define IDirect3DDevice2_GetDirect3D(p,a) (p)->GetDirect3D(a) -#define IDirect3DDevice2_SetCurrentViewport(p,a) (p)->SetCurrentViewport(a) -#define IDirect3DDevice2_GetCurrentViewport(p,a) (p)->GetCurrentViewport(a) -#define IDirect3DDevice2_SetRenderTarget(p,a,b) (p)->SetRenderTarget(a,b) -#define IDirect3DDevice2_GetRenderTarget(p,a) (p)->GetRenderTarget(a) -#define IDirect3DDevice2_Begin(p,a,b,c) (p)->Begin(a,b,c) -#define IDirect3DDevice2_BeginIndexed(p,a,b,c,d,e) (p)->BeginIndexed(a,b,c,d,e) -#define IDirect3DDevice2_Vertex(p,a) (p)->Vertex(a) -#define IDirect3DDevice2_Index(p,a) (p)->Index(a) -#define IDirect3DDevice2_End(p,a) (p)->End(a) -#define IDirect3DDevice2_GetRenderState(p,a,b) (p)->GetRenderState(a,b) -#define IDirect3DDevice2_SetRenderState(p,a,b) (p)->SetRenderState(a,b) -#define IDirect3DDevice2_GetLightState(p,a,b) (p)->GetLightState(a,b) -#define IDirect3DDevice2_SetLightState(p,a,b) (p)->SetLightState(a,b) -#define IDirect3DDevice2_SetTransform(p,a,b) (p)->SetTransform(a,b) -#define IDirect3DDevice2_GetTransform(p,a,b) (p)->GetTransform(a,b) -#define IDirect3DDevice2_MultiplyTransform(p,a,b) (p)->MultiplyTransform(a,b) -#define IDirect3DDevice2_DrawPrimitive(p,a,b,c,d,e) (p)->DrawPrimitive(a,b,c,d,e) -#define IDirect3DDevice2_DrawIndexedPrimitive(p,a,b,c,d,e,f,g) (p)->DrawIndexedPrimitive(a,b,c,d,e,f,g) -#define IDirect3DDevice2_SetClipStatus(p,a) (p)->SetClipStatus(a) -#define IDirect3DDevice2_GetClipStatus(p,a) (p)->GetClipStatus(a) -#endif -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#if(DIRECT3D_VERSION >= 0x0600) -#undef INTERFACE -#define INTERFACE IDirect3DDevice3 - -DECLARE_INTERFACE_(IDirect3DDevice3, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DDevice3 methods ***/ - STDMETHOD(GetCaps)(THIS_ LPD3DDEVICEDESC,LPD3DDEVICEDESC) PURE; - STDMETHOD(GetStats)(THIS_ LPD3DSTATS) PURE; - STDMETHOD(AddViewport)(THIS_ LPDIRECT3DVIEWPORT3) PURE; - STDMETHOD(DeleteViewport)(THIS_ LPDIRECT3DVIEWPORT3) PURE; - STDMETHOD(NextViewport)(THIS_ LPDIRECT3DVIEWPORT3,LPDIRECT3DVIEWPORT3*,DWORD) PURE; - STDMETHOD(EnumTextureFormats)(THIS_ LPD3DENUMPIXELFORMATSCALLBACK,LPVOID) PURE; - STDMETHOD(BeginScene)(THIS) PURE; - STDMETHOD(EndScene)(THIS) PURE; - STDMETHOD(GetDirect3D)(THIS_ LPDIRECT3D3*) PURE; - STDMETHOD(SetCurrentViewport)(THIS_ LPDIRECT3DVIEWPORT3) PURE; - STDMETHOD(GetCurrentViewport)(THIS_ LPDIRECT3DVIEWPORT3 *) PURE; - STDMETHOD(SetRenderTarget)(THIS_ LPDIRECTDRAWSURFACE4,DWORD) PURE; - STDMETHOD(GetRenderTarget)(THIS_ LPDIRECTDRAWSURFACE4 *) PURE; - STDMETHOD(Begin)(THIS_ D3DPRIMITIVETYPE,DWORD,DWORD) PURE; - STDMETHOD(BeginIndexed)(THIS_ D3DPRIMITIVETYPE,DWORD,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(Vertex)(THIS_ LPVOID) PURE; - STDMETHOD(Index)(THIS_ WORD) PURE; - STDMETHOD(End)(THIS_ DWORD) PURE; - STDMETHOD(GetRenderState)(THIS_ D3DRENDERSTATETYPE,LPDWORD) PURE; - STDMETHOD(SetRenderState)(THIS_ D3DRENDERSTATETYPE,DWORD) PURE; - STDMETHOD(GetLightState)(THIS_ D3DLIGHTSTATETYPE,LPDWORD) PURE; - STDMETHOD(SetLightState)(THIS_ D3DLIGHTSTATETYPE,DWORD) PURE; - STDMETHOD(SetTransform)(THIS_ D3DTRANSFORMSTATETYPE,LPD3DMATRIX) PURE; - STDMETHOD(GetTransform)(THIS_ D3DTRANSFORMSTATETYPE,LPD3DMATRIX) PURE; - STDMETHOD(MultiplyTransform)(THIS_ D3DTRANSFORMSTATETYPE,LPD3DMATRIX) PURE; - STDMETHOD(DrawPrimitive)(THIS_ D3DPRIMITIVETYPE,DWORD,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(DrawIndexedPrimitive)(THIS_ D3DPRIMITIVETYPE,DWORD,LPVOID,DWORD,LPWORD,DWORD,DWORD) PURE; - STDMETHOD(SetClipStatus)(THIS_ LPD3DCLIPSTATUS) PURE; - STDMETHOD(GetClipStatus)(THIS_ LPD3DCLIPSTATUS) PURE; - STDMETHOD(DrawPrimitiveStrided)(THIS_ D3DPRIMITIVETYPE,DWORD,LPD3DDRAWPRIMITIVESTRIDEDDATA,DWORD,DWORD) PURE; - STDMETHOD(DrawIndexedPrimitiveStrided)(THIS_ D3DPRIMITIVETYPE,DWORD,LPD3DDRAWPRIMITIVESTRIDEDDATA,DWORD,LPWORD,DWORD,DWORD) PURE; - STDMETHOD(DrawPrimitiveVB)(THIS_ D3DPRIMITIVETYPE,LPDIRECT3DVERTEXBUFFER,DWORD,DWORD,DWORD) PURE; - STDMETHOD(DrawIndexedPrimitiveVB)(THIS_ D3DPRIMITIVETYPE,LPDIRECT3DVERTEXBUFFER,LPWORD,DWORD,DWORD) PURE; - STDMETHOD(ComputeSphereVisibility)(THIS_ LPD3DVECTOR,LPD3DVALUE,DWORD,DWORD,LPDWORD) PURE; - STDMETHOD(GetTexture)(THIS_ DWORD,LPDIRECT3DTEXTURE2 *) PURE; - STDMETHOD(SetTexture)(THIS_ DWORD,LPDIRECT3DTEXTURE2) PURE; - STDMETHOD(GetTextureStageState)(THIS_ DWORD,D3DTEXTURESTAGESTATETYPE,LPDWORD) PURE; - STDMETHOD(SetTextureStageState)(THIS_ DWORD,D3DTEXTURESTAGESTATETYPE,DWORD) PURE; - STDMETHOD(ValidateDevice)(THIS_ LPDWORD) PURE; -}; - -typedef struct IDirect3DDevice3 *LPDIRECT3DDEVICE3; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DDevice3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DDevice3_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DDevice3_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DDevice3_GetCaps(p,a,b) (p)->lpVtbl->GetCaps(p,a,b) -#define IDirect3DDevice3_GetStats(p,a) (p)->lpVtbl->GetStats(p,a) -#define IDirect3DDevice3_AddViewport(p,a) (p)->lpVtbl->AddViewport(p,a) -#define IDirect3DDevice3_DeleteViewport(p,a) (p)->lpVtbl->DeleteViewport(p,a) -#define IDirect3DDevice3_NextViewport(p,a,b,c) (p)->lpVtbl->NextViewport(p,a,b,c) -#define IDirect3DDevice3_EnumTextureFormats(p,a,b) (p)->lpVtbl->EnumTextureFormats(p,a,b) -#define IDirect3DDevice3_BeginScene(p) (p)->lpVtbl->BeginScene(p) -#define IDirect3DDevice3_EndScene(p) (p)->lpVtbl->EndScene(p) -#define IDirect3DDevice3_GetDirect3D(p,a) (p)->lpVtbl->GetDirect3D(p,a) -#define IDirect3DDevice3_SetCurrentViewport(p,a) (p)->lpVtbl->SetCurrentViewport(p,a) -#define IDirect3DDevice3_GetCurrentViewport(p,a) (p)->lpVtbl->GetCurrentViewport(p,a) -#define IDirect3DDevice3_SetRenderTarget(p,a,b) (p)->lpVtbl->SetRenderTarget(p,a,b) -#define IDirect3DDevice3_GetRenderTarget(p,a) (p)->lpVtbl->GetRenderTarget(p,a) -#define IDirect3DDevice3_Begin(p,a,b,c) (p)->lpVtbl->Begin(p,a,b,c) -#define IDirect3DDevice3_BeginIndexed(p,a,b,c,d,e) (p)->lpVtbl->BeginIndexed(p,a,b,c,d,e) -#define IDirect3DDevice3_Vertex(p,a) (p)->lpVtbl->Vertex(p,a) -#define IDirect3DDevice3_Index(p,a) (p)->lpVtbl->Index(p,a) -#define IDirect3DDevice3_End(p,a) (p)->lpVtbl->End(p,a) -#define IDirect3DDevice3_GetRenderState(p,a,b) (p)->lpVtbl->GetRenderState(p,a,b) -#define IDirect3DDevice3_SetRenderState(p,a,b) (p)->lpVtbl->SetRenderState(p,a,b) -#define IDirect3DDevice3_GetLightState(p,a,b) (p)->lpVtbl->GetLightState(p,a,b) -#define IDirect3DDevice3_SetLightState(p,a,b) (p)->lpVtbl->SetLightState(p,a,b) -#define IDirect3DDevice3_SetTransform(p,a,b) (p)->lpVtbl->SetTransform(p,a,b) -#define IDirect3DDevice3_GetTransform(p,a,b) (p)->lpVtbl->GetTransform(p,a,b) -#define IDirect3DDevice3_MultiplyTransform(p,a,b) (p)->lpVtbl->MultiplyTransform(p,a,b) -#define IDirect3DDevice3_DrawPrimitive(p,a,b,c,d,e) (p)->lpVtbl->DrawPrimitive(p,a,b,c,d,e) -#define IDirect3DDevice3_DrawIndexedPrimitive(p,a,b,c,d,e,f,g) (p)->lpVtbl->DrawIndexedPrimitive(p,a,b,c,d,e,f,g) -#define IDirect3DDevice3_SetClipStatus(p,a) (p)->lpVtbl->SetClipStatus(p,a) -#define IDirect3DDevice3_GetClipStatus(p,a) (p)->lpVtbl->GetClipStatus(p,a) -#define IDirect3DDevice3_DrawPrimitiveStrided(p,a,b,c,d,e) (p)->lpVtbl->DrawPrimitiveStrided(p,a,b,c,d,e) -#define IDirect3DDevice3_DrawIndexedPrimitiveStrided(p,a,b,c,d,e,f,g) (p)->lpVtbl->DrawIndexedPrimitiveStrided(p,a,b,c,d,e,f,g) -#define IDirect3DDevice3_DrawPrimitiveVB(p,a,b,c,d,e) (p)->lpVtbl->DrawPrimitiveVB(p,a,b,c,d,e) -#define IDirect3DDevice3_DrawIndexedPrimitiveVB(p,a,b,c,d,e) (p)->lpVtbl->DrawIndexedPrimitiveVB(p,a,b,c,d,e) -#define IDirect3DDevice3_ComputeSphereVisibility(p,a,b,c,d,e) (p)->lpVtbl->ComputeSphereVisibility(p,a,b,c,d,e) -#define IDirect3DDevice3_GetTexture(p,a,b) (p)->lpVtbl->GetTexture(p,a,b) -#define IDirect3DDevice3_SetTexture(p,a,b) (p)->lpVtbl->SetTexture(p,a,b) -#define IDirect3DDevice3_GetTextureStageState(p,a,b,c) (p)->lpVtbl->GetTextureStageState(p,a,b,c) -#define IDirect3DDevice3_SetTextureStageState(p,a,b,c) (p)->lpVtbl->SetTextureStageState(p,a,b,c) -#define IDirect3DDevice3_ValidateDevice(p,a) (p)->lpVtbl->ValidateDevice(p,a) -#else -#define IDirect3DDevice3_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DDevice3_AddRef(p) (p)->AddRef() -#define IDirect3DDevice3_Release(p) (p)->Release() -#define IDirect3DDevice3_GetCaps(p,a,b) (p)->GetCaps(a,b) -#define IDirect3DDevice3_GetStats(p,a) (p)->GetStats(a) -#define IDirect3DDevice3_AddViewport(p,a) (p)->AddViewport(a) -#define IDirect3DDevice3_DeleteViewport(p,a) (p)->DeleteViewport(a) -#define IDirect3DDevice3_NextViewport(p,a,b,c) (p)->NextViewport(a,b,c) -#define IDirect3DDevice3_EnumTextureFormats(p,a,b) (p)->EnumTextureFormats(a,b) -#define IDirect3DDevice3_BeginScene(p) (p)->BeginScene() -#define IDirect3DDevice3_EndScene(p) (p)->EndScene() -#define IDirect3DDevice3_GetDirect3D(p,a) (p)->GetDirect3D(a) -#define IDirect3DDevice3_SetCurrentViewport(p,a) (p)->SetCurrentViewport(a) -#define IDirect3DDevice3_GetCurrentViewport(p,a) (p)->GetCurrentViewport(a) -#define IDirect3DDevice3_SetRenderTarget(p,a,b) (p)->SetRenderTarget(a,b) -#define IDirect3DDevice3_GetRenderTarget(p,a) (p)->GetRenderTarget(a) -#define IDirect3DDevice3_Begin(p,a,b,c) (p)->Begin(a,b,c) -#define IDirect3DDevice3_BeginIndexed(p,a,b,c,d,e) (p)->BeginIndexed(a,b,c,d,e) -#define IDirect3DDevice3_Vertex(p,a) (p)->Vertex(a) -#define IDirect3DDevice3_Index(p,a) (p)->Index(a) -#define IDirect3DDevice3_End(p,a) (p)->End(a) -#define IDirect3DDevice3_GetRenderState(p,a,b) (p)->GetRenderState(a,b) -#define IDirect3DDevice3_SetRenderState(p,a,b) (p)->SetRenderState(a,b) -#define IDirect3DDevice3_GetLightState(p,a,b) (p)->GetLightState(a,b) -#define IDirect3DDevice3_SetLightState(p,a,b) (p)->SetLightState(a,b) -#define IDirect3DDevice3_SetTransform(p,a,b) (p)->SetTransform(a,b) -#define IDirect3DDevice3_GetTransform(p,a,b) (p)->GetTransform(a,b) -#define IDirect3DDevice3_MultiplyTransform(p,a,b) (p)->MultiplyTransform(a,b) -#define IDirect3DDevice3_DrawPrimitive(p,a,b,c,d,e) (p)->DrawPrimitive(a,b,c,d,e) -#define IDirect3DDevice3_DrawIndexedPrimitive(p,a,b,c,d,e,f,g) (p)->DrawIndexedPrimitive(a,b,c,d,e,f,g) -#define IDirect3DDevice3_SetClipStatus(p,a) (p)->SetClipStatus(a) -#define IDirect3DDevice3_GetClipStatus(p,a) (p)->GetClipStatus(a) -#define IDirect3DDevice3_DrawPrimitiveStrided(p,a,b,c,d,e) (p)->DrawPrimitiveStrided(a,b,c,d,e) -#define IDirect3DDevice3_DrawIndexedPrimitiveStrided(p,a,b,c,d,e,f,g) (p)->DrawIndexedPrimitiveStrided(a,b,c,d,e,f,g) -#define IDirect3DDevice3_DrawPrimitiveVB(p,a,b,c,d,e) (p)->DrawPrimitiveVB(a,b,c,d,e) -#define IDirect3DDevice3_DrawIndexedPrimitiveVB(p,a,b,c,d,e) (p)->DrawIndexedPrimitiveVB(a,b,c,d,e) -#define IDirect3DDevice3_ComputeSphereVisibility(p,a,b,c,d,e) (p)->ComputeSphereVisibility(a,b,c,d,e) -#define IDirect3DDevice3_GetTexture(p,a,b) (p)->GetTexture(a,b) -#define IDirect3DDevice3_SetTexture(p,a,b) (p)->SetTexture(a,b) -#define IDirect3DDevice3_GetTextureStageState(p,a,b,c) (p)->GetTextureStageState(a,b,c) -#define IDirect3DDevice3_SetTextureStageState(p,a,b,c) (p)->SetTextureStageState(a,b,c) -#define IDirect3DDevice3_ValidateDevice(p,a) (p)->ValidateDevice(a) -#endif -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -#if(DIRECT3D_VERSION >= 0x0700) -#undef INTERFACE -#define INTERFACE IDirect3DDevice7 - -DECLARE_INTERFACE_(IDirect3DDevice7, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DDevice7 methods ***/ - STDMETHOD(GetCaps)(THIS_ LPD3DDEVICEDESC7) PURE; - STDMETHOD(EnumTextureFormats)(THIS_ LPD3DENUMPIXELFORMATSCALLBACK,LPVOID) PURE; - STDMETHOD(BeginScene)(THIS) PURE; - STDMETHOD(EndScene)(THIS) PURE; - STDMETHOD(GetDirect3D)(THIS_ LPDIRECT3D7*) PURE; - STDMETHOD(SetRenderTarget)(THIS_ LPDIRECTDRAWSURFACE7,DWORD) PURE; - STDMETHOD(GetRenderTarget)(THIS_ LPDIRECTDRAWSURFACE7 *) PURE; - STDMETHOD(Clear)(THIS_ DWORD,LPD3DRECT,DWORD,D3DCOLOR,D3DVALUE,DWORD) PURE; - STDMETHOD(SetTransform)(THIS_ D3DTRANSFORMSTATETYPE,LPD3DMATRIX) PURE; - STDMETHOD(GetTransform)(THIS_ D3DTRANSFORMSTATETYPE,LPD3DMATRIX) PURE; - STDMETHOD(SetViewport)(THIS_ LPD3DVIEWPORT7) PURE; - STDMETHOD(MultiplyTransform)(THIS_ D3DTRANSFORMSTATETYPE,LPD3DMATRIX) PURE; - STDMETHOD(GetViewport)(THIS_ LPD3DVIEWPORT7) PURE; - STDMETHOD(SetMaterial)(THIS_ LPD3DMATERIAL7) PURE; - STDMETHOD(GetMaterial)(THIS_ LPD3DMATERIAL7) PURE; - STDMETHOD(SetLight)(THIS_ DWORD,LPD3DLIGHT7) PURE; - STDMETHOD(GetLight)(THIS_ DWORD,LPD3DLIGHT7) PURE; - STDMETHOD(SetRenderState)(THIS_ D3DRENDERSTATETYPE,DWORD) PURE; - STDMETHOD(GetRenderState)(THIS_ D3DRENDERSTATETYPE,LPDWORD) PURE; - STDMETHOD(BeginStateBlock)(THIS) PURE; - STDMETHOD(EndStateBlock)(THIS_ LPDWORD) PURE; - STDMETHOD(PreLoad)(THIS_ LPDIRECTDRAWSURFACE7) PURE; - STDMETHOD(DrawPrimitive)(THIS_ D3DPRIMITIVETYPE,DWORD,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(DrawIndexedPrimitive)(THIS_ D3DPRIMITIVETYPE,DWORD,LPVOID,DWORD,LPWORD,DWORD,DWORD) PURE; - STDMETHOD(SetClipStatus)(THIS_ LPD3DCLIPSTATUS) PURE; - STDMETHOD(GetClipStatus)(THIS_ LPD3DCLIPSTATUS) PURE; - STDMETHOD(DrawPrimitiveStrided)(THIS_ D3DPRIMITIVETYPE,DWORD,LPD3DDRAWPRIMITIVESTRIDEDDATA,DWORD,DWORD) PURE; - STDMETHOD(DrawIndexedPrimitiveStrided)(THIS_ D3DPRIMITIVETYPE,DWORD,LPD3DDRAWPRIMITIVESTRIDEDDATA,DWORD,LPWORD,DWORD,DWORD) PURE; - STDMETHOD(DrawPrimitiveVB)(THIS_ D3DPRIMITIVETYPE,LPDIRECT3DVERTEXBUFFER7,DWORD,DWORD,DWORD) PURE; - STDMETHOD(DrawIndexedPrimitiveVB)(THIS_ D3DPRIMITIVETYPE,LPDIRECT3DVERTEXBUFFER7,DWORD,DWORD,LPWORD,DWORD,DWORD) PURE; - STDMETHOD(ComputeSphereVisibility)(THIS_ LPD3DVECTOR,LPD3DVALUE,DWORD,DWORD,LPDWORD) PURE; - STDMETHOD(GetTexture)(THIS_ DWORD,LPDIRECTDRAWSURFACE7 *) PURE; - STDMETHOD(SetTexture)(THIS_ DWORD,LPDIRECTDRAWSURFACE7) PURE; - STDMETHOD(GetTextureStageState)(THIS_ DWORD,D3DTEXTURESTAGESTATETYPE,LPDWORD) PURE; - STDMETHOD(SetTextureStageState)(THIS_ DWORD,D3DTEXTURESTAGESTATETYPE,DWORD) PURE; - STDMETHOD(ValidateDevice)(THIS_ LPDWORD) PURE; - STDMETHOD(ApplyStateBlock)(THIS_ DWORD) PURE; - STDMETHOD(CaptureStateBlock)(THIS_ DWORD) PURE; - STDMETHOD(DeleteStateBlock)(THIS_ DWORD) PURE; - STDMETHOD(CreateStateBlock)(THIS_ D3DSTATEBLOCKTYPE,LPDWORD) PURE; - STDMETHOD(Load)(THIS_ LPDIRECTDRAWSURFACE7,LPPOINT,LPDIRECTDRAWSURFACE7,LPRECT,DWORD) PURE; - STDMETHOD(LightEnable)(THIS_ DWORD,BOOL) PURE; - STDMETHOD(GetLightEnable)(THIS_ DWORD,BOOL*) PURE; - STDMETHOD(SetClipPlane)(THIS_ DWORD,D3DVALUE*) PURE; - STDMETHOD(GetClipPlane)(THIS_ DWORD,D3DVALUE*) PURE; - STDMETHOD(GetInfo)(THIS_ DWORD,LPVOID,DWORD) PURE; -}; - -typedef struct IDirect3DDevice7 *LPDIRECT3DDEVICE7; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DDevice7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DDevice7_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DDevice7_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DDevice7_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) -#define IDirect3DDevice7_EnumTextureFormats(p,a,b) (p)->lpVtbl->EnumTextureFormats(p,a,b) -#define IDirect3DDevice7_BeginScene(p) (p)->lpVtbl->BeginScene(p) -#define IDirect3DDevice7_EndScene(p) (p)->lpVtbl->EndScene(p) -#define IDirect3DDevice7_GetDirect3D(p,a) (p)->lpVtbl->GetDirect3D(p,a) -#define IDirect3DDevice7_SetRenderTarget(p,a,b) (p)->lpVtbl->SetRenderTarget(p,a,b) -#define IDirect3DDevice7_GetRenderTarget(p,a) (p)->lpVtbl->GetRenderTarget(p,a) -#define IDirect3DDevice7_Clear(p,a,b,c,d,e,f) (p)->lpVtbl->Clear(p,a,b,c,d,e,f) -#define IDirect3DDevice7_SetTransform(p,a,b) (p)->lpVtbl->SetTransform(p,a,b) -#define IDirect3DDevice7_GetTransform(p,a,b) (p)->lpVtbl->GetTransform(p,a,b) -#define IDirect3DDevice7_SetViewport(p,a) (p)->lpVtbl->SetViewport(p,a) -#define IDirect3DDevice7_MultiplyTransform(p,a,b) (p)->lpVtbl->MultiplyTransform(p,a,b) -#define IDirect3DDevice7_GetViewport(p,a) (p)->lpVtbl->GetViewport(p,a) -#define IDirect3DDevice7_SetMaterial(p,a) (p)->lpVtbl->SetMaterial(p,a) -#define IDirect3DDevice7_GetMaterial(p,a) (p)->lpVtbl->GetMaterial(p,a) -#define IDirect3DDevice7_SetLight(p,a,b) (p)->lpVtbl->SetLight(p,a,b) -#define IDirect3DDevice7_GetLight(p,a,b) (p)->lpVtbl->GetLight(p,a,b) -#define IDirect3DDevice7_SetRenderState(p,a,b) (p)->lpVtbl->SetRenderState(p,a,b) -#define IDirect3DDevice7_GetRenderState(p,a,b) (p)->lpVtbl->GetRenderState(p,a,b) -#define IDirect3DDevice7_BeginStateBlock(p) (p)->lpVtbl->BeginStateBlock(p) -#define IDirect3DDevice7_EndStateBlock(p,a) (p)->lpVtbl->EndStateBlock(p,a) -#define IDirect3DDevice7_PreLoad(p,a) (p)->lpVtbl->PreLoad(p,a) -#define IDirect3DDevice7_DrawPrimitive(p,a,b,c,d,e) (p)->lpVtbl->DrawPrimitive(p,a,b,c,d,e) -#define IDirect3DDevice7_DrawIndexedPrimitive(p,a,b,c,d,e,f,g) (p)->lpVtbl->DrawIndexedPrimitive(p,a,b,c,d,e,f,g) -#define IDirect3DDevice7_SetClipStatus(p,a) (p)->lpVtbl->SetClipStatus(p,a) -#define IDirect3DDevice7_GetClipStatus(p,a) (p)->lpVtbl->GetClipStatus(p,a) -#define IDirect3DDevice7_DrawPrimitiveStrided(p,a,b,c,d,e) (p)->lpVtbl->DrawPrimitiveStrided(p,a,b,c,d,e) -#define IDirect3DDevice7_DrawIndexedPrimitiveStrided(p,a,b,c,d,e,f,g) (p)->lpVtbl->DrawIndexedPrimitiveStrided(p,a,b,c,d,e,f,g) -#define IDirect3DDevice7_DrawPrimitiveVB(p,a,b,c,d,e) (p)->lpVtbl->DrawPrimitiveVB(p,a,b,c,d,e) -#define IDirect3DDevice7_DrawIndexedPrimitiveVB(p,a,b,c,d,e,f,g) (p)->lpVtbl->DrawIndexedPrimitiveVB(p,a,b,c,d,e,f,g) -#define IDirect3DDevice7_ComputeSphereVisibility(p,a,b,c,d,e) (p)->lpVtbl->ComputeSphereVisibility(p,a,b,c,d,e) -#define IDirect3DDevice7_GetTexture(p,a,b) (p)->lpVtbl->GetTexture(p,a,b) -#define IDirect3DDevice7_SetTexture(p,a,b) (p)->lpVtbl->SetTexture(p,a,b) -#define IDirect3DDevice7_GetTextureStageState(p,a,b,c) (p)->lpVtbl->GetTextureStageState(p,a,b,c) -#define IDirect3DDevice7_SetTextureStageState(p,a,b,c) (p)->lpVtbl->SetTextureStageState(p,a,b,c) -#define IDirect3DDevice7_ValidateDevice(p,a) (p)->lpVtbl->ValidateDevice(p,a) -#define IDirect3DDevice7_ApplyStateBlock(p,a) (p)->lpVtbl->ApplyStateBlock(p,a) -#define IDirect3DDevice7_CaptureStateBlock(p,a) (p)->lpVtbl->CaptureStateBlock(p,a) -#define IDirect3DDevice7_DeleteStateBlock(p,a) (p)->lpVtbl->DeleteStateBlock(p,a) -#define IDirect3DDevice7_CreateStateBlock(p,a,b) (p)->lpVtbl->CreateStateBlock(p,a,b) -#define IDirect3DDevice7_Load(p,a,b,c,d,e) (p)->lpVtbl->Load(p,a,b,c,d,e) -#define IDirect3DDevice7_LightEnable(p,a,b) (p)->lpVtbl->LightEnable(p,a,b) -#define IDirect3DDevice7_GetLightEnable(p,a,b) (p)->lpVtbl->GetLightEnable(p,a,b) -#define IDirect3DDevice7_SetClipPlane(p,a,b) (p)->lpVtbl->SetClipPlane(p,a,b) -#define IDirect3DDevice7_GetClipPlane(p,a,b) (p)->lpVtbl->GetClipPlane(p,a,b) -#define IDirect3DDevice7_GetInfo(p,a,b,c) (p)->lpVtbl->GetInfo(p,a,b,c) -#else -#define IDirect3DDevice7_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DDevice7_AddRef(p) (p)->AddRef() -#define IDirect3DDevice7_Release(p) (p)->Release() -#define IDirect3DDevice7_GetCaps(p,a) (p)->GetCaps(a) -#define IDirect3DDevice7_EnumTextureFormats(p,a,b) (p)->EnumTextureFormats(a,b) -#define IDirect3DDevice7_BeginScene(p) (p)->BeginScene() -#define IDirect3DDevice7_EndScene(p) (p)->EndScene() -#define IDirect3DDevice7_GetDirect3D(p,a) (p)->GetDirect3D(a) -#define IDirect3DDevice7_SetRenderTarget(p,a,b) (p)->SetRenderTarget(a,b) -#define IDirect3DDevice7_GetRenderTarget(p,a) (p)->GetRenderTarget(a) -#define IDirect3DDevice7_Clear(p,a,b,c,d,e,f) (p)->Clear(a,b,c,d,e,f) -#define IDirect3DDevice7_SetTransform(p,a,b) (p)->SetTransform(a,b) -#define IDirect3DDevice7_GetTransform(p,a,b) (p)->GetTransform(a,b) -#define IDirect3DDevice7_SetViewport(p,a) (p)->SetViewport(a) -#define IDirect3DDevice7_MultiplyTransform(p,a,b) (p)->MultiplyTransform(a,b) -#define IDirect3DDevice7_GetViewport(p,a) (p)->GetViewport(a) -#define IDirect3DDevice7_SetMaterial(p,a) (p)->SetMaterial(a) -#define IDirect3DDevice7_GetMaterial(p,a) (p)->GetMaterial(a) -#define IDirect3DDevice7_SetLight(p,a,b) (p)->SetLight(a,b) -#define IDirect3DDevice7_GetLight(p,a,b) (p)->GetLight(a,b) -#define IDirect3DDevice7_SetRenderState(p,a,b) (p)->SetRenderState(a,b) -#define IDirect3DDevice7_GetRenderState(p,a,b) (p)->GetRenderState(a,b) -#define IDirect3DDevice7_BeginStateBlock(p) (p)->BeginStateBlock() -#define IDirect3DDevice7_EndStateBlock(p,a) (p)->EndStateBlock(a) -#define IDirect3DDevice7_PreLoad(p,a) (p)->PreLoad(a) -#define IDirect3DDevice7_DrawPrimitive(p,a,b,c,d,e) (p)->DrawPrimitive(a,b,c,d,e) -#define IDirect3DDevice7_DrawIndexedPrimitive(p,a,b,c,d,e,f,g) (p)->DrawIndexedPrimitive(a,b,c,d,e,f,g) -#define IDirect3DDevice7_SetClipStatus(p,a) (p)->SetClipStatus(a) -#define IDirect3DDevice7_GetClipStatus(p,a) (p)->GetClipStatus(a) -#define IDirect3DDevice7_DrawPrimitiveStrided(p,a,b,c,d,e) (p)->DrawPrimitiveStrided(a,b,c,d,e) -#define IDirect3DDevice7_DrawIndexedPrimitiveStrided(p,a,b,c,d,e,f,g) (p)->DrawIndexedPrimitiveStrided(a,b,c,d,e,f,g) -#define IDirect3DDevice7_DrawPrimitiveVB(p,a,b,c,d,e) (p)->DrawPrimitiveVB(a,b,c,d,e) -#define IDirect3DDevice7_DrawIndexedPrimitiveVB(p,a,b,c,d,e,f,g) (p)->DrawIndexedPrimitiveVB(a,b,c,d,e,f,g) -#define IDirect3DDevice7_ComputeSphereVisibility(p,a,b,c,d,e) (p)->ComputeSphereVisibility(a,b,c,d,e) -#define IDirect3DDevice7_GetTexture(p,a,b) (p)->GetTexture(a,b) -#define IDirect3DDevice7_SetTexture(p,a,b) (p)->SetTexture(a,b) -#define IDirect3DDevice7_GetTextureStageState(p,a,b,c) (p)->GetTextureStageState(a,b,c) -#define IDirect3DDevice7_SetTextureStageState(p,a,b,c) (p)->SetTextureStageState(a,b,c) -#define IDirect3DDevice7_ValidateDevice(p,a) (p)->ValidateDevice(a) -#define IDirect3DDevice7_ApplyStateBlock(p,a) (p)->ApplyStateBlock(a) -#define IDirect3DDevice7_CaptureStateBlock(p,a) (p)->CaptureStateBlock(a) -#define IDirect3DDevice7_DeleteStateBlock(p,a) (p)->DeleteStateBlock(a) -#define IDirect3DDevice7_CreateStateBlock(p,a,b) (p)->CreateStateBlock(a,b) -#define IDirect3DDevice7_Load(p,a,b,c,d,e) (p)->Load(a,b,c,d,e) -#define IDirect3DDevice7_LightEnable(p,a,b) (p)->LightEnable(a,b) -#define IDirect3DDevice7_GetLightEnable(p,a,b) (p)->GetLightEnable(a,b) -#define IDirect3DDevice7_SetClipPlane(p,a,b) (p)->SetClipPlane(a,b) -#define IDirect3DDevice7_GetClipPlane(p,a,b) (p)->GetClipPlane(a,b) -#define IDirect3DDevice7_GetInfo(p,a,b,c) (p)->GetInfo(a,b,c) -#endif -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -/* - * Execute Buffer interface - */ -#undef INTERFACE -#define INTERFACE IDirect3DExecuteBuffer - -DECLARE_INTERFACE_(IDirect3DExecuteBuffer, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DExecuteBuffer methods ***/ - STDMETHOD(Initialize)(THIS_ LPDIRECT3DDEVICE,LPD3DEXECUTEBUFFERDESC) PURE; - STDMETHOD(Lock)(THIS_ LPD3DEXECUTEBUFFERDESC) PURE; - STDMETHOD(Unlock)(THIS) PURE; - STDMETHOD(SetExecuteData)(THIS_ LPD3DEXECUTEDATA) PURE; - STDMETHOD(GetExecuteData)(THIS_ LPD3DEXECUTEDATA) PURE; - STDMETHOD(Validate)(THIS_ LPDWORD,LPD3DVALIDATECALLBACK,LPVOID,DWORD) PURE; - STDMETHOD(Optimize)(THIS_ DWORD) PURE; -}; - -typedef struct IDirect3DExecuteBuffer *LPDIRECT3DEXECUTEBUFFER; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DExecuteBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DExecuteBuffer_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DExecuteBuffer_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DExecuteBuffer_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) -#define IDirect3DExecuteBuffer_Lock(p,a) (p)->lpVtbl->Lock(p,a) -#define IDirect3DExecuteBuffer_Unlock(p) (p)->lpVtbl->Unlock(p) -#define IDirect3DExecuteBuffer_SetExecuteData(p,a) (p)->lpVtbl->SetExecuteData(p,a) -#define IDirect3DExecuteBuffer_GetExecuteData(p,a) (p)->lpVtbl->GetExecuteData(p,a) -#define IDirect3DExecuteBuffer_Validate(p,a,b,c,d) (p)->lpVtbl->Validate(p,a,b,c,d) -#define IDirect3DExecuteBuffer_Optimize(p,a) (p)->lpVtbl->Optimize(p,a) -#else -#define IDirect3DExecuteBuffer_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DExecuteBuffer_AddRef(p) (p)->AddRef() -#define IDirect3DExecuteBuffer_Release(p) (p)->Release() -#define IDirect3DExecuteBuffer_Initialize(p,a,b) (p)->Initialize(a,b) -#define IDirect3DExecuteBuffer_Lock(p,a) (p)->Lock(a) -#define IDirect3DExecuteBuffer_Unlock(p) (p)->Unlock() -#define IDirect3DExecuteBuffer_SetExecuteData(p,a) (p)->SetExecuteData(a) -#define IDirect3DExecuteBuffer_GetExecuteData(p,a) (p)->GetExecuteData(a) -#define IDirect3DExecuteBuffer_Validate(p,a,b,c,d) (p)->Validate(a,b,c,d) -#define IDirect3DExecuteBuffer_Optimize(p,a) (p)->Optimize(a) -#endif - -/* - * Light interfaces - */ -#undef INTERFACE -#define INTERFACE IDirect3DLight - -DECLARE_INTERFACE_(IDirect3DLight, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DLight methods ***/ - STDMETHOD(Initialize)(THIS_ LPDIRECT3D) PURE; - STDMETHOD(SetLight)(THIS_ LPD3DLIGHT) PURE; - STDMETHOD(GetLight)(THIS_ LPD3DLIGHT) PURE; -}; - -typedef struct IDirect3DLight *LPDIRECT3DLIGHT; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DLight_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DLight_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DLight_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DLight_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) -#define IDirect3DLight_SetLight(p,a) (p)->lpVtbl->SetLight(p,a) -#define IDirect3DLight_GetLight(p,a) (p)->lpVtbl->GetLight(p,a) -#else -#define IDirect3DLight_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DLight_AddRef(p) (p)->AddRef() -#define IDirect3DLight_Release(p) (p)->Release() -#define IDirect3DLight_Initialize(p,a) (p)->Initialize(a) -#define IDirect3DLight_SetLight(p,a) (p)->SetLight(a) -#define IDirect3DLight_GetLight(p,a) (p)->GetLight(a) -#endif - -/* - * Material interfaces - */ -#undef INTERFACE -#define INTERFACE IDirect3DMaterial - -DECLARE_INTERFACE_(IDirect3DMaterial, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DMaterial methods ***/ - STDMETHOD(Initialize)(THIS_ LPDIRECT3D) PURE; - STDMETHOD(SetMaterial)(THIS_ LPD3DMATERIAL) PURE; - STDMETHOD(GetMaterial)(THIS_ LPD3DMATERIAL) PURE; - STDMETHOD(GetHandle)(THIS_ LPDIRECT3DDEVICE,LPD3DMATERIALHANDLE) PURE; - STDMETHOD(Reserve)(THIS) PURE; - STDMETHOD(Unreserve)(THIS) PURE; -}; - -typedef struct IDirect3DMaterial *LPDIRECT3DMATERIAL; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DMaterial_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DMaterial_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DMaterial_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DMaterial_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) -#define IDirect3DMaterial_SetMaterial(p,a) (p)->lpVtbl->SetMaterial(p,a) -#define IDirect3DMaterial_GetMaterial(p,a) (p)->lpVtbl->GetMaterial(p,a) -#define IDirect3DMaterial_GetHandle(p,a,b) (p)->lpVtbl->GetHandle(p,a,b) -#define IDirect3DMaterial_Reserve(p) (p)->lpVtbl->Reserve(p) -#define IDirect3DMaterial_Unreserve(p) (p)->lpVtbl->Unreserve(p) -#else -#define IDirect3DMaterial_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DMaterial_AddRef(p) (p)->AddRef() -#define IDirect3DMaterial_Release(p) (p)->Release() -#define IDirect3DMaterial_Initialize(p,a) (p)->Initialize(a) -#define IDirect3DMaterial_SetMaterial(p,a) (p)->SetMaterial(a) -#define IDirect3DMaterial_GetMaterial(p,a) (p)->GetMaterial(a) -#define IDirect3DMaterial_GetHandle(p,a,b) (p)->GetHandle(a,b) -#define IDirect3DMaterial_Reserve(p) (p)->Reserve() -#define IDirect3DMaterial_Unreserve(p) (p)->Unreserve() -#endif - -#if(DIRECT3D_VERSION >= 0x0500) -#undef INTERFACE -#define INTERFACE IDirect3DMaterial2 - -DECLARE_INTERFACE_(IDirect3DMaterial2, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DMaterial2 methods ***/ - STDMETHOD(SetMaterial)(THIS_ LPD3DMATERIAL) PURE; - STDMETHOD(GetMaterial)(THIS_ LPD3DMATERIAL) PURE; - STDMETHOD(GetHandle)(THIS_ LPDIRECT3DDEVICE2,LPD3DMATERIALHANDLE) PURE; -}; - -typedef struct IDirect3DMaterial2 *LPDIRECT3DMATERIAL2; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DMaterial2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DMaterial2_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DMaterial2_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DMaterial2_SetMaterial(p,a) (p)->lpVtbl->SetMaterial(p,a) -#define IDirect3DMaterial2_GetMaterial(p,a) (p)->lpVtbl->GetMaterial(p,a) -#define IDirect3DMaterial2_GetHandle(p,a,b) (p)->lpVtbl->GetHandle(p,a,b) -#else -#define IDirect3DMaterial2_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DMaterial2_AddRef(p) (p)->AddRef() -#define IDirect3DMaterial2_Release(p) (p)->Release() -#define IDirect3DMaterial2_SetMaterial(p,a) (p)->SetMaterial(a) -#define IDirect3DMaterial2_GetMaterial(p,a) (p)->GetMaterial(a) -#define IDirect3DMaterial2_GetHandle(p,a,b) (p)->GetHandle(a,b) -#endif -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#if(DIRECT3D_VERSION >= 0x0600) -#undef INTERFACE -#define INTERFACE IDirect3DMaterial3 - -DECLARE_INTERFACE_(IDirect3DMaterial3, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DMaterial3 methods ***/ - STDMETHOD(SetMaterial)(THIS_ LPD3DMATERIAL) PURE; - STDMETHOD(GetMaterial)(THIS_ LPD3DMATERIAL) PURE; - STDMETHOD(GetHandle)(THIS_ LPDIRECT3DDEVICE3,LPD3DMATERIALHANDLE) PURE; -}; - -typedef struct IDirect3DMaterial3 *LPDIRECT3DMATERIAL3; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DMaterial3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DMaterial3_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DMaterial3_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DMaterial3_SetMaterial(p,a) (p)->lpVtbl->SetMaterial(p,a) -#define IDirect3DMaterial3_GetMaterial(p,a) (p)->lpVtbl->GetMaterial(p,a) -#define IDirect3DMaterial3_GetHandle(p,a,b) (p)->lpVtbl->GetHandle(p,a,b) -#else -#define IDirect3DMaterial3_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DMaterial3_AddRef(p) (p)->AddRef() -#define IDirect3DMaterial3_Release(p) (p)->Release() -#define IDirect3DMaterial3_SetMaterial(p,a) (p)->SetMaterial(a) -#define IDirect3DMaterial3_GetMaterial(p,a) (p)->GetMaterial(a) -#define IDirect3DMaterial3_GetHandle(p,a,b) (p)->GetHandle(a,b) -#endif -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -/* - * Texture interfaces - */ -#undef INTERFACE -#define INTERFACE IDirect3DTexture - -DECLARE_INTERFACE_(IDirect3DTexture, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DTexture methods ***/ - STDMETHOD(Initialize)(THIS_ LPDIRECT3DDEVICE,LPDIRECTDRAWSURFACE) PURE; - STDMETHOD(GetHandle)(THIS_ LPDIRECT3DDEVICE,LPD3DTEXTUREHANDLE) PURE; - STDMETHOD(PaletteChanged)(THIS_ DWORD,DWORD) PURE; - STDMETHOD(Load)(THIS_ LPDIRECT3DTEXTURE) PURE; - STDMETHOD(Unload)(THIS) PURE; -}; - -typedef struct IDirect3DTexture *LPDIRECT3DTEXTURE; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DTexture_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DTexture_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DTexture_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DTexture_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) -#define IDirect3DTexture_GetHandle(p,a,b) (p)->lpVtbl->GetHandle(p,a,b) -#define IDirect3DTexture_PaletteChanged(p,a,b) (p)->lpVtbl->PaletteChanged(p,a,b) -#define IDirect3DTexture_Load(p,a) (p)->lpVtbl->Load(p,a) -#define IDirect3DTexture_Unload(p) (p)->lpVtbl->Unload(p) -#else -#define IDirect3DTexture_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DTexture_AddRef(p) (p)->AddRef() -#define IDirect3DTexture_Release(p) (p)->Release() -#define IDirect3DTexture_Initialize(p,a,b) (p)->Initialize(a,b) -#define IDirect3DTexture_GetHandle(p,a,b) (p)->GetHandle(a,b) -#define IDirect3DTexture_PaletteChanged(p,a,b) (p)->PaletteChanged(a,b) -#define IDirect3DTexture_Load(p,a) (p)->Load(a) -#define IDirect3DTexture_Unload(p) (p)->Unload() -#endif - -#if(DIRECT3D_VERSION >= 0x0500) -#undef INTERFACE -#define INTERFACE IDirect3DTexture2 - -DECLARE_INTERFACE_(IDirect3DTexture2, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DTexture2 methods ***/ - STDMETHOD(GetHandle)(THIS_ LPDIRECT3DDEVICE2,LPD3DTEXTUREHANDLE) PURE; - STDMETHOD(PaletteChanged)(THIS_ DWORD,DWORD) PURE; - STDMETHOD(Load)(THIS_ LPDIRECT3DTEXTURE2) PURE; -}; - -typedef struct IDirect3DTexture2 *LPDIRECT3DTEXTURE2; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DTexture2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DTexture2_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DTexture2_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DTexture2_GetHandle(p,a,b) (p)->lpVtbl->GetHandle(p,a,b) -#define IDirect3DTexture2_PaletteChanged(p,a,b) (p)->lpVtbl->PaletteChanged(p,a,b) -#define IDirect3DTexture2_Load(p,a) (p)->lpVtbl->Load(p,a) -#else -#define IDirect3DTexture2_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DTexture2_AddRef(p) (p)->AddRef() -#define IDirect3DTexture2_Release(p) (p)->Release() -#define IDirect3DTexture2_GetHandle(p,a,b) (p)->GetHandle(a,b) -#define IDirect3DTexture2_PaletteChanged(p,a,b) (p)->PaletteChanged(a,b) -#define IDirect3DTexture2_Load(p,a) (p)->Load(a) -#endif -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -/* - * Viewport interfaces - */ -#undef INTERFACE -#define INTERFACE IDirect3DViewport - -DECLARE_INTERFACE_(IDirect3DViewport, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DViewport methods ***/ - STDMETHOD(Initialize)(THIS_ LPDIRECT3D) PURE; - STDMETHOD(GetViewport)(THIS_ LPD3DVIEWPORT) PURE; - STDMETHOD(SetViewport)(THIS_ LPD3DVIEWPORT) PURE; - STDMETHOD(TransformVertices)(THIS_ DWORD,LPD3DTRANSFORMDATA,DWORD,LPDWORD) PURE; - STDMETHOD(LightElements)(THIS_ DWORD,LPD3DLIGHTDATA) PURE; - STDMETHOD(SetBackground)(THIS_ D3DMATERIALHANDLE) PURE; - STDMETHOD(GetBackground)(THIS_ LPD3DMATERIALHANDLE,LPBOOL) PURE; - STDMETHOD(SetBackgroundDepth)(THIS_ LPDIRECTDRAWSURFACE) PURE; - STDMETHOD(GetBackgroundDepth)(THIS_ LPDIRECTDRAWSURFACE*,LPBOOL) PURE; - STDMETHOD(Clear)(THIS_ DWORD,LPD3DRECT,DWORD) PURE; - STDMETHOD(AddLight)(THIS_ LPDIRECT3DLIGHT) PURE; - STDMETHOD(DeleteLight)(THIS_ LPDIRECT3DLIGHT) PURE; - STDMETHOD(NextLight)(THIS_ LPDIRECT3DLIGHT,LPDIRECT3DLIGHT*,DWORD) PURE; -}; - -typedef struct IDirect3DViewport *LPDIRECT3DVIEWPORT; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DViewport_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DViewport_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DViewport_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DViewport_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) -#define IDirect3DViewport_GetViewport(p,a) (p)->lpVtbl->GetViewport(p,a) -#define IDirect3DViewport_SetViewport(p,a) (p)->lpVtbl->SetViewport(p,a) -#define IDirect3DViewport_TransformVertices(p,a,b,c,d) (p)->lpVtbl->TransformVertices(p,a,b,c,d) -#define IDirect3DViewport_LightElements(p,a,b) (p)->lpVtbl->LightElements(p,a,b) -#define IDirect3DViewport_SetBackground(p,a) (p)->lpVtbl->SetBackground(p,a) -#define IDirect3DViewport_GetBackground(p,a,b) (p)->lpVtbl->GetBackground(p,a,b) -#define IDirect3DViewport_SetBackgroundDepth(p,a) (p)->lpVtbl->SetBackgroundDepth(p,a) -#define IDirect3DViewport_GetBackgroundDepth(p,a,b) (p)->lpVtbl->GetBackgroundDepth(p,a,b) -#define IDirect3DViewport_Clear(p,a,b,c) (p)->lpVtbl->Clear(p,a,b,c) -#define IDirect3DViewport_AddLight(p,a) (p)->lpVtbl->AddLight(p,a) -#define IDirect3DViewport_DeleteLight(p,a) (p)->lpVtbl->DeleteLight(p,a) -#define IDirect3DViewport_NextLight(p,a,b,c) (p)->lpVtbl->NextLight(p,a,b,c) -#else -#define IDirect3DViewport_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DViewport_AddRef(p) (p)->AddRef() -#define IDirect3DViewport_Release(p) (p)->Release() -#define IDirect3DViewport_Initialize(p,a) (p)->Initialize(a) -#define IDirect3DViewport_GetViewport(p,a) (p)->GetViewport(a) -#define IDirect3DViewport_SetViewport(p,a) (p)->SetViewport(a) -#define IDirect3DViewport_TransformVertices(p,a,b,c,d) (p)->TransformVertices(a,b,c,d) -#define IDirect3DViewport_LightElements(p,a,b) (p)->LightElements(a,b) -#define IDirect3DViewport_SetBackground(p,a) (p)->SetBackground(a) -#define IDirect3DViewport_GetBackground(p,a,b) (p)->GetBackground(a,b) -#define IDirect3DViewport_SetBackgroundDepth(p,a) (p)->SetBackgroundDepth(a) -#define IDirect3DViewport_GetBackgroundDepth(p,a,b) (p)->GetBackgroundDepth(a,b) -#define IDirect3DViewport_Clear(p,a,b,c) (p)->Clear(a,b,c) -#define IDirect3DViewport_AddLight(p,a) (p)->AddLight(a) -#define IDirect3DViewport_DeleteLight(p,a) (p)->DeleteLight(a) -#define IDirect3DViewport_NextLight(p,a,b,c) (p)->NextLight(a,b,c) -#endif - -#if(DIRECT3D_VERSION >= 0x0500) -#undef INTERFACE -#define INTERFACE IDirect3DViewport2 - -DECLARE_INTERFACE_(IDirect3DViewport2, IDirect3DViewport) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DViewport methods ***/ - STDMETHOD(Initialize)(THIS_ LPDIRECT3D) PURE; - STDMETHOD(GetViewport)(THIS_ LPD3DVIEWPORT) PURE; - STDMETHOD(SetViewport)(THIS_ LPD3DVIEWPORT) PURE; - STDMETHOD(TransformVertices)(THIS_ DWORD,LPD3DTRANSFORMDATA,DWORD,LPDWORD) PURE; - STDMETHOD(LightElements)(THIS_ DWORD,LPD3DLIGHTDATA) PURE; - STDMETHOD(SetBackground)(THIS_ D3DMATERIALHANDLE) PURE; - STDMETHOD(GetBackground)(THIS_ LPD3DMATERIALHANDLE,LPBOOL) PURE; - STDMETHOD(SetBackgroundDepth)(THIS_ LPDIRECTDRAWSURFACE) PURE; - STDMETHOD(GetBackgroundDepth)(THIS_ LPDIRECTDRAWSURFACE*,LPBOOL) PURE; - STDMETHOD(Clear)(THIS_ DWORD,LPD3DRECT,DWORD) PURE; - STDMETHOD(AddLight)(THIS_ LPDIRECT3DLIGHT) PURE; - STDMETHOD(DeleteLight)(THIS_ LPDIRECT3DLIGHT) PURE; - STDMETHOD(NextLight)(THIS_ LPDIRECT3DLIGHT,LPDIRECT3DLIGHT*,DWORD) PURE; - STDMETHOD(GetViewport2)(THIS_ LPD3DVIEWPORT2) PURE; - STDMETHOD(SetViewport2)(THIS_ LPD3DVIEWPORT2) PURE; -}; - -typedef struct IDirect3DViewport2 *LPDIRECT3DVIEWPORT2; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DViewport2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DViewport2_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DViewport2_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DViewport2_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) -#define IDirect3DViewport2_GetViewport(p,a) (p)->lpVtbl->GetViewport(p,a) -#define IDirect3DViewport2_SetViewport(p,a) (p)->lpVtbl->SetViewport(p,a) -#define IDirect3DViewport2_TransformVertices(p,a,b,c,d) (p)->lpVtbl->TransformVertices(p,a,b,c,d) -#define IDirect3DViewport2_LightElements(p,a,b) (p)->lpVtbl->LightElements(p,a,b) -#define IDirect3DViewport2_SetBackground(p,a) (p)->lpVtbl->SetBackground(p,a) -#define IDirect3DViewport2_GetBackground(p,a,b) (p)->lpVtbl->GetBackground(p,a,b) -#define IDirect3DViewport2_SetBackgroundDepth(p,a) (p)->lpVtbl->SetBackgroundDepth(p,a) -#define IDirect3DViewport2_GetBackgroundDepth(p,a,b) (p)->lpVtbl->GetBackgroundDepth(p,a,b) -#define IDirect3DViewport2_Clear(p,a,b,c) (p)->lpVtbl->Clear(p,a,b,c) -#define IDirect3DViewport2_AddLight(p,a) (p)->lpVtbl->AddLight(p,a) -#define IDirect3DViewport2_DeleteLight(p,a) (p)->lpVtbl->DeleteLight(p,a) -#define IDirect3DViewport2_NextLight(p,a,b,c) (p)->lpVtbl->NextLight(p,a,b,c) -#define IDirect3DViewport2_GetViewport2(p,a) (p)->lpVtbl->GetViewport2(p,a) -#define IDirect3DViewport2_SetViewport2(p,a) (p)->lpVtbl->SetViewport2(p,a) -#else -#define IDirect3DViewport2_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DViewport2_AddRef(p) (p)->AddRef() -#define IDirect3DViewport2_Release(p) (p)->Release() -#define IDirect3DViewport2_Initialize(p,a) (p)->Initialize(a) -#define IDirect3DViewport2_GetViewport(p,a) (p)->GetViewport(a) -#define IDirect3DViewport2_SetViewport(p,a) (p)->SetViewport(a) -#define IDirect3DViewport2_TransformVertices(p,a,b,c,d) (p)->TransformVertices(a,b,c,d) -#define IDirect3DViewport2_LightElements(p,a,b) (p)->LightElements(a,b) -#define IDirect3DViewport2_SetBackground(p,a) (p)->SetBackground(a) -#define IDirect3DViewport2_GetBackground(p,a,b) (p)->GetBackground(a,b) -#define IDirect3DViewport2_SetBackgroundDepth(p,a) (p)->SetBackgroundDepth(a) -#define IDirect3DViewport2_GetBackgroundDepth(p,a,b) (p)->GetBackgroundDepth(a,b) -#define IDirect3DViewport2_Clear(p,a,b,c) (p)->Clear(a,b,c) -#define IDirect3DViewport2_AddLight(p,a) (p)->AddLight(a) -#define IDirect3DViewport2_DeleteLight(p,a) (p)->DeleteLight(a) -#define IDirect3DViewport2_NextLight(p,a,b,c) (p)->NextLight(a,b,c) -#define IDirect3DViewport2_GetViewport2(p,a) (p)->GetViewport2(a) -#define IDirect3DViewport2_SetViewport2(p,a) (p)->SetViewport2(a) -#endif -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#if(DIRECT3D_VERSION >= 0x0600) - -#undef INTERFACE -#define INTERFACE IDirect3DViewport3 - -DECLARE_INTERFACE_(IDirect3DViewport3, IDirect3DViewport2) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DViewport2 methods ***/ - STDMETHOD(Initialize)(THIS_ LPDIRECT3D) PURE; - STDMETHOD(GetViewport)(THIS_ LPD3DVIEWPORT) PURE; - STDMETHOD(SetViewport)(THIS_ LPD3DVIEWPORT) PURE; - STDMETHOD(TransformVertices)(THIS_ DWORD,LPD3DTRANSFORMDATA,DWORD,LPDWORD) PURE; - STDMETHOD(LightElements)(THIS_ DWORD,LPD3DLIGHTDATA) PURE; - STDMETHOD(SetBackground)(THIS_ D3DMATERIALHANDLE) PURE; - STDMETHOD(GetBackground)(THIS_ LPD3DMATERIALHANDLE,LPBOOL) PURE; - STDMETHOD(SetBackgroundDepth)(THIS_ LPDIRECTDRAWSURFACE) PURE; - STDMETHOD(GetBackgroundDepth)(THIS_ LPDIRECTDRAWSURFACE*,LPBOOL) PURE; - STDMETHOD(Clear)(THIS_ DWORD,LPD3DRECT,DWORD) PURE; - STDMETHOD(AddLight)(THIS_ LPDIRECT3DLIGHT) PURE; - STDMETHOD(DeleteLight)(THIS_ LPDIRECT3DLIGHT) PURE; - STDMETHOD(NextLight)(THIS_ LPDIRECT3DLIGHT,LPDIRECT3DLIGHT*,DWORD) PURE; - STDMETHOD(GetViewport2)(THIS_ LPD3DVIEWPORT2) PURE; - STDMETHOD(SetViewport2)(THIS_ LPD3DVIEWPORT2) PURE; - STDMETHOD(SetBackgroundDepth2)(THIS_ LPDIRECTDRAWSURFACE4) PURE; - STDMETHOD(GetBackgroundDepth2)(THIS_ LPDIRECTDRAWSURFACE4*,LPBOOL) PURE; - STDMETHOD(Clear2)(THIS_ DWORD,LPD3DRECT,DWORD,D3DCOLOR,D3DVALUE,DWORD) PURE; -}; - -typedef struct IDirect3DViewport3 *LPDIRECT3DVIEWPORT3; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DViewport3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DViewport3_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DViewport3_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DViewport3_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) -#define IDirect3DViewport3_GetViewport(p,a) (p)->lpVtbl->GetViewport(p,a) -#define IDirect3DViewport3_SetViewport(p,a) (p)->lpVtbl->SetViewport(p,a) -#define IDirect3DViewport3_TransformVertices(p,a,b,c,d) (p)->lpVtbl->TransformVertices(p,a,b,c,d) -#define IDirect3DViewport3_LightElements(p,a,b) (p)->lpVtbl->LightElements(p,a,b) -#define IDirect3DViewport3_SetBackground(p,a) (p)->lpVtbl->SetBackground(p,a) -#define IDirect3DViewport3_GetBackground(p,a,b) (p)->lpVtbl->GetBackground(p,a,b) -#define IDirect3DViewport3_SetBackgroundDepth(p,a) (p)->lpVtbl->SetBackgroundDepth(p,a) -#define IDirect3DViewport3_GetBackgroundDepth(p,a,b) (p)->lpVtbl->GetBackgroundDepth(p,a,b) -#define IDirect3DViewport3_Clear(p,a,b,c) (p)->lpVtbl->Clear(p,a,b,c) -#define IDirect3DViewport3_AddLight(p,a) (p)->lpVtbl->AddLight(p,a) -#define IDirect3DViewport3_DeleteLight(p,a) (p)->lpVtbl->DeleteLight(p,a) -#define IDirect3DViewport3_NextLight(p,a,b,c) (p)->lpVtbl->NextLight(p,a,b,c) -#define IDirect3DViewport3_GetViewport2(p,a) (p)->lpVtbl->GetViewport2(p,a) -#define IDirect3DViewport3_SetViewport2(p,a) (p)->lpVtbl->SetViewport2(p,a) -#define IDirect3DViewport3_SetBackgroundDepth2(p,a) (p)->lpVtbl->SetBackgroundDepth2(p,a) -#define IDirect3DViewport3_GetBackgroundDepth2(p,a,b) (p)->lpVtbl->GetBackgroundDepth2(p,a,b) -#define IDirect3DViewport3_Clear2(p,a,b,c,d,e,f) (p)->lpVtbl->Clear2(p,a,b,c,d,e,f) -#else -#define IDirect3DViewport3_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DViewport3_AddRef(p) (p)->AddRef() -#define IDirect3DViewport3_Release(p) (p)->Release() -#define IDirect3DViewport3_Initialize(p,a) (p)->Initialize(a) -#define IDirect3DViewport3_GetViewport(p,a) (p)->GetViewport(a) -#define IDirect3DViewport3_SetViewport(p,a) (p)->SetViewport(a) -#define IDirect3DViewport3_TransformVertices(p,a,b,c,d) (p)->TransformVertices(a,b,c,d) -#define IDirect3DViewport3_LightElements(p,a,b) (p)->LightElements(a,b) -#define IDirect3DViewport3_SetBackground(p,a) (p)->SetBackground(a) -#define IDirect3DViewport3_GetBackground(p,a,b) (p)->GetBackground(a,b) -#define IDirect3DViewport3_SetBackgroundDepth(p,a) (p)->SetBackgroundDepth(a) -#define IDirect3DViewport3_GetBackgroundDepth(p,a,b) (p)->GetBackgroundDepth(a,b) -#define IDirect3DViewport3_Clear(p,a,b,c) (p)->Clear(a,b,c) -#define IDirect3DViewport3_AddLight(p,a) (p)->AddLight(a) -#define IDirect3DViewport3_DeleteLight(p,a) (p)->DeleteLight(a) -#define IDirect3DViewport3_NextLight(p,a,b,c) (p)->NextLight(a,b,c) -#define IDirect3DViewport3_GetViewport2(p,a) (p)->GetViewport2(a) -#define IDirect3DViewport3_SetViewport2(p,a) (p)->SetViewport2(a) -#define IDirect3DViewport3_SetBackgroundDepth2(p,a) (p)->SetBackgroundDepth2(a) -#define IDirect3DViewport3_GetBackgroundDepth2(p,a,b) (p)->GetBackgroundDepth2(a,b) -#define IDirect3DViewport3_Clear2(p,a,b,c,d,e,f) (p)->Clear2(a,b,c,d,e,f) -#endif -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -#if(DIRECT3D_VERSION >= 0x0600) -#undef INTERFACE -#define INTERFACE IDirect3DVertexBuffer - -DECLARE_INTERFACE_(IDirect3DVertexBuffer, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DVertexBuffer methods ***/ - STDMETHOD(Lock)(THIS_ DWORD,LPVOID*,LPDWORD) PURE; - STDMETHOD(Unlock)(THIS) PURE; - STDMETHOD(ProcessVertices)(THIS_ DWORD,DWORD,DWORD,LPDIRECT3DVERTEXBUFFER,DWORD,LPDIRECT3DDEVICE3,DWORD) PURE; - STDMETHOD(GetVertexBufferDesc)(THIS_ LPD3DVERTEXBUFFERDESC) PURE; - STDMETHOD(Optimize)(THIS_ LPDIRECT3DDEVICE3,DWORD) PURE; -}; - -typedef struct IDirect3DVertexBuffer *LPDIRECT3DVERTEXBUFFER; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DVertexBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DVertexBuffer_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DVertexBuffer_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DVertexBuffer_Lock(p,a,b,c) (p)->lpVtbl->Lock(p,a,b,c) -#define IDirect3DVertexBuffer_Unlock(p) (p)->lpVtbl->Unlock(p) -#define IDirect3DVertexBuffer_ProcessVertices(p,a,b,c,d,e,f,g) (p)->lpVtbl->ProcessVertices(p,a,b,c,d,e,f,g) -#define IDirect3DVertexBuffer_GetVertexBufferDesc(p,a) (p)->lpVtbl->GetVertexBufferDesc(p,a) -#define IDirect3DVertexBuffer_Optimize(p,a,b) (p)->lpVtbl->Optimize(p,a,b) -#else -#define IDirect3DVertexBuffer_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DVertexBuffer_AddRef(p) (p)->AddRef() -#define IDirect3DVertexBuffer_Release(p) (p)->Release() -#define IDirect3DVertexBuffer_Lock(p,a,b,c) (p)->Lock(a,b,c) -#define IDirect3DVertexBuffer_Unlock(p) (p)->Unlock() -#define IDirect3DVertexBuffer_ProcessVertices(p,a,b,c,d,e,f,g) (p)->ProcessVertices(a,b,c,d,e,f,g) -#define IDirect3DVertexBuffer_GetVertexBufferDesc(p,a) (p)->GetVertexBufferDesc(a) -#define IDirect3DVertexBuffer_Optimize(p,a,b) (p)->Optimize(a,b) -#endif -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -#if(DIRECT3D_VERSION >= 0x0700) -#undef INTERFACE -#define INTERFACE IDirect3DVertexBuffer7 - -DECLARE_INTERFACE_(IDirect3DVertexBuffer7, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DVertexBuffer7 methods ***/ - STDMETHOD(Lock)(THIS_ DWORD,LPVOID*,LPDWORD) PURE; - STDMETHOD(Unlock)(THIS) PURE; - STDMETHOD(ProcessVertices)(THIS_ DWORD,DWORD,DWORD,LPDIRECT3DVERTEXBUFFER7,DWORD,LPDIRECT3DDEVICE7,DWORD) PURE; - STDMETHOD(GetVertexBufferDesc)(THIS_ LPD3DVERTEXBUFFERDESC) PURE; - STDMETHOD(Optimize)(THIS_ LPDIRECT3DDEVICE7,DWORD) PURE; - STDMETHOD(ProcessVerticesStrided)(THIS_ DWORD,DWORD,DWORD,LPD3DDRAWPRIMITIVESTRIDEDDATA,DWORD,LPDIRECT3DDEVICE7,DWORD) PURE; -}; - -typedef struct IDirect3DVertexBuffer7 *LPDIRECT3DVERTEXBUFFER7; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DVertexBuffer7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DVertexBuffer7_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DVertexBuffer7_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DVertexBuffer7_Lock(p,a,b,c) (p)->lpVtbl->Lock(p,a,b,c) -#define IDirect3DVertexBuffer7_Unlock(p) (p)->lpVtbl->Unlock(p) -#define IDirect3DVertexBuffer7_ProcessVertices(p,a,b,c,d,e,f,g) (p)->lpVtbl->ProcessVertices(p,a,b,c,d,e,f,g) -#define IDirect3DVertexBuffer7_GetVertexBufferDesc(p,a) (p)->lpVtbl->GetVertexBufferDesc(p,a) -#define IDirect3DVertexBuffer7_Optimize(p,a,b) (p)->lpVtbl->Optimize(p,a,b) -#define IDirect3DVertexBuffer7_ProcessVerticesStrided(p,a,b,c,d,e,f,g) (p)->lpVtbl->ProcessVerticesStrided(p,a,b,c,d,e,f,g) -#else -#define IDirect3DVertexBuffer7_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DVertexBuffer7_AddRef(p) (p)->AddRef() -#define IDirect3DVertexBuffer7_Release(p) (p)->Release() -#define IDirect3DVertexBuffer7_Lock(p,a,b,c) (p)->Lock(a,b,c) -#define IDirect3DVertexBuffer7_Unlock(p) (p)->Unlock() -#define IDirect3DVertexBuffer7_ProcessVertices(p,a,b,c,d,e,f,g) (p)->ProcessVertices(a,b,c,d,e,f,g) -#define IDirect3DVertexBuffer7_GetVertexBufferDesc(p,a) (p)->GetVertexBufferDesc(a) -#define IDirect3DVertexBuffer7_Optimize(p,a,b) (p)->Optimize(a,b) -#define IDirect3DVertexBuffer7_ProcessVerticesStrided(p,a,b,c,d,e,f,g) (p)->ProcessVerticesStrided(a,b,c,d,e,f,g) -#endif -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -#if(DIRECT3D_VERSION >= 0x0500) -/**************************************************************************** - * - * Flags for IDirect3DDevice::NextViewport - * - ****************************************************************************/ - -/* - * Return the next viewport - */ -#define D3DNEXT_NEXT 0x00000001l - -/* - * Return the first viewport - */ -#define D3DNEXT_HEAD 0x00000002l - -/* - * Return the last viewport - */ -#define D3DNEXT_TAIL 0x00000004l - - -/**************************************************************************** - * - * Flags for DrawPrimitive/DrawIndexedPrimitive - * Also valid for Begin/BeginIndexed - * Also valid for VertexBuffer::CreateVertexBuffer - ****************************************************************************/ - -/* - * Wait until the device is ready to draw the primitive - * This will cause DP to not return DDERR_WASSTILLDRAWING - */ -#define D3DDP_WAIT 0x00000001l -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#if (DIRECT3D_VERSION == 0x0500) -/* - * Hint that it is acceptable to render the primitive out of order. - */ -#define D3DDP_OUTOFORDER 0x00000002l -#endif - - -#if(DIRECT3D_VERSION >= 0x0500) -/* - * Hint that the primitives have been clipped by the application. - */ -#define D3DDP_DONOTCLIP 0x00000004l - -/* - * Hint that the extents need not be updated. - */ -#define D3DDP_DONOTUPDATEEXTENTS 0x00000008l -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#if(DIRECT3D_VERSION >= 0x0600) - -/* - * Hint that the lighting should not be applied on vertices. - */ - -#define D3DDP_DONOTLIGHT 0x00000010l - -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -/* - * Direct3D Errors - * DirectDraw error codes are used when errors not specified here. - */ -#define D3D_OK DD_OK -#define D3DERR_BADMAJORVERSION MAKE_DDHRESULT(700) -#define D3DERR_BADMINORVERSION MAKE_DDHRESULT(701) - -#if(DIRECT3D_VERSION >= 0x0500) -/* - * An invalid device was requested by the application. - */ -#define D3DERR_INVALID_DEVICE MAKE_DDHRESULT(705) -#define D3DERR_INITFAILED MAKE_DDHRESULT(706) - -/* - * SetRenderTarget attempted on a device that was - * QI'd off the render target. - */ -#define D3DERR_DEVICEAGGREGATED MAKE_DDHRESULT(707) -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#define D3DERR_EXECUTE_CREATE_FAILED MAKE_DDHRESULT(710) -#define D3DERR_EXECUTE_DESTROY_FAILED MAKE_DDHRESULT(711) -#define D3DERR_EXECUTE_LOCK_FAILED MAKE_DDHRESULT(712) -#define D3DERR_EXECUTE_UNLOCK_FAILED MAKE_DDHRESULT(713) -#define D3DERR_EXECUTE_LOCKED MAKE_DDHRESULT(714) -#define D3DERR_EXECUTE_NOT_LOCKED MAKE_DDHRESULT(715) - -#define D3DERR_EXECUTE_FAILED MAKE_DDHRESULT(716) -#define D3DERR_EXECUTE_CLIPPED_FAILED MAKE_DDHRESULT(717) - -#define D3DERR_TEXTURE_NO_SUPPORT MAKE_DDHRESULT(720) -#define D3DERR_TEXTURE_CREATE_FAILED MAKE_DDHRESULT(721) -#define D3DERR_TEXTURE_DESTROY_FAILED MAKE_DDHRESULT(722) -#define D3DERR_TEXTURE_LOCK_FAILED MAKE_DDHRESULT(723) -#define D3DERR_TEXTURE_UNLOCK_FAILED MAKE_DDHRESULT(724) -#define D3DERR_TEXTURE_LOAD_FAILED MAKE_DDHRESULT(725) -#define D3DERR_TEXTURE_SWAP_FAILED MAKE_DDHRESULT(726) -#define D3DERR_TEXTURE_LOCKED MAKE_DDHRESULT(727) -#define D3DERR_TEXTURE_NOT_LOCKED MAKE_DDHRESULT(728) -#define D3DERR_TEXTURE_GETSURF_FAILED MAKE_DDHRESULT(729) - -#define D3DERR_MATRIX_CREATE_FAILED MAKE_DDHRESULT(730) -#define D3DERR_MATRIX_DESTROY_FAILED MAKE_DDHRESULT(731) -#define D3DERR_MATRIX_SETDATA_FAILED MAKE_DDHRESULT(732) -#define D3DERR_MATRIX_GETDATA_FAILED MAKE_DDHRESULT(733) -#define D3DERR_SETVIEWPORTDATA_FAILED MAKE_DDHRESULT(734) - -#if(DIRECT3D_VERSION >= 0x0500) -#define D3DERR_INVALIDCURRENTVIEWPORT MAKE_DDHRESULT(735) -#define D3DERR_INVALIDPRIMITIVETYPE MAKE_DDHRESULT(736) -#define D3DERR_INVALIDVERTEXTYPE MAKE_DDHRESULT(737) -#define D3DERR_TEXTURE_BADSIZE MAKE_DDHRESULT(738) -#define D3DERR_INVALIDRAMPTEXTURE MAKE_DDHRESULT(739) -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#define D3DERR_MATERIAL_CREATE_FAILED MAKE_DDHRESULT(740) -#define D3DERR_MATERIAL_DESTROY_FAILED MAKE_DDHRESULT(741) -#define D3DERR_MATERIAL_SETDATA_FAILED MAKE_DDHRESULT(742) -#define D3DERR_MATERIAL_GETDATA_FAILED MAKE_DDHRESULT(743) - -#if(DIRECT3D_VERSION >= 0x0500) -#define D3DERR_INVALIDPALETTE MAKE_DDHRESULT(744) - -#define D3DERR_ZBUFF_NEEDS_SYSTEMMEMORY MAKE_DDHRESULT(745) -#define D3DERR_ZBUFF_NEEDS_VIDEOMEMORY MAKE_DDHRESULT(746) -#define D3DERR_SURFACENOTINVIDMEM MAKE_DDHRESULT(747) -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#define D3DERR_LIGHT_SET_FAILED MAKE_DDHRESULT(750) -#if(DIRECT3D_VERSION >= 0x0500) -#define D3DERR_LIGHTHASVIEWPORT MAKE_DDHRESULT(751) -#define D3DERR_LIGHTNOTINTHISVIEWPORT MAKE_DDHRESULT(752) -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#define D3DERR_SCENE_IN_SCENE MAKE_DDHRESULT(760) -#define D3DERR_SCENE_NOT_IN_SCENE MAKE_DDHRESULT(761) -#define D3DERR_SCENE_BEGIN_FAILED MAKE_DDHRESULT(762) -#define D3DERR_SCENE_END_FAILED MAKE_DDHRESULT(763) - -#if(DIRECT3D_VERSION >= 0x0500) -#define D3DERR_INBEGIN MAKE_DDHRESULT(770) -#define D3DERR_NOTINBEGIN MAKE_DDHRESULT(771) -#define D3DERR_NOVIEWPORTS MAKE_DDHRESULT(772) -#define D3DERR_VIEWPORTDATANOTSET MAKE_DDHRESULT(773) -#define D3DERR_VIEWPORTHASNODEVICE MAKE_DDHRESULT(774) -#define D3DERR_NOCURRENTVIEWPORT MAKE_DDHRESULT(775) -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#if(DIRECT3D_VERSION >= 0x0600) -#define D3DERR_INVALIDVERTEXFORMAT MAKE_DDHRESULT(2048) - -/* - * Attempted to CreateTexture on a surface that had a color key - */ -#define D3DERR_COLORKEYATTACHED MAKE_DDHRESULT(2050) - -#define D3DERR_VERTEXBUFFEROPTIMIZED MAKE_DDHRESULT(2060) -#define D3DERR_VBUF_CREATE_FAILED MAKE_DDHRESULT(2061) -#define D3DERR_VERTEXBUFFERLOCKED MAKE_DDHRESULT(2062) -#define D3DERR_VERTEXBUFFERUNLOCKFAILED MAKE_DDHRESULT(2063) - -#define D3DERR_ZBUFFER_NOTPRESENT MAKE_DDHRESULT(2070) -#define D3DERR_STENCILBUFFER_NOTPRESENT MAKE_DDHRESULT(2071) - -#define D3DERR_WRONGTEXTUREFORMAT MAKE_DDHRESULT(2072) -#define D3DERR_UNSUPPORTEDCOLOROPERATION MAKE_DDHRESULT(2073) -#define D3DERR_UNSUPPORTEDCOLORARG MAKE_DDHRESULT(2074) -#define D3DERR_UNSUPPORTEDALPHAOPERATION MAKE_DDHRESULT(2075) -#define D3DERR_UNSUPPORTEDALPHAARG MAKE_DDHRESULT(2076) -#define D3DERR_TOOMANYOPERATIONS MAKE_DDHRESULT(2077) -#define D3DERR_CONFLICTINGTEXTUREFILTER MAKE_DDHRESULT(2078) -#define D3DERR_UNSUPPORTEDFACTORVALUE MAKE_DDHRESULT(2079) -#define D3DERR_CONFLICTINGRENDERSTATE MAKE_DDHRESULT(2081) -#define D3DERR_UNSUPPORTEDTEXTUREFILTER MAKE_DDHRESULT(2082) -#define D3DERR_TOOMANYPRIMITIVES MAKE_DDHRESULT(2083) -#define D3DERR_INVALIDMATRIX MAKE_DDHRESULT(2084) -#define D3DERR_TOOMANYVERTICES MAKE_DDHRESULT(2085) -#define D3DERR_CONFLICTINGTEXTUREPALETTE MAKE_DDHRESULT(2086) - -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -#if(DIRECT3D_VERSION >= 0x0700) -#define D3DERR_INVALIDSTATEBLOCK MAKE_DDHRESULT(2100) -#define D3DERR_INBEGINSTATEBLOCK MAKE_DDHRESULT(2101) -#define D3DERR_NOTINBEGINSTATEBLOCK MAKE_DDHRESULT(2102) -#endif /* DIRECT3D_VERSION >= 0x0700 */ - - -#ifdef __cplusplus -}; -#endif - -#endif /* (DIRECT3D_VERSION < 0x0800) */ -#endif /* _D3D_H_ */ - diff --git a/import/DirectX8/include/d3d8.h b/import/DirectX8/include/d3d8.h deleted file mode 100644 index 347a86cc1..000000000 --- a/import/DirectX8/include/d3d8.h +++ /dev/null @@ -1,1279 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) Microsoft Corporation. All Rights Reserved. - * - * File: d3d8.h - * Content: Direct3D include file - * - ****************************************************************************/ - -#ifndef _D3D8_H_ -#define _D3D8_H_ - -#ifndef DIRECT3D_VERSION -#define DIRECT3D_VERSION 0x0800 -#endif //DIRECT3D_VERSION - -// include this file content only if compiling for DX8 interfaces -#if(DIRECT3D_VERSION >= 0x0800) - - -/* This identifier is passed to Direct3DCreate8 in order to ensure that an - * application was built against the correct header files. This number is - * incremented whenever a header (or other) change would require applications - * to be rebuilt. If the version doesn't match, Direct3DCreate8 will fail. - * (The number itself has no meaning.)*/ - -#define D3D_SDK_VERSION 220 - - -#include - -#define COM_NO_WINDOWS_H -#include - -#include - -#if !defined(HMONITOR_DECLARED) && (WINVER < 0x0500) - #define HMONITOR_DECLARED - DECLARE_HANDLE(HMONITOR); -#endif - -#define D3DAPI WINAPI - -/* - * Interface IID's - */ -#if defined( _WIN32 ) && !defined( _NO_COM) - -/* IID_IDirect3D8 */ -/* {1DD9E8DA-1C77-4d40-B0CF-98FEFDFF9512} */ -DEFINE_GUID(IID_IDirect3D8, 0x1dd9e8da, 0x1c77, 0x4d40, 0xb0, 0xcf, 0x98, 0xfe, 0xfd, 0xff, 0x95, 0x12); - -/* IID_IDirect3DDevice8 */ -/* {7385E5DF-8FE8-41D5-86B6-D7B48547B6CF} */ -DEFINE_GUID(IID_IDirect3DDevice8, 0x7385e5df, 0x8fe8, 0x41d5, 0x86, 0xb6, 0xd7, 0xb4, 0x85, 0x47, 0xb6, 0xcf); - -/* IID_IDirect3DResource8 */ -/* {1B36BB7B-09B7-410a-B445-7D1430D7B33F} */ -DEFINE_GUID(IID_IDirect3DResource8, 0x1b36bb7b, 0x9b7, 0x410a, 0xb4, 0x45, 0x7d, 0x14, 0x30, 0xd7, 0xb3, 0x3f); - -/* IID_IDirect3DBaseTexture8 */ -/* {B4211CFA-51B9-4a9f-AB78-DB99B2BB678E} */ -DEFINE_GUID(IID_IDirect3DBaseTexture8, 0xb4211cfa, 0x51b9, 0x4a9f, 0xab, 0x78, 0xdb, 0x99, 0xb2, 0xbb, 0x67, 0x8e); - -/* IID_IDirect3DTexture8 */ -/* {E4CDD575-2866-4f01-B12E-7EECE1EC9358} */ -DEFINE_GUID(IID_IDirect3DTexture8, 0xe4cdd575, 0x2866, 0x4f01, 0xb1, 0x2e, 0x7e, 0xec, 0xe1, 0xec, 0x93, 0x58); - -/* IID_IDirect3DCubeTexture8 */ -/* {3EE5B968-2ACA-4c34-8BB5-7E0C3D19B750} */ -DEFINE_GUID(IID_IDirect3DCubeTexture8, 0x3ee5b968, 0x2aca, 0x4c34, 0x8b, 0xb5, 0x7e, 0x0c, 0x3d, 0x19, 0xb7, 0x50); - -/* IID_IDirect3DVolumeTexture8 */ -/* {4B8AAAFA-140F-42ba-9131-597EAFAA2EAD} */ -DEFINE_GUID(IID_IDirect3DVolumeTexture8, 0x4b8aaafa, 0x140f, 0x42ba, 0x91, 0x31, 0x59, 0x7e, 0xaf, 0xaa, 0x2e, 0xad); - -/* IID_IDirect3DVertexBuffer8 */ -/* {8AEEEAC7-05F9-44d4-B591-000B0DF1CB95} */ -DEFINE_GUID(IID_IDirect3DVertexBuffer8, 0x8aeeeac7, 0x05f9, 0x44d4, 0xb5, 0x91, 0x00, 0x0b, 0x0d, 0xf1, 0xcb, 0x95); - -/* IID_IDirect3DIndexBuffer8 */ -/* {0E689C9A-053D-44a0-9D92-DB0E3D750F86} */ -DEFINE_GUID(IID_IDirect3DIndexBuffer8, 0x0e689c9a, 0x053d, 0x44a0, 0x9d, 0x92, 0xdb, 0x0e, 0x3d, 0x75, 0x0f, 0x86); - -/* IID_IDirect3DSurface8 */ -/* {B96EEBCA-B326-4ea5-882F-2FF5BAE021DD} */ -DEFINE_GUID(IID_IDirect3DSurface8, 0xb96eebca, 0xb326, 0x4ea5, 0x88, 0x2f, 0x2f, 0xf5, 0xba, 0xe0, 0x21, 0xdd); - -/* IID_IDirect3DVolume8 */ -/* {BD7349F5-14F1-42e4-9C79-972380DB40C0} */ -DEFINE_GUID(IID_IDirect3DVolume8, 0xbd7349f5, 0x14f1, 0x42e4, 0x9c, 0x79, 0x97, 0x23, 0x80, 0xdb, 0x40, 0xc0); - -/* IID_IDirect3DSwapChain8 */ -/* {928C088B-76B9-4C6B-A536-A590853876CD} */ -DEFINE_GUID(IID_IDirect3DSwapChain8, 0x928c088b, 0x76b9, 0x4c6b, 0xa5, 0x36, 0xa5, 0x90, 0x85, 0x38, 0x76, 0xcd); - -#endif - -#ifdef __cplusplus - -interface IDirect3D8; -interface IDirect3DDevice8; - -interface IDirect3DResource8; -interface IDirect3DBaseTexture8; -interface IDirect3DTexture8; -interface IDirect3DVolumeTexture8; -interface IDirect3DCubeTexture8; - -interface IDirect3DVertexBuffer8; -interface IDirect3DIndexBuffer8; - -interface IDirect3DSurface8; -interface IDirect3DVolume8; - -interface IDirect3DSwapChain8; - -#endif - - -typedef interface IDirect3D8 IDirect3D8; -typedef interface IDirect3DDevice8 IDirect3DDevice8; -typedef interface IDirect3DResource8 IDirect3DResource8; -typedef interface IDirect3DBaseTexture8 IDirect3DBaseTexture8; -typedef interface IDirect3DTexture8 IDirect3DTexture8; -typedef interface IDirect3DVolumeTexture8 IDirect3DVolumeTexture8; -typedef interface IDirect3DCubeTexture8 IDirect3DCubeTexture8; -typedef interface IDirect3DVertexBuffer8 IDirect3DVertexBuffer8; -typedef interface IDirect3DIndexBuffer8 IDirect3DIndexBuffer8; -typedef interface IDirect3DSurface8 IDirect3DSurface8; -typedef interface IDirect3DVolume8 IDirect3DVolume8; -typedef interface IDirect3DSwapChain8 IDirect3DSwapChain8; - -#include "d3d8types.h" -#include "d3d8caps.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * DLL Function for creating a Direct3D8 object. This object supports - * enumeration and allows the creation of Direct3DDevice8 objects. - * Pass the value of the constant D3D_SDK_VERSION to this function, so - * that the run-time can validate that your application was compiled - * against the right headers. - */ - -IDirect3D8 * WINAPI Direct3DCreate8(UINT SDKVersion); - - -/* - * Direct3D interfaces - */ - - - - - - -#undef INTERFACE -#define INTERFACE IDirect3D8 - -DECLARE_INTERFACE_(IDirect3D8, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3D8 methods ***/ - STDMETHOD(RegisterSoftwareDevice)(THIS_ void* pInitializeFunction) PURE; - STDMETHOD_(UINT, GetAdapterCount)(THIS) PURE; - STDMETHOD(GetAdapterIdentifier)(THIS_ UINT Adapter,DWORD Flags,D3DADAPTER_IDENTIFIER8* pIdentifier) PURE; - STDMETHOD_(UINT, GetAdapterModeCount)(THIS_ UINT Adapter) PURE; - STDMETHOD(EnumAdapterModes)(THIS_ UINT Adapter,UINT Mode,D3DDISPLAYMODE* pMode) PURE; - STDMETHOD(GetAdapterDisplayMode)(THIS_ UINT Adapter,D3DDISPLAYMODE* pMode) PURE; - STDMETHOD(CheckDeviceType)(THIS_ UINT Adapter,D3DDEVTYPE CheckType,D3DFORMAT DisplayFormat,D3DFORMAT BackBufferFormat,BOOL Windowed) PURE; - STDMETHOD(CheckDeviceFormat)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat) PURE; - STDMETHOD(CheckDeviceMultiSampleType)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType) PURE; - STDMETHOD(CheckDepthStencilMatch)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat) PURE; - STDMETHOD(GetDeviceCaps)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DCAPS8* pCaps) PURE; - STDMETHOD_(HMONITOR, GetAdapterMonitor)(THIS_ UINT Adapter) PURE; - STDMETHOD(CreateDevice)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice8** ppReturnedDeviceInterface) PURE; -}; - -typedef struct IDirect3D8 *LPDIRECT3D8, *PDIRECT3D8; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3D8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3D8_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3D8_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3D8_RegisterSoftwareDevice(p,a) (p)->lpVtbl->RegisterSoftwareDevice(p,a) -#define IDirect3D8_GetAdapterCount(p) (p)->lpVtbl->GetAdapterCount(p) -#define IDirect3D8_GetAdapterIdentifier(p,a,b,c) (p)->lpVtbl->GetAdapterIdentifier(p,a,b,c) -#define IDirect3D8_GetAdapterModeCount(p,a) (p)->lpVtbl->GetAdapterModeCount(p,a) -#define IDirect3D8_EnumAdapterModes(p,a,b,c) (p)->lpVtbl->EnumAdapterModes(p,a,b,c) -#define IDirect3D8_GetAdapterDisplayMode(p,a,b) (p)->lpVtbl->GetAdapterDisplayMode(p,a,b) -#define IDirect3D8_CheckDeviceType(p,a,b,c,d,e) (p)->lpVtbl->CheckDeviceType(p,a,b,c,d,e) -#define IDirect3D8_CheckDeviceFormat(p,a,b,c,d,e,f) (p)->lpVtbl->CheckDeviceFormat(p,a,b,c,d,e,f) -#define IDirect3D8_CheckDeviceMultiSampleType(p,a,b,c,d,e) (p)->lpVtbl->CheckDeviceMultiSampleType(p,a,b,c,d,e) -#define IDirect3D8_CheckDepthStencilMatch(p,a,b,c,d,e) (p)->lpVtbl->CheckDepthStencilMatch(p,a,b,c,d,e) -#define IDirect3D8_GetDeviceCaps(p,a,b,c) (p)->lpVtbl->GetDeviceCaps(p,a,b,c) -#define IDirect3D8_GetAdapterMonitor(p,a) (p)->lpVtbl->GetAdapterMonitor(p,a) -#define IDirect3D8_CreateDevice(p,a,b,c,d,e,f) (p)->lpVtbl->CreateDevice(p,a,b,c,d,e,f) -#else -#define IDirect3D8_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3D8_AddRef(p) (p)->AddRef() -#define IDirect3D8_Release(p) (p)->Release() -#define IDirect3D8_RegisterSoftwareDevice(p,a) (p)->RegisterSoftwareDevice(a) -#define IDirect3D8_GetAdapterCount(p) (p)->GetAdapterCount() -#define IDirect3D8_GetAdapterIdentifier(p,a,b,c) (p)->GetAdapterIdentifier(a,b,c) -#define IDirect3D8_GetAdapterModeCount(p,a) (p)->GetAdapterModeCount(a) -#define IDirect3D8_EnumAdapterModes(p,a,b,c) (p)->EnumAdapterModes(a,b,c) -#define IDirect3D8_GetAdapterDisplayMode(p,a,b) (p)->GetAdapterDisplayMode(a,b) -#define IDirect3D8_CheckDeviceType(p,a,b,c,d,e) (p)->CheckDeviceType(a,b,c,d,e) -#define IDirect3D8_CheckDeviceFormat(p,a,b,c,d,e,f) (p)->CheckDeviceFormat(a,b,c,d,e,f) -#define IDirect3D8_CheckDeviceMultiSampleType(p,a,b,c,d,e) (p)->CheckDeviceMultiSampleType(a,b,c,d,e) -#define IDirect3D8_CheckDepthStencilMatch(p,a,b,c,d,e) (p)->CheckDepthStencilMatch(a,b,c,d,e) -#define IDirect3D8_GetDeviceCaps(p,a,b,c) (p)->GetDeviceCaps(a,b,c) -#define IDirect3D8_GetAdapterMonitor(p,a) (p)->GetAdapterMonitor(a) -#define IDirect3D8_CreateDevice(p,a,b,c,d,e,f) (p)->CreateDevice(a,b,c,d,e,f) -#endif - - - - - - - - - - - - - - - - - - - -#undef INTERFACE -#define INTERFACE IDirect3DDevice8 - -DECLARE_INTERFACE_(IDirect3DDevice8, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DDevice8 methods ***/ - STDMETHOD(TestCooperativeLevel)(THIS) PURE; - STDMETHOD_(UINT, GetAvailableTextureMem)(THIS) PURE; - STDMETHOD(ResourceManagerDiscardBytes)(THIS_ DWORD Bytes) PURE; - STDMETHOD(GetDirect3D)(THIS_ IDirect3D8** ppD3D8) PURE; - STDMETHOD(GetDeviceCaps)(THIS_ D3DCAPS8* pCaps) PURE; - STDMETHOD(GetDisplayMode)(THIS_ D3DDISPLAYMODE* pMode) PURE; - STDMETHOD(GetCreationParameters)(THIS_ D3DDEVICE_CREATION_PARAMETERS *pParameters) PURE; - STDMETHOD(SetCursorProperties)(THIS_ UINT XHotSpot,UINT YHotSpot,IDirect3DSurface8* pCursorBitmap) PURE; - STDMETHOD_(void, SetCursorPosition)(THIS_ UINT XScreenSpace,UINT YScreenSpace,DWORD Flags) PURE; - STDMETHOD_(BOOL, ShowCursor)(THIS_ BOOL bShow) PURE; - STDMETHOD(CreateAdditionalSwapChain)(THIS_ D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DSwapChain8** pSwapChain) PURE; - STDMETHOD(Reset)(THIS_ D3DPRESENT_PARAMETERS* pPresentationParameters) PURE; - STDMETHOD(Present)(THIS_ CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion) PURE; - STDMETHOD(GetBackBuffer)(THIS_ UINT BackBuffer,D3DBACKBUFFER_TYPE Type,IDirect3DSurface8** ppBackBuffer) PURE; - STDMETHOD(GetRasterStatus)(THIS_ D3DRASTER_STATUS* pRasterStatus) PURE; - STDMETHOD_(void, SetGammaRamp)(THIS_ DWORD Flags,CONST D3DGAMMARAMP* pRamp) PURE; - STDMETHOD_(void, GetGammaRamp)(THIS_ D3DGAMMARAMP* pRamp) PURE; - STDMETHOD(CreateTexture)(THIS_ UINT Width,UINT Height,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DTexture8** ppTexture) PURE; - STDMETHOD(CreateVolumeTexture)(THIS_ UINT Width,UINT Height,UINT Depth,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DVolumeTexture8** ppVolumeTexture) PURE; - STDMETHOD(CreateCubeTexture)(THIS_ UINT EdgeLength,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DCubeTexture8** ppCubeTexture) PURE; - STDMETHOD(CreateVertexBuffer)(THIS_ UINT Length,DWORD Usage,DWORD FVF,D3DPOOL Pool,IDirect3DVertexBuffer8** ppVertexBuffer) PURE; - STDMETHOD(CreateIndexBuffer)(THIS_ UINT Length,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DIndexBuffer8** ppIndexBuffer) PURE; - STDMETHOD(CreateRenderTarget)(THIS_ UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,BOOL Lockable,IDirect3DSurface8** ppSurface) PURE; - STDMETHOD(CreateDepthStencilSurface)(THIS_ UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,IDirect3DSurface8** ppSurface) PURE; - STDMETHOD(CreateImageSurface)(THIS_ UINT Width,UINT Height,D3DFORMAT Format,IDirect3DSurface8** ppSurface) PURE; - STDMETHOD(CopyRects)(THIS_ IDirect3DSurface8* pSourceSurface,CONST RECT* pSourceRectsArray,UINT cRects,IDirect3DSurface8* pDestinationSurface,CONST POINT* pDestPointsArray) PURE; - STDMETHOD(UpdateTexture)(THIS_ IDirect3DBaseTexture8* pSourceTexture,IDirect3DBaseTexture8* pDestinationTexture) PURE; - STDMETHOD(GetFrontBuffer)(THIS_ IDirect3DSurface8* pDestSurface) PURE; - STDMETHOD(SetRenderTarget)(THIS_ IDirect3DSurface8* pRenderTarget,IDirect3DSurface8* pNewZStencil) PURE; - STDMETHOD(GetRenderTarget)(THIS_ IDirect3DSurface8** ppRenderTarget) PURE; - STDMETHOD(GetDepthStencilSurface)(THIS_ IDirect3DSurface8** ppZStencilSurface) PURE; - STDMETHOD(BeginScene)(THIS) PURE; - STDMETHOD(EndScene)(THIS) PURE; - STDMETHOD(Clear)(THIS_ DWORD Count,CONST D3DRECT* pRects,DWORD Flags,D3DCOLOR Color,float Z,DWORD Stencil) PURE; - STDMETHOD(SetTransform)(THIS_ D3DTRANSFORMSTATETYPE State,CONST D3DMATRIX* pMatrix) PURE; - STDMETHOD(GetTransform)(THIS_ D3DTRANSFORMSTATETYPE State,D3DMATRIX* pMatrix) PURE; - STDMETHOD(MultiplyTransform)(THIS_ D3DTRANSFORMSTATETYPE,CONST D3DMATRIX*) PURE; - STDMETHOD(SetViewport)(THIS_ CONST D3DVIEWPORT8* pViewport) PURE; - STDMETHOD(GetViewport)(THIS_ D3DVIEWPORT8* pViewport) PURE; - STDMETHOD(SetMaterial)(THIS_ CONST D3DMATERIAL8* pMaterial) PURE; - STDMETHOD(GetMaterial)(THIS_ D3DMATERIAL8* pMaterial) PURE; - STDMETHOD(SetLight)(THIS_ DWORD Index,CONST D3DLIGHT8*) PURE; - STDMETHOD(GetLight)(THIS_ DWORD Index,D3DLIGHT8*) PURE; - STDMETHOD(LightEnable)(THIS_ DWORD Index,BOOL Enable) PURE; - STDMETHOD(GetLightEnable)(THIS_ DWORD Index,BOOL* pEnable) PURE; - STDMETHOD(SetClipPlane)(THIS_ DWORD Index,CONST float* pPlane) PURE; - STDMETHOD(GetClipPlane)(THIS_ DWORD Index,float* pPlane) PURE; - STDMETHOD(SetRenderState)(THIS_ D3DRENDERSTATETYPE State,DWORD Value) PURE; - STDMETHOD(GetRenderState)(THIS_ D3DRENDERSTATETYPE State,DWORD* pValue) PURE; - STDMETHOD(BeginStateBlock)(THIS) PURE; - STDMETHOD(EndStateBlock)(THIS_ DWORD* pToken) PURE; - STDMETHOD(ApplyStateBlock)(THIS_ DWORD Token) PURE; - STDMETHOD(CaptureStateBlock)(THIS_ DWORD Token) PURE; - STDMETHOD(DeleteStateBlock)(THIS_ DWORD Token) PURE; - STDMETHOD(CreateStateBlock)(THIS_ D3DSTATEBLOCKTYPE Type,DWORD* pToken) PURE; - STDMETHOD(SetClipStatus)(THIS_ CONST D3DCLIPSTATUS8* pClipStatus) PURE; - STDMETHOD(GetClipStatus)(THIS_ D3DCLIPSTATUS8* pClipStatus) PURE; - STDMETHOD(GetTexture)(THIS_ DWORD Stage,IDirect3DBaseTexture8** ppTexture) PURE; - STDMETHOD(SetTexture)(THIS_ DWORD Stage,IDirect3DBaseTexture8* pTexture) PURE; - STDMETHOD(GetTextureStageState)(THIS_ DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD* pValue) PURE; - STDMETHOD(SetTextureStageState)(THIS_ DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD Value) PURE; - STDMETHOD(ValidateDevice)(THIS_ DWORD* pNumPasses) PURE; - STDMETHOD(GetInfo)(THIS_ DWORD DevInfoID,void* pDevInfoStruct,DWORD DevInfoStructSize) PURE; - STDMETHOD(SetPaletteEntries)(THIS_ UINT PaletteNumber,CONST PALETTEENTRY* pEntries) PURE; - STDMETHOD(GetPaletteEntries)(THIS_ UINT PaletteNumber,PALETTEENTRY* pEntries) PURE; - STDMETHOD(SetCurrentTexturePalette)(THIS_ UINT PaletteNumber) PURE; - STDMETHOD(GetCurrentTexturePalette)(THIS_ UINT *PaletteNumber) PURE; - STDMETHOD(DrawPrimitive)(THIS_ D3DPRIMITIVETYPE PrimitiveType,UINT StartVertex,UINT PrimitiveCount) PURE; - STDMETHOD(DrawIndexedPrimitive)(THIS_ D3DPRIMITIVETYPE,UINT minIndex,UINT NumVertices,UINT startIndex,UINT primCount) PURE; - STDMETHOD(DrawPrimitiveUP)(THIS_ D3DPRIMITIVETYPE PrimitiveType,UINT PrimitiveCount,CONST void* pVertexStreamZeroData,UINT VertexStreamZeroStride) PURE; - STDMETHOD(DrawIndexedPrimitiveUP)(THIS_ D3DPRIMITIVETYPE PrimitiveType,UINT MinVertexIndex,UINT NumVertexIndices,UINT PrimitiveCount,CONST void* pIndexData,D3DFORMAT IndexDataFormat,CONST void* pVertexStreamZeroData,UINT VertexStreamZeroStride) PURE; - STDMETHOD(ProcessVertices)(THIS_ UINT SrcStartIndex,UINT DestIndex,UINT VertexCount,IDirect3DVertexBuffer8* pDestBuffer,DWORD Flags) PURE; - STDMETHOD(CreateVertexShader)(THIS_ CONST DWORD* pDeclaration,CONST DWORD* pFunction,DWORD* pHandle,DWORD Usage) PURE; - STDMETHOD(SetVertexShader)(THIS_ DWORD Handle) PURE; - STDMETHOD(GetVertexShader)(THIS_ DWORD* pHandle) PURE; - STDMETHOD(DeleteVertexShader)(THIS_ DWORD Handle) PURE; - STDMETHOD(SetVertexShaderConstant)(THIS_ DWORD Register,CONST void* pConstantData,DWORD ConstantCount) PURE; - STDMETHOD(GetVertexShaderConstant)(THIS_ DWORD Register,void* pConstantData,DWORD ConstantCount) PURE; - STDMETHOD(GetVertexShaderDeclaration)(THIS_ DWORD Handle,void* pData,DWORD* pSizeOfData) PURE; - STDMETHOD(GetVertexShaderFunction)(THIS_ DWORD Handle,void* pData,DWORD* pSizeOfData) PURE; - STDMETHOD(SetStreamSource)(THIS_ UINT StreamNumber,IDirect3DVertexBuffer8* pStreamData,UINT Stride) PURE; - STDMETHOD(GetStreamSource)(THIS_ UINT StreamNumber,IDirect3DVertexBuffer8** ppStreamData,UINT* pStride) PURE; - STDMETHOD(SetIndices)(THIS_ IDirect3DIndexBuffer8* pIndexData,UINT BaseVertexIndex) PURE; - STDMETHOD(GetIndices)(THIS_ IDirect3DIndexBuffer8** ppIndexData,UINT* pBaseVertexIndex) PURE; - STDMETHOD(CreatePixelShader)(THIS_ CONST DWORD* pFunction,DWORD* pHandle) PURE; - STDMETHOD(SetPixelShader)(THIS_ DWORD Handle) PURE; - STDMETHOD(GetPixelShader)(THIS_ DWORD* pHandle) PURE; - STDMETHOD(DeletePixelShader)(THIS_ DWORD Handle) PURE; - STDMETHOD(SetPixelShaderConstant)(THIS_ DWORD Register,CONST void* pConstantData,DWORD ConstantCount) PURE; - STDMETHOD(GetPixelShaderConstant)(THIS_ DWORD Register,void* pConstantData,DWORD ConstantCount) PURE; - STDMETHOD(GetPixelShaderFunction)(THIS_ DWORD Handle,void* pData,DWORD* pSizeOfData) PURE; - STDMETHOD(DrawRectPatch)(THIS_ UINT Handle,CONST float* pNumSegs,CONST D3DRECTPATCH_INFO* pRectPatchInfo) PURE; - STDMETHOD(DrawTriPatch)(THIS_ UINT Handle,CONST float* pNumSegs,CONST D3DTRIPATCH_INFO* pTriPatchInfo) PURE; - STDMETHOD(DeletePatch)(THIS_ UINT Handle) PURE; -}; - -typedef struct IDirect3DDevice8 *LPDIRECT3DDEVICE8, *PDIRECT3DDEVICE8; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DDevice8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DDevice8_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DDevice8_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DDevice8_TestCooperativeLevel(p) (p)->lpVtbl->TestCooperativeLevel(p) -#define IDirect3DDevice8_GetAvailableTextureMem(p) (p)->lpVtbl->GetAvailableTextureMem(p) -#define IDirect3DDevice8_ResourceManagerDiscardBytes(p,a) (p)->lpVtbl->ResourceManagerDiscardBytes(p,a) -#define IDirect3DDevice8_GetDirect3D(p,a) (p)->lpVtbl->GetDirect3D(p,a) -#define IDirect3DDevice8_GetDeviceCaps(p,a) (p)->lpVtbl->GetDeviceCaps(p,a) -#define IDirect3DDevice8_GetDisplayMode(p,a) (p)->lpVtbl->GetDisplayMode(p,a) -#define IDirect3DDevice8_GetCreationParameters(p,a) (p)->lpVtbl->GetCreationParameters(p,a) -#define IDirect3DDevice8_SetCursorProperties(p,a,b,c) (p)->lpVtbl->SetCursorProperties(p,a,b,c) -#define IDirect3DDevice8_SetCursorPosition(p,a,b,c) (p)->lpVtbl->SetCursorPosition(p,a,b,c) -#define IDirect3DDevice8_ShowCursor(p,a) (p)->lpVtbl->ShowCursor(p,a) -#define IDirect3DDevice8_CreateAdditionalSwapChain(p,a,b) (p)->lpVtbl->CreateAdditionalSwapChain(p,a,b) -#define IDirect3DDevice8_Reset(p,a) (p)->lpVtbl->Reset(p,a) -#define IDirect3DDevice8_Present(p,a,b,c,d) (p)->lpVtbl->Present(p,a,b,c,d) -#define IDirect3DDevice8_GetBackBuffer(p,a,b,c) (p)->lpVtbl->GetBackBuffer(p,a,b,c) -#define IDirect3DDevice8_GetRasterStatus(p,a) (p)->lpVtbl->GetRasterStatus(p,a) -#define IDirect3DDevice8_SetGammaRamp(p,a,b) (p)->lpVtbl->SetGammaRamp(p,a,b) -#define IDirect3DDevice8_GetGammaRamp(p,a) (p)->lpVtbl->GetGammaRamp(p,a) -#define IDirect3DDevice8_CreateTexture(p,a,b,c,d,e,f,g) (p)->lpVtbl->CreateTexture(p,a,b,c,d,e,f,g) -#define IDirect3DDevice8_CreateVolumeTexture(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->CreateVolumeTexture(p,a,b,c,d,e,f,g,h) -#define IDirect3DDevice8_CreateCubeTexture(p,a,b,c,d,e,f) (p)->lpVtbl->CreateCubeTexture(p,a,b,c,d,e,f) -#define IDirect3DDevice8_CreateVertexBuffer(p,a,b,c,d,e) (p)->lpVtbl->CreateVertexBuffer(p,a,b,c,d,e) -#define IDirect3DDevice8_CreateIndexBuffer(p,a,b,c,d,e) (p)->lpVtbl->CreateIndexBuffer(p,a,b,c,d,e) -#define IDirect3DDevice8_CreateRenderTarget(p,a,b,c,d,e,f) (p)->lpVtbl->CreateRenderTarget(p,a,b,c,d,e,f) -#define IDirect3DDevice8_CreateDepthStencilSurface(p,a,b,c,d,e) (p)->lpVtbl->CreateDepthStencilSurface(p,a,b,c,d,e) -#define IDirect3DDevice8_CreateImageSurface(p,a,b,c,d) (p)->lpVtbl->CreateImageSurface(p,a,b,c,d) -#define IDirect3DDevice8_CopyRects(p,a,b,c,d,e) (p)->lpVtbl->CopyRects(p,a,b,c,d,e) -#define IDirect3DDevice8_UpdateTexture(p,a,b) (p)->lpVtbl->UpdateTexture(p,a,b) -#define IDirect3DDevice8_GetFrontBuffer(p,a) (p)->lpVtbl->GetFrontBuffer(p,a) -#define IDirect3DDevice8_SetRenderTarget(p,a,b) (p)->lpVtbl->SetRenderTarget(p,a,b) -#define IDirect3DDevice8_GetRenderTarget(p,a) (p)->lpVtbl->GetRenderTarget(p,a) -#define IDirect3DDevice8_GetDepthStencilSurface(p,a) (p)->lpVtbl->GetDepthStencilSurface(p,a) -#define IDirect3DDevice8_BeginScene(p) (p)->lpVtbl->BeginScene(p) -#define IDirect3DDevice8_EndScene(p) (p)->lpVtbl->EndScene(p) -#define IDirect3DDevice8_Clear(p,a,b,c,d,e,f) (p)->lpVtbl->Clear(p,a,b,c,d,e,f) -#define IDirect3DDevice8_SetTransform(p,a,b) (p)->lpVtbl->SetTransform(p,a,b) -#define IDirect3DDevice8_GetTransform(p,a,b) (p)->lpVtbl->GetTransform(p,a,b) -#define IDirect3DDevice8_MultiplyTransform(p,a,b) (p)->lpVtbl->MultiplyTransform(p,a,b) -#define IDirect3DDevice8_SetViewport(p,a) (p)->lpVtbl->SetViewport(p,a) -#define IDirect3DDevice8_GetViewport(p,a) (p)->lpVtbl->GetViewport(p,a) -#define IDirect3DDevice8_SetMaterial(p,a) (p)->lpVtbl->SetMaterial(p,a) -#define IDirect3DDevice8_GetMaterial(p,a) (p)->lpVtbl->GetMaterial(p,a) -#define IDirect3DDevice8_SetLight(p,a,b) (p)->lpVtbl->SetLight(p,a,b) -#define IDirect3DDevice8_GetLight(p,a,b) (p)->lpVtbl->GetLight(p,a,b) -#define IDirect3DDevice8_LightEnable(p,a,b) (p)->lpVtbl->LightEnable(p,a,b) -#define IDirect3DDevice8_GetLightEnable(p,a,b) (p)->lpVtbl->GetLightEnable(p,a,b) -#define IDirect3DDevice8_SetClipPlane(p,a,b) (p)->lpVtbl->SetClipPlane(p,a,b) -#define IDirect3DDevice8_GetClipPlane(p,a,b) (p)->lpVtbl->GetClipPlane(p,a,b) -#define IDirect3DDevice8_SetRenderState(p,a,b) (p)->lpVtbl->SetRenderState(p,a,b) -#define IDirect3DDevice8_GetRenderState(p,a,b) (p)->lpVtbl->GetRenderState(p,a,b) -#define IDirect3DDevice8_BeginStateBlock(p) (p)->lpVtbl->BeginStateBlock(p) -#define IDirect3DDevice8_EndStateBlock(p,a) (p)->lpVtbl->EndStateBlock(p,a) -#define IDirect3DDevice8_ApplyStateBlock(p,a) (p)->lpVtbl->ApplyStateBlock(p,a) -#define IDirect3DDevice8_CaptureStateBlock(p,a) (p)->lpVtbl->CaptureStateBlock(p,a) -#define IDirect3DDevice8_DeleteStateBlock(p,a) (p)->lpVtbl->DeleteStateBlock(p,a) -#define IDirect3DDevice8_CreateStateBlock(p,a,b) (p)->lpVtbl->CreateStateBlock(p,a,b) -#define IDirect3DDevice8_SetClipStatus(p,a) (p)->lpVtbl->SetClipStatus(p,a) -#define IDirect3DDevice8_GetClipStatus(p,a) (p)->lpVtbl->GetClipStatus(p,a) -#define IDirect3DDevice8_GetTexture(p,a,b) (p)->lpVtbl->GetTexture(p,a,b) -#define IDirect3DDevice8_SetTexture(p,a,b) (p)->lpVtbl->SetTexture(p,a,b) -#define IDirect3DDevice8_GetTextureStageState(p,a,b,c) (p)->lpVtbl->GetTextureStageState(p,a,b,c) -#define IDirect3DDevice8_SetTextureStageState(p,a,b,c) (p)->lpVtbl->SetTextureStageState(p,a,b,c) -#define IDirect3DDevice8_ValidateDevice(p,a) (p)->lpVtbl->ValidateDevice(p,a) -#define IDirect3DDevice8_GetInfo(p,a,b,c) (p)->lpVtbl->GetInfo(p,a,b,c) -#define IDirect3DDevice8_SetPaletteEntries(p,a,b) (p)->lpVtbl->SetPaletteEntries(p,a,b) -#define IDirect3DDevice8_GetPaletteEntries(p,a,b) (p)->lpVtbl->GetPaletteEntries(p,a,b) -#define IDirect3DDevice8_SetCurrentTexturePalette(p,a) (p)->lpVtbl->SetCurrentTexturePalette(p,a) -#define IDirect3DDevice8_GetCurrentTexturePalette(p,a) (p)->lpVtbl->GetCurrentTexturePalette(p,a) -#define IDirect3DDevice8_DrawPrimitive(p,a,b,c) (p)->lpVtbl->DrawPrimitive(p,a,b,c) -#define IDirect3DDevice8_DrawIndexedPrimitive(p,a,b,c,d,e) (p)->lpVtbl->DrawIndexedPrimitive(p,a,b,c,d,e) -#define IDirect3DDevice8_DrawPrimitiveUP(p,a,b,c,d) (p)->lpVtbl->DrawPrimitiveUP(p,a,b,c,d) -#define IDirect3DDevice8_DrawIndexedPrimitiveUP(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->DrawIndexedPrimitiveUP(p,a,b,c,d,e,f,g,h) -#define IDirect3DDevice8_ProcessVertices(p,a,b,c,d,e) (p)->lpVtbl->ProcessVertices(p,a,b,c,d,e) -#define IDirect3DDevice8_CreateVertexShader(p,a,b,c,d) (p)->lpVtbl->CreateVertexShader(p,a,b,c,d) -#define IDirect3DDevice8_SetVertexShader(p,a) (p)->lpVtbl->SetVertexShader(p,a) -#define IDirect3DDevice8_GetVertexShader(p,a) (p)->lpVtbl->GetVertexShader(p,a) -#define IDirect3DDevice8_DeleteVertexShader(p,a) (p)->lpVtbl->DeleteVertexShader(p,a) -#define IDirect3DDevice8_SetVertexShaderConstant(p,a,b,c) (p)->lpVtbl->SetVertexShaderConstant(p,a,b,c) -#define IDirect3DDevice8_GetVertexShaderConstant(p,a,b,c) (p)->lpVtbl->GetVertexShaderConstant(p,a,b,c) -#define IDirect3DDevice8_GetVertexShaderDeclaration(p,a,b,c) (p)->lpVtbl->GetVertexShaderDeclaration(p,a,b,c) -#define IDirect3DDevice8_GetVertexShaderFunction(p,a,b,c) (p)->lpVtbl->GetVertexShaderFunction(p,a,b,c) -#define IDirect3DDevice8_SetStreamSource(p,a,b,c) (p)->lpVtbl->SetStreamSource(p,a,b,c) -#define IDirect3DDevice8_GetStreamSource(p,a,b,c) (p)->lpVtbl->GetStreamSource(p,a,b,c) -#define IDirect3DDevice8_SetIndices(p,a,b) (p)->lpVtbl->SetIndices(p,a,b) -#define IDirect3DDevice8_GetIndices(p,a,b) (p)->lpVtbl->GetIndices(p,a,b) -#define IDirect3DDevice8_CreatePixelShader(p,a,b) (p)->lpVtbl->CreatePixelShader(p,a,b) -#define IDirect3DDevice8_SetPixelShader(p,a) (p)->lpVtbl->SetPixelShader(p,a) -#define IDirect3DDevice8_GetPixelShader(p,a) (p)->lpVtbl->GetPixelShader(p,a) -#define IDirect3DDevice8_DeletePixelShader(p,a) (p)->lpVtbl->DeletePixelShader(p,a) -#define IDirect3DDevice8_SetPixelShaderConstant(p,a,b,c) (p)->lpVtbl->SetPixelShaderConstant(p,a,b,c) -#define IDirect3DDevice8_GetPixelShaderConstant(p,a,b,c) (p)->lpVtbl->GetPixelShaderConstant(p,a,b,c) -#define IDirect3DDevice8_GetPixelShaderFunction(p,a,b,c) (p)->lpVtbl->GetPixelShaderFunction(p,a,b,c) -#define IDirect3DDevice8_DrawRectPatch(p,a,b,c) (p)->lpVtbl->DrawRectPatch(p,a,b,c) -#define IDirect3DDevice8_DrawTriPatch(p,a,b,c) (p)->lpVtbl->DrawTriPatch(p,a,b,c) -#define IDirect3DDevice8_DeletePatch(p,a) (p)->lpVtbl->DeletePatch(p,a) -#else -#define IDirect3DDevice8_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DDevice8_AddRef(p) (p)->AddRef() -#define IDirect3DDevice8_Release(p) (p)->Release() -#define IDirect3DDevice8_TestCooperativeLevel(p) (p)->TestCooperativeLevel() -#define IDirect3DDevice8_GetAvailableTextureMem(p) (p)->GetAvailableTextureMem() -#define IDirect3DDevice8_ResourceManagerDiscardBytes(p,a) (p)->ResourceManagerDiscardBytes(a) -#define IDirect3DDevice8_GetDirect3D(p,a) (p)->GetDirect3D(a) -#define IDirect3DDevice8_GetDeviceCaps(p,a) (p)->GetDeviceCaps(a) -#define IDirect3DDevice8_GetDisplayMode(p,a) (p)->GetDisplayMode(a) -#define IDirect3DDevice8_GetCreationParameters(p,a) (p)->GetCreationParameters(a) -#define IDirect3DDevice8_SetCursorProperties(p,a,b,c) (p)->SetCursorProperties(a,b,c) -#define IDirect3DDevice8_SetCursorPosition(p,a,b,c) (p)->SetCursorPosition(a,b,c) -#define IDirect3DDevice8_ShowCursor(p,a) (p)->ShowCursor(a) -#define IDirect3DDevice8_CreateAdditionalSwapChain(p,a,b) (p)->CreateAdditionalSwapChain(a,b) -#define IDirect3DDevice8_Reset(p,a) (p)->Reset(a) -#define IDirect3DDevice8_Present(p,a,b,c,d) (p)->Present(a,b,c,d) -#define IDirect3DDevice8_GetBackBuffer(p,a,b,c) (p)->GetBackBuffer(a,b,c) -#define IDirect3DDevice8_GetRasterStatus(p,a) (p)->GetRasterStatus(a) -#define IDirect3DDevice8_SetGammaRamp(p,a,b) (p)->SetGammaRamp(a,b) -#define IDirect3DDevice8_GetGammaRamp(p,a) (p)->GetGammaRamp(a) -#define IDirect3DDevice8_CreateTexture(p,a,b,c,d,e,f,g) (p)->CreateTexture(a,b,c,d,e,f,g) -#define IDirect3DDevice8_CreateVolumeTexture(p,a,b,c,d,e,f,g,h) (p)->CreateVolumeTexture(a,b,c,d,e,f,g,h) -#define IDirect3DDevice8_CreateCubeTexture(p,a,b,c,d,e,f) (p)->CreateCubeTexture(a,b,c,d,e,f) -#define IDirect3DDevice8_CreateVertexBuffer(p,a,b,c,d,e) (p)->CreateVertexBuffer(a,b,c,d,e) -#define IDirect3DDevice8_CreateIndexBuffer(p,a,b,c,d,e) (p)->CreateIndexBuffer(a,b,c,d,e) -#define IDirect3DDevice8_CreateRenderTarget(p,a,b,c,d,e,f) (p)->CreateRenderTarget(a,b,c,d,e,f) -#define IDirect3DDevice8_CreateDepthStencilSurface(p,a,b,c,d,e) (p)->CreateDepthStencilSurface(a,b,c,d,e) -#define IDirect3DDevice8_CreateImageSurface(p,a,b,c,d) (p)->CreateImageSurface(a,b,c,d) -#define IDirect3DDevice8_CopyRects(p,a,b,c,d,e) (p)->CopyRects(a,b,c,d,e) -#define IDirect3DDevice8_UpdateTexture(p,a,b) (p)->UpdateTexture(a,b) -#define IDirect3DDevice8_GetFrontBuffer(p,a) (p)->GetFrontBuffer(a) -#define IDirect3DDevice8_SetRenderTarget(p,a,b) (p)->SetRenderTarget(a,b) -#define IDirect3DDevice8_GetRenderTarget(p,a) (p)->GetRenderTarget(a) -#define IDirect3DDevice8_GetDepthStencilSurface(p,a) (p)->GetDepthStencilSurface(a) -#define IDirect3DDevice8_BeginScene(p) (p)->BeginScene() -#define IDirect3DDevice8_EndScene(p) (p)->EndScene() -#define IDirect3DDevice8_Clear(p,a,b,c,d,e,f) (p)->Clear(a,b,c,d,e,f) -#define IDirect3DDevice8_SetTransform(p,a,b) (p)->SetTransform(a,b) -#define IDirect3DDevice8_GetTransform(p,a,b) (p)->GetTransform(a,b) -#define IDirect3DDevice8_MultiplyTransform(p,a,b) (p)->MultiplyTransform(a,b) -#define IDirect3DDevice8_SetViewport(p,a) (p)->SetViewport(a) -#define IDirect3DDevice8_GetViewport(p,a) (p)->GetViewport(a) -#define IDirect3DDevice8_SetMaterial(p,a) (p)->SetMaterial(a) -#define IDirect3DDevice8_GetMaterial(p,a) (p)->GetMaterial(a) -#define IDirect3DDevice8_SetLight(p,a,b) (p)->SetLight(a,b) -#define IDirect3DDevice8_GetLight(p,a,b) (p)->GetLight(a,b) -#define IDirect3DDevice8_LightEnable(p,a,b) (p)->LightEnable(a,b) -#define IDirect3DDevice8_GetLightEnable(p,a,b) (p)->GetLightEnable(a,b) -#define IDirect3DDevice8_SetClipPlane(p,a,b) (p)->SetClipPlane(a,b) -#define IDirect3DDevice8_GetClipPlane(p,a,b) (p)->GetClipPlane(a,b) -#define IDirect3DDevice8_SetRenderState(p,a,b) (p)->SetRenderState(a,b) -#define IDirect3DDevice8_GetRenderState(p,a,b) (p)->GetRenderState(a,b) -#define IDirect3DDevice8_BeginStateBlock(p) (p)->BeginStateBlock() -#define IDirect3DDevice8_EndStateBlock(p,a) (p)->EndStateBlock(a) -#define IDirect3DDevice8_ApplyStateBlock(p,a) (p)->ApplyStateBlock(a) -#define IDirect3DDevice8_CaptureStateBlock(p,a) (p)->CaptureStateBlock(a) -#define IDirect3DDevice8_DeleteStateBlock(p,a) (p)->DeleteStateBlock(a) -#define IDirect3DDevice8_CreateStateBlock(p,a,b) (p)->CreateStateBlock(a,b) -#define IDirect3DDevice8_SetClipStatus(p,a) (p)->SetClipStatus(a) -#define IDirect3DDevice8_GetClipStatus(p,a) (p)->GetClipStatus(a) -#define IDirect3DDevice8_GetTexture(p,a,b) (p)->GetTexture(a,b) -#define IDirect3DDevice8_SetTexture(p,a,b) (p)->SetTexture(a,b) -#define IDirect3DDevice8_GetTextureStageState(p,a,b,c) (p)->GetTextureStageState(a,b,c) -#define IDirect3DDevice8_SetTextureStageState(p,a,b,c) (p)->SetTextureStageState(a,b,c) -#define IDirect3DDevice8_ValidateDevice(p,a) (p)->ValidateDevice(a) -#define IDirect3DDevice8_GetInfo(p,a,b,c) (p)->GetInfo(a,b,c) -#define IDirect3DDevice8_SetPaletteEntries(p,a,b) (p)->SetPaletteEntries(a,b) -#define IDirect3DDevice8_GetPaletteEntries(p,a,b) (p)->GetPaletteEntries(a,b) -#define IDirect3DDevice8_SetCurrentTexturePalette(p,a) (p)->SetCurrentTexturePalette(a) -#define IDirect3DDevice8_GetCurrentTexturePalette(p,a) (p)->GetCurrentTexturePalette(a) -#define IDirect3DDevice8_DrawPrimitive(p,a,b,c) (p)->DrawPrimitive(a,b,c) -#define IDirect3DDevice8_DrawIndexedPrimitive(p,a,b,c,d,e) (p)->DrawIndexedPrimitive(a,b,c,d,e) -#define IDirect3DDevice8_DrawPrimitiveUP(p,a,b,c,d) (p)->DrawPrimitiveUP(a,b,c,d) -#define IDirect3DDevice8_DrawIndexedPrimitiveUP(p,a,b,c,d,e,f,g,h) (p)->DrawIndexedPrimitiveUP(a,b,c,d,e,f,g,h) -#define IDirect3DDevice8_ProcessVertices(p,a,b,c,d,e) (p)->ProcessVertices(a,b,c,d,e) -#define IDirect3DDevice8_CreateVertexShader(p,a,b,c,d) (p)->CreateVertexShader(a,b,c,d) -#define IDirect3DDevice8_SetVertexShader(p,a) (p)->SetVertexShader(a) -#define IDirect3DDevice8_GetVertexShader(p,a) (p)->GetVertexShader(a) -#define IDirect3DDevice8_DeleteVertexShader(p,a) (p)->DeleteVertexShader(a) -#define IDirect3DDevice8_SetVertexShaderConstant(p,a,b,c) (p)->SetVertexShaderConstant(a,b,c) -#define IDirect3DDevice8_GetVertexShaderConstant(p,a,b,c) (p)->GetVertexShaderConstant(a,b,c) -#define IDirect3DDevice8_GetVertexShaderDeclaration(p,a,b,c) (p)->GetVertexShaderDeclaration(a,b,c) -#define IDirect3DDevice8_GetVertexShaderFunction(p,a,b,c) (p)->GetVertexShaderFunction(a,b,c) -#define IDirect3DDevice8_SetStreamSource(p,a,b,c) (p)->SetStreamSource(a,b,c) -#define IDirect3DDevice8_GetStreamSource(p,a,b,c) (p)->GetStreamSource(a,b,c) -#define IDirect3DDevice8_SetIndices(p,a,b) (p)->SetIndices(a,b) -#define IDirect3DDevice8_GetIndices(p,a,b) (p)->GetIndices(a,b) -#define IDirect3DDevice8_CreatePixelShader(p,a,b) (p)->CreatePixelShader(a,b) -#define IDirect3DDevice8_SetPixelShader(p,a) (p)->SetPixelShader(a) -#define IDirect3DDevice8_GetPixelShader(p,a) (p)->GetPixelShader(a) -#define IDirect3DDevice8_DeletePixelShader(p,a) (p)->DeletePixelShader(a) -#define IDirect3DDevice8_SetPixelShaderConstant(p,a,b,c) (p)->SetPixelShaderConstant(a,b,c) -#define IDirect3DDevice8_GetPixelShaderConstant(p,a,b,c) (p)->GetPixelShaderConstant(a,b,c) -#define IDirect3DDevice8_GetPixelShaderFunction(p,a,b,c) (p)->GetPixelShaderFunction(a,b,c) -#define IDirect3DDevice8_DrawRectPatch(p,a,b,c) (p)->DrawRectPatch(a,b,c) -#define IDirect3DDevice8_DrawTriPatch(p,a,b,c) (p)->DrawTriPatch(a,b,c) -#define IDirect3DDevice8_DeletePatch(p,a) (p)->DeletePatch(a) -#endif - - - -#undef INTERFACE -#define INTERFACE IDirect3DSwapChain8 - -DECLARE_INTERFACE_(IDirect3DSwapChain8, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DSwapChain8 methods ***/ - STDMETHOD(Present)(THIS_ CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion) PURE; - STDMETHOD(GetBackBuffer)(THIS_ UINT BackBuffer,D3DBACKBUFFER_TYPE Type,IDirect3DSurface8** ppBackBuffer) PURE; -}; - -typedef struct IDirect3DSwapChain8 *LPDIRECT3DSWAPCHAIN8, *PDIRECT3DSWAPCHAIN8; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DSwapChain8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DSwapChain8_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DSwapChain8_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DSwapChain8_Present(p,a,b,c,d) (p)->lpVtbl->Present(p,a,b,c,d) -#define IDirect3DSwapChain8_GetBackBuffer(p,a,b,c) (p)->lpVtbl->GetBackBuffer(p,a,b,c) -#else -#define IDirect3DSwapChain8_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DSwapChain8_AddRef(p) (p)->AddRef() -#define IDirect3DSwapChain8_Release(p) (p)->Release() -#define IDirect3DSwapChain8_Present(p,a,b,c,d) (p)->Present(a,b,c,d) -#define IDirect3DSwapChain8_GetBackBuffer(p,a,b,c) (p)->GetBackBuffer(a,b,c) -#endif - - - -#undef INTERFACE -#define INTERFACE IDirect3DResource8 - -DECLARE_INTERFACE_(IDirect3DResource8, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DResource8 methods ***/ - STDMETHOD(GetDevice)(THIS_ IDirect3DDevice8** ppDevice) PURE; - STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; - STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; - STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; - STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE; - STDMETHOD_(DWORD, GetPriority)(THIS) PURE; - STDMETHOD_(void, PreLoad)(THIS) PURE; - STDMETHOD_(D3DRESOURCETYPE, GetType)(THIS) PURE; -}; - -typedef struct IDirect3DResource8 *LPDIRECT3DRESOURCE8, *PDIRECT3DRESOURCE8; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DResource8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DResource8_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DResource8_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DResource8_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) -#define IDirect3DResource8_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) -#define IDirect3DResource8_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) -#define IDirect3DResource8_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) -#define IDirect3DResource8_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) -#define IDirect3DResource8_GetPriority(p) (p)->lpVtbl->GetPriority(p) -#define IDirect3DResource8_PreLoad(p) (p)->lpVtbl->PreLoad(p) -#define IDirect3DResource8_GetType(p) (p)->lpVtbl->GetType(p) -#else -#define IDirect3DResource8_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DResource8_AddRef(p) (p)->AddRef() -#define IDirect3DResource8_Release(p) (p)->Release() -#define IDirect3DResource8_GetDevice(p,a) (p)->GetDevice(a) -#define IDirect3DResource8_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) -#define IDirect3DResource8_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) -#define IDirect3DResource8_FreePrivateData(p,a) (p)->FreePrivateData(a) -#define IDirect3DResource8_SetPriority(p,a) (p)->SetPriority(a) -#define IDirect3DResource8_GetPriority(p) (p)->GetPriority() -#define IDirect3DResource8_PreLoad(p) (p)->PreLoad() -#define IDirect3DResource8_GetType(p) (p)->GetType() -#endif - - - - -#undef INTERFACE -#define INTERFACE IDirect3DBaseTexture8 - -DECLARE_INTERFACE_(IDirect3DBaseTexture8, IDirect3DResource8) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DResource8 methods ***/ - STDMETHOD(GetDevice)(THIS_ IDirect3DDevice8** ppDevice) PURE; - STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; - STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; - STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; - STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE; - STDMETHOD_(DWORD, GetPriority)(THIS) PURE; - STDMETHOD_(void, PreLoad)(THIS) PURE; - STDMETHOD_(D3DRESOURCETYPE, GetType)(THIS) PURE; - STDMETHOD_(DWORD, SetLOD)(THIS_ DWORD LODNew) PURE; - STDMETHOD_(DWORD, GetLOD)(THIS) PURE; - STDMETHOD_(DWORD, GetLevelCount)(THIS) PURE; -}; - -typedef struct IDirect3DBaseTexture8 *LPDIRECT3DBASETEXTURE8, *PDIRECT3DBASETEXTURE8; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DBaseTexture8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DBaseTexture8_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DBaseTexture8_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DBaseTexture8_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) -#define IDirect3DBaseTexture8_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) -#define IDirect3DBaseTexture8_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) -#define IDirect3DBaseTexture8_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) -#define IDirect3DBaseTexture8_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) -#define IDirect3DBaseTexture8_GetPriority(p) (p)->lpVtbl->GetPriority(p) -#define IDirect3DBaseTexture8_PreLoad(p) (p)->lpVtbl->PreLoad(p) -#define IDirect3DBaseTexture8_GetType(p) (p)->lpVtbl->GetType(p) -#define IDirect3DBaseTexture8_SetLOD(p,a) (p)->lpVtbl->SetLOD(p,a) -#define IDirect3DBaseTexture8_GetLOD(p) (p)->lpVtbl->GetLOD(p) -#define IDirect3DBaseTexture8_GetLevelCount(p) (p)->lpVtbl->GetLevelCount(p) -#else -#define IDirect3DBaseTexture8_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DBaseTexture8_AddRef(p) (p)->AddRef() -#define IDirect3DBaseTexture8_Release(p) (p)->Release() -#define IDirect3DBaseTexture8_GetDevice(p,a) (p)->GetDevice(a) -#define IDirect3DBaseTexture8_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) -#define IDirect3DBaseTexture8_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) -#define IDirect3DBaseTexture8_FreePrivateData(p,a) (p)->FreePrivateData(a) -#define IDirect3DBaseTexture8_SetPriority(p,a) (p)->SetPriority(a) -#define IDirect3DBaseTexture8_GetPriority(p) (p)->GetPriority() -#define IDirect3DBaseTexture8_PreLoad(p) (p)->PreLoad() -#define IDirect3DBaseTexture8_GetType(p) (p)->GetType() -#define IDirect3DBaseTexture8_SetLOD(p,a) (p)->SetLOD(a) -#define IDirect3DBaseTexture8_GetLOD(p) (p)->GetLOD() -#define IDirect3DBaseTexture8_GetLevelCount(p) (p)->GetLevelCount() -#endif - - - - - -#undef INTERFACE -#define INTERFACE IDirect3DTexture8 - -DECLARE_INTERFACE_(IDirect3DTexture8, IDirect3DBaseTexture8) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DBaseTexture8 methods ***/ - STDMETHOD(GetDevice)(THIS_ IDirect3DDevice8** ppDevice) PURE; - STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; - STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; - STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; - STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE; - STDMETHOD_(DWORD, GetPriority)(THIS) PURE; - STDMETHOD_(void, PreLoad)(THIS) PURE; - STDMETHOD_(D3DRESOURCETYPE, GetType)(THIS) PURE; - STDMETHOD_(DWORD, SetLOD)(THIS_ DWORD LODNew) PURE; - STDMETHOD_(DWORD, GetLOD)(THIS) PURE; - STDMETHOD_(DWORD, GetLevelCount)(THIS) PURE; - STDMETHOD(GetLevelDesc)(THIS_ UINT Level,D3DSURFACE_DESC *pDesc) PURE; - STDMETHOD(GetSurfaceLevel)(THIS_ UINT Level,IDirect3DSurface8** ppSurfaceLevel) PURE; - STDMETHOD(LockRect)(THIS_ UINT Level,D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags) PURE; - STDMETHOD(UnlockRect)(THIS_ UINT Level) PURE; - STDMETHOD(AddDirtyRect)(THIS_ CONST RECT* pDirtyRect) PURE; -}; - -typedef struct IDirect3DTexture8 *LPDIRECT3DTEXTURE8, *PDIRECT3DTEXTURE8; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DTexture8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DTexture8_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DTexture8_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DTexture8_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) -#define IDirect3DTexture8_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) -#define IDirect3DTexture8_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) -#define IDirect3DTexture8_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) -#define IDirect3DTexture8_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) -#define IDirect3DTexture8_GetPriority(p) (p)->lpVtbl->GetPriority(p) -#define IDirect3DTexture8_PreLoad(p) (p)->lpVtbl->PreLoad(p) -#define IDirect3DTexture8_GetType(p) (p)->lpVtbl->GetType(p) -#define IDirect3DTexture8_SetLOD(p,a) (p)->lpVtbl->SetLOD(p,a) -#define IDirect3DTexture8_GetLOD(p) (p)->lpVtbl->GetLOD(p) -#define IDirect3DTexture8_GetLevelCount(p) (p)->lpVtbl->GetLevelCount(p) -#define IDirect3DTexture8_GetLevelDesc(p,a,b) (p)->lpVtbl->GetLevelDesc(p,a,b) -#define IDirect3DTexture8_GetSurfaceLevel(p,a,b) (p)->lpVtbl->GetSurfaceLevel(p,a,b) -#define IDirect3DTexture8_LockRect(p,a,b,c,d) (p)->lpVtbl->LockRect(p,a,b,c,d) -#define IDirect3DTexture8_UnlockRect(p,a) (p)->lpVtbl->UnlockRect(p,a) -#define IDirect3DTexture8_AddDirtyRect(p,a) (p)->lpVtbl->AddDirtyRect(p,a) -#else -#define IDirect3DTexture8_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DTexture8_AddRef(p) (p)->AddRef() -#define IDirect3DTexture8_Release(p) (p)->Release() -#define IDirect3DTexture8_GetDevice(p,a) (p)->GetDevice(a) -#define IDirect3DTexture8_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) -#define IDirect3DTexture8_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) -#define IDirect3DTexture8_FreePrivateData(p,a) (p)->FreePrivateData(a) -#define IDirect3DTexture8_SetPriority(p,a) (p)->SetPriority(a) -#define IDirect3DTexture8_GetPriority(p) (p)->GetPriority() -#define IDirect3DTexture8_PreLoad(p) (p)->PreLoad() -#define IDirect3DTexture8_GetType(p) (p)->GetType() -#define IDirect3DTexture8_SetLOD(p,a) (p)->SetLOD(a) -#define IDirect3DTexture8_GetLOD(p) (p)->GetLOD() -#define IDirect3DTexture8_GetLevelCount(p) (p)->GetLevelCount() -#define IDirect3DTexture8_GetLevelDesc(p,a,b) (p)->GetLevelDesc(a,b) -#define IDirect3DTexture8_GetSurfaceLevel(p,a,b) (p)->GetSurfaceLevel(a,b) -#define IDirect3DTexture8_LockRect(p,a,b,c,d) (p)->LockRect(a,b,c,d) -#define IDirect3DTexture8_UnlockRect(p,a) (p)->UnlockRect(a) -#define IDirect3DTexture8_AddDirtyRect(p,a) (p)->AddDirtyRect(a) -#endif - - - - - -#undef INTERFACE -#define INTERFACE IDirect3DVolumeTexture8 - -DECLARE_INTERFACE_(IDirect3DVolumeTexture8, IDirect3DBaseTexture8) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DBaseTexture8 methods ***/ - STDMETHOD(GetDevice)(THIS_ IDirect3DDevice8** ppDevice) PURE; - STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; - STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; - STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; - STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE; - STDMETHOD_(DWORD, GetPriority)(THIS) PURE; - STDMETHOD_(void, PreLoad)(THIS) PURE; - STDMETHOD_(D3DRESOURCETYPE, GetType)(THIS) PURE; - STDMETHOD_(DWORD, SetLOD)(THIS_ DWORD LODNew) PURE; - STDMETHOD_(DWORD, GetLOD)(THIS) PURE; - STDMETHOD_(DWORD, GetLevelCount)(THIS) PURE; - STDMETHOD(GetLevelDesc)(THIS_ UINT Level,D3DVOLUME_DESC *pDesc) PURE; - STDMETHOD(GetVolumeLevel)(THIS_ UINT Level,IDirect3DVolume8** ppVolumeLevel) PURE; - STDMETHOD(LockBox)(THIS_ UINT Level,D3DLOCKED_BOX* pLockedVolume,CONST D3DBOX* pBox,DWORD Flags) PURE; - STDMETHOD(UnlockBox)(THIS_ UINT Level) PURE; - STDMETHOD(AddDirtyBox)(THIS_ CONST D3DBOX* pDirtyBox) PURE; -}; - -typedef struct IDirect3DVolumeTexture8 *LPDIRECT3DVOLUMETEXTURE8, *PDIRECT3DVOLUMETEXTURE8; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DVolumeTexture8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DVolumeTexture8_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DVolumeTexture8_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DVolumeTexture8_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) -#define IDirect3DVolumeTexture8_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) -#define IDirect3DVolumeTexture8_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) -#define IDirect3DVolumeTexture8_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) -#define IDirect3DVolumeTexture8_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) -#define IDirect3DVolumeTexture8_GetPriority(p) (p)->lpVtbl->GetPriority(p) -#define IDirect3DVolumeTexture8_PreLoad(p) (p)->lpVtbl->PreLoad(p) -#define IDirect3DVolumeTexture8_GetType(p) (p)->lpVtbl->GetType(p) -#define IDirect3DVolumeTexture8_SetLOD(p,a) (p)->lpVtbl->SetLOD(p,a) -#define IDirect3DVolumeTexture8_GetLOD(p) (p)->lpVtbl->GetLOD(p) -#define IDirect3DVolumeTexture8_GetLevelCount(p) (p)->lpVtbl->GetLevelCount(p) -#define IDirect3DVolumeTexture8_GetLevelDesc(p,a,b) (p)->lpVtbl->GetLevelDesc(p,a,b) -#define IDirect3DVolumeTexture8_GetVolumeLevel(p,a,b) (p)->lpVtbl->GetVolumeLevel(p,a,b) -#define IDirect3DVolumeTexture8_LockBox(p,a,b,c,d) (p)->lpVtbl->LockBox(p,a,b,c,d) -#define IDirect3DVolumeTexture8_UnlockBox(p,a) (p)->lpVtbl->UnlockBox(p,a) -#define IDirect3DVolumeTexture8_AddDirtyBox(p,a) (p)->lpVtbl->AddDirtyBox(p,a) -#else -#define IDirect3DVolumeTexture8_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DVolumeTexture8_AddRef(p) (p)->AddRef() -#define IDirect3DVolumeTexture8_Release(p) (p)->Release() -#define IDirect3DVolumeTexture8_GetDevice(p,a) (p)->GetDevice(a) -#define IDirect3DVolumeTexture8_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) -#define IDirect3DVolumeTexture8_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) -#define IDirect3DVolumeTexture8_FreePrivateData(p,a) (p)->FreePrivateData(a) -#define IDirect3DVolumeTexture8_SetPriority(p,a) (p)->SetPriority(a) -#define IDirect3DVolumeTexture8_GetPriority(p) (p)->GetPriority() -#define IDirect3DVolumeTexture8_PreLoad(p) (p)->PreLoad() -#define IDirect3DVolumeTexture8_GetType(p) (p)->GetType() -#define IDirect3DVolumeTexture8_SetLOD(p,a) (p)->SetLOD(a) -#define IDirect3DVolumeTexture8_GetLOD(p) (p)->GetLOD() -#define IDirect3DVolumeTexture8_GetLevelCount(p) (p)->GetLevelCount() -#define IDirect3DVolumeTexture8_GetLevelDesc(p,a,b) (p)->GetLevelDesc(a,b) -#define IDirect3DVolumeTexture8_GetVolumeLevel(p,a,b) (p)->GetVolumeLevel(a,b) -#define IDirect3DVolumeTexture8_LockBox(p,a,b,c,d) (p)->LockBox(a,b,c,d) -#define IDirect3DVolumeTexture8_UnlockBox(p,a) (p)->UnlockBox(a) -#define IDirect3DVolumeTexture8_AddDirtyBox(p,a) (p)->AddDirtyBox(a) -#endif - - - - - -#undef INTERFACE -#define INTERFACE IDirect3DCubeTexture8 - -DECLARE_INTERFACE_(IDirect3DCubeTexture8, IDirect3DBaseTexture8) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DBaseTexture8 methods ***/ - STDMETHOD(GetDevice)(THIS_ IDirect3DDevice8** ppDevice) PURE; - STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; - STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; - STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; - STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE; - STDMETHOD_(DWORD, GetPriority)(THIS) PURE; - STDMETHOD_(void, PreLoad)(THIS) PURE; - STDMETHOD_(D3DRESOURCETYPE, GetType)(THIS) PURE; - STDMETHOD_(DWORD, SetLOD)(THIS_ DWORD LODNew) PURE; - STDMETHOD_(DWORD, GetLOD)(THIS) PURE; - STDMETHOD_(DWORD, GetLevelCount)(THIS) PURE; - STDMETHOD(GetLevelDesc)(THIS_ UINT Level,D3DSURFACE_DESC *pDesc) PURE; - STDMETHOD(GetCubeMapSurface)(THIS_ D3DCUBEMAP_FACES FaceType,UINT Level,IDirect3DSurface8** ppCubeMapSurface) PURE; - STDMETHOD(LockRect)(THIS_ D3DCUBEMAP_FACES FaceType,UINT Level,D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags) PURE; - STDMETHOD(UnlockRect)(THIS_ D3DCUBEMAP_FACES FaceType,UINT Level) PURE; - STDMETHOD(AddDirtyRect)(THIS_ D3DCUBEMAP_FACES FaceType,CONST RECT* pDirtyRect) PURE; -}; - -typedef struct IDirect3DCubeTexture8 *LPDIRECT3DCUBETEXTURE8, *PDIRECT3DCUBETEXTURE8; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DCubeTexture8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DCubeTexture8_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DCubeTexture8_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DCubeTexture8_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) -#define IDirect3DCubeTexture8_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) -#define IDirect3DCubeTexture8_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) -#define IDirect3DCubeTexture8_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) -#define IDirect3DCubeTexture8_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) -#define IDirect3DCubeTexture8_GetPriority(p) (p)->lpVtbl->GetPriority(p) -#define IDirect3DCubeTexture8_PreLoad(p) (p)->lpVtbl->PreLoad(p) -#define IDirect3DCubeTexture8_GetType(p) (p)->lpVtbl->GetType(p) -#define IDirect3DCubeTexture8_SetLOD(p,a) (p)->lpVtbl->SetLOD(p,a) -#define IDirect3DCubeTexture8_GetLOD(p) (p)->lpVtbl->GetLOD(p) -#define IDirect3DCubeTexture8_GetLevelCount(p) (p)->lpVtbl->GetLevelCount(p) -#define IDirect3DCubeTexture8_GetLevelDesc(p,a,b) (p)->lpVtbl->GetLevelDesc(p,a,b) -#define IDirect3DCubeTexture8_GetCubeMapSurface(p,a,b,c) (p)->lpVtbl->GetCubeMapSurface(p,a,b,c) -#define IDirect3DCubeTexture8_LockRect(p,a,b,c,d,e) (p)->lpVtbl->LockRect(p,a,b,c,d,e) -#define IDirect3DCubeTexture8_UnlockRect(p,a,b) (p)->lpVtbl->UnlockRect(p,a,b) -#define IDirect3DCubeTexture8_AddDirtyRect(p,a,b) (p)->lpVtbl->AddDirtyRect(p,a,b) -#else -#define IDirect3DCubeTexture8_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DCubeTexture8_AddRef(p) (p)->AddRef() -#define IDirect3DCubeTexture8_Release(p) (p)->Release() -#define IDirect3DCubeTexture8_GetDevice(p,a) (p)->GetDevice(a) -#define IDirect3DCubeTexture8_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) -#define IDirect3DCubeTexture8_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) -#define IDirect3DCubeTexture8_FreePrivateData(p,a) (p)->FreePrivateData(a) -#define IDirect3DCubeTexture8_SetPriority(p,a) (p)->SetPriority(a) -#define IDirect3DCubeTexture8_GetPriority(p) (p)->GetPriority() -#define IDirect3DCubeTexture8_PreLoad(p) (p)->PreLoad() -#define IDirect3DCubeTexture8_GetType(p) (p)->GetType() -#define IDirect3DCubeTexture8_SetLOD(p,a) (p)->SetLOD(a) -#define IDirect3DCubeTexture8_GetLOD(p) (p)->GetLOD() -#define IDirect3DCubeTexture8_GetLevelCount(p) (p)->GetLevelCount() -#define IDirect3DCubeTexture8_GetLevelDesc(p,a,b) (p)->GetLevelDesc(a,b) -#define IDirect3DCubeTexture8_GetCubeMapSurface(p,a,b,c) (p)->GetCubeMapSurface(a,b,c) -#define IDirect3DCubeTexture8_LockRect(p,a,b,c,d,e) (p)->LockRect(a,b,c,d,e) -#define IDirect3DCubeTexture8_UnlockRect(p,a,b) (p)->UnlockRect(a,b) -#define IDirect3DCubeTexture8_AddDirtyRect(p,a,b) (p)->AddDirtyRect(a,b) -#endif - - - - -#undef INTERFACE -#define INTERFACE IDirect3DVertexBuffer8 - -DECLARE_INTERFACE_(IDirect3DVertexBuffer8, IDirect3DResource8) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DResource8 methods ***/ - STDMETHOD(GetDevice)(THIS_ IDirect3DDevice8** ppDevice) PURE; - STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; - STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; - STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; - STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE; - STDMETHOD_(DWORD, GetPriority)(THIS) PURE; - STDMETHOD_(void, PreLoad)(THIS) PURE; - STDMETHOD_(D3DRESOURCETYPE, GetType)(THIS) PURE; - STDMETHOD(Lock)(THIS_ UINT OffsetToLock,UINT SizeToLock,BYTE** ppbData,DWORD Flags) PURE; - STDMETHOD(Unlock)(THIS) PURE; - STDMETHOD(GetDesc)(THIS_ D3DVERTEXBUFFER_DESC *pDesc) PURE; -}; - -typedef struct IDirect3DVertexBuffer8 *LPDIRECT3DVERTEXBUFFER8, *PDIRECT3DVERTEXBUFFER8; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DVertexBuffer8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DVertexBuffer8_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DVertexBuffer8_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DVertexBuffer8_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) -#define IDirect3DVertexBuffer8_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) -#define IDirect3DVertexBuffer8_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) -#define IDirect3DVertexBuffer8_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) -#define IDirect3DVertexBuffer8_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) -#define IDirect3DVertexBuffer8_GetPriority(p) (p)->lpVtbl->GetPriority(p) -#define IDirect3DVertexBuffer8_PreLoad(p) (p)->lpVtbl->PreLoad(p) -#define IDirect3DVertexBuffer8_GetType(p) (p)->lpVtbl->GetType(p) -#define IDirect3DVertexBuffer8_Lock(p,a,b,c,d) (p)->lpVtbl->Lock(p,a,b,c,d) -#define IDirect3DVertexBuffer8_Unlock(p) (p)->lpVtbl->Unlock(p) -#define IDirect3DVertexBuffer8_GetDesc(p,a) (p)->lpVtbl->GetDesc(p,a) -#else -#define IDirect3DVertexBuffer8_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DVertexBuffer8_AddRef(p) (p)->AddRef() -#define IDirect3DVertexBuffer8_Release(p) (p)->Release() -#define IDirect3DVertexBuffer8_GetDevice(p,a) (p)->GetDevice(a) -#define IDirect3DVertexBuffer8_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) -#define IDirect3DVertexBuffer8_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) -#define IDirect3DVertexBuffer8_FreePrivateData(p,a) (p)->FreePrivateData(a) -#define IDirect3DVertexBuffer8_SetPriority(p,a) (p)->SetPriority(a) -#define IDirect3DVertexBuffer8_GetPriority(p) (p)->GetPriority() -#define IDirect3DVertexBuffer8_PreLoad(p) (p)->PreLoad() -#define IDirect3DVertexBuffer8_GetType(p) (p)->GetType() -#define IDirect3DVertexBuffer8_Lock(p,a,b,c,d) (p)->Lock(a,b,c,d) -#define IDirect3DVertexBuffer8_Unlock(p) (p)->Unlock() -#define IDirect3DVertexBuffer8_GetDesc(p,a) (p)->GetDesc(a) -#endif - - - - -#undef INTERFACE -#define INTERFACE IDirect3DIndexBuffer8 - -DECLARE_INTERFACE_(IDirect3DIndexBuffer8, IDirect3DResource8) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DResource8 methods ***/ - STDMETHOD(GetDevice)(THIS_ IDirect3DDevice8** ppDevice) PURE; - STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; - STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; - STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; - STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE; - STDMETHOD_(DWORD, GetPriority)(THIS) PURE; - STDMETHOD_(void, PreLoad)(THIS) PURE; - STDMETHOD_(D3DRESOURCETYPE, GetType)(THIS) PURE; - STDMETHOD(Lock)(THIS_ UINT OffsetToLock,UINT SizeToLock,BYTE** ppbData,DWORD Flags) PURE; - STDMETHOD(Unlock)(THIS) PURE; - STDMETHOD(GetDesc)(THIS_ D3DINDEXBUFFER_DESC *pDesc) PURE; -}; - -typedef struct IDirect3DIndexBuffer8 *LPDIRECT3DINDEXBUFFER8, *PDIRECT3DINDEXBUFFER8; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DIndexBuffer8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DIndexBuffer8_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DIndexBuffer8_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DIndexBuffer8_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) -#define IDirect3DIndexBuffer8_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) -#define IDirect3DIndexBuffer8_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) -#define IDirect3DIndexBuffer8_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) -#define IDirect3DIndexBuffer8_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) -#define IDirect3DIndexBuffer8_GetPriority(p) (p)->lpVtbl->GetPriority(p) -#define IDirect3DIndexBuffer8_PreLoad(p) (p)->lpVtbl->PreLoad(p) -#define IDirect3DIndexBuffer8_GetType(p) (p)->lpVtbl->GetType(p) -#define IDirect3DIndexBuffer8_Lock(p,a,b,c,d) (p)->lpVtbl->Lock(p,a,b,c,d) -#define IDirect3DIndexBuffer8_Unlock(p) (p)->lpVtbl->Unlock(p) -#define IDirect3DIndexBuffer8_GetDesc(p,a) (p)->lpVtbl->GetDesc(p,a) -#else -#define IDirect3DIndexBuffer8_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DIndexBuffer8_AddRef(p) (p)->AddRef() -#define IDirect3DIndexBuffer8_Release(p) (p)->Release() -#define IDirect3DIndexBuffer8_GetDevice(p,a) (p)->GetDevice(a) -#define IDirect3DIndexBuffer8_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) -#define IDirect3DIndexBuffer8_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) -#define IDirect3DIndexBuffer8_FreePrivateData(p,a) (p)->FreePrivateData(a) -#define IDirect3DIndexBuffer8_SetPriority(p,a) (p)->SetPriority(a) -#define IDirect3DIndexBuffer8_GetPriority(p) (p)->GetPriority() -#define IDirect3DIndexBuffer8_PreLoad(p) (p)->PreLoad() -#define IDirect3DIndexBuffer8_GetType(p) (p)->GetType() -#define IDirect3DIndexBuffer8_Lock(p,a,b,c,d) (p)->Lock(a,b,c,d) -#define IDirect3DIndexBuffer8_Unlock(p) (p)->Unlock() -#define IDirect3DIndexBuffer8_GetDesc(p,a) (p)->GetDesc(a) -#endif - - - - -#undef INTERFACE -#define INTERFACE IDirect3DSurface8 - -DECLARE_INTERFACE_(IDirect3DSurface8, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DSurface8 methods ***/ - STDMETHOD(GetDevice)(THIS_ IDirect3DDevice8** ppDevice) PURE; - STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; - STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; - STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; - STDMETHOD(GetContainer)(THIS_ REFIID riid,void** ppContainer) PURE; - STDMETHOD(GetDesc)(THIS_ D3DSURFACE_DESC *pDesc) PURE; - STDMETHOD(LockRect)(THIS_ D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags) PURE; - STDMETHOD(UnlockRect)(THIS) PURE; -}; - -typedef struct IDirect3DSurface8 *LPDIRECT3DSURFACE8, *PDIRECT3DSURFACE8; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DSurface8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DSurface8_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DSurface8_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DSurface8_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) -#define IDirect3DSurface8_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) -#define IDirect3DSurface8_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) -#define IDirect3DSurface8_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) -#define IDirect3DSurface8_GetContainer(p,a,b) (p)->lpVtbl->GetContainer(p,a,b) -#define IDirect3DSurface8_GetDesc(p,a) (p)->lpVtbl->GetDesc(p,a) -#define IDirect3DSurface8_LockRect(p,a,b,c) (p)->lpVtbl->LockRect(p,a,b,c) -#define IDirect3DSurface8_UnlockRect(p) (p)->lpVtbl->UnlockRect(p) -#else -#define IDirect3DSurface8_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DSurface8_AddRef(p) (p)->AddRef() -#define IDirect3DSurface8_Release(p) (p)->Release() -#define IDirect3DSurface8_GetDevice(p,a) (p)->GetDevice(a) -#define IDirect3DSurface8_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) -#define IDirect3DSurface8_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) -#define IDirect3DSurface8_FreePrivateData(p,a) (p)->FreePrivateData(a) -#define IDirect3DSurface8_GetContainer(p,a,b) (p)->GetContainer(a,b) -#define IDirect3DSurface8_GetDesc(p,a) (p)->GetDesc(a) -#define IDirect3DSurface8_LockRect(p,a,b,c) (p)->LockRect(a,b,c) -#define IDirect3DSurface8_UnlockRect(p) (p)->UnlockRect() -#endif - - - - -#undef INTERFACE -#define INTERFACE IDirect3DVolume8 - -DECLARE_INTERFACE_(IDirect3DVolume8, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - /*** IDirect3DVolume8 methods ***/ - STDMETHOD(GetDevice)(THIS_ IDirect3DDevice8** ppDevice) PURE; - STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; - STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; - STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; - STDMETHOD(GetContainer)(THIS_ REFIID riid,void** ppContainer) PURE; - STDMETHOD(GetDesc)(THIS_ D3DVOLUME_DESC *pDesc) PURE; - STDMETHOD(LockBox)(THIS_ D3DLOCKED_BOX * pLockedVolume,CONST D3DBOX* pBox,DWORD Flags) PURE; - STDMETHOD(UnlockBox)(THIS) PURE; -}; - -typedef struct IDirect3DVolume8 *LPDIRECT3DVOLUME8, *PDIRECT3DVOLUME8; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirect3DVolume8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DVolume8_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DVolume8_Release(p) (p)->lpVtbl->Release(p) -#define IDirect3DVolume8_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) -#define IDirect3DVolume8_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) -#define IDirect3DVolume8_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) -#define IDirect3DVolume8_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) -#define IDirect3DVolume8_GetContainer(p,a,b) (p)->lpVtbl->GetContainer(p,a,b) -#define IDirect3DVolume8_GetDesc(p,a) (p)->lpVtbl->GetDesc(p,a) -#define IDirect3DVolume8_LockBox(p,a,b,c) (p)->lpVtbl->LockBox(p,a,b,c) -#define IDirect3DVolume8_UnlockBox(p) (p)->lpVtbl->UnlockBox(p) -#else -#define IDirect3DVolume8_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirect3DVolume8_AddRef(p) (p)->AddRef() -#define IDirect3DVolume8_Release(p) (p)->Release() -#define IDirect3DVolume8_GetDevice(p,a) (p)->GetDevice(a) -#define IDirect3DVolume8_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) -#define IDirect3DVolume8_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) -#define IDirect3DVolume8_FreePrivateData(p,a) (p)->FreePrivateData(a) -#define IDirect3DVolume8_GetContainer(p,a,b) (p)->GetContainer(a,b) -#define IDirect3DVolume8_GetDesc(p,a) (p)->GetDesc(a) -#define IDirect3DVolume8_LockBox(p,a,b,c) (p)->LockBox(a,b,c) -#define IDirect3DVolume8_UnlockBox(p) (p)->UnlockBox() -#endif - -/**************************************************************************** - * Flags for SetPrivateData method on all D3D8 interfaces - * - * The passed pointer is an IUnknown ptr. The SizeOfData argument to SetPrivateData - * must be set to sizeof(IUnknown*). Direct3D will call AddRef through this - * pointer and Release when the private data is destroyed. The data will be - * destroyed when another SetPrivateData with the same GUID is set, when - * FreePrivateData is called, or when the D3D8 object is freed. - ****************************************************************************/ -#define D3DSPD_IUNKNOWN 0x00000001L - -/**************************************************************************** - * - * Parameter for IDirect3D8 Enum and GetCaps8 functions to get the info for - * the current mode only. - * - ****************************************************************************/ - -#define D3DCURRENT_DISPLAY_MODE 0x00EFFFFFL - -/**************************************************************************** - * - * Flags for IDirect3D8::CreateDevice's BehaviorFlags - * - ****************************************************************************/ - -#define D3DCREATE_FPU_PRESERVE 0x00000002L -#define D3DCREATE_MULTITHREADED 0x00000004L - -#define D3DCREATE_PUREDEVICE 0x00000010L -#define D3DCREATE_SOFTWARE_VERTEXPROCESSING 0x00000020L -#define D3DCREATE_HARDWARE_VERTEXPROCESSING 0x00000040L -#define D3DCREATE_MIXED_VERTEXPROCESSING 0x00000080L - -#define D3DCREATE_DISABLE_DRIVER_MANAGEMENT 0x00000100L - - -/**************************************************************************** - * - * Parameter for IDirect3D8::CreateDevice's iAdapter - * - ****************************************************************************/ - -#define D3DADAPTER_DEFAULT 0 - -/**************************************************************************** - * - * Flags for IDirect3D8::EnumAdapters - * - ****************************************************************************/ - -#define D3DENUM_NO_WHQL_LEVEL 0x00000002L - -/**************************************************************************** - * - * Maximum number of back-buffers supported in DX8 - * - ****************************************************************************/ - -#define D3DPRESENT_BACK_BUFFERS_MAX 3L - -/**************************************************************************** - * - * Flags for IDirect3DDevice8::SetGammaRamp - * - ****************************************************************************/ - -#define D3DSGR_NO_CALIBRATION 0x00000000L -#define D3DSGR_CALIBRATE 0x00000001L - -/**************************************************************************** - * - * Flags for IDirect3DDevice8::SetCursorPosition - * - ****************************************************************************/ - -#define D3DCURSOR_IMMEDIATE_UPDATE 0x00000001L - -/**************************************************************************** - * - * Flags for DrawPrimitive/DrawIndexedPrimitive - * Also valid for Begin/BeginIndexed - * Also valid for VertexBuffer::CreateVertexBuffer - ****************************************************************************/ - - -/* - * DirectDraw error codes - */ -#define _FACD3D 0x876 -#define MAKE_D3DHRESULT( code ) MAKE_HRESULT( 1, _FACD3D, code ) - -/* - * Direct3D Errors - */ -#define D3D_OK S_OK - -#define D3DERR_WRONGTEXTUREFORMAT MAKE_D3DHRESULT(2072) -#define D3DERR_UNSUPPORTEDCOLOROPERATION MAKE_D3DHRESULT(2073) -#define D3DERR_UNSUPPORTEDCOLORARG MAKE_D3DHRESULT(2074) -#define D3DERR_UNSUPPORTEDALPHAOPERATION MAKE_D3DHRESULT(2075) -#define D3DERR_UNSUPPORTEDALPHAARG MAKE_D3DHRESULT(2076) -#define D3DERR_TOOMANYOPERATIONS MAKE_D3DHRESULT(2077) -#define D3DERR_CONFLICTINGTEXTUREFILTER MAKE_D3DHRESULT(2078) -#define D3DERR_UNSUPPORTEDFACTORVALUE MAKE_D3DHRESULT(2079) -#define D3DERR_CONFLICTINGRENDERSTATE MAKE_D3DHRESULT(2081) -#define D3DERR_UNSUPPORTEDTEXTUREFILTER MAKE_D3DHRESULT(2082) -#define D3DERR_CONFLICTINGTEXTUREPALETTE MAKE_D3DHRESULT(2086) -#define D3DERR_DRIVERINTERNALERROR MAKE_D3DHRESULT(2087) - -#define D3DERR_NOTFOUND MAKE_D3DHRESULT(2150) -#define D3DERR_MOREDATA MAKE_D3DHRESULT(2151) -#define D3DERR_DEVICELOST MAKE_D3DHRESULT(2152) -#define D3DERR_DEVICENOTRESET MAKE_D3DHRESULT(2153) -#define D3DERR_NOTAVAILABLE MAKE_D3DHRESULT(2154) -#define D3DERR_OUTOFVIDEOMEMORY MAKE_D3DHRESULT(380) -#define D3DERR_INVALIDDEVICE MAKE_D3DHRESULT(2155) -#define D3DERR_INVALIDCALL MAKE_D3DHRESULT(2156) -#define D3DERR_DRIVERINVALIDCALL MAKE_D3DHRESULT(2157) - -#ifdef __cplusplus -}; -#endif - -#endif /* (DIRECT3D_VERSION >= 0x0800) */ -#endif /* _D3D_H_ */ - diff --git a/import/DirectX8/include/d3d8caps.h b/import/DirectX8/include/d3d8caps.h deleted file mode 100644 index 1cf60e7f8..000000000 --- a/import/DirectX8/include/d3d8caps.h +++ /dev/null @@ -1,362 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) Microsoft Corporation. All Rights Reserved. - * - * File: d3d8caps.h - * Content: Direct3D capabilities include file - * - ***************************************************************************/ - -#ifndef _D3D8CAPS_H -#define _D3D8CAPS_H - -#ifndef DIRECT3D_VERSION -#define DIRECT3D_VERSION 0x0800 -#endif //DIRECT3D_VERSION - -// include this file content only if compiling for DX8 interfaces -#if(DIRECT3D_VERSION >= 0x0800) - -#pragma pack(4) - -typedef struct _D3DCAPS8 -{ - /* Device Info */ - D3DDEVTYPE DeviceType; - UINT AdapterOrdinal; - - /* Caps from DX7 Draw */ - DWORD Caps; - DWORD Caps2; - DWORD Caps3; - DWORD PresentationIntervals; - - /* Cursor Caps */ - DWORD CursorCaps; - - /* 3D Device Caps */ - DWORD DevCaps; - - DWORD PrimitiveMiscCaps; - DWORD RasterCaps; - DWORD ZCmpCaps; - DWORD SrcBlendCaps; - DWORD DestBlendCaps; - DWORD AlphaCmpCaps; - DWORD ShadeCaps; - DWORD TextureCaps; - DWORD TextureFilterCaps; // D3DPTFILTERCAPS for IDirect3DTexture8's - DWORD CubeTextureFilterCaps; // D3DPTFILTERCAPS for IDirect3DCubeTexture8's - DWORD VolumeTextureFilterCaps; // D3DPTFILTERCAPS for IDirect3DVolumeTexture8's - DWORD TextureAddressCaps; // D3DPTADDRESSCAPS for IDirect3DTexture8's - DWORD VolumeTextureAddressCaps; // D3DPTADDRESSCAPS for IDirect3DVolumeTexture8's - - DWORD LineCaps; // D3DLINECAPS - - DWORD MaxTextureWidth, MaxTextureHeight; - DWORD MaxVolumeExtent; - - DWORD MaxTextureRepeat; - DWORD MaxTextureAspectRatio; - DWORD MaxAnisotropy; - float MaxVertexW; - - float GuardBandLeft; - float GuardBandTop; - float GuardBandRight; - float GuardBandBottom; - - float ExtentsAdjust; - DWORD StencilCaps; - - DWORD FVFCaps; - DWORD TextureOpCaps; - DWORD MaxTextureBlendStages; - DWORD MaxSimultaneousTextures; - - DWORD VertexProcessingCaps; - DWORD MaxActiveLights; - DWORD MaxUserClipPlanes; - DWORD MaxVertexBlendMatrices; - DWORD MaxVertexBlendMatrixIndex; - - float MaxPointSize; - - DWORD MaxPrimitiveCount; // max number of primitives per DrawPrimitive call - DWORD MaxVertexIndex; - DWORD MaxStreams; - DWORD MaxStreamStride; // max stride for SetStreamSource - - DWORD VertexShaderVersion; - DWORD MaxVertexShaderConst; // number of vertex shader constant registers - - DWORD PixelShaderVersion; - float MaxPixelShaderValue; // max value of pixel shader arithmetic component - -} D3DCAPS8; - -// -// BIT DEFINES FOR D3DCAPS8 DWORD MEMBERS -// - -// -// Caps -// -#define D3DCAPS_READ_SCANLINE 0x00020000L - -// -// Caps2 -// -#define D3DCAPS2_NO2DDURING3DSCENE 0x00000002L -#define D3DCAPS2_FULLSCREENGAMMA 0x00020000L -#define D3DCAPS2_CANRENDERWINDOWED 0x00080000L -#define D3DCAPS2_CANCALIBRATEGAMMA 0x00100000L -#define D3DCAPS2_RESERVED 0x02000000L -#define D3DCAPS2_CANMANAGERESOURCE 0x10000000L -#define D3DCAPS2_DYNAMICTEXTURES 0x20000000L - -// -// Caps3 -// -#define D3DCAPS3_RESERVED 0x8000001fL - -// Indicates that the device can respect the ALPHABLENDENABLE render state -// when fullscreen while using the FLIP or DISCARD swap effect. -// COPY and COPYVSYNC swap effects work whether or not this flag is set. -#define D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD 0x00000020L - -// -// PresentationIntervals -// -#define D3DPRESENT_INTERVAL_DEFAULT 0x00000000L -#define D3DPRESENT_INTERVAL_ONE 0x00000001L -#define D3DPRESENT_INTERVAL_TWO 0x00000002L -#define D3DPRESENT_INTERVAL_THREE 0x00000004L -#define D3DPRESENT_INTERVAL_FOUR 0x00000008L -#define D3DPRESENT_INTERVAL_IMMEDIATE 0x80000000L - -// -// CursorCaps -// -// Driver supports HW color cursor in at least hi-res modes(height >=400) -#define D3DCURSORCAPS_COLOR 0x00000001L -// Driver supports HW cursor also in low-res modes(height < 400) -#define D3DCURSORCAPS_LOWRES 0x00000002L - -// -// DevCaps -// -#define D3DDEVCAPS_EXECUTESYSTEMMEMORY 0x00000010L /* Device can use execute buffers from system memory */ -#define D3DDEVCAPS_EXECUTEVIDEOMEMORY 0x00000020L /* Device can use execute buffers from video memory */ -#define D3DDEVCAPS_TLVERTEXSYSTEMMEMORY 0x00000040L /* Device can use TL buffers from system memory */ -#define D3DDEVCAPS_TLVERTEXVIDEOMEMORY 0x00000080L /* Device can use TL buffers from video memory */ -#define D3DDEVCAPS_TEXTURESYSTEMMEMORY 0x00000100L /* Device can texture from system memory */ -#define D3DDEVCAPS_TEXTUREVIDEOMEMORY 0x00000200L /* Device can texture from device memory */ -#define D3DDEVCAPS_DRAWPRIMTLVERTEX 0x00000400L /* Device can draw TLVERTEX primitives */ -#define D3DDEVCAPS_CANRENDERAFTERFLIP 0x00000800L /* Device can render without waiting for flip to complete */ -#define D3DDEVCAPS_TEXTURENONLOCALVIDMEM 0x00001000L /* Device can texture from nonlocal video memory */ -#define D3DDEVCAPS_DRAWPRIMITIVES2 0x00002000L /* Device can support DrawPrimitives2 */ -#define D3DDEVCAPS_SEPARATETEXTUREMEMORIES 0x00004000L /* Device is texturing from separate memory pools */ -#define D3DDEVCAPS_DRAWPRIMITIVES2EX 0x00008000L /* Device can support Extended DrawPrimitives2 i.e. DX7 compliant driver*/ -#define D3DDEVCAPS_HWTRANSFORMANDLIGHT 0x00010000L /* Device can support transformation and lighting in hardware and DRAWPRIMITIVES2EX must be also */ -#define D3DDEVCAPS_CANBLTSYSTONONLOCAL 0x00020000L /* Device supports a Tex Blt from system memory to non-local vidmem */ -#define D3DDEVCAPS_HWRASTERIZATION 0x00080000L /* Device has HW acceleration for rasterization */ -#define D3DDEVCAPS_PUREDEVICE 0x00100000L /* Device supports D3DCREATE_PUREDEVICE */ -#define D3DDEVCAPS_QUINTICRTPATCHES 0x00200000L /* Device supports quintic Beziers and BSplines */ -#define D3DDEVCAPS_RTPATCHES 0x00400000L /* Device supports Rect and Tri patches */ -#define D3DDEVCAPS_RTPATCHHANDLEZERO 0x00800000L /* Indicates that RT Patches may be drawn efficiently using handle 0 */ -#define D3DDEVCAPS_NPATCHES 0x01000000L /* Device supports N-Patches */ - -// -// PrimitiveMiscCaps -// -#define D3DPMISCCAPS_MASKZ 0x00000002L -#define D3DPMISCCAPS_LINEPATTERNREP 0x00000004L -#define D3DPMISCCAPS_CULLNONE 0x00000010L -#define D3DPMISCCAPS_CULLCW 0x00000020L -#define D3DPMISCCAPS_CULLCCW 0x00000040L -#define D3DPMISCCAPS_COLORWRITEENABLE 0x00000080L -#define D3DPMISCCAPS_CLIPPLANESCALEDPOINTS 0x00000100L /* Device correctly clips scaled points to clip planes */ -#define D3DPMISCCAPS_CLIPTLVERTS 0x00000200L /* device will clip post-transformed vertex primitives */ -#define D3DPMISCCAPS_TSSARGTEMP 0x00000400L /* device supports D3DTA_TEMP for temporary register */ -#define D3DPMISCCAPS_BLENDOP 0x00000800L /* device supports D3DRS_BLENDOP */ -#define D3DPMISCCAPS_NULLREFERENCE 0x00001000L /* Reference Device that doesnt render */ - -// -// LineCaps -// -#define D3DLINECAPS_TEXTURE 0x00000001L -#define D3DLINECAPS_ZTEST 0x00000002L -#define D3DLINECAPS_BLEND 0x00000004L -#define D3DLINECAPS_ALPHACMP 0x00000008L -#define D3DLINECAPS_FOG 0x00000010L - -// -// RasterCaps -// -#define D3DPRASTERCAPS_DITHER 0x00000001L -#define D3DPRASTERCAPS_PAT 0x00000008L -#define D3DPRASTERCAPS_ZTEST 0x00000010L -#define D3DPRASTERCAPS_FOGVERTEX 0x00000080L -#define D3DPRASTERCAPS_FOGTABLE 0x00000100L -#define D3DPRASTERCAPS_ANTIALIASEDGES 0x00001000L -#define D3DPRASTERCAPS_MIPMAPLODBIAS 0x00002000L -#define D3DPRASTERCAPS_ZBIAS 0x00004000L -#define D3DPRASTERCAPS_ZBUFFERLESSHSR 0x00008000L -#define D3DPRASTERCAPS_FOGRANGE 0x00010000L -#define D3DPRASTERCAPS_ANISOTROPY 0x00020000L -#define D3DPRASTERCAPS_WBUFFER 0x00040000L -#define D3DPRASTERCAPS_WFOG 0x00100000L -#define D3DPRASTERCAPS_ZFOG 0x00200000L -#define D3DPRASTERCAPS_COLORPERSPECTIVE 0x00400000L /* Device iterates colors perspective correct */ -#define D3DPRASTERCAPS_STRETCHBLTMULTISAMPLE 0x00800000L - -// -// ZCmpCaps, AlphaCmpCaps -// -#define D3DPCMPCAPS_NEVER 0x00000001L -#define D3DPCMPCAPS_LESS 0x00000002L -#define D3DPCMPCAPS_EQUAL 0x00000004L -#define D3DPCMPCAPS_LESSEQUAL 0x00000008L -#define D3DPCMPCAPS_GREATER 0x00000010L -#define D3DPCMPCAPS_NOTEQUAL 0x00000020L -#define D3DPCMPCAPS_GREATEREQUAL 0x00000040L -#define D3DPCMPCAPS_ALWAYS 0x00000080L - -// -// SourceBlendCaps, DestBlendCaps -// -#define D3DPBLENDCAPS_ZERO 0x00000001L -#define D3DPBLENDCAPS_ONE 0x00000002L -#define D3DPBLENDCAPS_SRCCOLOR 0x00000004L -#define D3DPBLENDCAPS_INVSRCCOLOR 0x00000008L -#define D3DPBLENDCAPS_SRCALPHA 0x00000010L -#define D3DPBLENDCAPS_INVSRCALPHA 0x00000020L -#define D3DPBLENDCAPS_DESTALPHA 0x00000040L -#define D3DPBLENDCAPS_INVDESTALPHA 0x00000080L -#define D3DPBLENDCAPS_DESTCOLOR 0x00000100L -#define D3DPBLENDCAPS_INVDESTCOLOR 0x00000200L -#define D3DPBLENDCAPS_SRCALPHASAT 0x00000400L -#define D3DPBLENDCAPS_BOTHSRCALPHA 0x00000800L -#define D3DPBLENDCAPS_BOTHINVSRCALPHA 0x00001000L - -// -// ShadeCaps -// -#define D3DPSHADECAPS_COLORGOURAUDRGB 0x00000008L -#define D3DPSHADECAPS_SPECULARGOURAUDRGB 0x00000200L -#define D3DPSHADECAPS_ALPHAGOURAUDBLEND 0x00004000L -#define D3DPSHADECAPS_FOGGOURAUD 0x00080000L - -// -// TextureCaps -// -#define D3DPTEXTURECAPS_PERSPECTIVE 0x00000001L /* Perspective-correct texturing is supported */ -#define D3DPTEXTURECAPS_POW2 0x00000002L /* Power-of-2 texture dimensions are required - applies to non-Cube/Volume textures only. */ -#define D3DPTEXTURECAPS_ALPHA 0x00000004L /* Alpha in texture pixels is supported */ -#define D3DPTEXTURECAPS_SQUAREONLY 0x00000020L /* Only square textures are supported */ -#define D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE 0x00000040L /* Texture indices are not scaled by the texture size prior to interpolation */ -#define D3DPTEXTURECAPS_ALPHAPALETTE 0x00000080L /* Device can draw alpha from texture palettes */ -// Device can use non-POW2 textures if: -// 1) D3DTEXTURE_ADDRESS is set to CLAMP for this texture's stage -// 2) D3DRS_WRAP(N) is zero for this texture's coordinates -// 3) mip mapping is not enabled (use magnification filter only) -#define D3DPTEXTURECAPS_NONPOW2CONDITIONAL 0x00000100L -#define D3DPTEXTURECAPS_PROJECTED 0x00000400L /* Device can do D3DTTFF_PROJECTED */ -#define D3DPTEXTURECAPS_CUBEMAP 0x00000800L /* Device can do cubemap textures */ -#define D3DPTEXTURECAPS_VOLUMEMAP 0x00002000L /* Device can do volume textures */ -#define D3DPTEXTURECAPS_MIPMAP 0x00004000L /* Device can do mipmapped textures */ -#define D3DPTEXTURECAPS_MIPVOLUMEMAP 0x00008000L /* Device can do mipmapped volume textures */ -#define D3DPTEXTURECAPS_MIPCUBEMAP 0x00010000L /* Device can do mipmapped cube maps */ -#define D3DPTEXTURECAPS_CUBEMAP_POW2 0x00020000L /* Device requires that cubemaps be power-of-2 dimension */ -#define D3DPTEXTURECAPS_VOLUMEMAP_POW2 0x00040000L /* Device requires that volume maps be power-of-2 dimension */ - -// -// TextureFilterCaps -// -#define D3DPTFILTERCAPS_MINFPOINT 0x00000100L /* Min Filter */ -#define D3DPTFILTERCAPS_MINFLINEAR 0x00000200L -#define D3DPTFILTERCAPS_MINFANISOTROPIC 0x00000400L -#define D3DPTFILTERCAPS_MIPFPOINT 0x00010000L /* Mip Filter */ -#define D3DPTFILTERCAPS_MIPFLINEAR 0x00020000L -#define D3DPTFILTERCAPS_MAGFPOINT 0x01000000L /* Mag Filter */ -#define D3DPTFILTERCAPS_MAGFLINEAR 0x02000000L -#define D3DPTFILTERCAPS_MAGFANISOTROPIC 0x04000000L -#define D3DPTFILTERCAPS_MAGFAFLATCUBIC 0x08000000L -#define D3DPTFILTERCAPS_MAGFGAUSSIANCUBIC 0x10000000L - -// -// TextureAddressCaps -// -#define D3DPTADDRESSCAPS_WRAP 0x00000001L -#define D3DPTADDRESSCAPS_MIRROR 0x00000002L -#define D3DPTADDRESSCAPS_CLAMP 0x00000004L -#define D3DPTADDRESSCAPS_BORDER 0x00000008L -#define D3DPTADDRESSCAPS_INDEPENDENTUV 0x00000010L -#define D3DPTADDRESSCAPS_MIRRORONCE 0x00000020L - -// -// StencilCaps -// -#define D3DSTENCILCAPS_KEEP 0x00000001L -#define D3DSTENCILCAPS_ZERO 0x00000002L -#define D3DSTENCILCAPS_REPLACE 0x00000004L -#define D3DSTENCILCAPS_INCRSAT 0x00000008L -#define D3DSTENCILCAPS_DECRSAT 0x00000010L -#define D3DSTENCILCAPS_INVERT 0x00000020L -#define D3DSTENCILCAPS_INCR 0x00000040L -#define D3DSTENCILCAPS_DECR 0x00000080L - -// -// TextureOpCaps -// -#define D3DTEXOPCAPS_DISABLE 0x00000001L -#define D3DTEXOPCAPS_SELECTARG1 0x00000002L -#define D3DTEXOPCAPS_SELECTARG2 0x00000004L -#define D3DTEXOPCAPS_MODULATE 0x00000008L -#define D3DTEXOPCAPS_MODULATE2X 0x00000010L -#define D3DTEXOPCAPS_MODULATE4X 0x00000020L -#define D3DTEXOPCAPS_ADD 0x00000040L -#define D3DTEXOPCAPS_ADDSIGNED 0x00000080L -#define D3DTEXOPCAPS_ADDSIGNED2X 0x00000100L -#define D3DTEXOPCAPS_SUBTRACT 0x00000200L -#define D3DTEXOPCAPS_ADDSMOOTH 0x00000400L -#define D3DTEXOPCAPS_BLENDDIFFUSEALPHA 0x00000800L -#define D3DTEXOPCAPS_BLENDTEXTUREALPHA 0x00001000L -#define D3DTEXOPCAPS_BLENDFACTORALPHA 0x00002000L -#define D3DTEXOPCAPS_BLENDTEXTUREALPHAPM 0x00004000L -#define D3DTEXOPCAPS_BLENDCURRENTALPHA 0x00008000L -#define D3DTEXOPCAPS_PREMODULATE 0x00010000L -#define D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR 0x00020000L -#define D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA 0x00040000L -#define D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR 0x00080000L -#define D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA 0x00100000L -#define D3DTEXOPCAPS_BUMPENVMAP 0x00200000L -#define D3DTEXOPCAPS_BUMPENVMAPLUMINANCE 0x00400000L -#define D3DTEXOPCAPS_DOTPRODUCT3 0x00800000L -#define D3DTEXOPCAPS_MULTIPLYADD 0x01000000L -#define D3DTEXOPCAPS_LERP 0x02000000L - -// -// FVFCaps -// -#define D3DFVFCAPS_TEXCOORDCOUNTMASK 0x0000ffffL /* mask for texture coordinate count field */ -#define D3DFVFCAPS_DONOTSTRIPELEMENTS 0x00080000L /* Device prefers that vertex elements not be stripped */ -#define D3DFVFCAPS_PSIZE 0x00100000L /* Device can receive point size */ - -// -// VertexProcessingCaps -// -#define D3DVTXPCAPS_TEXGEN 0x00000001L /* device can do texgen */ -#define D3DVTXPCAPS_MATERIALSOURCE7 0x00000002L /* device can do DX7-level colormaterialsource ops */ -#define D3DVTXPCAPS_DIRECTIONALLIGHTS 0x00000008L /* device can do directional lights */ -#define D3DVTXPCAPS_POSITIONALLIGHTS 0x00000010L /* device can do positional lights (includes point and spot) */ -#define D3DVTXPCAPS_LOCALVIEWER 0x00000020L /* device can do local viewer */ -#define D3DVTXPCAPS_TWEENING 0x00000040L /* device can do vertex tweening */ -#define D3DVTXPCAPS_NO_VSDT_UBYTE4 0x00000080L /* device does not support D3DVSDT_UBYTE4 */ - -#pragma pack() - -#endif /* (DIRECT3D_VERSION >= 0x0800) */ -#endif /* _D3D8CAPS_H_ */ - diff --git a/import/DirectX8/include/d3d8types.h b/import/DirectX8/include/d3d8types.h deleted file mode 100644 index ec924f636..000000000 --- a/import/DirectX8/include/d3d8types.h +++ /dev/null @@ -1,1675 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) Microsoft Corporation. All Rights Reserved. - * - * File: d3d8types.h - * Content: Direct3D capabilities include file - * - ***************************************************************************/ - -#ifndef _D3D8TYPES_H_ -#define _D3D8TYPES_H_ - -#ifndef DIRECT3D_VERSION -#define DIRECT3D_VERSION 0x0800 -#endif //DIRECT3D_VERSION - -// include this file content only if compiling for DX8 interfaces -#if(DIRECT3D_VERSION >= 0x0800) - -#include - -#pragma warning(disable:4201) // anonymous unions warning -#pragma pack(4) - -// D3DCOLOR is equivalent to D3DFMT_A8R8G8B8 -#ifndef D3DCOLOR_DEFINED -typedef DWORD D3DCOLOR; -#define D3DCOLOR_DEFINED -#endif - -// maps unsigned 8 bits/channel to D3DCOLOR -#define D3DCOLOR_ARGB(a,r,g,b) \ - ((D3DCOLOR)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff))) -#define D3DCOLOR_RGBA(r,g,b,a) D3DCOLOR_ARGB(a,r,g,b) -#define D3DCOLOR_XRGB(r,g,b) D3DCOLOR_ARGB(0xff,r,g,b) - -// maps floating point channels (0.f to 1.f range) to D3DCOLOR -#define D3DCOLOR_COLORVALUE(r,g,b,a) \ - D3DCOLOR_RGBA((DWORD)((r)*255.f),(DWORD)((g)*255.f),(DWORD)((b)*255.f),(DWORD)((a)*255.f)) - - -#ifndef D3DVECTOR_DEFINED -typedef struct _D3DVECTOR { - float x; - float y; - float z; -} D3DVECTOR; -#define D3DVECTOR_DEFINED -#endif - -#ifndef D3DCOLORVALUE_DEFINED -typedef struct _D3DCOLORVALUE { - float r; - float g; - float b; - float a; -} D3DCOLORVALUE; -#define D3DCOLORVALUE_DEFINED -#endif - -#ifndef D3DRECT_DEFINED -typedef struct _D3DRECT { - LONG x1; - LONG y1; - LONG x2; - LONG y2; -} D3DRECT; -#define D3DRECT_DEFINED -#endif - -#ifndef D3DMATRIX_DEFINED -typedef struct _D3DMATRIX { - union { - struct { - float _11, _12, _13, _14; - float _21, _22, _23, _24; - float _31, _32, _33, _34; - float _41, _42, _43, _44; - - }; - float m[4][4]; - }; -} D3DMATRIX; -#define D3DMATRIX_DEFINED -#endif - -typedef struct _D3DVIEWPORT8 { - DWORD X; - DWORD Y; /* Viewport Top left */ - DWORD Width; - DWORD Height; /* Viewport Dimensions */ - float MinZ; /* Min/max of clip Volume */ - float MaxZ; -} D3DVIEWPORT8; - -/* - * Values for clip fields. - */ - -// Max number of user clipping planes, supported in D3D. -#define D3DMAXUSERCLIPPLANES 32 - -// These bits could be ORed together to use with D3DRS_CLIPPLANEENABLE -// -#define D3DCLIPPLANE0 (1 << 0) -#define D3DCLIPPLANE1 (1 << 1) -#define D3DCLIPPLANE2 (1 << 2) -#define D3DCLIPPLANE3 (1 << 3) -#define D3DCLIPPLANE4 (1 << 4) -#define D3DCLIPPLANE5 (1 << 5) - -// The following bits are used in the ClipUnion and ClipIntersection -// members of the D3DCLIPSTATUS8 -// - -#define D3DCS_LEFT 0x00000001L -#define D3DCS_RIGHT 0x00000002L -#define D3DCS_TOP 0x00000004L -#define D3DCS_BOTTOM 0x00000008L -#define D3DCS_FRONT 0x00000010L -#define D3DCS_BACK 0x00000020L -#define D3DCS_PLANE0 0x00000040L -#define D3DCS_PLANE1 0x00000080L -#define D3DCS_PLANE2 0x00000100L -#define D3DCS_PLANE3 0x00000200L -#define D3DCS_PLANE4 0x00000400L -#define D3DCS_PLANE5 0x00000800L - -#define D3DCS_ALL (D3DCS_LEFT | \ - D3DCS_RIGHT | \ - D3DCS_TOP | \ - D3DCS_BOTTOM | \ - D3DCS_FRONT | \ - D3DCS_BACK | \ - D3DCS_PLANE0 | \ - D3DCS_PLANE1 | \ - D3DCS_PLANE2 | \ - D3DCS_PLANE3 | \ - D3DCS_PLANE4 | \ - D3DCS_PLANE5) - -typedef struct _D3DCLIPSTATUS8 { - DWORD ClipUnion; - DWORD ClipIntersection; -} D3DCLIPSTATUS8; - -typedef struct _D3DMATERIAL8 { - D3DCOLORVALUE Diffuse; /* Diffuse color RGBA */ - D3DCOLORVALUE Ambient; /* Ambient color RGB */ - D3DCOLORVALUE Specular; /* Specular 'shininess' */ - D3DCOLORVALUE Emissive; /* Emissive color RGB */ - float Power; /* Sharpness if specular highlight */ -} D3DMATERIAL8; - -typedef enum _D3DLIGHTTYPE { - D3DLIGHT_POINT = 1, - D3DLIGHT_SPOT = 2, - D3DLIGHT_DIRECTIONAL = 3, - D3DLIGHT_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DLIGHTTYPE; - -typedef struct _D3DLIGHT8 { - D3DLIGHTTYPE Type; /* Type of light source */ - D3DCOLORVALUE Diffuse; /* Diffuse color of light */ - D3DCOLORVALUE Specular; /* Specular color of light */ - D3DCOLORVALUE Ambient; /* Ambient color of light */ - D3DVECTOR Position; /* Position in world space */ - D3DVECTOR Direction; /* Direction in world space */ - float Range; /* Cutoff range */ - float Falloff; /* Falloff */ - float Attenuation0; /* Constant attenuation */ - float Attenuation1; /* Linear attenuation */ - float Attenuation2; /* Quadratic attenuation */ - float Theta; /* Inner angle of spotlight cone */ - float Phi; /* Outer angle of spotlight cone */ -} D3DLIGHT8; - -/* - * Options for clearing - */ -#define D3DCLEAR_TARGET 0x00000001l /* Clear target surface */ -#define D3DCLEAR_ZBUFFER 0x00000002l /* Clear target z buffer */ -#define D3DCLEAR_STENCIL 0x00000004l /* Clear stencil planes */ - -/* - * The following defines the rendering states - */ - -typedef enum _D3DSHADEMODE { - D3DSHADE_FLAT = 1, - D3DSHADE_GOURAUD = 2, - D3DSHADE_PHONG = 3, - D3DSHADE_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DSHADEMODE; - -typedef enum _D3DFILLMODE { - D3DFILL_POINT = 1, - D3DFILL_WIREFRAME = 2, - D3DFILL_SOLID = 3, - D3DFILL_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DFILLMODE; - -typedef struct _D3DLINEPATTERN { - WORD wRepeatFactor; - WORD wLinePattern; -} D3DLINEPATTERN; - -typedef enum _D3DBLEND { - D3DBLEND_ZERO = 1, - D3DBLEND_ONE = 2, - D3DBLEND_SRCCOLOR = 3, - D3DBLEND_INVSRCCOLOR = 4, - D3DBLEND_SRCALPHA = 5, - D3DBLEND_INVSRCALPHA = 6, - D3DBLEND_DESTALPHA = 7, - D3DBLEND_INVDESTALPHA = 8, - D3DBLEND_DESTCOLOR = 9, - D3DBLEND_INVDESTCOLOR = 10, - D3DBLEND_SRCALPHASAT = 11, - D3DBLEND_BOTHSRCALPHA = 12, - D3DBLEND_BOTHINVSRCALPHA = 13, - D3DBLEND_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DBLEND; - -typedef enum _D3DBLENDOP { - D3DBLENDOP_ADD = 1, - D3DBLENDOP_SUBTRACT = 2, - D3DBLENDOP_REVSUBTRACT = 3, - D3DBLENDOP_MIN = 4, - D3DBLENDOP_MAX = 5, - D3DBLENDOP_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DBLENDOP; - -typedef enum _D3DTEXTUREADDRESS { - D3DTADDRESS_WRAP = 1, - D3DTADDRESS_MIRROR = 2, - D3DTADDRESS_CLAMP = 3, - D3DTADDRESS_BORDER = 4, - D3DTADDRESS_MIRRORONCE = 5, - D3DTADDRESS_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DTEXTUREADDRESS; - -typedef enum _D3DCULL { - D3DCULL_NONE = 1, - D3DCULL_CW = 2, - D3DCULL_CCW = 3, - D3DCULL_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DCULL; - -typedef enum _D3DCMPFUNC { - D3DCMP_NEVER = 1, - D3DCMP_LESS = 2, - D3DCMP_EQUAL = 3, - D3DCMP_LESSEQUAL = 4, - D3DCMP_GREATER = 5, - D3DCMP_NOTEQUAL = 6, - D3DCMP_GREATEREQUAL = 7, - D3DCMP_ALWAYS = 8, - D3DCMP_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DCMPFUNC; - -typedef enum _D3DSTENCILOP { - D3DSTENCILOP_KEEP = 1, - D3DSTENCILOP_ZERO = 2, - D3DSTENCILOP_REPLACE = 3, - D3DSTENCILOP_INCRSAT = 4, - D3DSTENCILOP_DECRSAT = 5, - D3DSTENCILOP_INVERT = 6, - D3DSTENCILOP_INCR = 7, - D3DSTENCILOP_DECR = 8, - D3DSTENCILOP_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DSTENCILOP; - -typedef enum _D3DFOGMODE { - D3DFOG_NONE = 0, - D3DFOG_EXP = 1, - D3DFOG_EXP2 = 2, - D3DFOG_LINEAR = 3, - D3DFOG_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DFOGMODE; - -typedef enum _D3DZBUFFERTYPE { - D3DZB_FALSE = 0, - D3DZB_TRUE = 1, // Z buffering - D3DZB_USEW = 2, // W buffering - D3DZB_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DZBUFFERTYPE; - -// Primitives supported by draw-primitive API -typedef enum _D3DPRIMITIVETYPE { - D3DPT_POINTLIST = 1, - D3DPT_LINELIST = 2, - D3DPT_LINESTRIP = 3, - D3DPT_TRIANGLELIST = 4, - D3DPT_TRIANGLESTRIP = 5, - D3DPT_TRIANGLEFAN = 6, - D3DPT_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DPRIMITIVETYPE; - -typedef enum _D3DTRANSFORMSTATETYPE { - D3DTS_VIEW = 2, - D3DTS_PROJECTION = 3, - D3DTS_TEXTURE0 = 16, - D3DTS_TEXTURE1 = 17, - D3DTS_TEXTURE2 = 18, - D3DTS_TEXTURE3 = 19, - D3DTS_TEXTURE4 = 20, - D3DTS_TEXTURE5 = 21, - D3DTS_TEXTURE6 = 22, - D3DTS_TEXTURE7 = 23, - D3DTS_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DTRANSFORMSTATETYPE; - -#define D3DTS_WORLDMATRIX(index) (D3DTRANSFORMSTATETYPE)(index + 256) -#define D3DTS_WORLD D3DTS_WORLDMATRIX(0) -#define D3DTS_WORLD1 D3DTS_WORLDMATRIX(1) -#define D3DTS_WORLD2 D3DTS_WORLDMATRIX(2) -#define D3DTS_WORLD3 D3DTS_WORLDMATRIX(3) - -typedef enum _D3DRENDERSTATETYPE { - D3DRS_ZENABLE = 7, /* D3DZBUFFERTYPE (or TRUE/FALSE for legacy) */ - D3DRS_FILLMODE = 8, /* D3DFILLMODE */ - D3DRS_SHADEMODE = 9, /* D3DSHADEMODE */ - D3DRS_LINEPATTERN = 10, /* D3DLINEPATTERN */ - D3DRS_ZWRITEENABLE = 14, /* TRUE to enable z writes */ - D3DRS_ALPHATESTENABLE = 15, /* TRUE to enable alpha tests */ - D3DRS_LASTPIXEL = 16, /* TRUE for last-pixel on lines */ - D3DRS_SRCBLEND = 19, /* D3DBLEND */ - D3DRS_DESTBLEND = 20, /* D3DBLEND */ - D3DRS_CULLMODE = 22, /* D3DCULL */ - D3DRS_ZFUNC = 23, /* D3DCMPFUNC */ - D3DRS_ALPHAREF = 24, /* D3DFIXED */ - D3DRS_ALPHAFUNC = 25, /* D3DCMPFUNC */ - D3DRS_DITHERENABLE = 26, /* TRUE to enable dithering */ - D3DRS_ALPHABLENDENABLE = 27, /* TRUE to enable alpha blending */ - D3DRS_FOGENABLE = 28, /* TRUE to enable fog blending */ - D3DRS_SPECULARENABLE = 29, /* TRUE to enable specular */ - D3DRS_ZVISIBLE = 30, /* TRUE to enable z checking */ - D3DRS_FOGCOLOR = 34, /* D3DCOLOR */ - D3DRS_FOGTABLEMODE = 35, /* D3DFOGMODE */ - D3DRS_FOGSTART = 36, /* Fog start (for both vertex and pixel fog) */ - D3DRS_FOGEND = 37, /* Fog end */ - D3DRS_FOGDENSITY = 38, /* Fog density */ - D3DRS_EDGEANTIALIAS = 40, /* TRUE to enable edge antialiasing */ - D3DRS_ZBIAS = 47, /* LONG Z bias */ - D3DRS_RANGEFOGENABLE = 48, /* Enables range-based fog */ - D3DRS_STENCILENABLE = 52, /* BOOL enable/disable stenciling */ - D3DRS_STENCILFAIL = 53, /* D3DSTENCILOP to do if stencil test fails */ - D3DRS_STENCILZFAIL = 54, /* D3DSTENCILOP to do if stencil test passes and Z test fails */ - D3DRS_STENCILPASS = 55, /* D3DSTENCILOP to do if both stencil and Z tests pass */ - D3DRS_STENCILFUNC = 56, /* D3DCMPFUNC fn. Stencil Test passes if ((ref & mask) stencilfn (stencil & mask)) is true */ - D3DRS_STENCILREF = 57, /* Reference value used in stencil test */ - D3DRS_STENCILMASK = 58, /* Mask value used in stencil test */ - D3DRS_STENCILWRITEMASK = 59, /* Write mask applied to values written to stencil buffer */ - D3DRS_TEXTUREFACTOR = 60, /* D3DCOLOR used for multi-texture blend */ - D3DRS_WRAP0 = 128, /* wrap for 1st texture coord. set */ - D3DRS_WRAP1 = 129, /* wrap for 2nd texture coord. set */ - D3DRS_WRAP2 = 130, /* wrap for 3rd texture coord. set */ - D3DRS_WRAP3 = 131, /* wrap for 4th texture coord. set */ - D3DRS_WRAP4 = 132, /* wrap for 5th texture coord. set */ - D3DRS_WRAP5 = 133, /* wrap for 6th texture coord. set */ - D3DRS_WRAP6 = 134, /* wrap for 7th texture coord. set */ - D3DRS_WRAP7 = 135, /* wrap for 8th texture coord. set */ - D3DRS_CLIPPING = 136, - D3DRS_LIGHTING = 137, - D3DRS_AMBIENT = 139, - D3DRS_FOGVERTEXMODE = 140, - D3DRS_COLORVERTEX = 141, - D3DRS_LOCALVIEWER = 142, - D3DRS_NORMALIZENORMALS = 143, - D3DRS_DIFFUSEMATERIALSOURCE = 145, - D3DRS_SPECULARMATERIALSOURCE = 146, - D3DRS_AMBIENTMATERIALSOURCE = 147, - D3DRS_EMISSIVEMATERIALSOURCE = 148, - D3DRS_VERTEXBLEND = 151, - D3DRS_CLIPPLANEENABLE = 152, - D3DRS_SOFTWAREVERTEXPROCESSING = 153, - D3DRS_POINTSIZE = 154, /* float point size */ - D3DRS_POINTSIZE_MIN = 155, /* float point size min threshold */ - D3DRS_POINTSPRITEENABLE = 156, /* BOOL point texture coord control */ - D3DRS_POINTSCALEENABLE = 157, /* BOOL point size scale enable */ - D3DRS_POINTSCALE_A = 158, /* float point attenuation A value */ - D3DRS_POINTSCALE_B = 159, /* float point attenuation B value */ - D3DRS_POINTSCALE_C = 160, /* float point attenuation C value */ - D3DRS_MULTISAMPLEANTIALIAS = 161, // BOOL - set to do FSAA with multisample buffer - D3DRS_MULTISAMPLEMASK = 162, // DWORD - per-sample enable/disable - D3DRS_PATCHEDGESTYLE = 163, // Sets whether patch edges will use float style tessellation - D3DRS_PATCHSEGMENTS = 164, // Number of segments per edge when drawing patches - D3DRS_DEBUGMONITORTOKEN = 165, // DEBUG ONLY - token to debug monitor - D3DRS_POINTSIZE_MAX = 166, /* float point size max threshold */ - D3DRS_INDEXEDVERTEXBLENDENABLE = 167, - D3DRS_COLORWRITEENABLE = 168, // per-channel write enable - D3DRS_TWEENFACTOR = 170, // float tween factor - D3DRS_BLENDOP = 171, // D3DBLENDOP setting - D3DRS_POSITIONORDER = 172, // NPatch position interpolation order. D3DORDER_LINEAR or D3DORDER_CUBIC (default) - D3DRS_NORMALORDER = 173, // NPatch normal interpolation order. D3DORDER_LINEAR (default) or D3DORDER_QUADRATIC - - D3DRS_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DRENDERSTATETYPE; - -// Values for material source -typedef enum _D3DMATERIALCOLORSOURCE -{ - D3DMCS_MATERIAL = 0, // Color from material is used - D3DMCS_COLOR1 = 1, // Diffuse vertex color is used - D3DMCS_COLOR2 = 2, // Specular vertex color is used - D3DMCS_FORCE_DWORD = 0x7fffffff, // force 32-bit size enum -} D3DMATERIALCOLORSOURCE; - -// Bias to apply to the texture coordinate set to apply a wrap to. -#define D3DRENDERSTATE_WRAPBIAS 128UL - -/* Flags to construct the WRAP render states */ -#define D3DWRAP_U 0x00000001L -#define D3DWRAP_V 0x00000002L -#define D3DWRAP_W 0x00000004L - -/* Flags to construct the WRAP render states for 1D thru 4D texture coordinates */ -#define D3DWRAPCOORD_0 0x00000001L // same as D3DWRAP_U -#define D3DWRAPCOORD_1 0x00000002L // same as D3DWRAP_V -#define D3DWRAPCOORD_2 0x00000004L // same as D3DWRAP_W -#define D3DWRAPCOORD_3 0x00000008L - -/* Flags to construct D3DRS_COLORWRITEENABLE */ -#define D3DCOLORWRITEENABLE_RED (1L<<0) -#define D3DCOLORWRITEENABLE_GREEN (1L<<1) -#define D3DCOLORWRITEENABLE_BLUE (1L<<2) -#define D3DCOLORWRITEENABLE_ALPHA (1L<<3) - -/* - * State enumerants for per-stage texture processing. - */ -typedef enum _D3DTEXTURESTAGESTATETYPE -{ - D3DTSS_COLOROP = 1, /* D3DTEXTUREOP - per-stage blending controls for color channels */ - D3DTSS_COLORARG1 = 2, /* D3DTA_* (texture arg) */ - D3DTSS_COLORARG2 = 3, /* D3DTA_* (texture arg) */ - D3DTSS_ALPHAOP = 4, /* D3DTEXTUREOP - per-stage blending controls for alpha channel */ - D3DTSS_ALPHAARG1 = 5, /* D3DTA_* (texture arg) */ - D3DTSS_ALPHAARG2 = 6, /* D3DTA_* (texture arg) */ - D3DTSS_BUMPENVMAT00 = 7, /* float (bump mapping matrix) */ - D3DTSS_BUMPENVMAT01 = 8, /* float (bump mapping matrix) */ - D3DTSS_BUMPENVMAT10 = 9, /* float (bump mapping matrix) */ - D3DTSS_BUMPENVMAT11 = 10, /* float (bump mapping matrix) */ - D3DTSS_TEXCOORDINDEX = 11, /* identifies which set of texture coordinates index this texture */ - D3DTSS_ADDRESSU = 13, /* D3DTEXTUREADDRESS for U coordinate */ - D3DTSS_ADDRESSV = 14, /* D3DTEXTUREADDRESS for V coordinate */ - D3DTSS_BORDERCOLOR = 15, /* D3DCOLOR */ - D3DTSS_MAGFILTER = 16, /* D3DTEXTUREFILTER filter to use for magnification */ - D3DTSS_MINFILTER = 17, /* D3DTEXTUREFILTER filter to use for minification */ - D3DTSS_MIPFILTER = 18, /* D3DTEXTUREFILTER filter to use between mipmaps during minification */ - D3DTSS_MIPMAPLODBIAS = 19, /* float Mipmap LOD bias */ - D3DTSS_MAXMIPLEVEL = 20, /* DWORD 0..(n-1) LOD index of largest map to use (0 == largest) */ - D3DTSS_MAXANISOTROPY = 21, /* DWORD maximum anisotropy */ - D3DTSS_BUMPENVLSCALE = 22, /* float scale for bump map luminance */ - D3DTSS_BUMPENVLOFFSET = 23, /* float offset for bump map luminance */ - D3DTSS_TEXTURETRANSFORMFLAGS = 24, /* D3DTEXTURETRANSFORMFLAGS controls texture transform */ - D3DTSS_ADDRESSW = 25, /* D3DTEXTUREADDRESS for W coordinate */ - D3DTSS_COLORARG0 = 26, /* D3DTA_* third arg for triadic ops */ - D3DTSS_ALPHAARG0 = 27, /* D3DTA_* third arg for triadic ops */ - D3DTSS_RESULTARG = 28, /* D3DTA_* arg for result (CURRENT or TEMP) */ - D3DTSS_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DTEXTURESTAGESTATETYPE; - -// Values, used with D3DTSS_TEXCOORDINDEX, to specify that the vertex data(position -// and normal in the camera space) should be taken as texture coordinates -// Low 16 bits are used to specify texture coordinate index, to take the WRAP mode from -// -#define D3DTSS_TCI_PASSTHRU 0x00000000 -#define D3DTSS_TCI_CAMERASPACENORMAL 0x00010000 -#define D3DTSS_TCI_CAMERASPACEPOSITION 0x00020000 -#define D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR 0x00030000 - -/* - * Enumerations for COLOROP and ALPHAOP texture blending operations set in - * texture processing stage controls in D3DTSS. - */ -typedef enum _D3DTEXTUREOP -{ - // Control - D3DTOP_DISABLE = 1, // disables stage - D3DTOP_SELECTARG1 = 2, // the default - D3DTOP_SELECTARG2 = 3, - - // Modulate - D3DTOP_MODULATE = 4, // multiply args together - D3DTOP_MODULATE2X = 5, // multiply and 1 bit - D3DTOP_MODULATE4X = 6, // multiply and 2 bits - - // Add - D3DTOP_ADD = 7, // add arguments together - D3DTOP_ADDSIGNED = 8, // add with -0.5 bias - D3DTOP_ADDSIGNED2X = 9, // as above but left 1 bit - D3DTOP_SUBTRACT = 10, // Arg1 - Arg2, with no saturation - D3DTOP_ADDSMOOTH = 11, // add 2 args, subtract product - // Arg1 + Arg2 - Arg1*Arg2 - // = Arg1 + (1-Arg1)*Arg2 - - // Linear alpha blend: Arg1*(Alpha) + Arg2*(1-Alpha) - D3DTOP_BLENDDIFFUSEALPHA = 12, // iterated alpha - D3DTOP_BLENDTEXTUREALPHA = 13, // texture alpha - D3DTOP_BLENDFACTORALPHA = 14, // alpha from D3DRS_TEXTUREFACTOR - - // Linear alpha blend with pre-multiplied arg1 input: Arg1 + Arg2*(1-Alpha) - D3DTOP_BLENDTEXTUREALPHAPM = 15, // texture alpha - D3DTOP_BLENDCURRENTALPHA = 16, // by alpha of current color - - // Specular mapping - D3DTOP_PREMODULATE = 17, // modulate with next texture before use - D3DTOP_MODULATEALPHA_ADDCOLOR = 18, // Arg1.RGB + Arg1.A*Arg2.RGB - // COLOROP only - D3DTOP_MODULATECOLOR_ADDALPHA = 19, // Arg1.RGB*Arg2.RGB + Arg1.A - // COLOROP only - D3DTOP_MODULATEINVALPHA_ADDCOLOR = 20, // (1-Arg1.A)*Arg2.RGB + Arg1.RGB - // COLOROP only - D3DTOP_MODULATEINVCOLOR_ADDALPHA = 21, // (1-Arg1.RGB)*Arg2.RGB + Arg1.A - // COLOROP only - - // Bump mapping - D3DTOP_BUMPENVMAP = 22, // per pixel env map perturbation - D3DTOP_BUMPENVMAPLUMINANCE = 23, // with luminance channel - - // This can do either diffuse or specular bump mapping with correct input. - // Performs the function (Arg1.R*Arg2.R + Arg1.G*Arg2.G + Arg1.B*Arg2.B) - // where each component has been scaled and offset to make it signed. - // The result is replicated into all four (including alpha) channels. - // This is a valid COLOROP only. - D3DTOP_DOTPRODUCT3 = 24, - - // Triadic ops - D3DTOP_MULTIPLYADD = 25, // Arg0 + Arg1*Arg2 - D3DTOP_LERP = 26, // (Arg0)*Arg1 + (1-Arg0)*Arg2 - - D3DTOP_FORCE_DWORD = 0x7fffffff, -} D3DTEXTUREOP; - -/* - * Values for COLORARG0,1,2, ALPHAARG0,1,2, and RESULTARG texture blending - * operations set in texture processing stage controls in D3DRENDERSTATE. - */ -#define D3DTA_SELECTMASK 0x0000000f // mask for arg selector -#define D3DTA_DIFFUSE 0x00000000 // select diffuse color (read only) -#define D3DTA_CURRENT 0x00000001 // select stage destination register (read/write) -#define D3DTA_TEXTURE 0x00000002 // select texture color (read only) -#define D3DTA_TFACTOR 0x00000003 // select D3DRS_TEXTUREFACTOR (read only) -#define D3DTA_SPECULAR 0x00000004 // select specular color (read only) -#define D3DTA_TEMP 0x00000005 // select temporary register color (read/write) -#define D3DTA_COMPLEMENT 0x00000010 // take 1.0 - x (read modifier) -#define D3DTA_ALPHAREPLICATE 0x00000020 // replicate alpha to color components (read modifier) - -// -// Values for D3DTSS_***FILTER texture stage states -// -typedef enum _D3DTEXTUREFILTERTYPE -{ - D3DTEXF_NONE = 0, // filtering disabled (valid for mip filter only) - D3DTEXF_POINT = 1, // nearest - D3DTEXF_LINEAR = 2, // linear interpolation - D3DTEXF_ANISOTROPIC = 3, // anisotropic - D3DTEXF_FLATCUBIC = 4, // cubic - D3DTEXF_GAUSSIANCUBIC = 5, // different cubic kernel - D3DTEXF_FORCE_DWORD = 0x7fffffff, // force 32-bit size enum -} D3DTEXTUREFILTERTYPE; - -/* Bits for Flags in ProcessVertices call */ - -#define D3DPV_DONOTCOPYDATA (1 << 0) - -//------------------------------------------------------------------- - -// Flexible vertex format bits -// -#define D3DFVF_RESERVED0 0x001 -#define D3DFVF_POSITION_MASK 0x00E -#define D3DFVF_XYZ 0x002 -#define D3DFVF_XYZRHW 0x004 -#define D3DFVF_XYZB1 0x006 -#define D3DFVF_XYZB2 0x008 -#define D3DFVF_XYZB3 0x00a -#define D3DFVF_XYZB4 0x00c -#define D3DFVF_XYZB5 0x00e - -#define D3DFVF_NORMAL 0x010 -#define D3DFVF_PSIZE 0x020 -#define D3DFVF_DIFFUSE 0x040 -#define D3DFVF_SPECULAR 0x080 - -#define D3DFVF_TEXCOUNT_MASK 0xf00 -#define D3DFVF_TEXCOUNT_SHIFT 8 -#define D3DFVF_TEX0 0x000 -#define D3DFVF_TEX1 0x100 -#define D3DFVF_TEX2 0x200 -#define D3DFVF_TEX3 0x300 -#define D3DFVF_TEX4 0x400 -#define D3DFVF_TEX5 0x500 -#define D3DFVF_TEX6 0x600 -#define D3DFVF_TEX7 0x700 -#define D3DFVF_TEX8 0x800 - -#define D3DFVF_LASTBETA_UBYTE4 0x1000 - -#define D3DFVF_RESERVED2 0xE000 // 4 reserved bits - -//--------------------------------------------------------------------- -// Vertex Shaders -// - -/* - -Vertex Shader Declaration - -The declaration portion of a vertex shader defines the static external -interface of the shader. The information in the declaration includes: - -- Assignments of vertex shader input registers to data streams. These -assignments bind a specific vertex register to a single component within a -vertex stream. A vertex stream element is identified by a byte offset -within the stream and a type. The type specifies the arithmetic data type -plus the dimensionality (1, 2, 3, or 4 values). Stream data which is -less than 4 values are always expanded out to 4 values with zero or more -0.F values and one 1.F value. - -- Assignment of vertex shader input registers to implicit data from the -primitive tessellator. This controls the loading of vertex data which is -not loaded from a stream, but rather is generated during primitive -tessellation prior to the vertex shader. - -- Loading data into the constant memory at the time a shader is set as the -current shader. Each token specifies values for one or more contiguous 4 -DWORD constant registers. This allows the shader to update an arbitrary -subset of the constant memory, overwriting the device state (which -contains the current values of the constant memory). Note that these -values can be subsequently overwritten (between DrawPrimitive calls) -during the time a shader is bound to a device via the -SetVertexShaderConstant method. - - -Declaration arrays are single-dimensional arrays of DWORDs composed of -multiple tokens each of which is one or more DWORDs. The single-DWORD -token value 0xFFFFFFFF is a special token used to indicate the end of the -declaration array. The single DWORD token value 0x00000000 is a NOP token -with is ignored during the declaration parsing. Note that 0x00000000 is a -valid value for DWORDs following the first DWORD for multiple word tokens. - -[31:29] TokenType - 0x0 - NOP (requires all DWORD bits to be zero) - 0x1 - stream selector - 0x2 - stream data definition (map to vertex input memory) - 0x3 - vertex input memory from tessellator - 0x4 - constant memory from shader - 0x5 - extension - 0x6 - reserved - 0x7 - end-of-array (requires all DWORD bits to be 1) - -NOP Token (single DWORD token) - [31:29] 0x0 - [28:00] 0x0 - -Stream Selector (single DWORD token) - [31:29] 0x1 - [28] indicates whether this is a tessellator stream - [27:04] 0x0 - [03:00] stream selector (0..15) - -Stream Data Definition (single DWORD token) - Vertex Input Register Load - [31:29] 0x2 - [28] 0x0 - [27:20] 0x0 - [19:16] type (dimensionality and data type) - [15:04] 0x0 - [03:00] vertex register address (0..15) - Data Skip (no register load) - [31:29] 0x2 - [28] 0x1 - [27:20] 0x0 - [19:16] count of DWORDS to skip over (0..15) - [15:00] 0x0 - Vertex Input Memory from Tessellator Data (single DWORD token) - [31:29] 0x3 - [28] indicates whether data is normals or u/v - [27:24] 0x0 - [23:20] vertex register address (0..15) - [19:16] type (dimensionality) - [15:04] 0x0 - [03:00] vertex register address (0..15) - -Constant Memory from Shader (multiple DWORD token) - [31:29] 0x4 - [28:25] count of 4*DWORD constants to load (0..15) - [24:07] 0x0 - [06:00] constant memory address (0..95) - -Extension Token (single or multiple DWORD token) - [31:29] 0x5 - [28:24] count of additional DWORDs in token (0..31) - [23:00] extension-specific information - -End-of-array token (single DWORD token) - [31:29] 0x7 - [28:00] 0x1fffffff - -The stream selector token must be immediately followed by a contiguous set of stream data definition tokens. This token sequence fully defines that stream, including the set of elements within the stream, the order in which the elements appear, the type of each element, and the vertex register into which to load an element. -Streams are allowed to include data which is not loaded into a vertex register, thus allowing data which is not used for this shader to exist in the vertex stream. This skipped data is defined only by a count of DWORDs to skip over, since the type information is irrelevant. -The token sequence: -Stream Select: stream=0 -Stream Data Definition (Load): type=FLOAT3; register=3 -Stream Data Definition (Load): type=FLOAT3; register=4 -Stream Data Definition (Skip): count=2 -Stream Data Definition (Load): type=FLOAT2; register=7 - -defines stream zero to consist of 4 elements, 3 of which are loaded into registers and the fourth skipped over. Register 3 is loaded with the first three DWORDs in each vertex interpreted as FLOAT data. Register 4 is loaded with the 4th, 5th, and 6th DWORDs interpreted as FLOAT data. The next two DWORDs (7th and 8th) are skipped over and not loaded into any vertex input register. Register 7 is loaded with the 9th and 10th DWORDS interpreted as FLOAT data. -Placing of tokens other than NOPs between the Stream Selector and Stream Data Definition tokens is disallowed. - -*/ - -typedef enum _D3DVSD_TOKENTYPE -{ - D3DVSD_TOKEN_NOP = 0, // NOP or extension - D3DVSD_TOKEN_STREAM, // stream selector - D3DVSD_TOKEN_STREAMDATA, // stream data definition (map to vertex input memory) - D3DVSD_TOKEN_TESSELLATOR, // vertex input memory from tessellator - D3DVSD_TOKEN_CONSTMEM, // constant memory from shader - D3DVSD_TOKEN_EXT, // extension - D3DVSD_TOKEN_END = 7, // end-of-array (requires all DWORD bits to be 1) - D3DVSD_FORCE_DWORD = 0x7fffffff,// force 32-bit size enum -} D3DVSD_TOKENTYPE; - -#define D3DVSD_TOKENTYPESHIFT 29 -#define D3DVSD_TOKENTYPEMASK (7 << D3DVSD_TOKENTYPESHIFT) - -#define D3DVSD_STREAMNUMBERSHIFT 0 -#define D3DVSD_STREAMNUMBERMASK (0xF << D3DVSD_STREAMNUMBERSHIFT) - -#define D3DVSD_DATALOADTYPESHIFT 28 -#define D3DVSD_DATALOADTYPEMASK (0x1 << D3DVSD_DATALOADTYPESHIFT) - -#define D3DVSD_DATATYPESHIFT 16 -#define D3DVSD_DATATYPEMASK (0xF << D3DVSD_DATATYPESHIFT) - -#define D3DVSD_SKIPCOUNTSHIFT 16 -#define D3DVSD_SKIPCOUNTMASK (0xF << D3DVSD_SKIPCOUNTSHIFT) - -#define D3DVSD_VERTEXREGSHIFT 0 -#define D3DVSD_VERTEXREGMASK (0x1F << D3DVSD_VERTEXREGSHIFT) - -#define D3DVSD_VERTEXREGINSHIFT 20 -#define D3DVSD_VERTEXREGINMASK (0xF << D3DVSD_VERTEXREGINSHIFT) - -#define D3DVSD_CONSTCOUNTSHIFT 25 -#define D3DVSD_CONSTCOUNTMASK (0xF << D3DVSD_CONSTCOUNTSHIFT) - -#define D3DVSD_CONSTADDRESSSHIFT 0 -#define D3DVSD_CONSTADDRESSMASK (0x7F << D3DVSD_CONSTADDRESSSHIFT) - -#define D3DVSD_CONSTRSSHIFT 16 -#define D3DVSD_CONSTRSMASK (0x1FFF << D3DVSD_CONSTRSSHIFT) - -#define D3DVSD_EXTCOUNTSHIFT 24 -#define D3DVSD_EXTCOUNTMASK (0x1F << D3DVSD_EXTCOUNTSHIFT) - -#define D3DVSD_EXTINFOSHIFT 0 -#define D3DVSD_EXTINFOMASK (0xFFFFFF << D3DVSD_EXTINFOSHIFT) - -#define D3DVSD_MAKETOKENTYPE(tokenType) ((tokenType << D3DVSD_TOKENTYPESHIFT) & D3DVSD_TOKENTYPEMASK) - -// macros for generation of CreateVertexShader Declaration token array - -// Set current stream -// _StreamNumber [0..(MaxStreams-1)] stream to get data from -// -#define D3DVSD_STREAM( _StreamNumber ) \ - (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_STREAM) | (_StreamNumber)) - -// Set tessellator stream -// -#define D3DVSD_STREAMTESSSHIFT 28 -#define D3DVSD_STREAMTESSMASK (1 << D3DVSD_STREAMTESSSHIFT) -#define D3DVSD_STREAM_TESS( ) \ - (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_STREAM) | (D3DVSD_STREAMTESSMASK)) - -// bind single vertex register to vertex element from vertex stream -// -// _VertexRegister [0..15] address of the vertex register -// _Type [D3DVSDT_*] dimensionality and arithmetic data type - -#define D3DVSD_REG( _VertexRegister, _Type ) \ - (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_STREAMDATA) | \ - ((_Type) << D3DVSD_DATATYPESHIFT) | (_VertexRegister)) - -// Skip _DWORDCount DWORDs in vertex -// -#define D3DVSD_SKIP( _DWORDCount ) \ - (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_STREAMDATA) | 0x10000000 | \ - ((_DWORDCount) << D3DVSD_SKIPCOUNTSHIFT)) - -// load data into vertex shader constant memory -// -// _ConstantAddress [0..95] - address of constant array to begin filling data -// _Count [0..15] - number of constant vectors to load (4 DWORDs each) -// followed by 4*_Count DWORDS of data -// -#define D3DVSD_CONST( _ConstantAddress, _Count ) \ - (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_CONSTMEM) | \ - ((_Count) << D3DVSD_CONSTCOUNTSHIFT) | (_ConstantAddress)) - -// enable tessellator generated normals -// -// _VertexRegisterIn [0..15] address of vertex register whose input stream -// will be used in normal computation -// _VertexRegisterOut [0..15] address of vertex register to output the normal to -// -#define D3DVSD_TESSNORMAL( _VertexRegisterIn, _VertexRegisterOut ) \ - (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_TESSELLATOR) | \ - ((_VertexRegisterIn) << D3DVSD_VERTEXREGINSHIFT) | \ - ((0x02) << D3DVSD_DATATYPESHIFT) | (_VertexRegisterOut)) - -// enable tessellator generated surface parameters -// -// _VertexRegister [0..15] address of vertex register to output parameters -// -#define D3DVSD_TESSUV( _VertexRegister ) \ - (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_TESSELLATOR) | 0x10000000 | \ - ((0x01) << D3DVSD_DATATYPESHIFT) | (_VertexRegister)) - -// Generates END token -// -#define D3DVSD_END() 0xFFFFFFFF - -// Generates NOP token -#define D3DVSD_NOP() 0x00000000 - -// bit declarations for _Type fields -#define D3DVSDT_FLOAT1 0x00 // 1D float expanded to (value, 0., 0., 1.) -#define D3DVSDT_FLOAT2 0x01 // 2D float expanded to (value, value, 0., 1.) -#define D3DVSDT_FLOAT3 0x02 // 3D float expanded to (value, value, value, 1.) -#define D3DVSDT_FLOAT4 0x03 // 4D float -#define D3DVSDT_D3DCOLOR 0x04 // 4D packed unsigned bytes mapped to 0. to 1. range - // Input is in D3DCOLOR format (ARGB) expanded to (R, G, B, A) -#define D3DVSDT_UBYTE4 0x05 // 4D unsigned byte -#define D3DVSDT_SHORT2 0x06 // 2D signed short expanded to (value, value, 0., 1.) -#define D3DVSDT_SHORT4 0x07 // 4D signed short - -// assignments of vertex input registers for fixed function vertex shader -// -#define D3DVSDE_POSITION 0 -#define D3DVSDE_BLENDWEIGHT 1 -#define D3DVSDE_BLENDINDICES 2 -#define D3DVSDE_NORMAL 3 -#define D3DVSDE_PSIZE 4 -#define D3DVSDE_DIFFUSE 5 -#define D3DVSDE_SPECULAR 6 -#define D3DVSDE_TEXCOORD0 7 -#define D3DVSDE_TEXCOORD1 8 -#define D3DVSDE_TEXCOORD2 9 -#define D3DVSDE_TEXCOORD3 10 -#define D3DVSDE_TEXCOORD4 11 -#define D3DVSDE_TEXCOORD5 12 -#define D3DVSDE_TEXCOORD6 13 -#define D3DVSDE_TEXCOORD7 14 -#define D3DVSDE_POSITION2 15 -#define D3DVSDE_NORMAL2 16 - -// Maximum supported number of texture coordinate sets -#define D3DDP_MAXTEXCOORD 8 - - -// -// Instruction Token Bit Definitions -// -#define D3DSI_OPCODE_MASK 0x0000FFFF - -typedef enum _D3DSHADER_INSTRUCTION_OPCODE_TYPE -{ - D3DSIO_NOP = 0, // PS/VS - D3DSIO_MOV , // PS/VS - D3DSIO_ADD , // PS/VS - D3DSIO_SUB , // PS - D3DSIO_MAD , // PS/VS - D3DSIO_MUL , // PS/VS - D3DSIO_RCP , // VS - D3DSIO_RSQ , // VS - D3DSIO_DP3 , // PS/VS - D3DSIO_DP4 , // PS/VS - D3DSIO_MIN , // VS - D3DSIO_MAX , // VS - D3DSIO_SLT , // VS - D3DSIO_SGE , // VS - D3DSIO_EXP , // VS - D3DSIO_LOG , // VS - D3DSIO_LIT , // VS - D3DSIO_DST , // VS - D3DSIO_LRP , // PS - D3DSIO_FRC , // VS - D3DSIO_M4x4 , // VS - D3DSIO_M4x3 , // VS - D3DSIO_M3x4 , // VS - D3DSIO_M3x3 , // VS - D3DSIO_M3x2 , // VS - - D3DSIO_TEXCOORD = 64, // PS - D3DSIO_TEXKILL , // PS - D3DSIO_TEX , // PS - D3DSIO_TEXBEM , // PS - D3DSIO_TEXBEML , // PS - D3DSIO_TEXREG2AR , // PS - D3DSIO_TEXREG2GB , // PS - D3DSIO_TEXM3x2PAD , // PS - D3DSIO_TEXM3x2TEX , // PS - D3DSIO_TEXM3x3PAD , // PS - D3DSIO_TEXM3x3TEX , // PS - D3DSIO_TEXM3x3DIFF , // PS - D3DSIO_TEXM3x3SPEC , // PS - D3DSIO_TEXM3x3VSPEC , // PS - D3DSIO_EXPP , // VS - D3DSIO_LOGP , // VS - D3DSIO_CND , // PS - D3DSIO_DEF , // PS - D3DSIO_TEXREG2RGB , // PS - D3DSIO_TEXDP3TEX , // PS - D3DSIO_TEXM3x2DEPTH , // PS - D3DSIO_TEXDP3 , // PS - D3DSIO_TEXM3x3 , // PS - D3DSIO_TEXDEPTH , // PS - D3DSIO_CMP , // PS - D3DSIO_BEM , // PS - - D3DSIO_PHASE = 0xFFFD, - D3DSIO_COMMENT = 0xFFFE, - D3DSIO_END = 0xFFFF, - - D3DSIO_FORCE_DWORD = 0x7fffffff, // force 32-bit size enum -} D3DSHADER_INSTRUCTION_OPCODE_TYPE; - -// -// Co-Issue Instruction Modifier - if set then this instruction is to be -// issued in parallel with the previous instruction(s) for which this bit -// is not set. -// -#define D3DSI_COISSUE 0x40000000 - -// -// Parameter Token Bit Definitions -// -#define D3DSP_REGNUM_MASK 0x00001FFF - -// destination parameter write mask -#define D3DSP_WRITEMASK_0 0x00010000 // Component 0 (X;Red) -#define D3DSP_WRITEMASK_1 0x00020000 // Component 1 (Y;Green) -#define D3DSP_WRITEMASK_2 0x00040000 // Component 2 (Z;Blue) -#define D3DSP_WRITEMASK_3 0x00080000 // Component 3 (W;Alpha) -#define D3DSP_WRITEMASK_ALL 0x000F0000 // All Components - -// destination parameter modifiers -#define D3DSP_DSTMOD_SHIFT 20 -#define D3DSP_DSTMOD_MASK 0x00F00000 - -typedef enum _D3DSHADER_PARAM_DSTMOD_TYPE -{ - D3DSPDM_NONE = 0<>8)&0xFF) -#define D3DSHADER_VERSION_MINOR(_Version) (((_Version)>>0)&0xFF) - -// destination/source parameter register type -#define D3DSI_COMMENTSIZE_SHIFT 16 -#define D3DSI_COMMENTSIZE_MASK 0x7FFF0000 -#define D3DSHADER_COMMENT(_DWordSize) \ - ((((_DWordSize)<= 0x0800) */ -#endif /* _D3D8TYPES(P)_H_ */ - diff --git a/import/DirectX8/include/d3dcaps.h b/import/DirectX8/include/d3dcaps.h deleted file mode 100644 index c033c2d86..000000000 --- a/import/DirectX8/include/d3dcaps.h +++ /dev/null @@ -1,599 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) Microsoft Corporation. All Rights Reserved. - * - * File: d3dcaps.h - * Content: Direct3D capabilities include file - * - ***************************************************************************/ - -#ifndef _D3DCAPS_H -#define _D3DCAPS_H - -/* - * Pull in DirectDraw include file automatically: - */ -#include "ddraw.h" - -#ifndef DIRECT3D_VERSION -#define DIRECT3D_VERSION 0x0700 -#endif - -#pragma pack(4) - -/* Description of capabilities of transform */ - -typedef struct _D3DTRANSFORMCAPS { - DWORD dwSize; - DWORD dwCaps; -} D3DTRANSFORMCAPS, *LPD3DTRANSFORMCAPS; - -#define D3DTRANSFORMCAPS_CLIP 0x00000001L /* Will clip whilst transforming */ - -/* Description of capabilities of lighting */ - -typedef struct _D3DLIGHTINGCAPS { - DWORD dwSize; - DWORD dwCaps; /* Lighting caps */ - DWORD dwLightingModel; /* Lighting model - RGB or mono */ - DWORD dwNumLights; /* Number of lights that can be handled */ -} D3DLIGHTINGCAPS, *LPD3DLIGHTINGCAPS; - -#define D3DLIGHTINGMODEL_RGB 0x00000001L -#define D3DLIGHTINGMODEL_MONO 0x00000002L - -#define D3DLIGHTCAPS_POINT 0x00000001L /* Point lights supported */ -#define D3DLIGHTCAPS_SPOT 0x00000002L /* Spot lights supported */ -#define D3DLIGHTCAPS_DIRECTIONAL 0x00000004L /* Directional lights supported */ -#if(DIRECT3D_VERSION < 0x700) -#define D3DLIGHTCAPS_PARALLELPOINT 0x00000008L /* Parallel point lights supported */ -#endif -#if(DIRECT3D_VERSION < 0x500) -#define D3DLIGHTCAPS_GLSPOT 0x00000010L /* GL syle spot lights supported */ -#endif - -/* Description of capabilities for each primitive type */ - -typedef struct _D3DPrimCaps { - DWORD dwSize; - DWORD dwMiscCaps; /* Capability flags */ - DWORD dwRasterCaps; - DWORD dwZCmpCaps; - DWORD dwSrcBlendCaps; - DWORD dwDestBlendCaps; - DWORD dwAlphaCmpCaps; - DWORD dwShadeCaps; - DWORD dwTextureCaps; - DWORD dwTextureFilterCaps; - DWORD dwTextureBlendCaps; - DWORD dwTextureAddressCaps; - DWORD dwStippleWidth; /* maximum width and height of */ - DWORD dwStippleHeight; /* of supported stipple (up to 32x32) */ -} D3DPRIMCAPS, *LPD3DPRIMCAPS; - -/* D3DPRIMCAPS dwMiscCaps */ - -#define D3DPMISCCAPS_MASKPLANES 0x00000001L -#define D3DPMISCCAPS_MASKZ 0x00000002L -#define D3DPMISCCAPS_LINEPATTERNREP 0x00000004L -#define D3DPMISCCAPS_CONFORMANT 0x00000008L -#define D3DPMISCCAPS_CULLNONE 0x00000010L -#define D3DPMISCCAPS_CULLCW 0x00000020L -#define D3DPMISCCAPS_CULLCCW 0x00000040L - -/* D3DPRIMCAPS dwRasterCaps */ - -#define D3DPRASTERCAPS_DITHER 0x00000001L -#define D3DPRASTERCAPS_ROP2 0x00000002L -#define D3DPRASTERCAPS_XOR 0x00000004L -#define D3DPRASTERCAPS_PAT 0x00000008L -#define D3DPRASTERCAPS_ZTEST 0x00000010L -#define D3DPRASTERCAPS_SUBPIXEL 0x00000020L -#define D3DPRASTERCAPS_SUBPIXELX 0x00000040L -#define D3DPRASTERCAPS_FOGVERTEX 0x00000080L -#define D3DPRASTERCAPS_FOGTABLE 0x00000100L -#define D3DPRASTERCAPS_STIPPLE 0x00000200L -#if(DIRECT3D_VERSION >= 0x0500) -#define D3DPRASTERCAPS_ANTIALIASSORTDEPENDENT 0x00000400L -#define D3DPRASTERCAPS_ANTIALIASSORTINDEPENDENT 0x00000800L -#define D3DPRASTERCAPS_ANTIALIASEDGES 0x00001000L -#define D3DPRASTERCAPS_MIPMAPLODBIAS 0x00002000L -#define D3DPRASTERCAPS_ZBIAS 0x00004000L -#define D3DPRASTERCAPS_ZBUFFERLESSHSR 0x00008000L -#define D3DPRASTERCAPS_FOGRANGE 0x00010000L -#define D3DPRASTERCAPS_ANISOTROPY 0x00020000L -#endif /* DIRECT3D_VERSION >= 0x0500 */ -#if(DIRECT3D_VERSION >= 0x0600) -#define D3DPRASTERCAPS_WBUFFER 0x00040000L -#define D3DPRASTERCAPS_TRANSLUCENTSORTINDEPENDENT 0x00080000L -#define D3DPRASTERCAPS_WFOG 0x00100000L -#define D3DPRASTERCAPS_ZFOG 0x00200000L -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -/* D3DPRIMCAPS dwZCmpCaps, dwAlphaCmpCaps */ - -#define D3DPCMPCAPS_NEVER 0x00000001L -#define D3DPCMPCAPS_LESS 0x00000002L -#define D3DPCMPCAPS_EQUAL 0x00000004L -#define D3DPCMPCAPS_LESSEQUAL 0x00000008L -#define D3DPCMPCAPS_GREATER 0x00000010L -#define D3DPCMPCAPS_NOTEQUAL 0x00000020L -#define D3DPCMPCAPS_GREATEREQUAL 0x00000040L -#define D3DPCMPCAPS_ALWAYS 0x00000080L - -/* D3DPRIMCAPS dwSourceBlendCaps, dwDestBlendCaps */ - -#define D3DPBLENDCAPS_ZERO 0x00000001L -#define D3DPBLENDCAPS_ONE 0x00000002L -#define D3DPBLENDCAPS_SRCCOLOR 0x00000004L -#define D3DPBLENDCAPS_INVSRCCOLOR 0x00000008L -#define D3DPBLENDCAPS_SRCALPHA 0x00000010L -#define D3DPBLENDCAPS_INVSRCALPHA 0x00000020L -#define D3DPBLENDCAPS_DESTALPHA 0x00000040L -#define D3DPBLENDCAPS_INVDESTALPHA 0x00000080L -#define D3DPBLENDCAPS_DESTCOLOR 0x00000100L -#define D3DPBLENDCAPS_INVDESTCOLOR 0x00000200L -#define D3DPBLENDCAPS_SRCALPHASAT 0x00000400L -#define D3DPBLENDCAPS_BOTHSRCALPHA 0x00000800L -#define D3DPBLENDCAPS_BOTHINVSRCALPHA 0x00001000L - -/* D3DPRIMCAPS dwShadeCaps */ - -#define D3DPSHADECAPS_COLORFLATMONO 0x00000001L -#define D3DPSHADECAPS_COLORFLATRGB 0x00000002L -#define D3DPSHADECAPS_COLORGOURAUDMONO 0x00000004L -#define D3DPSHADECAPS_COLORGOURAUDRGB 0x00000008L -#define D3DPSHADECAPS_COLORPHONGMONO 0x00000010L -#define D3DPSHADECAPS_COLORPHONGRGB 0x00000020L - -#define D3DPSHADECAPS_SPECULARFLATMONO 0x00000040L -#define D3DPSHADECAPS_SPECULARFLATRGB 0x00000080L -#define D3DPSHADECAPS_SPECULARGOURAUDMONO 0x00000100L -#define D3DPSHADECAPS_SPECULARGOURAUDRGB 0x00000200L -#define D3DPSHADECAPS_SPECULARPHONGMONO 0x00000400L -#define D3DPSHADECAPS_SPECULARPHONGRGB 0x00000800L - -#define D3DPSHADECAPS_ALPHAFLATBLEND 0x00001000L -#define D3DPSHADECAPS_ALPHAFLATSTIPPLED 0x00002000L -#define D3DPSHADECAPS_ALPHAGOURAUDBLEND 0x00004000L -#define D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED 0x00008000L -#define D3DPSHADECAPS_ALPHAPHONGBLEND 0x00010000L -#define D3DPSHADECAPS_ALPHAPHONGSTIPPLED 0x00020000L - -#define D3DPSHADECAPS_FOGFLAT 0x00040000L -#define D3DPSHADECAPS_FOGGOURAUD 0x00080000L -#define D3DPSHADECAPS_FOGPHONG 0x00100000L - -/* D3DPRIMCAPS dwTextureCaps */ - -/* - * Perspective-correct texturing is supported - */ -#define D3DPTEXTURECAPS_PERSPECTIVE 0x00000001L - -/* - * Power-of-2 texture dimensions are required - */ -#define D3DPTEXTURECAPS_POW2 0x00000002L - -/* - * Alpha in texture pixels is supported - */ -#define D3DPTEXTURECAPS_ALPHA 0x00000004L - -/* - * Color-keyed textures are supported - */ -#define D3DPTEXTURECAPS_TRANSPARENCY 0x00000008L - -/* - * obsolete, see D3DPTADDRESSCAPS_BORDER - */ -#define D3DPTEXTURECAPS_BORDER 0x00000010L - -/* - * Only square textures are supported - */ -#define D3DPTEXTURECAPS_SQUAREONLY 0x00000020L - -#if(DIRECT3D_VERSION >= 0x0600) -/* - * Texture indices are not scaled by the texture size prior - * to interpolation. - */ -#define D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE 0x00000040L - -/* - * Device can draw alpha from texture palettes - */ -#define D3DPTEXTURECAPS_ALPHAPALETTE 0x00000080L - -/* - * Device can use non-POW2 textures if: - * 1) D3DTEXTURE_ADDRESS is set to CLAMP for this texture's stage - * 2) D3DRS_WRAP(N) is zero for this texture's coordinates - * 3) mip mapping is not enabled (use magnification filter only) - */ -#define D3DPTEXTURECAPS_NONPOW2CONDITIONAL 0x00000100L - -#endif /* DIRECT3D_VERSION >= 0x0600 */ -#if(DIRECT3D_VERSION >= 0x0700) - -// 0x00000200L unused - -/* - * Device can divide transformed texture coordinates by the - * COUNTth texture coordinate (can do D3DTTFF_PROJECTED) - */ -#define D3DPTEXTURECAPS_PROJECTED 0x00000400L - -/* - * Device can do cubemap textures - */ -#define D3DPTEXTURECAPS_CUBEMAP 0x00000800L - -#define D3DPTEXTURECAPS_COLORKEYBLEND 0x00001000L -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -/* D3DPRIMCAPS dwTextureFilterCaps */ - -#define D3DPTFILTERCAPS_NEAREST 0x00000001L -#define D3DPTFILTERCAPS_LINEAR 0x00000002L -#define D3DPTFILTERCAPS_MIPNEAREST 0x00000004L -#define D3DPTFILTERCAPS_MIPLINEAR 0x00000008L -#define D3DPTFILTERCAPS_LINEARMIPNEAREST 0x00000010L -#define D3DPTFILTERCAPS_LINEARMIPLINEAR 0x00000020L - -#if(DIRECT3D_VERSION >= 0x0600) -/* Device3 Min Filter */ -#define D3DPTFILTERCAPS_MINFPOINT 0x00000100L -#define D3DPTFILTERCAPS_MINFLINEAR 0x00000200L -#define D3DPTFILTERCAPS_MINFANISOTROPIC 0x00000400L - -/* Device3 Mip Filter */ -#define D3DPTFILTERCAPS_MIPFPOINT 0x00010000L -#define D3DPTFILTERCAPS_MIPFLINEAR 0x00020000L - -/* Device3 Mag Filter */ -#define D3DPTFILTERCAPS_MAGFPOINT 0x01000000L -#define D3DPTFILTERCAPS_MAGFLINEAR 0x02000000L -#define D3DPTFILTERCAPS_MAGFANISOTROPIC 0x04000000L -#define D3DPTFILTERCAPS_MAGFAFLATCUBIC 0x08000000L -#define D3DPTFILTERCAPS_MAGFGAUSSIANCUBIC 0x10000000L -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -/* D3DPRIMCAPS dwTextureBlendCaps */ - -#define D3DPTBLENDCAPS_DECAL 0x00000001L -#define D3DPTBLENDCAPS_MODULATE 0x00000002L -#define D3DPTBLENDCAPS_DECALALPHA 0x00000004L -#define D3DPTBLENDCAPS_MODULATEALPHA 0x00000008L -#define D3DPTBLENDCAPS_DECALMASK 0x00000010L -#define D3DPTBLENDCAPS_MODULATEMASK 0x00000020L -#define D3DPTBLENDCAPS_COPY 0x00000040L -#if(DIRECT3D_VERSION >= 0x0500) -#define D3DPTBLENDCAPS_ADD 0x00000080L -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -/* D3DPRIMCAPS dwTextureAddressCaps */ -#define D3DPTADDRESSCAPS_WRAP 0x00000001L -#define D3DPTADDRESSCAPS_MIRROR 0x00000002L -#define D3DPTADDRESSCAPS_CLAMP 0x00000004L -#if(DIRECT3D_VERSION >= 0x0500) -#define D3DPTADDRESSCAPS_BORDER 0x00000008L -#define D3DPTADDRESSCAPS_INDEPENDENTUV 0x00000010L -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#if(DIRECT3D_VERSION >= 0x0600) - -/* D3DDEVICEDESC dwStencilCaps */ - -#define D3DSTENCILCAPS_KEEP 0x00000001L -#define D3DSTENCILCAPS_ZERO 0x00000002L -#define D3DSTENCILCAPS_REPLACE 0x00000004L -#define D3DSTENCILCAPS_INCRSAT 0x00000008L -#define D3DSTENCILCAPS_DECRSAT 0x00000010L -#define D3DSTENCILCAPS_INVERT 0x00000020L -#define D3DSTENCILCAPS_INCR 0x00000040L -#define D3DSTENCILCAPS_DECR 0x00000080L - -/* D3DDEVICEDESC dwTextureOpCaps */ - -#define D3DTEXOPCAPS_DISABLE 0x00000001L -#define D3DTEXOPCAPS_SELECTARG1 0x00000002L -#define D3DTEXOPCAPS_SELECTARG2 0x00000004L -#define D3DTEXOPCAPS_MODULATE 0x00000008L -#define D3DTEXOPCAPS_MODULATE2X 0x00000010L -#define D3DTEXOPCAPS_MODULATE4X 0x00000020L -#define D3DTEXOPCAPS_ADD 0x00000040L -#define D3DTEXOPCAPS_ADDSIGNED 0x00000080L -#define D3DTEXOPCAPS_ADDSIGNED2X 0x00000100L -#define D3DTEXOPCAPS_SUBTRACT 0x00000200L -#define D3DTEXOPCAPS_ADDSMOOTH 0x00000400L -#define D3DTEXOPCAPS_BLENDDIFFUSEALPHA 0x00000800L -#define D3DTEXOPCAPS_BLENDTEXTUREALPHA 0x00001000L -#define D3DTEXOPCAPS_BLENDFACTORALPHA 0x00002000L -#define D3DTEXOPCAPS_BLENDTEXTUREALPHAPM 0x00004000L -#define D3DTEXOPCAPS_BLENDCURRENTALPHA 0x00008000L -#define D3DTEXOPCAPS_PREMODULATE 0x00010000L -#define D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR 0x00020000L -#define D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA 0x00040000L -#define D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR 0x00080000L -#define D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA 0x00100000L -#define D3DTEXOPCAPS_BUMPENVMAP 0x00200000L -#define D3DTEXOPCAPS_BUMPENVMAPLUMINANCE 0x00400000L -#define D3DTEXOPCAPS_DOTPRODUCT3 0x00800000L - -/* D3DDEVICEDESC dwFVFCaps flags */ - -#define D3DFVFCAPS_TEXCOORDCOUNTMASK 0x0000ffffL /* mask for texture coordinate count field */ -#define D3DFVFCAPS_DONOTSTRIPELEMENTS 0x00080000L /* Device prefers that vertex elements not be stripped */ - -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -/* - * Description for a device. - * This is used to describe a device that is to be created or to query - * the current device. - */ -typedef struct _D3DDeviceDesc { - DWORD dwSize; /* Size of D3DDEVICEDESC structure */ - DWORD dwFlags; /* Indicates which fields have valid data */ - D3DCOLORMODEL dcmColorModel; /* Color model of device */ - DWORD dwDevCaps; /* Capabilities of device */ - D3DTRANSFORMCAPS dtcTransformCaps; /* Capabilities of transform */ - BOOL bClipping; /* Device can do 3D clipping */ - D3DLIGHTINGCAPS dlcLightingCaps; /* Capabilities of lighting */ - D3DPRIMCAPS dpcLineCaps; - D3DPRIMCAPS dpcTriCaps; - DWORD dwDeviceRenderBitDepth; /* One of DDBB_8, 16, etc.. */ - DWORD dwDeviceZBufferBitDepth;/* One of DDBD_16, 32, etc.. */ - DWORD dwMaxBufferSize; /* Maximum execute buffer size */ - DWORD dwMaxVertexCount; /* Maximum vertex count */ -#if(DIRECT3D_VERSION >= 0x0500) - // *** New fields for DX5 *** // - - // Width and height caps are 0 for legacy HALs. - DWORD dwMinTextureWidth, dwMinTextureHeight; - DWORD dwMaxTextureWidth, dwMaxTextureHeight; - DWORD dwMinStippleWidth, dwMaxStippleWidth; - DWORD dwMinStippleHeight, dwMaxStippleHeight; -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#if(DIRECT3D_VERSION >= 0x0600) - // New fields for DX6 - DWORD dwMaxTextureRepeat; - DWORD dwMaxTextureAspectRatio; - DWORD dwMaxAnisotropy; - - // Guard band that the rasterizer can accommodate - // Screen-space vertices inside this space but outside the viewport - // will get clipped properly. - D3DVALUE dvGuardBandLeft; - D3DVALUE dvGuardBandTop; - D3DVALUE dvGuardBandRight; - D3DVALUE dvGuardBandBottom; - - D3DVALUE dvExtentsAdjust; - DWORD dwStencilCaps; - - DWORD dwFVFCaps; - DWORD dwTextureOpCaps; - WORD wMaxTextureBlendStages; - WORD wMaxSimultaneousTextures; -#endif /* DIRECT3D_VERSION >= 0x0600 */ -} D3DDEVICEDESC, *LPD3DDEVICEDESC; - -#if(DIRECT3D_VERSION >= 0x0700) -typedef struct _D3DDeviceDesc7 { - DWORD dwDevCaps; /* Capabilities of device */ - D3DPRIMCAPS dpcLineCaps; - D3DPRIMCAPS dpcTriCaps; - DWORD dwDeviceRenderBitDepth; /* One of DDBB_8, 16, etc.. */ - DWORD dwDeviceZBufferBitDepth;/* One of DDBD_16, 32, etc.. */ - - DWORD dwMinTextureWidth, dwMinTextureHeight; - DWORD dwMaxTextureWidth, dwMaxTextureHeight; - - DWORD dwMaxTextureRepeat; - DWORD dwMaxTextureAspectRatio; - DWORD dwMaxAnisotropy; - - D3DVALUE dvGuardBandLeft; - D3DVALUE dvGuardBandTop; - D3DVALUE dvGuardBandRight; - D3DVALUE dvGuardBandBottom; - - D3DVALUE dvExtentsAdjust; - DWORD dwStencilCaps; - - DWORD dwFVFCaps; - DWORD dwTextureOpCaps; - WORD wMaxTextureBlendStages; - WORD wMaxSimultaneousTextures; - - DWORD dwMaxActiveLights; - D3DVALUE dvMaxVertexW; - GUID deviceGUID; - - WORD wMaxUserClipPlanes; - WORD wMaxVertexBlendMatrices; - - DWORD dwVertexProcessingCaps; - - DWORD dwReserved1; - DWORD dwReserved2; - DWORD dwReserved3; - DWORD dwReserved4; -} D3DDEVICEDESC7, *LPD3DDEVICEDESC7; -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -#define D3DDEVICEDESCSIZE (sizeof(D3DDEVICEDESC)) -#define D3DDEVICEDESC7SIZE (sizeof(D3DDEVICEDESC7)) - -typedef HRESULT (CALLBACK * LPD3DENUMDEVICESCALLBACK)(GUID FAR *lpGuid, LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC, LPD3DDEVICEDESC, LPVOID); - -#if(DIRECT3D_VERSION >= 0x0700) -typedef HRESULT (CALLBACK * LPD3DENUMDEVICESCALLBACK7)(LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC7, LPVOID); -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -/* D3DDEVICEDESC dwFlags indicating valid fields */ - -#define D3DDD_COLORMODEL 0x00000001L /* dcmColorModel is valid */ -#define D3DDD_DEVCAPS 0x00000002L /* dwDevCaps is valid */ -#define D3DDD_TRANSFORMCAPS 0x00000004L /* dtcTransformCaps is valid */ -#define D3DDD_LIGHTINGCAPS 0x00000008L /* dlcLightingCaps is valid */ -#define D3DDD_BCLIPPING 0x00000010L /* bClipping is valid */ -#define D3DDD_LINECAPS 0x00000020L /* dpcLineCaps is valid */ -#define D3DDD_TRICAPS 0x00000040L /* dpcTriCaps is valid */ -#define D3DDD_DEVICERENDERBITDEPTH 0x00000080L /* dwDeviceRenderBitDepth is valid */ -#define D3DDD_DEVICEZBUFFERBITDEPTH 0x00000100L /* dwDeviceZBufferBitDepth is valid */ -#define D3DDD_MAXBUFFERSIZE 0x00000200L /* dwMaxBufferSize is valid */ -#define D3DDD_MAXVERTEXCOUNT 0x00000400L /* dwMaxVertexCount is valid */ - -/* D3DDEVICEDESC dwDevCaps flags */ - -#define D3DDEVCAPS_FLOATTLVERTEX 0x00000001L /* Device accepts floating point */ - /* for post-transform vertex data */ -#define D3DDEVCAPS_SORTINCREASINGZ 0x00000002L /* Device needs data sorted for increasing Z */ -#define D3DDEVCAPS_SORTDECREASINGZ 0X00000004L /* Device needs data sorted for decreasing Z */ -#define D3DDEVCAPS_SORTEXACT 0x00000008L /* Device needs data sorted exactly */ - -#define D3DDEVCAPS_EXECUTESYSTEMMEMORY 0x00000010L /* Device can use execute buffers from system memory */ -#define D3DDEVCAPS_EXECUTEVIDEOMEMORY 0x00000020L /* Device can use execute buffers from video memory */ -#define D3DDEVCAPS_TLVERTEXSYSTEMMEMORY 0x00000040L /* Device can use TL buffers from system memory */ -#define D3DDEVCAPS_TLVERTEXVIDEOMEMORY 0x00000080L /* Device can use TL buffers from video memory */ -#define D3DDEVCAPS_TEXTURESYSTEMMEMORY 0x00000100L /* Device can texture from system memory */ -#define D3DDEVCAPS_TEXTUREVIDEOMEMORY 0x00000200L /* Device can texture from device memory */ -#if(DIRECT3D_VERSION >= 0x0500) -#define D3DDEVCAPS_DRAWPRIMTLVERTEX 0x00000400L /* Device can draw TLVERTEX primitives */ -#define D3DDEVCAPS_CANRENDERAFTERFLIP 0x00000800L /* Device can render without waiting for flip to complete */ -#define D3DDEVCAPS_TEXTURENONLOCALVIDMEM 0x00001000L /* Device can texture from nonlocal video memory */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ -#if(DIRECT3D_VERSION >= 0x0600) -#define D3DDEVCAPS_DRAWPRIMITIVES2 0x00002000L /* Device can support DrawPrimitives2 */ -#define D3DDEVCAPS_SEPARATETEXTUREMEMORIES 0x00004000L /* Device is texturing from separate memory pools */ -#define D3DDEVCAPS_DRAWPRIMITIVES2EX 0x00008000L /* Device can support Extended DrawPrimitives2 i.e. DX7 compliant driver*/ -#endif /* DIRECT3D_VERSION >= 0x0600 */ -#if(DIRECT3D_VERSION >= 0x0700) -#define D3DDEVCAPS_HWTRANSFORMANDLIGHT 0x00010000L /* Device can support transformation and lighting in hardware and DRAWPRIMITIVES2EX must be also */ -#define D3DDEVCAPS_CANBLTSYSTONONLOCAL 0x00020000L /* Device supports a Tex Blt from system memory to non-local vidmem */ -#define D3DDEVCAPS_HWRASTERIZATION 0x00080000L /* Device has HW acceleration for rasterization */ - -/* - * These are the flags in the D3DDEVICEDESC7.dwVertexProcessingCaps field - */ - -/* device can do texgen */ -#define D3DVTXPCAPS_TEXGEN 0x00000001L -/* device can do IDirect3DDevice7 colormaterialsource ops */ -#define D3DVTXPCAPS_MATERIALSOURCE7 0x00000002L -/* device can do vertex fog */ -#define D3DVTXPCAPS_VERTEXFOG 0x00000004L -/* device can do directional lights */ -#define D3DVTXPCAPS_DIRECTIONALLIGHTS 0x00000008L -/* device can do positional lights (includes point and spot) */ -#define D3DVTXPCAPS_POSITIONALLIGHTS 0x00000010L -/* device can do local viewer */ -#define D3DVTXPCAPS_LOCALVIEWER 0x00000020L - -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -#define D3DFDS_COLORMODEL 0x00000001L /* Match color model */ -#define D3DFDS_GUID 0x00000002L /* Match guid */ -#define D3DFDS_HARDWARE 0x00000004L /* Match hardware/software */ -#define D3DFDS_TRIANGLES 0x00000008L /* Match in triCaps */ -#define D3DFDS_LINES 0x00000010L /* Match in lineCaps */ -#define D3DFDS_MISCCAPS 0x00000020L /* Match primCaps.dwMiscCaps */ -#define D3DFDS_RASTERCAPS 0x00000040L /* Match primCaps.dwRasterCaps */ -#define D3DFDS_ZCMPCAPS 0x00000080L /* Match primCaps.dwZCmpCaps */ -#define D3DFDS_ALPHACMPCAPS 0x00000100L /* Match primCaps.dwAlphaCmpCaps */ -#define D3DFDS_SRCBLENDCAPS 0x00000200L /* Match primCaps.dwSourceBlendCaps */ -#define D3DFDS_DSTBLENDCAPS 0x00000400L /* Match primCaps.dwDestBlendCaps */ -#define D3DFDS_SHADECAPS 0x00000800L /* Match primCaps.dwShadeCaps */ -#define D3DFDS_TEXTURECAPS 0x00001000L /* Match primCaps.dwTextureCaps */ -#define D3DFDS_TEXTUREFILTERCAPS 0x00002000L /* Match primCaps.dwTextureFilterCaps */ -#define D3DFDS_TEXTUREBLENDCAPS 0x00004000L /* Match primCaps.dwTextureBlendCaps */ -#define D3DFDS_TEXTUREADDRESSCAPS 0x00008000L /* Match primCaps.dwTextureBlendCaps */ - -/* - * FindDevice arguments - */ -typedef struct _D3DFINDDEVICESEARCH { - DWORD dwSize; - DWORD dwFlags; - BOOL bHardware; - D3DCOLORMODEL dcmColorModel; - GUID guid; - DWORD dwCaps; - D3DPRIMCAPS dpcPrimCaps; -} D3DFINDDEVICESEARCH, *LPD3DFINDDEVICESEARCH; - -typedef struct _D3DFINDDEVICERESULT { - DWORD dwSize; - GUID guid; /* guid which matched */ - D3DDEVICEDESC ddHwDesc; /* hardware D3DDEVICEDESC */ - D3DDEVICEDESC ddSwDesc; /* software D3DDEVICEDESC */ -} D3DFINDDEVICERESULT, *LPD3DFINDDEVICERESULT; - -/* - * Description of execute buffer. - */ -typedef struct _D3DExecuteBufferDesc { - DWORD dwSize; /* size of this structure */ - DWORD dwFlags; /* flags indicating which fields are valid */ - DWORD dwCaps; /* capabilities of execute buffer */ - DWORD dwBufferSize; /* size of execute buffer data */ - LPVOID lpData; /* pointer to actual data */ -} D3DEXECUTEBUFFERDESC, *LPD3DEXECUTEBUFFERDESC; - -/* D3DEXECUTEBUFFER dwFlags indicating valid fields */ - -#define D3DDEB_BUFSIZE 0x00000001l /* buffer size valid */ -#define D3DDEB_CAPS 0x00000002l /* caps valid */ -#define D3DDEB_LPDATA 0x00000004l /* lpData valid */ - -/* D3DEXECUTEBUFFER dwCaps */ - -#define D3DDEBCAPS_SYSTEMMEMORY 0x00000001l /* buffer in system memory */ -#define D3DDEBCAPS_VIDEOMEMORY 0x00000002l /* buffer in device memory */ -#define D3DDEBCAPS_MEM (D3DDEBCAPS_SYSTEMMEMORY|D3DDEBCAPS_VIDEOMEMORY) - -#if(DIRECT3D_VERSION < 0x0800) - -#if(DIRECT3D_VERSION >= 0x0700) -typedef struct _D3DDEVINFO_TEXTUREMANAGER { - BOOL bThrashing; /* indicates if thrashing */ - DWORD dwApproxBytesDownloaded; /* Approximate number of bytes downloaded by texture manager */ - DWORD dwNumEvicts; /* number of textures evicted */ - DWORD dwNumVidCreates; /* number of textures created in video memory */ - DWORD dwNumTexturesUsed; /* number of textures used */ - DWORD dwNumUsedTexInVid; /* number of used textures present in video memory */ - DWORD dwWorkingSet; /* number of textures in video memory */ - DWORD dwWorkingSetBytes; /* number of bytes in video memory */ - DWORD dwTotalManaged; /* total number of managed textures */ - DWORD dwTotalBytes; /* total number of bytes of managed textures */ - DWORD dwLastPri; /* priority of last texture evicted */ -} D3DDEVINFO_TEXTUREMANAGER, *LPD3DDEVINFO_TEXTUREMANAGER; - -typedef struct _D3DDEVINFO_TEXTURING { - DWORD dwNumLoads; /* counts Load() API calls */ - DWORD dwApproxBytesLoaded; /* Approximate number bytes loaded via Load() */ - DWORD dwNumPreLoads; /* counts PreLoad() API calls */ - DWORD dwNumSet; /* counts SetTexture() API calls */ - DWORD dwNumCreates; /* counts texture creates */ - DWORD dwNumDestroys; /* counts texture destroys */ - DWORD dwNumSetPriorities; /* counts SetPriority() API calls */ - DWORD dwNumSetLODs; /* counts SetLOD() API calls */ - DWORD dwNumLocks; /* counts number of texture locks */ - DWORD dwNumGetDCs; /* counts number of GetDCs to textures */ -} D3DDEVINFO_TEXTURING, *LPD3DDEVINFO_TEXTURING; -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -#endif //(DIRECT3D_VERSION < 0x0800) - -#pragma pack() - - -#endif /* _D3DCAPS_H_ */ - diff --git a/import/DirectX8/include/d3drm.h b/import/DirectX8/include/d3drm.h deleted file mode 100644 index 2438bfe19..000000000 --- a/import/DirectX8/include/d3drm.h +++ /dev/null @@ -1,342 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved. - * - * File: d3drm.h - * Content: Direct3DRM include file - * - ***************************************************************************/ - -#ifndef __D3DRM_H__ -#define __D3DRM_H__ - -#include "ddraw.h" - -#ifdef __cplusplus -struct IDirect3DRM; -#endif - -typedef struct IDirect3DRM *LPDIRECT3DRM; - -#include "d3drmobj.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -DEFINE_GUID(IID_IDirect3DRM, 0x2bc49361, 0x8327, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRM2, 0x4516ecc8, 0x8f20, 0x11d0, 0x9b, 0x6d, 0x00, 0x00, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(IID_IDirect3DRM3, 0x4516ec83, 0x8f20, 0x11d0, 0x9b, 0x6d, 0x00, 0x00, 0xc0, 0x78, 0x1b, 0xc3); -WIN_TYPES(IDirect3DRM, DIRECT3DRM); -WIN_TYPES(IDirect3DRM2, DIRECT3DRM2); -WIN_TYPES(IDirect3DRM3, DIRECT3DRM3); - -/* - * Direct3DRM Object Class (for CoCreateInstance()) - */ -DEFINE_GUID(CLSID_CDirect3DRM, 0x4516ec41, 0x8f20, 0x11d0, 0x9b, 0x6d, 0x00, 0x00, 0xc0, 0x78, 0x1b, 0xc3); - - -/* Create a Direct3DRM API */ -STDAPI Direct3DRMCreate(LPDIRECT3DRM FAR *lplpDirect3DRM); - -#undef INTERFACE -#define INTERFACE IDirect3DRM - -DECLARE_INTERFACE_(IDirect3DRM, IUnknown) -{ - IUNKNOWN_METHODS(PURE); - - STDMETHOD(CreateObject) - (THIS_ REFCLSID rclsid, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID FAR* ppv) PURE; - STDMETHOD(CreateFrame) (THIS_ LPDIRECT3DRMFRAME, LPDIRECT3DRMFRAME *) PURE; - STDMETHOD(CreateMesh) (THIS_ LPDIRECT3DRMMESH *) PURE; - STDMETHOD(CreateMeshBuilder)(THIS_ LPDIRECT3DRMMESHBUILDER *) PURE; - STDMETHOD(CreateFace) (THIS_ LPDIRECT3DRMFACE *) PURE; - STDMETHOD(CreateAnimation) (THIS_ LPDIRECT3DRMANIMATION *) PURE; - STDMETHOD(CreateAnimationSet)(THIS_ LPDIRECT3DRMANIMATIONSET *) PURE; - STDMETHOD(CreateTexture) (THIS_ LPD3DRMIMAGE, LPDIRECT3DRMTEXTURE *) PURE; - STDMETHOD(CreateLight) (THIS_ D3DRMLIGHTTYPE, D3DCOLOR, LPDIRECT3DRMLIGHT *) PURE; - STDMETHOD(CreateLightRGB) - (THIS_ D3DRMLIGHTTYPE, D3DVALUE, D3DVALUE, D3DVALUE, LPDIRECT3DRMLIGHT *) PURE; - STDMETHOD(CreateMaterial) (THIS_ D3DVALUE, LPDIRECT3DRMMATERIAL *) PURE; - STDMETHOD(CreateDevice) (THIS_ DWORD, DWORD, LPDIRECT3DRMDEVICE *) PURE; - - /* Create a Windows Device using DirectDraw surfaces */ - STDMETHOD(CreateDeviceFromSurface) - ( THIS_ LPGUID lpGUID, LPDIRECTDRAW lpDD, - LPDIRECTDRAWSURFACE lpDDSBack, LPDIRECT3DRMDEVICE * - ) PURE; - - /* Create a Windows Device using D3D objects */ - STDMETHOD(CreateDeviceFromD3D) - ( THIS_ LPDIRECT3D lpD3D, LPDIRECT3DDEVICE lpD3DDev, - LPDIRECT3DRMDEVICE * - ) PURE; - - STDMETHOD(CreateDeviceFromClipper) - ( THIS_ LPDIRECTDRAWCLIPPER lpDDClipper, LPGUID lpGUID, - int width, int height, LPDIRECT3DRMDEVICE *) PURE; - - STDMETHOD(CreateTextureFromSurface)(THIS_ LPDIRECTDRAWSURFACE lpDDS, LPDIRECT3DRMTEXTURE *) PURE; - - STDMETHOD(CreateShadow) - ( THIS_ LPDIRECT3DRMVISUAL, LPDIRECT3DRMLIGHT, - D3DVALUE px, D3DVALUE py, D3DVALUE pz, - D3DVALUE nx, D3DVALUE ny, D3DVALUE nz, - LPDIRECT3DRMVISUAL * - ) PURE; - STDMETHOD(CreateViewport) - ( THIS_ LPDIRECT3DRMDEVICE, LPDIRECT3DRMFRAME, DWORD, DWORD, - DWORD, DWORD, LPDIRECT3DRMVIEWPORT * - ) PURE; - STDMETHOD(CreateWrap) - ( THIS_ D3DRMWRAPTYPE, LPDIRECT3DRMFRAME, - D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, - D3DVALUE dx, D3DVALUE dy, D3DVALUE dz, - D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, - D3DVALUE ou, D3DVALUE ov, - D3DVALUE su, D3DVALUE sv, - LPDIRECT3DRMWRAP * - ) PURE; - STDMETHOD(CreateUserVisual) (THIS_ D3DRMUSERVISUALCALLBACK, LPVOID lPArg, LPDIRECT3DRMUSERVISUAL *) PURE; - STDMETHOD(LoadTexture) (THIS_ const char *, LPDIRECT3DRMTEXTURE *) PURE; - STDMETHOD(LoadTextureFromResource) (THIS_ HRSRC rs, LPDIRECT3DRMTEXTURE *) PURE; - - STDMETHOD(SetSearchPath) (THIS_ LPCSTR) PURE; - STDMETHOD(AddSearchPath) (THIS_ LPCSTR) PURE; - STDMETHOD(GetSearchPath) (THIS_ DWORD *size_return, LPSTR path_return) PURE; - STDMETHOD(SetDefaultTextureColors)(THIS_ DWORD) PURE; - STDMETHOD(SetDefaultTextureShades)(THIS_ DWORD) PURE; - - STDMETHOD(GetDevices) (THIS_ LPDIRECT3DRMDEVICEARRAY *) PURE; - STDMETHOD(GetNamedObject) (THIS_ const char *, LPDIRECT3DRMOBJECT *) PURE; - - STDMETHOD(EnumerateObjects) (THIS_ D3DRMOBJECTCALLBACK, LPVOID) PURE; - - STDMETHOD(Load) - ( THIS_ LPVOID, LPVOID, LPIID *, DWORD, D3DRMLOADOPTIONS, - D3DRMLOADCALLBACK, LPVOID, D3DRMLOADTEXTURECALLBACK, LPVOID, - LPDIRECT3DRMFRAME - ) PURE; - STDMETHOD(Tick) (THIS_ D3DVALUE) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRM2 - -DECLARE_INTERFACE_(IDirect3DRM2, IUnknown) -{ - IUNKNOWN_METHODS(PURE); - - STDMETHOD(CreateObject) - (THIS_ REFCLSID rclsid, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID FAR* ppv) PURE; - STDMETHOD(CreateFrame) (THIS_ LPDIRECT3DRMFRAME, LPDIRECT3DRMFRAME2 *) PURE; - STDMETHOD(CreateMesh) (THIS_ LPDIRECT3DRMMESH *) PURE; - STDMETHOD(CreateMeshBuilder)(THIS_ LPDIRECT3DRMMESHBUILDER2 *) PURE; - STDMETHOD(CreateFace) (THIS_ LPDIRECT3DRMFACE *) PURE; - STDMETHOD(CreateAnimation) (THIS_ LPDIRECT3DRMANIMATION *) PURE; - STDMETHOD(CreateAnimationSet)(THIS_ LPDIRECT3DRMANIMATIONSET *) PURE; - STDMETHOD(CreateTexture) (THIS_ LPD3DRMIMAGE, LPDIRECT3DRMTEXTURE2 *) PURE; - STDMETHOD(CreateLight) (THIS_ D3DRMLIGHTTYPE, D3DCOLOR, LPDIRECT3DRMLIGHT *) PURE; - STDMETHOD(CreateLightRGB) - (THIS_ D3DRMLIGHTTYPE, D3DVALUE, D3DVALUE, D3DVALUE, LPDIRECT3DRMLIGHT *) PURE; - STDMETHOD(CreateMaterial) (THIS_ D3DVALUE, LPDIRECT3DRMMATERIAL *) PURE; - STDMETHOD(CreateDevice) (THIS_ DWORD, DWORD, LPDIRECT3DRMDEVICE2 *) PURE; - - /* Create a Windows Device using DirectDraw surfaces */ - STDMETHOD(CreateDeviceFromSurface) - ( THIS_ LPGUID lpGUID, LPDIRECTDRAW lpDD, - LPDIRECTDRAWSURFACE lpDDSBack, LPDIRECT3DRMDEVICE2 * - ) PURE; - - /* Create a Windows Device using D3D objects */ - STDMETHOD(CreateDeviceFromD3D) - ( THIS_ LPDIRECT3D2 lpD3D, LPDIRECT3DDEVICE2 lpD3DDev, - LPDIRECT3DRMDEVICE2 * - ) PURE; - - STDMETHOD(CreateDeviceFromClipper) - ( THIS_ LPDIRECTDRAWCLIPPER lpDDClipper, LPGUID lpGUID, - int width, int height, LPDIRECT3DRMDEVICE2 *) PURE; - - STDMETHOD(CreateTextureFromSurface)(THIS_ LPDIRECTDRAWSURFACE lpDDS, LPDIRECT3DRMTEXTURE2 *) PURE; - - STDMETHOD(CreateShadow) - ( THIS_ LPDIRECT3DRMVISUAL, LPDIRECT3DRMLIGHT, - D3DVALUE px, D3DVALUE py, D3DVALUE pz, - D3DVALUE nx, D3DVALUE ny, D3DVALUE nz, - LPDIRECT3DRMVISUAL * - ) PURE; - STDMETHOD(CreateViewport) - ( THIS_ LPDIRECT3DRMDEVICE, LPDIRECT3DRMFRAME, DWORD, DWORD, - DWORD, DWORD, LPDIRECT3DRMVIEWPORT * - ) PURE; - STDMETHOD(CreateWrap) - ( THIS_ D3DRMWRAPTYPE, LPDIRECT3DRMFRAME, - D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, - D3DVALUE dx, D3DVALUE dy, D3DVALUE dz, - D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, - D3DVALUE ou, D3DVALUE ov, - D3DVALUE su, D3DVALUE sv, - LPDIRECT3DRMWRAP * - ) PURE; - STDMETHOD(CreateUserVisual) (THIS_ D3DRMUSERVISUALCALLBACK, LPVOID lPArg, LPDIRECT3DRMUSERVISUAL *) PURE; - STDMETHOD(LoadTexture) (THIS_ const char *, LPDIRECT3DRMTEXTURE2 *) PURE; - STDMETHOD(LoadTextureFromResource) (THIS_ HMODULE hModule, LPCTSTR strName, LPCTSTR strType, LPDIRECT3DRMTEXTURE2 *) PURE; - - STDMETHOD(SetSearchPath) (THIS_ LPCSTR) PURE; - STDMETHOD(AddSearchPath) (THIS_ LPCSTR) PURE; - STDMETHOD(GetSearchPath) (THIS_ DWORD *size_return, LPSTR path_return) PURE; - STDMETHOD(SetDefaultTextureColors)(THIS_ DWORD) PURE; - STDMETHOD(SetDefaultTextureShades)(THIS_ DWORD) PURE; - - STDMETHOD(GetDevices) (THIS_ LPDIRECT3DRMDEVICEARRAY *) PURE; - STDMETHOD(GetNamedObject) (THIS_ const char *, LPDIRECT3DRMOBJECT *) PURE; - - STDMETHOD(EnumerateObjects) (THIS_ D3DRMOBJECTCALLBACK, LPVOID) PURE; - - STDMETHOD(Load) - ( THIS_ LPVOID, LPVOID, LPIID *, DWORD, D3DRMLOADOPTIONS, - D3DRMLOADCALLBACK, LPVOID, D3DRMLOADTEXTURECALLBACK, LPVOID, - LPDIRECT3DRMFRAME - ) PURE; - STDMETHOD(Tick) (THIS_ D3DVALUE) PURE; - - STDMETHOD(CreateProgressiveMesh)(THIS_ LPDIRECT3DRMPROGRESSIVEMESH *) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRM3 - -DECLARE_INTERFACE_(IDirect3DRM3, IUnknown) -{ - IUNKNOWN_METHODS(PURE); - - STDMETHOD(CreateObject) - (THIS_ REFCLSID rclsid, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID FAR* ppv) PURE; - STDMETHOD(CreateFrame) (THIS_ LPDIRECT3DRMFRAME3, LPDIRECT3DRMFRAME3 *) PURE; - STDMETHOD(CreateMesh) (THIS_ LPDIRECT3DRMMESH *) PURE; - STDMETHOD(CreateMeshBuilder)(THIS_ LPDIRECT3DRMMESHBUILDER3 *) PURE; - STDMETHOD(CreateFace) (THIS_ LPDIRECT3DRMFACE2 *) PURE; - STDMETHOD(CreateAnimation) (THIS_ LPDIRECT3DRMANIMATION2 *) PURE; - STDMETHOD(CreateAnimationSet)(THIS_ LPDIRECT3DRMANIMATIONSET2 *) PURE; - STDMETHOD(CreateTexture) (THIS_ LPD3DRMIMAGE, LPDIRECT3DRMTEXTURE3 *) PURE; - STDMETHOD(CreateLight) (THIS_ D3DRMLIGHTTYPE, D3DCOLOR, LPDIRECT3DRMLIGHT *) PURE; - STDMETHOD(CreateLightRGB) - (THIS_ D3DRMLIGHTTYPE, D3DVALUE, D3DVALUE, D3DVALUE, LPDIRECT3DRMLIGHT *) PURE; - STDMETHOD(CreateMaterial) (THIS_ D3DVALUE, LPDIRECT3DRMMATERIAL2 *) PURE; - STDMETHOD(CreateDevice) (THIS_ DWORD, DWORD, LPDIRECT3DRMDEVICE3 *) PURE; - - /* Create a Windows Device using DirectDraw surfaces */ - STDMETHOD(CreateDeviceFromSurface) - ( THIS_ LPGUID lpGUID, LPDIRECTDRAW lpDD, - LPDIRECTDRAWSURFACE lpDDSBack, DWORD dwFlags, LPDIRECT3DRMDEVICE3 * - ) PURE; - - /* Create a Windows Device using D3D objects */ - STDMETHOD(CreateDeviceFromD3D) - ( THIS_ LPDIRECT3D2 lpD3D, LPDIRECT3DDEVICE2 lpD3DDev, - LPDIRECT3DRMDEVICE3 * - ) PURE; - - STDMETHOD(CreateDeviceFromClipper) - ( THIS_ LPDIRECTDRAWCLIPPER lpDDClipper, LPGUID lpGUID, - int width, int height, LPDIRECT3DRMDEVICE3 *) PURE; - - STDMETHOD(CreateTextureFromSurface)(THIS_ LPDIRECTDRAWSURFACE lpDDS, LPDIRECT3DRMTEXTURE3 *) PURE; - - STDMETHOD(CreateShadow) - ( THIS_ LPUNKNOWN, LPDIRECT3DRMLIGHT, - D3DVALUE px, D3DVALUE py, D3DVALUE pz, - D3DVALUE nx, D3DVALUE ny, D3DVALUE nz, - LPDIRECT3DRMSHADOW2 * - ) PURE; - STDMETHOD(CreateViewport) - ( THIS_ LPDIRECT3DRMDEVICE3, LPDIRECT3DRMFRAME3, DWORD, DWORD, - DWORD, DWORD, LPDIRECT3DRMVIEWPORT2 * - ) PURE; - STDMETHOD(CreateWrap) - ( THIS_ D3DRMWRAPTYPE, LPDIRECT3DRMFRAME3, - D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, - D3DVALUE dx, D3DVALUE dy, D3DVALUE dz, - D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, - D3DVALUE ou, D3DVALUE ov, - D3DVALUE su, D3DVALUE sv, - LPDIRECT3DRMWRAP * - ) PURE; - STDMETHOD(CreateUserVisual) (THIS_ D3DRMUSERVISUALCALLBACK, LPVOID lPArg, LPDIRECT3DRMUSERVISUAL *) PURE; - STDMETHOD(LoadTexture) (THIS_ const char *, LPDIRECT3DRMTEXTURE3 *) PURE; - STDMETHOD(LoadTextureFromResource) (THIS_ HMODULE hModule, LPCTSTR strName, LPCTSTR strType, LPDIRECT3DRMTEXTURE3 *) PURE; - - STDMETHOD(SetSearchPath) (THIS_ LPCSTR) PURE; - STDMETHOD(AddSearchPath) (THIS_ LPCSTR) PURE; - STDMETHOD(GetSearchPath) (THIS_ DWORD *size_return, LPSTR path_return) PURE; - STDMETHOD(SetDefaultTextureColors)(THIS_ DWORD) PURE; - STDMETHOD(SetDefaultTextureShades)(THIS_ DWORD) PURE; - - STDMETHOD(GetDevices) (THIS_ LPDIRECT3DRMDEVICEARRAY *) PURE; - STDMETHOD(GetNamedObject) (THIS_ const char *, LPDIRECT3DRMOBJECT *) PURE; - - STDMETHOD(EnumerateObjects) (THIS_ D3DRMOBJECTCALLBACK, LPVOID) PURE; - - STDMETHOD(Load) - ( THIS_ LPVOID, LPVOID, LPIID *, DWORD, D3DRMLOADOPTIONS, - D3DRMLOADCALLBACK, LPVOID, D3DRMLOADTEXTURE3CALLBACK, LPVOID, - LPDIRECT3DRMFRAME3 - ) PURE; - STDMETHOD(Tick) (THIS_ D3DVALUE) PURE; - - STDMETHOD(CreateProgressiveMesh)(THIS_ LPDIRECT3DRMPROGRESSIVEMESH *) PURE; - - /* Used with IDirect3DRMObject2 */ - STDMETHOD(RegisterClient) (THIS_ REFGUID rguid, LPDWORD lpdwID) PURE; - STDMETHOD(UnregisterClient) (THIS_ REFGUID rguid) PURE; - - STDMETHOD(CreateClippedVisual) (THIS_ LPDIRECT3DRMVISUAL, LPDIRECT3DRMCLIPPEDVISUAL *) PURE; - STDMETHOD(SetOptions) (THIS_ DWORD); - STDMETHOD(GetOptions) (THIS_ LPDWORD); -}; - -#define D3DRM_OK DD_OK -#define D3DRMERR_BADOBJECT MAKE_DDHRESULT(781) -#define D3DRMERR_BADTYPE MAKE_DDHRESULT(782) -#define D3DRMERR_BADALLOC MAKE_DDHRESULT(783) -#define D3DRMERR_FACEUSED MAKE_DDHRESULT(784) -#define D3DRMERR_NOTFOUND MAKE_DDHRESULT(785) -#define D3DRMERR_NOTDONEYET MAKE_DDHRESULT(786) -#define D3DRMERR_FILENOTFOUND MAKE_DDHRESULT(787) -#define D3DRMERR_BADFILE MAKE_DDHRESULT(788) -#define D3DRMERR_BADDEVICE MAKE_DDHRESULT(789) -#define D3DRMERR_BADVALUE MAKE_DDHRESULT(790) -#define D3DRMERR_BADMAJORVERSION MAKE_DDHRESULT(791) -#define D3DRMERR_BADMINORVERSION MAKE_DDHRESULT(792) -#define D3DRMERR_UNABLETOEXECUTE MAKE_DDHRESULT(793) -#define D3DRMERR_LIBRARYNOTFOUND MAKE_DDHRESULT(794) -#define D3DRMERR_INVALIDLIBRARY MAKE_DDHRESULT(795) -#define D3DRMERR_PENDING MAKE_DDHRESULT(796) -#define D3DRMERR_NOTENOUGHDATA MAKE_DDHRESULT(797) -#define D3DRMERR_REQUESTTOOLARGE MAKE_DDHRESULT(798) -#define D3DRMERR_REQUESTTOOSMALL MAKE_DDHRESULT(799) -#define D3DRMERR_CONNECTIONLOST MAKE_DDHRESULT(800) -#define D3DRMERR_LOADABORTED MAKE_DDHRESULT(801) -#define D3DRMERR_NOINTERNET MAKE_DDHRESULT(802) -#define D3DRMERR_BADCACHEFILE MAKE_DDHRESULT(803) -#define D3DRMERR_BOXNOTSET MAKE_DDHRESULT(804) -#define D3DRMERR_BADPMDATA MAKE_DDHRESULT(805) -#define D3DRMERR_CLIENTNOTREGISTERED MAKE_DDHRESULT(806) -#define D3DRMERR_NOTCREATEDFROMDDS MAKE_DDHRESULT(807) -#define D3DRMERR_NOSUCHKEY MAKE_DDHRESULT(808) -#define D3DRMERR_INCOMPATABLEKEY MAKE_DDHRESULT(809) -#define D3DRMERR_ELEMENTINUSE MAKE_DDHRESULT(810) -#define D3DRMERR_TEXTUREFORMATNOTFOUND MAKE_DDHRESULT(811) -#define D3DRMERR_NOTAGGREGATED MAKE_DDHRESULT(812) - -#ifdef __cplusplus -}; -#endif - -#endif /* _D3DRMAPI_H_ */ - - diff --git a/import/DirectX8/include/d3drmdef.h b/import/DirectX8/include/d3drmdef.h deleted file mode 100644 index f3d7048d3..000000000 --- a/import/DirectX8/include/d3drmdef.h +++ /dev/null @@ -1,695 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved. - * - * File: d3drm.h - * Content: Direct3DRM include file - * - ***************************************************************************/ - -#ifndef __D3DRMDEFS_H__ -#define __D3DRMDEFS_H__ - -#include -#include "d3dtypes.h" - -#ifdef WIN32 -#define D3DRMAPI __stdcall -#else -#define D3DRMAPI -#endif - -#if defined(__cplusplus) -extern "C" { -#endif - -#ifndef TRUE -#define FALSE 0 -#define TRUE 1 -#endif - -typedef struct _D3DRMVECTOR4D -{ D3DVALUE x, y, z, w; -} D3DRMVECTOR4D, *LPD3DRMVECTOR4D; - -typedef D3DVALUE D3DRMMATRIX4D[4][4]; - -typedef struct _D3DRMQUATERNION -{ D3DVALUE s; - D3DVECTOR v; -} D3DRMQUATERNION, *LPD3DRMQUATERNION; - -typedef struct _D3DRMRAY -{ D3DVECTOR dvDir; - D3DVECTOR dvPos; -} D3DRMRAY, *LPD3DRMRAY; - -typedef struct _D3DRMBOX -{ D3DVECTOR min, max; -} D3DRMBOX, *LPD3DRMBOX; - -typedef void (*D3DRMWRAPCALLBACK) - (LPD3DVECTOR, int* u, int* v, LPD3DVECTOR a, LPD3DVECTOR b, LPVOID); - -typedef enum _D3DRMLIGHTTYPE -{ D3DRMLIGHT_AMBIENT, - D3DRMLIGHT_POINT, - D3DRMLIGHT_SPOT, - D3DRMLIGHT_DIRECTIONAL, - D3DRMLIGHT_PARALLELPOINT -} D3DRMLIGHTTYPE, *LPD3DRMLIGHTTYPE; - -typedef enum _D3DRMSHADEMODE { - D3DRMSHADE_FLAT = 0, - D3DRMSHADE_GOURAUD = 1, - D3DRMSHADE_PHONG = 2, - - D3DRMSHADE_MASK = 7, - D3DRMSHADE_MAX = 8 -} D3DRMSHADEMODE, *LPD3DRMSHADEMODE; - -typedef enum _D3DRMLIGHTMODE { - D3DRMLIGHT_OFF = 0 * D3DRMSHADE_MAX, - D3DRMLIGHT_ON = 1 * D3DRMSHADE_MAX, - - D3DRMLIGHT_MASK = 7 * D3DRMSHADE_MAX, - D3DRMLIGHT_MAX = 8 * D3DRMSHADE_MAX -} D3DRMLIGHTMODE, *LPD3DRMLIGHTMODE; - -typedef enum _D3DRMFILLMODE { - D3DRMFILL_POINTS = 0 * D3DRMLIGHT_MAX, - D3DRMFILL_WIREFRAME = 1 * D3DRMLIGHT_MAX, - D3DRMFILL_SOLID = 2 * D3DRMLIGHT_MAX, - - D3DRMFILL_MASK = 7 * D3DRMLIGHT_MAX, - D3DRMFILL_MAX = 8 * D3DRMLIGHT_MAX -} D3DRMFILLMODE, *LPD3DRMFILLMODE; - -typedef DWORD D3DRMRENDERQUALITY, *LPD3DRMRENDERQUALITY; - -#define D3DRMRENDER_WIREFRAME (D3DRMSHADE_FLAT+D3DRMLIGHT_OFF+D3DRMFILL_WIREFRAME) -#define D3DRMRENDER_UNLITFLAT (D3DRMSHADE_FLAT+D3DRMLIGHT_OFF+D3DRMFILL_SOLID) -#define D3DRMRENDER_FLAT (D3DRMSHADE_FLAT+D3DRMLIGHT_ON+D3DRMFILL_SOLID) -#define D3DRMRENDER_GOURAUD (D3DRMSHADE_GOURAUD+D3DRMLIGHT_ON+D3DRMFILL_SOLID) -#define D3DRMRENDER_PHONG (D3DRMSHADE_PHONG+D3DRMLIGHT_ON+D3DRMFILL_SOLID) - -#define D3DRMRENDERMODE_BLENDEDTRANSPARENCY 1 -#define D3DRMRENDERMODE_SORTEDTRANSPARENCY 2 -#define D3DRMRENDERMODE_LIGHTINMODELSPACE 8 -#define D3DRMRENDERMODE_VIEWDEPENDENTSPECULAR 16 -#define D3DRMRENDERMODE_DISABLESORTEDALPHAZWRITE 32 - -typedef enum _D3DRMTEXTUREQUALITY -{ D3DRMTEXTURE_NEAREST, /* choose nearest texel */ - D3DRMTEXTURE_LINEAR, /* interpolate 4 texels */ - D3DRMTEXTURE_MIPNEAREST, /* nearest texel in nearest mipmap */ - D3DRMTEXTURE_MIPLINEAR, /* interpolate 2 texels from 2 mipmaps */ - D3DRMTEXTURE_LINEARMIPNEAREST, /* interpolate 4 texels in nearest mipmap */ - D3DRMTEXTURE_LINEARMIPLINEAR /* interpolate 8 texels from 2 mipmaps */ -} D3DRMTEXTUREQUALITY, *LPD3DRMTEXTUREQUALITY; - -/* - * Texture flags - */ -#define D3DRMTEXTURE_FORCERESIDENT 0x00000001 /* texture should be kept in video memory */ -#define D3DRMTEXTURE_STATIC 0x00000002 /* texture will not change */ -#define D3DRMTEXTURE_DOWNSAMPLEPOINT 0x00000004 /* point filtering should be used when downsampling */ -#define D3DRMTEXTURE_DOWNSAMPLEBILINEAR 0x00000008 /* bilinear filtering should be used when downsampling */ -#define D3DRMTEXTURE_DOWNSAMPLEREDUCEDEPTH 0x00000010 /* reduce bit depth when downsampling */ -#define D3DRMTEXTURE_DOWNSAMPLENONE 0x00000020 /* texture should never be downsampled */ -#define D3DRMTEXTURE_CHANGEDPIXELS 0x00000040 /* pixels have changed */ -#define D3DRMTEXTURE_CHANGEDPALETTE 0x00000080 /* palette has changed */ -#define D3DRMTEXTURE_INVALIDATEONLY 0x00000100 /* dirty regions are invalid */ - -/* - * Shadow flags - */ -#define D3DRMSHADOW_TRUEALPHA 0x00000001 /* shadow should render without artifacts when true alpha is on */ - -typedef enum _D3DRMCOMBINETYPE -{ D3DRMCOMBINE_REPLACE, - D3DRMCOMBINE_BEFORE, - D3DRMCOMBINE_AFTER -} D3DRMCOMBINETYPE, *LPD3DRMCOMBINETYPE; - -typedef D3DCOLORMODEL D3DRMCOLORMODEL, *LPD3DRMCOLORMODEL; - -typedef enum _D3DRMPALETTEFLAGS -{ D3DRMPALETTE_FREE, /* renderer may use this entry freely */ - D3DRMPALETTE_READONLY, /* fixed but may be used by renderer */ - D3DRMPALETTE_RESERVED /* may not be used by renderer */ -} D3DRMPALETTEFLAGS, *LPD3DRMPALETTEFLAGS; - -typedef struct _D3DRMPALETTEENTRY -{ unsigned char red; /* 0 .. 255 */ - unsigned char green; /* 0 .. 255 */ - unsigned char blue; /* 0 .. 255 */ - unsigned char flags; /* one of D3DRMPALETTEFLAGS */ -} D3DRMPALETTEENTRY, *LPD3DRMPALETTEENTRY; - -typedef struct _D3DRMIMAGE -{ int width, height; /* width and height in pixels */ - int aspectx, aspecty; /* aspect ratio for non-square pixels */ - int depth; /* bits per pixel */ - int rgb; /* if false, pixels are indices into a - palette otherwise, pixels encode - RGB values. */ - int bytes_per_line; /* number of bytes of memory for a - scanline. This must be a multiple - of 4. */ - void* buffer1; /* memory to render into (first buffer). */ - void* buffer2; /* second rendering buffer for double - buffering, set to NULL for single - buffering. */ - unsigned long red_mask; - unsigned long green_mask; - unsigned long blue_mask; - unsigned long alpha_mask; /* if rgb is true, these are masks for - the red, green and blue parts of a - pixel. Otherwise, these are masks - for the significant bits of the - red, green and blue elements in the - palette. For instance, most SVGA - displays use 64 intensities of red, - green and blue, so the masks should - all be set to 0xfc. */ - int palette_size; /* number of entries in palette */ - D3DRMPALETTEENTRY* palette; /* description of the palette (only if - rgb is false). Must be (1< /* Use Windows header files */ -#define VIRTUAL -#include "d3drmdef.h" - -#include "d3d.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * The methods for IUnknown - */ -#define IUNKNOWN_METHODS(kind) \ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) kind; \ - STDMETHOD_(ULONG, AddRef) (THIS) kind; \ - STDMETHOD_(ULONG, Release) (THIS) kind - -/* - * The methods for IDirect3DRMObject - */ -#define IDIRECT3DRMOBJECT_METHODS(kind) \ - STDMETHOD(Clone) (THIS_ LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObj) kind; \ - STDMETHOD(AddDestroyCallback) (THIS_ D3DRMOBJECTCALLBACK, LPVOID argument) kind; \ - STDMETHOD(DeleteDestroyCallback) (THIS_ D3DRMOBJECTCALLBACK, LPVOID argument) kind; \ - STDMETHOD(SetAppData) (THIS_ DWORD data) kind; \ - STDMETHOD_(DWORD, GetAppData) (THIS) kind; \ - STDMETHOD(SetName) (THIS_ LPCSTR) kind; \ - STDMETHOD(GetName) (THIS_ LPDWORD lpdwSize, LPSTR lpName) kind; \ - STDMETHOD(GetClassName) (THIS_ LPDWORD lpdwSize, LPSTR lpName) kind - - -#define WIN_TYPES(itype, ptype) \ - typedef interface itype FAR *LP##ptype, FAR **LPLP##ptype - -WIN_TYPES(IDirect3DRMObject, DIRECT3DRMOBJECT); -WIN_TYPES(IDirect3DRMObject2, DIRECT3DRMOBJECT2); -WIN_TYPES(IDirect3DRMDevice, DIRECT3DRMDEVICE); -WIN_TYPES(IDirect3DRMDevice2, DIRECT3DRMDEVICE2); -WIN_TYPES(IDirect3DRMDevice3, DIRECT3DRMDEVICE3); -WIN_TYPES(IDirect3DRMViewport, DIRECT3DRMVIEWPORT); -WIN_TYPES(IDirect3DRMViewport2, DIRECT3DRMVIEWPORT2); -WIN_TYPES(IDirect3DRMFrame, DIRECT3DRMFRAME); -WIN_TYPES(IDirect3DRMFrame2, DIRECT3DRMFRAME2); -WIN_TYPES(IDirect3DRMFrame3, DIRECT3DRMFRAME3); -WIN_TYPES(IDirect3DRMVisual, DIRECT3DRMVISUAL); -WIN_TYPES(IDirect3DRMMesh, DIRECT3DRMMESH); -WIN_TYPES(IDirect3DRMMeshBuilder, DIRECT3DRMMESHBUILDER); -WIN_TYPES(IDirect3DRMMeshBuilder2, DIRECT3DRMMESHBUILDER2); -WIN_TYPES(IDirect3DRMMeshBuilder3, DIRECT3DRMMESHBUILDER3); -WIN_TYPES(IDirect3DRMFace, DIRECT3DRMFACE); -WIN_TYPES(IDirect3DRMFace2, DIRECT3DRMFACE2); -WIN_TYPES(IDirect3DRMLight, DIRECT3DRMLIGHT); -WIN_TYPES(IDirect3DRMTexture, DIRECT3DRMTEXTURE); -WIN_TYPES(IDirect3DRMTexture2, DIRECT3DRMTEXTURE2); -WIN_TYPES(IDirect3DRMTexture3, DIRECT3DRMTEXTURE3); -WIN_TYPES(IDirect3DRMWrap, DIRECT3DRMWRAP); -WIN_TYPES(IDirect3DRMMaterial, DIRECT3DRMMATERIAL); -WIN_TYPES(IDirect3DRMMaterial2, DIRECT3DRMMATERIAL2); -WIN_TYPES(IDirect3DRMInterpolator, DIRECT3DRMINTERPOLATOR); -WIN_TYPES(IDirect3DRMAnimation, DIRECT3DRMANIMATION); -WIN_TYPES(IDirect3DRMAnimation2, DIRECT3DRMANIMATION2); -WIN_TYPES(IDirect3DRMAnimationSet, DIRECT3DRMANIMATIONSET); -WIN_TYPES(IDirect3DRMAnimationSet2, DIRECT3DRMANIMATIONSET2); -WIN_TYPES(IDirect3DRMUserVisual, DIRECT3DRMUSERVISUAL); -WIN_TYPES(IDirect3DRMShadow, DIRECT3DRMSHADOW); -WIN_TYPES(IDirect3DRMShadow2, DIRECT3DRMSHADOW2); -WIN_TYPES(IDirect3DRMArray, DIRECT3DRMARRAY); -WIN_TYPES(IDirect3DRMObjectArray, DIRECT3DRMOBJECTARRAY); -WIN_TYPES(IDirect3DRMDeviceArray, DIRECT3DRMDEVICEARRAY); -WIN_TYPES(IDirect3DRMFaceArray, DIRECT3DRMFACEARRAY); -WIN_TYPES(IDirect3DRMViewportArray, DIRECT3DRMVIEWPORTARRAY); -WIN_TYPES(IDirect3DRMFrameArray, DIRECT3DRMFRAMEARRAY); -WIN_TYPES(IDirect3DRMAnimationArray, DIRECT3DRMANIMATIONARRAY); -WIN_TYPES(IDirect3DRMVisualArray, DIRECT3DRMVISUALARRAY); -WIN_TYPES(IDirect3DRMPickedArray, DIRECT3DRMPICKEDARRAY); -WIN_TYPES(IDirect3DRMPicked2Array, DIRECT3DRMPICKED2ARRAY); -WIN_TYPES(IDirect3DRMLightArray, DIRECT3DRMLIGHTARRAY); -WIN_TYPES(IDirect3DRMProgressiveMesh, DIRECT3DRMPROGRESSIVEMESH); -WIN_TYPES(IDirect3DRMClippedVisual, DIRECT3DRMCLIPPEDVISUAL); - -/* - * Direct3DRM Object classes - */ -DEFINE_GUID(CLSID_CDirect3DRMDevice, 0x4fa3568e, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(CLSID_CDirect3DRMViewport, 0x4fa3568f, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(CLSID_CDirect3DRMFrame, 0x4fa35690, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(CLSID_CDirect3DRMMesh, 0x4fa35691, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(CLSID_CDirect3DRMMeshBuilder, 0x4fa35692, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(CLSID_CDirect3DRMFace, 0x4fa35693, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(CLSID_CDirect3DRMLight, 0x4fa35694, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(CLSID_CDirect3DRMTexture, 0x4fa35695, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(CLSID_CDirect3DRMWrap, 0x4fa35696, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(CLSID_CDirect3DRMMaterial, 0x4fa35697, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(CLSID_CDirect3DRMAnimation, 0x4fa35698, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(CLSID_CDirect3DRMAnimationSet, 0x4fa35699, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(CLSID_CDirect3DRMUserVisual, 0x4fa3569a, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(CLSID_CDirect3DRMShadow, 0x4fa3569b, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(CLSID_CDirect3DRMViewportInterpolator, -0xde9eaa1, 0x3b84, 0x11d0, 0x9b, 0x6d, 0x0, 0x0, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(CLSID_CDirect3DRMFrameInterpolator, -0xde9eaa2, 0x3b84, 0x11d0, 0x9b, 0x6d, 0x0, 0x0, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(CLSID_CDirect3DRMMeshInterpolator, -0xde9eaa3, 0x3b84, 0x11d0, 0x9b, 0x6d, 0x0, 0x0, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(CLSID_CDirect3DRMLightInterpolator, -0xde9eaa6, 0x3b84, 0x11d0, 0x9b, 0x6d, 0x0, 0x0, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(CLSID_CDirect3DRMMaterialInterpolator, -0xde9eaa7, 0x3b84, 0x11d0, 0x9b, 0x6d, 0x0, 0x0, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(CLSID_CDirect3DRMTextureInterpolator, -0xde9eaa8, 0x3b84, 0x11d0, 0x9b, 0x6d, 0x0, 0x0, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(CLSID_CDirect3DRMProgressiveMesh, 0x4516ec40, 0x8f20, 0x11d0, 0x9b, 0x6d, 0x00, 0x00, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(CLSID_CDirect3DRMClippedVisual, 0x5434e72d, 0x6d66, 0x11d1, 0xbb, 0xb, 0x0, 0x0, 0xf8, 0x75, 0x86, 0x5a); - - -/* - * Direct3DRM Object interfaces - */ -DEFINE_GUID(IID_IDirect3DRMObject, 0xeb16cb00, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMObject2, 0x4516ec7c, 0x8f20, 0x11d0, 0x9b, 0x6d, 0x00, 0x00, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(IID_IDirect3DRMDevice, 0xe9e19280, 0x6e05, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMDevice2, 0x4516ec78, 0x8f20, 0x11d0, 0x9b, 0x6d, 0x00, 0x00, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(IID_IDirect3DRMDevice3, 0x549f498b, 0xbfeb, 0x11d1, 0x8e, 0xd8, 0x0, 0xa0, 0xc9, 0x67, 0xa4, 0x82); -DEFINE_GUID(IID_IDirect3DRMViewport, 0xeb16cb02, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMViewport2, 0x4a1b1be6, 0xbfed, 0x11d1, 0x8e, 0xd8, 0x0, 0xa0, 0xc9, 0x67, 0xa4, 0x82); -DEFINE_GUID(IID_IDirect3DRMFrame, 0xeb16cb03, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMFrame2, 0xc3dfbd60, 0x3988, 0x11d0, 0x9e, 0xc2, 0x0, 0x0, 0xc0, 0x29, 0x1a, 0xc3); -DEFINE_GUID(IID_IDirect3DRMFrame3, 0xff6b7f70, 0xa40e, 0x11d1, 0x91, 0xf9, 0x0, 0x0, 0xf8, 0x75, 0x8e, 0x66); -DEFINE_GUID(IID_IDirect3DRMVisual, 0xeb16cb04, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMMesh, 0xa3a80d01, 0x6e12, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMMeshBuilder, 0xa3a80d02, 0x6e12, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMMeshBuilder2, 0x4516ec77, 0x8f20, 0x11d0, 0x9b, 0x6d, 0x0, 0x0, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(IID_IDirect3DRMMeshBuilder3, 0x4516ec82, 0x8f20, 0x11d0, 0x9b, 0x6d, 0x00, 0x00, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(IID_IDirect3DRMFace, 0xeb16cb07, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMFace2, 0x4516ec81, 0x8f20, 0x11d0, 0x9b, 0x6d, 0x00, 0x00, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(IID_IDirect3DRMLight, 0xeb16cb08, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMTexture, 0xeb16cb09, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMTexture2, 0x120f30c0, 0x1629, 0x11d0, 0x94, 0x1c, 0x0, 0x80, 0xc8, 0xc, 0xfa, 0x7b); -DEFINE_GUID(IID_IDirect3DRMTexture3, 0xff6b7f73, 0xa40e, 0x11d1, 0x91, 0xf9, 0x0, 0x0, 0xf8, 0x75, 0x8e, 0x66); -DEFINE_GUID(IID_IDirect3DRMWrap, 0xeb16cb0a, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMMaterial, 0xeb16cb0b, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMMaterial2, 0xff6b7f75, 0xa40e, 0x11d1, 0x91, 0xf9, 0x0, 0x0, 0xf8, 0x75, 0x8e, 0x66); -DEFINE_GUID(IID_IDirect3DRMAnimation, 0xeb16cb0d, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMAnimation2, 0xff6b7f77, 0xa40e, 0x11d1, 0x91, 0xf9, 0x0, 0x0, 0xf8, 0x75, 0x8e, 0x66); -DEFINE_GUID(IID_IDirect3DRMAnimationSet, 0xeb16cb0e, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMAnimationSet2, 0xff6b7f79, 0xa40e, 0x11d1, 0x91, 0xf9, 0x0, 0x0, 0xf8, 0x75, 0x8e, 0x66); -DEFINE_GUID(IID_IDirect3DRMObjectArray, 0x242f6bc2, 0x3849, 0x11d0, 0x9b, 0x6d, 0x0, 0x0, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(IID_IDirect3DRMDeviceArray, 0xeb16cb10, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMViewportArray, 0xeb16cb11, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMFrameArray, 0xeb16cb12, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMVisualArray, 0xeb16cb13, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMLightArray, 0xeb16cb14, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMPickedArray, 0xeb16cb16, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMFaceArray, 0xeb16cb17, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMAnimationArray, -0xd5f1cae0, 0x4bd7, 0x11d1, 0xb9, 0x74, 0x0, 0x60, 0x8, 0x3e, 0x45, 0xf3); -DEFINE_GUID(IID_IDirect3DRMUserVisual, 0x59163de0, 0x6d43, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMShadow, 0xaf359780, 0x6ba3, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); -DEFINE_GUID(IID_IDirect3DRMShadow2, 0x86b44e25, 0x9c82, 0x11d1, 0xbb, 0xb, 0x0, 0xa0, 0xc9, 0x81, 0xa0, 0xa6); -DEFINE_GUID(IID_IDirect3DRMInterpolator, 0x242f6bc1, 0x3849, 0x11d0, 0x9b, 0x6d, 0x0, 0x0, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(IID_IDirect3DRMProgressiveMesh, 0x4516ec79, 0x8f20, 0x11d0, 0x9b, 0x6d, 0x0, 0x0, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(IID_IDirect3DRMPicked2Array, 0x4516ec7b, 0x8f20, 0x11d0, 0x9b, 0x6d, 0x0, 0x0, 0xc0, 0x78, 0x1b, 0xc3); -DEFINE_GUID(IID_IDirect3DRMClippedVisual, 0x5434e733, 0x6d66, 0x11d1, 0xbb, 0xb, 0x0, 0x0, 0xf8, 0x75, 0x86, 0x5a); - -typedef void (__cdecl *D3DRMOBJECTCALLBACK)(LPDIRECT3DRMOBJECT obj, LPVOID arg); -typedef void (__cdecl *D3DRMFRAMEMOVECALLBACK)(LPDIRECT3DRMFRAME obj, LPVOID arg, D3DVALUE delta); -typedef void (__cdecl *D3DRMFRAME3MOVECALLBACK)(LPDIRECT3DRMFRAME3 obj, LPVOID arg, D3DVALUE delta); -typedef void (__cdecl *D3DRMUPDATECALLBACK)(LPDIRECT3DRMDEVICE obj, LPVOID arg, int, LPD3DRECT); -typedef void (__cdecl *D3DRMDEVICE3UPDATECALLBACK)(LPDIRECT3DRMDEVICE3 obj, LPVOID arg, int, LPD3DRECT); -typedef int (__cdecl *D3DRMUSERVISUALCALLBACK) - ( LPDIRECT3DRMUSERVISUAL obj, LPVOID arg, D3DRMUSERVISUALREASON reason, - LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view - ); -typedef HRESULT (__cdecl *D3DRMLOADTEXTURECALLBACK) - (char *tex_name, void *arg, LPDIRECT3DRMTEXTURE *); -typedef HRESULT (__cdecl *D3DRMLOADTEXTURE3CALLBACK) - (char *tex_name, void *arg, LPDIRECT3DRMTEXTURE3 *); -typedef void (__cdecl *D3DRMLOADCALLBACK) - (LPDIRECT3DRMOBJECT object, REFIID objectguid, LPVOID arg); - -typedef HRESULT (__cdecl *D3DRMDOWNSAMPLECALLBACK) - (LPDIRECT3DRMTEXTURE3 lpDirect3DRMTexture, LPVOID pArg, - LPDIRECTDRAWSURFACE pDDSSrc, LPDIRECTDRAWSURFACE pDDSDst); -typedef HRESULT (__cdecl *D3DRMVALIDATIONCALLBACK) - (LPDIRECT3DRMTEXTURE3 lpDirect3DRMTexture, LPVOID pArg, - DWORD dwFlags, DWORD dwcRects, LPRECT pRects); - - -typedef struct _D3DRMPICKDESC -{ - ULONG ulFaceIdx; - LONG lGroupIdx; - D3DVECTOR vPosition; - -} D3DRMPICKDESC, *LPD3DRMPICKDESC; - -typedef struct _D3DRMPICKDESC2 -{ - ULONG ulFaceIdx; - LONG lGroupIdx; - D3DVECTOR dvPosition; - D3DVALUE tu; - D3DVALUE tv; - D3DVECTOR dvNormal; - D3DCOLOR dcColor; - -} D3DRMPICKDESC2, *LPD3DRMPICKDESC2; - -#undef INTERFACE -#define INTERFACE IDirect3DRMObject - -/* - * Base class - */ -DECLARE_INTERFACE_(IDirect3DRMObject, IUnknown) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMObject2 - -DECLARE_INTERFACE_(IDirect3DRMObject2, IUnknown) -{ - IUNKNOWN_METHODS(PURE); - - /* - * IDirect3DRMObject2 methods - */ - STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK lpFunc, LPVOID pvArg) PURE; - STDMETHOD(Clone)(THIS_ LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObj) PURE; \ - STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK lpFunc, LPVOID pvArg) PURE; \ - STDMETHOD(GetClientData)(THIS_ DWORD dwID, LPVOID* lplpvData) PURE; - STDMETHOD(GetDirect3DRM)(THIS_ LPDIRECT3DRM* lplpDirect3DRM) PURE; - STDMETHOD(GetName)(THIS_ LPDWORD lpdwSize, LPSTR lpName) PURE; - STDMETHOD(SetClientData)(THIS_ DWORD dwID, LPVOID lpvData, DWORD dwFlags) PURE; - STDMETHOD(SetName)(THIS_ LPCSTR lpName) PURE; - STDMETHOD(GetAge)(THIS_ DWORD dwFlags, LPDWORD pdwAge) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMVisual - -DECLARE_INTERFACE_(IDirect3DRMVisual, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMDevice - -DECLARE_INTERFACE_(IDirect3DRMDevice, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMDevice methods - */ - STDMETHOD(Init)(THIS_ ULONG width, ULONG height) PURE; - STDMETHOD(InitFromD3D)(THIS_ LPDIRECT3D lpD3D, LPDIRECT3DDEVICE lpD3DDev) PURE; - STDMETHOD(InitFromClipper)(THIS_ LPDIRECTDRAWCLIPPER lpDDClipper, LPGUID lpGUID, int width, int height) PURE; - - STDMETHOD(Update)(THIS) PURE; - STDMETHOD(AddUpdateCallback)(THIS_ D3DRMUPDATECALLBACK, LPVOID arg) PURE; - STDMETHOD(DeleteUpdateCallback)(THIS_ D3DRMUPDATECALLBACK, LPVOID arg) PURE; - STDMETHOD(SetBufferCount)(THIS_ DWORD) PURE; - STDMETHOD_(DWORD, GetBufferCount)(THIS) PURE; - - STDMETHOD(SetDither)(THIS_ BOOL) PURE; - STDMETHOD(SetShades)(THIS_ DWORD) PURE; - STDMETHOD(SetQuality)(THIS_ D3DRMRENDERQUALITY) PURE; - STDMETHOD(SetTextureQuality)(THIS_ D3DRMTEXTUREQUALITY) PURE; - - STDMETHOD(GetViewports)(THIS_ LPDIRECT3DRMVIEWPORTARRAY *return_views) PURE; - - STDMETHOD_(BOOL, GetDither)(THIS) PURE; - STDMETHOD_(DWORD, GetShades)(THIS) PURE; - STDMETHOD_(DWORD, GetHeight)(THIS) PURE; - STDMETHOD_(DWORD, GetWidth)(THIS) PURE; - STDMETHOD_(DWORD, GetTrianglesDrawn)(THIS) PURE; - STDMETHOD_(DWORD, GetWireframeOptions)(THIS) PURE; - STDMETHOD_(D3DRMRENDERQUALITY, GetQuality)(THIS) PURE; - STDMETHOD_(D3DCOLORMODEL, GetColorModel)(THIS) PURE; - STDMETHOD_(D3DRMTEXTUREQUALITY, GetTextureQuality)(THIS) PURE; - STDMETHOD(GetDirect3DDevice)(THIS_ LPDIRECT3DDEVICE *) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMDevice2 - -DECLARE_INTERFACE_(IDirect3DRMDevice2, IDirect3DRMDevice) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMDevice methods - */ - STDMETHOD(Init)(THIS_ ULONG width, ULONG height) PURE; - STDMETHOD(InitFromD3D)(THIS_ LPDIRECT3D lpD3D, LPDIRECT3DDEVICE lpD3DDev) PURE; - STDMETHOD(InitFromClipper)(THIS_ LPDIRECTDRAWCLIPPER lpDDClipper, LPGUID lpGUID, int width, int height) PURE; - - STDMETHOD(Update)(THIS) PURE; - STDMETHOD(AddUpdateCallback)(THIS_ D3DRMUPDATECALLBACK, LPVOID arg) PURE; - STDMETHOD(DeleteUpdateCallback)(THIS_ D3DRMUPDATECALLBACK, LPVOID arg) PURE; - STDMETHOD(SetBufferCount)(THIS_ DWORD) PURE; - STDMETHOD_(DWORD, GetBufferCount)(THIS) PURE; - - STDMETHOD(SetDither)(THIS_ BOOL) PURE; - STDMETHOD(SetShades)(THIS_ DWORD) PURE; - STDMETHOD(SetQuality)(THIS_ D3DRMRENDERQUALITY) PURE; - STDMETHOD(SetTextureQuality)(THIS_ D3DRMTEXTUREQUALITY) PURE; - - STDMETHOD(GetViewports)(THIS_ LPDIRECT3DRMVIEWPORTARRAY *return_views) PURE; - - STDMETHOD_(BOOL, GetDither)(THIS) PURE; - STDMETHOD_(DWORD, GetShades)(THIS) PURE; - STDMETHOD_(DWORD, GetHeight)(THIS) PURE; - STDMETHOD_(DWORD, GetWidth)(THIS) PURE; - STDMETHOD_(DWORD, GetTrianglesDrawn)(THIS) PURE; - STDMETHOD_(DWORD, GetWireframeOptions)(THIS) PURE; - STDMETHOD_(D3DRMRENDERQUALITY, GetQuality)(THIS) PURE; - STDMETHOD_(D3DCOLORMODEL, GetColorModel)(THIS) PURE; - STDMETHOD_(D3DRMTEXTUREQUALITY, GetTextureQuality)(THIS) PURE; - STDMETHOD(GetDirect3DDevice)(THIS_ LPDIRECT3DDEVICE *) PURE; - - /* - * IDirect3DRMDevice2 methods - */ - STDMETHOD(InitFromD3D2)(THIS_ LPDIRECT3D2 lpD3D, LPDIRECT3DDEVICE2 lpD3DDev) PURE; - STDMETHOD(InitFromSurface)(THIS_ LPGUID lpGUID, LPDIRECTDRAW lpDD, LPDIRECTDRAWSURFACE lpDDSBack) PURE; - STDMETHOD(SetRenderMode)(THIS_ DWORD dwFlags) PURE; - STDMETHOD_(DWORD, GetRenderMode)(THIS) PURE; - STDMETHOD(GetDirect3DDevice2)(THIS_ LPDIRECT3DDEVICE2 *) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMDevice3 - -DECLARE_INTERFACE_(IDirect3DRMDevice3, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMDevice methods - */ - STDMETHOD(Init)(THIS_ ULONG width, ULONG height) PURE; - STDMETHOD(InitFromD3D)(THIS_ LPDIRECT3D lpD3D, LPDIRECT3DDEVICE lpD3DDev) PURE; - STDMETHOD(InitFromClipper)(THIS_ LPDIRECTDRAWCLIPPER lpDDClipper, LPGUID lpGUID, int width, int height) PURE; - - STDMETHOD(Update)(THIS) PURE; - STDMETHOD(AddUpdateCallback)(THIS_ D3DRMDEVICE3UPDATECALLBACK, LPVOID arg) PURE; - STDMETHOD(DeleteUpdateCallback)(THIS_ D3DRMDEVICE3UPDATECALLBACK, LPVOID arg) PURE; - STDMETHOD(SetBufferCount)(THIS_ DWORD) PURE; - STDMETHOD_(DWORD, GetBufferCount)(THIS) PURE; - - STDMETHOD(SetDither)(THIS_ BOOL) PURE; - STDMETHOD(SetShades)(THIS_ DWORD) PURE; - STDMETHOD(SetQuality)(THIS_ D3DRMRENDERQUALITY) PURE; - STDMETHOD(SetTextureQuality)(THIS_ D3DRMTEXTUREQUALITY) PURE; - - STDMETHOD(GetViewports)(THIS_ LPDIRECT3DRMVIEWPORTARRAY *return_views) PURE; - - STDMETHOD_(BOOL, GetDither)(THIS) PURE; - STDMETHOD_(DWORD, GetShades)(THIS) PURE; - STDMETHOD_(DWORD, GetHeight)(THIS) PURE; - STDMETHOD_(DWORD, GetWidth)(THIS) PURE; - STDMETHOD_(DWORD, GetTrianglesDrawn)(THIS) PURE; - STDMETHOD_(DWORD, GetWireframeOptions)(THIS) PURE; - STDMETHOD_(D3DRMRENDERQUALITY, GetQuality)(THIS) PURE; - STDMETHOD_(D3DCOLORMODEL, GetColorModel)(THIS) PURE; - STDMETHOD_(D3DRMTEXTUREQUALITY, GetTextureQuality)(THIS) PURE; - STDMETHOD(GetDirect3DDevice)(THIS_ LPDIRECT3DDEVICE *) PURE; - - /* - * IDirect3DRMDevice2 methods - */ - STDMETHOD(InitFromD3D2)(THIS_ LPDIRECT3D2 lpD3D, LPDIRECT3DDEVICE2 lpD3DDev) PURE; - STDMETHOD(InitFromSurface)(THIS_ LPGUID lpGUID, LPDIRECTDRAW lpDD, LPDIRECTDRAWSURFACE lpDDSBack, DWORD dwFlags) PURE; - STDMETHOD(SetRenderMode)(THIS_ DWORD dwFlags) PURE; - STDMETHOD_(DWORD, GetRenderMode)(THIS) PURE; - STDMETHOD(GetDirect3DDevice2)(THIS_ LPDIRECT3DDEVICE2 *) PURE; - - /* - * IDirect3DRMDevice3 methods - */ - STDMETHOD(FindPreferredTextureFormat)(THIS_ DWORD dwBitDepths, DWORD dwFlags, LPDDPIXELFORMAT lpDDPF) PURE; - STDMETHOD(RenderStateChange)(THIS_ D3DRENDERSTATETYPE drsType, DWORD dwVal, DWORD dwFlags) PURE; - STDMETHOD(LightStateChange)(THIS_ D3DLIGHTSTATETYPE drsType, DWORD dwVal, DWORD dwFlags) PURE; - STDMETHOD(GetStateChangeOptions)(THIS_ DWORD dwStateClass, DWORD dwStateNum, LPDWORD pdwFlags) PURE; - STDMETHOD(SetStateChangeOptions)(THIS_ DWORD dwStateClass, DWORD dwStateNum, DWORD dwFlags) PURE; -}; - - -#undef INTERFACE -#define INTERFACE IDirect3DRMViewport - -DECLARE_INTERFACE_(IDirect3DRMViewport, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMViewport methods - */ - STDMETHOD(Init) - ( THIS_ LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMFRAME camera, - DWORD xpos, DWORD ypos, DWORD width, DWORD height - ) PURE; - STDMETHOD(Clear)(THIS) PURE; - STDMETHOD(Render)(THIS_ LPDIRECT3DRMFRAME) PURE; - - STDMETHOD(SetFront)(THIS_ D3DVALUE) PURE; - STDMETHOD(SetBack)(THIS_ D3DVALUE) PURE; - STDMETHOD(SetField)(THIS_ D3DVALUE) PURE; - STDMETHOD(SetUniformScaling)(THIS_ BOOL) PURE; - STDMETHOD(SetCamera)(THIS_ LPDIRECT3DRMFRAME) PURE; - STDMETHOD(SetProjection)(THIS_ D3DRMPROJECTIONTYPE) PURE; - STDMETHOD(Transform)(THIS_ D3DRMVECTOR4D *d, D3DVECTOR *s) PURE; - STDMETHOD(InverseTransform)(THIS_ D3DVECTOR *d, D3DRMVECTOR4D *s) PURE; - STDMETHOD(Configure)(THIS_ LONG x, LONG y, DWORD width, DWORD height) PURE; - STDMETHOD(ForceUpdate)(THIS_ DWORD x1, DWORD y1, DWORD x2, DWORD y2) PURE; - STDMETHOD(SetPlane)(THIS_ D3DVALUE left, D3DVALUE right, D3DVALUE bottom, D3DVALUE top) PURE; - - STDMETHOD(GetCamera)(THIS_ LPDIRECT3DRMFRAME *) PURE; - STDMETHOD(GetDevice)(THIS_ LPDIRECT3DRMDEVICE *) PURE; - STDMETHOD(GetPlane)(THIS_ D3DVALUE *left, D3DVALUE *right, D3DVALUE *bottom, D3DVALUE *top) PURE; - STDMETHOD(Pick)(THIS_ LONG x, LONG y, LPDIRECT3DRMPICKEDARRAY *return_visuals) PURE; - - STDMETHOD_(BOOL, GetUniformScaling)(THIS) PURE; - STDMETHOD_(LONG, GetX)(THIS) PURE; - STDMETHOD_(LONG, GetY)(THIS) PURE; - STDMETHOD_(DWORD, GetWidth)(THIS) PURE; - STDMETHOD_(DWORD, GetHeight)(THIS) PURE; - STDMETHOD_(D3DVALUE, GetField)(THIS) PURE; - STDMETHOD_(D3DVALUE, GetBack)(THIS) PURE; - STDMETHOD_(D3DVALUE, GetFront)(THIS) PURE; - STDMETHOD_(D3DRMPROJECTIONTYPE, GetProjection)(THIS) PURE; - STDMETHOD(GetDirect3DViewport)(THIS_ LPDIRECT3DVIEWPORT *) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMViewport2 -DECLARE_INTERFACE_(IDirect3DRMViewport2, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMViewport2 methods - */ - STDMETHOD(Init) - ( THIS_ LPDIRECT3DRMDEVICE3 dev, LPDIRECT3DRMFRAME3 camera, - DWORD xpos, DWORD ypos, DWORD width, DWORD height - ) PURE; - STDMETHOD(Clear)(THIS_ DWORD dwFlags) PURE; - STDMETHOD(Render)(THIS_ LPDIRECT3DRMFRAME3) PURE; - - STDMETHOD(SetFront)(THIS_ D3DVALUE) PURE; - STDMETHOD(SetBack)(THIS_ D3DVALUE) PURE; - STDMETHOD(SetField)(THIS_ D3DVALUE) PURE; - STDMETHOD(SetUniformScaling)(THIS_ BOOL) PURE; - STDMETHOD(SetCamera)(THIS_ LPDIRECT3DRMFRAME3) PURE; - STDMETHOD(SetProjection)(THIS_ D3DRMPROJECTIONTYPE) PURE; - STDMETHOD(Transform)(THIS_ D3DRMVECTOR4D *d, D3DVECTOR *s) PURE; - STDMETHOD(InverseTransform)(THIS_ D3DVECTOR *d, D3DRMVECTOR4D *s) PURE; - STDMETHOD(Configure)(THIS_ LONG x, LONG y, DWORD width, DWORD height) PURE; - STDMETHOD(ForceUpdate)(THIS_ DWORD x1, DWORD y1, DWORD x2, DWORD y2) PURE; - STDMETHOD(SetPlane)(THIS_ D3DVALUE left, D3DVALUE right, D3DVALUE bottom, D3DVALUE top) PURE; - - STDMETHOD(GetCamera)(THIS_ LPDIRECT3DRMFRAME3 *) PURE; - STDMETHOD(GetDevice)(THIS_ LPDIRECT3DRMDEVICE3 *) PURE; - STDMETHOD(GetPlane)(THIS_ D3DVALUE *left, D3DVALUE *right, D3DVALUE *bottom, D3DVALUE *top) PURE; - STDMETHOD(Pick)(THIS_ LONG x, LONG y, LPDIRECT3DRMPICKEDARRAY *return_visuals) PURE; - - STDMETHOD_(BOOL, GetUniformScaling)(THIS) PURE; - STDMETHOD_(LONG, GetX)(THIS) PURE; - STDMETHOD_(LONG, GetY)(THIS) PURE; - STDMETHOD_(DWORD, GetWidth)(THIS) PURE; - STDMETHOD_(DWORD, GetHeight)(THIS) PURE; - STDMETHOD_(D3DVALUE, GetField)(THIS) PURE; - STDMETHOD_(D3DVALUE, GetBack)(THIS) PURE; - STDMETHOD_(D3DVALUE, GetFront)(THIS) PURE; - STDMETHOD_(D3DRMPROJECTIONTYPE, GetProjection)(THIS) PURE; - STDMETHOD(GetDirect3DViewport)(THIS_ LPDIRECT3DVIEWPORT *) PURE; - STDMETHOD(TransformVectors)(THIS_ DWORD dwNumVectors, - LPD3DRMVECTOR4D lpDstVectors, - LPD3DVECTOR lpSrcVectors) PURE; - STDMETHOD(InverseTransformVectors)(THIS_ DWORD dwNumVectors, - LPD3DVECTOR lpDstVectors, - LPD3DRMVECTOR4D lpSrcVectors) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMFrame - -DECLARE_INTERFACE_(IDirect3DRMFrame, IDirect3DRMVisual) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMFrame methods - */ - STDMETHOD(AddChild)(THIS_ LPDIRECT3DRMFRAME child) PURE; - STDMETHOD(AddLight)(THIS_ LPDIRECT3DRMLIGHT) PURE; - STDMETHOD(AddMoveCallback)(THIS_ D3DRMFRAMEMOVECALLBACK, VOID *arg) PURE; - STDMETHOD(AddTransform)(THIS_ D3DRMCOMBINETYPE, D3DRMMATRIX4D) PURE; - STDMETHOD(AddTranslation)(THIS_ D3DRMCOMBINETYPE, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(AddScale)(THIS_ D3DRMCOMBINETYPE, D3DVALUE sx, D3DVALUE sy, D3DVALUE sz) PURE; - STDMETHOD(AddRotation)(THIS_ D3DRMCOMBINETYPE, D3DVALUE x, D3DVALUE y, D3DVALUE z, D3DVALUE theta) PURE; - STDMETHOD(AddVisual)(THIS_ LPDIRECT3DRMVISUAL) PURE; - STDMETHOD(GetChildren)(THIS_ LPDIRECT3DRMFRAMEARRAY *children) PURE; - STDMETHOD_(D3DCOLOR, GetColor)(THIS) PURE; - STDMETHOD(GetLights)(THIS_ LPDIRECT3DRMLIGHTARRAY *lights) PURE; - STDMETHOD_(D3DRMMATERIALMODE, GetMaterialMode)(THIS) PURE; - STDMETHOD(GetParent)(THIS_ LPDIRECT3DRMFRAME *) PURE; - STDMETHOD(GetPosition)(THIS_ LPDIRECT3DRMFRAME reference, LPD3DVECTOR return_position) PURE; - STDMETHOD(GetRotation)(THIS_ LPDIRECT3DRMFRAME reference, LPD3DVECTOR axis, LPD3DVALUE return_theta) PURE; - STDMETHOD(GetScene)(THIS_ LPDIRECT3DRMFRAME *) PURE; - STDMETHOD_(D3DRMSORTMODE, GetSortMode)(THIS) PURE; - STDMETHOD(GetTexture)(THIS_ LPDIRECT3DRMTEXTURE *) PURE; - STDMETHOD(GetTransform)(THIS_ D3DRMMATRIX4D return_matrix) PURE; - STDMETHOD(GetVelocity)(THIS_ LPDIRECT3DRMFRAME reference, LPD3DVECTOR return_velocity, BOOL with_rotation) PURE; - STDMETHOD(GetOrientation)(THIS_ LPDIRECT3DRMFRAME reference, LPD3DVECTOR dir, LPD3DVECTOR up) PURE; - STDMETHOD(GetVisuals)(THIS_ LPDIRECT3DRMVISUALARRAY *visuals) PURE; - STDMETHOD(GetTextureTopology)(THIS_ BOOL *wrap_u, BOOL *wrap_v) PURE; - STDMETHOD(InverseTransform)(THIS_ D3DVECTOR *d, D3DVECTOR *s) PURE; - STDMETHOD(Load)(THIS_ LPVOID filename, LPVOID name, D3DRMLOADOPTIONS loadflags, D3DRMLOADTEXTURECALLBACK, LPVOID lpArg)PURE; - STDMETHOD(LookAt)(THIS_ LPDIRECT3DRMFRAME target, LPDIRECT3DRMFRAME reference, D3DRMFRAMECONSTRAINT) PURE; - STDMETHOD(Move)(THIS_ D3DVALUE delta) PURE; - STDMETHOD(DeleteChild)(THIS_ LPDIRECT3DRMFRAME) PURE; - STDMETHOD(DeleteLight)(THIS_ LPDIRECT3DRMLIGHT) PURE; - STDMETHOD(DeleteMoveCallback)(THIS_ D3DRMFRAMEMOVECALLBACK, VOID *arg) PURE; - STDMETHOD(DeleteVisual)(THIS_ LPDIRECT3DRMVISUAL) PURE; - STDMETHOD_(D3DCOLOR, GetSceneBackground)(THIS) PURE; - STDMETHOD(GetSceneBackgroundDepth)(THIS_ LPDIRECTDRAWSURFACE *) PURE; - STDMETHOD_(D3DCOLOR, GetSceneFogColor)(THIS) PURE; - STDMETHOD_(BOOL, GetSceneFogEnable)(THIS) PURE; - STDMETHOD_(D3DRMFOGMODE, GetSceneFogMode)(THIS) PURE; - STDMETHOD(GetSceneFogParams)(THIS_ D3DVALUE *return_start, D3DVALUE *return_end, D3DVALUE *return_density) PURE; - STDMETHOD(SetSceneBackground)(THIS_ D3DCOLOR) PURE; - STDMETHOD(SetSceneBackgroundRGB)(THIS_ D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE; - STDMETHOD(SetSceneBackgroundDepth)(THIS_ LPDIRECTDRAWSURFACE) PURE; - STDMETHOD(SetSceneBackgroundImage)(THIS_ LPDIRECT3DRMTEXTURE) PURE; - STDMETHOD(SetSceneFogEnable)(THIS_ BOOL) PURE; - STDMETHOD(SetSceneFogColor)(THIS_ D3DCOLOR) PURE; - STDMETHOD(SetSceneFogMode)(THIS_ D3DRMFOGMODE) PURE; - STDMETHOD(SetSceneFogParams)(THIS_ D3DVALUE start, D3DVALUE end, D3DVALUE density) PURE; - STDMETHOD(SetColor)(THIS_ D3DCOLOR) PURE; - STDMETHOD(SetColorRGB)(THIS_ D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE; - STDMETHOD_(D3DRMZBUFFERMODE, GetZbufferMode)(THIS) PURE; - STDMETHOD(SetMaterialMode)(THIS_ D3DRMMATERIALMODE) PURE; - STDMETHOD(SetOrientation) - ( THIS_ LPDIRECT3DRMFRAME reference, - D3DVALUE dx, D3DVALUE dy, D3DVALUE dz, - D3DVALUE ux, D3DVALUE uy, D3DVALUE uz - ) PURE; - STDMETHOD(SetPosition)(THIS_ LPDIRECT3DRMFRAME reference, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(SetRotation)(THIS_ LPDIRECT3DRMFRAME reference, D3DVALUE x, D3DVALUE y, D3DVALUE z, D3DVALUE theta) PURE; - STDMETHOD(SetSortMode)(THIS_ D3DRMSORTMODE) PURE; - STDMETHOD(SetTexture)(THIS_ LPDIRECT3DRMTEXTURE) PURE; - STDMETHOD(SetTextureTopology)(THIS_ BOOL wrap_u, BOOL wrap_v) PURE; - STDMETHOD(SetVelocity)(THIS_ LPDIRECT3DRMFRAME reference, D3DVALUE x, D3DVALUE y, D3DVALUE z, BOOL with_rotation) PURE; - STDMETHOD(SetZbufferMode)(THIS_ D3DRMZBUFFERMODE) PURE; - STDMETHOD(Transform)(THIS_ D3DVECTOR *d, D3DVECTOR *s) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMFrame2 - -DECLARE_INTERFACE_(IDirect3DRMFrame2, IDirect3DRMFrame) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMFrame methods - */ - STDMETHOD(AddChild)(THIS_ LPDIRECT3DRMFRAME child) PURE; - STDMETHOD(AddLight)(THIS_ LPDIRECT3DRMLIGHT) PURE; - STDMETHOD(AddMoveCallback)(THIS_ D3DRMFRAMEMOVECALLBACK, VOID *arg) PURE; - STDMETHOD(AddTransform)(THIS_ D3DRMCOMBINETYPE, D3DRMMATRIX4D) PURE; - STDMETHOD(AddTranslation)(THIS_ D3DRMCOMBINETYPE, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(AddScale)(THIS_ D3DRMCOMBINETYPE, D3DVALUE sx, D3DVALUE sy, D3DVALUE sz) PURE; - STDMETHOD(AddRotation)(THIS_ D3DRMCOMBINETYPE, D3DVALUE x, D3DVALUE y, D3DVALUE z, D3DVALUE theta) PURE; - STDMETHOD(AddVisual)(THIS_ LPDIRECT3DRMVISUAL) PURE; - STDMETHOD(GetChildren)(THIS_ LPDIRECT3DRMFRAMEARRAY *children) PURE; - STDMETHOD_(D3DCOLOR, GetColor)(THIS) PURE; - STDMETHOD(GetLights)(THIS_ LPDIRECT3DRMLIGHTARRAY *lights) PURE; - STDMETHOD_(D3DRMMATERIALMODE, GetMaterialMode)(THIS) PURE; - STDMETHOD(GetParent)(THIS_ LPDIRECT3DRMFRAME *) PURE; - STDMETHOD(GetPosition)(THIS_ LPDIRECT3DRMFRAME reference, LPD3DVECTOR return_position) PURE; - STDMETHOD(GetRotation)(THIS_ LPDIRECT3DRMFRAME reference, LPD3DVECTOR axis, LPD3DVALUE return_theta) PURE; - STDMETHOD(GetScene)(THIS_ LPDIRECT3DRMFRAME *) PURE; - STDMETHOD_(D3DRMSORTMODE, GetSortMode)(THIS) PURE; - STDMETHOD(GetTexture)(THIS_ LPDIRECT3DRMTEXTURE *) PURE; - STDMETHOD(GetTransform)(THIS_ D3DRMMATRIX4D return_matrix) PURE; - STDMETHOD(GetVelocity)(THIS_ LPDIRECT3DRMFRAME reference, LPD3DVECTOR return_velocity, BOOL with_rotation) PURE; - STDMETHOD(GetOrientation)(THIS_ LPDIRECT3DRMFRAME reference, LPD3DVECTOR dir, LPD3DVECTOR up) PURE; - STDMETHOD(GetVisuals)(THIS_ LPDIRECT3DRMVISUALARRAY *visuals) PURE; - STDMETHOD(GetTextureTopology)(THIS_ BOOL *wrap_u, BOOL *wrap_v) PURE; - STDMETHOD(InverseTransform)(THIS_ D3DVECTOR *d, D3DVECTOR *s) PURE; - STDMETHOD(Load)(THIS_ LPVOID filename, LPVOID name, D3DRMLOADOPTIONS loadflags, D3DRMLOADTEXTURECALLBACK, LPVOID lpArg)PURE; - STDMETHOD(LookAt)(THIS_ LPDIRECT3DRMFRAME target, LPDIRECT3DRMFRAME reference, D3DRMFRAMECONSTRAINT) PURE; - STDMETHOD(Move)(THIS_ D3DVALUE delta) PURE; - STDMETHOD(DeleteChild)(THIS_ LPDIRECT3DRMFRAME) PURE; - STDMETHOD(DeleteLight)(THIS_ LPDIRECT3DRMLIGHT) PURE; - STDMETHOD(DeleteMoveCallback)(THIS_ D3DRMFRAMEMOVECALLBACK, VOID *arg) PURE; - STDMETHOD(DeleteVisual)(THIS_ LPDIRECT3DRMVISUAL) PURE; - STDMETHOD_(D3DCOLOR, GetSceneBackground)(THIS) PURE; - STDMETHOD(GetSceneBackgroundDepth)(THIS_ LPDIRECTDRAWSURFACE *) PURE; - STDMETHOD_(D3DCOLOR, GetSceneFogColor)(THIS) PURE; - STDMETHOD_(BOOL, GetSceneFogEnable)(THIS) PURE; - STDMETHOD_(D3DRMFOGMODE, GetSceneFogMode)(THIS) PURE; - STDMETHOD(GetSceneFogParams)(THIS_ D3DVALUE *return_start, D3DVALUE *return_end, D3DVALUE *return_density) PURE; - STDMETHOD(SetSceneBackground)(THIS_ D3DCOLOR) PURE; - STDMETHOD(SetSceneBackgroundRGB)(THIS_ D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE; - STDMETHOD(SetSceneBackgroundDepth)(THIS_ LPDIRECTDRAWSURFACE) PURE; - STDMETHOD(SetSceneBackgroundImage)(THIS_ LPDIRECT3DRMTEXTURE) PURE; - STDMETHOD(SetSceneFogEnable)(THIS_ BOOL) PURE; - STDMETHOD(SetSceneFogColor)(THIS_ D3DCOLOR) PURE; - STDMETHOD(SetSceneFogMode)(THIS_ D3DRMFOGMODE) PURE; - STDMETHOD(SetSceneFogParams)(THIS_ D3DVALUE start, D3DVALUE end, D3DVALUE density) PURE; - STDMETHOD(SetColor)(THIS_ D3DCOLOR) PURE; - STDMETHOD(SetColorRGB)(THIS_ D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE; - STDMETHOD_(D3DRMZBUFFERMODE, GetZbufferMode)(THIS) PURE; - STDMETHOD(SetMaterialMode)(THIS_ D3DRMMATERIALMODE) PURE; - STDMETHOD(SetOrientation) - ( THIS_ LPDIRECT3DRMFRAME reference, - D3DVALUE dx, D3DVALUE dy, D3DVALUE dz, - D3DVALUE ux, D3DVALUE uy, D3DVALUE uz - ) PURE; - STDMETHOD(SetPosition)(THIS_ LPDIRECT3DRMFRAME reference, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(SetRotation)(THIS_ LPDIRECT3DRMFRAME reference, D3DVALUE x, D3DVALUE y, D3DVALUE z, D3DVALUE theta) PURE; - STDMETHOD(SetSortMode)(THIS_ D3DRMSORTMODE) PURE; - STDMETHOD(SetTexture)(THIS_ LPDIRECT3DRMTEXTURE) PURE; - STDMETHOD(SetTextureTopology)(THIS_ BOOL wrap_u, BOOL wrap_v) PURE; - STDMETHOD(SetVelocity)(THIS_ LPDIRECT3DRMFRAME reference, D3DVALUE x, D3DVALUE y, D3DVALUE z, BOOL with_rotation) PURE; - STDMETHOD(SetZbufferMode)(THIS_ D3DRMZBUFFERMODE) PURE; - STDMETHOD(Transform)(THIS_ D3DVECTOR *d, D3DVECTOR *s) PURE; - - /* - * IDirect3DRMFrame2 methods - */ - STDMETHOD(AddMoveCallback2)(THIS_ D3DRMFRAMEMOVECALLBACK, VOID *arg, DWORD dwFlags) PURE; - STDMETHOD(GetBox)(THIS_ LPD3DRMBOX) PURE; - STDMETHOD_(BOOL, GetBoxEnable)(THIS) PURE; - STDMETHOD(GetAxes)(THIS_ LPD3DVECTOR dir, LPD3DVECTOR up); - STDMETHOD(GetMaterial)(THIS_ LPDIRECT3DRMMATERIAL *) PURE; - STDMETHOD_(BOOL, GetInheritAxes)(THIS); - STDMETHOD(GetHierarchyBox)(THIS_ LPD3DRMBOX) PURE; - - STDMETHOD(SetBox)(THIS_ LPD3DRMBOX) PURE; - STDMETHOD(SetBoxEnable)(THIS_ BOOL) PURE; - STDMETHOD(SetAxes)(THIS_ D3DVALUE dx, D3DVALUE dy, D3DVALUE dz, - D3DVALUE ux, D3DVALUE uy, D3DVALUE uz); - STDMETHOD(SetInheritAxes)(THIS_ BOOL inherit_from_parent); - STDMETHOD(SetMaterial)(THIS_ LPDIRECT3DRMMATERIAL) PURE; - STDMETHOD(SetQuaternion)(THIS_ LPDIRECT3DRMFRAME reference, D3DRMQUATERNION *q) PURE; - - STDMETHOD(RayPick)(THIS_ LPDIRECT3DRMFRAME reference, LPD3DRMRAY ray, DWORD dwFlags, LPDIRECT3DRMPICKED2ARRAY *return_visuals) PURE; - STDMETHOD(Save)(THIS_ LPCSTR filename, D3DRMXOFFORMAT d3dFormat, - D3DRMSAVEOPTIONS d3dSaveFlags); -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMFrame3 - -DECLARE_INTERFACE_(IDirect3DRMFrame3, IDirect3DRMVisual) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMFrame3 methods - */ - STDMETHOD(AddChild)(THIS_ LPDIRECT3DRMFRAME3 child) PURE; - STDMETHOD(AddLight)(THIS_ LPDIRECT3DRMLIGHT) PURE; - STDMETHOD(AddMoveCallback)(THIS_ D3DRMFRAME3MOVECALLBACK, VOID *arg, DWORD dwFlags) PURE; - STDMETHOD(AddTransform)(THIS_ D3DRMCOMBINETYPE, D3DRMMATRIX4D) PURE; - STDMETHOD(AddTranslation)(THIS_ D3DRMCOMBINETYPE, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(AddScale)(THIS_ D3DRMCOMBINETYPE, D3DVALUE sx, D3DVALUE sy, D3DVALUE sz) PURE; - STDMETHOD(AddRotation)(THIS_ D3DRMCOMBINETYPE, D3DVALUE x, D3DVALUE y, D3DVALUE z, D3DVALUE theta) PURE; - STDMETHOD(AddVisual)(THIS_ LPUNKNOWN) PURE; - STDMETHOD(GetChildren)(THIS_ LPDIRECT3DRMFRAMEARRAY *children) PURE; - STDMETHOD_(D3DCOLOR, GetColor)(THIS) PURE; - STDMETHOD(GetLights)(THIS_ LPDIRECT3DRMLIGHTARRAY *lights) PURE; - STDMETHOD_(D3DRMMATERIALMODE, GetMaterialMode)(THIS) PURE; - STDMETHOD(GetParent)(THIS_ LPDIRECT3DRMFRAME3 *) PURE; - STDMETHOD(GetPosition)(THIS_ LPDIRECT3DRMFRAME3 reference, LPD3DVECTOR return_position) PURE; - STDMETHOD(GetRotation)(THIS_ LPDIRECT3DRMFRAME3 reference, LPD3DVECTOR axis, LPD3DVALUE return_theta) PURE; - STDMETHOD(GetScene)(THIS_ LPDIRECT3DRMFRAME3 *) PURE; - STDMETHOD_(D3DRMSORTMODE, GetSortMode)(THIS) PURE; - STDMETHOD(GetTexture)(THIS_ LPDIRECT3DRMTEXTURE3 *) PURE; - STDMETHOD(GetTransform)(THIS_ LPDIRECT3DRMFRAME3 reference, - D3DRMMATRIX4D rmMatrix) PURE; - STDMETHOD(GetVelocity)(THIS_ LPDIRECT3DRMFRAME3 reference, LPD3DVECTOR return_velocity, BOOL with_rotation) PURE; - STDMETHOD(GetOrientation)(THIS_ LPDIRECT3DRMFRAME3 reference, LPD3DVECTOR dir, LPD3DVECTOR up) PURE; - STDMETHOD(GetVisuals)(THIS_ LPDWORD lpdwCount, LPUNKNOWN *) PURE; - STDMETHOD(InverseTransform)(THIS_ D3DVECTOR *d, D3DVECTOR *s) PURE; - STDMETHOD(Load)(THIS_ LPVOID filename, LPVOID name, D3DRMLOADOPTIONS loadflags, D3DRMLOADTEXTURE3CALLBACK, LPVOID lpArg)PURE; - STDMETHOD(LookAt)(THIS_ LPDIRECT3DRMFRAME3 target, LPDIRECT3DRMFRAME3 reference, D3DRMFRAMECONSTRAINT) PURE; - STDMETHOD(Move)(THIS_ D3DVALUE delta) PURE; - STDMETHOD(DeleteChild)(THIS_ LPDIRECT3DRMFRAME3) PURE; - STDMETHOD(DeleteLight)(THIS_ LPDIRECT3DRMLIGHT) PURE; - STDMETHOD(DeleteMoveCallback)(THIS_ D3DRMFRAME3MOVECALLBACK, VOID *arg) PURE; - STDMETHOD(DeleteVisual)(THIS_ LPUNKNOWN) PURE; - STDMETHOD_(D3DCOLOR, GetSceneBackground)(THIS) PURE; - STDMETHOD(GetSceneBackgroundDepth)(THIS_ LPDIRECTDRAWSURFACE *) PURE; - STDMETHOD_(D3DCOLOR, GetSceneFogColor)(THIS) PURE; - STDMETHOD_(BOOL, GetSceneFogEnable)(THIS) PURE; - STDMETHOD_(D3DRMFOGMODE, GetSceneFogMode)(THIS) PURE; - STDMETHOD(GetSceneFogParams)(THIS_ D3DVALUE *return_start, D3DVALUE *return_end, D3DVALUE *return_density) PURE; - STDMETHOD(SetSceneBackground)(THIS_ D3DCOLOR) PURE; - STDMETHOD(SetSceneBackgroundRGB)(THIS_ D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE; - STDMETHOD(SetSceneBackgroundDepth)(THIS_ LPDIRECTDRAWSURFACE) PURE; - STDMETHOD(SetSceneBackgroundImage)(THIS_ LPDIRECT3DRMTEXTURE3) PURE; - STDMETHOD(SetSceneFogEnable)(THIS_ BOOL) PURE; - STDMETHOD(SetSceneFogColor)(THIS_ D3DCOLOR) PURE; - STDMETHOD(SetSceneFogMode)(THIS_ D3DRMFOGMODE) PURE; - STDMETHOD(SetSceneFogParams)(THIS_ D3DVALUE start, D3DVALUE end, D3DVALUE density) PURE; - STDMETHOD(SetColor)(THIS_ D3DCOLOR) PURE; - STDMETHOD(SetColorRGB)(THIS_ D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE; - STDMETHOD_(D3DRMZBUFFERMODE, GetZbufferMode)(THIS) PURE; - STDMETHOD(SetMaterialMode)(THIS_ D3DRMMATERIALMODE) PURE; - STDMETHOD(SetOrientation) - ( THIS_ LPDIRECT3DRMFRAME3 reference, - D3DVALUE dx, D3DVALUE dy, D3DVALUE dz, - D3DVALUE ux, D3DVALUE uy, D3DVALUE uz - ) PURE; - STDMETHOD(SetPosition)(THIS_ LPDIRECT3DRMFRAME3 reference, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(SetRotation)(THIS_ LPDIRECT3DRMFRAME3 reference, D3DVALUE x, D3DVALUE y, D3DVALUE z, D3DVALUE theta) PURE; - STDMETHOD(SetSortMode)(THIS_ D3DRMSORTMODE) PURE; - STDMETHOD(SetTexture)(THIS_ LPDIRECT3DRMTEXTURE3) PURE; - STDMETHOD(SetVelocity)(THIS_ LPDIRECT3DRMFRAME3 reference, D3DVALUE x, D3DVALUE y, D3DVALUE z, BOOL with_rotation) PURE; - STDMETHOD(SetZbufferMode)(THIS_ D3DRMZBUFFERMODE) PURE; - STDMETHOD(Transform)(THIS_ D3DVECTOR *d, D3DVECTOR *s) PURE; - STDMETHOD(GetBox)(THIS_ LPD3DRMBOX) PURE; - STDMETHOD_(BOOL, GetBoxEnable)(THIS) PURE; - STDMETHOD(GetAxes)(THIS_ LPD3DVECTOR dir, LPD3DVECTOR up); - STDMETHOD(GetMaterial)(THIS_ LPDIRECT3DRMMATERIAL2 *) PURE; - STDMETHOD_(BOOL, GetInheritAxes)(THIS); - STDMETHOD(GetHierarchyBox)(THIS_ LPD3DRMBOX) PURE; - - STDMETHOD(SetBox)(THIS_ LPD3DRMBOX) PURE; - STDMETHOD(SetBoxEnable)(THIS_ BOOL) PURE; - STDMETHOD(SetAxes)(THIS_ D3DVALUE dx, D3DVALUE dy, D3DVALUE dz, - D3DVALUE ux, D3DVALUE uy, D3DVALUE uz); - STDMETHOD(SetInheritAxes)(THIS_ BOOL inherit_from_parent); - STDMETHOD(SetMaterial)(THIS_ LPDIRECT3DRMMATERIAL2) PURE; - STDMETHOD(SetQuaternion)(THIS_ LPDIRECT3DRMFRAME3 reference, D3DRMQUATERNION *q) PURE; - - STDMETHOD(RayPick)(THIS_ LPDIRECT3DRMFRAME3 reference, LPD3DRMRAY ray, DWORD dwFlags, LPDIRECT3DRMPICKED2ARRAY *return_visuals) PURE; - STDMETHOD(Save)(THIS_ LPCSTR filename, D3DRMXOFFORMAT d3dFormat, - D3DRMSAVEOPTIONS d3dSaveFlags); - STDMETHOD(TransformVectors)(THIS_ LPDIRECT3DRMFRAME3 reference, - DWORD dwNumVectors, - LPD3DVECTOR lpDstVectors, - LPD3DVECTOR lpSrcVectors) PURE; - STDMETHOD(InverseTransformVectors)(THIS_ LPDIRECT3DRMFRAME3 reference, - DWORD dwNumVectors, - LPD3DVECTOR lpDstVectors, - LPD3DVECTOR lpSrcVectors) PURE; - STDMETHOD(SetTraversalOptions)(THIS_ DWORD dwFlags) PURE; - STDMETHOD(GetTraversalOptions)(THIS_ LPDWORD lpdwFlags) PURE; - STDMETHOD(SetSceneFogMethod)(THIS_ DWORD dwFlags) PURE; - STDMETHOD(GetSceneFogMethod)(THIS_ LPDWORD lpdwFlags) PURE; - STDMETHOD(SetMaterialOverride)(THIS_ LPD3DRMMATERIALOVERRIDE) PURE; - STDMETHOD(GetMaterialOverride)(THIS_ LPD3DRMMATERIALOVERRIDE) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMMesh - -DECLARE_INTERFACE_(IDirect3DRMMesh, IDirect3DRMVisual) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMMesh methods - */ - STDMETHOD(Scale)(THIS_ D3DVALUE sx, D3DVALUE sy, D3DVALUE sz) PURE; - STDMETHOD(Translate)(THIS_ D3DVALUE tx, D3DVALUE ty, D3DVALUE tz) PURE; - STDMETHOD(GetBox)(THIS_ D3DRMBOX *) PURE; - STDMETHOD(AddGroup)(THIS_ unsigned vCount, unsigned fCount, unsigned vPerFace, unsigned *fData, D3DRMGROUPINDEX *returnId) PURE; - STDMETHOD(SetVertices)(THIS_ D3DRMGROUPINDEX id, unsigned index, unsigned count, D3DRMVERTEX *values) PURE; - STDMETHOD(SetGroupColor)(THIS_ D3DRMGROUPINDEX id, D3DCOLOR value) PURE; - STDMETHOD(SetGroupColorRGB)(THIS_ D3DRMGROUPINDEX id, D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE; - STDMETHOD(SetGroupMapping)(THIS_ D3DRMGROUPINDEX id, D3DRMMAPPING value) PURE; - STDMETHOD(SetGroupQuality)(THIS_ D3DRMGROUPINDEX id, D3DRMRENDERQUALITY value) PURE; - STDMETHOD(SetGroupMaterial)(THIS_ D3DRMGROUPINDEX id, LPDIRECT3DRMMATERIAL value) PURE; - STDMETHOD(SetGroupTexture)(THIS_ D3DRMGROUPINDEX id, LPDIRECT3DRMTEXTURE value) PURE; - - STDMETHOD_(unsigned, GetGroupCount)(THIS) PURE; - STDMETHOD(GetGroup)(THIS_ D3DRMGROUPINDEX id, unsigned *vCount, unsigned *fCount, unsigned *vPerFace, DWORD *fDataSize, unsigned *fData) PURE; - STDMETHOD(GetVertices)(THIS_ D3DRMGROUPINDEX id, DWORD index, DWORD count, D3DRMVERTEX *returnPtr) PURE; - STDMETHOD_(D3DCOLOR, GetGroupColor)(THIS_ D3DRMGROUPINDEX id) PURE; - STDMETHOD_(D3DRMMAPPING, GetGroupMapping)(THIS_ D3DRMGROUPINDEX id) PURE; - STDMETHOD_(D3DRMRENDERQUALITY, GetGroupQuality)(THIS_ D3DRMGROUPINDEX id) PURE; - STDMETHOD(GetGroupMaterial)(THIS_ D3DRMGROUPINDEX id, LPDIRECT3DRMMATERIAL *returnPtr) PURE; - STDMETHOD(GetGroupTexture)(THIS_ D3DRMGROUPINDEX id, LPDIRECT3DRMTEXTURE *returnPtr) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMProgressiveMesh - -DECLARE_INTERFACE_(IDirect3DRMProgressiveMesh, IDirect3DRMVisual) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMProgressiveMesh methods - */ - STDMETHOD(Load) (THIS_ LPVOID lpObjLocation, LPVOID lpObjId, - D3DRMLOADOPTIONS dloLoadflags, D3DRMLOADTEXTURECALLBACK lpCallback, - LPVOID lpArg) PURE; - STDMETHOD(GetLoadStatus) (THIS_ LPD3DRMPMESHLOADSTATUS lpStatus) PURE; - STDMETHOD(SetMinRenderDetail) (THIS_ D3DVALUE d3dVal) PURE; - STDMETHOD(Abort) (THIS_ DWORD dwFlags) PURE; - - STDMETHOD(GetFaceDetail) (THIS_ LPDWORD lpdwCount) PURE; - STDMETHOD(GetVertexDetail) (THIS_ LPDWORD lpdwCount) PURE; - STDMETHOD(SetFaceDetail) (THIS_ DWORD dwCount) PURE; - STDMETHOD(SetVertexDetail) (THIS_ DWORD dwCount) PURE; - STDMETHOD(GetFaceDetailRange) (THIS_ LPDWORD lpdwMin, LPDWORD lpdwMax) PURE; - STDMETHOD(GetVertexDetailRange) (THIS_ LPDWORD lpdwMin, LPDWORD lpdwMax) PURE; - STDMETHOD(GetDetail) (THIS_ D3DVALUE *lpdvVal) PURE; - STDMETHOD(SetDetail) (THIS_ D3DVALUE d3dVal) PURE; - - STDMETHOD(RegisterEvents) (THIS_ HANDLE hEvent, DWORD dwFlags, DWORD dwReserved) PURE; - STDMETHOD(CreateMesh) (THIS_ LPDIRECT3DRMMESH *lplpD3DRMMesh) PURE; - STDMETHOD(Duplicate) (THIS_ LPDIRECT3DRMPROGRESSIVEMESH *lplpD3DRMPMesh) PURE; - STDMETHOD(GetBox) (THIS_ LPD3DRMBOX lpBBox) PURE; - STDMETHOD(SetQuality) (THIS_ D3DRMRENDERQUALITY) PURE; - STDMETHOD(GetQuality) (THIS_ LPD3DRMRENDERQUALITY lpdwquality) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMShadow - -DECLARE_INTERFACE_(IDirect3DRMShadow, IDirect3DRMVisual) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMShadow methods - */ - STDMETHOD(Init) - ( THIS_ LPDIRECT3DRMVISUAL visual, LPDIRECT3DRMLIGHT light, - D3DVALUE px, D3DVALUE py, D3DVALUE pz, - D3DVALUE nx, D3DVALUE ny, D3DVALUE nz - ) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMShadow2 - -DECLARE_INTERFACE_(IDirect3DRMShadow2, IDirect3DRMVisual) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMShadow methods - */ - STDMETHOD(Init) - ( THIS_ LPUNKNOWN pUNK, LPDIRECT3DRMLIGHT light, - D3DVALUE px, D3DVALUE py, D3DVALUE pz, - D3DVALUE nx, D3DVALUE ny, D3DVALUE nz - ) PURE; - - /* - * IDirect3DRMShadow2 methods - */ - STDMETHOD(GetVisual)(THIS_ LPDIRECT3DRMVISUAL *) PURE; - STDMETHOD(SetVisual)(THIS_ LPUNKNOWN pUNK, DWORD) PURE; - STDMETHOD(GetLight)(THIS_ LPDIRECT3DRMLIGHT *) PURE; - STDMETHOD(SetLight)(THIS_ LPDIRECT3DRMLIGHT, DWORD) PURE; - STDMETHOD(GetPlane)(THIS_ LPD3DVALUE px, LPD3DVALUE py, LPD3DVALUE pz, - LPD3DVALUE nx, LPD3DVALUE ny, LPD3DVALUE nz) PURE; - STDMETHOD(SetPlane)(THIS_ D3DVALUE px, D3DVALUE py, D3DVALUE pz, - D3DVALUE nx, D3DVALUE ny, D3DVALUE nz, DWORD) PURE; - STDMETHOD(GetOptions)(THIS_ LPDWORD) PURE; - STDMETHOD(SetOptions)(THIS_ DWORD) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMFace - -DECLARE_INTERFACE_(IDirect3DRMFace, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMFace methods - */ - STDMETHOD(AddVertex)(THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(AddVertexAndNormalIndexed)(THIS_ DWORD vertex, DWORD normal) PURE; - STDMETHOD(SetColorRGB)(THIS_ D3DVALUE, D3DVALUE, D3DVALUE) PURE; - STDMETHOD(SetColor)(THIS_ D3DCOLOR) PURE; - STDMETHOD(SetTexture)(THIS_ LPDIRECT3DRMTEXTURE) PURE; - STDMETHOD(SetTextureCoordinates)(THIS_ DWORD vertex, D3DVALUE u, D3DVALUE v) PURE; - STDMETHOD(SetMaterial)(THIS_ LPDIRECT3DRMMATERIAL) PURE; - STDMETHOD(SetTextureTopology)(THIS_ BOOL wrap_u, BOOL wrap_v) PURE; - - STDMETHOD(GetVertex)(THIS_ DWORD index, D3DVECTOR *vertex, D3DVECTOR *normal) PURE; - STDMETHOD(GetVertices)(THIS_ DWORD *vertex_count, D3DVECTOR *coords, D3DVECTOR *normals); - STDMETHOD(GetTextureCoordinates)(THIS_ DWORD vertex, D3DVALUE *u, D3DVALUE *v) PURE; - STDMETHOD(GetTextureTopology)(THIS_ BOOL *wrap_u, BOOL *wrap_v) PURE; - STDMETHOD(GetNormal)(THIS_ D3DVECTOR *) PURE; - STDMETHOD(GetTexture)(THIS_ LPDIRECT3DRMTEXTURE *) PURE; - STDMETHOD(GetMaterial)(THIS_ LPDIRECT3DRMMATERIAL *) PURE; - - STDMETHOD_(int, GetVertexCount)(THIS) PURE; - STDMETHOD_(int, GetVertexIndex)(THIS_ DWORD which) PURE; - STDMETHOD_(int, GetTextureCoordinateIndex)(THIS_ DWORD which) PURE; - STDMETHOD_(D3DCOLOR, GetColor)(THIS) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMFace2 - -DECLARE_INTERFACE_(IDirect3DRMFace2, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMFace methods - */ - STDMETHOD(AddVertex)(THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(AddVertexAndNormalIndexed)(THIS_ DWORD vertex, DWORD normal) PURE; - STDMETHOD(SetColorRGB)(THIS_ D3DVALUE, D3DVALUE, D3DVALUE) PURE; - STDMETHOD(SetColor)(THIS_ D3DCOLOR) PURE; - STDMETHOD(SetTexture)(THIS_ LPDIRECT3DRMTEXTURE3) PURE; - STDMETHOD(SetTextureCoordinates)(THIS_ DWORD vertex, D3DVALUE u, D3DVALUE v) PURE; - STDMETHOD(SetMaterial)(THIS_ LPDIRECT3DRMMATERIAL2) PURE; - STDMETHOD(SetTextureTopology)(THIS_ BOOL wrap_u, BOOL wrap_v) PURE; - - STDMETHOD(GetVertex)(THIS_ DWORD index, D3DVECTOR *vertex, D3DVECTOR *normal) PURE; - STDMETHOD(GetVertices)(THIS_ DWORD *vertex_count, D3DVECTOR *coords, D3DVECTOR *normals); - STDMETHOD(GetTextureCoordinates)(THIS_ DWORD vertex, D3DVALUE *u, D3DVALUE *v) PURE; - STDMETHOD(GetTextureTopology)(THIS_ BOOL *wrap_u, BOOL *wrap_v) PURE; - STDMETHOD(GetNormal)(THIS_ D3DVECTOR *) PURE; - STDMETHOD(GetTexture)(THIS_ LPDIRECT3DRMTEXTURE3 *) PURE; - STDMETHOD(GetMaterial)(THIS_ LPDIRECT3DRMMATERIAL2 *) PURE; - - STDMETHOD_(int, GetVertexCount)(THIS) PURE; - STDMETHOD_(int, GetVertexIndex)(THIS_ DWORD which) PURE; - STDMETHOD_(int, GetTextureCoordinateIndex)(THIS_ DWORD which) PURE; - STDMETHOD_(D3DCOLOR, GetColor)(THIS) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMMeshBuilder - -DECLARE_INTERFACE_(IDirect3DRMMeshBuilder, IDirect3DRMVisual) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMMeshBuilder methods - */ - STDMETHOD(Load)(THIS_ LPVOID filename, LPVOID name, D3DRMLOADOPTIONS loadflags, D3DRMLOADTEXTURECALLBACK, LPVOID lpArg) PURE; - STDMETHOD(Save)(THIS_ const char *filename, D3DRMXOFFORMAT, D3DRMSAVEOPTIONS save) PURE; - STDMETHOD(Scale)(THIS_ D3DVALUE sx, D3DVALUE sy, D3DVALUE sz) PURE; - STDMETHOD(Translate)(THIS_ D3DVALUE tx, D3DVALUE ty, D3DVALUE tz) PURE; - STDMETHOD(SetColorSource)(THIS_ D3DRMCOLORSOURCE) PURE; - STDMETHOD(GetBox)(THIS_ D3DRMBOX *) PURE; - STDMETHOD(GenerateNormals)(THIS) PURE; - STDMETHOD_(D3DRMCOLORSOURCE, GetColorSource)(THIS) PURE; - - STDMETHOD(AddMesh)(THIS_ LPDIRECT3DRMMESH) PURE; - STDMETHOD(AddMeshBuilder)(THIS_ LPDIRECT3DRMMESHBUILDER) PURE; - STDMETHOD(AddFrame)(THIS_ LPDIRECT3DRMFRAME) PURE; - STDMETHOD(AddFace)(THIS_ LPDIRECT3DRMFACE) PURE; - STDMETHOD(AddFaces) - ( THIS_ DWORD vcount, D3DVECTOR *vertices, DWORD ncount, D3DVECTOR *normals, - DWORD *data, LPDIRECT3DRMFACEARRAY* - ) PURE; - STDMETHOD(ReserveSpace)(THIS_ DWORD vertex_Count, DWORD normal_count, DWORD face_count) PURE; - STDMETHOD(SetColorRGB)(THIS_ D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE; - STDMETHOD(SetColor)(THIS_ D3DCOLOR) PURE; - STDMETHOD(SetTexture)(THIS_ LPDIRECT3DRMTEXTURE) PURE; - STDMETHOD(SetMaterial)(THIS_ LPDIRECT3DRMMATERIAL) PURE; - STDMETHOD(SetTextureTopology)(THIS_ BOOL wrap_u, BOOL wrap_v) PURE; - STDMETHOD(SetQuality)(THIS_ D3DRMRENDERQUALITY) PURE; - STDMETHOD(SetPerspective)(THIS_ BOOL) PURE; - STDMETHOD(SetVertex)(THIS_ DWORD index, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(SetNormal)(THIS_ DWORD index, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(SetTextureCoordinates)(THIS_ DWORD index, D3DVALUE u, D3DVALUE v) PURE; - STDMETHOD(SetVertexColor)(THIS_ DWORD index, D3DCOLOR) PURE; - STDMETHOD(SetVertexColorRGB)(THIS_ DWORD index, D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE; - - STDMETHOD(GetFaces)(THIS_ LPDIRECT3DRMFACEARRAY*) PURE; - STDMETHOD(GetVertices) - ( THIS_ DWORD *vcount, D3DVECTOR *vertices, DWORD *ncount, D3DVECTOR *normals, DWORD *face_data_size, DWORD *face_data - ) PURE; - STDMETHOD(GetTextureCoordinates)(THIS_ DWORD index, D3DVALUE *u, D3DVALUE *v) PURE; - - STDMETHOD_(int, AddVertex)(THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD_(int, AddNormal)(THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(CreateFace)(THIS_ LPDIRECT3DRMFACE*) PURE; - STDMETHOD_(D3DRMRENDERQUALITY, GetQuality)(THIS) PURE; - STDMETHOD_(BOOL, GetPerspective)(THIS) PURE; - STDMETHOD_(int, GetFaceCount)(THIS) PURE; - STDMETHOD_(int, GetVertexCount)(THIS) PURE; - STDMETHOD_(D3DCOLOR, GetVertexColor)(THIS_ DWORD index) PURE; - - STDMETHOD(CreateMesh)(THIS_ LPDIRECT3DRMMESH*) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMMeshBuilder2 - -DECLARE_INTERFACE_(IDirect3DRMMeshBuilder2, IDirect3DRMMeshBuilder) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMMeshBuilder methods - */ - STDMETHOD(Load)(THIS_ LPVOID filename, LPVOID name, D3DRMLOADOPTIONS loadflags, D3DRMLOADTEXTURECALLBACK, LPVOID lpArg) PURE; - STDMETHOD(Save)(THIS_ const char *filename, D3DRMXOFFORMAT, D3DRMSAVEOPTIONS save) PURE; - STDMETHOD(Scale)(THIS_ D3DVALUE sx, D3DVALUE sy, D3DVALUE sz) PURE; - STDMETHOD(Translate)(THIS_ D3DVALUE tx, D3DVALUE ty, D3DVALUE tz) PURE; - STDMETHOD(SetColorSource)(THIS_ D3DRMCOLORSOURCE) PURE; - STDMETHOD(GetBox)(THIS_ D3DRMBOX *) PURE; - STDMETHOD(GenerateNormals)(THIS) PURE; - STDMETHOD_(D3DRMCOLORSOURCE, GetColorSource)(THIS) PURE; - - STDMETHOD(AddMesh)(THIS_ LPDIRECT3DRMMESH) PURE; - STDMETHOD(AddMeshBuilder)(THIS_ LPDIRECT3DRMMESHBUILDER) PURE; - STDMETHOD(AddFrame)(THIS_ LPDIRECT3DRMFRAME) PURE; - STDMETHOD(AddFace)(THIS_ LPDIRECT3DRMFACE) PURE; - STDMETHOD(AddFaces) - ( THIS_ DWORD vcount, D3DVECTOR *vertices, DWORD ncount, D3DVECTOR *normals, - DWORD *data, LPDIRECT3DRMFACEARRAY* - ) PURE; - STDMETHOD(ReserveSpace)(THIS_ DWORD vertex_Count, DWORD normal_count, DWORD face_count) PURE; - STDMETHOD(SetColorRGB)(THIS_ D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE; - STDMETHOD(SetColor)(THIS_ D3DCOLOR) PURE; - STDMETHOD(SetTexture)(THIS_ LPDIRECT3DRMTEXTURE) PURE; - STDMETHOD(SetMaterial)(THIS_ LPDIRECT3DRMMATERIAL) PURE; - STDMETHOD(SetTextureTopology)(THIS_ BOOL wrap_u, BOOL wrap_v) PURE; - STDMETHOD(SetQuality)(THIS_ D3DRMRENDERQUALITY) PURE; - STDMETHOD(SetPerspective)(THIS_ BOOL) PURE; - STDMETHOD(SetVertex)(THIS_ DWORD index, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(SetNormal)(THIS_ DWORD index, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(SetTextureCoordinates)(THIS_ DWORD index, D3DVALUE u, D3DVALUE v) PURE; - STDMETHOD(SetVertexColor)(THIS_ DWORD index, D3DCOLOR) PURE; - STDMETHOD(SetVertexColorRGB)(THIS_ DWORD index, D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE; - - STDMETHOD(GetFaces)(THIS_ LPDIRECT3DRMFACEARRAY*) PURE; - STDMETHOD(GetVertices) - ( THIS_ DWORD *vcount, D3DVECTOR *vertices, DWORD *ncount, D3DVECTOR *normals, DWORD *face_data_size, DWORD *face_data - ) PURE; - STDMETHOD(GetTextureCoordinates)(THIS_ DWORD index, D3DVALUE *u, D3DVALUE *v) PURE; - - STDMETHOD_(int, AddVertex)(THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD_(int, AddNormal)(THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(CreateFace)(THIS_ LPDIRECT3DRMFACE*) PURE; - STDMETHOD_(D3DRMRENDERQUALITY, GetQuality)(THIS) PURE; - STDMETHOD_(BOOL, GetPerspective)(THIS) PURE; - STDMETHOD_(int, GetFaceCount)(THIS) PURE; - STDMETHOD_(int, GetVertexCount)(THIS) PURE; - STDMETHOD_(D3DCOLOR, GetVertexColor)(THIS_ DWORD index) PURE; - - STDMETHOD(CreateMesh)(THIS_ LPDIRECT3DRMMESH*) PURE; - - /* - * IDirect3DRMMeshBuilder2 methods - */ - STDMETHOD(GenerateNormals2)(THIS_ D3DVALUE crease, DWORD dwFlags) PURE; - STDMETHOD(GetFace)(THIS_ DWORD index, LPDIRECT3DRMFACE*) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMMeshBuilder3 - -DECLARE_INTERFACE_(IDirect3DRMMeshBuilder3, IDirect3DRMVisual) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMMeshBuilder3 methods - */ - STDMETHOD(Load)(THIS_ LPVOID filename, LPVOID name, D3DRMLOADOPTIONS loadflags, D3DRMLOADTEXTURE3CALLBACK, LPVOID lpArg) PURE; - STDMETHOD(Save)(THIS_ const char *filename, D3DRMXOFFORMAT, D3DRMSAVEOPTIONS save) PURE; - STDMETHOD(Scale)(THIS_ D3DVALUE sx, D3DVALUE sy, D3DVALUE sz) PURE; - STDMETHOD(Translate)(THIS_ D3DVALUE tx, D3DVALUE ty, D3DVALUE tz) PURE; - STDMETHOD(SetColorSource)(THIS_ D3DRMCOLORSOURCE) PURE; - STDMETHOD(GetBox)(THIS_ D3DRMBOX *) PURE; - STDMETHOD(GenerateNormals)(THIS_ D3DVALUE crease, DWORD dwFlags) PURE; - STDMETHOD_(D3DRMCOLORSOURCE, GetColorSource)(THIS) PURE; - - STDMETHOD(AddMesh)(THIS_ LPDIRECT3DRMMESH) PURE; - STDMETHOD(AddMeshBuilder)(THIS_ LPDIRECT3DRMMESHBUILDER3, DWORD dwFlags) PURE; - STDMETHOD(AddFrame)(THIS_ LPDIRECT3DRMFRAME3) PURE; - STDMETHOD(AddFace)(THIS_ LPDIRECT3DRMFACE2) PURE; - STDMETHOD(AddFaces) - ( THIS_ DWORD vcount, D3DVECTOR *vertices, DWORD ncount, D3DVECTOR *normals, - DWORD *data, LPDIRECT3DRMFACEARRAY* - ) PURE; - STDMETHOD(ReserveSpace)(THIS_ DWORD vertex_Count, DWORD normal_count, DWORD face_count) PURE; - STDMETHOD(SetColorRGB)(THIS_ D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE; - STDMETHOD(SetColor)(THIS_ D3DCOLOR) PURE; - STDMETHOD(SetTexture)(THIS_ LPDIRECT3DRMTEXTURE3) PURE; - STDMETHOD(SetMaterial)(THIS_ LPDIRECT3DRMMATERIAL2) PURE; - STDMETHOD(SetTextureTopology)(THIS_ BOOL wrap_u, BOOL wrap_v) PURE; - STDMETHOD(SetQuality)(THIS_ D3DRMRENDERQUALITY) PURE; - STDMETHOD(SetPerspective)(THIS_ BOOL) PURE; - STDMETHOD(SetVertex)(THIS_ DWORD index, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(SetNormal)(THIS_ DWORD index, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(SetTextureCoordinates)(THIS_ DWORD index, D3DVALUE u, D3DVALUE v) PURE; - STDMETHOD(SetVertexColor)(THIS_ DWORD index, D3DCOLOR) PURE; - STDMETHOD(SetVertexColorRGB)(THIS_ DWORD index, D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE; - STDMETHOD(GetFaces)(THIS_ LPDIRECT3DRMFACEARRAY*) PURE; - STDMETHOD(GetGeometry) - ( THIS_ DWORD *vcount, D3DVECTOR *vertices, DWORD *ncount, D3DVECTOR *normals, DWORD *face_data_size, DWORD *face_data - ) PURE; - STDMETHOD(GetTextureCoordinates)(THIS_ DWORD index, D3DVALUE *u, D3DVALUE *v) PURE; - STDMETHOD_(int, AddVertex)(THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD_(int, AddNormal)(THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(CreateFace)(THIS_ LPDIRECT3DRMFACE2 *) PURE; - STDMETHOD_(D3DRMRENDERQUALITY, GetQuality)(THIS) PURE; - STDMETHOD_(BOOL, GetPerspective)(THIS) PURE; - STDMETHOD_(int, GetFaceCount)(THIS) PURE; - STDMETHOD_(int, GetVertexCount)(THIS) PURE; - STDMETHOD_(D3DCOLOR, GetVertexColor)(THIS_ DWORD index) PURE; - STDMETHOD(CreateMesh)(THIS_ LPDIRECT3DRMMESH*) PURE; - STDMETHOD(GetFace)(THIS_ DWORD index, LPDIRECT3DRMFACE2 *) PURE; - STDMETHOD(GetVertex)(THIS_ DWORD dwIndex, LPD3DVECTOR lpVector) PURE; - STDMETHOD(GetNormal)(THIS_ DWORD dwIndex, LPD3DVECTOR lpVector) PURE; - STDMETHOD(DeleteVertices)(THIS_ DWORD dwIndexFirst, DWORD dwCount) PURE; - STDMETHOD(DeleteNormals)(THIS_ DWORD dwIndexFirst, DWORD dwCount) PURE; - STDMETHOD(DeleteFace)(THIS_ LPDIRECT3DRMFACE2) PURE; - STDMETHOD(Empty)(THIS_ DWORD dwFlags) PURE; - STDMETHOD(Optimize)(THIS_ DWORD dwFlags) PURE; - STDMETHOD(AddFacesIndexed)(THIS_ DWORD dwFlags, DWORD *lpdwvIndices, DWORD *dwIndexFirst, DWORD *dwCount) PURE; - STDMETHOD(CreateSubMesh)(THIS_ LPUNKNOWN *) PURE; - STDMETHOD(GetParentMesh)(THIS_ DWORD, LPUNKNOWN *) PURE; - STDMETHOD(GetSubMeshes)(THIS_ LPDWORD lpdwCount, LPUNKNOWN *) PURE; - STDMETHOD(DeleteSubMesh)(THIS_ LPUNKNOWN) PURE; - STDMETHOD(Enable)(THIS_ DWORD) PURE; - STDMETHOD(GetEnable)(THIS_ DWORD *) PURE; - STDMETHOD(AddTriangles)(THIS_ DWORD dwFlags, DWORD dwFormat, - DWORD dwVertexCount, LPVOID lpvData) PURE; - STDMETHOD(SetVertices)(THIS_ DWORD dwIndexFirst, DWORD dwCount, LPD3DVECTOR) PURE; - STDMETHOD(GetVertices)(THIS_ DWORD dwIndexFirst, LPDWORD lpdwCount, LPD3DVECTOR) PURE; - STDMETHOD(SetNormals)(THIS_ DWORD dwIndexFirst, DWORD dwCount, LPD3DVECTOR) PURE; - STDMETHOD(GetNormals)(THIS_ DWORD dwIndexFirst, LPDWORD lpdwCount, LPD3DVECTOR) PURE; - STDMETHOD_(int, GetNormalCount)(THIS) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMLight - -DECLARE_INTERFACE_(IDirect3DRMLight, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMLight methods - */ - STDMETHOD(SetType)(THIS_ D3DRMLIGHTTYPE) PURE; - STDMETHOD(SetColor)(THIS_ D3DCOLOR) PURE; - STDMETHOD(SetColorRGB)(THIS_ D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE; - STDMETHOD(SetRange)(THIS_ D3DVALUE) PURE; - STDMETHOD(SetUmbra)(THIS_ D3DVALUE) PURE; - STDMETHOD(SetPenumbra)(THIS_ D3DVALUE) PURE; - STDMETHOD(SetConstantAttenuation)(THIS_ D3DVALUE) PURE; - STDMETHOD(SetLinearAttenuation)(THIS_ D3DVALUE) PURE; - STDMETHOD(SetQuadraticAttenuation)(THIS_ D3DVALUE) PURE; - - STDMETHOD_(D3DVALUE, GetRange)(THIS) PURE; - STDMETHOD_(D3DVALUE, GetUmbra)(THIS) PURE; - STDMETHOD_(D3DVALUE, GetPenumbra)(THIS) PURE; - STDMETHOD_(D3DVALUE, GetConstantAttenuation)(THIS) PURE; - STDMETHOD_(D3DVALUE, GetLinearAttenuation)(THIS) PURE; - STDMETHOD_(D3DVALUE, GetQuadraticAttenuation)(THIS) PURE; - STDMETHOD_(D3DCOLOR, GetColor)(THIS) PURE; - STDMETHOD_(D3DRMLIGHTTYPE, GetType)(THIS) PURE; - - STDMETHOD(SetEnableFrame)(THIS_ LPDIRECT3DRMFRAME) PURE; - STDMETHOD(GetEnableFrame)(THIS_ LPDIRECT3DRMFRAME*) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMTexture - -DECLARE_INTERFACE_(IDirect3DRMTexture, IDirect3DRMVisual) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMTexture methods - */ - STDMETHOD(InitFromFile)(THIS_ const char *filename) PURE; - STDMETHOD(InitFromSurface)(THIS_ LPDIRECTDRAWSURFACE lpDDS) PURE; - STDMETHOD(InitFromResource)(THIS_ HRSRC) PURE; - STDMETHOD(Changed)(THIS_ BOOL pixels, BOOL palette) PURE; - - STDMETHOD(SetColors)(THIS_ DWORD) PURE; - STDMETHOD(SetShades)(THIS_ DWORD) PURE; - STDMETHOD(SetDecalSize)(THIS_ D3DVALUE width, D3DVALUE height) PURE; - STDMETHOD(SetDecalOrigin)(THIS_ LONG x, LONG y) PURE; - STDMETHOD(SetDecalScale)(THIS_ DWORD) PURE; - STDMETHOD(SetDecalTransparency)(THIS_ BOOL) PURE; - STDMETHOD(SetDecalTransparentColor)(THIS_ D3DCOLOR) PURE; - - STDMETHOD(GetDecalSize)(THIS_ D3DVALUE *width_return, D3DVALUE *height_return) PURE; - STDMETHOD(GetDecalOrigin)(THIS_ LONG *x_return, LONG *y_return) PURE; - - STDMETHOD_(D3DRMIMAGE *, GetImage)(THIS) PURE; - STDMETHOD_(DWORD, GetShades)(THIS) PURE; - STDMETHOD_(DWORD, GetColors)(THIS) PURE; - STDMETHOD_(DWORD, GetDecalScale)(THIS) PURE; - STDMETHOD_(BOOL, GetDecalTransparency)(THIS) PURE; - STDMETHOD_(D3DCOLOR, GetDecalTransparentColor)(THIS) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMTexture2 - -DECLARE_INTERFACE_(IDirect3DRMTexture2, IDirect3DRMTexture) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMTexture methods - */ - STDMETHOD(InitFromFile)(THIS_ const char *filename) PURE; - STDMETHOD(InitFromSurface)(THIS_ LPDIRECTDRAWSURFACE lpDDS) PURE; - STDMETHOD(InitFromResource)(THIS_ HRSRC) PURE; - STDMETHOD(Changed)(THIS_ BOOL pixels, BOOL palette) PURE; - - STDMETHOD(SetColors)(THIS_ DWORD) PURE; - STDMETHOD(SetShades)(THIS_ DWORD) PURE; - STDMETHOD(SetDecalSize)(THIS_ D3DVALUE width, D3DVALUE height) PURE; - STDMETHOD(SetDecalOrigin)(THIS_ LONG x, LONG y) PURE; - STDMETHOD(SetDecalScale)(THIS_ DWORD) PURE; - STDMETHOD(SetDecalTransparency)(THIS_ BOOL) PURE; - STDMETHOD(SetDecalTransparentColor)(THIS_ D3DCOLOR) PURE; - - STDMETHOD(GetDecalSize)(THIS_ D3DVALUE *width_return, D3DVALUE *height_return) PURE; - STDMETHOD(GetDecalOrigin)(THIS_ LONG *x_return, LONG *y_return) PURE; - - STDMETHOD_(D3DRMIMAGE *, GetImage)(THIS) PURE; - STDMETHOD_(DWORD, GetShades)(THIS) PURE; - STDMETHOD_(DWORD, GetColors)(THIS) PURE; - STDMETHOD_(DWORD, GetDecalScale)(THIS) PURE; - STDMETHOD_(BOOL, GetDecalTransparency)(THIS) PURE; - STDMETHOD_(D3DCOLOR, GetDecalTransparentColor)(THIS) PURE; - - /* - * IDirect3DRMTexture2 methods - */ - STDMETHOD(InitFromImage)(THIS_ LPD3DRMIMAGE) PURE; - STDMETHOD(InitFromResource2)(THIS_ HMODULE hModule, LPCTSTR strName, LPCTSTR strType) PURE; - STDMETHOD(GenerateMIPMap)(THIS_ DWORD) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMTexture3 - -DECLARE_INTERFACE_(IDirect3DRMTexture3, IDirect3DRMVisual) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMTexture3 methods - */ - STDMETHOD(InitFromFile)(THIS_ const char *filename) PURE; - STDMETHOD(InitFromSurface)(THIS_ LPDIRECTDRAWSURFACE lpDDS) PURE; - STDMETHOD(InitFromResource)(THIS_ HRSRC) PURE; - STDMETHOD(Changed)(THIS_ DWORD dwFlags, DWORD dwcRects, LPRECT pRects) PURE; - STDMETHOD(SetColors)(THIS_ DWORD) PURE; - STDMETHOD(SetShades)(THIS_ DWORD) PURE; - STDMETHOD(SetDecalSize)(THIS_ D3DVALUE width, D3DVALUE height) PURE; - STDMETHOD(SetDecalOrigin)(THIS_ LONG x, LONG y) PURE; - STDMETHOD(SetDecalScale)(THIS_ DWORD) PURE; - STDMETHOD(SetDecalTransparency)(THIS_ BOOL) PURE; - STDMETHOD(SetDecalTransparentColor)(THIS_ D3DCOLOR) PURE; - - STDMETHOD(GetDecalSize)(THIS_ D3DVALUE *width_return, D3DVALUE *height_return) PURE; - STDMETHOD(GetDecalOrigin)(THIS_ LONG *x_return, LONG *y_return) PURE; - - STDMETHOD_(D3DRMIMAGE *, GetImage)(THIS) PURE; - STDMETHOD_(DWORD, GetShades)(THIS) PURE; - STDMETHOD_(DWORD, GetColors)(THIS) PURE; - STDMETHOD_(DWORD, GetDecalScale)(THIS) PURE; - STDMETHOD_(BOOL, GetDecalTransparency)(THIS) PURE; - STDMETHOD_(D3DCOLOR, GetDecalTransparentColor)(THIS) PURE; - STDMETHOD(InitFromImage)(THIS_ LPD3DRMIMAGE) PURE; - STDMETHOD(InitFromResource2)(THIS_ HMODULE hModule, LPCTSTR strName, LPCTSTR strType) PURE; - STDMETHOD(GenerateMIPMap)(THIS_ DWORD) PURE; - STDMETHOD(GetSurface)(THIS_ DWORD dwFlags, LPDIRECTDRAWSURFACE* lplpDDS) PURE; - STDMETHOD(SetCacheOptions)(THIS_ LONG lImportance, DWORD dwFlags) PURE; - STDMETHOD(GetCacheOptions)(THIS_ LPLONG lplImportance, LPDWORD lpdwFlags) PURE; - STDMETHOD(SetDownsampleCallback)(THIS_ D3DRMDOWNSAMPLECALLBACK pCallback, LPVOID pArg) PURE; - STDMETHOD(SetValidationCallback)(THIS_ D3DRMVALIDATIONCALLBACK pCallback, LPVOID pArg) PURE; -}; - - -#undef INTERFACE -#define INTERFACE IDirect3DRMWrap - -DECLARE_INTERFACE_(IDirect3DRMWrap, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMWrap methods - */ - STDMETHOD(Init) - ( THIS_ D3DRMWRAPTYPE, LPDIRECT3DRMFRAME ref, - D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, - D3DVALUE dx, D3DVALUE dy, D3DVALUE dz, - D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, - D3DVALUE ou, D3DVALUE ov, - D3DVALUE su, D3DVALUE sv - ) PURE; - STDMETHOD(Apply)(THIS_ LPDIRECT3DRMOBJECT) PURE; - STDMETHOD(ApplyRelative)(THIS_ LPDIRECT3DRMFRAME frame, LPDIRECT3DRMOBJECT) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMMaterial - -DECLARE_INTERFACE_(IDirect3DRMMaterial, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMMaterial methods - */ - STDMETHOD(SetPower)(THIS_ D3DVALUE power) PURE; - STDMETHOD(SetSpecular)(THIS_ D3DVALUE r, D3DVALUE g, D3DVALUE b) PURE; - STDMETHOD(SetEmissive)(THIS_ D3DVALUE r, D3DVALUE g, D3DVALUE b) PURE; - - STDMETHOD_(D3DVALUE, GetPower)(THIS) PURE; - STDMETHOD(GetSpecular)(THIS_ D3DVALUE* r, D3DVALUE* g, D3DVALUE* b) PURE; - STDMETHOD(GetEmissive)(THIS_ D3DVALUE* r, D3DVALUE* g, D3DVALUE* b) PURE; -}; - - -#undef INTERFACE -#define INTERFACE IDirect3DRMMaterial2 - -DECLARE_INTERFACE_(IDirect3DRMMaterial2, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMMaterial2 methods - */ - STDMETHOD(SetPower)(THIS_ D3DVALUE power) PURE; - STDMETHOD(SetSpecular)(THIS_ D3DVALUE r, D3DVALUE g, D3DVALUE b) PURE; - STDMETHOD(SetEmissive)(THIS_ D3DVALUE r, D3DVALUE g, D3DVALUE b) PURE; - STDMETHOD_(D3DVALUE, GetPower)(THIS) PURE; - STDMETHOD(GetSpecular)(THIS_ D3DVALUE* r, D3DVALUE* g, D3DVALUE* b) PURE; - STDMETHOD(GetEmissive)(THIS_ D3DVALUE* r, D3DVALUE* g, D3DVALUE* b) PURE; - STDMETHOD(GetAmbient)(THIS_ D3DVALUE* r, D3DVALUE* g, D3DVALUE* b) PURE; - STDMETHOD(SetAmbient)(THIS_ D3DVALUE r, D3DVALUE g, D3DVALUE b) PURE; -}; - - -#undef INTERFACE -#define INTERFACE IDirect3DRMAnimation - -DECLARE_INTERFACE_(IDirect3DRMAnimation, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMAnimation methods - */ - STDMETHOD(SetOptions)(THIS_ D3DRMANIMATIONOPTIONS flags) PURE; - STDMETHOD(AddRotateKey)(THIS_ D3DVALUE time, D3DRMQUATERNION *q) PURE; - STDMETHOD(AddPositionKey)(THIS_ D3DVALUE time, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(AddScaleKey)(THIS_ D3DVALUE time, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(DeleteKey)(THIS_ D3DVALUE time) PURE; - STDMETHOD(SetFrame)(THIS_ LPDIRECT3DRMFRAME frame) PURE; - STDMETHOD(SetTime)(THIS_ D3DVALUE time) PURE; - - STDMETHOD_(D3DRMANIMATIONOPTIONS, GetOptions)(THIS) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMAnimation2 - -DECLARE_INTERFACE_(IDirect3DRMAnimation2, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMAnimation2 methods - */ - STDMETHOD(SetOptions)(THIS_ D3DRMANIMATIONOPTIONS flags) PURE; - STDMETHOD(AddRotateKey)(THIS_ D3DVALUE time, D3DRMQUATERNION *q) PURE; - STDMETHOD(AddPositionKey)(THIS_ D3DVALUE time, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(AddScaleKey)(THIS_ D3DVALUE time, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE; - STDMETHOD(DeleteKey)(THIS_ D3DVALUE time) PURE; - STDMETHOD(SetFrame)(THIS_ LPDIRECT3DRMFRAME3 frame) PURE; - STDMETHOD(SetTime)(THIS_ D3DVALUE time) PURE; - - STDMETHOD_(D3DRMANIMATIONOPTIONS, GetOptions)(THIS) PURE; - STDMETHOD(GetFrame)(THIS_ LPDIRECT3DRMFRAME3 *lpD3DFrame) PURE; - STDMETHOD(DeleteKeyByID)(THIS_ DWORD dwID) PURE; - STDMETHOD(AddKey)(THIS_ LPD3DRMANIMATIONKEY lpKey) PURE; - STDMETHOD(ModifyKey)(THIS_ LPD3DRMANIMATIONKEY lpKey) PURE; - STDMETHOD(GetKeys)(THIS_ D3DVALUE dvTimeMin, - D3DVALUE dvTimeMax, LPDWORD lpdwNumKeys, - LPD3DRMANIMATIONKEY lpKey); -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMAnimationSet - -DECLARE_INTERFACE_(IDirect3DRMAnimationSet, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMAnimationSet methods - */ - STDMETHOD(AddAnimation)(THIS_ LPDIRECT3DRMANIMATION aid) PURE; - STDMETHOD(Load)(THIS_ LPVOID filename, LPVOID name, D3DRMLOADOPTIONS loadflags, D3DRMLOADTEXTURECALLBACK, LPVOID lpArg, LPDIRECT3DRMFRAME parent)PURE; - STDMETHOD(DeleteAnimation)(THIS_ LPDIRECT3DRMANIMATION aid) PURE; - STDMETHOD(SetTime)(THIS_ D3DVALUE time) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMAnimationSet2 - -DECLARE_INTERFACE_(IDirect3DRMAnimationSet2, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMAnimationSet2 methods - */ - STDMETHOD(AddAnimation)(THIS_ LPDIRECT3DRMANIMATION2 aid) PURE; - STDMETHOD(Load)(THIS_ LPVOID filename, LPVOID name, D3DRMLOADOPTIONS loadflags, D3DRMLOADTEXTURE3CALLBACK, LPVOID lpArg, LPDIRECT3DRMFRAME3 parent)PURE; - STDMETHOD(DeleteAnimation)(THIS_ LPDIRECT3DRMANIMATION2 aid) PURE; - STDMETHOD(SetTime)(THIS_ D3DVALUE time) PURE; - STDMETHOD(GetAnimations)(THIS_ LPDIRECT3DRMANIMATIONARRAY *) PURE; -}; - - -#undef INTERFACE -#define INTERFACE IDirect3DRMUserVisual - -DECLARE_INTERFACE_(IDirect3DRMUserVisual, IDirect3DRMVisual) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMUserVisual methods - */ - STDMETHOD(Init)(THIS_ D3DRMUSERVISUALCALLBACK fn, void *arg) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMArray - -DECLARE_INTERFACE_(IDirect3DRMArray, IUnknown) -{ - IUNKNOWN_METHODS(PURE); - - STDMETHOD_(DWORD, GetSize)(THIS) PURE; - /* No GetElement method as it would get overloaded - * in derived classes, and overloading is - * a no-no in COM - */ -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMObjectArray - -DECLARE_INTERFACE_(IDirect3DRMObjectArray, IDirect3DRMArray) -{ - IUNKNOWN_METHODS(PURE); - - STDMETHOD_(DWORD, GetSize)(THIS) PURE; - STDMETHOD(GetElement)(THIS_ DWORD index, LPDIRECT3DRMOBJECT *) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMDeviceArray - -DECLARE_INTERFACE_(IDirect3DRMDeviceArray, IDirect3DRMArray) -{ - IUNKNOWN_METHODS(PURE); - - STDMETHOD_(DWORD, GetSize)(THIS) PURE; - STDMETHOD(GetElement)(THIS_ DWORD index, LPDIRECT3DRMDEVICE *) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMFrameArray - -DECLARE_INTERFACE_(IDirect3DRMFrameArray, IDirect3DRMArray) -{ - IUNKNOWN_METHODS(PURE); - - STDMETHOD_(DWORD, GetSize)(THIS) PURE; - STDMETHOD(GetElement)(THIS_ DWORD index, LPDIRECT3DRMFRAME *) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMViewportArray - -DECLARE_INTERFACE_(IDirect3DRMViewportArray, IDirect3DRMArray) -{ - IUNKNOWN_METHODS(PURE); - - STDMETHOD_(DWORD, GetSize)(THIS) PURE; - STDMETHOD(GetElement)(THIS_ DWORD index, LPDIRECT3DRMVIEWPORT *) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMVisualArray - -DECLARE_INTERFACE_(IDirect3DRMVisualArray, IDirect3DRMArray) -{ - IUNKNOWN_METHODS(PURE); - - STDMETHOD_(DWORD, GetSize)(THIS) PURE; - STDMETHOD(GetElement)(THIS_ DWORD index, LPDIRECT3DRMVISUAL *) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMAnimationArray - -DECLARE_INTERFACE_(IDirect3DRMAnimationArray, IDirect3DRMArray) -{ - IUNKNOWN_METHODS(PURE); - - STDMETHOD_(DWORD, GetSize)(THIS) PURE; - STDMETHOD(GetElement)(THIS_ DWORD index, LPDIRECT3DRMANIMATION2 *) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMPickedArray - -DECLARE_INTERFACE_(IDirect3DRMPickedArray, IDirect3DRMArray) -{ - IUNKNOWN_METHODS(PURE); - - STDMETHOD_(DWORD, GetSize)(THIS) PURE; - STDMETHOD(GetPick)(THIS_ DWORD index, LPDIRECT3DRMVISUAL *, LPDIRECT3DRMFRAMEARRAY *, LPD3DRMPICKDESC) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMLightArray - -DECLARE_INTERFACE_(IDirect3DRMLightArray, IDirect3DRMArray) -{ - IUNKNOWN_METHODS(PURE); - - STDMETHOD_(DWORD, GetSize)(THIS) PURE; - STDMETHOD(GetElement)(THIS_ DWORD index, LPDIRECT3DRMLIGHT *) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMFaceArray - -DECLARE_INTERFACE_(IDirect3DRMFaceArray, IDirect3DRMArray) -{ - IUNKNOWN_METHODS(PURE); - - STDMETHOD_(DWORD, GetSize)(THIS) PURE; - STDMETHOD(GetElement)(THIS_ DWORD index, LPDIRECT3DRMFACE *) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMPicked2Array - -DECLARE_INTERFACE_(IDirect3DRMPicked2Array, IDirect3DRMArray) -{ - IUNKNOWN_METHODS(PURE); - - STDMETHOD_(DWORD, GetSize)(THIS) PURE; - STDMETHOD(GetPick)(THIS_ DWORD index, LPDIRECT3DRMVISUAL *, LPDIRECT3DRMFRAMEARRAY *, LPD3DRMPICKDESC2) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMInterpolator - -DECLARE_INTERFACE_(IDirect3DRMInterpolator, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMInterpolator methods - */ - STDMETHOD(AttachObject)(THIS_ LPDIRECT3DRMOBJECT) PURE; - STDMETHOD(GetAttachedObjects)(THIS_ LPDIRECT3DRMOBJECTARRAY *) PURE; - STDMETHOD(DetachObject)(THIS_ LPDIRECT3DRMOBJECT) PURE; - STDMETHOD(SetIndex)(THIS_ D3DVALUE) PURE; - STDMETHOD_(D3DVALUE, GetIndex)(THIS) PURE; - STDMETHOD(Interpolate)(THIS_ D3DVALUE, LPDIRECT3DRMOBJECT, D3DRMINTERPOLATIONOPTIONS) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirect3DRMClippedVisual - -DECLARE_INTERFACE_(IDirect3DRMClippedVisual, IDirect3DRMVisual) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMClippedVisual methods - */ - STDMETHOD(Init) (THIS_ LPDIRECT3DRMVISUAL) PURE; - STDMETHOD(AddPlane) (THIS_ LPDIRECT3DRMFRAME3, LPD3DVECTOR, LPD3DVECTOR, DWORD, LPDWORD) PURE; - STDMETHOD(DeletePlane)(THIS_ DWORD, DWORD) PURE; - STDMETHOD(GetPlaneIDs)(THIS_ LPDWORD, LPDWORD, DWORD) PURE; - STDMETHOD(GetPlane) (THIS_ DWORD, LPDIRECT3DRMFRAME3, LPD3DVECTOR, LPD3DVECTOR, DWORD) PURE; - STDMETHOD(SetPlane) (THIS_ DWORD, LPDIRECT3DRMFRAME3, LPD3DVECTOR, LPD3DVECTOR, DWORD) PURE; -}; - -#ifdef __cplusplus -}; -#endif -#endif /* _D3DRMOBJ_H_ */ - diff --git a/import/DirectX8/include/d3drmwin.h b/import/DirectX8/include/d3drmwin.h deleted file mode 100644 index 3ed5c9d0f..000000000 --- a/import/DirectX8/include/d3drmwin.h +++ /dev/null @@ -1,50 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved. - * - * File: d3drm.h - * Content: Direct3DRM include file - * - ***************************************************************************/ - -#ifndef __D3DRMWIN_H__ -#define __D3DRMWIN_H__ - -#ifndef WIN32 -#define WIN32 -#endif - -#include "d3drm.h" - -#include "ddraw.h" -#include "d3d.h" - -/* - * GUIDS used by Direct3DRM Windows interface - */ -DEFINE_GUID(IID_IDirect3DRMWinDevice, 0xc5016cc0, 0xd273, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1); - -WIN_TYPES(IDirect3DRMWinDevice, DIRECT3DRMWINDEVICE); - -#undef INTERFACE -#define INTERFACE IDirect3DRMWinDevice - -DECLARE_INTERFACE_(IDirect3DRMWinDevice, IDirect3DRMObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECT3DRMOBJECT_METHODS(PURE); - - /* - * IDirect3DRMWinDevice methods - */ - - /* Repaint the window with the last frame which was rendered. */ - STDMETHOD(HandlePaint)(THIS_ HDC hdc) PURE; - - /* Respond to a WM_ACTIVATE message. */ - STDMETHOD(HandleActivate)(THIS_ WORD wparam) PURE; -}; - - -#endif - diff --git a/import/DirectX8/include/d3dtypes.h b/import/DirectX8/include/d3dtypes.h deleted file mode 100644 index 6a664971a..000000000 --- a/import/DirectX8/include/d3dtypes.h +++ /dev/null @@ -1,2117 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) Microsoft Corporation. All Rights Reserved. - * - * File: d3dtypes.h - * Content: Direct3D types include file - * - ***************************************************************************/ - -#ifndef _D3DTYPES_H_ -#define _D3DTYPES_H_ - -#ifndef DIRECT3D_VERSION -#define DIRECT3D_VERSION 0x0700 -#endif - -#if (DIRECT3D_VERSION >= 0x0800) -#pragma message("should not include d3dtypes.h when compiling for DX8 or newer interfaces") -#endif - -#include - -#include -#include "ddraw.h" - -#pragma warning(disable:4201) // anonymous unions warning -#pragma pack(4) - - -/* D3DVALUE is the fundamental Direct3D fractional data type */ - -#define D3DVALP(val, prec) ((float)(val)) -#define D3DVAL(val) ((float)(val)) - -#ifndef DX_SHARED_DEFINES - -/* - * This definition is shared with other DirectX components whose header files - * might already have defined it. Therefore, we don't define this type if - * someone else already has (as indicated by the definition of - * DX_SHARED_DEFINES). We don't set DX_SHARED_DEFINES here as there are - * other types in this header that are also shared. The last of these - * shared defines in this file will set DX_SHARED_DEFINES. - */ -typedef float D3DVALUE, *LPD3DVALUE; - -#endif /* DX_SHARED_DEFINES */ - -#define D3DDivide(a, b) (float)((double) (a) / (double) (b)) -#define D3DMultiply(a, b) ((a) * (b)) - -typedef LONG D3DFIXED; - -#ifndef RGB_MAKE -/* - * Format of CI colors is - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | alpha | color index | fraction | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ -#define CI_GETALPHA(ci) ((ci) >> 24) -#define CI_GETINDEX(ci) (((ci) >> 8) & 0xffff) -#define CI_GETFRACTION(ci) ((ci) & 0xff) -#define CI_ROUNDINDEX(ci) CI_GETINDEX((ci) + 0x80) -#define CI_MASKALPHA(ci) ((ci) & 0xffffff) -#define CI_MAKE(a, i, f) (((a) << 24) | ((i) << 8) | (f)) - -/* - * Format of RGBA colors is - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | alpha | red | green | blue | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ -#define RGBA_GETALPHA(rgb) ((rgb) >> 24) -#define RGBA_GETRED(rgb) (((rgb) >> 16) & 0xff) -#define RGBA_GETGREEN(rgb) (((rgb) >> 8) & 0xff) -#define RGBA_GETBLUE(rgb) ((rgb) & 0xff) -#define RGBA_MAKE(r, g, b, a) ((D3DCOLOR) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))) - -/* D3DRGB and D3DRGBA may be used as initialisers for D3DCOLORs - * The float values must be in the range 0..1 - */ -#define D3DRGB(r, g, b) \ - (0xff000000L | ( ((long)((r) * 255)) << 16) | (((long)((g) * 255)) << 8) | (long)((b) * 255)) -#define D3DRGBA(r, g, b, a) \ - ( (((long)((a) * 255)) << 24) | (((long)((r) * 255)) << 16) \ - | (((long)((g) * 255)) << 8) | (long)((b) * 255) \ - ) - -/* - * Format of RGB colors is - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | ignored | red | green | blue | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ -#define RGB_GETRED(rgb) (((rgb) >> 16) & 0xff) -#define RGB_GETGREEN(rgb) (((rgb) >> 8) & 0xff) -#define RGB_GETBLUE(rgb) ((rgb) & 0xff) -#define RGBA_SETALPHA(rgba, x) (((x) << 24) | ((rgba) & 0x00ffffff)) -#define RGB_MAKE(r, g, b) ((D3DCOLOR) (((r) << 16) | ((g) << 8) | (b))) -#define RGBA_TORGB(rgba) ((D3DCOLOR) ((rgba) & 0xffffff)) -#define RGB_TORGBA(rgb) ((D3DCOLOR) ((rgb) | 0xff000000)) - -#endif - -/* - * Flags for Enumerate functions - */ - -/* - * Stop the enumeration - */ -#define D3DENUMRET_CANCEL DDENUMRET_CANCEL - -/* - * Continue the enumeration - */ -#define D3DENUMRET_OK DDENUMRET_OK - -typedef HRESULT (CALLBACK* LPD3DVALIDATECALLBACK)(LPVOID lpUserArg, DWORD dwOffset); -typedef HRESULT (CALLBACK* LPD3DENUMTEXTUREFORMATSCALLBACK)(LPDDSURFACEDESC lpDdsd, LPVOID lpContext); -typedef HRESULT (CALLBACK* LPD3DENUMPIXELFORMATSCALLBACK)(LPDDPIXELFORMAT lpDDPixFmt, LPVOID lpContext); - -#ifndef DX_SHARED_DEFINES - -/* - * This definition is shared with other DirectX components whose header files - * might already have defined it. Therefore, we don't define this type if - * someone else already has (as indicated by the definition of - * DX_SHARED_DEFINES). We don't set DX_SHARED_DEFINES here as there are - * other types in this header that are also shared. The last of these - * shared defines in this file will set DX_SHARED_DEFINES. - */ -#ifndef D3DCOLOR_DEFINED -typedef DWORD D3DCOLOR; -#define D3DCOLOR_DEFINED -#endif -typedef DWORD *LPD3DCOLOR; - -#endif /* DX_SHARED_DEFINES */ - -typedef DWORD D3DMATERIALHANDLE, *LPD3DMATERIALHANDLE; -typedef DWORD D3DTEXTUREHANDLE, *LPD3DTEXTUREHANDLE; -typedef DWORD D3DMATRIXHANDLE, *LPD3DMATRIXHANDLE; - -#ifndef D3DCOLORVALUE_DEFINED -typedef struct _D3DCOLORVALUE { - union { - D3DVALUE r; - D3DVALUE dvR; - }; - union { - D3DVALUE g; - D3DVALUE dvG; - }; - union { - D3DVALUE b; - D3DVALUE dvB; - }; - union { - D3DVALUE a; - D3DVALUE dvA; - }; -} D3DCOLORVALUE; -#define D3DCOLORVALUE_DEFINED -#endif -typedef struct _D3DCOLORVALUE *LPD3DCOLORVALUE; - -#ifndef D3DRECT_DEFINED -typedef struct _D3DRECT { - union { - LONG x1; - LONG lX1; - }; - union { - LONG y1; - LONG lY1; - }; - union { - LONG x2; - LONG lX2; - }; - union { - LONG y2; - LONG lY2; - }; -} D3DRECT; -#define D3DRECT_DEFINED -#endif -typedef struct _D3DRECT *LPD3DRECT; - -#ifndef DX_SHARED_DEFINES - -/* - * This definition is shared with other DirectX components whose header files - * might already have defined it. Therefore, we don't define this type if - * someone else already has (as indicated by the definition of - * DX_SHARED_DEFINES). - */ - -#ifndef D3DVECTOR_DEFINED -typedef struct _D3DVECTOR { - union { - D3DVALUE x; - D3DVALUE dvX; - }; - union { - D3DVALUE y; - D3DVALUE dvY; - }; - union { - D3DVALUE z; - D3DVALUE dvZ; - }; -#if(DIRECT3D_VERSION >= 0x0500) -#if (defined __cplusplus) && (defined D3D_OVERLOADS) - -public: - - // ===================================== - // Constructors - // ===================================== - - _D3DVECTOR() { } - _D3DVECTOR(D3DVALUE f); - _D3DVECTOR(D3DVALUE _x, D3DVALUE _y, D3DVALUE _z); - _D3DVECTOR(const D3DVALUE f[3]); - - // ===================================== - // Access grants - // ===================================== - - const D3DVALUE&operator[](int i) const; - D3DVALUE&operator[](int i); - - // ===================================== - // Assignment operators - // ===================================== - - _D3DVECTOR& operator += (const _D3DVECTOR& v); - _D3DVECTOR& operator -= (const _D3DVECTOR& v); - _D3DVECTOR& operator *= (const _D3DVECTOR& v); - _D3DVECTOR& operator /= (const _D3DVECTOR& v); - _D3DVECTOR& operator *= (D3DVALUE s); - _D3DVECTOR& operator /= (D3DVALUE s); - - // ===================================== - // Unary operators - // ===================================== - - friend _D3DVECTOR operator + (const _D3DVECTOR& v); - friend _D3DVECTOR operator - (const _D3DVECTOR& v); - - - // ===================================== - // Binary operators - // ===================================== - - // Addition and subtraction - friend _D3DVECTOR operator + (const _D3DVECTOR& v1, const _D3DVECTOR& v2); - friend _D3DVECTOR operator - (const _D3DVECTOR& v1, const _D3DVECTOR& v2); - // Scalar multiplication and division - friend _D3DVECTOR operator * (const _D3DVECTOR& v, D3DVALUE s); - friend _D3DVECTOR operator * (D3DVALUE s, const _D3DVECTOR& v); - friend _D3DVECTOR operator / (const _D3DVECTOR& v, D3DVALUE s); - // Memberwise multiplication and division - friend _D3DVECTOR operator * (const _D3DVECTOR& v1, const _D3DVECTOR& v2); - friend _D3DVECTOR operator / (const _D3DVECTOR& v1, const _D3DVECTOR& v2); - - // Vector dominance - friend int operator < (const _D3DVECTOR& v1, const _D3DVECTOR& v2); - friend int operator <= (const _D3DVECTOR& v1, const _D3DVECTOR& v2); - - // Bitwise equality - friend int operator == (const _D3DVECTOR& v1, const _D3DVECTOR& v2); - - // Length-related functions - friend D3DVALUE SquareMagnitude (const _D3DVECTOR& v); - friend D3DVALUE Magnitude (const _D3DVECTOR& v); - - // Returns vector with same direction and unit length - friend _D3DVECTOR Normalize (const _D3DVECTOR& v); - - // Return min/max component of the input vector - friend D3DVALUE Min (const _D3DVECTOR& v); - friend D3DVALUE Max (const _D3DVECTOR& v); - - // Return memberwise min/max of input vectors - friend _D3DVECTOR Minimize (const _D3DVECTOR& v1, const _D3DVECTOR& v2); - friend _D3DVECTOR Maximize (const _D3DVECTOR& v1, const _D3DVECTOR& v2); - - // Dot and cross product - friend D3DVALUE DotProduct (const _D3DVECTOR& v1, const _D3DVECTOR& v2); - friend _D3DVECTOR CrossProduct (const _D3DVECTOR& v1, const _D3DVECTOR& v2); - -#endif -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DVECTOR; -#define D3DVECTOR_DEFINED -#endif -typedef struct _D3DVECTOR *LPD3DVECTOR; - -/* - * As this is the last of the shared defines to be defined we now set - * D3D_SHARED_DEFINES to flag that fact that this header has defined these - * types. - */ -#define DX_SHARED_DEFINES - -#endif /* DX_SHARED_DEFINES */ - -/* - * Vertex data types supported in an ExecuteBuffer. - */ - -/* - * Homogeneous vertices - */ - -typedef struct _D3DHVERTEX { - DWORD dwFlags; /* Homogeneous clipping flags */ - union { - D3DVALUE hx; - D3DVALUE dvHX; - }; - union { - D3DVALUE hy; - D3DVALUE dvHY; - }; - union { - D3DVALUE hz; - D3DVALUE dvHZ; - }; -} D3DHVERTEX, *LPD3DHVERTEX; - -/* - * Transformed/lit vertices - */ -typedef struct _D3DTLVERTEX { - union { - D3DVALUE sx; /* Screen coordinates */ - D3DVALUE dvSX; - }; - union { - D3DVALUE sy; - D3DVALUE dvSY; - }; - union { - D3DVALUE sz; - D3DVALUE dvSZ; - }; - union { - D3DVALUE rhw; /* Reciprocal of homogeneous w */ - D3DVALUE dvRHW; - }; - union { - D3DCOLOR color; /* Vertex color */ - D3DCOLOR dcColor; - }; - union { - D3DCOLOR specular; /* Specular component of vertex */ - D3DCOLOR dcSpecular; - }; - union { - D3DVALUE tu; /* Texture coordinates */ - D3DVALUE dvTU; - }; - union { - D3DVALUE tv; - D3DVALUE dvTV; - }; -#if(DIRECT3D_VERSION >= 0x0500) -#if (defined __cplusplus) && (defined D3D_OVERLOADS) - _D3DTLVERTEX() { } - _D3DTLVERTEX(const D3DVECTOR& v, float _rhw, - D3DCOLOR _color, D3DCOLOR _specular, - float _tu, float _tv) - { sx = v.x; sy = v.y; sz = v.z; rhw = _rhw; - color = _color; specular = _specular; - tu = _tu; tv = _tv; - } -#endif -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DTLVERTEX, *LPD3DTLVERTEX; - -/* - * Untransformed/lit vertices - */ -typedef struct _D3DLVERTEX { - union { - D3DVALUE x; /* Homogeneous coordinates */ - D3DVALUE dvX; - }; - union { - D3DVALUE y; - D3DVALUE dvY; - }; - union { - D3DVALUE z; - D3DVALUE dvZ; - }; - DWORD dwReserved; - union { - D3DCOLOR color; /* Vertex color */ - D3DCOLOR dcColor; - }; - union { - D3DCOLOR specular; /* Specular component of vertex */ - D3DCOLOR dcSpecular; - }; - union { - D3DVALUE tu; /* Texture coordinates */ - D3DVALUE dvTU; - }; - union { - D3DVALUE tv; - D3DVALUE dvTV; - }; -#if(DIRECT3D_VERSION >= 0x0500) -#if (defined __cplusplus) && (defined D3D_OVERLOADS) - _D3DLVERTEX() { } - _D3DLVERTEX(const D3DVECTOR& v, - D3DCOLOR _color, D3DCOLOR _specular, - float _tu, float _tv) - { x = v.x; y = v.y; z = v.z; dwReserved = 0; - color = _color; specular = _specular; - tu = _tu; tv = _tv; - } -#endif -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DLVERTEX, *LPD3DLVERTEX; - -/* - * Untransformed/unlit vertices - */ - -typedef struct _D3DVERTEX { - union { - D3DVALUE x; /* Homogeneous coordinates */ - D3DVALUE dvX; - }; - union { - D3DVALUE y; - D3DVALUE dvY; - }; - union { - D3DVALUE z; - D3DVALUE dvZ; - }; - union { - D3DVALUE nx; /* Normal */ - D3DVALUE dvNX; - }; - union { - D3DVALUE ny; - D3DVALUE dvNY; - }; - union { - D3DVALUE nz; - D3DVALUE dvNZ; - }; - union { - D3DVALUE tu; /* Texture coordinates */ - D3DVALUE dvTU; - }; - union { - D3DVALUE tv; - D3DVALUE dvTV; - }; -#if(DIRECT3D_VERSION >= 0x0500) -#if (defined __cplusplus) && (defined D3D_OVERLOADS) - _D3DVERTEX() { } - _D3DVERTEX(const D3DVECTOR& v, const D3DVECTOR& n, float _tu, float _tv) - { x = v.x; y = v.y; z = v.z; - nx = n.x; ny = n.y; nz = n.z; - tu = _tu; tv = _tv; - } -#endif -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DVERTEX, *LPD3DVERTEX; - - -/* - * Matrix, viewport, and tranformation structures and definitions. - */ - -#ifndef D3DMATRIX_DEFINED -typedef struct _D3DMATRIX { -#if(DIRECT3D_VERSION >= 0x0500) -#if (defined __cplusplus) && (defined D3D_OVERLOADS) - union { - struct { -#endif - -#endif /* DIRECT3D_VERSION >= 0x0500 */ - D3DVALUE _11, _12, _13, _14; - D3DVALUE _21, _22, _23, _24; - D3DVALUE _31, _32, _33, _34; - D3DVALUE _41, _42, _43, _44; - -#if(DIRECT3D_VERSION >= 0x0500) -#if (defined __cplusplus) && (defined D3D_OVERLOADS) - }; - D3DVALUE m[4][4]; - }; - _D3DMATRIX() { } - _D3DMATRIX( D3DVALUE _m00, D3DVALUE _m01, D3DVALUE _m02, D3DVALUE _m03, - D3DVALUE _m10, D3DVALUE _m11, D3DVALUE _m12, D3DVALUE _m13, - D3DVALUE _m20, D3DVALUE _m21, D3DVALUE _m22, D3DVALUE _m23, - D3DVALUE _m30, D3DVALUE _m31, D3DVALUE _m32, D3DVALUE _m33 - ) - { - m[0][0] = _m00; m[0][1] = _m01; m[0][2] = _m02; m[0][3] = _m03; - m[1][0] = _m10; m[1][1] = _m11; m[1][2] = _m12; m[1][3] = _m13; - m[2][0] = _m20; m[2][1] = _m21; m[2][2] = _m22; m[2][3] = _m23; - m[3][0] = _m30; m[3][1] = _m31; m[3][2] = _m32; m[3][3] = _m33; - } - - D3DVALUE& operator()(int iRow, int iColumn) { return m[iRow][iColumn]; } - const D3DVALUE& operator()(int iRow, int iColumn) const { return m[iRow][iColumn]; } -#if(DIRECT3D_VERSION >= 0x0600) - friend _D3DMATRIX operator* (const _D3DMATRIX&, const _D3DMATRIX&); -#endif /* DIRECT3D_VERSION >= 0x0600 */ -#endif -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DMATRIX; -#define D3DMATRIX_DEFINED -#endif -typedef struct _D3DMATRIX *LPD3DMATRIX; - -#if (defined __cplusplus) && (defined D3D_OVERLOADS) -#include "d3dvec.inl" -#endif - -typedef struct _D3DVIEWPORT { - DWORD dwSize; - DWORD dwX; - DWORD dwY; /* Top left */ - DWORD dwWidth; - DWORD dwHeight; /* Dimensions */ - D3DVALUE dvScaleX; /* Scale homogeneous to screen */ - D3DVALUE dvScaleY; /* Scale homogeneous to screen */ - D3DVALUE dvMaxX; /* Min/max homogeneous x coord */ - D3DVALUE dvMaxY; /* Min/max homogeneous y coord */ - D3DVALUE dvMinZ; - D3DVALUE dvMaxZ; /* Min/max homogeneous z coord */ -} D3DVIEWPORT, *LPD3DVIEWPORT; - -#if(DIRECT3D_VERSION >= 0x0500) -typedef struct _D3DVIEWPORT2 { - DWORD dwSize; - DWORD dwX; - DWORD dwY; /* Viewport Top left */ - DWORD dwWidth; - DWORD dwHeight; /* Viewport Dimensions */ - D3DVALUE dvClipX; /* Top left of clip volume */ - D3DVALUE dvClipY; - D3DVALUE dvClipWidth; /* Clip Volume Dimensions */ - D3DVALUE dvClipHeight; - D3DVALUE dvMinZ; /* Min/max of clip Volume */ - D3DVALUE dvMaxZ; -} D3DVIEWPORT2, *LPD3DVIEWPORT2; -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#if(DIRECT3D_VERSION >= 0x0700) -typedef struct _D3DVIEWPORT7 { - DWORD dwX; - DWORD dwY; /* Viewport Top left */ - DWORD dwWidth; - DWORD dwHeight; /* Viewport Dimensions */ - D3DVALUE dvMinZ; /* Min/max of clip Volume */ - D3DVALUE dvMaxZ; -} D3DVIEWPORT7, *LPD3DVIEWPORT7; -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -/* - * Values for clip fields. - */ - -#if(DIRECT3D_VERSION >= 0x0700) - -// Max number of user clipping planes, supported in D3D. -#define D3DMAXUSERCLIPPLANES 32 - -// These bits could be ORed together to use with D3DRENDERSTATE_CLIPPLANEENABLE -// -#define D3DCLIPPLANE0 (1 << 0) -#define D3DCLIPPLANE1 (1 << 1) -#define D3DCLIPPLANE2 (1 << 2) -#define D3DCLIPPLANE3 (1 << 3) -#define D3DCLIPPLANE4 (1 << 4) -#define D3DCLIPPLANE5 (1 << 5) - -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -#define D3DCLIP_LEFT 0x00000001L -#define D3DCLIP_RIGHT 0x00000002L -#define D3DCLIP_TOP 0x00000004L -#define D3DCLIP_BOTTOM 0x00000008L -#define D3DCLIP_FRONT 0x00000010L -#define D3DCLIP_BACK 0x00000020L -#define D3DCLIP_GEN0 0x00000040L -#define D3DCLIP_GEN1 0x00000080L -#define D3DCLIP_GEN2 0x00000100L -#define D3DCLIP_GEN3 0x00000200L -#define D3DCLIP_GEN4 0x00000400L -#define D3DCLIP_GEN5 0x00000800L - -/* - * Values for d3d status. - */ -#define D3DSTATUS_CLIPUNIONLEFT D3DCLIP_LEFT -#define D3DSTATUS_CLIPUNIONRIGHT D3DCLIP_RIGHT -#define D3DSTATUS_CLIPUNIONTOP D3DCLIP_TOP -#define D3DSTATUS_CLIPUNIONBOTTOM D3DCLIP_BOTTOM -#define D3DSTATUS_CLIPUNIONFRONT D3DCLIP_FRONT -#define D3DSTATUS_CLIPUNIONBACK D3DCLIP_BACK -#define D3DSTATUS_CLIPUNIONGEN0 D3DCLIP_GEN0 -#define D3DSTATUS_CLIPUNIONGEN1 D3DCLIP_GEN1 -#define D3DSTATUS_CLIPUNIONGEN2 D3DCLIP_GEN2 -#define D3DSTATUS_CLIPUNIONGEN3 D3DCLIP_GEN3 -#define D3DSTATUS_CLIPUNIONGEN4 D3DCLIP_GEN4 -#define D3DSTATUS_CLIPUNIONGEN5 D3DCLIP_GEN5 - -#define D3DSTATUS_CLIPINTERSECTIONLEFT 0x00001000L -#define D3DSTATUS_CLIPINTERSECTIONRIGHT 0x00002000L -#define D3DSTATUS_CLIPINTERSECTIONTOP 0x00004000L -#define D3DSTATUS_CLIPINTERSECTIONBOTTOM 0x00008000L -#define D3DSTATUS_CLIPINTERSECTIONFRONT 0x00010000L -#define D3DSTATUS_CLIPINTERSECTIONBACK 0x00020000L -#define D3DSTATUS_CLIPINTERSECTIONGEN0 0x00040000L -#define D3DSTATUS_CLIPINTERSECTIONGEN1 0x00080000L -#define D3DSTATUS_CLIPINTERSECTIONGEN2 0x00100000L -#define D3DSTATUS_CLIPINTERSECTIONGEN3 0x00200000L -#define D3DSTATUS_CLIPINTERSECTIONGEN4 0x00400000L -#define D3DSTATUS_CLIPINTERSECTIONGEN5 0x00800000L -#define D3DSTATUS_ZNOTVISIBLE 0x01000000L -/* Do not use 0x80000000 for any status flags in future as it is reserved */ - -#define D3DSTATUS_CLIPUNIONALL ( \ - D3DSTATUS_CLIPUNIONLEFT | \ - D3DSTATUS_CLIPUNIONRIGHT | \ - D3DSTATUS_CLIPUNIONTOP | \ - D3DSTATUS_CLIPUNIONBOTTOM | \ - D3DSTATUS_CLIPUNIONFRONT | \ - D3DSTATUS_CLIPUNIONBACK | \ - D3DSTATUS_CLIPUNIONGEN0 | \ - D3DSTATUS_CLIPUNIONGEN1 | \ - D3DSTATUS_CLIPUNIONGEN2 | \ - D3DSTATUS_CLIPUNIONGEN3 | \ - D3DSTATUS_CLIPUNIONGEN4 | \ - D3DSTATUS_CLIPUNIONGEN5 \ - ) - -#define D3DSTATUS_CLIPINTERSECTIONALL ( \ - D3DSTATUS_CLIPINTERSECTIONLEFT | \ - D3DSTATUS_CLIPINTERSECTIONRIGHT | \ - D3DSTATUS_CLIPINTERSECTIONTOP | \ - D3DSTATUS_CLIPINTERSECTIONBOTTOM | \ - D3DSTATUS_CLIPINTERSECTIONFRONT | \ - D3DSTATUS_CLIPINTERSECTIONBACK | \ - D3DSTATUS_CLIPINTERSECTIONGEN0 | \ - D3DSTATUS_CLIPINTERSECTIONGEN1 | \ - D3DSTATUS_CLIPINTERSECTIONGEN2 | \ - D3DSTATUS_CLIPINTERSECTIONGEN3 | \ - D3DSTATUS_CLIPINTERSECTIONGEN4 | \ - D3DSTATUS_CLIPINTERSECTIONGEN5 \ - ) - -#define D3DSTATUS_DEFAULT ( \ - D3DSTATUS_CLIPINTERSECTIONALL | \ - D3DSTATUS_ZNOTVISIBLE) - - -/* - * Options for direct transform calls - */ -#define D3DTRANSFORM_CLIPPED 0x00000001l -#define D3DTRANSFORM_UNCLIPPED 0x00000002l - -typedef struct _D3DTRANSFORMDATA { - DWORD dwSize; - LPVOID lpIn; /* Input vertices */ - DWORD dwInSize; /* Stride of input vertices */ - LPVOID lpOut; /* Output vertices */ - DWORD dwOutSize; /* Stride of output vertices */ - LPD3DHVERTEX lpHOut; /* Output homogeneous vertices */ - DWORD dwClip; /* Clipping hint */ - DWORD dwClipIntersection; - DWORD dwClipUnion; /* Union of all clip flags */ - D3DRECT drExtent; /* Extent of transformed vertices */ -} D3DTRANSFORMDATA, *LPD3DTRANSFORMDATA; - -/* - * Structure defining position and direction properties for lighting. - */ -typedef struct _D3DLIGHTINGELEMENT { - D3DVECTOR dvPosition; /* Lightable point in model space */ - D3DVECTOR dvNormal; /* Normalised unit vector */ -} D3DLIGHTINGELEMENT, *LPD3DLIGHTINGELEMENT; - -/* - * Structure defining material properties for lighting. - */ -typedef struct _D3DMATERIAL { - DWORD dwSize; - union { - D3DCOLORVALUE diffuse; /* Diffuse color RGBA */ - D3DCOLORVALUE dcvDiffuse; - }; - union { - D3DCOLORVALUE ambient; /* Ambient color RGB */ - D3DCOLORVALUE dcvAmbient; - }; - union { - D3DCOLORVALUE specular; /* Specular 'shininess' */ - D3DCOLORVALUE dcvSpecular; - }; - union { - D3DCOLORVALUE emissive; /* Emissive color RGB */ - D3DCOLORVALUE dcvEmissive; - }; - union { - D3DVALUE power; /* Sharpness if specular highlight */ - D3DVALUE dvPower; - }; - D3DTEXTUREHANDLE hTexture; /* Handle to texture map */ - DWORD dwRampSize; -} D3DMATERIAL, *LPD3DMATERIAL; - -#if(DIRECT3D_VERSION >= 0x0700) - -typedef struct _D3DMATERIAL7 { - union { - D3DCOLORVALUE diffuse; /* Diffuse color RGBA */ - D3DCOLORVALUE dcvDiffuse; - }; - union { - D3DCOLORVALUE ambient; /* Ambient color RGB */ - D3DCOLORVALUE dcvAmbient; - }; - union { - D3DCOLORVALUE specular; /* Specular 'shininess' */ - D3DCOLORVALUE dcvSpecular; - }; - union { - D3DCOLORVALUE emissive; /* Emissive color RGB */ - D3DCOLORVALUE dcvEmissive; - }; - union { - D3DVALUE power; /* Sharpness if specular highlight */ - D3DVALUE dvPower; - }; -} D3DMATERIAL7, *LPD3DMATERIAL7; - -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -#if(DIRECT3D_VERSION < 0x0800) - -typedef enum _D3DLIGHTTYPE { - D3DLIGHT_POINT = 1, - D3DLIGHT_SPOT = 2, - D3DLIGHT_DIRECTIONAL = 3, -// Note: The following light type (D3DLIGHT_PARALLELPOINT) -// is no longer supported from D3D for DX7 onwards. - D3DLIGHT_PARALLELPOINT = 4, -#if(DIRECT3D_VERSION < 0x0500) // For backward compatible headers - D3DLIGHT_GLSPOT = 5, -#endif - D3DLIGHT_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DLIGHTTYPE; - -#else -typedef enum _D3DLIGHTTYPE D3DLIGHTTYPE; -#define D3DLIGHT_PARALLELPOINT (D3DLIGHTTYPE)4 -#define D3DLIGHT_GLSPOT (D3DLIGHTTYPE)5 - -#endif //(DIRECT3D_VERSION < 0x0800) - -/* - * Structure defining a light source and its properties. - */ -typedef struct _D3DLIGHT { - DWORD dwSize; - D3DLIGHTTYPE dltType; /* Type of light source */ - D3DCOLORVALUE dcvColor; /* Color of light */ - D3DVECTOR dvPosition; /* Position in world space */ - D3DVECTOR dvDirection; /* Direction in world space */ - D3DVALUE dvRange; /* Cutoff range */ - D3DVALUE dvFalloff; /* Falloff */ - D3DVALUE dvAttenuation0; /* Constant attenuation */ - D3DVALUE dvAttenuation1; /* Linear attenuation */ - D3DVALUE dvAttenuation2; /* Quadratic attenuation */ - D3DVALUE dvTheta; /* Inner angle of spotlight cone */ - D3DVALUE dvPhi; /* Outer angle of spotlight cone */ -} D3DLIGHT, *LPD3DLIGHT; - -#if(DIRECT3D_VERSION >= 0x0700) - -typedef struct _D3DLIGHT7 { - D3DLIGHTTYPE dltType; /* Type of light source */ - D3DCOLORVALUE dcvDiffuse; /* Diffuse color of light */ - D3DCOLORVALUE dcvSpecular; /* Specular color of light */ - D3DCOLORVALUE dcvAmbient; /* Ambient color of light */ - D3DVECTOR dvPosition; /* Position in world space */ - D3DVECTOR dvDirection; /* Direction in world space */ - D3DVALUE dvRange; /* Cutoff range */ - D3DVALUE dvFalloff; /* Falloff */ - D3DVALUE dvAttenuation0; /* Constant attenuation */ - D3DVALUE dvAttenuation1; /* Linear attenuation */ - D3DVALUE dvAttenuation2; /* Quadratic attenuation */ - D3DVALUE dvTheta; /* Inner angle of spotlight cone */ - D3DVALUE dvPhi; /* Outer angle of spotlight cone */ -} D3DLIGHT7, *LPD3DLIGHT7; - -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -#if(DIRECT3D_VERSION >= 0x0500) -/* - * Structure defining a light source and its properties. - */ - -/* flags bits */ -#define D3DLIGHT_ACTIVE 0x00000001 -#define D3DLIGHT_NO_SPECULAR 0x00000002 -#define D3DLIGHT_ALL (D3DLIGHT_ACTIVE | D3DLIGHT_NO_SPECULAR) - -/* maximum valid light range */ -#define D3DLIGHT_RANGE_MAX ((float)sqrt(FLT_MAX)) - -typedef struct _D3DLIGHT2 { - DWORD dwSize; - D3DLIGHTTYPE dltType; /* Type of light source */ - D3DCOLORVALUE dcvColor; /* Color of light */ - D3DVECTOR dvPosition; /* Position in world space */ - D3DVECTOR dvDirection; /* Direction in world space */ - D3DVALUE dvRange; /* Cutoff range */ - D3DVALUE dvFalloff; /* Falloff */ - D3DVALUE dvAttenuation0; /* Constant attenuation */ - D3DVALUE dvAttenuation1; /* Linear attenuation */ - D3DVALUE dvAttenuation2; /* Quadratic attenuation */ - D3DVALUE dvTheta; /* Inner angle of spotlight cone */ - D3DVALUE dvPhi; /* Outer angle of spotlight cone */ - DWORD dwFlags; -} D3DLIGHT2, *LPD3DLIGHT2; - -#endif /* DIRECT3D_VERSION >= 0x0500 */ -typedef struct _D3DLIGHTDATA { - DWORD dwSize; - LPD3DLIGHTINGELEMENT lpIn; /* Input positions and normals */ - DWORD dwInSize; /* Stride of input elements */ - LPD3DTLVERTEX lpOut; /* Output colors */ - DWORD dwOutSize; /* Stride of output colors */ -} D3DLIGHTDATA, *LPD3DLIGHTDATA; - -#if(DIRECT3D_VERSION >= 0x0500) -/* - * Before DX5, these values were in an enum called - * D3DCOLORMODEL. This was not correct, since they are - * bit flags. A driver can surface either or both flags - * in the dcmColorModel member of D3DDEVICEDESC. - */ -#define D3DCOLOR_MONO 1 -#define D3DCOLOR_RGB 2 - -typedef DWORD D3DCOLORMODEL; -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -/* - * Options for clearing - */ -#define D3DCLEAR_TARGET 0x00000001l /* Clear target surface */ -#define D3DCLEAR_ZBUFFER 0x00000002l /* Clear target z buffer */ -#if(DIRECT3D_VERSION >= 0x0600) -#define D3DCLEAR_STENCIL 0x00000004l /* Clear stencil planes */ -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -/* - * Execute buffers are allocated via Direct3D. These buffers may then - * be filled by the application with instructions to execute along with - * vertex data. - */ - -/* - * Supported op codes for execute instructions. - */ -typedef enum _D3DOPCODE { - D3DOP_POINT = 1, - D3DOP_LINE = 2, - D3DOP_TRIANGLE = 3, - D3DOP_MATRIXLOAD = 4, - D3DOP_MATRIXMULTIPLY = 5, - D3DOP_STATETRANSFORM = 6, - D3DOP_STATELIGHT = 7, - D3DOP_STATERENDER = 8, - D3DOP_PROCESSVERTICES = 9, - D3DOP_TEXTURELOAD = 10, - D3DOP_EXIT = 11, - D3DOP_BRANCHFORWARD = 12, - D3DOP_SPAN = 13, - D3DOP_SETSTATUS = 14, -#if(DIRECT3D_VERSION >= 0x0500) - D3DOP_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DOPCODE; - -typedef struct _D3DINSTRUCTION { - BYTE bOpcode; /* Instruction opcode */ - BYTE bSize; /* Size of each instruction data unit */ - WORD wCount; /* Count of instruction data units to follow */ -} D3DINSTRUCTION, *LPD3DINSTRUCTION; - -/* - * Structure for texture loads - */ -typedef struct _D3DTEXTURELOAD { - D3DTEXTUREHANDLE hDestTexture; - D3DTEXTUREHANDLE hSrcTexture; -} D3DTEXTURELOAD, *LPD3DTEXTURELOAD; - -/* - * Structure for picking - */ -typedef struct _D3DPICKRECORD { - BYTE bOpcode; - BYTE bPad; - DWORD dwOffset; - D3DVALUE dvZ; -} D3DPICKRECORD, *LPD3DPICKRECORD; - -/* - * The following defines the rendering states which can be set in the - * execute buffer. - */ - -#if(DIRECT3D_VERSION < 0x0800) - -typedef enum _D3DSHADEMODE { - D3DSHADE_FLAT = 1, - D3DSHADE_GOURAUD = 2, - D3DSHADE_PHONG = 3, -#if(DIRECT3D_VERSION >= 0x0500) - D3DSHADE_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DSHADEMODE; - -typedef enum _D3DFILLMODE { - D3DFILL_POINT = 1, - D3DFILL_WIREFRAME = 2, - D3DFILL_SOLID = 3, -#if(DIRECT3D_VERSION >= 0x0500) - D3DFILL_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DFILLMODE; - -typedef struct _D3DLINEPATTERN { - WORD wRepeatFactor; - WORD wLinePattern; -} D3DLINEPATTERN; - -#endif //(DIRECT3D_VERSION < 0x0800) - -typedef enum _D3DTEXTUREFILTER { - D3DFILTER_NEAREST = 1, - D3DFILTER_LINEAR = 2, - D3DFILTER_MIPNEAREST = 3, - D3DFILTER_MIPLINEAR = 4, - D3DFILTER_LINEARMIPNEAREST = 5, - D3DFILTER_LINEARMIPLINEAR = 6, -#if(DIRECT3D_VERSION >= 0x0500) - D3DFILTER_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DTEXTUREFILTER; - -#if(DIRECT3D_VERSION < 0x0800) - -typedef enum _D3DBLEND { - D3DBLEND_ZERO = 1, - D3DBLEND_ONE = 2, - D3DBLEND_SRCCOLOR = 3, - D3DBLEND_INVSRCCOLOR = 4, - D3DBLEND_SRCALPHA = 5, - D3DBLEND_INVSRCALPHA = 6, - D3DBLEND_DESTALPHA = 7, - D3DBLEND_INVDESTALPHA = 8, - D3DBLEND_DESTCOLOR = 9, - D3DBLEND_INVDESTCOLOR = 10, - D3DBLEND_SRCALPHASAT = 11, - D3DBLEND_BOTHSRCALPHA = 12, - D3DBLEND_BOTHINVSRCALPHA = 13, -#if(DIRECT3D_VERSION >= 0x0500) - D3DBLEND_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DBLEND; - -#endif //(DIRECT3D_VERSION < 0x0800) - -typedef enum _D3DTEXTUREBLEND { - D3DTBLEND_DECAL = 1, - D3DTBLEND_MODULATE = 2, - D3DTBLEND_DECALALPHA = 3, - D3DTBLEND_MODULATEALPHA = 4, - D3DTBLEND_DECALMASK = 5, - D3DTBLEND_MODULATEMASK = 6, - D3DTBLEND_COPY = 7, -#if(DIRECT3D_VERSION >= 0x0500) - D3DTBLEND_ADD = 8, - D3DTBLEND_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DTEXTUREBLEND; - -#if(DIRECT3D_VERSION < 0x0800) - -typedef enum _D3DTEXTUREADDRESS { - D3DTADDRESS_WRAP = 1, - D3DTADDRESS_MIRROR = 2, - D3DTADDRESS_CLAMP = 3, -#if(DIRECT3D_VERSION >= 0x0500) - D3DTADDRESS_BORDER = 4, - D3DTADDRESS_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DTEXTUREADDRESS; - -typedef enum _D3DCULL { - D3DCULL_NONE = 1, - D3DCULL_CW = 2, - D3DCULL_CCW = 3, -#if(DIRECT3D_VERSION >= 0x0500) - D3DCULL_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DCULL; - -typedef enum _D3DCMPFUNC { - D3DCMP_NEVER = 1, - D3DCMP_LESS = 2, - D3DCMP_EQUAL = 3, - D3DCMP_LESSEQUAL = 4, - D3DCMP_GREATER = 5, - D3DCMP_NOTEQUAL = 6, - D3DCMP_GREATEREQUAL = 7, - D3DCMP_ALWAYS = 8, -#if(DIRECT3D_VERSION >= 0x0500) - D3DCMP_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DCMPFUNC; - -#if(DIRECT3D_VERSION >= 0x0600) -typedef enum _D3DSTENCILOP { - D3DSTENCILOP_KEEP = 1, - D3DSTENCILOP_ZERO = 2, - D3DSTENCILOP_REPLACE = 3, - D3DSTENCILOP_INCRSAT = 4, - D3DSTENCILOP_DECRSAT = 5, - D3DSTENCILOP_INVERT = 6, - D3DSTENCILOP_INCR = 7, - D3DSTENCILOP_DECR = 8, - D3DSTENCILOP_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DSTENCILOP; -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -typedef enum _D3DFOGMODE { - D3DFOG_NONE = 0, - D3DFOG_EXP = 1, - D3DFOG_EXP2 = 2, -#if(DIRECT3D_VERSION >= 0x0500) - D3DFOG_LINEAR = 3, - D3DFOG_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DFOGMODE; - -#if(DIRECT3D_VERSION >= 0x0600) -typedef enum _D3DZBUFFERTYPE { - D3DZB_FALSE = 0, - D3DZB_TRUE = 1, // Z buffering - D3DZB_USEW = 2, // W buffering - D3DZB_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DZBUFFERTYPE; -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -#endif //(DIRECT3D_VERSION < 0x0800) - -#if(DIRECT3D_VERSION >= 0x0500) -typedef enum _D3DANTIALIASMODE { - D3DANTIALIAS_NONE = 0, - D3DANTIALIAS_SORTDEPENDENT = 1, - D3DANTIALIAS_SORTINDEPENDENT = 2, - D3DANTIALIAS_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DANTIALIASMODE; - -// Vertex types supported by Direct3D -typedef enum _D3DVERTEXTYPE { - D3DVT_VERTEX = 1, - D3DVT_LVERTEX = 2, - D3DVT_TLVERTEX = 3, - D3DVT_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DVERTEXTYPE; - -#if(DIRECT3D_VERSION < 0x0800) - -// Primitives supported by draw-primitive API -typedef enum _D3DPRIMITIVETYPE { - D3DPT_POINTLIST = 1, - D3DPT_LINELIST = 2, - D3DPT_LINESTRIP = 3, - D3DPT_TRIANGLELIST = 4, - D3DPT_TRIANGLESTRIP = 5, - D3DPT_TRIANGLEFAN = 6, - D3DPT_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DPRIMITIVETYPE; - -#endif //(DIRECT3D_VERSION < 0x0800) - -#endif /* DIRECT3D_VERSION >= 0x0500 */ -/* - * Amount to add to a state to generate the override for that state. - */ -#define D3DSTATE_OVERRIDE_BIAS 256 - -/* - * A state which sets the override flag for the specified state type. - */ -#define D3DSTATE_OVERRIDE(type) (D3DRENDERSTATETYPE)(((DWORD) (type) + D3DSTATE_OVERRIDE_BIAS)) - -#if(DIRECT3D_VERSION < 0x0800) - -typedef enum _D3DTRANSFORMSTATETYPE { - D3DTRANSFORMSTATE_WORLD = 1, - D3DTRANSFORMSTATE_VIEW = 2, - D3DTRANSFORMSTATE_PROJECTION = 3, -#if(DIRECT3D_VERSION >= 0x0700) - D3DTRANSFORMSTATE_WORLD1 = 4, // 2nd matrix to blend - D3DTRANSFORMSTATE_WORLD2 = 5, // 3rd matrix to blend - D3DTRANSFORMSTATE_WORLD3 = 6, // 4th matrix to blend - D3DTRANSFORMSTATE_TEXTURE0 = 16, - D3DTRANSFORMSTATE_TEXTURE1 = 17, - D3DTRANSFORMSTATE_TEXTURE2 = 18, - D3DTRANSFORMSTATE_TEXTURE3 = 19, - D3DTRANSFORMSTATE_TEXTURE4 = 20, - D3DTRANSFORMSTATE_TEXTURE5 = 21, - D3DTRANSFORMSTATE_TEXTURE6 = 22, - D3DTRANSFORMSTATE_TEXTURE7 = 23, -#endif /* DIRECT3D_VERSION >= 0x0700 */ -#if(DIRECT3D_VERSION >= 0x0500) - D3DTRANSFORMSTATE_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DTRANSFORMSTATETYPE; - -#else - -// -// legacy transform state names -// -typedef enum _D3DTRANSFORMSTATETYPE D3DTRANSFORMSTATETYPE; -#define D3DTRANSFORMSTATE_WORLD (D3DTRANSFORMSTATETYPE)1 -#define D3DTRANSFORMSTATE_VIEW (D3DTRANSFORMSTATETYPE)2 -#define D3DTRANSFORMSTATE_PROJECTION (D3DTRANSFORMSTATETYPE)3 -#define D3DTRANSFORMSTATE_WORLD1 (D3DTRANSFORMSTATETYPE)4 -#define D3DTRANSFORMSTATE_WORLD2 (D3DTRANSFORMSTATETYPE)5 -#define D3DTRANSFORMSTATE_WORLD3 (D3DTRANSFORMSTATETYPE)6 -#define D3DTRANSFORMSTATE_TEXTURE0 (D3DTRANSFORMSTATETYPE)16 -#define D3DTRANSFORMSTATE_TEXTURE1 (D3DTRANSFORMSTATETYPE)17 -#define D3DTRANSFORMSTATE_TEXTURE2 (D3DTRANSFORMSTATETYPE)18 -#define D3DTRANSFORMSTATE_TEXTURE3 (D3DTRANSFORMSTATETYPE)19 -#define D3DTRANSFORMSTATE_TEXTURE4 (D3DTRANSFORMSTATETYPE)20 -#define D3DTRANSFORMSTATE_TEXTURE5 (D3DTRANSFORMSTATETYPE)21 -#define D3DTRANSFORMSTATE_TEXTURE6 (D3DTRANSFORMSTATETYPE)22 -#define D3DTRANSFORMSTATE_TEXTURE7 (D3DTRANSFORMSTATETYPE)23 - -#endif //(DIRECT3D_VERSION < 0x0800) - -typedef enum _D3DLIGHTSTATETYPE { - D3DLIGHTSTATE_MATERIAL = 1, - D3DLIGHTSTATE_AMBIENT = 2, - D3DLIGHTSTATE_COLORMODEL = 3, - D3DLIGHTSTATE_FOGMODE = 4, - D3DLIGHTSTATE_FOGSTART = 5, - D3DLIGHTSTATE_FOGEND = 6, - D3DLIGHTSTATE_FOGDENSITY = 7, -#if(DIRECT3D_VERSION >= 0x0600) - D3DLIGHTSTATE_COLORVERTEX = 8, -#endif /* DIRECT3D_VERSION >= 0x0600 */ -#if(DIRECT3D_VERSION >= 0x0500) - D3DLIGHTSTATE_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DLIGHTSTATETYPE; - -#if(DIRECT3D_VERSION < 0x0800) - -typedef enum _D3DRENDERSTATETYPE { - D3DRENDERSTATE_ANTIALIAS = 2, /* D3DANTIALIASMODE */ - D3DRENDERSTATE_TEXTUREPERSPECTIVE = 4, /* TRUE for perspective correction */ - D3DRENDERSTATE_ZENABLE = 7, /* D3DZBUFFERTYPE (or TRUE/FALSE for legacy) */ - D3DRENDERSTATE_FILLMODE = 8, /* D3DFILL_MODE */ - D3DRENDERSTATE_SHADEMODE = 9, /* D3DSHADEMODE */ - D3DRENDERSTATE_LINEPATTERN = 10, /* D3DLINEPATTERN */ - D3DRENDERSTATE_ZWRITEENABLE = 14, /* TRUE to enable z writes */ - D3DRENDERSTATE_ALPHATESTENABLE = 15, /* TRUE to enable alpha tests */ - D3DRENDERSTATE_LASTPIXEL = 16, /* TRUE for last-pixel on lines */ - D3DRENDERSTATE_SRCBLEND = 19, /* D3DBLEND */ - D3DRENDERSTATE_DESTBLEND = 20, /* D3DBLEND */ - D3DRENDERSTATE_CULLMODE = 22, /* D3DCULL */ - D3DRENDERSTATE_ZFUNC = 23, /* D3DCMPFUNC */ - D3DRENDERSTATE_ALPHAREF = 24, /* D3DFIXED */ - D3DRENDERSTATE_ALPHAFUNC = 25, /* D3DCMPFUNC */ - D3DRENDERSTATE_DITHERENABLE = 26, /* TRUE to enable dithering */ -#if(DIRECT3D_VERSION >= 0x0500) - D3DRENDERSTATE_ALPHABLENDENABLE = 27, /* TRUE to enable alpha blending */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ - D3DRENDERSTATE_FOGENABLE = 28, /* TRUE to enable fog blending */ - D3DRENDERSTATE_SPECULARENABLE = 29, /* TRUE to enable specular */ - D3DRENDERSTATE_ZVISIBLE = 30, /* TRUE to enable z checking */ - D3DRENDERSTATE_STIPPLEDALPHA = 33, /* TRUE to enable stippled alpha (RGB device only) */ - D3DRENDERSTATE_FOGCOLOR = 34, /* D3DCOLOR */ - D3DRENDERSTATE_FOGTABLEMODE = 35, /* D3DFOGMODE */ -#if(DIRECT3D_VERSION >= 0x0700) - D3DRENDERSTATE_FOGSTART = 36, /* Fog start (for both vertex and pixel fog) */ - D3DRENDERSTATE_FOGEND = 37, /* Fog end */ - D3DRENDERSTATE_FOGDENSITY = 38, /* Fog density */ -#endif /* DIRECT3D_VERSION >= 0x0700 */ -#if(DIRECT3D_VERSION >= 0x0500) - D3DRENDERSTATE_EDGEANTIALIAS = 40, /* TRUE to enable edge antialiasing */ - D3DRENDERSTATE_COLORKEYENABLE = 41, /* TRUE to enable source colorkeyed textures */ - D3DRENDERSTATE_ZBIAS = 47, /* LONG Z bias */ - D3DRENDERSTATE_RANGEFOGENABLE = 48, /* Enables range-based fog */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#if(DIRECT3D_VERSION >= 0x0600) - D3DRENDERSTATE_STENCILENABLE = 52, /* BOOL enable/disable stenciling */ - D3DRENDERSTATE_STENCILFAIL = 53, /* D3DSTENCILOP to do if stencil test fails */ - D3DRENDERSTATE_STENCILZFAIL = 54, /* D3DSTENCILOP to do if stencil test passes and Z test fails */ - D3DRENDERSTATE_STENCILPASS = 55, /* D3DSTENCILOP to do if both stencil and Z tests pass */ - D3DRENDERSTATE_STENCILFUNC = 56, /* D3DCMPFUNC fn. Stencil Test passes if ((ref & mask) stencilfn (stencil & mask)) is true */ - D3DRENDERSTATE_STENCILREF = 57, /* Reference value used in stencil test */ - D3DRENDERSTATE_STENCILMASK = 58, /* Mask value used in stencil test */ - D3DRENDERSTATE_STENCILWRITEMASK = 59, /* Write mask applied to values written to stencil buffer */ - D3DRENDERSTATE_TEXTUREFACTOR = 60, /* D3DCOLOR used for multi-texture blend */ -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -#if(DIRECT3D_VERSION >= 0x0600) - - /* - * 128 values [128, 255] are reserved for texture coordinate wrap flags. - * These are constructed with the D3DWRAP_U and D3DWRAP_V macros. Using - * a flags word preserves forward compatibility with texture coordinates - * that are >2D. - */ - D3DRENDERSTATE_WRAP0 = 128, /* wrap for 1st texture coord. set */ - D3DRENDERSTATE_WRAP1 = 129, /* wrap for 2nd texture coord. set */ - D3DRENDERSTATE_WRAP2 = 130, /* wrap for 3rd texture coord. set */ - D3DRENDERSTATE_WRAP3 = 131, /* wrap for 4th texture coord. set */ - D3DRENDERSTATE_WRAP4 = 132, /* wrap for 5th texture coord. set */ - D3DRENDERSTATE_WRAP5 = 133, /* wrap for 6th texture coord. set */ - D3DRENDERSTATE_WRAP6 = 134, /* wrap for 7th texture coord. set */ - D3DRENDERSTATE_WRAP7 = 135, /* wrap for 8th texture coord. set */ -#endif /* DIRECT3D_VERSION >= 0x0600 */ -#if(DIRECT3D_VERSION >= 0x0700) - D3DRENDERSTATE_CLIPPING = 136, - D3DRENDERSTATE_LIGHTING = 137, - D3DRENDERSTATE_EXTENTS = 138, - D3DRENDERSTATE_AMBIENT = 139, - D3DRENDERSTATE_FOGVERTEXMODE = 140, - D3DRENDERSTATE_COLORVERTEX = 141, - D3DRENDERSTATE_LOCALVIEWER = 142, - D3DRENDERSTATE_NORMALIZENORMALS = 143, - D3DRENDERSTATE_COLORKEYBLENDENABLE = 144, - D3DRENDERSTATE_DIFFUSEMATERIALSOURCE = 145, - D3DRENDERSTATE_SPECULARMATERIALSOURCE = 146, - D3DRENDERSTATE_AMBIENTMATERIALSOURCE = 147, - D3DRENDERSTATE_EMISSIVEMATERIALSOURCE = 148, - D3DRENDERSTATE_VERTEXBLEND = 151, - D3DRENDERSTATE_CLIPPLANEENABLE = 152, - -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -// -// retired renderstates - not supported for DX7 interfaces -// - D3DRENDERSTATE_TEXTUREHANDLE = 1, /* Texture handle for legacy interfaces (Texture,Texture2) */ - D3DRENDERSTATE_TEXTUREADDRESS = 3, /* D3DTEXTUREADDRESS */ - D3DRENDERSTATE_WRAPU = 5, /* TRUE for wrapping in u */ - D3DRENDERSTATE_WRAPV = 6, /* TRUE for wrapping in v */ - D3DRENDERSTATE_MONOENABLE = 11, /* TRUE to enable mono rasterization */ - D3DRENDERSTATE_ROP2 = 12, /* ROP2 */ - D3DRENDERSTATE_PLANEMASK = 13, /* DWORD physical plane mask */ - D3DRENDERSTATE_TEXTUREMAG = 17, /* D3DTEXTUREFILTER */ - D3DRENDERSTATE_TEXTUREMIN = 18, /* D3DTEXTUREFILTER */ - D3DRENDERSTATE_TEXTUREMAPBLEND = 21, /* D3DTEXTUREBLEND */ - D3DRENDERSTATE_SUBPIXEL = 31, /* TRUE to enable subpixel correction */ - D3DRENDERSTATE_SUBPIXELX = 32, /* TRUE to enable correction in X only */ - D3DRENDERSTATE_STIPPLEENABLE = 39, /* TRUE to enable stippling */ -#if(DIRECT3D_VERSION >= 0x0500) - D3DRENDERSTATE_BORDERCOLOR = 43, /* Border color for texturing w/border */ - D3DRENDERSTATE_TEXTUREADDRESSU = 44, /* Texture addressing mode for U coordinate */ - D3DRENDERSTATE_TEXTUREADDRESSV = 45, /* Texture addressing mode for V coordinate */ - D3DRENDERSTATE_MIPMAPLODBIAS = 46, /* D3DVALUE Mipmap LOD bias */ - D3DRENDERSTATE_ANISOTROPY = 49, /* Max. anisotropy. 1 = no anisotropy */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ - D3DRENDERSTATE_FLUSHBATCH = 50, /* Explicit flush for DP batching (DX5 Only) */ -#if(DIRECT3D_VERSION >= 0x0600) - D3DRENDERSTATE_TRANSLUCENTSORTINDEPENDENT=51, /* BOOL enable sort-independent transparency */ -#endif /* DIRECT3D_VERSION >= 0x0600 */ - D3DRENDERSTATE_STIPPLEPATTERN00 = 64, /* Stipple pattern 01... */ - D3DRENDERSTATE_STIPPLEPATTERN01 = 65, - D3DRENDERSTATE_STIPPLEPATTERN02 = 66, - D3DRENDERSTATE_STIPPLEPATTERN03 = 67, - D3DRENDERSTATE_STIPPLEPATTERN04 = 68, - D3DRENDERSTATE_STIPPLEPATTERN05 = 69, - D3DRENDERSTATE_STIPPLEPATTERN06 = 70, - D3DRENDERSTATE_STIPPLEPATTERN07 = 71, - D3DRENDERSTATE_STIPPLEPATTERN08 = 72, - D3DRENDERSTATE_STIPPLEPATTERN09 = 73, - D3DRENDERSTATE_STIPPLEPATTERN10 = 74, - D3DRENDERSTATE_STIPPLEPATTERN11 = 75, - D3DRENDERSTATE_STIPPLEPATTERN12 = 76, - D3DRENDERSTATE_STIPPLEPATTERN13 = 77, - D3DRENDERSTATE_STIPPLEPATTERN14 = 78, - D3DRENDERSTATE_STIPPLEPATTERN15 = 79, - D3DRENDERSTATE_STIPPLEPATTERN16 = 80, - D3DRENDERSTATE_STIPPLEPATTERN17 = 81, - D3DRENDERSTATE_STIPPLEPATTERN18 = 82, - D3DRENDERSTATE_STIPPLEPATTERN19 = 83, - D3DRENDERSTATE_STIPPLEPATTERN20 = 84, - D3DRENDERSTATE_STIPPLEPATTERN21 = 85, - D3DRENDERSTATE_STIPPLEPATTERN22 = 86, - D3DRENDERSTATE_STIPPLEPATTERN23 = 87, - D3DRENDERSTATE_STIPPLEPATTERN24 = 88, - D3DRENDERSTATE_STIPPLEPATTERN25 = 89, - D3DRENDERSTATE_STIPPLEPATTERN26 = 90, - D3DRENDERSTATE_STIPPLEPATTERN27 = 91, - D3DRENDERSTATE_STIPPLEPATTERN28 = 92, - D3DRENDERSTATE_STIPPLEPATTERN29 = 93, - D3DRENDERSTATE_STIPPLEPATTERN30 = 94, - D3DRENDERSTATE_STIPPLEPATTERN31 = 95, - -// -// retired renderstate names - the values are still used under new naming conventions -// - D3DRENDERSTATE_FOGTABLESTART = 36, /* Fog table start */ - D3DRENDERSTATE_FOGTABLEEND = 37, /* Fog table end */ - D3DRENDERSTATE_FOGTABLEDENSITY = 38, /* Fog table density */ - -#if(DIRECT3D_VERSION >= 0x0500) - D3DRENDERSTATE_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -#endif /* DIRECT3D_VERSION >= 0x0500 */ -} D3DRENDERSTATETYPE; - -#else - -typedef enum _D3DRENDERSTATETYPE D3DRENDERSTATETYPE; - -// -// legacy renderstate names -// -#define D3DRENDERSTATE_TEXTUREPERSPECTIVE (D3DRENDERSTATETYPE)4 -#define D3DRENDERSTATE_ZENABLE (D3DRENDERSTATETYPE)7 -#define D3DRENDERSTATE_FILLMODE (D3DRENDERSTATETYPE)8 -#define D3DRENDERSTATE_SHADEMODE (D3DRENDERSTATETYPE)9 -#define D3DRENDERSTATE_LINEPATTERN (D3DRENDERSTATETYPE)10 -#define D3DRENDERSTATE_ZWRITEENABLE (D3DRENDERSTATETYPE)14 -#define D3DRENDERSTATE_ALPHATESTENABLE (D3DRENDERSTATETYPE)15 -#define D3DRENDERSTATE_LASTPIXEL (D3DRENDERSTATETYPE)16 -#define D3DRENDERSTATE_SRCBLEND (D3DRENDERSTATETYPE)19 -#define D3DRENDERSTATE_DESTBLEND (D3DRENDERSTATETYPE)20 -#define D3DRENDERSTATE_CULLMODE (D3DRENDERSTATETYPE)22 -#define D3DRENDERSTATE_ZFUNC (D3DRENDERSTATETYPE)23 -#define D3DRENDERSTATE_ALPHAREF (D3DRENDERSTATETYPE)24 -#define D3DRENDERSTATE_ALPHAFUNC (D3DRENDERSTATETYPE)25 -#define D3DRENDERSTATE_DITHERENABLE (D3DRENDERSTATETYPE)26 -#define D3DRENDERSTATE_ALPHABLENDENABLE (D3DRENDERSTATETYPE)27 -#define D3DRENDERSTATE_FOGENABLE (D3DRENDERSTATETYPE)28 -#define D3DRENDERSTATE_SPECULARENABLE (D3DRENDERSTATETYPE)29 -#define D3DRENDERSTATE_ZVISIBLE (D3DRENDERSTATETYPE)30 -#define D3DRENDERSTATE_STIPPLEDALPHA (D3DRENDERSTATETYPE)33 -#define D3DRENDERSTATE_FOGCOLOR (D3DRENDERSTATETYPE)34 -#define D3DRENDERSTATE_FOGTABLEMODE (D3DRENDERSTATETYPE)35 -#define D3DRENDERSTATE_FOGSTART (D3DRENDERSTATETYPE)36 -#define D3DRENDERSTATE_FOGEND (D3DRENDERSTATETYPE)37 -#define D3DRENDERSTATE_FOGDENSITY (D3DRENDERSTATETYPE)38 -#define D3DRENDERSTATE_EDGEANTIALIAS (D3DRENDERSTATETYPE)40 -#define D3DRENDERSTATE_ZBIAS (D3DRENDERSTATETYPE)47 -#define D3DRENDERSTATE_RANGEFOGENABLE (D3DRENDERSTATETYPE)48 -#define D3DRENDERSTATE_STENCILENABLE (D3DRENDERSTATETYPE)52 -#define D3DRENDERSTATE_STENCILFAIL (D3DRENDERSTATETYPE)53 -#define D3DRENDERSTATE_STENCILZFAIL (D3DRENDERSTATETYPE)54 -#define D3DRENDERSTATE_STENCILPASS (D3DRENDERSTATETYPE)55 -#define D3DRENDERSTATE_STENCILFUNC (D3DRENDERSTATETYPE)56 -#define D3DRENDERSTATE_STENCILREF (D3DRENDERSTATETYPE)57 -#define D3DRENDERSTATE_STENCILMASK (D3DRENDERSTATETYPE)58 -#define D3DRENDERSTATE_STENCILWRITEMASK (D3DRENDERSTATETYPE)59 -#define D3DRENDERSTATE_TEXTUREFACTOR (D3DRENDERSTATETYPE)60 -#define D3DRENDERSTATE_WRAP0 (D3DRENDERSTATETYPE)128 -#define D3DRENDERSTATE_WRAP1 (D3DRENDERSTATETYPE)129 -#define D3DRENDERSTATE_WRAP2 (D3DRENDERSTATETYPE)130 -#define D3DRENDERSTATE_WRAP3 (D3DRENDERSTATETYPE)131 -#define D3DRENDERSTATE_WRAP4 (D3DRENDERSTATETYPE)132 -#define D3DRENDERSTATE_WRAP5 (D3DRENDERSTATETYPE)133 -#define D3DRENDERSTATE_WRAP6 (D3DRENDERSTATETYPE)134 -#define D3DRENDERSTATE_WRAP7 (D3DRENDERSTATETYPE)135 - -#define D3DRENDERSTATE_CLIPPING (D3DRENDERSTATETYPE)136 -#define D3DRENDERSTATE_LIGHTING (D3DRENDERSTATETYPE)137 -#define D3DRENDERSTATE_EXTENTS (D3DRENDERSTATETYPE)138 -#define D3DRENDERSTATE_AMBIENT (D3DRENDERSTATETYPE)139 -#define D3DRENDERSTATE_FOGVERTEXMODE (D3DRENDERSTATETYPE)140 -#define D3DRENDERSTATE_COLORVERTEX (D3DRENDERSTATETYPE)141 -#define D3DRENDERSTATE_LOCALVIEWER (D3DRENDERSTATETYPE)142 -#define D3DRENDERSTATE_NORMALIZENORMALS (D3DRENDERSTATETYPE)143 -#define D3DRENDERSTATE_COLORKEYBLENDENABLE (D3DRENDERSTATETYPE)144 -#define D3DRENDERSTATE_DIFFUSEMATERIALSOURCE (D3DRENDERSTATETYPE)145 -#define D3DRENDERSTATE_SPECULARMATERIALSOURCE (D3DRENDERSTATETYPE)146 -#define D3DRENDERSTATE_AMBIENTMATERIALSOURCE (D3DRENDERSTATETYPE)147 -#define D3DRENDERSTATE_EMISSIVEMATERIALSOURCE (D3DRENDERSTATETYPE)148 -#define D3DRENDERSTATE_VERTEXBLEND (D3DRENDERSTATETYPE)151 -#define D3DRENDERSTATE_CLIPPLANEENABLE (D3DRENDERSTATETYPE)152 - -// -// retired renderstates - not supported for DX7 interfaces -// -#define D3DRENDERSTATE_TEXTUREHANDLE (D3DRENDERSTATETYPE)1 -#define D3DRENDERSTATE_ANTIALIAS (D3DRENDERSTATETYPE)2 -#define D3DRENDERSTATE_TEXTUREADDRESS (D3DRENDERSTATETYPE)3 -#define D3DRENDERSTATE_WRAPU (D3DRENDERSTATETYPE)5 -#define D3DRENDERSTATE_WRAPV (D3DRENDERSTATETYPE)6 -#define D3DRENDERSTATE_MONOENABLE (D3DRENDERSTATETYPE)11 -#define D3DRENDERSTATE_ROP2 (D3DRENDERSTATETYPE)12 -#define D3DRENDERSTATE_PLANEMASK (D3DRENDERSTATETYPE)13 -#define D3DRENDERSTATE_TEXTUREMAG (D3DRENDERSTATETYPE)17 -#define D3DRENDERSTATE_TEXTUREMIN (D3DRENDERSTATETYPE)18 -#define D3DRENDERSTATE_TEXTUREMAPBLEND (D3DRENDERSTATETYPE)21 -#define D3DRENDERSTATE_SUBPIXEL (D3DRENDERSTATETYPE)31 -#define D3DRENDERSTATE_SUBPIXELX (D3DRENDERSTATETYPE)32 -#define D3DRENDERSTATE_STIPPLEENABLE (D3DRENDERSTATETYPE)39 -#define D3DRENDERSTATE_OLDALPHABLENDENABLE (D3DRENDERSTATETYPE)42 -#define D3DRENDERSTATE_BORDERCOLOR (D3DRENDERSTATETYPE)43 -#define D3DRENDERSTATE_TEXTUREADDRESSU (D3DRENDERSTATETYPE)44 -#define D3DRENDERSTATE_TEXTUREADDRESSV (D3DRENDERSTATETYPE)45 -#define D3DRENDERSTATE_MIPMAPLODBIAS (D3DRENDERSTATETYPE)46 -#define D3DRENDERSTATE_ANISOTROPY (D3DRENDERSTATETYPE)49 -#define D3DRENDERSTATE_FLUSHBATCH (D3DRENDERSTATETYPE)50 -#define D3DRENDERSTATE_TRANSLUCENTSORTINDEPENDENT (D3DRENDERSTATETYPE)51 -#define D3DRENDERSTATE_STIPPLEPATTERN00 (D3DRENDERSTATETYPE)64 -#define D3DRENDERSTATE_STIPPLEPATTERN01 (D3DRENDERSTATETYPE)65 -#define D3DRENDERSTATE_STIPPLEPATTERN02 (D3DRENDERSTATETYPE)66 -#define D3DRENDERSTATE_STIPPLEPATTERN03 (D3DRENDERSTATETYPE)67 -#define D3DRENDERSTATE_STIPPLEPATTERN04 (D3DRENDERSTATETYPE)68 -#define D3DRENDERSTATE_STIPPLEPATTERN05 (D3DRENDERSTATETYPE)69 -#define D3DRENDERSTATE_STIPPLEPATTERN06 (D3DRENDERSTATETYPE)70 -#define D3DRENDERSTATE_STIPPLEPATTERN07 (D3DRENDERSTATETYPE)71 -#define D3DRENDERSTATE_STIPPLEPATTERN08 (D3DRENDERSTATETYPE)72 -#define D3DRENDERSTATE_STIPPLEPATTERN09 (D3DRENDERSTATETYPE)73 -#define D3DRENDERSTATE_STIPPLEPATTERN10 (D3DRENDERSTATETYPE)74 -#define D3DRENDERSTATE_STIPPLEPATTERN11 (D3DRENDERSTATETYPE)75 -#define D3DRENDERSTATE_STIPPLEPATTERN12 (D3DRENDERSTATETYPE)76 -#define D3DRENDERSTATE_STIPPLEPATTERN13 (D3DRENDERSTATETYPE)77 -#define D3DRENDERSTATE_STIPPLEPATTERN14 (D3DRENDERSTATETYPE)78 -#define D3DRENDERSTATE_STIPPLEPATTERN15 (D3DRENDERSTATETYPE)79 -#define D3DRENDERSTATE_STIPPLEPATTERN16 (D3DRENDERSTATETYPE)80 -#define D3DRENDERSTATE_STIPPLEPATTERN17 (D3DRENDERSTATETYPE)81 -#define D3DRENDERSTATE_STIPPLEPATTERN18 (D3DRENDERSTATETYPE)82 -#define D3DRENDERSTATE_STIPPLEPATTERN19 (D3DRENDERSTATETYPE)83 -#define D3DRENDERSTATE_STIPPLEPATTERN20 (D3DRENDERSTATETYPE)84 -#define D3DRENDERSTATE_STIPPLEPATTERN21 (D3DRENDERSTATETYPE)85 -#define D3DRENDERSTATE_STIPPLEPATTERN22 (D3DRENDERSTATETYPE)86 -#define D3DRENDERSTATE_STIPPLEPATTERN23 (D3DRENDERSTATETYPE)87 -#define D3DRENDERSTATE_STIPPLEPATTERN24 (D3DRENDERSTATETYPE)88 -#define D3DRENDERSTATE_STIPPLEPATTERN25 (D3DRENDERSTATETYPE)89 -#define D3DRENDERSTATE_STIPPLEPATTERN26 (D3DRENDERSTATETYPE)90 -#define D3DRENDERSTATE_STIPPLEPATTERN27 (D3DRENDERSTATETYPE)91 -#define D3DRENDERSTATE_STIPPLEPATTERN28 (D3DRENDERSTATETYPE)92 -#define D3DRENDERSTATE_STIPPLEPATTERN29 (D3DRENDERSTATETYPE)93 -#define D3DRENDERSTATE_STIPPLEPATTERN30 (D3DRENDERSTATETYPE)94 -#define D3DRENDERSTATE_STIPPLEPATTERN31 (D3DRENDERSTATETYPE)95 - -// -// retired renderstates - not supported for DX8 interfaces -// -#define D3DRENDERSTATE_COLORKEYENABLE (D3DRENDERSTATETYPE)41 -#define D3DRENDERSTATE_COLORKEYBLENDENABLE (D3DRENDERSTATETYPE)144 - -// -// retired renderstate names - the values are still used under new naming conventions -// -#define D3DRENDERSTATE_BLENDENABLE (D3DRENDERSTATETYPE)27 -#define D3DRENDERSTATE_FOGTABLESTART (D3DRENDERSTATETYPE)36 -#define D3DRENDERSTATE_FOGTABLEEND (D3DRENDERSTATETYPE)37 -#define D3DRENDERSTATE_FOGTABLEDENSITY (D3DRENDERSTATETYPE)38 - -#endif //(DIRECT3D_VERSION < 0x0800) - - -#if(DIRECT3D_VERSION < 0x0800) - -// Values for material source -typedef enum _D3DMATERIALCOLORSOURCE -{ - D3DMCS_MATERIAL = 0, // Color from material is used - D3DMCS_COLOR1 = 1, // Diffuse vertex color is used - D3DMCS_COLOR2 = 2, // Specular vertex color is used - D3DMCS_FORCE_DWORD = 0x7fffffff, // force 32-bit size enum -} D3DMATERIALCOLORSOURCE; - - -#if(DIRECT3D_VERSION >= 0x0500) -// For back-compatibility with legacy compilations -#define D3DRENDERSTATE_BLENDENABLE D3DRENDERSTATE_ALPHABLENDENABLE -#endif /* DIRECT3D_VERSION >= 0x0500 */ - -#if(DIRECT3D_VERSION >= 0x0600) - -// Bias to apply to the texture coordinate set to apply a wrap to. -#define D3DRENDERSTATE_WRAPBIAS 128UL - -/* Flags to construct the WRAP render states */ -#define D3DWRAP_U 0x00000001L -#define D3DWRAP_V 0x00000002L - -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -#if(DIRECT3D_VERSION >= 0x0700) - -/* Flags to construct the WRAP render states for 1D thru 4D texture coordinates */ -#define D3DWRAPCOORD_0 0x00000001L // same as D3DWRAP_U -#define D3DWRAPCOORD_1 0x00000002L // same as D3DWRAP_V -#define D3DWRAPCOORD_2 0x00000004L -#define D3DWRAPCOORD_3 0x00000008L - -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -#endif //(DIRECT3D_VERSION < 0x0800) - -#define D3DRENDERSTATE_STIPPLEPATTERN(y) (D3DRENDERSTATE_STIPPLEPATTERN00 + (y)) - -typedef struct _D3DSTATE { - union { -#if(DIRECT3D_VERSION < 0x0800) - D3DTRANSFORMSTATETYPE dtstTransformStateType; -#endif //(DIRECT3D_VERSION < 0x0800) - D3DLIGHTSTATETYPE dlstLightStateType; - D3DRENDERSTATETYPE drstRenderStateType; - }; - union { - DWORD dwArg[1]; - D3DVALUE dvArg[1]; - }; -} D3DSTATE, *LPD3DSTATE; - - -/* - * Operation used to load matrices - * hDstMat = hSrcMat - */ -typedef struct _D3DMATRIXLOAD { - D3DMATRIXHANDLE hDestMatrix; /* Destination matrix */ - D3DMATRIXHANDLE hSrcMatrix; /* Source matrix */ -} D3DMATRIXLOAD, *LPD3DMATRIXLOAD; - -/* - * Operation used to multiply matrices - * hDstMat = hSrcMat1 * hSrcMat2 - */ -typedef struct _D3DMATRIXMULTIPLY { - D3DMATRIXHANDLE hDestMatrix; /* Destination matrix */ - D3DMATRIXHANDLE hSrcMatrix1; /* First source matrix */ - D3DMATRIXHANDLE hSrcMatrix2; /* Second source matrix */ -} D3DMATRIXMULTIPLY, *LPD3DMATRIXMULTIPLY; - -/* - * Operation used to transform and light vertices. - */ -typedef struct _D3DPROCESSVERTICES { - DWORD dwFlags; /* Do we transform or light or just copy? */ - WORD wStart; /* Index to first vertex in source */ - WORD wDest; /* Index to first vertex in local buffer */ - DWORD dwCount; /* Number of vertices to be processed */ - DWORD dwReserved; /* Must be zero */ -} D3DPROCESSVERTICES, *LPD3DPROCESSVERTICES; - -#define D3DPROCESSVERTICES_TRANSFORMLIGHT 0x00000000L -#define D3DPROCESSVERTICES_TRANSFORM 0x00000001L -#define D3DPROCESSVERTICES_COPY 0x00000002L -#define D3DPROCESSVERTICES_OPMASK 0x00000007L - -#define D3DPROCESSVERTICES_UPDATEEXTENTS 0x00000008L -#define D3DPROCESSVERTICES_NOCOLOR 0x00000010L - - -#if(DIRECT3D_VERSION >= 0x0600) - - -#if(DIRECT3D_VERSION < 0x0800) - -/* - * State enumerants for per-stage texture processing. - */ -typedef enum _D3DTEXTURESTAGESTATETYPE -{ - D3DTSS_COLOROP = 1, /* D3DTEXTUREOP - per-stage blending controls for color channels */ - D3DTSS_COLORARG1 = 2, /* D3DTA_* (texture arg) */ - D3DTSS_COLORARG2 = 3, /* D3DTA_* (texture arg) */ - D3DTSS_ALPHAOP = 4, /* D3DTEXTUREOP - per-stage blending controls for alpha channel */ - D3DTSS_ALPHAARG1 = 5, /* D3DTA_* (texture arg) */ - D3DTSS_ALPHAARG2 = 6, /* D3DTA_* (texture arg) */ - D3DTSS_BUMPENVMAT00 = 7, /* D3DVALUE (bump mapping matrix) */ - D3DTSS_BUMPENVMAT01 = 8, /* D3DVALUE (bump mapping matrix) */ - D3DTSS_BUMPENVMAT10 = 9, /* D3DVALUE (bump mapping matrix) */ - D3DTSS_BUMPENVMAT11 = 10, /* D3DVALUE (bump mapping matrix) */ - D3DTSS_TEXCOORDINDEX = 11, /* identifies which set of texture coordinates index this texture */ - D3DTSS_ADDRESS = 12, /* D3DTEXTUREADDRESS for both coordinates */ - D3DTSS_ADDRESSU = 13, /* D3DTEXTUREADDRESS for U coordinate */ - D3DTSS_ADDRESSV = 14, /* D3DTEXTUREADDRESS for V coordinate */ - D3DTSS_BORDERCOLOR = 15, /* D3DCOLOR */ - D3DTSS_MAGFILTER = 16, /* D3DTEXTUREMAGFILTER filter to use for magnification */ - D3DTSS_MINFILTER = 17, /* D3DTEXTUREMINFILTER filter to use for minification */ - D3DTSS_MIPFILTER = 18, /* D3DTEXTUREMIPFILTER filter to use between mipmaps during minification */ - D3DTSS_MIPMAPLODBIAS = 19, /* D3DVALUE Mipmap LOD bias */ - D3DTSS_MAXMIPLEVEL = 20, /* DWORD 0..(n-1) LOD index of largest map to use (0 == largest) */ - D3DTSS_MAXANISOTROPY = 21, /* DWORD maximum anisotropy */ - D3DTSS_BUMPENVLSCALE = 22, /* D3DVALUE scale for bump map luminance */ - D3DTSS_BUMPENVLOFFSET = 23, /* D3DVALUE offset for bump map luminance */ -#if(DIRECT3D_VERSION >= 0x0700) - D3DTSS_TEXTURETRANSFORMFLAGS = 24, /* D3DTEXTURETRANSFORMFLAGS controls texture transform */ -#endif /* DIRECT3D_VERSION >= 0x0700 */ - D3DTSS_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ -} D3DTEXTURESTAGESTATETYPE; - -#if(DIRECT3D_VERSION >= 0x0700) -// Values, used with D3DTSS_TEXCOORDINDEX, to specify that the vertex data(position -// and normal in the camera space) should be taken as texture coordinates -// Low 16 bits are used to specify texture coordinate index, to take the WRAP mode from -// -#define D3DTSS_TCI_PASSTHRU 0x00000000 -#define D3DTSS_TCI_CAMERASPACENORMAL 0x00010000 -#define D3DTSS_TCI_CAMERASPACEPOSITION 0x00020000 -#define D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR 0x00030000 -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -/* - * Enumerations for COLOROP and ALPHAOP texture blending operations set in - * texture processing stage controls in D3DRENDERSTATE. - */ -typedef enum _D3DTEXTUREOP -{ -// Control - D3DTOP_DISABLE = 1, // disables stage - D3DTOP_SELECTARG1 = 2, // the default - D3DTOP_SELECTARG2 = 3, - -// Modulate - D3DTOP_MODULATE = 4, // multiply args together - D3DTOP_MODULATE2X = 5, // multiply and 1 bit - D3DTOP_MODULATE4X = 6, // multiply and 2 bits - -// Add - D3DTOP_ADD = 7, // add arguments together - D3DTOP_ADDSIGNED = 8, // add with -0.5 bias - D3DTOP_ADDSIGNED2X = 9, // as above but left 1 bit - D3DTOP_SUBTRACT = 10, // Arg1 - Arg2, with no saturation - D3DTOP_ADDSMOOTH = 11, // add 2 args, subtract product - // Arg1 + Arg2 - Arg1*Arg2 - // = Arg1 + (1-Arg1)*Arg2 - -// Linear alpha blend: Arg1*(Alpha) + Arg2*(1-Alpha) - D3DTOP_BLENDDIFFUSEALPHA = 12, // iterated alpha - D3DTOP_BLENDTEXTUREALPHA = 13, // texture alpha - D3DTOP_BLENDFACTORALPHA = 14, // alpha from D3DRENDERSTATE_TEXTUREFACTOR - // Linear alpha blend with pre-multiplied arg1 input: Arg1 + Arg2*(1-Alpha) - D3DTOP_BLENDTEXTUREALPHAPM = 15, // texture alpha - D3DTOP_BLENDCURRENTALPHA = 16, // by alpha of current color - -// Specular mapping - D3DTOP_PREMODULATE = 17, // modulate with next texture before use - D3DTOP_MODULATEALPHA_ADDCOLOR = 18, // Arg1.RGB + Arg1.A*Arg2.RGB - // COLOROP only - D3DTOP_MODULATECOLOR_ADDALPHA = 19, // Arg1.RGB*Arg2.RGB + Arg1.A - // COLOROP only - D3DTOP_MODULATEINVALPHA_ADDCOLOR = 20, // (1-Arg1.A)*Arg2.RGB + Arg1.RGB - // COLOROP only - D3DTOP_MODULATEINVCOLOR_ADDALPHA = 21, // (1-Arg1.RGB)*Arg2.RGB + Arg1.A - // COLOROP only - -// Bump mapping - D3DTOP_BUMPENVMAP = 22, // per pixel env map perturbation - D3DTOP_BUMPENVMAPLUMINANCE = 23, // with luminance channel - // This can do either diffuse or specular bump mapping with correct input. - // Performs the function (Arg1.R*Arg2.R + Arg1.G*Arg2.G + Arg1.B*Arg2.B) - // where each component has been scaled and offset to make it signed. - // The result is replicated into all four (including alpha) channels. - // This is a valid COLOROP only. - D3DTOP_DOTPRODUCT3 = 24, - - D3DTOP_FORCE_DWORD = 0x7fffffff, -} D3DTEXTUREOP; - -/* - * Values for COLORARG1,2 and ALPHAARG1,2 texture blending operations - * set in texture processing stage controls in D3DRENDERSTATE. - */ -#define D3DTA_SELECTMASK 0x0000000f // mask for arg selector -#define D3DTA_DIFFUSE 0x00000000 // select diffuse color -#define D3DTA_CURRENT 0x00000001 // select result of previous stage -#define D3DTA_TEXTURE 0x00000002 // select texture color -#define D3DTA_TFACTOR 0x00000003 // select RENDERSTATE_TEXTUREFACTOR -#if(DIRECT3D_VERSION >= 0x0700) -#define D3DTA_SPECULAR 0x00000004 // select specular color -#endif /* DIRECT3D_VERSION >= 0x0700 */ -#define D3DTA_COMPLEMENT 0x00000010 // take 1.0 - x -#define D3DTA_ALPHAREPLICATE 0x00000020 // replicate alpha to color components - -#endif //(DIRECT3D_VERSION < 0x0800) - -/* - * IDirect3DTexture2 State Filter Types - */ -typedef enum _D3DTEXTUREMAGFILTER -{ - D3DTFG_POINT = 1, // nearest - D3DTFG_LINEAR = 2, // linear interpolation - D3DTFG_FLATCUBIC = 3, // cubic - D3DTFG_GAUSSIANCUBIC = 4, // different cubic kernel - D3DTFG_ANISOTROPIC = 5, // -#if(DIRECT3D_VERSION >= 0x0700) -#endif /* DIRECT3D_VERSION >= 0x0700 */ - D3DTFG_FORCE_DWORD = 0x7fffffff, // force 32-bit size enum -} D3DTEXTUREMAGFILTER; - -typedef enum _D3DTEXTUREMINFILTER -{ - D3DTFN_POINT = 1, // nearest - D3DTFN_LINEAR = 2, // linear interpolation - D3DTFN_ANISOTROPIC = 3, // - D3DTFN_FORCE_DWORD = 0x7fffffff, // force 32-bit size enum -} D3DTEXTUREMINFILTER; - -typedef enum _D3DTEXTUREMIPFILTER -{ - D3DTFP_NONE = 1, // mipmapping disabled (use MAG filter) - D3DTFP_POINT = 2, // nearest - D3DTFP_LINEAR = 3, // linear interpolation - D3DTFP_FORCE_DWORD = 0x7fffffff, // force 32-bit size enum -} D3DTEXTUREMIPFILTER; - -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -/* - * Triangle flags - */ - -/* - * Tri strip and fan flags. - * START loads all three vertices - * EVEN and ODD load just v3 with even or odd culling - * START_FLAT contains a count from 0 to 29 that allows the - * whole strip or fan to be culled in one hit. - * e.g. for a quad len = 1 - */ -#define D3DTRIFLAG_START 0x00000000L -#define D3DTRIFLAG_STARTFLAT(len) (len) /* 0 < len < 30 */ -#define D3DTRIFLAG_ODD 0x0000001eL -#define D3DTRIFLAG_EVEN 0x0000001fL - -/* - * Triangle edge flags - * enable edges for wireframe or antialiasing - */ -#define D3DTRIFLAG_EDGEENABLE1 0x00000100L /* v0-v1 edge */ -#define D3DTRIFLAG_EDGEENABLE2 0x00000200L /* v1-v2 edge */ -#define D3DTRIFLAG_EDGEENABLE3 0x00000400L /* v2-v0 edge */ -#define D3DTRIFLAG_EDGEENABLETRIANGLE \ - (D3DTRIFLAG_EDGEENABLE1 | D3DTRIFLAG_EDGEENABLE2 | D3DTRIFLAG_EDGEENABLE3) - -/* - * Primitive structures and related defines. Vertex offsets are to types - * D3DVERTEX, D3DLVERTEX, or D3DTLVERTEX. - */ - -/* - * Triangle list primitive structure - */ -typedef struct _D3DTRIANGLE { - union { - WORD v1; /* Vertex indices */ - WORD wV1; - }; - union { - WORD v2; - WORD wV2; - }; - union { - WORD v3; - WORD wV3; - }; - WORD wFlags; /* Edge (and other) flags */ -} D3DTRIANGLE, *LPD3DTRIANGLE; - -/* - * Line list structure. - * The instruction count defines the number of line segments. - */ -typedef struct _D3DLINE { - union { - WORD v1; /* Vertex indices */ - WORD wV1; - }; - union { - WORD v2; - WORD wV2; - }; -} D3DLINE, *LPD3DLINE; - -/* - * Span structure - * Spans join a list of points with the same y value. - * If the y value changes, a new span is started. - */ -typedef struct _D3DSPAN { - WORD wCount; /* Number of spans */ - WORD wFirst; /* Index to first vertex */ -} D3DSPAN, *LPD3DSPAN; - -/* - * Point structure - */ -typedef struct _D3DPOINT { - WORD wCount; /* number of points */ - WORD wFirst; /* index to first vertex */ -} D3DPOINT, *LPD3DPOINT; - - -/* - * Forward branch structure. - * Mask is logically anded with the driver status mask - * if the result equals 'value', the branch is taken. - */ -typedef struct _D3DBRANCH { - DWORD dwMask; /* Bitmask against D3D status */ - DWORD dwValue; - BOOL bNegate; /* TRUE to negate comparison */ - DWORD dwOffset; /* How far to branch forward (0 for exit)*/ -} D3DBRANCH, *LPD3DBRANCH; - -/* - * Status used for set status instruction. - * The D3D status is initialised on device creation - * and is modified by all execute calls. - */ -typedef struct _D3DSTATUS { - DWORD dwFlags; /* Do we set extents or status */ - DWORD dwStatus; /* D3D status */ - D3DRECT drExtent; -} D3DSTATUS, *LPD3DSTATUS; - -#define D3DSETSTATUS_STATUS 0x00000001L -#define D3DSETSTATUS_EXTENTS 0x00000002L -#define D3DSETSTATUS_ALL (D3DSETSTATUS_STATUS | D3DSETSTATUS_EXTENTS) - -#if(DIRECT3D_VERSION >= 0x0500) -typedef struct _D3DCLIPSTATUS { - DWORD dwFlags; /* Do we set 2d extents, 3D extents or status */ - DWORD dwStatus; /* Clip status */ - float minx, maxx; /* X extents */ - float miny, maxy; /* Y extents */ - float minz, maxz; /* Z extents */ -} D3DCLIPSTATUS, *LPD3DCLIPSTATUS; - -#define D3DCLIPSTATUS_STATUS 0x00000001L -#define D3DCLIPSTATUS_EXTENTS2 0x00000002L -#define D3DCLIPSTATUS_EXTENTS3 0x00000004L - -#endif /* DIRECT3D_VERSION >= 0x0500 */ -/* - * Statistics structure - */ -typedef struct _D3DSTATS { - DWORD dwSize; - DWORD dwTrianglesDrawn; - DWORD dwLinesDrawn; - DWORD dwPointsDrawn; - DWORD dwSpansDrawn; - DWORD dwVerticesProcessed; -} D3DSTATS, *LPD3DSTATS; - -/* - * Execute options. - * When calling using D3DEXECUTE_UNCLIPPED all the primitives - * inside the buffer must be contained within the viewport. - */ -#define D3DEXECUTE_CLIPPED 0x00000001l -#define D3DEXECUTE_UNCLIPPED 0x00000002l - -typedef struct _D3DEXECUTEDATA { - DWORD dwSize; - DWORD dwVertexOffset; - DWORD dwVertexCount; - DWORD dwInstructionOffset; - DWORD dwInstructionLength; - DWORD dwHVertexOffset; - D3DSTATUS dsStatus; /* Status after execute */ -} D3DEXECUTEDATA, *LPD3DEXECUTEDATA; - -/* - * Palette flags. - * This are or'ed with the peFlags in the PALETTEENTRYs passed to DirectDraw. - */ -#define D3DPAL_FREE 0x00 /* Renderer may use this entry freely */ -#define D3DPAL_READONLY 0x40 /* Renderer may not set this entry */ -#define D3DPAL_RESERVED 0x80 /* Renderer may not use this entry */ - - -#if(DIRECT3D_VERSION >= 0x0600) - -typedef struct _D3DVERTEXBUFFERDESC { - DWORD dwSize; - DWORD dwCaps; - DWORD dwFVF; - DWORD dwNumVertices; -} D3DVERTEXBUFFERDESC, *LPD3DVERTEXBUFFERDESC; - -#define D3DVBCAPS_SYSTEMMEMORY 0x00000800l -#define D3DVBCAPS_WRITEONLY 0x00010000l -#define D3DVBCAPS_OPTIMIZED 0x80000000l -#define D3DVBCAPS_DONOTCLIP 0x00000001l - -/* Vertex Operations for ProcessVertices */ -#define D3DVOP_LIGHT (1 << 10) -#define D3DVOP_TRANSFORM (1 << 0) -#define D3DVOP_CLIP (1 << 2) -#define D3DVOP_EXTENTS (1 << 3) - - -#if(DIRECT3D_VERSION < 0x0800) - -/* The maximum number of vertices user can pass to any d3d - drawing function or to create vertex buffer with -*/ -#define D3DMAXNUMVERTICES ((1<<16) - 1) -/* The maximum number of primitives user can pass to any d3d - drawing function. -*/ -#define D3DMAXNUMPRIMITIVES ((1<<16) - 1) - -#if(DIRECT3D_VERSION >= 0x0700) - -/* Bits for dwFlags in ProcessVertices call */ -#define D3DPV_DONOTCOPYDATA (1 << 0) - -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -#endif //(DIRECT3D_VERSION < 0x0800) - -//------------------------------------------------------------------- - -#if(DIRECT3D_VERSION < 0x0800) - -// Flexible vertex format bits -// -#define D3DFVF_RESERVED0 0x001 -#define D3DFVF_POSITION_MASK 0x00E -#define D3DFVF_XYZ 0x002 -#define D3DFVF_XYZRHW 0x004 -#if(DIRECT3D_VERSION >= 0x0700) -#define D3DFVF_XYZB1 0x006 -#define D3DFVF_XYZB2 0x008 -#define D3DFVF_XYZB3 0x00a -#define D3DFVF_XYZB4 0x00c -#define D3DFVF_XYZB5 0x00e - -#endif /* DIRECT3D_VERSION >= 0x0700 */ -#define D3DFVF_NORMAL 0x010 -#define D3DFVF_RESERVED1 0x020 -#define D3DFVF_DIFFUSE 0x040 -#define D3DFVF_SPECULAR 0x080 - -#define D3DFVF_TEXCOUNT_MASK 0xf00 -#define D3DFVF_TEXCOUNT_SHIFT 8 -#define D3DFVF_TEX0 0x000 -#define D3DFVF_TEX1 0x100 -#define D3DFVF_TEX2 0x200 -#define D3DFVF_TEX3 0x300 -#define D3DFVF_TEX4 0x400 -#define D3DFVF_TEX5 0x500 -#define D3DFVF_TEX6 0x600 -#define D3DFVF_TEX7 0x700 -#define D3DFVF_TEX8 0x800 - -#define D3DFVF_RESERVED2 0xf000 // 4 reserved bits - -#else -#define D3DFVF_RESERVED1 0x020 -#endif //(DIRECT3D_VERSION < 0x0800) - -#define D3DFVF_VERTEX ( D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 ) -#define D3DFVF_LVERTEX ( D3DFVF_XYZ | D3DFVF_RESERVED1 | D3DFVF_DIFFUSE | \ - D3DFVF_SPECULAR | D3DFVF_TEX1 ) -#define D3DFVF_TLVERTEX ( D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | \ - D3DFVF_TEX1 ) - - -typedef struct _D3DDP_PTRSTRIDE -{ - LPVOID lpvData; - DWORD dwStride; -} D3DDP_PTRSTRIDE; - -#define D3DDP_MAXTEXCOORD 8 - -typedef struct _D3DDRAWPRIMITIVESTRIDEDDATA -{ - D3DDP_PTRSTRIDE position; - D3DDP_PTRSTRIDE normal; - D3DDP_PTRSTRIDE diffuse; - D3DDP_PTRSTRIDE specular; - D3DDP_PTRSTRIDE textureCoords[D3DDP_MAXTEXCOORD]; -} D3DDRAWPRIMITIVESTRIDEDDATA, *LPD3DDRAWPRIMITIVESTRIDEDDATA; -//--------------------------------------------------------------------- -// ComputeSphereVisibility return values -// -#define D3DVIS_INSIDE_FRUSTUM 0 -#define D3DVIS_INTERSECT_FRUSTUM 1 -#define D3DVIS_OUTSIDE_FRUSTUM 2 -#define D3DVIS_INSIDE_LEFT 0 -#define D3DVIS_INTERSECT_LEFT (1 << 2) -#define D3DVIS_OUTSIDE_LEFT (2 << 2) -#define D3DVIS_INSIDE_RIGHT 0 -#define D3DVIS_INTERSECT_RIGHT (1 << 4) -#define D3DVIS_OUTSIDE_RIGHT (2 << 4) -#define D3DVIS_INSIDE_TOP 0 -#define D3DVIS_INTERSECT_TOP (1 << 6) -#define D3DVIS_OUTSIDE_TOP (2 << 6) -#define D3DVIS_INSIDE_BOTTOM 0 -#define D3DVIS_INTERSECT_BOTTOM (1 << 8) -#define D3DVIS_OUTSIDE_BOTTOM (2 << 8) -#define D3DVIS_INSIDE_NEAR 0 -#define D3DVIS_INTERSECT_NEAR (1 << 10) -#define D3DVIS_OUTSIDE_NEAR (2 << 10) -#define D3DVIS_INSIDE_FAR 0 -#define D3DVIS_INTERSECT_FAR (1 << 12) -#define D3DVIS_OUTSIDE_FAR (2 << 12) - -#define D3DVIS_MASK_FRUSTUM (3 << 0) -#define D3DVIS_MASK_LEFT (3 << 2) -#define D3DVIS_MASK_RIGHT (3 << 4) -#define D3DVIS_MASK_TOP (3 << 6) -#define D3DVIS_MASK_BOTTOM (3 << 8) -#define D3DVIS_MASK_NEAR (3 << 10) -#define D3DVIS_MASK_FAR (3 << 12) - -#endif /* DIRECT3D_VERSION >= 0x0600 */ - -#if(DIRECT3D_VERSION < 0x0800) - -#if(DIRECT3D_VERSION >= 0x0700) - -// To be used with GetInfo() -#define D3DDEVINFOID_TEXTUREMANAGER 1 -#define D3DDEVINFOID_D3DTEXTUREMANAGER 2 -#define D3DDEVINFOID_TEXTURING 3 - -typedef enum _D3DSTATEBLOCKTYPE -{ - D3DSBT_ALL = 1, // capture all state - D3DSBT_PIXELSTATE = 2, // capture pixel state - D3DSBT_VERTEXSTATE = 3, // capture vertex state - D3DSBT_FORCE_DWORD = 0xffffffff -} D3DSTATEBLOCKTYPE; - -// The D3DVERTEXBLENDFLAGS type is used with D3DRENDERSTATE_VERTEXBLEND state. -// -typedef enum _D3DVERTEXBLENDFLAGS -{ - D3DVBLEND_DISABLE = 0, // Disable vertex blending - D3DVBLEND_1WEIGHT = 1, // blend between 2 matrices - D3DVBLEND_2WEIGHTS = 2, // blend between 3 matrices - D3DVBLEND_3WEIGHTS = 3, // blend between 4 matrices -} D3DVERTEXBLENDFLAGS; - -typedef enum _D3DTEXTURETRANSFORMFLAGS { - D3DTTFF_DISABLE = 0, // texture coordinates are passed directly - D3DTTFF_COUNT1 = 1, // rasterizer should expect 1-D texture coords - D3DTTFF_COUNT2 = 2, // rasterizer should expect 2-D texture coords - D3DTTFF_COUNT3 = 3, // rasterizer should expect 3-D texture coords - D3DTTFF_COUNT4 = 4, // rasterizer should expect 4-D texture coords - D3DTTFF_PROJECTED = 256, // texcoords to be divided by COUNTth element - D3DTTFF_FORCE_DWORD = 0x7fffffff, -} D3DTEXTURETRANSFORMFLAGS; - -// Macros to set texture coordinate format bits in the FVF id - -#define D3DFVF_TEXTUREFORMAT2 0 // Two floating point values -#define D3DFVF_TEXTUREFORMAT1 3 // One floating point value -#define D3DFVF_TEXTUREFORMAT3 1 // Three floating point values -#define D3DFVF_TEXTUREFORMAT4 2 // Four floating point values - -#define D3DFVF_TEXCOORDSIZE3(CoordIndex) (D3DFVF_TEXTUREFORMAT3 << (CoordIndex*2 + 16)) -#define D3DFVF_TEXCOORDSIZE2(CoordIndex) (D3DFVF_TEXTUREFORMAT2) -#define D3DFVF_TEXCOORDSIZE4(CoordIndex) (D3DFVF_TEXTUREFORMAT4 << (CoordIndex*2 + 16)) -#define D3DFVF_TEXCOORDSIZE1(CoordIndex) (D3DFVF_TEXTUREFORMAT1 << (CoordIndex*2 + 16)) - - -#endif /* DIRECT3D_VERSION >= 0x0700 */ - -#else -// -// legacy vertex blend names -// -typedef enum _D3DVERTEXBLENDFLAGS D3DVERTEXBLENDFLAGS; -#define D3DVBLEND_DISABLE (D3DVERTEXBLENDFLAGS)0 -#define D3DVBLEND_1WEIGHT (D3DVERTEXBLENDFLAGS)1 -#define D3DVBLEND_2WEIGHTS (D3DVERTEXBLENDFLAGS)2 -#define D3DVBLEND_3WEIGHTS (D3DVERTEXBLENDFLAGS)3 - -#endif //(DIRECT3D_VERSION < 0x0800) - -#pragma pack() -#pragma warning(default:4201) - -#endif /* _D3DTYPES_H_ */ - diff --git a/import/DirectX8/include/d3dvec.inl b/import/DirectX8/include/d3dvec.inl deleted file mode 100644 index ff7fdfeaf..000000000 --- a/import/DirectX8/include/d3dvec.inl +++ /dev/null @@ -1,255 +0,0 @@ - -/****************************************************************** - * * - * D3DVec.inl * - * * - * Float-valued 3D vector class for Direct3D. * - * * - * Copyright (c) Microsoft Corp. All rights reserved. * - * * - ******************************************************************/ - -#include - -// ===================================== -// Constructors -// ===================================== - -inline -_D3DVECTOR::_D3DVECTOR(D3DVALUE f) -{ - x = y = z = f; -} - -inline -_D3DVECTOR::_D3DVECTOR(D3DVALUE _x, D3DVALUE _y, D3DVALUE _z) -{ - x = _x; y = _y; z = _z; -} - -inline -_D3DVECTOR::_D3DVECTOR(const D3DVALUE f[3]) -{ - x = f[0]; y = f[1]; z = f[2]; -} - -// ===================================== -// Access grants -// ===================================== - -inline const D3DVALUE& -_D3DVECTOR::operator[](int i) const -{ - return (&x)[i]; -} - -inline D3DVALUE& -_D3DVECTOR::operator[](int i) -{ - return (&x)[i]; -} - - -// ===================================== -// Assignment operators -// ===================================== - -inline _D3DVECTOR& -_D3DVECTOR::operator += (const _D3DVECTOR& v) -{ - x += v.x; y += v.y; z += v.z; - return *this; -} - -inline _D3DVECTOR& -_D3DVECTOR::operator -= (const _D3DVECTOR& v) -{ - x -= v.x; y -= v.y; z -= v.z; - return *this; -} - -inline _D3DVECTOR& -_D3DVECTOR::operator *= (const _D3DVECTOR& v) -{ - x *= v.x; y *= v.y; z *= v.z; - return *this; -} - -inline _D3DVECTOR& -_D3DVECTOR::operator /= (const _D3DVECTOR& v) -{ - x /= v.x; y /= v.y; z /= v.z; - return *this; -} - -inline _D3DVECTOR& -_D3DVECTOR::operator *= (D3DVALUE s) -{ - x *= s; y *= s; z *= s; - return *this; -} - -inline _D3DVECTOR& -_D3DVECTOR::operator /= (D3DVALUE s) -{ - x /= s; y /= s; z /= s; - return *this; -} - -inline _D3DVECTOR -operator + (const _D3DVECTOR& v) -{ - return v; -} - -inline _D3DVECTOR -operator - (const _D3DVECTOR& v) -{ - return _D3DVECTOR(-v.x, -v.y, -v.z); -} - -inline _D3DVECTOR -operator + (const _D3DVECTOR& v1, const _D3DVECTOR& v2) -{ - return _D3DVECTOR(v1.x+v2.x, v1.y+v2.y, v1.z+v2.z); -} - -inline _D3DVECTOR -operator - (const _D3DVECTOR& v1, const _D3DVECTOR& v2) -{ - return _D3DVECTOR(v1.x-v2.x, v1.y-v2.y, v1.z-v2.z); -} - -inline _D3DVECTOR -operator * (const _D3DVECTOR& v1, const _D3DVECTOR& v2) -{ - return _D3DVECTOR(v1.x*v2.x, v1.y*v2.y, v1.z*v2.z); -} - -inline _D3DVECTOR -operator / (const _D3DVECTOR& v1, const _D3DVECTOR& v2) -{ - return _D3DVECTOR(v1.x/v2.x, v1.y/v2.y, v1.z/v2.z); -} - -inline int -operator < (const _D3DVECTOR& v1, const _D3DVECTOR& v2) -{ - return v1[0] < v2[0] && v1[1] < v2[1] && v1[2] < v2[2]; -} - -inline int -operator <= (const _D3DVECTOR& v1, const _D3DVECTOR& v2) -{ - return v1[0] <= v2[0] && v1[1] <= v2[1] && v1[2] <= v2[2]; -} - -inline _D3DVECTOR -operator * (const _D3DVECTOR& v, D3DVALUE s) -{ - return _D3DVECTOR(s*v.x, s*v.y, s*v.z); -} - -inline _D3DVECTOR -operator * (D3DVALUE s, const _D3DVECTOR& v) -{ - return _D3DVECTOR(s*v.x, s*v.y, s*v.z); -} - -inline _D3DVECTOR -operator / (const _D3DVECTOR& v, D3DVALUE s) -{ - return _D3DVECTOR(v.x/s, v.y/s, v.z/s); -} - -inline int -operator == (const _D3DVECTOR& v1, const _D3DVECTOR& v2) -{ - return v1.x==v2.x && v1.y==v2.y && v1.z == v2.z; -} - -inline D3DVALUE -Magnitude (const _D3DVECTOR& v) -{ - return (D3DVALUE) sqrt(SquareMagnitude(v)); -} - -inline D3DVALUE -SquareMagnitude (const _D3DVECTOR& v) -{ - return v.x*v.x + v.y*v.y + v.z*v.z; -} - -inline _D3DVECTOR -Normalize (const _D3DVECTOR& v) -{ - return v / Magnitude(v); -} - -inline D3DVALUE -Min (const _D3DVECTOR& v) -{ - D3DVALUE ret = v.x; - if (v.y < ret) ret = v.y; - if (v.z < ret) ret = v.z; - return ret; -} - -inline D3DVALUE -Max (const _D3DVECTOR& v) -{ - D3DVALUE ret = v.x; - if (ret < v.y) ret = v.y; - if (ret < v.z) ret = v.z; - return ret; -} - -inline _D3DVECTOR -Minimize (const _D3DVECTOR& v1, const _D3DVECTOR& v2) -{ - return _D3DVECTOR( v1[0] < v2[0] ? v1[0] : v2[0], - v1[1] < v2[1] ? v1[1] : v2[1], - v1[2] < v2[2] ? v1[2] : v2[2]); -} - -inline _D3DVECTOR -Maximize (const _D3DVECTOR& v1, const _D3DVECTOR& v2) -{ - return _D3DVECTOR( v1[0] > v2[0] ? v1[0] : v2[0], - v1[1] > v2[1] ? v1[1] : v2[1], - v1[2] > v2[2] ? v1[2] : v2[2]); -} - -inline D3DVALUE -DotProduct (const _D3DVECTOR& v1, const _D3DVECTOR& v2) -{ - return v1.x*v2.x + v1.y * v2.y + v1.z*v2.z; -} - -inline _D3DVECTOR -CrossProduct (const _D3DVECTOR& v1, const _D3DVECTOR& v2) -{ - _D3DVECTOR result; - - result[0] = v1[1] * v2[2] - v1[2] * v2[1]; - result[1] = v1[2] * v2[0] - v1[0] * v2[2]; - result[2] = v1[0] * v2[1] - v1[1] * v2[0]; - - return result; -} - -inline _D3DMATRIX -operator* (const _D3DMATRIX& a, const _D3DMATRIX& b) -{ - _D3DMATRIX ret; - for (int i=0; i<4; i++) { - for (int j=0; j<4; j++) { - ret(i, j) = 0.0f; - for (int k=0; k<4; k++) { - ret(i, j) += a(i, k) * b(k, j); - } - } - } - return ret; -} - diff --git a/import/DirectX8/include/d3dx.h b/import/DirectX8/include/d3dx.h deleted file mode 100644 index 7a511e3f5..000000000 --- a/import/DirectX8/include/d3dx.h +++ /dev/null @@ -1,26 +0,0 @@ -/////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) Microsoft Corporation. All Rights Reserved. -// -// File: d3dx.h -// Content: D3DX utility library -// -/////////////////////////////////////////////////////////////////////////// - -#ifndef __D3DX_H__ -#define __D3DX_H__ - -#ifndef D3DXINLINE -#ifdef __cplusplus -#define D3DXINLINE inline -#else -#define D3DXINLINE _inline -#endif -#endif - -#include "d3dxcore.h" -#include "d3dxmath.h" -#include "d3dxshapes.h" -#include "d3dxsprite.h" - -#endif //__D3DX_H__ diff --git a/import/DirectX8/include/d3dx8.h b/import/DirectX8/include/d3dx8.h deleted file mode 100644 index 31927a27a..000000000 --- a/import/DirectX8/include/d3dx8.h +++ /dev/null @@ -1,45 +0,0 @@ -/////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) Microsoft Corporation. All Rights Reserved. -// -// File: d3dx8.h -// Content: D3DX utility library -// -/////////////////////////////////////////////////////////////////////////// - -#ifndef __D3DX8_H__ -#define __D3DX8_H__ - -#include "d3d8.h" -#include - -#ifndef D3DXINLINE -#ifdef _MSC_VER - #if (_MSC_VER >= 1200) - #define D3DXINLINE __forceinline - #else - #define D3DXINLINE __inline - #endif -#else - #ifdef __cplusplus - #define D3DXINLINE inline - #else - #define D3DXINLINE - #endif -#endif -#endif - - -#define D3DX_DEFAULT ULONG_MAX -#define D3DX_DEFAULT_FLOAT FLT_MAX - -#include "d3dx8math.h" -#include "d3dx8core.h" -#include "d3dx8tex.h" -#include "d3dx8mesh.h" -#include "d3dx8shape.h" -#include "d3dx8effect.h" - - -#endif //__D3DX8_H__ - diff --git a/import/DirectX8/include/d3dx8core.h b/import/DirectX8/include/d3dx8core.h deleted file mode 100644 index 46552a950..000000000 --- a/import/DirectX8/include/d3dx8core.h +++ /dev/null @@ -1,563 +0,0 @@ -/////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) Microsoft Corporation. All Rights Reserved. -// -// File: d3dx8core.h -// Content: D3DX core types and functions -// -/////////////////////////////////////////////////////////////////////////// - -#include "d3dx8.h" - -#ifndef __D3DX8CORE_H__ -#define __D3DX8CORE_H__ - - - -/////////////////////////////////////////////////////////////////////////// -// ID3DXBuffer: -// ------------ -// The buffer object is used by D3DX to return arbitrary size data. -// -// GetBufferPointer - -// Returns a pointer to the beginning of the buffer. -// -// GetBufferSize - -// Returns the size of the buffer, in bytes. -/////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DXBuffer ID3DXBuffer; -typedef interface ID3DXBuffer *LPD3DXBUFFER; - -// {932E6A7E-C68E-45dd-A7BF-53D19C86DB1F} -DEFINE_GUID(IID_ID3DXBuffer, -0x932e6a7e, 0xc68e, 0x45dd, 0xa7, 0xbf, 0x53, 0xd1, 0x9c, 0x86, 0xdb, 0x1f); - -#undef INTERFACE -#define INTERFACE ID3DXBuffer - -DECLARE_INTERFACE_(ID3DXBuffer, IUnknown) -{ - // IUnknown - STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - // ID3DXBuffer - STDMETHOD_(LPVOID, GetBufferPointer)(THIS) PURE; - STDMETHOD_(DWORD, GetBufferSize)(THIS) PURE; -}; - - - -/////////////////////////////////////////////////////////////////////////// -// ID3DXFont: -// ---------- -// Font objects contain the textures and resources needed to render -// a specific font on a specific device. -// -// Begin - -// Prepartes device for drawing text. This is optional.. if DrawText -// is called outside of Begin/End, it will call Begin and End for you. -// -// DrawText - -// Draws formatted text on a D3D device. Some parameters are -// surprisingly similar to those of GDI's DrawText function. See GDI -// documentation for a detailed description of these parameters. -// -// End - -// Restores device state to how it was when Begin was called. -// -// OnLostDevice, OnResetDevice - -// Call OnLostDevice() on this object before calling Reset() on the -// device, so that this object can release any stateblocks and video -// memory resources. After Reset(), the call OnResetDevice(). -// -/////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DXFont ID3DXFont; -typedef interface ID3DXFont *LPD3DXFONT; - - -// {89FAD6A5-024D-49af-8FE7-F51123B85E25} -DEFINE_GUID( IID_ID3DXFont, -0x89fad6a5, 0x24d, 0x49af, 0x8f, 0xe7, 0xf5, 0x11, 0x23, 0xb8, 0x5e, 0x25); - - -#undef INTERFACE -#define INTERFACE ID3DXFont - -DECLARE_INTERFACE_(ID3DXFont, IUnknown) -{ - // IUnknown - STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - // ID3DXFont - STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE8* ppDevice) PURE; - STDMETHOD(GetLogFont)(THIS_ LOGFONT* pLogFont) PURE; - - STDMETHOD(Begin)(THIS) PURE; - STDMETHOD_(INT, DrawTextA)(THIS_ LPCSTR pString, INT Count, LPRECT pRect, DWORD Format, D3DCOLOR Color) PURE; - STDMETHOD_(INT, DrawTextW)(THIS_ LPCWSTR pString, INT Count, LPRECT pRect, DWORD Format, D3DCOLOR Color) PURE; - STDMETHOD(End)(THIS) PURE; - - STDMETHOD(OnLostDevice)(THIS) PURE; - STDMETHOD(OnResetDevice)(THIS) PURE; -}; - -#ifndef DrawText -#ifdef UNICODE -#define DrawText DrawTextW -#else -#define DrawText DrawTextA -#endif -#endif - - -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - -HRESULT WINAPI - D3DXCreateFont( - LPDIRECT3DDEVICE8 pDevice, - HFONT hFont, - LPD3DXFONT* ppFont); - - -HRESULT WINAPI - D3DXCreateFontIndirect( - LPDIRECT3DDEVICE8 pDevice, - CONST LOGFONT* pLogFont, - LPD3DXFONT* ppFont); - -#ifdef __cplusplus -} -#endif //__cplusplus - - - - -/////////////////////////////////////////////////////////////////////////// -// ID3DXSprite: -// ------------ -// This object intends to provide an easy way to drawing sprites using D3D. -// -// Begin - -// Prepares device for drawing sprites -// -// Draw, DrawAffine, DrawTransform - -// Draws a sprite in screen-space. Before transformation, the sprite is -// the size of SrcRect, with its top-left corner at the origin (0,0). -// The color and alpha channels are modulated by Color. -// -// End - -// Restores device state to how it was when Begin was called. -// -// OnLostDevice, OnResetDevice - -// Call OnLostDevice() on this object before calling Reset() on the -// device, so that this object can release any stateblocks and video -// memory resources. After Reset(), the call OnResetDevice(). -/////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DXSprite ID3DXSprite; -typedef interface ID3DXSprite *LPD3DXSPRITE; - - -// {13D69D15-F9B0-4e0f-B39E-C91EB33F6CE7} -DEFINE_GUID( IID_ID3DXSprite, -0x13d69d15, 0xf9b0, 0x4e0f, 0xb3, 0x9e, 0xc9, 0x1e, 0xb3, 0x3f, 0x6c, 0xe7); - - -#undef INTERFACE -#define INTERFACE ID3DXSprite - -DECLARE_INTERFACE_(ID3DXSprite, IUnknown) -{ - // IUnknown - STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - // ID3DXSprite - STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE8* ppDevice) PURE; - - STDMETHOD(Begin)(THIS) PURE; - - STDMETHOD(Draw)(THIS_ LPDIRECT3DTEXTURE8 pSrcTexture, - CONST RECT* pSrcRect, CONST D3DXVECTOR2* pScaling, - CONST D3DXVECTOR2* pRotationCenter, FLOAT Rotation, - CONST D3DXVECTOR2* pTranslation, D3DCOLOR Color) PURE; - - STDMETHOD(DrawTransform)(THIS_ LPDIRECT3DTEXTURE8 pSrcTexture, - CONST RECT* pSrcRect, CONST D3DXMATRIX* pTransform, - D3DCOLOR Color) PURE; - - STDMETHOD(End)(THIS) PURE; - - STDMETHOD(OnLostDevice)(THIS) PURE; - STDMETHOD(OnResetDevice)(THIS) PURE; -}; - - -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - - -HRESULT WINAPI - D3DXCreateSprite( - LPDIRECT3DDEVICE8 pDevice, - LPD3DXSPRITE* ppSprite); - -#ifdef __cplusplus -} -#endif //__cplusplus - - - - -/////////////////////////////////////////////////////////////////////////// -// ID3DXRenderToSurface: -// --------------------- -// This object abstracts rendering to surfaces. These surfaces do not -// necessarily need to be render targets. If they are not, a compatible -// render target is used, and the result copied into surface at end scene. -// -// BeginScene, EndScene - -// Call BeginScene() and EndScene() at the beginning and ending of your -// scene. These calls will setup and restore render targets, viewports, -// etc.. -// -// OnLostDevice, OnResetDevice - -// Call OnLostDevice() on this object before calling Reset() on the -// device, so that this object can release any stateblocks and video -// memory resources. After Reset(), the call OnResetDevice(). -/////////////////////////////////////////////////////////////////////////// - -typedef struct _D3DXRTS_DESC -{ - UINT Width; - UINT Height; - D3DFORMAT Format; - BOOL DepthStencil; - D3DFORMAT DepthStencilFormat; - -} D3DXRTS_DESC; - - -typedef interface ID3DXRenderToSurface ID3DXRenderToSurface; -typedef interface ID3DXRenderToSurface *LPD3DXRENDERTOSURFACE; - - -// {82DF5B90-E34E-496e-AC1C-62117A6A5913} -DEFINE_GUID( IID_ID3DXRenderToSurface, -0x82df5b90, 0xe34e, 0x496e, 0xac, 0x1c, 0x62, 0x11, 0x7a, 0x6a, 0x59, 0x13); - - -#undef INTERFACE -#define INTERFACE ID3DXRenderToSurface - -DECLARE_INTERFACE_(ID3DXRenderToSurface, IUnknown) -{ - // IUnknown - STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - // ID3DXRenderToSurface - STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE8* ppDevice) PURE; - STDMETHOD(GetDesc)(THIS_ D3DXRTS_DESC* pDesc) PURE; - - STDMETHOD(BeginScene)(THIS_ LPDIRECT3DSURFACE8 pSurface, CONST D3DVIEWPORT8* pViewport) PURE; - STDMETHOD(EndScene)(THIS) PURE; - - STDMETHOD(OnLostDevice)(THIS) PURE; - STDMETHOD(OnResetDevice)(THIS) PURE; -}; - - -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - -HRESULT WINAPI - D3DXCreateRenderToSurface( - LPDIRECT3DDEVICE8 pDevice, - UINT Width, - UINT Height, - D3DFORMAT Format, - BOOL DepthStencil, - D3DFORMAT DepthStencilFormat, - LPD3DXRENDERTOSURFACE* ppRenderToSurface); - -#ifdef __cplusplus -} -#endif //__cplusplus - - - -/////////////////////////////////////////////////////////////////////////// -// ID3DXRenderToEnvMap: -// -------------------- -// This object abstracts rendering to environment maps. These surfaces -// do not necessarily need to be render targets. If they are not, a -// compatible render target is used, and the result copied into the -// environment map at end scene. -// -// BeginCube, BeginSphere, BeginHemisphere, BeginParabolic - -// This function initiates the rendering of the environment map. As -// parameters, you pass the textures in which will get filled in with -// the resulting environment map. -// -// Face - -// Call this function to initiate the drawing of each face. For each -// environment map, you will call this six times.. once for each face -// in D3DCUBEMAP_FACES. -// -// End - -// This will restore all render targets, and if needed compose all the -// rendered faces into the environment map surfaces. -// -// OnLostDevice, OnResetDevice - -// Call OnLostDevice() on this object before calling Reset() on the -// device, so that this object can release any stateblocks and video -// memory resources. After Reset(), the call OnResetDevice(). -/////////////////////////////////////////////////////////////////////////// - -typedef struct _D3DXRTE_DESC -{ - UINT Size; - D3DFORMAT Format; - BOOL DepthStencil; - D3DFORMAT DepthStencilFormat; -} D3DXRTE_DESC; - - -typedef interface ID3DXRenderToEnvMap ID3DXRenderToEnvMap; -typedef interface ID3DXRenderToEnvMap *LPD3DXRenderToEnvMap; - -// {4E42C623-9451-44b7-8C86-ABCCDE5D52C8} -DEFINE_GUID( IID_ID3DXRenderToEnvMap, -0x4e42c623, 0x9451, 0x44b7, 0x8c, 0x86, 0xab, 0xcc, 0xde, 0x5d, 0x52, 0xc8); - - -#undef INTERFACE -#define INTERFACE ID3DXRenderToEnvMap - -DECLARE_INTERFACE_(ID3DXRenderToEnvMap, IUnknown) -{ - // IUnknown - STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - // ID3DXRenderToEnvMap - STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE8* ppDevice) PURE; - STDMETHOD(GetDesc)(THIS_ D3DXRTE_DESC* pDesc) PURE; - - STDMETHOD(BeginCube)(THIS_ - LPDIRECT3DCUBETEXTURE8 pCubeTex) PURE; - - STDMETHOD(BeginSphere)(THIS_ - LPDIRECT3DTEXTURE8 pTex) PURE; - - STDMETHOD(BeginHemisphere)(THIS_ - LPDIRECT3DTEXTURE8 pTexZPos, - LPDIRECT3DTEXTURE8 pTexZNeg) PURE; - - STDMETHOD(BeginParabolic)(THIS_ - LPDIRECT3DTEXTURE8 pTexZPos, - LPDIRECT3DTEXTURE8 pTexZNeg) PURE; - - STDMETHOD(Face)(THIS_ D3DCUBEMAP_FACES Face) PURE; - STDMETHOD(End)(THIS) PURE; - - STDMETHOD(OnLostDevice)(THIS) PURE; - STDMETHOD(OnResetDevice)(THIS) PURE; -}; - - -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - -HRESULT WINAPI - D3DXCreateRenderToEnvMap( - LPDIRECT3DDEVICE8 pDevice, - UINT Size, - D3DFORMAT Format, - BOOL DepthStencil, - D3DFORMAT DepthStencilFormat, - LPD3DXRenderToEnvMap* ppRenderToEnvMap); - -#ifdef __cplusplus -} -#endif //__cplusplus - - - -/////////////////////////////////////////////////////////////////////////// -// Shader assemblers: -/////////////////////////////////////////////////////////////////////////// - -//------------------------------------------------------------------------- -// D3DXASM flags: -// -------------- -// -// D3DXASM_DEBUG -// Generate debug info. -// -// D3DXASM_SKIPVALIDATION -// Do not validate the generated code against known capabilities and -// constraints. This option is only recommended when assembling shaders -// you KNOW will work. (ie. have assembled before without this option.) -//------------------------------------------------------------------------- - -#define D3DXASM_DEBUG (1 << 0) -#define D3DXASM_SKIPVALIDATION (1 << 1) - - -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - -//------------------------------------------------------------------------- -// D3DXAssembleShader: -// ------------------- -// Assembles an ascii description of a vertex or pixel shader into -// binary form. -// -// Parameters: -// pSrcFile -// Source file name -// hSrcModule -// Module handle. if NULL, current module will be used. -// pSrcResource -// Resource name in module -// pSrcData -// Pointer to source code -// SrcDataLen -// Size of source code, in bytes -// Flags -// D3DXASM_xxx flags -// ppConstants -// Returns an ID3DXBuffer object containing constant declarations. -// ppCompiledShader -// Returns an ID3DXBuffer object containing the object code. -// ppCompilationErrors -// Returns an ID3DXBuffer object containing ascii error messages -//------------------------------------------------------------------------- - -HRESULT WINAPI - D3DXAssembleShaderFromFileA( - LPCSTR pSrcFile, - DWORD Flags, - LPD3DXBUFFER* ppConstants, - LPD3DXBUFFER* ppCompiledShader, - LPD3DXBUFFER* ppCompilationErrors); - -HRESULT WINAPI - D3DXAssembleShaderFromFileW( - LPCWSTR pSrcFile, - DWORD Flags, - LPD3DXBUFFER* ppConstants, - LPD3DXBUFFER* ppCompiledShader, - LPD3DXBUFFER* ppCompilationErrors); - -#ifdef UNICODE -#define D3DXAssembleShaderFromFile D3DXAssembleShaderFromFileW -#else -#define D3DXAssembleShaderFromFile D3DXAssembleShaderFromFileA -#endif - -HRESULT WINAPI - D3DXAssembleShaderFromResourceA( - HMODULE hSrcModule, - LPCSTR pSrcResource, - DWORD Flags, - LPD3DXBUFFER* ppConstants, - LPD3DXBUFFER* ppCompiledShader, - LPD3DXBUFFER* ppCompilationErrors); - -HRESULT WINAPI - D3DXAssembleShaderFromResourceW( - HMODULE hSrcModule, - LPCWSTR pSrcResource, - DWORD Flags, - LPD3DXBUFFER* ppConstants, - LPD3DXBUFFER* ppCompiledShader, - LPD3DXBUFFER* ppCompilationErrors); - -#ifdef UNICODE -#define D3DXAssembleShaderFromResource D3DXAssembleShaderFromResourceW -#else -#define D3DXAssembleShaderFromResource D3DXAssembleShaderFromResourceA -#endif - -HRESULT WINAPI - D3DXAssembleShader( - LPCVOID pSrcData, - UINT SrcDataLen, - DWORD Flags, - LPD3DXBUFFER* ppConstants, - LPD3DXBUFFER* ppCompiledShader, - LPD3DXBUFFER* ppCompilationErrors); - - -#ifdef __cplusplus -} -#endif //__cplusplus - - - -/////////////////////////////////////////////////////////////////////////// -// Misc APIs: -/////////////////////////////////////////////////////////////////////////// - -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - -//------------------------------------------------------------------------- -// D3DXGetErrorString: -// ------------------ -// Returns the error string for given an hresult. Interprets all D3DX and -// D3D hresults. -// -// Parameters: -// hr -// The error code to be deciphered. -// pBuffer -// Pointer to the buffer to be filled in. -// BufferLen -// Count of characters in buffer. Any error message longer than this -// length will be truncated to fit. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXGetErrorStringA( - HRESULT hr, - LPSTR pBuffer, - UINT BufferLen); - -HRESULT WINAPI - D3DXGetErrorStringW( - HRESULT hr, - LPWSTR pBuffer, - UINT BufferLen); - -#ifdef UNICODE -#define D3DXGetErrorString D3DXGetErrorStringW -#else -#define D3DXGetErrorString D3DXGetErrorStringA -#endif - - - -#ifdef __cplusplus -} -#endif //__cplusplus - -#endif //__D3DX8CORE_H__ diff --git a/import/DirectX8/include/d3dx8effect.h b/import/DirectX8/include/d3dx8effect.h deleted file mode 100644 index 97c44df9c..000000000 --- a/import/DirectX8/include/d3dx8effect.h +++ /dev/null @@ -1,226 +0,0 @@ -/////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) Microsoft Corporation. All Rights Reserved. -// -// File: d3dx8effect.h -// Content: D3DX effect types and functions -// -/////////////////////////////////////////////////////////////////////////// - -#include "d3dx8.h" - -#ifndef __D3DX8EFFECT_H__ -#define __D3DX8EFFECT_H__ - - -#define D3DXFX_DONOTSAVESTATE (1 << 0) - - -typedef enum _D3DXPARAMETERTYPE -{ - D3DXPT_DWORD = 0, - D3DXPT_FLOAT = 1, - D3DXPT_VECTOR = 2, - D3DXPT_MATRIX = 3, - D3DXPT_TEXTURE = 4, - D3DXPT_VERTEXSHADER = 5, - D3DXPT_PIXELSHADER = 6, - D3DXPT_CONSTANT = 7, - D3DXPT_STRING = 8, - D3DXPT_FORCE_DWORD = 0x7fffffff /* force 32-bit size enum */ - -} D3DXPARAMETERTYPE; - - -typedef struct _D3DXEFFECT_DESC -{ - UINT Parameters; - UINT Techniques; - -} D3DXEFFECT_DESC; - - -typedef struct _D3DXPARAMETER_DESC -{ - LPCSTR Name; - LPCSTR Index; - D3DXPARAMETERTYPE Type; - -} D3DXPARAMETER_DESC; - - -typedef struct _D3DXTECHNIQUE_DESC -{ - LPCSTR Name; - LPCSTR Index; - UINT Passes; - -} D3DXTECHNIQUE_DESC; - - -typedef struct _D3DXPASS_DESC -{ - LPCSTR Name; - LPCSTR Index; - -} D3DXPASS_DESC; - - - -////////////////////////////////////////////////////////////////////////////// -// ID3DXEffect /////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DXEffect ID3DXEffect; -typedef interface ID3DXEffect *LPD3DXEFFECT; - -// {648B1CEB-8D4E-4d66-B6FA-E44969E82E89} -DEFINE_GUID( IID_ID3DXEffect, -0x648b1ceb, 0x8d4e, 0x4d66, 0xb6, 0xfa, 0xe4, 0x49, 0x69, 0xe8, 0x2e, 0x89); - - -#undef INTERFACE -#define INTERFACE ID3DXEffect - -DECLARE_INTERFACE_(ID3DXEffect, IUnknown) -{ - // IUnknown - STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - // ID3DXEffect - STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE8* ppDevice) PURE; - STDMETHOD(GetDesc)(THIS_ D3DXEFFECT_DESC* pDesc) PURE; - STDMETHOD(GetParameterDesc)(THIS_ LPCSTR pParameter, D3DXPARAMETER_DESC* pDesc) PURE; - STDMETHOD(GetTechniqueDesc)(THIS_ LPCSTR pTechnique, D3DXTECHNIQUE_DESC* pDesc) PURE; - STDMETHOD(GetPassDesc)(THIS_ LPCSTR pTechnique, LPCSTR pPass, D3DXPASS_DESC* pDesc) PURE; - STDMETHOD(FindNextValidTechnique)(THIS_ LPCSTR pTechnique, D3DXTECHNIQUE_DESC* pDesc) PURE; - STDMETHOD(CloneEffect)(THIS_ LPDIRECT3DDEVICE8 pDevice, LPD3DXEFFECT* ppEffect) PURE; - STDMETHOD(GetCompiledEffect)(THIS_ LPD3DXBUFFER* ppCompiledEffect) PURE; - - STDMETHOD(SetTechnique)(THIS_ LPCSTR pTechnique) PURE; - STDMETHOD(GetTechnique)(THIS_ LPCSTR* ppTechnique) PURE; - - STDMETHOD(SetDword)(THIS_ LPCSTR pParameter, DWORD dw) PURE; - STDMETHOD(GetDword)(THIS_ LPCSTR pParameter, DWORD* pdw) PURE; - STDMETHOD(SetFloat)(THIS_ LPCSTR pParameter, FLOAT f) PURE; - STDMETHOD(GetFloat)(THIS_ LPCSTR pParameter, FLOAT* pf) PURE; - STDMETHOD(SetVector)(THIS_ LPCSTR pParameter, CONST D3DXVECTOR4* pVector) PURE; - STDMETHOD(GetVector)(THIS_ LPCSTR pParameter, D3DXVECTOR4* pVector) PURE; - STDMETHOD(SetMatrix)(THIS_ LPCSTR pParameter, CONST D3DXMATRIX* pMatrix) PURE; - STDMETHOD(GetMatrix)(THIS_ LPCSTR pParameter, D3DXMATRIX* pMatrix) PURE; - STDMETHOD(SetTexture)(THIS_ LPCSTR pParameter, LPDIRECT3DBASETEXTURE8 pTexture) PURE; - STDMETHOD(GetTexture)(THIS_ LPCSTR pParameter, LPDIRECT3DBASETEXTURE8 *ppTexture) PURE; - STDMETHOD(SetVertexShader)(THIS_ LPCSTR pParameter, DWORD Handle) PURE; - STDMETHOD(GetVertexShader)(THIS_ LPCSTR pParameter, DWORD* pHandle) PURE; - STDMETHOD(SetPixelShader)(THIS_ LPCSTR pParameter, DWORD Handle) PURE; - STDMETHOD(GetPixelShader)(THIS_ LPCSTR pParameter, DWORD* pHandle) PURE; - STDMETHOD(SetString)(THIS_ LPCSTR pParameter, LPCSTR pString) PURE; - STDMETHOD(GetString)(THIS_ LPCSTR pParameter, LPCSTR* ppString) PURE; - STDMETHOD_(BOOL, IsParameterUsed)(THIS_ LPCSTR pParameter) PURE; - - STDMETHOD(Validate)(THIS) PURE; - STDMETHOD(Begin)(THIS_ UINT *pPasses, DWORD Flags) PURE; - STDMETHOD(Pass)(THIS_ UINT Pass) PURE; - STDMETHOD(End)(THIS) PURE; - STDMETHOD(OnLostDevice)(THIS) PURE; - STDMETHOD(OnResetDevice)(THIS) PURE; -}; - - - -////////////////////////////////////////////////////////////////////////////// -// APIs ////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - - -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - - -//---------------------------------------------------------------------------- -// D3DXCreateEffect: -// ----------------- -// Creates an effect from an ascii or binaray effect description. -// -// Parameters: -// pDevice -// Pointer of the device on which to create the effect -// pSrcFile -// Name of the file containing the effect description -// hSrcModule -// Module handle. if NULL, current module will be used. -// pSrcResource -// Resource name in module -// pSrcData -// Pointer to effect description -// SrcDataSize -// Size of the effect description in bytes -// ppEffect -// Returns a buffer containing created effect. -// ppCompilationErrors -// Returns a buffer containing any error messages which occurred during -// compile. Or NULL if you do not care about the error messages. -// -//---------------------------------------------------------------------------- - -HRESULT WINAPI - D3DXCreateEffectFromFileA( - LPDIRECT3DDEVICE8 pDevice, - LPCSTR pSrcFile, - LPD3DXEFFECT* ppEffect, - LPD3DXBUFFER* ppCompilationErrors); - -HRESULT WINAPI - D3DXCreateEffectFromFileW( - LPDIRECT3DDEVICE8 pDevice, - LPCWSTR pSrcFile, - LPD3DXEFFECT* ppEffect, - LPD3DXBUFFER* ppCompilationErrors); - -#ifdef UNICODE -#define D3DXCreateEffectFromFile D3DXCreateEffectFromFileW -#else -#define D3DXCreateEffectFromFile D3DXCreateEffectFromFileA -#endif - - -HRESULT WINAPI - D3DXCreateEffectFromResourceA( - LPDIRECT3DDEVICE8 pDevice, - HMODULE hSrcModule, - LPCSTR pSrcResource, - LPD3DXEFFECT* ppEffect, - LPD3DXBUFFER* ppCompilationErrors); - -HRESULT WINAPI - D3DXCreateEffectFromResourceW( - LPDIRECT3DDEVICE8 pDevice, - HMODULE hSrcModule, - LPCWSTR pSrcResource, - LPD3DXEFFECT* ppEffect, - LPD3DXBUFFER* ppCompilationErrors); - -#ifdef UNICODE -#define D3DXCreateEffectFromResource D3DXCreateEffectFromResourceW -#else -#define D3DXCreateEffectFromResource D3DXCreateEffectFromResourceA -#endif - - -HRESULT WINAPI - D3DXCreateEffect( - LPDIRECT3DDEVICE8 pDevice, - LPCVOID pSrcData, - UINT SrcDataSize, - LPD3DXEFFECT* ppEffect, - LPD3DXBUFFER* ppCompilationErrors); - - -#ifdef __cplusplus -} -#endif //__cplusplus - -#endif //__D3DX8EFFECT_H__ diff --git a/import/DirectX8/include/d3dx8math.h b/import/DirectX8/include/d3dx8math.h deleted file mode 100644 index 9c8f20301..000000000 --- a/import/DirectX8/include/d3dx8math.h +++ /dev/null @@ -1,1215 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) Microsoft Corporation. All Rights Reserved. -// -// File: d3dx8math.h -// Content: D3DX math types and functions -// -////////////////////////////////////////////////////////////////////////////// - -#include "d3dx8.h" - -#ifndef __D3DX8MATH_H__ -#define __D3DX8MATH_H__ - -#include -#pragma warning(disable:4201) // anonymous unions warning - - - -//=========================================================================== -// -// General purpose utilities -// -//=========================================================================== -#define D3DX_PI ((FLOAT) 3.141592654f) -#define D3DX_1BYPI ((FLOAT) 0.318309886f) - -#define D3DXToRadian( degree ) ((degree) * (D3DX_PI / 180.0f)) -#define D3DXToDegree( radian ) ((radian) * (180.0f / D3DX_PI)) - - - -//=========================================================================== -// -// Vectors -// -//=========================================================================== - -//-------------------------- -// 2D Vector -//-------------------------- -typedef struct D3DXVECTOR2 -{ -#ifdef __cplusplus -public: - D3DXVECTOR2() {}; - D3DXVECTOR2( CONST FLOAT * ); - D3DXVECTOR2( FLOAT x, FLOAT y ); - - // casting - operator FLOAT* (); - operator CONST FLOAT* () const; - - // assignment operators - D3DXVECTOR2& operator += ( CONST D3DXVECTOR2& ); - D3DXVECTOR2& operator -= ( CONST D3DXVECTOR2& ); - D3DXVECTOR2& operator *= ( FLOAT ); - D3DXVECTOR2& operator /= ( FLOAT ); - - // unary operators - D3DXVECTOR2 operator + () const; - D3DXVECTOR2 operator - () const; - - // binary operators - D3DXVECTOR2 operator + ( CONST D3DXVECTOR2& ) const; - D3DXVECTOR2 operator - ( CONST D3DXVECTOR2& ) const; - D3DXVECTOR2 operator * ( FLOAT ) const; - D3DXVECTOR2 operator / ( FLOAT ) const; - - friend D3DXVECTOR2 operator * ( FLOAT, CONST D3DXVECTOR2& ); - - BOOL operator == ( CONST D3DXVECTOR2& ) const; - BOOL operator != ( CONST D3DXVECTOR2& ) const; - - -public: -#endif //__cplusplus - FLOAT x, y; -} D3DXVECTOR2, *LPD3DXVECTOR2; - - -//-------------------------- -// 3D Vector -//-------------------------- -#ifdef __cplusplus -typedef struct D3DXVECTOR3 : public D3DVECTOR -{ -public: - D3DXVECTOR3() {}; - D3DXVECTOR3( CONST FLOAT * ); - D3DXVECTOR3( CONST D3DVECTOR& ); - D3DXVECTOR3( FLOAT x, FLOAT y, FLOAT z ); - - // casting - operator FLOAT* (); - operator CONST FLOAT* () const; - - // assignment operators - D3DXVECTOR3& operator += ( CONST D3DXVECTOR3& ); - D3DXVECTOR3& operator -= ( CONST D3DXVECTOR3& ); - D3DXVECTOR3& operator *= ( FLOAT ); - D3DXVECTOR3& operator /= ( FLOAT ); - - // unary operators - D3DXVECTOR3 operator + () const; - D3DXVECTOR3 operator - () const; - - // binary operators - D3DXVECTOR3 operator + ( CONST D3DXVECTOR3& ) const; - D3DXVECTOR3 operator - ( CONST D3DXVECTOR3& ) const; - D3DXVECTOR3 operator * ( FLOAT ) const; - D3DXVECTOR3 operator / ( FLOAT ) const; - - friend D3DXVECTOR3 operator * ( FLOAT, CONST struct D3DXVECTOR3& ); - - BOOL operator == ( CONST D3DXVECTOR3& ) const; - BOOL operator != ( CONST D3DXVECTOR3& ) const; - -} D3DXVECTOR3, *LPD3DXVECTOR3; - -#else //!__cplusplus -typedef struct _D3DVECTOR D3DXVECTOR3, *LPD3DXVECTOR3; -#endif //!__cplusplus - - -//-------------------------- -// 4D Vector -//-------------------------- -typedef struct D3DXVECTOR4 -{ -#ifdef __cplusplus -public: - D3DXVECTOR4() {}; - D3DXVECTOR4( CONST FLOAT* ); - D3DXVECTOR4( FLOAT x, FLOAT y, FLOAT z, FLOAT w ); - - // casting - operator FLOAT* (); - operator CONST FLOAT* () const; - - // assignment operators - D3DXVECTOR4& operator += ( CONST D3DXVECTOR4& ); - D3DXVECTOR4& operator -= ( CONST D3DXVECTOR4& ); - D3DXVECTOR4& operator *= ( FLOAT ); - D3DXVECTOR4& operator /= ( FLOAT ); - - // unary operators - D3DXVECTOR4 operator + () const; - D3DXVECTOR4 operator - () const; - - // binary operators - D3DXVECTOR4 operator + ( CONST D3DXVECTOR4& ) const; - D3DXVECTOR4 operator - ( CONST D3DXVECTOR4& ) const; - D3DXVECTOR4 operator * ( FLOAT ) const; - D3DXVECTOR4 operator / ( FLOAT ) const; - - friend D3DXVECTOR4 operator * ( FLOAT, CONST D3DXVECTOR4& ); - - BOOL operator == ( CONST D3DXVECTOR4& ) const; - BOOL operator != ( CONST D3DXVECTOR4& ) const; - -public: -#endif //__cplusplus - FLOAT x, y, z, w; -} D3DXVECTOR4, *LPD3DXVECTOR4; - - -//=========================================================================== -// -// Matrices -// -//=========================================================================== -#ifdef __cplusplus -typedef struct D3DXMATRIX : public D3DMATRIX -{ -public: - D3DXMATRIX() {}; - D3DXMATRIX( CONST FLOAT * ); - D3DXMATRIX( CONST D3DMATRIX& ); - D3DXMATRIX( FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14, - FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24, - FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34, - FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44 ); - - - // access grants - FLOAT& operator () ( UINT Row, UINT Col ); - FLOAT operator () ( UINT Row, UINT Col ) const; - - // casting operators - operator FLOAT* (); - operator CONST FLOAT* () const; - - // assignment operators - D3DXMATRIX& operator *= ( CONST D3DXMATRIX& ); - D3DXMATRIX& operator += ( CONST D3DXMATRIX& ); - D3DXMATRIX& operator -= ( CONST D3DXMATRIX& ); - D3DXMATRIX& operator *= ( FLOAT ); - D3DXMATRIX& operator /= ( FLOAT ); - - // unary operators - D3DXMATRIX operator + () const; - D3DXMATRIX operator - () const; - - // binary operators - D3DXMATRIX operator * ( CONST D3DXMATRIX& ) const; - D3DXMATRIX operator + ( CONST D3DXMATRIX& ) const; - D3DXMATRIX operator - ( CONST D3DXMATRIX& ) const; - D3DXMATRIX operator * ( FLOAT ) const; - D3DXMATRIX operator / ( FLOAT ) const; - - friend D3DXMATRIX operator * ( FLOAT, CONST D3DXMATRIX& ); - - BOOL operator == ( CONST D3DXMATRIX& ) const; - BOOL operator != ( CONST D3DXMATRIX& ) const; - -} D3DXMATRIX, *LPD3DXMATRIX; - -#else //!__cplusplus -typedef struct _D3DMATRIX D3DXMATRIX, *LPD3DXMATRIX; -#endif //!__cplusplus - -//=========================================================================== -// -// Aligned Matrices -// -// This class helps keep matrices 16-byte aligned as preferred by P4 cpus. -// It aligns matrices on the stack and on the heap or in global scope. -// It does this using __declspec(align(16)) which works on VC7 and on VC 6 -// with the processor pack. Unfortunately there is no way to detect the -// latter so this is turned on only on VC7. On other compilers this is the -// the same as D3DXMATRIX. -// Using this class on a compiler that does not actually do the alignment -// can be dangerous since it will not expose bugs that ignore alignment. -// E.g if an object of this class in inside a struct or class, and some code -// memcopys data in it assuming tight packing. This could break on a compiler -// that eventually start aligning the matrix. -// -//=========================================================================== -#ifdef __cplusplus -typedef struct _D3DXMATRIXA16 : public D3DXMATRIX -{ - _D3DXMATRIXA16() {} - _D3DXMATRIXA16( CONST FLOAT * f): D3DXMATRIX(f) {} - _D3DXMATRIXA16( CONST D3DMATRIX& m): D3DXMATRIX(m) {} - _D3DXMATRIXA16( FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14, - FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24, - FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34, - FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44 ) : - D3DXMATRIX(_11, _12, _13, _14, - _21, _22, _23, _24, - _31, _32, _33, _34, - _41, _42, _43, _44) {} - void* operator new(size_t s) - { - LPBYTE p = ::new BYTE[s + 16]; - if (p) - { - BYTE offset = (BYTE)(16 - ((UINT_PTR)p & 15)); - p += offset; - p[-1] = offset; - } - return p; - }; - - void* operator new[](size_t s) - { - LPBYTE p = ::new BYTE[s + 16]; - if (p) - { - BYTE offset = (BYTE)(16 - ((UINT_PTR)p & 15)); - p += offset; - p[-1] = offset; - } - return p; - }; - - // This is NOT a virtual operator. If you cast - // to D3DXMATRIX, do not delete using that - void operator delete(void* p) - { - if(p) - { - BYTE* pb = static_cast(p); - pb -= pb[-1]; - ::delete [] pb; - } - }; - - // This is NOT a virtual operator. If you cast - // to D3DXMATRIX, do not delete using that - void operator delete[](void* p) - { - if(p) - { - BYTE* pb = static_cast(p); - pb -= pb[-1]; - ::delete [] pb; - } - }; - - struct _D3DXMATRIXA16& operator=(CONST D3DXMATRIX& rhs) - { - memcpy(&_11, &rhs, sizeof(D3DXMATRIX)); - return *this; - }; -} _D3DXMATRIXA16; - -#else //!__cplusplus -typedef D3DXMATRIX _D3DXMATRIXA16; -#endif //!__cplusplus - -#if _MSC_VER >= 1300 // VC7 -#define _ALIGN_16 __declspec(align(16)) -#else -#define _ALIGN_16 // Earlier compiler may not understand this, do nothing. -#endif - -#define D3DXMATRIXA16 _ALIGN_16 _D3DXMATRIXA16 - -typedef D3DXMATRIXA16 *LPD3DXMATRIXA16; - -//=========================================================================== -// -// Quaternions -// -//=========================================================================== -typedef struct D3DXQUATERNION -{ -#ifdef __cplusplus -public: - D3DXQUATERNION() {} - D3DXQUATERNION( CONST FLOAT * ); - D3DXQUATERNION( FLOAT x, FLOAT y, FLOAT z, FLOAT w ); - - // casting - operator FLOAT* (); - operator CONST FLOAT* () const; - - // assignment operators - D3DXQUATERNION& operator += ( CONST D3DXQUATERNION& ); - D3DXQUATERNION& operator -= ( CONST D3DXQUATERNION& ); - D3DXQUATERNION& operator *= ( CONST D3DXQUATERNION& ); - D3DXQUATERNION& operator *= ( FLOAT ); - D3DXQUATERNION& operator /= ( FLOAT ); - - // unary operators - D3DXQUATERNION operator + () const; - D3DXQUATERNION operator - () const; - - // binary operators - D3DXQUATERNION operator + ( CONST D3DXQUATERNION& ) const; - D3DXQUATERNION operator - ( CONST D3DXQUATERNION& ) const; - D3DXQUATERNION operator * ( CONST D3DXQUATERNION& ) const; - D3DXQUATERNION operator * ( FLOAT ) const; - D3DXQUATERNION operator / ( FLOAT ) const; - - friend D3DXQUATERNION operator * (FLOAT, CONST D3DXQUATERNION& ); - - BOOL operator == ( CONST D3DXQUATERNION& ) const; - BOOL operator != ( CONST D3DXQUATERNION& ) const; - -#endif //__cplusplus - FLOAT x, y, z, w; -} D3DXQUATERNION, *LPD3DXQUATERNION; - - -//=========================================================================== -// -// Planes -// -//=========================================================================== -typedef struct D3DXPLANE -{ -#ifdef __cplusplus -public: - D3DXPLANE() {} - D3DXPLANE( CONST FLOAT* ); - D3DXPLANE( FLOAT a, FLOAT b, FLOAT c, FLOAT d ); - - // casting - operator FLOAT* (); - operator CONST FLOAT* () const; - - // unary operators - D3DXPLANE operator + () const; - D3DXPLANE operator - () const; - - // binary operators - BOOL operator == ( CONST D3DXPLANE& ) const; - BOOL operator != ( CONST D3DXPLANE& ) const; - -#endif //__cplusplus - FLOAT a, b, c, d; -} D3DXPLANE, *LPD3DXPLANE; - - -//=========================================================================== -// -// Colors -// -//=========================================================================== - -typedef struct D3DXCOLOR -{ -#ifdef __cplusplus -public: - D3DXCOLOR() {} - D3DXCOLOR( DWORD argb ); - D3DXCOLOR( CONST FLOAT * ); - D3DXCOLOR( CONST D3DCOLORVALUE& ); - D3DXCOLOR( FLOAT r, FLOAT g, FLOAT b, FLOAT a ); - - // casting - operator DWORD () const; - - operator FLOAT* (); - operator CONST FLOAT* () const; - - operator D3DCOLORVALUE* (); - operator CONST D3DCOLORVALUE* () const; - - operator D3DCOLORVALUE& (); - operator CONST D3DCOLORVALUE& () const; - - // assignment operators - D3DXCOLOR& operator += ( CONST D3DXCOLOR& ); - D3DXCOLOR& operator -= ( CONST D3DXCOLOR& ); - D3DXCOLOR& operator *= ( FLOAT ); - D3DXCOLOR& operator /= ( FLOAT ); - - // unary operators - D3DXCOLOR operator + () const; - D3DXCOLOR operator - () const; - - // binary operators - D3DXCOLOR operator + ( CONST D3DXCOLOR& ) const; - D3DXCOLOR operator - ( CONST D3DXCOLOR& ) const; - D3DXCOLOR operator * ( FLOAT ) const; - D3DXCOLOR operator / ( FLOAT ) const; - - friend D3DXCOLOR operator * (FLOAT, CONST D3DXCOLOR& ); - - BOOL operator == ( CONST D3DXCOLOR& ) const; - BOOL operator != ( CONST D3DXCOLOR& ) const; - -#endif //__cplusplus - FLOAT r, g, b, a; -} D3DXCOLOR, *LPD3DXCOLOR; - - - -//=========================================================================== -// -// D3DX math functions: -// -// NOTE: -// * All these functions can take the same object as in and out parameters. -// -// * Out parameters are typically also returned as return values, so that -// the output of one function may be used as a parameter to another. -// -//=========================================================================== - -//-------------------------- -// 2D Vector -//-------------------------- - -// inline - -FLOAT D3DXVec2Length - ( CONST D3DXVECTOR2 *pV ); - -FLOAT D3DXVec2LengthSq - ( CONST D3DXVECTOR2 *pV ); - -FLOAT D3DXVec2Dot - ( CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 ); - -// Z component of ((x1,y1,0) cross (x2,y2,0)) -FLOAT D3DXVec2CCW - ( CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 ); - -D3DXVECTOR2* D3DXVec2Add - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 ); - -D3DXVECTOR2* D3DXVec2Subtract - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 ); - -// Minimize each component. x = min(x1, x2), y = min(y1, y2) -D3DXVECTOR2* D3DXVec2Minimize - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 ); - -// Maximize each component. x = max(x1, x2), y = max(y1, y2) -D3DXVECTOR2* D3DXVec2Maximize - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 ); - -D3DXVECTOR2* D3DXVec2Scale - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV, FLOAT s ); - -// Linear interpolation. V1 + s(V2-V1) -D3DXVECTOR2* D3DXVec2Lerp - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2, - FLOAT s ); - -// non-inline -#ifdef __cplusplus -extern "C" { -#endif - -D3DXVECTOR2* WINAPI D3DXVec2Normalize - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV ); - -// Hermite interpolation between position V1, tangent T1 (when s == 0) -// and position V2, tangent T2 (when s == 1). -D3DXVECTOR2* WINAPI D3DXVec2Hermite - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pT1, - CONST D3DXVECTOR2 *pV2, CONST D3DXVECTOR2 *pT2, FLOAT s ); - -// CatmullRom interpolation between V1 (when s == 0) and V2 (when s == 1) -D3DXVECTOR2* WINAPI D3DXVec2CatmullRom - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV0, CONST D3DXVECTOR2 *pV1, - CONST D3DXVECTOR2 *pV2, CONST D3DXVECTOR2 *pV3, FLOAT s ); - -// Barycentric coordinates. V1 + f(V2-V1) + g(V3-V1) -D3DXVECTOR2* WINAPI D3DXVec2BaryCentric - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2, - CONST D3DXVECTOR2 *pV3, FLOAT f, FLOAT g); - -// Transform (x, y, 0, 1) by matrix. -D3DXVECTOR4* WINAPI D3DXVec2Transform - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR2 *pV, CONST D3DXMATRIX *pM ); - -// Transform (x, y, 0, 1) by matrix, project result back into w=1. -D3DXVECTOR2* WINAPI D3DXVec2TransformCoord - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV, CONST D3DXMATRIX *pM ); - -// Transform (x, y, 0, 0) by matrix. -D3DXVECTOR2* WINAPI D3DXVec2TransformNormal - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV, CONST D3DXMATRIX *pM ); - -#ifdef __cplusplus -} -#endif - - -//-------------------------- -// 3D Vector -//-------------------------- - -// inline - -FLOAT D3DXVec3Length - ( CONST D3DXVECTOR3 *pV ); - -FLOAT D3DXVec3LengthSq - ( CONST D3DXVECTOR3 *pV ); - -FLOAT D3DXVec3Dot - ( CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ); - -D3DXVECTOR3* D3DXVec3Cross - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ); - -D3DXVECTOR3* D3DXVec3Add - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ); - -D3DXVECTOR3* D3DXVec3Subtract - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ); - -// Minimize each component. x = min(x1, x2), y = min(y1, y2), ... -D3DXVECTOR3* D3DXVec3Minimize - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ); - -// Maximize each component. x = max(x1, x2), y = max(y1, y2), ... -D3DXVECTOR3* D3DXVec3Maximize - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ); - -D3DXVECTOR3* D3DXVec3Scale - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, FLOAT s); - -// Linear interpolation. V1 + s(V2-V1) -D3DXVECTOR3* D3DXVec3Lerp - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2, - FLOAT s ); - -// non-inline -#ifdef __cplusplus -extern "C" { -#endif - -D3DXVECTOR3* WINAPI D3DXVec3Normalize - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV ); - -// Hermite interpolation between position V1, tangent T1 (when s == 0) -// and position V2, tangent T2 (when s == 1). -D3DXVECTOR3* WINAPI D3DXVec3Hermite - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pT1, - CONST D3DXVECTOR3 *pV2, CONST D3DXVECTOR3 *pT2, FLOAT s ); - -// CatmullRom interpolation between V1 (when s == 0) and V2 (when s == 1) -D3DXVECTOR3* WINAPI D3DXVec3CatmullRom - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV0, CONST D3DXVECTOR3 *pV1, - CONST D3DXVECTOR3 *pV2, CONST D3DXVECTOR3 *pV3, FLOAT s ); - -// Barycentric coordinates. V1 + f(V2-V1) + g(V3-V1) -D3DXVECTOR3* WINAPI D3DXVec3BaryCentric - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2, - CONST D3DXVECTOR3 *pV3, FLOAT f, FLOAT g); - -// Transform (x, y, z, 1) by matrix. -D3DXVECTOR4* WINAPI D3DXVec3Transform - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR3 *pV, CONST D3DXMATRIX *pM ); - -// Transform (x, y, z, 1) by matrix, project result back into w=1. -D3DXVECTOR3* WINAPI D3DXVec3TransformCoord - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, CONST D3DXMATRIX *pM ); - -// Transform (x, y, z, 0) by matrix. If you transforming a normal by a -// non-affine matrix, the matrix you pass to this function should be the -// transpose of the inverse of the matrix you would use to transform a coord. -D3DXVECTOR3* WINAPI D3DXVec3TransformNormal - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, CONST D3DXMATRIX *pM ); - -// Project vector from object space into screen space -D3DXVECTOR3* WINAPI D3DXVec3Project - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, CONST D3DVIEWPORT8 *pViewport, - CONST D3DXMATRIX *pProjection, CONST D3DXMATRIX *pView, CONST D3DXMATRIX *pWorld); - -// Project vector from screen space into object space -D3DXVECTOR3* WINAPI D3DXVec3Unproject - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, CONST D3DVIEWPORT8 *pViewport, - CONST D3DXMATRIX *pProjection, CONST D3DXMATRIX *pView, CONST D3DXMATRIX *pWorld); - -#ifdef __cplusplus -} -#endif - - - -//-------------------------- -// 4D Vector -//-------------------------- - -// inline - -FLOAT D3DXVec4Length - ( CONST D3DXVECTOR4 *pV ); - -FLOAT D3DXVec4LengthSq - ( CONST D3DXVECTOR4 *pV ); - -FLOAT D3DXVec4Dot - ( CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2 ); - -D3DXVECTOR4* D3DXVec4Add - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2); - -D3DXVECTOR4* D3DXVec4Subtract - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2); - -// Minimize each component. x = min(x1, x2), y = min(y1, y2), ... -D3DXVECTOR4* D3DXVec4Minimize - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2); - -// Maximize each component. x = max(x1, x2), y = max(y1, y2), ... -D3DXVECTOR4* D3DXVec4Maximize - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2); - -D3DXVECTOR4* D3DXVec4Scale - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV, FLOAT s); - -// Linear interpolation. V1 + s(V2-V1) -D3DXVECTOR4* D3DXVec4Lerp - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2, - FLOAT s ); - -// non-inline -#ifdef __cplusplus -extern "C" { -#endif - -// Cross-product in 4 dimensions. -D3DXVECTOR4* WINAPI D3DXVec4Cross - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2, - CONST D3DXVECTOR4 *pV3); - -D3DXVECTOR4* WINAPI D3DXVec4Normalize - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV ); - -// Hermite interpolation between position V1, tangent T1 (when s == 0) -// and position V2, tangent T2 (when s == 1). -D3DXVECTOR4* WINAPI D3DXVec4Hermite - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pT1, - CONST D3DXVECTOR4 *pV2, CONST D3DXVECTOR4 *pT2, FLOAT s ); - -// CatmullRom interpolation between V1 (when s == 0) and V2 (when s == 1) -D3DXVECTOR4* WINAPI D3DXVec4CatmullRom - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV0, CONST D3DXVECTOR4 *pV1, - CONST D3DXVECTOR4 *pV2, CONST D3DXVECTOR4 *pV3, FLOAT s ); - -// Barycentric coordinates. V1 + f(V2-V1) + g(V3-V1) -D3DXVECTOR4* WINAPI D3DXVec4BaryCentric - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2, - CONST D3DXVECTOR4 *pV3, FLOAT f, FLOAT g); - -// Transform vector by matrix. -D3DXVECTOR4* WINAPI D3DXVec4Transform - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV, CONST D3DXMATRIX *pM ); - -#ifdef __cplusplus -} -#endif - - -//-------------------------- -// 4D Matrix -//-------------------------- - -// inline - -D3DXMATRIX* D3DXMatrixIdentity - ( D3DXMATRIX *pOut ); - -BOOL D3DXMatrixIsIdentity - ( CONST D3DXMATRIX *pM ); - - -// non-inline -#ifdef __cplusplus -extern "C" { -#endif - -FLOAT WINAPI D3DXMatrixfDeterminant - ( CONST D3DXMATRIX *pM ); - -D3DXMATRIX* WINAPI D3DXMatrixTranspose - ( D3DXMATRIX *pOut, CONST D3DXMATRIX *pM ); - -// Matrix multiplication. The result represents the transformation M2 -// followed by the transformation M1. (Out = M1 * M2) -D3DXMATRIX* WINAPI D3DXMatrixMultiply - ( D3DXMATRIX *pOut, CONST D3DXMATRIX *pM1, CONST D3DXMATRIX *pM2 ); - -// Matrix multiplication, followed by a transpose. (Out = T(M1 * M2)) -D3DXMATRIX* WINAPI D3DXMatrixMultiplyTranspose - ( D3DXMATRIX *pOut, CONST D3DXMATRIX *pM1, CONST D3DXMATRIX *pM2 ); - -// Calculate inverse of matrix. Inversion my fail, in which case NULL will -// be returned. The determinant of pM is also returned it pfDeterminant -// is non-NULL. -D3DXMATRIX* WINAPI D3DXMatrixInverse - ( D3DXMATRIX *pOut, FLOAT *pDeterminant, CONST D3DXMATRIX *pM ); - -// Build a matrix which scales by (sx, sy, sz) -D3DXMATRIX* WINAPI D3DXMatrixScaling - ( D3DXMATRIX *pOut, FLOAT sx, FLOAT sy, FLOAT sz ); - -// Build a matrix which translates by (x, y, z) -D3DXMATRIX* WINAPI D3DXMatrixTranslation - ( D3DXMATRIX *pOut, FLOAT x, FLOAT y, FLOAT z ); - -// Build a matrix which rotates around the X axis -D3DXMATRIX* WINAPI D3DXMatrixRotationX - ( D3DXMATRIX *pOut, FLOAT Angle ); - -// Build a matrix which rotates around the Y axis -D3DXMATRIX* WINAPI D3DXMatrixRotationY - ( D3DXMATRIX *pOut, FLOAT Angle ); - -// Build a matrix which rotates around the Z axis -D3DXMATRIX* WINAPI D3DXMatrixRotationZ - ( D3DXMATRIX *pOut, FLOAT Angle ); - -// Build a matrix which rotates around an arbitrary axis -D3DXMATRIX* WINAPI D3DXMatrixRotationAxis - ( D3DXMATRIX *pOut, CONST D3DXVECTOR3 *pV, FLOAT Angle ); - -// Build a matrix from a quaternion -D3DXMATRIX* WINAPI D3DXMatrixRotationQuaternion - ( D3DXMATRIX *pOut, CONST D3DXQUATERNION *pQ); - -// Yaw around the Y axis, a pitch around the X axis, -// and a roll around the Z axis. -D3DXMATRIX* WINAPI D3DXMatrixRotationYawPitchRoll - ( D3DXMATRIX *pOut, FLOAT Yaw, FLOAT Pitch, FLOAT Roll ); - - -// Build transformation matrix. NULL arguments are treated as identity. -// Mout = Msc-1 * Msr-1 * Ms * Msr * Msc * Mrc-1 * Mr * Mrc * Mt -D3DXMATRIX* WINAPI D3DXMatrixTransformation - ( D3DXMATRIX *pOut, CONST D3DXVECTOR3 *pScalingCenter, - CONST D3DXQUATERNION *pScalingRotation, CONST D3DXVECTOR3 *pScaling, - CONST D3DXVECTOR3 *pRotationCenter, CONST D3DXQUATERNION *pRotation, - CONST D3DXVECTOR3 *pTranslation); - -// Build affine transformation matrix. NULL arguments are treated as identity. -// Mout = Ms * Mrc-1 * Mr * Mrc * Mt -D3DXMATRIX* WINAPI D3DXMatrixAffineTransformation - ( D3DXMATRIX *pOut, FLOAT Scaling, CONST D3DXVECTOR3 *pRotationCenter, - CONST D3DXQUATERNION *pRotation, CONST D3DXVECTOR3 *pTranslation); - -// Build a lookat matrix. (right-handed) -D3DXMATRIX* WINAPI D3DXMatrixLookAtRH - ( D3DXMATRIX *pOut, CONST D3DXVECTOR3 *pEye, CONST D3DXVECTOR3 *pAt, - CONST D3DXVECTOR3 *pUp ); - -// Build a lookat matrix. (left-handed) -D3DXMATRIX* WINAPI D3DXMatrixLookAtLH - ( D3DXMATRIX *pOut, CONST D3DXVECTOR3 *pEye, CONST D3DXVECTOR3 *pAt, - CONST D3DXVECTOR3 *pUp ); - -// Build a perspective projection matrix. (right-handed) -D3DXMATRIX* WINAPI D3DXMatrixPerspectiveRH - ( D3DXMATRIX *pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf ); - -// Build a perspective projection matrix. (left-handed) -D3DXMATRIX* WINAPI D3DXMatrixPerspectiveLH - ( D3DXMATRIX *pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf ); - -// Build a perspective projection matrix. (right-handed) -D3DXMATRIX* WINAPI D3DXMatrixPerspectiveFovRH - ( D3DXMATRIX *pOut, FLOAT fovy, FLOAT Aspect, FLOAT zn, FLOAT zf ); - -// Build a perspective projection matrix. (left-handed) -D3DXMATRIX* WINAPI D3DXMatrixPerspectiveFovLH - ( D3DXMATRIX *pOut, FLOAT fovy, FLOAT Aspect, FLOAT zn, FLOAT zf ); - -// Build a perspective projection matrix. (right-handed) -D3DXMATRIX* WINAPI D3DXMatrixPerspectiveOffCenterRH - ( D3DXMATRIX *pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, - FLOAT zf ); - -// Build a perspective projection matrix. (left-handed) -D3DXMATRIX* WINAPI D3DXMatrixPerspectiveOffCenterLH - ( D3DXMATRIX *pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, - FLOAT zf ); - -// Build an ortho projection matrix. (right-handed) -D3DXMATRIX* WINAPI D3DXMatrixOrthoRH - ( D3DXMATRIX *pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf ); - -// Build an ortho projection matrix. (left-handed) -D3DXMATRIX* WINAPI D3DXMatrixOrthoLH - ( D3DXMATRIX *pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf ); - -// Build an ortho projection matrix. (right-handed) -D3DXMATRIX* WINAPI D3DXMatrixOrthoOffCenterRH - ( D3DXMATRIX *pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, - FLOAT zf ); - -// Build an ortho projection matrix. (left-handed) -D3DXMATRIX* WINAPI D3DXMatrixOrthoOffCenterLH - ( D3DXMATRIX *pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, - FLOAT zf ); - -// Build a matrix which flattens geometry into a plane, as if casting -// a shadow from a light. -D3DXMATRIX* WINAPI D3DXMatrixShadow - ( D3DXMATRIX *pOut, CONST D3DXVECTOR4 *pLight, - CONST D3DXPLANE *pPlane ); - -// Build a matrix which reflects the coordinate system about a plane -D3DXMATRIX* WINAPI D3DXMatrixReflect - ( D3DXMATRIX *pOut, CONST D3DXPLANE *pPlane ); - -#ifdef __cplusplus -} -#endif - - -//-------------------------- -// Quaternion -//-------------------------- - -// inline - -FLOAT D3DXQuaternionLength - ( CONST D3DXQUATERNION *pQ ); - -// Length squared, or "norm" -FLOAT D3DXQuaternionLengthSq - ( CONST D3DXQUATERNION *pQ ); - -FLOAT D3DXQuaternionDot - ( CONST D3DXQUATERNION *pQ1, CONST D3DXQUATERNION *pQ2 ); - -// (0, 0, 0, 1) -D3DXQUATERNION* D3DXQuaternionIdentity - ( D3DXQUATERNION *pOut ); - -BOOL D3DXQuaternionIsIdentity - ( CONST D3DXQUATERNION *pQ ); - -// (-x, -y, -z, w) -D3DXQUATERNION* D3DXQuaternionConjugate - ( D3DXQUATERNION *pOut, CONST D3DXQUATERNION *pQ ); - - -// non-inline -#ifdef __cplusplus -extern "C" { -#endif - -// Compute a quaternin's axis and angle of rotation. Expects unit quaternions. -void WINAPI D3DXQuaternionToAxisAngle - ( CONST D3DXQUATERNION *pQ, D3DXVECTOR3 *pAxis, FLOAT *pAngle ); - -// Build a quaternion from a rotation matrix. -D3DXQUATERNION* WINAPI D3DXQuaternionRotationMatrix - ( D3DXQUATERNION *pOut, CONST D3DXMATRIX *pM); - -// Rotation about arbitrary axis. -D3DXQUATERNION* WINAPI D3DXQuaternionRotationAxis - ( D3DXQUATERNION *pOut, CONST D3DXVECTOR3 *pV, FLOAT Angle ); - -// Yaw around the Y axis, a pitch around the X axis, -// and a roll around the Z axis. -D3DXQUATERNION* WINAPI D3DXQuaternionRotationYawPitchRoll - ( D3DXQUATERNION *pOut, FLOAT Yaw, FLOAT Pitch, FLOAT Roll ); - -// Quaternion multiplication. The result represents the rotation Q2 -// followed by the rotation Q1. (Out = Q2 * Q1) -D3DXQUATERNION* WINAPI D3DXQuaternionMultiply - ( D3DXQUATERNION *pOut, CONST D3DXQUATERNION *pQ1, - CONST D3DXQUATERNION *pQ2 ); - -D3DXQUATERNION* WINAPI D3DXQuaternionNormalize - ( D3DXQUATERNION *pOut, CONST D3DXQUATERNION *pQ ); - -// Conjugate and re-norm -D3DXQUATERNION* WINAPI D3DXQuaternionInverse - ( D3DXQUATERNION *pOut, CONST D3DXQUATERNION *pQ ); - -// Expects unit quaternions. -// if q = (cos(theta), sin(theta) * v); ln(q) = (0, theta * v) -D3DXQUATERNION* WINAPI D3DXQuaternionLn - ( D3DXQUATERNION *pOut, CONST D3DXQUATERNION *pQ ); - -// Expects pure quaternions. (w == 0) w is ignored in calculation. -// if q = (0, theta * v); exp(q) = (cos(theta), sin(theta) * v) -D3DXQUATERNION* WINAPI D3DXQuaternionExp - ( D3DXQUATERNION *pOut, CONST D3DXQUATERNION *pQ ); - -// Spherical linear interpolation between Q1 (t == 0) and Q2 (t == 1). -// Expects unit quaternions. -D3DXQUATERNION* WINAPI D3DXQuaternionSlerp - ( D3DXQUATERNION *pOut, CONST D3DXQUATERNION *pQ1, - CONST D3DXQUATERNION *pQ2, FLOAT t ); - -// Spherical quadrangle interpolation. -// Slerp(Slerp(Q1, C, t), Slerp(A, B, t), 2t(1-t)) -D3DXQUATERNION* WINAPI D3DXQuaternionSquad - ( D3DXQUATERNION *pOut, CONST D3DXQUATERNION *pQ1, - CONST D3DXQUATERNION *pA, CONST D3DXQUATERNION *pB, - CONST D3DXQUATERNION *pC, FLOAT t ); - -// Setup control points for spherical quadrangle interpolation -// from Q1 to Q2. The control points are chosen in such a way -// to ensure the continuity of tangents with adjacent segments. -void WINAPI D3DXQuaternionSquadSetup - ( D3DXQUATERNION *pAOut, D3DXQUATERNION *pBOut, D3DXQUATERNION *pCOut, - CONST D3DXQUATERNION *pQ0, CONST D3DXQUATERNION *pQ1, - CONST D3DXQUATERNION *pQ2, CONST D3DXQUATERNION *pQ3 ); - -// Barycentric interpolation. -// Slerp(Slerp(Q1, Q2, f+g), Slerp(Q1, Q3, f+g), g/(f+g)) -D3DXQUATERNION* WINAPI D3DXQuaternionBaryCentric - ( D3DXQUATERNION *pOut, CONST D3DXQUATERNION *pQ1, - CONST D3DXQUATERNION *pQ2, CONST D3DXQUATERNION *pQ3, - FLOAT f, FLOAT g ); - -#ifdef __cplusplus -} -#endif - - -//-------------------------- -// Plane -//-------------------------- - -// inline - -// ax + by + cz + dw -FLOAT D3DXPlaneDot - ( CONST D3DXPLANE *pP, CONST D3DXVECTOR4 *pV); - -// ax + by + cz + d -FLOAT D3DXPlaneDotCoord - ( CONST D3DXPLANE *pP, CONST D3DXVECTOR3 *pV); - -// ax + by + cz -FLOAT D3DXPlaneDotNormal - ( CONST D3DXPLANE *pP, CONST D3DXVECTOR3 *pV); - -// non-inline -#ifdef __cplusplus -extern "C" { -#endif - -// Normalize plane (so that |a,b,c| == 1) -D3DXPLANE* WINAPI D3DXPlaneNormalize - ( D3DXPLANE *pOut, CONST D3DXPLANE *pP); - -// Find the intersection between a plane and a line. If the line is -// parallel to the plane, NULL is returned. -D3DXVECTOR3* WINAPI D3DXPlaneIntersectLine - ( D3DXVECTOR3 *pOut, CONST D3DXPLANE *pP, CONST D3DXVECTOR3 *pV1, - CONST D3DXVECTOR3 *pV2); - -// Construct a plane from a point and a normal -D3DXPLANE* WINAPI D3DXPlaneFromPointNormal - ( D3DXPLANE *pOut, CONST D3DXVECTOR3 *pPoint, CONST D3DXVECTOR3 *pNormal); - -// Construct a plane from 3 points -D3DXPLANE* WINAPI D3DXPlaneFromPoints - ( D3DXPLANE *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2, - CONST D3DXVECTOR3 *pV3); - -// Transform a plane by a matrix. The vector (a,b,c) must be normal. -// M should be the inverse transpose of the transformation desired. -D3DXPLANE* WINAPI D3DXPlaneTransform - ( D3DXPLANE *pOut, CONST D3DXPLANE *pP, CONST D3DXMATRIX *pM ); - -#ifdef __cplusplus -} -#endif - - -//-------------------------- -// Color -//-------------------------- - -// inline - -// (1-r, 1-g, 1-b, a) -D3DXCOLOR* D3DXColorNegative - (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC); - -D3DXCOLOR* D3DXColorAdd - (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC1, CONST D3DXCOLOR *pC2); - -D3DXCOLOR* D3DXColorSubtract - (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC1, CONST D3DXCOLOR *pC2); - -D3DXCOLOR* D3DXColorScale - (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC, FLOAT s); - -// (r1*r2, g1*g2, b1*b2, a1*a2) -D3DXCOLOR* D3DXColorModulate - (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC1, CONST D3DXCOLOR *pC2); - -// Linear interpolation of r,g,b, and a. C1 + s(C2-C1) -D3DXCOLOR* D3DXColorLerp - (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC1, CONST D3DXCOLOR *pC2, FLOAT s); - -// non-inline -#ifdef __cplusplus -extern "C" { -#endif - -// Interpolate r,g,b between desaturated color and color. -// DesaturatedColor + s(Color - DesaturatedColor) -D3DXCOLOR* WINAPI D3DXColorAdjustSaturation - (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC, FLOAT s); - -// Interpolate r,g,b between 50% grey and color. Grey + s(Color - Grey) -D3DXCOLOR* WINAPI D3DXColorAdjustContrast - (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC, FLOAT c); - -#ifdef __cplusplus -} -#endif - - - - -//-------------------------- -// Misc -//-------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -// Calculate Fresnel term given the cosine of theta (likely obtained by -// taking the dot of two normals), and the refraction index of the material. -FLOAT WINAPI D3DXFresnelTerm - (FLOAT CosTheta, FLOAT RefractionIndex); - -#ifdef __cplusplus -} -#endif - - - -//=========================================================================== -// -// Matrix Stack -// -//=========================================================================== - -typedef interface ID3DXMatrixStack ID3DXMatrixStack; -typedef interface ID3DXMatrixStack *LPD3DXMATRIXSTACK; - -// {E3357330-CC5E-11d2-A434-00A0C90629A8} -DEFINE_GUID( IID_ID3DXMatrixStack, -0xe3357330, 0xcc5e, 0x11d2, 0xa4, 0x34, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8); - - -#undef INTERFACE -#define INTERFACE ID3DXMatrixStack - -DECLARE_INTERFACE_(ID3DXMatrixStack, IUnknown) -{ - // - // IUnknown methods - // - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - // - // ID3DXMatrixStack methods - // - - // Pops the top of the stack, returns the current top - // *after* popping the top. - STDMETHOD(Pop)(THIS) PURE; - - // Pushes the stack by one, duplicating the current matrix. - STDMETHOD(Push)(THIS) PURE; - - // Loads identity in the current matrix. - STDMETHOD(LoadIdentity)(THIS) PURE; - - // Loads the given matrix into the current matrix - STDMETHOD(LoadMatrix)(THIS_ CONST D3DXMATRIX* pM ) PURE; - - // Right-Multiplies the given matrix to the current matrix. - // (transformation is about the current world origin) - STDMETHOD(MultMatrix)(THIS_ CONST D3DXMATRIX* pM ) PURE; - - // Left-Multiplies the given matrix to the current matrix - // (transformation is about the local origin of the object) - STDMETHOD(MultMatrixLocal)(THIS_ CONST D3DXMATRIX* pM ) PURE; - - // Right multiply the current matrix with the computed rotation - // matrix, counterclockwise about the given axis with the given angle. - // (rotation is about the current world origin) - STDMETHOD(RotateAxis) - (THIS_ CONST D3DXVECTOR3* pV, FLOAT Angle) PURE; - - // Left multiply the current matrix with the computed rotation - // matrix, counterclockwise about the given axis with the given angle. - // (rotation is about the local origin of the object) - STDMETHOD(RotateAxisLocal) - (THIS_ CONST D3DXVECTOR3* pV, FLOAT Angle) PURE; - - // Right multiply the current matrix with the computed rotation - // matrix. All angles are counterclockwise. (rotation is about the - // current world origin) - - // The rotation is composed of a yaw around the Y axis, a pitch around - // the X axis, and a roll around the Z axis. - STDMETHOD(RotateYawPitchRoll) - (THIS_ FLOAT Yaw, FLOAT Pitch, FLOAT Roll) PURE; - - // Left multiply the current matrix with the computed rotation - // matrix. All angles are counterclockwise. (rotation is about the - // local origin of the object) - - // The rotation is composed of a yaw around the Y axis, a pitch around - // the X axis, and a roll around the Z axis. - STDMETHOD(RotateYawPitchRollLocal) - (THIS_ FLOAT Yaw, FLOAT Pitch, FLOAT Roll) PURE; - - // Right multiply the current matrix with the computed scale - // matrix. (transformation is about the current world origin) - STDMETHOD(Scale)(THIS_ FLOAT x, FLOAT y, FLOAT z) PURE; - - // Left multiply the current matrix with the computed scale - // matrix. (transformation is about the local origin of the object) - STDMETHOD(ScaleLocal)(THIS_ FLOAT x, FLOAT y, FLOAT z) PURE; - - // Right multiply the current matrix with the computed translation - // matrix. (transformation is about the current world origin) - STDMETHOD(Translate)(THIS_ FLOAT x, FLOAT y, FLOAT z ) PURE; - - // Left multiply the current matrix with the computed translation - // matrix. (transformation is about the local origin of the object) - STDMETHOD(TranslateLocal)(THIS_ FLOAT x, FLOAT y, FLOAT z) PURE; - - // Obtain the current matrix at the top of the stack - STDMETHOD_(D3DXMATRIX*, GetTop)(THIS) PURE; -}; - -#ifdef __cplusplus -extern "C" { -#endif - -HRESULT WINAPI - D3DXCreateMatrixStack( - DWORD Flags, - LPD3DXMATRIXSTACK* ppStack); - -#ifdef __cplusplus -} -#endif - -#include "d3dx8math.inl" - -#pragma warning(default:4201) - -#endif // __D3DX8MATH_H__ diff --git a/import/DirectX8/include/d3dx8math.inl b/import/DirectX8/include/d3dx8math.inl deleted file mode 100644 index a64e5c540..000000000 --- a/import/DirectX8/include/d3dx8math.inl +++ /dev/null @@ -1,1757 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) Microsoft Corporation. All Rights Reserved. -// -// File: d3dx8math.inl -// Content: D3DX math inline functions -// -////////////////////////////////////////////////////////////////////////////// - -#ifndef __D3DX8MATH_INL__ -#define __D3DX8MATH_INL__ - - -//=========================================================================== -// -// Inline Class Methods -// -//=========================================================================== - -#ifdef __cplusplus - -//-------------------------- -// 2D Vector -//-------------------------- - -D3DXINLINE -D3DXVECTOR2::D3DXVECTOR2( CONST FLOAT *pf ) -{ -#ifdef D3DX_DEBUG - if(!pf) - return; -#endif - - x = pf[0]; - y = pf[1]; -} - -D3DXINLINE -D3DXVECTOR2::D3DXVECTOR2( FLOAT fx, FLOAT fy ) -{ - x = fx; - y = fy; -} - -// casting -D3DXINLINE -D3DXVECTOR2::operator FLOAT* () -{ - return (FLOAT *) &x; -} - -D3DXINLINE -D3DXVECTOR2::operator CONST FLOAT* () const -{ - return (CONST FLOAT *) &x; -} - -// assignment operators -D3DXINLINE D3DXVECTOR2& -D3DXVECTOR2::operator += ( CONST D3DXVECTOR2& v ) -{ - x += v.x; - y += v.y; - return *this; -} - -D3DXINLINE D3DXVECTOR2& -D3DXVECTOR2::operator -= ( CONST D3DXVECTOR2& v ) -{ - x -= v.x; - y -= v.y; - return *this; -} - -D3DXINLINE D3DXVECTOR2& -D3DXVECTOR2::operator *= ( FLOAT f ) -{ - x *= f; - y *= f; - return *this; -} - -D3DXINLINE D3DXVECTOR2& -D3DXVECTOR2::operator /= ( FLOAT f ) -{ - FLOAT fInv = 1.0f / f; - x *= fInv; - y *= fInv; - return *this; -} - -// unary operators -D3DXINLINE D3DXVECTOR2 -D3DXVECTOR2::operator + () const -{ - return *this; -} - -D3DXINLINE D3DXVECTOR2 -D3DXVECTOR2::operator - () const -{ - return D3DXVECTOR2(-x, -y); -} - -// binary operators -D3DXINLINE D3DXVECTOR2 -D3DXVECTOR2::operator + ( CONST D3DXVECTOR2& v ) const -{ - return D3DXVECTOR2(x + v.x, y + v.y); -} - -D3DXINLINE D3DXVECTOR2 -D3DXVECTOR2::operator - ( CONST D3DXVECTOR2& v ) const -{ - return D3DXVECTOR2(x - v.x, y - v.y); -} - -D3DXINLINE D3DXVECTOR2 -D3DXVECTOR2::operator * ( FLOAT f ) const -{ - return D3DXVECTOR2(x * f, y * f); -} - -D3DXINLINE D3DXVECTOR2 -D3DXVECTOR2::operator / ( FLOAT f ) const -{ - FLOAT fInv = 1.0f / f; - return D3DXVECTOR2(x * fInv, y * fInv); -} - - -D3DXINLINE D3DXVECTOR2 -operator * ( FLOAT f, CONST D3DXVECTOR2& v ) -{ - return D3DXVECTOR2(f * v.x, f * v.y); -} - -D3DXINLINE BOOL -D3DXVECTOR2::operator == ( CONST D3DXVECTOR2& v ) const -{ - return x == v.x && y == v.y; -} - -D3DXINLINE BOOL -D3DXVECTOR2::operator != ( CONST D3DXVECTOR2& v ) const -{ - return x != v.x || y != v.y; -} - - - - -//-------------------------- -// 3D Vector -//-------------------------- -D3DXINLINE -D3DXVECTOR3::D3DXVECTOR3( CONST FLOAT *pf ) -{ -#ifdef D3DX_DEBUG - if(!pf) - return; -#endif - - x = pf[0]; - y = pf[1]; - z = pf[2]; -} - -D3DXINLINE -D3DXVECTOR3::D3DXVECTOR3( CONST D3DVECTOR& v ) -{ - x = v.x; - y = v.y; - z = v.z; -} - -D3DXINLINE -D3DXVECTOR3::D3DXVECTOR3( FLOAT fx, FLOAT fy, FLOAT fz ) -{ - x = fx; - y = fy; - z = fz; -} - - -// casting -D3DXINLINE -D3DXVECTOR3::operator FLOAT* () -{ - return (FLOAT *) &x; -} - -D3DXINLINE -D3DXVECTOR3::operator CONST FLOAT* () const -{ - return (CONST FLOAT *) &x; -} - - -// assignment operators -D3DXINLINE D3DXVECTOR3& -D3DXVECTOR3::operator += ( CONST D3DXVECTOR3& v ) -{ - x += v.x; - y += v.y; - z += v.z; - return *this; -} - -D3DXINLINE D3DXVECTOR3& -D3DXVECTOR3::operator -= ( CONST D3DXVECTOR3& v ) -{ - x -= v.x; - y -= v.y; - z -= v.z; - return *this; -} - -D3DXINLINE D3DXVECTOR3& -D3DXVECTOR3::operator *= ( FLOAT f ) -{ - x *= f; - y *= f; - z *= f; - return *this; -} - -D3DXINLINE D3DXVECTOR3& -D3DXVECTOR3::operator /= ( FLOAT f ) -{ - FLOAT fInv = 1.0f / f; - x *= fInv; - y *= fInv; - z *= fInv; - return *this; -} - - -// unary operators -D3DXINLINE D3DXVECTOR3 -D3DXVECTOR3::operator + () const -{ - return *this; -} - -D3DXINLINE D3DXVECTOR3 -D3DXVECTOR3::operator - () const -{ - return D3DXVECTOR3(-x, -y, -z); -} - - -// binary operators -D3DXINLINE D3DXVECTOR3 -D3DXVECTOR3::operator + ( CONST D3DXVECTOR3& v ) const -{ - return D3DXVECTOR3(x + v.x, y + v.y, z + v.z); -} - -D3DXINLINE D3DXVECTOR3 -D3DXVECTOR3::operator - ( CONST D3DXVECTOR3& v ) const -{ - return D3DXVECTOR3(x - v.x, y - v.y, z - v.z); -} - -D3DXINLINE D3DXVECTOR3 -D3DXVECTOR3::operator * ( FLOAT f ) const -{ - return D3DXVECTOR3(x * f, y * f, z * f); -} - -D3DXINLINE D3DXVECTOR3 -D3DXVECTOR3::operator / ( FLOAT f ) const -{ - FLOAT fInv = 1.0f / f; - return D3DXVECTOR3(x * fInv, y * fInv, z * fInv); -} - - -D3DXINLINE D3DXVECTOR3 -operator * ( FLOAT f, CONST struct D3DXVECTOR3& v ) -{ - return D3DXVECTOR3(f * v.x, f * v.y, f * v.z); -} - - -D3DXINLINE BOOL -D3DXVECTOR3::operator == ( CONST D3DXVECTOR3& v ) const -{ - return x == v.x && y == v.y && z == v.z; -} - -D3DXINLINE BOOL -D3DXVECTOR3::operator != ( CONST D3DXVECTOR3& v ) const -{ - return x != v.x || y != v.y || z != v.z; -} - - - -//-------------------------- -// 4D Vector -//-------------------------- -D3DXINLINE -D3DXVECTOR4::D3DXVECTOR4( CONST FLOAT *pf ) -{ -#ifdef D3DX_DEBUG - if(!pf) - return; -#endif - - x = pf[0]; - y = pf[1]; - z = pf[2]; - w = pf[3]; -} - -D3DXINLINE -D3DXVECTOR4::D3DXVECTOR4( FLOAT fx, FLOAT fy, FLOAT fz, FLOAT fw ) -{ - x = fx; - y = fy; - z = fz; - w = fw; -} - - -// casting -D3DXINLINE -D3DXVECTOR4::operator FLOAT* () -{ - return (FLOAT *) &x; -} - -D3DXINLINE -D3DXVECTOR4::operator CONST FLOAT* () const -{ - return (CONST FLOAT *) &x; -} - - -// assignment operators -D3DXINLINE D3DXVECTOR4& -D3DXVECTOR4::operator += ( CONST D3DXVECTOR4& v ) -{ - x += v.x; - y += v.y; - z += v.z; - w += v.w; - return *this; -} - -D3DXINLINE D3DXVECTOR4& -D3DXVECTOR4::operator -= ( CONST D3DXVECTOR4& v ) -{ - x -= v.x; - y -= v.y; - z -= v.z; - w -= v.w; - return *this; -} - -D3DXINLINE D3DXVECTOR4& -D3DXVECTOR4::operator *= ( FLOAT f ) -{ - x *= f; - y *= f; - z *= f; - w *= f; - return *this; -} - -D3DXINLINE D3DXVECTOR4& -D3DXVECTOR4::operator /= ( FLOAT f ) -{ - FLOAT fInv = 1.0f / f; - x *= fInv; - y *= fInv; - z *= fInv; - w *= fInv; - return *this; -} - - -// unary operators -D3DXINLINE D3DXVECTOR4 -D3DXVECTOR4::operator + () const -{ - return *this; -} - -D3DXINLINE D3DXVECTOR4 -D3DXVECTOR4::operator - () const -{ - return D3DXVECTOR4(-x, -y, -z, -w); -} - - -// binary operators -D3DXINLINE D3DXVECTOR4 -D3DXVECTOR4::operator + ( CONST D3DXVECTOR4& v ) const -{ - return D3DXVECTOR4(x + v.x, y + v.y, z + v.z, w + v.w); -} - -D3DXINLINE D3DXVECTOR4 -D3DXVECTOR4::operator - ( CONST D3DXVECTOR4& v ) const -{ - return D3DXVECTOR4(x - v.x, y - v.y, z - v.z, w - v.w); -} - -D3DXINLINE D3DXVECTOR4 -D3DXVECTOR4::operator * ( FLOAT f ) const -{ - return D3DXVECTOR4(x * f, y * f, z * f, w * f); -} - -D3DXINLINE D3DXVECTOR4 -D3DXVECTOR4::operator / ( FLOAT f ) const -{ - FLOAT fInv = 1.0f / f; - return D3DXVECTOR4(x * fInv, y * fInv, z * fInv, w * fInv); -} - - -D3DXINLINE D3DXVECTOR4 -operator * ( FLOAT f, CONST D3DXVECTOR4& v ) -{ - return D3DXVECTOR4(f * v.x, f * v.y, f * v.z, f * v.w); -} - - -D3DXINLINE BOOL -D3DXVECTOR4::operator == ( CONST D3DXVECTOR4& v ) const -{ - return x == v.x && y == v.y && z == v.z && w == v.w; -} - -D3DXINLINE BOOL -D3DXVECTOR4::operator != ( CONST D3DXVECTOR4& v ) const -{ - return x != v.x || y != v.y || z != v.z || w != v.w; -} - - -//-------------------------- -// Matrix -//-------------------------- -D3DXINLINE -D3DXMATRIX::D3DXMATRIX( CONST FLOAT* pf ) -{ -#ifdef D3DX_DEBUG - if(!pf) - return; -#endif - - memcpy(&_11, pf, sizeof(D3DXMATRIX)); -} - -D3DXINLINE -D3DXMATRIX::D3DXMATRIX( CONST D3DMATRIX& mat ) -{ - memcpy(&_11, &mat, sizeof(D3DXMATRIX)); -} - -D3DXINLINE -D3DXMATRIX::D3DXMATRIX( FLOAT f11, FLOAT f12, FLOAT f13, FLOAT f14, - FLOAT f21, FLOAT f22, FLOAT f23, FLOAT f24, - FLOAT f31, FLOAT f32, FLOAT f33, FLOAT f34, - FLOAT f41, FLOAT f42, FLOAT f43, FLOAT f44 ) -{ - _11 = f11; _12 = f12; _13 = f13; _14 = f14; - _21 = f21; _22 = f22; _23 = f23; _24 = f24; - _31 = f31; _32 = f32; _33 = f33; _34 = f34; - _41 = f41; _42 = f42; _43 = f43; _44 = f44; -} - - - -// access grants -D3DXINLINE FLOAT& -D3DXMATRIX::operator () ( UINT iRow, UINT iCol ) -{ - return m[iRow][iCol]; -} - -D3DXINLINE FLOAT -D3DXMATRIX::operator () ( UINT iRow, UINT iCol ) const -{ - return m[iRow][iCol]; -} - - -// casting operators -D3DXINLINE -D3DXMATRIX::operator FLOAT* () -{ - return (FLOAT *) &_11; -} - -D3DXINLINE -D3DXMATRIX::operator CONST FLOAT* () const -{ - return (CONST FLOAT *) &_11; -} - - -// assignment operators -D3DXINLINE D3DXMATRIX& -D3DXMATRIX::operator *= ( CONST D3DXMATRIX& mat ) -{ - D3DXMatrixMultiply(this, this, &mat); - return *this; -} - -D3DXINLINE D3DXMATRIX& -D3DXMATRIX::operator += ( CONST D3DXMATRIX& mat ) -{ - _11 += mat._11; _12 += mat._12; _13 += mat._13; _14 += mat._14; - _21 += mat._21; _22 += mat._22; _23 += mat._23; _24 += mat._24; - _31 += mat._31; _32 += mat._32; _33 += mat._33; _34 += mat._34; - _41 += mat._41; _42 += mat._42; _43 += mat._43; _44 += mat._44; - return *this; -} - -D3DXINLINE D3DXMATRIX& -D3DXMATRIX::operator -= ( CONST D3DXMATRIX& mat ) -{ - _11 -= mat._11; _12 -= mat._12; _13 -= mat._13; _14 -= mat._14; - _21 -= mat._21; _22 -= mat._22; _23 -= mat._23; _24 -= mat._24; - _31 -= mat._31; _32 -= mat._32; _33 -= mat._33; _34 -= mat._34; - _41 -= mat._41; _42 -= mat._42; _43 -= mat._43; _44 -= mat._44; - return *this; -} - -D3DXINLINE D3DXMATRIX& -D3DXMATRIX::operator *= ( FLOAT f ) -{ - _11 *= f; _12 *= f; _13 *= f; _14 *= f; - _21 *= f; _22 *= f; _23 *= f; _24 *= f; - _31 *= f; _32 *= f; _33 *= f; _34 *= f; - _41 *= f; _42 *= f; _43 *= f; _44 *= f; - return *this; -} - -D3DXINLINE D3DXMATRIX& -D3DXMATRIX::operator /= ( FLOAT f ) -{ - FLOAT fInv = 1.0f / f; - _11 *= fInv; _12 *= fInv; _13 *= fInv; _14 *= fInv; - _21 *= fInv; _22 *= fInv; _23 *= fInv; _24 *= fInv; - _31 *= fInv; _32 *= fInv; _33 *= fInv; _34 *= fInv; - _41 *= fInv; _42 *= fInv; _43 *= fInv; _44 *= fInv; - return *this; -} - - -// unary operators -D3DXINLINE D3DXMATRIX -D3DXMATRIX::operator + () const -{ - return *this; -} - -D3DXINLINE D3DXMATRIX -D3DXMATRIX::operator - () const -{ - return D3DXMATRIX(-_11, -_12, -_13, -_14, - -_21, -_22, -_23, -_24, - -_31, -_32, -_33, -_34, - -_41, -_42, -_43, -_44); -} - - -// binary operators -D3DXINLINE D3DXMATRIX -D3DXMATRIX::operator * ( CONST D3DXMATRIX& mat ) const -{ - D3DXMATRIX matT; - D3DXMatrixMultiply(&matT, this, &mat); - return matT; -} - -D3DXINLINE D3DXMATRIX -D3DXMATRIX::operator + ( CONST D3DXMATRIX& mat ) const -{ - return D3DXMATRIX(_11 + mat._11, _12 + mat._12, _13 + mat._13, _14 + mat._14, - _21 + mat._21, _22 + mat._22, _23 + mat._23, _24 + mat._24, - _31 + mat._31, _32 + mat._32, _33 + mat._33, _34 + mat._34, - _41 + mat._41, _42 + mat._42, _43 + mat._43, _44 + mat._44); -} - -D3DXINLINE D3DXMATRIX -D3DXMATRIX::operator - ( CONST D3DXMATRIX& mat ) const -{ - return D3DXMATRIX(_11 - mat._11, _12 - mat._12, _13 - mat._13, _14 - mat._14, - _21 - mat._21, _22 - mat._22, _23 - mat._23, _24 - mat._24, - _31 - mat._31, _32 - mat._32, _33 - mat._33, _34 - mat._34, - _41 - mat._41, _42 - mat._42, _43 - mat._43, _44 - mat._44); -} - -D3DXINLINE D3DXMATRIX -D3DXMATRIX::operator * ( FLOAT f ) const -{ - return D3DXMATRIX(_11 * f, _12 * f, _13 * f, _14 * f, - _21 * f, _22 * f, _23 * f, _24 * f, - _31 * f, _32 * f, _33 * f, _34 * f, - _41 * f, _42 * f, _43 * f, _44 * f); -} - -D3DXINLINE D3DXMATRIX -D3DXMATRIX::operator / ( FLOAT f ) const -{ - FLOAT fInv = 1.0f / f; - return D3DXMATRIX(_11 * fInv, _12 * fInv, _13 * fInv, _14 * fInv, - _21 * fInv, _22 * fInv, _23 * fInv, _24 * fInv, - _31 * fInv, _32 * fInv, _33 * fInv, _34 * fInv, - _41 * fInv, _42 * fInv, _43 * fInv, _44 * fInv); -} - - -D3DXINLINE D3DXMATRIX -operator * ( FLOAT f, CONST D3DXMATRIX& mat ) -{ - return D3DXMATRIX(f * mat._11, f * mat._12, f * mat._13, f * mat._14, - f * mat._21, f * mat._22, f * mat._23, f * mat._24, - f * mat._31, f * mat._32, f * mat._33, f * mat._34, - f * mat._41, f * mat._42, f * mat._43, f * mat._44); -} - - -D3DXINLINE BOOL -D3DXMATRIX::operator == ( CONST D3DXMATRIX& mat ) const -{ - return 0 == memcmp(this, &mat, sizeof(D3DXMATRIX)); -} - -D3DXINLINE BOOL -D3DXMATRIX::operator != ( CONST D3DXMATRIX& mat ) const -{ - return 0 != memcmp(this, &mat, sizeof(D3DXMATRIX)); -} - - - -//-------------------------- -// Quaternion -//-------------------------- - -D3DXINLINE -D3DXQUATERNION::D3DXQUATERNION( CONST FLOAT* pf ) -{ -#ifdef D3DX_DEBUG - if(!pf) - return; -#endif - - x = pf[0]; - y = pf[1]; - z = pf[2]; - w = pf[3]; -} - -D3DXINLINE -D3DXQUATERNION::D3DXQUATERNION( FLOAT fx, FLOAT fy, FLOAT fz, FLOAT fw ) -{ - x = fx; - y = fy; - z = fz; - w = fw; -} - - -// casting -D3DXINLINE -D3DXQUATERNION::operator FLOAT* () -{ - return (FLOAT *) &x; -} - -D3DXINLINE -D3DXQUATERNION::operator CONST FLOAT* () const -{ - return (CONST FLOAT *) &x; -} - - -// assignment operators -D3DXINLINE D3DXQUATERNION& -D3DXQUATERNION::operator += ( CONST D3DXQUATERNION& q ) -{ - x += q.x; - y += q.y; - z += q.z; - w += q.w; - return *this; -} - -D3DXINLINE D3DXQUATERNION& -D3DXQUATERNION::operator -= ( CONST D3DXQUATERNION& q ) -{ - x -= q.x; - y -= q.y; - z -= q.z; - w -= q.w; - return *this; -} - -D3DXINLINE D3DXQUATERNION& -D3DXQUATERNION::operator *= ( CONST D3DXQUATERNION& q ) -{ - D3DXQuaternionMultiply(this, this, &q); - return *this; -} - -D3DXINLINE D3DXQUATERNION& -D3DXQUATERNION::operator *= ( FLOAT f ) -{ - x *= f; - y *= f; - z *= f; - w *= f; - return *this; -} - -D3DXINLINE D3DXQUATERNION& -D3DXQUATERNION::operator /= ( FLOAT f ) -{ - FLOAT fInv = 1.0f / f; - x *= fInv; - y *= fInv; - z *= fInv; - w *= fInv; - return *this; -} - - -// unary operators -D3DXINLINE D3DXQUATERNION -D3DXQUATERNION::operator + () const -{ - return *this; -} - -D3DXINLINE D3DXQUATERNION -D3DXQUATERNION::operator - () const -{ - return D3DXQUATERNION(-x, -y, -z, -w); -} - - -// binary operators -D3DXINLINE D3DXQUATERNION -D3DXQUATERNION::operator + ( CONST D3DXQUATERNION& q ) const -{ - return D3DXQUATERNION(x + q.x, y + q.y, z + q.z, w + q.w); -} - -D3DXINLINE D3DXQUATERNION -D3DXQUATERNION::operator - ( CONST D3DXQUATERNION& q ) const -{ - return D3DXQUATERNION(x - q.x, y - q.y, z - q.z, w - q.w); -} - -D3DXINLINE D3DXQUATERNION -D3DXQUATERNION::operator * ( CONST D3DXQUATERNION& q ) const -{ - D3DXQUATERNION qT; - D3DXQuaternionMultiply(&qT, this, &q); - return qT; -} - -D3DXINLINE D3DXQUATERNION -D3DXQUATERNION::operator * ( FLOAT f ) const -{ - return D3DXQUATERNION(x * f, y * f, z * f, w * f); -} - -D3DXINLINE D3DXQUATERNION -D3DXQUATERNION::operator / ( FLOAT f ) const -{ - FLOAT fInv = 1.0f / f; - return D3DXQUATERNION(x * fInv, y * fInv, z * fInv, w * fInv); -} - - -D3DXINLINE D3DXQUATERNION -operator * (FLOAT f, CONST D3DXQUATERNION& q ) -{ - return D3DXQUATERNION(f * q.x, f * q.y, f * q.z, f * q.w); -} - - -D3DXINLINE BOOL -D3DXQUATERNION::operator == ( CONST D3DXQUATERNION& q ) const -{ - return x == q.x && y == q.y && z == q.z && w == q.w; -} - -D3DXINLINE BOOL -D3DXQUATERNION::operator != ( CONST D3DXQUATERNION& q ) const -{ - return x != q.x || y != q.y || z != q.z || w != q.w; -} - - - -//-------------------------- -// Plane -//-------------------------- - -D3DXINLINE -D3DXPLANE::D3DXPLANE( CONST FLOAT* pf ) -{ -#ifdef D3DX_DEBUG - if(!pf) - return; -#endif - - a = pf[0]; - b = pf[1]; - c = pf[2]; - d = pf[3]; -} - -D3DXINLINE -D3DXPLANE::D3DXPLANE( FLOAT fa, FLOAT fb, FLOAT fc, FLOAT fd ) -{ - a = fa; - b = fb; - c = fc; - d = fd; -} - - -// casting -D3DXINLINE -D3DXPLANE::operator FLOAT* () -{ - return (FLOAT *) &a; -} - -D3DXINLINE -D3DXPLANE::operator CONST FLOAT* () const -{ - return (CONST FLOAT *) &a; -} - - -// unary operators -D3DXINLINE D3DXPLANE -D3DXPLANE::operator + () const -{ - return *this; -} - -D3DXINLINE D3DXPLANE -D3DXPLANE::operator - () const -{ - return D3DXPLANE(-a, -b, -c, -d); -} - - -// binary operators -D3DXINLINE BOOL -D3DXPLANE::operator == ( CONST D3DXPLANE& p ) const -{ - return a == p.a && b == p.b && c == p.c && d == p.d; -} - -D3DXINLINE BOOL -D3DXPLANE::operator != ( CONST D3DXPLANE& p ) const -{ - return a != p.a || b != p.b || c != p.c || d != p.d; -} - - - - -//-------------------------- -// Color -//-------------------------- - -D3DXINLINE -D3DXCOLOR::D3DXCOLOR( DWORD dw ) -{ - CONST FLOAT f = 1.0f / 255.0f; - r = f * (FLOAT) (unsigned char) (dw >> 16); - g = f * (FLOAT) (unsigned char) (dw >> 8); - b = f * (FLOAT) (unsigned char) (dw >> 0); - a = f * (FLOAT) (unsigned char) (dw >> 24); -} - -D3DXINLINE -D3DXCOLOR::D3DXCOLOR( CONST FLOAT* pf ) -{ -#ifdef D3DX_DEBUG - if(!pf) - return; -#endif - - r = pf[0]; - g = pf[1]; - b = pf[2]; - a = pf[3]; -} - -D3DXINLINE -D3DXCOLOR::D3DXCOLOR( CONST D3DCOLORVALUE& c ) -{ - r = c.r; - g = c.g; - b = c.b; - a = c.a; -} - -D3DXINLINE -D3DXCOLOR::D3DXCOLOR( FLOAT fr, FLOAT fg, FLOAT fb, FLOAT fa ) -{ - r = fr; - g = fg; - b = fb; - a = fa; -} - - -// casting -D3DXINLINE -D3DXCOLOR::operator DWORD () const -{ - DWORD dwR = r >= 1.0f ? 0xff : r <= 0.0f ? 0x00 : (DWORD) (r * 255.0f + 0.5f); - DWORD dwG = g >= 1.0f ? 0xff : g <= 0.0f ? 0x00 : (DWORD) (g * 255.0f + 0.5f); - DWORD dwB = b >= 1.0f ? 0xff : b <= 0.0f ? 0x00 : (DWORD) (b * 255.0f + 0.5f); - DWORD dwA = a >= 1.0f ? 0xff : a <= 0.0f ? 0x00 : (DWORD) (a * 255.0f + 0.5f); - - return (dwA << 24) | (dwR << 16) | (dwG << 8) | dwB; -} - - -D3DXINLINE -D3DXCOLOR::operator FLOAT * () -{ - return (FLOAT *) &r; -} - -D3DXINLINE -D3DXCOLOR::operator CONST FLOAT * () const -{ - return (CONST FLOAT *) &r; -} - - -D3DXINLINE -D3DXCOLOR::operator D3DCOLORVALUE * () -{ - return (D3DCOLORVALUE *) &r; -} - -D3DXINLINE -D3DXCOLOR::operator CONST D3DCOLORVALUE * () const -{ - return (CONST D3DCOLORVALUE *) &r; -} - - -D3DXINLINE -D3DXCOLOR::operator D3DCOLORVALUE& () -{ - return *((D3DCOLORVALUE *) &r); -} - -D3DXINLINE -D3DXCOLOR::operator CONST D3DCOLORVALUE& () const -{ - return *((CONST D3DCOLORVALUE *) &r); -} - - -// assignment operators -D3DXINLINE D3DXCOLOR& -D3DXCOLOR::operator += ( CONST D3DXCOLOR& c ) -{ - r += c.r; - g += c.g; - b += c.b; - a += c.a; - return *this; -} - -D3DXINLINE D3DXCOLOR& -D3DXCOLOR::operator -= ( CONST D3DXCOLOR& c ) -{ - r -= c.r; - g -= c.g; - b -= c.b; - a -= c.a; - return *this; -} - -D3DXINLINE D3DXCOLOR& -D3DXCOLOR::operator *= ( FLOAT f ) -{ - r *= f; - g *= f; - b *= f; - a *= f; - return *this; -} - -D3DXINLINE D3DXCOLOR& -D3DXCOLOR::operator /= ( FLOAT f ) -{ - FLOAT fInv = 1.0f / f; - r *= fInv; - g *= fInv; - b *= fInv; - a *= fInv; - return *this; -} - - -// unary operators -D3DXINLINE D3DXCOLOR -D3DXCOLOR::operator + () const -{ - return *this; -} - -D3DXINLINE D3DXCOLOR -D3DXCOLOR::operator - () const -{ - return D3DXCOLOR(-r, -g, -b, -a); -} - - -// binary operators -D3DXINLINE D3DXCOLOR -D3DXCOLOR::operator + ( CONST D3DXCOLOR& c ) const -{ - return D3DXCOLOR(r + c.r, g + c.g, b + c.b, a + c.a); -} - -D3DXINLINE D3DXCOLOR -D3DXCOLOR::operator - ( CONST D3DXCOLOR& c ) const -{ - return D3DXCOLOR(r - c.r, g - c.g, b - c.b, a - c.a); -} - -D3DXINLINE D3DXCOLOR -D3DXCOLOR::operator * ( FLOAT f ) const -{ - return D3DXCOLOR(r * f, g * f, b * f, a * f); -} - -D3DXINLINE D3DXCOLOR -D3DXCOLOR::operator / ( FLOAT f ) const -{ - FLOAT fInv = 1.0f / f; - return D3DXCOLOR(r * fInv, g * fInv, b * fInv, a * fInv); -} - - -D3DXINLINE D3DXCOLOR -operator * (FLOAT f, CONST D3DXCOLOR& c ) -{ - return D3DXCOLOR(f * c.r, f * c.g, f * c.b, f * c.a); -} - - -D3DXINLINE BOOL -D3DXCOLOR::operator == ( CONST D3DXCOLOR& c ) const -{ - return r == c.r && g == c.g && b == c.b && a == c.a; -} - -D3DXINLINE BOOL -D3DXCOLOR::operator != ( CONST D3DXCOLOR& c ) const -{ - return r != c.r || g != c.g || b != c.b || a != c.a; -} - - -#endif //__cplusplus - - - -//=========================================================================== -// -// Inline functions -// -//=========================================================================== - - -//-------------------------- -// 2D Vector -//-------------------------- - -D3DXINLINE FLOAT D3DXVec2Length - ( CONST D3DXVECTOR2 *pV ) -{ -#ifdef D3DX_DEBUG - if(!pV) - return 0.0f; -#endif - -#ifdef __cplusplus - return sqrtf(pV->x * pV->x + pV->y * pV->y); -#else - return (FLOAT) sqrt(pV->x * pV->x + pV->y * pV->y); -#endif -} - -D3DXINLINE FLOAT D3DXVec2LengthSq - ( CONST D3DXVECTOR2 *pV ) -{ -#ifdef D3DX_DEBUG - if(!pV) - return 0.0f; -#endif - - return pV->x * pV->x + pV->y * pV->y; -} - -D3DXINLINE FLOAT D3DXVec2Dot - ( CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pV1 || !pV2) - return 0.0f; -#endif - - return pV1->x * pV2->x + pV1->y * pV2->y; -} - -D3DXINLINE FLOAT D3DXVec2CCW - ( CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pV1 || !pV2) - return 0.0f; -#endif - - return pV1->x * pV2->y - pV1->y * pV2->x; -} - -D3DXINLINE D3DXVECTOR2* D3DXVec2Add - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x + pV2->x; - pOut->y = pV1->y + pV2->y; - return pOut; -} - -D3DXINLINE D3DXVECTOR2* D3DXVec2Subtract - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x - pV2->x; - pOut->y = pV1->y - pV2->y; - return pOut; -} - -D3DXINLINE D3DXVECTOR2* D3DXVec2Minimize - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x < pV2->x ? pV1->x : pV2->x; - pOut->y = pV1->y < pV2->y ? pV1->y : pV2->y; - return pOut; -} - -D3DXINLINE D3DXVECTOR2* D3DXVec2Maximize - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x > pV2->x ? pV1->x : pV2->x; - pOut->y = pV1->y > pV2->y ? pV1->y : pV2->y; - return pOut; -} - -D3DXINLINE D3DXVECTOR2* D3DXVec2Scale - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV, FLOAT s ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV) - return NULL; -#endif - - pOut->x = pV->x * s; - pOut->y = pV->y * s; - return pOut; -} - -D3DXINLINE D3DXVECTOR2* D3DXVec2Lerp - ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2, - FLOAT s ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x + s * (pV2->x - pV1->x); - pOut->y = pV1->y + s * (pV2->y - pV1->y); - return pOut; -} - - -//-------------------------- -// 3D Vector -//-------------------------- - -D3DXINLINE FLOAT D3DXVec3Length - ( CONST D3DXVECTOR3 *pV ) -{ -#ifdef D3DX_DEBUG - if(!pV) - return 0.0f; -#endif - -#ifdef __cplusplus - return sqrtf(pV->x * pV->x + pV->y * pV->y + pV->z * pV->z); -#else - return (FLOAT) sqrt(pV->x * pV->x + pV->y * pV->y + pV->z * pV->z); -#endif -} - -D3DXINLINE FLOAT D3DXVec3LengthSq - ( CONST D3DXVECTOR3 *pV ) -{ -#ifdef D3DX_DEBUG - if(!pV) - return 0.0f; -#endif - - return pV->x * pV->x + pV->y * pV->y + pV->z * pV->z; -} - -D3DXINLINE FLOAT D3DXVec3Dot - ( CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pV1 || !pV2) - return 0.0f; -#endif - - return pV1->x * pV2->x + pV1->y * pV2->y + pV1->z * pV2->z; -} - -D3DXINLINE D3DXVECTOR3* D3DXVec3Cross - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ) -{ - D3DXVECTOR3 v; - -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - v.x = pV1->y * pV2->z - pV1->z * pV2->y; - v.y = pV1->z * pV2->x - pV1->x * pV2->z; - v.z = pV1->x * pV2->y - pV1->y * pV2->x; - - *pOut = v; - return pOut; -} - -D3DXINLINE D3DXVECTOR3* D3DXVec3Add - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x + pV2->x; - pOut->y = pV1->y + pV2->y; - pOut->z = pV1->z + pV2->z; - return pOut; -} - -D3DXINLINE D3DXVECTOR3* D3DXVec3Subtract - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x - pV2->x; - pOut->y = pV1->y - pV2->y; - pOut->z = pV1->z - pV2->z; - return pOut; -} - -D3DXINLINE D3DXVECTOR3* D3DXVec3Minimize - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x < pV2->x ? pV1->x : pV2->x; - pOut->y = pV1->y < pV2->y ? pV1->y : pV2->y; - pOut->z = pV1->z < pV2->z ? pV1->z : pV2->z; - return pOut; -} - -D3DXINLINE D3DXVECTOR3* D3DXVec3Maximize - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x > pV2->x ? pV1->x : pV2->x; - pOut->y = pV1->y > pV2->y ? pV1->y : pV2->y; - pOut->z = pV1->z > pV2->z ? pV1->z : pV2->z; - return pOut; -} - -D3DXINLINE D3DXVECTOR3* D3DXVec3Scale - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, FLOAT s) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV) - return NULL; -#endif - - pOut->x = pV->x * s; - pOut->y = pV->y * s; - pOut->z = pV->z * s; - return pOut; -} - -D3DXINLINE D3DXVECTOR3* D3DXVec3Lerp - ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2, - FLOAT s ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x + s * (pV2->x - pV1->x); - pOut->y = pV1->y + s * (pV2->y - pV1->y); - pOut->z = pV1->z + s * (pV2->z - pV1->z); - return pOut; -} - - -//-------------------------- -// 4D Vector -//-------------------------- - -D3DXINLINE FLOAT D3DXVec4Length - ( CONST D3DXVECTOR4 *pV ) -{ -#ifdef D3DX_DEBUG - if(!pV) - return 0.0f; -#endif - -#ifdef __cplusplus - return sqrtf(pV->x * pV->x + pV->y * pV->y + pV->z * pV->z + pV->w * pV->w); -#else - return (FLOAT) sqrt(pV->x * pV->x + pV->y * pV->y + pV->z * pV->z + pV->w * pV->w); -#endif -} - -D3DXINLINE FLOAT D3DXVec4LengthSq - ( CONST D3DXVECTOR4 *pV ) -{ -#ifdef D3DX_DEBUG - if(!pV) - return 0.0f; -#endif - - return pV->x * pV->x + pV->y * pV->y + pV->z * pV->z + pV->w * pV->w; -} - -D3DXINLINE FLOAT D3DXVec4Dot - ( CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pV1 || !pV2) - return 0.0f; -#endif - - return pV1->x * pV2->x + pV1->y * pV2->y + pV1->z * pV2->z + pV1->w * pV2->w; -} - -D3DXINLINE D3DXVECTOR4* D3DXVec4Add - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x + pV2->x; - pOut->y = pV1->y + pV2->y; - pOut->z = pV1->z + pV2->z; - pOut->w = pV1->w + pV2->w; - return pOut; -} - -D3DXINLINE D3DXVECTOR4* D3DXVec4Subtract - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x - pV2->x; - pOut->y = pV1->y - pV2->y; - pOut->z = pV1->z - pV2->z; - pOut->w = pV1->w - pV2->w; - return pOut; -} - -D3DXINLINE D3DXVECTOR4* D3DXVec4Minimize - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x < pV2->x ? pV1->x : pV2->x; - pOut->y = pV1->y < pV2->y ? pV1->y : pV2->y; - pOut->z = pV1->z < pV2->z ? pV1->z : pV2->z; - pOut->w = pV1->w < pV2->w ? pV1->w : pV2->w; - return pOut; -} - -D3DXINLINE D3DXVECTOR4* D3DXVec4Maximize - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x > pV2->x ? pV1->x : pV2->x; - pOut->y = pV1->y > pV2->y ? pV1->y : pV2->y; - pOut->z = pV1->z > pV2->z ? pV1->z : pV2->z; - pOut->w = pV1->w > pV2->w ? pV1->w : pV2->w; - return pOut; -} - -D3DXINLINE D3DXVECTOR4* D3DXVec4Scale - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV, FLOAT s) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV) - return NULL; -#endif - - pOut->x = pV->x * s; - pOut->y = pV->y * s; - pOut->z = pV->z * s; - pOut->w = pV->w * s; - return pOut; -} - -D3DXINLINE D3DXVECTOR4* D3DXVec4Lerp - ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2, - FLOAT s ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x + s * (pV2->x - pV1->x); - pOut->y = pV1->y + s * (pV2->y - pV1->y); - pOut->z = pV1->z + s * (pV2->z - pV1->z); - pOut->w = pV1->w + s * (pV2->w - pV1->w); - return pOut; -} - - -//-------------------------- -// 4D Matrix -//-------------------------- - -D3DXINLINE D3DXMATRIX* D3DXMatrixIdentity - ( D3DXMATRIX *pOut ) -{ -#ifdef D3DX_DEBUG - if(!pOut) - return NULL; -#endif - - pOut->m[0][1] = pOut->m[0][2] = pOut->m[0][3] = - pOut->m[1][0] = pOut->m[1][2] = pOut->m[1][3] = - pOut->m[2][0] = pOut->m[2][1] = pOut->m[2][3] = - pOut->m[3][0] = pOut->m[3][1] = pOut->m[3][2] = 0.0f; - - pOut->m[0][0] = pOut->m[1][1] = pOut->m[2][2] = pOut->m[3][3] = 1.0f; - return pOut; -} - - -D3DXINLINE BOOL D3DXMatrixIsIdentity - ( CONST D3DXMATRIX *pM ) -{ -#ifdef D3DX_DEBUG - if(!pM) - return FALSE; -#endif - - return pM->m[0][0] == 1.0f && pM->m[0][1] == 0.0f && pM->m[0][2] == 0.0f && pM->m[0][3] == 0.0f && - pM->m[1][0] == 0.0f && pM->m[1][1] == 1.0f && pM->m[1][2] == 0.0f && pM->m[1][3] == 0.0f && - pM->m[2][0] == 0.0f && pM->m[2][1] == 0.0f && pM->m[2][2] == 1.0f && pM->m[2][3] == 0.0f && - pM->m[3][0] == 0.0f && pM->m[3][1] == 0.0f && pM->m[3][2] == 0.0f && pM->m[3][3] == 1.0f; -} - - -//-------------------------- -// Quaternion -//-------------------------- - -D3DXINLINE FLOAT D3DXQuaternionLength - ( CONST D3DXQUATERNION *pQ ) -{ -#ifdef D3DX_DEBUG - if(!pQ) - return 0.0f; -#endif - -#ifdef __cplusplus - return sqrtf(pQ->x * pQ->x + pQ->y * pQ->y + pQ->z * pQ->z + pQ->w * pQ->w); -#else - return (FLOAT) sqrt(pQ->x * pQ->x + pQ->y * pQ->y + pQ->z * pQ->z + pQ->w * pQ->w); -#endif -} - -D3DXINLINE FLOAT D3DXQuaternionLengthSq - ( CONST D3DXQUATERNION *pQ ) -{ -#ifdef D3DX_DEBUG - if(!pQ) - return 0.0f; -#endif - - return pQ->x * pQ->x + pQ->y * pQ->y + pQ->z * pQ->z + pQ->w * pQ->w; -} - -D3DXINLINE FLOAT D3DXQuaternionDot - ( CONST D3DXQUATERNION *pQ1, CONST D3DXQUATERNION *pQ2 ) -{ -#ifdef D3DX_DEBUG - if(!pQ1 || !pQ2) - return 0.0f; -#endif - - return pQ1->x * pQ2->x + pQ1->y * pQ2->y + pQ1->z * pQ2->z + pQ1->w * pQ2->w; -} - - -D3DXINLINE D3DXQUATERNION* D3DXQuaternionIdentity - ( D3DXQUATERNION *pOut ) -{ -#ifdef D3DX_DEBUG - if(!pOut) - return NULL; -#endif - - pOut->x = pOut->y = pOut->z = 0.0f; - pOut->w = 1.0f; - return pOut; -} - -D3DXINLINE BOOL D3DXQuaternionIsIdentity - ( CONST D3DXQUATERNION *pQ ) -{ -#ifdef D3DX_DEBUG - if(!pQ) - return FALSE; -#endif - - return pQ->x == 0.0f && pQ->y == 0.0f && pQ->z == 0.0f && pQ->w == 1.0f; -} - - -D3DXINLINE D3DXQUATERNION* D3DXQuaternionConjugate - ( D3DXQUATERNION *pOut, CONST D3DXQUATERNION *pQ ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pQ) - return NULL; -#endif - - pOut->x = -pQ->x; - pOut->y = -pQ->y; - pOut->z = -pQ->z; - pOut->w = pQ->w; - return pOut; -} - - -//-------------------------- -// Plane -//-------------------------- - -D3DXINLINE FLOAT D3DXPlaneDot - ( CONST D3DXPLANE *pP, CONST D3DXVECTOR4 *pV) -{ -#ifdef D3DX_DEBUG - if(!pP || !pV) - return 0.0f; -#endif - - return pP->a * pV->x + pP->b * pV->y + pP->c * pV->z + pP->d * pV->w; -} - -D3DXINLINE FLOAT D3DXPlaneDotCoord - ( CONST D3DXPLANE *pP, CONST D3DXVECTOR3 *pV) -{ -#ifdef D3DX_DEBUG - if(!pP || !pV) - return 0.0f; -#endif - - return pP->a * pV->x + pP->b * pV->y + pP->c * pV->z + pP->d; -} - -D3DXINLINE FLOAT D3DXPlaneDotNormal - ( CONST D3DXPLANE *pP, CONST D3DXVECTOR3 *pV) -{ -#ifdef D3DX_DEBUG - if(!pP || !pV) - return 0.0f; -#endif - - return pP->a * pV->x + pP->b * pV->y + pP->c * pV->z; -} - - -//-------------------------- -// Color -//-------------------------- - -D3DXINLINE D3DXCOLOR* D3DXColorNegative - (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pC) - return NULL; -#endif - - pOut->r = 1.0f - pC->r; - pOut->g = 1.0f - pC->g; - pOut->b = 1.0f - pC->b; - pOut->a = pC->a; - return pOut; -} - -D3DXINLINE D3DXCOLOR* D3DXColorAdd - (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC1, CONST D3DXCOLOR *pC2) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pC1 || !pC2) - return NULL; -#endif - - pOut->r = pC1->r + pC2->r; - pOut->g = pC1->g + pC2->g; - pOut->b = pC1->b + pC2->b; - pOut->a = pC1->a + pC2->a; - return pOut; -} - -D3DXINLINE D3DXCOLOR* D3DXColorSubtract - (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC1, CONST D3DXCOLOR *pC2) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pC1 || !pC2) - return NULL; -#endif - - pOut->r = pC1->r - pC2->r; - pOut->g = pC1->g - pC2->g; - pOut->b = pC1->b - pC2->b; - pOut->a = pC1->a - pC2->a; - return pOut; -} - -D3DXINLINE D3DXCOLOR* D3DXColorScale - (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC, FLOAT s) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pC) - return NULL; -#endif - - pOut->r = pC->r * s; - pOut->g = pC->g * s; - pOut->b = pC->b * s; - pOut->a = pC->a * s; - return pOut; -} - -D3DXINLINE D3DXCOLOR* D3DXColorModulate - (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC1, CONST D3DXCOLOR *pC2) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pC1 || !pC2) - return NULL; -#endif - - pOut->r = pC1->r * pC2->r; - pOut->g = pC1->g * pC2->g; - pOut->b = pC1->b * pC2->b; - pOut->a = pC1->a * pC2->a; - return pOut; -} - -D3DXINLINE D3DXCOLOR* D3DXColorLerp - (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC1, CONST D3DXCOLOR *pC2, FLOAT s) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pC1 || !pC2) - return NULL; -#endif - - pOut->r = pC1->r + s * (pC2->r - pC1->r); - pOut->g = pC1->g + s * (pC2->g - pC1->g); - pOut->b = pC1->b + s * (pC2->b - pC1->b); - pOut->a = pC1->a + s * (pC2->a - pC1->a); - return pOut; -} - - -#endif // __D3DX8MATH_INL__ diff --git a/import/DirectX8/include/d3dx8mesh.h b/import/DirectX8/include/d3dx8mesh.h deleted file mode 100644 index 5408cd312..000000000 --- a/import/DirectX8/include/d3dx8mesh.h +++ /dev/null @@ -1,760 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) Microsoft Corporation. All Rights Reserved. -// -// File: d3dx8mesh.h -// Content: D3DX mesh types and functions -// -////////////////////////////////////////////////////////////////////////////// - -#include "d3dx8.h" - -#ifndef __D3DX8MESH_H__ -#define __D3DX8MESH_H__ - -#include "dxfile.h" // defines LPDIRECTXFILEDATA - -// {2A835771-BF4D-43f4-8E14-82A809F17D8A} -DEFINE_GUID(IID_ID3DXBaseMesh, -0x2a835771, 0xbf4d, 0x43f4, 0x8e, 0x14, 0x82, 0xa8, 0x9, 0xf1, 0x7d, 0x8a); - -// {CCAE5C3B-4DD1-4d0f-997E-4684CA64557F} -DEFINE_GUID(IID_ID3DXMesh, -0xccae5c3b, 0x4dd1, 0x4d0f, 0x99, 0x7e, 0x46, 0x84, 0xca, 0x64, 0x55, 0x7f); - -// {19FBE386-C282-4659-97BD-CB869B084A6C} -DEFINE_GUID(IID_ID3DXPMesh, -0x19fbe386, 0xc282, 0x4659, 0x97, 0xbd, 0xcb, 0x86, 0x9b, 0x8, 0x4a, 0x6c); - -// {4E3CA05C-D4FF-4d11-8A02-16459E08F6F4} -DEFINE_GUID(IID_ID3DXSPMesh, -0x4e3ca05c, 0xd4ff, 0x4d11, 0x8a, 0x2, 0x16, 0x45, 0x9e, 0x8, 0xf6, 0xf4); - -// {8DB06ECC-EBFC-408a-9404-3074B4773515} -DEFINE_GUID(IID_ID3DXSkinMesh, -0x8db06ecc, 0xebfc, 0x408a, 0x94, 0x4, 0x30, 0x74, 0xb4, 0x77, 0x35, 0x15); - -// Mesh options - lower 3 bytes only, upper byte used by _D3DXMESHOPT option flags -enum _D3DXMESH { - D3DXMESH_32BIT = 0x001, // If set, then use 32 bit indices, if not set use 16 bit indices. - D3DXMESH_DONOTCLIP = 0x002, // Use D3DUSAGE_DONOTCLIP for VB & IB. - D3DXMESH_POINTS = 0x004, // Use D3DUSAGE_POINTS for VB & IB. - D3DXMESH_RTPATCHES = 0x008, // Use D3DUSAGE_RTPATCHES for VB & IB. - D3DXMESH_NPATCHES = 0x4000,// Use D3DUSAGE_NPATCHES for VB & IB. - D3DXMESH_VB_SYSTEMMEM = 0x010, // Use D3DPOOL_SYSTEMMEM for VB. Overrides D3DXMESH_MANAGEDVERTEXBUFFER - D3DXMESH_VB_MANAGED = 0x020, // Use D3DPOOL_MANAGED for VB. - D3DXMESH_VB_WRITEONLY = 0x040, // Use D3DUSAGE_WRITEONLY for VB. - D3DXMESH_VB_DYNAMIC = 0x080, // Use D3DUSAGE_DYNAMIC for VB. - D3DXMESH_VB_SOFTWAREPROCESSING = 0x8000, // Use D3DUSAGE_SOFTWAREPROCESSING for VB. - D3DXMESH_IB_SYSTEMMEM = 0x100, // Use D3DPOOL_SYSTEMMEM for IB. Overrides D3DXMESH_MANAGEDINDEXBUFFER - D3DXMESH_IB_MANAGED = 0x200, // Use D3DPOOL_MANAGED for IB. - D3DXMESH_IB_WRITEONLY = 0x400, // Use D3DUSAGE_WRITEONLY for IB. - D3DXMESH_IB_DYNAMIC = 0x800, // Use D3DUSAGE_DYNAMIC for IB. - D3DXMESH_IB_SOFTWAREPROCESSING= 0x10000, // Use D3DUSAGE_SOFTWAREPROCESSING for IB. - - D3DXMESH_VB_SHARE = 0x1000, // Valid for Clone* calls only, forces cloned mesh/pmesh to share vertex buffer - - D3DXMESH_USEHWONLY = 0x2000, // Valid for ID3DXSkinMesh::ConvertToBlendedMesh - - // Helper options - D3DXMESH_SYSTEMMEM = 0x110, // D3DXMESH_VB_SYSTEMMEM | D3DXMESH_IB_SYSTEMMEM - D3DXMESH_MANAGED = 0x220, // D3DXMESH_VB_MANAGED | D3DXMESH_IB_MANAGED - D3DXMESH_WRITEONLY = 0x440, // D3DXMESH_VB_WRITEONLY | D3DXMESH_IB_WRITEONLY - D3DXMESH_DYNAMIC = 0x880, // D3DXMESH_VB_DYNAMIC | D3DXMESH_IB_DYNAMIC - D3DXMESH_SOFTWAREPROCESSING = 0x18000, // D3DXMESH_VB_SOFTWAREPROCESSING | D3DXMESH_IB_SOFTWAREPROCESSING - -}; - -// option field values for specifying min value in D3DXGeneratePMesh and D3DXSimplifyMesh -enum _D3DXMESHSIMP -{ - D3DXMESHSIMP_VERTEX = 0x1, - D3DXMESHSIMP_FACE = 0x2, - -}; - -enum _MAX_FVF_DECL_SIZE -{ - MAX_FVF_DECL_SIZE = 20 -}; - -typedef struct ID3DXBaseMesh *LPD3DXBASEMESH; -typedef struct ID3DXMesh *LPD3DXMESH; -typedef struct ID3DXPMesh *LPD3DXPMESH; -typedef struct ID3DXSPMesh *LPD3DXSPMESH; -typedef struct ID3DXSkinMesh *LPD3DXSKINMESH; - -typedef struct _D3DXATTRIBUTERANGE -{ - DWORD AttribId; - DWORD FaceStart; - DWORD FaceCount; - DWORD VertexStart; - DWORD VertexCount; -} D3DXATTRIBUTERANGE; - -typedef D3DXATTRIBUTERANGE* LPD3DXATTRIBUTERANGE; - -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus -struct D3DXMATERIAL -{ - D3DMATERIAL8 MatD3D; - LPSTR pTextureFilename; -}; -typedef struct D3DXMATERIAL *LPD3DXMATERIAL; -#ifdef __cplusplus -} -#endif //__cplusplus - -typedef struct _D3DXATTRIBUTEWEIGHTS -{ - FLOAT Position; - FLOAT Boundary; - FLOAT Normal; - FLOAT Diffuse; - FLOAT Specular; - FLOAT Tex[8]; -} D3DXATTRIBUTEWEIGHTS; - -typedef D3DXATTRIBUTEWEIGHTS* LPD3DXATTRIBUTEWEIGHTS; - -enum _D3DXWELDEPSILONSFLAGS -{ - D3DXWELDEPSILONS_WELDALL = 0x1, // weld all vertices marked by adjacency as being overlapping - - D3DXWELDEPSILONS_WELDPARTIALMATCHES = 0x2, // if a given vertex component is within epsilon, modify partial matched - // vertices so that both components identical AND if all components "equal" - // remove one of the vertices - D3DXWELDEPSILONS_DONOTREMOVEVERTICES = 0x4, // instructs weld to only allow modifications to vertices and not removal - // ONLY valid if D3DXWELDEPSILONS_WELDPARTIALMATCHES is set - // useful to modify vertices to be equal, but not allow vertices to be removed -}; - -typedef struct _D3DXWELDEPSILONS -{ - FLOAT SkinWeights; - FLOAT Normal; - FLOAT Tex[8]; - DWORD Flags; -} D3DXWELDEPSILONS; - -typedef D3DXWELDEPSILONS* LPD3DXWELDEPSILONS; - - -#undef INTERFACE -#define INTERFACE ID3DXBaseMesh - -DECLARE_INTERFACE_(ID3DXBaseMesh, IUnknown) -{ - // IUnknown - STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - // ID3DXBaseMesh - STDMETHOD(DrawSubset)(THIS_ DWORD AttribId) PURE; - STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE; - STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE; - STDMETHOD_(DWORD, GetFVF)(THIS) PURE; - STDMETHOD(GetDeclaration)(THIS_ DWORD Declaration[MAX_FVF_DECL_SIZE]) PURE; - STDMETHOD_(DWORD, GetOptions)(THIS) PURE; - STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE8* ppDevice) PURE; - STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options, - DWORD FVF, LPDIRECT3DDEVICE8 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE; - STDMETHOD(CloneMesh)(THIS_ DWORD Options, - CONST DWORD *pDeclaration, LPDIRECT3DDEVICE8 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE; - STDMETHOD(GetVertexBuffer)(THIS_ LPDIRECT3DVERTEXBUFFER8* ppVB) PURE; - STDMETHOD(GetIndexBuffer)(THIS_ LPDIRECT3DINDEXBUFFER8* ppIB) PURE; - STDMETHOD(LockVertexBuffer)(THIS_ DWORD Flags, BYTE** ppData) PURE; - STDMETHOD(UnlockVertexBuffer)(THIS) PURE; - STDMETHOD(LockIndexBuffer)(THIS_ DWORD Flags, BYTE** ppData) PURE; - STDMETHOD(UnlockIndexBuffer)(THIS) PURE; - STDMETHOD(GetAttributeTable)( - THIS_ D3DXATTRIBUTERANGE *pAttribTable, DWORD* pAttribTableSize) PURE; - - STDMETHOD(ConvertPointRepsToAdjacency)(THIS_ CONST DWORD* pPRep, DWORD* pAdjacency) PURE; - STDMETHOD(ConvertAdjacencyToPointReps)(THIS_ CONST DWORD* pAdjacency, DWORD* pPRep) PURE; - STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Epsilon, DWORD* pAdjacency) PURE; -}; - - -#undef INTERFACE -#define INTERFACE ID3DXMesh - -DECLARE_INTERFACE_(ID3DXMesh, ID3DXBaseMesh) -{ - // IUnknown - STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - // ID3DXBaseMesh - STDMETHOD(DrawSubset)(THIS_ DWORD AttribId) PURE; - STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE; - STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE; - STDMETHOD_(DWORD, GetFVF)(THIS) PURE; - STDMETHOD(GetDeclaration)(THIS_ DWORD Declaration[MAX_FVF_DECL_SIZE]) PURE; - STDMETHOD_(DWORD, GetOptions)(THIS) PURE; - STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE8* ppDevice) PURE; - STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options, - DWORD FVF, LPDIRECT3DDEVICE8 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE; - STDMETHOD(CloneMesh)(THIS_ DWORD Options, - CONST DWORD *pDeclaration, LPDIRECT3DDEVICE8 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE; - STDMETHOD(GetVertexBuffer)(THIS_ LPDIRECT3DVERTEXBUFFER8* ppVB) PURE; - STDMETHOD(GetIndexBuffer)(THIS_ LPDIRECT3DINDEXBUFFER8* ppIB) PURE; - STDMETHOD(LockVertexBuffer)(THIS_ DWORD Flags, BYTE** ppData) PURE; - STDMETHOD(UnlockVertexBuffer)(THIS) PURE; - STDMETHOD(LockIndexBuffer)(THIS_ DWORD Flags, BYTE** ppData) PURE; - STDMETHOD(UnlockIndexBuffer)(THIS) PURE; - STDMETHOD(GetAttributeTable)( - THIS_ D3DXATTRIBUTERANGE *pAttribTable, DWORD* pAttribTableSize) PURE; - - STDMETHOD(ConvertPointRepsToAdjacency)(THIS_ CONST DWORD* pPRep, DWORD* pAdjacency) PURE; - STDMETHOD(ConvertAdjacencyToPointReps)(THIS_ CONST DWORD* pAdjacency, DWORD* pPRep) PURE; - STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Epsilon, DWORD* pAdjacency) PURE; - - // ID3DXMesh - STDMETHOD(LockAttributeBuffer)(THIS_ DWORD Flags, DWORD** ppData) PURE; - STDMETHOD(UnlockAttributeBuffer)(THIS) PURE; - STDMETHOD(Optimize)(THIS_ DWORD Flags, CONST DWORD* pAdjacencyIn, DWORD* pAdjacencyOut, - DWORD* pFaceRemap, LPD3DXBUFFER *ppVertexRemap, - LPD3DXMESH* ppOptMesh) PURE; - STDMETHOD(OptimizeInplace)(THIS_ DWORD Flags, CONST DWORD* pAdjacencyIn, DWORD* pAdjacencyOut, - DWORD* pFaceRemap, LPD3DXBUFFER *ppVertexRemap) PURE; - -}; - - -#undef INTERFACE -#define INTERFACE ID3DXPMesh - -DECLARE_INTERFACE_(ID3DXPMesh, ID3DXBaseMesh) -{ - // IUnknown - STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - // ID3DXBaseMesh - STDMETHOD(DrawSubset)(THIS_ DWORD AttribId) PURE; - STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE; - STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE; - STDMETHOD_(DWORD, GetFVF)(THIS) PURE; - STDMETHOD(GetDeclaration)(THIS_ DWORD Declaration[MAX_FVF_DECL_SIZE]) PURE; - STDMETHOD_(DWORD, GetOptions)(THIS) PURE; - STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE8* ppDevice) PURE; - STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options, - DWORD FVF, LPDIRECT3DDEVICE8 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE; - STDMETHOD(CloneMesh)(THIS_ DWORD Options, - CONST DWORD *pDeclaration, LPDIRECT3DDEVICE8 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE; - STDMETHOD(GetVertexBuffer)(THIS_ LPDIRECT3DVERTEXBUFFER8* ppVB) PURE; - STDMETHOD(GetIndexBuffer)(THIS_ LPDIRECT3DINDEXBUFFER8* ppIB) PURE; - STDMETHOD(LockVertexBuffer)(THIS_ DWORD Flags, BYTE** ppData) PURE; - STDMETHOD(UnlockVertexBuffer)(THIS) PURE; - STDMETHOD(LockIndexBuffer)(THIS_ DWORD Flags, BYTE** ppData) PURE; - STDMETHOD(UnlockIndexBuffer)(THIS) PURE; - STDMETHOD(GetAttributeTable)( - THIS_ D3DXATTRIBUTERANGE *pAttribTable, DWORD* pAttribTableSize) PURE; - - STDMETHOD(ConvertPointRepsToAdjacency)(THIS_ CONST DWORD* pPRep, DWORD* pAdjacency) PURE; - STDMETHOD(ConvertAdjacencyToPointReps)(THIS_ CONST DWORD* pAdjacency, DWORD* pPRep) PURE; - STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Epsilon, DWORD* pAdjacency) PURE; - - // ID3DXPMesh - STDMETHOD(ClonePMeshFVF)(THIS_ DWORD Options, - DWORD FVF, LPDIRECT3DDEVICE8 pD3D, LPD3DXPMESH* ppCloneMesh) PURE; - STDMETHOD(ClonePMesh)(THIS_ DWORD Options, - CONST DWORD *pDeclaration, LPDIRECT3DDEVICE8 pD3D, LPD3DXPMESH* ppCloneMesh) PURE; - STDMETHOD(SetNumFaces)(THIS_ DWORD Faces) PURE; - STDMETHOD(SetNumVertices)(THIS_ DWORD Vertices) PURE; - STDMETHOD_(DWORD, GetMaxFaces)(THIS) PURE; - STDMETHOD_(DWORD, GetMinFaces)(THIS) PURE; - STDMETHOD_(DWORD, GetMaxVertices)(THIS) PURE; - STDMETHOD_(DWORD, GetMinVertices)(THIS) PURE; - STDMETHOD(Save)(THIS_ IStream *pStream, LPD3DXMATERIAL pMaterials, DWORD NumMaterials) PURE; - - STDMETHOD(Optimize)(THIS_ DWORD Flags, DWORD* pAdjacencyOut, - DWORD* pFaceRemap, LPD3DXBUFFER *ppVertexRemap, - LPD3DXMESH* ppOptMesh) PURE; - - STDMETHOD(OptimizeBaseLOD)(THIS_ DWORD Flags, DWORD* pFaceRemap) PURE; - STDMETHOD(TrimByFaces)(THIS_ DWORD NewFacesMin, DWORD NewFacesMax, DWORD *rgiFaceRemap, DWORD *rgiVertRemap) PURE; - STDMETHOD(TrimByVertices)(THIS_ DWORD NewVerticesMin, DWORD NewVerticesMax, DWORD *rgiFaceRemap, DWORD *rgiVertRemap) PURE; - - STDMETHOD(GetAdjacency)(THIS_ DWORD* pAdjacency) PURE; -}; - - -#undef INTERFACE -#define INTERFACE ID3DXSPMesh - -DECLARE_INTERFACE_(ID3DXSPMesh, IUnknown) -{ - // IUnknown - STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - // ID3DXSPMesh - STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE; - STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE; - STDMETHOD_(DWORD, GetFVF)(THIS) PURE; - STDMETHOD(GetDeclaration)(THIS_ DWORD Declaration[MAX_FVF_DECL_SIZE]) PURE; - STDMETHOD_(DWORD, GetOptions)(THIS) PURE; - STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE8* ppDevice) PURE; - STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options, - DWORD FVF, LPDIRECT3DDEVICE8 pD3D, DWORD *pAdjacencyOut, DWORD *pVertexRemapOut, LPD3DXMESH* ppCloneMesh) PURE; - STDMETHOD(CloneMesh)(THIS_ DWORD Options, - CONST DWORD *pDeclaration, LPDIRECT3DDEVICE8 pD3DDevice, DWORD *pAdjacencyOut, DWORD *pVertexRemapOut, LPD3DXMESH* ppCloneMesh) PURE; - STDMETHOD(ClonePMeshFVF)(THIS_ DWORD Options, - DWORD FVF, LPDIRECT3DDEVICE8 pD3D, DWORD *pVertexRemapOut, LPD3DXPMESH* ppCloneMesh) PURE; - STDMETHOD(ClonePMesh)(THIS_ DWORD Options, - CONST DWORD *pDeclaration, LPDIRECT3DDEVICE8 pD3D, DWORD *pVertexRemapOut, LPD3DXPMESH* ppCloneMesh) PURE; - STDMETHOD(ReduceFaces)(THIS_ DWORD Faces) PURE; - STDMETHOD(ReduceVertices)(THIS_ DWORD Vertices) PURE; - STDMETHOD_(DWORD, GetMaxFaces)(THIS) PURE; - STDMETHOD_(DWORD, GetMaxVertices)(THIS) PURE; - STDMETHOD(GetVertexAttributeWeights)(THIS_ LPD3DXATTRIBUTEWEIGHTS pVertexAttributeWeights) PURE; - STDMETHOD(GetVertexWeights)(THIS_ FLOAT *pVertexWeights) PURE; -}; - -#define UNUSED16 (0xffff) -#define UNUSED32 (0xffffffff) - -// ID3DXMesh::Optimize options - upper byte only, lower 3 bytes used from _D3DXMESH option flags -enum _D3DXMESHOPT { - D3DXMESHOPT_COMPACT = 0x01000000, - D3DXMESHOPT_ATTRSORT = 0x02000000, - D3DXMESHOPT_VERTEXCACHE = 0x04000000, - D3DXMESHOPT_STRIPREORDER = 0x08000000, - D3DXMESHOPT_IGNOREVERTS = 0x10000000, // optimize faces only, don't touch vertices - D3DXMESHOPT_SHAREVB = 0x1000, // same as D3DXMESH_VB_SHARE -}; - -// Subset of the mesh that has the same attribute and bone combination. -// This subset can be rendered in a single draw call -typedef struct _D3DXBONECOMBINATION -{ - DWORD AttribId; - DWORD FaceStart; - DWORD FaceCount; - DWORD VertexStart; - DWORD VertexCount; - DWORD* BoneId; -} D3DXBONECOMBINATION, *LPD3DXBONECOMBINATION; - - -#undef INTERFACE -#define INTERFACE ID3DXSkinMesh - -DECLARE_INTERFACE_(ID3DXSkinMesh, IUnknown) -{ - // IUnknown - STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - // ID3DXMesh - STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE; - STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE; - STDMETHOD_(DWORD, GetFVF)(THIS) PURE; - STDMETHOD(GetDeclaration)(THIS_ DWORD Declaration[MAX_FVF_DECL_SIZE]) PURE; - STDMETHOD_(DWORD, GetOptions)(THIS) PURE; - STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE8* ppDevice) PURE; - STDMETHOD(GetVertexBuffer)(THIS_ LPDIRECT3DVERTEXBUFFER8* ppVB) PURE; - STDMETHOD(GetIndexBuffer)(THIS_ LPDIRECT3DINDEXBUFFER8* ppIB) PURE; - STDMETHOD(LockVertexBuffer)(THIS_ DWORD flags, BYTE** ppData) PURE; - STDMETHOD(UnlockVertexBuffer)(THIS) PURE; - STDMETHOD(LockIndexBuffer)(THIS_ DWORD flags, BYTE** ppData) PURE; - STDMETHOD(UnlockIndexBuffer)(THIS) PURE; - STDMETHOD(LockAttributeBuffer)(THIS_ DWORD flags, DWORD** ppData) PURE; - STDMETHOD(UnlockAttributeBuffer)(THIS) PURE; - // ID3DXSkinMesh - STDMETHOD_(DWORD, GetNumBones)(THIS) PURE; - STDMETHOD(GetOriginalMesh)(THIS_ LPD3DXMESH* ppMesh) PURE; - STDMETHOD(SetBoneInfluence)(THIS_ DWORD bone, DWORD numInfluences, CONST DWORD* vertices, CONST FLOAT* weights) PURE; - STDMETHOD_(DWORD, GetNumBoneInfluences)(THIS_ DWORD bone) PURE; - STDMETHOD(GetBoneInfluence)(THIS_ DWORD bone, DWORD* vertices, FLOAT* weights) PURE; - STDMETHOD(GetMaxVertexInfluences)(THIS_ DWORD* maxVertexInfluences) PURE; - STDMETHOD(GetMaxFaceInfluences)(THIS_ DWORD* maxFaceInfluences) PURE; - - STDMETHOD(ConvertToBlendedMesh)(THIS_ DWORD Options, - CONST LPDWORD pAdjacencyIn, - LPDWORD pAdjacencyOut, - DWORD* pNumBoneCombinations, - LPD3DXBUFFER* ppBoneCombinationTable, - DWORD* pFaceRemap, - LPD3DXBUFFER *ppVertexRemap, - LPD3DXMESH* ppMesh) PURE; - - STDMETHOD(ConvertToIndexedBlendedMesh)(THIS_ DWORD Options, - CONST LPDWORD pAdjacencyIn, - DWORD paletteSize, - LPDWORD pAdjacencyOut, - DWORD* pNumBoneCombinations, - LPD3DXBUFFER* ppBoneCombinationTable, - DWORD* pFaceRemap, - LPD3DXBUFFER *ppVertexRemap, - LPD3DXMESH* ppMesh) PURE; - - STDMETHOD(GenerateSkinnedMesh)(THIS_ DWORD Options, - FLOAT minWeight, - CONST LPDWORD pAdjacencyIn, - LPDWORD pAdjacencyOut, - DWORD* pFaceRemap, - LPD3DXBUFFER *ppVertexRemap, - LPD3DXMESH* ppMesh) PURE; - STDMETHOD(UpdateSkinnedMesh)(THIS_ CONST D3DXMATRIX* pBoneTransforms, CONST D3DXMATRIX* pBoneInvTransforms, LPD3DXMESH pMesh) PURE; -}; - -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - -HRESULT WINAPI - D3DXCreateMesh( - DWORD NumFaces, - DWORD NumVertices, - DWORD Options, - CONST DWORD *pDeclaration, - LPDIRECT3DDEVICE8 pD3D, - LPD3DXMESH* ppMesh); - -HRESULT WINAPI - D3DXCreateMeshFVF( - DWORD NumFaces, - DWORD NumVertices, - DWORD Options, - DWORD FVF, - LPDIRECT3DDEVICE8 pD3D, - LPD3DXMESH* ppMesh); - -HRESULT WINAPI - D3DXCreateSPMesh( - LPD3DXMESH pMesh, - CONST DWORD* pAdjacency, - CONST LPD3DXATTRIBUTEWEIGHTS pVertexAttributeWeights, - CONST FLOAT *pVertexWeights, - LPD3DXSPMESH* ppSMesh); - -// clean a mesh up for simplification, try to make manifold -HRESULT WINAPI - D3DXCleanMesh( - LPD3DXMESH pMeshIn, - CONST DWORD* pAdjacencyIn, - LPD3DXMESH* ppMeshOut, - DWORD* pAdjacencyOut, - LPD3DXBUFFER* ppErrorsAndWarnings); - -HRESULT WINAPI - D3DXValidMesh( - LPD3DXMESH pMeshIn, - CONST DWORD* pAdjacency, - LPD3DXBUFFER* ppErrorsAndWarnings); - -HRESULT WINAPI - D3DXGeneratePMesh( - LPD3DXMESH pMesh, - CONST DWORD* pAdjacency, - CONST LPD3DXATTRIBUTEWEIGHTS pVertexAttributeWeights, - CONST FLOAT *pVertexWeights, - DWORD MinValue, - DWORD Options, - LPD3DXPMESH* ppPMesh); - -HRESULT WINAPI - D3DXSimplifyMesh( - LPD3DXMESH pMesh, - CONST DWORD* pAdjacency, - CONST LPD3DXATTRIBUTEWEIGHTS pVertexAttributeWeights, - CONST FLOAT *pVertexWeights, - DWORD MinValue, - DWORD Options, - LPD3DXMESH* ppMesh); - -HRESULT WINAPI - D3DXComputeBoundingSphere( - PVOID pPointsFVF, - DWORD NumVertices, - DWORD FVF, - D3DXVECTOR3 *pCenter, - FLOAT *pRadius); - -HRESULT WINAPI - D3DXComputeBoundingBox( - PVOID pPointsFVF, - DWORD NumVertices, - DWORD FVF, - D3DXVECTOR3 *pMin, - D3DXVECTOR3 *pMax); - -HRESULT WINAPI - D3DXComputeNormals( - LPD3DXBASEMESH pMesh, - CONST DWORD *pAdjacency); - -HRESULT WINAPI - D3DXCreateBuffer( - DWORD NumBytes, - LPD3DXBUFFER *ppBuffer); - - -HRESULT WINAPI - D3DXLoadMeshFromX( - LPSTR pFilename, - DWORD Options, - LPDIRECT3DDEVICE8 pD3D, - LPD3DXBUFFER *ppAdjacency, - LPD3DXBUFFER *ppMaterials, - DWORD *pNumMaterials, - LPD3DXMESH *ppMesh); - -HRESULT WINAPI - D3DXLoadMeshFromXInMemory( - PBYTE Memory, - DWORD SizeOfMemory, - DWORD Options, - LPDIRECT3DDEVICE8 pD3D, - LPD3DXBUFFER *ppAdjacency, - LPD3DXBUFFER *ppMaterials, - DWORD *pNumMaterials, - LPD3DXMESH *ppMesh); - -HRESULT WINAPI - D3DXLoadMeshFromXResource( - HMODULE Module, - LPCTSTR Name, - LPCTSTR Type, - DWORD Options, - LPDIRECT3DDEVICE8 pD3D, - LPD3DXBUFFER *ppAdjacency, - LPD3DXBUFFER *ppMaterials, - DWORD *pNumMaterials, - LPD3DXMESH *ppMesh); - -HRESULT WINAPI - D3DXSaveMeshToX( - LPSTR pFilename, - LPD3DXMESH pMesh, - CONST DWORD* pAdjacency, - CONST LPD3DXMATERIAL pMaterials, - DWORD NumMaterials, - DWORD Format - ); - -HRESULT WINAPI - D3DXCreatePMeshFromStream( - IStream *pStream, - DWORD Options, - LPDIRECT3DDEVICE8 pD3DDevice, - LPD3DXBUFFER *ppMaterials, - DWORD* pNumMaterials, - LPD3DXPMESH *ppPMesh); - -HRESULT WINAPI - D3DXCreateSkinMesh( - DWORD NumFaces, - DWORD NumVertices, - DWORD NumBones, - DWORD Options, - CONST DWORD *pDeclaration, - LPDIRECT3DDEVICE8 pD3D, - LPD3DXSKINMESH* ppSkinMesh); - -HRESULT WINAPI - D3DXCreateSkinMeshFVF( - DWORD NumFaces, - DWORD NumVertices, - DWORD NumBones, - DWORD Options, - DWORD FVF, - LPDIRECT3DDEVICE8 pD3D, - LPD3DXSKINMESH* ppSkinMesh); - -HRESULT WINAPI - D3DXCreateSkinMeshFromMesh( - LPD3DXMESH pMesh, - DWORD numBones, - LPD3DXSKINMESH* ppSkinMesh); - -HRESULT WINAPI - D3DXLoadMeshFromXof( - LPDIRECTXFILEDATA pXofObjMesh, - DWORD Options, - LPDIRECT3DDEVICE8 pD3DDevice, - LPD3DXBUFFER *ppAdjacency, - LPD3DXBUFFER *ppMaterials, - DWORD *pNumMaterials, - LPD3DXMESH *ppMesh); - -HRESULT WINAPI - D3DXLoadSkinMeshFromXof( - LPDIRECTXFILEDATA pxofobjMesh, - DWORD Options, - LPDIRECT3DDEVICE8 pD3D, - LPD3DXBUFFER* ppAdjacency, - LPD3DXBUFFER* ppMaterials, - DWORD *pMatOut, - LPD3DXBUFFER* ppBoneNames, - LPD3DXBUFFER* ppBoneTransforms, - LPD3DXSKINMESH* ppMesh); - -HRESULT WINAPI - D3DXTessellateNPatches( - LPD3DXMESH pMeshIn, - CONST DWORD* pAdjacencyIn, - FLOAT NumSegs, - BOOL QuadraticInterpNormals, // if false use linear intrep for normals, if true use quadratic - LPD3DXMESH *ppMeshOut, - LPD3DXBUFFER *ppAdjacencyOut); - -UINT WINAPI - D3DXGetFVFVertexSize(DWORD FVF); - -HRESULT WINAPI - D3DXDeclaratorFromFVF( - DWORD FVF, - DWORD Declaration[MAX_FVF_DECL_SIZE]); - -HRESULT WINAPI - D3DXFVFFromDeclarator( - CONST DWORD *pDeclarator, - DWORD *pFVF); - -HRESULT WINAPI - D3DXWeldVertices( - CONST LPD3DXMESH pMesh, - LPD3DXWELDEPSILONS pEpsilons, - CONST DWORD *pAdjacencyIn, - DWORD *pAdjacencyOut, - DWORD* pFaceRemap, - LPD3DXBUFFER *ppVertexRemap); - -typedef struct _D3DXINTERSECTINFO -{ - DWORD FaceIndex; // index of face intersected - FLOAT U; // Barycentric Hit Coordinates - FLOAT V; // Barycentric Hit Coordinates - FLOAT Dist; // Ray-Intersection Parameter Distance -} D3DXINTERSECTINFO, *LPD3DXINTERSECTINFO; - - -HRESULT WINAPI - D3DXIntersect( - LPD3DXBASEMESH pMesh, - CONST D3DXVECTOR3 *pRayPos, - CONST D3DXVECTOR3 *pRayDir, - BOOL *pHit, // True if any faces were intersected - DWORD *pFaceIndex, // index of closest face intersected - FLOAT *pU, // Barycentric Hit Coordinates - FLOAT *pV, // Barycentric Hit Coordinates - FLOAT *pDist, // Ray-Intersection Parameter Distance - LPD3DXBUFFER *ppAllHits, // Array of D3DXINTERSECTINFOs for all hits (not just closest) - DWORD *pCountOfHits); // Number of entries in AllHits array - -HRESULT WINAPI - D3DXIntersectSubset( - LPD3DXBASEMESH pMesh, - DWORD AttribId, - CONST D3DXVECTOR3 *pRayPos, - CONST D3DXVECTOR3 *pRayDir, - BOOL *pHit, // True if any faces were intersected - DWORD *pFaceIndex, // index of closest face intersected - FLOAT *pU, // Barycentric Hit Coordinates - FLOAT *pV, // Barycentric Hit Coordinates - FLOAT *pDist, // Ray-Intersection Parameter Distance - LPD3DXBUFFER *ppAllHits, // Array of D3DXINTERSECTINFOs for all hits (not just closest) - DWORD *pCountOfHits); // Number of entries in AllHits array - - -HRESULT WINAPI D3DXSplitMesh - ( - CONST LPD3DXMESH pMeshIn, - CONST DWORD *pAdjacencyIn, - CONST DWORD MaxSize, - CONST DWORD Options, - DWORD *pMeshesOut, - LPD3DXBUFFER *ppMeshArrayOut, - LPD3DXBUFFER *ppAdjacencyArrayOut, - LPD3DXBUFFER *ppFaceRemapArrayOut, - LPD3DXBUFFER *ppVertRemapArrayOut - ); - -BOOL D3DXIntersectTri -( - CONST D3DXVECTOR3 *p0, // Triangle vertex 0 position - CONST D3DXVECTOR3 *p1, // Triangle vertex 1 position - CONST D3DXVECTOR3 *p2, // Triangle vertex 2 position - CONST D3DXVECTOR3 *pRayPos, // Ray origin - CONST D3DXVECTOR3 *pRayDir, // Ray direction - FLOAT *pU, // Barycentric Hit Coordinates - FLOAT *pV, // Barycentric Hit Coordinates - FLOAT *pDist); // Ray-Intersection Parameter Distance - -BOOL WINAPI - D3DXSphereBoundProbe( - CONST D3DXVECTOR3 *pCenter, - FLOAT Radius, - CONST D3DXVECTOR3 *pRayPosition, - CONST D3DXVECTOR3 *pRayDirection); - -BOOL WINAPI - D3DXBoxBoundProbe( - CONST D3DXVECTOR3 *pMin, - CONST D3DXVECTOR3 *pMax, - CONST D3DXVECTOR3 *pRayPosition, - CONST D3DXVECTOR3 *pRayDirection); - -enum _D3DXERR { - D3DXERR_CANNOTMODIFYINDEXBUFFER = MAKE_DDHRESULT(2900), - D3DXERR_INVALIDMESH = MAKE_DDHRESULT(2901), - D3DXERR_CANNOTATTRSORT = MAKE_DDHRESULT(2902), - D3DXERR_SKINNINGNOTSUPPORTED = MAKE_DDHRESULT(2903), - D3DXERR_TOOMANYINFLUENCES = MAKE_DDHRESULT(2904), - D3DXERR_INVALIDDATA = MAKE_DDHRESULT(2905), - D3DXERR_LOADEDMESHASNODATA = MAKE_DDHRESULT(2906), -}; - - -#define D3DX_COMP_TANGENT_NONE 0xFFFFFFFF - -HRESULT WINAPI D3DXComputeTangent(LPD3DXMESH InMesh, - DWORD TexStage, - LPD3DXMESH OutMesh, - DWORD TexStageUVec, - DWORD TexStageVVec, - DWORD Wrap, - DWORD *Adjacency); - -HRESULT WINAPI -D3DXConvertMeshSubsetToSingleStrip -( - LPD3DXBASEMESH MeshIn, - DWORD AttribId, - DWORD IBOptions, - LPDIRECT3DINDEXBUFFER8 *ppIndexBuffer, - DWORD *pNumIndices -); - -HRESULT WINAPI -D3DXConvertMeshSubsetToStrips -( - LPD3DXBASEMESH MeshIn, - DWORD AttribId, - DWORD IBOptions, - LPDIRECT3DINDEXBUFFER8 *ppIndexBuffer, - DWORD *pNumIndices, - LPD3DXBUFFER *ppStripLengths, - DWORD *pNumStrips -); - - -#ifdef __cplusplus -} -#endif //__cplusplus - -#endif //__D3DX8MESH_H__ - - diff --git a/import/DirectX8/include/d3dx8shape.h b/import/DirectX8/include/d3dx8shape.h deleted file mode 100644 index b7ab63781..000000000 --- a/import/DirectX8/include/d3dx8shape.h +++ /dev/null @@ -1,220 +0,0 @@ -/////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) Microsoft Corporation. All Rights Reserved. -// -// File: d3dx8shapes.h -// Content: D3DX simple shapes -// -/////////////////////////////////////////////////////////////////////////// - -#include "d3dx8.h" - -#ifndef __D3DX8SHAPES_H__ -#define __D3DX8SHAPES_H__ - -/////////////////////////////////////////////////////////////////////////// -// Functions: -/////////////////////////////////////////////////////////////////////////// - -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - - -//------------------------------------------------------------------------- -// D3DXCreatePolygon: -// ------------------ -// Creates a mesh containing an n-sided polygon. The polygon is centered -// at the origin. -// -// Parameters: -// -// pDevice The D3D device with which the mesh is going to be used. -// Length Length of each side. -// Sides Number of sides the polygon has. (Must be >= 3) -// ppMesh The mesh object which will be created -// ppAdjacency Returns a buffer containing adjacency info. Can be NULL. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreatePolygon( - LPDIRECT3DDEVICE8 pDevice, - FLOAT Length, - UINT Sides, - LPD3DXMESH* ppMesh, - LPD3DXBUFFER* ppAdjacency); - - -//------------------------------------------------------------------------- -// D3DXCreateBox: -// -------------- -// Creates a mesh containing an axis-aligned box. The box is centered at -// the origin. -// -// Parameters: -// -// pDevice The D3D device with which the mesh is going to be used. -// Width Width of box (along X-axis) -// Height Height of box (along Y-axis) -// Depth Depth of box (along Z-axis) -// ppMesh The mesh object which will be created -// ppAdjacency Returns a buffer containing adjacency info. Can be NULL. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreateBox( - LPDIRECT3DDEVICE8 pDevice, - FLOAT Width, - FLOAT Height, - FLOAT Depth, - LPD3DXMESH* ppMesh, - LPD3DXBUFFER* ppAdjacency); - - -//------------------------------------------------------------------------- -// D3DXCreateCylinder: -// ------------------- -// Creates a mesh containing a cylinder. The generated cylinder is -// centered at the origin, and its axis is aligned with the Z-axis. -// -// Parameters: -// -// pDevice The D3D device with which the mesh is going to be used. -// Radius1 Radius at -Z end (should be >= 0.0f) -// Radius2 Radius at +Z end (should be >= 0.0f) -// Length Length of cylinder (along Z-axis) -// Slices Number of slices about the main axis -// Stacks Number of stacks along the main axis -// ppMesh The mesh object which will be created -// ppAdjacency Returns a buffer containing adjacency info. Can be NULL. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreateCylinder( - LPDIRECT3DDEVICE8 pDevice, - FLOAT Radius1, - FLOAT Radius2, - FLOAT Length, - UINT Slices, - UINT Stacks, - LPD3DXMESH* ppMesh, - LPD3DXBUFFER* ppAdjacency); - - -//------------------------------------------------------------------------- -// D3DXCreateSphere: -// ----------------- -// Creates a mesh containing a sphere. The sphere is centered at the -// origin. -// -// Parameters: -// -// pDevice The D3D device with which the mesh is going to be used. -// Radius Radius of the sphere (should be >= 0.0f) -// Slices Number of slices about the main axis -// Stacks Number of stacks along the main axis -// ppMesh The mesh object which will be created -// ppAdjacency Returns a buffer containing adjacency info. Can be NULL. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreateSphere( - LPDIRECT3DDEVICE8 pDevice, - FLOAT Radius, - UINT Slices, - UINT Stacks, - LPD3DXMESH* ppMesh, - LPD3DXBUFFER* ppAdjacency); - - -//------------------------------------------------------------------------- -// D3DXCreateTorus: -// ---------------- -// Creates a mesh containing a torus. The generated torus is centered at -// the origin, and its axis is aligned with the Z-axis. -// -// Parameters: -// -// pDevice The D3D device with which the mesh is going to be used. -// InnerRadius Inner radius of the torus (should be >= 0.0f) -// OuterRadius Outer radius of the torue (should be >= 0.0f) -// Sides Number of sides in a cross-section (must be >= 3) -// Rings Number of rings making up the torus (must be >= 3) -// ppMesh The mesh object which will be created -// ppAdjacency Returns a buffer containing adjacency info. Can be NULL. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreateTorus( - LPDIRECT3DDEVICE8 pDevice, - FLOAT InnerRadius, - FLOAT OuterRadius, - UINT Sides, - UINT Rings, - LPD3DXMESH* ppMesh, - LPD3DXBUFFER* ppAdjacency); - - -//------------------------------------------------------------------------- -// D3DXCreateTeapot: -// ----------------- -// Creates a mesh containing a teapot. -// -// Parameters: -// -// pDevice The D3D device with which the mesh is going to be used. -// ppMesh The mesh object which will be created -// ppAdjacency Returns a buffer containing adjacency info. Can be NULL. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreateTeapot( - LPDIRECT3DDEVICE8 pDevice, - LPD3DXMESH* ppMesh, - LPD3DXBUFFER* ppAdjacency); - - -//------------------------------------------------------------------------- -// D3DXCreateText: -// --------------- -// Creates a mesh containing the specified text using the font associated -// with the device context. -// -// Parameters: -// -// pDevice The D3D device with which the mesh is going to be used. -// hDC Device context, with desired font selected -// pText Text to generate -// Deviation Maximum chordal deviation from true font outlines -// Extrusion Amount to extrude text in -Z direction -// ppMesh The mesh object which will be created -// pGlyphMetrics Address of buffer to receive glyph metric data (or NULL) -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreateTextA( - LPDIRECT3DDEVICE8 pDevice, - HDC hDC, - LPCSTR pText, - FLOAT Deviation, - FLOAT Extrusion, - LPD3DXMESH* ppMesh, - LPD3DXBUFFER* ppAdjacency, - LPGLYPHMETRICSFLOAT pGlyphMetrics); - -HRESULT WINAPI - D3DXCreateTextW( - LPDIRECT3DDEVICE8 pDevice, - HDC hDC, - LPCWSTR pText, - FLOAT Deviation, - FLOAT Extrusion, - LPD3DXMESH* ppMesh, - LPD3DXBUFFER* ppAdjacency, - LPGLYPHMETRICSFLOAT pGlyphMetrics); - -#ifdef UNICODE -#define D3DXCreateText D3DXCreateTextW -#else -#define D3DXCreateText D3DXCreateTextA -#endif - - -#ifdef __cplusplus -} -#endif //__cplusplus - -#endif //__D3DX8SHAPES_H__ diff --git a/import/DirectX8/include/d3dx8tex.h b/import/DirectX8/include/d3dx8tex.h deleted file mode 100644 index dd9fe9d0e..000000000 --- a/import/DirectX8/include/d3dx8tex.h +++ /dev/null @@ -1,1592 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) Microsoft Corporation. All Rights Reserved. -// -// File: d3dx8tex.h -// Content: D3DX texturing APIs -// -////////////////////////////////////////////////////////////////////////////// - -#include "d3dx8.h" - -#ifndef __D3DX8TEX_H__ -#define __D3DX8TEX_H__ - - -//---------------------------------------------------------------------------- -// D3DX_FILTER flags: -// ------------------ -// -// A valid filter must contain one of these values: -// -// D3DX_FILTER_NONE -// No scaling or filtering will take place. Pixels outside the bounds -// of the source image are assumed to be transparent black. -// D3DX_FILTER_POINT -// Each destination pixel is computed by sampling the nearest pixel -// from the source image. -// D3DX_FILTER_LINEAR -// Each destination pixel is computed by linearly interpolating between -// the nearest pixels in the source image. This filter works best -// when the scale on each axis is less than 2. -// D3DX_FILTER_TRIANGLE -// Every pixel in the source image contributes equally to the -// destination image. This is the slowest of all the filters. -// D3DX_FILTER_BOX -// Each pixel is computed by averaging a 2x2(x2) box pixels from -// the source image. Only works when the dimensions of the -// destination are half those of the source. (as with mip maps) -// -// And can be OR'd with any of these optional flags: -// -// D3DX_FILTER_MIRROR_U -// Indicates that pixels off the edge of the texture on the U-axis -// should be mirrored, not wraped. -// D3DX_FILTER_MIRROR_V -// Indicates that pixels off the edge of the texture on the V-axis -// should be mirrored, not wraped. -// D3DX_FILTER_MIRROR_W -// Indicates that pixels off the edge of the texture on the W-axis -// should be mirrored, not wraped. -// D3DX_FILTER_MIRROR -// Same as specifying D3DX_FILTER_MIRROR_U | D3DX_FILTER_MIRROR_V | -// D3DX_FILTER_MIRROR_V -// D3DX_FILTER_DITHER -// Dithers the resulting image. -// -//---------------------------------------------------------------------------- - -#define D3DX_FILTER_NONE (1 << 0) -#define D3DX_FILTER_POINT (2 << 0) -#define D3DX_FILTER_LINEAR (3 << 0) -#define D3DX_FILTER_TRIANGLE (4 << 0) -#define D3DX_FILTER_BOX (5 << 0) - -#define D3DX_FILTER_MIRROR_U (1 << 16) -#define D3DX_FILTER_MIRROR_V (2 << 16) -#define D3DX_FILTER_MIRROR_W (4 << 16) -#define D3DX_FILTER_MIRROR (7 << 16) -#define D3DX_FILTER_DITHER (8 << 16) - - -//---------------------------------------------------------------------------- -// D3DX_NORMALMAP flags: -// --------------------- -// These flags are used to control how D3DXComputeNormalMap generates normal -// maps. Any number of these flags may be OR'd together in any combination. -// -// D3DX_NORMALMAP_MIRROR_U -// Indicates that pixels off the edge of the texture on the U-axis -// should be mirrored, not wraped. -// D3DX_NORMALMAP_MIRROR_V -// Indicates that pixels off the edge of the texture on the V-axis -// should be mirrored, not wraped. -// D3DX_NORMALMAP_MIRROR -// Same as specifying D3DX_NORMALMAP_MIRROR_U | D3DX_NORMALMAP_MIRROR_V -// D3DX_NORMALMAP_INVERTSIGN -// Inverts the direction of each normal -// D3DX_NORMALMAP_COMPUTE_OCCLUSION -// Compute the per pixel Occlusion term and encodes it into the alpha. -// An Alpha of 1 means that the pixel is not obscured in anyway, and -// an alpha of 0 would mean that the pixel is completly obscured. -// -//---------------------------------------------------------------------------- - -//---------------------------------------------------------------------------- - -#define D3DX_NORMALMAP_MIRROR_U (1 << 16) -#define D3DX_NORMALMAP_MIRROR_V (2 << 16) -#define D3DX_NORMALMAP_MIRROR (3 << 16) -#define D3DX_NORMALMAP_INVERTSIGN (8 << 16) -#define D3DX_NORMALMAP_COMPUTE_OCCLUSION (16 << 16) - - - - -//---------------------------------------------------------------------------- -// D3DX_CHANNEL flags: -// ------------------- -// These flags are used by functions which operate on or more channels -// in a texture. -// -// D3DX_CHANNEL_RED -// Indicates the red channel should be used -// D3DX_CHANNEL_BLUE -// Indicates the blue channel should be used -// D3DX_CHANNEL_GREEN -// Indicates the green channel should be used -// D3DX_CHANNEL_ALPHA -// Indicates the alpha channel should be used -// D3DX_CHANNEL_LUMINANCE -// Indicates the luminaces of the red green and blue channels should be -// used. -// -//---------------------------------------------------------------------------- - -#define D3DX_CHANNEL_RED (1 << 0) -#define D3DX_CHANNEL_BLUE (1 << 1) -#define D3DX_CHANNEL_GREEN (1 << 2) -#define D3DX_CHANNEL_ALPHA (1 << 3) -#define D3DX_CHANNEL_LUMINANCE (1 << 4) - - - - -//---------------------------------------------------------------------------- -// D3DXIMAGE_FILEFORMAT: -// --------------------- -// This enum is used to describe supported image file formats. -// -//---------------------------------------------------------------------------- - -typedef enum _D3DXIMAGE_FILEFORMAT -{ - D3DXIFF_BMP = 0, - D3DXIFF_JPG = 1, - D3DXIFF_TGA = 2, - D3DXIFF_PNG = 3, - D3DXIFF_DDS = 4, - D3DXIFF_PPM = 5, - D3DXIFF_DIB = 6, - D3DXIFF_FORCE_DWORD = 0x7fffffff - -} D3DXIMAGE_FILEFORMAT; - - -//---------------------------------------------------------------------------- -// LPD3DXFILL2D and LPD3DXFILL3D: -// ------------------------------ -// Function types used by the texture fill functions. -// -// Parameters: -// pOut -// Pointer to a vector which the function uses to return its result. -// X,Y,Z,W will be mapped to R,G,B,A respectivly. -// pTexCoord -// Pointer to a vector containing the coordinates of the texel currently -// being evaluated. Textures and VolumeTexture texcoord components -// range from 0 to 1. CubeTexture texcoord component range from -1 to 1. -// pTexelSize -// Pointer to a vector containing the dimensions of the current texel. -// pData -// Pointer to user data. -// -//---------------------------------------------------------------------------- - -typedef VOID (*LPD3DXFILL2D)(D3DXVECTOR4 *pOut, D3DXVECTOR2 *pTexCoord, D3DXVECTOR2 *pTexelSize, LPVOID pData); -typedef VOID (*LPD3DXFILL3D)(D3DXVECTOR4 *pOut, D3DXVECTOR3 *pTexCoord, D3DXVECTOR3 *pTexelSize, LPVOID pData); - - - -//---------------------------------------------------------------------------- -// D3DXIMAGE_INFO: -// --------------- -// This structure is used to return a rough description of what the -// the original contents of an image file looked like. -// -// Width -// Width of original image in pixels -// Height -// Height of original image in pixels -// Depth -// Depth of original image in pixels -// MipLevels -// Number of mip levels in original image -// Format -// D3D format which most closely describes the data in original image -// ResourceType -// D3DRESOURCETYPE representing the type of texture stored in the file. -// D3DRTYPE_TEXTURE, D3DRTYPE_VOLUMETEXTURE, or D3DRTYPE_CUBETEXTURE. -// ImageFileFormat -// D3DXIMAGE_FILEFORMAT representing the format of the image file. -// -//---------------------------------------------------------------------------- - -typedef struct _D3DXIMAGE_INFO -{ - UINT Width; - UINT Height; - UINT Depth; - UINT MipLevels; - D3DFORMAT Format; - D3DRESOURCETYPE ResourceType; - D3DXIMAGE_FILEFORMAT ImageFileFormat; - -} D3DXIMAGE_INFO; - - - - - -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - - - -////////////////////////////////////////////////////////////////////////////// -// Image File APIs /////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -; -//---------------------------------------------------------------------------- -// GetImageInfoFromFile/Resource: -// ------------------------------ -// Fills in a D3DXIMAGE_INFO struct with information about an image file. -// -// Parameters: -// pSrcFile -// File name of the source image. -// pSrcModule -// Module where resource is located, or NULL for module associated -// with image the os used to create the current process. -// pSrcResource -// Resource name -// pSrcData -// Pointer to file in memory. -// SrcDataSize -// Size in bytes of file in memory. -// pSrcInfo -// Pointer to a D3DXIMAGE_INFO structure to be filled in with the -// description of the data in the source image file. -// -//---------------------------------------------------------------------------- - -HRESULT WINAPI - D3DXGetImageInfoFromFileA( - LPCSTR pSrcFile, - D3DXIMAGE_INFO* pSrcInfo); - -HRESULT WINAPI - D3DXGetImageInfoFromFileW( - LPCWSTR pSrcFile, - D3DXIMAGE_INFO* pSrcInfo); - -#ifdef UNICODE -#define D3DXGetImageInfoFromFile D3DXGetImageInfoFromFileW -#else -#define D3DXGetImageInfoFromFile D3DXGetImageInfoFromFileA -#endif - - -HRESULT WINAPI - D3DXGetImageInfoFromResourceA( - HMODULE hSrcModule, - LPCSTR pSrcResource, - D3DXIMAGE_INFO* pSrcInfo); - -HRESULT WINAPI - D3DXGetImageInfoFromResourceW( - HMODULE hSrcModule, - LPCWSTR pSrcResource, - D3DXIMAGE_INFO* pSrcInfo); - -#ifdef UNICODE -#define D3DXGetImageInfoFromResource D3DXGetImageInfoFromResourceW -#else -#define D3DXGetImageInfoFromResource D3DXGetImageInfoFromResourceA -#endif - - -HRESULT WINAPI - D3DXGetImageInfoFromFileInMemory( - LPCVOID pSrcData, - UINT SrcDataSize, - D3DXIMAGE_INFO* pSrcInfo); - - - - -////////////////////////////////////////////////////////////////////////////// -// Load/Save Surface APIs //////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -//---------------------------------------------------------------------------- -// D3DXLoadSurfaceFromFile/Resource: -// --------------------------------- -// Load surface from a file or resource -// -// Parameters: -// pDestSurface -// Destination surface, which will receive the image. -// pDestPalette -// Destination palette of 256 colors, or NULL -// pDestRect -// Destination rectangle, or NULL for entire surface -// pSrcFile -// File name of the source image. -// pSrcModule -// Module where resource is located, or NULL for module associated -// with image the os used to create the current process. -// pSrcResource -// Resource name -// pSrcData -// Pointer to file in memory. -// SrcDataSize -// Size in bytes of file in memory. -// pSrcRect -// Source rectangle, or NULL for entire image -// Filter -// D3DX_FILTER flags controlling how the image is filtered. -// Or D3DX_DEFAULT for D3DX_FILTER_TRIANGLE. -// ColorKey -// Color to replace with transparent black, or 0 to disable colorkey. -// This is always a 32-bit ARGB color, independent of the source image -// format. Alpha is significant, and should usually be set to FF for -// opaque colorkeys. (ex. Opaque black == 0xff000000) -// pSrcInfo -// Pointer to a D3DXIMAGE_INFO structure to be filled in with the -// description of the data in the source image file, or NULL. -// -//---------------------------------------------------------------------------- - -HRESULT WINAPI - D3DXLoadSurfaceFromFileA( - LPDIRECT3DSURFACE8 pDestSurface, - CONST PALETTEENTRY* pDestPalette, - CONST RECT* pDestRect, - LPCSTR pSrcFile, - CONST RECT* pSrcRect, - DWORD Filter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo); - -HRESULT WINAPI - D3DXLoadSurfaceFromFileW( - LPDIRECT3DSURFACE8 pDestSurface, - CONST PALETTEENTRY* pDestPalette, - CONST RECT* pDestRect, - LPCWSTR pSrcFile, - CONST RECT* pSrcRect, - DWORD Filter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo); - -#ifdef UNICODE -#define D3DXLoadSurfaceFromFile D3DXLoadSurfaceFromFileW -#else -#define D3DXLoadSurfaceFromFile D3DXLoadSurfaceFromFileA -#endif - - - -HRESULT WINAPI - D3DXLoadSurfaceFromResourceA( - LPDIRECT3DSURFACE8 pDestSurface, - CONST PALETTEENTRY* pDestPalette, - CONST RECT* pDestRect, - HMODULE hSrcModule, - LPCSTR pSrcResource, - CONST RECT* pSrcRect, - DWORD Filter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo); - -HRESULT WINAPI - D3DXLoadSurfaceFromResourceW( - LPDIRECT3DSURFACE8 pDestSurface, - CONST PALETTEENTRY* pDestPalette, - CONST RECT* pDestRect, - HMODULE hSrcModule, - LPCWSTR pSrcResource, - CONST RECT* pSrcRect, - DWORD Filter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo); - - -#ifdef UNICODE -#define D3DXLoadSurfaceFromResource D3DXLoadSurfaceFromResourceW -#else -#define D3DXLoadSurfaceFromResource D3DXLoadSurfaceFromResourceA -#endif - - - -HRESULT WINAPI - D3DXLoadSurfaceFromFileInMemory( - LPDIRECT3DSURFACE8 pDestSurface, - CONST PALETTEENTRY* pDestPalette, - CONST RECT* pDestRect, - LPCVOID pSrcData, - UINT SrcDataSize, - CONST RECT* pSrcRect, - DWORD Filter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo); - - - -//---------------------------------------------------------------------------- -// D3DXLoadSurfaceFromSurface: -// --------------------------- -// Load surface from another surface (with color conversion) -// -// Parameters: -// pDestSurface -// Destination surface, which will receive the image. -// pDestPalette -// Destination palette of 256 colors, or NULL -// pDestRect -// Destination rectangle, or NULL for entire surface -// pSrcSurface -// Source surface -// pSrcPalette -// Source palette of 256 colors, or NULL -// pSrcRect -// Source rectangle, or NULL for entire surface -// Filter -// D3DX_FILTER flags controlling how the image is filtered. -// Or D3DX_DEFAULT for D3DX_FILTER_TRIANGLE. -// ColorKey -// Color to replace with transparent black, or 0 to disable colorkey. -// This is always a 32-bit ARGB color, independent of the source image -// format. Alpha is significant, and should usually be set to FF for -// opaque colorkeys. (ex. Opaque black == 0xff000000) -// -//---------------------------------------------------------------------------- - -HRESULT WINAPI - D3DXLoadSurfaceFromSurface( - LPDIRECT3DSURFACE8 pDestSurface, - CONST PALETTEENTRY* pDestPalette, - CONST RECT* pDestRect, - LPDIRECT3DSURFACE8 pSrcSurface, - CONST PALETTEENTRY* pSrcPalette, - CONST RECT* pSrcRect, - DWORD Filter, - D3DCOLOR ColorKey); - - -//---------------------------------------------------------------------------- -// D3DXLoadSurfaceFromMemory: -// -------------------------- -// Load surface from memory. -// -// Parameters: -// pDestSurface -// Destination surface, which will receive the image. -// pDestPalette -// Destination palette of 256 colors, or NULL -// pDestRect -// Destination rectangle, or NULL for entire surface -// pSrcMemory -// Pointer to the top-left corner of the source image in memory -// SrcFormat -// Pixel format of the source image. -// SrcPitch -// Pitch of source image, in bytes. For DXT formats, this number -// should represent the width of one row of cells, in bytes. -// pSrcPalette -// Source palette of 256 colors, or NULL -// pSrcRect -// Source rectangle. -// Filter -// D3DX_FILTER flags controlling how the image is filtered. -// Or D3DX_DEFAULT for D3DX_FILTER_TRIANGLE. -// ColorKey -// Color to replace with transparent black, or 0 to disable colorkey. -// This is always a 32-bit ARGB color, independent of the source image -// format. Alpha is significant, and should usually be set to FF for -// opaque colorkeys. (ex. Opaque black == 0xff000000) -// -//---------------------------------------------------------------------------- - -HRESULT WINAPI - D3DXLoadSurfaceFromMemory( - LPDIRECT3DSURFACE8 pDestSurface, - CONST PALETTEENTRY* pDestPalette, - CONST RECT* pDestRect, - LPCVOID pSrcMemory, - D3DFORMAT SrcFormat, - UINT SrcPitch, - CONST PALETTEENTRY* pSrcPalette, - CONST RECT* pSrcRect, - DWORD Filter, - D3DCOLOR ColorKey); - - -//---------------------------------------------------------------------------- -// D3DXSaveSurfaceToFile: -// ---------------------- -// Save a surface to a image file. -// -// Parameters: -// pDestFile -// File name of the destination file -// DestFormat -// D3DXIMAGE_FILEFORMAT specifying file format to use when saving. -// pSrcSurface -// Source surface, containing the image to be saved -// pSrcPalette -// Source palette of 256 colors, or NULL -// pSrcRect -// Source rectangle, or NULL for the entire image -// -//---------------------------------------------------------------------------- - -HRESULT WINAPI - D3DXSaveSurfaceToFileA( - LPCSTR pDestFile, - D3DXIMAGE_FILEFORMAT DestFormat, - LPDIRECT3DSURFACE8 pSrcSurface, - CONST PALETTEENTRY* pSrcPalette, - CONST RECT* pSrcRect); - -HRESULT WINAPI - D3DXSaveSurfaceToFileW( - LPCWSTR pDestFile, - D3DXIMAGE_FILEFORMAT DestFormat, - LPDIRECT3DSURFACE8 pSrcSurface, - CONST PALETTEENTRY* pSrcPalette, - CONST RECT* pSrcRect); - -#ifdef UNICODE -#define D3DXSaveSurfaceToFile D3DXSaveSurfaceToFileW -#else -#define D3DXSaveSurfaceToFile D3DXSaveSurfaceToFileA -#endif - - - - -////////////////////////////////////////////////////////////////////////////// -// Load/Save Volume APIs ///////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -//---------------------------------------------------------------------------- -// D3DXLoadVolumeFromFile/Resource: -// -------------------------------- -// Load volume from a file or resource -// -// Parameters: -// pDestVolume -// Destination volume, which will receive the image. -// pDestPalette -// Destination palette of 256 colors, or NULL -// pDestBox -// Destination box, or NULL for entire volume -// pSrcFile -// File name of the source image. -// pSrcModule -// Module where resource is located, or NULL for module associated -// with image the os used to create the current process. -// pSrcResource -// Resource name -// pSrcData -// Pointer to file in memory. -// SrcDataSize -// Size in bytes of file in memory. -// pSrcBox -// Source box, or NULL for entire image -// Filter -// D3DX_FILTER flags controlling how the image is filtered. -// Or D3DX_DEFAULT for D3DX_FILTER_TRIANGLE. -// ColorKey -// Color to replace with transparent black, or 0 to disable colorkey. -// This is always a 32-bit ARGB color, independent of the source image -// format. Alpha is significant, and should usually be set to FF for -// opaque colorkeys. (ex. Opaque black == 0xff000000) -// pSrcInfo -// Pointer to a D3DXIMAGE_INFO structure to be filled in with the -// description of the data in the source image file, or NULL. -// -//---------------------------------------------------------------------------- - -HRESULT WINAPI - D3DXLoadVolumeFromFileA( - LPDIRECT3DVOLUME8 pDestVolume, - CONST PALETTEENTRY* pDestPalette, - CONST D3DBOX* pDestBox, - LPCSTR pSrcFile, - CONST D3DBOX* pSrcBox, - DWORD Filter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo); - -HRESULT WINAPI - D3DXLoadVolumeFromFileW( - LPDIRECT3DVOLUME8 pDestVolume, - CONST PALETTEENTRY* pDestPalette, - CONST D3DBOX* pDestBox, - LPCWSTR pSrcFile, - CONST D3DBOX* pSrcBox, - DWORD Filter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo); - -#ifdef UNICODE -#define D3DXLoadVolumeFromFile D3DXLoadVolumeFromFileW -#else -#define D3DXLoadVolumeFromFile D3DXLoadVolumeFromFileA -#endif - - -HRESULT WINAPI - D3DXLoadVolumeFromResourceA( - LPDIRECT3DVOLUME8 pDestVolume, - CONST PALETTEENTRY* pDestPalette, - CONST D3DBOX* pDestBox, - HMODULE hSrcModule, - LPCSTR pSrcResource, - CONST D3DBOX* pSrcBox, - DWORD Filter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo); - -HRESULT WINAPI - D3DXLoadVolumeFromResourceW( - LPDIRECT3DVOLUME8 pDestVolume, - CONST PALETTEENTRY* pDestPalette, - CONST D3DBOX* pDestBox, - HMODULE hSrcModule, - LPCWSTR pSrcResource, - CONST D3DBOX* pSrcBox, - DWORD Filter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo); - -#ifdef UNICODE -#define D3DXLoadVolumeFromResource D3DXLoadVolumeFromResourceW -#else -#define D3DXLoadVolumeFromResource D3DXLoadVolumeFromResourceA -#endif - - - -HRESULT WINAPI - D3DXLoadVolumeFromFileInMemory( - LPDIRECT3DVOLUME8 pDestVolume, - CONST PALETTEENTRY* pDestPalette, - CONST D3DBOX* pDestBox, - LPCVOID pSrcData, - UINT SrcDataSize, - CONST D3DBOX* pSrcBox, - DWORD Filter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo); - - - -//---------------------------------------------------------------------------- -// D3DXLoadVolumeFromVolume: -// ------------------------- -// Load volume from another volume (with color conversion) -// -// Parameters: -// pDestVolume -// Destination volume, which will receive the image. -// pDestPalette -// Destination palette of 256 colors, or NULL -// pDestBox -// Destination box, or NULL for entire volume -// pSrcVolume -// Source volume -// pSrcPalette -// Source palette of 256 colors, or NULL -// pSrcBox -// Source box, or NULL for entire volume -// Filter -// D3DX_FILTER flags controlling how the image is filtered. -// Or D3DX_DEFAULT for D3DX_FILTER_TRIANGLE. -// ColorKey -// Color to replace with transparent black, or 0 to disable colorkey. -// This is always a 32-bit ARGB color, independent of the source image -// format. Alpha is significant, and should usually be set to FF for -// opaque colorkeys. (ex. Opaque black == 0xff000000) -// -//---------------------------------------------------------------------------- - -HRESULT WINAPI - D3DXLoadVolumeFromVolume( - LPDIRECT3DVOLUME8 pDestVolume, - CONST PALETTEENTRY* pDestPalette, - CONST D3DBOX* pDestBox, - LPDIRECT3DVOLUME8 pSrcVolume, - CONST PALETTEENTRY* pSrcPalette, - CONST D3DBOX* pSrcBox, - DWORD Filter, - D3DCOLOR ColorKey); - - - -//---------------------------------------------------------------------------- -// D3DXLoadVolumeFromMemory: -// ------------------------- -// Load volume from memory. -// -// Parameters: -// pDestVolume -// Destination volume, which will receive the image. -// pDestPalette -// Destination palette of 256 colors, or NULL -// pDestBox -// Destination box, or NULL for entire volume -// pSrcMemory -// Pointer to the top-left corner of the source volume in memory -// SrcFormat -// Pixel format of the source volume. -// SrcRowPitch -// Pitch of source image, in bytes. For DXT formats, this number -// should represent the size of one row of cells, in bytes. -// SrcSlicePitch -// Pitch of source image, in bytes. For DXT formats, this number -// should represent the size of one slice of cells, in bytes. -// pSrcPalette -// Source palette of 256 colors, or NULL -// pSrcBox -// Source box. -// Filter -// D3DX_FILTER flags controlling how the image is filtered. -// Or D3DX_DEFAULT for D3DX_FILTER_TRIANGLE. -// ColorKey -// Color to replace with transparent black, or 0 to disable colorkey. -// This is always a 32-bit ARGB color, independent of the source image -// format. Alpha is significant, and should usually be set to FF for -// opaque colorkeys. (ex. Opaque black == 0xff000000) -// -//---------------------------------------------------------------------------- - -HRESULT WINAPI - D3DXLoadVolumeFromMemory( - LPDIRECT3DVOLUME8 pDestVolume, - CONST PALETTEENTRY* pDestPalette, - CONST D3DBOX* pDestBox, - LPCVOID pSrcMemory, - D3DFORMAT SrcFormat, - UINT SrcRowPitch, - UINT SrcSlicePitch, - CONST PALETTEENTRY* pSrcPalette, - CONST D3DBOX* pSrcBox, - DWORD Filter, - D3DCOLOR ColorKey); - - - -//---------------------------------------------------------------------------- -// D3DXSaveVolumeToFile: -// --------------------- -// Save a volume to a image file. -// -// Parameters: -// pDestFile -// File name of the destination file -// DestFormat -// D3DXIMAGE_FILEFORMAT specifying file format to use when saving. -// pSrcVolume -// Source volume, containing the image to be saved -// pSrcPalette -// Source palette of 256 colors, or NULL -// pSrcBox -// Source box, or NULL for the entire volume -// -//---------------------------------------------------------------------------- - -HRESULT WINAPI - D3DXSaveVolumeToFileA( - LPCSTR pDestFile, - D3DXIMAGE_FILEFORMAT DestFormat, - LPDIRECT3DVOLUME8 pSrcVolume, - CONST PALETTEENTRY* pSrcPalette, - CONST D3DBOX* pSrcBox); - -HRESULT WINAPI - D3DXSaveVolumeToFileW( - LPCWSTR pDestFile, - D3DXIMAGE_FILEFORMAT DestFormat, - LPDIRECT3DVOLUME8 pSrcVolume, - CONST PALETTEENTRY* pSrcPalette, - CONST D3DBOX* pSrcBox); - -#ifdef UNICODE -#define D3DXSaveVolumeToFile D3DXSaveVolumeToFileW -#else -#define D3DXSaveVolumeToFile D3DXSaveVolumeToFileA -#endif - - - - -////////////////////////////////////////////////////////////////////////////// -// Create/Save Texture APIs ////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -//---------------------------------------------------------------------------- -// D3DXCheckTextureRequirements: -// ----------------------------- -// Checks texture creation parameters. If parameters are invalid, this -// function returns corrected parameters. -// -// Parameters: -// -// pDevice -// The D3D device to be used -// pWidth, pHeight, pDepth, pSize -// Desired size in pixels, or NULL. Returns corrected size. -// pNumMipLevels -// Number of desired mipmap levels, or NULL. Returns corrected number. -// Usage -// Texture usage flags -// pFormat -// Desired pixel format, or NULL. Returns corrected format. -// Pool -// Memory pool to be used to create texture -// -//---------------------------------------------------------------------------- - -HRESULT WINAPI - D3DXCheckTextureRequirements( - LPDIRECT3DDEVICE8 pDevice, - UINT* pWidth, - UINT* pHeight, - UINT* pNumMipLevels, - DWORD Usage, - D3DFORMAT* pFormat, - D3DPOOL Pool); - -HRESULT WINAPI - D3DXCheckCubeTextureRequirements( - LPDIRECT3DDEVICE8 pDevice, - UINT* pSize, - UINT* pNumMipLevels, - DWORD Usage, - D3DFORMAT* pFormat, - D3DPOOL Pool); - -HRESULT WINAPI - D3DXCheckVolumeTextureRequirements( - LPDIRECT3DDEVICE8 pDevice, - UINT* pWidth, - UINT* pHeight, - UINT* pDepth, - UINT* pNumMipLevels, - DWORD Usage, - D3DFORMAT* pFormat, - D3DPOOL Pool); - - -//---------------------------------------------------------------------------- -// D3DXCreateTexture: -// ------------------ -// Create an empty texture -// -// Parameters: -// -// pDevice -// The D3D device with which the texture is going to be used. -// Width, Height, Depth, Size -// size in pixels; these must be non-zero -// MipLevels -// number of mip levels desired; if zero or D3DX_DEFAULT, a complete -// mipmap chain will be created. -// Usage -// Texture usage flags -// Format -// Pixel format. -// Pool -// Memory pool to be used to create texture -// ppTexture, ppCubeTexture, ppVolumeTexture -// The texture object that will be created -// -//---------------------------------------------------------------------------- - -HRESULT WINAPI - D3DXCreateTexture( - LPDIRECT3DDEVICE8 pDevice, - UINT Width, - UINT Height, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - LPDIRECT3DTEXTURE8* ppTexture); - -HRESULT WINAPI - D3DXCreateCubeTexture( - LPDIRECT3DDEVICE8 pDevice, - UINT Size, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - LPDIRECT3DCUBETEXTURE8* ppCubeTexture); - -HRESULT WINAPI - D3DXCreateVolumeTexture( - LPDIRECT3DDEVICE8 pDevice, - UINT Width, - UINT Height, - UINT Depth, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - LPDIRECT3DVOLUMETEXTURE8* ppVolumeTexture); - - - -//---------------------------------------------------------------------------- -// D3DXCreateTextureFromFile/Resource: -// ----------------------------------- -// Create a texture object from a file or resource. -// -// Parameters: -// -// pDevice -// The D3D device with which the texture is going to be used. -// pSrcFile -// File name. -// hSrcModule -// Module handle. if NULL, current module will be used. -// pSrcResource -// Resource name in module -// pvSrcData -// Pointer to file in memory. -// SrcDataSize -// Size in bytes of file in memory. -// Width, Height, Depth, Size -// Size in pixels; if zero or D3DX_DEFAULT, the size will be taken -// from the file. -// MipLevels -// Number of mip levels; if zero or D3DX_DEFAULT, a complete mipmap -// chain will be created. -// Usage -// Texture usage flags -// Format -// Desired pixel format. If D3DFMT_UNKNOWN, the format will be -// taken from the file. -// Pool -// Memory pool to be used to create texture -// Filter -// D3DX_FILTER flags controlling how the image is filtered. -// Or D3DX_DEFAULT for D3DX_FILTER_TRIANGLE. -// MipFilter -// D3DX_FILTER flags controlling how each miplevel is filtered. -// Or D3DX_DEFAULT for D3DX_FILTER_BOX, -// ColorKey -// Color to replace with transparent black, or 0 to disable colorkey. -// This is always a 32-bit ARGB color, independent of the source image -// format. Alpha is significant, and should usually be set to FF for -// opaque colorkeys. (ex. Opaque black == 0xff000000) -// pSrcInfo -// Pointer to a D3DXIMAGE_INFO structure to be filled in with the -// description of the data in the source image file, or NULL. -// pPalette -// 256 color palette to be filled in, or NULL -// ppTexture, ppCubeTexture, ppVolumeTexture -// The texture object that will be created -// -//---------------------------------------------------------------------------- - - -// FromFile - -HRESULT WINAPI - D3DXCreateTextureFromFileA( - LPDIRECT3DDEVICE8 pDevice, - LPCSTR pSrcFile, - LPDIRECT3DTEXTURE8* ppTexture); - -HRESULT WINAPI - D3DXCreateTextureFromFileW( - LPDIRECT3DDEVICE8 pDevice, - LPCWSTR pSrcFile, - LPDIRECT3DTEXTURE8* ppTexture); - -#ifdef UNICODE -#define D3DXCreateTextureFromFile D3DXCreateTextureFromFileW -#else -#define D3DXCreateTextureFromFile D3DXCreateTextureFromFileA -#endif - - -HRESULT WINAPI - D3DXCreateCubeTextureFromFileA( - LPDIRECT3DDEVICE8 pDevice, - LPCSTR pSrcFile, - LPDIRECT3DCUBETEXTURE8* ppCubeTexture); - -HRESULT WINAPI - D3DXCreateCubeTextureFromFileW( - LPDIRECT3DDEVICE8 pDevice, - LPCWSTR pSrcFile, - LPDIRECT3DCUBETEXTURE8* ppCubeTexture); - -#ifdef UNICODE -#define D3DXCreateCubeTextureFromFile D3DXCreateCubeTextureFromFileW -#else -#define D3DXCreateCubeTextureFromFile D3DXCreateCubeTextureFromFileA -#endif - - -HRESULT WINAPI - D3DXCreateVolumeTextureFromFileA( - LPDIRECT3DDEVICE8 pDevice, - LPCSTR pSrcFile, - LPDIRECT3DVOLUMETEXTURE8* ppVolumeTexture); - -HRESULT WINAPI - D3DXCreateVolumeTextureFromFileW( - LPDIRECT3DDEVICE8 pDevice, - LPCWSTR pSrcFile, - LPDIRECT3DVOLUMETEXTURE8* ppVolumeTexture); - -#ifdef UNICODE -#define D3DXCreateVolumeTextureFromFile D3DXCreateVolumeTextureFromFileW -#else -#define D3DXCreateVolumeTextureFromFile D3DXCreateVolumeTextureFromFileA -#endif - - -// FromResource - -HRESULT WINAPI - D3DXCreateTextureFromResourceA( - LPDIRECT3DDEVICE8 pDevice, - HMODULE hSrcModule, - LPCSTR pSrcResource, - LPDIRECT3DTEXTURE8* ppTexture); - -HRESULT WINAPI - D3DXCreateTextureFromResourceW( - LPDIRECT3DDEVICE8 pDevice, - HMODULE hSrcModule, - LPCWSTR pSrcResource, - LPDIRECT3DTEXTURE8* ppTexture); - -#ifdef UNICODE -#define D3DXCreateTextureFromResource D3DXCreateTextureFromResourceW -#else -#define D3DXCreateTextureFromResource D3DXCreateTextureFromResourceA -#endif - - -HRESULT WINAPI - D3DXCreateCubeTextureFromResourceA( - LPDIRECT3DDEVICE8 pDevice, - HMODULE hSrcModule, - LPCSTR pSrcResource, - LPDIRECT3DCUBETEXTURE8* ppCubeTexture); - -HRESULT WINAPI - D3DXCreateCubeTextureFromResourceW( - LPDIRECT3DDEVICE8 pDevice, - HMODULE hSrcModule, - LPCWSTR pSrcResource, - LPDIRECT3DCUBETEXTURE8* ppCubeTexture); - -#ifdef UNICODE -#define D3DXCreateCubeTextureFromResource D3DXCreateCubeTextureFromResourceW -#else -#define D3DXCreateCubeTextureFromResource D3DXCreateCubeTextureFromResourceA -#endif - - -HRESULT WINAPI - D3DXCreateVolumeTextureFromResourceA( - LPDIRECT3DDEVICE8 pDevice, - HMODULE hSrcModule, - LPCSTR pSrcResource, - LPDIRECT3DVOLUMETEXTURE8* ppVolumeTexture); - -HRESULT WINAPI - D3DXCreateVolumeTextureFromResourceW( - LPDIRECT3DDEVICE8 pDevice, - HMODULE hSrcModule, - LPCWSTR pSrcResource, - LPDIRECT3DVOLUMETEXTURE8* ppVolumeTexture); - -#ifdef UNICODE -#define D3DXCreateVolumeTextureFromResource D3DXCreateVolumeTextureFromResourceW -#else -#define D3DXCreateVolumeTextureFromResource D3DXCreateVolumeTextureFromResourceA -#endif - - -// FromFileEx - -HRESULT WINAPI - D3DXCreateTextureFromFileExA( - LPDIRECT3DDEVICE8 pDevice, - LPCSTR pSrcFile, - UINT Width, - UINT Height, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - DWORD Filter, - DWORD MipFilter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo, - PALETTEENTRY* pPalette, - LPDIRECT3DTEXTURE8* ppTexture); - -HRESULT WINAPI - D3DXCreateTextureFromFileExW( - LPDIRECT3DDEVICE8 pDevice, - LPCWSTR pSrcFile, - UINT Width, - UINT Height, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - DWORD Filter, - DWORD MipFilter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo, - PALETTEENTRY* pPalette, - LPDIRECT3DTEXTURE8* ppTexture); - -#ifdef UNICODE -#define D3DXCreateTextureFromFileEx D3DXCreateTextureFromFileExW -#else -#define D3DXCreateTextureFromFileEx D3DXCreateTextureFromFileExA -#endif - - -HRESULT WINAPI - D3DXCreateCubeTextureFromFileExA( - LPDIRECT3DDEVICE8 pDevice, - LPCSTR pSrcFile, - UINT Size, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - DWORD Filter, - DWORD MipFilter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo, - PALETTEENTRY* pPalette, - LPDIRECT3DCUBETEXTURE8* ppCubeTexture); - -HRESULT WINAPI - D3DXCreateCubeTextureFromFileExW( - LPDIRECT3DDEVICE8 pDevice, - LPCWSTR pSrcFile, - UINT Size, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - DWORD Filter, - DWORD MipFilter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo, - PALETTEENTRY* pPalette, - LPDIRECT3DCUBETEXTURE8* ppCubeTexture); - -#ifdef UNICODE -#define D3DXCreateCubeTextureFromFileEx D3DXCreateCubeTextureFromFileExW -#else -#define D3DXCreateCubeTextureFromFileEx D3DXCreateCubeTextureFromFileExA -#endif - - -HRESULT WINAPI - D3DXCreateVolumeTextureFromFileExA( - LPDIRECT3DDEVICE8 pDevice, - LPCSTR pSrcFile, - UINT Width, - UINT Height, - UINT Depth, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - DWORD Filter, - DWORD MipFilter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo, - PALETTEENTRY* pPalette, - LPDIRECT3DVOLUMETEXTURE8* ppVolumeTexture); - -HRESULT WINAPI - D3DXCreateVolumeTextureFromFileExW( - LPDIRECT3DDEVICE8 pDevice, - LPCWSTR pSrcFile, - UINT Width, - UINT Height, - UINT Depth, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - DWORD Filter, - DWORD MipFilter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo, - PALETTEENTRY* pPalette, - LPDIRECT3DVOLUMETEXTURE8* ppVolumeTexture); - -#ifdef UNICODE -#define D3DXCreateVolumeTextureFromFileEx D3DXCreateVolumeTextureFromFileExW -#else -#define D3DXCreateVolumeTextureFromFileEx D3DXCreateVolumeTextureFromFileExA -#endif - - -// FromResourceEx - -HRESULT WINAPI - D3DXCreateTextureFromResourceExA( - LPDIRECT3DDEVICE8 pDevice, - HMODULE hSrcModule, - LPCSTR pSrcResource, - UINT Width, - UINT Height, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - DWORD Filter, - DWORD MipFilter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo, - PALETTEENTRY* pPalette, - LPDIRECT3DTEXTURE8* ppTexture); - -HRESULT WINAPI - D3DXCreateTextureFromResourceExW( - LPDIRECT3DDEVICE8 pDevice, - HMODULE hSrcModule, - LPCWSTR pSrcResource, - UINT Width, - UINT Height, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - DWORD Filter, - DWORD MipFilter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo, - PALETTEENTRY* pPalette, - LPDIRECT3DTEXTURE8* ppTexture); - -#ifdef UNICODE -#define D3DXCreateTextureFromResourceEx D3DXCreateTextureFromResourceExW -#else -#define D3DXCreateTextureFromResourceEx D3DXCreateTextureFromResourceExA -#endif - - -HRESULT WINAPI - D3DXCreateCubeTextureFromResourceExA( - LPDIRECT3DDEVICE8 pDevice, - HMODULE hSrcModule, - LPCSTR pSrcResource, - UINT Size, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - DWORD Filter, - DWORD MipFilter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo, - PALETTEENTRY* pPalette, - LPDIRECT3DCUBETEXTURE8* ppCubeTexture); - -HRESULT WINAPI - D3DXCreateCubeTextureFromResourceExW( - LPDIRECT3DDEVICE8 pDevice, - HMODULE hSrcModule, - LPCWSTR pSrcResource, - UINT Size, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - DWORD Filter, - DWORD MipFilter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo, - PALETTEENTRY* pPalette, - LPDIRECT3DCUBETEXTURE8* ppCubeTexture); - -#ifdef UNICODE -#define D3DXCreateCubeTextureFromResourceEx D3DXCreateCubeTextureFromResourceExW -#else -#define D3DXCreateCubeTextureFromResourceEx D3DXCreateCubeTextureFromResourceExA -#endif - - -HRESULT WINAPI - D3DXCreateVolumeTextureFromResourceExA( - LPDIRECT3DDEVICE8 pDevice, - HMODULE hSrcModule, - LPCSTR pSrcResource, - UINT Width, - UINT Height, - UINT Depth, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - DWORD Filter, - DWORD MipFilter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo, - PALETTEENTRY* pPalette, - LPDIRECT3DVOLUMETEXTURE8* ppVolumeTexture); - -HRESULT WINAPI - D3DXCreateVolumeTextureFromResourceExW( - LPDIRECT3DDEVICE8 pDevice, - HMODULE hSrcModule, - LPCWSTR pSrcResource, - UINT Width, - UINT Height, - UINT Depth, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - DWORD Filter, - DWORD MipFilter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo, - PALETTEENTRY* pPalette, - LPDIRECT3DVOLUMETEXTURE8* ppVolumeTexture); - -#ifdef UNICODE -#define D3DXCreateVolumeTextureFromResourceEx D3DXCreateVolumeTextureFromResourceExW -#else -#define D3DXCreateVolumeTextureFromResourceEx D3DXCreateVolumeTextureFromResourceExA -#endif - - -// FromFileInMemory - -HRESULT WINAPI - D3DXCreateTextureFromFileInMemory( - LPDIRECT3DDEVICE8 pDevice, - LPCVOID pSrcData, - UINT SrcDataSize, - LPDIRECT3DTEXTURE8* ppTexture); - -HRESULT WINAPI - D3DXCreateCubeTextureFromFileInMemory( - LPDIRECT3DDEVICE8 pDevice, - LPCVOID pSrcData, - UINT SrcDataSize, - LPDIRECT3DCUBETEXTURE8* ppCubeTexture); - -HRESULT WINAPI - D3DXCreateVolumeTextureFromFileInMemory( - LPDIRECT3DDEVICE8 pDevice, - LPCVOID pSrcData, - UINT SrcDataSize, - LPDIRECT3DVOLUMETEXTURE8* ppVolumeTexture); - - -// FromFileInMemoryEx - -HRESULT WINAPI - D3DXCreateTextureFromFileInMemoryEx( - LPDIRECT3DDEVICE8 pDevice, - LPCVOID pSrcData, - UINT SrcDataSize, - UINT Width, - UINT Height, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - DWORD Filter, - DWORD MipFilter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo, - PALETTEENTRY* pPalette, - LPDIRECT3DTEXTURE8* ppTexture); - -HRESULT WINAPI - D3DXCreateCubeTextureFromFileInMemoryEx( - LPDIRECT3DDEVICE8 pDevice, - LPCVOID pSrcData, - UINT SrcDataSize, - UINT Size, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - DWORD Filter, - DWORD MipFilter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo, - PALETTEENTRY* pPalette, - LPDIRECT3DCUBETEXTURE8* ppCubeTexture); - -HRESULT WINAPI - D3DXCreateVolumeTextureFromFileInMemoryEx( - LPDIRECT3DDEVICE8 pDevice, - LPCVOID pSrcData, - UINT SrcDataSize, - UINT Width, - UINT Height, - UINT Depth, - UINT MipLevels, - DWORD Usage, - D3DFORMAT Format, - D3DPOOL Pool, - DWORD Filter, - DWORD MipFilter, - D3DCOLOR ColorKey, - D3DXIMAGE_INFO* pSrcInfo, - PALETTEENTRY* pPalette, - LPDIRECT3DVOLUMETEXTURE8* ppVolumeTexture); - - - -//---------------------------------------------------------------------------- -// D3DXSaveTextureToFile: -// ---------------------- -// Save a texture to a file. -// -// Parameters: -// pDestFile -// File name of the destination file -// DestFormat -// D3DXIMAGE_FILEFORMAT specifying file format to use when saving. -// pSrcTexture -// Source texture, containing the image to be saved -// pSrcPalette -// Source palette of 256 colors, or NULL -// -//---------------------------------------------------------------------------- - - -HRESULT WINAPI - D3DXSaveTextureToFileA( - LPCSTR pDestFile, - D3DXIMAGE_FILEFORMAT DestFormat, - LPDIRECT3DBASETEXTURE8 pSrcTexture, - CONST PALETTEENTRY* pSrcPalette); - -HRESULT WINAPI - D3DXSaveTextureToFileW( - LPCWSTR pDestFile, - D3DXIMAGE_FILEFORMAT DestFormat, - LPDIRECT3DBASETEXTURE8 pSrcTexture, - CONST PALETTEENTRY* pSrcPalette); - -#ifdef UNICODE -#define D3DXSaveTextureToFile D3DXSaveTextureToFileW -#else -#define D3DXSaveTextureToFile D3DXSaveTextureToFileA -#endif - - - - -////////////////////////////////////////////////////////////////////////////// -// Misc Texture APIs ///////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -//---------------------------------------------------------------------------- -// D3DXFilterTexture: -// ------------------ -// Filters mipmaps levels of a texture. -// -// Parameters: -// pBaseTexture -// The texture object to be filtered -// pPalette -// 256 color palette to be used, or NULL for non-palettized formats -// SrcLevel -// The level whose image is used to generate the subsequent levels. -// Filter -// D3DX_FILTER flags controlling how each miplevel is filtered. -// Or D3DX_DEFAULT for D3DX_FILTER_BOX, -// -//---------------------------------------------------------------------------- - -HRESULT WINAPI - D3DXFilterTexture( - LPDIRECT3DBASETEXTURE8 pBaseTexture, - CONST PALETTEENTRY* pPalette, - UINT SrcLevel, - DWORD Filter); - -#define D3DXFilterCubeTexture D3DXFilterTexture -#define D3DXFilterVolumeTexture D3DXFilterTexture - - - -//---------------------------------------------------------------------------- -// D3DXFillTexture: -// ---------------- -// Uses a user provided function to fill each texel of each mip level of a -// given texture. -// -// Paramters: -// pTexture, pCubeTexture, pVolumeTexture -// Pointer to the texture to be filled. -// pFunction -// Pointer to user provided evalutor function which will be used to -// compute the value of each texel. -// pData -// Pointer to an arbitrary block of user defined data. This pointer -// will be passed to the function provided in pFunction -//----------------------------------------------------------------------------- - -HRESULT WINAPI - D3DXFillTexture( - LPDIRECT3DTEXTURE8 pTexture, - LPD3DXFILL2D pFunction, - LPVOID pData); - -HRESULT WINAPI - D3DXFillCubeTexture( - LPDIRECT3DCUBETEXTURE8 pCubeTexture, - LPD3DXFILL3D pFunction, - LPVOID pData); - -HRESULT WINAPI - D3DXFillVolumeTexture( - LPDIRECT3DVOLUMETEXTURE8 pVolumeTexture, - LPD3DXFILL3D pFunction, - LPVOID pData); - - - -//---------------------------------------------------------------------------- -// D3DXComputeNormalMap: -// --------------------- -// Converts a height map into a normal map. The (x,y,z) components of each -// normal are mapped to the (r,g,b) channels of the output texture. -// -// Parameters -// pTexture -// Pointer to the destination texture -// pSrcTexture -// Pointer to the source heightmap texture -// pSrcPalette -// Source palette of 256 colors, or NULL -// Flags -// D3DX_NORMALMAP flags -// Channel -// D3DX_CHANNEL specifying source of height information -// Amplitude -// The constant value which the height information is multiplied by. -//--------------------------------------------------------------------------- - -HRESULT WINAPI - D3DXComputeNormalMap( - LPDIRECT3DTEXTURE8 pTexture, - LPDIRECT3DTEXTURE8 pSrcTexture, - CONST PALETTEENTRY* pSrcPalette, - DWORD Flags, - DWORD Channel, - FLOAT Amplitude); - - - - -#ifdef __cplusplus -} -#endif //__cplusplus - -#endif //__D3DX8TEX_H__ diff --git a/import/DirectX8/include/d3dxcore.h b/import/DirectX8/include/d3dxcore.h deleted file mode 100644 index da1e9893f..000000000 --- a/import/DirectX8/include/d3dxcore.h +++ /dev/null @@ -1,1027 +0,0 @@ -/////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) Microsoft Corporation. All Rights Reserved. -// -// File: d3dxcore.h -// Content: D3DX core types and functions -// -/////////////////////////////////////////////////////////////////////////// - -#ifndef __D3DXCORE_H__ -#define __D3DXCORE_H__ - -#include -#include -#include "d3dxerr.h" - - -typedef struct ID3DXContext *LPD3DXCONTEXT; - -// {9B74ED7A-BBEF-11d2-9F8E-0000F8080835} -DEFINE_GUID(IID_ID3DXContext, - 0x9b74ed7a, 0xbbef, 0x11d2, 0x9f, 0x8e, 0x0, 0x0, 0xf8, 0x8, 0x8, 0x35); - - -/////////////////////////////////////////////////////////////////////////// -// Defines and Enumerators used below: -/////////////////////////////////////////////////////////////////////////// - -//------------------------------------------------------------------------- -// D3DX_DEFAULT: -// --------- -// A predefined value that could be used for any parameter in D3DX APIs or -// member functions that is an enumerant or a handle. The D3DX -// documentation indicates wherever D3DX_DEFAULT may be used, -// and how it will be interpreted in each situation. -//------------------------------------------------------------------------- -#define D3DX_DEFAULT ULONG_MAX - -//------------------------------------------------------------------------- -// D3DX_DEFAULT_FLOAT: -// ------------------ -// Similar to D3DX_DEFAULT, but used for floating point parameters. -// The D3DX documentation indicates wherever D3DX_DEFAULT_FLOAT may be used, -// and how it will be interpreted in each situation. -//------------------------------------------------------------------------- -#define D3DX_DEFAULT_FLOAT FLT_MAX - -//------------------------------------------------------------------------- -// Hardware Acceleration Level: -// --------------------------- -// These constants represent pre-defined hardware acceleration levels, -// and may be used as a default anywhere a (DWORD) deviceIndex is required. -// Each pre-define indicates a different level of hardware acceleration. -// They are an alternative to using explicit deviceIndices retrieved by -// D3DXGetDeviceDescription(). -// -// The only case these pre-defines should be used as device indices is if -// a particular level of acceleration is required, and given more than -// one capable device on the computer, it does not matter which one -// is used. -// -// The method of selection is as follows: If one of the D3DX devices on -// the primary DDraw device supports a requested hardware acceleration -// level, it will be used. Otherwise, the first matching device discovered -// by D3DX will be used. -// -// Of course, it is possible for no match to exist for any of the -// pre-defines on a particular computer. Passing such a value into the -// D3DX apis will simply cause them to fail, reporting that no match -// is available. -// -// D3DX_HWLEVEL_NULL: Null implementation (draws nothing) -// D3DX_HWLEVEL_REFERENCE: Reference implementation (slowest) -// D3DX_HWLEVEL_2D: 2D acceleration only (RGB rasterizer used) -// D3DX_HWLEVEL_RASTER: Rasterization acceleration (likely most useful) -// D3DX_HWLEVEL_TL: Transform and lighting acceleration -// D3DX_DEFAULT: The highest level of acceleration available -// on the primary DDraw device. -//------------------------------------------------------------------------- -#define D3DX_HWLEVEL_NULL (D3DX_DEFAULT - 1) -#define D3DX_HWLEVEL_REFERENCE (D3DX_DEFAULT - 2) -#define D3DX_HWLEVEL_2D (D3DX_DEFAULT - 3) -#define D3DX_HWLEVEL_RASTER (D3DX_DEFAULT - 4) -#define D3DX_HWLEVEL_TL (D3DX_DEFAULT - 5) - -//------------------------------------------------------------------------- -// Surface Class: -// ------------- -// These are the various types of 2D-surfaces classified according to their -// usage. Note that a number of them overlap. e.g. STENCILBUFFERS and -// DEPTHBUFFERS overlap (since in DX7 implementation the stencil and depth -// bits are part of the same pixel format). -// -// Mapping to the DX7 DDPIXELFORMAT concepts: -// ----------------------------------------- -// D3DX_SC_DEPTHBUFFER: All ddpfs which have the DDPF_ZPIXELS or the -// DDPF_ZBUFFER flags set. -// D3DX_SC_STENCILBUFFER: All ddpfs which have the DDPF_STENCILBUFFER -// flag set. -// D3DX_SC_BUMPMAP: All ddpfs which have the DDPF_BUMPLUMINANCE -// or the DDPF_BUMPDUDV flags set. -// D3DX_SC_LUMINANCEMAP: All ddpfs which have the DDPF_BUMPLUMINANCE -// or the DDPF_LUMINANCE flags set. -// D3DX_SC_COLORTEXTURE: All the surfaces that have color information in -// them and can be used for texturing. -// D3DX_SC_COLORRENDERTGT: All the surfaces that contain color -// information and can be used as render targets. -//------------------------------------------------------------------------- -#define D3DX_SC_DEPTHBUFFER 0x01 -#define D3DX_SC_STENCILBUFFER 0x02 -#define D3DX_SC_COLORTEXTURE 0x04 -#define D3DX_SC_BUMPMAP 0x08 -#define D3DX_SC_LUMINANCEMAP 0x10 -#define D3DX_SC_COLORRENDERTGT 0x20 - -//------------------------------------------------------------------------- -// Surface Formats: -// --------------- -// These are the various types of surface formats that can be enumerated, -// there is no DDPIXELFORMAT structure in D3DX, the enums carry the meaning -// (like FOURCCs). -// -// All the surface classes are represented here. -// -//------------------------------------------------------------------------- -typedef enum _D3DX_SURFACEFORMAT -{ - D3DX_SF_UNKNOWN = 0, - D3DX_SF_R8G8B8 = 1, - D3DX_SF_A8R8G8B8 = 2, - D3DX_SF_X8R8G8B8 = 3, - D3DX_SF_R5G6B5 = 4, - D3DX_SF_R5G5B5 = 5, - D3DX_SF_PALETTE4 = 6, - D3DX_SF_PALETTE8 = 7, - D3DX_SF_A1R5G5B5 = 8, - D3DX_SF_X4R4G4B4 = 9, - D3DX_SF_A4R4G4B4 =10, - D3DX_SF_L8 =11, // 8 bit luminance-only - D3DX_SF_A8L8 =12, // 16 bit alpha-luminance - D3DX_SF_U8V8 =13, // 16 bit bump map format - D3DX_SF_U5V5L6 =14, // 16 bit bump map format with luminance - D3DX_SF_U8V8L8 =15, // 24 bit bump map format with luminance - D3DX_SF_UYVY =16, // UYVY format (PC98 compliance) - D3DX_SF_YUY2 =17, // YUY2 format (PC98 compliance) - D3DX_SF_DXT1 =18, // S3 texture compression technique 1 - D3DX_SF_DXT3 =19, // S3 texture compression technique 3 - D3DX_SF_DXT5 =20, // S3 texture compression technique 5 - D3DX_SF_R3G3B2 =21, // 8 bit RGB texture format - D3DX_SF_A8 =22, // 8 bit alpha-only - D3DX_SF_TEXTUREMAX =23, // Last texture format - - D3DX_SF_Z16S0 =256, - D3DX_SF_Z32S0 =257, - D3DX_SF_Z15S1 =258, - D3DX_SF_Z24S8 =259, - D3DX_SF_S1Z15 =260, - D3DX_SF_S8Z24 =261, - D3DX_SF_DEPTHMAX =262, // Last depth format - - D3DX_SF_FORCEMAX = (DWORD)(-1) -} D3DX_SURFACEFORMAT; - -//------------------------------------------------------------------------- -// Filtering types for Texture APIs -// -// ------------- -// These are the various filter types for generation of mip-maps -// -// D3DX_FILTERTYPE -// ----------------------------------------- -// D3DX_FT_POINT: Point sampling only - no filtering -// D3DX_FT_LINEAR: Bi-linear filtering -// -//------------------------------------------------------------------------- -typedef enum _D3DX_FILTERTYPE -{ - D3DX_FT_POINT = 0x01, - D3DX_FT_LINEAR = 0x02, - D3DX_FT_DEFAULT = D3DX_DEFAULT -} D3DX_FILTERTYPE; - -/////////////////////////////////////////////////////////////////////////// -// Structures used below: -/////////////////////////////////////////////////////////////////////////// - -//------------------------------------------------------------------------- -// D3DX_VIDMODEDESC: Display mode description. -// ---------------- -// width: Screen Width -// height: Screen Height -// bpp: Bits per pixel -// refreshRate: Refresh rate -//------------------------------------------------------------------------- -typedef struct _D3DX_VIDMODEDESC -{ - DWORD width; - DWORD height; - DWORD bpp; - DWORD refreshRate; -} D3DX_VIDMODEDESC; - -//------------------------------------------------------------------------- -// D3DX_DEVICEDESC: Description of a device that can do 3D -// --------------- -// deviceIndex: Unique (DWORD) number for the device. -// hwLevel: Level of acceleration afforded. This is one of the -// predefined Device Indices, and exists in this -// structure for informational purposes only. More than -// one device on the system may have the same hwLevel. -// To refer to a particular device with the D3DX apis, -// use the value in the deviceIndex member instead. -// ddGuid: The ddraw GUID -// d3dDeviceGuid: Direct3D Device GUID -// ddDeviceID: DDraw's GetDeviceIdentifier GUID. This GUID is unique to -// a particular driver revision on a particular video card. -// driverDesc: String describing the driver -// monitor: Handle to the video monitor used by this device (multimon -// specific). Devices that use different monitors on a -// multimon system report different values in this field. -// Therefore, to test for a multimon system, an application -// should look for more than one different monitor handle in -// the list of D3DX devices. -// onPrimary: Indicates if this device is on the primary monitor -// (multimon specific). -//------------------------------------------------------------------------- -#define D3DX_DRIVERDESC_LENGTH 256 - -typedef struct _D3DX_DEVICEDESC -{ - DWORD deviceIndex; - DWORD hwLevel; - GUID ddGuid; - GUID d3dDeviceGuid; - GUID ddDeviceID; - char driverDesc[D3DX_DRIVERDESC_LENGTH]; - HMONITOR monitor; - BOOL onPrimary; -} D3DX_DEVICEDESC; - -/////////////////////////////////////////////////////////////////////////// -// APIs: -/////////////////////////////////////////////////////////////////////////// -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - -//------------------------------------------------------------------------- -// D3DXInitialize: The very first call a D3DX app must make. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXInitialize(); - -//------------------------------------------------------------------------- -// D3DXUninitialize: The very last call a D3DX app must make. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXUninitialize(); - -//------------------------------------------------------------------------- -// D3DXGetDeviceCount: Returns the maximum number of D3DXdevices -// ------------------ available. -// -// D3DXGetDeviceDescription: Lists the 2D and 3D capabilities of the devices. -// ------------------------ Also, the various guids needed by ddraw and d3d. -// -// Params: -// [in] DWORD deviceIndex: Which device? Starts at 0. -// [in] D3DX_DEVICEDESC* pd3dxDevice: Pointer to the D3DX_DEVICEDESC -// structure to be filled in. -//------------------------------------------------------------------------- -DWORD WINAPI - D3DXGetDeviceCount(); - -HRESULT WINAPI - D3DXGetDeviceDescription(DWORD deviceIndex, - D3DX_DEVICEDESC* pd3dxDeviceDesc); - -//------------------------------------------------------------------------- -// D3DXGetMaxNumVideoModes: Returns the maximum number of video-modes . -// ----------------------- -// -// Params: -// [in] DWORD deviceIndex: The device being referred to. -// [in] DWORD flags: If D3DX_GVM_REFRESHRATE is set, then the refresh -// rates are not ignored. -// -// D3DXGetVideoMode: Describes a particular video mode for this device -// ---------------- -// -// Note: These queries will simply give you a list of modes that the -// display adapter tells DirectX that it supports. -// There is no guarantee that D3DXCreateContext(Ex) will succeed -// with all listed video modes. This is a fundamental limitation -// of the current DirectX architecture which D3DX cannot hide in -// any clean way. -// -// Params: -// [in] DWORD deviceIndex: The device being referred to. -// [in] DWORD flags: If D3DX_GVM_REFRESHRATE is set, then the refresh -// rates are returned -// [in] DWORD which: Which VideoMode ? Starts at 0. -// [out] D3DX_VIDMODEDESC* pModeList: Pointer to the D3DX_VIDMODEDESC -// structure that will be filled in. -//------------------------------------------------------------------------- -DWORD WINAPI - D3DXGetMaxNumVideoModes(DWORD deviceIndex, - DWORD flags); - -HRESULT WINAPI - D3DXGetVideoMode(DWORD deviceIndex, - DWORD flags, - DWORD modeIndex, - D3DX_VIDMODEDESC* pModeDesc); - -#define D3DX_GVM_REFRESHRATE 0x00000001 -//------------------------------------------------------------------------- -// D3DXGetMaxSurfaceFormats: Returns the maximum number of surface -// ------------------------ formats supported by the device at that -// video mode. -// -// D3DXGetSurfaceFormat: Describes one of the supported surface formats. -// --------------------- -// -// Params: -// [in] DWORD deviceIndex: The device being referred to. -// [in] D3DX_VIDMODEDESC* pDesc: The display mode at which the supported -// surface formats are requested. If it is -// NULL, the current display mode is -// assumed. -// [in] DWORD surfClassFlags: Required surface classes. Only surface -// formats which support all specified -// surface classes will be returned. -// (Multiple surface classes may be specified -// using bitwise OR.) -// [in] DWORD which: Which surface formats to retrieve. Starts at 0. -// [out] D3DX_SURFACEFORMAT* pFormat: The surface format -//------------------------------------------------------------------------- -DWORD WINAPI - D3DXGetMaxSurfaceFormats(DWORD deviceIndex, - D3DX_VIDMODEDESC* pDesc, - DWORD surfClassFlags); -HRESULT WINAPI - D3DXGetSurfaceFormat(DWORD deviceIndex, - D3DX_VIDMODEDESC* pDesc, - DWORD surfClassFlags, - DWORD surfaceIndex, - D3DX_SURFACEFORMAT* pFormat); - - -//------------------------------------------------------------------------- -// D3DXGetCurrentVideoMode: Retrieves the current video mode for this device. -// ------------------- -// -// Params: -// [in] DWORD deviceIndex: The device being referred to. -// [out] D3DX_VIDMODEDESC* pVidMode: The current video mode -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXGetCurrentVideoMode(DWORD deviceIndex, - D3DX_VIDMODEDESC* pVidMode); - -//------------------------------------------------------------------------- -// D3DXGetDeviceCaps: Lists all the capabilities of a device at a display -// mode. -// ---------------- -// -// Params: -// [in] DWORD deviceIndex: The device being referred to. -// [in] D3DX_VIDMODEDESC* pDesc: If this is NULL, we will return the -// caps at the current display mode of -// the device. -// [out] D3DDEVICEDESC7* pD3DDeviceDesc7: D3D Caps ( NULL to ignore -// parameter) -// [out] DDCAPS7* pDDHalCaps: DDraw HAL Caps (NULL to ignore parameter) -// [out] DDCAPS7* pDDHelCaps: DDraw HEL Caps (NULL to ignore paramter) -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXGetDeviceCaps(DWORD deviceIndex, - D3DX_VIDMODEDESC* pVidMode, - D3DDEVICEDESC7* pD3DCaps, - DDCAPS* pDDHALCaps, - DDCAPS* pDDHELCaps); - -//------------------------------------------------------------------------- -// D3DXCreateContext: Initializes the chosen device. It is the simplest init -// ----------------- function available. Parameters are treated the same -// as the matching subset of parameters in -// D3DXCreateContextEx, documented below. -// Remaining D3DXCreateContextEx parameters that are -// not present in D3DXCreateContext are treated as -// D3DX_DEFAULT. Note that multimon is not supported -// with D3DXCreateContext. -// -// D3DXCreateContextEx: A more advanced function to initialize the device. -// ------------------- Also accepts D3DX_DEFAULT for most of the parameters -// and then will do what D3DXCreateContext did. -// -// Note: Do not expect D3DXCreateContext(Ex) to be fail-safe (as with any -// API). Supported device capablilites should be used as a guide -// for choosing parameter values. Keep in mind that there will -// inevitably be some combinations of parameters that just do not work. -// -// Params: -// [in] DWORD deviceIndex: The device being referred to. -// [in] DWORD flags: The valid flags are D3DX_CONTEXT_FULLSCREEN, and -// D3DX_CONTEXT_OFFSCREEN. These flags cannot both -// be specified. If no flags are specified, the -// context defaults to windowed mode. -// -// [in] HWND hwnd: Device window. See note. -// [in] HWND hwndFocus: Window which receives keyboard messages from -// the device window. The device window should be -// a child of focus window. Useful for multimon -// applications. See note. -// NOTE: -// windowed: -// hwnd must be a valid window. hwndFocus must be NULL or -// D3DX_DEFAULT. -// -// fullscreen: -// Either hwnd or hwndFocus must be a valid window. (Both cannot -// be NULL or D3DX_DEFAULT). If hwnd is NULL or D3DX_DEFAULT, -// a default device window will be created as a child of hwndFocus. -// -// offscreen: -// Both hwnd and hwndFocus must be NULL or D3DX_DEFAULT -// -// [in] DWORD numColorBits: If D3DX_DEFAULT is passed for windowed mode, -// the current desktop's color depth is chosen. -// For full screen mode, D3DX_DEFAULT causes 16 -// bit color to be used. -// [in] DWORD numAlphaBits: If D3DX_DEFAULT is passed, 0 is chosen. -// [in] DWORD numDepthbits: If D3DX_DEFAULT is passed, -// the highest available number of depth bits -// is chosen. See note. -// [in] DWORD numStencilBits: If D3DX_DEFAULT is passed, the highest -// available number of stencil bits is chosen. -// See note. -// -// NOTE: If both numDepthBits and numStencilBits are D3DX_DEFAULT, -// D3DX first picks the highest available number of stencil -// bits. Then, for the chosen number of stencil bits, -// the highest available number of depth bits is chosen. -// If only one of numStencilBits or numDepthBits -// is D3DX_DEFAULT, the highest number of bits available -// for this parameter is chosen out of only the formats -// that support the number of bits requested for the -// fixed parameter. -// -// [in] DWORD numBackBuffers: Number of back buffers, or D3DX_DEFAULT. -// See note. -// -// NOTE: -// windowed: D3DX_DEFAULT means 1. You must specify one back buffer. -// -// fullscreen: D3DX_DEFAULT means 1. Any number of back buffers can be -// specified. -// -// offscreen: D3DX_DEFAULT means 0. You cannot specify additional back -// buffers. -// -// [in] DWORD width: Width, in pixels, or D3DX_DEFAULT. See note. -// [in] DWORD height: Height, in pixels, or D3DX_DEFAULT. See note. -// -// NOTE: -// windowed: If either width or height is D3DX_DEFAULT, both values -// default to the dimensions of the client area of hwnd. -// -// fullscreen: If either width or height is D3DX_DEFAULT, width -// defaults to 640, and height defaults to 480. -// -// offscreen: An error is returned if either width or height is -// D3DX_DEFAULT. -// -// [in] DWORD refreshRate: D3DX_DEFAULT means we let ddraw choose for -// us. Ignored for windowed and offscreen modes. -// [out] LPD3DXCONTEXT* ppCtx: This is the Context object that is used for -// rendering on that device. -// -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreateContext(DWORD deviceIndex, - DWORD flags, - HWND hwnd, - DWORD width, - DWORD height, - LPD3DXCONTEXT* ppCtx); - -HRESULT WINAPI - D3DXCreateContextEx(DWORD deviceIndex, - DWORD flags, - HWND hwnd, - HWND hwndFocus, - DWORD numColorBits, - DWORD numAlphaBits, - DWORD numDepthbits, - DWORD numStencilBits, - DWORD numBackBuffers, - DWORD width, - DWORD height, - DWORD refreshRate, - LPD3DXCONTEXT* ppCtx); - -// The D3DXCreateContext(Ex) flags are: -#define D3DX_CONTEXT_FULLSCREEN 0x00000001 -#define D3DX_CONTEXT_OFFSCREEN 0x00000002 - -//------------------------------------------------------------------------- -// D3DXGetErrorString: Prints out the error string given an hresult. Prints -// ------------------ Win32 as well as DX6 error messages besides the D3DX -// messages. -// -// Params: -// [in] HRESULT hr: The error code to be deciphered. -// [in] DWORD strLength: Length of the string passed in. -// [out] LPSTR pStr: The string output. This string of appropriate -// size needs to be passed in. -//------------------------------------------------------------------------- -void WINAPI - D3DXGetErrorString(HRESULT hr, - DWORD strLength, - LPSTR pStr); - -//------------------------------------------------------------------------- -// D3DXMakeDDPixelFormat: Fills in a DDPIXELFORMAT structure based on the -// --------------------- D3DX surface format requested. -// -// Params: -// [in] D3DX_SURFACEFORMAT d3dxFormat: Surface format. -// [out] DDPIXELFORMAT* pddpf: Pixel format matching the given -// surface format. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXMakeDDPixelFormat(D3DX_SURFACEFORMAT d3dxFormat, - DDPIXELFORMAT* pddpf); - -//------------------------------------------------------------------------- -// D3DXMakeSurfaceFormat: Determines the surface format corresponding to -// --------------------- a given DDPIXELFORMAT. -// -// Params: -// [in] DDPIXELFORMAT* pddpf: Pixel format. -// Return Value: -// D3DX_SURFACEFORMAT: Surface format matching the given pixel format. -// D3DX_SF_UNKNOWN if the format is not supported -//------------------------------------------------------------------------- -D3DX_SURFACEFORMAT WINAPI - D3DXMakeSurfaceFormat(DDPIXELFORMAT* pddpf); - -#ifdef __cplusplus -} -#endif //__cplusplus - -/////////////////////////////////////////////////////////////////////////// -// Interfaces: -/////////////////////////////////////////////////////////////////////////// - -//------------------------------------------------------------------------- -// ID3DXContext interface: -// -// This encapsulates all the stuff that the app might -// want to do at initialization time and any global control over d3d and -// ddraw. -//------------------------------------------------------------------------- - - -DECLARE_INTERFACE_(ID3DXContext, IUnknown) -{ - // - // IUnknown methods - // - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID* ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - // Get the DDraw and Direct3D objects to call DirectDraw or - // Direct3D Immediate Mode functions. - // If the objects don't exist (because they have not - // been created for some reason) NULL is returned. - // All the objects returned in the following Get* functions - // are addref'ed. It is the application's responsibility to - // release them when no longer needed. - STDMETHOD_(LPDIRECTDRAW7,GetDD)(THIS) PURE; - STDMETHOD_(LPDIRECT3D7,GetD3D)(THIS) PURE; - STDMETHOD_(LPDIRECT3DDEVICE7,GetD3DDevice)(THIS) PURE; - - // Get the various buffers that get created at the init time - // These are addref'ed as well. It is the application's responsibility - // to release them before the app quits or when it needs a resize. - STDMETHOD_(LPDIRECTDRAWSURFACE7,GetPrimary)(THIS) PURE; - STDMETHOD_(LPDIRECTDRAWSURFACE7,GetZBuffer)(THIS) PURE; - STDMETHOD_(LPDIRECTDRAWSURFACE7,GetBackBuffer)(THIS_ DWORD which) PURE; - - // Get the associated window handles - STDMETHOD_(HWND,GetWindow)(THIS) PURE; - STDMETHOD_(HWND,GetFocusWindow)(THIS) PURE; - - // - // Various Get methods, in case the user had specified default - // parameters - // - STDMETHOD(GetDeviceIndex)(THIS_ - LPDWORD pDeviceIndex, - LPDWORD pHwLevel) PURE; - - STDMETHOD_(DWORD, GetNumBackBuffers)(THIS) PURE; - - STDMETHOD(GetNumBits)(THIS_ - LPDWORD pColorBits, - LPDWORD pDepthBits, - LPDWORD pAlphaBits, - LPDWORD pStencilBits) PURE; - - STDMETHOD(GetBufferSize)(THIS_ - LPDWORD pWidth, - LPDWORD pHeight) PURE; - - // Get the flags that were used to create this context - STDMETHOD_(DWORD, GetCreationFlags)(THIS) PURE; - STDMETHOD_(DWORD, GetRefreshRate)(THIS) PURE; - - // Restoring surfaces in case stuff is lost - STDMETHOD(RestoreSurfaces)(THIS) PURE; - - // Resize all the buffers to the new width and height - STDMETHOD(Resize)(THIS_ DWORD width, DWORD height) PURE; - - // Update the frame using a flip or a blit, - // If the D3DX_UPDATE_NOVSYNC flag is set, blit is used if the - // driver cannot flip without waiting for vsync in full-screen mode. - STDMETHOD(UpdateFrame)(THIS_ DWORD flags) PURE; - - // Render a string at the specified coordinates, with the specified - // colour. This is only provided as a convenience for - // debugging/information during development. - // topLeftX and topLeftY represent the location of the top left corner - // of the string, on the render target. - // The coordinate and color parameters each have a range of 0.0-1.0 - STDMETHOD(DrawDebugText)(THIS_ - float topLeftX, - float topLeftY, - D3DCOLOR color, - LPSTR pString) PURE; - - // Clears to the current viewport - // The following are the valid flags: - // D3DCLEAR_TARGET (to clear the render target ) - // D3DCLEAR_ZBUFFER (to clear the depth-buffer ) - // D3DCLEAR_STENCIL (to clear the stencil-buffer ) - STDMETHOD(Clear)(THIS_ DWORD ClearFlags) PURE; - - STDMETHOD(SetClearColor)(THIS_ D3DCOLOR color ) PURE; - STDMETHOD(SetClearDepth)(THIS_ float z) PURE; - STDMETHOD(SetClearStencil)(THIS_ DWORD stencil) PURE; -}; - - -//------------------------------------------------------------------------- -// Flags for Update member function: -// - -// Flag to indicate that blit should be used instead of a flip -// for full-screen rendering. -#define D3DX_UPDATE_NOVSYNC (1<<0) - -/////////////////////////////////////////////////////////////////////////// -// Texturing APIs: -/////////////////////////////////////////////////////////////////////////// -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - -//------------------------------------------------------------------------- -// D3DXCheckTextureRequirements: Return information about texture creation -// ---------------------------- (used by CreateTexture, CreateTextureFromFile -// and CreateCubeMapTexture) -// -// Parameters: -// -// pd3dDevice -// The D3D device with which the texture is going to be used. -// pFlags -// allows specification of D3DX_TEXTURE_NOMIPMAP -// D3DX_TEXTURE_NOMIPMAP may be returned in the case where mipmap creation -// is not supported. -// pWidth -// width in pixels or NULL -// returns corrected width -// pHeight -// height in pixels or NULL -// returns corrected height -// pPixelFormat -// surface format -// returns best match to input format -// -// Notes: 1. Unless the flags is set to specifically prevent creating -// mipmaps, mipmaps are generated all the way till 1x1 surface. -// 2. width, height and pixelformat are altered based on available -// hardware. For example: -// a. Texture dimensions may be required to be powers of 2 -// b. We may require width == height for some devices -// c. If PixelFormat is unavailable, a best fit is made -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCheckTextureRequirements( LPDIRECT3DDEVICE7 pd3dDevice, - LPDWORD pFlags, - LPDWORD pWidth, - LPDWORD pHeight, - D3DX_SURFACEFORMAT* pPixelFormat); - -//------------------------------------------------------------------------- -// D3DXCreateTexture: Create an empty texture object -// ----------------- -// -// Parameters: -// -// pd3dDevice -// The D3D device with which the texture is going to be used. -// pFlags -// allows specification of D3DX_TEXTURE_NOMIPMAP -// D3DX_TEXTURE_NOMIPMAP may be returned in the case where mipmap creation -// is not supported. Additionally, D3DX_TEXTURE_STAGE can be specified -// to indicate which texture stage the texture is for e.g. -// D3D_TEXTURE_STAGE1 indicates that the texture is for use with texture -// stage one. Stage Zero is the default if no TEXTURE_STAGE flags are -// set. -// pWidth -// width in pixels; 0 or NULL is unacceptable -// returns corrected width -// pHeight -// height in pixels; 0 or NULL is unacceptable -// returns corrected height -// pPixelFormat -// surface format. D3DX_DEFAULT is unacceptable. -// returns actual format that was used -// pDDPal -// DDraw palette that is set (if present) on paletted surfaces. -// It is ignored even if it is set, for non-paletted surfaces. -// ppDDSurf -// The ddraw surface that will be created -// pNumMipMaps -// the number of mipmaps actually generated -// -// Notes: See notes for D3DXCheckTextureRequirements. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreateTexture( LPDIRECT3DDEVICE7 pd3dDevice, - LPDWORD pFlags, - LPDWORD pWidth, - LPDWORD pHeight, - D3DX_SURFACEFORMAT* pPixelFormat, - LPDIRECTDRAWPALETTE pDDPal, - LPDIRECTDRAWSURFACE7* ppDDSurf, - LPDWORD pNumMipMaps); - -//------------------------------------------------------------------------- -// D3DXCreateCubeMapTexture: Create blank cube-map texture -// ------------------------ -// -// Parameters: -// -// pd3dDevice -// The D3D device with which the texture is going to be used. -// pFlags -// allows specification of D3DX_TEXTURE_NOMIPMAP -// D3DX_TEXTURE_NOMIPMAP may be returned in the case where mipmap creation -// is not supported. Additionally, D3DX_TEXTURE_STAGE can be specified -// to indicate which texture stage the texture is for e.g. -// D3D_TEXTURE_STAGE1 indicates that the texture is for use with texture -// stage one. Stage Zero is the default if no TEXTURE_STAGE flags are -// set. -// cubefaces -// allows specification of which faces of the cube-map to generate. -// D3DX_DEFAULT, 0, and DDSCAPS2_CUBEMAP_ALLFACES all mean -// "create all 6 faces of the cubemap". Any combination of -// DDSCAPS2_CUBEMAP_POSITIVEX, DDSCAPS2_CUBEMAP_NEGATIVEX, -// DDSCAPS2_CUBEMAP_POSITIVEY, DDSCAPS2_CUBEMAP_NEGATIVEY, -// DDSCAPS2_CUBEMAP_POSITIVEZ, or DDSCAPS2_CUBEMAP_NEGATIVEZ, is -// valid. -// colorEmptyFaces -// allows specification of the color to use for the faces that were not -// specified in the cubefaces parameter. -// pWidth -// width in pixels; 0 or NULL is unacceptable -// returns corrected width -// pHeight -// height in pixels; 0 or NULL is unacceptable -// returns corrected height -// pPixelFormat -// surface format. D3DX_DEFAULT is unacceptable. -// returns actual format that was used -// pDDPal -// DDraw palette that is set (if present) on paletted surfaces. -// It is ignored even if it is set, for non-paletted surfaces. -// ppDDSurf -// the ddraw surface that will be created -// pNumMipMaps -// the number of mipmaps generated for a particular face of the -// cubemap. -// -// Notes: See notes for D3DXCheckTextureRequirements. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreateCubeMapTexture( LPDIRECT3DDEVICE7 pd3dDevice, - LPDWORD pFlags, - DWORD cubefaces, - D3DCOLOR colorEmptyFaces, - LPDWORD pWidth, - LPDWORD pHeight, - D3DX_SURFACEFORMAT *pPixelFormat, - LPDIRECTDRAWPALETTE pDDPal, - LPDIRECTDRAWSURFACE7* ppDDSurf, - LPDWORD pNumMipMaps); - - -//------------------------------------------------------------------------- -// D3DXCreateTextureFromFile: Create a texture object from a file or from the -// ------------------------- resource. Only BMP and DIB are supported from the -// resource portion of the executable. -// -// Parameters: -// -// pd3dDevice -// The D3D device with which the texture is going to be used. -// pFlags -// allows specification of D3DX_TEXTURE_NOMIPMAP -// D3DX_TEXTURE_NOMIPMAP may be returned in the case where mipmap creation -// is not supported. Additionally, D3DX_TEXTURE_STAGE can be specified -// to indicate which texture stage the texture is for e.g. -// D3D_TEXTURE_STAGE1 indicates that the texture is for use with texture -// stage one. Stage Zero is the default if no TEXTURE_STAGE flags are -// set. -// pWidth -// Width in pixels. If 0 or D3DX_DEFAULT, the width will be taken -// from the file -// returns corrected width -// pHeight -// Height in pixels. If 0 or D3DX_DEFAULT, the height will be taken -// from the file -// returns corrected height -// pPixelFormat -// If D3DX_SF_UNKNOWN is passed in, pixel format closest to the bitmap -// will be chosen -// returns actual format that was used -// pDDPal -// DDraw palette that is set (if present) on paletted surfaces. -// It is ignored even if it is set, for non-paletted surfaces. -// ppDDSurf -// The ddraw surface that will be created. -// pNumMipMaps -// The number of mipmaps generated. -// pSrcName -// File name. BMP, DIB, DDS, are supported. -// -// TGA is supported for the following cases: 16, 24, 32bpp direct color and 8bpp palettized. -// Also, 8, 16bpp grayscale is supported. RLE versions of the above -// TGA formats are also supported. ColorKey and Premultiplied Alpha -// are not currently supported for TGA files. -// returns created format -// -// Notes: See notes for D3DXCheckTextureRequirements. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreateTextureFromFile( LPDIRECT3DDEVICE7 pd3dDevice, - LPDWORD pFlags, - LPDWORD pWidth, - LPDWORD pHeight, - D3DX_SURFACEFORMAT* pPixelFormat, - LPDIRECTDRAWPALETTE pDDPal, - LPDIRECTDRAWSURFACE7* ppDDSurf, - LPDWORD pNumMipMaps, - LPSTR pSrcName, - D3DX_FILTERTYPE filterType); - -//------------------------------------------------------------------------- -// D3DXLoadTextureFromFile: Load from a file into a mipmap level. Doing the -// ----------------------- necessary color conversion and rescaling. File -// format support is identical to -// D3DXCreateTextureFromFile's. -// -// pd3dDevice -// The D3D device with which the texture is going to be used. -// pTexture -// a pointer to a DD7Surface which was created with either -// CreateTextureFromFile or CreateTexture. -// mipMapLevel -// indicates mipmap level -// Note: -// 1. Error if mipmap level doesn't exist -// 2. If D3DX_DEFAULT and equal number of mipmap levels exist -// then all the source mip-levels are loaded -// 3. If the source has mipmaps and the dest doesn't, use the top one -// 4. If the dest has miplevels and source doesn't, we expand -// 5. If there are unequal numbers of miplevels, we expand -// pSrcName -// File name. BMP, DIB, DDS, are supported. -// For details on TGA support, refer to the comments for -// D3DXCreateTextureFromFile -// pSrcRect -// the source rectangle or null (whole surface) -// pDestRect -// the destination rectangle or null (whole surface) -// filterType -// filter used for mipmap generation -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXLoadTextureFromFile( LPDIRECT3DDEVICE7 pd3dDevice, - LPDIRECTDRAWSURFACE7 pTexture, - DWORD mipMapLevel, - LPSTR pSrcName, - RECT* pSrcRect, - RECT* pDestRect, - D3DX_FILTERTYPE filterType); - -//------------------------------------------------------------------------- -// D3DXLoadTextureFromSurface: Load from a DDraw Surface into a mipmap level. -// -------------------------- Doing the necessary color conversion. -// -// pd3dDevice -// The D3D device with which the texture is going to be used. -// pTexture -// a pointer to a DD7Surface which was created with either -// CreateTextureFromFile or CreateTexture. -// mipMapLevel -// indicates mipmap level -// Note: -// 1. Error if mipmap level doesn't exist -// 2. If D3DX_DEFAULT and equal number of mipmap levels exist -// then all the source mip-levels are loaded -// 3. If the source has mipmaps and the dest doesn't, use the top one -// 4. If the dest has miplevels and source doesn't, we expand -// 5. If there are unequal numbers of miplevels, we expand -// pSurfaceSrc -// the source surface -// pSrcRect -// the source rectangle or null (whole surface) -// pDestRect -// the destination rectangle or null (whole surface) -// filterType -// filter used for mipmap generation -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXLoadTextureFromSurface( LPDIRECT3DDEVICE7 pd3dDevice, - LPDIRECTDRAWSURFACE7 pTexture, - DWORD mipMapLevel, - LPDIRECTDRAWSURFACE7 pSurfaceSrc, - RECT* pSrcRect, - RECT* pDestRect, - D3DX_FILTERTYPE filterType); - -//------------------------------------------------------------------------- -// D3DXLoadTextureFromMemory: Load a mip level from memory. Doing the necessary -// ------------------------- color conversion. -// -// pd3dDevice -// The D3D device with which the texture is going to be used. -// pTexture -// a pointer to a DD7Surface which was created with either -// CreateTextureFromFile or CreateTexture. -// mipMapLevel -// indicates mipmap level -// Note: -// 1. Error if mipmap level doesn't exist -// 2. If D3DX_DEFAULT and equal number of mipmap levels exist -// then all the source mip-levels are loaded -// 3. If the source has mipmaps and the dest doesn't, use the top one -// 4. If the dest has miplevels and source doesn't, we expand -// 5. If there are unequal numbers of miplevels, we expand -// pMemory -// pointer to source memory from which the texture will be loaded -// pDDPal -// DirectDraw Palette, that the app passes in optionally if the memory is -// supposed to be paletteized. -// srcPixelFormat -// PixelFormat of the source. -// srcPitch -// The pitch of the memory or D3DX_DEFAULT (based on srcPixelFormat) -// pDestRect -// The destination rectangle or null (whole surface) -// filterType -// filter used for mipmap generation -// -// Assumptions: The source (memory) is loaded in full -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXLoadTextureFromMemory( LPDIRECT3DDEVICE7 pd3dDevice, - LPDIRECTDRAWSURFACE7 pTexture, - DWORD mipMapLevel, - LPVOID pMemory, - LPDIRECTDRAWPALETTE pDDPal, - D3DX_SURFACEFORMAT srcPixelFormat, - DWORD srcPitch, - RECT* pDestRect, - D3DX_FILTERTYPE filterType); - -#ifdef __cplusplus -} -#endif //__cplusplus - -//------------------------------------------------------------------------- -// Flags for texture create functions; applies to -// D3DXCreateTexture, D3DXCreateCubeMapTexture and D3DXCreateTextureFromFile. -// - -// Flag to indicate that mipmap generation is not desired. -#define D3DX_TEXTURE_NOMIPMAP (1 << 8) - -// Flags to indicate which texture stage the texture is -// intended for use with. Specifying the stage is necessary at -// texture creation time for HW devices that expose the -// D3DDEVCAPS_SEPARATETEXTUREMEMORIES bit in their D3DDEVICEDESC -// structure. -#define D3DX_TEXTURE_STAGE0 (0) -#define D3DX_TEXTURE_STAGE1 (1) -#define D3DX_TEXTURE_STAGE2 (2) -#define D3DX_TEXTURE_STAGE3 (3) -#define D3DX_TEXTURE_STAGE4 (4) -#define D3DX_TEXTURE_STAGE5 (5) -#define D3DX_TEXTURE_STAGE6 (6) -#define D3DX_TEXTURE_STAGE7 (7) - -// Mask to extract the texture stage value out of the flags to -// the texture create functions. -#define D3DX_TEXTURE_STAGE_MASK (0x7) - -#endif //__D3DXCORE_H__ diff --git a/import/DirectX8/include/d3dxerr.h b/import/DirectX8/include/d3dxerr.h deleted file mode 100644 index 155005b70..000000000 --- a/import/DirectX8/include/d3dxerr.h +++ /dev/null @@ -1,407 +0,0 @@ -//---------------------------------------------------------------------- -// -// d3dxerr.h -- 0xC code definitions for the D3DX API -// -// Copyright (c) Microsoft Corp. All rights reserved. -// -//---------------------------------------------------------------------- -#ifndef __D3DXERR_H__ -#define __D3DXERR_H__ - -// -// -// Values are 32 bit values layed out as follows: -// -// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 -// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 -// +---+-+-+-----------------------+-------------------------------+ -// |Sev|C|R| Facility | Code | -// +---+-+-+-----------------------+-------------------------------+ -// -// where -// -// Sev - is the severity code -// -// 00 - Success -// 01 - Informational -// 10 - Warning -// 11 - Error -// -// C - is the Customer code flag -// -// R - is a reserved bit -// -// Facility - is the facility code -// -// Code - is the facility's status code -// -// -// Define the facility codes -// -#define FACILITY_D3DX 0x877 - - - -// -// MessageId: D3DXERR_NOMEMORY -// -// MessageText: -// -// Out of memory. -// -#define D3DXERR_NOMEMORY ((HRESULT)0xC8770BB8L) - - -// -// MessageId: D3DXERR_NULLPOINTER -// -// MessageText: -// -// A NULL pointer was passed as a parameter. -// -#define D3DXERR_NULLPOINTER ((HRESULT)0xC8770BB9L) - - -// -// MessageId: D3DXERR_INVALIDD3DXDEVICEINDEX -// -// MessageText: -// -// The Device Index passed in is invalid. -// -#define D3DXERR_INVALIDD3DXDEVICEINDEX ((HRESULT)0xC8770BBAL) - - -// -// MessageId: D3DXERR_NODIRECTDRAWAVAILABLE -// -// MessageText: -// -// DirectDraw has not been created. -// -#define D3DXERR_NODIRECTDRAWAVAILABLE ((HRESULT)0xC8770BBBL) - - -// -// MessageId: D3DXERR_NODIRECT3DAVAILABLE -// -// MessageText: -// -// Direct3D has not been created. -// -#define D3DXERR_NODIRECT3DAVAILABLE ((HRESULT)0xC8770BBCL) - - -// -// MessageId: D3DXERR_NODIRECT3DDEVICEAVAILABLE -// -// MessageText: -// -// Direct3D device has not been created. -// -#define D3DXERR_NODIRECT3DDEVICEAVAILABLE ((HRESULT)0xC8770BBDL) - - -// -// MessageId: D3DXERR_NOPRIMARYAVAILABLE -// -// MessageText: -// -// Primary surface has not been created. -// -#define D3DXERR_NOPRIMARYAVAILABLE ((HRESULT)0xC8770BBEL) - - -// -// MessageId: D3DXERR_NOZBUFFERAVAILABLE -// -// MessageText: -// -// Z buffer has not been created. -// -#define D3DXERR_NOZBUFFERAVAILABLE ((HRESULT)0xC8770BBFL) - - -// -// MessageId: D3DXERR_NOBACKBUFFERAVAILABLE -// -// MessageText: -// -// Backbuffer has not been created. -// -#define D3DXERR_NOBACKBUFFERAVAILABLE ((HRESULT)0xC8770BC0L) - - -// -// MessageId: D3DXERR_COULDNTUPDATECAPS -// -// MessageText: -// -// Failed to update caps database after changing display mode. -// -#define D3DXERR_COULDNTUPDATECAPS ((HRESULT)0xC8770BC1L) - - -// -// MessageId: D3DXERR_NOZBUFFER -// -// MessageText: -// -// Could not create Z buffer. -// -#define D3DXERR_NOZBUFFER ((HRESULT)0xC8770BC2L) - - -// -// MessageId: D3DXERR_INVALIDMODE -// -// MessageText: -// -// Display mode is not valid. -// -#define D3DXERR_INVALIDMODE ((HRESULT)0xC8770BC3L) - - -// -// MessageId: D3DXERR_INVALIDPARAMETER -// -// MessageText: -// -// One or more of the parameters passed is invalid. -// -#define D3DXERR_INVALIDPARAMETER ((HRESULT)0xC8770BC4L) - - -// -// MessageId: D3DXERR_INITFAILED -// -// MessageText: -// -// D3DX failed to initialize itself. -// -#define D3DXERR_INITFAILED ((HRESULT)0xC8770BC5L) - - -// -// MessageId: D3DXERR_STARTUPFAILED -// -// MessageText: -// -// D3DX failed to start up. -// -#define D3DXERR_STARTUPFAILED ((HRESULT)0xC8770BC6L) - - -// -// MessageId: D3DXERR_D3DXNOTSTARTEDYET -// -// MessageText: -// -// D3DXInitialize() must be called first. -// -#define D3DXERR_D3DXNOTSTARTEDYET ((HRESULT)0xC8770BC7L) - - -// -// MessageId: D3DXERR_NOTINITIALIZED -// -// MessageText: -// -// D3DX is not initialized yet. -// -#define D3DXERR_NOTINITIALIZED ((HRESULT)0xC8770BC8L) - - -// -// MessageId: D3DXERR_FAILEDDRAWTEXT -// -// MessageText: -// -// Failed to render text to the surface. -// -#define D3DXERR_FAILEDDRAWTEXT ((HRESULT)0xC8770BC9L) - - -// -// MessageId: D3DXERR_BADD3DXCONTEXT -// -// MessageText: -// -// Bad D3DX context. -// -#define D3DXERR_BADD3DXCONTEXT ((HRESULT)0xC8770BCAL) - - -// -// MessageId: D3DXERR_CAPSNOTSUPPORTED -// -// MessageText: -// -// The requested device capabilities are not supported. -// -#define D3DXERR_CAPSNOTSUPPORTED ((HRESULT)0xC8770BCBL) - - -// -// MessageId: D3DXERR_UNSUPPORTEDFILEFORMAT -// -// MessageText: -// -// The image file format is unrecognized. -// -#define D3DXERR_UNSUPPORTEDFILEFORMAT ((HRESULT)0xC8770BCCL) - - -// -// MessageId: D3DXERR_IFLERROR -// -// MessageText: -// -// The image file loading library error. -// -#define D3DXERR_IFLERROR ((HRESULT)0xC8770BCDL) - - -// -// MessageId: D3DXERR_FAILEDGETCAPS -// -// MessageText: -// -// Could not obtain device caps. -// -#define D3DXERR_FAILEDGETCAPS ((HRESULT)0xC8770BCEL) - - -// -// MessageId: D3DXERR_CANNOTRESIZEFULLSCREEN -// -// MessageText: -// -// Resize does not work for full-screen. -// -#define D3DXERR_CANNOTRESIZEFULLSCREEN ((HRESULT)0xC8770BCFL) - - -// -// MessageId: D3DXERR_CANNOTRESIZENONWINDOWED -// -// MessageText: -// -// Resize does not work for non-windowed contexts. -// -#define D3DXERR_CANNOTRESIZENONWINDOWED ((HRESULT)0xC8770BD0L) - - -// -// MessageId: D3DXERR_FRONTBUFFERALREADYEXISTS -// -// MessageText: -// -// Front buffer already exists. -// -#define D3DXERR_FRONTBUFFERALREADYEXISTS ((HRESULT)0xC8770BD1L) - - -// -// MessageId: D3DXERR_FULLSCREENPRIMARYEXISTS -// -// MessageText: -// -// The app is using the primary in full-screen mode. -// -#define D3DXERR_FULLSCREENPRIMARYEXISTS ((HRESULT)0xC8770BD2L) - - -// -// MessageId: D3DXERR_GETDCFAILED -// -// MessageText: -// -// Could not get device context. -// -#define D3DXERR_GETDCFAILED ((HRESULT)0xC8770BD3L) - - -// -// MessageId: D3DXERR_BITBLTFAILED -// -// MessageText: -// -// Could not bitBlt. -// -#define D3DXERR_BITBLTFAILED ((HRESULT)0xC8770BD4L) - - -// -// MessageId: D3DXERR_NOTEXTURE -// -// MessageText: -// -// There is no surface backing up this texture. -// -#define D3DXERR_NOTEXTURE ((HRESULT)0xC8770BD5L) - - -// -// MessageId: D3DXERR_MIPLEVELABSENT -// -// MessageText: -// -// There is no such miplevel for this surface. -// -#define D3DXERR_MIPLEVELABSENT ((HRESULT)0xC8770BD6L) - - -// -// MessageId: D3DXERR_SURFACENOTPALETTED -// -// MessageText: -// -// The surface is not paletted. -// -#define D3DXERR_SURFACENOTPALETTED ((HRESULT)0xC8770BD7L) - - -// -// MessageId: D3DXERR_ENUMFORMATSFAILED -// -// MessageText: -// -// An error occured while enumerating surface formats. -// -#define D3DXERR_ENUMFORMATSFAILED ((HRESULT)0xC8770BD8L) - - -// -// MessageId: D3DXERR_COLORDEPTHTOOLOW -// -// MessageText: -// -// D3DX only supports color depths of 16 bit or greater. -// -#define D3DXERR_COLORDEPTHTOOLOW ((HRESULT)0xC8770BD9L) - - -// -// MessageId: D3DXERR_INVALIDFILEFORMAT -// -// MessageText: -// -// The file format is invalid. -// -#define D3DXERR_INVALIDFILEFORMAT ((HRESULT)0xC8770BDAL) - - -// -// MessageId: D3DXERR_NOMATCHFOUND -// -// MessageText: -// -// No suitable match found. -// -#define D3DXERR_NOMATCHFOUND ((HRESULT)0xC8770BDBL) - - - -#endif //__D3DXERR_H__ - diff --git a/import/DirectX8/include/d3dxmath.h b/import/DirectX8/include/d3dxmath.h deleted file mode 100644 index 685cc3369..000000000 --- a/import/DirectX8/include/d3dxmath.h +++ /dev/null @@ -1,1085 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) Microsoft Corporation. All Rights Reserved. -// -// File: d3dxmath.h -// Content: D3DX math types and functions -// -////////////////////////////////////////////////////////////////////////////// - -#ifndef __D3DXMATH_H__ -#define __D3DXMATH_H__ - -#include -#include -#include -#include "d3dxerr.h" - -#ifndef D3DXINLINE -#ifdef __cplusplus -#define D3DXINLINE inline -#else -#define D3DXINLINE _inline -#endif -#endif - -#pragma warning(disable:4201) // anonymous unions warning - - - -typedef struct ID3DXMatrixStack *LPD3DXMATRIXSTACK; - -// {E3357330-CC5E-11d2-A434-00A0C90629A8} -DEFINE_GUID( IID_ID3DXMatrixStack, - 0xe3357330, 0xcc5e, 0x11d2, 0xa4, 0x34, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8); - - -//=========================================================================== -// -// General purpose utilities -// -//=========================================================================== -#define D3DX_PI ((float) 3.141592654f) -#define D3DX_1BYPI ((float) 0.318309886f) - -#define D3DXToRadian( degree ) ((degree) * (D3DX_PI / 180.0f)) -#define D3DXToDegree( radian ) ((radian) * (180.0f / D3DX_PI)) - - - -//=========================================================================== -// -// Vectors -// -//=========================================================================== - -//-------------------------- -// 2D Vector -//-------------------------- -typedef struct D3DXVECTOR2 -{ -#ifdef __cplusplus -public: - D3DXVECTOR2() {}; - D3DXVECTOR2( const float * ); - D3DXVECTOR2( float x, float y ); - - // casting - operator float* (); - operator const float* () const; - - // assignment operators - D3DXVECTOR2& operator += ( const D3DXVECTOR2& ); - D3DXVECTOR2& operator -= ( const D3DXVECTOR2& ); - D3DXVECTOR2& operator *= ( float ); - D3DXVECTOR2& operator /= ( float ); - - // unary operators - D3DXVECTOR2 operator + () const; - D3DXVECTOR2 operator - () const; - - // binary operators - D3DXVECTOR2 operator + ( const D3DXVECTOR2& ) const; - D3DXVECTOR2 operator - ( const D3DXVECTOR2& ) const; - D3DXVECTOR2 operator * ( float ) const; - D3DXVECTOR2 operator / ( float ) const; - - friend D3DXVECTOR2 operator * ( float, const D3DXVECTOR2& ); - - BOOL operator == ( const D3DXVECTOR2& ) const; - BOOL operator != ( const D3DXVECTOR2& ) const; - - -public: -#endif //__cplusplus - float x, y; -} D3DXVECTOR2, *LPD3DXVECTOR2; - - -//-------------------------- -// 3D Vector -//-------------------------- -typedef struct D3DXVECTOR3 -{ -#ifdef __cplusplus -public: - D3DXVECTOR3() {}; - D3DXVECTOR3( const float * ); - D3DXVECTOR3( const D3DVECTOR& ); - D3DXVECTOR3( float x, float y, float z ); - - // casting - operator float* (); - operator const float* () const; - - operator D3DVECTOR* (); - operator const D3DVECTOR* () const; - - operator D3DVECTOR& (); - operator const D3DVECTOR& () const; - - // assignment operators - D3DXVECTOR3& operator += ( const D3DXVECTOR3& ); - D3DXVECTOR3& operator -= ( const D3DXVECTOR3& ); - D3DXVECTOR3& operator *= ( float ); - D3DXVECTOR3& operator /= ( float ); - - // unary operators - D3DXVECTOR3 operator + () const; - D3DXVECTOR3 operator - () const; - - // binary operators - D3DXVECTOR3 operator + ( const D3DXVECTOR3& ) const; - D3DXVECTOR3 operator - ( const D3DXVECTOR3& ) const; - D3DXVECTOR3 operator * ( float ) const; - D3DXVECTOR3 operator / ( float ) const; - - friend D3DXVECTOR3 operator * ( float, const struct D3DXVECTOR3& ); - - BOOL operator == ( const D3DXVECTOR3& ) const; - BOOL operator != ( const D3DXVECTOR3& ) const; - -public: -#endif //__cplusplus - float x, y, z; -} D3DXVECTOR3, *LPD3DXVECTOR3; - - -//-------------------------- -// 4D Vector -//-------------------------- -typedef struct D3DXVECTOR4 -{ -#ifdef __cplusplus -public: - D3DXVECTOR4() {}; - D3DXVECTOR4( const float* ); - D3DXVECTOR4( float x, float y, float z, float w ); - - // casting - operator float* (); - operator const float* () const; - - // assignment operators - D3DXVECTOR4& operator += ( const D3DXVECTOR4& ); - D3DXVECTOR4& operator -= ( const D3DXVECTOR4& ); - D3DXVECTOR4& operator *= ( float ); - D3DXVECTOR4& operator /= ( float ); - - // unary operators - D3DXVECTOR4 operator + () const; - D3DXVECTOR4 operator - () const; - - // binary operators - D3DXVECTOR4 operator + ( const D3DXVECTOR4& ) const; - D3DXVECTOR4 operator - ( const D3DXVECTOR4& ) const; - D3DXVECTOR4 operator * ( float ) const; - D3DXVECTOR4 operator / ( float ) const; - - friend D3DXVECTOR4 operator * ( float, const D3DXVECTOR4& ); - - BOOL operator == ( const D3DXVECTOR4& ) const; - BOOL operator != ( const D3DXVECTOR4& ) const; - -public: -#endif //__cplusplus - float x, y, z, w; -} D3DXVECTOR4, *LPD3DXVECTOR4; - - -//=========================================================================== -// -// Matrices -// -//=========================================================================== -typedef struct D3DXMATRIX -{ -#ifdef __cplusplus -public: - D3DXMATRIX() {}; - D3DXMATRIX( const float * ); - D3DXMATRIX( const D3DMATRIX& ); - D3DXMATRIX( float m00, float m01, float m02, float m03, - float m10, float m11, float m12, float m13, - float m20, float m21, float m22, float m23, - float m30, float m31, float m32, float m33 ); - - - // access grants - float& operator () ( UINT iRow, UINT iCol ); - float operator () ( UINT iRow, UINT iCol ) const; - - // casting operators - operator float* (); - operator const float* () const; - - operator D3DMATRIX* (); - operator const D3DMATRIX* () const; - - operator D3DMATRIX& (); - operator const D3DMATRIX& () const; - - // assignment operators - D3DXMATRIX& operator *= ( const D3DXMATRIX& ); - D3DXMATRIX& operator += ( const D3DXMATRIX& ); - D3DXMATRIX& operator -= ( const D3DXMATRIX& ); - D3DXMATRIX& operator *= ( float ); - D3DXMATRIX& operator /= ( float ); - - // unary operators - D3DXMATRIX operator + () const; - D3DXMATRIX operator - () const; - - // binary operators - D3DXMATRIX operator * ( const D3DXMATRIX& ) const; - D3DXMATRIX operator + ( const D3DXMATRIX& ) const; - D3DXMATRIX operator - ( const D3DXMATRIX& ) const; - D3DXMATRIX operator * ( float ) const; - D3DXMATRIX operator / ( float ) const; - - friend D3DXMATRIX operator * ( float, const D3DXMATRIX& ); - - BOOL operator == ( const D3DXMATRIX& ) const; - BOOL operator != ( const D3DXMATRIX& ) const; - - -#endif //__cplusplus - - union - { - float m[4][4]; -#ifdef __cplusplus - struct - { - float m00, m01, m02, m03; - float m10, m11, m12, m13; - float m20, m21, m22, m23; - float m30, m31, m32, m33; - }; -#endif //__cplusplus - }; -} D3DXMATRIX, *LPD3DXMATRIX; - - -//=========================================================================== -// -// Quaternions -// -//=========================================================================== -typedef struct D3DXQUATERNION -{ -#ifdef __cplusplus -public: - D3DXQUATERNION() {} - D3DXQUATERNION( const float * ); - D3DXQUATERNION( float x, float y, float z, float w ); - - // casting - operator float* (); - operator const float* () const; - - // assignment operators - D3DXQUATERNION& operator += ( const D3DXQUATERNION& ); - D3DXQUATERNION& operator -= ( const D3DXQUATERNION& ); - D3DXQUATERNION& operator *= ( const D3DXQUATERNION& ); - D3DXQUATERNION& operator *= ( float ); - D3DXQUATERNION& operator /= ( float ); - - // unary operators - D3DXQUATERNION operator + () const; - D3DXQUATERNION operator - () const; - - // binary operators - D3DXQUATERNION operator + ( const D3DXQUATERNION& ) const; - D3DXQUATERNION operator - ( const D3DXQUATERNION& ) const; - D3DXQUATERNION operator * ( const D3DXQUATERNION& ) const; - D3DXQUATERNION operator * ( float ) const; - D3DXQUATERNION operator / ( float ) const; - - friend D3DXQUATERNION operator * (float, const D3DXQUATERNION& ); - - BOOL operator == ( const D3DXQUATERNION& ) const; - BOOL operator != ( const D3DXQUATERNION& ) const; - -#endif //__cplusplus - float x, y, z, w; -} D3DXQUATERNION, *LPD3DXQUATERNION; - - -//=========================================================================== -// -// Planes -// -//=========================================================================== -typedef struct D3DXPLANE -{ -#ifdef __cplusplus -public: - D3DXPLANE() {} - D3DXPLANE( const float* ); - D3DXPLANE( float a, float b, float c, float d ); - - // casting - operator float* (); - operator const float* () const; - - // unary operators - D3DXPLANE operator + () const; - D3DXPLANE operator - () const; - - // binary operators - BOOL operator == ( const D3DXPLANE& ) const; - BOOL operator != ( const D3DXPLANE& ) const; - -#endif //__cplusplus - float a, b, c, d; -} D3DXPLANE, *LPD3DXPLANE; - - -//=========================================================================== -// -// Colors -// -//=========================================================================== - -typedef struct D3DXCOLOR -{ -#ifdef __cplusplus -public: - D3DXCOLOR() {} - D3DXCOLOR( DWORD argb ); - D3DXCOLOR( const float * ); - D3DXCOLOR( const D3DCOLORVALUE& ); - D3DXCOLOR( float r, float g, float b, float a ); - - // casting - operator DWORD () const; - - operator float* (); - operator const float* () const; - - operator D3DCOLORVALUE* (); - operator const D3DCOLORVALUE* () const; - - operator D3DCOLORVALUE& (); - operator const D3DCOLORVALUE& () const; - - // assignment operators - D3DXCOLOR& operator += ( const D3DXCOLOR& ); - D3DXCOLOR& operator -= ( const D3DXCOLOR& ); - D3DXCOLOR& operator *= ( float ); - D3DXCOLOR& operator /= ( float ); - - // unary operators - D3DXCOLOR operator + () const; - D3DXCOLOR operator - () const; - - // binary operators - D3DXCOLOR operator + ( const D3DXCOLOR& ) const; - D3DXCOLOR operator - ( const D3DXCOLOR& ) const; - D3DXCOLOR operator * ( float ) const; - D3DXCOLOR operator / ( float ) const; - - friend D3DXCOLOR operator * (float, const D3DXCOLOR& ); - - BOOL operator == ( const D3DXCOLOR& ) const; - BOOL operator != ( const D3DXCOLOR& ) const; - -#endif //__cplusplus - FLOAT r, g, b, a; -} D3DXCOLOR, *LPD3DXCOLOR; - - - -//=========================================================================== -// -// D3DX math functions: -// -// NOTE: -// * All these functions can take the same object as in and out parameters. -// -// * Out parameters are typically also returned as return values, so that -// the output of one function may be used as a parameter to another. -// -//=========================================================================== - -//-------------------------- -// 2D Vector -//-------------------------- - -// inline - -float D3DXVec2Length - ( const D3DXVECTOR2 *pV ); - -float D3DXVec2LengthSq - ( const D3DXVECTOR2 *pV ); - -float D3DXVec2Dot - ( const D3DXVECTOR2 *pV1, const D3DXVECTOR2 *pV2 ); - -// Z component of ((x1,y1,0) cross (x2,y2,0)) -float D3DXVec2CCW - ( const D3DXVECTOR2 *pV1, const D3DXVECTOR2 *pV2 ); - -D3DXVECTOR2* D3DXVec2Add - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV1, const D3DXVECTOR2 *pV2 ); - -D3DXVECTOR2* D3DXVec2Subtract - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV1, const D3DXVECTOR2 *pV2 ); - -// Minimize each component. x = min(x1, x2), y = min(y1, y2) -D3DXVECTOR2* D3DXVec2Minimize - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV1, const D3DXVECTOR2 *pV2 ); - -// Maximize each component. x = max(x1, x2), y = max(y1, y2) -D3DXVECTOR2* D3DXVec2Maximize - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV1, const D3DXVECTOR2 *pV2 ); - -D3DXVECTOR2* D3DXVec2Scale - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV, float s ); - -// Linear interpolation. V1 + s(V2-V1) -D3DXVECTOR2* D3DXVec2Lerp - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV1, const D3DXVECTOR2 *pV2, - float s ); - -// non-inline -#ifdef __cplusplus -extern "C" { -#endif - -D3DXVECTOR2* WINAPI D3DXVec2Normalize - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV ); - -// Hermite interpolation between position V1, tangent T1 (when s == 0) -// and position V2, tangent T2 (when s == 1). -D3DXVECTOR2* WINAPI D3DXVec2Hermite - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV1, const D3DXVECTOR2 *pT1, - const D3DXVECTOR2 *pV2, const D3DXVECTOR2 *pT2, float s ); - -// Barycentric coordinates. V1 + f(V2-V1) + g(V3-V1) -D3DXVECTOR2* WINAPI D3DXVec2BaryCentric - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV1, const D3DXVECTOR2 *pV2, - D3DXVECTOR2 *pV3, float f, float g); - -// Transform (x, y, 0, 1) by matrix. -D3DXVECTOR4* WINAPI D3DXVec2Transform - ( D3DXVECTOR4 *pOut, const D3DXVECTOR2 *pV, const D3DXMATRIX *pM ); - -// Transform (x, y, 0, 1) by matrix, project result back into w=1. -D3DXVECTOR2* WINAPI D3DXVec2TransformCoord - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV, const D3DXMATRIX *pM ); - -// Transform (x, y, 0, 0) by matrix. -D3DXVECTOR2* WINAPI D3DXVec2TransformNormal - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV, const D3DXMATRIX *pM ); - -#ifdef __cplusplus -} -#endif - - -//-------------------------- -// 3D Vector -//-------------------------- - -// inline - -float D3DXVec3Length - ( const D3DXVECTOR3 *pV ); - -float D3DXVec3LengthSq - ( const D3DXVECTOR3 *pV ); - -float D3DXVec3Dot - ( const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pV2 ); - -D3DXVECTOR3* D3DXVec3Cross - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pV2 ); - -D3DXVECTOR3* D3DXVec3Add - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pV2 ); - -D3DXVECTOR3* D3DXVec3Subtract - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pV2 ); - -// Minimize each component. x = min(x1, x2), y = min(y1, y2), ... -D3DXVECTOR3* D3DXVec3Minimize - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pV2 ); - -// Maximize each component. x = max(x1, x2), y = max(y1, y2), ... -D3DXVECTOR3* D3DXVec3Maximize - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pV2 ); - -D3DXVECTOR3* D3DXVec3Scale - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV, float s); - -// Linear interpolation. V1 + s(V2-V1) -D3DXVECTOR3* D3DXVec3Lerp - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pV2, - float s ); - -// non-inline -#ifdef __cplusplus -extern "C" { -#endif - -D3DXVECTOR3* WINAPI D3DXVec3Normalize - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV ); - -// Hermite interpolation between position V1, tangent T1 (when s == 0) -// and position V2, tangent T2 (when s == 1). -D3DXVECTOR3* WINAPI D3DXVec3Hermite - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pT1, - const D3DXVECTOR3 *pV2, const D3DXVECTOR3 *pT2, float s ); - -// Barycentric coordinates. V1 + f(V2-V1) + g(V3-V1) -D3DXVECTOR3* WINAPI D3DXVec3BaryCentric - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pV2, - const D3DXVECTOR3 *pV3, float f, float g); - -// Transform (x, y, z, 1) by matrix. -D3DXVECTOR4* WINAPI D3DXVec3Transform - ( D3DXVECTOR4 *pOut, const D3DXVECTOR3 *pV, const D3DXMATRIX *pM ); - -// Transform (x, y, z, 1) by matrix, project result back into w=1. -D3DXVECTOR3* WINAPI D3DXVec3TransformCoord - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV, const D3DXMATRIX *pM ); - -// Transform (x, y, z, 0) by matrix. -D3DXVECTOR3* WINAPI D3DXVec3TransformNormal - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV, const D3DXMATRIX *pM ); - -#ifdef __cplusplus -} -#endif - - - -//-------------------------- -// 4D Vector -//-------------------------- - -// inline - -float D3DXVec4Length - ( const D3DXVECTOR4 *pV ); - -float D3DXVec4LengthSq - ( const D3DXVECTOR4 *pV ); - -float D3DXVec4Dot - ( const D3DXVECTOR4 *pV1, const D3DXVECTOR4 *pV2 ); - -D3DXVECTOR4* D3DXVec4Add - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV1, const D3DXVECTOR4 *pV2); - -D3DXVECTOR4* D3DXVec4Subtract - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV1, const D3DXVECTOR4 *pV2); - -// Minimize each component. x = min(x1, x2), y = min(y1, y2), ... -D3DXVECTOR4* D3DXVec4Minimize - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV1, const D3DXVECTOR4 *pV2); - -// Maximize each component. x = max(x1, x2), y = max(y1, y2), ... -D3DXVECTOR4* D3DXVec4Maximize - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV1, const D3DXVECTOR4 *pV2); - -D3DXVECTOR4* D3DXVec4Scale - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV, float s); - -// Linear interpolation. V1 + s(V2-V1) -D3DXVECTOR4* D3DXVec4Lerp - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV1, const D3DXVECTOR4 *pV2, - float s ); - -// non-inline -#ifdef __cplusplus -extern "C" { -#endif - -// Cross-product in 4 dimensions. -D3DXVECTOR4* WINAPI D3DXVec4Cross - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV1, const D3DXVECTOR4 *pV2, - const D3DXVECTOR4 *pV3); - -D3DXVECTOR4* WINAPI D3DXVec4Normalize - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV ); - -// Hermite interpolation between position V1, tangent T1 (when s == 0) -// and position V2, tangent T2 (when s == 1). -D3DXVECTOR4* WINAPI D3DXVec4Hermite - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV1, const D3DXVECTOR4 *pT1, - const D3DXVECTOR4 *pV2, const D3DXVECTOR4 *pT2, float s ); - -// Barycentric coordinates. V1 + f(V2-V1) + g(V3-V1) -D3DXVECTOR4* WINAPI D3DXVec4BaryCentric - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV1, const D3DXVECTOR4 *pV2, - const D3DXVECTOR4 *pV3, float f, float g); - -// Transform vector by matrix. -D3DXVECTOR4* WINAPI D3DXVec4Transform - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV, const D3DXMATRIX *pM ); - -#ifdef __cplusplus -} -#endif - - -//-------------------------- -// 4D Matrix -//-------------------------- - -// inline - -D3DXMATRIX* D3DXMatrixIdentity - ( D3DXMATRIX *pOut ); - -BOOL D3DXMatrixIsIdentity - ( const D3DXMATRIX *pM ); - - -// non-inline -#ifdef __cplusplus -extern "C" { -#endif - -float WINAPI D3DXMatrixfDeterminant - ( const D3DXMATRIX *pM ); - -// Matrix multiplication. The result represents the transformation M2 -// followed by the transformation M1. (Out = M1 * M2) -D3DXMATRIX* WINAPI D3DXMatrixMultiply - ( D3DXMATRIX *pOut, const D3DXMATRIX *pM1, const D3DXMATRIX *pM2 ); - -D3DXMATRIX* WINAPI D3DXMatrixTranspose - ( D3DXMATRIX *pOut, const D3DXMATRIX *pM ); - -// Calculate inverse of matrix. Inversion my fail, in which case NULL will -// be returned. The determinant of pM is also returned it pfDeterminant -// is non-NULL. -D3DXMATRIX* WINAPI D3DXMatrixInverse - ( D3DXMATRIX *pOut, float *pfDeterminant, const D3DXMATRIX *pM ); - -// Build a matrix which scales by (sx, sy, sz) -D3DXMATRIX* WINAPI D3DXMatrixScaling - ( D3DXMATRIX *pOut, float sx, float sy, float sz ); - -// Build a matrix which translates by (x, y, z) -D3DXMATRIX* WINAPI D3DXMatrixTranslation - ( D3DXMATRIX *pOut, float x, float y, float z ); - -// Build a matrix which rotates around the X axis -D3DXMATRIX* WINAPI D3DXMatrixRotationX - ( D3DXMATRIX *pOut, float angle ); - -// Build a matrix which rotates around the Y axis -D3DXMATRIX* WINAPI D3DXMatrixRotationY - ( D3DXMATRIX *pOut, float angle ); - -// Build a matrix which rotates around the Z axis -D3DXMATRIX* WINAPI D3DXMatrixRotationZ - ( D3DXMATRIX *pOut, float angle ); - -// Build a matrix which rotates around an arbitrary axis -D3DXMATRIX* WINAPI D3DXMatrixRotationAxis - ( D3DXMATRIX *pOut, const D3DXVECTOR3 *pV, float angle ); - -// Build a matrix from a quaternion -D3DXMATRIX* WINAPI D3DXMatrixRotationQuaternion - ( D3DXMATRIX *pOut, const D3DXQUATERNION *pQ); - -// Yaw around the Y axis, a pitch around the X axis, -// and a roll around the Z axis. -D3DXMATRIX* WINAPI D3DXMatrixRotationYawPitchRoll - ( D3DXMATRIX *pOut, float yaw, float pitch, float roll ); - - -// Build transformation matrix. NULL arguments are treated as identity. -// Mout = Msc-1 * Msr-1 * Ms * Msr * Msc * Mrc-1 * Mr * Mrc * Mt -D3DXMATRIX* WINAPI D3DXMatrixTransformation - ( D3DXMATRIX *pOut, const D3DXVECTOR3 *pScalingCenter, - const D3DXQUATERNION *pScalingRotation, const D3DXVECTOR3 *pScaling, - const D3DXVECTOR3 *pRotationCenter, const D3DXQUATERNION *pRotation, - const D3DXVECTOR3 *pTranslation); - -// Build affine transformation matrix. NULL arguments are treated as identity. -// Mout = Ms * Mrc-1 * Mr * Mrc * Mt -D3DXMATRIX* WINAPI D3DXMatrixAffineTransformation - ( D3DXMATRIX *pOut, float Scaling, const D3DXVECTOR3 *pRotationCenter, - const D3DXQUATERNION *pRotation, const D3DXVECTOR3 *pTranslation); - -// Build a lookat matrix. (right-handed) -D3DXMATRIX* WINAPI D3DXMatrixLookAt - ( D3DXMATRIX *pOut, const D3DXVECTOR3 *pEye, const D3DXVECTOR3 *pAt, - const D3DXVECTOR3 *pUp ); - -// Build a lookat matrix. (left-handed) -D3DXMATRIX* WINAPI D3DXMatrixLookAtLH - ( D3DXMATRIX *pOut, const D3DXVECTOR3 *pEye, const D3DXVECTOR3 *pAt, - const D3DXVECTOR3 *pUp ); - -// Build a perspective projection matrix. (right-handed) -D3DXMATRIX* WINAPI D3DXMatrixPerspective - ( D3DXMATRIX *pOut, float w, float h, float zn, float zf ); - -// Build a perspective projection matrix. (left-handed) -D3DXMATRIX* WINAPI D3DXMatrixPerspectiveLH - ( D3DXMATRIX *pOut, float w, float h, float zn, float zf ); - -// Build a perspective projection matrix. (right-handed) -D3DXMATRIX* WINAPI D3DXMatrixPerspectiveFov - ( D3DXMATRIX *pOut, float fovy, float aspect, float zn, float zf ); - -// Build a perspective projection matrix. (left-handed) -D3DXMATRIX* WINAPI D3DXMatrixPerspectiveFovLH - ( D3DXMATRIX *pOut, float fovy, float aspect, float zn, float zf ); - -// Build a perspective projection matrix. (right-handed) -D3DXMATRIX* WINAPI D3DXMatrixPerspectiveOffCenter - ( D3DXMATRIX *pOut, float l, float r, float b, float t, float zn, - float zf ); - -// Build a perspective projection matrix. (left-handed) -D3DXMATRIX* WINAPI D3DXMatrixPerspectiveOffCenterLH - ( D3DXMATRIX *pOut, float l, float r, float b, float t, float zn, - float zf ); - -// Build an ortho projection matrix. (right-handed) -D3DXMATRIX* WINAPI D3DXMatrixOrtho - ( D3DXMATRIX *pOut, float w, float h, float zn, float zf ); - -// Build an ortho projection matrix. (left-handed) -D3DXMATRIX* WINAPI D3DXMatrixOrthoLH - ( D3DXMATRIX *pOut, float w, float h, float zn, float zf ); - -// Build an ortho projection matrix. (right-handed) -D3DXMATRIX* WINAPI D3DXMatrixOrthoOffCenter - ( D3DXMATRIX *pOut, float l, float r, float b, float t, float zn, - float zf ); - -// Build an ortho projection matrix. (left-handed) -D3DXMATRIX* WINAPI D3DXMatrixOrthoOffCenterLH - ( D3DXMATRIX *pOut, float l, float r, float b, float t, float zn, - float zf ); - -// Build a matrix which flattens geometry into a plane, as if casting -// a shadow from a light. -D3DXMATRIX* WINAPI D3DXMatrixShadow - ( D3DXMATRIX *pOut, const D3DXVECTOR4 *pLight, - const D3DXPLANE *pPlane ); - -// Build a matrix which reflects the coordinate system about a plane -D3DXMATRIX* WINAPI D3DXMatrixReflect - ( D3DXMATRIX *pOut, const D3DXPLANE *pPlane ); - -#ifdef __cplusplus -} -#endif - - -//-------------------------- -// Quaternion -//-------------------------- - -// inline - -float D3DXQuaternionLength - ( const D3DXQUATERNION *pQ ); - -// Length squared, or "norm" -float D3DXQuaternionLengthSq - ( const D3DXQUATERNION *pQ ); - -float D3DXQuaternionDot - ( const D3DXQUATERNION *pQ1, const D3DXQUATERNION *pQ2 ); - -// (0, 0, 0, 1) -D3DXQUATERNION* D3DXQuaternionIdentity - ( D3DXQUATERNION *pOut ); - -BOOL D3DXQuaternionIsIdentity - ( const D3DXQUATERNION *pQ ); - -// (-x, -y, -z, w) -D3DXQUATERNION* D3DXQuaternionConjugate - ( D3DXQUATERNION *pOut, const D3DXQUATERNION *pQ ); - - -// non-inline -#ifdef __cplusplus -extern "C" { -#endif - -// Compute a quaternin's axis and angle of rotation. Expects unit quaternions. -void WINAPI D3DXQuaternionToAxisAngle - ( const D3DXQUATERNION *pQ, D3DXVECTOR3 *pAxis, float *pAngle ); - -// Build a quaternion from a rotation matrix. -D3DXQUATERNION* WINAPI D3DXQuaternionRotationMatrix - ( D3DXQUATERNION *pOut, const D3DXMATRIX *pM); - -// Rotation about arbitrary axis. -D3DXQUATERNION* WINAPI D3DXQuaternionRotationAxis - ( D3DXQUATERNION *pOut, const D3DXVECTOR3 *pV, float angle ); - -// Yaw around the Y axis, a pitch around the X axis, -// and a roll around the Z axis. -D3DXQUATERNION* WINAPI D3DXQuaternionRotationYawPitchRoll - ( D3DXQUATERNION *pOut, float yaw, float pitch, float roll ); - -// Quaternion multiplication. The result represents the rotation Q2 -// followed by the rotation Q1. (Out = Q2 * Q1) -D3DXQUATERNION* WINAPI D3DXQuaternionMultiply - ( D3DXQUATERNION *pOut, const D3DXQUATERNION *pQ1, - const D3DXQUATERNION *pQ2 ); - -D3DXQUATERNION* WINAPI D3DXQuaternionNormalize - ( D3DXQUATERNION *pOut, const D3DXQUATERNION *pQ ); - -// Conjugate and re-norm -D3DXQUATERNION* WINAPI D3DXQuaternionInverse - ( D3DXQUATERNION *pOut, const D3DXQUATERNION *pQ ); - -// Expects unit quaternions. -// if q = (cos(theta), sin(theta) * v); ln(q) = (0, theta * v) -D3DXQUATERNION* WINAPI D3DXQuaternionLn - ( D3DXQUATERNION *pOut, const D3DXQUATERNION *pQ ); - -// Expects pure quaternions. (w == 0) w is ignored in calculation. -// if q = (0, theta * v); exp(q) = (cos(theta), sin(theta) * v) -D3DXQUATERNION* WINAPI D3DXQuaternionExp - ( D3DXQUATERNION *pOut, const D3DXQUATERNION *pQ ); - -// Spherical linear interpolation between Q1 (s == 0) and Q2 (s == 1). -// Expects unit quaternions. -D3DXQUATERNION* WINAPI D3DXQuaternionSlerp - ( D3DXQUATERNION *pOut, const D3DXQUATERNION *pQ1, - const D3DXQUATERNION *pQ2, float t ); - -// Spherical quadrangle interpolation. -// Slerp(Slerp(Q1, Q4, t), Slerp(Q2, Q3, t), 2t(1-t)) -D3DXQUATERNION* WINAPI D3DXQuaternionSquad - ( D3DXQUATERNION *pOut, const D3DXQUATERNION *pQ1, - const D3DXQUATERNION *pQ2, const D3DXQUATERNION *pQ3, - const D3DXQUATERNION *pQ4, float t ); - -// Slerp(Slerp(Q1, Q2, f+g), Slerp(Q1, Q3, f+g), g/(f+g)) -D3DXQUATERNION* WINAPI D3DXQuaternionBaryCentric - ( D3DXQUATERNION *pOut, const D3DXQUATERNION *pQ1, - const D3DXQUATERNION *pQ2, const D3DXQUATERNION *pQ3, - float f, float g ); - -#ifdef __cplusplus -} -#endif - - -//-------------------------- -// Plane -//-------------------------- - -// inline - -// ax + by + cz + dw -float D3DXPlaneDot - ( const D3DXPLANE *pP, const D3DXVECTOR4 *pV); - -// ax + by + cz + d -float D3DXPlaneDotCoord - ( const D3DXPLANE *pP, const D3DXVECTOR3 *pV); - -// ax + by + cz -float D3DXPlaneDotNormal - ( const D3DXPLANE *pP, const D3DXVECTOR3 *pV); - -// non-inline -#ifdef __cplusplus -extern "C" { -#endif - -// Normalize plane (so that |a,b,c| == 1) -D3DXPLANE* WINAPI D3DXPlaneNormalize - ( D3DXPLANE *pOut, const D3DXPLANE *pP); - -// Find the intersection between a plane and a line. If the line is -// parallel to the plane, NULL is returned. -D3DXVECTOR3* WINAPI D3DXPlaneIntersectLine - ( D3DXVECTOR3 *pOut, const D3DXPLANE *pP, const D3DXVECTOR3 *pV1, - const D3DXVECTOR3 *pV2); - -// Construct a plane from a point and a normal -D3DXPLANE* WINAPI D3DXPlaneFromPointNormal - ( D3DXPLANE *pOut, const D3DXVECTOR3 *pPoint, const D3DXVECTOR3 *pNormal); - -// Construct a plane from 3 points -D3DXPLANE* WINAPI D3DXPlaneFromPoints - ( D3DXPLANE *pOut, const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pV2, - const D3DXVECTOR3 *pV3); - -// Transform a plane by a matrix. The vector (a,b,c) must be normal. -// M must be an affine transform. -D3DXPLANE* WINAPI D3DXPlaneTransform - ( D3DXPLANE *pOut, const D3DXPLANE *pP, const D3DXMATRIX *pM ); - -#ifdef __cplusplus -} -#endif - - -//-------------------------- -// Color -//-------------------------- - -// inline - -// (1-r, 1-g, 1-b, a) -D3DXCOLOR* D3DXColorNegative - (D3DXCOLOR *pOut, const D3DXCOLOR *pC); - -D3DXCOLOR* D3DXColorAdd - (D3DXCOLOR *pOut, const D3DXCOLOR *pC1, const D3DXCOLOR *pC2); - -D3DXCOLOR* D3DXColorSubtract - (D3DXCOLOR *pOut, const D3DXCOLOR *pC1, const D3DXCOLOR *pC2); - -D3DXCOLOR* D3DXColorScale - (D3DXCOLOR *pOut, const D3DXCOLOR *pC, float s); - -// (r1*r2, g1*g2, b1*b2, a1*a2) -D3DXCOLOR* D3DXColorModulate - (D3DXCOLOR *pOut, const D3DXCOLOR *pC1, const D3DXCOLOR *pC2); - -// Linear interpolation of r,g,b, and a. C1 + s(C2-C1) -D3DXCOLOR* D3DXColorLerp - (D3DXCOLOR *pOut, const D3DXCOLOR *pC1, const D3DXCOLOR *pC2, float s); - -// non-inline -#ifdef __cplusplus -extern "C" { -#endif - -// Interpolate r,g,b between desaturated color and color. -// DesaturatedColor + s(Color - DesaturatedColor) -D3DXCOLOR* WINAPI D3DXColorAdjustSaturation - (D3DXCOLOR *pOut, const D3DXCOLOR *pC, float s); - -// Interpolate r,g,b between 50% grey and color. Grey + s(Color - Grey) -D3DXCOLOR* WINAPI D3DXColorAdjustContrast - (D3DXCOLOR *pOut, const D3DXCOLOR *pC, float c); - -#ifdef __cplusplus -} -#endif - - - - - - -//=========================================================================== -// -// Matrix Stack -// -//=========================================================================== - -DECLARE_INTERFACE_(ID3DXMatrixStack, IUnknown) -{ - // - // IUnknown methods - // - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - // - // ID3DXMatrixStack methods - // - - // Pops the top of the stack, returns the current top - // *after* popping the top. - STDMETHOD(Pop)(THIS) PURE; - - // Pushes the stack by one, duplicating the current matrix. - STDMETHOD(Push)(THIS) PURE; - - // Loads identity in the current matrix. - STDMETHOD(LoadIdentity)(THIS) PURE; - - // Loads the given matrix into the current matrix - STDMETHOD(LoadMatrix)(THIS_ const D3DXMATRIX* pM ) PURE; - - // Right-Multiplies the given matrix to the current matrix. - // (transformation is about the current world origin) - STDMETHOD(MultMatrix)(THIS_ const D3DXMATRIX* pM ) PURE; - - // Left-Multiplies the given matrix to the current matrix - // (transformation is about the local origin of the object) - STDMETHOD(MultMatrixLocal)(THIS_ const D3DXMATRIX* pM ) PURE; - - // Right multiply the current matrix with the computed rotation - // matrix, counterclockwise about the given axis with the given angle. - // (rotation is about the current world origin) - STDMETHOD(RotateAxis) - (THIS_ const D3DXVECTOR3* pV, float angle) PURE; - - // Left multiply the current matrix with the computed rotation - // matrix, counterclockwise about the given axis with the given angle. - // (rotation is about the local origin of the object) - STDMETHOD(RotateAxisLocal) - (THIS_ const D3DXVECTOR3* pV, float angle) PURE; - - // Right multiply the current matrix with the computed rotation - // matrix. All angles are counterclockwise. (rotation is about the - // current world origin) - - // The rotation is composed of a yaw around the Y axis, a pitch around - // the X axis, and a roll around the Z axis. - STDMETHOD(RotateYawPitchRoll) - (THIS_ float yaw, float pitch, float roll) PURE; - - // Left multiply the current matrix with the computed rotation - // matrix. All angles are counterclockwise. (rotation is about the - // local origin of the object) - - // The rotation is composed of a yaw around the Y axis, a pitch around - // the X axis, and a roll around the Z axis. - STDMETHOD(RotateYawPitchRollLocal) - (THIS_ float yaw, float pitch, float roll) PURE; - - // Right multiply the current matrix with the computed scale - // matrix. (transformation is about the current world origin) - STDMETHOD(Scale)(THIS_ float x, float y, float z) PURE; - - // Left multiply the current matrix with the computed scale - // matrix. (transformation is about the local origin of the object) - STDMETHOD(ScaleLocal)(THIS_ float x, float y, float z) PURE; - - // Right multiply the current matrix with the computed translation - // matrix. (transformation is about the current world origin) - STDMETHOD(Translate)(THIS_ float x, float y, float z ) PURE; - - // Left multiply the current matrix with the computed translation - // matrix. (transformation is about the local origin of the object) - STDMETHOD(TranslateLocal)(THIS_ float x, float y, float z) PURE; - - // Obtain the current matrix at the top of the stack - STDMETHOD_(D3DXMATRIX*, GetTop)(THIS) PURE; -}; - -#ifdef __cplusplus -extern "C" { -#endif - -HRESULT WINAPI D3DXCreateMatrixStack( DWORD flags, LPD3DXMATRIXSTACK *ppStack ); - -#ifdef __cplusplus -} -#endif - -#include "d3dxmath.inl" - -#pragma warning(default:4201) - -#endif // __D3DXMATH_H__ diff --git a/import/DirectX8/include/d3dxmath.inl b/import/DirectX8/include/d3dxmath.inl deleted file mode 100644 index 05f043197..000000000 --- a/import/DirectX8/include/d3dxmath.inl +++ /dev/null @@ -1,1809 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) Microsoft Corporation. All Rights Reserved. -// -// File: d3dxmath.inl -// Content: D3DX math inline functions -// -////////////////////////////////////////////////////////////////////////////// - -#ifndef __D3DXMATH_INL__ -#define __D3DXMATH_INL__ - - -//=========================================================================== -// -// Inline Class Methods -// -//=========================================================================== - -#ifdef __cplusplus - -//-------------------------- -// 2D Vector -//-------------------------- - -D3DXINLINE -D3DXVECTOR2::D3DXVECTOR2( const float *pf ) -{ -#ifdef D3DX_DEBUG - if(!pf) - return; -#endif - - x = pf[0]; - y = pf[1]; -} - -D3DXINLINE -D3DXVECTOR2::D3DXVECTOR2( float fx, float fy ) -{ - x = fx; - y = fy; -} - -// casting -D3DXINLINE -D3DXVECTOR2::operator float* () -{ - return (float *) &x; -} - -D3DXINLINE -D3DXVECTOR2::operator const float* () const -{ - return (const float *) &x; -} - -// assignment operators -D3DXINLINE D3DXVECTOR2& -D3DXVECTOR2::operator += ( const D3DXVECTOR2& v ) -{ - x += v.x; - y += v.y; - return *this; -} - -D3DXINLINE D3DXVECTOR2& -D3DXVECTOR2::operator -= ( const D3DXVECTOR2& v ) -{ - x -= v.x; - y -= v.y; - return *this; -} - -D3DXINLINE D3DXVECTOR2& -D3DXVECTOR2::operator *= ( float f ) -{ - x *= f; - y *= f; - return *this; -} - -D3DXINLINE D3DXVECTOR2& -D3DXVECTOR2::operator /= ( float f ) -{ - float fInv = 1.0f / f; - x *= fInv; - y *= fInv; - return *this; -} - -// unary operators -D3DXINLINE D3DXVECTOR2 -D3DXVECTOR2::operator + () const -{ - return *this; -} - -D3DXINLINE D3DXVECTOR2 -D3DXVECTOR2::operator - () const -{ - return D3DXVECTOR2(-x, -y); -} - -// binary operators -D3DXINLINE D3DXVECTOR2 -D3DXVECTOR2::operator + ( const D3DXVECTOR2& v ) const -{ - return D3DXVECTOR2(x + v.x, y + v.y); -} - -D3DXINLINE D3DXVECTOR2 -D3DXVECTOR2::operator - ( const D3DXVECTOR2& v ) const -{ - return D3DXVECTOR2(x - v.x, y - v.y); -} - -D3DXINLINE D3DXVECTOR2 -D3DXVECTOR2::operator * ( float f ) const -{ - return D3DXVECTOR2(x * f, y * f); -} - -D3DXINLINE D3DXVECTOR2 -D3DXVECTOR2::operator / ( float f ) const -{ - float fInv = 1.0f / f; - return D3DXVECTOR2(x * fInv, y * fInv); -} - - -D3DXINLINE D3DXVECTOR2 -operator * ( float f, const D3DXVECTOR2& v ) -{ - return D3DXVECTOR2(f * v.x, f * v.y); -} - -D3DXINLINE BOOL -D3DXVECTOR2::operator == ( const D3DXVECTOR2& v ) const -{ - return x == v.x && y == v.y; -} - -D3DXINLINE BOOL -D3DXVECTOR2::operator != ( const D3DXVECTOR2& v ) const -{ - return x != v.x || y != v.y; -} - - - - -//-------------------------- -// 3D Vector -//-------------------------- -D3DXINLINE -D3DXVECTOR3::D3DXVECTOR3( const float *pf ) -{ -#ifdef D3DX_DEBUG - if(!pf) - return; -#endif - - x = pf[0]; - y = pf[1]; - z = pf[2]; -} - -D3DXINLINE -D3DXVECTOR3::D3DXVECTOR3( const D3DVECTOR& v ) -{ - x = v.x; - y = v.y; - z = v.z; -} - -D3DXINLINE -D3DXVECTOR3::D3DXVECTOR3( float fx, float fy, float fz ) -{ - x = fx; - y = fy; - z = fz; -} - - -// casting -D3DXINLINE -D3DXVECTOR3::operator float* () -{ - return (float *) &x; -} - -D3DXINLINE -D3DXVECTOR3::operator const float* () const -{ - return (const float *) &x; -} - - -D3DXINLINE -D3DXVECTOR3::operator D3DVECTOR* () -{ - return (D3DVECTOR *) &x; -} - -D3DXINLINE -D3DXVECTOR3::operator const D3DVECTOR* () const -{ - return (const D3DVECTOR *) &x; -} - - -D3DXINLINE -D3DXVECTOR3::operator D3DVECTOR& () -{ - return *((D3DVECTOR *) &x); -} - -D3DXINLINE -D3DXVECTOR3::operator const D3DVECTOR& () const -{ - return *((const D3DVECTOR *) &x); -} - - -// assignment operators -D3DXINLINE D3DXVECTOR3& -D3DXVECTOR3::operator += ( const D3DXVECTOR3& v ) -{ - x += v.x; - y += v.y; - z += v.z; - return *this; -} - -D3DXINLINE D3DXVECTOR3& -D3DXVECTOR3::operator -= ( const D3DXVECTOR3& v ) -{ - x -= v.x; - y -= v.y; - z -= v.z; - return *this; -} - -D3DXINLINE D3DXVECTOR3& -D3DXVECTOR3::operator *= ( float f ) -{ - x *= f; - y *= f; - z *= f; - return *this; -} - -D3DXINLINE D3DXVECTOR3& -D3DXVECTOR3::operator /= ( float f ) -{ - float fInv = 1.0f / f; - x *= fInv; - y *= fInv; - z *= fInv; - return *this; -} - - -// unary operators -D3DXINLINE D3DXVECTOR3 -D3DXVECTOR3::operator + () const -{ - return *this; -} - -D3DXINLINE D3DXVECTOR3 -D3DXVECTOR3::operator - () const -{ - return D3DXVECTOR3(-x, -y, -z); -} - - -// binary operators -D3DXINLINE D3DXVECTOR3 -D3DXVECTOR3::operator + ( const D3DXVECTOR3& v ) const -{ - return D3DXVECTOR3(x + v.x, y + v.y, z + v.z); -} - -D3DXINLINE D3DXVECTOR3 -D3DXVECTOR3::operator - ( const D3DXVECTOR3& v ) const -{ - return D3DXVECTOR3(x - v.x, y - v.y, z - v.z); -} - -D3DXINLINE D3DXVECTOR3 -D3DXVECTOR3::operator * ( float f ) const -{ - return D3DXVECTOR3(x * f, y * f, z * f); -} - -D3DXINLINE D3DXVECTOR3 -D3DXVECTOR3::operator / ( float f ) const -{ - float fInv = 1.0f / f; - return D3DXVECTOR3(x * fInv, y * fInv, z * fInv); -} - - -D3DXINLINE D3DXVECTOR3 -operator * ( float f, const struct D3DXVECTOR3& v ) -{ - return D3DXVECTOR3(f * v.x, f * v.y, f * v.z); -} - - -D3DXINLINE BOOL -D3DXVECTOR3::operator == ( const D3DXVECTOR3& v ) const -{ - return x == v.x && y == v.y && z == v.z; -} - -D3DXINLINE BOOL -D3DXVECTOR3::operator != ( const D3DXVECTOR3& v ) const -{ - return x != v.x || y != v.y || z != v.z; -} - - - -//-------------------------- -// 4D Vector -//-------------------------- -D3DXINLINE -D3DXVECTOR4::D3DXVECTOR4( const float *pf ) -{ -#ifdef D3DX_DEBUG - if(!pf) - return; -#endif - - x = pf[0]; - y = pf[1]; - z = pf[2]; - w = pf[3]; -} - -D3DXINLINE -D3DXVECTOR4::D3DXVECTOR4( float fx, float fy, float fz, float fw ) -{ - x = fx; - y = fy; - z = fz; - w = fw; -} - - -// casting -D3DXINLINE -D3DXVECTOR4::operator float* () -{ - return (float *) &x; -} - -D3DXINLINE -D3DXVECTOR4::operator const float* () const -{ - return (const float *) &x; -} - - -// assignment operators -D3DXINLINE D3DXVECTOR4& -D3DXVECTOR4::operator += ( const D3DXVECTOR4& v ) -{ - x += v.x; - y += v.y; - z += v.z; - w += v.w; - return *this; -} - -D3DXINLINE D3DXVECTOR4& -D3DXVECTOR4::operator -= ( const D3DXVECTOR4& v ) -{ - x -= v.x; - y -= v.y; - z -= v.z; - w -= v.w; - return *this; -} - -D3DXINLINE D3DXVECTOR4& -D3DXVECTOR4::operator *= ( float f ) -{ - x *= f; - y *= f; - z *= f; - w *= f; - return *this; -} - -D3DXINLINE D3DXVECTOR4& -D3DXVECTOR4::operator /= ( float f ) -{ - float fInv = 1.0f / f; - x *= fInv; - y *= fInv; - z *= fInv; - w *= fInv; - return *this; -} - - -// unary operators -D3DXINLINE D3DXVECTOR4 -D3DXVECTOR4::operator + () const -{ - return *this; -} - -D3DXINLINE D3DXVECTOR4 -D3DXVECTOR4::operator - () const -{ - return D3DXVECTOR4(-x, -y, -z, -w); -} - - -// binary operators -D3DXINLINE D3DXVECTOR4 -D3DXVECTOR4::operator + ( const D3DXVECTOR4& v ) const -{ - return D3DXVECTOR4(x + v.x, y + v.y, z + v.z, w + v.w); -} - -D3DXINLINE D3DXVECTOR4 -D3DXVECTOR4::operator - ( const D3DXVECTOR4& v ) const -{ - return D3DXVECTOR4(x - v.x, y - v.y, z - v.z, w - v.w); -} - -D3DXINLINE D3DXVECTOR4 -D3DXVECTOR4::operator * ( float f ) const -{ - return D3DXVECTOR4(x * f, y * f, z * f, w * f); -} - -D3DXINLINE D3DXVECTOR4 -D3DXVECTOR4::operator / ( float f ) const -{ - float fInv = 1.0f / f; - return D3DXVECTOR4(x * fInv, y * fInv, z * fInv, w * fInv); -} - - -D3DXINLINE D3DXVECTOR4 -operator * ( float f, const D3DXVECTOR4& v ) -{ - return D3DXVECTOR4(f * v.x, f * v.y, f * v.z, f * v.w); -} - - -D3DXINLINE BOOL -D3DXVECTOR4::operator == ( const D3DXVECTOR4& v ) const -{ - return x == v.x && y == v.y && z == v.z && w == v.w; -} - -D3DXINLINE BOOL -D3DXVECTOR4::operator != ( const D3DXVECTOR4& v ) const -{ - return x != v.x || y != v.y || z != v.z || w != v.w; -} - - -//-------------------------- -// Matrix -//-------------------------- -D3DXINLINE -D3DXMATRIX::D3DXMATRIX( const float* pf ) -{ -#ifdef D3DX_DEBUG - if(!pf) - return; -#endif - - memcpy(&m00, pf, sizeof(D3DXMATRIX)); -} - -D3DXINLINE -D3DXMATRIX::D3DXMATRIX( const D3DMATRIX& mat ) -{ - memcpy(&m00, &mat, sizeof(D3DXMATRIX)); -} - -D3DXINLINE -D3DXMATRIX::D3DXMATRIX( float f00, float f01, float f02, float f03, - float f10, float f11, float f12, float f13, - float f20, float f21, float f22, float f23, - float f30, float f31, float f32, float f33 ) -{ - m00 = f00; m01 = f01; m02 = f02; m03 = f03; - m10 = f10; m11 = f11; m12 = f12; m13 = f13; - m20 = f20; m21 = f21; m22 = f22; m23 = f23; - m30 = f30; m31 = f31; m32 = f32; m33 = f33; -} - - - -// access grants -D3DXINLINE float& -D3DXMATRIX::operator () ( UINT iRow, UINT iCol ) -{ - return m[iRow][iCol]; -} - -D3DXINLINE float -D3DXMATRIX::operator () ( UINT iRow, UINT iCol ) const -{ - return m[iRow][iCol]; -} - - -// casting operators -D3DXINLINE -D3DXMATRIX::operator float* () -{ - return (float *) &m00; -} - -D3DXINLINE -D3DXMATRIX::operator const float* () const -{ - return (const float *) &m00; -} - - -D3DXINLINE -D3DXMATRIX::operator D3DMATRIX* () -{ - return (D3DMATRIX *) &m00; -} - -D3DXINLINE -D3DXMATRIX::operator const D3DMATRIX* () const -{ - return (const D3DMATRIX *) &m00; -} - - -D3DXINLINE -D3DXMATRIX::operator D3DMATRIX& () -{ - return *((D3DMATRIX *) &m00); -} - -D3DXINLINE -D3DXMATRIX::operator const D3DMATRIX& () const -{ - return *((const D3DMATRIX *) &m00); -} - - -// assignment operators -D3DXINLINE D3DXMATRIX& -D3DXMATRIX::operator *= ( const D3DXMATRIX& mat ) -{ - D3DXMatrixMultiply(this, this, &mat); - return *this; -} - -D3DXINLINE D3DXMATRIX& -D3DXMATRIX::operator += ( const D3DXMATRIX& mat ) -{ - m00 += mat.m00; m01 += mat.m01; m02 += mat.m02; m03 += mat.m03; - m10 += mat.m10; m11 += mat.m11; m12 += mat.m12; m13 += mat.m13; - m20 += mat.m20; m21 += mat.m21; m22 += mat.m22; m23 += mat.m23; - m30 += mat.m30; m31 += mat.m31; m32 += mat.m32; m33 += mat.m33; - return *this; -} - -D3DXINLINE D3DXMATRIX& -D3DXMATRIX::operator -= ( const D3DXMATRIX& mat ) -{ - m00 -= mat.m00; m01 -= mat.m01; m02 -= mat.m02; m03 -= mat.m03; - m10 -= mat.m10; m11 -= mat.m11; m12 -= mat.m12; m13 -= mat.m13; - m20 -= mat.m20; m21 -= mat.m21; m22 -= mat.m22; m23 -= mat.m23; - m30 -= mat.m30; m31 -= mat.m31; m32 -= mat.m32; m33 -= mat.m33; - return *this; -} - -D3DXINLINE D3DXMATRIX& -D3DXMATRIX::operator *= ( float f ) -{ - m00 *= f; m01 *= f; m02 *= f; m03 *= f; - m10 *= f; m11 *= f; m12 *= f; m13 *= f; - m20 *= f; m21 *= f; m22 *= f; m23 *= f; - m30 *= f; m31 *= f; m32 *= f; m33 *= f; - return *this; -} - -D3DXINLINE D3DXMATRIX& -D3DXMATRIX::operator /= ( float f ) -{ - float fInv = 1.0f / f; - m00 *= fInv; m01 *= fInv; m02 *= fInv; m03 *= fInv; - m10 *= fInv; m11 *= fInv; m12 *= fInv; m13 *= fInv; - m20 *= fInv; m21 *= fInv; m22 *= fInv; m23 *= fInv; - m30 *= fInv; m31 *= fInv; m32 *= fInv; m33 *= fInv; - return *this; -} - - -// unary operators -D3DXINLINE D3DXMATRIX -D3DXMATRIX::operator + () const -{ - return *this; -} - -D3DXINLINE D3DXMATRIX -D3DXMATRIX::operator - () const -{ - return D3DXMATRIX(-m00, -m01, -m02, -m03, - -m10, -m11, -m12, -m13, - -m20, -m21, -m22, -m23, - -m30, -m31, -m32, -m33); -} - - -// binary operators -D3DXINLINE D3DXMATRIX -D3DXMATRIX::operator * ( const D3DXMATRIX& mat ) const -{ - D3DXMATRIX matT; - D3DXMatrixMultiply(&matT, this, &mat); - return matT; -} - -D3DXINLINE D3DXMATRIX -D3DXMATRIX::operator + ( const D3DXMATRIX& mat ) const -{ - return D3DXMATRIX(m00 + mat.m00, m01 + mat.m01, m02 + mat.m02, m03 + mat.m03, - m10 + mat.m10, m11 + mat.m11, m12 + mat.m12, m13 + mat.m13, - m20 + mat.m20, m21 + mat.m21, m22 + mat.m22, m23 + mat.m23, - m30 + mat.m30, m31 + mat.m31, m32 + mat.m32, m33 + mat.m33); -} - -D3DXINLINE D3DXMATRIX -D3DXMATRIX::operator - ( const D3DXMATRIX& mat ) const -{ - return D3DXMATRIX(m00 - mat.m00, m01 - mat.m01, m02 - mat.m02, m03 - mat.m03, - m10 - mat.m10, m11 - mat.m11, m12 - mat.m12, m13 - mat.m13, - m20 - mat.m20, m21 - mat.m21, m22 - mat.m22, m23 - mat.m23, - m30 - mat.m30, m31 - mat.m31, m32 - mat.m32, m33 - mat.m33); -} - -D3DXINLINE D3DXMATRIX -D3DXMATRIX::operator * ( float f ) const -{ - return D3DXMATRIX(m00 * f, m01 * f, m02 * f, m03 * f, - m10 * f, m11 * f, m12 * f, m13 * f, - m20 * f, m21 * f, m22 * f, m23 * f, - m30 * f, m31 * f, m32 * f, m33 * f); -} - -D3DXINLINE D3DXMATRIX -D3DXMATRIX::operator / ( float f ) const -{ - float fInv = 1.0f / f; - return D3DXMATRIX(m00 * fInv, m01 * fInv, m02 * fInv, m03 * fInv, - m10 * fInv, m11 * fInv, m12 * fInv, m13 * fInv, - m20 * fInv, m21 * fInv, m22 * fInv, m23 * fInv, - m30 * fInv, m31 * fInv, m32 * fInv, m33 * fInv); -} - - -D3DXINLINE D3DXMATRIX -operator * ( float f, const D3DXMATRIX& mat ) -{ - return D3DXMATRIX(f * mat.m00, f * mat.m01, f * mat.m02, f * mat.m03, - f * mat.m10, f * mat.m11, f * mat.m12, f * mat.m13, - f * mat.m20, f * mat.m21, f * mat.m22, f * mat.m23, - f * mat.m30, f * mat.m31, f * mat.m32, f * mat.m33); -} - - -D3DXINLINE BOOL -D3DXMATRIX::operator == ( const D3DXMATRIX& mat ) const -{ - return 0 == memcmp(this, &mat, sizeof(D3DXMATRIX)); -} - -D3DXINLINE BOOL -D3DXMATRIX::operator != ( const D3DXMATRIX& mat ) const -{ - return 0 != memcmp(this, &mat, sizeof(D3DXMATRIX)); -} - - - -//-------------------------- -// Quaternion -//-------------------------- - -D3DXINLINE -D3DXQUATERNION::D3DXQUATERNION( const float* pf ) -{ -#ifdef D3DX_DEBUG - if(!pf) - return; -#endif - - x = pf[0]; - y = pf[1]; - z = pf[2]; - w = pf[3]; -} - -D3DXINLINE -D3DXQUATERNION::D3DXQUATERNION( float fx, float fy, float fz, float fw ) -{ - x = fx; - y = fy; - z = fz; - w = fw; -} - - -// casting -D3DXINLINE -D3DXQUATERNION::operator float* () -{ - return (float *) &x; -} - -D3DXINLINE -D3DXQUATERNION::operator const float* () const -{ - return (const float *) &x; -} - - -// assignment operators -D3DXINLINE D3DXQUATERNION& -D3DXQUATERNION::operator += ( const D3DXQUATERNION& q ) -{ - x += q.x; - y += q.y; - z += q.z; - w += q.w; - return *this; -} - -D3DXINLINE D3DXQUATERNION& -D3DXQUATERNION::operator -= ( const D3DXQUATERNION& q ) -{ - x -= q.x; - y -= q.y; - z -= q.z; - w -= q.w; - return *this; -} - -D3DXINLINE D3DXQUATERNION& -D3DXQUATERNION::operator *= ( const D3DXQUATERNION& q ) -{ - D3DXQuaternionMultiply(this, this, &q); - return *this; -} - -D3DXINLINE D3DXQUATERNION& -D3DXQUATERNION::operator *= ( float f ) -{ - x *= f; - y *= f; - z *= f; - w *= f; - return *this; -} - -D3DXINLINE D3DXQUATERNION& -D3DXQUATERNION::operator /= ( float f ) -{ - float fInv = 1.0f / f; - x *= fInv; - y *= fInv; - z *= fInv; - w *= fInv; - return *this; -} - - -// unary operators -D3DXINLINE D3DXQUATERNION -D3DXQUATERNION::operator + () const -{ - return *this; -} - -D3DXINLINE D3DXQUATERNION -D3DXQUATERNION::operator - () const -{ - return D3DXQUATERNION(-x, -y, -z, -w); -} - - -// binary operators -D3DXINLINE D3DXQUATERNION -D3DXQUATERNION::operator + ( const D3DXQUATERNION& q ) const -{ - return D3DXQUATERNION(x + q.x, y + q.y, z + q.z, w + q.w); -} - -D3DXINLINE D3DXQUATERNION -D3DXQUATERNION::operator - ( const D3DXQUATERNION& q ) const -{ - return D3DXQUATERNION(x - q.x, y - q.y, z - q.z, w - q.w); -} - -D3DXINLINE D3DXQUATERNION -D3DXQUATERNION::operator * ( const D3DXQUATERNION& q ) const -{ - D3DXQUATERNION qT; - D3DXQuaternionMultiply(&qT, this, &q); - return qT; -} - -D3DXINLINE D3DXQUATERNION -D3DXQUATERNION::operator * ( float f ) const -{ - return D3DXQUATERNION(x * f, y * f, z * f, w * f); -} - -D3DXINLINE D3DXQUATERNION -D3DXQUATERNION::operator / ( float f ) const -{ - float fInv = 1.0f / f; - return D3DXQUATERNION(x * fInv, y * fInv, z * fInv, w * fInv); -} - - -D3DXINLINE D3DXQUATERNION -operator * (float f, const D3DXQUATERNION& q ) -{ - return D3DXQUATERNION(f * q.x, f * q.y, f * q.z, f * q.w); -} - - -D3DXINLINE BOOL -D3DXQUATERNION::operator == ( const D3DXQUATERNION& q ) const -{ - return x == q.x && y == q.y && z == q.z && w == q.w; -} - -D3DXINLINE BOOL -D3DXQUATERNION::operator != ( const D3DXQUATERNION& q ) const -{ - return x != q.x || y != q.y || z != q.z || w != q.w; -} - - - -//-------------------------- -// Plane -//-------------------------- - -D3DXINLINE -D3DXPLANE::D3DXPLANE( const float* pf ) -{ -#ifdef D3DX_DEBUG - if(!pf) - return; -#endif - - a = pf[0]; - b = pf[1]; - c = pf[2]; - d = pf[3]; -} - -D3DXINLINE -D3DXPLANE::D3DXPLANE( float fa, float fb, float fc, float fd ) -{ - a = fa; - b = fb; - c = fc; - d = fd; -} - - -// casting -D3DXINLINE -D3DXPLANE::operator float* () -{ - return (float *) &a; -} - -D3DXINLINE -D3DXPLANE::operator const float* () const -{ - return (const float *) &a; -} - - -// unary operators -D3DXINLINE D3DXPLANE -D3DXPLANE::operator + () const -{ - return *this; -} - -D3DXINLINE D3DXPLANE -D3DXPLANE::operator - () const -{ - return D3DXPLANE(-a, -b, -c, -d); -} - - -// binary operators -D3DXINLINE BOOL -D3DXPLANE::operator == ( const D3DXPLANE& p ) const -{ - return a == p.a && b == p.b && c == p.c && d == p.d; -} - -D3DXINLINE BOOL -D3DXPLANE::operator != ( const D3DXPLANE& p ) const -{ - return a != p.a || b != p.b || c != p.c || d != p.d; -} - - - - -//-------------------------- -// Color -//-------------------------- - -D3DXINLINE -D3DXCOLOR::D3DXCOLOR( DWORD dw ) -{ - const float f = 1.0f / 255.0f; - r = f * (float) (unsigned char) (dw >> 16); - g = f * (float) (unsigned char) (dw >> 8); - b = f * (float) (unsigned char) (dw >> 0); - a = f * (float) (unsigned char) (dw >> 24); -} - -D3DXINLINE -D3DXCOLOR::D3DXCOLOR( const float* pf ) -{ -#ifdef D3DX_DEBUG - if(!pf) - return; -#endif - - r = pf[0]; - g = pf[1]; - b = pf[2]; - a = pf[3]; -} - -D3DXINLINE -D3DXCOLOR::D3DXCOLOR( const D3DCOLORVALUE& c ) -{ - r = c.r; - g = c.g; - b = c.b; - a = c.a; -} - -D3DXINLINE -D3DXCOLOR::D3DXCOLOR( float fr, float fg, float fb, float fa ) -{ - r = fr; - g = fg; - b = fb; - a = fa; -} - - -// casting -D3DXINLINE -D3DXCOLOR::operator DWORD () const -{ - DWORD dwR = r >= 1.0f ? 0xff : r <= 0.0f ? 0x00 : (DWORD) (r * 255.0f + 0.5f); - DWORD dwG = g >= 1.0f ? 0xff : g <= 0.0f ? 0x00 : (DWORD) (g * 255.0f + 0.5f); - DWORD dwB = b >= 1.0f ? 0xff : b <= 0.0f ? 0x00 : (DWORD) (b * 255.0f + 0.5f); - DWORD dwA = a >= 1.0f ? 0xff : a <= 0.0f ? 0x00 : (DWORD) (a * 255.0f + 0.5f); - - return (dwA << 24) | (dwR << 16) | (dwG << 8) | dwB; -} - - -D3DXINLINE -D3DXCOLOR::operator float * () -{ - return (float *) &r; -} - -D3DXINLINE -D3DXCOLOR::operator const float * () const -{ - return (const float *) &r; -} - - -D3DXINLINE -D3DXCOLOR::operator D3DCOLORVALUE * () -{ - return (D3DCOLORVALUE *) &r; -} - -D3DXINLINE -D3DXCOLOR::operator const D3DCOLORVALUE * () const -{ - return (const D3DCOLORVALUE *) &r; -} - - -D3DXINLINE -D3DXCOLOR::operator D3DCOLORVALUE& () -{ - return *((D3DCOLORVALUE *) &r); -} - -D3DXINLINE -D3DXCOLOR::operator const D3DCOLORVALUE& () const -{ - return *((const D3DCOLORVALUE *) &r); -} - - -// assignment operators -D3DXINLINE D3DXCOLOR& -D3DXCOLOR::operator += ( const D3DXCOLOR& c ) -{ - r += c.r; - g += c.g; - b += c.b; - a += c.a; - return *this; -} - -D3DXINLINE D3DXCOLOR& -D3DXCOLOR::operator -= ( const D3DXCOLOR& c ) -{ - r -= c.r; - g -= c.g; - b -= c.b; - a -= c.a; - return *this; -} - -D3DXINLINE D3DXCOLOR& -D3DXCOLOR::operator *= ( float f ) -{ - r *= f; - g *= f; - b *= f; - a *= f; - return *this; -} - -D3DXINLINE D3DXCOLOR& -D3DXCOLOR::operator /= ( float f ) -{ - float fInv = 1.0f / f; - r *= fInv; - g *= fInv; - b *= fInv; - a *= fInv; - return *this; -} - - -// unary operators -D3DXINLINE D3DXCOLOR -D3DXCOLOR::operator + () const -{ - return *this; -} - -D3DXINLINE D3DXCOLOR -D3DXCOLOR::operator - () const -{ - return D3DXCOLOR(-r, -g, -b, -a); -} - - -// binary operators -D3DXINLINE D3DXCOLOR -D3DXCOLOR::operator + ( const D3DXCOLOR& c ) const -{ - return D3DXCOLOR(r + c.r, g + c.g, b + c.b, a + c.a); -} - -D3DXINLINE D3DXCOLOR -D3DXCOLOR::operator - ( const D3DXCOLOR& c ) const -{ - return D3DXCOLOR(r - c.r, g - c.g, b - c.b, a - c.a); -} - -D3DXINLINE D3DXCOLOR -D3DXCOLOR::operator * ( float f ) const -{ - return D3DXCOLOR(r * f, g * f, b * f, a * f); -} - -D3DXINLINE D3DXCOLOR -D3DXCOLOR::operator / ( float f ) const -{ - float fInv = 1.0f / f; - return D3DXCOLOR(r * fInv, g * fInv, b * fInv, a * fInv); -} - - -D3DXINLINE D3DXCOLOR -operator * (float f, const D3DXCOLOR& c ) -{ - return D3DXCOLOR(f * c.r, f * c.g, f * c.b, f * c.a); -} - - -D3DXINLINE BOOL -D3DXCOLOR::operator == ( const D3DXCOLOR& c ) const -{ - return r == c.r && g == c.g && b == c.b && a == c.a; -} - -D3DXINLINE BOOL -D3DXCOLOR::operator != ( const D3DXCOLOR& c ) const -{ - return r != c.r || g != c.g || b != c.b || a != c.a; -} - - -#endif //__cplusplus - - - -//=========================================================================== -// -// Inline functions -// -//=========================================================================== - - -//-------------------------- -// 2D Vector -//-------------------------- - -D3DXINLINE float D3DXVec2Length - ( const D3DXVECTOR2 *pV ) -{ -#ifdef D3DX_DEBUG - if(!pV) - return 0.0f; -#endif - -#ifdef __cplusplus - return sqrtf(pV->x * pV->x + pV->y * pV->y); -#else - return (float) sqrt(pV->x * pV->x + pV->y * pV->y); -#endif -} - -D3DXINLINE float D3DXVec2LengthSq - ( const D3DXVECTOR2 *pV ) -{ -#ifdef D3DX_DEBUG - if(!pV) - return 0.0f; -#endif - - return pV->x * pV->x + pV->y * pV->y; -} - -D3DXINLINE float D3DXVec2Dot - ( const D3DXVECTOR2 *pV1, const D3DXVECTOR2 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pV1 || !pV2) - return 0.0f; -#endif - - return pV1->x * pV2->x + pV1->y * pV2->y; -} - -D3DXINLINE float D3DXVec2CCW - ( const D3DXVECTOR2 *pV1, const D3DXVECTOR2 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pV1 || !pV2) - return 0.0f; -#endif - - return pV1->x * pV2->y - pV1->y * pV2->x; -} - -D3DXINLINE D3DXVECTOR2* D3DXVec2Add - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV1, const D3DXVECTOR2 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x + pV2->x; - pOut->y = pV1->y + pV2->y; - return pOut; -} - -D3DXINLINE D3DXVECTOR2* D3DXVec2Subtract - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV1, const D3DXVECTOR2 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x - pV2->x; - pOut->y = pV1->y - pV2->y; - return pOut; -} - -D3DXINLINE D3DXVECTOR2* D3DXVec2Minimize - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV1, const D3DXVECTOR2 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x < pV2->x ? pV1->x : pV2->x; - pOut->y = pV1->y < pV2->y ? pV1->y : pV2->y; - return pOut; -} - -D3DXINLINE D3DXVECTOR2* D3DXVec2Maximize - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV1, const D3DXVECTOR2 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x > pV2->x ? pV1->x : pV2->x; - pOut->y = pV1->y > pV2->y ? pV1->y : pV2->y; - return pOut; -} - -D3DXINLINE D3DXVECTOR2* D3DXVec2Scale - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV, float s ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV) - return NULL; -#endif - - pOut->x = pV->x * s; - pOut->y = pV->y * s; - return pOut; -} - -D3DXINLINE D3DXVECTOR2* D3DXVec2Lerp - ( D3DXVECTOR2 *pOut, const D3DXVECTOR2 *pV1, const D3DXVECTOR2 *pV2, - float s ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x + s * (pV2->x - pV1->x); - pOut->y = pV1->y + s * (pV2->y - pV1->y); - return pOut; -} - - -//-------------------------- -// 3D Vector -//-------------------------- - -D3DXINLINE float D3DXVec3Length - ( const D3DXVECTOR3 *pV ) -{ -#ifdef D3DX_DEBUG - if(!pV) - return 0.0f; -#endif - -#ifdef __cplusplus - return sqrtf(pV->x * pV->x + pV->y * pV->y + pV->z * pV->z); -#else - return (float) sqrt(pV->x * pV->x + pV->y * pV->y + pV->z * pV->z); -#endif -} - -D3DXINLINE float D3DXVec3LengthSq - ( const D3DXVECTOR3 *pV ) -{ -#ifdef D3DX_DEBUG - if(!pV) - return 0.0f; -#endif - - return pV->x * pV->x + pV->y * pV->y + pV->z * pV->z; -} - -D3DXINLINE float D3DXVec3Dot - ( const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pV1 || !pV2) - return 0.0f; -#endif - - return pV1->x * pV2->x + pV1->y * pV2->y + pV1->z * pV2->z; -} - -D3DXINLINE D3DXVECTOR3* D3DXVec3Cross - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pV2 ) -{ - D3DXVECTOR3 v; - -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - v.x = pV1->y * pV2->z - pV1->z * pV2->y; - v.y = pV1->z * pV2->x - pV1->x * pV2->z; - v.z = pV1->x * pV2->y - pV1->y * pV2->x; - - *pOut = v; - return pOut; -} - -D3DXINLINE D3DXVECTOR3* D3DXVec3Add - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x + pV2->x; - pOut->y = pV1->y + pV2->y; - pOut->z = pV1->z + pV2->z; - return pOut; -} - -D3DXINLINE D3DXVECTOR3* D3DXVec3Subtract - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x - pV2->x; - pOut->y = pV1->y - pV2->y; - pOut->z = pV1->z - pV2->z; - return pOut; -} - -D3DXINLINE D3DXVECTOR3* D3DXVec3Minimize - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x < pV2->x ? pV1->x : pV2->x; - pOut->y = pV1->y < pV2->y ? pV1->y : pV2->y; - pOut->z = pV1->z < pV2->z ? pV1->z : pV2->z; - return pOut; -} - -D3DXINLINE D3DXVECTOR3* D3DXVec3Maximize - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x > pV2->x ? pV1->x : pV2->x; - pOut->y = pV1->y > pV2->y ? pV1->y : pV2->y; - pOut->z = pV1->z > pV2->z ? pV1->z : pV2->z; - return pOut; -} - -D3DXINLINE D3DXVECTOR3* D3DXVec3Scale - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV, float s) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV) - return NULL; -#endif - - pOut->x = pV->x * s; - pOut->y = pV->y * s; - pOut->z = pV->z * s; - return pOut; -} - -D3DXINLINE D3DXVECTOR3* D3DXVec3Lerp - ( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV1, const D3DXVECTOR3 *pV2, - float s ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x + s * (pV2->x - pV1->x); - pOut->y = pV1->y + s * (pV2->y - pV1->y); - pOut->z = pV1->z + s * (pV2->z - pV1->z); - return pOut; -} - - -//-------------------------- -// 4D Vector -//-------------------------- - -D3DXINLINE float D3DXVec4Length - ( const D3DXVECTOR4 *pV ) -{ -#ifdef D3DX_DEBUG - if(!pV) - return 0.0f; -#endif - -#ifdef __cplusplus - return sqrtf(pV->x * pV->x + pV->y * pV->y + pV->z * pV->z + pV->w * pV->w); -#else - return (float) sqrt(pV->x * pV->x + pV->y * pV->y + pV->z * pV->z + pV->w * pV->w); -#endif -} - -D3DXINLINE float D3DXVec4LengthSq - ( const D3DXVECTOR4 *pV ) -{ -#ifdef D3DX_DEBUG - if(!pV) - return 0.0f; -#endif - - return pV->x * pV->x + pV->y * pV->y + pV->z * pV->z + pV->w * pV->w; -} - -D3DXINLINE float D3DXVec4Dot - ( const D3DXVECTOR4 *pV1, const D3DXVECTOR4 *pV2 ) -{ -#ifdef D3DX_DEBUG - if(!pV1 || !pV2) - return 0.0f; -#endif - - return pV1->x * pV2->x + pV1->y * pV2->y + pV1->z * pV2->z + pV1->w * pV2->w; -} - -D3DXINLINE D3DXVECTOR4* D3DXVec4Add - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV1, const D3DXVECTOR4 *pV2) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x + pV2->x; - pOut->y = pV1->y + pV2->y; - pOut->z = pV1->z + pV2->z; - pOut->w = pV1->w + pV2->w; - return pOut; -} - -D3DXINLINE D3DXVECTOR4* D3DXVec4Subtract - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV1, const D3DXVECTOR4 *pV2) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x - pV2->x; - pOut->y = pV1->y - pV2->y; - pOut->z = pV1->z - pV2->z; - pOut->w = pV1->w - pV2->w; - return pOut; -} - -D3DXINLINE D3DXVECTOR4* D3DXVec4Minimize - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV1, const D3DXVECTOR4 *pV2) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x < pV2->x ? pV1->x : pV2->x; - pOut->y = pV1->y < pV2->y ? pV1->y : pV2->y; - pOut->z = pV1->z < pV2->z ? pV1->z : pV2->z; - pOut->w = pV1->w < pV2->w ? pV1->w : pV2->w; - return pOut; -} - -D3DXINLINE D3DXVECTOR4* D3DXVec4Maximize - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV1, const D3DXVECTOR4 *pV2) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x > pV2->x ? pV1->x : pV2->x; - pOut->y = pV1->y > pV2->y ? pV1->y : pV2->y; - pOut->z = pV1->z > pV2->z ? pV1->z : pV2->z; - pOut->w = pV1->w > pV2->w ? pV1->w : pV2->w; - return pOut; -} - -D3DXINLINE D3DXVECTOR4* D3DXVec4Scale - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV, float s) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV) - return NULL; -#endif - - pOut->x = pV->x * s; - pOut->y = pV->y * s; - pOut->z = pV->z * s; - pOut->w = pV->w * s; - return pOut; -} - -D3DXINLINE D3DXVECTOR4* D3DXVec4Lerp - ( D3DXVECTOR4 *pOut, const D3DXVECTOR4 *pV1, const D3DXVECTOR4 *pV2, - float s ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pV1 || !pV2) - return NULL; -#endif - - pOut->x = pV1->x + s * (pV2->x - pV1->x); - pOut->y = pV1->y + s * (pV2->y - pV1->y); - pOut->z = pV1->z + s * (pV2->z - pV1->z); - pOut->w = pV1->w + s * (pV2->w - pV1->w); - return pOut; -} - - -//-------------------------- -// 4D Matrix -//-------------------------- - -D3DXINLINE D3DXMATRIX* D3DXMatrixIdentity - ( D3DXMATRIX *pOut ) -{ -#ifdef D3DX_DEBUG - if(!pOut) - return NULL; -#endif - - pOut->m[0][1] = pOut->m[0][2] = pOut->m[0][3] = - pOut->m[1][0] = pOut->m[1][2] = pOut->m[1][3] = - pOut->m[2][0] = pOut->m[2][1] = pOut->m[2][3] = - pOut->m[3][0] = pOut->m[3][1] = pOut->m[3][2] = 0.0f; - - pOut->m[0][0] = pOut->m[1][1] = pOut->m[2][2] = pOut->m[3][3] = 1.0f; - return pOut; -} - - -D3DXINLINE BOOL D3DXMatrixIsIdentity - ( const D3DXMATRIX *pM ) -{ -#ifdef D3DX_DEBUG - if(!pM) - return FALSE; -#endif - - return pM->m[0][0] == 1.0f && pM->m[0][1] == 0.0f && pM->m[0][2] == 0.0f && pM->m[0][3] == 0.0f && - pM->m[1][0] == 0.0f && pM->m[1][1] == 1.0f && pM->m[1][2] == 0.0f && pM->m[1][3] == 0.0f && - pM->m[2][0] == 0.0f && pM->m[2][1] == 0.0f && pM->m[2][2] == 1.0f && pM->m[2][3] == 0.0f && - pM->m[3][0] == 0.0f && pM->m[3][1] == 0.0f && pM->m[3][2] == 0.0f && pM->m[3][3] == 1.0f; -} - - -//-------------------------- -// Quaternion -//-------------------------- - -D3DXINLINE float D3DXQuaternionLength - ( const D3DXQUATERNION *pQ ) -{ -#ifdef D3DX_DEBUG - if(!pQ) - return 0.0f; -#endif - -#ifdef __cplusplus - return sqrtf(pQ->x * pQ->x + pQ->y * pQ->y + pQ->z * pQ->z + pQ->w * pQ->w); -#else - return (float) sqrt(pQ->x * pQ->x + pQ->y * pQ->y + pQ->z * pQ->z + pQ->w * pQ->w); -#endif -} - -D3DXINLINE float D3DXQuaternionLengthSq - ( const D3DXQUATERNION *pQ ) -{ -#ifdef D3DX_DEBUG - if(!pQ) - return 0.0f; -#endif - - return pQ->x * pQ->x + pQ->y * pQ->y + pQ->z * pQ->z + pQ->w * pQ->w; -} - -D3DXINLINE float D3DXQuaternionDot - ( const D3DXQUATERNION *pQ1, const D3DXQUATERNION *pQ2 ) -{ -#ifdef D3DX_DEBUG - if(!pQ1 || !pQ2) - return 0.0f; -#endif - - return pQ1->x * pQ2->x + pQ1->y * pQ2->y + pQ1->z * pQ2->z + pQ1->w * pQ2->w; -} - - -D3DXINLINE D3DXQUATERNION* D3DXQuaternionIdentity - ( D3DXQUATERNION *pOut ) -{ -#ifdef D3DX_DEBUG - if(!pOut) - return NULL; -#endif - - pOut->x = pOut->y = pOut->z = 0.0f; - pOut->w = 1.0f; - return pOut; -} - -D3DXINLINE BOOL D3DXQuaternionIsIdentity - ( const D3DXQUATERNION *pQ ) -{ -#ifdef D3DX_DEBUG - if(!pQ) - return FALSE; -#endif - - return pQ->x == 0.0f && pQ->y == 0.0f && pQ->z == 0.0f && pQ->w == 1.0f; -} - - -D3DXINLINE D3DXQUATERNION* D3DXQuaternionConjugate - ( D3DXQUATERNION *pOut, const D3DXQUATERNION *pQ ) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pQ) - return NULL; -#endif - - pOut->x = -pQ->x; - pOut->y = -pQ->y; - pOut->z = -pQ->z; - pOut->w = pQ->w; - return pOut; -} - - -//-------------------------- -// Plane -//-------------------------- - -D3DXINLINE float D3DXPlaneDot - ( const D3DXPLANE *pP, const D3DXVECTOR4 *pV) -{ -#ifdef D3DX_DEBUG - if(!pP || !pV) - return 0.0f; -#endif - - return pP->a * pV->x + pP->b * pV->y + pP->c * pV->z + pP->d * pV->w; -} - -D3DXINLINE float D3DXPlaneDotCoord - ( const D3DXPLANE *pP, const D3DXVECTOR3 *pV) -{ -#ifdef D3DX_DEBUG - if(!pP || !pV) - return 0.0f; -#endif - - return pP->a * pV->x + pP->b * pV->y + pP->c * pV->z + pP->d; -} - -D3DXINLINE float D3DXPlaneDotNormal - ( const D3DXPLANE *pP, const D3DXVECTOR3 *pV) -{ -#ifdef D3DX_DEBUG - if(!pP || !pV) - return 0.0f; -#endif - - return pP->a * pV->x + pP->b * pV->y + pP->c * pV->z; -} - - -//-------------------------- -// Color -//-------------------------- - -D3DXINLINE D3DXCOLOR* D3DXColorNegative - (D3DXCOLOR *pOut, const D3DXCOLOR *pC) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pC) - return NULL; -#endif - - pOut->r = 1.0f - pC->r; - pOut->g = 1.0f - pC->g; - pOut->b = 1.0f - pC->b; - pOut->a = pC->a; - return pOut; -} - -D3DXINLINE D3DXCOLOR* D3DXColorAdd - (D3DXCOLOR *pOut, const D3DXCOLOR *pC1, const D3DXCOLOR *pC2) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pC1 || !pC2) - return NULL; -#endif - - pOut->r = pC1->r + pC2->r; - pOut->g = pC1->g + pC2->g; - pOut->b = pC1->b + pC2->b; - pOut->a = pC1->a + pC2->a; - return pOut; -} - -D3DXINLINE D3DXCOLOR* D3DXColorSubtract - (D3DXCOLOR *pOut, const D3DXCOLOR *pC1, const D3DXCOLOR *pC2) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pC1 || !pC2) - return NULL; -#endif - - pOut->r = pC1->r - pC2->r; - pOut->g = pC1->g - pC2->g; - pOut->b = pC1->b - pC2->b; - pOut->a = pC1->a - pC2->a; - return pOut; -} - -D3DXINLINE D3DXCOLOR* D3DXColorScale - (D3DXCOLOR *pOut, const D3DXCOLOR *pC, float s) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pC) - return NULL; -#endif - - pOut->r = pC->r * s; - pOut->g = pC->g * s; - pOut->b = pC->b * s; - pOut->a = pC->a * s; - return pOut; -} - -D3DXINLINE D3DXCOLOR* D3DXColorModulate - (D3DXCOLOR *pOut, const D3DXCOLOR *pC1, const D3DXCOLOR *pC2) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pC1 || !pC2) - return NULL; -#endif - - pOut->r = pC1->r * pC2->r; - pOut->g = pC1->g * pC2->g; - pOut->b = pC1->b * pC2->b; - pOut->a = pC1->a * pC2->a; - return pOut; -} - -D3DXINLINE D3DXCOLOR* D3DXColorLerp - (D3DXCOLOR *pOut, const D3DXCOLOR *pC1, const D3DXCOLOR *pC2, float s) -{ -#ifdef D3DX_DEBUG - if(!pOut || !pC1 || !pC2) - return NULL; -#endif - - pOut->r = pC1->r + s * (pC2->r - pC1->r); - pOut->g = pC1->g + s * (pC2->g - pC1->g); - pOut->b = pC1->b + s * (pC2->b - pC1->b); - pOut->a = pC1->a + s * (pC2->a - pC1->a); - return pOut; -} - - -#endif // __D3DXMATH_INL__ diff --git a/import/DirectX8/include/d3dxshapes.h b/import/DirectX8/include/d3dxshapes.h deleted file mode 100644 index 765c59f52..000000000 --- a/import/DirectX8/include/d3dxshapes.h +++ /dev/null @@ -1,209 +0,0 @@ -/////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) Microsoft Corporation. All Rights Reserved. -// -// File: d3dxshapes.h -// Content: D3DX simple shapes -// -/////////////////////////////////////////////////////////////////////////// - -#ifndef __D3DXSHAPES_H__ -#define __D3DXSHAPES_H__ - -#include -#include -#include "d3dxerr.h" - - -typedef struct ID3DXSimpleShape *LPD3DXSIMPLESHAPE; - -// {CFCD4602-EB7B-11d2-A440-00A0C90629A8} -DEFINE_GUID( IID_ID3DXSimpleShape, -0xcfcd4602, 0xeb7b, 0x11d2, 0xa4, 0x40, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8 ); - - -/////////////////////////////////////////////////////////////////////////// -// Interfaces: -/////////////////////////////////////////////////////////////////////////// - -//------------------------------------------------------------------------- -// ID3DXSimpleShape interface: -//------------------------------------------------------------------------- - -DECLARE_INTERFACE_(ID3DXSimpleShape, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID* ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - - // ID3DXSimpleShape methods - STDMETHOD_(LPDIRECT3DVERTEXBUFFER7, GetVB)(THIS) PURE; - STDMETHOD_(DWORD, GetIndices)(THIS_ LPWORD *ppIndices) PURE; - STDMETHOD(Draw)(THIS) PURE; -}; - - - -/////////////////////////////////////////////////////////////////////////// -// Functions: -/////////////////////////////////////////////////////////////////////////// - -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - - -//------------------------------------------------------------------------- -// D3DXCreatePolygon: Creates an 'n' sided polygon using the device -// ---------------- specified. It returns a vertex buffer that can be used -// for drawing or manipulation by the program later on. -// -// Params: -// [in] LPDIRECT3DDEVICE7 pDevice: The device to create off. -// [in] float sideSize: Length of a side. -// [in] DWORD numTexCoords: The number of texture coordinates desired -// in the vertex-buffer. (Default is 1) -// D3DX_DEFAULT is a valid input. -// [out] IDirect3DVertexBuffer7** ppVB: The output shape interface. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreatePolygon(LPDIRECT3DDEVICE7 pDevice, - float sideSize, - DWORD numSides, - DWORD numTexCoords, - LPD3DXSIMPLESHAPE* ppShape ); - -//------------------------------------------------------------------------- -// D3DXCreateBox: Creates a box (cuboid) of given dimensions using the -// ------------ device. It returns a vertex buffer that can -// be used for drawing or manipulation by the program later on. -// -// Params: -// [in] LPDIRECT3DDEVICE7 pDevice: The device to create off. -// [in] float width: Width of the box (along x-axis) -// [in] float height: Height of the box (along y-axis) -// [in] float depth: Depth of the box (along z-axis) -// [in] DWORD numTexCoords: The number of texture coordinates desired -// in the vertex-buffer. Default is 1. -// D3DX_DEFAULT is a valid input here. -// [out] LPD3DXSIMPLESHAPE* ppShape: The output vertex-buffer. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreateBox(LPDIRECT3DDEVICE7 pDevice, - float width, - float height, - float depth, - DWORD numTexCoords, - LPD3DXSIMPLESHAPE* ppShape ); - -//------------------------------------------------------------------------- -// D3DXCreateCylinder: Creates a cylinder of given dimensions using the -// ----------------- device. It returns a vertex buffer that -// can be used for drawing or manipulation by the program -// later on. -// -// Params: -// [in] LPDIRECT3DDEVICE7 pDevice: The device to create off. -// [in] float baseRadius: Base-radius (default is 1.0f, shd be >= 0.0f) -// [in] float topRadius: Top-radius (default is 1.0f, shd be >= 0.0f) -// [in] float height: Height (default is 1.0f, shd be >= 0.0f) -// [in] DWORD numSlices: Number of slices about the main axis. -// (default is 8) D3DX_DEFAULT is a valid input. -// [in] DWORD numStacks: Number of stacks along the main axis. -// (default is 8) D3DX_DEFAULT is a valid input. -// [in] DWORD numTexCoords: The number of texture coordinates desired -// in the vertex-buffer. Default is 1. -// D3DX_DEFAULT is a valid input here. -// [out] LPD3DXSIMPLESHAPE* ppShape: The output shape interface. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreateCylinder(LPDIRECT3DDEVICE7 pDevice, - float baseRadius, - float topRadius, - float height, - DWORD numSlices, - DWORD numStacks, - DWORD numTexCoords, - LPD3DXSIMPLESHAPE* ppShape ); - - -//------------------------------------------------------------------------- -// D3DXCreateTorus: Creates a torus of given dimensions using the -// -------------- device specified. It returns a vertex buffer that can -// be used for drawing or manipulation by the program later -// on. It draws a doughnut, centered at (0, 0, 0) whose axis -// is aligned with the z-axis. With the innerRadius used -// as the radius of the cross-section (minor-Radius) and -// the outerRadius used as the radius of the central 'hole'. -// -// Params: -// [in] LPDIRECT3DDEVICE7 pDevice: The device to create off. -// [in] float innerRadius: inner radius (default is 1.0f, shd be >= 0.0f) -// [in] float outerRadius: outer radius (default is 2.0f, shd be >= 0.0f) -// [in] DWORD numSides: Number of sides in the cross-section -// (default is 8). D3DX_DEFAULT is a valid input. -// [in] DWORD numRings: Number of rings making up the torus -// (default is 8) D3DX_DEFAULT is a valid input. -// [in] DWORD numTexCoords: The number of texture coordinates desired -// in the vertex-buffer. Default is 1. -// D3DX_DEFAULT is a valid input here. -// [out] LPD3DXSIMPLESHAPE* ppShape: The output shape interface. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreateTorus(LPDIRECT3DDEVICE7 pDevice, - float innerRadius, - float outerRadius, - DWORD numSides, - DWORD numRings, - DWORD numTexCoords, - LPD3DXSIMPLESHAPE* ppShape ); - -//------------------------------------------------------------------------- -// D3DXCreateTeapot: Creates a teapot using the device specified. -// ---------------- It returns a vertex buffer that can be used for -// drawing or manipulation by the program later on. -// -// Params: -// [in] LPDIRECT3DDEVICE7 pDevice: The device to create off. -// [in] DWORD numTexCoords: The number of texture coordinates desired -// in the vertex-buffer. Default is 1. -// D3DX_DEFAULT is a valid input here. -// [out] LPD3DXSIMPLESHAPE* ppShape: The output shape interface. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreateTeapot(LPDIRECT3DDEVICE7 pDevice, - DWORD numTexCoords, - LPD3DXSIMPLESHAPE* ppShape); - -//------------------------------------------------------------------------- -// D3DXCreateSphere: Creates a cylinder of given dimensions using the -// ---------------- device specified. -// It returns a vertex buffer that can be used for -// drawing or manipulation by the program later on. -// -// Params: -// [in] LPDIRECT3DDEVICE7 pDevice: The device to create off. -// [in] float radius: radius (default is 1.0f, shd be >= 0.0f) -// [in] float height: Height (default is 1.0f, shd be >= 0.0f) -// [in] DWORD numSlices: Number of slices about the main axis -// (default is 8) D3DX_DEFAULT is a valid input. -// [in] DWORD numStacks: Number of stacks along the main axis -// (default is 8) D3DX_DEFAULT is a valid input. -// [in] DWORD numTexCoords: The number of texture coordinates desired -// in the vertex-buffer. Default is 1. -// D3DX_DEFAULT is a valid input here. -// [out] LPD3DXSIMPLESHAPE* ppShape: The output shape interface. -//------------------------------------------------------------------------- -HRESULT WINAPI - D3DXCreateSphere(LPDIRECT3DDEVICE7 pDevice, - float radius, - DWORD numSlices, - DWORD numStacks, - DWORD numTexCoords, - LPD3DXSIMPLESHAPE* ppShape); - -#ifdef __cplusplus -} -#endif //__cplusplus -#endif //__D3DXSHAPES_H__ diff --git a/import/DirectX8/include/d3dxsprite.h b/import/DirectX8/include/d3dxsprite.h deleted file mode 100644 index a08b4a99c..000000000 --- a/import/DirectX8/include/d3dxsprite.h +++ /dev/null @@ -1,321 +0,0 @@ -/////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) Microsoft Corporation. All Rights Reserved. -// -// File: d3dxsprite.h -// Content: D3DX sprite helper functions -// -// These functions allow you to use sprites with D3DX. A "sprite" is -// loosely defined as a 2D image that you want to transfer to the -// rendering target. The source image can be a texture created -// with the help of the D3DX texture loader; though advanced users may -// want to create their own. A helper function (PrepareDeviceForSprite) -// is provided to make it easy to set up render states on a device. -// (Again, advanced users can use their own created devices.) -// -// There are two general techniques for sprites; the simpler one just -// specifies a destination rectangle and a rotation anlge. A more -// powerful technique supports rendering to non-rectangular quads. -// -// Both techniques support clipping, alpha, and rotation. More -// details are below. -// -/////////////////////////////////////////////////////////////////////////// - -#ifndef __D3DXSPRITE_H__ -#define __D3DXSPRITE_H__ - -#include -#include -#include "d3dxerr.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -//------------------------------------------------------------------------- -// D3DXPrepareDeviceForSprite: -// -// Call this function to set up all the render states necessary for -// BltSprite/WarpSprite to work correctly. (Advanced users may opt to -// not call this function first; in which case Blt/WarpSprite functions -// will use whatever render/texture states were set up on the device when -// they are called.) -// -// Warning: This function modifies render states and may impact performance -// negatively on some 3D hardware if it is called too often per frame. -// -// Warning: If the render state changes (other than through calls to -// BltSprite or WarpSprite), you will need to call this function again before -// calling BltSprite or WarpSprite. -// -// Details: This function modifies the the rendering first texture stage and -// it modifies some renderstates for the entire device. Here is the exact -// list: -// -// SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); -// SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); -// SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); -// SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); -// SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); -// SetTextureStageState(0, D3DTSS_MINFILTER, D3DTFN_LINEAR); -// SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTFG_LINEAR); -// -// SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCALPHA); -// SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA); -// SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE); -// -// Depending on the value of ZEnable parameter, this function will -// will either call -// SetRenderState(D3DRENDERSTATE_ZENABLE, FALSE); -// - or - -// SetRenderState(D3DRENDERSTATE_ZENABLE, TRUE); -// -// Parameters: -// pd3dDevice - a pointer to the d3d device that you wish to prepare -// for use with D3DX Sprite Services -// ZEnable - a flag indicating whether you want the sprites to -// check and update the Z buffer as part of rendering. -// If ZEnable is FALSE, OR you are using -// alpha-blending, then it is necessary to render your -// sprites from back-to-front. -// -//------------------------------------------------------------------------- - -#ifdef __cplusplus -HRESULT WINAPI - D3DXPrepareDeviceForSprite( LPDIRECT3DDEVICE7 pd3dDevice, - BOOL ZEnable = FALSE); -#else -HRESULT WINAPI - D3DXPrepareDeviceForSprite( LPDIRECT3DDEVICE7 pd3dDevice, - BOOL ZEnable); -#endif - - - -//------------------------------------------------------------------------- -// The D3DXDrawBasicSprite() function performs blitting of source images onto -// a 3D rendering device. This function only calls SetTexture on the first -// renderstage with the parameter (pd3dTexture) if that parameter is non-null. -// This function assumes that D3DXPrepareDeviceForSprite has been called on -// the device or that caller has in some other way correctly prepared the -// renderstates. -// -// This function supports scaling, rotations, alpha-blending, and choosing -// a source sub-rect. -// -// Rotation angle is specified in radians. Both rotations and scales -// are applied around the center of the sprite; where the center of the -// sprite is half the width/height of the sprite, plus the offset parameter. -// -// Use the offset parameter if you want the sprite's center to be something -// other than the image center. -// -// The destination point indicates where you would like the center of -// the sprite to draw to. -// -// Parameters: -// pd3dTexture - a pointer to the surface containing the texture -// pd3dDevice - a pointer to the d3d device to render to. It is -// assumed that render states are set up. (See -// D3DXPrepareDeviceForSprite) -// ppointDest - a pointer to the target point for the sprite. The -// components of the vector must be in screen -// space. -// alpha - alpha value to apply to sprite. 1.0 means totally -// opaque; and 0.0 means totally transparent. -// WARNING: If you are using alpha, then you should render -// from back to front in order to avoid rendering -// artifacts. -// angleRad - angle of rotation around the 'center' of the rect -// scale - a uniform scale that is applied to the source rect -// to specify the size of the image that is rendered -// pOffset - offset from the center of the source rect to use as the -// center of rotation -// pSourceRect - a rect that indicates what portion of the source -// source texture to use. If NULL is passed, then the -// entire source is used. If the source texture was -// created via D3DX, then the rect should be specified -// in the coordinates of the original image (so that you -// don't have to worry about stretching/scaling that D3DX -// may have done to make the image work with your current -// 3D Device.) Note that horizontal or vertical mirroring -// may be simply accomplished by swapping the left/right -// or top/bottom fields of this RECT. -//------------------------------------------------------------------------- - -#ifdef __cplusplus -HRESULT WINAPI - D3DXDrawSpriteSimple(LPDIRECTDRAWSURFACE7 pd3dTexture, - LPDIRECT3DDEVICE7 pd3dDevice, - const D3DXVECTOR3 *ppointDest, - float alpha = 1.0f, - float scale = 1.0f, - float angleRad = 0.0f, - const D3DXVECTOR2 *pOffset = NULL, - const RECT *pSourceRect = NULL); -#else -HRESULT WINAPI - D3DXDrawSpriteSimple(LPDIRECTDRAWSURFACE7 pd3dTexture, - LPDIRECT3DDEVICE7 pd3dDevice, - D3DXVECTOR3 *ppointDest, - float alpha, - float scale, - float angleRad, - D3DXVECTOR2 *pOffset, - RECT *pSourceRect); -#endif - -//------------------------------------------------------------------------- -// The D3DXDrawSprite() function transforms source images onto a 3D -// rendering device. It takes a general 4x4 matrix which is use to transform -// the points of a default rect: (left=-.5, top=-.5, right=+.5, bottom=+.5). -// (This default rect was chosen so that it was centered around the origin -// to ease setting up rotations. And it was chosen to have a width/height of one -// to ease setting up scales.) -// -// This function only calls SetTexture on the first -// renderstage with the parameter (pd3dTexture) if that parameter is non-null. -// This function assumes that D3DXPrepareDeviceForSprite has been called on -// the device or that caller has in some other way correctly prepared the -// renderstates. -// -// This function supports alpha-blending, and choosing -// a source sub-rect. (A value of NULL for source sub-rect means the entire -// texture is used.) -// -// Note that if the transformed points have a value for w (the homogenous -// coordinate) that is not 1, then this function will invert it and pass -// that value to D3D as the rhw field of a TLVERTEX. If the value for w is -// zero, then it use 1 as the rhw. -// -// Parameters: -// pd3dTexture - a pointer to the surface containing the texture -// pd3dDevice - a pointer to the d3d device to render to. It is -// assumed that render states are set up. (See -// D3DXPrepareDeviceForSprite) -// pMatrixTransform - 4x4 matrix that specifies the transformation -// that will be applied to the default -.5 to +.5 -// rectangle. -// alpha - alpha value to apply to sprite. 1.0 means totally -// opaque; and 0.0 means totally transparent. -// WARNING: If you are using alpha, then you should render -// from back to front in order to avoid rendering -// artifacts.Furthermore, you should avoid scenarios where -// semi-transparent objects intersect. -// pSourceRect - a rect that indicates what portion of the source -// source texture to use. If NULL is passed, then the -// entire source is used. If the source texture was -// created via D3DX, then the rect should be specified -// in the coordinates of the original image (so that you -// don't have to worry about stretching/scaling that D3DX -// may have done to make the image work with your current -// 3D Device.) Note that mirroring may be simply accomplished -// by swapping the left/right or top/bottom fields of -// this RECT. -// -//------------------------------------------------------------------------- - -#ifdef __cplusplus -HRESULT WINAPI - D3DXDrawSpriteTransform(LPDIRECTDRAWSURFACE7 pd3dTexture, - LPDIRECT3DDEVICE7 pd3dDevice, - const D3DXMATRIX *pMatrixTransform, - float alpha = 1.0f, - const RECT *pSourceRect = NULL); -#else -HRESULT WINAPI - D3DXDrawSpriteTransform(LPDIRECTDRAWSURFACE7 pd3dTexture, - LPDIRECT3DDEVICE7 pd3dDevice, - D3DXMATRIX *pMatrixTransform, - float alpha, - RECT *pSourceRect); -#endif - -//------------------------------------------------------------------------- -// The D3DXBuildSpriteTransform() function is a helper provided which -// creates a matrix corresponding to simple properties. This matrix is -// set up to pass directly to D3DXTransformSprite. -// -// Parameters: -// pMatrix - a pointer to the result matrix -// prectDest - a pointer to the target rectangle for the sprite -// angleRad - angle of rotation around the 'center' of the rect -// pOffset - offset from the center of the source rect to use as the -// center of rotation -// -//------------------------------------------------------------------------- - -#ifdef __cplusplus -void WINAPI - D3DXBuildSpriteTransform(D3DXMATRIX *pMatrix, - const RECT *prectDest, - float angleRad = 0.0f, - const D3DXVECTOR2 *pOffset = NULL); -#else -void WINAPI - D3DXBuildSpriteTransform(D3DXMATRIX *pMatrix, - RECT *prectDest, - float angleRad, - D3DXVECTOR2 *pOffset); -#endif - - -//------------------------------------------------------------------------- -// The D3DXDrawSprite3D() function renders a texture onto a 3D quad. The -// quad ABCD is broken into two triangles ABC and ACD which are rendered -// via DrawPrim. -// -// Parameters: -// pd3dTexture - a pointer to the surface containing the texture -// pd3dDevice - a pointer to the d3d device to render to. It is -// assumed that render states are set up. (See -// D3DXPrepareDeviceForSprite) -// quad - array of 4 points in the following order: -// upper-left, upper-right, lower-right, lower-left. -// If these vectors contain a W, then this function -// will take the reciprocal of that value to pass as -// as the rhw (i.e. reciprocal homogenous w). -// alpha - alpha value to apply to sprite. 1.0 means totally -// opaque; and 0.0 means totally transparent. -// WARNING: If you are using alpha, then you should render -// from back to front in order to avoid rendering -// artifacts.Furthermore, you should avoid scenarios where -// semi-transparent objects intersect. -// pSourceRect - a rect that indicates what portion of the source -// source texture to use. If NULL is passed, then the -// entire source is used. If the source texture was -// created via D3DX, then the rect should be specified -// in the coordinates of the original image (so that you -// don't have to worry about stretching/scaling that D3DX -// may have done to make the image work with your current -// 3D Device.) Note that mirroring may be simply accomplished -// by swapping the left/right or top/bottom fields of -// this RECT. -//------------------------------------------------------------------------- - -#ifdef __cplusplus -HRESULT WINAPI - D3DXDrawSprite3D(LPDIRECTDRAWSURFACE7 pd3dTexture, - LPDIRECT3DDEVICE7 pd3dDevice, - const D3DXVECTOR4 quad[4], - float alpha = 1.0f, - const RECT *pSourceRect = NULL); -#else -HRESULT WINAPI - D3DXDrawSprite3D(LPDIRECTDRAWSURFACE7 pd3dTexture, - LPDIRECT3DDEVICE7 pd3dDevice, - D3DXVECTOR4 quad[4], - float alpha, - RECT *pSourceRect); -#endif - - - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif // __D3DXSPRITE_H__ diff --git a/import/DirectX8/include/ddraw.h b/import/DirectX8/include/ddraw.h deleted file mode 100644 index ff1fbb3a0..000000000 --- a/import/DirectX8/include/ddraw.h +++ /dev/null @@ -1,5703 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) Microsoft Corporation. All Rights Reserved. - * - * File: ddraw.h - * Content: DirectDraw include file - * - ***************************************************************************/ - -#ifndef __DDRAW_INCLUDED__ -#define __DDRAW_INCLUDED__ - -//Disable the nameless union warning when building internally -#undef ENABLE_NAMELESS_UNION_PRAGMA -#ifdef DIRECTX_REDIST -#define ENABLE_NAMELESS_UNION_PRAGMA -#endif - -#ifdef ENABLE_NAMELESS_UNION_PRAGMA -#pragma warning(disable:4201) -#endif - -/* - * If you wish an application built against the newest version of DirectDraw - * to run against an older DirectDraw run time then define DIRECTDRAW_VERSION - * to be the earlies version of DirectDraw you wish to run against. For, - * example if you wish an application to run against a DX 3 runtime define - * DIRECTDRAW_VERSION to be 0x0300. - */ -#ifndef DIRECTDRAW_VERSION -#define DIRECTDRAW_VERSION 0x0700 -#endif /* DIRECTDRAW_VERSION */ - -#if defined( _WIN32 ) && !defined( _NO_COM ) -#define COM_NO_WINDOWS_H -#include -#else -#define IUnknown void -#if !defined( NT_BUILD_ENVIRONMENT ) && !defined(WINNT) - #define CO_E_NOTINITIALIZED 0x800401F0L -#endif -#endif - -#define _FACDD 0x876 -#define MAKE_DDHRESULT( code ) MAKE_HRESULT( 1, _FACDD, code ) - -#ifdef __cplusplus -extern "C" { -#endif - -// -// For compilers that don't support nameless unions, do a -// -// #define NONAMELESSUNION -// -// before #include -// -#ifndef DUMMYUNIONNAMEN -#if defined(__cplusplus) || !defined(NONAMELESSUNION) -#define DUMMYUNIONNAMEN(n) -#else -#define DUMMYUNIONNAMEN(n) u##n -#endif -#endif - -#ifndef MAKEFOURCC - #define MAKEFOURCC(ch0, ch1, ch2, ch3) \ - ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \ - ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 )) -#endif //defined(MAKEFOURCC) - -/* - * FOURCC codes for DX compressed-texture pixel formats - */ -#define FOURCC_DXT1 (MAKEFOURCC('D','X','T','1')) -#define FOURCC_DXT2 (MAKEFOURCC('D','X','T','2')) -#define FOURCC_DXT3 (MAKEFOURCC('D','X','T','3')) -#define FOURCC_DXT4 (MAKEFOURCC('D','X','T','4')) -#define FOURCC_DXT5 (MAKEFOURCC('D','X','T','5')) - -/* - * GUIDS used by DirectDraw objects - */ -#if defined( _WIN32 ) && !defined( _NO_COM ) - -DEFINE_GUID( CLSID_DirectDraw, 0xD7B70EE0,0x4340,0x11CF,0xB0,0x63,0x00,0x20,0xAF,0xC2,0xCD,0x35 ); -DEFINE_GUID( CLSID_DirectDraw7, 0x3c305196,0x50db,0x11d3,0x9c,0xfe,0x00,0xc0,0x4f,0xd9,0x30,0xc5 ); -DEFINE_GUID( CLSID_DirectDrawClipper, 0x593817A0,0x7DB3,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xb9,0x33,0x56 ); -DEFINE_GUID( IID_IDirectDraw, 0x6C14DB80,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 ); -DEFINE_GUID( IID_IDirectDraw2, 0xB3A6F3E0,0x2B43,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xB9,0x33,0x56 ); -DEFINE_GUID( IID_IDirectDraw4, 0x9c59509a,0x39bd,0x11d1,0x8c,0x4a,0x00,0xc0,0x4f,0xd9,0x30,0xc5 ); -DEFINE_GUID( IID_IDirectDraw7, 0x15e65ec0,0x3b9c,0x11d2,0xb9,0x2f,0x00,0x60,0x97,0x97,0xea,0x5b ); -DEFINE_GUID( IID_IDirectDrawSurface, 0x6C14DB81,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 ); -DEFINE_GUID( IID_IDirectDrawSurface2, 0x57805885,0x6eec,0x11cf,0x94,0x41,0xa8,0x23,0x03,0xc1,0x0e,0x27 ); -DEFINE_GUID( IID_IDirectDrawSurface3, 0xDA044E00,0x69B2,0x11D0,0xA1,0xD5,0x00,0xAA,0x00,0xB8,0xDF,0xBB ); -DEFINE_GUID( IID_IDirectDrawSurface4, 0x0B2B8630,0xAD35,0x11D0,0x8E,0xA6,0x00,0x60,0x97,0x97,0xEA,0x5B ); -DEFINE_GUID( IID_IDirectDrawSurface7, 0x06675a80,0x3b9b,0x11d2,0xb9,0x2f,0x00,0x60,0x97,0x97,0xea,0x5b ); -DEFINE_GUID( IID_IDirectDrawPalette, 0x6C14DB84,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 ); -DEFINE_GUID( IID_IDirectDrawClipper, 0x6C14DB85,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 ); -DEFINE_GUID( IID_IDirectDrawColorControl, 0x4B9F0EE0,0x0D7E,0x11D0,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8 ); -DEFINE_GUID( IID_IDirectDrawGammaControl, 0x69C11C3E,0xB46B,0x11D1,0xAD,0x7A,0x00,0xC0,0x4F,0xC2,0x9B,0x4E ); - -#endif - -/*============================================================================ - * - * DirectDraw Structures - * - * Various structures used to invoke DirectDraw. - * - *==========================================================================*/ - -struct IDirectDraw; -struct IDirectDrawSurface; -struct IDirectDrawPalette; -struct IDirectDrawClipper; - -typedef struct IDirectDraw FAR *LPDIRECTDRAW; -typedef struct IDirectDraw2 FAR *LPDIRECTDRAW2; -typedef struct IDirectDraw4 FAR *LPDIRECTDRAW4; -typedef struct IDirectDraw7 FAR *LPDIRECTDRAW7; -typedef struct IDirectDrawSurface FAR *LPDIRECTDRAWSURFACE; -typedef struct IDirectDrawSurface2 FAR *LPDIRECTDRAWSURFACE2; -typedef struct IDirectDrawSurface3 FAR *LPDIRECTDRAWSURFACE3; -typedef struct IDirectDrawSurface4 FAR *LPDIRECTDRAWSURFACE4; -typedef struct IDirectDrawSurface7 FAR *LPDIRECTDRAWSURFACE7; -typedef struct IDirectDrawPalette FAR *LPDIRECTDRAWPALETTE; -typedef struct IDirectDrawClipper FAR *LPDIRECTDRAWCLIPPER; -typedef struct IDirectDrawColorControl FAR *LPDIRECTDRAWCOLORCONTROL; -typedef struct IDirectDrawGammaControl FAR *LPDIRECTDRAWGAMMACONTROL; - -typedef struct _DDFXROP FAR *LPDDFXROP; -typedef struct _DDSURFACEDESC FAR *LPDDSURFACEDESC; -typedef struct _DDSURFACEDESC2 FAR *LPDDSURFACEDESC2; -typedef struct _DDCOLORCONTROL FAR *LPDDCOLORCONTROL; - -/* - * API's - */ -#if (defined (WIN32) || defined( _WIN32 ) ) && !defined( _NO_COM ) -//#if defined( _WIN32 ) && !defined( _NO_ENUM ) - typedef BOOL (FAR PASCAL * LPDDENUMCALLBACKA)(GUID FAR *, LPSTR, LPSTR, LPVOID); - typedef BOOL (FAR PASCAL * LPDDENUMCALLBACKW)(GUID FAR *, LPWSTR, LPWSTR, LPVOID); - extern HRESULT WINAPI DirectDrawEnumerateW( LPDDENUMCALLBACKW lpCallback, LPVOID lpContext ); - extern HRESULT WINAPI DirectDrawEnumerateA( LPDDENUMCALLBACKA lpCallback, LPVOID lpContext ); - /* - * Protect against old SDKs - */ - #if !defined(HMONITOR_DECLARED) && (WINVER < 0x0500) - #define HMONITOR_DECLARED - DECLARE_HANDLE(HMONITOR); - #endif - typedef BOOL (FAR PASCAL * LPDDENUMCALLBACKEXA)(GUID FAR *, LPSTR, LPSTR, LPVOID, HMONITOR); - typedef BOOL (FAR PASCAL * LPDDENUMCALLBACKEXW)(GUID FAR *, LPWSTR, LPWSTR, LPVOID, HMONITOR); - extern HRESULT WINAPI DirectDrawEnumerateExW( LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags); - extern HRESULT WINAPI DirectDrawEnumerateExA( LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags); - typedef HRESULT (WINAPI * LPDIRECTDRAWENUMERATEEXA)( LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags); - typedef HRESULT (WINAPI * LPDIRECTDRAWENUMERATEEXW)( LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags); - - #ifdef UNICODE - typedef LPDDENUMCALLBACKW LPDDENUMCALLBACK; - #define DirectDrawEnumerate DirectDrawEnumerateW - typedef LPDDENUMCALLBACKEXW LPDDENUMCALLBACKEX; - typedef LPDIRECTDRAWENUMERATEEXW LPDIRECTDRAWENUMERATEEX; - #define DirectDrawEnumerateEx DirectDrawEnumerateExW - #else - typedef LPDDENUMCALLBACKA LPDDENUMCALLBACK; - #define DirectDrawEnumerate DirectDrawEnumerateA - typedef LPDDENUMCALLBACKEXA LPDDENUMCALLBACKEX; - typedef LPDIRECTDRAWENUMERATEEXA LPDIRECTDRAWENUMERATEEX; - #define DirectDrawEnumerateEx DirectDrawEnumerateExA - #endif - extern HRESULT WINAPI DirectDrawCreate( GUID FAR *lpGUID, LPDIRECTDRAW FAR *lplpDD, IUnknown FAR *pUnkOuter ); - extern HRESULT WINAPI DirectDrawCreateEx( GUID FAR * lpGuid, LPVOID *lplpDD, REFIID iid,IUnknown FAR *pUnkOuter ); - extern HRESULT WINAPI DirectDrawCreateClipper( DWORD dwFlags, LPDIRECTDRAWCLIPPER FAR *lplpDDClipper, IUnknown FAR *pUnkOuter ); -#endif -/* - * Flags for DirectDrawEnumerateEx - * DirectDrawEnumerateEx supercedes DirectDrawEnumerate. You must use GetProcAddress to - * obtain a function pointer (of type LPDIRECTDRAWENUMERATEEX) to DirectDrawEnumerateEx. - * By default, only the primary display device is enumerated. - * DirectDrawEnumerate is equivalent to DirectDrawEnumerate(,,DDENUM_NONDISPLAYDEVICES) - */ - -/* - * This flag causes enumeration of any GDI display devices which are part of - * the Windows Desktop - */ -#define DDENUM_ATTACHEDSECONDARYDEVICES 0x00000001L - -/* - * This flag causes enumeration of any GDI display devices which are not - * part of the Windows Desktop - */ -#define DDENUM_DETACHEDSECONDARYDEVICES 0x00000002L - -/* - * This flag causes enumeration of non-display devices - */ -#define DDENUM_NONDISPLAYDEVICES 0x00000004L - - -#define REGSTR_KEY_DDHW_DESCRIPTION "Description" -#define REGSTR_KEY_DDHW_DRIVERNAME "DriverName" -#define REGSTR_PATH_DDHW "Hardware\\DirectDrawDrivers" - -#define DDCREATE_HARDWAREONLY 0x00000001l -#define DDCREATE_EMULATIONONLY 0x00000002l - -#if defined(WINNT) || !defined(WIN32) -typedef long HRESULT; -#endif - -//#ifndef WINNT -typedef HRESULT (FAR PASCAL * LPDDENUMMODESCALLBACK)(LPDDSURFACEDESC, LPVOID); -typedef HRESULT (FAR PASCAL * LPDDENUMMODESCALLBACK2)(LPDDSURFACEDESC2, LPVOID); -typedef HRESULT (FAR PASCAL * LPDDENUMSURFACESCALLBACK)(LPDIRECTDRAWSURFACE, LPDDSURFACEDESC, LPVOID); -typedef HRESULT (FAR PASCAL * LPDDENUMSURFACESCALLBACK2)(LPDIRECTDRAWSURFACE4, LPDDSURFACEDESC2, LPVOID); -typedef HRESULT (FAR PASCAL * LPDDENUMSURFACESCALLBACK7)(LPDIRECTDRAWSURFACE7, LPDDSURFACEDESC2, LPVOID); -//#endif - -/* - * Generic pixel format with 8-bit RGB and alpha components - */ -typedef struct _DDARGB -{ - BYTE blue; - BYTE green; - BYTE red; - BYTE alpha; -} DDARGB; - -typedef DDARGB FAR *LPDDARGB; - -/* - * This version of the structure remains for backwards source compatibility. - * The DDARGB structure is the one that should be used for all DirectDraw APIs. - */ -typedef struct _DDRGBA -{ - BYTE red; - BYTE green; - BYTE blue; - BYTE alpha; -} DDRGBA; - -typedef DDRGBA FAR *LPDDRGBA; - - -/* - * DDCOLORKEY - */ -typedef struct _DDCOLORKEY -{ - DWORD dwColorSpaceLowValue; // low boundary of color space that is to - // be treated as Color Key, inclusive - DWORD dwColorSpaceHighValue; // high boundary of color space that is - // to be treated as Color Key, inclusive -} DDCOLORKEY; - -typedef DDCOLORKEY FAR* LPDDCOLORKEY; - -/* - * DDBLTFX - * Used to pass override information to the DIRECTDRAWSURFACE callback Blt. - */ -typedef struct _DDBLTFX -{ - DWORD dwSize; // size of structure - DWORD dwDDFX; // FX operations - DWORD dwROP; // Win32 raster operations - DWORD dwDDROP; // Raster operations new for DirectDraw - DWORD dwRotationAngle; // Rotation angle for blt - DWORD dwZBufferOpCode; // ZBuffer compares - DWORD dwZBufferLow; // Low limit of Z buffer - DWORD dwZBufferHigh; // High limit of Z buffer - DWORD dwZBufferBaseDest; // Destination base value - DWORD dwZDestConstBitDepth; // Bit depth used to specify Z constant for destination - union - { - DWORD dwZDestConst; // Constant to use as Z buffer for dest - LPDIRECTDRAWSURFACE lpDDSZBufferDest; // Surface to use as Z buffer for dest - } DUMMYUNIONNAMEN(1); - DWORD dwZSrcConstBitDepth; // Bit depth used to specify Z constant for source - union - { - DWORD dwZSrcConst; // Constant to use as Z buffer for src - LPDIRECTDRAWSURFACE lpDDSZBufferSrc; // Surface to use as Z buffer for src - } DUMMYUNIONNAMEN(2); - DWORD dwAlphaEdgeBlendBitDepth; // Bit depth used to specify constant for alpha edge blend - DWORD dwAlphaEdgeBlend; // Alpha for edge blending - DWORD dwReserved; - DWORD dwAlphaDestConstBitDepth; // Bit depth used to specify alpha constant for destination - union - { - DWORD dwAlphaDestConst; // Constant to use as Alpha Channel - LPDIRECTDRAWSURFACE lpDDSAlphaDest; // Surface to use as Alpha Channel - } DUMMYUNIONNAMEN(3); - DWORD dwAlphaSrcConstBitDepth; // Bit depth used to specify alpha constant for source - union - { - DWORD dwAlphaSrcConst; // Constant to use as Alpha Channel - LPDIRECTDRAWSURFACE lpDDSAlphaSrc; // Surface to use as Alpha Channel - } DUMMYUNIONNAMEN(4); - union - { - DWORD dwFillColor; // color in RGB or Palettized - DWORD dwFillDepth; // depth value for z-buffer - DWORD dwFillPixel; // pixel value for RGBA or RGBZ - LPDIRECTDRAWSURFACE lpDDSPattern; // Surface to use as pattern - } DUMMYUNIONNAMEN(5); - DDCOLORKEY ddckDestColorkey; // DestColorkey override - DDCOLORKEY ddckSrcColorkey; // SrcColorkey override -} DDBLTFX; - -typedef DDBLTFX FAR* LPDDBLTFX; - - - -/* - * DDSCAPS - */ -typedef struct _DDSCAPS -{ - DWORD dwCaps; // capabilities of surface wanted -} DDSCAPS; - -typedef DDSCAPS FAR* LPDDSCAPS; - - -/* - * DDOSCAPS - */ -typedef struct _DDOSCAPS -{ - DWORD dwCaps; // capabilities of surface wanted -} DDOSCAPS; - -typedef DDOSCAPS FAR* LPDDOSCAPS; - -/* - * This structure is used internally by DirectDraw. - */ -typedef struct _DDSCAPSEX -{ - DWORD dwCaps2; - DWORD dwCaps3; - union - { - DWORD dwCaps4; - DWORD dwVolumeDepth; - } DUMMYUNIONNAMEN(1); -} DDSCAPSEX, FAR * LPDDSCAPSEX; - -/* - * DDSCAPS2 - */ -typedef struct _DDSCAPS2 -{ - DWORD dwCaps; // capabilities of surface wanted - DWORD dwCaps2; - DWORD dwCaps3; - union - { - DWORD dwCaps4; - DWORD dwVolumeDepth; - } DUMMYUNIONNAMEN(1); -} DDSCAPS2; - -typedef DDSCAPS2 FAR* LPDDSCAPS2; - -/* - * DDCAPS - */ -#define DD_ROP_SPACE (256/32) // space required to store ROP array -/* - * NOTE: Our choosen structure number scheme is to append a single digit to - * the end of the structure giving the version that structure is associated - * with. - */ - -/* - * This structure represents the DDCAPS structure released in DirectDraw 1.0. It is used internally - * by DirectDraw to interpret caps passed into ddraw by drivers written prior to the release of DirectDraw 2.0. - * New applications should use the DDCAPS structure defined below. - */ -typedef struct _DDCAPS_DX1 -{ - DWORD dwSize; // size of the DDDRIVERCAPS structure - DWORD dwCaps; // driver specific capabilities - DWORD dwCaps2; // more driver specific capabilites - DWORD dwCKeyCaps; // color key capabilities of the surface - DWORD dwFXCaps; // driver specific stretching and effects capabilites - DWORD dwFXAlphaCaps; // alpha driver specific capabilities - DWORD dwPalCaps; // palette capabilities - DWORD dwSVCaps; // stereo vision capabilities - DWORD dwAlphaBltConstBitDepths; // DDBD_2,4,8 - DWORD dwAlphaBltPixelBitDepths; // DDBD_1,2,4,8 - DWORD dwAlphaBltSurfaceBitDepths; // DDBD_1,2,4,8 - DWORD dwAlphaOverlayConstBitDepths; // DDBD_2,4,8 - DWORD dwAlphaOverlayPixelBitDepths; // DDBD_1,2,4,8 - DWORD dwAlphaOverlaySurfaceBitDepths; // DDBD_1,2,4,8 - DWORD dwZBufferBitDepths; // DDBD_8,16,24,32 - DWORD dwVidMemTotal; // total amount of video memory - DWORD dwVidMemFree; // amount of free video memory - DWORD dwMaxVisibleOverlays; // maximum number of visible overlays - DWORD dwCurrVisibleOverlays; // current number of visible overlays - DWORD dwNumFourCCCodes; // number of four cc codes - DWORD dwAlignBoundarySrc; // source rectangle alignment - DWORD dwAlignSizeSrc; // source rectangle byte size - DWORD dwAlignBoundaryDest; // dest rectangle alignment - DWORD dwAlignSizeDest; // dest rectangle byte size - DWORD dwAlignStrideAlign; // stride alignment - DWORD dwRops[DD_ROP_SPACE]; // ROPS supported - DDSCAPS ddsCaps; // DDSCAPS structure has all the general capabilities - DWORD dwMinOverlayStretch; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 - DWORD dwMaxOverlayStretch; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 - DWORD dwMinLiveVideoStretch; // OBSOLETE! This field remains for compatability reasons only - DWORD dwMaxLiveVideoStretch; // OBSOLETE! This field remains for compatability reasons only - DWORD dwMinHwCodecStretch; // OBSOLETE! This field remains for compatability reasons only - DWORD dwMaxHwCodecStretch; // OBSOLETE! This field remains for compatability reasons only - DWORD dwReserved1; // reserved - DWORD dwReserved2; // reserved - DWORD dwReserved3; // reserved -} DDCAPS_DX1; - -typedef DDCAPS_DX1 FAR* LPDDCAPS_DX1; - -/* - * This structure is the DDCAPS structure as it was in version 2 and 3 of Direct X. - * It is present for back compatability. - */ -typedef struct _DDCAPS_DX3 -{ - DWORD dwSize; // size of the DDDRIVERCAPS structure - DWORD dwCaps; // driver specific capabilities - DWORD dwCaps2; // more driver specific capabilites - DWORD dwCKeyCaps; // color key capabilities of the surface - DWORD dwFXCaps; // driver specific stretching and effects capabilites - DWORD dwFXAlphaCaps; // alpha driver specific capabilities - DWORD dwPalCaps; // palette capabilities - DWORD dwSVCaps; // stereo vision capabilities - DWORD dwAlphaBltConstBitDepths; // DDBD_2,4,8 - DWORD dwAlphaBltPixelBitDepths; // DDBD_1,2,4,8 - DWORD dwAlphaBltSurfaceBitDepths; // DDBD_1,2,4,8 - DWORD dwAlphaOverlayConstBitDepths; // DDBD_2,4,8 - DWORD dwAlphaOverlayPixelBitDepths; // DDBD_1,2,4,8 - DWORD dwAlphaOverlaySurfaceBitDepths; // DDBD_1,2,4,8 - DWORD dwZBufferBitDepths; // DDBD_8,16,24,32 - DWORD dwVidMemTotal; // total amount of video memory - DWORD dwVidMemFree; // amount of free video memory - DWORD dwMaxVisibleOverlays; // maximum number of visible overlays - DWORD dwCurrVisibleOverlays; // current number of visible overlays - DWORD dwNumFourCCCodes; // number of four cc codes - DWORD dwAlignBoundarySrc; // source rectangle alignment - DWORD dwAlignSizeSrc; // source rectangle byte size - DWORD dwAlignBoundaryDest; // dest rectangle alignment - DWORD dwAlignSizeDest; // dest rectangle byte size - DWORD dwAlignStrideAlign; // stride alignment - DWORD dwRops[DD_ROP_SPACE]; // ROPS supported - DDSCAPS ddsCaps; // DDSCAPS structure has all the general capabilities - DWORD dwMinOverlayStretch; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 - DWORD dwMaxOverlayStretch; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 - DWORD dwMinLiveVideoStretch; // minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 - DWORD dwMaxLiveVideoStretch; // maximum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 - DWORD dwMinHwCodecStretch; // minimum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 - DWORD dwMaxHwCodecStretch; // maximum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 - DWORD dwReserved1; // reserved - DWORD dwReserved2; // reserved - DWORD dwReserved3; // reserved - DWORD dwSVBCaps; // driver specific capabilities for System->Vmem blts - DWORD dwSVBCKeyCaps; // driver color key capabilities for System->Vmem blts - DWORD dwSVBFXCaps; // driver FX capabilities for System->Vmem blts - DWORD dwSVBRops[DD_ROP_SPACE];// ROPS supported for System->Vmem blts - DWORD dwVSBCaps; // driver specific capabilities for Vmem->System blts - DWORD dwVSBCKeyCaps; // driver color key capabilities for Vmem->System blts - DWORD dwVSBFXCaps; // driver FX capabilities for Vmem->System blts - DWORD dwVSBRops[DD_ROP_SPACE];// ROPS supported for Vmem->System blts - DWORD dwSSBCaps; // driver specific capabilities for System->System blts - DWORD dwSSBCKeyCaps; // driver color key capabilities for System->System blts - DWORD dwSSBFXCaps; // driver FX capabilities for System->System blts - DWORD dwSSBRops[DD_ROP_SPACE];// ROPS supported for System->System blts - DWORD dwReserved4; // reserved - DWORD dwReserved5; // reserved - DWORD dwReserved6; // reserved -} DDCAPS_DX3; -typedef DDCAPS_DX3 FAR* LPDDCAPS_DX3; - -/* - * This structure is the DDCAPS structure as it was in version 5 of Direct X. - * It is present for back compatability. - */ -typedef struct _DDCAPS_DX5 -{ -/* 0*/ DWORD dwSize; // size of the DDDRIVERCAPS structure -/* 4*/ DWORD dwCaps; // driver specific capabilities -/* 8*/ DWORD dwCaps2; // more driver specific capabilites -/* c*/ DWORD dwCKeyCaps; // color key capabilities of the surface -/* 10*/ DWORD dwFXCaps; // driver specific stretching and effects capabilites -/* 14*/ DWORD dwFXAlphaCaps; // alpha driver specific capabilities -/* 18*/ DWORD dwPalCaps; // palette capabilities -/* 1c*/ DWORD dwSVCaps; // stereo vision capabilities -/* 20*/ DWORD dwAlphaBltConstBitDepths; // DDBD_2,4,8 -/* 24*/ DWORD dwAlphaBltPixelBitDepths; // DDBD_1,2,4,8 -/* 28*/ DWORD dwAlphaBltSurfaceBitDepths; // DDBD_1,2,4,8 -/* 2c*/ DWORD dwAlphaOverlayConstBitDepths; // DDBD_2,4,8 -/* 30*/ DWORD dwAlphaOverlayPixelBitDepths; // DDBD_1,2,4,8 -/* 34*/ DWORD dwAlphaOverlaySurfaceBitDepths; // DDBD_1,2,4,8 -/* 38*/ DWORD dwZBufferBitDepths; // DDBD_8,16,24,32 -/* 3c*/ DWORD dwVidMemTotal; // total amount of video memory -/* 40*/ DWORD dwVidMemFree; // amount of free video memory -/* 44*/ DWORD dwMaxVisibleOverlays; // maximum number of visible overlays -/* 48*/ DWORD dwCurrVisibleOverlays; // current number of visible overlays -/* 4c*/ DWORD dwNumFourCCCodes; // number of four cc codes -/* 50*/ DWORD dwAlignBoundarySrc; // source rectangle alignment -/* 54*/ DWORD dwAlignSizeSrc; // source rectangle byte size -/* 58*/ DWORD dwAlignBoundaryDest; // dest rectangle alignment -/* 5c*/ DWORD dwAlignSizeDest; // dest rectangle byte size -/* 60*/ DWORD dwAlignStrideAlign; // stride alignment -/* 64*/ DWORD dwRops[DD_ROP_SPACE]; // ROPS supported -/* 84*/ DDSCAPS ddsCaps; // DDSCAPS structure has all the general capabilities -/* 88*/ DWORD dwMinOverlayStretch; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* 8c*/ DWORD dwMaxOverlayStretch; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* 90*/ DWORD dwMinLiveVideoStretch; // minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* 94*/ DWORD dwMaxLiveVideoStretch; // maximum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* 98*/ DWORD dwMinHwCodecStretch; // minimum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* 9c*/ DWORD dwMaxHwCodecStretch; // maximum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* a0*/ DWORD dwReserved1; // reserved -/* a4*/ DWORD dwReserved2; // reserved -/* a8*/ DWORD dwReserved3; // reserved -/* ac*/ DWORD dwSVBCaps; // driver specific capabilities for System->Vmem blts -/* b0*/ DWORD dwSVBCKeyCaps; // driver color key capabilities for System->Vmem blts -/* b4*/ DWORD dwSVBFXCaps; // driver FX capabilities for System->Vmem blts -/* b8*/ DWORD dwSVBRops[DD_ROP_SPACE];// ROPS supported for System->Vmem blts -/* d8*/ DWORD dwVSBCaps; // driver specific capabilities for Vmem->System blts -/* dc*/ DWORD dwVSBCKeyCaps; // driver color key capabilities for Vmem->System blts -/* e0*/ DWORD dwVSBFXCaps; // driver FX capabilities for Vmem->System blts -/* e4*/ DWORD dwVSBRops[DD_ROP_SPACE];// ROPS supported for Vmem->System blts -/*104*/ DWORD dwSSBCaps; // driver specific capabilities for System->System blts -/*108*/ DWORD dwSSBCKeyCaps; // driver color key capabilities for System->System blts -/*10c*/ DWORD dwSSBFXCaps; // driver FX capabilities for System->System blts -/*110*/ DWORD dwSSBRops[DD_ROP_SPACE];// ROPS supported for System->System blts -// Members added for DX5: -/*130*/ DWORD dwMaxVideoPorts; // maximum number of usable video ports -/*134*/ DWORD dwCurrVideoPorts; // current number of video ports used -/*138*/ DWORD dwSVBCaps2; // more driver specific capabilities for System->Vmem blts -/*13c*/ DWORD dwNLVBCaps; // driver specific capabilities for non-local->local vidmem blts -/*140*/ DWORD dwNLVBCaps2; // more driver specific capabilities non-local->local vidmem blts -/*144*/ DWORD dwNLVBCKeyCaps; // driver color key capabilities for non-local->local vidmem blts -/*148*/ DWORD dwNLVBFXCaps; // driver FX capabilities for non-local->local blts -/*14c*/ DWORD dwNLVBRops[DD_ROP_SPACE]; // ROPS supported for non-local->local blts -} DDCAPS_DX5; -typedef DDCAPS_DX5 FAR* LPDDCAPS_DX5; - -typedef struct _DDCAPS_DX6 -{ -/* 0*/ DWORD dwSize; // size of the DDDRIVERCAPS structure -/* 4*/ DWORD dwCaps; // driver specific capabilities -/* 8*/ DWORD dwCaps2; // more driver specific capabilites -/* c*/ DWORD dwCKeyCaps; // color key capabilities of the surface -/* 10*/ DWORD dwFXCaps; // driver specific stretching and effects capabilites -/* 14*/ DWORD dwFXAlphaCaps; // alpha caps -/* 18*/ DWORD dwPalCaps; // palette capabilities -/* 1c*/ DWORD dwSVCaps; // stereo vision capabilities -/* 20*/ DWORD dwAlphaBltConstBitDepths; // DDBD_2,4,8 -/* 24*/ DWORD dwAlphaBltPixelBitDepths; // DDBD_1,2,4,8 -/* 28*/ DWORD dwAlphaBltSurfaceBitDepths; // DDBD_1,2,4,8 -/* 2c*/ DWORD dwAlphaOverlayConstBitDepths; // DDBD_2,4,8 -/* 30*/ DWORD dwAlphaOverlayPixelBitDepths; // DDBD_1,2,4,8 -/* 34*/ DWORD dwAlphaOverlaySurfaceBitDepths; // DDBD_1,2,4,8 -/* 38*/ DWORD dwZBufferBitDepths; // DDBD_8,16,24,32 -/* 3c*/ DWORD dwVidMemTotal; // total amount of video memory -/* 40*/ DWORD dwVidMemFree; // amount of free video memory -/* 44*/ DWORD dwMaxVisibleOverlays; // maximum number of visible overlays -/* 48*/ DWORD dwCurrVisibleOverlays; // current number of visible overlays -/* 4c*/ DWORD dwNumFourCCCodes; // number of four cc codes -/* 50*/ DWORD dwAlignBoundarySrc; // source rectangle alignment -/* 54*/ DWORD dwAlignSizeSrc; // source rectangle byte size -/* 58*/ DWORD dwAlignBoundaryDest; // dest rectangle alignment -/* 5c*/ DWORD dwAlignSizeDest; // dest rectangle byte size -/* 60*/ DWORD dwAlignStrideAlign; // stride alignment -/* 64*/ DWORD dwRops[DD_ROP_SPACE]; // ROPS supported -/* 84*/ DDSCAPS ddsOldCaps; // Was DDSCAPS ddsCaps. ddsCaps is of type DDSCAPS2 for DX6 -/* 88*/ DWORD dwMinOverlayStretch; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* 8c*/ DWORD dwMaxOverlayStretch; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* 90*/ DWORD dwMinLiveVideoStretch; // minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* 94*/ DWORD dwMaxLiveVideoStretch; // maximum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* 98*/ DWORD dwMinHwCodecStretch; // minimum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* 9c*/ DWORD dwMaxHwCodecStretch; // maximum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* a0*/ DWORD dwReserved1; // reserved -/* a4*/ DWORD dwReserved2; // reserved -/* a8*/ DWORD dwReserved3; // reserved -/* ac*/ DWORD dwSVBCaps; // driver specific capabilities for System->Vmem blts -/* b0*/ DWORD dwSVBCKeyCaps; // driver color key capabilities for System->Vmem blts -/* b4*/ DWORD dwSVBFXCaps; // driver FX capabilities for System->Vmem blts -/* b8*/ DWORD dwSVBRops[DD_ROP_SPACE];// ROPS supported for System->Vmem blts -/* d8*/ DWORD dwVSBCaps; // driver specific capabilities for Vmem->System blts -/* dc*/ DWORD dwVSBCKeyCaps; // driver color key capabilities for Vmem->System blts -/* e0*/ DWORD dwVSBFXCaps; // driver FX capabilities for Vmem->System blts -/* e4*/ DWORD dwVSBRops[DD_ROP_SPACE];// ROPS supported for Vmem->System blts -/*104*/ DWORD dwSSBCaps; // driver specific capabilities for System->System blts -/*108*/ DWORD dwSSBCKeyCaps; // driver color key capabilities for System->System blts -/*10c*/ DWORD dwSSBFXCaps; // driver FX capabilities for System->System blts -/*110*/ DWORD dwSSBRops[DD_ROP_SPACE];// ROPS supported for System->System blts -/*130*/ DWORD dwMaxVideoPorts; // maximum number of usable video ports -/*134*/ DWORD dwCurrVideoPorts; // current number of video ports used -/*138*/ DWORD dwSVBCaps2; // more driver specific capabilities for System->Vmem blts -/*13c*/ DWORD dwNLVBCaps; // driver specific capabilities for non-local->local vidmem blts -/*140*/ DWORD dwNLVBCaps2; // more driver specific capabilities non-local->local vidmem blts -/*144*/ DWORD dwNLVBCKeyCaps; // driver color key capabilities for non-local->local vidmem blts -/*148*/ DWORD dwNLVBFXCaps; // driver FX capabilities for non-local->local blts -/*14c*/ DWORD dwNLVBRops[DD_ROP_SPACE]; // ROPS supported for non-local->local blts -// Members added for DX6 release -/*16c*/ DDSCAPS2 ddsCaps; // Surface Caps -} DDCAPS_DX6; -typedef DDCAPS_DX6 FAR* LPDDCAPS_DX6; - -typedef struct _DDCAPS_DX7 -{ -/* 0*/ DWORD dwSize; // size of the DDDRIVERCAPS structure -/* 4*/ DWORD dwCaps; // driver specific capabilities -/* 8*/ DWORD dwCaps2; // more driver specific capabilites -/* c*/ DWORD dwCKeyCaps; // color key capabilities of the surface -/* 10*/ DWORD dwFXCaps; // driver specific stretching and effects capabilites -/* 14*/ DWORD dwFXAlphaCaps; // alpha driver specific capabilities -/* 18*/ DWORD dwPalCaps; // palette capabilities -/* 1c*/ DWORD dwSVCaps; // stereo vision capabilities -/* 20*/ DWORD dwAlphaBltConstBitDepths; // DDBD_2,4,8 -/* 24*/ DWORD dwAlphaBltPixelBitDepths; // DDBD_1,2,4,8 -/* 28*/ DWORD dwAlphaBltSurfaceBitDepths; // DDBD_1,2,4,8 -/* 2c*/ DWORD dwAlphaOverlayConstBitDepths; // DDBD_2,4,8 -/* 30*/ DWORD dwAlphaOverlayPixelBitDepths; // DDBD_1,2,4,8 -/* 34*/ DWORD dwAlphaOverlaySurfaceBitDepths; // DDBD_1,2,4,8 -/* 38*/ DWORD dwZBufferBitDepths; // DDBD_8,16,24,32 -/* 3c*/ DWORD dwVidMemTotal; // total amount of video memory -/* 40*/ DWORD dwVidMemFree; // amount of free video memory -/* 44*/ DWORD dwMaxVisibleOverlays; // maximum number of visible overlays -/* 48*/ DWORD dwCurrVisibleOverlays; // current number of visible overlays -/* 4c*/ DWORD dwNumFourCCCodes; // number of four cc codes -/* 50*/ DWORD dwAlignBoundarySrc; // source rectangle alignment -/* 54*/ DWORD dwAlignSizeSrc; // source rectangle byte size -/* 58*/ DWORD dwAlignBoundaryDest; // dest rectangle alignment -/* 5c*/ DWORD dwAlignSizeDest; // dest rectangle byte size -/* 60*/ DWORD dwAlignStrideAlign; // stride alignment -/* 64*/ DWORD dwRops[DD_ROP_SPACE]; // ROPS supported -/* 84*/ DDSCAPS ddsOldCaps; // Was DDSCAPS ddsCaps. ddsCaps is of type DDSCAPS2 for DX6 -/* 88*/ DWORD dwMinOverlayStretch; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* 8c*/ DWORD dwMaxOverlayStretch; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* 90*/ DWORD dwMinLiveVideoStretch; // minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* 94*/ DWORD dwMaxLiveVideoStretch; // maximum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* 98*/ DWORD dwMinHwCodecStretch; // minimum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* 9c*/ DWORD dwMaxHwCodecStretch; // maximum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 -/* a0*/ DWORD dwReserved1; // reserved -/* a4*/ DWORD dwReserved2; // reserved -/* a8*/ DWORD dwReserved3; // reserved -/* ac*/ DWORD dwSVBCaps; // driver specific capabilities for System->Vmem blts -/* b0*/ DWORD dwSVBCKeyCaps; // driver color key capabilities for System->Vmem blts -/* b4*/ DWORD dwSVBFXCaps; // driver FX capabilities for System->Vmem blts -/* b8*/ DWORD dwSVBRops[DD_ROP_SPACE];// ROPS supported for System->Vmem blts -/* d8*/ DWORD dwVSBCaps; // driver specific capabilities for Vmem->System blts -/* dc*/ DWORD dwVSBCKeyCaps; // driver color key capabilities for Vmem->System blts -/* e0*/ DWORD dwVSBFXCaps; // driver FX capabilities for Vmem->System blts -/* e4*/ DWORD dwVSBRops[DD_ROP_SPACE];// ROPS supported for Vmem->System blts -/*104*/ DWORD dwSSBCaps; // driver specific capabilities for System->System blts -/*108*/ DWORD dwSSBCKeyCaps; // driver color key capabilities for System->System blts -/*10c*/ DWORD dwSSBFXCaps; // driver FX capabilities for System->System blts -/*110*/ DWORD dwSSBRops[DD_ROP_SPACE];// ROPS supported for System->System blts -/*130*/ DWORD dwMaxVideoPorts; // maximum number of usable video ports -/*134*/ DWORD dwCurrVideoPorts; // current number of video ports used -/*138*/ DWORD dwSVBCaps2; // more driver specific capabilities for System->Vmem blts -/*13c*/ DWORD dwNLVBCaps; // driver specific capabilities for non-local->local vidmem blts -/*140*/ DWORD dwNLVBCaps2; // more driver specific capabilities non-local->local vidmem blts -/*144*/ DWORD dwNLVBCKeyCaps; // driver color key capabilities for non-local->local vidmem blts -/*148*/ DWORD dwNLVBFXCaps; // driver FX capabilities for non-local->local blts -/*14c*/ DWORD dwNLVBRops[DD_ROP_SPACE]; // ROPS supported for non-local->local blts -// Members added for DX6 release -/*16c*/ DDSCAPS2 ddsCaps; // Surface Caps -} DDCAPS_DX7; -typedef DDCAPS_DX7 FAR* LPDDCAPS_DX7; - - -#if DIRECTDRAW_VERSION <= 0x300 - typedef DDCAPS_DX3 DDCAPS; -#elif DIRECTDRAW_VERSION <= 0x500 - typedef DDCAPS_DX5 DDCAPS; -#elif DIRECTDRAW_VERSION <= 0x600 - typedef DDCAPS_DX6 DDCAPS; -#else - typedef DDCAPS_DX7 DDCAPS; -#endif - -typedef DDCAPS FAR* LPDDCAPS; - - - -/* - * DDPIXELFORMAT - */ -typedef struct _DDPIXELFORMAT -{ - DWORD dwSize; // size of structure - DWORD dwFlags; // pixel format flags - DWORD dwFourCC; // (FOURCC code) - union - { - DWORD dwRGBBitCount; // how many bits per pixel - DWORD dwYUVBitCount; // how many bits per pixel - DWORD dwZBufferBitDepth; // how many total bits/pixel in z buffer (including any stencil bits) - DWORD dwAlphaBitDepth; // how many bits for alpha channels - DWORD dwLuminanceBitCount; // how many bits per pixel - DWORD dwBumpBitCount; // how many bits per "buxel", total - DWORD dwPrivateFormatBitCount;// Bits per pixel of private driver formats. Only valid in texture - // format list and if DDPF_D3DFORMAT is set - } DUMMYUNIONNAMEN(1); - union - { - DWORD dwRBitMask; // mask for red bit - DWORD dwYBitMask; // mask for Y bits - DWORD dwStencilBitDepth; // how many stencil bits (note: dwZBufferBitDepth-dwStencilBitDepth is total Z-only bits) - DWORD dwLuminanceBitMask; // mask for luminance bits - DWORD dwBumpDuBitMask; // mask for bump map U delta bits - DWORD dwOperations; // DDPF_D3DFORMAT Operations - } DUMMYUNIONNAMEN(2); - union - { - DWORD dwGBitMask; // mask for green bits - DWORD dwUBitMask; // mask for U bits - DWORD dwZBitMask; // mask for Z bits - DWORD dwBumpDvBitMask; // mask for bump map V delta bits - struct - { - WORD wFlipMSTypes; // Multisample methods supported via flip for this D3DFORMAT - WORD wBltMSTypes; // Multisample methods supported via blt for this D3DFORMAT - } MultiSampleCaps; - - } DUMMYUNIONNAMEN(3); - union - { - DWORD dwBBitMask; // mask for blue bits - DWORD dwVBitMask; // mask for V bits - DWORD dwStencilBitMask; // mask for stencil bits - DWORD dwBumpLuminanceBitMask; // mask for luminance in bump map - } DUMMYUNIONNAMEN(4); - union - { - DWORD dwRGBAlphaBitMask; // mask for alpha channel - DWORD dwYUVAlphaBitMask; // mask for alpha channel - DWORD dwLuminanceAlphaBitMask;// mask for alpha channel - DWORD dwRGBZBitMask; // mask for Z channel - DWORD dwYUVZBitMask; // mask for Z channel - } DUMMYUNIONNAMEN(5); -} DDPIXELFORMAT; - -typedef DDPIXELFORMAT FAR* LPDDPIXELFORMAT; - -/* - * DDOVERLAYFX - */ -typedef struct _DDOVERLAYFX -{ - DWORD dwSize; // size of structure - DWORD dwAlphaEdgeBlendBitDepth; // Bit depth used to specify constant for alpha edge blend - DWORD dwAlphaEdgeBlend; // Constant to use as alpha for edge blend - DWORD dwReserved; - DWORD dwAlphaDestConstBitDepth; // Bit depth used to specify alpha constant for destination - union - { - DWORD dwAlphaDestConst; // Constant to use as alpha channel for dest - LPDIRECTDRAWSURFACE lpDDSAlphaDest; // Surface to use as alpha channel for dest - } DUMMYUNIONNAMEN(1); - DWORD dwAlphaSrcConstBitDepth; // Bit depth used to specify alpha constant for source - union - { - DWORD dwAlphaSrcConst; // Constant to use as alpha channel for src - LPDIRECTDRAWSURFACE lpDDSAlphaSrc; // Surface to use as alpha channel for src - } DUMMYUNIONNAMEN(2); - DDCOLORKEY dckDestColorkey; // DestColorkey override - DDCOLORKEY dckSrcColorkey; // DestColorkey override - DWORD dwDDFX; // Overlay FX - DWORD dwFlags; // flags -} DDOVERLAYFX; - -typedef DDOVERLAYFX FAR *LPDDOVERLAYFX; - - -/* - * DDBLTBATCH: BltBatch entry structure - */ -typedef struct _DDBLTBATCH -{ - LPRECT lprDest; - LPDIRECTDRAWSURFACE lpDDSSrc; - LPRECT lprSrc; - DWORD dwFlags; - LPDDBLTFX lpDDBltFx; -} DDBLTBATCH; - -typedef DDBLTBATCH FAR * LPDDBLTBATCH; - - -/* - * DDGAMMARAMP - */ -typedef struct _DDGAMMARAMP -{ - WORD red[256]; - WORD green[256]; - WORD blue[256]; -} DDGAMMARAMP; -typedef DDGAMMARAMP FAR * LPDDGAMMARAMP; - -/* - * This is the structure within which DirectDraw returns data about the current graphics driver and chipset - */ - -#define MAX_DDDEVICEID_STRING 512 - -typedef struct tagDDDEVICEIDENTIFIER -{ - /* - * These elements are for presentation to the user only. They should not be used to identify particular - * drivers, since this is unreliable and many different strings may be associated with the same - * device, and the same driver from different vendors. - */ - char szDriver[MAX_DDDEVICEID_STRING]; - char szDescription[MAX_DDDEVICEID_STRING]; - - /* - * This element is the version of the DirectDraw/3D driver. It is legal to do <, > comparisons - * on the whole 64 bits. Caution should be exercised if you use this element to identify problematic - * drivers. It is recommended that guidDeviceIdentifier is used for this purpose. - * - * This version has the form: - * wProduct = HIWORD(liDriverVersion.HighPart) - * wVersion = LOWORD(liDriverVersion.HighPart) - * wSubVersion = HIWORD(liDriverVersion.LowPart) - * wBuild = LOWORD(liDriverVersion.LowPart) - */ -#ifdef _WIN32 - LARGE_INTEGER liDriverVersion; /* Defined for applications and other 32 bit components */ -#else - DWORD dwDriverVersionLowPart; /* Defined for 16 bit driver components */ - DWORD dwDriverVersionHighPart; -#endif - - - /* - * These elements can be used to identify particular chipsets. Use with extreme caution. - * dwVendorId Identifies the manufacturer. May be zero if unknown. - * dwDeviceId Identifies the type of chipset. May be zero if unknown. - * dwSubSysId Identifies the subsystem, typically this means the particular board. May be zero if unknown. - * dwRevision Identifies the revision level of the chipset. May be zero if unknown. - */ - DWORD dwVendorId; - DWORD dwDeviceId; - DWORD dwSubSysId; - DWORD dwRevision; - - /* - * This element can be used to check changes in driver/chipset. This GUID is a unique identifier for the - * driver/chipset pair. Use this element if you wish to track changes to the driver/chipset in order to - * reprofile the graphics subsystem. - * This element can also be used to identify particular problematic drivers. - */ - GUID guidDeviceIdentifier; -} DDDEVICEIDENTIFIER, * LPDDDEVICEIDENTIFIER; - -typedef struct tagDDDEVICEIDENTIFIER2 -{ - /* - * These elements are for presentation to the user only. They should not be used to identify particular - * drivers, since this is unreliable and many different strings may be associated with the same - * device, and the same driver from different vendors. - */ - char szDriver[MAX_DDDEVICEID_STRING]; - char szDescription[MAX_DDDEVICEID_STRING]; - - /* - * This element is the version of the DirectDraw/3D driver. It is legal to do <, > comparisons - * on the whole 64 bits. Caution should be exercised if you use this element to identify problematic - * drivers. It is recommended that guidDeviceIdentifier is used for this purpose. - * - * This version has the form: - * wProduct = HIWORD(liDriverVersion.HighPart) - * wVersion = LOWORD(liDriverVersion.HighPart) - * wSubVersion = HIWORD(liDriverVersion.LowPart) - * wBuild = LOWORD(liDriverVersion.LowPart) - */ -#ifdef _WIN32 - LARGE_INTEGER liDriverVersion; /* Defined for applications and other 32 bit components */ -#else - DWORD dwDriverVersionLowPart; /* Defined for 16 bit driver components */ - DWORD dwDriverVersionHighPart; -#endif - - - /* - * These elements can be used to identify particular chipsets. Use with extreme caution. - * dwVendorId Identifies the manufacturer. May be zero if unknown. - * dwDeviceId Identifies the type of chipset. May be zero if unknown. - * dwSubSysId Identifies the subsystem, typically this means the particular board. May be zero if unknown. - * dwRevision Identifies the revision level of the chipset. May be zero if unknown. - */ - DWORD dwVendorId; - DWORD dwDeviceId; - DWORD dwSubSysId; - DWORD dwRevision; - - /* - * This element can be used to check changes in driver/chipset. This GUID is a unique identifier for the - * driver/chipset pair. Use this element if you wish to track changes to the driver/chipset in order to - * reprofile the graphics subsystem. - * This element can also be used to identify particular problematic drivers. - */ - GUID guidDeviceIdentifier; - - /* - * This element is used to determine the Windows Hardware Quality Lab (WHQL) - * certification level for this driver/device pair. - */ - DWORD dwWHQLLevel; - -} DDDEVICEIDENTIFIER2, * LPDDDEVICEIDENTIFIER2; - -/* - * Flags for the IDirectDraw4::GetDeviceIdentifier method - */ - -/* - * This flag causes GetDeviceIdentifier to return information about the host (typically 2D) adapter in a system equipped - * with a stacked secondary 3D adapter. Such an adapter appears to the application as if it were part of the - * host adapter, but is typically physcially located on a separate card. The stacked secondary's information is - * returned when GetDeviceIdentifier's dwFlags field is zero, since this most accurately reflects the qualities - * of the DirectDraw object involved. - */ -#define DDGDI_GETHOSTIDENTIFIER 0x00000001L - -/* - * Macros for interpretting DDEVICEIDENTIFIER2.dwWHQLLevel - */ -#define GET_WHQL_YEAR( dwWHQLLevel ) \ - ( (dwWHQLLevel) / 0x10000 ) -#define GET_WHQL_MONTH( dwWHQLLevel ) \ - ( ( (dwWHQLLevel) / 0x100 ) & 0x00ff ) -#define GET_WHQL_DAY( dwWHQLLevel ) \ - ( (dwWHQLLevel) & 0xff ) - - -/* - * callbacks - */ -typedef DWORD (FAR PASCAL *LPCLIPPERCALLBACK)(LPDIRECTDRAWCLIPPER lpDDClipper, HWND hWnd, DWORD code, LPVOID lpContext ); -#ifdef STREAMING -typedef DWORD (FAR PASCAL *LPSURFACESTREAMINGCALLBACK)(DWORD); -#endif - - -/* - * INTERACES FOLLOW: - * IDirectDraw - * IDirectDrawClipper - * IDirectDrawPalette - * IDirectDrawSurface - */ - -/* - * IDirectDraw - */ -#if defined( _WIN32 ) && !defined( _NO_COM ) -#undef INTERFACE -#define INTERFACE IDirectDraw -DECLARE_INTERFACE_( IDirectDraw, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDraw methods ***/ - STDMETHOD(Compact)(THIS) PURE; - STDMETHOD(CreateClipper)(THIS_ DWORD, LPDIRECTDRAWCLIPPER FAR*, IUnknown FAR * ) PURE; - STDMETHOD(CreatePalette)(THIS_ DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE FAR*, IUnknown FAR * ) PURE; - STDMETHOD(CreateSurface)(THIS_ LPDDSURFACEDESC, LPDIRECTDRAWSURFACE FAR *, IUnknown FAR *) PURE; - STDMETHOD(DuplicateSurface)( THIS_ LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE FAR * ) PURE; - STDMETHOD(EnumDisplayModes)( THIS_ DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK ) PURE; - STDMETHOD(EnumSurfaces)(THIS_ DWORD, LPDDSURFACEDESC, LPVOID,LPDDENUMSURFACESCALLBACK ) PURE; - STDMETHOD(FlipToGDISurface)(THIS) PURE; - STDMETHOD(GetCaps)( THIS_ LPDDCAPS, LPDDCAPS) PURE; - STDMETHOD(GetDisplayMode)( THIS_ LPDDSURFACEDESC) PURE; - STDMETHOD(GetFourCCCodes)(THIS_ LPDWORD, LPDWORD ) PURE; - STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE FAR *) PURE; - STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD) PURE; - STDMETHOD(GetScanLine)(THIS_ LPDWORD) PURE; - STDMETHOD(GetVerticalBlankStatus)(THIS_ LPBOOL ) PURE; - STDMETHOD(Initialize)(THIS_ GUID FAR *) PURE; - STDMETHOD(RestoreDisplayMode)(THIS) PURE; - STDMETHOD(SetCooperativeLevel)(THIS_ HWND, DWORD) PURE; - STDMETHOD(SetDisplayMode)(THIS_ DWORD, DWORD,DWORD) PURE; - STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD, HANDLE ) PURE; -}; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectDraw_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) -#define IDirectDraw_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectDraw_Release(p) (p)->lpVtbl->Release(p) -#define IDirectDraw_Compact(p) (p)->lpVtbl->Compact(p) -#define IDirectDraw_CreateClipper(p, a, b, c) (p)->lpVtbl->CreateClipper(p, a, b, c) -#define IDirectDraw_CreatePalette(p, a, b, c, d) (p)->lpVtbl->CreatePalette(p, a, b, c, d) -#define IDirectDraw_CreateSurface(p, a, b, c) (p)->lpVtbl->CreateSurface(p, a, b, c) -#define IDirectDraw_DuplicateSurface(p, a, b) (p)->lpVtbl->DuplicateSurface(p, a, b) -#define IDirectDraw_EnumDisplayModes(p, a, b, c, d) (p)->lpVtbl->EnumDisplayModes(p, a, b, c, d) -#define IDirectDraw_EnumSurfaces(p, a, b, c, d) (p)->lpVtbl->EnumSurfaces(p, a, b, c, d) -#define IDirectDraw_FlipToGDISurface(p) (p)->lpVtbl->FlipToGDISurface(p) -#define IDirectDraw_GetCaps(p, a, b) (p)->lpVtbl->GetCaps(p, a, b) -#define IDirectDraw_GetDisplayMode(p, a) (p)->lpVtbl->GetDisplayMode(p, a) -#define IDirectDraw_GetFourCCCodes(p, a, b) (p)->lpVtbl->GetFourCCCodes(p, a, b) -#define IDirectDraw_GetGDISurface(p, a) (p)->lpVtbl->GetGDISurface(p, a) -#define IDirectDraw_GetMonitorFrequency(p, a) (p)->lpVtbl->GetMonitorFrequency(p, a) -#define IDirectDraw_GetScanLine(p, a) (p)->lpVtbl->GetScanLine(p, a) -#define IDirectDraw_GetVerticalBlankStatus(p, a) (p)->lpVtbl->GetVerticalBlankStatus(p, a) -#define IDirectDraw_Initialize(p, a) (p)->lpVtbl->Initialize(p, a) -#define IDirectDraw_RestoreDisplayMode(p) (p)->lpVtbl->RestoreDisplayMode(p) -#define IDirectDraw_SetCooperativeLevel(p, a, b) (p)->lpVtbl->SetCooperativeLevel(p, a, b) -#define IDirectDraw_SetDisplayMode(p, a, b, c) (p)->lpVtbl->SetDisplayMode(p, a, b, c) -#define IDirectDraw_WaitForVerticalBlank(p, a, b) (p)->lpVtbl->WaitForVerticalBlank(p, a, b) -#else -#define IDirectDraw_QueryInterface(p, a, b) (p)->QueryInterface(a, b) -#define IDirectDraw_AddRef(p) (p)->AddRef() -#define IDirectDraw_Release(p) (p)->Release() -#define IDirectDraw_Compact(p) (p)->Compact() -#define IDirectDraw_CreateClipper(p, a, b, c) (p)->CreateClipper(a, b, c) -#define IDirectDraw_CreatePalette(p, a, b, c, d) (p)->CreatePalette(a, b, c, d) -#define IDirectDraw_CreateSurface(p, a, b, c) (p)->CreateSurface(a, b, c) -#define IDirectDraw_DuplicateSurface(p, a, b) (p)->DuplicateSurface(a, b) -#define IDirectDraw_EnumDisplayModes(p, a, b, c, d) (p)->EnumDisplayModes(a, b, c, d) -#define IDirectDraw_EnumSurfaces(p, a, b, c, d) (p)->EnumSurfaces(a, b, c, d) -#define IDirectDraw_FlipToGDISurface(p) (p)->FlipToGDISurface() -#define IDirectDraw_GetCaps(p, a, b) (p)->GetCaps(a, b) -#define IDirectDraw_GetDisplayMode(p, a) (p)->GetDisplayMode(a) -#define IDirectDraw_GetFourCCCodes(p, a, b) (p)->GetFourCCCodes(a, b) -#define IDirectDraw_GetGDISurface(p, a) (p)->GetGDISurface(a) -#define IDirectDraw_GetMonitorFrequency(p, a) (p)->GetMonitorFrequency(a) -#define IDirectDraw_GetScanLine(p, a) (p)->GetScanLine(a) -#define IDirectDraw_GetVerticalBlankStatus(p, a) (p)->GetVerticalBlankStatus(a) -#define IDirectDraw_Initialize(p, a) (p)->Initialize(a) -#define IDirectDraw_RestoreDisplayMode(p) (p)->RestoreDisplayMode() -#define IDirectDraw_SetCooperativeLevel(p, a, b) (p)->SetCooperativeLevel(a, b) -#define IDirectDraw_SetDisplayMode(p, a, b, c) (p)->SetDisplayMode(a, b, c) -#define IDirectDraw_WaitForVerticalBlank(p, a, b) (p)->WaitForVerticalBlank(a, b) -#endif - -#endif - -#if defined( _WIN32 ) && !defined( _NO_COM ) -#undef INTERFACE -#define INTERFACE IDirectDraw2 -DECLARE_INTERFACE_( IDirectDraw2, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDraw methods ***/ - STDMETHOD(Compact)(THIS) PURE; - STDMETHOD(CreateClipper)(THIS_ DWORD, LPDIRECTDRAWCLIPPER FAR*, IUnknown FAR * ) PURE; - STDMETHOD(CreatePalette)(THIS_ DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE FAR*, IUnknown FAR * ) PURE; - STDMETHOD(CreateSurface)(THIS_ LPDDSURFACEDESC, LPDIRECTDRAWSURFACE FAR *, IUnknown FAR *) PURE; - STDMETHOD(DuplicateSurface)( THIS_ LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE FAR * ) PURE; - STDMETHOD(EnumDisplayModes)( THIS_ DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK ) PURE; - STDMETHOD(EnumSurfaces)(THIS_ DWORD, LPDDSURFACEDESC, LPVOID,LPDDENUMSURFACESCALLBACK ) PURE; - STDMETHOD(FlipToGDISurface)(THIS) PURE; - STDMETHOD(GetCaps)( THIS_ LPDDCAPS, LPDDCAPS) PURE; - STDMETHOD(GetDisplayMode)( THIS_ LPDDSURFACEDESC) PURE; - STDMETHOD(GetFourCCCodes)(THIS_ LPDWORD, LPDWORD ) PURE; - STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE FAR *) PURE; - STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD) PURE; - STDMETHOD(GetScanLine)(THIS_ LPDWORD) PURE; - STDMETHOD(GetVerticalBlankStatus)(THIS_ LPBOOL ) PURE; - STDMETHOD(Initialize)(THIS_ GUID FAR *) PURE; - STDMETHOD(RestoreDisplayMode)(THIS) PURE; - STDMETHOD(SetCooperativeLevel)(THIS_ HWND, DWORD) PURE; - STDMETHOD(SetDisplayMode)(THIS_ DWORD, DWORD,DWORD, DWORD, DWORD) PURE; - STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD, HANDLE ) PURE; - /*** Added in the v2 interface ***/ - STDMETHOD(GetAvailableVidMem)(THIS_ LPDDSCAPS, LPDWORD, LPDWORD) PURE; -}; -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectDraw2_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) -#define IDirectDraw2_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectDraw2_Release(p) (p)->lpVtbl->Release(p) -#define IDirectDraw2_Compact(p) (p)->lpVtbl->Compact(p) -#define IDirectDraw2_CreateClipper(p, a, b, c) (p)->lpVtbl->CreateClipper(p, a, b, c) -#define IDirectDraw2_CreatePalette(p, a, b, c, d) (p)->lpVtbl->CreatePalette(p, a, b, c, d) -#define IDirectDraw2_CreateSurface(p, a, b, c) (p)->lpVtbl->CreateSurface(p, a, b, c) -#define IDirectDraw2_DuplicateSurface(p, a, b) (p)->lpVtbl->DuplicateSurface(p, a, b) -#define IDirectDraw2_EnumDisplayModes(p, a, b, c, d) (p)->lpVtbl->EnumDisplayModes(p, a, b, c, d) -#define IDirectDraw2_EnumSurfaces(p, a, b, c, d) (p)->lpVtbl->EnumSurfaces(p, a, b, c, d) -#define IDirectDraw2_FlipToGDISurface(p) (p)->lpVtbl->FlipToGDISurface(p) -#define IDirectDraw2_GetCaps(p, a, b) (p)->lpVtbl->GetCaps(p, a, b) -#define IDirectDraw2_GetDisplayMode(p, a) (p)->lpVtbl->GetDisplayMode(p, a) -#define IDirectDraw2_GetFourCCCodes(p, a, b) (p)->lpVtbl->GetFourCCCodes(p, a, b) -#define IDirectDraw2_GetGDISurface(p, a) (p)->lpVtbl->GetGDISurface(p, a) -#define IDirectDraw2_GetMonitorFrequency(p, a) (p)->lpVtbl->GetMonitorFrequency(p, a) -#define IDirectDraw2_GetScanLine(p, a) (p)->lpVtbl->GetScanLine(p, a) -#define IDirectDraw2_GetVerticalBlankStatus(p, a) (p)->lpVtbl->GetVerticalBlankStatus(p, a) -#define IDirectDraw2_Initialize(p, a) (p)->lpVtbl->Initialize(p, a) -#define IDirectDraw2_RestoreDisplayMode(p) (p)->lpVtbl->RestoreDisplayMode(p) -#define IDirectDraw2_SetCooperativeLevel(p, a, b) (p)->lpVtbl->SetCooperativeLevel(p, a, b) -#define IDirectDraw2_SetDisplayMode(p, a, b, c, d, e) (p)->lpVtbl->SetDisplayMode(p, a, b, c, d, e) -#define IDirectDraw2_WaitForVerticalBlank(p, a, b) (p)->lpVtbl->WaitForVerticalBlank(p, a, b) -#define IDirectDraw2_GetAvailableVidMem(p, a, b, c) (p)->lpVtbl->GetAvailableVidMem(p, a, b, c) -#else -#define IDirectDraw2_QueryInterface(p, a, b) (p)->QueryInterface(a, b) -#define IDirectDraw2_AddRef(p) (p)->AddRef() -#define IDirectDraw2_Release(p) (p)->Release() -#define IDirectDraw2_Compact(p) (p)->Compact() -#define IDirectDraw2_CreateClipper(p, a, b, c) (p)->CreateClipper(a, b, c) -#define IDirectDraw2_CreatePalette(p, a, b, c, d) (p)->CreatePalette(a, b, c, d) -#define IDirectDraw2_CreateSurface(p, a, b, c) (p)->CreateSurface(a, b, c) -#define IDirectDraw2_DuplicateSurface(p, a, b) (p)->DuplicateSurface(a, b) -#define IDirectDraw2_EnumDisplayModes(p, a, b, c, d) (p)->EnumDisplayModes(a, b, c, d) -#define IDirectDraw2_EnumSurfaces(p, a, b, c, d) (p)->EnumSurfaces(a, b, c, d) -#define IDirectDraw2_FlipToGDISurface(p) (p)->FlipToGDISurface() -#define IDirectDraw2_GetCaps(p, a, b) (p)->GetCaps(a, b) -#define IDirectDraw2_GetDisplayMode(p, a) (p)->GetDisplayMode(a) -#define IDirectDraw2_GetFourCCCodes(p, a, b) (p)->GetFourCCCodes(a, b) -#define IDirectDraw2_GetGDISurface(p, a) (p)->GetGDISurface(a) -#define IDirectDraw2_GetMonitorFrequency(p, a) (p)->GetMonitorFrequency(a) -#define IDirectDraw2_GetScanLine(p, a) (p)->GetScanLine(a) -#define IDirectDraw2_GetVerticalBlankStatus(p, a) (p)->GetVerticalBlankStatus(a) -#define IDirectDraw2_Initialize(p, a) (p)->Initialize(a) -#define IDirectDraw2_RestoreDisplayMode(p) (p)->RestoreDisplayMode() -#define IDirectDraw2_SetCooperativeLevel(p, a, b) (p)->SetCooperativeLevel(a, b) -#define IDirectDraw2_SetDisplayMode(p, a, b, c, d, e) (p)->SetDisplayMode(a, b, c, d, e) -#define IDirectDraw2_WaitForVerticalBlank(p, a, b) (p)->WaitForVerticalBlank(a, b) -#define IDirectDraw2_GetAvailableVidMem(p, a, b, c) (p)->GetAvailableVidMem(a, b, c) -#endif - -#endif - -#if defined( _WIN32 ) && !defined( _NO_COM ) -#undef INTERFACE -#define INTERFACE IDirectDraw4 -DECLARE_INTERFACE_( IDirectDraw4, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDraw methods ***/ - STDMETHOD(Compact)(THIS) PURE; - STDMETHOD(CreateClipper)(THIS_ DWORD, LPDIRECTDRAWCLIPPER FAR*, IUnknown FAR * ) PURE; - STDMETHOD(CreatePalette)(THIS_ DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE FAR*, IUnknown FAR * ) PURE; - STDMETHOD(CreateSurface)(THIS_ LPDDSURFACEDESC2, LPDIRECTDRAWSURFACE4 FAR *, IUnknown FAR *) PURE; - STDMETHOD(DuplicateSurface)( THIS_ LPDIRECTDRAWSURFACE4, LPDIRECTDRAWSURFACE4 FAR * ) PURE; - STDMETHOD(EnumDisplayModes)( THIS_ DWORD, LPDDSURFACEDESC2, LPVOID, LPDDENUMMODESCALLBACK2 ) PURE; - STDMETHOD(EnumSurfaces)(THIS_ DWORD, LPDDSURFACEDESC2, LPVOID,LPDDENUMSURFACESCALLBACK2 ) PURE; - STDMETHOD(FlipToGDISurface)(THIS) PURE; - STDMETHOD(GetCaps)( THIS_ LPDDCAPS, LPDDCAPS) PURE; - STDMETHOD(GetDisplayMode)( THIS_ LPDDSURFACEDESC2) PURE; - STDMETHOD(GetFourCCCodes)(THIS_ LPDWORD, LPDWORD ) PURE; - STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE4 FAR *) PURE; - STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD) PURE; - STDMETHOD(GetScanLine)(THIS_ LPDWORD) PURE; - STDMETHOD(GetVerticalBlankStatus)(THIS_ LPBOOL ) PURE; - STDMETHOD(Initialize)(THIS_ GUID FAR *) PURE; - STDMETHOD(RestoreDisplayMode)(THIS) PURE; - STDMETHOD(SetCooperativeLevel)(THIS_ HWND, DWORD) PURE; - STDMETHOD(SetDisplayMode)(THIS_ DWORD, DWORD,DWORD, DWORD, DWORD) PURE; - STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD, HANDLE ) PURE; - /*** Added in the v2 interface ***/ - STDMETHOD(GetAvailableVidMem)(THIS_ LPDDSCAPS2, LPDWORD, LPDWORD) PURE; - /*** Added in the V4 Interface ***/ - STDMETHOD(GetSurfaceFromDC) (THIS_ HDC, LPDIRECTDRAWSURFACE4 *) PURE; - STDMETHOD(RestoreAllSurfaces)(THIS) PURE; - STDMETHOD(TestCooperativeLevel)(THIS) PURE; - STDMETHOD(GetDeviceIdentifier)(THIS_ LPDDDEVICEIDENTIFIER, DWORD ) PURE; -}; -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectDraw4_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) -#define IDirectDraw4_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectDraw4_Release(p) (p)->lpVtbl->Release(p) -#define IDirectDraw4_Compact(p) (p)->lpVtbl->Compact(p) -#define IDirectDraw4_CreateClipper(p, a, b, c) (p)->lpVtbl->CreateClipper(p, a, b, c) -#define IDirectDraw4_CreatePalette(p, a, b, c, d) (p)->lpVtbl->CreatePalette(p, a, b, c, d) -#define IDirectDraw4_CreateSurface(p, a, b, c) (p)->lpVtbl->CreateSurface(p, a, b, c) -#define IDirectDraw4_DuplicateSurface(p, a, b) (p)->lpVtbl->DuplicateSurface(p, a, b) -#define IDirectDraw4_EnumDisplayModes(p, a, b, c, d) (p)->lpVtbl->EnumDisplayModes(p, a, b, c, d) -#define IDirectDraw4_EnumSurfaces(p, a, b, c, d) (p)->lpVtbl->EnumSurfaces(p, a, b, c, d) -#define IDirectDraw4_FlipToGDISurface(p) (p)->lpVtbl->FlipToGDISurface(p) -#define IDirectDraw4_GetCaps(p, a, b) (p)->lpVtbl->GetCaps(p, a, b) -#define IDirectDraw4_GetDisplayMode(p, a) (p)->lpVtbl->GetDisplayMode(p, a) -#define IDirectDraw4_GetFourCCCodes(p, a, b) (p)->lpVtbl->GetFourCCCodes(p, a, b) -#define IDirectDraw4_GetGDISurface(p, a) (p)->lpVtbl->GetGDISurface(p, a) -#define IDirectDraw4_GetMonitorFrequency(p, a) (p)->lpVtbl->GetMonitorFrequency(p, a) -#define IDirectDraw4_GetScanLine(p, a) (p)->lpVtbl->GetScanLine(p, a) -#define IDirectDraw4_GetVerticalBlankStatus(p, a) (p)->lpVtbl->GetVerticalBlankStatus(p, a) -#define IDirectDraw4_Initialize(p, a) (p)->lpVtbl->Initialize(p, a) -#define IDirectDraw4_RestoreDisplayMode(p) (p)->lpVtbl->RestoreDisplayMode(p) -#define IDirectDraw4_SetCooperativeLevel(p, a, b) (p)->lpVtbl->SetCooperativeLevel(p, a, b) -#define IDirectDraw4_SetDisplayMode(p, a, b, c, d, e) (p)->lpVtbl->SetDisplayMode(p, a, b, c, d, e) -#define IDirectDraw4_WaitForVerticalBlank(p, a, b) (p)->lpVtbl->WaitForVerticalBlank(p, a, b) -#define IDirectDraw4_GetAvailableVidMem(p, a, b, c) (p)->lpVtbl->GetAvailableVidMem(p, a, b, c) -#define IDirectDraw4_GetSurfaceFromDC(p, a, b) (p)->lpVtbl->GetSurfaceFromDC(p, a, b) -#define IDirectDraw4_RestoreAllSurfaces(p) (p)->lpVtbl->RestoreAllSurfaces(p) -#define IDirectDraw4_TestCooperativeLevel(p) (p)->lpVtbl->TestCooperativeLevel(p) -#define IDirectDraw4_GetDeviceIdentifier(p,a,b) (p)->lpVtbl->GetDeviceIdentifier(p,a,b) -#else -#define IDirectDraw4_QueryInterface(p, a, b) (p)->QueryInterface(a, b) -#define IDirectDraw4_AddRef(p) (p)->AddRef() -#define IDirectDraw4_Release(p) (p)->Release() -#define IDirectDraw4_Compact(p) (p)->Compact() -#define IDirectDraw4_CreateClipper(p, a, b, c) (p)->CreateClipper(a, b, c) -#define IDirectDraw4_CreatePalette(p, a, b, c, d) (p)->CreatePalette(a, b, c, d) -#define IDirectDraw4_CreateSurface(p, a, b, c) (p)->CreateSurface(a, b, c) -#define IDirectDraw4_DuplicateSurface(p, a, b) (p)->DuplicateSurface(a, b) -#define IDirectDraw4_EnumDisplayModes(p, a, b, c, d) (p)->EnumDisplayModes(a, b, c, d) -#define IDirectDraw4_EnumSurfaces(p, a, b, c, d) (p)->EnumSurfaces(a, b, c, d) -#define IDirectDraw4_FlipToGDISurface(p) (p)->FlipToGDISurface() -#define IDirectDraw4_GetCaps(p, a, b) (p)->GetCaps(a, b) -#define IDirectDraw4_GetDisplayMode(p, a) (p)->GetDisplayMode(a) -#define IDirectDraw4_GetFourCCCodes(p, a, b) (p)->GetFourCCCodes(a, b) -#define IDirectDraw4_GetGDISurface(p, a) (p)->GetGDISurface(a) -#define IDirectDraw4_GetMonitorFrequency(p, a) (p)->GetMonitorFrequency(a) -#define IDirectDraw4_GetScanLine(p, a) (p)->GetScanLine(a) -#define IDirectDraw4_GetVerticalBlankStatus(p, a) (p)->GetVerticalBlankStatus(a) -#define IDirectDraw4_Initialize(p, a) (p)->Initialize(a) -#define IDirectDraw4_RestoreDisplayMode(p) (p)->RestoreDisplayMode() -#define IDirectDraw4_SetCooperativeLevel(p, a, b) (p)->SetCooperativeLevel(a, b) -#define IDirectDraw4_SetDisplayMode(p, a, b, c, d, e) (p)->SetDisplayMode(a, b, c, d, e) -#define IDirectDraw4_WaitForVerticalBlank(p, a, b) (p)->WaitForVerticalBlank(a, b) -#define IDirectDraw4_GetAvailableVidMem(p, a, b, c) (p)->GetAvailableVidMem(a, b, c) -#define IDirectDraw4_GetSurfaceFromDC(p, a, b) (p)->GetSurfaceFromDC(a, b) -#define IDirectDraw4_RestoreAllSurfaces(p) (p)->RestoreAllSurfaces() -#define IDirectDraw4_TestCooperativeLevel(p) (p)->TestCooperativeLevel() -#define IDirectDraw4_GetDeviceIdentifier(p,a,b) (p)->GetDeviceIdentifier(a,b) -#endif - -#endif - -#if defined( _WIN32 ) && !defined( _NO_COM ) -#undef INTERFACE -#define INTERFACE IDirectDraw7 -DECLARE_INTERFACE_( IDirectDraw7, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDraw methods ***/ - STDMETHOD(Compact)(THIS) PURE; - STDMETHOD(CreateClipper)(THIS_ DWORD, LPDIRECTDRAWCLIPPER FAR*, IUnknown FAR * ) PURE; - STDMETHOD(CreatePalette)(THIS_ DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE FAR*, IUnknown FAR * ) PURE; - STDMETHOD(CreateSurface)(THIS_ LPDDSURFACEDESC2, LPDIRECTDRAWSURFACE7 FAR *, IUnknown FAR *) PURE; - STDMETHOD(DuplicateSurface)( THIS_ LPDIRECTDRAWSURFACE7, LPDIRECTDRAWSURFACE7 FAR * ) PURE; - STDMETHOD(EnumDisplayModes)( THIS_ DWORD, LPDDSURFACEDESC2, LPVOID, LPDDENUMMODESCALLBACK2 ) PURE; - STDMETHOD(EnumSurfaces)(THIS_ DWORD, LPDDSURFACEDESC2, LPVOID,LPDDENUMSURFACESCALLBACK7 ) PURE; - STDMETHOD(FlipToGDISurface)(THIS) PURE; - STDMETHOD(GetCaps)( THIS_ LPDDCAPS, LPDDCAPS) PURE; - STDMETHOD(GetDisplayMode)( THIS_ LPDDSURFACEDESC2) PURE; - STDMETHOD(GetFourCCCodes)(THIS_ LPDWORD, LPDWORD ) PURE; - STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE7 FAR *) PURE; - STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD) PURE; - STDMETHOD(GetScanLine)(THIS_ LPDWORD) PURE; - STDMETHOD(GetVerticalBlankStatus)(THIS_ LPBOOL ) PURE; - STDMETHOD(Initialize)(THIS_ GUID FAR *) PURE; - STDMETHOD(RestoreDisplayMode)(THIS) PURE; - STDMETHOD(SetCooperativeLevel)(THIS_ HWND, DWORD) PURE; - STDMETHOD(SetDisplayMode)(THIS_ DWORD, DWORD,DWORD, DWORD, DWORD) PURE; - STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD, HANDLE ) PURE; - /*** Added in the v2 interface ***/ - STDMETHOD(GetAvailableVidMem)(THIS_ LPDDSCAPS2, LPDWORD, LPDWORD) PURE; - /*** Added in the V4 Interface ***/ - STDMETHOD(GetSurfaceFromDC) (THIS_ HDC, LPDIRECTDRAWSURFACE7 *) PURE; - STDMETHOD(RestoreAllSurfaces)(THIS) PURE; - STDMETHOD(TestCooperativeLevel)(THIS) PURE; - STDMETHOD(GetDeviceIdentifier)(THIS_ LPDDDEVICEIDENTIFIER2, DWORD ) PURE; - STDMETHOD(StartModeTest)(THIS_ LPSIZE, DWORD, DWORD ) PURE; - STDMETHOD(EvaluateMode)(THIS_ DWORD, DWORD * ) PURE; -}; -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectDraw7_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) -#define IDirectDraw7_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectDraw7_Release(p) (p)->lpVtbl->Release(p) -#define IDirectDraw7_Compact(p) (p)->lpVtbl->Compact(p) -#define IDirectDraw7_CreateClipper(p, a, b, c) (p)->lpVtbl->CreateClipper(p, a, b, c) -#define IDirectDraw7_CreatePalette(p, a, b, c, d) (p)->lpVtbl->CreatePalette(p, a, b, c, d) -#define IDirectDraw7_CreateSurface(p, a, b, c) (p)->lpVtbl->CreateSurface(p, a, b, c) -#define IDirectDraw7_DuplicateSurface(p, a, b) (p)->lpVtbl->DuplicateSurface(p, a, b) -#define IDirectDraw7_EnumDisplayModes(p, a, b, c, d) (p)->lpVtbl->EnumDisplayModes(p, a, b, c, d) -#define IDirectDraw7_EnumSurfaces(p, a, b, c, d) (p)->lpVtbl->EnumSurfaces(p, a, b, c, d) -#define IDirectDraw7_FlipToGDISurface(p) (p)->lpVtbl->FlipToGDISurface(p) -#define IDirectDraw7_GetCaps(p, a, b) (p)->lpVtbl->GetCaps(p, a, b) -#define IDirectDraw7_GetDisplayMode(p, a) (p)->lpVtbl->GetDisplayMode(p, a) -#define IDirectDraw7_GetFourCCCodes(p, a, b) (p)->lpVtbl->GetFourCCCodes(p, a, b) -#define IDirectDraw7_GetGDISurface(p, a) (p)->lpVtbl->GetGDISurface(p, a) -#define IDirectDraw7_GetMonitorFrequency(p, a) (p)->lpVtbl->GetMonitorFrequency(p, a) -#define IDirectDraw7_GetScanLine(p, a) (p)->lpVtbl->GetScanLine(p, a) -#define IDirectDraw7_GetVerticalBlankStatus(p, a) (p)->lpVtbl->GetVerticalBlankStatus(p, a) -#define IDirectDraw7_Initialize(p, a) (p)->lpVtbl->Initialize(p, a) -#define IDirectDraw7_RestoreDisplayMode(p) (p)->lpVtbl->RestoreDisplayMode(p) -#define IDirectDraw7_SetCooperativeLevel(p, a, b) (p)->lpVtbl->SetCooperativeLevel(p, a, b) -#define IDirectDraw7_SetDisplayMode(p, a, b, c, d, e) (p)->lpVtbl->SetDisplayMode(p, a, b, c, d, e) -#define IDirectDraw7_WaitForVerticalBlank(p, a, b) (p)->lpVtbl->WaitForVerticalBlank(p, a, b) -#define IDirectDraw7_GetAvailableVidMem(p, a, b, c) (p)->lpVtbl->GetAvailableVidMem(p, a, b, c) -#define IDirectDraw7_GetSurfaceFromDC(p, a, b) (p)->lpVtbl->GetSurfaceFromDC(p, a, b) -#define IDirectDraw7_RestoreAllSurfaces(p) (p)->lpVtbl->RestoreAllSurfaces(p) -#define IDirectDraw7_TestCooperativeLevel(p) (p)->lpVtbl->TestCooperativeLevel(p) -#define IDirectDraw7_GetDeviceIdentifier(p,a,b) (p)->lpVtbl->GetDeviceIdentifier(p,a,b) -#define IDirectDraw7_StartModeTest(p,a,b,c) (p)->lpVtbl->StartModeTest(p,a,b,c) -#define IDirectDraw7_EvaluateMode(p,a,b) (p)->lpVtbl->EvaluateMode(p,a,b) -#else -#define IDirectDraw7_QueryInterface(p, a, b) (p)->QueryInterface(a, b) -#define IDirectDraw7_AddRef(p) (p)->AddRef() -#define IDirectDraw7_Release(p) (p)->Release() -#define IDirectDraw7_Compact(p) (p)->Compact() -#define IDirectDraw7_CreateClipper(p, a, b, c) (p)->CreateClipper(a, b, c) -#define IDirectDraw7_CreatePalette(p, a, b, c, d) (p)->CreatePalette(a, b, c, d) -#define IDirectDraw7_CreateSurface(p, a, b, c) (p)->CreateSurface(a, b, c) -#define IDirectDraw7_DuplicateSurface(p, a, b) (p)->DuplicateSurface(a, b) -#define IDirectDraw7_EnumDisplayModes(p, a, b, c, d) (p)->EnumDisplayModes(a, b, c, d) -#define IDirectDraw7_EnumSurfaces(p, a, b, c, d) (p)->EnumSurfaces(a, b, c, d) -#define IDirectDraw7_FlipToGDISurface(p) (p)->FlipToGDISurface() -#define IDirectDraw7_GetCaps(p, a, b) (p)->GetCaps(a, b) -#define IDirectDraw7_GetDisplayMode(p, a) (p)->GetDisplayMode(a) -#define IDirectDraw7_GetFourCCCodes(p, a, b) (p)->GetFourCCCodes(a, b) -#define IDirectDraw7_GetGDISurface(p, a) (p)->GetGDISurface(a) -#define IDirectDraw7_GetMonitorFrequency(p, a) (p)->GetMonitorFrequency(a) -#define IDirectDraw7_GetScanLine(p, a) (p)->GetScanLine(a) -#define IDirectDraw7_GetVerticalBlankStatus(p, a) (p)->GetVerticalBlankStatus(a) -#define IDirectDraw7_Initialize(p, a) (p)->Initialize(a) -#define IDirectDraw7_RestoreDisplayMode(p) (p)->RestoreDisplayMode() -#define IDirectDraw7_SetCooperativeLevel(p, a, b) (p)->SetCooperativeLevel(a, b) -#define IDirectDraw7_SetDisplayMode(p, a, b, c, d, e) (p)->SetDisplayMode(a, b, c, d, e) -#define IDirectDraw7_WaitForVerticalBlank(p, a, b) (p)->WaitForVerticalBlank(a, b) -#define IDirectDraw7_GetAvailableVidMem(p, a, b, c) (p)->GetAvailableVidMem(a, b, c) -#define IDirectDraw7_GetSurfaceFromDC(p, a, b) (p)->GetSurfaceFromDC(a, b) -#define IDirectDraw7_RestoreAllSurfaces(p) (p)->RestoreAllSurfaces() -#define IDirectDraw7_TestCooperativeLevel(p) (p)->TestCooperativeLevel() -#define IDirectDraw7_GetDeviceIdentifier(p,a,b) (p)->GetDeviceIdentifier(a,b) -#define IDirectDraw7_StartModeTest(p,a,b,c) (p)->lpVtbl->StartModeTest(a,b,c) -#define IDirectDraw7_EvaluateMode(p,a,b) (p)->lpVtbl->EvaluateMode(a,b) -#endif - -#endif - - -/* - * IDirectDrawPalette - */ -#if defined( _WIN32 ) && !defined( _NO_COM ) -#undef INTERFACE -#define INTERFACE IDirectDrawPalette -DECLARE_INTERFACE_( IDirectDrawPalette, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDrawPalette methods ***/ - STDMETHOD(GetCaps)(THIS_ LPDWORD) PURE; - STDMETHOD(GetEntries)(THIS_ DWORD,DWORD,DWORD,LPPALETTEENTRY) PURE; - STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, DWORD, LPPALETTEENTRY) PURE; - STDMETHOD(SetEntries)(THIS_ DWORD,DWORD,DWORD,LPPALETTEENTRY) PURE; -}; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectDrawPalette_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) -#define IDirectDrawPalette_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectDrawPalette_Release(p) (p)->lpVtbl->Release(p) -#define IDirectDrawPalette_GetCaps(p, a) (p)->lpVtbl->GetCaps(p, a) -#define IDirectDrawPalette_GetEntries(p, a, b, c, d) (p)->lpVtbl->GetEntries(p, a, b, c, d) -#define IDirectDrawPalette_Initialize(p, a, b, c) (p)->lpVtbl->Initialize(p, a, b, c) -#define IDirectDrawPalette_SetEntries(p, a, b, c, d) (p)->lpVtbl->SetEntries(p, a, b, c, d) -#else -#define IDirectDrawPalette_QueryInterface(p, a, b) (p)->QueryInterface(a, b) -#define IDirectDrawPalette_AddRef(p) (p)->AddRef() -#define IDirectDrawPalette_Release(p) (p)->Release() -#define IDirectDrawPalette_GetCaps(p, a) (p)->GetCaps(a) -#define IDirectDrawPalette_GetEntries(p, a, b, c, d) (p)->GetEntries(a, b, c, d) -#define IDirectDrawPalette_Initialize(p, a, b, c) (p)->Initialize(a, b, c) -#define IDirectDrawPalette_SetEntries(p, a, b, c, d) (p)->SetEntries(a, b, c, d) -#endif - -#endif - - -/* - * IDirectDrawClipper - */ -#if defined( _WIN32 ) && !defined( _NO_COM ) -#undef INTERFACE -#define INTERFACE IDirectDrawClipper -DECLARE_INTERFACE_( IDirectDrawClipper, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDrawClipper methods ***/ - STDMETHOD(GetClipList)(THIS_ LPRECT, LPRGNDATA, LPDWORD) PURE; - STDMETHOD(GetHWnd)(THIS_ HWND FAR *) PURE; - STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, DWORD) PURE; - STDMETHOD(IsClipListChanged)(THIS_ BOOL FAR *) PURE; - STDMETHOD(SetClipList)(THIS_ LPRGNDATA,DWORD) PURE; - STDMETHOD(SetHWnd)(THIS_ DWORD, HWND ) PURE; -}; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectDrawClipper_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) -#define IDirectDrawClipper_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectDrawClipper_Release(p) (p)->lpVtbl->Release(p) -#define IDirectDrawClipper_GetClipList(p, a, b, c) (p)->lpVtbl->GetClipList(p, a, b, c) -#define IDirectDrawClipper_GetHWnd(p, a) (p)->lpVtbl->GetHWnd(p, a) -#define IDirectDrawClipper_Initialize(p, a, b) (p)->lpVtbl->Initialize(p, a, b) -#define IDirectDrawClipper_IsClipListChanged(p, a) (p)->lpVtbl->IsClipListChanged(p, a) -#define IDirectDrawClipper_SetClipList(p, a, b) (p)->lpVtbl->SetClipList(p, a, b) -#define IDirectDrawClipper_SetHWnd(p, a, b) (p)->lpVtbl->SetHWnd(p, a, b) -#else -#define IDirectDrawClipper_QueryInterface(p, a, b) (p)->QueryInterface(a, b) -#define IDirectDrawClipper_AddRef(p) (p)->AddRef() -#define IDirectDrawClipper_Release(p) (p)->Release() -#define IDirectDrawClipper_GetClipList(p, a, b, c) (p)->GetClipList(a, b, c) -#define IDirectDrawClipper_GetHWnd(p, a) (p)->GetHWnd(a) -#define IDirectDrawClipper_Initialize(p, a, b) (p)->Initialize(a, b) -#define IDirectDrawClipper_IsClipListChanged(p, a) (p)->IsClipListChanged(a) -#define IDirectDrawClipper_SetClipList(p, a, b) (p)->SetClipList(a, b) -#define IDirectDrawClipper_SetHWnd(p, a, b) (p)->SetHWnd(a, b) -#endif - -#endif - -/* - * IDirectDrawSurface and related interfaces - */ -#if defined( _WIN32 ) && !defined( _NO_COM ) -#undef INTERFACE -#define INTERFACE IDirectDrawSurface -DECLARE_INTERFACE_( IDirectDrawSurface, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDrawSurface methods ***/ - STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE) PURE; - STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT) PURE; - STDMETHOD(Blt)(THIS_ LPRECT,LPDIRECTDRAWSURFACE, LPRECT,DWORD, LPDDBLTFX) PURE; - STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH, DWORD, DWORD ) PURE; - STDMETHOD(BltFast)(THIS_ DWORD,DWORD,LPDIRECTDRAWSURFACE, LPRECT,DWORD) PURE; - STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD,LPDIRECTDRAWSURFACE) PURE; - STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID,LPDDENUMSURFACESCALLBACK) PURE; - STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD,LPVOID,LPDDENUMSURFACESCALLBACK) PURE; - STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE, DWORD) PURE; - STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS, LPDIRECTDRAWSURFACE FAR *) PURE; - STDMETHOD(GetBltStatus)(THIS_ DWORD) PURE; - STDMETHOD(GetCaps)(THIS_ LPDDSCAPS) PURE; - STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER FAR*) PURE; - STDMETHOD(GetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; - STDMETHOD(GetDC)(THIS_ HDC FAR *) PURE; - STDMETHOD(GetFlipStatus)(THIS_ DWORD) PURE; - STDMETHOD(GetOverlayPosition)(THIS_ LPLONG, LPLONG ) PURE; - STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE FAR*) PURE; - STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT) PURE; - STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC) PURE; - STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC) PURE; - STDMETHOD(IsLost)(THIS) PURE; - STDMETHOD(Lock)(THIS_ LPRECT,LPDDSURFACEDESC,DWORD,HANDLE) PURE; - STDMETHOD(ReleaseDC)(THIS_ HDC) PURE; - STDMETHOD(Restore)(THIS) PURE; - STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER) PURE; - STDMETHOD(SetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; - STDMETHOD(SetOverlayPosition)(THIS_ LONG, LONG ) PURE; - STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE) PURE; - STDMETHOD(Unlock)(THIS_ LPVOID) PURE; - STDMETHOD(UpdateOverlay)(THIS_ LPRECT, LPDIRECTDRAWSURFACE,LPRECT,DWORD, LPDDOVERLAYFX) PURE; - STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD) PURE; - STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD, LPDIRECTDRAWSURFACE) PURE; -}; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectDrawSurface_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectDrawSurface_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectDrawSurface_Release(p) (p)->lpVtbl->Release(p) -#define IDirectDrawSurface_AddAttachedSurface(p,a) (p)->lpVtbl->AddAttachedSurface(p,a) -#define IDirectDrawSurface_AddOverlayDirtyRect(p,a) (p)->lpVtbl->AddOverlayDirtyRect(p,a) -#define IDirectDrawSurface_Blt(p,a,b,c,d,e) (p)->lpVtbl->Blt(p,a,b,c,d,e) -#define IDirectDrawSurface_BltBatch(p,a,b,c) (p)->lpVtbl->BltBatch(p,a,b,c) -#define IDirectDrawSurface_BltFast(p,a,b,c,d,e) (p)->lpVtbl->BltFast(p,a,b,c,d,e) -#define IDirectDrawSurface_DeleteAttachedSurface(p,a,b) (p)->lpVtbl->DeleteAttachedSurface(p,a,b) -#define IDirectDrawSurface_EnumAttachedSurfaces(p,a,b) (p)->lpVtbl->EnumAttachedSurfaces(p,a,b) -#define IDirectDrawSurface_EnumOverlayZOrders(p,a,b,c) (p)->lpVtbl->EnumOverlayZOrders(p,a,b,c) -#define IDirectDrawSurface_Flip(p,a,b) (p)->lpVtbl->Flip(p,a,b) -#define IDirectDrawSurface_GetAttachedSurface(p,a,b) (p)->lpVtbl->GetAttachedSurface(p,a,b) -#define IDirectDrawSurface_GetBltStatus(p,a) (p)->lpVtbl->GetBltStatus(p,a) -#define IDirectDrawSurface_GetCaps(p,b) (p)->lpVtbl->GetCaps(p,b) -#define IDirectDrawSurface_GetClipper(p,a) (p)->lpVtbl->GetClipper(p,a) -#define IDirectDrawSurface_GetColorKey(p,a,b) (p)->lpVtbl->GetColorKey(p,a,b) -#define IDirectDrawSurface_GetDC(p,a) (p)->lpVtbl->GetDC(p,a) -#define IDirectDrawSurface_GetFlipStatus(p,a) (p)->lpVtbl->GetFlipStatus(p,a) -#define IDirectDrawSurface_GetOverlayPosition(p,a,b) (p)->lpVtbl->GetOverlayPosition(p,a,b) -#define IDirectDrawSurface_GetPalette(p,a) (p)->lpVtbl->GetPalette(p,a) -#define IDirectDrawSurface_GetPixelFormat(p,a) (p)->lpVtbl->GetPixelFormat(p,a) -#define IDirectDrawSurface_GetSurfaceDesc(p,a) (p)->lpVtbl->GetSurfaceDesc(p,a) -#define IDirectDrawSurface_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) -#define IDirectDrawSurface_IsLost(p) (p)->lpVtbl->IsLost(p) -#define IDirectDrawSurface_Lock(p,a,b,c,d) (p)->lpVtbl->Lock(p,a,b,c,d) -#define IDirectDrawSurface_ReleaseDC(p,a) (p)->lpVtbl->ReleaseDC(p,a) -#define IDirectDrawSurface_Restore(p) (p)->lpVtbl->Restore(p) -#define IDirectDrawSurface_SetClipper(p,a) (p)->lpVtbl->SetClipper(p,a) -#define IDirectDrawSurface_SetColorKey(p,a,b) (p)->lpVtbl->SetColorKey(p,a,b) -#define IDirectDrawSurface_SetOverlayPosition(p,a,b) (p)->lpVtbl->SetOverlayPosition(p,a,b) -#define IDirectDrawSurface_SetPalette(p,a) (p)->lpVtbl->SetPalette(p,a) -#define IDirectDrawSurface_Unlock(p,b) (p)->lpVtbl->Unlock(p,b) -#define IDirectDrawSurface_UpdateOverlay(p,a,b,c,d,e) (p)->lpVtbl->UpdateOverlay(p,a,b,c,d,e) -#define IDirectDrawSurface_UpdateOverlayDisplay(p,a) (p)->lpVtbl->UpdateOverlayDisplay(p,a) -#define IDirectDrawSurface_UpdateOverlayZOrder(p,a,b) (p)->lpVtbl->UpdateOverlayZOrder(p,a,b) -#else -#define IDirectDrawSurface_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectDrawSurface_AddRef(p) (p)->AddRef() -#define IDirectDrawSurface_Release(p) (p)->Release() -#define IDirectDrawSurface_AddAttachedSurface(p,a) (p)->AddAttachedSurface(a) -#define IDirectDrawSurface_AddOverlayDirtyRect(p,a) (p)->AddOverlayDirtyRect(a) -#define IDirectDrawSurface_Blt(p,a,b,c,d,e) (p)->Blt(a,b,c,d,e) -#define IDirectDrawSurface_BltBatch(p,a,b,c) (p)->BltBatch(a,b,c) -#define IDirectDrawSurface_BltFast(p,a,b,c,d,e) (p)->BltFast(a,b,c,d,e) -#define IDirectDrawSurface_DeleteAttachedSurface(p,a,b) (p)->DeleteAttachedSurface(a,b) -#define IDirectDrawSurface_EnumAttachedSurfaces(p,a,b) (p)->EnumAttachedSurfaces(a,b) -#define IDirectDrawSurface_EnumOverlayZOrders(p,a,b,c) (p)->EnumOverlayZOrders(a,b,c) -#define IDirectDrawSurface_Flip(p,a,b) (p)->Flip(a,b) -#define IDirectDrawSurface_GetAttachedSurface(p,a,b) (p)->GetAttachedSurface(a,b) -#define IDirectDrawSurface_GetBltStatus(p,a) (p)->GetBltStatus(a) -#define IDirectDrawSurface_GetCaps(p,b) (p)->GetCaps(b) -#define IDirectDrawSurface_GetClipper(p,a) (p)->GetClipper(a) -#define IDirectDrawSurface_GetColorKey(p,a,b) (p)->GetColorKey(a,b) -#define IDirectDrawSurface_GetDC(p,a) (p)->GetDC(a) -#define IDirectDrawSurface_GetFlipStatus(p,a) (p)->GetFlipStatus(a) -#define IDirectDrawSurface_GetOverlayPosition(p,a,b) (p)->GetOverlayPosition(a,b) -#define IDirectDrawSurface_GetPalette(p,a) (p)->GetPalette(a) -#define IDirectDrawSurface_GetPixelFormat(p,a) (p)->GetPixelFormat(a) -#define IDirectDrawSurface_GetSurfaceDesc(p,a) (p)->GetSurfaceDesc(a) -#define IDirectDrawSurface_Initialize(p,a,b) (p)->Initialize(a,b) -#define IDirectDrawSurface_IsLost(p) (p)->IsLost() -#define IDirectDrawSurface_Lock(p,a,b,c,d) (p)->Lock(a,b,c,d) -#define IDirectDrawSurface_ReleaseDC(p,a) (p)->ReleaseDC(a) -#define IDirectDrawSurface_Restore(p) (p)->Restore() -#define IDirectDrawSurface_SetClipper(p,a) (p)->SetClipper(a) -#define IDirectDrawSurface_SetColorKey(p,a,b) (p)->SetColorKey(a,b) -#define IDirectDrawSurface_SetOverlayPosition(p,a,b) (p)->SetOverlayPosition(a,b) -#define IDirectDrawSurface_SetPalette(p,a) (p)->SetPalette(a) -#define IDirectDrawSurface_Unlock(p,b) (p)->Unlock(b) -#define IDirectDrawSurface_UpdateOverlay(p,a,b,c,d,e) (p)->UpdateOverlay(a,b,c,d,e) -#define IDirectDrawSurface_UpdateOverlayDisplay(p,a) (p)->UpdateOverlayDisplay(a) -#define IDirectDrawSurface_UpdateOverlayZOrder(p,a,b) (p)->UpdateOverlayZOrder(a,b) -#endif - -/* - * IDirectDrawSurface2 and related interfaces - */ -#undef INTERFACE -#define INTERFACE IDirectDrawSurface2 -DECLARE_INTERFACE_( IDirectDrawSurface2, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDrawSurface methods ***/ - STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE2) PURE; - STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT) PURE; - STDMETHOD(Blt)(THIS_ LPRECT,LPDIRECTDRAWSURFACE2, LPRECT,DWORD, LPDDBLTFX) PURE; - STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH, DWORD, DWORD ) PURE; - STDMETHOD(BltFast)(THIS_ DWORD,DWORD,LPDIRECTDRAWSURFACE2, LPRECT,DWORD) PURE; - STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD,LPDIRECTDRAWSURFACE2) PURE; - STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID,LPDDENUMSURFACESCALLBACK) PURE; - STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD,LPVOID,LPDDENUMSURFACESCALLBACK) PURE; - STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE2, DWORD) PURE; - STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS, LPDIRECTDRAWSURFACE2 FAR *) PURE; - STDMETHOD(GetBltStatus)(THIS_ DWORD) PURE; - STDMETHOD(GetCaps)(THIS_ LPDDSCAPS) PURE; - STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER FAR*) PURE; - STDMETHOD(GetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; - STDMETHOD(GetDC)(THIS_ HDC FAR *) PURE; - STDMETHOD(GetFlipStatus)(THIS_ DWORD) PURE; - STDMETHOD(GetOverlayPosition)(THIS_ LPLONG, LPLONG ) PURE; - STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE FAR*) PURE; - STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT) PURE; - STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC) PURE; - STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC) PURE; - STDMETHOD(IsLost)(THIS) PURE; - STDMETHOD(Lock)(THIS_ LPRECT,LPDDSURFACEDESC,DWORD,HANDLE) PURE; - STDMETHOD(ReleaseDC)(THIS_ HDC) PURE; - STDMETHOD(Restore)(THIS) PURE; - STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER) PURE; - STDMETHOD(SetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; - STDMETHOD(SetOverlayPosition)(THIS_ LONG, LONG ) PURE; - STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE) PURE; - STDMETHOD(Unlock)(THIS_ LPVOID) PURE; - STDMETHOD(UpdateOverlay)(THIS_ LPRECT, LPDIRECTDRAWSURFACE2,LPRECT,DWORD, LPDDOVERLAYFX) PURE; - STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD) PURE; - STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD, LPDIRECTDRAWSURFACE2) PURE; - /*** Added in the v2 interface ***/ - STDMETHOD(GetDDInterface)(THIS_ LPVOID FAR *) PURE; - STDMETHOD(PageLock)(THIS_ DWORD) PURE; - STDMETHOD(PageUnlock)(THIS_ DWORD) PURE; -}; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectDrawSurface2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectDrawSurface2_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectDrawSurface2_Release(p) (p)->lpVtbl->Release(p) -#define IDirectDrawSurface2_AddAttachedSurface(p,a) (p)->lpVtbl->AddAttachedSurface(p,a) -#define IDirectDrawSurface2_AddOverlayDirtyRect(p,a) (p)->lpVtbl->AddOverlayDirtyRect(p,a) -#define IDirectDrawSurface2_Blt(p,a,b,c,d,e) (p)->lpVtbl->Blt(p,a,b,c,d,e) -#define IDirectDrawSurface2_BltBatch(p,a,b,c) (p)->lpVtbl->BltBatch(p,a,b,c) -#define IDirectDrawSurface2_BltFast(p,a,b,c,d,e) (p)->lpVtbl->BltFast(p,a,b,c,d,e) -#define IDirectDrawSurface2_DeleteAttachedSurface(p,a,b) (p)->lpVtbl->DeleteAttachedSurface(p,a,b) -#define IDirectDrawSurface2_EnumAttachedSurfaces(p,a,b) (p)->lpVtbl->EnumAttachedSurfaces(p,a,b) -#define IDirectDrawSurface2_EnumOverlayZOrders(p,a,b,c) (p)->lpVtbl->EnumOverlayZOrders(p,a,b,c) -#define IDirectDrawSurface2_Flip(p,a,b) (p)->lpVtbl->Flip(p,a,b) -#define IDirectDrawSurface2_GetAttachedSurface(p,a,b) (p)->lpVtbl->GetAttachedSurface(p,a,b) -#define IDirectDrawSurface2_GetBltStatus(p,a) (p)->lpVtbl->GetBltStatus(p,a) -#define IDirectDrawSurface2_GetCaps(p,b) (p)->lpVtbl->GetCaps(p,b) -#define IDirectDrawSurface2_GetClipper(p,a) (p)->lpVtbl->GetClipper(p,a) -#define IDirectDrawSurface2_GetColorKey(p,a,b) (p)->lpVtbl->GetColorKey(p,a,b) -#define IDirectDrawSurface2_GetDC(p,a) (p)->lpVtbl->GetDC(p,a) -#define IDirectDrawSurface2_GetFlipStatus(p,a) (p)->lpVtbl->GetFlipStatus(p,a) -#define IDirectDrawSurface2_GetOverlayPosition(p,a,b) (p)->lpVtbl->GetOverlayPosition(p,a,b) -#define IDirectDrawSurface2_GetPalette(p,a) (p)->lpVtbl->GetPalette(p,a) -#define IDirectDrawSurface2_GetPixelFormat(p,a) (p)->lpVtbl->GetPixelFormat(p,a) -#define IDirectDrawSurface2_GetSurfaceDesc(p,a) (p)->lpVtbl->GetSurfaceDesc(p,a) -#define IDirectDrawSurface2_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) -#define IDirectDrawSurface2_IsLost(p) (p)->lpVtbl->IsLost(p) -#define IDirectDrawSurface2_Lock(p,a,b,c,d) (p)->lpVtbl->Lock(p,a,b,c,d) -#define IDirectDrawSurface2_ReleaseDC(p,a) (p)->lpVtbl->ReleaseDC(p,a) -#define IDirectDrawSurface2_Restore(p) (p)->lpVtbl->Restore(p) -#define IDirectDrawSurface2_SetClipper(p,a) (p)->lpVtbl->SetClipper(p,a) -#define IDirectDrawSurface2_SetColorKey(p,a,b) (p)->lpVtbl->SetColorKey(p,a,b) -#define IDirectDrawSurface2_SetOverlayPosition(p,a,b) (p)->lpVtbl->SetOverlayPosition(p,a,b) -#define IDirectDrawSurface2_SetPalette(p,a) (p)->lpVtbl->SetPalette(p,a) -#define IDirectDrawSurface2_Unlock(p,b) (p)->lpVtbl->Unlock(p,b) -#define IDirectDrawSurface2_UpdateOverlay(p,a,b,c,d,e) (p)->lpVtbl->UpdateOverlay(p,a,b,c,d,e) -#define IDirectDrawSurface2_UpdateOverlayDisplay(p,a) (p)->lpVtbl->UpdateOverlayDisplay(p,a) -#define IDirectDrawSurface2_UpdateOverlayZOrder(p,a,b) (p)->lpVtbl->UpdateOverlayZOrder(p,a,b) -#define IDirectDrawSurface2_GetDDInterface(p,a) (p)->lpVtbl->GetDDInterface(p,a) -#define IDirectDrawSurface2_PageLock(p,a) (p)->lpVtbl->PageLock(p,a) -#define IDirectDrawSurface2_PageUnlock(p,a) (p)->lpVtbl->PageUnlock(p,a) -#else -#define IDirectDrawSurface2_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectDrawSurface2_AddRef(p) (p)->AddRef() -#define IDirectDrawSurface2_Release(p) (p)->Release() -#define IDirectDrawSurface2_AddAttachedSurface(p,a) (p)->AddAttachedSurface(a) -#define IDirectDrawSurface2_AddOverlayDirtyRect(p,a) (p)->AddOverlayDirtyRect(a) -#define IDirectDrawSurface2_Blt(p,a,b,c,d,e) (p)->Blt(a,b,c,d,e) -#define IDirectDrawSurface2_BltBatch(p,a,b,c) (p)->BltBatch(a,b,c) -#define IDirectDrawSurface2_BltFast(p,a,b,c,d,e) (p)->BltFast(a,b,c,d,e) -#define IDirectDrawSurface2_DeleteAttachedSurface(p,a,b) (p)->DeleteAttachedSurface(a,b) -#define IDirectDrawSurface2_EnumAttachedSurfaces(p,a,b) (p)->EnumAttachedSurfaces(a,b) -#define IDirectDrawSurface2_EnumOverlayZOrders(p,a,b,c) (p)->EnumOverlayZOrders(a,b,c) -#define IDirectDrawSurface2_Flip(p,a,b) (p)->Flip(a,b) -#define IDirectDrawSurface2_GetAttachedSurface(p,a,b) (p)->GetAttachedSurface(a,b) -#define IDirectDrawSurface2_GetBltStatus(p,a) (p)->GetBltStatus(a) -#define IDirectDrawSurface2_GetCaps(p,b) (p)->GetCaps(b) -#define IDirectDrawSurface2_GetClipper(p,a) (p)->GetClipper(a) -#define IDirectDrawSurface2_GetColorKey(p,a,b) (p)->GetColorKey(a,b) -#define IDirectDrawSurface2_GetDC(p,a) (p)->GetDC(a) -#define IDirectDrawSurface2_GetFlipStatus(p,a) (p)->GetFlipStatus(a) -#define IDirectDrawSurface2_GetOverlayPosition(p,a,b) (p)->GetOverlayPosition(a,b) -#define IDirectDrawSurface2_GetPalette(p,a) (p)->GetPalette(a) -#define IDirectDrawSurface2_GetPixelFormat(p,a) (p)->GetPixelFormat(a) -#define IDirectDrawSurface2_GetSurfaceDesc(p,a) (p)->GetSurfaceDesc(a) -#define IDirectDrawSurface2_Initialize(p,a,b) (p)->Initialize(a,b) -#define IDirectDrawSurface2_IsLost(p) (p)->IsLost() -#define IDirectDrawSurface2_Lock(p,a,b,c,d) (p)->Lock(a,b,c,d) -#define IDirectDrawSurface2_ReleaseDC(p,a) (p)->ReleaseDC(a) -#define IDirectDrawSurface2_Restore(p) (p)->Restore() -#define IDirectDrawSurface2_SetClipper(p,a) (p)->SetClipper(a) -#define IDirectDrawSurface2_SetColorKey(p,a,b) (p)->SetColorKey(a,b) -#define IDirectDrawSurface2_SetOverlayPosition(p,a,b) (p)->SetOverlayPosition(a,b) -#define IDirectDrawSurface2_SetPalette(p,a) (p)->SetPalette(a) -#define IDirectDrawSurface2_Unlock(p,b) (p)->Unlock(b) -#define IDirectDrawSurface2_UpdateOverlay(p,a,b,c,d,e) (p)->UpdateOverlay(a,b,c,d,e) -#define IDirectDrawSurface2_UpdateOverlayDisplay(p,a) (p)->UpdateOverlayDisplay(a) -#define IDirectDrawSurface2_UpdateOverlayZOrder(p,a,b) (p)->UpdateOverlayZOrder(a,b) -#define IDirectDrawSurface2_GetDDInterface(p,a) (p)->GetDDInterface(a) -#define IDirectDrawSurface2_PageLock(p,a) (p)->PageLock(a) -#define IDirectDrawSurface2_PageUnlock(p,a) (p)->PageUnlock(a) -#endif - -/* - * IDirectDrawSurface3 and related interfaces - */ -#undef INTERFACE -#define INTERFACE IDirectDrawSurface3 -DECLARE_INTERFACE_( IDirectDrawSurface3, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDrawSurface methods ***/ - STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE3) PURE; - STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT) PURE; - STDMETHOD(Blt)(THIS_ LPRECT,LPDIRECTDRAWSURFACE3, LPRECT,DWORD, LPDDBLTFX) PURE; - STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH, DWORD, DWORD ) PURE; - STDMETHOD(BltFast)(THIS_ DWORD,DWORD,LPDIRECTDRAWSURFACE3, LPRECT,DWORD) PURE; - STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD,LPDIRECTDRAWSURFACE3) PURE; - STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID,LPDDENUMSURFACESCALLBACK) PURE; - STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD,LPVOID,LPDDENUMSURFACESCALLBACK) PURE; - STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE3, DWORD) PURE; - STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS, LPDIRECTDRAWSURFACE3 FAR *) PURE; - STDMETHOD(GetBltStatus)(THIS_ DWORD) PURE; - STDMETHOD(GetCaps)(THIS_ LPDDSCAPS) PURE; - STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER FAR*) PURE; - STDMETHOD(GetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; - STDMETHOD(GetDC)(THIS_ HDC FAR *) PURE; - STDMETHOD(GetFlipStatus)(THIS_ DWORD) PURE; - STDMETHOD(GetOverlayPosition)(THIS_ LPLONG, LPLONG ) PURE; - STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE FAR*) PURE; - STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT) PURE; - STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC) PURE; - STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC) PURE; - STDMETHOD(IsLost)(THIS) PURE; - STDMETHOD(Lock)(THIS_ LPRECT,LPDDSURFACEDESC,DWORD,HANDLE) PURE; - STDMETHOD(ReleaseDC)(THIS_ HDC) PURE; - STDMETHOD(Restore)(THIS) PURE; - STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER) PURE; - STDMETHOD(SetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; - STDMETHOD(SetOverlayPosition)(THIS_ LONG, LONG ) PURE; - STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE) PURE; - STDMETHOD(Unlock)(THIS_ LPVOID) PURE; - STDMETHOD(UpdateOverlay)(THIS_ LPRECT, LPDIRECTDRAWSURFACE3,LPRECT,DWORD, LPDDOVERLAYFX) PURE; - STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD) PURE; - STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD, LPDIRECTDRAWSURFACE3) PURE; - /*** Added in the v2 interface ***/ - STDMETHOD(GetDDInterface)(THIS_ LPVOID FAR *) PURE; - STDMETHOD(PageLock)(THIS_ DWORD) PURE; - STDMETHOD(PageUnlock)(THIS_ DWORD) PURE; - /*** Added in the V3 interface ***/ - STDMETHOD(SetSurfaceDesc)(THIS_ LPDDSURFACEDESC, DWORD) PURE; -}; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectDrawSurface3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectDrawSurface3_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectDrawSurface3_Release(p) (p)->lpVtbl->Release(p) -#define IDirectDrawSurface3_AddAttachedSurface(p,a) (p)->lpVtbl->AddAttachedSurface(p,a) -#define IDirectDrawSurface3_AddOverlayDirtyRect(p,a) (p)->lpVtbl->AddOverlayDirtyRect(p,a) -#define IDirectDrawSurface3_Blt(p,a,b,c,d,e) (p)->lpVtbl->Blt(p,a,b,c,d,e) -#define IDirectDrawSurface3_BltBatch(p,a,b,c) (p)->lpVtbl->BltBatch(p,a,b,c) -#define IDirectDrawSurface3_BltFast(p,a,b,c,d,e) (p)->lpVtbl->BltFast(p,a,b,c,d,e) -#define IDirectDrawSurface3_DeleteAttachedSurface(p,a,b) (p)->lpVtbl->DeleteAttachedSurface(p,a,b) -#define IDirectDrawSurface3_EnumAttachedSurfaces(p,a,b) (p)->lpVtbl->EnumAttachedSurfaces(p,a,b) -#define IDirectDrawSurface3_EnumOverlayZOrders(p,a,b,c) (p)->lpVtbl->EnumOverlayZOrders(p,a,b,c) -#define IDirectDrawSurface3_Flip(p,a,b) (p)->lpVtbl->Flip(p,a,b) -#define IDirectDrawSurface3_GetAttachedSurface(p,a,b) (p)->lpVtbl->GetAttachedSurface(p,a,b) -#define IDirectDrawSurface3_GetBltStatus(p,a) (p)->lpVtbl->GetBltStatus(p,a) -#define IDirectDrawSurface3_GetCaps(p,b) (p)->lpVtbl->GetCaps(p,b) -#define IDirectDrawSurface3_GetClipper(p,a) (p)->lpVtbl->GetClipper(p,a) -#define IDirectDrawSurface3_GetColorKey(p,a,b) (p)->lpVtbl->GetColorKey(p,a,b) -#define IDirectDrawSurface3_GetDC(p,a) (p)->lpVtbl->GetDC(p,a) -#define IDirectDrawSurface3_GetFlipStatus(p,a) (p)->lpVtbl->GetFlipStatus(p,a) -#define IDirectDrawSurface3_GetOverlayPosition(p,a,b) (p)->lpVtbl->GetOverlayPosition(p,a,b) -#define IDirectDrawSurface3_GetPalette(p,a) (p)->lpVtbl->GetPalette(p,a) -#define IDirectDrawSurface3_GetPixelFormat(p,a) (p)->lpVtbl->GetPixelFormat(p,a) -#define IDirectDrawSurface3_GetSurfaceDesc(p,a) (p)->lpVtbl->GetSurfaceDesc(p,a) -#define IDirectDrawSurface3_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) -#define IDirectDrawSurface3_IsLost(p) (p)->lpVtbl->IsLost(p) -#define IDirectDrawSurface3_Lock(p,a,b,c,d) (p)->lpVtbl->Lock(p,a,b,c,d) -#define IDirectDrawSurface3_ReleaseDC(p,a) (p)->lpVtbl->ReleaseDC(p,a) -#define IDirectDrawSurface3_Restore(p) (p)->lpVtbl->Restore(p) -#define IDirectDrawSurface3_SetClipper(p,a) (p)->lpVtbl->SetClipper(p,a) -#define IDirectDrawSurface3_SetColorKey(p,a,b) (p)->lpVtbl->SetColorKey(p,a,b) -#define IDirectDrawSurface3_SetOverlayPosition(p,a,b) (p)->lpVtbl->SetOverlayPosition(p,a,b) -#define IDirectDrawSurface3_SetPalette(p,a) (p)->lpVtbl->SetPalette(p,a) -#define IDirectDrawSurface3_Unlock(p,b) (p)->lpVtbl->Unlock(p,b) -#define IDirectDrawSurface3_UpdateOverlay(p,a,b,c,d,e) (p)->lpVtbl->UpdateOverlay(p,a,b,c,d,e) -#define IDirectDrawSurface3_UpdateOverlayDisplay(p,a) (p)->lpVtbl->UpdateOverlayDisplay(p,a) -#define IDirectDrawSurface3_UpdateOverlayZOrder(p,a,b) (p)->lpVtbl->UpdateOverlayZOrder(p,a,b) -#define IDirectDrawSurface3_GetDDInterface(p,a) (p)->lpVtbl->GetDDInterface(p,a) -#define IDirectDrawSurface3_PageLock(p,a) (p)->lpVtbl->PageLock(p,a) -#define IDirectDrawSurface3_PageUnlock(p,a) (p)->lpVtbl->PageUnlock(p,a) -#define IDirectDrawSurface3_SetSurfaceDesc(p,a,b) (p)->lpVtbl->SetSurfaceDesc(p,a,b) -#else -#define IDirectDrawSurface3_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectDrawSurface3_AddRef(p) (p)->AddRef() -#define IDirectDrawSurface3_Release(p) (p)->Release() -#define IDirectDrawSurface3_AddAttachedSurface(p,a) (p)->AddAttachedSurface(a) -#define IDirectDrawSurface3_AddOverlayDirtyRect(p,a) (p)->AddOverlayDirtyRect(a) -#define IDirectDrawSurface3_Blt(p,a,b,c,d,e) (p)->Blt(a,b,c,d,e) -#define IDirectDrawSurface3_BltBatch(p,a,b,c) (p)->BltBatch(a,b,c) -#define IDirectDrawSurface3_BltFast(p,a,b,c,d,e) (p)->BltFast(a,b,c,d,e) -#define IDirectDrawSurface3_DeleteAttachedSurface(p,a,b) (p)->DeleteAttachedSurface(a,b) -#define IDirectDrawSurface3_EnumAttachedSurfaces(p,a,b) (p)->EnumAttachedSurfaces(a,b) -#define IDirectDrawSurface3_EnumOverlayZOrders(p,a,b,c) (p)->EnumOverlayZOrders(a,b,c) -#define IDirectDrawSurface3_Flip(p,a,b) (p)->Flip(a,b) -#define IDirectDrawSurface3_GetAttachedSurface(p,a,b) (p)->GetAttachedSurface(a,b) -#define IDirectDrawSurface3_GetBltStatus(p,a) (p)->GetBltStatus(a) -#define IDirectDrawSurface3_GetCaps(p,b) (p)->GetCaps(b) -#define IDirectDrawSurface3_GetClipper(p,a) (p)->GetClipper(a) -#define IDirectDrawSurface3_GetColorKey(p,a,b) (p)->GetColorKey(a,b) -#define IDirectDrawSurface3_GetDC(p,a) (p)->GetDC(a) -#define IDirectDrawSurface3_GetFlipStatus(p,a) (p)->GetFlipStatus(a) -#define IDirectDrawSurface3_GetOverlayPosition(p,a,b) (p)->GetOverlayPosition(a,b) -#define IDirectDrawSurface3_GetPalette(p,a) (p)->GetPalette(a) -#define IDirectDrawSurface3_GetPixelFormat(p,a) (p)->GetPixelFormat(a) -#define IDirectDrawSurface3_GetSurfaceDesc(p,a) (p)->GetSurfaceDesc(a) -#define IDirectDrawSurface3_Initialize(p,a,b) (p)->Initialize(a,b) -#define IDirectDrawSurface3_IsLost(p) (p)->IsLost() -#define IDirectDrawSurface3_Lock(p,a,b,c,d) (p)->Lock(a,b,c,d) -#define IDirectDrawSurface3_ReleaseDC(p,a) (p)->ReleaseDC(a) -#define IDirectDrawSurface3_Restore(p) (p)->Restore() -#define IDirectDrawSurface3_SetClipper(p,a) (p)->SetClipper(a) -#define IDirectDrawSurface3_SetColorKey(p,a,b) (p)->SetColorKey(a,b) -#define IDirectDrawSurface3_SetOverlayPosition(p,a,b) (p)->SetOverlayPosition(a,b) -#define IDirectDrawSurface3_SetPalette(p,a) (p)->SetPalette(a) -#define IDirectDrawSurface3_Unlock(p,b) (p)->Unlock(b) -#define IDirectDrawSurface3_UpdateOverlay(p,a,b,c,d,e) (p)->UpdateOverlay(a,b,c,d,e) -#define IDirectDrawSurface3_UpdateOverlayDisplay(p,a) (p)->UpdateOverlayDisplay(a) -#define IDirectDrawSurface3_UpdateOverlayZOrder(p,a,b) (p)->UpdateOverlayZOrder(a,b) -#define IDirectDrawSurface3_GetDDInterface(p,a) (p)->GetDDInterface(a) -#define IDirectDrawSurface3_PageLock(p,a) (p)->PageLock(a) -#define IDirectDrawSurface3_PageUnlock(p,a) (p)->PageUnlock(a) -#define IDirectDrawSurface3_SetSurfaceDesc(p,a,b) (p)->SetSurfaceDesc(a,b) -#endif - -/* - * IDirectDrawSurface4 and related interfaces - */ -#undef INTERFACE -#define INTERFACE IDirectDrawSurface4 -DECLARE_INTERFACE_( IDirectDrawSurface4, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDrawSurface methods ***/ - STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE4) PURE; - STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT) PURE; - STDMETHOD(Blt)(THIS_ LPRECT,LPDIRECTDRAWSURFACE4, LPRECT,DWORD, LPDDBLTFX) PURE; - STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH, DWORD, DWORD ) PURE; - STDMETHOD(BltFast)(THIS_ DWORD,DWORD,LPDIRECTDRAWSURFACE4, LPRECT,DWORD) PURE; - STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD,LPDIRECTDRAWSURFACE4) PURE; - STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID,LPDDENUMSURFACESCALLBACK2) PURE; - STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD,LPVOID,LPDDENUMSURFACESCALLBACK2) PURE; - STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE4, DWORD) PURE; - STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS2, LPDIRECTDRAWSURFACE4 FAR *) PURE; - STDMETHOD(GetBltStatus)(THIS_ DWORD) PURE; - STDMETHOD(GetCaps)(THIS_ LPDDSCAPS2) PURE; - STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER FAR*) PURE; - STDMETHOD(GetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; - STDMETHOD(GetDC)(THIS_ HDC FAR *) PURE; - STDMETHOD(GetFlipStatus)(THIS_ DWORD) PURE; - STDMETHOD(GetOverlayPosition)(THIS_ LPLONG, LPLONG ) PURE; - STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE FAR*) PURE; - STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT) PURE; - STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC2) PURE; - STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC2) PURE; - STDMETHOD(IsLost)(THIS) PURE; - STDMETHOD(Lock)(THIS_ LPRECT,LPDDSURFACEDESC2,DWORD,HANDLE) PURE; - STDMETHOD(ReleaseDC)(THIS_ HDC) PURE; - STDMETHOD(Restore)(THIS) PURE; - STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER) PURE; - STDMETHOD(SetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; - STDMETHOD(SetOverlayPosition)(THIS_ LONG, LONG ) PURE; - STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE) PURE; - STDMETHOD(Unlock)(THIS_ LPRECT) PURE; - STDMETHOD(UpdateOverlay)(THIS_ LPRECT, LPDIRECTDRAWSURFACE4,LPRECT,DWORD, LPDDOVERLAYFX) PURE; - STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD) PURE; - STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD, LPDIRECTDRAWSURFACE4) PURE; - /*** Added in the v2 interface ***/ - STDMETHOD(GetDDInterface)(THIS_ LPVOID FAR *) PURE; - STDMETHOD(PageLock)(THIS_ DWORD) PURE; - STDMETHOD(PageUnlock)(THIS_ DWORD) PURE; - /*** Added in the v3 interface ***/ - STDMETHOD(SetSurfaceDesc)(THIS_ LPDDSURFACEDESC2, DWORD) PURE; - /*** Added in the v4 interface ***/ - STDMETHOD(SetPrivateData)(THIS_ REFGUID, LPVOID, DWORD, DWORD) PURE; - STDMETHOD(GetPrivateData)(THIS_ REFGUID, LPVOID, LPDWORD) PURE; - STDMETHOD(FreePrivateData)(THIS_ REFGUID) PURE; - STDMETHOD(GetUniquenessValue)(THIS_ LPDWORD) PURE; - STDMETHOD(ChangeUniquenessValue)(THIS) PURE; -}; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectDrawSurface4_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectDrawSurface4_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectDrawSurface4_Release(p) (p)->lpVtbl->Release(p) -#define IDirectDrawSurface4_AddAttachedSurface(p,a) (p)->lpVtbl->AddAttachedSurface(p,a) -#define IDirectDrawSurface4_AddOverlayDirtyRect(p,a) (p)->lpVtbl->AddOverlayDirtyRect(p,a) -#define IDirectDrawSurface4_Blt(p,a,b,c,d,e) (p)->lpVtbl->Blt(p,a,b,c,d,e) -#define IDirectDrawSurface4_BltBatch(p,a,b,c) (p)->lpVtbl->BltBatch(p,a,b,c) -#define IDirectDrawSurface4_BltFast(p,a,b,c,d,e) (p)->lpVtbl->BltFast(p,a,b,c,d,e) -#define IDirectDrawSurface4_DeleteAttachedSurface(p,a,b) (p)->lpVtbl->DeleteAttachedSurface(p,a,b) -#define IDirectDrawSurface4_EnumAttachedSurfaces(p,a,b) (p)->lpVtbl->EnumAttachedSurfaces(p,a,b) -#define IDirectDrawSurface4_EnumOverlayZOrders(p,a,b,c) (p)->lpVtbl->EnumOverlayZOrders(p,a,b,c) -#define IDirectDrawSurface4_Flip(p,a,b) (p)->lpVtbl->Flip(p,a,b) -#define IDirectDrawSurface4_GetAttachedSurface(p,a,b) (p)->lpVtbl->GetAttachedSurface(p,a,b) -#define IDirectDrawSurface4_GetBltStatus(p,a) (p)->lpVtbl->GetBltStatus(p,a) -#define IDirectDrawSurface4_GetCaps(p,b) (p)->lpVtbl->GetCaps(p,b) -#define IDirectDrawSurface4_GetClipper(p,a) (p)->lpVtbl->GetClipper(p,a) -#define IDirectDrawSurface4_GetColorKey(p,a,b) (p)->lpVtbl->GetColorKey(p,a,b) -#define IDirectDrawSurface4_GetDC(p,a) (p)->lpVtbl->GetDC(p,a) -#define IDirectDrawSurface4_GetFlipStatus(p,a) (p)->lpVtbl->GetFlipStatus(p,a) -#define IDirectDrawSurface4_GetOverlayPosition(p,a,b) (p)->lpVtbl->GetOverlayPosition(p,a,b) -#define IDirectDrawSurface4_GetPalette(p,a) (p)->lpVtbl->GetPalette(p,a) -#define IDirectDrawSurface4_GetPixelFormat(p,a) (p)->lpVtbl->GetPixelFormat(p,a) -#define IDirectDrawSurface4_GetSurfaceDesc(p,a) (p)->lpVtbl->GetSurfaceDesc(p,a) -#define IDirectDrawSurface4_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) -#define IDirectDrawSurface4_IsLost(p) (p)->lpVtbl->IsLost(p) -#define IDirectDrawSurface4_Lock(p,a,b,c,d) (p)->lpVtbl->Lock(p,a,b,c,d) -#define IDirectDrawSurface4_ReleaseDC(p,a) (p)->lpVtbl->ReleaseDC(p,a) -#define IDirectDrawSurface4_Restore(p) (p)->lpVtbl->Restore(p) -#define IDirectDrawSurface4_SetClipper(p,a) (p)->lpVtbl->SetClipper(p,a) -#define IDirectDrawSurface4_SetColorKey(p,a,b) (p)->lpVtbl->SetColorKey(p,a,b) -#define IDirectDrawSurface4_SetOverlayPosition(p,a,b) (p)->lpVtbl->SetOverlayPosition(p,a,b) -#define IDirectDrawSurface4_SetPalette(p,a) (p)->lpVtbl->SetPalette(p,a) -#define IDirectDrawSurface4_Unlock(p,b) (p)->lpVtbl->Unlock(p,b) -#define IDirectDrawSurface4_UpdateOverlay(p,a,b,c,d,e) (p)->lpVtbl->UpdateOverlay(p,a,b,c,d,e) -#define IDirectDrawSurface4_UpdateOverlayDisplay(p,a) (p)->lpVtbl->UpdateOverlayDisplay(p,a) -#define IDirectDrawSurface4_UpdateOverlayZOrder(p,a,b) (p)->lpVtbl->UpdateOverlayZOrder(p,a,b) -#define IDirectDrawSurface4_GetDDInterface(p,a) (p)->lpVtbl->GetDDInterface(p,a) -#define IDirectDrawSurface4_PageLock(p,a) (p)->lpVtbl->PageLock(p,a) -#define IDirectDrawSurface4_PageUnlock(p,a) (p)->lpVtbl->PageUnlock(p,a) -#define IDirectDrawSurface4_SetSurfaceDesc(p,a,b) (p)->lpVtbl->SetSurfaceDesc(p,a,b) -#define IDirectDrawSurface4_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) -#define IDirectDrawSurface4_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) -#define IDirectDrawSurface4_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) -#define IDirectDrawSurface4_GetUniquenessValue(p, a) (p)->lpVtbl->GetUniquenessValue(p, a) -#define IDirectDrawSurface4_ChangeUniquenessValue(p) (p)->lpVtbl->ChangeUniquenessValue(p) -#else -#define IDirectDrawSurface4_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectDrawSurface4_AddRef(p) (p)->AddRef() -#define IDirectDrawSurface4_Release(p) (p)->Release() -#define IDirectDrawSurface4_AddAttachedSurface(p,a) (p)->AddAttachedSurface(a) -#define IDirectDrawSurface4_AddOverlayDirtyRect(p,a) (p)->AddOverlayDirtyRect(a) -#define IDirectDrawSurface4_Blt(p,a,b,c,d,e) (p)->Blt(a,b,c,d,e) -#define IDirectDrawSurface4_BltBatch(p,a,b,c) (p)->BltBatch(a,b,c) -#define IDirectDrawSurface4_BltFast(p,a,b,c,d,e) (p)->BltFast(a,b,c,d,e) -#define IDirectDrawSurface4_DeleteAttachedSurface(p,a,b) (p)->DeleteAttachedSurface(a,b) -#define IDirectDrawSurface4_EnumAttachedSurfaces(p,a,b) (p)->EnumAttachedSurfaces(a,b) -#define IDirectDrawSurface4_EnumOverlayZOrders(p,a,b,c) (p)->EnumOverlayZOrders(a,b,c) -#define IDirectDrawSurface4_Flip(p,a,b) (p)->Flip(a,b) -#define IDirectDrawSurface4_GetAttachedSurface(p,a,b) (p)->GetAttachedSurface(a,b) -#define IDirectDrawSurface4_GetBltStatus(p,a) (p)->GetBltStatus(a) -#define IDirectDrawSurface4_GetCaps(p,b) (p)->GetCaps(b) -#define IDirectDrawSurface4_GetClipper(p,a) (p)->GetClipper(a) -#define IDirectDrawSurface4_GetColorKey(p,a,b) (p)->GetColorKey(a,b) -#define IDirectDrawSurface4_GetDC(p,a) (p)->GetDC(a) -#define IDirectDrawSurface4_GetFlipStatus(p,a) (p)->GetFlipStatus(a) -#define IDirectDrawSurface4_GetOverlayPosition(p,a,b) (p)->GetOverlayPosition(a,b) -#define IDirectDrawSurface4_GetPalette(p,a) (p)->GetPalette(a) -#define IDirectDrawSurface4_GetPixelFormat(p,a) (p)->GetPixelFormat(a) -#define IDirectDrawSurface4_GetSurfaceDesc(p,a) (p)->GetSurfaceDesc(a) -#define IDirectDrawSurface4_Initialize(p,a,b) (p)->Initialize(a,b) -#define IDirectDrawSurface4_IsLost(p) (p)->IsLost() -#define IDirectDrawSurface4_Lock(p,a,b,c,d) (p)->Lock(a,b,c,d) -#define IDirectDrawSurface4_ReleaseDC(p,a) (p)->ReleaseDC(a) -#define IDirectDrawSurface4_Restore(p) (p)->Restore() -#define IDirectDrawSurface4_SetClipper(p,a) (p)->SetClipper(a) -#define IDirectDrawSurface4_SetColorKey(p,a,b) (p)->SetColorKey(a,b) -#define IDirectDrawSurface4_SetOverlayPosition(p,a,b) (p)->SetOverlayPosition(a,b) -#define IDirectDrawSurface4_SetPalette(p,a) (p)->SetPalette(a) -#define IDirectDrawSurface4_Unlock(p,b) (p)->Unlock(b) -#define IDirectDrawSurface4_UpdateOverlay(p,a,b,c,d,e) (p)->UpdateOverlay(a,b,c,d,e) -#define IDirectDrawSurface4_UpdateOverlayDisplay(p,a) (p)->UpdateOverlayDisplay(a) -#define IDirectDrawSurface4_UpdateOverlayZOrder(p,a,b) (p)->UpdateOverlayZOrder(a,b) -#define IDirectDrawSurface4_GetDDInterface(p,a) (p)->GetDDInterface(a) -#define IDirectDrawSurface4_PageLock(p,a) (p)->PageLock(a) -#define IDirectDrawSurface4_PageUnlock(p,a) (p)->PageUnlock(a) -#define IDirectDrawSurface4_SetSurfaceDesc(p,a,b) (p)->SetSurfaceDesc(a,b) -#define IDirectDrawSurface4_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) -#define IDirectDrawSurface4_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) -#define IDirectDrawSurface4_FreePrivateData(p,a) (p)->FreePrivateData(a) -#define IDirectDrawSurface4_GetUniquenessValue(p, a) (p)->GetUniquenessValue(a) -#define IDirectDrawSurface4_ChangeUniquenessValue(p) (p)->ChangeUniquenessValue() -#endif - -/* - * IDirectDrawSurface7 and related interfaces - */ -#undef INTERFACE -#define INTERFACE IDirectDrawSurface7 -DECLARE_INTERFACE_( IDirectDrawSurface7, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDrawSurface methods ***/ - STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE7) PURE; - STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT) PURE; - STDMETHOD(Blt)(THIS_ LPRECT,LPDIRECTDRAWSURFACE7, LPRECT,DWORD, LPDDBLTFX) PURE; - STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH, DWORD, DWORD ) PURE; - STDMETHOD(BltFast)(THIS_ DWORD,DWORD,LPDIRECTDRAWSURFACE7, LPRECT,DWORD) PURE; - STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD,LPDIRECTDRAWSURFACE7) PURE; - STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID,LPDDENUMSURFACESCALLBACK7) PURE; - STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD,LPVOID,LPDDENUMSURFACESCALLBACK7) PURE; - STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE7, DWORD) PURE; - STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS2, LPDIRECTDRAWSURFACE7 FAR *) PURE; - STDMETHOD(GetBltStatus)(THIS_ DWORD) PURE; - STDMETHOD(GetCaps)(THIS_ LPDDSCAPS2) PURE; - STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER FAR*) PURE; - STDMETHOD(GetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; - STDMETHOD(GetDC)(THIS_ HDC FAR *) PURE; - STDMETHOD(GetFlipStatus)(THIS_ DWORD) PURE; - STDMETHOD(GetOverlayPosition)(THIS_ LPLONG, LPLONG ) PURE; - STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE FAR*) PURE; - STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT) PURE; - STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC2) PURE; - STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC2) PURE; - STDMETHOD(IsLost)(THIS) PURE; - STDMETHOD(Lock)(THIS_ LPRECT,LPDDSURFACEDESC2,DWORD,HANDLE) PURE; - STDMETHOD(ReleaseDC)(THIS_ HDC) PURE; - STDMETHOD(Restore)(THIS) PURE; - STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER) PURE; - STDMETHOD(SetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; - STDMETHOD(SetOverlayPosition)(THIS_ LONG, LONG ) PURE; - STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE) PURE; - STDMETHOD(Unlock)(THIS_ LPRECT) PURE; - STDMETHOD(UpdateOverlay)(THIS_ LPRECT, LPDIRECTDRAWSURFACE7,LPRECT,DWORD, LPDDOVERLAYFX) PURE; - STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD) PURE; - STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD, LPDIRECTDRAWSURFACE7) PURE; - /*** Added in the v2 interface ***/ - STDMETHOD(GetDDInterface)(THIS_ LPVOID FAR *) PURE; - STDMETHOD(PageLock)(THIS_ DWORD) PURE; - STDMETHOD(PageUnlock)(THIS_ DWORD) PURE; - /*** Added in the v3 interface ***/ - STDMETHOD(SetSurfaceDesc)(THIS_ LPDDSURFACEDESC2, DWORD) PURE; - /*** Added in the v4 interface ***/ - STDMETHOD(SetPrivateData)(THIS_ REFGUID, LPVOID, DWORD, DWORD) PURE; - STDMETHOD(GetPrivateData)(THIS_ REFGUID, LPVOID, LPDWORD) PURE; - STDMETHOD(FreePrivateData)(THIS_ REFGUID) PURE; - STDMETHOD(GetUniquenessValue)(THIS_ LPDWORD) PURE; - STDMETHOD(ChangeUniquenessValue)(THIS) PURE; - /*** Moved Texture7 methods here ***/ - STDMETHOD(SetPriority)(THIS_ DWORD) PURE; - STDMETHOD(GetPriority)(THIS_ LPDWORD) PURE; - STDMETHOD(SetLOD)(THIS_ DWORD) PURE; - STDMETHOD(GetLOD)(THIS_ LPDWORD) PURE; -}; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectDrawSurface7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectDrawSurface7_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectDrawSurface7_Release(p) (p)->lpVtbl->Release(p) -#define IDirectDrawSurface7_AddAttachedSurface(p,a) (p)->lpVtbl->AddAttachedSurface(p,a) -#define IDirectDrawSurface7_AddOverlayDirtyRect(p,a) (p)->lpVtbl->AddOverlayDirtyRect(p,a) -#define IDirectDrawSurface7_Blt(p,a,b,c,d,e) (p)->lpVtbl->Blt(p,a,b,c,d,e) -#define IDirectDrawSurface7_BltBatch(p,a,b,c) (p)->lpVtbl->BltBatch(p,a,b,c) -#define IDirectDrawSurface7_BltFast(p,a,b,c,d,e) (p)->lpVtbl->BltFast(p,a,b,c,d,e) -#define IDirectDrawSurface7_DeleteAttachedSurface(p,a,b) (p)->lpVtbl->DeleteAttachedSurface(p,a,b) -#define IDirectDrawSurface7_EnumAttachedSurfaces(p,a,b) (p)->lpVtbl->EnumAttachedSurfaces(p,a,b) -#define IDirectDrawSurface7_EnumOverlayZOrders(p,a,b,c) (p)->lpVtbl->EnumOverlayZOrders(p,a,b,c) -#define IDirectDrawSurface7_Flip(p,a,b) (p)->lpVtbl->Flip(p,a,b) -#define IDirectDrawSurface7_GetAttachedSurface(p,a,b) (p)->lpVtbl->GetAttachedSurface(p,a,b) -#define IDirectDrawSurface7_GetBltStatus(p,a) (p)->lpVtbl->GetBltStatus(p,a) -#define IDirectDrawSurface7_GetCaps(p,b) (p)->lpVtbl->GetCaps(p,b) -#define IDirectDrawSurface7_GetClipper(p,a) (p)->lpVtbl->GetClipper(p,a) -#define IDirectDrawSurface7_GetColorKey(p,a,b) (p)->lpVtbl->GetColorKey(p,a,b) -#define IDirectDrawSurface7_GetDC(p,a) (p)->lpVtbl->GetDC(p,a) -#define IDirectDrawSurface7_GetFlipStatus(p,a) (p)->lpVtbl->GetFlipStatus(p,a) -#define IDirectDrawSurface7_GetOverlayPosition(p,a,b) (p)->lpVtbl->GetOverlayPosition(p,a,b) -#define IDirectDrawSurface7_GetPalette(p,a) (p)->lpVtbl->GetPalette(p,a) -#define IDirectDrawSurface7_GetPixelFormat(p,a) (p)->lpVtbl->GetPixelFormat(p,a) -#define IDirectDrawSurface7_GetSurfaceDesc(p,a) (p)->lpVtbl->GetSurfaceDesc(p,a) -#define IDirectDrawSurface7_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) -#define IDirectDrawSurface7_IsLost(p) (p)->lpVtbl->IsLost(p) -#define IDirectDrawSurface7_Lock(p,a,b,c,d) (p)->lpVtbl->Lock(p,a,b,c,d) -#define IDirectDrawSurface7_ReleaseDC(p,a) (p)->lpVtbl->ReleaseDC(p,a) -#define IDirectDrawSurface7_Restore(p) (p)->lpVtbl->Restore(p) -#define IDirectDrawSurface7_SetClipper(p,a) (p)->lpVtbl->SetClipper(p,a) -#define IDirectDrawSurface7_SetColorKey(p,a,b) (p)->lpVtbl->SetColorKey(p,a,b) -#define IDirectDrawSurface7_SetOverlayPosition(p,a,b) (p)->lpVtbl->SetOverlayPosition(p,a,b) -#define IDirectDrawSurface7_SetPalette(p,a) (p)->lpVtbl->SetPalette(p,a) -#define IDirectDrawSurface7_Unlock(p,b) (p)->lpVtbl->Unlock(p,b) -#define IDirectDrawSurface7_UpdateOverlay(p,a,b,c,d,e) (p)->lpVtbl->UpdateOverlay(p,a,b,c,d,e) -#define IDirectDrawSurface7_UpdateOverlayDisplay(p,a) (p)->lpVtbl->UpdateOverlayDisplay(p,a) -#define IDirectDrawSurface7_UpdateOverlayZOrder(p,a,b) (p)->lpVtbl->UpdateOverlayZOrder(p,a,b) -#define IDirectDrawSurface7_GetDDInterface(p,a) (p)->lpVtbl->GetDDInterface(p,a) -#define IDirectDrawSurface7_PageLock(p,a) (p)->lpVtbl->PageLock(p,a) -#define IDirectDrawSurface7_PageUnlock(p,a) (p)->lpVtbl->PageUnlock(p,a) -#define IDirectDrawSurface7_SetSurfaceDesc(p,a,b) (p)->lpVtbl->SetSurfaceDesc(p,a,b) -#define IDirectDrawSurface7_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) -#define IDirectDrawSurface7_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) -#define IDirectDrawSurface7_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) -#define IDirectDrawSurface7_GetUniquenessValue(p, a) (p)->lpVtbl->GetUniquenessValue(p, a) -#define IDirectDrawSurface7_ChangeUniquenessValue(p) (p)->lpVtbl->ChangeUniquenessValue(p) -#define IDirectDrawSurface7_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) -#define IDirectDrawSurface7_GetPriority(p,a) (p)->lpVtbl->GetPriority(p,a) -#define IDirectDrawSurface7_SetLOD(p,a) (p)->lpVtbl->SetLOD(p,a) -#define IDirectDrawSurface7_GetLOD(p,a) (p)->lpVtbl->GetLOD(p,a) -#else -#define IDirectDrawSurface7_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectDrawSurface7_AddRef(p) (p)->AddRef() -#define IDirectDrawSurface7_Release(p) (p)->Release() -#define IDirectDrawSurface7_AddAttachedSurface(p,a) (p)->AddAttachedSurface(a) -#define IDirectDrawSurface7_AddOverlayDirtyRect(p,a) (p)->AddOverlayDirtyRect(a) -#define IDirectDrawSurface7_Blt(p,a,b,c,d,e) (p)->Blt(a,b,c,d,e) -#define IDirectDrawSurface7_BltBatch(p,a,b,c) (p)->BltBatch(a,b,c) -#define IDirectDrawSurface7_BltFast(p,a,b,c,d,e) (p)->BltFast(a,b,c,d,e) -#define IDirectDrawSurface7_DeleteAttachedSurface(p,a,b) (p)->DeleteAttachedSurface(a,b) -#define IDirectDrawSurface7_EnumAttachedSurfaces(p,a,b) (p)->EnumAttachedSurfaces(a,b) -#define IDirectDrawSurface7_EnumOverlayZOrders(p,a,b,c) (p)->EnumOverlayZOrders(a,b,c) -#define IDirectDrawSurface7_Flip(p,a,b) (p)->Flip(a,b) -#define IDirectDrawSurface7_GetAttachedSurface(p,a,b) (p)->GetAttachedSurface(a,b) -#define IDirectDrawSurface7_GetBltStatus(p,a) (p)->GetBltStatus(a) -#define IDirectDrawSurface7_GetCaps(p,b) (p)->GetCaps(b) -#define IDirectDrawSurface7_GetClipper(p,a) (p)->GetClipper(a) -#define IDirectDrawSurface7_GetColorKey(p,a,b) (p)->GetColorKey(a,b) -#define IDirectDrawSurface7_GetDC(p,a) (p)->GetDC(a) -#define IDirectDrawSurface7_GetFlipStatus(p,a) (p)->GetFlipStatus(a) -#define IDirectDrawSurface7_GetOverlayPosition(p,a,b) (p)->GetOverlayPosition(a,b) -#define IDirectDrawSurface7_GetPalette(p,a) (p)->GetPalette(a) -#define IDirectDrawSurface7_GetPixelFormat(p,a) (p)->GetPixelFormat(a) -#define IDirectDrawSurface7_GetSurfaceDesc(p,a) (p)->GetSurfaceDesc(a) -#define IDirectDrawSurface7_Initialize(p,a,b) (p)->Initialize(a,b) -#define IDirectDrawSurface7_IsLost(p) (p)->IsLost() -#define IDirectDrawSurface7_Lock(p,a,b,c,d) (p)->Lock(a,b,c,d) -#define IDirectDrawSurface7_ReleaseDC(p,a) (p)->ReleaseDC(a) -#define IDirectDrawSurface7_Restore(p) (p)->Restore() -#define IDirectDrawSurface7_SetClipper(p,a) (p)->SetClipper(a) -#define IDirectDrawSurface7_SetColorKey(p,a,b) (p)->SetColorKey(a,b) -#define IDirectDrawSurface7_SetOverlayPosition(p,a,b) (p)->SetOverlayPosition(a,b) -#define IDirectDrawSurface7_SetPalette(p,a) (p)->SetPalette(a) -#define IDirectDrawSurface7_Unlock(p,b) (p)->Unlock(b) -#define IDirectDrawSurface7_UpdateOverlay(p,a,b,c,d,e) (p)->UpdateOverlay(a,b,c,d,e) -#define IDirectDrawSurface7_UpdateOverlayDisplay(p,a) (p)->UpdateOverlayDisplay(a) -#define IDirectDrawSurface7_UpdateOverlayZOrder(p,a,b) (p)->UpdateOverlayZOrder(a,b) -#define IDirectDrawSurface7_GetDDInterface(p,a) (p)->GetDDInterface(a) -#define IDirectDrawSurface7_PageLock(p,a) (p)->PageLock(a) -#define IDirectDrawSurface7_PageUnlock(p,a) (p)->PageUnlock(a) -#define IDirectDrawSurface7_SetSurfaceDesc(p,a,b) (p)->SetSurfaceDesc(a,b) -#define IDirectDrawSurface7_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) -#define IDirectDrawSurface7_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) -#define IDirectDrawSurface7_FreePrivateData(p,a) (p)->FreePrivateData(a) -#define IDirectDrawSurface7_GetUniquenessValue(p, a) (p)->GetUniquenessValue(a) -#define IDirectDrawSurface7_ChangeUniquenessValue(p) (p)->ChangeUniquenessValue() -#define IDirectDrawSurface7_SetPriority(p,a) (p)->SetPriority(a) -#define IDirectDrawSurface7_GetPriority(p,a) (p)->GetPriority(a) -#define IDirectDrawSurface7_SetLOD(p,a) (p)->SetLOD(a) -#define IDirectDrawSurface7_GetLOD(p,a) (p)->GetLOD(a) -#endif - - -/* - * IDirectDrawColorControl - */ -#if defined( _WIN32 ) && !defined( _NO_COM ) -#undef INTERFACE -#define INTERFACE IDirectDrawColorControl -DECLARE_INTERFACE_( IDirectDrawColorControl, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDrawColorControl methods ***/ - STDMETHOD(GetColorControls)(THIS_ LPDDCOLORCONTROL) PURE; - STDMETHOD(SetColorControls)(THIS_ LPDDCOLORCONTROL) PURE; -}; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectDrawColorControl_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) -#define IDirectDrawColorControl_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectDrawColorControl_Release(p) (p)->lpVtbl->Release(p) -#define IDirectDrawColorControl_GetColorControls(p, a) (p)->lpVtbl->GetColorControls(p, a) -#define IDirectDrawColorControl_SetColorControls(p, a) (p)->lpVtbl->SetColorControls(p, a) -#else -#define IDirectDrawColorControl_QueryInterface(p, a, b) (p)->QueryInterface(a, b) -#define IDirectDrawColorControl_AddRef(p) (p)->AddRef() -#define IDirectDrawColorControl_Release(p) (p)->Release() -#define IDirectDrawColorControl_GetColorControls(p, a) (p)->GetColorControls(a) -#define IDirectDrawColorControl_SetColorControls(p, a) (p)->SetColorControls(a) -#endif - -#endif - - -/* - * IDirectDrawGammaControl - */ -#if defined( _WIN32 ) && !defined( _NO_COM ) -#undef INTERFACE -#define INTERFACE IDirectDrawGammaControl -DECLARE_INTERFACE_( IDirectDrawGammaControl, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDrawGammaControl methods ***/ - STDMETHOD(GetGammaRamp)(THIS_ DWORD, LPDDGAMMARAMP) PURE; - STDMETHOD(SetGammaRamp)(THIS_ DWORD, LPDDGAMMARAMP) PURE; -}; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectDrawGammaControl_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) -#define IDirectDrawGammaControl_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectDrawGammaControl_Release(p) (p)->lpVtbl->Release(p) -#define IDirectDrawGammaControl_GetGammaRamp(p, a, b) (p)->lpVtbl->GetGammaRamp(p, a, b) -#define IDirectDrawGammaControl_SetGammaRamp(p, a, b) (p)->lpVtbl->SetGammaRamp(p, a, b) -#else -#define IDirectDrawGammaControl_QueryInterface(p, a, b) (p)->QueryInterface(a, b) -#define IDirectDrawGammaControl_AddRef(p) (p)->AddRef() -#define IDirectDrawGammaControl_Release(p) (p)->Release() -#define IDirectDrawGammaControl_GetGammaRamp(p, a, b) (p)->GetGammaRamp(a, b) -#define IDirectDrawGammaControl_SetGammaRamp(p, a, b) (p)->SetGammaRamp(a, b) -#endif - -#endif - - - -#endif - - -/* - * DDSURFACEDESC - */ -typedef struct _DDSURFACEDESC -{ - DWORD dwSize; // size of the DDSURFACEDESC structure - DWORD dwFlags; // determines what fields are valid - DWORD dwHeight; // height of surface to be created - DWORD dwWidth; // width of input surface - union - { - LONG lPitch; // distance to start of next line (return value only) - DWORD dwLinearSize; // Formless late-allocated optimized surface size - } DUMMYUNIONNAMEN(1); - DWORD dwBackBufferCount; // number of back buffers requested - union - { - DWORD dwMipMapCount; // number of mip-map levels requested - DWORD dwZBufferBitDepth; // depth of Z buffer requested - DWORD dwRefreshRate; // refresh rate (used when display mode is described) - } DUMMYUNIONNAMEN(2); - DWORD dwAlphaBitDepth; // depth of alpha buffer requested - DWORD dwReserved; // reserved - LPVOID lpSurface; // pointer to the associated surface memory - DDCOLORKEY ddckCKDestOverlay; // color key for destination overlay use - DDCOLORKEY ddckCKDestBlt; // color key for destination blt use - DDCOLORKEY ddckCKSrcOverlay; // color key for source overlay use - DDCOLORKEY ddckCKSrcBlt; // color key for source blt use - DDPIXELFORMAT ddpfPixelFormat; // pixel format description of the surface - DDSCAPS ddsCaps; // direct draw surface capabilities -} DDSURFACEDESC; - -/* - * DDSURFACEDESC2 - */ -typedef struct _DDSURFACEDESC2 -{ - DWORD dwSize; // size of the DDSURFACEDESC structure - DWORD dwFlags; // determines what fields are valid - DWORD dwHeight; // height of surface to be created - DWORD dwWidth; // width of input surface - union - { - LONG lPitch; // distance to start of next line (return value only) - DWORD dwLinearSize; // Formless late-allocated optimized surface size - } DUMMYUNIONNAMEN(1); - union - { - DWORD dwBackBufferCount; // number of back buffers requested - DWORD dwDepth; // the depth if this is a volume texture - } DUMMYUNIONNAMEN(5); - union - { - DWORD dwMipMapCount; // number of mip-map levels requestde - // dwZBufferBitDepth removed, use ddpfPixelFormat one instead - DWORD dwRefreshRate; // refresh rate (used when display mode is described) - DWORD dwSrcVBHandle; // The source used in VB::Optimize - } DUMMYUNIONNAMEN(2); - DWORD dwAlphaBitDepth; // depth of alpha buffer requested - DWORD dwReserved; // reserved - LPVOID lpSurface; // pointer to the associated surface memory - union - { - DDCOLORKEY ddckCKDestOverlay; // color key for destination overlay use - DWORD dwEmptyFaceColor; // Physical color for empty cubemap faces - } DUMMYUNIONNAMEN(3); - DDCOLORKEY ddckCKDestBlt; // color key for destination blt use - DDCOLORKEY ddckCKSrcOverlay; // color key for source overlay use - DDCOLORKEY ddckCKSrcBlt; // color key for source blt use - union - { - DDPIXELFORMAT ddpfPixelFormat; // pixel format description of the surface - DWORD dwFVF; // vertex format description of vertex buffers - } DUMMYUNIONNAMEN(4); - DDSCAPS2 ddsCaps; // direct draw surface capabilities - DWORD dwTextureStage; // stage in multitexture cascade -} DDSURFACEDESC2; - -/* - * ddsCaps field is valid. - */ -#define DDSD_CAPS 0x00000001l // default - -/* - * dwHeight field is valid. - */ -#define DDSD_HEIGHT 0x00000002l - -/* - * dwWidth field is valid. - */ -#define DDSD_WIDTH 0x00000004l - -/* - * lPitch is valid. - */ -#define DDSD_PITCH 0x00000008l - -/* - * dwBackBufferCount is valid. - */ -#define DDSD_BACKBUFFERCOUNT 0x00000020l - -/* - * dwZBufferBitDepth is valid. (shouldnt be used in DDSURFACEDESC2) - */ -#define DDSD_ZBUFFERBITDEPTH 0x00000040l - -/* - * dwAlphaBitDepth is valid. - */ -#define DDSD_ALPHABITDEPTH 0x00000080l - - -/* - * lpSurface is valid. - */ -#define DDSD_LPSURFACE 0x00000800l - -/* - * ddpfPixelFormat is valid. - */ -#define DDSD_PIXELFORMAT 0x00001000l - -/* - * ddckCKDestOverlay is valid. - */ -#define DDSD_CKDESTOVERLAY 0x00002000l - -/* - * ddckCKDestBlt is valid. - */ -#define DDSD_CKDESTBLT 0x00004000l - -/* - * ddckCKSrcOverlay is valid. - */ -#define DDSD_CKSRCOVERLAY 0x00008000l - -/* - * ddckCKSrcBlt is valid. - */ -#define DDSD_CKSRCBLT 0x00010000l - -/* - * dwMipMapCount is valid. - */ -#define DDSD_MIPMAPCOUNT 0x00020000l - - /* - * dwRefreshRate is valid - */ -#define DDSD_REFRESHRATE 0x00040000l - -/* - * dwLinearSize is valid - */ -#define DDSD_LINEARSIZE 0x00080000l - -/* - * dwTextureStage is valid - */ -#define DDSD_TEXTURESTAGE 0x00100000l -/* - * dwFVF is valid - */ -#define DDSD_FVF 0x00200000l -/* - * dwSrcVBHandle is valid - */ -#define DDSD_SRCVBHANDLE 0x00400000l - -/* - * dwDepth is valid - */ -#define DDSD_DEPTH 0x00800000l - -/* - * All input fields are valid. - */ -#define DDSD_ALL 0x00fff9eel - -/* - * DDOPTSURFACEDESC - */ -typedef struct _DDOPTSURFACEDESC -{ - DWORD dwSize; // size of the DDOPTSURFACEDESC structure - DWORD dwFlags; // determines what fields are valid - DDSCAPS2 ddSCaps; // Common caps like: Memory type - DDOSCAPS ddOSCaps; // Common caps like: Memory type - GUID guid; // Compression technique GUID - DWORD dwCompressionRatio; // Compression ratio -} DDOPTSURFACEDESC; - -/* - * guid field is valid. - */ -#define DDOSD_GUID 0x00000001l - -/* - * dwCompressionRatio field is valid. - */ -#define DDOSD_COMPRESSION_RATIO 0x00000002l - -/* - * ddSCaps field is valid. - */ -#define DDOSD_SCAPS 0x00000004l - -/* - * ddOSCaps field is valid. - */ -#define DDOSD_OSCAPS 0x00000008l - -/* - * All input fields are valid. - */ -#define DDOSD_ALL 0x0000000fl - -/* - * The surface's optimized pixelformat is compressed - */ -#define DDOSDCAPS_OPTCOMPRESSED 0x00000001l - -/* - * The surface's optimized pixelformat is reordered - */ -#define DDOSDCAPS_OPTREORDERED 0x00000002l - -/* - * The opt surface is a monolithic mipmap - */ -#define DDOSDCAPS_MONOLITHICMIPMAP 0x00000004l - -/* - * The valid Surf caps: - * #define DDSCAPS_SYSTEMMEMORY 0x00000800l - * #define DDSCAPS_VIDEOMEMORY 0x00004000l - * #define DDSCAPS_LOCALVIDMEM 0x10000000l - * #define DDSCAPS_NONLOCALVIDMEM 0x20000000l - */ -#define DDOSDCAPS_VALIDSCAPS 0x30004800l - -/* - * The valid OptSurf caps - */ -#define DDOSDCAPS_VALIDOSCAPS 0x00000007l - - -/* - * DDCOLORCONTROL - */ -typedef struct _DDCOLORCONTROL -{ - DWORD dwSize; - DWORD dwFlags; - LONG lBrightness; - LONG lContrast; - LONG lHue; - LONG lSaturation; - LONG lSharpness; - LONG lGamma; - LONG lColorEnable; - DWORD dwReserved1; -} DDCOLORCONTROL; - - -/* - * lBrightness field is valid. - */ -#define DDCOLOR_BRIGHTNESS 0x00000001l - -/* - * lContrast field is valid. - */ -#define DDCOLOR_CONTRAST 0x00000002l - -/* - * lHue field is valid. - */ -#define DDCOLOR_HUE 0x00000004l - -/* - * lSaturation field is valid. - */ -#define DDCOLOR_SATURATION 0x00000008l - -/* - * lSharpness field is valid. - */ -#define DDCOLOR_SHARPNESS 0x00000010l - -/* - * lGamma field is valid. - */ -#define DDCOLOR_GAMMA 0x00000020l - -/* - * lColorEnable field is valid. - */ -#define DDCOLOR_COLORENABLE 0x00000040l - - - -/*============================================================================ - * - * Direct Draw Capability Flags - * - * These flags are used to describe the capabilities of a given Surface. - * All flags are bit flags. - * - *==========================================================================*/ - -/**************************************************************************** - * - * DIRECTDRAWSURFACE CAPABILITY FLAGS - * - ****************************************************************************/ - -/* - * This bit is reserved. It should not be specified. - */ -#define DDSCAPS_RESERVED1 0x00000001l - -/* - * Indicates that this surface contains alpha-only information. - * (To determine if a surface is RGBA/YUVA, the pixel format must be - * interrogated.) - */ -#define DDSCAPS_ALPHA 0x00000002l - -/* - * Indicates that this surface is a backbuffer. It is generally - * set by CreateSurface when the DDSCAPS_FLIP capability bit is set. - * It indicates that this surface is THE back buffer of a surface - * flipping structure. DirectDraw supports N surfaces in a - * surface flipping structure. Only the surface that immediately - * precedeces the DDSCAPS_FRONTBUFFER has this capability bit set. - * The other surfaces are identified as back buffers by the presence - * of the DDSCAPS_FLIP capability, their attachment order, and the - * absence of the DDSCAPS_FRONTBUFFER and DDSCAPS_BACKBUFFER - * capabilities. The bit is sent to CreateSurface when a standalone - * back buffer is being created. This surface could be attached to - * a front buffer and/or back buffers to form a flipping surface - * structure after the CreateSurface call. See AddAttachments for - * a detailed description of the behaviors in this case. - */ -#define DDSCAPS_BACKBUFFER 0x00000004l - -/* - * Indicates a complex surface structure is being described. A - * complex surface structure results in the creation of more than - * one surface. The additional surfaces are attached to the root - * surface. The complex structure can only be destroyed by - * destroying the root. - */ -#define DDSCAPS_COMPLEX 0x00000008l - -/* - * Indicates that this surface is a part of a surface flipping structure. - * When it is passed to CreateSurface the DDSCAPS_FRONTBUFFER and - * DDSCAP_BACKBUFFER bits are not set. They are set by CreateSurface - * on the resulting creations. The dwBackBufferCount field in the - * DDSURFACEDESC structure must be set to at least 1 in order for - * the CreateSurface call to succeed. The DDSCAPS_COMPLEX capability - * must always be set with creating multiple surfaces through CreateSurface. - */ -#define DDSCAPS_FLIP 0x00000010l - -/* - * Indicates that this surface is THE front buffer of a surface flipping - * structure. It is generally set by CreateSurface when the DDSCAPS_FLIP - * capability bit is set. - * If this capability is sent to CreateSurface then a standalonw front buffer - * is created. This surface will not have the DDSCAPS_FLIP capability. - * It can be attached to other back buffers to form a flipping structure. - * See AddAttachments for a detailed description of the behaviors in this - * case. - */ -#define DDSCAPS_FRONTBUFFER 0x00000020l - -/* - * Indicates that this surface is any offscreen surface that is not an overlay, - * texture, zbuffer, front buffer, back buffer, or alpha surface. It is used - * to identify plain vanilla surfaces. - */ -#define DDSCAPS_OFFSCREENPLAIN 0x00000040l - -/* - * Indicates that this surface is an overlay. It may or may not be directly visible - * depending on whether or not it is currently being overlayed onto the primary - * surface. DDSCAPS_VISIBLE can be used to determine whether or not it is being - * overlayed at the moment. - */ -#define DDSCAPS_OVERLAY 0x00000080l - -/* - * Indicates that unique DirectDrawPalette objects can be created and - * attached to this surface. - */ -#define DDSCAPS_PALETTE 0x00000100l - -/* - * Indicates that this surface is the primary surface. The primary - * surface represents what the user is seeing at the moment. - */ -#define DDSCAPS_PRIMARYSURFACE 0x00000200l - - -/* - * This flag used to be DDSCAPS_PRIMARYSURFACELEFT, which is now - * obsolete. - */ -#define DDSCAPS_RESERVED3 0x00000400l -#define DDSCAPS_PRIMARYSURFACELEFT 0x00000000l - -/* - * Indicates that this surface memory was allocated in system memory - */ -#define DDSCAPS_SYSTEMMEMORY 0x00000800l - -/* - * Indicates that this surface can be used as a 3D texture. It does not - * indicate whether or not the surface is being used for that purpose. - */ -#define DDSCAPS_TEXTURE 0x00001000l - -/* - * Indicates that a surface may be a destination for 3D rendering. This - * bit must be set in order to query for a Direct3D Device Interface - * from this surface. - */ -#define DDSCAPS_3DDEVICE 0x00002000l - -/* - * Indicates that this surface exists in video memory. - */ -#define DDSCAPS_VIDEOMEMORY 0x00004000l - -/* - * Indicates that changes made to this surface are immediately visible. - * It is always set for the primary surface and is set for overlays while - * they are being overlayed and texture maps while they are being textured. - */ -#define DDSCAPS_VISIBLE 0x00008000l - -/* - * Indicates that only writes are permitted to the surface. Read accesses - * from the surface may or may not generate a protection fault, but the - * results of a read from this surface will not be meaningful. READ ONLY. - */ -#define DDSCAPS_WRITEONLY 0x00010000l - -/* - * Indicates that this surface is a z buffer. A z buffer does not contain - * displayable information. Instead it contains bit depth information that is - * used to determine which pixels are visible and which are obscured. - */ -#define DDSCAPS_ZBUFFER 0x00020000l - -/* - * Indicates surface will have a DC associated long term - */ -#define DDSCAPS_OWNDC 0x00040000l - -/* - * Indicates surface should be able to receive live video - */ -#define DDSCAPS_LIVEVIDEO 0x00080000l - -/* - * Indicates surface should be able to have a stream decompressed - * to it by the hardware. - */ -#define DDSCAPS_HWCODEC 0x00100000l - -/* - * Surface is a ModeX surface. - * - */ -#define DDSCAPS_MODEX 0x00200000l - -/* - * Indicates surface is one level of a mip-map. This surface will - * be attached to other DDSCAPS_MIPMAP surfaces to form the mip-map. - * This can be done explicitly, by creating a number of surfaces and - * attaching them with AddAttachedSurface or by implicitly by CreateSurface. - * If this bit is set then DDSCAPS_TEXTURE must also be set. - */ -#define DDSCAPS_MIPMAP 0x00400000l - -/* - * This bit is reserved. It should not be specified. - */ -#define DDSCAPS_RESERVED2 0x00800000l - - -/* - * Indicates that memory for the surface is not allocated until the surface - * is loaded (via the Direct3D texture Load() function). - */ -#define DDSCAPS_ALLOCONLOAD 0x04000000l - -/* - * Indicates that the surface will recieve data from a video port. - */ -#define DDSCAPS_VIDEOPORT 0x08000000l - -/* - * Indicates that a video memory surface is resident in true, local video - * memory rather than non-local video memory. If this flag is specified then - * so must DDSCAPS_VIDEOMEMORY. This flag is mutually exclusive with - * DDSCAPS_NONLOCALVIDMEM. - */ -#define DDSCAPS_LOCALVIDMEM 0x10000000l - -/* - * Indicates that a video memory surface is resident in non-local video - * memory rather than true, local video memory. If this flag is specified - * then so must DDSCAPS_VIDEOMEMORY. This flag is mutually exclusive with - * DDSCAPS_LOCALVIDMEM. - */ -#define DDSCAPS_NONLOCALVIDMEM 0x20000000l - -/* - * Indicates that this surface is a standard VGA mode surface, and not a - * ModeX surface. (This flag will never be set in combination with the - * DDSCAPS_MODEX flag). - */ -#define DDSCAPS_STANDARDVGAMODE 0x40000000l - -/* - * Indicates that this surface will be an optimized surface. This flag is - * currently only valid in conjunction with the DDSCAPS_TEXTURE flag. The surface - * will be created without any underlying video memory until loaded. - */ -#define DDSCAPS_OPTIMIZED 0x80000000l - - - -/* - * This bit is reserved - */ -#define DDSCAPS2_RESERVED4 0x00000002L -#define DDSCAPS2_HARDWAREDEINTERLACE 0x00000000L - -/* - * Indicates to the driver that this surface will be locked very frequently - * (for procedural textures, dynamic lightmaps, etc). Surfaces with this cap - * set must also have DDSCAPS_TEXTURE. This cap cannot be used with - * DDSCAPS2_HINTSTATIC and DDSCAPS2_OPAQUE. - */ -#define DDSCAPS2_HINTDYNAMIC 0x00000004L - -/* - * Indicates to the driver that this surface can be re-ordered/retiled on - * load. This operation will not change the size of the texture. It is - * relatively fast and symmetrical, since the application may lock these - * bits (although it will take a performance hit when doing so). Surfaces - * with this cap set must also have DDSCAPS_TEXTURE. This cap cannot be - * used with DDSCAPS2_HINTDYNAMIC and DDSCAPS2_OPAQUE. - */ -#define DDSCAPS2_HINTSTATIC 0x00000008L - -/* - * Indicates that the client would like this texture surface to be managed by the - * DirectDraw/Direct3D runtime. Surfaces with this cap set must also have - * DDSCAPS_TEXTURE set. - */ -#define DDSCAPS2_TEXTUREMANAGE 0x00000010L - -/* - * These bits are reserved for internal use */ -#define DDSCAPS2_RESERVED1 0x00000020L -#define DDSCAPS2_RESERVED2 0x00000040L - -/* - * Indicates to the driver that this surface will never be locked again. - * The driver is free to optimize this surface via retiling and actual compression. - * All calls to Lock() or Blts from this surface will fail. Surfaces with this - * cap set must also have DDSCAPS_TEXTURE. This cap cannot be used with - * DDSCAPS2_HINTDYNAMIC and DDSCAPS2_HINTSTATIC. - */ -#define DDSCAPS2_OPAQUE 0x00000080L - -/* - * Applications should set this bit at CreateSurface time to indicate that they - * intend to use antialiasing. Only valid if DDSCAPS_3DDEVICE is also set. - */ -#define DDSCAPS2_HINTANTIALIASING 0x00000100L - - -/* - * This flag is used at CreateSurface time to indicate that this set of - * surfaces is a cubic environment map - */ -#define DDSCAPS2_CUBEMAP 0x00000200L - -/* - * These flags preform two functions: - * - At CreateSurface time, they define which of the six cube faces are - * required by the application. - * - After creation, each face in the cubemap will have exactly one of these - * bits set. - */ -#define DDSCAPS2_CUBEMAP_POSITIVEX 0x00000400L -#define DDSCAPS2_CUBEMAP_NEGATIVEX 0x00000800L -#define DDSCAPS2_CUBEMAP_POSITIVEY 0x00001000L -#define DDSCAPS2_CUBEMAP_NEGATIVEY 0x00002000L -#define DDSCAPS2_CUBEMAP_POSITIVEZ 0x00004000L -#define DDSCAPS2_CUBEMAP_NEGATIVEZ 0x00008000L - -/* - * This macro may be used to specify all faces of a cube map at CreateSurface time - */ -#define DDSCAPS2_CUBEMAP_ALLFACES ( DDSCAPS2_CUBEMAP_POSITIVEX |\ - DDSCAPS2_CUBEMAP_NEGATIVEX |\ - DDSCAPS2_CUBEMAP_POSITIVEY |\ - DDSCAPS2_CUBEMAP_NEGATIVEY |\ - DDSCAPS2_CUBEMAP_POSITIVEZ |\ - DDSCAPS2_CUBEMAP_NEGATIVEZ ) - - -/* - * This flag is an additional flag which is present on mipmap sublevels from DX7 onwards - * It enables easier use of GetAttachedSurface rather than EnumAttachedSurfaces for surface - * constructs such as Cube Maps, wherein there are more than one mipmap surface attached - * to the root surface. - * This caps bit is ignored by CreateSurface - */ -#define DDSCAPS2_MIPMAPSUBLEVEL 0x00010000L - -/* This flag indicates that the texture should be managed by D3D only */ -#define DDSCAPS2_D3DTEXTUREMANAGE 0x00020000L - -/* This flag indicates that the managed surface can be safely lost */ -#define DDSCAPS2_DONOTPERSIST 0x00040000L - -/* indicates that this surface is part of a stereo flipping chain */ -#define DDSCAPS2_STEREOSURFACELEFT 0x00080000L - - -/* - * Indicates that the surface is a volume. - * Can be combined with DDSCAPS_MIPMAP to indicate a multi-level volume - */ -#define DDSCAPS2_VOLUME 0x00200000L - -/* - * Indicates that the surface may be locked multiple times by the application. - * This cap cannot be used with DDSCAPS2_OPAQUE. - */ -#define DDSCAPS2_NOTUSERLOCKABLE 0x00400000L - -/* - * Indicates that the vertex buffer data can be used to render points and - * point sprites. - */ -#define DDSCAPS2_POINTS 0x00800000L - -/* - * Indicates that the vertex buffer data can be used to render rt pactches. - */ -#define DDSCAPS2_RTPATCHES 0x01000000L - -/* - * Indicates that the vertex buffer data can be used to render n patches. - */ -#define DDSCAPS2_NPATCHES 0x02000000L - -/* - * This bit is reserved for internal use - */ -#define DDSCAPS2_RESERVED3 0x04000000L - - -/* - * Indicates that the contents of the backbuffer do not have to be preserved - * the contents of the backbuffer after they are presented. - */ -#define DDSCAPS2_DISCARDBACKBUFFER 0x10000000L - -/* - * Indicates that all surfaces in this creation chain should be given an alpha channel. - * This flag will be set on primary surface chains that may have no explicit pixel format - * (and thus take on the format of the current display mode). - * The driver should infer that all these surfaces have a format having an alpha channel. - * (e.g. assume D3DFMT_A8R8G8B8 if the display mode is x888.) - */ -#define DDSCAPS2_ENABLEALPHACHANNEL 0x20000000L - - -/* - * This is a mask that indicates the set of bits that may be set - * at createsurface time to indicate number of samples per pixel - * when multisampling - */ -#define DDSCAPS3_MULTISAMPLE_MASK 0x0000001FL - - - /**************************************************************************** - * - * DIRECTDRAW DRIVER CAPABILITY FLAGS - * - ****************************************************************************/ - -/* - * Display hardware has 3D acceleration. - */ -#define DDCAPS_3D 0x00000001l - -/* - * Indicates that DirectDraw will support only dest rectangles that are aligned - * on DIRECTDRAWCAPS.dwAlignBoundaryDest boundaries of the surface, respectively. - * READ ONLY. - */ -#define DDCAPS_ALIGNBOUNDARYDEST 0x00000002l - -/* - * Indicates that DirectDraw will support only source rectangles whose sizes in - * BYTEs are DIRECTDRAWCAPS.dwAlignSizeDest multiples, respectively. READ ONLY. - */ -#define DDCAPS_ALIGNSIZEDEST 0x00000004l -/* - * Indicates that DirectDraw will support only source rectangles that are aligned - * on DIRECTDRAWCAPS.dwAlignBoundarySrc boundaries of the surface, respectively. - * READ ONLY. - */ -#define DDCAPS_ALIGNBOUNDARYSRC 0x00000008l - -/* - * Indicates that DirectDraw will support only source rectangles whose sizes in - * BYTEs are DIRECTDRAWCAPS.dwAlignSizeSrc multiples, respectively. READ ONLY. - */ -#define DDCAPS_ALIGNSIZESRC 0x00000010l - -/* - * Indicates that DirectDraw will create video memory surfaces that have a stride - * alignment equal to DIRECTDRAWCAPS.dwAlignStride. READ ONLY. - */ -#define DDCAPS_ALIGNSTRIDE 0x00000020l - -/* - * Display hardware is capable of blt operations. - */ -#define DDCAPS_BLT 0x00000040l - -/* - * Display hardware is capable of asynchronous blt operations. - */ -#define DDCAPS_BLTQUEUE 0x00000080l - -/* - * Display hardware is capable of color space conversions during the blt operation. - */ -#define DDCAPS_BLTFOURCC 0x00000100l - -/* - * Display hardware is capable of stretching during blt operations. - */ -#define DDCAPS_BLTSTRETCH 0x00000200l - -/* - * Display hardware is shared with GDI. - */ -#define DDCAPS_GDI 0x00000400l - -/* - * Display hardware can overlay. - */ -#define DDCAPS_OVERLAY 0x00000800l - -/* - * Set if display hardware supports overlays but can not clip them. - */ -#define DDCAPS_OVERLAYCANTCLIP 0x00001000l - -/* - * Indicates that overlay hardware is capable of color space conversions during - * the overlay operation. - */ -#define DDCAPS_OVERLAYFOURCC 0x00002000l - -/* - * Indicates that stretching can be done by the overlay hardware. - */ -#define DDCAPS_OVERLAYSTRETCH 0x00004000l - -/* - * Indicates that unique DirectDrawPalettes can be created for DirectDrawSurfaces - * other than the primary surface. - */ -#define DDCAPS_PALETTE 0x00008000l - -/* - * Indicates that palette changes can be syncd with the veritcal refresh. - */ -#define DDCAPS_PALETTEVSYNC 0x00010000l - -/* - * Display hardware can return the current scan line. - */ -#define DDCAPS_READSCANLINE 0x00020000l - - -/* - * This flag used to bo DDCAPS_STEREOVIEW, which is now obsolete - */ -#define DDCAPS_RESERVED1 0x00040000l - -/* - * Display hardware is capable of generating a vertical blank interrupt. - */ -#define DDCAPS_VBI 0x00080000l - -/* - * Supports the use of z buffers with blt operations. - */ -#define DDCAPS_ZBLTS 0x00100000l - -/* - * Supports Z Ordering of overlays. - */ -#define DDCAPS_ZOVERLAYS 0x00200000l - -/* - * Supports color key - */ -#define DDCAPS_COLORKEY 0x00400000l - -/* - * Supports alpha surfaces - */ -#define DDCAPS_ALPHA 0x00800000l - -/* - * colorkey is hardware assisted(DDCAPS_COLORKEY will also be set) - */ -#define DDCAPS_COLORKEYHWASSIST 0x01000000l - -/* - * no hardware support at all - */ -#define DDCAPS_NOHARDWARE 0x02000000l - -/* - * Display hardware is capable of color fill with bltter - */ -#define DDCAPS_BLTCOLORFILL 0x04000000l - -/* - * Display hardware is bank switched, and potentially very slow at - * random access to VRAM. - */ -#define DDCAPS_BANKSWITCHED 0x08000000l - -/* - * Display hardware is capable of depth filling Z-buffers with bltter - */ -#define DDCAPS_BLTDEPTHFILL 0x10000000l - -/* - * Display hardware is capable of clipping while bltting. - */ -#define DDCAPS_CANCLIP 0x20000000l - -/* - * Display hardware is capable of clipping while stretch bltting. - */ -#define DDCAPS_CANCLIPSTRETCHED 0x40000000l - -/* - * Display hardware is capable of bltting to or from system memory - */ -#define DDCAPS_CANBLTSYSMEM 0x80000000l - - - /**************************************************************************** - * - * MORE DIRECTDRAW DRIVER CAPABILITY FLAGS (dwCaps2) - * - ****************************************************************************/ - -/* - * Display hardware is certified - */ -#define DDCAPS2_CERTIFIED 0x00000001l - -/* - * Driver cannot interleave 2D operations (lock and blt) to surfaces with - * Direct3D rendering operations between calls to BeginScene() and EndScene() - */ -#define DDCAPS2_NO2DDURING3DSCENE 0x00000002l - -/* - * Display hardware contains a video port - */ -#define DDCAPS2_VIDEOPORT 0x00000004l - -/* - * The overlay can be automatically flipped according to the video port - * VSYNCs, providing automatic doubled buffered display of video port - * data using an overlay - */ -#define DDCAPS2_AUTOFLIPOVERLAY 0x00000008l - -/* - * Overlay can display each field of interlaced data individually while - * it is interleaved in memory without causing jittery artifacts. - */ -#define DDCAPS2_CANBOBINTERLEAVED 0x00000010l - -/* - * Overlay can display each field of interlaced data individually while - * it is not interleaved in memory without causing jittery artifacts. - */ -#define DDCAPS2_CANBOBNONINTERLEAVED 0x00000020l - -/* - * The overlay surface contains color controls (brightness, sharpness, etc.) - */ -#define DDCAPS2_COLORCONTROLOVERLAY 0x00000040l - -/* - * The primary surface contains color controls (gamma, etc.) - */ -#define DDCAPS2_COLORCONTROLPRIMARY 0x00000080l - -/* - * RGBZ -> RGB supported for 16:16 RGB:Z - */ -#define DDCAPS2_CANDROPZ16BIT 0x00000100l - -/* - * Driver supports non-local video memory. - */ -#define DDCAPS2_NONLOCALVIDMEM 0x00000200l - -/* - * Dirver supports non-local video memory but has different capabilities for - * non-local video memory surfaces. If this bit is set then so must - * DDCAPS2_NONLOCALVIDMEM. - */ -#define DDCAPS2_NONLOCALVIDMEMCAPS 0x00000400l - -/* - * Driver neither requires nor prefers surfaces to be pagelocked when performing - * blts involving system memory surfaces - */ -#define DDCAPS2_NOPAGELOCKREQUIRED 0x00000800l - -/* - * Driver can create surfaces which are wider than the primary surface - */ -#define DDCAPS2_WIDESURFACES 0x00001000l - -/* - * Driver supports bob without using a video port by handling the - * DDFLIP_ODD and DDFLIP_EVEN flags specified in Flip. - */ -#define DDCAPS2_CANFLIPODDEVEN 0x00002000l - -/* - * Driver supports bob using hardware - */ -#define DDCAPS2_CANBOBHARDWARE 0x00004000l - -/* - * Driver supports bltting any FOURCC surface to another surface of the same FOURCC - */ -#define DDCAPS2_COPYFOURCC 0x00008000l - - -/* - * Driver supports loadable gamma ramps for the primary surface - */ -#define DDCAPS2_PRIMARYGAMMA 0x00020000l - -/* - * Driver can render in windowed mode. - */ -#define DDCAPS2_CANRENDERWINDOWED 0x00080000l - -/* - * A calibrator is available to adjust the gamma ramp according to the - * physical display properties so that the result will be identical on - * all calibrated systems. - */ -#define DDCAPS2_CANCALIBRATEGAMMA 0x00100000l - -/* - * Indicates that the driver will respond to DDFLIP_INTERVALn flags - */ -#define DDCAPS2_FLIPINTERVAL 0x00200000l - -/* - * Indicates that the driver will respond to DDFLIP_NOVSYNC - */ -#define DDCAPS2_FLIPNOVSYNC 0x00400000l - -/* - * Driver supports management of video memory, if this flag is ON, - * driver manages the texture if requested with DDSCAPS2_TEXTUREMANAGE on - * DirectX manages the texture if this flag is OFF and surface has DDSCAPS2_TEXTUREMANAGE on - */ -#define DDCAPS2_CANMANAGETEXTURE 0x00800000l - -/* - * The Direct3D texture manager uses this cap to decide whether to put managed - * surfaces in non-local video memory. If the cap is set, the texture manager will - * put managed surfaces in non-local vidmem. Drivers that cannot texture from - * local vidmem SHOULD NOT set this cap. - */ -#define DDCAPS2_TEXMANINNONLOCALVIDMEM 0x01000000l - -/* - * Indicates that the driver supports DX7 type of stereo in at least one mode (which may - * not necessarily be the current mode). Applications should use IDirectDraw7 (or higher) - * ::EnumDisplayModes and check the DDSURFACEDESC.ddsCaps.dwCaps2 field for the presence of - * DDSCAPS2_STEREOSURFACELEFT to check if a particular mode supports stereo. The application - * can also use IDirectDraw7(or higher)::GetDisplayMode to check the current mode. - */ -#define DDCAPS2_STEREO 0x02000000L - -/* - * This caps bit is intended for internal DirectDraw use. - * -It is only valid if DDCAPS2_NONLOCALVIDMEMCAPS is set. - * -If this bit is set, then DDCAPS_CANBLTSYSMEM MUST be set by the driver (and - * all the assoicated system memory blt caps must be correct). - * -It implies that the system->video blt caps in DDCAPS also apply to system to - * nonlocal blts. I.e. the dwSVBCaps, dwSVBCKeyCaps, dwSVBFXCaps and dwSVBRops - * members of DDCAPS (DDCORECAPS) are filled in correctly. - * -Any blt from system to nonlocal memory that matches these caps bits will - * be passed to the driver. - * - * NOTE: This is intended to enable the driver itself to do efficient reordering - * of textures. This is NOT meant to imply that hardware can write into AGP memory. - * This operation is not currently supported. - */ -#define DDCAPS2_SYSTONONLOCAL_AS_SYSTOLOCAL 0x04000000L - -/* - * was DDCAPS2_PUREHAL - */ -#define DDCAPS2_RESERVED1 0x08000000L - -/* - * Driver supports management of video memory, if this flag is ON, - * driver manages the resource if requested with DDSCAPS2_TEXTUREMANAGE on - * DirectX manages the resource if this flag is OFF and surface has DDSCAPS2_TEXTUREMANAGE on - */ -#define DDCAPS2_CANMANAGERESOURCE 0x10000000L - -/* - * Driver supports dynamic textures. This will allow the application to set - * D3DUSAGE_DYNAMIC (DDSCAPS2_HINTDYNAMIC for drivers) at texture create time. - * Video memory dynamic textures WILL be lockable by applications. It is - * expected that these locks will be very efficient (which implies that the - * driver should always maintain a linear copy, a pointer to which can be - * quickly handed out to the application). - */ -#define DDCAPS2_DYNAMICTEXTURES 0x20000000L - - -/**************************************************************************** - * - * DIRECTDRAW FX ALPHA CAPABILITY FLAGS - * - ****************************************************************************/ - -/* - * Supports alpha blending around the edge of a source color keyed surface. - * For Blt. - */ -#define DDFXALPHACAPS_BLTALPHAEDGEBLEND 0x00000001l - -/* - * Supports alpha information in the pixel format. The bit depth of alpha - * information in the pixel format can be 1,2,4, or 8. The alpha value becomes - * more opaque as the alpha value increases. (0 is transparent.) - * For Blt. - */ -#define DDFXALPHACAPS_BLTALPHAPIXELS 0x00000002l - -/* - * Supports alpha information in the pixel format. The bit depth of alpha - * information in the pixel format can be 1,2,4, or 8. The alpha value - * becomes more transparent as the alpha value increases. (0 is opaque.) - * This flag can only be set if DDCAPS_ALPHA is set. - * For Blt. - */ -#define DDFXALPHACAPS_BLTALPHAPIXELSNEG 0x00000004l - -/* - * Supports alpha only surfaces. The bit depth of an alpha only surface can be - * 1,2,4, or 8. The alpha value becomes more opaque as the alpha value increases. - * (0 is transparent.) - * For Blt. - */ -#define DDFXALPHACAPS_BLTALPHASURFACES 0x00000008l - -/* - * The depth of the alpha channel data can range can be 1,2,4, or 8. - * The NEG suffix indicates that this alpha channel becomes more transparent - * as the alpha value increases. (0 is opaque.) This flag can only be set if - * DDCAPS_ALPHA is set. - * For Blt. - */ -#define DDFXALPHACAPS_BLTALPHASURFACESNEG 0x00000010l - -/* - * Supports alpha blending around the edge of a source color keyed surface. - * For Overlays. - */ -#define DDFXALPHACAPS_OVERLAYALPHAEDGEBLEND 0x00000020l - -/* - * Supports alpha information in the pixel format. The bit depth of alpha - * information in the pixel format can be 1,2,4, or 8. The alpha value becomes - * more opaque as the alpha value increases. (0 is transparent.) - * For Overlays. - */ -#define DDFXALPHACAPS_OVERLAYALPHAPIXELS 0x00000040l - -/* - * Supports alpha information in the pixel format. The bit depth of alpha - * information in the pixel format can be 1,2,4, or 8. The alpha value - * becomes more transparent as the alpha value increases. (0 is opaque.) - * This flag can only be set if DDCAPS_ALPHA is set. - * For Overlays. - */ -#define DDFXALPHACAPS_OVERLAYALPHAPIXELSNEG 0x00000080l - -/* - * Supports alpha only surfaces. The bit depth of an alpha only surface can be - * 1,2,4, or 8. The alpha value becomes more opaque as the alpha value increases. - * (0 is transparent.) - * For Overlays. - */ -#define DDFXALPHACAPS_OVERLAYALPHASURFACES 0x00000100l - -/* - * The depth of the alpha channel data can range can be 1,2,4, or 8. - * The NEG suffix indicates that this alpha channel becomes more transparent - * as the alpha value increases. (0 is opaque.) This flag can only be set if - * DDCAPS_ALPHA is set. - * For Overlays. - */ -#define DDFXALPHACAPS_OVERLAYALPHASURFACESNEG 0x00000200l - -#if DIRECTDRAW_VERSION < 0x0600 -#endif //DIRECTDRAW_VERSION - - -/**************************************************************************** - * - * DIRECTDRAW FX CAPABILITY FLAGS - * - ****************************************************************************/ - -/* - * Uses arithmetic operations to stretch and shrink surfaces during blt - * rather than pixel doubling techniques. Along the Y axis. - */ -#define DDFXCAPS_BLTARITHSTRETCHY 0x00000020l - -/* - * Uses arithmetic operations to stretch during blt - * rather than pixel doubling techniques. Along the Y axis. Only - * works for x1, x2, etc. - */ -#define DDFXCAPS_BLTARITHSTRETCHYN 0x00000010l - -/* - * Supports mirroring left to right in blt. - */ -#define DDFXCAPS_BLTMIRRORLEFTRIGHT 0x00000040l - -/* - * Supports mirroring top to bottom in blt. - */ -#define DDFXCAPS_BLTMIRRORUPDOWN 0x00000080l - -/* - * Supports arbitrary rotation for blts. - */ -#define DDFXCAPS_BLTROTATION 0x00000100l - -/* - * Supports 90 degree rotations for blts. - */ -#define DDFXCAPS_BLTROTATION90 0x00000200l - -/* - * DirectDraw supports arbitrary shrinking of a surface along the - * x axis (horizontal direction) for blts. - */ -#define DDFXCAPS_BLTSHRINKX 0x00000400l - -/* - * DirectDraw supports integer shrinking (1x,2x,) of a surface - * along the x axis (horizontal direction) for blts. - */ -#define DDFXCAPS_BLTSHRINKXN 0x00000800l - -/* - * DirectDraw supports arbitrary shrinking of a surface along the - * y axis (horizontal direction) for blts. - */ -#define DDFXCAPS_BLTSHRINKY 0x00001000l - -/* - * DirectDraw supports integer shrinking (1x,2x,) of a surface - * along the y axis (vertical direction) for blts. - */ -#define DDFXCAPS_BLTSHRINKYN 0x00002000l - -/* - * DirectDraw supports arbitrary stretching of a surface along the - * x axis (horizontal direction) for blts. - */ -#define DDFXCAPS_BLTSTRETCHX 0x00004000l - -/* - * DirectDraw supports integer stretching (1x,2x,) of a surface - * along the x axis (horizontal direction) for blts. - */ -#define DDFXCAPS_BLTSTRETCHXN 0x00008000l - -/* - * DirectDraw supports arbitrary stretching of a surface along the - * y axis (horizontal direction) for blts. - */ -#define DDFXCAPS_BLTSTRETCHY 0x00010000l - -/* - * DirectDraw supports integer stretching (1x,2x,) of a surface - * along the y axis (vertical direction) for blts. - */ -#define DDFXCAPS_BLTSTRETCHYN 0x00020000l - -/* - * Uses arithmetic operations to stretch and shrink surfaces during - * overlay rather than pixel doubling techniques. Along the Y axis - * for overlays. - */ -#define DDFXCAPS_OVERLAYARITHSTRETCHY 0x00040000l - -/* - * Uses arithmetic operations to stretch surfaces during - * overlay rather than pixel doubling techniques. Along the Y axis - * for overlays. Only works for x1, x2, etc. - */ -#define DDFXCAPS_OVERLAYARITHSTRETCHYN 0x00000008l - -/* - * DirectDraw supports arbitrary shrinking of a surface along the - * x axis (horizontal direction) for overlays. - */ -#define DDFXCAPS_OVERLAYSHRINKX 0x00080000l - -/* - * DirectDraw supports integer shrinking (1x,2x,) of a surface - * along the x axis (horizontal direction) for overlays. - */ -#define DDFXCAPS_OVERLAYSHRINKXN 0x00100000l - -/* - * DirectDraw supports arbitrary shrinking of a surface along the - * y axis (horizontal direction) for overlays. - */ -#define DDFXCAPS_OVERLAYSHRINKY 0x00200000l - -/* - * DirectDraw supports integer shrinking (1x,2x,) of a surface - * along the y axis (vertical direction) for overlays. - */ -#define DDFXCAPS_OVERLAYSHRINKYN 0x00400000l - -/* - * DirectDraw supports arbitrary stretching of a surface along the - * x axis (horizontal direction) for overlays. - */ -#define DDFXCAPS_OVERLAYSTRETCHX 0x00800000l - -/* - * DirectDraw supports integer stretching (1x,2x,) of a surface - * along the x axis (horizontal direction) for overlays. - */ -#define DDFXCAPS_OVERLAYSTRETCHXN 0x01000000l - -/* - * DirectDraw supports arbitrary stretching of a surface along the - * y axis (horizontal direction) for overlays. - */ -#define DDFXCAPS_OVERLAYSTRETCHY 0x02000000l - -/* - * DirectDraw supports integer stretching (1x,2x,) of a surface - * along the y axis (vertical direction) for overlays. - */ -#define DDFXCAPS_OVERLAYSTRETCHYN 0x04000000l - -/* - * DirectDraw supports mirroring of overlays across the vertical axis - */ -#define DDFXCAPS_OVERLAYMIRRORLEFTRIGHT 0x08000000l - -/* - * DirectDraw supports mirroring of overlays across the horizontal axis - */ -#define DDFXCAPS_OVERLAYMIRRORUPDOWN 0x10000000l - -/* - * DirectDraw supports deinterlacing of overlay surfaces - */ -#define DDFXCAPS_OVERLAYDEINTERLACE 0x20000000l - -/* - * Driver can do alpha blending for blits. - */ -#define DDFXCAPS_BLTALPHA 0x00000001l - - -/* - * Driver can do surface-reconstruction filtering for warped blits. - */ -#define DDFXCAPS_BLTFILTER DDFXCAPS_BLTARITHSTRETCHY - -/* - * Driver can do alpha blending for overlays. - */ -#define DDFXCAPS_OVERLAYALPHA 0x00000004l - - -/* - * Driver can do surface-reconstruction filtering for warped overlays. - */ -#define DDFXCAPS_OVERLAYFILTER DDFXCAPS_OVERLAYARITHSTRETCHY - -/**************************************************************************** - * - * DIRECTDRAW STEREO VIEW CAPABILITIES - * - ****************************************************************************/ - -/* - * This flag used to be DDSVCAPS_ENIGMA, which is now obsolete - */ - -#define DDSVCAPS_RESERVED1 0x00000001l - -/* - * This flag used to be DDSVCAPS_FLICKER, which is now obsolete - */ -#define DDSVCAPS_RESERVED2 0x00000002l - -/* - * This flag used to be DDSVCAPS_REDBLUE, which is now obsolete - */ -#define DDSVCAPS_RESERVED3 0x00000004l - -/* - * This flag used to be DDSVCAPS_SPLIT, which is now obsolete - */ -#define DDSVCAPS_RESERVED4 0x00000008l - -/* - * The stereo view is accomplished with switching technology - */ - -#define DDSVCAPS_STEREOSEQUENTIAL 0x00000010L - - - -/**************************************************************************** - * - * DIRECTDRAWPALETTE CAPABILITIES - * - ****************************************************************************/ - -/* - * Index is 4 bits. There are sixteen color entries in the palette table. - */ -#define DDPCAPS_4BIT 0x00000001l - -/* - * Index is onto a 8 bit color index. This field is only valid with the - * DDPCAPS_1BIT, DDPCAPS_2BIT or DDPCAPS_4BIT capability and the target - * surface is in 8bpp. Each color entry is one byte long and is an index - * into destination surface's 8bpp palette. - */ -#define DDPCAPS_8BITENTRIES 0x00000002l - -/* - * Index is 8 bits. There are 256 color entries in the palette table. - */ -#define DDPCAPS_8BIT 0x00000004l - -/* - * Indicates that this DIRECTDRAWPALETTE should use the palette color array - * passed into the lpDDColorArray parameter to initialize the DIRECTDRAWPALETTE - * object. - * This flag is obsolete. DirectDraw always initializes the color array from - * the lpDDColorArray parameter. The definition remains for source-level - * compatibility. - */ -#define DDPCAPS_INITIALIZE 0x00000000l - -/* - * This palette is the one attached to the primary surface. Changing this - * table has immediate effect on the display unless DDPSETPAL_VSYNC is specified - * and supported. - */ -#define DDPCAPS_PRIMARYSURFACE 0x00000010l - -/* - * This palette is the one attached to the primary surface left. Changing - * this table has immediate effect on the display for the left eye unless - * DDPSETPAL_VSYNC is specified and supported. - */ -#define DDPCAPS_PRIMARYSURFACELEFT 0x00000020l - -/* - * This palette can have all 256 entries defined - */ -#define DDPCAPS_ALLOW256 0x00000040l - -/* - * This palette can have modifications to it synced with the monitors - * refresh rate. - */ -#define DDPCAPS_VSYNC 0x00000080l - -/* - * Index is 1 bit. There are two color entries in the palette table. - */ -#define DDPCAPS_1BIT 0x00000100l - -/* - * Index is 2 bit. There are four color entries in the palette table. - */ -#define DDPCAPS_2BIT 0x00000200l - -/* - * The peFlags member of PALETTEENTRY denotes an 8 bit alpha value - */ -#define DDPCAPS_ALPHA 0x00000400l - - -/**************************************************************************** - * - * DIRECTDRAWPALETTE SETENTRY CONSTANTS - * - ****************************************************************************/ - - -/**************************************************************************** - * - * DIRECTDRAWPALETTE GETENTRY CONSTANTS - * - ****************************************************************************/ - -/* 0 is the only legal value */ - -/**************************************************************************** - * - * DIRECTDRAWSURFACE SETPRIVATEDATA CONSTANTS - * - ****************************************************************************/ - -/* - * The passed pointer is an IUnknown ptr. The cbData argument to SetPrivateData - * must be set to sizeof(IUnknown*). DirectDraw will call AddRef through this - * pointer and Release when the private data is destroyed. This includes when - * the surface or palette is destroyed before such priovate data is destroyed. - */ -#define DDSPD_IUNKNOWNPOINTER 0x00000001L - -/* - * Private data is only valid for the current state of the object, - * as determined by the uniqueness value. - */ -#define DDSPD_VOLATILE 0x00000002L - - -/**************************************************************************** - * - * DIRECTDRAWSURFACE SETPALETTE CONSTANTS - * - ****************************************************************************/ - - -/**************************************************************************** - * - * DIRECTDRAW BITDEPTH CONSTANTS - * - * NOTE: These are only used to indicate supported bit depths. These - * are flags only, they are not to be used as an actual bit depth. The - * absolute numbers 1, 2, 4, 8, 16, 24 and 32 are used to indicate actual - * bit depths in a surface or for changing the display mode. - * - ****************************************************************************/ - -/* - * 1 bit per pixel. - */ -#define DDBD_1 0x00004000l - -/* - * 2 bits per pixel. - */ -#define DDBD_2 0x00002000l - -/* - * 4 bits per pixel. - */ -#define DDBD_4 0x00001000l - -/* - * 8 bits per pixel. - */ -#define DDBD_8 0x00000800l - -/* - * 16 bits per pixel. - */ -#define DDBD_16 0x00000400l - -/* - * 24 bits per pixel. - */ -#define DDBD_24 0X00000200l - -/* - * 32 bits per pixel. - */ -#define DDBD_32 0x00000100l - -/**************************************************************************** - * - * DIRECTDRAWSURFACE SET/GET COLOR KEY FLAGS - * - ****************************************************************************/ - -/* - * Set if the structure contains a color space. Not set if the structure - * contains a single color key. - */ -#define DDCKEY_COLORSPACE 0x00000001l - -/* - * Set if the structure specifies a color key or color space which is to be - * used as a destination color key for blt operations. - */ -#define DDCKEY_DESTBLT 0x00000002l - -/* - * Set if the structure specifies a color key or color space which is to be - * used as a destination color key for overlay operations. - */ -#define DDCKEY_DESTOVERLAY 0x00000004l - -/* - * Set if the structure specifies a color key or color space which is to be - * used as a source color key for blt operations. - */ -#define DDCKEY_SRCBLT 0x00000008l - -/* - * Set if the structure specifies a color key or color space which is to be - * used as a source color key for overlay operations. - */ -#define DDCKEY_SRCOVERLAY 0x00000010l - - -/**************************************************************************** - * - * DIRECTDRAW COLOR KEY CAPABILITY FLAGS - * - ****************************************************************************/ - -/* - * Supports transparent blting using a color key to identify the replaceable - * bits of the destination surface for RGB colors. - */ -#define DDCKEYCAPS_DESTBLT 0x00000001l - -/* - * Supports transparent blting using a color space to identify the replaceable - * bits of the destination surface for RGB colors. - */ -#define DDCKEYCAPS_DESTBLTCLRSPACE 0x00000002l - -/* - * Supports transparent blting using a color space to identify the replaceable - * bits of the destination surface for YUV colors. - */ -#define DDCKEYCAPS_DESTBLTCLRSPACEYUV 0x00000004l - -/* - * Supports transparent blting using a color key to identify the replaceable - * bits of the destination surface for YUV colors. - */ -#define DDCKEYCAPS_DESTBLTYUV 0x00000008l - -/* - * Supports overlaying using colorkeying of the replaceable bits of the surface - * being overlayed for RGB colors. - */ -#define DDCKEYCAPS_DESTOVERLAY 0x00000010l - -/* - * Supports a color space as the color key for the destination for RGB colors. - */ -#define DDCKEYCAPS_DESTOVERLAYCLRSPACE 0x00000020l - -/* - * Supports a color space as the color key for the destination for YUV colors. - */ -#define DDCKEYCAPS_DESTOVERLAYCLRSPACEYUV 0x00000040l - -/* - * Supports only one active destination color key value for visible overlay - * surfaces. - */ -#define DDCKEYCAPS_DESTOVERLAYONEACTIVE 0x00000080l - -/* - * Supports overlaying using colorkeying of the replaceable bits of the - * surface being overlayed for YUV colors. - */ -#define DDCKEYCAPS_DESTOVERLAYYUV 0x00000100l - -/* - * Supports transparent blting using the color key for the source with - * this surface for RGB colors. - */ -#define DDCKEYCAPS_SRCBLT 0x00000200l - -/* - * Supports transparent blting using a color space for the source with - * this surface for RGB colors. - */ -#define DDCKEYCAPS_SRCBLTCLRSPACE 0x00000400l - -/* - * Supports transparent blting using a color space for the source with - * this surface for YUV colors. - */ -#define DDCKEYCAPS_SRCBLTCLRSPACEYUV 0x00000800l - -/* - * Supports transparent blting using the color key for the source with - * this surface for YUV colors. - */ -#define DDCKEYCAPS_SRCBLTYUV 0x00001000l - -/* - * Supports overlays using the color key for the source with this - * overlay surface for RGB colors. - */ -#define DDCKEYCAPS_SRCOVERLAY 0x00002000l - -/* - * Supports overlays using a color space as the source color key for - * the overlay surface for RGB colors. - */ -#define DDCKEYCAPS_SRCOVERLAYCLRSPACE 0x00004000l - -/* - * Supports overlays using a color space as the source color key for - * the overlay surface for YUV colors. - */ -#define DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV 0x00008000l - -/* - * Supports only one active source color key value for visible - * overlay surfaces. - */ -#define DDCKEYCAPS_SRCOVERLAYONEACTIVE 0x00010000l - -/* - * Supports overlays using the color key for the source with this - * overlay surface for YUV colors. - */ -#define DDCKEYCAPS_SRCOVERLAYYUV 0x00020000l - -/* - * there are no bandwidth trade-offs for using colorkey with an overlay - */ -#define DDCKEYCAPS_NOCOSTOVERLAY 0x00040000l - - -/**************************************************************************** - * - * DIRECTDRAW PIXELFORMAT FLAGS - * - ****************************************************************************/ - -/* - * The surface has alpha channel information in the pixel format. - */ -#define DDPF_ALPHAPIXELS 0x00000001l - -/* - * The pixel format contains alpha only information - */ -#define DDPF_ALPHA 0x00000002l - -/* - * The FourCC code is valid. - */ -#define DDPF_FOURCC 0x00000004l - -/* - * The surface is 4-bit color indexed. - */ -#define DDPF_PALETTEINDEXED4 0x00000008l - -/* - * The surface is indexed into a palette which stores indices - * into the destination surface's 8-bit palette. - */ -#define DDPF_PALETTEINDEXEDTO8 0x00000010l - -/* - * The surface is 8-bit color indexed. - */ -#define DDPF_PALETTEINDEXED8 0x00000020l - -/* - * The RGB data in the pixel format structure is valid. - */ -#define DDPF_RGB 0x00000040l - -/* - * The surface will accept pixel data in the format specified - * and compress it during the write. - */ -#define DDPF_COMPRESSED 0x00000080l - -/* - * The surface will accept RGB data and translate it during - * the write to YUV data. The format of the data to be written - * will be contained in the pixel format structure. The DDPF_RGB - * flag will be set. - */ -#define DDPF_RGBTOYUV 0x00000100l - -/* - * pixel format is YUV - YUV data in pixel format struct is valid - */ -#define DDPF_YUV 0x00000200l - -/* - * pixel format is a z buffer only surface - */ -#define DDPF_ZBUFFER 0x00000400l - -/* - * The surface is 1-bit color indexed. - */ -#define DDPF_PALETTEINDEXED1 0x00000800l - -/* - * The surface is 2-bit color indexed. - */ -#define DDPF_PALETTEINDEXED2 0x00001000l - -/* - * The surface contains Z information in the pixels - */ -#define DDPF_ZPIXELS 0x00002000l - -/* - * The surface contains stencil information along with Z - */ -#define DDPF_STENCILBUFFER 0x00004000l - -/* - * Premultiplied alpha format -- the color components have been - * premultiplied by the alpha component. - */ -#define DDPF_ALPHAPREMULT 0x00008000l - - -/* - * Luminance data in the pixel format is valid. - * Use this flag for luminance-only or luminance+alpha surfaces, - * the bit depth is then ddpf.dwLuminanceBitCount. - */ -#define DDPF_LUMINANCE 0x00020000l - -/* - * Luminance data in the pixel format is valid. - * Use this flag when hanging luminance off bumpmap surfaces, - * the bit mask for the luminance portion of the pixel is then - * ddpf.dwBumpLuminanceBitMask - */ -#define DDPF_BUMPLUMINANCE 0x00040000l - -/* - * Bump map dUdV data in the pixel format is valid. - */ -#define DDPF_BUMPDUDV 0x00080000l - - -/*=========================================================================== - * - * - * DIRECTDRAW CALLBACK FLAGS - * - * - *==========================================================================*/ - -/**************************************************************************** - * - * DIRECTDRAW ENUMSURFACES FLAGS - * - ****************************************************************************/ - -/* - * Enumerate all of the surfaces that meet the search criterion. - */ -#define DDENUMSURFACES_ALL 0x00000001l - -/* - * A search hit is a surface that matches the surface description. - */ -#define DDENUMSURFACES_MATCH 0x00000002l - -/* - * A search hit is a surface that does not match the surface description. - */ -#define DDENUMSURFACES_NOMATCH 0x00000004l - -/* - * Enumerate the first surface that can be created which meets the search criterion. - */ -#define DDENUMSURFACES_CANBECREATED 0x00000008l - -/* - * Enumerate the surfaces that already exist that meet the search criterion. - */ -#define DDENUMSURFACES_DOESEXIST 0x00000010l - - -/**************************************************************************** - * - * DIRECTDRAW SETDISPLAYMODE FLAGS - * - ****************************************************************************/ - -/* - * The desired mode is a standard VGA mode - */ -#define DDSDM_STANDARDVGAMODE 0x00000001l - - -/**************************************************************************** - * - * DIRECTDRAW ENUMDISPLAYMODES FLAGS - * - ****************************************************************************/ - -/* - * Enumerate Modes with different refresh rates. EnumDisplayModes guarantees - * that a particular mode will be enumerated only once. This flag specifies whether - * the refresh rate is taken into account when determining if a mode is unique. - */ -#define DDEDM_REFRESHRATES 0x00000001l - -/* - * Enumerate VGA modes. Specify this flag if you wish to enumerate supported VGA - * modes such as mode 0x13 in addition to the usual ModeX modes (which are always - * enumerated if the application has previously called SetCooperativeLevel with the - * DDSCL_ALLOWMODEX flag set). - */ -#define DDEDM_STANDARDVGAMODES 0x00000002L - - -/**************************************************************************** - * - * DIRECTDRAW SETCOOPERATIVELEVEL FLAGS - * - ****************************************************************************/ - -/* - * Exclusive mode owner will be responsible for the entire primary surface. - * GDI can be ignored. used with DD - */ -#define DDSCL_FULLSCREEN 0x00000001l - -/* - * allow CTRL_ALT_DEL to work while in fullscreen exclusive mode - */ -#define DDSCL_ALLOWREBOOT 0x00000002l - -/* - * prevents DDRAW from modifying the application window. - * prevents DDRAW from minimize/restore the application window on activation. - */ -#define DDSCL_NOWINDOWCHANGES 0x00000004l - -/* - * app wants to work as a regular Windows application - */ -#define DDSCL_NORMAL 0x00000008l - -/* - * app wants exclusive access - */ -#define DDSCL_EXCLUSIVE 0x00000010l - - -/* - * app can deal with non-windows display modes - */ -#define DDSCL_ALLOWMODEX 0x00000040l - -/* - * this window will receive the focus messages - */ -#define DDSCL_SETFOCUSWINDOW 0x00000080l - -/* - * this window is associated with the DDRAW object and will - * cover the screen in fullscreen mode - */ -#define DDSCL_SETDEVICEWINDOW 0x00000100l - -/* - * app wants DDRAW to create a window to be associated with the - * DDRAW object - */ -#define DDSCL_CREATEDEVICEWINDOW 0x00000200l - -/* - * App explicitly asks DDRAW/D3D to be multithread safe. This makes D3D - * take the global crtisec more frequently. - */ -#define DDSCL_MULTITHREADED 0x00000400l - -/* - * App specifies that it would like to keep the FPU set up for optimal Direct3D - * performance (single precision and exceptions disabled) so Direct3D - * does not need to explicitly set the FPU each time. This is assumed by - * default in DirectX 7. See also DDSCL_FPUPRESERVE - */ -#define DDSCL_FPUSETUP 0x00000800l - -/* - * App specifies that it needs either double precision FPU or FPU exceptions - * enabled. This makes Direct3D explicitly set the FPU state eah time it is - * called. Setting the flag will reduce Direct3D performance. The flag is - * assumed by default in DirectX 6 and earlier. See also DDSCL_FPUSETUP - */ -#define DDSCL_FPUPRESERVE 0x00001000l - - -/**************************************************************************** - * - * DIRECTDRAW BLT FLAGS - * - ****************************************************************************/ - -/* - * Use the alpha information in the pixel format or the alpha channel surface - * attached to the destination surface as the alpha channel for this blt. - */ -#define DDBLT_ALPHADEST 0x00000001l - -/* - * Use the dwConstAlphaDest field in the DDBLTFX structure as the alpha channel - * for the destination surface for this blt. - */ -#define DDBLT_ALPHADESTCONSTOVERRIDE 0x00000002l - -/* - * The NEG suffix indicates that the destination surface becomes more - * transparent as the alpha value increases. (0 is opaque) - */ -#define DDBLT_ALPHADESTNEG 0x00000004l - -/* - * Use the lpDDSAlphaDest field in the DDBLTFX structure as the alpha - * channel for the destination for this blt. - */ -#define DDBLT_ALPHADESTSURFACEOVERRIDE 0x00000008l - -/* - * Use the dwAlphaEdgeBlend field in the DDBLTFX structure as the alpha channel - * for the edges of the image that border the color key colors. - */ -#define DDBLT_ALPHAEDGEBLEND 0x00000010l - -/* - * Use the alpha information in the pixel format or the alpha channel surface - * attached to the source surface as the alpha channel for this blt. - */ -#define DDBLT_ALPHASRC 0x00000020l - -/* - * Use the dwConstAlphaSrc field in the DDBLTFX structure as the alpha channel - * for the source for this blt. - */ -#define DDBLT_ALPHASRCCONSTOVERRIDE 0x00000040l - -/* - * The NEG suffix indicates that the source surface becomes more transparent - * as the alpha value increases. (0 is opaque) - */ -#define DDBLT_ALPHASRCNEG 0x00000080l - -/* - * Use the lpDDSAlphaSrc field in the DDBLTFX structure as the alpha channel - * for the source for this blt. - */ -#define DDBLT_ALPHASRCSURFACEOVERRIDE 0x00000100l - -/* - * Do this blt asynchronously through the FIFO in the order received. If - * there is no room in the hardware FIFO fail the call. - */ -#define DDBLT_ASYNC 0x00000200l - -/* - * Uses the dwFillColor field in the DDBLTFX structure as the RGB color - * to fill the destination rectangle on the destination surface with. - */ -#define DDBLT_COLORFILL 0x00000400l - -/* - * Uses the dwDDFX field in the DDBLTFX structure to specify the effects - * to use for the blt. - */ -#define DDBLT_DDFX 0x00000800l - -/* - * Uses the dwDDROPS field in the DDBLTFX structure to specify the ROPS - * that are not part of the Win32 API. - */ -#define DDBLT_DDROPS 0x00001000l - -/* - * Use the color key associated with the destination surface. - */ -#define DDBLT_KEYDEST 0x00002000l - -/* - * Use the dckDestColorkey field in the DDBLTFX structure as the color key - * for the destination surface. - */ -#define DDBLT_KEYDESTOVERRIDE 0x00004000l - -/* - * Use the color key associated with the source surface. - */ -#define DDBLT_KEYSRC 0x00008000l - -/* - * Use the dckSrcColorkey field in the DDBLTFX structure as the color key - * for the source surface. - */ -#define DDBLT_KEYSRCOVERRIDE 0x00010000l - -/* - * Use the dwROP field in the DDBLTFX structure for the raster operation - * for this blt. These ROPs are the same as the ones defined in the Win32 API. - */ -#define DDBLT_ROP 0x00020000l - -/* - * Use the dwRotationAngle field in the DDBLTFX structure as the angle - * (specified in 1/100th of a degree) to rotate the surface. - */ -#define DDBLT_ROTATIONANGLE 0x00040000l - -/* - * Z-buffered blt using the z-buffers attached to the source and destination - * surfaces and the dwZBufferOpCode field in the DDBLTFX structure as the - * z-buffer opcode. - */ -#define DDBLT_ZBUFFER 0x00080000l - -/* - * Z-buffered blt using the dwConstDest Zfield and the dwZBufferOpCode field - * in the DDBLTFX structure as the z-buffer and z-buffer opcode respectively - * for the destination. - */ -#define DDBLT_ZBUFFERDESTCONSTOVERRIDE 0x00100000l - -/* - * Z-buffered blt using the lpDDSDestZBuffer field and the dwZBufferOpCode - * field in the DDBLTFX structure as the z-buffer and z-buffer opcode - * respectively for the destination. - */ -#define DDBLT_ZBUFFERDESTOVERRIDE 0x00200000l - -/* - * Z-buffered blt using the dwConstSrcZ field and the dwZBufferOpCode field - * in the DDBLTFX structure as the z-buffer and z-buffer opcode respectively - * for the source. - */ -#define DDBLT_ZBUFFERSRCCONSTOVERRIDE 0x00400000l - -/* - * Z-buffered blt using the lpDDSSrcZBuffer field and the dwZBufferOpCode - * field in the DDBLTFX structure as the z-buffer and z-buffer opcode - * respectively for the source. - */ -#define DDBLT_ZBUFFERSRCOVERRIDE 0x00800000l - -/* - * wait until the device is ready to handle the blt - * this will cause blt to not return DDERR_WASSTILLDRAWING - */ -#define DDBLT_WAIT 0x01000000l - -/* - * Uses the dwFillDepth field in the DDBLTFX structure as the depth value - * to fill the destination rectangle on the destination Z-buffer surface - * with. - */ -#define DDBLT_DEPTHFILL 0x02000000l - - -/* - * wait until the device is ready to handle the blt - * this will cause blt to not return DDERR_WASSTILLDRAWING - */ -#define DDBLT_DONOTWAIT 0x08000000l - -/* - * These flags indicate a presentation blt (i.e. a blt - * that moves surface contents from an offscreen back buffer to the primary - * surface). The driver is not allowed to "queue" more than three such blts. - * The "end" of the presentation blt is indicated, since the - * blt may be clipped, in which case the runtime will call the driver with - * several blts. All blts (even if not clipped) are tagged with DDBLT_PRESENTATION - * and the last (even if not clipped) additionally with DDBLT_LAST_PRESENTATION. - * Thus the true rule is that the driver must not schedule a DDBLT_PRESENTATION - * blt if there are 3 or more DDBLT_PRESENTLAST blts in the hardware pipe. - * If there are such blts in the pipe, the driver should return DDERR_WASSTILLDRAWING - * until the oldest queued DDBLT_LAST_PRESENTATION blts has been retired (i.e. the - * pixels have been actually written to the primary surface). Once the oldest blt - * has been retired, the driver is free to schedule the current blt. - * The goal is to provide a mechanism whereby the device's hardware queue never - * gets more than 3 frames ahead of the frames being generated by the application. - * When excessive queueing occurs, applications become unusable because the application - * visibly lags user input, and such problems make windowed interactive applications impossible. - * Some drivers may not have sufficient knowledge of their hardware's FIFO to know - * when a certain blt has been retired. Such drivers should code cautiously, and - * simply not allow any frames to be queued at all. DDBLT_LAST_PRESENTATION should cause - * such drivers to return DDERR_WASSTILLDRAWING until the accelerator is completely - * finished- exactly as if the application had called Lock on the source surface - * before calling Blt. - * In other words, the driver is allowed and encouraged to - * generate as much latency as it can, but never more than 3 frames worth. - * Implementation detail: Drivers should count blts against the SOURCE surface, not - * against the primary surface. This enables multiple parallel windowed application - * to function more optimally. - * This flag is passed only to DX8 or higher drivers. - * - * APPLICATIONS DO NOT SET THESE FLAGS. THEY ARE SET BY THE DIRECTDRAW RUNTIME. - * - */ -#define DDBLT_PRESENTATION 0x10000000l -#define DDBLT_LAST_PRESENTATION 0x20000000l - - - -/**************************************************************************** - * - * BLTFAST FLAGS - * - ****************************************************************************/ - -#define DDBLTFAST_NOCOLORKEY 0x00000000 -#define DDBLTFAST_SRCCOLORKEY 0x00000001 -#define DDBLTFAST_DESTCOLORKEY 0x00000002 -#define DDBLTFAST_WAIT 0x00000010 -#define DDBLTFAST_DONOTWAIT 0x00000020 - -/**************************************************************************** - * - * FLIP FLAGS - * - ****************************************************************************/ - -#define DDFLIP_WAIT 0x00000001L - -/* - * Indicates that the target surface contains the even field of video data. - * This flag is only valid with an overlay surface. - */ -#define DDFLIP_EVEN 0x00000002L - -/* - * Indicates that the target surface contains the odd field of video data. - * This flag is only valid with an overlay surface. - */ -#define DDFLIP_ODD 0x00000004L - -/* - * Causes DirectDraw to perform the physical flip immediately and return - * to the application. Typically, what was the front buffer but is now the back - * buffer will still be visible (depending on timing) until the next vertical - * retrace. Subsequent operations involving the two flipped surfaces will - * not check to see if the physical flip has finished (i.e. will not return - * DDERR_WASSTILLDRAWING for that reason (but may for other reasons)). - * This allows an application to perform Flips at a higher frequency than the - * monitor refresh rate, but may introduce visible artifacts. - * Only effective if DDCAPS2_FLIPNOVSYNC is set. If that bit is not set, - * DDFLIP_NOVSYNC has no effect. - */ -#define DDFLIP_NOVSYNC 0x00000008L - - -/* - * Flip Interval Flags. These flags indicate how many vertical retraces to wait between - * each flip. The default is one. DirectDraw will return DDERR_WASSTILLDRAWING for each - * surface involved in the flip until the specified number of vertical retraces has - * ocurred. Only effective if DDCAPS2_FLIPINTERVAL is set. If that bit is not set, - * DDFLIP_INTERVALn has no effect. - */ - -/* - * DirectDraw will flip on every other vertical sync - */ -#define DDFLIP_INTERVAL2 0x02000000L - - -/* - * DirectDraw will flip on every third vertical sync - */ -#define DDFLIP_INTERVAL3 0x03000000L - - -/* - * DirectDraw will flip on every fourth vertical sync - */ -#define DDFLIP_INTERVAL4 0x04000000L - -/* - * DirectDraw will flip and display a main stereo surface - */ -#define DDFLIP_STEREO 0x00000010L - -/* - * On IDirectDrawSurface7 and higher interfaces, the default is DDFLIP_WAIT. If you wish - * to override the default and use time when the accelerator is busy (as denoted by - * the DDERR_WASSTILLDRAWING return code) then use DDFLIP_DONOTWAIT. - */ -#define DDFLIP_DONOTWAIT 0x00000020L - - -/**************************************************************************** - * - * DIRECTDRAW SURFACE OVERLAY FLAGS - * - ****************************************************************************/ - -/* - * Use the alpha information in the pixel format or the alpha channel surface - * attached to the destination surface as the alpha channel for the - * destination overlay. - */ -#define DDOVER_ALPHADEST 0x00000001l - -/* - * Use the dwConstAlphaDest field in the DDOVERLAYFX structure as the - * destination alpha channel for this overlay. - */ -#define DDOVER_ALPHADESTCONSTOVERRIDE 0x00000002l - -/* - * The NEG suffix indicates that the destination surface becomes more - * transparent as the alpha value increases. - */ -#define DDOVER_ALPHADESTNEG 0x00000004l - -/* - * Use the lpDDSAlphaDest field in the DDOVERLAYFX structure as the alpha - * channel destination for this overlay. - */ -#define DDOVER_ALPHADESTSURFACEOVERRIDE 0x00000008l - -/* - * Use the dwAlphaEdgeBlend field in the DDOVERLAYFX structure as the alpha - * channel for the edges of the image that border the color key colors. - */ -#define DDOVER_ALPHAEDGEBLEND 0x00000010l - -/* - * Use the alpha information in the pixel format or the alpha channel surface - * attached to the source surface as the source alpha channel for this overlay. - */ -#define DDOVER_ALPHASRC 0x00000020l - -/* - * Use the dwConstAlphaSrc field in the DDOVERLAYFX structure as the source - * alpha channel for this overlay. - */ -#define DDOVER_ALPHASRCCONSTOVERRIDE 0x00000040l - -/* - * The NEG suffix indicates that the source surface becomes more transparent - * as the alpha value increases. - */ -#define DDOVER_ALPHASRCNEG 0x00000080l - -/* - * Use the lpDDSAlphaSrc field in the DDOVERLAYFX structure as the alpha channel - * source for this overlay. - */ -#define DDOVER_ALPHASRCSURFACEOVERRIDE 0x00000100l - -/* - * Turn this overlay off. - */ -#define DDOVER_HIDE 0x00000200l - -/* - * Use the color key associated with the destination surface. - */ -#define DDOVER_KEYDEST 0x00000400l - -/* - * Use the dckDestColorkey field in the DDOVERLAYFX structure as the color key - * for the destination surface - */ -#define DDOVER_KEYDESTOVERRIDE 0x00000800l - -/* - * Use the color key associated with the source surface. - */ -#define DDOVER_KEYSRC 0x00001000l - -/* - * Use the dckSrcColorkey field in the DDOVERLAYFX structure as the color key - * for the source surface. - */ -#define DDOVER_KEYSRCOVERRIDE 0x00002000l - -/* - * Turn this overlay on. - */ -#define DDOVER_SHOW 0x00004000l - -/* - * Add a dirty rect to an emulated overlayed surface. - */ -#define DDOVER_ADDDIRTYRECT 0x00008000l - -/* - * Redraw all dirty rects on an emulated overlayed surface. - */ -#define DDOVER_REFRESHDIRTYRECTS 0x00010000l - -/* - * Redraw the entire surface on an emulated overlayed surface. - */ -#define DDOVER_REFRESHALL 0x00020000l - - -/* - * Use the overlay FX flags to define special overlay FX - */ -#define DDOVER_DDFX 0x00080000l - -/* - * Autoflip the overlay when ever the video port autoflips - */ -#define DDOVER_AUTOFLIP 0x00100000l - -/* - * Display each field of video port data individually without - * causing any jittery artifacts - */ -#define DDOVER_BOB 0x00200000l - -/* - * Indicates that bob/weave decisions should not be overridden by other - * interfaces. - */ -#define DDOVER_OVERRIDEBOBWEAVE 0x00400000l - -/* - * Indicates that the surface memory is composed of interleaved fields. - */ -#define DDOVER_INTERLEAVED 0x00800000l - -/* - * Indicates that bob will be performed using hardware rather than - * software or emulated. - */ -#define DDOVER_BOBHARDWARE 0x01000000l - -/* - * Indicates that overlay FX structure contains valid ARGB scaling factors. - */ -#define DDOVER_ARGBSCALEFACTORS 0x02000000l - -/* - * Indicates that ARGB scaling factors can be degraded to fit driver capabilities. - */ -#define DDOVER_DEGRADEARGBSCALING 0x04000000l - - -/**************************************************************************** - * - * DIRECTDRAWSURFACE LOCK FLAGS - * - ****************************************************************************/ - -/* - * The default. Set to indicate that Lock should return a valid memory pointer - * to the top of the specified rectangle. If no rectangle is specified then a - * pointer to the top of the surface is returned. - */ -#define DDLOCK_SURFACEMEMORYPTR 0x00000000L // default - -/* - * Set to indicate that Lock should wait until it can obtain a valid memory - * pointer before returning. If this bit is set, Lock will never return - * DDERR_WASSTILLDRAWING. - */ -#define DDLOCK_WAIT 0x00000001L - -/* - * Set if an event handle is being passed to Lock. Lock will trigger the event - * when it can return the surface memory pointer requested. - */ -#define DDLOCK_EVENT 0x00000002L - -/* - * Indicates that the surface being locked will only be read from. - */ -#define DDLOCK_READONLY 0x00000010L - -/* - * Indicates that the surface being locked will only be written to - */ -#define DDLOCK_WRITEONLY 0x00000020L - - -/* - * Indicates that a system wide lock should not be taken when this surface - * is locked. This has several advantages (cursor responsiveness, ability - * to call more Windows functions, easier debugging) when locking video - * memory surfaces. However, an application specifying this flag must - * comply with a number of conditions documented in the help file. - * Furthermore, this flag cannot be specified when locking the primary. - */ -#define DDLOCK_NOSYSLOCK 0x00000800L - -/* - * Used only with Direct3D Vertex Buffer Locks. Indicates that no vertices - * that were referred to in Draw*PrimtiveVB calls since the start of the - * frame (or the last lock without this flag) will be modified during the - * lock. This can be useful when one is only appending data to the vertex - * buffer - */ -#define DDLOCK_NOOVERWRITE 0x00001000L - -/* - * Indicates that no assumptions will be made about the contents of the - * surface or vertex buffer during this lock. - * This enables two things: - * - Direct3D or the driver may provide an alternative memory - * area as the vertex buffer. This is useful when one plans to clear the - * contents of the vertex buffer and fill in new data. - * - Drivers sometimes store surface data in a re-ordered format. - * When the application locks the surface, the driver is forced to un-re-order - * the surface data before allowing the application to see the surface contents. - * This flag is a hint to the driver that it can skip the un-re-ordering process - * since the application plans to overwrite every single pixel in the surface - * or locked rectangle (and so erase any un-re-ordered pixels anyway). - * Applications should always set this flag when they intend to overwrite the entire - * surface or locked rectangle. - */ -#define DDLOCK_DISCARDCONTENTS 0x00002000L - /* - * DDLOCK_OKTOSWAP is an older, less informative name for DDLOCK_DISCARDCONTENTS - */ -#define DDLOCK_OKTOSWAP 0x00002000L - -/* - * On IDirectDrawSurface7 and higher interfaces, the default is DDLOCK_WAIT. If you wish - * to override the default and use time when the accelerator is busy (as denoted by - * the DDERR_WASSTILLDRAWING return code) then use DDLOCK_DONOTWAIT. - */ -#define DDLOCK_DONOTWAIT 0x00004000L - -/* - * This indicates volume texture lock with front and back specified. - */ -#define DDLOCK_HASVOLUMETEXTUREBOXRECT 0x00008000L - -/* - * This indicates that the driver should not update dirty rect information for this lock. - */ -#define DDLOCK_NODIRTYUPDATE 0x00010000L - - -/**************************************************************************** - * - * DIRECTDRAWSURFACE PAGELOCK FLAGS - * - ****************************************************************************/ - -/* - * No flags defined at present - */ - - -/**************************************************************************** - * - * DIRECTDRAWSURFACE PAGEUNLOCK FLAGS - * - ****************************************************************************/ - -/* - * No flags defined at present - */ - - -/**************************************************************************** - * - * DIRECTDRAWSURFACE BLT FX FLAGS - * - ****************************************************************************/ - -/* - * If stretching, use arithmetic stretching along the Y axis for this blt. - */ -#define DDBLTFX_ARITHSTRETCHY 0x00000001l - -/* - * Do this blt mirroring the surface left to right. Spin the - * surface around its y-axis. - */ -#define DDBLTFX_MIRRORLEFTRIGHT 0x00000002l - -/* - * Do this blt mirroring the surface up and down. Spin the surface - * around its x-axis. - */ -#define DDBLTFX_MIRRORUPDOWN 0x00000004l - -/* - * Schedule this blt to avoid tearing. - */ -#define DDBLTFX_NOTEARING 0x00000008l - -/* - * Do this blt rotating the surface one hundred and eighty degrees. - */ -#define DDBLTFX_ROTATE180 0x00000010l - -/* - * Do this blt rotating the surface two hundred and seventy degrees. - */ -#define DDBLTFX_ROTATE270 0x00000020l - -/* - * Do this blt rotating the surface ninety degrees. - */ -#define DDBLTFX_ROTATE90 0x00000040l - -/* - * Do this z blt using dwZBufferLow and dwZBufferHigh as range values - * specified to limit the bits copied from the source surface. - */ -#define DDBLTFX_ZBUFFERRANGE 0x00000080l - -/* - * Do this z blt adding the dwZBufferBaseDest to each of the sources z values - * before comparing it with the desting z values. - */ -#define DDBLTFX_ZBUFFERBASEDEST 0x00000100l - -/**************************************************************************** - * - * DIRECTDRAWSURFACE OVERLAY FX FLAGS - * - ****************************************************************************/ - -/* - * If stretching, use arithmetic stretching along the Y axis for this overlay. - */ -#define DDOVERFX_ARITHSTRETCHY 0x00000001l - -/* - * Mirror the overlay across the vertical axis - */ -#define DDOVERFX_MIRRORLEFTRIGHT 0x00000002l - -/* - * Mirror the overlay across the horizontal axis - */ -#define DDOVERFX_MIRRORUPDOWN 0x00000004l - -/* - * Deinterlace the overlay, if possible - */ -#define DDOVERFX_DEINTERLACE 0x00000008l - - -/**************************************************************************** - * - * DIRECTDRAW WAITFORVERTICALBLANK FLAGS - * - ****************************************************************************/ - -/* - * return when the vertical blank interval begins - */ -#define DDWAITVB_BLOCKBEGIN 0x00000001l - -/* - * set up an event to trigger when the vertical blank begins - */ -#define DDWAITVB_BLOCKBEGINEVENT 0x00000002l - -/* - * return when the vertical blank interval ends and display begins - */ -#define DDWAITVB_BLOCKEND 0x00000004l - -/**************************************************************************** - * - * DIRECTDRAW GETFLIPSTATUS FLAGS - * - ****************************************************************************/ - -/* - * is it OK to flip now? - */ -#define DDGFS_CANFLIP 0x00000001l - -/* - * is the last flip finished? - */ -#define DDGFS_ISFLIPDONE 0x00000002l - -/**************************************************************************** - * - * DIRECTDRAW GETBLTSTATUS FLAGS - * - ****************************************************************************/ - -/* - * is it OK to blt now? - */ -#define DDGBS_CANBLT 0x00000001l - -/* - * is the blt to the surface finished? - */ -#define DDGBS_ISBLTDONE 0x00000002l - - -/**************************************************************************** - * - * DIRECTDRAW ENUMOVERLAYZORDER FLAGS - * - ****************************************************************************/ - -/* - * Enumerate overlays back to front. - */ -#define DDENUMOVERLAYZ_BACKTOFRONT 0x00000000l - -/* - * Enumerate overlays front to back - */ -#define DDENUMOVERLAYZ_FRONTTOBACK 0x00000001l - -/**************************************************************************** - * - * DIRECTDRAW UPDATEOVERLAYZORDER FLAGS - * - ****************************************************************************/ - -/* - * Send overlay to front - */ -#define DDOVERZ_SENDTOFRONT 0x00000000l - -/* - * Send overlay to back - */ -#define DDOVERZ_SENDTOBACK 0x00000001l - -/* - * Move Overlay forward - */ -#define DDOVERZ_MOVEFORWARD 0x00000002l - -/* - * Move Overlay backward - */ -#define DDOVERZ_MOVEBACKWARD 0x00000003l - -/* - * Move Overlay in front of relative surface - */ -#define DDOVERZ_INSERTINFRONTOF 0x00000004l - -/* - * Move Overlay in back of relative surface - */ -#define DDOVERZ_INSERTINBACKOF 0x00000005l - - -/**************************************************************************** - * - * DIRECTDRAW SETGAMMARAMP FLAGS - * - ****************************************************************************/ - -/* - * Request calibrator to adjust the gamma ramp according to the physical - * properties of the display so that the result should appear identical - * on all systems. - */ -#define DDSGR_CALIBRATE 0x00000001L - - -/**************************************************************************** - * - * DIRECTDRAW STARTMODETEST FLAGS - * - ****************************************************************************/ - -/* - * Indicates that the mode being tested has passed - */ -#define DDSMT_ISTESTREQUIRED 0x00000001L - - -/**************************************************************************** - * - * DIRECTDRAW EVALUATEMODE FLAGS - * - ****************************************************************************/ - -/* - * Indicates that the mode being tested has passed - */ -#define DDEM_MODEPASSED 0x00000001L - -/* - * Indicates that the mode being tested has failed - */ -#define DDEM_MODEFAILED 0x00000002L - - -/*=========================================================================== - * - * - * DIRECTDRAW RETURN CODES - * - * The return values from DirectDraw Commands and Surface that return an HRESULT - * are codes from DirectDraw concerning the results of the action - * requested by DirectDraw. - * - *==========================================================================*/ - -/* - * Status is OK - * - * Issued by: DirectDraw Commands and all callbacks - */ -#define DD_OK S_OK -#define DD_FALSE S_FALSE - -/**************************************************************************** - * - * DIRECTDRAW ENUMCALLBACK RETURN VALUES - * - * EnumCallback returns are used to control the flow of the DIRECTDRAW and - * DIRECTDRAWSURFACE object enumerations. They can only be returned by - * enumeration callback routines. - * - ****************************************************************************/ - -/* - * stop the enumeration - */ -#define DDENUMRET_CANCEL 0 - -/* - * continue the enumeration - */ -#define DDENUMRET_OK 1 - -/**************************************************************************** - * - * DIRECTDRAW ERRORS - * - * Errors are represented by negative values and cannot be combined. - * - ****************************************************************************/ - -/* - * This object is already initialized - */ -#define DDERR_ALREADYINITIALIZED MAKE_DDHRESULT( 5 ) - -/* - * This surface can not be attached to the requested surface. - */ -#define DDERR_CANNOTATTACHSURFACE MAKE_DDHRESULT( 10 ) - -/* - * This surface can not be detached from the requested surface. - */ -#define DDERR_CANNOTDETACHSURFACE MAKE_DDHRESULT( 20 ) - -/* - * Support is currently not available. - */ -#define DDERR_CURRENTLYNOTAVAIL MAKE_DDHRESULT( 40 ) - -/* - * An exception was encountered while performing the requested operation - */ -#define DDERR_EXCEPTION MAKE_DDHRESULT( 55 ) - -/* - * Generic failure. - */ -#define DDERR_GENERIC E_FAIL - -/* - * Height of rectangle provided is not a multiple of reqd alignment - */ -#define DDERR_HEIGHTALIGN MAKE_DDHRESULT( 90 ) - -/* - * Unable to match primary surface creation request with existing - * primary surface. - */ -#define DDERR_INCOMPATIBLEPRIMARY MAKE_DDHRESULT( 95 ) - -/* - * One or more of the caps bits passed to the callback are incorrect. - */ -#define DDERR_INVALIDCAPS MAKE_DDHRESULT( 100 ) - -/* - * DirectDraw does not support provided Cliplist. - */ -#define DDERR_INVALIDCLIPLIST MAKE_DDHRESULT( 110 ) - -/* - * DirectDraw does not support the requested mode - */ -#define DDERR_INVALIDMODE MAKE_DDHRESULT( 120 ) - -/* - * DirectDraw received a pointer that was an invalid DIRECTDRAW object. - */ -#define DDERR_INVALIDOBJECT MAKE_DDHRESULT( 130 ) - -/* - * One or more of the parameters passed to the callback function are - * incorrect. - */ -#define DDERR_INVALIDPARAMS E_INVALIDARG - -/* - * pixel format was invalid as specified - */ -#define DDERR_INVALIDPIXELFORMAT MAKE_DDHRESULT( 145 ) - -/* - * Rectangle provided was invalid. - */ -#define DDERR_INVALIDRECT MAKE_DDHRESULT( 150 ) - -/* - * Operation could not be carried out because one or more surfaces are locked - */ -#define DDERR_LOCKEDSURFACES MAKE_DDHRESULT( 160 ) - -/* - * There is no 3D present. - */ -#define DDERR_NO3D MAKE_DDHRESULT( 170 ) - -/* - * Operation could not be carried out because there is no alpha accleration - * hardware present or available. - */ -#define DDERR_NOALPHAHW MAKE_DDHRESULT( 180 ) - -/* - * Operation could not be carried out because there is no stereo - * hardware present or available. - */ -#define DDERR_NOSTEREOHARDWARE MAKE_DDHRESULT( 181 ) - -/* - * Operation could not be carried out because there is no hardware - * present which supports stereo surfaces - */ -#define DDERR_NOSURFACELEFT MAKE_DDHRESULT( 182 ) - - - -/* - * no clip list available - */ -#define DDERR_NOCLIPLIST MAKE_DDHRESULT( 205 ) - -/* - * Operation could not be carried out because there is no color conversion - * hardware present or available. - */ -#define DDERR_NOCOLORCONVHW MAKE_DDHRESULT( 210 ) - -/* - * Create function called without DirectDraw object method SetCooperativeLevel - * being called. - */ -#define DDERR_NOCOOPERATIVELEVELSET MAKE_DDHRESULT( 212 ) - -/* - * Surface doesn't currently have a color key - */ -#define DDERR_NOCOLORKEY MAKE_DDHRESULT( 215 ) - -/* - * Operation could not be carried out because there is no hardware support - * of the dest color key. - */ -#define DDERR_NOCOLORKEYHW MAKE_DDHRESULT( 220 ) - -/* - * No DirectDraw support possible with current display driver - */ -#define DDERR_NODIRECTDRAWSUPPORT MAKE_DDHRESULT( 222 ) - -/* - * Operation requires the application to have exclusive mode but the - * application does not have exclusive mode. - */ -#define DDERR_NOEXCLUSIVEMODE MAKE_DDHRESULT( 225 ) - -/* - * Flipping visible surfaces is not supported. - */ -#define DDERR_NOFLIPHW MAKE_DDHRESULT( 230 ) - -/* - * There is no GDI present. - */ -#define DDERR_NOGDI MAKE_DDHRESULT( 240 ) - -/* - * Operation could not be carried out because there is no hardware present - * or available. - */ -#define DDERR_NOMIRRORHW MAKE_DDHRESULT( 250 ) - -/* - * Requested item was not found - */ -#define DDERR_NOTFOUND MAKE_DDHRESULT( 255 ) - -/* - * Operation could not be carried out because there is no overlay hardware - * present or available. - */ -#define DDERR_NOOVERLAYHW MAKE_DDHRESULT( 260 ) - -/* - * Operation could not be carried out because the source and destination - * rectangles are on the same surface and overlap each other. - */ -#define DDERR_OVERLAPPINGRECTS MAKE_DDHRESULT( 270 ) - -/* - * Operation could not be carried out because there is no appropriate raster - * op hardware present or available. - */ -#define DDERR_NORASTEROPHW MAKE_DDHRESULT( 280 ) - -/* - * Operation could not be carried out because there is no rotation hardware - * present or available. - */ -#define DDERR_NOROTATIONHW MAKE_DDHRESULT( 290 ) - -/* - * Operation could not be carried out because there is no hardware support - * for stretching - */ -#define DDERR_NOSTRETCHHW MAKE_DDHRESULT( 310 ) - -/* - * DirectDrawSurface is not in 4 bit color palette and the requested operation - * requires 4 bit color palette. - */ -#define DDERR_NOT4BITCOLOR MAKE_DDHRESULT( 316 ) - -/* - * DirectDrawSurface is not in 4 bit color index palette and the requested - * operation requires 4 bit color index palette. - */ -#define DDERR_NOT4BITCOLORINDEX MAKE_DDHRESULT( 317 ) - -/* - * DirectDraw Surface is not in 8 bit color mode and the requested operation - * requires 8 bit color. - */ -#define DDERR_NOT8BITCOLOR MAKE_DDHRESULT( 320 ) - -/* - * Operation could not be carried out because there is no texture mapping - * hardware present or available. - */ -#define DDERR_NOTEXTUREHW MAKE_DDHRESULT( 330 ) - -/* - * Operation could not be carried out because there is no hardware support - * for vertical blank synchronized operations. - */ -#define DDERR_NOVSYNCHW MAKE_DDHRESULT( 335 ) - -/* - * Operation could not be carried out because there is no hardware support - * for zbuffer blting. - */ -#define DDERR_NOZBUFFERHW MAKE_DDHRESULT( 340 ) - -/* - * Overlay surfaces could not be z layered based on their BltOrder because - * the hardware does not support z layering of overlays. - */ -#define DDERR_NOZOVERLAYHW MAKE_DDHRESULT( 350 ) - -/* - * The hardware needed for the requested operation has already been - * allocated. - */ -#define DDERR_OUTOFCAPS MAKE_DDHRESULT( 360 ) - -/* - * DirectDraw does not have enough memory to perform the operation. - */ -#define DDERR_OUTOFMEMORY E_OUTOFMEMORY - -/* - * DirectDraw does not have enough memory to perform the operation. - */ -#define DDERR_OUTOFVIDEOMEMORY MAKE_DDHRESULT( 380 ) - -/* - * hardware does not support clipped overlays - */ -#define DDERR_OVERLAYCANTCLIP MAKE_DDHRESULT( 382 ) - -/* - * Can only have ony color key active at one time for overlays - */ -#define DDERR_OVERLAYCOLORKEYONLYONEACTIVE MAKE_DDHRESULT( 384 ) - -/* - * Access to this palette is being refused because the palette is already - * locked by another thread. - */ -#define DDERR_PALETTEBUSY MAKE_DDHRESULT( 387 ) - -/* - * No src color key specified for this operation. - */ -#define DDERR_COLORKEYNOTSET MAKE_DDHRESULT( 400 ) - -/* - * This surface is already attached to the surface it is being attached to. - */ -#define DDERR_SURFACEALREADYATTACHED MAKE_DDHRESULT( 410 ) - -/* - * This surface is already a dependency of the surface it is being made a - * dependency of. - */ -#define DDERR_SURFACEALREADYDEPENDENT MAKE_DDHRESULT( 420 ) - -/* - * Access to this surface is being refused because the surface is already - * locked by another thread. - */ -#define DDERR_SURFACEBUSY MAKE_DDHRESULT( 430 ) - -/* - * Access to this surface is being refused because no driver exists - * which can supply a pointer to the surface. - * This is most likely to happen when attempting to lock the primary - * surface when no DCI provider is present. - * Will also happen on attempts to lock an optimized surface. - */ -#define DDERR_CANTLOCKSURFACE MAKE_DDHRESULT( 435 ) - -/* - * Access to Surface refused because Surface is obscured. - */ -#define DDERR_SURFACEISOBSCURED MAKE_DDHRESULT( 440 ) - -/* - * Access to this surface is being refused because the surface is gone. - * The DIRECTDRAWSURFACE object representing this surface should - * have Restore called on it. - */ -#define DDERR_SURFACELOST MAKE_DDHRESULT( 450 ) - -/* - * The requested surface is not attached. - */ -#define DDERR_SURFACENOTATTACHED MAKE_DDHRESULT( 460 ) - -/* - * Height requested by DirectDraw is too large. - */ -#define DDERR_TOOBIGHEIGHT MAKE_DDHRESULT( 470 ) - -/* - * Size requested by DirectDraw is too large -- The individual height and - * width are OK. - */ -#define DDERR_TOOBIGSIZE MAKE_DDHRESULT( 480 ) - -/* - * Width requested by DirectDraw is too large. - */ -#define DDERR_TOOBIGWIDTH MAKE_DDHRESULT( 490 ) - -/* - * Action not supported. - */ -#define DDERR_UNSUPPORTED E_NOTIMPL - -/* - * Pixel format requested is unsupported by DirectDraw - */ -#define DDERR_UNSUPPORTEDFORMAT MAKE_DDHRESULT( 510 ) - -/* - * Bitmask in the pixel format requested is unsupported by DirectDraw - */ -#define DDERR_UNSUPPORTEDMASK MAKE_DDHRESULT( 520 ) - -/* - * The specified stream contains invalid data - */ -#define DDERR_INVALIDSTREAM MAKE_DDHRESULT( 521 ) - -/* - * vertical blank is in progress - */ -#define DDERR_VERTICALBLANKINPROGRESS MAKE_DDHRESULT( 537 ) - -/* - * Informs DirectDraw that the previous Blt which is transfering information - * to or from this Surface is incomplete. - */ -#define DDERR_WASSTILLDRAWING MAKE_DDHRESULT( 540 ) - - -/* - * The specified surface type requires specification of the COMPLEX flag - */ -#define DDERR_DDSCAPSCOMPLEXREQUIRED MAKE_DDHRESULT( 542 ) - - -/* - * Rectangle provided was not horizontally aligned on reqd. boundary - */ -#define DDERR_XALIGN MAKE_DDHRESULT( 560 ) - -/* - * The GUID passed to DirectDrawCreate is not a valid DirectDraw driver - * identifier. - */ -#define DDERR_INVALIDDIRECTDRAWGUID MAKE_DDHRESULT( 561 ) - -/* - * A DirectDraw object representing this driver has already been created - * for this process. - */ -#define DDERR_DIRECTDRAWALREADYCREATED MAKE_DDHRESULT( 562 ) - -/* - * A hardware only DirectDraw object creation was attempted but the driver - * did not support any hardware. - */ -#define DDERR_NODIRECTDRAWHW MAKE_DDHRESULT( 563 ) - -/* - * this process already has created a primary surface - */ -#define DDERR_PRIMARYSURFACEALREADYEXISTS MAKE_DDHRESULT( 564 ) - -/* - * software emulation not available. - */ -#define DDERR_NOEMULATION MAKE_DDHRESULT( 565 ) - -/* - * region passed to Clipper::GetClipList is too small. - */ -#define DDERR_REGIONTOOSMALL MAKE_DDHRESULT( 566 ) - -/* - * an attempt was made to set a clip list for a clipper objec that - * is already monitoring an hwnd. - */ -#define DDERR_CLIPPERISUSINGHWND MAKE_DDHRESULT( 567 ) - -/* - * No clipper object attached to surface object - */ -#define DDERR_NOCLIPPERATTACHED MAKE_DDHRESULT( 568 ) - -/* - * Clipper notification requires an HWND or - * no HWND has previously been set as the CooperativeLevel HWND. - */ -#define DDERR_NOHWND MAKE_DDHRESULT( 569 ) - -/* - * HWND used by DirectDraw CooperativeLevel has been subclassed, - * this prevents DirectDraw from restoring state. - */ -#define DDERR_HWNDSUBCLASSED MAKE_DDHRESULT( 570 ) - -/* - * The CooperativeLevel HWND has already been set. - * It can not be reset while the process has surfaces or palettes created. - */ -#define DDERR_HWNDALREADYSET MAKE_DDHRESULT( 571 ) - -/* - * No palette object attached to this surface. - */ -#define DDERR_NOPALETTEATTACHED MAKE_DDHRESULT( 572 ) - -/* - * No hardware support for 16 or 256 color palettes. - */ -#define DDERR_NOPALETTEHW MAKE_DDHRESULT( 573 ) - -/* - * If a clipper object is attached to the source surface passed into a - * BltFast call. - */ -#define DDERR_BLTFASTCANTCLIP MAKE_DDHRESULT( 574 ) - -/* - * No blter. - */ -#define DDERR_NOBLTHW MAKE_DDHRESULT( 575 ) - -/* - * No DirectDraw ROP hardware. - */ -#define DDERR_NODDROPSHW MAKE_DDHRESULT( 576 ) - -/* - * returned when GetOverlayPosition is called on a hidden overlay - */ -#define DDERR_OVERLAYNOTVISIBLE MAKE_DDHRESULT( 577 ) - -/* - * returned when GetOverlayPosition is called on a overlay that UpdateOverlay - * has never been called on to establish a destionation. - */ -#define DDERR_NOOVERLAYDEST MAKE_DDHRESULT( 578 ) - -/* - * returned when the position of the overlay on the destionation is no longer - * legal for that destionation. - */ -#define DDERR_INVALIDPOSITION MAKE_DDHRESULT( 579 ) - -/* - * returned when an overlay member is called for a non-overlay surface - */ -#define DDERR_NOTAOVERLAYSURFACE MAKE_DDHRESULT( 580 ) - -/* - * An attempt was made to set the cooperative level when it was already - * set to exclusive. - */ -#define DDERR_EXCLUSIVEMODEALREADYSET MAKE_DDHRESULT( 581 ) - -/* - * An attempt has been made to flip a surface that is not flippable. - */ -#define DDERR_NOTFLIPPABLE MAKE_DDHRESULT( 582 ) - -/* - * Can't duplicate primary & 3D surfaces, or surfaces that are implicitly - * created. - */ -#define DDERR_CANTDUPLICATE MAKE_DDHRESULT( 583 ) - -/* - * Surface was not locked. An attempt to unlock a surface that was not - * locked at all, or by this process, has been attempted. - */ -#define DDERR_NOTLOCKED MAKE_DDHRESULT( 584 ) - -/* - * Windows can not create any more DCs, or a DC was requested for a paltte-indexed - * surface when the surface had no palette AND the display mode was not palette-indexed - * (in this case DirectDraw cannot select a proper palette into the DC) - */ -#define DDERR_CANTCREATEDC MAKE_DDHRESULT( 585 ) - -/* - * No DC was ever created for this surface. - */ -#define DDERR_NODC MAKE_DDHRESULT( 586 ) - -/* - * This surface can not be restored because it was created in a different - * mode. - */ -#define DDERR_WRONGMODE MAKE_DDHRESULT( 587 ) - -/* - * This surface can not be restored because it is an implicitly created - * surface. - */ -#define DDERR_IMPLICITLYCREATED MAKE_DDHRESULT( 588 ) - -/* - * The surface being used is not a palette-based surface - */ -#define DDERR_NOTPALETTIZED MAKE_DDHRESULT( 589 ) - - -/* - * The display is currently in an unsupported mode - */ -#define DDERR_UNSUPPORTEDMODE MAKE_DDHRESULT( 590 ) - -/* - * Operation could not be carried out because there is no mip-map - * texture mapping hardware present or available. - */ -#define DDERR_NOMIPMAPHW MAKE_DDHRESULT( 591 ) - -/* - * The requested action could not be performed because the surface was of - * the wrong type. - */ -#define DDERR_INVALIDSURFACETYPE MAKE_DDHRESULT( 592 ) - - -/* - * Device does not support optimized surfaces, therefore no video memory optimized surfaces - */ -#define DDERR_NOOPTIMIZEHW MAKE_DDHRESULT( 600 ) - -/* - * Surface is an optimized surface, but has not yet been allocated any memory - */ -#define DDERR_NOTLOADED MAKE_DDHRESULT( 601 ) - -/* - * Attempt was made to create or set a device window without first setting - * the focus window - */ -#define DDERR_NOFOCUSWINDOW MAKE_DDHRESULT( 602 ) - -/* - * Attempt was made to set a palette on a mipmap sublevel - */ -#define DDERR_NOTONMIPMAPSUBLEVEL MAKE_DDHRESULT( 603 ) - -/* - * A DC has already been returned for this surface. Only one DC can be - * retrieved per surface. - */ -#define DDERR_DCALREADYCREATED MAKE_DDHRESULT( 620 ) - -/* - * An attempt was made to allocate non-local video memory from a device - * that does not support non-local video memory. - */ -#define DDERR_NONONLOCALVIDMEM MAKE_DDHRESULT( 630 ) - -/* - * The attempt to page lock a surface failed. - */ -#define DDERR_CANTPAGELOCK MAKE_DDHRESULT( 640 ) - - -/* - * The attempt to page unlock a surface failed. - */ -#define DDERR_CANTPAGEUNLOCK MAKE_DDHRESULT( 660 ) - -/* - * An attempt was made to page unlock a surface with no outstanding page locks. - */ -#define DDERR_NOTPAGELOCKED MAKE_DDHRESULT( 680 ) - -/* - * There is more data available than the specified buffer size could hold - */ -#define DDERR_MOREDATA MAKE_DDHRESULT( 690 ) - -/* - * The data has expired and is therefore no longer valid. - */ -#define DDERR_EXPIRED MAKE_DDHRESULT( 691 ) - -/* - * The mode test has finished executing. - */ -#define DDERR_TESTFINISHED MAKE_DDHRESULT( 692 ) - -/* - * The mode test has switched to a new mode. - */ -#define DDERR_NEWMODE MAKE_DDHRESULT( 693 ) - -/* - * D3D has not yet been initialized. - */ -#define DDERR_D3DNOTINITIALIZED MAKE_DDHRESULT( 694 ) - -/* - * The video port is not active - */ -#define DDERR_VIDEONOTACTIVE MAKE_DDHRESULT( 695 ) - -/* - * The monitor does not have EDID data. - */ -#define DDERR_NOMONITORINFORMATION MAKE_DDHRESULT( 696 ) - -/* - * The driver does not enumerate display mode refresh rates. - */ -#define DDERR_NODRIVERSUPPORT MAKE_DDHRESULT( 697 ) - -/* - * Surfaces created by one direct draw device cannot be used directly by - * another direct draw device. - */ -#define DDERR_DEVICEDOESNTOWNSURFACE MAKE_DDHRESULT( 699 ) - - - -/* - * An attempt was made to invoke an interface member of a DirectDraw object - * created by CoCreateInstance() before it was initialized. - */ -#define DDERR_NOTINITIALIZED CO_E_NOTINITIALIZED - - -/* Alpha bit depth constants */ - - -#ifdef __cplusplus -}; -#endif - -#ifdef ENABLE_NAMELESS_UNION_PRAGMA -#pragma warning(default:4201) -#endif - -#endif //__DDRAW_INCLUDED__ - - diff --git a/import/DirectX8/include/ddrawex.h b/import/DirectX8/include/ddrawex.h deleted file mode 100644 index e2b180ba2..000000000 --- a/import/DirectX8/include/ddrawex.h +++ /dev/null @@ -1,218 +0,0 @@ -//********************************************************************* -//* Microsoft Windows ** -//* Copyright(c) Microsoft Corp., 1995-1997 ** -//********************************************************************* -// -// DDRAWEX.H -// -// Header file for DirectDrawEx functionality - -#ifndef __DDRAWEXH__ -#define __DDRAWEXH__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -// {4FD2A832-86C8-11d0-8FCA-00C04FD9189D} -DEFINE_GUID(CLSID_DirectDrawFactory, -0x4fd2a832, 0x86c8, 0x11d0, 0x8f, 0xca, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0x9d); - -DEFINE_GUID(IID_IDirectDrawFactory, -0x4fd2a833, 0x86c8, 0x11d0, 0x8f, 0xca, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0x9d); - -#ifndef DIRECTDRAW_VERSION - -//Functionality supported by DDrawex but not DX3 -#define DDSD_LPSURFACE 0x00000800l - -DEFINE_GUID( IID_IDirectDrawSurface3, -0xDA044E00,0x69B2,0x11D0,0xA1,0xD5,0x00,0xAA,0x00,0xB8,0xDF,0xBB ); - -typedef struct IDirectDrawSurface3 FAR *LPDIRECTDRAWSURFACE3; - -#undef INTERFACE -#define INTERFACE IDirectDrawSurface3 -DECLARE_INTERFACE_( IDirectDrawSurface3, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDrawSurface methods ***/ - STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE3) PURE; - STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT) PURE; - STDMETHOD(Blt)(THIS_ LPRECT,LPDIRECTDRAWSURFACE3, LPRECT,DWORD, LPDDBLTFX) PURE; - STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH, DWORD, DWORD ) PURE; - STDMETHOD(BltFast)(THIS_ DWORD,DWORD,LPDIRECTDRAWSURFACE3, LPRECT,DWORD) PURE; - STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD,LPDIRECTDRAWSURFACE3) PURE; - STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID,LPDDENUMSURFACESCALLBACK) PURE; - STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD,LPVOID,LPDDENUMSURFACESCALLBACK) PURE; - STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE3, DWORD) PURE; - STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS, LPDIRECTDRAWSURFACE3 FAR *) PURE; - STDMETHOD(GetBltStatus)(THIS_ DWORD) PURE; - STDMETHOD(GetCaps)(THIS_ LPDDSCAPS) PURE; - STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER FAR*) PURE; - STDMETHOD(GetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; - STDMETHOD(GetDC)(THIS_ HDC FAR *) PURE; - STDMETHOD(GetFlipStatus)(THIS_ DWORD) PURE; - STDMETHOD(GetOverlayPosition)(THIS_ LPLONG, LPLONG ) PURE; - STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE FAR*) PURE; - STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT) PURE; - STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC) PURE; - STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC) PURE; - STDMETHOD(IsLost)(THIS) PURE; - STDMETHOD(Lock)(THIS_ LPRECT,LPDDSURFACEDESC,DWORD,HANDLE) PURE; - STDMETHOD(ReleaseDC)(THIS_ HDC) PURE; - STDMETHOD(Restore)(THIS) PURE; - STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER) PURE; - STDMETHOD(SetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; - STDMETHOD(SetOverlayPosition)(THIS_ LONG, LONG ) PURE; - STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE) PURE; - STDMETHOD(Unlock)(THIS_ LPVOID) PURE; - STDMETHOD(UpdateOverlay)(THIS_ LPRECT, LPDIRECTDRAWSURFACE3,LPRECT,DWORD, LPDDOVERLAYFX) PURE; - STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD) PURE; - STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD, LPDIRECTDRAWSURFACE3) PURE; - /*** Added in the v2 interface ***/ - STDMETHOD(GetDDInterface)(THIS_ LPVOID FAR *) PURE; - STDMETHOD(PageLock)(THIS_ DWORD) PURE; - STDMETHOD(PageUnlock)(THIS_ DWORD) PURE; - /*** Added in the v3 interface ***/ - STDMETHOD(SetSurfaceDesc)(THIS_ LPDDSURFACEDESC, DWORD ) PURE; -}; -#endif - - - - -#define DDSCAPS_DATAEXCHANGE (DDSCAPS_SYSTEMMEMORY|DDSCAPS_VIDEOMEMORY) - -#undef INTERFACE -#define INTERFACE IDirectDrawFactory - -DECLARE_INTERFACE_(IDirectDrawFactory, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDrawFactory methods ***/ - STDMETHOD(CreateDirectDraw) (THIS_ GUID * pGUID, HWND hWnd, DWORD dwCoopLevelFlags, DWORD dwReserved, IUnknown *pUnkOuter, IDirectDraw **ppDirectDraw) PURE; - STDMETHOD(DirectDrawEnumerate) (THIS_ LPDDENUMCALLBACK lpCallback, LPVOID lpContext) PURE; -}; - - - -// {618F8AD4-8B7A-11d0-8FCC-00C04FD9189D} -DEFINE_GUID(IID_IDirectDraw3, -0x618f8ad4, 0x8b7a, 0x11d0, 0x8f, 0xcc, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0x9d); - -typedef struct IDirectDraw3 FAR *LPDIRECTDRAW3; - -#undef INTERFACE -#define INTERFACE IDirectDraw3 - -DECLARE_INTERFACE_(IDirectDraw3, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDraw methods ***/ - STDMETHOD(Compact)(THIS) PURE; - STDMETHOD(CreateClipper)(THIS_ DWORD, LPDIRECTDRAWCLIPPER FAR*, IUnknown FAR * ) PURE; - STDMETHOD(CreatePalette)(THIS_ DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE FAR*, IUnknown FAR * ) PURE; - STDMETHOD(CreateSurface)(THIS_ LPDDSURFACEDESC, LPDIRECTDRAWSURFACE FAR *, IUnknown FAR *) PURE; - STDMETHOD(DuplicateSurface)( THIS_ LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE FAR * ) PURE; - STDMETHOD(EnumDisplayModes)( THIS_ DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK ) PURE; - STDMETHOD(EnumSurfaces)(THIS_ DWORD, LPDDSURFACEDESC, LPVOID,LPDDENUMSURFACESCALLBACK ) PURE; - STDMETHOD(FlipToGDISurface)(THIS) PURE; - STDMETHOD(GetCaps)( THIS_ LPDDCAPS, LPDDCAPS) PURE; - STDMETHOD(GetDisplayMode)( THIS_ LPDDSURFACEDESC) PURE; - STDMETHOD(GetFourCCCodes)(THIS_ LPDWORD, LPDWORD ) PURE; - STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE FAR *) PURE; - STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD) PURE; - STDMETHOD(GetScanLine)(THIS_ LPDWORD) PURE; - STDMETHOD(GetVerticalBlankStatus)(THIS_ LPBOOL ) PURE; - STDMETHOD(Initialize)(THIS_ GUID FAR *) PURE; - STDMETHOD(RestoreDisplayMode)(THIS) PURE; - STDMETHOD(SetCooperativeLevel)(THIS_ HWND, DWORD) PURE; - STDMETHOD(SetDisplayMode)(THIS_ DWORD, DWORD,DWORD, DWORD, DWORD) PURE; - STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD, HANDLE ) PURE; - /*** Added in the v2 interface ***/ - STDMETHOD(GetAvailableVidMem)(THIS_ LPDDSCAPS, LPDWORD, LPDWORD) PURE; - /*** IDirectDraw3 methods ***/ - STDMETHOD(GetSurfaceFromDC) (THIS_ HDC, IDirectDrawSurface **) PURE; -}; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectDraw3_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) -#define IDirectDraw3_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectDraw3_Release(p) (p)->lpVtbl->Release(p) -#define IDirectDraw3_Compact(p) (p)->lpVtbl->Compact(p) -#define IDirectDraw3_CreateClipper(p, a, b, c) (p)->lpVtbl->CreateClipper(p, a, b, c) -#define IDirectDraw3_CreatePalette(p, a, b, c, d) (p)->lpVtbl->CreatePalette(p, a, b, c, d) -#define IDirectDraw3_CreateSurface(p, a, b, c) (p)->lpVtbl->CreateSurface(p, a, b, c) -#define IDirectDraw3_DuplicateSurface(p, a, b) (p)->lpVtbl->DuplicateSurface(p, a, b) -#define IDirectDraw3_EnumDisplayModes(p, a, b, c, d) (p)->lpVtbl->EnumDisplayModes(p, a, b, c, d) -#define IDirectDraw3_EnumSurfaces(p, a, b, c, d) (p)->lpVtbl->EnumSurfaces(p, a, b, c, d) -#define IDirectDraw3_FlipToGDISurface(p) (p)->lpVtbl->FlipToGDISurface(p) -#define IDirectDraw3_GetCaps(p, a, b) (p)->lpVtbl->GetCaps(p, a, b) -#define IDirectDraw3_GetDisplayMode(p, a) (p)->lpVtbl->GetDisplayMode(p, a) -#define IDirectDraw3_GetFourCCCodes(p, a, b) (p)->lpVtbl->GetFourCCCodes(p, a, b) -#define IDirectDraw3_GetGDISurface(p, a) (p)->lpVtbl->GetGDISurface(p, a) -#define IDirectDraw3_GetMonitorFrequency(p, a) (p)->lpVtbl->GetMonitorFrequency(p, a) -#define IDirectDraw3_GetScanLine(p, a) (p)->lpVtbl->GetScanLine(p, a) -#define IDirectDraw3_GetVerticalBlankStatus(p, a) (p)->lpVtbl->GetVerticalBlankStatus(p, a) -#define IDirectDraw3_Initialize(p, a) (p)->lpVtbl->Initialize(p, a) -#define IDirectDraw3_RestoreDisplayMode(p) (p)->lpVtbl->RestoreDisplayMode(p) -#define IDirectDraw3_SetCooperativeLevel(p, a, b) (p)->lpVtbl->SetCooperativeLevel(p, a, b) -#define IDirectDraw3_SetDisplayMode(p, a, b, c, d, e) (p)->lpVtbl->SetDisplayMode(p, a, b, c, d, e) -#define IDirectDraw3_WaitForVerticalBlank(p, a, b) (p)->lpVtbl->WaitForVerticalBlank(p, a, b) -#define IDirectDraw3_GetAvailableVidMem(p, a, b, c) (p)->lpVtbl->GetAvailableVidMem(p, a, b, c) -#define IDirectDraw3_GetSurfaceFromDC(p, a, b) (p)->lpVtbl->GetSurfaceFromDC(p, a, b) -#endif - - - -/*=========================================================================== - * - * - * DIRECTDRAWEX RETURN CODES - * - * The return values from DirectDrawEx Commands and Surface that return an - * HRESULT are codes from DirectDrawEx concerning the results of the action - * requested by DirectDrawEx. - * - *==========================================================================*/ - -/* - * An attempt was made to load ddraw.dll - */ -#define DDERR_LOADFAILED MAKE_DDHRESULT( 901 ) - -/* - * Unable to determine module/os version number - */ -#define DDERR_BADVERSIONINFO MAKE_DDHRESULT( 902 ) - -/* - * Unable to determine address of ddraw.dll exported symbol (DirectDrawCreate or - * DirectDrawEnumerate). - */ -#define DDERR_BADPROCADDRESS MAKE_DDHRESULT( 903 ) - -/* - * Legacy usage: do not use QI() to create D3D device objects from surface objects. - * Use IDirect3D2::CreateDevice() - */ -#define DDERR_LEGACYUSAGE MAKE_DDHRESULT( 904 ) - -#ifdef __cplusplus -} -#endif - - -#endif // __DDRAWEXH__ diff --git a/import/DirectX8/include/ddstream.h b/import/DirectX8/include/ddstream.h deleted file mode 100644 index e17a7313b..000000000 --- a/import/DirectX8/include/ddstream.h +++ /dev/null @@ -1,533 +0,0 @@ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 6.00.0347 */ -/* Compiler settings for ddstream.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __ddstream_h__ -#define __ddstream_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __IDirectDrawMediaStream_FWD_DEFINED__ -#define __IDirectDrawMediaStream_FWD_DEFINED__ -typedef interface IDirectDrawMediaStream IDirectDrawMediaStream; -#endif /* __IDirectDrawMediaStream_FWD_DEFINED__ */ - - -#ifndef __IDirectDrawStreamSample_FWD_DEFINED__ -#define __IDirectDrawStreamSample_FWD_DEFINED__ -typedef interface IDirectDrawStreamSample IDirectDrawStreamSample; -#endif /* __IDirectDrawStreamSample_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "unknwn.h" -#include "mmstream.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void * ); - -/* interface __MIDL_itf_ddstream_0000 */ -/* [local] */ - -// -// The following declarations within the 'if 0' block are dummy typedefs used to make -// the ddstream.idl file build. The actual definitions are contained in DDRAW.H -// -#if 0 -typedef void *LPDDSURFACEDESC; - -typedef struct tDDSURFACEDESC DDSURFACEDESC; - -#endif -#include - -enum __MIDL___MIDL_itf_ddstream_0000_0001 - { DDSFF_PROGRESSIVERENDER = 0x1 - } ; - - - - - - - -extern RPC_IF_HANDLE __MIDL_itf_ddstream_0000_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_ddstream_0000_v0_0_s_ifspec; - -#ifndef __IDirectDrawMediaStream_INTERFACE_DEFINED__ -#define __IDirectDrawMediaStream_INTERFACE_DEFINED__ - -/* interface IDirectDrawMediaStream */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IDirectDrawMediaStream; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("F4104FCE-9A70-11d0-8FDE-00C04FD9189D") - IDirectDrawMediaStream : public IMediaStream - { - public: - virtual HRESULT STDMETHODCALLTYPE GetFormat( - /* [out] */ DDSURFACEDESC *pDDSDCurrent, - /* [out] */ IDirectDrawPalette **ppDirectDrawPalette, - /* [out] */ DDSURFACEDESC *pDDSDDesired, - /* [out] */ DWORD *pdwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFormat( - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ IDirectDrawPalette *pDirectDrawPalette) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDirectDraw( - /* [out] */ IDirectDraw **ppDirectDraw) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDirectDraw( - /* [in] */ IDirectDraw *pDirectDraw) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateSample( - /* [in] */ IDirectDrawSurface *pSurface, - /* [in] */ const RECT *pRect, - /* [in] */ DWORD dwFlags, - /* [out] */ IDirectDrawStreamSample **ppSample) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimePerFrame( - /* [out] */ STREAM_TIME *pFrameTime) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDirectDrawMediaStreamVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDirectDrawMediaStream * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDirectDrawMediaStream * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDirectDrawMediaStream * This); - - HRESULT ( STDMETHODCALLTYPE *GetMultiMediaStream )( - IDirectDrawMediaStream * This, - /* [out] */ IMultiMediaStream **ppMultiMediaStream); - - HRESULT ( STDMETHODCALLTYPE *GetInformation )( - IDirectDrawMediaStream * This, - /* [out] */ MSPID *pPurposeId, - /* [out] */ STREAM_TYPE *pType); - - HRESULT ( STDMETHODCALLTYPE *SetSameFormat )( - IDirectDrawMediaStream * This, - /* [in] */ IMediaStream *pStreamThatHasDesiredFormat, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *AllocateSample )( - IDirectDrawMediaStream * This, - /* [in] */ DWORD dwFlags, - /* [out] */ IStreamSample **ppSample); - - HRESULT ( STDMETHODCALLTYPE *CreateSharedSample )( - IDirectDrawMediaStream * This, - /* [in] */ IStreamSample *pExistingSample, - /* [in] */ DWORD dwFlags, - /* [out] */ IStreamSample **ppNewSample); - - HRESULT ( STDMETHODCALLTYPE *SendEndOfStream )( - IDirectDrawMediaStream * This, - DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *GetFormat )( - IDirectDrawMediaStream * This, - /* [out] */ DDSURFACEDESC *pDDSDCurrent, - /* [out] */ IDirectDrawPalette **ppDirectDrawPalette, - /* [out] */ DDSURFACEDESC *pDDSDDesired, - /* [out] */ DWORD *pdwFlags); - - HRESULT ( STDMETHODCALLTYPE *SetFormat )( - IDirectDrawMediaStream * This, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ IDirectDrawPalette *pDirectDrawPalette); - - HRESULT ( STDMETHODCALLTYPE *GetDirectDraw )( - IDirectDrawMediaStream * This, - /* [out] */ IDirectDraw **ppDirectDraw); - - HRESULT ( STDMETHODCALLTYPE *SetDirectDraw )( - IDirectDrawMediaStream * This, - /* [in] */ IDirectDraw *pDirectDraw); - - HRESULT ( STDMETHODCALLTYPE *CreateSample )( - IDirectDrawMediaStream * This, - /* [in] */ IDirectDrawSurface *pSurface, - /* [in] */ const RECT *pRect, - /* [in] */ DWORD dwFlags, - /* [out] */ IDirectDrawStreamSample **ppSample); - - HRESULT ( STDMETHODCALLTYPE *GetTimePerFrame )( - IDirectDrawMediaStream * This, - /* [out] */ STREAM_TIME *pFrameTime); - - END_INTERFACE - } IDirectDrawMediaStreamVtbl; - - interface IDirectDrawMediaStream - { - CONST_VTBL struct IDirectDrawMediaStreamVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDirectDrawMediaStream_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDirectDrawMediaStream_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDirectDrawMediaStream_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDirectDrawMediaStream_GetMultiMediaStream(This,ppMultiMediaStream) \ - (This)->lpVtbl -> GetMultiMediaStream(This,ppMultiMediaStream) - -#define IDirectDrawMediaStream_GetInformation(This,pPurposeId,pType) \ - (This)->lpVtbl -> GetInformation(This,pPurposeId,pType) - -#define IDirectDrawMediaStream_SetSameFormat(This,pStreamThatHasDesiredFormat,dwFlags) \ - (This)->lpVtbl -> SetSameFormat(This,pStreamThatHasDesiredFormat,dwFlags) - -#define IDirectDrawMediaStream_AllocateSample(This,dwFlags,ppSample) \ - (This)->lpVtbl -> AllocateSample(This,dwFlags,ppSample) - -#define IDirectDrawMediaStream_CreateSharedSample(This,pExistingSample,dwFlags,ppNewSample) \ - (This)->lpVtbl -> CreateSharedSample(This,pExistingSample,dwFlags,ppNewSample) - -#define IDirectDrawMediaStream_SendEndOfStream(This,dwFlags) \ - (This)->lpVtbl -> SendEndOfStream(This,dwFlags) - - -#define IDirectDrawMediaStream_GetFormat(This,pDDSDCurrent,ppDirectDrawPalette,pDDSDDesired,pdwFlags) \ - (This)->lpVtbl -> GetFormat(This,pDDSDCurrent,ppDirectDrawPalette,pDDSDDesired,pdwFlags) - -#define IDirectDrawMediaStream_SetFormat(This,pDDSurfaceDesc,pDirectDrawPalette) \ - (This)->lpVtbl -> SetFormat(This,pDDSurfaceDesc,pDirectDrawPalette) - -#define IDirectDrawMediaStream_GetDirectDraw(This,ppDirectDraw) \ - (This)->lpVtbl -> GetDirectDraw(This,ppDirectDraw) - -#define IDirectDrawMediaStream_SetDirectDraw(This,pDirectDraw) \ - (This)->lpVtbl -> SetDirectDraw(This,pDirectDraw) - -#define IDirectDrawMediaStream_CreateSample(This,pSurface,pRect,dwFlags,ppSample) \ - (This)->lpVtbl -> CreateSample(This,pSurface,pRect,dwFlags,ppSample) - -#define IDirectDrawMediaStream_GetTimePerFrame(This,pFrameTime) \ - (This)->lpVtbl -> GetTimePerFrame(This,pFrameTime) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDirectDrawMediaStream_GetFormat_Proxy( - IDirectDrawMediaStream * This, - /* [out] */ DDSURFACEDESC *pDDSDCurrent, - /* [out] */ IDirectDrawPalette **ppDirectDrawPalette, - /* [out] */ DDSURFACEDESC *pDDSDDesired, - /* [out] */ DWORD *pdwFlags); - - -void __RPC_STUB IDirectDrawMediaStream_GetFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDirectDrawMediaStream_SetFormat_Proxy( - IDirectDrawMediaStream * This, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ IDirectDrawPalette *pDirectDrawPalette); - - -void __RPC_STUB IDirectDrawMediaStream_SetFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDirectDrawMediaStream_GetDirectDraw_Proxy( - IDirectDrawMediaStream * This, - /* [out] */ IDirectDraw **ppDirectDraw); - - -void __RPC_STUB IDirectDrawMediaStream_GetDirectDraw_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDirectDrawMediaStream_SetDirectDraw_Proxy( - IDirectDrawMediaStream * This, - /* [in] */ IDirectDraw *pDirectDraw); - - -void __RPC_STUB IDirectDrawMediaStream_SetDirectDraw_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDirectDrawMediaStream_CreateSample_Proxy( - IDirectDrawMediaStream * This, - /* [in] */ IDirectDrawSurface *pSurface, - /* [in] */ const RECT *pRect, - /* [in] */ DWORD dwFlags, - /* [out] */ IDirectDrawStreamSample **ppSample); - - -void __RPC_STUB IDirectDrawMediaStream_CreateSample_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDirectDrawMediaStream_GetTimePerFrame_Proxy( - IDirectDrawMediaStream * This, - /* [out] */ STREAM_TIME *pFrameTime); - - -void __RPC_STUB IDirectDrawMediaStream_GetTimePerFrame_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDirectDrawMediaStream_INTERFACE_DEFINED__ */ - - -#ifndef __IDirectDrawStreamSample_INTERFACE_DEFINED__ -#define __IDirectDrawStreamSample_INTERFACE_DEFINED__ - -/* interface IDirectDrawStreamSample */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IDirectDrawStreamSample; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("F4104FCF-9A70-11d0-8FDE-00C04FD9189D") - IDirectDrawStreamSample : public IStreamSample - { - public: - virtual HRESULT STDMETHODCALLTYPE GetSurface( - /* [out] */ IDirectDrawSurface **ppDirectDrawSurface, - /* [out] */ RECT *pRect) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetRect( - /* [in] */ const RECT *pRect) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDirectDrawStreamSampleVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDirectDrawStreamSample * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDirectDrawStreamSample * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDirectDrawStreamSample * This); - - HRESULT ( STDMETHODCALLTYPE *GetMediaStream )( - IDirectDrawStreamSample * This, - /* [in] */ IMediaStream **ppMediaStream); - - HRESULT ( STDMETHODCALLTYPE *GetSampleTimes )( - IDirectDrawStreamSample * This, - /* [out] */ STREAM_TIME *pStartTime, - /* [out] */ STREAM_TIME *pEndTime, - /* [out] */ STREAM_TIME *pCurrentTime); - - HRESULT ( STDMETHODCALLTYPE *SetSampleTimes )( - IDirectDrawStreamSample * This, - /* [in] */ const STREAM_TIME *pStartTime, - /* [in] */ const STREAM_TIME *pEndTime); - - HRESULT ( STDMETHODCALLTYPE *Update )( - IDirectDrawStreamSample * This, - /* [in] */ DWORD dwFlags, - /* [in] */ HANDLE hEvent, - /* [in] */ PAPCFUNC pfnAPC, - /* [in] */ DWORD_PTR dwAPCData); - - HRESULT ( STDMETHODCALLTYPE *CompletionStatus )( - IDirectDrawStreamSample * This, - /* [in] */ DWORD dwFlags, - /* [in] */ DWORD dwMilliseconds); - - HRESULT ( STDMETHODCALLTYPE *GetSurface )( - IDirectDrawStreamSample * This, - /* [out] */ IDirectDrawSurface **ppDirectDrawSurface, - /* [out] */ RECT *pRect); - - HRESULT ( STDMETHODCALLTYPE *SetRect )( - IDirectDrawStreamSample * This, - /* [in] */ const RECT *pRect); - - END_INTERFACE - } IDirectDrawStreamSampleVtbl; - - interface IDirectDrawStreamSample - { - CONST_VTBL struct IDirectDrawStreamSampleVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDirectDrawStreamSample_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDirectDrawStreamSample_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDirectDrawStreamSample_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDirectDrawStreamSample_GetMediaStream(This,ppMediaStream) \ - (This)->lpVtbl -> GetMediaStream(This,ppMediaStream) - -#define IDirectDrawStreamSample_GetSampleTimes(This,pStartTime,pEndTime,pCurrentTime) \ - (This)->lpVtbl -> GetSampleTimes(This,pStartTime,pEndTime,pCurrentTime) - -#define IDirectDrawStreamSample_SetSampleTimes(This,pStartTime,pEndTime) \ - (This)->lpVtbl -> SetSampleTimes(This,pStartTime,pEndTime) - -#define IDirectDrawStreamSample_Update(This,dwFlags,hEvent,pfnAPC,dwAPCData) \ - (This)->lpVtbl -> Update(This,dwFlags,hEvent,pfnAPC,dwAPCData) - -#define IDirectDrawStreamSample_CompletionStatus(This,dwFlags,dwMilliseconds) \ - (This)->lpVtbl -> CompletionStatus(This,dwFlags,dwMilliseconds) - - -#define IDirectDrawStreamSample_GetSurface(This,ppDirectDrawSurface,pRect) \ - (This)->lpVtbl -> GetSurface(This,ppDirectDrawSurface,pRect) - -#define IDirectDrawStreamSample_SetRect(This,pRect) \ - (This)->lpVtbl -> SetRect(This,pRect) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDirectDrawStreamSample_GetSurface_Proxy( - IDirectDrawStreamSample * This, - /* [out] */ IDirectDrawSurface **ppDirectDrawSurface, - /* [out] */ RECT *pRect); - - -void __RPC_STUB IDirectDrawStreamSample_GetSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDirectDrawStreamSample_SetRect_Proxy( - IDirectDrawStreamSample * This, - /* [in] */ const RECT *pRect); - - -void __RPC_STUB IDirectDrawStreamSample_SetRect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDirectDrawStreamSample_INTERFACE_DEFINED__ */ - - -/* Additional Prototypes for ALL interfaces */ - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/dls1.h b/import/DirectX8/include/dls1.h deleted file mode 100644 index fc88a3170..000000000 --- a/import/DirectX8/include/dls1.h +++ /dev/null @@ -1,267 +0,0 @@ -/*==========================================================================; -// -// dls1.h -// -// -// Description: -// -// Interface defines and structures for the Instrument Collection Form -// RIFF DLS. -// -// -// Written by Sonic Foundry 1996. Released for public use. -// -//=========================================================================*/ - -#ifndef _INC_DLS1 -#define _INC_DLS1 - -/*////////////////////////////////////////////////////////////////////////// -// -// -// Layout of an instrument collection: -// -// -// RIFF [] 'DLS ' [dlid,colh,INSTLIST,WAVEPOOL,INFOLIST] -// -// INSTLIST -// LIST [] 'lins' -// LIST [] 'ins ' [dlid,insh,RGNLIST,ARTLIST,INFOLIST] -// LIST [] 'ins ' [dlid,insh,RGNLIST,ARTLIST,INFOLIST] -// LIST [] 'ins ' [dlid,insh,RGNLIST,ARTLIST,INFOLIST] -// -// RGNLIST -// LIST [] 'lrgn' -// LIST [] 'rgn ' [rgnh,wsmp,wlnk,ARTLIST] -// LIST [] 'rgn ' [rgnh,wsmp,wlnk,ARTLIST] -// LIST [] 'rgn ' [rgnh,wsmp,wlnk,ARTLIST] -// -// ARTLIST -// LIST [] 'lart' -// 'art1' level 1 Articulation connection graph -// 'art2' level 2 Articulation connection graph -// '3rd1' Possible 3rd party articulation structure 1 -// '3rd2' Possible 3rd party articulation structure 2 .... and so on -// -// WAVEPOOL -// ptbl [] [pool table] -// LIST [] 'wvpl' -// [path], -// [path], -// LIST [] 'wave' [dlid,RIFFWAVE] -// LIST [] 'wave' [dlid,RIFFWAVE] -// LIST [] 'wave' [dlid,RIFFWAVE] -// LIST [] 'wave' [dlid,RIFFWAVE] -// LIST [] 'wave' [dlid,RIFFWAVE] -// -// INFOLIST -// LIST [] 'INFO' -// 'icmt' 'One of those crazy comments.' -// 'icop' 'Copyright (C) 1996 Sonic Foundry' -// -/////////////////////////////////////////////////////////////////////////*/ - - -/*///////////////////////////////////////////////////////////////////////// -// FOURCC's used in the DLS file -/////////////////////////////////////////////////////////////////////////*/ - -#define FOURCC_DLS mmioFOURCC('D','L','S',' ') -#define FOURCC_DLID mmioFOURCC('d','l','i','d') -#define FOURCC_COLH mmioFOURCC('c','o','l','h') -#define FOURCC_WVPL mmioFOURCC('w','v','p','l') -#define FOURCC_PTBL mmioFOURCC('p','t','b','l') -#define FOURCC_PATH mmioFOURCC('p','a','t','h') -#define FOURCC_wave mmioFOURCC('w','a','v','e') -#define FOURCC_LINS mmioFOURCC('l','i','n','s') -#define FOURCC_INS mmioFOURCC('i','n','s',' ') -#define FOURCC_INSH mmioFOURCC('i','n','s','h') -#define FOURCC_LRGN mmioFOURCC('l','r','g','n') -#define FOURCC_RGN mmioFOURCC('r','g','n',' ') -#define FOURCC_RGNH mmioFOURCC('r','g','n','h') -#define FOURCC_LART mmioFOURCC('l','a','r','t') -#define FOURCC_ART1 mmioFOURCC('a','r','t','1') -#define FOURCC_WLNK mmioFOURCC('w','l','n','k') -#define FOURCC_WSMP mmioFOURCC('w','s','m','p') -#define FOURCC_VERS mmioFOURCC('v','e','r','s') - -/*///////////////////////////////////////////////////////////////////////// -// Articulation connection graph definitions -/////////////////////////////////////////////////////////////////////////*/ - -/* Generic Sources */ -#define CONN_SRC_NONE 0x0000 -#define CONN_SRC_LFO 0x0001 -#define CONN_SRC_KEYONVELOCITY 0x0002 -#define CONN_SRC_KEYNUMBER 0x0003 -#define CONN_SRC_EG1 0x0004 -#define CONN_SRC_EG2 0x0005 -#define CONN_SRC_PITCHWHEEL 0x0006 - -/* Midi Controllers 0-127 */ -#define CONN_SRC_CC1 0x0081 -#define CONN_SRC_CC7 0x0087 -#define CONN_SRC_CC10 0x008a -#define CONN_SRC_CC11 0x008b - -/* Generic Destinations */ -#define CONN_DST_NONE 0x0000 -#define CONN_DST_ATTENUATION 0x0001 -#define CONN_DST_PITCH 0x0003 -#define CONN_DST_PAN 0x0004 - -/* LFO Destinations */ -#define CONN_DST_LFO_FREQUENCY 0x0104 -#define CONN_DST_LFO_STARTDELAY 0x0105 - -/* EG1 Destinations */ -#define CONN_DST_EG1_ATTACKTIME 0x0206 -#define CONN_DST_EG1_DECAYTIME 0x0207 -#define CONN_DST_EG1_RELEASETIME 0x0209 -#define CONN_DST_EG1_SUSTAINLEVEL 0x020a - -/* EG2 Destinations */ -#define CONN_DST_EG2_ATTACKTIME 0x030a -#define CONN_DST_EG2_DECAYTIME 0x030b -#define CONN_DST_EG2_RELEASETIME 0x030d -#define CONN_DST_EG2_SUSTAINLEVEL 0x030e - -#define CONN_TRN_NONE 0x0000 -#define CONN_TRN_CONCAVE 0x0001 - -typedef struct _DLSID { - ULONG ulData1; - USHORT usData2; - USHORT usData3; - BYTE abData4[8]; -} DLSID, FAR *LPDLSID; - -typedef struct _DLSVERSION { - DWORD dwVersionMS; - DWORD dwVersionLS; -}DLSVERSION, FAR *LPDLSVERSION; - - -typedef struct _CONNECTION { - USHORT usSource; - USHORT usControl; - USHORT usDestination; - USHORT usTransform; - LONG lScale; - }CONNECTION, FAR *LPCONNECTION; - - -/* Level 1 Articulation Data */ - -typedef struct _CONNECTIONLIST { - ULONG cbSize; /* size of the connection list structure */ - ULONG cConnections; /* count of connections in the list */ - } CONNECTIONLIST, FAR *LPCONNECTIONLIST; - - - -/*///////////////////////////////////////////////////////////////////////// -// Generic type defines for regions and instruments -/////////////////////////////////////////////////////////////////////////*/ - -typedef struct _RGNRANGE { - USHORT usLow; - USHORT usHigh; -}RGNRANGE, FAR * LPRGNRANGE; - -#define F_INSTRUMENT_DRUMS 0x80000000 - -typedef struct _MIDILOCALE { - ULONG ulBank; - ULONG ulInstrument; -}MIDILOCALE, FAR *LPMIDILOCALE; - -/*///////////////////////////////////////////////////////////////////////// -// Header structures found in an DLS file for collection, instruments, and -// regions. -/////////////////////////////////////////////////////////////////////////*/ - -#define F_RGN_OPTION_SELFNONEXCLUSIVE 0x0001 - -typedef struct _RGNHEADER { - RGNRANGE RangeKey; /* Key range */ - RGNRANGE RangeVelocity; /* Velocity Range */ - USHORT fusOptions; /* Synthesis options for this range */ - USHORT usKeyGroup; /* Key grouping for non simultaneous play */ - /* 0 = no group, 1 up is group */ - /* for Level 1 only groups 1-15 are allowed */ -}RGNHEADER, FAR *LPRGNHEADER; - -typedef struct _INSTHEADER { - ULONG cRegions; /* Count of regions in this instrument */ - MIDILOCALE Locale; /* Intended MIDI locale of this instrument */ -}INSTHEADER, FAR *LPINSTHEADER; - -typedef struct _DLSHEADER { - ULONG cInstruments; /* Count of instruments in the collection */ -}DLSHEADER, FAR *LPDLSHEADER; - -/*//////////////////////////////////////////////////////////////////////////// -// definitions for the Wave link structure -////////////////////////////////////////////////////////////////////////////*/ - -/* **** For level 1 only WAVELINK_CHANNEL_MONO is valid **** */ -/* ulChannel allows for up to 32 channels of audio with each bit position */ -/* specifiying a channel of playback */ - -#define WAVELINK_CHANNEL_LEFT 0x0001l -#define WAVELINK_CHANNEL_RIGHT 0x0002l - -#define F_WAVELINK_PHASE_MASTER 0x0001 - -typedef struct _WAVELINK { /* any paths or links are stored right after struct */ - USHORT fusOptions; /* options flags for this wave */ - USHORT usPhaseGroup; /* Phase grouping for locking channels */ - ULONG ulChannel; /* channel placement */ - ULONG ulTableIndex; /* index into the wave pool table, 0 based */ -}WAVELINK, FAR *LPWAVELINK; - -#define POOL_CUE_NULL 0xffffffffl - -typedef struct _POOLCUE { - ULONG ulOffset; /* Offset to the entry in the list */ -}POOLCUE, FAR *LPPOOLCUE; - -typedef struct _POOLTABLE { - ULONG cbSize; /* size of the pool table structure */ - ULONG cCues; /* count of cues in the list */ - } POOLTABLE, FAR *LPPOOLTABLE; - -/*//////////////////////////////////////////////////////////////////////////// -// Structures for the "wsmp" chunk -////////////////////////////////////////////////////////////////////////////*/ - -#define F_WSMP_NO_TRUNCATION 0x0001l -#define F_WSMP_NO_COMPRESSION 0x0002l - - -typedef struct _rwsmp { - ULONG cbSize; - USHORT usUnityNote; /* MIDI Unity Playback Note */ - SHORT sFineTune; /* Fine Tune in log tuning */ - LONG lAttenuation; /* Overall Attenuation to be applied to data */ - ULONG fulOptions; /* Flag options */ - ULONG cSampleLoops; /* Count of Sample loops, 0 loops is one shot */ - } WSMPL, FAR *LPWSMPL; - - -/* This loop type is a normal forward playing loop which is continually */ -/* played until the envelope reaches an off threshold in the release */ -/* portion of the volume envelope */ - -#define WLOOP_TYPE_FORWARD 0 - -typedef struct _rloop { - ULONG cbSize; - ULONG ulType; /* Loop Type */ - ULONG ulStart; /* Start of loop in samples */ - ULONG ulLength; /* Length of loop in samples */ -} WLOOP, FAR *LPWLOOP; - -#endif /*_INC_DLS1 */ - diff --git a/import/DirectX8/include/dls2.h b/import/DirectX8/include/dls2.h deleted file mode 100644 index 30cec23a2..000000000 --- a/import/DirectX8/include/dls2.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - - dls2.h - - Description: - - Interface defines and structures for the DLS2 extensions of DLS. - - - Written by Microsoft 1998. Released for public use. - -*/ - -#ifndef _INC_DLS2 -#define _INC_DLS2 - -/* - FOURCC's used in the DLS2 file, in addition to DLS1 chunks -*/ - -#define FOURCC_RGN2 mmioFOURCC('r','g','n','2') -#define FOURCC_LAR2 mmioFOURCC('l','a','r','2') -#define FOURCC_ART2 mmioFOURCC('a','r','t','2') -#define FOURCC_CDL mmioFOURCC('c','d','l',' ') -#define FOURCC_DLID mmioFOURCC('d','l','i','d') - -/* - Articulation connection graph definitions. These are in addition to - the definitions in the DLS1 header. -*/ - -/* Generic Sources (in addition to DLS1 sources. */ -#define CONN_SRC_POLYPRESSURE 0x0007 /* Polyphonic Pressure */ -#define CONN_SRC_CHANNELPRESSURE 0x0008 /* Channel Pressure */ -#define CONN_SRC_VIBRATO 0x0009 /* Vibrato LFO */ -#define CONN_SRC_MONOPRESSURE 0x000a /* MIDI Mono pressure */ - - -/* Midi Controllers */ -#define CONN_SRC_CC91 0x00db /* Reverb Send */ -#define CONN_SRC_CC93 0x00dd /* Chorus Send */ - - -/* Generic Destinations */ -#define CONN_DST_GAIN 0x0001 /* Same as CONN_DST_ ATTENUATION, but more appropriate terminology. */ -#define CONN_DST_KEYNUMBER 0x0005 /* Key Number Generator */ - -/* Audio Channel Output Destinations */ -#define CONN_DST_LEFT 0x0010 /* Left Channel Send */ -#define CONN_DST_RIGHT 0x0011 /* Right Channel Send */ -#define CONN_DST_CENTER 0x0012 /* Center Channel Send */ -#define CONN_DST_LEFTREAR 0x0013 /* Left Rear Channel Send */ -#define CONN_DST_RIGHTREAR 0x0014 /* Right Rear Channel Send */ -#define CONN_DST_LFE_CHANNEL 0x0015 /* LFE Channel Send */ -#define CONN_DST_CHORUS 0x0080 /* Chorus Send */ -#define CONN_DST_REVERB 0x0081 /* Reverb Send */ - -/* Vibrato LFO Destinations */ -#define CONN_DST_VIB_FREQUENCY 0x0114 /* Vibrato Frequency */ -#define CONN_DST_VIB_STARTDELAY 0x0115 /* Vibrato Start Delay */ - -/* EG1 Destinations */ -#define CONN_DST_EG1_DELAYTIME 0x020B /* EG1 Delay Time */ -#define CONN_DST_EG1_HOLDTIME 0x020C /* EG1 Hold Time */ -#define CONN_DST_EG1_SHUTDOWNTIME 0x020D /* EG1 Shutdown Time */ - - -/* EG2 Destinations */ -#define CONN_DST_EG2_DELAYTIME 0x030F /* EG2 Delay Time */ -#define CONN_DST_EG2_HOLDTIME 0x0310 /* EG2 Hold Time */ - - -/* Filter Destinations */ -#define CONN_DST_FILTER_CUTOFF 0x0500 /* Filter Cutoff Frequency */ -#define CONN_DST_FILTER_Q 0x0501 /* Filter Resonance */ - - -/* Transforms */ -#define CONN_TRN_CONVEX 0x0002 /* Convex Transform */ -#define CONN_TRN_SWITCH 0x0003 /* Switch Transform */ - - -/* Conditional chunk operators */ - #define DLS_CDL_AND 0x0001 /* X = X & Y */ - #define DLS_CDL_OR 0x0002 /* X = X | Y */ - #define DLS_CDL_XOR 0x0003 /* X = X ^ Y */ - #define DLS_CDL_ADD 0x0004 /* X = X + Y */ - #define DLS_CDL_SUBTRACT 0x0005 /* X = X - Y */ - #define DLS_CDL_MULTIPLY 0x0006 /* X = X * Y */ - #define DLS_CDL_DIVIDE 0x0007 /* X = X / Y */ - #define DLS_CDL_LOGICAL_AND 0x0008 /* X = X && Y */ - #define DLS_CDL_LOGICAL_OR 0x0009 /* X = X || Y */ - #define DLS_CDL_LT 0x000A /* X = (X < Y) */ - #define DLS_CDL_LE 0x000B /* X = (X <= Y) */ - #define DLS_CDL_GT 0x000C /* X = (X > Y) */ - #define DLS_CDL_GE 0x000D /* X = (X >= Y) */ - #define DLS_CDL_EQ 0x000E /* X = (X == Y) */ - #define DLS_CDL_NOT 0x000F /* X = !X */ - #define DLS_CDL_CONST 0x0010 /* 32-bit constant */ - #define DLS_CDL_QUERY 0x0011 /* 32-bit value returned from query */ - #define DLS_CDL_QUERYSUPPORTED 0x0012 /* Test to see if query is supported by synth */ - -/* - Loop and release -*/ - -#define WLOOP_TYPE_RELEASE 1 - -/* - WaveLink chunk -*/ - -#define F_WAVELINK_MULTICHANNEL 0x0002 - - -/* - DLSID queries for -*/ - -DEFINE_GUID(DLSID_GMInHardware, 0x178f2f24, 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); -DEFINE_GUID(DLSID_GSInHardware, 0x178f2f25, 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); -DEFINE_GUID(DLSID_XGInHardware, 0x178f2f26, 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); -DEFINE_GUID(DLSID_SupportsDLS1, 0x178f2f27, 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); -DEFINE_GUID(DLSID_SupportsDLS2, 0xf14599e5, 0x4689, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6); -DEFINE_GUID(DLSID_SampleMemorySize, 0x178f2f28, 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); -DEFINE_GUID(DLSID_ManufacturersID, 0xb03e1181, 0x8095, 0x11d2, 0xa1, 0xef, 0x0, 0x60, 0x8, 0x33, 0xdb, 0xd8); -DEFINE_GUID(DLSID_ProductID, 0xb03e1182, 0x8095, 0x11d2, 0xa1, 0xef, 0x0, 0x60, 0x8, 0x33, 0xdb, 0xd8); -DEFINE_GUID(DLSID_SamplePlaybackRate, 0x2a91f713, 0xa4bf, 0x11d2, 0xbb, 0xdf, 0x0, 0x60, 0x8, 0x33, 0xdb, 0xd8); - -#endif /* _INC_DLS2 */ diff --git a/import/DirectX8/include/dmdls.h b/import/DirectX8/include/dmdls.h deleted file mode 100644 index 974e28661..000000000 --- a/import/DirectX8/include/dmdls.h +++ /dev/null @@ -1,199 +0,0 @@ -/************************************************************************ -* * -* dmdls.h -- DLS download definitions for DirectMusic API's * -* * -* Copyright (c) 1998-1999 Microsoft Corporation * -* * -************************************************************************/ - -#ifndef _DMDLS_ -#define _DMDLS_ - -#include "dls1.h" - -typedef long PCENT; /* Pitch cents */ -typedef long GCENT; /* Gain cents */ -typedef long TCENT; /* Time cents */ -typedef long PERCENT; /* Per.. cent! */ - -typedef LONGLONG REFERENCE_TIME; -typedef REFERENCE_TIME *LPREFERENCE_TIME; - -#ifndef MAKE_FOURCC -#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ - ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \ - ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 )) - - -typedef DWORD FOURCC; /* a four character code */ -#endif - -typedef struct _DMUS_DOWNLOADINFO -{ - DWORD dwDLType; /* Instrument or Wave */ - DWORD dwDLId; /* Unique identifier to tag this download. */ - DWORD dwNumOffsetTableEntries; /* Number of index in the offset address table. */ - DWORD cbSize; /* Total size of this memory chunk. */ -} DMUS_DOWNLOADINFO; - -#define DMUS_DOWNLOADINFO_INSTRUMENT 1 -#define DMUS_DOWNLOADINFO_WAVE 2 -#define DMUS_DOWNLOADINFO_INSTRUMENT2 3 /* New version for better DLS2 support. */ - -/* Support for oneshot and streaming wave data - */ -#define DMUS_DOWNLOADINFO_WAVEARTICULATION 4 /* Wave articulation data */ -#define DMUS_DOWNLOADINFO_STREAMINGWAVE 5 /* One chunk of a streaming */ -#define DMUS_DOWNLOADINFO_ONESHOTWAVE 6 - -#define DMUS_DEFAULT_SIZE_OFFSETTABLE 1 - -/* Flags for DMUS_INSTRUMENT's ulFlags member */ - -#define DMUS_INSTRUMENT_GM_INSTRUMENT (1 << 0) - -typedef struct _DMUS_OFFSETTABLE -{ - ULONG ulOffsetTable[DMUS_DEFAULT_SIZE_OFFSETTABLE]; -} DMUS_OFFSETTABLE; - -typedef struct _DMUS_INSTRUMENT -{ - ULONG ulPatch; - ULONG ulFirstRegionIdx; - ULONG ulGlobalArtIdx; /* If zero the instrument does not have an articulation */ - ULONG ulFirstExtCkIdx; /* If zero no 3rd party entenstion chunks associated with the instrument */ - ULONG ulCopyrightIdx; /* If zero no Copyright information associated with the instrument */ - ULONG ulFlags; -} DMUS_INSTRUMENT; - -typedef struct _DMUS_REGION -{ - RGNRANGE RangeKey; - RGNRANGE RangeVelocity; - USHORT fusOptions; - USHORT usKeyGroup; - ULONG ulRegionArtIdx; /* If zero the region does not have an articulation */ - ULONG ulNextRegionIdx; /* If zero no more regions */ - ULONG ulFirstExtCkIdx; /* If zero no 3rd party entenstion chunks associated with the region */ - WAVELINK WaveLink; - WSMPL WSMP; /* If WSMP.cSampleLoops > 1 then a WLOOP is included */ - WLOOP WLOOP[1]; -} DMUS_REGION; - -typedef struct _DMUS_LFOPARAMS -{ - PCENT pcFrequency; - TCENT tcDelay; - GCENT gcVolumeScale; - PCENT pcPitchScale; - GCENT gcMWToVolume; - PCENT pcMWToPitch; -} DMUS_LFOPARAMS; - -typedef struct _DMUS_VEGPARAMS -{ - TCENT tcAttack; - TCENT tcDecay; - PERCENT ptSustain; - TCENT tcRelease; - TCENT tcVel2Attack; - TCENT tcKey2Decay; -} DMUS_VEGPARAMS; - -typedef struct _DMUS_PEGPARAMS -{ - TCENT tcAttack; - TCENT tcDecay; - PERCENT ptSustain; - TCENT tcRelease; - TCENT tcVel2Attack; - TCENT tcKey2Decay; - PCENT pcRange; -} DMUS_PEGPARAMS; - -typedef struct _DMUS_MSCPARAMS -{ - PERCENT ptDefaultPan; -} DMUS_MSCPARAMS; - -typedef struct _DMUS_ARTICPARAMS -{ - DMUS_LFOPARAMS LFO; - DMUS_VEGPARAMS VolEG; - DMUS_PEGPARAMS PitchEG; - DMUS_MSCPARAMS Misc; -} DMUS_ARTICPARAMS; - -typedef struct _DMUS_ARTICULATION /* Articulation chunk for DMUS_DOWNLOADINFO_INSTRUMENT format. */ -{ - ULONG ulArt1Idx; /* DLS Level 1 articulation chunk */ - ULONG ulFirstExtCkIdx; /* 3rd party extenstion chunks associated with the articulation */ -} DMUS_ARTICULATION; - -typedef struct _DMUS_ARTICULATION2 /* Articulation chunk for DMUS_DOWNLOADINFO_INSTRUMENT2 format. */ -{ - ULONG ulArtIdx; /* DLS Level 1/2 articulation chunk */ - ULONG ulFirstExtCkIdx; /* 3rd party extenstion chunks associated with the articulation */ - ULONG ulNextArtIdx; /* Additional articulation chunks */ -} DMUS_ARTICULATION2; - -#define DMUS_MIN_DATA_SIZE 4 -/* The actual number is determined by cbSize of struct _DMUS_EXTENSIONCHUNK */ - -typedef struct _DMUS_EXTENSIONCHUNK -{ - ULONG cbSize; /* Size of extension chunk */ - ULONG ulNextExtCkIdx; /* If zero no more 3rd party entenstion chunks */ - FOURCC ExtCkID; - BYTE byExtCk[DMUS_MIN_DATA_SIZE]; /* The actual number that follows is determined by cbSize */ -} DMUS_EXTENSIONCHUNK; - -/* The actual number is determined by cbSize of struct _DMUS_COPYRIGHT */ - -typedef struct _DMUS_COPYRIGHT -{ - ULONG cbSize; /* Size of copyright information */ - BYTE byCopyright[DMUS_MIN_DATA_SIZE]; /* The actual number that follows is determined by cbSize */ -} DMUS_COPYRIGHT; - -typedef struct _DMUS_WAVEDATA -{ - ULONG cbSize; - BYTE byData[DMUS_MIN_DATA_SIZE]; -} DMUS_WAVEDATA; - -typedef struct _DMUS_WAVE -{ - ULONG ulFirstExtCkIdx; /* If zero no 3rd party entenstion chunks associated with the wave */ - ULONG ulCopyrightIdx; /* If zero no Copyright information associated with the wave */ - ULONG ulWaveDataIdx; /* Location of actual wave data. */ - WAVEFORMATEX WaveformatEx; -} DMUS_WAVE; - -typedef struct _DMUS_NOTERANGE *LPDMUS_NOTERANGE; -typedef struct _DMUS_NOTERANGE -{ - DWORD dwLowNote; /* Sets the low note for the range of MIDI note events to which the instrument responds.*/ - DWORD dwHighNote; /* Sets the high note for the range of MIDI note events to which the instrument responds.*/ -} DMUS_NOTERANGE; - -typedef struct _DMUS_WAVEARTDL -{ - ULONG ulDownloadIdIdx; /* Download ID's of each buffer */ - ULONG ulBus; /* Playback bus */ - ULONG ulBuffers; /* Buffers */ - ULONG ulMasterDLId; /* Download ID of master voice of slave group */ - USHORT usOptions; /* Same as DLS2 region options */ -} DMUS_WAVEARTDL, - *LPDMUS_WAVEARTDL; - -typedef struct _DMUS_WAVEDL -{ - ULONG cbWaveData; /* Bytes of wave data */ -} DMUS_WAVEDL, - *LPDMUS_WAVEDL; - -#endif - - diff --git a/import/DirectX8/include/dmerror.h b/import/DirectX8/include/dmerror.h deleted file mode 100644 index 1097aa822..000000000 --- a/import/DirectX8/include/dmerror.h +++ /dev/null @@ -1,843 +0,0 @@ -/************************************************************************ -* * -* dmerror.h -- Error code returned by DirectMusic API's * -* * -* Copyright (c) 1998-1999 Microsoft Corporation -* * -************************************************************************/ - -#ifndef _DMERROR_ -#define _DMERROR_ - -#define FACILITY_DIRECTMUSIC 0x878 /* Shared with DirectSound */ -#define DMUS_ERRBASE 0x1000 /* Make error codes human readable in hex */ - -#ifndef MAKE_HRESULT -#define MAKE_HRESULT(sev,fac,code) \ - ((HRESULT) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) ) -#endif - -#define MAKE_DMHRESULTSUCCESS(code) MAKE_HRESULT(0, FACILITY_DIRECTMUSIC, (DMUS_ERRBASE + (code))) -#define MAKE_DMHRESULTERROR(code) MAKE_HRESULT(1, FACILITY_DIRECTMUSIC, (DMUS_ERRBASE + (code))) - -/* DMUS_S_PARTIALLOAD - * - * The object could only load partially. This can happen if some components are - * not registered properly, such as embedded tracks and tools. This can also happen - * if some content is missing. For example, if a segment uses a DLS collection that - * is not in the loader's current search directory. - */ -#define DMUS_S_PARTIALLOAD MAKE_DMHRESULTSUCCESS(0x091) - -/* DMUS_S_PARTIALDOWNLOAD - * - * Return value from IDirectMusicBand::Download() which indicates that - * some of the instruments safely downloaded, but others failed. This usually - * occurs when some instruments are on PChannels not supported by the performance - * or port. - */ -#define DMUS_S_PARTIALDOWNLOAD MAKE_DMHRESULTSUCCESS(0x092) - -/* DMUS_S_REQUEUE - * - * Return value from IDirectMusicTool::ProcessPMsg() which indicates to the - * performance that it should cue the PMsg again automatically. - */ -#define DMUS_S_REQUEUE MAKE_DMHRESULTSUCCESS(0x200) - -/* DMUS_S_FREE - * - * Return value from IDirectMusicTool::ProcessPMsg() which indicates to the - * performance that it should free the PMsg automatically. - */ -#define DMUS_S_FREE MAKE_DMHRESULTSUCCESS(0x201) - -/* DMUS_S_END - * - * Return value from IDirectMusicTrack::Play() which indicates to the - * segment that the track has no more data after mtEnd. - */ -#define DMUS_S_END MAKE_DMHRESULTSUCCESS(0x202) - -/* DMUS_S_STRING_TRUNCATED - * - * Returned string has been truncated to fit the buffer size. - */ -#define DMUS_S_STRING_TRUNCATED MAKE_DMHRESULTSUCCESS(0x210) - -/* DMUS_S_LAST_TOOL - * - * Returned from IDirectMusicGraph::StampPMsg(), this indicates that the PMsg - * is already stamped with the last tool in the graph. The returned PMsg's - * tool pointer is now NULL. - */ -#define DMUS_S_LAST_TOOL MAKE_DMHRESULTSUCCESS(0x211) - -/* DMUS_S_OVER_CHORD - * - * Returned from IDirectMusicPerformance::MusicToMIDI(), this indicates - * that no note has been calculated because the music value has the note - * at a position higher than the top note of the chord. This applies only - * to DMUS_PLAYMODE_NORMALCHORD play mode. This success code indicates - * that the caller should not do anything with the note. It is not meant - * to be played against this chord. - */ -#define DMUS_S_OVER_CHORD MAKE_DMHRESULTSUCCESS(0x212) - -/* DMUS_S_UP_OCTAVE - * - * Returned from IDirectMusicPerformance::MIDIToMusic(), and - * IDirectMusicPerformance::MusicToMIDI(), this indicates - * that the note conversion generated a note value that is below 0, - * so it has been bumped up one or more octaves to be in the proper - * MIDI range of 0 through 127. - * Note that this is valid for MIDIToMusic() when using play modes - * DMUS_PLAYMODE_FIXEDTOCHORD and DMUS_PLAYMODE_FIXEDTOKEY, both of - * which store MIDI values in wMusicValue. With MusicToMIDI(), it is - * valid for all play modes. - * Ofcourse, DMUS_PLAYMODE_FIXED will never return this success code. - */ -#define DMUS_S_UP_OCTAVE MAKE_DMHRESULTSUCCESS(0x213) - -/* DMUS_S_DOWN_OCTAVE - * - * Returned from IDirectMusicPerformance::MIDIToMusic(), and - * IDirectMusicPerformance::MusicToMIDI(), this indicates - * that the note conversion generated a note value that is above 127, - * so it has been bumped down one or more octaves to be in the proper - * MIDI range of 0 through 127. - * Note that this is valid for MIDIToMusic() when using play modes - * DMUS_PLAYMODE_FIXEDTOCHORD and DMUS_PLAYMODE_FIXEDTOKEY, both of - * which store MIDI values in wMusicValue. With MusicToMIDI(), it is - * valid for all play modes. - * Ofcourse, DMUS_PLAYMODE_FIXED will never return this success code. - */ -#define DMUS_S_DOWN_OCTAVE MAKE_DMHRESULTSUCCESS(0x214) - -/* DMUS_S_NOBUFFERCONTROL - * - * Although the audio output from the port will be routed to the - * same device as the given DirectSound buffer, buffer controls - * such as pan and volume will not affect the output. - * - */ -#define DMUS_S_NOBUFFERCONTROL MAKE_DMHRESULTSUCCESS(0x215) - -/* DMUS_S_GARBAGE_COLLECTED - * - * The requested operation was not performed because during CollectGarbage - * the loader determined that the object had been released. - */ -#define DMUS_S_GARBAGE_COLLECTED MAKE_DMHRESULTSUCCESS(0x216) - -/* DMUS_E_DRIVER_FAILED - * - * An unexpected error was returned from a device driver, indicating - * possible failure of the driver or hardware. - */ -#define DMUS_E_DRIVER_FAILED MAKE_DMHRESULTERROR(0x0101) - -/* DMUS_E_PORTS_OPEN - * - * The requested operation cannot be performed while there are - * instantiated ports in any process in the system. - */ -#define DMUS_E_PORTS_OPEN MAKE_DMHRESULTERROR(0x0102) - -/* DMUS_E_DEVICE_IN_USE - * - * The requested device is already in use (possibly by a non-DirectMusic - * client) and cannot be opened again. - */ -#define DMUS_E_DEVICE_IN_USE MAKE_DMHRESULTERROR(0x0103) - -/* DMUS_E_INSUFFICIENTBUFFER - * - * Buffer is not large enough for requested operation. - */ -#define DMUS_E_INSUFFICIENTBUFFER MAKE_DMHRESULTERROR(0x0104) - -/* DMUS_E_BUFFERNOTSET - * - * No buffer was prepared for the download data. - */ -#define DMUS_E_BUFFERNOTSET MAKE_DMHRESULTERROR(0x0105) - -/* DMUS_E_BUFFERNOTAVAILABLE - * - * Download failed due to inability to access or create download buffer. - */ -#define DMUS_E_BUFFERNOTAVAILABLE MAKE_DMHRESULTERROR(0x0106) - -/* DMUS_E_NOTADLSCOL - * - * Error parsing DLS collection. File is corrupt. - */ -#define DMUS_E_NOTADLSCOL MAKE_DMHRESULTERROR(0x0108) - -/* DMUS_E_INVALIDOFFSET - * - * Wave chunks in DLS collection file are at incorrect offsets. - */ -#define DMUS_E_INVALIDOFFSET MAKE_DMHRESULTERROR(0x0109) - -/* DMUS_E_ALREADY_LOADED - * - * Second attempt to load a DLS collection that is currently open. - */ -#define DMUS_E_ALREADY_LOADED MAKE_DMHRESULTERROR(0x0111) - -/* DMUS_E_INVALIDPOS - * - * Error reading wave data from DLS collection. Indicates bad file. - */ -#define DMUS_E_INVALIDPOS MAKE_DMHRESULTERROR(0x0113) - -/* DMUS_E_INVALIDPATCH - * - * There is no instrument in the collection that matches patch number. - */ -#define DMUS_E_INVALIDPATCH MAKE_DMHRESULTERROR(0x0114) - -/* DMUS_E_CANNOTSEEK - * - * The IStream* doesn't support Seek(). - */ -#define DMUS_E_CANNOTSEEK MAKE_DMHRESULTERROR(0x0115) - -/* DMUS_E_CANNOTWRITE - * - * The IStream* doesn't support Write(). - */ -#define DMUS_E_CANNOTWRITE MAKE_DMHRESULTERROR(0x0116) - -/* DMUS_E_CHUNKNOTFOUND - * - * The RIFF parser doesn't contain a required chunk while parsing file. - */ -#define DMUS_E_CHUNKNOTFOUND MAKE_DMHRESULTERROR(0x0117) - -/* DMUS_E_INVALID_DOWNLOADID - * - * Invalid download id was used in the process of creating a download buffer. - */ -#define DMUS_E_INVALID_DOWNLOADID MAKE_DMHRESULTERROR(0x0119) - -/* DMUS_E_NOT_DOWNLOADED_TO_PORT - * - * Tried to unload an object that was not downloaded or previously unloaded. - */ -#define DMUS_E_NOT_DOWNLOADED_TO_PORT MAKE_DMHRESULTERROR(0x0120) - -/* DMUS_E_ALREADY_DOWNLOADED - * - * Buffer was already downloaded to synth. - */ -#define DMUS_E_ALREADY_DOWNLOADED MAKE_DMHRESULTERROR(0x0121) - -/* DMUS_E_UNKNOWN_PROPERTY - * - * The specified property item was not recognized by the target object. - */ -#define DMUS_E_UNKNOWN_PROPERTY MAKE_DMHRESULTERROR(0x0122) - -/* DMUS_E_SET_UNSUPPORTED - * - * The specified property item may not be set on the target object. - */ -#define DMUS_E_SET_UNSUPPORTED MAKE_DMHRESULTERROR(0x0123) - -/* DMUS_E_GET_UNSUPPORTED - * - * The specified property item may not be retrieved from the target object. - */ -#define DMUS_E_GET_UNSUPPORTED MAKE_DMHRESULTERROR(0x0124) - -/* DMUS_E_NOTMONO - * - * Wave chunk has more than one interleaved channel. DLS format requires MONO. - */ -#define DMUS_E_NOTMONO MAKE_DMHRESULTERROR(0x0125) - -/* DMUS_E_BADARTICULATION - * - * Invalid articulation chunk in DLS collection. - */ -#define DMUS_E_BADARTICULATION MAKE_DMHRESULTERROR(0x0126) - -/* DMUS_E_BADINSTRUMENT - * - * Invalid instrument chunk in DLS collection. - */ -#define DMUS_E_BADINSTRUMENT MAKE_DMHRESULTERROR(0x0127) - -/* DMUS_E_BADWAVELINK - * - * Wavelink chunk in DLS collection points to invalid wave. - */ -#define DMUS_E_BADWAVELINK MAKE_DMHRESULTERROR(0x0128) - -/* DMUS_E_NOARTICULATION - * - * Articulation missing from instrument in DLS collection. - */ -#define DMUS_E_NOARTICULATION MAKE_DMHRESULTERROR(0x0129) - -/* DMUS_E_NOTPCM - * - * Downoaded DLS wave is not in PCM format. -*/ -#define DMUS_E_NOTPCM MAKE_DMHRESULTERROR(0x012A) - -/* DMUS_E_BADWAVE - * - * Bad wave chunk in DLS collection - */ -#define DMUS_E_BADWAVE MAKE_DMHRESULTERROR(0x012B) - -/* DMUS_E_BADOFFSETTABLE - * - * Offset Table for download buffer has errors. - */ -#define DMUS_E_BADOFFSETTABLE MAKE_DMHRESULTERROR(0x012C) - -/* DMUS_E_UNKNOWNDOWNLOAD - * - * Attempted to download unknown data type. - */ -#define DMUS_E_UNKNOWNDOWNLOAD MAKE_DMHRESULTERROR(0x012D) - -/* DMUS_E_NOSYNTHSINK - * - * The operation could not be completed because no sink was connected to - * the synthesizer. - */ -#define DMUS_E_NOSYNTHSINK MAKE_DMHRESULTERROR(0x012E) - -/* DMUS_E_ALREADYOPEN - * - * An attempt was made to open the software synthesizer while it was already - * open. - * ASSERT? - */ -#define DMUS_E_ALREADYOPEN MAKE_DMHRESULTERROR(0x012F) - -/* DMUS_E_ALREADYCLOSE - * - * An attempt was made to close the software synthesizer while it was already - * open. - * ASSERT? - */ -#define DMUS_E_ALREADYCLOSED MAKE_DMHRESULTERROR(0x0130) - -/* DMUS_E_SYNTHNOTCONFIGURED - * - * The operation could not be completed because the software synth has not - * yet been fully configured. - * ASSERT? - */ -#define DMUS_E_SYNTHNOTCONFIGURED MAKE_DMHRESULTERROR(0x0131) - -/* DMUS_E_SYNTHACTIVE - * - * The operation cannot be carried out while the synthesizer is active. - */ -#define DMUS_E_SYNTHACTIVE MAKE_DMHRESULTERROR(0x0132) - -/* DMUS_E_CANNOTREAD - * - * An error occurred while attempting to read from the IStream* object. - */ -#define DMUS_E_CANNOTREAD MAKE_DMHRESULTERROR(0x0133) - -/* DMUS_E_DMUSIC_RELEASED - * - * The operation cannot be performed because the final instance of the - * DirectMusic object was released. Ports cannot be used after final - * release of the DirectMusic object. - */ -#define DMUS_E_DMUSIC_RELEASED MAKE_DMHRESULTERROR(0x0134) - -/* DMUS_E_BUFFER_EMPTY - * - * There was no data in the referenced buffer. - */ -#define DMUS_E_BUFFER_EMPTY MAKE_DMHRESULTERROR(0x0135) - -/* DMUS_E_BUFFER_FULL - * - * There is insufficient space to insert the given event into the buffer. - */ -#define DMUS_E_BUFFER_FULL MAKE_DMHRESULTERROR(0x0136) - -/* DMUS_E_PORT_NOT_CAPTURE - * - * The given operation could not be carried out because the port is a - * capture port. - */ -#define DMUS_E_PORT_NOT_CAPTURE MAKE_DMHRESULTERROR(0x0137) - -/* DMUS_E_PORT_NOT_RENDER - * - * The given operation could not be carried out because the port is a - * render port. - */ -#define DMUS_E_PORT_NOT_RENDER MAKE_DMHRESULTERROR(0x0138) - -/* DMUS_E_DSOUND_NOT_SET - * - * The port could not be created because no DirectSound has been specified. - * Specify a DirectSound interface via the IDirectMusic::SetDirectSound - * method; pass NULL to have DirectMusic manage usage of DirectSound. - */ -#define DMUS_E_DSOUND_NOT_SET MAKE_DMHRESULTERROR(0x0139) - -/* DMUS_E_ALREADY_ACTIVATED - * - * The operation cannot be carried out while the port is active. - */ -#define DMUS_E_ALREADY_ACTIVATED MAKE_DMHRESULTERROR(0x013A) - -/* DMUS_E_INVALIDBUFFER - * - * Invalid DirectSound buffer was handed to port. - */ -#define DMUS_E_INVALIDBUFFER MAKE_DMHRESULTERROR(0x013B) - -/* DMUS_E_WAVEFORMATNOTSUPPORTED - * - * Invalid buffer format was handed to the synth sink. - */ -#define DMUS_E_WAVEFORMATNOTSUPPORTED MAKE_DMHRESULTERROR(0x013C) - -/* DMUS_E_SYNTHINACTIVE - * - * The operation cannot be carried out while the synthesizer is inactive. - */ -#define DMUS_E_SYNTHINACTIVE MAKE_DMHRESULTERROR(0x013D) - -/* DMUS_E_DSOUND_ALREADY_SET - * - * IDirectMusic::SetDirectSound has already been called. It may not be - * changed while in use. - */ -#define DMUS_E_DSOUND_ALREADY_SET MAKE_DMHRESULTERROR(0x013E) - -/* DMUS_E_INVALID_EVENT - * - * The given event is invalid (either it is not a valid MIDI message - * or it makes use of running status). The event cannot be packed - * into the buffer. - */ -#define DMUS_E_INVALID_EVENT MAKE_DMHRESULTERROR(0x013F) - -/* DMUS_E_UNSUPPORTED_STREAM - * - * The IStream* object does not contain data supported by the loading object. - */ -#define DMUS_E_UNSUPPORTED_STREAM MAKE_DMHRESULTERROR(0x0150) - -/* DMUS_E_ALREADY_INITED - * - * The object has already been initialized. - */ -#define DMUS_E_ALREADY_INITED MAKE_DMHRESULTERROR(0x0151) - -/* DMUS_E_INVALID_BAND - * - * The file does not contain a valid band. - */ -#define DMUS_E_INVALID_BAND MAKE_DMHRESULTERROR(0x0152) - -/* DMUS_E_TRACK_HDR_NOT_FIRST_CK - * - * The IStream* object's data does not have a track header as the first chunk, - * and therefore can not be read by the segment object. - */ -#define DMUS_E_TRACK_HDR_NOT_FIRST_CK MAKE_DMHRESULTERROR(0x0155) - -/* DMUS_E_TOOL_HDR_NOT_FIRST_CK - * - * The IStream* object's data does not have a tool header as the first chunk, - * and therefore can not be read by the graph object. - */ -#define DMUS_E_TOOL_HDR_NOT_FIRST_CK MAKE_DMHRESULTERROR(0x0156) - -/* DMUS_E_INVALID_TRACK_HDR - * - * The IStream* object's data contains an invalid track header (ckid is 0 and - * fccType is NULL,) and therefore can not be read by the segment object. - */ -#define DMUS_E_INVALID_TRACK_HDR MAKE_DMHRESULTERROR(0x0157) - -/* DMUS_E_INVALID_TOOL_HDR - * - * The IStream* object's data contains an invalid tool header (ckid is 0 and - * fccType is NULL,) and therefore can not be read by the graph object. - */ -#define DMUS_E_INVALID_TOOL_HDR MAKE_DMHRESULTERROR(0x0158) - -/* DMUS_E_ALL_TOOLS_FAILED - * - * The graph object was unable to load all tools from the IStream* object data. - * This may be due to errors in the stream, or the tools being incorrectly - * registered on the client. - */ -#define DMUS_E_ALL_TOOLS_FAILED MAKE_DMHRESULTERROR(0x0159) - -/* DMUS_E_ALL_TRACKS_FAILED - * - * The segment object was unable to load all tracks from the IStream* object data. - * This may be due to errors in the stream, or the tracks being incorrectly - * registered on the client. - */ -#define DMUS_E_ALL_TRACKS_FAILED MAKE_DMHRESULTERROR(0x0160) - -/* DMUS_E_NOT_FOUND - * - * The requested item was not contained by the object. - */ -#define DMUS_E_NOT_FOUND MAKE_DMHRESULTERROR(0x0161) - -/* DMUS_E_NOT_INIT - * - * A required object is not initialized or failed to initialize. - */ -#define DMUS_E_NOT_INIT MAKE_DMHRESULTERROR(0x0162) - -/* DMUS_E_TYPE_DISABLED - * - * The requested parameter type is currently disabled. Parameter types may - * be enabled and disabled by certain calls to SetParam(). - */ -#define DMUS_E_TYPE_DISABLED MAKE_DMHRESULTERROR(0x0163) - -/* DMUS_E_TYPE_UNSUPPORTED - * - * The requested parameter type is not supported on the object. - */ -#define DMUS_E_TYPE_UNSUPPORTED MAKE_DMHRESULTERROR(0x0164) - -/* DMUS_E_TIME_PAST - * - * The time is in the past, and the operation can not succeed. - */ -#define DMUS_E_TIME_PAST MAKE_DMHRESULTERROR(0x0165) - -/* DMUS_E_TRACK_NOT_FOUND - * - * The requested track is not contained by the segment. - */ -#define DMUS_E_TRACK_NOT_FOUND MAKE_DMHRESULTERROR(0x0166) - -/* DMUS_E_TRACK_NO_CLOCKTIME_SUPPORT - * - * The track does not support clock time playback or getparam. - */ -#define DMUS_E_TRACK_NO_CLOCKTIME_SUPPORT MAKE_DMHRESULTERROR(0x0167) - -/* DMUS_E_NO_MASTER_CLOCK - * - * There is no master clock in the performance. Be sure to call - * IDirectMusicPerformance::Init(). - */ -#define DMUS_E_NO_MASTER_CLOCK MAKE_DMHRESULTERROR(0x0170) - -/* DMUS_E_LOADER_NOCLASSID - * - * The class id field is required and missing in the DMUS_OBJECTDESC. - */ -#define DMUS_E_LOADER_NOCLASSID MAKE_DMHRESULTERROR(0x0180) - -/* DMUS_E_LOADER_BADPATH - * - * The requested file path is invalid. - */ -#define DMUS_E_LOADER_BADPATH MAKE_DMHRESULTERROR(0x0181) - -/* DMUS_E_LOADER_FAILEDOPEN - * - * File open failed - either file doesn't exist or is locked. - */ -#define DMUS_E_LOADER_FAILEDOPEN MAKE_DMHRESULTERROR(0x0182) - -/* DMUS_E_LOADER_FORMATNOTSUPPORTED - * - * Search data type is not supported. - */ -#define DMUS_E_LOADER_FORMATNOTSUPPORTED MAKE_DMHRESULTERROR(0x0183) - -/* DMUS_E_LOADER_FAILEDCREATE - * - * Unable to find or create object. - */ -#define DMUS_E_LOADER_FAILEDCREATE MAKE_DMHRESULTERROR(0x0184) - -/* DMUS_E_LOADER_OBJECTNOTFOUND - * - * Object was not found. - */ -#define DMUS_E_LOADER_OBJECTNOTFOUND MAKE_DMHRESULTERROR(0x0185) - -/* DMUS_E_LOADER_NOFILENAME - * - * The file name is missing from the DMUS_OBJECTDESC. - */ -#define DMUS_E_LOADER_NOFILENAME MAKE_DMHRESULTERROR(0x0186) - -/* DMUS_E_INVALIDFILE - * - * The file requested is not a valid file. - */ -#define DMUS_E_INVALIDFILE MAKE_DMHRESULTERROR(0x0200) - -/* DMUS_E_ALREADY_EXISTS - * - * The tool is already contained in the graph. Create a new instance. - */ -#define DMUS_E_ALREADY_EXISTS MAKE_DMHRESULTERROR(0x0201) - -/* DMUS_E_OUT_OF_RANGE - * - * Value is out of range, for instance the requested length is longer than - * the segment. - */ -#define DMUS_E_OUT_OF_RANGE MAKE_DMHRESULTERROR(0x0202) - -/* DMUS_E_SEGMENT_INIT_FAILED - * - * Segment initialization failed, most likely due to a critical memory situation. - */ -#define DMUS_E_SEGMENT_INIT_FAILED MAKE_DMHRESULTERROR(0x0203) - -/* DMUS_E_ALREADY_SENT - * - * The DMUS_PMSG has already been sent to the performance object via - * IDirectMusicPerformance::SendPMsg(). - */ -#define DMUS_E_ALREADY_SENT MAKE_DMHRESULTERROR(0x0204) - -/* DMUS_E_CANNOT_FREE - * - * The DMUS_PMSG was either not allocated by the performance via - * IDirectMusicPerformance::AllocPMsg(), or it was already freed via - * IDirectMusicPerformance::FreePMsg(). - */ -#define DMUS_E_CANNOT_FREE MAKE_DMHRESULTERROR(0x0205) - -/* DMUS_E_CANNOT_OPEN_PORT - * - * The default system port could not be opened. - */ -#define DMUS_E_CANNOT_OPEN_PORT MAKE_DMHRESULTERROR(0x0206) - -/* DMUS_E_CANNOT_CONVERT - * - * A call to MIDIToMusic() or MusicToMIDI() resulted in an error because - * the requested conversion could not happen. This usually occurs when the - * provided DMUS_CHORD_KEY structure has an invalid chord or scale pattern. - */ -#define DMUS_E_CANNOT_CONVERT MAKE_DMHRESULTERROR(0x0207) -/* misspelling in previous versions of DirectX preserved for backward compatibility */ -#define DMUS_E_CONNOT_CONVERT DMUS_E_CANNOT_CONVERT - -/* DMUS_E_DESCEND_CHUNK_FAIL - * - * DMUS_E_DESCEND_CHUNK_FAIL is returned when the end of the file - * was reached before the desired chunk was found. - */ -#define DMUS_E_DESCEND_CHUNK_FAIL MAKE_DMHRESULTERROR(0x0210) - -/* DMUS_E_NOT_LOADED - * - * An attempt to use this object failed because it first needs to - * be loaded. - */ -#define DMUS_E_NOT_LOADED MAKE_DMHRESULTERROR(0x0211) - -/* DMUS_E_SCRIPT_LANGUAGE_INCOMPATIBLE - * - * The activeX scripting engine for the script's language is not compatible with - * DirectMusic. - * - */ -#define DMUS_E_SCRIPT_LANGUAGE_INCOMPATIBLE MAKE_DMHRESULTERROR(0x0213) - -/* DMUS_E_SCRIPT_UNSUPPORTED_VARTYPE - * - * A varient was used that had a type that is not supported by DirectMusic. - * - */ -#define DMUS_E_SCRIPT_UNSUPPORTED_VARTYPE MAKE_DMHRESULTERROR(0x0214) - -/* DMUS_E_SCRIPT_ERROR_IN_SCRIPT - * - * An error was encountered while parsing or executing the script. - * The pErrorInfo parameter (if supplied) was filled with information about the error. - */ -#define DMUS_E_SCRIPT_ERROR_IN_SCRIPT MAKE_DMHRESULTERROR(0x0215) - -/* DMUS_E_SCRIPT_CANTLOAD_OLEAUT32 - * - * Loading of oleaut32.dll failed. VBScript and other activeX scripting languages - * require use of oleaut32.dll. On platforms where oleaut32.dll is not present, only - * the DirectMusicScript language, which doesn't require oleaut32.dll can be used. - */ -#define DMUS_E_SCRIPT_CANTLOAD_OLEAUT32 MAKE_DMHRESULTERROR(0x0216) - -/* DMUS_E_SCRIPT_LOADSCRIPT_ERROR - * - * An error occured while parsing a script loaded using LoadScript. The script that - * was loaded contains an error. - */ -#define DMUS_E_SCRIPT_LOADSCRIPT_ERROR MAKE_DMHRESULTERROR(0x0217) - -/* DMUS_E_SCRIPT_INVALID_FILE - * - * The script file is invalid. - */ -#define DMUS_E_SCRIPT_INVALID_FILE MAKE_DMHRESULTERROR(0x0218) - -/* DMUS_E_INVALID_SCRIPTTRACK - * - * The file contains an invalid script track. - */ -#define DMUS_E_INVALID_SCRIPTTRACK MAKE_DMHRESULTERROR(0x0219) - -/* DMUS_E_SCRIPT_VARIABLE_NOT_FOUND - * - * The script does not contain a variable with the specified name. - */ -#define DMUS_E_SCRIPT_VARIABLE_NOT_FOUND MAKE_DMHRESULTERROR(0x021A) - -/* DMUS_E_SCRIPT_ROUTINE_NOT_FOUND - * - * The script does not contain a routine with the specified name. - */ -#define DMUS_E_SCRIPT_ROUTINE_NOT_FOUND MAKE_DMHRESULTERROR(0x021B) - -/* DMUS_E_SCRIPT_CONTENT_READONLY - * - * Scripts variables for content referenced or embedded in a script cannot be set. - */ -#define DMUS_E_SCRIPT_CONTENT_READONLY MAKE_DMHRESULTERROR(0x021C) - -/* DMUS_E_SCRIPT_NOT_A_REFERENCE - * - * Attempt was made to set a script's variable by reference to a value that was - * not an object type. - */ -#define DMUS_E_SCRIPT_NOT_A_REFERENCE MAKE_DMHRESULTERROR(0x021D) - -/* DMUS_E_SCRIPT_VALUE_NOT_SUPPORTED - * - * Attempt was made to set a script's variable by value to an object that does - * not support a default value property. - */ -#define DMUS_E_SCRIPT_VALUE_NOT_SUPPORTED MAKE_DMHRESULTERROR(0x021E) - -/* DMUS_E_INVALID_SEGMENTTRIGGERTRACK - * - * The file contains an invalid segment trigger track. - */ -#define DMUS_E_INVALID_SEGMENTTRIGGERTRACK MAKE_DMHRESULTERROR(0x0220) - -/* DMUS_E_INVALID_LYRICSTRACK - * - * The file contains an invalid lyrics track. - */ -#define DMUS_E_INVALID_LYRICSTRACK MAKE_DMHRESULTERROR(0x0221) - -/* DMUS_E_INVALID_PARAMCONTROLTRACK - * - * The file contains an invalid parameter control track. - */ -#define DMUS_E_INVALID_PARAMCONTROLTRACK MAKE_DMHRESULTERROR(0x0222) - -/* DMUS_E_AUDIOVBSCRIPT_SYNTAXERROR - * - * A script written in AudioVBScript could not be read because it contained a statement that - * is not allowed by the AudioVBScript language. - */ -#define DMUS_E_AUDIOVBSCRIPT_SYNTAXERROR MAKE_DMHRESULTERROR(0x0223) - -/* DMUS_E_AUDIOVBSCRIPT_RUNTIMEERROR - * - * A script routine written in AudioVBScript failed because an invalid operation occurred. For example, - * adding the number 3 to a segment object would produce this error. So would attempting to call a routine - * that doesn't exist. - */ -#define DMUS_E_AUDIOVBSCRIPT_RUNTIMEERROR MAKE_DMHRESULTERROR(0x0224) - -/* DMUS_E_AUDIOVBSCRIPT_OPERATIONFAILURE - * - * A script routine written in AudioVBScript failed because a function outside of a script failed to complete. - * For example, a call to PlaySegment that fails to play because of low memory would return this error. - */ -#define DMUS_E_AUDIOVBSCRIPT_OPERATIONFAILURE MAKE_DMHRESULTERROR(0x0225) - -/* DMUS_E_AUDIOPATHS_NOT_VALID - * - * The Performance has set up some PChannels using the AssignPChannel command, which - * makes it not capable of supporting audio paths. - */ -#define DMUS_E_AUDIOPATHS_NOT_VALID MAKE_DMHRESULTERROR(0x0226) - -/* DMUS_E_AUDIOPATHS_IN_USE - * - * This is the inverse of the previous error. - * The Performance has set up some audio paths, which makes is incompatible - * with the calls to allocate pchannels, etc. - */ -#define DMUS_E_AUDIOPATHS_IN_USE MAKE_DMHRESULTERROR(0x0227) - -/* DMUS_E_NO_AUDIOPATH_CONFIG - * - * A segment or song was asked for its embedded audio path configuration, - * but there isn't any. - */ -#define DMUS_E_NO_AUDIOPATH_CONFIG MAKE_DMHRESULTERROR(0x0228) - -/* DMUS_E_AUDIOPATH_INACTIVE - * - * An audiopath is inactive, perhaps because closedown was called. - */ -#define DMUS_E_AUDIOPATH_INACTIVE MAKE_DMHRESULTERROR(0x0229) - -/* DMUS_E_AUDIOPATH_NOBUFFER - * - * An audiopath failed to create because a requested buffer could not be created. - */ -#define DMUS_E_AUDIOPATH_NOBUFFER MAKE_DMHRESULTERROR(0x022A) - -/* DMUS_E_AUDIOPATH_NOPORT - * - * An audiopath could not be used for playback because it lacked port assignments. - */ -#define DMUS_E_AUDIOPATH_NOPORT MAKE_DMHRESULTERROR(0x022B) - -/* DMUS_E_NO_AUDIOPATH - * - * Attempt was made to play segment in audiopath mode and there was no audiopath. - */ -#define DMUS_E_NO_AUDIOPATH MAKE_DMHRESULTERROR(0x022C) - -/* DMUS_E_INVALIDCHUNK - * - * Invalid data was found in a RIFF file chunk. - */ -#define DMUS_E_INVALIDCHUNK MAKE_DMHRESULTERROR(0x022D) - -/* DMUS_E_AUDIOPATH_NOGLOBALFXBUFFER - * - * Attempt was made to create an audiopath that sends to a global effects buffer which did not exist. - */ -#define DMUS_E_AUDIOPATH_NOGLOBALFXBUFFER MAKE_DMHRESULTERROR(0x022E) - -/* DMUS_E_INVALID_CONTAINER_OBJECT - * - * The file does not contain a valid container object. - */ -#define DMUS_E_INVALID_CONTAINER_OBJECT MAKE_DMHRESULTERROR(0x022F) - -#endif diff --git a/import/DirectX8/include/dmksctrl.h b/import/DirectX8/include/dmksctrl.h deleted file mode 100644 index e0cf392cc..000000000 --- a/import/DirectX8/include/dmksctrl.h +++ /dev/null @@ -1,167 +0,0 @@ -/************************************************************************ -* * -* dmksctrl.h -- Definition of IKsControl * -* * -* Copyright (c) 1998-1999 Microsoft Corporation -* * -* * -* This header file contains the definition of IKsControl, which * -* duplicates definitions from ks.h and ksproxy.h. Your code should * -* include ks.h and ksproxy.h directly if you have them (they are * -* provided in the Windows 98 DDK and will be in the Windows NT 5 * -* SDK). * -* * -************************************************************************/ - -#ifndef _DMKSCTRL_ -#define _DMKSCTRL_ - -#if _MSC_VER >= 1200 -#pragma warning(push) -#endif -#pragma warning(disable:4201) /* Disable warnings on anonymous unions */ - -#include - -#include - -#if !defined(_NTRTL_) - #ifndef DEFINE_GUIDEX - #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name - #endif /* !defined(DEFINE_GUIDEX) */ - - #ifndef STATICGUIDOF - #define STATICGUIDOF(guid) STATIC_##guid - #endif /* !defined(STATICGUIDOF) */ -#endif /* !defined(_NTRTL_) */ - -#ifndef STATIC_IID_IKsControl -#define STATIC_IID_IKsControl\ - 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -#endif /* STATIC_IID_IKsControl */ - -/* - * Warning: This will prevent the rest of ks.h from being pulled in if ks.h is - * included after dmksctrl.h. Make sure you do not include both headers in - * the same source file. - */ -#ifndef _KS_ -#define _KS_ - -#if (defined(_MSC_EXTENSIONS) || defined(__cplusplus)) && !defined(CINTERFACE) -typedef struct { - union { - struct { - GUID Set; - ULONG Id; - ULONG Flags; - }; - LONGLONG Alignment; - }; -} KSIDENTIFIER, *PKSIDENTIFIER; -#else -typedef struct { - union { - struct { - GUID Set; - ULONG Id; - ULONG Flags; - } Data; - LONGLONG Alignment; - }; -} KSIDENTIFIER, *PKSIDENTIFIER; -#endif - -typedef KSIDENTIFIER KSPROPERTY, *PKSPROPERTY, KSMETHOD, *PKSMETHOD, KSEVENT, *PKSEVENT; - -#define KSMETHOD_TYPE_NONE 0x00000000 -#define KSMETHOD_TYPE_READ 0x00000001 -#define KSMETHOD_TYPE_WRITE 0x00000002 -#define KSMETHOD_TYPE_MODIFY 0x00000003 -#define KSMETHOD_TYPE_SOURCE 0x00000004 - -#define KSMETHOD_TYPE_SEND 0x00000001 -#define KSMETHOD_TYPE_SETSUPPORT 0x00000100 -#define KSMETHOD_TYPE_BASICSUPPORT 0x00000200 - -#define KSPROPERTY_TYPE_GET 0x00000001 -#define KSPROPERTY_TYPE_SET 0x00000002 -#define KSPROPERTY_TYPE_SETSUPPORT 0x00000100 -#define KSPROPERTY_TYPE_BASICSUPPORT 0x00000200 -#define KSPROPERTY_TYPE_RELATIONS 0x00000400 -#define KSPROPERTY_TYPE_SERIALIZESET 0x00000800 -#define KSPROPERTY_TYPE_UNSERIALIZESET 0x00001000 -#define KSPROPERTY_TYPE_SERIALIZERAW 0x00002000 -#define KSPROPERTY_TYPE_UNSERIALIZERAW 0x00004000 -#define KSPROPERTY_TYPE_SERIALIZESIZE 0x00008000 -#define KSPROPERTY_TYPE_DEFAULTVALUES 0x00010000 - -#define KSPROPERTY_TYPE_TOPOLOGY 0x10000000 -#endif /* _KS_ */ - -#ifndef _IKsControl_ -#define _IKsControl_ - -#ifdef DECLARE_INTERFACE_ - - -#undef INTERFACE -#define INTERFACE IKsControl -DECLARE_INTERFACE_(IKsControl, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /*IKsControl*/ - STDMETHOD(KsProperty)( - THIS_ - IN PKSPROPERTY Property, - IN ULONG PropertyLength, - IN OUT LPVOID PropertyData, - IN ULONG DataLength, - OUT ULONG* BytesReturned - ) PURE; - STDMETHOD(KsMethod)( - THIS_ - IN PKSMETHOD Method, - IN ULONG MethodLength, - IN OUT LPVOID MethodData, - IN ULONG DataLength, - OUT ULONG* BytesReturned - ) PURE; - STDMETHOD(KsEvent)( - THIS_ - IN PKSEVENT Event OPTIONAL, - IN ULONG EventLength, - IN OUT LPVOID EventData, - IN ULONG DataLength, - OUT ULONG* BytesReturned - ) PURE; -}; - -#endif /* DECLARE_INTERFACE_ */ -#endif /* _IKsControl_ */ - -#include - -DEFINE_GUID(IID_IKsControl, 0x28F54685, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96); - -/* These formats are in ksmedia.h - */ -#ifndef _KSMEDIA_ - -DEFINE_GUID(KSDATAFORMAT_SUBTYPE_MIDI, 0x1D262760L, 0xE957, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00); -DEFINE_GUID(KSDATAFORMAT_SUBTYPE_DIRECTMUSIC, 0x1a82f8bc, 0x3f8b, 0x11d2, 0xb7, 0x74, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1); - -#endif - -#if _MSC_VER >= 1200 -#pragma warning(pop) -#endif - -#endif /* _DMKSCTRL */ - - - diff --git a/import/DirectX8/include/dmo.h b/import/DirectX8/include/dmo.h deleted file mode 100644 index 30cc2e9dd..000000000 --- a/import/DirectX8/include/dmo.h +++ /dev/null @@ -1,29 +0,0 @@ -//------------------------------------------------------------------------------ -// File: DMO.h -// -// Desc: Headers needed by almost all DMOs. -// -// Copyright (c) 1999 - 2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __DMO_H__ -#define __DMO_H__ - - -#include "mediaerr.h" - -// When using ATL we get collisions on Lock, so in this case rename -// IMediaObject::Lock to IMediaObject::DMOLock - -#ifdef FIX_LOCK_NAME -#define Lock DMOLock -#endif -#include "mediaobj.h" -#ifdef FIX_LOCK_NAME -#undef Lock -#endif -#include "dmoreg.h" -#include "dmort.h" - -#endif //__DMO_H__ diff --git a/import/DirectX8/include/dmodshow.h b/import/DirectX8/include/dmodshow.h deleted file mode 100644 index aa62d0af4..000000000 --- a/import/DirectX8/include/dmodshow.h +++ /dev/null @@ -1,176 +0,0 @@ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 6.00.0347 */ -/* Compiler settings for dmodshow.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __dmodshow_h__ -#define __dmodshow_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __IDMOWrapperFilter_FWD_DEFINED__ -#define __IDMOWrapperFilter_FWD_DEFINED__ -typedef interface IDMOWrapperFilter IDMOWrapperFilter; -#endif /* __IDMOWrapperFilter_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "unknwn.h" -#include "objidl.h" -#include "mediaobj.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void * ); - -/* interface __MIDL_itf_dmodshow_0000 */ -/* [local] */ - -DEFINE_GUID(CLSID_DMOWrapperFilter, 0x94297043,0xbd82,0x4dfd,0xb0,0xde,0x81,0x77,0x73,0x9c,0x6d,0x20); -DEFINE_GUID(CLSID_DMOFilterCategory,0xbcd5796c,0xbd52,0x4d30,0xab,0x76,0x70,0xf9,0x75,0xb8,0x91,0x99); - - -extern RPC_IF_HANDLE __MIDL_itf_dmodshow_0000_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_dmodshow_0000_v0_0_s_ifspec; - -#ifndef __IDMOWrapperFilter_INTERFACE_DEFINED__ -#define __IDMOWrapperFilter_INTERFACE_DEFINED__ - -/* interface IDMOWrapperFilter */ -/* [uuid][object] */ - - -EXTERN_C const IID IID_IDMOWrapperFilter; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("52d6f586-9f0f-4824-8fc8-e32ca04930c2") - IDMOWrapperFilter : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Init( - REFCLSID clsidDMO, - REFCLSID catDMO) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDMOWrapperFilterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDMOWrapperFilter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDMOWrapperFilter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDMOWrapperFilter * This); - - HRESULT ( STDMETHODCALLTYPE *Init )( - IDMOWrapperFilter * This, - REFCLSID clsidDMO, - REFCLSID catDMO); - - END_INTERFACE - } IDMOWrapperFilterVtbl; - - interface IDMOWrapperFilter - { - CONST_VTBL struct IDMOWrapperFilterVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDMOWrapperFilter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDMOWrapperFilter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDMOWrapperFilter_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDMOWrapperFilter_Init(This,clsidDMO,catDMO) \ - (This)->lpVtbl -> Init(This,clsidDMO,catDMO) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDMOWrapperFilter_Init_Proxy( - IDMOWrapperFilter * This, - REFCLSID clsidDMO, - REFCLSID catDMO); - - -void __RPC_STUB IDMOWrapperFilter_Init_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDMOWrapperFilter_INTERFACE_DEFINED__ */ - - -/* Additional Prototypes for ALL interfaces */ - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/dmoimpl.h b/import/DirectX8/include/dmoimpl.h deleted file mode 100644 index 8ba6e3a8e..000000000 --- a/import/DirectX8/include/dmoimpl.h +++ /dev/null @@ -1,645 +0,0 @@ -//------------------------------------------------------------------------------ -// File: DMOImpl.h -// -// Desc: Classes to implement a DMO. -// -// Copyright (c) 2000-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef _dmoimpl_h_ -#define _dmoimpl_h_ - -#ifdef _DEBUG -#include -#endif - -// Class to implement a DMO -// -// -// Assumes the number of input and output streams is fixed -// (these are template parameters) -// -// Provides following services: -// -// Basic parameter checking and locking -// Fully implements : -// GetStreamCount -// SetInputType -// SetOutputType -// GetCurrentInputType -// GetCurrentOutputType -// -// Checks if all types are set before streaming -// Automatically calls AllocateStreamingResources before streaming -// if it's not been called already -// Prevents streaming until the types on all non-optional streams -// have been set -// -// -// Derived class implements the following methods : -// -/* - HRESULT InternalGetInputStreamInfo(DWORD dwInputStreamIndex, DWORD *pdwFlags); - HRESULT InternalGetOutputStreamInfo(DWORD dwOutputStreamIndex, DWORD *pdwFlags); - HRESULT InternalCheckInputType(DWORD dwInputStreamIndex, const DMO_MEDIA_TYPE *pmt); - HRESULT InternalCheckOutputType(DWORD dwOutputStreamIndex, const DMO_MEDIA_TYPE *pmt); - HRESULT InternalGetInputType(DWORD dwInputStreamIndex, DWORD dwTypeIndex, - DMO_MEDIA_TYPE *pmt); - HRESULT InternalGetOutputType(DWORD dwOutputStreamIndex, DWORD dwTypeIndex, - DMO_MEDIA_TYPE *pmt); - HRESULT InternalGetInputSizeInfo(DWORD dwInputStreamIndex, DWORD *pcbSize, - DWORD *pcbMaxLookahead, DWORD *pcbAlignment); - HRESULT InternalGetOutputSizeInfo(DWORD dwOutputStreamIndex, DWORD *pcbSize, - DWORD *pcbAlignment); - HRESULT InternalGetInputMaxLatency(DWORD dwInputStreamIndex, REFERENCE_TIME *prtMaxLatency); - HRESULT InternalSetInputMaxLatency(DWORD dwInputStreamIndex, REFERENCE_TIME rtMaxLatency); - HRESULT InternalFlush(); - HRESULT InternalDiscontinuity(DWORD dwInputStreamIndex); - HRESULT InternalAllocateStreamingResources(); - HRESULT InternalFreeStreamingResources(); - HRESULT InternalProcessInput(DWORD dwInputStreamIndex, IMediaBuffer *pBuffer, - DWORD dwFlags, REFERENCE_TIME rtTimestamp, - REFERENCE_TIME rtTimelength); - HRESULT InternalProcessOutput(DWORD dwFlags, DWORD cOutputBufferCount, - DMO_OUTPUT_DATA_BUFFER *pOutputBuffers, - DWORD *pdwStatus); - HRESULT InternalAcceptingInput(DWORD dwInputStreamIndex); - void Lock(); - void Unlock(); - - Notes: - The derived class is meant to do most work to initialize streaming - in AllocateStreamingResources rather than when types are set. - - This centralizes the work to one - clear place based on the types set for all streams. - - The derived class implements locking. - - The derived class implements the IUnknown methods - - Usage example (1 input and 1 output) : - class CMyDMO : public IMediaObjectImpl, - ... -*/ - - -#define INTERNAL_CALL(_T_, _X_) \ - static_cast<_T_ *>(this)->Internal##_X_ - -template -class IMediaObjectImpl : public IMediaObject -{ -private: - // Member variables - struct { - DWORD fTypeSet:1; - DWORD fIncomplete:1; - DMO_MEDIA_TYPE CurrentMediaType; - } m_InputInfo[NUMBEROFINPUTS], m_OutputInfo[NUMBEROFOUTPUTS]; - - bool m_fTypesSet; - bool m_fFlushed; - bool m_fResourcesAllocated; - -protected: - - // Helpers - bool InputTypeSet(DWORD ulInputStreamIndex) const - { - _ASSERTE(ulInputStreamIndex < NUMBEROFINPUTS); - return 0 != m_InputInfo[ulInputStreamIndex].fTypeSet; - } - - bool OutputTypeSet(DWORD ulOutputStreamIndex) const - { - _ASSERTE(ulOutputStreamIndex < NUMBEROFOUTPUTS); - return 0 != m_OutputInfo[ulOutputStreamIndex].fTypeSet; - } - const DMO_MEDIA_TYPE *InputType(DWORD ulInputStreamIndex) - { - if (!InputTypeSet(ulInputStreamIndex)) { - return NULL; - } - return &m_InputInfo[ulInputStreamIndex].CurrentMediaType; - } - const DMO_MEDIA_TYPE *OutputType(DWORD ulOutputStreamIndex) - { - if (!OutputTypeSet(ulOutputStreamIndex)) { - return NULL; - } - return &m_OutputInfo[ulOutputStreamIndex].CurrentMediaType; - } - - - class LockIt - { - public: - LockIt(_DERIVED_ *p) : m_p(p) - { - static_cast<_DERIVED_ *>(m_p)->Lock(); - } - ~LockIt() - { - static_cast<_DERIVED_ *>(m_p)->Unlock(); - } - _DERIVED_ *const m_p; - }; - - bool CheckTypesSet() - { - m_fTypesSet = false; - DWORD dw; - for (dw = 0; dw < NUMBEROFINPUTS; dw++) { - if (!InputTypeSet(dw)) { - return false; - } - } - for (dw = 0; dw < NUMBEROFOUTPUTS; dw++) { - if (!OutputTypeSet(dw)) { - // Check if it's optional - DWORD dwFlags; -#ifdef _DEBUG - dwFlags = 0xFFFFFFFF; -#endif - INTERNAL_CALL(_DERIVED_, GetOutputStreamInfo)(dw, &dwFlags); - _ASSERTE(0 == (dwFlags & ~(DMO_OUTPUT_STREAMF_WHOLE_SAMPLES | - DMO_OUTPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER | - DMO_OUTPUT_STREAMF_FIXED_SAMPLE_SIZE | - DMO_OUTPUT_STREAMF_DISCARDABLE | - DMO_OUTPUT_STREAMF_OPTIONAL))); - if (!(dwFlags & DMO_OUTPUT_STREAMF_OPTIONAL)) { - return false; - } - } - } - m_fTypesSet = true; - return true; - } - - - IMediaObjectImpl() : - m_fTypesSet(false), - m_fFlushed(true), - m_fResourcesAllocated(false) - { - ZeroMemory(&m_InputInfo, sizeof(m_InputInfo)); - ZeroMemory(&m_OutputInfo, sizeof(m_OutputInfo)); - } - - virtual ~IMediaObjectImpl() { - DWORD dwCurrentType; - - for (dwCurrentType = 0; dwCurrentType < NUMBEROFINPUTS; dwCurrentType++) { - if(InputTypeSet(dwCurrentType)) { - MoFreeMediaType(&m_InputInfo[dwCurrentType].CurrentMediaType); - } - } - - for (dwCurrentType = 0; dwCurrentType < NUMBEROFOUTPUTS; dwCurrentType++) { - if(OutputTypeSet(dwCurrentType)) { - MoFreeMediaType(&m_OutputInfo[dwCurrentType].CurrentMediaType); - } - } - } - - - // IMediaObject methods - - - // - // IMediaObject methods - // - STDMETHODIMP GetStreamCount(unsigned long *pulNumberOfInputStreams, unsigned long *pulNumberOfOutputStreams) - { - LockIt lck(static_cast<_DERIVED_ *>(this)); - if (pulNumberOfInputStreams == NULL || - pulNumberOfOutputStreams == NULL) { - return E_POINTER; - } - *pulNumberOfInputStreams = NUMBEROFINPUTS; - *pulNumberOfOutputStreams = NUMBEROFOUTPUTS; - return S_OK; - } - - STDMETHODIMP GetInputStreamInfo(ULONG ulStreamIndex, DWORD *pdwFlags) - { - LockIt lck(static_cast<_DERIVED_ *>(this)); - if (ulStreamIndex >= NUMBEROFINPUTS) { - return DMO_E_INVALIDSTREAMINDEX; - } - if (pdwFlags == NULL) { - return E_POINTER; - } - HRESULT hr = INTERNAL_CALL(_DERIVED_, GetInputStreamInfo)(ulStreamIndex, pdwFlags); - _ASSERTE(0 == (*pdwFlags & ~(DMO_INPUT_STREAMF_WHOLE_SAMPLES | - DMO_INPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER | - DMO_INPUT_STREAMF_FIXED_SAMPLE_SIZE | - DMO_INPUT_STREAMF_HOLDS_BUFFERS))); - return hr; - } - - STDMETHODIMP GetOutputStreamInfo(ULONG ulStreamIndex, DWORD *pdwFlags) - { - LockIt lck(static_cast<_DERIVED_ *>(this)); - if (ulStreamIndex >= NUMBEROFOUTPUTS) { - return DMO_E_INVALIDSTREAMINDEX; - } - if (pdwFlags == NULL) { - return E_POINTER; - } - HRESULT hr = INTERNAL_CALL(_DERIVED_, GetOutputStreamInfo)(ulStreamIndex, pdwFlags); - _ASSERTE(0 == (*pdwFlags & ~(DMO_OUTPUT_STREAMF_WHOLE_SAMPLES | - DMO_OUTPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER | - DMO_OUTPUT_STREAMF_FIXED_SAMPLE_SIZE | - DMO_OUTPUT_STREAMF_DISCARDABLE | - DMO_OUTPUT_STREAMF_OPTIONAL))); - return hr; - } - - STDMETHODIMP GetInputType(ULONG ulStreamIndex, ULONG ulTypeIndex, DMO_MEDIA_TYPE *pmt) { - if (ulStreamIndex >= NUMBEROFINPUTS) { - return DMO_E_INVALIDSTREAMINDEX; - } - LockIt lck(static_cast<_DERIVED_ *>(this)); - return INTERNAL_CALL(_DERIVED_, GetInputType)(ulStreamIndex, ulTypeIndex, pmt); - } - - STDMETHODIMP GetOutputType(ULONG ulStreamIndex, ULONG ulTypeIndex, DMO_MEDIA_TYPE *pmt) { - if (ulStreamIndex >= NUMBEROFOUTPUTS) { - return DMO_E_INVALIDSTREAMINDEX; - } - LockIt lck(static_cast<_DERIVED_ *>(this)); - return INTERNAL_CALL(_DERIVED_, GetOutputType)(ulStreamIndex, ulTypeIndex, pmt); - } - - STDMETHODIMP GetInputCurrentType(ULONG ulStreamIndex, DMO_MEDIA_TYPE *pmt) { - if (ulStreamIndex >= NUMBEROFINPUTS) { - return DMO_E_INVALIDSTREAMINDEX; - } - if (NULL == pmt) { - return E_POINTER; - } - LockIt lck(static_cast<_DERIVED_ *>(this)); - if (InputTypeSet(ulStreamIndex)) - return MoCopyMediaType(pmt, - &m_InputInfo[ulStreamIndex].CurrentMediaType); - else - return DMO_E_TYPE_NOT_SET; - } - - STDMETHODIMP GetOutputCurrentType(ULONG ulStreamIndex, DMO_MEDIA_TYPE *pmt) { - if (ulStreamIndex >= NUMBEROFOUTPUTS) { - return DMO_E_INVALIDSTREAMINDEX; - } - if (NULL == pmt) { - return E_POINTER; - } - LockIt lck(static_cast<_DERIVED_ *>(this)); - if (OutputTypeSet(ulStreamIndex)) - return MoCopyMediaType(pmt, - &m_OutputInfo[ulStreamIndex].CurrentMediaType); - else - return DMO_E_TYPE_NOT_SET; - } - - STDMETHODIMP GetInputSizeInfo(ULONG ulStreamIndex, ULONG *pulSize, ULONG *pcbMaxLookahead, ULONG *pulAlignment) { - if (ulStreamIndex >= NUMBEROFINPUTS) { - return DMO_E_INVALIDSTREAMINDEX; - } - if (NULL == pulSize || NULL == pulAlignment || - NULL == pcbMaxLookahead) { - return E_POINTER; - } - LockIt lck(static_cast<_DERIVED_ *>(this)); - if (!InputTypeSet(ulStreamIndex)) { - return DMO_E_TYPE_NOT_SET; - } - return INTERNAL_CALL(_DERIVED_, GetInputSizeInfo)(ulStreamIndex, pulSize, pcbMaxLookahead, pulAlignment); - } - - STDMETHODIMP GetOutputSizeInfo(ULONG ulStreamIndex, ULONG *pulSize, ULONG *pulAlignment) { - if (ulStreamIndex >= NUMBEROFOUTPUTS) { - return DMO_E_INVALIDSTREAMINDEX; - } - if (NULL == pulSize || NULL == pulAlignment) { - return E_POINTER; - } - LockIt lck(static_cast<_DERIVED_ *>(this)); - if (!m_fTypesSet || !OutputTypeSet(ulStreamIndex)) { - return DMO_E_TYPE_NOT_SET; - } - return INTERNAL_CALL(_DERIVED_, GetOutputSizeInfo)(ulStreamIndex, pulSize, pulAlignment); - } - - STDMETHODIMP SetInputType(ULONG ulStreamIndex, const DMO_MEDIA_TYPE *pmt, DWORD dwFlags) { - if (ulStreamIndex >= NUMBEROFINPUTS) { - return DMO_E_INVALIDSTREAMINDEX; - } - if (dwFlags & ~ (DMO_SET_TYPEF_CLEAR | DMO_SET_TYPEF_TEST_ONLY)) { - return E_INVALIDARG; - } - - LockIt lck(static_cast<_DERIVED_ *>(this)); - - if (dwFlags & DMO_SET_TYPEF_CLEAR) { - MoFreeMediaType(&m_InputInfo[ulStreamIndex].CurrentMediaType); - m_InputInfo[ulStreamIndex].fTypeSet = FALSE; - if (!CheckTypesSet()) { - Flush(); - FreeStreamingResources(); - } - return NOERROR; - } - if (NULL == pmt) { - return E_POINTER; - } - HRESULT hr = INTERNAL_CALL(_DERIVED_, CheckInputType)(ulStreamIndex, pmt); - if (FAILED(hr)) - return hr; - - if (dwFlags & DMO_SET_TYPEF_TEST_ONLY) { - return NOERROR; - } - - - // actually set the type - DMO_MEDIA_TYPE mtTemp; - if (S_OK == MoCopyMediaType(&mtTemp, pmt)) { - // Free any previous mediatype - if (InputTypeSet(ulStreamIndex)) { - MoFreeMediaType(&m_InputInfo[ulStreamIndex].CurrentMediaType); - } - m_InputInfo[ulStreamIndex].CurrentMediaType = mtTemp; - m_InputInfo[ulStreamIndex].fTypeSet = TRUE; - CheckTypesSet(); - } else { - return E_OUTOFMEMORY; - } - - return NOERROR; - } - - STDMETHODIMP SetOutputType(ULONG ulStreamIndex, const DMO_MEDIA_TYPE *pmt, DWORD dwFlags) { - if (ulStreamIndex >= NUMBEROFOUTPUTS) { - return DMO_E_INVALIDSTREAMINDEX; - } - if (dwFlags & ~ (DMO_SET_TYPEF_CLEAR | DMO_SET_TYPEF_TEST_ONLY)) { - return E_INVALIDARG; - } - - LockIt lck(static_cast<_DERIVED_ *>(this)); - - if (dwFlags & DMO_SET_TYPEF_CLEAR) { - MoFreeMediaType(&m_OutputInfo[ulStreamIndex].CurrentMediaType); - m_OutputInfo[ulStreamIndex].fTypeSet = FALSE; - if (!CheckTypesSet()) { - Flush(); - FreeStreamingResources(); - } - return NOERROR; - } - if (NULL == pmt) { - return E_POINTER; - } - HRESULT hr = INTERNAL_CALL(_DERIVED_, CheckOutputType)(ulStreamIndex, pmt); - if (FAILED(hr)) { - return hr; - } - - if (dwFlags & DMO_SET_TYPEF_TEST_ONLY) { - return NOERROR; - } - - - // actually set the type - DMO_MEDIA_TYPE mtTemp; - if (S_OK == MoCopyMediaType(&mtTemp, pmt)) { - // Free any previous mediatype - if (OutputTypeSet(ulStreamIndex)) { - MoFreeMediaType(&m_OutputInfo[ulStreamIndex].CurrentMediaType); - } - m_OutputInfo[ulStreamIndex].CurrentMediaType = mtTemp; - m_OutputInfo[ulStreamIndex].fTypeSet = TRUE; - CheckTypesSet(); - } else { - return E_OUTOFMEMORY; - } - - return NOERROR; - } - - STDMETHODIMP GetInputStatus( - ULONG ulStreamIndex, - DWORD *pdwStatus - ) { - if (ulStreamIndex >= NUMBEROFINPUTS) { - return DMO_E_INVALIDSTREAMINDEX; - } - if (NULL == pdwStatus) { - return E_POINTER; - } - *pdwStatus = 0; - - LockIt lck(static_cast<_DERIVED_ *>(this)); - - if (!m_fTypesSet) { - return DMO_E_TYPE_NOT_SET; - } - - if (INTERNAL_CALL(_DERIVED_, AcceptingInput)(ulStreamIndex) == S_OK) { - *pdwStatus |= DMO_INPUT_STATUSF_ACCEPT_DATA; - } - return NOERROR; - } - - STDMETHODIMP GetInputMaxLatency(unsigned long ulStreamIndex, REFERENCE_TIME *prtLatency) { - - if (prtLatency == NULL) { - return E_POINTER; - } - if (ulStreamIndex >= NUMBEROFINPUTS) { - return DMO_E_INVALIDSTREAMINDEX; - } - - LockIt lck(static_cast<_DERIVED_ *>(this)); - - return INTERNAL_CALL(_DERIVED_, GetInputMaxLatency)(ulStreamIndex, prtLatency); - } - - STDMETHODIMP SetInputMaxLatency(unsigned long ulStreamIndex, REFERENCE_TIME rtLatency) { - if (ulStreamIndex >= NUMBEROFINPUTS) { - return DMO_E_INVALIDSTREAMINDEX; - } - - LockIt lck(static_cast<_DERIVED_ *>(this)); - - return INTERNAL_CALL(_DERIVED_, SetInputMaxLatency)(ulStreamIndex, rtLatency); - } - - STDMETHODIMP Discontinuity(ULONG ulStreamIndex) { - if (ulStreamIndex >= NUMBEROFINPUTS) { - return DMO_E_INVALIDSTREAMINDEX; - } - - LockIt lck(static_cast<_DERIVED_ *>(this)); - - if (!m_fTypesSet) { - return DMO_E_TYPE_NOT_SET; - } - - if (S_OK != INTERNAL_CALL(_DERIVED_, AcceptingInput)(ulStreamIndex)) { - return DMO_E_NOTACCEPTING; - } - - return INTERNAL_CALL(_DERIVED_, Discontinuity)(ulStreamIndex); - } - - STDMETHODIMP Flush() - { - LockIt lck(static_cast<_DERIVED_ *>(this)); - - if (!m_fTypesSet) { - return S_OK; - } - if (m_fFlushed) { - return S_OK; - } - HRESULT hr = INTERNAL_CALL(_DERIVED_, Flush)(); - m_fFlushed = true; - return hr; - } - - STDMETHODIMP AllocateStreamingResources() { - LockIt lck(static_cast<_DERIVED_ *>(this)); - if (!m_fTypesSet) { - return DMO_E_TYPE_NOT_SET; - } - if (m_fResourcesAllocated) { - return S_OK; - } - HRESULT hr = INTERNAL_CALL(_DERIVED_, AllocateStreamingResources)(); - if (SUCCEEDED(hr)) { - m_fResourcesAllocated = true; - } - return hr; - } - - STDMETHODIMP FreeStreamingResources() - { - LockIt lck(static_cast<_DERIVED_ *>(this)); - if (m_fResourcesAllocated) { - m_fResourcesAllocated = false; - INTERNAL_CALL(_DERIVED_, Flush)(); - return INTERNAL_CALL(_DERIVED_, FreeStreamingResources)(); - } - return S_OK; - } - - // - // Processing methods - public entry points - // - STDMETHODIMP ProcessInput( - DWORD ulStreamIndex, - IMediaBuffer *pBuffer, // [in], must not be NULL - DWORD dwFlags, // [in] - discontinuity, timestamp, etc. - REFERENCE_TIME rtTimestamp, // [in], valid if flag set - REFERENCE_TIME rtTimelength // [in], valid if flag set - ) { - if (!pBuffer) { - return E_POINTER; - } - if (ulStreamIndex >= NUMBEROFINPUTS) { - return DMO_E_INVALIDSTREAMINDEX; - } - if (dwFlags & ~(DMO_INPUT_DATA_BUFFERF_SYNCPOINT | - DMO_INPUT_DATA_BUFFERF_TIME | - DMO_INPUT_DATA_BUFFERF_TIMELENGTH)) { - return E_INVALIDARG; - } - - LockIt lck(static_cast<_DERIVED_ *>(this)); - - // Make sure all streams have media types set and resources are allocated - HRESULT hr = AllocateStreamingResources(); - if (FAILED(hr)) { - return hr; - } - if (INTERNAL_CALL(_DERIVED_, AcceptingInput)(ulStreamIndex) != S_OK) { - return DMO_E_NOTACCEPTING; - } - - m_fFlushed = false; - - return INTERNAL_CALL(_DERIVED_, ProcessInput)( - ulStreamIndex, - pBuffer, - dwFlags, - rtTimestamp, - rtTimelength); - } - - STDMETHODIMP ProcessOutput( - DWORD dwFlags, - DWORD ulOutputBufferCount, - DMO_OUTPUT_DATA_BUFFER *pOutputBuffers, - DWORD *pdwStatus) - { - if (pdwStatus == NULL) { - return E_POINTER; - } - - - if (ulOutputBufferCount != NUMBEROFOUTPUTS || (dwFlags & ~DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER)) { - return E_INVALIDARG; - } - - if (NUMBEROFOUTPUTS != 0 && pOutputBuffers == NULL) { - return E_POINTER; - } - - *pdwStatus = 0; - - LockIt lck(static_cast<_DERIVED_ *>(this)); - - HRESULT hr = AllocateStreamingResources(); - if (FAILED(hr)) { - return hr; - } - - for (DWORD dw = 0; dw < NUMBEROFOUTPUTS; dw++) { - pOutputBuffers[dw].dwStatus = 0; - } - - hr = INTERNAL_CALL(_DERIVED_, ProcessOutput)( - dwFlags, - ulOutputBufferCount, - pOutputBuffers, - pdwStatus); - - // remember the DMO's incomplete status - for (dw = 0; dw < NUMBEROFOUTPUTS; dw++) { - if (pOutputBuffers[dw].dwStatus & DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE) { - m_OutputInfo[dw].fIncomplete = TRUE; - } else { - m_OutputInfo[dw].fIncomplete = FALSE; - } - } - - return hr; - } - - STDMETHODIMP DMOLock(LONG lLock) - { - if (lLock) { - static_cast<_DERIVED_ *>(this)->Lock(); - } else { - static_cast<_DERIVED_ *>(this)->Unlock(); - } - return S_OK; - } -}; - -#endif // _dmoimpl_h_ - diff --git a/import/DirectX8/include/dmoreg.h b/import/DirectX8/include/dmoreg.h deleted file mode 100644 index 6c6c22f7b..000000000 --- a/import/DirectX8/include/dmoreg.h +++ /dev/null @@ -1,110 +0,0 @@ -//------------------------------------------------------------------------------ -// File: DMOReg.h -// -// Desc: -// -// Copyright (c) 1999 - 2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __DMOREG_H__ -#define __DMOREG_H__ - -#include "mediaobj.h" - - -// 57f2db8b-e6bb-4513-9d43-dcd2a6593125 -DEFINE_GUID(DMOCATEGORY_AUDIO_DECODER, 0x57f2db8b,0xe6bb,0x4513,0x9d,0x43,0xdc,0xd2,0xa6,0x59,0x31,0x25); -// 33D9A761-90C8-11d0-BD43-00A0C911CE86 -DEFINE_GUID(DMOCATEGORY_AUDIO_ENCODER, 0x33D9A761,0x90C8,0x11d0,0xBD,0x43,0x00,0xA0,0xC9,0x11,0xCE,0x86); -// 4a69b442-28be-4991-969c-b500adf5d8a8 -DEFINE_GUID(DMOCATEGORY_VIDEO_DECODER, 0x4a69b442,0x28be,0x4991,0x96,0x9c,0xb5,0x00,0xad,0xf5,0xd8,0xa8); -// 33D9A760-90C8-11d0-BD43-00A0C911CE86 -DEFINE_GUID(DMOCATEGORY_VIDEO_ENCODER, 0x33D9A760,0x90C8,0x11d0,0xBD,0x43,0x00,0xA0,0xC9,0x11,0xCE,0x86); -// f3602b3f-0592-48df-a4cd-674721e7ebeb -DEFINE_GUID(DMOCATEGORY_AUDIO_EFFECT, 0xf3602b3f,0x0592,0x48df,0xa4,0xcd,0x67,0x47,0x21,0xe7,0xeb,0xeb); -// d990ee14-776c-4723-be46-3da2f56f10b9 -DEFINE_GUID(DMOCATEGORY_VIDEO_EFFECT, 0xd990ee14,0x776c,0x4723,0xbe,0x46,0x3d,0xa2,0xf5,0x6f,0x10,0xb9); -// f665aaba-3e09-4920-aa5f-219811148f09 -DEFINE_GUID(DMOCATEGORY_AUDIO_CAPTURE_EFFECT, 0xf665aaba,0x3e09,0x4920,0xaa,0x5f,0x21,0x98,0x11,0x14,0x8f,0x09); - -// Acoustic Echo Canceller {BF963D80-C559-11D0-8A2B-00A0C9255AC1} -// Matches KSNODETYPE_ACOUSTIC_ECHO_CANCEL in ksmedia.h -DEFINE_GUID(DMOCATEGORY_ACOUSTIC_ECHO_CANCEL, 0xBF963D80L, 0xC559, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1); - -// Noise Supression {E07F903F-62FD-4e60-8CDD-DEA7236665B5} -// Matches KSNODETYPE_AUDIO_NOISE_SUPPRESS in post Windows ME DDK's ksmedia.h -DEFINE_GUID(DMOCATEGORY_AUDIO_NOISE_SUPPRESS, 0xe07f903f, 0x62fd, 0x4e60, 0x8c, 0xdd, 0xde, 0xa7, 0x23, 0x66, 0x65, 0xb5); - -// Automatic Gain Control {E88C9BA0-C557-11D0-8A2B-00A0C9255AC1} -// Matches KSNODETYPE_AGC in ksmedia.h -DEFINE_GUID(DMOCATEGORY_AGC, 0xE88C9BA0L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1); - -typedef struct _DMO_PARTIAL_MEDIATYPE { - GUID type; - GUID subtype; -} DMO_PARTIAL_MEDIATYPE, *PDMO_PARTIAL_MEDIATYPE; - -enum DMO_REGISTER_FLAGS { - DMO_REGISTERF_IS_KEYED = 0x00000001 -}; - -enum DMO_ENUM_FLAGS { - DMO_ENUMF_INCLUDE_KEYED = 0x00000001 -}; - -STDAPI DMORegister( - LPCWSTR szName, - REFCLSID clsidDMO, - REFGUID guidCategory, - DWORD dwFlags, // DMO_REGISTERF_XXX - // - // Register all mediatypes supported by the object. This carries no - // information about which combinations of input/output types would - // actually work. - // - DWORD cInTypes, - const DMO_PARTIAL_MEDIATYPE *pInTypes, - DWORD cOutTypes, - const DMO_PARTIAL_MEDIATYPE *pOutTypes -); - -STDAPI DMOUnregister( - REFCLSID clsidDMO, - REFGUID guidCategory // optional - GUID_NULL means unregister from all -); - -STDAPI DMOEnum( - REFGUID guidCategory, // GUID_NULL for "all" - DWORD dwFlags, // DMO_ENUMF_XXX - // - // Enumerate only objects that support at least one of the specified input types - // and at least one of the specified output types. If no input types are specified, - // enumerate objects regardless of what input types they support. Same for - // output types. - // - DWORD cInTypes, - const DMO_PARTIAL_MEDIATYPE *pInTypes, // can be NULL only of ulInTypes = 0 - DWORD cOutTypes, - const DMO_PARTIAL_MEDIATYPE *pOutTypes, // can be NULL only of ulOutTypes = 0 - // - // Output parameter - this receives a pointer to the DMO CLSID enumerator - // - IEnumDMO **ppEnum -); - -STDAPI DMOGetTypes( - REFCLSID clsidDMO, - unsigned long ulInputTypesRequested, - unsigned long *pulInputTypesSupplied, - DMO_PARTIAL_MEDIATYPE *pInputTypes, - unsigned long ulOutputTypesRequested, - unsigned long *pulOutputTypesSupplied, - DMO_PARTIAL_MEDIATYPE *pOutputTypes -); - -STDAPI DMOGetName( - REFCLSID clsidDMO, - WCHAR szName[80] -); -#endif //__DMOREG_H__ diff --git a/import/DirectX8/include/dmort.h b/import/DirectX8/include/dmort.h deleted file mode 100644 index cfe25a4a0..000000000 --- a/import/DirectX8/include/dmort.h +++ /dev/null @@ -1,75 +0,0 @@ -//------------------------------------------------------------------------------ -// File: DMORt.h -// -// Desc: Miscellaneous runtime support for DirectShow Media Objects -// -// Copyright (c) 1999 - 2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __DMORT_H__ -#define __DMORT_H__ - -// -// Mediatype helpers. MoInitMediaType() goes with MoFreeMediaType(), and -// MoCreateMediaType() goes with MoDeleteMediaType(). Don't mix them! -// - - - -// -// Takes a pointer to an already allocated DMO_MEDIA_TYPE structure, allocates -// a format block of cbFormat bytes, and sets appropriate members of -// DMO_MEDIA_TYPE to point to the newly allocated format block. Also -// initializes the IUnknown pointer inside DMO_MEDIA_TYPE to NULL. -// -// The format block allocated by MoInitMediaType must be freed by calling -// MoFreeMediaType(). -// -STDAPI MoInitMediaType(DMO_MEDIA_TYPE *pmt, DWORD cbFormat); - -// -// Frees the format block and releases any IUnknown, but does not free the -// DMO_MEDIA_TYPE structure itself. Input parameter must point to an -// DMO_MEDIA_TYPE structure previously initialized by MoInitMediaType(). -// -STDAPI MoFreeMediaType(DMO_MEDIA_TYPE *pmt); - -// -// Copies the DMO_MEDIA_TYPE members. Also duplicates the format block and -// the IUnknown pointer. Both parameters must point to valid DMO_MEDIA_TYPE -// structures. Target structure must be later freed using MoFreeMediaType(). -// -STDAPI MoCopyMediaType(DMO_MEDIA_TYPE *pmtDest, const DMO_MEDIA_TYPE *pmtSrc); - - - -// -// Allocates a new DMO_MEDIA_TYPE structure and initializes it just like -// MoInitMediaType. I.e., this function allocates both the format block -// and the DMO_MEDIA_TYPE structure itself. Pointer to DMO_MEDIA_TYPE is -// returned as *ppmt. -// -// DMO_MEDIA_TYPE structures allocated by MoCreateMediaType() must be freed -// by calling MoDeleteMediaType(). -// -STDAPI MoCreateMediaType(DMO_MEDIA_TYPE **ppmt, DWORD cbFormat); - -// -// Frees any format block, releases any IUnknown, and deletes the -// DMO_MEDIA_TYPE structure itself. The input parameter must point to an -// DMO_MEDIA_TYPE structure previously allocated by MoCreateMediaType(). -// -STDAPI MoDeleteMediaType(DMO_MEDIA_TYPE *pmt); - -// -// Allocates a new DMO_MEDIA_TYPE structure and copies pmtSrc into it like -// MoCopyMediaType. I.e., this function allocates a new DMO_MEDIA_TYPE struct -// as well as a new format block for the target mediatype. Trager mediatype -// must later be freed using MoDeleteMediaType(). -// -STDAPI MoDuplicateMediaType(DMO_MEDIA_TYPE **ppmtDest, const DMO_MEDIA_TYPE *pmtSrc); - - - -#endif //__DMORT_H__ diff --git a/import/DirectX8/include/dmplugin.h b/import/DirectX8/include/dmplugin.h deleted file mode 100644 index 821ef7d60..000000000 --- a/import/DirectX8/include/dmplugin.h +++ /dev/null @@ -1,281 +0,0 @@ -/************************************************************************ -* * -* dmplugin.h -- This module contains the API for plugins for the * -* DirectMusic performance layer * -* * -* Copyright (c) 1998-1999 Microsoft Corporation * -* * -************************************************************************/ - -#ifndef _DMPLUGIN_ -#define _DMPLUGIN_ - -#include - -#define COM_NO_WINDOWS_H -#include - -#include -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -interface IDirectMusicTrack; -interface IDirectMusicTool; -interface IDirectMusicTool8; -interface IDirectMusicTrack8; -interface IDirectMusicPerformance; -interface IDirectMusicPerformance8; -interface IDirectMusicSegment; -interface IDirectMusicSegment8; -interface IDirectMusicSegmentState; -interface IDirectMusicSegmentState8; -interface IDirectMusicGraph; -#ifndef __cplusplus -typedef interface IDirectMusicTrack IDirectMusicTrack; -typedef interface IDirectMusicTool IDirectMusicTool; -typedef interface IDirectMusicTool8 IDirectMusicTool8; -typedef interface IDirectMusicTrack8 IDirectMusicTrack8; -typedef interface IDirectMusicPerformance IDirectMusicPerformance; -typedef interface IDirectMusicPerformance8 IDirectMusicPerformance8; -typedef interface IDirectMusicSegment IDirectMusicSegment; -typedef interface IDirectMusicSegment8 IDirectMusicSegment8; -typedef interface IDirectMusicSegmentState IDirectMusicSegmentState; -typedef interface IDirectMusicSegmentState8 IDirectMusicSegmentState8; -typedef interface IDirectMusicGraph IDirectMusicGraph; -#endif - -typedef struct _DMUS_PMSG DMUS_PMSG; -typedef long MUSIC_TIME; - -/* Registry location for tools */ -#define DMUS_REGSTR_PATH_TOOLS "Software\\Microsoft\\DirectMusic\\Tools" - -/*//////////////////////////////////////////////////////////////////// -// IDirectMusicTool */ -#undef INTERFACE -#define INTERFACE IDirectMusicTool -DECLARE_INTERFACE_(IDirectMusicTool, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicTool */ - STDMETHOD(Init) (THIS_ IDirectMusicGraph* pGraph) PURE; - STDMETHOD(GetMsgDeliveryType) (THIS_ DWORD* pdwDeliveryType ) PURE; - STDMETHOD(GetMediaTypeArraySize)(THIS_ DWORD* pdwNumElements ) PURE; - STDMETHOD(GetMediaTypes) (THIS_ DWORD** padwMediaTypes, - DWORD dwNumElements) PURE; - STDMETHOD(ProcessPMsg) (THIS_ IDirectMusicPerformance* pPerf, - DMUS_PMSG* pPMSG) PURE; - STDMETHOD(Flush) (THIS_ IDirectMusicPerformance* pPerf, - DMUS_PMSG* pPMSG, - REFERENCE_TIME rtTime) PURE; -}; - -/*//////////////////////////////////////////////////////////////////// -// IDirectMusicTool8 */ -#undef INTERFACE -#define INTERFACE IDirectMusicTool8 -DECLARE_INTERFACE_(IDirectMusicTool8, IDirectMusicTool) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicTool */ - STDMETHOD(Init) (THIS_ IDirectMusicGraph* pGraph) PURE; - STDMETHOD(GetMsgDeliveryType) (THIS_ DWORD* pdwDeliveryType ) PURE; - STDMETHOD(GetMediaTypeArraySize)(THIS_ DWORD* pdwNumElements ) PURE; - STDMETHOD(GetMediaTypes) (THIS_ DWORD** padwMediaTypes, - DWORD dwNumElements) PURE; - STDMETHOD(ProcessPMsg) (THIS_ IDirectMusicPerformance* pPerf, - DMUS_PMSG* pPMSG) PURE; - STDMETHOD(Flush) (THIS_ IDirectMusicPerformance* pPerf, - DMUS_PMSG* pPMSG, - REFERENCE_TIME rtTime) PURE; - /* IDirectMusicTool8 */ - STDMETHOD(Clone) (THIS_ IDirectMusicTool ** ppTool) PURE; -}; - - -/* The following flags are sent in the IDirectMusicTrack::Play() method */ -/* inside the dwFlags parameter */ -typedef enum enumDMUS_TRACKF_FLAGS -{ - DMUS_TRACKF_SEEK = 1, /* set on a seek */ - DMUS_TRACKF_LOOP = 2, /* set on a loop (repeat) */ - DMUS_TRACKF_START = 4, /* set on first call to Play */ - DMUS_TRACKF_FLUSH = 8, /* set when this call is in response to a flush on the perfomance */ - DMUS_TRACKF_DIRTY = 0x10, /* set when the track should consider any cached values from a previous call to GetParam to be invalidated */ - /* The following flags are DX8 only. */ - DMUS_TRACKF_NOTIFY_OFF = 0x20, /* tells track not to send notifications. */ - DMUS_TRACKF_PLAY_OFF = 0x40, /* tells track not to play anything (but can still send notifications.) */ - DMUS_TRACKF_LOOPEND = 0x80, /* set when the end of range is also a loop end. */ - DMUS_TRACKF_STOP = 0x100, /* set when the end of range is also end of playing this segment. */ - DMUS_TRACKF_RECOMPOSE = 0x200, /* set to indicate the track should compose. */ - DMUS_TRACKF_CLOCK = 0x400, /* set when time parameters are in reference (clock) time. Only valid for PlayEx(). */ -} DMUS_TRACKF_FLAGS; - -/* The following flags are sent in the IDirectMusicTrack8::GetParamEx() and SetParamEx() methods */ -/* inside the dwFlags parameter */ -#define DMUS_TRACK_PARAMF_CLOCK 0x01 /* set when the time is measured is in reference (clock) time */ - -/*//////////////////////////////////////////////////////////////////// -// IDirectMusicTrack */ -#undef INTERFACE -#define INTERFACE IDirectMusicTrack -DECLARE_INTERFACE_(IDirectMusicTrack, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicTrack */ - STDMETHOD(Init) (THIS_ IDirectMusicSegment* pSegment) PURE; - STDMETHOD(InitPlay) (THIS_ IDirectMusicSegmentState* pSegmentState, - IDirectMusicPerformance* pPerformance, - void** ppStateData, - DWORD dwVirtualTrackID, - DWORD dwFlags) PURE; - STDMETHOD(EndPlay) (THIS_ void* pStateData) PURE; - STDMETHOD(Play) (THIS_ void* pStateData, - MUSIC_TIME mtStart, - MUSIC_TIME mtEnd, - MUSIC_TIME mtOffset, - DWORD dwFlags, - IDirectMusicPerformance* pPerf, - IDirectMusicSegmentState* pSegSt, - DWORD dwVirtualID) PURE; - STDMETHOD(GetParam) (THIS_ REFGUID rguidType, - MUSIC_TIME mtTime, - MUSIC_TIME* pmtNext, - void* pParam) PURE; - STDMETHOD(SetParam) (THIS_ REFGUID rguidType, - MUSIC_TIME mtTime, - void* pParam) PURE; - STDMETHOD(IsParamSupported) (THIS_ REFGUID rguidType) PURE; - STDMETHOD(AddNotificationType) (THIS_ REFGUID rguidNotificationType) PURE; - STDMETHOD(RemoveNotificationType) (THIS_ REFGUID rguidNotificationType) PURE; - STDMETHOD(Clone) (THIS_ MUSIC_TIME mtStart, - MUSIC_TIME mtEnd, - IDirectMusicTrack** ppTrack) PURE; -}; - -/*//////////////////////////////////////////////////////////////////// -// IDirectMusicTrack8 */ -#undef INTERFACE -#define INTERFACE IDirectMusicTrack8 -DECLARE_INTERFACE_(IDirectMusicTrack8, IDirectMusicTrack) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicTrack */ - STDMETHOD(Init) (THIS_ IDirectMusicSegment* pSegment) PURE; - STDMETHOD(InitPlay) (THIS_ IDirectMusicSegmentState* pSegmentState, - IDirectMusicPerformance* pPerformance, - void** ppStateData, - DWORD dwVirtualTrackID, - DWORD dwFlags) PURE; - STDMETHOD(EndPlay) (THIS_ void* pStateData) PURE; - STDMETHOD(Play) (THIS_ void* pStateData, - MUSIC_TIME mtStart, - MUSIC_TIME mtEnd, - MUSIC_TIME mtOffset, - DWORD dwFlags, - IDirectMusicPerformance* pPerf, - IDirectMusicSegmentState* pSegSt, - DWORD dwVirtualID) PURE; - STDMETHOD(GetParam) (THIS_ REFGUID rguidType, - MUSIC_TIME mtTime, - MUSIC_TIME* pmtNext, - void* pParam) PURE; - STDMETHOD(SetParam) (THIS_ REFGUID rguidType, - MUSIC_TIME mtTime, - void* pParam) PURE; - STDMETHOD(IsParamSupported) (THIS_ REFGUID rguidType) PURE; - STDMETHOD(AddNotificationType) (THIS_ REFGUID rguidNotificationType) PURE; - STDMETHOD(RemoveNotificationType) (THIS_ REFGUID rguidNotificationType) PURE; - STDMETHOD(Clone) (THIS_ MUSIC_TIME mtStart, - MUSIC_TIME mtEnd, - IDirectMusicTrack** ppTrack) PURE; - /* IDirectMusicTrack8 */ - STDMETHOD(PlayEx) (THIS_ void* pStateData, - REFERENCE_TIME rtStart, - REFERENCE_TIME rtEnd, - REFERENCE_TIME rtOffset, - DWORD dwFlags, - IDirectMusicPerformance* pPerf, - IDirectMusicSegmentState* pSegSt, - DWORD dwVirtualID) PURE; - STDMETHOD(GetParamEx) (THIS_ REFGUID rguidType, /* Command type. */ - REFERENCE_TIME rtTime, /* Time, in ref time if dwFlags == DMUS_TRACK_PARAMF_CLOCK. Otherwise, music time. */ - REFERENCE_TIME* prtNext, /* Time of next parameter, relative to rtTime, in music or clock time units. */ - void* pParam, /* Pointer to the parameter data. */ - void * pStateData, /* State data for track instance. */ - DWORD dwFlags) PURE; /* Control flags. */ - STDMETHOD(SetParamEx) (THIS_ REFGUID rguidType, - REFERENCE_TIME rtTime, - void* pParam, /* Pointer to the parameter data. */ - void * pStateData, /* State data for track instance. */ - DWORD dwFlags) PURE; /* Control flags. */ - STDMETHOD(Compose) (THIS_ IUnknown* pContext, /* Context for composition (song or segment) */ - DWORD dwTrackGroup, - IDirectMusicTrack** ppResultTrack) PURE; - STDMETHOD(Join) (THIS_ IDirectMusicTrack* pNewTrack, - MUSIC_TIME mtJoin, - IUnknown* pContext, /* Context for joining (song or segment) */ - DWORD dwTrackGroup, - IDirectMusicTrack** ppResultTrack) PURE; -}; - -/* CLSID's */ -DEFINE_GUID(CLSID_DirectMusicTempoTrack,0xd2ac2885, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicSeqTrack,0xd2ac2886, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicSysExTrack,0xd2ac2887, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicTimeSigTrack,0xd2ac2888, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicChordTrack,0xd2ac288b, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicCommandTrack,0xd2ac288c, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicStyleTrack,0xd2ac288d, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicMotifTrack,0xd2ac288e, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicSignPostTrack,0xf17e8672, 0xc3b4, 0x11d1, 0x87, 0xb, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicBandTrack,0xd2ac2894, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicChordMapTrack,0xd2ac2896, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicMuteTrack,0xd2ac2898, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* New CLSID's for DX8 */ -DEFINE_GUID(CLSID_DirectMusicScriptTrack,0x4108fa85, 0x3586, 0x11d3, 0x8b, 0xd7, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xb6); /* {4108FA85-3586-11d3-8BD7-00600893B1B6} */ -DEFINE_GUID(CLSID_DirectMusicMarkerTrack,0x55a8fd00, 0x4288, 0x11d3, 0x9b, 0xd1, 0x8a, 0xd, 0x61, 0xc8, 0x88, 0x35); -DEFINE_GUID(CLSID_DirectMusicSegmentTriggerTrack, 0xbae4d665, 0x4ea1, 0x11d3, 0x8b, 0xda, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xb6); /* {BAE4D665-4EA1-11d3-8BDA-00600893B1B6} */ -DEFINE_GUID(CLSID_DirectMusicLyricsTrack, 0x995c1cf5, 0x54ff, 0x11d3, 0x8b, 0xda, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xb6); /* {995C1CF5-54FF-11d3-8BDA-00600893B1B6} */ -DEFINE_GUID(CLSID_DirectMusicParamControlTrack, 0x4be0537b, 0x5c19, 0x11d3, 0x8b, 0xdc, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xb6); /* {4BE0537B-5C19-11d3-8BDC-00600893B1B6} */ -DEFINE_GUID(CLSID_DirectMusicMelodyFormulationTrack, 0xb0684266, 0xb57f, 0x11d2, 0x97, 0xf9, 0x0, 0xc0, 0x4f, 0xa3, 0x6e, 0x58); -DEFINE_GUID(CLSID_DirectMusicWaveTrack,0xeed36461, 0x9ea5, 0x11d3, 0x9b, 0xd1, 0x0, 0x80, 0xc7, 0x15, 0xa, 0x74); - -/* IID's */ -DEFINE_GUID(IID_IDirectMusicTrack, 0xf96029a1, 0x4282, 0x11d2, 0x87, 0x17, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(IID_IDirectMusicTool,0xd2ac28ba, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Interface IDs for DX8 */ -/* changed interfaces (GUID only) */ -DEFINE_GUID(IID_IDirectMusicTool8, 0xe674303, 0x3b05, 0x11d3, 0x9b, 0xd1, 0xf9, 0xe7, 0xf0, 0xa0, 0x15, 0x36); -DEFINE_GUID(IID_IDirectMusicTrack8, 0xe674304, 0x3b05, 0x11d3, 0x9b, 0xd1, 0xf9, 0xe7, 0xf0, 0xa0, 0x15, 0x36); - -#ifdef __cplusplus -}; /* extern "C" */ -#endif - -#include - -#endif /* #ifndef _DMPLUGIN_ */ diff --git a/import/DirectX8/include/dmusbuff.h b/import/DirectX8/include/dmusbuff.h deleted file mode 100644 index 548845381..000000000 --- a/import/DirectX8/include/dmusbuff.h +++ /dev/null @@ -1,41 +0,0 @@ -/*************************************************************************** -* * -* DMusBuff.h -- This module defines the buffer format for DirectMusic * -* Shared file between user mode and kernel mode components * -* * -* Copyright (c) 1998, Microsoft Corp. All rights reserved. * -* * -***************************************************************************/ - -#ifndef _DMusBuff_ -#define _DMusBuff_ - -/* Format of DirectMusic events in a buffer - * - * A buffer contains 1 or more events, each with the following header. - * Immediately following the header is the event data. The header+data - * size is rounded to the nearest quadword (8 bytes). - */ - -#include /* Do not pad at end - that's where the data is */ -typedef struct _DMUS_EVENTHEADER *LPDMUS_EVENTHEADER; -typedef struct _DMUS_EVENTHEADER -{ - DWORD cbEvent; /* Unrounded bytes in event */ - DWORD dwChannelGroup; /* Channel group of event */ - REFERENCE_TIME rtDelta; /* Delta from start time of entire buffer */ - DWORD dwFlags; /* Flags DMUS_EVENT_xxx */ -} DMUS_EVENTHEADER; -#include - -#define DMUS_EVENT_STRUCTURED 0x00000001 /* Unstructured data (SysEx, etc.) */ - -/* The number of bytes to allocate for an event with 'cb' data bytes. - */ -#define QWORD_ALIGN(x) (((x) + 7) & ~7) -#define DMUS_EVENT_SIZE(cb) QWORD_ALIGN(sizeof(DMUS_EVENTHEADER) + cb) - - -#endif /* _DMusBuff_ */ - - diff --git a/import/DirectX8/include/dmusicc.h b/import/DirectX8/include/dmusicc.h deleted file mode 100644 index eeff1fc67..000000000 --- a/import/DirectX8/include/dmusicc.h +++ /dev/null @@ -1,784 +0,0 @@ -/************************************************************************ -* * -* dmusicc.h -- This module defines the DirectMusic core API's * -* * -* Copyright (c) 1998-1999 Microsoft Corporation -* * -************************************************************************/ - -#ifndef _DMUSICC_ -#define _DMUSICC_ - -#include - -#define COM_NO_WINDOWS_H -#include - -#include - -#include "dls1.h" -#include "dmerror.h" -#include "dmdls.h" -#include "dsound.h" -#include "dmusbuff.h" - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef ULONGLONG SAMPLE_TIME; -typedef ULONGLONG SAMPLE_POSITION; -typedef SAMPLE_TIME *LPSAMPLE_TIME; - -#define DMUS_MAX_DESCRIPTION 128 -#define DMUS_MAX_DRIVER 128 - -typedef struct _DMUS_BUFFERDESC *LPDMUS_BUFFERDESC; -typedef struct _DMUS_BUFFERDESC -{ - DWORD dwSize; - DWORD dwFlags; - GUID guidBufferFormat; - DWORD cbBuffer; -} DMUS_BUFFERDESC; - -/* DMUS_EFFECT_ flags are used in the dwEffectFlags fields of both DMUS_PORTCAPS - * and DMUS_PORTPARAMS. - */ -#define DMUS_EFFECT_NONE 0x00000000 -#define DMUS_EFFECT_REVERB 0x00000001 -#define DMUS_EFFECT_CHORUS 0x00000002 -#define DMUS_EFFECT_DELAY 0x00000004 - -/* For DMUS_PORTCAPS dwClass - */ -#define DMUS_PC_INPUTCLASS (0) -#define DMUS_PC_OUTPUTCLASS (1) - -/* For DMUS_PORTCAPS dwFlags - */ -#define DMUS_PC_DLS (0x00000001) // Supports DLS downloading and DLS level 1. -#define DMUS_PC_EXTERNAL (0x00000002) // External MIDI module. -#define DMUS_PC_SOFTWARESYNTH (0x00000004) // Software synthesizer. -#define DMUS_PC_MEMORYSIZEFIXED (0x00000008) // Memory size is fixed. -#define DMUS_PC_GMINHARDWARE (0x00000010) // GM sound set is built in, no need to download. -#define DMUS_PC_GSINHARDWARE (0x00000020) // GS sound set is built in. -#define DMUS_PC_XGINHARDWARE (0x00000040) // XG sound set is built in. -#define DMUS_PC_DIRECTSOUND (0x00000080) // Connects to DirectSound via a DSound buffer. -#define DMUS_PC_SHAREABLE (0x00000100) // Synth can be actively shared by multiple apps at once. -#define DMUS_PC_DLS2 (0x00000200) // Supports DLS2 instruments. -#define DMUS_PC_AUDIOPATH (0x00000400) // Multiple outputs can be connected to DirectSound for audiopaths. -#define DMUS_PC_WAVE (0x00000800) // Supports streaming and one shot waves. - -#define DMUS_PC_SYSTEMMEMORY (0x7FFFFFFF) // Sample memory is system memory. - - -typedef struct _DMUS_PORTCAPS -{ - DWORD dwSize; - DWORD dwFlags; - GUID guidPort; - DWORD dwClass; - DWORD dwType; - DWORD dwMemorySize; - DWORD dwMaxChannelGroups; - DWORD dwMaxVoices; - DWORD dwMaxAudioChannels; - DWORD dwEffectFlags; - WCHAR wszDescription[DMUS_MAX_DESCRIPTION]; -} DMUS_PORTCAPS; - -typedef DMUS_PORTCAPS *LPDMUS_PORTCAPS; - -/* Values for DMUS_PORTCAPS dwType. This field indicates the underlying - * driver type of the port. - */ -#define DMUS_PORT_WINMM_DRIVER (0) -#define DMUS_PORT_USER_MODE_SYNTH (1) -#define DMUS_PORT_KERNEL_MODE (2) - -/* These flags (set in dwValidParams) indicate which other members of the */ -/* DMUS_PORTPARAMS are valid. */ -/* */ -#define DMUS_PORTPARAMS_VOICES 0x00000001 -#define DMUS_PORTPARAMS_CHANNELGROUPS 0x00000002 -#define DMUS_PORTPARAMS_AUDIOCHANNELS 0x00000004 -#define DMUS_PORTPARAMS_SAMPLERATE 0x00000008 -#define DMUS_PORTPARAMS_EFFECTS 0x00000020 -#define DMUS_PORTPARAMS_SHARE 0x00000040 -#define DMUS_PORTPARAMS_FEATURES 0x00000080 /* DirectX 8.0 and above */ - -typedef struct _DMUS_PORTPARAMS -{ - DWORD dwSize; - DWORD dwValidParams; - DWORD dwVoices; - DWORD dwChannelGroups; - DWORD dwAudioChannels; - DWORD dwSampleRate; - DWORD dwEffectFlags; - BOOL fShare; -} DMUS_PORTPARAMS7; - -typedef struct _DMUS_PORTPARAMS8 -{ - DWORD dwSize; - DWORD dwValidParams; - DWORD dwVoices; - DWORD dwChannelGroups; - DWORD dwAudioChannels; - DWORD dwSampleRate; - DWORD dwEffectFlags; - BOOL fShare; - DWORD dwFeatures; -} DMUS_PORTPARAMS8; - -#define DMUS_PORT_FEATURE_AUDIOPATH 0x00000001 /* Supports audiopath connection to DSound buffers. */ -#define DMUS_PORT_FEATURE_STREAMING 0x00000002 /* Supports streaming waves through the synth. */ - - -typedef DMUS_PORTPARAMS8 DMUS_PORTPARAMS; -typedef DMUS_PORTPARAMS *LPDMUS_PORTPARAMS; - -typedef struct _DMUS_SYNTHSTATS *LPDMUS_SYNTHSTATS; -typedef struct _DMUS_SYNTHSTATS8 *LPDMUS_SYNTHSTATS8; -typedef struct _DMUS_SYNTHSTATS -{ - DWORD dwSize; /* Size in bytes of the structure */ - DWORD dwValidStats; /* Flags indicating which fields below are valid. */ - DWORD dwVoices; /* Average number of voices playing. */ - DWORD dwTotalCPU; /* Total CPU usage as percent * 100. */ - DWORD dwCPUPerVoice; /* CPU per voice as percent * 100. */ - DWORD dwLostNotes; /* Number of notes lost in 1 second. */ - DWORD dwFreeMemory; /* Free memory in bytes */ - long lPeakVolume; /* Decibel level * 100. */ -} DMUS_SYNTHSTATS; - -typedef struct _DMUS_SYNTHSTATS8 -{ - DWORD dwSize; /* Size in bytes of the structure */ - DWORD dwValidStats; /* Flags indicating which fields below are valid. */ - DWORD dwVoices; /* Average number of voices playing. */ - DWORD dwTotalCPU; /* Total CPU usage as percent * 100. */ - DWORD dwCPUPerVoice; /* CPU per voice as percent * 100. */ - DWORD dwLostNotes; /* Number of notes lost in 1 second. */ - DWORD dwFreeMemory; /* Free memory in bytes */ - long lPeakVolume; /* Decibel level * 100. */ - DWORD dwSynthMemUse; /* Memory used by synth wave data */ -} DMUS_SYNTHSTATS8; - -#define DMUS_SYNTHSTATS_VOICES (1 << 0) -#define DMUS_SYNTHSTATS_TOTAL_CPU (1 << 1) -#define DMUS_SYNTHSTATS_CPU_PER_VOICE (1 << 2) -#define DMUS_SYNTHSTATS_LOST_NOTES (1 << 3) -#define DMUS_SYNTHSTATS_PEAK_VOLUME (1 << 4) -#define DMUS_SYNTHSTATS_FREE_MEMORY (1 << 5) - -#define DMUS_SYNTHSTATS_SYSTEMMEMORY DMUS_PC_SYSTEMMEMORY - -typedef struct _DMUS_WAVES_REVERB_PARAMS -{ - float fInGain; /* Input gain in dB (to avoid output overflows) */ - float fReverbMix; /* Reverb mix in dB. 0dB means 100% wet reverb (no direct signal) - Negative values gives less wet signal. - The coeficients are calculated so that the overall output level stays - (approximately) constant regardless of the ammount of reverb mix. */ - float fReverbTime; /* The reverb decay time, in milliseconds. */ - float fHighFreqRTRatio; /* The ratio of the high frequencies to the global reverb time. - Unless very 'splashy-bright' reverbs are wanted, this should be set to - a value < 1.0. - For example if dRevTime==1000ms and dHighFreqRTRatio=0.1 than the - decay time for high frequencies will be 100ms.*/ - -} DMUS_WAVES_REVERB_PARAMS; - -/* Note: Default values for Reverb are: - fInGain = 0.0dB (no change in level) - fReverbMix = -10.0dB (a reasonable reverb mix) - fReverbTime = 1000.0ms (one second global reverb time) - fHighFreqRTRatio = 0.001 (the ratio of the high frequencies to the global reverb time) -*/ - -typedef enum -{ - DMUS_CLOCK_SYSTEM = 0, - DMUS_CLOCK_WAVE = 1 -} DMUS_CLOCKTYPE; - -#define DMUS_CLOCKF_GLOBAL 0x00000001 - -typedef struct _DMUS_CLOCKINFO7 *LPDMUS_CLOCKINFO7; -typedef struct _DMUS_CLOCKINFO7 -{ - DWORD dwSize; - DMUS_CLOCKTYPE ctType; - GUID guidClock; /* Identifies this time source */ - WCHAR wszDescription[DMUS_MAX_DESCRIPTION]; -} DMUS_CLOCKINFO7; - -typedef struct _DMUS_CLOCKINFO8 *LPDMUS_CLOCKINFO8; -typedef struct _DMUS_CLOCKINFO8 -{ - DWORD dwSize; - DMUS_CLOCKTYPE ctType; - GUID guidClock; /* Identifies this time source */ - WCHAR wszDescription[DMUS_MAX_DESCRIPTION]; - DWORD dwFlags; -} DMUS_CLOCKINFO8; - -typedef DMUS_CLOCKINFO8 DMUS_CLOCKINFO; -typedef DMUS_CLOCKINFO *LPDMUS_CLOCKINFO; - -/* Default bus identifiers - * - * The first 17 are direct mappings to the destinations defined in both - * the MMA DLS Level 2 specification and the Microsoft Multi-Channel audio - * specification. - */ -#define DSBUSID_FIRST_SPKR_LOC 0 -#define DSBUSID_FRONT_LEFT 0 -#define DSBUSID_LEFT 0 /* Front left is also just left */ -#define DSBUSID_FRONT_RIGHT 1 -#define DSBUSID_RIGHT 1 /* Ditto front right */ -#define DSBUSID_FRONT_CENTER 2 -#define DSBUSID_LOW_FREQUENCY 3 -#define DSBUSID_BACK_LEFT 4 -#define DSBUSID_BACK_RIGHT 5 -#define DSBUSID_FRONT_LEFT_OF_CENTER 6 -#define DSBUSID_FRONT_RIGHT_OF_CENTER 7 -#define DSBUSID_BACK_CENTER 8 -#define DSBUSID_SIDE_LEFT 9 -#define DSBUSID_SIDE_RIGHT 10 -#define DSBUSID_TOP_CENTER 11 -#define DSBUSID_TOP_FRONT_LEFT 12 -#define DSBUSID_TOP_FRONT_CENTER 13 -#define DSBUSID_TOP_FRONT_RIGHT 14 -#define DSBUSID_TOP_BACK_LEFT 15 -#define DSBUSID_TOP_BACK_CENTER 16 -#define DSBUSID_TOP_BACK_RIGHT 17 -#define DSBUSID_LAST_SPKR_LOC 17 - -#define DSBUSID_IS_SPKR_LOC(id) ( ((id) >= DSBUSID_FIRST_SPKR_LOC) && ((id) <= DSBUSID_LAST_SPKR_LOC) ) - -/* These bus identifiers are for the standard DLS effect sends - */ -#define DSBUSID_REVERB_SEND 64 -#define DSBUSID_CHORUS_SEND 65 - -/* Dynamic bus identifiers start here. See the documentation for how - * synthesizers map the output of voices to static and dynamic - * bus identifiers. - */ -#define DSBUSID_DYNAMIC_0 512 - -/* Null bus, used to identify busses that have no function mapping. -*/ -#define DSBUSID_NULL 0xFFFFFFFF - -interface IDirectMusic; -interface IDirectMusic8; -interface IDirectMusicBuffer; -interface IDirectMusicPort; -interface IDirectMusicThru; -interface IReferenceClock; - -#ifndef __cplusplus - -typedef interface IDirectMusic IDirectMusic; -typedef interface IDirectMusic8 IDirectMusic8; -typedef interface IDirectMusicPort IDirectMusicPort; -typedef interface IDirectMusicBuffer IDirectMusicBuffer; -typedef interface IDirectMusicThru IDirectMusicThru; -typedef interface IReferenceClock IReferenceClock; - -#endif /* C++ */ - -typedef IDirectMusic *LPDIRECTMUSIC; -typedef IDirectMusic8 *LPDIRECTMUSIC8; -typedef IDirectMusicPort *LPDIRECTMUSICPORT; -typedef IDirectMusicBuffer *LPDIRECTMUSICBUFFER; - -#undef INTERFACE -#define INTERFACE IDirectMusic -DECLARE_INTERFACE_(IDirectMusic, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusic */ - STDMETHOD(EnumPort) (THIS_ DWORD dwIndex, - LPDMUS_PORTCAPS pPortCaps) PURE; - STDMETHOD(CreateMusicBuffer) (THIS_ LPDMUS_BUFFERDESC pBufferDesc, - LPDIRECTMUSICBUFFER *ppBuffer, - LPUNKNOWN pUnkOuter) PURE; - STDMETHOD(CreatePort) (THIS_ REFCLSID rclsidPort, - LPDMUS_PORTPARAMS pPortParams, - LPDIRECTMUSICPORT *ppPort, - LPUNKNOWN pUnkOuter) PURE; - STDMETHOD(EnumMasterClock) (THIS_ DWORD dwIndex, - LPDMUS_CLOCKINFO lpClockInfo) PURE; - STDMETHOD(GetMasterClock) (THIS_ LPGUID pguidClock, - IReferenceClock **ppReferenceClock) PURE; - STDMETHOD(SetMasterClock) (THIS_ REFGUID rguidClock) PURE; - STDMETHOD(Activate) (THIS_ BOOL fEnable) PURE; - STDMETHOD(GetDefaultPort) (THIS_ LPGUID pguidPort) PURE; - STDMETHOD(SetDirectSound) (THIS_ LPDIRECTSOUND pDirectSound, - HWND hWnd) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirectMusic8 -DECLARE_INTERFACE_(IDirectMusic8, IDirectMusic) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusic */ - STDMETHOD(EnumPort) (THIS_ DWORD dwIndex, - LPDMUS_PORTCAPS pPortCaps) PURE; - STDMETHOD(CreateMusicBuffer) (THIS_ LPDMUS_BUFFERDESC pBufferDesc, - LPDIRECTMUSICBUFFER *ppBuffer, - LPUNKNOWN pUnkOuter) PURE; - STDMETHOD(CreatePort) (THIS_ REFCLSID rclsidPort, - LPDMUS_PORTPARAMS pPortParams, - LPDIRECTMUSICPORT *ppPort, - LPUNKNOWN pUnkOuter) PURE; - STDMETHOD(EnumMasterClock) (THIS_ DWORD dwIndex, - LPDMUS_CLOCKINFO lpClockInfo) PURE; - STDMETHOD(GetMasterClock) (THIS_ LPGUID pguidClock, - IReferenceClock **ppReferenceClock) PURE; - STDMETHOD(SetMasterClock) (THIS_ REFGUID rguidClock) PURE; - STDMETHOD(Activate) (THIS_ BOOL fEnable) PURE; - STDMETHOD(GetDefaultPort) (THIS_ LPGUID pguidPort) PURE; - STDMETHOD(SetDirectSound) (THIS_ LPDIRECTSOUND pDirectSound, - HWND hWnd) PURE; - /* IDirectMusic8 */ - STDMETHOD(SetExternalMasterClock) - (THIS_ IReferenceClock *pClock) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirectMusicBuffer -DECLARE_INTERFACE_(IDirectMusicBuffer, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicBuffer */ - STDMETHOD(Flush) (THIS) PURE; - STDMETHOD(TotalTime) (THIS_ LPREFERENCE_TIME prtTime) PURE; - - STDMETHOD(PackStructured) (THIS_ REFERENCE_TIME rt, - DWORD dwChannelGroup, - DWORD dwChannelMessage) PURE; - - STDMETHOD(PackUnstructured) (THIS_ REFERENCE_TIME rt, - DWORD dwChannelGroup, - DWORD cb, - LPBYTE lpb) PURE; - - STDMETHOD(ResetReadPtr) (THIS) PURE; - STDMETHOD(GetNextEvent) (THIS_ LPREFERENCE_TIME prt, - LPDWORD pdwChannelGroup, - LPDWORD pdwLength, - LPBYTE *ppData) PURE; - - STDMETHOD(GetRawBufferPtr) (THIS_ LPBYTE *ppData) PURE; - STDMETHOD(GetStartTime) (THIS_ LPREFERENCE_TIME prt) PURE; - STDMETHOD(GetUsedBytes) (THIS_ LPDWORD pcb) PURE; - STDMETHOD(GetMaxBytes) (THIS_ LPDWORD pcb) PURE; - STDMETHOD(GetBufferFormat) (THIS_ LPGUID pGuidFormat) PURE; - - STDMETHOD(SetStartTime) (THIS_ REFERENCE_TIME rt) PURE; - STDMETHOD(SetUsedBytes) (THIS_ DWORD cb) PURE; -}; - -typedef IDirectMusicBuffer IDirectMusicBuffer8; -typedef IDirectMusicBuffer8 *LPDIRECTMUSICBUFFER8; - -#undef INTERFACE -#define INTERFACE IDirectMusicInstrument -DECLARE_INTERFACE_(IDirectMusicInstrument, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicInstrument */ - STDMETHOD(GetPatch) (THIS_ DWORD* pdwPatch) PURE; - STDMETHOD(SetPatch) (THIS_ DWORD dwPatch) PURE; -}; - -typedef IDirectMusicInstrument IDirectMusicInstrument8; -typedef IDirectMusicInstrument8 *LPDIRECTMUSICINSTRUMENT8; - -#undef INTERFACE -#define INTERFACE IDirectMusicDownloadedInstrument -DECLARE_INTERFACE_(IDirectMusicDownloadedInstrument, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicDownloadedInstrument */ - /* None at this time */ -}; - -typedef IDirectMusicDownloadedInstrument IDirectMusicDownloadedInstrument8; -typedef IDirectMusicDownloadedInstrument8 *LPDIRECTMUSICDOWNLOADEDINSTRUMENT8; - -#undef INTERFACE -#define INTERFACE IDirectMusicCollection -DECLARE_INTERFACE_(IDirectMusicCollection, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicCollection */ - STDMETHOD(GetInstrument) (THIS_ DWORD dwPatch, - IDirectMusicInstrument** ppInstrument) PURE; - STDMETHOD(EnumInstrument) (THIS_ DWORD dwIndex, - DWORD* pdwPatch, - LPWSTR pwszName, - DWORD dwNameLen) PURE; -}; - -typedef IDirectMusicCollection IDirectMusicCollection8; -typedef IDirectMusicCollection8 *LPDIRECTMUSICCOLLECTION8; - -#undef INTERFACE -#define INTERFACE IDirectMusicDownload -DECLARE_INTERFACE_(IDirectMusicDownload , IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicDownload */ - STDMETHOD(GetBuffer) (THIS_ void** ppvBuffer, - DWORD* pdwSize) PURE; -}; - -typedef IDirectMusicDownload IDirectMusicDownload8; -typedef IDirectMusicDownload8 *LPDIRECTMUSICDOWNLOAD8; - -#undef INTERFACE -#define INTERFACE IDirectMusicPortDownload -DECLARE_INTERFACE_(IDirectMusicPortDownload, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicPortDownload */ - STDMETHOD(GetBuffer) (THIS_ DWORD dwDLId, - IDirectMusicDownload** ppIDMDownload) PURE; - STDMETHOD(AllocateBuffer) (THIS_ DWORD dwSize, - IDirectMusicDownload** ppIDMDownload) PURE; - STDMETHOD(GetDLId) (THIS_ DWORD* pdwStartDLId, - DWORD dwCount) PURE; - STDMETHOD(GetAppend) (THIS_ DWORD* pdwAppend) PURE; - STDMETHOD(Download) (THIS_ IDirectMusicDownload* pIDMDownload) PURE; - STDMETHOD(Unload) (THIS_ IDirectMusicDownload* pIDMDownload) PURE; -}; - -typedef IDirectMusicPortDownload IDirectMusicPortDownload8; -typedef IDirectMusicPortDownload8 *LPDIRECTMUSICPORTDOWNLOAD8; - -/* Standard values for voice priorities. Numerically higher priorities are higher in priority. - * These priorities are used to set the voice priority for all voices on a channel. They are - * used in the dwPriority parameter of IDirectMusicPort::GetPriority and returned in the - * lpwPriority parameter of pdwPriority. - * - * These priorities are shared with DirectSound. - */ - -#ifndef _DIRECTAUDIO_PRIORITIES_DEFINED_ -#define _DIRECTAUDIO_PRIORITIES_DEFINED_ - -#define DAUD_CRITICAL_VOICE_PRIORITY (0xF0000000) -#define DAUD_HIGH_VOICE_PRIORITY (0xC0000000) -#define DAUD_STANDARD_VOICE_PRIORITY (0x80000000) -#define DAUD_LOW_VOICE_PRIORITY (0x40000000) -#define DAUD_PERSIST_VOICE_PRIORITY (0x10000000) - -/* These are the default priorities assigned if not overridden. By default priorities are - * equal across channel groups (e.g. channel 5 on channel group 1 has the same priority as - * channel 5 on channel group 2). - * - * In accordance with DLS level 1, channel 10 has the highest priority, followed by 1 through 16 - * except for 10. - */ -#define DAUD_CHAN1_VOICE_PRIORITY_OFFSET (0x0000000E) -#define DAUD_CHAN2_VOICE_PRIORITY_OFFSET (0x0000000D) -#define DAUD_CHAN3_VOICE_PRIORITY_OFFSET (0x0000000C) -#define DAUD_CHAN4_VOICE_PRIORITY_OFFSET (0x0000000B) -#define DAUD_CHAN5_VOICE_PRIORITY_OFFSET (0x0000000A) -#define DAUD_CHAN6_VOICE_PRIORITY_OFFSET (0x00000009) -#define DAUD_CHAN7_VOICE_PRIORITY_OFFSET (0x00000008) -#define DAUD_CHAN8_VOICE_PRIORITY_OFFSET (0x00000007) -#define DAUD_CHAN9_VOICE_PRIORITY_OFFSET (0x00000006) -#define DAUD_CHAN10_VOICE_PRIORITY_OFFSET (0x0000000F) -#define DAUD_CHAN11_VOICE_PRIORITY_OFFSET (0x00000005) -#define DAUD_CHAN12_VOICE_PRIORITY_OFFSET (0x00000004) -#define DAUD_CHAN13_VOICE_PRIORITY_OFFSET (0x00000003) -#define DAUD_CHAN14_VOICE_PRIORITY_OFFSET (0x00000002) -#define DAUD_CHAN15_VOICE_PRIORITY_OFFSET (0x00000001) -#define DAUD_CHAN16_VOICE_PRIORITY_OFFSET (0x00000000) - - -#define DAUD_CHAN1_DEF_VOICE_PRIORITY (DAUD_STANDARD_VOICE_PRIORITY | DAUD_CHAN1_VOICE_PRIORITY_OFFSET) -#define DAUD_CHAN2_DEF_VOICE_PRIORITY (DAUD_STANDARD_VOICE_PRIORITY | DAUD_CHAN2_VOICE_PRIORITY_OFFSET) -#define DAUD_CHAN3_DEF_VOICE_PRIORITY (DAUD_STANDARD_VOICE_PRIORITY | DAUD_CHAN3_VOICE_PRIORITY_OFFSET) -#define DAUD_CHAN4_DEF_VOICE_PRIORITY (DAUD_STANDARD_VOICE_PRIORITY | DAUD_CHAN4_VOICE_PRIORITY_OFFSET) -#define DAUD_CHAN5_DEF_VOICE_PRIORITY (DAUD_STANDARD_VOICE_PRIORITY | DAUD_CHAN5_VOICE_PRIORITY_OFFSET) -#define DAUD_CHAN6_DEF_VOICE_PRIORITY (DAUD_STANDARD_VOICE_PRIORITY | DAUD_CHAN6_VOICE_PRIORITY_OFFSET) -#define DAUD_CHAN7_DEF_VOICE_PRIORITY (DAUD_STANDARD_VOICE_PRIORITY | DAUD_CHAN7_VOICE_PRIORITY_OFFSET) -#define DAUD_CHAN8_DEF_VOICE_PRIORITY (DAUD_STANDARD_VOICE_PRIORITY | DAUD_CHAN8_VOICE_PRIORITY_OFFSET) -#define DAUD_CHAN9_DEF_VOICE_PRIORITY (DAUD_STANDARD_VOICE_PRIORITY | DAUD_CHAN9_VOICE_PRIORITY_OFFSET) -#define DAUD_CHAN10_DEF_VOICE_PRIORITY (DAUD_STANDARD_VOICE_PRIORITY | DAUD_CHAN10_VOICE_PRIORITY_OFFSET) -#define DAUD_CHAN11_DEF_VOICE_PRIORITY (DAUD_STANDARD_VOICE_PRIORITY | DAUD_CHAN11_VOICE_PRIORITY_OFFSET) -#define DAUD_CHAN12_DEF_VOICE_PRIORITY (DAUD_STANDARD_VOICE_PRIORITY | DAUD_CHAN12_VOICE_PRIORITY_OFFSET) -#define DAUD_CHAN13_DEF_VOICE_PRIORITY (DAUD_STANDARD_VOICE_PRIORITY | DAUD_CHAN13_VOICE_PRIORITY_OFFSET) -#define DAUD_CHAN14_DEF_VOICE_PRIORITY (DAUD_STANDARD_VOICE_PRIORITY | DAUD_CHAN14_VOICE_PRIORITY_OFFSET) -#define DAUD_CHAN15_DEF_VOICE_PRIORITY (DAUD_STANDARD_VOICE_PRIORITY | DAUD_CHAN15_VOICE_PRIORITY_OFFSET) -#define DAUD_CHAN16_DEF_VOICE_PRIORITY (DAUD_STANDARD_VOICE_PRIORITY | DAUD_CHAN16_VOICE_PRIORITY_OFFSET) - -#endif /* _DIRECTAUDIO_PRIORITIES_DEFINED_ */ - - -#undef INTERFACE -#define INTERFACE IDirectMusicPort -DECLARE_INTERFACE_(IDirectMusicPort, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicPort */ - /* */ - STDMETHOD(PlayBuffer) (THIS_ LPDIRECTMUSICBUFFER pBuffer) PURE; - STDMETHOD(SetReadNotificationHandle) (THIS_ HANDLE hEvent) PURE; - STDMETHOD(Read) (THIS_ LPDIRECTMUSICBUFFER pBuffer) PURE; - STDMETHOD(DownloadInstrument) (THIS_ IDirectMusicInstrument *pInstrument, - IDirectMusicDownloadedInstrument **ppDownloadedInstrument, - DMUS_NOTERANGE *pNoteRanges, - DWORD dwNumNoteRanges) PURE; - STDMETHOD(UnloadInstrument) (THIS_ IDirectMusicDownloadedInstrument *pDownloadedInstrument) PURE; - STDMETHOD(GetLatencyClock) (THIS_ IReferenceClock **ppClock) PURE; - STDMETHOD(GetRunningStats) (THIS_ LPDMUS_SYNTHSTATS pStats) PURE; - STDMETHOD(Compact) (THIS) PURE; - STDMETHOD(GetCaps) (THIS_ LPDMUS_PORTCAPS pPortCaps) PURE; - STDMETHOD(DeviceIoControl) (THIS_ DWORD dwIoControlCode, - LPVOID lpInBuffer, - DWORD nInBufferSize, - LPVOID lpOutBuffer, - DWORD nOutBufferSize, - LPDWORD lpBytesReturned, - LPOVERLAPPED lpOverlapped) PURE; - STDMETHOD(SetNumChannelGroups) (THIS_ DWORD dwChannelGroups) PURE; - STDMETHOD(GetNumChannelGroups) (THIS_ LPDWORD pdwChannelGroups) PURE; - STDMETHOD(Activate) (THIS_ BOOL fActive) PURE; - STDMETHOD(SetChannelPriority) (THIS_ DWORD dwChannelGroup, DWORD dwChannel, DWORD dwPriority) PURE; - STDMETHOD(GetChannelPriority) (THIS_ DWORD dwChannelGroup, DWORD dwChannel, LPDWORD pdwPriority) PURE; - STDMETHOD(SetDirectSound) (THIS_ LPDIRECTSOUND pDirectSound, LPDIRECTSOUNDBUFFER pDirectSoundBuffer) PURE; - STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pWaveFormatEx, LPDWORD pdwWaveFormatExSize, LPDWORD pdwBufferSize) PURE; -}; - -typedef IDirectMusicPort IDirectMusicPort8; -typedef IDirectMusicPort8 *LPDIRECTMUSICPORT8; - -#undef INTERFACE -#define INTERFACE IDirectMusicThru -DECLARE_INTERFACE_(IDirectMusicThru, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicThru - */ - STDMETHOD(ThruChannel) (THIS_ DWORD dwSourceChannelGroup, - DWORD dwSourceChannel, - DWORD dwDestinationChannelGroup, - DWORD dwDestinationChannel, - LPDIRECTMUSICPORT pDestinationPort) PURE; -}; - -typedef IDirectMusicThru IDirectMusicThru8; -typedef IDirectMusicThru8 *LPDIRECTMUSICTHRU8; - -#ifndef __IReferenceClock_INTERFACE_DEFINED__ -#define __IReferenceClock_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IReferenceClock,0x56a86897,0x0ad4,0x11ce,0xb0,0x3a,0x00,0x20,0xaf,0x0b,0xa7,0x70); - -#undef INTERFACE -#define INTERFACE IReferenceClock -DECLARE_INTERFACE_(IReferenceClock, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IReferenceClock */ - /* */ - - /* get the time now */ - STDMETHOD(GetTime) (THIS_ REFERENCE_TIME *pTime) PURE; - - /* ask for an async notification that a time has elapsed */ - STDMETHOD(AdviseTime) (THIS_ REFERENCE_TIME baseTime, /* base time */ - REFERENCE_TIME streamTime, /* stream offset time */ - HANDLE hEvent, /* advise via this event */ - DWORD * pdwAdviseCookie) PURE; /* where your cookie goes */ - - /* ask for an async periodic notification that a time has elapsed */ - STDMETHOD(AdvisePeriodic) (THIS_ REFERENCE_TIME startTime, /* starting at this time */ - REFERENCE_TIME periodTime, /* time between notifications */ - HANDLE hSemaphore, /* advise via a semaphore */ - DWORD * pdwAdviseCookie) PURE; /* where your cookie goes */ - - /* cancel a request for notification */ - STDMETHOD(Unadvise) (THIS_ DWORD dwAdviseCookie) PURE; -}; - -#endif /* __IReferenceClock_INTERFACE_DEFINED__ */ - -DEFINE_GUID(CLSID_DirectMusic,0x636b9f10,0x0c7d,0x11d1,0x95,0xb2,0x00,0x20,0xaf,0xdc,0x74,0x21); -DEFINE_GUID(CLSID_DirectMusicCollection,0x480ff4b0, 0x28b2, 0x11d1, 0xbe, 0xf7, 0x0, 0xc0, 0x4f, 0xbf, 0x8f, 0xef); -DEFINE_GUID(CLSID_DirectMusicSynth,0x58C2B4D0,0x46E7,0x11D1,0x89,0xAC,0x00,0xA0,0xC9,0x05,0x41,0x29); - -DEFINE_GUID(IID_IDirectMusic,0x6536115a,0x7b2d,0x11d2,0xba,0x18,0x00,0x00,0xf8,0x75,0xac,0x12); -DEFINE_GUID(IID_IDirectMusicBuffer,0xd2ac2878, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(IID_IDirectMusicPort, 0x08f2d8c9,0x37c2,0x11d2,0xb9,0xf9,0x00,0x00,0xf8,0x75,0xac,0x12); -DEFINE_GUID(IID_IDirectMusicThru, 0xced153e7, 0x3606, 0x11d2, 0xb9, 0xf9, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); -DEFINE_GUID(IID_IDirectMusicPortDownload,0xd2ac287a, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(IID_IDirectMusicDownload,0xd2ac287b, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(IID_IDirectMusicCollection,0xd2ac287c, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(IID_IDirectMusicInstrument,0xd2ac287d, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(IID_IDirectMusicDownloadedInstrument,0xd2ac287e, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - - -/* Alternate interface ID for IID_IDirectMusic, available in DX7 release and after. */ -DEFINE_GUID(IID_IDirectMusic2,0x6fc2cae1, 0xbc78, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6); - -DEFINE_GUID(IID_IDirectMusic8,0x2d3629f7,0x813d,0x4939,0x85,0x08,0xf0,0x5c,0x6b,0x75,0xfd,0x97); - -#define IID_IDirectMusicThru8 IID_IDirectMusicThru -#define IID_IDirectMusicPortDownload8 IID_IDirectMusicPortDownload -#define IID_IDirectMusicDownload8 IID_IDirectMusicDownload -#define IID_IDirectMusicCollection8 IID_IDirectMusicCollection -#define IID_IDirectMusicInstrument8 IID_IDirectMusicInstrument -#define IID_IDirectMusicDownloadedInstrument8 IID_IDirectMusicDownloadedInstrument -#define IID_IDirectMusicPort8 IID_IDirectMusicPort - - -/* Property Query GUID_DMUS_PROP_GM_Hardware - Local GM set, no need to download - * Property Query GUID_DMUS_PROP_GS_Hardware - Local GS set, no need to download - * Property Query GUID_DMUS_PROP_XG_Hardware - Local XG set, no need to download - * Property Query GUID_DMUS_PROP_DLS1 - Support DLS level 1 - * Property Query GUID_DMUS_PROP_INSTRUMENT2 - Support new INSTRUMENT2 download format - * Property Query GUID_DMUS_PROP_XG_Capable - Support minimum requirements of XG - * Property Query GUID_DMUS_PROP_GS_Capable - Support minimum requirements of GS - * Property Query GUID_DMUS_PROP_SynthSink_DSOUND - Synthsink talks to DSound - * Property Query GUID_DMUS_PROP_SynthSink_WAVE - Synthsink talks to Wave device - * - * Item 0: Supported - * Returns a DWORD which is non-zero if the feature is supported - */ -DEFINE_GUID(GUID_DMUS_PROP_GM_Hardware, 0x178f2f24, 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); -DEFINE_GUID(GUID_DMUS_PROP_GS_Hardware, 0x178f2f25, 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); -DEFINE_GUID(GUID_DMUS_PROP_XG_Hardware, 0x178f2f26, 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); -DEFINE_GUID(GUID_DMUS_PROP_XG_Capable, 0x6496aba1, 0x61b0, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6); -DEFINE_GUID(GUID_DMUS_PROP_GS_Capable, 0x6496aba2, 0x61b0, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6); -DEFINE_GUID(GUID_DMUS_PROP_DLS1, 0x178f2f27, 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); -DEFINE_GUID(GUID_DMUS_PROP_DLS2, 0xf14599e5, 0x4689, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6); -DEFINE_GUID(GUID_DMUS_PROP_INSTRUMENT2, 0x865fd372, 0x9f67, 0x11d2, 0x87, 0x2a, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(GUID_DMUS_PROP_SynthSink_DSOUND,0xaa97844, 0xc877, 0x11d1, 0x87, 0xc, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(GUID_DMUS_PROP_SynthSink_WAVE,0xaa97845, 0xc877, 0x11d1, 0x87, 0xc, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(GUID_DMUS_PROP_SampleMemorySize, 0x178f2f28, 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); -DEFINE_GUID(GUID_DMUS_PROP_SamplePlaybackRate, 0x2a91f713, 0xa4bf, 0x11d2, 0xbb, 0xdf, 0x0, 0x60, 0x8, 0x33, 0xdb, 0xd8); - -/* Property Get/Set GUID_DMUS_PROP_WriteLatency - * - * Item 0: Synth buffer write latency, in milliseconds - * Get/Set SynthSink latency, the average time after the play head that the next buffer gets written. - */ -DEFINE_GUID(GUID_DMUS_PROP_WriteLatency,0x268a0fa0, 0x60f2, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6); - -/* Property Get/Set GUID_DMUS_PROP_WritePeriod - * - * Item 0: Synth buffer write period, in milliseconds - * Get/Set SynthSink buffer write period, time span between successive writes. - */ -DEFINE_GUID(GUID_DMUS_PROP_WritePeriod,0x268a0fa1, 0x60f2, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6); - -/* Property Get GUID_DMUS_PROP_MemorySize - * - * Item 0: Memory size - * Returns a DWORD containing the total number of bytes of sample RAM - */ -DEFINE_GUID(GUID_DMUS_PROP_MemorySize, 0x178f2f28, 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); - -/* Property Set GUID_DMUS_PROP_WavesReverb - * - * Item 0: DMUS_WAVES_REVERB structure - * Sets reverb parameters - */ -DEFINE_GUID(GUID_DMUS_PROP_WavesReverb,0x4cb5622, 0x32e5, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6); - -/* Property Set GUID_DMUS_PROP_Effects - * - * Item 0: DWORD with effects flags. - * Get/Set effects bits, same as dwEffectFlags in DMUS_PORTPARAMS and DMUS_PORTCAPS: - * DMUS_EFFECT_NONE - * DMUS_EFFECT_REVERB - * DMUS_EFFECT_CHORUS - */ -DEFINE_GUID(GUID_DMUS_PROP_Effects, 0xcda8d611, 0x684a, 0x11d2, 0x87, 0x1e, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Property Set GUID_DMUS_PROP_LegacyCaps - * - * Item 0: The MIDINCAPS or MIDIOUTCAPS which describes the port's underlying WinMM device. This property is only supported - * by ports which wrap WinMM devices. - */ - -DEFINE_GUID(GUID_DMUS_PROP_LegacyCaps,0xcfa7cdc2, 0x00a1, 0x11d2, 0xaa, 0xd5, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); - -/* Property Set GUID_DMUS_PROP_Volume - * - * Item 0: A long which contains an offset, in 1/100 dB, to be added to the final volume - * - */ -DEFINE_GUID(GUID_DMUS_PROP_Volume, 0xfedfae25L, 0xe46e, 0x11d1, 0xaa, 0xce, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); - -/* Min and Max values for setting volume with GUID_DMUS_PROP_Volume */ - -#define DMUS_VOLUME_MAX 2000 /* +20 dB */ -#define DMUS_VOLUME_MIN -20000 /* -200 dB */ - -#ifdef __cplusplus -}; /* extern "C" */ -#endif - -#include - -#endif /* #ifndef _DMUSICC_ */ diff --git a/import/DirectX8/include/dmusicf.h b/import/DirectX8/include/dmusicf.h deleted file mode 100644 index 10908a9b5..000000000 --- a/import/DirectX8/include/dmusicf.h +++ /dev/null @@ -1,2373 +0,0 @@ -/************************************************************************ -* * -* dmusicf.h -- This module defines the DirectMusic file formats * -* * -* Copyright (c) 1998-1999 Microsoft Corporation -* * -************************************************************************/ - -#ifndef _DMUSICF_ -#define _DMUSICF_ - - -#include - -#define COM_NO_WINDOWS_H -#include - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -interface IDirectMusicCollection; -#ifndef __cplusplus -typedef interface IDirectMusicCollection IDirectMusicCollection; -#endif - -/* Common chunks */ - -#define DMUS_FOURCC_GUID_CHUNK mmioFOURCC('g','u','i','d') -#define DMUS_FOURCC_INFO_LIST mmioFOURCC('I','N','F','O') -#define DMUS_FOURCC_UNFO_LIST mmioFOURCC('U','N','F','O') -#define DMUS_FOURCC_UNAM_CHUNK mmioFOURCC('U','N','A','M') -#define DMUS_FOURCC_UART_CHUNK mmioFOURCC('U','A','R','T') -#define DMUS_FOURCC_UCOP_CHUNK mmioFOURCC('U','C','O','P') -#define DMUS_FOURCC_USBJ_CHUNK mmioFOURCC('U','S','B','J') -#define DMUS_FOURCC_UCMT_CHUNK mmioFOURCC('U','C','M','T') -#define DMUS_FOURCC_CATEGORY_CHUNK mmioFOURCC('c','a','t','g') -#define DMUS_FOURCC_VERSION_CHUNK mmioFOURCC('v','e','r','s') - -/* The following structures are used by the Tracks, and are the packed structures */ -/* that are passed to the Tracks inside the IStream. */ - - -typedef struct _DMUS_IO_SEQ_ITEM -{ - MUSIC_TIME mtTime; - MUSIC_TIME mtDuration; - DWORD dwPChannel; - short nOffset; - BYTE bStatus; - BYTE bByte1; - BYTE bByte2; -} DMUS_IO_SEQ_ITEM; - - -typedef struct _DMUS_IO_CURVE_ITEM -{ - MUSIC_TIME mtStart; - MUSIC_TIME mtDuration; - MUSIC_TIME mtResetDuration; - DWORD dwPChannel; - short nOffset; - short nStartValue; - short nEndValue; - short nResetValue; - BYTE bType; - BYTE bCurveShape; - BYTE bCCData; - BYTE bFlags; - /* Following was added for DX8. */ - WORD wParamType; /* RPN or NRPN parameter number. */ - WORD wMergeIndex; /* Allows multiple parameters to be merged (pitchbend, volume, and expression.) */ -} DMUS_IO_CURVE_ITEM; - - -typedef struct _DMUS_IO_TEMPO_ITEM -{ - MUSIC_TIME lTime; - double dblTempo; -} DMUS_IO_TEMPO_ITEM; - - -typedef struct _DMUS_IO_SYSEX_ITEM -{ - MUSIC_TIME mtTime; - DWORD dwPChannel; - DWORD dwSysExLength; -} DMUS_IO_SYSEX_ITEM; - -typedef DMUS_CHORD_KEY DMUS_CHORD_PARAM; /* DMUS_CHORD_KEY defined in dmusici.h */ - -typedef struct _DMUS_RHYTHM_PARAM -{ - DMUS_TIMESIGNATURE TimeSig; - DWORD dwRhythmPattern; -} DMUS_RHYTHM_PARAM; - -typedef struct _DMUS_TEMPO_PARAM -{ - MUSIC_TIME mtTime; - double dblTempo; -} DMUS_TEMPO_PARAM; - - -typedef struct _DMUS_MUTE_PARAM -{ - DWORD dwPChannel; - DWORD dwPChannelMap; - BOOL fMute; -} DMUS_MUTE_PARAM; - -/* Style chunks */ - -#define DMUS_FOURCC_STYLE_FORM mmioFOURCC('D','M','S','T') -#define DMUS_FOURCC_STYLE_CHUNK mmioFOURCC('s','t','y','h') -#define DMUS_FOURCC_PART_LIST mmioFOURCC('p','a','r','t') -#define DMUS_FOURCC_PART_CHUNK mmioFOURCC('p','r','t','h') -#define DMUS_FOURCC_NOTE_CHUNK mmioFOURCC('n','o','t','e') -#define DMUS_FOURCC_CURVE_CHUNK mmioFOURCC('c','r','v','e') -#define DMUS_FOURCC_MARKER_CHUNK mmioFOURCC('m','r','k','r') -#define DMUS_FOURCC_RESOLUTION_CHUNK mmioFOURCC('r','s','l','n') -#define DMUS_FOURCC_ANTICIPATION_CHUNK mmioFOURCC('a','n','p','n') -#define DMUS_FOURCC_PATTERN_LIST mmioFOURCC('p','t','t','n') -#define DMUS_FOURCC_PATTERN_CHUNK mmioFOURCC('p','t','n','h') -#define DMUS_FOURCC_RHYTHM_CHUNK mmioFOURCC('r','h','t','m') -#define DMUS_FOURCC_PARTREF_LIST mmioFOURCC('p','r','e','f') -#define DMUS_FOURCC_PARTREF_CHUNK mmioFOURCC('p','r','f','c') -#define DMUS_FOURCC_STYLE_PERS_REF_LIST mmioFOURCC('p','r','r','f') -#define DMUS_FOURCC_MOTIFSETTINGS_CHUNK mmioFOURCC('m','t','f','s') - -/* Flags used by variations: these make up the DWORDs in dwVariationChoices. */ - -/* These flags determine the types of chords supported by a given variation in DirectMusic */ -/* mode. The first seven flags (bits 1-7) are set if the variation supports major chords */ -/* rooted in scale positions, so, e.g., if bits 1, 2, and 4 are set, the variation */ -/* supports major chords rooted in the tonic, second, and fourth scale positions. The */ -/* next seven flags serve the same purpose, but for minor chords, and the following seven */ -/* flags serve the same purpose for chords that are not major or minor (e.g., SUS 4 */ -/* chords). Bits 22, 23, and 24 are set if the variation supports chords rooted in the */ -/* scale, chords rooted sharp of scale tones, and chords rooted flat of scale tones, */ -/* respectively. For example, to support a C# minor chord in the scale of C Major, */ -/* bits 8 (for tonic minor) and 24 (for sharp) need to be set. Bits 25, 26, an 27 handle */ -/* chords that are triads, 6th or 7th chords, and chords with extensions, respectively. */ -/* bits 28 and 29 handle chords that are followed by tonic and dominant chords, */ -/* respectively. */ -#define DMUS_VARIATIONF_MAJOR 0x0000007F /* Seven positions in the scale - major chords. */ -#define DMUS_VARIATIONF_MINOR 0x00003F80 /* Seven positions in the scale - minor chords. */ -#define DMUS_VARIATIONF_OTHER 0x001FC000 /* Seven positions in the scale - other chords. */ -#define DMUS_VARIATIONF_ROOT_SCALE 0x00200000 /* Handles chord roots in the scale. */ -#define DMUS_VARIATIONF_ROOT_FLAT 0x00400000 /* Handles flat chord roots (based on scale notes). */ -#define DMUS_VARIATIONF_ROOT_SHARP 0x00800000 /* Handles sharp chord roots (based on scale notes). */ -#define DMUS_VARIATIONF_TYPE_TRIAD 0x01000000 /* Handles simple chords - triads. */ -#define DMUS_VARIATIONF_TYPE_6AND7 0x02000000 /* Handles simple chords - 6 and 7. */ -#define DMUS_VARIATIONF_TYPE_COMPLEX 0x04000000 /* Handles complex chords. */ -#define DMUS_VARIATIONF_DEST_TO1 0x08000000 /* Handles transitions to 1 chord. */ -#define DMUS_VARIATIONF_DEST_TO5 0x10000000 /* Handles transitions to 5 chord. */ -#define DMUS_VARIATIONF_DEST_OTHER 0x40000000 /* Handles transitions to chords other than 1 . */ - -/* legacy mask for variation modes */ -#define DMUS_VARIATIONF_MODES 0xE0000000 -/* Bits 29 and 31 of the variation flags are the Mode bits. If both are 0, it's IMA. */ -/* If bit 29 is 1, it's Direct Music. */ -#define DMUS_VARIATIONF_MODES_EX (0x20000000 | 0x80000000) -#define DMUS_VARIATIONF_IMA25_MODE 0x00000000 -#define DMUS_VARIATIONF_DMUS_MODE 0x20000000 - -/* Set this if the part uses marker events */ -#define DMUS_PARTF_USE_MARKERS 0x1 -/* Set this if the part is allowed to switch only on chord-aligned markers */ -#define DMUS_PARTF_ALIGN_CHORDS 0x2 - -/* These specify if the marker event signals whether to stop a variation or start a -pattern/variation (or both), and whether new variations must align with a chord */ -#define DMUS_MARKERF_START 0x1 -#define DMUS_MARKERF_STOP 0x2 -#define DMUS_MARKERF_CHORD_ALIGN 0x4 - -/* if this flag is set, variation settings in a playing pattern-based track's state data will -persist in the track after it stops playing */ -#define DMUS_PATTERNF_PERSIST_CONTROL 0x1 - -/* These specify possible values for DMUS_IO_PARTREF.bRandomVariation - all but DMUS_VARIATIONT_SEQUENTIAL and DMUS_VARIATIONT_RANDOM are dx8. */ -typedef enum enumDMUS_VARIATIONT_TYPES -{ - DMUS_VARIATIONT_SEQUENTIAL = 0, /* Play sequential starting with variation 1. */ - DMUS_VARIATIONT_RANDOM = 1, /* Play randomly. */ - DMUS_VARIATIONT_RANDOM_START = 2, /* Play sequential starting with a random variation. */ - DMUS_VARIATIONT_NO_REPEAT = 3, /* Play randomly, but don't play the same variation twice. */ - DMUS_VARIATIONT_RANDOM_ROW = 4 /* Play randomly as a row: don't repeat any variation until all have played. */ -} DMUS_VARIATIONT_TYPES; - -#pragma pack(2) - -typedef struct _DMUS_IO_TIMESIG -{ - /* Time signatures define how many beats per measure, which note receives */ - /* the beat, and the grid resolution. */ - BYTE bBeatsPerMeasure; /* beats per measure (top of time sig) */ - BYTE bBeat; /* what note receives the beat (bottom of time sig.) */ - /* we can assume that 0 means 256th note */ - WORD wGridsPerBeat; /* grids per beat */ -} DMUS_IO_TIMESIG; - -typedef struct _DMUS_IO_STYLE -{ - DMUS_IO_TIMESIG timeSig; /* Styles have a default Time Signature */ - double dblTempo; -} DMUS_IO_STYLE; - -typedef struct _DMUS_IO_VERSION -{ - DWORD dwVersionMS; /* Version # high-order 32 bits */ - DWORD dwVersionLS; /* Version # low-order 32 bits */ -} DMUS_IO_VERSION; - -typedef struct _DMUS_IO_PATTERN -{ - DMUS_IO_TIMESIG timeSig; /* Patterns can override the Style's Time sig. */ - BYTE bGrooveBottom; /* bottom of groove range */ - BYTE bGrooveTop; /* top of groove range */ - WORD wEmbellishment; /* Fill, Break, Intro, End, Normal, Motif */ - WORD wNbrMeasures; /* length in measures */ - BYTE bDestGrooveBottom; /* bottom of groove range for next pattern */ - BYTE bDestGrooveTop; /* top of groove range for next pattern */ - DWORD dwFlags; /* various flags */ -} DMUS_IO_PATTERN; - -typedef struct _DMUS_IO_STYLEPART -{ - DMUS_IO_TIMESIG timeSig; /* can override pattern's */ - DWORD dwVariationChoices[32]; /* MOAW choice bitfield */ - GUID guidPartID; /* identifies the part */ - WORD wNbrMeasures; /* length of the Part */ - BYTE bPlayModeFlags; /* see PLAYMODE flags */ - BYTE bInvertUpper; /* inversion upper limit */ - BYTE bInvertLower; /* inversion lower limit */ - BYTE bPad[3]; /* for DWORD alignment */ - DWORD dwFlags; /* various flags */ -} DMUS_IO_STYLEPART; - -typedef struct _DMUS_IO_PARTREF -{ - GUID guidPartID; /* unique ID for matching up with parts */ - WORD wLogicalPartID; /* corresponds to port/device/midi channel OBSOLETE */ - BYTE bVariationLockID; /* parts with the same ID lock variations. */ - /* high bit is used to identify master Part */ - BYTE bSubChordLevel; /* tells which sub chord level this part wants */ - BYTE bPriority; /* 256 priority levels. Parts with lower priority */ - /* aren't played first when a device runs out of */ - /* notes */ - BYTE bRandomVariation; /* when set, matching variations play in random order */ - /* when clear, matching variations play sequentially */ - WORD wPad; /* not used */ - DWORD dwPChannel; /* replaces wLogicalPartID */ -} DMUS_IO_PARTREF; - -typedef struct _DMUS_IO_STYLENOTE -{ - MUSIC_TIME mtGridStart; /* when this note occurs */ - DWORD dwVariation; /* variation bits */ - MUSIC_TIME mtDuration; /* how long this note lasts */ - short nTimeOffset; /* offset from mtGridStart */ - WORD wMusicValue; /* Position in scale. */ - BYTE bVelocity; /* Note velocity. */ - BYTE bTimeRange; /* Range to randomize start time. */ - BYTE bDurRange; /* Range to randomize duration. */ - BYTE bVelRange; /* Range to randomize velocity. */ - BYTE bInversionID; /* Identifies inversion group to which this note belongs */ - BYTE bPlayModeFlags; /* Can override part */ - /* Following exists only under DX8 and on */ - BYTE bNoteFlags; /* values from DMUS_NOTEF_FLAGS */ -} DMUS_IO_STYLENOTE; - -typedef struct _DMUS_IO_STYLECURVE -{ - MUSIC_TIME mtGridStart; /* when this curve occurs */ - DWORD dwVariation; /* variation bits */ - MUSIC_TIME mtDuration; /* how long this curve lasts */ - MUSIC_TIME mtResetDuration;/* how long after the end of the curve to reset the curve */ - short nTimeOffset; /* offset from mtGridStart */ - short nStartValue; /* curve's start value */ - short nEndValue; /* curve's end value */ - short nResetValue; /* the value to which to reset the curve */ - BYTE bEventType; /* type of curve */ - BYTE bCurveShape; /* shape of curve */ - BYTE bCCData; /* CC# */ - BYTE bFlags; /* Bit 1=TRUE means to send nResetValue. Otherwise, don't. - Other bits are reserved. */ - /* Following was added for DX8. */ - WORD wParamType; /* RPN or NRPN parameter number. */ - WORD wMergeIndex; /* Allows multiple parameters to be merged (pitchbend, volume, and expression.) */ -} DMUS_IO_STYLECURVE; - -typedef struct _DMUS_IO_STYLEMARKER -{ - MUSIC_TIME mtGridStart; /* when this marker occurs */ - DWORD dwVariation; /* variation bits */ - WORD wMarkerFlags; /* how the marker is used */ -} DMUS_IO_STYLEMARKER; - -typedef struct _DMUS_IO_STYLERESOLUTION -{ - DWORD dwVariation; /* variation bits */ - WORD wMusicValue; /* Position in scale. */ - BYTE bInversionID; /* Identifies inversion group to which this note belongs */ - BYTE bPlayModeFlags; /* Can override part */ -} DMUS_IO_STYLERESOLUTION; - -typedef struct _DMUS_IO_STYLE_ANTICIPATION -{ - MUSIC_TIME mtGridStart; /* when this anticipation occurs */ - DWORD dwVariation; /* variation bits */ - short nTimeOffset; /* offset from mtGridStart */ - BYTE bTimeRange; /* Range to randomize start time. */ -} DMUS_IO_STYLE_ANTICIPATION; - -typedef struct _DMUS_IO_MOTIFSETTINGS -{ - DWORD dwRepeats; /* Number of repeats. By default, 0. */ - MUSIC_TIME mtPlayStart; /* Start of playback. By default, 0. */ - MUSIC_TIME mtLoopStart; /* Start of looping portion. By default, 0. */ - MUSIC_TIME mtLoopEnd; /* End of loop. Must be greater than mtLoopStart. Or, 0, indicating loop full motif. */ - DWORD dwResolution; /* Default resolution. */ -} DMUS_IO_MOTIFSETTINGS; - -#pragma pack() - - -/* -RIFF -( - 'DMST' // Style - // Style header chunk - // Every Style has a GUID - [] // Name, author, copyright info., comments - [] // version chunk - ... // Array of parts in the Style, used by patterns - ... // Array of patterns in the Style - ... // Array of bands in the Style - []...// Optional array of chord map references in the Style -) - - // - styh - ( - - ) - - // - guid - ( - - ) - - // - vers - ( - - ) - - // - LIST - ( - 'part' - // Part header chunk - [] // Name, author, copyright info., comments - [] // Optional chunk containing an array of notes in Part - [] // Optional chunk containing an array of curves in Part - [] // Optional chunk containing an array of markers in Part - [] // Optional chunk containing an array of variation resolutions in Part - [] // Optional chunk containing an array of resolution anticipations in Part - ) - - // - prth - ( - - ) - - // - 'note' - ( - // sizeof DMUS_IO_STYLENOTE:DWORD - ... - ) - - // - 'crve' - ( - // sizeof DMUS_IO_STYLECURVE:DWORD - ... - ) - - // - 'mrkr' - ( - // sizeof DMUS_IO_STYLEMARKER:DWORD - ... - ) - - // - 'rsln' - ( - // sizeof DMUS_IO_STYLERESOLUTION:DWORD - ... - ) - - // - 'anpn' - ( - // sizeof DMUS_IO_STYLE_ANTICIPATION:DWORD - ... - ) - - // - LIST - ( - 'pttn' - // Pattern header chunk - // Chunk containing an array of rhythms for chord matching - [] // Name, author, copyright info., comments - [] // Motif settings chunk - [] // Optional band to be associated with the pattern (for motifs) - ... // Array of part reference id's - ) - - // - ptnh - ( - - ) - - // - 'rhtm' - ( - // DWORD's representing rhythms for chord matching based on number - // of measures in the pattern - ) - - - // pref-list - LIST - ( - 'pref' - // part ref chunk - ) - - // - prfc - ( - - ) - - // - mtfs - ( - - ) - - // - LIST - ( - 'prrf' - ... // Array of Chordmap references - ) -*/ - -/* Pattern chunk, for use in Pattern tracks */ - -#define DMUS_FOURCC_PATTERN_FORM mmioFOURCC('D','M','P','T') - -/* -RIFF -( - 'DMPT' // Pattern - // Style header chunk - // The pattern, in single pattern format (includes DMUS_FOURCC_PART_LIST chunks) -) -*/ - - -/* Chord and command file formats */ - -/* These specify possible values for DMUS_IO_COMMAND.bRepeatMode (dx8) */ -typedef enum enumDMUS_PATTERNT_TYPES -{ - DMUS_PATTERNT_RANDOM = 0, /* Play randomly. (dx7 behavior) */ - DMUS_PATTERNT_REPEAT = 1, /* Repeat last pattern. */ - DMUS_PATTERNT_SEQUENTIAL = 2, /* Play sequential starting with first matching pattern. */ - DMUS_PATTERNT_RANDOM_START = 3, /* Play sequential starting with a random pattern. */ - DMUS_PATTERNT_NO_REPEAT = 4, /* Play randomly, but don't play the same pattern twice. */ - DMUS_PATTERNT_RANDOM_ROW = 5 /* Play randomly as a row: don't repeat any pattern until all have played. */ -} DMUS_PATTERNT_TYPES; - -#define DMUS_FOURCC_CHORDTRACK_LIST mmioFOURCC('c','o','r','d') -#define DMUS_FOURCC_CHORDTRACKHEADER_CHUNK mmioFOURCC('c','r','d','h') -#define DMUS_FOURCC_CHORDTRACKBODY_CHUNK mmioFOURCC('c','r','d','b') - -#define DMUS_FOURCC_COMMANDTRACK_CHUNK mmioFOURCC('c','m','n','d') - -typedef struct _DMUS_IO_CHORD -{ - WCHAR wszName[16]; /* Name of the chord */ - MUSIC_TIME mtTime; /* Time of this chord */ - WORD wMeasure; /* Measure this falls on */ - BYTE bBeat; /* Beat this falls on */ - BYTE bFlags; /* Various flags */ -} DMUS_IO_CHORD; - -typedef struct _DMUS_IO_SUBCHORD -{ - DWORD dwChordPattern; /* Notes in the subchord */ - DWORD dwScalePattern; /* Notes in the scale */ - DWORD dwInversionPoints; /* Where inversions can occur */ - DWORD dwLevels; /* Which levels are supported by this subchord */ - BYTE bChordRoot; /* Root of the subchord */ - BYTE bScaleRoot; /* Root of the scale */ -} DMUS_IO_SUBCHORD; - -typedef struct _DMUS_IO_COMMAND -{ - MUSIC_TIME mtTime; /* Time of this command */ - WORD wMeasure; /* Measure this falls on */ - BYTE bBeat; /* Beat this falls on */ - BYTE bCommand; /* Command type (see #defines below) */ - BYTE bGrooveLevel; /* Groove level (0 if command is not a groove) */ - BYTE bGrooveRange; /* Groove range */ - BYTE bRepeatMode; /* Used to control selection of patterns with same groove level */ -} DMUS_IO_COMMAND; - - -/* - - // - LIST - ( - 'cord' - - // Chord body chunk - ) - - // - crdh - ( - // Scale: dword (upper 8 bits for root, lower 24 for scale) - ) - - // - crdb - ( - // sizeof DMUS_IO_CHORD:dword - - // # of DMUS_IO_SUBCHORDS:dword - // sizeof DMUS_IO_SUBCHORDS:dword - // a number of - ) - - - // - 'cmnd' - ( - //sizeof DMUS_IO_COMMAND: DWORD - ... - ) - -*/ - -/* File io for DirectMusic Tool and ToolGraph objects -*/ - -/* RIFF ids: */ - -#define DMUS_FOURCC_TOOLGRAPH_FORM mmioFOURCC('D','M','T','G') -#define DMUS_FOURCC_TOOL_LIST mmioFOURCC('t','o','l','l') -#define DMUS_FOURCC_TOOL_FORM mmioFOURCC('D','M','T','L') -#define DMUS_FOURCC_TOOL_CHUNK mmioFOURCC('t','o','l','h') - -/* io structures: */ - -typedef struct _DMUS_IO_TOOL_HEADER -{ - GUID guidClassID; /* Class id of tool. */ - long lIndex; /* Position in graph. */ - DWORD cPChannels; /* Number of items in channels array. */ - FOURCC ckid; /* chunk ID of tool's data chunk if 0 fccType valid. */ - FOURCC fccType; /* list type if NULL ckid valid. */ - DWORD dwPChannels[1]; /* Array of PChannels, size determined by cPChannels. */ -} DMUS_IO_TOOL_HEADER; - -/* -RIFF -( - 'DMTG' // DirectMusic ToolGraph chunk - [] // GUID for ToolGraph - [] // Optional version info - [] // Name, author, copyright info., comments - // List of Tools -) - - // - 'guid' - ( - - ) - - // - vers - ( - - ) - - // - LIST - ( - 'toll' // Array of tools - ... // Each tool is encapsulated in a RIFF chunk - ) - -// Tools are embedded in a graph. Theoretically, they can be saved as individual files too. -RIFF -( - 'DMTL' - - [] // Tool data. Must be a RIFF readable chunk. -) - - // // Tool header chunk - ( - 'tolh' - // Tool header - ) -*/ - -/* The AudioPath file carries everything for describing a specific audio path, - including Tool Graph and Buffer Descriptor. - This can even be used for configuring a complete performance. -*/ - -#define DMUS_FOURCC_AUDIOPATH_FORM mmioFOURCC('D','M','A','P') - -/* -RIFF -( - 'DMAP' // DirectMusic AudioPath chunk - [] // GUID for this Audio Path configuration - [] // Optional version info - [] // Name, author, copyright info., comments - [] // Optional ToolGraph - [] // Optional list of port configurations - []...// Optional array of Dsound buffer descriptors -) -*/ - -#define DMUS_FOURCC_PORTCONFIGS_LIST mmioFOURCC('p','c','s','l') -#define DMUS_FOURCC_PORTCONFIG_LIST mmioFOURCC('p','c','f','l') -#define DMUS_FOURCC_PORTCONFIG_ITEM mmioFOURCC('p','c','f','h') -#define DMUS_FOURCC_PORTPARAMS_ITEM mmioFOURCC('p','p','r','h') -#define DMUS_FOURCC_DSBUFFER_LIST mmioFOURCC('d','b','f','l') -#define DMUS_FOURCC_DSBUFFATTR_ITEM mmioFOURCC('d','d','a','h') -#define DMUS_FOURCC_PCHANNELS_LIST mmioFOURCC('p','c','h','l') -#define DMUS_FOURCC_PCHANNELS_ITEM mmioFOURCC('p','c','h','h') - -typedef struct _DMUS_IO_PORTCONFIG_HEADER -{ - GUID guidPort; /* GUID of requested port. */ - DWORD dwPChannelBase; /* PChannel that this should start on. */ - DWORD dwPChannelCount; /* How many channels. */ - DWORD dwFlags; /* Various flags. */ -} DMUS_IO_PORTCONFIG_HEADER; - -#define DMUS_PORTCONFIGF_DRUMSON10 1 /* This port configured for drums on channel 10. */ -#define DMUS_PORTCONFIGF_USEDEFAULT 2 /* Use the default port. */ - -/* Each portconfig has one or more pchannel to buffer mappings. Each buffer - is identified by a guid. Each pchannel can map to one or more buffers. - This is defined with one or more DMUS_IO_PCHANNELTOBUFFER_HEADER - structures. Each defines a range of PChannels and the set of buffers - that they connect to. -*/ - -typedef struct _DMUS_IO_PCHANNELTOBUFFER_HEADER -{ - DWORD dwPChannelBase; /* PChannel that this should start on. */ - DWORD dwPChannelCount; /* How many PChannels. */ - DWORD dwBufferCount; /* How many buffers do these connect to. */ - DWORD dwFlags; /* Various flags. Currently reserved for future use. Must be 0. */ -} DMUS_IO_PCHANNELTOBUFFER_HEADER; - -/* Each buffer is represented by an DSBC form. This is wrapped by the - DMUS_IO_BUFFER_ATTRIBUTES_HEADER which identifies how to use the - buffer. In particular, it indicates whether this gets dynamically duplicated - or all references to this should share the same instance. - To resolve references, the unique GUID of the buffer is also stored - in this structure. -*/ - -typedef struct _DMUS_IO_BUFFER_ATTRIBUTES_HEADER -{ - GUID guidBufferID; /* Each buffer config has a unique ID. */ - DWORD dwFlags; /* Various flags. */ -} DMUS_IO_BUFFER_ATTRIBUTES_HEADER; - -/* DMUS_IO_BUFFER_ATTRIBUTES_HEADER.dwFlags: */ -#define DMUS_BUFFERF_SHARED 1 /* Share this with other audio paths, instead of creating unique copies. */ -#define DMUS_BUFFERF_DEFINED 2 /* Use one of the standard predefined buffers (see GUID_Buffer... in dmusici.h.) */ -#define DMUS_BUFFERF_MIXIN 8 /* This is a mixin buffer. */ - -/* - -LIST -( - 'pcsl' // Array of port configurations - ... // One or more port configurations, each in a list chunk -) - -LIST -( - 'pcfl' // List container for one port configuration. - // Portconfig header chunk. - // Port params, to be used to create the port. - []...// Optional array of Dsound buffer descriptors - [] // Optional list of pchannel to buffer assignments - -) - - // // Port config header chunk - ( - 'pcfh' - // Port config header - ) - - // // Port params header chunk - ( - 'pprh' - // Port params header - ) - -LIST -( - 'pchl' // List container for one or more pchannel to buffer assignments. - ... // One or more pchannel to buffer assignment headers and data. - - // - ( - 'pchh' - // Description of PChannels - ... // Array of GUIDs defining the buffers they all connect to. - ) -) - -LIST -( - 'dbfl' // List container for one buffer and buffer attributes header. - // Buffer attributes header. - [] // Buffer configuration. Not required when header uses a predefined buffer type. - - // - ( - 'ddah' - // Buffer attributes. - ) -) -*/ - -/* File io for DirectMusic Band Track object */ - - -/* RIFF ids: */ -#define DMUS_FOURCC_BANDTRACK_FORM mmioFOURCC('D','M','B','T') -#define DMUS_FOURCC_BANDTRACK_CHUNK mmioFOURCC('b','d','t','h') -#define DMUS_FOURCC_BANDS_LIST mmioFOURCC('l','b','d','l') -#define DMUS_FOURCC_BAND_LIST mmioFOURCC('l','b','n','d') -#define DMUS_FOURCC_BANDITEM_CHUNK mmioFOURCC('b','d','i','h') -#define DMUS_FOURCC_BANDITEM_CHUNK2 mmioFOURCC('b','d','2','h') - -/* io structures */ -typedef struct _DMUS_IO_BAND_TRACK_HEADER -{ - BOOL bAutoDownload; /* Determines if Auto-Download is enabled. */ -} DMUS_IO_BAND_TRACK_HEADER; - -typedef struct _DMUS_IO_BAND_ITEM_HEADER -{ - MUSIC_TIME lBandTime; /* Position in track list. */ -} DMUS_IO_BAND_ITEM_HEADER; - -typedef struct _DMUS_IO_BAND_ITEM_HEADER2 -{ - MUSIC_TIME lBandTimeLogical; /* Position in track list. Time in the music with which band change is associated. */ - MUSIC_TIME lBandTimePhysical; /* Precise time band change will take effect. Should be close to logical time. */ -} DMUS_IO_BAND_ITEM_HEADER2; - -/* -RIFF -( - 'DMBT' // DirectMusic Band Track form-type - [] // Band track header - [] // GUID for band track - [] // Optional version info - [] // Name, author, copyright info., comments - // List of Band items -) - - // - 'bdth' - ( - - ) - - // - 'guid' - ( - - ) - - // - vers - ( - - ) - - // - LIST - ( - 'lbdl' - ... // Array of bands, each encapsulated in a list chunk - ) - - // - LIST - ( - 'lbnd' - or // bdih is a legacy format. bd2h is preferred for new content. - // Band - ) - - // or // band item header - ( - or // Band item header - ) -*/ - - -/* File io for DirectMusic Band object -*/ - -/* RIFF ids: */ - -#define DMUS_FOURCC_BAND_FORM mmioFOURCC('D','M','B','D') -#define DMUS_FOURCC_INSTRUMENTS_LIST mmioFOURCC('l','b','i','l') -#define DMUS_FOURCC_INSTRUMENT_LIST mmioFOURCC('l','b','i','n') -#define DMUS_FOURCC_INSTRUMENT_CHUNK mmioFOURCC('b','i','n','s') - -/* Flags for DMUS_IO_INSTRUMENT - */ -#define DMUS_IO_INST_PATCH (1 << 0) /* dwPatch is valid. */ -#define DMUS_IO_INST_BANKSELECT (1 << 1) /* dwPatch contains a valid Bank Select MSB and LSB part */ -#define DMUS_IO_INST_ASSIGN_PATCH (1 << 3) /* dwAssignPatch is valid */ -#define DMUS_IO_INST_NOTERANGES (1 << 4) /* dwNoteRanges is valid */ -#define DMUS_IO_INST_PAN (1 << 5) /* bPan is valid */ -#define DMUS_IO_INST_VOLUME (1 << 6 ) /* bVolume is valid */ -#define DMUS_IO_INST_TRANSPOSE (1 << 7) /* nTranspose is valid */ -#define DMUS_IO_INST_GM (1 << 8) /* Instrument is from GM collection */ -#define DMUS_IO_INST_GS (1 << 9) /* Instrument is from GS collection */ -#define DMUS_IO_INST_XG (1 << 10) /* Instrument is from XG collection */ -#define DMUS_IO_INST_CHANNEL_PRIORITY (1 << 11) /* dwChannelPriority is valid */ -#define DMUS_IO_INST_USE_DEFAULT_GM_SET (1 << 12) /* Always use the default GM set for this patch, */ - /* don't rely on the synth caps stating GM or GS in hardware. */ -#define DMUS_IO_INST_PITCHBENDRANGE (1 << 13) /* nPitchBendRange is valid */ - -/* io structures */ -typedef struct _DMUS_IO_INSTRUMENT -{ - DWORD dwPatch; /* MSB, LSB and Program change to define instrument */ - DWORD dwAssignPatch; /* MSB, LSB and Program change to assign to instrument when downloading */ - DWORD dwNoteRanges[4]; /* 128 bits; one for each MIDI note instrument needs to able to play */ - DWORD dwPChannel; /* PChannel instrument plays on */ - DWORD dwFlags; /* DMUS_IO_INST_ flags */ - BYTE bPan; /* Pan for instrument */ - BYTE bVolume; /* Volume for instrument */ - short nTranspose; /* Number of semitones to transpose notes */ - DWORD dwChannelPriority; /* Channel priority */ - short nPitchBendRange; /* Number of semitones shifted by pitch bend */ -} DMUS_IO_INSTRUMENT; - -/* -// bands can be embedded in other forms -RIFF -( - 'DMBD' // DirectMusic Band chunk - [] // GUID for band - [] // Optional version info - [] // Name, author, copyright info., comments - // List of Instruments -) - - // - 'guid' - ( - - ) - - // - vers - ( - - ) - - // - LIST - ( - 'lbil' // Array of instruments - ... // Each instrument is encapsulated in a list - ) - - // - LIST - ( - 'lbin' - - [] // Optional reference to DLS Collection file. - ) - - // // Instrument chunk - ( - 'bins' - // Instrument header - ) -*/ - -/* This RIFF id and io struct have been added to allow wave files (and the wave object) to - differentiate between streaming and one-shot waves, and to give a prefetch for streaming - waves */ - -#define DMUS_FOURCC_WAVEHEADER_CHUNK mmioFOURCC('w','a','v','h') - -typedef struct _DMUS_IO_WAVE_HEADER -{ - REFERENCE_TIME rtReadAhead; /* How far ahead in the stream wave data will be read (in REFERENCE_TIME). Ignored for one-shot waves. */ - DWORD dwFlags; /* Various flags, including whether this is a streaming wave and whether it can be invalidated. */ -} DMUS_IO_WAVE_HEADER; - - -/* File io for Wave track */ - -/* RIFF ids: */ - -#define DMUS_FOURCC_WAVETRACK_LIST mmioFOURCC('w','a','v','t') -#define DMUS_FOURCC_WAVETRACK_CHUNK mmioFOURCC('w','a','t','h') -#define DMUS_FOURCC_WAVEPART_LIST mmioFOURCC('w','a','v','p') -#define DMUS_FOURCC_WAVEPART_CHUNK mmioFOURCC('w','a','p','h') -#define DMUS_FOURCC_WAVEITEM_LIST mmioFOURCC('w','a','v','i') -#define DMUS_FOURCC_WAVE_LIST mmioFOURCC('w','a','v','e') -#define DMUS_FOURCC_WAVEITEM_CHUNK mmioFOURCC('w','a','i','h') - -/* This flag is included in DMUS_IO_WAVE_TRACK_HEADER.dwFlags. If set, the track will get its - variations from a pattern track, via GetParam(GUID_Variations). */ -#define DMUS_WAVETRACKF_SYNC_VAR 0x1 -/* This is also included in DMUS_IO_WAVE_TRACK_HEADER.dwFlags. If set, variation control - information will persist from one playback instance to the next.*/ -#define DMUS_WAVETRACKF_PERSIST_CONTROL 0x2 - -typedef struct _DMUS_IO_WAVE_TRACK_HEADER -{ - long lVolume; /* Gain, in 1/100th of dB, to be applied to all waves. Note: All gain values should be negative. */ - DWORD dwFlags; /* Flags, including whether this track syncs to a pattern track for its variations. */ -} DMUS_IO_WAVE_TRACK_HEADER; - -typedef struct _DMUS_IO_WAVE_PART_HEADER -{ - long lVolume; /* Gain, in 1/100th of dB, to be applied to all waves in wave part. Note: All gain values should be negative. */ - DWORD dwVariations; /* Variation mask for which of 32 variations */ - DWORD dwPChannel; /* PChannel */ - DWORD dwLockToPart; /* Part ID to lock to. */ - DWORD dwFlags; /* Flags, including stuff for managing how variations are chosen (in low-order nibble) */ - DWORD dwIndex; /* Index for distinguishing multiple parts on the same PChannel*/ -} DMUS_IO_WAVE_PART_HEADER; - -typedef struct _DMUS_IO_WAVE_ITEM_HEADER -{ - long lVolume; /* Gain, in 1/100th of dB. Note: All gain values should be negative. */ - long lPitch; /* Pitch offset in 1/100th of a semitone. */ - DWORD dwVariations; /* Variation flags for which of 32 variations this wave belongs to. */ - REFERENCE_TIME rtTime; /* Start time, in REFERENCE_TIME, if clock time track, or MUSIC_TIME for music time track. */ - REFERENCE_TIME rtStartOffset; /* Distance into wave to start playback, in reference time units. */ - REFERENCE_TIME rtReserved; /* Reserved field. */ - REFERENCE_TIME rtDuration; /* Duration, in REFERENCE_TIME or MUSIC_TIME, depending on track timing format. */ - MUSIC_TIME mtLogicalTime; /* If in music track format, this indicates the musical boundary where this belongs. Otherwise, ignored. */ - DWORD dwLoopStart; /* Start point for a looping wave. */ - DWORD dwLoopEnd; /* End point for a looping wave. */ - DWORD dwFlags; /* Various flags, including whether this is a streaming wave and whether it can be invalidated. */ -} DMUS_IO_WAVE_ITEM_HEADER; - -/* -LIST -{ - 'wavt' // Wave track chunk - // Wave track header - ... // Array of Wave Parts -} - // - 'wath' - { - - } - - // - LIST - { - 'wavp' - // Wave Part Header - // List of wave items - } - - // - 'waph' - { - - } - - // - LIST - { - 'wavi' - ... // Array of waves; each wave is encapsulated in a list - } - - // - LIST - { - 'wave' - // Wave item header - // Reference to wave object - } - - // - 'waih' - { - - } - -*/ - -/* File io for DirectMusic Container file. This embeds a set of related files. And, - in turn, it can be embedded within a segment or script file. -*/ - -#define DMUS_FOURCC_CONTAINER_FORM mmioFOURCC('D','M','C','N') -#define DMUS_FOURCC_CONTAINER_CHUNK mmioFOURCC('c','o','n','h') -#define DMUS_FOURCC_CONTAINED_ALIAS_CHUNK mmioFOURCC('c','o','b','a') -#define DMUS_FOURCC_CONTAINED_OBJECT_CHUNK mmioFOURCC('c','o','b','h') -#define DMUS_FOURCC_CONTAINED_OBJECTS_LIST mmioFOURCC('c','o','s','l') -#define DMUS_FOURCC_CONTAINED_OBJECT_LIST mmioFOURCC('c','o','b','l') - -typedef struct _DMUS_IO_CONTAINER_HEADER -{ - DWORD dwFlags; /* Flags. */ -} DMUS_IO_CONTAINER_HEADER; - -#define DMUS_CONTAINER_NOLOADS (1 << 1) /* Contained items are not loaded when the container is loaded. - Entries will be created in the loader (via SetObject) but - the actual objects will not be created until they are - specifically loaded at a later time. */ - -typedef struct _DMUS_IO_CONTAINED_OBJECT_HEADER -{ - GUID guidClassID; /* Class id of object. */ - DWORD dwFlags; /* Flags, for example DMUS_CONTAINED_OBJF_KEEP. */ - FOURCC ckid; /* chunk ID of track's data chunk if 0 fccType valid. */ - FOURCC fccType; /* list type if NULL ckid valid */ - /* Note that LIST:DMRF may be used for ckid and fccType in order to reference an - object instead of embedding it within the container. */ -} DMUS_IO_CONTAINED_OBJECT_HEADER; - -#define DMUS_CONTAINED_OBJF_KEEP 1 /* Keep the object cached in the loader after the container is released. */ - -/* -RIFF -( - 'DMCN' // DirectMusic Container chunk - // Container header chunk - [] // GUID for container - [] // Optional version info - [] // Name, author, copyright info., comments - // List of objects. -) - - // - 'conh' - ( - - ) - - // - 'guid' - ( - - ) - - // - vers - ( - - ) - - LIST - ( - 'cosl' // Array of embedded objects. - ... // Each object is encapsulated in a LIST chunk - ) - - // // Encapsulates one object - LIST - ( - 'cobl' - [] // Alias. An alternative name by which this object is known - // within the container. - // Required header, includes CLASS ID for object. - [] or // Object data of the type specified in . - // If DMRF, it is a reference of where to find the object. - // Otherwise, it could be any RIFF readable chunk in the - // exact same format as a file. The object will load - // itself from this data. - ) - - // - 'coba' - ( - // Alias, stored as NULL terminated string of WCHARs - ) - - // - 'cobh' - ( - - ) -*/ - -/* File io for DirectMusic Segment object */ - -/* RIFF ids: */ - -#define DMUS_FOURCC_SEGMENT_FORM mmioFOURCC('D','M','S','G') -#define DMUS_FOURCC_SEGMENT_CHUNK mmioFOURCC('s','e','g','h') -#define DMUS_FOURCC_TRACK_LIST mmioFOURCC('t','r','k','l') -#define DMUS_FOURCC_TRACK_FORM mmioFOURCC('D','M','T','K') -#define DMUS_FOURCC_TRACK_CHUNK mmioFOURCC('t','r','k','h') -#define DMUS_FOURCC_TRACK_EXTRAS_CHUNK mmioFOURCC('t','r','k','x') - -/* io structures:*/ - -typedef struct _DMUS_IO_SEGMENT_HEADER -{ - DWORD dwRepeats; /* Number of repeats. By default, 0. */ - MUSIC_TIME mtLength; /* Length, in music time. */ - MUSIC_TIME mtPlayStart; /* Start of playback. By default, 0. */ - MUSIC_TIME mtLoopStart; /* Start of looping portion. By default, 0. */ - MUSIC_TIME mtLoopEnd; /* End of loop. Must be greater than dwPlayStart. Or, 0, indicating loop full segment. */ - DWORD dwResolution; /* Default resolution. */ - /* Following added for DX8: */ - REFERENCE_TIME rtLength; /* Length, in reference time (overrides music time length.) */ - DWORD dwFlags; - DWORD dwReserved; /* Reserved. */ -} DMUS_IO_SEGMENT_HEADER; - -#define DMUS_SEGIOF_REFLENGTH 1 /* Use the time in rtLength for the segment length. */ - -typedef struct _DMUS_IO_TRACK_HEADER -{ - GUID guidClassID; /* Class id of track. */ - DWORD dwPosition; /* Position in track list. */ - DWORD dwGroup; /* Group bits for track. */ - FOURCC ckid; /* chunk ID of track's data chunk. */ - FOURCC fccType; /* list type if ckid is RIFF or LIST */ -} DMUS_IO_TRACK_HEADER; - -/* Additional parameters for the track header chunk, introduced in DX8 and - on, are stored in a separate chunk. */ - -typedef struct _DMUS_IO_TRACK_EXTRAS_HEADER -{ - DWORD dwFlags; /* DX8 Added flags for control tracks. */ - DWORD dwPriority; /* Priority for composition. */ -} DMUS_IO_TRACK_EXTRAS_HEADER; - -/* -RIFF -( - 'DMSG' // DirectMusic Segment chunk - // Segment header chunk - [] // GUID for segment - [] // Optional version info - [] // Name, author, copyright info., comments - [] // Optional container of objects embedded in file. Must precede tracklist. - // List of Tracks - [] // Optional ToolGraph - [] // Optional Audio Path -) - - // - 'segh' - ( - - ) - - // - 'guid' - ( - - ) - - // - vers - ( - - ) - - // - LIST - ( - 'trkl' // Array of tracks - ... // Each track is encapsulated in a RIFF chunk - ) - - // // Tracks can be embedded in a segment or stored as separate files. - RIFF - ( - 'DMTK' - - [] // Optional track flags. - [] // Optional GUID for track object instance (not to be confused with Class id in track header) - [] // Optional version info - [] // Optional name, author, copyright info., comments - [] // Track data. Must be a RIFF readable chunk. - ) - - // // Track header chunk - ( - 'trkh' - // Track header - ) - - // // Track flags chunk - ( - 'trkx' - // DX8 Track flags header - ) -*/ - -/* File io for DirectMusic Song object */ -/* Note: Song file format is not supported in DX8. */ - -/* RIFF ids: */ - -#define DMUS_FOURCC_SONG_FORM mmioFOURCC('D','M','S','O') /* Entire song. */ -#define DMUS_FOURCC_SONG_CHUNK mmioFOURCC('s','n','g','h') /* Song header info. */ -#define DMUS_FOURCC_SONGSEGMENTS_LIST mmioFOURCC('s','e','g','l') /* List of embedded segments. */ -#define DMUS_FOURCC_SONGSEGMENT_LIST mmioFOURCC('s','s','g','l') /* Container for a segment or segment reference. */ -#define DMUS_FOURCC_TOOLGRAPHS_LIST mmioFOURCC('t','l','g','l') /* List of embedded tool graphs. */ -#define DMUS_FOURCC_SEGREFS_LIST mmioFOURCC('s','r','s','l') /* List of segment references. */ -#define DMUS_FOURCC_SEGREF_LIST mmioFOURCC('s','g','r','l') /* Container for a segment reference. */ -#define DMUS_FOURCC_SEGREF_CHUNK mmioFOURCC('s','g','r','h') /* Segment reference header. */ -#define DMUS_FOURCC_SEGTRANS_CHUNK mmioFOURCC('s','t','r','h') /* Set of transitions to this segment. */ -#define DMUS_FOURCC_TRACKREFS_LIST mmioFOURCC('t','r','s','l') /* Set of track references within the segment reference. */ -#define DMUS_FOURCC_TRACKREF_LIST mmioFOURCC('t','k','r','l') /* Container for a track reference. */ -#define DMUS_FOURCC_TRACKREF_CHUNK mmioFOURCC('t','k','r','h') /* Track reference header. */ - -/* io structures:*/ - -typedef struct _DMUS_IO_SONG_HEADER -{ - DWORD dwFlags; - DWORD dwStartSegID; /* Id of the segment that starts playback. */ -} DMUS_IO_SONG_HEADER; - -typedef struct _DMUS_IO_SEGREF_HEADER -{ - DWORD dwID; /* Each has a unique ID. Must be less than DMUS_SONG_MAXSEGID. */ - DWORD dwSegmentID; /* Optional segment to link to. */ - DWORD dwToolGraphID; /* Optional tool graph to use for processing. */ - DWORD dwFlags; /* Various control flags. Currently reserved for future use. Must be 0. */ - DWORD dwNextPlayID; /* ID of next segment, to chain segments into a song. */ -} DMUS_IO_SEGREF_HEADER; - - -typedef struct _DMUS_IO_TRACKREF_HEADER -{ - DWORD dwSegmentID; /* Which segment to find this in. */ - DWORD dwFlags; /* Reference control flags. */ -} DMUS_IO_TRACKREF_HEADER; - -/* Transition definition chunk defines a transition, using an optional transition template - segment. -*/ - -typedef struct _DMUS_IO_TRANSITION_DEF -{ - DWORD dwSegmentID; /* Segment the transition goes to. */ - DWORD dwTransitionID; /* Template segment to use for the transition. */ - DWORD dwPlayFlags; /* Flags to use for transition. */ -} DMUS_IO_TRANSITION_DEF; - -#define DMUS_SONG_MAXSEGID 0x7FFFFFFF /* Segment ids can not go higher than this. */ -#define DMUS_SONG_ANYSEG 0x80000000 /* Special ID to indicate any segment. */ -#define DMUS_SONG_NOSEG 0xFFFFFFFF /* Special ID to indicate no segment. */ -#define DMUS_SONG_NOFROMSEG 0x80000001 /* Special ID for dwSegmentID to indicate transition from nothing (or outside the song) into this segment. */ - -/* -RIFF -( - 'DMSO' // DirectMusic Song chunk - // Song header chunk - [] // GUID for song - [] // Optional version info - [] // Name, author, copyright info., comments - [] // Optional container of objects embedded in file. Must precede segment list. - // List of Segments - [] // Optional list of ToolGraphs - [] // Optional Audio Path - to be shared by all segments in song. - // List of segment references. -) - - // - 'sngh' - ( - - ) - - // - LIST - ( - 'segl' // Array of segments - ... // Each segment is wrapped in this. - ) - - // - LIST - ( - 'ssgl' // Segment container. - [DMSG-form] // Each segment is either a full embedded segment RIFF form. - [DMRF-list] // Or a reference to an external segment. - ) - - // - LIST - ( - 'tlgl' // Array of toolgraphs - ... // Each toolgraph is a full RIFF form. - ) - - // - LIST - ( - 'srsl' // Array of segment references - ... // Each segment reference is contained in a RIFF list. - ) - - // // Segment reference container. - LIST - ( - 'sgrl' - // Segment reference header chunk. - // Segment header chunk. Defines the segment. - // Name, author, etc. Primarily for name, though, which is required for Song->GetSegment(). - [] // Segment transition chunk. Defines how to do transitions from other segments. - [] // List of track references, to create a segment from tracks in multiple segments. - ) - - // // Segment reference header chunk - ( - 'sgrh' - // Segment reference header - ) - - // // Segment transition chunk. - ( - 'strh' - // Default transition. - ... // Additional transitions. - ) - - // // Array of track references - ( - 'trsl' - ... // Each track reference is multiple chunks in a tkrl list. - ) - - // // Track reference container - ( - 'tkrl' - // Track reference header chunk. - // Normal track header chunk. - [] // Optional track flags. - ) - - // // Track reference header chunk - ( - 'tkrh' - // Track reference header - ) -*/ - -/* File io for DirectMusic reference chunk. - This is used to embed a reference to an object. -*/ - -/* RIFF ids: */ - -#define DMUS_FOURCC_REF_LIST mmioFOURCC('D','M','R','F') -#define DMUS_FOURCC_REF_CHUNK mmioFOURCC('r','e','f','h') -#define DMUS_FOURCC_DATE_CHUNK mmioFOURCC('d','a','t','e') -#define DMUS_FOURCC_NAME_CHUNK mmioFOURCC('n','a','m','e') -#define DMUS_FOURCC_FILE_CHUNK mmioFOURCC('f','i','l','e') - -typedef struct _DMUS_IO_REFERENCE -{ - GUID guidClassID; /* Class id is always required. */ - DWORD dwValidData; /* Flags. */ -} DMUS_IO_REFERENCE; - -/* -LIST -( - 'DMRF' // DirectMusic Reference chunk - // Reference header chunk - [] // Optional object GUID. - [] // Optional file date. - [] // Optional name. - [] // Optional file name. - [] // Optional category name. - [] // Optional version info. -) - - // - 'refh' - ( - - ) - - // - 'guid' - ( - - ) - - // - date - ( - - ) - - // - name - ( - // Name, stored as NULL terminated string of WCHARs - ) - - // - file - ( - // File name, stored as NULL terminated string of WCHARs - ) - - // - catg - ( - // Category name, stored as NULL terminated string of WCHARs - ) - - // - vers - ( - - ) -*/ - -/* Chord Maps */ - -/* runtime chunks */ -#define DMUS_FOURCC_CHORDMAP_FORM mmioFOURCC('D','M','P','R') -#define DMUS_FOURCC_IOCHORDMAP_CHUNK mmioFOURCC('p','e','r','h') -#define DMUS_FOURCC_SUBCHORD_CHUNK mmioFOURCC('c','h','d','t') -#define DMUS_FOURCC_CHORDENTRY_CHUNK mmioFOURCC('c','h','e','h') -#define DMUS_FOURCC_SUBCHORDID_CHUNK mmioFOURCC('s','b','c','n') -#define DMUS_FOURCC_IONEXTCHORD_CHUNK mmioFOURCC('n','c','r','d') -#define DMUS_FOURCC_NEXTCHORDSEQ_CHUNK mmioFOURCC('n','c','s','q') -#define DMUS_FOURCC_IOSIGNPOST_CHUNK mmioFOURCC('s','p','s','h') -#define DMUS_FOURCC_CHORDNAME_CHUNK mmioFOURCC('I','N','A','M') - -/* runtime list chunks */ -#define DMUS_FOURCC_CHORDENTRY_LIST mmioFOURCC('c','h','o','e') -#define DMUS_FOURCC_CHORDMAP_LIST mmioFOURCC('c','m','a','p') -#define DMUS_FOURCC_CHORD_LIST mmioFOURCC('c','h','r','d') -#define DMUS_FOURCC_CHORDPALETTE_LIST mmioFOURCC('c','h','p','l') -#define DMUS_FOURCC_CADENCE_LIST mmioFOURCC('c','a','d','e') -#define DMUS_FOURCC_SIGNPOSTITEM_LIST mmioFOURCC('s','p','s','t') - -#define DMUS_FOURCC_SIGNPOST_LIST mmioFOURCC('s','p','s','q') - -/* values for dwChord field of DMUS_IO_PERS_SIGNPOST */ -/* DMUS_SIGNPOSTF_ flags are also used in templates (DMUS_IO_SIGNPOST) */ -#define DMUS_SIGNPOSTF_A 1 -#define DMUS_SIGNPOSTF_B 2 -#define DMUS_SIGNPOSTF_C 4 -#define DMUS_SIGNPOSTF_D 8 -#define DMUS_SIGNPOSTF_E 0x10 -#define DMUS_SIGNPOSTF_F 0x20 -#define DMUS_SIGNPOSTF_LETTER (DMUS_SIGNPOSTF_A | DMUS_SIGNPOSTF_B | DMUS_SIGNPOSTF_C | DMUS_SIGNPOSTF_D | DMUS_SIGNPOSTF_E | DMUS_SIGNPOSTF_F) -#define DMUS_SIGNPOSTF_1 0x100 -#define DMUS_SIGNPOSTF_2 0x200 -#define DMUS_SIGNPOSTF_3 0x400 -#define DMUS_SIGNPOSTF_4 0x800 -#define DMUS_SIGNPOSTF_5 0x1000 -#define DMUS_SIGNPOSTF_6 0x2000 -#define DMUS_SIGNPOSTF_7 0x4000 -#define DMUS_SIGNPOSTF_ROOT (DMUS_SIGNPOSTF_1 | DMUS_SIGNPOSTF_2 | DMUS_SIGNPOSTF_3 | DMUS_SIGNPOSTF_4 | DMUS_SIGNPOSTF_5 | DMUS_SIGNPOSTF_6 | DMUS_SIGNPOSTF_7) -#define DMUS_SIGNPOSTF_CADENCE 0x8000 - -/* values for dwFlags field of DMUS_IO_CHORDMAP */ -#define DMUS_CHORDMAPF_VERSION8 1 /* Chordmap is version 8 or above. */ - -/* values for dwChord field of DMUS_IO_PERS_SIGNPOST */ -#define DMUS_SPOSTCADENCEF_1 2 /* Use the first cadence chord. */ -#define DMUS_SPOSTCADENCEF_2 4 /* Use the second cadence chord. */ - -/* run time data structs */ -typedef struct _DMUS_IO_CHORDMAP -{ - WCHAR wszLoadName[20]; - DWORD dwScalePattern; - DWORD dwFlags; /* Various flags. Only lower 16 bits are significant. */ -} DMUS_IO_CHORDMAP; - -typedef struct _DMUS_IO_CHORDMAP_SUBCHORD -{ - DWORD dwChordPattern; - DWORD dwScalePattern; - DWORD dwInvertPattern; - BYTE bChordRoot; - BYTE bScaleRoot; - WORD wCFlags; - DWORD dwLevels; /* parts or which subchord levels this chord supports */ -} DMUS_IO_CHORDMAP_SUBCHORD; - -/* Legacy name... */ -typedef DMUS_IO_CHORDMAP_SUBCHORD DMUS_IO_PERS_SUBCHORD; - -typedef struct _DMUS_IO_CHORDENTRY -{ - DWORD dwFlags; - WORD wConnectionID; /* replaces runtime "pointer to this" */ -} DMUS_IO_CHORDENTRY; - -typedef struct _DMUS_IO_NEXTCHORD -{ - DWORD dwFlags; - WORD nWeight; - WORD wMinBeats; - WORD wMaxBeats; - WORD wConnectionID; /* points to an ioChordEntry */ -} DMUS_IO_NEXTCHORD; - -typedef struct _DMUS_IO_CHORDMAP_SIGNPOST -{ - DWORD dwChords; /* 1bit per group */ - DWORD dwFlags; -} DMUS_IO_CHORDMAP_SIGNPOST; - -/* Legacy name... */ -typedef DMUS_IO_CHORDMAP_SIGNPOST DMUS_IO_PERS_SIGNPOST; - -/* -RIFF -( - 'DMPR' - // Chord map header chunk - [] // guid chunk - [] // version chunk (two DWORDS) - [] // Unfo chunk - // subchord database - // chord palette - // chord map - // signpost list - ) - - ::= LIST('cmap' ) - - ::= LIST('choe' - // chord entry data - // chord definition - // connecting(next) chords - ) - - ::= LIST('chrd' - // name of chord in wide char format - // list of subchords composing chord - ) - - ::= LIST('chpl' - ... // chord definition - ) - - ::== LIST('spsq' ... ) - - ::= LIST('spst' - - - [] - ) - - ::= LIST('cade' ...) - - ::= perh() - - ::= chdt( - ... ) - - ::= cheh() - - ::= sbcn( ...) - - ::= ncsq( - ...) - - ::= spsh() - -*/ - -/* File io for DirectMusic Script object */ - -/* RIFF ids: */ - -#define DMUS_FOURCC_SCRIPT_FORM mmioFOURCC('D','M','S','C') -#define DMUS_FOURCC_SCRIPT_CHUNK mmioFOURCC('s','c','h','d') -#define DMUS_FOURCC_SCRIPTVERSION_CHUNK mmioFOURCC('s','c','v','e') -#define DMUS_FOURCC_SCRIPTLANGUAGE_CHUNK mmioFOURCC('s','c','l','a') -#define DMUS_FOURCC_SCRIPTSOURCE_CHUNK mmioFOURCC('s','c','s','r') - -/* io structures:*/ - -typedef struct _DMUS_IO_SCRIPT_HEADER -{ - DWORD dwFlags; /* DMUS_SCRIPTIOF_ flags */ -} DMUS_IO_SCRIPT_HEADER; - -#define DMUS_SCRIPTIOF_LOAD_ALL_CONTENT (1 << 0) - /* If set, when the script loads it will also load all the content in its container. */ -#define DMUS_SCRIPTIOF_DOWNLOAD_ALL_SEGMENTS (1 << 1) - /* If set and LOAD_ALL_CONTENT is also set, when the script initializes it will also download all the segments in its container. - If set and LOAD_ALL_CONTENT is not set, when the script calls segment.Load on a segment then the segment will also be downloaded. - If not set, the script must manually download and unload by calling segment.DownloadSoundData and segment.UnloadSoundData. */ - -/* -RIFF -( - 'DMSC' // DirectMusic Script chunk - // Script header chunk - [] // GUID for script - [] // Optional version info - [] // Name, author, copyright info., comments - // Version of DirectMusic this script was authored to run against - // Container of content referenced by the script. - // ActiveX scripting language in which the script is written - or // The script's source code. - // If scsr-ck, the source is embedding in the chunk. - // If DMRF, it is a reference of where to find a text file with the source. - // Class id (guidClassID in DMUS_IO_REFERENCE) must be GUID_NULL because - // this text file is not a DirectMusic object in its own right. -) - - // - 'schd' - ( - - ) - - // - 'guid' - ( - - ) - - // - vers - ( - - ) - - // - scve - ( - - ) - - 'scla' - ( - // Language name, stored as NULL terminated string of WCHARs - ) - - 'scsr' - ( - // Source code, stored as NULL terminated string of WCHARs - ) -*/ - -/* Signpost tracks */ - -#define DMUS_FOURCC_SIGNPOST_TRACK_CHUNK mmioFOURCC( 's', 'g', 'n', 'p' ) - - -typedef struct _DMUS_IO_SIGNPOST -{ - MUSIC_TIME mtTime; - DWORD dwChords; - WORD wMeasure; -} DMUS_IO_SIGNPOST; - -/* - - // - 'sgnp' - ( - //sizeof DMUS_IO_SIGNPOST: DWORD - ... - ) - -*/ - -#define DMUS_FOURCC_MUTE_CHUNK mmioFOURCC('m','u','t','e') - -typedef struct _DMUS_IO_MUTE -{ - MUSIC_TIME mtTime; - DWORD dwPChannel; - DWORD dwPChannelMap; -} DMUS_IO_MUTE; - -/* - - // - 'mute' - ( - //sizeof DMUS_IO_MUTE:DWORD - ... - ) - - -*/ - -/* Used for both style and chord map tracks */ - -#define DMUS_FOURCC_TIME_STAMP_CHUNK mmioFOURCC('s', 't', 'm', 'p') - -/* Style tracks */ - -#define DMUS_FOURCC_STYLE_TRACK_LIST mmioFOURCC('s', 't', 't', 'r') -#define DMUS_FOURCC_STYLE_REF_LIST mmioFOURCC('s', 't', 'r', 'f') - -/* - - // - LIST('sttr' - ( - ... // Array of Style references - ) - - // - LIST('strf' - ( - - - ) - - // - 'stmp' - ( - // time:DWORD - ) - -*/ - -/* Chord map tracks */ - -#define DMUS_FOURCC_PERS_TRACK_LIST mmioFOURCC('p', 'f', 't', 'r') -#define DMUS_FOURCC_PERS_REF_LIST mmioFOURCC('p', 'f', 'r', 'f') - -/* - - // - LIST('pftr' - ( - ... // Array of Chord map references - ) - - // - LIST('pfrf' - ( - - - ) - - // - 'stmp' - ( - // time:DWORD - ) - -*/ - -#define DMUS_FOURCC_TEMPO_TRACK mmioFOURCC('t','e','t','r') - -/* - // tempo array - 'tetr' - ( - // sizeof DMUS_IO_TEMPO_ITEM: DWORD - ... - ) - */ - -#define DMUS_FOURCC_SEQ_TRACK mmioFOURCC('s','e','q','t') -#define DMUS_FOURCC_SEQ_LIST mmioFOURCC('e','v','t','l') -#define DMUS_FOURCC_CURVE_LIST mmioFOURCC('c','u','r','l') - -/* - // sequence track - 'seqt' - ( - // sequence array - 'evtl' - ( - // sizeof DMUS_IO_SEQ_ITEM: DWORD - ... - ) - // curve array - 'curl' - ( - // sizeof DMUS_IO_CURVE_ITEM: DWORD - ... - ) - ) -*/ - -#define DMUS_FOURCC_SYSEX_TRACK mmioFOURCC('s','y','e','x') - -/* - // sysex track - 'syex' - ( - { - - ... // Array of bytes, length defined in the DMUS_IO_SYSEXITEM structure - }... - ) -*/ - -#define DMUS_FOURCC_TIMESIGNATURE_TRACK mmioFOURCC('t','i','m','s') - -typedef struct _DMUS_IO_TIMESIGNATURE_ITEM -{ - MUSIC_TIME lTime; - BYTE bBeatsPerMeasure; /* beats per measure (top of time sig) */ - BYTE bBeat; /* what note receives the beat (bottom of time sig.) */ - /* we can assume that 0 means 256th note */ - WORD wGridsPerBeat; /* grids per beat */ -} DMUS_IO_TIMESIGNATURE_ITEM; - -/* DX6 time signature track - - 'tims' - ( - // size of DMUS_IO_TIMESIGNATURE_ITEM : DWORD - ... - ) -*/ - -/* DX8 Time signature track. The track has been updated from DX7 to support a list of - RIFF chunks. This will allow the time signature track to expand in the future. -*/ - -#define DMUS_FOURCC_TIMESIGTRACK_LIST mmioFOURCC('T','I','M','S') -#define DMUS_FOURCC_TIMESIG_CHUNK DMUS_FOURCC_TIMESIGNATURE_TRACK - -/* -LIST -( - 'TIMS' // Time Signature Track list-type - // Chunk containing an array of time signatures -) - - 'tims' - ( - // size of DMUS_IO_TIMESIGNATURE_ITEM : DWORD - ... - ) - -*/ - -/* DX8 Marker track. This is used to store valid start points and other - flow control parameters that may come later. For example, if we want - to implement more sophisticated looping and branching constructs, they - would live in this track. -*/ - -#define DMUS_FOURCC_MARKERTRACK_LIST mmioFOURCC('M','A','R','K') -#define DMUS_FOURCC_VALIDSTART_CHUNK mmioFOURCC('v','a','l','s') -#define DMUS_FOURCC_PLAYMARKER_CHUNK mmioFOURCC('p','l','a','y') - -/* io structures */ -typedef struct _DMUS_IO_VALID_START -{ - MUSIC_TIME mtTime; /* Time of a legal start. */ -} DMUS_IO_VALID_START; - -typedef struct _DMUS_IO_PLAY_MARKER -{ - MUSIC_TIME mtTime; /* Time of a next legal play point marker. */ -} DMUS_IO_PLAY_MARKER; - -/* -LIST -( - 'MARK' // Marker Track list-type - [] // Chunk containing an array of start points - [] // Chunk containing an array of play start markers -) - - 'vals' - ( - // size of DMUS_IO_VALID_START : DWORD - ... - ) - - 'play' - ( - // size of DMUS_IO_PLAY_MARKER : DWORD - ... - ) - -*/ - -/* segment trigger tracks */ - -/* RIFF ids: */ -#define DMUS_FOURCC_SEGTRACK_LIST mmioFOURCC('s','e','g','t') -#define DMUS_FOURCC_SEGTRACK_CHUNK mmioFOURCC('s','g','t','h') -#define DMUS_FOURCC_SEGMENTS_LIST mmioFOURCC('l','s','g','l') -#define DMUS_FOURCC_SEGMENT_LIST mmioFOURCC('l','s','e','g') -#define DMUS_FOURCC_SEGMENTITEM_CHUNK mmioFOURCC('s','g','i','h') -#define DMUS_FOURCC_SEGMENTITEMNAME_CHUNK mmioFOURCC('s','n','a','m') - -/* io structures */ -typedef struct _DMUS_IO_SEGMENT_TRACK_HEADER -{ - DWORD dwFlags; /* Reserved leave as 0. */ -} DMUS_IO_SEGMENT_TRACK_HEADER; - -typedef struct _DMUS_IO_SEGMENT_ITEM_HEADER -{ - MUSIC_TIME lTimeLogical; /* Position in track list. Time in the music with which the event is associated. */ - MUSIC_TIME lTimePhysical; /* Precise time event will be triggered. Should be close to logical time. */ - DWORD dwPlayFlags; /* Flags for PlaySegment(). */ - DWORD dwFlags; /* Flags. */ -} DMUS_IO_SEGMENT_ITEM_HEADER; - -/* values for dwflags field of DMUS_IO_SEGMENT_ITEM_HEADER */ -#define DMUS_SEGMENTTRACKF_MOTIF 1 /* interpret DMRF as link to style, and use snam as the name of a motif within the style */ - -/* -LIST -( - 'segt' // DirectMusic Segment Trigger Track form-type - [] // Segment track header - // List of Segment Lists -) - - // - 'sgth' - ( - - ) - - // - LIST - ( - 'lsgl' // Array of segments - ... // Each segment is encapsulated in a list (that way it can still be riff parsed.) - ) - - // - LIST - ( - 'lseg' - - // Link to a segment or style file. - [] // Name field. Used with DMUS_SEGMENTTRACKF_MOTIF flag. - ) - - // // segment item header - ( - // Segment item header - ) - - // - ( - // Name, stored as NULL terminated string of WCHARs - ) -*/ - -/* Script track. */ - -/* RIFF ids: */ -#define DMUS_FOURCC_SCRIPTTRACK_LIST mmioFOURCC('s','c','r','t') -#define DMUS_FOURCC_SCRIPTTRACKEVENTS_LIST mmioFOURCC('s','c','r','l') -#define DMUS_FOURCC_SCRIPTTRACKEVENT_LIST mmioFOURCC('s','c','r','e') -#define DMUS_FOURCC_SCRIPTTRACKEVENTHEADER_CHUNK mmioFOURCC('s','c','r','h') -#define DMUS_FOURCC_SCRIPTTRACKEVENTNAME_CHUNK mmioFOURCC('s','c','r','n') - -/* Flags for DMUS_IO_SCRIPTTRACK_TIMING - */ -#define DMUS_IO_SCRIPTTRACKF_PREPARE (1 << 0) /* Fire event in advance of time stamp, at Prepare time. This is the default because it leaves the script time to change the music happening at the target time. */ -#define DMUS_IO_SCRIPTTRACKF_QUEUE (1 << 1) /* Fire event just before time stamp, at Queue time. */ -#define DMUS_IO_SCRIPTTRACKF_ATTIME (1 << 2) /* Fire event right at the time stamp. */ - -typedef struct _DMUS_IO_SCRIPTTRACK_EVENTHEADER -{ - DWORD dwFlags; /* various bits (see DMUS_IO_SCRIPTTRACKF_*) */ - MUSIC_TIME lTimeLogical; /* Position in track list. Time in the music with which the event is associated. */ - MUSIC_TIME lTimePhysical; /* Precise time event will be triggered. Should be close to logical time. */ -} DMUS_IO_SCRIPTTRACK_EVENTHEADER; - -/* - // Script Track - - // - LIST - ( - // List of script events - ) - - // - LIST - ( - ... // Array of event descriptions - ) - - // - LIST - ( - // Event header chunk - - // Routine name - ) - - 'scrh' - ( - - ) - - 'scrn' - ( - // Name, stored as NULL terminated string of WCHARs - ) -*/ - -/* Lyrics/Notification track. */ - -/* RIFF ids: */ -#define DMUS_FOURCC_LYRICSTRACK_LIST mmioFOURCC('l','y','r','t') -#define DMUS_FOURCC_LYRICSTRACKEVENTS_LIST mmioFOURCC('l','y','r','l') -#define DMUS_FOURCC_LYRICSTRACKEVENT_LIST mmioFOURCC('l','y','r','e') -#define DMUS_FOURCC_LYRICSTRACKEVENTHEADER_CHUNK mmioFOURCC('l','y','r','h') -#define DMUS_FOURCC_LYRICSTRACKEVENTTEXT_CHUNK mmioFOURCC('l','y','r','n') - -typedef struct _DMUS_IO_LYRICSTRACK_EVENTHEADER -{ - DWORD dwFlags; /* Reserved leave as 0. */ - DWORD dwTimingFlags; /* Combination DMUS_PMSGF_TOOL_* flags. Determines the precise timing of when the notification happens. Invalid with the flag DMUS_PMSGF_REFTIME, DMUS_PMSGF_MUSICTIME, DMUS_PMSGF_TOOL_FLUSH, or DMUS_PMSGF_LOCKTOREFTIME. */ - MUSIC_TIME lTimeLogical; /* Position in track list. Time in the music with which the event is associated. */ - MUSIC_TIME lTimePhysical; /* Precise time event will be triggered. Should be close to logical time. */ -} DMUS_IO_LYRICSTRACK_EVENTHEADER; - -/* - // Lyrics/Notification Track - - // - LIST - ( - // List of notification events - ) - - // - LIST - ( - ... // Array of event descriptions - ) - - // - LIST - ( - // Event header chunk - // Notification text - ) - - 'lyrh' - ( - - ) - - 'lyrn' - ( - // Name, stored as NULL terminated string of WCHARs - ) -*/ - -/* Parameter control track */ - -/* RIFF ids: */ -#define DMUS_FOURCC_PARAMCONTROLTRACK_TRACK_LIST mmioFOURCC('p','r','m','t') -#define DMUS_FOURCC_PARAMCONTROLTRACK_OBJECT_LIST mmioFOURCC('p','r','o','l') -#define DMUS_FOURCC_PARAMCONTROLTRACK_OBJECT_CHUNK mmioFOURCC('p','r','o','h') -#define DMUS_FOURCC_PARAMCONTROLTRACK_PARAM_LIST mmioFOURCC('p','r','p','l') -#define DMUS_FOURCC_PARAMCONTROLTRACK_PARAM_CHUNK mmioFOURCC('p','r','p','h') -#define DMUS_FOURCC_PARAMCONTROLTRACK_CURVES_CHUNK mmioFOURCC('p','r','c','c') - -typedef struct _DMUS_IO_PARAMCONTROLTRACK_OBJECTHEADER -{ - DWORD dwFlags; /* Reserved. Must be zero. */ - GUID guidTimeFormat; /* Time format to set the object to. Must be GUID_TIME_REFERNCE or GUID_TIME_MUSIC from medparam.h. */ - /* Path for finding the object. These fields correspond to the first five parameters of IDirectMusicSegmentState::GetObjectInPath. */ - DWORD dwPChannel; - DWORD dwStage; - DWORD dwBuffer; - GUID guidObject; - DWORD dwIndex; -} DMUS_IO_PARAMCONTROLTRACK_OBJECTHEADER; - -typedef struct _DMUS_IO_PARAMCONTROLTRACK_PARAMHEADER -{ - DWORD dwFlags; /* Reserved. Must be zero. */ - DWORD dwIndex; /* Index number of the parameter on the object */ -} DMUS_IO_PARAMCONTROLTRACK_PARAMHEADER; - -typedef struct _DMUS_IO_PARAMCONTROLTRACK_CURVEINFO -{ - MUSIC_TIME mtStartTime; - MUSIC_TIME mtEndTime; - float fltStartValue; - float fltEndValue; - DWORD dwCurveType; /* One of the items from the MP_CURVE_TYPE enum in medparam.h */ - DWORD dwFlags; /* A combination of the MPF_ENVLP_* constants in medparam.h */ -} DMUS_IO_PARAMCONTROLTRACK_CURVEINFO; - -/* - // - LIST - ( - ... // one for each object - ) - - // - LIST - ( - // object header chunk - ... // one for each parameter - ) - - // - proh - ( - - ) - - // - LIST - ( - // parameter header chunk - // chunk containing an array of curves - ) - - // - prph - ( - - ) - - // - prcc - ( - // sizeof DMUS_IO_PARAMCONTROLTRACK_CURVEINFO:DWORD - ... // curves, sorted in order of mtTime - ) -*/ - -/* Melody formulation track */ -/* Note: Melody formulation file format is not supported in DX8. */ - -typedef DMUS_CONNECTION_RULE DMUS_IO_CONNECTION_RULE; /* defined in dmusici.h */ - -typedef DMUS_MELODY_FRAGMENT DMUS_IO_MELODY_FRAGMENT; /* defined in dmusici.h */ - -#define DMUS_FOURCC_MELODYFORM_TRACK_LIST mmioFOURCC( 'm', 'f', 'r', 'm' ) -#define DMUS_FOURCC_MELODYFORM_HEADER_CHUNK mmioFOURCC( 'm', 'l', 'f', 'h' ) -#define DMUS_FOURCC_MELODYFORM_BODY_CHUNK mmioFOURCC( 'm', 'l', 'f', 'b' ) - -typedef struct _DMUS_IO_MELFORM -{ - DWORD dwPlaymode; /* NOT CURRENTLY USED - MUST BE 0 */ -} DMUS_IO_MELFORM; - - -/* - // - LIST - ( - 'mfrm' - // Melody formulation header chunk - // Melody formulation body chunk - ) - - // - 'mlfb' - ( - - ) - - // - 'mlfb' - ( - //sizeof DMUS_IO_MELODY_FRAGMENT: DWORD - ... - ) - -*/ - -#if (DIRECTSOUND_VERSION >= 0x0800) - -/* DirectSoundBufferConfig FX Map */ - -/* RIFF ids: */ - -#define DMUS_FOURCC_DSBC_FORM mmioFOURCC('D','S','B','C') -#define DMUS_FOURCC_DSBD_CHUNK mmioFOURCC('d','s','b','d') -#define DMUS_FOURCC_BSID_CHUNK mmioFOURCC('b','s','i','d') -#define DMUS_FOURCC_DS3D_CHUNK mmioFOURCC('d','s','3','d') -#define DMUS_FOURCC_DSBC_LIST mmioFOURCC('f','x','l','s') -#define DMUS_FOURCC_DSFX_FORM mmioFOURCC('D','S','F','X') -#define DMUS_FOURCC_DSFX_CHUNK mmioFOURCC('f','x','h','r') -#define DMUS_FOURCC_DSFX_DATA mmioFOURCC('d','a','t','a') - -/* io structures */ - -typedef struct _DSOUND_IO_DSBUFFERDESC -{ - DWORD dwFlags; /* DirectSound buffer creation flags */ - WORD nChannels; /* No. of channels (rest of buffer format is determined by owning sink) */ - LONG lVolume; /* Initial pan; only used if CTRLVOLUME is specified */ - LONG lPan; /* Initial pan; only used if CTRLPAN is specified */ - DWORD dwReserved; /* Reserved - must be 0 */ -} DSOUND_IO_DSBUFFERDESC; - -typedef struct _DSOUND_IO_DSBUSID -{ - DWORD busid[1]; /* Array size determined from chunk size */ -} DSOUND_IO_DSBUSID; - -typedef struct _DSOUND_IO_3D -{ - GUID guid3DAlgorithm; /* GUID identifying the 3D algorithm to use (defined in dsound.h) */ - DS3DBUFFER ds3d; /* Initial 3D parameters */ -} DSOUND_IO_3D; - -typedef struct _DSOUND_IO_DXDMO_HEADER -{ - DWORD dwEffectFlags; /* Effect creation flags - equivalent to DSEFFECTDESC::dwFlags */ - GUID guidDSFXClass; /* GUID identifying the effect to use - corresponds to a COM CLSID */ - GUID guidReserved; /* Reserved - must be the null GUID */ - GUID guidSendBuffer; /* GUID identifying the buffer to send to if this is a send effect */ - DWORD dwReserved; /* Reserved - must be 0 */ -} DSOUND_IO_DXDMO_HEADER; - -typedef struct _DSOUND_IO_DXDMO_DATA -{ - DWORD data[1]; /* Array size determined by the DMO involved */ -} DSOUND_IO_DXDMO_DATA; - -/* -RIFF -( - 'DSBC' // DirectSoundBufferConfig chunk - [] // GUID identifier for this DirectSoundBufferConfig - [] // Optional version info - [] // Name, author, copyright info., comments - // DirectSound Buffer descriptor chunk - [] // Optional bus id array - [] // Optional 3d Parameters - [] // Optional list of FX descriptors -) - - // - 'guid' - ( - - ) - - // - 'vers' - ( - - ) - - // - 'dsbd' - ( - // Creation parameters and initial settings for the buffer - ) - - // - 'bsid' - ( - // The size of DSOUND_IO_DSBUSID is determined by the chunk size - ) - - // - 'ds3d' - ( - // Initial 3D buffer parameters: position, etc. - ) - - // - LIST - ( - 'fxls' // Array of DMO creation parameter blocks - ... // Each DMO is encapsulated in a RIFF chunk - ) - -// // DMOs can be embedded in a buffer configuration or stored as separate files -RIFF -( - 'DSFX' - // FX header chunk - [] // FX initial settings chunk -) - - // - 'fxhr' - ( - - ) - - // - 'data' - ( - // Opaque data block used by the DMO to load itself. - // For our standard included DMOs, this is simply the structure accepted by - // the DMO's SetAllParameters() method - e.g. struct DSFXChorus for Chorus. - ) -*/ - -#endif - -#ifdef __cplusplus -}; /* extern "C" */ -#endif - -#include - -#endif /* #ifndef _DMUSICF_ */ diff --git a/import/DirectX8/include/dmusici.h b/import/DirectX8/include/dmusici.h deleted file mode 100644 index c6bc37db9..000000000 --- a/import/DirectX8/include/dmusici.h +++ /dev/null @@ -1,1964 +0,0 @@ -/************************************************************************ -* * -* dmusici.h -- This module contains the API for the * -* DirectMusic performance layer * -* * -* Copyright (c) 1998-1999 Microsoft Corporation -* * -************************************************************************/ - -#ifndef _DMUSICI_ -#define _DMUSICI_ - -#include - -#define COM_NO_WINDOWS_H -#include - -#include -#include -/* plugin (track and tool) interfaces. This #include will eventually go away. */ -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef WORD TRANSITION_TYPE; -typedef __int64 REFERENCE_TIME; -typedef long MUSIC_TIME; - -#define MT_MIN 0x80000000 /* Minimum music time value. */ -#define MT_MAX 0x7FFFFFFF /* Maximum music time value. */ - -#define DMUS_PPQ 768 /* parts per quarter note */ - -interface IDirectMusicTrack; -interface IDirectMusicPerformance; -interface IDirectMusicPerformance8; -interface IDirectMusicTool; -interface IDirectMusicSegment; -interface IDirectMusicSegment8; -interface IDirectMusicSegmentState; -interface IDirectMusicSegmentState8; -interface IDirectMusicGraph; -interface IDirectMusicBuffer; -interface IDirectMusicInstrument; -interface IDirectMusicDownloadedInstrument; -interface IDirectMusicBand; -interface IDirectMusicChordMap; -interface IDirectMusicLoader; -interface IDirectMusicLoader8; -interface IDirectMusicScript; -interface IDirectMusicObject; -interface IDirectMusicStyle8; -interface IDirectMusicPatternTrack; -interface IDirectMusicContainer; -interface IDirectMusicTool8; -interface IDirectMusicTrack8; -interface IDirectMusicSong; -interface IDirectMusicAudioPath; -#ifndef __cplusplus -typedef interface IDirectMusicTrack IDirectMusicTrack; -typedef interface IDirectMusicPerformance IDirectMusicPerformance; -typedef interface IDirectMusicPerformance8 IDirectMusicPerformance8; -typedef interface IDirectMusicTool IDirectMusicTool; -typedef interface IDirectMusicSegment IDirectMusicSegment; -typedef interface IDirectMusicSegment8 IDirectMusicSegment8; -typedef interface IDirectMusicSegmentState IDirectMusicSegmentState; -typedef interface IDirectMusicSegmentState8 IDirectMusicSegmentState8; -typedef interface IDirectMusicGraph IDirectMusicGraph; -typedef interface IDirectMusicBuffer IDirectMusicBuffer; -typedef interface IDirectMusicInstrument IDirectMusicInstrument; -typedef interface IDirectMusicDownloadedInstrument IDirectMusicDownloadedInstrument; -typedef interface IDirectMusicBand IDirectMusicBand; -typedef interface IDirectMusicChordMap IDirectMusicChordMap; -typedef interface IDirectMusicObject IDirectMusicObject; -typedef interface IDirectMusicLoader IDirectMusicLoader; -typedef interface IDirectMusicLoader8 IDirectMusicLoader8; -typedef interface IDirectMusicScript IDirectMusicScript; -typedef interface IDirectMusicStyle8 IDirectMusicStyle8; -typedef interface IDirectMusicPatternTrack IDirectMusicPatternTrack; -typedef interface IDirectMusicContainer IDirectMusicContainer; -typedef interface IDirectMusicTool8 IDirectMusicTool8; -typedef interface IDirectMusicTrack8 IDirectMusicTrack8; -typedef interface IDirectMusicSong IDirectMusicSong; -typedef interface IDirectMusicAudioPath IDirectMusicAudioPath; -#endif - -typedef enum enumDMUS_STYLET_TYPES -{ - DMUS_STYLET_PATTERN = 0, - DMUS_STYLET_MOTIF = 1, - DMUS_STYLET_FRAGMENT = 2, -} DMUS_STYLET_TYPES; - - -typedef enum enumDMUS_COMMANDT_TYPES -{ - DMUS_COMMANDT_GROOVE = 0, - DMUS_COMMANDT_FILL = 1, - DMUS_COMMANDT_INTRO = 2, - DMUS_COMMANDT_BREAK = 3, - DMUS_COMMANDT_END = 4, - DMUS_COMMANDT_ENDANDINTRO = 5 -} DMUS_COMMANDT_TYPES; - -typedef enum enumDMUS_SHAPET_TYPES -{ - DMUS_SHAPET_FALLING = 0, - DMUS_SHAPET_LEVEL = 1, - DMUS_SHAPET_LOOPABLE = 2, - DMUS_SHAPET_LOUD = 3, - DMUS_SHAPET_QUIET = 4, - DMUS_SHAPET_PEAKING = 5, - DMUS_SHAPET_RANDOM = 6, - DMUS_SHAPET_RISING = 7, - DMUS_SHAPET_SONG = 8 -} DMUS_SHAPET_TYPES; - -typedef enum enumDMUS_COMPOSEF_FLAGS -{ - DMUS_COMPOSEF_NONE = 0, - DMUS_COMPOSEF_ALIGN = 0x1, - DMUS_COMPOSEF_OVERLAP = 0x2, - DMUS_COMPOSEF_IMMEDIATE = 0x4, - DMUS_COMPOSEF_GRID = 0x8, - DMUS_COMPOSEF_BEAT = 0x10, - DMUS_COMPOSEF_MEASURE = 0x20, - DMUS_COMPOSEF_AFTERPREPARETIME = 0x40, - DMUS_COMPOSEF_VALID_START_BEAT = 0x80, /* In conjunction with DMUS_COMPOSEF_ALIGN, allows the switch to occur on any beat. */ - DMUS_COMPOSEF_VALID_START_GRID = 0x100, /* In conjunction with DMUS_COMPOSEF_ALIGN, allows the switch to occur on any grid. */ - DMUS_COMPOSEF_VALID_START_TICK = 0x200, /* In conjunction with DMUS_COMPOSEF_ALIGN, allows the switch to occur any time. */ - DMUS_COMPOSEF_SEGMENTEND = 0x400, /* Play the transition at the end of the current segment. */ - DMUS_COMPOSEF_MARKER = 0x800, /* Play the transition at the next marker in the current segment. */ - DMUS_COMPOSEF_MODULATE = 0x1000, - DMUS_COMPOSEF_LONG = 0x2000, - DMUS_COMPOSEF_ENTIRE_TRANSITION = 0x4000, /* play the entire transition pattern */ - DMUS_COMPOSEF_1BAR_TRANSITION = 0x8000, /* play one bar of the transition pattern */ - DMUS_COMPOSEF_ENTIRE_ADDITION = 0x10000, /* play the additional pattern in its entirety */ - DMUS_COMPOSEF_1BAR_ADDITION = 0x20000, /* play one bar of the additional pattern */ - DMUS_COMPOSEF_VALID_START_MEASURE = 0x40000, /* In conjunction with DMUS_COMPOSEF_ALIGN, allows the switch to occur on any bar. */ - DMUS_COMPOSEF_DEFAULT = 0x80000, /* Use segment's default boundary */ - DMUS_COMPOSEF_NOINVALIDATE = 0x100000, /* Play without invalidating the currently playing segment(s) */ - DMUS_COMPOSEF_USE_AUDIOPATH = 0x200000, /* Uses the audio paths that are embedded in the segments */ - DMUS_COMPOSEF_INVALIDATE_PRI = 0x400000 /* Invalidate only the current primary seg state */ -} DMUS_COMPOSEF_FLAGS; - -#define DMUS_PMSG_PART \ - DWORD dwSize; \ - REFERENCE_TIME rtTime; /* real time (in 100 nanosecond increments) */ \ - MUSIC_TIME mtTime; /* music time */ \ - DWORD dwFlags; /* various bits (see DMUS_PMSGF_FLAGS enumeration) */ \ - DWORD dwPChannel; /* Performance Channel. The Performance can */ \ - /* use this to determine the port/channel. */ \ - DWORD dwVirtualTrackID; /* virtual track ID */ \ - IDirectMusicTool* pTool; /* tool interface pointer */ \ - IDirectMusicGraph* pGraph; /* tool graph interface pointer */ \ - DWORD dwType; /* PMSG type (see DMUS_PMSGT_TYPES defines) */ \ - DWORD dwVoiceID; /* unique voice id which allows synthesizers to */ \ - /* identify a specific event. For DirectX 6.0, */ \ - /* this field should always be 0. */ \ - DWORD dwGroupID; /* Track group id */ \ - IUnknown* punkUser; /* user com pointer, auto released upon PMSG free */ - -/* every DMUS_PMSG is based off of this structure. The Performance needs - to access these members consistently in every PMSG that goes through it. */ -typedef struct _DMUS_PMSG -{ - /* begin DMUS_PMSG_PART */ - DMUS_PMSG_PART - /* end DMUS_PMSG_PART */ - -} DMUS_PMSG; - -#define DMUS_PCHANNEL_BROADCAST_PERFORMANCE 0xFFFFFFFF /* PMsg is sent on all PChannels of the performance. */ -#define DMUS_PCHANNEL_BROADCAST_AUDIOPATH 0xFFFFFFFE /* PMsg is sent on all PChannels of the audio path. */ -#define DMUS_PCHANNEL_BROADCAST_SEGMENT 0xFFFFFFFD /* PMsg is sent on all PChannels of the segment. */ -#define DMUS_PCHANNEL_BROADCAST_GROUPS 0xFFFFFFFC /* A duplicate PMsg is for each Channels Groups in the performance. */ - -/* The DMUS_PATH constants are used in conjunction with GetObjectInPath to find a requested - interface at a particular stage in the audio path. -*/ -#define DMUS_PATH_SEGMENT 0x1000 /* Get the segment itself (from a segment state.) */ -#define DMUS_PATH_SEGMENT_TRACK 0x1100 /* Look in Track List of Segment. */ -#define DMUS_PATH_SEGMENT_GRAPH 0x1200 /* Get the segment's tool graph. */ -#define DMUS_PATH_SEGMENT_TOOL 0x1300 /* Look in Tool Graph of Segment. */ -#define DMUS_PATH_AUDIOPATH 0x2000 /* Get the audiopath itself (from a segment state.) */ -#define DMUS_PATH_AUDIOPATH_GRAPH 0x2200 /* Get the audiopath's tool graph. */ -#define DMUS_PATH_AUDIOPATH_TOOL 0x2300 /* Look in Tool Graph of Audio Path. */ -#define DMUS_PATH_PERFORMANCE 0x3000 /* Access the performance. */ -#define DMUS_PATH_PERFORMANCE_GRAPH 0x3200 /* Get the performance's tool graph. */ -#define DMUS_PATH_PERFORMANCE_TOOL 0x3300 /* Look in Tool Graph of Performance. */ -#define DMUS_PATH_PORT 0x4000 /* Access the synth. */ -#define DMUS_PATH_BUFFER 0x6000 /* Look in DirectSoundBuffer. */ -#define DMUS_PATH_BUFFER_DMO 0x6100 /* Access a DMO in the buffer. */ -#define DMUS_PATH_MIXIN_BUFFER 0x7000 /* Look in a global mixin buffer. */ -#define DMUS_PATH_MIXIN_BUFFER_DMO 0x7100 /* Access a DMO in a global mixin buffer. */ -#define DMUS_PATH_PRIMARY_BUFFER 0x8000 /* Access the primary buffer. */ - -/* To ignore PChannels when calling GetObjectInPath(), use the DMUS_PCHANNEL_ALL constant. */ -#define DMUS_PCHANNEL_ALL 0xFFFFFFFB - -/* The DMUS_APATH types are used in conjunction with CreateStandardAudioPath to - build default path types. _SHARED_ means the same buffer is shared across multiple - instantiations of the audiopath type. _DYNAMIC_ means a unique buffer is created - every time. -*/ - -#define DMUS_APATH_SHARED_STEREOPLUSREVERB 1 /* A standard music set up with stereo outs and reverb. */ -#define DMUS_APATH_DYNAMIC_3D 6 /* An audio path with one dynamic bus from the synth feeding to a dynamic 3d buffer. Does not send to env reverb. */ -#define DMUS_APATH_DYNAMIC_MONO 7 /* An audio path with one dynamic bus from the synth feeding to a dynamic mono buffer. */ -#define DMUS_APATH_DYNAMIC_STEREO 8 /* An audio path with two dynamic buses from the synth feeding to a dynamic stereo buffer. */ - -typedef struct _DMUS_AUDIOPARAMS -{ - DWORD dwSize; /* Size of this structure. */ - BOOL fInitNow; /* If true, the sink and synth are created immediately and results returned in this structure. */ - DWORD dwValidData; /* Flags indicating which fields below are valid. */ - DWORD dwFeatures; /* Required DMUS_AUDIOF features. */ - DWORD dwVoices; /* Required number of voices. */ - DWORD dwSampleRate; /* Sample rate of synths and sink. */ - CLSID clsidDefaultSynth; /* Class ID of default synthesizer. */ -} DMUS_AUDIOPARAMS; - -/* dwFeatures flags. These indicate which features are required for the audio environment. */ -#define DMUS_AUDIOF_3D 0x1 /* Require 3D buffers. */ -#define DMUS_AUDIOF_ENVIRON 0x2 /* Require environmental modeling. */ -#define DMUS_AUDIOF_EAX 0x4 /* Require use of EAX effects. */ -#define DMUS_AUDIOF_DMOS 0x8 /* Require use of additional DMOs. */ -#define DMUS_AUDIOF_STREAMING 0x10 /* Require support for streaming waves. */ -#define DMUS_AUDIOF_BUFFERS 0x20 /* Require support for multiple buffers (all above cases need this.) */ -#define DMUS_AUDIOF_ALL 0x3F /* Requires everything. */ - -/* dwValidData flags. These indicate which fields in DMUS_AUDIOPARAMS have been filled in. If fInitNow is set, these also return what was allocated. */ -#define DMUS_AUDIOPARAMS_FEATURES 0x00000001 -#define DMUS_AUDIOPARAMS_VOICES 0x00000002 -#define DMUS_AUDIOPARAMS_SAMPLERATE 0x00000004 -#define DMUS_AUDIOPARAMS_DEFAULTSYNTH 0x00000008 - -/* DMUS_PMSGF_FLAGS fill the DMUS_PMSG's dwFlags member */ -typedef enum enumDMUS_PMSGF_FLAGS -{ - DMUS_PMSGF_REFTIME = 1, /* if rtTime is valid */ - DMUS_PMSGF_MUSICTIME = 2, /* if mtTime is valid */ - DMUS_PMSGF_TOOL_IMMEDIATE = 4, /* if PMSG should be processed immediately */ - DMUS_PMSGF_TOOL_QUEUE = 8, /* if PMSG should be processed a little early, at Queue time */ - DMUS_PMSGF_TOOL_ATTIME = 0x10, /* if PMSG should be processed at the time stamp */ - DMUS_PMSGF_TOOL_FLUSH = 0x20, /* if PMSG is being flushed */ - DMUS_PMSGF_LOCKTOREFTIME = 0x40, /* if rtTime can not be overriden by a tempo change. */ - DMUS_PMSGF_DX8 = 0x80 /* if the message has DX8 or later extensions. */ - /* The values of DMUS_TIME_RESOLVE_FLAGS may also be used inside the */ - /* DMUS_PMSG's dwFlags member. */ -} DMUS_PMSGF_FLAGS; - -/* DMUS_PMSGT_TYPES fill the DMUS_PMSG's dwType member */ -typedef enum enumDMUS_PMSGT_TYPES -{ - DMUS_PMSGT_MIDI = 0, /* MIDI short message */ - DMUS_PMSGT_NOTE = 1, /* Interactive Music Note */ - DMUS_PMSGT_SYSEX = 2, /* MIDI long message (system exclusive message) */ - DMUS_PMSGT_NOTIFICATION = 3, /* Notification message */ - DMUS_PMSGT_TEMPO = 4, /* Tempo message */ - DMUS_PMSGT_CURVE = 5, /* Control change / pitch bend, etc. curve */ - DMUS_PMSGT_TIMESIG = 6, /* Time signature */ - DMUS_PMSGT_PATCH = 7, /* Patch changes */ - DMUS_PMSGT_TRANSPOSE = 8, /* Transposition messages */ - DMUS_PMSGT_CHANNEL_PRIORITY = 9, /* Channel priority */ - DMUS_PMSGT_STOP = 10, /* Stop message */ - DMUS_PMSGT_DIRTY = 11, /* Tells Tools that cache GetParam() info to refresh */ - DMUS_PMSGT_WAVE = 12, /* Carries control information for playing a wave. */ - DMUS_PMSGT_LYRIC = 13, /* Lyric message from lyric track. */ - DMUS_PMSGT_SCRIPTLYRIC = 14, /* Lyric message sent by a script with the Trace function. */ - DMUS_PMSGT_USER = 255 /* User message */ -} DMUS_PMSGT_TYPES; - -/* DMUS_SEGF_FLAGS correspond to IDirectMusicPerformance::PlaySegment, and other API */ -typedef enum enumDMUS_SEGF_FLAGS -{ - DMUS_SEGF_REFTIME = 1<<6, /* 0x40 Time parameter is in reference time */ - DMUS_SEGF_SECONDARY = 1<<7, /* 0x80 Secondary segment */ - DMUS_SEGF_QUEUE = 1<<8, /* 0x100 Queue at the end of the primary segment queue (primary only) */ - DMUS_SEGF_CONTROL = 1<<9, /* 0x200 Play as a control track (secondary segments only) */ - DMUS_SEGF_AFTERPREPARETIME = 1<<10, /* 0x400 Play after the prepare time (See IDirectMusicPerformance::GetPrepareTime) */ - DMUS_SEGF_GRID = 1<<11, /* 0x800 Play on grid boundary */ - DMUS_SEGF_BEAT = 1<<12, /* 0x1000 Play on beat boundary */ - DMUS_SEGF_MEASURE = 1<<13, /* 0x2000 Play on measure boundary */ - DMUS_SEGF_DEFAULT = 1<<14, /* 0x4000 Use segment's default boundary */ - DMUS_SEGF_NOINVALIDATE = 1<<15, /* 0x8000 Play without invalidating the currently playing segment(s) */ - DMUS_SEGF_ALIGN = 1<<16, /* 0x10000 Align segment with requested boundary, but switch at first valid point */ - DMUS_SEGF_VALID_START_BEAT = 1<<17, /* 0x20000 In conjunction with DMUS_SEGF_ALIGN, allows the switch to occur on any beat. */ - DMUS_SEGF_VALID_START_GRID = 1<<18, /* 0x40000 In conjunction with DMUS_SEGF_ALIGN, allows the switch to occur on any grid. */ - DMUS_SEGF_VALID_START_TICK = 1<<19, /* 0x80000 In conjunction with DMUS_SEGF_ALIGN, allows the switch to occur any time. */ - DMUS_SEGF_AUTOTRANSITION = 1<<20, /* 0x100000 Compose and play a transition segment, using either the transition template or transition embedded in song. */ - DMUS_SEGF_AFTERQUEUETIME = 1<<21, /* 0x200000 Make sure to play after the queue time. This is default for primary segments */ - DMUS_SEGF_AFTERLATENCYTIME = 1<<22, /* 0x400000 Make sure to play after the latency time. This is true for all segments, so this is a nop */ - DMUS_SEGF_SEGMENTEND = 1<<23, /* 0x800000 Play at the next end of segment. */ - DMUS_SEGF_MARKER = 1<<24, /* 0x1000000 Play at next marker in the primary segment. If there are no markers, default to any other resolution requests. */ - DMUS_SEGF_TIMESIG_ALWAYS = 1<<25, /* 0x2000000 Even if there is no primary segment, align start time with current time signature. */ - DMUS_SEGF_USE_AUDIOPATH = 1<<26, /* 0x4000000 Uses the audio path that is embedded in the segment or song. */ - DMUS_SEGF_VALID_START_MEASURE = 1<<27, /* 0x8000000 In conjunction with DMUS_SEGF_ALIGN, allows the switch to occur on any bar. */ - DMUS_SEGF_INVALIDATE_PRI = 1<<28 /* 0x10000000 invalidate only the current primary seg state */ -} DMUS_SEGF_FLAGS; - -#define DMUS_SEG_REPEAT_INFINITE 0xFFFFFFFF /* For IDirectMusicSegment::SetRepeat*/ -#define DMUS_SEG_ALLTRACKS 0x80000000 /* For IDirectMusicSegment::SetParam() and SetTrackConfig() - selects all tracks instead on nth index. */ -#define DMUS_SEG_ANYTRACK 0x80000000 /* For IDirectMusicSegment::GetParam() - checks each track until it finds one that returns data (not DMUS_E_NOT_FOUND.) */ - - -/* DMUS_TIME_RESOLVE_FLAGS correspond to IDirectMusicPerformance::GetResolvedTime, and can */ -/* also be used interchangeably with the corresponding DMUS_SEGF_FLAGS, since their values */ -/* are intentionally the same */ -typedef enum enumDMUS_TIME_RESOLVE_FLAGS -{ - DMUS_TIME_RESOLVE_AFTERPREPARETIME = DMUS_SEGF_AFTERPREPARETIME, - DMUS_TIME_RESOLVE_AFTERQUEUETIME = DMUS_SEGF_AFTERQUEUETIME, - DMUS_TIME_RESOLVE_AFTERLATENCYTIME = DMUS_SEGF_AFTERLATENCYTIME, - DMUS_TIME_RESOLVE_GRID = DMUS_SEGF_GRID, - DMUS_TIME_RESOLVE_BEAT = DMUS_SEGF_BEAT, - DMUS_TIME_RESOLVE_MEASURE = DMUS_SEGF_MEASURE, - DMUS_TIME_RESOLVE_MARKER = DMUS_SEGF_MARKER, - DMUS_TIME_RESOLVE_SEGMENTEND = DMUS_SEGF_SEGMENTEND, -} DMUS_TIME_RESOLVE_FLAGS; - -/* The following flags are sent inside the DMUS_CHORD_KEY.dwFlags parameter */ -typedef enum enumDMUS_CHORDKEYF_FLAGS -{ - DMUS_CHORDKEYF_SILENT = 1, /* is the chord silent? */ -} DMUS_CHORDKEYF_FLAGS; - -#define DMUS_MAXSUBCHORD 8 - -typedef struct _DMUS_SUBCHORD -{ - DWORD dwChordPattern; /* Notes in the subchord */ - DWORD dwScalePattern; /* Notes in the scale */ - DWORD dwInversionPoints; /* Where inversions can occur */ - DWORD dwLevels; /* Which levels are supported by this subchord */ - BYTE bChordRoot; /* Root of the subchord */ - BYTE bScaleRoot; /* Root of the scale */ -} DMUS_SUBCHORD; - -typedef struct _DMUS_CHORD_KEY -{ - WCHAR wszName[16]; /* Name of the chord */ - WORD wMeasure; /* Measure this falls on */ - BYTE bBeat; /* Beat this falls on */ - BYTE bSubChordCount; /* Number of chords in the list of subchords */ - DMUS_SUBCHORD SubChordList[DMUS_MAXSUBCHORD]; /* List of sub chords */ - DWORD dwScale; /* Scale underlying the entire chord */ - BYTE bKey; /* Key underlying the entire chord */ - BYTE bFlags; /* Miscelaneous flags */ -} DMUS_CHORD_KEY; - -/* DMUS_NOTE_PMSG */ -typedef struct _DMUS_NOTE_PMSG -{ - /* begin DMUS_PMSG_PART */ - DMUS_PMSG_PART - /* end DMUS_PMSG_PART */ - - MUSIC_TIME mtDuration; /* duration */ - WORD wMusicValue; /* Description of note in chord and key. */ - WORD wMeasure; /* Measure in which this note occurs */ - short nOffset; /* Offset from grid at which this note occurs */ - BYTE bBeat; /* Beat (in measure) at which this note occurs */ - BYTE bGrid; /* Grid offset from beat at which this note occurs */ - BYTE bVelocity; /* Note velocity */ - BYTE bFlags; /* see DMUS_NOTEF_FLAGS */ - BYTE bTimeRange; /* Range to randomize time. */ - BYTE bDurRange; /* Range to randomize duration. */ - BYTE bVelRange; /* Range to randomize velocity. */ - BYTE bPlayModeFlags; /* Play mode */ - BYTE bSubChordLevel; /* Which subchord level this note uses. */ - BYTE bMidiValue; /* The MIDI note value, converted from wMusicValue */ - char cTranspose; /* Transposition to add to midi note value after converted from wMusicValue. */ -} DMUS_NOTE_PMSG; - -typedef enum enumDMUS_NOTEF_FLAGS -{ - DMUS_NOTEF_NOTEON = 1, /* Set if this is a MIDI Note On. Otherwise, it is MIDI Note Off */ - /* DX8 flags: */ - DMUS_NOTEF_NOINVALIDATE = 2, /* Don't invalidate this note off. */ - DMUS_NOTEF_NOINVALIDATE_INSCALE = 4,/* Don't invalidate if still within the scale. */ - DMUS_NOTEF_NOINVALIDATE_INCHORD = 8,/* Don't invalidate if still within the chord. */ - DMUS_NOTEF_REGENERATE = 0x10, /* Regenerate the note on an invalidate. */ -} DMUS_NOTEF_FLAGS; - -/* The DMUS_PLAYMODE_FLAGS are used to determine how to convert wMusicValue - into the appropriate bMidiValue. -*/ - -typedef enum enumDMUS_PLAYMODE_FLAGS -{ - DMUS_PLAYMODE_KEY_ROOT = 1, /* Transpose on top of the key root. */ - DMUS_PLAYMODE_CHORD_ROOT = 2, /* Transpose on top of the chord root. */ - DMUS_PLAYMODE_SCALE_INTERVALS = 4, /* Use scale intervals from scale pattern. */ - DMUS_PLAYMODE_CHORD_INTERVALS = 8, /* Use chord intervals from chord pattern. */ - DMUS_PLAYMODE_NONE = 16, /* No mode. Indicates the parent part's mode should be used. */ -} DMUS_PLAYMODE_FLAGS; - -/* The following are playback modes that can be created by combining the DMUS_PLAYMODE_FLAGS - in various ways: -*/ - -/* Fixed. wMusicValue holds final MIDI note value. This is used for drums, sound effects, and sequenced - notes that should not be transposed by the chord or scale. -*/ -#define DMUS_PLAYMODE_FIXED 0 -/* In fixed to key, the musicvalue is again a fixed MIDI value, but it - is transposed on top of the key root. -*/ -#define DMUS_PLAYMODE_FIXEDTOKEY DMUS_PLAYMODE_KEY_ROOT -/* In fixed to chord, the musicvalue is also a fixed MIDI value, but it - is transposed on top of the chord root. -*/ -#define DMUS_PLAYMODE_FIXEDTOCHORD DMUS_PLAYMODE_CHORD_ROOT -/* In Pedalpoint, the key root is used and the notes only track the intervals in - the scale. The chord root and intervals are completely ignored. This is useful - for melodic lines that play relative to the key root. -*/ -#define DMUS_PLAYMODE_PEDALPOINT (DMUS_PLAYMODE_KEY_ROOT | DMUS_PLAYMODE_SCALE_INTERVALS) -/* In the Melodic mode, the chord root is used but the notes only track the intervals in - the scale. The key root and chord intervals are completely ignored. This is useful - for melodic lines that play relative to the chord root. -*/ -#define DMUS_PLAYMODE_MELODIC (DMUS_PLAYMODE_CHORD_ROOT | DMUS_PLAYMODE_SCALE_INTERVALS) -/* Normal chord mode is the prevalent playback mode. - The notes track the intervals in the chord, which is based on the chord root. - If there is a scale component to the MusicValue, the additional intervals - are pulled from the scale and added. - If the chord does not have an interval to match the chord component of - the MusicValue, the note is silent. -*/ -#define DMUS_PLAYMODE_NORMALCHORD (DMUS_PLAYMODE_CHORD_ROOT | DMUS_PLAYMODE_CHORD_INTERVALS) -/* If it is desirable to play a note that is above the top of the chord, the - always play mode (known as "purpleized" in a former life) finds a position - for the note by using intervals from the scale. Essentially, this mode is - a combination of the Normal and Melodic playback modes, where a failure - in Normal causes a second try in Melodic mode. -*/ -#define DMUS_PLAYMODE_ALWAYSPLAY (DMUS_PLAYMODE_MELODIC | DMUS_PLAYMODE_NORMALCHORD) - -/* These playmodes are new for dx8. */ -/* In PedalpointChord, the key root is used and the notes only track the intervals in - the chord. The chord root and scale intervals are completely ignored. This is useful - for chordal lines that play relative to the key root. -*/ -#define DMUS_PLAYMODE_PEDALPOINTCHORD (DMUS_PLAYMODE_KEY_ROOT | DMUS_PLAYMODE_CHORD_INTERVALS) - -/* For completeness, here's a mode that tries for pedalpointchord, but if it fails - uses scale intervals -*/ -#define DMUS_PLAYMODE_PEDALPOINTALWAYS (DMUS_PLAYMODE_PEDALPOINT | DMUS_PLAYMODE_PEDALPOINTCHORD) - - -/* Legacy names for modes... */ -#define DMUS_PLAYMODE_PURPLEIZED DMUS_PLAYMODE_ALWAYSPLAY -#define DMUS_PLAYMODE_SCALE_ROOT DMUS_PLAYMODE_KEY_ROOT -#define DMUS_PLAYMODE_FIXEDTOSCALE DMUS_PLAYMODE_FIXEDTOKEY - - -/* DMUS_MIDI_PMSG */ -typedef struct _DMUS_MIDI_PMSG -{ - /* begin DMUS_PMSG_PART */ - DMUS_PMSG_PART - /* end DMUS_PMSG_PART */ - - BYTE bStatus; - BYTE bByte1; - BYTE bByte2; - BYTE bPad[1]; -} DMUS_MIDI_PMSG; - -/* DMUS_PATCH_PMSG */ -typedef struct _DMUS_PATCH_PMSG -{ - /* begin DMUS_PMSG_PART */ - DMUS_PMSG_PART - /* end DMUS_PMSG_PART */ - - BYTE byInstrument; - BYTE byMSB; - BYTE byLSB; - BYTE byPad[1]; -} DMUS_PATCH_PMSG; - -/* DMUS_TRANSPOSE_PMSG */ -typedef struct _DMUS_TRANSPOSE_PMSG -{ - /* begin DMUS_PMSG_PART */ - DMUS_PMSG_PART - /* end DMUS_PMSG_PART */ - - short nTranspose; - /* Following exists only under DX8 and on (check dwFlags for DMUS_PMSGF_DX8) */ - WORD wMergeIndex; /* Allows multiple parameters to be merged (pitchbend, volume, and expression.)*/ -} DMUS_TRANSPOSE_PMSG; - -/* DMUS_CHANNEL_PRIORITY_PMSG */ -typedef struct _DMUS_CHANNEL_PRIORITY_PMSG -{ - /* begin DMUS_PMSG_PART */ - DMUS_PMSG_PART - /* end DMUS_PMSG_PART */ - - DWORD dwChannelPriority; -} DMUS_CHANNEL_PRIORITY_PMSG; - -/* DMUS_TEMPO_PMSG */ -typedef struct _DMUS_TEMPO_PMSG -{ - /* begin DMUS_PMSG_PART */ - DMUS_PMSG_PART - /* end DMUS_PMSG_PART */ - - double dblTempo; /* the tempo */ -} DMUS_TEMPO_PMSG; - -#define DMUS_TEMPO_MAX 1000 -#define DMUS_TEMPO_MIN 1 - -#define DMUS_MASTERTEMPO_MAX 100.0f -#define DMUS_MASTERTEMPO_MIN 0.01f - -/* DMUS_SYSEX_PMSG */ -typedef struct _DMUS_SYSEX_PMSG -{ - /* begin DMUS_PMSG_PART */ - DMUS_PMSG_PART - /* end DMUS_PMSG_PART */ - - DWORD dwLen; /* length of the data */ - BYTE abData[1]; /* array of data, length equal to dwLen */ -} DMUS_SYSEX_PMSG; - -/* DMUS_CURVE_PMSG */ -typedef struct _DMUS_CURVE_PMSG -{ - /* begin DMUS_PMSG_PART */ - DMUS_PMSG_PART - /* end DMUS_PMSG_PART */ - - MUSIC_TIME mtDuration; /* how long this curve lasts */ - MUSIC_TIME mtOriginalStart; /* must be set to either zero when this PMSG is created or to the original mtTime of the curve */ - MUSIC_TIME mtResetDuration; /* how long after the curve is finished to allow a flush or - invalidation to reset to the reset value, nResetValue */ - short nStartValue; /* curve's start value */ - short nEndValue; /* curve's end value */ - short nResetValue; /* curve's reset value, set when a flush or invalidation - occurs within mtDuration + mtResetDuration */ - WORD wMeasure; /* Measure in which this curve occurs */ - short nOffset; /* Offset from grid at which this curve occurs */ - BYTE bBeat; /* Beat (in measure) at which this curve occurs */ - BYTE bGrid; /* Grid offset from beat at which this curve occurs */ - BYTE bType; /* type of curve */ - BYTE bCurveShape; /* shape of curve */ - BYTE bCCData; /* CC# if this is a control change type */ - BYTE bFlags; /* Curve reset and start from current value flags. */ - /* Following exists only under DX8 and on (check dwFlags for DMUS_PMSGF_DX8) */ - WORD wParamType; /* RPN or NRPN parameter number. */ - WORD wMergeIndex; /* Allows multiple parameters to be merged (pitchbend, volume, and expression.)*/ -} DMUS_CURVE_PMSG; - -typedef enum enumDMUS_CURVE_FLAGS -{ - DMUS_CURVE_RESET = 1, /* When set, the nResetValue must be sent when the - time is reached or an invalidate occurs because - of a transition. If not set, the curve stays - permanently stuck at the new value. */ - DMUS_CURVE_START_FROM_CURRENT = 2/* Ignore Start, start the curve at the current value. - This only works for volume, expression, and pitchbend. */ -} DMUS_CURVE_FLAGS; - - -#define DMUS_CURVE_RESET 1 - -/* Curve shapes */ -enum -{ - DMUS_CURVES_LINEAR = 0, - DMUS_CURVES_INSTANT = 1, - DMUS_CURVES_EXP = 2, - DMUS_CURVES_LOG = 3, - DMUS_CURVES_SINE = 4 -}; -/* curve types */ -#define DMUS_CURVET_PBCURVE 0x03 /* Pitch bend curve. */ -#define DMUS_CURVET_CCCURVE 0x04 /* Control change curve. */ -#define DMUS_CURVET_MATCURVE 0x05 /* Mono aftertouch curve. */ -#define DMUS_CURVET_PATCURVE 0x06 /* Poly aftertouch curve. */ -#define DMUS_CURVET_RPNCURVE 0x07 /* RPN curve with curve type in wParamType. */ -#define DMUS_CURVET_NRPNCURVE 0x08 /* NRPN curve with curve type in wParamType. */ - -/* DMUS_TIMESIG_PMSG */ -typedef struct _DMUS_TIMESIG_PMSG -{ - /* begin DMUS_PMSG_PART */ - DMUS_PMSG_PART - /* end DMUS_PMSG_PART */ - - /* Time signatures define how many beats per measure, which note receives */ - /* the beat, and the grid resolution. */ - BYTE bBeatsPerMeasure; /* beats per measure (top of time sig) */ - BYTE bBeat; /* what note receives the beat (bottom of time sig.) */ - /* we can assume that 0 means 256th note */ - WORD wGridsPerBeat; /* grids per beat */ -} DMUS_TIMESIG_PMSG; - - - -/* notification type values */ -/* The following correspond to GUID_NOTIFICATION_SEGMENT */ -#define DMUS_NOTIFICATION_SEGSTART 0 -#define DMUS_NOTIFICATION_SEGEND 1 -#define DMUS_NOTIFICATION_SEGALMOSTEND 2 -#define DMUS_NOTIFICATION_SEGLOOP 3 -#define DMUS_NOTIFICATION_SEGABORT 4 -/* The following correspond to GUID_NOTIFICATION_PERFORMANCE */ -#define DMUS_NOTIFICATION_MUSICSTARTED 0 -#define DMUS_NOTIFICATION_MUSICSTOPPED 1 -#define DMUS_NOTIFICATION_MUSICALMOSTEND 2 -/* The following corresponds to GUID_NOTIFICATION_MEASUREANDBEAT */ -#define DMUS_NOTIFICATION_MEASUREBEAT 0 -/* The following corresponds to GUID_NOTIFICATION_CHORD */ -#define DMUS_NOTIFICATION_CHORD 0 -/* The following correspond to GUID_NOTIFICATION_COMMAND */ -#define DMUS_NOTIFICATION_GROOVE 0 -#define DMUS_NOTIFICATION_EMBELLISHMENT 1 -/* The following corresponds to GUID_NOTIFICATION_RECOMPOSE */ -#define DMUS_NOTIFICATION_RECOMPOSE 0 - -/* DMUS_NOTIFICATION_PMSG */ -typedef struct _DMUS_NOTIFICATION_PMSG -{ - /* begin DMUS_PMSG_PART */ - DMUS_PMSG_PART - /* end DMUS_PMSG_PART */ - - GUID guidNotificationType; - DWORD dwNotificationOption; - DWORD dwField1; - DWORD dwField2; -} DMUS_NOTIFICATION_PMSG; - -/* DMUS_WAVE_PMSG */ -typedef struct _DMUS_WAVE_PMSG -{ - /* begin DMUS_PMSG_PART */ - DMUS_PMSG_PART - /* end DMUS_PMSG_PART */ - - REFERENCE_TIME rtStartOffset; /* How far into the wave to start, in reference time units only. */ - REFERENCE_TIME rtDuration; /* Duration of the wave, in either reference time or music time. */ - long lOffset; /* Offset from actual time to logical time, in music or ref time. */ - long lVolume; /* Initial volume, in 100ths of a dB. */ - long lPitch; /* Initial pitch, in 100ths of a semitone. */ - BYTE bFlags; /* Flags, including DMUS_WAVEF_OFF... */ -} DMUS_WAVE_PMSG; - -#define DMUS_WAVEF_OFF 1 /* If wave is playing and this is the off message. */ -#define DMUS_WAVEF_STREAMING 2 /* If wave is streaming. */ -#define DMUS_WAVEF_NOINVALIDATE 4 /* Don't invalidate this wave. */ -#define DMUS_WAVEF_NOPREROLL 8 /* Don't preroll any wave data. */ - -/* DMUS_LYRIC_PMSG */ -typedef struct _DMUS_LYRIC_PMSG -{ - /* begin DMUS_PMSG_PART */ - DMUS_PMSG_PART - /* end DMUS_PMSG_PART */ - - WCHAR wszString[1]; /* null-terminated Unicode lyric string (structure is actually larger than size 1) */ -} DMUS_LYRIC_PMSG; - -#define DMUS_MAX_NAME 64 /* Maximum object name length. */ -#define DMUS_MAX_CATEGORY 64 /* Maximum object category name length. */ -#define DMUS_MAX_FILENAME MAX_PATH - -typedef struct _DMUS_VERSION { - DWORD dwVersionMS; - DWORD dwVersionLS; -}DMUS_VERSION, FAR *LPDMUS_VERSION; - -/* Time Signature structure, used by IDirectMusicStyle */ -/* Also used as a parameter for GetParam() and SetParam */ -typedef struct _DMUS_TIMESIGNATURE -{ - MUSIC_TIME mtTime; - BYTE bBeatsPerMeasure; /* beats per measure (top of time sig) */ - BYTE bBeat; /* what note receives the beat (bottom of time sig.) */ - /* we can assume that 0 means 256th note */ - WORD wGridsPerBeat; /* grids per beat */ -} DMUS_TIMESIGNATURE; - -typedef struct _DMUS_VALID_START_PARAM -{ - MUSIC_TIME mtTime; /* Time of the first legal start - point after (or including) the requested time. - This is a returned value. - Time format is the relative offset from requested time. */ -} DMUS_VALID_START_PARAM; - -typedef struct _DMUS_PLAY_MARKER_PARAM -{ - MUSIC_TIME mtTime; /* Time of the first legal segment play - marker before (or including) the requested time. - This is a returned value. - Time format is the relative offset from requested time. */ -} DMUS_PLAY_MARKER_PARAM; - -/* The DMUSOBJECTDESC structure is used to communicate everything you could */ -/* possibly use to describe a DirectMusic object. */ - -typedef struct _DMUS_OBJECTDESC -{ - DWORD dwSize; /* Size of this structure. */ - DWORD dwValidData; /* Flags indicating which fields below are valid. */ - GUID guidObject; /* Unique ID for this object. */ - GUID guidClass; /* GUID for the class of object. */ - FILETIME ftDate; /* Last edited date of object. */ - DMUS_VERSION vVersion; /* Version. */ - WCHAR wszName[DMUS_MAX_NAME]; /* Name of object. */ - WCHAR wszCategory[DMUS_MAX_CATEGORY]; /* Category for object (optional). */ - WCHAR wszFileName[DMUS_MAX_FILENAME]; /* File path. */ - LONGLONG llMemLength; /* Size of Memory data. */ - LPBYTE pbMemData; /* Memory pointer for data. */ - IStream * pStream; /* Stream with data. */ -} DMUS_OBJECTDESC; - -typedef DMUS_OBJECTDESC *LPDMUS_OBJECTDESC; - -/* Flags for dwValidData. When set, a flag indicates that the */ -/* corresponding field in DMUSOBJECTDESC holds valid data. */ - -#define DMUS_OBJ_OBJECT (1 << 0) /* Object GUID is valid. */ -#define DMUS_OBJ_CLASS (1 << 1) /* Class GUID is valid. */ -#define DMUS_OBJ_NAME (1 << 2) /* Name is valid. */ -#define DMUS_OBJ_CATEGORY (1 << 3) /* Category is valid. */ -#define DMUS_OBJ_FILENAME (1 << 4) /* File path is valid. */ -#define DMUS_OBJ_FULLPATH (1 << 5) /* Path is full path. */ -#define DMUS_OBJ_URL (1 << 6) /* Path is URL. */ -#define DMUS_OBJ_VERSION (1 << 7) /* Version is valid. */ -#define DMUS_OBJ_DATE (1 << 8) /* Date is valid. */ -#define DMUS_OBJ_LOADED (1 << 9) /* Object is currently loaded in memory. */ -#define DMUS_OBJ_MEMORY (1 << 10) /* Object is pointed to by pbMemData. */ -#define DMUS_OBJ_STREAM (1 << 11) /* Object is stored in pStream. */ - -/* The DMUS_SCRIPT_ERRORINFO structure describes an error that occurred in a script. - It is returned by methods in IDirectMusicScript. */ -typedef struct _DMUS_SCRIPT_ERRORINFO -{ - DWORD dwSize; /* Size of this structure. */ - HRESULT hr; - ULONG ulLineNumber; - LONG ichCharPosition; - WCHAR wszSourceFile[DMUS_MAX_FILENAME]; - WCHAR wszSourceComponent[DMUS_MAX_FILENAME]; - WCHAR wszDescription[DMUS_MAX_FILENAME]; - WCHAR wszSourceLineText[DMUS_MAX_FILENAME]; -} DMUS_SCRIPT_ERRORINFO; - -/* Track configuration flags, used with IDirectMusicSegment8::SetTrackConfig() */ - -#define DMUS_TRACKCONFIG_OVERRIDE_ALL 1 /* This track should get parameters from this segment before controlling and primary tracks. */ -#define DMUS_TRACKCONFIG_OVERRIDE_PRIMARY 2 /* This track should get parameters from this segment before the primary segment tracks. */ -#define DMUS_TRACKCONFIG_FALLBACK 4 /* This track should get parameters from this segment if the primary and controlling segments don't succeed. */ -#define DMUS_TRACKCONFIG_CONTROL_ENABLED 8 /* GetParam() enabled for this track. */ -#define DMUS_TRACKCONFIG_PLAY_ENABLED 0x10 /* Play() enabled for this track. */ -#define DMUS_TRACKCONFIG_NOTIFICATION_ENABLED 0x20 /* Notifications enabled for this track. */ -#define DMUS_TRACKCONFIG_PLAY_CLOCKTIME 0x40 /* This track plays in clock time, not music time. */ -#define DMUS_TRACKCONFIG_PLAY_COMPOSE 0x80 /* This track should regenerate data each time it starts playing. */ -#define DMUS_TRACKCONFIG_LOOP_COMPOSE 0x100 /* This track should regenerate data each time it repeats. */ -#define DMUS_TRACKCONFIG_COMPOSING 0x200 /* This track is used to compose other tracks. */ -#define DMUS_TRACKCONFIG_CONTROL_PLAY 0x10000 /* This track, when played in a controlling segment, overrides playback of primary segment tracks. */ -#define DMUS_TRACKCONFIG_CONTROL_NOTIFICATION 0x20000 /* This track, when played in a controlling segment, overrides notification of primary segment tracks. */ -/* Additional track config flags for composing transitions */ -#define DMUS_TRACKCONFIG_TRANS1_FROMSEGSTART 0x400 /* Get track info from start of From segment */ -#define DMUS_TRACKCONFIG_TRANS1_FROMSEGCURRENT 0x800 /* Get track info from current place in From segment */ -#define DMUS_TRACKCONFIG_TRANS1_TOSEGSTART 0x1000 /* Get track info from start of To segment */ -#define DMUS_TRACKCONFIG_DEFAULT (DMUS_TRACKCONFIG_CONTROL_ENABLED | DMUS_TRACKCONFIG_PLAY_ENABLED | DMUS_TRACKCONFIG_NOTIFICATION_ENABLED) - -/* #defines for melody fragments */ -/* Note: Melody formulation is not supported in DX8. */ - -#define DMUS_MAX_FRAGMENTLABEL 20 - -#define DMUS_FRAGMENTF_USE_REPEAT 0x1 -#define DMUS_FRAGMENTF_REJECT_REPEAT (0x1 << 1) -#define DMUS_FRAGMENTF_USE_LABEL (0x1 << 2) - -#define DMUS_CONNECTIONF_INTERVALS (0x1 << 1) /* Use transition intervals */ -#define DMUS_CONNECTIONF_OVERLAP (0x1 << 2) /* Use overlapping notes for transitions */ - -/* Get/SetParam structs for commands */ -/* PARAM structures, used by GetParam() and SetParam() */ -typedef struct _DMUS_COMMAND_PARAM -{ - BYTE bCommand; - BYTE bGrooveLevel; - BYTE bGrooveRange; - BYTE bRepeatMode; -} DMUS_COMMAND_PARAM; - -typedef struct _DMUS_COMMAND_PARAM_2 -{ - MUSIC_TIME mtTime; - BYTE bCommand; - BYTE bGrooveLevel; - BYTE bGrooveRange; - BYTE bRepeatMode; -} DMUS_COMMAND_PARAM_2; - -/* Get/SetParam structs for melody fragments */ -/* Note: Melody formulation is not supported in DX8. */ -typedef struct _DMUS_CONNECTION_RULE -{ - DWORD dwFlags; /* DMUS_CONNECTIONF_ flags */ - DWORD dwIntervals; /* Legal transition intervals (first 24 bits; two-octave range) */ -} DMUS_CONNECTION_RULE; - -typedef struct _DMUS_MELODY_FRAGMENT -{ - MUSIC_TIME mtTime; - DWORD dwID; /* This fragment's ID */ - WCHAR wszVariationLabel[DMUS_MAX_FRAGMENTLABEL]; /* Each style translates this into a set of variations (held in part ref) */ - DWORD dwVariationFlags; /* A set of variations */ - DWORD dwRepeatFragmentID; /* ID of a fragment to repeat */ - DWORD dwFragmentFlags; /* DMUS_FRAGMENTF_ flags */ - DWORD dwPlayModeFlags; /* NOT CURRENTLY USED - MUST BE 0 */ - DWORD dwTransposeIntervals; /* Legal transposition intervals (first 24 bits; two-octave range) */ - DMUS_COMMAND_PARAM Command; - DMUS_CONNECTION_RULE ConnectionArc; -} DMUS_MELODY_FRAGMENT; - -typedef IDirectMusicObject __RPC_FAR *LPDMUS_OBJECT; -typedef IDirectMusicLoader __RPC_FAR *LPDMUS_LOADER; -typedef IDirectMusicBand __RPC_FAR *LPDMUS_BAND; - -#define DMUSB_LOADED (1 << 0) /* Set when band has been loaded */ -#define DMUSB_DEFAULT (1 << 1) /* Set when band is default band for a style */ - -/*//////////////////////////////////////////////////////////////////// -// IDirectMusicBand */ -#undef INTERFACE -#define INTERFACE IDirectMusicBand -DECLARE_INTERFACE_(IDirectMusicBand, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicBand */ - STDMETHOD(CreateSegment) (THIS_ IDirectMusicSegment** ppSegment) PURE; - STDMETHOD(Download) (THIS_ IDirectMusicPerformance* pPerformance) PURE; - STDMETHOD(Unload) (THIS_ IDirectMusicPerformance* pPerformance) PURE; -}; - -typedef IDirectMusicBand IDirectMusicBand8; - -/*//////////////////////////////////////////////////////////////////// -// IDirectMusicObject */ -#undef INTERFACE -#define INTERFACE IDirectMusicObject -DECLARE_INTERFACE_(IDirectMusicObject, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicObject */ - STDMETHOD(GetDescriptor) (THIS_ LPDMUS_OBJECTDESC pDesc) PURE; - STDMETHOD(SetDescriptor) (THIS_ LPDMUS_OBJECTDESC pDesc) PURE; - STDMETHOD(ParseDescriptor) (THIS_ LPSTREAM pStream, - LPDMUS_OBJECTDESC pDesc) PURE; -}; - -typedef IDirectMusicObject IDirectMusicObject8; - -/*//////////////////////////////////////////////////////////////////// -// IDirectMusicLoader */ -#undef INTERFACE -#define INTERFACE IDirectMusicLoader -DECLARE_INTERFACE_(IDirectMusicLoader, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicLoader */ - STDMETHOD(GetObject) (THIS_ LPDMUS_OBJECTDESC pDesc, - REFIID riid, - LPVOID FAR *ppv) PURE; - STDMETHOD(SetObject) (THIS_ LPDMUS_OBJECTDESC pDesc) PURE; - STDMETHOD(SetSearchDirectory) (THIS_ REFGUID rguidClass, - WCHAR *pwzPath, - BOOL fClear) PURE; - STDMETHOD(ScanDirectory) (THIS_ REFGUID rguidClass, - WCHAR *pwzFileExtension, - WCHAR *pwzScanFileName) PURE; - STDMETHOD(CacheObject) (THIS_ IDirectMusicObject * pObject) PURE; - STDMETHOD(ReleaseObject) (THIS_ IDirectMusicObject * pObject) PURE; - STDMETHOD(ClearCache) (THIS_ REFGUID rguidClass) PURE; - STDMETHOD(EnableCache) (THIS_ REFGUID rguidClass, - BOOL fEnable) PURE; - STDMETHOD(EnumObject) (THIS_ REFGUID rguidClass, - DWORD dwIndex, - LPDMUS_OBJECTDESC pDesc) PURE; -}; - -/*//////////////////////////////////////////////////////////////////// -// IDirectMusicLoader8 */ -#undef INTERFACE -#define INTERFACE IDirectMusicLoader8 -DECLARE_INTERFACE_(IDirectMusicLoader8, IDirectMusicLoader) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicLoader */ - STDMETHOD(GetObject) (THIS_ LPDMUS_OBJECTDESC pDesc, - REFIID riid, - LPVOID FAR *ppv) PURE; - STDMETHOD(SetObject) (THIS_ LPDMUS_OBJECTDESC pDesc) PURE; - STDMETHOD(SetSearchDirectory) (THIS_ REFGUID rguidClass, - WCHAR *pwzPath, - BOOL fClear) PURE; - STDMETHOD(ScanDirectory) (THIS_ REFGUID rguidClass, - WCHAR *pwzFileExtension, - WCHAR *pwzScanFileName) PURE; - STDMETHOD(CacheObject) (THIS_ IDirectMusicObject * pObject) PURE; - STDMETHOD(ReleaseObject) (THIS_ IDirectMusicObject * pObject) PURE; - STDMETHOD(ClearCache) (THIS_ REFGUID rguidClass) PURE; - STDMETHOD(EnableCache) (THIS_ REFGUID rguidClass, - BOOL fEnable) PURE; - STDMETHOD(EnumObject) (THIS_ REFGUID rguidClass, - DWORD dwIndex, - LPDMUS_OBJECTDESC pDesc) PURE; - - /* IDirectMusicLoader8 */ - STDMETHOD_(void, CollectGarbage) (THIS) PURE; - STDMETHOD(ReleaseObjectByUnknown) (THIS_ IUnknown *pObject) PURE; - STDMETHOD(LoadObjectFromFile) (THIS_ REFGUID rguidClassID, - REFIID iidInterfaceID, - WCHAR *pwzFilePath, - void ** ppObject) PURE; -}; - -/* Stream object supports IDirectMusicGetLoader interface to access loader while file parsing. */ - -#undef INTERFACE -#define INTERFACE IDirectMusicGetLoader -DECLARE_INTERFACE_(IDirectMusicGetLoader, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicGetLoader */ - STDMETHOD(GetLoader) (THIS_ IDirectMusicLoader ** ppLoader) PURE; -}; - -typedef IDirectMusicGetLoader IDirectMusicGetLoader8; - -/*//////////////////////////////////////////////////////////////////// -// IDirectMusicSegment */ -#undef INTERFACE -#define INTERFACE IDirectMusicSegment -DECLARE_INTERFACE_(IDirectMusicSegment, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicSegment */ - STDMETHOD(GetLength) (THIS_ MUSIC_TIME* pmtLength) PURE; - STDMETHOD(SetLength) (THIS_ MUSIC_TIME mtLength) PURE; - STDMETHOD(GetRepeats) (THIS_ DWORD* pdwRepeats) PURE; - STDMETHOD(SetRepeats) (THIS_ DWORD dwRepeats) PURE; - STDMETHOD(GetDefaultResolution) (THIS_ DWORD* pdwResolution) PURE; - STDMETHOD(SetDefaultResolution) (THIS_ DWORD dwResolution) PURE; - STDMETHOD(GetTrack) (THIS_ REFGUID rguidType, - DWORD dwGroupBits, - DWORD dwIndex, - IDirectMusicTrack** ppTrack) PURE; - STDMETHOD(GetTrackGroup) (THIS_ IDirectMusicTrack* pTrack, - DWORD* pdwGroupBits) PURE; - STDMETHOD(InsertTrack) (THIS_ IDirectMusicTrack* pTrack, - DWORD dwGroupBits) PURE; - STDMETHOD(RemoveTrack) (THIS_ IDirectMusicTrack* pTrack) PURE; - STDMETHOD(InitPlay) (THIS_ IDirectMusicSegmentState** ppSegState, - IDirectMusicPerformance* pPerformance, - DWORD dwFlags) PURE; - STDMETHOD(GetGraph) (THIS_ IDirectMusicGraph** ppGraph) PURE; - STDMETHOD(SetGraph) (THIS_ IDirectMusicGraph* pGraph) PURE; - STDMETHOD(AddNotificationType) (THIS_ REFGUID rguidNotificationType) PURE; - STDMETHOD(RemoveNotificationType) (THIS_ REFGUID rguidNotificationType) PURE; - STDMETHOD(GetParam) (THIS_ REFGUID rguidType, - DWORD dwGroupBits, - DWORD dwIndex, - MUSIC_TIME mtTime, - MUSIC_TIME* pmtNext, - void* pParam) PURE; - STDMETHOD(SetParam) (THIS_ REFGUID rguidType, - DWORD dwGroupBits, - DWORD dwIndex, - MUSIC_TIME mtTime, - void* pParam) PURE; - STDMETHOD(Clone) (THIS_ MUSIC_TIME mtStart, - MUSIC_TIME mtEnd, - IDirectMusicSegment** ppSegment) PURE; - STDMETHOD(SetStartPoint) (THIS_ MUSIC_TIME mtStart) PURE; - STDMETHOD(GetStartPoint) (THIS_ MUSIC_TIME* pmtStart) PURE; - STDMETHOD(SetLoopPoints) (THIS_ MUSIC_TIME mtStart, - MUSIC_TIME mtEnd) PURE; - STDMETHOD(GetLoopPoints) (THIS_ MUSIC_TIME* pmtStart, - MUSIC_TIME* pmtEnd) PURE; - STDMETHOD(SetPChannelsUsed) (THIS_ DWORD dwNumPChannels, - DWORD* paPChannels) PURE; -}; - -/*//////////////////////////////////////////////////////////////////// -// IDirectMusicSegment8 */ -#undef INTERFACE -#define INTERFACE IDirectMusicSegment8 -DECLARE_INTERFACE_(IDirectMusicSegment8, IDirectMusicSegment) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicSegment */ - STDMETHOD(GetLength) (THIS_ MUSIC_TIME* pmtLength) PURE; - STDMETHOD(SetLength) (THIS_ MUSIC_TIME mtLength) PURE; - STDMETHOD(GetRepeats) (THIS_ DWORD* pdwRepeats) PURE; - STDMETHOD(SetRepeats) (THIS_ DWORD dwRepeats) PURE; - STDMETHOD(GetDefaultResolution) (THIS_ DWORD* pdwResolution) PURE; - STDMETHOD(SetDefaultResolution) (THIS_ DWORD dwResolution) PURE; - STDMETHOD(GetTrack) (THIS_ REFGUID rguidType, - DWORD dwGroupBits, - DWORD dwIndex, - IDirectMusicTrack** ppTrack) PURE; - STDMETHOD(GetTrackGroup) (THIS_ IDirectMusicTrack* pTrack, - DWORD* pdwGroupBits) PURE; - STDMETHOD(InsertTrack) (THIS_ IDirectMusicTrack* pTrack, - DWORD dwGroupBits) PURE; - STDMETHOD(RemoveTrack) (THIS_ IDirectMusicTrack* pTrack) PURE; - STDMETHOD(InitPlay) (THIS_ IDirectMusicSegmentState** ppSegState, - IDirectMusicPerformance* pPerformance, - DWORD dwFlags) PURE; - STDMETHOD(GetGraph) (THIS_ IDirectMusicGraph** ppGraph) PURE; - STDMETHOD(SetGraph) (THIS_ IDirectMusicGraph* pGraph) PURE; - STDMETHOD(AddNotificationType) (THIS_ REFGUID rguidNotificationType) PURE; - STDMETHOD(RemoveNotificationType) (THIS_ REFGUID rguidNotificationType) PURE; - STDMETHOD(GetParam) (THIS_ REFGUID rguidType, - DWORD dwGroupBits, - DWORD dwIndex, - MUSIC_TIME mtTime, - MUSIC_TIME* pmtNext, - void* pParam) PURE; - STDMETHOD(SetParam) (THIS_ REFGUID rguidType, - DWORD dwGroupBits, - DWORD dwIndex, - MUSIC_TIME mtTime, - void* pParam) PURE; - STDMETHOD(Clone) (THIS_ MUSIC_TIME mtStart, - MUSIC_TIME mtEnd, - IDirectMusicSegment** ppSegment) PURE; - STDMETHOD(SetStartPoint) (THIS_ MUSIC_TIME mtStart) PURE; - STDMETHOD(GetStartPoint) (THIS_ MUSIC_TIME* pmtStart) PURE; - STDMETHOD(SetLoopPoints) (THIS_ MUSIC_TIME mtStart, - MUSIC_TIME mtEnd) PURE; - STDMETHOD(GetLoopPoints) (THIS_ MUSIC_TIME* pmtStart, - MUSIC_TIME* pmtEnd) PURE; - STDMETHOD(SetPChannelsUsed) (THIS_ DWORD dwNumPChannels, - DWORD* paPChannels) PURE; - /* IDirectMusicSegment8 */ - STDMETHOD(SetTrackConfig) (THIS_ REFGUID rguidTrackClassID, /* Class ID of the type of track on which to set the configuration flags. */ - DWORD dwGroupBits, /* Group bits. */ - DWORD dwIndex, /* Nth track (or DMUS_SEG_ALLTRACKS) that matches class id and group id. */ - DWORD dwFlagsOn, /* DMUS_TRACKCONFIG_ flags to enable. */ - DWORD dwFlagsOff) PURE; /* DMUS_TRACKCONFIG_ flags to disable. */ - STDMETHOD(GetAudioPathConfig) (THIS_ IUnknown ** ppAudioPathConfig) PURE; - STDMETHOD(Compose) (THIS_ MUSIC_TIME mtTime, - IDirectMusicSegment* pFromSegment, - IDirectMusicSegment* pToSegment, - IDirectMusicSegment** ppComposedSegment) PURE; - STDMETHOD(Download) (THIS_ IUnknown *pAudioPath) PURE; - STDMETHOD(Unload) (THIS_ IUnknown *pAudioPath) PURE; -}; - -/*///////////////////////////////////////////////////////////////////// -// IDirectMusicSegmentState */ -#undef INTERFACE -#define INTERFACE IDirectMusicSegmentState -DECLARE_INTERFACE_(IDirectMusicSegmentState, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicSegmentState */ - STDMETHOD(GetRepeats) (THIS_ DWORD* pdwRepeats) PURE; - STDMETHOD(GetSegment ) (THIS_ IDirectMusicSegment** ppSegment) PURE; - STDMETHOD(GetStartTime) (THIS_ MUSIC_TIME* pmtStart) PURE; - STDMETHOD(GetSeek) (THIS_ MUSIC_TIME* pmtSeek) PURE; - STDMETHOD(GetStartPoint) (THIS_ MUSIC_TIME* pmtStart) PURE; -}; - -/*///////////////////////////////////////////////////////////////////// -// IDirectMusicSegmentState8 */ -#undef INTERFACE -#define INTERFACE IDirectMusicSegmentState8 -DECLARE_INTERFACE_(IDirectMusicSegmentState8, IDirectMusicSegmentState) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicSegmentState */ - STDMETHOD(GetRepeats) (THIS_ DWORD* pdwRepeats) PURE; - STDMETHOD(GetSegment ) (THIS_ IDirectMusicSegment** ppSegment) PURE; - STDMETHOD(GetStartTime) (THIS_ MUSIC_TIME* pmtStart) PURE; - STDMETHOD(GetSeek) (THIS_ MUSIC_TIME* pmtSeek) PURE; - STDMETHOD(GetStartPoint) (THIS_ MUSIC_TIME* pmtStart) PURE; - - /* IDirectMusicSegmentState8 */ - STDMETHOD(SetTrackConfig) (THIS_ REFGUID rguidTrackClassID, /* Class ID of the type of track on which to set the configuration flags. */ - DWORD dwGroupBits, /* Group bits. */ - DWORD dwIndex, /* Nth track (or DMUS_SEG_ALLTRACKS) that matches class id and group id. */ - DWORD dwFlagsOn, /* DMUS_TRACKCONFIG_ flags to enable. */ - DWORD dwFlagsOff) PURE; /* DMUS_TRACKCONFIG_ flags to disable. */ - STDMETHOD(GetObjectInPath) (THIS_ DWORD dwPChannel, /* PChannel to search. */ - DWORD dwStage, /* Which stage in the path. */ - DWORD dwBuffer, /* Which buffer to address, if more than one. */ - REFGUID guidObject, /* ClassID of object. */ - DWORD dwIndex, /* Which object of that class. */ - REFGUID iidInterface,/* Requested COM interface. */ - void ** ppObject) PURE; /* Pointer to interface. */ -}; - -/*//////////////////////////////////////////////////////////////////// -// IDirectMusicAudioPath */ -#undef INTERFACE -#define INTERFACE IDirectMusicAudioPath -DECLARE_INTERFACE_(IDirectMusicAudioPath, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicAudioPath */ - STDMETHOD(GetObjectInPath) (THIS_ DWORD dwPChannel, /* PChannel to search. */ - DWORD dwStage, /* Which stage in the path. */ - DWORD dwBuffer, /* Which buffer to address, if more than one. */ - REFGUID guidObject, /* ClassID of object. */ - DWORD dwIndex, /* Which object of that class. */ - REFGUID iidInterface,/* Requested COM interface. */ - void ** ppObject) PURE; /* Pointer to interface. */ - STDMETHOD(Activate) (THIS_ BOOL fActivate) PURE;/* True to activate, False to deactivate. */ - STDMETHOD(SetVolume) (THIS_ long lVolume, /* Gain, in 100ths of a dB. This must be negative (0 represents full volume.) */ - DWORD dwDuration) PURE;/* Duration of volume ramp in milliseconds. Note that 0 is more efficient. */ - STDMETHOD(ConvertPChannel) (THIS_ DWORD dwPChannelIn, /* Pchannel of source. */ - DWORD *pdwPChannelOut) PURE; /* Equivalent pchannel on performance. */ -}; - -typedef IDirectMusicAudioPath IDirectMusicAudioPath8; - -/*//////////////////////////////////////////////////////////////////// -// IDirectMusicPerformance */ -#undef INTERFACE -#define INTERFACE IDirectMusicPerformance -DECLARE_INTERFACE_(IDirectMusicPerformance, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicPerformance */ - STDMETHOD(Init) (THIS_ IDirectMusic** ppDirectMusic, - LPDIRECTSOUND pDirectSound, - HWND hWnd) PURE; - STDMETHOD(PlaySegment) (THIS_ IDirectMusicSegment* pSegment, - DWORD dwFlags, - __int64 i64StartTime, - IDirectMusicSegmentState** ppSegmentState) PURE; - STDMETHOD(Stop) (THIS_ IDirectMusicSegment* pSegment, - IDirectMusicSegmentState* pSegmentState, - MUSIC_TIME mtTime, - DWORD dwFlags) PURE; - STDMETHOD(GetSegmentState) (THIS_ IDirectMusicSegmentState** ppSegmentState, - MUSIC_TIME mtTime) PURE; - STDMETHOD(SetPrepareTime) (THIS_ DWORD dwMilliSeconds) PURE; - STDMETHOD(GetPrepareTime) (THIS_ DWORD* pdwMilliSeconds) PURE; - STDMETHOD(SetBumperLength) (THIS_ DWORD dwMilliSeconds) PURE; - STDMETHOD(GetBumperLength) (THIS_ DWORD* pdwMilliSeconds) PURE; - STDMETHOD(SendPMsg) (THIS_ DMUS_PMSG* pPMSG) PURE; - STDMETHOD(MusicToReferenceTime) (THIS_ MUSIC_TIME mtTime, - REFERENCE_TIME* prtTime) PURE; - STDMETHOD(ReferenceToMusicTime) (THIS_ REFERENCE_TIME rtTime, - MUSIC_TIME* pmtTime) PURE; - STDMETHOD(IsPlaying) (THIS_ IDirectMusicSegment* pSegment, - IDirectMusicSegmentState* pSegState) PURE; - STDMETHOD(GetTime) (THIS_ REFERENCE_TIME* prtNow, - MUSIC_TIME* pmtNow) PURE; - STDMETHOD(AllocPMsg) (THIS_ ULONG cb, - DMUS_PMSG** ppPMSG) PURE; - STDMETHOD(FreePMsg) (THIS_ DMUS_PMSG* pPMSG) PURE; - STDMETHOD(GetGraph) (THIS_ IDirectMusicGraph** ppGraph) PURE; - STDMETHOD(SetGraph) (THIS_ IDirectMusicGraph* pGraph) PURE; - STDMETHOD(SetNotificationHandle)(THIS_ HANDLE hNotification, - REFERENCE_TIME rtMinimum) PURE; - STDMETHOD(GetNotificationPMsg) (THIS_ DMUS_NOTIFICATION_PMSG** ppNotificationPMsg) PURE; - STDMETHOD(AddNotificationType) (THIS_ REFGUID rguidNotificationType) PURE; - STDMETHOD(RemoveNotificationType)(THIS_ REFGUID rguidNotificationType) PURE; - STDMETHOD(AddPort) (THIS_ IDirectMusicPort* pPort) PURE; - STDMETHOD(RemovePort) (THIS_ IDirectMusicPort* pPort ) PURE; - STDMETHOD(AssignPChannelBlock) (THIS_ DWORD dwBlockNum, - IDirectMusicPort* pPort, - DWORD dwGroup ) PURE; - STDMETHOD(AssignPChannel) (THIS_ DWORD dwPChannel, - IDirectMusicPort* pPort, - DWORD dwGroup, - DWORD dwMChannel ) PURE; - STDMETHOD(PChannelInfo) (THIS_ DWORD dwPChannel, - IDirectMusicPort** ppPort, - DWORD* pdwGroup, - DWORD* pdwMChannel ) PURE; - STDMETHOD(DownloadInstrument) (THIS_ IDirectMusicInstrument* pInst, - DWORD dwPChannel, - IDirectMusicDownloadedInstrument** ppDownInst, - DMUS_NOTERANGE* pNoteRanges, - DWORD dwNumNoteRanges, - IDirectMusicPort** ppPort, - DWORD* pdwGroup, - DWORD* pdwMChannel ) PURE; - STDMETHOD(Invalidate) (THIS_ MUSIC_TIME mtTime, - DWORD dwFlags) PURE; - STDMETHOD(GetParam) (THIS_ REFGUID rguidType, - DWORD dwGroupBits, - DWORD dwIndex, - MUSIC_TIME mtTime, - MUSIC_TIME* pmtNext, - void* pParam) PURE; - STDMETHOD(SetParam) (THIS_ REFGUID rguidType, - DWORD dwGroupBits, - DWORD dwIndex, - MUSIC_TIME mtTime, - void* pParam) PURE; - STDMETHOD(GetGlobalParam) (THIS_ REFGUID rguidType, - void* pParam, - DWORD dwSize) PURE; - STDMETHOD(SetGlobalParam) (THIS_ REFGUID rguidType, - void* pParam, - DWORD dwSize) PURE; - STDMETHOD(GetLatencyTime) (THIS_ REFERENCE_TIME* prtTime) PURE; - STDMETHOD(GetQueueTime) (THIS_ REFERENCE_TIME* prtTime) PURE; - STDMETHOD(AdjustTime) (THIS_ REFERENCE_TIME rtAmount) PURE; - STDMETHOD(CloseDown) (THIS) PURE; - STDMETHOD(GetResolvedTime) (THIS_ REFERENCE_TIME rtTime, - REFERENCE_TIME* prtResolved, - DWORD dwTimeResolveFlags) PURE; - STDMETHOD(MIDIToMusic) (THIS_ BYTE bMIDIValue, - DMUS_CHORD_KEY* pChord, - BYTE bPlayMode, - BYTE bChordLevel, - WORD *pwMusicValue) PURE; - STDMETHOD(MusicToMIDI) (THIS_ WORD wMusicValue, - DMUS_CHORD_KEY* pChord, - BYTE bPlayMode, - BYTE bChordLevel, - BYTE *pbMIDIValue) PURE; - STDMETHOD(TimeToRhythm) (THIS_ MUSIC_TIME mtTime, - DMUS_TIMESIGNATURE *pTimeSig, - WORD *pwMeasure, - BYTE *pbBeat, - BYTE *pbGrid, - short *pnOffset) PURE; - STDMETHOD(RhythmToTime) (THIS_ WORD wMeasure, - BYTE bBeat, - BYTE bGrid, - short nOffset, - DMUS_TIMESIGNATURE *pTimeSig, - MUSIC_TIME *pmtTime) PURE; -}; - -/*//////////////////////////////////////////////////////////////////// -// IDirectMusicPerformance8 */ -#undef INTERFACE -#define INTERFACE IDirectMusicPerformance8 -DECLARE_INTERFACE_(IDirectMusicPerformance8, IDirectMusicPerformance) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicPerformance */ - STDMETHOD(Init) (THIS_ IDirectMusic** ppDirectMusic, - LPDIRECTSOUND pDirectSound, - HWND hWnd) PURE; - STDMETHOD(PlaySegment) (THIS_ IDirectMusicSegment* pSegment, - DWORD dwFlags, - __int64 i64StartTime, - IDirectMusicSegmentState** ppSegmentState) PURE; - STDMETHOD(Stop) (THIS_ IDirectMusicSegment* pSegment, - IDirectMusicSegmentState* pSegmentState, - MUSIC_TIME mtTime, - DWORD dwFlags) PURE; - STDMETHOD(GetSegmentState) (THIS_ IDirectMusicSegmentState** ppSegmentState, - MUSIC_TIME mtTime) PURE; - STDMETHOD(SetPrepareTime) (THIS_ DWORD dwMilliSeconds) PURE; - STDMETHOD(GetPrepareTime) (THIS_ DWORD* pdwMilliSeconds) PURE; - STDMETHOD(SetBumperLength) (THIS_ DWORD dwMilliSeconds) PURE; - STDMETHOD(GetBumperLength) (THIS_ DWORD* pdwMilliSeconds) PURE; - STDMETHOD(SendPMsg) (THIS_ DMUS_PMSG* pPMSG) PURE; - STDMETHOD(MusicToReferenceTime) (THIS_ MUSIC_TIME mtTime, - REFERENCE_TIME* prtTime) PURE; - STDMETHOD(ReferenceToMusicTime) (THIS_ REFERENCE_TIME rtTime, - MUSIC_TIME* pmtTime) PURE; - STDMETHOD(IsPlaying) (THIS_ IDirectMusicSegment* pSegment, - IDirectMusicSegmentState* pSegState) PURE; - STDMETHOD(GetTime) (THIS_ REFERENCE_TIME* prtNow, - MUSIC_TIME* pmtNow) PURE; - STDMETHOD(AllocPMsg) (THIS_ ULONG cb, - DMUS_PMSG** ppPMSG) PURE; - STDMETHOD(FreePMsg) (THIS_ DMUS_PMSG* pPMSG) PURE; - STDMETHOD(GetGraph) (THIS_ IDirectMusicGraph** ppGraph) PURE; - STDMETHOD(SetGraph) (THIS_ IDirectMusicGraph* pGraph) PURE; - STDMETHOD(SetNotificationHandle)(THIS_ HANDLE hNotification, - REFERENCE_TIME rtMinimum) PURE; - STDMETHOD(GetNotificationPMsg) (THIS_ DMUS_NOTIFICATION_PMSG** ppNotificationPMsg) PURE; - STDMETHOD(AddNotificationType) (THIS_ REFGUID rguidNotificationType) PURE; - STDMETHOD(RemoveNotificationType)(THIS_ REFGUID rguidNotificationType) PURE; - STDMETHOD(AddPort) (THIS_ IDirectMusicPort* pPort) PURE; - STDMETHOD(RemovePort) (THIS_ IDirectMusicPort* pPort ) PURE; - STDMETHOD(AssignPChannelBlock) (THIS_ DWORD dwBlockNum, - IDirectMusicPort* pPort, - DWORD dwGroup ) PURE; - STDMETHOD(AssignPChannel) (THIS_ DWORD dwPChannel, - IDirectMusicPort* pPort, - DWORD dwGroup, - DWORD dwMChannel ) PURE; - STDMETHOD(PChannelInfo) (THIS_ DWORD dwPChannel, - IDirectMusicPort** ppPort, - DWORD* pdwGroup, - DWORD* pdwMChannel ) PURE; - STDMETHOD(DownloadInstrument) (THIS_ IDirectMusicInstrument* pInst, - DWORD dwPChannel, - IDirectMusicDownloadedInstrument** ppDownInst, - DMUS_NOTERANGE* pNoteRanges, - DWORD dwNumNoteRanges, - IDirectMusicPort** ppPort, - DWORD* pdwGroup, - DWORD* pdwMChannel ) PURE; - STDMETHOD(Invalidate) (THIS_ MUSIC_TIME mtTime, - DWORD dwFlags) PURE; - STDMETHOD(GetParam) (THIS_ REFGUID rguidType, - DWORD dwGroupBits, - DWORD dwIndex, - MUSIC_TIME mtTime, - MUSIC_TIME* pmtNext, - void* pParam) PURE; - STDMETHOD(SetParam) (THIS_ REFGUID rguidType, - DWORD dwGroupBits, - DWORD dwIndex, - MUSIC_TIME mtTime, - void* pParam) PURE; - STDMETHOD(GetGlobalParam) (THIS_ REFGUID rguidType, - void* pParam, - DWORD dwSize) PURE; - STDMETHOD(SetGlobalParam) (THIS_ REFGUID rguidType, - void* pParam, - DWORD dwSize) PURE; - STDMETHOD(GetLatencyTime) (THIS_ REFERENCE_TIME* prtTime) PURE; - STDMETHOD(GetQueueTime) (THIS_ REFERENCE_TIME* prtTime) PURE; - STDMETHOD(AdjustTime) (THIS_ REFERENCE_TIME rtAmount) PURE; - STDMETHOD(CloseDown) (THIS) PURE; - STDMETHOD(GetResolvedTime) (THIS_ REFERENCE_TIME rtTime, - REFERENCE_TIME* prtResolved, - DWORD dwTimeResolveFlags) PURE; - STDMETHOD(MIDIToMusic) (THIS_ BYTE bMIDIValue, - DMUS_CHORD_KEY* pChord, - BYTE bPlayMode, - BYTE bChordLevel, - WORD *pwMusicValue) PURE; - STDMETHOD(MusicToMIDI) (THIS_ WORD wMusicValue, - DMUS_CHORD_KEY* pChord, - BYTE bPlayMode, - BYTE bChordLevel, - BYTE *pbMIDIValue) PURE; - STDMETHOD(TimeToRhythm) (THIS_ MUSIC_TIME mtTime, - DMUS_TIMESIGNATURE *pTimeSig, - WORD *pwMeasure, - BYTE *pbBeat, - BYTE *pbGrid, - short *pnOffset) PURE; - STDMETHOD(RhythmToTime) (THIS_ WORD wMeasure, - BYTE bBeat, - BYTE bGrid, - short nOffset, - DMUS_TIMESIGNATURE *pTimeSig, - MUSIC_TIME *pmtTime) PURE; - /* IDirectMusicPerformance8 */ - STDMETHOD(InitAudio) (THIS_ IDirectMusic** ppDirectMusic, /* Optional DMusic pointer. */ - IDirectSound** ppDirectSound, /* Optional DSound pointer. */ - HWND hWnd, /* HWND for DSound. */ - DWORD dwDefaultPathType, /* Requested default audio path type, also optional. */ - DWORD dwPChannelCount, /* Number of PChannels, if default audio path to be created. */ - DWORD dwFlags, /* DMUS_AUDIOF flags, if no pParams structure. */ - DMUS_AUDIOPARAMS *pParams) PURE; /* Optional initialization structure, defining required voices, buffers, etc. */ - STDMETHOD(PlaySegmentEx) (THIS_ IUnknown* pSource, /* Segment to play. Alternately, could be an IDirectMusicSong (not supported in DX8.) */ - WCHAR *pwzSegmentName, /* If song, which segment in the song (not supported in DX8.) */ - IUnknown* pTransition, /* Optional template segment to compose transition with. */ - DWORD dwFlags, /* DMUS_SEGF_ flags. */ - __int64 i64StartTime, /* Time to start playback. */ - IDirectMusicSegmentState** ppSegmentState, /* Returned Segment State. */ - IUnknown *pFrom, /* Optional segmentstate or audiopath to replace. */ - IUnknown *pAudioPath) PURE; /* Optional audioPath to play on. */ - STDMETHOD(StopEx) (THIS_ IUnknown *pObjectToStop, /* Segstate, AudioPath, Segment, or Song. */ - __int64 i64StopTime, - DWORD dwFlags) PURE; - STDMETHOD(ClonePMsg) (THIS_ DMUS_PMSG* pSourcePMSG, - DMUS_PMSG** ppCopyPMSG) PURE; - STDMETHOD(CreateAudioPath) (THIS_ IUnknown *pSourceConfig, /* Source configuration, from AudioPathConfig file. */ - BOOL fActivate, /* TRUE to activate on creation. */ - IDirectMusicAudioPath **ppNewPath) PURE; /* Returns created audiopath. */ - STDMETHOD(CreateStandardAudioPath)(THIS_ DWORD dwType, /* Type of path to create. */ - DWORD dwPChannelCount, /* How many PChannels to allocate for it. */ - BOOL fActivate, /* TRUE to activate on creation. */ - IDirectMusicAudioPath **ppNewPath) PURE; /* Returns created audiopath. */ - STDMETHOD(SetDefaultAudioPath) (THIS_ IDirectMusicAudioPath *pAudioPath) PURE; - STDMETHOD(GetDefaultAudioPath) (THIS_ IDirectMusicAudioPath **ppAudioPath) PURE; - STDMETHOD(GetParamEx) (THIS_ REFGUID rguidType, /* GetParam command ID. */ - DWORD dwTrackID, /* Virtual track ID of caller. */ - DWORD dwGroupBits, /* Group bits of caller. */ - DWORD dwIndex, /* Index to Nth parameter. */ - MUSIC_TIME mtTime, /* Time of requested parameter. */ - MUSIC_TIME* pmtNext, /* Returned delta to next parameter. */ - void* pParam) PURE; /* Data structure to fill with parameter. */ -}; - - - -/*//////////////////////////////////////////////////////////////////// -// IDirectMusicGraph */ -#undef INTERFACE -#define INTERFACE IDirectMusicGraph -DECLARE_INTERFACE_(IDirectMusicGraph, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicGraph */ - STDMETHOD(StampPMsg) (THIS_ DMUS_PMSG* pPMSG) PURE; - STDMETHOD(InsertTool) (THIS_ IDirectMusicTool* pTool, - DWORD* pdwPChannels, - DWORD cPChannels, - LONG lIndex) PURE; - STDMETHOD(GetTool) (THIS_ DWORD dwIndex, - IDirectMusicTool** ppTool) PURE; - STDMETHOD(RemoveTool) (THIS_ IDirectMusicTool* pTool) PURE; -}; - -typedef IDirectMusicGraph IDirectMusicGraph8; - - -/*///////////////////////////////////////////////////////////////////// -// IDirectMusicStyle */ -#undef INTERFACE -#define INTERFACE IDirectMusicStyle -DECLARE_INTERFACE_(IDirectMusicStyle, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicStyle */ - STDMETHOD(GetBand) (THIS_ WCHAR* pwszName, - IDirectMusicBand** ppBand) PURE; - STDMETHOD(EnumBand) (THIS_ DWORD dwIndex, - WCHAR *pwszName) PURE; - STDMETHOD(GetDefaultBand) (THIS_ IDirectMusicBand** ppBand) PURE; - STDMETHOD(EnumMotif) (THIS_ DWORD dwIndex, - WCHAR* pwszName) PURE; - STDMETHOD(GetMotif) (THIS_ WCHAR* pwszName, - IDirectMusicSegment** ppSegment) PURE; - STDMETHOD(GetDefaultChordMap) (THIS_ IDirectMusicChordMap** ppChordMap) PURE; - STDMETHOD(EnumChordMap) (THIS_ DWORD dwIndex, - WCHAR *pwszName) PURE; - STDMETHOD(GetChordMap) (THIS_ WCHAR* pwszName, - IDirectMusicChordMap** ppChordMap) PURE; - STDMETHOD(GetTimeSignature) (THIS_ DMUS_TIMESIGNATURE* pTimeSig) PURE; - STDMETHOD(GetEmbellishmentLength) (THIS_ DWORD dwType, - DWORD dwLevel, - DWORD* pdwMin, - DWORD* pdwMax) PURE; - STDMETHOD(GetTempo) (THIS_ double* pTempo) PURE; -}; - -/*///////////////////////////////////////////////////////////////////// -// IDirectMusicStyle8 */ -#undef INTERFACE -#define INTERFACE IDirectMusicStyle8 -DECLARE_INTERFACE_(IDirectMusicStyle8, IDirectMusicStyle) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicStyle */ - STDMETHOD(GetBand) (THIS_ WCHAR* pwszName, - IDirectMusicBand** ppBand) PURE; - STDMETHOD(EnumBand) (THIS_ DWORD dwIndex, - WCHAR *pwszName) PURE; - STDMETHOD(GetDefaultBand) (THIS_ IDirectMusicBand** ppBand) PURE; - STDMETHOD(EnumMotif) (THIS_ DWORD dwIndex, - WCHAR* pwszName) PURE; - STDMETHOD(GetMotif) (THIS_ WCHAR* pwszName, - IDirectMusicSegment** ppSegment) PURE; - STDMETHOD(GetDefaultChordMap) (THIS_ IDirectMusicChordMap** ppChordMap) PURE; - STDMETHOD(EnumChordMap) (THIS_ DWORD dwIndex, - WCHAR *pwszName) PURE; - STDMETHOD(GetChordMap) (THIS_ WCHAR* pwszName, - IDirectMusicChordMap** ppChordMap) PURE; - STDMETHOD(GetTimeSignature) (THIS_ DMUS_TIMESIGNATURE* pTimeSig) PURE; - STDMETHOD(GetEmbellishmentLength) (THIS_ DWORD dwType, - DWORD dwLevel, - DWORD* pdwMin, - DWORD* pdwMax) PURE; - STDMETHOD(GetTempo) (THIS_ double* pTempo) PURE; - - /* IDirectMusicStyle8 */ - STDMETHOD(EnumPattern) (THIS_ DWORD dwIndex, - DWORD dwPatternType, - WCHAR* pwszName) PURE; -}; - -/*///////////////////////////////////////////////////////////////////// -// IDirectMusicChordMap */ -#undef INTERFACE -#define INTERFACE IDirectMusicChordMap -DECLARE_INTERFACE_(IDirectMusicChordMap, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicChordMap */ - STDMETHOD(GetScale) (THIS_ DWORD* pdwScale) PURE; -}; - -typedef IDirectMusicChordMap IDirectMusicChordMap8; - -/*///////////////////////////////////////////////////////////////////// -// IDirectMusicComposer */ -#undef INTERFACE -#define INTERFACE IDirectMusicComposer -DECLARE_INTERFACE_(IDirectMusicComposer, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicComposer */ - STDMETHOD(ComposeSegmentFromTemplate) (THIS_ IDirectMusicStyle* pStyle, - IDirectMusicSegment* pTemplate, - WORD wActivity, - IDirectMusicChordMap* pChordMap, - IDirectMusicSegment** ppSegment) PURE; - STDMETHOD(ComposeSegmentFromShape) (THIS_ IDirectMusicStyle* pStyle, - WORD wNumMeasures, - WORD wShape, - WORD wActivity, - BOOL fIntro, - BOOL fEnd, - IDirectMusicChordMap* pChordMap, - IDirectMusicSegment** ppSegment ) PURE; - STDMETHOD(ComposeTransition) (THIS_ IDirectMusicSegment* pFromSeg, - IDirectMusicSegment* pToSeg, - MUSIC_TIME mtTime, - WORD wCommand, - DWORD dwFlags, - IDirectMusicChordMap* pChordMap, - IDirectMusicSegment** ppTransSeg) PURE; - STDMETHOD(AutoTransition) (THIS_ IDirectMusicPerformance* pPerformance, - IDirectMusicSegment* pToSeg, - WORD wCommand, - DWORD dwFlags, - IDirectMusicChordMap* pChordMap, - IDirectMusicSegment** ppTransSeg, - IDirectMusicSegmentState** ppToSegState, - IDirectMusicSegmentState** ppTransSegState) PURE; - STDMETHOD(ComposeTemplateFromShape) (THIS_ WORD wNumMeasures, - WORD wShape, - BOOL fIntro, - BOOL fEnd, - WORD wEndLength, - IDirectMusicSegment** ppTemplate) PURE; - STDMETHOD(ChangeChordMap) (THIS_ IDirectMusicSegment* pSegment, - BOOL fTrackScale, - IDirectMusicChordMap* pChordMap) PURE; -}; - -typedef IDirectMusicComposer IDirectMusicComposer8; - -/*///////////////////////////////////////////////////////////////////// -// IDirectMusicPatternTrack */ - -#undef INTERFACE -#define INTERFACE IDirectMusicPatternTrack -DECLARE_INTERFACE_(IDirectMusicPatternTrack, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicPatternTrack */ - STDMETHOD(CreateSegment) (THIS_ IDirectMusicStyle* pStyle, - IDirectMusicSegment** ppSegment) PURE; - STDMETHOD(SetVariation) (THIS_ IDirectMusicSegmentState* pSegState, - DWORD dwVariationFlags, - DWORD dwPart) PURE; - STDMETHOD(SetPatternByName) (THIS_ IDirectMusicSegmentState* pSegState, - WCHAR* wszName, - IDirectMusicStyle* pStyle, - DWORD dwPatternType, - DWORD* pdwLength) PURE; -}; - -typedef IDirectMusicPatternTrack IDirectMusicPatternTrack8; - -/*///////////////////////////////////////////////////////////////////// -// IDirectMusicScript */ - -#undef INTERFACE -#define INTERFACE IDirectMusicScript -DECLARE_INTERFACE_(IDirectMusicScript, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicScript */ - STDMETHOD(Init) (THIS_ IDirectMusicPerformance *pPerformance, - DMUS_SCRIPT_ERRORINFO *pErrorInfo) PURE; - STDMETHOD(CallRoutine) (THIS_ WCHAR *pwszRoutineName, - DMUS_SCRIPT_ERRORINFO *pErrorInfo) PURE; - STDMETHOD(SetVariableVariant) (THIS_ WCHAR *pwszVariableName, - VARIANT varValue, - BOOL fSetRef, - DMUS_SCRIPT_ERRORINFO *pErrorInfo) PURE; - STDMETHOD(GetVariableVariant) (THIS_ WCHAR *pwszVariableName, - VARIANT *pvarValue, - DMUS_SCRIPT_ERRORINFO *pErrorInfo) PURE; - STDMETHOD(SetVariableNumber) (THIS_ WCHAR *pwszVariableName, - LONG lValue, - DMUS_SCRIPT_ERRORINFO *pErrorInfo) PURE; - STDMETHOD(GetVariableNumber) (THIS_ WCHAR *pwszVariableName, - LONG *plValue, - DMUS_SCRIPT_ERRORINFO *pErrorInfo) PURE; - STDMETHOD(SetVariableObject) (THIS_ WCHAR *pwszVariableName, - IUnknown *punkValue, - DMUS_SCRIPT_ERRORINFO *pErrorInfo) PURE; - STDMETHOD(GetVariableObject) (THIS_ WCHAR *pwszVariableName, - REFIID riid, - LPVOID FAR *ppv, - DMUS_SCRIPT_ERRORINFO *pErrorInfo) PURE; - STDMETHOD(EnumRoutine) (THIS_ DWORD dwIndex, - WCHAR *pwszName) PURE; - STDMETHOD(EnumVariable) (THIS_ DWORD dwIndex, - WCHAR *pwszName) PURE; -}; - -typedef IDirectMusicScript IDirectMusicScript8; - -/*///////////////////////////////////////////////////////////////////// -// IDirectMusicContainer */ - -#undef INTERFACE -#define INTERFACE IDirectMusicContainer -DECLARE_INTERFACE_(IDirectMusicContainer, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicContainer */ - STDMETHOD(EnumObject) (THIS_ REFGUID rguidClass, - DWORD dwIndex, - LPDMUS_OBJECTDESC pDesc, - WCHAR *pwszAlias) PURE; -}; - -typedef IDirectMusicContainer IDirectMusicContainer8; - -/*///////////////////////////////////////////////////////////////////// -// IDirectMusicSong */ -/* Note: Songs are not supported in DX8. */ - -#undef INTERFACE -#define INTERFACE IDirectMusicSong -DECLARE_INTERFACE_(IDirectMusicSong, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicSong */ - STDMETHOD(Compose) (THIS) PURE; - STDMETHOD(GetParam) (THIS_ REFGUID rguidType, - DWORD dwGroupBits, - DWORD dwIndex, - MUSIC_TIME mtTime, - MUSIC_TIME* pmtNext, - void* pParam) PURE; - STDMETHOD(GetSegment) (THIS_ WCHAR *pwzName, /* Retrieve a specific segment by name. */ - IDirectMusicSegment **ppSegment) PURE; /* Returned segment. */ - STDMETHOD(GetAudioPathConfig) (THIS_ IUnknown ** ppAudioPathConfig) PURE; /* Retrieve embedded audiopath configuration. */ - STDMETHOD(Download) (THIS_ IUnknown *pAudioPath) PURE; /* Download entire song to ports on performance or audiopath. */ - STDMETHOD(Unload) (THIS_ IUnknown *pAudioPath) PURE; /* Unload entire song from port on performance or audiopath. */ - STDMETHOD(EnumSegment) (THIS_ DWORD dwIndex, /* Nth segment to retrieve. */ - IDirectMusicSegment **ppSegment) PURE; /* Pointer to segment. */ -}; - -typedef IDirectMusicSong IDirectMusicSong8; - -/* CLSID's */ -DEFINE_GUID(CLSID_DirectMusicPerformance,0xd2ac2881, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicSegment,0xd2ac2882, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicSegmentState,0xd2ac2883, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicGraph,0xd2ac2884, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicStyle,0xd2ac288a, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicChordMap,0xd2ac288f, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicComposer,0xd2ac2890, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicLoader,0xd2ac2892, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicBand,0x79ba9e00, 0xb6ee, 0x11d1, 0x86, 0xbe, 0x0, 0xc0, 0x4f, 0xbf, 0x8f, 0xef); - -/* New CLSID's for DX8 */ -DEFINE_GUID(CLSID_DirectMusicPatternTrack,0xd2ac2897, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(CLSID_DirectMusicScript,0x810b5013, 0xe88d, 0x11d2, 0x8b, 0xc1, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xb6); /* {810B5013-E88D-11d2-8BC1-00600893B1B6} */ -DEFINE_GUID(CLSID_DirectMusicContainer,0x9301e380, 0x1f22, 0x11d3, 0x82, 0x26, 0xd2, 0xfa, 0x76, 0x25, 0x5d, 0x47); -DEFINE_GUID(CLSID_DirectSoundWave,0x8a667154, 0xf9cb, 0x11d2, 0xad, 0x8a, 0x0, 0x60, 0xb0, 0x57, 0x5a, 0xbc); -/* Note: Songs are not supported in DX8. */ -DEFINE_GUID(CLSID_DirectMusicSong, 0xaed5f0a5, 0xd972, 0x483d, 0xa3, 0x84, 0x64, 0x9d, 0xfe, 0xb9, 0xc1, 0x81); -DEFINE_GUID(CLSID_DirectMusicAudioPathConfig,0xee0b9ca0, 0xa81e, 0x11d3, 0x9b, 0xd1, 0x0, 0x80, 0xc7, 0x15, 0xa, 0x74); - -/* Special GUID for all object types. This is used by the loader. */ -DEFINE_GUID(GUID_DirectMusicAllTypes,0xd2ac2893, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Notification guids */ -DEFINE_GUID(GUID_NOTIFICATION_SEGMENT,0xd2ac2899, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(GUID_NOTIFICATION_PERFORMANCE,0x81f75bc5, 0x4e5d, 0x11d2, 0xbc, 0xc7, 0x0, 0xa0, 0xc9, 0x22, 0xe6, 0xeb); -DEFINE_GUID(GUID_NOTIFICATION_MEASUREANDBEAT,0xd2ac289a, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(GUID_NOTIFICATION_CHORD,0xd2ac289b, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(GUID_NOTIFICATION_COMMAND,0xd2ac289c, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(GUID_NOTIFICATION_RECOMPOSE, 0xd348372b, 0x945b, 0x45ae, 0xa5, 0x22, 0x45, 0xf, 0x12, 0x5b, 0x84, 0xa5); - -/* Track param type guids */ -/* Use to get/set a DMUS_COMMAND_PARAM param in the Command track */ -DEFINE_GUID(GUID_CommandParam,0xd2ac289d, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Use to get a DMUS_COMMAND_PARAM_2 param in the Command track */ -DEFINE_GUID(GUID_CommandParam2, 0x28f97ef7, 0x9538, 0x11d2, 0x97, 0xa9, 0x0, 0xc0, 0x4f, 0xa3, 0x6e, 0x58); - -/* Use to get/set a DMUS_COMMAND_PARAM_2 param to be used as the command following all commands in -the Command track (this information can't be saved) */ -DEFINE_GUID(GUID_CommandParamNext, 0x472afe7a, 0x281b, 0x11d3, 0x81, 0x7d, 0x0, 0xc0, 0x4f, 0xa3, 0x6e, 0x58); - -/* Use to get/set a DMUS_CHORD_PARAM param in the Chord track */ -DEFINE_GUID(GUID_ChordParam,0xd2ac289e, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Use to get a DMUS_RHYTHM_PARAM param in the Chord track */ -DEFINE_GUID(GUID_RhythmParam,0xd2ac289f, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Use to get/set an IDirectMusicStyle param in the Style track */ -DEFINE_GUID(GUID_IDirectMusicStyle,0xd2ac28a1, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Use to get a DMUS_TIMESIGNATURE param in the Style and TimeSig tracks */ -DEFINE_GUID(GUID_TimeSignature,0xd2ac28a4, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Use to get/set a DMUS_TEMPO_PARAM param in the Tempo track */ -DEFINE_GUID(GUID_TempoParam,0xd2ac28a5, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Use to get the next valid point in a segment at which it may start */ -DEFINE_GUID(GUID_Valid_Start_Time,0x7f6b1760, 0x1fdb, 0x11d3, 0x82, 0x26, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0); - -/* Use to get the next point in the currently playing primary segment at which a new segment may start */ -DEFINE_GUID(GUID_Play_Marker,0xd8761a41, 0x801a, 0x11d3, 0x9b, 0xd1, 0xda, 0xf7, 0xe1, 0xc3, 0xd8, 0x34); - -/* Use to get (GetParam) or add (SetParam) bands in the Band track */ -DEFINE_GUID(GUID_BandParam,0x2bb1938, 0xcb8b, 0x11d2, 0x8b, 0xb9, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xb6); -typedef struct _DMUS_BAND_PARAM -{ - MUSIC_TIME mtTimePhysical; /* Note: If this is a clock-time track, then this field is interpreted in the track's internal time format, which is the number of milliseconds after the beginning of playback. */ - IDirectMusicBand *pBand; -} DMUS_BAND_PARAM; - -/* Obsolete -- doesn't distinguish physical and logical time. Use GUID_BandParam instead. */ -DEFINE_GUID(GUID_IDirectMusicBand,0xd2ac28ac, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Use to get/set an IDirectMusicChordMap param in the ChordMap track */ -DEFINE_GUID(GUID_IDirectMusicChordMap,0xd2ac28ad, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Use to get/set a DMUS_MUTE_PARAM param in the Mute track */ -DEFINE_GUID(GUID_MuteParam,0xd2ac28af, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* These guids are used in IDirectMusicSegment::SetParam to tell the band track to perform various actions. - Some of these guids (where noted) also apply to wave tracks. - */ -/* Download bands/waves for the IDirectMusicSegment */ -DEFINE_GUID(GUID_Download,0xd2ac28a7, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Unload bands/waves for the IDirectMusicSegment */ -DEFINE_GUID(GUID_Unload,0xd2ac28a8, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Connect segment's bands to an IDirectMusicCollection */ -DEFINE_GUID(GUID_ConnectToDLSCollection, 0x1db1ae6b, 0xe92e, 0x11d1, 0xa8, 0xc5, 0x0, 0xc0, 0x4f, 0xa3, 0x72, 0x6e); - -/* Enable/disable autodownloading of bands/waves */ -DEFINE_GUID(GUID_Enable_Auto_Download,0xd2ac28a9, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(GUID_Disable_Auto_Download,0xd2ac28aa, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Clear all bands */ -DEFINE_GUID(GUID_Clear_All_Bands,0xd2ac28ab, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Set segment to manage all program changes, bank selects, etc. for simple playback of a standard MIDI file */ -DEFINE_GUID(GUID_StandardMIDIFile, 0x6621075, 0xe92e, 0x11d1, 0xa8, 0xc5, 0x0, 0xc0, 0x4f, 0xa3, 0x72, 0x6e); -/* For compatibility with beta releases... */ -#define GUID_IgnoreBankSelectForGM GUID_StandardMIDIFile - -/* Disable/enable param guids. Use these in SetParam calls to disable or enable sending - * specific PMsg types. - */ -DEFINE_GUID(GUID_DisableTimeSig, 0x45fc707b, 0x1db4, 0x11d2, 0xbc, 0xac, 0x0, 0xa0, 0xc9, 0x22, 0xe6, 0xeb); -DEFINE_GUID(GUID_EnableTimeSig, 0x45fc707c, 0x1db4, 0x11d2, 0xbc, 0xac, 0x0, 0xa0, 0xc9, 0x22, 0xe6, 0xeb); -DEFINE_GUID(GUID_DisableTempo, 0x45fc707d, 0x1db4, 0x11d2, 0xbc, 0xac, 0x0, 0xa0, 0xc9, 0x22, 0xe6, 0xeb); -DEFINE_GUID(GUID_EnableTempo, 0x45fc707e, 0x1db4, 0x11d2, 0xbc, 0xac, 0x0, 0xa0, 0xc9, 0x22, 0xe6, 0xeb); - -/* Used in SetParam calls for pattern-based tracks. A nonzero value seeds the random number -generator for variation selection; a value of zero reverts to the default behavior of -getting the seed from the system clock. -*/ -DEFINE_GUID(GUID_SeedVariations, 0x65b76fa5, 0xff37, 0x11d2, 0x81, 0x4e, 0x0, 0xc0, 0x4f, 0xa3, 0x6e, 0x58); - -/* Used to get/set melody fragments (pParam points to a DMUS_MELODY_FRAGMENT) */ -/* Note: Melody formulation is not supported in DX8. */ -DEFINE_GUID(GUID_MelodyFragment, 0xb291c7f2, 0xb616, 0x11d2, 0x97, 0xfa, 0x0, 0xc0, 0x4f, 0xa3, 0x6e, 0x58); - -/* Used to clear all melody fragments */ -/* Note: Melody formulation is not supported in DX8. */ -DEFINE_GUID(GUID_Clear_All_MelodyFragments, 0x8509fee6, 0xb617, 0x11d2, 0x97, 0xfa, 0x0, 0xc0, 0x4f, 0xa3, 0x6e, 0x58); - -/* Used to get the variations currently in effect across PChannels */ -DEFINE_GUID(GUID_Variations, 0x11f72cce, 0x26e6, 0x4ecd, 0xaf, 0x2e, 0xd6, 0x68, 0xe6, 0x67, 0x7, 0xd8); -typedef struct _DMUS_VARIATIONS_PARAM -{ - DWORD dwPChannelsUsed; /* number of PChannels in use */ - DWORD* padwPChannels; /* array of PChannels in use */ - DWORD* padwVariations; /* array of variations in effect for each PChannel */ -} DMUS_VARIATIONS_PARAM; - -/* Download bands/waves for the IDirectMusicSegment, passed an IDirectMusicAudioPath instead of an IDirectMusicPerformance */ -DEFINE_GUID(GUID_DownloadToAudioPath,0x9f2c0341, 0xc5c4, 0x11d3, 0x9b, 0xd1, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0); - -/* Unload bands/waves for the IDirectMusicSegment, passed an IDirectMusicAudioPath instead of an IDirectMusicPerformance */ -DEFINE_GUID(GUID_UnloadFromAudioPath,0x9f2c0342, 0xc5c4, 0x11d3, 0x9b, 0xd1, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0); - - -/* Global data guids */ -DEFINE_GUID(GUID_PerfMasterTempo,0xd2ac28b0, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(GUID_PerfMasterVolume,0xd2ac28b1, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(GUID_PerfMasterGrooveLevel,0xd2ac28b2, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(GUID_PerfAutoDownload, 0xfb09565b, 0x3631, 0x11d2, 0xbc, 0xb8, 0x0, 0xa0, 0xc9, 0x22, 0xe6, 0xeb); - -/* GUID for default GM/GS dls collection. */ -DEFINE_GUID(GUID_DefaultGMCollection, 0xf17e8673, 0xc3b4, 0x11d1, 0x87, 0xb, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* GUID to define default synth, placed in AudioPath configuration file. */ -DEFINE_GUID(GUID_Synth_Default,0x26bb9432, 0x45fe, 0x48d3, 0xa3, 0x75, 0x24, 0x72, 0xc5, 0xe3, 0xe7, 0x86); - -/* GUIDs to define default buffer configurations to place in AudioPath configuration file. */ -DEFINE_GUID(GUID_Buffer_Reverb,0x186cc541, 0xdb29, 0x11d3, 0x9b, 0xd1, 0x0, 0x80, 0xc7, 0x15, 0xa, 0x74); -DEFINE_GUID(GUID_Buffer_EnvReverb,0x186cc542, 0xdb29, 0x11d3, 0x9b, 0xd1, 0x0, 0x80, 0xc7, 0x15, 0xa, 0x74); -DEFINE_GUID(GUID_Buffer_Stereo,0x186cc545, 0xdb29, 0x11d3, 0x9b, 0xd1, 0x0, 0x80, 0xc7, 0x15, 0xa, 0x74); -DEFINE_GUID(GUID_Buffer_3D_Dry,0x186cc546, 0xdb29, 0x11d3, 0x9b, 0xd1, 0x0, 0x80, 0xc7, 0x15, 0xa, 0x74); -DEFINE_GUID(GUID_Buffer_Mono,0x186cc547, 0xdb29, 0x11d3, 0x9b, 0xd1, 0x0, 0x80, 0xc7, 0x15, 0xa, 0x74); - -/* IID's */ -DEFINE_GUID(IID_IDirectMusicLoader, 0x2ffaaca2, 0x5dca, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6); -DEFINE_GUID(IID_IDirectMusicGetLoader,0x68a04844, 0xd13d, 0x11d1, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6); -DEFINE_GUID(IID_IDirectMusicObject,0xd2ac28b5, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(IID_IDirectMusicSegment, 0xf96029a2, 0x4282, 0x11d2, 0x87, 0x17, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(IID_IDirectMusicSegmentState, 0xa3afdcc7, 0xd3ee, 0x11d1, 0xbc, 0x8d, 0x0, 0xa0, 0xc9, 0x22, 0xe6, 0xeb); -DEFINE_GUID(IID_IDirectMusicPerformance,0x7d43d03, 0x6523, 0x11d2, 0x87, 0x1d, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(IID_IDirectMusicGraph,0x2befc277, 0x5497, 0x11d2, 0xbc, 0xcb, 0x0, 0xa0, 0xc9, 0x22, 0xe6, 0xeb); -DEFINE_GUID(IID_IDirectMusicStyle,0xd2ac28bd, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(IID_IDirectMusicChordMap,0xd2ac28be, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(IID_IDirectMusicComposer,0xd2ac28bf, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); -DEFINE_GUID(IID_IDirectMusicBand,0xd2ac28c0, 0xb39b, 0x11d1, 0x87, 0x4, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Alternate interface IDs, available in DX7 release and after. */ -DEFINE_GUID(IID_IDirectMusicPerformance2,0x6fc2cae0, 0xbc78, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6); -DEFINE_GUID(IID_IDirectMusicSegment2, 0xd38894d1, 0xc052, 0x11d2, 0x87, 0x2f, 0x0, 0x60, 0x8, 0x93, 0xb1, 0xbd); - -/* Interface IDs for DX8 */ -/* changed interfaces (GUID only) */ -DEFINE_GUID(IID_IDirectMusicLoader8, 0x19e7c08c, 0xa44, 0x4e6a, 0xa1, 0x16, 0x59, 0x5a, 0x7c, 0xd5, 0xde, 0x8c); -DEFINE_GUID(IID_IDirectMusicPerformance8, 0x679c4137, 0xc62e, 0x4147, 0xb2, 0xb4, 0x9d, 0x56, 0x9a, 0xcb, 0x25, 0x4c); -DEFINE_GUID(IID_IDirectMusicSegment8,0xc6784488, 0x41a3, 0x418f, 0xaa, 0x15, 0xb3, 0x50, 0x93, 0xba, 0x42, 0xd4); -DEFINE_GUID(IID_IDirectMusicSegmentState8, 0xa50e4730, 0xae4, 0x48a7, 0x98, 0x39, 0xbc, 0x4, 0xbf, 0xe0, 0x77, 0x72); -DEFINE_GUID(IID_IDirectMusicStyle8, 0xfd24ad8a, 0xa260, 0x453d, 0xbf, 0x50, 0x6f, 0x93, 0x84, 0xf7, 0x9, 0x85); -/* new interfaces (GUID + alias) */ -DEFINE_GUID(IID_IDirectMusicPatternTrack, 0x51c22e10, 0xb49f, 0x46fc, 0xbe, 0xc2, 0xe6, 0x28, 0x8f, 0xb9, 0xed, 0xe6); -#define IID_IDirectMusicPatternTrack8 IID_IDirectMusicPatternTrack -DEFINE_GUID(IID_IDirectMusicScript, 0x2252373a, 0x5814, 0x489b, 0x82, 0x9, 0x31, 0xfe, 0xde, 0xba, 0xf1, 0x37); /* {2252373A-5814-489b-8209-31FEDEBAF137} */ -#define IID_IDirectMusicScript8 IID_IDirectMusicScript -DEFINE_GUID(IID_IDirectMusicContainer, 0x9301e386, 0x1f22, 0x11d3, 0x82, 0x26, 0xd2, 0xfa, 0x76, 0x25, 0x5d, 0x47); -#define IID_IDirectMusicContainer8 IID_IDirectMusicContainer -/* Note: Songs are not supported in DX8. */ -DEFINE_GUID(IID_IDirectMusicSong, 0xa862b2ec, 0x3676, 0x4982, 0x85, 0xa, 0x78, 0x42, 0x77, 0x5e, 0x1d, 0x86); -#define IID_IDirectMusicSong8 IID_IDirectMusicSong -DEFINE_GUID(IID_IDirectMusicAudioPath,0xc87631f5, 0x23be, 0x4986, 0x88, 0x36, 0x5, 0x83, 0x2f, 0xcc, 0x48, 0xf9); -#define IID_IDirectMusicAudioPath8 IID_IDirectMusicAudioPath -/* unchanged interfaces (alias only) */ -#define IID_IDirectMusicGetLoader8 IID_IDirectMusicGetLoader -#define IID_IDirectMusicChordMap8 IID_IDirectMusicChordMap -#define IID_IDirectMusicGraph8 IID_IDirectMusicGraph -#define IID_IDirectMusicBand8 IID_IDirectMusicBand -#define IID_IDirectMusicObject8 IID_IDirectMusicObject -#define IID_IDirectMusicComposer8 IID_IDirectMusicComposer - - -#ifdef __cplusplus -}; /* extern "C" */ -#endif - -#include - -#endif /* #ifndef _DMUSICI_ */ diff --git a/import/DirectX8/include/dmusics.h b/import/DirectX8/include/dmusics.h deleted file mode 100644 index cda65d284..000000000 --- a/import/DirectX8/include/dmusics.h +++ /dev/null @@ -1,193 +0,0 @@ -/************************************************************************ -* * -* dmusics.h -- Definitions for created a DirectMusic software synth * -* * -* Copyright (c) 1998-1999 Microsoft Corporation -* * -************************************************************************/ - -#ifndef _DMUSICS_ -#define _DMUSICS_ - -#include "dmusicc.h" - -/* Software synths are enumerated from under this registry key. - */ -#define REGSTR_PATH_SOFTWARESYNTHS "Software\\Microsoft\\DirectMusic\\SoftwareSynths" - -interface IDirectMusicSynth; -interface IDirectMusicSynthSink; - -#ifndef __cplusplus -typedef interface IDirectMusicSynth IDirectMusicSynth; -typedef interface IDirectMusicSynthSink IDirectMusicSynthSink; -#endif - -#ifndef _DMUS_VOICE_STATE_DEFINED -#define _DMUS_VOICE_STATE_DEFINED - -typedef struct _DMUS_VOICE_STATE -{ - BOOL bExists; - SAMPLE_POSITION spPosition; -} DMUS_VOICE_STATE; - -#endif /* _DMUS_VOICE_STATE_DEFINED */ - -/* IDirectMusicSynth::Refresh - * - * This is the last buffer of the stream. It may be a partial block. - */ -#define REFRESH_F_LASTBUFFER 0x00000001 - -#undef INTERFACE -#define INTERFACE IDirectMusicSynth -DECLARE_INTERFACE_(IDirectMusicSynth, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicSynth */ - STDMETHOD(Open) (THIS_ LPDMUS_PORTPARAMS pPortParams) PURE; - STDMETHOD(Close) (THIS) PURE; - STDMETHOD(SetNumChannelGroups) (THIS_ DWORD dwGroups) PURE; - STDMETHOD(Download) (THIS_ LPHANDLE phDownload, - LPVOID pvData, - LPBOOL pbFree ) PURE; - STDMETHOD(Unload) (THIS_ HANDLE hDownload, - HRESULT ( CALLBACK *lpFreeHandle)(HANDLE,HANDLE), - HANDLE hUserData ) PURE; - STDMETHOD(PlayBuffer) (THIS_ REFERENCE_TIME rt, - LPBYTE pbBuffer, - DWORD cbBuffer) PURE; - STDMETHOD(GetRunningStats) (THIS_ LPDMUS_SYNTHSTATS pStats) PURE; - STDMETHOD(GetPortCaps) (THIS_ LPDMUS_PORTCAPS pCaps) PURE; - STDMETHOD(SetMasterClock) (THIS_ IReferenceClock *pClock) PURE; - STDMETHOD(GetLatencyClock) (THIS_ IReferenceClock **ppClock) PURE; - STDMETHOD(Activate) (THIS_ BOOL fEnable) PURE; - STDMETHOD(SetSynthSink) (THIS_ IDirectMusicSynthSink *pSynthSink) PURE; - STDMETHOD(Render) (THIS_ short *pBuffer, - DWORD dwLength, - LONGLONG llPosition) PURE; - STDMETHOD(SetChannelPriority) (THIS_ DWORD dwChannelGroup, - DWORD dwChannel, - DWORD dwPriority) PURE; - STDMETHOD(GetChannelPriority) (THIS_ DWORD dwChannelGroup, - DWORD dwChannel, - LPDWORD pdwPriority) PURE; - STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pWaveFormatEx, - LPDWORD pdwWaveFormatExSize) PURE; - STDMETHOD(GetAppend) (THIS_ DWORD* pdwAppend) PURE; -}; - -#undef INTERFACE - -#define INTERFACE IDirectMusicSynth8 -DECLARE_INTERFACE_(IDirectMusicSynth8, IDirectMusicSynth) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicSynth */ - STDMETHOD(Open) (THIS_ LPDMUS_PORTPARAMS pPortParams) PURE; - STDMETHOD(Close) (THIS) PURE; - STDMETHOD(SetNumChannelGroups) (THIS_ DWORD dwGroups) PURE; - STDMETHOD(Download) (THIS_ LPHANDLE phDownload, - LPVOID pvData, - LPBOOL pbFree ) PURE; - STDMETHOD(Unload) (THIS_ HANDLE hDownload, - HRESULT ( CALLBACK *lpFreeHandle)(HANDLE,HANDLE), - HANDLE hUserData ) PURE; - STDMETHOD(PlayBuffer) (THIS_ REFERENCE_TIME rt, - LPBYTE pbBuffer, - DWORD cbBuffer) PURE; - STDMETHOD(GetRunningStats) (THIS_ LPDMUS_SYNTHSTATS pStats) PURE; - STDMETHOD(GetPortCaps) (THIS_ LPDMUS_PORTCAPS pCaps) PURE; - STDMETHOD(SetMasterClock) (THIS_ IReferenceClock *pClock) PURE; - STDMETHOD(GetLatencyClock) (THIS_ IReferenceClock **ppClock) PURE; - STDMETHOD(Activate) (THIS_ BOOL fEnable) PURE; - STDMETHOD(SetSynthSink) (THIS_ IDirectMusicSynthSink *pSynthSink) PURE; - STDMETHOD(Render) (THIS_ short *pBuffer, - DWORD dwLength, - LONGLONG llPosition) PURE; - STDMETHOD(SetChannelPriority) (THIS_ DWORD dwChannelGroup, - DWORD dwChannel, - DWORD dwPriority) PURE; - STDMETHOD(GetChannelPriority) (THIS_ DWORD dwChannelGroup, - DWORD dwChannel, - LPDWORD pdwPriority) PURE; - STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pWaveFormatEx, - LPDWORD pdwWaveFormatExSize) PURE; - STDMETHOD(GetAppend) (THIS_ DWORD* pdwAppend) PURE; - - /* IDirectMusicSynth8 */ - STDMETHOD(PlayVoice) (THIS_ REFERENCE_TIME rt, - DWORD dwVoiceId, - DWORD dwChannelGroup, - DWORD dwChannel, - DWORD dwDLId, - long prPitch, /* PREL not defined here */ - long vrVolume, /* VREL not defined here */ - SAMPLE_TIME stVoiceStart, - SAMPLE_TIME stLoopStart, - SAMPLE_TIME stLoopEnd) PURE; - - STDMETHOD(StopVoice) (THIS_ REFERENCE_TIME rt, - DWORD dwVoiceId ) PURE; - - STDMETHOD(GetVoiceState) (THIS_ DWORD dwVoice[], - DWORD cbVoice, - DMUS_VOICE_STATE dwVoiceState[] ) PURE; - STDMETHOD(Refresh) (THIS_ DWORD dwDownloadID, - DWORD dwFlags) PURE; - STDMETHOD(AssignChannelToBuses) (THIS_ DWORD dwChannelGroup, - DWORD dwChannel, - LPDWORD pdwBuses, - DWORD cBuses) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirectMusicSynthSink -DECLARE_INTERFACE_(IDirectMusicSynthSink, IUnknown) -{ - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectMusicSynthSink */ - STDMETHOD(Init) (THIS_ IDirectMusicSynth *pSynth) PURE; - STDMETHOD(SetMasterClock) (THIS_ IReferenceClock *pClock) PURE; - STDMETHOD(GetLatencyClock) (THIS_ IReferenceClock **ppClock) PURE; - STDMETHOD(Activate) (THIS_ BOOL fEnable) PURE; - STDMETHOD(SampleToRefTime) (THIS_ LONGLONG llSampleTime, - REFERENCE_TIME *prfTime) PURE; - STDMETHOD(RefTimeToSample) (THIS_ REFERENCE_TIME rfTime, - LONGLONG *pllSampleTime) PURE; - STDMETHOD(SetDirectSound) (THIS_ LPDIRECTSOUND pDirectSound, - LPDIRECTSOUNDBUFFER pDirectSoundBuffer) PURE; - STDMETHOD(GetDesiredBufferSize) (THIS_ LPDWORD pdwBufferSizeInSamples) PURE; -}; - -DEFINE_GUID(IID_IDirectMusicSynth, 0x9823661, 0x5c85, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6); -DEFINE_GUID(IID_IDirectMusicSynth8,0x53cab625, 0x2711, 0x4c9f, 0x9d, 0xe7, 0x1b, 0x7f, 0x92, 0x5f, 0x6f, 0xc8); -DEFINE_GUID(IID_IDirectMusicSynthSink,0x9823663, 0x5c85, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6); - -/* Property Set GUID_DMUS_PROP_SetSynthSink - * - * Item 0: An IUnknown on which the port can QueryInterface for a user-mode synth sink. - */ -DEFINE_GUID(GUID_DMUS_PROP_SetSynthSink,0x0a3a5ba5, 0x37b6, 0x11d2, 0xb9, 0xf9, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); - -/* Property Set GUID_DMUS_PROP_SinkUsesDSound - * - * Item 0: A DWORD boolean indicating whether or not the sink requires an IDirectSound interface. The - * default is FALSE if this property item is not implemented by the sink. - */ -DEFINE_GUID(GUID_DMUS_PROP_SinkUsesDSound, 0xbe208857, 0x8952, 0x11d2, 0xba, 0x1c, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); - -#endif diff --git a/import/DirectX8/include/dpaddr.h b/import/DirectX8/include/dpaddr.h deleted file mode 100644 index e7ef18246..000000000 --- a/import/DirectX8/include/dpaddr.h +++ /dev/null @@ -1,375 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) 2000 Microsoft Corporation. All Rights Reserved. - * - * File: dpaddr.h - * Content: DirectPlayAddress include file - ***************************************************************************/ - -#ifndef __DIRECTPLAYADDRESS__ -#define __DIRECTPLAYADDRESS__ - -#include // for DECLARE_INTERFACE and HRESULT - -#ifdef __cplusplus -extern "C" { -#endif - -#include "dplay8.h" - -/**************************************************************************** - * - * DirectPlay8Address CLSIDs - * - ****************************************************************************/ - -// {934A9523-A3CA-4bc5-ADA0-D6D95D979421} -DEFINE_GUID(CLSID_DirectPlay8Address, -0x934a9523, 0xa3ca, 0x4bc5, 0xad, 0xa0, 0xd6, 0xd9, 0x5d, 0x97, 0x94, 0x21); - -/**************************************************************************** - * - * DirectPlay8Address Interface IIDs - * - ****************************************************************************/ - - -// {83783300-4063-4c8a-9DB3-82830A7FEB31} -DEFINE_GUID(IID_IDirectPlay8Address, -0x83783300, 0x4063, 0x4c8a, 0x9d, 0xb3, 0x82, 0x83, 0xa, 0x7f, 0xeb, 0x31); - -// {E5A0E990-2BAD-430b-87DA-A142CF75DE58} -DEFINE_GUID(IID_IDirectPlay8AddressIP, -0xe5a0e990, 0x2bad, 0x430b, 0x87, 0xda, 0xa1, 0x42, 0xcf, 0x75, 0xde, 0x58); - - -/**************************************************************************** - * - * DirectPlay8Address Interface Pointer definitions - * - ****************************************************************************/ - - -typedef struct IDirectPlay8Address *PDIRECTPLAY8ADDRESS, *LPDIRECTPLAY8ADDRESS; -typedef struct IDirectPlay8AddressIP *PDIRECTPLAY8ADDRESSIP, *LPDIRECTPLAY8ADDRESSIP; - -/**************************************************************************** - * - * DirectPlay8Address Forward Declarations For External Types - * - ****************************************************************************/ - -typedef struct sockaddr SOCKADDR; - -/**************************************************************************** - * - * DirectPlay8Address Constants - * - ****************************************************************************/ -// -// Asynchronous operation flags -// -#define DPNA_DATATYPE_STRING 0x00000001 -#define DPNA_DATATYPE_DWORD 0x00000002 -#define DPNA_DATATYPE_GUID 0x00000003 -#define DPNA_DATATYPE_BINARY 0x00000004 -#define DPNA_DATATYPE_STRING_ANSI 0x00000005 - -#define DPNA_DPNSVR_PORT 6073 - -#define DPNA_INDEX_INVALID 0xFFFFFFFF - -/**************************************************************************** - * - * DirectPlay8Address Address Elements - * - ****************************************************************************/ - -#define DPNA_SEPARATOR_KEYVALUE L'=' -#define DPNA_SEPARATOR_USERDATA L'#' -#define DPNA_SEPARATOR_COMPONENT L';' -#define DPNA_ESCAPECHAR L'%' - -// Header -#define DPNA_HEADER L"x-directplay:/" - -// key names for address components -#define DPNA_KEY_APPLICATION_INSTANCE L"applicationinstance" -#define DPNA_KEY_BAUD L"baud" -#define DPNA_KEY_DEVICE L"device" -#define DPNA_KEY_FLOWCONTROL L"flowcontrol" -#define DPNA_KEY_HOSTNAME L"hostname" -#define DPNA_KEY_PARITY L"parity" -#define DPNA_KEY_PHONENUMBER L"phonenumber" -#define DPNA_KEY_PORT L"port" -#define DPNA_KEY_PROGRAM L"program" -#define DPNA_KEY_PROVIDER L"provider" -#define DPNA_KEY_STOPBITS L"stopbits" - -// values for baud rate -#define DPNA_BAUD_RATE_9600 9600 -#define DPNA_BAUD_RATE_14400 14400 -#define DPNA_BAUD_RATE_19200 19200 -#define DPNA_BAUD_RATE_38400 38400 -#define DPNA_BAUD_RATE_56000 56000 -#define DPNA_BAUD_RATE_57600 57600 -#define DPNA_BAUD_RATE_115200 115200 - -// values for stop bits -#define DPNA_STOP_BITS_ONE L"1" -#define DPNA_STOP_BITS_ONE_FIVE L"1.5" -#define DPNA_STOP_BITS_TWO L"2" - -// values for parity -#define DPNA_PARITY_NONE L"NONE" -#define DPNA_PARITY_EVEN L"EVEN" -#define DPNA_PARITY_ODD L"ODD" -#define DPNA_PARITY_MARK L"MARK" -#define DPNA_PARITY_SPACE L"SPACE" - -// values for flow control -#define DPNA_FLOW_CONTROL_NONE L"NONE" -#define DPNA_FLOW_CONTROL_XONXOFF L"XONXOFF" -#define DPNA_FLOW_CONTROL_RTS L"RTS" -#define DPNA_FLOW_CONTROL_DTR L"DTR" -#define DPNA_FLOW_CONTROL_RTSDTR L"RTSDTR" - -// Shortcut values -// -// These can be used instead of the corresponding CLSID_DP8SP_XXXX guids -// -#define DPNA_VALUE_TCPIPPROVIDER L"IP" -#define DPNA_VALUE_IPXPROVIDER L"IPX" -#define DPNA_VALUE_MODEMPROVIDER L"MODEM" -#define DPNA_VALUE_SERIALPROVIDER L"SERIAL" - - -//// ANSI DEFINITIONS - -// Header -#define DPNA_HEADER_A "x-directplay:/" -#define DPNA_SEPARATOR_KEYVALUE_A '=' -#define DPNA_SEPARATOR_USERDATA_A '#' -#define DPNA_SEPARATOR_COMPONENT_A ';' -#define DPNA_ESCAPECHAR_A '%' - -// key names for address components -#define DPNA_KEY_APPLICATION_INSTANCE_A "applicationinstance" -#define DPNA_KEY_BAUD_A "baud" -#define DPNA_KEY_DEVICE_A "device" -#define DPNA_KEY_FLOWCONTROL_A "flowcontrol" -#define DPNA_KEY_HOSTNAME_A "hostname" -#define DPNA_KEY_PARITY_A "parity" -#define DPNA_KEY_PHONENUMBER_A "phonenumber" -#define DPNA_KEY_PORT_A "port" -#define DPNA_KEY_PROGRAM_A "program" -#define DPNA_KEY_PROVIDER_A "provider" -#define DPNA_KEY_STOPBITS_A "stopbits" - -// values for stop bits -#define DPNA_STOP_BITS_ONE_A "1" -#define DPNA_STOP_BITS_ONE_FIVE_A "1.5" -#define DPNA_STOP_BITS_TWO_A "2" - -// values for parity -#define DPNA_PARITY_NONE_A "NONE" -#define DPNA_PARITY_EVEN_A "EVEN" -#define DPNA_PARITY_ODD_A "ODD" -#define DPNA_PARITY_MARK_A "MARK" -#define DPNA_PARITY_SPACE_A "SPACE" - -// values for flow control -#define DPNA_FLOW_CONTROL_NONE_A "NONE" -#define DPNA_FLOW_CONTROL_XONXOFF_A "XONXOFF" -#define DPNA_FLOW_CONTROL_RTS_A "RTS" -#define DPNA_FLOW_CONTROL_DTR_A "DTR" -#define DPNA_FLOW_CONTROL_RTSDTR_A "RTSDTR" - -// Shortcut values -// -// These can be used instead of the corresponding CLSID_DP8SP_XXXX guids -// -#define DPNA_VALUE_TCPIPPROVIDER_A "IP" -#define DPNA_VALUE_IPXPROVIDER_A "IPX" -#define DPNA_VALUE_MODEMPROVIDER_A "MODEM" -#define DPNA_VALUE_SERIALPROVIDER_A "SERIAL" - -/**************************************************************************** - * - * DirectPlay8Address Functions - * - ****************************************************************************/ - -/* - * - * This function is no longer supported. It is recommended that CoCreateInstance be used to create - * DirectPlay8 address objects. - * - * HRESULT WINAPI DirectPlay8AddressCreate( const GUID * pcIID, void **ppvInterface, IUnknown *pUnknown); - * - */ - -/**************************************************************************** - * - * DirectPlay8Address Application Interfaces - * - ****************************************************************************/ - -// -// COM definition for IDirectPlay8Address Generic Interface -// -#undef INTERFACE // External COM Implementation -#define INTERFACE IDirectPlay8Address -DECLARE_INTERFACE_(IDirectPlay8Address,IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectPlay8Address methods ***/ - - STDMETHOD(BuildFromURLW)(THIS_ WCHAR *pwszSourceURL ) PURE; - STDMETHOD(BuildFromURLA)(THIS_ CHAR *pszSourceURL ) PURE; - STDMETHOD(Duplicate)(THIS_ PDIRECTPLAY8ADDRESS *ppdpaNewAddress ) PURE; - STDMETHOD(SetEqual)(THIS_ PDIRECTPLAY8ADDRESS pdpaAddress ) PURE; - STDMETHOD(IsEqual)(THIS_ PDIRECTPLAY8ADDRESS pdpaAddress ) PURE; - STDMETHOD(Clear)(THIS ) PURE; - STDMETHOD(GetURLW)(THIS_ WCHAR *pwszURL, PDWORD pdwNumChars ) PURE; - STDMETHOD(GetURLA)(THIS_ CHAR *pszURL, PDWORD pdwNumChars) PURE; - STDMETHOD(GetSP)(THIS_ GUID *pguidSP ) PURE; - STDMETHOD(GetUserData)(THIS_ void *pvUserData, PDWORD pdwBufferSize) PURE; - STDMETHOD(SetSP)(THIS_ const GUID * const pguidSP ) PURE; - STDMETHOD(SetUserData)(THIS_ const void * const pvUserData, const DWORD dwDataSize) PURE; - STDMETHOD(GetNumComponents)(THIS_ PDWORD pdwNumComponents ) PURE; - STDMETHOD(GetComponentByName)(THIS_ const WCHAR * const pwszName, void *pvBuffer, PDWORD pdwBufferSize, PDWORD pdwDataType ) PURE; - STDMETHOD(GetComponentByIndex)(THIS_ const DWORD dwComponentID, WCHAR * pwszName, PDWORD pdwNameLen, void *pvBuffer, PDWORD pdwBufferSize, PDWORD pdwDataType ) PURE; - STDMETHOD(AddComponent)(THIS_ const WCHAR * const pwszName, const void * const lpvData, const DWORD dwDataSize, const DWORD dwDataType ) PURE; - STDMETHOD(GetDevice)(THIS_ GUID * ) PURE; - STDMETHOD(SetDevice)(THIS_ const GUID * const) PURE; - STDMETHOD(BuildFromDPADDRESS)( THIS_ LPVOID pvAddress, DWORD dwDataSize ) PURE; -}; - -// -// COM definition for IDirectPlay8AddressIP Generic Interface -// -#undef INTERFACE // External COM Implementation -#define INTERFACE IDirectPlay8AddressIP -DECLARE_INTERFACE_(IDirectPlay8AddressIP,IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID, PVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /*** IDirectPlay8AddressIP methods ***/ - - // Constructs a IDirectPlay8 TCP Address from a SOCKADDR structure - STDMETHOD(BuildFromSockAddr)(THIS_ const SOCKADDR * const ) PURE; - - // Constructs a TCP Address from a string (hostname) and port - STDMETHOD(BuildAddress)(THIS_ const WCHAR * const wszAddress, const USHORT usPort ) PURE; - - // Builds a local TCP Address - STDMETHOD(BuildLocalAddress)(THIS_ const GUID * const pguidAdapter, const USHORT usPort ) PURE; - - // Gets the address from the structure in SOCKADR format - STDMETHOD(GetSockAddress)(THIS_ SOCKADDR *, PDWORD ) PURE; - - // Gets the local afddress - STDMETHOD(GetLocalAddress)(THIS_ GUID *pguidAdapter, USHORT *pusPort ) PURE; - - // Gets the remote address - STDMETHOD(GetAddress)(THIS_ WCHAR *wszAddress, PDWORD pdwAddressLength, USHORT *psPort ) PURE; - -}; - - - -/**************************************************************************** - * - * IDirectPlay8 application interface macros - * - ****************************************************************************/ - -#if !defined(__cplusplus) || defined(CINTERFACE) - -#define IDirectPlay8Address_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectPlay8Address_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectPlay8Address_Release(p) (p)->lpVtbl->Release(p) -#define IDirectPlay8Address_BuildFromURLW(p,a) (p)->lpVtbl->BuildFromURLW(p,a) -#define IDirectPlay8Address_BuildFromURLA(p,a) (p)->lpVtbl->BuildFromURLA(p,a) -#define IDirectPlay8Address_Duplicate(p,a) (p)->lpVtbl->Duplicate(p,a) -#define IDirectPlay8Address_SetEqual(p,a) (p)->lpVtbl->SetEqual(p,a) -#define IDirectPlay8Address_IsEqual(p,a) (p)->lpVtbl->IsEqual(p,a) -#define IDirectPlay8Address_Clear(p) (p)->lpVtbl->Clear(p) -#define IDirectPlay8Address_GetURLW(p,a,b) (p)->lpVtbl->GetURLW(p,a,b) -#define IDirectPlay8Address_GetURLA(p,a,b) (p)->lpVtbl->GetURLA(p,a,b) -#define IDirectPlay8Address_GetSP(p,a) (p)->lpVtbl->GetSP(p,a) -#define IDirectPlay8Address_GetUserData(p,a,b) (p)->lpVtbl->GetUserData(p,a,b) -#define IDirectPlay8Address_SetSP(p,a) (p)->lpVtbl->SetSP(p,a) -#define IDirectPlay8Address_SetUserData(p,a,b) (p)->lpVtbl->SetUserData(p,a,b) -#define IDirectPlay8Address_GetNumComponents(p,a) (p)->lpVtbl->GetNumComponents(p,a) -#define IDirectPlay8Address_GetComponentByName(p,a,b,c,d) (p)->lpVtbl->GetComponentByName(p,a,b,c,d) -#define IDirectPlay8Address_GetComponentByIndex(p,a,b,c,d,e,f) (p)->lpVtbl->GetComponentByIndex(p,a,b,c,d,e,f) -#define IDirectPlay8Address_AddComponent(p,a,b,c,d) (p)->lpVtbl->AddComponent(p,a,b,c,d) -#define IDirectPlay8Address_SetDevice(p,a) (p)->lpVtbl->SetDevice(p,a) -#define IDirectPlay8Address_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) -#define IDirectPlay8Address_BuildFromDirectPlay4Address(p,a,b) (p)->lpVtbl->BuildFromDirectPlay4Address(p,a,b) - -#define IDirectPlay8AddressIP_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectPlay8AddressIP_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectPlay8AddressIP_Release(p) (p)->lpVtbl->Release(p) -#define IDirectPlay8AddressIP_BuildFromSockAddr(p,a) (p)->lpVtbl->BuildFromSockAddr(p,a) -#define IDirectPlay8AddressIP_BuildAddress(p,a,b) (p)->lpVtbl->BuildAddress(p,a,b) -#define IDirectPlay8AddressIP_BuildLocalAddress(p,a,b) (p)->lpVtbl->BuildLocalAddress(p,a,b) -#define IDirectPlay8AddressIP_GetSockAddress(p,a,b) (p)->lpVtbl->GetSockAddress(p,a,b) -#define IDirectPlay8AddressIP_GetLocalAddress(p,a,b) (p)->lpVtbl->GetLocalAddress(p,a,b) -#define IDirectPlay8AddressIP_GetAddress(p,a,b,c) (p)->lpVtbl->GetAddress(p,a,b,c) - - -#else /* C++ */ - -#define IDirectPlay8Address_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectPlay8Address_AddRef(p) (p)->AddRef() -#define IDirectPlay8Address_Release(p) (p)->Release() -#define IDirectPlay8Address_BuildFromURLW(p,a) (p)->BuildFromURLW(a) -#define IDirectPlay8Address_BuildFromURLA(p,a) (p)->BuildFromURLA(a) -#define IDirectPlay8Address_Duplicate(p,a) (p)->Duplicate(a) -#define IDirectPlay8Address_SetEqual(p,a) (p)->SetEqual(a) -#define IDirectPlay8Address_IsEqual(p,a) (p)->IsEqual(a) -#define IDirectPlay8Address_Clear(p) (p)->Clear() -#define IDirectPlay8Address_GetURLW(p,a,b) (p)->GetURLW(a,b) -#define IDirectPlay8Address_GetURLA(p,a,b) (p)->GetURLA(a,b) -#define IDirectPlay8Address_GetSP(p,a) (p)->GetSP(a) -#define IDirectPlay8Address_GetUserData(p,a,b) (p)->GetUserData(a,b) -#define IDirectPlay8Address_SetSP(p,a) (p)->SetSP(a) -#define IDirectPlay8Address_SetUserData(p,a,b) (p)->SetUserData(a,b) -#define IDirectPlay8Address_GetNumComponents(p,a) (p)->GetNumComponents(a) -#define IDirectPlay8Address_GetComponentByName(p,a,b,c,d) (p)->GetComponentByName(a,b,c,d) -#define IDirectPlay8Address_GetComponentByIndex(p,a,b,c,d,e,f) (p)->GetComponentByIndex(a,b,c,d,e,f) -#define IDirectPlay8Address_AddComponent(p,a,b,c,d) (p)->AddComponent(a,b,c,d) -#define IDirectPlay8Address_SetDevice(p,a) (p)->SetDevice(a) -#define IDirectPlay8Address_GetDevice(p,a) (p)->GetDevice(a) -#define IDirectPlay8Address_BuildFromDirectPlay4Address(p,a,b) (p)->BuildFromDirectPlay4Address(a,b) - -#define IDirectPlay8AddressIP_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectPlay8AddressIP_AddRef(p) (p)->AddRef() -#define IDirectPlay8AddressIP_Release(p) (p)->Release() -#define IDirectPlay8AddressIP_BuildFromSockAddr(p,a) (p)->BuildFromSockAddr(a) -#define IDirectPlay8AddressIP_BuildAddress(p,a,b) (p)->BuildAddress(a,b) -#define IDirectPlay8AddressIP_BuildLocalAddress(p,a,b) (p)->BuildLocalAddress(a,b) -#define IDirectPlay8AddressIP_GetSockAddress(p,a,b) (p)->GetSockAddress(a,b) -#define IDirectPlay8AddressIP_GetLocalAddress(p,a,b) (p)->GetLocalAddress(a,b) -#define IDirectPlay8AddressIP_GetAddress(p,a,b,c) (p)->GetAddress(a,b,c) - - -#endif - - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/dplay.h b/import/DirectX8/include/dplay.h deleted file mode 100644 index ae2114489..000000000 --- a/import/DirectX8/include/dplay.h +++ /dev/null @@ -1,2146 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) 1994-1997 Microsoft Corporation. All Rights Reserved. - * - * File: dplay.h - * Content: DirectPlay include file - * - ***************************************************************************/ - -#ifndef __DPLAY_INCLUDED__ -#define __DPLAY_INCLUDED__ - -#include // for DECLARE_INTERFACE and HRESULT - -/* avoid warnings in MSVC at Level4 */ -#pragma warning(disable:4201) - - -/* - * Some types - */ - -#ifndef _WIN64 -#define DWORD_PTR DWORD -#endif - -typedef LPVOID (*LPRGLPVOID)[]; -typedef LPRGLPVOID PRGPVOID, LPRGPVOID, PRGLPVOID, PAPVOID, LPAPVOID, PALPVOID, LPALPVOID; - -#define VOL volatile -typedef VOID *VOL LPVOIDV; - - -#define _FACDP 0x877 -#define MAKE_DPHRESULT( code ) MAKE_HRESULT( 1, _FACDP, code ) - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * GUIDS used by DirectPlay objects - */ -DEFINE_GUID(IID_IDirectPlay2, 0x2b74f7c0, 0x9154, 0x11cf, 0xa9, 0xcd, 0x0, 0xaa, 0x0, 0x68, 0x86, 0xe3); -DEFINE_GUID(IID_IDirectPlay2A,0x9d460580, 0xa822, 0x11cf, 0x96, 0xc, 0x0, 0x80, 0xc7, 0x53, 0x4e, 0x82); - -DEFINE_GUID(IID_IDirectPlay3, 0x133efe40, 0x32dc, 0x11d0, 0x9c, 0xfb, 0x0, 0xa0, 0xc9, 0xa, 0x43, 0xcb); -DEFINE_GUID(IID_IDirectPlay3A,0x133efe41, 0x32dc, 0x11d0, 0x9c, 0xfb, 0x0, 0xa0, 0xc9, 0xa, 0x43, 0xcb); - -DEFINE_GUID(IID_IDirectPlay4, 0xab1c530, 0x4745, 0x11d1, 0xa7, 0xa1, 0x0, 0x0, 0xf8, 0x3, 0xab, 0xfc); -DEFINE_GUID(IID_IDirectPlay4A,0xab1c531, 0x4745, 0x11d1, 0xa7, 0xa1, 0x0, 0x0, 0xf8, 0x3, 0xab, 0xfc); - -// {D1EB6D20-8923-11d0-9D97-00A0C90A43CB} -DEFINE_GUID(CLSID_DirectPlay,0xd1eb6d20, 0x8923, 0x11d0, 0x9d, 0x97, 0x0, 0xa0, 0xc9, 0xa, 0x43, 0xcb); - -/* - * GUIDS used by Service Providers shipped with DirectPlay - * Use these to identify Service Provider returned by EnumConnections - */ - -// GUID for IPX service provider -// {685BC400-9D2C-11cf-A9CD-00AA006886E3} -DEFINE_GUID(DPSPGUID_IPX, -0x685bc400, 0x9d2c, 0x11cf, 0xa9, 0xcd, 0x0, 0xaa, 0x0, 0x68, 0x86, 0xe3); - -// GUID for TCP/IP service provider -// 36E95EE0-8577-11cf-960C-0080C7534E82 -DEFINE_GUID(DPSPGUID_TCPIP, -0x36E95EE0, 0x8577, 0x11cf, 0x96, 0xc, 0x0, 0x80, 0xc7, 0x53, 0x4e, 0x82); - -// GUID for Serial service provider -// {0F1D6860-88D9-11cf-9C4E-00A0C905425E} -DEFINE_GUID(DPSPGUID_SERIAL, -0xf1d6860, 0x88d9, 0x11cf, 0x9c, 0x4e, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e); - -// GUID for Modem service provider -// {44EAA760-CB68-11cf-9C4E-00A0C905425E} -DEFINE_GUID(DPSPGUID_MODEM, -0x44eaa760, 0xcb68, 0x11cf, 0x9c, 0x4e, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e); - -/**************************************************************************** - * - * DirectPlay Structures - * - * Various structures used to invoke DirectPlay. - * - ****************************************************************************/ - -#ifndef IDIRECTPLAY2_OR_GREATER -typedef struct IDirectPlay FAR *LPDIRECTPLAY; -#else -typedef struct IUnknown FAR *LPDIRECTPLAY; -#endif - -typedef struct IDirectPlay2 FAR *LPDIRECTPLAY2; -typedef struct IDirectPlay2 FAR *LPDIRECTPLAY2A; -typedef struct IDirectPlay2 IDirectPlay2A; - -typedef struct IDirectPlay3 FAR *LPDIRECTPLAY3; -typedef struct IDirectPlay3 FAR *LPDIRECTPLAY3A; -typedef struct IDirectPlay3 IDirectPlay3A; - -typedef struct IDirectPlay4 FAR *LPDIRECTPLAY4; -typedef struct IDirectPlay4 FAR *LPDIRECTPLAY4A; -typedef struct IDirectPlay4 IDirectPlay4A; - -/* - * DPID - * DirectPlay player and group ID - */ -typedef DWORD DPID, FAR *LPDPID; - -/* - * DPID that system messages come from - */ -#define DPID_SYSMSG 0 - -/* - * DPID representing all players in the session - */ -#define DPID_ALLPLAYERS 0 - -/* - * DPID representing the server player - */ -#define DPID_SERVERPLAYER 1 - - -/* - * DPID representing the maxiumum ID in the range of DPID's reserved for - * use by DirectPlay. - */ -#define DPID_RESERVEDRANGE 100 - -/* - * The player ID is unknown (used with e.g. DPSESSION_NOMESSAGEID) - */ -#define DPID_UNKNOWN 0xFFFFFFFF - -/* - * DPCAPS - * Used to obtain the capabilities of a DirectPlay object - */ -typedef struct -{ - DWORD dwSize; // Size of structure, in bytes - DWORD dwFlags; // DPCAPS_xxx flags - DWORD dwMaxBufferSize; // Maximum message size, in bytes, for this service provider - DWORD dwMaxQueueSize; // Obsolete. - DWORD dwMaxPlayers; // Maximum players/groups (local + remote) - DWORD dwHundredBaud; // Bandwidth in 100 bits per second units; - // i.e. 24 is 2400, 96 is 9600, etc. - DWORD dwLatency; // Estimated latency; 0 = unknown - DWORD dwMaxLocalPlayers; // Maximum # of locally created players allowed - DWORD dwHeaderLength; // Maximum header length, in bytes, on messages - // added by the service provider - DWORD dwTimeout; // Service provider's suggested timeout value - // This is how long DirectPlay will wait for - // responses to system messages -} DPCAPS, FAR *LPDPCAPS; - -/* - * This DirectPlay object is the session host. If the host exits the - * session, another application will become the host and receive a - * DPSYS_HOST system message. - */ -#define DPCAPS_ISHOST 0x00000002 - -/* - * The service provider bound to this DirectPlay object can optimize - * group messaging. - */ -#define DPCAPS_GROUPOPTIMIZED 0x00000008 - -/* - * The service provider bound to this DirectPlay object can optimize - * keep alives (see DPSESSION_KEEPALIVE) - */ -#define DPCAPS_KEEPALIVEOPTIMIZED 0x00000010 - -/* - * The service provider bound to this DirectPlay object can optimize - * guaranteed message delivery. - */ -#define DPCAPS_GUARANTEEDOPTIMIZED 0x00000020 - -/* - * This DirectPlay object supports guaranteed message delivery. - */ -#define DPCAPS_GUARANTEEDSUPPORTED 0x00000040 - -/* - * This DirectPlay object supports digital signing of messages. - */ -#define DPCAPS_SIGNINGSUPPORTED 0x00000080 - -/* - * This DirectPlay object supports encryption of messages. - */ -#define DPCAPS_ENCRYPTIONSUPPORTED 0x00000100 - -/* - * This DirectPlay player was created on this machine - */ -#define DPPLAYERCAPS_LOCAL 0x00000800 - -/* - * Current Open settings supports all forms of Cancel - */ -#define DPCAPS_ASYNCCANCELSUPPORTED 0x00001000 - -/* - * Current Open settings supports CancelAll, but not Cancel - */ -#define DPCAPS_ASYNCCANCELALLSUPPORTED 0x00002000 - -/* - * Current Open settings supports Send Timeouts for sends - */ -#define DPCAPS_SENDTIMEOUTSUPPORTED 0x00004000 - -/* - * Current Open settings supports send priority - */ -#define DPCAPS_SENDPRIORITYSUPPORTED 0x00008000 - -/* - * Current Open settings supports DPSEND_ASYNC flag - */ -#define DPCAPS_ASYNCSUPPORTED 0x00010000 - - -/* - * DPSESSIONDESC2 - * Used to describe the properties of a DirectPlay - * session instance - */ -typedef struct -{ - DWORD dwSize; // Size of structure - DWORD dwFlags; // DPSESSION_xxx flags - GUID guidInstance; // ID for the session instance - GUID guidApplication; // GUID of the DirectPlay application. - // GUID_NULL for all applications. - DWORD dwMaxPlayers; // Maximum # players allowed in session - DWORD dwCurrentPlayers; // Current # players in session (read only) - union - { // Name of the session - LPWSTR lpszSessionName; // Unicode - LPSTR lpszSessionNameA; // ANSI - }; - union - { // Password of the session (optional) - LPWSTR lpszPassword; // Unicode - LPSTR lpszPasswordA; // ANSI - }; - DWORD_PTR dwReserved1; // Reserved for future MS use. - DWORD_PTR dwReserved2; - DWORD_PTR dwUser1; // For use by the application - DWORD_PTR dwUser2; - DWORD_PTR dwUser3; - DWORD_PTR dwUser4; -} DPSESSIONDESC2, FAR *LPDPSESSIONDESC2; - -typedef DPSESSIONDESC2 * VOL LPDPSESSIONDESC2_V; - -/* - * LPCDPSESSIONDESC2 - * A constant pointer to DPSESSIONDESC2 - */ -typedef const DPSESSIONDESC2 FAR *LPCDPSESSIONDESC2; - -/* - * Applications cannot create new players in this session. - */ -#define DPSESSION_NEWPLAYERSDISABLED 0x00000001 - -/* - * If the DirectPlay object that created the session, the host, - * quits, then the host will attempt to migrate to another - * DirectPlay object so that new players can continue to be created - * and new applications can join the session. - */ -#define DPSESSION_MIGRATEHOST 0x00000004 - -/* - * This flag tells DirectPlay not to set the idPlayerTo and idPlayerFrom - * fields in player messages. This cuts two DWORD's off the message - * overhead. - */ -#define DPSESSION_NOMESSAGEID 0x00000008 - - -/* - * This flag tells DirectPlay to not allow any new applications to - * join the session. Applications already in the session can still - * create new players. - */ -#define DPSESSION_JOINDISABLED 0x00000020 - -/* - * This flag tells DirectPlay to detect when remote players - * exit abnormally (e.g. their computer or modem gets unplugged) - */ -#define DPSESSION_KEEPALIVE 0x00000040 - -/* - * This flag tells DirectPlay not to send a message to all players - * when a players remote data changes - */ -#define DPSESSION_NODATAMESSAGES 0x00000080 - -/* - * This flag indicates that the session belongs to a secure server - * and needs user authentication - */ -#define DPSESSION_SECURESERVER 0x00000100 - -/* - * This flag indicates that the session is private and requirs a password - * for EnumSessions as well as Open. - */ -#define DPSESSION_PRIVATE 0x00000200 - -/* - * This flag indicates that the session requires a password for joining. - */ -#define DPSESSION_PASSWORDREQUIRED 0x00000400 - -/* - * This flag tells DirectPlay to route all messages through the server - */ -#define DPSESSION_MULTICASTSERVER 0x00000800 - -/* - * This flag tells DirectPlay to only download information about the - * DPPLAYER_SERVERPLAYER. - */ -#define DPSESSION_CLIENTSERVER 0x00001000 - -/* - * This flag tells DirectPlay to use the protocol built into dplay - * for reliability and statistics all the time. When this bit is - * set, only other sessions with this bit set can join or be joined. - */ -#define DPSESSION_DIRECTPLAYPROTOCOL 0x00002000 - -/* - * This flag tells DirectPlay that preserving order of received - * packets is not important, when using reliable delivery. This - * will allow messages to be indicated out of order if preceding - * messages have not yet arrived. Otherwise DPLAY will wait for - * earlier messages before delivering later reliable messages. - */ -#define DPSESSION_NOPRESERVEORDER 0x00004000 - - -/* - * This flag tells DirectPlay to optimize communication for latency - */ -#define DPSESSION_OPTIMIZELATENCY 0x00008000 - -/* - * This flag allows lobby launched games that aren't voice enabled - * to get voice capabilities. - */ -#define DPSESSION_ALLOWVOICERETRO 0x00010000 - -/* - * This flag supresses transmission of session desc changes. - * DPSESSION_NODATAMESSAGES was supposed to do that, but SetSessionDesc - * was ignoring the flag and some apps depended on the broken behavior, this - * flag allows applications to get the right behaviour without breaking apps depending - * on old broken behavior. - */ -#define DPSESSION_NOSESSIONDESCMESSAGES 0x00020000 - -/* - * DPNAME - * Used to hold the name of a DirectPlay entity - * like a player or a group - */ -typedef struct -{ - DWORD dwSize; // Size of structure - DWORD dwFlags; // Not used. Must be zero. - union - { // The short or friendly name - LPWSTR lpszShortName; // Unicode - LPSTR lpszShortNameA; // ANSI - }; - union - { // The long or formal name - LPWSTR lpszLongName; // Unicode - LPSTR lpszLongNameA; // ANSI - }; - -} DPNAME, FAR *LPDPNAME; - -/* - * LPCDPNAME - * A constant pointer to DPNAME - */ -typedef const DPNAME FAR *LPCDPNAME; - -/* - * DPCREDENTIALS - * Used to hold the user name and password of a DirectPlay user - */ -typedef struct -{ - DWORD dwSize; // Size of structure - DWORD dwFlags; // Not used. Must be zero. - union - { // User name of the account - LPWSTR lpszUsername; // Unicode - LPSTR lpszUsernameA; // ANSI - }; - union - { // Password of the account - LPWSTR lpszPassword; // Unicode - LPSTR lpszPasswordA; // ANSI - }; - union - { // Domain name of the account - LPWSTR lpszDomain; // Unicode - LPSTR lpszDomainA; // ANSI - }; -} DPCREDENTIALS, FAR *LPDPCREDENTIALS; - -typedef const DPCREDENTIALS FAR *LPCDPCREDENTIALS; - -/* - * DPSECURITYDESC - * Used to describe the security properties of a DirectPlay - * session instance - */ -typedef struct -{ - DWORD dwSize; // Size of structure - DWORD dwFlags; // Not used. Must be zero. - union - { // SSPI provider name - LPWSTR lpszSSPIProvider; // Unicode - LPSTR lpszSSPIProviderA; // ANSI - }; - union - { // CAPI provider name - LPWSTR lpszCAPIProvider; // Unicode - LPSTR lpszCAPIProviderA; // ANSI - }; - DWORD dwCAPIProviderType; // Crypto Service Provider type - DWORD dwEncryptionAlgorithm; // Encryption Algorithm type -} DPSECURITYDESC, FAR *LPDPSECURITYDESC; - -typedef const DPSECURITYDESC FAR *LPCDPSECURITYDESC; - -/* - * DPACCOUNTDESC - * Used to describe a user membership account - */ -typedef struct -{ - DWORD dwSize; // Size of structure - DWORD dwFlags; // Not used. Must be zero. - union - { // Account identifier - LPWSTR lpszAccountID; // Unicode - LPSTR lpszAccountIDA; // ANSI - }; -} DPACCOUNTDESC, FAR *LPDPACCOUNTDESC; - -typedef const DPACCOUNTDESC FAR *LPCDPACCOUNTDESC; - -/* - * LPCGUID - * A constant pointer to a guid - */ -typedef const GUID FAR *LPCGUID; - -/* - * DPLCONNECTION - * Used to hold all in the informaion needed to connect - * an application to a session or create a session - */ -typedef struct -{ - DWORD dwSize; // Size of this structure - DWORD dwFlags; // Flags specific to this structure - LPDPSESSIONDESC2 lpSessionDesc; // Pointer to session desc to use on connect - LPDPNAME lpPlayerName; // Pointer to Player name structure - GUID guidSP; // GUID of the DPlay SP to use - LPVOID lpAddress; // Address for service provider - DWORD dwAddressSize; // Size of address data -} DPLCONNECTION, FAR *LPDPLCONNECTION; - -/* - * LPCDPLCONNECTION - * A constant pointer to DPLCONNECTION - */ -typedef const DPLCONNECTION FAR *LPCDPLCONNECTION; - -/* - * DPCHAT - * Used to hold the a DirectPlay chat message - */ -typedef struct -{ - DWORD dwSize; - DWORD dwFlags; - union - { // Message string - LPWSTR lpszMessage; // Unicode - LPSTR lpszMessageA; // ANSI - }; -} DPCHAT, FAR * LPDPCHAT; - -/* - * SGBUFFER - * Scatter Gather Buffer used for SendEx - */ -typedef struct -{ - UINT len; // length of buffer data - PUCHAR pData; // pointer to buffer data -} SGBUFFER, *PSGBUFFER, FAR *LPSGBUFFER; - - -/**************************************************************************** - * - * Prototypes for DirectPlay callback functions - * - ****************************************************************************/ - -/* - * Callback for IDirectPlay2::EnumSessions - */ -typedef BOOL (FAR PASCAL * LPDPENUMSESSIONSCALLBACK2)( - LPCDPSESSIONDESC2 lpThisSD, - LPDWORD lpdwTimeOut, - DWORD dwFlags, - LPVOID lpContext ); - -/* - * This flag is set on the EnumSessions callback dwFlags parameter when - * the time out has occurred. There will be no session data for this - * callback. If *lpdwTimeOut is set to a non-zero value and the - * EnumSessionsCallback function returns TRUE then EnumSessions will - * continue waiting until the next timeout occurs. Timeouts are in - * milliseconds. - */ -#define DPESC_TIMEDOUT 0x00000001 - - -/* - * Callback for IDirectPlay2::EnumPlayers - * IDirectPlay2::EnumGroups - * IDirectPlay2::EnumGroupPlayers - */ -typedef BOOL (FAR PASCAL *LPDPENUMPLAYERSCALLBACK2)( - DPID dpId, - DWORD dwPlayerType, - LPCDPNAME lpName, - DWORD dwFlags, - LPVOID lpContext ); - - -/* - * Unicode callback for DirectPlayEnumerate - * This callback prototype will be used if compiling - * for Unicode strings - */ -typedef BOOL (FAR PASCAL * LPDPENUMDPCALLBACK)( - LPGUID lpguidSP, - LPWSTR lpSPName, - DWORD dwMajorVersion, - DWORD dwMinorVersion, - LPVOID lpContext); - -/* - * ANSI callback for DirectPlayEnumerate - * This callback prototype will be used if compiling - * for ANSI strings - */ -typedef BOOL (FAR PASCAL * LPDPENUMDPCALLBACKA)( - LPGUID lpguidSP, - LPSTR lpSPName, - DWORD dwMajorVersion, - DWORD dwMinorVersion, - LPVOID lpContext); - -/* - * Callback for IDirectPlay3(A)::EnumConnections - */ -typedef BOOL (FAR PASCAL * LPDPENUMCONNECTIONSCALLBACK)( - LPCGUID lpguidSP, - LPVOID lpConnection, - DWORD dwConnectionSize, - LPCDPNAME lpName, - DWORD dwFlags, - LPVOID lpContext); - - -/* - * API's - */ - -#ifdef UNICODE -#define DirectPlayEnumerate DirectPlayEnumerateW -#else -#define DirectPlayEnumerate DirectPlayEnumerateA -#endif // UNICODE - -extern HRESULT WINAPI DirectPlayEnumerateA( LPDPENUMDPCALLBACKA, LPVOID ); -extern HRESULT WINAPI DirectPlayEnumerateW( LPDPENUMDPCALLBACK, LPVOID ); -extern HRESULT WINAPI DirectPlayCreate( LPGUID lpGUID, LPDIRECTPLAY *lplpDP, IUnknown *pUnk); - -/**************************************************************************** - * - * IDirectPlay2 (and IDirectPlay2A) Interface - * - ****************************************************************************/ - -#undef INTERFACE -#define INTERFACE IDirectPlay2 -DECLARE_INTERFACE_( IDirectPlay2, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectPlay2 methods ***/ - STDMETHOD(AddPlayerToGroup) (THIS_ DPID, DPID) PURE; - STDMETHOD(Close) (THIS) PURE; - STDMETHOD(CreateGroup) (THIS_ LPDPID,LPDPNAME,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(CreatePlayer) (THIS_ LPDPID,LPDPNAME,HANDLE,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(DeletePlayerFromGroup)(THIS_ DPID,DPID) PURE; - STDMETHOD(DestroyGroup) (THIS_ DPID) PURE; - STDMETHOD(DestroyPlayer) (THIS_ DPID) PURE; - STDMETHOD(EnumGroupPlayers) (THIS_ DPID,LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE; - STDMETHOD(EnumGroups) (THIS_ LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE; - STDMETHOD(EnumPlayers) (THIS_ LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE; - STDMETHOD(EnumSessions) (THIS_ LPDPSESSIONDESC2,DWORD,LPDPENUMSESSIONSCALLBACK2,LPVOID,DWORD) PURE; - STDMETHOD(GetCaps) (THIS_ LPDPCAPS,DWORD) PURE; - STDMETHOD(GetGroupData) (THIS_ DPID,LPVOID,LPDWORD,DWORD) PURE; - STDMETHOD(GetGroupName) (THIS_ DPID,LPVOID,LPDWORD) PURE; - STDMETHOD(GetMessageCount) (THIS_ DPID, LPDWORD) PURE; - STDMETHOD(GetPlayerAddress) (THIS_ DPID,LPVOID,LPDWORD) PURE; - STDMETHOD(GetPlayerCaps) (THIS_ DPID,LPDPCAPS,DWORD) PURE; - STDMETHOD(GetPlayerData) (THIS_ DPID,LPVOID,LPDWORD,DWORD) PURE; - STDMETHOD(GetPlayerName) (THIS_ DPID,LPVOID,LPDWORD) PURE; - STDMETHOD(GetSessionDesc) (THIS_ LPVOID,LPDWORD) PURE; - STDMETHOD(Initialize) (THIS_ LPGUID) PURE; - STDMETHOD(Open) (THIS_ LPDPSESSIONDESC2,DWORD) PURE; - STDMETHOD(Receive) (THIS_ LPDPID,LPDPID,DWORD,LPVOID,LPDWORD) PURE; - STDMETHOD(Send) (THIS_ DPID, DPID, DWORD, LPVOID, DWORD) PURE; - STDMETHOD(SetGroupData) (THIS_ DPID,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(SetGroupName) (THIS_ DPID,LPDPNAME,DWORD) PURE; - STDMETHOD(SetPlayerData) (THIS_ DPID,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(SetPlayerName) (THIS_ DPID,LPDPNAME,DWORD) PURE; - STDMETHOD(SetSessionDesc) (THIS_ LPDPSESSIONDESC2,DWORD) PURE; -}; - -/**************************************************************************** - * - * IDirectPlay2 interface macros - * - ****************************************************************************/ - -#if !defined(__cplusplus) || defined(CINTERFACE) - -#define IDirectPlay2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectPlay2_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectPlay2_Release(p) (p)->lpVtbl->Release(p) -#define IDirectPlay2_AddPlayerToGroup(p,a,b) (p)->lpVtbl->AddPlayerToGroup(p,a,b) -#define IDirectPlay2_Close(p) (p)->lpVtbl->Close(p) -#define IDirectPlay2_CreateGroup(p,a,b,c,d,e) (p)->lpVtbl->CreateGroup(p,a,b,c,d,e) -#define IDirectPlay2_CreatePlayer(p,a,b,c,d,e,f) (p)->lpVtbl->CreatePlayer(p,a,b,c,d,e,f) -#define IDirectPlay2_DeletePlayerFromGroup(p,a,b) (p)->lpVtbl->DeletePlayerFromGroup(p,a,b) -#define IDirectPlay2_DestroyGroup(p,a) (p)->lpVtbl->DestroyGroup(p,a) -#define IDirectPlay2_DestroyPlayer(p,a) (p)->lpVtbl->DestroyPlayer(p,a) -#define IDirectPlay2_EnumGroupPlayers(p,a,b,c,d,e) (p)->lpVtbl->EnumGroupPlayers(p,a,b,c,d,e) -#define IDirectPlay2_EnumGroups(p,a,b,c,d) (p)->lpVtbl->EnumGroups(p,a,b,c,d) -#define IDirectPlay2_EnumPlayers(p,a,b,c,d) (p)->lpVtbl->EnumPlayers(p,a,b,c,d) -#define IDirectPlay2_EnumSessions(p,a,b,c,d,e) (p)->lpVtbl->EnumSessions(p,a,b,c,d,e) -#define IDirectPlay2_GetCaps(p,a,b) (p)->lpVtbl->GetCaps(p,a,b) -#define IDirectPlay2_GetMessageCount(p,a,b) (p)->lpVtbl->GetMessageCount(p,a,b) -#define IDirectPlay2_GetGroupData(p,a,b,c,d) (p)->lpVtbl->GetGroupData(p,a,b,c,d) -#define IDirectPlay2_GetGroupName(p,a,b,c) (p)->lpVtbl->GetGroupName(p,a,b,c) -#define IDirectPlay2_GetPlayerAddress(p,a,b,c) (p)->lpVtbl->GetPlayerAddress(p,a,b,c) -#define IDirectPlay2_GetPlayerCaps(p,a,b,c) (p)->lpVtbl->GetPlayerCaps(p,a,b,c) -#define IDirectPlay2_GetPlayerData(p,a,b,c,d) (p)->lpVtbl->GetPlayerData(p,a,b,c,d) -#define IDirectPlay2_GetPlayerName(p,a,b,c) (p)->lpVtbl->GetPlayerName(p,a,b,c) -#define IDirectPlay2_GetSessionDesc(p,a,b) (p)->lpVtbl->GetSessionDesc(p,a,b) -#define IDirectPlay2_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) -#define IDirectPlay2_Open(p,a,b) (p)->lpVtbl->Open(p,a,b) -#define IDirectPlay2_Receive(p,a,b,c,d,e) (p)->lpVtbl->Receive(p,a,b,c,d,e) -#define IDirectPlay2_Send(p,a,b,c,d,e) (p)->lpVtbl->Send(p,a,b,c,d,e) -#define IDirectPlay2_SetGroupData(p,a,b,c,d) (p)->lpVtbl->SetGroupData(p,a,b,c,d) -#define IDirectPlay2_SetGroupName(p,a,b,c) (p)->lpVtbl->SetGroupName(p,a,b,c) -#define IDirectPlay2_SetPlayerData(p,a,b,c,d) (p)->lpVtbl->SetPlayerData(p,a,b,c,d) -#define IDirectPlay2_SetPlayerName(p,a,b,c) (p)->lpVtbl->SetPlayerName(p,a,b,c) -#define IDirectPlay2_SetSessionDesc(p,a,b) (p)->lpVtbl->SetSessionDesc(p,a,b) - -#else /* C++ */ - -#define IDirectPlay2_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectPlay2_AddRef(p) (p)->AddRef() -#define IDirectPlay2_Release(p) (p)->Release() -#define IDirectPlay2_AddPlayerToGroup(p,a,b) (p)->AddPlayerToGroup(a,b) -#define IDirectPlay2_Close(p) (p)->Close() -#define IDirectPlay2_CreateGroup(p,a,b,c,d,e) (p)->CreateGroup(a,b,c,d,e) -#define IDirectPlay2_CreatePlayer(p,a,b,c,d,e,f) (p)->CreatePlayer(a,b,c,d,e,f) -#define IDirectPlay2_DeletePlayerFromGroup(p,a,b) (p)->DeletePlayerFromGroup(a,b) -#define IDirectPlay2_DestroyGroup(p,a) (p)->DestroyGroup(a) -#define IDirectPlay2_DestroyPlayer(p,a) (p)->DestroyPlayer(a) -#define IDirectPlay2_EnumGroupPlayers(p,a,b,c,d,e) (p)->EnumGroupPlayers(a,b,c,d,e) -#define IDirectPlay2_EnumGroups(p,a,b,c,d) (p)->EnumGroups(a,b,c,d) -#define IDirectPlay2_EnumPlayers(p,a,b,c,d) (p)->EnumPlayers(a,b,c,d) -#define IDirectPlay2_EnumSessions(p,a,b,c,d,e) (p)->EnumSessions(a,b,c,d,e) -#define IDirectPlay2_GetCaps(p,a,b) (p)->GetCaps(a,b) -#define IDirectPlay2_GetMessageCount(p,a,b) (p)->GetMessageCount(a,b) -#define IDirectPlay2_GetGroupData(p,a,b,c,d) (p)->GetGroupData(a,b,c,d) -#define IDirectPlay2_GetGroupName(p,a,b,c) (p)->GetGroupName(a,b,c) -#define IDirectPlay2_GetPlayerAddress(p,a,b,c) (p)->GetPlayerAddress(a,b,c) -#define IDirectPlay2_GetPlayerCaps(p,a,b,c) (p)->GetPlayerCaps(a,b,c) -#define IDirectPlay2_GetPlayerData(p,a,b,c,d) (p)->GetPlayerData(a,b,c,d) -#define IDirectPlay2_GetPlayerName(p,a,b,c) (p)->GetPlayerName(a,b,c) -#define IDirectPlay2_GetSessionDesc(p,a,b) (p)->GetSessionDesc(a,b) -#define IDirectPlay2_Initialize(p,a) (p)->Initialize(a) -#define IDirectPlay2_Open(p,a,b) (p)->Open(a,b) -#define IDirectPlay2_Receive(p,a,b,c,d,e) (p)->Receive(a,b,c,d,e) -#define IDirectPlay2_Send(p,a,b,c,d,e) (p)->Send(a,b,c,d,e) -#define IDirectPlay2_SetGroupData(p,a,b,c,d) (p)->SetGroupData(a,b,c,d) -#define IDirectPlay2_SetGroupName(p,a,b,c) (p)->SetGroupName(a,b,c) -#define IDirectPlay2_SetPlayerData(p,a,b,c,d) (p)->SetPlayerData(a,b,c,d) -#define IDirectPlay2_SetPlayerName(p,a,b,c) (p)->SetPlayerName(a,b,c) -#define IDirectPlay2_SetSessionDesc(p,a,b) (p)->SetSessionDesc(a,b) - -#endif - -/**************************************************************************** - * - * IDirectPlay3 (and IDirectPlay3A) Interface - * - ****************************************************************************/ - -#undef INTERFACE -#define INTERFACE IDirectPlay3 -DECLARE_INTERFACE_( IDirectPlay3, IDirectPlay2 ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectPlay2 methods ***/ - STDMETHOD(AddPlayerToGroup) (THIS_ DPID, DPID) PURE; - STDMETHOD(Close) (THIS) PURE; - STDMETHOD(CreateGroup) (THIS_ LPDPID,LPDPNAME,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(CreatePlayer) (THIS_ LPDPID,LPDPNAME,HANDLE,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(DeletePlayerFromGroup)(THIS_ DPID,DPID) PURE; - STDMETHOD(DestroyGroup) (THIS_ DPID) PURE; - STDMETHOD(DestroyPlayer) (THIS_ DPID) PURE; - STDMETHOD(EnumGroupPlayers) (THIS_ DPID,LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE; - STDMETHOD(EnumGroups) (THIS_ LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE; - STDMETHOD(EnumPlayers) (THIS_ LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE; - STDMETHOD(EnumSessions) (THIS_ LPDPSESSIONDESC2,DWORD,LPDPENUMSESSIONSCALLBACK2,LPVOID,DWORD) PURE; - STDMETHOD(GetCaps) (THIS_ LPDPCAPS,DWORD) PURE; - STDMETHOD(GetGroupData) (THIS_ DPID,LPVOID,LPDWORD,DWORD) PURE; - STDMETHOD(GetGroupName) (THIS_ DPID,LPVOID,LPDWORD) PURE; - STDMETHOD(GetMessageCount) (THIS_ DPID, LPDWORD) PURE; - STDMETHOD(GetPlayerAddress) (THIS_ DPID,LPVOID,LPDWORD) PURE; - STDMETHOD(GetPlayerCaps) (THIS_ DPID,LPDPCAPS,DWORD) PURE; - STDMETHOD(GetPlayerData) (THIS_ DPID,LPVOID,LPDWORD,DWORD) PURE; - STDMETHOD(GetPlayerName) (THIS_ DPID,LPVOID,LPDWORD) PURE; - STDMETHOD(GetSessionDesc) (THIS_ LPVOID,LPDWORD) PURE; - STDMETHOD(Initialize) (THIS_ LPGUID) PURE; - STDMETHOD(Open) (THIS_ LPDPSESSIONDESC2,DWORD) PURE; - STDMETHOD(Receive) (THIS_ LPDPID,LPDPID,DWORD,LPVOID,LPDWORD) PURE; - STDMETHOD(Send) (THIS_ DPID, DPID, DWORD, LPVOID, DWORD) PURE; - STDMETHOD(SetGroupData) (THIS_ DPID,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(SetGroupName) (THIS_ DPID,LPDPNAME,DWORD) PURE; - STDMETHOD(SetPlayerData) (THIS_ DPID,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(SetPlayerName) (THIS_ DPID,LPDPNAME,DWORD) PURE; - STDMETHOD(SetSessionDesc) (THIS_ LPDPSESSIONDESC2,DWORD) PURE; - /*** IDirectPlay3 methods ***/ - STDMETHOD(AddGroupToGroup) (THIS_ DPID, DPID) PURE; - STDMETHOD(CreateGroupInGroup) (THIS_ DPID,LPDPID,LPDPNAME,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(DeleteGroupFromGroup) (THIS_ DPID,DPID) PURE; - STDMETHOD(EnumConnections) (THIS_ LPCGUID,LPDPENUMCONNECTIONSCALLBACK,LPVOID,DWORD) PURE; - STDMETHOD(EnumGroupsInGroup) (THIS_ DPID,LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE; - STDMETHOD(GetGroupConnectionSettings)(THIS_ DWORD, DPID, LPVOID, LPDWORD) PURE; - STDMETHOD(InitializeConnection) (THIS_ LPVOID,DWORD) PURE; - STDMETHOD(SecureOpen) (THIS_ LPCDPSESSIONDESC2,DWORD,LPCDPSECURITYDESC,LPCDPCREDENTIALS) PURE; - STDMETHOD(SendChatMessage) (THIS_ DPID,DPID,DWORD,LPDPCHAT) PURE; - STDMETHOD(SetGroupConnectionSettings)(THIS_ DWORD,DPID,LPDPLCONNECTION) PURE; - STDMETHOD(StartSession) (THIS_ DWORD,DPID) PURE; - STDMETHOD(GetGroupFlags) (THIS_ DPID,LPDWORD) PURE; - STDMETHOD(GetGroupParent) (THIS_ DPID,LPDPID) PURE; - STDMETHOD(GetPlayerAccount) (THIS_ DPID, DWORD, LPVOID, LPDWORD) PURE; - STDMETHOD(GetPlayerFlags) (THIS_ DPID,LPDWORD) PURE; -}; - -/**************************************************************************** - * - * IDirectPlay3 interface macros - * - ****************************************************************************/ - -#if !defined(__cplusplus) || defined(CINTERFACE) - -#define IDirectPlay3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectPlay3_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectPlay3_Release(p) (p)->lpVtbl->Release(p) -#define IDirectPlay3_AddPlayerToGroup(p,a,b) (p)->lpVtbl->AddPlayerToGroup(p,a,b) -#define IDirectPlay3_Close(p) (p)->lpVtbl->Close(p) -#define IDirectPlay3_CreateGroup(p,a,b,c,d,e) (p)->lpVtbl->CreateGroup(p,a,b,c,d,e) -#define IDirectPlay3_CreatePlayer(p,a,b,c,d,e,f) (p)->lpVtbl->CreatePlayer(p,a,b,c,d,e,f) -#define IDirectPlay3_DeletePlayerFromGroup(p,a,b) (p)->lpVtbl->DeletePlayerFromGroup(p,a,b) -#define IDirectPlay3_DestroyGroup(p,a) (p)->lpVtbl->DestroyGroup(p,a) -#define IDirectPlay3_DestroyPlayer(p,a) (p)->lpVtbl->DestroyPlayer(p,a) -#define IDirectPlay3_EnumGroupPlayers(p,a,b,c,d,e) (p)->lpVtbl->EnumGroupPlayers(p,a,b,c,d,e) -#define IDirectPlay3_EnumGroups(p,a,b,c,d) (p)->lpVtbl->EnumGroups(p,a,b,c,d) -#define IDirectPlay3_EnumPlayers(p,a,b,c,d) (p)->lpVtbl->EnumPlayers(p,a,b,c,d) -#define IDirectPlay3_EnumSessions(p,a,b,c,d,e) (p)->lpVtbl->EnumSessions(p,a,b,c,d,e) -#define IDirectPlay3_GetCaps(p,a,b) (p)->lpVtbl->GetCaps(p,a,b) -#define IDirectPlay3_GetMessageCount(p,a,b) (p)->lpVtbl->GetMessageCount(p,a,b) -#define IDirectPlay3_GetGroupData(p,a,b,c,d) (p)->lpVtbl->GetGroupData(p,a,b,c,d) -#define IDirectPlay3_GetGroupName(p,a,b,c) (p)->lpVtbl->GetGroupName(p,a,b,c) -#define IDirectPlay3_GetPlayerAddress(p,a,b,c) (p)->lpVtbl->GetPlayerAddress(p,a,b,c) -#define IDirectPlay3_GetPlayerCaps(p,a,b,c) (p)->lpVtbl->GetPlayerCaps(p,a,b,c) -#define IDirectPlay3_GetPlayerData(p,a,b,c,d) (p)->lpVtbl->GetPlayerData(p,a,b,c,d) -#define IDirectPlay3_GetPlayerName(p,a,b,c) (p)->lpVtbl->GetPlayerName(p,a,b,c) -#define IDirectPlay3_GetSessionDesc(p,a,b) (p)->lpVtbl->GetSessionDesc(p,a,b) -#define IDirectPlay3_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) -#define IDirectPlay3_Open(p,a,b) (p)->lpVtbl->Open(p,a,b) -#define IDirectPlay3_Receive(p,a,b,c,d,e) (p)->lpVtbl->Receive(p,a,b,c,d,e) -#define IDirectPlay3_Send(p,a,b,c,d,e) (p)->lpVtbl->Send(p,a,b,c,d,e) -#define IDirectPlay3_SetGroupData(p,a,b,c,d) (p)->lpVtbl->SetGroupData(p,a,b,c,d) -#define IDirectPlay3_SetGroupName(p,a,b,c) (p)->lpVtbl->SetGroupName(p,a,b,c) -#define IDirectPlay3_SetPlayerData(p,a,b,c,d) (p)->lpVtbl->SetPlayerData(p,a,b,c,d) -#define IDirectPlay3_SetPlayerName(p,a,b,c) (p)->lpVtbl->SetPlayerName(p,a,b,c) -#define IDirectPlay3_SetSessionDesc(p,a,b) (p)->lpVtbl->SetSessionDesc(p,a,b) -#define IDirectPlay3_AddGroupToGroup(p,a,b) (p)->lpVtbl->AddGroupToGroup(p,a,b) -#define IDirectPlay3_CreateGroupInGroup(p,a,b,c,d,e,f) (p)->lpVtbl->CreateGroupInGroup(p,a,b,c,d,e,f) -#define IDirectPlay3_DeleteGroupFromGroup(p,a,b) (p)->lpVtbl->DeleteGroupFromGroup(p,a,b) -#define IDirectPlay3_EnumConnections(p,a,b,c,d) (p)->lpVtbl->EnumConnections(p,a,b,c,d) -#define IDirectPlay3_EnumGroupsInGroup(p,a,b,c,d,e) (p)->lpVtbl->EnumGroupsInGroup(p,a,b,c,d,e) -#define IDirectPlay3_GetGroupConnectionSettings(p,a,b,c,d) (p)->lpVtbl->GetGroupConnectionSettings(p,a,b,c,d) -#define IDirectPlay3_InitializeConnection(p,a,b) (p)->lpVtbl->InitializeConnection(p,a,b) -#define IDirectPlay3_SecureOpen(p,a,b,c,d) (p)->lpVtbl->SecureOpen(p,a,b,c,d) -#define IDirectPlay3_SendChatMessage(p,a,b,c,d) (p)->lpVtbl->SendChatMessage(p,a,b,c,d) -#define IDirectPlay3_SetGroupConnectionSettings(p,a,b,c) (p)->lpVtbl->SetGroupConnectionSettings(p,a,b,c) -#define IDirectPlay3_StartSession(p,a,b) (p)->lpVtbl->StartSession(p,a,b) -#define IDirectPlay3_GetGroupFlags(p,a,b) (p)->lpVtbl->GetGroupFlags(p,a,b) -#define IDirectPlay3_GetGroupParent(p,a,b) (p)->lpVtbl->GetGroupParent(p,a,b) -#define IDirectPlay3_GetPlayerAccount(p,a,b,c,d) (p)->lpVtbl->GetPlayerAccount(p,a,b,c,d) -#define IDirectPlay3_GetPlayerFlags(p,a,b) (p)->lpVtbl->GetPlayerFlags(p,a,b) - -#else /* C++ */ - -#define IDirectPlay3_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectPlay3_AddRef(p) (p)->AddRef() -#define IDirectPlay3_Release(p) (p)->Release() -#define IDirectPlay3_AddPlayerToGroup(p,a,b) (p)->AddPlayerToGroup(a,b) -#define IDirectPlay3_Close(p) (p)->Close() -#define IDirectPlay3_CreateGroup(p,a,b,c,d,e) (p)->CreateGroup(a,b,c,d,e) -#define IDirectPlay3_CreatePlayer(p,a,b,c,d,e,f) (p)->CreatePlayer(a,b,c,d,e,f) -#define IDirectPlay3_DeletePlayerFromGroup(p,a,b) (p)->DeletePlayerFromGroup(a,b) -#define IDirectPlay3_DestroyGroup(p,a) (p)->DestroyGroup(a) -#define IDirectPlay3_DestroyPlayer(p,a) (p)->DestroyPlayer(a) -#define IDirectPlay3_EnumGroupPlayers(p,a,b,c,d,e) (p)->EnumGroupPlayers(a,b,c,d,e) -#define IDirectPlay3_EnumGroups(p,a,b,c,d) (p)->EnumGroups(a,b,c,d) -#define IDirectPlay3_EnumPlayers(p,a,b,c,d) (p)->EnumPlayers(a,b,c,d) -#define IDirectPlay3_EnumSessions(p,a,b,c,d,e) (p)->EnumSessions(a,b,c,d,e) -#define IDirectPlay3_GetCaps(p,a,b) (p)->GetCaps(a,b) -#define IDirectPlay3_GetMessageCount(p,a,b) (p)->GetMessageCount(a,b) -#define IDirectPlay3_GetGroupData(p,a,b,c,d) (p)->GetGroupData(a,b,c,d) -#define IDirectPlay3_GetGroupName(p,a,b,c) (p)->GetGroupName(a,b,c) -#define IDirectPlay3_GetPlayerAddress(p,a,b,c) (p)->GetPlayerAddress(a,b,c) -#define IDirectPlay3_GetPlayerCaps(p,a,b,c) (p)->GetPlayerCaps(a,b,c) -#define IDirectPlay3_GetPlayerData(p,a,b,c,d) (p)->GetPlayerData(a,b,c,d) -#define IDirectPlay3_GetPlayerName(p,a,b,c) (p)->GetPlayerName(a,b,c) -#define IDirectPlay3_GetSessionDesc(p,a,b) (p)->GetSessionDesc(a,b) -#define IDirectPlay3_Initialize(p,a) (p)->Initialize(a) -#define IDirectPlay3_Open(p,a,b) (p)->Open(a,b) -#define IDirectPlay3_Receive(p,a,b,c,d,e) (p)->Receive(a,b,c,d,e) -#define IDirectPlay3_Send(p,a,b,c,d,e) (p)->Send(a,b,c,d,e) -#define IDirectPlay3_SetGroupData(p,a,b,c,d) (p)->SetGroupData(a,b,c,d) -#define IDirectPlay3_SetGroupName(p,a,b,c) (p)->SetGroupName(a,b,c) -#define IDirectPlay3_SetPlayerData(p,a,b,c,d) (p)->SetPlayerData(a,b,c,d) -#define IDirectPlay3_SetPlayerName(p,a,b,c) (p)->SetPlayerName(a,b,c) -#define IDirectPlay3_SetSessionDesc(p,a,b) (p)->SetSessionDesc(a,b) -#define IDirectPlay3_AddGroupToGroup(p,a,b) (p)->AddGroupToGroup(a,b) -#define IDirectPlay3_CreateGroupInGroup(p,a,b,c,d,e,f) (p)->CreateGroupInGroup(a,b,c,d,e,f) -#define IDirectPlay3_DeleteGroupFromGroup(p,a,b) (p)->DeleteGroupFromGroup(a,b) -#define IDirectPlay3_EnumConnections(p,a,b,c,d) (p)->EnumConnections(a,b,c,d) -#define IDirectPlay3_EnumGroupsInGroup(p,a,b,c,d,e) (p)->EnumGroupsInGroup(a,b,c,d,e) -#define IDirectPlay3_GetGroupConnectionSettings(p,a,b,c,d) (p)->GetGroupConnectionSettings(a,b,c,d) -#define IDirectPlay3_InitializeConnection(p,a,b) (p)->InitializeConnection(a,b) -#define IDirectPlay3_SecureOpen(p,a,b,c,d) (p)->SecureOpen(a,b,c,d) -#define IDirectPlay3_SendChatMessage(p,a,b,c,d) (p)->SendChatMessage(a,b,c,d) -#define IDirectPlay3_SetGroupConnectionSettings(p,a,b,c) (p)->SetGroupConnectionSettings(a,b,c) -#define IDirectPlay3_StartSession(p,a,b) (p)->StartSession(a,b) -#define IDirectPlay3_GetGroupFlags(p,a,b) (p)->GetGroupFlags(a,b) -#define IDirectPlay3_GetGroupParent(p,a,b) (p)->GetGroupParent(a,b) -#define IDirectPlay3_GetPlayerAccount(p,a,b,c,d) (p)->GetPlayerAccount(a,b,c,d) -#define IDirectPlay3_GetPlayerFlags(p,a,b) (p)->GetPlayerFlags(a,b) - -#endif - -/**************************************************************************** - * - * IDirectPlay4 (and IDirectPlay4A) Interface - * - ****************************************************************************/ - -#undef INTERFACE -#define INTERFACE IDirectPlay4 -DECLARE_INTERFACE_( IDirectPlay4, IDirectPlay3 ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectPlay2 methods ***/ - STDMETHOD(AddPlayerToGroup) (THIS_ DPID, DPID) PURE; - STDMETHOD(Close) (THIS) PURE; - STDMETHOD(CreateGroup) (THIS_ LPDPID,LPDPNAME,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(CreatePlayer) (THIS_ LPDPID,LPDPNAME,HANDLE,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(DeletePlayerFromGroup)(THIS_ DPID,DPID) PURE; - STDMETHOD(DestroyGroup) (THIS_ DPID) PURE; - STDMETHOD(DestroyPlayer) (THIS_ DPID) PURE; - STDMETHOD(EnumGroupPlayers) (THIS_ DPID,LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE; - STDMETHOD(EnumGroups) (THIS_ LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE; - STDMETHOD(EnumPlayers) (THIS_ LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE; - STDMETHOD(EnumSessions) (THIS_ LPDPSESSIONDESC2,DWORD,LPDPENUMSESSIONSCALLBACK2,LPVOID,DWORD) PURE; - STDMETHOD(GetCaps) (THIS_ LPDPCAPS,DWORD) PURE; - STDMETHOD(GetGroupData) (THIS_ DPID,LPVOID,LPDWORD,DWORD) PURE; - STDMETHOD(GetGroupName) (THIS_ DPID,LPVOID,LPDWORD) PURE; - STDMETHOD(GetMessageCount) (THIS_ DPID, LPDWORD) PURE; - STDMETHOD(GetPlayerAddress) (THIS_ DPID,LPVOID,LPDWORD) PURE; - STDMETHOD(GetPlayerCaps) (THIS_ DPID,LPDPCAPS,DWORD) PURE; - STDMETHOD(GetPlayerData) (THIS_ DPID,LPVOID,LPDWORD,DWORD) PURE; - STDMETHOD(GetPlayerName) (THIS_ DPID,LPVOID,LPDWORD) PURE; - STDMETHOD(GetSessionDesc) (THIS_ LPVOID,LPDWORD) PURE; - STDMETHOD(Initialize) (THIS_ LPGUID) PURE; - STDMETHOD(Open) (THIS_ LPDPSESSIONDESC2,DWORD) PURE; - STDMETHOD(Receive) (THIS_ LPDPID,LPDPID,DWORD,LPVOID,LPDWORD) PURE; - STDMETHOD(Send) (THIS_ DPID, DPID, DWORD, LPVOID, DWORD) PURE; - STDMETHOD(SetGroupData) (THIS_ DPID,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(SetGroupName) (THIS_ DPID,LPDPNAME,DWORD) PURE; - STDMETHOD(SetPlayerData) (THIS_ DPID,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(SetPlayerName) (THIS_ DPID,LPDPNAME,DWORD) PURE; - STDMETHOD(SetSessionDesc) (THIS_ LPDPSESSIONDESC2,DWORD) PURE; - /*** IDirectPlay3 methods ***/ - STDMETHOD(AddGroupToGroup) (THIS_ DPID, DPID) PURE; - STDMETHOD(CreateGroupInGroup) (THIS_ DPID,LPDPID,LPDPNAME,LPVOID,DWORD,DWORD) PURE; - STDMETHOD(DeleteGroupFromGroup) (THIS_ DPID,DPID) PURE; - STDMETHOD(EnumConnections) (THIS_ LPCGUID,LPDPENUMCONNECTIONSCALLBACK,LPVOID,DWORD) PURE; - STDMETHOD(EnumGroupsInGroup) (THIS_ DPID,LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE; - STDMETHOD(GetGroupConnectionSettings)(THIS_ DWORD, DPID, LPVOID, LPDWORD) PURE; - STDMETHOD(InitializeConnection) (THIS_ LPVOID,DWORD) PURE; - STDMETHOD(SecureOpen) (THIS_ LPCDPSESSIONDESC2,DWORD,LPCDPSECURITYDESC,LPCDPCREDENTIALS) PURE; - STDMETHOD(SendChatMessage) (THIS_ DPID,DPID,DWORD,LPDPCHAT) PURE; - STDMETHOD(SetGroupConnectionSettings)(THIS_ DWORD,DPID,LPDPLCONNECTION) PURE; - STDMETHOD(StartSession) (THIS_ DWORD,DPID) PURE; - STDMETHOD(GetGroupFlags) (THIS_ DPID,LPDWORD) PURE; - STDMETHOD(GetGroupParent) (THIS_ DPID,LPDPID) PURE; - STDMETHOD(GetPlayerAccount) (THIS_ DPID, DWORD, LPVOID, LPDWORD) PURE; - STDMETHOD(GetPlayerFlags) (THIS_ DPID,LPDWORD) PURE; - /*** IDirectPlay4 methods ***/ - STDMETHOD(GetGroupOwner) (THIS_ DPID, LPDPID) PURE; - STDMETHOD(SetGroupOwner) (THIS_ DPID, DPID) PURE; - STDMETHOD(SendEx) (THIS_ DPID, DPID, DWORD, LPVOID, DWORD, DWORD, DWORD, LPVOID, DWORD_PTR *) PURE; - STDMETHOD(GetMessageQueue) (THIS_ DPID, DPID, DWORD, LPDWORD, LPDWORD) PURE; - STDMETHOD(CancelMessage) (THIS_ DWORD, DWORD) PURE; - STDMETHOD(CancelPriority) (THIS_ DWORD, DWORD, DWORD) PURE; -}; - -/**************************************************************************** - * - * IDirectPlayX interface macros (for IDirectPlay4 and beyond) - * - ****************************************************************************/ - -#if !defined(__cplusplus) || defined(CINTERFACE) - -#define IDirectPlayX_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectPlayX_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectPlayX_Release(p) (p)->lpVtbl->Release(p) -#define IDirectPlayX_AddPlayerToGroup(p,a,b) (p)->lpVtbl->AddPlayerToGroup(p,a,b) -#define IDirectPlayX_CancelMessage(p,a,b) (p)->lpVtbl->CancelMessage(p,a,b) -#define IDirectPlayX_CancelPriority(p,a,b,c) (p)->lpVtbl->CancelPriority(p,a,b,c) -#define IDirectPlayX_Close(p) (p)->lpVtbl->Close(p) -#define IDirectPlayX_CreateGroup(p,a,b,c,d,e) (p)->lpVtbl->CreateGroup(p,a,b,c,d,e) -#define IDirectPlayX_CreatePlayer(p,a,b,c,d,e,f) (p)->lpVtbl->CreatePlayer(p,a,b,c,d,e,f) -#define IDirectPlayX_DeletePlayerFromGroup(p,a,b) (p)->lpVtbl->DeletePlayerFromGroup(p,a,b) -#define IDirectPlayX_DestroyGroup(p,a) (p)->lpVtbl->DestroyGroup(p,a) -#define IDirectPlayX_DestroyPlayer(p,a) (p)->lpVtbl->DestroyPlayer(p,a) -#define IDirectPlayX_EnumGroupPlayers(p,a,b,c,d,e) (p)->lpVtbl->EnumGroupPlayers(p,a,b,c,d,e) -#define IDirectPlayX_EnumGroups(p,a,b,c,d) (p)->lpVtbl->EnumGroups(p,a,b,c,d) -#define IDirectPlayX_EnumPlayers(p,a,b,c,d) (p)->lpVtbl->EnumPlayers(p,a,b,c,d) -#define IDirectPlayX_EnumSessions(p,a,b,c,d,e) (p)->lpVtbl->EnumSessions(p,a,b,c,d,e) -#define IDirectPlayX_GetCaps(p,a,b) (p)->lpVtbl->GetCaps(p,a,b) -#define IDirectPlayX_GetMessageCount(p,a,b) (p)->lpVtbl->GetMessageCount(p,a,b) -#define IDirectPlayX_GetMessageQueue(p,a,b,c,d,e) (p)->lpVtbl->GetMessageQueue(p,a,b,c,d,e) -#define IDirectPlayX_GetGroupData(p,a,b,c,d) (p)->lpVtbl->GetGroupData(p,a,b,c,d) -#define IDirectPlayX_GetGroupName(p,a,b,c) (p)->lpVtbl->GetGroupName(p,a,b,c) -#define IDirectPlayX_GetPlayerAddress(p,a,b,c) (p)->lpVtbl->GetPlayerAddress(p,a,b,c) -#define IDirectPlayX_GetPlayerCaps(p,a,b,c) (p)->lpVtbl->GetPlayerCaps(p,a,b,c) -#define IDirectPlayX_GetPlayerData(p,a,b,c,d) (p)->lpVtbl->GetPlayerData(p,a,b,c,d) -#define IDirectPlayX_GetPlayerName(p,a,b,c) (p)->lpVtbl->GetPlayerName(p,a,b,c) -#define IDirectPlayX_GetSessionDesc(p,a,b) (p)->lpVtbl->GetSessionDesc(p,a,b) -#define IDirectPlayX_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) -#define IDirectPlayX_Open(p,a,b) (p)->lpVtbl->Open(p,a,b) -#define IDirectPlayX_Receive(p,a,b,c,d,e) (p)->lpVtbl->Receive(p,a,b,c,d,e) -#define IDirectPlayX_Send(p,a,b,c,d,e) (p)->lpVtbl->Send(p,a,b,c,d,e) -#define IDirectPlayX_SendEx(p,a,b,c,d,e,f,g,h,i) (p)->lpVtbl->SendEx(p,a,b,c,d,e,f,g,h,i) -#define IDirectPlayX_SetGroupData(p,a,b,c,d) (p)->lpVtbl->SetGroupData(p,a,b,c,d) -#define IDirectPlayX_SetGroupName(p,a,b,c) (p)->lpVtbl->SetGroupName(p,a,b,c) -#define IDirectPlayX_SetPlayerData(p,a,b,c,d) (p)->lpVtbl->SetPlayerData(p,a,b,c,d) -#define IDirectPlayX_SetPlayerName(p,a,b,c) (p)->lpVtbl->SetPlayerName(p,a,b,c) -#define IDirectPlayX_SetSessionDesc(p,a,b) (p)->lpVtbl->SetSessionDesc(p,a,b) -#define IDirectPlayX_AddGroupToGroup(p,a,b) (p)->lpVtbl->AddGroupToGroup(p,a,b) -#define IDirectPlayX_CreateGroupInGroup(p,a,b,c,d,e,f) (p)->lpVtbl->CreateGroupInGroup(p,a,b,c,d,e,f) -#define IDirectPlayX_DeleteGroupFromGroup(p,a,b) (p)->lpVtbl->DeleteGroupFromGroup(p,a,b) -#define IDirectPlayX_EnumConnections(p,a,b,c,d) (p)->lpVtbl->EnumConnections(p,a,b,c,d) -#define IDirectPlayX_EnumGroupsInGroup(p,a,b,c,d,e) (p)->lpVtbl->EnumGroupsInGroup(p,a,b,c,d,e) -#define IDirectPlayX_GetGroupConnectionSettings(p,a,b,c,d) (p)->lpVtbl->GetGroupConnectionSettings(p,a,b,c,d) -#define IDirectPlayX_InitializeConnection(p,a,b) (p)->lpVtbl->InitializeConnection(p,a,b) -#define IDirectPlayX_SecureOpen(p,a,b,c,d) (p)->lpVtbl->SecureOpen(p,a,b,c,d) -#define IDirectPlayX_SendChatMessage(p,a,b,c,d) (p)->lpVtbl->SendChatMessage(p,a,b,c,d) -#define IDirectPlayX_SetGroupConnectionSettings(p,a,b,c) (p)->lpVtbl->SetGroupConnectionSettings(p,a,b,c) -#define IDirectPlayX_StartSession(p,a,b) (p)->lpVtbl->StartSession(p,a,b) -#define IDirectPlayX_GetGroupFlags(p,a,b) (p)->lpVtbl->GetGroupFlags(p,a,b) -#define IDirectPlayX_GetGroupParent(p,a,b) (p)->lpVtbl->GetGroupParent(p,a,b) -#define IDirectPlayX_GetPlayerAccount(p,a,b,c,d) (p)->lpVtbl->GetPlayerAccount(p,a,b,c,d) -#define IDirectPlayX_GetPlayerFlags(p,a,b) (p)->lpVtbl->GetPlayerFlags(p,a,b) -#define IDirectPlayX_GetGroupOwner(p,a,b) (p)->lpVtbl->GetGroupOwner(p,a,b) -#define IDirectPlayX_SetGroupOwner(p,a,b) (p)->lpVtbl->SetGroupOwner(p,a,b) - -#else /* C++ */ - -#define IDirectPlayX_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectPlayX_AddRef(p) (p)->AddRef() -#define IDirectPlayX_Release(p) (p)->Release() -#define IDirectPlayX_AddPlayerToGroup(p,a,b) (p)->AddPlayerToGroup(a,b) -#define IDirectPlayX_CancelMessage(p,a,b) (p)->CancelMessage(a,b) -#define IDirectPlayX_CancelPriority(p,a,b,c) (p)->CancelPriority(a,b,c) -#define IDirectPlayX_Close(p) (p)->Close() -#define IDirectPlayX_CreateGroup(p,a,b,c,d,e) (p)->CreateGroup(a,b,c,d,e) -#define IDirectPlayX_CreatePlayer(p,a,b,c,d,e,f) (p)->CreatePlayer(a,b,c,d,e,f) -#define IDirectPlayX_DeletePlayerFromGroup(p,a,b) (p)->DeletePlayerFromGroup(a,b) -#define IDirectPlayX_DestroyGroup(p,a) (p)->DestroyGroup(a) -#define IDirectPlayX_DestroyPlayer(p,a) (p)->DestroyPlayer(a) -#define IDirectPlayX_EnumGroupPlayers(p,a,b,c,d,e) (p)->EnumGroupPlayers(a,b,c,d,e) -#define IDirectPlayX_EnumGroups(p,a,b,c,d) (p)->EnumGroups(a,b,c,d) -#define IDirectPlayX_EnumPlayers(p,a,b,c,d) (p)->EnumPlayers(a,b,c,d) -#define IDirectPlayX_EnumSessions(p,a,b,c,d,e) (p)->EnumSessions(a,b,c,d,e) -#define IDirectPlayX_GetCaps(p,a,b) (p)->GetCaps(a,b) -#define IDirectPlayX_GetMessageCount(p,a,b) (p)->GetMessageCount(a,b) -#define IDirectPlayX_GetMessageQueue(p,a,b,c,d,e) (p)->GetMessageQueue(a,b,c,d,e) -#define IDirectPlayX_GetGroupData(p,a,b,c,d) (p)->GetGroupData(a,b,c,d) -#define IDirectPlayX_GetGroupName(p,a,b,c) (p)->GetGroupName(a,b,c) -#define IDirectPlayX_GetPlayerAddress(p,a,b,c) (p)->GetPlayerAddress(a,b,c) -#define IDirectPlayX_GetPlayerCaps(p,a,b,c) (p)->GetPlayerCaps(a,b,c) -#define IDirectPlayX_GetPlayerData(p,a,b,c,d) (p)->GetPlayerData(a,b,c,d) -#define IDirectPlayX_GetPlayerName(p,a,b,c) (p)->GetPlayerName(a,b,c) -#define IDirectPlayX_GetSessionDesc(p,a,b) (p)->GetSessionDesc(a,b) -#define IDirectPlayX_Initialize(p,a) (p)->Initialize(a) -#define IDirectPlayX_Open(p,a,b) (p)->Open(a,b) -#define IDirectPlayX_Receive(p,a,b,c,d,e) (p)->Receive(a,b,c,d,e) -#define IDirectPlayX_Send(p,a,b,c,d,e) (p)->Send(a,b,c,d,e) -#define IDirectPlayX_SendEx(p,a,b,c,d,e,f,g,h,i) (p)->SendEx(a,b,c,d,e,f,g,h,i) -#define IDirectPlayX_SetGroupData(p,a,b,c,d) (p)->SetGroupData(a,b,c,d) -#define IDirectPlayX_SetGroupName(p,a,b,c) (p)->SetGroupName(a,b,c) -#define IDirectPlayX_SetPlayerData(p,a,b,c,d) (p)->SetPlayerData(a,b,c,d) -#define IDirectPlayX_SetPlayerName(p,a,b,c) (p)->SetPlayerName(a,b,c) -#define IDirectPlayX_SetSessionDesc(p,a,b) (p)->SetSessionDesc(a,b) -#define IDirectPlayX_AddGroupToGroup(p,a,b) (p)->AddGroupToGroup(a,b) -#define IDirectPlayX_CreateGroupInGroup(p,a,b,c,d,e,f) (p)->CreateGroupInGroup(a,b,c,d,e,f) -#define IDirectPlayX_DeleteGroupFromGroup(p,a,b) (p)->DeleteGroupFromGroup(a,b) -#define IDirectPlayX_EnumConnections(p,a,b,c,d) (p)->EnumConnections(a,b,c,d) -#define IDirectPlayX_EnumGroupsInGroup(p,a,b,c,d,e) (p)->EnumGroupsInGroup(a,b,c,d,e) -#define IDirectPlayX_GetGroupConnectionSettings(p,a,b,c,d) (p)->GetGroupConnectionSettings(a,b,c,d) -#define IDirectPlayX_InitializeConnection(p,a,b) (p)->InitializeConnection(a,b) -#define IDirectPlayX_SecureOpen(p,a,b,c,d) (p)->SecureOpen(a,b,c,d) -#define IDirectPlayX_SendChatMessage(p,a,b,c,d) (p)->SendChatMessage(a,b,c,d) -#define IDirectPlayX_SetGroupConnectionSettings(p,a,b,c) (p)->SetGroupConnectionSettings(a,b,c) -#define IDirectPlayX_StartSession(p,a,b) (p)->StartSession(a,b) -#define IDirectPlayX_GetGroupFlags(p,a,b) (p)->GetGroupFlags(a,b) -#define IDirectPlayX_GetGroupParent(p,a,b) (p)->GetGroupParent(a,b) -#define IDirectPlayX_GetPlayerAccount(p,a,b,c,d) (p)->GetPlayerAccount(a,b,c,d) -#define IDirectPlayX_GetPlayerFlags(p,a,b) (p)->GetPlayerFlags(a,b) -#define IDirectPlayX_GetGroupOwner(p,a,b) (p)->GetGroupOwner(a,b) -#define IDirectPlayX_SetGroupOwner(p,a,b) (p)->SetGroupOwner(a,b) - -#endif - -/**************************************************************************** - * - * EnumConnections API flags - * - ****************************************************************************/ - -/* - * Enumerate Service Providers - */ -#define DPCONNECTION_DIRECTPLAY 0x00000001 - -/* - * Enumerate Lobby Providers - */ -#define DPCONNECTION_DIRECTPLAYLOBBY 0x00000002 - - -/**************************************************************************** - * - * EnumPlayers API flags - * - ****************************************************************************/ - -/* - * Enumerate all players in the current session - */ -#define DPENUMPLAYERS_ALL 0x00000000 -#define DPENUMGROUPS_ALL DPENUMPLAYERS_ALL - - -/* - * Enumerate only local (created by this application) players - * or groups - */ -#define DPENUMPLAYERS_LOCAL 0x00000008 -#define DPENUMGROUPS_LOCAL DPENUMPLAYERS_LOCAL - -/* - * Enumerate only remote (non-local) players - * or groups - */ -#define DPENUMPLAYERS_REMOTE 0x00000010 -#define DPENUMGROUPS_REMOTE DPENUMPLAYERS_REMOTE - -/* - * Enumerate groups along with the players - */ -#define DPENUMPLAYERS_GROUP 0x00000020 - -/* - * Enumerate players or groups in another session - * (must supply lpguidInstance) - */ -#define DPENUMPLAYERS_SESSION 0x00000080 -#define DPENUMGROUPS_SESSION DPENUMPLAYERS_SESSION - -/* - * Enumerate server players - */ -#define DPENUMPLAYERS_SERVERPLAYER 0x00000100 - -/* - * Enumerate spectator players - */ -#define DPENUMPLAYERS_SPECTATOR 0x00000200 - -/* - * Enumerate shortcut groups - */ -#define DPENUMGROUPS_SHORTCUT 0x00000400 - -/* - * Enumerate staging area groups - */ -#define DPENUMGROUPS_STAGINGAREA 0x00000800 - -/* - * Enumerate hidden groups - */ -#define DPENUMGROUPS_HIDDEN 0x00001000 - -/* - * Enumerate the group's owner - */ -#define DPENUMPLAYERS_OWNER 0x00002000 - - -/**************************************************************************** - * - * CreatePlayer API flags - * - ****************************************************************************/ - -/* - * This flag indicates that this player should be designated - * the server player. The app should specify this at CreatePlayer. - */ -#define DPPLAYER_SERVERPLAYER DPENUMPLAYERS_SERVERPLAYER - -/* - * This flag indicates that this player should be designated - * a spectator. The app should specify this at CreatePlayer. - */ -#define DPPLAYER_SPECTATOR DPENUMPLAYERS_SPECTATOR - -/* - * This flag indicates that this player was created locally. - * (returned from GetPlayerFlags) - */ -#define DPPLAYER_LOCAL DPENUMPLAYERS_LOCAL - -/* - * This flag indicates that this player is the group's owner - * (Only returned in EnumGroupPlayers) - */ -#define DPPLAYER_OWNER DPENUMPLAYERS_OWNER - -/**************************************************************************** - * - * CreateGroup API flags - * - ****************************************************************************/ - - -/* - * This flag indicates that the StartSession can be called on the group. - * The app should specify this at CreateGroup, or CreateGroupInGroup. - */ -#define DPGROUP_STAGINGAREA DPENUMGROUPS_STAGINGAREA - -/* - * This flag indicates that this group was created locally. - * (returned from GetGroupFlags) - */ -#define DPGROUP_LOCAL DPENUMGROUPS_LOCAL - -/* - * This flag indicates that this group was created hidden. - */ -#define DPGROUP_HIDDEN DPENUMGROUPS_HIDDEN - - -/**************************************************************************** - * - * EnumSessions API flags - * - ****************************************************************************/ - -/* - * Enumerate sessions which can be joined - */ -#define DPENUMSESSIONS_AVAILABLE 0x00000001 - -/* - * Enumerate all sessions even if they can't be joined. - */ -#define DPENUMSESSIONS_ALL 0x00000002 - - -/* - * Start an asynchronous enum sessions - */ - #define DPENUMSESSIONS_ASYNC 0x00000010 - -/* - * Stop an asynchronous enum sessions - */ - #define DPENUMSESSIONS_STOPASYNC 0x00000020 - -/* - * Enumerate sessions even if they require a password - */ - #define DPENUMSESSIONS_PASSWORDREQUIRED 0x00000040 - -/* - * Return status about progress of enumeration instead of - * showing any status dialogs. - */ - #define DPENUMSESSIONS_RETURNSTATUS 0x00000080 - -/**************************************************************************** - * - * GetCaps and GetPlayerCaps API flags - * - ****************************************************************************/ - -/* - * The latency returned should be for guaranteed message sending. - * Default is non-guaranteed messaging. - */ -#define DPGETCAPS_GUARANTEED 0x00000001 - - -/**************************************************************************** - * - * GetGroupData, GetPlayerData API flags - * Remote and local Group/Player data is maintained separately. - * Default is DPGET_REMOTE. - * - ****************************************************************************/ - -/* - * Get the remote data (set by any DirectPlay object in - * the session using DPSET_REMOTE) - */ -#define DPGET_REMOTE 0x00000000 - -/* - * Get the local data (set by this DirectPlay object - * using DPSET_LOCAL) - */ -#define DPGET_LOCAL 0x00000001 - - -/**************************************************************************** - * - * Open API flags - * - ****************************************************************************/ - -/* - * Join the session that is described by the DPSESSIONDESC2 structure - */ -#define DPOPEN_JOIN 0x00000001 - -/* - * Create a new session as described by the DPSESSIONDESC2 structure - */ -#define DPOPEN_CREATE 0x00000002 - -/* - * Return status about progress of open instead of showing - * any status dialogs. - */ - #define DPOPEN_RETURNSTATUS DPENUMSESSIONS_RETURNSTATUS - - -/**************************************************************************** - * - * DPLCONNECTION flags - * - ****************************************************************************/ - -/* - * This application should create a new session as - * described by the DPSESIONDESC structure - */ -#define DPLCONNECTION_CREATESESSION DPOPEN_CREATE - -/* - * This application should join the session described by - * the DPSESIONDESC structure with the lpAddress data - */ -#define DPLCONNECTION_JOINSESSION DPOPEN_JOIN - -/**************************************************************************** - * - * Receive API flags - * Default is DPRECEIVE_ALL - * - ****************************************************************************/ - -/* - * Get the first message in the queue - */ -#define DPRECEIVE_ALL 0x00000001 - -/* - * Get the first message in the queue directed to a specific player - */ -#define DPRECEIVE_TOPLAYER 0x00000002 - -/* - * Get the first message in the queue from a specific player - */ -#define DPRECEIVE_FROMPLAYER 0x00000004 - -/* - * Get the message but don't remove it from the queue - */ -#define DPRECEIVE_PEEK 0x00000008 - - -/**************************************************************************** - * - * Send API flags - * - ****************************************************************************/ - -/* - * Send the message using a guaranteed send method. - * Default is non-guaranteed. - */ -#define DPSEND_GUARANTEED 0x00000001 - - -/* - * This flag is obsolete. It is ignored by DirectPlay - */ -#define DPSEND_HIGHPRIORITY 0x00000002 - -/* - * This flag is obsolete. It is ignored by DirectPlay - */ -#define DPSEND_OPENSTREAM 0x00000008 - -/* - * This flag is obsolete. It is ignored by DirectPlay - */ -#define DPSEND_CLOSESTREAM 0x00000010 - -/* - * Send the message digitally signed to ensure authenticity. - */ -#define DPSEND_SIGNED 0x00000020 - -/* - * Send the message with encryption to ensure privacy. - */ -#define DPSEND_ENCRYPTED 0x00000040 - -/* - * The message is a lobby system message - */ -#define DPSEND_LOBBYSYSTEMMESSAGE 0x00000080 - - -/* - * Send message asynchronously, must check caps - * before using this flag. It is always provided - * if the protocol flag is set. - */ -#define DPSEND_ASYNC 0x00000200 - -/* - * When an message is completed, don't tell me. - * by default the application is notified with a system message. - */ -#define DPSEND_NOSENDCOMPLETEMSG 0x00000400 - - -/* - * Maximum priority for sends available to applications - */ -#define DPSEND_MAX_PRI 0x0000FFFF -#define DPSEND_MAX_PRIORITY DPSEND_MAX_PRI - - -/**************************************************************************** - * - * SetGroupData, SetGroupName, SetPlayerData, SetPlayerName, - * SetSessionDesc API flags. - * Default is DPSET_REMOTE. - * - ****************************************************************************/ - -/* - * Propagate the data to all players in the session - */ -#define DPSET_REMOTE 0x00000000 - -/* - * Do not propagate the data to other players - */ -#define DPSET_LOCAL 0x00000001 - -/* - * Used with DPSET_REMOTE, use guaranteed message send to - * propagate the data - */ -#define DPSET_GUARANTEED 0x00000002 - -/**************************************************************************** - * - * GetMessageQueue API flags. - * Default is DPMESSAGEQUEUE_SEND - * - ****************************************************************************/ - -/* - * Get Send Queue - requires Service Provider Support - */ -#define DPMESSAGEQUEUE_SEND 0x00000001 - -/* - * Get Receive Queue - */ -#define DPMESSAGEQUEUE_RECEIVE 0x00000002 - - -/**************************************************************************** - * - * Connect API flags - * - ****************************************************************************/ - - -/* - * Start an asynchronous connect which returns status codes - */ -#define DPCONNECT_RETURNSTATUS (DPENUMSESSIONS_RETURNSTATUS) - - -/**************************************************************************** - * - * DirectPlay system messages and message data structures - * - * All system message come 'From' player DPID_SYSMSG. To determine what type - * of message it is, cast the lpData from Receive to DPMSG_GENERIC and check - * the dwType member against one of the following DPSYS_xxx constants. Once - * a match is found, cast the lpData to the corresponding of the DPMSG_xxx - * structures to access the data of the message. - * - ****************************************************************************/ - -/* - * A new player or group has been created in the session - * Use DPMSG_CREATEPLAYERORGROUP. Check dwPlayerType to see if it - * is a player or a group. - */ -#define DPSYS_CREATEPLAYERORGROUP 0x0003 - -/* - * A player has been deleted from the session - * Use DPMSG_DESTROYPLAYERORGROUP - */ -#define DPSYS_DESTROYPLAYERORGROUP 0x0005 - -/* - * A player has been added to a group - * Use DPMSG_ADDPLAYERTOGROUP - */ -#define DPSYS_ADDPLAYERTOGROUP 0x0007 - -/* - * A player has been removed from a group - * Use DPMSG_DELETEPLAYERFROMGROUP - */ -#define DPSYS_DELETEPLAYERFROMGROUP 0x0021 - -/* - * This DirectPlay object lost its connection with all the - * other players in the session. - * Use DPMSG_SESSIONLOST. - */ -#define DPSYS_SESSIONLOST 0x0031 - -/* - * The current host has left the session. - * This DirectPlay object is now the host. - * Use DPMSG_HOST. - */ -#define DPSYS_HOST 0x0101 - -/* - * The remote data associated with a player or - * group has changed. Check dwPlayerType to see - * if it is a player or a group - * Use DPMSG_SETPLAYERORGROUPDATA - */ -#define DPSYS_SETPLAYERORGROUPDATA 0x0102 - -/* - * The name of a player or group has changed. - * Check dwPlayerType to see if it is a player - * or a group. - * Use DPMSG_SETPLAYERORGROUPNAME - */ -#define DPSYS_SETPLAYERORGROUPNAME 0x0103 - -/* - * The session description has changed. - * Use DPMSG_SETSESSIONDESC - */ -#define DPSYS_SETSESSIONDESC 0x0104 - -/* - * A group has been added to a group - * Use DPMSG_ADDGROUPTOGROUP - */ -#define DPSYS_ADDGROUPTOGROUP 0x0105 - -/* - * A group has been removed from a group - * Use DPMSG_DELETEGROUPFROMGROUP - */ -#define DPSYS_DELETEGROUPFROMGROUP 0x0106 - -/* - * A secure player-player message has arrived. - * Use DPMSG_SECUREMESSAGE - */ -#define DPSYS_SECUREMESSAGE 0x0107 - -/* - * Start a new session. - * Use DPMSG_STARTSESSION - */ -#define DPSYS_STARTSESSION 0x0108 - -/* - * A chat message has arrived - * Use DPMSG_CHAT - */ -#define DPSYS_CHAT 0x0109 - -/* - * The owner of a group has changed - * Use DPMSG_SETGROUPOWNER - */ -#define DPSYS_SETGROUPOWNER 0x010A - -/* - * An async send has finished, failed or been cancelled - * Use DPMSG_SENDCOMPLETE - */ -#define DPSYS_SENDCOMPLETE 0x010d - - -/* - * Used in the dwPlayerType field to indicate if it applies to a group - * or a player - */ -#define DPPLAYERTYPE_GROUP 0x00000000 -#define DPPLAYERTYPE_PLAYER 0x00000001 - - -/* - * DPMSG_GENERIC - * Generic message structure used to identify the message type. - */ -typedef struct -{ - DWORD dwType; // Message type -} DPMSG_GENERIC, FAR *LPDPMSG_GENERIC; - -/* - * DPMSG_CREATEPLAYERORGROUP - * System message generated when a new player or group - * created in the session with information about it. - */ -typedef struct -{ - DWORD dwType; // Message type - DWORD dwPlayerType; // Is it a player or group - DPID dpId; // ID of the player or group - DWORD dwCurrentPlayers; // current # players & groups in session - LPVOID lpData; // pointer to remote data - DWORD dwDataSize; // size of remote data - DPNAME dpnName; // structure with name info - // the following fields are only available when using - // the IDirectPlay3 interface or greater - DPID dpIdParent; // id of parent group - DWORD dwFlags; // player or group flags -} DPMSG_CREATEPLAYERORGROUP, FAR *LPDPMSG_CREATEPLAYERORGROUP; - -/* - * DPMSG_DESTROYPLAYERORGROUP - * System message generated when a player or group is being - * destroyed in the session with information about it. - */ -typedef struct -{ - DWORD dwType; // Message type - DWORD dwPlayerType; // Is it a player or group - DPID dpId; // player ID being deleted - LPVOID lpLocalData; // copy of players local data - DWORD dwLocalDataSize; // sizeof local data - LPVOID lpRemoteData; // copy of players remote data - DWORD dwRemoteDataSize; // sizeof remote data - // the following fields are only available when using - // the IDirectPlay3 interface or greater - DPNAME dpnName; // structure with name info - DPID dpIdParent; // id of parent group - DWORD dwFlags; // player or group flags -} DPMSG_DESTROYPLAYERORGROUP, FAR *LPDPMSG_DESTROYPLAYERORGROUP; - -/* - * DPMSG_ADDPLAYERTOGROUP - * System message generated when a player is being added - * to a group. - */ -typedef struct -{ - DWORD dwType; // Message type - DPID dpIdGroup; // group ID being added to - DPID dpIdPlayer; // player ID being added -} DPMSG_ADDPLAYERTOGROUP, FAR *LPDPMSG_ADDPLAYERTOGROUP; - -/* - * DPMSG_DELETEPLAYERFROMGROUP - * System message generated when a player is being - * removed from a group - */ -typedef DPMSG_ADDPLAYERTOGROUP DPMSG_DELETEPLAYERFROMGROUP; -typedef DPMSG_DELETEPLAYERFROMGROUP FAR *LPDPMSG_DELETEPLAYERFROMGROUP; - -/* - * DPMSG_ADDGROUPTOGROUP - * System message generated when a group is being added - * to a group. - */ -typedef struct -{ - DWORD dwType; // Message type - DPID dpIdParentGroup; // group ID being added to - DPID dpIdGroup; // group ID being added -} DPMSG_ADDGROUPTOGROUP, FAR *LPDPMSG_ADDGROUPTOGROUP; - -/* - * DPMSG_DELETEGROUPFROMGROUP - * System message generated when a GROUP is being - * removed from a group - */ -typedef DPMSG_ADDGROUPTOGROUP DPMSG_DELETEGROUPFROMGROUP; -typedef DPMSG_DELETEGROUPFROMGROUP FAR *LPDPMSG_DELETEGROUPFROMGROUP; - -/* - * DPMSG_SETPLAYERORGROUPDATA - * System message generated when remote data for a player or - * group has changed. - */ -typedef struct -{ - DWORD dwType; // Message type - DWORD dwPlayerType; // Is it a player or group - DPID dpId; // ID of player or group - LPVOID lpData; // pointer to remote data - DWORD dwDataSize; // size of remote data -} DPMSG_SETPLAYERORGROUPDATA, FAR *LPDPMSG_SETPLAYERORGROUPDATA; - -/* - * DPMSG_SETPLAYERORGROUPNAME - * System message generated when the name of a player or - * group has changed. - */ -typedef struct -{ - DWORD dwType; // Message type - DWORD dwPlayerType; // Is it a player or group - DPID dpId; // ID of player or group - DPNAME dpnName; // structure with new name info -} DPMSG_SETPLAYERORGROUPNAME, FAR *LPDPMSG_SETPLAYERORGROUPNAME; - -/* - * DPMSG_SETSESSIONDESC - * System message generated when session desc has changed - */ -typedef struct -{ - DWORD dwType; // Message type - DPSESSIONDESC2 dpDesc; // Session desc -} DPMSG_SETSESSIONDESC, FAR *LPDPMSG_SETSESSIONDESC; - -/* - * DPMSG_HOST - * System message generated when the host has migrated to this - * DirectPlay object. - * - */ -typedef DPMSG_GENERIC DPMSG_HOST; -typedef DPMSG_HOST FAR *LPDPMSG_HOST; - -/* - * DPMSG_SESSIONLOST - * System message generated when the connection to the session is lost. - * - */ -typedef DPMSG_GENERIC DPMSG_SESSIONLOST; -typedef DPMSG_SESSIONLOST FAR *LPDPMSG_SESSIONLOST; - -/* - * DPMSG_SECUREMESSAGE - * System message generated when a player requests a secure send - */ -typedef struct -{ - DWORD dwType; // Message Type - DWORD dwFlags; // Signed/Encrypted - DPID dpIdFrom; // ID of Sending Player - LPVOID lpData; // Player message - DWORD dwDataSize; // Size of player message -} DPMSG_SECUREMESSAGE, FAR *LPDPMSG_SECUREMESSAGE; - -/* - * DPMSG_STARTSESSION - * System message containing all information required to - * start a new session - */ -typedef struct -{ - DWORD dwType; // Message type - LPDPLCONNECTION lpConn; // DPLCONNECTION structure -} DPMSG_STARTSESSION, FAR *LPDPMSG_STARTSESSION; - -/* - * DPMSG_CHAT - * System message containing a chat message - */ -typedef struct -{ - DWORD dwType; // Message type - DWORD dwFlags; // Message flags - DPID idFromPlayer; // ID of the Sending Player - DPID idToPlayer; // ID of the To Player - DPID idToGroup; // ID of the To Group - LPDPCHAT lpChat; // Pointer to a structure containing the chat message -} DPMSG_CHAT, FAR *LPDPMSG_CHAT; - -/* - * DPMSG_SETGROUPOWNER - * System message generated when the owner of a group has changed - */ -typedef struct -{ - DWORD dwType; // Message type - DPID idGroup; // ID of the group - DPID idNewOwner; // ID of the player that is the new owner - DPID idOldOwner; // ID of the player that used to be the owner -} DPMSG_SETGROUPOWNER, FAR *LPDPMSG_SETGROUPOWNER; - -/* - * DPMSG_SENDCOMPLETE - * System message generated when finished with an Async Send message - * - * NOTE SENDPARMS has an overlay for DPMSG_SENDCOMPLETE, don't - * change this message w/o changing SENDPARMS. - */ -typedef struct -{ - DWORD dwType; - DPID idFrom; - DPID idTo; - DWORD dwFlags; - DWORD dwPriority; - DWORD dwTimeout; - LPVOID lpvContext; - DWORD dwMsgID; - HRESULT hr; - DWORD dwSendTime; -} DPMSG_SENDCOMPLETE, *LPDPMSG_SENDCOMPLETE; - -/**************************************************************************** - * - * DIRECTPLAY ERRORS - * - * Errors are represented by negative values and cannot be combined. - * - ****************************************************************************/ -#define DP_OK S_OK -#define DPERR_ALREADYINITIALIZED MAKE_DPHRESULT( 5 ) -#define DPERR_ACCESSDENIED MAKE_DPHRESULT( 10 ) -#define DPERR_ACTIVEPLAYERS MAKE_DPHRESULT( 20 ) -#define DPERR_BUFFERTOOSMALL MAKE_DPHRESULT( 30 ) -#define DPERR_CANTADDPLAYER MAKE_DPHRESULT( 40 ) -#define DPERR_CANTCREATEGROUP MAKE_DPHRESULT( 50 ) -#define DPERR_CANTCREATEPLAYER MAKE_DPHRESULT( 60 ) -#define DPERR_CANTCREATESESSION MAKE_DPHRESULT( 70 ) -#define DPERR_CAPSNOTAVAILABLEYET MAKE_DPHRESULT( 80 ) -#define DPERR_EXCEPTION MAKE_DPHRESULT( 90 ) -#define DPERR_GENERIC E_FAIL -#define DPERR_INVALIDFLAGS MAKE_DPHRESULT( 120 ) -#define DPERR_INVALIDOBJECT MAKE_DPHRESULT( 130 ) -#define DPERR_INVALIDPARAM E_INVALIDARG -#define DPERR_INVALIDPARAMS DPERR_INVALIDPARAM -#define DPERR_INVALIDPLAYER MAKE_DPHRESULT( 150 ) -#define DPERR_INVALIDGROUP MAKE_DPHRESULT( 155 ) -#define DPERR_NOCAPS MAKE_DPHRESULT( 160 ) -#define DPERR_NOCONNECTION MAKE_DPHRESULT( 170 ) -#define DPERR_NOMEMORY E_OUTOFMEMORY -#define DPERR_OUTOFMEMORY DPERR_NOMEMORY -#define DPERR_NOMESSAGES MAKE_DPHRESULT( 190 ) -#define DPERR_NONAMESERVERFOUND MAKE_DPHRESULT( 200 ) -#define DPERR_NOPLAYERS MAKE_DPHRESULT( 210 ) -#define DPERR_NOSESSIONS MAKE_DPHRESULT( 220 ) -#define DPERR_PENDING E_PENDING -#define DPERR_SENDTOOBIG MAKE_DPHRESULT( 230 ) -#define DPERR_TIMEOUT MAKE_DPHRESULT( 240 ) -#define DPERR_UNAVAILABLE MAKE_DPHRESULT( 250 ) -#define DPERR_UNSUPPORTED E_NOTIMPL -#define DPERR_BUSY MAKE_DPHRESULT( 270 ) -#define DPERR_USERCANCEL MAKE_DPHRESULT( 280 ) -#define DPERR_NOINTERFACE E_NOINTERFACE -#define DPERR_CANNOTCREATESERVER MAKE_DPHRESULT( 290 ) -#define DPERR_PLAYERLOST MAKE_DPHRESULT( 300 ) -#define DPERR_SESSIONLOST MAKE_DPHRESULT( 310 ) -#define DPERR_UNINITIALIZED MAKE_DPHRESULT( 320 ) -#define DPERR_NONEWPLAYERS MAKE_DPHRESULT( 330 ) -#define DPERR_INVALIDPASSWORD MAKE_DPHRESULT( 340 ) -#define DPERR_CONNECTING MAKE_DPHRESULT( 350 ) -#define DPERR_CONNECTIONLOST MAKE_DPHRESULT( 360 ) -#define DPERR_UNKNOWNMESSAGE MAKE_DPHRESULT( 370 ) -#define DPERR_CANCELFAILED MAKE_DPHRESULT( 380 ) -#define DPERR_INVALIDPRIORITY MAKE_DPHRESULT( 390 ) -#define DPERR_NOTHANDLED MAKE_DPHRESULT( 400 ) -#define DPERR_CANCELLED MAKE_DPHRESULT( 410 ) -#define DPERR_ABORTED MAKE_DPHRESULT( 420 ) - - -#define DPERR_BUFFERTOOLARGE MAKE_DPHRESULT( 1000 ) -#define DPERR_CANTCREATEPROCESS MAKE_DPHRESULT( 1010 ) -#define DPERR_APPNOTSTARTED MAKE_DPHRESULT( 1020 ) -#define DPERR_INVALIDINTERFACE MAKE_DPHRESULT( 1030 ) -#define DPERR_NOSERVICEPROVIDER MAKE_DPHRESULT( 1040 ) -#define DPERR_UNKNOWNAPPLICATION MAKE_DPHRESULT( 1050 ) -#define DPERR_NOTLOBBIED MAKE_DPHRESULT( 1070 ) -#define DPERR_SERVICEPROVIDERLOADED MAKE_DPHRESULT( 1080 ) -#define DPERR_ALREADYREGISTERED MAKE_DPHRESULT( 1090 ) -#define DPERR_NOTREGISTERED MAKE_DPHRESULT( 1100 ) - -// -// Security related errors -// -#define DPERR_AUTHENTICATIONFAILED MAKE_DPHRESULT( 2000 ) -#define DPERR_CANTLOADSSPI MAKE_DPHRESULT( 2010 ) -#define DPERR_ENCRYPTIONFAILED MAKE_DPHRESULT( 2020 ) -#define DPERR_SIGNFAILED MAKE_DPHRESULT( 2030 ) -#define DPERR_CANTLOADSECURITYPACKAGE MAKE_DPHRESULT( 2040 ) -#define DPERR_ENCRYPTIONNOTSUPPORTED MAKE_DPHRESULT( 2050 ) -#define DPERR_CANTLOADCAPI MAKE_DPHRESULT( 2060 ) -#define DPERR_NOTLOGGEDIN MAKE_DPHRESULT( 2070 ) -#define DPERR_LOGONDENIED MAKE_DPHRESULT( 2080 ) - - -/**************************************************************************** - * - * dplay 1.0 obsolete structures + interfaces - * Included for compatibility only. New apps should - * use IDirectPlay2 - * - ****************************************************************************/ - -// define this to ignore obsolete interfaces and constants -#ifndef IDIRECTPLAY2_OR_GREATER - -#define DPOPEN_OPENSESSION DPOPEN_JOIN -#define DPOPEN_CREATESESSION DPOPEN_CREATE - -#define DPENUMSESSIONS_PREVIOUS 0x00000004 - -#define DPENUMPLAYERS_PREVIOUS 0x00000004 - -#define DPSEND_GUARANTEE DPSEND_GUARANTEED -#define DPSEND_TRYONCE 0x00000004 - -#define DPCAPS_NAMESERVICE 0x00000001 -#define DPCAPS_NAMESERVER DPCAPS_ISHOST -#define DPCAPS_GUARANTEED 0x00000004 - -#define DPLONGNAMELEN 52 -#define DPSHORTNAMELEN 20 -#define DPSESSIONNAMELEN 32 -#define DPPASSWORDLEN 16 -#define DPUSERRESERVED 16 - -#define DPSYS_ADDPLAYER 0x0003 -#define DPSYS_DELETEPLAYER 0x0005 - -#define DPSYS_DELETEGROUP 0x0020 -#define DPSYS_DELETEPLAYERFROMGRP 0x0021 -#define DPSYS_CONNECT 0x484b - -typedef struct -{ - DWORD dwType; - DWORD dwPlayerType; - DPID dpId; - char szLongName[DPLONGNAMELEN]; - char szShortName[DPSHORTNAMELEN]; - DWORD dwCurrentPlayers; -} DPMSG_ADDPLAYER; - -typedef DPMSG_ADDPLAYER DPMSG_ADDGROUP; - -typedef struct -{ - DWORD dwType; - DPID dpIdGroup; - DPID dpIdPlayer; -} DPMSG_GROUPADD; - -typedef DPMSG_GROUPADD DPMSG_GROUPDELETE; -typedef struct -{ - DWORD dwType; - DPID dpId; -} DPMSG_DELETEPLAYER; - -typedef BOOL (PASCAL *LPDPENUMPLAYERSCALLBACK)( - DPID dpId, - LPSTR lpFriendlyName, - LPSTR lpFormalName, - DWORD dwFlags, - LPVOID lpContext ); - -typedef struct -{ - DWORD dwSize; - GUID guidSession; - DWORD_PTR dwSession; - DWORD dwMaxPlayers; - DWORD dwCurrentPlayers; - DWORD dwFlags; - char szSessionName[DPSESSIONNAMELEN]; - char szUserField[DPUSERRESERVED]; - DWORD_PTR dwReserved1; - char szPassword[DPPASSWORDLEN]; - DWORD_PTR dwReserved2; - DWORD_PTR dwUser1; - DWORD_PTR dwUser2; - DWORD_PTR dwUser3; - DWORD_PTR dwUser4; -} DPSESSIONDESC,*LPDPSESSIONDESC; - -typedef BOOL (PASCAL * LPDPENUMSESSIONSCALLBACK)( - LPDPSESSIONDESC lpDPSessionDesc, - LPVOID lpContext, - LPDWORD lpdwTimeOut, - DWORD dwFlags); - -/* - * IDirectPlay - */ -#undef INTERFACE -#define INTERFACE IDirectPlay -DECLARE_INTERFACE_( IDirectPlay, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectPlay methods ***/ - STDMETHOD(AddPlayerToGroup) (THIS_ DPID, DPID) PURE; - STDMETHOD(Close) (THIS) PURE; - STDMETHOD(CreatePlayer) (THIS_ LPDPID,LPSTR,LPSTR,LPHANDLE) PURE; - STDMETHOD(CreateGroup) (THIS_ LPDPID,LPSTR,LPSTR) PURE; - STDMETHOD(DeletePlayerFromGroup)(THIS_ DPID,DPID) PURE; - STDMETHOD(DestroyPlayer) (THIS_ DPID) PURE; - STDMETHOD(DestroyGroup) (THIS_ DPID) PURE; - STDMETHOD(EnableNewPlayers) (THIS_ BOOL) PURE; - STDMETHOD(EnumGroupPlayers) (THIS_ DPID, LPDPENUMPLAYERSCALLBACK,LPVOID,DWORD) PURE; - STDMETHOD(EnumGroups) (THIS_ DWORD_PTR, LPDPENUMPLAYERSCALLBACK,LPVOID,DWORD) PURE; - STDMETHOD(EnumPlayers) (THIS_ DWORD_PTR, LPDPENUMPLAYERSCALLBACK,LPVOID,DWORD) PURE; - STDMETHOD(EnumSessions) (THIS_ LPDPSESSIONDESC,DWORD,LPDPENUMSESSIONSCALLBACK,LPVOID,DWORD) PURE; - STDMETHOD(GetCaps) (THIS_ LPDPCAPS) PURE; - STDMETHOD(GetMessageCount) (THIS_ DPID, LPDWORD) PURE; - STDMETHOD(GetPlayerCaps) (THIS_ DPID, LPDPCAPS) PURE; - STDMETHOD(GetPlayerName) (THIS_ DPID,LPSTR,LPDWORD,LPSTR,LPDWORD) PURE; - STDMETHOD(Initialize) (THIS_ LPGUID) PURE; - STDMETHOD(Open) (THIS_ LPDPSESSIONDESC) PURE; - STDMETHOD(Receive) (THIS_ LPDPID,LPDPID,DWORD,LPVOID,LPDWORD) PURE; - STDMETHOD(SaveSession) (THIS_ LPSTR) PURE; - STDMETHOD(Send) (THIS_ DPID, DPID, DWORD, LPVOID, DWORD) PURE; - STDMETHOD(SetPlayerName) (THIS_ DPID,LPSTR,LPSTR) PURE; -}; - -/**************************************************************************** - * - * IDirectPlay interface macros - * - ****************************************************************************/ - -#if !defined(__cplusplus) || defined(CINTERFACE) - -#define IDirectPlay_AddPlayerToGroup(p,a,b) (p)->lpVtbl->AddPlayerToGroup(p,a,b) -#define IDirectPlay_Close(p) (p)->lpVtbl->Close(p) -#define IDirectPlay_CreateGroup(p,a,b,c) (p)->lpVtbl->CreateGroup(p,a,b,c) -#define IDirectPlay_CreatePlayer(p,a,b,c,d) (p)->lpVtbl->CreatePlayer(p,a,b,c,d) -#define IDirectPlay_DeletePlayerFromGroup(p,a,b) (p)->lpVtbl->DeletePlayerFromGroup(p,a,b) -#define IDirectPlay_DestroyGroup(p,a) (p)->lpVtbl->DestroyGroup(p,a) -#define IDirectPlay_DestroyPlayer(p,a) (p)->lpVtbl->DestroyPlayer(p,a) -#define IDirectPlay_EnableNewPlayers(p,a) (p)->lpVtbl->EnableNewPlayers(p,a) -#define IDirectPlay_EnumGroupPlayers(p,a,b,c,d) (p)->lpVtbl->EnumGroupPlayers(p,a,b,c,d) -#define IDirectPlay_EnumGroups(p,a,b,c,d) (p)->lpVtbl->EnumGroups(p,a,b,c,d) -#define IDirectPlay_EnumPlayers(p,a,b,c,d) (p)->lpVtbl->EnumPlayers(p,a,b,c,d) -#define IDirectPlay_EnumSessions(p,a,b,c,d,e) (p)->lpVtbl->EnumSessions(p,a,b,c,d,e) -#define IDirectPlay_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) -#define IDirectPlay_GetMessageCount(p,a,b) (p)->lpVtbl->GetMessageCount(p,a,b) -#define IDirectPlay_GetPlayerCaps(p,a,b) (p)->lpVtbl->GetPlayerCaps(p,a,b) -#define IDirectPlay_GetPlayerName(p,a,b,c,d,e) (p)->lpVtbl->GetPlayerName(p,a,b,c,d,e) -#define IDirectPlay_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) -#define IDirectPlay_Open(p,a) (p)->lpVtbl->Open(p,a) -#define IDirectPlay_Receive(p,a,b,c,d,e) (p)->lpVtbl->Receive(p,a,b,c,d,e) -#define IDirectPlay_SaveSession(p,a) (p)->lpVtbl->SaveSession(p,a) -#define IDirectPlay_Send(p,a,b,c,d,e) (p)->lpVtbl->Send(p,a,b,c,d,e) -#define IDirectPlay_SetPlayerName(p,a,b,c) (p)->lpVtbl->SetPlayerName(p,a,b,c) - -#else /* C++ */ - -#define IDirectPlay_AddPlayerToGroup(p,a,b) (p)->AddPlayerToGroup(a,b) -#define IDirectPlay_Close(p) (p)->Close() -#define IDirectPlay_CreateGroup(p,a,b,c) (p)->CreateGroup(a,b,c) -#define IDirectPlay_CreatePlayer(p,a,b,c,d) (p)->CreatePlayer(a,b,c,d) -#define IDirectPlay_DeletePlayerFromGroup(p,a,b) (p)->DeletePlayerFromGroup(a,b) -#define IDirectPlay_DestroyGroup(p,a) (p)->DestroyGroup(a) -#define IDirectPlay_DestroyPlayer(p,a) (p)->DestroyPlayer(a) -#define IDirectPlay_EnableNewPlayers(p,a) (p)->EnableNewPlayers(a) -#define IDirectPlay_EnumGroupPlayers(p,a,b,c,d) (p)->EnumGroupPlayers(a,b,c,d) -#define IDirectPlay_EnumGroups(p,a,b,c,d) (p)->EnumGroups(a,b,c,d) -#define IDirectPlay_EnumPlayers(p,a,b,c,d) (p)->EnumPlayers(a,b,c,d) -#define IDirectPlay_EnumSessions(p,a,b,c,d,e) (p)->EnumSessions(a,b,c,d,e) -#define IDirectPlay_GetCaps(p,a) (p)->GetCaps(a) -#define IDirectPlay_GetMessageCount(p,a,b) (p)->GetMessageCount(a,b) -#define IDirectPlay_GetPlayerCaps(p,a,b) (p)->GetPlayerCaps(a,b) -#define IDirectPlay_GetPlayerName(p,a,b,c,d,e) (p)->GetPlayerName(a,b,c,d,e) -#define IDirectPlay_Initialize(p,a) (p)->Initialize(a) -#define IDirectPlay_Open(p,a) (p)->Open(a) -#define IDirectPlay_Receive(p,a,b,c,d,e) (p)->Receive(a,b,c,d,e) -#define IDirectPlay_SaveSession(p,a) (p)->SaveSession(a) -#define IDirectPlay_Send(p,a,b,c,d,e) (p)->Send(a,b,c,d,e) -#define IDirectPlay_SetPlayerName(p,a,b,c) (p)->SetPlayerName(a,b,c) - -#endif - -DEFINE_GUID(IID_IDirectPlay, 0x5454e9a0, 0xdb65, 0x11ce, 0x92, 0x1c, 0x00, 0xaa, 0x00, 0x6c, 0x49, 0x72); - -#endif // IDIRECTPLAY2_OR_GREATER - -/**************************************************************************** - * - * IDirectPlay macros (included regardless of IDIRECTPLAY2_OR_GREATER flag) - * - ****************************************************************************/ - -#if !defined(__cplusplus) || defined(CINTERFACE) - -#define IDirectPlay_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectPlay_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectPlay_Release(p) (p)->lpVtbl->Release(p) - -#else - -#define IDirectPlay_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectPlay_AddRef(p) (p)->AddRef() -#define IDirectPlay_Release(p) (p)->Release() - -#endif // IDirectPlay interface macros - -#ifdef __cplusplus -}; -#endif - -#pragma warning(default:4201) - -#endif - diff --git a/import/DirectX8/include/dplay8.h b/import/DirectX8/include/dplay8.h deleted file mode 100644 index 930fce906..000000000 --- a/import/DirectX8/include/dplay8.h +++ /dev/null @@ -1,1189 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) 1998-2000 Microsoft Corporation. All Rights Reserved. - * - * File: DPlay8.h - * Content: DirectPlay8 include file - * - ***************************************************************************/ - -#ifndef __DIRECTPLAY8_H__ -#define __DIRECTPLAY8_H__ - -#include // for DECLARE_INTERFACE and HRESULT - -#include "dpaddr.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/**************************************************************************** - * - * DirectPlay8 CLSIDs - * - ****************************************************************************/ - -// {743F1DC6-5ABA-429f-8BDF-C54D03253DC2} -DEFINE_GUID(CLSID_DirectPlay8Client, -0x743f1dc6, 0x5aba, 0x429f, 0x8b, 0xdf, 0xc5, 0x4d, 0x3, 0x25, 0x3d, 0xc2); - -// {286F484D-375E-4458-A272-B138E2F80A6A} -DEFINE_GUID(CLSID_DirectPlay8Peer, -0x286f484d, 0x375e, 0x4458, 0xa2, 0x72, 0xb1, 0x38, 0xe2, 0xf8, 0xa, 0x6a); - -// {DA825E1B-6830-43d7-835D-0B5AD82956A2} -DEFINE_GUID(CLSID_DirectPlay8Server, -0xda825e1b, 0x6830, 0x43d7, 0x83, 0x5d, 0xb, 0x5a, 0xd8, 0x29, 0x56, 0xa2); - - -/**************************************************************************** - * - * DirectPlay8 Interface IIDs - * - ****************************************************************************/ - -// {5102DACD-241B-11d3-AEA7-006097B01411} -DEFINE_GUID(IID_IDirectPlay8Client, -0x5102dacd, 0x241b, 0x11d3, 0xae, 0xa7, 0x0, 0x60, 0x97, 0xb0, 0x14, 0x11); - -// {5102DACF-241B-11d3-AEA7-006097B01411} -DEFINE_GUID(IID_IDirectPlay8Peer, -0x5102dacf, 0x241b, 0x11d3, 0xae, 0xa7, 0x0, 0x60, 0x97, 0xb0, 0x14, 0x11); - -// {5102DACE-241B-11d3-AEA7-006097B01411} -DEFINE_GUID(IID_IDirectPlay8Server, -0x5102dace, 0x241b, 0x11d3, 0xae, 0xa7, 0x0, 0x60, 0x97, 0xb0, 0x14, 0x11); - -/**************************************************************************** - * - * DirectPlay8 Service Provider GUIDs - * - ****************************************************************************/ - -// {53934290-628D-11D2-AE0F-006097B01411} -DEFINE_GUID(CLSID_DP8SP_IPX, 0x53934290, 0x628d, 0x11d2, 0xae, 0xf, 0x0, 0x60, 0x97, 0xb0, 0x14, 0x11); - -// {6D4A3650-628D-11D2-AE0F-006097B01411} -DEFINE_GUID(CLSID_DP8SP_MODEM, 0x6d4a3650, 0x628d, 0x11d2, 0xae, 0xf, 0x0, 0x60, 0x97, 0xb0, 0x14, 0x11); - -// {743B5D60-628D-11D2-AE0F-006097B01411} -DEFINE_GUID(CLSID_DP8SP_SERIAL, 0x743b5d60, 0x628d, 0x11d2, 0xae, 0xf, 0x0, 0x60, 0x97, 0xb0, 0x14, 0x11); - -// {EBFE7BA0-628D-11D2-AE0F-006097B01411} -DEFINE_GUID(CLSID_DP8SP_TCPIP, 0xebfe7ba0, 0x628d, 0x11d2, 0xae, 0xf, 0x0, 0x60, 0x97, 0xb0, 0x14, 0x11); - -/**************************************************************************** - * - * DirectPlay8 Interface Pointer definitions - * - ****************************************************************************/ - -typedef struct IDirectPlay8Peer *PDIRECTPLAY8PEER; -typedef struct IDirectPlay8Server *PDIRECTPLAY8SERVER; -typedef struct IDirectPlay8Client *PDIRECTPLAY8CLIENT; - -/**************************************************************************** - * - * DirectPlay8 Forward Declarations For External Types - * - ****************************************************************************/ - -typedef struct IDirectPlay8LobbiedApplication *PDNLOBBIEDAPPLICATION; -typedef struct IDirectPlay8Address IDirectPlay8Address; - -/**************************************************************************** - * - * DirectPlay8 Callback Functions - * - ****************************************************************************/ - -// -// Callback Function Type Definition -// -typedef HRESULT (WINAPI *PFNDPNMESSAGEHANDLER)(PVOID,DWORD,PVOID); - -/**************************************************************************** - * - * DirectPlay8 Datatypes (Non-Structure / Non-Message) - * - ****************************************************************************/ - -// -// Player IDs. Used to uniquely identify a player in a session -// -typedef DWORD DPNID, *PDPNID; - -// -// Used as identifiers for operations -// -typedef DWORD DPNHANDLE, *PDPNHANDLE; - -/**************************************************************************** - * - * DirectPlay8 Message Identifiers - * - ****************************************************************************/ - -#define DPN_MSGID_OFFSET 0xFFFF0000 -#define DPN_MSGID_ADD_PLAYER_TO_GROUP ( DPN_MSGID_OFFSET | 0x0001 ) -#define DPN_MSGID_APPLICATION_DESC ( DPN_MSGID_OFFSET | 0x0002 ) -#define DPN_MSGID_ASYNC_OP_COMPLETE ( DPN_MSGID_OFFSET | 0x0003 ) -#define DPN_MSGID_CLIENT_INFO ( DPN_MSGID_OFFSET | 0x0004 ) -#define DPN_MSGID_CONNECT_COMPLETE ( DPN_MSGID_OFFSET | 0x0005 ) -#define DPN_MSGID_CREATE_GROUP ( DPN_MSGID_OFFSET | 0x0006 ) -#define DPN_MSGID_CREATE_PLAYER ( DPN_MSGID_OFFSET | 0x0007 ) -#define DPN_MSGID_DESTROY_GROUP ( DPN_MSGID_OFFSET | 0x0008 ) -#define DPN_MSGID_DESTROY_PLAYER ( DPN_MSGID_OFFSET | 0x0009 ) -#define DPN_MSGID_ENUM_HOSTS_QUERY ( DPN_MSGID_OFFSET | 0x000a ) -#define DPN_MSGID_ENUM_HOSTS_RESPONSE ( DPN_MSGID_OFFSET | 0x000b ) -#define DPN_MSGID_GROUP_INFO ( DPN_MSGID_OFFSET | 0x000c ) -#define DPN_MSGID_HOST_MIGRATE ( DPN_MSGID_OFFSET | 0x000d ) -#define DPN_MSGID_INDICATE_CONNECT ( DPN_MSGID_OFFSET | 0x000e ) -#define DPN_MSGID_INDICATED_CONNECT_ABORTED ( DPN_MSGID_OFFSET | 0x000f ) -#define DPN_MSGID_PEER_INFO ( DPN_MSGID_OFFSET | 0x0010 ) -#define DPN_MSGID_RECEIVE ( DPN_MSGID_OFFSET | 0x0011 ) -#define DPN_MSGID_REMOVE_PLAYER_FROM_GROUP ( DPN_MSGID_OFFSET | 0x0012 ) -#define DPN_MSGID_RETURN_BUFFER ( DPN_MSGID_OFFSET | 0x0013 ) -#define DPN_MSGID_SEND_COMPLETE ( DPN_MSGID_OFFSET | 0x0014 ) -#define DPN_MSGID_SERVER_INFO ( DPN_MSGID_OFFSET | 0x0015 ) -#define DPN_MSGID_TERMINATE_SESSION ( DPN_MSGID_OFFSET | 0x0016 ) - -/**************************************************************************** - * - * DirectPlay8 Constants - * - ****************************************************************************/ - -#define DPNID_ALL_PLAYERS_GROUP 0 - -// -// DESTROY_GROUP reasons -// -#define DPNDESTROYGROUPREASON_NORMAL 0x0001 -#define DPNDESTROYGROUPREASON_AUTODESTRUCTED 0x0002 -#define DPNDESTROYGROUPREASON_SESSIONTERMINATED 0x0003 - -// -// DESTROY_PLAYER reasons -// -#define DPNDESTROYPLAYERREASON_NORMAL 0x0001 -#define DPNDESTROYPLAYERREASON_CONNECTIONLOST 0x0002 -#define DPNDESTROYPLAYERREASON_SESSIONTERMINATED 0x0003 -#define DPNDESTROYPLAYERREASON_HOSTDESTROYEDPLAYER 0x0004 - -/**************************************************************************** - * - * DirectPlay8 Flags - * - ****************************************************************************/ - -// -// Asynchronous operation flags (For Async Ops) -// -#define DPNOP_SYNC 0x80000000 - -// -// Add player to group flags (For AddPlayerToGroup) -// -#define DPNADDPLAYERTOGROUP_SYNC DPNOP_SYNC - -// -// Cancel flags -// -#define DPNCANCEL_CONNECT 0x0001 -#define DPNCANCEL_ENUM 0x0002 -#define DPNCANCEL_SEND 0x0004 -#define DPNCANCEL_ALL_OPERATIONS 0x8000 - -// -// Connect flags (For Connect) -// -#define DPNCONNECT_SYNC DPNOP_SYNC -#define DPNCONNECT_OKTOQUERYFORADDRESSING 0x0001 - -// -// Create group flags (For CreateGroup) -// -#define DPNCREATEGROUP_SYNC DPNOP_SYNC - -// -// Destroy group flags (For DestroyGroup) -// -#define DPNDESTROYGROUP_SYNC DPNOP_SYNC - -// -// Enumerate clients and groups flags (For EnumPlayersAndGroups) -// -#define DPNENUM_PLAYERS 0x0001 -#define DPNENUM_GROUPS 0x0010 - -// -// Enum hosts flags (For EnumHosts) -// -#define DPNENUMHOSTS_SYNC DPNOP_SYNC -#define DPNENUMHOSTS_OKTOQUERYFORADDRESSING 0x0001 -#define DPNENUMHOSTS_NOBROADCASTFALLBACK 0x0002 - -// -// Enum service provider flags (For EnumSP) -// -#define DPNENUMSERVICEPROVIDERS_ALL 0x0001 - -// -// Get send queue info flags (For GetSendQueueInfo) -// -#define DPNGETSENDQUEUEINFO_PRIORITY_NORMAL 0x0001 -#define DPNGETSENDQUEUEINFO_PRIORITY_HIGH 0x0002 -#define DPNGETSENDQUEUEINFO_PRIORITY_LOW 0x0004 - -// -// Group information flags (For Group Info) -// -#define DPNGROUP_AUTODESTRUCT 0x0001 - -// -// Host flags (For Host) -// -#define DPNHOST_OKTOQUERYFORADDRESSING 0x0001 - -// -// Set info -// -#define DPNINFO_NAME 0x0001 -#define DPNINFO_DATA 0x0002 - -// -// Initialize flags (For Initialize) -// -#define DPNINITIALIZE_DISABLEPARAMVAL 0x0001 - -// -// Register Lobby flags -// -#define DPNLOBBY_REGISTER 0x0001 -#define DPNLOBBY_UNREGISTER 0x0002 - -// -// Player information flags (For Player Info / Player Messages) -// -#define DPNPLAYER_LOCAL 0x0002 -#define DPNPLAYER_HOST 0x0004 - -// -// Remove player from group flags (For RemovePlayerFromGroup) -// -#define DPNREMOVEPLAYERFROMGROUP_SYNC DPNOP_SYNC - -// -// Send flags (For Send/SendTo) -// -#define DPNSEND_SYNC DPNOP_SYNC -#define DPNSEND_NOCOPY 0x0001 -#define DPNSEND_NOCOMPLETE 0x0002 -#define DPNSEND_COMPLETEONPROCESS 0x0004 -#define DPNSEND_GUARANTEED 0x0008 -#define DPNSEND_NONSEQUENTIAL 0x0010 -#define DPNSEND_NOLOOPBACK 0x0020 -#define DPNSEND_PRIORITY_LOW 0x0040 -#define DPNSEND_PRIORITY_HIGH 0x0080 - -// -// Session Flags (for DPN_APPLICATION_DESC) -// -#define DPNSESSION_CLIENT_SERVER 0x0001 -#define DPNSESSION_MIGRATE_HOST 0x0004 -#define DPNSESSION_NODPNSVR 0x0040 -#define DPNSESSION_REQUIREPASSWORD 0x0080 - -// -// Set client info flags (For SetClientInfo) -// -#define DPNSETCLIENTINFO_SYNC DPNOP_SYNC - -// -// Set group info flags (For SetGroupInfo) -// -#define DPNSETGROUPINFO_SYNC DPNOP_SYNC - -// -// Set peer info flags (For SetPeerInfo) -// -#define DPNSETPEERINFO_SYNC DPNOP_SYNC - -// -// Set server info flags (For SetServerInfo) -// -#define DPNSETSERVERINFO_SYNC DPNOP_SYNC - -// -// SP capabilities flags -// -#define DPNSPCAPS_SUPPORTSDPNSRV 0x0001 -#define DPNSPCAPS_SUPPORTSBROADCAST 0x0002 -#define DPNSPCAPS_SUPPORTSALLADAPTERS 0x0004 - -/**************************************************************************** - * - * DirectPlay8 Structures (Non-Message) - * - ****************************************************************************/ - -// -// Application description -// -typedef struct _DPN_APPLICATION_DESC -{ - DWORD dwSize; // Size of this structure - DWORD dwFlags; // Flags (DPNSESSION_...) - GUID guidInstance; // Instance GUID - GUID guidApplication; // Application GUID - DWORD dwMaxPlayers; // Maximum # of players allowed (0=no limit) - DWORD dwCurrentPlayers; // Current # of players allowed - WCHAR *pwszSessionName; // Name of the session - WCHAR *pwszPassword; // Password for the session - PVOID pvReservedData; - DWORD dwReservedDataSize; - PVOID pvApplicationReservedData; - DWORD dwApplicationReservedDataSize; -} DPN_APPLICATION_DESC, *PDPN_APPLICATION_DESC; - -// -// Generic Buffer Description -// -typedef struct _BUFFERDESC -{ - DWORD dwBufferSize; - BYTE * pBufferData; -} BUFFERDESC, DPN_BUFFER_DESC, *PDPN_BUFFER_DESC; - -typedef BUFFERDESC FAR * PBUFFERDESC; - -// -// DirectPlay8 capabilities -// -typedef struct _DPN_CAPS -{ - DWORD dwSize; // Size of this structure - DWORD dwFlags; // Flags - DWORD dwConnectTimeout; // ms before a connect request times out - DWORD dwConnectRetries; // # of times to attempt the connection - DWORD dwTimeoutUntilKeepAlive; // ms of inactivity before a keep alive is sent -} DPN_CAPS, *PDPN_CAPS; - -// Connection Statistics information - -typedef struct _DPN_CONNECTION_INFO -{ - DWORD dwSize; - DWORD dwRoundTripLatencyMS; - DWORD dwThroughputBPS; - DWORD dwPeakThroughputBPS; - - DWORD dwBytesSentGuaranteed; - DWORD dwPacketsSentGuaranteed; - DWORD dwBytesSentNonGuaranteed; - DWORD dwPacketsSentNonGuaranteed; - - DWORD dwBytesRetried; // Guaranteed only - DWORD dwPacketsRetried; // Guaranteed only - DWORD dwBytesDropped; // Non Guaranteed only - DWORD dwPacketsDropped; // Non Guaranteed only - - DWORD dwMessagesTransmittedHighPriority; - DWORD dwMessagesTimedOutHighPriority; - DWORD dwMessagesTransmittedNormalPriority; - DWORD dwMessagesTimedOutNormalPriority; - DWORD dwMessagesTransmittedLowPriority; - DWORD dwMessagesTimedOutLowPriority; - - DWORD dwBytesReceivedGuaranteed; - DWORD dwPacketsReceivedGuaranteed; - DWORD dwBytesReceivedNonGuaranteed; - DWORD dwPacketsReceivedNonGuaranteed; - DWORD dwMessagesReceived; - -} DPN_CONNECTION_INFO, *PDPN_CONNECTION_INFO; - - -// -// Group information strucutre -// -typedef struct _DPN_GROUP_INFO -{ - DWORD dwSize; // size of this structure - DWORD dwInfoFlags; // information contained - PWSTR pwszName; // Unicode Name - PVOID pvData; // data block - DWORD dwDataSize; // size in BYTES of data block - DWORD dwGroupFlags; // group flags (DPNGROUP_...) -} DPN_GROUP_INFO, *PDPN_GROUP_INFO; - -// -// Player information structure -// -typedef struct _DPN_PLAYER_INFO -{ - DWORD dwSize; // size of this structure - DWORD dwInfoFlags; // information contained - PWSTR pwszName; // Unicode Name - PVOID pvData; // data block - DWORD dwDataSize; // size in BYTES of data block - DWORD dwPlayerFlags; // player flags (DPNPLAYER_...) -} DPN_PLAYER_INFO, *PDPN_PLAYER_INFO; - -typedef struct _DPN_SECURITY_CREDENTIALS DPN_SECURITY_CREDENTIALS, *PDPN_SECURITY_CREDENTIALS; -typedef struct _DPN_SECURITY_DESC DPN_SECURITY_DESC, *PDPN_SECURITY_DESC; - -// -// Service provider & adapter enumeration structure -// -typedef struct _DPN_SERVICE_PROVIDER_INFO -{ - DWORD dwFlags; - GUID guid; // SP Guid - WCHAR *pwszName; // Friendly Name - PVOID pvReserved; - DWORD dwReserved; -} DPN_SERVICE_PROVIDER_INFO, *PDPN_SERVICE_PROVIDER_INFO; - -// -// Service provider caps structure -// -typedef struct _DPN_SP_CAPS -{ - DWORD dwSize; // Size of this structure - DWORD dwFlags; // Flags ((DPNSPCAPS_...) - DWORD dwNumThreads; // # of worker threads to use - DWORD dwDefaultEnumCount; // default # of enum requests - DWORD dwDefaultEnumRetryInterval; // default ms between enum requests - DWORD dwDefaultEnumTimeout; // default enum timeout - DWORD dwMaxEnumPayloadSize; // maximum size in bytes for enum payload data - DWORD dwBuffersPerThread; // number of receive buffers per thread - DWORD dwSystemBufferSize; // amount of buffering to do in addition to posted receive buffers -} DPN_SP_CAPS, *PDPN_SP_CAPS; - - -/**************************************************************************** - * - * IDirectPlay8 message handler call back structures - * - ****************************************************************************/ - -// -// Add player to group strucutre for message handler -// (DPN_MSGID_ADD_PLAYER_TO_GROUP) -// -typedef struct _DPNMSG_ADD_PLAYER_TO_GROUP -{ - DWORD dwSize; // Size of this structure - DPNID dpnidGroup; // DPNID of group - PVOID pvGroupContext; // Group context value - DPNID dpnidPlayer; // DPNID of added player - PVOID pvPlayerContext; // Player context value -} DPNMSG_ADD_PLAYER_TO_GROUP, *PDPNMSG_ADD_PLAYER_TO_GROUP; - -// -// Async operation completion structure for message handler -// (DPN_MSGID_ASYNC_OP_COMPLETE) -// -typedef struct _DPNMSG_ASYNC_OP_COMPLETE -{ - DWORD dwSize; // Size of this structure - DPNHANDLE hAsyncOp; // DirectPlay8 async operation handle - PVOID pvUserContext; // User context supplied - HRESULT hResultCode; // HRESULT of operation -} DPNMSG_ASYNC_OP_COMPLETE, *PDPNMSG_ASYNC_OP_COMPLETE; - -// -// Client info structure for message handler -// (DPN_MSGID_CLIENT_INFO) -// -typedef struct _DPNMSG_CLIENT_INFO -{ - DWORD dwSize; // Size of this structure - DPNID dpnidClient; // DPNID of client - PVOID pvPlayerContext; // Player context value -} DPNMSG_CLIENT_INFO, *PDPNMSG_CLIENT_INFO; - -// -// Connect complete structure for message handler -// (DPN_MSGID_CONNECT_COMPLETE) -// -typedef struct _DPNMSG_CONNECT_COMPLETE -{ - DWORD dwSize; // Size of this structure - DPNHANDLE hAsyncOp; // DirectPlay8 Async operation handle - PVOID pvUserContext; // User context supplied at Connect - HRESULT hResultCode; // HRESULT of connection attempt - PVOID pvApplicationReplyData; // Connection reply data from Host/Server - DWORD dwApplicationReplyDataSize; // Size (in bytes) of pvApplicationReplyData -} DPNMSG_CONNECT_COMPLETE, *PDPNMSG_CONNECT_COMPLETE; - -// -// Create group structure for message handler -// (DPN_MSGID_CREATE_GROUP) -// -typedef struct _DPNMSG_CREATE_GROUP -{ - DWORD dwSize; // Size of this structure - DPNID dpnidGroup; // DPNID of new group - DPNID dpnidOwner; // Owner of newgroup - PVOID pvGroupContext; // Group context value -} DPNMSG_CREATE_GROUP, *PDPNMSG_CREATE_GROUP; - -// -// Create player structure for message handler -// (DPN_MSGID_CREATE_PLAYER) -// -typedef struct _DPNMSG_CREATE_PLAYER -{ - DWORD dwSize; // Size of this structure - DPNID dpnidPlayer; // DPNID of new player - PVOID pvPlayerContext; // Player context value -} DPNMSG_CREATE_PLAYER, *PDPNMSG_CREATE_PLAYER; - -// -// Destroy group structure for message handler -// (DPN_MSGID_DESTROY_GROUP) -// -typedef struct _DPNMSG_DESTROY_GROUP -{ - DWORD dwSize; // Size of this structure - DPNID dpnidGroup; // DPNID of destroyed group - PVOID pvGroupContext; // Group context value - DWORD dwReason; // Information only -} DPNMSG_DESTROY_GROUP, *PDPNMSG_DESTROY_GROUP; - -// -// Destroy player structure for message handler -// (DPN_MSGID_DESTROY_PLAYER) -// -typedef struct _DPNMSG_DESTROY_PLAYER -{ - DWORD dwSize; // Size of this structure - DPNID dpnidPlayer; // DPNID of leaving player - PVOID pvPlayerContext; // Player context value - DWORD dwReason; // Information only -} DPNMSG_DESTROY_PLAYER, *PDPNMSG_DESTROY_PLAYER; - -// -// Enumeration request received structure for message handler -// (DPN_MSGID_ENUM_HOSTS_QUERY) -// -typedef struct _DPNMSG_ENUM_HOSTS_QUERY -{ - DWORD dwSize; // Size of this structure. - IDirectPlay8Address *pAddressSender; // Address of client who sent the request - IDirectPlay8Address *pAddressDevice; // Address of device request was received on - PVOID pvReceivedData; // Request data (set on client) - DWORD dwReceivedDataSize; // Request data size (set on client) - DWORD dwMaxResponseDataSize; // Max allowable size of enum response - PVOID pvResponseData; // Optional query repsonse (user set) - DWORD dwResponseDataSize; // Optional query response size (user set) - PVOID pvResponseContext; // Optional query response context (user set) -} DPNMSG_ENUM_HOSTS_QUERY, *PDPNMSG_ENUM_HOSTS_QUERY; - -// -// Enumeration response received structure for message handler -// (DPN_MSGID_ENUM_HOSTS_RESPONSE) -// -typedef struct _DPNMSG_ENUM_HOSTS_RESPONSE -{ - DWORD dwSize; // Size of this structure - IDirectPlay8Address *pAddressSender; // Address of host who responded - IDirectPlay8Address *pAddressDevice; // Device response was received on - const DPN_APPLICATION_DESC *pApplicationDescription; // Application description for the session - PVOID pvResponseData; // Optional response data (set on host) - DWORD dwResponseDataSize; // Optional response data size (set on host) - PVOID pvUserContext; // Context value supplied for enumeration - DWORD dwRoundTripLatencyMS; // Round trip latency in MS -} DPNMSG_ENUM_HOSTS_RESPONSE, *PDPNMSG_ENUM_HOSTS_RESPONSE; - -// -// Group info structure for message handler -// (DPN_MSGID_GROUP_INFO) -// -typedef struct _DPNMSG_GROUP_INFO -{ - DWORD dwSize; // Size of this structure - DPNID dpnidGroup; // DPNID of group - PVOID pvGroupContext; // Group context value -} DPNMSG_GROUP_INFO, *PDPNMSG_GROUP_INFO; - -// -// Migrate host structure for message handler -// (DPN_MSGID_HOST_MIGRATE) -// -typedef struct _DPNMSG_HOST_MIGRATE -{ - DWORD dwSize; // Size of this structure - DPNID dpnidNewHost; // DPNID of new Host player - PVOID pvPlayerContext; // Player context value -} DPNMSG_HOST_MIGRATE, *PDPNMSG_HOST_MIGRATE; - -// -// Indicate connect structure for message handler -// (DPN_MSGID_INDICATE_CONNECT) -// -typedef struct _DPNMSG_INDICATE_CONNECT -{ - DWORD dwSize; // Size of this structure - PVOID pvUserConnectData; // Connecting player data - DWORD dwUserConnectDataSize; // Size (in bytes) of pvUserConnectData - PVOID pvReplyData; // Connection reply data - DWORD dwReplyDataSize; // Size (in bytes) of pvReplyData - PVOID pvReplyContext; // Buffer context for pvReplyData - PVOID pvPlayerContext; // Player context preset - IDirectPlay8Address *pAddressPlayer;// Address of connecting player - IDirectPlay8Address *pAddressDevice;// Address of device receiving connect attempt -} DPNMSG_INDICATE_CONNECT, *PDPNMSG_INDICATE_CONNECT; - -// -// Indicated connect aborted structure for message handler -// (DPN_MSGID_INDICATED_CONNECT_ABORTED) -// -typedef struct _DPNMSG_INDICATED_CONNECT_ABORTED -{ - DWORD dwSize; // Size of this structure - PVOID pvPlayerContext; // Player context preset from DPNMSG_INDICATE_CONNECT -} DPNMSG_INDICATED_CONNECT_ABORTED, *PDPNMSG_INDICATED_CONNECT_ABORTED; - -// -// Peer info structure for message handler -// (DPN_MSGID_PEER_INFO) -// -typedef struct _DPNMSG_PEER_INFO -{ - DWORD dwSize; // Size of this structure - DPNID dpnidPeer; // DPNID of peer - PVOID pvPlayerContext; // Player context value -} DPNMSG_PEER_INFO, *PDPNMSG_PEER_INFO; - -// -// Receive structure for message handler -// (DPN_MSGID_RECEIVE) -// -typedef struct _DPNMSG_RECEIVE -{ - DWORD dwSize; // Size of this structure - DPNID dpnidSender; // DPNID of sending player - PVOID pvPlayerContext; // Player context value of sending player - PBYTE pReceiveData; // Received data - DWORD dwReceiveDataSize; // Size (in bytes) of pReceiveData - DPNHANDLE hBufferHandle; // Buffer handle for pReceiveData -} DPNMSG_RECEIVE, *PDPNMSG_RECEIVE; - -// -// Remove player from group structure for message handler -// (DPN_MSGID_REMOVE_PLAYER_FROM_GROUP) -// -typedef struct _DPNMSG_REMOVE_PLAYER_FROM_GROUP -{ - DWORD dwSize; // Size of this structure - DPNID dpnidGroup; // DPNID of group - PVOID pvGroupContext; // Group context value - DPNID dpnidPlayer; // DPNID of deleted player - PVOID pvPlayerContext; // Player context value -} DPNMSG_REMOVE_PLAYER_FROM_GROUP, *PDPNMSG_REMOVE_PLAYER_FROM_GROUP; - -// -// Returned buffer structure for message handler -// (DPN_MSGID_RETURN_BUFFER) -// -typedef struct _DPNMSG_RETURN_BUFFER -{ - DWORD dwSize; // Size of this structure - HRESULT hResultCode; // Return value of operation - PVOID pvBuffer; // Buffer being returned - PVOID pvUserContext; // Context associated with buffer -} DPNMSG_RETURN_BUFFER, *PDPNMSG_RETURN_BUFFER; - -// -// Send complete structure for message handler -// (DPN_MSGID_SEND_COMPLETE) -// -typedef struct _DPNMSG_SEND_COMPLETE -{ - DWORD dwSize; // Size of this structure - DPNHANDLE hAsyncOp; // DirectPlay8 Async operation handle - PVOID pvUserContext; // User context supplied at Send/SendTo - HRESULT hResultCode; // HRESULT of send - DWORD dwSendTime; // Send time in ms -} DPNMSG_SEND_COMPLETE, *PDPNMSG_SEND_COMPLETE; - -// -// Server info structure for message handler -// (DPN_MSGID_SERVER_INFO) -// -typedef struct _DPNMSG_SERVER_INFO -{ - DWORD dwSize; // Size of this structure - DPNID dpnidServer; // DPNID of server - PVOID pvPlayerContext; // Player context value -} DPNMSG_SERVER_INFO, *PDPNMSG_SERVER_INFO; - -// -// Terminated session structure for message handler -// (DPN_MSGID_TERMINATE_SESSION) -// -typedef struct _DPNMSG_TERMINATE_SESSION -{ - DWORD dwSize; // Size of this structure - HRESULT hResultCode; // Reason - PVOID pvTerminateData; // Data passed from Host/Server - DWORD dwTerminateDataSize;// Size (in bytes) of pvTerminateData -} DPNMSG_TERMINATE_SESSION, *PDPNMSG_TERMINATE_SESSION; - - -/**************************************************************************** - * - * DirectPlay8 Functions - * - ****************************************************************************/ - -/* - * This function is no longer supported. It is recommended that CoCreateInstance be used to create - * DirectPlay8 objects. - * - * extern HRESULT WINAPI DirectPlay8Create( const GUID * pcIID, void **ppvInterface, IUnknown *pUnknown); - * - */ - -/**************************************************************************** - * - * DirectPlay8 Application Interfaces - * - ****************************************************************************/ - -// -// COM definition for DirectPlay8 Client interface -// -#undef INTERFACE // External COM Implementation -#define INTERFACE IDirectPlay8Client -DECLARE_INTERFACE_(IDirectPlay8Client,IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectPlay8Client methods ***/ - STDMETHOD(Initialize) (THIS_ PVOID const pvUserContext, const PFNDPNMESSAGEHANDLER pfn, const DWORD dwFlags) PURE; - STDMETHOD(EnumServiceProviders) (THIS_ const GUID *const pguidServiceProvider, const GUID *const pguidApplication, DPN_SERVICE_PROVIDER_INFO *const pSPInfoBuffer, PDWORD const pcbEnumData, PDWORD const pcReturned, const DWORD dwFlags) PURE; - STDMETHOD(EnumHosts) (THIS_ PDPN_APPLICATION_DESC const pApplicationDesc,IDirectPlay8Address *const pAddrHost,IDirectPlay8Address *const pDeviceInfo,PVOID const pUserEnumData,const DWORD dwUserEnumDataSize,const DWORD dwEnumCount,const DWORD dwRetryInterval,const DWORD dwTimeOut,PVOID const pvUserContext,DPNHANDLE *const pAsyncHandle,const DWORD dwFlags) PURE; - STDMETHOD(CancelAsyncOperation) (THIS_ const DPNHANDLE hAsyncHandle, const DWORD dwFlags) PURE; - STDMETHOD(Connect) (THIS_ const DPN_APPLICATION_DESC *const pdnAppDesc,IDirectPlay8Address *const pHostAddr,IDirectPlay8Address *const pDeviceInfo,const DPN_SECURITY_DESC *const pdnSecurity,const DPN_SECURITY_CREDENTIALS *const pdnCredentials,const void *const pvUserConnectData,const DWORD dwUserConnectDataSize,void *const pvAsyncContext,DPNHANDLE *const phAsyncHandle,const DWORD dwFlags) PURE; - STDMETHOD(Send) (THIS_ const DPN_BUFFER_DESC *const prgBufferDesc,const DWORD cBufferDesc,const DWORD dwTimeOut,void *const pvAsyncContext,DPNHANDLE *const phAsyncHandle,const DWORD dwFlags) PURE; - STDMETHOD(GetSendQueueInfo) (THIS_ DWORD *const pdwNumMsgs, DWORD *const pdwNumBytes, const DWORD dwFlags) PURE; - STDMETHOD(GetApplicationDesc) (THIS_ DPN_APPLICATION_DESC *const pAppDescBuffer, DWORD *const pcbDataSize, const DWORD dwFlags) PURE; - STDMETHOD(SetClientInfo) (THIS_ const DPN_PLAYER_INFO *const pdpnPlayerInfo,PVOID const pvAsyncContext,DPNHANDLE *const phAsyncHandle, const DWORD dwFlags) PURE; - STDMETHOD(GetServerInfo) (THIS_ DPN_PLAYER_INFO *const pdpnPlayerInfo,DWORD *const pdwSize,const DWORD dwFlags) PURE; - STDMETHOD(GetServerAddress) (THIS_ IDirectPlay8Address **const pAddress,const DWORD dwFlags) PURE; - STDMETHOD(Close) (THIS_ const DWORD dwFlags) PURE; - STDMETHOD(ReturnBuffer) (THIS_ const DPNHANDLE hBufferHandle,const DWORD dwFlags) PURE; - STDMETHOD(GetCaps) (THIS_ DPN_CAPS *const pdpCaps,const DWORD dwFlags) PURE; - STDMETHOD(SetCaps) (THIS_ const DPN_CAPS *const pdpCaps, const DWORD dwFlags) PURE; - STDMETHOD(SetSPCaps) (THIS_ const GUID * const pguidSP, const DPN_SP_CAPS *const pdpspCaps, const DWORD dwFlags ) PURE; - STDMETHOD(GetSPCaps) (THIS_ const GUID * const pguidSP,DPN_SP_CAPS *const pdpspCaps,const DWORD dwFlags) PURE; - STDMETHOD(GetConnectionInfo) (THIS_ DPN_CONNECTION_INFO *const pdpConnectionInfo,const DWORD dwFlags) PURE; - STDMETHOD(RegisterLobby) (THIS_ const DPNHANDLE dpnHandle, struct IDirectPlay8LobbiedApplication *const pIDP8LobbiedApplication,const DWORD dwFlags) PURE; -}; - -// -// COM definition for DirectPlay8 Server interface -// -#undef INTERFACE // External COM Implementation -#define INTERFACE IDirectPlay8Server -DECLARE_INTERFACE_(IDirectPlay8Server,IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectPlay8Server methods ***/ - STDMETHOD(Initialize) (THIS_ PVOID const pvUserContext, const PFNDPNMESSAGEHANDLER pfn, const DWORD dwFlags) PURE; - STDMETHOD(EnumServiceProviders) (THIS_ const GUID *const pguidServiceProvider,const GUID *const pguidApplication,DPN_SERVICE_PROVIDER_INFO *const pSPInfoBuffer,PDWORD const pcbEnumData,PDWORD const pcReturned,const DWORD dwFlags) PURE; - STDMETHOD(CancelAsyncOperation) (THIS_ const DPNHANDLE hAsyncHandle,const DWORD dwFlags) PURE; - STDMETHOD(GetSendQueueInfo) (THIS_ const DPNID dpnid,DWORD *const pdwNumMsgs, DWORD *const pdwNumBytes, const DWORD dwFlags) PURE; - STDMETHOD(GetApplicationDesc) (THIS_ DPN_APPLICATION_DESC *const pAppDescBuffer, DWORD *const pcbDataSize, const DWORD dwFlags) PURE; - STDMETHOD(SetServerInfo) (THIS_ const DPN_PLAYER_INFO *const pdpnPlayerInfo,PVOID const pvAsyncContext, DPNHANDLE *const phAsyncHandle, const DWORD dwFlags) PURE; - STDMETHOD(GetClientInfo) (THIS_ const DPNID dpnid,DPN_PLAYER_INFO *const pdpnPlayerInfo,DWORD *const pdwSize,const DWORD dwFlags) PURE; - STDMETHOD(GetClientAddress) (THIS_ const DPNID dpnid,IDirectPlay8Address **const pAddress,const DWORD dwFlags) PURE; - STDMETHOD(GetLocalHostAddresses) (THIS_ IDirectPlay8Address **const prgpAddress,DWORD *const pcAddress,const DWORD dwFlags) PURE; - STDMETHOD(SetApplicationDesc) (THIS_ const DPN_APPLICATION_DESC *const pad, const DWORD dwFlags) PURE; - STDMETHOD(Host) (THIS_ const DPN_APPLICATION_DESC *const pdnAppDesc,IDirectPlay8Address **const prgpDeviceInfo,const DWORD cDeviceInfo,const DPN_SECURITY_DESC *const pdnSecurity,const DPN_SECURITY_CREDENTIALS *const pdnCredentials,void *const pvPlayerContext,const DWORD dwFlags) PURE; - STDMETHOD(SendTo) (THIS_ const DPNID dpnid,const DPN_BUFFER_DESC *const prgBufferDesc,const DWORD cBufferDesc,const DWORD dwTimeOut,void *const pvAsyncContext,DPNHANDLE *const phAsyncHandle,const DWORD dwFlags) PURE; - STDMETHOD(CreateGroup) (THIS_ const DPN_GROUP_INFO *const pdpnGroupInfo,void *const pvGroupContext,void *const pvAsyncContext,DPNHANDLE *const phAsyncHandle,const DWORD dwFlags) PURE; - STDMETHOD(DestroyGroup) (THIS_ const DPNID idGroup, PVOID const pvAsyncContext, DPNHANDLE *const phAsyncHandle, const DWORD dwFlags) PURE; - STDMETHOD(AddPlayerToGroup) (THIS_ const DPNID idGroup, const DPNID idClient, PVOID const pvAsyncContext, DPNHANDLE *const phAsyncHandle, const DWORD dwFlags) PURE; - STDMETHOD(RemovePlayerFromGroup) (THIS_ const DPNID idGroup, const DPNID idClient, PVOID const pvAsyncContext, DPNHANDLE *const phAsyncHandle, const DWORD dwFlags) PURE; - STDMETHOD(SetGroupInfo) (THIS_ const DPNID dpnid,DPN_GROUP_INFO *const pdpnGroupInfo,PVOID const pvAsyncContext,DPNHANDLE *const phAsyncHandle, const DWORD dwFlags) PURE; - STDMETHOD(GetGroupInfo) (THIS_ const DPNID dpnid,DPN_GROUP_INFO *const pdpnGroupInfo,DWORD *const pdwSize,const DWORD dwFlags) PURE; - STDMETHOD(EnumPlayersAndGroups) (THIS_ DPNID *const prgdpnid, DWORD *const pcdpnid, const DWORD dwFlags) PURE; - STDMETHOD(EnumGroupMembers) (THIS_ const DPNID dpnid, DPNID *const prgdpnid, DWORD *const pcdpnid, const DWORD dwFlags) PURE; - STDMETHOD(Close) (THIS_ const DWORD dwFlags) PURE; - STDMETHOD(DestroyClient) (THIS_ const DPNID dpnidClient, const void *const pvDestroyData, const DWORD dwDestroyDataSize, const DWORD dwFlags) PURE; - STDMETHOD(ReturnBuffer) (THIS_ const DPNHANDLE hBufferHandle,const DWORD dwFlags) PURE; - STDMETHOD(GetPlayerContext) (THIS_ const DPNID dpnid,PVOID *const ppvPlayerContext,const DWORD dwFlags) PURE; - STDMETHOD(GetGroupContext) (THIS_ const DPNID dpnid,PVOID *const ppvGroupContext,const DWORD dwFlags) PURE; - STDMETHOD(GetCaps) (THIS_ DPN_CAPS *const pdpCaps,const DWORD dwFlags) PURE; - STDMETHOD(SetCaps) (THIS_ const DPN_CAPS *const pdpCaps, const DWORD dwFlags) PURE; - STDMETHOD(SetSPCaps) (THIS_ const GUID * const pguidSP, const DPN_SP_CAPS *const pdpspCaps, const DWORD dwFlags ) PURE; - STDMETHOD(GetSPCaps) (THIS_ const GUID * const pguidSP, DPN_SP_CAPS *const pdpspCaps,const DWORD dwFlags) PURE; - STDMETHOD(GetConnectionInfo) (THIS_ const DPNID dpnid, DPN_CONNECTION_INFO *const pdpConnectionInfo,const DWORD dwFlags) PURE; - STDMETHOD(RegisterLobby) (THIS_ const DPNHANDLE dpnHandle, struct IDirectPlay8LobbiedApplication *const pIDP8LobbiedApplication,const DWORD dwFlags) PURE; -}; - -// -// COM definition for DirectPlay8 Peer interface -// -#undef INTERFACE // External COM Implementation -#define INTERFACE IDirectPlay8Peer -DECLARE_INTERFACE_(IDirectPlay8Peer,IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectPlay8Peer methods ***/ - STDMETHOD(Initialize) (THIS_ PVOID const pvUserContext, const PFNDPNMESSAGEHANDLER pfn, const DWORD dwFlags) PURE; - STDMETHOD(EnumServiceProviders) (THIS_ const GUID *const pguidServiceProvider, const GUID *const pguidApplication, DPN_SERVICE_PROVIDER_INFO *const pSPInfoBuffer, DWORD *const pcbEnumData, DWORD *const pcReturned, const DWORD dwFlags) PURE; - STDMETHOD(CancelAsyncOperation) (THIS_ const DPNHANDLE hAsyncHandle, const DWORD dwFlags) PURE; - STDMETHOD(Connect) (THIS_ const DPN_APPLICATION_DESC *const pdnAppDesc,IDirectPlay8Address *const pHostAddr,IDirectPlay8Address *const pDeviceInfo,const DPN_SECURITY_DESC *const pdnSecurity,const DPN_SECURITY_CREDENTIALS *const pdnCredentials,const void *const pvUserConnectData,const DWORD dwUserConnectDataSize,void *const pvPlayerContext,void *const pvAsyncContext,DPNHANDLE *const phAsyncHandle,const DWORD dwFlags) PURE; - STDMETHOD(SendTo) (THIS_ const DPNID dpnid,const DPN_BUFFER_DESC *const prgBufferDesc,const DWORD cBufferDesc,const DWORD dwTimeOut,void *const pvAsyncContext,DPNHANDLE *const phAsyncHandle,const DWORD dwFlags) PURE; - STDMETHOD(GetSendQueueInfo) (THIS_ const DPNID dpnid, DWORD *const pdwNumMsgs, DWORD *const pdwNumBytes, const DWORD dwFlags) PURE; - STDMETHOD(Host) (THIS_ const DPN_APPLICATION_DESC *const pdnAppDesc,IDirectPlay8Address **const prgpDeviceInfo,const DWORD cDeviceInfo,const DPN_SECURITY_DESC *const pdnSecurity,const DPN_SECURITY_CREDENTIALS *const pdnCredentials,void *const pvPlayerContext,const DWORD dwFlags) PURE; - STDMETHOD(GetApplicationDesc) (THIS_ DPN_APPLICATION_DESC *const pAppDescBuffer, DWORD *const pcbDataSize, const DWORD dwFlags) PURE; - STDMETHOD(SetApplicationDesc) (THIS_ const DPN_APPLICATION_DESC *const pad, const DWORD dwFlags) PURE; - STDMETHOD(CreateGroup) (THIS_ const DPN_GROUP_INFO *const pdpnGroupInfo,void *const pvGroupContext,void *const pvAsyncContext,DPNHANDLE *const phAsyncHandle,const DWORD dwFlags) PURE; - STDMETHOD(DestroyGroup) (THIS_ const DPNID idGroup, PVOID const pvAsyncContext, DPNHANDLE *const phAsyncHandle, const DWORD dwFlags) PURE; - STDMETHOD(AddPlayerToGroup) (THIS_ const DPNID idGroup, const DPNID idClient, PVOID const pvAsyncContext, DPNHANDLE *const phAsyncHandle, const DWORD dwFlags) PURE; - STDMETHOD(RemovePlayerFromGroup) (THIS_ const DPNID idGroup, const DPNID idClient, PVOID const pvAsyncContext, DPNHANDLE *const phAsyncHandle, const DWORD dwFlags) PURE; - STDMETHOD(SetGroupInfo) (THIS_ const DPNID dpnid,DPN_GROUP_INFO *const pdpnGroupInfo,PVOID const pvAsyncContext,DPNHANDLE *const phAsyncHandle, const DWORD dwFlags) PURE; - STDMETHOD(GetGroupInfo) (THIS_ const DPNID dpnid,DPN_GROUP_INFO *const pdpnGroupInfo,DWORD *const pdwSize,const DWORD dwFlags) PURE; - STDMETHOD(EnumPlayersAndGroups) (THIS_ DPNID *const prgdpnid, DWORD *const pcdpnid, const DWORD dwFlags) PURE; - STDMETHOD(EnumGroupMembers) (THIS_ const DPNID dpnid, DPNID *const prgdpnid, DWORD *const pcdpnid, const DWORD dwFlags) PURE; - STDMETHOD(SetPeerInfo) (THIS_ const DPN_PLAYER_INFO *const pdpnPlayerInfo,PVOID const pvAsyncContext,DPNHANDLE *const phAsyncHandle, const DWORD dwFlags) PURE; - STDMETHOD(GetPeerInfo) (THIS_ const DPNID dpnid,DPN_PLAYER_INFO *const pdpnPlayerInfo,DWORD *const pdwSize,const DWORD dwFlags) PURE; - STDMETHOD(GetPeerAddress) (THIS_ const DPNID dpnid,IDirectPlay8Address **const pAddress,const DWORD dwFlags) PURE; - STDMETHOD(GetLocalHostAddresses) (THIS_ IDirectPlay8Address **const prgpAddress,DWORD *const pcAddress,const DWORD dwFlags) PURE; - STDMETHOD(Close) (THIS_ const DWORD dwFlags) PURE; - STDMETHOD(EnumHosts) (THIS_ PDPN_APPLICATION_DESC const pApplicationDesc,IDirectPlay8Address *const pAddrHost,IDirectPlay8Address *const pDeviceInfo,PVOID const pUserEnumData,const DWORD dwUserEnumDataSize,const DWORD dwEnumCount,const DWORD dwRetryInterval,const DWORD dwTimeOut,PVOID const pvUserContext,DPNHANDLE *const pAsyncHandle,const DWORD dwFlags) PURE; - STDMETHOD(DestroyPeer) (THIS_ const DPNID dpnidClient, const void *const pvDestroyData, const DWORD dwDestroyDataSize, const DWORD dwFlags) PURE; - STDMETHOD(ReturnBuffer) (THIS_ const DPNHANDLE hBufferHandle,const DWORD dwFlags) PURE; - STDMETHOD(GetPlayerContext) (THIS_ const DPNID dpnid,PVOID *const ppvPlayerContext,const DWORD dwFlags) PURE; - STDMETHOD(GetGroupContext) (THIS_ const DPNID dpnid,PVOID *const ppvGroupContext,const DWORD dwFlags) PURE; - STDMETHOD(GetCaps) (THIS_ DPN_CAPS *const pdpCaps,const DWORD dwFlags) PURE; - STDMETHOD(SetCaps) (THIS_ const DPN_CAPS *const pdpCaps, const DWORD dwFlags) PURE; - STDMETHOD(SetSPCaps) (THIS_ const GUID * const pguidSP, const DPN_SP_CAPS *const pdpspCaps, const DWORD dwFlags ) PURE; - STDMETHOD(GetSPCaps) (THIS_ const GUID * const pguidSP, DPN_SP_CAPS *const pdpspCaps,const DWORD dwFlags) PURE; - STDMETHOD(GetConnectionInfo) (THIS_ const DPNID dpnid, DPN_CONNECTION_INFO *const pdpConnectionInfo,const DWORD dwFlags) PURE; - STDMETHOD(RegisterLobby) (THIS_ const DPNHANDLE dpnHandle, struct IDirectPlay8LobbiedApplication *const pIDP8LobbiedApplication,const DWORD dwFlags) PURE; - STDMETHOD(TerminateSession) (THIS_ void *const pvTerminateData,const DWORD dwTerminateDataSize,const DWORD dwFlags) PURE; -}; - - -/**************************************************************************** - * - * IDirectPlay8 application interface macros - * - ****************************************************************************/ - -#if !defined(__cplusplus) || defined(CINTERFACE) - -#define IDirectPlay8Client_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectPlay8Client_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectPlay8Client_Release(p) (p)->lpVtbl->Release(p) -#define IDirectPlay8Client_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c) -#define IDirectPlay8Client_EnumServiceProviders(p,a,b,c,d,e,f) (p)->lpVtbl->EnumServiceProviders(p,a,b,c,d,e,f) -#define IDirectPlay8Client_EnumHosts(p,a,b,c,d,e,f,g,h,i,j,k) (p)->lpVtbl->EnumHosts(p,a,b,c,d,e,f,g,h,i,j,k) -#define IDirectPlay8Client_CancelAsyncOperation(p,a,b) (p)->lpVtbl->CancelAsyncOperation(p,a,b) -#define IDirectPlay8Client_Connect(p,a,b,c,d,e,f,g,h,i,j) (p)->lpVtbl->Connect(p,a,b,c,d,e,f,g,h,i,j) -#define IDirectPlay8Client_Send(p,a,b,c,d,e,f) (p)->lpVtbl->Send(p,a,b,c,d,e,f) -#define IDirectPlay8Client_GetSendQueueInfo(p,a,b,c) (p)->lpVtbl->GetSendQueueInfo(p,a,b,c) -#define IDirectPlay8Client_GetApplicationDesc(p,a,b,c) (p)->lpVtbl->GetApplicationDesc(p,a,b,c) -#define IDirectPlay8Client_SetClientInfo(p,a,b,c,d) (p)->lpVtbl->SetClientInfo(p,a,b,c,d) -#define IDirectPlay8Client_GetServerInfo(p,a,b,c) (p)->lpVtbl->GetServerInfo(p,a,b,c) -#define IDirectPlay8Client_GetServerAddress(p,a,b) (p)->lpVtbl->GetServerAddress(p,a,b) -#define IDirectPlay8Client_Close(p,a) (p)->lpVtbl->Close(p,a) -#define IDirectPlay8Client_ReturnBuffer(p,a,b) (p)->lpVtbl->ReturnBuffer(p,a,b) -#define IDirectPlay8Client_GetCaps(p,a,b) (p)->lpVtbl->GetCaps(p,a,b) -#define IDirectPlay8Client_SetCaps(p,a,b) (p)->lpVtbl->SetCaps(p,a,b) -#define IDirectPlay8Client_SetSPCaps(p,a,b,c) (p)->lpVtbl->SetSPCaps(p,a,b,c) -#define IDirectPlay8Client_GetSPCaps(p,a,b,c) (p)->lpVtbl->GetSPCaps(p,a,b,c) -#define IDirectPlay8Client_GetConnectionInfo(p,a,b) (p)->lpVtbl->GetConnectionInfo(p,a,b) -#define IDirectPlay8Client_RegisterLobby(p,a,b,c) (p)->lpVtbl->RegisterLobby(p,a,b,c) - -#define IDirectPlay8Server_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectPlay8Server_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectPlay8Server_Release(p) (p)->lpVtbl->Release(p) -#define IDirectPlay8Server_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c) -#define IDirectPlay8Server_EnumServiceProviders(p,a,b,c,d,e,f) (p)->lpVtbl->EnumServiceProviders(p,a,b,c,d,e,f) -#define IDirectPlay8Server_CancelAsyncOperation(p,a,b) (p)->lpVtbl->CancelAsyncOperation(p,a,b) -#define IDirectPlay8Server_GetSendQueueInfo(p,a,b,c,d) (p)->lpVtbl->GetSendQueueInfo(p,a,b,c,d) -#define IDirectPlay8Server_GetApplicationDesc(p,a,b,c) (p)->lpVtbl->GetApplicationDesc(p,a,b,c) -#define IDirectPlay8Server_SetServerInfo(p,a,b,c,d) (p)->lpVtbl->SetServerInfo(p,a,b,c,d) -#define IDirectPlay8Server_GetClientInfo(p,a,b,c,d) (p)->lpVtbl->GetClientInfo(p,a,b,c,d) -#define IDirectPlay8Server_GetClientAddress(p,a,b,c) (p)->lpVtbl->GetClientAddress(p,a,b,c) -#define IDirectPlay8Server_GetLocalHostAddresses(p,a,b,c) (p)->lpVtbl->GetLocalHostAddresses(p,a,b,c) -#define IDirectPlay8Server_SetApplicationDesc(p,a,b) (p)->lpVtbl->SetApplicationDesc(p,a,b) -#define IDirectPlay8Server_Host(p,a,b,c,d,e,f,g) (p)->lpVtbl->Host(p,a,b,c,d,e,f,g) -#define IDirectPlay8Server_SendTo(p,a,b,c,d,e,f,g) (p)->lpVtbl->SendTo(p,a,b,c,d,e,f,g) -#define IDirectPlay8Server_CreateGroup(p,a,b,c,d,e) (p)->lpVtbl->CreateGroup(p,a,b,c,d,e) -#define IDirectPlay8Server_DestroyGroup(p,a,b,c,d) (p)->lpVtbl->DestroyGroup(p,a,b,c,d) -#define IDirectPlay8Server_AddPlayerToGroup(p,a,b,c,d,e) (p)->lpVtbl->AddPlayerToGroup(p,a,b,c,d,e) -#define IDirectPlay8Server_RemovePlayerFromGroup(p,a,b,c,d,e) (p)->lpVtbl->RemovePlayerFromGroup(p,a,b,c,d,e) -#define IDirectPlay8Server_SetGroupInfo(p,a,b,c,d,e) (p)->lpVtbl->SetGroupInfo(p,a,b,c,d,e) -#define IDirectPlay8Server_GetGroupInfo(p,a,b,c,d) (p)->lpVtbl->GetGroupInfo(p,a,b,c,d) -#define IDirectPlay8Server_EnumPlayersAndGroups(p,a,b,c) (p)->lpVtbl->EnumPlayersAndGroups(p,a,b,c) -#define IDirectPlay8Server_EnumGroupMembers(p,a,b,c,d) (p)->lpVtbl->EnumGroupMembers(p,a,b,c,d) -#define IDirectPlay8Server_Close(p,a) (p)->lpVtbl->Close(p,a) -#define IDirectPlay8Server_DestroyClient(p,a,b,c,d) (p)->lpVtbl->DestroyClient(p,a,b,c,d) -#define IDirectPlay8Server_ReturnBuffer(p,a,b) (p)->lpVtbl->ReturnBuffer(p,a,b) -#define IDirectPlay8Server_GetPlayerContext(p,a,b,c) (p)->lpVtbl->GetPlayerContext(p,a,b,c) -#define IDirectPlay8Server_GetGroupContext(p,a,b,c) (p)->lpVtbl->GetGroupContext(p,a,b,c) -#define IDirectPlay8Server_GetCaps(p,a,b) (p)->lpVtbl->GetCaps(p,a,b) -#define IDirectPlay8Server_SetCaps(p,a,b) (p)->lpVtbl->SetCaps(p,a,b) -#define IDirectPlay8Server_SetSPCaps(p,a,b,c) (p)->lpVtbl->SetSPCaps(p,a,b,c) -#define IDirectPlay8Server_GetSPCaps(p,a,b,c) (p)->lpVtbl->GetSPCaps(p,a,b,c) -#define IDirectPlay8Server_GetConnectionInfo(p,a,b,c) (p)->lpVtbl->GetConnectionInfo(p,a,b,c) -#define IDirectPlay8Server_RegisterLobby(p,a,b,c) (p)->lpVtbl->RegisterLobby(p,a,b,c) - -#define IDirectPlay8Peer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectPlay8Peer_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectPlay8Peer_Release(p) (p)->lpVtbl->Release(p) -#define IDirectPlay8Peer_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c) -#define IDirectPlay8Peer_EnumServiceProviders(p,a,b,c,d,e,f) (p)->lpVtbl->EnumServiceProviders(p,a,b,c,d,e,f) -#define IDirectPlay8Peer_EnumHosts(p,a,b,c,d,e,f,g,h,i,j,k) (p)->lpVtbl->EnumHosts(p,a,b,c,d,e,f,g,h,i,j,k) - -#define IDirectPlay8Peer_CancelAsyncOperation(p,a,b) (p)->lpVtbl->CancelAsyncOperation(p,a,b) -#define IDirectPlay8Peer_Connect(p,a,b,c,d,e,f,g,h,i,j,k) (p)->lpVtbl->Connect(p,a,b,c,d,e,f,g,h,i,j,k) -#define IDirectPlay8Peer_SendTo(p,a,b,c,d,e,f,g) (p)->lpVtbl->SendTo(p,a,b,c,d,e,f,g) -#define IDirectPlay8Peer_GetSendQueueInfo(p,a,b,c,d) (p)->lpVtbl->GetSendQueueInfo(p,a,b,c,d) -#define IDirectPlay8Peer_Host(p,a,b,c,d,e,f,g) (p)->lpVtbl->Host(p,a,b,c,d,e,f,g) -#define IDirectPlay8Peer_GetApplicationDesc(p,a,b,c) (p)->lpVtbl->GetApplicationDesc(p,a,b,c) -#define IDirectPlay8Peer_SetApplicationDesc(p,a,b) (p)->lpVtbl->SetApplicationDesc(p,a,b) -#define IDirectPlay8Peer_CreateGroup(p,a,b,c,d,e) (p)->lpVtbl->CreateGroup(p,a,b,c,d,e) -#define IDirectPlay8Peer_DestroyGroup(p,a,b,c,d) (p)->lpVtbl->DestroyGroup(p,a,b,c,d) -#define IDirectPlay8Peer_AddPlayerToGroup(p,a,b,c,d,e) (p)->lpVtbl->AddPlayerToGroup(p,a,b,c,d,e) -#define IDirectPlay8Peer_RemovePlayerFromGroup(p,a,b,c,d,e) (p)->lpVtbl->RemovePlayerFromGroup(p,a,b,c,d,e) -#define IDirectPlay8Peer_SetGroupInfo(p,a,b,c,d,e) (p)->lpVtbl->SetGroupInfo(p,a,b,c,d,e) -#define IDirectPlay8Peer_GetGroupInfo(p,a,b,c,d) (p)->lpVtbl->GetGroupInfo(p,a,b,c,d) -#define IDirectPlay8Peer_EnumPlayersAndGroups(p,a,b,c) (p)->lpVtbl->EnumPlayersAndGroups(p,a,b,c) -#define IDirectPlay8Peer_EnumGroupMembers(p,a,b,c,d) (p)->lpVtbl->EnumGroupMembers(p,a,b,c,d) -#define IDirectPlay8Peer_SetPeerInfo(p,a,b,c,d) (p)->lpVtbl->SetPeerInfo(p,a,b,c,d) -#define IDirectPlay8Peer_GetPeerInfo(p,a,b,c,d) (p)->lpVtbl->GetPeerInfo(p,a,b,c,d) -#define IDirectPlay8Peer_GetPeerAddress(p,a,b,c) (p)->lpVtbl->GetPeerAddress(p,a,b,c) -#define IDirectPlay8Peer_GetLocalHostAddresses(p,a,b,c) (p)->lpVtbl->GetLocalHostAddresses(p,a,b,c) -#define IDirectPlay8Peer_Close(p,a) (p)->lpVtbl->Close(p,a) -#define IDirectPlay8Peer_EnumHosts(p,a,b,c,d,e,f,g,h,i,j,k) (p)->lpVtbl->EnumHosts(p,a,b,c,d,e,f,g,h,i,j,k) -#define IDirectPlay8Peer_DestroyPeer(p,a,b,c,d) (p)->lpVtbl->DestroyPeer(p,a,b,c,d) -#define IDirectPlay8Peer_ReturnBuffer(p,a,b) (p)->lpVtbl->ReturnBuffer(p,a,b) -#define IDirectPlay8Peer_GetPlayerContext(p,a,b,c) (p)->lpVtbl->GetPlayerContext(p,a,b,c) -#define IDirectPlay8Peer_GetGroupContext(p,a,b,c) (p)->lpVtbl->GetGroupContext(p,a,b,c) -#define IDirectPlay8Peer_GetCaps(p,a,b) (p)->lpVtbl->GetCaps(p,a,b) -#define IDirectPlay8Peer_SetCaps(p,a,b) (p)->lpVtbl->SetCaps(p,a,b) -#define IDirectPlay8Peer_SetSPCaps(p,a,b,c) (p)->lpVtbl->SetSPCaps(p,a,b,c) -#define IDirectPlay8Peer_GetSPCaps(p,a,b,c) (p)->lpVtbl->GetSPCaps(p,a,b,c) -#define IDirectPlay8Peer_GetConnectionInfo(p,a,b,c) (p)->lpVtbl->GetConnectionInfo(p,a,b,c) -#define IDirectPlay8Peer_RegisterLobby(p,a,b,c) (p)->lpVtbl->RegisterLobby(p,a,b,c) -#define IDirectPlay8Peer_TerminateSession(p,a,b,c) (p)->lpVtbl->TerminateSession(p,a,b,c) - -#else /* C++ */ - -#define IDirectPlay8Client_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectPlay8Client_AddRef(p) (p)->AddRef() -#define IDirectPlay8Client_Release(p) (p)->Release() -#define IDirectPlay8Client_Initialize(p,a,b,c) (p)->Initialize(a,b,c) -#define IDirectPlay8Client_EnumServiceProviders(p,a,b,c,d,e,f) (p)->EnumServiceProviders(a,b,c,d,e,f) -#define IDirectPlay8Client_EnumHosts(p,a,b,c,d,e,f,g,h,i,j,k) (p)->EnumHosts(a,b,c,d,e,f,g,h,i,j,k) -#define IDirectPlay8Client_CancelAsyncOperation(p,a,b) (p)->CancelAsyncOperation(a,b) -#define IDirectPlay8Client_Connect(p,a,b,c,d,e,f,g,h,i,j) (p)->Connect(a,b,c,d,e,f,g,h,i,j) -#define IDirectPlay8Client_Send(p,a,b,c,d,e,f) (p)->Send(a,b,c,d,e,f) -#define IDirectPlay8Client_GetSendQueueInfo(p,a,b,c) (p)->GetSendQueueInfo(a,b,c) -#define IDirectPlay8Client_GetApplicationDesc(p,a,b,c) (p)->GetApplicationDesc(a,b,c) -#define IDirectPlay8Client_SetClientInfo(p,a,b,c,d) (p)->SetClientInfo(a,b,c,d) -#define IDirectPlay8Client_GetServerInfo(p,a,b,c) (p)->GetServerInfo(a,b,c) -#define IDirectPlay8Client_GetServerAddress(p,a,b) (p)->GetServerAddress(a,b) -#define IDirectPlay8Client_Close(p,a) (p)->Close(a) -#define IDirectPlay8Client_ReturnBuffer(p,a,b) (p)->ReturnBuffer(a,b) -#define IDirectPlay8Client_GetCaps(p,a,b) (p)->GetCaps(a,b) -#define IDirectPlay8Client_SetCaps(p,a,b) (p)->SetCaps(a,b) -#define IDirectPlay8Client_SetSPCaps(p,a,b,c) (p)->SetSPCaps(a,b,c) -#define IDirectPlay8Client_GetSPCaps(p,a,b,c) (p)->GetSPCaps(a,b,c) -#define IDirectPlay8Client_GetConnectionInfo(p,a,b) (p)->GetConnectionInfo(a,b) -#define IDirectPlay8Client_RegisterLobby(p,a,b,c) (p)->RegisterLobby(a,b,c) - -#define IDirectPlay8Server_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectPlay8Server_AddRef(p) (p)->AddRef() -#define IDirectPlay8Server_Release(p) (p)->Release() -#define IDirectPlay8Server_Initialize(p,a,b,c) (p)->Initialize(a,b,c) -#define IDirectPlay8Server_EnumServiceProviders(p,a,b,c,d,e,f) (p)->EnumServiceProviders(a,b,c,d,e,f) -#define IDirectPlay8Server_CancelAsyncOperation(p,a,b) (p)->CancelAsyncOperation(a,b) -#define IDirectPlay8Server_GetSendQueueInfo(p,a,b,c,d) (p)->GetSendQueueInfo(a,b,c,d) -#define IDirectPlay8Server_GetApplicationDesc(p,a,b,c) (p)->GetApplicationDesc(a,b,c) -#define IDirectPlay8Server_SetServerInfo(p,a,b,c,d) (p)->SetServerInfo(a,b,c,d) -#define IDirectPlay8Server_GetClientInfo(p,a,b,c,d) (p)->GetClientInfo(a,b,c,d) -#define IDirectPlay8Server_GetClientAddress(p,a,b,c) (p)->GetClientAddress(a,b,c) -#define IDirectPlay8Server_GetLocalHostAddresses(p,a,b,c) (p)->GetLocalHostAddresses(a,b,c) -#define IDirectPlay8Server_SetApplicationDesc(p,a,b) (p)->SetApplicationDesc(a,b) -#define IDirectPlay8Server_Host(p,a,b,c,d,e,f,g) (p)->Host(a,b,c,d,e,f,g) -#define IDirectPlay8Server_SendTo(p,a,b,c,d,e,f,g) (p)->SendTo(a,b,c,d,e,f,g) -#define IDirectPlay8Server_CreateGroup(p,a,b,c,d,e) (p)->CreateGroup(a,b,c,d,e) -#define IDirectPlay8Server_DestroyGroup(p,a,b,c,d) (p)->DestroyGroup(a,b,c,d) -#define IDirectPlay8Server_AddPlayerToGroup(p,a,b,c,d,e) (p)->AddPlayerToGroup(a,b,c,d,e) -#define IDirectPlay8Server_RemovePlayerFromGroup(p,a,b,c,d,e) (p)->RemovePlayerFromGroup(a,b,c,d,e) -#define IDirectPlay8Server_SetGroupInfo(p,a,b,c,d,e) (p)->SetGroupInfo(a,b,c,d,e) -#define IDirectPlay8Server_GetGroupInfo(p,a,b,c,d) (p)->GetGroupInfo(a,b,c,d) -#define IDirectPlay8Server_EnumPlayersAndGroups(p,a,b,c) (p)->EnumPlayersAndGroups(a,b,c) -#define IDirectPlay8Server_EnumGroupMembers(p,a,b,c,d) (p)->EnumGroupMembers(a,b,c,d) -#define IDirectPlay8Server_Close(p,a) (p)->Close(a) -#define IDirectPlay8Server_DestroyClient(p,a,b,c,d) (p)->DestroyClient(a,b,c,d) -#define IDirectPlay8Server_ReturnBuffer(p,a,b) (p)->ReturnBuffer(a,b) -#define IDirectPlay8Server_GetPlayerContext(p,a,b,c) (p)->GetPlayerContext(a,b,c) -#define IDirectPlay8Server_GetGroupContext(p,a,b,c) (p)->GetGroupContext(a,b,c) -#define IDirectPlay8Server_GetCaps(p,a,b) (p)->GetCaps(a,b) -#define IDirectPlay8Server_SetCaps(p,a,b) (p)->SetCaps(a,b) -#define IDirectPlay8Server_SetSPCaps(p,a,b,c) (p)->SetSPCaps(a,b,c) -#define IDirectPlay8Server_GetSPCaps(p,a,b,c) (p)->GetSPCaps(a,b,c) -#define IDirectPlay8Server_GetConnectionInfo(p,a,b,c) (p)->GetConnectionInfo(a,b,c) -#define IDirectPlay8Server_RegisterLobby(p,a,b,c) (p)->RegisterLobby(a,b,c) - -#define IDirectPlay8Peer_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectPlay8Peer_AddRef(p) (p)->AddRef() -#define IDirectPlay8Peer_Release(p) (p)->Release() -#define IDirectPlay8Peer_Initialize(p,a,b,c) (p)->Initialize(a,b,c) -#define IDirectPlay8Peer_EnumServiceProviders(p,a,b,c,d,e,f) (p)->EnumServiceProviders(a,b,c,d,e,f) -#define IDirectPlay8Peer_EnumHosts(p,a,b,c,d,e,f,g,h,i,j,k) (p)->EnumHosts(a,b,c,d,e,f,g,h,i,j,k) -#define IDirectPlay8Peer_CancelAsyncOperation(p,a,b) (p)->CancelAsyncOperation(a,b) -#define IDirectPlay8Peer_Connect(p,a,b,c,d,e,f,g,h,i,j,k) (p)->Connect(a,b,c,d,e,f,g,h,i,j,k) -#define IDirectPlay8Peer_SendTo(p,a,b,c,d,e,f,g) (p)->SendTo(a,b,c,d,e,f,g) -#define IDirectPlay8Peer_GetSendQueueInfo(p,a,b,c,d) (p)->GetSendQueueInfo(a,b,c,d) -#define IDirectPlay8Peer_Host(p,a,b,c,d,e,f,g) (p)->Host(a,b,c,d,e,f,g) -#define IDirectPlay8Peer_GetApplicationDesc(p,a,b,c) (p)->GetApplicationDesc(a,b,c) -#define IDirectPlay8Peer_SetApplicationDesc(p,a,b) (p)->SetApplicationDesc(a,b) -#define IDirectPlay8Peer_CreateGroup(p,a,b,c,d,e) (p)->CreateGroup(a,b,c,d,e) -#define IDirectPlay8Peer_DestroyGroup(p,a,b,c,d) (p)->DestroyGroup(a,b,c,d) -#define IDirectPlay8Peer_AddPlayerToGroup(p,a,b,c,d,e) (p)->AddPlayerToGroup(a,b,c,d,e) -#define IDirectPlay8Peer_RemovePlayerFromGroup(p,a,b,c,d,e) (p)->RemovePlayerFromGroup(a,b,c,d,e) -#define IDirectPlay8Peer_SetGroupInfo(p,a,b,c,d,e) (p)->SetGroupInfo(a,b,c,d,e) -#define IDirectPlay8Peer_GetGroupInfo(p,a,b,c,d) (p)->GetGroupInfo(a,b,c,d) -#define IDirectPlay8Peer_EnumPlayersAndGroups(p,a,b,c) (p)->EnumPlayersAndGroups(a,b,c) -#define IDirectPlay8Peer_EnumGroupMembers(p,a,b,c,d) (p)->EnumGroupMembers(a,b,c,d) -#define IDirectPlay8Peer_SetPeerInfo(p,a,b,c,d) (p)->SetPeerInfo(a,b,c,d) -#define IDirectPlay8Peer_GetPeerInfo(p,a,b,c,d) (p)->GetPeerInfo(a,b,c,d) -#define IDirectPlay8Peer_GetPeerAddress(p,a,b,c) (p)->GetPeerAddress(a,b,c) -#define IDirectPlay8Peer_GetLocalHostAddresses(p,a,b,c) (p)->GetLocalHostAddresses(a,b,c) -#define IDirectPlay8Peer_Close(p,a) (p)->Close(a) -#define IDirectPlay8Peer_EnumHosts(p,a,b,c,d,e,f,g,h,i,j,k) (p)->EnumHosts(a,b,c,d,e,f,g,h,i,j,k) -#define IDirectPlay8Peer_DestroyPeer(p,a,b,c,d) (p)->DestroyPeer(a,b,c,d) -#define IDirectPlay8Peer_ReturnBuffer(p,a,b) (p)->ReturnBuffer(a,b) -#define IDirectPlay8Peer_GetPlayerContext(p,a,b,c) (p)->GetPlayerContext(a,b,c) -#define IDirectPlay8Peer_GetGroupContext(p,a,b,c) (p)->GetGroupContext(a,b,c) -#define IDirectPlay8Peer_GetCaps(p,a,b) (p)->GetCaps(a,b) -#define IDirectPlay8Peer_SetCaps(p,a,b) (p)->SetCaps(a,b) -#define IDirectPlay8Peer_SetSPCaps(p,a,b,c) (p)->SetSPCaps(a,b,c) -#define IDirectPlay8Peer_GetSPCaps(p,a,b,c) (p)->GetSPCaps(a,b,c) -#define IDirectPlay8Peer_GetConnectionInfo(p,a,b,c) (p)->GetConnectionInfo(a,b,c) -#define IDirectPlay8Peer_RegisterLobby(p,a,b,c) (p)->RegisterLobby(a,b,c) -#define IDirectPlay8Peer_TerminateSession(p,a,b,c) (p)->TerminateSession(a,b,c) - -#endif - -/**************************************************************************** - * - * DIRECTPLAY8 ERRORS - * - * Errors are represented by negative values and cannot be combined. - * - ****************************************************************************/ - -#define _DPN_FACILITY_CODE 0x015 -#define _DPNHRESULT_BASE 0x8000 -#define MAKE_DPNHRESULT( code ) MAKE_HRESULT( 1, _DPN_FACILITY_CODE, ( code + _DPNHRESULT_BASE ) ) - -#define DPN_OK S_OK - -#define DPNSUCCESS_EQUAL MAKE_HRESULT( 0, _DPN_FACILITY_CODE, ( 0x5 + _DPNHRESULT_BASE ) ) -#define DPNSUCCESS_NOTEQUAL MAKE_HRESULT( 0, _DPN_FACILITY_CODE, (0x0A + _DPNHRESULT_BASE ) ) -#define DPNSUCCESS_PENDING MAKE_HRESULT( 0, _DPN_FACILITY_CODE, (0x0e + _DPNHRESULT_BASE ) ) - -#define DPNERR_ABORTED MAKE_DPNHRESULT( 0x30 ) -#define DPNERR_ADDRESSING MAKE_DPNHRESULT( 0x40 ) -#define DPNERR_ALREADYCLOSING MAKE_DPNHRESULT( 0x50 ) -#define DPNERR_ALREADYCONNECTED MAKE_DPNHRESULT( 0x60 ) -#define DPNERR_ALREADYDISCONNECTING MAKE_DPNHRESULT( 0x70 ) -#define DPNERR_ALREADYINITIALIZED MAKE_DPNHRESULT( 0x80 ) -#define DPNERR_ALREADYREGISTERED MAKE_DPNHRESULT( 0x90 ) -#define DPNERR_BUFFERTOOSMALL MAKE_DPNHRESULT( 0x100 ) -#define DPNERR_CANNOTCANCEL MAKE_DPNHRESULT( 0x110 ) -#define DPNERR_CANTCREATEGROUP MAKE_DPNHRESULT( 0x120 ) -#define DPNERR_CANTCREATEPLAYER MAKE_DPNHRESULT( 0x130 ) -#define DPNERR_CANTLAUNCHAPPLICATION MAKE_DPNHRESULT( 0x140 ) -#define DPNERR_CONNECTING MAKE_DPNHRESULT( 0x150 ) -#define DPNERR_CONNECTIONLOST MAKE_DPNHRESULT( 0x160 ) -#define DPNERR_CONVERSION MAKE_DPNHRESULT( 0x170 ) -#define DPNERR_DATATOOLARGE MAKE_DPNHRESULT( 0x175 ) -#define DPNERR_DOESNOTEXIST MAKE_DPNHRESULT( 0x180 ) -#define DPNERR_DUPLICATECOMMAND MAKE_DPNHRESULT( 0x190 ) -#define DPNERR_ENDPOINTNOTRECEIVING MAKE_DPNHRESULT( 0x200 ) -#define DPNERR_ENUMQUERYTOOLARGE MAKE_DPNHRESULT( 0x210 ) -#define DPNERR_ENUMRESPONSETOOLARGE MAKE_DPNHRESULT( 0x220 ) -#define DPNERR_EXCEPTION MAKE_DPNHRESULT( 0x230 ) -#define DPNERR_GENERIC E_FAIL -#define DPNERR_GROUPNOTEMPTY MAKE_DPNHRESULT( 0x240 ) -#define DPNERR_HOSTING MAKE_DPNHRESULT( 0x250 ) -#define DPNERR_HOSTREJECTEDCONNECTION MAKE_DPNHRESULT( 0x260 ) -#define DPNERR_HOSTTERMINATEDSESSION MAKE_DPNHRESULT( 0x270 ) -#define DPNERR_INCOMPLETEADDRESS MAKE_DPNHRESULT( 0x280 ) -#define DPNERR_INVALIDADDRESSFORMAT MAKE_DPNHRESULT( 0x290 ) -#define DPNERR_INVALIDAPPLICATION MAKE_DPNHRESULT( 0x300 ) -#define DPNERR_INVALIDCOMMAND MAKE_DPNHRESULT( 0x310 ) -#define DPNERR_INVALIDDEVICEADDRESS MAKE_DPNHRESULT( 0x320 ) -#define DPNERR_INVALIDENDPOINT MAKE_DPNHRESULT( 0x330 ) -#define DPNERR_INVALIDFLAGS MAKE_DPNHRESULT( 0x340 ) -#define DPNERR_INVALIDGROUP MAKE_DPNHRESULT( 0x350 ) -#define DPNERR_INVALIDHANDLE MAKE_DPNHRESULT( 0x360 ) -#define DPNERR_INVALIDHOSTADDRESS MAKE_DPNHRESULT( 0x370 ) -#define DPNERR_INVALIDINSTANCE MAKE_DPNHRESULT( 0x380 ) -#define DPNERR_INVALIDINTERFACE MAKE_DPNHRESULT( 0x390 ) -#define DPNERR_INVALIDOBJECT MAKE_DPNHRESULT( 0x400 ) -#define DPNERR_INVALIDPARAM E_INVALIDARG -#define DPNERR_INVALIDPASSWORD MAKE_DPNHRESULT( 0x410 ) -#define DPNERR_INVALIDPLAYER MAKE_DPNHRESULT( 0x420 ) -#define DPNERR_INVALIDPOINTER E_POINTER -#define DPNERR_INVALIDPRIORITY MAKE_DPNHRESULT( 0x430 ) -#define DPNERR_INVALIDSTRING MAKE_DPNHRESULT( 0x440 ) -#define DPNERR_INVALIDURL MAKE_DPNHRESULT( 0x450 ) -#define DPNERR_INVALIDVERSION MAKE_DPNHRESULT( 0x460 ) -#define DPNERR_NOCAPS MAKE_DPNHRESULT( 0x470 ) -#define DPNERR_NOCONNECTION MAKE_DPNHRESULT( 0x480 ) -#define DPNERR_NOHOSTPLAYER MAKE_DPNHRESULT( 0x490 ) -#define DPNERR_NOINTERFACE E_NOINTERFACE -#define DPNERR_NOMOREADDRESSCOMPONENTS MAKE_DPNHRESULT( 0x500 ) -#define DPNERR_NORESPONSE MAKE_DPNHRESULT( 0x510 ) -#define DPNERR_NOTALLOWED MAKE_DPNHRESULT( 0x520 ) -#define DPNERR_NOTHOST MAKE_DPNHRESULT( 0x530 ) -#define DPNERR_NOTREADY MAKE_DPNHRESULT( 0x540 ) -#define DPNERR_NOTREGISTERED MAKE_DPNHRESULT( 0x550 ) -#define DPNERR_OUTOFMEMORY E_OUTOFMEMORY -#define DPNERR_PENDING DPNSUCCESS_PENDING -#define DPNERR_PLAYERALREADYINGROUP MAKE_DPNHRESULT( 0x560 ) -#define DPNERR_PLAYERLOST MAKE_DPNHRESULT( 0x570 ) -#define DPNERR_PLAYERNOTINGROUP MAKE_DPNHRESULT( 0x580 ) -#define DPNERR_PLAYERNOTREACHABLE MAKE_DPNHRESULT( 0x590 ) -#define DPNERR_SENDTOOLARGE MAKE_DPNHRESULT( 0x600 ) -#define DPNERR_SESSIONFULL MAKE_DPNHRESULT( 0x610 ) -#define DPNERR_TABLEFULL MAKE_DPNHRESULT( 0x620 ) -#define DPNERR_TIMEDOUT MAKE_DPNHRESULT( 0x630 ) -#define DPNERR_UNINITIALIZED MAKE_DPNHRESULT( 0x640 ) -#define DPNERR_UNSUPPORTED E_NOTIMPL -#define DPNERR_USERCANCEL MAKE_DPNHRESULT( 0x650 ) - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/import/DirectX8/include/dplobby.h b/import/DirectX8/include/dplobby.h deleted file mode 100644 index c91d3238c..000000000 --- a/import/DirectX8/include/dplobby.h +++ /dev/null @@ -1,853 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) 1996-1997 Microsoft Corporation. All Rights Reserved. - * - * File: dplobby.h - * Content: DirectPlayLobby include file - ***************************************************************************/ -#ifndef __DPLOBBY_INCLUDED__ -#define __DPLOBBY_INCLUDED__ - -#include "dplay.h" - -/* avoid warnings at Level 4 */ -#pragma warning(disable:4201) - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* - * GUIDS used by DirectPlay objects - */ - -/* {AF465C71-9588-11cf-A020-00AA006157AC} */ -DEFINE_GUID(IID_IDirectPlayLobby, 0xaf465c71, 0x9588, 0x11cf, 0xa0, 0x20, 0x0, 0xaa, 0x0, 0x61, 0x57, 0xac); -/* {26C66A70-B367-11cf-A024-00AA006157AC} */ -DEFINE_GUID(IID_IDirectPlayLobbyA, 0x26c66a70, 0xb367, 0x11cf, 0xa0, 0x24, 0x0, 0xaa, 0x0, 0x61, 0x57, 0xac); -/* {0194C220-A303-11d0-9C4F-00A0C905425E} */ -DEFINE_GUID(IID_IDirectPlayLobby2, 0x194c220, 0xa303, 0x11d0, 0x9c, 0x4f, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e); -/* {1BB4AF80-A303-11d0-9C4F-00A0C905425E} */ -DEFINE_GUID(IID_IDirectPlayLobby2A, 0x1bb4af80, 0xa303, 0x11d0, 0x9c, 0x4f, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e); -/* {2DB72490-652C-11d1-A7A8-0000F803ABFC} */ -DEFINE_GUID(IID_IDirectPlayLobby3, 0x2db72490, 0x652c, 0x11d1, 0xa7, 0xa8, 0x0, 0x0, 0xf8, 0x3, 0xab, 0xfc); -/* {2DB72491-652C-11d1-A7A8-0000F803ABFC} */ -DEFINE_GUID(IID_IDirectPlayLobby3A, 0x2db72491, 0x652c, 0x11d1, 0xa7, 0xa8, 0x0, 0x0, 0xf8, 0x3, 0xab, 0xfc); -/* {2FE8F810-B2A5-11d0-A787-0000F803ABFC} */ -DEFINE_GUID(CLSID_DirectPlayLobby, 0x2fe8f810, 0xb2a5, 0x11d0, 0xa7, 0x87, 0x0, 0x0, 0xf8, 0x3, 0xab, 0xfc); - - -/**************************************************************************** - * - * IDirectPlayLobby Structures - * - * Various structures used to invoke DirectPlayLobby. - * - ****************************************************************************/ - -typedef struct IDirectPlayLobby FAR *LPDIRECTPLAYLOBBY; -typedef struct IDirectPlayLobby FAR *LPDIRECTPLAYLOBBYA; -typedef struct IDirectPlayLobby IDirectPlayLobbyA; - -typedef struct IDirectPlayLobby2 FAR *LPDIRECTPLAYLOBBY2; -typedef struct IDirectPlayLobby2 FAR *LPDIRECTPLAYLOBBY2A; -typedef struct IDirectPlayLobby2 IDirectPlayLobby2A; - -typedef struct IDirectPlayLobby3 FAR *LPDIRECTPLAYLOBBY3; -typedef struct IDirectPlayLobby3 FAR *LPDIRECTPLAYLOBBY3A; -typedef struct IDirectPlayLobby3 IDirectPlayLobby3A; - - -/* - * DPLAPPINFO - * Used to hold information about a registered DirectPlay - * application - */ -typedef struct DPLAPPINFO -{ - DWORD dwSize; // Size of this structure - GUID guidApplication; // GUID of the Application - union - { - LPSTR lpszAppNameA; // Pointer to the Application Name - LPWSTR lpszAppName; - }; - -} DPLAPPINFO, FAR *LPDPLAPPINFO; - -/* - * LPCDPLAPPINFO - * A constant pointer to DPLAPPINFO - */ -typedef const DPLAPPINFO FAR *LPCDPLAPPINFO; - -/* - * DPCOMPOUNDADDRESSELEMENT - * - * An array of these is passed to CreateCompoundAddresses() - */ -typedef struct DPCOMPOUNDADDRESSELEMENT -{ - GUID guidDataType; - DWORD dwDataSize; - LPVOID lpData; -} DPCOMPOUNDADDRESSELEMENT, FAR *LPDPCOMPOUNDADDRESSELEMENT; - -/* - * LPCDPCOMPOUNDADDRESSELEMENT - * A constant pointer to DPCOMPOUNDADDRESSELEMENT - */ -typedef const DPCOMPOUNDADDRESSELEMENT FAR *LPCDPCOMPOUNDADDRESSELEMENT; - -/* - * LPDPAPPLICATIONDESC - * Used to register a DirectPlay application - */ -typedef struct DPAPPLICATIONDESC -{ - DWORD dwSize; - DWORD dwFlags; - union - { - LPSTR lpszApplicationNameA; - LPWSTR lpszApplicationName; - }; - GUID guidApplication; - union - { - LPSTR lpszFilenameA; - LPWSTR lpszFilename; - }; - union - { - LPSTR lpszCommandLineA; - LPWSTR lpszCommandLine; - }; - union - { - LPSTR lpszPathA; - LPWSTR lpszPath; - }; - union - { - LPSTR lpszCurrentDirectoryA; - LPWSTR lpszCurrentDirectory; - }; - LPSTR lpszDescriptionA; - LPWSTR lpszDescriptionW; -} DPAPPLICATIONDESC, *LPDPAPPLICATIONDESC; - -/* - * LPDPAPPLICATIONDESC2 - * Used to register a DirectPlay application - */ -typedef struct DPAPPLICATIONDESC2 -{ - DWORD dwSize; - DWORD dwFlags; - union - { - LPSTR lpszApplicationNameA; - LPWSTR lpszApplicationName; - }; - GUID guidApplication; - union - { - LPSTR lpszFilenameA; - LPWSTR lpszFilename; - }; - union - { - LPSTR lpszCommandLineA; - LPWSTR lpszCommandLine; - }; - union - { - LPSTR lpszPathA; - LPWSTR lpszPath; - }; - union - { - LPSTR lpszCurrentDirectoryA; - LPWSTR lpszCurrentDirectory; - }; - LPSTR lpszDescriptionA; - LPWSTR lpszDescriptionW; - union - { - LPSTR lpszAppLauncherNameA; - LPWSTR lpszAppLauncherName; - }; -} DPAPPLICATIONDESC2, *LPDPAPPLICATIONDESC2; - - -/**************************************************************************** - * - * Enumeration Method Callback Prototypes - * - ****************************************************************************/ - -/* - * Callback for EnumAddress() - */ -typedef BOOL (FAR PASCAL *LPDPENUMADDRESSCALLBACK)( - REFGUID guidDataType, - DWORD dwDataSize, - LPCVOID lpData, - LPVOID lpContext); - -/* - * Callback for EnumAddressTypes() - */ -typedef BOOL (FAR PASCAL *LPDPLENUMADDRESSTYPESCALLBACK)( - REFGUID guidDataType, - LPVOID lpContext, - DWORD dwFlags); - -/* - * Callback for EnumLocalApplications() - */ -typedef BOOL (FAR PASCAL * LPDPLENUMLOCALAPPLICATIONSCALLBACK)( - LPCDPLAPPINFO lpAppInfo, - LPVOID lpContext, - DWORD dwFlags); - - -/**************************************************************************** - * - * DirectPlayLobby API Prototypes - * - ****************************************************************************/ -#ifdef UNICODE -#define DirectPlayLobbyCreate DirectPlayLobbyCreateW -#else -#define DirectPlayLobbyCreate DirectPlayLobbyCreateA -#endif /* UNICODE */ - -extern HRESULT WINAPI DirectPlayLobbyCreateW(LPGUID, LPDIRECTPLAYLOBBY *, IUnknown *, LPVOID, DWORD ); -extern HRESULT WINAPI DirectPlayLobbyCreateA(LPGUID, LPDIRECTPLAYLOBBYA *, IUnknown *, LPVOID, DWORD ); - - -/**************************************************************************** - * - * IDirectPlayLobby (and IDirectPlayLobbyA) Interface - * - ****************************************************************************/ -#undef INTERFACE -#define INTERFACE IDirectPlayLobby -DECLARE_INTERFACE_( IDirectPlayLobby, IUnknown ) -{ - /* IUnknown Methods */ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectPlayLobby Methods */ - STDMETHOD(Connect) (THIS_ DWORD, LPDIRECTPLAY2 *, IUnknown FAR *) PURE; - STDMETHOD(CreateAddress) (THIS_ REFGUID, REFGUID, LPCVOID, DWORD, LPVOID, LPDWORD) PURE; - STDMETHOD(EnumAddress) (THIS_ LPDPENUMADDRESSCALLBACK, LPCVOID, DWORD, LPVOID) PURE; - STDMETHOD(EnumAddressTypes) (THIS_ LPDPLENUMADDRESSTYPESCALLBACK, REFGUID, LPVOID, DWORD) PURE; - STDMETHOD(EnumLocalApplications)(THIS_ LPDPLENUMLOCALAPPLICATIONSCALLBACK, LPVOID, DWORD) PURE; - STDMETHOD(GetConnectionSettings)(THIS_ DWORD, LPVOID, LPDWORD) PURE; - STDMETHOD(ReceiveLobbyMessage) (THIS_ DWORD, DWORD, LPDWORD, LPVOID, LPDWORD) PURE; - STDMETHOD(RunApplication) (THIS_ DWORD, LPDWORD, LPDPLCONNECTION, HANDLE) PURE; - STDMETHOD(SendLobbyMessage) (THIS_ DWORD, DWORD, LPVOID, DWORD) PURE; - STDMETHOD(SetConnectionSettings)(THIS_ DWORD, DWORD, LPDPLCONNECTION) PURE; - STDMETHOD(SetLobbyMessageEvent) (THIS_ DWORD, DWORD, HANDLE) PURE; - -}; - -/**************************************************************************** - * - * IDirectPlayLobby2 (and IDirectPlayLobby2A) Interface - * - ****************************************************************************/ -#undef INTERFACE -#define INTERFACE IDirectPlayLobby2 -DECLARE_INTERFACE_( IDirectPlayLobby2, IDirectPlayLobby ) -{ - /* IUnknown Methods */ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectPlayLobby Methods */ - STDMETHOD(Connect) (THIS_ DWORD, LPDIRECTPLAY2 *, IUnknown FAR *) PURE; - STDMETHOD(CreateAddress) (THIS_ REFGUID, REFGUID, LPCVOID, DWORD, LPVOID, LPDWORD) PURE; - STDMETHOD(EnumAddress) (THIS_ LPDPENUMADDRESSCALLBACK, LPCVOID, DWORD, LPVOID) PURE; - STDMETHOD(EnumAddressTypes) (THIS_ LPDPLENUMADDRESSTYPESCALLBACK, REFGUID, LPVOID, DWORD) PURE; - STDMETHOD(EnumLocalApplications)(THIS_ LPDPLENUMLOCALAPPLICATIONSCALLBACK, LPVOID, DWORD) PURE; - STDMETHOD(GetConnectionSettings)(THIS_ DWORD, LPVOID, LPDWORD) PURE; - STDMETHOD(ReceiveLobbyMessage) (THIS_ DWORD, DWORD, LPDWORD, LPVOID, LPDWORD) PURE; - STDMETHOD(RunApplication) (THIS_ DWORD, LPDWORD, LPDPLCONNECTION, HANDLE) PURE; - STDMETHOD(SendLobbyMessage) (THIS_ DWORD, DWORD, LPVOID, DWORD) PURE; - STDMETHOD(SetConnectionSettings)(THIS_ DWORD, DWORD, LPDPLCONNECTION) PURE; - STDMETHOD(SetLobbyMessageEvent) (THIS_ DWORD, DWORD, HANDLE) PURE; - - /* IDirectPlayLobby2 Methods */ - STDMETHOD(CreateCompoundAddress)(THIS_ LPCDPCOMPOUNDADDRESSELEMENT,DWORD,LPVOID,LPDWORD) PURE; -}; - -/**************************************************************************** - * - * IDirectPlayLobby3 (and IDirectPlayLobby3A) Interface - * - ****************************************************************************/ -#undef INTERFACE -#define INTERFACE IDirectPlayLobby3 -DECLARE_INTERFACE_( IDirectPlayLobby3, IDirectPlayLobby ) -{ - /* IUnknown Methods */ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IDirectPlayLobby Methods */ - STDMETHOD(Connect) (THIS_ DWORD, LPDIRECTPLAY2 *, IUnknown FAR *) PURE; - STDMETHOD(CreateAddress) (THIS_ REFGUID, REFGUID, LPCVOID, DWORD, LPVOID, LPDWORD) PURE; - STDMETHOD(EnumAddress) (THIS_ LPDPENUMADDRESSCALLBACK, LPCVOID, DWORD, LPVOID) PURE; - STDMETHOD(EnumAddressTypes) (THIS_ LPDPLENUMADDRESSTYPESCALLBACK, REFGUID, LPVOID, DWORD) PURE; - STDMETHOD(EnumLocalApplications)(THIS_ LPDPLENUMLOCALAPPLICATIONSCALLBACK, LPVOID, DWORD) PURE; - STDMETHOD(GetConnectionSettings)(THIS_ DWORD, LPVOID, LPDWORD) PURE; - STDMETHOD(ReceiveLobbyMessage) (THIS_ DWORD, DWORD, LPDWORD, LPVOID, LPDWORD) PURE; - STDMETHOD(RunApplication) (THIS_ DWORD, LPDWORD, LPDPLCONNECTION, HANDLE) PURE; - STDMETHOD(SendLobbyMessage) (THIS_ DWORD, DWORD, LPVOID, DWORD) PURE; - STDMETHOD(SetConnectionSettings)(THIS_ DWORD, DWORD, LPDPLCONNECTION) PURE; - STDMETHOD(SetLobbyMessageEvent) (THIS_ DWORD, DWORD, HANDLE) PURE; - - /* IDirectPlayLobby2 Methods */ - STDMETHOD(CreateCompoundAddress)(THIS_ LPCDPCOMPOUNDADDRESSELEMENT,DWORD,LPVOID,LPDWORD) PURE; - - /* IDirectPlayLobby3 Methods */ - STDMETHOD(ConnectEx) (THIS_ DWORD, REFIID, LPVOID *, IUnknown FAR *) PURE; - STDMETHOD(RegisterApplication) (THIS_ DWORD, LPVOID) PURE; - STDMETHOD(UnregisterApplication)(THIS_ DWORD, REFGUID) PURE; - STDMETHOD(WaitForConnectionSettings)(THIS_ DWORD) PURE; -}; - -/**************************************************************************** - * - * IDirectPlayLobby interface macros - * - ****************************************************************************/ - -#if !defined(__cplusplus) || defined(CINTERFACE) - -#define IDirectPlayLobby_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectPlayLobby_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectPlayLobby_Release(p) (p)->lpVtbl->Release(p) -#define IDirectPlayLobby_Connect(p,a,b,c) (p)->lpVtbl->Connect(p,a,b,c) -#define IDirectPlayLobby_ConnectEx(p,a,b,c,d) (p)->lpVtbl->ConnectEx(p,a,b,c,d) -#define IDirectPlayLobby_CreateAddress(p,a,b,c,d,e,f) (p)->lpVtbl->CreateAddress(p,a,b,c,d,e,f) -#define IDirectPlayLobby_CreateCompoundAddress(p,a,b,c,d) (p)->lpVtbl->CreateCompoundAddress(p,a,b,c,d) -#define IDirectPlayLobby_EnumAddress(p,a,b,c,d) (p)->lpVtbl->EnumAddress(p,a,b,c,d) -#define IDirectPlayLobby_EnumAddressTypes(p,a,b,c,d) (p)->lpVtbl->EnumAddressTypes(p,a,b,c,d) -#define IDirectPlayLobby_EnumLocalApplications(p,a,b,c) (p)->lpVtbl->EnumLocalApplications(p,a,b,c) -#define IDirectPlayLobby_GetConnectionSettings(p,a,b,c) (p)->lpVtbl->GetConnectionSettings(p,a,b,c) -#define IDirectPlayLobby_ReceiveLobbyMessage(p,a,b,c,d,e) (p)->lpVtbl->ReceiveLobbyMessage(p,a,b,c,d,e) -#define IDirectPlayLobby_RegisterApplication(p,a,b) (p)->lpVtbl->RegisterApplication(p,a,b) -#define IDirectPlayLobby_RunApplication(p,a,b,c,d) (p)->lpVtbl->RunApplication(p,a,b,c,d) -#define IDirectPlayLobby_SendLobbyMessage(p,a,b,c,d) (p)->lpVtbl->SendLobbyMessage(p,a,b,c,d) -#define IDirectPlayLobby_SetConnectionSettings(p,a,b,c) (p)->lpVtbl->SetConnectionSettings(p,a,b,c) -#define IDirectPlayLobby_SetLobbyMessageEvent(p,a,b,c) (p)->lpVtbl->SetLobbyMessageEvent(p,a,b,c) -#define IDirectPlayLobby_UnregisterApplication(p,a,b) (p)->lpVtbl->UnregisterApplication(p,a,b) -#define IDirectPlayLobby_WaitForConnectionSettings(p,a) (p)->lpVtbl->WaitForConnectionSettings(p,a) - -#else /* C++ */ - -#define IDirectPlayLobby_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectPlayLobby_AddRef(p) (p)->AddRef() -#define IDirectPlayLobby_Release(p) (p)->Release() -#define IDirectPlayLobby_Connect(p,a,b,c) (p)->Connect(a,b,c) -#define IDirectPlayLobby_ConnectEx(p,a,b,c,d) (p)->ConnectEx(a,b,c,d) -#define IDirectPlayLobby_CreateAddress(p,a,b,c,d,e,f) (p)->CreateAddress(a,b,c,d,e,f) -#define IDirectPlayLobby_CreateCompoundAddress(p,a,b,c,d) (p)->CreateCompoundAddress(a,b,c,d) -#define IDirectPlayLobby_EnumAddress(p,a,b,c,d) (p)->EnumAddress(a,b,c,d) -#define IDirectPlayLobby_EnumAddressTypes(p,a,b,c,d) (p)->EnumAddressTypes(a,b,c,d) -#define IDirectPlayLobby_EnumLocalApplications(p,a,b,c) (p)->EnumLocalApplications(a,b,c) -#define IDirectPlayLobby_GetConnectionSettings(p,a,b,c) (p)->GetConnectionSettings(a,b,c) -#define IDirectPlayLobby_ReceiveLobbyMessage(p,a,b,c,d,e) (p)->ReceiveLobbyMessage(a,b,c,d,e) -#define IDirectPlayLobby_RegisterApplication(p,a,b) (p)->RegisterApplication(a,b) -#define IDirectPlayLobby_RunApplication(p,a,b,c,d) (p)->RunApplication(a,b,c,d) -#define IDirectPlayLobby_SendLobbyMessage(p,a,b,c,d) (p)->SendLobbyMessage(a,b,c,d) -#define IDirectPlayLobby_SetConnectionSettings(p,a,b,c) (p)->SetConnectionSettings(a,b,c) -#define IDirectPlayLobby_SetLobbyMessageEvent(p,a,b,c) (p)->SetLobbyMessageEvent(a,b,c) -#define IDirectPlayLobby_UnregisterApplication(p,a,b) (p)->UnregisterApplication(a,b) -#define IDirectPlayLobby_WaitForConnectionSettings(p,a) (p)->WaitForConnectionSettings(a) - -#endif - -/**************************************************************************** - * - * DirectPlayLobby Flags - * - ****************************************************************************/ - -/* - * This flag is used by IDirectPlayLobby->WaitForConnectionSettings to - * cancel a current wait that is in progress. - */ -#define DPLWAIT_CANCEL 0x00000001 - - -/* - * This is a message flag used by ReceiveLobbyMessage. It can be - * returned in the dwMessageFlags parameter to indicate a message from - * the system. - */ -#define DPLMSG_SYSTEM 0x00000001 - -/* - * This is a message flag used by ReceiveLobbyMessage and SendLobbyMessage. - * It is used to indicate that the message is a standard lobby message. - * DPLMSG_SETPROPERTY, DPLMSG_SETPROPERTYRESPONSE, DPLMSG_GETPROPERTY, - * DPLMSG_GETPROPERTYRESPONSE - */ -#define DPLMSG_STANDARD 0x00000002 - -/* - * Lobbyable Application registration flags - */ - -/* - * Applications registered with this flag will not show up when - * applications are enumerated in the lobby. This application - * will only be able to be launched by a lobby client that already - * knows about the application. - */ -#define DPLAPP_NOENUM 0x80000000 - -/* - * Applications registered with this flag want voice to automatically - * be enabled for their application. All players will be launched into - * an 'n'-way voice conference when the application is started. The - * user will be able to enable this flag for existing non-voice - * directplay applications. - */ -#define DPLAPP_AUTOVOICE 0x00000001 - -/* - * Applications that do their own voice conferencing should register with - * this flag to avoid allowing the user to enable other voice chat - * capabilites during the same session. This is to avoid users forcing - * the DPLAPP_AUTOVOICE flag for the application. - */ -#define DPLAPP_SELFVOICE 0x00000002 - -/**************************************************************************** - * - * DirectPlayLobby messages and message data structures - * - * All system messages have a dwMessageFlags value of DPLMSG_SYSTEM returned - * from a call to ReceiveLobbyMessage. - * - * All standard messages have a dwMessageFlags value of DPLMSG_STANDARD returned - * from a call to ReceiveLobbyMessage. - * - ****************************************************************************/ - -/* - * DPLMSG_GENERIC - * Generic message structure used to identify the message type. - */ -typedef struct _DPLMSG_GENERIC -{ - DWORD dwType; // Message type -} DPLMSG_GENERIC, FAR *LPDPLMSG_GENERIC; - -/* - * DPLMSG_SYSTEMMESSAGE - * Generic message format for all system messages -- - * DPLSYS_CONNECTIONSETTINGSREAD, DPLSYS_DPLYCONNECTSUCCEEDED, - * DPLSYS_DPLAYCONNECTFAILED, DPLSYS_APPTERMINATED, DPLSYS_NEWCONNECTIONSETTINGS - */ -typedef struct _DPLMSG_SYSTEMMESSAGE -{ - DWORD dwType; // Message type - GUID guidInstance; // Instance GUID of the dplay session the message corresponds to -} DPLMSG_SYSTEMMESSAGE, FAR *LPDPLMSG_SYSTEMMESSAGE; - -/* - * DPLMSG_SETPROPERTY - * Standard message sent by an application to a lobby to set a - * property - */ -typedef struct _DPLMSG_SETPROPERTY -{ - DWORD dwType; // Message type - DWORD dwRequestID; // Request ID (DPL_NOCONFIRMATION if no confirmation desired) - GUID guidPlayer; // Player GUID - GUID guidPropertyTag; // Property GUID - DWORD dwDataSize; // Size of data - DWORD dwPropertyData[1]; // Buffer containing data -} DPLMSG_SETPROPERTY, FAR *LPDPLMSG_SETPROPERTY; - -#define DPL_NOCONFIRMATION 0 - -/* - * DPLMSG_SETPROPERTYRESPONSE - * Standard message returned by a lobby to confirm a - * DPLMSG_SETPROPERTY message. - */ -typedef struct _DPLMSG_SETPROPERTYRESPONSE -{ - DWORD dwType; // Message type - DWORD dwRequestID; // Request ID - GUID guidPlayer; // Player GUID - GUID guidPropertyTag; // Property GUID - HRESULT hr; // Return Code -} DPLMSG_SETPROPERTYRESPONSE, FAR *LPDPLMSG_SETPROPERTYRESPONSE; - -/* - * DPLMSG_GETPROPERTY - * Standard message sent by an application to a lobby to request - * the current value of a property - */ -typedef struct _DPLMSG_GETPROPERTY -{ - DWORD dwType; // Message type - DWORD dwRequestID; // Request ID - GUID guidPlayer; // Player GUID - GUID guidPropertyTag; // Property GUID -} DPLMSG_GETPROPERTY, FAR *LPDPLMSG_GETPROPERTY; - -/* - * DPLMSG_GETPROPERTYRESPONSE - * Standard message returned by a lobby in response to a - * DPLMSG_GETPROPERTY message. - */ -typedef struct _DPLMSG_GETPROPERTYRESPONSE -{ - DWORD dwType; // Message type - DWORD dwRequestID; // Request ID - GUID guidPlayer; // Player GUID - GUID guidPropertyTag; // Property GUID - HRESULT hr; // Return Code - DWORD dwDataSize; // Size of data - DWORD dwPropertyData[1]; // Buffer containing data -} DPLMSG_GETPROPERTYRESPONSE, FAR *LPDPLMSG_GETPROPERTYRESPONSE; - -/* - * DPLMSG_NEWSESSIONHOST - * Standard message returned by a lobby in response to a - * the session host migrating to a new client - */ -typedef struct _DPLMSG_NEWSESSIONHOST -{ - DWORD dwType; // Message type - GUID guidInstance; // GUID Instance of the session -} DPLMSG_NEWSESSIONHOST, FAR *LPDPLMSG_NEWSESSIONHOST; - - -/****************************************** - * - * DirectPlay Lobby message dwType values - * - *****************************************/ - -/* - * The application has read the connection settings. - * It is now O.K. for the lobby client to release - * its IDirectPlayLobby interface. - */ -#define DPLSYS_CONNECTIONSETTINGSREAD 0x00000001 - -/* - * The application's call to DirectPlayConnect failed - */ -#define DPLSYS_DPLAYCONNECTFAILED 0x00000002 - -/* - * The application has created a DirectPlay session. - */ -#define DPLSYS_DPLAYCONNECTSUCCEEDED 0x00000003 - -/* - * The application has terminated. - */ -#define DPLSYS_APPTERMINATED 0x00000004 - -/* - * The message is a DPLMSG_SETPROPERTY message. - */ -#define DPLSYS_SETPROPERTY 0x00000005 - -/* - * The message is a DPLMSG_SETPROPERTYRESPONSE message. - */ -#define DPLSYS_SETPROPERTYRESPONSE 0x00000006 - -/* - * The message is a DPLMSG_GETPROPERTY message. - */ -#define DPLSYS_GETPROPERTY 0x00000007 - -/* - * The message is a DPLMSG_GETPROPERTYRESPONSE message. - */ -#define DPLSYS_GETPROPERTYRESPONSE 0x00000008 - -/* - * The message is a DPLMSG_NEWSESSIONHOST message. - */ -#define DPLSYS_NEWSESSIONHOST 0x00000009 - -/* - * New connection settings are available. - */ -#define DPLSYS_NEWCONNECTIONSETTINGS 0x0000000A - -/* - * The Lobby Client has released the DirectPlayLobby Interface - */ -#define DPLSYS_LOBBYCLIENTRELEASE 0x0000000B - -/**************************************************************************** - * - * DirectPlay defined property GUIDs and associated data structures - * - ****************************************************************************/ - -/* - * DPLPROPERTY_MessagesSupported - * - * Request whether the lobby supports standard. Lobby with respond with either - * TRUE or FALSE or may not respond at all. - * - * Property data is a single BOOL with TRUE or FALSE - */ -// {762CCDA1-D916-11d0-BA39-00C04FD7ED67} -DEFINE_GUID(DPLPROPERTY_MessagesSupported, -0x762ccda1, 0xd916, 0x11d0, 0xba, 0x39, 0x0, 0xc0, 0x4f, 0xd7, 0xed, 0x67); - -/* - * DPLPROPERTY_LobbyGuid - * - * Request the GUID that identifies the lobby software that the application - * is communicating with. - * - * Property data is a single GUID. - */ -// {F56920A0-D218-11d0-BA39-00C04FD7ED67} -DEFINE_GUID(DPLPROPERTY_LobbyGuid, -0xf56920a0, 0xd218, 0x11d0, 0xba, 0x39, 0x0, 0xc0, 0x4f, 0xd7, 0xed, 0x67); - -/* - * DPLPROPERTY_PlayerGuid - * - * Request the GUID that identifies the player on this machine for sending - * property data back to the lobby. - * - * Property data is the DPLDATA_PLAYERDATA structure - */ -// {B4319322-D20D-11d0-BA39-00C04FD7ED67} -DEFINE_GUID(DPLPROPERTY_PlayerGuid, -0xb4319322, 0xd20d, 0x11d0, 0xba, 0x39, 0x0, 0xc0, 0x4f, 0xd7, 0xed, 0x67); - -/* - * DPLDATA_PLAYERGUID - * - * Data structure to hold the GUID of the player and player creation flags - * from the lobby. - */ -typedef struct _DPLDATA_PLAYERGUID -{ - GUID guidPlayer; - DWORD dwPlayerFlags; -} DPLDATA_PLAYERGUID, FAR *LPDPLDATA_PLAYERGUID; - -/* - * DPLPROPERTY_PlayerScore - * - * Used to send an array of long integers to the lobby indicating the - * score of a player. - * - * Property data is the DPLDATA_PLAYERSCORE structure. - */ -// {48784000-D219-11d0-BA39-00C04FD7ED67} -DEFINE_GUID(DPLPROPERTY_PlayerScore, -0x48784000, 0xd219, 0x11d0, 0xba, 0x39, 0x0, 0xc0, 0x4f, 0xd7, 0xed, 0x67); - -/* - * DPLDATA_PLAYERSCORE - * - * Data structure to hold an array of long integers representing a player score. - * Application must allocate enough memory to hold all the scores. - */ -typedef struct _DPLDATA_PLAYERSCORE -{ - DWORD dwScoreCount; - LONG Score[1]; -} DPLDATA_PLAYERSCORE, FAR *LPDPLDATA_PLAYERSCORE; - -/**************************************************************************** - * - * DirectPlay Address ID's - * - ****************************************************************************/ - -/* DirectPlay Address - * - * A DirectPlay address consists of multiple chunks of data, each tagged - * with a GUID signifying the type of data in the chunk. The chunk also - * has a length so that unknown chunk types can be skipped. - * - * The EnumAddress() function is used to parse these address data chunks. - */ - -/* - * DPADDRESS - * - * Header for block of address data elements - */ -typedef struct _DPADDRESS -{ - GUID guidDataType; - DWORD dwDataSize; -} DPADDRESS; - -typedef DPADDRESS FAR *LPDPADDRESS; - -/* - * DPAID_TotalSize - * - * Chunk is a DWORD containing size of entire DPADDRESS structure - */ - -// {1318F560-912C-11d0-9DAA-00A0C90A43CB} -DEFINE_GUID(DPAID_TotalSize, -0x1318f560, 0x912c, 0x11d0, 0x9d, 0xaa, 0x0, 0xa0, 0xc9, 0xa, 0x43, 0xcb); - -/* - * DPAID_ServiceProvider - * - * Chunk is a GUID describing the service provider that created the chunk. - * All addresses must contain this chunk. - */ - -// {07D916C0-E0AF-11cf-9C4E-00A0C905425E} -DEFINE_GUID(DPAID_ServiceProvider, -0x7d916c0, 0xe0af, 0x11cf, 0x9c, 0x4e, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e); - -/* - * DPAID_LobbyProvider - * - * Chunk is a GUID describing the lobby provider that created the chunk. - * All addresses must contain this chunk. - */ - -// {59B95640-9667-11d0-A77D-0000F803ABFC} -DEFINE_GUID(DPAID_LobbyProvider, -0x59b95640, 0x9667, 0x11d0, 0xa7, 0x7d, 0x0, 0x0, 0xf8, 0x3, 0xab, 0xfc); - -/* - * DPAID_Phone and DPAID_PhoneW - * - * Chunk is a string containing a phone number (i.e. "1-800-555-1212") - * in ANSI or UNICODE format - */ - -// {78EC89A0-E0AF-11cf-9C4E-00A0C905425E} -DEFINE_GUID(DPAID_Phone, -0x78ec89a0, 0xe0af, 0x11cf, 0x9c, 0x4e, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e); - -// {BA5A7A70-9DBF-11d0-9CC1-00A0C905425E} -DEFINE_GUID(DPAID_PhoneW, -0xba5a7a70, 0x9dbf, 0x11d0, 0x9c, 0xc1, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e); - -/* - * DPAID_Modem and DPAID_ModemW - * - * Chunk is a string containing a modem name registered with TAPI - * in ANSI or UNICODE format - */ - -// {F6DCC200-A2FE-11d0-9C4F-00A0C905425E} -DEFINE_GUID(DPAID_Modem, -0xf6dcc200, 0xa2fe, 0x11d0, 0x9c, 0x4f, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e); - -// {01FD92E0-A2FF-11d0-9C4F-00A0C905425E} -DEFINE_GUID(DPAID_ModemW, -0x1fd92e0, 0xa2ff, 0x11d0, 0x9c, 0x4f, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e); - -/* - * DPAID_Inet and DPAID_InetW - * - * Chunk is a string containing a TCP/IP host name or an IP address - * (i.e. "dplay.microsoft.com" or "137.55.100.173") in ANSI or UNICODE format - */ - -// {C4A54DA0-E0AF-11cf-9C4E-00A0C905425E} -DEFINE_GUID(DPAID_INet, -0xc4a54da0, 0xe0af, 0x11cf, 0x9c, 0x4e, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e); - -// {E63232A0-9DBF-11d0-9CC1-00A0C905425E} -DEFINE_GUID(DPAID_INetW, -0xe63232a0, 0x9dbf, 0x11d0, 0x9c, 0xc1, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e); - -/* - * DPAID_InetPort - * - * Chunk is the port number used for creating the apps TCP and UDP sockets. - * WORD value (i.e. 47624). - */ - -// {E4524541-8EA5-11d1-8A96-006097B01411} -DEFINE_GUID(DPAID_INetPort, -0xe4524541, 0x8ea5, 0x11d1, 0x8a, 0x96, 0x0, 0x60, 0x97, 0xb0, 0x14, 0x11); - -#ifdef BIGMESSAGEDEFENSE -#endif - -/* - * DPCOMPORTADDRESS - * - * Used to specify com port settings. The constants that define baud rate, - * stop bits and parity are defined in WINBASE.H. The constants for flow - * control are given below. - */ - -#define DPCPA_NOFLOW 0 // no flow control -#define DPCPA_XONXOFFFLOW 1 // software flow control -#define DPCPA_RTSFLOW 2 // hardware flow control with RTS -#define DPCPA_DTRFLOW 3 // hardware flow control with DTR -#define DPCPA_RTSDTRFLOW 4 // hardware flow control with RTS and DTR - -typedef struct _DPCOMPORTADDRESS -{ - DWORD dwComPort; // COM port to use (1-4) - DWORD dwBaudRate; // baud rate (100-256k) - DWORD dwStopBits; // no. stop bits (1-2) - DWORD dwParity; // parity (none, odd, even, mark) - DWORD dwFlowControl; // flow control (none, xon/xoff, rts, dtr) -} DPCOMPORTADDRESS; - -typedef DPCOMPORTADDRESS FAR *LPDPCOMPORTADDRESS; - -/* - * DPAID_ComPort - * - * Chunk contains a DPCOMPORTADDRESS structure defining the serial port. - */ - -// {F2F0CE00-E0AF-11cf-9C4E-00A0C905425E} -DEFINE_GUID(DPAID_ComPort, -0xf2f0ce00, 0xe0af, 0x11cf, 0x9c, 0x4e, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e); - -/**************************************************************************** - * - * dplobby 1.0 obsolete definitions - * Included for compatibility only. - * - ****************************************************************************/ -#define DPLAD_SYSTEM DPLMSG_SYSTEM - - -#ifdef __cplusplus -}; -#endif /* __cplusplus */ - -#pragma warning(default:4201) - -#endif /* __DPLOBBY_INCLUDED__ */ - diff --git a/import/DirectX8/include/dplobby8.h b/import/DirectX8/include/dplobby8.h deleted file mode 100644 index e63a5aac1..000000000 --- a/import/DirectX8/include/dplobby8.h +++ /dev/null @@ -1,407 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 2000 Microsoft Corporation. All Rights Reserved. - * - * File: DPLobby.h - * Content: DirectPlay8 Lobby Include File - * - ***************************************************************************/ - -#ifndef __DPLOBBY_H__ -#define __DPLOBBY_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/**************************************************************************** - * - * DirectPlay8Lobby CLSIDs - * - ****************************************************************************/ - -// {667955AD-6B3B-43ca-B949-BC69B5BAFF7F} -DEFINE_GUID(CLSID_DirectPlay8LobbiedApplication, -0x667955ad, 0x6b3b, 0x43ca, 0xb9, 0x49, 0xbc, 0x69, 0xb5, 0xba, 0xff, 0x7f); - -// {3B2B6775-70B6-45af-8DEA-A209C69559F3} -DEFINE_GUID(CLSID_DirectPlay8LobbyClient, -0x3b2b6775, 0x70b6, 0x45af, 0x8d, 0xea, 0xa2, 0x9, 0xc6, 0x95, 0x59, 0xf3); - -/**************************************************************************** - * - * DirectPlay8Lobby Interface IIDs - * - ****************************************************************************/ - -// {819074A3-016C-11d3-AE14-006097B01411} -DEFINE_GUID(IID_IDirectPlay8LobbiedApplication, -0x819074a3, 0x16c, 0x11d3, 0xae, 0x14, 0x0, 0x60, 0x97, 0xb0, 0x14, 0x11); - -// {819074A2-016C-11d3-AE14-006097B01411} -DEFINE_GUID(IID_IDirectPlay8LobbyClient, -0x819074a2, 0x16c, 0x11d3, 0xae, 0x14, 0x0, 0x60, 0x97, 0xb0, 0x14, 0x11); - -/**************************************************************************** - * - * DirectPlay8Lobby Interface Pointer - * - ****************************************************************************/ - -typedef struct IDirectPlay8LobbiedApplication *PDIRECTPLAY8LOBBIEDAPPLICATION; -typedef struct IDirectPlay8LobbyClient *PDIRECTPLAY8LOBBYCLIENT; - -/**************************************************************************** - * - * DirectPlay8 Lobby Message IDs - * - ****************************************************************************/ - -#define DPL_MSGID_LOBBY 0x8000 -#define DPL_MSGID_RECEIVE (0x0001 | DPL_MSGID_LOBBY) -#define DPL_MSGID_CONNECT (0x0002 | DPL_MSGID_LOBBY) -#define DPL_MSGID_DISCONNECT (0x0003 | DPL_MSGID_LOBBY) -#define DPL_MSGID_SESSION_STATUS (0x0004 | DPL_MSGID_LOBBY) -#define DPL_MSGID_CONNECTION_SETTINGS (0x0005 | DPL_MSGID_LOBBY) - -/**************************************************************************** - * - * DirectPlay8Lobby Constants - * - ****************************************************************************/ - -// -// Specifies that operation should be performed on all open connections -// -#define DPLHANDLE_ALLCONNECTIONS 0xFFFFFFFF - -// -// The associated game session has suceeded in connecting / hosting -// -#define DPLSESSION_CONNECTED 0x0001 - -// The associated game session failed connecting / hosting -// -#define DPLSESSION_COULDNOTCONNECT 0x0002 - -// -// The associated game session has disconnected -// -#define DPLSESSION_DISCONNECTED 0x0003 - -// -// The associated game session has terminated -// -#define DPLSESSION_TERMINATED 0x0004 - -// -// The associated game session's host has migrated -// -#define DPLSESSION_HOSTMIGRATED 0x0005 - -// -// The associated game session's host has migrated to the local client -// -#define DPLSESSION_HOSTMIGRATEDHERE 0x0006 - - -/**************************************************************************** - * - * DirectPlay8 Lobby Flags - * - ****************************************************************************/ - -// -// Do not automatically make the lobby app unavailable when a connection is established -// -#define DPLAVAILABLE_ALLOWMULTIPLECONNECT 0x0001 - -// -// Launch a new instance of the application to connect to -// -#define DPLCONNECT_LAUNCHNEW 0x0001 - -// -// Launch a new instance of the application if one is not waiting -// -#define DPLCONNECT_LAUNCHNOTFOUND 0x0002 - -// -// When starting the associated game session, start it as a host -// -#define DPLCONNECTSETTINGS_HOST 0x0001 - -// -// Disable parameter validation -// -#define DPLINITIALIZE_DISABLEPARAMVAL 0x0001 - -/**************************************************************************** - * - * DirectPlay8Lobby Structures (Non-Message) - * - ****************************************************************************/ - -// -// Information on a registered game -// -typedef struct _DPL_APPLICATION_INFO { - GUID guidApplication; // GUID of the application - PWSTR pwszApplicationName; // Name of the application - DWORD dwNumRunning; // # of instances of this application running - DWORD dwNumWaiting; // # of instances of this application waiting - DWORD dwFlags; // Flags -} DPL_APPLICATION_INFO, *PDPL_APPLICATION_INFO; - -// -// Settings to be used for connecting / hosting a game session -// -typedef struct _DPL_CONNECTION_SETTINGS { - DWORD dwSize; // Size of this structure - DWORD dwFlags; // Connection settings flags (DPLCONNECTSETTINGS_...) - DPN_APPLICATION_DESC dpnAppDesc; // Application desc for the associated DirectPlay session - IDirectPlay8Address *pdp8HostAddress; // Address of host to connect to - IDirectPlay8Address **ppdp8DeviceAddresses; // Address of device to connect from / host on - DWORD cNumDeviceAddresses; // # of addresses specified in ppdp8DeviceAddresses - PWSTR pwszPlayerName; // Name to give the player -} DPL_CONNECTION_SETTINGS, *PDPL_CONNECTION_SETTINGS; - -// -// Information for performing a lobby connect -// (ConnectApplication) -// -typedef struct _DPL_CONNECT_INFO { - DWORD dwSize; // Size of this structure - DWORD dwFlags; // Flags (DPLCONNECT_...) - GUID guidApplication; // GUID of application to launch - PDPL_CONNECTION_SETTINGS pdplConnectionSettings; - // Settings application should use - PVOID pvLobbyConnectData; // User defined data block - DWORD dwLobbyConnectDataSize; - // Size of user defined data block -} DPL_CONNECT_INFO, *PDPL_CONNECT_INFO; - -// -// Information for registering an application -// (RegisterApplication) -// -typedef struct _DPL_PROGRAM_DESC { - DWORD dwSize; - DWORD dwFlags; - GUID guidApplication; // Application GUID - PWSTR pwszApplicationName; // Unicode application name - PWSTR pwszCommandLine; // Unicode command line arguments - PWSTR pwszCurrentDirectory; // Unicode current directory - PWSTR pwszDescription; // Unicode application description - PWSTR pwszExecutableFilename; // Unicode filename of application executable - PWSTR pwszExecutablePath; // Unicode path of application executable - PWSTR pwszLauncherFilename; // Unicode filename of launcher executable - PWSTR pwszLauncherPath; // Unicode path of launcher executable -} DPL_PROGRAM_DESC, *PDPL_PROGRAM_DESC; - -/**************************************************************************** - * - * DirectPlay8 Lobby Message Structures - * - ****************************************************************************/ - -// -// A connection was established -// (DPL_MSGID_CONNECT) -// -typedef struct _DPL_MESSAGE_CONNECT -{ - DWORD dwSize; // Size of this structure - DPNHANDLE hConnectId; // Handle of new connection - PDPL_CONNECTION_SETTINGS pdplConnectionSettings; // Connection settings for this connection - PVOID pvLobbyConnectData; // User defined lobby data block - DWORD dwLobbyConnectDataSize; // Size of user defined lobby data block - PVOID pvConnectionContext; // Context value for this connection (user set) -} DPL_MESSAGE_CONNECT, *PDPL_MESSAGE_CONNECT; - -// -// Connection settings have been updated -// (DPL_MSGID_CONNECTION_SETTINGS) -// -typedef struct _DPL_MESSAGE_CONNECTION_SETTINGS -{ - DWORD dwSize; // Size of this structure - DPNHANDLE hSender; // Handle of the connection for these settings - PDPL_CONNECTION_SETTINGS pdplConnectionSettings; // Connection settings - PVOID pvConnectionContext; // Context value for this connection -} DPL_MESSAGE_CONNECTION_SETTINGS, *PDPL_MESSAGE_CONNECTION_SETTINGS; - -// -// A connection has been disconnected -// (DPL_MSGID_DISCONNECT) -// -typedef struct _DPL_MESSAGE_DISCONNECT -{ - DWORD dwSize; // Size of this structure - DPNHANDLE hDisconnectId; // Handle of the connection that was terminated - HRESULT hrReason; // Reason the connection was broken - PVOID pvConnectionContext; // Context value for this connection -} DPL_MESSAGE_DISCONNECT, *PDPL_MESSAGE_DISCONNECT; - -// -// Data was received through a connection -// (DPL_MSGID_RECEIVE) -// -typedef struct _DPL_MESSAGE_RECEIVE -{ - DWORD dwSize; // Size of this structure - DPNHANDLE hSender; // Handle of the connection that is from - BYTE *pBuffer; // Contents of the message - DWORD dwBufferSize; // Size of the message context - PVOID pvConnectionContext; // Context value for this connection -} DPL_MESSAGE_RECEIVE, *PDPL_MESSAGE_RECEIVE; - -// -// Current status of the associated connection -// (DPL_MSGID_SESSION_STATUS) -// -typedef struct _DPL_MESSAGE_SESSION_STATUS -{ - DWORD dwSize; // Size of this structure - DPNHANDLE hSender; // Handle of the connection that this is from - DWORD dwStatus; // Status (DPLSESSION_...) - PVOID pvConnectionContext; // Context value for this connection -} DPL_MESSAGE_SESSION_STATUS, *PDPL_MESSAGE_SESSION_STATUS; - -/**************************************************************************** - * - * DirectPlay8Lobby Create - * - ****************************************************************************/ - -/* - * This function is no longer supported. It is recommended that CoCreateInstance be used to create - * DirectPlay8 lobby objects. - * - * extern HRESULT WINAPI DirectPlay8LobbyCreate( const GUID * pcIID, void **ppvInterface, IUnknown *pUnknown); - * - */ - -/**************************************************************************** - * - * DirectPlay8 Functions - * - ****************************************************************************/ - -// -// COM definition for DirectPlayLobbyClient -// -#undef INTERFACE // External COM Implementation -#define INTERFACE IDirectPlay8LobbyClient -DECLARE_INTERFACE_(IDirectPlay8LobbyClient,IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - // IDirectPlayLobbyClient methods - STDMETHOD(Initialize) (THIS_ const PVOID pvUserContext,const PFNDPNMESSAGEHANDLER pfn,const DWORD dwFlags) PURE; - STDMETHOD(EnumLocalPrograms) (THIS_ GUID *const pGuidApplication,BYTE *const pEnumData,DWORD *const pdwEnumData,DWORD *const pdwItems, const DWORD dwFlags) PURE; - STDMETHOD(ConnectApplication) (THIS_ DPL_CONNECT_INFO *const pdplConnectionInfo,const PVOID pvConnectionContext,DPNHANDLE *const hApplication,const DWORD dwTimeOut,const DWORD dwFlags) PURE; - STDMETHOD(Send) (THIS_ const DPNHANDLE hConnection,BYTE *const pBuffer,const DWORD pBufferSize,const DWORD dwFlags) PURE; - STDMETHOD(ReleaseApplication) (THIS_ const DPNHANDLE hConnection, const DWORD dwFlags ) PURE; - STDMETHOD(Close) (THIS_ const DWORD dwFlags ) PURE; - STDMETHOD(GetConnectionSettings) (THIS_ const DPNHANDLE hConnection, DPL_CONNECTION_SETTINGS * const pdplSessionInfo, DWORD *pdwInfoSize, const DWORD dwFlags ) PURE; - STDMETHOD(SetConnectionSettings) (THIS_ const DPNHANDLE hConnection, const DPL_CONNECTION_SETTINGS * const pdplSessionInfo, const DWORD dwFlags ) PURE; -}; - - -// -// COM definition for DirectPlayLobbiedApplication -// -#undef INTERFACE // External COM Implementation -#define INTERFACE IDirectPlay8LobbiedApplication -DECLARE_INTERFACE_(IDirectPlay8LobbiedApplication,IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID riid,LPVOID *ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - // IDirectPlayLobbiedApplication methods - STDMETHOD(Initialize) (THIS_ const PVOID pvUserContext,const PFNDPNMESSAGEHANDLER pfn,DPNHANDLE * const pdpnhConnection, const DWORD dwFlags) PURE; - STDMETHOD(RegisterProgram) (THIS_ PDPL_PROGRAM_DESC pdplProgramDesc,const DWORD dwFlags) PURE; - STDMETHOD(UnRegisterProgram) (THIS_ GUID *pguidApplication,const DWORD dwFlags) PURE; - STDMETHOD(Send) (THIS_ const DPNHANDLE hConnection,BYTE *const pBuffer,const DWORD pBufferSize,const DWORD dwFlags) PURE; - STDMETHOD(SetAppAvailable) (THIS_ const BOOL fAvailable, const DWORD dwFlags ) PURE; - STDMETHOD(UpdateStatus) (THIS_ const DPNHANDLE hConnection, const DWORD dwStatus, const DWORD dwFlags ) PURE; - STDMETHOD(Close) (THIS_ const DWORD dwFlags ) PURE; - STDMETHOD(GetConnectionSettings) (THIS_ const DPNHANDLE hConnection, DPL_CONNECTION_SETTINGS * const pdplSessionInfo, DWORD *pdwInfoSize, const DWORD dwFlags ) PURE; - STDMETHOD(SetConnectionSettings) (THIS_ const DPNHANDLE hConnection, const DPL_CONNECTION_SETTINGS * const pdplSessionInfo, const DWORD dwFlags ) PURE; -}; - - -/**************************************************************************** - * - * DirectPlayLobby Interface Macros - * - ****************************************************************************/ - -#if !defined(__cplusplus) || defined(CINTERFACE) - -#define IDirectPlay8LobbyClient_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectPlay8LobbyClient_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectPlay8LobbyClient_Release(p) (p)->lpVtbl->Release(p) -#define IDirectPlay8LobbyClient_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c) -#define IDirectPlay8LobbyClient_EnumLocalPrograms(p,a,b,c,d,e) (p)->lpVtbl->EnumLocalPrograms(p,a,b,c,d,e) -#define IDirectPlay8LobbyClient_ConnectApplication(p,a,b,c,d,e) (p)->lpVtbl->ConnectApplication(p,a,b,c,d,e) -#define IDirectPlay8LobbyClient_Send(p,a,b,c,d) (p)->lpVtbl->Send(p,a,b,c,d) -#define IDirectPlay8LobbyClient_ReleaseApplication(p,a,b) (p)->lpVtbl->ReleaseApplication(p,a,b) -#define IDirectPlay8LobbyClient_Close(p,a) (p)->lpVtbl->Close(p,a) -#define IDirectPlay8LobbyClient_GetConnectionSettings(p,a,b,c,d) (p)->lpVtbl->GetConnectionSettings(p,a,b,c,d) -#define IDirectPlay8LobbyClient_SetConnectionSettings(p,a,b,c) (p)->lpVtbl->SetConnectionSettings(p,a,b,c) - -#define IDirectPlay8LobbiedApplication_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectPlay8LobbiedApplication_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectPlay8LobbiedApplication_Release(p) (p)->lpVtbl->Release(p) -#define IDirectPlay8LobbiedApplication_Initialize(p,a,b,c,d) (p)->lpVtbl->Initialize(p,a,b,c,d) -#define IDirectPlay8LobbiedApplication_RegisterProgram(p,a,b) (p)->lpVtbl->RegisterProgram(p,a,b) -#define IDirectPlay8LobbiedApplication_UnRegisterProgram(p,a,b) (p)->lpVtbl->UnRegisterProgram(p,a,b) -#define IDirectPlay8LobbiedApplication_Send(p,a,b,c,d) (p)->lpVtbl->Send(p,a,b,c,d) -#define IDirectPlay8LobbiedApplication_SetAppAvailable(p,a,b) (p)->lpVtbl->SetAppAvailable(p,a,b) -#define IDirectPlay8LobbiedApplication_UpdateStatus(p,a,b,c) (p)->lpVtbl->UpdateStatus(p,a,b,c) -#define IDirectPlay8LobbiedApplication_Close(p,a) (p)->lpVtbl->Close(p,a) -#define IDirectPlay8LobbiedApplication_GetConnectionSettings(p,a,b,c,d) (p)->lpVtbl->GetConnectionSettings(p,a,b,c,d) -#define IDirectPlay8LobbiedApplication_SetConnectionSettings(p,a,b,c) (p)->lpVtbl->SetConnectionSettings(p,a,b,c) - -#else /* C++ */ - -#define IDirectPlay8LobbyClient_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectPlay8LobbyClient_AddRef(p) (p)->AddRef() -#define IDirectPlay8LobbyClient_Release(p) (p)->Release() -#define IDirectPlay8LobbyClient_Initialize(p,a,b,c) (p)->Initialize(a,b,c) -#define IDirectPlay8LobbyClient_EnumLocalPrograms(p,a,b,c,d,e) (p)->EnumLocalPrograms(a,b,c,d,e) -#define IDirectPlay8LobbyClient_ConnectApplication(p,a,b,c,d,e) (p)->ConnectApplication(a,b,c,d,e) -#define IDirectPlay8LobbyClient_Send(p,a,b,c,d) (p)->Send(a,b,c,d) -#define IDirectPlay8LobbyClient_ReleaseApplication(p,a,b) (p)->ReleaseApplication(a,b) -#define IDirectPlay8LobbyClient_Close(p,a) (p)->Close(a) -#define IDirectPlay8LobbyClient_GetConnectionSettings(p,a,b,c,d) (p)->GetConnectionSettings(a,b,c,d) -#define IDirectPlay8LobbyClient_SetConnectionSettings(p,a,b,c) (p)->SetConnectionSettings(a,b,c) - -#define IDirectPlay8LobbiedApplication_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectPlay8LobbiedApplication_AddRef(p) (p)->AddRef() -#define IDirectPlay8LobbiedApplication_Release(p) (p)->Release() -#define IDirectPlay8LobbiedApplication_Initialize(p,a,b,c,d) (p)->Initialize(a,b,c,d) -#define IDirectPlay8LobbiedApplication_RegisterProgram(p,a,b) (p)->RegisterProgram(a,b) -#define IDirectPlay8LobbiedApplication_UnRegisterProgram(p,a,b) (p)->UnRegisterProgram(a,b) -#define IDirectPlay8LobbiedApplication_Send(p,a,b,c,d) (p)->Send(a,b,c,d) -#define IDirectPlay8LobbiedApplication_SetAppAvailable(p,a,b) (p)->SetAppAvailable(a,b) -#define IDirectPlay8LobbiedApplication_UpdateStatus(p,a,b,c) (p)->UpdateStatus(a,b,c) -#define IDirectPlay8LobbiedApplication_Close(p,a) (p)->Close(a) -#define IDirectPlay8LobbiedApplication_GetConnectionSettings(p,a,b,c,d) (p)->GetConnectionSettings(a,b,c,d) -#define IDirectPlay8LobbiedApplication_SetConnectionSettings(p,a,b,c) (p)->SetConnectionSettings(a,b,c) - -#endif - -#ifdef __cplusplus -} -#endif - -#endif // __DPLOBBY_H__ - diff --git a/import/DirectX8/include/dsetup.h b/import/DirectX8/include/dsetup.h deleted file mode 100644 index 3f0de4640..000000000 --- a/import/DirectX8/include/dsetup.h +++ /dev/null @@ -1,308 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved. - * - * File: dsetup.h - * Content: DirectXSetup, error codes and flags - ***************************************************************************/ - -#ifndef __DSETUP_H__ -#define __DSETUP_H__ - -#include // windows stuff - -#ifdef _WIN32 -#define COM_NO_WINDOWS_H -#include -#else -#endif - - -#ifdef __cplusplus -extern "C" { -#endif - -#define FOURCC_VERS mmioFOURCC('v','e','r','s') - -// DSETUP Error Codes, must remain compatible with previous setup. -#define DSETUPERR_SUCCESS_RESTART 1 -#define DSETUPERR_SUCCESS 0 -#define DSETUPERR_BADWINDOWSVERSION -1 -#define DSETUPERR_SOURCEFILENOTFOUND -2 -#define DSETUPERR_BADSOURCESIZE -3 -#define DSETUPERR_BADSOURCETIME -4 -#define DSETUPERR_NOCOPY -5 -#define DSETUPERR_OUTOFDISKSPACE -6 -#define DSETUPERR_CANTFINDINF -7 -#define DSETUPERR_CANTFINDDIR -8 -#define DSETUPERR_INTERNAL -9 -#define DSETUPERR_NTWITHNO3D -10 /* REM: obsolete, you'll never see this */ -#define DSETUPERR_UNKNOWNOS -11 -#define DSETUPERR_USERHITCANCEL -12 -#define DSETUPERR_NOTPREINSTALLEDONNT -13 -#define DSETUPERR_NEWERVERSION -14 -#define DSETUPERR_NOTADMIN -15 -#define DSETUPERR_UNSUPPORTEDPROCESSOR -16 - -// DSETUP flags. DirectX 5.0 apps should use these flags only. -#define DSETUP_DDRAWDRV 0x00000008 /* install DirectDraw Drivers */ -#define DSETUP_DSOUNDDRV 0x00000010 /* install DirectSound Drivers */ -#define DSETUP_DXCORE 0x00010000 /* install DirectX runtime */ -#define DSETUP_DIRECTX (DSETUP_DXCORE|DSETUP_DDRAWDRV|DSETUP_DSOUNDDRV) -#define DSETUP_TESTINSTALL 0x00020000 /* just test install, don't do anything */ -#define DSETUP_USEROLDERFLAG 0x02000000 /* enable return DSETUPERR_NEWERVERSION */ - -// These OBSOLETE flags are here for compatibility with pre-DX5 apps only. -// They are present to allow DX3 apps to be recompiled with DX5 and still work. -// DO NOT USE THEM for DX5. They will go away in future DX releases. -#define DSETUP_DDRAW 0x00000001 /* OBSOLETE. install DirectDraw */ -#define DSETUP_DSOUND 0x00000002 /* OBSOLETE. install DirectSound */ -#define DSETUP_DPLAY 0x00000004 /* OBSOLETE. install DirectPlay */ -#define DSETUP_DPLAYSP 0x00000020 /* OBSOLETE. install DirectPlay Providers */ -#define DSETUP_DVIDEO 0x00000040 /* OBSOLETE. install DirectVideo */ -#define DSETUP_D3D 0x00000200 /* OBSOLETE. install Direct3D */ -#define DSETUP_DINPUT 0x00000800 /* OBSOLETE. install DirectInput */ -#define DSETUP_DIRECTXSETUP 0x00001000 /* OBSOLETE. install DirectXSetup DLL's */ -#define DSETUP_NOUI 0x00002000 /* OBSOLETE. install DirectX with NO UI */ -#define DSETUP_PROMPTFORDRIVERS 0x10000000 /* OBSOLETE. prompt when replacing display/audio drivers */ -#define DSETUP_RESTOREDRIVERS 0x20000000 /* OBSOLETE. restore display/audio drivers */ - - - -//****************************************************************** -// DirectX Setup Callback mechanism -//****************************************************************** - -// DSETUP Message Info Codes, passed to callback as Reason parameter. -#define DSETUP_CB_MSG_NOMESSAGE 0 -#define DSETUP_CB_MSG_CANTINSTALL_UNKNOWNOS 1 -#define DSETUP_CB_MSG_CANTINSTALL_NT 2 -#define DSETUP_CB_MSG_CANTINSTALL_BETA 3 -#define DSETUP_CB_MSG_CANTINSTALL_NOTWIN32 4 -#define DSETUP_CB_MSG_CANTINSTALL_WRONGLANGUAGE 5 -#define DSETUP_CB_MSG_CANTINSTALL_WRONGPLATFORM 6 -#define DSETUP_CB_MSG_PREINSTALL_NT 7 -#define DSETUP_CB_MSG_NOTPREINSTALLEDONNT 8 -#define DSETUP_CB_MSG_SETUP_INIT_FAILED 9 -#define DSETUP_CB_MSG_INTERNAL_ERROR 10 -#define DSETUP_CB_MSG_CHECK_DRIVER_UPGRADE 11 -#define DSETUP_CB_MSG_OUTOFDISKSPACE 12 -#define DSETUP_CB_MSG_BEGIN_INSTALL 13 -#define DSETUP_CB_MSG_BEGIN_INSTALL_RUNTIME 14 -#define DSETUP_CB_MSG_BEGIN_INSTALL_DRIVERS 15 -#define DSETUP_CB_MSG_BEGIN_RESTORE_DRIVERS 16 -#define DSETUP_CB_MSG_FILECOPYERROR 17 - - -#define DSETUP_CB_UPGRADE_TYPE_MASK 0x000F -#define DSETUP_CB_UPGRADE_KEEP 0x0001 -#define DSETUP_CB_UPGRADE_SAFE 0x0002 -#define DSETUP_CB_UPGRADE_FORCE 0x0004 -#define DSETUP_CB_UPGRADE_UNKNOWN 0x0008 - -#define DSETUP_CB_UPGRADE_HASWARNINGS 0x0100 -#define DSETUP_CB_UPGRADE_CANTBACKUP 0x0200 - -#define DSETUP_CB_UPGRADE_DEVICE_ACTIVE 0x0800 - -#define DSETUP_CB_UPGRADE_DEVICE_DISPLAY 0x1000 -#define DSETUP_CB_UPGRADE_DEVICE_MEDIA 0x2000 - - -typedef struct _DSETUP_CB_UPGRADEINFO -{ - DWORD UpgradeFlags; -} DSETUP_CB_UPGRADEINFO; - -typedef struct _DSETUP_CB_FILECOPYERROR -{ - DWORD dwError; -} DSETUP_CB_FILECOPYERROR; - - -#ifdef _WIN32 -// -// Data Structures -// -#ifndef UNICODE_ONLY - -typedef struct _DIRECTXREGISTERAPPA { - DWORD dwSize; - DWORD dwFlags; - LPSTR lpszApplicationName; - LPGUID lpGUID; - LPSTR lpszFilename; - LPSTR lpszCommandLine; - LPSTR lpszPath; - LPSTR lpszCurrentDirectory; -} DIRECTXREGISTERAPPA, *PDIRECTXREGISTERAPPA, *LPDIRECTXREGISTERAPPA; - -typedef struct _DIRECTXREGISTERAPP2A { - DWORD dwSize; - DWORD dwFlags; - LPSTR lpszApplicationName; - LPGUID lpGUID; - LPSTR lpszFilename; - LPSTR lpszCommandLine; - LPSTR lpszPath; - LPSTR lpszCurrentDirectory; - LPSTR lpszLauncherName; -} DIRECTXREGISTERAPP2A, *PDIRECTXREGISTERAPP2A, *LPDIRECTXREGISTERAPP2A; - -#endif //!UNICODE_ONLY -#ifndef ANSI_ONLY - -typedef struct _DIRECTXREGISTERAPPW { - DWORD dwSize; - DWORD dwFlags; - LPWSTR lpszApplicationName; - LPGUID lpGUID; - LPWSTR lpszFilename; - LPWSTR lpszCommandLine; - LPWSTR lpszPath; - LPWSTR lpszCurrentDirectory; -} DIRECTXREGISTERAPPW, *PDIRECTXREGISTERAPPW, *LPDIRECTXREGISTERAPPW; - -typedef struct _DIRECTXREGISTERAPP2W { - DWORD dwSize; - DWORD dwFlags; - LPWSTR lpszApplicationName; - LPGUID lpGUID; - LPWSTR lpszFilename; - LPWSTR lpszCommandLine; - LPWSTR lpszPath; - LPWSTR lpszCurrentDirectory; - LPWSTR lpszLauncherName; -} DIRECTXREGISTERAPP2W, *PDIRECTXREGISTERAPP2W, *LPDIRECTXREGISTERAPP2W; -#endif //!ANSI_ONLY -#ifdef UNICODE -typedef DIRECTXREGISTERAPPW DIRECTXREGISTERAPP; -typedef PDIRECTXREGISTERAPPW PDIRECTXREGISTERAPP; -typedef LPDIRECTXREGISTERAPPW LPDIRECTXREGISTERAPP; -typedef DIRECTXREGISTERAPP2W DIRECTXREGISTERAPP2; -typedef PDIRECTXREGISTERAPP2W PDIRECTXREGISTERAPP2; -typedef LPDIRECTXREGISTERAPP2W LPDIRECTXREGISTERAPP2; -#else -typedef DIRECTXREGISTERAPPA DIRECTXREGISTERAPP; -typedef PDIRECTXREGISTERAPPA PDIRECTXREGISTERAPP; -typedef LPDIRECTXREGISTERAPPA LPDIRECTXREGISTERAPP; -typedef DIRECTXREGISTERAPP2A DIRECTXREGISTERAPP2; -typedef PDIRECTXREGISTERAPP2A PDIRECTXREGISTERAPP2; -typedef LPDIRECTXREGISTERAPP2A LPDIRECTXREGISTERAPP2; -#endif // UNICODE - - -// -// API -// - -#ifndef UNICODE_ONLY -INT -WINAPI -DirectXSetupA( - HWND hWnd, - LPSTR lpszRootPath, - DWORD dwFlags - ); -#endif //!UNICODE_ONLY -#ifndef ANSI_ONLY -INT -WINAPI -DirectXSetupW( - HWND hWnd, - LPWSTR lpszRootPath, - DWORD dwFlags - ); -#endif //!ANSI_ONLY -#ifdef UNICODE -#define DirectXSetup DirectXSetupW -#else -#define DirectXSetup DirectXSetupA -#endif // !UNICODE - - -#ifndef UNICODE_ONLY -INT -WINAPI -DirectXDeviceDriverSetupA( - HWND hWnd, - LPSTR lpszDriverClass, - LPSTR lpszDriverPath, - DWORD dwFlags - ); -#endif //!UNICODE_ONLY -#ifndef ANSI_ONLY -INT -WINAPI -DirectXDeviceDriverSetupW( - HWND hWnd, - LPWSTR lpszDriverClass, - LPWSTR lpszDriverPath, - DWORD dwFlags - ); -#endif //!ANSI_ONLY -#ifdef UNICODE -#define DirectXDeviceDriverSetup DirectXDeviceDriverSetupW -#else -#define DirectXDeviceDriverSetup DirectXDeviceDriverSetupA -#endif // !UNICODE - -#ifndef UNICODE_ONLY -INT -WINAPI -DirectXRegisterApplicationA( - HWND hWnd, - LPVOID lpDXRegApp - ); -#endif //!UNICODE_ONLY -#ifndef ANSI_ONLY -INT -WINAPI -DirectXRegisterApplicationW( - HWND hWnd, - LPVOID lpDXRegApp - ); -#endif //!ANSI_ONLY -#ifdef UNICODE -#define DirectXRegisterApplication DirectXRegisterApplicationW -#else -#define DirectXRegisterApplication DirectXRegisterApplicationA -#endif // !UNICODE - -INT -WINAPI -DirectXUnRegisterApplication( - HWND hWnd, - LPGUID lpGUID - ); - -// -// Function Pointers -// -#ifdef UNICODE -typedef INT (WINAPI * LPDIRECTXSETUP)(HWND, LPWSTR, DWORD); -typedef INT (WINAPI * LPDIRECTXDEVICEDRIVERSETUP)(HWND, LPWSTR, LPSTR, DWORD); -typedef INT (WINAPI * LPDIRECTXREGISTERAPPLICATION)(HWND, LPVOID); -#else -typedef INT (WINAPI * LPDIRECTXSETUP)(HWND, LPSTR, DWORD); -typedef INT (WINAPI * LPDIRECTXDEVICEDRIVERSETUP)(HWND, LPSTR, LPSTR, DWORD); -typedef INT (WINAPI * LPDIRECTXREGISTERAPPLICATION)(HWND, LPVOID); -#endif // UNICODE - -typedef DWORD (FAR PASCAL * DSETUP_CALLBACK)(DWORD Reason, - DWORD MsgType, /* Same as flags to MessageBox */ - LPSTR szMessage, - LPSTR szName, - void *pInfo); - -INT WINAPI DirectXSetupSetCallback(DSETUP_CALLBACK Callback); -INT WINAPI DirectXSetupGetVersion(DWORD *lpdwVersion, DWORD *lpdwMinorVersion); - -#endif // WIN32 - - -#ifdef __cplusplus -}; -#endif - -#endif diff --git a/import/DirectX8/include/dshowasf.h b/import/DirectX8/include/dshowasf.h deleted file mode 100644 index 14d194876..000000000 --- a/import/DirectX8/include/dshowasf.h +++ /dev/null @@ -1,329 +0,0 @@ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 6.00.0338 */ -/* Compiler settings for dshowasf.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __dshowasf_h__ -#define __dshowasf_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __IConfigAsfWriter_FWD_DEFINED__ -#define __IConfigAsfWriter_FWD_DEFINED__ -typedef interface IConfigAsfWriter IConfigAsfWriter; -#endif /* __IConfigAsfWriter_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "unknwn.h" -#include "objidl.h" -#include "strmif.h" -#include "wmsdkidl.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void * ); - -/* interface __MIDL_itf_dshowasf_0000 */ -/* [local] */ - -EXTERN_GUID( IID_IConfigAsfWriter,0x45086030,0xF7E4,0x486a,0xB5,0x04,0x82,0x6B,0xB5,0x79,0x2A,0x3B ); - - - - -extern RPC_IF_HANDLE __MIDL_itf_dshowasf_0000_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_dshowasf_0000_v0_0_s_ifspec; - -#ifndef __IConfigAsfWriter_INTERFACE_DEFINED__ -#define __IConfigAsfWriter_INTERFACE_DEFINED__ - -/* interface IConfigAsfWriter */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IConfigAsfWriter; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("45086030-F7E4-486a-B504-826BB5792A3B") - IConfigAsfWriter : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE ConfigureFilterUsingProfileId( - /* [in] */ DWORD dwProfileId) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentProfileId( - /* [out] */ DWORD *pdwProfileId) = 0; - - virtual HRESULT STDMETHODCALLTYPE ConfigureFilterUsingProfileGuid( - /* [in] */ REFGUID guidProfile) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentProfileGuid( - /* [out] */ GUID *pProfileGuid) = 0; - - virtual HRESULT STDMETHODCALLTYPE ConfigureFilterUsingProfile( - /* [in] */ IWMProfile *pProfile) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentProfile( - /* [out] */ IWMProfile **ppProfile) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetIndexMode( - /* [in] */ BOOL bIndexFile) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetIndexMode( - /* [out] */ BOOL *pbIndexFile) = 0; - - }; - -#else /* C style interface */ - - typedef struct IConfigAsfWriterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IConfigAsfWriter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IConfigAsfWriter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IConfigAsfWriter * This); - - HRESULT ( STDMETHODCALLTYPE *ConfigureFilterUsingProfileId )( - IConfigAsfWriter * This, - /* [in] */ DWORD dwProfileId); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentProfileId )( - IConfigAsfWriter * This, - /* [out] */ DWORD *pdwProfileId); - - HRESULT ( STDMETHODCALLTYPE *ConfigureFilterUsingProfileGuid )( - IConfigAsfWriter * This, - /* [in] */ REFGUID guidProfile); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentProfileGuid )( - IConfigAsfWriter * This, - /* [out] */ GUID *pProfileGuid); - - HRESULT ( STDMETHODCALLTYPE *ConfigureFilterUsingProfile )( - IConfigAsfWriter * This, - /* [in] */ IWMProfile *pProfile); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentProfile )( - IConfigAsfWriter * This, - /* [out] */ IWMProfile **ppProfile); - - HRESULT ( STDMETHODCALLTYPE *SetIndexMode )( - IConfigAsfWriter * This, - /* [in] */ BOOL bIndexFile); - - HRESULT ( STDMETHODCALLTYPE *GetIndexMode )( - IConfigAsfWriter * This, - /* [out] */ BOOL *pbIndexFile); - - END_INTERFACE - } IConfigAsfWriterVtbl; - - interface IConfigAsfWriter - { - CONST_VTBL struct IConfigAsfWriterVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IConfigAsfWriter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IConfigAsfWriter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IConfigAsfWriter_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IConfigAsfWriter_ConfigureFilterUsingProfileId(This,dwProfileId) \ - (This)->lpVtbl -> ConfigureFilterUsingProfileId(This,dwProfileId) - -#define IConfigAsfWriter_GetCurrentProfileId(This,pdwProfileId) \ - (This)->lpVtbl -> GetCurrentProfileId(This,pdwProfileId) - -#define IConfigAsfWriter_ConfigureFilterUsingProfileGuid(This,guidProfile) \ - (This)->lpVtbl -> ConfigureFilterUsingProfileGuid(This,guidProfile) - -#define IConfigAsfWriter_GetCurrentProfileGuid(This,pProfileGuid) \ - (This)->lpVtbl -> GetCurrentProfileGuid(This,pProfileGuid) - -#define IConfigAsfWriter_ConfigureFilterUsingProfile(This,pProfile) \ - (This)->lpVtbl -> ConfigureFilterUsingProfile(This,pProfile) - -#define IConfigAsfWriter_GetCurrentProfile(This,ppProfile) \ - (This)->lpVtbl -> GetCurrentProfile(This,ppProfile) - -#define IConfigAsfWriter_SetIndexMode(This,bIndexFile) \ - (This)->lpVtbl -> SetIndexMode(This,bIndexFile) - -#define IConfigAsfWriter_GetIndexMode(This,pbIndexFile) \ - (This)->lpVtbl -> GetIndexMode(This,pbIndexFile) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IConfigAsfWriter_ConfigureFilterUsingProfileId_Proxy( - IConfigAsfWriter * This, - /* [in] */ DWORD dwProfileId); - - -void __RPC_STUB IConfigAsfWriter_ConfigureFilterUsingProfileId_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IConfigAsfWriter_GetCurrentProfileId_Proxy( - IConfigAsfWriter * This, - /* [out] */ DWORD *pdwProfileId); - - -void __RPC_STUB IConfigAsfWriter_GetCurrentProfileId_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IConfigAsfWriter_ConfigureFilterUsingProfileGuid_Proxy( - IConfigAsfWriter * This, - /* [in] */ REFGUID guidProfile); - - -void __RPC_STUB IConfigAsfWriter_ConfigureFilterUsingProfileGuid_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IConfigAsfWriter_GetCurrentProfileGuid_Proxy( - IConfigAsfWriter * This, - /* [out] */ GUID *pProfileGuid); - - -void __RPC_STUB IConfigAsfWriter_GetCurrentProfileGuid_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IConfigAsfWriter_ConfigureFilterUsingProfile_Proxy( - IConfigAsfWriter * This, - /* [in] */ IWMProfile *pProfile); - - -void __RPC_STUB IConfigAsfWriter_ConfigureFilterUsingProfile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IConfigAsfWriter_GetCurrentProfile_Proxy( - IConfigAsfWriter * This, - /* [out] */ IWMProfile **ppProfile); - - -void __RPC_STUB IConfigAsfWriter_GetCurrentProfile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IConfigAsfWriter_SetIndexMode_Proxy( - IConfigAsfWriter * This, - /* [in] */ BOOL bIndexFile); - - -void __RPC_STUB IConfigAsfWriter_SetIndexMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IConfigAsfWriter_GetIndexMode_Proxy( - IConfigAsfWriter * This, - /* [out] */ BOOL *pbIndexFile); - - -void __RPC_STUB IConfigAsfWriter_GetIndexMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IConfigAsfWriter_INTERFACE_DEFINED__ */ - - -/* Additional Prototypes for ALL interfaces */ - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/dv.h b/import/DirectX8/include/dv.h deleted file mode 100644 index d0fe04851..000000000 --- a/import/DirectX8/include/dv.h +++ /dev/null @@ -1,62 +0,0 @@ -//------------------------------------------------------------------------------ -// File: DV.h -// -// Desc: DV typedefs and defines -// -// Copyright (c) 1997-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef _DV_H_ -#define _DV_H_ - -#define DV_DVSD_NTSC_FRAMESIZE 120000L -#define DV_DVSD_PAL_FRAMESIZE 144000L - -#define DV_SMCHN 0x0000e000 -#define DV_AUDIOMODE 0x00000f00 -#define DV_AUDIOSMP 0x38000000 - -#define DV_AUDIOQU 0x07000000 -#define DV_NTSCPAL 0x00200000 -#define DV_STYPE 0x001f0000 - - -//There are NTSC or PAL DV camcorders -#define DV_NTSC 0 -#define DV_PAL 1 - -//DV camcorder can output sd/hd/sl -#define DV_SD 0x00 -#define DV_HD 0x01 -#define DV_SL 0x02 - -//user can choice 12 bits or 16 bits audio from DV camcorder -#define DV_CAP_AUD16Bits 0x00 -#define DV_CAP_AUD12Bits 0x01 - -#define SIZE_DVINFO 0x20 - -typedef struct Tag_DVAudInfo -{ - BYTE bAudStyle[2]; - - //LSB 6 bits for starting DIF sequence number - //MSB 2 bits: 0 for mon. 1: stereo in one 5/6 DIF sequences, 2: stereo audio in both 5/6 DIF sequences - //example: 0x00: mon, audio in first 5/6 DIF sequence - // 0x05: mon, audio in 2nd 5 DIF sequence - // 0x15: stereo, audio only in 2nd 5 DIF sequence - // 0x10: stereo, audio only in 1st 5/6 DIF sequence - // 0x20: stereo, left ch in 1st 5/6 DIF sequence, right ch in 2nd 5/6 DIF sequence - // 0x26: stereo, rightch in 1st 6 DIF sequence, left ch in 2nd 6 DIF sequence - BYTE bAudQu[2]; //qbits, only support 12, 16, - - BYTE bNumAudPin; //how many pins - WORD wAvgSamplesPerPinPerFrm[2]; //sample size for one audio pin in one frame(which has 10 or 12 DIF sequence) - WORD wBlkMode; //45 for NTSC, 54 for PAL - WORD wDIFMode; //5 for NTSC, 6 for PAL - WORD wBlkDiv; //15 for NTSC, 18 for PAL - -} DVAudInfo; - -#endif // _DV_H_ diff --git a/import/DirectX8/include/dvdevcod.h b/import/DirectX8/include/dvdevcod.h deleted file mode 100644 index 69a12c184..000000000 --- a/import/DirectX8/include/dvdevcod.h +++ /dev/null @@ -1,731 +0,0 @@ -//------------------------------------------------------------------------------ -// File: DVDevCod.h -// -// Desc: List of standard DVD-Video event codes and the expected params. -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - -#ifndef __DVDEVCOD__ -#define __DVDEVCOD__ - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// Separate the updated Windows XP version of this header from the downlevel -// version that shipped with the DirectX 8.0 SDK. Since development -// on BDA technology continued for Windows XP, some changes were made to -// this file in order to improve the interface and functionality. -// -// To maintain compatibility with older applications which rely on the -// DirectX 8.0 versions of these files, the DirectX 8.1 version includes -// both the Windows XP content and the DirectX 8.0 content, which are -// separated by the #if (WINVER >= 0x501) preprocessor directive. -// -// Therefore, if you define WINVER to be 0x501 to specify Windows XP, -// the revised content will be compiled. Otherwise, the original -// DirectX 8.0 content will be used. -// -///////////////////////////////////////////////////////////////////////////// - -#if (WINVER >= 0x501) // Windows XP content - - - -#define EC_DVDBASE 0x0100 - -#ifndef EXCLUDE_DVDEVCODE_ENUMS - -typedef enum _tagDVD_ERROR { - DVD_ERROR_Unexpected=1, // Something unexpected happened, perhaps content - // is incorrectly authored. Playback is stopped. - DVD_ERROR_CopyProtectFail=2, // Key exchange for DVD copy protection failed. - // Playback is stopped. - DVD_ERROR_InvalidDVD1_0Disc=3, // DVD-Video disc is incorrectly authored for v1.0 - // of spec. Playback is stopped. - DVD_ERROR_InvalidDiscRegion=4, // The Disc cannot be played because the disc is not - // authored to play in system region. - // The region mismatch may be fixable by - // changing the system region with dvdrgn.exe - DVD_ERROR_LowParentalLevel=5, // Player parental level is lower than the lowest parental - // level available in the DVD content. Playback is stopped. - DVD_ERROR_MacrovisionFail=6, // Macrovision Distribution Failed. - // Playback is stopped. - DVD_ERROR_IncompatibleSystemAndDecoderRegions=7, - // No discs can be played because the system region - // does not match the decoder region. - DVD_ERROR_IncompatibleDiscAndDecoderRegions=8 - // The disc cannot be played because the disc is - // not authored to be played in the decoder's region -} DVD_ERROR; - -typedef enum _tagDVD_WARNING { - DVD_WARNING_InvalidDVD1_0Disc=1,// DVD-Video disc is incorrectly authored. Playback - // can continue, but unexpected behavior may occur. - DVD_WARNING_FormatNotSupported=2,// A decoder would not support the current format. Playback - // of a stream (audio, video of SP) may not function. - // lParam2 contains the stream type (see AM_DVD_STREAM_FLAGS) - DVD_WARNING_IllegalNavCommand=3,// The internal DVD navigation command processor attempted to - // process an illegal command. - DVD_WARNING_Open = 4, // File Open Failed - DVD_WARNING_Seek = 5, // File Seek Failed - DVD_WARNING_Read = 6 // File Read Failed -} DVD_WARNING; - -typedef enum _tagDVD_PB_STOPPED { - DVD_PB_STOPPED_Other=0, // The navigator stopped the playback (no reason available). - DVD_PB_STOPPED_NoBranch=1, // The nav completed the current pgc and there was no more video and - // did not find any other branching instruction for subsequent playback. - DVD_PB_STOPPED_NoFirstPlayDomain =2, // The disc does not contain an initial startup program. - DVD_PB_STOPPED_StopCommand = 3, // The app issued a stop() command or a stop command was authored on the disc. - DVD_PB_STOPPED_Reset=4, // The navigator was reset to the start of the disc (using ResetOnStop). - DVD_PB_STOPPED_DiscEjected=5, // The disc was ejected. - DVD_PB_STOPPED_IllegalNavCommand = 6, // An illegal nav command prevented playback from continuing. - DVD_PB_STOPPED_PlayPeriodAutoStop = 7, // PlayPeriod completed - DVD_PB_STOPPED_PlayChapterAutoStop = 8, // PlayChapter completed - DVD_PB_STOPPED_ParentalFailure = 9, // A parental level failure prevented playback - DVD_PB_STOPPED_RegionFailure = 10, // A region failure prevented playback - DVD_PB_STOPPED_MacrovisionFailure = 11, // A Macrovision failure prevented playback. - DVD_PB_STOPPED_DiscReadError = 12, // A read error prevented playback. - DVD_PB_STOPPED_CopyProtectFailure = 13 // Copy protection failure. -} DVD_PB_STOPPED; - - -#endif - -// DVD-Video event codes -// ====================== -// -// All DVD-Video event are always passed on to the application, and are -// never processed by the filter graph - - -#define EC_DVD_DOMAIN_CHANGE (EC_DVDBASE + 0x01) -// Parameters: ( DWORD, void ) -// lParam1 is enum DVD_DOMAIN, and indicates the player's new domain -// -// Raised from following domains: all -// -// Signaled when ever the DVD player changes domains. - - -#define EC_DVD_TITLE_CHANGE (EC_DVDBASE + 0x02) -// Parameters: ( DWORD, void ) -// lParam1 is the new title number. -// -// Raised from following domains: DVD_DOMAIN_Title -// -// Indicates when the current title number changes. Title numbers -// range 1 to 99. This indicates the TTN, which is the title number -// with respect to the whole disc, not the VTS_TTN which is the title -// number with respect to just a current VTS. - - -#define EC_DVD_CHAPTER_START (EC_DVDBASE + 0x03) -// Parameters: ( DWORD, void ) -// lParam1 is the new chapter number (which is the program number for -// One_Sequential_PGC_Titles). -// -// Raised from following domains: DVD_DOMAIN_Title -// -// Signales that DVD player started playback of a new program in the Title -// domain. This is only signaled for One_Sequential_PGC_Titles. - - -#define EC_DVD_AUDIO_STREAM_CHANGE (EC_DVDBASE + 0x04) -// Parameters: ( DWORD, void ) -// lParam1 is the new user audio stream number. -// -// Raised from following domains: all -// -// Signaled when ever the current user audio stream number changes for the main -// title. This can be changed automatically with a navigation command on disc -// as well as through IDVDAnnexJ. -// Audio stream numbers range from 0 to 7. Stream 0xffffffff -// indicates that no stream is selected. - -#define EC_DVD_SUBPICTURE_STREAM_CHANGE (EC_DVDBASE + 0x05) -// Parameters: ( DWORD, BOOL ) -// lParam1 is the new user subpicture stream number. -// lParam2 is the subpicture's on/off state (TRUE if on) -// -// Raised from following domains: all -// -// Signaled when ever the current user subpicture stream number changes for the main -// title. This can be changed automatically with a navigation command on disc -// as well as through IDVDAnnexJ. -// Subpicture stream numbers range from 0 to 31. Stream 0xffffffff -// indicates that no stream is selected. - -#define EC_DVD_ANGLE_CHANGE (EC_DVDBASE + 0x06) -// Parameters: ( DWORD, DWORD ) -// lParam1 is the number of available angles. -// lParam2 is the current user angle number. -// -// Raised from following domains: all -// -// Signaled when ever either -// a) the number of available angles changes, or -// b) the current user angle number changes. -// Current angle number can be changed automatically with navigation command -// on disc as well as through IDVDAnnexJ. -// When the number of available angles is 1, the current video is not multiangle. -// Angle numbers range from 1 to 9. - - -#define EC_DVD_BUTTON_CHANGE (EC_DVDBASE + 0x07) -// Parameters: ( DWORD, DWORD ) -// lParam1 is the number of available buttons. -// lParam2 is the current selected button number. -// -// Raised from following domains: all -// -// Signaled when ever either -// a) the number of available buttons changes, or -// b) the current selected button number changes. -// The current selected button can be changed automatically with navigation -// commands on disc as well as through IDVDAnnexJ. -// Button numbers range from 1 to 36. Selected button number 0 implies that -// no button is selected. Note that these button numbers enumerate all -// available button numbers, and do not always correspond to button numbers -// used for IDVDAnnexJ::ButtonSelectAndActivate since only a subset of buttons -// may be activated with ButtonSelectAndActivate. - - -#define EC_DVD_VALID_UOPS_CHANGE (EC_DVDBASE + 0x08) -// Parameters: ( DWORD, void ) -// lParam1 is a VALID_UOP_SOMTHING_OR_OTHER bit-field stuct which indicates -// which IDVDAnnexJ commands are explicitly disable by the DVD disc. -// -// Raised from following domains: all -// -// Signaled when ever the available set of IDVDAnnexJ methods changes. This -// only indicates which operations are explicited disabled by the content on -// the DVD disc, and does not guarentee that it is valid to call methods -// which are not disabled. For example, if no buttons are currently present, -// IDVDAnnexJ::ButtonActivate() won't work, even though the buttons are not -// explicitly disabled. - - -#define EC_DVD_STILL_ON (EC_DVDBASE + 0x09) -// Parameters: ( BOOL, DWORD ) -// lParam1 == 0 --> buttons are available, so StillOff won't work -// lParam1 == 1 --> no buttons available, so StillOff will work -// lParam2 indicates the number of seconds the still will last, with 0xffffffff -// indicating an infinite still (wait till button or StillOff selected). -// -// Raised from following domains: all -// -// Signaled at the beginning of any still: PGC still, Cell Still, or VOBU Still. -// Note that all combinations of buttons and still are possible (buttons on with -// still on, buttons on with still off, button off with still on, button off -// with still off). - -#define EC_DVD_STILL_OFF (EC_DVDBASE + 0x0a) -// Parameters: ( void, void ) -// -// Indicating that any still that is currently active -// has been released. -// -// Raised from following domains: all -// -// Signaled at the end of any still: PGC still, Cell Still, or VOBU Still. -// - -#define EC_DVD_CURRENT_TIME (EC_DVDBASE + 0x0b) -// Parameters: ( DWORD, BOOL ) -// lParam1 is a DVD_TIMECODE which indicates the current -// playback time code in a BCD HH:MM:SS:FF format. -// lParam2 == 0 --> time code is 25 frames/sec -// lParam2 == 1 --> time code is 30 frames/sec (non-drop). -// lParam2 == 2 --> time code is invalid (current playback time -// cannot be determined for current title) -// -// Raised from following domains: DVD_DOMAIN_Title -// -// Signaled at the beginning of every VOBU, which occurs every .4 to 1.0 sec. -// This is only signaled for One_Sequential_PGC_Titles. - - -#define EC_DVD_ERROR (EC_DVDBASE + 0x0c) -// Parameters: ( DWORD, void) -// lParam1 is an enum DVD_ERROR which notifies the app of some error condition. -// -// Raised from following domains: all -// - -#define EC_DVD_WARNING (EC_DVDBASE + 0x0d) -// Parameters: ( DWORD, DWORD) -// lParam1 is an enum DVD_WARNING which notifies the app of some warning condition. -// lParam2 contains more specific information about the warning (warning dependent) -// -// Raised from following domains: all -// - -#define EC_DVD_CHAPTER_AUTOSTOP (EC_DVDBASE + 0x0e) -// Parameters: (BOOL, void) -// lParam1 is a BOOL which indicates the reason for the cancellation of ChapterPlayAutoStop -// lParam1 == 0 indicates successful completion of ChapterPlayAutoStop -// lParam1 == 1 indicates that ChapterPlayAutoStop is being cancelled as a result of another -// IDVDControl call or the end of content has been reached & no more chapters -// can be played. -// Indicating that playback is stopped as a result of a call -// to IDVDControl::ChapterPlayAutoStop() -// -// Raised from following domains : DVD_DOMAIN_TITLE -// - -#define EC_DVD_NO_FP_PGC (EC_DVDBASE + 0x0f) -// Parameters : (void, void) -// -// Raised from the following domains : FP_DOM -// -// Indicates that the DVD disc does not have a FP_PGC (First Play Program Chain) -// and the DVD Navigator will not automatically load any PGC and start playback. -// - -#define EC_DVD_PLAYBACK_RATE_CHANGE (EC_DVDBASE + 0x10) -// Parameters : (LONG, void) -// lParam1 is a LONG indicating the new playback rate. -// lParam1 < 0 indicates reverse playback mode. -// lParam1 > 0 indicates forward playback mode -// Value of lParam1 is the actual playback rate multiplied by 10000. -// i.e. lParam1 = rate * 10000 -// -// Raised from the following domains : TT_DOM -// -// Indicates that a rate change in playback has been initiated and the parameter -// lParam1 indicates the new playback rate that is being used. -// - -#define EC_DVD_PARENTAL_LEVEL_CHANGE (EC_DVDBASE + 0x11) -// Parameters : (LONG, void) -// lParam1 is a LONG indicating the new parental level. -// -// Raised from the following domains : VMGM_DOM -// -// Indicates that an authored Nav command has changed the parental level -// setting in the player. -// - -#define EC_DVD_PLAYBACK_STOPPED (EC_DVDBASE + 0x12) -// Parameters : (DWORD, void) -// -// Raised from the following domains : All Domains -// -// Indicates that playback has been stopped as the Navigator has completed -// playback of the pgc and did not find any other branching instruction for -// subsequent playback. -// -// The DWORD returns the reason for the completion of the playback. See -// The DVD_PB_STOPPED enumeration for details. -// - -#define EC_DVD_ANGLES_AVAILABLE (EC_DVDBASE + 0x13) -// Parameters : (BOOL, void) -// lParam1 == 0 indicates that playback is not in an angle block and angles are -// not available -// lParam1 == 1 indicates that an angle block is being played back and angle changes -// can be performed. -// -// Indicates whether an angle block is being played and if angle changes can be -// performed. However, angle changes are not restricted to angle blocks and the -// manifestation of the angle change can be seen only in an angle block. - -#define EC_DVD_PLAYPERIOD_AUTOSTOP (EC_DVDBASE + 0x14) -// Parameters: (void, void) -// Sent when the PlayPeriodInTitle completes or is cancelled -// -// Raised from following domains : DVD_DOMAIN_TITLE -// - -#define EC_DVD_BUTTON_AUTO_ACTIVATED (EC_DVDBASE + 0x15) -// Parameters: (DWORD button, void) -// Sent when a button is automatically activated -// -// Raised from following domains : DVD_DOMAIN_MENU -// - -#define EC_DVD_CMD_START (EC_DVDBASE + 0x16) -// Parameters: (CmdID, HRESULT) -// Sent when a command begins -// - -#define EC_DVD_CMD_END (EC_DVDBASE + 0x17) -// Parameters: (CmdID, HRESULT) -// Sent when a command completes -// - -#define EC_DVD_DISC_EJECTED (EC_DVDBASE + 0x18) -// Parameters: none -// Sent when the nav detects that a disc was ejected and stops the playback -// The app does not need to take any action to stop the playback. -// - -#define EC_DVD_DISC_INSERTED (EC_DVDBASE + 0x19) -// Parameters: none -// Sent when the nav detects that a disc was inserted and the nav begins playback -// The app does not need to take any action to start the playback. -// - -#define EC_DVD_CURRENT_HMSF_TIME (EC_DVDBASE + 0x1a) -// Parameters: ( ULONG, ULONG ) -// lParam2 contains a union of the DVD_TIMECODE_FLAGS -// lParam1 contains a DVD_HMSF_TIMECODE. Assign lParam1 to a ULONG then cast the -// ULONG as a DVD_HMSF_TIMECODE to use its values. -// -// Raised from following domains: DVD_DOMAIN_Title -// -// Signaled at the beginning of every VOBU, which occurs every .4 to 1.0 sec. - -#define EC_DVD_KARAOKE_MODE (EC_DVDBASE + 0x1b) -// Parameters: ( BOOL, reserved ) -// lParam1 is either TRUE (a karaoke track is being played) or FALSE (no karaoke data is being played). -// - - - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// The following is the original contents of this header from -// the DirectX 8.0 SDK. -// -///////////////////////////////////////////////////////////////////////////// - -#else // DirectX 8.0 content - - #define EC_DVDBASE 0x0100 - - #ifndef EXCLUDE_DVDEVCODE_ENUMS - - typedef enum _tagDVD_ERROR { - DVD_ERROR_Unexpected=1, // Something unexpected happened, perhaps content - // is incorrectly authored. Playback is stopped. - DVD_ERROR_CopyProtectFail=2, // Key exchange for DVD copy protection failed. - // Playback is stopped. - DVD_ERROR_InvalidDVD1_0Disc=3, // DVD-Video disc is incorrectly authored for v1.0 - // of spec. Playback is stopped. - DVD_ERROR_InvalidDiscRegion=4, // The Disc cannot be played because the disc is not - // authored to play in system region. - // The region mismatch may be fixable by - // changing the system region with dvdrgn.exe - DVD_ERROR_LowParentalLevel=5, // Player parental level is lower than the lowest parental - // level available in the DVD content. Playback is stopped. - DVD_ERROR_MacrovisionFail=6, // Macrovision Distribution Failed. - // Playback is stopped. - DVD_ERROR_IncompatibleSystemAndDecoderRegions=7, - // No discs can be played because the system region - // does not match the decoder region. - DVD_ERROR_IncompatibleDiscAndDecoderRegions=8 - // The disc cannot be played because the disc is - // not authored to be played in the decoder's region - } DVD_ERROR; - - typedef enum _tagDVD_WARNING { - DVD_WARNING_InvalidDVD1_0Disc=1,// DVD-Video disc is incorrectly authored. Playback - // can continue, but unexpected behavior may occur. - DVD_WARNING_FormatNotSupported=2,// A decoder would not support the current format. Playback - // of a stream (audio, video of SP) may not function. - DVD_WARNING_IllegalNavCommand=3,// The internal DVD navigation command processor attempted to - // process an illegal command. - DVD_WARNING_Open = 4, // File Open Failed - DVD_WARNING_Seek = 5, // File Seek Failed - DVD_WARNING_Read = 6 // File Read Failed - } DVD_WARNING; - - #endif - - // DVD-Video event codes - // ====================== - // - // All DVD-Video event are always passed on to the application, and are - // never processed by the filter graph - - - #define EC_DVD_DOMAIN_CHANGE (EC_DVDBASE + 0x01) - // Parameters: ( DWORD, void ) - // lParam1 is enum DVD_DOMAIN, and indicates the player's new domain - // - // Raised from following domains: all - // - // Signaled when ever the DVD player changes domains. - - - #define EC_DVD_TITLE_CHANGE (EC_DVDBASE + 0x02) - // Parameters: ( DWORD, void ) - // lParam1 is the new title number. - // - // Raised from following domains: DVD_DOMAIN_Title - // - // Indicates when the current title number changes. Title numbers - // range 1 to 99. This indicates the TTN, which is the title number - // with respect to the whole disc, not the VTS_TTN which is the title - // number with respect to just a current VTS. - - - #define EC_DVD_CHAPTER_START (EC_DVDBASE + 0x03) - // Parameters: ( DWORD, void ) - // lParam1 is the new chapter number (which is the program number for - // One_Sequential_PGC_Titles). - // - // Raised from following domains: DVD_DOMAIN_Title - // - // Signales that DVD player started playback of a new program in the Title - // domain. This is only signaled for One_Sequential_PGC_Titles. - - - #define EC_DVD_AUDIO_STREAM_CHANGE (EC_DVDBASE + 0x04) - // Parameters: ( DWORD, void ) - // lParam1 is the new user audio stream number. - // - // Raised from following domains: all - // - // Signaled when ever the current user audio stream number changes for the main - // title. This can be changed automatically with a navigation command on disc - // as well as through IDVDAnnexJ. - // Audio stream numbers range from 0 to 7. Stream 0xffffffff - // indicates that no stream is selected. - - #define EC_DVD_SUBPICTURE_STREAM_CHANGE (EC_DVDBASE + 0x05) - // Parameters: ( DWORD, void ) - // lParam1 is the new user subpicture stream number. - // - // Raised from following domains: all - // - // Signaled when ever the current user subpicture stream number changes for the main - // title. This can be changed automatically with a navigation command on disc - // as well as through IDVDAnnexJ. - // Subpicture stream numbers range from 0 to 31. Stream 0xffffffff - // indicates that no stream is selected. - - #define EC_DVD_ANGLE_CHANGE (EC_DVDBASE + 0x06) - // Parameters: ( DWORD, DWORD ) - // lParam1 is the number of available angles. - // lParam2 is the current user angle number. - // - // Raised from following domains: all - // - // Signaled when ever either - // a) the number of available angles changes, or - // b) the current user angle number changes. - // Current angle number can be changed automatically with navigation command - // on disc as well as through IDVDAnnexJ. - // When the number of available angles is 1, the current video is not multiangle. - // Angle numbers range from 1 to 9. - - - #define EC_DVD_BUTTON_CHANGE (EC_DVDBASE + 0x07) - // Parameters: ( DWORD, DWORD ) - // lParam1 is the number of available buttons. - // lParam2 is the current selected button number. - // - // Raised from following domains: all - // - // Signaled when ever either - // a) the number of available buttons changes, or - // b) the current selected button number changes. - // The current selected button can be changed automatically with navigation - // commands on disc as well as through IDVDAnnexJ. - // Button numbers range from 1 to 36. Selected button number 0 implies that - // no button is selected. Note that these button numbers enumerate all - // available button numbers, and do not always correspond to button numbers - // used for IDVDAnnexJ::ButtonSelectAndActivate since only a subset of buttons - // may be activated with ButtonSelectAndActivate. - - - #define EC_DVD_VALID_UOPS_CHANGE (EC_DVDBASE + 0x08) - // Parameters: ( DWORD, void ) - // lParam1 is a VALID_UOP_SOMTHING_OR_OTHER bit-field stuct which indicates - // which IDVDAnnexJ commands are explicitly disable by the DVD disc. - // - // Raised from following domains: all - // - // Signaled when ever the available set of IDVDAnnexJ methods changes. This - // only indicates which operations are explicited disabled by the content on - // the DVD disc, and does not guarentee that it is valid to call methods - // which are not disabled. For example, if no buttons are currently present, - // IDVDAnnexJ::ButtonActivate() won't work, even though the buttons are not - // explicitly disabled. - - - #define EC_DVD_STILL_ON (EC_DVDBASE + 0x09) - // Parameters: ( BOOL, DWORD ) - // lParam1 == 0 --> buttons are available, so StillOff won't work - // lParam1 == 1 --> no buttons available, so StillOff will work - // lParam2 indicates the number of seconds the still will last, with 0xffffffff - // indicating an infinite still (wait till button or StillOff selected). - // - // Raised from following domains: all - // - // Signaled at the beginning of any still: PGC still, Cell Still, or VOBU Still. - // Note that all combinations of buttons and still are possible (buttons on with - // still on, buttons on with still off, button off with still on, button off - // with still off). - - #define EC_DVD_STILL_OFF (EC_DVDBASE + 0x0a) - // Parameters: ( void, void ) - // - // Indicating that any still that is currently active - // has been released. - // - // Raised from following domains: all - // - // Signaled at the end of any still: PGC still, Cell Still, or VOBU Still. - // - - #define EC_DVD_CURRENT_TIME (EC_DVDBASE + 0x0b) - // Parameters: ( DWORD, BOOL ) - // lParam1 is a DVD_TIMECODE which indicates the current - // playback time code in a BCD HH:MM:SS:FF format. - // lParam2 == 0 --> time code is 25 frames/sec - // lParam2 == 1 --> time code is 30 frames/sec (non-drop). - // lParam2 == 2 --> time code is invalid (current playback time - // cannot be determined for current title) - // - // Raised from following domains: DVD_DOMAIN_Title - // - // Signaled at the beginning of every VOBU, which occurs every .4 to 1.0 sec. - // This is only signaled for One_Sequential_PGC_Titles. - - - #define EC_DVD_ERROR (EC_DVDBASE + 0x0c) - // Parameters: ( DWORD, void) - // lParam1 is an enum DVD_ERROR which notifies the app of some error condition. - // - // Raised from following domains: all - // - - #define EC_DVD_WARNING (EC_DVDBASE + 0x0d) - // Parameters: ( DWORD, void) - // lParam1 is an enum DVD_WARNING which notifies the app of some warning condition. - // - // Raised from following domains: all - // - - #define EC_DVD_CHAPTER_AUTOSTOP (EC_DVDBASE + 0x0e) - // Parameters: (BOOL, void) - // lParam1 is a BOOL which indicates the reason for the cancellation of ChapterPlayAutoStop - // lParam1 == 0 indicates successful completion of ChapterPlayAutoStop - // lParam1 == 1 indicates that ChapterPlayAutoStop is being cancelled as a result of another - // IDVDControl call or the end of content has been reached & no more chapters - // can be played. - // Indicating that playback is stopped as a result of a call - // to IDVDControl::ChapterPlayAutoStop() - // - // Raised from following domains : DVD_DOMAIN_TITLE - // - - #define EC_DVD_NO_FP_PGC (EC_DVDBASE + 0x0f) - // Parameters : (void, void) - // - // Raised from the following domains : FP_DOM - // - // Indicates that the DVD disc does not have a FP_PGC (First Play Program Chain) - // and the DVD Navigator will not automatically load any PGC and start playback. - // - - #define EC_DVD_PLAYBACK_RATE_CHANGE (EC_DVDBASE + 0x10) - // Parameters : (LONG, void) - // lParam1 is a LONG indicating the new playback rate. - // lParam1 < 0 indicates reverse playback mode. - // lParam1 > 0 indicates forward playback mode - // Value of lParam1 is the actual playback rate multiplied by 10000. - // i.e. lParam1 = rate * 10000 - // - // Raised from the following domains : TT_DOM - // - // Indicates that a rate change in playback has been initiated and the parameter - // lParam1 indicates the new playback rate that is being used. - // - - #define EC_DVD_PARENTAL_LEVEL_CHANGE (EC_DVDBASE + 0x11) - // Parameters : (LONG, void) - // lParam1 is a LONG indicating the new parental level. - // - // Raised from the following domains : VMGM_DOM - // - // Indicates that an authored Nav command has changed the parental level - // setting in the player. - // - - #define EC_DVD_PLAYBACK_STOPPED (EC_DVDBASE + 0x12) - // Parameters : (void, void) - // - // Raised from the following domains : All Domains - // - // Indicates that playback has been stopped as the Navigator has completed - // playback of the pgc and did not find any other branching instruction for - // subsequent playback. - // - - #define EC_DVD_ANGLES_AVAILABLE (EC_DVDBASE + 0x13) - // Parameters : (BOOL, void) - // lParam1 == 0 indicates that playback is not in an angle block and angles are - // not available - // lParam1 == 1 indicates that an angle block is being played back and angle changes - // can be performed. - // - // Indicates whether an angle block is being played and if angle changes can be - // performed. However, angle changes are not restricted to angle blocks and the - // manifestation of the angle change can be seen only in an angle block. - - #define EC_DVD_PLAYPERIOD_AUTOSTOP (EC_DVDBASE + 0x14) - // Parameters: (void, void) - // Sent when the PlayPeriodInTitle completes or is cancelled - // - // Raised from following domains : DVD_DOMAIN_TITLE - // - - #define EC_DVD_BUTTON_AUTO_ACTIVATED (EC_DVDBASE + 0x15) - // Parameters: (DWORD button, void) - // Sent when a button is automatically activated - // - // Raised from following domains : DVD_DOMAIN_MENU - // - - #define EC_DVD_CMD_START (EC_DVDBASE + 0x16) - // Parameters: (CmdID, HRESULT) - // Sent when a command begins - // - - #define EC_DVD_CMD_END (EC_DVDBASE + 0x17) - // Parameters: (CmdID, HRESULT) - // Sent when a command completes - // - - #define EC_DVD_DISC_EJECTED (EC_DVDBASE + 0x18) - // Parameters: none - // Sent when the nav detects that a disc was ejected and stops the playback - // The app does not need to take any action to stop the playback. - // - - #define EC_DVD_DISC_INSERTED (EC_DVDBASE + 0x19) - // Parameters: none - // Sent when the nav detects that a disc was inserted and the nav begins playback - // The app does not need to take any action to start the playback. - // - - #define EC_DVD_CURRENT_HMSF_TIME (EC_DVDBASE + 0x1a) - // Parameters: ( ULONG, ULONG ) - // lParam2 contains a union of the DVD_TIMECODE_FLAGS - // lParam1 contains a DVD_HMSF_TIMECODE. Assign lParam1 to a ULONG then cast the - // ULONG as a DVD_HMSF_TIMECODE to use its values. - // - // Raised from following domains: DVD_DOMAIN_Title - // - // Signaled at the beginning of every VOBU, which occurs every .4 to 1.0 sec. - - #define EC_DVD_KARAOKE_MODE (EC_DVDBASE + 0x1b) - // Parameters: ( BOOL, reserved ) - // lParam1 is either TRUE (a karaoke track is being played) or FALSE (no karaoke data is being played). - // - - -#endif // DirectX 8.0 content - - -#endif // __DVDEVCOD__ diff --git a/import/DirectX8/include/dvdmedia.h b/import/DirectX8/include/dvdmedia.h deleted file mode 100644 index ae58cede2..000000000 --- a/import/DirectX8/include/dvdmedia.h +++ /dev/null @@ -1,418 +0,0 @@ -//------------------------------------------------------------------------------ -// File: DVDMedia.h -// -// Desc: Contains typedefs and defines necessary for user mode (ring 3) DVD -// filters and applications. -// -// This should be included in the DirectShow SDK for user mode filters. -// The types defined here should be kept in synch with ksmedia.h WDM -// DDK for kernel mode filters. -// -// Copyright (c) 1997 - 2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __DVDMEDIA_H__ -#define __DVDMEDIA_H__ - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -// ----------------------------------------------------------------------- -// AC-3 definition for the AM_KSPROPSETID_AC3 property set -// ----------------------------------------------------------------------- - -typedef enum { - AM_PROPERTY_AC3_ERROR_CONCEALMENT = 1, - AM_PROPERTY_AC3_ALTERNATE_AUDIO = 2, - AM_PROPERTY_AC3_DOWNMIX = 3, - AM_PROPERTY_AC3_BIT_STREAM_MODE = 4, - AM_PROPERTY_AC3_DIALOGUE_LEVEL = 5, - AM_PROPERTY_AC3_LANGUAGE_CODE = 6, - AM_PROPERTY_AC3_ROOM_TYPE = 7 -} AM_PROPERTY_AC3; - -typedef struct { - BOOL fRepeatPreviousBlock; - BOOL fErrorInCurrentBlock; -} AM_AC3_ERROR_CONCEALMENT, *PAM_AC3_ERROR_CONCEALMENT; - -typedef struct { - BOOL fStereo; - ULONG DualMode; -} AM_AC3_ALTERNATE_AUDIO, *PAM_AC3_ALTERNATE_AUDIO; - -#define AM_AC3_ALTERNATE_AUDIO_1 1 -#define AM_AC3_ALTERNATE_AUDIO_2 2 -#define AM_AC3_ALTERNATE_AUDIO_BOTH 3 - -typedef struct { - BOOL fDownMix; - BOOL fDolbySurround; -} AM_AC3_DOWNMIX, *PAM_AC3_DOWNMIX; - -typedef struct { - LONG BitStreamMode; -} AM_AC3_BIT_STREAM_MODE, *PAM_AC3_BIT_STREAM_MODE; - -#define AM_AC3_SERVICE_MAIN_AUDIO 0 -#define AM_AC3_SERVICE_NO_DIALOG 1 -#define AM_AC3_SERVICE_VISUALLY_IMPAIRED 2 -#define AM_AC3_SERVICE_HEARING_IMPAIRED 3 -#define AM_AC3_SERVICE_DIALOG_ONLY 4 -#define AM_AC3_SERVICE_COMMENTARY 5 -#define AM_AC3_SERVICE_EMERGENCY_FLASH 6 -#define AM_AC3_SERVICE_VOICE_OVER 7 - -typedef struct { - ULONG DialogueLevel; -} AM_AC3_DIALOGUE_LEVEL, *PAM_AC3_DIALOGUE_LEVEL; - -typedef struct { - BOOL fLargeRoom; -} AM_AC3_ROOM_TYPE, *PAM_AC3_ROOM_TYPE; - - -// ----------------------------------------------------------------------- -// subpicture definition for the AM_KSPROPSETID_DvdSubPic property set -// ----------------------------------------------------------------------- - -typedef enum { - AM_PROPERTY_DVDSUBPIC_PALETTE = 0, - AM_PROPERTY_DVDSUBPIC_HLI = 1, - AM_PROPERTY_DVDSUBPIC_COMPOSIT_ON = 2 // TRUE for subpicture is displayed -} AM_PROPERTY_DVDSUBPIC; - -typedef struct _AM_DVD_YUV { - UCHAR Reserved; - UCHAR Y; - UCHAR U; - UCHAR V; -} AM_DVD_YUV, *PAM_DVD_YUV; - -typedef struct _AM_PROPERTY_SPPAL { - AM_DVD_YUV sppal[16]; -} AM_PROPERTY_SPPAL, *PAM_PROPERTY_SPPAL; - -typedef struct _AM_COLCON { - UCHAR emph1col:4; - UCHAR emph2col:4; - UCHAR backcol:4; - UCHAR patcol:4; - UCHAR emph1con:4; - UCHAR emph2con:4; - UCHAR backcon:4; - UCHAR patcon:4; - -} AM_COLCON, *PAM_COLCON; - -typedef struct _AM_PROPERTY_SPHLI { - USHORT HLISS; // - USHORT Reserved; - ULONG StartPTM; // start presentation time in x/90000 - ULONG EndPTM; // end PTM in x/90000 - USHORT StartX; - USHORT StartY; - USHORT StopX; - USHORT StopY; - AM_COLCON ColCon; // color contrast description (4 bytes as given in HLI) -} AM_PROPERTY_SPHLI, *PAM_PROPERTY_SPHLI; - -typedef BOOL AM_PROPERTY_COMPOSIT_ON, *PAM_PROPERTY_COMPOSIT_ON; - - - -// ----------------------------------------------------------------------- -// copy protection definitions -// ----------------------------------------------------------------------- - -// AM_UseNewCSSKey for the dwTypeSpecificFlags in IMediaSample2 to indicate -// the exact point in a stream after which to start applying a new CSS key. -// This is typically sent on an empty media sample just before attempting -// to renegotiate a CSS key. -#define AM_UseNewCSSKey 0x1 - -// -// AM_KSPROPSETID_CopyProt property set definitions -// -typedef enum { - AM_PROPERTY_DVDCOPY_CHLG_KEY = 0x01, - AM_PROPERTY_DVDCOPY_DVD_KEY1 = 0x02, - AM_PROPERTY_DVDCOPY_DEC_KEY2 = 0x03, - AM_PROPERTY_DVDCOPY_TITLE_KEY = 0x04, - AM_PROPERTY_COPY_MACROVISION = 0x05, - AM_PROPERTY_DVDCOPY_REGION = 0x06, - AM_PROPERTY_DVDCOPY_SET_COPY_STATE = 0x07, - AM_PROPERTY_DVDCOPY_DISC_KEY = 0x80 -} AM_PROPERTY_DVDCOPYPROT; - -typedef struct _AM_DVDCOPY_CHLGKEY { - BYTE ChlgKey[10]; - BYTE Reserved[2]; -} AM_DVDCOPY_CHLGKEY, *PAM_DVDCOPY_CHLGKEY; - -typedef struct _AM_DVDCOPY_BUSKEY { - BYTE BusKey[5]; - BYTE Reserved[1]; -} AM_DVDCOPY_BUSKEY, *PAM_DVDCOPY_BUSKEY; - -typedef struct _AM_DVDCOPY_DISCKEY { - BYTE DiscKey[2048]; -} AM_DVDCOPY_DISCKEY, *PAM_DVDCOPY_DISCKEY; - -typedef struct AM_DVDCOPY_TITLEKEY { - ULONG KeyFlags; - ULONG Reserved1[2]; - UCHAR TitleKey[6]; - UCHAR Reserved2[2]; -} AM_DVDCOPY_TITLEKEY, *PAM_DVDCOPY_TITLEKEY; - -typedef struct _AM_COPY_MACROVISION { - ULONG MACROVISIONLevel; -} AM_COPY_MACROVISION, *PAM_COPY_MACROVISION; - -typedef struct AM_DVDCOPY_SET_COPY_STATE { - ULONG DVDCopyState; -} AM_DVDCOPY_SET_COPY_STATE, *PAM_DVDCOPY_SET_COPY_STATE; - -typedef enum { - AM_DVDCOPYSTATE_INITIALIZE = 0, - AM_DVDCOPYSTATE_INITIALIZE_TITLE = 1, // indicates we are starting a title - // key copy protection sequence - AM_DVDCOPYSTATE_AUTHENTICATION_NOT_REQUIRED = 2, - AM_DVDCOPYSTATE_AUTHENTICATION_REQUIRED = 3, - AM_DVDCOPYSTATE_DONE = 4 -} AM_DVDCOPYSTATE; - -typedef enum { - AM_MACROVISION_DISABLED = 0, - AM_MACROVISION_LEVEL1 = 1, - AM_MACROVISION_LEVEL2 = 2, - AM_MACROVISION_LEVEL3 = 3 -} AM_COPY_MACROVISION_LEVEL, *PAM_COPY_MACROVISION_LEVEL; - - -// CSS region stucture -typedef struct _DVD_REGION { - UCHAR CopySystem; - UCHAR RegionData; - UCHAR SystemRegion; - UCHAR Reserved; -} DVD_REGION, *PDVD_REGION; - -// -// CGMS Copy Protection Flags -// - -#define AM_DVD_CGMS_RESERVED_MASK 0x00000078 - -#define AM_DVD_CGMS_COPY_PROTECT_MASK 0x00000018 -#define AM_DVD_CGMS_COPY_PERMITTED 0x00000000 -#define AM_DVD_CGMS_COPY_ONCE 0x00000010 -#define AM_DVD_CGMS_NO_COPY 0x00000018 - -#define AM_DVD_COPYRIGHT_MASK 0x00000040 -#define AM_DVD_NOT_COPYRIGHTED 0x00000000 -#define AM_DVD_COPYRIGHTED 0x00000040 - -#define AM_DVD_SECTOR_PROTECT_MASK 0x00000020 -#define AM_DVD_SECTOR_NOT_PROTECTED 0x00000000 -#define AM_DVD_SECTOR_PROTECTED 0x00000020 - - -// ----------------------------------------------------------------------- -// video format blocks -// ----------------------------------------------------------------------- - -enum AM_MPEG2Level { - AM_MPEG2Level_Low = 1, - AM_MPEG2Level_Main = 2, - AM_MPEG2Level_High1440 = 3, - AM_MPEG2Level_High = 4 -}; - -enum AM_MPEG2Profile { - AM_MPEG2Profile_Simple = 1, - AM_MPEG2Profile_Main = 2, - AM_MPEG2Profile_SNRScalable = 3, - AM_MPEG2Profile_SpatiallyScalable = 4, - AM_MPEG2Profile_High = 5 -}; - -#define AMINTERLACE_IsInterlaced 0x00000001 // if 0, other interlace bits are irrelevent -#define AMINTERLACE_1FieldPerSample 0x00000002 // else 2 fields per media sample -#define AMINTERLACE_Field1First 0x00000004 // else Field 2 is first; top field in PAL is field 1, top field in NTSC is field 2? -#define AMINTERLACE_UNUSED 0x00000008 // -#define AMINTERLACE_FieldPatternMask 0x00000030 // use this mask with AMINTERLACE_FieldPat* -#define AMINTERLACE_FieldPatField1Only 0x00000000 // stream never contains a Field2 -#define AMINTERLACE_FieldPatField2Only 0x00000010 // stream never contains a Field1 -#define AMINTERLACE_FieldPatBothRegular 0x00000020 // There will be a Field2 for every Field1 (required for Weave?) -#define AMINTERLACE_FieldPatBothIrregular 0x00000030 // Random pattern of Field1s and Field2s -#define AMINTERLACE_DisplayModeMask 0x000000c0 -#define AMINTERLACE_DisplayModeBobOnly 0x00000000 -#define AMINTERLACE_DisplayModeWeaveOnly 0x00000040 -#define AMINTERLACE_DisplayModeBobOrWeave 0x00000080 - -#define AMCOPYPROTECT_RestrictDuplication 0x00000001 // duplication of this stream should be restricted - -#define AMMPEG2_DoPanScan 0x00000001 //if set, the MPEG-2 video decoder should crop output image - // based on pan-scan vectors in picture_display_extension - // and change the picture aspect ratio accordingly. -#define AMMPEG2_DVDLine21Field1 0x00000002 //if set, the MPEG-2 decoder must be able to produce an output - // pin for DVD style closed caption data found in GOP layer of field 1 -#define AMMPEG2_DVDLine21Field2 0x00000004 //if set, the MPEG-2 decoder must be able to produce an output - // pin for DVD style closed caption data found in GOP layer of field 2 -#define AMMPEG2_SourceIsLetterboxed 0x00000008 //if set, indicates that black bars have been encoded in the top - // and bottom of the video. -#define AMMPEG2_FilmCameraMode 0x00000010 //if set, indicates "film mode" used for 625/50 content. If cleared, - // indicates that "camera mode" was used. -#define AMMPEG2_LetterboxAnalogOut 0x00000020 //if set and this stream is sent to an analog output, it should - // be letterboxed. Streams sent to VGA should be letterboxed only by renderers. -#define AMMPEG2_DSS_UserData 0x00000040 //if set, the MPEG-2 decoder must process DSS style user data -#define AMMPEG2_DVB_UserData 0x00000080 //if set, the MPEG-2 decoder must process DVB style user data -#define AMMPEG2_27MhzTimebase 0x00000100 //if set, the PTS,DTS timestamps advance at 27MHz rather than 90KHz - -#define AMMPEG2_WidescreenAnalogOut 0x00000200 //if set and this stream is sent to an analog output, it should - // be in widescreen format (4x3 content should be centered on a 16x9 output). - // Streams sent to VGA should be widescreened only by renderers. - -// PRESENT in dwReserved1 field in VIDEOINFOHEADER2 -#define AMCONTROL_USED 0x00000001 // Used to test if these flags are supported. Set and test for AcceptMediaType. - // If rejected, then you cannot use the AMCONTROL flags (send 0 for dwReserved1) -#define AMCONTROL_PAD_TO_4x3 0x00000002 // if set means display the image in a 4x3 area -#define AMCONTROL_PAD_TO_16x9 0x00000004 // if set means display the image in a 16x9 area - -typedef struct tagVIDEOINFOHEADER2 { - RECT rcSource; - RECT rcTarget; - DWORD dwBitRate; - DWORD dwBitErrorRate; - REFERENCE_TIME AvgTimePerFrame; - DWORD dwInterlaceFlags; // use AMINTERLACE_* defines. Reject connection if undefined bits are not 0 - DWORD dwCopyProtectFlags; // use AMCOPYPROTECT_* defines. Reject connection if undefined bits are not 0 - DWORD dwPictAspectRatioX; // X dimension of picture aspect ratio, e.g. 16 for 16x9 display - DWORD dwPictAspectRatioY; // Y dimension of picture aspect ratio, e.g. 9 for 16x9 display - union { - DWORD dwControlFlags; // use AMCONTROL_* defines, use this from now on - DWORD dwReserved1; // for backward compatiblity (was "must be 0"; connection rejected otherwise) - }; - DWORD dwReserved2; // must be 0; reject connection otherwise - BITMAPINFOHEADER bmiHeader; -} VIDEOINFOHEADER2; - -typedef struct tagMPEG2VIDEOINFO { - VIDEOINFOHEADER2 hdr; - DWORD dwStartTimeCode; // ?? not used for DVD ?? - DWORD cbSequenceHeader; // is 0 for DVD (no sequence header) - DWORD dwProfile; // use enum MPEG2Profile - DWORD dwLevel; // use enum MPEG2Level - DWORD dwFlags; // use AMMPEG2_* defines. Reject connection if undefined bits are not 0 - DWORD dwSequenceHeader[1]; // DWORD instead of Byte for alignment purposes - // For MPEG-2, if a sequence_header is included, the sequence_extension - // should also be included -} MPEG2VIDEOINFO; - -#define SIZE_MPEG2VIDEOINFO(pv) (FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader[0]) + (pv)->cbSequenceHeader) - -// do not use -#define MPEG1_SEQUENCE_INFO(pv) ((const BYTE *)(pv)->bSequenceHeader) - -// use this macro instead, the previous only works for MPEG1VIDEOINFO structures -#define MPEG2_SEQUENCE_INFO(pv) ((const BYTE *)(pv)->dwSequenceHeader) - - -//=================================================================================== -// flags for dwTypeSpecificFlags in AM_SAMPLE2_PROPERTIES which define type specific -// data in IMediaSample2 -//=================================================================================== - -#define AM_VIDEO_FLAG_FIELD_MASK 0x0003L // use this mask to check whether the sample is field1 or field2 or frame -#define AM_VIDEO_FLAG_INTERLEAVED_FRAME 0x0000L // the sample is a frame (remember to use AM_VIDEO_FLAG_FIELD_MASK when using this) -#define AM_VIDEO_FLAG_FIELD1 0x0001L // the sample is field1 (remember to use AM_VIDEO_FLAG_FIELD_MASK when using this) -#define AM_VIDEO_FLAG_FIELD2 0x0002L // the sample is the field2 (remember to use AM_VIDEO_FLAG_FIELD_MASK when using this) -#define AM_VIDEO_FLAG_FIELD1FIRST 0x0004L // if set means display field1 first, else display field2 first. - // this bit is irrelavant for 1FieldPerSample mode -#define AM_VIDEO_FLAG_WEAVE 0x0008L // if set use bob display mode else weave -#define AM_VIDEO_FLAG_IPB_MASK 0x0030L // use this mask to check whether the sample is I, P or B -#define AM_VIDEO_FLAG_I_SAMPLE 0x0000L // I Sample (remember to use AM_VIDEO_FLAG_IPB_MASK when using this) -#define AM_VIDEO_FLAG_P_SAMPLE 0x0010L // P Sample (remember to use AM_VIDEO_FLAG_IPB_MASK when using this) -#define AM_VIDEO_FLAG_B_SAMPLE 0x0020L // B Sample (remember to use AM_VIDEO_FLAG_IPB_MASK when using this) -#define AM_VIDEO_FLAG_REPEAT_FIELD 0x0040L // if set means display the field which has been displayed first again after displaying - // both fields first. This bit is irrelavant for 1FieldPerSample mode - -// ----------------------------------------------------------------------- -// AM_KSPROPSETID_DvdKaraoke property set definitions -// ----------------------------------------------------------------------- - -typedef struct tagAM_DvdKaraokeData -{ - DWORD dwDownmix; // bitwise OR of AM_DvdKaraoke_Downmix flags - DWORD dwSpeakerAssignment; // AM_DvdKaraoke_SpeakerAssignment -} AM_DvdKaraokeData; - -typedef enum { - AM_PROPERTY_DVDKARAOKE_ENABLE = 0, // BOOL - AM_PROPERTY_DVDKARAOKE_DATA = 1, -} AM_PROPERTY_DVDKARAOKE; - -// ----------------------------------------------------------------------- -// AM_KSPROPSETID_TSRateChange property set definitions for time stamp -// rate changes. -// ----------------------------------------------------------------------- - -typedef enum { - AM_RATE_SimpleRateChange = 1, // rw, use AM_SimpleRateChange - AM_RATE_ExactRateChange = 2, // rw, use AM_ExactRateChange - AM_RATE_MaxFullDataRate = 3, // r, use AM_MaxFullDataRate - AM_RATE_Step = 4 // w, use AM_Step -} AM_PROPERTY_TS_RATE_CHANGE; - -// ------------------------------------------------------------------- -// AM_KSPROPSETID_DVD_RateChange property set definitions for new DVD -// rate change scheme. -// ------------------------------------------------------------------- - -typedef enum { - AM_RATE_ChangeRate = 1, // w, use AM_DVD_ChangeRate - AM_RATE_FullDataRateMax = 2, // r, use AM_MaxFullDataRate - AM_RATE_ReverseDecode = 3, // r, use LONG - AM_RATE_DecoderPosition = 4, // r, use AM_DVD_DecoderPosition - AM_RATE_DecoderVersion = 5 // r, use LONG -} AM_PROPERTY_DVD_RATE_CHANGE; - -typedef struct { - // this is the simplest mechanism to set a time stamp rate change on - // a filter (simplest for the person setting the rate change, harder - // for the filter doing the rate change). - REFERENCE_TIME StartTime; //stream time at which to start this rate - LONG Rate; //new rate * 10000 (decimal) -} AM_SimpleRateChange; - -typedef struct { - REFERENCE_TIME OutputZeroTime; //input TS that maps to zero output TS - LONG Rate; //new rate * 10000 (decimal) -} AM_ExactRateChange; - -typedef LONG AM_MaxFullDataRate; //rate * 10000 (decimal) - -typedef DWORD AM_Step; // number of frame to step - -// New rate change property set, structs. enums etc. -typedef struct { - REFERENCE_TIME StartInTime; // stream time (input) at which to start decoding at this rate - REFERENCE_TIME StartOutTime; // reference time (output) at which to start showing at this rate - LONG Rate; // new rate * 10000 (decimal) -} AM_DVD_ChangeRate ; - -typedef LONGLONG AM_DVD_DecoderPosition ; - -typedef enum { - DVD_DIR_FORWARD = 0, - DVD_DIR_BACKWARD = 1 -} DVD_PLAY_DIRECTION ; - -#ifdef __cplusplus -} -#endif // __cplusplus -#endif // __DVDMEDIA_H__ diff --git a/import/DirectX8/include/dvoice.h b/import/DirectX8/include/dvoice.h deleted file mode 100644 index b11a255cf..000000000 --- a/import/DirectX8/include/dvoice.h +++ /dev/null @@ -1,856 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) 1999 Microsoft Corporation. All Rights Reserved. - * - * File: dpvoice.h - * Content: DirectPlayVoice include file - ***************************************************************************/ - -#ifndef __DVOICE__ -#define __DVOICE__ - -#include // for DECLARE_INTERFACE and HRESULT -#include -#include -#include -#include "dsound.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**************************************************************************** - * - * DirectPlayVoice CLSIDs - * - ****************************************************************************/ - - -// {B9F3EB85-B781-4ac1-8D90-93A05EE37D7D} -DEFINE_GUID(CLSID_DirectPlayVoiceClient, -0xb9f3eb85, 0xb781, 0x4ac1, 0x8d, 0x90, 0x93, 0xa0, 0x5e, 0xe3, 0x7d, 0x7d); - -// {D3F5B8E6-9B78-4a4c-94EA-CA2397B663D3} -DEFINE_GUID(CLSID_DirectPlayVoiceServer, -0xd3f5b8e6, 0x9b78, 0x4a4c, 0x94, 0xea, 0xca, 0x23, 0x97, 0xb6, 0x63, 0xd3); - -// {0F0F094B-B01C-4091-A14D-DD0CD807711A} -DEFINE_GUID(CLSID_DirectPlayVoiceTest, -0xf0f094b, 0xb01c, 0x4091, 0xa1, 0x4d, 0xdd, 0xc, 0xd8, 0x7, 0x71, 0x1a); - -/**************************************************************************** - * - * DirectPlayVoice Interface IIDs - * - ****************************************************************************/ - - -// {1DFDC8EA-BCF7-41d6-B295-AB64B3B23306} -DEFINE_GUID(IID_IDirectPlayVoiceClient, -0x1dfdc8ea, 0xbcf7, 0x41d6, 0xb2, 0x95, 0xab, 0x64, 0xb3, 0xb2, 0x33, 0x6); - -// {FAA1C173-0468-43b6-8A2A-EA8A4F2076C9} -DEFINE_GUID(IID_IDirectPlayVoiceServer, -0xfaa1c173, 0x468, 0x43b6, 0x8a, 0x2a, 0xea, 0x8a, 0x4f, 0x20, 0x76, 0xc9); - -// {D26AF734-208B-41da-8224-E0CE79810BE1} -DEFINE_GUID(IID_IDirectPlayVoiceTest, -0xd26af734, 0x208b, 0x41da, 0x82, 0x24, 0xe0, 0xce, 0x79, 0x81, 0xb, 0xe1); - -/**************************************************************************** - * - * DirectPlayVoice Compression Type GUIDs - * - ****************************************************************************/ - -// MS-ADPCM 32.8 kbit/s -// -// {699B52C1-A885-46a8-A308-97172419ADC7} -DEFINE_GUID(DPVCTGUID_ADPCM, -0x699b52c1, 0xa885, 0x46a8, 0xa3, 0x8, 0x97, 0x17, 0x24, 0x19, 0xad, 0xc7); - -// Microsoft GSM 6.10 13 kbit/s -// -// {24768C60-5A0D-11d3-9BE4-525400D985E7} -DEFINE_GUID(DPVCTGUID_GSM, -0x24768c60, 0x5a0d, 0x11d3, 0x9b, 0xe4, 0x52, 0x54, 0x0, 0xd9, 0x85, 0xe7); - -// MS-PCM 64 kbit/s -// -// {8DE12FD4-7CB3-48ce-A7E8-9C47A22E8AC5} -DEFINE_GUID(DPVCTGUID_NONE, -0x8de12fd4, 0x7cb3, 0x48ce, 0xa7, 0xe8, 0x9c, 0x47, 0xa2, 0x2e, 0x8a, 0xc5); - -// Voxware SC03 3.2kbit/s -// -// {7D82A29B-2242-4f82-8F39-5D1153DF3E41} -DEFINE_GUID(DPVCTGUID_SC03, -0x7d82a29b, 0x2242, 0x4f82, 0x8f, 0x39, 0x5d, 0x11, 0x53, 0xdf, 0x3e, 0x41); - -// Voxware SC06 6.4kbit/s -// -// {53DEF900-7168-4633-B47F-D143916A13C7} -DEFINE_GUID(DPVCTGUID_SC06, -0x53def900, 0x7168, 0x4633, 0xb4, 0x7f, 0xd1, 0x43, 0x91, 0x6a, 0x13, 0xc7); - -// TrueSpeech(TM) 8.6 kbit/s -// -// {D7954361-5A0B-11d3-9BE4-525400D985E7} -DEFINE_GUID(DPVCTGUID_TRUESPEECH, -0xd7954361, 0x5a0b, 0x11d3, 0x9b, 0xe4, 0x52, 0x54, 0x0, 0xd9, 0x85, 0xe7); - -// Voxware VR12 1.4kbit/s -// -// {FE44A9FE-8ED4-48bf-9D66-1B1ADFF9FF6D} -DEFINE_GUID(DPVCTGUID_VR12, -0xfe44a9fe, 0x8ed4, 0x48bf, 0x9d, 0x66, 0x1b, 0x1a, 0xdf, 0xf9, 0xff, 0x6d); - -// Define the default compression type -#define DPVCTGUID_DEFAULT DPVCTGUID_SC03 - -/**************************************************************************** - * - * DirectPlayVoice Interface Pointer definitions - * - ****************************************************************************/ - -typedef struct IDirectPlayVoiceClient FAR *LPDIRECTPLAYVOICECLIENT, *PDIRECTPLAYVOICECLIENT; -typedef struct IDirectPlayVoiceServer FAR *LPDIRECTPLAYVOICESERVER, *PDIRECTPLAYVOICESERVER; -typedef struct IDirectPlayVoiceTest FAR *LPDIRECTPLAYVOICETEST, *PDIRECTPLAYVOICETEST; - -/**************************************************************************** - * - * DirectPlayVoice Callback Functions - * - ****************************************************************************/ -typedef HRESULT (FAR PASCAL *PDVMESSAGEHANDLER)( - PVOID pvUserContext, - DWORD dwMessageType, - LPVOID lpMessage -); - -typedef PDVMESSAGEHANDLER LPDVMESSAGEHANDLER; - -/**************************************************************************** - * - * DirectPlayVoice Datatypes (Non-Structure / Non-Message) - * - ****************************************************************************/ - -typedef DWORD DVID, *LPDVID, *PDVID; - -/**************************************************************************** - * - * DirectPlayVoice Message Types - * - ****************************************************************************/ - -#define DVMSGID_BASE 0x0000 - -#define DVMSGID_MINBASE (DVMSGID_CREATEVOICEPLAYER) -#define DVMSGID_CREATEVOICEPLAYER (DVMSGID_BASE+0x0001) -#define DVMSGID_DELETEVOICEPLAYER (DVMSGID_BASE+0x0002) -#define DVMSGID_SESSIONLOST (DVMSGID_BASE+0x0003) -#define DVMSGID_PLAYERVOICESTART (DVMSGID_BASE+0x0004) -#define DVMSGID_PLAYERVOICESTOP (DVMSGID_BASE+0x0005) -#define DVMSGID_RECORDSTART (DVMSGID_BASE+0x0006) -#define DVMSGID_RECORDSTOP (DVMSGID_BASE+0x0007) -#define DVMSGID_CONNECTRESULT (DVMSGID_BASE+0x0008) -#define DVMSGID_DISCONNECTRESULT (DVMSGID_BASE+0x0009) -#define DVMSGID_INPUTLEVEL (DVMSGID_BASE+0x000A) -#define DVMSGID_OUTPUTLEVEL (DVMSGID_BASE+0x000B) -#define DVMSGID_HOSTMIGRATED (DVMSGID_BASE+0x000C) -#define DVMSGID_SETTARGETS (DVMSGID_BASE+0x000D) -#define DVMSGID_PLAYEROUTPUTLEVEL (DVMSGID_BASE+0x000E) -#define DVMSGID_LOSTFOCUS (DVMSGID_BASE+0x0010) -#define DVMSGID_GAINFOCUS (DVMSGID_BASE+0x0011) -#define DVMSGID_LOCALHOSTSETUP (DVMSGID_BASE+0x0012) -#define DVMSGID_MAXBASE (DVMSGID_LOCALHOSTSETUP) - -/**************************************************************************** - * - * DirectPlayVoice Constants - * - ****************************************************************************/ - -// -// Buffer Aggresiveness Value Ranges -// -#define DVBUFFERAGGRESSIVENESS_MIN 0x00000001 -#define DVBUFFERAGGRESSIVENESS_MAX 0x00000064 -#define DVBUFFERAGGRESSIVENESS_DEFAULT 0x00000000 - -// -// Buffer Quality Value Ranges -// -#define DVBUFFERQUALITY_MIN 0x00000001 -#define DVBUFFERQUALITY_MAX 0x00000064 -#define DVBUFFERQUALITY_DEFAULT 0x00000000 - -#define DVID_SYS 0 - -// -// Used to identify the session host in client/server -// -#define DVID_SERVERPLAYER 1 - -// -// Used to target all players -// -#define DVID_ALLPLAYERS 0 - -// -// Used to identify the main buffer -// -#define DVID_REMAINING 0xFFFFFFFF - -// -// Input level range -// -#define DVINPUTLEVEL_MIN 0x00000000 -#define DVINPUTLEVEL_MAX 0x00000063 // 99 decimal - -#define DVNOTIFYPERIOD_MINPERIOD 20 - - -#define DVPLAYBACKVOLUME_DEFAULT DSBVOLUME_MAX - -#define DVRECORDVOLUME_LAST 0x00000001 - - -// -// Use the default value -// -#define DVTHRESHOLD_DEFAULT 0xFFFFFFFF - -// -// Threshold Ranges -// -#define DVTHRESHOLD_MIN 0x00000000 -#define DVTHRESHOLD_MAX 0x00000063 // 99 decimal - -// -// Threshold field is not used -// -#define DVTHRESHOLD_UNUSED 0xFFFFFFFE - -// -// Session Types -// -#define DVSESSIONTYPE_PEER 0x00000001 -#define DVSESSIONTYPE_MIXING 0x00000002 -#define DVSESSIONTYPE_FORWARDING 0x00000003 -#define DVSESSIONTYPE_ECHO 0x00000004 - -/**************************************************************************** - * - * DirectPlayVoice Flags - * - ****************************************************************************/ - - -// -// Enable automatic adjustment of the recording volume -// -#define DVCLIENTCONFIG_AUTORECORDVOLUME 0x00000008 - -// -// Enable automatic voice activation -// -#define DVCLIENTCONFIG_AUTOVOICEACTIVATED 0x00000020 - -// -// Enable echo suppression -// -#define DVCLIENTCONFIG_ECHOSUPPRESSION 0x08000000 - -// -// Voice Activation manual mode -// -#define DVCLIENTCONFIG_MANUALVOICEACTIVATED 0x00000004 - -// -// Only playback voices that have buffers created for them -// -#define DVCLIENTCONFIG_MUTEGLOBAL 0x00000010 - -// -// Mute the playback -// -#define DVCLIENTCONFIG_PLAYBACKMUTE 0x00000002 - -// -// Mute the recording -// -#define DVCLIENTCONFIG_RECORDMUTE 0x00000001 - -// -// Complete the operation before returning -// -#define DVFLAGS_SYNC 0x00000001 - -// -// Just check to see if wizard has been run, and if so what it's results were -// -#define DVFLAGS_QUERYONLY 0x00000002 - -// -// Shutdown the voice session without migrating the host -// -#define DVFLAGS_NOHOSTMIGRATE 0x00000008 - -// -// Allow the back button to be enabled in the wizard -// -#define DVFLAGS_ALLOWBACK 0x00000010 - -// -// Disable host migration in the voice session -// -#define DVSESSION_NOHOSTMIGRATION 0x00000001 - -// -// Server controlled targetting -// -#define DVSESSION_SERVERCONTROLTARGET 0x00000002 - -// -// Use DirectSound Normal Mode instead of priority -// -#define DVSOUNDCONFIG_NORMALMODE 0x00000001 - -// -// Automatically select the microphone -// -#define DVSOUNDCONFIG_AUTOSELECT 0x00000002 - -// -// Run in half duplex mode -// -#define DVSOUNDCONFIG_HALFDUPLEX 0x00000004 - -// -// No volume controls are available for the recording device -// -#define DVSOUNDCONFIG_NORECVOLAVAILABLE 0x00000010 - -// -// Disable capture sharing -// -#define DVSOUNDCONFIG_NOFOCUS 0x20000000 - -// -// Set system conversion quality to high -// -#define DVSOUNDCONFIG_SETCONVERSIONQUALITY 0x00000008 - -// -// Enable strict focus mode -// -#define DVSOUNDCONFIG_STRICTFOCUS 0x40000000 - -// -// Player is in half duplex mode -// -#define DVPLAYERCAPS_HALFDUPLEX 0x00000001 - -// -// Specifies that player is the local player -// -#define DVPLAYERCAPS_LOCAL 0x00000002 - -/**************************************************************************** - * - * DirectPlayVoice Structures (Non-Message) - * - ****************************************************************************/ - - -// -// DirectPlayVoice Caps -// (GetCaps / SetCaps) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - DWORD dwFlags; // Caps flags -} DVCAPS, *LPDVCAPS, *PDVCAPS; - -// -// DirectPlayVoice Client Configuration -// (Connect / GetClientConfig) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - DWORD dwFlags; // Flags for client config (DVCLIENTCONFIG_...) - LONG lRecordVolume; // Recording volume - LONG lPlaybackVolume; // Playback volume - DWORD dwThreshold; // Voice Activation Threshold - DWORD dwBufferQuality; // Buffer quality - DWORD dwBufferAggressiveness; // Buffer aggressiveness - DWORD dwNotifyPeriod; // Period of notification messages (ms) -} DVCLIENTCONFIG, *LPDVCLIENTCONFIG, *PDVCLIENTCONFIG; - -// -// DirectPlayVoice Compression Type Information -// (GetCompressionTypes) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - GUID guidType; // GUID that identifies this compression type - LPWSTR lpszName; // String name of this compression type - LPWSTR lpszDescription; // Description for this compression type - DWORD dwFlags; // Flags for this compression type - DWORD dwMaxBitsPerSecond; // Maximum # of bit/s this compression type uses -} DVCOMPRESSIONINFO, *LPDVCOMPRESSIONINFO, *PDVCOMPRESSIONINFO; - -// -// DirectPlayVoice Session Description -// (Host / GetSessionDesc) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - DWORD dwFlags; // Session flags (DVSESSION_...) - DWORD dwSessionType; // Session type (DVSESSIONTYPE_...) - GUID guidCT; // Compression Type to use - DWORD dwBufferQuality; // Buffer quality - DWORD dwBufferAggressiveness; // Buffer aggresiveness -} DVSESSIONDESC, *LPDVSESSIONDESC, *PDVSESSIONDESC; - -// -// DirectPlayVoice Client Sound Device Configuration -// (Connect / GetSoundDeviceConfig) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - DWORD dwFlags; // Flags for sound config (DVSOUNDCONFIG_...) - GUID guidPlaybackDevice; // GUID of the playback device to use - LPDIRECTSOUND lpdsPlaybackDevice; // DirectSound Object to use (optional) - GUID guidCaptureDevice; // GUID of the capture device to use - LPDIRECTSOUNDCAPTURE lpdsCaptureDevice; // DirectSoundCapture Object to use (optional) - HWND hwndAppWindow; // HWND of your application's top-level window - LPDIRECTSOUNDBUFFER lpdsMainBuffer; // DirectSoundBuffer to use for playback (optional) - DWORD dwMainBufferFlags; // Flags to pass to Play() on the main buffer - DWORD dwMainBufferPriority; // Priority to set when calling Play() on the main buffer -} DVSOUNDDEVICECONFIG, *LPDVSOUNDDEVICECONFIG, *PDVSOUNDDEVICECONFIG; - -/**************************************************************************** - * - * DirectPlayVoice message handler call back structures - * - ****************************************************************************/ - -// -// Result of the Connect() call. (If it wasn't called Async) -// (DVMSGID_CONNECTRESULT) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - HRESULT hrResult; // Result of the Connect() call -} DVMSG_CONNECTRESULT, *LPDVMSG_CONNECTRESULT, *PDVMSG_CONNECTRESULT; - -// -// A new player has entered the voice session -// (DVMSGID_CREATEVOICEPLAYER) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - DVID dvidPlayer; // DVID of the player who joined - DWORD dwFlags; // Player flags (DVPLAYERCAPS_...) - PVOID pvPlayerContext; // Context value for this player (user set) -} DVMSG_CREATEVOICEPLAYER, *LPDVMSG_CREATEVOICEPLAYER, *PDVMSG_CREATEVOICEPLAYER; - -// -// A player has left the voice session -// (DVMSGID_DELETEVOICEPLAYER) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - DVID dvidPlayer; // DVID of the player who left - PVOID pvPlayerContext; // Context value for the player -} DVMSG_DELETEVOICEPLAYER, *LPDVMSG_DELETEVOICEPLAYER, *PDVMSG_DELETEVOICEPLAYER; - -// -// Result of the Disconnect() call. (If it wasn't called Async) -// (DVMSGID_DISCONNECTRESULT) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - HRESULT hrResult; // Result of the Disconnect() call -} DVMSG_DISCONNECTRESULT, *LPDVMSG_DISCONNECTRESULT, *PDVMSG_DISCONNECTRESULT; - -// -// The voice session host has migrated. -// (DVMSGID_HOSTMIGRATED) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - DVID dvidNewHostID; // DVID of the player who is now the host - LPDIRECTPLAYVOICESERVER pdvServerInterface; - // Pointer to the new host object (if local player is now host) -} DVMSG_HOSTMIGRATED, *LPDVMSG_HOSTMIGRATED, *PDVMSG_HOSTMIGRATED; - -// -// The current input level / recording volume on the local machine -// (DVMSGID_INPUTLEVEL) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - DWORD dwPeakLevel; // Current peak level of the audio - LONG lRecordVolume; // Current recording volume - PVOID pvLocalPlayerContext; // Context value for the local player -} DVMSG_INPUTLEVEL, *LPDVMSG_INPUTLEVEL, *PDVMSG_INPUTLEVEL; - -// -// The local client is about to become the new host -// (DVMSGID_LOCALHOSTSETUP) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - PVOID pvContext; // Context value to be passed to Initialize() of new host object - PDVMESSAGEHANDLER pMessageHandler; // Message handler to be used by new host object -} DVMSG_LOCALHOSTSETUP, *LPDVMSG_LOCALHOSTSETUP, *PDVMSG_LOCALHOSTSETUP; - -// -// The current output level for the combined output of all incoming streams. -// (DVMSGID_OUTPUTLEVEL) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - DWORD dwPeakLevel; // Current peak level of the output - LONG lOutputVolume; // Current playback volume - PVOID pvLocalPlayerContext; // Context value for the local player -} DVMSG_OUTPUTLEVEL, *LPDVMSG_OUTPUTLEVEL, *PDVMSG_OUTPUTLEVEL; - -// -// The current peak level of an individual player's incoming audio stream as it is -// being played back. -// (DVMSGID_PLAYEROUTPUTLEVEL) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - DVID dvidSourcePlayerID; // DVID of the player - DWORD dwPeakLevel; // Peak level of the player's stream - PVOID pvPlayerContext; // Context value for the player -} DVMSG_PLAYEROUTPUTLEVEL, *LPDVMSG_PLAYEROUTPUTLEVEL, *PDVMSG_PLAYEROUTPUTLEVEL; - -// -// An audio stream from the specified player has started playing back on the local client. -// (DVMSGID_PLAYERVOICESTART). -// -typedef struct -{ - DWORD dwSize; // Size of this structure - DVID dvidSourcePlayerID; // DVID of the Player - PVOID pvPlayerContext; // Context value for this player -} DVMSG_PLAYERVOICESTART, *LPDVMSG_PLAYERVOICESTART, *PDVMSG_PLAYERVOICESTART; - -// -// The audio stream from the specified player has stopped playing back on the local client. -// (DVMSGID_PLAYERVOICESTOP) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - DVID dvidSourcePlayerID; // DVID of the player - PVOID pvPlayerContext; // Context value for this player -} DVMSG_PLAYERVOICESTOP, *LPDVMSG_PLAYERVOICESTOP, *PDVMSG_PLAYERVOICESTOP; - -// -// Transmission has started on the local machine -// (DVMSGID_RECORDSTART) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - DWORD dwPeakLevel; // Peak level that caused transmission to start - PVOID pvLocalPlayerContext; // Context value for the local player -} DVMSG_RECORDSTART, *LPDVMSG_RECORDSTART, *PDVMSG_RECORDSTART; - -// -// Transmission has stopped on the local machine -// (DVMSGID_RECORDSTOP) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - DWORD dwPeakLevel; // Peak level that caused transmission to stop - PVOID pvLocalPlayerContext; // Context value for the local player -} DVMSG_RECORDSTOP, *LPDVMSG_RECORDSTOP, *PDVMSG_RECORDSTOP; - -// -// The voice session has been lost -// (DVMSGID_SESSIONLOST) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - HRESULT hrResult; // Reason the session was disconnected -} DVMSG_SESSIONLOST, *LPDVMSG_SESSIONLOST, *PDVMSG_SESSIONLOST; - -// -// The target list has been updated for the local client -// (DVMSGID_SETTARGETS) -// -typedef struct -{ - DWORD dwSize; // Size of this structure - DWORD dwNumTargets; // # of targets - PDVID pdvidTargets; // An array of DVIDs specifying the current targets -} DVMSG_SETTARGETS, *LPDVMSG_SETTARGETS, *PDVMSG_SETTARGETS; - - -/**************************************************************************** - * - * DirectPlayVoice Functions - * - ****************************************************************************/ - -/* - * - * This function is no longer supported. It is recommended that CoCreateInstance be used to create - * DirectPlay voice objects. - * - * extern HRESULT WINAPI DirectPlayVoiceCreate( const GUID * pcIID, void **ppvInterface, IUnknown *pUnknown); - * - */ - -/**************************************************************************** - * - * DirectPlay8 Application Interfaces - * - ****************************************************************************/ - -#undef INTERFACE -#define INTERFACE IDirectPlayVoiceClient -DECLARE_INTERFACE_( IDirectPlayVoiceClient, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, PVOID *ppvObj) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - /*** IDirectPlayVoiceClient methods ***/ - STDMETHOD_(HRESULT, Initialize) (THIS_ LPUNKNOWN, PDVMESSAGEHANDLER, PVOID, PDWORD, DWORD ) PURE; - STDMETHOD_(HRESULT, Connect) (THIS_ PDVSOUNDDEVICECONFIG, PDVCLIENTCONFIG, DWORD ) PURE; - STDMETHOD_(HRESULT, Disconnect) (THIS_ DWORD ) PURE; - STDMETHOD_(HRESULT, GetSessionDesc)(THIS_ PDVSESSIONDESC ) PURE; - STDMETHOD_(HRESULT, GetClientConfig)(THIS_ PDVCLIENTCONFIG ) PURE; - STDMETHOD_(HRESULT, SetClientConfig)(THIS_ PDVCLIENTCONFIG ) PURE; - STDMETHOD_(HRESULT, GetCaps) (THIS_ PDVCAPS ) PURE; - STDMETHOD_(HRESULT, GetCompressionTypes)( THIS_ PVOID, PDWORD, PDWORD, DWORD ) PURE; - STDMETHOD_(HRESULT, SetTransmitTargets)( THIS_ PDVID, DWORD, DWORD ) PURE; - STDMETHOD_(HRESULT, GetTransmitTargets)( THIS_ PDVID, PDWORD, DWORD ) PURE; - STDMETHOD_(HRESULT, Create3DSoundBuffer)( THIS_ DVID, LPDIRECTSOUNDBUFFER, DWORD, DWORD, LPDIRECTSOUND3DBUFFER * ) PURE; - STDMETHOD_(HRESULT, Delete3DSoundBuffer)( THIS_ DVID, LPDIRECTSOUND3DBUFFER * ) PURE; - STDMETHOD_(HRESULT, SetNotifyMask)( THIS_ PDWORD, DWORD ) PURE; - STDMETHOD_(HRESULT, GetSoundDeviceConfig)( THIS_ PDVSOUNDDEVICECONFIG, PDWORD ) PURE; -}; - - -#undef INTERFACE -#define INTERFACE IDirectPlayVoiceServer -DECLARE_INTERFACE_( IDirectPlayVoiceServer, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectPlayVoiceServer methods ***/ - STDMETHOD_(HRESULT, Initialize) (THIS_ LPUNKNOWN, PDVMESSAGEHANDLER, PVOID, LPDWORD, DWORD ) PURE; - STDMETHOD_(HRESULT, StartSession) (THIS_ PDVSESSIONDESC, DWORD ) PURE; - STDMETHOD_(HRESULT, StopSession) (THIS_ DWORD ) PURE; - STDMETHOD_(HRESULT, GetSessionDesc)(THIS_ PDVSESSIONDESC ) PURE; - STDMETHOD_(HRESULT, SetSessionDesc)(THIS_ PDVSESSIONDESC ) PURE; - STDMETHOD_(HRESULT, GetCaps) (THIS_ PDVCAPS ) PURE; - STDMETHOD_(HRESULT, GetCompressionTypes)( THIS_ PVOID, PDWORD, PDWORD, DWORD ) PURE; - STDMETHOD_(HRESULT, SetTransmitTargets)( THIS_ DVID, PDVID, DWORD, DWORD ) PURE; - STDMETHOD_(HRESULT, GetTransmitTargets)( THIS_ DVID, PDVID, PDWORD, DWORD ) PURE; - STDMETHOD_(HRESULT, SetNotifyMask)( THIS_ PDWORD, DWORD ) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirectPlayVoiceTest -DECLARE_INTERFACE_( IDirectPlayVoiceTest, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, PVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectPlayVoiceTest methods ***/ - STDMETHOD_(HRESULT, CheckAudioSetup) (THIS_ const GUID *, const GUID * , HWND, DWORD ) PURE; -}; - -#if !defined(__cplusplus) || defined(CINTERFACE) - -#define IDirectPlayVoiceClient_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectPlayVoiceClient_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectPlayVoiceClient_Release(p) (p)->lpVtbl->Release(p) - -#define IDirectPlayVoiceClient_Initialize(p,a,b,c,d,e) (p)->lpVtbl->Initialize(p,a,b,c,d,e) -#define IDirectPlayVoiceClient_Connect(p,a,b,c) (p)->lpVtbl->Connect(p,a,b,c) -#define IDirectPlayVoiceClient_Disconnect(p,a) (p)->lpVtbl->Disconnect(p,a) -#define IDirectPlayVoiceClient_GetSessionDesc(p,a) (p)->lpVtbl->GetSessionDesc(p,a) -#define IDirectPlayVoiceClient_GetClientConfig(p,a) (p)->lpVtbl->GetClientConfig(p,a) -#define IDirectPlayVoiceClient_SetClientConfig(p,a) (p)->lpVtbl->SetClientConfig(p,a) -#define IDirectPlayVoiceClient_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) -#define IDirectPlayVoiceClient_GetCompressionTypes(p,a,b,c,d) (p)->lpVtbl->GetCompressionTypes(p,a,b,c,d) -#define IDirectPlayVoiceClient_SetTransmitTargets(p,a,b,c) (p)->lpVtbl->SetTransmitTargets(p,a,b,c) -#define IDirectPlayVoiceClient_GetTransmitTargets(p,a,b,c) (p)->lpVtbl->GetTransmitTargets(p,a,b,c) -#define IDirectPlayVoiceClient_Create3DSoundBuffer(p,a,b,c,d,e) (p)->lpVtbl->Create3DSoundBuffer(p,a,b,c,d,e) -#define IDirectPlayVoiceClient_Delete3DSoundBuffer(p,a,b) (p)->lpVtbl->Delete3DSoundBuffer(p,a,b) -#define IDirectPlayVoiceClient_SetNotifyMask(p,a,b) (p)->lpVtbl->SetNotifyMask(p,a,b) -#define IDirectPlayVoiceClient_GetSoundDeviceConfig(p,a,b) (p)->lpVtbl->GetSoundDeviceConfig(p,a,b) - -#define IDirectPlayVoiceServer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectPlayVoiceServer_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectPlayVoiceServer_Release(p) (p)->lpVtbl->Release(p) - -#define IDirectPlayVoiceServer_Initialize(p,a,b,c,d,e) (p)->lpVtbl->Initialize(p,a,b,c,d,e) -#define IDirectPlayVoiceServer_StartSession(p,a,b) (p)->lpVtbl->StartSession(p,a,b) -#define IDirectPlayVoiceServer_StopSession(p,a) (p)->lpVtbl->StopSession(p,a) -#define IDirectPlayVoiceServer_GetSessionDesc(p,a) (p)->lpVtbl->GetSessionDesc(p,a) -#define IDirectPlayVoiceServer_SetSessionDesc(p,a) (p)->lpVtbl->SetSessionDesc(p,a) -#define IDirectPlayVoiceServer_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) -#define IDirectPlayVoiceServer_GetCompressionTypes(p,a,b,c,d) (p)->lpVtbl->GetCompressionTypes(p,a,b,c,d) -#define IDirectPlayVoiceServer_SetTransmitTargets(p,a,b,c,d) (p)->lpVtbl->SetTransmitTargets(p,a,b,c,d) -#define IDirectPlayVoiceServer_GetTransmitTargets(p,a,b,c,d) (p)->lpVtbl->GetTransmitTargets(p,a,b,c,d) -#define IDirectPlayVoiceServer_SetNotifyMask(p,a,b) (p)->lpVtbl->SetNotifyMask(p,a,b) -#define IDirectPlayVoiceTest_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectPlayVoiceTest_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectPlayVoiceTest_Release(p) (p)->lpVtbl->Release(p) -#define IDirectPlayVoiceTest_CheckAudioSetup(p,a,b,c,d) (p)->lpVtbl->CheckAudioSetup(p,a,b,c,d) - - -#else /* C++ */ - -#define IDirectPlayVoiceClient_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectPlayVoiceClient_AddRef(p) (p)->AddRef() -#define IDirectPlayVoiceClient_Release(p) (p)->Release() - -#define IDirectPlayVoiceClient_Initialize(p,a,b,c,d,e) (p)->Initialize(a,b,c,d,e) -#define IDirectPlayVoiceClient_Connect(p,a,b,c) (p)->Connect(a,b,c) -#define IDirectPlayVoiceClient_Disconnect(p,a) (p)->Disconnect(a) -#define IDirectPlayVoiceClient_GetSessionDesc(p,a) (p)->GetSessionDesc(a) -#define IDirectPlayVoiceClient_GetClientConfig(p,a) (p)->GetClientConfig(a) -#define IDirectPlayVoiceClient_SetClientConfig(p,a) (p)->SetClientConfig(a) -#define IDirectPlayVoiceClient_GetCaps(p,a) (p)->GetCaps(a) -#define IDirectPlayVoiceClient_GetCompressionTypes(p,a,b,c,d) (p)->GetCompressionTypes(a,b,c,d) -#define IDirectPlayVoiceClient_SetTransmitTargets(p,a,b,c) (p)->SetTransmitTargets(a,b,c) -#define IDirectPlayVoiceClient_GetTransmitTargets(p,a,b,c) (p)->GetTransmitTargets(a,b,c) -#define IDirectPlayVoiceClient_Create3DSoundBuffer(p,a,b,c,d,e) (p)->Create3DSoundBuffer(a,b,c,d,e) -#define IDirectPlayVoiceClient_Delete3DSoundBuffer(p,a,b) (p)->Delete3DSoundBuffer(a,b) -#define IDirectPlayVoiceClient_SetNotifyMask(p,a,b) (p)->SetNotifyMask(a,b) -#define IDirectPlayVoiceClient_GetSoundDeviceConfig(p,a,b) (p)->GetSoundDeviceConfig(a,b) - -#define IDirectPlayVoiceServer_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectPlayVoiceServer_AddRef(p) (p)->AddRef() -#define IDirectPlayVoiceServer_Release(p) (p)->Release() - -#define IDirectPlayVoiceServer_Initialize(p,a,b,c,d,e) (p)->Initialize(a,b,c,d,e) -#define IDirectPlayVoiceServer_StartSession(p,a,b) (p)->StartSession(a,b) -#define IDirectPlayVoiceServer_StopSession(p,a) (p)->StopSession(a) -#define IDirectPlayVoiceServer_GetSessionDesc(p,a) (p)->GetSessionDesc(a) -#define IDirectPlayVoiceServer_SetSessionDesc(p,a) (p)->SetSessionDesc(a) -#define IDirectPlayVoiceServer_GetCaps(p,a) (p)->GetCaps(a) -#define IDirectPlayVoiceServer_GetCompressionTypes(p,a,b,c,d) (p)->GetCompressionTypes(a,b,c,d) -#define IDirectPlayVoiceServer_SetTransmitTargets(p,a,b,c,d) (p)->SetTransmitTargets(a,b,c,d) -#define IDirectPlayVoiceServer_GetTransmitTargets(p,a,b,c,d) (p)->GetTransmitTargets(a,b,c,d) -#define IDirectPlayVoiceServer_SetNotifyMask(p,a,b) (p)->SetNotifyMask(a,b) - -#define IDirectPlayVoiceTest_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IDirectPlayVoiceTest_AddRef(p) (p)->AddRef() -#define IDirectPlayVoiceTest_Release(p) (p)->Release() -#define IDirectPlayVoiceTest_CheckAudioSetup(p,a,b,c,d) (p)->CheckAudioSetup(a,b,c,d) - - -#endif - - -/**************************************************************************** - * - * DIRECTPLAYVOICE ERRORS - * - * Errors are represented by negative values and cannot be combined. - * - ****************************************************************************/ - -#define _FACDPV 0x15 -#define MAKE_DVHRESULT( code ) MAKE_HRESULT( 1, _FACDPV, code ) - -#define DV_OK S_OK -#define DV_FULLDUPLEX MAKE_HRESULT( 0, _FACDPV, 0x0005 ) -#define DV_HALFDUPLEX MAKE_HRESULT( 0, _FACDPV, 0x000A ) -#define DV_PENDING MAKE_HRESULT( 0, _FACDPV, 0x0010 ) - -#define DVERR_BUFFERTOOSMALL MAKE_DVHRESULT( 0x001E ) -#define DVERR_EXCEPTION MAKE_DVHRESULT( 0x004A ) -#define DVERR_GENERIC E_FAIL -#define DVERR_INVALIDFLAGS MAKE_DVHRESULT( 0x0078 ) -#define DVERR_INVALIDOBJECT MAKE_DVHRESULT( 0x0082 ) -#define DVERR_INVALIDPARAM E_INVALIDARG -#define DVERR_INVALIDPLAYER MAKE_DVHRESULT( 0x0087 ) -#define DVERR_INVALIDGROUP MAKE_DVHRESULT( 0x0091 ) -#define DVERR_INVALIDHANDLE MAKE_DVHRESULT( 0x0096 ) -#define DVERR_OUTOFMEMORY E_OUTOFMEMORY -#define DVERR_PENDING DV_PENDING -#define DVERR_NOTSUPPORTED E_NOTIMPL -#define DVERR_NOINTERFACE E_NOINTERFACE -#define DVERR_SESSIONLOST MAKE_DVHRESULT( 0x012C ) -#define DVERR_NOVOICESESSION MAKE_DVHRESULT( 0x012E ) -#define DVERR_CONNECTIONLOST MAKE_DVHRESULT( 0x0168 ) -#define DVERR_NOTINITIALIZED MAKE_DVHRESULT( 0x0169 ) -#define DVERR_CONNECTED MAKE_DVHRESULT( 0x016A ) -#define DVERR_NOTCONNECTED MAKE_DVHRESULT( 0x016B ) -#define DVERR_CONNECTABORTING MAKE_DVHRESULT( 0x016E ) -#define DVERR_NOTALLOWED MAKE_DVHRESULT( 0x016F ) -#define DVERR_INVALIDTARGET MAKE_DVHRESULT( 0x0170 ) -#define DVERR_TRANSPORTNOTHOST MAKE_DVHRESULT( 0x0171 ) -#define DVERR_COMPRESSIONNOTSUPPORTED MAKE_DVHRESULT( 0x0172 ) -#define DVERR_ALREADYPENDING MAKE_DVHRESULT( 0x0173 ) -#define DVERR_SOUNDINITFAILURE MAKE_DVHRESULT( 0x0174 ) -#define DVERR_TIMEOUT MAKE_DVHRESULT( 0x0175 ) -#define DVERR_CONNECTABORTED MAKE_DVHRESULT( 0x0176 ) -#define DVERR_NO3DSOUND MAKE_DVHRESULT( 0x0177 ) -#define DVERR_ALREADYBUFFERED MAKE_DVHRESULT( 0x0178 ) -#define DVERR_NOTBUFFERED MAKE_DVHRESULT( 0x0179 ) -#define DVERR_HOSTING MAKE_DVHRESULT( 0x017A ) -#define DVERR_NOTHOSTING MAKE_DVHRESULT( 0x017B ) -#define DVERR_INVALIDDEVICE MAKE_DVHRESULT( 0x017C ) -#define DVERR_RECORDSYSTEMERROR MAKE_DVHRESULT( 0x017D ) -#define DVERR_PLAYBACKSYSTEMERROR MAKE_DVHRESULT( 0x017E ) -#define DVERR_SENDERROR MAKE_DVHRESULT( 0x017F ) -#define DVERR_USERCANCEL MAKE_DVHRESULT( 0x0180 ) -#define DVERR_RUNSETUP MAKE_DVHRESULT( 0x0183 ) -#define DVERR_INCOMPATIBLEVERSION MAKE_DVHRESULT( 0x0184 ) -#define DVERR_INITIALIZED MAKE_DVHRESULT( 0x0187 ) -#define DVERR_INVALIDPOINTER E_POINTER -#define DVERR_NOTRANSPORT MAKE_DVHRESULT( 0x0188 ) -#define DVERR_NOCALLBACK MAKE_DVHRESULT( 0x0189 ) -#define DVERR_TRANSPORTNOTINIT MAKE_DVHRESULT( 0x018A ) -#define DVERR_TRANSPORTNOSESSION MAKE_DVHRESULT( 0x018B ) -#define DVERR_TRANSPORTNOPLAYER MAKE_DVHRESULT( 0x018C ) -#define DVERR_USERBACK MAKE_DVHRESULT( 0x018D ) -#define DVERR_NORECVOLAVAILABLE MAKE_DVHRESULT( 0x018E ) -#define DVERR_INVALIDBUFFER MAKE_DVHRESULT( 0x018F ) -#define DVERR_LOCKEDBUFFER MAKE_DVHRESULT( 0x0190 ) - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/dvp.h b/import/DirectX8/include/dvp.h deleted file mode 100644 index c40dc793d..000000000 --- a/import/DirectX8/include/dvp.h +++ /dev/null @@ -1,966 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) Microsoft Corporation. All Rights Reserved. - * - * File: dvp.h - * Content: DirectDrawVideoPort include file - * - ***************************************************************************/ - -#ifndef __DVP_INCLUDED__ -#define __DVP_INCLUDED__ - -/* - * GUIDS used by DirectDrawVideoPort objects - */ -#if defined( _WIN32 ) && (!defined( _NO_COM ) || defined( DEFINE_GUID )) -DEFINE_GUID( IID_IDDVideoPortContainer, 0x6C142760,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 ); -DEFINE_GUID( IID_IDirectDrawVideoPort, 0xB36D93E0,0x2B43,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xB9,0x33,0x56 ); -DEFINE_GUID( IID_IDirectDrawVideoPortNotify, 0xA655FB94,0x0589,0x4E57,0xB3,0x33,0x56,0x7A,0x89,0x46,0x8C,0x88); - - - -DEFINE_GUID( DDVPTYPE_E_HREFH_VREFH, 0x54F39980L,0xDA60,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8); -DEFINE_GUID( DDVPTYPE_E_HREFH_VREFL, 0x92783220L,0xDA60,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8); -DEFINE_GUID( DDVPTYPE_E_HREFL_VREFH, 0xA07A02E0L,0xDA60,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8); -DEFINE_GUID( DDVPTYPE_E_HREFL_VREFL, 0xE09C77E0L,0xDA60,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8); -DEFINE_GUID( DDVPTYPE_CCIR656, 0xFCA326A0L,0xDA60,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8); -DEFINE_GUID( DDVPTYPE_BROOKTREE, 0x1352A560L,0xDA61,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8); -DEFINE_GUID( DDVPTYPE_PHILIPS, 0x332CF160L,0xDA61,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8); -#endif - -#ifndef GUID_DEFS_ONLY - -#if defined( _WIN32 ) && !defined( _NO_COM ) -#define COM_NO_WINDOWS_H -#include -#else -#define IUnknown void -#endif - -/* - * These definitions are required to allow polymorphic structure members (i.e. those - * that are referred to both as DWORDs and as pointers) to resolve into a type - * of correct size to hold the largest of those two types (i.e. pointer) on 64 bit - * systems. For 32 bit environments, ULONG_PTR resolves to a DWORD. - */ -#ifndef MAXULONG_PTR -#define ULONG_PTR DWORD -#endif //MAXULONG_PTR - -#ifdef __cplusplus -extern "C" { -#endif - -/*============================================================================ - * - * DirectDraw Structures - * - * Various structures used to invoke DirectDraw. - * - *==========================================================================*/ - -struct IDirectDraw; -struct IDirectDrawSurface; -struct IDirectDrawPalette; -struct IDirectDrawClipper; - -typedef struct IDDVideoPortContainer FAR *LPDDVIDEOPORTCONTAINER; -typedef struct IDirectDrawVideoPort FAR *LPDIRECTDRAWVIDEOPORT; -typedef struct IDirectDrawVideoPortNotify FAR *LPDIRECTDRAWVIDEOPORTNOTIFY; - -typedef struct _DDVIDEOPORTCONNECT FAR *LPDDVIDEOPORTCONNECT; -typedef struct _DDVIDEOPORTCAPS FAR *LPDDVIDEOPORTCAPS; -typedef struct _DDVIDEOPORTDESC FAR *LPDDVIDEOPORTDESC; -typedef struct _DDVIDEOPORTINFO FAR *LPDDVIDEOPORTINFO; -typedef struct _DDVIDEOPORTBANDWIDTH FAR *LPDDVIDEOPORTBANDWIDTH; -typedef struct _DDVIDEOPORTSTATUS FAR *LPDDVIDEOPORTSTATUS; -typedef struct _DDVIDEOPORTNOTIFY FAR *LPDDVIDEOPORTNOTIFY; - -typedef struct IDDVideoPortContainerVtbl DDVIDEOPORTCONTAINERCALLBACKS; -typedef struct IDirectDrawVideoPortVtbl DIRECTDRAWVIDEOPORTCALLBACKS; -typedef struct IDirectDrawVideoPortNotifyVtbl DIRECTDRAWVIDEOPORTNOTIFYCALLBACKS; - - -/* - * API's - */ -typedef HRESULT (FAR PASCAL * LPDDENUMVIDEOCALLBACK)(LPDDVIDEOPORTCAPS, LPVOID); - - -/* - * INTERACES FOLLOW: - * IDirectDrawVideoPort - * IVideoPort - */ - -/* - * IDirectDrawVideoPortContainer - */ -#if defined( _WIN32 ) && !defined( _NO_COM ) -#undef INTERFACE -#define INTERFACE IDDVideoPortContainer -DECLARE_INTERFACE_( IDDVideoPortContainer, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IDirectDrawVideoPort methods ***/ - STDMETHOD(CreateVideoPort)(THIS_ DWORD, LPDDVIDEOPORTDESC, LPDIRECTDRAWVIDEOPORT FAR *, IUnknown FAR *) PURE; - STDMETHOD(EnumVideoPorts)(THIS_ DWORD, LPDDVIDEOPORTCAPS, LPVOID,LPDDENUMVIDEOCALLBACK ) PURE; - STDMETHOD(GetVideoPortConnectInfo)(THIS_ DWORD, LPDWORD, LPDDVIDEOPORTCONNECT ) PURE; - STDMETHOD(QueryVideoPortStatus)(THIS_ DWORD, LPDDVIDEOPORTSTATUS ) PURE; -}; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IVideoPortContainer_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) -#define IVideoPortContainer_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IVideoPortContainer_Release(p) (p)->lpVtbl->Release(p) -#define IVideoPortContainer_CreateVideoPort(p, a, b, c, d) (p)->lpVtbl->CreateVideoPort(p, a, b, c, d) -#define IVideoPortContainer_EnumVideoPorts(p, a, b, c, d) (p)->lpVtbl->EnumVideoPorts(p, a, b, c, d) -#define IVideoPortContainer_GetVideoPortConnectInfo(p, a, b, c) (p)->lpVtbl->GetVideoPortConnectInfo(p, a, b, c) -#define IVideoPortContainer_QueryVideoPortStatus(p, a, b) (p)->lpVtbl->QueryVideoPortStatus(p, a, b) -#else -#define IVideoPortContainer_QueryInterface(p, a, b) (p)->QueryInterface(a, b) -#define IVideoPortContainer_AddRef(p) (p)->AddRef() -#define IVideoPortContainer_Release(p) (p)->Release() -#define IVideoPortContainer_CreateVideoPort(p, a, b, c, d) (p)->CreateVideoPort(a, b, c, d) -#define IVideoPortContainer_EnumVideoPorts(p, a, b, c, d) (p)->EnumVideoPorts(a, b, c, d) -#define IVideoPortContainer_GetVideoPortConnectInfo(p, a, b, c) (p)->GetVideoPortConnectInfo(a, b, c) -#define IVideoPortContainer_QueryVideoPortStatus(p, a, b) (p)->QueryVideoPortStatus(a, b) -#endif - -#endif - - -/* - * IDirectDrawVideoPort - */ -#if defined( _WIN32 ) && !defined( _NO_COM ) -#undef INTERFACE -#define INTERFACE IDirectDrawVideoPort -DECLARE_INTERFACE_( IDirectDrawVideoPort, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IVideoPort methods ***/ - STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE, DWORD) PURE; - STDMETHOD(GetBandwidthInfo)(THIS_ LPDDPIXELFORMAT, DWORD, DWORD, DWORD, LPDDVIDEOPORTBANDWIDTH) PURE; - STDMETHOD(GetColorControls)(THIS_ LPDDCOLORCONTROL) PURE; - STDMETHOD(GetInputFormats)(THIS_ LPDWORD, LPDDPIXELFORMAT, DWORD) PURE; - STDMETHOD(GetOutputFormats)(THIS_ LPDDPIXELFORMAT, LPDWORD, LPDDPIXELFORMAT, DWORD) PURE; - STDMETHOD(GetFieldPolarity)(THIS_ LPBOOL) PURE; - STDMETHOD(GetVideoLine)(THIS_ LPDWORD) PURE; - STDMETHOD(GetVideoSignalStatus)(THIS_ LPDWORD) PURE; - STDMETHOD(SetColorControls)(THIS_ LPDDCOLORCONTROL) PURE; - STDMETHOD(SetTargetSurface)(THIS_ LPDIRECTDRAWSURFACE, DWORD) PURE; - STDMETHOD(StartVideo)(THIS_ LPDDVIDEOPORTINFO) PURE; - STDMETHOD(StopVideo)(THIS) PURE; - STDMETHOD(UpdateVideo)(THIS_ LPDDVIDEOPORTINFO) PURE; - STDMETHOD(WaitForSync)(THIS_ DWORD, DWORD, DWORD) PURE; -}; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IVideoPort_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IVideoPort_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IVideoPort_Release(p) (p)->lpVtbl->Release(p) -#define IVideoPort_SetTargetSurface(p,a,b) (p)->lpVtbl->SetTargetSurface(p,a,b) -#define IVideoPort_Flip(p,a,b) (p)->lpVtbl->Flip(p,a,b) -#define IVideoPort_GetBandwidthInfo(p,a,b,c,d,e) (p)->lpVtbl->GetBandwidthInfo(p,a,b,c,d,e) -#define IVideoPort_GetColorControls(p,a) (p)->lpVtbl->GetColorControls(p,a) -#define IVideoPort_GetInputFormats(p,a,b,c) (p)->lpVtbl->GetInputFormats(p,a,b,c) -#define IVideoPort_GetOutputFormats(p,a,b,c,d) (p)->lpVtbl->GetOutputFormats(p,a,b,c,d) -#define IVideoPort_GetFieldPolarity(p,a) (p)->lpVtbl->GetFieldPolarity(p,a) -#define IVideoPort_GetVideoLine(p,a) (p)->lpVtbl->GetVideoLine(p,a) -#define IVideoPort_GetVideoSignalStatus(p,a) (p)->lpVtbl->GetVideoSignalStatus(p,a) -#define IVideoPort_SetColorControls(p,a) (p)->lpVtbl->SetColorControls(p,a) -#define IVideoPort_StartVideo(p,a) (p)->lpVtbl->StartVideo(p,a) -#define IVideoPort_StopVideo(p) (p)->lpVtbl->StopVideo(p) -#define IVideoPort_UpdateVideo(p,a) (p)->lpVtbl->UpdateVideo(p,a) -#define IVideoPort_WaitForSync(p,a,b,c) (p)->lpVtbl->WaitForSync(p,a,b,c) -#else -#define IVideoPort_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IVideoPort_AddRef(p) (p)->AddRef() -#define IVideoPort_Release(p) (p)->Release() -#define IVideoPort_SetTargetSurface(p,a,b) (p)->SetTargetSurface(a,b) -#define IVideoPort_Flip(p,a,b) (p)->Flip(a,b) -#define IVideoPort_GetBandwidthInfo(p,a,b,c,d,e) (p)->GetBandwidthInfo(a,b,c,d,e) -#define IVideoPort_GetColorControls(p,a) (p)->GetColorControls(a) -#define IVideoPort_GetInputFormats(p,a,b,c) (p)->GetInputFormats(a,b,c) -#define IVideoPort_GetOutputFormats(p,a,b,c,d) (p)->GetOutputFormats(a,b,c,d) -#define IVideoPort_GetFieldPolarity(p,a) (p)->GetFieldPolarity(a) -#define IVideoPort_GetVideoLine(p,a) (p)->GetVideoLine(a) -#define IVideoPort_GetVideoSignalStatus(p,a) (p)->GetVideoSignalStatus(a) -#define IVideoPort_SetColorControls(p,a) (p)->SetColorControls(a) -#define IVideoPort_StartVideo(p,a) (p)->StartVideo(a) -#define IVideoPort_StopVideo(p) (p)->StopVideo() -#define IVideoPort_UpdateVideo(p,a) (p)->UpdateVideo(a) -#define IVideoPort_WaitForSync(p,a,b,c) (p)->WaitForSync(a,b,c) -#endif - -#endif - -/* - * IDirectDrawVideoPort - */ -#if defined( _WIN32 ) && !defined( _NO_COM ) -#undef INTERFACE -#define INTERFACE IDirectDrawVideoPortNotify -DECLARE_INTERFACE_( IDirectDrawVideoPortNotify, IUnknown ) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - /*** IVideoPort methods ***/ - STDMETHOD(AcquireNotification)(THIS_ HANDLE *, LPDDVIDEOPORTNOTIFY) PURE; - STDMETHOD(ReleaseNotification)(THIS_ HANDLE) PURE; -}; - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IVideoPortNotify_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IVideoPortNotify_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IVideoPortNotify_Release(p) (p)->lpVtbl->Release(p) -#define IVideoPortNotify_AcquireNotification(p,a,b) (p)->lpVtbl->AcquireNotification(p,a,b) -#define IVideoPortNotify_ReleaseNotification(p,a) (p)->lpVtbl->ReleaseNotification(p,a) -#else -#define IVideoPortNotify_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IVideoPortNotify_AddRef(p) (p)->AddRef() -#define IVideoPortNotify_Release(p) (p)->Release() -#define IVideoPortNotify_AcquireNotification(p,a,b) (p)->lpVtbl->AcquireNotification(a,b) -#define IVideoPortNotify_ReleaseNotification(p,a) (p)->lpVtbl->ReleaseNotification(a) -#endif - -#endif - -/* - * DDVIDEOPORTCONNECT - */ -typedef struct _DDVIDEOPORTCONNECT -{ - DWORD dwSize; // size of the DDVIDEOPORTCONNECT structure - DWORD dwPortWidth; // Width of the video port - GUID guidTypeID; // Description of video port connection - DWORD dwFlags; // Connection flags - ULONG_PTR dwReserved1; // Reserved, set to zero. -} DDVIDEOPORTCONNECT; - - -/* - * DDVIDEOPORTCAPS - */ -typedef struct _DDVIDEOPORTCAPS -{ - DWORD dwSize; // size of the DDVIDEOPORTCAPS structure - DWORD dwFlags; // indicates which fields contain data - DWORD dwMaxWidth; // max width of the video port field - DWORD dwMaxVBIWidth; // max width of the VBI data - DWORD dwMaxHeight; // max height of the video port field - DWORD dwVideoPortID; // Video port ID (0 - (dwMaxVideoPorts -1)) - DWORD dwCaps; // Video port capabilities - DWORD dwFX; // More video port capabilities - DWORD dwNumAutoFlipSurfaces; // Max number of autoflippable surfaces allowed - DWORD dwAlignVideoPortBoundary; // Byte restriction of placement within the surface - DWORD dwAlignVideoPortPrescaleWidth;// Byte restriction of width after prescaling - DWORD dwAlignVideoPortCropBoundary; // Byte restriction of left cropping - DWORD dwAlignVideoPortCropWidth; // Byte restriction of cropping width - DWORD dwPreshrinkXStep; // Width can be shrunk in steps of 1/x - DWORD dwPreshrinkYStep; // Height can be shrunk in steps of 1/x - DWORD dwNumVBIAutoFlipSurfaces; // Max number of VBI autoflippable surfaces allowed - DWORD dwNumPreferredAutoflip; // Optimal number of autoflippable surfaces for hardware - WORD wNumFilterTapsX; // Number of taps the prescaler uses in the X direction (0 - no prescale, 1 - replication, etc.) - WORD wNumFilterTapsY; // Number of taps the prescaler uses in the Y direction (0 - no prescale, 1 - replication, etc.) -} DDVIDEOPORTCAPS; - -/* - * The dwMaxWidth and dwMaxVBIWidth members are valid - */ -#define DDVPD_WIDTH 0x00000001l - -/* - * The dwMaxHeight member is valid - */ -#define DDVPD_HEIGHT 0x00000002l - -/* - * The dwVideoPortID member is valid - */ -#define DDVPD_ID 0x00000004l - -/* - * The dwCaps member is valid - */ -#define DDVPD_CAPS 0x00000008l - -/* - * The dwFX member is valid - */ -#define DDVPD_FX 0x00000010l - -/* - * The dwNumAutoFlipSurfaces member is valid - */ -#define DDVPD_AUTOFLIP 0x00000020l - -/* - * All of the alignment members are valid - */ -#define DDVPD_ALIGN 0x00000040l - -/* - * The dwNumPreferredAutoflip member is valid - */ -#define DDVPD_PREFERREDAUTOFLIP 0x00000080l - -/* - * The wNumFilterTapsX and wNumFilterTapsY fields are valid - */ -#define DDVPD_FILTERQUALITY 0x00000100l - -/* - * DDVIDEOPORTDESC - */ -typedef struct _DDVIDEOPORTDESC -{ - DWORD dwSize; // size of the DDVIDEOPORTDESC structure - DWORD dwFieldWidth; // width of the video port field - DWORD dwVBIWidth; // width of the VBI data - DWORD dwFieldHeight; // height of the video port field - DWORD dwMicrosecondsPerField; // Microseconds per video field - DWORD dwMaxPixelsPerSecond; // Maximum pixel rate per second - DWORD dwVideoPortID; // Video port ID (0 - (dwMaxVideoPorts -1)) - DWORD dwReserved1; // Reserved for future use - set to zero (struct padding) - DDVIDEOPORTCONNECT VideoPortType; // Description of video port connection - ULONG_PTR dwReserved2; // Reserved for future use - set to zero - ULONG_PTR dwReserved3; // Reserved for future use - set to zero -} DDVIDEOPORTDESC; - - -/* - * DDVIDEOPORTINFO - */ -typedef struct _DDVIDEOPORTINFO -{ - DWORD dwSize; // Size of the structure - DWORD dwOriginX; // Placement of the video data within the surface. - DWORD dwOriginY; // Placement of the video data within the surface. - DWORD dwVPFlags; // Video port options - RECT rCrop; // Cropping rectangle (optional). - DWORD dwPrescaleWidth; // Determines pre-scaling/zooming in the X direction (optional). - DWORD dwPrescaleHeight; // Determines pre-scaling/zooming in the Y direction (optional). - LPDDPIXELFORMAT lpddpfInputFormat; // Video format written to the video port - LPDDPIXELFORMAT lpddpfVBIInputFormat; // Input format of the VBI data - LPDDPIXELFORMAT lpddpfVBIOutputFormat;// Output format of the data - DWORD dwVBIHeight; // Specifies the number of lines of data within the vertical blanking interval. - ULONG_PTR dwReserved1; // Reserved for future use - set to zero - ULONG_PTR dwReserved2; // Reserved for future use - set to zero -} DDVIDEOPORTINFO; - - -/* - * DDVIDEOPORTBANDWIDTH - */ -typedef struct _DDVIDEOPORTBANDWIDTH -{ - DWORD dwSize; // Size of the structure - DWORD dwCaps; - DWORD dwOverlay; // Zoom factor at which overlay is supported - DWORD dwColorkey; // Zoom factor at which overlay w/ colorkey is supported - DWORD dwYInterpolate; // Zoom factor at which overlay w/ Y interpolation is supported - DWORD dwYInterpAndColorkey; // Zoom factor at which ovelray w/ Y interpolation and colorkeying is supported - ULONG_PTR dwReserved1; // Reserved for future use - set to zero - ULONG_PTR dwReserved2; // Reserved for future use - set to zero -} DDVIDEOPORTBANDWIDTH; - - -/* - * DDVIDEOPORTSTATUS - */ -typedef struct _DDVIDEOPORTSTATUS -{ - DWORD dwSize; // Size of the structure - BOOL bInUse; // TRUE if video port is currently being used - DWORD dwFlags; // Currently not used - DWORD dwReserved1; // Reserved for future use - DDVIDEOPORTCONNECT VideoPortType; // Information about the connection - ULONG_PTR dwReserved2; // Reserved for future use - ULONG_PTR dwReserved3; // Reserved for future use -} DDVIDEOPORTSTATUS; - -/* - * DDVIDEOPORTNOTIFY - */ -typedef struct _DDVIDEOPORTNOTIFY -{ - LARGE_INTEGER ApproximateTimeStamp; // Timestamp in the event notification - LONG lField; // 0 if even, 1 if odd, -1 if unknown - UINT dwSurfaceIndex; // Index in the surface chain of the surface that received the sample - LONG lDone; // Call InterlockedIncrement on this when done with sample -} DDVIDEOPORTNOTIFY; - - -/*============================================================================ - * - * Video Port Flags - * - * All flags are bit flags. - * - *==========================================================================*/ - -/**************************************************************************** - * - * VIDEOPORT DDVIDEOPORTCONNECT FLAGS - * - ****************************************************************************/ - -/* - * When this is set by the driver and passed to the client, this - * indicates that the video port is capable of double clocking the data. - * When this is set by the client, this indicates that the video port - * should enable double clocking. This flag is only valid with external - * syncs. - */ -#define DDVPCONNECT_DOUBLECLOCK 0x00000001l - -/* - * When this is set by the driver and passed to the client, this - * indicates that the video port is capable of using an external VACT - * signal. When this is set by the client, this indicates that the - * video port should use the external VACT signal. - */ -#define DDVPCONNECT_VACT 0x00000002l - -/* - * When this is set by the driver and passed to the client, this - * indicates that the video port is capable of treating even fields - * like odd fields and visa versa. When this is set by the client, - * this indicates that the video port should treat even fields like odd - * fields. - */ -#define DDVPCONNECT_INVERTPOLARITY 0x00000004l - -/* - * Indicates that any data written to the video port during the VREF - * period will not be written into the frame buffer. This flag is read only. - */ -#define DDVPCONNECT_DISCARDSVREFDATA 0x00000008l - -/* - * When this is set be the driver and passed to the client, this - * indicates that the device will write half lines into the frame buffer - * if half lines are provided by the decoder. If this is set by the client, - * this indicates that the decoder will be supplying half lines. - */ -#define DDVPCONNECT_HALFLINE 0x00000010l - -/* - * Indicates that the signal is interlaced. This flag is only - * set by the client. - */ -#define DDVPCONNECT_INTERLACED 0x00000020l - -/* - * Indicates that video port is shareable and that this video port - * will use the even fields. This flag is only set by the client. - */ -#define DDVPCONNECT_SHAREEVEN 0x00000040l - -/* - * Indicates that video port is shareable and that this video port - * will use the odd fields. This flag is only set by the client. - */ -#define DDVPCONNECT_SHAREODD 0x00000080l - -/**************************************************************************** - * - * VIDEOPORT DDVIDEOPORTDESC CAPS - * - ****************************************************************************/ - -/* - * Flip can be performed automatically to avoid tearing. - */ -#define DDVPCAPS_AUTOFLIP 0x00000001l - -/* - * Supports interlaced video - */ -#define DDVPCAPS_INTERLACED 0x00000002l - -/* - * Supports non-interlaced video - */ -#define DDVPCAPS_NONINTERLACED 0x00000004l - -/* - * Indicates that the device can return whether the current field - * of an interlaced signal is even or odd. - */ -#define DDVPCAPS_READBACKFIELD 0x00000008l - -/* - * Indicates that the device can return the current line of video - * being written into the frame buffer. - */ -#define DDVPCAPS_READBACKLINE 0x00000010l - -/* - * Allows two gen-locked video streams to share a single video port, - * where one stream uses the even fields and the other uses the odd - * fields. Separate parameters (including address, scaling, - * cropping, etc.) are maintained for both fields.) - */ -#define DDVPCAPS_SHAREABLE 0x00000020l - -/* - * Even fields of video can be automatically discarded. - */ -#define DDVPCAPS_SKIPEVENFIELDS 0x00000040l - -/* - * Odd fields of video can be automatically discarded. - */ -#define DDVPCAPS_SKIPODDFIELDS 0x00000080l - -/* - * Indicates that the device is capable of driving the graphics - * VSYNC with the video port VSYNC. - */ -#define DDVPCAPS_SYNCMASTER 0x00000100l - -/* - * Indicates that data within the vertical blanking interval can - * be written to a different surface. - */ -#define DDVPCAPS_VBISURFACE 0x00000200l - -/* - * Indicates that the video port can perform color operations - * on the incoming data before it is written to the frame buffer. - */ -#define DDVPCAPS_COLORCONTROL 0x00000400l - -/* - * Indicates that the video port can accept VBI data in a different - * width or format than the regular video data. - */ -#define DDVPCAPS_OVERSAMPLEDVBI 0x00000800l - -/* - * Indicates that the video port can write data directly to system memory - */ -#define DDVPCAPS_SYSTEMMEMORY 0x00001000l - -/* - * Indicates that the VBI and video portions of the video stream can - * be controlled by an independent processes. - */ -#define DDVPCAPS_VBIANDVIDEOINDEPENDENT 0x00002000l - -/* - * Indicates that the video port contains high quality hardware - * de-interlacing hardware that should be used instead of the - * bob/weave algorithms. - */ -#define DDVPCAPS_HARDWAREDEINTERLACE 0x00004000l - - -/**************************************************************************** - * - * VIDEOPORT DDVIDEOPORTDESC FX - * - ****************************************************************************/ - -/* - * Limited cropping is available to crop out the vertical interval data. - */ -#define DDVPFX_CROPTOPDATA 0x00000001l - -/* - * Incoming data can be cropped in the X direction before it is written - * to the surface. - */ -#define DDVPFX_CROPX 0x00000002l - -/* - * Incoming data can be cropped in the Y direction before it is written - * to the surface. - */ -#define DDVPFX_CROPY 0x00000004l - -/* - * Supports interleaving interlaced fields in memory. - */ -#define DDVPFX_INTERLEAVE 0x00000008l - -/* - * Supports mirroring left to right as the video data is written - * into the frame buffer. - */ -#define DDVPFX_MIRRORLEFTRIGHT 0x00000010l - -/* - * Supports mirroring top to bottom as the video data is written - * into the frame buffer. - */ -#define DDVPFX_MIRRORUPDOWN 0x00000020l - -/* - * Data can be arbitrarily shrunk in the X direction before it - * is written to the surface. - */ -#define DDVPFX_PRESHRINKX 0x00000040l - -/* - * Data can be arbitrarily shrunk in the Y direction before it - * is written to the surface. - */ -#define DDVPFX_PRESHRINKY 0x00000080l - -/* - * Data can be binary shrunk (1/2, 1/4, 1/8, etc.) in the X - * direction before it is written to the surface. - */ -#define DDVPFX_PRESHRINKXB 0x00000100l - -/* - * Data can be binary shrunk (1/2, 1/4, 1/8, etc.) in the Y - * direction before it is written to the surface. - */ -#define DDVPFX_PRESHRINKYB 0x00000200l - -/* - * Data can be shrunk in increments of 1/x in the X direction - * (where X is specified in the DDVIDEOPORTCAPS.dwPreshrinkXStep) - * before it is written to the surface. - */ -#define DDVPFX_PRESHRINKXS 0x00000400l - -/* - * Data can be shrunk in increments of 1/x in the Y direction - * (where X is specified in the DDVIDEOPORTCAPS.dwPreshrinkYStep) - * before it is written to the surface. - */ -#define DDVPFX_PRESHRINKYS 0x00000800l - -/* - * Data can be arbitrarily stretched in the X direction before - * it is written to the surface. - */ -#define DDVPFX_PRESTRETCHX 0x00001000l - -/* - * Data can be arbitrarily stretched in the Y direction before - * it is written to the surface. - */ -#define DDVPFX_PRESTRETCHY 0x00002000l - -/* - * Data can be integer stretched in the X direction before it is - * written to the surface. - */ -#define DDVPFX_PRESTRETCHXN 0x00004000l - -/* - * Data can be integer stretched in the Y direction before it is - * written to the surface. - */ -#define DDVPFX_PRESTRETCHYN 0x00008000l - -/* - * Indicates that data within the vertical blanking interval can - * be converted independently of the remaining video data. - */ -#define DDVPFX_VBICONVERT 0x00010000l - -/* - * Indicates that scaling can be disabled for data within the - * vertical blanking interval. - */ -#define DDVPFX_VBINOSCALE 0x00020000l - -/* - * Indicates that the video data can ignore the left and right - * cropping coordinates when cropping oversampled VBI data. - */ -#define DDVPFX_IGNOREVBIXCROP 0x00040000l - -/* - * Indicates that interleaving can be disabled for data within the - * vertical blanking interval. - */ -#define DDVPFX_VBINOINTERLEAVE 0x00080000l - - -/**************************************************************************** - * - * VIDEOPORT DDVIDEOPORTINFO FLAGS - * - ****************************************************************************/ - -/* - * Perform automatic flipping. Auto-flipping is performed between - * the overlay surface that was attached to the video port using - * IDirectDrawVideoPort::AttachSurface and the overlay surfaces that - * are attached to the surface via the IDirectDrawSurface::AttachSurface - * method. The flip order is the order in which the overlay surfaces - * were. attached. - */ -#define DDVP_AUTOFLIP 0x00000001l - -/* - * Perform conversion using the ddpfOutputFormat information. - */ -#define DDVP_CONVERT 0x00000002l - -/* - * Perform cropping using the specified rectangle. - */ -#define DDVP_CROP 0x00000004l - -/* - * Indicates that interlaced fields should be interleaved in memory. - */ -#define DDVP_INTERLEAVE 0x00000008l - -/* - * Indicates that the data should be mirrored left to right as it's - * written into the frame buffer. - */ -#define DDVP_MIRRORLEFTRIGHT 0x00000010l - -/* - * Indicates that the data should be mirrored top to bottom as it's - * written into the frame buffer. - */ -#define DDVP_MIRRORUPDOWN 0x00000020l - -/* - * Perform pre-scaling/zooming based on the pre-scale parameters. - */ -#define DDVP_PRESCALE 0x00000040l - -/* - * Ignore input of even fields. - */ -#define DDVP_SKIPEVENFIELDS 0x00000080l - -/* - * Ignore input of odd fields. - */ -#define DDVP_SKIPODDFIELDS 0x00000100l - -/* - * Drive the graphics VSYNCs using the video port VYSNCs. - */ -#define DDVP_SYNCMASTER 0x00000200l - -/* - * The ddpfVBIOutputFormatFormat member contains data that should be used - * to convert the data within the vertical blanking interval. - */ -#define DDVP_VBICONVERT 0x00000400l - -/* - * Indicates that data within the vertical blanking interval - * should not be scaled. - */ -#define DDVP_VBINOSCALE 0x00000800l - -/* - * Indicates that these bob/weave decisions should not be - * overriden by other interfaces. - */ -#define DDVP_OVERRIDEBOBWEAVE 0x00001000l - -/* - * Indicates that the video data should ignore the left and right - * cropping coordinates when cropping the VBI data. - */ -#define DDVP_IGNOREVBIXCROP 0x00002000l - -/* - * Indicates that interleaving can be disabled for data within the - * vertical blanking interval. - */ -#define DDVP_VBINOINTERLEAVE 0x00004000l - -/* - * Indicates that the video port should use the hardware - * de-interlacing hardware. - */ -#define DDVP_HARDWAREDEINTERLACE 0x00008000l - -/**************************************************************************** - * - * DIRIRECTDRAWVIDEOPORT GETINPUTFORMAT/GETOUTPUTFORMAT FLAGS - * - ****************************************************************************/ - -/* - * Return formats for the video data - */ -#define DDVPFORMAT_VIDEO 0x00000001l - -/* - * Return formats for the VBI data - */ -#define DDVPFORMAT_VBI 0x00000002l - -/**************************************************************************** - * - * DIRIRECTDRAWVIDEOPORT SETTARGETSURFACE FLAGS - * - ****************************************************************************/ - -/* - * Surface should receive video data (and VBI data if a surface - * is not explicitly attached for that purpose) - */ -#define DDVPTARGET_VIDEO 0x00000001l - -/* - * Surface should receive VBI data - */ -#define DDVPTARGET_VBI 0x00000002l - - -/**************************************************************************** - * - * DIRIRECTDRAWVIDEOPORT WAITFORSYNC FLAGS - * - ****************************************************************************/ - -/* - * Waits until the beginning of the next VSYNC - */ -#define DDVPWAIT_BEGIN 0x00000001l - -/* - * Waits until the end of the next/current VSYNC - */ -#define DDVPWAIT_END 0x00000002l - -/* - * Waits until the beginning of the specified line - */ -#define DDVPWAIT_LINE 0x00000003l - -/**************************************************************************** - * - * DIRECTDRAWVIDEOPORT FLIP FLAGS - * - ****************************************************************************/ - -/* - * Flips the normal video surface - */ -#define DDVPFLIP_VIDEO 0x00000001l - -/* - * Flips the VBI surface - */ -#define DDVPFLIP_VBI 0x00000002l - -/**************************************************************************** - * - * DIRIRECTDRAWVIDEOPORT GETVIDEOSIGNALSTATUS VALUES - * - ****************************************************************************/ - -/* - * No video signal is present at the video port - */ -#define DDVPSQ_NOSIGNAL 0x00000001l - -/* - * A valid video signal is present at the video port - */ -#define DDVPSQ_SIGNALOK 0x00000002l - -/**************************************************************************** - * - * VIDEOPORTBANDWIDTH Flags - * - ****************************************************************************/ - -/* - * The specified height/width refer to the size of the video port data - * written into memory, after prescaling has occured. - */ -#define DDVPB_VIDEOPORT 0x00000001l - -/* - * The specified height/width refer to the source size of the overlay. - */ -#define DDVPB_OVERLAY 0x00000002l - -/* - * This is a query for the device to return which caps this device requires. - */ -#define DDVPB_TYPE 0x00000004l - -/**************************************************************************** - * - * VIDEOPORTBANDWIDTH Caps - * - ****************************************************************************/ - -/* - * The bandwidth for this device is dependant on the overlay source size. - */ -#define DDVPBCAPS_SOURCE 0x00000001l - -/* - * The bandwidth for this device is dependant on the overlay destination - * size. - */ -#define DDVPBCAPS_DESTINATION 0x00000002l - -/**************************************************************************** - * - * DDVIDEOPORTCONTAINER CreateVideoPort flags - * - ****************************************************************************/ - -/* - * The process only wants to control the VBI portion of the video stream. - */ -#define DDVPCREATE_VBIONLY 0x00000001l - -/* - * The process only wants to control the non-VBI (video) portion of - * the video stream. - */ -#define DDVPCREATE_VIDEOONLY 0x00000002l - -/**************************************************************************** - * - * DDVIDEOPORTSTATUS flags - * - ****************************************************************************/ - -/* - * The video port interface is only controlling the VBI portion of the - * video stream - */ -#define DDVPSTATUS_VBIONLY 0x00000001l - -/* - * The video port interface is only controlling the video portion of the - * video stream - */ -#define DDVPSTATUS_VIDEOONLY 0x00000002l - - -#ifdef __cplusplus -}; -#endif - -#endif // GUID_DEFS_ONLY - -#endif - diff --git a/import/DirectX8/include/dx7todx8.h b/import/DirectX8/include/dx7todx8.h deleted file mode 100644 index a513d6934..000000000 --- a/import/DirectX8/include/dx7todx8.h +++ /dev/null @@ -1,98 +0,0 @@ -/*==========================================================================; - * - * Copyright (C) Microsoft Corporation. All Rights Reserved. - * - * File: dx7todx8.h - * Content: DX7 to DX8 Direct3D aliases to aid porting DX7 apps to DX8 - * - ***************************************************************************/ - -#ifndef _DX7TODX8_H_ - -/////////////////////////////////////////////////////////////////////////////// -// -// d3d8types.h -// -/////////////////////////////////////////////////////////////////////////////// - -#define D3DTRANSFORMSTATE_WORLD D3DTS_WORLD -#define D3DTRANSFORMSTATE_VIEW D3DTS_VIEW -#define D3DTRANSFORMSTATE_PROJECTION D3DTS_PROJECTION -#define D3DTRANSFORMSTATE_WORLD1 D3DTS_WORLD1 -#define D3DTRANSFORMSTATE_WORLD2 D3DTS_WORLD2 -#define D3DTRANSFORMSTATE_WORLD3 D3DTS_WORLD3 -#define D3DTRANSFORMSTATE_TEXTURE0 D3DTS_TEXTURE0 -#define D3DTRANSFORMSTATE_TEXTURE1 D3DTS_TEXTURE1 -#define D3DTRANSFORMSTATE_TEXTURE2 D3DTS_TEXTURE2 -#define D3DTRANSFORMSTATE_TEXTURE3 D3DTS_TEXTURE3 -#define D3DTRANSFORMSTATE_TEXTURE4 D3DTS_TEXTURE4 -#define D3DTRANSFORMSTATE_TEXTURE5 D3DTS_TEXTURE5 -#define D3DTRANSFORMSTATE_TEXTURE6 D3DTS_TEXTURE6 -#define D3DTRANSFORMSTATE_TEXTURE7 D3DTS_TEXTURE7 -#define D3DTRANSFORMSTATE_FORCE_DWORD D3DTS_FORCE_DWORD - -#define D3DRENDERSTATE_ZENABLE D3DRS_ZENABLE -#define D3DRENDERSTATE_FILLMODE D3DRS_FILLMODE -#define D3DRENDERSTATE_SHADEMODE D3DRS_SHADEMODE -#define D3DRENDERSTATE_LINEPATTERN D3DRS_LINEPATTERN -#define D3DRENDERSTATE_ZWRITEENABLE D3DRS_ZWRITEENABLE -#define D3DRENDERSTATE_ALPHATESTENABLE D3DRS_ALPHATESTENABLE -#define D3DRENDERSTATE_LASTPIXEL D3DRS_LASTPIXEL -#define D3DRENDERSTATE_SRCBLEND D3DRS_SRCBLEND -#define D3DRENDERSTATE_DESTBLEND D3DRS_DESTBLEND -#define D3DRENDERSTATE_CULLMODE D3DRS_CULLMODE -#define D3DRENDERSTATE_ZFUNC D3DRS_ZFUNC -#define D3DRENDERSTATE_ALPHAREF D3DRS_ALPHAREF -#define D3DRENDERSTATE_ALPHAFUNC D3DRS_ALPHAFUNC -#define D3DRENDERSTATE_DITHERENABLE D3DRS_DITHERENABLE -#define D3DRENDERSTATE_ALPHABLENDENABLE D3DRS_ALPHABLENDENABLE -#define D3DRENDERSTATE_FOGENABLE D3DRS_FOGENABLE -#define D3DRENDERSTATE_SPECULARENABLE D3DRS_SPECULARENABLE -#define D3DRENDERSTATE_ZVISIBLE D3DRS_ZVISIBLE -#define D3DRENDERSTATE_FOGCOLOR D3DRS_FOGCOLOR -#define D3DRENDERSTATE_FOGTABLEMODE D3DRS_FOGTABLEMODE -#define D3DRENDERSTATE_FOGSTART D3DRS_FOGSTART -#define D3DRENDERSTATE_FOGEND D3DRS_FOGEND -#define D3DRENDERSTATE_FOGDENSITY D3DRS_FOGDENSITY -#define D3DRENDERSTATE_EDGEANTIALIAS D3DRS_EDGEANTIALIAS -#define D3DRENDERSTATE_ZBIAS D3DRS_ZBIAS -#define D3DRENDERSTATE_RANGEFOGENABLE D3DRS_RANGEFOGENABLE -#define D3DRENDERSTATE_STENCILENABLE D3DRS_STENCILENABLE -#define D3DRENDERSTATE_STENCILFAIL D3DRS_STENCILFAIL -#define D3DRENDERSTATE_STENCILZFAIL D3DRS_STENCILZFAIL -#define D3DRENDERSTATE_STENCILPASS D3DRS_STENCILPASS -#define D3DRENDERSTATE_STENCILFUNC D3DRS_STENCILFUNC -#define D3DRENDERSTATE_STENCILREF D3DRS_STENCILREF -#define D3DRENDERSTATE_STENCILMASK D3DRS_STENCILMASK -#define D3DRENDERSTATE_STENCILWRITEMASK D3DRS_STENCILWRITEMASK -#define D3DRENDERSTATE_TEXTUREFACTOR D3DRS_TEXTUREFACTOR -#define D3DRENDERSTATE_WRAP0 D3DRS_WRAP0 -#define D3DRENDERSTATE_WRAP1 D3DRS_WRAP1 -#define D3DRENDERSTATE_WRAP2 D3DRS_WRAP2 -#define D3DRENDERSTATE_WRAP3 D3DRS_WRAP3 -#define D3DRENDERSTATE_WRAP4 D3DRS_WRAP4 -#define D3DRENDERSTATE_WRAP5 D3DRS_WRAP5 -#define D3DRENDERSTATE_WRAP6 D3DRS_WRAP6 -#define D3DRENDERSTATE_WRAP7 D3DRS_WRAP7 -#define D3DRENDERSTATE_CLIPPING D3DRS_CLIPPING -#define D3DRENDERSTATE_LIGHTING D3DRS_LIGHTING -#define D3DRENDERSTATE_EXTENTS D3DRS_EXTENTS -#define D3DRENDERSTATE_AMBIENT D3DRS_AMBIENT -#define D3DRENDERSTATE_FOGVERTEXMODE D3DRS_FOGVERTEXMODE -#define D3DRENDERSTATE_COLORVERTEX D3DRS_COLORVERTEX -#define D3DRENDERSTATE_LOCALVIEWER D3DRS_LOCALVIEWER -#define D3DRENDERSTATE_NORMALIZENORMALS D3DRS_NORMALIZENORMALS -#define D3DRENDERSTATE_DIFFUSEMATERIALSOURCE D3DRS_DIFFUSEMATERIALSOURCE -#define D3DRENDERSTATE_SPECULARMATERIALSOURCE D3DRS_SPECULARMATERIALSOURCE -#define D3DRENDERSTATE_AMBIENTMATERIALSOURCE D3DRS_AMBIENTMATERIALSOURCE -#define D3DRENDERSTATE_EMISSIVEMATERIALSOURCE D3DRS_EMISSIVEMATERIALSOURCE -#define D3DRENDERSTATE_VERTEXBLEND D3DRS_VERTEXBLEND -#define D3DRENDERSTATE_CLIPPLANEENABLE D3DRS_CLIPPLANEENABLE - -#define RGBA_MAKE D3DCOLOR_RGBA -#define RGB_MAKE D3DCOLOR_XRGB -#define D3DRGBA D3DCOLOR_COLORVALUE -#define D3DRGB(_r,_g,_b) D3DCOLOR_COLORVALUE(_r,_g,_b,1.f) - -#define _DX7TODX8_H_ -#endif //_DX7TODX8_H_ diff --git a/import/DirectX8/include/dxerr8.h b/import/DirectX8/include/dxerr8.h deleted file mode 100644 index f79c71f36..000000000 --- a/import/DirectX8/include/dxerr8.h +++ /dev/null @@ -1,100 +0,0 @@ -/*==========================================================================; - * - * - * File: dxerr8.h - * Content: DirectX Error Library Include File - * - ****************************************************************************/ - -#ifndef _DXERR8_H_ -#define _DXERR8_H_ - -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - -// -// DXGetErrorString8 -// -// Desc: Converts a DirectX HRESULT to a string -// -// Args: HRESULT hr Can be any error code from -// D3D8 D3DX8 DDRAW DPLAY8 DMUSIC DSOUND DINPUT DSHOW -// -// Return: Converted string -// -const char* WINAPI DXGetErrorString8A(HRESULT hr); -const WCHAR* WINAPI DXGetErrorString8W(HRESULT hr); - -#ifdef UNICODE -#define DXGetErrorString8 DXGetErrorString8W -#else -#define DXGetErrorString8 DXGetErrorString8A -#endif - - -// -// DXGetErrorDescription8 -// -// Desc: Returns a string description of a DirectX HRESULT -// -// Args: HRESULT hr Can be any error code from -// D3D8 D3DX8 DDRAW DPLAY8 DMUSIC DSOUND DINPUT DSHOW -// -// Return: String description -// -const char* WINAPI DXGetErrorDescription8A(HRESULT hr); -const WCHAR* WINAPI DXGetErrorDescription8W(HRESULT hr); - -#ifdef UNICODE - #define DXGetErrorDescription8 DXGetErrorDescription8W -#else - #define DXGetErrorDescription8 DXGetErrorDescription8A -#endif - - -// -// DXTrace -// -// Desc: Outputs a formatted error message to the debug stream -// -// Args: CHAR* strFile The current file, typically passed in using the -// __FILE__ macro. -// DWORD dwLine The current line number, typically passed in using the -// __LINE__ macro. -// HRESULT hr An HRESULT that will be traced to the debug stream. -// CHAR* strMsg A string that will be traced to the debug stream (may be NULL) -// BOOL bPopMsgBox If TRUE, then a message box will popup also containing the passed info. -// -// Return: The hr that was passed in. -// -HRESULT WINAPI DXTraceA( char* strFile, DWORD dwLine, HRESULT hr, char* strMsg, BOOL bPopMsgBox ); -HRESULT WINAPI DXTraceW( char* strFile, DWORD dwLine, HRESULT hr, WCHAR* strMsg, BOOL bPopMsgBox ); - -#ifdef UNICODE -#define DXTrace DXTraceW -#else -#define DXTrace DXTraceA -#endif - - -// -// Helper macros -// -#if defined(DEBUG) | defined(_DEBUG) -#define DXTRACE_MSG(str) DXTrace( __FILE__, (DWORD)__LINE__, 0, str, FALSE ) -#define DXTRACE_ERR(str,hr) DXTrace( __FILE__, (DWORD)__LINE__, hr, str, TRUE ) -#define DXTRACE_ERR_NOMSGBOX(str,hr) DXTrace( __FILE__, (DWORD)__LINE__, hr, str, FALSE ) -#else -#define DXTRACE_MSG(str) (0L) -#define DXTRACE_ERR(str,hr) (hr) -#define DXTRACE_ERR_NOMSGBOX(str,hr) (hr) -#endif - - -#ifdef __cplusplus -} -#endif //__cplusplus - -#endif // _DXERR8_H_ - diff --git a/import/DirectX8/include/dxfile.h b/import/DirectX8/include/dxfile.h deleted file mode 100644 index 8b5995a5c..000000000 --- a/import/DirectX8/include/dxfile.h +++ /dev/null @@ -1,240 +0,0 @@ -/*************************************************************************** - * - * Copyright (C) 1998-1999 Microsoft Corporation. All Rights Reserved. - * - * File: dxfile.h - * - * Content: DirectX File public header file - * - ***************************************************************************/ - -#ifndef __DXFILE_H__ -#define __DXFILE_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef DWORD DXFILEFORMAT; - -#define DXFILEFORMAT_BINARY 0 -#define DXFILEFORMAT_TEXT 1 -#define DXFILEFORMAT_COMPRESSED 2 - -typedef DWORD DXFILELOADOPTIONS; - -#define DXFILELOAD_FROMFILE 0x00L -#define DXFILELOAD_FROMRESOURCE 0x01L -#define DXFILELOAD_FROMMEMORY 0x02L -#define DXFILELOAD_FROMSTREAM 0x04L -#define DXFILELOAD_FROMURL 0x08L - -typedef struct _DXFILELOADRESOURCE { - HMODULE hModule; - LPCTSTR lpName; - LPCTSTR lpType; -}DXFILELOADRESOURCE, *LPDXFILELOADRESOURCE; - -typedef struct _DXFILELOADMEMORY { - LPVOID lpMemory; - DWORD dSize; -}DXFILELOADMEMORY, *LPDXFILELOADMEMORY; - -/* - * DirectX File object types. - */ - -#ifndef WIN_TYPES -#define WIN_TYPES(itype, ptype) typedef interface itype *LP##ptype, **LPLP##ptype -#endif - -WIN_TYPES(IDirectXFile, DIRECTXFILE); -WIN_TYPES(IDirectXFileEnumObject, DIRECTXFILEENUMOBJECT); -WIN_TYPES(IDirectXFileSaveObject, DIRECTXFILESAVEOBJECT); -WIN_TYPES(IDirectXFileObject, DIRECTXFILEOBJECT); -WIN_TYPES(IDirectXFileData, DIRECTXFILEDATA); -WIN_TYPES(IDirectXFileDataReference, DIRECTXFILEDATAREFERENCE); -WIN_TYPES(IDirectXFileBinary, DIRECTXFILEBINARY); - -/* - * API for creating IDirectXFile interface. - */ - -STDAPI DirectXFileCreate(LPDIRECTXFILE *lplpDirectXFile); - -/* - * The methods for IUnknown - */ - -#define IUNKNOWN_METHODS(kind) \ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) kind; \ - STDMETHOD_(ULONG, AddRef) (THIS) kind; \ - STDMETHOD_(ULONG, Release) (THIS) kind - -/* - * The methods for IDirectXFileObject - */ - -#define IDIRECTXFILEOBJECT_METHODS(kind) \ - STDMETHOD(GetName) (THIS_ LPSTR, LPDWORD) kind; \ - STDMETHOD(GetId) (THIS_ LPGUID) kind - -/* - * DirectX File interfaces. - */ - -#undef INTERFACE -#define INTERFACE IDirectXFile - -DECLARE_INTERFACE_(IDirectXFile, IUnknown) -{ - IUNKNOWN_METHODS(PURE); - STDMETHOD(CreateEnumObject) (THIS_ LPVOID, DXFILELOADOPTIONS, - LPDIRECTXFILEENUMOBJECT *) PURE; - STDMETHOD(CreateSaveObject) (THIS_ LPCSTR, DXFILEFORMAT, - LPDIRECTXFILESAVEOBJECT *) PURE; - STDMETHOD(RegisterTemplates) (THIS_ LPVOID, DWORD) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirectXFileEnumObject - -DECLARE_INTERFACE_(IDirectXFileEnumObject, IUnknown) -{ - IUNKNOWN_METHODS(PURE); - STDMETHOD(GetNextDataObject) (THIS_ LPDIRECTXFILEDATA *) PURE; - STDMETHOD(GetDataObjectById) (THIS_ REFGUID, LPDIRECTXFILEDATA *) PURE; - STDMETHOD(GetDataObjectByName) (THIS_ LPCSTR, LPDIRECTXFILEDATA *) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirectXFileSaveObject - -DECLARE_INTERFACE_(IDirectXFileSaveObject, IUnknown) -{ - IUNKNOWN_METHODS(PURE); - STDMETHOD(SaveTemplates) (THIS_ DWORD, const GUID **) PURE; - STDMETHOD(CreateDataObject) (THIS_ REFGUID, LPCSTR, const GUID *, - DWORD, LPVOID, LPDIRECTXFILEDATA *) PURE; - STDMETHOD(SaveData) (THIS_ LPDIRECTXFILEDATA) PURE; -}; - - -#undef INTERFACE -#define INTERFACE IDirectXFileObject - -DECLARE_INTERFACE_(IDirectXFileObject, IUnknown) -{ - IUNKNOWN_METHODS(PURE); - IDIRECTXFILEOBJECT_METHODS(PURE); -}; - -#undef INTERFACE -#define INTERFACE IDirectXFileData - -DECLARE_INTERFACE_(IDirectXFileData, IDirectXFileObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECTXFILEOBJECT_METHODS(PURE); - - STDMETHOD(GetData) (THIS_ LPCSTR, DWORD *, void **) PURE; - STDMETHOD(GetType) (THIS_ const GUID **) PURE; - STDMETHOD(GetNextObject) (THIS_ LPDIRECTXFILEOBJECT *) PURE; - STDMETHOD(AddDataObject) (THIS_ LPDIRECTXFILEDATA) PURE; - STDMETHOD(AddDataReference) (THIS_ LPCSTR, const GUID *) PURE; - STDMETHOD(AddBinaryObject) (THIS_ LPCSTR, const GUID *, LPCSTR, LPVOID, DWORD) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirectXFileDataReference - -DECLARE_INTERFACE_(IDirectXFileDataReference, IDirectXFileObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECTXFILEOBJECT_METHODS(PURE); - - STDMETHOD(Resolve) (THIS_ LPDIRECTXFILEDATA *) PURE; -}; - -#undef INTERFACE -#define INTERFACE IDirectXFileBinary - -DECLARE_INTERFACE_(IDirectXFileBinary, IDirectXFileObject) -{ - IUNKNOWN_METHODS(PURE); - IDIRECTXFILEOBJECT_METHODS(PURE); - - STDMETHOD(GetSize) (THIS_ DWORD *) PURE; - STDMETHOD(GetMimeType) (THIS_ LPCSTR *) PURE; - STDMETHOD(Read) (THIS_ LPVOID, DWORD, LPDWORD) PURE; -}; - -/* - * DirectXFile Object Class Id (for CoCreateInstance()) - */ - -DEFINE_GUID(CLSID_CDirectXFile, 0x4516ec43, 0x8f20, 0x11d0, 0x9b, 0x6d, 0x00, 0x00, 0xc0, 0x78, 0x1b, 0xc3); - -/* - * DirectX File Interface GUIDs. - */ - -DEFINE_GUID(IID_IDirectXFile, 0x3d82ab40, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); -DEFINE_GUID(IID_IDirectXFileEnumObject, 0x3d82ab41, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); -DEFINE_GUID(IID_IDirectXFileSaveObject, 0x3d82ab42, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); -DEFINE_GUID(IID_IDirectXFileObject, 0x3d82ab43, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); -DEFINE_GUID(IID_IDirectXFileData, 0x3d82ab44, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); -DEFINE_GUID(IID_IDirectXFileDataReference, 0x3d82ab45, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); -DEFINE_GUID(IID_IDirectXFileBinary, 0x3d82ab46, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); - -/* - * DirectX File Header template's GUID. - */ - -DEFINE_GUID(TID_DXFILEHeader, 0x3d82ab43, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); - - -/* - * DirectX File errors. - */ - -#define _FACDD 0x876 -#define MAKE_DDHRESULT( code ) MAKE_HRESULT( 1, _FACDD, code ) - -#define DXFILE_OK 0 - -#define DXFILEERR_BADOBJECT MAKE_DDHRESULT(850) -#define DXFILEERR_BADVALUE MAKE_DDHRESULT(851) -#define DXFILEERR_BADTYPE MAKE_DDHRESULT(852) -#define DXFILEERR_BADSTREAMHANDLE MAKE_DDHRESULT(853) -#define DXFILEERR_BADALLOC MAKE_DDHRESULT(854) -#define DXFILEERR_NOTFOUND MAKE_DDHRESULT(855) -#define DXFILEERR_NOTDONEYET MAKE_DDHRESULT(856) -#define DXFILEERR_FILENOTFOUND MAKE_DDHRESULT(857) -#define DXFILEERR_RESOURCENOTFOUND MAKE_DDHRESULT(858) -#define DXFILEERR_URLNOTFOUND MAKE_DDHRESULT(859) -#define DXFILEERR_BADRESOURCE MAKE_DDHRESULT(860) -#define DXFILEERR_BADFILETYPE MAKE_DDHRESULT(861) -#define DXFILEERR_BADFILEVERSION MAKE_DDHRESULT(862) -#define DXFILEERR_BADFILEFLOATSIZE MAKE_DDHRESULT(863) -#define DXFILEERR_BADFILECOMPRESSIONTYPE MAKE_DDHRESULT(864) -#define DXFILEERR_BADFILE MAKE_DDHRESULT(865) -#define DXFILEERR_PARSEERROR MAKE_DDHRESULT(866) -#define DXFILEERR_NOTEMPLATE MAKE_DDHRESULT(867) -#define DXFILEERR_BADARRAYSIZE MAKE_DDHRESULT(868) -#define DXFILEERR_BADDATAREFERENCE MAKE_DDHRESULT(869) -#define DXFILEERR_INTERNALERROR MAKE_DDHRESULT(870) -#define DXFILEERR_NOMOREOBJECTS MAKE_DDHRESULT(871) -#define DXFILEERR_BADINTRINSICS MAKE_DDHRESULT(872) -#define DXFILEERR_NOMORESTREAMHANDLES MAKE_DDHRESULT(873) -#define DXFILEERR_NOMOREDATA MAKE_DDHRESULT(874) -#define DXFILEERR_BADCACHEFILE MAKE_DDHRESULT(875) -#define DXFILEERR_NOINTERNET MAKE_DDHRESULT(876) - - -#ifdef __cplusplus -}; -#endif - -#endif /* _DXFILE_H_ */ - \ No newline at end of file diff --git a/import/DirectX8/include/dxsdk.inc b/import/DirectX8/include/dxsdk.inc deleted file mode 100644 index be0424041..000000000 --- a/import/DirectX8/include/dxsdk.inc +++ /dev/null @@ -1,131 +0,0 @@ -!IFDEF BORLAND -cc = bcc32 -rc = brc32 -link = ilink32 -bldlib = tlib -cflags = -c -3 -j1 -X -Vd -I$(INCLUDE) -rcflags = -r -fo -linkflags = -n -V4.0 -aa -!IFDEF main -linkflags = $(linkflags) -ap -borobjs=c0x32.obj -!ELSE -linkflags = $(linkflags) -Tpe -borobjs=c0w32.obj -!ENDIF -linkflags = $(linkflags) -j$(LIB) -L$(LIB) -libflags=$(OBJ_DIR)\$(proj).lib -outobj = -o -commas =, -outexe= -borlib=+ -deflibs = import32.lib cw32mti.lib ole2w32.lib -!IFDEF MFC -cflags =$(cflags) -VF -w-hid -w-par -w-aus -w-inl -w-inq -WM -Vd /D_NO_VCL;_RTLDLL;_AFXDLL;_X86_;_WINDOWS;_MSC_VER=1100;WIN32; -!IFDEF NODEBUG -deflibs = bfc42.lib bfcs42.lib $(deflibs) -!ELSE -deflibs = BFC42D.lib BFCS42D.lib bfcd42d.lib bfco42d.lib bfcn42d.lib $(deflibs) -!ENDIF -!ENDIF - -d3dframe=..\..\lib\borland\d3dframe.lib - -!IFDEF nodebug -cdebug = -Od -linkdebug = /x -cflags = $(cflags) /DNDEBUG; -!ELSE -cdebug = -Od -v -y -linkdebug = /v -cflags = $(cflags) /DDEBUG; -!ENDIF - -!ELSE -!IFDEF WATCOM -cc = cl -rc = rc -link = link -bldlib = lib -deflibs = kernel32.lib gdi32.lib user32.lib advapi32.lib gdi32.lib comdlg32.lib winspool.lib shell32.lib winmm.lib comctl32.lib ole32.lib oleaut32.lib -cflags = -c /D "WIN32" /D "_WINDOWS" -!IFDEF NODEBUG -cflags =$(cflags) /D "NDEBUG" -cdebug = -Ox -linkdebug = -!IFDEF MFC -cflags =$(cflags) /MD /D "_AFXDLL" -!ELSE -cflags =$(cflags) /ML -!ENDIF -!ELSE -cflags =$(cflags) /D "DEBUG" -cdebug = -Z7 -Ox -linkdebug = -map -debug:full -!IFDEF MFC -cflags =$(cflags) /MDd /D "_AFXDLL" -!ELSE -cflags =$(cflags) /MLd -!ENDIF -!ENDIF -rcflags = -r -fo -linkflags = /INCREMENTAL:NO /NOLOGO -!IFDEF main -linkflags = $(linkflags) /SUBSYSTEM:CONSOLE -!ELSE -linkflags = $(linkflags) /SUBSYSTEM:WINDOWS -!ENDIF -libflags=/OUT:$(OBJ_DIR)\$(proj).lib -outobj = -Fo -commas= -outexe=-out: -borobjs= -borlib= -d3dframe=..\..\lib\watcom\d3dframe.lib - -!ELSE -cc = cl -rc = rc -link = link -bldlib = lib -deflibs = kernel32.lib gdi32.lib user32.lib advapi32.lib gdi32.lib comdlg32.lib winspool.lib shell32.lib winmm.lib comctl32.lib ole32.lib oleaut32.lib -cflags = -c /D "WIN32" /D "_WINDOWS" -linkflags= -!IFDEF NODEBUG -cflags =$(cflags) /D "NDEBUG" -cdebug = -Ox -linkdebug = /RELEASE -!IFDEF MFC -cflags =$(cflags) /MD /D "_AFXDLL" -!ELSE -cflags =$(cflags) /ML -!ENDIF -!ELSE -cflags = $(cflags) /D "DEBUG" -cdebug = -Z7 -Ox -linkdebug = -map -debug:full -debugtype:cv -!IFDEF MFC -cflags =$(cflags) /MDd /D "_AFXDLL" -!ELSE -linkflags = $(linkflags) /NODEFAULTLIB:LIBC -cflags =$(cflags) /MLd -!ENDIF -!ENDIF -cflags =$(cflags) -rcflags = -r -fo -linkflags = $(linkflags) /INCREMENTAL:NO /PDB:NONE /NOLOGO -!IFDEF main -linkflags = $(linkflags) /SUBSYSTEM:CONSOLE -!ELSE -linkflags = $(linkflags) /SUBSYSTEM:WINDOWS -!ENDIF -libflags=/OUT:$(OBJ_DIR)\$(proj).lib /SUBSYSTEM:WINDOWS -outobj = -Fo -commas= -outexe=-out: -borobjs= -borlib= -d3dframe=..\..\lib\d3dframe.lib - -!ENDIF -!ENDIF diff --git a/import/DirectX8/include/dxtrans.h b/import/DirectX8/include/dxtrans.h deleted file mode 100644 index b09bcde2a..000000000 --- a/import/DirectX8/include/dxtrans.h +++ /dev/null @@ -1,5362 +0,0 @@ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 6.00.0347 */ -/* Compiler settings for dxtrans.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 440 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __dxtrans_h__ -#define __dxtrans_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __IDXBaseObject_FWD_DEFINED__ -#define __IDXBaseObject_FWD_DEFINED__ -typedef interface IDXBaseObject IDXBaseObject; -#endif /* __IDXBaseObject_FWD_DEFINED__ */ - - -#ifndef __IDXTransformFactory_FWD_DEFINED__ -#define __IDXTransformFactory_FWD_DEFINED__ -typedef interface IDXTransformFactory IDXTransformFactory; -#endif /* __IDXTransformFactory_FWD_DEFINED__ */ - - -#ifndef __IDXTransform_FWD_DEFINED__ -#define __IDXTransform_FWD_DEFINED__ -typedef interface IDXTransform IDXTransform; -#endif /* __IDXTransform_FWD_DEFINED__ */ - - -#ifndef __IDXSurfacePick_FWD_DEFINED__ -#define __IDXSurfacePick_FWD_DEFINED__ -typedef interface IDXSurfacePick IDXSurfacePick; -#endif /* __IDXSurfacePick_FWD_DEFINED__ */ - - -#ifndef __IDXTBindHost_FWD_DEFINED__ -#define __IDXTBindHost_FWD_DEFINED__ -typedef interface IDXTBindHost IDXTBindHost; -#endif /* __IDXTBindHost_FWD_DEFINED__ */ - - -#ifndef __IDXTaskManager_FWD_DEFINED__ -#define __IDXTaskManager_FWD_DEFINED__ -typedef interface IDXTaskManager IDXTaskManager; -#endif /* __IDXTaskManager_FWD_DEFINED__ */ - - -#ifndef __IDXSurfaceFactory_FWD_DEFINED__ -#define __IDXSurfaceFactory_FWD_DEFINED__ -typedef interface IDXSurfaceFactory IDXSurfaceFactory; -#endif /* __IDXSurfaceFactory_FWD_DEFINED__ */ - - -#ifndef __IDXSurfaceModifier_FWD_DEFINED__ -#define __IDXSurfaceModifier_FWD_DEFINED__ -typedef interface IDXSurfaceModifier IDXSurfaceModifier; -#endif /* __IDXSurfaceModifier_FWD_DEFINED__ */ - - -#ifndef __IDXSurface_FWD_DEFINED__ -#define __IDXSurface_FWD_DEFINED__ -typedef interface IDXSurface IDXSurface; -#endif /* __IDXSurface_FWD_DEFINED__ */ - - -#ifndef __IDXSurfaceInit_FWD_DEFINED__ -#define __IDXSurfaceInit_FWD_DEFINED__ -typedef interface IDXSurfaceInit IDXSurfaceInit; -#endif /* __IDXSurfaceInit_FWD_DEFINED__ */ - - -#ifndef __IDXARGBSurfaceInit_FWD_DEFINED__ -#define __IDXARGBSurfaceInit_FWD_DEFINED__ -typedef interface IDXARGBSurfaceInit IDXARGBSurfaceInit; -#endif /* __IDXARGBSurfaceInit_FWD_DEFINED__ */ - - -#ifndef __IDXARGBReadPtr_FWD_DEFINED__ -#define __IDXARGBReadPtr_FWD_DEFINED__ -typedef interface IDXARGBReadPtr IDXARGBReadPtr; -#endif /* __IDXARGBReadPtr_FWD_DEFINED__ */ - - -#ifndef __IDXARGBReadWritePtr_FWD_DEFINED__ -#define __IDXARGBReadWritePtr_FWD_DEFINED__ -typedef interface IDXARGBReadWritePtr IDXARGBReadWritePtr; -#endif /* __IDXARGBReadWritePtr_FWD_DEFINED__ */ - - -#ifndef __IDXDCLock_FWD_DEFINED__ -#define __IDXDCLock_FWD_DEFINED__ -typedef interface IDXDCLock IDXDCLock; -#endif /* __IDXDCLock_FWD_DEFINED__ */ - - -#ifndef __IDXTScaleOutput_FWD_DEFINED__ -#define __IDXTScaleOutput_FWD_DEFINED__ -typedef interface IDXTScaleOutput IDXTScaleOutput; -#endif /* __IDXTScaleOutput_FWD_DEFINED__ */ - - -#ifndef __IDXGradient_FWD_DEFINED__ -#define __IDXGradient_FWD_DEFINED__ -typedef interface IDXGradient IDXGradient; -#endif /* __IDXGradient_FWD_DEFINED__ */ - - -#ifndef __IDXTScale_FWD_DEFINED__ -#define __IDXTScale_FWD_DEFINED__ -typedef interface IDXTScale IDXTScale; -#endif /* __IDXTScale_FWD_DEFINED__ */ - - -#ifndef __IDXEffect_FWD_DEFINED__ -#define __IDXEffect_FWD_DEFINED__ -typedef interface IDXEffect IDXEffect; -#endif /* __IDXEffect_FWD_DEFINED__ */ - - -#ifndef __IDXLookupTable_FWD_DEFINED__ -#define __IDXLookupTable_FWD_DEFINED__ -typedef interface IDXLookupTable IDXLookupTable; -#endif /* __IDXLookupTable_FWD_DEFINED__ */ - - -#ifndef __IDXRawSurface_FWD_DEFINED__ -#define __IDXRawSurface_FWD_DEFINED__ -typedef interface IDXRawSurface IDXRawSurface; -#endif /* __IDXRawSurface_FWD_DEFINED__ */ - - -#ifndef __IHTMLDXTransform_FWD_DEFINED__ -#define __IHTMLDXTransform_FWD_DEFINED__ -typedef interface IHTMLDXTransform IHTMLDXTransform; -#endif /* __IHTMLDXTransform_FWD_DEFINED__ */ - - -#ifndef __ICSSFilterDispatch_FWD_DEFINED__ -#define __ICSSFilterDispatch_FWD_DEFINED__ -typedef interface ICSSFilterDispatch ICSSFilterDispatch; -#endif /* __ICSSFilterDispatch_FWD_DEFINED__ */ - - -#ifndef __DXTransformFactory_FWD_DEFINED__ -#define __DXTransformFactory_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DXTransformFactory DXTransformFactory; -#else -typedef struct DXTransformFactory DXTransformFactory; -#endif /* __cplusplus */ - -#endif /* __DXTransformFactory_FWD_DEFINED__ */ - - -#ifndef __DXTaskManager_FWD_DEFINED__ -#define __DXTaskManager_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DXTaskManager DXTaskManager; -#else -typedef struct DXTaskManager DXTaskManager; -#endif /* __cplusplus */ - -#endif /* __DXTaskManager_FWD_DEFINED__ */ - - -#ifndef __DXTScale_FWD_DEFINED__ -#define __DXTScale_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DXTScale DXTScale; -#else -typedef struct DXTScale DXTScale; -#endif /* __cplusplus */ - -#endif /* __DXTScale_FWD_DEFINED__ */ - - -#ifndef __DXSurface_FWD_DEFINED__ -#define __DXSurface_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DXSurface DXSurface; -#else -typedef struct DXSurface DXSurface; -#endif /* __cplusplus */ - -#endif /* __DXSurface_FWD_DEFINED__ */ - - -#ifndef __DXSurfaceModifier_FWD_DEFINED__ -#define __DXSurfaceModifier_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DXSurfaceModifier DXSurfaceModifier; -#else -typedef struct DXSurfaceModifier DXSurfaceModifier; -#endif /* __cplusplus */ - -#endif /* __DXSurfaceModifier_FWD_DEFINED__ */ - - -#ifndef __DXGradient_FWD_DEFINED__ -#define __DXGradient_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DXGradient DXGradient; -#else -typedef struct DXGradient DXGradient; -#endif /* __cplusplus */ - -#endif /* __DXGradient_FWD_DEFINED__ */ - - -#ifndef __DXTFilter_FWD_DEFINED__ -#define __DXTFilter_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DXTFilter DXTFilter; -#else -typedef struct DXTFilter DXTFilter; -#endif /* __cplusplus */ - -#endif /* __DXTFilter_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "oaidl.h" -#include "ocidl.h" -#include "comcat.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void * ); - -/* interface __MIDL_itf_dxtrans_0000 */ -/* [local] */ - -#include -#include -#include -#include -#include -#if 0 -// Bogus definition used to make MIDL compiler happy -typedef void DDSURFACEDESC; - -typedef void D3DRMBOX; - -typedef void D3DVECTOR; - -typedef void D3DRMMATRIX4D; - -typedef void *LPSECURITY_ATTRIBUTES; - -#endif -#ifdef _DXTRANSIMPL - #define _DXTRANS_IMPL_EXT _declspec(dllexport) -#else - #define _DXTRANS_IMPL_EXT _declspec(dllimport) -#endif - - - - - - - - - - - - - - - - -// -// All GUIDs for DXTransform are declared in DXTGUID.C in the SDK include directory -// -EXTERN_C const GUID DDPF_RGB1; -EXTERN_C const GUID DDPF_RGB2; -EXTERN_C const GUID DDPF_RGB4; -EXTERN_C const GUID DDPF_RGB8; -EXTERN_C const GUID DDPF_RGB332; -EXTERN_C const GUID DDPF_ARGB4444; -EXTERN_C const GUID DDPF_RGB565; -EXTERN_C const GUID DDPF_BGR565; -EXTERN_C const GUID DDPF_RGB555; -EXTERN_C const GUID DDPF_ARGB1555; -EXTERN_C const GUID DDPF_RGB24; -EXTERN_C const GUID DDPF_BGR24; -EXTERN_C const GUID DDPF_RGB32; -EXTERN_C const GUID DDPF_BGR32; -EXTERN_C const GUID DDPF_ABGR32; -EXTERN_C const GUID DDPF_ARGB32; -EXTERN_C const GUID DDPF_PMARGB32; -EXTERN_C const GUID DDPF_A1; -EXTERN_C const GUID DDPF_A2; -EXTERN_C const GUID DDPF_A4; -EXTERN_C const GUID DDPF_A8; -EXTERN_C const GUID DDPF_Z8; -EXTERN_C const GUID DDPF_Z16; -EXTERN_C const GUID DDPF_Z24; -EXTERN_C const GUID DDPF_Z32; -// -// Component categories -// -EXTERN_C const GUID CATID_DXImageTransform; -EXTERN_C const GUID CATID_DX3DTransform; -EXTERN_C const GUID CATID_DXAuthoringTransform; -EXTERN_C const GUID CATID_DXSurface; -// -// Service IDs -// -EXTERN_C const GUID SID_SDirectDraw; -EXTERN_C const GUID SID_SDirect3DRM; -#define SID_SDXTaskManager CLSID_DXTaskManager -#define SID_SDXSurfaceFactory IID_IDXSurfaceFactory -#define SID_SDXTransformFactory IID_IDXTransformFactory -// -// DXTransforms Core Type Library Version Info -// -#define DXTRANS_TLB_MAJOR_VER 1 -#define DXTRANS_TLB_MINOR_VER 1 - - -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0000_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0000_v0_0_s_ifspec; - -#ifndef __IDXBaseObject_INTERFACE_DEFINED__ -#define __IDXBaseObject_INTERFACE_DEFINED__ - -/* interface IDXBaseObject */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXBaseObject; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("17B59B2B-9CC8-11d1-9053-00C04FD9189D") - IDXBaseObject : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetGenerationId( - /* [out] */ ULONG *pID) = 0; - - virtual HRESULT STDMETHODCALLTYPE IncrementGenerationId( - /* [in] */ BOOL bRefresh) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetObjectSize( - /* [out] */ ULONG *pcbSize) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXBaseObjectVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXBaseObject * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXBaseObject * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXBaseObject * This); - - HRESULT ( STDMETHODCALLTYPE *GetGenerationId )( - IDXBaseObject * This, - /* [out] */ ULONG *pID); - - HRESULT ( STDMETHODCALLTYPE *IncrementGenerationId )( - IDXBaseObject * This, - /* [in] */ BOOL bRefresh); - - HRESULT ( STDMETHODCALLTYPE *GetObjectSize )( - IDXBaseObject * This, - /* [out] */ ULONG *pcbSize); - - END_INTERFACE - } IDXBaseObjectVtbl; - - interface IDXBaseObject - { - CONST_VTBL struct IDXBaseObjectVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXBaseObject_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXBaseObject_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXBaseObject_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXBaseObject_GetGenerationId(This,pID) \ - (This)->lpVtbl -> GetGenerationId(This,pID) - -#define IDXBaseObject_IncrementGenerationId(This,bRefresh) \ - (This)->lpVtbl -> IncrementGenerationId(This,bRefresh) - -#define IDXBaseObject_GetObjectSize(This,pcbSize) \ - (This)->lpVtbl -> GetObjectSize(This,pcbSize) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXBaseObject_GetGenerationId_Proxy( - IDXBaseObject * This, - /* [out] */ ULONG *pID); - - -void __RPC_STUB IDXBaseObject_GetGenerationId_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXBaseObject_IncrementGenerationId_Proxy( - IDXBaseObject * This, - /* [in] */ BOOL bRefresh); - - -void __RPC_STUB IDXBaseObject_IncrementGenerationId_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXBaseObject_GetObjectSize_Proxy( - IDXBaseObject * This, - /* [out] */ ULONG *pcbSize); - - -void __RPC_STUB IDXBaseObject_GetObjectSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXBaseObject_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_dxtrans_0259 */ -/* [local] */ - -typedef -enum DXBNDID - { DXB_X = 0, - DXB_Y = 1, - DXB_Z = 2, - DXB_T = 3 - } DXBNDID; - -typedef -enum DXBNDTYPE - { DXBT_DISCRETE = 0, - DXBT_DISCRETE64 = DXBT_DISCRETE + 1, - DXBT_CONTINUOUS = DXBT_DISCRETE64 + 1, - DXBT_CONTINUOUS64 = DXBT_CONTINUOUS + 1 - } DXBNDTYPE; - -typedef struct DXDBND - { - long Min; - long Max; - } DXDBND; - -typedef DXDBND DXDBNDS[ 4 ]; - -typedef struct DXDBND64 - { - LONGLONG Min; - LONGLONG Max; - } DXDBND64; - -typedef DXDBND64 DXDBNDS64[ 4 ]; - -typedef struct DXCBND - { - float Min; - float Max; - } DXCBND; - -typedef DXCBND DXCBNDS[ 4 ]; - -typedef struct DXCBND64 - { - double Min; - double Max; - } DXCBND64; - -typedef DXCBND64 DXCBNDS64[ 4 ]; - -typedef struct DXBNDS - { - DXBNDTYPE eType; - /* [switch_is] */ /* [switch_type] */ union __MIDL___MIDL_itf_dxtrans_0259_0001 - { - /* [case()] */ DXDBND D[ 4 ]; - /* [case()] */ DXDBND64 LD[ 4 ]; - /* [case()] */ DXCBND C[ 4 ]; - /* [case()] */ DXCBND64 LC[ 4 ]; - } u; - } DXBNDS; - -typedef long DXDVEC[ 4 ]; - -typedef LONGLONG DXDVEC64[ 4 ]; - -typedef float DXCVEC[ 4 ]; - -typedef double DXCVEC64[ 4 ]; - -typedef struct DXVEC - { - DXBNDTYPE eType; - /* [switch_is] */ /* [switch_type] */ union __MIDL___MIDL_itf_dxtrans_0259_0002 - { - /* [case()] */ long D[ 4 ]; - /* [case()] */ LONGLONG LD[ 4 ]; - /* [case()] */ float C[ 4 ]; - /* [case()] */ double LC[ 4 ]; - } u; - } DXVEC; - - - -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0259_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0259_v0_0_s_ifspec; - -#ifndef __IDXTransformFactory_INTERFACE_DEFINED__ -#define __IDXTransformFactory_INTERFACE_DEFINED__ - -/* interface IDXTransformFactory */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXTransformFactory; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("6A950B2B-A971-11d1-81C8-0000F87557DB") - IDXTransformFactory : public IServiceProvider - { - public: - virtual HRESULT STDMETHODCALLTYPE SetService( - /* [in] */ REFGUID guidService, - /* [in] */ IUnknown *pUnkService, - /* [in] */ BOOL bWeakReference) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateTransform( - /* [size_is][in] */ IUnknown **punkInputs, - /* [in] */ ULONG ulNumInputs, - /* [size_is][in] */ IUnknown **punkOutputs, - /* [in] */ ULONG ulNumOutputs, - /* [in] */ IPropertyBag *pInitProps, - /* [in] */ IErrorLog *pErrLog, - /* [in] */ REFCLSID TransCLSID, - /* [in] */ REFIID TransIID, - /* [iid_is][out] */ void **ppTransform) = 0; - - virtual HRESULT STDMETHODCALLTYPE InitializeTransform( - /* [in] */ IDXTransform *pTransform, - /* [size_is][in] */ IUnknown **punkInputs, - /* [in] */ ULONG ulNumInputs, - /* [size_is][in] */ IUnknown **punkOutputs, - /* [in] */ ULONG ulNumOutputs, - /* [in] */ IPropertyBag *pInitProps, - /* [in] */ IErrorLog *pErrLog) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXTransformFactoryVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXTransformFactory * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXTransformFactory * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXTransformFactory * This); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *QueryService )( - IDXTransformFactory * This, - /* [in] */ REFGUID guidService, - /* [in] */ REFIID riid, - /* [out] */ void **ppvObject); - - HRESULT ( STDMETHODCALLTYPE *SetService )( - IDXTransformFactory * This, - /* [in] */ REFGUID guidService, - /* [in] */ IUnknown *pUnkService, - /* [in] */ BOOL bWeakReference); - - HRESULT ( STDMETHODCALLTYPE *CreateTransform )( - IDXTransformFactory * This, - /* [size_is][in] */ IUnknown **punkInputs, - /* [in] */ ULONG ulNumInputs, - /* [size_is][in] */ IUnknown **punkOutputs, - /* [in] */ ULONG ulNumOutputs, - /* [in] */ IPropertyBag *pInitProps, - /* [in] */ IErrorLog *pErrLog, - /* [in] */ REFCLSID TransCLSID, - /* [in] */ REFIID TransIID, - /* [iid_is][out] */ void **ppTransform); - - HRESULT ( STDMETHODCALLTYPE *InitializeTransform )( - IDXTransformFactory * This, - /* [in] */ IDXTransform *pTransform, - /* [size_is][in] */ IUnknown **punkInputs, - /* [in] */ ULONG ulNumInputs, - /* [size_is][in] */ IUnknown **punkOutputs, - /* [in] */ ULONG ulNumOutputs, - /* [in] */ IPropertyBag *pInitProps, - /* [in] */ IErrorLog *pErrLog); - - END_INTERFACE - } IDXTransformFactoryVtbl; - - interface IDXTransformFactory - { - CONST_VTBL struct IDXTransformFactoryVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXTransformFactory_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXTransformFactory_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXTransformFactory_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXTransformFactory_QueryService(This,guidService,riid,ppvObject) \ - (This)->lpVtbl -> QueryService(This,guidService,riid,ppvObject) - - -#define IDXTransformFactory_SetService(This,guidService,pUnkService,bWeakReference) \ - (This)->lpVtbl -> SetService(This,guidService,pUnkService,bWeakReference) - -#define IDXTransformFactory_CreateTransform(This,punkInputs,ulNumInputs,punkOutputs,ulNumOutputs,pInitProps,pErrLog,TransCLSID,TransIID,ppTransform) \ - (This)->lpVtbl -> CreateTransform(This,punkInputs,ulNumInputs,punkOutputs,ulNumOutputs,pInitProps,pErrLog,TransCLSID,TransIID,ppTransform) - -#define IDXTransformFactory_InitializeTransform(This,pTransform,punkInputs,ulNumInputs,punkOutputs,ulNumOutputs,pInitProps,pErrLog) \ - (This)->lpVtbl -> InitializeTransform(This,pTransform,punkInputs,ulNumInputs,punkOutputs,ulNumOutputs,pInitProps,pErrLog) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXTransformFactory_SetService_Proxy( - IDXTransformFactory * This, - /* [in] */ REFGUID guidService, - /* [in] */ IUnknown *pUnkService, - /* [in] */ BOOL bWeakReference); - - -void __RPC_STUB IDXTransformFactory_SetService_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTransformFactory_CreateTransform_Proxy( - IDXTransformFactory * This, - /* [size_is][in] */ IUnknown **punkInputs, - /* [in] */ ULONG ulNumInputs, - /* [size_is][in] */ IUnknown **punkOutputs, - /* [in] */ ULONG ulNumOutputs, - /* [in] */ IPropertyBag *pInitProps, - /* [in] */ IErrorLog *pErrLog, - /* [in] */ REFCLSID TransCLSID, - /* [in] */ REFIID TransIID, - /* [iid_is][out] */ void **ppTransform); - - -void __RPC_STUB IDXTransformFactory_CreateTransform_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTransformFactory_InitializeTransform_Proxy( - IDXTransformFactory * This, - /* [in] */ IDXTransform *pTransform, - /* [size_is][in] */ IUnknown **punkInputs, - /* [in] */ ULONG ulNumInputs, - /* [size_is][in] */ IUnknown **punkOutputs, - /* [in] */ ULONG ulNumOutputs, - /* [in] */ IPropertyBag *pInitProps, - /* [in] */ IErrorLog *pErrLog); - - -void __RPC_STUB IDXTransformFactory_InitializeTransform_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXTransformFactory_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_dxtrans_0260 */ -/* [local] */ - -typedef -enum DXTMISCFLAGS - { DXTMF_BLEND_WITH_OUTPUT = 1L << 0, - DXTMF_DITHER_OUTPUT = 1L << 1, - DXTMF_OPTION_MASK = 0xffff, - DXTMF_VALID_OPTIONS = DXTMF_BLEND_WITH_OUTPUT | DXTMF_DITHER_OUTPUT, - DXTMF_BLEND_SUPPORTED = 1L << 16, - DXTMF_DITHER_SUPPORTED = 1L << 17, - DXTMF_INPLACE_OPERATION = 1L << 24, - DXTMF_BOUNDS_SUPPORTED = 1L << 25, - DXTMF_PLACEMENT_SUPPORTED = 1L << 26, - DXTMF_QUALITY_SUPPORTED = 1L << 27, - DXTMF_OPAQUE_RESULT = 1L << 28 - } DXTMISCFLAGS; - -typedef -enum DXINOUTINFOFLAGS - { DXINOUTF_OPTIONAL = 1L << 0 - } DXINOUTINFOFLAGS; - - - -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0260_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0260_v0_0_s_ifspec; - -#ifndef __IDXTransform_INTERFACE_DEFINED__ -#define __IDXTransform_INTERFACE_DEFINED__ - -/* interface IDXTransform */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXTransform; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("30A5FB78-E11F-11d1-9064-00C04FD9189D") - IDXTransform : public IDXBaseObject - { - public: - virtual HRESULT STDMETHODCALLTYPE Setup( - /* [size_is][in] */ IUnknown *const *punkInputs, - /* [in] */ ULONG ulNumInputs, - /* [size_is][in] */ IUnknown *const *punkOutputs, - /* [in] */ ULONG ulNumOutputs, - /* [in] */ DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE Execute( - /* [in] */ const GUID *pRequestID, - /* [in] */ const DXBNDS *pClipBnds, - /* [in] */ const DXVEC *pPlacement) = 0; - - virtual HRESULT STDMETHODCALLTYPE MapBoundsIn2Out( - /* [in] */ const DXBNDS *pInBounds, - /* [in] */ ULONG ulNumInBnds, - /* [in] */ ULONG ulOutIndex, - /* [out] */ DXBNDS *pOutBounds) = 0; - - virtual HRESULT STDMETHODCALLTYPE MapBoundsOut2In( - /* [in] */ ULONG ulOutIndex, - /* [in] */ const DXBNDS *pOutBounds, - /* [in] */ ULONG ulInIndex, - /* [out] */ DXBNDS *pInBounds) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMiscFlags( - /* [in] */ DWORD dwMiscFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMiscFlags( - /* [out] */ DWORD *pdwMiscFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInOutInfo( - /* [in] */ BOOL bIsOutput, - /* [in] */ ULONG ulIndex, - /* [out] */ DWORD *pdwFlags, - /* [size_is][out] */ GUID *pIDs, - /* [out][in] */ ULONG *pcIDs, - /* [out] */ IUnknown **ppUnkCurrentObject) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetQuality( - /* [in] */ float fQuality) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetQuality( - /* [out] */ float *fQuality) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXTransformVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXTransform * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXTransform * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXTransform * This); - - HRESULT ( STDMETHODCALLTYPE *GetGenerationId )( - IDXTransform * This, - /* [out] */ ULONG *pID); - - HRESULT ( STDMETHODCALLTYPE *IncrementGenerationId )( - IDXTransform * This, - /* [in] */ BOOL bRefresh); - - HRESULT ( STDMETHODCALLTYPE *GetObjectSize )( - IDXTransform * This, - /* [out] */ ULONG *pcbSize); - - HRESULT ( STDMETHODCALLTYPE *Setup )( - IDXTransform * This, - /* [size_is][in] */ IUnknown *const *punkInputs, - /* [in] */ ULONG ulNumInputs, - /* [size_is][in] */ IUnknown *const *punkOutputs, - /* [in] */ ULONG ulNumOutputs, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *Execute )( - IDXTransform * This, - /* [in] */ const GUID *pRequestID, - /* [in] */ const DXBNDS *pClipBnds, - /* [in] */ const DXVEC *pPlacement); - - HRESULT ( STDMETHODCALLTYPE *MapBoundsIn2Out )( - IDXTransform * This, - /* [in] */ const DXBNDS *pInBounds, - /* [in] */ ULONG ulNumInBnds, - /* [in] */ ULONG ulOutIndex, - /* [out] */ DXBNDS *pOutBounds); - - HRESULT ( STDMETHODCALLTYPE *MapBoundsOut2In )( - IDXTransform * This, - /* [in] */ ULONG ulOutIndex, - /* [in] */ const DXBNDS *pOutBounds, - /* [in] */ ULONG ulInIndex, - /* [out] */ DXBNDS *pInBounds); - - HRESULT ( STDMETHODCALLTYPE *SetMiscFlags )( - IDXTransform * This, - /* [in] */ DWORD dwMiscFlags); - - HRESULT ( STDMETHODCALLTYPE *GetMiscFlags )( - IDXTransform * This, - /* [out] */ DWORD *pdwMiscFlags); - - HRESULT ( STDMETHODCALLTYPE *GetInOutInfo )( - IDXTransform * This, - /* [in] */ BOOL bIsOutput, - /* [in] */ ULONG ulIndex, - /* [out] */ DWORD *pdwFlags, - /* [size_is][out] */ GUID *pIDs, - /* [out][in] */ ULONG *pcIDs, - /* [out] */ IUnknown **ppUnkCurrentObject); - - HRESULT ( STDMETHODCALLTYPE *SetQuality )( - IDXTransform * This, - /* [in] */ float fQuality); - - HRESULT ( STDMETHODCALLTYPE *GetQuality )( - IDXTransform * This, - /* [out] */ float *fQuality); - - END_INTERFACE - } IDXTransformVtbl; - - interface IDXTransform - { - CONST_VTBL struct IDXTransformVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXTransform_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXTransform_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXTransform_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXTransform_GetGenerationId(This,pID) \ - (This)->lpVtbl -> GetGenerationId(This,pID) - -#define IDXTransform_IncrementGenerationId(This,bRefresh) \ - (This)->lpVtbl -> IncrementGenerationId(This,bRefresh) - -#define IDXTransform_GetObjectSize(This,pcbSize) \ - (This)->lpVtbl -> GetObjectSize(This,pcbSize) - - -#define IDXTransform_Setup(This,punkInputs,ulNumInputs,punkOutputs,ulNumOutputs,dwFlags) \ - (This)->lpVtbl -> Setup(This,punkInputs,ulNumInputs,punkOutputs,ulNumOutputs,dwFlags) - -#define IDXTransform_Execute(This,pRequestID,pClipBnds,pPlacement) \ - (This)->lpVtbl -> Execute(This,pRequestID,pClipBnds,pPlacement) - -#define IDXTransform_MapBoundsIn2Out(This,pInBounds,ulNumInBnds,ulOutIndex,pOutBounds) \ - (This)->lpVtbl -> MapBoundsIn2Out(This,pInBounds,ulNumInBnds,ulOutIndex,pOutBounds) - -#define IDXTransform_MapBoundsOut2In(This,ulOutIndex,pOutBounds,ulInIndex,pInBounds) \ - (This)->lpVtbl -> MapBoundsOut2In(This,ulOutIndex,pOutBounds,ulInIndex,pInBounds) - -#define IDXTransform_SetMiscFlags(This,dwMiscFlags) \ - (This)->lpVtbl -> SetMiscFlags(This,dwMiscFlags) - -#define IDXTransform_GetMiscFlags(This,pdwMiscFlags) \ - (This)->lpVtbl -> GetMiscFlags(This,pdwMiscFlags) - -#define IDXTransform_GetInOutInfo(This,bIsOutput,ulIndex,pdwFlags,pIDs,pcIDs,ppUnkCurrentObject) \ - (This)->lpVtbl -> GetInOutInfo(This,bIsOutput,ulIndex,pdwFlags,pIDs,pcIDs,ppUnkCurrentObject) - -#define IDXTransform_SetQuality(This,fQuality) \ - (This)->lpVtbl -> SetQuality(This,fQuality) - -#define IDXTransform_GetQuality(This,fQuality) \ - (This)->lpVtbl -> GetQuality(This,fQuality) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXTransform_Setup_Proxy( - IDXTransform * This, - /* [size_is][in] */ IUnknown *const *punkInputs, - /* [in] */ ULONG ulNumInputs, - /* [size_is][in] */ IUnknown *const *punkOutputs, - /* [in] */ ULONG ulNumOutputs, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IDXTransform_Setup_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTransform_Execute_Proxy( - IDXTransform * This, - /* [in] */ const GUID *pRequestID, - /* [in] */ const DXBNDS *pClipBnds, - /* [in] */ const DXVEC *pPlacement); - - -void __RPC_STUB IDXTransform_Execute_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTransform_MapBoundsIn2Out_Proxy( - IDXTransform * This, - /* [in] */ const DXBNDS *pInBounds, - /* [in] */ ULONG ulNumInBnds, - /* [in] */ ULONG ulOutIndex, - /* [out] */ DXBNDS *pOutBounds); - - -void __RPC_STUB IDXTransform_MapBoundsIn2Out_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTransform_MapBoundsOut2In_Proxy( - IDXTransform * This, - /* [in] */ ULONG ulOutIndex, - /* [in] */ const DXBNDS *pOutBounds, - /* [in] */ ULONG ulInIndex, - /* [out] */ DXBNDS *pInBounds); - - -void __RPC_STUB IDXTransform_MapBoundsOut2In_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTransform_SetMiscFlags_Proxy( - IDXTransform * This, - /* [in] */ DWORD dwMiscFlags); - - -void __RPC_STUB IDXTransform_SetMiscFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTransform_GetMiscFlags_Proxy( - IDXTransform * This, - /* [out] */ DWORD *pdwMiscFlags); - - -void __RPC_STUB IDXTransform_GetMiscFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTransform_GetInOutInfo_Proxy( - IDXTransform * This, - /* [in] */ BOOL bIsOutput, - /* [in] */ ULONG ulIndex, - /* [out] */ DWORD *pdwFlags, - /* [size_is][out] */ GUID *pIDs, - /* [out][in] */ ULONG *pcIDs, - /* [out] */ IUnknown **ppUnkCurrentObject); - - -void __RPC_STUB IDXTransform_GetInOutInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTransform_SetQuality_Proxy( - IDXTransform * This, - /* [in] */ float fQuality); - - -void __RPC_STUB IDXTransform_SetQuality_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTransform_GetQuality_Proxy( - IDXTransform * This, - /* [out] */ float *fQuality); - - -void __RPC_STUB IDXTransform_GetQuality_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXTransform_INTERFACE_DEFINED__ */ - - -#ifndef __IDXSurfacePick_INTERFACE_DEFINED__ -#define __IDXSurfacePick_INTERFACE_DEFINED__ - -/* interface IDXSurfacePick */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXSurfacePick; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("30A5FB79-E11F-11d1-9064-00C04FD9189D") - IDXSurfacePick : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE PointPick( - /* [in] */ const DXVEC *pPoint, - /* [out] */ ULONG *pulInputSurfaceIndex, - /* [out] */ DXVEC *pInputPoint) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXSurfacePickVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXSurfacePick * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXSurfacePick * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXSurfacePick * This); - - HRESULT ( STDMETHODCALLTYPE *PointPick )( - IDXSurfacePick * This, - /* [in] */ const DXVEC *pPoint, - /* [out] */ ULONG *pulInputSurfaceIndex, - /* [out] */ DXVEC *pInputPoint); - - END_INTERFACE - } IDXSurfacePickVtbl; - - interface IDXSurfacePick - { - CONST_VTBL struct IDXSurfacePickVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXSurfacePick_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXSurfacePick_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXSurfacePick_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXSurfacePick_PointPick(This,pPoint,pulInputSurfaceIndex,pInputPoint) \ - (This)->lpVtbl -> PointPick(This,pPoint,pulInputSurfaceIndex,pInputPoint) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXSurfacePick_PointPick_Proxy( - IDXSurfacePick * This, - /* [in] */ const DXVEC *pPoint, - /* [out] */ ULONG *pulInputSurfaceIndex, - /* [out] */ DXVEC *pInputPoint); - - -void __RPC_STUB IDXSurfacePick_PointPick_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXSurfacePick_INTERFACE_DEFINED__ */ - - -#ifndef __IDXTBindHost_INTERFACE_DEFINED__ -#define __IDXTBindHost_INTERFACE_DEFINED__ - -/* interface IDXTBindHost */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXTBindHost; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("D26BCE55-E9DC-11d1-9066-00C04FD9189D") - IDXTBindHost : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetBindHost( - /* [in] */ IBindHost *pBindHost) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXTBindHostVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXTBindHost * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXTBindHost * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXTBindHost * This); - - HRESULT ( STDMETHODCALLTYPE *SetBindHost )( - IDXTBindHost * This, - /* [in] */ IBindHost *pBindHost); - - END_INTERFACE - } IDXTBindHostVtbl; - - interface IDXTBindHost - { - CONST_VTBL struct IDXTBindHostVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXTBindHost_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXTBindHost_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXTBindHost_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXTBindHost_SetBindHost(This,pBindHost) \ - (This)->lpVtbl -> SetBindHost(This,pBindHost) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXTBindHost_SetBindHost_Proxy( - IDXTBindHost * This, - /* [in] */ IBindHost *pBindHost); - - -void __RPC_STUB IDXTBindHost_SetBindHost_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXTBindHost_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_dxtrans_0263 */ -/* [local] */ - -typedef void __stdcall __stdcall DXTASKPROC( - void *pTaskData, - BOOL *pbContinueProcessing); - -typedef DXTASKPROC *PFNDXTASKPROC; - -typedef void __stdcall __stdcall DXAPCPROC( - DWORD dwData); - -typedef DXAPCPROC *PFNDXAPCPROC; - -#ifdef __cplusplus -typedef struct DXTMTASKINFO -{ - PFNDXTASKPROC pfnTaskProc; // Pointer to function to execute - PVOID pTaskData; // Pointer to argument data - PFNDXAPCPROC pfnCompletionAPC; // Pointer to completion APC proc - DWORD dwCompletionData; // Pointer to APC proc data - const GUID* pRequestID; // Used to identify groups of tasks -} DXTMTASKINFO; -#else -typedef struct DXTMTASKINFO - { - PVOID pfnTaskProc; - PVOID pTaskData; - PVOID pfnCompletionAPC; - DWORD dwCompletionData; - const GUID *pRequestID; - } DXTMTASKINFO; - -#endif - - -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0263_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0263_v0_0_s_ifspec; - -#ifndef __IDXTaskManager_INTERFACE_DEFINED__ -#define __IDXTaskManager_INTERFACE_DEFINED__ - -/* interface IDXTaskManager */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXTaskManager; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("254DBBC1-F922-11d0-883A-3C8B00C10000") - IDXTaskManager : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE QueryNumProcessors( - /* [out] */ ULONG *pulNumProc) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetThreadPoolSize( - /* [in] */ ULONG ulNumThreads) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetThreadPoolSize( - /* [out] */ ULONG *pulNumThreads) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetConcurrencyLimit( - /* [in] */ ULONG ulNumThreads) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetConcurrencyLimit( - /* [out] */ ULONG *pulNumThreads) = 0; - - virtual HRESULT STDMETHODCALLTYPE ScheduleTasks( - /* [in] */ DXTMTASKINFO TaskInfo[ ], - /* [in] */ HANDLE Events[ ], - /* [out] */ DWORD TaskIDs[ ], - /* [in] */ ULONG ulNumTasks, - /* [in] */ ULONG ulWaitPeriod) = 0; - - virtual HRESULT STDMETHODCALLTYPE TerminateTasks( - /* [in] */ DWORD TaskIDs[ ], - /* [in] */ ULONG ulCount, - /* [in] */ ULONG ulTimeOut) = 0; - - virtual HRESULT STDMETHODCALLTYPE TerminateRequest( - /* [in] */ REFIID RequestID, - /* [in] */ ULONG ulTimeOut) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXTaskManagerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXTaskManager * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXTaskManager * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXTaskManager * This); - - HRESULT ( STDMETHODCALLTYPE *QueryNumProcessors )( - IDXTaskManager * This, - /* [out] */ ULONG *pulNumProc); - - HRESULT ( STDMETHODCALLTYPE *SetThreadPoolSize )( - IDXTaskManager * This, - /* [in] */ ULONG ulNumThreads); - - HRESULT ( STDMETHODCALLTYPE *GetThreadPoolSize )( - IDXTaskManager * This, - /* [out] */ ULONG *pulNumThreads); - - HRESULT ( STDMETHODCALLTYPE *SetConcurrencyLimit )( - IDXTaskManager * This, - /* [in] */ ULONG ulNumThreads); - - HRESULT ( STDMETHODCALLTYPE *GetConcurrencyLimit )( - IDXTaskManager * This, - /* [out] */ ULONG *pulNumThreads); - - HRESULT ( STDMETHODCALLTYPE *ScheduleTasks )( - IDXTaskManager * This, - /* [in] */ DXTMTASKINFO TaskInfo[ ], - /* [in] */ HANDLE Events[ ], - /* [out] */ DWORD TaskIDs[ ], - /* [in] */ ULONG ulNumTasks, - /* [in] */ ULONG ulWaitPeriod); - - HRESULT ( STDMETHODCALLTYPE *TerminateTasks )( - IDXTaskManager * This, - /* [in] */ DWORD TaskIDs[ ], - /* [in] */ ULONG ulCount, - /* [in] */ ULONG ulTimeOut); - - HRESULT ( STDMETHODCALLTYPE *TerminateRequest )( - IDXTaskManager * This, - /* [in] */ REFIID RequestID, - /* [in] */ ULONG ulTimeOut); - - END_INTERFACE - } IDXTaskManagerVtbl; - - interface IDXTaskManager - { - CONST_VTBL struct IDXTaskManagerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXTaskManager_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXTaskManager_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXTaskManager_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXTaskManager_QueryNumProcessors(This,pulNumProc) \ - (This)->lpVtbl -> QueryNumProcessors(This,pulNumProc) - -#define IDXTaskManager_SetThreadPoolSize(This,ulNumThreads) \ - (This)->lpVtbl -> SetThreadPoolSize(This,ulNumThreads) - -#define IDXTaskManager_GetThreadPoolSize(This,pulNumThreads) \ - (This)->lpVtbl -> GetThreadPoolSize(This,pulNumThreads) - -#define IDXTaskManager_SetConcurrencyLimit(This,ulNumThreads) \ - (This)->lpVtbl -> SetConcurrencyLimit(This,ulNumThreads) - -#define IDXTaskManager_GetConcurrencyLimit(This,pulNumThreads) \ - (This)->lpVtbl -> GetConcurrencyLimit(This,pulNumThreads) - -#define IDXTaskManager_ScheduleTasks(This,TaskInfo,Events,TaskIDs,ulNumTasks,ulWaitPeriod) \ - (This)->lpVtbl -> ScheduleTasks(This,TaskInfo,Events,TaskIDs,ulNumTasks,ulWaitPeriod) - -#define IDXTaskManager_TerminateTasks(This,TaskIDs,ulCount,ulTimeOut) \ - (This)->lpVtbl -> TerminateTasks(This,TaskIDs,ulCount,ulTimeOut) - -#define IDXTaskManager_TerminateRequest(This,RequestID,ulTimeOut) \ - (This)->lpVtbl -> TerminateRequest(This,RequestID,ulTimeOut) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXTaskManager_QueryNumProcessors_Proxy( - IDXTaskManager * This, - /* [out] */ ULONG *pulNumProc); - - -void __RPC_STUB IDXTaskManager_QueryNumProcessors_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTaskManager_SetThreadPoolSize_Proxy( - IDXTaskManager * This, - /* [in] */ ULONG ulNumThreads); - - -void __RPC_STUB IDXTaskManager_SetThreadPoolSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTaskManager_GetThreadPoolSize_Proxy( - IDXTaskManager * This, - /* [out] */ ULONG *pulNumThreads); - - -void __RPC_STUB IDXTaskManager_GetThreadPoolSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTaskManager_SetConcurrencyLimit_Proxy( - IDXTaskManager * This, - /* [in] */ ULONG ulNumThreads); - - -void __RPC_STUB IDXTaskManager_SetConcurrencyLimit_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTaskManager_GetConcurrencyLimit_Proxy( - IDXTaskManager * This, - /* [out] */ ULONG *pulNumThreads); - - -void __RPC_STUB IDXTaskManager_GetConcurrencyLimit_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTaskManager_ScheduleTasks_Proxy( - IDXTaskManager * This, - /* [in] */ DXTMTASKINFO TaskInfo[ ], - /* [in] */ HANDLE Events[ ], - /* [out] */ DWORD TaskIDs[ ], - /* [in] */ ULONG ulNumTasks, - /* [in] */ ULONG ulWaitPeriod); - - -void __RPC_STUB IDXTaskManager_ScheduleTasks_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTaskManager_TerminateTasks_Proxy( - IDXTaskManager * This, - /* [in] */ DWORD TaskIDs[ ], - /* [in] */ ULONG ulCount, - /* [in] */ ULONG ulTimeOut); - - -void __RPC_STUB IDXTaskManager_TerminateTasks_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTaskManager_TerminateRequest_Proxy( - IDXTaskManager * This, - /* [in] */ REFIID RequestID, - /* [in] */ ULONG ulTimeOut); - - -void __RPC_STUB IDXTaskManager_TerminateRequest_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXTaskManager_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_dxtrans_0264 */ -/* [local] */ - -#ifdef __cplusplus -///////////////////////////////////////////////////// - -class DXBASESAMPLE; -class DXSAMPLE; -class DXPMSAMPLE; - -///////////////////////////////////////////////////// - -class DXBASESAMPLE -{ -public: - BYTE Blue; - BYTE Green; - BYTE Red; - BYTE Alpha; - DXBASESAMPLE() {} - DXBASESAMPLE(const BYTE alpha, const BYTE red, const BYTE green, const BYTE blue) : - Alpha(alpha), - Red(red), - Green(green), - Blue(blue) {} - DXBASESAMPLE(const DWORD val) { *this = (*(DXBASESAMPLE *)&val); } - operator DWORD () const {return *((DWORD *)this); } - DWORD operator=(const DWORD val) { return *this = *((DXBASESAMPLE *)&val); } -}; // DXBASESAMPLE - -///////////////////////////////////////////////////// - -class DXSAMPLE : public DXBASESAMPLE -{ -public: - DXSAMPLE() {} - DXSAMPLE(const BYTE alpha, const BYTE red, const BYTE green, const BYTE blue) : - DXBASESAMPLE(alpha, red, green, blue) {} - DXSAMPLE(const DWORD val) { *this = (*(DXSAMPLE *)&val); } - operator DWORD () const {return *((DWORD *)this); } - DWORD operator=(const DWORD val) { return *this = *((DXSAMPLE *)&val); } - operator DXPMSAMPLE() const; -}; // DXSAMPLE - -///////////////////////////////////////////////////// - -class DXPMSAMPLE : public DXBASESAMPLE -{ -public: - DXPMSAMPLE() {} - DXPMSAMPLE(const BYTE alpha, const BYTE red, const BYTE green, const BYTE blue) : - DXBASESAMPLE(alpha, red, green, blue) {} - DXPMSAMPLE(const DWORD val) { *this = (*(DXPMSAMPLE *)&val); } - operator DWORD () const {return *((DWORD *)this); } - DWORD operator=(const DWORD val) { return *this = *((DXPMSAMPLE *)&val); } - operator DXSAMPLE() const; -}; // DXPMSAMPLE - -// -// The following cast operators are to prevent a direct assignment of a DXSAMPLE to a DXPMSAMPLE -// -inline DXSAMPLE::operator DXPMSAMPLE() const { return *((DXPMSAMPLE *)this); } -inline DXPMSAMPLE::operator DXSAMPLE() const { return *((DXSAMPLE *)this); } -#else // !__cplusplus -typedef struct DXBASESAMPLE - { - BYTE Blue; - BYTE Green; - BYTE Red; - BYTE Alpha; - } DXBASESAMPLE; - -typedef struct DXSAMPLE - { - BYTE Blue; - BYTE Green; - BYTE Red; - BYTE Alpha; - } DXSAMPLE; - -typedef struct DXPMSAMPLE - { - BYTE Blue; - BYTE Green; - BYTE Red; - BYTE Alpha; - } DXPMSAMPLE; - -#endif // !__cplusplus -typedef -enum DXRUNTYPE - { DXRUNTYPE_CLEAR = 0, - DXRUNTYPE_OPAQUE = 1, - DXRUNTYPE_TRANS = 2, - DXRUNTYPE_UNKNOWN = 3 - } DXRUNTYPE; - -#define DX_MAX_RUN_INFO_COUNT ( 128 ) - -// Ignore the definition used by MIDL for TLB generation -#if 0 -typedef struct DXRUNINFO - { - ULONG Bitfields; - } DXRUNINFO; - -#endif // 0 -typedef struct DXRUNINFO -{ - ULONG Type : 2; // Type - ULONG Count : 30; // Number of samples in run -} DXRUNINFO; -typedef -enum DXSFCREATE - { DXSF_FORMAT_IS_CLSID = 1L << 0, - DXSF_NO_LAZY_DDRAW_LOCK = 1L << 1 - } DXSFCREATE; - -typedef -enum DXBLTOPTIONS - { DXBOF_DO_OVER = 1L << 0, - DXBOF_DITHER = 1L << 1 - } DXBLTOPTIONS; - - - -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0264_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0264_v0_0_s_ifspec; - -#ifndef __IDXSurfaceFactory_INTERFACE_DEFINED__ -#define __IDXSurfaceFactory_INTERFACE_DEFINED__ - -/* interface IDXSurfaceFactory */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXSurfaceFactory; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("144946F5-C4D4-11d1-81D1-0000F87557DB") - IDXSurfaceFactory : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE CreateSurface( - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ const GUID *pFormatID, - /* [in] */ const DXBNDS *pBounds, - /* [in] */ DWORD dwFlags, - /* [in] */ IUnknown *punkOuter, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppDXSurface) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateFromDDSurface( - /* [in] */ IUnknown *pDDrawSurface, - /* [in] */ const GUID *pFormatID, - /* [in] */ DWORD dwFlags, - /* [in] */ IUnknown *punkOuter, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppDXSurface) = 0; - - virtual HRESULT STDMETHODCALLTYPE LoadImage( - /* [in] */ const LPWSTR pszFileName, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ const GUID *pFormatID, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppDXSurface) = 0; - - virtual HRESULT STDMETHODCALLTYPE LoadImageFromStream( - /* [in] */ IStream *pStream, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ const GUID *pFormatID, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppDXSurface) = 0; - - virtual HRESULT STDMETHODCALLTYPE CopySurfaceToNewFormat( - /* [in] */ IDXSurface *pSrc, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ const GUID *pDestFormatID, - /* [out] */ IDXSurface **ppNewSurface) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateD3DRMTexture( - /* [in] */ IDXSurface *pSrc, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ IUnknown *pD3DRM3, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppTexture3) = 0; - - virtual HRESULT STDMETHODCALLTYPE BitBlt( - /* [in] */ IDXSurface *pDest, - /* [in] */ const DXVEC *pPlacement, - /* [in] */ IDXSurface *pSrc, - /* [in] */ const DXBNDS *pClipBounds, - /* [in] */ DWORD dwFlags) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXSurfaceFactoryVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXSurfaceFactory * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXSurfaceFactory * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXSurfaceFactory * This); - - HRESULT ( STDMETHODCALLTYPE *CreateSurface )( - IDXSurfaceFactory * This, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ const GUID *pFormatID, - /* [in] */ const DXBNDS *pBounds, - /* [in] */ DWORD dwFlags, - /* [in] */ IUnknown *punkOuter, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppDXSurface); - - HRESULT ( STDMETHODCALLTYPE *CreateFromDDSurface )( - IDXSurfaceFactory * This, - /* [in] */ IUnknown *pDDrawSurface, - /* [in] */ const GUID *pFormatID, - /* [in] */ DWORD dwFlags, - /* [in] */ IUnknown *punkOuter, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppDXSurface); - - HRESULT ( STDMETHODCALLTYPE *LoadImage )( - IDXSurfaceFactory * This, - /* [in] */ const LPWSTR pszFileName, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ const GUID *pFormatID, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppDXSurface); - - HRESULT ( STDMETHODCALLTYPE *LoadImageFromStream )( - IDXSurfaceFactory * This, - /* [in] */ IStream *pStream, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ const GUID *pFormatID, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppDXSurface); - - HRESULT ( STDMETHODCALLTYPE *CopySurfaceToNewFormat )( - IDXSurfaceFactory * This, - /* [in] */ IDXSurface *pSrc, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ const GUID *pDestFormatID, - /* [out] */ IDXSurface **ppNewSurface); - - HRESULT ( STDMETHODCALLTYPE *CreateD3DRMTexture )( - IDXSurfaceFactory * This, - /* [in] */ IDXSurface *pSrc, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ IUnknown *pD3DRM3, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppTexture3); - - HRESULT ( STDMETHODCALLTYPE *BitBlt )( - IDXSurfaceFactory * This, - /* [in] */ IDXSurface *pDest, - /* [in] */ const DXVEC *pPlacement, - /* [in] */ IDXSurface *pSrc, - /* [in] */ const DXBNDS *pClipBounds, - /* [in] */ DWORD dwFlags); - - END_INTERFACE - } IDXSurfaceFactoryVtbl; - - interface IDXSurfaceFactory - { - CONST_VTBL struct IDXSurfaceFactoryVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXSurfaceFactory_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXSurfaceFactory_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXSurfaceFactory_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXSurfaceFactory_CreateSurface(This,pDirectDraw,pDDSurfaceDesc,pFormatID,pBounds,dwFlags,punkOuter,riid,ppDXSurface) \ - (This)->lpVtbl -> CreateSurface(This,pDirectDraw,pDDSurfaceDesc,pFormatID,pBounds,dwFlags,punkOuter,riid,ppDXSurface) - -#define IDXSurfaceFactory_CreateFromDDSurface(This,pDDrawSurface,pFormatID,dwFlags,punkOuter,riid,ppDXSurface) \ - (This)->lpVtbl -> CreateFromDDSurface(This,pDDrawSurface,pFormatID,dwFlags,punkOuter,riid,ppDXSurface) - -#define IDXSurfaceFactory_LoadImage(This,pszFileName,pDirectDraw,pDDSurfaceDesc,pFormatID,riid,ppDXSurface) \ - (This)->lpVtbl -> LoadImage(This,pszFileName,pDirectDraw,pDDSurfaceDesc,pFormatID,riid,ppDXSurface) - -#define IDXSurfaceFactory_LoadImageFromStream(This,pStream,pDirectDraw,pDDSurfaceDesc,pFormatID,riid,ppDXSurface) \ - (This)->lpVtbl -> LoadImageFromStream(This,pStream,pDirectDraw,pDDSurfaceDesc,pFormatID,riid,ppDXSurface) - -#define IDXSurfaceFactory_CopySurfaceToNewFormat(This,pSrc,pDirectDraw,pDDSurfaceDesc,pDestFormatID,ppNewSurface) \ - (This)->lpVtbl -> CopySurfaceToNewFormat(This,pSrc,pDirectDraw,pDDSurfaceDesc,pDestFormatID,ppNewSurface) - -#define IDXSurfaceFactory_CreateD3DRMTexture(This,pSrc,pDirectDraw,pD3DRM3,riid,ppTexture3) \ - (This)->lpVtbl -> CreateD3DRMTexture(This,pSrc,pDirectDraw,pD3DRM3,riid,ppTexture3) - -#define IDXSurfaceFactory_BitBlt(This,pDest,pPlacement,pSrc,pClipBounds,dwFlags) \ - (This)->lpVtbl -> BitBlt(This,pDest,pPlacement,pSrc,pClipBounds,dwFlags) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXSurfaceFactory_CreateSurface_Proxy( - IDXSurfaceFactory * This, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ const GUID *pFormatID, - /* [in] */ const DXBNDS *pBounds, - /* [in] */ DWORD dwFlags, - /* [in] */ IUnknown *punkOuter, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppDXSurface); - - -void __RPC_STUB IDXSurfaceFactory_CreateSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceFactory_CreateFromDDSurface_Proxy( - IDXSurfaceFactory * This, - /* [in] */ IUnknown *pDDrawSurface, - /* [in] */ const GUID *pFormatID, - /* [in] */ DWORD dwFlags, - /* [in] */ IUnknown *punkOuter, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppDXSurface); - - -void __RPC_STUB IDXSurfaceFactory_CreateFromDDSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceFactory_LoadImage_Proxy( - IDXSurfaceFactory * This, - /* [in] */ const LPWSTR pszFileName, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ const GUID *pFormatID, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppDXSurface); - - -void __RPC_STUB IDXSurfaceFactory_LoadImage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceFactory_LoadImageFromStream_Proxy( - IDXSurfaceFactory * This, - /* [in] */ IStream *pStream, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ const GUID *pFormatID, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppDXSurface); - - -void __RPC_STUB IDXSurfaceFactory_LoadImageFromStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceFactory_CopySurfaceToNewFormat_Proxy( - IDXSurfaceFactory * This, - /* [in] */ IDXSurface *pSrc, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ const GUID *pDestFormatID, - /* [out] */ IDXSurface **ppNewSurface); - - -void __RPC_STUB IDXSurfaceFactory_CopySurfaceToNewFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceFactory_CreateD3DRMTexture_Proxy( - IDXSurfaceFactory * This, - /* [in] */ IDXSurface *pSrc, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ IUnknown *pD3DRM3, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppTexture3); - - -void __RPC_STUB IDXSurfaceFactory_CreateD3DRMTexture_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceFactory_BitBlt_Proxy( - IDXSurfaceFactory * This, - /* [in] */ IDXSurface *pDest, - /* [in] */ const DXVEC *pPlacement, - /* [in] */ IDXSurface *pSrc, - /* [in] */ const DXBNDS *pClipBounds, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IDXSurfaceFactory_BitBlt_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXSurfaceFactory_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_dxtrans_0265 */ -/* [local] */ - -typedef -enum DXSURFMODCOMPOP - { DXSURFMOD_COMP_OVER = 0, - DXSURFMOD_COMP_ALPHA_MASK = 1, - DXSURFMOD_COMP_MAX_VALID = 1 - } DXSURFMODCOMPOP; - - - -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0265_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0265_v0_0_s_ifspec; - -#ifndef __IDXSurfaceModifier_INTERFACE_DEFINED__ -#define __IDXSurfaceModifier_INTERFACE_DEFINED__ - -/* interface IDXSurfaceModifier */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXSurfaceModifier; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("9EA3B637-C37D-11d1-905E-00C04FD9189D") - IDXSurfaceModifier : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetFillColor( - /* [in] */ DXSAMPLE Color) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFillColor( - /* [out] */ DXSAMPLE *pColor) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetBounds( - /* [in] */ const DXBNDS *pBounds) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetBackground( - /* [in] */ IDXSurface *pSurface) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBackground( - /* [out] */ IDXSurface **ppSurface) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCompositeOperation( - /* [in] */ DXSURFMODCOMPOP CompOp) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCompositeOperation( - /* [out] */ DXSURFMODCOMPOP *pCompOp) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetForeground( - /* [in] */ IDXSurface *pSurface, - /* [in] */ BOOL bTile, - /* [in] */ const POINT *pOrigin) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetForeground( - /* [out] */ IDXSurface **ppSurface, - /* [out] */ BOOL *pbTile, - /* [out] */ POINT *pOrigin) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetOpacity( - /* [in] */ float Opacity) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetOpacity( - /* [out] */ float *pOpacity) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetLookup( - /* [in] */ IDXLookupTable *pLookupTable) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetLookup( - /* [out] */ IDXLookupTable **ppLookupTable) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXSurfaceModifierVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXSurfaceModifier * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXSurfaceModifier * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXSurfaceModifier * This); - - HRESULT ( STDMETHODCALLTYPE *SetFillColor )( - IDXSurfaceModifier * This, - /* [in] */ DXSAMPLE Color); - - HRESULT ( STDMETHODCALLTYPE *GetFillColor )( - IDXSurfaceModifier * This, - /* [out] */ DXSAMPLE *pColor); - - HRESULT ( STDMETHODCALLTYPE *SetBounds )( - IDXSurfaceModifier * This, - /* [in] */ const DXBNDS *pBounds); - - HRESULT ( STDMETHODCALLTYPE *SetBackground )( - IDXSurfaceModifier * This, - /* [in] */ IDXSurface *pSurface); - - HRESULT ( STDMETHODCALLTYPE *GetBackground )( - IDXSurfaceModifier * This, - /* [out] */ IDXSurface **ppSurface); - - HRESULT ( STDMETHODCALLTYPE *SetCompositeOperation )( - IDXSurfaceModifier * This, - /* [in] */ DXSURFMODCOMPOP CompOp); - - HRESULT ( STDMETHODCALLTYPE *GetCompositeOperation )( - IDXSurfaceModifier * This, - /* [out] */ DXSURFMODCOMPOP *pCompOp); - - HRESULT ( STDMETHODCALLTYPE *SetForeground )( - IDXSurfaceModifier * This, - /* [in] */ IDXSurface *pSurface, - /* [in] */ BOOL bTile, - /* [in] */ const POINT *pOrigin); - - HRESULT ( STDMETHODCALLTYPE *GetForeground )( - IDXSurfaceModifier * This, - /* [out] */ IDXSurface **ppSurface, - /* [out] */ BOOL *pbTile, - /* [out] */ POINT *pOrigin); - - HRESULT ( STDMETHODCALLTYPE *SetOpacity )( - IDXSurfaceModifier * This, - /* [in] */ float Opacity); - - HRESULT ( STDMETHODCALLTYPE *GetOpacity )( - IDXSurfaceModifier * This, - /* [out] */ float *pOpacity); - - HRESULT ( STDMETHODCALLTYPE *SetLookup )( - IDXSurfaceModifier * This, - /* [in] */ IDXLookupTable *pLookupTable); - - HRESULT ( STDMETHODCALLTYPE *GetLookup )( - IDXSurfaceModifier * This, - /* [out] */ IDXLookupTable **ppLookupTable); - - END_INTERFACE - } IDXSurfaceModifierVtbl; - - interface IDXSurfaceModifier - { - CONST_VTBL struct IDXSurfaceModifierVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXSurfaceModifier_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXSurfaceModifier_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXSurfaceModifier_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXSurfaceModifier_SetFillColor(This,Color) \ - (This)->lpVtbl -> SetFillColor(This,Color) - -#define IDXSurfaceModifier_GetFillColor(This,pColor) \ - (This)->lpVtbl -> GetFillColor(This,pColor) - -#define IDXSurfaceModifier_SetBounds(This,pBounds) \ - (This)->lpVtbl -> SetBounds(This,pBounds) - -#define IDXSurfaceModifier_SetBackground(This,pSurface) \ - (This)->lpVtbl -> SetBackground(This,pSurface) - -#define IDXSurfaceModifier_GetBackground(This,ppSurface) \ - (This)->lpVtbl -> GetBackground(This,ppSurface) - -#define IDXSurfaceModifier_SetCompositeOperation(This,CompOp) \ - (This)->lpVtbl -> SetCompositeOperation(This,CompOp) - -#define IDXSurfaceModifier_GetCompositeOperation(This,pCompOp) \ - (This)->lpVtbl -> GetCompositeOperation(This,pCompOp) - -#define IDXSurfaceModifier_SetForeground(This,pSurface,bTile,pOrigin) \ - (This)->lpVtbl -> SetForeground(This,pSurface,bTile,pOrigin) - -#define IDXSurfaceModifier_GetForeground(This,ppSurface,pbTile,pOrigin) \ - (This)->lpVtbl -> GetForeground(This,ppSurface,pbTile,pOrigin) - -#define IDXSurfaceModifier_SetOpacity(This,Opacity) \ - (This)->lpVtbl -> SetOpacity(This,Opacity) - -#define IDXSurfaceModifier_GetOpacity(This,pOpacity) \ - (This)->lpVtbl -> GetOpacity(This,pOpacity) - -#define IDXSurfaceModifier_SetLookup(This,pLookupTable) \ - (This)->lpVtbl -> SetLookup(This,pLookupTable) - -#define IDXSurfaceModifier_GetLookup(This,ppLookupTable) \ - (This)->lpVtbl -> GetLookup(This,ppLookupTable) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXSurfaceModifier_SetFillColor_Proxy( - IDXSurfaceModifier * This, - /* [in] */ DXSAMPLE Color); - - -void __RPC_STUB IDXSurfaceModifier_SetFillColor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceModifier_GetFillColor_Proxy( - IDXSurfaceModifier * This, - /* [out] */ DXSAMPLE *pColor); - - -void __RPC_STUB IDXSurfaceModifier_GetFillColor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceModifier_SetBounds_Proxy( - IDXSurfaceModifier * This, - /* [in] */ const DXBNDS *pBounds); - - -void __RPC_STUB IDXSurfaceModifier_SetBounds_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceModifier_SetBackground_Proxy( - IDXSurfaceModifier * This, - /* [in] */ IDXSurface *pSurface); - - -void __RPC_STUB IDXSurfaceModifier_SetBackground_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceModifier_GetBackground_Proxy( - IDXSurfaceModifier * This, - /* [out] */ IDXSurface **ppSurface); - - -void __RPC_STUB IDXSurfaceModifier_GetBackground_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceModifier_SetCompositeOperation_Proxy( - IDXSurfaceModifier * This, - /* [in] */ DXSURFMODCOMPOP CompOp); - - -void __RPC_STUB IDXSurfaceModifier_SetCompositeOperation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceModifier_GetCompositeOperation_Proxy( - IDXSurfaceModifier * This, - /* [out] */ DXSURFMODCOMPOP *pCompOp); - - -void __RPC_STUB IDXSurfaceModifier_GetCompositeOperation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceModifier_SetForeground_Proxy( - IDXSurfaceModifier * This, - /* [in] */ IDXSurface *pSurface, - /* [in] */ BOOL bTile, - /* [in] */ const POINT *pOrigin); - - -void __RPC_STUB IDXSurfaceModifier_SetForeground_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceModifier_GetForeground_Proxy( - IDXSurfaceModifier * This, - /* [out] */ IDXSurface **ppSurface, - /* [out] */ BOOL *pbTile, - /* [out] */ POINT *pOrigin); - - -void __RPC_STUB IDXSurfaceModifier_GetForeground_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceModifier_SetOpacity_Proxy( - IDXSurfaceModifier * This, - /* [in] */ float Opacity); - - -void __RPC_STUB IDXSurfaceModifier_SetOpacity_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceModifier_GetOpacity_Proxy( - IDXSurfaceModifier * This, - /* [out] */ float *pOpacity); - - -void __RPC_STUB IDXSurfaceModifier_GetOpacity_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceModifier_SetLookup_Proxy( - IDXSurfaceModifier * This, - /* [in] */ IDXLookupTable *pLookupTable); - - -void __RPC_STUB IDXSurfaceModifier_SetLookup_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurfaceModifier_GetLookup_Proxy( - IDXSurfaceModifier * This, - /* [out] */ IDXLookupTable **ppLookupTable); - - -void __RPC_STUB IDXSurfaceModifier_GetLookup_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXSurfaceModifier_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_dxtrans_0266 */ -/* [local] */ - -typedef -enum DXSAMPLEFORMATENUM - { DXPF_FLAGSMASK = 0xffff0000, - DXPF_NONPREMULT = 0x10000, - DXPF_TRANSPARENCY = 0x20000, - DXPF_TRANSLUCENCY = 0x40000, - DXPF_2BITERROR = 0x200000, - DXPF_3BITERROR = 0x300000, - DXPF_4BITERROR = 0x400000, - DXPF_5BITERROR = 0x500000, - DXPF_ERRORMASK = 0x700000, - DXPF_NONSTANDARD = 0, - DXPF_PMARGB32 = 1 | DXPF_TRANSPARENCY | DXPF_TRANSLUCENCY, - DXPF_ARGB32 = 2 | DXPF_NONPREMULT | DXPF_TRANSPARENCY | DXPF_TRANSLUCENCY, - DXPF_ARGB4444 = 3 | DXPF_NONPREMULT | DXPF_TRANSPARENCY | DXPF_TRANSLUCENCY | DXPF_4BITERROR, - DXPF_A8 = 4 | DXPF_TRANSPARENCY | DXPF_TRANSLUCENCY, - DXPF_RGB32 = 5, - DXPF_RGB24 = 6, - DXPF_RGB565 = 7 | DXPF_3BITERROR, - DXPF_RGB555 = 8 | DXPF_3BITERROR, - DXPF_RGB8 = 9 | DXPF_5BITERROR, - DXPF_ARGB1555 = 10 | DXPF_TRANSPARENCY | DXPF_3BITERROR, - DXPF_RGB32_CK = DXPF_RGB32 | DXPF_TRANSPARENCY, - DXPF_RGB24_CK = DXPF_RGB24 | DXPF_TRANSPARENCY, - DXPF_RGB555_CK = DXPF_RGB555 | DXPF_TRANSPARENCY, - DXPF_RGB565_CK = DXPF_RGB565 | DXPF_TRANSPARENCY, - DXPF_RGB8_CK = DXPF_RGB8 | DXPF_TRANSPARENCY - } DXSAMPLEFORMATENUM; - -typedef -enum DXLOCKSURF - { DXLOCKF_READ = 0, - DXLOCKF_READWRITE = 1 << 0, - DXLOCKF_EXISTINGINFOONLY = 1 << 1, - DXLOCKF_WANTRUNINFO = 1 << 2, - DXLOCKF_NONPREMULT = 1 << 16, - DXLOCKF_VALIDFLAGS = DXLOCKF_READWRITE | DXLOCKF_EXISTINGINFOONLY | DXLOCKF_WANTRUNINFO | DXLOCKF_NONPREMULT - } DXLOCKSURF; - -typedef -enum DXSURFSTATUS - { DXSURF_TRANSIENT = 1 << 0, - DXSURF_READONLY = 1 << 1, - DXSURF_VALIDFLAGS = DXSURF_TRANSIENT | DXSURF_READONLY - } DXSURFSTATUS; - - - -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0266_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0266_v0_0_s_ifspec; - -#ifndef __IDXSurface_INTERFACE_DEFINED__ -#define __IDXSurface_INTERFACE_DEFINED__ - -/* interface IDXSurface */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXSurface; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("B39FD73F-E139-11d1-9065-00C04FD9189D") - IDXSurface : public IDXBaseObject - { - public: - virtual HRESULT STDMETHODCALLTYPE GetPixelFormat( - /* [out] */ GUID *pFormatID, - /* [out] */ DXSAMPLEFORMATENUM *pSampleFormatEnum) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBounds( - /* [out] */ DXBNDS *pBounds) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetStatusFlags( - /* [out] */ DWORD *pdwStatusFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetStatusFlags( - /* [in] */ DWORD dwStatusFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE LockSurface( - /* [in] */ const DXBNDS *pBounds, - /* [in] */ ULONG ulTimeOut, - /* [in] */ DWORD dwFlags, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppPointer, - /* [out] */ ULONG *pulGenerationId) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDirectDrawSurface( - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppSurface) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetColorKey( - DXSAMPLE *pColorKey) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetColorKey( - DXSAMPLE ColorKey) = 0; - - virtual HRESULT STDMETHODCALLTYPE LockSurfaceDC( - /* [in] */ const DXBNDS *pBounds, - /* [in] */ ULONG ulTimeOut, - /* [in] */ DWORD dwFlags, - /* [out] */ IDXDCLock **ppDCLock) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetAppData( - DWORD_PTR dwAppData) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAppData( - DWORD_PTR *pdwAppData) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXSurfaceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXSurface * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXSurface * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXSurface * This); - - HRESULT ( STDMETHODCALLTYPE *GetGenerationId )( - IDXSurface * This, - /* [out] */ ULONG *pID); - - HRESULT ( STDMETHODCALLTYPE *IncrementGenerationId )( - IDXSurface * This, - /* [in] */ BOOL bRefresh); - - HRESULT ( STDMETHODCALLTYPE *GetObjectSize )( - IDXSurface * This, - /* [out] */ ULONG *pcbSize); - - HRESULT ( STDMETHODCALLTYPE *GetPixelFormat )( - IDXSurface * This, - /* [out] */ GUID *pFormatID, - /* [out] */ DXSAMPLEFORMATENUM *pSampleFormatEnum); - - HRESULT ( STDMETHODCALLTYPE *GetBounds )( - IDXSurface * This, - /* [out] */ DXBNDS *pBounds); - - HRESULT ( STDMETHODCALLTYPE *GetStatusFlags )( - IDXSurface * This, - /* [out] */ DWORD *pdwStatusFlags); - - HRESULT ( STDMETHODCALLTYPE *SetStatusFlags )( - IDXSurface * This, - /* [in] */ DWORD dwStatusFlags); - - HRESULT ( STDMETHODCALLTYPE *LockSurface )( - IDXSurface * This, - /* [in] */ const DXBNDS *pBounds, - /* [in] */ ULONG ulTimeOut, - /* [in] */ DWORD dwFlags, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppPointer, - /* [out] */ ULONG *pulGenerationId); - - HRESULT ( STDMETHODCALLTYPE *GetDirectDrawSurface )( - IDXSurface * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppSurface); - - HRESULT ( STDMETHODCALLTYPE *GetColorKey )( - IDXSurface * This, - DXSAMPLE *pColorKey); - - HRESULT ( STDMETHODCALLTYPE *SetColorKey )( - IDXSurface * This, - DXSAMPLE ColorKey); - - HRESULT ( STDMETHODCALLTYPE *LockSurfaceDC )( - IDXSurface * This, - /* [in] */ const DXBNDS *pBounds, - /* [in] */ ULONG ulTimeOut, - /* [in] */ DWORD dwFlags, - /* [out] */ IDXDCLock **ppDCLock); - - HRESULT ( STDMETHODCALLTYPE *SetAppData )( - IDXSurface * This, - DWORD_PTR dwAppData); - - HRESULT ( STDMETHODCALLTYPE *GetAppData )( - IDXSurface * This, - DWORD_PTR *pdwAppData); - - END_INTERFACE - } IDXSurfaceVtbl; - - interface IDXSurface - { - CONST_VTBL struct IDXSurfaceVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXSurface_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXSurface_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXSurface_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXSurface_GetGenerationId(This,pID) \ - (This)->lpVtbl -> GetGenerationId(This,pID) - -#define IDXSurface_IncrementGenerationId(This,bRefresh) \ - (This)->lpVtbl -> IncrementGenerationId(This,bRefresh) - -#define IDXSurface_GetObjectSize(This,pcbSize) \ - (This)->lpVtbl -> GetObjectSize(This,pcbSize) - - -#define IDXSurface_GetPixelFormat(This,pFormatID,pSampleFormatEnum) \ - (This)->lpVtbl -> GetPixelFormat(This,pFormatID,pSampleFormatEnum) - -#define IDXSurface_GetBounds(This,pBounds) \ - (This)->lpVtbl -> GetBounds(This,pBounds) - -#define IDXSurface_GetStatusFlags(This,pdwStatusFlags) \ - (This)->lpVtbl -> GetStatusFlags(This,pdwStatusFlags) - -#define IDXSurface_SetStatusFlags(This,dwStatusFlags) \ - (This)->lpVtbl -> SetStatusFlags(This,dwStatusFlags) - -#define IDXSurface_LockSurface(This,pBounds,ulTimeOut,dwFlags,riid,ppPointer,pulGenerationId) \ - (This)->lpVtbl -> LockSurface(This,pBounds,ulTimeOut,dwFlags,riid,ppPointer,pulGenerationId) - -#define IDXSurface_GetDirectDrawSurface(This,riid,ppSurface) \ - (This)->lpVtbl -> GetDirectDrawSurface(This,riid,ppSurface) - -#define IDXSurface_GetColorKey(This,pColorKey) \ - (This)->lpVtbl -> GetColorKey(This,pColorKey) - -#define IDXSurface_SetColorKey(This,ColorKey) \ - (This)->lpVtbl -> SetColorKey(This,ColorKey) - -#define IDXSurface_LockSurfaceDC(This,pBounds,ulTimeOut,dwFlags,ppDCLock) \ - (This)->lpVtbl -> LockSurfaceDC(This,pBounds,ulTimeOut,dwFlags,ppDCLock) - -#define IDXSurface_SetAppData(This,dwAppData) \ - (This)->lpVtbl -> SetAppData(This,dwAppData) - -#define IDXSurface_GetAppData(This,pdwAppData) \ - (This)->lpVtbl -> GetAppData(This,pdwAppData) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXSurface_GetPixelFormat_Proxy( - IDXSurface * This, - /* [out] */ GUID *pFormatID, - /* [out] */ DXSAMPLEFORMATENUM *pSampleFormatEnum); - - -void __RPC_STUB IDXSurface_GetPixelFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurface_GetBounds_Proxy( - IDXSurface * This, - /* [out] */ DXBNDS *pBounds); - - -void __RPC_STUB IDXSurface_GetBounds_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurface_GetStatusFlags_Proxy( - IDXSurface * This, - /* [out] */ DWORD *pdwStatusFlags); - - -void __RPC_STUB IDXSurface_GetStatusFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurface_SetStatusFlags_Proxy( - IDXSurface * This, - /* [in] */ DWORD dwStatusFlags); - - -void __RPC_STUB IDXSurface_SetStatusFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurface_LockSurface_Proxy( - IDXSurface * This, - /* [in] */ const DXBNDS *pBounds, - /* [in] */ ULONG ulTimeOut, - /* [in] */ DWORD dwFlags, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppPointer, - /* [out] */ ULONG *pulGenerationId); - - -void __RPC_STUB IDXSurface_LockSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurface_GetDirectDrawSurface_Proxy( - IDXSurface * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppSurface); - - -void __RPC_STUB IDXSurface_GetDirectDrawSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurface_GetColorKey_Proxy( - IDXSurface * This, - DXSAMPLE *pColorKey); - - -void __RPC_STUB IDXSurface_GetColorKey_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurface_SetColorKey_Proxy( - IDXSurface * This, - DXSAMPLE ColorKey); - - -void __RPC_STUB IDXSurface_SetColorKey_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurface_LockSurfaceDC_Proxy( - IDXSurface * This, - /* [in] */ const DXBNDS *pBounds, - /* [in] */ ULONG ulTimeOut, - /* [in] */ DWORD dwFlags, - /* [out] */ IDXDCLock **ppDCLock); - - -void __RPC_STUB IDXSurface_LockSurfaceDC_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurface_SetAppData_Proxy( - IDXSurface * This, - DWORD_PTR dwAppData); - - -void __RPC_STUB IDXSurface_SetAppData_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXSurface_GetAppData_Proxy( - IDXSurface * This, - DWORD_PTR *pdwAppData); - - -void __RPC_STUB IDXSurface_GetAppData_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXSurface_INTERFACE_DEFINED__ */ - - -#ifndef __IDXSurfaceInit_INTERFACE_DEFINED__ -#define __IDXSurfaceInit_INTERFACE_DEFINED__ - -/* interface IDXSurfaceInit */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXSurfaceInit; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("9EA3B639-C37D-11d1-905E-00C04FD9189D") - IDXSurfaceInit : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE InitSurface( - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ const GUID *pFormatID, - /* [in] */ const DXBNDS *pBounds, - /* [in] */ DWORD dwFlags) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXSurfaceInitVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXSurfaceInit * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXSurfaceInit * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXSurfaceInit * This); - - HRESULT ( STDMETHODCALLTYPE *InitSurface )( - IDXSurfaceInit * This, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ const GUID *pFormatID, - /* [in] */ const DXBNDS *pBounds, - /* [in] */ DWORD dwFlags); - - END_INTERFACE - } IDXSurfaceInitVtbl; - - interface IDXSurfaceInit - { - CONST_VTBL struct IDXSurfaceInitVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXSurfaceInit_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXSurfaceInit_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXSurfaceInit_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXSurfaceInit_InitSurface(This,pDirectDraw,pDDSurfaceDesc,pFormatID,pBounds,dwFlags) \ - (This)->lpVtbl -> InitSurface(This,pDirectDraw,pDDSurfaceDesc,pFormatID,pBounds,dwFlags) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXSurfaceInit_InitSurface_Proxy( - IDXSurfaceInit * This, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ const GUID *pFormatID, - /* [in] */ const DXBNDS *pBounds, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IDXSurfaceInit_InitSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXSurfaceInit_INTERFACE_DEFINED__ */ - - -#ifndef __IDXARGBSurfaceInit_INTERFACE_DEFINED__ -#define __IDXARGBSurfaceInit_INTERFACE_DEFINED__ - -/* interface IDXARGBSurfaceInit */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXARGBSurfaceInit; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("9EA3B63A-C37D-11d1-905E-00C04FD9189D") - IDXARGBSurfaceInit : public IDXSurfaceInit - { - public: - virtual HRESULT STDMETHODCALLTYPE InitFromDDSurface( - /* [in] */ IUnknown *pDDrawSurface, - /* [in] */ const GUID *pFormatID, - /* [in] */ DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE InitFromRawSurface( - /* [in] */ IDXRawSurface *pRawSurface) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXARGBSurfaceInitVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXARGBSurfaceInit * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXARGBSurfaceInit * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXARGBSurfaceInit * This); - - HRESULT ( STDMETHODCALLTYPE *InitSurface )( - IDXARGBSurfaceInit * This, - /* [in] */ IUnknown *pDirectDraw, - /* [in] */ const DDSURFACEDESC *pDDSurfaceDesc, - /* [in] */ const GUID *pFormatID, - /* [in] */ const DXBNDS *pBounds, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *InitFromDDSurface )( - IDXARGBSurfaceInit * This, - /* [in] */ IUnknown *pDDrawSurface, - /* [in] */ const GUID *pFormatID, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *InitFromRawSurface )( - IDXARGBSurfaceInit * This, - /* [in] */ IDXRawSurface *pRawSurface); - - END_INTERFACE - } IDXARGBSurfaceInitVtbl; - - interface IDXARGBSurfaceInit - { - CONST_VTBL struct IDXARGBSurfaceInitVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXARGBSurfaceInit_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXARGBSurfaceInit_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXARGBSurfaceInit_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXARGBSurfaceInit_InitSurface(This,pDirectDraw,pDDSurfaceDesc,pFormatID,pBounds,dwFlags) \ - (This)->lpVtbl -> InitSurface(This,pDirectDraw,pDDSurfaceDesc,pFormatID,pBounds,dwFlags) - - -#define IDXARGBSurfaceInit_InitFromDDSurface(This,pDDrawSurface,pFormatID,dwFlags) \ - (This)->lpVtbl -> InitFromDDSurface(This,pDDrawSurface,pFormatID,dwFlags) - -#define IDXARGBSurfaceInit_InitFromRawSurface(This,pRawSurface) \ - (This)->lpVtbl -> InitFromRawSurface(This,pRawSurface) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXARGBSurfaceInit_InitFromDDSurface_Proxy( - IDXARGBSurfaceInit * This, - /* [in] */ IUnknown *pDDrawSurface, - /* [in] */ const GUID *pFormatID, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IDXARGBSurfaceInit_InitFromDDSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXARGBSurfaceInit_InitFromRawSurface_Proxy( - IDXARGBSurfaceInit * This, - /* [in] */ IDXRawSurface *pRawSurface); - - -void __RPC_STUB IDXARGBSurfaceInit_InitFromRawSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXARGBSurfaceInit_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_dxtrans_0269 */ -/* [local] */ - -typedef struct tagDXNATIVETYPEINFO - { - BYTE *pCurrentData; - BYTE *pFirstByte; - long lPitch; - DWORD dwColorKey; - } DXNATIVETYPEINFO; - -typedef struct tagDXPACKEDRECTDESC - { - DXBASESAMPLE *pSamples; - BOOL bPremult; - RECT rect; - long lRowPadding; - } DXPACKEDRECTDESC; - -typedef struct tagDXOVERSAMPLEDESC - { - POINT p; - DXPMSAMPLE Color; - } DXOVERSAMPLEDESC; - - - -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0269_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0269_v0_0_s_ifspec; - -#ifndef __IDXARGBReadPtr_INTERFACE_DEFINED__ -#define __IDXARGBReadPtr_INTERFACE_DEFINED__ - -/* interface IDXARGBReadPtr */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXARGBReadPtr; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("EAAAC2D6-C290-11d1-905D-00C04FD9189D") - IDXARGBReadPtr : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetSurface( - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppSurface) = 0; - - virtual DXSAMPLEFORMATENUM STDMETHODCALLTYPE GetNativeType( - /* [out] */ DXNATIVETYPEINFO *pInfo) = 0; - - virtual void STDMETHODCALLTYPE Move( - /* [in] */ long cSamples) = 0; - - virtual void STDMETHODCALLTYPE MoveToRow( - /* [in] */ ULONG y) = 0; - - virtual void STDMETHODCALLTYPE MoveToXY( - /* [in] */ ULONG x, - /* [in] */ ULONG y) = 0; - - virtual ULONG STDMETHODCALLTYPE MoveAndGetRunInfo( - /* [in] */ ULONG Row, - /* [out] */ const DXRUNINFO **ppInfo) = 0; - - virtual DXSAMPLE *STDMETHODCALLTYPE Unpack( - /* [in] */ DXSAMPLE *pSamples, - /* [in] */ ULONG cSamples, - /* [in] */ BOOL bMove) = 0; - - virtual DXPMSAMPLE *STDMETHODCALLTYPE UnpackPremult( - /* [in] */ DXPMSAMPLE *pSamples, - /* [in] */ ULONG cSamples, - /* [in] */ BOOL bMove) = 0; - - virtual void STDMETHODCALLTYPE UnpackRect( - /* [in] */ const DXPACKEDRECTDESC *pRectDesc) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXARGBReadPtrVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXARGBReadPtr * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXARGBReadPtr * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXARGBReadPtr * This); - - HRESULT ( STDMETHODCALLTYPE *GetSurface )( - IDXARGBReadPtr * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppSurface); - - DXSAMPLEFORMATENUM ( STDMETHODCALLTYPE *GetNativeType )( - IDXARGBReadPtr * This, - /* [out] */ DXNATIVETYPEINFO *pInfo); - - void ( STDMETHODCALLTYPE *Move )( - IDXARGBReadPtr * This, - /* [in] */ long cSamples); - - void ( STDMETHODCALLTYPE *MoveToRow )( - IDXARGBReadPtr * This, - /* [in] */ ULONG y); - - void ( STDMETHODCALLTYPE *MoveToXY )( - IDXARGBReadPtr * This, - /* [in] */ ULONG x, - /* [in] */ ULONG y); - - ULONG ( STDMETHODCALLTYPE *MoveAndGetRunInfo )( - IDXARGBReadPtr * This, - /* [in] */ ULONG Row, - /* [out] */ const DXRUNINFO **ppInfo); - - DXSAMPLE *( STDMETHODCALLTYPE *Unpack )( - IDXARGBReadPtr * This, - /* [in] */ DXSAMPLE *pSamples, - /* [in] */ ULONG cSamples, - /* [in] */ BOOL bMove); - - DXPMSAMPLE *( STDMETHODCALLTYPE *UnpackPremult )( - IDXARGBReadPtr * This, - /* [in] */ DXPMSAMPLE *pSamples, - /* [in] */ ULONG cSamples, - /* [in] */ BOOL bMove); - - void ( STDMETHODCALLTYPE *UnpackRect )( - IDXARGBReadPtr * This, - /* [in] */ const DXPACKEDRECTDESC *pRectDesc); - - END_INTERFACE - } IDXARGBReadPtrVtbl; - - interface IDXARGBReadPtr - { - CONST_VTBL struct IDXARGBReadPtrVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXARGBReadPtr_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXARGBReadPtr_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXARGBReadPtr_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXARGBReadPtr_GetSurface(This,riid,ppSurface) \ - (This)->lpVtbl -> GetSurface(This,riid,ppSurface) - -#define IDXARGBReadPtr_GetNativeType(This,pInfo) \ - (This)->lpVtbl -> GetNativeType(This,pInfo) - -#define IDXARGBReadPtr_Move(This,cSamples) \ - (This)->lpVtbl -> Move(This,cSamples) - -#define IDXARGBReadPtr_MoveToRow(This,y) \ - (This)->lpVtbl -> MoveToRow(This,y) - -#define IDXARGBReadPtr_MoveToXY(This,x,y) \ - (This)->lpVtbl -> MoveToXY(This,x,y) - -#define IDXARGBReadPtr_MoveAndGetRunInfo(This,Row,ppInfo) \ - (This)->lpVtbl -> MoveAndGetRunInfo(This,Row,ppInfo) - -#define IDXARGBReadPtr_Unpack(This,pSamples,cSamples,bMove) \ - (This)->lpVtbl -> Unpack(This,pSamples,cSamples,bMove) - -#define IDXARGBReadPtr_UnpackPremult(This,pSamples,cSamples,bMove) \ - (This)->lpVtbl -> UnpackPremult(This,pSamples,cSamples,bMove) - -#define IDXARGBReadPtr_UnpackRect(This,pRectDesc) \ - (This)->lpVtbl -> UnpackRect(This,pRectDesc) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXARGBReadPtr_GetSurface_Proxy( - IDXARGBReadPtr * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppSurface); - - -void __RPC_STUB IDXARGBReadPtr_GetSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -DXSAMPLEFORMATENUM STDMETHODCALLTYPE IDXARGBReadPtr_GetNativeType_Proxy( - IDXARGBReadPtr * This, - /* [out] */ DXNATIVETYPEINFO *pInfo); - - -void __RPC_STUB IDXARGBReadPtr_GetNativeType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -void STDMETHODCALLTYPE IDXARGBReadPtr_Move_Proxy( - IDXARGBReadPtr * This, - /* [in] */ long cSamples); - - -void __RPC_STUB IDXARGBReadPtr_Move_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -void STDMETHODCALLTYPE IDXARGBReadPtr_MoveToRow_Proxy( - IDXARGBReadPtr * This, - /* [in] */ ULONG y); - - -void __RPC_STUB IDXARGBReadPtr_MoveToRow_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -void STDMETHODCALLTYPE IDXARGBReadPtr_MoveToXY_Proxy( - IDXARGBReadPtr * This, - /* [in] */ ULONG x, - /* [in] */ ULONG y); - - -void __RPC_STUB IDXARGBReadPtr_MoveToXY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -ULONG STDMETHODCALLTYPE IDXARGBReadPtr_MoveAndGetRunInfo_Proxy( - IDXARGBReadPtr * This, - /* [in] */ ULONG Row, - /* [out] */ const DXRUNINFO **ppInfo); - - -void __RPC_STUB IDXARGBReadPtr_MoveAndGetRunInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -DXSAMPLE *STDMETHODCALLTYPE IDXARGBReadPtr_Unpack_Proxy( - IDXARGBReadPtr * This, - /* [in] */ DXSAMPLE *pSamples, - /* [in] */ ULONG cSamples, - /* [in] */ BOOL bMove); - - -void __RPC_STUB IDXARGBReadPtr_Unpack_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -DXPMSAMPLE *STDMETHODCALLTYPE IDXARGBReadPtr_UnpackPremult_Proxy( - IDXARGBReadPtr * This, - /* [in] */ DXPMSAMPLE *pSamples, - /* [in] */ ULONG cSamples, - /* [in] */ BOOL bMove); - - -void __RPC_STUB IDXARGBReadPtr_UnpackPremult_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -void STDMETHODCALLTYPE IDXARGBReadPtr_UnpackRect_Proxy( - IDXARGBReadPtr * This, - /* [in] */ const DXPACKEDRECTDESC *pRectDesc); - - -void __RPC_STUB IDXARGBReadPtr_UnpackRect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXARGBReadPtr_INTERFACE_DEFINED__ */ - - -#ifndef __IDXARGBReadWritePtr_INTERFACE_DEFINED__ -#define __IDXARGBReadWritePtr_INTERFACE_DEFINED__ - -/* interface IDXARGBReadWritePtr */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXARGBReadWritePtr; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("EAAAC2D7-C290-11d1-905D-00C04FD9189D") - IDXARGBReadWritePtr : public IDXARGBReadPtr - { - public: - virtual void STDMETHODCALLTYPE PackAndMove( - /* [in] */ const DXSAMPLE *pSamples, - /* [in] */ ULONG cSamples) = 0; - - virtual void STDMETHODCALLTYPE PackPremultAndMove( - /* [in] */ const DXPMSAMPLE *pSamples, - /* [in] */ ULONG cSamples) = 0; - - virtual void STDMETHODCALLTYPE PackRect( - /* [in] */ const DXPACKEDRECTDESC *pRectDesc) = 0; - - virtual void STDMETHODCALLTYPE CopyAndMoveBoth( - /* [in] */ DXBASESAMPLE *pScratchBuffer, - /* [in] */ IDXARGBReadPtr *pSrc, - /* [in] */ ULONG cSamples, - /* [in] */ BOOL bIsOpaque) = 0; - - virtual void STDMETHODCALLTYPE CopyRect( - /* [in] */ DXBASESAMPLE *pScratchBuffer, - /* [in] */ const RECT *pDestRect, - /* [in] */ IDXARGBReadPtr *pSrc, - /* [in] */ const POINT *pSrcOrigin, - /* [in] */ BOOL bIsOpaque) = 0; - - virtual void STDMETHODCALLTYPE FillAndMove( - /* [in] */ DXBASESAMPLE *pScratchBuffer, - /* [in] */ DXPMSAMPLE SampVal, - /* [in] */ ULONG cSamples, - /* [in] */ BOOL bDoOver) = 0; - - virtual void STDMETHODCALLTYPE FillRect( - /* [in] */ const RECT *pRect, - /* [in] */ DXPMSAMPLE SampVal, - /* [in] */ BOOL bDoOver) = 0; - - virtual void STDMETHODCALLTYPE OverSample( - /* [in] */ const DXOVERSAMPLEDESC *pOverDesc) = 0; - - virtual void STDMETHODCALLTYPE OverArrayAndMove( - /* [in] */ DXBASESAMPLE *pScratchBuffer, - /* [in] */ const DXPMSAMPLE *pSrc, - /* [in] */ ULONG cSamples) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXARGBReadWritePtrVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXARGBReadWritePtr * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXARGBReadWritePtr * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXARGBReadWritePtr * This); - - HRESULT ( STDMETHODCALLTYPE *GetSurface )( - IDXARGBReadWritePtr * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppSurface); - - DXSAMPLEFORMATENUM ( STDMETHODCALLTYPE *GetNativeType )( - IDXARGBReadWritePtr * This, - /* [out] */ DXNATIVETYPEINFO *pInfo); - - void ( STDMETHODCALLTYPE *Move )( - IDXARGBReadWritePtr * This, - /* [in] */ long cSamples); - - void ( STDMETHODCALLTYPE *MoveToRow )( - IDXARGBReadWritePtr * This, - /* [in] */ ULONG y); - - void ( STDMETHODCALLTYPE *MoveToXY )( - IDXARGBReadWritePtr * This, - /* [in] */ ULONG x, - /* [in] */ ULONG y); - - ULONG ( STDMETHODCALLTYPE *MoveAndGetRunInfo )( - IDXARGBReadWritePtr * This, - /* [in] */ ULONG Row, - /* [out] */ const DXRUNINFO **ppInfo); - - DXSAMPLE *( STDMETHODCALLTYPE *Unpack )( - IDXARGBReadWritePtr * This, - /* [in] */ DXSAMPLE *pSamples, - /* [in] */ ULONG cSamples, - /* [in] */ BOOL bMove); - - DXPMSAMPLE *( STDMETHODCALLTYPE *UnpackPremult )( - IDXARGBReadWritePtr * This, - /* [in] */ DXPMSAMPLE *pSamples, - /* [in] */ ULONG cSamples, - /* [in] */ BOOL bMove); - - void ( STDMETHODCALLTYPE *UnpackRect )( - IDXARGBReadWritePtr * This, - /* [in] */ const DXPACKEDRECTDESC *pRectDesc); - - void ( STDMETHODCALLTYPE *PackAndMove )( - IDXARGBReadWritePtr * This, - /* [in] */ const DXSAMPLE *pSamples, - /* [in] */ ULONG cSamples); - - void ( STDMETHODCALLTYPE *PackPremultAndMove )( - IDXARGBReadWritePtr * This, - /* [in] */ const DXPMSAMPLE *pSamples, - /* [in] */ ULONG cSamples); - - void ( STDMETHODCALLTYPE *PackRect )( - IDXARGBReadWritePtr * This, - /* [in] */ const DXPACKEDRECTDESC *pRectDesc); - - void ( STDMETHODCALLTYPE *CopyAndMoveBoth )( - IDXARGBReadWritePtr * This, - /* [in] */ DXBASESAMPLE *pScratchBuffer, - /* [in] */ IDXARGBReadPtr *pSrc, - /* [in] */ ULONG cSamples, - /* [in] */ BOOL bIsOpaque); - - void ( STDMETHODCALLTYPE *CopyRect )( - IDXARGBReadWritePtr * This, - /* [in] */ DXBASESAMPLE *pScratchBuffer, - /* [in] */ const RECT *pDestRect, - /* [in] */ IDXARGBReadPtr *pSrc, - /* [in] */ const POINT *pSrcOrigin, - /* [in] */ BOOL bIsOpaque); - - void ( STDMETHODCALLTYPE *FillAndMove )( - IDXARGBReadWritePtr * This, - /* [in] */ DXBASESAMPLE *pScratchBuffer, - /* [in] */ DXPMSAMPLE SampVal, - /* [in] */ ULONG cSamples, - /* [in] */ BOOL bDoOver); - - void ( STDMETHODCALLTYPE *FillRect )( - IDXARGBReadWritePtr * This, - /* [in] */ const RECT *pRect, - /* [in] */ DXPMSAMPLE SampVal, - /* [in] */ BOOL bDoOver); - - void ( STDMETHODCALLTYPE *OverSample )( - IDXARGBReadWritePtr * This, - /* [in] */ const DXOVERSAMPLEDESC *pOverDesc); - - void ( STDMETHODCALLTYPE *OverArrayAndMove )( - IDXARGBReadWritePtr * This, - /* [in] */ DXBASESAMPLE *pScratchBuffer, - /* [in] */ const DXPMSAMPLE *pSrc, - /* [in] */ ULONG cSamples); - - END_INTERFACE - } IDXARGBReadWritePtrVtbl; - - interface IDXARGBReadWritePtr - { - CONST_VTBL struct IDXARGBReadWritePtrVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXARGBReadWritePtr_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXARGBReadWritePtr_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXARGBReadWritePtr_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXARGBReadWritePtr_GetSurface(This,riid,ppSurface) \ - (This)->lpVtbl -> GetSurface(This,riid,ppSurface) - -#define IDXARGBReadWritePtr_GetNativeType(This,pInfo) \ - (This)->lpVtbl -> GetNativeType(This,pInfo) - -#define IDXARGBReadWritePtr_Move(This,cSamples) \ - (This)->lpVtbl -> Move(This,cSamples) - -#define IDXARGBReadWritePtr_MoveToRow(This,y) \ - (This)->lpVtbl -> MoveToRow(This,y) - -#define IDXARGBReadWritePtr_MoveToXY(This,x,y) \ - (This)->lpVtbl -> MoveToXY(This,x,y) - -#define IDXARGBReadWritePtr_MoveAndGetRunInfo(This,Row,ppInfo) \ - (This)->lpVtbl -> MoveAndGetRunInfo(This,Row,ppInfo) - -#define IDXARGBReadWritePtr_Unpack(This,pSamples,cSamples,bMove) \ - (This)->lpVtbl -> Unpack(This,pSamples,cSamples,bMove) - -#define IDXARGBReadWritePtr_UnpackPremult(This,pSamples,cSamples,bMove) \ - (This)->lpVtbl -> UnpackPremult(This,pSamples,cSamples,bMove) - -#define IDXARGBReadWritePtr_UnpackRect(This,pRectDesc) \ - (This)->lpVtbl -> UnpackRect(This,pRectDesc) - - -#define IDXARGBReadWritePtr_PackAndMove(This,pSamples,cSamples) \ - (This)->lpVtbl -> PackAndMove(This,pSamples,cSamples) - -#define IDXARGBReadWritePtr_PackPremultAndMove(This,pSamples,cSamples) \ - (This)->lpVtbl -> PackPremultAndMove(This,pSamples,cSamples) - -#define IDXARGBReadWritePtr_PackRect(This,pRectDesc) \ - (This)->lpVtbl -> PackRect(This,pRectDesc) - -#define IDXARGBReadWritePtr_CopyAndMoveBoth(This,pScratchBuffer,pSrc,cSamples,bIsOpaque) \ - (This)->lpVtbl -> CopyAndMoveBoth(This,pScratchBuffer,pSrc,cSamples,bIsOpaque) - -#define IDXARGBReadWritePtr_CopyRect(This,pScratchBuffer,pDestRect,pSrc,pSrcOrigin,bIsOpaque) \ - (This)->lpVtbl -> CopyRect(This,pScratchBuffer,pDestRect,pSrc,pSrcOrigin,bIsOpaque) - -#define IDXARGBReadWritePtr_FillAndMove(This,pScratchBuffer,SampVal,cSamples,bDoOver) \ - (This)->lpVtbl -> FillAndMove(This,pScratchBuffer,SampVal,cSamples,bDoOver) - -#define IDXARGBReadWritePtr_FillRect(This,pRect,SampVal,bDoOver) \ - (This)->lpVtbl -> FillRect(This,pRect,SampVal,bDoOver) - -#define IDXARGBReadWritePtr_OverSample(This,pOverDesc) \ - (This)->lpVtbl -> OverSample(This,pOverDesc) - -#define IDXARGBReadWritePtr_OverArrayAndMove(This,pScratchBuffer,pSrc,cSamples) \ - (This)->lpVtbl -> OverArrayAndMove(This,pScratchBuffer,pSrc,cSamples) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -void STDMETHODCALLTYPE IDXARGBReadWritePtr_PackAndMove_Proxy( - IDXARGBReadWritePtr * This, - /* [in] */ const DXSAMPLE *pSamples, - /* [in] */ ULONG cSamples); - - -void __RPC_STUB IDXARGBReadWritePtr_PackAndMove_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -void STDMETHODCALLTYPE IDXARGBReadWritePtr_PackPremultAndMove_Proxy( - IDXARGBReadWritePtr * This, - /* [in] */ const DXPMSAMPLE *pSamples, - /* [in] */ ULONG cSamples); - - -void __RPC_STUB IDXARGBReadWritePtr_PackPremultAndMove_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -void STDMETHODCALLTYPE IDXARGBReadWritePtr_PackRect_Proxy( - IDXARGBReadWritePtr * This, - /* [in] */ const DXPACKEDRECTDESC *pRectDesc); - - -void __RPC_STUB IDXARGBReadWritePtr_PackRect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -void STDMETHODCALLTYPE IDXARGBReadWritePtr_CopyAndMoveBoth_Proxy( - IDXARGBReadWritePtr * This, - /* [in] */ DXBASESAMPLE *pScratchBuffer, - /* [in] */ IDXARGBReadPtr *pSrc, - /* [in] */ ULONG cSamples, - /* [in] */ BOOL bIsOpaque); - - -void __RPC_STUB IDXARGBReadWritePtr_CopyAndMoveBoth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -void STDMETHODCALLTYPE IDXARGBReadWritePtr_CopyRect_Proxy( - IDXARGBReadWritePtr * This, - /* [in] */ DXBASESAMPLE *pScratchBuffer, - /* [in] */ const RECT *pDestRect, - /* [in] */ IDXARGBReadPtr *pSrc, - /* [in] */ const POINT *pSrcOrigin, - /* [in] */ BOOL bIsOpaque); - - -void __RPC_STUB IDXARGBReadWritePtr_CopyRect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -void STDMETHODCALLTYPE IDXARGBReadWritePtr_FillAndMove_Proxy( - IDXARGBReadWritePtr * This, - /* [in] */ DXBASESAMPLE *pScratchBuffer, - /* [in] */ DXPMSAMPLE SampVal, - /* [in] */ ULONG cSamples, - /* [in] */ BOOL bDoOver); - - -void __RPC_STUB IDXARGBReadWritePtr_FillAndMove_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -void STDMETHODCALLTYPE IDXARGBReadWritePtr_FillRect_Proxy( - IDXARGBReadWritePtr * This, - /* [in] */ const RECT *pRect, - /* [in] */ DXPMSAMPLE SampVal, - /* [in] */ BOOL bDoOver); - - -void __RPC_STUB IDXARGBReadWritePtr_FillRect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -void STDMETHODCALLTYPE IDXARGBReadWritePtr_OverSample_Proxy( - IDXARGBReadWritePtr * This, - /* [in] */ const DXOVERSAMPLEDESC *pOverDesc); - - -void __RPC_STUB IDXARGBReadWritePtr_OverSample_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -void STDMETHODCALLTYPE IDXARGBReadWritePtr_OverArrayAndMove_Proxy( - IDXARGBReadWritePtr * This, - /* [in] */ DXBASESAMPLE *pScratchBuffer, - /* [in] */ const DXPMSAMPLE *pSrc, - /* [in] */ ULONG cSamples); - - -void __RPC_STUB IDXARGBReadWritePtr_OverArrayAndMove_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXARGBReadWritePtr_INTERFACE_DEFINED__ */ - - -#ifndef __IDXDCLock_INTERFACE_DEFINED__ -#define __IDXDCLock_INTERFACE_DEFINED__ - -/* interface IDXDCLock */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXDCLock; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("0F619456-CF39-11d1-905E-00C04FD9189D") - IDXDCLock : public IUnknown - { - public: - virtual HDC STDMETHODCALLTYPE GetDC( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXDCLockVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXDCLock * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXDCLock * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXDCLock * This); - - HDC ( STDMETHODCALLTYPE *GetDC )( - IDXDCLock * This); - - END_INTERFACE - } IDXDCLockVtbl; - - interface IDXDCLock - { - CONST_VTBL struct IDXDCLockVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXDCLock_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXDCLock_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXDCLock_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXDCLock_GetDC(This) \ - (This)->lpVtbl -> GetDC(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HDC STDMETHODCALLTYPE IDXDCLock_GetDC_Proxy( - IDXDCLock * This); - - -void __RPC_STUB IDXDCLock_GetDC_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXDCLock_INTERFACE_DEFINED__ */ - - -#ifndef __IDXTScaleOutput_INTERFACE_DEFINED__ -#define __IDXTScaleOutput_INTERFACE_DEFINED__ - -/* interface IDXTScaleOutput */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXTScaleOutput; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("B2024B50-EE77-11d1-9066-00C04FD9189D") - IDXTScaleOutput : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetOutputSize( - /* [in] */ const SIZE OutSize, - /* [in] */ BOOL bMaintainAspect) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXTScaleOutputVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXTScaleOutput * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXTScaleOutput * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXTScaleOutput * This); - - HRESULT ( STDMETHODCALLTYPE *SetOutputSize )( - IDXTScaleOutput * This, - /* [in] */ const SIZE OutSize, - /* [in] */ BOOL bMaintainAspect); - - END_INTERFACE - } IDXTScaleOutputVtbl; - - interface IDXTScaleOutput - { - CONST_VTBL struct IDXTScaleOutputVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXTScaleOutput_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXTScaleOutput_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXTScaleOutput_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXTScaleOutput_SetOutputSize(This,OutSize,bMaintainAspect) \ - (This)->lpVtbl -> SetOutputSize(This,OutSize,bMaintainAspect) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXTScaleOutput_SetOutputSize_Proxy( - IDXTScaleOutput * This, - /* [in] */ const SIZE OutSize, - /* [in] */ BOOL bMaintainAspect); - - -void __RPC_STUB IDXTScaleOutput_SetOutputSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXTScaleOutput_INTERFACE_DEFINED__ */ - - -#ifndef __IDXGradient_INTERFACE_DEFINED__ -#define __IDXGradient_INTERFACE_DEFINED__ - -/* interface IDXGradient */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXGradient; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("B2024B51-EE77-11d1-9066-00C04FD9189D") - IDXGradient : public IDXTScaleOutput - { - public: - virtual HRESULT STDMETHODCALLTYPE SetGradient( - DXSAMPLE StartColor, - DXSAMPLE EndColor, - BOOL bHorizontal) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetOutputSize( - /* [out] */ SIZE *pOutSize) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXGradientVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXGradient * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXGradient * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXGradient * This); - - HRESULT ( STDMETHODCALLTYPE *SetOutputSize )( - IDXGradient * This, - /* [in] */ const SIZE OutSize, - /* [in] */ BOOL bMaintainAspect); - - HRESULT ( STDMETHODCALLTYPE *SetGradient )( - IDXGradient * This, - DXSAMPLE StartColor, - DXSAMPLE EndColor, - BOOL bHorizontal); - - HRESULT ( STDMETHODCALLTYPE *GetOutputSize )( - IDXGradient * This, - /* [out] */ SIZE *pOutSize); - - END_INTERFACE - } IDXGradientVtbl; - - interface IDXGradient - { - CONST_VTBL struct IDXGradientVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXGradient_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXGradient_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXGradient_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXGradient_SetOutputSize(This,OutSize,bMaintainAspect) \ - (This)->lpVtbl -> SetOutputSize(This,OutSize,bMaintainAspect) - - -#define IDXGradient_SetGradient(This,StartColor,EndColor,bHorizontal) \ - (This)->lpVtbl -> SetGradient(This,StartColor,EndColor,bHorizontal) - -#define IDXGradient_GetOutputSize(This,pOutSize) \ - (This)->lpVtbl -> GetOutputSize(This,pOutSize) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXGradient_SetGradient_Proxy( - IDXGradient * This, - DXSAMPLE StartColor, - DXSAMPLE EndColor, - BOOL bHorizontal); - - -void __RPC_STUB IDXGradient_SetGradient_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXGradient_GetOutputSize_Proxy( - IDXGradient * This, - /* [out] */ SIZE *pOutSize); - - -void __RPC_STUB IDXGradient_GetOutputSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXGradient_INTERFACE_DEFINED__ */ - - -#ifndef __IDXTScale_INTERFACE_DEFINED__ -#define __IDXTScale_INTERFACE_DEFINED__ - -/* interface IDXTScale */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXTScale; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("B39FD742-E139-11d1-9065-00C04FD9189D") - IDXTScale : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetScales( - /* [in] */ float Scales[ 2 ]) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetScales( - /* [out] */ float Scales[ 2 ]) = 0; - - virtual HRESULT STDMETHODCALLTYPE ScaleFitToSize( - /* [out][in] */ DXBNDS *pClipBounds, - /* [in] */ SIZE FitToSize, - /* [in] */ BOOL bMaintainAspect) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXTScaleVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXTScale * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXTScale * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXTScale * This); - - HRESULT ( STDMETHODCALLTYPE *SetScales )( - IDXTScale * This, - /* [in] */ float Scales[ 2 ]); - - HRESULT ( STDMETHODCALLTYPE *GetScales )( - IDXTScale * This, - /* [out] */ float Scales[ 2 ]); - - HRESULT ( STDMETHODCALLTYPE *ScaleFitToSize )( - IDXTScale * This, - /* [out][in] */ DXBNDS *pClipBounds, - /* [in] */ SIZE FitToSize, - /* [in] */ BOOL bMaintainAspect); - - END_INTERFACE - } IDXTScaleVtbl; - - interface IDXTScale - { - CONST_VTBL struct IDXTScaleVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXTScale_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXTScale_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXTScale_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXTScale_SetScales(This,Scales) \ - (This)->lpVtbl -> SetScales(This,Scales) - -#define IDXTScale_GetScales(This,Scales) \ - (This)->lpVtbl -> GetScales(This,Scales) - -#define IDXTScale_ScaleFitToSize(This,pClipBounds,FitToSize,bMaintainAspect) \ - (This)->lpVtbl -> ScaleFitToSize(This,pClipBounds,FitToSize,bMaintainAspect) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXTScale_SetScales_Proxy( - IDXTScale * This, - /* [in] */ float Scales[ 2 ]); - - -void __RPC_STUB IDXTScale_SetScales_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTScale_GetScales_Proxy( - IDXTScale * This, - /* [out] */ float Scales[ 2 ]); - - -void __RPC_STUB IDXTScale_GetScales_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXTScale_ScaleFitToSize_Proxy( - IDXTScale * This, - /* [out][in] */ DXBNDS *pClipBounds, - /* [in] */ SIZE FitToSize, - /* [in] */ BOOL bMaintainAspect); - - -void __RPC_STUB IDXTScale_ScaleFitToSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXTScale_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_dxtrans_0275 */ -/* [local] */ - -typedef -enum DISPIDDXEFFECT - { DISPID_DXECAPABILITIES = 10000, - DISPID_DXEPROGRESS = DISPID_DXECAPABILITIES + 1, - DISPID_DXESTEP = DISPID_DXEPROGRESS + 1, - DISPID_DXEDURATION = DISPID_DXESTEP + 1, - DISPID_DXE_NEXT_ID = DISPID_DXEDURATION + 1 - } DISPIDDXBOUNDEDEFFECT; - -typedef -enum DXEFFECTTYPE - { DXTET_PERIODIC = 1 << 0, - DXTET_MORPH = 1 << 1 - } DXEFFECTTYPE; - - - -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0275_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0275_v0_0_s_ifspec; - -#ifndef __IDXEffect_INTERFACE_DEFINED__ -#define __IDXEffect_INTERFACE_DEFINED__ - -/* interface IDXEffect */ -/* [dual][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXEffect; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("E31FB81B-1335-11d1-8189-0000F87557DB") - IDXEffect : public IDispatch - { - public: - virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_Capabilities( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_Progress( - /* [retval][out] */ float *pVal) = 0; - - virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_Progress( - /* [in] */ float newVal) = 0; - - virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_StepResolution( - /* [retval][out] */ float *pVal) = 0; - - virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_Duration( - /* [retval][out] */ float *pVal) = 0; - - virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_Duration( - /* [in] */ float newVal) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXEffectVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXEffect * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXEffect * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXEffect * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDXEffect * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDXEffect * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDXEffect * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDXEffect * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Capabilities )( - IDXEffect * This, - /* [retval][out] */ long *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Progress )( - IDXEffect * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Progress )( - IDXEffect * This, - /* [in] */ float newVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StepResolution )( - IDXEffect * This, - /* [retval][out] */ float *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Duration )( - IDXEffect * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Duration )( - IDXEffect * This, - /* [in] */ float newVal); - - END_INTERFACE - } IDXEffectVtbl; - - interface IDXEffect - { - CONST_VTBL struct IDXEffectVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXEffect_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXEffect_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXEffect_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXEffect_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IDXEffect_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IDXEffect_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IDXEffect_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IDXEffect_get_Capabilities(This,pVal) \ - (This)->lpVtbl -> get_Capabilities(This,pVal) - -#define IDXEffect_get_Progress(This,pVal) \ - (This)->lpVtbl -> get_Progress(This,pVal) - -#define IDXEffect_put_Progress(This,newVal) \ - (This)->lpVtbl -> put_Progress(This,newVal) - -#define IDXEffect_get_StepResolution(This,pVal) \ - (This)->lpVtbl -> get_StepResolution(This,pVal) - -#define IDXEffect_get_Duration(This,pVal) \ - (This)->lpVtbl -> get_Duration(This,pVal) - -#define IDXEffect_put_Duration(This,newVal) \ - (This)->lpVtbl -> put_Duration(This,newVal) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [id][propget] */ HRESULT STDMETHODCALLTYPE IDXEffect_get_Capabilities_Proxy( - IDXEffect * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IDXEffect_get_Capabilities_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][propget] */ HRESULT STDMETHODCALLTYPE IDXEffect_get_Progress_Proxy( - IDXEffect * This, - /* [retval][out] */ float *pVal); - - -void __RPC_STUB IDXEffect_get_Progress_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][propput] */ HRESULT STDMETHODCALLTYPE IDXEffect_put_Progress_Proxy( - IDXEffect * This, - /* [in] */ float newVal); - - -void __RPC_STUB IDXEffect_put_Progress_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][propget] */ HRESULT STDMETHODCALLTYPE IDXEffect_get_StepResolution_Proxy( - IDXEffect * This, - /* [retval][out] */ float *pVal); - - -void __RPC_STUB IDXEffect_get_StepResolution_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][propget] */ HRESULT STDMETHODCALLTYPE IDXEffect_get_Duration_Proxy( - IDXEffect * This, - /* [retval][out] */ float *pVal); - - -void __RPC_STUB IDXEffect_get_Duration_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][propput] */ HRESULT STDMETHODCALLTYPE IDXEffect_put_Duration_Proxy( - IDXEffect * This, - /* [in] */ float newVal); - - -void __RPC_STUB IDXEffect_put_Duration_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXEffect_INTERFACE_DEFINED__ */ - - -#ifndef __IDXLookupTable_INTERFACE_DEFINED__ -#define __IDXLookupTable_INTERFACE_DEFINED__ - -/* interface IDXLookupTable */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXLookupTable; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("01BAFC7F-9E63-11d1-9053-00C04FD9189D") - IDXLookupTable : public IDXBaseObject - { - public: - virtual HRESULT STDMETHODCALLTYPE GetTables( - /* [out] */ BYTE RedLUT[ 256 ], - /* [out] */ BYTE GreenLUT[ 256 ], - /* [out] */ BYTE BlueLUT[ 256 ], - /* [out] */ BYTE AlphaLUT[ 256 ]) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsChannelIdentity( - /* [out] */ DXBASESAMPLE *pSampleBools) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetIndexValues( - /* [in] */ ULONG Index, - /* [out] */ DXBASESAMPLE *pSample) = 0; - - virtual HRESULT STDMETHODCALLTYPE ApplyTables( - /* [out][in] */ DXSAMPLE *pSamples, - /* [in] */ ULONG cSamples) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXLookupTableVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXLookupTable * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXLookupTable * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXLookupTable * This); - - HRESULT ( STDMETHODCALLTYPE *GetGenerationId )( - IDXLookupTable * This, - /* [out] */ ULONG *pID); - - HRESULT ( STDMETHODCALLTYPE *IncrementGenerationId )( - IDXLookupTable * This, - /* [in] */ BOOL bRefresh); - - HRESULT ( STDMETHODCALLTYPE *GetObjectSize )( - IDXLookupTable * This, - /* [out] */ ULONG *pcbSize); - - HRESULT ( STDMETHODCALLTYPE *GetTables )( - IDXLookupTable * This, - /* [out] */ BYTE RedLUT[ 256 ], - /* [out] */ BYTE GreenLUT[ 256 ], - /* [out] */ BYTE BlueLUT[ 256 ], - /* [out] */ BYTE AlphaLUT[ 256 ]); - - HRESULT ( STDMETHODCALLTYPE *IsChannelIdentity )( - IDXLookupTable * This, - /* [out] */ DXBASESAMPLE *pSampleBools); - - HRESULT ( STDMETHODCALLTYPE *GetIndexValues )( - IDXLookupTable * This, - /* [in] */ ULONG Index, - /* [out] */ DXBASESAMPLE *pSample); - - HRESULT ( STDMETHODCALLTYPE *ApplyTables )( - IDXLookupTable * This, - /* [out][in] */ DXSAMPLE *pSamples, - /* [in] */ ULONG cSamples); - - END_INTERFACE - } IDXLookupTableVtbl; - - interface IDXLookupTable - { - CONST_VTBL struct IDXLookupTableVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXLookupTable_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXLookupTable_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXLookupTable_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXLookupTable_GetGenerationId(This,pID) \ - (This)->lpVtbl -> GetGenerationId(This,pID) - -#define IDXLookupTable_IncrementGenerationId(This,bRefresh) \ - (This)->lpVtbl -> IncrementGenerationId(This,bRefresh) - -#define IDXLookupTable_GetObjectSize(This,pcbSize) \ - (This)->lpVtbl -> GetObjectSize(This,pcbSize) - - -#define IDXLookupTable_GetTables(This,RedLUT,GreenLUT,BlueLUT,AlphaLUT) \ - (This)->lpVtbl -> GetTables(This,RedLUT,GreenLUT,BlueLUT,AlphaLUT) - -#define IDXLookupTable_IsChannelIdentity(This,pSampleBools) \ - (This)->lpVtbl -> IsChannelIdentity(This,pSampleBools) - -#define IDXLookupTable_GetIndexValues(This,Index,pSample) \ - (This)->lpVtbl -> GetIndexValues(This,Index,pSample) - -#define IDXLookupTable_ApplyTables(This,pSamples,cSamples) \ - (This)->lpVtbl -> ApplyTables(This,pSamples,cSamples) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXLookupTable_GetTables_Proxy( - IDXLookupTable * This, - /* [out] */ BYTE RedLUT[ 256 ], - /* [out] */ BYTE GreenLUT[ 256 ], - /* [out] */ BYTE BlueLUT[ 256 ], - /* [out] */ BYTE AlphaLUT[ 256 ]); - - -void __RPC_STUB IDXLookupTable_GetTables_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXLookupTable_IsChannelIdentity_Proxy( - IDXLookupTable * This, - /* [out] */ DXBASESAMPLE *pSampleBools); - - -void __RPC_STUB IDXLookupTable_IsChannelIdentity_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXLookupTable_GetIndexValues_Proxy( - IDXLookupTable * This, - /* [in] */ ULONG Index, - /* [out] */ DXBASESAMPLE *pSample); - - -void __RPC_STUB IDXLookupTable_GetIndexValues_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDXLookupTable_ApplyTables_Proxy( - IDXLookupTable * This, - /* [out][in] */ DXSAMPLE *pSamples, - /* [in] */ ULONG cSamples); - - -void __RPC_STUB IDXLookupTable_ApplyTables_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXLookupTable_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_dxtrans_0277 */ -/* [local] */ - -typedef struct DXRAWSURFACEINFO - { - BYTE *pFirstByte; - long lPitch; - ULONG Width; - ULONG Height; - const GUID *pPixelFormat; - HDC hdc; - DWORD dwColorKey; - DXBASESAMPLE *pPalette; - } DXRAWSURFACEINFO; - - - -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0277_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0277_v0_0_s_ifspec; - -#ifndef __IDXRawSurface_INTERFACE_DEFINED__ -#define __IDXRawSurface_INTERFACE_DEFINED__ - -/* interface IDXRawSurface */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IDXRawSurface; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("09756C8A-D96A-11d1-9062-00C04FD9189D") - IDXRawSurface : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetSurfaceInfo( - DXRAWSURFACEINFO *pSurfaceInfo) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDXRawSurfaceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDXRawSurface * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDXRawSurface * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDXRawSurface * This); - - HRESULT ( STDMETHODCALLTYPE *GetSurfaceInfo )( - IDXRawSurface * This, - DXRAWSURFACEINFO *pSurfaceInfo); - - END_INTERFACE - } IDXRawSurfaceVtbl; - - interface IDXRawSurface - { - CONST_VTBL struct IDXRawSurfaceVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDXRawSurface_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDXRawSurface_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDXRawSurface_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDXRawSurface_GetSurfaceInfo(This,pSurfaceInfo) \ - (This)->lpVtbl -> GetSurfaceInfo(This,pSurfaceInfo) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDXRawSurface_GetSurfaceInfo_Proxy( - IDXRawSurface * This, - DXRAWSURFACEINFO *pSurfaceInfo); - - -void __RPC_STUB IDXRawSurface_GetSurfaceInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDXRawSurface_INTERFACE_DEFINED__ */ - - -#ifndef __IHTMLDXTransform_INTERFACE_DEFINED__ -#define __IHTMLDXTransform_INTERFACE_DEFINED__ - -/* interface IHTMLDXTransform */ -/* [local][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IHTMLDXTransform; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("30E2AB7D-4FDD-4159-B7EA-DC722BF4ADE5") - IHTMLDXTransform : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetHostUrl( - BSTR bstrHostUrl) = 0; - - }; - -#else /* C style interface */ - - typedef struct IHTMLDXTransformVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IHTMLDXTransform * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IHTMLDXTransform * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IHTMLDXTransform * This); - - HRESULT ( STDMETHODCALLTYPE *SetHostUrl )( - IHTMLDXTransform * This, - BSTR bstrHostUrl); - - END_INTERFACE - } IHTMLDXTransformVtbl; - - interface IHTMLDXTransform - { - CONST_VTBL struct IHTMLDXTransformVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IHTMLDXTransform_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IHTMLDXTransform_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IHTMLDXTransform_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IHTMLDXTransform_SetHostUrl(This,bstrHostUrl) \ - (This)->lpVtbl -> SetHostUrl(This,bstrHostUrl) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IHTMLDXTransform_SetHostUrl_Proxy( - IHTMLDXTransform * This, - BSTR bstrHostUrl); - - -void __RPC_STUB IHTMLDXTransform_SetHostUrl_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IHTMLDXTransform_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_dxtrans_0279 */ -/* [local] */ - -typedef -enum DXTFILTER_STATUS - { DXTFILTER_STATUS_Stopped = 0, - DXTFILTER_STATUS_Applied = DXTFILTER_STATUS_Stopped + 1, - DXTFILTER_STATUS_Playing = DXTFILTER_STATUS_Applied + 1, - DXTFILTER_STATUS_MAX = DXTFILTER_STATUS_Playing + 1 - } DXTFILTER_STATUS; - -typedef -enum DXTFILTER_DISPID - { DISPID_DXTFilter_Percent = 1, - DISPID_DXTFilter_Duration = DISPID_DXTFilter_Percent + 1, - DISPID_DXTFilter_Enabled = DISPID_DXTFilter_Duration + 1, - DISPID_DXTFilter_Status = DISPID_DXTFilter_Enabled + 1, - DISPID_DXTFilter_Apply = DISPID_DXTFilter_Status + 1, - DISPID_DXTFilter_Play = DISPID_DXTFilter_Apply + 1, - DISPID_DXTFilter_Stop = DISPID_DXTFilter_Play + 1, - DISPID_DXTFilter_MAX = DISPID_DXTFilter_Stop + 1 - } DXTFILTER_DISPID; - - - -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0279_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_dxtrans_0279_v0_0_s_ifspec; - -#ifndef __ICSSFilterDispatch_INTERFACE_DEFINED__ -#define __ICSSFilterDispatch_INTERFACE_DEFINED__ - -/* interface ICSSFilterDispatch */ -/* [dual][unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_ICSSFilterDispatch; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("9519152B-9484-4A6C-B6A7-4F25E92D6C6B") - ICSSFilterDispatch : public IDispatch - { - public: - virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_Percent( - /* [retval][out] */ float *pVal) = 0; - - virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_Percent( - /* [in] */ float newVal) = 0; - - virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_Duration( - /* [retval][out] */ float *pVal) = 0; - - virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_Duration( - /* [in] */ float newVal) = 0; - - virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_Enabled( - /* [retval][out] */ VARIANT_BOOL *pfVal) = 0; - - virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_Enabled( - /* [in] */ VARIANT_BOOL fVal) = 0; - - virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_Status( - /* [retval][out] */ DXTFILTER_STATUS *peVal) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE Apply( void) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE Play( - /* [optional][in] */ VARIANT varDuration) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE Stop( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct ICSSFilterDispatchVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ICSSFilterDispatch * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ICSSFilterDispatch * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ICSSFilterDispatch * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - ICSSFilterDispatch * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - ICSSFilterDispatch * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - ICSSFilterDispatch * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - ICSSFilterDispatch * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Percent )( - ICSSFilterDispatch * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Percent )( - ICSSFilterDispatch * This, - /* [in] */ float newVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Duration )( - ICSSFilterDispatch * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Duration )( - ICSSFilterDispatch * This, - /* [in] */ float newVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Enabled )( - ICSSFilterDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pfVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Enabled )( - ICSSFilterDispatch * This, - /* [in] */ VARIANT_BOOL fVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( - ICSSFilterDispatch * This, - /* [retval][out] */ DXTFILTER_STATUS *peVal); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *Apply )( - ICSSFilterDispatch * This); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *Play )( - ICSSFilterDispatch * This, - /* [optional][in] */ VARIANT varDuration); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *Stop )( - ICSSFilterDispatch * This); - - END_INTERFACE - } ICSSFilterDispatchVtbl; - - interface ICSSFilterDispatch - { - CONST_VTBL struct ICSSFilterDispatchVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ICSSFilterDispatch_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ICSSFilterDispatch_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ICSSFilterDispatch_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ICSSFilterDispatch_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define ICSSFilterDispatch_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define ICSSFilterDispatch_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define ICSSFilterDispatch_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define ICSSFilterDispatch_get_Percent(This,pVal) \ - (This)->lpVtbl -> get_Percent(This,pVal) - -#define ICSSFilterDispatch_put_Percent(This,newVal) \ - (This)->lpVtbl -> put_Percent(This,newVal) - -#define ICSSFilterDispatch_get_Duration(This,pVal) \ - (This)->lpVtbl -> get_Duration(This,pVal) - -#define ICSSFilterDispatch_put_Duration(This,newVal) \ - (This)->lpVtbl -> put_Duration(This,newVal) - -#define ICSSFilterDispatch_get_Enabled(This,pfVal) \ - (This)->lpVtbl -> get_Enabled(This,pfVal) - -#define ICSSFilterDispatch_put_Enabled(This,fVal) \ - (This)->lpVtbl -> put_Enabled(This,fVal) - -#define ICSSFilterDispatch_get_Status(This,peVal) \ - (This)->lpVtbl -> get_Status(This,peVal) - -#define ICSSFilterDispatch_Apply(This) \ - (This)->lpVtbl -> Apply(This) - -#define ICSSFilterDispatch_Play(This,varDuration) \ - (This)->lpVtbl -> Play(This,varDuration) - -#define ICSSFilterDispatch_Stop(This) \ - (This)->lpVtbl -> Stop(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [id][propget] */ HRESULT STDMETHODCALLTYPE ICSSFilterDispatch_get_Percent_Proxy( - ICSSFilterDispatch * This, - /* [retval][out] */ float *pVal); - - -void __RPC_STUB ICSSFilterDispatch_get_Percent_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][propput] */ HRESULT STDMETHODCALLTYPE ICSSFilterDispatch_put_Percent_Proxy( - ICSSFilterDispatch * This, - /* [in] */ float newVal); - - -void __RPC_STUB ICSSFilterDispatch_put_Percent_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][propget] */ HRESULT STDMETHODCALLTYPE ICSSFilterDispatch_get_Duration_Proxy( - ICSSFilterDispatch * This, - /* [retval][out] */ float *pVal); - - -void __RPC_STUB ICSSFilterDispatch_get_Duration_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][propput] */ HRESULT STDMETHODCALLTYPE ICSSFilterDispatch_put_Duration_Proxy( - ICSSFilterDispatch * This, - /* [in] */ float newVal); - - -void __RPC_STUB ICSSFilterDispatch_put_Duration_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][propget] */ HRESULT STDMETHODCALLTYPE ICSSFilterDispatch_get_Enabled_Proxy( - ICSSFilterDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pfVal); - - -void __RPC_STUB ICSSFilterDispatch_get_Enabled_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][propput] */ HRESULT STDMETHODCALLTYPE ICSSFilterDispatch_put_Enabled_Proxy( - ICSSFilterDispatch * This, - /* [in] */ VARIANT_BOOL fVal); - - -void __RPC_STUB ICSSFilterDispatch_put_Enabled_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][propget] */ HRESULT STDMETHODCALLTYPE ICSSFilterDispatch_get_Status_Proxy( - ICSSFilterDispatch * This, - /* [retval][out] */ DXTFILTER_STATUS *peVal); - - -void __RPC_STUB ICSSFilterDispatch_get_Status_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id] */ HRESULT STDMETHODCALLTYPE ICSSFilterDispatch_Apply_Proxy( - ICSSFilterDispatch * This); - - -void __RPC_STUB ICSSFilterDispatch_Apply_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id] */ HRESULT STDMETHODCALLTYPE ICSSFilterDispatch_Play_Proxy( - ICSSFilterDispatch * This, - /* [optional][in] */ VARIANT varDuration); - - -void __RPC_STUB ICSSFilterDispatch_Play_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id] */ HRESULT STDMETHODCALLTYPE ICSSFilterDispatch_Stop_Proxy( - ICSSFilterDispatch * This); - - -void __RPC_STUB ICSSFilterDispatch_Stop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ICSSFilterDispatch_INTERFACE_DEFINED__ */ - - - -#ifndef __DXTRANSLib_LIBRARY_DEFINED__ -#define __DXTRANSLib_LIBRARY_DEFINED__ - -/* library DXTRANSLib */ -/* [helpstring][version][uuid] */ - - -EXTERN_C const IID LIBID_DXTRANSLib; - -EXTERN_C const CLSID CLSID_DXTransformFactory; - -#ifdef __cplusplus - -class DECLSPEC_UUID("D1FE6762-FC48-11D0-883A-3C8B00C10000") -DXTransformFactory; -#endif - -EXTERN_C const CLSID CLSID_DXTaskManager; - -#ifdef __cplusplus - -class DECLSPEC_UUID("4CB26C03-FF93-11d0-817E-0000F87557DB") -DXTaskManager; -#endif - -EXTERN_C const CLSID CLSID_DXTScale; - -#ifdef __cplusplus - -class DECLSPEC_UUID("555278E2-05DB-11D1-883A-3C8B00C10000") -DXTScale; -#endif - -EXTERN_C const CLSID CLSID_DXSurface; - -#ifdef __cplusplus - -class DECLSPEC_UUID("0E890F83-5F79-11D1-9043-00C04FD9189D") -DXSurface; -#endif - -EXTERN_C const CLSID CLSID_DXSurfaceModifier; - -#ifdef __cplusplus - -class DECLSPEC_UUID("3E669F1D-9C23-11d1-9053-00C04FD9189D") -DXSurfaceModifier; -#endif - -EXTERN_C const CLSID CLSID_DXGradient; - -#ifdef __cplusplus - -class DECLSPEC_UUID("C6365470-F667-11d1-9067-00C04FD9189D") -DXGradient; -#endif - -EXTERN_C const CLSID CLSID_DXTFilter; - -#ifdef __cplusplus - -class DECLSPEC_UUID("385A91BC-1E8A-4e4a-A7A6-F4FC1E6CA1BD") -DXTFilter; -#endif -#endif /* __DXTRANSLib_LIBRARY_DEFINED__ */ - -/* Additional Prototypes for ALL interfaces */ - -unsigned long __RPC_USER VARIANT_UserSize( unsigned long *, unsigned long , VARIANT * ); -unsigned char * __RPC_USER VARIANT_UserMarshal( unsigned long *, unsigned char *, VARIANT * ); -unsigned char * __RPC_USER VARIANT_UserUnmarshal(unsigned long *, unsigned char *, VARIANT * ); -void __RPC_USER VARIANT_UserFree( unsigned long *, VARIANT * ); - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/dxva.h b/import/DirectX8/include/dxva.h deleted file mode 100644 index 17f0d826b..000000000 --- a/import/DirectX8/include/dxva.h +++ /dev/null @@ -1,628 +0,0 @@ -//------------------------------------------------------------------------------ -// File: DXVA.h -// -// Desc: DirectX Video Acceleration header file. -// -// Copyright (c) 1999-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __DIRECTX_VA__ -#define __DIRECTX_VA__ - -#ifdef __cplusplus -extern "C" { -#endif - -DEFINE_GUID(DXVA_ModeNone, 0x1b81be00, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5); -DEFINE_GUID(DXVA_ModeH261_A, 0x1b81be01, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5); -DEFINE_GUID(DXVA_ModeH261_B, 0x1b81be02, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5); -DEFINE_GUID(DXVA_ModeH263_A, 0x1b81be03, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5); -DEFINE_GUID(DXVA_ModeH263_B, 0x1b81be04, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5); -DEFINE_GUID(DXVA_ModeH263_C, 0x1b81be05, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5); -DEFINE_GUID(DXVA_ModeH263_D, 0x1b81be06, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5); -DEFINE_GUID(DXVA_ModeH263_E, 0x1b81be07, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5); -DEFINE_GUID(DXVA_ModeH263_F, 0x1b81be08, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5); -DEFINE_GUID(DXVA_ModeMPEG1_A, 0x1b81be09, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5); -DEFINE_GUID(DXVA_ModeMPEG2_A, 0x1b81be0A, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5); -DEFINE_GUID(DXVA_ModeMPEG2_B, 0x1b81be0B, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5); -DEFINE_GUID(DXVA_ModeMPEG2_C, 0x1b81be0C, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5); -DEFINE_GUID(DXVA_ModeMPEG2_D, 0x1b81be0D, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5); - -DEFINE_GUID(DXVA_NoEncrypt, 0x1b81beD0, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5); - -#define DXVA_RESTRICTED_MODE_UNRESTRICTED 0xFFFF -#define DXVA_RESTRICTED_MODE_H261_A 1 -#define DXVA_RESTRICTED_MODE_H261_B 2 -#define DXVA_RESTRICTED_MODE_H263_A 3 -#define DXVA_RESTRICTED_MODE_H263_B 4 -#define DXVA_RESTRICTED_MODE_H263_C 5 -#define DXVA_RESTRICTED_MODE_H263_D 6 -#define DXVA_RESTRICTED_MODE_H263_E 7 -#define DXVA_RESTRICTED_MODE_H263_F 8 -#define DXVA_RESTRICTED_MODE_MPEG1_A 9 -#define DXVA_RESTRICTED_MODE_MPEG2_A 0xA -#define DXVA_RESTRICTED_MODE_MPEG2_B 0xB -#define DXVA_RESTRICTED_MODE_MPEG2_C 0xC -#define DXVA_RESTRICTED_MODE_MPEG2_D 0xD - -#define DXVA_COMPBUFFER_TYPE_THAT_IS_NOT_USED 0 -#define DXVA_PICTURE_DECODE_BUFFER 1 -#define DXVA_MACROBLOCK_CONTROL_BUFFER 2 -#define DXVA_RESIDUAL_DIFFERENCE_BUFFER 3 -#define DXVA_DEBLOCKING_CONTROL_BUFFER 4 -#define DXVA_INVERSE_QUANTIZATION_MATRIX_BUFFER 5 -#define DXVA_SLICE_CONTROL_BUFFER 6 -#define DXVA_BITSTREAM_DATA_BUFFER 7 -#define DXVA_AYUV_BUFFER 8 -#define DXVA_IA44_SURFACE_BUFFER 9 -#define DXVA_DPXD_SURFACE_BUFFER 10 -#define DXVA_HIGHLIGHT_BUFFER 11 -#define DXVA_DCCMD_SURFACE_BUFFER 12 -#define DXVA_ALPHA_BLEND_COMBINATION_BUFFER 13 -#define DXVA_PICTURE_RESAMPLE_BUFFER 14 -#define DXVA_READ_BACK_BUFFER 15 - -#define DXVA_NUM_TYPES_COMP_BUFFERS 16 - -/* values for bDXVA_Func */ -#define DXVA_PICTURE_DECODING_FUNCTION 1 -#define DXVA_ALPHA_BLEND_DATA_LOAD_FUNCTION 2 -#define DXVA_ALPHA_BLEND_COMBINATION_FUNCTION 3 -#define DXVA_PICTURE_RESAMPLE_FUNCTION 4 - -/* values returned from Execute command in absence of read-back */ -#define DXVA_EXECUTE_RETURN_OK 0 -#define DXVA_EXECUTE_RETURN_DATA_ERROR_MINOR 1 -#define DXVA_EXECUTE_RETURN_DATA_ERROR_SIGNIF 2 -#define DXVA_EXECUTE_RETURN_DATA_ERROR_SEVERE 3 -#define DXVA_EXECUTE_RETURN_OTHER_ERROR_SEVERE 4 - - -#pragma pack(push, BeforeDXVApacking, 1) - - -typedef struct _DXVA_ConnectMode { - GUID guidMode; - WORD wRestrictedMode; -} DXVA_ConnectMode, *LPDXVA_ConnectMode; - - -typedef DWORD DXVA_ConfigQueryOrReplyFunc, *LPDXVA_ConfigQueryOrReplyFunc; - -#define DXVA_QUERYORREPLYFUNCFLAG_DECODER_PROBE_QUERY 0xFFFFF1 -#define DXVA_QUERYORREPLYFUNCFLAG_DECODER_LOCK_QUERY 0xFFFFF5 -#define DXVA_QUERYORREPLYFUNCFLAG_ACCEL_PROBE_OK_COPY 0xFFFFF8 -#define DXVA_QUERYORREPLYFUNCFLAG_ACCEL_PROBE_OK_PLUS 0xFFFFF9 -#define DXVA_QUERYORREPLYFUNCFLAG_ACCEL_LOCK_OK_COPY 0xFFFFFC -#define DXVA_QUERYORREPLYFUNCFLAG_ACCEL_PROBE_FALSE_PLUS 0xFFFFFB -#define DXVA_QUERYORREPLYFUNCFLAG_ACCEL_LOCK_FALSE_PLUS 0xFFFFFF - -#define readDXVA_QueryOrReplyFuncFlag(ptr) ((*(ptr)) >> 8) - -#define readDXVA_QueryOrReplyFuncFlag_ACCEL(ptr) (((*(ptr)) >> 11) & 1) -#define readDXVA_QueryOrReplyFuncFlag_LOCK(ptr) (((*(ptr)) >> 10) & 1) -#define readDXVA_QueryOrReplyFuncFlag_BAD(ptr) (((*(ptr)) >> 9) & 1) -#define readDXVA_QueryOrReplyFuncFlag_PLUS(ptr) (((*(ptr)) >> 8) & 1) - -#define readDXVA_QueryOrReplyFuncFunc(ptr) ((*(ptr)) & 0xFF) - -#define writeDXVA_QueryOrReplyFunc(ptr, flg, fnc) ((*(ptr)) = ((flg) << 8) | (fnc)) - -#define setDXVA_QueryOrReplyFuncFlag(ptr, flg) ((*(ptr)) |= ((flg) << 8)) -#define setDXVA_QueryOrReplyFuncFunc(ptr, fnc) ((*(ptr)) |= (fnc)); - -typedef DWORD DXVA_EncryptProtocolFunc, *LPDXVA_EncryptProtocolFunc; - -#define DXVA_ENCRYPTPROTOCOLFUNCFLAG_HOST 0xFFFF00 -#define DXVA_ENCRYPTPROTOCOLFUNCFLAG_ACCEL 0xFFFF08 - -#define readDXVA_EncryptProtocolFuncFlag(ptr) ((*(ptr)) >> 8) -#define readDXVA_EncryptProtocolFuncFlag_ACCEL(ptr) (((*(ptr)) >> 11) & 1) - -#define readDXVA_EncryptProtocolFuncFunc(ptr) ((*(ptr)) & 0xFF) - -#define writeDXVA_EncryptProtocolFunc(ptr, flg, fnc) ((*(ptr)) = ((flg) << 8) | (fnc)) - -#define setDXVA_EncryptProtocolFuncFlag(ptr, flg) ((*(ptr)) |= ((flg) << 8)) -#define setDXVA_EncryptProtocolFuncFunc(ptr, fnc) ((*(ptr)) |= (fnc)); - -typedef struct _DXVA_EncryptProtocolHeader { - DXVA_EncryptProtocolFunc dwFunction; - DWORD ReservedBits[3]; - GUID guidEncryptProtocol; -} DXVA_EncryptProtocolHeader, *LPDXVA_EncryptProtocolHeader; - -typedef struct _DXVA_ConfigPictureDecode { - - // Operation Indicated - DXVA_ConfigQueryOrReplyFunc dwFunction; - - // Alignment - DWORD dwReservedBits[3]; - - // Encryption GUIDs - GUID guidConfigBitstreamEncryption; - GUID guidConfigMBcontrolEncryption; - GUID guidConfigResidDiffEncryption; - - // Bitstream Processing Indicator - BYTE bConfigBitstreamRaw; - - // Macroblock Control Config - BYTE bConfigMBcontrolRasterOrder; - - // Host Resid Diff Config - BYTE bConfigResidDiffHost; - BYTE bConfigSpatialResid8; - BYTE bConfigResid8Subtraction; - BYTE bConfigSpatialHost8or9Clipping; - BYTE bConfigSpatialResidInterleaved; - BYTE bConfigIntraResidUnsigned; - - // Accelerator Resid Diff Config - BYTE bConfigResidDiffAccelerator; - BYTE bConfigHostInverseScan; - BYTE bConfigSpecificIDCT; - BYTE bConfig4GroupedCoefs; -} DXVA_ConfigPictureDecode, *LPDXVA_ConfigPictureDecode; - - -/* Picture Decoding Parameters */ - -typedef struct _DXVA_PictureParameters { - - WORD wDecodedPictureIndex; - WORD wDeblockedPictureIndex; - - WORD wForwardRefPictureIndex; - WORD wBackwardRefPictureIndex; - - WORD wPicWidthInMBminus1; - WORD wPicHeightInMBminus1; - - BYTE bMacroblockWidthMinus1; - BYTE bMacroblockHeightMinus1; - - BYTE bBlockWidthMinus1; - BYTE bBlockHeightMinus1; - - BYTE bBPPminus1; - - BYTE bPicStructure; - BYTE bSecondField; - BYTE bPicIntra; - BYTE bPicBackwardPrediction; - - BYTE bBidirectionalAveragingMode; - BYTE bMVprecisionAndChromaRelation; - BYTE bChromaFormat; - - BYTE bPicScanFixed; - BYTE bPicScanMethod; - BYTE bPicReadbackRequests; - - BYTE bRcontrol; - BYTE bPicSpatialResid8; - BYTE bPicOverflowBlocks; - BYTE bPicExtrapolation; - - BYTE bPicDeblocked; - BYTE bPicDeblockConfined; - BYTE bPic4MVallowed; - BYTE bPicOBMC; - BYTE bPicBinPB; - BYTE bMV_RPS; - - BYTE bReservedBits; - - WORD wBitstreamFcodes; - WORD wBitstreamPCEelements; - BYTE bBitstreamConcealmentNeed; - BYTE bBitstreamConcealmentMethod; - -} DXVA_PictureParameters, *LPDXVA_PictureParameters; - - -/* Picture Resampling */ - -typedef struct _DXVA_PicResample { - - WORD wPicResampleSourcePicIndex; - WORD wPicResampleDestPicIndex; - - WORD wPicResampleRcontrol; - BYTE bPicResampleExtrapWidth; - BYTE bPicResampleExtrapHeight; - - DWORD dwPicResampleSourceWidth; - DWORD dwPicResampleSourceHeight; - - DWORD dwPicResampleDestWidth; - DWORD dwPicResampleDestHeight; - - DWORD dwPicResampleFullDestWidth; - DWORD dwPicResampleFullDestHeight; - -} DXVA_PicResample, *LPDXVA_PicResample; - - -#define DXVA_CHROMA_FORMAT_420 1 -#define DXVA_CHROMA_FORMAT_422 2 -#define DXVA_CHROMA_FORMAT_444 3 - -#define DXVA_PICTURE_STRUCTURE_TOP_FIELD 1 -#define DXVA_PICTURE_STRUCTURE_BOTTOM_FIELD 2 -#define DXVA_PICTURE_STRUCTURE_FRAME 3 - -#define DXVA_BIDIRECTIONAL_AVERAGING_MPEG2_ROUND 0 -#define DXVA_BIDIRECTIONAL_AVERAGING_H263_TRUNC 1 - -#define DXVA_MV_PRECISION_AND_CHROMA_RELATION_MPEG2 0 -#define DXVA_MV_PRECISION_AND_CHROMA_RELATION_H263 1 -#define DXVA_MV_PRECISION_AND_CHROMA_RELATION_H261 2 - -#define DXVA_SCAN_METHOD_ZIG_ZAG 0 -#define DXVA_SCAN_METHOD_ALTERNATE_VERTICAL 1 -#define DXVA_SCAN_METHOD_ALTERNATE_HORIZONTAL 2 -#define DXVA_SCAN_METHOD_ARBITRARY 3 - -#define DXVA_BITSTREAM_CONCEALMENT_NEED_UNLIKELY 0 -#define DXVA_BITSTREAM_CONCEALMENT_NEED_MILD 1 -#define DXVA_BITSTREAM_CONCEALMENT_NEED_LIKELY 2 -#define DXVA_BITSTREAM_CONCEALMENT_NEED_SEVERE 3 - -#define DXVA_BITSTREAM_CONCEALMENT_METHOD_UNSPECIFIED 0 -#define DXVA_BITSTREAM_CONCEALMENT_METHOD_INTRA 1 -#define DXVA_BITSTREAM_CONCEALMENT_METHOD_FORWARD 2 -#define DXVA_BITSTREAM_CONCEALMENT_METHOD_BACKWARD 3 - - -/* Buffer Description Data */ - -typedef struct _DXVA_BufferDescription { - DWORD dwTypeIndex; - DWORD dwBufferIndex; - DWORD dwDataOffset; - DWORD dwDataSize; - DWORD dwFirstMBaddress; - DWORD dwNumMBsInBuffer; - DWORD dwWidth; - DWORD dwHeight; - DWORD dwStride; - DWORD dwReservedBits; -} DXVA_BufferDescription, *LPDXVA_BufferDescription; - - -/* Off-Host IDCT Coefficient Data Structures */ - -typedef struct _DXVA_TCoef4Group { - BYTE TCoefIDX[4]; - SHORT TCoefValue[4]; -} DXVA_TCoef4Group, *LPDXVA_TCoef4Group; - -typedef struct _DXVA_TCoefSingle { - WORD wIndexWithEOB; - SHORT TCoefValue; -} DXVA_TCoefSingle, *LPDXVA_TCoefSingle; - -/* Macros for Reading EOB and Index Values */ - -#define readDXVA_TCoefSingleIDX(ptr) ((ptr)->wIndexWithEOB >> 1) -#define readDXVA_TCoefSingleEOB(ptr) ((ptr)->wIndexWithEOB & 1) - -/* Macro for Writing EOB and Index Values */ - -#define writeDXVA_TCoefSingleIndexWithEOB(ptr, idx, eob) ((ptr)->wIndexWithEOB = ((idx) << 1) | (eob)) -#define setDXVA_TCoefSingleIDX(ptr, idx) ((ptr)->wIndexWithEOB |= ((idx) << 1)) -#define setDXVA_TCoefSingleEOB(ptr) ((ptr)->wIndexWithEOB |= 1) - -/* Spatial-Domain Residual Difference Blocks */ - -#define DXVA_USUAL_BLOCK_WIDTH 8 -#define DXVA_USUAL_BLOCK_HEIGHT 8 -#define DXVA_USUAL_BLOCK_SIZE (DXVA_USUAL_BLOCK_WIDTH * DXVA_USUAL_BLOCK_HEIGHT) - -typedef SHORT DXVA_Sample16[DXVA_USUAL_BLOCK_SIZE]; -typedef signed char DXVA_Sample8 [DXVA_USUAL_BLOCK_SIZE]; - -/* Deblocking Filter Control Structure */ - -typedef BYTE DXVA_DeblockingEdgeControl; - -typedef DXVA_DeblockingEdgeControl * LPDXVA_DeblockingEdgeControl; - -/* Macros for Reading STRENGTH and FilterOn */ - -#define readDXVA_EdgeFilterStrength(ptr) ((*(ptr)) >> 1) -#define readDXVA_EdgeFilterOn(ptr) ((*(ptr)) & 1) - -/* Macro for Writing STRENGTH and FilterOn */ - -#define writeDXVA_DeblockingEdgeControl(ptr, str, fon) ((*(ptr)) = ((str) << 1) | (fon)) -#define setDXVA_EdgeFilterStrength(ptr, str) ((*(ptr)) |= ((str) << 1)) -#define setDXVA_EdgeFilterOn(ptr) ((*(ptr)) |= 1) - - -/* Macroblock Control Command Data Structures */ - -typedef struct _DXVA_MVvalue { - SHORT horz, vert; -} DXVA_MVvalue, *LPDXVA_MVvalue; - - -/* Inverse Quantization Matrices */ - -typedef struct _DXVA_QmatrixData { - BYTE bNewQmatrix[4]; /* intra Y, inter Y, intra chroma, inter chroma */ - WORD Qmatrix[4][DXVA_USUAL_BLOCK_WIDTH * DXVA_USUAL_BLOCK_HEIGHT]; -} DXVA_QmatrixData, *LPDXVA_QmatrixData; - - -/* Slice Control Buffer Data */ - -typedef struct _DXVA_SliceInfo { - WORD wHorizontalPosition; - WORD wVerticalPosition; - DWORD dwSliceBitsInBuffer; - DWORD dwSliceDataLocation; - BYTE bStartCodeBitOffset; - BYTE bReservedBits; - WORD wMBbitOffset; - WORD wNumberMBsInSlice; - WORD wQuantizerScaleCode; - WORD wBadSliceChopping; -} DXVA_SliceInfo, *LPDXVA_SliceInfo; - - -#define DXVA_NumMV_OBMC_off_BinPBwith4MV_off 4 -#define DXVA_NumMV_OBMC_off_BinPBwith4MV_on (4+1) -#define DXVA_NumMV_OBMC_on__BinPB_off (10) -#define DXVA_NumMV_OBMC_on__BinPB_on (11) /* not current standards */ - -#define DXVA_NumBlocksPerMB_420 (4+2+0) -#define DXVA_NumBlocksPerMB_422 (4+2+2) -#define DXVA_NumBlocksPerMB_444 (4+4+4) - -/* Basic form for I pictures */ -/* Host Residual Differences */ -typedef struct _DXVA_MBctrl_I_HostResidDiff_1 { - WORD wMBaddress; - WORD wMBtype; - DWORD dwMB_SNL; - WORD wPatternCode; - WORD wPC_Overflow; /* zero if not overflow format */ - DWORD dwReservedBits2; -} DXVA_MBctrl_I_HostResidDiff_1; - -/* Basic form for I pictures */ -/* Off-Host IDCT, 4:2:0 sampling */ -typedef struct _DXVA_MBctrl_I_OffHostIDCT_1 { - WORD wMBaddress; - WORD wMBtype; - DWORD dwMB_SNL; - WORD wPatternCode; - BYTE bNumCoef[DXVA_NumBlocksPerMB_420]; -} DXVA_MBctrl_I_OffHostIDCT_1; - -/* Basic form for P and B pictures */ -/* Should also be used for concealment MVs in MPEG-2 I pictures */ -/* Without OBMC, without BinPB and 4MV together, without MV RPS */ -/* Host Residual Differences */ -typedef struct _DXVA_MBctrl_P_HostResidDiff_1 { - WORD wMBaddress; - WORD wMBtype; - DWORD dwMB_SNL; - WORD wPatternCode; - WORD wPC_Overflow; /* zero if not overflow format */ - DWORD dwReservedBits2; - DXVA_MVvalue MVector[DXVA_NumMV_OBMC_off_BinPBwith4MV_off]; -} DXVA_MBctrl_P_HostResidDiff_1; - -/* Basic form for P and B pictures */ -/* Without OBMC, without BinPB and 4MV together, without MV RPS */ -/* Off-Host IDCT, 4:2:0 sampling */ -typedef struct _DXVA_MBctrl_P_OffHostIDCT_1 { - WORD wMBaddress; - WORD wMBtype; - DWORD dwMB_SNL; - WORD wPatternCode; - BYTE bNumCoef[DXVA_NumBlocksPerMB_420]; - DXVA_MVvalue MVector[DXVA_NumMV_OBMC_off_BinPBwith4MV_off]; -} DXVA_MBctrl_P_OffHostIDCT_1; - -/* How to load alpha blending graphic data */ -typedef struct _DXVA_ConfigAlphaLoad { - - // Operation Indicated - DXVA_ConfigQueryOrReplyFunc dwFunction; - - // Alignment - DWORD dwReservedBits[3]; - - BYTE bConfigDataType; -} DXVA_ConfigAlphaLoad, *LPDXVA_ConfigAlphaLoad; - -#define DXVA_CONFIG_DATA_TYPE_IA44 0 -#define DXVA_CONFIG_DATA_TYPE_AI44 1 -#define DXVA_CONFIG_DATA_TYPE_DPXD 2 -#define DXVA_CONFIG_DATA_TYPE_AYUV 3 - - -/* How to combine alpha blending graphic data */ -typedef struct _DXVA_ConfigAlphaCombine { - - // Operation Indicated - DXVA_ConfigQueryOrReplyFunc dwFunction; - - // Alignment - DWORD dwReservedBits[3]; - - BYTE bConfigBlendType; - BYTE bConfigPictureResizing; - BYTE bConfigOnlyUsePicDestRectArea; - BYTE bConfigGraphicResizing; - BYTE bConfigWholePlaneAlpha; - -} DXVA_ConfigAlphaCombine, *LPDXVA_ConfigAlphaCombine; - -#define DXVA_CONFIG_BLEND_TYPE_FRONT_BUFFER 0 -#define DXVA_CONFIG_BLEND_TYPE_BACK_HARDWARE 1 - - -/* AYUV sample for 16-entry YUV palette or graphic surface */ - -typedef struct _DXVA_AYUVsample2 { - BYTE bCrValue; - BYTE bCbValue; - BYTE bY_Value; - BYTE bSampleAlpha8; -} DXVA_AYUVsample2, *LPDXVA_AYUVsample2; - -/* Macros for IA44 alpha blending surface samples */ - -typedef BYTE DXVA_IA44sample, *LPDXVA_IA44sample; - -#define readDXVA_IA44index(ptr) (((*(ptr)) & 0xF0) >> 4) -#define readDXVA_IA44alpha(ptr) ((*(ptr)) & 0x0F) - -#define writeDXVA_IA44(ptr, idx, alpha) ((*(ptr)) = (((idx) << 4) | (alpha))) - -#define setDXVA_IA44index(ptr, idx) ((*(ptr)) |= ((idx) << 4)) -#define setDXVA_IA44alpha(ptr, alpha) ((*(ptr)) |= (alpha)) - -/* Macros for AI44 alpha blending surface samples */ - -typedef BYTE DXVA_AI44sample, *LPDXVA_AI44sample; - -#define readDXVA_AI44index(ptr) ((*(ptr)) & 0x0F) -#define readDXVA_AI44alpha(ptr) (((*(ptr)) & 0xF0) >> 4) - -#define writeDXVA_AI44(ptr, idx, alpha) ((*(ptr)) = (((alpha) << 4) | (idx))) - -#define setDXVA_AI44index(ptr, idx) ((*(ptr)) |= (idx)) -#define setDXVA_AI44alpha(ptr, alpha) ((*(ptr)) |= ((alpha) << 4)) - - -/* Highlight data structure */ - -typedef struct _DXVA_Highlight { - WORD wHighlightActive; - WORD wHighlightIndices; - WORD wHighlightAlphas; - RECT HighlightRect; -} DXVA_Highlight, *LPDXVA_Highlight; - -typedef BYTE DXVA_DPXD, *LPDXVA_DPXD; -typedef WORD DXVA_DCCMD, *LPDXVA_DCCMD; - -/* Alpha blend combination */ - -typedef struct _DXVA_BlendCombination { - WORD wPictureSourceIndex; - WORD wBlendedDestinationIndex; - RECT PictureSourceRect16thPel; - RECT PictureDestinationRect; - RECT GraphicSourceRect; - RECT GraphicDestinationRect; - WORD wBlendDelay; - BYTE bBlendOn; - BYTE bWholePlaneAlpha; - DXVA_AYUVsample2 OutsideYUVcolor; -} DXVA_BlendCombination, *LPDXVA_BlendCombination; - - -#pragma pack(push, 16) - - -typedef DXVA_MBctrl_I_HostResidDiff_1 * - LPDXVA_MBctrl_I_HostResidDiff_1; - -typedef DXVA_MBctrl_I_OffHostIDCT_1 * - LPDXVA_MBctrl_I_OffHostIDCT_1; - -typedef DXVA_MBctrl_P_HostResidDiff_1 * - LPDXVA_MBctrl_P_HostResidDiff_1; - -typedef DXVA_MBctrl_P_OffHostIDCT_1 * - LPDXVA_MBctrl_P_OffHostIDCT_1; - - -#pragma pack(pop) - -/* - * Other forms of pictures are constructed in the obvious way - * from the above by adjusting the number of residual difference - * blocks, the number of motion vectors per macroblock, etc. - */ - -#define readDXVA_MBskipsFollowing(ptr) (((ptr)->dwMB_SNL & 0xFF000000) >> 24) -#define readDXVA_MBdataLocation(ptr) (((ptr)->dwMB_SNL & 0x00FFFFFF)) - -#define writeDXVA_MB_SNL(ptr, skips, dloc) ((ptr)->dwMB_SNL = (((skips) << 24) | (dloc))) -#define setDXVA_MBskipsFollowing(ptr, skips) ((ptr)->dwMB_SNL |= ((skips) << 24)) -#define setDXVA_MBdataLocation(ptr, dloc) ((ptr)->dwMB_SNL |= (dloc)) - -#define readDXVA_MvertFieldSel_3(ptr) (((ptr)->wMBtype & 0x8000) >> 15) -#define readDXVA_MvertFieldSel_2(ptr) (((ptr)->wMBtype & 0x4000) >> 14) -#define readDXVA_MvertFieldSel_1(ptr) (((ptr)->wMBtype & 0x2000) >> 13) -#define readDXVA_MvertFieldSel_0(ptr) (((ptr)->wMBtype & 0x1000) >> 12) -#define readDXVA_ReservedBits(ptr) (((ptr)->wMBtype & 0x0800) >> 11) -#define readDXVA_HostResidDiff(ptr) (((ptr)->wMBtype & 0x0400) >> 10) -#define readDXVA_MotionType(ptr) (((ptr)->wMBtype & 0x0300) >> 8) -#define readDXVA_MBscanMethod(ptr) (((ptr)->wMBtype & 0x00C0) >> 6) -#define readDXVA_FieldResidual(ptr) (((ptr)->wMBtype & 0x0020) >> 5) -#define readDXVA_H261LoopFilter(ptr) (((ptr)->wMBtype & 0x0010) >> 4) -#define readDXVA_Motion4MV(ptr) (((ptr)->wMBtype & 0x0008) >> 3) -#define readDXVA_MotionBackward(ptr) (((ptr)->wMBtype & 0x0004) >> 2) -#define readDXVA_MotionForward(ptr) (((ptr)->wMBtype & 0x0002) >> 1) -#define readDXVA_IntraMacroblock(ptr) (((ptr)->wMBtype & 0x0001)) - -#define setDXVA_MvertFieldSel_3(ptr) ((ptr)->wMBtype |= 0x8000) -#define setDXVA_MvertFieldSel_2(ptr) ((ptr)->wMBtype |= 0x4000) -#define setDXVA_MvertFieldSel_1(ptr) ((ptr)->wMBtype |= 0x2000) -#define setDXVA_MvertFieldSel_0(ptr) ((ptr)->wMBtype |= 0x1000) -#define setDXVA_ReservedBits(ptr) ((ptr)->wMBtype |= 0x0800) -#define setDXVA_HostResidDiff(ptr) ((ptr)->wMBtype |= 0x0400) -#define setDXVA_MotionType(ptr, value) ((ptr)->wMBtype |= ((value) << 8)) -#define setDXVA_MBscanMethod(ptr, value) ((ptr)->wMBtype |= ((value) << 6)) -#define setDXVA_FieldResidual(ptr) ((ptr)->wMBtype |= 0x0020) -#define setDXVA_H261LoopFilter(ptr) ((ptr)->wMBtype |= 0x0010) -#define setDXVA_Motion4MV(ptr) ((ptr)->wMBtype |= 0x0008) -#define setDXVA_MotionBackward(ptr) ((ptr)->wMBtype |= 0x0004) -#define setDXVA_MotionForward(ptr) ((ptr)->wMBtype |= 0x0002) -#define setDXVA_IntraMacroblock(ptr) ((ptr)->wMBtype |= 0x0001) - -#define readDXVA_Y___0coded(ptr) (((ptr)->wPatternCode & 0x0800) >> 11) -#define readDXVA_Y___1coded(ptr) (((ptr)->wPatternCode & 0x0400) >> 10) -#define readDXVA_Y___2coded(ptr) (((ptr)->wPatternCode & 0x0200) >> 9) -#define readDXVA_Y___3coded(ptr) (((ptr)->wPatternCode & 0x0100) >> 8) -#define readDXVA_Cb__4coded(ptr) (((ptr)->wPatternCode & 0x0080) >> 7) -#define readDXVA_Cr__5coded(ptr) (((ptr)->wPatternCode & 0x0040) >> 6) -#define readDXVA_Cb__6coded(ptr) (((ptr)->wPatternCode & 0x0020) >> 5) -#define readDXVA_Cr__7coded(ptr) (((ptr)->wPatternCode & 0x0010) >> 4) -#define readDXVA_Cb__8coded(ptr) (((ptr)->wPatternCode & 0x0008) >> 3) -#define readDXVA_Cb__9coded(ptr) (((ptr)->wPatternCode & 0x0004) >> 2) -#define readDXVA_Cr_10coded(ptr) (((ptr)->wPatternCode & 0x0002) >> 1) -#define readDXVA_Cr_11coded(ptr) (((ptr)->wPatternCode & 0x0001)) - -#define readDXVA_Y___0oflow(ptr) (((ptr)->wPC_Overflow & 0x0800) >> 11) -#define readDXVA_Y___1oflow(ptr) (((ptr)->wPC_Overflow & 0x0400) >> 10) -#define readDXVA_Y___2oflow(ptr) (((ptr)->wPC_Overflow & 0x0200) >> 9) -#define readDXVA_Y___3oflow(ptr) (((ptr)->wPC_Overflow & 0x0100) >> 8) -#define readDXVA_Cb__4oflow(ptr) (((ptr)->wPC_Overflow & 0x0080) >> 7) -#define readDXVA_Cr__5oflow(ptr) (((ptr)->wPC_Overflow & 0x0040) >> 6) -#define readDXVA_Cb__6oflow(ptr) (((ptr)->wPC_Overflow & 0x0020) >> 5) -#define readDXVA_Cr__7oflow(ptr) (((ptr)->wPC_Overflow & 0x0010) >> 4) -#define readDXVA_Cb__8oflow(ptr) (((ptr)->wPC_Overflow & 0x0008) >> 3) -#define readDXVA_Cb__9oflow(ptr) (((ptr)->wPC_Overflow & 0x0004) >> 2) -#define readDXVA_Cr_10oflow(ptr) (((ptr)->wPC_Overflow & 0x0002) >> 1) -#define readDXVA_Cr_11oflow(ptr) (((ptr)->wPC_Overflow & 0x0001)) - -#pragma pack(pop, BeforeDXVApacking) - -#ifdef __cplusplus -} -#endif - -#endif /* __DIRECTX_VA__ */ diff --git a/import/DirectX8/include/edevdefs.h b/import/DirectX8/include/edevdefs.h deleted file mode 100644 index 16af462d8..000000000 --- a/import/DirectX8/include/edevdefs.h +++ /dev/null @@ -1,531 +0,0 @@ -//------------------------------------------------------------------------------ -// File: EDevDefs.h -// -// Desc: External Device (such as a VCR) control interface parameter and -// value definitions. -// -// Note: new constants added: ED_BASE+800L -> ED_BASE+811L -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __EDEVDEFS__ -#define __EDEVDEFS__ - - -#define ED_BASE 0x1000L - -// this is used to tell the device communications object which -// physical communications port to use. -#define DEV_PORT_SIM 1 -#define DEV_PORT_COM1 2 // standard serial ports -#define DEV_PORT_COM2 3 -#define DEV_PORT_COM3 4 -#define DEV_PORT_COM4 5 -#define DEV_PORT_DIAQ 6 // Diaquest driver -#define DEV_PORT_ARTI 7 // ARTI driver -#define DEV_PORT_1394 8 // IEEE 1394 Bus -#define DEV_PORT_USB 9 // Universal Serial Bus -#define DEV_PORT_MIN DEV_PORT_SIM -#define DEV_PORT_MAX DEV_PORT_USB - - -// IAMExtDevice Capability Items: unless otherwise specified, these items return -// OATRUE or OAFALSE. All return values are in pdwValue unless otherwise specified: - -#define ED_DEVCAP_CAN_RECORD ED_BASE+1L -#define ED_DEVCAP_CAN_RECORD_STROBE ED_BASE+2L // for multitrack devices: - // switches currently recording tracks off - // and selected non-recording tracks into record -#define ED_DEVCAP_HAS_AUDIO ED_BASE+3L -#define ED_DEVCAP_HAS_VIDEO ED_BASE+4L -#define ED_DEVCAP_USES_FILES ED_BASE+5L -#define ED_DEVCAP_CAN_SAVE ED_BASE+6L - -#define ED_DEVCAP_DEVICE_TYPE ED_BASE+7L // returns one of the following: -#define ED_DEVTYPE_VCR ED_BASE+8L -#define ED_DEVTYPE_LASERDISK ED_BASE+9L -#define ED_DEVTYPE_ATR ED_BASE+10L -#define ED_DEVTYPE_DDR ED_BASE+11L -#define ED_DEVTYPE_ROUTER ED_BASE+12L -#define ED_DEVTYPE_KEYER ED_BASE+13L -#define ED_DEVTYPE_MIXER_VIDEO ED_BASE+14L -#define ED_DEVTYPE_DVE ED_BASE+15L -#define ED_DEVTYPE_WIPEGEN ED_BASE+16L -#define ED_DEVTYPE_MIXER_AUDIO ED_BASE+17L -#define ED_DEVTYPE_CG ED_BASE+18L -#define ED_DEVTYPE_TBC ED_BASE+19L -#define ED_DEVTYPE_TCG ED_BASE+20L -#define ED_DEVTYPE_GPI ED_BASE+21L -#define ED_DEVTYPE_JOYSTICK ED_BASE+22L -#define ED_DEVTYPE_KEYBOARD ED_BASE+23L - -// returns mfr-specific ID from external device. -#define ED_DEVCAP_EXTERNAL_DEVICE_ID ED_BASE+24L - -#define ED_DEVCAP_TIMECODE_READ ED_BASE+25L -#define ED_DEVCAP_TIMECODE_WRITE ED_BASE+26L -// used for seekable non-timecode enabled devices -#define ED_DEVCAP_CTLTRK_READ ED_BASE+27L -// used for seekable non-timecode enabled devices -#define ED_DEVCAP_INDEX_READ ED_BASE+28L - -// returns device preroll time in current time format -#define ED_DEVCAP_PREROLL ED_BASE+29L -// returns device postroll time in current time format -#define ED_DEVCAP_POSTROLL ED_BASE+30L - -// returns indication of device’s synchronization accuracy. -#define ED_DEVCAP_SYNC_ACCURACY ED_BASE+31L // returns one of the following: -#define ED_SYNCACC_PRECISE ED_BASE+32L -#define ED_SYNCACC_FRAME ED_BASE+33L -#define ED_SYNCACC_ROUGH ED_BASE+34L - -// returns device’s normal framerate. -#define ED_DEVCAP_NORMAL_RATE ED_BASE+35L // returns one of the following: -#define ED_RATE_24 ED_BASE+36L -#define ED_RATE_25 ED_BASE+37L -#define ED_RATE_2997 ED_BASE+38L -#define ED_RATE_30 ED_BASE+39L - -#define ED_DEVCAP_CAN_PREVIEW ED_BASE+40L -#define ED_DEVCAP_CAN_MONITOR_SOURCES ED_BASE+41L - -// indicates implementation allows testing of methods/parameters by -// setting the hi bit of a parm that makes sense - see individual methods -// for details. -#define ED_DEVCAP_CAN_TEST ED_BASE+42L - -// indicates device accepts video as an input. -#define ED_DEVCAP_VIDEO_INPUTS ED_BASE+43L - -// indicates device accepts audio as an input. -#define ED_DEVCAP_AUDIO_INPUTS ED_BASE+44L - -#define ED_DEVCAP_NEEDS_CALIBRATING ED_BASE+45L - -#define ED_DEVCAP_SEEK_TYPE ED_BASE+46L // returns one of the following: -#define ED_SEEK_PERFECT ED_BASE+47L // indicates device can execute seek - // within 1 video frames without signal - // break (like a DDR) -#define ED_SEEK_FAST ED_BASE+48L // indicates device can move pretty quick - // with short break in signal -#define ED_SEEK_SLOW ED_BASE+49L // seeks like a tape transport - -#define ED_POWER_ON ED_BASE+50L -#define ED_POWER_OFF ED_BASE+51L -#define ED_POWER_STANDBY ED_BASE+52L - -#define ED_ACTIVE ED_BASE+53L -#define ED_INACTIVE ED_BASE+54L -#define ED_ALL ED_BASE+55L -#define ED_TEST ED_BASE+56L - -// IAMExtTransport Capability Items: unless otherwise specified, these items return -// OATRUE or OAFALSE. All return values are in pdwValue unless otherwise specified: - -#define ED_TRANSCAP_CAN_EJECT ED_BASE+100L -#define ED_TRANSCAP_CAN_BUMP_PLAY ED_BASE+101L // variable speed for synchronizing -#define ED_TRANSCAP_CAN_PLAY_BACKWARDS ED_BASE+102L // servo locked for use during an edit -#define ED_TRANSCAP_CAN_SET_EE ED_BASE+103L // show device’s input on its output -#define ED_TRANSCAP_CAN_SET_PB ED_BASE+104L // show media playback on device’s output -#define ED_TRANSCAP_CAN_DELAY_VIDEO_IN ED_BASE+105L // transport can do delayed-in video edits -#define ED_TRANSCAP_CAN_DELAY_VIDEO_OUT ED_BASE+106L // transport can do delayed-out video edits -#define ED_TRANSCAP_CAN_DELAY_AUDIO_IN ED_BASE+107L // transport can do delayed-in audio edits -#define ED_TRANSCAP_CAN_DELAY_AUDIO_OUT ED_BASE+108L // transport can do delayed-out audio edits -#define ED_TRANSCAP_FWD_VARIABLE_MAX ED_BASE+109L // max forward speed (multiple of play speed) - // in pdblValue -#define ED_TRANSCAP_FWD_VARIABLE_MIN ED_BASE+800L // min forward speed (multiple of play speed) - // in pdblValue -#define ED_TRANSCAP_REV_VARIABLE_MAX ED_BASE+110L // max reverse speed (multiple of play speed) in - // pdblValue -#define ED_TRANSCAP_REV_VARIABLE_MIN ED_BASE+801L // min reverse speed (multiple of play speed) - // in pdblValue -#define ED_TRANSCAP_FWD_SHUTTLE_MAX ED_BASE+802L // max forward speed in Shuttle mode (multiple - // of play speed) in pdblValue -#define ED_TRANSCAP_FWD_SHUTTLE_MIN ED_BASE+803L // min forward speed in Shuttle mode (multiple - // of play speed) in pdblValue -#define ED_TRANSCAP_REV_SHUTTLE_MAX ED_BASE+804L // max reverse speed in Shuttle mode (multiple - // of play speed) in pdblValue -#define ED_TRANSCAP_REV_SHUTTLE_MIN ED_BASE+805L // min reverse speed in Shuttle mode (multiple - // of play speed) in pdblValue -#define ED_TRANSCAP_NUM_AUDIO_TRACKS ED_BASE+111L // returns number of audio tracks -#define ED_TRANSCAP_LTC_TRACK ED_BASE+112L // returns track number of LTC timecode track. - // ED_ALL means no dedicated timecode track -#define ED_TRANSCAP_NEEDS_TBC ED_BASE+113L // device’s output not stable -#define ED_TRANSCAP_NEEDS_CUEING ED_BASE+114L // device must be cued prior to performing edit -#define ED_TRANSCAP_CAN_INSERT ED_BASE+115L -#define ED_TRANSCAP_CAN_ASSEMBLE ED_BASE+116L -#define ED_TRANSCAP_FIELD_STEP ED_BASE+117L // device responds to Frame Advance command by - // advancing one field -#define ED_TRANSCAP_CLOCK_INC_RATE ED_BASE+118L // VISCA command - keep for compatibility -#define ED_TRANSCAP_CAN_DETECT_LENGTH ED_BASE+119L -#define ED_TRANSCAP_CAN_FREEZE ED_BASE+120L -#define ED_TRANSCAP_HAS_TUNER ED_BASE+121L -#define ED_TRANSCAP_HAS_TIMER ED_BASE+122L -#define ED_TRANSCAP_HAS_CLOCK ED_BASE+123L -#define ED_TRANSCAP_MULTIPLE_EDITS ED_BASE+806L // OATRUE means device/filter can support - // multiple edit events -#define ED_TRANSCAP_IS_MASTER ED_BASE+807L // OATRUE means device is the master clock - // for synchronizing (this sets timecode-to- - // reference clock offset for editing) -#define ED_TRANSCAP_HAS_DT ED_BASE+814L // OATRUE means device has Dynamic Tracking - -// IAMExtTransport Media States -#define ED_MEDIA_SPIN_UP ED_BASE+130L -#define ED_MEDIA_SPIN_DOWN ED_BASE+131L -#define ED_MEDIA_UNLOAD ED_BASE+132L - -// IAMExtTransport Modes -#define ED_MODE_PLAY ED_BASE+200L -#define ED_MODE_STOP ED_BASE+201L -#define ED_MODE_FREEZE ED_BASE+202L // really "pause" -#define ED_MODE_THAW ED_BASE+203L -#define ED_MODE_FF ED_BASE+204L -#define ED_MODE_REW ED_BASE+205L -#define ED_MODE_RECORD ED_BASE+206L -#define ED_MODE_RECORD_STROBE ED_BASE+207L -#define ED_MODE_RECORD_FREEZE ED_BASE+808L // never "put", only "get" -#define ED_MODE_STEP ED_BASE+208L // same as "jog" -#define ED_MODE_STEP_FWD ED_BASE+208L // same as ED_MODE_STEP -#define ED_MODE_STEP_REV ED_BASE+809L -#define ED_MODE_SHUTTLE ED_BASE+209L -#define ED_MODE_EDIT_CUE ED_BASE+210L -#define ED_MODE_VAR_SPEED ED_BASE+211L -#define ED_MODE_PERFORM ED_BASE+212L // returned status only -#define ED_MODE_LINK_ON ED_BASE+280L -#define ED_MODE_LINK_OFF ED_BASE+281L -#define ED_MODE_NOTIFY_ENABLE ED_BASE+810L -#define ED_MODE_NOTIFY_DISABLE ED_BASE+811L -#define ED_MODE_SHOT_SEARCH ED_BASE+812L - -// IAMTimecodeReader/Generator/Display defines -// -// Timecode Generator Mode params and values: -// -#define ED_TCG_TIMECODE_TYPE ED_BASE+400L // can be one of the following: -#define ED_TCG_SMPTE_LTC ED_BASE+401L -#define ED_TCG_SMPTE_VITC ED_BASE+402L -#define ED_TCG_MIDI_QF ED_BASE+403L -#define ED_TCG_MIDI_FULL ED_BASE+404L - -#define ED_TCG_FRAMERATE ED_BASE+405L // can be one of the following: -#define ED_FORMAT_SMPTE_30 ED_BASE+406L -#define ED_FORMAT_SMPTE_30DROP ED_BASE+407L -#define ED_FORMAT_SMPTE_25 ED_BASE+408L -#define ED_FORMAT_SMPTE_24 ED_BASE+409L - -#define ED_TCG_SYNC_SOURCE ED_BASE+410L // can be one of the following: -#define ED_TCG_VIDEO ED_BASE+411L -#define ED_TCG_READER ED_BASE+412L -#define ED_TCG_FREE ED_BASE+413L - -#define ED_TCG_REFERENCE_SOURCE ED_BASE+414L // can have one these values: - // ED_TCG_FREE || ED_TCG_READER - // (for regen/jamsync) - -// TimeCodeReader Mode params and values: -#define ED_TCR_SOURCE ED_BASE+416L // can be one of the following: -// ED_TCG (already defined) -#define ED_TCR_LTC ED_BASE+417L -#define ED_TCR_VITC ED_BASE+418L -#define ED_TCR_CT ED_BASE+419L // Control Track -#define ED_TCR_FTC ED_BASE+420L // File TimeCode - for file-based devices - // that wish they were transports -// ED_MODE_NOTIFY_ENABLE can be OATRUE or OAFALSE (defined in transport mode -// section of this file). -#define ED_TCR_LAST_VALUE ED_BASE+421L // for notification mode - - // successive calls to GetTimecode - // return the last read value -// TimeCode Display Mode params and values: -// -#define ED_TCD_SOURCE ED_BASE+422L // can be one of the following: -#define ED_TCR ED_BASE+423L -#define ED_TCG ED_BASE+424L - -#define ED_TCD_SIZE ED_BASE+425L // can be one of the following: -#define ED_SMALL ED_BASE+426L -#define ED_MED ED_BASE+427L -#define ED_LARGE ED_BASE+428L - -#define ED_TCD_POSITION ED_BASE+429L // can be one of the following: -#define ED_TOP 0x0001 -#define ED_MIDDLE 0x0002 -#define ED_BOTTOM 0x0004 // OR'd with -#define ED_LEFT 0x0100 -#define ED_CENTER 0x0200 -#define ED_RIGHT 0x0400 - -#define ED_TCD_INTENSITY ED_BASE+436L // can be one of the following: -#define ED_HIGH ED_BASE+437L -#define ED_LOW ED_BASE+438L - -#define ED_TCD_TRANSPARENCY ED_BASE+439L // 0-4, 0 is opaque - -#define ED_TCD_INVERT ED_BASE+440L // OATRUE=black on white - // OAFALSE=white on black -// IAMExtTransport defines -// -// Transport status, params and values -// - -// IAMExtTransport Status items and and values: -#define ED_MODE ED_BASE+500L // see ED_MODE_xxx values above -#define ED_ERROR ED_BASE+501L -#define ED_LOCAL ED_BASE+502L -#define ED_RECORD_INHIBIT ED_BASE+503L -#define ED_SERVO_LOCK ED_BASE+504L -#define ED_MEDIA_PRESENT ED_BASE+505L -#define ED_MEDIA_LENGTH ED_BASE+506L -#define ED_MEDIA_SIZE ED_BASE+507L -#define ED_MEDIA_TRACK_COUNT ED_BASE+508L -#define ED_MEDIA_TRACK_LENGTH ED_BASE+509L -#define ED_MEDIA_SIDE ED_BASE+510L - -#define ED_MEDIA_TYPE ED_BASE+511L // can be one of the following: -#define ED_MEDIA_VHS ED_BASE+512L -#define ED_MEDIA_SVHS ED_BASE+513L -#define ED_MEDIA_HI8 ED_BASE+514L -#define ED_MEDIA_UMATIC ED_BASE+515L -#define ED_MEDIA_DVC ED_BASE+516L -#define ED_MEDIA_1_INCH ED_BASE+517L -#define ED_MEDIA_D1 ED_BASE+518L -#define ED_MEDIA_D2 ED_BASE+519L -#define ED_MEDIA_D3 ED_BASE+520L -#define ED_MEDIA_D5 ED_BASE+521L -#define ED_MEDIA_DBETA ED_BASE+522L -#define ED_MEDIA_BETA ED_BASE+523L -#define ED_MEDIA_8MM ED_BASE+524L -#define ED_MEDIA_DDR ED_BASE+525L -#define ED_MEDIA_SX ED_BASE+813L -#define ED_MEDIA_OTHER ED_BASE+526L -#define ED_MEDIA_CLV ED_BASE+527L -#define ED_MEDIA_CAV ED_BASE+528L -#define ED_MEDIA_POSITION ED_BASE+529L - -#define ED_LINK_MODE ED_BASE+530L // OATRUE if transport controls - // are linked to graph's RUN, - // STOP, and PAUSE methods - -// IAMExtTransport Basic Parms -#define ED_TRANSBASIC_TIME_FORMAT ED_BASE+540L // can be one of the following: -#define ED_FORMAT_MILLISECONDS ED_BASE+541L -#define ED_FORMAT_FRAMES ED_BASE+542L -#define ED_FORMAT_REFERENCE_TIME ED_BASE+543L - -#define ED_FORMAT_HMSF ED_BASE+547L -#define ED_FORMAT_TMSF ED_BASE+548L - -#define ED_TRANSBASIC_TIME_REFERENCE ED_BASE+549L // can be one of the following: -#define ED_TIMEREF_TIMECODE ED_BASE+550L -#define ED_TIMEREF_CONTROL_TRACK ED_BASE+551L -#define ED_TIMEREF_INDEX ED_BASE+552L - -#define ED_TRANSBASIC_SUPERIMPOSE ED_BASE+553L // enable/disable onscreen display -#define ED_TRANSBASIC_END_STOP_ACTION ED_BASE+554L // can be one of: ED_MODE_STOP | - // ED_MODE_REWIND | ED_MODE_FREEZE -#define ED_TRANSBASIC_RECORD_FORMAT ED_BASE+555L // can be one of the following: -#define ED_RECORD_FORMAT_SP ED_BASE+556L -#define ED_RECORD_FORMAT_LP ED_BASE+557L -#define ED_RECORD_FORMAT_EP ED_BASE+558L - -#define ED_TRANSBASIC_STEP_COUNT ED_BASE+559L -#define ED_TRANSBASIC_STEP_UNIT ED_BASE+560L // can be one of the following: -#define ED_STEP_FIELD ED_BASE+561L -#define ED_STEP_FRAME ED_BASE+562L -#define ED_STEP_3_2 ED_BASE+563L - -#define ED_TRANSBASIC_PREROLL ED_BASE+564L -#define ED_TRANSBASIC_RECPREROLL ED_BASE+565L -#define ED_TRANSBASIC_POSTROLL ED_BASE+566L -#define ED_TRANSBASIC_EDIT_DELAY ED_BASE+567L -#define ED_TRANSBASIC_PLAYTC_DELAY ED_BASE+568L -#define ED_TRANSBASIC_RECTC_DELAY ED_BASE+569L -#define ED_TRANSBASIC_EDIT_FIELD ED_BASE+570L -#define ED_TRANSBASIC_FRAME_SERVO ED_BASE+571L -#define ED_TRANSBASIC_CF_SERVO ED_BASE+572L -#define ED_TRANSBASIC_SERVO_REF ED_BASE+573L // can be one of the following: -#define ED_REF_EXTERNAL ED_BASE+574L -#define ED_REF_INPUT ED_BASE+575L -#define ED_REF_INTERNAL ED_BASE+576L -#define ED_REF_AUTO ED_BASE+577L - -#define ED_TRANSBASIC_WARN_GL ED_BASE+578L -#define ED_TRANSBASIC_SET_TRACKING ED_BASE+579L // can be one of the following: -#define ED_TRACKING_PLUS ED_BASE+580L -#define ED_TRACKING_MINUS ED_BASE+581L -#define ED_TRACKING_RESET ED_BASE+582L - -#define ED_TRANSBASIC_SET_FREEZE_TIMEOUT ED_BASE+583L -#define ED_TRANSBASIC_VOLUME_NAME ED_BASE+584L -#define ED_TRANSBASIC_BALLISTIC_1 ED_BASE+585L // space for proprietary data -#define ED_TRANSBASIC_BALLISTIC_2 ED_BASE+586L -#define ED_TRANSBASIC_BALLISTIC_3 ED_BASE+587L -#define ED_TRANSBASIC_BALLISTIC_4 ED_BASE+588L -#define ED_TRANSBASIC_BALLISTIC_5 ED_BASE+589L -#define ED_TRANSBASIC_BALLISTIC_6 ED_BASE+590L -#define ED_TRANSBASIC_BALLISTIC_7 ED_BASE+591L -#define ED_TRANSBASIC_BALLISTIC_8 ED_BASE+592L -#define ED_TRANSBASIC_BALLISTIC_9 ED_BASE+593L -#define ED_TRANSBASIC_BALLISTIC_10 ED_BASE+594L -#define ED_TRANSBASIC_BALLISTIC_11 ED_BASE+595L -#define ED_TRANSBASIC_BALLISTIC_12 ED_BASE+596L -#define ED_TRANSBASIC_BALLISTIC_13 ED_BASE+597L -#define ED_TRANSBASIC_BALLISTIC_14 ED_BASE+598L -#define ED_TRANSBASIC_BALLISTIC_15 ED_BASE+599L -#define ED_TRANSBASIC_BALLISTIC_16 ED_BASE+600L -#define ED_TRANSBASIC_BALLISTIC_17 ED_BASE+601L -#define ED_TRANSBASIC_BALLISTIC_18 ED_BASE+602L -#define ED_TRANSBASIC_BALLISTIC_19 ED_BASE+603L -#define ED_TRANSBASIC_BALLISTIC_20 ED_BASE+604L - -// consumer VCR items -#define ED_TRANSBASIC_SETCLOCK ED_BASE+605L -#define ED_TRANSBASIC_SET_COUNTER_FORMAT ED_BASE+606L // uses time format flags -#define ED_TRANSBASIC_SET_COUNTER_VALUE ED_BASE+607L - -#define ED_TRANSBASIC_SETTUNER_CH_UP ED_BASE+608L -#define ED_TRANSBASIC_SETTUNER_CH_DN ED_BASE+609L -#define ED_TRANSBASIC_SETTUNER_SK_UP ED_BASE+610L -#define ED_TRANSBASIC_SETTUNER_SK_DN ED_BASE+611L -#define ED_TRANSBASIC_SETTUNER_CH ED_BASE+612L -#define ED_TRANSBASIC_SETTUNER_NUM ED_BASE+613L - -#define ED_TRANSBASIC_SETTIMER_EVENT ED_BASE+614L -#define ED_TRANSBASIC_SETTIMER_STARTDAY ED_BASE+615L -#define ED_TRANSBASIC_SETTIMER_STARTTIME ED_BASE+616L -#define ED_TRANSBASIC_SETTIMER_STOPDAY ED_BASE+617L -#define ED_TRANSBASIC_SETTIMER_STOPTIME ED_BASE+618L - -// IAMExtTransport video parameters -#define ED_TRANSVIDEO_SET_OUTPUT ED_BASE+630L // can be one of the following: -#define ED_E2E ED_BASE+631L -#define ED_PLAYBACK ED_BASE+632L -#define ED_OFF ED_BASE+633L - -#define ED_TRANSVIDEO_SET_SOURCE ED_BASE+634L - -// IAMExtTransport audio parameters -#define ED_TRANSAUDIO_ENABLE_OUTPUT ED_BASE+640L // can be the following: -#define ED_AUDIO_ALL 0x10000000 // or any of the following OR'd together -#define ED_AUDIO_1 0x0000001L -#define ED_AUDIO_2 0x0000002L -#define ED_AUDIO_3 0x0000004L -#define ED_AUDIO_4 0x0000008L -#define ED_AUDIO_5 0x0000010L -#define ED_AUDIO_6 0x0000020L -#define ED_AUDIO_7 0x0000040L -#define ED_AUDIO_8 0x0000080L -#define ED_AUDIO_9 0x0000100L -#define ED_AUDIO_10 0x0000200L -#define ED_AUDIO_11 0x0000400L -#define ED_AUDIO_12 0x0000800L -#define ED_AUDIO_13 0x0001000L -#define ED_AUDIO_14 0x0002000L -#define ED_AUDIO_15 0x0004000L -#define ED_AUDIO_16 0x0008000L -#define ED_AUDIO_17 0x0010000L -#define ED_AUDIO_18 0x0020000L -#define ED_AUDIO_19 0x0040000L -#define ED_AUDIO_20 0x0080000L -#define ED_AUDIO_21 0x0100000L -#define ED_AUDIO_22 0x0200000L -#define ED_AUDIO_23 0x0400000L -#define ED_AUDIO_24 0x0800000L -#define ED_VIDEO 0x2000000L // for Edit props below - -#define ED_TRANSAUDIO_ENABLE_RECORD ED_BASE+642L -#define ED_TRANSAUDIO_ENABLE_SELSYNC ED_BASE+643L -#define ED_TRANSAUDIO_SET_SOURCE ED_BASE+644L -#define ED_TRANSAUDIO_SET_MONITOR ED_BASE+645L - - -// Edit Property Set-related defs - -// The following values reflect (and control) the state of an -// edit property set -#define ED_INVALID ED_BASE+652L -#define ED_EXECUTING ED_BASE+653L -#define ED_REGISTER ED_BASE+654L -#define ED_DELETE ED_BASE+655L - -// Edit property set parameters and values -#define ED_EDIT_HEVENT ED_BASE+656L // event handle to signal event - // completion -#define ED_EDIT_TEST ED_BASE+657L // returns OAFALSE if filter thinks - // edit can be done, OATRUE if not -#define ED_EDIT_IMMEDIATE ED_BASE+658L // OATRUE means start put the - // device into edit mode (editing - // "on the fly") immediately upon - // execution of Mode(ED_MODE_EDIT_CUE) -#define ED_EDIT_MODE ED_BASE+659L -// can be one of the following values: -#define ED_EDIT_MODE_ASSEMBLE ED_BASE+660L -#define ED_EDIT_MODE_INSERT ED_BASE+661L -#define ED_EDIT_MODE_CRASH_RECORD ED_BASE+662L -#define ED_EDIT_MODE_BOOKMARK_TIME ED_BASE+663L // these two are for -#define ED_EDIT_MODE_BOOKMARK_CHAPTER ED_BASE+664L // laserdisks - -#define ED_EDIT_MASTER ED_BASE+666L // OATRUE causes device - // not to synchronize - -#define ED_EDIT_TRACK ED_BASE+667L -// can be one of the following possible OR'd values: -// ED_VIDEO, ED_AUDIO_1 thru ED_AUDIO_24 (or ED_AUDIO_ALL) - -#define ED_EDIT_SRC_INPOINT ED_BASE+668L // in current time format -#define ED_EDIT_SRC_OUTPOINT ED_BASE+669L // in current time format -#define ED_EDIT_REC_INPOINT ED_BASE+670L // in current time format -#define ED_EDIT_REC_OUTPOINT ED_BASE+671L // in current time format - -#define ED_EDIT_REHEARSE_MODE ED_BASE+672L -// can be one of the following possible values: -#define ED_EDIT_BVB ED_BASE+673L // means rehearse the edit with - // "black-video-black" -#define ED_EDIT_VBV ED_BASE+674L -#define ED_EDIT_VVV ED_BASE+675L -#define ED_EDIT_PERFORM ED_BASE+676L // means perform the edit with no - // rehearsal. - -// Set this property to OATRUE to kill the edit if in progress -#define ED_EDIT_ABORT ED_BASE+677L -// how long to wait for edit to complete -#define ED_EDIT_TIMEOUT ED_BASE+678L // in current time format - -// This property causes the device to seek to a point specified by -// ED_EDIT_SEEK_MODE (see below). NOTE: Only one event at a time can seek. -#define ED_EDIT_SEEK ED_BASE+679L // OATRUE means do it now. -#define ED_EDIT_SEEK_MODE ED_BASE+680L -//possible values: -#define ED_EDIT_SEEK_EDIT_IN ED_BASE+681L // seek to edit's inpoint -#define ED_EDIT_SEEK_EDIT_OUT ED_BASE+682L // seek to edit's outpoint -#define ED_EDIT_SEEK_PREROLL ED_BASE+683L // seek to edit's - // inpoint-preroll -#define ED_EDIT_SEEK_PREROLL_CT ED_BASE+684L // seek to preroll point - // using control track (used for tapes with - // discontinuoustimecode before edit point: seek - // to inpoint using timecode, then backup to - // preroll point using control track) -#define ED_EDIT_SEEK_BOOKMARK ED_BASE+685L // seek to bookmark (just like - // timecode search) -// This property is used for multiple-VCR systems where each machine must -// cue to a different location relative to the graph's reference clock. The -// basic idea is that an edit event is setup with an ED_EDIT_OFFSET property -// that tells the VCR what offset to maintain between it's timecode (converted -// to reference clock units) and the reference clock. -#define ED_EDIT_OFFSET ED_BASE+686L // in current time format - -#define ED_EDIT_PREREAD ED_BASE+815L // OATRUE means device supports - // pre-read (recorder can also be - // player - -// -// Some error codes: -// -// device could be in local mode -#define ED_ERR_DEVICE_NOT_READY ED_BASE+700L - -#endif // __EDEVDEFS__ - -// eof edevdefs.h diff --git a/import/DirectX8/include/errors.h b/import/DirectX8/include/errors.h deleted file mode 100644 index d89a0a1ff..000000000 --- a/import/DirectX8/include/errors.h +++ /dev/null @@ -1,47 +0,0 @@ -//------------------------------------------------------------------------------ -// File: Errors.h -// -// Desc: ActiveMovie error defines. -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __ERRORS__ -#define __ERRORS__ - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -#ifndef _AMOVIE_ -#define AMOVIEAPI DECLSPEC_IMPORT -#else -#define AMOVIEAPI -#endif - -// codes 0-01ff are reserved for OLE -#define VFW_FIRST_CODE 0x200 -#define MAX_ERROR_TEXT_LEN 160 - -#include // includes all message definitions - -typedef BOOL (WINAPI* AMGETERRORTEXTPROCA)(HRESULT, char *, DWORD); -typedef BOOL (WINAPI* AMGETERRORTEXTPROCW)(HRESULT, WCHAR *, DWORD); - -AMOVIEAPI DWORD WINAPI AMGetErrorTextA( HRESULT hr , char *pbuffer , DWORD MaxLen); -AMOVIEAPI DWORD WINAPI AMGetErrorTextW( HRESULT hr , WCHAR *pbuffer , DWORD MaxLen); - - -#ifdef UNICODE -#define AMGetErrorText AMGetErrorTextW -typedef AMGETERRORTEXTPROCW AMGETERRORTEXTPROC; -#else -#define AMGetErrorText AMGetErrorTextA -typedef AMGETERRORTEXTPROCA AMGETERRORTEXTPROC; -#endif - -#ifdef __cplusplus -} -#endif // __cplusplus -#endif // __ERRORS__ diff --git a/import/DirectX8/include/evcode.h b/import/DirectX8/include/evcode.h deleted file mode 100644 index 97b17887e..000000000 --- a/import/DirectX8/include/evcode.h +++ /dev/null @@ -1,415 +0,0 @@ -//------------------------------------------------------------------------------ -// File: EvCode.h -// -// Desc: List of standard Quartz event codes and the expected params. -// -// Copyright (c) 1992 - 2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -// Event codes are broken into two groups -// -- system event codes -// -- extension event codes -// All system event codes are below EC_USER - -#define EC_SYSTEMBASE 0x00 -#define EC_USER 0x8000 - -// System-defined event codes -// ========================== -// -// There are three types of system-defined event codes: -// -// 1. Those which are always passed through to the application -// (To be collected by calls to GetEvent or within WaitForCompletion.) -// (e.g. EC_ERRORABORT, EC_USERABORT.) -// -// 2. Those which are pure internal and will never be passed to -// the application. (e.g. EC_SHUTDOWN) -// -// 3. Those which have default handling. Default handing implies that -// the event is not passed to the application. However, default -// handling may be canceled by calling -// IMediaEvent::CancelDefaultHandling. If the default handling is -// cancelled in this way, then the message will be delivered to the -// application and the application must action it appropriately. -// Default handling can be restored by calling RestoreDefaultHandling. -// -// We will refer to these events as application, internal and defaulted -// events respectively. -// -// System-defined events may have interface pointers, BSTR's, etc passed -// as parameters. It is therefore essential that, for any message -// retrieved using GetEvent, a matching call to FreeEventParams is made -// to ensure that relevant interfaces are released and storage freed. -// Failure to call FreeEventParams will result in memory leaks, if not -// worse. -// -// Filters sending these messages to the filter graph should not AddRef() -// any interfaces that they may pass as parameters. The filter graph -// manager will AddRef them if required. E.g. if the event is to be queued -// for the application or queued to a worker thread. - -// Each event listed below is immediately followed by a parameter list -// detailing the types of the parameters associated with the message, -// and an indication of whether the message is an application, internal -// or defaulted message. This is then followed by a short description. -// The use of "void" in the parameter list implies that the parameter is not -// used. Such parameters should be zero. - -// Other defined EC_ regions: -// DVD event codes 0x0100 - 0x0150 (dvdevcod.h) -// audio device event codes 0x0200 - 0x0250 (audevcod.h) -// WindowsMedia SDK-originated events 0x0251 - 0x0300 (see below) -// MSVIDCTL 0x0301 - 0x0325 (msvidctl.idl) - -#define EC_COMPLETE 0x01 -// ( HRESULT, void ) : defaulted (special) -// Signals the completed playback of a stream within the graph. This message -// is sent by renderers when they receive end-of-stream. The default handling -// of this message results in a _SINGLE_ EC_COMPLETE being sent to the -// application when ALL of the individual renderers have signaled EC_COMPLETE -// to the filter graph. If the default handing is canceled, the application -// will see all of the individual EC_COMPLETEs. - - -#define EC_USERABORT 0x02 -// ( void, void ) : application -// In some sense, the user has requested that playback be terminated. -// This message is typically sent by renderers that render into a -// window if the user closes the window into which it was rendering. -// It is up to the application to decide if playback should actually -// be stopped. - - -#define EC_ERRORABORT 0x03 -// ( HRESULT, void ) : application -// Operation aborted because of error - - -#define EC_TIME 0x04 -// ( DWORD, DWORD ) : application -// The requested reference time occurred. (This event is currently not used). -// lParam1 is low dword of ref time, lParam2 is high dword of reftime. - - -#define EC_REPAINT 0x05 -// ( IPin * (could be NULL), void ) : defaulted -// A repaint is required - lParam1 contains the (IPin *) that needs the data -// to be sent again. Default handling is: if the output pin which the IPin is -// attached to supports the IMediaEventSink interface then it will be called -// with the EC_REPAINT first. If that fails then normal repaint processing is -// done by the filter graph. - - -// Stream error notifications -#define EC_STREAM_ERROR_STOPPED 0x06 -#define EC_STREAM_ERROR_STILLPLAYING 0x07 -// ( HRESULT, DWORD ) : application -// lParam 1 is major code, lParam2 is minor code, either may be zero. - - -#define EC_ERROR_STILLPLAYING 0x08 -// ( HRESULT, void ) : application -// The filter graph manager may issue Run's to the graph asynchronously. -// If such a Run fails, EC_ERROR_STILLPLAYING is issued to notify the -// application of the failure. The state of the underlying filters -// at such a time will be indeterminate - they will all have been asked -// to run, but some are almost certainly not. - - -#define EC_PALETTE_CHANGED 0x09 -// ( void, void ) : application -// notify application that the video palette has changed - - -#define EC_VIDEO_SIZE_CHANGED 0x0A -// ( DWORD, void ) : application -// Sent by video renderers. -// Notifies the application that the native video size has changed. -// LOWORD of the DWORD is the new width, HIWORD is the new height. - - -#define EC_QUALITY_CHANGE 0x0B -// ( void, void ) : application -// Notify application that playback degradation has occurred - - -#define EC_SHUTTING_DOWN 0x0C -// ( void, void ) : internal -// This message is sent by the filter graph manager to any plug-in -// distributors which support IMediaEventSink to notify them that -// the filter graph is starting to shutdown. - - -#define EC_CLOCK_CHANGED 0x0D -// ( void, void ) : application -// Notify application that the clock has changed. -// (i.e. SetSyncSource has been called on the filter graph and has been -// distributed successfully to the filters in the graph.) - - -#define EC_PAUSED 0x0E -// ( HRESULT, void ) : application -// Notify application the previous pause request has completed - - -#define EC_OPENING_FILE 0x10 -#define EC_BUFFERING_DATA 0x11 -// ( BOOL, void ) : application -// lParam1 == 1 --> starting to open file or buffer data -// lParam1 == 0 --> not opening or buffering any more -// (This event does not appear to be used by ActiveMovie.) - - -#define EC_FULLSCREEN_LOST 0x12 -// ( void, IBaseFilter * ) : application -// Sent by full screen renderers when switched away from full screen. -// IBaseFilter may be NULL. - - -#define EC_ACTIVATE 0x13 -// ( BOOL, IBaseFilter * ) : internal -// Sent by video renderers when they lose or gain activation. -// lParam1 is set to 1 if gained or 0 if lost -// lParam2 is the IBaseFilter* for the filter that is sending the message -// Used for sound follows focus and full-screen switching - - -#define EC_NEED_RESTART 0x14 -// ( void, void ) : defaulted -// Sent by renderers when they regain a resource (e.g. audio renderer). -// Causes a restart by Pause/put_Current/Run (if running). - - -#define EC_WINDOW_DESTROYED 0x15 -// ( IBaseFilter *, void ) : internal -// Sent by video renderers when the window has been destroyed. Handled -// by the filter graph / distributor telling the resource manager. -// lParam1 is the IBaseFilter* of the filter whose window is being destroyed - - -#define EC_DISPLAY_CHANGED 0x16 -// ( IPin *, void ) : internal -// Sent by renderers when they detect a display change. the filter graph -// will arrange for the graph to be stopped and the pin send in lParam1 -// to be reconnected. by being reconnected it allows a renderer to reset -// and connect with a more appropriate format for the new display mode -// lParam1 contains an (IPin *) that should be reconnected by the graph - - -#define EC_STARVATION 0x17 -// ( void, void ) : defaulted -// Sent by a filter when it detects starvation. Default handling (only when -// running) is for the graph to be paused until all filters enter the -// paused state and then run. Normally this would be sent by a parser or source -// filter when too little data is arriving. - - -#define EC_OLE_EVENT 0x18 -// ( BSTR, BSTR ) : application -// Sent by a filter to pass a text string to the application. -// Conventionally, the first string is a type, and the second a parameter. - - -#define EC_NOTIFY_WINDOW 0x19 -// ( HWND, void ) : internal -// Pass the window handle around during pin connection. - -#define EC_STREAM_CONTROL_STOPPED 0x1A -// ( IPin * pSender, DWORD dwCookie ) -// Notification that an earlier call to IAMStreamControl::StopAt -// has now take effect. Calls to the method can be marked -// with a cookie which is passed back in the second parameter, -// allowing applications to easily tie together request -// and completion notifications. -// -// NB: IPin will point to the pin that actioned the Stop. This -// may not be the pin that the StopAt was sent to. - -#define EC_STREAM_CONTROL_STARTED 0x1B -// ( IPin * pSender, DWORD dwCookie ) -// Notification that an earlier call to IAMStreamControl::StartAt -// has now take effect. Calls to the method can be marked -// with a cookie which is passed back in the second parameter, -// allowing applications to easily tie together request -// and completion notifications. -// -// NB: IPin will point to the pin that actioned the Start. This -// may not be the pin that the StartAt was sent to. - -#define EC_END_OF_SEGMENT 0x1C -// -// ( const REFERENCE_TIME *pStreamTimeAtEndOfSegment, DWORD dwSegmentNumber ) -// -// pStreamTimeAtEndOfSegment -// pointer to the accumulated stream clock -// time since the start of the segment - this is directly computable -// as the sum of the previous and current segment durations (Stop - Start) -// and the rate applied to each segment -// The source add this time to the time within each segment to get -// a total elapsed time -// -// dwSegmentNumber -// Segment number - starts at 0 -// -// Notifies that a segment end has been reached when the -// AM_SEEKING_Segment flags was set for IMediaSeeking::SetPositions -// Passes in an IMediaSeeking interface to allow the next segment -// to be defined by the application - -#define EC_SEGMENT_STARTED 0x1D -// -// ( const REFERENCE_TIME *pStreamTimeAtStartOfSegment, DWORD dwSegmentNumber) -// -// pStreamTimeAtStartOfSegment -// pointer to the accumulated stream clock -// time since the start of the segment - this is directly computable -// as the sum of the previous segment durations (Stop - Start) -// and the rate applied to each segment -// -// dwSegmentNumber -// Segment number - starts at 0 -// -// Notifies that a new segment has been started. -// This is sent synchronously by any entity that will issue -// EC_END_OF_SEGMENT when a new segment is started -// (See IMediaSeeking::SetPositions - AM_SEEKING_Segment flag) -// It is used to compute how many EC_END_OF_SEGMENT notifications -// to expect at the end of a segment and as a consitency check - - -#define EC_LENGTH_CHANGED 0x1E -// (void, void) -// sent to indicate that the length of the "file" has changed - -#define EC_DEVICE_LOST 0x1f -// (IUnknown, 0) -// -// request window notification when the device is available again -// (through WM_DEVICECHANGED messages registered with -// RegisterDeviceNotification; see IAMDeviceRemoval interface) - -#define EC_STEP_COMPLETE 0x24 -// (BOOL bCacelled, void) -// Step request complete -// if bCancelled is TRUE the step was cancelled. This can happen -// if the application issued some control request or because there -// was a mode change etc etc - -// Event code 25 is reserved for future use. - -#define EC_TIMECODE_AVAILABLE 0x30 -// Sent by filter supporting timecode -// Param1 has a pointer to the sending object -// Param2 has the device ID of the sending object - -#define EC_EXTDEVICE_MODE_CHANGE 0x31 -// Sent by filter supporting IAMExtDevice -// Param1 has the new mode -// Param2 has the device ID of the sending object - -#define EC_STATE_CHANGE 0x32 -// ( FILTER_STATE, BOOL bInternal) -// Used to notify the application of any state changes in the filter graph. -// lParam1 is of type enum FILTER_STATE (defined in strmif.h) and indicates -// the state of the filter graph. -// -// lParam2 == 0 indicates that the previous state change request has completed -// & a change in application state. -// lParam2 == 1 reserved for future use to indicate internal state changes. - - -#define EC_GRAPH_CHANGED 0x50 -// Sent by filter to notify interesting graph changes - -#define EC_CLOCK_UNSET 0x51 -// ( void, void ) : application -// Used to notify the filter graph to unset the current graph clock. -// Has the affect of forcing the filter graph to reestablish the graph clock -// on the next Pause/Run (note that this is only used by ksproxy, when the pin -// of a clock providing filter is disconnected) - -#define EC_VMR_RENDERDEVICE_SET 0x53 -// (Render_Device type, void) -// Identifies the type of rendering mechanism the VMR -// is using to display video. Types used include: -#define VMR_RENDER_DEVICE_OVERLAY 0x01 -#define VMR_RENDER_DEVICE_VIDMEM 0x02 -#define VMR_RENDER_DEVICE_SYSMEM 0x04 - - -#define EC_VMR_SURFACE_FLIPPED 0x54 -// (hr - Flip return code, void) -// Identifies the VMR's allocator-presenter has called the DDraw flip api on -// the surface being presented. This allows the VMR to keep its DX-VA table -// of DDraw surfaces in sync with DDraws flipping chain. - -#define EC_VMR_RECONNECTION_FAILED 0x55 -// (hr - ReceiveConnection return code, void) -// Identifies that an upstream decoder tried to perform a dynamic format -// change and the VMR was unable to accept the new format. - - - -//------------------------------------------ -// -// BDA events: -// -// Event code 0x80 through 0x8f are reserved for BDA -// - - -//------------------------------------------ -// -// WindowsMedia SDK filter-specific events: -// -// -// Note that for EC_WMT_EVENT events the wmsdk-based filters use the following structure for -// passing event parameters to the app: -#ifndef AM_WMT_EVENT_DATA_DEFINED -#define AM_WMT_EVENT_DATA_DEFINED -typedef struct { - HRESULT hrStatus; // status code - void * pData; // event data -} AM_WMT_EVENT_DATA; -#endif -// -#define EC_WMT_EVENT_BASE 0x0251 -// -#define EC_WMT_INDEX_EVENT EC_WMT_EVENT_BASE -// WindowsMedia SDK-originated file indexing status, sent by WMSDK-based filters -// -// lParam1 is one of the enum WMT_STATUS messages listed below, sent by the WindowsMedia SDK -// lParam2 is specific to the lParam event -// -// the following WMT_STATUS messages are sent for this event: -// WMT_STARTED - lParam2 is 0 -// WMT_CLOSED - lParam2 is 0 -// WMT_INDEX_PROGRESS - lParam2 is a DWORD containing the progress percent complete -// -#define EC_WMT_EVENT EC_WMT_EVENT_BASE+1 -// WindowsMedia SDK-originated event, sent by WMSDK-based filters -// -// lParam1 is one of the enum WMT_STATUS messages listed below, sent by the WindowsMedia SDK -// lParam2 is a pointer an AM_WMT_EVENT_DATA structure where, -// hrStatus is the status code sent by the wmsdk -// pData is specific to the lParam1 event -// -// the following WMT_STATUS messages are sent by the WMSDK Reader filter for this event: -// WMT_NO_RIGHTS - pData is a pointer to a WCHAR string containing a challenge URL -// WMT_ACQUIRE_LICENSE - lParam2 is a pointer to a WM_GET_LICENSE_DATA struct -// WMT_NO_RIGHTS_EX - lParam2 is a pointer to a WM_GET_LICENSE_DATA struct -// WMT_NEEDS_INDIVIDUALIZATION - lParam2 is NULL -// WMT_INDIVIDUALIZE - lParam2 is a pointer to a WM_INDIVIDUALIZE_STATUS struct -// -// end WMSDK-originated events -//----------------------------------------- - - -#define EC_BUILT 0x300 -// Sent to notify transition from unbuilt to built state - - -#define EC_UNBUILT 0x301 -// Sent to notify transtion from built to unbuilt state diff --git a/import/DirectX8/include/il21dec.h b/import/DirectX8/include/il21dec.h deleted file mode 100644 index a2c7fc67b..000000000 --- a/import/DirectX8/include/il21dec.h +++ /dev/null @@ -1,112 +0,0 @@ -//------------------------------------------------------------------------------ -// File: IL21Dec.h -// -// Desc: Line 21 Decoder related definitions and interfaces for ActiveMovie. -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __IL21DEC__ -#define __IL21DEC__ - - -// -// Some enum data types used as line 21 decoder params by the interface -// -typedef enum _AM_LINE21_CCLEVEL { // should we use TC1, TC2 in stead? - AM_L21_CCLEVEL_TC2 = 0 -} AM_LINE21_CCLEVEL, *PAM_LINE21_CCLEVEL ; - -typedef enum _AM_LINE21_CCSERVICE { - AM_L21_CCSERVICE_None = 0, - AM_L21_CCSERVICE_Caption1, - AM_L21_CCSERVICE_Caption2, - AM_L21_CCSERVICE_Text1, - AM_L21_CCSERVICE_Text2, - AM_L21_CCSERVICE_XDS, - AM_L21_CCSERVICE_DefChannel = 10, - AM_L21_CCSERVICE_Invalid -} AM_LINE21_CCSERVICE, *PAM_LINE21_CCSERVICE ; - -typedef enum _AM_LINE21_CCSTATE { - AM_L21_CCSTATE_Off = 0, - AM_L21_CCSTATE_On -} AM_LINE21_CCSTATE, *PAM_LINE21_CCSTATE ; - -typedef enum _AM_LINE21_CCSTYLE { - AM_L21_CCSTYLE_None = 0, - AM_L21_CCSTYLE_PopOn, - AM_L21_CCSTYLE_PaintOn, - AM_L21_CCSTYLE_RollUp -} AM_LINE21_CCSTYLE, *PAM_LINE21_CCSTYLE ; - -typedef enum _AM_LINE21_DRAWBGMODE { - AM_L21_DRAWBGMODE_Opaque, - AM_L21_DRAWBGMODE_Transparent -} AM_LINE21_DRAWBGMODE, *PAM_LINE21_DRAWBGMODE ; - - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -// -// Line 21 Decoder standard COM interface -// -DECLARE_INTERFACE_(IAMLine21Decoder, IUnknown) -{ - public: - // - // Decoder options to be used by apps - // - - // What is the decoder's level - STDMETHOD(GetDecoderLevel)(THIS_ AM_LINE21_CCLEVEL *lpLevel) PURE ; - // supported level value is AM_L21Level_TC2 only - // skipping the SetDecoderLevel( ) - - // Which of the services is being currently used - STDMETHOD(GetCurrentService)(THIS_ AM_LINE21_CCSERVICE *lpService) PURE ; - STDMETHOD(SetCurrentService)(THIS_ AM_LINE21_CCSERVICE Service) PURE ; - // supported service values are AM_L21Service_Caption1, - // AM_L21Service_Caption2, AM_L21Service_Text1, AM_L21Service_Text2, - // AM_L21Service_XDS, AM_L21Service_None) - - // Query/Set the service state (On/Off) - // supported state values are AM_L21State_On and AM_L21State_Off - STDMETHOD(GetServiceState)(THIS_ AM_LINE21_CCSTATE *lpState) PURE ; - STDMETHOD(SetServiceState)(THIS_ AM_LINE21_CCSTATE State) PURE ; - - // - // Output options to be used by downstream filters - // - - // What size, bitdepth, etc. should the output video be - STDMETHOD(GetOutputFormat)(THIS_ LPBITMAPINFOHEADER lpbmih) PURE ; - // GetOutputFormat() method, if successful, returns - // 1. S_FALSE if no output format has so far been defined by downstream filters - // 2. S_OK if an output format has already been defined by downstream filters - STDMETHOD(SetOutputFormat)(THIS_ LPBITMAPINFO lpbmi) PURE ; - - // Specify physical color to be used in colorkeying the background - // for overlay mixing - STDMETHOD(GetBackgroundColor)(THIS_ DWORD *pdwPhysColor) PURE ; - STDMETHOD(SetBackgroundColor)(THIS_ DWORD dwPhysColor) PURE ; - - // Specify if whole output bitmap should be redrawn for each sample - STDMETHOD(GetRedrawAlways)(THIS_ LPBOOL lpbOption) PURE ; - STDMETHOD(SetRedrawAlways)(THIS_ BOOL bOption) PURE ; - - // Specify if the caption text background should be opaque/transparent - STDMETHOD(GetDrawBackgroundMode)(THIS_ AM_LINE21_DRAWBGMODE *lpMode) PURE ; - STDMETHOD(SetDrawBackgroundMode)(THIS_ AM_LINE21_DRAWBGMODE Mode) PURE ; - // supported mode values are AM_L21_DrawBGMode_Opaque and - // AM_L21_DrawBGMode_Transparent - -} ; - -#ifdef __cplusplus -} -#endif // __cplusplus -#endif // __IL21DEC__ diff --git a/import/DirectX8/include/ks.h b/import/DirectX8/include/ks.h deleted file mode 100644 index 2ccf3f469..000000000 --- a/import/DirectX8/include/ks.h +++ /dev/null @@ -1,11337 +0,0 @@ -/*++ - -Copyright (c) Microsoft Corporation. All rights reserved. - -Module Name: - - ks.h - -Abstract: - - Windows Driver Model/Connection and Streaming Architecture (WDM-CSA) - core definitions. - ---*/ - -#if !defined(_KS_) -#define _KS_ - -#if defined(__TCS__) -#define _KS_NO_ANONYMOUS_STRUCTURES_ 1 -#endif - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// Separate the updated Windows XP version of this header from the downlevel -// version that shipped with the DirectX 8.0 SDK. Since development -// on BDA technology continued for Windows XP, some changes were made to -// this file in order to improve the interface and functionality. -// -// To maintain compatibility with older applications which rely on the -// DirectX 8.0 versions of these files, the DirectX 8.1 version includes -// both the Windows XP content and the DirectX 8.0 content, which are -// separated by the #if (WINVER >= 0x501) preprocessor directive. -// -// Therefore, if you define WINVER to be 0x501 to specify Windows XP, -// the revised content will be compiled. Otherwise, the original -// DirectX 8.0 content will be used. -// -///////////////////////////////////////////////////////////////////////////// - -#if (WINVER >= 0x501) // Windows XP content - - -#if !defined(_NTRTL_) - #ifndef DEFINE_GUIDEX - #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name - #endif // !defined(DEFINE_GUIDEX) - - #ifndef STATICGUIDOF - #define STATICGUIDOF(guid) STATIC_##guid - #endif // !defined(STATICGUIDOF) -#endif // !defined(_NTRTL_) - -#ifndef SIZEOF_ARRAY - #define SIZEOF_ARRAY(ar) (sizeof(ar)/sizeof((ar)[0])) -#endif // !defined(SIZEOF_ARRAY) - -#if defined(__cplusplus) && _MSC_VER >= 1100 -#define DEFINE_GUIDSTRUCT(g, n) struct __declspec(uuid(g)) n -#define DEFINE_GUIDNAMED(n) __uuidof(struct n) -#else // !defined(__cplusplus) -#define DEFINE_GUIDSTRUCT(g, n) DEFINE_GUIDEX(n) -#define DEFINE_GUIDNAMED(n) n -#endif // !defined(__cplusplus) - -//=========================================================================== - -#define STATIC_GUID_NULL \ - 0x00000000L, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - -DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000", GUID_NULL); -#define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL) - -//=========================================================================== - -#define IOCTL_KS_PROPERTY CTL_CODE(FILE_DEVICE_KS, 0x000, METHOD_NEITHER, FILE_ANY_ACCESS) -#define IOCTL_KS_ENABLE_EVENT CTL_CODE(FILE_DEVICE_KS, 0x001, METHOD_NEITHER, FILE_ANY_ACCESS) -#define IOCTL_KS_DISABLE_EVENT CTL_CODE(FILE_DEVICE_KS, 0x002, METHOD_NEITHER, FILE_ANY_ACCESS) -#define IOCTL_KS_METHOD CTL_CODE(FILE_DEVICE_KS, 0x003, METHOD_NEITHER, FILE_ANY_ACCESS) -#define IOCTL_KS_WRITE_STREAM CTL_CODE(FILE_DEVICE_KS, 0x004, METHOD_NEITHER, FILE_WRITE_ACCESS) -#define IOCTL_KS_READ_STREAM CTL_CODE(FILE_DEVICE_KS, 0x005, METHOD_NEITHER, FILE_READ_ACCESS) -#define IOCTL_KS_RESET_STATE CTL_CODE(FILE_DEVICE_KS, 0x006, METHOD_NEITHER, FILE_ANY_ACCESS) - -//=========================================================================== - -typedef enum { - KSRESET_BEGIN, - KSRESET_END -} KSRESET; - -typedef enum { - KSSTATE_STOP, - KSSTATE_ACQUIRE, - KSSTATE_PAUSE, - KSSTATE_RUN -} KSSTATE, *PKSSTATE; - -#define KSPRIORITY_LOW 0x00000001 -#define KSPRIORITY_NORMAL 0x40000000 -#define KSPRIORITY_HIGH 0x80000000 -#define KSPRIORITY_EXCLUSIVE 0xFFFFFFFF - -typedef struct { - ULONG PriorityClass; - ULONG PrioritySubClass; -} KSPRIORITY, *PKSPRIORITY; - -typedef struct { - union { -#if defined( _KS_NO_ANONYMOUS_STRUCTURES_ ) - struct _IDENTIFIER { -#else - struct { -#endif - GUID Set; - ULONG Id; - ULONG Flags; - }; - LONGLONG Alignment; - }; -} KSIDENTIFIER, *PKSIDENTIFIER; - -typedef KSIDENTIFIER KSPROPERTY, *PKSPROPERTY, KSMETHOD, *PKSMETHOD, KSEVENT, *PKSEVENT; - -#define KSMETHOD_TYPE_NONE 0x00000000 -#define KSMETHOD_TYPE_READ 0x00000001 -#define KSMETHOD_TYPE_WRITE 0x00000002 -#define KSMETHOD_TYPE_MODIFY 0x00000003 -#define KSMETHOD_TYPE_SOURCE 0x00000004 - -#define KSMETHOD_TYPE_SEND 0x00000001 -#define KSMETHOD_TYPE_SETSUPPORT 0x00000100 -#define KSMETHOD_TYPE_BASICSUPPORT 0x00000200 - -#define KSMETHOD_TYPE_TOPOLOGY 0x10000000 - -#define KSPROPERTY_TYPE_GET 0x00000001 -#define KSPROPERTY_TYPE_SET 0x00000002 -#define KSPROPERTY_TYPE_SETSUPPORT 0x00000100 -#define KSPROPERTY_TYPE_BASICSUPPORT 0x00000200 -#define KSPROPERTY_TYPE_RELATIONS 0x00000400 -#define KSPROPERTY_TYPE_SERIALIZESET 0x00000800 -#define KSPROPERTY_TYPE_UNSERIALIZESET 0x00001000 -#define KSPROPERTY_TYPE_SERIALIZERAW 0x00002000 -#define KSPROPERTY_TYPE_UNSERIALIZERAW 0x00004000 -#define KSPROPERTY_TYPE_SERIALIZESIZE 0x00008000 -#define KSPROPERTY_TYPE_DEFAULTVALUES 0x00010000 - -#define KSPROPERTY_TYPE_TOPOLOGY 0x10000000 - -typedef struct { - KSPROPERTY Property; - ULONG NodeId; - ULONG Reserved; -} KSP_NODE, *PKSP_NODE; - -typedef struct { - KSMETHOD Method; - ULONG NodeId; - ULONG Reserved; -} KSM_NODE, *PKSM_NODE; - -typedef struct { - KSEVENT Event; - ULONG NodeId; - ULONG Reserved; -} KSE_NODE, *PKSE_NODE; - -#define STATIC_KSPROPTYPESETID_General \ - 0x97E99BA0L, 0xBDEA, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000", KSPROPTYPESETID_General); -#define KSPROPTYPESETID_General DEFINE_GUIDNAMED(KSPROPTYPESETID_General) - -#if defined(_NTDDK_) && !defined(__wtypes_h__) -enum VARENUM { - VT_EMPTY = 0, - VT_NULL = 1, - VT_I2 = 2, - VT_I4 = 3, - VT_R4 = 4, - VT_R8 = 5, - VT_CY = 6, - VT_DATE = 7, - VT_BSTR = 8, - VT_DISPATCH = 9, - VT_ERROR = 10, - VT_BOOL = 11, - VT_VARIANT = 12, - VT_UNKNOWN = 13, - VT_DECIMAL = 14, - VT_I1 = 16, - VT_UI1 = 17, - VT_UI2 = 18, - VT_UI4 = 19, - VT_I8 = 20, - VT_UI8 = 21, - VT_INT = 22, - VT_UINT = 23, - VT_VOID = 24, - VT_HRESULT = 25, - VT_PTR = 26, - VT_SAFEARRAY = 27, - VT_CARRAY = 28, - VT_USERDEFINED = 29, - VT_LPSTR = 30, - VT_LPWSTR = 31, - VT_FILETIME = 64, - VT_BLOB = 65, - VT_STREAM = 66, - VT_STORAGE = 67, - VT_STREAMED_OBJECT = 68, - VT_STORED_OBJECT = 69, - VT_BLOB_OBJECT = 70, - VT_CF = 71, - VT_CLSID = 72, - VT_VECTOR = 0x1000, - VT_ARRAY = 0x2000, - VT_BYREF = 0x4000, - VT_RESERVED = 0x8000, - VT_ILLEGAL = 0xffff, - VT_ILLEGALMASKED = 0xfff, - VT_TYPEMASK = 0xfff -}; -#endif // _NTDDK_ && !__wtypes_h__ - -typedef struct { - ULONG Size; - ULONG Count; -} KSMULTIPLE_ITEM, *PKSMULTIPLE_ITEM; - -typedef struct { - ULONG AccessFlags; - ULONG DescriptionSize; - KSIDENTIFIER PropTypeSet; - ULONG MembersListCount; - ULONG Reserved; -} KSPROPERTY_DESCRIPTION, *PKSPROPERTY_DESCRIPTION; - -#define KSPROPERTY_MEMBER_RANGES 0x00000001 -#define KSPROPERTY_MEMBER_STEPPEDRANGES 0x00000002 -#define KSPROPERTY_MEMBER_VALUES 0x00000003 - -#define KSPROPERTY_MEMBER_FLAG_DEFAULT 0x00000001 -#define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL 0x00000002 -#define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM 0x00000004 - -typedef struct { - ULONG MembersFlags; - ULONG MembersSize; - ULONG MembersCount; - ULONG Flags; -} KSPROPERTY_MEMBERSHEADER, *PKSPROPERTY_MEMBERSHEADER; - -typedef union { -#if defined( _KS_NO_ANONYMOUS_STRUCTURES_ ) - struct _SIGNED { -#else - struct { -#endif - LONG SignedMinimum; - LONG SignedMaximum; - }; -#if defined( _KS_NO_ANONYMOUS_STRUCTURES_ ) - struct _UNSIGNED { -#else - struct { -#endif - ULONG UnsignedMinimum; - ULONG UnsignedMaximum; - }; -} KSPROPERTY_BOUNDS_LONG, *PKSPROPERTY_BOUNDS_LONG; - -typedef union { -#if defined( _KS_NO_ANONYMOUS_STRUCTURES_ ) - struct _SIGNED64 { -#else - struct { -#endif - LONGLONG SignedMinimum; - LONGLONG SignedMaximum; - }; -#if defined( _KS_NO_ANONYMOUS_STRUCTURES_ ) - struct _UNSIGNED64 { -#else - struct { -#endif -#if defined(_NTDDK_) - ULONGLONG UnsignedMinimum; - ULONGLONG UnsignedMaximum; -#else // !_NTDDK_ - DWORDLONG UnsignedMinimum; - DWORDLONG UnsignedMaximum; -#endif // !_NTDDK_ - }; -} KSPROPERTY_BOUNDS_LONGLONG, *PKSPROPERTY_BOUNDS_LONGLONG; - -typedef struct { - ULONG SteppingDelta; - ULONG Reserved; - KSPROPERTY_BOUNDS_LONG Bounds; -} KSPROPERTY_STEPPING_LONG, *PKSPROPERTY_STEPPING_LONG; - -typedef struct { -#if defined(_NTDDK_) - ULONGLONG SteppingDelta; -#else // !_NTDDK_ - DWORDLONG SteppingDelta; -#endif // !_NTDDK_ - KSPROPERTY_BOUNDS_LONGLONG Bounds; -} KSPROPERTY_STEPPING_LONGLONG, *PKSPROPERTY_STEPPING_LONGLONG; - -//=========================================================================== - -#if defined(_NTDDK_) -// -// Structure forward declarations. -// -typedef struct _KSDEVICE_DESCRIPTOR -KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR; -typedef struct _KSDEVICE_DISPATCH -KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH; -typedef struct _KSDEVICE -KSDEVICE, *PKSDEVICE; -typedef struct _KSFILTERFACTORY -KSFILTERFACTORY, *PKSFILTERFACTORY; -typedef struct _KSFILTER_DESCRIPTOR -KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR; -typedef struct _KSFILTER_DISPATCH -KSFILTER_DISPATCH, *PKSFILTER_DISPATCH; -typedef struct _KSFILTER -KSFILTER, *PKSFILTER; -typedef struct _KSPIN_DESCRIPTOR_EX -KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX; -typedef struct _KSPIN_DISPATCH -KSPIN_DISPATCH, *PKSPIN_DISPATCH; -typedef struct _KSCLOCK_DISPATCH -KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH; -typedef struct _KSALLOCATOR_DISPATCH -KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH; -typedef struct _KSPIN -KSPIN, *PKSPIN; -typedef struct _KSNODE_DESCRIPTOR -KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR; -typedef struct _KSSTREAM_POINTER_OFFSET -KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET; -typedef struct _KSSTREAM_POINTER -KSSTREAM_POINTER, *PKSSTREAM_POINTER; -typedef struct _KSMAPPING -KSMAPPING, *PKSMAPPING; -typedef struct _KSPROCESSPIN -KSPROCESSPIN, *PKSPROCESSPIN; -typedef struct _KSPROCESSPIN_INDEXENTRY -KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY; -#endif // _NTDDK_ - -typedef PVOID PKSWORKER; - -typedef struct { - ULONG NotificationType; - union { - struct { - HANDLE Event; - ULONG_PTR Reserved[2]; - } EventHandle; - struct { - HANDLE Semaphore; - ULONG Reserved; - LONG Adjustment; - } SemaphoreHandle; -#if defined(_NTDDK_) - struct { - PVOID Event; - KPRIORITY Increment; - ULONG_PTR Reserved; - } EventObject; - struct { - PVOID Semaphore; - KPRIORITY Increment; - LONG Adjustment; - } SemaphoreObject; - struct { - PKDPC Dpc; - ULONG ReferenceCount; - ULONG_PTR Reserved; - } Dpc; - struct { - PWORK_QUEUE_ITEM WorkQueueItem; - WORK_QUEUE_TYPE WorkQueueType; - ULONG_PTR Reserved; - } WorkItem; - struct { - PWORK_QUEUE_ITEM WorkQueueItem; - PKSWORKER KsWorkerObject; - ULONG_PTR Reserved; - } KsWorkItem; -// @@BEGIN_DDKSPLIT - struct { - PKSFILTER Filter; - ULONG_PTR Reserved[2]; - } KsFilterProcessing; - struct { - PKSPIN Pin; - ULONG_PTR Reserved[2]; - } KsPinProcessing; -// @@END_DDKSPLIT -#endif // defined(_NTDDK_) - struct { - PVOID Unused; - LONG_PTR Alignment[2]; - } Alignment; - }; -} KSEVENTDATA, *PKSEVENTDATA; - -#define KSEVENTF_EVENT_HANDLE 0x00000001 -#define KSEVENTF_SEMAPHORE_HANDLE 0x00000002 -#if defined(_NTDDK_) -#define KSEVENTF_EVENT_OBJECT 0x00000004 -#define KSEVENTF_SEMAPHORE_OBJECT 0x00000008 -#define KSEVENTF_DPC 0x00000010 -#define KSEVENTF_WORKITEM 0x00000020 -#define KSEVENTF_KSWORKITEM 0x00000080 -// @@BEGIN_DDKSPLIT -#define KSEVENTF_KSFILTERPROCESSING 0x00000100 -#define KSEVENTF_KSPINPROCESSING 0x00000200 -// @@END_DDKSPLIT -#endif // defined(_NTDDK_) - -#define KSEVENT_TYPE_ENABLE 0x00000001 -#define KSEVENT_TYPE_ONESHOT 0x00000002 -#define KSEVENT_TYPE_ENABLEBUFFERED 0x00000004 -#define KSEVENT_TYPE_SETSUPPORT 0x00000100 -#define KSEVENT_TYPE_BASICSUPPORT 0x00000200 -#define KSEVENT_TYPE_QUERYBUFFER 0x00000400 - -#define KSEVENT_TYPE_TOPOLOGY 0x10000000 - -typedef struct { - KSEVENT Event; - PKSEVENTDATA EventData; - PVOID Reserved; -} KSQUERYBUFFER, *PKSQUERYBUFFER; - -typedef struct { - ULONG Size; - ULONG Flags; - union { - HANDLE ObjectHandle; - PVOID ObjectPointer; - }; - PVOID Reserved; - KSEVENT Event; - KSEVENTDATA EventData; -} KSRELATIVEEVENT; - -#define KSRELATIVEEVENT_FLAG_HANDLE 0x00000001 -#define KSRELATIVEEVENT_FLAG_POINTER 0x00000002 - -//=========================================================================== - -typedef struct { - KSEVENTDATA EventData; - LONGLONG MarkTime; -} KSEVENT_TIME_MARK, *PKSEVENT_TIME_MARK; - -typedef struct { - KSEVENTDATA EventData; - LONGLONG TimeBase; - LONGLONG Interval; -} KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL; - -typedef struct { - LONGLONG TimeBase; - LONGLONG Interval; -} KSINTERVAL, *PKSINTERVAL; - -//=========================================================================== - -#define STATIC_KSPROPSETID_General\ - 0x1464EDA5L, 0x6A8F, 0x11D1, 0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("1464EDA5-6A8F-11D1-9AA7-00A0C9223196", KSPROPSETID_General); -#define KSPROPSETID_General DEFINE_GUIDNAMED(KSPROPSETID_General) - -typedef enum { - KSPROPERTY_GENERAL_COMPONENTID -} KSPROPERTY_GENERAL; - -typedef struct { - GUID Manufacturer; - GUID Product; - GUID Component; - GUID Name; - ULONG Version; - ULONG Revision; -} KSCOMPONENTID, *PKSCOMPONENTID; - -#define DEFINE_KSPROPERTY_ITEM_GENERAL_COMPONENTID(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_GENERAL_COMPONENTID,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSCOMPONENTID),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define STATIC_KSMETHODSETID_StreamIo\ - 0x65D003CAL, 0x1523, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("65D003CA-1523-11D2-B27A-00A0C9223196", KSMETHODSETID_StreamIo); -#define KSMETHODSETID_StreamIo DEFINE_GUIDNAMED(KSMETHODSETID_StreamIo) - -typedef enum { - KSMETHOD_STREAMIO_READ, - KSMETHOD_STREAMIO_WRITE -} KSMETHOD_STREAMIO; - -#define DEFINE_KSMETHOD_ITEM_STREAMIO_READ(Handler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_STREAMIO_READ,\ - KSMETHOD_TYPE_WRITE,\ - (Handler),\ - sizeof(KSMETHOD),\ - 0,\ - NULL) - -#define DEFINE_KSMETHOD_ITEM_STREAMIO_WRITE(Handler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_STREAMIO_WRITE,\ - KSMETHOD_TYPE_READ,\ - (Handler),\ - sizeof(KSMETHOD),\ - 0,\ - NULL) - -#define STATIC_KSPROPSETID_MediaSeeking\ - 0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196", KSPROPSETID_MediaSeeking); -#define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking) - -typedef enum { - KSPROPERTY_MEDIASEEKING_CAPABILITIES, - KSPROPERTY_MEDIASEEKING_FORMATS, - KSPROPERTY_MEDIASEEKING_TIMEFORMAT, - KSPROPERTY_MEDIASEEKING_POSITION, - KSPROPERTY_MEDIASEEKING_STOPPOSITION, - KSPROPERTY_MEDIASEEKING_POSITIONS, - KSPROPERTY_MEDIASEEKING_DURATION, - KSPROPERTY_MEDIASEEKING_AVAILABLE, - KSPROPERTY_MEDIASEEKING_PREROLL, - KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT -} KSPROPERTY_MEDIASEEKING; - -typedef enum { - KS_SEEKING_NoPositioning, - KS_SEEKING_AbsolutePositioning, - KS_SEEKING_RelativePositioning, - KS_SEEKING_IncrementalPositioning, - KS_SEEKING_PositioningBitsMask = 0x3, - KS_SEEKING_SeekToKeyFrame, - KS_SEEKING_ReturnTime = 0x8 -} KS_SEEKING_FLAGS; - -typedef enum { - KS_SEEKING_CanSeekAbsolute = 0x1, - KS_SEEKING_CanSeekForwards = 0x2, - KS_SEEKING_CanSeekBackwards = 0x4, - KS_SEEKING_CanGetCurrentPos = 0x8, - KS_SEEKING_CanGetStopPos = 0x10, - KS_SEEKING_CanGetDuration = 0x20, - KS_SEEKING_CanPlayBackwards = 0x40 -} KS_SEEKING_CAPABILITIES; - -typedef struct { - LONGLONG Current; - LONGLONG Stop; - KS_SEEKING_FLAGS CurrentFlags; - KS_SEEKING_FLAGS StopFlags; -} KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS; - -typedef struct { - LONGLONG Earliest; - LONGLONG Latest; -} KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE; - -typedef struct { - KSPROPERTY Property; - GUID SourceFormat; - GUID TargetFormat; - LONGLONG Time; -} KSP_TIMEFORMAT, *PKSP_TIMEFORMAT; - -#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_CAPABILITIES,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KS_SEEKING_CAPABILITIES),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_FORMATS,\ - (Handler),\ - sizeof(KSPROPERTY),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_TIMEFORMAT,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(GUID),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_POSITION,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_STOPPOSITION,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_POSITIONS,\ - NULL,\ - sizeof(KSPROPERTY),\ - sizeof(KSPROPERTY_POSITIONS),\ - (Handler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_DURATION,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_AVAILABLE,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSPROPERTY_MEDIAAVAILABLE),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_PREROLL,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT,\ - (Handler),\ - sizeof(KSP_TIMEFORMAT),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - -//=========================================================================== - -#define STATIC_KSPROPSETID_Topology\ - 0x720D4AC0L, 0x7533, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000", KSPROPSETID_Topology); -#define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology) - -typedef enum { - KSPROPERTY_TOPOLOGY_CATEGORIES, - KSPROPERTY_TOPOLOGY_NODES, - KSPROPERTY_TOPOLOGY_CONNECTIONS, - KSPROPERTY_TOPOLOGY_NAME -} KSPROPERTY_TOPOLOGY; - -#define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_TOPOLOGY_CATEGORIES,\ - (Handler),\ - sizeof(KSPROPERTY),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_TOPOLOGY_NODES,\ - (Handler),\ - sizeof(KSPROPERTY),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_TOPOLOGY_CONNECTIONS,\ - (Handler),\ - sizeof(KSPROPERTY),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_TOPOLOGY_NAME,\ - (Handler),\ - sizeof(KSP_NODE),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet, Handler)\ -DEFINE_KSPROPERTY_TABLE(TopologySet) {\ - DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler),\ - DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler),\ - DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler),\ - DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\ -} - -//============================================================================= - -// -// properties used by graph manager to talk to particular filters -// -#if defined(_NTDDK_) - -#define STATIC_KSPROPSETID_GM \ - 0xAF627536L, 0xE719, 0x11D2, 0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D -DEFINE_GUIDSTRUCT("AF627536-E719-11D2-8A1D-006097D2DF5D", KSPROPSETID_GM); -#define KSPROPSETID_GM DEFINE_GUIDNAMED(KSPROPSETID_GM) - -typedef VOID (*PFNKSGRAPHMANAGER_NOTIFY)(IN PFILE_OBJECT GraphManager, - IN ULONG EventId, - IN PVOID Filter, - IN PVOID Pin, - IN PVOID Frame, - IN ULONG Duration); - -typedef struct KSGRAPHMANAGER_FUNCTIONTABLE { - PFNKSGRAPHMANAGER_NOTIFY NotifyEvent; -} KSGRAPHMANAGER_FUNCTIONTABLE, PKSGRAPHMANAGER_FUNCTIONTABLE; - -typedef struct _KSPROPERTY_GRAPHMANAGER_INTERFACE { - PFILE_OBJECT GraphManager; - KSGRAPHMANAGER_FUNCTIONTABLE FunctionTable; -} KSPROPERTY_GRAPHMANAGER_INTERFACE, *PKSPROPERTY_GRAPHMANAGER_INTERFACE; - - -// -// Commands -// -typedef enum { - KSPROPERTY_GM_GRAPHMANAGER, - KSPROPERTY_GM_TIMESTAMP_CLOCK, - KSPROPERTY_GM_RATEMATCH, - KSPROPERTY_GM_RENDER_CLOCK, -} KSPROPERTY_GM; - -#endif - -//=========================================================================== - - -#define STATIC_KSCATEGORY_BRIDGE \ - 0x085AFF00L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000", KSCATEGORY_BRIDGE); -#define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE) - -#define STATIC_KSCATEGORY_CAPTURE \ - 0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_CAPTURE); -#define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE) - -#define STATIC_KSCATEGORY_RENDER \ - 0x65E8773EL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_RENDER); -#define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER) - -#define STATIC_KSCATEGORY_MIXER \ - 0xAD809C00L, 0x7B88, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000", KSCATEGORY_MIXER); -#define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER) - -#define STATIC_KSCATEGORY_SPLITTER \ - 0x0A4252A0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_SPLITTER); -#define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER) - -#define STATIC_KSCATEGORY_DATACOMPRESSOR \ - 0x1E84C900L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATACOMPRESSOR); -#define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR) - -#define STATIC_KSCATEGORY_DATADECOMPRESSOR \ - 0x2721AE20L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATADECOMPRESSOR); -#define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR) - -#define STATIC_KSCATEGORY_DATATRANSFORM \ - 0x2EB07EA0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATATRANSFORM); -#define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM) - -#define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \ - 0xCF1DDA2CL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_COMMUNICATIONSTRANSFORM); -#define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM) - -#define STATIC_KSCATEGORY_INTERFACETRANSFORM \ - 0xCF1DDA2DL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_INTERFACETRANSFORM); -#define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM) - -#define STATIC_KSCATEGORY_MEDIUMTRANSFORM \ - 0xCF1DDA2EL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_MEDIUMTRANSFORM); -#define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM) - -#define STATIC_KSCATEGORY_FILESYSTEM \ - 0x760FED5EL, 0x9357, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196", KSCATEGORY_FILESYSTEM); -#define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM) - -// KSNAME_Clock -#define STATIC_KSCATEGORY_CLOCK \ - 0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSCATEGORY_CLOCK); -#define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK) - -#define STATIC_KSCATEGORY_PROXY \ - 0x97EBAACAL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_PROXY); -#define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY) - -#define STATIC_KSCATEGORY_QUALITY \ - 0x97EBAACBL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_QUALITY); -#define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY) - -typedef struct { - ULONG FromNode; - ULONG FromNodePin; - ULONG ToNode; - ULONG ToNodePin; -} KSTOPOLOGY_CONNECTION, *PKSTOPOLOGY_CONNECTION; - -typedef struct { - ULONG CategoriesCount; - const GUID* Categories; - ULONG TopologyNodesCount; - const GUID* TopologyNodes; - ULONG TopologyConnectionsCount; - const KSTOPOLOGY_CONNECTION* TopologyConnections; - const GUID* TopologyNodesNames; - ULONG Reserved; -} KSTOPOLOGY, *PKSTOPOLOGY; - -#define KSFILTER_NODE ((ULONG)-1) -#define KSALL_NODES ((ULONG)-1) - -typedef struct { - ULONG CreateFlags; - ULONG Node; -} KSNODE_CREATE, *PKSNODE_CREATE; - -//=========================================================================== - -// TIME_FORMAT_NONE -#define STATIC_KSTIME_FORMAT_NONE STATIC_GUID_NULL -#define KSTIME_FORMAT_NONE GUID_NULL - -// TIME_FORMAT_FRAME -#define STATIC_KSTIME_FORMAT_FRAME\ - 0x7b785570L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 -DEFINE_GUIDSTRUCT("7b785570-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_FRAME); -#define KSTIME_FORMAT_FRAME DEFINE_GUIDNAMED(KSTIME_FORMAT_FRAME) - -// TIME_FORMAT_BYTE -#define STATIC_KSTIME_FORMAT_BYTE\ - 0x7b785571L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 -DEFINE_GUIDSTRUCT("7b785571-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_BYTE); -#define KSTIME_FORMAT_BYTE DEFINE_GUIDNAMED(KSTIME_FORMAT_BYTE) - -// TIME_FORMAT_SAMPLE -#define STATIC_KSTIME_FORMAT_SAMPLE\ - 0x7b785572L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 -DEFINE_GUIDSTRUCT("7b785572-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_SAMPLE); -#define KSTIME_FORMAT_SAMPLE DEFINE_GUIDNAMED(KSTIME_FORMAT_SAMPLE) - -// TIME_FORMAT_FIELD -#define STATIC_KSTIME_FORMAT_FIELD\ - 0x7b785573L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 -DEFINE_GUIDSTRUCT("7b785573-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_FIELD); -#define KSTIME_FORMAT_FIELD DEFINE_GUIDNAMED(KSTIME_FORMAT_FIELD) - -// TIME_FORMAT_MEDIA_TIME -#define STATIC_KSTIME_FORMAT_MEDIA_TIME\ - 0x7b785574L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 -DEFINE_GUIDSTRUCT("7b785574-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_MEDIA_TIME); -#define KSTIME_FORMAT_MEDIA_TIME DEFINE_GUIDNAMED(KSTIME_FORMAT_MEDIA_TIME) - -//=========================================================================== - -typedef KSIDENTIFIER KSPIN_INTERFACE, *PKSPIN_INTERFACE; - -#define STATIC_KSINTERFACESETID_Standard \ - 0x1A8766A0L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000", KSINTERFACESETID_Standard); -#define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard) - -typedef enum { - KSINTERFACE_STANDARD_STREAMING, - KSINTERFACE_STANDARD_LOOPED_STREAMING, - KSINTERFACE_STANDARD_CONTROL -} KSINTERFACE_STANDARD; - -#define STATIC_KSINTERFACESETID_FileIo \ - 0x8C6F932CL, 0xE771, 0x11D0, 0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196", KSINTERFACESETID_FileIo); -#define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo) - -typedef enum { - KSINTERFACE_FILEIO_STREAMING -} KSINTERFACE_FILEIO; - -//=========================================================================== - -#define KSMEDIUM_TYPE_ANYINSTANCE 0 - -#define STATIC_KSMEDIUMSETID_Standard \ - 0x4747B320L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000", KSMEDIUMSETID_Standard); -#define KSMEDIUMSETID_Standard DEFINE_GUIDNAMED(KSMEDIUMSETID_Standard) - -//For compatibility only -#define KSMEDIUM_STANDARD_DEVIO KSMEDIUM_TYPE_ANYINSTANCE - -//=========================================================================== - -#define STATIC_KSPROPSETID_Pin\ - 0x8C134960L, 0x51AD, 0x11CF, 0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000", KSPROPSETID_Pin); -#define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin) - -typedef enum { - KSPROPERTY_PIN_CINSTANCES, - KSPROPERTY_PIN_CTYPES, - KSPROPERTY_PIN_DATAFLOW, - KSPROPERTY_PIN_DATARANGES, - KSPROPERTY_PIN_DATAINTERSECTION, - KSPROPERTY_PIN_INTERFACES, - KSPROPERTY_PIN_MEDIUMS, - KSPROPERTY_PIN_COMMUNICATION, - KSPROPERTY_PIN_GLOBALCINSTANCES, - KSPROPERTY_PIN_NECESSARYINSTANCES, - KSPROPERTY_PIN_PHYSICALCONNECTION, - KSPROPERTY_PIN_CATEGORY, - KSPROPERTY_PIN_NAME, - KSPROPERTY_PIN_CONSTRAINEDDATARANGES, - KSPROPERTY_PIN_PROPOSEDATAFORMAT -} KSPROPERTY_PIN; - -typedef struct { - KSPROPERTY Property; - ULONG PinId; - ULONG Reserved; -} KSP_PIN, *PKSP_PIN; - -#define KSINSTANCE_INDETERMINATE ((ULONG)-1) - -typedef struct { - ULONG PossibleCount; - ULONG CurrentCount; -} KSPIN_CINSTANCES, *PKSPIN_CINSTANCES; - -typedef enum { - KSPIN_DATAFLOW_IN = 1, - KSPIN_DATAFLOW_OUT -} KSPIN_DATAFLOW, *PKSPIN_DATAFLOW; - -#define KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION 0 -#define KSDATAFORMAT_TEMPORAL_COMPRESSION (1 << KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION) -#define KSDATAFORMAT_BIT_ATTRIBUTES 1 -#define KSDATAFORMAT_ATTRIBUTES (1 << KSDATAFORMAT_BIT_ATTRIBUTES) - -#define KSDATARANGE_BIT_ATTRIBUTES 1 -#define KSDATARANGE_ATTRIBUTES (1 << KSDATARANGE_BIT_ATTRIBUTES) -#define KSDATARANGE_BIT_REQUIRED_ATTRIBUTES 2 -#define KSDATARANGE_REQUIRED_ATTRIBUTES (1 << KSDATARANGE_BIT_REQUIRED_ATTRIBUTES) - -#if !defined( _MSC_VER ) -typedef struct { - ULONG FormatSize; - ULONG Flags; - ULONG SampleSize; - ULONG Reserved; - GUID MajorFormat; - GUID SubFormat; - GUID Specifier; -} KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE; -#else -typedef union { - struct { - ULONG FormatSize; - ULONG Flags; - ULONG SampleSize; - ULONG Reserved; - GUID MajorFormat; - GUID SubFormat; - GUID Specifier; - }; - LONGLONG Alignment; -} KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE; -#endif - -#define KSATTRIBUTE_REQUIRED 0x00000001 - -typedef struct { - ULONG Size; - ULONG Flags; - GUID Attribute; -} KSATTRIBUTE, *PKSATTRIBUTE; - -#if defined(_NTDDK_) -typedef struct { - ULONG Count; - PKSATTRIBUTE* Attributes; -} KSATTRIBUTE_LIST, *PKSATTRIBUTE_LIST; -#endif // _NTDDK_ - -typedef enum { - KSPIN_COMMUNICATION_NONE, - KSPIN_COMMUNICATION_SINK, - KSPIN_COMMUNICATION_SOURCE, - KSPIN_COMMUNICATION_BOTH, - KSPIN_COMMUNICATION_BRIDGE -} KSPIN_COMMUNICATION, *PKSPIN_COMMUNICATION; - -typedef KSIDENTIFIER KSPIN_MEDIUM, *PKSPIN_MEDIUM; - -typedef struct { - KSPIN_INTERFACE Interface; - KSPIN_MEDIUM Medium; - ULONG PinId; - HANDLE PinToHandle; - KSPRIORITY Priority; -} KSPIN_CONNECT, *PKSPIN_CONNECT; - -typedef struct { - ULONG Size; - ULONG Pin; - WCHAR SymbolicLinkName[1]; -} KSPIN_PHYSICALCONNECTION, *PKSPIN_PHYSICALCONNECTION; - -#if defined(_NTDDK_) -typedef -NTSTATUS -(*PFNKSINTERSECTHANDLER)( - IN PIRP Irp, - IN PKSP_PIN Pin, - IN PKSDATARANGE DataRange, - OUT PVOID Data OPTIONAL - ); -typedef -NTSTATUS -(*PFNKSINTERSECTHANDLEREX)( - IN PVOID Context, - IN PIRP Irp, - IN PKSP_PIN Pin, - IN PKSDATARANGE DataRange, - IN PKSDATARANGE MatchingDataRange, - IN ULONG DataBufferSize, - OUT PVOID Data OPTIONAL, - OUT PULONG DataSize - ); -#endif // _NTDDK_ - -#define DEFINE_KSPIN_INTERFACE_TABLE(tablename)\ - const KSPIN_INTERFACE tablename[] = - -#define DEFINE_KSPIN_INTERFACE_ITEM(guid, interface)\ - {\ - STATICGUIDOF(guid),\ - (interface),\ - 0\ - } - -#define DEFINE_KSPIN_MEDIUM_TABLE( tablename )\ - const KSPIN_MEDIUM tablename[] = - -#define DEFINE_KSPIN_MEDIUM_ITEM(guid, medium)\ - DEFINE_KSPIN_INTERFACE_ITEM(guid, medium) - -#define DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_CINSTANCES,\ - (Handler),\ - sizeof(KSP_PIN),\ - sizeof(KSPIN_CINSTANCES),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_CTYPES,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(ULONG),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_DATAFLOW,\ - (Handler),\ - sizeof(KSP_PIN),\ - sizeof(KSPIN_DATAFLOW),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_DATARANGES,\ - (Handler),\ - sizeof(KSP_PIN),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_DATAINTERSECTION,\ - (Handler),\ - sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_INTERFACES,\ - (Handler),\ - sizeof(KSP_PIN),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_MEDIUMS,\ - (Handler),\ - sizeof(KSP_PIN),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_COMMUNICATION,\ - (Handler),\ - sizeof(KSP_PIN),\ - sizeof(KSPIN_COMMUNICATION),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_GLOBALCINSTANCES,\ - (Handler),\ - sizeof(KSP_PIN),\ - sizeof(KSPIN_CINSTANCES),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_NECESSARYINSTANCES,\ - (Handler),\ - sizeof(KSP_PIN),\ - sizeof(ULONG),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_PHYSICALCONNECTION,\ - (Handler),\ - sizeof(KSP_PIN),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_CATEGORY,\ - (Handler),\ - sizeof(KSP_PIN),\ - sizeof(GUID),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_PIN_NAME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_NAME,\ - (Handler),\ - sizeof(KSP_PIN),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_CONSTRAINEDDATARANGES,\ - (Handler),\ - sizeof(KSP_PIN),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_PROPOSEDATAFORMAT,\ - NULL,\ - sizeof(KSP_PIN),\ - sizeof(KSDATAFORMAT),\ - (Handler), NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_PINSET(PinSet,\ - PropGeneral, PropInstances, PropIntersection)\ -DEFINE_KSPROPERTY_TABLE(PinSet) {\ - DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\ - DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\ - DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral)\ -} - -#define DEFINE_KSPROPERTY_PINSETCONSTRAINED(PinSet,\ - PropGeneral, PropInstances, PropIntersection)\ -DEFINE_KSPROPERTY_TABLE(PinSet) {\ - DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\ - DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\ - DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral)\ -} - -#define STATIC_KSNAME_Filter\ - 0x9b365890L, 0x165f, 0x11d0, 0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 -DEFINE_GUIDSTRUCT("9b365890-165f-11d0-a195-0020afd156e4", KSNAME_Filter); -#define KSNAME_Filter DEFINE_GUIDNAMED(KSNAME_Filter) - -#define KSSTRING_Filter L"{9B365890-165F-11D0-A195-0020AFD156E4}" - -#define STATIC_KSNAME_Pin\ - 0x146F1A80L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000", KSNAME_Pin); -#define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin) - -#define KSSTRING_Pin L"{146F1A80-4791-11D0-A5D6-28DB04C10000}" - -#define STATIC_KSNAME_Clock\ - 0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSNAME_Clock); -#define KSNAME_Clock DEFINE_GUIDNAMED(KSNAME_Clock) - -#define KSSTRING_Clock L"{53172480-4791-11D0-A5D6-28DB04C10000}" - -#define STATIC_KSNAME_Allocator\ - 0x642F5D00L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("642F5D00-4791-11D0-A5D6-28DB04C10000", KSNAME_Allocator); -#define KSNAME_Allocator DEFINE_GUIDNAMED(KSNAME_Allocator) - -#define KSSTRING_Allocator L"{642F5D00-4791-11D0-A5D6-28DB04C10000}" - -#define KSSTRING_AllocatorEx L"{091BB63B-603F-11D1-B067-00A0C9062802}" - -#define STATIC_KSNAME_TopologyNode\ - 0x0621061AL, 0xEE75, 0x11D0, 0xB9, 0x15, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("0621061A-EE75-11D0-B915-00A0C9223196", KSNAME_TopologyNode); -#define KSNAME_TopologyNode DEFINE_GUIDNAMED(KSNAME_TopologyNode) - -#define KSSTRING_TopologyNode L"{0621061A-EE75-11D0-B915-00A0C9223196}" - -#if defined(_NTDDK_) - -typedef struct { - ULONG InterfacesCount; - const KSPIN_INTERFACE* Interfaces; - ULONG MediumsCount; - const KSPIN_MEDIUM* Mediums; - ULONG DataRangesCount; - const PKSDATARANGE* DataRanges; - KSPIN_DATAFLOW DataFlow; - KSPIN_COMMUNICATION Communication; - const GUID* Category; - const GUID* Name; - union { - LONGLONG Reserved; - struct { - ULONG ConstrainedDataRangesCount; - PKSDATARANGE* ConstrainedDataRanges; - }; - }; -} KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR; -typedef const KSPIN_DESCRIPTOR *PCKSPIN_DESCRIPTOR; - -#define DEFINE_KSPIN_DESCRIPTOR_TABLE(tablename)\ - const KSPIN_DESCRIPTOR tablename[] = - -#define DEFINE_KSPIN_DESCRIPTOR_ITEM(\ - InterfacesCount, Interfaces,\ - MediumsCount, Mediums,\ - DataRangesCount, DataRanges,\ - DataFlow, Communication)\ -{\ - InterfacesCount, Interfaces, MediumsCount, Mediums,\ - DataRangesCount, DataRanges, DataFlow, Communication,\ - NULL, NULL, 0\ -} -#define DEFINE_KSPIN_DESCRIPTOR_ITEMEX(\ - InterfacesCount, Interfaces,\ - MediumsCount, Mediums,\ - DataRangesCount, DataRanges,\ - DataFlow, Communication,\ - Category, Name)\ -{\ - InterfacesCount, Interfaces, MediumsCount, Mediums,\ - DataRangesCount, DataRanges, DataFlow, Communication,\ - Category, Name, 0\ -} - -#endif // defined(_NTDDK_) - -//=========================================================================== - -// MEDIATYPE_NULL -#define STATIC_KSDATAFORMAT_TYPE_WILDCARD STATIC_GUID_NULL -#define KSDATAFORMAT_TYPE_WILDCARD GUID_NULL - -// MEDIASUBTYPE_NULL -#define STATIC_KSDATAFORMAT_SUBTYPE_WILDCARD STATIC_GUID_NULL -#define KSDATAFORMAT_SUBTYPE_WILDCARD GUID_NULL - -// MEDIATYPE_Stream -#define STATIC_KSDATAFORMAT_TYPE_STREAM\ - 0xE436EB83L, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70 -DEFINE_GUIDSTRUCT("E436EB83-524F-11CE-9F53-0020AF0BA770", KSDATAFORMAT_TYPE_STREAM); -#define KSDATAFORMAT_TYPE_STREAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STREAM) - -// MEDIASUBTYPE_None -#define STATIC_KSDATAFORMAT_SUBTYPE_NONE\ - 0xE436EB8EL, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70 -DEFINE_GUIDSTRUCT("E436EB8E-524F-11CE-9F53-0020AF0BA770", KSDATAFORMAT_SUBTYPE_NONE); -#define KSDATAFORMAT_SUBTYPE_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NONE) - -#define STATIC_KSDATAFORMAT_SPECIFIER_WILDCARD STATIC_GUID_NULL -#define KSDATAFORMAT_SPECIFIER_WILDCARD GUID_NULL - -#define STATIC_KSDATAFORMAT_SPECIFIER_FILENAME\ - 0xAA797B40L, 0xE974, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("AA797B40-E974-11CF-A5D6-28DB04C10000", KSDATAFORMAT_SPECIFIER_FILENAME); -#define KSDATAFORMAT_SPECIFIER_FILENAME DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILENAME) - -#define STATIC_KSDATAFORMAT_SPECIFIER_FILEHANDLE\ - 0x65E8773CL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("65E8773C-8F56-11D0-A3B9-00A0C9223196", KSDATAFORMAT_SPECIFIER_FILEHANDLE); -#define KSDATAFORMAT_SPECIFIER_FILEHANDLE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILEHANDLE) - -// FORMAT_None -#define STATIC_KSDATAFORMAT_SPECIFIER_NONE\ - 0x0F6417D6L, 0xC318, 0x11D0, 0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196", KSDATAFORMAT_SPECIFIER_NONE); -#define KSDATAFORMAT_SPECIFIER_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_NONE) - -//=========================================================================== - -#define STATIC_KSPROPSETID_Quality \ - 0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("D16AD380-AC1A-11CF-A5D6-28DB04C10000", KSPROPSETID_Quality); -#define KSPROPSETID_Quality DEFINE_GUIDNAMED(KSPROPSETID_Quality) - -typedef enum { - KSPROPERTY_QUALITY_REPORT, - KSPROPERTY_QUALITY_ERROR -} KSPROPERTY_QUALITY; - -#define DEFINE_KSPROPERTY_ITEM_QUALITY_REPORT(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_QUALITY_REPORT,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(KSQUALITY),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_QUALITY_ERROR(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_QUALITY_ERROR,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(KSERROR),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -//=========================================================================== - -#define STATIC_KSPROPSETID_Connection \ - 0x1D58C920L, 0xAC9B, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000", KSPROPSETID_Connection); -#define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection) - -typedef enum { - KSPROPERTY_CONNECTION_STATE, - KSPROPERTY_CONNECTION_PRIORITY, - KSPROPERTY_CONNECTION_DATAFORMAT, - KSPROPERTY_CONNECTION_ALLOCATORFRAMING, - KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT, - KSPROPERTY_CONNECTION_ACQUIREORDERING, - KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX, - KSPROPERTY_CONNECTION_STARTAT -} KSPROPERTY_CONNECTION; - -#define DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CONNECTION_STATE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(KSSTATE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CONNECTION_PRIORITY(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CONNECTION_PRIORITY,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(KSPRIORITY),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CONNECTION_DATAFORMAT,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CONNECTION_ALLOCATORFRAMING,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSALLOCATOR_FRAMING),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING_EX(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSALLOCATOR_FRAMING_EX),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CONNECTION_PROPOSEDATAFORMAT(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,\ - NULL,\ - sizeof(KSPROPERTY),\ - sizeof(KSDATAFORMAT),\ - (Handler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CONNECTION_ACQUIREORDERING(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CONNECTION_ACQUIREORDERING,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(int),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CONNECTION_STARTAT(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CONNECTION_STARTAT,\ - NULL,\ - sizeof(KSPROPERTY),\ - sizeof(KSRELATIVEEVENT),\ - (Handler),\ - NULL, 0, NULL, NULL, 0) - -//=========================================================================== -// -// pins flags -// -#define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER 0x00000001 -#define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY 0x00000002 -#define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY 0x00000004 -#define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE 0x00000008 -#define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY 0x80000000 - -#define KSALLOCATOR_OPTIONF_COMPATIBLE 0x00000001 -#define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY 0x00000002 -#define KSALLOCATOR_OPTIONF_VALID 0x00000003 -// -// pins extended framing flags -// -#define KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT 0x00000010 -#define KSALLOCATOR_FLAG_DEVICE_SPECIFIC 0x00000020 -#define KSALLOCATOR_FLAG_CAN_ALLOCATE 0x00000040 -#define KSALLOCATOR_FLAG_INSIST_ON_FRAMESIZE_RATIO 0x00000080 -// -// allocator pipes flags -// -// there is at least one data modification in a pipe -#define KSALLOCATOR_FLAG_NO_FRAME_INTEGRITY 0x00000100 -#define KSALLOCATOR_FLAG_MULTIPLE_OUTPUT 0x00000200 -#define KSALLOCATOR_FLAG_CYCLE 0x00000400 -#define KSALLOCATOR_FLAG_ALLOCATOR_EXISTS 0x00000800 -// there is no framing dependency between neighbouring pipes. -#define KSALLOCATOR_FLAG_INDEPENDENT_RANGES 0x00001000 -#define KSALLOCATOR_FLAG_ATTENTION_STEPPING 0x00002000 - - -// -// old Framing structure -// -typedef struct { - union { - ULONG OptionsFlags; // allocator options (create) - ULONG RequirementsFlags; // allocation requirements (query) - }; -#if defined(_NTDDK_) - POOL_TYPE PoolType; -#else // !_NTDDK_ - ULONG PoolType; -#endif // !_NTDDK_ - ULONG Frames; // total number of allowable outstanding frames - ULONG FrameSize; // total size of frame - ULONG FileAlignment; - ULONG Reserved; -} KSALLOCATOR_FRAMING, *PKSALLOCATOR_FRAMING; - -#if defined(_NTDDK_) -typedef -PVOID -(*PFNKSDEFAULTALLOCATE)( - IN PVOID Context - ); - -typedef -VOID -(*PFNKSDEFAULTFREE)( - IN PVOID Context, - IN PVOID Buffer - ); - -typedef -NTSTATUS -(*PFNKSINITIALIZEALLOCATOR)( - IN PVOID InitialContext, - IN PKSALLOCATOR_FRAMING AllocatorFraming, - OUT PVOID* Context - ); - -typedef -VOID -(*PFNKSDELETEALLOCATOR)( - IN PVOID Context - ); -#endif // !_NTDDK_ - -// -// new Framing structure, eventually will replace KSALLOCATOR_FRAMING. -// -typedef struct { - ULONG MinFrameSize; - ULONG MaxFrameSize; - ULONG Stepping; -} KS_FRAMING_RANGE, *PKS_FRAMING_RANGE; - - -typedef struct { - KS_FRAMING_RANGE Range; - ULONG InPlaceWeight; - ULONG NotInPlaceWeight; -} KS_FRAMING_RANGE_WEIGHTED, *PKS_FRAMING_RANGE_WEIGHTED; - - -typedef struct { - ULONG RatioNumerator; // compression/expansion ratio - ULONG RatioDenominator; - ULONG RatioConstantMargin; -} KS_COMPRESSION, *PKS_COMPRESSION; - - -// -// Memory Types and Buses are repeated in each entry. -// Easiest to use but takes a little more memory than the varsize layout Pin\Memories\Buses\Ranges. -// -typedef struct { - GUID MemoryType; - GUID BusType; - ULONG MemoryFlags; - ULONG BusFlags; - ULONG Flags; - ULONG Frames; // total number of allowable outstanding frames - ULONG FileAlignment; - ULONG MemoryTypeWeight; // this memory type Weight pin-wide - KS_FRAMING_RANGE PhysicalRange; - KS_FRAMING_RANGE_WEIGHTED FramingRange; -} KS_FRAMING_ITEM, *PKS_FRAMING_ITEM; - - -typedef struct { - ULONG CountItems; // count of FramingItem-s below. - ULONG PinFlags; - KS_COMPRESSION OutputCompression; - ULONG PinWeight; // this pin framing's Weight graph-wide - KS_FRAMING_ITEM FramingItem[1]; -} KSALLOCATOR_FRAMING_EX, *PKSALLOCATOR_FRAMING_EX; - - - -// -// define memory type GUIDs -// -#define KSMEMORY_TYPE_WILDCARD GUID_NULL -#define STATIC_KSMEMORY_TYPE_WILDCARD STATIC_GUID_NULL - -#define KSMEMORY_TYPE_DONT_CARE GUID_NULL -#define STATIC_KSMEMORY_TYPE_DONT_CARE STATIC_GUID_NULL - -#define KS_TYPE_DONT_CARE GUID_NULL -#define STATIC_KS_TYPE_DONT_CARE STATIC_GUID_NULL - -#define STATIC_KSMEMORY_TYPE_SYSTEM \ - 0x091bb638L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 -DEFINE_GUIDSTRUCT("091bb638-603f-11d1-b067-00a0c9062802", KSMEMORY_TYPE_SYSTEM); -#define KSMEMORY_TYPE_SYSTEM DEFINE_GUIDNAMED(KSMEMORY_TYPE_SYSTEM) - -#define STATIC_KSMEMORY_TYPE_USER \ - 0x8cb0fc28L, 0x7893, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 -DEFINE_GUIDSTRUCT("8cb0fc28-7893-11d1-b069-00a0c9062802", KSMEMORY_TYPE_USER); -#define KSMEMORY_TYPE_USER DEFINE_GUIDNAMED(KSMEMORY_TYPE_USER) - -#define STATIC_KSMEMORY_TYPE_KERNEL_PAGED \ - 0xd833f8f8L, 0x7894, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 -DEFINE_GUIDSTRUCT("d833f8f8-7894-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_PAGED); -#define KSMEMORY_TYPE_KERNEL_PAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_PAGED) - -#define STATIC_KSMEMORY_TYPE_KERNEL_NONPAGED \ - 0x4a6d5fc4L, 0x7895, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 -DEFINE_GUIDSTRUCT("4a6d5fc4-7895-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_NONPAGED); -#define KSMEMORY_TYPE_KERNEL_NONPAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_NONPAGED) - -// old KS clients did not specify the device memory type -#define STATIC_KSMEMORY_TYPE_DEVICE_UNKNOWN \ - 0x091bb639L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 -DEFINE_GUIDSTRUCT("091bb639-603f-11d1-b067-00a0c9062802", KSMEMORY_TYPE_DEVICE_UNKNOWN); -#define KSMEMORY_TYPE_DEVICE_UNKNOWN DEFINE_GUIDNAMED(KSMEMORY_TYPE_DEVICE_UNKNOWN) - -// -// Helper framing macros. -// -#define DECLARE_SIMPLE_FRAMING_EX(FramingExName, MemoryType, Flags, Frames, Alignment, MinFrameSize, MaxFrameSize) \ - const KSALLOCATOR_FRAMING_EX FramingExName = \ - {\ - 1, \ - 0, \ - {\ - 1, \ - 1, \ - 0 \ - }, \ - 0, \ - {\ - {\ - MemoryType, \ - STATIC_KS_TYPE_DONT_CARE, \ - 0, \ - 0, \ - Flags, \ - Frames, \ - Alignment, \ - 0, \ - {\ - 0, \ - (ULONG)-1, \ - 1 \ - }, \ - {\ - {\ - MinFrameSize, \ - MaxFrameSize, \ - 1 \ - }, \ - 0, \ - 0 \ - }\ - }\ - }\ - } - -#define SetDefaultKsCompression(KsCompressionPointer) \ -{\ - KsCompressionPointer->RatioNumerator = 1;\ - KsCompressionPointer->RatioDenominator = 1;\ - KsCompressionPointer->RatioConstantMargin = 0;\ -} - -#define SetDontCareKsFramingRange(KsFramingRangePointer) \ -{\ - KsFramingRangePointer->MinFrameSize = 0;\ - KsFramingRangePointer->MaxFrameSize = (ULONG) -1;\ - KsFramingRangePointer->Stepping = 1;\ -} - -#define SetKsFramingRange(KsFramingRangePointer, P_MinFrameSize, P_MaxFrameSize) \ -{\ - KsFramingRangePointer->MinFrameSize = P_MinFrameSize;\ - KsFramingRangePointer->MaxFrameSize = P_MaxFrameSize;\ - KsFramingRangePointer->Stepping = 1;\ -} - -#define SetKsFramingRangeWeighted(KsFramingRangeWeightedPointer, P_MinFrameSize, P_MaxFrameSize) \ -{\ - KS_FRAMING_RANGE *KsFramingRange = &KsFramingRangeWeightedPointer->Range;\ - SetKsFramingRange(KsFramingRange, P_MinFrameSize, P_MaxFrameSize);\ - KsFramingRangeWeightedPointer->InPlaceWeight = 0;\ - KsFramingRangeWeightedPointer->NotInPlaceWeight = 0;\ -} - -#define INITIALIZE_SIMPLE_FRAMING_EX(FramingExPointer, P_MemoryType, P_Flags, P_Frames, P_Alignment, P_MinFrameSize, P_MaxFrameSize) \ -{\ - KS_COMPRESSION *KsCompression = &FramingExPointer->OutputCompression;\ - KS_FRAMING_RANGE *KsFramingRange = &FramingExPointer->FramingItem[0].PhysicalRange;\ - KS_FRAMING_RANGE_WEIGHTED *KsFramingRangeWeighted = &FramingExPointer->FramingItem[0].FramingRange;\ - FramingExPointer->CountItems = 1;\ - FramingExPointer->PinFlags = 0;\ - SetDefaultKsCompression(KsCompression);\ - FramingExPointer->PinWeight = 0;\ - FramingExPointer->FramingItem[0].MemoryType = P_MemoryType;\ - FramingExPointer->FramingItem[0].BusType = KS_TYPE_DONT_CARE;\ - FramingExPointer->FramingItem[0].MemoryFlags = 0;\ - FramingExPointer->FramingItem[0].BusFlags = 0;\ - FramingExPointer->FramingItem[0].Flags = P_Flags;\ - FramingExPointer->FramingItem[0].Frames = P_Frames;\ - FramingExPointer->FramingItem[0].FileAlignment = P_Alignment;\ - FramingExPointer->FramingItem[0].MemoryTypeWeight = 0;\ - SetDontCareKsFramingRange(KsFramingRange);\ - SetKsFramingRangeWeighted(KsFramingRangeWeighted, P_MinFrameSize, P_MaxFrameSize);\ -} - - - -// KSEVENTSETID_StreamAllocator: {75D95571-073C-11d0-A161-0020AFD156E4} - -#define STATIC_KSEVENTSETID_StreamAllocator\ - 0x75d95571L, 0x073c, 0x11d0, 0xa1, 0x61, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 -DEFINE_GUIDSTRUCT("75d95571-073c-11d0-a161-0020afd156e4", KSEVENTSETID_StreamAllocator); -#define KSEVENTSETID_StreamAllocator DEFINE_GUIDNAMED(KSEVENTSETID_StreamAllocator) - -typedef enum { - KSEVENT_STREAMALLOCATOR_INTERNAL_FREEFRAME, - KSEVENT_STREAMALLOCATOR_FREEFRAME -} KSEVENT_STREAMALLOCATOR; - -#define STATIC_KSMETHODSETID_StreamAllocator\ - 0xcf6e4341L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 -DEFINE_GUIDSTRUCT("cf6e4341-ec87-11cf-a130-0020afd156e4", KSMETHODSETID_StreamAllocator); -#define KSMETHODSETID_StreamAllocator DEFINE_GUIDNAMED(KSMETHODSETID_StreamAllocator) - -typedef enum { - KSMETHOD_STREAMALLOCATOR_ALLOC, - KSMETHOD_STREAMALLOCATOR_FREE -} KSMETHOD_STREAMALLOCATOR; - -#define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(Handler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_STREAMALLOCATOR_ALLOC,\ - KSMETHOD_TYPE_WRITE,\ - (Handler),\ - sizeof(KSMETHOD),\ - sizeof(PVOID),\ - NULL) - -#define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(Handler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_STREAMALLOCATOR_FREE,\ - KSMETHOD_TYPE_READ,\ - (Handler),\ - sizeof(KSMETHOD),\ - sizeof(PVOID),\ - NULL) - -#define DEFINE_KSMETHOD_ALLOCATORSET(AllocatorSet, MethodAlloc, MethodFree)\ -DEFINE_KSMETHOD_TABLE(AllocatorSet) {\ - DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(MethodAlloc),\ - DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(MethodFree)\ -} - -#define STATIC_KSPROPSETID_StreamAllocator\ - 0xcf6e4342L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 -DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4", KSPROPSETID_StreamAllocator); -#define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator) - -#if defined(_NTDDK_) -typedef enum { - KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE, - KSPROPERTY_STREAMALLOCATOR_STATUS -} KSPROPERTY_STREAMALLOCATOR; - -#define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSSTREAMALLOCATOR_FUNCTIONTABLE),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAMALLOCATOR_STATUS,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSSTREAMALLOCATOR_STATUS),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ALLOCATORSET(AllocatorSet, PropFunctionTable, PropStatus)\ -DEFINE_KSPROPERTY_TABLE(AllocatorSet) {\ - DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(PropStatus),\ - DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(PropFunctionTable)\ -} - -typedef -NTSTATUS -(*PFNALLOCATOR_ALLOCATEFRAME)( - IN PFILE_OBJECT FileObject, - PVOID *Frame - ); - -typedef -VOID -(*PFNALLOCATOR_FREEFRAME)( - IN PFILE_OBJECT FileObject, - IN PVOID Frame - ); - -typedef struct { - PFNALLOCATOR_ALLOCATEFRAME AllocateFrame; - PFNALLOCATOR_FREEFRAME FreeFrame; -} KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE; -#endif // defined(_NTDDK_) - -typedef struct { - KSALLOCATOR_FRAMING Framing; - ULONG AllocatedFrames; - ULONG Reserved; -} KSSTREAMALLOCATOR_STATUS, *PKSSTREAMALLOCATOR_STATUS; - -typedef struct { - KSALLOCATOR_FRAMING_EX Framing; - ULONG AllocatedFrames; - ULONG Reserved; -} KSSTREAMALLOCATOR_STATUS_EX, *PKSSTREAMALLOCATOR_STATUS_EX; - - -#define KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT 0x00000001 -#define KSSTREAM_HEADER_OPTIONSF_PREROLL 0x00000002 -#define KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY 0x00000004 -#define KSSTREAM_HEADER_OPTIONSF_TYPECHANGED 0x00000008 -#define KSSTREAM_HEADER_OPTIONSF_TIMEVALID 0x00000010 -#define KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY 0x00000040 -#define KSSTREAM_HEADER_OPTIONSF_FLUSHONPAUSE 0x00000080 -#define KSSTREAM_HEADER_OPTIONSF_DURATIONVALID 0x00000100 -#define KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM 0x00000200 -#define KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA 0x80000000 - -typedef struct { - LONGLONG Time; - ULONG Numerator; - ULONG Denominator; -} KSTIME, *PKSTIME; - -typedef struct { - ULONG Size; - ULONG TypeSpecificFlags; - KSTIME PresentationTime; - LONGLONG Duration; - ULONG FrameExtent; - ULONG DataUsed; - PVOID Data; - ULONG OptionsFlags; -#if _WIN64 - ULONG Reserved; -#endif -} KSSTREAM_HEADER, *PKSSTREAM_HEADER; - -#define STATIC_KSPROPSETID_StreamInterface\ - 0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a -DEFINE_GUIDSTRUCT("1fdd8ee1-9cd3-11d0-82aa-0000f822fe8a", KSPROPSETID_StreamInterface); -#define KSPROPSETID_StreamInterface DEFINE_GUIDNAMED(KSPROPSETID_StreamInterface) - -typedef enum { - KSPROPERTY_STREAMINTERFACE_HEADERSIZE -} KSPROPERTY_STREAMINTERFACE; - -#define DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE( GetHandler )\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAMINTERFACE_HEADERSIZE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(ULONG),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_STREAMINTERFACESET(StreamInterfaceSet,\ - HeaderSizeHandler)\ -DEFINE_KSPROPERTY_TABLE(StreamInterfaceSet) {\ - DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE( HeaderSizeHandler )\ -} - -#define STATIC_KSPROPSETID_Stream\ - 0x65aaba60L, 0x98ae, 0x11cf, 0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 -DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4", KSPROPSETID_Stream); -#define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream) - -typedef enum { - KSPROPERTY_STREAM_ALLOCATOR, - KSPROPERTY_STREAM_QUALITY, - KSPROPERTY_STREAM_DEGRADATION, - KSPROPERTY_STREAM_MASTERCLOCK, - KSPROPERTY_STREAM_TIMEFORMAT, - KSPROPERTY_STREAM_PRESENTATIONTIME, - KSPROPERTY_STREAM_PRESENTATIONEXTENT, - KSPROPERTY_STREAM_FRAMETIME, - KSPROPERTY_STREAM_RATECAPABILITY, - KSPROPERTY_STREAM_RATE, - KSPROPERTY_STREAM_PIPE_ID -} KSPROPERTY_STREAM; - -#define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_ALLOCATOR,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(HANDLE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_QUALITY,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSQUALITY_MANAGER),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_DEGRADATION,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_MASTERCLOCK,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(HANDLE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_TIMEFORMAT,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(GUID),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_PRESENTATIONTIME,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(KSTIME),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_PRESENTATIONEXTENT,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_FRAMETIME,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSFRAMETIME),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_RATECAPABILITY,\ - (Handler),\ - sizeof(KSRATE_CAPABILITY),\ - sizeof(KSRATE),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_RATE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(KSRATE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_PIPE_ID,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(HANDLE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -typedef struct { - HANDLE QualityManager; - PVOID Context; -} KSQUALITY_MANAGER, *PKSQUALITY_MANAGER; - -typedef struct { - LONGLONG Duration; - ULONG FrameFlags; - ULONG Reserved; -} KSFRAMETIME, *PKSFRAMETIME; - -#define KSFRAMETIME_VARIABLESIZE 0x00000001 - -typedef struct { - LONGLONG PresentationStart; - LONGLONG Duration; - KSPIN_INTERFACE Interface; - LONG Rate; - ULONG Flags; -} KSRATE, *PKSRATE; - -#define KSRATE_NOPRESENTATIONSTART 0x00000001 -#define KSRATE_NOPRESENTATIONDURATION 0x00000002 - -typedef struct { - KSPROPERTY Property; - KSRATE Rate; -} KSRATE_CAPABILITY, *PKSRATE_CAPABILITY; - -#define STATIC_KSPROPSETID_Clock \ - 0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000", KSPROPSETID_Clock); -#define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock) - -// -// Performs a x*y/z operation on 64 bit quantities by splitting the operation. The equation -// is simplified with respect to adding in the remainder for the upper 32 bits. -// -// (xh * 10000000 / Frequency) * 2^32 + ((((xh * 10000000) % Frequency) * 2^32 + (xl * 10000000)) / Frequency) -// -#define NANOSECONDS 10000000 -#define KSCONVERT_PERFORMANCE_TIME(Frequency, PerformanceTime) \ - ((((ULONGLONG)(ULONG)(PerformanceTime).HighPart * NANOSECONDS / (Frequency)) << 32) + \ - ((((((ULONGLONG)(ULONG)(PerformanceTime).HighPart * NANOSECONDS) % (Frequency)) << 32) + \ - ((ULONGLONG)(PerformanceTime).LowPart * NANOSECONDS)) / (Frequency))) - -typedef struct { - ULONG CreateFlags; -} KSCLOCK_CREATE, *PKSCLOCK_CREATE; - -typedef struct { - LONGLONG Time; - LONGLONG SystemTime; -} KSCORRELATED_TIME, *PKSCORRELATED_TIME; - -typedef struct { - LONGLONG Granularity; - LONGLONG Error; -} KSRESOLUTION, *PKSRESOLUTION; - -typedef enum { - KSPROPERTY_CLOCK_TIME, - KSPROPERTY_CLOCK_PHYSICALTIME, - KSPROPERTY_CLOCK_CORRELATEDTIME, - KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME, - KSPROPERTY_CLOCK_RESOLUTION, - KSPROPERTY_CLOCK_STATE, -#if defined(_NTDDK_) - KSPROPERTY_CLOCK_FUNCTIONTABLE -#endif // defined(_NTDDK_) -} KSPROPERTY_CLOCK; - -#if defined(_NTDDK_) - -typedef -LONGLONG -(FASTCALL *PFNKSCLOCK_GETTIME)( - IN PFILE_OBJECT FileObject - ); -typedef -LONGLONG -(FASTCALL *PFNKSCLOCK_CORRELATEDTIME)( - IN PFILE_OBJECT FileObject, - OUT PLONGLONG SystemTime); - -typedef struct { - PFNKSCLOCK_GETTIME GetTime; - PFNKSCLOCK_GETTIME GetPhysicalTime; - PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime; - PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime; -} KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE; - -typedef -BOOLEAN -(*PFNKSSETTIMER)( - IN PVOID Context, - IN PKTIMER Timer, - IN LARGE_INTEGER DueTime, - IN PKDPC Dpc - ); - -typedef -BOOLEAN -(*PFNKSCANCELTIMER)( - IN PVOID Context, - IN PKTIMER Timer - ); - -typedef -LONGLONG -(FASTCALL *PFNKSCORRELATEDTIME)( - IN PVOID Context, - OUT PLONGLONG SystemTime); - -typedef PVOID PKSDEFAULTCLOCK; - -#define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_TIME,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_PHYSICALTIME,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_CORRELATEDTIME,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSCORRELATED_TIME),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSCORRELATED_TIME),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_RESOLUTION,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSRESOLUTION),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_STATE,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSSTATE),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_FUNCTIONTABLE,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSCLOCK_FUNCTIONTABLE),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,\ - PropTime, PropPhysicalTime,\ - PropCorrelatedTime, PropCorrelatedPhysicalTime,\ - PropResolution, PropState, PropFunctionTable)\ -DEFINE_KSPROPERTY_TABLE(ClockSet) {\ - DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable),\ -} - -#endif // defined(_NTDDK_) - -#define STATIC_KSEVENTSETID_Clock \ - 0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000", KSEVENTSETID_Clock); -#define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock) - -typedef enum { - KSEVENT_CLOCK_INTERVAL_MARK, - KSEVENT_CLOCK_POSITION_MARK -} KSEVENT_CLOCK_POSITION; - -#define STATIC_KSEVENTSETID_Connection\ - 0x7f4bcbe0L, 0x9ea5, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("7f4bcbe0-9ea5-11cf-a5d6-28db04c10000", KSEVENTSETID_Connection); -#define KSEVENTSETID_Connection DEFINE_GUIDNAMED(KSEVENTSETID_Connection) - -typedef enum { - KSEVENT_CONNECTION_POSITIONUPDATE, - KSEVENT_CONNECTION_DATADISCONTINUITY, - KSEVENT_CONNECTION_TIMEDISCONTINUITY, - KSEVENT_CONNECTION_PRIORITY, - KSEVENT_CONNECTION_ENDOFSTREAM -} KSEVENT_CONNECTION; - -typedef struct { - PVOID Context; - ULONG Proportion; - LONGLONG DeltaTime; -} KSQUALITY, *PKSQUALITY; - -typedef struct { - PVOID Context; - ULONG Status; -} KSERROR, *PKSERROR; - -typedef KSIDENTIFIER KSDEGRADE, *PKSDEGRADE; - -#define STATIC_KSDEGRADESETID_Standard\ - 0x9F564180L, 0x704C, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("9F564180-704C-11D0-A5D6-28DB04C10000", KSDEGRADESETID_Standard); -#define KSDEGRADESETID_Standard DEFINE_GUIDNAMED(KSDEGRADESETID_Standard) - -typedef enum { - KSDEGRADE_STANDARD_SAMPLE, - KSDEGRADE_STANDARD_QUALITY, - KSDEGRADE_STANDARD_COMPUTATION, - KSDEGRADE_STANDARD_SKIP -} KSDEGRADE_STANDARD; - -#if defined(_NTDDK_) - -#define KSPROBE_STREAMREAD 0x00000000 -#define KSPROBE_STREAMWRITE 0x00000001 -#define KSPROBE_ALLOCATEMDL 0x00000010 -#define KSPROBE_PROBEANDLOCK 0x00000020 -#define KSPROBE_SYSTEMADDRESS 0x00000040 -#define KSPROBE_MODIFY 0x00000200 -#define KSPROBE_STREAMWRITEMODIFY (KSPROBE_MODIFY | KSPROBE_STREAMWRITE) -#define KSPROBE_ALLOWFORMATCHANGE 0x00000080 - -#define KSSTREAM_READ KSPROBE_STREAMREAD -#define KSSTREAM_WRITE KSPROBE_STREAMWRITE -#define KSSTREAM_PAGED_DATA 0x00000000 -#define KSSTREAM_NONPAGED_DATA 0x00000100 -#define KSSTREAM_SYNCHRONOUS 0x00001000 -#define KSSTREAM_FAILUREEXCEPTION 0x00002000 - -typedef -NTSTATUS -(*PFNKSCONTEXT_DISPATCH)( - IN PVOID Context, - IN PIRP Irp - ); - -typedef -NTSTATUS -(*PFNKSHANDLER)( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data - ); - -typedef -BOOLEAN -(*PFNKSFASTHANDLER)( - IN PFILE_OBJECT FileObject, - IN PKSIDENTIFIER Request, - IN ULONG RequestLength, - IN OUT PVOID Data, - IN ULONG DataLength, - OUT PIO_STATUS_BLOCK IoStatus - ); - -typedef -NTSTATUS -(*PFNKSALLOCATOR)( - IN PIRP Irp, - IN ULONG BufferSize, - IN BOOLEAN InputOperation - ); - -typedef struct { - KSPROPERTY_MEMBERSHEADER MembersHeader; - const VOID* Members; -} KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST; - -typedef struct { - KSIDENTIFIER PropTypeSet; - ULONG MembersListCount; - const KSPROPERTY_MEMBERSLIST* MembersList; -} KSPROPERTY_VALUES, *PKSPROPERTY_VALUES; - -#define DEFINE_KSPROPERTY_TABLE(tablename)\ - const KSPROPERTY_ITEM tablename[] = - -#define DEFINE_KSPROPERTY_ITEM(PropertyId, GetHandler,\ - MinProperty,\ - MinData,\ - SetHandler,\ - Values, RelationsCount, Relations, SupportHandler,\ - SerializedSize)\ -{\ - PropertyId, (PFNKSHANDLER)GetHandler, MinProperty, MinData,\ - (PFNKSHANDLER)SetHandler,\ - (PKSPROPERTY_VALUES)Values, RelationsCount, (PKSPROPERTY)Relations,\ - (PFNKSHANDLER)SupportHandler, (ULONG)SerializedSize\ -} - -typedef struct { - ULONG PropertyId; - union { - PFNKSHANDLER GetPropertyHandler; - BOOLEAN GetSupported; - }; - ULONG MinProperty; - ULONG MinData; - union { - PFNKSHANDLER SetPropertyHandler; - BOOLEAN SetSupported; - }; - const KSPROPERTY_VALUES*Values; - ULONG RelationsCount; - const KSPROPERTY* Relations; - PFNKSHANDLER SupportHandler; - ULONG SerializedSize; -} KSPROPERTY_ITEM, *PKSPROPERTY_ITEM; - -#define DEFINE_KSFASTPROPERTY_ITEM(PropertyId, GetHandler, SetHandler)\ -{\ - PropertyId, (PFNKSFASTHANDLER)GetHandler, (PFNKSFASTHANDLER)SetHandler, 0\ -} - -typedef struct { - ULONG PropertyId; - union { - PFNKSFASTHANDLER GetPropertyHandler; - BOOLEAN GetSupported; - }; - union { - PFNKSFASTHANDLER SetPropertyHandler; - BOOLEAN SetSupported; - }; - ULONG Reserved; -} KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM; - -#define DEFINE_KSPROPERTY_SET(Set,\ - PropertiesCount,\ - PropertyItem,\ - FastIoCount,\ - FastIoTable)\ -{\ - Set,\ - PropertiesCount,\ - PropertyItem,\ - FastIoCount,\ - FastIoTable\ -} - -#define DEFINE_KSPROPERTY_SET_TABLE(tablename)\ - const KSPROPERTY_SET tablename[] = - -typedef struct { - const GUID* Set; - ULONG PropertiesCount; - const KSPROPERTY_ITEM* PropertyItem; - ULONG FastIoCount; - const KSFASTPROPERTY_ITEM* FastIoTable; -} KSPROPERTY_SET, *PKSPROPERTY_SET; - -#define DEFINE_KSMETHOD_TABLE(tablename)\ - const KSMETHOD_ITEM tablename[] = - -#define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\ - MethodHandler,\ - MinMethod, MinData, SupportHandler)\ -{\ - MethodId, (PFNKSHANDLER)MethodHandler, MinMethod, MinData,\ - SupportHandler, Flags\ -} - -typedef struct { - ULONG MethodId; - union { - PFNKSHANDLER MethodHandler; - BOOLEAN MethodSupported; - }; - ULONG MinMethod; - ULONG MinData; - PFNKSHANDLER SupportHandler; - ULONG Flags; -} KSMETHOD_ITEM, *PKSMETHOD_ITEM; - -#define DEFINE_KSFASTMETHOD_ITEM(MethodId, MethodHandler)\ -{\ - MethodId, (PFNKSFASTHANDLER)MethodHandler\ -} - -typedef struct { - ULONG MethodId; - union { - PFNKSFASTHANDLER MethodHandler; - BOOLEAN MethodSupported; - }; -} KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM; - -#define DEFINE_KSMETHOD_SET(Set,\ - MethodsCount,\ - MethodItem,\ - FastIoCount,\ - FastIoTable)\ -{\ - Set,\ - MethodsCount,\ - MethodItem,\ - FastIoCount,\ - FastIoTable\ -} - -#define DEFINE_KSMETHOD_SET_TABLE(tablename)\ - const KSMETHOD_SET tablename[] = - -typedef struct { - const GUID* Set; - ULONG MethodsCount; - const KSMETHOD_ITEM* MethodItem; - ULONG FastIoCount; - const KSFASTMETHOD_ITEM*FastIoTable; -} KSMETHOD_SET, *PKSMETHOD_SET; - -typedef struct _KSEVENT_ENTRY -KSEVENT_ENTRY, *PKSEVENT_ENTRY; - -typedef -NTSTATUS -(*PFNKSADDEVENT)( - IN PIRP Irp, - IN PKSEVENTDATA EventData, - IN struct _KSEVENT_ENTRY* EventEntry - ); - -typedef -VOID -(*PFNKSREMOVEEVENT)( - IN PFILE_OBJECT FileObject, - IN struct _KSEVENT_ENTRY* EventEntry - ); - -#define DEFINE_KSEVENT_TABLE(tablename)\ - const KSEVENT_ITEM tablename[] = - -#define DEFINE_KSEVENT_ITEM(EventId, DataInput, ExtraEntryData,\ - AddHandler, RemoveHandler, SupportHandler)\ -{\ - EventId,\ - DataInput,\ - ExtraEntryData,\ - AddHandler,\ - RemoveHandler,\ - SupportHandler\ -} - -typedef struct { - ULONG EventId; - ULONG DataInput; - ULONG ExtraEntryData; - PFNKSADDEVENT AddHandler; - PFNKSREMOVEEVENT RemoveHandler; - PFNKSHANDLER SupportHandler; -} KSEVENT_ITEM, *PKSEVENT_ITEM; - -#define DEFINE_KSEVENT_SET(Set,\ - EventsCount,\ - EventItem)\ -{\ - Set, EventsCount, EventItem\ -} - -#define DEFINE_KSEVENT_SET_TABLE(tablename)\ - const KSEVENT_SET tablename[] = - -typedef struct { - const GUID* Set; - ULONG EventsCount; - const KSEVENT_ITEM* EventItem; -} KSEVENT_SET, *PKSEVENT_SET; - -typedef struct { - KDPC Dpc; - ULONG ReferenceCount; - KSPIN_LOCK AccessLock; -} KSDPC_ITEM, *PKSDPC_ITEM; - -typedef struct { - KSDPC_ITEM DpcItem; - LIST_ENTRY BufferList; -} KSBUFFER_ITEM, *PKSBUFFER_ITEM; - -#define KSEVENT_ENTRY_DELETED 1 -#define KSEVENT_ENTRY_ONESHOT 2 -#define KSEVENT_ENTRY_BUFFERED 4 - -struct _KSEVENT_ENTRY { - LIST_ENTRY ListEntry; - PVOID Object; - union { - PKSDPC_ITEM DpcItem; - PKSBUFFER_ITEM BufferItem; - }; - PKSEVENTDATA EventData; - ULONG NotificationType; - const KSEVENT_SET* EventSet; - const KSEVENT_ITEM* EventItem; - PFILE_OBJECT FileObject; - ULONG SemaphoreAdjustment; - ULONG Reserved; - ULONG Flags; -}; - -typedef enum { - KSEVENTS_NONE, - KSEVENTS_SPINLOCK, - KSEVENTS_MUTEX, - KSEVENTS_FMUTEX, - KSEVENTS_FMUTEXUNSAFE, - KSEVENTS_INTERRUPT, - KSEVENTS_ERESOURCE -} KSEVENTS_LOCKTYPE; - -#define KSDISPATCH_FASTIO 0x80000000 - -typedef struct { - PDRIVER_DISPATCH Create; - PVOID Context; - UNICODE_STRING ObjectClass; - PSECURITY_DESCRIPTOR SecurityDescriptor; - ULONG Flags; -} KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM; - -typedef -VOID -(*PFNKSITEMFREECALLBACK)( - IN PKSOBJECT_CREATE_ITEM CreateItem - ); - -#define KSCREATE_ITEM_SECURITYCHANGED 0x00000001 -#define KSCREATE_ITEM_WILDCARD 0x00000002 -#define KSCREATE_ITEM_NOPARAMETERS 0x00000004 -#define KSCREATE_ITEM_FREEONSTOP 0x00000008 - -#define DEFINE_KSCREATE_DISPATCH_TABLE( tablename )\ - KSOBJECT_CREATE_ITEM tablename[] = - -#define DEFINE_KSCREATE_ITEM(DispatchCreate, TypeName, Context)\ -{\ - (DispatchCreate),\ - (PVOID)(Context),\ - {\ - sizeof(TypeName) - sizeof(UNICODE_NULL),\ - sizeof(TypeName),\ - (PWCHAR)(TypeName)\ - },\ - NULL, 0\ -} - -#define DEFINE_KSCREATE_ITEMEX(DispatchCreate, TypeName, Context, Flags)\ -{\ - (DispatchCreate),\ - (PVOID)(Context),\ - {\ - sizeof(TypeName) - sizeof(UNICODE_NULL),\ - sizeof(TypeName),\ - (PWCHAR)(TypeName)\ - },\ - NULL, (Flags)\ -} - -#define DEFINE_KSCREATE_ITEMNULL( DispatchCreate, Context )\ -{\ - DispatchCreate,\ - Context,\ - {\ - 0,\ - 0,\ - NULL,\ - },\ - NULL, 0\ -} - -typedef struct { - ULONG CreateItemsCount; - PKSOBJECT_CREATE_ITEM CreateItemsList; -} KSOBJECT_CREATE, *PKSOBJECT_CREATE; - -typedef struct { - PDRIVER_DISPATCH DeviceIoControl; - PDRIVER_DISPATCH Read; - PDRIVER_DISPATCH Write; - PDRIVER_DISPATCH Flush; - PDRIVER_DISPATCH Close; - PDRIVER_DISPATCH QuerySecurity; - PDRIVER_DISPATCH SetSecurity; - PFAST_IO_DEVICE_CONTROL FastDeviceIoControl; - PFAST_IO_READ FastRead; - PFAST_IO_WRITE FastWrite; -} KSDISPATCH_TABLE, *PKSDISPATCH_TABLE; - -#define DEFINE_KSDISPATCH_TABLE( tablename, DeviceIoControl, Read, Write,\ - Flush, Close, QuerySecurity, SetSecurity,\ - FastDeviceIoControl, FastRead, FastWrite )\ - const KSDISPATCH_TABLE tablename = \ - {\ - DeviceIoControl, \ - Read, \ - Write, \ - Flush, \ - Close, \ - QuerySecurity, \ - SetSecurity, \ - FastDeviceIoControl, \ - FastRead, \ - FastWrite, \ - } - -#define KSCREATE_ITEM_IRP_STORAGE(Irp) (*(PKSOBJECT_CREATE_ITEM*)&(Irp)->Tail.Overlay.DriverContext[0]) -#define KSEVENT_SET_IRP_STORAGE(Irp) (*(const KSEVENT_SET**)&(Irp)->Tail.Overlay.DriverContext[0]) -#define KSEVENT_ITEM_IRP_STORAGE(Irp) (*(const KSEVENT_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3]) -#define KSEVENT_ENTRY_IRP_STORAGE(Irp) (*(PKSEVENT_ENTRY*)&(Irp)->Tail.Overlay.DriverContext[0]) -#define KSMETHOD_SET_IRP_STORAGE(Irp) (*(const KSMETHOD_SET**)&(Irp)->Tail.Overlay.DriverContext[0]) -#define KSMETHOD_ITEM_IRP_STORAGE(Irp) (*(const KSMETHOD_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3]) -#define KSMETHOD_TYPE_IRP_STORAGE(Irp) (*(ULONG_PTR*)(&(Irp)->Tail.Overlay.DriverContext[2])) -#define KSQUEUE_SPINLOCK_IRP_STORAGE(Irp) (*(PKSPIN_LOCK*)&(Irp)->Tail.Overlay.DriverContext[1]) -#define KSPROPERTY_SET_IRP_STORAGE(Irp) (*(const KSPROPERTY_SET**)&(Irp)->Tail.Overlay.DriverContext[0]) -#define KSPROPERTY_ITEM_IRP_STORAGE(Irp) (*(const KSPROPERTY_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3]) -#define KSPROPERTY_ATTRIBUTES_IRP_STORAGE(Irp) (*(PKSATTRIBUTE_LIST*)&(Irp)->Tail.Overlay.DriverContext[2]) - -typedef PVOID KSDEVICE_HEADER, KSOBJECT_HEADER; - -typedef enum { - KsInvokeOnSuccess = 1, - KsInvokeOnError = 2, - KsInvokeOnCancel = 4 -} KSCOMPLETION_INVOCATION; - -typedef enum { - KsListEntryTail, - KsListEntryHead -} KSLIST_ENTRY_LOCATION; - -typedef enum { - KsAcquireOnly, - KsAcquireAndRemove, - KsAcquireOnlySingleItem, - KsAcquireAndRemoveOnlySingleItem -} KSIRP_REMOVAL_OPERATION; - -typedef enum { - KsStackCopyToNewLocation, - KsStackReuseCurrentLocation, - KsStackUseNewLocation -} KSSTACK_USE; - -typedef enum { - KSTARGET_STATE_DISABLED, - KSTARGET_STATE_ENABLED -} KSTARGET_STATE; - -typedef -NTSTATUS -(*PFNKSIRPLISTCALLBACK)( - IN PIRP Irp, - IN PVOID Context - ); - -typedef -VOID -(*PFNREFERENCEDEVICEOBJECT)( - IN PVOID Context - ); - -typedef -VOID -(*PFNDEREFERENCEDEVICEOBJECT)( - IN PVOID Context - ); - -typedef -NTSTATUS -(*PFNQUERYREFERENCESTRING)( - IN PVOID Context, - IN OUT PWCHAR *String - ); - -#define BUS_INTERFACE_REFERENCE_VERSION 0x100 - -typedef struct { - // - // Standard interface header - // - - INTERFACE Interface; - - // - // Standard bus interfaces - // - - PFNREFERENCEDEVICEOBJECT ReferenceDeviceObject; - PFNDEREFERENCEDEVICEOBJECT DereferenceDeviceObject; - PFNQUERYREFERENCESTRING QueryReferenceString; - -} BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE; - -#define STATIC_REFERENCE_BUS_INTERFACE STATIC_KSMEDIUMSETID_Standard -#define REFERENCE_BUS_INTERFACE KSMEDIUMSETID_Standard - -typedef -NTSTATUS -(*PFNQUERYMEDIUMSLIST)( - IN PVOID Context, - OUT ULONG* MediumsCount, - OUT PKSPIN_MEDIUM* MediumList - ); - -typedef struct { - // - // Standard interface header - // - - INTERFACE Interface; - - // - // Interface definition - // - - PFNQUERYMEDIUMSLIST QueryMediumsList; - -} BUS_INTERFACE_MEDIUMS, *PBUS_INTERFACE_MEDIUMS; - -#define STATIC_GUID_BUS_INTERFACE_MEDIUMS \ - 0x4EC35C3EL, 0x201B, 0x11D2, 0x87, 0x45, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("4EC35C3E-201B-11D2-8745-00A0C9223196", GUID_BUS_INTERFACE_MEDIUMS); -#define GUID_BUS_INTERFACE_MEDIUMS DEFINE_GUIDNAMED(GUID_BUS_INTERFACE_MEDIUMS) - -#endif // defined(_NTDDK_) - -#if !defined( PACK_PRAGMAS_NOT_SUPPORTED ) -#include -#endif - -typedef struct { - GUID PropertySet; - ULONG Count; -} KSPROPERTY_SERIALHDR, *PKSPROPERTY_SERIALHDR; - -#if !defined( PACK_PRAGMAS_NOT_SUPPORTED ) -#include -#endif - -typedef struct { - KSIDENTIFIER PropTypeSet; - ULONG Id; - ULONG PropertyLength; -} KSPROPERTY_SERIAL, *PKSPROPERTY_SERIAL; - -#if defined(_NTDDK_) - -#define IOCTL_KS_HANDSHAKE CTL_CODE(FILE_DEVICE_KS, 0x007, METHOD_NEITHER, FILE_ANY_ACCESS) - -typedef struct { - GUID ProtocolId; - PVOID Argument1; - PVOID Argument2; -} KSHANDSHAKE, *PKSHANDSHAKE; - -typedef struct _KSGATE -KSGATE, *PKSGATE; - -struct _KSGATE { - LONG Count; - PKSGATE NextGate; -}; - -#ifndef _NTOS_ - -void __inline -KsGateTurnInputOn( - IN PKSGATE Gate OPTIONAL - ) -{ - while (Gate && (InterlockedIncrement(&Gate->Count) == 1)) { - Gate = Gate->NextGate; - } -} - -void __inline -KsGateTurnInputOff( - IN PKSGATE Gate OPTIONAL - ) -{ - while (Gate && (InterlockedDecrement(&Gate->Count) == 0)) { - Gate = Gate->NextGate; - } -} - -BOOLEAN __inline -KsGateGetStateUnsafe( - IN PKSGATE Gate - ) -{ - ASSERT(Gate); - return Gate->Count > 0; -} - -BOOLEAN __inline -KsGateCaptureThreshold( - IN PKSGATE Gate - ) -{ - BOOLEAN captured; - - ASSERT(Gate); - - captured = (BOOLEAN)(InterlockedCompareExchange(&Gate->Count,0,1) == 1); - - // - // If we made a transition, it must be propagated. - // - if (captured) { - KsGateTurnInputOff(Gate->NextGate); - } - - // - // We return whatever the state was prior to the compare/exchange. If - // the state was on, the state is now off. - // - return captured; -} - -void __inline -KsGateInitialize( - IN PKSGATE Gate, - IN LONG InitialCount, - IN PKSGATE NextGate OPTIONAL, - IN BOOLEAN StateToPropagate // IN BOOLEAN NextGateIsAnOrGate - ) -{ - ASSERT(Gate); - Gate->Count = InitialCount; - Gate->NextGate = NextGate; - - if (NextGate) { - if (InitialCount > 0) { - if (StateToPropagate) { - KsGateTurnInputOn(NextGate); - } - } else { - if (! StateToPropagate) { - KsGateTurnInputOff(NextGate); - } - } - } -} - -void __inline -KsGateInitializeAnd( - IN PKSGATE AndGate, - IN PKSGATE NextOrGate OPTIONAL - ) -{ - KsGateInitialize(AndGate,1,NextOrGate,TRUE); -} - -void __inline -KsGateInitializeOr( - IN PKSGATE OrGate, - IN PKSGATE NextAndGate OPTIONAL - ) -{ - KsGateInitialize(OrGate,0,NextAndGate,FALSE); -} - -void __inline KsGateAddOnInputToAnd(IN PKSGATE AndGate) { UNREFERENCED_PARAMETER (AndGate); } -void __inline KsGateAddOffInputToAnd(IN PKSGATE AndGate) { KsGateTurnInputOff(AndGate); } -void __inline KsGateRemoveOnInputFromAnd(IN PKSGATE AndGate) { UNREFERENCED_PARAMETER (AndGate); } -void __inline KsGateRemoveOffInputFromAnd(IN PKSGATE AndGate) { KsGateTurnInputOn(AndGate); } - -void __inline KsGateAddOnInputToOr(IN PKSGATE OrGate) { KsGateTurnInputOn(OrGate); } -void __inline KsGateAddOffInputToOr(IN PKSGATE OrGate) { UNREFERENCED_PARAMETER (OrGate); } -void __inline KsGateRemoveOnInputFromOr(IN PKSGATE OrGate) { KsGateTurnInputOff(OrGate); } -void __inline KsGateRemoveOffInputFromOr(IN PKSGATE OrGate) { UNREFERENCED_PARAMETER (OrGate); } - -void __inline -KsGateTerminateAnd( - IN PKSGATE AndGate - ) -{ - ASSERT(AndGate); - if (KsGateGetStateUnsafe(AndGate)) { - KsGateRemoveOnInputFromOr(AndGate->NextGate); - } else { - KsGateRemoveOffInputFromOr(AndGate->NextGate); - } -} - -void __inline -KsGateTerminateOr( - IN PKSGATE OrGate - ) -{ - ASSERT(OrGate); - if (KsGateGetStateUnsafe(OrGate)) { - KsGateRemoveOnInputFromAnd(OrGate->NextGate); - } else { - KsGateRemoveOffInputFromAnd(OrGate->NextGate); - } -} - -#endif // !_NTOS_ - -typedef PVOID KSOBJECT_BAG; - -typedef -BOOLEAN -(*PFNKSGENERATEEVENTCALLBACK)( - IN PVOID Context, - IN PKSEVENT_ENTRY EventEntry - ); - -typedef -NTSTATUS -(*PFNKSDEVICECREATE)( - IN PKSDEVICE Device - ); -typedef -NTSTATUS -(*PFNKSDEVICEPNPSTART)( - IN PKSDEVICE Device, - IN PIRP Irp, - IN PCM_RESOURCE_LIST TranslatedResourceList OPTIONAL, - IN PCM_RESOURCE_LIST UntranslatedResourceList OPTIONAL - ); -typedef -NTSTATUS -(*PFNKSDEVICE)( - IN PKSDEVICE Device - ); -typedef -NTSTATUS -(*PFNKSDEVICEIRP)( - IN PKSDEVICE Device, - IN PIRP Irp - ); -typedef -void -(*PFNKSDEVICEIRPVOID)( - IN PKSDEVICE Device, - IN PIRP Irp - ); -typedef -NTSTATUS -(*PFNKSDEVICEQUERYCAPABILITIES)( - IN PKSDEVICE Device, - IN PIRP Irp, - IN OUT PDEVICE_CAPABILITIES Capabilities - ); -typedef -NTSTATUS -(*PFNKSDEVICEQUERYPOWER)( - IN PKSDEVICE Device, - IN PIRP Irp, - IN DEVICE_POWER_STATE DeviceTo, - IN DEVICE_POWER_STATE DeviceFrom, - IN SYSTEM_POWER_STATE SystemTo, - IN SYSTEM_POWER_STATE SystemFrom, - IN POWER_ACTION Action - ); -typedef -void -(*PFNKSDEVICESETPOWER)( - IN PKSDEVICE Device, - IN PIRP Irp, - IN DEVICE_POWER_STATE To, - IN DEVICE_POWER_STATE From - ); -typedef -NTSTATUS -(*PFNKSFILTERFACTORYVOID)( - IN PKSFILTERFACTORY FilterFactory - ); -typedef -void -(*PFNKSFILTERFACTORYPOWER)( - IN PKSFILTERFACTORY FilterFactory, - IN DEVICE_POWER_STATE State - ); -typedef -NTSTATUS -(*PFNKSFILTERIRP)( - IN PKSFILTER Filter, - IN PIRP Irp - ); -typedef -NTSTATUS -(*PFNKSFILTERPROCESS)( - IN PKSFILTER Filter, - IN PKSPROCESSPIN_INDEXENTRY Index - ); -typedef -NTSTATUS -(*PFNKSFILTERVOID)( - IN PKSFILTER Filter - ); -typedef -void -(*PFNKSFILTERPOWER)( - IN PKSFILTER Filter, - IN DEVICE_POWER_STATE State - ); -typedef -NTSTATUS -(*PFNKSPINIRP)( - IN PKSPIN Pin, - IN PIRP Irp - ); -typedef -NTSTATUS -(*PFNKSPINSETDEVICESTATE)( - IN PKSPIN Pin, - IN KSSTATE ToState, - IN KSSTATE FromState - ); -typedef -NTSTATUS -(*PFNKSPINSETDATAFORMAT)( - IN PKSPIN Pin, - IN PKSDATAFORMAT OldFormat OPTIONAL, - IN PKSMULTIPLE_ITEM OldAttributeList OPTIONAL, - IN const KSDATARANGE* DataRange, - IN const KSATTRIBUTE_LIST* AttributeRange OPTIONAL - ); -typedef -NTSTATUS -(*PFNKSPINHANDSHAKE)( - IN PKSPIN Pin, - IN PKSHANDSHAKE In, - IN PKSHANDSHAKE Out - ); -typedef -NTSTATUS -(*PFNKSPIN)( - IN PKSPIN Pin - ); -typedef -void -(*PFNKSPINVOID)( - IN PKSPIN Pin - ); -typedef -void -(*PFNKSPINPOWER)( - IN PKSPIN Pin, - IN DEVICE_POWER_STATE State - ); -typedef -BOOLEAN -(*PFNKSPINSETTIMER)( - IN PKSPIN Pin, - IN PKTIMER Timer, - IN LARGE_INTEGER DueTime, - IN PKDPC Dpc - ); -typedef -BOOLEAN -(*PFNKSPINCANCELTIMER)( - IN PKSPIN Pin, - IN PKTIMER Timer - ); -typedef -LONGLONG -(FASTCALL *PFNKSPINCORRELATEDTIME)( - IN PKSPIN Pin, - OUT PLONGLONG SystemTime - ); -typedef -void -(*PFNKSPINRESOLUTION)( - IN PKSPIN Pin, - OUT PKSRESOLUTION Resolution - ); -typedef -NTSTATUS -(*PFNKSPININITIALIZEALLOCATOR)( - IN PKSPIN Pin, - IN PKSALLOCATOR_FRAMING AllocatorFraming, - OUT PVOID* Context - ); -typedef -void -(*PFNKSSTREAMPOINTER)( - IN PKSSTREAM_POINTER StreamPointer - ); - -typedef struct KSAUTOMATION_TABLE_ -KSAUTOMATION_TABLE, *PKSAUTOMATION_TABLE; -struct KSAUTOMATION_TABLE_ { - ULONG PropertySetsCount; - ULONG PropertyItemSize; - const KSPROPERTY_SET* PropertySets; - ULONG MethodSetsCount; - ULONG MethodItemSize; - const KSMETHOD_SET* MethodSets; - ULONG EventSetsCount; - ULONG EventItemSize; - const KSEVENT_SET* EventSets; -#if !defined(_WIN64) - PVOID Alignment; -#endif // !defined(_WIN64) -}; - -#define DEFINE_KSAUTOMATION_TABLE(table)\ - const KSAUTOMATION_TABLE table = - -#define DEFINE_KSAUTOMATION_PROPERTIES(table)\ - SIZEOF_ARRAY(table),\ - sizeof(KSPROPERTY_ITEM),\ - table - -#define DEFINE_KSAUTOMATION_METHODS(table)\ - SIZEOF_ARRAY(table),\ - sizeof(KSMETHOD_ITEM),\ - table - -#define DEFINE_KSAUTOMATION_EVENTS(table)\ - SIZEOF_ARRAY(table),\ - sizeof(KSEVENT_ITEM),\ - table - -#define DEFINE_KSAUTOMATION_PROPERTIES_NULL\ - 0,\ - sizeof(KSPROPERTY_ITEM),\ - NULL - -#define DEFINE_KSAUTOMATION_METHODS_NULL\ - 0,\ - sizeof(KSMETHOD_ITEM),\ - NULL - -#define DEFINE_KSAUTOMATION_EVENTS_NULL\ - 0,\ - sizeof(KSEVENT_ITEM),\ - NULL - -#define MIN_DEV_VER_FOR_QI (0x100) - -struct _KSDEVICE_DISPATCH { - PFNKSDEVICECREATE Add; - PFNKSDEVICEPNPSTART Start; - PFNKSDEVICE PostStart; - PFNKSDEVICEIRP QueryStop; - PFNKSDEVICEIRPVOID CancelStop; - PFNKSDEVICEIRPVOID Stop; - PFNKSDEVICEIRP QueryRemove; - PFNKSDEVICEIRPVOID CancelRemove; - PFNKSDEVICEIRPVOID Remove; - PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities; - PFNKSDEVICEIRPVOID SurpriseRemoval; - PFNKSDEVICEQUERYPOWER QueryPower; - PFNKSDEVICESETPOWER SetPower; - PFNKSDEVICEIRP QueryInterface; // added in version 0x100 -}; - -struct _KSFILTER_DISPATCH { - PFNKSFILTERIRP Create; - PFNKSFILTERIRP Close; - PFNKSFILTERPROCESS Process; - PFNKSFILTERVOID Reset; -}; - -struct _KSPIN_DISPATCH { - PFNKSPINIRP Create; - PFNKSPINIRP Close; - PFNKSPIN Process; - PFNKSPINVOID Reset; - PFNKSPINSETDATAFORMAT SetDataFormat; - PFNKSPINSETDEVICESTATE SetDeviceState; - PFNKSPIN Connect; - PFNKSPINVOID Disconnect; - const KSCLOCK_DISPATCH* Clock; - const KSALLOCATOR_DISPATCH* Allocator; -}; - -struct _KSCLOCK_DISPATCH { - PFNKSPINSETTIMER SetTimer; - PFNKSPINCANCELTIMER CancelTimer; - PFNKSPINCORRELATEDTIME CorrelatedTime; - PFNKSPINRESOLUTION Resolution; -}; - -struct _KSALLOCATOR_DISPATCH { - PFNKSPININITIALIZEALLOCATOR InitializeAllocator; - PFNKSDELETEALLOCATOR DeleteAllocator; - PFNKSDEFAULTALLOCATE Allocate; - PFNKSDEFAULTFREE Free; -}; - -#define KSDEVICE_DESCRIPTOR_VERSION (0x100) - -struct _KSDEVICE_DESCRIPTOR { - const KSDEVICE_DISPATCH* Dispatch; - ULONG FilterDescriptorsCount; - const KSFILTER_DESCRIPTOR*const* FilterDescriptors; - ULONG Version; // this is 0 for pre-version 100 driver - //#if !defined(_WIN64) - //PVOID Alignment; - //#endif //!defined(_WIN64) -}; - -struct _KSFILTER_DESCRIPTOR { - const KSFILTER_DISPATCH* Dispatch; - const KSAUTOMATION_TABLE* AutomationTable; - ULONG Version; -#define KSFILTER_DESCRIPTOR_VERSION ((ULONG)-1) - ULONG Flags; -#define KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING 0x00000001 -#define KSFILTER_FLAG_CRITICAL_PROCESSING 0x00000002 -#define KSFILTER_FLAG_HYPERCRITICAL_PROCESSING 0x00000004 -#define KSFILTER_FLAG_RECEIVE_ZERO_LENGTH_SAMPLES 0x00000008 - const GUID* ReferenceGuid; - ULONG PinDescriptorsCount; - ULONG PinDescriptorSize; - const KSPIN_DESCRIPTOR_EX* PinDescriptors; - ULONG CategoriesCount; - const GUID* Categories; - ULONG NodeDescriptorsCount; - ULONG NodeDescriptorSize; - const KSNODE_DESCRIPTOR* NodeDescriptors; - ULONG ConnectionsCount; - const KSTOPOLOGY_CONNECTION* Connections; - const KSCOMPONENTID* ComponentId; -}; - -#define DEFINE_KSFILTER_DESCRIPTOR(descriptor)\ - const KSFILTER_DESCRIPTOR descriptor = - -#define DEFINE_KSFILTER_PIN_DESCRIPTORS(table)\ - SIZEOF_ARRAY(table),\ - sizeof(table[0]),\ - table - -#define DEFINE_KSFILTER_CATEGORIES(table)\ - SIZEOF_ARRAY(table),\ - table - -#define DEFINE_KSFILTER_CATEGORY(category)\ - 1,\ - &(category) - -#define DEFINE_KSFILTER_CATEGORIES_NULL\ - 0,\ - NULL - -#define DEFINE_KSFILTER_NODE_DESCRIPTORS(table)\ - SIZEOF_ARRAY(table),\ - sizeof(table[0]),\ - table - -#define DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL\ - 0,\ - sizeof(KSNODE_DESCRIPTOR),\ - NULL - -#define DEFINE_KSFILTER_CONNECTIONS(table)\ - SIZEOF_ARRAY(table),\ - table - -#define DEFINE_KSFILTER_DEFAULT_CONNECTIONS\ - 0,\ - NULL - -#define DEFINE_KSFILTER_DESCRIPTOR_TABLE(table)\ - const KSFILTER_DESCRIPTOR*const table[] = - -struct _KSPIN_DESCRIPTOR_EX { - const KSPIN_DISPATCH* Dispatch; - const KSAUTOMATION_TABLE* AutomationTable; - KSPIN_DESCRIPTOR PinDescriptor; - ULONG Flags; -#define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING -#define KSPIN_FLAG_CRITICAL_PROCESSING KSFILTER_FLAG_CRITICAL_PROCESSING -#define KSPIN_FLAG_HYPERCRITICAL_PROCESSING KSFILTER_FLAG_HYPERCRITICAL_PROCESSING -#define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING 0x00000008 -#define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING 0x00000010 -#define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL 0x00000020 -#define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING 0x00000040 -#define KSPIN_FLAG_ENFORCE_FIFO 0x00000080 - -#define KSPIN_FLAG_GENERATE_MAPPINGS 0x00000100 -#define KSPIN_FLAG_DISTINCT_TRAILING_EDGE 0x00000200 - -#define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY 0x00010000 -#define KSPIN_FLAG_SPLITTER 0x00020000 -#define KSPIN_FLAG_USE_STANDARD_TRANSPORT 0x00040000 -#define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT 0x00080000 -#define KSPIN_FLAG_FIXED_FORMAT 0x00100000 -#define KSPIN_FLAG_GENERATE_EOS_EVENTS 0x00200000 -#define KSPIN_FLAG_RENDERER (KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY|KSPIN_FLAG_GENERATE_EOS_EVENTS) -#define KSPIN_FLAG_IMPLEMENT_CLOCK 0x00400000 -#define KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING 0x00800000 -#define KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE 0x01000000 - ULONG InstancesPossible; - ULONG InstancesNecessary; - const KSALLOCATOR_FRAMING_EX* AllocatorFraming; - PFNKSINTERSECTHANDLEREX IntersectHandler; -}; - -#define DEFINE_KSPIN_DEFAULT_INTERFACES\ - 0,\ - NULL - -#define DEFINE_KSPIN_DEFAULT_MEDIUMS\ - 0,\ - NULL - -struct _KSNODE_DESCRIPTOR { - const KSAUTOMATION_TABLE* AutomationTable; - const GUID* Type; - const GUID* Name; -#if !defined(_WIN64) - PVOID Alignment; -#endif // !defined(_WIN64) -}; - -#if !defined(_WIN64) -#define DEFINE_NODE_DESCRIPTOR(automation,type,name) \ - { (automation), (type), (name), NULL } -#else // !defined(_WIN64) -#define DEFINE_NODE_DESCRIPTOR(automation,type,name) \ - { (automation), (type), (name) } -#endif // !defined(_WIN64) - -struct _KSDEVICE { - const KSDEVICE_DESCRIPTOR* Descriptor; - KSOBJECT_BAG Bag; - PVOID Context; - PDEVICE_OBJECT FunctionalDeviceObject; - PDEVICE_OBJECT PhysicalDeviceObject; - PDEVICE_OBJECT NextDeviceObject; - BOOLEAN Started; - SYSTEM_POWER_STATE SystemPowerState; - DEVICE_POWER_STATE DevicePowerState; -}; - -struct _KSFILTERFACTORY { - const KSFILTER_DESCRIPTOR* FilterDescriptor; - KSOBJECT_BAG Bag; - PVOID Context; -}; - -struct _KSFILTER { - const KSFILTER_DESCRIPTOR* Descriptor; - KSOBJECT_BAG Bag; - PVOID Context; -}; - -struct _KSPIN { - const KSPIN_DESCRIPTOR_EX* Descriptor; - KSOBJECT_BAG Bag; - PVOID Context; - ULONG Id; - KSPIN_COMMUNICATION Communication; - BOOLEAN ConnectionIsExternal; - KSPIN_INTERFACE ConnectionInterface; - KSPIN_MEDIUM ConnectionMedium; - KSPRIORITY ConnectionPriority; - PKSDATAFORMAT ConnectionFormat; - PKSMULTIPLE_ITEM AttributeList; - ULONG StreamHeaderSize; - KSPIN_DATAFLOW DataFlow; - KSSTATE DeviceState; - KSRESET ResetState; - KSSTATE ClientState; -}; - -struct _KSMAPPING { - PHYSICAL_ADDRESS PhysicalAddress; - ULONG ByteCount; - ULONG Alignment; -}; - -struct _KSSTREAM_POINTER_OFFSET -{ -#if defined(_NTDDK_) - union { - PUCHAR Data; - PKSMAPPING Mappings; - }; -#else // !defined(_NTDDK_) - PUCHAR Data; -#endif // !defined(_NTDDK_) -#if !defined(_WIN64) - PVOID Alignment; -#endif // !defined(_WIN64) - ULONG Count; - ULONG Remaining; -}; - -struct _KSSTREAM_POINTER -{ - PVOID Context; - PKSPIN Pin; - PKSSTREAM_HEADER StreamHeader; - PKSSTREAM_POINTER_OFFSET Offset; - KSSTREAM_POINTER_OFFSET OffsetIn; - KSSTREAM_POINTER_OFFSET OffsetOut; -}; - -struct _KSPROCESSPIN { - PKSPIN Pin; - PKSSTREAM_POINTER StreamPointer; - PKSPROCESSPIN InPlaceCounterpart; - PKSPROCESSPIN DelegateBranch; - PKSPROCESSPIN CopySource; - PVOID Data; - ULONG BytesAvailable; - ULONG BytesUsed; - ULONG Flags; - BOOLEAN Terminate; -}; - -struct _KSPROCESSPIN_INDEXENTRY { - PKSPROCESSPIN *Pins; - ULONG Count; -}; - -typedef enum { - KsObjectTypeDevice, - KsObjectTypeFilterFactory, - KsObjectTypeFilter, - KsObjectTypePin -} KSOBJECTTYPE; - -typedef -void -(*PFNKSFREE)( - IN PVOID Data - ); - -typedef -void -(*PFNKSPINFRAMERETURN)( - IN PKSPIN Pin, - IN PVOID Data OPTIONAL, - IN ULONG Size OPTIONAL, - IN PMDL Mdl OPTIONAL, - IN PVOID Context OPTIONAL, - IN NTSTATUS Status - ); - -typedef -void -(*PFNKSPINIRPCOMPLETION)( - IN PKSPIN Pin, - IN PIRP Irp - ); - -#if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) -#if !defined(_IKsControl_) -#define _IKsControl_ - -typedef interface IKsControl* PIKSCONTROL; - -#if !defined(DEFINE_ABSTRACT_UNKNOWN) - -#define DEFINE_ABSTRACT_UNKNOWN() \ - STDMETHOD_(NTSTATUS, QueryInterface)(THIS_ \ - REFIID InterfaceId, \ - PVOID* Interface \ - ) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; - -#endif //!defined(DEFINE_ABSTRACT_UNKNOWN) - -#undef INTERFACE -#define INTERFACE IKsControl -DECLARE_INTERFACE_(IKsControl,IUnknown) -{ - DEFINE_ABSTRACT_UNKNOWN() // For C - - STDMETHOD_(NTSTATUS, KsProperty)(THIS_ - IN PKSPROPERTY Property, - IN ULONG PropertyLength, - IN OUT PVOID PropertyData, - IN ULONG DataLength, - OUT ULONG* BytesReturned - ) PURE; - STDMETHOD_(NTSTATUS, KsMethod)(THIS_ - IN PKSMETHOD Method, - IN ULONG MethodLength, - IN OUT PVOID MethodData, - IN ULONG DataLength, - OUT ULONG* BytesReturned - ) PURE; - STDMETHOD_(NTSTATUS, KsEvent)(THIS_ - IN PKSEVENT Event OPTIONAL, - IN ULONG EventLength, - IN OUT PVOID EventData, - IN ULONG DataLength, - OUT ULONG* BytesReturned - ) PURE; -}; - -typedef interface IKsReferenceClock* PIKSREFERENCECLOCK; - -#undef INTERFACE -#define INTERFACE IKsReferenceClock -DECLARE_INTERFACE_(IKsReferenceClock,IUnknown) -{ - DEFINE_ABSTRACT_UNKNOWN() // For C - - STDMETHOD_(LONGLONG,GetTime)(THIS - ) PURE; - STDMETHOD_(LONGLONG,GetPhysicalTime)(THIS - ) PURE; - STDMETHOD_(LONGLONG,GetCorrelatedTime)(THIS_ - OUT PLONGLONG SystemTime - ) PURE; - STDMETHOD_(LONGLONG,GetCorrelatedPhysicalTime)(THIS_ - OUT PLONGLONG SystemTime - ) PURE; - STDMETHOD_(NTSTATUS, GetResolution)(THIS_ - OUT PKSRESOLUTION Resolution - ) PURE; - STDMETHOD_(NTSTATUS, GetState)(THIS_ - OUT PKSSTATE State - ) PURE; -}; -#undef INTERFACE - -#define STATIC_IID_IKsControl \ -0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUID(IID_IKsControl, -0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96); -#if defined(__cplusplus) && _MSC_VER >= 1100 -struct __declspec(uuid("28F54685-06FD-11D2-B27A-00A0C9223196")) IKsControl; -#endif - -#define STATIC_IID_IKsFastClock \ -0xc9902485, 0xc180, 0x11d2, 0x84, 0x73, 0xd4, 0x23, 0x94, 0x45, 0x9e, 0x5e -DEFINE_GUID(IID_IKsFastClock, -0xc9902485, 0xc180, 0x11d2, 0x84, 0x73, 0xd4, 0x23, 0x94, 0x45, 0x9e, 0x5e); -#if defined(__cplusplus) && _MSC_VER >= 1100 -struct __declspec(uuid("C9902485-C180-11d2-8473-D42394459E5E")) IKsFastClock; -#endif - -#endif // !defined(_IKsControl_) -#endif // defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) - -#endif // defined(_NTDDK_) - -//=========================================================================== - -#if defined(__cplusplus) -extern "C" { -#endif // defined(__cplusplus) - -// -// exported prototypes -// - -#ifdef _KSDDK_ -#define KSDDKAPI -#else // !_KSDDK_ -#define KSDDKAPI DECLSPEC_IMPORT -#endif // _KSDDK_ - -#if defined(_NTDDK_) - -KSDDKAPI -NTSTATUS -NTAPI -KsEnableEvent( - IN PIRP Irp, - IN ULONG EventSetsCount, - IN const KSEVENT_SET* EventSet, - IN OUT PLIST_ENTRY EventsList OPTIONAL, - IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL, - IN PVOID EventsLock OPTIONAL - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsEnableEventWithAllocator( - IN PIRP Irp, - IN ULONG EventSetsCount, - IN const KSEVENT_SET* EventSet, - IN OUT PLIST_ENTRY EventsList OPTIONAL, - IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL, - IN PVOID EventsLock OPTIONAL, - IN PFNKSALLOCATOR Allocator OPTIONAL, - IN ULONG EventItemSize OPTIONAL - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsDisableEvent( - IN PIRP Irp, - IN OUT PLIST_ENTRY EventsList, - IN KSEVENTS_LOCKTYPE EventsFlags, - IN PVOID EventsLock - ); - -KSDDKAPI -VOID -NTAPI -KsDiscardEvent( - IN PKSEVENT_ENTRY EventEntry - ); - -KSDDKAPI -VOID -NTAPI -KsFreeEventList( - IN PFILE_OBJECT FileObject, - IN OUT PLIST_ENTRY EventsList, - IN KSEVENTS_LOCKTYPE EventsFlags, - IN PVOID EventsLock - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsGenerateEvent( - IN PKSEVENT_ENTRY EventEntry - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsGenerateDataEvent( - IN PKSEVENT_ENTRY EventEntry, - IN ULONG DataSize, - IN PVOID Data - ); - -KSDDKAPI -VOID -NTAPI -KsGenerateEventList( - IN GUID* Set OPTIONAL, - IN ULONG EventId, - IN PLIST_ENTRY EventsList, - IN KSEVENTS_LOCKTYPE EventsFlags, - IN PVOID EventsLock - ); - -// property.c: - -KSDDKAPI -NTSTATUS -NTAPI -KsPropertyHandler( - IN PIRP Irp, - IN ULONG PropertySetsCount, - IN const KSPROPERTY_SET* PropertySet - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsPropertyHandlerWithAllocator( - IN PIRP Irp, - IN ULONG PropertySetsCount, - IN const KSPROPERTY_SET* PropertySet, - IN PFNKSALLOCATOR Allocator OPTIONAL, - IN ULONG PropertyItemSize OPTIONAL - ); - -KSDDKAPI -BOOLEAN -NTAPI -KsFastPropertyHandler( - IN PFILE_OBJECT FileObject, - IN PKSPROPERTY Property, - IN ULONG PropertyLength, - IN OUT PVOID Data, - IN ULONG DataLength, - OUT PIO_STATUS_BLOCK IoStatus, - IN ULONG PropertySetsCount, - IN const KSPROPERTY_SET* PropertySet - ); - -// method.c: - -KSDDKAPI -NTSTATUS -NTAPI -KsMethodHandler( - IN PIRP Irp, - IN ULONG MethodSetsCount, - IN const KSMETHOD_SET* MethodSet - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsMethodHandlerWithAllocator( - IN PIRP Irp, - IN ULONG MethodSetsCount, - IN const KSMETHOD_SET* MethodSet, - IN PFNKSALLOCATOR Allocator OPTIONAL, - IN ULONG MethodItemSize OPTIONAL - ); - -KSDDKAPI -BOOLEAN -NTAPI -KsFastMethodHandler( - IN PFILE_OBJECT FileObject, - IN PKSMETHOD Method, - IN ULONG MethodLength, - IN OUT PVOID Data, - IN ULONG DataLength, - OUT PIO_STATUS_BLOCK IoStatus, - IN ULONG MethodSetsCount, - IN const KSMETHOD_SET* MethodSet - ); - -// alloc.c: - -KSDDKAPI -NTSTATUS -NTAPI -KsCreateDefaultAllocator( - IN PIRP Irp - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsCreateDefaultAllocatorEx( - IN PIRP Irp, - IN PVOID InitializeContext OPTIONAL, - IN PFNKSDEFAULTALLOCATE DefaultAllocate OPTIONAL, - IN PFNKSDEFAULTFREE DefaultFree OPTIONAL, - IN PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL, - IN PFNKSDELETEALLOCATOR DeleteAllocator OPTIONAL - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsCreateAllocator( - IN HANDLE ConnectionHandle, - IN PKSALLOCATOR_FRAMING AllocatorFraming, - OUT PHANDLE AllocatorHandle - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsValidateAllocatorCreateRequest( - IN PIRP Irp, - OUT PKSALLOCATOR_FRAMING* AllocatorFraming - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsValidateAllocatorFramingEx( - IN PKSALLOCATOR_FRAMING_EX Framing, - IN ULONG BufferSize, - IN const KSALLOCATOR_FRAMING_EX *PinFraming - ); - -// clock.c: - -KSDDKAPI -NTSTATUS -NTAPI -KsAllocateDefaultClock( - OUT PKSDEFAULTCLOCK* DefaultClock - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsAllocateDefaultClockEx( - OUT PKSDEFAULTCLOCK* DefaultClock, - IN PVOID Context OPTIONAL, - IN PFNKSSETTIMER SetTimer OPTIONAL, - IN PFNKSCANCELTIMER CancelTimer OPTIONAL, - IN PFNKSCORRELATEDTIME CorrelatedTime OPTIONAL, - IN const KSRESOLUTION* Resolution OPTIONAL, - IN ULONG Flags - ); - -KSDDKAPI -VOID -NTAPI -KsFreeDefaultClock( - IN PKSDEFAULTCLOCK DefaultClock - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsCreateDefaultClock( - IN PIRP Irp, - IN PKSDEFAULTCLOCK DefaultClock - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsCreateClock( - IN HANDLE ConnectionHandle, - IN PKSCLOCK_CREATE ClockCreate, - OUT PHANDLE ClockHandle - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsValidateClockCreateRequest( - IN PIRP Irp, - OUT PKSCLOCK_CREATE* ClockCreate - ); - -KSDDKAPI -KSSTATE -NTAPI -KsGetDefaultClockState( - IN PKSDEFAULTCLOCK DefaultClock - ); - -KSDDKAPI -VOID -NTAPI -KsSetDefaultClockState( - IN PKSDEFAULTCLOCK DefaultClock, - IN KSSTATE State - ); - -KSDDKAPI -LONGLONG -NTAPI -KsGetDefaultClockTime( - IN PKSDEFAULTCLOCK DefaultClock - ); - -KSDDKAPI -VOID -NTAPI -KsSetDefaultClockTime( - IN PKSDEFAULTCLOCK DefaultClock, - IN LONGLONG Time - ); - -// connect.c: - -KSDDKAPI -NTSTATUS -NTAPI -KsCreatePin( - IN HANDLE FilterHandle, - IN PKSPIN_CONNECT Connect, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE ConnectionHandle - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsValidateConnectRequest( - IN PIRP Irp, - IN ULONG DescriptorsCount, - IN const KSPIN_DESCRIPTOR* Descriptor, - OUT PKSPIN_CONNECT* Connect - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsPinPropertyHandler( - IN PIRP Irp, - IN PKSPROPERTY Property, - IN OUT PVOID Data, - IN ULONG DescriptorsCount, - IN const KSPIN_DESCRIPTOR* Descriptor - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsPinDataIntersection( - IN PIRP Irp, - IN PKSP_PIN Pin, - OUT PVOID Data OPTIONAL, - IN ULONG DescriptorsCount, - IN const KSPIN_DESCRIPTOR* Descriptor, - IN PFNKSINTERSECTHANDLER IntersectHandler - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsPinDataIntersectionEx( - IN PIRP Irp, - IN PKSP_PIN Pin, - OUT PVOID Data, - IN ULONG DescriptorsCount, - IN const KSPIN_DESCRIPTOR* Descriptor, - IN ULONG DescriptorSize, - IN PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL, - IN PVOID HandlerContext OPTIONAL - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsHandleSizedListQuery( - IN PIRP Irp, - IN ULONG DataItemsCount, - IN ULONG DataItemSize, - IN const VOID* DataItems - ); - -// image.c: - -#if (!defined( MAKEINTRESOURCE )) -#define MAKEINTRESOURCE( res ) ((ULONG_PTR) (USHORT) res) -#endif - -#if (!defined( RT_STRING )) -#define RT_STRING MAKEINTRESOURCE( 6 ) -#define RT_RCDATA MAKEINTRESOURCE( 10 ) -#endif - -KSDDKAPI -NTSTATUS -NTAPI -KsLoadResource( - IN PVOID ImageBase, - IN POOL_TYPE PoolType, - IN ULONG_PTR ResourceName, - IN ULONG ResourceType, - OUT PVOID *Resource, - OUT PULONG ResourceSize - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsGetImageNameAndResourceId( - IN HANDLE RegKey, - OUT PUNICODE_STRING ImageName, - OUT PULONG_PTR ResourceId, - OUT PULONG ValueType -); - -KSDDKAPI -NTSTATUS -NTAPI -KsMapModuleName( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PUNICODE_STRING ModuleName, - OUT PUNICODE_STRING ImageName, - OUT PULONG_PTR ResourceId, - OUT PULONG ValueType - ); - -// irp.c: - -KSDDKAPI -NTSTATUS -NTAPI -KsReferenceBusObject( - IN KSDEVICE_HEADER Header - ); - -KSDDKAPI -VOID -NTAPI -KsDereferenceBusObject( - IN KSDEVICE_HEADER Header - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsDispatchQuerySecurity( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsDispatchSetSecurity( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsDispatchSpecificProperty( - IN PIRP Irp, - IN PFNKSHANDLER Handler - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsDispatchSpecificMethod( - IN PIRP Irp, - IN PFNKSHANDLER Handler - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsReadFile( - IN PFILE_OBJECT FileObject, - IN PKEVENT Event OPTIONAL, - IN PVOID PortContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length, - IN ULONG Key OPTIONAL, - IN KPROCESSOR_MODE RequestorMode - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsWriteFile( - IN PFILE_OBJECT FileObject, - IN PKEVENT Event OPTIONAL, - IN PVOID PortContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID Buffer, - IN ULONG Length, - IN ULONG Key OPTIONAL, - IN KPROCESSOR_MODE RequestorMode - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsQueryInformationFile( - IN PFILE_OBJECT FileObject, - OUT PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsSetInformationFile( - IN PFILE_OBJECT FileObject, - IN PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsStreamIo( - IN PFILE_OBJECT FileObject, - IN PKEVENT Event OPTIONAL, - IN PVOID PortContext OPTIONAL, - IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL, - IN PVOID CompletionContext OPTIONAL, - IN KSCOMPLETION_INVOCATION CompletionInvocationFlags OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN OUT PVOID StreamHeaders, - IN ULONG Length, - IN ULONG Flags, - IN KPROCESSOR_MODE RequestorMode - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsProbeStreamIrp( - IN OUT PIRP Irp, - IN ULONG ProbeFlags, - IN ULONG HeaderSize OPTIONAL - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsAllocateExtraData( - IN OUT PIRP Irp, - IN ULONG ExtraSize, - OUT PVOID* ExtraBuffer - ); - -KSDDKAPI -VOID -NTAPI -KsNullDriverUnload( - IN PDRIVER_OBJECT DriverObject - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsSetMajorFunctionHandler( - IN PDRIVER_OBJECT DriverObject, - IN ULONG MajorFunction - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsDispatchInvalidDeviceRequest( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsDefaultDeviceIoCompletion( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsDispatchIrp( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - -KSDDKAPI -BOOLEAN -NTAPI -KsDispatchFastIoDeviceControlFailure( - IN PFILE_OBJECT FileObject, - IN BOOLEAN Wait, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength, - IN ULONG IoControlCode, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject - ); - -KSDDKAPI -BOOLEAN -NTAPI -KsDispatchFastReadFailure( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject - ); - -#define KsDispatchFastWriteFailure KsDispatchFastReadFailure - -KSDDKAPI -VOID -NTAPI -KsCancelRoutine( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - -KSDDKAPI -VOID -NTAPI -KsCancelIo( - IN OUT PLIST_ENTRY QueueHead, - IN PKSPIN_LOCK SpinLock - ); - -KSDDKAPI -VOID -NTAPI -KsReleaseIrpOnCancelableQueue( - IN PIRP Irp, - IN PDRIVER_CANCEL DriverCancel OPTIONAL - ); - -KSDDKAPI -PIRP -NTAPI -KsRemoveIrpFromCancelableQueue( - IN OUT PLIST_ENTRY QueueHead, - IN PKSPIN_LOCK SpinLock, - IN KSLIST_ENTRY_LOCATION ListLocation, - IN KSIRP_REMOVAL_OPERATION RemovalOperation - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsMoveIrpsOnCancelableQueue( - IN OUT PLIST_ENTRY SourceList, - IN PKSPIN_LOCK SourceLock, - IN OUT PLIST_ENTRY DestinationList, - IN PKSPIN_LOCK DestinationLock OPTIONAL, - IN KSLIST_ENTRY_LOCATION ListLocation, - IN PFNKSIRPLISTCALLBACK ListCallback, - IN PVOID Context - ); - -KSDDKAPI -VOID -NTAPI -KsRemoveSpecificIrpFromCancelableQueue( - IN PIRP Irp - ); - -KSDDKAPI -VOID -NTAPI -KsAddIrpToCancelableQueue( - IN OUT PLIST_ENTRY QueueHead, - IN PKSPIN_LOCK SpinLock, - IN PIRP Irp, - IN KSLIST_ENTRY_LOCATION ListLocation, - IN PDRIVER_CANCEL DriverCancel OPTIONAL - ); - -// api.c: - -KSDDKAPI -NTSTATUS -NTAPI -KsAcquireResetValue( - IN PIRP Irp, - OUT KSRESET* ResetValue - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsTopologyPropertyHandler( - IN PIRP Irp, - IN PKSPROPERTY Property, - IN OUT PVOID Data, - IN const KSTOPOLOGY* Topology - ); - -KSDDKAPI -VOID -NTAPI -KsAcquireDeviceSecurityLock( - IN KSDEVICE_HEADER Header, - IN BOOLEAN Exclusive - ); - -KSDDKAPI -VOID -NTAPI -KsReleaseDeviceSecurityLock( - IN KSDEVICE_HEADER Header - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsDefaultDispatchPnp( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsDefaultDispatchPower( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsDefaultForwardIrp( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - -KSDDKAPI -VOID -NTAPI -KsSetDevicePnpAndBaseObject( - IN KSDEVICE_HEADER Header, - IN PDEVICE_OBJECT PnpDeviceObject, - IN PDEVICE_OBJECT BaseObject - ); - -KSDDKAPI -PDEVICE_OBJECT -NTAPI -KsQueryDevicePnpObject( - IN KSDEVICE_HEADER Header - ); - -KSDDKAPI -ACCESS_MASK -NTAPI -KsQueryObjectAccessMask( - IN KSOBJECT_HEADER Header - ); - -KSDDKAPI -VOID -NTAPI -KsRecalculateStackDepth( - IN KSDEVICE_HEADER Header, - IN BOOLEAN ReuseStackLocation - ); - -KSDDKAPI -VOID -NTAPI -KsSetTargetState( - IN KSOBJECT_HEADER Header, - IN KSTARGET_STATE TargetState - ); - -KSDDKAPI -VOID -NTAPI -KsSetTargetDeviceObject( - IN KSOBJECT_HEADER Header, - IN PDEVICE_OBJECT TargetDevice OPTIONAL - ); - -KSDDKAPI -VOID -NTAPI -KsSetPowerDispatch( - IN KSOBJECT_HEADER Header, - IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL, - IN PVOID PowerContext OPTIONAL - ); - -KSDDKAPI -PKSOBJECT_CREATE_ITEM -NTAPI -KsQueryObjectCreateItem( - IN KSOBJECT_HEADER Header - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsAllocateDeviceHeader( - OUT KSDEVICE_HEADER* Header, - IN ULONG ItemsCount, - IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL - ); - -KSDDKAPI -VOID -NTAPI -KsFreeDeviceHeader( - IN KSDEVICE_HEADER Header - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsAllocateObjectHeader( - OUT KSOBJECT_HEADER* Header, - IN ULONG ItemsCount, - IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL, - IN PIRP Irp, - IN const KSDISPATCH_TABLE* Table - ); - -KSDDKAPI -VOID -NTAPI -KsFreeObjectHeader( - IN KSOBJECT_HEADER Header - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsAddObjectCreateItemToDeviceHeader( - IN KSDEVICE_HEADER Header, - IN PDRIVER_DISPATCH Create, - IN PVOID Context, - IN PWCHAR ObjectClass, - IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsAddObjectCreateItemToObjectHeader( - IN KSOBJECT_HEADER Header, - IN PDRIVER_DISPATCH Create, - IN PVOID Context, - IN PWCHAR ObjectClass, - IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsAllocateObjectCreateItem( - IN KSDEVICE_HEADER Header, - IN PKSOBJECT_CREATE_ITEM CreateItem, - IN BOOLEAN AllocateEntry, - IN PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsFreeObjectCreateItem( - IN KSDEVICE_HEADER Header, - IN PUNICODE_STRING CreateItem - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsFreeObjectCreateItemsByContext( - IN KSDEVICE_HEADER Header, - IN PVOID Context - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsCreateDefaultSecurity( - IN PSECURITY_DESCRIPTOR ParentSecurity OPTIONAL, - OUT PSECURITY_DESCRIPTOR* DefaultSecurity - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsForwardIrp( - IN PIRP Irp, - IN PFILE_OBJECT FileObject, - IN BOOLEAN ReuseStackLocation - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsForwardAndCatchIrp( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PFILE_OBJECT FileObject, - IN KSSTACK_USE StackUse - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsSynchronousIoControlDevice( - IN PFILE_OBJECT FileObject, - IN KPROCESSOR_MODE RequestorMode, - IN ULONG IoControl, - IN PVOID InBuffer, - IN ULONG InSize, - OUT PVOID OutBuffer, - IN ULONG OutSize, - OUT PULONG BytesReturned - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsUnserializeObjectPropertiesFromRegistry( - IN PFILE_OBJECT FileObject, - IN HANDLE ParentKey OPTIONAL, - IN PUNICODE_STRING RegistryPath OPTIONAL - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsCacheMedium( - IN PUNICODE_STRING SymbolicLink, - IN PKSPIN_MEDIUM Medium, - IN ULONG PinDirection - ); - -// thread.c: - -KSDDKAPI -NTSTATUS -NTAPI -KsRegisterWorker( - IN WORK_QUEUE_TYPE WorkQueueType, - OUT PKSWORKER* Worker - ); -KSDDKAPI -NTSTATUS -NTAPI -KsRegisterCountedWorker( - IN WORK_QUEUE_TYPE WorkQueueType, - IN PWORK_QUEUE_ITEM CountedWorkItem, - OUT PKSWORKER* Worker - ); -KSDDKAPI -VOID -NTAPI -KsUnregisterWorker( - IN PKSWORKER Worker - ); -KSDDKAPI -NTSTATUS -NTAPI -KsQueueWorkItem( - IN PKSWORKER Worker, - IN PWORK_QUEUE_ITEM WorkItem - ); -KSDDKAPI -ULONG -NTAPI -KsIncrementCountedWorker( - IN PKSWORKER Worker - ); -KSDDKAPI -ULONG -NTAPI -KsDecrementCountedWorker( - IN PKSWORKER Worker - ); - -// topology.c: - -KSDDKAPI -NTSTATUS -NTAPI -KsCreateTopologyNode( - IN HANDLE ParentHandle, - IN PKSNODE_CREATE NodeCreate, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE NodeHandle - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsValidateTopologyNodeCreateRequest( - IN PIRP Irp, - IN PKSTOPOLOGY Topology, - OUT PKSNODE_CREATE* NodeCreate - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsMergeAutomationTables( - OUT PKSAUTOMATION_TABLE* AutomationTableAB, - IN PKSAUTOMATION_TABLE AutomationTableA OPTIONAL, - IN PKSAUTOMATION_TABLE AutomationTableB OPTIONAL, - IN KSOBJECT_BAG Bag OPTIONAL - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsInitializeDriver( - IN PDRIVER_OBJECT DriverObject, - IN PUNICODE_STRING RegistryPathName, - IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsAddDevice( - IN PDRIVER_OBJECT DriverObject, - IN PDEVICE_OBJECT PhysicalDeviceObject - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsCreateDevice( - IN PDRIVER_OBJECT DriverObject, - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL, - IN ULONG ExtensionSize OPTIONAL, - OUT PKSDEVICE* Device OPTIONAL - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsInitializeDevice( - IN PDEVICE_OBJECT FunctionalDeviceObject, - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PDEVICE_OBJECT NextDeviceObject, - IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL - ); - -KSDDKAPI -void -NTAPI -KsTerminateDevice( - IN PDEVICE_OBJECT DeviceObject - ); - -KSDDKAPI -PKSDEVICE -NTAPI -KsGetDeviceForDeviceObject( - IN PDEVICE_OBJECT FunctionalDeviceObject - ); - -KSDDKAPI -void -NTAPI -KsAcquireDevice( - IN PKSDEVICE Device - ); - -KSDDKAPI -void -NTAPI -KsReleaseDevice( - IN PKSDEVICE Device - ); - -KSDDKAPI -void -NTAPI -KsDeviceRegisterAdapterObject( - IN PKSDEVICE Device, - IN PADAPTER_OBJECT AdapterObject, - IN ULONG MaxMappingsByteCount, - IN ULONG MappingTableStride - ); - -KSDDKAPI -ULONG -NTAPI -KsDeviceGetBusData( - IN PKSDEVICE Device, - IN ULONG DataType, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length - ); - -KSDDKAPI -ULONG -NTAPI -KsDeviceSetBusData( - IN PKSDEVICE Device, - IN ULONG DataType, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsCreateFilterFactory( - IN PDEVICE_OBJECT DeviceObject, - IN const KSFILTER_DESCRIPTOR* Descriptor, - IN PWCHAR RefString OPTIONAL, - IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL, - IN ULONG CreateItemFlags, - IN PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL, - IN PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL, - OUT PKSFILTERFACTORY* FilterFactory OPTIONAL - ); - -#define KsDeleteFilterFactory(FilterFactory) \ - KsFreeObjectCreateItemsByContext(\ - *(KSDEVICE_HEADER *)(\ - KsFilterFactoryGetParentDevice(FilterFactory)->FunctionalDeviceObject->\ - DeviceExtension),\ - FilterFactory) - -KSDDKAPI -NTSTATUS -NTAPI -KsFilterFactoryUpdateCacheData( - IN PKSFILTERFACTORY FilterFactory, - IN const KSFILTER_DESCRIPTOR *FilterDescriptor OPTIONAL - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsFilterFactoryAddCreateItem( - IN PKSFILTERFACTORY FilterFactory, - IN PWCHAR RefString, - IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL, - IN ULONG CreateItemFlags - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsFilterFactorySetDeviceClassesState( - IN PKSFILTERFACTORY FilterFactory, - IN BOOLEAN NewState - ); - -KSDDKAPI -PUNICODE_STRING -NTAPI -KsFilterFactoryGetSymbolicLink( - IN PKSFILTERFACTORY FilterFactory - ); - -KSDDKAPI -void -NTAPI -KsAddEvent( - IN PVOID Object, - IN PKSEVENT_ENTRY EventEntry - ); - -void _inline -KsFilterAddEvent( - IN PKSFILTER Filter, - IN PKSEVENT_ENTRY EventEntry - ) -{ - KsAddEvent(Filter,EventEntry); -} - -void _inline -KsPinAddEvent( - IN PKSPIN Pin, - IN PKSEVENT_ENTRY EventEntry - ) -{ - KsAddEvent(Pin,EventEntry); -} - -KSDDKAPI -NTSTATUS -NTAPI -KsDefaultAddEventHandler( - IN PIRP Irp, - IN PKSEVENTDATA EventData, - IN OUT PKSEVENT_ENTRY EventEntry - ); - -KSDDKAPI -void -NTAPI -KsGenerateEvents( - IN PVOID Object, - IN const GUID* EventSet OPTIONAL, - IN ULONG EventId, - IN ULONG DataSize, - IN PVOID Data OPTIONAL, - IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL, - IN PVOID CallBackContext OPTIONAL - ); - -void _inline -KsFilterGenerateEvents( - IN PKSFILTER Filter, - IN const GUID* EventSet OPTIONAL, - IN ULONG EventId, - IN ULONG DataSize, - IN PVOID Data OPTIONAL, - IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL, - IN PVOID CallBackContext OPTIONAL - ) -{ - KsGenerateEvents( - Filter, - EventSet, - EventId, - DataSize, - Data, - CallBack, - CallBackContext); -} - -void _inline -KsPinGenerateEvents( - IN PKSPIN Pin, - IN const GUID* EventSet OPTIONAL, - IN ULONG EventId, - IN ULONG DataSize, - IN PVOID Data OPTIONAL, - IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL, - IN PVOID CallBackContext OPTIONAL - ) -{ - KsGenerateEvents( - Pin, - EventSet, - EventId, - DataSize, - Data, - CallBack, - CallBackContext); -} - -typedef enum { - KSSTREAM_POINTER_STATE_UNLOCKED = 0, - KSSTREAM_POINTER_STATE_LOCKED -} KSSTREAM_POINTER_STATE; - -KSDDKAPI -NTSTATUS -NTAPI -KsPinGetAvailableByteCount( - IN PKSPIN Pin, - OUT PLONG InputDataBytes OPTIONAL, - OUT PLONG OutputBufferBytes OPTIONAL - ); - -KSDDKAPI -PKSSTREAM_POINTER -NTAPI -KsPinGetLeadingEdgeStreamPointer( - IN PKSPIN Pin, - IN KSSTREAM_POINTER_STATE State - ); - -KSDDKAPI -PKSSTREAM_POINTER -NTAPI -KsPinGetTrailingEdgeStreamPointer( - IN PKSPIN Pin, - IN KSSTREAM_POINTER_STATE State - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsStreamPointerSetStatusCode( - IN PKSSTREAM_POINTER StreamPointer, - IN NTSTATUS Status - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsStreamPointerLock( - IN PKSSTREAM_POINTER StreamPointer - ); - -KSDDKAPI -void -NTAPI -KsStreamPointerUnlock( - IN PKSSTREAM_POINTER StreamPointer, - IN BOOLEAN Eject - ); - -KSDDKAPI -void -NTAPI -KsStreamPointerAdvanceOffsetsAndUnlock( - IN PKSSTREAM_POINTER StreamPointer, - IN ULONG InUsed, - IN ULONG OutUsed, - IN BOOLEAN Eject - ); - -KSDDKAPI -void -NTAPI -KsStreamPointerDelete( - IN PKSSTREAM_POINTER StreamPointer - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsStreamPointerClone( - IN PKSSTREAM_POINTER StreamPointer, - IN PFNKSSTREAMPOINTER CancelCallback OPTIONAL, - IN ULONG ContextSize, - OUT PKSSTREAM_POINTER* CloneStreamPointer - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsStreamPointerAdvanceOffsets( - IN PKSSTREAM_POINTER StreamPointer, - IN ULONG InUsed, - IN ULONG OutUsed, - IN BOOLEAN Eject - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsStreamPointerAdvance( - IN PKSSTREAM_POINTER StreamPointer - ); - -KSDDKAPI -PMDL -NTAPI -KsStreamPointerGetMdl( - IN PKSSTREAM_POINTER StreamPointer - ); - -KSDDKAPI -PIRP -NTAPI -KsStreamPointerGetIrp( - IN PKSSTREAM_POINTER StreamPointer, - OUT PBOOLEAN FirstFrameInIrp OPTIONAL, - OUT PBOOLEAN LastFrameInIrp OPTIONAL - ); - -KSDDKAPI -void -NTAPI -KsStreamPointerScheduleTimeout( - IN PKSSTREAM_POINTER StreamPointer, - IN PFNKSSTREAMPOINTER Callback, - IN ULONGLONG Interval - ); - -KSDDKAPI -void -NTAPI -KsStreamPointerCancelTimeout( - IN PKSSTREAM_POINTER StreamPointer - ); - -KSDDKAPI -PKSSTREAM_POINTER -NTAPI -KsPinGetFirstCloneStreamPointer( - IN PKSPIN Pin - ); - -KSDDKAPI -PKSSTREAM_POINTER -NTAPI -KsStreamPointerGetNextClone( - IN PKSSTREAM_POINTER StreamPointer - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsPinHandshake( - IN PKSPIN Pin, - IN PKSHANDSHAKE In, - OUT PKSHANDSHAKE Out - ); - -KSDDKAPI -void -NTAPI -KsCompletePendingRequest( - IN PIRP Irp - ); - -KSDDKAPI -KSOBJECTTYPE -NTAPI -KsGetObjectTypeFromIrp( - IN PIRP Irp - ); - -KSDDKAPI -PVOID -NTAPI -KsGetObjectFromFileObject( - IN PFILE_OBJECT FileObject - ); - -KSDDKAPI -KSOBJECTTYPE -NTAPI -KsGetObjectTypeFromFileObject( - IN PFILE_OBJECT FileObject - ); - -PKSFILTER __inline -KsGetFilterFromFileObject( - IN PFILE_OBJECT FileObject - ) -{ - return (PKSFILTER) KsGetObjectFromFileObject(FileObject); -} - -PKSPIN __inline -KsGetPinFromFileObject( - IN PFILE_OBJECT FileObject - ) -{ - return (PKSPIN) KsGetObjectFromFileObject(FileObject); -} - -KSDDKAPI -PKSGATE -NTAPI -KsFilterGetAndGate( - IN PKSFILTER Filter - ); - -KSDDKAPI -void -NTAPI -KsFilterAcquireProcessingMutex( - IN PKSFILTER Filter - ); - -KSDDKAPI -void -NTAPI -KsFilterReleaseProcessingMutex( - IN PKSFILTER Filter - ); - -KSDDKAPI -void -NTAPI -KsFilterAttemptProcessing( - IN PKSFILTER Filter, - IN BOOLEAN Asynchronous - ); - -KSDDKAPI -PKSGATE -NTAPI -KsPinGetAndGate( - IN PKSPIN Pin - ); - -KSDDKAPI -void -NTAPI -KsPinAttachAndGate( - IN PKSPIN Pin, - IN PKSGATE AndGate OPTIONAL - ); - -KSDDKAPI -void -NTAPI -KsPinAttachOrGate( - IN PKSPIN Pin, - IN PKSGATE OrGate OPTIONAL - ); - -KSDDKAPI -void -NTAPI -KsPinAcquireProcessingMutex( - IN PKSPIN Pin - ); - -KSDDKAPI -void -NTAPI -KsPinReleaseProcessingMutex( - IN PKSPIN Pin - ); - -KSDDKAPI -BOOLEAN -NTAPI -KsProcessPinUpdate( - IN PKSPROCESSPIN ProcessPin - ); - -KSDDKAPI -void -NTAPI -KsPinGetCopyRelationships( - IN PKSPIN Pin, - OUT PKSPIN* CopySource, - OUT PKSPIN* DelegateBranch - ); - -KSDDKAPI -void -NTAPI -KsPinAttemptProcessing( - IN PKSPIN Pin, - IN BOOLEAN Asynchronous - ); - -KSDDKAPI -PVOID -NTAPI -KsGetParent( - IN PVOID Object - ); - -PKSDEVICE __inline -KsFilterFactoryGetParentDevice( - IN PKSFILTERFACTORY FilterFactory - ) -{ - return (PKSDEVICE) KsGetParent((PVOID) FilterFactory); -} - -PKSFILTERFACTORY __inline -KsFilterGetParentFilterFactory( - IN PKSFILTER Filter - ) -{ - return (PKSFILTERFACTORY) KsGetParent((PVOID) Filter); -} - -KSDDKAPI -PKSFILTER -NTAPI -KsPinGetParentFilter( - IN PKSPIN Pin - ); - -KSDDKAPI -PVOID -NTAPI -KsGetFirstChild( - IN PVOID Object - ); - -PKSFILTERFACTORY __inline -KsDeviceGetFirstChildFilterFactory( - IN PKSDEVICE Device - ) -{ - return (PKSFILTERFACTORY) KsGetFirstChild((PVOID) Device); -} - -PKSFILTER __inline -KsFilterFactoryGetFirstChildFilter( - IN PKSFILTERFACTORY FilterFactory - ) -{ - return (PKSFILTER) KsGetFirstChild((PVOID) FilterFactory); -} - -KSDDKAPI -ULONG -NTAPI -KsFilterGetChildPinCount( - IN PKSFILTER Filter, - IN ULONG PinId - ); - -KSDDKAPI -PKSPIN -NTAPI -KsFilterGetFirstChildPin( - IN PKSFILTER Filter, - IN ULONG PinId - ); - -KSDDKAPI -PVOID -NTAPI -KsGetNextSibling( - IN PVOID Object - ); - -KSDDKAPI -PKSPIN -NTAPI -KsPinGetNextSiblingPin( - IN PKSPIN Pin - ); - -PKSFILTERFACTORY __inline -KsFilterFactoryGetNextSiblingFilterFactory( - IN PKSFILTERFACTORY FilterFactory - ) -{ - return (PKSFILTERFACTORY) KsGetNextSibling((PVOID) FilterFactory); -} - -PKSFILTER __inline -KsFilterGetNextSiblingFilter( - IN PKSFILTER Filter - ) -{ - return (PKSFILTER) KsGetNextSibling((PVOID) Filter); -} - - -KSDDKAPI -PKSDEVICE -NTAPI -KsGetDevice( - IN PVOID Object - ); - -PKSDEVICE __inline -KsFilterFactoryGetDevice( - IN PKSFILTERFACTORY FilterFactory - ) -{ - return KsGetDevice((PVOID) FilterFactory); -} - -PKSDEVICE __inline -KsFilterGetDevice( - IN PKSFILTER Filter - ) -{ - return KsGetDevice((PVOID) Filter); -} - -PKSDEVICE __inline -KsPinGetDevice( - IN PKSPIN Pin - ) -{ - return KsGetDevice((PVOID) Pin); -} - -KSDDKAPI -PKSFILTER -NTAPI -KsGetFilterFromIrp( - IN PIRP Irp - ); - -KSDDKAPI -PKSPIN -NTAPI -KsGetPinFromIrp( - IN PIRP Irp - ); - -KSDDKAPI -ULONG -NTAPI -KsGetNodeIdFromIrp( - IN PIRP Irp - ); - -KSDDKAPI -void -NTAPI -KsAcquireControl( - IN PVOID Object - ); - -KSDDKAPI -void -NTAPI -KsReleaseControl( - IN PVOID Object - ); - -void __inline -KsFilterAcquireControl( - IN PKSFILTER Filter - ) -{ - KsAcquireControl((PVOID) Filter); -} - -void __inline -KsFilterReleaseControl( - IN PKSFILTER Filter - ) -{ - KsReleaseControl((PVOID) Filter); -} - -void __inline -KsPinAcquireControl( - IN PKSPIN Pin - ) -{ - KsAcquireControl((PVOID) Pin); -} - -void __inline -KsPinReleaseControl( - IN PKSPIN Pin - ) -{ - KsReleaseControl((PVOID) Pin); -} - -KSDDKAPI -NTSTATUS -NTAPI -KsAddItemToObjectBag( - IN KSOBJECT_BAG ObjectBag, - IN PVOID Item, - IN PFNKSFREE Free OPTIONAL - ); - -KSDDKAPI -ULONG -NTAPI -KsRemoveItemFromObjectBag( - IN KSOBJECT_BAG ObjectBag, - IN PVOID Item, - IN BOOLEAN Free - ); - -#define KsDiscard(Object,Pointer)\ - KsRemoveItemFromObjectBag(\ - (Object)->Bag,\ - (PVOID)(Pointer),\ - TRUE) - -KSDDKAPI -NTSTATUS -NTAPI -KsAllocateObjectBag( - IN PKSDEVICE Device, - OUT KSOBJECT_BAG* ObjectBag - ); - -KSDDKAPI -void -NTAPI -KsFreeObjectBag( - IN KSOBJECT_BAG ObjectBag - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsCopyObjectBagItems( - IN KSOBJECT_BAG ObjectBagDestination, - IN KSOBJECT_BAG ObjectBagSource - ); - -KSDDKAPI -NTSTATUS -NTAPI -_KsEdit( - IN KSOBJECT_BAG ObjectBag, - IN OUT PVOID* PointerToPointerToItem, - IN ULONG NewSize, - IN ULONG OldSize, - IN ULONG Tag - ); - -#define KsEdit(Object,PointerToPointer,Tag)\ - _KsEdit(\ - (Object)->Bag,\ - (PVOID*)(PointerToPointer),\ - sizeof(**(PointerToPointer)),\ - sizeof(**(PointerToPointer)),\ - (Tag)) -#define KsEditSized(Object,PointerToPointer,NewSize,OldSize,Tag)\ - _KsEdit((Object)->Bag,(PVOID*)(PointerToPointer),(NewSize),(OldSize),(Tag)) - -KSDDKAPI -NTSTATUS -NTAPI -KsRegisterFilterWithNoKSPins( - IN PDEVICE_OBJECT DeviceObject, - IN const GUID * InterfaceClassGUID, - IN ULONG PinCount, - IN BOOL * PinDirection, - IN KSPIN_MEDIUM * MediumList, - IN OPTIONAL GUID * CategoryList -); - -KSDDKAPI -NTSTATUS -NTAPI -KsFilterCreatePinFactory ( - IN PKSFILTER Filter, - IN const KSPIN_DESCRIPTOR_EX *const PinDescriptor, - OUT PULONG PinID - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsFilterCreateNode ( - IN PKSFILTER Filter, - IN const KSNODE_DESCRIPTOR *const NodeDescriptor, - OUT PULONG NodeID - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsFilterAddTopologyConnections ( - IN PKSFILTER Filter, - IN ULONG NewConnectionsCount, - IN const KSTOPOLOGY_CONNECTION *const NewTopologyConnections - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsPinGetConnectedPinInterface( - IN PKSPIN Pin, - IN const GUID* InterfaceId, - OUT PVOID* Interface - ); - -KSDDKAPI -PFILE_OBJECT -NTAPI -KsPinGetConnectedPinFileObject( - IN PKSPIN Pin - ); - -KSDDKAPI -PDEVICE_OBJECT -NTAPI -KsPinGetConnectedPinDeviceObject( - IN PKSPIN Pin - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsPinGetConnectedFilterInterface( - IN PKSPIN Pin, - IN const GUID* InterfaceId, - OUT PVOID* Interface - ); - -#if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) - -KSDDKAPI -NTSTATUS -NTAPI -KsPinGetReferenceClockInterface( - IN PKSPIN Pin, - OUT PIKSREFERENCECLOCK* Interface - ); - -#endif //defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) - -KSDDKAPI -VOID -NTAPI -KsPinSetPinClockTime( - IN PKSPIN Pin, - IN LONGLONG Time - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsPinSubmitFrame( - IN PKSPIN Pin, - IN PVOID Data OPTIONAL, - IN ULONG Size OPTIONAL, - IN PKSSTREAM_HEADER StreamHeader OPTIONAL, - IN PVOID Context OPTIONAL - ); - -KSDDKAPI -NTSTATUS -NTAPI -KsPinSubmitFrameMdl( - IN PKSPIN Pin, - IN PMDL Mdl OPTIONAL, - IN PKSSTREAM_HEADER StreamHeader OPTIONAL, - IN PVOID Context OPTIONAL - ); - -KSDDKAPI -void -NTAPI -KsPinRegisterFrameReturnCallback( - IN PKSPIN Pin, - IN PFNKSPINFRAMERETURN FrameReturn - ); - -KSDDKAPI -void -NTAPI -KsPinRegisterIrpCompletionCallback( - IN PKSPIN Pin, - IN PFNKSPINIRPCOMPLETION IrpCompletion - ); - -KSDDKAPI -void -NTAPI -KsPinRegisterHandshakeCallback( - IN PKSPIN Pin, - IN PFNKSPINHANDSHAKE Handshake - ); - -KSDDKAPI -void -NTAPI -KsFilterRegisterPowerCallbacks( - IN PKSFILTER Filter, - IN PFNKSFILTERPOWER Sleep OPTIONAL, - IN PFNKSFILTERPOWER Wake OPTIONAL - ); - -KSDDKAPI -void -NTAPI -KsPinRegisterPowerCallbacks( - IN PKSPIN Pin, - IN PFNKSPINPOWER Sleep OPTIONAL, - IN PFNKSPINPOWER Wake OPTIONAL - ); - -#if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) - -KSDDKAPI -PUNKNOWN -NTAPI -KsRegisterAggregatedClientUnknown( - IN PVOID Object, - IN PUNKNOWN ClientUnknown - ); - -KSDDKAPI -PUNKNOWN -NTAPI -KsGetOuterUnknown( - IN PVOID Object - ); - -PUNKNOWN __inline -KsDeviceRegisterAggregatedClientUnknown( - IN PKSDEVICE Device, - IN PUNKNOWN ClientUnknown - ) -{ - return KsRegisterAggregatedClientUnknown((PVOID) Device,ClientUnknown); -} - -PUNKNOWN __inline -KsDeviceGetOuterUnknown( - IN PKSDEVICE Device - ) -{ - return KsGetOuterUnknown((PVOID) Device); -} - -PUNKNOWN __inline -KsFilterFactoryRegisterAggregatedClientUnknown( - IN PKSFILTERFACTORY FilterFactory, - IN PUNKNOWN ClientUnknown - ) -{ - return KsRegisterAggregatedClientUnknown((PVOID) FilterFactory,ClientUnknown); -} - -PUNKNOWN __inline -KsFilterFactoryGetOuterUnknown( - IN PKSFILTERFACTORY FilterFactory - ) -{ - return KsGetOuterUnknown((PVOID) FilterFactory); -} - -PUNKNOWN __inline -KsFilterRegisterAggregatedClientUnknown( - IN PKSFILTER Filter, - IN PUNKNOWN ClientUnknown - ) -{ - return KsRegisterAggregatedClientUnknown((PVOID) Filter,ClientUnknown); -} - -PUNKNOWN __inline -KsFilterGetOuterUnknown( - IN PKSFILTER Filter - ) -{ - return KsGetOuterUnknown((PVOID) Filter); -} - -PUNKNOWN __inline -KsPinRegisterAggregatedClientUnknown( - IN PKSPIN Pin, - IN PUNKNOWN ClientUnknown - ) -{ - return KsRegisterAggregatedClientUnknown((PVOID) Pin,ClientUnknown); -} - -PUNKNOWN __inline -KsPinGetOuterUnknown( - IN PKSPIN Pin - ) -{ - return KsGetOuterUnknown((PVOID) Pin); -} - -#endif // defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) - -#else // !defined(_NTDDK_) - -#if !defined( KS_NO_CREATE_FUNCTIONS ) - -KSDDKAPI -DWORD -WINAPI -KsCreateAllocator( - IN HANDLE ConnectionHandle, - IN PKSALLOCATOR_FRAMING AllocatorFraming, - OUT PHANDLE AllocatorHandle - ); - -KSDDKAPI -DWORD -NTAPI -KsCreateClock( - IN HANDLE ConnectionHandle, - IN PKSCLOCK_CREATE ClockCreate, - OUT PHANDLE ClockHandle - ); - -KSDDKAPI -DWORD -WINAPI -KsCreatePin( - IN HANDLE FilterHandle, - IN PKSPIN_CONNECT Connect, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE ConnectionHandle - ); - -KSDDKAPI -DWORD -WINAPI -KsCreateTopologyNode( - IN HANDLE ParentHandle, - IN PKSNODE_CREATE NodeCreate, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE NodeHandle - ); - -#endif - -#endif // !defined(_NTDDK_) - -#if defined(__cplusplus) -} -#endif // defined(__cplusplus) - - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// The following is the original contents of this header from -// the DirectX 8.0 SDK. -// -///////////////////////////////////////////////////////////////////////////// - -#else // DirectX 8.0 content - - #if !defined(_NTRTL_) - #ifndef DEFINE_GUIDEX - #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name - #endif // !defined(DEFINE_GUIDEX) - - #ifndef STATICGUIDOF - #define STATICGUIDOF(guid) STATIC_##guid - #endif // !defined(STATICGUIDOF) - #endif // !defined(_NTRTL_) - - #ifndef SIZEOF_ARRAY - #define SIZEOF_ARRAY(ar) (sizeof(ar)/sizeof((ar)[0])) - #endif // !defined(SIZEOF_ARRAY) - - #if defined(__cplusplus) && _MSC_VER >= 1100 - #define DEFINE_GUIDSTRUCT(g, n) struct __declspec(uuid(g)) n - #define DEFINE_GUIDNAMED(n) __uuidof(struct n) - #else // !defined(__cplusplus) - #define DEFINE_GUIDSTRUCT(g, n) DEFINE_GUIDEX(n) - #define DEFINE_GUIDNAMED(n) n - #endif // !defined(__cplusplus) - - //=========================================================================== - - #define STATIC_GUID_NULL \ - 0x00000000L, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - - DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000", GUID_NULL); - #define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL) - - //=========================================================================== - - #define IOCTL_KS_PROPERTY CTL_CODE(FILE_DEVICE_KS, 0x000, METHOD_NEITHER, FILE_ANY_ACCESS) - #define IOCTL_KS_ENABLE_EVENT CTL_CODE(FILE_DEVICE_KS, 0x001, METHOD_NEITHER, FILE_ANY_ACCESS) - #define IOCTL_KS_DISABLE_EVENT CTL_CODE(FILE_DEVICE_KS, 0x002, METHOD_NEITHER, FILE_ANY_ACCESS) - #define IOCTL_KS_METHOD CTL_CODE(FILE_DEVICE_KS, 0x003, METHOD_NEITHER, FILE_ANY_ACCESS) - #define IOCTL_KS_WRITE_STREAM CTL_CODE(FILE_DEVICE_KS, 0x004, METHOD_NEITHER, FILE_WRITE_ACCESS) - #define IOCTL_KS_READ_STREAM CTL_CODE(FILE_DEVICE_KS, 0x005, METHOD_NEITHER, FILE_READ_ACCESS) - #define IOCTL_KS_RESET_STATE CTL_CODE(FILE_DEVICE_KS, 0x006, METHOD_NEITHER, FILE_ANY_ACCESS) - - //=========================================================================== - - typedef enum { - KSRESET_BEGIN, - KSRESET_END - } KSRESET; - - typedef enum { - KSSTATE_STOP, - KSSTATE_ACQUIRE, - KSSTATE_PAUSE, - KSSTATE_RUN - } KSSTATE, *PKSSTATE; - - #define KSPRIORITY_LOW 0x00000001 - #define KSPRIORITY_NORMAL 0x40000000 - #define KSPRIORITY_HIGH 0x80000000 - #define KSPRIORITY_EXCLUSIVE 0xFFFFFFFF - - typedef struct { - ULONG PriorityClass; - ULONG PrioritySubClass; - } KSPRIORITY, *PKSPRIORITY; - - typedef struct { - union { - #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ ) - struct _IDENTIFIER { - #else - struct { - #endif - GUID Set; - ULONG Id; - ULONG Flags; - }; - LONGLONG Alignment; - }; - } KSIDENTIFIER, *PKSIDENTIFIER; - - typedef KSIDENTIFIER KSPROPERTY, *PKSPROPERTY, KSMETHOD, *PKSMETHOD, KSEVENT, *PKSEVENT; - - #define KSMETHOD_TYPE_NONE 0x00000000 - #define KSMETHOD_TYPE_READ 0x00000001 - #define KSMETHOD_TYPE_WRITE 0x00000002 - #define KSMETHOD_TYPE_MODIFY 0x00000003 - #define KSMETHOD_TYPE_SOURCE 0x00000004 - - #define KSMETHOD_TYPE_SEND 0x00000001 - #define KSMETHOD_TYPE_SETSUPPORT 0x00000100 - #define KSMETHOD_TYPE_BASICSUPPORT 0x00000200 - - #define KSMETHOD_TYPE_TOPOLOGY 0x10000000 - - #define KSPROPERTY_TYPE_GET 0x00000001 - #define KSPROPERTY_TYPE_SET 0x00000002 - #define KSPROPERTY_TYPE_SETSUPPORT 0x00000100 - #define KSPROPERTY_TYPE_BASICSUPPORT 0x00000200 - #define KSPROPERTY_TYPE_RELATIONS 0x00000400 - #define KSPROPERTY_TYPE_SERIALIZESET 0x00000800 - #define KSPROPERTY_TYPE_UNSERIALIZESET 0x00001000 - #define KSPROPERTY_TYPE_SERIALIZERAW 0x00002000 - #define KSPROPERTY_TYPE_UNSERIALIZERAW 0x00004000 - #define KSPROPERTY_TYPE_SERIALIZESIZE 0x00008000 - #define KSPROPERTY_TYPE_DEFAULTVALUES 0x00010000 - - #define KSPROPERTY_TYPE_TOPOLOGY 0x10000000 - - typedef struct { - KSPROPERTY Property; - ULONG NodeId; - ULONG Reserved; - } KSP_NODE, *PKSP_NODE; - - typedef struct { - KSMETHOD Method; - ULONG NodeId; - ULONG Reserved; - } KSM_NODE, *PKSM_NODE; - - typedef struct { - KSEVENT Event; - ULONG NodeId; - ULONG Reserved; - } KSE_NODE, *PKSE_NODE; - - #define STATIC_KSPROPTYPESETID_General \ - 0x97E99BA0L, 0xBDEA, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000", KSPROPTYPESETID_General); - #define KSPROPTYPESETID_General DEFINE_GUIDNAMED(KSPROPTYPESETID_General) - - #if defined(_NTDDK_) && !defined(__wtypes_h__) - enum VARENUM { - VT_EMPTY = 0, - VT_NULL = 1, - VT_I2 = 2, - VT_I4 = 3, - VT_R4 = 4, - VT_R8 = 5, - VT_CY = 6, - VT_DATE = 7, - VT_BSTR = 8, - VT_DISPATCH = 9, - VT_ERROR = 10, - VT_BOOL = 11, - VT_VARIANT = 12, - VT_UNKNOWN = 13, - VT_DECIMAL = 14, - VT_I1 = 16, - VT_UI1 = 17, - VT_UI2 = 18, - VT_UI4 = 19, - VT_I8 = 20, - VT_UI8 = 21, - VT_INT = 22, - VT_UINT = 23, - VT_VOID = 24, - VT_HRESULT = 25, - VT_PTR = 26, - VT_SAFEARRAY = 27, - VT_CARRAY = 28, - VT_USERDEFINED = 29, - VT_LPSTR = 30, - VT_LPWSTR = 31, - VT_FILETIME = 64, - VT_BLOB = 65, - VT_STREAM = 66, - VT_STORAGE = 67, - VT_STREAMED_OBJECT = 68, - VT_STORED_OBJECT = 69, - VT_BLOB_OBJECT = 70, - VT_CF = 71, - VT_CLSID = 72, - VT_VECTOR = 0x1000, - VT_ARRAY = 0x2000, - VT_BYREF = 0x4000, - VT_RESERVED = 0x8000, - VT_ILLEGAL = 0xffff, - VT_ILLEGALMASKED = 0xfff, - VT_TYPEMASK = 0xfff - }; - #endif // _NTDDK_ && !__wtypes_h__ - - typedef struct { - ULONG Size; - ULONG Count; - } KSMULTIPLE_ITEM, *PKSMULTIPLE_ITEM; - - typedef struct { - ULONG AccessFlags; - ULONG DescriptionSize; - KSIDENTIFIER PropTypeSet; - ULONG MembersListCount; - ULONG Reserved; - } KSPROPERTY_DESCRIPTION, *PKSPROPERTY_DESCRIPTION; - - #define KSPROPERTY_MEMBER_RANGES 0x00000001 - #define KSPROPERTY_MEMBER_STEPPEDRANGES 0x00000002 - #define KSPROPERTY_MEMBER_VALUES 0x00000003 - - #define KSPROPERTY_MEMBER_FLAG_DEFAULT 0x00000001 - - typedef struct { - ULONG MembersFlags; - ULONG MembersSize; - ULONG MembersCount; - ULONG Flags; - } KSPROPERTY_MEMBERSHEADER, *PKSPROPERTY_MEMBERSHEADER; - - typedef union { - #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ ) - struct _SIGNED { - #else - struct { - #endif - LONG SignedMinimum; - LONG SignedMaximum; - }; - #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ ) - struct _UNSIGNED { - #else - struct { - #endif - ULONG UnsignedMinimum; - ULONG UnsignedMaximum; - }; - } KSPROPERTY_BOUNDS_LONG, *PKSPROPERTY_BOUNDS_LONG; - - typedef union { - #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ ) - struct _SIGNED64 { - #else - struct { - #endif - LONGLONG SignedMinimum; - LONGLONG SignedMaximum; - }; - #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ ) - struct _UNSIGNED64 { - #else - struct { - #endif - #if defined(_NTDDK_) - ULONGLONG UnsignedMinimum; - ULONGLONG UnsignedMaximum; - #else // !_NTDDK_ - DWORDLONG UnsignedMinimum; - DWORDLONG UnsignedMaximum; - #endif // !_NTDDK_ - }; - } KSPROPERTY_BOUNDS_LONGLONG, *PKSPROPERTY_BOUNDS_LONGLONG; - - typedef struct { - ULONG SteppingDelta; - ULONG Reserved; - KSPROPERTY_BOUNDS_LONG Bounds; - } KSPROPERTY_STEPPING_LONG, *PKSPROPERTY_STEPPING_LONG; - - typedef struct { - #if defined(_NTDDK_) - ULONGLONG SteppingDelta; - #else // !_NTDDK_ - DWORDLONG SteppingDelta; - #endif // !_NTDDK_ - KSPROPERTY_BOUNDS_LONGLONG Bounds; - } KSPROPERTY_STEPPING_LONGLONG, *PKSPROPERTY_STEPPING_LONGLONG; - - //=========================================================================== - - #if defined(_NTDDK_) - // - // Structure forward declarations. - // - typedef struct _KSDEVICE_DESCRIPTOR - KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR; - typedef struct _KSDEVICE_DISPATCH - KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH; - typedef struct _KSDEVICE - KSDEVICE, *PKSDEVICE; - typedef struct _KSFILTERFACTORY - KSFILTERFACTORY, *PKSFILTERFACTORY; - typedef struct _KSFILTER_DESCRIPTOR - KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR; - typedef struct _KSFILTER_DISPATCH - KSFILTER_DISPATCH, *PKSFILTER_DISPATCH; - typedef struct _KSFILTER - KSFILTER, *PKSFILTER; - typedef struct _KSPIN_DESCRIPTOR_EX - KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX; - typedef struct _KSPIN_DISPATCH - KSPIN_DISPATCH, *PKSPIN_DISPATCH; - typedef struct _KSCLOCK_DISPATCH - KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH; - typedef struct _KSALLOCATOR_DISPATCH - KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH; - typedef struct _KSPIN - KSPIN, *PKSPIN; - typedef struct _KSNODE_DESCRIPTOR - KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR; - typedef struct _KSSTREAM_POINTER_OFFSET - KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET; - typedef struct _KSSTREAM_POINTER - KSSTREAM_POINTER, *PKSSTREAM_POINTER; - typedef struct _KSMAPPING - KSMAPPING, *PKSMAPPING; - typedef struct _KSPROCESSPIN - KSPROCESSPIN, *PKSPROCESSPIN; - typedef struct _KSPROCESSPIN_INDEXENTRY - KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY; - #endif // _NTDDK_ - - typedef PVOID PKSWORKER; - - typedef struct { - ULONG NotificationType; - union { - struct { - HANDLE Event; - ULONG_PTR Reserved[2]; - } EventHandle; - struct { - HANDLE Semaphore; - ULONG Reserved; - LONG Adjustment; - } SemaphoreHandle; - #if defined(_NTDDK_) - struct { - PVOID Event; - KPRIORITY Increment; - ULONG_PTR Reserved; - } EventObject; - struct { - PVOID Semaphore; - KPRIORITY Increment; - LONG Adjustment; - } SemaphoreObject; - struct { - PKDPC Dpc; - ULONG ReferenceCount; - ULONG_PTR Reserved; - } Dpc; - struct { - PWORK_QUEUE_ITEM WorkQueueItem; - WORK_QUEUE_TYPE WorkQueueType; - ULONG_PTR Reserved; - } WorkItem; - struct { - PWORK_QUEUE_ITEM WorkQueueItem; - PKSWORKER KsWorkerObject; - ULONG_PTR Reserved; - } KsWorkItem; - // @@BEGIN_DDKSPLIT - struct { - PKSFILTER Filter; - ULONG_PTR Reserved[2]; - } KsFilterProcessing; - struct { - PKSPIN Pin; - ULONG_PTR Reserved[2]; - } KsPinProcessing; - // @@END_DDKSPLIT - #endif // defined(_NTDDK_) - struct { - PVOID Unused; - LONG_PTR Alignment[2]; - } Alignment; - }; - } KSEVENTDATA, *PKSEVENTDATA; - - #define KSEVENTF_EVENT_HANDLE 0x00000001 - #define KSEVENTF_SEMAPHORE_HANDLE 0x00000002 - #if defined(_NTDDK_) - #define KSEVENTF_EVENT_OBJECT 0x00000004 - #define KSEVENTF_SEMAPHORE_OBJECT 0x00000008 - #define KSEVENTF_DPC 0x00000010 - #define KSEVENTF_WORKITEM 0x00000020 - #define KSEVENTF_KSWORKITEM 0x00000080 - // @@BEGIN_DDKSPLIT - #define KSEVENTF_KSFILTERPROCESSING 0x00000100 - #define KSEVENTF_KSPINPROCESSING 0x00000200 - // @@END_DDKSPLIT - #endif // defined(_NTDDK_) - - #define KSEVENT_TYPE_ENABLE 0x00000001 - #define KSEVENT_TYPE_ONESHOT 0x00000002 - #define KSEVENT_TYPE_ENABLEBUFFERED 0x00000004 - #define KSEVENT_TYPE_SETSUPPORT 0x00000100 - #define KSEVENT_TYPE_BASICSUPPORT 0x00000200 - #define KSEVENT_TYPE_QUERYBUFFER 0x00000400 - - #define KSEVENT_TYPE_TOPOLOGY 0x10000000 - - typedef struct { - KSEVENT Event; - PKSEVENTDATA EventData; - PVOID Reserved; - } KSQUERYBUFFER, *PKSQUERYBUFFER; - - typedef struct { - ULONG Size; - ULONG Flags; - union { - HANDLE ObjectHandle; - PVOID ObjectPointer; - }; - PVOID Reserved; - KSEVENT Event; - KSEVENTDATA EventData; - } KSRELATIVEEVENT; - - #define KSRELATIVEEVENT_FLAG_HANDLE 0x00000001 - #define KSRELATIVEEVENT_FLAG_POINTER 0x00000002 - - //=========================================================================== - - typedef struct { - KSEVENTDATA EventData; - LONGLONG MarkTime; - } KSEVENT_TIME_MARK, *PKSEVENT_TIME_MARK; - - typedef struct { - KSEVENTDATA EventData; - LONGLONG TimeBase; - LONGLONG Interval; - } KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL; - - typedef struct { - LONGLONG TimeBase; - LONGLONG Interval; - } KSINTERVAL, *PKSINTERVAL; - - //=========================================================================== - - #define STATIC_KSPROPSETID_General\ - 0x1464EDA5L, 0x6A8F, 0x11D1, 0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("1464EDA5-6A8F-11D1-9AA7-00A0C9223196", KSPROPSETID_General); - #define KSPROPSETID_General DEFINE_GUIDNAMED(KSPROPSETID_General) - - typedef enum { - KSPROPERTY_GENERAL_COMPONENTID - } KSPROPERTY_GENERAL; - - typedef struct { - GUID Manufacturer; - GUID Product; - GUID Component; - GUID Name; - ULONG Version; - ULONG Revision; - } KSCOMPONENTID, *PKSCOMPONENTID; - - #define DEFINE_KSPROPERTY_ITEM_GENERAL_COMPONENTID(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_GENERAL_COMPONENTID,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSCOMPONENTID),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define STATIC_KSMETHODSETID_StreamIo\ - 0x65D003CAL, 0x1523, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("65D003CA-1523-11D2-B27A-00A0C9223196", KSMETHODSETID_StreamIo); - #define KSMETHODSETID_StreamIo DEFINE_GUIDNAMED(KSMETHODSETID_StreamIo) - - typedef enum { - KSMETHOD_STREAMIO_READ, - KSMETHOD_STREAMIO_WRITE - } KSMETHOD_STREAMIO; - - #define DEFINE_KSMETHOD_ITEM_STREAMIO_READ(Handler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_STREAMIO_READ,\ - KSMETHOD_TYPE_WRITE,\ - (Handler),\ - sizeof(KSMETHOD),\ - 0,\ - NULL) - - #define DEFINE_KSMETHOD_ITEM_STREAMIO_WRITE(Handler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_STREAMIO_WRITE,\ - KSMETHOD_TYPE_READ,\ - (Handler),\ - sizeof(KSMETHOD),\ - 0,\ - NULL) - - #define STATIC_KSPROPSETID_MediaSeeking\ - 0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196", KSPROPSETID_MediaSeeking); - #define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking) - - typedef enum { - KSPROPERTY_MEDIASEEKING_CAPABILITIES, - KSPROPERTY_MEDIASEEKING_FORMATS, - KSPROPERTY_MEDIASEEKING_TIMEFORMAT, - KSPROPERTY_MEDIASEEKING_POSITION, - KSPROPERTY_MEDIASEEKING_STOPPOSITION, - KSPROPERTY_MEDIASEEKING_POSITIONS, - KSPROPERTY_MEDIASEEKING_DURATION, - KSPROPERTY_MEDIASEEKING_AVAILABLE, - KSPROPERTY_MEDIASEEKING_PREROLL, - KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT - } KSPROPERTY_MEDIASEEKING; - - typedef enum { - KS_SEEKING_NoPositioning, - KS_SEEKING_AbsolutePositioning, - KS_SEEKING_RelativePositioning, - KS_SEEKING_IncrementalPositioning, - KS_SEEKING_PositioningBitsMask = 0x3, - KS_SEEKING_SeekToKeyFrame, - KS_SEEKING_ReturnTime = 0x8 - } KS_SEEKING_FLAGS; - - typedef enum { - KS_SEEKING_CanSeekAbsolute = 0x1, - KS_SEEKING_CanSeekForwards = 0x2, - KS_SEEKING_CanSeekBackwards = 0x4, - KS_SEEKING_CanGetCurrentPos = 0x8, - KS_SEEKING_CanGetStopPos = 0x10, - KS_SEEKING_CanGetDuration = 0x20, - KS_SEEKING_CanPlayBackwards = 0x40 - } KS_SEEKING_CAPABILITIES; - - typedef struct { - LONGLONG Current; - LONGLONG Stop; - KS_SEEKING_FLAGS CurrentFlags; - KS_SEEKING_FLAGS StopFlags; - } KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS; - - typedef struct { - LONGLONG Earliest; - LONGLONG Latest; - } KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE; - - typedef struct { - KSPROPERTY Property; - GUID SourceFormat; - GUID TargetFormat; - LONGLONG Time; - } KSP_TIMEFORMAT, *PKSP_TIMEFORMAT; - - #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_CAPABILITIES,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KS_SEEKING_CAPABILITIES),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_FORMATS,\ - (Handler),\ - sizeof(KSPROPERTY),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_TIMEFORMAT,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(GUID),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_POSITION,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_STOPPOSITION,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_POSITIONS,\ - NULL,\ - sizeof(KSPROPERTY),\ - sizeof(KSPROPERTY_POSITIONS),\ - (Handler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_DURATION,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_AVAILABLE,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSPROPERTY_MEDIAAVAILABLE),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_PREROLL,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT,\ - (Handler),\ - sizeof(KSP_TIMEFORMAT),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - - //=========================================================================== - - #define STATIC_KSPROPSETID_Topology\ - 0x720D4AC0L, 0x7533, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000", KSPROPSETID_Topology); - #define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology) - - typedef enum { - KSPROPERTY_TOPOLOGY_CATEGORIES, - KSPROPERTY_TOPOLOGY_NODES, - KSPROPERTY_TOPOLOGY_CONNECTIONS, - KSPROPERTY_TOPOLOGY_NAME - } KSPROPERTY_TOPOLOGY; - - #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_TOPOLOGY_CATEGORIES,\ - (Handler),\ - sizeof(KSPROPERTY),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_TOPOLOGY_NODES,\ - (Handler),\ - sizeof(KSPROPERTY),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_TOPOLOGY_CONNECTIONS,\ - (Handler),\ - sizeof(KSPROPERTY),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_TOPOLOGY_NAME,\ - (Handler),\ - sizeof(KSP_NODE),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet, Handler)\ - DEFINE_KSPROPERTY_TABLE(TopologySet) {\ - DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler),\ - DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler),\ - DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler),\ - DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\ - } - - //============================================================================= - - // - // properties used by graph manager to talk to particular filters - // - #if defined(_NTDDK_) - - #define STATIC_KSPROPSETID_GM \ - 0xAF627536L, 0xE719, 0x11D2, 0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D - DEFINE_GUIDSTRUCT("AF627536-E719-11D2-8A1D-006097D2DF5D", KSPROPSETID_GM); - #define KSPROPSETID_GM DEFINE_GUIDNAMED(KSPROPSETID_GM) - - typedef VOID (*PFNKSGRAPHMANAGER_NOTIFY)(IN PFILE_OBJECT GraphManager, - IN ULONG EventId, - IN PVOID Filter, - IN PVOID Pin, - IN PVOID Frame, - IN ULONG Duration); - - typedef struct KSGRAPHMANAGER_FUNCTIONTABLE { - PFNKSGRAPHMANAGER_NOTIFY NotifyEvent; - } KSGRAPHMANAGER_FUNCTIONTABLE, PKSGRAPHMANAGER_FUNCTIONTABLE; - - typedef struct _KSPROPERTY_GRAPHMANAGER_INTERFACE { - PFILE_OBJECT GraphManager; - KSGRAPHMANAGER_FUNCTIONTABLE FunctionTable; - } KSPROPERTY_GRAPHMANAGER_INTERFACE, *PKSPROPERTY_GRAPHMANAGER_INTERFACE; - - - // - // Commands - // - typedef enum { - KSPROPERTY_GM_GRAPHMANAGER, - KSPROPERTY_GM_TIMESTAMP_CLOCK, - KSPROPERTY_GM_RATEMATCH, - KSPROPERTY_GM_RENDER_CLOCK, - } KSPROPERTY_GM; - - #endif - - //=========================================================================== - - - #define STATIC_KSCATEGORY_BRIDGE \ - 0x085AFF00L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000", KSCATEGORY_BRIDGE); - #define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE) - - #define STATIC_KSCATEGORY_CAPTURE \ - 0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_CAPTURE); - #define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE) - - #define STATIC_KSCATEGORY_RENDER \ - 0x65E8773EL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_RENDER); - #define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER) - - #define STATIC_KSCATEGORY_MIXER \ - 0xAD809C00L, 0x7B88, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000", KSCATEGORY_MIXER); - #define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER) - - #define STATIC_KSCATEGORY_SPLITTER \ - 0x0A4252A0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_SPLITTER); - #define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER) - - #define STATIC_KSCATEGORY_DATACOMPRESSOR \ - 0x1E84C900L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATACOMPRESSOR); - #define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR) - - #define STATIC_KSCATEGORY_DATADECOMPRESSOR \ - 0x2721AE20L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATADECOMPRESSOR); - #define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR) - - #define STATIC_KSCATEGORY_DATATRANSFORM \ - 0x2EB07EA0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATATRANSFORM); - #define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM) - - #define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \ - 0xCF1DDA2CL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_COMMUNICATIONSTRANSFORM); - #define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM) - - #define STATIC_KSCATEGORY_INTERFACETRANSFORM \ - 0xCF1DDA2DL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_INTERFACETRANSFORM); - #define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM) - - #define STATIC_KSCATEGORY_MEDIUMTRANSFORM \ - 0xCF1DDA2EL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_MEDIUMTRANSFORM); - #define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM) - - #define STATIC_KSCATEGORY_FILESYSTEM \ - 0x760FED5EL, 0x9357, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196", KSCATEGORY_FILESYSTEM); - #define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM) - - // KSNAME_Clock - #define STATIC_KSCATEGORY_CLOCK \ - 0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSCATEGORY_CLOCK); - #define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK) - - #define STATIC_KSCATEGORY_PROXY \ - 0x97EBAACAL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_PROXY); - #define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY) - - #define STATIC_KSCATEGORY_QUALITY \ - 0x97EBAACBL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_QUALITY); - #define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY) - - typedef struct { - ULONG FromNode; - ULONG FromNodePin; - ULONG ToNode; - ULONG ToNodePin; - } KSTOPOLOGY_CONNECTION, *PKSTOPOLOGY_CONNECTION; - - typedef struct { - ULONG CategoriesCount; - const GUID* Categories; - ULONG TopologyNodesCount; - const GUID* TopologyNodes; - ULONG TopologyConnectionsCount; - const KSTOPOLOGY_CONNECTION* TopologyConnections; - const GUID* TopologyNodesNames; - ULONG Reserved; - } KSTOPOLOGY, *PKSTOPOLOGY; - - #define KSFILTER_NODE ((ULONG)-1) - #define KSALL_NODES ((ULONG)-1) - - typedef struct { - ULONG CreateFlags; - ULONG Node; - } KSNODE_CREATE, *PKSNODE_CREATE; - - //=========================================================================== - - // TIME_FORMAT_NONE - #define STATIC_KSTIME_FORMAT_NONE STATIC_GUID_NULL - #define KSTIME_FORMAT_NONE GUID_NULL - - // TIME_FORMAT_FRAME - #define STATIC_KSTIME_FORMAT_FRAME\ - 0x7b785570L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 - DEFINE_GUIDSTRUCT("7b785570-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_FRAME); - #define KSTIME_FORMAT_FRAME DEFINE_GUIDNAMED(KSTIME_FORMAT_FRAME) - - // TIME_FORMAT_BYTE - #define STATIC_KSTIME_FORMAT_BYTE\ - 0x7b785571L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 - DEFINE_GUIDSTRUCT("7b785571-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_BYTE); - #define KSTIME_FORMAT_BYTE DEFINE_GUIDNAMED(KSTIME_FORMAT_BYTE) - - // TIME_FORMAT_SAMPLE - #define STATIC_KSTIME_FORMAT_SAMPLE\ - 0x7b785572L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 - DEFINE_GUIDSTRUCT("7b785572-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_SAMPLE); - #define KSTIME_FORMAT_SAMPLE DEFINE_GUIDNAMED(KSTIME_FORMAT_SAMPLE) - - // TIME_FORMAT_FIELD - #define STATIC_KSTIME_FORMAT_FIELD\ - 0x7b785573L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 - DEFINE_GUIDSTRUCT("7b785573-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_FIELD); - #define KSTIME_FORMAT_FIELD DEFINE_GUIDNAMED(KSTIME_FORMAT_FIELD) - - // TIME_FORMAT_MEDIA_TIME - #define STATIC_KSTIME_FORMAT_MEDIA_TIME\ - 0x7b785574L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 - DEFINE_GUIDSTRUCT("7b785574-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_MEDIA_TIME); - #define KSTIME_FORMAT_MEDIA_TIME DEFINE_GUIDNAMED(KSTIME_FORMAT_MEDIA_TIME) - - //=========================================================================== - - typedef KSIDENTIFIER KSPIN_INTERFACE, *PKSPIN_INTERFACE; - - #define STATIC_KSINTERFACESETID_Standard \ - 0x1A8766A0L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000", KSINTERFACESETID_Standard); - #define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard) - - typedef enum { - KSINTERFACE_STANDARD_STREAMING, - KSINTERFACE_STANDARD_LOOPED_STREAMING, - KSINTERFACE_STANDARD_CONTROL - } KSINTERFACE_STANDARD; - - #define STATIC_KSINTERFACESETID_FileIo \ - 0x8C6F932CL, 0xE771, 0x11D0, 0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196", KSINTERFACESETID_FileIo); - #define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo) - - typedef enum { - KSINTERFACE_FILEIO_STREAMING - } KSINTERFACE_FILEIO; - - //=========================================================================== - - #define KSMEDIUM_TYPE_ANYINSTANCE 0 - - #define STATIC_KSMEDIUMSETID_Standard \ - 0x4747B320L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000", KSMEDIUMSETID_Standard); - #define KSMEDIUMSETID_Standard DEFINE_GUIDNAMED(KSMEDIUMSETID_Standard) - - //For compatibility only - #define KSMEDIUM_STANDARD_DEVIO KSMEDIUM_TYPE_ANYINSTANCE - - //=========================================================================== - - #define STATIC_KSPROPSETID_Pin\ - 0x8C134960L, 0x51AD, 0x11CF, 0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000", KSPROPSETID_Pin); - #define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin) - - typedef enum { - KSPROPERTY_PIN_CINSTANCES, - KSPROPERTY_PIN_CTYPES, - KSPROPERTY_PIN_DATAFLOW, - KSPROPERTY_PIN_DATARANGES, - KSPROPERTY_PIN_DATAINTERSECTION, - KSPROPERTY_PIN_INTERFACES, - KSPROPERTY_PIN_MEDIUMS, - KSPROPERTY_PIN_COMMUNICATION, - KSPROPERTY_PIN_GLOBALCINSTANCES, - KSPROPERTY_PIN_NECESSARYINSTANCES, - KSPROPERTY_PIN_PHYSICALCONNECTION, - KSPROPERTY_PIN_CATEGORY, - KSPROPERTY_PIN_NAME, - KSPROPERTY_PIN_CONSTRAINEDDATARANGES, - KSPROPERTY_PIN_PROPOSEDATAFORMAT - } KSPROPERTY_PIN; - - typedef struct { - KSPROPERTY Property; - ULONG PinId; - ULONG Reserved; - } KSP_PIN, *PKSP_PIN; - - #define KSINSTANCE_INDETERMINATE ((ULONG)-1) - - typedef struct { - ULONG PossibleCount; - ULONG CurrentCount; - } KSPIN_CINSTANCES, *PKSPIN_CINSTANCES; - - typedef enum { - KSPIN_DATAFLOW_IN = 1, - KSPIN_DATAFLOW_OUT - } KSPIN_DATAFLOW, *PKSPIN_DATAFLOW; - - #define KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION 0 - #define KSDATAFORMAT_TEMPORAL_COMPRESSION (1 << KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION) - #define KSDATAFORMAT_BIT_ATTRIBUTES 1 - #define KSDATAFORMAT_ATTRIBUTES (1 << KSDATAFORMAT_BIT_ATTRIBUTES) - - #define KSDATARANGE_BIT_ATTRIBUTES 1 - #define KSDATARANGE_ATTRIBUTES (1 << KSDATARANGE_BIT_ATTRIBUTES) - #define KSDATARANGE_BIT_REQUIRED_ATTRIBUTES 2 - #define KSDATARANGE_REQUIRED_ATTRIBUTES (1 << KSDATARANGE_BIT_REQUIRED_ATTRIBUTES) - - #if !defined( _MSC_VER ) - typedef struct { - ULONG FormatSize; - ULONG Flags; - ULONG SampleSize; - ULONG Reserved; - GUID MajorFormat; - GUID SubFormat; - GUID Specifier; - } KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE; - #else - typedef union { - struct { - ULONG FormatSize; - ULONG Flags; - ULONG SampleSize; - ULONG Reserved; - GUID MajorFormat; - GUID SubFormat; - GUID Specifier; - }; - LONGLONG Alignment; - } KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE; - #endif - - #define KSATTRIBUTE_REQUIRED 0x00000001 - - typedef struct { - ULONG Size; - ULONG Flags; - GUID Attribute; - } KSATTRIBUTE, *PKSATTRIBUTE; - - #if defined(_NTDDK_) - typedef struct { - ULONG Count; - PKSATTRIBUTE* Attributes; - } KSATTRIBUTE_LIST, *PKSATTRIBUTE_LIST; - #endif // _NTDDK_ - - typedef enum { - KSPIN_COMMUNICATION_NONE, - KSPIN_COMMUNICATION_SINK, - KSPIN_COMMUNICATION_SOURCE, - KSPIN_COMMUNICATION_BOTH, - KSPIN_COMMUNICATION_BRIDGE - } KSPIN_COMMUNICATION, *PKSPIN_COMMUNICATION; - - typedef KSIDENTIFIER KSPIN_MEDIUM, *PKSPIN_MEDIUM; - - typedef struct { - KSPIN_INTERFACE Interface; - KSPIN_MEDIUM Medium; - ULONG PinId; - HANDLE PinToHandle; - KSPRIORITY Priority; - } KSPIN_CONNECT, *PKSPIN_CONNECT; - - typedef struct { - ULONG Size; - ULONG Pin; - WCHAR SymbolicLinkName[1]; - } KSPIN_PHYSICALCONNECTION, *PKSPIN_PHYSICALCONNECTION; - - #if defined(_NTDDK_) - typedef - NTSTATUS - (*PFNKSINTERSECTHANDLER)( - IN PIRP Irp, - IN PKSP_PIN Pin, - IN PKSDATARANGE DataRange, - OUT PVOID Data OPTIONAL - ); - typedef - NTSTATUS - (*PFNKSINTERSECTHANDLEREX)( - IN PVOID Context, - IN PIRP Irp, - IN PKSP_PIN Pin, - IN PKSDATARANGE DataRange, - IN PKSDATARANGE MatchingDataRange, - IN ULONG DataBufferSize, - OUT PVOID Data OPTIONAL, - OUT PULONG DataSize - ); - #endif // _NTDDK_ - - #define DEFINE_KSPIN_INTERFACE_TABLE(tablename)\ - const KSPIN_INTERFACE tablename[] = - - #define DEFINE_KSPIN_INTERFACE_ITEM(guid, interface)\ - {\ - STATICGUIDOF(guid),\ - (interface),\ - 0\ - } - - #define DEFINE_KSPIN_MEDIUM_TABLE( tablename )\ - const KSPIN_MEDIUM tablename[] = - - #define DEFINE_KSPIN_MEDIUM_ITEM(guid, medium)\ - DEFINE_KSPIN_INTERFACE_ITEM(guid, medium) - - #define DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_CINSTANCES,\ - (Handler),\ - sizeof(KSP_PIN),\ - sizeof(KSPIN_CINSTANCES),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_CTYPES,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(ULONG),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_DATAFLOW,\ - (Handler),\ - sizeof(KSP_PIN),\ - sizeof(KSPIN_DATAFLOW),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_DATARANGES,\ - (Handler),\ - sizeof(KSP_PIN),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_DATAINTERSECTION,\ - (Handler),\ - sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_INTERFACES,\ - (Handler),\ - sizeof(KSP_PIN),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_MEDIUMS,\ - (Handler),\ - sizeof(KSP_PIN),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_COMMUNICATION,\ - (Handler),\ - sizeof(KSP_PIN),\ - sizeof(KSPIN_COMMUNICATION),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_GLOBALCINSTANCES,\ - (Handler),\ - sizeof(KSP_PIN),\ - sizeof(KSPIN_CINSTANCES),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_NECESSARYINSTANCES,\ - (Handler),\ - sizeof(KSP_PIN),\ - sizeof(ULONG),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_PHYSICALCONNECTION,\ - (Handler),\ - sizeof(KSP_PIN),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_CATEGORY,\ - (Handler),\ - sizeof(KSP_PIN),\ - sizeof(GUID),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_PIN_NAME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_NAME,\ - (Handler),\ - sizeof(KSP_PIN),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_CONSTRAINEDDATARANGES,\ - (Handler),\ - sizeof(KSP_PIN),\ - 0,\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_PIN_PROPOSEDATAFORMAT,\ - NULL,\ - sizeof(KSP_PIN),\ - sizeof(KSDATAFORMAT),\ - (Handler), NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_PINSET(PinSet,\ - PropGeneral, PropInstances, PropIntersection)\ - DEFINE_KSPROPERTY_TABLE(PinSet) {\ - DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\ - DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\ - DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral)\ - } - - #define DEFINE_KSPROPERTY_PINSETCONSTRAINED(PinSet,\ - PropGeneral, PropInstances, PropIntersection)\ - DEFINE_KSPROPERTY_TABLE(PinSet) {\ - DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\ - DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\ - DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),\ - DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral)\ - } - - #define STATIC_KSNAME_Filter\ - 0x9b365890L, 0x165f, 0x11d0, 0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 - DEFINE_GUIDSTRUCT("9b365890-165f-11d0-a195-0020afd156e4", KSNAME_Filter); - #define KSNAME_Filter DEFINE_GUIDNAMED(KSNAME_Filter) - - #define KSSTRING_Filter L"{9B365890-165F-11D0-A195-0020AFD156E4}" - - #define STATIC_KSNAME_Pin\ - 0x146F1A80L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000", KSNAME_Pin); - #define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin) - - #define KSSTRING_Pin L"{146F1A80-4791-11D0-A5D6-28DB04C10000}" - - #define STATIC_KSNAME_Clock\ - 0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSNAME_Clock); - #define KSNAME_Clock DEFINE_GUIDNAMED(KSNAME_Clock) - - #define KSSTRING_Clock L"{53172480-4791-11D0-A5D6-28DB04C10000}" - - #define STATIC_KSNAME_Allocator\ - 0x642F5D00L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("642F5D00-4791-11D0-A5D6-28DB04C10000", KSNAME_Allocator); - #define KSNAME_Allocator DEFINE_GUIDNAMED(KSNAME_Allocator) - - #define KSSTRING_Allocator L"{642F5D00-4791-11D0-A5D6-28DB04C10000}" - - #define KSSTRING_AllocatorEx L"{091BB63B-603F-11D1-B067-00A0C9062802}" - - #define STATIC_KSNAME_TopologyNode\ - 0x0621061AL, 0xEE75, 0x11D0, 0xB9, 0x15, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("0621061A-EE75-11D0-B915-00A0C9223196", KSNAME_TopologyNode); - #define KSNAME_TopologyNode DEFINE_GUIDNAMED(KSNAME_TopologyNode) - - #define KSSTRING_TopologyNode L"{0621061A-EE75-11D0-B915-00A0C9223196}" - - #if defined(_NTDDK_) - - typedef struct { - ULONG InterfacesCount; - const KSPIN_INTERFACE* Interfaces; - ULONG MediumsCount; - const KSPIN_MEDIUM* Mediums; - ULONG DataRangesCount; - const PKSDATARANGE* DataRanges; - KSPIN_DATAFLOW DataFlow; - KSPIN_COMMUNICATION Communication; - const GUID* Category; - const GUID* Name; - union { - LONGLONG Reserved; - struct { - ULONG ConstrainedDataRangesCount; - PKSDATARANGE* ConstrainedDataRanges; - }; - }; - } KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR; - typedef const KSPIN_DESCRIPTOR *PCKSPIN_DESCRIPTOR; - - #define DEFINE_KSPIN_DESCRIPTOR_TABLE(tablename)\ - const KSPIN_DESCRIPTOR tablename[] = - - #define DEFINE_KSPIN_DESCRIPTOR_ITEM(\ - InterfacesCount, Interfaces,\ - MediumsCount, Mediums,\ - DataRangesCount, DataRanges,\ - DataFlow, Communication)\ - {\ - InterfacesCount, Interfaces, MediumsCount, Mediums,\ - DataRangesCount, DataRanges, DataFlow, Communication,\ - NULL, NULL, 0\ - } - #define DEFINE_KSPIN_DESCRIPTOR_ITEMEX(\ - InterfacesCount, Interfaces,\ - MediumsCount, Mediums,\ - DataRangesCount, DataRanges,\ - DataFlow, Communication,\ - Category, Name)\ - {\ - InterfacesCount, Interfaces, MediumsCount, Mediums,\ - DataRangesCount, DataRanges, DataFlow, Communication,\ - Category, Name, 0\ - } - - #endif // defined(_NTDDK_) - - //=========================================================================== - - // MEDIATYPE_NULL - #define STATIC_KSDATAFORMAT_TYPE_WILDCARD STATIC_GUID_NULL - #define KSDATAFORMAT_TYPE_WILDCARD GUID_NULL - - // MEDIASUBTYPE_NULL - #define STATIC_KSDATAFORMAT_SUBTYPE_WILDCARD STATIC_GUID_NULL - #define KSDATAFORMAT_SUBTYPE_WILDCARD GUID_NULL - - // MEDIATYPE_Stream - #define STATIC_KSDATAFORMAT_TYPE_STREAM\ - 0xE436EB83L, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70 - DEFINE_GUIDSTRUCT("E436EB83-524F-11CE-9F53-0020AF0BA770", KSDATAFORMAT_TYPE_STREAM); - #define KSDATAFORMAT_TYPE_STREAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STREAM) - - // MEDIASUBTYPE_None - #define STATIC_KSDATAFORMAT_SUBTYPE_NONE\ - 0xE436EB8EL, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70 - DEFINE_GUIDSTRUCT("E436EB8E-524F-11CE-9F53-0020AF0BA770", KSDATAFORMAT_SUBTYPE_NONE); - #define KSDATAFORMAT_SUBTYPE_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NONE) - - #define STATIC_KSDATAFORMAT_SPECIFIER_WILDCARD STATIC_GUID_NULL - #define KSDATAFORMAT_SPECIFIER_WILDCARD GUID_NULL - - #define STATIC_KSDATAFORMAT_SPECIFIER_FILENAME\ - 0xAA797B40L, 0xE974, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("AA797B40-E974-11CF-A5D6-28DB04C10000", KSDATAFORMAT_SPECIFIER_FILENAME); - #define KSDATAFORMAT_SPECIFIER_FILENAME DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILENAME) - - #define STATIC_KSDATAFORMAT_SPECIFIER_FILEHANDLE\ - 0x65E8773CL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("65E8773C-8F56-11D0-A3B9-00A0C9223196", KSDATAFORMAT_SPECIFIER_FILEHANDLE); - #define KSDATAFORMAT_SPECIFIER_FILEHANDLE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILEHANDLE) - - // FORMAT_None - #define STATIC_KSDATAFORMAT_SPECIFIER_NONE\ - 0x0F6417D6L, 0xC318, 0x11D0, 0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196", KSDATAFORMAT_SPECIFIER_NONE); - #define KSDATAFORMAT_SPECIFIER_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_NONE) - - //=========================================================================== - - #define STATIC_KSPROPSETID_Quality \ - 0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("D16AD380-AC1A-11CF-A5D6-28DB04C10000", KSPROPSETID_Quality); - #define KSPROPSETID_Quality DEFINE_GUIDNAMED(KSPROPSETID_Quality) - - typedef enum { - KSPROPERTY_QUALITY_REPORT, - KSPROPERTY_QUALITY_ERROR - } KSPROPERTY_QUALITY; - - #define DEFINE_KSPROPERTY_ITEM_QUALITY_REPORT(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_QUALITY_REPORT,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(KSQUALITY),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_QUALITY_ERROR(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_QUALITY_ERROR,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(KSERROR),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - //=========================================================================== - - #define STATIC_KSPROPSETID_Connection \ - 0x1D58C920L, 0xAC9B, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000", KSPROPSETID_Connection); - #define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection) - - typedef enum { - KSPROPERTY_CONNECTION_STATE, - KSPROPERTY_CONNECTION_PRIORITY, - KSPROPERTY_CONNECTION_DATAFORMAT, - KSPROPERTY_CONNECTION_ALLOCATORFRAMING, - KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT, - KSPROPERTY_CONNECTION_ACQUIREORDERING, - KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX, - KSPROPERTY_CONNECTION_STARTAT - } KSPROPERTY_CONNECTION; - - #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CONNECTION_STATE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(KSSTATE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PRIORITY(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CONNECTION_PRIORITY,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(KSPRIORITY),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CONNECTION_DATAFORMAT,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CONNECTION_ALLOCATORFRAMING,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSALLOCATOR_FRAMING),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING_EX(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSALLOCATOR_FRAMING_EX),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PROPOSEDATAFORMAT(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,\ - NULL,\ - sizeof(KSPROPERTY),\ - sizeof(KSDATAFORMAT),\ - (Handler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ACQUIREORDERING(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CONNECTION_ACQUIREORDERING,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(int),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STARTAT(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CONNECTION_STARTAT,\ - NULL,\ - sizeof(KSPROPERTY),\ - sizeof(KSRELATIVEEVENT),\ - (Handler),\ - NULL, 0, NULL, NULL, 0) - - //=========================================================================== - // - // pins flags - // - #define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER 0x00000001 - #define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY 0x00000002 - #define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY 0x00000004 - #define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE 0x00000008 - #define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY 0x80000000 - - #define KSALLOCATOR_OPTIONF_COMPATIBLE 0x00000001 - #define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY 0x00000002 - #define KSALLOCATOR_OPTIONF_VALID 0x00000003 - // - // pins extended framing flags - // - #define KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT 0x00000010 - #define KSALLOCATOR_FLAG_DEVICE_SPECIFIC 0x00000020 - #define KSALLOCATOR_FLAG_CAN_ALLOCATE 0x00000040 - #define KSALLOCATOR_FLAG_INSIST_ON_FRAMESIZE_RATIO 0x00000080 - // - // allocator pipes flags - // - // there is at least one data modification in a pipe - #define KSALLOCATOR_FLAG_NO_FRAME_INTEGRITY 0x00000100 - #define KSALLOCATOR_FLAG_MULTIPLE_OUTPUT 0x00000200 - #define KSALLOCATOR_FLAG_CYCLE 0x00000400 - #define KSALLOCATOR_FLAG_ALLOCATOR_EXISTS 0x00000800 - // there is no framing dependency between neighbouring pipes. - #define KSALLOCATOR_FLAG_INDEPENDENT_RANGES 0x00001000 - #define KSALLOCATOR_FLAG_ATTENTION_STEPPING 0x00002000 - - - // - // old Framing structure - // - typedef struct { - union { - ULONG OptionsFlags; // allocator options (create) - ULONG RequirementsFlags; // allocation requirements (query) - }; - #if defined(_NTDDK_) - POOL_TYPE PoolType; - #else // !_NTDDK_ - ULONG PoolType; - #endif // !_NTDDK_ - ULONG Frames; // total number of allowable outstanding frames - ULONG FrameSize; // total size of frame - ULONG FileAlignment; - ULONG Reserved; - } KSALLOCATOR_FRAMING, *PKSALLOCATOR_FRAMING; - - #if defined(_NTDDK_) - typedef - PVOID - (*PFNKSDEFAULTALLOCATE)( - IN PVOID Context - ); - - typedef - VOID - (*PFNKSDEFAULTFREE)( - IN PVOID Context, - IN PVOID Buffer - ); - - typedef - NTSTATUS - (*PFNKSINITIALIZEALLOCATOR)( - IN PVOID InitialContext, - IN PKSALLOCATOR_FRAMING AllocatorFraming, - OUT PVOID* Context - ); - - typedef - VOID - (*PFNKSDELETEALLOCATOR)( - IN PVOID Context - ); - #endif // !_NTDDK_ - - // - // new Framing structure, eventually will replace KSALLOCATOR_FRAMING. - // - typedef struct { - ULONG MinFrameSize; - ULONG MaxFrameSize; - ULONG Stepping; - } KS_FRAMING_RANGE, *PKS_FRAMING_RANGE; - - - typedef struct { - KS_FRAMING_RANGE Range; - ULONG InPlaceWeight; - ULONG NotInPlaceWeight; - } KS_FRAMING_RANGE_WEIGHTED, *PKS_FRAMING_RANGE_WEIGHTED; - - - typedef struct { - ULONG RatioNumerator; // compression/expansion ratio - ULONG RatioDenominator; - ULONG RatioConstantMargin; - } KS_COMPRESSION, *PKS_COMPRESSION; - - - // - // Memory Types and Buses are repeated in each entry. - // Easiest to use but takes a little more memory than the varsize layout Pin\Memories\Buses\Ranges. - // - typedef struct { - GUID MemoryType; - GUID BusType; - ULONG MemoryFlags; - ULONG BusFlags; - ULONG Flags; - ULONG Frames; // total number of allowable outstanding frames - ULONG FileAlignment; - ULONG MemoryTypeWeight; // this memory type Weight pin-wide - KS_FRAMING_RANGE PhysicalRange; - KS_FRAMING_RANGE_WEIGHTED FramingRange; - } KS_FRAMING_ITEM, *PKS_FRAMING_ITEM; - - - typedef struct { - ULONG CountItems; // count of FramingItem-s below. - ULONG PinFlags; - KS_COMPRESSION OutputCompression; - ULONG PinWeight; // this pin framing's Weight graph-wide - KS_FRAMING_ITEM FramingItem[1]; - } KSALLOCATOR_FRAMING_EX, *PKSALLOCATOR_FRAMING_EX; - - - - // - // define memory type GUIDs - // - #define KSMEMORY_TYPE_WILDCARD GUID_NULL - #define STATIC_KSMEMORY_TYPE_WILDCARD STATIC_GUID_NULL - - #define KSMEMORY_TYPE_DONT_CARE GUID_NULL - #define STATIC_KSMEMORY_TYPE_DONT_CARE STATIC_GUID_NULL - - #define KS_TYPE_DONT_CARE GUID_NULL - #define STATIC_KS_TYPE_DONT_CARE STATIC_GUID_NULL - - #define STATIC_KSMEMORY_TYPE_SYSTEM \ - 0x091bb638L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 - DEFINE_GUIDSTRUCT("091bb638-603f-11d1-b067-00a0c9062802", KSMEMORY_TYPE_SYSTEM); - #define KSMEMORY_TYPE_SYSTEM DEFINE_GUIDNAMED(KSMEMORY_TYPE_SYSTEM) - - #define STATIC_KSMEMORY_TYPE_USER \ - 0x8cb0fc28L, 0x7893, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 - DEFINE_GUIDSTRUCT("8cb0fc28-7893-11d1-b069-00a0c9062802", KSMEMORY_TYPE_USER); - #define KSMEMORY_TYPE_USER DEFINE_GUIDNAMED(KSMEMORY_TYPE_USER) - - #define STATIC_KSMEMORY_TYPE_KERNEL_PAGED \ - 0xd833f8f8L, 0x7894, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 - DEFINE_GUIDSTRUCT("d833f8f8-7894-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_PAGED); - #define KSMEMORY_TYPE_KERNEL_PAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_PAGED) - - #define STATIC_KSMEMORY_TYPE_KERNEL_NONPAGED \ - 0x4a6d5fc4L, 0x7895, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 - DEFINE_GUIDSTRUCT("4a6d5fc4-7895-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_NONPAGED); - #define KSMEMORY_TYPE_KERNEL_NONPAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_NONPAGED) - - // old KS clients did not specify the device memory type - #define STATIC_KSMEMORY_TYPE_DEVICE_UNKNOWN \ - 0x091bb639L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 - DEFINE_GUIDSTRUCT("091bb639-603f-11d1-b067-00a0c9062802", KSMEMORY_TYPE_DEVICE_UNKNOWN); - #define KSMEMORY_TYPE_DEVICE_UNKNOWN DEFINE_GUIDNAMED(KSMEMORY_TYPE_DEVICE_UNKNOWN) - - // - // Helper framing macros. - // - #define DECLARE_SIMPLE_FRAMING_EX(FramingExName, MemoryType, Flags, Frames, Alignment, MinFrameSize, MaxFrameSize) \ - const KSALLOCATOR_FRAMING_EX FramingExName = \ - {\ - 1, \ - 0, \ - {\ - 1, \ - 1, \ - 0 \ - }, \ - 0, \ - {\ - {\ - MemoryType, \ - STATIC_KS_TYPE_DONT_CARE, \ - 0, \ - 0, \ - Flags, \ - Frames, \ - Alignment, \ - 0, \ - {\ - 0, \ - (ULONG)-1, \ - 1 \ - }, \ - {\ - {\ - MinFrameSize, \ - MaxFrameSize, \ - 1 \ - }, \ - 0, \ - 0 \ - }\ - }\ - }\ - } - - #define SetDefaultKsCompression(KsCompressionPointer) \ - {\ - KsCompressionPointer->RatioNumerator = 1;\ - KsCompressionPointer->RatioDenominator = 1;\ - KsCompressionPointer->RatioConstantMargin = 0;\ - } - - #define SetDontCareKsFramingRange(KsFramingRangePointer) \ - {\ - KsFramingRangePointer->MinFrameSize = 0;\ - KsFramingRangePointer->MaxFrameSize = (ULONG) -1;\ - KsFramingRangePointer->Stepping = 1;\ - } - - #define SetKsFramingRange(KsFramingRangePointer, P_MinFrameSize, P_MaxFrameSize) \ - {\ - KsFramingRangePointer->MinFrameSize = P_MinFrameSize;\ - KsFramingRangePointer->MaxFrameSize = P_MaxFrameSize;\ - KsFramingRangePointer->Stepping = 1;\ - } - - #define SetKsFramingRangeWeighted(KsFramingRangeWeightedPointer, P_MinFrameSize, P_MaxFrameSize) \ - {\ - KS_FRAMING_RANGE *KsFramingRange = &KsFramingRangeWeightedPointer->Range;\ - SetKsFramingRange(KsFramingRange, P_MinFrameSize, P_MaxFrameSize);\ - KsFramingRangeWeightedPointer->InPlaceWeight = 0;\ - KsFramingRangeWeightedPointer->NotInPlaceWeight = 0;\ - } - - #define INITIALIZE_SIMPLE_FRAMING_EX(FramingExPointer, P_MemoryType, P_Flags, P_Frames, P_Alignment, P_MinFrameSize, P_MaxFrameSize) \ - {\ - KS_COMPRESSION *KsCompression = &FramingExPointer->OutputCompression;\ - KS_FRAMING_RANGE *KsFramingRange = &FramingExPointer->FramingItem[0].PhysicalRange;\ - KS_FRAMING_RANGE_WEIGHTED *KsFramingRangeWeighted = &FramingExPointer->FramingItem[0].FramingRange;\ - FramingExPointer->CountItems = 1;\ - FramingExPointer->PinFlags = 0;\ - SetDefaultKsCompression(KsCompression);\ - FramingExPointer->PinWeight = 0;\ - FramingExPointer->FramingItem[0].MemoryType = P_MemoryType;\ - FramingExPointer->FramingItem[0].BusType = KS_TYPE_DONT_CARE;\ - FramingExPointer->FramingItem[0].MemoryFlags = 0;\ - FramingExPointer->FramingItem[0].BusFlags = 0;\ - FramingExPointer->FramingItem[0].Flags = P_Flags;\ - FramingExPointer->FramingItem[0].Frames = P_Frames;\ - FramingExPointer->FramingItem[0].FileAlignment = P_Alignment;\ - FramingExPointer->FramingItem[0].MemoryTypeWeight = 0;\ - SetDontCareKsFramingRange(KsFramingRange);\ - SetKsFramingRangeWeighted(KsFramingRangeWeighted, P_MinFrameSize, P_MaxFrameSize);\ - } - - - - // KSEVENTSETID_StreamAllocator: {75D95571-073C-11d0-A161-0020AFD156E4} - - #define STATIC_KSEVENTSETID_StreamAllocator\ - 0x75d95571L, 0x073c, 0x11d0, 0xa1, 0x61, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 - DEFINE_GUIDSTRUCT("75d95571-073c-11d0-a161-0020afd156e4", KSEVENTSETID_StreamAllocator); - #define KSEVENTSETID_StreamAllocator DEFINE_GUIDNAMED(KSEVENTSETID_StreamAllocator) - - typedef enum { - KSEVENT_STREAMALLOCATOR_INTERNAL_FREEFRAME, - KSEVENT_STREAMALLOCATOR_FREEFRAME - } KSEVENT_STREAMALLOCATOR; - - #define STATIC_KSMETHODSETID_StreamAllocator\ - 0xcf6e4341L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 - DEFINE_GUIDSTRUCT("cf6e4341-ec87-11cf-a130-0020afd156e4", KSMETHODSETID_StreamAllocator); - #define KSMETHODSETID_StreamAllocator DEFINE_GUIDNAMED(KSMETHODSETID_StreamAllocator) - - typedef enum { - KSMETHOD_STREAMALLOCATOR_ALLOC, - KSMETHOD_STREAMALLOCATOR_FREE - } KSMETHOD_STREAMALLOCATOR; - - #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(Handler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_STREAMALLOCATOR_ALLOC,\ - KSMETHOD_TYPE_WRITE,\ - (Handler),\ - sizeof(KSMETHOD),\ - sizeof(PVOID),\ - NULL) - - #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(Handler)\ - DEFINE_KSMETHOD_ITEM(\ - KSMETHOD_STREAMALLOCATOR_FREE,\ - KSMETHOD_TYPE_READ,\ - (Handler),\ - sizeof(KSMETHOD),\ - sizeof(PVOID),\ - NULL) - - #define DEFINE_KSMETHOD_ALLOCATORSET(AllocatorSet, MethodAlloc, MethodFree)\ - DEFINE_KSMETHOD_TABLE(AllocatorSet) {\ - DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(MethodAlloc),\ - DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(MethodFree)\ - } - - #define STATIC_KSPROPSETID_StreamAllocator\ - 0xcf6e4342L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 - DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4", KSPROPSETID_StreamAllocator); - #define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator) - - #if defined(_NTDDK_) - typedef enum { - KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE, - KSPROPERTY_STREAMALLOCATOR_STATUS - } KSPROPERTY_STREAMALLOCATOR; - - #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSSTREAMALLOCATOR_FUNCTIONTABLE),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAMALLOCATOR_STATUS,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSSTREAMALLOCATOR_STATUS),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ALLOCATORSET(AllocatorSet, PropFunctionTable, PropStatus)\ - DEFINE_KSPROPERTY_TABLE(AllocatorSet) {\ - DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(PropStatus),\ - DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(PropFunctionTable)\ - } - - typedef - NTSTATUS - (*PFNALLOCATOR_ALLOCATEFRAME)( - IN PFILE_OBJECT FileObject, - PVOID *Frame - ); - - typedef - VOID - (*PFNALLOCATOR_FREEFRAME)( - IN PFILE_OBJECT FileObject, - IN PVOID Frame - ); - - typedef struct { - PFNALLOCATOR_ALLOCATEFRAME AllocateFrame; - PFNALLOCATOR_FREEFRAME FreeFrame; - } KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE; - #endif // defined(_NTDDK_) - - typedef struct { - KSALLOCATOR_FRAMING Framing; - ULONG AllocatedFrames; - ULONG Reserved; - } KSSTREAMALLOCATOR_STATUS, *PKSSTREAMALLOCATOR_STATUS; - - typedef struct { - KSALLOCATOR_FRAMING_EX Framing; - ULONG AllocatedFrames; - ULONG Reserved; - } KSSTREAMALLOCATOR_STATUS_EX, *PKSSTREAMALLOCATOR_STATUS_EX; - - - #define KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT 0x00000001 - #define KSSTREAM_HEADER_OPTIONSF_PREROLL 0x00000002 - #define KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY 0x00000004 - #define KSSTREAM_HEADER_OPTIONSF_TYPECHANGED 0x00000008 - #define KSSTREAM_HEADER_OPTIONSF_TIMEVALID 0x00000010 - #define KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY 0x00000040 - #define KSSTREAM_HEADER_OPTIONSF_FLUSHONPAUSE 0x00000080 - #define KSSTREAM_HEADER_OPTIONSF_DURATIONVALID 0x00000100 - #define KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM 0x00000200 - #define KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA 0x80000000 - - typedef struct { - LONGLONG Time; - ULONG Numerator; - ULONG Denominator; - } KSTIME, *PKSTIME; - - typedef struct { - ULONG Size; - ULONG TypeSpecificFlags; - KSTIME PresentationTime; - LONGLONG Duration; - ULONG FrameExtent; - ULONG DataUsed; - PVOID Data; - ULONG OptionsFlags; - #if _WIN64 - ULONG Reserved; - #endif - } KSSTREAM_HEADER, *PKSSTREAM_HEADER; - - #define STATIC_KSPROPSETID_StreamInterface\ - 0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a - DEFINE_GUIDSTRUCT("1fdd8ee1-9cd3-11d0-82aa-0000f822fe8a", KSPROPSETID_StreamInterface); - #define KSPROPSETID_StreamInterface DEFINE_GUIDNAMED(KSPROPSETID_StreamInterface) - - typedef enum { - KSPROPERTY_STREAMINTERFACE_HEADERSIZE - } KSPROPERTY_STREAMINTERFACE; - - #define DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE( GetHandler )\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAMINTERFACE_HEADERSIZE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(ULONG),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_STREAMINTERFACESET(StreamInterfaceSet,\ - HeaderSizeHandler)\ - DEFINE_KSPROPERTY_TABLE(StreamInterfaceSet) {\ - DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE( HeaderSizeHandler )\ - } - - #define STATIC_KSPROPSETID_Stream\ - 0x65aaba60L, 0x98ae, 0x11cf, 0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 - DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4", KSPROPSETID_Stream); - #define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream) - - typedef enum { - KSPROPERTY_STREAM_ALLOCATOR, - KSPROPERTY_STREAM_QUALITY, - KSPROPERTY_STREAM_DEGRADATION, - KSPROPERTY_STREAM_MASTERCLOCK, - KSPROPERTY_STREAM_TIMEFORMAT, - KSPROPERTY_STREAM_PRESENTATIONTIME, - KSPROPERTY_STREAM_PRESENTATIONEXTENT, - KSPROPERTY_STREAM_FRAMETIME, - KSPROPERTY_STREAM_RATECAPABILITY, - KSPROPERTY_STREAM_RATE, - KSPROPERTY_STREAM_PIPE_ID - } KSPROPERTY_STREAM; - - #define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_ALLOCATOR,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(HANDLE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_QUALITY,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSQUALITY_MANAGER),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_DEGRADATION,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_MASTERCLOCK,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(HANDLE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_TIMEFORMAT,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(GUID),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_PRESENTATIONTIME,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(KSTIME),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_PRESENTATIONEXTENT,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_FRAMETIME,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSFRAMETIME),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_RATECAPABILITY,\ - (Handler),\ - sizeof(KSRATE_CAPABILITY),\ - sizeof(KSRATE),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_RATE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(KSRATE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_PIPE_ID,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(HANDLE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - - typedef struct { - HANDLE QualityManager; - PVOID Context; - } KSQUALITY_MANAGER, *PKSQUALITY_MANAGER; - - typedef struct { - LONGLONG Duration; - ULONG FrameFlags; - ULONG Reserved; - } KSFRAMETIME, *PKSFRAMETIME; - - #define KSFRAMETIME_VARIABLESIZE 0x00000001 - - typedef struct { - LONGLONG PresentationStart; - LONGLONG Duration; - KSPIN_INTERFACE Interface; - LONG Rate; - ULONG Flags; - } KSRATE, *PKSRATE; - - #define KSRATE_NOPRESENTATIONSTART 0x00000001 - #define KSRATE_NOPRESENTATIONDURATION 0x00000002 - - typedef struct { - KSPROPERTY Property; - KSRATE Rate; - } KSRATE_CAPABILITY, *PKSRATE_CAPABILITY; - - #define STATIC_KSPROPSETID_Clock \ - 0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000", KSPROPSETID_Clock); - #define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock) - - // - // Performs a x*y/z operation on 64 bit quantities by splitting the operation. The equation - // is simplified with respect to adding in the remainder for the upper 32 bits. - // - // (xh * 10000000 / Frequency) * 2^32 + ((((xh * 10000000) % Frequency) * 2^32 + (xl * 10000000)) / Frequency) - // - #define NANOSECONDS 10000000 - #define KSCONVERT_PERFORMANCE_TIME(Frequency, PerformanceTime) \ - ((((ULONGLONG)(ULONG)(PerformanceTime).HighPart * NANOSECONDS / (Frequency)) << 32) + \ - ((((((ULONGLONG)(ULONG)(PerformanceTime).HighPart * NANOSECONDS) % (Frequency)) << 32) + \ - ((ULONGLONG)(PerformanceTime).LowPart * NANOSECONDS)) / (Frequency))) - - typedef struct { - ULONG CreateFlags; - } KSCLOCK_CREATE, *PKSCLOCK_CREATE; - - typedef struct { - LONGLONG Time; - LONGLONG SystemTime; - } KSCORRELATED_TIME, *PKSCORRELATED_TIME; - - typedef struct { - LONGLONG Granularity; - LONGLONG Error; - } KSRESOLUTION, *PKSRESOLUTION; - - typedef enum { - KSPROPERTY_CLOCK_TIME, - KSPROPERTY_CLOCK_PHYSICALTIME, - KSPROPERTY_CLOCK_CORRELATEDTIME, - KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME, - KSPROPERTY_CLOCK_RESOLUTION, - KSPROPERTY_CLOCK_STATE, - #if defined(_NTDDK_) - KSPROPERTY_CLOCK_FUNCTIONTABLE - #endif // defined(_NTDDK_) - } KSPROPERTY_CLOCK; - - #if defined(_NTDDK_) - - typedef - LONGLONG - (FASTCALL *PFNKSCLOCK_GETTIME)( - IN PFILE_OBJECT FileObject - ); - typedef - LONGLONG - (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)( - IN PFILE_OBJECT FileObject, - OUT PLONGLONG SystemTime); - - typedef struct { - PFNKSCLOCK_GETTIME GetTime; - PFNKSCLOCK_GETTIME GetPhysicalTime; - PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime; - PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime; - } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE; - - typedef - BOOLEAN - (*PFNKSSETTIMER)( - IN PVOID Context, - IN PKTIMER Timer, - IN LARGE_INTEGER DueTime, - IN PKDPC Dpc - ); - - typedef - BOOLEAN - (*PFNKSCANCELTIMER)( - IN PVOID Context, - IN PKTIMER Timer - ); - - typedef - LONGLONG - (FASTCALL *PFNKSCORRELATEDTIME)( - IN PVOID Context, - OUT PLONGLONG SystemTime); - - typedef PVOID PKSDEFAULTCLOCK; - - #define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_TIME,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_PHYSICALTIME,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_CORRELATEDTIME,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSCORRELATED_TIME),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSCORRELATED_TIME),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_RESOLUTION,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSRESOLUTION),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_STATE,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSSTATE),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_FUNCTIONTABLE,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSCLOCK_FUNCTIONTABLE),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,\ - PropTime, PropPhysicalTime,\ - PropCorrelatedTime, PropCorrelatedPhysicalTime,\ - PropResolution, PropState, PropFunctionTable)\ - DEFINE_KSPROPERTY_TABLE(ClockSet) {\ - DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable),\ - } - - #endif // defined(_NTDDK_) - - #define STATIC_KSEVENTSETID_Clock \ - 0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000", KSEVENTSETID_Clock); - #define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock) - - typedef enum { - KSEVENT_CLOCK_INTERVAL_MARK, - KSEVENT_CLOCK_POSITION_MARK - } KSEVENT_CLOCK_POSITION; - - #define STATIC_KSEVENTSETID_Connection\ - 0x7f4bcbe0L, 0x9ea5, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("7f4bcbe0-9ea5-11cf-a5d6-28db04c10000", KSEVENTSETID_Connection); - #define KSEVENTSETID_Connection DEFINE_GUIDNAMED(KSEVENTSETID_Connection) - - typedef enum { - KSEVENT_CONNECTION_POSITIONUPDATE, - KSEVENT_CONNECTION_DATADISCONTINUITY, - KSEVENT_CONNECTION_TIMEDISCONTINUITY, - KSEVENT_CONNECTION_PRIORITY, - KSEVENT_CONNECTION_ENDOFSTREAM - } KSEVENT_CONNECTION; - - typedef struct { - PVOID Context; - ULONG Proportion; - LONGLONG DeltaTime; - } KSQUALITY, *PKSQUALITY; - - typedef struct { - PVOID Context; - ULONG Status; - } KSERROR, *PKSERROR; - - typedef KSIDENTIFIER KSDEGRADE, *PKSDEGRADE; - - #define STATIC_KSDEGRADESETID_Standard\ - 0x9F564180L, 0x704C, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("9F564180-704C-11D0-A5D6-28DB04C10000", KSDEGRADESETID_Standard); - #define KSDEGRADESETID_Standard DEFINE_GUIDNAMED(KSDEGRADESETID_Standard) - - typedef enum { - KSDEGRADE_STANDARD_SAMPLE, - KSDEGRADE_STANDARD_QUALITY, - KSDEGRADE_STANDARD_COMPUTATION, - KSDEGRADE_STANDARD_SKIP - } KSDEGRADE_STANDARD; - - #if defined(_NTDDK_) - - #define KSPROBE_STREAMREAD 0x00000000 - #define KSPROBE_STREAMWRITE 0x00000001 - #define KSPROBE_ALLOCATEMDL 0x00000010 - #define KSPROBE_PROBEANDLOCK 0x00000020 - #define KSPROBE_SYSTEMADDRESS 0x00000040 - #define KSPROBE_MODIFY 0x00000200 - #define KSPROBE_STREAMWRITEMODIFY (KSPROBE_MODIFY | KSPROBE_STREAMWRITE) - #define KSPROBE_ALLOWFORMATCHANGE 0x00000080 - - #define KSSTREAM_READ KSPROBE_STREAMREAD - #define KSSTREAM_WRITE KSPROBE_STREAMWRITE - #define KSSTREAM_PAGED_DATA 0x00000000 - #define KSSTREAM_NONPAGED_DATA 0x00000100 - #define KSSTREAM_SYNCHRONOUS 0x00001000 - #define KSSTREAM_FAILUREEXCEPTION 0x00002000 - - typedef - NTSTATUS - (*PFNKSCONTEXT_DISPATCH)( - IN PVOID Context, - IN PIRP Irp - ); - - typedef - NTSTATUS - (*PFNKSHANDLER)( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data - ); - - typedef - BOOLEAN - (*PFNKSFASTHANDLER)( - IN PFILE_OBJECT FileObject, - IN PKSIDENTIFIER UNALIGNED Request, - IN ULONG RequestLength, - IN OUT PVOID UNALIGNED Data, - IN ULONG DataLength, - OUT PIO_STATUS_BLOCK IoStatus - ); - - typedef - NTSTATUS - (*PFNKSALLOCATOR)( - IN PIRP Irp, - IN ULONG BufferSize, - IN BOOLEAN InputOperation - ); - - typedef struct { - KSPROPERTY_MEMBERSHEADER MembersHeader; - const VOID* Members; - } KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST; - - typedef struct { - KSIDENTIFIER PropTypeSet; - ULONG MembersListCount; - const KSPROPERTY_MEMBERSLIST* MembersList; - } KSPROPERTY_VALUES, *PKSPROPERTY_VALUES; - - #define DEFINE_KSPROPERTY_TABLE(tablename)\ - const KSPROPERTY_ITEM tablename[] = - - #define DEFINE_KSPROPERTY_ITEM(PropertyId, GetHandler,\ - MinProperty,\ - MinData,\ - SetHandler,\ - Values, RelationsCount, Relations, SupportHandler,\ - SerializedSize)\ - {\ - PropertyId, (PFNKSHANDLER)GetHandler, MinProperty, MinData,\ - (PFNKSHANDLER)SetHandler,\ - (PKSPROPERTY_VALUES)Values, RelationsCount, (PKSPROPERTY)Relations,\ - (PFNKSHANDLER)SupportHandler, (ULONG)SerializedSize\ - } - - typedef struct { - ULONG PropertyId; - union { - PFNKSHANDLER GetPropertyHandler; - BOOLEAN GetSupported; - }; - ULONG MinProperty; - ULONG MinData; - union { - PFNKSHANDLER SetPropertyHandler; - BOOLEAN SetSupported; - }; - const KSPROPERTY_VALUES*Values; - ULONG RelationsCount; - const KSPROPERTY* Relations; - PFNKSHANDLER SupportHandler; - ULONG SerializedSize; - } KSPROPERTY_ITEM, *PKSPROPERTY_ITEM; - - #define DEFINE_KSFASTPROPERTY_ITEM(PropertyId, GetHandler, SetHandler)\ - {\ - PropertyId, (PFNKSFASTHANDLER)GetHandler, (PFNKSFASTHANDLER)SetHandler, 0\ - } - - typedef struct { - ULONG PropertyId; - union { - PFNKSFASTHANDLER GetPropertyHandler; - BOOLEAN GetSupported; - }; - union { - PFNKSFASTHANDLER SetPropertyHandler; - BOOLEAN SetSupported; - }; - ULONG Reserved; - } KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM; - - #define DEFINE_KSPROPERTY_SET(Set,\ - PropertiesCount,\ - PropertyItem,\ - FastIoCount,\ - FastIoTable)\ - {\ - Set,\ - PropertiesCount,\ - PropertyItem,\ - FastIoCount,\ - FastIoTable\ - } - - #define DEFINE_KSPROPERTY_SET_TABLE(tablename)\ - const KSPROPERTY_SET tablename[] = - - typedef struct { - const GUID* Set; - ULONG PropertiesCount; - const KSPROPERTY_ITEM* PropertyItem; - ULONG FastIoCount; - const KSFASTPROPERTY_ITEM* FastIoTable; - } KSPROPERTY_SET, *PKSPROPERTY_SET; - - #define DEFINE_KSMETHOD_TABLE(tablename)\ - const KSMETHOD_ITEM tablename[] = - - #define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\ - MethodHandler,\ - MinMethod, MinData, SupportHandler)\ - {\ - MethodId, (PFNKSHANDLER)MethodHandler, MinMethod, MinData,\ - SupportHandler, Flags\ - } - - typedef struct { - ULONG MethodId; - union { - PFNKSHANDLER MethodHandler; - BOOLEAN MethodSupported; - }; - ULONG MinMethod; - ULONG MinData; - PFNKSHANDLER SupportHandler; - ULONG Flags; - } KSMETHOD_ITEM, *PKSMETHOD_ITEM; - - #define DEFINE_KSFASTMETHOD_ITEM(MethodId, MethodHandler)\ - {\ - MethodId, (PFNKSFASTHANDLER)MethodHandler\ - } - - typedef struct { - ULONG MethodId; - union { - PFNKSFASTHANDLER MethodHandler; - BOOLEAN MethodSupported; - }; - } KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM; - - #define DEFINE_KSMETHOD_SET(Set,\ - MethodsCount,\ - MethodItem,\ - FastIoCount,\ - FastIoTable)\ - {\ - Set,\ - MethodsCount,\ - MethodItem,\ - FastIoCount,\ - FastIoTable\ - } - - #define DEFINE_KSMETHOD_SET_TABLE(tablename)\ - const KSMETHOD_SET tablename[] = - - typedef struct { - const GUID* Set; - ULONG MethodsCount; - const KSMETHOD_ITEM* MethodItem; - ULONG FastIoCount; - const KSFASTMETHOD_ITEM*FastIoTable; - } KSMETHOD_SET, *PKSMETHOD_SET; - - typedef struct _KSEVENT_ENTRY - KSEVENT_ENTRY, *PKSEVENT_ENTRY; - - typedef - NTSTATUS - (*PFNKSADDEVENT)( - IN PIRP Irp, - IN PKSEVENTDATA EventData, - IN struct _KSEVENT_ENTRY* EventEntry - ); - - typedef - VOID - (*PFNKSREMOVEEVENT)( - IN PFILE_OBJECT FileObject, - IN struct _KSEVENT_ENTRY* EventEntry - ); - - #define DEFINE_KSEVENT_TABLE(tablename)\ - const KSEVENT_ITEM tablename[] = - - #define DEFINE_KSEVENT_ITEM(EventId, DataInput, ExtraEntryData,\ - AddHandler, RemoveHandler, SupportHandler)\ - {\ - EventId,\ - DataInput,\ - ExtraEntryData,\ - AddHandler,\ - RemoveHandler,\ - SupportHandler\ - } - - typedef struct { - ULONG EventId; - ULONG DataInput; - ULONG ExtraEntryData; - PFNKSADDEVENT AddHandler; - PFNKSREMOVEEVENT RemoveHandler; - PFNKSHANDLER SupportHandler; - } KSEVENT_ITEM, *PKSEVENT_ITEM; - - #define DEFINE_KSEVENT_SET(Set,\ - EventsCount,\ - EventItem)\ - {\ - Set, EventsCount, EventItem\ - } - - #define DEFINE_KSEVENT_SET_TABLE(tablename)\ - const KSEVENT_SET tablename[] = - - typedef struct { - const GUID* Set; - ULONG EventsCount; - const KSEVENT_ITEM* EventItem; - } KSEVENT_SET, *PKSEVENT_SET; - - typedef struct { - KDPC Dpc; - ULONG ReferenceCount; - KSPIN_LOCK AccessLock; - } KSDPC_ITEM, *PKSDPC_ITEM; - - typedef struct { - KSDPC_ITEM DpcItem; - LIST_ENTRY BufferList; - } KSBUFFER_ITEM, *PKSBUFFER_ITEM; - - #define KSEVENT_ENTRY_DELETED 1 - #define KSEVENT_ENTRY_ONESHOT 2 - #define KSEVENT_ENTRY_BUFFERED 4 - - struct _KSEVENT_ENTRY { - LIST_ENTRY ListEntry; - PVOID Object; - union { - PKSDPC_ITEM DpcItem; - PKSBUFFER_ITEM BufferItem; - }; - PKSEVENTDATA EventData; - ULONG NotificationType; - const KSEVENT_SET* EventSet; - const KSEVENT_ITEM* EventItem; - PFILE_OBJECT FileObject; - ULONG SemaphoreAdjustment; - ULONG Reserved; - ULONG Flags; - }; - - typedef enum { - KSEVENTS_NONE, - KSEVENTS_SPINLOCK, - KSEVENTS_MUTEX, - KSEVENTS_FMUTEX, - KSEVENTS_FMUTEXUNSAFE, - KSEVENTS_INTERRUPT, - KSEVENTS_ERESOURCE - } KSEVENTS_LOCKTYPE; - - #define KSDISPATCH_FASTIO 0x80000000 - - typedef struct { - PDRIVER_DISPATCH Create; - PVOID Context; - UNICODE_STRING ObjectClass; - PSECURITY_DESCRIPTOR SecurityDescriptor; - ULONG Flags; - } KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM; - - typedef - VOID - (*PFNKSITEMFREECALLBACK)( - IN PKSOBJECT_CREATE_ITEM CreateItem - ); - - #define KSCREATE_ITEM_SECURITYCHANGED 0x00000001 - #define KSCREATE_ITEM_WILDCARD 0x00000002 - #define KSCREATE_ITEM_NOPARAMETERS 0x00000004 - #define KSCREATE_ITEM_FREEONSTOP 0x00000008 - - #define DEFINE_KSCREATE_DISPATCH_TABLE( tablename )\ - KSOBJECT_CREATE_ITEM tablename[] = - - #define DEFINE_KSCREATE_ITEM(DispatchCreate, TypeName, Context)\ - {\ - (DispatchCreate),\ - (PVOID)(Context),\ - {\ - sizeof(TypeName) - sizeof(UNICODE_NULL),\ - sizeof(TypeName),\ - (PWCHAR)(TypeName)\ - },\ - NULL, 0\ - } - - #define DEFINE_KSCREATE_ITEMEX(DispatchCreate, TypeName, Context, Flags)\ - {\ - (DispatchCreate),\ - (PVOID)(Context),\ - {\ - sizeof(TypeName) - sizeof(UNICODE_NULL),\ - sizeof(TypeName),\ - (PWCHAR)(TypeName)\ - },\ - NULL, (Flags)\ - } - - #define DEFINE_KSCREATE_ITEMNULL( DispatchCreate, Context )\ - {\ - DispatchCreate,\ - Context,\ - {\ - 0,\ - 0,\ - NULL,\ - },\ - NULL, 0\ - } - - typedef struct { - ULONG CreateItemsCount; - PKSOBJECT_CREATE_ITEM CreateItemsList; - } KSOBJECT_CREATE, *PKSOBJECT_CREATE; - - typedef struct { - PDRIVER_DISPATCH DeviceIoControl; - PDRIVER_DISPATCH Read; - PDRIVER_DISPATCH Write; - PDRIVER_DISPATCH Flush; - PDRIVER_DISPATCH Close; - PDRIVER_DISPATCH QuerySecurity; - PDRIVER_DISPATCH SetSecurity; - PFAST_IO_DEVICE_CONTROL FastDeviceIoControl; - PFAST_IO_READ FastRead; - PFAST_IO_WRITE FastWrite; - } KSDISPATCH_TABLE, *PKSDISPATCH_TABLE; - - #define DEFINE_KSDISPATCH_TABLE( tablename, DeviceIoControl, Read, Write,\ - Flush, Close, QuerySecurity, SetSecurity,\ - FastDeviceIoControl, FastRead, FastWrite )\ - const KSDISPATCH_TABLE tablename = \ - {\ - DeviceIoControl, \ - Read, \ - Write, \ - Flush, \ - Close, \ - QuerySecurity, \ - SetSecurity, \ - FastDeviceIoControl, \ - FastRead, \ - FastWrite, \ - } - - #define KSCREATE_ITEM_IRP_STORAGE(Irp) ((PKSOBJECT_CREATE_ITEM)(Irp)->Tail.Overlay.DriverContext[0]) - #define KSEVENT_SET_IRP_STORAGE(Irp) ((const KSEVENT_SET*)(Irp)->Tail.Overlay.DriverContext[0]) - #define KSEVENT_ITEM_IRP_STORAGE(Irp) ((const KSEVENT_ITEM*)(Irp)->Tail.Overlay.DriverContext[3]) - #define KSEVENT_ENTRY_IRP_STORAGE(Irp) ((PKSEVENT_ENTRY)(Irp)->Tail.Overlay.DriverContext[0]) - #define KSMETHOD_SET_IRP_STORAGE(Irp) ((const KSMETHOD_SET*)(Irp)->Tail.Overlay.DriverContext[0]) - #define KSMETHOD_ITEM_IRP_STORAGE(Irp) ((const KSMETHOD_ITEM*)(Irp)->Tail.Overlay.DriverContext[3]) - #define KSMETHOD_TYPE_IRP_STORAGE(Irp) ((ULONG_PTR)((Irp)->Tail.Overlay.DriverContext[2])) - #define KSQUEUE_SPINLOCK_IRP_STORAGE(Irp) ((PKSPIN_LOCK)(Irp)->Tail.Overlay.DriverContext[1]) - #define KSPROPERTY_SET_IRP_STORAGE(Irp) ((const KSPROPERTY_SET*)(Irp)->Tail.Overlay.DriverContext[0]) - #define KSPROPERTY_ITEM_IRP_STORAGE(Irp) ((const KSPROPERTY_ITEM*)(Irp)->Tail.Overlay.DriverContext[3]) - #define KSPROPERTY_ATTRIBUTES_IRP_STORAGE(Irp) ((PKSATTRIBUTE_LIST)(Irp)->Tail.Overlay.DriverContext[2]) - - typedef PVOID KSDEVICE_HEADER, KSOBJECT_HEADER; - - typedef enum { - KsInvokeOnSuccess = 1, - KsInvokeOnError = 2, - KsInvokeOnCancel = 4 - } KSCOMPLETION_INVOCATION; - - typedef enum { - KsListEntryTail, - KsListEntryHead - } KSLIST_ENTRY_LOCATION; - - typedef enum { - KsAcquireOnly, - KsAcquireAndRemove, - KsAcquireOnlySingleItem, - KsAcquireAndRemoveOnlySingleItem - } KSIRP_REMOVAL_OPERATION; - - typedef enum { - KsStackCopyToNewLocation, - KsStackReuseCurrentLocation, - KsStackUseNewLocation - } KSSTACK_USE; - - typedef enum { - KSTARGET_STATE_DISABLED, - KSTARGET_STATE_ENABLED - } KSTARGET_STATE; - - typedef - NTSTATUS - (*PFNKSIRPLISTCALLBACK)( - IN PIRP Irp, - IN PVOID Context - ); - - typedef - VOID - (*PFNREFERENCEDEVICEOBJECT)( - IN PVOID Context - ); - - typedef - VOID - (*PFNDEREFERENCEDEVICEOBJECT)( - IN PVOID Context - ); - - typedef - NTSTATUS - (*PFNQUERYREFERENCESTRING)( - IN PVOID Context, - IN OUT PWCHAR *String - ); - - #define BUS_INTERFACE_REFERENCE_VERSION 0x100 - - typedef struct { - // - // Standard interface header - // - - INTERFACE Interface; - - // - // Standard bus interfaces - // - - PFNREFERENCEDEVICEOBJECT ReferenceDeviceObject; - PFNDEREFERENCEDEVICEOBJECT DereferenceDeviceObject; - PFNQUERYREFERENCESTRING QueryReferenceString; - - } BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE; - - #define STATIC_REFERENCE_BUS_INTERFACE STATIC_KSMEDIUMSETID_Standard - #define REFERENCE_BUS_INTERFACE KSMEDIUMSETID_Standard - - typedef - NTSTATUS - (*PFNQUERYMEDIUMSLIST)( - IN PVOID Context, - OUT ULONG* MediumsCount, - OUT PKSPIN_MEDIUM* MediumList - ); - - typedef struct { - // - // Standard interface header - // - - INTERFACE Interface; - - // - // Interface definition - // - - PFNQUERYMEDIUMSLIST QueryMediumsList; - - } BUS_INTERFACE_MEDIUMS, *PBUS_INTERFACE_MEDIUMS; - - #define STATIC_GUID_BUS_INTERFACE_MEDIUMS \ - 0x4EC35C3EL, 0x201B, 0x11D2, 0x87, 0x45, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("4EC35C3E-201B-11D2-8745-00A0C9223196", GUID_BUS_INTERFACE_MEDIUMS); - #define GUID_BUS_INTERFACE_MEDIUMS DEFINE_GUIDNAMED(GUID_BUS_INTERFACE_MEDIUMS) - - #endif // defined(_NTDDK_) - - #if !defined( PACK_PRAGMAS_NOT_SUPPORTED ) - #include - #endif - - typedef struct { - GUID PropertySet; - ULONG Count; - } KSPROPERTY_SERIALHDR, *PKSPROPERTY_SERIALHDR; - - #if !defined( PACK_PRAGMAS_NOT_SUPPORTED ) - #include - #endif - - typedef struct { - KSIDENTIFIER PropTypeSet; - ULONG Id; - ULONG PropertyLength; - } KSPROPERTY_SERIAL, *PKSPROPERTY_SERIAL; - - #if defined(_NTDDK_) - - #define IOCTL_KS_HANDSHAKE CTL_CODE(FILE_DEVICE_KS, 0x007, METHOD_NEITHER, FILE_ANY_ACCESS) - - typedef struct { - GUID ProtocolId; - PVOID Argument1; - PVOID Argument2; - } KSHANDSHAKE, *PKSHANDSHAKE; - - typedef struct _KSGATE - KSGATE, *PKSGATE; - - struct _KSGATE { - LONG Count; - PKSGATE NextGate; - }; - - #ifndef _NTOS_ - - void __inline - KsGateTurnInputOn( - IN PKSGATE Gate OPTIONAL - ) - { - while (Gate && (InterlockedIncrement(&Gate->Count) == 1)) { - Gate = Gate->NextGate; - } - } - - void __inline - KsGateTurnInputOff( - IN PKSGATE Gate OPTIONAL - ) - { - while (Gate && (InterlockedDecrement(&Gate->Count) == 0)) { - Gate = Gate->NextGate; - } - } - - BOOLEAN __inline - KsGateGetStateUnsafe( - IN PKSGATE Gate - ) - { - ASSERT(Gate); - return Gate->Count > 0; - } - - BOOLEAN __inline - KsGateCaptureThreshold( - IN PKSGATE Gate - ) - { - BOOLEAN captured; - - ASSERT(Gate); - - captured = (InterlockedCompareExchange(&Gate->Count,0,1) == 1); - - // - // If we made a transition, it must be propagated. - // - if (captured) { - KsGateTurnInputOff(Gate->NextGate); - } - - // - // We return whatever the state was prior to the compare/exchange. If - // the state was on, the state is now off. - // - return captured; - } - - void __inline - KsGateInitialize( - IN PKSGATE Gate, - IN LONG InitialCount, - IN PKSGATE NextGate OPTIONAL, - IN BOOLEAN StateToPropagate // IN BOOLEAN NextGateIsAnOrGate - ) - { - ASSERT(Gate); - Gate->Count = InitialCount; - Gate->NextGate = NextGate; - - if (NextGate) { - if (InitialCount > 0) { - if (StateToPropagate) { - KsGateTurnInputOn(NextGate); - } - } else { - if (! StateToPropagate) { - KsGateTurnInputOff(NextGate); - } - } - } - } - - void __inline - KsGateInitializeAnd( - IN PKSGATE AndGate, - IN PKSGATE NextOrGate OPTIONAL - ) - { - KsGateInitialize(AndGate,1,NextOrGate,TRUE); - } - - void __inline - KsGateInitializeOr( - IN PKSGATE OrGate, - IN PKSGATE NextAndGate OPTIONAL - ) - { - KsGateInitialize(OrGate,0,NextAndGate,FALSE); - } - - void __inline KsGateAddOnInputToAnd(IN PKSGATE AndGate) {} - void __inline KsGateAddOffInputToAnd(IN PKSGATE AndGate) { KsGateTurnInputOff(AndGate); } - void __inline KsGateRemoveOnInputFromAnd(IN PKSGATE AndGate) {} - void __inline KsGateRemoveOffInputFromAnd(IN PKSGATE AndGate) { KsGateTurnInputOn(AndGate); } - - void __inline KsGateAddOnInputToOr(IN PKSGATE OrGate) { KsGateTurnInputOn(OrGate); } - void __inline KsGateAddOffInputToOr(IN PKSGATE OrGate) {} - void __inline KsGateRemoveOnInputFromOr(IN PKSGATE OrGate) { KsGateTurnInputOff(OrGate); } - void __inline KsGateRemoveOffInputFromOr(IN PKSGATE OrGate) {} - - void __inline - KsGateTerminateAnd( - IN PKSGATE AndGate - ) - { - ASSERT(AndGate); - if (KsGateGetStateUnsafe(AndGate)) { - KsGateRemoveOnInputFromOr(AndGate->NextGate); - } else { - KsGateRemoveOffInputFromOr(AndGate->NextGate); - } - } - - void __inline - KsGateTerminateOr( - IN PKSGATE OrGate - ) - { - ASSERT(OrGate); - if (KsGateGetStateUnsafe(OrGate)) { - KsGateRemoveOnInputFromAnd(OrGate->NextGate); - } else { - KsGateRemoveOffInputFromAnd(OrGate->NextGate); - } - } - - #endif // !_NTOS_ - - typedef PVOID KSOBJECT_BAG; - - typedef - BOOLEAN - (*PFNKSGENERATEEVENTCALLBACK)( - IN PVOID Context, - IN PKSEVENT_ENTRY EventEntry - ); - - typedef - NTSTATUS - (*PFNKSDEVICECREATE)( - IN PKSDEVICE Device - ); - typedef - NTSTATUS - (*PFNKSDEVICEPNPSTART)( - IN PKSDEVICE Device, - IN PIRP Irp, - IN PCM_RESOURCE_LIST TranslatedResourceList OPTIONAL, - IN PCM_RESOURCE_LIST UntranslatedResourceList OPTIONAL - ); - typedef - NTSTATUS - (*PFNKSDEVICE)( - IN PKSDEVICE Device - ); - typedef - NTSTATUS - (*PFNKSDEVICEIRP)( - IN PKSDEVICE Device, - IN PIRP Irp - ); - typedef - void - (*PFNKSDEVICEIRPVOID)( - IN PKSDEVICE Device, - IN PIRP Irp - ); - typedef - NTSTATUS - (*PFNKSDEVICEQUERYCAPABILITIES)( - IN PKSDEVICE Device, - IN PIRP Irp, - IN OUT PDEVICE_CAPABILITIES Capabilities - ); - typedef - NTSTATUS - (*PFNKSDEVICEQUERYPOWER)( - IN PKSDEVICE Device, - IN PIRP Irp, - IN DEVICE_POWER_STATE DeviceTo, - IN DEVICE_POWER_STATE DeviceFrom, - IN SYSTEM_POWER_STATE SystemTo, - IN SYSTEM_POWER_STATE SystemFrom, - IN POWER_ACTION Action - ); - typedef - void - (*PFNKSDEVICESETPOWER)( - IN PKSDEVICE Device, - IN PIRP Irp, - IN DEVICE_POWER_STATE To, - IN DEVICE_POWER_STATE From - ); - typedef - NTSTATUS - (*PFNKSFILTERFACTORYVOID)( - IN PKSFILTERFACTORY FilterFactory - ); - typedef - void - (*PFNKSFILTERFACTORYPOWER)( - IN PKSFILTERFACTORY FilterFactory, - IN DEVICE_POWER_STATE State - ); - typedef - NTSTATUS - (*PFNKSFILTERIRP)( - IN PKSFILTER Filter, - IN PIRP Irp - ); - typedef - NTSTATUS - (*PFNKSFILTERPROCESS)( - IN PKSFILTER Filter, - IN PKSPROCESSPIN_INDEXENTRY Index - ); - typedef - NTSTATUS - (*PFNKSFILTERVOID)( - IN PKSFILTER Filter - ); - typedef - void - (*PFNKSFILTERPOWER)( - IN PKSFILTER Filter, - IN DEVICE_POWER_STATE State - ); - typedef - NTSTATUS - (*PFNKSPINIRP)( - IN PKSPIN Pin, - IN PIRP Irp - ); - typedef - NTSTATUS - (*PFNKSPINSETDEVICESTATE)( - IN PKSPIN Pin, - IN KSSTATE ToState, - IN KSSTATE FromState - ); - typedef - NTSTATUS - (*PFNKSPINSETDATAFORMAT)( - IN PKSPIN Pin, - IN PKSDATAFORMAT OldFormat OPTIONAL, - IN PKSMULTIPLE_ITEM OldAttributeList OPTIONAL, - IN const KSDATARANGE* DataRange, - IN const KSATTRIBUTE_LIST* AttributeRange OPTIONAL - ); - typedef - NTSTATUS - (*PFNKSPINHANDSHAKE)( - IN PKSPIN Pin, - IN PKSHANDSHAKE In, - IN PKSHANDSHAKE Out - ); - typedef - NTSTATUS - (*PFNKSPIN)( - IN PKSPIN Pin - ); - typedef - void - (*PFNKSPINVOID)( - IN PKSPIN Pin - ); - typedef - void - (*PFNKSPINPOWER)( - IN PKSPIN Pin, - IN DEVICE_POWER_STATE State - ); - typedef - BOOLEAN - (*PFNKSPINSETTIMER)( - IN PKSPIN Pin, - IN PKTIMER Timer, - IN LARGE_INTEGER DueTime, - IN PKDPC Dpc - ); - typedef - BOOLEAN - (*PFNKSPINCANCELTIMER)( - IN PKSPIN Pin, - IN PKTIMER Timer - ); - typedef - LONGLONG - (FASTCALL *PFNKSPINCORRELATEDTIME)( - IN PKSPIN Pin, - OUT PLONGLONG SystemTime - ); - typedef - void - (*PFNKSPINRESOLUTION)( - IN PKSPIN Pin, - OUT PKSRESOLUTION Resolution - ); - typedef - NTSTATUS - (*PFNKSPININITIALIZEALLOCATOR)( - IN PKSPIN Pin, - IN PKSALLOCATOR_FRAMING AllocatorFraming, - OUT PVOID* Context - ); - typedef - void - (*PFNKSSTREAMPOINTER)( - IN PKSSTREAM_POINTER StreamPointer - ); - - typedef struct KSAUTOMATION_TABLE_ - KSAUTOMATION_TABLE, *PKSAUTOMATION_TABLE; - struct KSAUTOMATION_TABLE_ { - ULONG PropertySetsCount; - ULONG PropertyItemSize; - const KSPROPERTY_SET* PropertySets; - ULONG MethodSetsCount; - ULONG MethodItemSize; - const KSMETHOD_SET* MethodSets; - ULONG EventSetsCount; - ULONG EventItemSize; - const KSEVENT_SET* EventSets; - #if !defined(_WIN64) - PVOID Alignment; - #endif // !defined(_WIN64) - }; - - #define DEFINE_KSAUTOMATION_TABLE(table)\ - const KSAUTOMATION_TABLE table = - - #define DEFINE_KSAUTOMATION_PROPERTIES(table)\ - SIZEOF_ARRAY(table),\ - sizeof(KSPROPERTY_ITEM),\ - table - - #define DEFINE_KSAUTOMATION_METHODS(table)\ - SIZEOF_ARRAY(table),\ - sizeof(KSMETHOD_ITEM),\ - table - - #define DEFINE_KSAUTOMATION_EVENTS(table)\ - SIZEOF_ARRAY(table),\ - sizeof(KSEVENT_ITEM),\ - table - - #define DEFINE_KSAUTOMATION_PROPERTIES_NULL\ - 0,\ - sizeof(KSPROPERTY_ITEM),\ - NULL - - #define DEFINE_KSAUTOMATION_METHODS_NULL\ - 0,\ - sizeof(KSMETHOD_ITEM),\ - NULL - - #define DEFINE_KSAUTOMATION_EVENTS_NULL\ - 0,\ - sizeof(KSEVENT_ITEM),\ - NULL - - #define MIN_DEV_VER_FOR_QI (0x100) - - struct _KSDEVICE_DISPATCH { - PFNKSDEVICECREATE Add; - PFNKSDEVICEPNPSTART Start; - PFNKSDEVICE PostStart; - PFNKSDEVICEIRP QueryStop; - PFNKSDEVICEIRPVOID CancelStop; - PFNKSDEVICEIRPVOID Stop; - PFNKSDEVICEIRP QueryRemove; - PFNKSDEVICEIRPVOID CancelRemove; - PFNKSDEVICEIRPVOID Remove; - PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities; - PFNKSDEVICEIRPVOID SurpriseRemoval; - PFNKSDEVICEQUERYPOWER QueryPower; - PFNKSDEVICESETPOWER SetPower; - PFNKSDEVICEIRP QueryInterface; // added in version 0x100 - }; - - struct _KSFILTER_DISPATCH { - PFNKSFILTERIRP Create; - PFNKSFILTERIRP Close; - PFNKSFILTERPROCESS Process; - PFNKSFILTERVOID Reset; - }; - - struct _KSPIN_DISPATCH { - PFNKSPINIRP Create; - PFNKSPINIRP Close; - PFNKSPIN Process; - PFNKSPINVOID Reset; - PFNKSPINSETDATAFORMAT SetDataFormat; - PFNKSPINSETDEVICESTATE SetDeviceState; - PFNKSPIN Connect; - PFNKSPINVOID Disconnect; - const KSCLOCK_DISPATCH* Clock; - const KSALLOCATOR_DISPATCH* Allocator; - }; - - struct _KSCLOCK_DISPATCH { - PFNKSPINSETTIMER SetTimer; - PFNKSPINCANCELTIMER CancelTimer; - PFNKSPINCORRELATEDTIME CorrelatedTime; - PFNKSPINRESOLUTION Resolution; - }; - - struct _KSALLOCATOR_DISPATCH { - PFNKSPININITIALIZEALLOCATOR InitializeAllocator; - PFNKSDELETEALLOCATOR DeleteAllocator; - PFNKSDEFAULTALLOCATE Allocate; - PFNKSDEFAULTFREE Free; - }; - - #define KSDEVICE_DESCRIPTOR_VERSION (0x100) - - struct _KSDEVICE_DESCRIPTOR { - const KSDEVICE_DISPATCH* Dispatch; - ULONG FilterDescriptorsCount; - const KSFILTER_DESCRIPTOR*const* FilterDescriptors; - ULONG Version; // this is 0 for pre-version 100 driver - //#if !defined(_WIN64) - //PVOID Alignment; - //#endif //!defined(_WIN64) - }; - - struct _KSFILTER_DESCRIPTOR { - const KSFILTER_DISPATCH* Dispatch; - const KSAUTOMATION_TABLE* AutomationTable; - ULONG Version; - #define KSFILTER_DESCRIPTOR_VERSION ((ULONG)-1) - ULONG Flags; - #define KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING 0x00000001 - #define KSFILTER_FLAG_CRITICAL_PROCESSING 0x00000002 - #define KSFILTER_FLAG_HYPERCRITICAL_PROCESSING 0x00000004 - const GUID* ReferenceGuid; - ULONG PinDescriptorsCount; - ULONG PinDescriptorSize; - const KSPIN_DESCRIPTOR_EX* PinDescriptors; - ULONG CategoriesCount; - const GUID* Categories; - ULONG NodeDescriptorsCount; - ULONG NodeDescriptorSize; - const KSNODE_DESCRIPTOR* NodeDescriptors; - ULONG ConnectionsCount; - const KSTOPOLOGY_CONNECTION* Connections; - const KSCOMPONENTID* ComponentId; - }; - - #define DEFINE_KSFILTER_DESCRIPTOR(descriptor)\ - const KSFILTER_DESCRIPTOR descriptor = - - #define DEFINE_KSFILTER_PIN_DESCRIPTORS(table)\ - SIZEOF_ARRAY(table),\ - sizeof(table[0]),\ - table - - #define DEFINE_KSFILTER_CATEGORIES(table)\ - SIZEOF_ARRAY(table),\ - table - - #define DEFINE_KSFILTER_CATEGORY(category)\ - 1,\ - &(category) - - #define DEFINE_KSFILTER_CATEGORIES_NULL\ - 0,\ - NULL - - #define DEFINE_KSFILTER_NODE_DESCRIPTORS(table)\ - SIZEOF_ARRAY(table),\ - sizeof(table[0]),\ - table - - #define DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL\ - 0,\ - sizeof(KSNODE_DESCRIPTOR),\ - NULL - - #define DEFINE_KSFILTER_CONNECTIONS(table)\ - SIZEOF_ARRAY(table),\ - table - - #define DEFINE_KSFILTER_DEFAULT_CONNECTIONS\ - 0,\ - NULL - - #define DEFINE_KSFILTER_DESCRIPTOR_TABLE(table)\ - const KSFILTER_DESCRIPTOR*const table[] = - - struct _KSPIN_DESCRIPTOR_EX { - const KSPIN_DISPATCH* Dispatch; - const KSAUTOMATION_TABLE* AutomationTable; - KSPIN_DESCRIPTOR PinDescriptor; - ULONG Flags; - #define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING - #define KSPIN_FLAG_CRITICAL_PROCESSING KSFILTER_FLAG_CRITICAL_PROCESSING - #define KSPIN_FLAG_HYPERCRITICAL_PROCESSING KSFILTER_FLAG_HYPERCRITICAL_PROCESSING - #define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING 0x00000008 - #define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING 0x00000010 - #define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL 0x00000020 - #define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING 0x00000040 - #define KSPIN_FLAG_ENFORCE_FIFO 0x00000080 - - #define KSPIN_FLAG_GENERATE_MAPPINGS 0x00000100 - #define KSPIN_FLAG_DISTINCT_TRAILING_EDGE 0x00000200 - - #define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY 0x00010000 - #define KSPIN_FLAG_SPLITTER 0x00020000 - #define KSPIN_FLAG_USE_STANDARD_TRANSPORT 0x00040000 - #define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT 0x00080000 - #define KSPIN_FLAG_FIXED_FORMAT 0x00100000 - #define KSPIN_FLAG_GENERATE_EOS_EVENTS 0x00200000 - #define KSPIN_FLAG_RENDERER (KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY|KSPIN_FLAG_GENERATE_EOS_EVENTS) - #define KSPIN_FLAG_IMPLEMENT_CLOCK 0x00400000 - ULONG InstancesPossible; - ULONG InstancesNecessary; - const KSALLOCATOR_FRAMING_EX* AllocatorFraming; - PFNKSINTERSECTHANDLEREX IntersectHandler; - }; - - #define DEFINE_KSPIN_DEFAULT_INTERFACES\ - 0,\ - NULL - - #define DEFINE_KSPIN_DEFAULT_MEDIUMS\ - 0,\ - NULL - - struct _KSNODE_DESCRIPTOR { - const KSAUTOMATION_TABLE* AutomationTable; - const GUID* Type; - const GUID* Name; - #if !defined(_WIN64) - PVOID Alignment; - #endif // !defined(_WIN64) - }; - - #if !defined(_WIN64) - #define DEFINE_NODE_DESCRIPTOR(automation,type,name) \ - { (automation), (type), (name), NULL } - #else // !defined(_WIN64) - #define DEFINE_NODE_DESCRIPTOR(automation,type,name) \ - { (automation), (type), (name) } - #endif // !defined(_WIN64) - - struct _KSDEVICE { - const KSDEVICE_DESCRIPTOR* Descriptor; - KSOBJECT_BAG Bag; - PVOID Context; - PDEVICE_OBJECT FunctionalDeviceObject; - PDEVICE_OBJECT PhysicalDeviceObject; - PDEVICE_OBJECT NextDeviceObject; - BOOLEAN Started; - SYSTEM_POWER_STATE SystemPowerState; - DEVICE_POWER_STATE DevicePowerState; - }; - - struct _KSFILTERFACTORY { - const KSFILTER_DESCRIPTOR* FilterDescriptor; - KSOBJECT_BAG Bag; - PVOID Context; - }; - - struct _KSFILTER { - const KSFILTER_DESCRIPTOR* Descriptor; - KSOBJECT_BAG Bag; - PVOID Context; - }; - - struct _KSPIN { - const KSPIN_DESCRIPTOR_EX* Descriptor; - KSOBJECT_BAG Bag; - PVOID Context; - ULONG Id; - KSPIN_COMMUNICATION Communication; - BOOLEAN ConnectionIsExternal; - KSPIN_INTERFACE ConnectionInterface; - KSPIN_MEDIUM ConnectionMedium; - KSPRIORITY ConnectionPriority; - PKSDATAFORMAT ConnectionFormat; - PKSMULTIPLE_ITEM AttributeList; - ULONG StreamHeaderSize; - KSPIN_DATAFLOW DataFlow; - KSSTATE DeviceState; - KSRESET ResetState; - }; - - struct _KSMAPPING { - PHYSICAL_ADDRESS PhysicalAddress; - ULONG ByteCount; - ULONG Alignment; - }; - - struct _KSSTREAM_POINTER_OFFSET - { - #if defined(_NTDDK_) - union { - PUCHAR Data; - PKSMAPPING Mappings; - }; - #else // !defined(_NTDDK_) - PUCHAR Data; - #endif // !defined(_NTDDK_) - #if !defined(_WIN64) - PVOID Alignment; - #endif // !defined(_WIN64) - ULONG Count; - ULONG Remaining; - }; - - struct _KSSTREAM_POINTER - { - PVOID Context; - PKSPIN Pin; - PKSSTREAM_HEADER StreamHeader; - PKSSTREAM_POINTER_OFFSET Offset; - KSSTREAM_POINTER_OFFSET OffsetIn; - KSSTREAM_POINTER_OFFSET OffsetOut; - }; - - struct _KSPROCESSPIN { - PKSPIN Pin; - PKSSTREAM_POINTER StreamPointer; - PKSPROCESSPIN InPlaceCounterpart; - PKSPROCESSPIN DelegateBranch; - PKSPROCESSPIN CopySource; - PVOID Data; - ULONG BytesAvailable; - ULONG BytesUsed; - ULONG Flags; - BOOLEAN Terminate; - }; - - struct _KSPROCESSPIN_INDEXENTRY { - PKSPROCESSPIN *Pins; - ULONG Count; - }; - - typedef enum { - KsObjectTypeDevice, - KsObjectTypeFilterFactory, - KsObjectTypeFilter, - KsObjectTypePin - } KSOBJECTTYPE; - - typedef - void - (*PFNKSFREE)( - IN PVOID Data - ); - - typedef - void - (*PFNKSPINFRAMERETURN)( - IN PKSPIN Pin, - IN PVOID Data OPTIONAL, - IN ULONG Size OPTIONAL, - IN PMDL Mdl OPTIONAL, - IN PVOID Context OPTIONAL, - IN NTSTATUS Status - ); - - #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) - #if !defined(_IKsControl_) - #define _IKsControl_ - - typedef interface IKsControl* PIKSCONTROL; - - #if !defined(DEFINE_ABSTRACT_UNKNOWN) - - #define DEFINE_ABSTRACT_UNKNOWN() \ - STDMETHOD_(NTSTATUS, QueryInterface)(THIS_ \ - REFIID InterfaceId, \ - PVOID* Interface \ - ) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; - - #endif //!defined(DEFINE_ABSTRACT_UNKNOWN) - - #undef INTERFACE - #define INTERFACE IKsControl - DECLARE_INTERFACE_(IKsControl,IUnknown) - { - DEFINE_ABSTRACT_UNKNOWN() // For C - - STDMETHOD_(NTSTATUS, KsProperty)(THIS_ - IN PKSPROPERTY Property, - IN ULONG PropertyLength, - IN OUT PVOID PropertyData, - IN ULONG DataLength, - OUT ULONG* BytesReturned - ) PURE; - STDMETHOD_(NTSTATUS, KsMethod)(THIS_ - IN PKSMETHOD Method, - IN ULONG MethodLength, - IN OUT PVOID MethodData, - IN ULONG DataLength, - OUT ULONG* BytesReturned - ) PURE; - STDMETHOD_(NTSTATUS, KsEvent)(THIS_ - IN PKSEVENT Event OPTIONAL, - IN ULONG EventLength, - IN OUT PVOID EventData, - IN ULONG DataLength, - OUT ULONG* BytesReturned - ) PURE; - }; - - typedef interface IKsReferenceClock* PIKSREFERENCECLOCK; - - #undef INTERFACE - #define INTERFACE IKsReferenceClock - DECLARE_INTERFACE_(IKsReferenceClock,IUnknown) - { - DEFINE_ABSTRACT_UNKNOWN() // For C - - STDMETHOD_(LONGLONG,GetTime)(THIS - ) PURE; - STDMETHOD_(LONGLONG,GetPhysicalTime)(THIS - ) PURE; - STDMETHOD_(LONGLONG,GetCorrelatedTime)(THIS_ - OUT PLONGLONG SystemTime - ) PURE; - STDMETHOD_(LONGLONG,GetCorrelatedPhysicalTime)(THIS_ - OUT PLONGLONG SystemTime - ) PURE; - STDMETHOD_(NTSTATUS, GetResolution)(THIS_ - OUT PKSRESOLUTION Resolution - ) PURE; - STDMETHOD_(NTSTATUS, GetState)(THIS_ - OUT PKSSTATE State - ) PURE; - }; - #undef INTERFACE - - #define STATIC_IID_IKsControl \ - 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUID(IID_IKsControl, - 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96); - #if defined(__cplusplus) && _MSC_VER >= 1100 - struct __declspec(uuid("28F54685-06FD-11D2-B27A-00A0C9223196")) IKsControl; - #endif - - #define STATIC_IID_IKsFastClock \ - 0xc9902485, 0xc180, 0x11d2, 0x84, 0x73, 0xd4, 0x23, 0x94, 0x45, 0x9e, 0x5e - DEFINE_GUID(IID_IKsFastClock, - 0xc9902485, 0xc180, 0x11d2, 0x84, 0x73, 0xd4, 0x23, 0x94, 0x45, 0x9e, 0x5e); - #if defined(__cplusplus) && _MSC_VER >= 1100 - struct __declspec(uuid("C9902485-C180-11d2-8473-D42394459E5E")) IKsFastClock; - #endif - - #endif // !defined(_IKsControl_) - #endif // defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) - - #endif // defined(_NTDDK_) - - //=========================================================================== - - #if defined(__cplusplus) - extern "C" { - #endif // defined(__cplusplus) - - // - // exported prototypes - // - - #ifdef _KSDDK_ - #define KSDDKAPI - #else // !_KSDDK_ - #define KSDDKAPI DECLSPEC_IMPORT - #endif // _KSDDK_ - - #if defined(_NTDDK_) - - KSDDKAPI - NTSTATUS - NTAPI - KsEnableEvent( - IN PIRP Irp, - IN ULONG EventSetsCount, - IN const KSEVENT_SET* EventSet, - IN OUT PLIST_ENTRY EventsList OPTIONAL, - IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL, - IN PVOID EventsLock OPTIONAL - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsEnableEventWithAllocator( - IN PIRP Irp, - IN ULONG EventSetsCount, - IN const KSEVENT_SET* EventSet, - IN OUT PLIST_ENTRY EventsList OPTIONAL, - IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL, - IN PVOID EventsLock OPTIONAL, - IN PFNKSALLOCATOR Allocator OPTIONAL, - IN ULONG EventItemSize OPTIONAL - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsDisableEvent( - IN PIRP Irp, - IN OUT PLIST_ENTRY EventsList, - IN KSEVENTS_LOCKTYPE EventsFlags, - IN PVOID EventsLock - ); - - KSDDKAPI - VOID - NTAPI - KsDiscardEvent( - IN PKSEVENT_ENTRY EventEntry - ); - - KSDDKAPI - VOID - NTAPI - KsFreeEventList( - IN PFILE_OBJECT FileObject, - IN OUT PLIST_ENTRY EventsList, - IN KSEVENTS_LOCKTYPE EventsFlags, - IN PVOID EventsLock - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsGenerateEvent( - IN PKSEVENT_ENTRY EventEntry - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsGenerateDataEvent( - IN PKSEVENT_ENTRY EventEntry, - IN ULONG DataSize, - IN PVOID Data - ); - - KSDDKAPI - VOID - NTAPI - KsGenerateEventList( - IN GUID* Set OPTIONAL, - IN ULONG EventId, - IN PLIST_ENTRY EventsList, - IN KSEVENTS_LOCKTYPE EventsFlags, - IN PVOID EventsLock - ); - - // property.c: - - KSDDKAPI - NTSTATUS - NTAPI - KsPropertyHandler( - IN PIRP Irp, - IN ULONG PropertySetsCount, - IN const KSPROPERTY_SET* PropertySet - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsPropertyHandlerWithAllocator( - IN PIRP Irp, - IN ULONG PropertySetsCount, - IN const KSPROPERTY_SET* PropertySet, - IN PFNKSALLOCATOR Allocator OPTIONAL, - IN ULONG PropertyItemSize OPTIONAL - ); - - KSDDKAPI - BOOLEAN - NTAPI - KsFastPropertyHandler( - IN PFILE_OBJECT FileObject, - IN PKSPROPERTY UNALIGNED Property, - IN ULONG PropertyLength, - IN OUT PVOID UNALIGNED Data, - IN ULONG DataLength, - OUT PIO_STATUS_BLOCK IoStatus, - IN ULONG PropertySetsCount, - IN const KSPROPERTY_SET* PropertySet - ); - - // method.c: - - KSDDKAPI - NTSTATUS - NTAPI - KsMethodHandler( - IN PIRP Irp, - IN ULONG MethodSetsCount, - IN const KSMETHOD_SET* MethodSet - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsMethodHandlerWithAllocator( - IN PIRP Irp, - IN ULONG MethodSetsCount, - IN const KSMETHOD_SET* MethodSet, - IN PFNKSALLOCATOR Allocator OPTIONAL, - IN ULONG MethodItemSize OPTIONAL - ); - - KSDDKAPI - BOOLEAN - NTAPI - KsFastMethodHandler( - IN PFILE_OBJECT FileObject, - IN PKSMETHOD UNALIGNED Method, - IN ULONG MethodLength, - IN OUT PVOID UNALIGNED Data, - IN ULONG DataLength, - OUT PIO_STATUS_BLOCK IoStatus, - IN ULONG MethodSetsCount, - IN const KSMETHOD_SET* MethodSet - ); - - // alloc.c: - - KSDDKAPI - NTSTATUS - NTAPI - KsCreateDefaultAllocator( - IN PIRP Irp - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsCreateDefaultAllocatorEx( - IN PIRP Irp, - IN PVOID InitializeContext OPTIONAL, - IN PFNKSDEFAULTALLOCATE DefaultAllocate OPTIONAL, - IN PFNKSDEFAULTFREE DefaultFree OPTIONAL, - IN PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL, - IN PFNKSDELETEALLOCATOR DeleteAllocator OPTIONAL - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsCreateAllocator( - IN HANDLE ConnectionHandle, - IN PKSALLOCATOR_FRAMING AllocatorFraming, - OUT PHANDLE AllocatorHandle - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsValidateAllocatorCreateRequest( - IN PIRP Irp, - OUT PKSALLOCATOR_FRAMING* AllocatorFraming - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsValidateAllocatorFramingEx( - IN PKSALLOCATOR_FRAMING_EX Framing, - IN ULONG BufferSize, - IN const KSALLOCATOR_FRAMING_EX *PinFraming - ); - - // clock.c: - - KSDDKAPI - NTSTATUS - NTAPI - KsAllocateDefaultClock( - OUT PKSDEFAULTCLOCK* DefaultClock - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsAllocateDefaultClockEx( - OUT PKSDEFAULTCLOCK* DefaultClock, - IN PVOID Context OPTIONAL, - IN PFNKSSETTIMER SetTimer OPTIONAL, - IN PFNKSCANCELTIMER CancelTimer OPTIONAL, - IN PFNKSCORRELATEDTIME CorrelatedTime OPTIONAL, - IN const KSRESOLUTION* Resolution OPTIONAL, - IN ULONG Flags - ); - - KSDDKAPI - VOID - NTAPI - KsFreeDefaultClock( - IN PKSDEFAULTCLOCK DefaultClock - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsCreateDefaultClock( - IN PIRP Irp, - IN PKSDEFAULTCLOCK DefaultClock - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsCreateClock( - IN HANDLE ConnectionHandle, - IN PKSCLOCK_CREATE ClockCreate, - OUT PHANDLE ClockHandle - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsValidateClockCreateRequest( - IN PIRP Irp, - OUT PKSCLOCK_CREATE* ClockCreate - ); - - KSDDKAPI - KSSTATE - NTAPI - KsGetDefaultClockState( - IN PKSDEFAULTCLOCK DefaultClock - ); - - KSDDKAPI - VOID - NTAPI - KsSetDefaultClockState( - IN PKSDEFAULTCLOCK DefaultClock, - IN KSSTATE State - ); - - KSDDKAPI - LONGLONG - NTAPI - KsGetDefaultClockTime( - IN PKSDEFAULTCLOCK DefaultClock - ); - - KSDDKAPI - VOID - NTAPI - KsSetDefaultClockTime( - IN PKSDEFAULTCLOCK DefaultClock, - IN LONGLONG Time - ); - - // connect.c: - - KSDDKAPI - NTSTATUS - NTAPI - KsCreatePin( - IN HANDLE FilterHandle, - IN PKSPIN_CONNECT Connect, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE ConnectionHandle - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsValidateConnectRequest( - IN PIRP Irp, - IN ULONG DescriptorsCount, - IN const KSPIN_DESCRIPTOR* Descriptor, - OUT PKSPIN_CONNECT* Connect - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsPinPropertyHandler( - IN PIRP Irp, - IN PKSPROPERTY Property, - IN OUT PVOID Data, - IN ULONG DescriptorsCount, - IN const KSPIN_DESCRIPTOR* Descriptor - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsPinDataIntersection( - IN PIRP Irp, - IN PKSP_PIN Pin, - OUT PVOID Data OPTIONAL, - IN ULONG DescriptorsCount, - IN const KSPIN_DESCRIPTOR* Descriptor, - IN PFNKSINTERSECTHANDLER IntersectHandler - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsPinDataIntersectionEx( - IN PIRP Irp, - IN PKSP_PIN Pin, - OUT PVOID Data, - IN ULONG DescriptorsCount, - IN const KSPIN_DESCRIPTOR* Descriptor, - IN ULONG DescriptorSize, - IN PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL, - IN PVOID HandlerContext OPTIONAL - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsHandleSizedListQuery( - IN PIRP Irp, - IN ULONG DataItemsCount, - IN ULONG DataItemSize, - IN const VOID* DataItems - ); - - // image.c: - - #if (!defined( MAKEINTRESOURCE )) - #define MAKEINTRESOURCE( res ) ((ULONG_PTR) (USHORT) res) - #endif - - #if (!defined( RT_STRING )) - #define RT_STRING MAKEINTRESOURCE( 6 ) - #define RT_RCDATA MAKEINTRESOURCE( 10 ) - #endif - - KSDDKAPI - NTSTATUS - NTAPI - KsLoadResource( - IN PVOID ImageBase, - IN POOL_TYPE PoolType, - IN ULONG_PTR ResourceName, - IN ULONG ResourceType, - OUT PVOID *Resource, - OUT PULONG ResourceSize - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsGetImageNameAndResourceId( - IN HANDLE RegKey, - OUT PUNICODE_STRING ImageName, - OUT PULONG_PTR ResourceId, - OUT PULONG ValueType - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsMapModuleName( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PUNICODE_STRING ModuleName, - OUT PUNICODE_STRING ImageName, - OUT PULONG_PTR ResourceId, - OUT PULONG ValueType - ); - - // irp.c: - - KSDDKAPI - NTSTATUS - NTAPI - KsReferenceBusObject( - IN KSDEVICE_HEADER Header - ); - - KSDDKAPI - VOID - NTAPI - KsDereferenceBusObject( - IN KSDEVICE_HEADER Header - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsDispatchQuerySecurity( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsDispatchSetSecurity( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsDispatchSpecificProperty( - IN PIRP Irp, - IN PFNKSHANDLER Handler - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsDispatchSpecificMethod( - IN PIRP Irp, - IN PFNKSHANDLER Handler - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsReadFile( - IN PFILE_OBJECT FileObject, - IN PKEVENT Event OPTIONAL, - IN PVOID PortContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length, - IN ULONG Key OPTIONAL, - IN KPROCESSOR_MODE RequestorMode - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsWriteFile( - IN PFILE_OBJECT FileObject, - IN PKEVENT Event OPTIONAL, - IN PVOID PortContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID Buffer, - IN ULONG Length, - IN ULONG Key OPTIONAL, - IN KPROCESSOR_MODE RequestorMode - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsQueryInformationFile( - IN PFILE_OBJECT FileObject, - OUT PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsSetInformationFile( - IN PFILE_OBJECT FileObject, - IN PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsStreamIo( - IN PFILE_OBJECT FileObject, - IN PKEVENT Event OPTIONAL, - IN PVOID PortContext OPTIONAL, - IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL, - IN PVOID CompletionContext OPTIONAL, - IN KSCOMPLETION_INVOCATION CompletionInvocationFlags OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN OUT PVOID StreamHeaders, - IN ULONG Length, - IN ULONG Flags, - IN KPROCESSOR_MODE RequestorMode - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsProbeStreamIrp( - IN OUT PIRP Irp, - IN ULONG ProbeFlags, - IN ULONG HeaderSize OPTIONAL - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsAllocateExtraData( - IN OUT PIRP Irp, - IN ULONG ExtraSize, - OUT PVOID* ExtraBuffer - ); - - KSDDKAPI - VOID - NTAPI - KsNullDriverUnload( - IN PDRIVER_OBJECT DriverObject - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsSetMajorFunctionHandler( - IN PDRIVER_OBJECT DriverObject, - IN ULONG MajorFunction - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsDispatchInvalidDeviceRequest( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsDefaultDeviceIoCompletion( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsDispatchIrp( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - - KSDDKAPI - BOOLEAN - NTAPI - KsDispatchFastIoDeviceControlFailure( - IN PFILE_OBJECT FileObject, - IN BOOLEAN Wait, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength, - IN ULONG IoControlCode, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject - ); - - KSDDKAPI - BOOLEAN - NTAPI - KsDispatchFastReadFailure( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject - ); - - #define KsDispatchFastWriteFailure KsDispatchFastReadFailure - - KSDDKAPI - VOID - NTAPI - KsCancelRoutine( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - - KSDDKAPI - VOID - NTAPI - KsCancelIo( - IN OUT PLIST_ENTRY QueueHead, - IN PKSPIN_LOCK SpinLock - ); - - KSDDKAPI - VOID - NTAPI - KsReleaseIrpOnCancelableQueue( - IN PIRP Irp, - IN PDRIVER_CANCEL DriverCancel OPTIONAL - ); - - KSDDKAPI - PIRP - NTAPI - KsRemoveIrpFromCancelableQueue( - IN OUT PLIST_ENTRY QueueHead, - IN PKSPIN_LOCK SpinLock, - IN KSLIST_ENTRY_LOCATION ListLocation, - IN KSIRP_REMOVAL_OPERATION RemovalOperation - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsMoveIrpsOnCancelableQueue( - IN OUT PLIST_ENTRY SourceList, - IN PKSPIN_LOCK SourceLock, - IN OUT PLIST_ENTRY DestinationList, - IN PKSPIN_LOCK DestinationLock OPTIONAL, - IN KSLIST_ENTRY_LOCATION ListLocation, - IN PFNKSIRPLISTCALLBACK ListCallback, - IN PVOID Context - ); - - KSDDKAPI - VOID - NTAPI - KsRemoveSpecificIrpFromCancelableQueue( - IN PIRP Irp - ); - - KSDDKAPI - VOID - NTAPI - KsAddIrpToCancelableQueue( - IN OUT PLIST_ENTRY QueueHead, - IN PKSPIN_LOCK SpinLock, - IN PIRP Irp, - IN KSLIST_ENTRY_LOCATION ListLocation, - IN PDRIVER_CANCEL DriverCancel OPTIONAL - ); - - // api.c: - - KSDDKAPI - NTSTATUS - NTAPI - KsAcquireResetValue( - IN PIRP Irp, - OUT KSRESET* ResetValue - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsTopologyPropertyHandler( - IN PIRP Irp, - IN PKSPROPERTY Property, - IN OUT PVOID Data, - IN const KSTOPOLOGY* Topology - ); - - KSDDKAPI - VOID - NTAPI - KsAcquireDeviceSecurityLock( - IN KSDEVICE_HEADER Header, - IN BOOLEAN Exclusive - ); - - KSDDKAPI - VOID - NTAPI - KsReleaseDeviceSecurityLock( - IN KSDEVICE_HEADER Header - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsDefaultDispatchPnp( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsDefaultDispatchPower( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsDefaultForwardIrp( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp - ); - - KSDDKAPI - VOID - NTAPI - KsSetDevicePnpAndBaseObject( - IN KSDEVICE_HEADER Header, - IN PDEVICE_OBJECT PnpDeviceObject, - IN PDEVICE_OBJECT BaseObject - ); - - KSDDKAPI - PDEVICE_OBJECT - NTAPI - KsQueryDevicePnpObject( - IN KSDEVICE_HEADER Header - ); - - KSDDKAPI - ACCESS_MASK - NTAPI - KsQueryObjectAccessMask( - IN KSOBJECT_HEADER Header - ); - - KSDDKAPI - VOID - NTAPI - KsRecalculateStackDepth( - IN KSDEVICE_HEADER Header, - IN BOOLEAN ReuseStackLocation - ); - - KSDDKAPI - VOID - NTAPI - KsSetTargetState( - IN KSOBJECT_HEADER Header, - IN KSTARGET_STATE TargetState - ); - - KSDDKAPI - VOID - NTAPI - KsSetTargetDeviceObject( - IN KSOBJECT_HEADER Header, - IN PDEVICE_OBJECT TargetDevice OPTIONAL - ); - - KSDDKAPI - VOID - NTAPI - KsSetPowerDispatch( - IN KSOBJECT_HEADER Header, - IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL, - IN PVOID PowerContext OPTIONAL - ); - - KSDDKAPI - PKSOBJECT_CREATE_ITEM - NTAPI - KsQueryObjectCreateItem( - IN KSOBJECT_HEADER Header - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsAllocateDeviceHeader( - OUT KSDEVICE_HEADER* Header, - IN ULONG ItemsCount, - IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL - ); - - KSDDKAPI - VOID - NTAPI - KsFreeDeviceHeader( - IN KSDEVICE_HEADER Header - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsAllocateObjectHeader( - OUT KSOBJECT_HEADER* Header, - IN ULONG ItemsCount, - IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL, - IN PIRP Irp, - IN const KSDISPATCH_TABLE* Table - ); - - KSDDKAPI - VOID - NTAPI - KsFreeObjectHeader( - IN KSOBJECT_HEADER Header - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsAddObjectCreateItemToDeviceHeader( - IN KSDEVICE_HEADER Header, - IN PDRIVER_DISPATCH Create, - IN PVOID Context, - IN PWCHAR ObjectClass, - IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsAddObjectCreateItemToObjectHeader( - IN KSOBJECT_HEADER Header, - IN PDRIVER_DISPATCH Create, - IN PVOID Context, - IN PWCHAR ObjectClass, - IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsAllocateObjectCreateItem( - IN KSDEVICE_HEADER Header, - IN PKSOBJECT_CREATE_ITEM CreateItem, - IN BOOLEAN AllocateEntry, - IN PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsFreeObjectCreateItem( - IN KSDEVICE_HEADER Header, - IN PUNICODE_STRING CreateItem - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsFreeObjectCreateItemsByContext( - IN KSDEVICE_HEADER Header, - IN PVOID Context - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsCreateDefaultSecurity( - IN PSECURITY_DESCRIPTOR ParentSecurity OPTIONAL, - OUT PSECURITY_DESCRIPTOR* DefaultSecurity - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsForwardIrp( - IN PIRP Irp, - IN PFILE_OBJECT FileObject, - IN BOOLEAN ReuseStackLocation - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsForwardAndCatchIrp( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PFILE_OBJECT FileObject, - IN KSSTACK_USE StackUse - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsSynchronousIoControlDevice( - IN PFILE_OBJECT FileObject, - IN KPROCESSOR_MODE RequestorMode, - IN ULONG IoControl, - IN PVOID InBuffer, - IN ULONG InSize, - OUT PVOID OutBuffer, - IN ULONG OutSize, - OUT PULONG BytesReturned - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsUnserializeObjectPropertiesFromRegistry( - IN PFILE_OBJECT FileObject, - IN HANDLE ParentKey OPTIONAL, - IN PUNICODE_STRING RegistryPath OPTIONAL - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsCacheMedium( - IN PUNICODE_STRING SymbolicLink, - IN PKSPIN_MEDIUM Medium, - IN ULONG PinDirection - ); - - // thread.c: - - KSDDKAPI - NTSTATUS - NTAPI - KsRegisterWorker( - IN WORK_QUEUE_TYPE WorkQueueType, - OUT PKSWORKER* Worker - ); - KSDDKAPI - NTSTATUS - NTAPI - KsRegisterCountedWorker( - IN WORK_QUEUE_TYPE WorkQueueType, - IN PWORK_QUEUE_ITEM CountedWorkItem, - OUT PKSWORKER* Worker - ); - KSDDKAPI - VOID - NTAPI - KsUnregisterWorker( - IN PKSWORKER Worker - ); - KSDDKAPI - NTSTATUS - NTAPI - KsQueueWorkItem( - IN PKSWORKER Worker, - IN PWORK_QUEUE_ITEM WorkItem - ); - KSDDKAPI - ULONG - NTAPI - KsIncrementCountedWorker( - IN PKSWORKER Worker - ); - KSDDKAPI - ULONG - NTAPI - KsDecrementCountedWorker( - IN PKSWORKER Worker - ); - - // topology.c: - - KSDDKAPI - NTSTATUS - NTAPI - KsCreateTopologyNode( - IN HANDLE ParentHandle, - IN PKSNODE_CREATE NodeCreate, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE NodeHandle - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsValidateTopologyNodeCreateRequest( - IN PIRP Irp, - IN PKSTOPOLOGY Topology, - OUT PKSNODE_CREATE* NodeCreate - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsMergeAutomationTables( - OUT PKSAUTOMATION_TABLE* AutomationTableAB, - IN PKSAUTOMATION_TABLE AutomationTableA OPTIONAL, - IN PKSAUTOMATION_TABLE AutomationTableB OPTIONAL, - IN KSOBJECT_BAG Bag OPTIONAL - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsInitializeDriver( - IN PDRIVER_OBJECT DriverObject, - IN PUNICODE_STRING RegistryPathName, - IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsAddDevice( - IN PDRIVER_OBJECT DriverObject, - IN PDEVICE_OBJECT PhysicalDeviceObject - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsCreateDevice( - IN PDRIVER_OBJECT DriverObject, - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL, - IN ULONG ExtensionSize OPTIONAL, - OUT PKSDEVICE* Device OPTIONAL - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsInitializeDevice( - IN PDEVICE_OBJECT FunctionalDeviceObject, - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PDEVICE_OBJECT NextDeviceObject, - IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL - ); - - KSDDKAPI - void - NTAPI - KsTerminateDevice( - IN PDEVICE_OBJECT DeviceObject - ); - - KSDDKAPI - PKSDEVICE - NTAPI - KsGetDeviceForDeviceObject( - IN PDEVICE_OBJECT FunctionalDeviceObject - ); - - KSDDKAPI - void - NTAPI - KsAcquireDevice( - IN PKSDEVICE Device - ); - - KSDDKAPI - void - NTAPI - KsReleaseDevice( - IN PKSDEVICE Device - ); - - KSDDKAPI - void - NTAPI - KsDeviceRegisterAdapterObject( - IN PKSDEVICE Device, - IN PADAPTER_OBJECT AdapterObject, - IN ULONG MaxMappingsByteCount, - IN ULONG MappingTableStride - ); - - KSDDKAPI - ULONG - NTAPI - KsDeviceGetBusData( - IN PKSDEVICE Device, - IN ULONG DataType, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length - ); - - KSDDKAPI - ULONG - NTAPI - KsDeviceSetBusData( - IN PKSDEVICE Device, - IN ULONG DataType, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsCreateFilterFactory( - IN PDEVICE_OBJECT DeviceObject, - IN const KSFILTER_DESCRIPTOR* Descriptor, - IN PWCHAR RefString OPTIONAL, - IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL, - IN ULONG CreateItemFlags, - IN PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL, - IN PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL, - OUT PKSFILTERFACTORY* FilterFactory OPTIONAL - ); - - #define KsDeleteFilterFactory(FilterFactory) \ - KsFreeObjectCreateItemsByContext(\ - *(KSDEVICE_HEADER *)(\ - KsFilterFactoryGetParentDevice(FilterFactory)->FunctionalDeviceObject->\ - DeviceExtension),\ - FilterFactory) - - KSDDKAPI - NTSTATUS - NTAPI - KsFilterFactoryAddCreateItem( - IN PKSFILTERFACTORY FilterFactory, - IN PWCHAR RefString, - IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL, - IN ULONG CreateItemFlags - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsFilterFactorySetDeviceClassesState( - IN PKSFILTERFACTORY FilterFactory, - IN BOOLEAN NewState - ); - - KSDDKAPI - PUNICODE_STRING - NTAPI - KsFilterFactoryGetSymbolicLink( - IN PKSFILTERFACTORY FilterFactory - ); - - KSDDKAPI - void - NTAPI - KsAddEvent( - IN PVOID Object, - IN PKSEVENT_ENTRY EventEntry - ); - - void _inline - KsFilterAddEvent( - IN PKSFILTER Filter, - IN PKSEVENT_ENTRY EventEntry - ) - { - KsAddEvent(Filter,EventEntry); - } - - void _inline - KsPinAddEvent( - IN PKSPIN Pin, - IN PKSEVENT_ENTRY EventEntry - ) - { - KsAddEvent(Pin,EventEntry); - } - - KSDDKAPI - NTSTATUS - NTAPI - KsDefaultAddEventHandler( - IN PIRP Irp, - IN PKSEVENTDATA EventData, - IN OUT PKSEVENT_ENTRY EventEntry - ); - - KSDDKAPI - void - NTAPI - KsGenerateEvents( - IN PVOID Object, - IN const GUID* EventSet OPTIONAL, - IN ULONG EventId, - IN ULONG DataSize, - IN PVOID Data OPTIONAL, - IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL, - IN PVOID CallBackContext OPTIONAL - ); - - void _inline - KsFilterGenerateEvents( - IN PKSFILTER Filter, - IN const GUID* EventSet OPTIONAL, - IN ULONG EventId, - IN ULONG DataSize, - IN PVOID Data OPTIONAL, - IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL, - IN PVOID CallBackContext OPTIONAL - ) - { - KsGenerateEvents( - Filter, - EventSet, - EventId, - DataSize, - Data, - CallBack, - CallBackContext); - } - - void _inline - KsPinGenerateEvents( - IN PKSPIN Pin, - IN const GUID* EventSet OPTIONAL, - IN ULONG EventId, - IN ULONG DataSize, - IN PVOID Data OPTIONAL, - IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL, - IN PVOID CallBackContext OPTIONAL - ) - { - KsGenerateEvents( - Pin, - EventSet, - EventId, - DataSize, - Data, - CallBack, - CallBackContext); - } - - typedef enum { - KSSTREAM_POINTER_STATE_UNLOCKED = 0, - KSSTREAM_POINTER_STATE_LOCKED - } KSSTREAM_POINTER_STATE; - - KSDDKAPI - NTSTATUS - NTAPI - KsPinGetAvailableByteCount( - IN PKSPIN Pin, - OUT PLONG InputDataBytes OPTIONAL, - OUT PLONG OutputBufferBytes OPTIONAL - ); - - KSDDKAPI - PKSSTREAM_POINTER - NTAPI - KsPinGetLeadingEdgeStreamPointer( - IN PKSPIN Pin, - IN KSSTREAM_POINTER_STATE State - ); - - KSDDKAPI - PKSSTREAM_POINTER - NTAPI - KsPinGetTrailingEdgeStreamPointer( - IN PKSPIN Pin, - IN KSSTREAM_POINTER_STATE State - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsStreamPointerLock( - IN PKSSTREAM_POINTER StreamPointer - ); - - KSDDKAPI - void - NTAPI - KsStreamPointerUnlock( - IN PKSSTREAM_POINTER StreamPointer, - IN BOOLEAN Eject - ); - - KSDDKAPI - void - NTAPI - KsStreamPointerAdvanceOffsetsAndUnlock( - IN PKSSTREAM_POINTER StreamPointer, - IN ULONG InUsed, - IN ULONG OutUsed, - IN BOOLEAN Eject - ); - - KSDDKAPI - void - NTAPI - KsStreamPointerDelete( - IN PKSSTREAM_POINTER StreamPointer - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsStreamPointerClone( - IN PKSSTREAM_POINTER StreamPointer, - IN PFNKSSTREAMPOINTER CancelCallback OPTIONAL, - IN ULONG ContextSize, - OUT PKSSTREAM_POINTER* CloneStreamPointer - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsStreamPointerAdvanceOffsets( - IN PKSSTREAM_POINTER StreamPointer, - IN ULONG InUsed, - IN ULONG OutUsed, - IN BOOLEAN Eject - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsStreamPointerAdvance( - IN PKSSTREAM_POINTER StreamPointer - ); - - KSDDKAPI - PMDL - NTAPI - KsStreamPointerGetMdl( - IN PKSSTREAM_POINTER StreamPointer - ); - - KSDDKAPI - PIRP - NTAPI - KsStreamPointerGetIrp( - IN PKSSTREAM_POINTER StreamPointer, - OUT PBOOLEAN FirstFrameInIrp OPTIONAL, - OUT PBOOLEAN LastFrameInIrp OPTIONAL - ); - - KSDDKAPI - void - NTAPI - KsStreamPointerScheduleTimeout( - IN PKSSTREAM_POINTER StreamPointer, - IN PFNKSSTREAMPOINTER Callback, - IN ULONGLONG Interval - ); - - KSDDKAPI - void - NTAPI - KsStreamPointerCancelTimeout( - IN PKSSTREAM_POINTER StreamPointer - ); - - KSDDKAPI - PKSSTREAM_POINTER - NTAPI - KsPinGetFirstCloneStreamPointer( - IN PKSPIN Pin - ); - - KSDDKAPI - PKSSTREAM_POINTER - NTAPI - KsStreamPointerGetNextClone( - IN PKSSTREAM_POINTER StreamPointer - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsPinHandshake( - IN PKSPIN Pin, - IN PKSHANDSHAKE In, - OUT PKSHANDSHAKE Out - ); - - KSDDKAPI - void - NTAPI - KsCompletePendingRequest( - IN PIRP Irp - ); - - KSDDKAPI - KSOBJECTTYPE - NTAPI - KsGetObjectTypeFromIrp( - IN PIRP Irp - ); - - KSDDKAPI - PVOID - NTAPI - KsGetObjectFromFileObject( - IN PFILE_OBJECT FileObject - ); - - KSDDKAPI - KSOBJECTTYPE - NTAPI - KsGetObjectTypeFromFileObject( - IN PFILE_OBJECT FileObject - ); - - PKSFILTER __inline - KsGetFilterFromFileObject( - IN PFILE_OBJECT FileObject - ) - { - return (PKSFILTER) KsGetObjectFromFileObject(FileObject); - } - - PKSPIN __inline - KsGetPinFromFileObject( - IN PFILE_OBJECT FileObject - ) - { - return (PKSPIN) KsGetObjectFromFileObject(FileObject); - } - - KSDDKAPI - PKSGATE - NTAPI - KsFilterGetAndGate( - IN PKSFILTER Filter - ); - - KSDDKAPI - void - NTAPI - KsFilterAcquireProcessingMutex( - IN PKSFILTER Filter - ); - - KSDDKAPI - void - NTAPI - KsFilterReleaseProcessingMutex( - IN PKSFILTER Filter - ); - - KSDDKAPI - void - NTAPI - KsFilterAttemptProcessing( - IN PKSFILTER Filter, - IN BOOLEAN Asynchronous - ); - - KSDDKAPI - PKSGATE - NTAPI - KsPinGetAndGate( - IN PKSPIN Pin - ); - - KSDDKAPI - void - NTAPI - KsPinAttachAndGate( - IN PKSPIN Pin, - IN PKSGATE AndGate OPTIONAL - ); - - KSDDKAPI - void - NTAPI - KsPinAttachOrGate( - IN PKSPIN Pin, - IN PKSGATE OrGate OPTIONAL - ); - - KSDDKAPI - void - NTAPI - KsPinAcquireProcessingMutex( - IN PKSPIN Pin - ); - - KSDDKAPI - void - NTAPI - KsPinReleaseProcessingMutex( - IN PKSPIN Pin - ); - - KSDDKAPI - BOOLEAN - NTAPI - KsProcessPinUpdate( - IN PKSPROCESSPIN ProcessPin - ); - - KSDDKAPI - void - NTAPI - KsPinAttemptProcessing( - IN PKSPIN Pin, - IN BOOLEAN Asynchronous - ); - - KSDDKAPI - PVOID - NTAPI - KsGetParent( - IN PVOID Object - ); - - PKSDEVICE __inline - KsFilterFactoryGetParentDevice( - IN PKSFILTERFACTORY FilterFactory - ) - { - return (PKSDEVICE) KsGetParent((PVOID) FilterFactory); - } - - PKSFILTERFACTORY __inline - KsFilterGetParentFilterFactory( - IN PKSFILTER Filter - ) - { - return (PKSFILTERFACTORY) KsGetParent((PVOID) Filter); - } - - KSDDKAPI - PKSFILTER - NTAPI - KsPinGetParentFilter( - IN PKSPIN Pin - ); - - KSDDKAPI - PVOID - NTAPI - KsGetFirstChild( - IN PVOID Object - ); - - PKSFILTERFACTORY __inline - KsDeviceGetFirstChildFilterFactory( - IN PKSDEVICE Device - ) - { - return (PKSFILTERFACTORY) KsGetFirstChild((PVOID) Device); - } - - PKSFILTER __inline - KsFilterFactoryGetFirstChildFilter( - IN PKSFILTERFACTORY FilterFactory - ) - { - return (PKSFILTER) KsGetFirstChild((PVOID) FilterFactory); - } - - KSDDKAPI - ULONG - NTAPI - KsFilterGetChildPinCount( - IN PKSFILTER Filter, - IN ULONG PinId - ); - - KSDDKAPI - PKSPIN - NTAPI - KsFilterGetFirstChildPin( - IN PKSFILTER Filter, - IN ULONG PinId - ); - - KSDDKAPI - PVOID - NTAPI - KsGetNextSibling( - IN PVOID Object - ); - - KSDDKAPI - PKSPIN - NTAPI - KsPinGetNextSiblingPin( - IN PKSPIN Pin - ); - - PKSFILTERFACTORY __inline - KsFilterFactoryGetNextSiblingFilterFactory( - IN PKSFILTERFACTORY FilterFactory - ) - { - return (PKSFILTERFACTORY) KsGetNextSibling((PVOID) FilterFactory); - } - - PKSFILTER __inline - KsFilterGetNextSiblingFilter( - IN PKSFILTER Filter - ) - { - return (PKSFILTER) KsGetNextSibling((PVOID) Filter); - } - - - KSDDKAPI - PKSDEVICE - NTAPI - KsGetDevice( - IN PVOID Object - ); - - PKSDEVICE __inline - KsFilterFactoryGetDevice( - IN PKSFILTERFACTORY FilterFactory - ) - { - return KsGetDevice((PVOID) FilterFactory); - } - - PKSDEVICE __inline - KsFilterGetDevice( - IN PKSFILTER Filter - ) - { - return KsGetDevice((PVOID) Filter); - } - - PKSDEVICE __inline - KsPinGetDevice( - IN PKSPIN Pin - ) - { - return KsGetDevice((PVOID) Pin); - } - - KSDDKAPI - PKSFILTER - NTAPI - KsGetFilterFromIrp( - IN PIRP Irp - ); - - KSDDKAPI - PKSPIN - NTAPI - KsGetPinFromIrp( - IN PIRP Irp - ); - - KSDDKAPI - ULONG - NTAPI - KsGetNodeIdFromIrp( - IN PIRP Irp - ); - - KSDDKAPI - void - NTAPI - KsAcquireControl( - IN PVOID Object - ); - - KSDDKAPI - void - NTAPI - KsReleaseControl( - IN PVOID Object - ); - - void __inline - KsFilterAcquireControl( - IN PKSFILTER Filter - ) - { - KsAcquireControl((PVOID) Filter); - } - - void __inline - KsFilterReleaseControl( - IN PKSFILTER Filter - ) - { - KsReleaseControl((PVOID) Filter); - } - - void __inline - KsPinAcquireControl( - IN PKSPIN Pin - ) - { - KsAcquireControl((PVOID) Pin); - } - - void __inline - KsPinReleaseControl( - IN PKSPIN Pin - ) - { - KsReleaseControl((PVOID) Pin); - } - - KSDDKAPI - NTSTATUS - NTAPI - KsAddItemToObjectBag( - IN KSOBJECT_BAG ObjectBag, - IN PVOID Item, - IN PFNKSFREE Free OPTIONAL - ); - - KSDDKAPI - ULONG - NTAPI - KsRemoveItemFromObjectBag( - IN KSOBJECT_BAG ObjectBag, - IN PVOID Item, - IN BOOLEAN Free - ); - - #define KsDiscard(Object,Pointer)\ - KsRemoveItemFromObjectBag(\ - (Object)->Bag,\ - (PVOID)(Pointer),\ - TRUE) - - KSDDKAPI - NTSTATUS - NTAPI - KsAllocateObjectBag( - IN PKSDEVICE Device, - OUT KSOBJECT_BAG* ObjectBag - ); - - KSDDKAPI - void - NTAPI - KsFreeObjectBag( - IN KSOBJECT_BAG ObjectBag - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsCopyObjectBagItems( - IN KSOBJECT_BAG ObjectBagDestination, - IN KSOBJECT_BAG ObjectBagSource - ); - - KSDDKAPI - NTSTATUS - NTAPI - _KsEdit( - IN KSOBJECT_BAG ObjectBag, - IN OUT PVOID* PointerToPointerToItem, - IN ULONG NewSize, - IN ULONG OldSize, - IN ULONG Tag - ); - - #define KsEdit(Object,PointerToPointer,Tag)\ - _KsEdit(\ - (Object)->Bag,\ - (PVOID*)(PointerToPointer),\ - sizeof(**(PointerToPointer)),\ - sizeof(**(PointerToPointer)),\ - (Tag)) - #define KsEditSized(Object,PointerToPointer,NewSize,OldSize,Tag)\ - _KsEdit((Object)->Bag,(PVOID*)(PointerToPointer),(NewSize),(OldSize),(Tag)) - - KSDDKAPI - NTSTATUS - NTAPI - KsRegisterFilterWithNoKSPins( - IN PDEVICE_OBJECT DeviceObject, - IN const GUID * InterfaceClassGUID, - IN ULONG PinCount, - IN BOOL * PinDirection, - IN KSPIN_MEDIUM * MediumList, - IN OPTIONAL GUID * CategoryList - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsFilterCreatePinFactory ( - IN PKSFILTER Filter, - IN const KSPIN_DESCRIPTOR_EX *const PinDescriptor, - OUT PULONG PinID - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsFilterCreateNode ( - IN PKSFILTER Filter, - IN const KSNODE_DESCRIPTOR *const NodeDescriptor, - OUT PULONG NodeID - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsFilterAddTopologyConnections ( - IN PKSFILTER Filter, - IN ULONG NewConnectionsCount, - IN const KSTOPOLOGY_CONNECTION *const NewTopologyConnections - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsPinGetConnectedPinInterface( - IN PKSPIN Pin, - IN const GUID* InterfaceId, - OUT PVOID* Interface - ); - - KSDDKAPI - PFILE_OBJECT - NTAPI - KsPinGetConnectedPinFileObject( - IN PKSPIN Pin - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsPinGetConnectedFilterInterface( - IN PKSPIN Pin, - IN const GUID* InterfaceId, - OUT PVOID* Interface - ); - - #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) - - KSDDKAPI - NTSTATUS - NTAPI - KsPinGetReferenceClockInterface( - IN PKSPIN Pin, - OUT PIKSREFERENCECLOCK* Interface - ); - - #endif //defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) - - KSDDKAPI - VOID - NTAPI - KsPinSetPinClockTime( - IN PKSPIN Pin, - IN LONGLONG Time - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsPinSubmitFrame( - IN PKSPIN Pin, - IN PVOID Data OPTIONAL, - IN ULONG Size OPTIONAL, - IN PKSSTREAM_HEADER StreamHeader OPTIONAL, - IN PVOID Context OPTIONAL - ); - - KSDDKAPI - NTSTATUS - NTAPI - KsPinSubmitFrameMdl( - IN PKSPIN Pin, - IN PMDL Mdl OPTIONAL, - IN PKSSTREAM_HEADER StreamHeader OPTIONAL, - IN PVOID Context OPTIONAL - ); - - KSDDKAPI - void - NTAPI - KsPinRegisterFrameReturnCallback( - IN PKSPIN Pin, - IN PFNKSPINFRAMERETURN FrameReturn - ); - - KSDDKAPI - void - NTAPI - KsPinRegisterHandshakeCallback( - IN PKSPIN Pin, - IN PFNKSPINHANDSHAKE Handshake - ); - - KSDDKAPI - void - NTAPI - KsFilterRegisterPowerCallbacks( - IN PKSFILTER Filter, - IN PFNKSFILTERPOWER Sleep OPTIONAL, - IN PFNKSFILTERPOWER Wake OPTIONAL - ); - - KSDDKAPI - void - NTAPI - KsPinRegisterPowerCallbacks( - IN PKSPIN Pin, - IN PFNKSPINPOWER Sleep OPTIONAL, - IN PFNKSPINPOWER Wake OPTIONAL - ); - - #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) - - KSDDKAPI - PUNKNOWN - NTAPI - KsRegisterAggregatedClientUnknown( - IN PVOID Object, - IN PUNKNOWN ClientUnknown - ); - - KSDDKAPI - PUNKNOWN - NTAPI - KsGetOuterUnknown( - IN PVOID Object - ); - - PUNKNOWN __inline - KsDeviceRegisterAggregatedClientUnknown( - IN PKSDEVICE Device, - IN PUNKNOWN ClientUnknown - ) - { - return KsRegisterAggregatedClientUnknown((PVOID) Device,ClientUnknown); - } - - PUNKNOWN __inline - KsDeviceGetOuterUnknown( - IN PKSDEVICE Device - ) - { - return KsGetOuterUnknown((PVOID) Device); - } - - PUNKNOWN __inline - KsFilterFactoryRegisterAggregatedClientUnknown( - IN PKSFILTERFACTORY FilterFactory, - IN PUNKNOWN ClientUnknown - ) - { - return KsRegisterAggregatedClientUnknown((PVOID) FilterFactory,ClientUnknown); - } - - PUNKNOWN __inline - KsFilterFactoryGetOuterUnknown( - IN PKSFILTERFACTORY FilterFactory - ) - { - return KsGetOuterUnknown((PVOID) FilterFactory); - } - - PUNKNOWN __inline - KsFilterRegisterAggregatedClientUnknown( - IN PKSFILTER Filter, - IN PUNKNOWN ClientUnknown - ) - { - return KsRegisterAggregatedClientUnknown((PVOID) Filter,ClientUnknown); - } - - PUNKNOWN __inline - KsFilterGetOuterUnknown( - IN PKSFILTER Filter - ) - { - return KsGetOuterUnknown((PVOID) Filter); - } - - PUNKNOWN __inline - KsPinRegisterAggregatedClientUnknown( - IN PKSPIN Pin, - IN PUNKNOWN ClientUnknown - ) - { - return KsRegisterAggregatedClientUnknown((PVOID) Pin,ClientUnknown); - } - - PUNKNOWN __inline - KsPinGetOuterUnknown( - IN PKSPIN Pin - ) - { - return KsGetOuterUnknown((PVOID) Pin); - } - - #endif // defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) - - #else // !defined(_NTDDK_) - - #if !defined( KS_NO_CREATE_FUNCTIONS ) - - KSDDKAPI - DWORD - WINAPI - KsCreateAllocator( - IN HANDLE ConnectionHandle, - IN PKSALLOCATOR_FRAMING AllocatorFraming, - OUT PHANDLE AllocatorHandle - ); - - KSDDKAPI - DWORD - NTAPI - KsCreateClock( - IN HANDLE ConnectionHandle, - IN PKSCLOCK_CREATE ClockCreate, - OUT PHANDLE ClockHandle - ); - - KSDDKAPI - DWORD - WINAPI - KsCreatePin( - IN HANDLE FilterHandle, - IN PKSPIN_CONNECT Connect, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE ConnectionHandle - ); - - KSDDKAPI - DWORD - WINAPI - KsCreateTopologyNode( - IN HANDLE ParentHandle, - IN PKSNODE_CREATE NodeCreate, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE NodeHandle - ); - - #endif - - #endif // !defined(_NTDDK_) - - #if defined(__cplusplus) - } - #endif // defined(__cplusplus) - - -#endif // DirectX 8.0 content - - -#endif // !_KS_ diff --git a/import/DirectX8/include/ksguid.h b/import/DirectX8/include/ksguid.h deleted file mode 100644 index 7ff5506c4..000000000 --- a/import/DirectX8/include/ksguid.h +++ /dev/null @@ -1,29 +0,0 @@ -/*++ - -Copyright (C) Microsoft Corporation, 1996 - 2001 - -Module Name: - - ksguid.h - -Abstract: - - Define guids for non-C++. - ---*/ - -#define INITGUID -#include - -#if defined( DEFINE_GUIDEX ) - #undef DEFINE_GUIDEX -#endif -#define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID __declspec(selectany) name = { STATICGUIDOF(name) } - -#ifndef STATICGUIDOF - #define STATICGUIDOF(guid) STATIC_##guid -#endif // !defined(STATICGUIDOF) - -#if !defined( DEFINE_WAVEFORMATEX_GUID ) -#define DEFINE_WAVEFORMATEX_GUID(x) (USHORT)(x), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 -#endif diff --git a/import/DirectX8/include/ksmedia.h b/import/DirectX8/include/ksmedia.h deleted file mode 100644 index 3e75ad5ed..000000000 --- a/import/DirectX8/include/ksmedia.h +++ /dev/null @@ -1,9074 +0,0 @@ -/*++ - -Copyright (c) Microsoft Corporation. All rights reserved. - -Module Name: - - ksmedia.h - -Abstract: - - WDM-CSA Multimedia Definitions. - ---*/ - -#if !defined(_KS_) -#error KS.H must be included before KSMEDIA.H -#endif // !defined(_KS_) - -#if !defined(_KSMEDIA_) -#define _KSMEDIA_ - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// Separate the updated Windows XP version of this header from the downlevel -// version that shipped with the DirectX 8.0 SDK. Since development -// on BDA technology continued for Windows XP, some changes were made to -// this file in order to improve the interface and functionality. -// -// To maintain compatibility with older applications which rely on the -// DirectX 8.0 versions of these files, the DirectX 8.1 version includes -// both the Windows XP content and the DirectX 8.0 content, which are -// separated by the #if (WINVER >= 0x501) preprocessor directive. -// -// Therefore, if you define WINVER to be 0x501 to specify Windows XP, -// the revised content will be compiled. Otherwise, the original -// DirectX 8.0 content will be used. -// -///////////////////////////////////////////////////////////////////////////// - -#if (WINVER >= 0x501) // Windows XP content - - -typedef struct { - KSPROPERTY Property; - KSMULTIPLE_ITEM MultipleItem; -} KSMULTIPLE_DATA_PROP, *PKSMULTIPLE_DATA_PROP; - -#define STATIC_KSMEDIUMSETID_MidiBus \ - 0x05908040L, 0x3246, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("05908040-3246-11D0-A5D6-28DB04C10000", KSMEDIUMSETID_MidiBus); -#define KSMEDIUMSETID_MidiBus DEFINE_GUIDNAMED(KSMEDIUMSETID_MidiBus) - -#define STATIC_KSMEDIUMSETID_VPBus \ - 0xA18C15ECL, 0xCE43, 0x11D0, 0xAB, 0xE7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("A18C15EC-CE43-11D0-ABE7-00A0C9223196", KSMEDIUMSETID_VPBus); -#define KSMEDIUMSETID_VPBus DEFINE_GUIDNAMED(KSMEDIUMSETID_VPBus) - -#define STATIC_KSINTERFACESETID_Media \ - 0x3A13EB40L, 0x30A7, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("3A13EB40-30A7-11D0-A5D6-28DB04C10000", KSINTERFACESETID_Media); -#define KSINTERFACESETID_Media DEFINE_GUIDNAMED(KSINTERFACESETID_Media) - -typedef enum { - KSINTERFACE_MEDIA_MUSIC, - KSINTERFACE_MEDIA_WAVE_BUFFERED, - KSINTERFACE_MEDIA_WAVE_QUEUED -} KSINTERFACE_MEDIA; - - -#if !defined(INIT_USBAUDIO_MID) -// {4e1cecd2-1679-463b-a72f-a5bf64c86eba} -#define INIT_USBAUDIO_MID(guid, id)\ -{\ - (guid)->Data1 = 0x4e1cecd2 + (USHORT)(id);\ - (guid)->Data2 = 0x1679;\ - (guid)->Data3 = 0x463b;\ - (guid)->Data4[0] = 0xa7;\ - (guid)->Data4[1] = 0x2f;\ - (guid)->Data4[2] = 0xa5;\ - (guid)->Data4[3] = 0xbf;\ - (guid)->Data4[4] = 0x64;\ - (guid)->Data4[5] = 0xc8;\ - (guid)->Data4[6] = 0x6e;\ - (guid)->Data4[7] = 0xba;\ -} -#define EXTRACT_USBAUDIO_MID(guid)\ - (USHORT)((guid)->Data1 - 0x4e1cecd2) -#define DEFINE_USBAUDIO_MID_GUID(id)\ - 0x4e1cecd2+(USHORT)(id), 0x1679, 0x463b, 0xa7, 0x2f, 0xa5, 0xbf, 0x64, 0xc8, 0x6e, 0xba - -#define IS_COMPATIBLE_USBAUDIO_MID(guid)\ - (((guid)->Data1 >= 0x4e1cecd2) &&\ - ((guid)->Data1 < 0x4e1cecd2 + 0xffff) &&\ - ((guid)->Data2 == 0x1679) &&\ - ((guid)->Data3 == 0x463b) &&\ - ((guid)->Data4[0] == 0xa7) &&\ - ((guid)->Data4[1] == 0x2f) &&\ - ((guid)->Data4[2] == 0xa5) &&\ - ((guid)->Data4[3] == 0xbf) &&\ - ((guid)->Data4[4] == 0x64) &&\ - ((guid)->Data4[5] == 0xc8) &&\ - ((guid)->Data4[6] == 0x6e) &&\ - ((guid)->Data4[7] == 0xba)) -#endif // !defined(INIT_USBAUDIO_MID) - -#if !defined(INIT_USBAUDIO_PID) -// {abcc5a5e-c263-463b-a72f-a5bf64c86eba} -#define INIT_USBAUDIO_PID(guid, id)\ -{\ - (guid)->Data1 = 0xabcc5a5e + (USHORT)(id);\ - (guid)->Data2 = 0xc263;\ - (guid)->Data3 = 0x463b;\ - (guid)->Data4[0] = 0xa7;\ - (guid)->Data4[1] = 0x2f;\ - (guid)->Data4[2] = 0xa5;\ - (guid)->Data4[3] = 0xbf;\ - (guid)->Data4[4] = 0x64;\ - (guid)->Data4[5] = 0xc8;\ - (guid)->Data4[6] = 0x6e;\ - (guid)->Data4[7] = 0xba;\ -} -#define EXTRACT_USBAUDIO_PID(guid)\ - (USHORT)((guid)->Data1 - 0xabcc5a5e) -#define DEFINE_USBAUDIO_PID_GUID(id)\ - 0xabcc5a5e+(USHORT)(id), 0xc263, 0x463b, 0xa7, 0x2f, 0xa5, 0xbf, 0x64, 0xc8, 0x6e, 0xba - -#define IS_COMPATIBLE_USBAUDIO_PID(guid)\ - (((guid)->Data1 >= 0xabcc5a5e) &&\ - ((guid)->Data1 < 0xabcc5a5e + 0xffff) &&\ - ((guid)->Data2 == 0xc263) &&\ - ((guid)->Data3 == 0x463b) &&\ - ((guid)->Data4[0] == 0xa7) &&\ - ((guid)->Data4[1] == 0x2f) &&\ - ((guid)->Data4[2] == 0xa5) &&\ - ((guid)->Data4[3] == 0xbf) &&\ - ((guid)->Data4[4] == 0x64) &&\ - ((guid)->Data4[5] == 0xc8) &&\ - ((guid)->Data4[6] == 0x6e) &&\ - ((guid)->Data4[7] == 0xba)) -#endif // !defined(INIT_USBAUDIO_PID) - -#if !defined(INIT_USBAUDIO_PRODUCT_NAME) -// {FC575048-2E08-463B-A72F-A5BF64C86EBA} -#define INIT_USBAUDIO_PRODUCT_NAME(guid, vid, pid, strIndex)\ -{\ - (guid)->Data1 = 0XFC575048 + (USHORT)(vid);\ - (guid)->Data2 = 0x2E08 + (USHORT)(pid);\ - (guid)->Data3 = 0x463B + (USHORT)(strIndex);\ - (guid)->Data4[0] = 0xA7;\ - (guid)->Data4[1] = 0x2F;\ - (guid)->Data4[2] = 0xA5;\ - (guid)->Data4[3] = 0xBF;\ - (guid)->Data4[4] = 0x64;\ - (guid)->Data4[5] = 0xC8;\ - (guid)->Data4[6] = 0x6E;\ - (guid)->Data4[7] = 0xBA;\ -} -#define DEFINE_USBAUDIO_PRODUCT_NAME(vid, pid, strIndex)\ - 0xFC575048+(USHORT)(vid), 0x2E08+(USHORT)(pid), 0x463B+(USHORT)(strIndex), 0xA7, 0x2F, 0xA5, 0xBF, 0x64, 0xC8, 0x6E, 0xBA -#endif // !defined(INIT_USBAUDIO_PRODUCT_NAME) - - -// USB Component ID -#define STATIC_KSCOMPONENTID_USBAUDIO \ - 0x8F1275F0, 0x26E9, 0x4264, 0xBA, 0x4D, 0x39, 0xFF, 0xF0, 0x1D, 0x94, 0xAA -DEFINE_GUIDSTRUCT("8F1275F0-26E9-4264-BA4D-39FFF01D94AA", KSCOMPONENTID_USBAUDIO); -#define KSCOMPONENTID_USBAUDIO DEFINE_GUIDNAMED(KSCOMPONENTID_USBAUDIO) - -// USB Terminals -#define INIT_USB_TERMINAL(guid, id)\ -{\ - (guid)->Data1 = 0xDFF219E0 + (USHORT)(id);\ - (guid)->Data2 = 0xF70F;\ - (guid)->Data3 = 0x11D0;\ - (guid)->Data4[0] = 0xb9;\ - (guid)->Data4[1] = 0x17;\ - (guid)->Data4[2] = 0x00;\ - (guid)->Data4[3] = 0xa0;\ - (guid)->Data4[4] = 0xc9;\ - (guid)->Data4[5] = 0x22;\ - (guid)->Data4[6] = 0x31;\ - (guid)->Data4[7] = 0x96;\ -} -#define EXTRACT_USB_TERMINAL(guid)\ - (USHORT)((guid)->Data1 - 0xDFF219E0) -#define DEFINE_USB_TERMINAL_GUID(id)\ - 0xDFF219E0+(USHORT)(id), 0xF70F, 0x11D0, 0xB9, 0x17, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - -#define STATIC_KSNODETYPE_MICROPHONE\ - DEFINE_USB_TERMINAL_GUID(0x0201) -DEFINE_GUIDSTRUCT("DFF21BE1-F70F-11D0-B917-00A0C9223196", KSNODETYPE_MICROPHONE); -#define KSNODETYPE_MICROPHONE DEFINE_GUIDNAMED(KSNODETYPE_MICROPHONE) - -#define STATIC_KSNODETYPE_DESKTOP_MICROPHONE\ - DEFINE_USB_TERMINAL_GUID(0x0202) -DEFINE_GUIDSTRUCT("DFF21BE2-F70F-11D0-B917-00A0C9223196", KSNODETYPE_DESKTOP_MICROPHONE); -#define KSNODETYPE_DESKTOP_MICROPHONE DEFINE_GUIDNAMED(KSNODETYPE_DESKTOP_MICROPHONE) - -#define STATIC_KSNODETYPE_PERSONAL_MICROPHONE\ - DEFINE_USB_TERMINAL_GUID(0x0203) -DEFINE_GUIDSTRUCT("DFF21BE3-F70F-11D0-B917-00A0C9223196", KSNODETYPE_PERSONAL_MICROPHONE); -#define KSNODETYPE_PERSONAL_MICROPHONE DEFINE_GUIDNAMED(KSNODETYPE_PERSONAL_MICROPHONE) - -#define STATIC_KSNODETYPE_OMNI_DIRECTIONAL_MICROPHONE\ - DEFINE_USB_TERMINAL_GUID(0x0204) -DEFINE_GUIDSTRUCT("DFF21BE4-F70F-11D0-B917-00A0C9223196", KSNODETYPE_OMNI_DIRECTIONAL_MICROPHONE); -#define KSNODETYPE_OMNI_DIRECTIONAL_MICROPHONE DEFINE_GUIDNAMED(KSNODETYPE_OMNI_DIRECTIONAL_MICROPHONE) - -#define STATIC_KSNODETYPE_MICROPHONE_ARRAY\ - DEFINE_USB_TERMINAL_GUID(0x0205) -DEFINE_GUIDSTRUCT("DFF21BE5-F70F-11D0-B917-00A0C9223196", KSNODETYPE_MICROPHONE_ARRAY); -#define KSNODETYPE_MICROPHONE_ARRAY DEFINE_GUIDNAMED(KSNODETYPE_MICROPHONE_ARRAY) - -#define STATIC_KSNODETYPE_PROCESSING_MICROPHONE_ARRAY\ - DEFINE_USB_TERMINAL_GUID(0x0206) -DEFINE_GUIDSTRUCT("DFF21BE6-F70F-11D0-B917-00A0C9223196", KSNODETYPE_PROCESSING_MICROPHONE_ARRAY); -#define KSNODETYPE_PROCESSING_MICROPHONE_ARRAY DEFINE_GUIDNAMED(KSNODETYPE_PROCESSING_MICROPHONE_ARRAY) - -#define STATIC_KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR \ - 0x830a44f2, 0xa32d, 0x476b, 0xbe, 0x97, 0x42, 0x84, 0x56, 0x73, 0xb3, 0x5a -DEFINE_GUIDSTRUCT("830a44f2-a32d-476b-be97-42845673b35a", KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR); -#define KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR DEFINE_GUIDNAMED(KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR) - -#define STATIC_KSNODETYPE_SPEAKER\ - DEFINE_USB_TERMINAL_GUID(0x0301) -DEFINE_GUIDSTRUCT("DFF21CE1-F70F-11D0-B917-00A0C9223196", KSNODETYPE_SPEAKER); -#define KSNODETYPE_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_SPEAKER) - -#define STATIC_KSNODETYPE_HEADPHONES\ - DEFINE_USB_TERMINAL_GUID(0x0302) -DEFINE_GUIDSTRUCT("DFF21CE2-F70F-11D0-B917-00A0C9223196", KSNODETYPE_HEADPHONES); -#define KSNODETYPE_HEADPHONES DEFINE_GUIDNAMED(KSNODETYPE_HEADPHONES) - -#define STATIC_KSNODETYPE_HEAD_MOUNTED_DISPLAY_AUDIO\ - DEFINE_USB_TERMINAL_GUID(0x0303) -DEFINE_GUIDSTRUCT("DFF21CE3-F70F-11D0-B917-00A0C9223196", KSNODETYPE_HEAD_MOUNTED_DISPLAY_AUDIO); -#define KSNODETYPE_HEAD_MOUNTED_DISPLAY_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_HEAD_MOUNTED_DISPLAY_AUDIO) - -#define STATIC_KSNODETYPE_DESKTOP_SPEAKER\ - DEFINE_USB_TERMINAL_GUID(0x0304) -DEFINE_GUIDSTRUCT("DFF21CE4-F70F-11D0-B917-00A0C9223196", KSNODETYPE_DESKTOP_SPEAKER); -#define KSNODETYPE_DESKTOP_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_DESKTOP_SPEAKER) - -#define STATIC_KSNODETYPE_ROOM_SPEAKER\ - DEFINE_USB_TERMINAL_GUID(0x0305) -DEFINE_GUIDSTRUCT("DFF21CE5-F70F-11D0-B917-00A0C9223196", KSNODETYPE_ROOM_SPEAKER); -#define KSNODETYPE_ROOM_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_ROOM_SPEAKER) - -#define STATIC_KSNODETYPE_COMMUNICATION_SPEAKER\ - DEFINE_USB_TERMINAL_GUID(0x0306) -DEFINE_GUIDSTRUCT("DFF21CE6-F70F-11D0-B917-00A0C9223196", KSNODETYPE_COMMUNICATION_SPEAKER); -#define KSNODETYPE_COMMUNICATION_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_COMMUNICATION_SPEAKER) - -#define STATIC_KSNODETYPE_LOW_FREQUENCY_EFFECTS_SPEAKER\ - DEFINE_USB_TERMINAL_GUID(0x0307) -DEFINE_GUIDSTRUCT("DFF21CE7-F70F-11D0-B917-00A0C9223196", KSNODETYPE_LOW_FREQUENCY_EFFECTS_SPEAKER); -#define KSNODETYPE_LOW_FREQUENCY_EFFECTS_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_LOW_FREQUENCY_EFFECTS_SPEAKER) - -#define STATIC_KSNODETYPE_HANDSET\ - DEFINE_USB_TERMINAL_GUID(0x0401) -DEFINE_GUIDSTRUCT("DFF21DE1-F70F-11D0-B917-00A0C9223196", KSNODETYPE_HANDSET); -#define KSNODETYPE_HANDSET DEFINE_GUIDNAMED(KSNODETYPE_HANDSET) - -#define STATIC_KSNODETYPE_HEADSET\ - DEFINE_USB_TERMINAL_GUID(0x0402) -DEFINE_GUIDSTRUCT("DFF21DE2-F70F-11D0-B917-00A0C9223196", KSNODETYPE_HEADSET); -#define KSNODETYPE_HEADSET DEFINE_GUIDNAMED(KSNODETYPE_HEADSET) - -#define STATIC_KSNODETYPE_SPEAKERPHONE_NO_ECHO_REDUCTION\ - DEFINE_USB_TERMINAL_GUID(0x0403) -DEFINE_GUIDSTRUCT("DFF21DE3-F70F-11D0-B917-00A0C9223196", KSNODETYPE_SPEAKERPHONE_NO_ECHO_REDUCTION); -#define KSNODETYPE_SPEAKERPHONE_NO_ECHO_REDUCTION DEFINE_GUIDNAMED(KSNODETYPE_SPEAKERPHONE_NO_ECHO_REDUCTION) - -#define STATIC_KSNODETYPE_ECHO_SUPPRESSING_SPEAKERPHONE\ - DEFINE_USB_TERMINAL_GUID(0x0404) -DEFINE_GUIDSTRUCT("DFF21DE4-F70F-11D0-B917-00A0C9223196", KSNODETYPE_ECHO_SUPPRESSING_SPEAKERPHONE); -#define KSNODETYPE_ECHO_SUPPRESSING_SPEAKERPHONE DEFINE_GUIDNAMED(KSNODETYPE_ECHO_SUPPRESSING_SPEAKERPHONE) - -#define STATIC_KSNODETYPE_ECHO_CANCELING_SPEAKERPHONE\ - DEFINE_USB_TERMINAL_GUID(0x0405) -DEFINE_GUIDSTRUCT("DFF21DE5-F70F-11D0-B917-00A0C9223196", KSNODETYPE_ECHO_CANCELING_SPEAKERPHONE); -#define KSNODETYPE_ECHO_CANCELING_SPEAKERPHONE DEFINE_GUIDNAMED(KSNODETYPE_ECHO_CANCELING_SPEAKERPHONE) - -#define STATIC_KSNODETYPE_PHONE_LINE\ - DEFINE_USB_TERMINAL_GUID(0x0501) -DEFINE_GUIDSTRUCT("DFF21EE1-F70F-11D0-B917-00A0C9223196", KSNODETYPE_PHONE_LINE); -#define KSNODETYPE_PHONE_LINE DEFINE_GUIDNAMED(KSNODETYPE_PHONE_LINE) - -#define STATIC_KSNODETYPE_TELEPHONE\ - DEFINE_USB_TERMINAL_GUID(0x0502) -DEFINE_GUIDSTRUCT("DFF21EE2-F70F-11D0-B917-00A0C9223196", KSNODETYPE_TELEPHONE); -#define KSNODETYPE_TELEPHONE DEFINE_GUIDNAMED(KSNODETYPE_TELEPHONE) - -#define STATIC_KSNODETYPE_DOWN_LINE_PHONE\ - DEFINE_USB_TERMINAL_GUID(0x0503) -DEFINE_GUIDSTRUCT("DFF21EE3-F70F-11D0-B917-00A0C9223196", KSNODETYPE_DOWN_LINE_PHONE); -#define KSNODETYPE_DOWN_LINE_PHONE DEFINE_GUIDNAMED(KSNODETYPE_DOWN_LINE_PHONE) - -#define STATIC_KSNODETYPE_ANALOG_CONNECTOR\ - DEFINE_USB_TERMINAL_GUID(0x601) -DEFINE_GUIDSTRUCT("DFF21FE1-F70F-11D0-B917-00A0C9223196", KSNODETYPE_ANALOG_CONNECTOR); -#define KSNODETYPE_ANALOG_CONNECTOR DEFINE_GUIDNAMED(KSNODETYPE_ANALOG_CONNECTOR) - -#define STATIC_KSNODETYPE_DIGITAL_AUDIO_INTERFACE\ - DEFINE_USB_TERMINAL_GUID(0x0602) -DEFINE_GUIDSTRUCT("DFF21FE2-F70F-11D0-B917-00A0C9223196", KSNODETYPE_DIGITAL_AUDIO_INTERFACE); -#define KSNODETYPE_DIGITAL_AUDIO_INTERFACE DEFINE_GUIDNAMED(KSNODETYPE_DIGITAL_AUDIO_INTERFACE) - -#define STATIC_KSNODETYPE_LINE_CONNECTOR\ - DEFINE_USB_TERMINAL_GUID(0x0603) -DEFINE_GUIDSTRUCT("DFF21FE3-F70F-11D0-B917-00A0C9223196", KSNODETYPE_LINE_CONNECTOR); -#define KSNODETYPE_LINE_CONNECTOR DEFINE_GUIDNAMED(KSNODETYPE_LINE_CONNECTOR) - -#define STATIC_KSNODETYPE_LEGACY_AUDIO_CONNECTOR\ - DEFINE_USB_TERMINAL_GUID(0x0604) -DEFINE_GUIDSTRUCT("DFF21FE4-F70F-11D0-B917-00A0C9223196", KSNODETYPE_LEGACY_AUDIO_CONNECTOR); -#define KSNODETYPE_LEGACY_AUDIO_CONNECTOR DEFINE_GUIDNAMED(KSNODETYPE_LEGACY_AUDIO_CONNECTOR) - -#define STATIC_KSNODETYPE_SPDIF_INTERFACE\ - DEFINE_USB_TERMINAL_GUID(0x0605) -DEFINE_GUIDSTRUCT("DFF21FE5-F70F-11D0-B917-00A0C9223196", KSNODETYPE_SPDIF_INTERFACE); -#define KSNODETYPE_SPDIF_INTERFACE DEFINE_GUIDNAMED(KSNODETYPE_SPDIF_INTERFACE) - -#define STATIC_KSNODETYPE_1394_DA_STREAM\ - DEFINE_USB_TERMINAL_GUID(0x0606) -DEFINE_GUIDSTRUCT("DFF21FE6-F70F-11D0-B917-00A0C9223196", KSNODETYPE_1394_DA_STREAM); -#define KSNODETYPE_1394_DA_STREAM DEFINE_GUIDNAMED(KSNODETYPE_1394_DA_STREAM) - -#define STATIC_KSNODETYPE_1394_DV_STREAM_SOUNDTRACK\ - DEFINE_USB_TERMINAL_GUID(0x0607) -DEFINE_GUIDSTRUCT("DFF21FE7-F70F-11D0-B917-00A0C9223196", KSNODETYPE_1394_DV_STREAM_SOUNDTRACK); -#define KSNODETYPE_1394_DV_STREAM_SOUNDTRACK DEFINE_GUIDNAMED(KSNODETYPE_1394_DV_STREAM_SOUNDTRACK) - -#define STATIC_KSNODETYPE_LEVEL_CALIBRATION_NOISE_SOURCE\ - DEFINE_USB_TERMINAL_GUID(0x0701) -DEFINE_GUIDSTRUCT("DFF220E1-F70F-11D0-B917-00A0C9223196", KSNODETYPE_LEVEL_CALIBRATION_NOISE_SOURCE); -#define KSNODETYPE_LEVEL_CALIBRATION_NOISE_SOURCE DEFINE_GUIDNAMED(KSNODETYPE_LEVEL_CALIBRATION_NOISE_SOURCE) - -#define STATIC_KSNODETYPE_EQUALIZATION_NOISE\ - DEFINE_USB_TERMINAL_GUID(0x0702) -DEFINE_GUIDSTRUCT("DFF220E2-F70F-11D0-B917-00A0C9223196", KSNODETYPE_EQUALIZATION_NOISE); -#define KSNODETYPE_EQUALIZATION_NOISE DEFINE_GUIDNAMED(KSNODETYPE_EQUALIZATION_NOISE) - -#define STATIC_KSNODETYPE_CD_PLAYER\ - DEFINE_USB_TERMINAL_GUID(0x0703) -DEFINE_GUIDSTRUCT("DFF220E3-F70F-11D0-B917-00A0C9223196", KSNODETYPE_CD_PLAYER); -#define KSNODETYPE_CD_PLAYER DEFINE_GUIDNAMED(KSNODETYPE_CD_PLAYER) - -#define STATIC_KSNODETYPE_DAT_IO_DIGITAL_AUDIO_TAPE\ - DEFINE_USB_TERMINAL_GUID(0x0704) -DEFINE_GUIDSTRUCT("DFF220E4-F70F-11D0-B917-00A0C9223196", KSNODETYPE_DAT_IO_DIGITAL_AUDIO_TAPE); -#define KSNODETYPE_DAT_IO_DIGITAL_AUDIO_TAPE DEFINE_GUIDNAMED(KSNODETYPE_DAT_IO_DIGITAL_AUDIO_TAPE) - -#define STATIC_KSNODETYPE_DCC_IO_DIGITAL_COMPACT_CASSETTE\ - DEFINE_USB_TERMINAL_GUID(0x0705) -DEFINE_GUIDSTRUCT("DFF220E5-F70F-11D0-B917-00A0C9223196", KSNODETYPE_DCC_IO_DIGITAL_COMPACT_CASSETTE); -#define KSNODETYPE_DCC_IO_DIGITAL_COMPACT_CASSETTE DEFINE_GUIDNAMED(KSNODETYPE_DCC_IO_DIGITAL_COMPACT_CASSETTE) - -#define STATIC_KSNODETYPE_MINIDISK\ - DEFINE_USB_TERMINAL_GUID(0x0706) -DEFINE_GUIDSTRUCT("DFF220E6-F70F-11D0-B917-00A0C9223196", KSNODETYPE_MINIDISK); -#define KSNODETYPE_MINIDISK DEFINE_GUIDNAMED(KSNODETYPE_MINIDISK) - -#define STATIC_KSNODETYPE_ANALOG_TAPE\ - DEFINE_USB_TERMINAL_GUID(0x0707) -DEFINE_GUIDSTRUCT("DFF220E7-F70F-11D0-B917-00A0C9223196", KSNODETYPE_ANALOG_TAPE); -#define KSNODETYPE_ANALOG_TAPE DEFINE_GUIDNAMED(KSNODETYPE_ANALOG_TAPE) - -#define STATIC_KSNODETYPE_PHONOGRAPH\ - DEFINE_USB_TERMINAL_GUID(0x0708) -DEFINE_GUIDSTRUCT("DFF220E8-F70F-11D0-B917-00A0C9223196", KSNODETYPE_PHONOGRAPH); -#define KSNODETYPE_PHONOGRAPH DEFINE_GUIDNAMED(KSNODETYPE_PHONOGRAPH) - -#define STATIC_KSNODETYPE_VCR_AUDIO\ - DEFINE_USB_TERMINAL_GUID(0x0708) -DEFINE_GUIDSTRUCT("DFF220E9-F70F-11D0-B917-00A0C9223196", KSNODETYPE_VCR_AUDIO); -#define KSNODETYPE_VCR_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_VCR_AUDIO) - -#define STATIC_KSNODETYPE_VIDEO_DISC_AUDIO\ - DEFINE_USB_TERMINAL_GUID(0x070A) -DEFINE_GUIDSTRUCT("DFF220EA-F70F-11D0-B917-00A0C9223196", KSNODETYPE_VIDEO_DISC_AUDIO); -#define KSNODETYPE_VIDEO_DISC_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_VIDEO_DISC_AUDIO) - -#define STATIC_KSNODETYPE_DVD_AUDIO\ - DEFINE_USB_TERMINAL_GUID(0x070B) -DEFINE_GUIDSTRUCT("DFF220EB-F70F-11D0-B917-00A0C9223196", KSNODETYPE_DVD_AUDIO); -#define KSNODETYPE_DVD_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_DVD_AUDIO) - -#define STATIC_KSNODETYPE_TV_TUNER_AUDIO\ - DEFINE_USB_TERMINAL_GUID(0x070C) -DEFINE_GUIDSTRUCT("DFF220EC-F70F-11D0-B917-00A0C9223196", KSNODETYPE_TV_TUNER_AUDIO); -#define KSNODETYPE_TV_TUNER_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_TV_TUNER_AUDIO) - -#define STATIC_KSNODETYPE_SATELLITE_RECEIVER_AUDIO\ - DEFINE_USB_TERMINAL_GUID(0x070D) -DEFINE_GUIDSTRUCT("DFF220ED-F70F-11D0-B917-00A0C9223196", KSNODETYPE_SATELLITE_RECEIVER_AUDIO); -#define KSNODETYPE_SATELLITE_RECEIVER_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_SATELLITE_RECEIVER_AUDIO) - -#define STATIC_KSNODETYPE_CABLE_TUNER_AUDIO\ - DEFINE_USB_TERMINAL_GUID(0x070E) -DEFINE_GUIDSTRUCT("DFF220EE-F70F-11D0-B917-00A0C9223196", KSNODETYPE_CABLE_TUNER_AUDIO); -#define KSNODETYPE_CABLE_TUNER_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_CABLE_TUNER_AUDIO) - -#define STATIC_KSNODETYPE_DSS_AUDIO\ - DEFINE_USB_TERMINAL_GUID(0x070F) -DEFINE_GUIDSTRUCT("DFF220EF-F70F-11D0-B917-00A0C9223196", KSNODETYPE_DSS_AUDIO); -#define KSNODETYPE_DSS_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_DSS_AUDIO) - -#define STATIC_KSNODETYPE_RADIO_RECEIVER\ - DEFINE_USB_TERMINAL_GUID(0x0710) -DEFINE_GUIDSTRUCT("DFF220F0-F70F-11D0-B917-00A0C9223196", KSNODETYPE_RADIO_RECEIVER); -#define KSNODETYPE_RADIO_RECEIVER DEFINE_GUIDNAMED(KSNODETYPE_RADIO_RECEIVER) - -#define STATIC_KSNODETYPE_RADIO_TRANSMITTER\ - DEFINE_USB_TERMINAL_GUID(0x0711) -DEFINE_GUIDSTRUCT("DFF220F1-F70F-11D0-B917-00A0C9223196", KSNODETYPE_RADIO_TRANSMITTER); -#define KSNODETYPE_RADIO_TRANSMITTER DEFINE_GUIDNAMED(KSNODETYPE_RADIO_TRANSMITTER) - -#define STATIC_KSNODETYPE_MULTITRACK_RECORDER\ - DEFINE_USB_TERMINAL_GUID(0x0712) -DEFINE_GUIDSTRUCT("DFF220F2-F70F-11D0-B917-00A0C9223196", KSNODETYPE_MULTITRACK_RECORDER); -#define KSNODETYPE_MULTITRACK_RECORDER DEFINE_GUIDNAMED(KSNODETYPE_MULTITRACK_RECORDER) - -#define STATIC_KSNODETYPE_SYNTHESIZER\ - DEFINE_USB_TERMINAL_GUID(0x0713) -DEFINE_GUIDSTRUCT("DFF220F3-F70F-11D0-B917-00A0C9223196", KSNODETYPE_SYNTHESIZER); -#define KSNODETYPE_SYNTHESIZER DEFINE_GUIDNAMED(KSNODETYPE_SYNTHESIZER) - -// Microsoft's WDMAUD virtual swsynth pin name guid - -#define STATIC_KSNODETYPE_SWSYNTH\ - 0x423274A0L, 0x8B81, 0x11D1, 0xA0, 0x50, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88 -DEFINE_GUIDSTRUCT("423274A0-8B81-11D1-A050-0000F8004788", KSNODETYPE_SWSYNTH); -#define KSNODETYPE_SWSYNTH DEFINE_GUIDNAMED(KSNODETYPE_SWSYNTH) - -// Microsoft's SWMIDI midi pin and node name guid - -#define STATIC_KSNODETYPE_SWMIDI\ - 0xCB9BEFA0L, 0xA251, 0x11D1, 0xA0, 0x50, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88 -DEFINE_GUIDSTRUCT("CB9BEFA0-A251-11D1-A050-0000F8004788", KSNODETYPE_SWMIDI); -#define KSNODETYPE_SWMIDI DEFINE_GUIDNAMED(KSNODETYPE_SWMIDI) - -#define STATIC_KSNODETYPE_DRM_DESCRAMBLE\ - 0xFFBB6E3FL, 0xCCFE, 0x4D84, 0x90, 0xD9, 0x42, 0x14, 0x18, 0xB0, 0x3A, 0x8E -DEFINE_GUIDSTRUCT("FFBB6E3F-CCFE-4D84-90D9-421418B03A8E", KSNODETYPE_DRM_DESCRAMBLE); -#define KSNODETYPE_DRM_DESCRAMBLE DEFINE_GUIDNAMED(KSNODETYPE_DRM_DESCRAMBLE) - -// General categories -#define STATIC_KSCATEGORY_AUDIO \ - 0x6994AD04L, 0x93EF, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("6994AD04-93EF-11D0-A3CC-00A0C9223196", KSCATEGORY_AUDIO); -#define KSCATEGORY_AUDIO DEFINE_GUIDNAMED(KSCATEGORY_AUDIO) - -#define STATIC_KSCATEGORY_VIDEO \ - 0x6994AD05L, 0x93EF, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("6994AD05-93EF-11D0-A3CC-00A0C9223196", KSCATEGORY_VIDEO); -#define KSCATEGORY_VIDEO DEFINE_GUIDNAMED(KSCATEGORY_VIDEO) - -#define STATIC_KSCATEGORY_TEXT \ - 0x6994AD06L, 0x93EF, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("6994AD06-93EF-11D0-A3CC-00A0C9223196", KSCATEGORY_TEXT); -#define KSCATEGORY_TEXT DEFINE_GUIDNAMED(KSCATEGORY_TEXT) - -#define STATIC_KSCATEGORY_NETWORK \ - 0x67C9CC3CL, 0x69C4, 0x11D2, 0x87, 0x59, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("67C9CC3C-69C4-11D2-8759-00A0C9223196", KSCATEGORY_NETWORK); -#define KSCATEGORY_NETWORK DEFINE_GUIDNAMED(KSCATEGORY_NETWORK) - -#define STATIC_KSCATEGORY_TOPOLOGY \ - 0xDDA54A40L, 0x1E4C, 0x11D1, 0xA0, 0x50, 0x40, 0x57, 0x05, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("DDA54A40-1E4C-11D1-A050-405705C10000", KSCATEGORY_TOPOLOGY); -#define KSCATEGORY_TOPOLOGY DEFINE_GUIDNAMED(KSCATEGORY_TOPOLOGY) - -#define STATIC_KSCATEGORY_VIRTUAL \ - 0x3503EAC4L, 0x1F26, 0x11D1, 0x8A, 0xB0, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("3503EAC4-1F26-11D1-8AB0-00A0C9223196", KSCATEGORY_VIRTUAL); -#define KSCATEGORY_VIRTUAL DEFINE_GUIDNAMED(KSCATEGORY_VIRTUAL) - -#define STATIC_KSCATEGORY_ACOUSTIC_ECHO_CANCEL \ - 0xBF963D80L, 0xC559, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("BF963D80-C559-11D0-8A2B-00A0C9255AC1", KSCATEGORY_ACOUSTIC_ECHO_CANCEL); -#define KSCATEGORY_ACOUSTIC_ECHO_CANCEL DEFINE_GUIDNAMED(KSCATEGORY_ACOUSTIC_ECHO_CANCEL) - -#define STATIC_KSCATEGORY_SYSAUDIO \ - 0xA7C7A5B1L, 0x5AF3, 0x11D1, 0x9C, 0xED, 0x00, 0xA0, 0x24, 0xBF, 0x04, 0x07 -DEFINE_GUIDSTRUCT("A7C7A5B1-5AF3-11D1-9CED-00A024BF0407", KSCATEGORY_SYSAUDIO); -#define KSCATEGORY_SYSAUDIO DEFINE_GUIDNAMED(KSCATEGORY_SYSAUDIO) - -#define STATIC_KSCATEGORY_WDMAUD \ - 0x3E227E76L, 0x690D, 0x11D2, 0x81, 0x61, 0x00, 0x00, 0xF8, 0x77, 0x5B, 0xF1 -DEFINE_GUIDSTRUCT("3E227E76-690D-11D2-8161-0000F8775BF1", KSCATEGORY_WDMAUD); -#define KSCATEGORY_WDMAUD DEFINE_GUIDNAMED(KSCATEGORY_WDMAUD) - -#define STATIC_KSCATEGORY_AUDIO_GFX \ - 0x9BAF9572L, 0x340C, 0x11D3, 0xAB, 0xDC, 0x00, 0xA0, 0xC9, 0x0A, 0xB1, 0x6F -DEFINE_GUIDSTRUCT("9BAF9572-340C-11D3-ABDC-00A0C90AB16F", KSCATEGORY_AUDIO_GFX); -#define KSCATEGORY_AUDIO_GFX DEFINE_GUIDNAMED(KSCATEGORY_AUDIO_GFX) - -#define STATIC_KSCATEGORY_AUDIO_SPLITTER \ - 0x9EA331FAL, 0xB91B, 0x45F8, 0x92, 0x85, 0xBD, 0x2B, 0xC7, 0x7A, 0xFC, 0xDE -DEFINE_GUIDSTRUCT("9EA331FA-B91B-45F8-9285-BD2BC77AFCDE", KSCATEGORY_AUDIO_SPLITTER); -#define KSCATEGORY_AUDIO_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_AUDIO_SPLITTER) - -#define STATIC_KSCATEGORY_SYNTHESIZER STATIC_KSNODETYPE_SYNTHESIZER -#define KSCATEGORY_SYNTHESIZER KSNODETYPE_SYNTHESIZER - -#define STATIC_KSCATEGORY_DRM_DESCRAMBLE STATIC_KSNODETYPE_DRM_DESCRAMBLE -#define KSCATEGORY_DRM_DESCRAMBLE KSNODETYPE_DRM_DESCRAMBLE - -#define STATIC_KSCATEGORY_AUDIO_DEVICE \ - 0xFBF6F530L, 0x07B9, 0x11D2, 0xA7, 0x1E, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88 -DEFINE_GUIDSTRUCT("FBF6F530-07B9-11D2-A71E-0000F8004788", KSCATEGORY_AUDIO_DEVICE); -#define KSCATEGORY_AUDIO_DEVICE DEFINE_GUIDNAMED(KSCATEGORY_AUDIO_DEVICE) - -#define STATIC_KSCATEGORY_PREFERRED_WAVEOUT_DEVICE \ - 0xD6C5066EL, 0x72C1, 0x11D2, 0x97, 0x55, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88 -DEFINE_GUIDSTRUCT("D6C5066E-72C1-11D2-9755-0000F8004788", KSCATEGORY_PREFERRED_WAVEOUT_DEVICE); -#define KSCATEGORY_PREFERRED_WAVEOUT_DEVICE DEFINE_GUIDNAMED(KSCATEGORY_PREFERRED_WAVEOUT_DEVICE) - -#define STATIC_KSCATEGORY_PREFERRED_WAVEIN_DEVICE \ - 0xD6C50671L, 0x72C1, 0x11D2, 0x97, 0x55, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88 -DEFINE_GUIDSTRUCT("D6C50671-72C1-11D2-9755-0000F8004788", KSCATEGORY_PREFERRED_WAVEIN_DEVICE); -#define KSCATEGORY_PREFERRED_WAVEIN_DEVICE DEFINE_GUIDNAMED(KSCATEGORY_PREFERRED_WAVEIN_DEVICE) - -#define STATIC_KSCATEGORY_PREFERRED_MIDIOUT_DEVICE \ - 0xD6C50674L, 0x72C1, 0x11D2, 0x97, 0x55, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88 -DEFINE_GUIDSTRUCT("D6C50674-72C1-11D2-9755-0000F8004788", KSCATEGORY_PREFERRED_MIDIOUT_DEVICE); -#define KSCATEGORY_PREFERRED_MIDIOUT_DEVICE DEFINE_GUIDNAMED(KSCATEGORY_PREFERRED_MIDIOUT_DEVICE) - -// Special pin category for wdmaud - -#define STATIC_KSCATEGORY_WDMAUD_USE_PIN_NAME \ - 0x47A4FA20L, 0xA251, 0x11D1, 0xA0, 0x50, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88 -DEFINE_GUIDSTRUCT("47A4FA20-A251-11D1-A050-0000F8004788", KSCATEGORY_WDMAUD_USE_PIN_NAME); -#define KSCATEGORY_WDMAUD_USE_PIN_NAME DEFINE_GUIDNAMED(KSCATEGORY_WDMAUD_USE_PIN_NAME) - -// Escalante Platform Interface - -#define STATIC_KSCATEGORY_ESCALANTE_PLATFORM_DRIVER \ - 0x74f3aea8L, 0x9768, 0x11d1, 0x8e, 0x07, 0x00, 0xa0, 0xc9, 0x5e, 0xc2, 0x2e -DEFINE_GUIDSTRUCT("74f3aea8-9768-11d1-8e07-00a0c95ec22e", KSCATEGORY_ESCALANTE_PLATFORM_DRIVER); -#define KSCATEGORY_ESCALANTE_PLATFORM_DRIVER DEFINE_GUIDNAMED(KSCATEGORY_ESCALANTE_PLATFORM_DRIVER) - -// -- major types --- - -// 'vids' == MEDIATYPE_Video, -#define STATIC_KSDATAFORMAT_TYPE_VIDEO\ - 0x73646976L, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 -DEFINE_GUIDSTRUCT("73646976-0000-0010-8000-00aa00389b71", KSDATAFORMAT_TYPE_VIDEO); -#define KSDATAFORMAT_TYPE_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_VIDEO) - -// 'auds' == MEDIATYPE_Audio -#define STATIC_KSDATAFORMAT_TYPE_AUDIO\ - 0x73647561L, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 -DEFINE_GUIDSTRUCT("73647561-0000-0010-8000-00aa00389b71", KSDATAFORMAT_TYPE_AUDIO); -#define KSDATAFORMAT_TYPE_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_AUDIO) - -// 'txts' == MEDIATYPE_Text -#define STATIC_KSDATAFORMAT_TYPE_TEXT\ - 0x73747874L, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 -DEFINE_GUIDSTRUCT("73747874-0000-0010-8000-00aa00389b71", KSDATAFORMAT_TYPE_TEXT); -#define KSDATAFORMAT_TYPE_TEXT DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_TEXT) - -#if !defined( DEFINE_WAVEFORMATEX_GUID ) -#define DEFINE_WAVEFORMATEX_GUID(x) (USHORT)(x), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 -#endif - -#define STATIC_KSDATAFORMAT_SUBTYPE_WAVEFORMATEX\ - 0x00000000L, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 -DEFINE_GUIDSTRUCT("00000000-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_WAVEFORMATEX); -#define KSDATAFORMAT_SUBTYPE_WAVEFORMATEX DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_WAVEFORMATEX) - -#define INIT_WAVEFORMATEX_GUID(Guid, x)\ -{\ - *(Guid) = KSDATAFORMAT_SUBTYPE_WAVEFORMATEX;\ - (Guid)->Data1 = (USHORT)(x);\ -} - -#define EXTRACT_WAVEFORMATEX_ID(Guid)\ - (USHORT)((Guid)->Data1) - -#define IS_VALID_WAVEFORMATEX_GUID(Guid)\ - (!memcmp(((PUSHORT)&KSDATAFORMAT_SUBTYPE_WAVEFORMATEX) + 1, ((PUSHORT)(Guid)) + 1, sizeof(GUID) - sizeof(USHORT))) - -#if !defined(INIT_MMREG_MID) -//{d5a47fa7-6d98-11d1-a21a-00a0c9223196} -#define INIT_MMREG_MID(guid, id)\ -{\ - (guid)->Data1 = 0xd5a47fa7 + (USHORT)(id);\ - (guid)->Data2 = 0x6d98;\ - (guid)->Data3 = 0x11d1;\ - (guid)->Data4[0] = 0xa2;\ - (guid)->Data4[1] = 0x1a;\ - (guid)->Data4[2] = 0x00;\ - (guid)->Data4[3] = 0xa0;\ - (guid)->Data4[4] = 0xc9;\ - (guid)->Data4[5] = 0x22;\ - (guid)->Data4[6] = 0x31;\ - (guid)->Data4[7] = 0x96;\ -} -#define EXTRACT_MMREG_MID(guid)\ - (USHORT)((guid)->Data1 - 0xd5a47fa7) -#define DEFINE_MMREG_MID_GUID(id)\ - 0xd5a47fa7+(USHORT)(id), 0x6d98, 0x11d1, 0xa2, 0x1a, 0x00, 0xa0, 0xc9, 0x22, 0x31, 0x96 - -#define IS_COMPATIBLE_MMREG_MID(guid)\ - (((guid)->Data1 >= 0xd5a47fa7) &&\ - ((guid)->Data1 < 0xd5a47fa7 + 0xffff) &&\ - ((guid)->Data2 == 0x6d98) &&\ - ((guid)->Data3 == 0x11d1) &&\ - ((guid)->Data4[0] == 0xa2) &&\ - ((guid)->Data4[1] == 0x1a) &&\ - ((guid)->Data4[2] == 0x00) &&\ - ((guid)->Data4[3] == 0xa0) &&\ - ((guid)->Data4[4] == 0xc9) &&\ - ((guid)->Data4[5] == 0x22) &&\ - ((guid)->Data4[6] == 0x31) &&\ - ((guid)->Data4[7] == 0x96)) -#endif // !defined(INIT_MMREG_MID) - -#if !defined(INIT_MMREG_PID) -//{e36dc2ac-6d9a-11d1-a21a-00a0c9223196} -#define INIT_MMREG_PID(guid, id)\ -{\ - (guid)->Data1 = 0xe36dc2ac + (USHORT)(id);\ - (guid)->Data2 = 0x6d9a;\ - (guid)->Data3 = 0x11d1;\ - (guid)->Data4[0] = 0xa2;\ - (guid)->Data4[1] = 0x1a;\ - (guid)->Data4[2] = 0x00;\ - (guid)->Data4[3] = 0xa0;\ - (guid)->Data4[4] = 0xc9;\ - (guid)->Data4[5] = 0x22;\ - (guid)->Data4[6] = 0x31;\ - (guid)->Data4[7] = 0x96;\ -} -#define EXTRACT_MMREG_PID(guid)\ - (USHORT)((guid)->Data1 - 0xe36dc2ac) -#define DEFINE_MMREG_PID_GUID(id)\ - 0xe36dc2ac+(USHORT)(id), 0x6d9a, 0x11d1, 0xa2, 0x1a, 0x00, 0xa0, 0xc9, 0x22, 0x31, 0x96 - -#define IS_COMPATIBLE_MMREG_PID(guid)\ - (((guid)->Data1 >= 0xe36dc2ac) &&\ - ((guid)->Data1 < 0xe36dc2ac + 0xffff) &&\ - ((guid)->Data2 == 0x6d9a) &&\ - ((guid)->Data3 == 0x11d1) &&\ - ((guid)->Data4[0] == 0xa2) &&\ - ((guid)->Data4[1] == 0x1a) &&\ - ((guid)->Data4[2] == 0x00) &&\ - ((guid)->Data4[3] == 0xa0) &&\ - ((guid)->Data4[4] == 0xc9) &&\ - ((guid)->Data4[5] == 0x22) &&\ - ((guid)->Data4[6] == 0x31) &&\ - ((guid)->Data4[7] == 0x96)) -#endif // !defined(INIT_MMREG_PID) - -#define STATIC_KSDATAFORMAT_SUBTYPE_ANALOG\ - 0x6dba3190L, 0x67bd, 0x11cf, 0xa0, 0xf7, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 -DEFINE_GUIDSTRUCT("6dba3190-67bd-11cf-a0f7-0020afd156e4", KSDATAFORMAT_SUBTYPE_ANALOG); -#define KSDATAFORMAT_SUBTYPE_ANALOG DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ANALOG) - -#define STATIC_KSDATAFORMAT_SUBTYPE_PCM\ - DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_PCM) -DEFINE_GUIDSTRUCT("00000001-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_PCM); -#define KSDATAFORMAT_SUBTYPE_PCM DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_PCM) - -#if defined(_INC_MMREG) -#define STATIC_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT\ - DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_IEEE_FLOAT) -DEFINE_GUIDSTRUCT("00000003-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_IEEE_FLOAT); -#define KSDATAFORMAT_SUBTYPE_IEEE_FLOAT DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT) - -#define STATIC_KSDATAFORMAT_SUBTYPE_DRM\ - DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DRM) -DEFINE_GUIDSTRUCT("00000009-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_DRM); -#define KSDATAFORMAT_SUBTYPE_DRM DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DRM) - -#define STATIC_KSDATAFORMAT_SUBTYPE_ALAW\ - DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_ALAW) -DEFINE_GUIDSTRUCT("00000006-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_ALAW); -#define KSDATAFORMAT_SUBTYPE_ALAW DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ALAW) - -#define STATIC_KSDATAFORMAT_SUBTYPE_MULAW\ - DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_MULAW) -DEFINE_GUIDSTRUCT("00000007-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_MULAW); -#define KSDATAFORMAT_SUBTYPE_MULAW DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MULAW) - -#define STATIC_KSDATAFORMAT_SUBTYPE_ADPCM\ - DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_ADPCM) -DEFINE_GUIDSTRUCT("00000002-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_ADPCM); -#define KSDATAFORMAT_SUBTYPE_ADPCM DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ADPCM) - -#define STATIC_KSDATAFORMAT_SUBTYPE_MPEG\ - DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_MPEG) -DEFINE_GUIDSTRUCT("00000050-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_MPEG); -#define KSDATAFORMAT_SUBTYPE_MPEG DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG) -#endif // defined(_INC_MMREG) - -#define STATIC_KSDATAFORMAT_SPECIFIER_VC_ID\ - 0xAD98D184L, 0xAAC3, 0x11D0, 0xA4, 0x1C, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("AD98D184-AAC3-11D0-A41C-00A0C9223196", KSDATAFORMAT_SPECIFIER_VC_ID); -#define KSDATAFORMAT_SPECIFIER_VC_ID DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_VC_ID) - -#define STATIC_KSDATAFORMAT_SPECIFIER_WAVEFORMATEX\ - 0x05589f81L, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a -DEFINE_GUIDSTRUCT("05589f81-c356-11ce-bf01-00aa0055595a", KSDATAFORMAT_SPECIFIER_WAVEFORMATEX); -#define KSDATAFORMAT_SPECIFIER_WAVEFORMATEX DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX) - -#define STATIC_KSDATAFORMAT_SPECIFIER_DSOUND\ - 0x518590a2L, 0xa184, 0x11d0, 0x85, 0x22, 0x00, 0xc0, 0x4f, 0xd9, 0xba, 0xf3 -DEFINE_GUIDSTRUCT("518590a2-a184-11d0-8522-00c04fd9baf3", KSDATAFORMAT_SPECIFIER_DSOUND); -#define KSDATAFORMAT_SPECIFIER_DSOUND DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DSOUND) - -#if defined(_INC_MMSYSTEM) || defined(_INC_MMREG) -#if !defined( PACK_PRAGMAS_NOT_SUPPORTED ) -#include -#endif -typedef struct { - KSDATAFORMAT DataFormat; - WAVEFORMATEX WaveFormatEx; -} KSDATAFORMAT_WAVEFORMATEX, *PKSDATAFORMAT_WAVEFORMATEX; - -#ifndef _WAVEFORMATEXTENSIBLE_ -#define _WAVEFORMATEXTENSIBLE_ -typedef struct { - WAVEFORMATEX Format; - union { - WORD wValidBitsPerSample; /* bits of precision */ - WORD wSamplesPerBlock; /* valid if wBitsPerSample==0 */ - WORD wReserved; /* If neither applies, set to zero. */ - } Samples; - DWORD dwChannelMask; /* which channels are */ - /* present in stream */ - GUID SubFormat; -} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE; -#endif // !_WAVEFORMATEXTENSIBLE_ - -#if !defined(WAVE_FORMAT_EXTENSIBLE) -#define WAVE_FORMAT_EXTENSIBLE 0xFFFE -#endif // !defined(WAVE_FORMAT_EXTENSIBLE) - -// DirectSound buffer description -typedef struct { - ULONG Flags; - ULONG Control; - WAVEFORMATEX WaveFormatEx; -} KSDSOUND_BUFFERDESC, *PKSDSOUND_BUFFERDESC; - -// DirectSound format -typedef struct { - KSDATAFORMAT DataFormat; - KSDSOUND_BUFFERDESC BufferDesc; -} KSDATAFORMAT_DSOUND, *PKSDATAFORMAT_DSOUND; - -#if !defined( PACK_PRAGMAS_NOT_SUPPORTED ) -#include -#endif -#endif // defined(_INC_MMSYSTEM) || defined(_INC_MMREG) - - - -// DirectSound buffer flags -#define KSDSOUND_BUFFER_PRIMARY 0x00000001 -#define KSDSOUND_BUFFER_STATIC 0x00000002 -#define KSDSOUND_BUFFER_LOCHARDWARE 0x00000004 -#define KSDSOUND_BUFFER_LOCSOFTWARE 0x00000008 - -// DirectSound buffer control flags -#define KSDSOUND_BUFFER_CTRL_3D 0x00000001 -#define KSDSOUND_BUFFER_CTRL_FREQUENCY 0x00000002 -#define KSDSOUND_BUFFER_CTRL_PAN 0x00000004 -#define KSDSOUND_BUFFER_CTRL_VOLUME 0x00000008 -#define KSDSOUND_BUFFER_CTRL_POSITIONNOTIFY 0x00000010 - -typedef struct { -#if defined(_NTDDK_) - ULONGLONG PlayOffset; - ULONGLONG WriteOffset; -#else // !_NTDDK_ - DWORDLONG PlayOffset; - DWORDLONG WriteOffset; -#endif // !_NTDDK_ -} KSAUDIO_POSITION, *PKSAUDIO_POSITION; - -//=========================================================================== -// DirectSound3D HAL - - -typedef struct _DS3DVECTOR { - union { - FLOAT x; - FLOAT dvX; - }; - union { - FLOAT y; - FLOAT dvY; - }; - union { - FLOAT z; - FLOAT dvZ; - }; -} DS3DVECTOR, *PDS3DVECTOR; - - -//=========================================================================== -//=========================================================================== - -// KSPROPSETID_DirectSound3DListener : {437B3414-D060-11d0-8583-00C04FD9BAF3} - -#define STATIC_KSPROPSETID_DirectSound3DListener\ - 0x437b3414L, 0xd060, 0x11d0, 0x85, 0x83, 0x00, 0xc0, 0x4f, 0xd9, 0xba, 0xf3 -DEFINE_GUIDSTRUCT("437b3414-d060-11d0-8583-00c04fd9baf3",KSPROPSETID_DirectSound3DListener); -#define KSPROPSETID_DirectSound3DListener DEFINE_GUIDNAMED(KSPROPSETID_DirectSound3DListener) - -typedef enum { - KSPROPERTY_DIRECTSOUND3DLISTENER_ALL, - KSPROPERTY_DIRECTSOUND3DLISTENER_POSITION, - KSPROPERTY_DIRECTSOUND3DLISTENER_VELOCITY, - KSPROPERTY_DIRECTSOUND3DLISTENER_ORIENTATION, - KSPROPERTY_DIRECTSOUND3DLISTENER_DISTANCEFACTOR, - KSPROPERTY_DIRECTSOUND3DLISTENER_ROLLOFFFACTOR, - KSPROPERTY_DIRECTSOUND3DLISTENER_DOPPLERFACTOR, - KSPROPERTY_DIRECTSOUND3DLISTENER_BATCH, - KSPROPERTY_DIRECTSOUND3DLISTENER_ALLOCATION -} KSPROPERTY_DIRECTSOUND3DLISTENER; - -typedef struct { - DS3DVECTOR Position; - DS3DVECTOR Velocity; - DS3DVECTOR OrientFront; - DS3DVECTOR OrientTop; - FLOAT DistanceFactor; - FLOAT RolloffFactor; - FLOAT DopplerFactor; -} KSDS3D_LISTENER_ALL, *PKSDS3D_LISTENER_ALL; - -typedef struct { - DS3DVECTOR Front; - DS3DVECTOR Top; -} KSDS3D_LISTENER_ORIENTATION, *PKSDS3D_LISTENER_ORIENTATION; - - -//=========================================================================== -//=========================================================================== -// KSPROPSETID_DirectSound3DBuffer : {437B3411-D060-11d0-8583-00C04FD9BAF3} - -#define STATIC_KSPROPSETID_DirectSound3DBuffer\ - 0x437b3411L, 0xd060, 0x11d0, 0x85, 0x83, 0x00, 0xc0, 0x4f, 0xd9, 0xba, 0xf3 -DEFINE_GUIDSTRUCT("437b3411-d060-11d0-8583-00c04fd9baf3", KSPROPSETID_DirectSound3DBuffer); -#define KSPROPSETID_DirectSound3DBuffer DEFINE_GUIDNAMED(KSPROPSETID_DirectSound3DBuffer) - - -typedef enum { - KSPROPERTY_DIRECTSOUND3DBUFFER_ALL, - KSPROPERTY_DIRECTSOUND3DBUFFER_POSITION, - KSPROPERTY_DIRECTSOUND3DBUFFER_VELOCITY, - KSPROPERTY_DIRECTSOUND3DBUFFER_CONEANGLES, - KSPROPERTY_DIRECTSOUND3DBUFFER_CONEORIENTATION, - KSPROPERTY_DIRECTSOUND3DBUFFER_CONEOUTSIDEVOLUME, - KSPROPERTY_DIRECTSOUND3DBUFFER_MINDISTANCE, - KSPROPERTY_DIRECTSOUND3DBUFFER_MAXDISTANCE, - KSPROPERTY_DIRECTSOUND3DBUFFER_MODE -} KSPROPERTY_DIRECTSOUND3DBUFFER; - - -typedef struct { - DS3DVECTOR Position; - DS3DVECTOR Velocity; - ULONG InsideConeAngle; - ULONG OutsideConeAngle; - DS3DVECTOR ConeOrientation; - LONG ConeOutsideVolume; - FLOAT MinDistance; - FLOAT MaxDistance; - ULONG Mode; -} KSDS3D_BUFFER_ALL, *PKSDS3D_BUFFER_ALL; - -typedef struct { - ULONG InsideConeAngle; - ULONG OutsideConeAngle; -} KSDS3D_BUFFER_CONE_ANGLES, *PKSDS3D_BUFFER_CONE_ANGLES; - -#define KSAUDIO_STEREO_SPEAKER_GEOMETRY_HEADPHONE (-1) -#define KSAUDIO_STEREO_SPEAKER_GEOMETRY_MIN 5 -#define KSAUDIO_STEREO_SPEAKER_GEOMETRY_NARROW 10 -#define KSAUDIO_STEREO_SPEAKER_GEOMETRY_WIDE 20 -#define KSAUDIO_STEREO_SPEAKER_GEOMETRY_MAX 180 - -#define KSDSOUND_3D_MODE_NORMAL 0x00000000 -#define KSDSOUND_3D_MODE_HEADRELATIVE 0x00000001 -#define KSDSOUND_3D_MODE_DISABLE 0x00000002 - -typedef struct { - KSDATARANGE DataRange; - ULONG MaximumChannels; - ULONG MinimumBitsPerSample; - ULONG MaximumBitsPerSample; - ULONG MinimumSampleFrequency; - ULONG MaximumSampleFrequency; -} KSDATARANGE_AUDIO, *PKSDATARANGE_AUDIO; - -//--------------------------------------------------------------------------- - -#define STATIC_KSDATAFORMAT_SUBTYPE_RIFF\ - 0x4995DAEEL, 0x9EE6, 0x11D0, 0xA4, 0x0E, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("4995DAEE-9EE6-11D0-A40E-00A0C9223196", KSDATAFORMAT_SUBTYPE_RIFF); -#define KSDATAFORMAT_SUBTYPE_RIFF DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_RIFF) - -#define STATIC_KSDATAFORMAT_SUBTYPE_RIFFWAVE\ - 0xe436eb8bL, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 -DEFINE_GUIDSTRUCT("e436eb8b-524f-11ce-9f53-0020af0ba770", KSDATAFORMAT_SUBTYPE_RIFFWAVE); -#define KSDATAFORMAT_SUBTYPE_RIFFWAVE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_RIFFWAVE) - -//=========================================================================== -//=========================================================================== - -#define STATIC_KSPROPSETID_Bibliographic \ - 0x07BA150EL, 0xE2B1, 0x11D0, 0xAC, 0x17, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("07BA150E-E2B1-11D0-AC17-00A0C9223196", KSPROPSETID_Bibliographic); -#define KSPROPSETID_Bibliographic DEFINE_GUIDNAMED(KSPROPSETID_Bibliographic) - -//Repeatable tags contain all entries within the property, each preceeded by length -typedef enum { - KSPROPERTY_BIBLIOGRAPHIC_LEADER = 'RDL ', - KSPROPERTY_BIBLIOGRAPHIC_LCCN = '010 ', - KSPROPERTY_BIBLIOGRAPHIC_ISBN = '020 ', - KSPROPERTY_BIBLIOGRAPHIC_ISSN = '220 ', - KSPROPERTY_BIBLIOGRAPHIC_CATALOGINGSOURCE = '040 ', - KSPROPERTY_BIBLIOGRAPHIC_MAINPERSONALNAME = '001 ', - KSPROPERTY_BIBLIOGRAPHIC_MAINCORPORATEBODY = '011 ', - KSPROPERTY_BIBLIOGRAPHIC_MAINMEETINGNAME = '111 ', - KSPROPERTY_BIBLIOGRAPHIC_MAINUNIFORMTITLE = '031 ', - KSPROPERTY_BIBLIOGRAPHIC_UNIFORMTITLE = '042 ', - KSPROPERTY_BIBLIOGRAPHIC_TITLESTATEMENT = '542 ', - KSPROPERTY_BIBLIOGRAPHIC_VARYINGFORMTITLE = '642 ', - KSPROPERTY_BIBLIOGRAPHIC_PUBLICATION = '062 ', - KSPROPERTY_BIBLIOGRAPHIC_PHYSICALDESCRIPTION = '003 ', - KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYTITLE = '044 ', - KSPROPERTY_BIBLIOGRAPHIC_SERIESSTATEMENT = '094 ', - KSPROPERTY_BIBLIOGRAPHIC_GENERALNOTE = '005 ', - KSPROPERTY_BIBLIOGRAPHIC_BIBLIOGRAPHYNOTE = '405 ', - KSPROPERTY_BIBLIOGRAPHIC_CONTENTSNOTE = '505 ', - KSPROPERTY_BIBLIOGRAPHIC_CREATIONCREDIT = '805 ', - KSPROPERTY_BIBLIOGRAPHIC_CITATION = '015 ', - KSPROPERTY_BIBLIOGRAPHIC_PARTICIPANT = '115 ', - KSPROPERTY_BIBLIOGRAPHIC_SUMMARY = '025 ', - KSPROPERTY_BIBLIOGRAPHIC_TARGETAUDIENCE = '125 ', - KSPROPERTY_BIBLIOGRAPHIC_ADDEDFORMAVAILABLE = '035 ', - KSPROPERTY_BIBLIOGRAPHIC_SYSTEMDETAILS = '835 ', - KSPROPERTY_BIBLIOGRAPHIC_AWARDS = '685 ', - KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYPERSONALNAME = '006 ', - KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYTOPICALTERM = '056 ', - KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYGEOGRAPHIC = '156 ', - KSPROPERTY_BIBLIOGRAPHIC_INDEXTERMGENRE = '556 ', - KSPROPERTY_BIBLIOGRAPHIC_INDEXTERMCURRICULUM = '856 ', - KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYUNIFORMTITLE = '037 ', - KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYRELATED = '047 ', - KSPROPERTY_BIBLIOGRAPHIC_SERIESSTATEMENTPERSONALNAME = '008 ', - KSPROPERTY_BIBLIOGRAPHIC_SERIESSTATEMENTUNIFORMTITLE = '038 ' -} KSPROPERTY_BIBLIOGRAPHIC; - -#define STATIC_KSPROPSETID_TopologyNode\ - 0x45FFAAA1L, 0x6E1B, 0x11D0, 0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00 -DEFINE_GUIDSTRUCT("45FFAAA1-6E1B-11D0-BCF2-444553540000", KSPROPSETID_TopologyNode); -#define KSPROPSETID_TopologyNode DEFINE_GUIDNAMED(KSPROPSETID_TopologyNode) - -typedef enum { - KSPROPERTY_TOPOLOGYNODE_ENABLE = 1, - KSPROPERTY_TOPOLOGYNODE_RESET -} KSPROPERTY_TOPOLOGYNODE; - -//=========================================================================== - -#if defined(_NTDDK_) -typedef NTSTATUS (CALLBACK *PRTAUDIOGETPOSITION)(IN PFILE_OBJECT PinFileObject, - OUT PUCHAR *ppPlayPosition, - OUT PLONG plOffset); -#endif // defined(_NTDDK_) - -#define STATIC_KSPROPSETID_RtAudio\ - 0xa855a48c, 0x2f78, 0x4729, 0x90, 0x51, 0x19, 0x68, 0x74, 0x6b, 0x9e, 0xef -DEFINE_GUIDSTRUCT("A855A48C-2F78-4729-9051-1968746B9EEF", KSPROPSETID_RtAudio); -#define KSPROPSETID_RtAudio DEFINE_GUIDNAMED(KSPROPSETID_RtAudio) - -typedef enum { - KSPROPERTY_RTAUDIO_GETPOSITIONFUNCTION -} KSPROPERTY_RTAUDIO; - -//=========================================================================== -#define STATIC_KSPROPSETID_DrmAudioStream\ - 0x2f2c8ddd, 0x4198, 0x4fac, 0xba, 0x29, 0x61, 0xbb, 0x5, 0xb7, 0xde, 0x6 -DEFINE_GUIDSTRUCT("2F2C8DDD-4198-4fac-BA29-61BB05B7DE06", KSPROPSETID_DrmAudioStream); -#define KSPROPSETID_DrmAudioStream DEFINE_GUIDNAMED(KSPROPSETID_DrmAudioStream) - -typedef enum { - KSPROPERTY_DRMAUDIOSTREAM_CONTENTID -} KSPROPERTY_DRMAUDIOSTREAM; - -//=========================================================================== -#define STATIC_KSPROPSETID_Audio\ - 0x45FFAAA0L, 0x6E1B, 0x11D0, 0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00 -DEFINE_GUIDSTRUCT("45FFAAA0-6E1B-11D0-BCF2-444553540000", KSPROPSETID_Audio); -#define KSPROPSETID_Audio DEFINE_GUIDNAMED(KSPROPSETID_Audio) - -typedef enum { - KSPROPERTY_AUDIO_LATENCY = 1, - KSPROPERTY_AUDIO_COPY_PROTECTION, - KSPROPERTY_AUDIO_CHANNEL_CONFIG, - KSPROPERTY_AUDIO_VOLUMELEVEL, - KSPROPERTY_AUDIO_POSITION, - KSPROPERTY_AUDIO_DYNAMIC_RANGE, - KSPROPERTY_AUDIO_QUALITY, - KSPROPERTY_AUDIO_SAMPLING_RATE, - KSPROPERTY_AUDIO_DYNAMIC_SAMPLING_RATE, - KSPROPERTY_AUDIO_MIX_LEVEL_TABLE, - KSPROPERTY_AUDIO_MIX_LEVEL_CAPS, - KSPROPERTY_AUDIO_MUX_SOURCE, - KSPROPERTY_AUDIO_MUTE, - KSPROPERTY_AUDIO_BASS, - KSPROPERTY_AUDIO_MID, - KSPROPERTY_AUDIO_TREBLE, - KSPROPERTY_AUDIO_BASS_BOOST, - KSPROPERTY_AUDIO_EQ_LEVEL, - KSPROPERTY_AUDIO_NUM_EQ_BANDS, - KSPROPERTY_AUDIO_EQ_BANDS, - KSPROPERTY_AUDIO_AGC, - KSPROPERTY_AUDIO_DELAY, - KSPROPERTY_AUDIO_LOUDNESS, - KSPROPERTY_AUDIO_WIDE_MODE, - KSPROPERTY_AUDIO_WIDENESS, - KSPROPERTY_AUDIO_REVERB_LEVEL, - KSPROPERTY_AUDIO_CHORUS_LEVEL, - KSPROPERTY_AUDIO_DEV_SPECIFIC, - KSPROPERTY_AUDIO_DEMUX_DEST, - KSPROPERTY_AUDIO_STEREO_ENHANCE, - KSPROPERTY_AUDIO_MANUFACTURE_GUID, - KSPROPERTY_AUDIO_PRODUCT_GUID, - KSPROPERTY_AUDIO_CPU_RESOURCES, - KSPROPERTY_AUDIO_STEREO_SPEAKER_GEOMETRY, - KSPROPERTY_AUDIO_SURROUND_ENCODE, - KSPROPERTY_AUDIO_3D_INTERFACE, - KSPROPERTY_AUDIO_PEAKMETER, - KSPROPERTY_AUDIO_ALGORITHM_INSTANCE, - KSPROPERTY_AUDIO_FILTER_STATE, - KSPROPERTY_AUDIO_PREFERRED_STATUS -} KSPROPERTY_AUDIO; - -// Audio quality constants -#define KSAUDIO_QUALITY_WORST 0x0 -#define KSAUDIO_QUALITY_PC 0x1 -#define KSAUDIO_QUALITY_BASIC 0x2 -#define KSAUDIO_QUALITY_ADVANCED 0x3 - -// Audio CPU resource constants -#define KSAUDIO_CPU_RESOURCES_NOT_HOST_CPU 0x00000000 -#define KSAUDIO_CPU_RESOURCES_HOST_CPU 0x7FFFFFFF - -typedef struct { - BOOL fCopyrighted; - BOOL fOriginal; -} KSAUDIO_COPY_PROTECTION, *PKSAUDIO_COPY_PROTECTION; - -typedef struct { - LONG ActiveSpeakerPositions; -} KSAUDIO_CHANNEL_CONFIG, *PKSAUDIO_CHANNEL_CONFIG; - -// Speaker Positions: -#define SPEAKER_FRONT_LEFT 0x1 -#define SPEAKER_FRONT_RIGHT 0x2 -#define SPEAKER_FRONT_CENTER 0x4 -#define SPEAKER_LOW_FREQUENCY 0x8 -#define SPEAKER_BACK_LEFT 0x10 -#define SPEAKER_BACK_RIGHT 0x20 -#define SPEAKER_FRONT_LEFT_OF_CENTER 0x40 -#define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80 -#define SPEAKER_BACK_CENTER 0x100 -#define SPEAKER_SIDE_LEFT 0x200 -#define SPEAKER_SIDE_RIGHT 0x400 -#define SPEAKER_TOP_CENTER 0x800 -#define SPEAKER_TOP_FRONT_LEFT 0x1000 -#define SPEAKER_TOP_FRONT_CENTER 0x2000 -#define SPEAKER_TOP_FRONT_RIGHT 0x4000 -#define SPEAKER_TOP_BACK_LEFT 0x8000 -#define SPEAKER_TOP_BACK_CENTER 0x10000 -#define SPEAKER_TOP_BACK_RIGHT 0x20000 - -// Bit mask locations reserved for future use -#define SPEAKER_RESERVED 0x7FFC0000 - -// Used to specify that any possible permutation of speaker configurations -#define SPEAKER_ALL 0x80000000 - -// DirectSound Speaker Config -#define KSAUDIO_SPEAKER_DIRECTOUT 0 -#define KSAUDIO_SPEAKER_MONO (SPEAKER_FRONT_CENTER) -#define KSAUDIO_SPEAKER_STEREO (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT) -#define KSAUDIO_SPEAKER_QUAD (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ - SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT) -#define KSAUDIO_SPEAKER_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ - SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER) -#define KSAUDIO_SPEAKER_5POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ - SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | \ - SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT) -#define KSAUDIO_SPEAKER_7POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ - SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | \ - SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | \ - SPEAKER_FRONT_LEFT_OF_CENTER | SPEAKER_FRONT_RIGHT_OF_CENTER) - -// DVD Speaker Positions -#define KSAUDIO_SPEAKER_GROUND_FRONT_LEFT SPEAKER_FRONT_LEFT -#define KSAUDIO_SPEAKER_GROUND_FRONT_CENTER SPEAKER_FRONT_CENTER -#define KSAUDIO_SPEAKER_GROUND_FRONT_RIGHT SPEAKER_FRONT_RIGHT -#define KSAUDIO_SPEAKER_GROUND_REAR_LEFT SPEAKER_BACK_LEFT -#define KSAUDIO_SPEAKER_GROUND_REAR_RIGHT SPEAKER_BACK_RIGHT -#define KSAUDIO_SPEAKER_TOP_MIDDLE SPEAKER_TOP_CENTER -#define KSAUDIO_SPEAKER_SUPER_WOOFER SPEAKER_LOW_FREQUENCY - -typedef struct { - ULONG QuietCompression; - ULONG LoudCompression; -} KSAUDIO_DYNAMIC_RANGE, *PKSAUDIO_DYNAMIC_RANGE; - -typedef struct { - BOOL Mute; - LONG Level; -} KSAUDIO_MIXLEVEL, *PKSAUDIO_MIXLEVEL; - -typedef struct { - BOOL Mute; - LONG Minimum; - LONG Maximum; - LONG Reset; -} KSAUDIO_MIX_CAPS, *PKSAUDIO_MIX_CAPS; - -typedef struct { - ULONG InputChannels; - ULONG OutputChannels; - KSAUDIO_MIX_CAPS Capabilities[1]; -} KSAUDIO_MIXCAP_TABLE, *PKSAUDIO_MIXCAP_TABLE; - -typedef enum { - SE_TECH_NONE, - SE_TECH_ANALOG_DEVICES_PHAT, - SE_TECH_CREATIVE, - SE_TECH_NATIONAL_SEMI, - SE_TECH_YAMAHA_YMERSION, - SE_TECH_BBE, - SE_TECH_CRYSTAL_SEMI, - SE_TECH_QSOUND_QXPANDER, - SE_TECH_SPATIALIZER, - SE_TECH_SRS, - SE_TECH_PLATFORM_TECH, - SE_TECH_AKM, - SE_TECH_AUREAL, - SE_TECH_AZTECH, - SE_TECH_BINAURA, - SE_TECH_ESS_TECH, - SE_TECH_HARMAN_VMAX, - SE_TECH_NVIDEA, - SE_TECH_PHILIPS_INCREDIBLE, - SE_TECH_TEXAS_INST, - SE_TECH_VLSI_TECH -} SE_TECHNIQUE; - -typedef struct { - SE_TECHNIQUE Technique; - ULONG Center; - ULONG Depth; - ULONG Reserved; -} KSAUDIO_STEREO_ENHANCE, *PKSAUDIO_STEREO_ENHANCE; - -typedef enum { // preferred device index - KSPROPERTY_SYSAUDIO_NORMAL_DEFAULT = 0, - KSPROPERTY_SYSAUDIO_PLAYBACK_DEFAULT, - KSPROPERTY_SYSAUDIO_RECORD_DEFAULT, - KSPROPERTY_SYSAUDIO_MIDI_DEFAULT, - KSPROPERTY_SYSAUDIO_MIXER_DEFAULT -} KSPROPERTY_SYSAUDIO_DEFAULT_TYPE; - -typedef struct { - BOOL Enable; - KSPROPERTY_SYSAUDIO_DEFAULT_TYPE DeviceType; - ULONG Flags; - ULONG Reserved; -} KSAUDIO_PREFERRED_STATUS, *PKSAUDIO_PREFERRED_STATUS; -//=========================================================================== -// Topology Node Type GUIDs - -#define STATIC_KSNODETYPE_DAC\ - 0x507AE360L, 0xC554, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("507AE360-C554-11D0-8A2B-00A0C9255AC1", KSNODETYPE_DAC); -#define KSNODETYPE_DAC DEFINE_GUIDNAMED(KSNODETYPE_DAC) - -#define STATIC_KSNODETYPE_ADC\ - 0x4D837FE0L, 0xC555, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("4D837FE0-C555-11D0-8A2B-00A0C9255AC1", KSNODETYPE_ADC); -#define KSNODETYPE_ADC DEFINE_GUIDNAMED(KSNODETYPE_ADC) - -#define STATIC_KSNODETYPE_SRC\ - 0x9DB7B9E0L, 0xC555, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("9DB7B9E0-C555-11D0-8A2B-00A0C9255AC1", KSNODETYPE_SRC); -#define KSNODETYPE_SRC DEFINE_GUIDNAMED(KSNODETYPE_SRC) - -#define STATIC_KSNODETYPE_SUPERMIX\ - 0xE573ADC0L, 0xC555, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("E573ADC0-C555-11D0-8A2B-00A0C9255AC1", KSNODETYPE_SUPERMIX); -#define KSNODETYPE_SUPERMIX DEFINE_GUIDNAMED(KSNODETYPE_SUPERMIX) - -#define STATIC_KSNODETYPE_MUX\ - 0x2CEAF780L, 0xC556, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("2CEAF780-C556-11D0-8A2B-00A0C9255AC1", KSNODETYPE_MUX); -#define KSNODETYPE_MUX DEFINE_GUIDNAMED(KSNODETYPE_MUX) - -#define STATIC_KSNODETYPE_DEMUX\ - 0xC0EB67D4L, 0xE807, 0x11D0, 0x95, 0x8A, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("C0EB67D4-E807-11D0-958A-00C04FB925D3", KSNODETYPE_DEMUX); -#define KSNODETYPE_DEMUX DEFINE_GUIDNAMED(KSNODETYPE_DEMUX) - -#define STATIC_KSNODETYPE_SUM\ - 0xDA441A60L, 0xC556, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("DA441A60-C556-11D0-8A2B-00A0C9255AC1", KSNODETYPE_SUM); -#define KSNODETYPE_SUM DEFINE_GUIDNAMED(KSNODETYPE_SUM) - -#define STATIC_KSNODETYPE_MUTE\ - 0x02B223C0L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("02B223C0-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_MUTE); -#define KSNODETYPE_MUTE DEFINE_GUIDNAMED(KSNODETYPE_MUTE) - -#define STATIC_KSNODETYPE_VOLUME\ - 0x3A5ACC00L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("3A5ACC00-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_VOLUME); -#define KSNODETYPE_VOLUME DEFINE_GUIDNAMED(KSNODETYPE_VOLUME) - -#define STATIC_KSNODETYPE_TONE\ - 0x7607E580L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("7607E580-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_TONE); -#define KSNODETYPE_TONE DEFINE_GUIDNAMED(KSNODETYPE_TONE) - -#define STATIC_KSNODETYPE_EQUALIZER\ - 0x9D41B4A0L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("9D41B4A0-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_EQUALIZER); -#define KSNODETYPE_EQUALIZER DEFINE_GUIDNAMED(KSNODETYPE_EQUALIZER) - -#define STATIC_KSNODETYPE_AGC\ - 0xE88C9BA0L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("E88C9BA0-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_AGC); -#define KSNODETYPE_AGC DEFINE_GUIDNAMED(KSNODETYPE_AGC) - -#define STATIC_KSNODETYPE_NOISE_SUPPRESS\ - 0xe07f903f, 0x62fd, 0x4e60, 0x8c, 0xdd, 0xde, 0xa7, 0x23, 0x66, 0x65, 0xb5 -DEFINE_GUIDSTRUCT("E07F903F-62FD-4e60-8CDD-DEA7236665B5", KSNODETYPE_NOISE_SUPPRESS); -#define KSNODETYPE_NOISE_SUPPRESS DEFINE_GUIDNAMED(KSNODETYPE_NOISE_SUPPRESS) - -#define STATIC_KSNODETYPE_DELAY\ - 0x144981E0L, 0xC558, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("144981E0-C558-11D0-8A2B-00A0C9255AC1", KSNODETYPE_DELAY); -#define KSNODETYPE_DELAY DEFINE_GUIDNAMED(KSNODETYPE_DELAY) - -#define STATIC_KSNODETYPE_LOUDNESS\ - 0x41887440L, 0xC558, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("41887440-C558-11D0-8A2B-00A0C9255AC1", KSNODETYPE_LOUDNESS); -#define KSNODETYPE_LOUDNESS DEFINE_GUIDNAMED(KSNODETYPE_LOUDNESS) - -#define STATIC_KSNODETYPE_PROLOGIC_DECODER\ - 0x831C2C80L, 0xC558, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("831C2C80-C558-11D0-8A2B-00A0C9255AC1", KSNODETYPE_PROLOGIC_DECODER); -#define KSNODETYPE_PROLOGIC_DECODER DEFINE_GUIDNAMED(KSNODETYPE_PROLOGIC_DECODER) - -#define STATIC_KSNODETYPE_STEREO_WIDE\ - 0xA9E69800L, 0xC558, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("A9E69800-C558-11D0-8A2B-00A0C9255AC1", KSNODETYPE_STEREO_WIDE); -#define KSNODETYPE_STEREO_WIDE DEFINE_GUIDNAMED(KSNODETYPE_STEREO_WIDE) - -#define STATIC_KSNODETYPE_STEREO_ENHANCE\ - 0xAF6878ACL, 0xE83F, 0x11D0, 0x95, 0x8A, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("AF6878AC-E83F-11D0-958A-00C04FB925D3", KSNODETYPE_STEREO_ENHANCE); -#define KSNODETYPE_STEREO_ENHANCE DEFINE_GUIDNAMED(KSNODETYPE_STEREO_ENHANCE) - -#define STATIC_KSNODETYPE_REVERB\ - 0xEF0328E0L, 0xC558, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("EF0328E0-C558-11D0-8A2B-00A0C9255AC1", KSNODETYPE_REVERB); -#define KSNODETYPE_REVERB DEFINE_GUIDNAMED(KSNODETYPE_REVERB) - -#define STATIC_KSNODETYPE_CHORUS\ - 0x20173F20L, 0xC559, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("20173F20-C559-11D0-8A2B-00A0C9255AC1", KSNODETYPE_CHORUS); -#define KSNODETYPE_CHORUS DEFINE_GUIDNAMED(KSNODETYPE_CHORUS) - -#define STATIC_KSNODETYPE_3D_EFFECTS\ - 0x55515860L, 0xC559, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("55515860-C559-11D0-8A2B-00A0C9255AC1", KSNODETYPE_3D_EFFECTS); -#define KSNODETYPE_3D_EFFECTS DEFINE_GUIDNAMED(KSNODETYPE_3D_EFFECTS) - -#define STATIC_KSNODETYPE_ACOUSTIC_ECHO_CANCEL STATIC_KSCATEGORY_ACOUSTIC_ECHO_CANCEL -#define KSNODETYPE_ACOUSTIC_ECHO_CANCEL KSCATEGORY_ACOUSTIC_ECHO_CANCEL - -#define STATIC_KSALGORITHMINSTANCE_SYSTEM_ACOUSTIC_ECHO_CANCEL\ - 0x1c22c56dL, 0x9879, 0x4f5b, 0xa3, 0x89, 0x27, 0x99, 0x6d, 0xdc, 0x28, 0x10 -DEFINE_GUIDSTRUCT("1C22C56D-9879-4f5b-A389-27996DDC2810", KSALGORITHMINSTANCE_SYSTEM_ACOUSTIC_ECHO_CANCEL); -#define KSALGORITHMINSTANCE_SYSTEM_ACOUSTIC_ECHO_CANCEL DEFINE_GUIDNAMED(KSALGORITHMINSTANCE_SYSTEM_ACOUSTIC_ECHO_CANCEL) - -#define STATIC_KSALGORITHMINSTANCE_SYSTEM_NOISE_SUPPRESS\ - 0x5ab0882eL, 0x7274, 0x4516, 0x87, 0x7d, 0x4e, 0xee, 0x99, 0xba, 0x4f, 0xd0 -DEFINE_GUIDSTRUCT("5AB0882E-7274-4516-877D-4EEE99BA4FD0", KSALGORITHMINSTANCE_SYSTEM_NOISE_SUPPRESS); -#define KSALGORITHMINSTANCE_SYSTEM_NOISE_SUPPRESS DEFINE_GUIDNAMED(KSALGORITHMINSTANCE_SYSTEM_NOISE_SUPPRESS) - -#define STATIC_KSALGORITHMINSTANCE_SYSTEM_AGC\ - 0x950e55b9L, 0x877c, 0x4c67, 0xbe, 0x8, 0xe4, 0x7b, 0x56, 0x11, 0x13, 0xa -DEFINE_GUIDSTRUCT("950E55B9-877C-4c67-BE08-E47B5611130A", KSALGORITHMINSTANCE_SYSTEM_AGC); -#define KSALGORITHMINSTANCE_SYSTEM_AGC DEFINE_GUIDNAMED(KSALGORITHMINSTANCE_SYSTEM_AGC) - -#define STATIC_KSALGORITHMINSTANCE_SYSTEM_MICROPHONE_ARRAY_PROCESSOR\ - 0xB6F5A0A0L, 0x9E61, 0x4F8C, 0x91, 0xE3, 0x76, 0xCF, 0xF, 0x3C, 0x47, 0x1F -DEFINE_GUIDSTRUCT("B6F5A0A0-9E61-4f8c-91E3-76CF0F3C471F", KSALGORITHMINSTANCE_SYSTEM_MICROPHONE_ARRAY_PROCESSOR); -#define KSALGORITHMINSTANCE_SYSTEM_MICROPHONE_ARRAY_PROCESSOR DEFINE_GUIDNAMED(KSALGORITHMINSTANCE_SYSTEM_MICROPHONE_ARRAY_PROCESSOR) - - -#define STATIC_KSNODETYPE_MICROPHONE_ARRAY_PROCESSOR STATIC_KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR -#define KSNODETYPE_MICROPHONE_ARRAY_PROCESSOR KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR - -#define STATIC_KSNODETYPE_DEV_SPECIFIC\ - 0x941C7AC0L, 0xC559, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 -DEFINE_GUIDSTRUCT("941C7AC0-C559-11D0-8A2B-00A0C9255AC1", KSNODETYPE_DEV_SPECIFIC); -#define KSNODETYPE_DEV_SPECIFIC DEFINE_GUIDNAMED(KSNODETYPE_DEV_SPECIFIC) - -#define STATIC_KSNODETYPE_PROLOGIC_ENCODER\ - 0x8074C5B2L, 0x3C66, 0x11D2, 0xB4, 0x5A, 0x30, 0x78, 0x30, 0x2C, 0x20, 0x30 -DEFINE_GUIDSTRUCT("8074C5B2-3C66-11D2-B45A-3078302C2030", KSNODETYPE_PROLOGIC_ENCODER); -#define KSNODETYPE_PROLOGIC_ENCODER DEFINE_GUIDNAMED(KSNODETYPE_PROLOGIC_ENCODER) -#define KSNODETYPE_SURROUND_ENCODER KSNODETYPE_PROLOGIC_ENCODER - -#define STATIC_KSNODETYPE_PEAKMETER\ - 0xa085651eL, 0x5f0d, 0x4b36, 0xa8, 0x69, 0xd1, 0x95, 0xd6, 0xab, 0x4b, 0x9e -DEFINE_GUIDSTRUCT("A085651E-5F0D-4b36-A869-D195D6AB4B9E", KSNODETYPE_PEAKMETER); -#define KSNODETYPE_PEAKMETER DEFINE_GUIDNAMED(KSNODETYPE_PEAKMETER) - -//=========================================================================== -// Topology Node Name GUIDs for common audio nodes -#define STATIC_KSAUDFNAME_BASS\ - 0x185FEDE0L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDE0-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_BASS); -#define KSAUDFNAME_BASS DEFINE_GUIDNAMED(KSAUDFNAME_BASS) - -#define STATIC_KSAUDFNAME_TREBLE\ - 0x185FEDE1L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDE1-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_TREBLE); -#define KSAUDFNAME_TREBLE DEFINE_GUIDNAMED(KSAUDFNAME_TREBLE) - -#define STATIC_KSAUDFNAME_3D_STEREO\ - 0x185FEDE2L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDE2-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_3D_STEREO); -#define KSAUDFNAME_3D_STEREO DEFINE_GUIDNAMED(KSAUDFNAME_3D_STEREO) - -#define STATIC_KSAUDFNAME_MASTER_VOLUME\ - 0x185FEDE3L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDE3-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MASTER_VOLUME); -#define KSAUDFNAME_MASTER_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MASTER_VOLUME) - -#define STATIC_KSAUDFNAME_MASTER_MUTE\ - 0x185FEDE4L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDE4-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MASTER_MUTE); -#define KSAUDFNAME_MASTER_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MASTER_MUTE) - -#define STATIC_KSAUDFNAME_WAVE_VOLUME\ - 0x185FEDE5L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDE5-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_WAVE_VOLUME); -#define KSAUDFNAME_WAVE_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_WAVE_VOLUME) - -#define STATIC_KSAUDFNAME_WAVE_MUTE\ - 0x185FEDE6L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDE6-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_WAVE_MUTE); -#define KSAUDFNAME_WAVE_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_WAVE_MUTE) - -#define STATIC_KSAUDFNAME_MIDI_VOLUME\ - 0x185FEDE7L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDE7-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIDI_VOLUME); -#define KSAUDFNAME_MIDI_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MIDI_VOLUME) - -#define STATIC_KSAUDFNAME_MIDI_MUTE\ - 0x185FEDE8L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDE8-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIDI_MUTE); -#define KSAUDFNAME_MIDI_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MIDI_MUTE) - -#define STATIC_KSAUDFNAME_CD_VOLUME\ - 0x185FEDE9L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDE9-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_CD_VOLUME); -#define KSAUDFNAME_CD_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_CD_VOLUME) - -#define STATIC_KSAUDFNAME_CD_MUTE\ - 0x185FEDEAL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDEA-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_CD_MUTE); -#define KSAUDFNAME_CD_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_CD_MUTE) - -#define STATIC_KSAUDFNAME_LINE_VOLUME\ - 0x185FEDEBL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDEB-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_LINE_VOLUME); -#define KSAUDFNAME_LINE_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_LINE_VOLUME) - -#define STATIC_KSAUDFNAME_LINE_MUTE\ - 0x185FEDECL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDEC-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_LINE_MUTE); -#define KSAUDFNAME_LINE_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_LINE_MUTE) - -#define STATIC_KSAUDFNAME_MIC_VOLUME\ - 0x185FEDEDL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDED-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIC_VOLUME); -#define KSAUDFNAME_MIC_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MIC_VOLUME) - -#define STATIC_KSAUDFNAME_MIC_MUTE\ - 0x185FEDEEL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDEE-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIC_MUTE); -#define KSAUDFNAME_MIC_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MIC_MUTE) - -#define STATIC_KSAUDFNAME_RECORDING_SOURCE\ - 0x185FEDEFL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDEF-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_RECORDING_SOURCE); -#define KSAUDFNAME_RECORDING_SOURCE DEFINE_GUIDNAMED(KSAUDFNAME_RECORDING_SOURCE) - -#define STATIC_KSAUDFNAME_PC_SPEAKER_VOLUME\ - 0x185FEDF0L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDF0-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_PC_SPEAKER_VOLUME); -#define KSAUDFNAME_PC_SPEAKER_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_PC_SPEAKER_VOLUME) - -#define STATIC_KSAUDFNAME_PC_SPEAKER_MUTE\ - 0x185FEDF1L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDF1-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_PC_SPEAKER_MUTE); -#define KSAUDFNAME_PC_SPEAKER_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_PC_SPEAKER_MUTE) - -#define STATIC_KSAUDFNAME_MIDI_IN_VOLUME\ - 0x185FEDF2L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDF2-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIDI_IN_VOLUME); -#define KSAUDFNAME_MIDI_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MIDI_IN_VOLUME) - -#define STATIC_KSAUDFNAME_CD_IN_VOLUME\ - 0x185FEDF3L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDF3-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_CD_IN_VOLUME); -#define KSAUDFNAME_CD_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_CD_IN_VOLUME) - -#define STATIC_KSAUDFNAME_LINE_IN_VOLUME\ - 0x185FEDF4L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDF4-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_LINE_IN_VOLUME); -#define KSAUDFNAME_LINE_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_LINE_IN_VOLUME) - -#define STATIC_KSAUDFNAME_MIC_IN_VOLUME\ - 0x185FEDF5L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDF5-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIC_IN_VOLUME); -#define KSAUDFNAME_MIC_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MIC_IN_VOLUME) - -#define STATIC_KSAUDFNAME_WAVE_IN_VOLUME\ - 0x185FEDF6L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDF6-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_WAVE_IN_VOLUME); -#define KSAUDFNAME_WAVE_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_WAVE_IN_VOLUME) - -#define STATIC_KSAUDFNAME_VOLUME_CONTROL\ - 0x185FEDF7L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDF7-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_VOLUME_CONTROL); -#define KSAUDFNAME_VOLUME_CONTROL DEFINE_GUIDNAMED(KSAUDFNAME_VOLUME_CONTROL) - -#define STATIC_KSAUDFNAME_MIDI\ - 0x185FEDF8L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDF8-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIDI); -#define KSAUDFNAME_MIDI DEFINE_GUIDNAMED(KSAUDFNAME_MIDI) - -#define STATIC_KSAUDFNAME_LINE_IN\ - 0x185FEDF9L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDF9-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_LINE_IN); -#define KSAUDFNAME_LINE_IN DEFINE_GUIDNAMED(KSAUDFNAME_LINE_IN) - -#define STATIC_KSAUDFNAME_RECORDING_CONTROL\ - 0x185FEDFAL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDFA-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_RECORDING_CONTROL); -#define KSAUDFNAME_RECORDING_CONTROL DEFINE_GUIDNAMED(KSAUDFNAME_RECORDING_CONTROL) - -#define STATIC_KSAUDFNAME_CD_AUDIO\ - 0x185FEDFBL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDFB-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_CD_AUDIO); -#define KSAUDFNAME_CD_AUDIO DEFINE_GUIDNAMED(KSAUDFNAME_CD_AUDIO) - -#define STATIC_KSAUDFNAME_AUX_VOLUME\ - 0x185FEDFCL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDFC-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_AUX_VOLUME); -#define KSAUDFNAME_AUX_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_AUX_VOLUME) - -#define STATIC_KSAUDFNAME_AUX_MUTE\ - 0x185FEDFDL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDFD-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_AUX_MUTE); -#define KSAUDFNAME_AUX_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_AUX_MUTE) - -#define STATIC_KSAUDFNAME_AUX\ - 0x185FEDFEL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDFE-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_AUX); -#define KSAUDFNAME_AUX DEFINE_GUIDNAMED(KSAUDFNAME_AUX) - -#define STATIC_KSAUDFNAME_PC_SPEAKER\ - 0x185FEDFFL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEDFF-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_PC_SPEAKER); -#define KSAUDFNAME_PC_SPEAKER DEFINE_GUIDNAMED(KSAUDFNAME_PC_SPEAKER) - -#define STATIC_KSAUDFNAME_WAVE_OUT_MIX\ - 0x185FEE00L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("185FEE00-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_WAVE_OUT_MIX); -#define KSAUDFNAME_WAVE_OUT_MIX DEFINE_GUIDNAMED(KSAUDFNAME_WAVE_OUT_MIX) - -#define STATIC_KSAUDFNAME_MONO_OUT\ - 0xf9b41dc3L, 0x96e2, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 -DEFINE_GUIDSTRUCT("F9B41DC3-96E2-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_MONO_OUT); -#define KSAUDFNAME_MONO_OUT DEFINE_GUIDNAMED(KSAUDFNAME_MONO_OUT) - -#define STATIC_KSAUDFNAME_STEREO_MIX\ - 0xdff077L, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 -DEFINE_GUIDSTRUCT("00DFF077-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_STEREO_MIX); -#define KSAUDFNAME_STEREO_MIX DEFINE_GUIDNAMED(KSAUDFNAME_STEREO_MIX) - -#define STATIC_KSAUDFNAME_MONO_MIX\ - 0xdff078L, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 -DEFINE_GUIDSTRUCT("00DFF078-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_MONO_MIX); -#define KSAUDFNAME_MONO_MIX DEFINE_GUIDNAMED(KSAUDFNAME_MONO_MIX) - -#define STATIC_KSAUDFNAME_MONO_OUT_VOLUME\ - 0x1ad247ebL, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 -DEFINE_GUIDSTRUCT("1AD247EB-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_MONO_OUT_VOLUME); -#define KSAUDFNAME_MONO_OUT_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MONO_OUT_VOLUME) - -#define STATIC_KSAUDFNAME_MONO_OUT_MUTE\ - 0x1ad247ecL, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 -DEFINE_GUIDSTRUCT("1AD247EC-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_MONO_OUT_MUTE); -#define KSAUDFNAME_MONO_OUT_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MONO_OUT_MUTE) - -#define STATIC_KSAUDFNAME_STEREO_MIX_VOLUME\ - 0x1ad247edL, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 -DEFINE_GUIDSTRUCT("1AD247ED-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_STEREO_MIX_VOLUME); -#define KSAUDFNAME_STEREO_MIX_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_STEREO_MIX_VOLUME) - -#define STATIC_KSAUDFNAME_STEREO_MIX_MUTE\ - 0x22b0eafdL, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 -DEFINE_GUIDSTRUCT("22B0EAFD-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_STEREO_MIX_MUTE); -#define KSAUDFNAME_STEREO_MIX_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_STEREO_MIX_MUTE) - -#define STATIC_KSAUDFNAME_MONO_MIX_VOLUME\ - 0x22b0eafeL, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 -DEFINE_GUIDSTRUCT("22B0EAFE-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_MONO_MIX_VOLUME); -#define KSAUDFNAME_MONO_MIX_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MONO_MIX_VOLUME) - -#define STATIC_KSAUDFNAME_MONO_MIX_MUTE\ - 0x2bc31d69L, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 -DEFINE_GUIDSTRUCT("2BC31D69-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_MONO_MIX_MUTE); -#define KSAUDFNAME_MONO_MIX_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MONO_MIX_MUTE) - -#define STATIC_KSAUDFNAME_MICROPHONE_BOOST\ - 0x2bc31d6aL, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 -DEFINE_GUIDSTRUCT("2BC31D6A-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_MICROPHONE_BOOST); -#define KSAUDFNAME_MICROPHONE_BOOST DEFINE_GUIDNAMED(KSAUDFNAME_MICROPHONE_BOOST) - -#define STATIC_KSAUDFNAME_ALTERNATE_MICROPHONE\ - 0x2bc31d6bL, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 -DEFINE_GUIDSTRUCT("2BC31D6B-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_ALTERNATE_MICROPHONE); -#define KSAUDFNAME_ALTERNATE_MICROPHONE DEFINE_GUIDNAMED(KSAUDFNAME_ALTERNATE_MICROPHONE) - -#define STATIC_KSAUDFNAME_3D_DEPTH\ - 0x63ff5747L, 0x991f, 0x11d2, 0xac, 0x4d, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 -DEFINE_GUIDSTRUCT("63FF5747-991F-11d2-AC4D-00C04F8EFB68", KSAUDFNAME_3D_DEPTH); -#define KSAUDFNAME_3D_DEPTH DEFINE_GUIDNAMED(KSAUDFNAME_3D_DEPTH) - -#define STATIC_KSAUDFNAME_3D_CENTER\ - 0x9f0670b4L, 0x991f, 0x11d2, 0xac, 0x4d, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 -DEFINE_GUIDSTRUCT("9F0670B4-991F-11d2-AC4D-00C04F8EFB68", KSAUDFNAME_3D_CENTER); -#define KSAUDFNAME_3D_CENTER DEFINE_GUIDNAMED(KSAUDFNAME_3D_CENTER) - -#define STATIC_KSAUDFNAME_VIDEO_VOLUME\ - 0x9b46e708L, 0x992a, 0x11d2, 0xac, 0x4d, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 -DEFINE_GUIDSTRUCT("9B46E708-992A-11d2-AC4D-00C04F8EFB68", KSAUDFNAME_VIDEO_VOLUME); -#define KSAUDFNAME_VIDEO_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_VIDEO_VOLUME) - -#define STATIC_KSAUDFNAME_VIDEO_MUTE\ - 0x9b46e709L, 0x992a, 0x11d2, 0xac, 0x4d, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 -DEFINE_GUIDSTRUCT("9B46E709-992A-11d2-AC4D-00C04F8EFB68", KSAUDFNAME_VIDEO_MUTE); -#define KSAUDFNAME_VIDEO_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_VIDEO_MUTE) - -#define STATIC_KSAUDFNAME_VIDEO\ - 0x915daec4L, 0xa434, 0x11d2, 0xac, 0x52, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 -DEFINE_GUIDSTRUCT("915DAEC4-A434-11d2-AC52-00C04F8EFB68", KSAUDFNAME_VIDEO); -#define KSAUDFNAME_VIDEO DEFINE_GUIDNAMED(KSAUDFNAME_VIDEO) - -#define STATIC_KSAUDFNAME_PEAKMETER\ - 0x57e24340L, 0xfc5b, 0x4612, 0xa5, 0x62, 0x72, 0xb1, 0x1a, 0x29, 0xdf, 0xae -DEFINE_GUIDSTRUCT("57E24340-FC5B-4612-A562-72B11A29DFAE", KSAUDFNAME_PEAKMETER); -#define KSAUDFNAME_PEAKMETER DEFINE_GUIDNAMED(KSAUDFNAME_PEAKMETER) - -// Internal topology node pin definitions - -#define KSNODEPIN_STANDARD_IN 1 -#define KSNODEPIN_STANDARD_OUT 0 - -#define KSNODEPIN_SUM_MUX_IN 1 // can be >= 1 -#define KSNODEPIN_SUM_MUX_OUT 0 - -#define KSNODEPIN_DEMUX_IN 0 -#define KSNODEPIN_DEMUX_OUT 1 // can be >= 1 - -#define KSNODEPIN_AEC_RENDER_IN 1 -#define KSNODEPIN_AEC_RENDER_OUT 0 -#define KSNODEPIN_AEC_CAPTURE_IN 2 -#define KSNODEPIN_AEC_CAPTURE_OUT 3 - -//=========================================================================== -//=========================================================================== - -#define STATIC_KSMETHODSETID_Wavetable\ - 0xDCEF31EBL, 0xD907, 0x11D0, 0x95, 0x83, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("DCEF31EB-D907-11D0-9583-00C04FB925D3", KSMETHODSETID_Wavetable); -#define KSMETHODSETID_Wavetable DEFINE_GUIDNAMED(KSMETHODSETID_Wavetable) - -typedef enum { - KSMETHOD_WAVETABLE_WAVE_ALLOC, - KSMETHOD_WAVETABLE_WAVE_FREE, - KSMETHOD_WAVETABLE_WAVE_FIND, - KSMETHOD_WAVETABLE_WAVE_WRITE -} KSMETHOD_WAVETABLE; - -typedef struct { - KSIDENTIFIER Identifier; // wave identifier - ULONG Size; // wave size - BOOL Looped; // wave looped flag - ULONG LoopPoint; // wave loop point - BOOL InROM; // wave InROM flag - KSDATAFORMAT Format; // wave format -} KSWAVETABLE_WAVE_DESC, *PKSWAVETABLE_WAVE_DESC; - - -//=========================================================================== -//=========================================================================== - -/* - Property sets and items -*/ - -//=========================================================================== -//=========================================================================== - -#define STATIC_KSPROPSETID_Acoustic_Echo_Cancel\ - 0xd7a4af8bL, 0x3dc1, 0x4902, 0x91, 0xea, 0x8a, 0x15, 0xc9, 0x0e, 0x05, 0xb2 -DEFINE_GUIDSTRUCT("D7A4AF8B-3DC1-4902-91EA-8A15C90E05B2", KSPROPSETID_Acoustic_Echo_Cancel); -#define KSPROPSETID_Acoustic_Echo_Cancel DEFINE_GUIDNAMED(KSPROPSETID_Acoustic_Echo_Cancel) - -typedef enum { - KSPROPERTY_AEC_NOISE_FILL_ENABLE = 0, - KSPROPERTY_AEC_STATUS, - KSPROPERTY_AEC_MODE -} KSPROPERTY_AEC; - -#define AEC_STATUS_FD_HISTORY_UNINITIALIZED 0x0 -#define AEC_STATUS_FD_HISTORY_CONTINUOUSLY_CONVERGED 0x1 -#define AEC_STATUS_FD_HISTORY_PREVIOUSLY_DIVERGED 0x2 -#define AEC_STATUS_FD_CURRENTLY_CONVERGED 0x8 - -#define AEC_MODE_PASS_THROUGH 0x0 -#define AEC_MODE_HALF_DUPLEX 0x1 -#define AEC_MODE_FULL_DUPLEX 0x2 - -//=========================================================================== -//=========================================================================== - -#define STATIC_KSPROPSETID_Wave_Queued\ - 0x16a15b10L, 0x16f0, 0x11d0, 0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 -DEFINE_GUIDSTRUCT("16a15b10-16f0-11d0-a195-0020afd156e4", KSPROPSETID_Wave_Queued); -#define KSPROPSETID_Wave_Queued DEFINE_GUIDNAMED(KSPROPSETID_Wave_Queued) - -#define KSPROPERTY_WAVE_QUEUED_POSITION 0x00000001 - -#define STATIC_KSMETHODSETID_Wave_Queued\ - 0x7432c160L, 0x8827, 0x11cf, 0xa1, 0x02, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 -DEFINE_GUIDSTRUCT("7432c160-8827-11cf-a102-0020afd156e4", KSMETHODSETID_Wave_Queued); -#define KSMETHODSETID_Wave_Queued DEFINE_GUIDNAMED(KSMETHODSETID_Wave_Queued) - -#define KSMETHOD_WAVE_QUEUED_BREAKLOOP 0x00000001 - -#define STATIC_KSPROPSETID_Wave\ - 0x924e54b0L, 0x630f, 0x11cf, 0xad, 0xa7, 0x08, 0x00, 0x3e, 0x30, 0x49, 0x4a -DEFINE_GUIDSTRUCT("924e54b0-630f-11cf-ada7-08003e30494a", KSPROPSETID_Wave); -#define KSPROPSETID_Wave DEFINE_GUIDNAMED(KSPROPSETID_Wave) - -typedef enum { - KSPROPERTY_WAVE_COMPATIBLE_CAPABILITIES, - KSPROPERTY_WAVE_INPUT_CAPABILITIES, - KSPROPERTY_WAVE_OUTPUT_CAPABILITIES, - KSPROPERTY_WAVE_BUFFER, - KSPROPERTY_WAVE_FREQUENCY, - KSPROPERTY_WAVE_VOLUME, - KSPROPERTY_WAVE_PAN -} KSPROPERTY_WAVE; - -typedef struct { - ULONG ulDeviceType; -} KSWAVE_COMPATCAPS, *PKSWAVE_COMPATCAPS; - -#define KSWAVE_COMPATCAPS_INPUT 0x00000000 -#define KSWAVE_COMPATCAPS_OUTPUT 0x00000001 - -typedef struct { - ULONG MaximumChannelsPerConnection; - ULONG MinimumBitsPerSample; - ULONG MaximumBitsPerSample; - ULONG MinimumSampleFrequency; - ULONG MaximumSampleFrequency; - ULONG TotalConnections; - ULONG ActiveConnections; -} KSWAVE_INPUT_CAPABILITIES, *PKSWAVE_INPUT_CAPABILITIES; - -typedef struct { - ULONG MaximumChannelsPerConnection; - ULONG MinimumBitsPerSample; - ULONG MaximumBitsPerSample; - ULONG MinimumSampleFrequency; - ULONG MaximumSampleFrequency; - ULONG TotalConnections; - ULONG StaticConnections; - ULONG StreamingConnections; - ULONG ActiveConnections; - ULONG ActiveStaticConnections; - ULONG ActiveStreamingConnections; - ULONG Total3DConnections; - ULONG Static3DConnections; - ULONG Streaming3DConnections; - ULONG Active3DConnections; - ULONG ActiveStatic3DConnections; - ULONG ActiveStreaming3DConnections; - ULONG TotalSampleMemory; - ULONG FreeSampleMemory; - ULONG LargestFreeContiguousSampleMemory; -} KSWAVE_OUTPUT_CAPABILITIES, *PKSWAVE_OUTPUT_CAPABILITIES; - -typedef struct { - LONG LeftAttenuation; - LONG RightAttenuation; -} KSWAVE_VOLUME, *PKSWAVE_VOLUME; - -#define KSWAVE_BUFFER_ATTRIBUTEF_LOOPING 0x00000001 -#define KSWAVE_BUFFER_ATTRIBUTEF_STATIC 0x00000002 - -typedef struct { - ULONG Attributes; - ULONG BufferSize; - PVOID BufferAddress; -} KSWAVE_BUFFER, *PKSWAVE_BUFFER; - -//=========================================================================== -//=========================================================================== - -#define STATIC_KSMUSIC_TECHNOLOGY_PORT\ - 0x86C92E60L, 0x62E8, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("86C92E60-62E8-11CF-A5D6-28DB04C10000", KSMUSIC_TECHNOLOGY_PORT); -#define KSMUSIC_TECHNOLOGY_PORT DEFINE_GUIDNAMED(KSMUSIC_TECHNOLOGY_PORT) - -#define STATIC_KSMUSIC_TECHNOLOGY_SQSYNTH\ - 0x0ECF4380L, 0x62E9, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("0ECF4380-62E9-11CF-A5D6-28DB04C10000", KSMUSIC_TECHNOLOGY_SQSYNTH); -#define KSMUSIC_TECHNOLOGY_SQSYNTH DEFINE_GUIDNAMED(KSMUSIC_TECHNOLOGY_SQSYNTH) - -#define STATIC_KSMUSIC_TECHNOLOGY_FMSYNTH\ - 0x252C5C80L, 0x62E9, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("252C5C80-62E9-11CF-A5D6-28DB04C10000", KSMUSIC_TECHNOLOGY_FMSYNTH); -#define KSMUSIC_TECHNOLOGY_FMSYNTH DEFINE_GUIDNAMED(KSMUSIC_TECHNOLOGY_FMSYNTH) - -#define STATIC_KSMUSIC_TECHNOLOGY_WAVETABLE\ - 0x394EC7C0L, 0x62E9, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("394EC7C0-62E9-11CF-A5D6-28DB04C10000", KSMUSIC_TECHNOLOGY_WAVETABLE); -#define KSMUSIC_TECHNOLOGY_WAVETABLE DEFINE_GUIDNAMED(KSMUSIC_TECHNOLOGY_WAVETABLE) - -#define STATIC_KSMUSIC_TECHNOLOGY_SWSYNTH\ - 0x37407736L, 0x3620, 0x11D1, 0x85, 0xD3, 0x00, 0x00, 0xF8, 0x75, 0x43, 0x80 -DEFINE_GUIDSTRUCT("37407736-3620-11D1-85D3-0000F8754380", KSMUSIC_TECHNOLOGY_SWSYNTH); -#define KSMUSIC_TECHNOLOGY_SWSYNTH DEFINE_GUIDNAMED(KSMUSIC_TECHNOLOGY_SWSYNTH) - -#define STATIC_KSPROPSETID_WaveTable\ - 0x8539E660L, 0x62E9, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("8539E660-62E9-11CF-A5D6-28DB04C10000", KSPROPSETID_WaveTable); -#define KSPROPSETID_WaveTable DEFINE_GUIDNAMED(KSPROPSETID_WaveTable) - -typedef enum { - KSPROPERTY_WAVETABLE_LOAD_SAMPLE, - KSPROPERTY_WAVETABLE_UNLOAD_SAMPLE, - KSPROPERTY_WAVETABLE_MEMORY, - KSPROPERTY_WAVETABLE_VERSION -} KSPROPERTY_WAVETABLE; - -typedef struct { - KSDATARANGE DataRange; - GUID Technology; - ULONG Channels; - ULONG Notes; - ULONG ChannelMask; -} KSDATARANGE_MUSIC, *PKSDATARANGE_MUSIC; - -//=========================================================================== - -#define STATIC_KSEVENTSETID_Cyclic\ - 0x142C1AC0L, 0x072A, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("142C1AC0-072A-11D0-A5D6-28DB04C10000", KSEVENTSETID_Cyclic); -#define KSEVENTSETID_Cyclic DEFINE_GUIDNAMED(KSEVENTSETID_Cyclic) - -typedef enum { - KSEVENT_CYCLIC_TIME_INTERVAL, -} KSEVENT_CYCLIC_TIME; - -#define STATIC_KSPROPSETID_Cyclic\ - 0x3FFEAEA0L, 0x2BEE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("3FFEAEA0-2BEE-11CF-A5D6-28DB04C10000", KSPROPSETID_Cyclic); -#define KSPROPSETID_Cyclic DEFINE_GUIDNAMED(KSPROPSETID_Cyclic) - -typedef enum { - KSPROPERTY_CYCLIC_POSITION, -} KSPROPERTY_CYCLIC; - -//=========================================================================== -#define STATIC_KSEVENTSETID_AudioControlChange\ - 0xE85E9698L, 0xFA2F, 0x11D1, 0x95, 0xBD, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 -DEFINE_GUIDSTRUCT("E85E9698-FA2F-11D1-95BD-00C04FB925D3", KSEVENTSETID_AudioControlChange); -#define KSEVENTSETID_AudioControlChange DEFINE_GUIDNAMED(KSEVENTSETID_AudioControlChange) - -typedef enum { - KSEVENT_CONTROL_CHANGE, -} KSEVENT_AUDIO_CONTROL_CHANGE; - -//=========================================================================== - -#define STATIC_KSEVENTSETID_LoopedStreaming\ - 0x4682B940L, 0xC6EF, 0x11D0, 0x96, 0xD8, 0x00, 0xAA, 0x00, 0x51, 0xE5, 0x1D -DEFINE_GUIDSTRUCT("4682B940-C6EF-11D0-96D8-00AA0051E51D", KSEVENTSETID_LoopedStreaming); -#define KSEVENTSETID_LoopedStreaming DEFINE_GUIDNAMED(KSEVENTSETID_LoopedStreaming) - -typedef enum { - KSEVENT_LOOPEDSTREAMING_POSITION, -} KSEVENT_LOOPEDSTREAMING; - -typedef struct { - KSEVENTDATA KsEventData; -#if defined(_NTDDK_) - ULONGLONG Position; -#else // !_NTDDK_ - DWORDLONG Position; -#endif // !_NTDDK_ -} LOOPEDSTREAMING_POSITION_EVENT_DATA, *PLOOPEDSTREAMING_POSITION_EVENT_DATA ; - -//=========================================================================== -#define STATIC_KSEVENTSETID_Sysaudio \ - 0x04800320L, 0x4491, 0x11D1, 0xA0, 0x50, 0x40, 0x57, 0x05, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("04800320-4491-11D1-A050-405705C10000", KSEVENTSETID_Sysaudio); -#define KSEVENTSETID_Sysaudio DEFINE_GUIDNAMED(KSEVENTSETID_Sysaudio) - -typedef enum { - KSEVENT_SYSAUDIO_ADDREMOVE_DEVICE, - KSEVENT_SYSAUDIO_CHANGE_DEVICE -} KSEVENT_SYSAUDIO; - -//=========================================================================== -// @@BEGIN_DDKSPLIT -#define STATIC_KSPROPSETID_Sysaudio\ - 0xCBE3FAA0L, 0xCC75, 0x11D0, 0xB4, 0x65, 0x00, 0x00, 0x1A, 0x18, 0x18, 0xE6 -DEFINE_GUIDSTRUCT("CBE3FAA0-CC75-11D0-B465-00001A1818E6", KSPROPSETID_Sysaudio); -#define KSPROPSETID_Sysaudio DEFINE_GUIDNAMED(KSPROPSETID_Sysaudio) - -typedef enum { - KSPROPERTY_SYSAUDIO_DEVICE_COUNT = 1, - KSPROPERTY_SYSAUDIO_DEVICE_FRIENDLY_NAME, - KSPROPERTY_SYSAUDIO_DEVICE_INSTANCE, - KSPROPERTY_SYSAUDIO_DEVICE_INTERFACE_NAME, - KSPROPERTY_SYSAUDIO_SELECT_GRAPH, - KSPROPERTY_SYSAUDIO_CREATE_VIRTUAL_SOURCE, - KSPROPERTY_SYSAUDIO_DEVICE_DEFAULT, - KSPROPERTY_SYSAUDIO_ALWAYS_CREATE_VIRTUAL_SOURCE, - KSPROPERTY_SYSAUDIO_ADDREMOVE_LOCK, - KSPROPERTY_SYSAUDIO_ADDREMOVE_UNLOCK, - KSPROPERTY_SYSAUDIO_RENDER_PIN_INSTANCES, - KSPROPERTY_SYSAUDIO_RENDER_CONNECTION_INDEX, - KSPROPERTY_SYSAUDIO_CREATE_VIRTUAL_SOURCE_ONLY, - KSPROPERTY_SYSAUDIO_INSTANCE_INFO, - KSPROPERTY_SYSAUDIO_PREFERRED_DEVICE, - KSPROPERTY_SYSAUDIO_COMPONENT_ID, - KSPROPERTY_SYSAUDIO_ADDREMOVE_GFX -} KSPROPERTY_SYSAUDIO; - -typedef struct { - KSPROPERTY Property; - GUID PinCategory; - GUID PinName; -} SYSAUDIO_CREATE_VIRTUAL_SOURCE, *PSYSAUDIO_CREATE_VIRTUAL_SOURCE; - -typedef struct { - BOOL Enable; - HANDLE hGfx; - ULONG ulOrder; // Order of the GFX - ULONG ulType; // Type of the GFX - ULONG ulFlags; - ULONG ulDeviceNameOffset; // DeviceInterface on which this GFX needs to be attached - ULONG ulFriendlyNameOffset; // Friendly name of the GFX -} SYSAUDIO_GFX, *PSYSAUDIO_GFX; - -#define GFX_DEVICETYPE_RENDER 1 -#define GFX_DEVICETYPE_CAPTURE 2 - -typedef struct { - KSPROPERTY Property; - ULONG PinId; - ULONG NodeId; - ULONG Flags; - ULONG Reserved; -} SYSAUDIO_SELECT_GRAPH, *PSYSAUDIO_SELECT_GRAPH; - -typedef struct { - KSPROPERTY Property; - ULONG Flags; - ULONG DeviceNumber; -} SYSAUDIO_INSTANCE_INFO, *PSYSAUDIO_INSTANCE_INFO; - -#define SYSAUDIO_FLAGS_DONT_COMBINE_PINS 0x00000001 - - -typedef struct { - KSPROPERTY Property; - ULONG Flags; - ULONG Index; // KSPROPERTY_SYSAUDIO_DEFAULT_TYPE -} SYSAUDIO_PREFERRED_DEVICE, *PSYSAUDIO_PREFERRED_DEVICE; - -#define SYSAUDIO_FLAGS_CLEAR_PREFERRED 0x00000002 - -#define STATIC_KSPROPSETID_Sysaudio_Pin \ - 0xA3A53220L, 0xC6E4, 0x11D0, 0xB4, 0x65, 0x00, 0x00, 0x1A, 0x18, 0x18, 0xE6 -DEFINE_GUIDSTRUCT("A3A53220-C6E4-11D0-B465-00001A1818E6", KSPROPSETID_Sysaudio_Pin); -#define KSPROPSETID_Sysaudio_Pin DEFINE_GUIDNAMED(KSPROPSETID_Sysaudio_Pin) - -typedef enum { - KSPROPERTY_SYSAUDIO_TOPOLOGY_CONNECTION_INDEX, - KSPROPERTY_SYSAUDIO_ATTACH_VIRTUAL_SOURCE, - KSPROPERTY_SYSAUDIO_PIN_VOLUME_NODE -} KSPROPERTY_SYSAUDIO_PIN; - -typedef struct { - KSPROPERTY Property; - ULONG MixerPinId; - ULONG Reserved; -} SYSAUDIO_ATTACH_VIRTUAL_SOURCE, *PSYSAUDIO_ATTACH_VIRTUAL_SOURCE; -// @@END_DDKSPLIT - -//=========================================================================== -typedef struct { - KSPROPERTY Property; - ULONG NodeId; - ULONG Reserved; -} KSNODEPROPERTY, *PKSNODEPROPERTY; - -typedef struct { - KSNODEPROPERTY NodeProperty; - LONG Channel; // value to get or set - ULONG Reserved; -} KSNODEPROPERTY_AUDIO_CHANNEL, *PKSNODEPROPERTY_AUDIO_CHANNEL; - -typedef struct { - KSNODEPROPERTY NodeProperty; - ULONG DevSpecificId; - ULONG DeviceInfo; - ULONG Length; -} KSNODEPROPERTY_AUDIO_DEV_SPECIFIC, *PKSNODEPROPERTY_AUDIO_DEV_SPECIFIC; - -typedef struct { - KSNODEPROPERTY NodeProperty; - PVOID ListenerId; -#ifndef _WIN64 - ULONG Reserved; -#endif // _WIN64 -} KSNODEPROPERTY_AUDIO_3D_LISTENER, *PKSNODEPROPERTY_AUDIO_3D_LISTENER; - -typedef struct { - KSNODEPROPERTY NodeProperty; - PVOID AppContext; - ULONG Length; -#ifndef _WIN64 - ULONG Reserved; -#endif // _WIN64 -} KSNODEPROPERTY_AUDIO_PROPERTY, *PKSNODEPROPERTY_AUDIO_PROPERTY; - -//=========================================================================== -// {79A9312E-59AE-43b0-A350-8B05284CAB24} -#define STATIC_KSPROPSETID_AudioGfx\ - 0x79a9312eL, 0x59ae, 0x43b0, 0xa3, 0x50, 0x8b, 0x5, 0x28, 0x4c, 0xab, 0x24 -DEFINE_GUIDSTRUCT("79A9312E-59AE-43b0-A350-8B05284CAB24", KSPROPSETID_AudioGfx); -#define KSPROPSETID_AudioGfx DEFINE_GUIDNAMED(KSPROPSETID_AudioGfx) - -typedef enum { - KSPROPERTY_AUDIOGFX_RENDERTARGETDEVICEID, - KSPROPERTY_AUDIOGFX_CAPTURETARGETDEVICEID -} KSPROPERTY_AUDIOGFX; - -//=========================================================================== - -#define STATIC_KSPROPSETID_Linear\ - 0x5A2FFE80L, 0x16B9, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("5A2FFE80-16B9-11D0-A5D6-28DB04C10000", KSPROPSETID_Linear); -#define KSPROPSETID_Linear DEFINE_GUIDNAMED(KSPROPSETID_Linear) - -typedef enum { - KSPROPERTY_LINEAR_POSITION, -} KSPROPERTY_LINEAR; - -//=========================================================================== - -// -// Midi definitions -// - -/* - Formats -*/ - -#define STATIC_KSDATAFORMAT_TYPE_MUSIC\ - 0xE725D360L, 0x62CC, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("E725D360-62CC-11CF-A5D6-28DB04C10000", KSDATAFORMAT_TYPE_MUSIC); -#define KSDATAFORMAT_TYPE_MUSIC DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MUSIC) - -// 'mids' == MEDIATYPE_Midi -#define STATIC_KSDATAFORMAT_TYPE_MIDI\ - 0x7364696DL, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 -DEFINE_GUIDSTRUCT("7364696D-0000-0010-8000-00aa00389b71", KSDATAFORMAT_TYPE_MIDI); -#define KSDATAFORMAT_TYPE_MIDI DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MIDI) - -#define STATIC_KSDATAFORMAT_SUBTYPE_MIDI\ - 0x1D262760L, 0xE957, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("1D262760-E957-11CF-A5D6-28DB04C10000", KSDATAFORMAT_SUBTYPE_MIDI); -#define KSDATAFORMAT_SUBTYPE_MIDI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MIDI) - -#define STATIC_KSDATAFORMAT_SUBTYPE_MIDI_BUS\ - 0x2CA15FA0L, 0x6CFE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 -DEFINE_GUIDSTRUCT("2CA15FA0-6CFE-11CF-A5D6-28DB04C10000", KSDATAFORMAT_SUBTYPE_MIDI_BUS); -#define KSDATAFORMAT_SUBTYPE_MIDI_BUS DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MIDI_BUS) - -#define STATIC_KSDATAFORMAT_SUBTYPE_RIFFMIDI\ - 0x4995DAF0L, 0x9EE6, 0x11D0, 0xA4, 0x0E, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("4995DAF0-9EE6-11D0-A40E-00A0C9223196", KSDATAFORMAT_SUBTYPE_RIFFMIDI); -#define KSDATAFORMAT_SUBTYPE_RIFFMIDI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_RIFFMIDI) - -/* - KSDATAFORMAT_SUBTYPE_DIRECTMUSIC - see DMusicKS.h -*/ - -// WARNING! This structure MUST be dword aligned -// regardless of the number of data bytes. - -typedef struct { - ULONG TimeDeltaMs; // Delta Milliseconds from the previous midiformat - // in the packet. The first midiformat in the packet - // is a delta from the PTS in the KSSTREAM_HEADER. - ULONG ByteCount; // Number of bytes of data that follow this struct. -} KSMUSICFORMAT, *PKSMUSICFORMAT; - -// -// This entire set of MPEG Standard/Dialect Guids are obsolete. Do not use them. -// -//==================================================================================================== -//==================================================================================================== -// The following official MPEG Formats, Subtypes and Specifiers are listed as required or optional -// These official MPEG GUIDs are the preferred method of supporting MPEG/AC-3 media types in new code. -// Older MPEG GUIDs should also be supported for compatibilty, but these new modes are still required. -//==================================================================================================== -//==================================================================================================== - -/* -This is a summary of what media types/specifiers will be required for all DVD+DSS+DVB+DTV MPEG decoders. -These media types are what the decoder driver must accept, hardware support for all of these media types -may or may not actually be provided by the decoder natively. These media types are intended to define -the "officially" supported MPEG/AC-3 media types that all WHQL certified decoders must implement. This -specifically includes driver and/or hardware support for all the required standards and dialects. - -All MPEG video decoders must support all of the MPEG video modes shown as [required] below. -All MPEG audio decoders must support all of the MPEG audio modes shown as [required] below. -All AC-3 audio decoders must support all of the AC-3 audio modes shown as [required] below. -The line items shown as [optional] need not be implemented, but are possible formats that might be implemented. - -Note that the input/output pin formats are defined by 2 or 3 GUIDs: TYPE, SUBTYPE, and maybe SPECIFIER. -The specifiers are included if the data format is a "dialect" that needs to be differentiated during decoding. -The decoder MUST be prepared to deal with ALL requests for _required_ "Standard" formats OR _required_ "Dialects". - -STATIC_KSDATAFORMAT_TYPE_STANDARD_ELEMENTARY_STREAM [required] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO [optional] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO [optional] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO [required] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO [optional] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO [optional] -STATIC_KSDATAFORMAT_TYPE_STANDARD_PES_PACKET [required] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO [optional] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO [optional] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO [optional] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO [optional] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO [required] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO [required] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO [optional] -STATIC_KSDATAFORMAT_TYPE_STANDARD_PACK_HEADER [required] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO [required] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO [optional] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO [optional] - -Note that the SPECIFIER GUIDs normally identify particular versions of MPEG such as DSS and DVD. -This approach was taken to minimize the number of DSS/DVB/DVD/DTV etc. media SUBTYPES. -These specifiers are currently required to disambiguate MPEG syntax _parsing_ by the decoder -using alternate parsing routines or downloadable firmware or hardware decode settings. - -In the future these specifiers will be extended to cover new KS MPEG flavors such as DVB and DTV. -Thus, the optional specifiers will be subject to clarification and/or definition as they are needed. - -Important note: Per the ITU MPEG specs, MPEG 2 media may contain pure MPEG 1 syntax and -any "MPEG 2" PES packets may actually contain MPEG 1 payloads and MPEG 1 syntax. Some MPEG -broadcasts can revert from MPEG2 to MPEG1 format data at their discretion, without warning. - -CAUTION: Decoders MUST attempt to process MPEG data AS SOON AS POSSIBLE after reception. -In particular, elementary MPEG or MPEG PES packet streams should not be aggregated into DVD -"pack headers" internally before submission to the codec hardware if AT ALL POSSIBLE. The -reason is that mpeg data may need to be processed immediately but there may be no additional -MPEG data forthcoming to fill up the PES packet OR DVD "pack" in a timely fashion. This is -particularly true of MPEG dialects that utilize "repeat field signally" to reuse the last -decoded MPEG video field. - -*/ - -///////////////////////////////////////////////////////////////////////// -// The major data type GUIDs that define the data packet encapsulation // -///////////////////////////////////////////////////////////////////////// - -// STATIC_KSDATAFORMAT_TYPE_STANDARD_ELEMENTARY_STREAM -#define STATIC_KSDATAFORMAT_TYPE_STANDARD_ELEMENTARY_STREAM \ - 0x36523b11L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a -DEFINE_GUIDSTRUCT("36523B11-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_TYPE_STANDARD_ELEMENTARY_STREAM ); -#define KSDATAFORMAT_TYPE_STANDARD_ELEMENTARY_STREAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STANDARD_ELEMENTARY_STREAM) - -// STATIC_KSDATAFORMAT_TYPE_STANDARD_PES_PACKET -#define STATIC_KSDATAFORMAT_TYPE_STANDARD_PES_PACKET \ - 0x36523b12L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a -DEFINE_GUIDSTRUCT("36523B12-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_TYPE_STANDARD_PES_PACKET ); -#define KSDATAFORMAT_TYPE_STANDARD_PES_PACKET DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STANDARD_PES_PACKET) - -// STATIC_KSDATAFORMAT_TYPE_STANDARD_PACK_HEADER -#define STATIC_KSDATAFORMAT_TYPE_STANDARD_PACK_HEADER \ - 0x36523b13L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a -DEFINE_GUIDSTRUCT("36523B13-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_TYPE_STANDARD_PACK_HEADER ); -#define KSDATAFORMAT_TYPE_STANDARD_PACK_HEADER DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STANDARD_PACK_HEADER) - -/////////////////////////////////////////////////////////////////////////////// -// The minor data subtype GUIDs that define the exact class of the data type.// -/////////////////////////////////////////////////////////////////////////////// - -// STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO -#define STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO \ - 0x36523b21L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a -DEFINE_GUIDSTRUCT("36523B21-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO ); -#define KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO) - -// STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO -#define STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO \ - 0x36523b22L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a -DEFINE_GUIDSTRUCT("36523B22-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO ); -#define KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO) - -// STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO -#define STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO \ - 0x36523b23L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a -DEFINE_GUIDSTRUCT("36523B23-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO ); -#define KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO) - -// STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO -#define STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO \ - 0x36523b24L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a -DEFINE_GUIDSTRUCT("36523B24-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO ); -#define KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO) - -// STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO -#define STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO \ - 0x36523b25L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a -DEFINE_GUIDSTRUCT("36523B25-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO ); -#define KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO) - -/////////////////////////////////////////////////////////////////////////////// -// The low-level specifier GUIDs that define the flavor of the data subtype. // -// Some SUBTYPES, notably MPEG2_VIDEO, MPEG2_AUDIO have different dialects. // -// These specifiers are intended to be accompanied by a specifier structure. // -/////////////////////////////////////////////////////////////////////////////// - -// STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO -#define STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO \ - 0x36523b31L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a -DEFINE_GUIDSTRUCT("36523B31-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO ); -#define KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO) - -// STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO -#define STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO \ - 0x36523b32L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a -DEFINE_GUIDSTRUCT("36523B32-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO ); -#define KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO) - -// STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO Associated with KS_MPEGVIDEOINFO2 defined later -#define STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO \ - 0x36523b33L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a -DEFINE_GUIDSTRUCT("36523B33-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO ); -#define KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO) - -// STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO Associated with KS_MPEGAUDIOINFO defined later -#define STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO \ - 0x36523b34L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a -DEFINE_GUIDSTRUCT("36523B34-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO ); -#define KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO) - -// STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO -#define STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO \ - 0x36523b35L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a -DEFINE_GUIDSTRUCT("36523B35-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO ); -#define KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO) - -//==================================================================================================== -//==================================================================================================== -// *** COMPATIBILITY WARNING *** -// The *following* older DSS, MPEG, DVD & AC-3 GUID definitions are retained for backward compability. -// These MPEG GUIDs should also be supported for compatibilty, but the above newer modes are still required. -//==================================================================================================== -//==================================================================================================== - -// -// DSS definitions -// - -#define STATIC_KSDATAFORMAT_SUBTYPE_DSS_VIDEO\ - 0xa0af4f81L, 0xe163, 0x11d0, 0xba, 0xd9, 0x00, 0x60, 0x97, 0x44, 0x11, 0x1a -DEFINE_GUIDSTRUCT("a0af4f81-e163-11d0-bad9-00609744111a", KSDATAFORMAT_SUBTYPE_DSS_VIDEO); -#define KSDATAFORMAT_SUBTYPE_DSS_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DSS_VIDEO) - -#define STATIC_KSDATAFORMAT_SUBTYPE_DSS_AUDIO\ - 0xa0af4f82L, 0xe163, 0x11d0, 0xba, 0xd9, 0x00, 0x60, 0x97, 0x44, 0x11, 0x1a -DEFINE_GUIDSTRUCT("a0af4f82-e163-11d0-bad9-00609744111a", KSDATAFORMAT_SUBTYPE_DSS_AUDIO); -#define KSDATAFORMAT_SUBTYPE_DSS_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DSS_AUDIO) - -// -// End of obsolete MPEG definitions. -// - -// -// mpeg 1 definitions -// -#define STATIC_KSDATAFORMAT_SUBTYPE_MPEG1Packet\ - 0xe436eb80, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 -DEFINE_GUIDSTRUCT("e436eb80-524f-11ce-9F53-0020af0ba770", KSDATAFORMAT_SUBTYPE_MPEG1Packet); -#define KSDATAFORMAT_SUBTYPE_MPEG1Packet DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG1Packet) - -#define STATIC_KSDATAFORMAT_SUBTYPE_MPEG1Payload\ - 0xe436eb81, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 -DEFINE_GUIDSTRUCT("e436eb81-524f-11ce-9F53-0020af0ba770", KSDATAFORMAT_SUBTYPE_MPEG1Payload); -#define KSDATAFORMAT_SUBTYPE_MPEG1Payload DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG1Payload) - -// MEDIASUBTYPE_MPEG1Video -#define STATIC_KSDATAFORMAT_SUBTYPE_MPEG1Video\ - 0xe436eb86, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 -DEFINE_GUIDSTRUCT("e436eb86-524f-11ce-9f53-0020af0ba770", KSDATAFORMAT_SUBTYPE_MPEG1Video); -#define KSDATAFORMAT_SUBTYPE_MPEG1Video DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG1Video) - -//FORMAT_MPEGVideo -#define STATIC_KSDATAFORMAT_SPECIFIER_MPEG1_VIDEO\ - 0x05589f82L, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a -DEFINE_GUIDSTRUCT("05589f82-c356-11ce-bf01-00aa0055595a", KSDATAFORMAT_SPECIFIER_MPEG1_VIDEO); -#define KSDATAFORMAT_SPECIFIER_MPEG1_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_MPEG1_VIDEO) - -// -// mpeg 2 definitions -// -#define STATIC_KSDATAFORMAT_TYPE_MPEG2_PES\ - 0xe06d8020L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea -DEFINE_GUIDSTRUCT("e06d8020-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_TYPE_MPEG2_PES); -#define KSDATAFORMAT_TYPE_MPEG2_PES DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MPEG2_PES) - -#define STATIC_KSDATAFORMAT_TYPE_MPEG2_PROGRAM\ - 0xe06d8022L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea -DEFINE_GUIDSTRUCT("e06d8022-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_TYPE_MPEG2_PROGRAM); -#define KSDATAFORMAT_TYPE_MPEG2_PROGRAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MPEG2_PROGRAM) - -#define STATIC_KSDATAFORMAT_TYPE_MPEG2_TRANSPORT\ - 0xe06d8023L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea -DEFINE_GUIDSTRUCT("e06d8023-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_TYPE_MPEG2_TRANSPORT); -#define KSDATAFORMAT_TYPE_MPEG2_TRANSPORT DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MPEG2_TRANSPORT) - -#define STATIC_KSDATAFORMAT_SUBTYPE_MPEG2_VIDEO\ - 0xe06d8026L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea -DEFINE_GUIDSTRUCT("e06d8026-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SUBTYPE_MPEG2_VIDEO); -#define KSDATAFORMAT_SUBTYPE_MPEG2_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG2_VIDEO) - -// use MPEGVIDEOINFO2 (defined below) with KSDATAFORMAT_SPECIFIER_MPEG2_VIDEO -#define STATIC_KSDATAFORMAT_SPECIFIER_MPEG2_VIDEO\ - 0xe06d80e3L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea -DEFINE_GUIDSTRUCT("e06d80e3-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SPECIFIER_MPEG2_VIDEO); -#define KSDATAFORMAT_SPECIFIER_MPEG2_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_MPEG2_VIDEO) - - -// -// Mpeg2 video properties -// - - -#define STATIC_KSPROPSETID_Mpeg2Vid\ - 0xC8E11B60L, 0x0CC9, 0x11D0, 0xBD, 0x69, 0x00, 0x35, 0x05, 0xC1, 0x03, 0xA9 -DEFINE_GUIDSTRUCT("C8E11B60-0CC9-11D0-BD69-003505C103A9", KSPROPSETID_Mpeg2Vid); -#define KSPROPSETID_Mpeg2Vid DEFINE_GUIDNAMED( KSPROPSETID_Mpeg2Vid ) - - -typedef enum { - KSPROPERTY_MPEG2VID_MODES, // available output modes of decoder - KSPROPERTY_MPEG2VID_CUR_MODE, // current mode of the decoder - KSPROPERTY_MPEG2VID_4_3_RECT, // output coordinates for 4:3 source - KSPROPERTY_MPEG2VID_16_9_RECT, // output coordinates for 16:9 source - KSPROPERTY_MPEG2VID_16_9_PANSCAN, // pan and scan vectors -} KSPROPERTY_MPEG2VID; - -// -// bit field definitions for MPEG2 VIDEO mode -// - -#define KSMPEGVIDMODE_PANSCAN 0x0001 -#define KSMPEGVIDMODE_LTRBOX 0x0002 -#define KSMPEGVIDMODE_SCALE 0x0004 - -// -// rectangle definitions for the 4/3 and 16/9 cropping properties of -// the MPEG2Video decoder -// - -typedef struct _KSMPEGVID_RECT { - ULONG StartX; - ULONG StartY; - ULONG EndX; - ULONG EndY; -} KSMPEGVID_RECT, *PKSMPEGVID_RECT; - -// -// Params for pan / scan -// - - -// -// MPEG2 Audio definition -// - -#define STATIC_KSDATAFORMAT_SUBTYPE_MPEG2_AUDIO\ - 0xe06d802bL, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea -DEFINE_GUIDSTRUCT("e06d802b-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SUBTYPE_MPEG2_AUDIO); -#define KSDATAFORMAT_SUBTYPE_MPEG2_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG2_AUDIO) - -#define STATIC_KSDATAFORMAT_SPECIFIER_MPEG2_AUDIO\ - 0xe06d80e5L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea -DEFINE_GUIDSTRUCT("e06d80e5-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SPECIFIER_MPEG2_AUDIO); -#define KSDATAFORMAT_SPECIFIER_MPEG2_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_MPEG2_AUDIO) - -// -// DVD LPCM Audio definition -// - -#define STATIC_KSDATAFORMAT_SUBTYPE_LPCM_AUDIO\ - 0xe06d8032L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea -DEFINE_GUIDSTRUCT("e06d8032-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SUBTYPE_LPCM_AUDIO); -#define KSDATAFORMAT_SUBTYPE_LPCM_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_LPCM_AUDIO) - -#define STATIC_KSDATAFORMAT_SPECIFIER_LPCM_AUDIO\ - 0xe06d80e6L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea -DEFINE_GUIDSTRUCT("e06d80e6-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SPECIFIER_LPCM_AUDIO); -#define KSDATAFORMAT_SPECIFIER_LPCM_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_LPCM_AUDIO) - -// -// AC-3 definition -// - -#define STATIC_KSDATAFORMAT_SUBTYPE_AC3_AUDIO\ - 0xe06d802cL, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea -DEFINE_GUIDSTRUCT("e06d802c-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SUBTYPE_AC3_AUDIO); -#define KSDATAFORMAT_SUBTYPE_AC3_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_AC3_AUDIO) - -#define STATIC_KSDATAFORMAT_SPECIFIER_AC3_AUDIO\ - 0xe06d80e4L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea -DEFINE_GUIDSTRUCT("e06d80e4-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SPECIFIER_AC3_AUDIO); -#define KSDATAFORMAT_SPECIFIER_AC3_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_AC3_AUDIO) - -#define STATIC_KSPROPSETID_AC3\ - 0xBFABE720L, 0x6E1F, 0x11D0, 0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00 -DEFINE_GUIDSTRUCT("BFABE720-6E1F-11D0-BCF2-444553540000", KSPROPSETID_AC3); -#define KSPROPSETID_AC3 DEFINE_GUIDNAMED(KSPROPSETID_AC3) - -typedef enum { - KSPROPERTY_AC3_ERROR_CONCEALMENT = 1, - KSPROPERTY_AC3_ALTERNATE_AUDIO, - KSPROPERTY_AC3_DOWNMIX, - KSPROPERTY_AC3_BIT_STREAM_MODE, - KSPROPERTY_AC3_DIALOGUE_LEVEL, - KSPROPERTY_AC3_LANGUAGE_CODE, - KSPROPERTY_AC3_ROOM_TYPE -} KSPROPERTY_AC3; - -typedef struct { - BOOL fRepeatPreviousBlock; - BOOL fErrorInCurrentBlock; -} KSAC3_ERROR_CONCEALMENT, *PKSAC3_ERROR_CONCEALMENT; - -typedef struct { - BOOL fStereo; - ULONG DualMode; -} KSAC3_ALTERNATE_AUDIO, *PKSAC3_ALTERNATE_AUDIO; - -#define KSAC3_ALTERNATE_AUDIO_1 1 -#define KSAC3_ALTERNATE_AUDIO_2 2 -#define KSAC3_ALTERNATE_AUDIO_BOTH 3 - -typedef struct { - BOOL fDownMix; - BOOL fDolbySurround; -} KSAC3_DOWNMIX, *PKSAC3_DOWNMIX; - -typedef struct { - LONG BitStreamMode; -} KSAC3_BIT_STREAM_MODE, *PKSAC3_BIT_STREAM_MODE; - -#define KSAC3_SERVICE_MAIN_AUDIO 0 -#define KSAC3_SERVICE_NO_DIALOG 1 -#define KSAC3_SERVICE_VISUALLY_IMPAIRED 2 -#define KSAC3_SERVICE_HEARING_IMPAIRED 3 -#define KSAC3_SERVICE_DIALOG_ONLY 4 -#define KSAC3_SERVICE_COMMENTARY 5 -#define KSAC3_SERVICE_EMERGENCY_FLASH 6 -#define KSAC3_SERVICE_VOICE_OVER 7 - -typedef struct { - ULONG DialogueLevel; -} KSAC3_DIALOGUE_LEVEL, *PKSAC3_DIALOGUE_LEVEL; - -typedef struct { - BOOL fLargeRoom; -} KSAC3_ROOM_TYPE, *PKSAC3_ROOM_TYPE; - - -// -// DTS and SDDS definitions (media subtype GUIDs) -// -#define STATIC_KSDATAFORMAT_SUBTYPE_DTS_AUDIO\ - 0xe06d8033L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea -DEFINE_GUIDSTRUCT("e06d8033-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SUBTYPE_DTS_AUDIO); -#define KSDATAFORMAT_SUBTYPE_DTS_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DTS_AUDIO) - -#define STATIC_KSDATAFORMAT_SUBTYPE_SDDS_AUDIO\ - 0xe06d8034L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea -DEFINE_GUIDSTRUCT("e06d8034-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SUBTYPE_SDDS_AUDIO); -#define KSDATAFORMAT_SUBTYPE_SDDS_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_SDDS_AUDIO) - - -// -// audio decoder output properties -// - -#define STATIC_KSPROPSETID_AudioDecoderOut\ - 0x6ca6e020L, 0x43bd, 0x11d0, 0xbd, 0x6a, 0x00, 0x35, 0x05, 0xc1, 0x03, 0xa9 -DEFINE_GUIDSTRUCT("6ca6e020-43bd-11d0-bd6a-003505c103a9", KSPROPSETID_AudioDecoderOut); -#define KSPROPSETID_AudioDecoderOut DEFINE_GUIDNAMED(KSPROPSETID_AudioDecoderOut) - -typedef enum { - KSPROPERTY_AUDDECOUT_MODES, // available output modes of decoder - KSPROPERTY_AUDDECOUT_CUR_MODE, // current mode of the decoder -} KSPROPERTY_AUDDECOUT; - -#define KSAUDDECOUTMODE_STEREO_ANALOG 0x0001 -#define KSAUDDECOUTMODE_PCM_51 0x0002 -#define KSAUDDECOUTMODE_SPDIFF 0x0004 - - - -// -// subpicture definition -// - -#define STATIC_KSDATAFORMAT_SUBTYPE_SUBPICTURE\ - 0xe06d802dL, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea -DEFINE_GUIDSTRUCT("e06d802d-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SUBTYPE_SUBPICTURE); -#define KSDATAFORMAT_SUBTYPE_SUBPICTURE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_SUBPICTURE) - - -#define STATIC_KSPROPSETID_DvdSubPic\ - 0xac390460L, 0x43af, 0x11d0, 0xbd, 0x6a, 0x00, 0x35, 0x05, 0xc1, 0x03, 0xa9 -DEFINE_GUIDSTRUCT("ac390460-43af-11d0-bd6a-003505c103a9", KSPROPSETID_DvdSubPic); -#define KSPROPSETID_DvdSubPic DEFINE_GUIDNAMED(KSPROPSETID_DvdSubPic) - -typedef enum { - KSPROPERTY_DVDSUBPIC_PALETTE, - KSPROPERTY_DVDSUBPIC_HLI, - KSPROPERTY_DVDSUBPIC_COMPOSIT_ON, // TRUE for subpicture is displayed -} KSPROPERTY_DVDSUBPIC; - -typedef struct _KS_DVD_YCrCb { - UCHAR Reserved; - UCHAR Y; - UCHAR Cr; - UCHAR Cb; -} KS_DVD_YCrCb, *PKS_DVD_YCrCb; - -/* The KS_DVD_YUV structure is now superseded by KS_DVD_YCrCb above and is - here for backward compatibility only */ - -typedef struct _KS_DVD_YUV { - UCHAR Reserved; - UCHAR Y; - UCHAR V; - UCHAR U; -} KS_DVD_YUV, *PKS_DVD_YUV; - -typedef struct _KSPROPERTY_SPPAL { - KS_DVD_YUV sppal[16]; -} KSPROPERTY_SPPAL, *PKSPROPERTY_SPPAL; - -typedef struct _KS_COLCON { - UCHAR emph1col:4; - UCHAR emph2col:4; - UCHAR backcol:4; - UCHAR patcol:4; - UCHAR emph1con:4; - UCHAR emph2con:4; - UCHAR backcon:4; - UCHAR patcon:4; - -} KS_COLCON, *PKS_COLCON; - -typedef struct _KSPROPERTY_SPHLI { - USHORT HLISS; - USHORT Reserved; - ULONG StartPTM; // start presentation time in x/90000 - ULONG EndPTM; // end PTM in x/90000 - USHORT StartX; - USHORT StartY; - USHORT StopX; - USHORT StopY; - KS_COLCON ColCon; // color contrast description (4 bytes as given in HLI) -} KSPROPERTY_SPHLI, *PKSPROPERTY_SPHLI; - -typedef BOOL KSPROPERTY_COMPOSIT_ON, *PKSPROPERTY_COMPOSIT_ON; - -#define STATIC_KSPROPSETID_CopyProt \ - 0x0E8A0A40L, 0x6AEF, 0x11D0, 0x9E, 0xD0, 0x00, 0xA0, 0x24, 0xCA, 0x19, 0xB3 -DEFINE_GUIDSTRUCT("0E8A0A40-6AEF-11D0-9ED0-00A024CA19B3", KSPROPSETID_CopyProt); -#define KSPROPSETID_CopyProt DEFINE_GUIDNAMED(KSPROPSETID_CopyProt) - -typedef enum { - - KSPROPERTY_DVDCOPY_CHLG_KEY = 0x01, - KSPROPERTY_DVDCOPY_DVD_KEY1, - KSPROPERTY_DVDCOPY_DEC_KEY2, - KSPROPERTY_DVDCOPY_TITLE_KEY, - KSPROPERTY_COPY_MACROVISION, - KSPROPERTY_DVDCOPY_REGION, - KSPROPERTY_DVDCOPY_SET_COPY_STATE, - KSPROPERTY_DVDCOPY_DISC_KEY = 0x80 - -} KSPROPERTY_COPYPROT; - -typedef struct _KS_DVDCOPY_CHLGKEY { - BYTE ChlgKey[10]; - BYTE Reserved[2]; -} KS_DVDCOPY_CHLGKEY, *PKS_DVDCOPY_CHLGKEY; - -typedef struct _KS_DVDCOPY_BUSKEY { - BYTE BusKey[5]; - BYTE Reserved[1]; -} KS_DVDCOPY_BUSKEY, *PKS_DVDCOPY_BUSKEY; - - -typedef struct _KS_DVDCOPY_DISCKEY { - BYTE DiscKey[2048]; -} KS_DVDCOPY_DISCKEY, *PKS_DVDCOPY_DISCKEY; - -typedef struct _KS_DVDCOPY_REGION { - UCHAR Reserved; - UCHAR RegionData; - UCHAR Reserved2[2]; -} KS_DVDCOPY_REGION, *PKS_DVDCOPY_REGION; - -typedef struct _KS_DVDCOPY_TITLEKEY { - ULONG KeyFlags; - ULONG ReservedNT[2]; - UCHAR TitleKey[6]; - UCHAR Reserved[2]; -} KS_DVDCOPY_TITLEKEY, *PKS_DVDCOPY_TITLEKEY; - -typedef struct _KS_COPY_MACROVISION { - ULONG MACROVISIONLevel; -} KS_COPY_MACROVISION, *PKS_COPY_MACROVISION; - -typedef struct _KS_DVDCOPY_SET_COPY_STATE { - ULONG DVDCopyState; -} KS_DVDCOPY_SET_COPY_STATE, *PKS_DVDCOPY_SET_COPY_STATE; - -typedef enum { - KS_DVDCOPYSTATE_INITIALIZE, // indicates we are starting a full - // copy protection sequence. - KS_DVDCOPYSTATE_INITIALIZE_TITLE, // indicates we are starting a title - // key copy protection sequence - KS_DVDCOPYSTATE_AUTHENTICATION_NOT_REQUIRED, - KS_DVDCOPYSTATE_AUTHENTICATION_REQUIRED, - KS_DVDCOPYSTATE_DONE, -} KS_DVDCOPYSTATE; - -typedef enum { - KS_MACROVISION_DISABLED, - KS_MACROVISION_LEVEL1, - KS_MACROVISION_LEVEL2, - KS_MACROVISION_LEVEL3 -} KS_COPY_MACROVISION_LEVEL, *PKS_COPY_MACROVISION_LEVEL; - -// -// CGMS Copy Protection Flags -// - -#define KS_DVD_CGMS_RESERVED_MASK 0x00000078 - -#define KS_DVD_CGMS_COPY_PROTECT_MASK 0x00000018 -#define KS_DVD_CGMS_COPY_PERMITTED 0x00000000 -#define KS_DVD_CGMS_COPY_ONCE 0x00000010 -#define KS_DVD_CGMS_NO_COPY 0x00000018 - -#define KS_DVD_COPYRIGHT_MASK 0x00000040 -#define KS_DVD_NOT_COPYRIGHTED 0x00000000 -#define KS_DVD_COPYRIGHTED 0x00000040 - -#define KS_DVD_SECTOR_PROTECT_MASK 0x00000020 -#define KS_DVD_SECTOR_NOT_PROTECTED 0x00000000 -#define KS_DVD_SECTOR_PROTECTED 0x00000020 - - -//=========================================================================== -// The following MUST match the structures in WinGDI.h and AMVideo.h -//=========================================================================== - -#define STATIC_KSCATEGORY_TVTUNER \ - 0xa799a800L, 0xa46d, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0x24, 0x01, 0xdc, 0xd4 -DEFINE_GUIDSTRUCT("a799a800-a46d-11d0-a18c-00a02401dcd4", KSCATEGORY_TVTUNER); -#define KSCATEGORY_TVTUNER DEFINE_GUIDNAMED(KSCATEGORY_TVTUNER) - -#define STATIC_KSCATEGORY_CROSSBAR \ - 0xa799a801L, 0xa46d, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0x24, 0x01, 0xdc, 0xd4 -DEFINE_GUIDSTRUCT("a799a801-a46d-11d0-a18c-00a02401dcd4", KSCATEGORY_CROSSBAR); -#define KSCATEGORY_CROSSBAR DEFINE_GUIDNAMED(KSCATEGORY_CROSSBAR) - -#define STATIC_KSCATEGORY_TVAUDIO \ - 0xa799a802L, 0xa46d, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0x24, 0x01, 0xdc, 0xd4 -DEFINE_GUIDSTRUCT("a799a802-a46d-11d0-a18c-00a02401dcd4", KSCATEGORY_TVAUDIO); -#define KSCATEGORY_TVAUDIO DEFINE_GUIDNAMED(KSCATEGORY_TVAUDIO) - -#define STATIC_KSCATEGORY_VPMUX \ - 0xa799a803L, 0xa46d, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0x24, 0x01, 0xdc, 0xd4 -DEFINE_GUIDSTRUCT("a799a803-a46d-11d0-a18c-00a02401dcd4", KSCATEGORY_VPMUX); -#define KSCATEGORY_VPMUX DEFINE_GUIDNAMED(KSCATEGORY_VPMUX) - -#define STATIC_KSCATEGORY_VBICODEC \ - 0x07dad660L, 0x22f1, 0x11d1, 0xa9, 0xf4, 0x00, 0xc0, 0x4f, 0xbb, 0xde, 0x8f -DEFINE_GUIDSTRUCT("07dad660-22f1-11d1-a9f4-00c04fbbde8f", KSCATEGORY_VBICODEC); -#define KSCATEGORY_VBICODEC DEFINE_GUIDNAMED(KSCATEGORY_VBICODEC) - -// SUBTYPE_VPVideo -#define STATIC_KSDATAFORMAT_SUBTYPE_VPVideo\ - 0x5a9b6a40L, 0x1a22, 0x11d1, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a -DEFINE_GUIDSTRUCT("5a9b6a40-1a22-11d1-bad9-00609744111a", KSDATAFORMAT_SUBTYPE_VPVideo); -#define KSDATAFORMAT_SUBTYPE_VPVideo DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_VPVideo) - -// SUBTYPE_VPVBI -#define STATIC_KSDATAFORMAT_SUBTYPE_VPVBI\ - 0x5a9b6a41L, 0x1a22, 0x11d1, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a -DEFINE_GUIDSTRUCT("5a9b6a41-1a22-11d1-bad9-00609744111a", KSDATAFORMAT_SUBTYPE_VPVBI); -#define KSDATAFORMAT_SUBTYPE_VPVBI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_VPVBI) - - -// FORMAT_VideoInfo -#define STATIC_KSDATAFORMAT_SPECIFIER_VIDEOINFO\ - 0x05589f80L, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a -DEFINE_GUIDSTRUCT("05589f80-c356-11ce-bf01-00aa0055595a", KSDATAFORMAT_SPECIFIER_VIDEOINFO); -#define KSDATAFORMAT_SPECIFIER_VIDEOINFO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_VIDEOINFO) - -// FORMAT_VideoInfo2 -#define STATIC_KSDATAFORMAT_SPECIFIER_VIDEOINFO2\ - 0xf72a76A0L, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba -DEFINE_GUIDSTRUCT("f72a76A0-eb0a-11d0-ace4-0000c0cc16ba", KSDATAFORMAT_SPECIFIER_VIDEOINFO2); -#define KSDATAFORMAT_SPECIFIER_VIDEOINFO2 DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_VIDEOINFO2) - -// MEDIATYPE_AnalogVideo -#define STATIC_KSDATAFORMAT_TYPE_ANALOGVIDEO\ - 0x0482dde1L, 0x7817, 0x11cf, 0x8a, 0x03, 0x00, 0xaa, 0x00, 0x6e, 0xcb, 0x65 -DEFINE_GUIDSTRUCT("0482dde1-7817-11cf-8a03-00aa006ecb65", KSDATAFORMAT_TYPE_ANALOGVIDEO); -#define KSDATAFORMAT_TYPE_ANALOGVIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_ANALOGVIDEO) - -// FORMAT_AnalogVideo -#define STATIC_KSDATAFORMAT_SPECIFIER_ANALOGVIDEO\ - 0x0482dde0L, 0x7817, 0x11cf, 0x8a, 0x03, 0x00, 0xaa, 0x00, 0x6e, 0xcb, 0x65 -DEFINE_GUIDSTRUCT("0482dde0-7817-11cf-8a03-00aa006ecb65", KSDATAFORMAT_SPECIFIER_ANALOGVIDEO); -#define KSDATAFORMAT_SPECIFIER_ANALOGVIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_ANALOGVIDEO) - -// FORMAT_VBI -#define STATIC_KSDATAFORMAT_SPECIFIER_VBI\ - 0xf72a76e0L, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba -DEFINE_GUIDSTRUCT("f72a76e0-eb0a-11d0-ace4-0000c0cc16ba", KSDATAFORMAT_SPECIFIER_VBI); -#define KSDATAFORMAT_SPECIFIER_VBI DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_VBI) - -// MEDIATYPE_VBI -#define STATIC_KSDATAFORMAT_TYPE_VBI\ - 0xf72a76e1L, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba -DEFINE_GUIDSTRUCT("f72a76e1-eb0a-11d0-ace4-0000c0cc16ba", KSDATAFORMAT_TYPE_VBI); -#define KSDATAFORMAT_TYPE_VBI DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_VBI) - -// SUBTYPE_RAW8 -#define STATIC_KSDATAFORMAT_SUBTYPE_RAW8\ - 0xca20d9a0, 0x3e3e, 0x11d1, 0x9b, 0xf9, 0x0, 0xc0, 0x4f, 0xbb, 0xde, 0xbf -DEFINE_GUIDSTRUCT("ca20d9a0-3e3e-11d1-9bf9-00c04fbbdebf", KSDATAFORMAT_SUBTYPE_RAW8); -#define KSDATAFORMAT_SUBTYPE_RAW8 DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_RAW8) - -// MEDIASUBTYPE_CC -#define STATIC_KSDATAFORMAT_SUBTYPE_CC\ - 0x33214cc1, 0x11f, 0x11d2, 0xb4, 0xb1, 0x0, 0xa0, 0xd1, 0x2, 0xcf, 0xbe -DEFINE_GUIDSTRUCT("33214CC1-011F-11D2-B4B1-00A0D102CFBE", KSDATAFORMAT_SUBTYPE_CC); -#define KSDATAFORMAT_SUBTYPE_CC DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_CC) - -// MEDIASUBTYPE_NABTS -#define STATIC_KSDATAFORMAT_SUBTYPE_NABTS\ - 0xf72a76e2L, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba -DEFINE_GUIDSTRUCT("f72a76e2-eb0a-11d0-ace4-0000c0cc16ba", KSDATAFORMAT_SUBTYPE_NABTS); -#define KSDATAFORMAT_SUBTYPE_NABTS DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NABTS) - -// MEDIASUBTYPE_TELETEXT -#define STATIC_KSDATAFORMAT_SUBTYPE_TELETEXT\ - 0xf72a76e3L, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba -DEFINE_GUIDSTRUCT("f72a76e3-eb0a-11d0-ace4-0000c0cc16ba", KSDATAFORMAT_SUBTYPE_TELETEXT); -#define KSDATAFORMAT_SUBTYPE_TELETEXT DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_TELETEXT) - - - -/* constants for the biCompression field */ -#define KS_BI_RGB 0L -#define KS_BI_RLE8 1L -#define KS_BI_RLE4 2L -#define KS_BI_BITFIELDS 3L - -typedef struct tagKS_RGBQUAD { // rgbq - BYTE rgbBlue; - BYTE rgbGreen; - BYTE rgbRed; - BYTE rgbReserved; -} KS_RGBQUAD, *PKS_RGBQUAD; - -/* constants for palettes */ -#define KS_iPALETTE_COLORS 256 // Maximum colours in palette -#define KS_iEGA_COLORS 16 // Number colours in EGA palette -#define KS_iMASK_COLORS 3 // Maximum three components -#define KS_iTRUECOLOR 16 // Minimum true colour device -#define KS_iRED 0 // Index position for RED mask -#define KS_iGREEN 1 // Index position for GREEN mask -#define KS_iBLUE 2 // Index position for BLUE mask -#define KS_iPALETTE 8 // Maximum colour depth using a palette -#define KS_iMAXBITS 8 // Maximum bits per colour component -#define KS_SIZE_EGA_PALETTE (KS_iEGA_COLORS * sizeof(KS_RGBQUAD)) -#define KS_SIZE_PALETTE (KS_iPALETTE_COLORS * sizeof(KS_RGBQUAD)) - -typedef struct tagKS_BITMAPINFOHEADER{ - DWORD biSize; - LONG biWidth; - LONG biHeight; - WORD biPlanes; - WORD biBitCount; - DWORD biCompression; - DWORD biSizeImage; - LONG biXPelsPerMeter; - LONG biYPelsPerMeter; - DWORD biClrUsed; - DWORD biClrImportant; -} KS_BITMAPINFOHEADER, *PKS_BITMAPINFOHEADER; - -// Used for true colour images that also have a palette - -typedef struct tag_KS_TRUECOLORINFO { - DWORD dwBitMasks[KS_iMASK_COLORS]; - KS_RGBQUAD bmiColors[KS_iPALETTE_COLORS]; -} KS_TRUECOLORINFO, *PKS_TRUECOLORINFO; - - -#define KS_WIDTHBYTES(bits) ((DWORD)(((bits)+31) & (~31)) / 8) -#define KS_DIBWIDTHBYTES(bi) (DWORD)KS_WIDTHBYTES((DWORD)(bi).biWidth * (DWORD)(bi).biBitCount) -#define KS__DIBSIZE(bi) (KS_DIBWIDTHBYTES(bi) * (DWORD)(bi).biHeight) -#define KS_DIBSIZE(bi) ((bi).biHeight < 0 ? (-1)*(KS__DIBSIZE(bi)) : KS__DIBSIZE(bi)) - -typedef LONGLONG REFERENCE_TIME; - -// The BITMAPINFOHEADER contains all the details about the video stream such -// as the actual image dimensions and their pixel depth. A source filter may -// also request that the sink take only a section of the video by providing a -// clipping rectangle in rcSource. In the worst case where the sink filter -// forgets to check this on connection it will simply render the whole thing -// which isn't a disaster. Ideally a sink filter will check the rcSource and -// if it doesn't support image extraction and the rectangle is not empty then -// it will reject the connection. A filter should use SetRectEmpty to reset a -// rectangle to all zeroes (and IsRectEmpty to later check the rectangle). -// The rcTarget specifies the destination rectangle for the video, for most -// source filters they will set this to all zeroes, a downstream filter may -// request that the video be placed in a particular area of the buffers it -// supplies in which case it will call QueryAccept with a non empty target - -typedef struct tagKS_VIDEOINFOHEADER { - - RECT rcSource; // The bit we really want to use - RECT rcTarget; // Where the video should go - DWORD dwBitRate; // Approximate bit data rate - DWORD dwBitErrorRate; // Bit error rate for this stream - REFERENCE_TIME AvgTimePerFrame; // Average time per frame (100ns units) - - KS_BITMAPINFOHEADER bmiHeader; - -} KS_VIDEOINFOHEADER, *PKS_VIDEOINFOHEADER; - -// !!! WARNING !!! -// DO NOT use the following structure unless you are sure that the BITMAPINFOHEADER -// has a normal biSize == sizeof(BITMAPINFOHEADER) ! -// !!! WARNING !!! - -typedef struct tagKS_VIDEOINFO { - - RECT rcSource; // The bit we really want to use - RECT rcTarget; // Where the video should go - DWORD dwBitRate; // Approximate bit data rate - DWORD dwBitErrorRate; // Bit error rate for this stream - REFERENCE_TIME AvgTimePerFrame; // Average time per frame (100ns units) - - KS_BITMAPINFOHEADER bmiHeader; - - union { - KS_RGBQUAD bmiColors[KS_iPALETTE_COLORS]; // Colour palette - DWORD dwBitMasks[KS_iMASK_COLORS]; // True colour masks - KS_TRUECOLORINFO TrueColorInfo; // Both of the above - }; - -} KS_VIDEOINFO, *PKS_VIDEOINFO; - - -#define KS_SIZE_MASKS (KS_iMASK_COLORS * sizeof(DWORD)) -#define KS_SIZE_PREHEADER (FIELD_OFFSET(KS_VIDEOINFOHEADER,bmiHeader)) - -// For normal size -// #define KS_SIZE_VIDEOHEADER (sizeof(KS_BITMAPINFOHEADER) + KS_SIZE_PREHEADER) -// !!! for abnormal biSizes -#define KS_SIZE_VIDEOHEADER(pbmi) ((pbmi)->bmiHeader.biSize + KS_SIZE_PREHEADER) - -// VBI -// Used for NABTS, CC, Intercast, WST -typedef struct tagKS_VBIINFOHEADER { - ULONG StartLine; // inclusive - ULONG EndLine; // inclusive - ULONG SamplingFrequency; // Hz. - ULONG MinLineStartTime; // microSec * 100 from HSync LE - ULONG MaxLineStartTime; // microSec * 100 from HSync LE - ULONG ActualLineStartTime; // microSec * 100 from HSync LE - ULONG ActualLineEndTime; // microSec * 100 from HSync LE - ULONG VideoStandard; // KS_AnalogVideoStandard* - ULONG SamplesPerLine; - ULONG StrideInBytes; // May be > SamplesPerLine - ULONG BufferSize; // Bytes -} KS_VBIINFOHEADER, *PKS_VBIINFOHEADER; - -// VBI Sampling Rates -#define KS_VBIDATARATE_NABTS (5727272L) -#define KS_VBIDATARATE_CC ( 503493L) // ~= 1/1.986125e-6 -#define KS_VBISAMPLINGRATE_4X_NABTS ((long)(4*KS_VBIDATARATE_NABTS)) -#define KS_VBISAMPLINGRATE_47X_NABTS ((long)(27000000)) -#define KS_VBISAMPLINGRATE_5X_NABTS ((long)(5*KS_VBIDATARATE_NABTS)) - -#define KS_47NABTS_SCALER (KS_VBISAMPLINGRATE_47X_NABTS/(double)KS_VBIDATARATE_NABTS) - -// Analog video variant - Use this when the format is FORMAT_AnalogVideo -// -// rcSource defines the portion of the active video signal to use -// rcTarget defines the destination rectangle -// both of the above are relative to the dwActiveWidth and dwActiveHeight fields -// dwActiveWidth is currently set to 720 for all formats (but could change for HDTV) -// dwActiveHeight is 483 for NTSC and 575 for PAL/SECAM (but could change for HDTV) - -typedef struct tagKS_AnalogVideoInfo { - RECT rcSource; // Width max is 720, height varies w/ TransmissionStd - RECT rcTarget; // Where the video should go - DWORD dwActiveWidth; // Always 720 (CCIR-601 active samples per line) - DWORD dwActiveHeight; // 483 for NTSC, 575 for PAL/SECAM - REFERENCE_TIME AvgTimePerFrame; // Normal ActiveMovie units (100 nS) -} KS_ANALOGVIDEOINFO, *PKS_ANALOGVIDEOINFO; - -//=========================================================================== -// Data packet passed on Analog video stream channel change -//=========================================================================== - -#define KS_TVTUNER_CHANGE_BEGIN_TUNE 0x0001L // Starting a tuning operation -#define KS_TVTUNER_CHANGE_END_TUNE 0x0002L // Ending a tuning operation - -typedef struct tagKS_TVTUNER_CHANGE_INFO { - DWORD dwFlags; // KS_TVTUNER_CHANGE_* - DWORD dwCountryCode; - DWORD dwAnalogVideoStandard; // KS_AnalogVideoStandard - DWORD dwChannel; -} KS_TVTUNER_CHANGE_INFO, *PKS_TVTUNER_CHANGE_INFO; - -//=========================================================================== -// Video format blocks -//=========================================================================== - -typedef enum { - KS_MPEG2Level_Low, - KS_MPEG2Level_Main, - KS_MPEG2Level_High1440, - KS_MPEG2Level_High -} KS_MPEG2Level; - -typedef enum { - KS_MPEG2Profile_Simple, - KS_MPEG2Profile_Main, - KS_MPEG2Profile_SNRScalable, - KS_MPEG2Profile_SpatiallyScalable, - KS_MPEG2Profile_High -} KS_MPEG2Profile; - -#define KS_INTERLACE_IsInterlaced 0x00000001 // if 0, other interlace bits are irrelevent -#define KS_INTERLACE_1FieldPerSample 0x00000002 // else 2 fields per media sample -#define KS_INTERLACE_Field1First 0x00000004 // else Field 2 is first; top field in PAL is field 1, top field in NTSC is field 2? -#define KS_INTERLACE_UNUSED 0x00000008 // -#define KS_INTERLACE_FieldPatternMask 0x00000030 // use this mask with AMINTERLACE_FieldPat* -#define KS_INTERLACE_FieldPatField1Only 0x00000000 // Data never contains a Field2 -#define KS_INTERLACE_FieldPatField2Only 0x00000010 // Data never contains a Field1 -#define KS_INTERLACE_FieldPatBothRegular 0x00000020 // There will be a Field2 for every Field1 (required for Weave?) -#define KS_INTERLACE_FieldPatBothIrregular 0x00000030 // Random pattern of Field1s and Field2s -#define KS_INTERLACE_DisplayModeMask 0x000000c0 -#define KS_INTERLACE_DisplayModeBobOnly 0x00000000 -#define KS_INTERLACE_DisplayModeWeaveOnly 0x00000040 -#define KS_INTERLACE_DisplayModeBobOrWeave 0x00000080 - - - -#define KS_MPEG2_DoPanScan 0x00000001 //if set, the MPEG-2 video decoder should crop output image - // based on pan-scan vectors in picture_display_extension - // and change the picture aspect ratio accordingly. -#define KS_MPEG2_DVDLine21Field1 0x00000002 //if set, the MPEG-2 decoder must be able to produce an output - // pin for DVD style closed caption data found in GOP layer of field 1 -#define KS_MPEG2_DVDLine21Field2 0x00000004 //if set, the MPEG-2 decoder must be able to produce an output - // pin for DVD style closed caption data found in GOP layer of field 2 -#define KS_MPEG2_SourceIsLetterboxed 0x00000008 //if set, indicates that black bars have been encoded in the top - // and bottom of the video. -#define KS_MPEG2_FilmCameraMode 0x00000010 //if set, indicates "film mode" used for 625/50 content. If cleared, - // indicates that "camera mode" was used. -#define KS_MPEG2_LetterboxAnalogOut 0x00000020 //if set and this stream is sent to an analog output, it should - // be letterboxed. Streams sent to VGA should be letterboxed only by renderers. -#define KS_MPEG2_DSS_UserData 0x00000040 //if set, the MPEG-2 decoder must process DSS style user data -#define KS_MPEG2_DVB_UserData 0x00000080 //if set, the MPEG-2 decoder must process DVB style user data -#define KS_MPEG2_27MhzTimebase 0x00000100 //if set, the PTS,DTS timestamps advance at 27MHz rather than 90KHz - -typedef struct tagKS_VIDEOINFOHEADER2 { - RECT rcSource; - RECT rcTarget; - DWORD dwBitRate; - DWORD dwBitErrorRate; - REFERENCE_TIME AvgTimePerFrame; - DWORD dwInterlaceFlags; // use AMINTERLACE_* defines. Reject connection if undefined bits are not 0 - DWORD dwCopyProtectFlags; // use AMCOPYPROTECT_* defines. Reject connection if undefined bits are not 0 - DWORD dwPictAspectRatioX; // X dimension of picture aspect ratio, e.g. 16 for 16x9 display - DWORD dwPictAspectRatioY; // Y dimension of picture aspect ratio, e.g. 9 for 16x9 display - DWORD dwReserved1; // must be 0; reject connection otherwise - DWORD dwReserved2; // must be 0; reject connection otherwise - KS_BITMAPINFOHEADER bmiHeader; -} KS_VIDEOINFOHEADER2, *PKS_VIDEOINFOHEADER2; - -typedef struct tagKS_MPEG1VIDEOINFO { - KS_VIDEOINFOHEADER hdr; // Compatible with VIDEOINFO - DWORD dwStartTimeCode; // 25-bit Group of pictures time code at start of data - DWORD cbSequenceHeader; // Length in bytes of bSequenceHeader - BYTE bSequenceHeader[1]; // Sequence header including quantization matrices if any -} KS_MPEG1VIDEOINFO, *PKS_MPEG1VIDEOINFO; - -#define KS_MAX_SIZE_MPEG1_SEQUENCE_INFO 140 -#define KS_SIZE_MPEG1VIDEOINFO(pv) (FIELD_OFFSET(KS_MPEG1VIDEOINFO, bSequenceHeader[0]) + (pv)->cbSequenceHeader) -#define KS_MPEG1_SEQUENCE_INFO(pv) ((const BYTE *)(pv)->bSequenceHeader) - -typedef struct tagKS_MPEGVIDEOINFO2 { - KS_VIDEOINFOHEADER2 hdr; - DWORD dwStartTimeCode; // ?? not used for DVD ?? - DWORD cbSequenceHeader; // is 0 for DVD (no sequence header) - DWORD dwProfile; // use enum MPEG2Profile - DWORD dwLevel; // use enum MPEG2Level - DWORD dwFlags; // use AMMPEG2_* defines. Reject connection if undefined bits are not 0 - DWORD bSequenceHeader[1]; // DWORD instead of Byte for alignment purposes - // For MPEG-2, if a sequence_header is included, the sequence_extension - // should also be included -} KS_MPEGVIDEOINFO2, *PKS_MPEGVIDEOINFO2; - - -#define KS_SIZE_MPEGVIDEOINFO2(pv) (FIELD_OFFSET(KS_MPEGVIDEOINFO2, bSequenceHeader[0]) + (pv)->cbSequenceHeader) -#define KS_MPEG1_SEQUENCE_INFO(pv) ((const BYTE *)(pv)->bSequenceHeader) - -//=========================================================================== -// Audio format blocks -//=========================================================================== - -//if set, the PTS,DTS timestamps advance at 27MHz rather than 90KHz -#define KS_MPEGAUDIOINFO_27MhzTimebase 0x00000001 - -typedef struct tagKS_MPEAUDIOINFO { - DWORD dwFlags; // use KS_MPEGAUDIOINFO_* defines. Reject connection if undefined bits are not 0 - DWORD dwReserved1; // must be 0; reject connection otherwise - DWORD dwReserved2; // must be 0; reject connection otherwise - DWORD dwReserved3; // must be 0; reject connection otherwise -} KS_MPEGAUDIOINFO, *PKS_MPEGAUDIOINFO; - -//=========================================================================== -// Video DATAFORMATs -//=========================================================================== - -typedef struct tagKS_DATAFORMAT_VIDEOINFOHEADER { - KSDATAFORMAT DataFormat; - KS_VIDEOINFOHEADER VideoInfoHeader; -} KS_DATAFORMAT_VIDEOINFOHEADER, *PKS_DATAFORMAT_VIDEOINFOHEADER; - -typedef struct tagKS_DATAFORMAT_VIDEOINFOHEADER2 { - KSDATAFORMAT DataFormat; - KS_VIDEOINFOHEADER2 VideoInfoHeader2; -} KS_DATAFORMAT_VIDEOINFOHEADER2, *PKS_DATAFORMAT_VIDEOINFOHEADER2; - -typedef struct tagKS_DATAFORMAT_VIDEOINFO_PALETTE { - KSDATAFORMAT DataFormat; - KS_VIDEOINFO VideoInfo; -} KS_DATAFORMAT_VIDEOINFO_PALETTE, *PKS_DATAFORMAT_VIDEOINFO_PALETTE; - -typedef struct tagKS_DATAFORMAT_VBIINFOHEADER { - KSDATAFORMAT DataFormat; - KS_VBIINFOHEADER VBIInfoHeader; -} KS_DATAFORMAT_VBIINFOHEADER, *PKS_DATAFORMAT_VBIINFOHEADER; - -typedef struct _KS_VIDEO_STREAM_CONFIG_CAPS { - GUID guid; // will be MEDIATYPE_Video - ULONG VideoStandard; // logical OR of all AnalogVideoStandards - // supported - SIZE InputSize; // the inherent size of the incoming signal - // (every pixel unique) - SIZE MinCroppingSize; // smallest rcSrc cropping rect allowed - SIZE MaxCroppingSize; // largest rcSrc cropping rect allowed - int CropGranularityX; // granularity of cropping size - int CropGranularityY; - int CropAlignX; // alignment of cropping rect - int CropAlignY; - SIZE MinOutputSize; // smallest bitmap stream can produce - SIZE MaxOutputSize; // largest bitmap stream can produce - int OutputGranularityX; // granularity of output bitmap size - int OutputGranularityY; - int StretchTapsX; // 0, no stretch, 1 pix dup, 2 interp, ... - int StretchTapsY; // Describes quality of hardware scaler - int ShrinkTapsX; // - int ShrinkTapsY; // - LONGLONG MinFrameInterval; // 100 nS units - LONGLONG MaxFrameInterval; - LONG MinBitsPerSecond; - LONG MaxBitsPerSecond; -} KS_VIDEO_STREAM_CONFIG_CAPS, *PKS_VIDEO_STREAM_CONFIG_CAPS; - -//=========================================================================== -// Video DATARANGEs -//=========================================================================== - -typedef struct tagKS_DATARANGE_VIDEO { - KSDATARANGE DataRange; - BOOL bFixedSizeSamples; // all samples same size? - BOOL bTemporalCompression; // all I frames? - DWORD StreamDescriptionFlags; // KS_VIDEO_DESC_* - DWORD MemoryAllocationFlags; // KS_VIDEO_ALLOC_* - KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; - KS_VIDEOINFOHEADER VideoInfoHeader; // default format -} KS_DATARANGE_VIDEO, *PKS_DATARANGE_VIDEO; - -typedef struct tagKS_DATARANGE_VIDEO2 { - KSDATARANGE DataRange; - BOOL bFixedSizeSamples; // all samples same size? - BOOL bTemporalCompression; // all I frames? - DWORD StreamDescriptionFlags; // KS_VIDEO_DESC_* - DWORD MemoryAllocationFlags; // KS_VIDEO_ALLOC_* - KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; - KS_VIDEOINFOHEADER2 VideoInfoHeader; // default format -} KS_DATARANGE_VIDEO2, *PKS_DATARANGE_VIDEO2; - -typedef struct tagKS_DATARANGE_MPEG1_VIDEO { - KSDATARANGE DataRange; - BOOL bFixedSizeSamples; // all samples same size? - BOOL bTemporalCompression; // all I frames? - DWORD StreamDescriptionFlags; // KS_VIDEO_DESC_* - DWORD MemoryAllocationFlags; // KS_VIDEO_ALLOC_* - KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; - KS_MPEG1VIDEOINFO VideoInfoHeader; // default format -} KS_DATARANGE_MPEG1_VIDEO, *PKS_DATARANGE_MPEG1_VIDEO; - -typedef struct tagKS_DATARANGE_MPEG2_VIDEO { - KSDATARANGE DataRange; - BOOL bFixedSizeSamples; // all samples same size? - BOOL bTemporalCompression; // all I frames? - DWORD StreamDescriptionFlags; // KS_VIDEO_DESC_* - DWORD MemoryAllocationFlags; // KS_VIDEO_ALLOC_* - KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; - KS_MPEGVIDEOINFO2 VideoInfoHeader; // default format -} KS_DATARANGE_MPEG2_VIDEO, *PKS_DATARANGE_MPEG2_VIDEO; - -typedef struct tagKS_DATARANGE_VIDEO_PALETTE { - KSDATARANGE DataRange; - BOOL bFixedSizeSamples; // all samples same size? - BOOL bTemporalCompression; // all I frames? - DWORD StreamDescriptionFlags; // KS_VIDEO_DESC_* - DWORD MemoryAllocationFlags; // KS_VIDEO_ALLOC_* - KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; - KS_VIDEOINFO VideoInfo; // default format -} KS_DATARANGE_VIDEO_PALETTE, *PKS_DATARANGE_VIDEO_PALETTE; - -typedef struct tagKS_DATARANGE_VIDEO_VBI { - KSDATARANGE DataRange; - BOOL bFixedSizeSamples; // all samples same size? - BOOL bTemporalCompression; // all I frames? - DWORD StreamDescriptionFlags; // KS_VIDEO_DESC_* - DWORD MemoryAllocationFlags; // KS_VIDEO_ALLOC_* - KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; - KS_VBIINFOHEADER VBIInfoHeader; // default format -} KS_DATARANGE_VIDEO_VBI, *PKS_DATARANGE_VIDEO_VBI; - -typedef struct tagKS_DATARANGE_ANALOGVIDEO { - KSDATARANGE DataRange; - KS_ANALOGVIDEOINFO AnalogVideoInfo; -} KS_DATARANGE_ANALOGVIDEO, *PKS_DATARANGE_ANALOGVIDEO; - -//=========================================================================== -// StreamDescriptionFlags -// -// These define the "purpose" of each video stream -//=========================================================================== - -#define KS_VIDEOSTREAM_PREVIEW 0x0001 // Preview stream -#define KS_VIDEOSTREAM_CAPTURE 0x0002 // Capture stream -#define KS_VIDEOSTREAM_VBI 0x0010 // Field1 VBI -#define KS_VIDEOSTREAM_NABTS 0x0020 // Field1 NABTS -#define KS_VIDEOSTREAM_CC 0x0100 // Closed Captioning -#define KS_VIDEOSTREAM_EDS 0x0200 // Extended Data Services -#define KS_VIDEOSTREAM_TELETEXT 0x0400 // Field1 Teletext only -#define KS_VIDEOSTREAM_STILL 0x1000 // Still image input -#define KS_VIDEOSTREAM_IS_VPE 0x8000 // Is a VPE based stream? - -// MemoryAllocationFlags -#define KS_VIDEO_ALLOC_VPE_SYSTEM 0x0001 // VPE surface in system memory -#define KS_VIDEO_ALLOC_VPE_DISPLAY 0x0002 // VPE surface in display memory -#define KS_VIDEO_ALLOC_VPE_AGP 0x0004 // VPE surface in AGP memory - -////////////////////////////////////////////////////////////// -// Capture driver VBI property sets -////////////////////////////////////////////////////////////// - -// {F162C607-7B35-496f-AD7F-2DCA3B46B718} -#define STATIC_KSPROPSETID_VBICAP_PROPERTIES\ - 0xf162c607, 0x7b35, 0x496f, 0xad, 0x7f, 0x2d, 0xca, 0x3b, 0x46, 0xb7, 0x18 -DEFINE_GUIDSTRUCT("F162C607-7B35-496f-AD7F-2DCA3B46B718", KSPROPSETID_VBICAP_PROPERTIES); -#define KSPROPSETID_VBICAP_PROPERTIES DEFINE_GUIDNAMED(KSPROPSETID_VBICAP_PROPERTIES) - -typedef enum { - KSPROPERTY_VBICAP_PROPERTIES_PROTECTION = 0x01, -} KSPROPERTY_VBICAP; - -typedef struct _VBICAP_PROPERTIES_PROTECTION_S { - KSPROPERTY Property; - ULONG StreamIndex; // Index of stream - ULONG Status; -} VBICAP_PROPERTIES_PROTECTION_S, *PVBICAP_PROPERTIES_PROTECTION_S; -#define KS_VBICAP_PROTECTION_MV_PRESENT 0x0001L -#define KS_VBICAP_PROTECTION_MV_HARDWARE 0x0002L -#define KS_VBICAP_PROTECTION_MV_DETECTED 0x0004L - - -/***************************************************************************/ -/* VBI Related GUIDs, structs and properties for codecs(generic, cc, nabts)*/ -/***************************************************************************/ - -/////////////////////////////////////////////////////////////////////////////////////// -// IP/NABTS Protocol Reserved Group IDs - Overall Range 0x800-0x8FF [Decimal 2048-2079] -// Intervening values(0-F) are used if there are multiple providers at a particular tier -/////////////////////////////////////////////////////////////////////////////////////// - -// Used by individual content creators in show footage/data -#define KS_NABTS_GROUPID_ORIGINAL_CONTENT_BASE 0x800 -#define KS_NABTS_GROUPID_ORIGINAL_CONTENT_ADVERTISER_BASE 0x810 - -// Used by production company in finished show data -#define KS_NABTS_GROUPID_PRODUCTION_COMPANY_CONTENT_BASE 0x820 -#define KS_NABTS_GROUPID_PRODUCTION_COMPANY_ADVERTISER_BASE 0x830 - -// Used by broadcast syndicates in syndicated show data -#define KS_NABTS_GROUPID_SYNDICATED_SHOW_CONTENT_BASE 0x840 -#define KS_NABTS_GROUPID_SYNDICATED_SHOW_ADVERTISER_BASE 0x850 - -// Used by tv networks in network television data -#define KS_NABTS_GROUPID_NETWORK_WIDE_CONTENT_BASE 0x860 -#define KS_NABTS_GROUPID_NETWORK_WIDE_ADVERTISER_BASE 0x870 - -// Used by telvision stations in local programming data -#define KS_NABTS_GROUPID_TELEVISION_STATION_CONTENT_BASE 0x880 -#define KS_NABTS_GROUPID_TELEVISION_STATION_ADVERTISER_BASE 0x890 - -// Used by cable system in cable head-end originated data -#define KS_NABTS_GROUPID_LOCAL_CABLE_SYSTEM_CONTENT_BASE 0x8A0 -#define KS_NABTS_GROUPID_LOCAL_CABLE_SYSTEM_ADVERTISER_BASE 0x8B0 - -// The values between 0x8C0 - 0x8EF are reserved for future expansion - -// Used by Microsoft for Testing purposes (0x8F0 - 0x8FF) -#define KS_NABTS_GROUPID_MICROSOFT_RESERVED_TEST_DATA_BASE 0x8F0 - -////////////////////////////////////////////////////////////// -// Stream Format FEC-corrected NABTS bundles -////////////////////////////////////////////////////////////// - -#define STATIC_KSDATAFORMAT_TYPE_NABTS \ - 0xe757bca0, 0x39ac, 0x11d1, 0xa9, 0xf5, 0x0, 0xc0, 0x4f, 0xbb, 0xde, 0x8f -DEFINE_GUIDSTRUCT("E757BCA0-39AC-11d1-A9F5-00C04FBBDE8F", KSDATAFORMAT_TYPE_NABTS); -#define KSDATAFORMAT_TYPE_NABTS DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_NABTS) - -#define STATIC_KSDATAFORMAT_SUBTYPE_NABTS_FEC \ - 0xe757bca1, 0x39ac, 0x11d1, 0xa9, 0xf5, 0x0, 0xc0, 0x4f, 0xbb, 0xde, 0x8f -DEFINE_GUIDSTRUCT("E757BCA1-39AC-11d1-A9F5-00C04FBBDE8F", KSDATAFORMAT_SUBTYPE_NABTS_FEC); -#define KSDATAFORMAT_SUBTYPE_NABTS_FEC DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NABTS_FEC) - - -////////////////////////////////////////////////////////////// -// NABTS Bundle data structure definition -////////////////////////////////////////////////////////////// - -#define MAX_NABTS_VBI_LINES_PER_FIELD 11 -#define NABTS_LINES_PER_BUNDLE 16 -#define NABTS_PAYLOAD_PER_LINE 28 -#define NABTS_BYTES_PER_LINE 36 - -typedef struct _NABTSFEC_BUFFER { - ULONG dataSize; - USHORT groupID; - USHORT Reserved; - UCHAR data[NABTS_LINES_PER_BUNDLE * NABTS_PAYLOAD_PER_LINE]; -} NABTSFEC_BUFFER, *PNABTSFEC_BUFFER; - -////////////////////////////////////////////////////////////// -// vbi codec filtering pin properties -////////////////////////////////////////////////////////////// - -#define STATIC_KSPROPSETID_VBICodecFiltering \ - 0xcafeb0caL, 0x8715, 0x11d0, 0xbd, 0x6a, 0x00, 0x35, 0xc0, 0xed, 0xba, 0xbe -DEFINE_GUIDSTRUCT("cafeb0ca-8715-11d0-bd6a-0035c0edbabe", KSPROPSETID_VBICodecFiltering); -#define KSPROPSETID_VBICodecFiltering DEFINE_GUIDNAMED(KSPROPSETID_VBICodecFiltering) - -typedef enum { - KSPROPERTY_VBICODECFILTERING_SCANLINES_REQUESTED_BIT_ARRAY = 0x01, - KSPROPERTY_VBICODECFILTERING_SCANLINES_DISCOVERED_BIT_ARRAY, - KSPROPERTY_VBICODECFILTERING_SUBSTREAMS_REQUESTED_BIT_ARRAY, - KSPROPERTY_VBICODECFILTERING_SUBSTREAMS_DISCOVERED_BIT_ARRAY, - KSPROPERTY_VBICODECFILTERING_STATISTICS, -} KSPROPERTY_VBICODECFILTERING; - -typedef struct _VBICODECFILTERING_SCANLINES { - DWORD DwordBitArray[32]; // An array of scanline bits 0..1024(32*32) -} VBICODECFILTERING_SCANLINES, *PVBICODECFILTERING_SCANLINES; - -typedef struct _VBICODECFILTERING_NABTS_SUBSTREAMS { - DWORD SubstreamMask[128]; // An array of 4096 bits (one for each NABTS GroupID) -} VBICODECFILTERING_NABTS_SUBSTREAMS, *PVBICODECFILTERING_NABTS_SUBSTREAMS; - -typedef struct _VBICODECFILTERING_CC_SUBSTREAMS { - DWORD SubstreamMask; // An array of 32 bits (see KS_CC_SUBSTREAM *) -} VBICODECFILTERING_CC_SUBSTREAMS, *PVBICODECFILTERING_CC_SUBSTREAMS; - -// These KS_CC_SUBSTREAM_* bitmasks are used with VBICODECFILTERING_CC_SUBSTREAMS -#define KS_CC_SUBSTREAM_ODD 0x0001L // Unfiltered Field 1 Data -#define KS_CC_SUBSTREAM_EVEN 0x0002L // Unfiltered Field 2 Data - -// The following flags describe CC field 1 substreams: CC1,CC2,TT1,TT2 -#define KS_CC_SUBSTREAM_FIELD1_MASK 0x00F0L -#define KS_CC_SUBSTREAM_SERVICE_CC1 0x0010L -#define KS_CC_SUBSTREAM_SERVICE_CC2 0x0020L -#define KS_CC_SUBSTREAM_SERVICE_T1 0x0040L -#define KS_CC_SUBSTREAM_SERVICE_T2 0x0080L - -// The following flags describe CC field 2 substreams: CC3,CC4,TT3,TT4,XDS -#define KS_CC_SUBSTREAM_FIELD2_MASK 0x1F00L -#define KS_CC_SUBSTREAM_SERVICE_CC3 0x0100L -#define KS_CC_SUBSTREAM_SERVICE_CC4 0x0200L -#define KS_CC_SUBSTREAM_SERVICE_T3 0x0400L -#define KS_CC_SUBSTREAM_SERVICE_T4 0x0800L -#define KS_CC_SUBSTREAM_SERVICE_XDS 0x1000L - -// Special Note: field 1 or 2 substreams are usually on found on field 1 and 2 respectively -// If the VBI odd/even polarity is reversed, the correct filtered data will still be found. - -/////////////////////////////////////////////////////////////////// -// Hardware decoded CC stream format -/////////////////////////////////////////////////////////////////// - -#define CC_MAX_HW_DECODE_LINES 12 -typedef struct _CC_BYTE_PAIR { - BYTE Decoded[2]; - USHORT Reserved; -} CC_BYTE_PAIR, *PCC_BYTE_PAIR; - -typedef struct _CC_HW_FIELD { - VBICODECFILTERING_SCANLINES ScanlinesRequested; - ULONG fieldFlags; // KS_VBI_FLAG_FIELD1,2 - LONGLONG PictureNumber; - CC_BYTE_PAIR Lines[CC_MAX_HW_DECODE_LINES]; -} CC_HW_FIELD, *PCC_HW_FIELD; - -/////////////////////////////////////////////////////////////////// -// Raw NABTS stream format (TYPE_NABTS, SUBTYPE_NABTS) -/////////////////////////////////////////////////////////////////// - -// These low-level structures are byte packed( -Zp1 ) -#if !defined( PACK_PRAGMAS_NOT_SUPPORTED ) -#include -#endif -typedef struct _NABTS_BUFFER_LINE { - BYTE Confidence; - BYTE Bytes[NABTS_BYTES_PER_LINE]; -} NABTS_BUFFER_LINE, *PNABTS_BUFFER_LINE; - -#define NABTS_BUFFER_PICTURENUMBER_SUPPORT 1 -typedef struct _NABTS_BUFFER { - VBICODECFILTERING_SCANLINES ScanlinesRequested; - LONGLONG PictureNumber; - NABTS_BUFFER_LINE NabtsLines[MAX_NABTS_VBI_LINES_PER_FIELD]; -} NABTS_BUFFER, *PNABTS_BUFFER; -#if !defined( PACK_PRAGMAS_NOT_SUPPORTED ) -#include -#endif - -////////////////////////////////////////////////////////////// -// WST Codec Teletext Media Sample Format -////////////////////////////////////////////////////////////// - -#define WST_TVTUNER_CHANGE_BEGIN_TUNE 0x1000L // Starting a tuning operation -#define WST_TVTUNER_CHANGE_END_TUNE 0x2000L // Ending a tuning operation - -#define MAX_WST_VBI_LINES_PER_FIELD 17 -#define WST_BYTES_PER_LINE 42 - -typedef struct _WST_BUFFER_LINE { - BYTE Confidence; - BYTE Bytes[WST_BYTES_PER_LINE]; -} WST_BUFFER_LINE, *PWST_BUFFER_LINE; - -typedef struct _WST_BUFFER { - VBICODECFILTERING_SCANLINES ScanlinesRequested; - WST_BUFFER_LINE WstLines[MAX_WST_VBI_LINES_PER_FIELD]; -} WST_BUFFER, *PWST_BUFFER; - -// -// Common codec statistics -// - -typedef struct _VBICODECFILTERING_STATISTICS_COMMON { - DWORD InputSRBsProcessed; // upstream SRBs received - DWORD OutputSRBsProcessed; // downstream SRBs sent - DWORD SRBsIgnored; // SRBs ignored due to no requests - DWORD InputSRBsMissing; // SRBs dropped upstream - DWORD OutputSRBsMissing; // Output dropped because no SRB pending - DWORD OutputFailures; // dropped because of other failure - DWORD InternalErrors; // could not process due to int. failure - DWORD ExternalErrors; // could not process due to ext. failure - DWORD InputDiscontinuities; // discontinuities received - DWORD DSPFailures; // DSP confidence failure - DWORD TvTunerChanges; // number of received KS_TVTUNER_CHANGE_BEGIN_TUNE and KS_TVTUNER_CHANGE_END_TUNE pairs. - DWORD VBIHeaderChanges; // number of received KS_VBI_FLAG_VBIINFOHEADER_CHANGE - DWORD LineConfidenceAvg; // Average of all DSP confidence results - DWORD BytesOutput; // Bytes sent downstream -} VBICODECFILTERING_STATISTICS_COMMON, *PVBICODECFILTERING_STATISTICS_COMMON; - -typedef struct _VBICODECFILTERING_STATISTICS_COMMON_PIN { - DWORD SRBsProcessed; // SRBs sent/received - DWORD SRBsIgnored; // SRBs ignored due to filtering - DWORD SRBsMissing; // SRBs not sent/received - DWORD InternalErrors; // could not send/receive due to int. failure - DWORD ExternalErrors; // could not send/receive due to ext. failure - DWORD Discontinuities; // discontinuities received/sent - DWORD LineConfidenceAvg; // Average of all DSP confidence results for this pin - DWORD BytesOutput; // Bytes sent downstream -} VBICODECFILTERING_STATISTICS_COMMON_PIN, *PVBICODECFILTERING_STATISTICS_COMMON_PIN; - -// -// Codec-specific statistics - NABTS -// - -typedef struct _VBICODECFILTERING_STATISTICS_NABTS { - VBICODECFILTERING_STATISTICS_COMMON Common; // Generic VBI statistics - DWORD FECBundleBadLines; // Un-FEC-correctable lines - DWORD FECQueueOverflows; // Number of times FEC queue overflowed - DWORD FECCorrectedLines; // Lines CSUM corrected by FEC - DWORD FECUncorrectableLines; // FEC input lines not CSUM correctable - DWORD BundlesProcessed; // Bundles received from FEC - DWORD BundlesSent2IP; // Bundles sent to IP driver - DWORD FilteredLines; // Lines processed and then dropped - // because no one was interested -} VBICODECFILTERING_STATISTICS_NABTS, *PVBICODECFILTERING_STATISTICS_NABTS; - -typedef struct _VBICODECFILTERING_STATISTICS_NABTS_PIN { - VBICODECFILTERING_STATISTICS_COMMON_PIN Common;// Generic VBI pin statistics -} VBICODECFILTERING_STATISTICS_NABTS_PIN, *PVBICODECFILTERING_STATISTICS_NABTS_PIN; - -// -// Codec-specific statistics - Closed Caption -// - -typedef struct _VBICODECFILTERING_STATISTICS_CC { - VBICODECFILTERING_STATISTICS_COMMON Common; // Generic VBI statistics -} VBICODECFILTERING_STATISTICS_CC, *PVBICODECFILTERING_STATISTICS_CC; - - -typedef struct _VBICODECFILTERING_STATISTICS_CC_PIN { - VBICODECFILTERING_STATISTICS_COMMON_PIN Common;// Generic VBI pin statistics -} VBICODECFILTERING_STATISTICS_CC_PIN, *PVBICODECFILTERING_STATISTICS_CC_PIN; - -// -// Codec-specific statistics - Closed Caption -// - -typedef struct _VBICODECFILTERING_STATISTICS_TELETEXT { - VBICODECFILTERING_STATISTICS_COMMON Common; // Generic VBI statistics -} VBICODECFILTERING_STATISTICS_TELETEXT, *PVBICODECFILTERING_STATISTICS_TELETEXT; - -typedef struct _VBICODECFILTERING_STATISTICS_TELETEXT_PIN { - VBICODECFILTERING_STATISTICS_COMMON_PIN Common;// Generic VBI pin statistics -} VBICODECFILTERING_STATISTICS_TELETEXT_PIN, *PVBICODECFILTERING_STATISTICS_TELETEXT_PIN; - -//////////////////////////////////////////////////////////////////////////// -// VBI codec property structures(based on KSPROPERTY_VBICODECFILTERING enum) -//////////////////////////////////////////////////////////////////////////// - -// *** Most codecs support this property -// KSPROPERTY_VBICODECFILTERING_SCANLINES_REQUESTED_BIT_ARRAY -// KSPROPERTY_VBICODECFILTERING_SCANLINES_DISCOVERED_BIT_ARRAY, -typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_SCANLINES Scanlines; -} KSPROPERTY_VBICODECFILTERING_SCANLINES_S, *PKSPROPERTY_VBICODECFILTERING_SCANLINES_S; - -// *** NABTS codecs support this property -// KSPROPERTY_VBICODECFILTERING_SUBSTREAMS_REQUESTED_BIT_ARRAY, -// KSPROPERTY_VBICODECFILTERING_SUBSTREAMS_DISCOVERED_BIT_ARRAY, -typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_NABTS_SUBSTREAMS Substreams; -} KSPROPERTY_VBICODECFILTERING_NABTS_SUBSTREAMS_S, *PKSPROPERTY_VBICODECFILTERING_NABTS_SUBSTREAMS_S; - -// *** Closed captioning codecs support this property -// KSPROPERTY_VBICODECFILTERING_SUBSTREAMS_REQUESTED_BIT_ARRAY, -// KSPROPERTY_VBICODECFILTERING_SUBSTREAMS_DISCOVERED_BIT_ARRAY, -typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_CC_SUBSTREAMS Substreams; -} KSPROPERTY_VBICODECFILTERING_CC_SUBSTREAMS_S, *PKSPROPERTY_VBICODECFILTERING_CC_SUBSTREAMS_S; - -// *** Most codecs support these versions of the global and pin properties -// KSPROPERTY_VBICODECFILTERING_STATISTICS -typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_STATISTICS_COMMON Statistics; -} KSPROPERTY_VBICODECFILTERING_STATISTICS_COMMON_S, *PKSPROPERTY_VBICODECFILTERING_STATISTICS_COMMON_S; - -typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_STATISTICS_COMMON_PIN Statistics; -} KSPROPERTY_VBICODECFILTERING_STATISTICS_COMMON_PIN_S, *PKSPROPERTY_VBICODECFILTERING_STATISTICS_COMMON_PIN_S; - -// *** NABTS codecs support this version of the global and pin properties -// KSPROPERTY_VBICODECFILTERING_STATISTICS -typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_STATISTICS_NABTS Statistics; -} KSPROPERTY_VBICODECFILTERING_STATISTICS_NABTS_S, *PKSPROPERTY_VBICODECFILTERING_STATISTICS_NABTS_S; - -typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_STATISTICS_NABTS_PIN Statistics; -} KSPROPERTY_VBICODECFILTERING_STATISTICS_NABTS_PIN_S, *PKSPROPERTY_VBICODECFILTERING_STATISTICS_NABTS_PIN_S; - -// *** Closed captioning codecs support this version of the global and pin properties -// KSPROPERTY_VBICODECFILTERING_STATISTICS - -typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_STATISTICS_CC Statistics; -} KSPROPERTY_VBICODECFILTERING_STATISTICS_CC_S, *PKSPROPERTY_VBICODECFILTERING_STATISTICS_CC_S; - -typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_STATISTICS_CC_PIN Statistics; -} KSPROPERTY_VBICODECFILTERING_STATISTICS_CC_PIN_S, *PKSPROPERTY_VBICODECFILTERING_STATISTICS_CC_PIN_S; - -// Standard Pin Names for the video capture filter -//=========================================================================== - -#define STATIC_PINNAME_VIDEO_CAPTURE \ - 0xfb6c4281, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba -#define STATIC_PINNAME_CAPTURE STATIC_PINNAME_VIDEO_CAPTURE -DEFINE_GUIDSTRUCT("FB6C4281-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_CAPTURE); -#define PINNAME_VIDEO_CAPTURE DEFINE_GUIDNAMED(PINNAME_VIDEO_CAPTURE) -#define PINNAME_CAPTURE PINNAME_VIDEO_CAPTURE - -#define STATIC_PINNAME_VIDEO_CC_CAPTURE \ - 0x1aad8061, 0x12d, 0x11d2, 0xb4, 0xb1, 0x0, 0xa0, 0xd1, 0x2, 0xcf, 0xbe -#define STATIC_PINNAME_CC_CAPTURE STATIC_PINNAME_VIDEO_CC_CAPTURE -DEFINE_GUIDSTRUCT("1AAD8061-012D-11d2-B4B1-00A0D102CFBE", PINNAME_VIDEO_CC_CAPTURE); -#define PINNAME_VIDEO_CC_CAPTURE DEFINE_GUIDNAMED(PINNAME_VIDEO_CC_CAPTURE) - -#define STATIC_PINNAME_VIDEO_NABTS_CAPTURE \ - 0x29703660, 0x498a, 0x11d2, 0xb4, 0xb1, 0x0, 0xa0, 0xd1, 0x2, 0xcf, 0xbe -#define STATIC_PINNAME_NABTS_CAPTURE STATIC_PINNAME_VIDEO_NABTS_CAPTURE -DEFINE_GUIDSTRUCT("29703660-498A-11d2-B4B1-00A0D102CFBE", PINNAME_VIDEO_NABTS_CAPTURE); -#define PINNAME_VIDEO_NABTS_CAPTURE DEFINE_GUIDNAMED(PINNAME_VIDEO_NABTS_CAPTURE) - -#define STATIC_PINNAME_VIDEO_PREVIEW \ - 0xfb6c4282, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba -#define STATIC_PINNAME_PREVIEW STATIC_PINNAME_VIDEO_PREVIEW -DEFINE_GUIDSTRUCT("FB6C4282-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_PREVIEW); -#define PINNAME_VIDEO_PREVIEW DEFINE_GUIDNAMED(PINNAME_VIDEO_PREVIEW) -#define PINNAME_PREVIEW PINNAME_VIDEO_PREVIEW - -#define STATIC_PINNAME_VIDEO_ANALOGVIDEOIN \ - 0xfb6c4283, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba -DEFINE_GUIDSTRUCT("FB6C4283-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_ANALOGVIDEOIN); -#define PINNAME_VIDEO_ANALOGVIDEOIN DEFINE_GUIDNAMED(PINNAME_VIDEO_ANALOGVIDEOIN) - -#define STATIC_PINNAME_VIDEO_VBI \ - 0xfb6c4284, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba -DEFINE_GUIDSTRUCT("FB6C4284-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_VBI); -#define PINNAME_VIDEO_VBI DEFINE_GUIDNAMED(PINNAME_VIDEO_VBI) - -#define STATIC_PINNAME_VIDEO_VIDEOPORT \ - 0xfb6c4285, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba -DEFINE_GUIDSTRUCT("FB6C4285-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_VIDEOPORT); -#define PINNAME_VIDEO_VIDEOPORT DEFINE_GUIDNAMED(PINNAME_VIDEO_VIDEOPORT) - -#define STATIC_PINNAME_VIDEO_NABTS \ - 0xfb6c4286, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba -DEFINE_GUIDSTRUCT("FB6C4286-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_NABTS); -#define PINNAME_VIDEO_NABTS DEFINE_GUIDNAMED(PINNAME_VIDEO_NABTS) - -#define STATIC_PINNAME_VIDEO_EDS \ - 0xfb6c4287, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba -DEFINE_GUIDSTRUCT("FB6C4287-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_EDS); -#define PINNAME_VIDEO_EDS DEFINE_GUIDNAMED(PINNAME_VIDEO_EDS) - -#define STATIC_PINNAME_VIDEO_TELETEXT \ - 0xfb6c4288, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba -DEFINE_GUIDSTRUCT("FB6C4288-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_TELETEXT); -#define PINNAME_VIDEO_TELETEXT DEFINE_GUIDNAMED(PINNAME_VIDEO_TELETEXT) - -#define STATIC_PINNAME_VIDEO_CC \ - 0xfb6c4289, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba -DEFINE_GUIDSTRUCT("FB6C4289-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_CC); -#define PINNAME_VIDEO_CC DEFINE_GUIDNAMED(PINNAME_VIDEO_CC) - -#define STATIC_PINNAME_VIDEO_STILL \ - 0xfb6c428A, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba -DEFINE_GUIDSTRUCT("FB6C428A-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_STILL); -#define PINNAME_VIDEO_STILL DEFINE_GUIDNAMED(PINNAME_VIDEO_STILL) - -#define STATIC_PINNAME_VIDEO_TIMECODE \ - 0xfb6c428B, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba -DEFINE_GUIDSTRUCT("FB6C428B-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_TIMECODE); -#define PINNAME_VIDEO_TIMECODE DEFINE_GUIDNAMED(PINNAME_VIDEO_TIMECODE) - -#define STATIC_PINNAME_VIDEO_VIDEOPORT_VBI \ - 0xfb6c428C, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba -DEFINE_GUIDSTRUCT("FB6C428C-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_VIDEOPORT_VBI); -#define PINNAME_VIDEO_VIDEOPORT_VBI DEFINE_GUIDNAMED(PINNAME_VIDEO_VIDEOPORT_VBI) - -//=========================================================================== -// KSSTREAM_HEADER extensions for digital video -//=========================================================================== - -#define KS_VIDEO_FLAG_FRAME 0x0000L // Frame or Field (default is frame) -#define KS_VIDEO_FLAG_FIELD1 0x0001L -#define KS_VIDEO_FLAG_FIELD2 0x0002L - -#define KS_VIDEO_FLAG_I_FRAME 0x0000L // I, B, or P (default is I) -#define KS_VIDEO_FLAG_P_FRAME 0x0010L -#define KS_VIDEO_FLAG_B_FRAME 0x0020L - -typedef struct tagKS_FRAME_INFO { - ULONG ExtendedHeaderSize; // Size of this extended header - DWORD dwFrameFlags; // Field1, Field2, or Frame - LONGLONG PictureNumber; - LONGLONG DropCount; - - // The following are only set when using OverlayMixer - HANDLE hDirectDraw; // user mode DDraw handle - HANDLE hSurfaceHandle; // user mode surface handle - RECT DirectDrawRect; // portion of surface locked - // Reserved fields, never reference these - DWORD Reserved1; - DWORD Reserved2; - DWORD Reserved3; - DWORD Reserved4; -} KS_FRAME_INFO, *PKS_FRAME_INFO; - -//=========================================================================== -// KSSTREAM_HEADER extensions for VBI -//=========================================================================== - -#define KS_VBI_FLAG_FIELD1 0x0001L -#define KS_VBI_FLAG_FIELD2 0x0002L - -#define KS_VBI_FLAG_MV_PRESENT 0x0100L -#define KS_VBI_FLAG_MV_HARDWARE 0x0200L -#define KS_VBI_FLAG_MV_DETECTED 0x0400L - -#define KS_VBI_FLAG_TVTUNER_CHANGE 0x0010L // TvTunerChangeInfo is valid -#define KS_VBI_FLAG_VBIINFOHEADER_CHANGE 0x0020L // VBIInfoHeader is valid - -typedef struct tagKS_VBI_FRAME_INFO { - ULONG ExtendedHeaderSize; // Size of this extended header - DWORD dwFrameFlags; // Field1, Field2, or Frame; & etc - LONGLONG PictureNumber; // Test only? - LONGLONG DropCount; // Test only? - DWORD dwSamplingFrequency; - KS_TVTUNER_CHANGE_INFO TvTunerChangeInfo; - KS_VBIINFOHEADER VBIInfoHeader; -} KS_VBI_FRAME_INFO, *PKS_VBI_FRAME_INFO; - - -//=========================================================================== -// Analog video formats, used with: -// Analog Video Decoders -// TVTuners -// Analog Video Encoders -// -// XXX_STANDARDS_SUPPORTED returns a bitmask -//=========================================================================== - -typedef enum -{ - KS_AnalogVideo_None = 0x00000000, // This is a digital sensor - KS_AnalogVideo_NTSC_M = 0x00000001, // 75 IRE Setup - KS_AnalogVideo_NTSC_M_J = 0x00000002, // Japan, 0 IRE Setup - KS_AnalogVideo_NTSC_433 = 0x00000004, - - KS_AnalogVideo_PAL_B = 0x00000010, - KS_AnalogVideo_PAL_D = 0x00000020, - KS_AnalogVideo_PAL_G = 0x00000040, - KS_AnalogVideo_PAL_H = 0x00000080, - KS_AnalogVideo_PAL_I = 0x00000100, - KS_AnalogVideo_PAL_M = 0x00000200, - KS_AnalogVideo_PAL_N = 0x00000400, - - KS_AnalogVideo_PAL_60 = 0x00000800, - - KS_AnalogVideo_SECAM_B = 0x00001000, - KS_AnalogVideo_SECAM_D = 0x00002000, - KS_AnalogVideo_SECAM_G = 0x00004000, - KS_AnalogVideo_SECAM_H = 0x00008000, - KS_AnalogVideo_SECAM_K = 0x00010000, - KS_AnalogVideo_SECAM_K1 = 0x00020000, - KS_AnalogVideo_SECAM_L = 0x00040000, - KS_AnalogVideo_SECAM_L1 = 0x00080000, - - KS_AnalogVideo_PAL_N_COMBO - = 0x00100000 -} KS_AnalogVideoStandard; - -#define KS_AnalogVideo_NTSC_Mask 0x00000007 -#define KS_AnalogVideo_PAL_Mask 0x00100FF0 -#define KS_AnalogVideo_SECAM_Mask 0x000FF000 - -//=========================================================================== -// Property set definitions -// The comments show whether a given property is: -// R : READ only -// w : WRITE only -// RW : READ / WRITE -// O : Optional (return E_UNSUPPORTED if you don't handle this) -//=========================================================================== - -#define STATIC_PROPSETID_ALLOCATOR_CONTROL\ - 0x53171960, 0x148e, 0x11d2, 0x99, 0x79, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba -DEFINE_GUIDSTRUCT("53171960-148E-11d2-9979-0000C0CC16BA", PROPSETID_ALLOCATOR_CONTROL); -#define PROPSETID_ALLOCATOR_CONTROL DEFINE_GUIDNAMED(PROPSETID_ALLOCATOR_CONTROL) -typedef enum { - KSPROPERTY_ALLOCATOR_CONTROL_HONOR_COUNT, // R O (will allocate exactly this number of buffers) - KSPROPERTY_ALLOCATOR_CONTROL_SURFACE_SIZE, // R O (return 2 DWORDs specifying surface size) - // W I (informn a capture driver whether interleave capture is possible or - // not - a value of 1 means that interleaved capture is supported) - KSPROPERTY_ALLOCATOR_CONTROL_CAPTURE_CAPS, - - // R O (if value == 1, then the ovmixer will turn on the DDVP_INTERLEAVE - // flag thus allowing interleaved capture of the video) - KSPROPERTY_ALLOCATOR_CONTROL_CAPTURE_INTERLEAVE, -} KSPROPERTY_ALLOCATOR_CONTROL; - -typedef struct { - //KSPROPERTY Property; - ULONG CX; - ULONG CY; -} KSPROPERTY_ALLOCATOR_CONTROL_SURFACE_SIZE_S, *PKSPROPERTY_ALLOCATOR_CONTROL_SURFACE_SIZE_S; - -typedef struct { - //KSPROPERTY Property; - ULONG InterleavedCapSupported; -} KSPROPERTY_ALLOCATOR_CONTROL_CAPTURE_CAPS_S, *PKSPROPERTY_ALLOCATOR_CONTROL_CAPTURE_CAPS_S; - - -typedef struct { - //KSPROPERTY Property; - ULONG InterleavedCapPossible; -} KSPROPERTY_ALLOCATOR_CONTROL_CAPTURE_INTERLEAVE_S, *PKSPROPERTY_ALLOCATOR_CONTROL_CAPTURE_INTERLEAVE_S; - -//=========================================================================== - -#define STATIC_PROPSETID_VIDCAP_VIDEOPROCAMP\ - 0xC6E13360L, 0x30AC, 0x11d0, 0xa1, 0x8c, 0x00, 0xA0, 0xC9, 0x11, 0x89, 0x56 -DEFINE_GUIDSTRUCT("C6E13360-30AC-11d0-A18C-00A0C9118956", PROPSETID_VIDCAP_VIDEOPROCAMP); -#define PROPSETID_VIDCAP_VIDEOPROCAMP DEFINE_GUIDNAMED(PROPSETID_VIDCAP_VIDEOPROCAMP) - -typedef enum { - KSPROPERTY_VIDEOPROCAMP_BRIGHTNESS, // RW O - KSPROPERTY_VIDEOPROCAMP_CONTRAST, // RW O - KSPROPERTY_VIDEOPROCAMP_HUE, // RW O - KSPROPERTY_VIDEOPROCAMP_SATURATION, // RW O - KSPROPERTY_VIDEOPROCAMP_SHARPNESS, // RW O - KSPROPERTY_VIDEOPROCAMP_GAMMA, // RW O - KSPROPERTY_VIDEOPROCAMP_COLORENABLE, // RW O - KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE, // RW O - KSPROPERTY_VIDEOPROCAMP_BACKLIGHT_COMPENSATION,// RW O - KSPROPERTY_VIDEOPROCAMP_GAIN, // RW O -} KSPROPERTY_VIDCAP_VIDEOPROCAMP; - -typedef struct { - KSPROPERTY Property; - LONG Value; // Value to set or get - ULONG Flags; // KSPROPERTY_VIDEOPROCAMP_FLAGS_* - ULONG Capabilities; // KSPROPERTY_VIDEOPROCAMP_FLAGS_* -} KSPROPERTY_VIDEOPROCAMP_S, *PKSPROPERTY_VIDEOPROCAMP_S; - -#define KSPROPERTY_VIDEOPROCAMP_FLAGS_AUTO 0X0001L -#define KSPROPERTY_VIDEOPROCAMP_FLAGS_MANUAL 0X0002L - -//=========================================================================== - -#define STATIC_PROPSETID_TUNER\ - 0x6a2e0605L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 -DEFINE_GUIDSTRUCT("6a2e0605-28e4-11d0-a18c-00a0c9118956", PROPSETID_TUNER); -#define PROPSETID_TUNER DEFINE_GUIDNAMED(PROPSETID_TUNER) - -typedef enum { - KSPROPERTY_TUNER_CAPS, // R -overall device capabilities - KSPROPERTY_TUNER_MODE_CAPS, // R -capabilities in this mode - KSPROPERTY_TUNER_MODE, // RW -set a mode (TV, FM, AM, DSS) - KSPROPERTY_TUNER_STANDARD, // R -get TV standard (only if TV mode) - KSPROPERTY_TUNER_FREQUENCY, // RW -set/get frequency - KSPROPERTY_TUNER_INPUT, // RW -select an input - KSPROPERTY_TUNER_STATUS, // R -tuning status - KSPROPERTY_TUNER_IF_MEDIUM // R O-Medium for IF or Transport Pin -} KSPROPERTY_TUNER; - -typedef enum { - KSPROPERTY_TUNER_MODE_TV = 0X0001, - KSPROPERTY_TUNER_MODE_FM_RADIO = 0X0002, - KSPROPERTY_TUNER_MODE_AM_RADIO = 0X0004, - KSPROPERTY_TUNER_MODE_DSS = 0X0008, - KSPROPERTY_TUNER_MODE_ATSC = 0X0010, // also used for DVB-T, DVB-C -} KSPROPERTY_TUNER_MODES; - -// Describes how the device tunes. Only one of these flags may be set -// in KSPROPERTY_TUNER_MODE_CAPS_S.Strategy - -// Describe how the driver should attempt to tune: -// EXACT: just go to the frequency specified (no fine tuning) -// FINE: (slow) do an exhaustive search for the best signal -// COARSE: (fast) use larger frequency jumps to just determine if any signal - -typedef enum { - KS_TUNER_TUNING_EXACT = 1, // No fine tuning - KS_TUNER_TUNING_FINE, // Fine grained search - KS_TUNER_TUNING_COARSE, // Coarse search -}KS_TUNER_TUNING_FLAGS; - -typedef enum { - KS_TUNER_STRATEGY_PLL = 0X01, // Tune by PLL offset - KS_TUNER_STRATEGY_SIGNAL_STRENGTH = 0X02, // Tune by signal strength - KS_TUNER_STRATEGY_DRIVER_TUNES = 0X04, // Driver does fine tuning -}KS_TUNER_STRATEGY; - -typedef struct { - KSPROPERTY Property; - ULONG ModesSupported; // KS_PROPERTY_TUNER_MODES_* - KSPIN_MEDIUM VideoMedium; // GUID_NULL (no pin), or GUID - KSPIN_MEDIUM TVAudioMedium; // GUID_NULL (no pin), or GUID - KSPIN_MEDIUM RadioAudioMedium; // GUID_NULL (no pin), or GUID -} KSPROPERTY_TUNER_CAPS_S, *PKSPROPERTY_TUNER_CAPS_S; - -typedef struct { - KSPROPERTY Property; - KSPIN_MEDIUM IFMedium; // GUID_NULL (no pin), or GUID -} KSPROPERTY_TUNER_IF_MEDIUM_S, *PKSPROPERTY_TUNER_IF_MEDIUM_S; - -typedef struct { - KSPROPERTY Property; - ULONG Mode; // IN: KSPROPERTY_TUNER_MODE - ULONG StandardsSupported; // KS_AnalogVideo_* (if TV or DSS) - ULONG MinFrequency; // Hz - ULONG MaxFrequency; // Hz - ULONG TuningGranularity; // Hz - ULONG NumberOfInputs; // count of inputs - ULONG SettlingTime; // milliSeconds - ULONG Strategy; // KS_TUNER_STRATEGY -} KSPROPERTY_TUNER_MODE_CAPS_S, *PKSPROPERTY_TUNER_MODE_CAPS_S; - -typedef struct { - KSPROPERTY Property; - ULONG Mode; // IN: KSPROPERTY_TUNER_MODE -} KSPROPERTY_TUNER_MODE_S, *PKSPROPERTY_TUNER_MODE_S; - -typedef struct { - KSPROPERTY Property; - ULONG Frequency; // Hz - ULONG LastFrequency; // Hz (last known good) - ULONG TuningFlags; // KS_TUNER_TUNING_FLAGS - ULONG VideoSubChannel; // DSS - ULONG AudioSubChannel; // DSS - ULONG Channel; // VBI decoders - ULONG Country; // VBI decoders -} KSPROPERTY_TUNER_FREQUENCY_S, *PKSPROPERTY_TUNER_FREQUENCY_S; - -typedef struct { - KSPROPERTY Property; - ULONG Standard; // KS_AnalogVideo_* -} KSPROPERTY_TUNER_STANDARD_S, *PKSPROPERTY_TUNER_STANDARD_S; - -typedef struct { - KSPROPERTY Property; - ULONG InputIndex; // 0 to (n-1) inputs -} KSPROPERTY_TUNER_INPUT_S, *PKSPROPERTY_TUNER_INPUT_S; - -typedef struct { - KSPROPERTY Property; - ULONG CurrentFrequency; // Hz - ULONG PLLOffset; // if Strategy.KS_TUNER_STRATEGY_PLL - ULONG SignalStrength; // if Stretegy.KS_TUNER_STRATEGY_SIGNAL_STRENGTH - ULONG Busy; // TRUE if in the process of tuning -} KSPROPERTY_TUNER_STATUS_S, *PKSPROPERTY_TUNER_STATUS_S; - -#define STATIC_EVENTSETID_TUNER\ - 0x6a2e0606L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 -DEFINE_GUIDSTRUCT("6a2e0606-28e4-11d0-a18c-00a0c9118956", EVENTSETID_TUNER); -#define EVENTSETID_TUNER DEFINE_GUIDNAMED(EVENTSETID_TUNER) - -typedef enum { - KSEVENT_TUNER_CHANGED -} KSEVENT_TUNER; - - -//=========================================================================== - -#define STATIC_PROPSETID_VIDCAP_VIDEOENCODER\ - 0x6a2e0610L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 -DEFINE_GUIDSTRUCT("6a2e0610-28e4-11d0-a18c-00a0c9118956", PROPSETID_VIDCAP_VIDEOENCODER); -#define PROPSETID_VIDCAP_VIDEOENCODER DEFINE_GUIDNAMED(PROPSETID_VIDCAP_VIDEOENCODER) - -typedef enum { - KSPROPERTY_VIDEOENCODER_CAPS, // R - KSPROPERTY_VIDEOENCODER_STANDARD, // RW - KSPROPERTY_VIDEOENCODER_COPYPROTECTION, // RW O - KSPROPERTY_VIDEOENCODER_CC_ENABLE, // RW O -} KSPROPERTY_VIDCAP_VIDEOENCODER; - -typedef struct { - KSPROPERTY Property; - LONG Value; // value to get or set - ULONG Flags; // - ULONG Capabilities; // -} KSPROPERTY_VIDEOENCODER_S, *PKSPROPERTY_VIDEOENCODER_S; - -//=========================================================================== - -#define STATIC_PROPSETID_VIDCAP_VIDEODECODER\ - 0xC6E13350L, 0x30AC, 0x11d0, 0xA1, 0x8C, 0x00, 0xA0, 0xC9, 0x11, 0x89, 0x56 -DEFINE_GUIDSTRUCT("C6E13350-30AC-11d0-A18C-00A0C9118956", PROPSETID_VIDCAP_VIDEODECODER); -#define PROPSETID_VIDCAP_VIDEODECODER DEFINE_GUIDNAMED(PROPSETID_VIDCAP_VIDEODECODER) - -typedef enum { - KSPROPERTY_VIDEODECODER_CAPS, // R - KSPROPERTY_VIDEODECODER_STANDARD, // RW - KSPROPERTY_VIDEODECODER_STATUS, // R - KSPROPERTY_VIDEODECODER_OUTPUT_ENABLE, // Rw O - KSPROPERTY_VIDEODECODER_VCR_TIMING, // RW O -} KSPROPERTY_VIDCAP_VIDEODECODER; - -typedef enum { - KS_VIDEODECODER_FLAGS_CAN_DISABLE_OUTPUT = 0X0001, // VP Output can tri-stae - KS_VIDEODECODER_FLAGS_CAN_USE_VCR_LOCKING = 0X0002, // VCR PLL timings - KS_VIDEODECODER_FLAGS_CAN_INDICATE_LOCKED = 0X0004, // Can indicate valid signal -}KS_VIDEODECODER_FLAGS; - -typedef struct { - KSPROPERTY Property; - ULONG StandardsSupported; // KS_AnalogVideo_* - ULONG Capabilities; // KS_VIDEODECODER_FLAGS_* - ULONG SettlingTime; // milliseconds - ULONG HSyncPerVSync; // Number of HSync Pulses per VSync -} KSPROPERTY_VIDEODECODER_CAPS_S, *PKSPROPERTY_VIDEODECODER_CAPS_S; - -typedef struct { - KSPROPERTY Property; - ULONG NumberOfLines; // 525 or 625 lines detected - ULONG SignalLocked; // TRUE if signal is locked -} KSPROPERTY_VIDEODECODER_STATUS_S, *PKSPROPERTY_VIDEODECODER_STATUS_S; - -typedef struct { - KSPROPERTY Property; - ULONG Value; // Get or set a value -} KSPROPERTY_VIDEODECODER_S, *PKSPROPERTY_VIDEODECODER_S; - -#define STATIC_EVENTSETID_VIDEODECODER\ - 0x6a2e0621L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 -DEFINE_GUIDSTRUCT("6a2e0621-28e4-11d0-a18c-00a0c9118956", EVENTSETID_VIDEODECODER); -#define EVENTSETID_VIDEODECODER DEFINE_GUIDNAMED(EVENTSETID_VIDEODECODER) - -typedef enum { - KSEVENT_VIDEODECODER_CHANGED -} KSEVENT_VIDEODECODER; - -//=========================================================================== - -#define STATIC_PROPSETID_VIDCAP_CAMERACONTROL\ - 0xC6E13370L, 0x30AC, 0x11d0, 0xa1, 0x8C, 0x00, 0xA0, 0xC9, 0x11, 0x89, 0x56 -DEFINE_GUIDSTRUCT("C6E13370-30AC-11d0-A18C-00A0C9118956", PROPSETID_VIDCAP_CAMERACONTROL); -#define PROPSETID_VIDCAP_CAMERACONTROL DEFINE_GUIDNAMED(PROPSETID_VIDCAP_CAMERACONTROL) - -typedef enum { - KSPROPERTY_CAMERACONTROL_PAN, // RW O - KSPROPERTY_CAMERACONTROL_TILT, // RW O - KSPROPERTY_CAMERACONTROL_ROLL, // RW O - KSPROPERTY_CAMERACONTROL_ZOOM, // RW O - KSPROPERTY_CAMERACONTROL_EXPOSURE, // RW O - KSPROPERTY_CAMERACONTROL_IRIS, // RW O - KSPROPERTY_CAMERACONTROL_FOCUS, // RW O -} KSPROPERTY_VIDCAP_CAMERACONTROL; - -typedef struct { - KSPROPERTY Property; - LONG Value; // value to get or set - ULONG Flags; // KSPROPERTY_CAMERACONTROL_FLAGS_* - ULONG Capabilities; // KSPROPERTY_CAMERACONTROL_FLAGS_* -} KSPROPERTY_CAMERACONTROL_S, *PKSPROPERTY_CAMERACONTROL_S; - -#define KSPROPERTY_CAMERACONTROL_FLAGS_AUTO 0X0001L -#define KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL 0X0002L - -#define KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE 0X0000L -#define KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE 0X0010L - - -//=========================================================================== - -#define STATIC_PROPSETID_VIDCAP_CROSSBAR\ - 0x6a2e0640L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 -DEFINE_GUIDSTRUCT("6a2e0640-28e4-11d0-a18c-00a0c9118956", PROPSETID_VIDCAP_CROSSBAR); -#define PROPSETID_VIDCAP_CROSSBAR DEFINE_GUIDNAMED(PROPSETID_VIDCAP_CROSSBAR) - -typedef enum { - KSPROPERTY_CROSSBAR_CAPS, // R - KSPROPERTY_CROSSBAR_PININFO, // R - KSPROPERTY_CROSSBAR_CAN_ROUTE, // R - KSPROPERTY_CROSSBAR_ROUTE, // RW -} KSPROPERTY_VIDCAP_CROSSBAR; - -typedef struct { - KSPROPERTY Property; - ULONG NumberOfInputs; // the number of audio and video input pins - ULONG NumberOfOutputs; // the number of audio and video output pins -} KSPROPERTY_CROSSBAR_CAPS_S, *PKSPROPERTY_CROSSBAR_CAPS_S; - -typedef struct { - KSPROPERTY Property; - KSPIN_DATAFLOW Direction; // KSPIN_DATAFLOW_IN or KSPIN_DATAFLOW_OUT? - ULONG Index; // Which pin to return data for? - ULONG PinType; // KS_PhysConn_Video_* or KS_PhysConn_Audio_* - ULONG RelatedPinIndex; // For video pins, this is the related audio pin - KSPIN_MEDIUM Medium; // Identifies the hardware connection -} KSPROPERTY_CROSSBAR_PININFO_S, *PKSPROPERTY_CROSSBAR_PININFO_S; - -typedef struct { - KSPROPERTY Property; - ULONG IndexInputPin; // Zero based index of the input pin - ULONG IndexOutputPin; // Zero based index of the output pin - ULONG CanRoute; // returns non-zero on CAN_ROUTE if routing is possible -} KSPROPERTY_CROSSBAR_ROUTE_S, *PKSPROPERTY_CROSSBAR_ROUTE_S; - -#define STATIC_EVENTSETID_CROSSBAR\ - 0x6a2e0641L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 -DEFINE_GUIDSTRUCT("6a2e0641-28e4-11d0-a18c-00a0c9118956", EVENTSETID_CROSSBAR); -#define EVENTSETID_CROSSBAR DEFINE_GUIDNAMED(EVENTSETID_CROSSBAR) - -typedef enum { - KSEVENT_CROSSBAR_CHANGED -} KSEVENT_CROSSBAR; - -// The following IDs should match the AM equivalents -typedef enum { - KS_PhysConn_Video_Tuner = 1, - KS_PhysConn_Video_Composite, - KS_PhysConn_Video_SVideo, - KS_PhysConn_Video_RGB, - KS_PhysConn_Video_YRYBY, - KS_PhysConn_Video_SerialDigital, - KS_PhysConn_Video_ParallelDigital, - KS_PhysConn_Video_SCSI, - KS_PhysConn_Video_AUX, - KS_PhysConn_Video_1394, - KS_PhysConn_Video_USB, - KS_PhysConn_Video_VideoDecoder, - KS_PhysConn_Video_VideoEncoder, - KS_PhysConn_Video_SCART, - - KS_PhysConn_Audio_Tuner = 4096, - KS_PhysConn_Audio_Line, - KS_PhysConn_Audio_Mic, - KS_PhysConn_Audio_AESDigital, - KS_PhysConn_Audio_SPDIFDigital, - KS_PhysConn_Audio_SCSI, - KS_PhysConn_Audio_AUX, - KS_PhysConn_Audio_1394, - KS_PhysConn_Audio_USB, - KS_PhysConn_Audio_AudioDecoder, -} KS_PhysicalConnectorType; - - -//=========================================================================== - -#define STATIC_PROPSETID_VIDCAP_TVAUDIO\ - 0x6a2e0650L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 -DEFINE_GUIDSTRUCT("6a2e0650-28e4-11d0-a18c-00a0c9118956", PROPSETID_VIDCAP_TVAUDIO); -#define PROPSETID_VIDCAP_TVAUDIO DEFINE_GUIDNAMED(PROPSETID_VIDCAP_TVAUDIO) - -typedef enum { - KSPROPERTY_TVAUDIO_CAPS, // R - KSPROPERTY_TVAUDIO_MODE, // RW - KSPROPERTY_TVAUDIO_CURRENTLY_AVAILABLE_MODES // R -} KSPROPERTY_VIDCAP_TVAUDIO; - -#define KS_TVAUDIO_MODE_MONO 0x0001 // Mono -#define KS_TVAUDIO_MODE_STEREO 0x0002 // Stereo -#define KS_TVAUDIO_MODE_LANG_A 0x0010 // Primary language -#define KS_TVAUDIO_MODE_LANG_B 0x0020 // 2nd avail language -#define KS_TVAUDIO_MODE_LANG_C 0x0040 // 3rd avail language - -typedef struct { - KSPROPERTY Property; - ULONG Capabilities; // Bitmask of KS_TVAUDIO_MODE_* - KSPIN_MEDIUM InputMedium; - KSPIN_MEDIUM OutputMedium; -} KSPROPERTY_TVAUDIO_CAPS_S, *PKSPROPERTY_TVAUDIO_CAPS_S; - -typedef struct { - KSPROPERTY Property; - ULONG Mode; // KS_TVAUDIO_MODE_* -} KSPROPERTY_TVAUDIO_S, *PKSPROPERTY_TVAUDIO_S; - - -#define STATIC_KSEVENTSETID_VIDCAP_TVAUDIO\ - 0x6a2e0651L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 -DEFINE_GUIDSTRUCT("6a2e0651-28e4-11d0-a18c-00a0c9118956", KSEVENTSETID_VIDCAP_TVAUDIO); -#define KSEVENTSETID_VIDCAP_TVAUDIO DEFINE_GUIDNAMED(KSEVENTSETID_VIDCAP_TVAUDIO) - -typedef enum { - KSEVENT_TVAUDIO_CHANGED, -} KSEVENT_TVAUDIO; - -//=========================================================================== -#define STATIC_PROPSETID_VIDCAP_VIDEOCOMPRESSION\ - 0xC6E13343L, 0x30AC, 0x11d0, 0xA1, 0x8C, 0x00, 0xA0, 0xC9, 0x11, 0x89, 0x56 -DEFINE_GUIDSTRUCT("C6E13343-30AC-11d0-A18C-00A0C9118956", PROPSETID_VIDCAP_VIDEOCOMPRESSION); -#define PROPSETID_VIDCAP_VIDEOCOMPRESSION DEFINE_GUIDNAMED(PROPSETID_VIDCAP_VIDEOCOMPRESSION) - -typedef enum { - KSPROPERTY_VIDEOCOMPRESSION_GETINFO, // R - KSPROPERTY_VIDEOCOMPRESSION_KEYFRAME_RATE, // RW - KSPROPERTY_VIDEOCOMPRESSION_PFRAMES_PER_KEYFRAME, // RW - KSPROPERTY_VIDEOCOMPRESSION_QUALITY, // RW - KSPROPERTY_VIDEOCOMPRESSION_OVERRIDE_KEYFRAME, // W - KSPROPERTY_VIDEOCOMPRESSION_OVERRIDE_FRAME_SIZE, // W - KSPROPERTY_VIDEOCOMPRESSION_WINDOWSIZE, // RW -} KSPROPERTY_VIDCAP_VIDEOCOMPRESSION; - -typedef enum { - KS_CompressionCaps_CanQuality = 1, - KS_CompressionCaps_CanCrunch = 2, - KS_CompressionCaps_CanKeyFrame = 4, - KS_CompressionCaps_CanBFrame = 8, - KS_CompressionCaps_CanWindow = 0x10, -} KS_CompressionCaps; - -typedef struct { - KSPROPERTY Property; - // Note, no VersionString! - // Note, no DescriptionString! - ULONG StreamIndex; // zero based index of stream - LONG DefaultKeyFrameRate; // Key frame rate - LONG DefaultPFrameRate; // Predeicted frames per Key frame - LONG DefaultQuality; // 0 to 10000 - LONG NumberOfQualitySettings; // How many discreet quality settings? - LONG Capabilities; // KS_CompressionCaps_* -} KSPROPERTY_VIDEOCOMPRESSION_GETINFO_S, *PKSPROPERTY_VIDEOCOMPRESSION_GETINFO_S; - -typedef struct { - KSPROPERTY Property; - ULONG StreamIndex; // zero based index of stream - LONG Value; // value to get or set -} KSPROPERTY_VIDEOCOMPRESSION_S, *PKSPROPERTY_VIDEOCOMPRESSION_S; - -//=========================================================================== -// MEDIASUBTYPE_Overlay -#define STATIC_KSDATAFORMAT_SUBTYPE_OVERLAY\ - 0xe436eb7fL, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 -DEFINE_GUIDSTRUCT("e436eb7f-524f-11ce-9f53-0020af0ba770", KSDATAFORMAT_SUBTYPE_OVERLAY); -#define KSDATAFORMAT_SUBTYPE_OVERLAY DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_OVERLAY) - -#define STATIC_KSPROPSETID_OverlayUpdate\ - 0x490EA5CFL, 0x7681, 0x11D1, 0xA2, 0x1C, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -DEFINE_GUIDSTRUCT("490EA5CF-7681-11D1-A21C-00A0C9223196", KSPROPSETID_OverlayUpdate); -#define KSPROPSETID_OverlayUpdate DEFINE_GUIDNAMED(KSPROPSETID_OverlayUpdate) - -typedef enum { - KSPROPERTY_OVERLAYUPDATE_INTERESTS, - KSPROPERTY_OVERLAYUPDATE_CLIPLIST = 0x1, - KSPROPERTY_OVERLAYUPDATE_PALETTE = 0x2, - KSPROPERTY_OVERLAYUPDATE_COLORKEY = 0x4, - KSPROPERTY_OVERLAYUPDATE_VIDEOPOSITION = 0x8, - KSPROPERTY_OVERLAYUPDATE_DISPLAYCHANGE = 0x10, - KSPROPERTY_OVERLAYUPDATE_COLORREF = 0x10000000 -} KSPROPERTY_OVERLAYUPDATE; - -typedef struct { - ULONG PelsWidth; - ULONG PelsHeight; - ULONG BitsPerPel; - WCHAR DeviceID[1]; -} KSDISPLAYCHANGE, *PKSDISPLAYCHANGE; - -#define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_INTERESTS(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_OVERLAYUPDATE_INTERESTS,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(ULONG),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_PALETTE(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_OVERLAYUPDATE_PALETTE,\ - NULL,\ - sizeof(KSPROPERTY),\ - 0,\ - (Handler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_COLORKEY(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_OVERLAYUPDATE_COLORKEY,\ - NULL,\ - sizeof(KSPROPERTY),\ - sizeof(COLORKEY),\ - (Handler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_CLIPLIST(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_OVERLAYUPDATE_CLIPLIST,\ - NULL,\ - sizeof(KSPROPERTY),\ - 2 * sizeof(RECT) + sizeof(RGNDATAHEADER),\ - (Handler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_VIDEOPOSITION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_OVERLAYUPDATE_VIDEOPOSITION,\ - NULL,\ - sizeof(KSPROPERTY),\ - 2 * sizeof(RECT),\ - (Handler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_DISPLAYCHANGE(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_OVERLAYUPDATE_DISPLAYCHANGE,\ - NULL,\ - sizeof(KSPROPERTY),\ - sizeof(KSDISPLAYCHANGE),\ - (Handler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_COLORREF(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_OVERLAYUPDATE_COLORREF,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(COLORREF),\ - NULL,\ - NULL, 0, NULL, NULL, 0) - -//=========================================================================== -#define STATIC_PROPSETID_VIDCAP_VIDEOCONTROL\ - 0x6a2e0670L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 -DEFINE_GUIDSTRUCT("6a2e0670-28e4-11d0-a18c-00a0c9118956", PROPSETID_VIDCAP_VIDEOCONTROL); -#define PROPSETID_VIDCAP_VIDEOCONTROL DEFINE_GUIDNAMED(PROPSETID_VIDCAP_VIDEOCONTROL) - -typedef enum { - KSPROPERTY_VIDEOCONTROL_CAPS, // R - KSPROPERTY_VIDEOCONTROL_ACTUAL_FRAME_RATE, // R O - KSPROPERTY_VIDEOCONTROL_FRAME_RATES, // R O - KSPROPERTY_VIDEOCONTROL_MODE, // RWO -} KSPROPERTY_VIDCAP_VIDEOCONTROL; - -typedef enum { - KS_VideoControlFlag_FlipHorizontal = 0x0001, - KS_VideoControlFlag_FlipVertical = 0x0002, - KS_Obsolete_VideoControlFlag_ExternalTriggerEnable = 0x0010, // ***WARNING *** Flag msimatch with DSHOW. - KS_Obsolete_VideoControlFlag_Trigger = 0x0020, // ***WARNING *** Flag msimatch with DSHOW. - KS_VideoControlFlag_ExternalTriggerEnable = 0x0004, - KS_VideoControlFlag_Trigger = 0x0008, -} KS_VideoControlFlags; - -typedef struct { - KSPROPERTY Property; - ULONG StreamIndex; - ULONG VideoControlCaps; // KS_VideoControlFlags_* -} KSPROPERTY_VIDEOCONTROL_CAPS_S, *PKSPROPERTY_VIDEOCONTROL_CAPS_S; - -typedef struct { - KSPROPERTY Property; - ULONG StreamIndex; - LONG Mode; // KS_VideoControlFlags_* -} KSPROPERTY_VIDEOCONTROL_MODE_S, *PKSPROPERTY_VIDEOCONTROL_MODE_S; - -typedef struct { - KSPROPERTY Property; - ULONG StreamIndex; // Index of stream - ULONG RangeIndex; // Index of range - SIZE Dimensions; // Size of image - LONGLONG CurrentActualFrameRate; // Only correct if pin is open - LONGLONG CurrentMaxAvailableFrameRate; // Max Rate temporarily limited on USB or 1394? -} KSPROPERTY_VIDEOCONTROL_ACTUAL_FRAME_RATE_S, *PKSPROPERTY_VIDEOCONTROL_ACTUAL_FRAME_RATE_S; - -// KSPROPERTY_VIDEOCONTROL_FRAME_RATES returns a list of available frame rates in 100 nS units -typedef struct { - KSPROPERTY Property; - ULONG StreamIndex; // Index of stream - ULONG RangeIndex; // Index of range - SIZE Dimensions; // Size of image -} KSPROPERTY_VIDEOCONTROL_FRAME_RATES_S, *PKSPROPERTY_VIDEOCONTROL_FRAME_RATES_S; - -//=========================================================================== -#define STATIC_PROPSETID_VIDCAP_DROPPEDFRAMES\ - 0xC6E13344L, 0x30AC, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 -DEFINE_GUIDSTRUCT("C6E13344-30AC-11d0-A18C-00A0C9118956", PROPSETID_VIDCAP_DROPPEDFRAMES); -#define PROPSETID_VIDCAP_DROPPEDFRAMES DEFINE_GUIDNAMED(PROPSETID_VIDCAP_DROPPEDFRAMES) - -typedef enum { - KSPROPERTY_DROPPEDFRAMES_CURRENT // R -} KSPROPERTY_VIDCAP_DROPPEDFRAMES; - -typedef struct { - KSPROPERTY Property; - LONGLONG PictureNumber; // Current Picture Number - LONGLONG DropCount; // Count of frames dropped - ULONG AverageFrameSize; // Average size of frames captured -} KSPROPERTY_DROPPEDFRAMES_CURRENT_S, *PKSPROPERTY_DROPPEDFRAMES_CURRENT_S; - -//=========================================================================== -// VPE - -#define STATIC_KSPROPSETID_VPConfig\ - 0xbc29a660L, 0x30e3, 0x11d0, 0x9e, 0x69, 0x00, 0xc0, 0x4f, 0xd7, 0xc1, 0x5b -DEFINE_GUIDSTRUCT("bc29a660-30e3-11d0-9e69-00c04fd7c15b", KSPROPSETID_VPConfig); -#define KSPROPSETID_VPConfig DEFINE_GUIDNAMED(KSPROPSETID_VPConfig) - -#define STATIC_KSPROPSETID_VPVBIConfig\ - 0xec529b00L, 0x1a1f, 0x11d1, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a -DEFINE_GUIDSTRUCT("ec529b00-1a1f-11d1-bad9-00609744111a", KSPROPSETID_VPVBIConfig); -#define KSPROPSETID_VPVBIConfig DEFINE_GUIDNAMED(KSPROPSETID_VPVBIConfig) - -// Both of the above property sets use the same list of properties below - -typedef enum { - KSPROPERTY_VPCONFIG_NUMCONNECTINFO, - KSPROPERTY_VPCONFIG_GETCONNECTINFO, - KSPROPERTY_VPCONFIG_SETCONNECTINFO, - KSPROPERTY_VPCONFIG_VPDATAINFO, - KSPROPERTY_VPCONFIG_MAXPIXELRATE, - KSPROPERTY_VPCONFIG_INFORMVPINPUT, - KSPROPERTY_VPCONFIG_NUMVIDEOFORMAT, - KSPROPERTY_VPCONFIG_GETVIDEOFORMAT, - KSPROPERTY_VPCONFIG_SETVIDEOFORMAT, - KSPROPERTY_VPCONFIG_INVERTPOLARITY, - KSPROPERTY_VPCONFIG_DECIMATIONCAPABILITY, // E_NOTIMPL for VBI - KSPROPERTY_VPCONFIG_SCALEFACTOR, // E_NOTIMPL for VBI - KSPROPERTY_VPCONFIG_DDRAWHANDLE, - KSPROPERTY_VPCONFIG_VIDEOPORTID, - KSPROPERTY_VPCONFIG_DDRAWSURFACEHANDLE, - KSPROPERTY_VPCONFIG_SURFACEPARAMS -} KSPROPERTY_VPCONFIG; - -//========================= -// IBasicAudio -// -#define STATIC_CLSID_KsIBasicAudioInterfaceHandler\ - 0xb9f8ac3e, 0x0f71, 0x11d2, 0xb7, 0x2c, 0x00, 0xc0, 0x4f, 0xb6, 0xbd, 0x3d -DEFINE_GUIDSTRUCT("b9f8ac3e-0f71-11d2-b72c-00c04fb6bd3d", CLSID_KsIBasicAudioInterfaceHandler); -#define CLSID_KsIBasicAudioInterfaceHandler DEFINE_GUIDNAMED(CLSID_KsIBasicAudioInterfaceHandler) - - -#if defined(__IVPType__) - -typedef struct { - AMVPSIZE Size; - DWORD MaxPixelsPerSecond; - DWORD Reserved; -} KSVPMAXPIXELRATE, *PKSVPMAXPIXELRATE; - -typedef struct { - KSPROPERTY Property; - AMVPSIZE Size; -} KSVPSIZE_PROP, *PKSVPSIZE_PROP; - -typedef struct { - DWORD dwPitch; - DWORD dwXOrigin; - DWORD dwYOrigin; -} KSVPSURFACEPARAMS, *PKSVPSURFACEPARAMS; - -#else // !defined(__IVPType__) - -#if !defined(__DDRAW_INCLUDED__) - -//========================================================================== -// The following definitions must be in sync with DDraw.h in DirectX SDK -//========================================================================== - -/* - * The FourCC code is valid. - */ -#define DDPF_FOURCC 0x00000004l - - -typedef struct _DDPIXELFORMAT -{ - DWORD dwSize; // size of structure - DWORD dwFlags; // pixel format flags - DWORD dwFourCC; // (FOURCC code) - union - { - DWORD dwRGBBitCount; // how many bits per pixel (BD_1,2,4,8,16,24,32) - DWORD dwYUVBitCount; // how many bits per pixel (BD_4,8,16,24,32) - DWORD dwZBufferBitDepth; // how many bits for z buffers (BD_8,16,24,32) - DWORD dwAlphaBitDepth; // how many bits for alpha channels (BD_1,2,4,8) - }; - union - { - DWORD dwRBitMask; // mask for red bit - DWORD dwYBitMask; // mask for Y bits - }; - union - { - DWORD dwGBitMask; // mask for green bits - DWORD dwUBitMask; // mask for U bits - }; - union - { - DWORD dwBBitMask; // mask for blue bits - DWORD dwVBitMask; // mask for V bits - }; - union - { - DWORD dwRGBAlphaBitMask; // mask for alpha channel - DWORD dwYUVAlphaBitMask; // mask for alpha channel - DWORD dwRGBZBitMask; // mask for Z channel - DWORD dwYUVZBitMask; // mask for Z channel - }; -} DDPIXELFORMAT, * LPDDPIXELFORMAT; - -#endif // !defined(__DDRAW_INCLUDED__) - -//========================================================================== -// End of DDraw.h header info -//========================================================================== - -//========================================================================== -// The following definitions must be in sync with DVP.h in DirectX SDK -//========================================================================== - -#if !defined(__DVP_INCLUDED__) - -typedef struct _DDVIDEOPORTCONNECT { - DWORD dwSize; // size of the DDVIDEOPORTCONNECT structure - DWORD dwPortWidth; // Width of the video port - GUID guidTypeID; // Description of video port connection - DWORD dwFlags; // Connection flags - DWORD dwReserved1; // Reserved, set to zero. -} DDVIDEOPORTCONNECT, * LPDDVIDEOPORTCONNECT; - -#define DDVPTYPE_E_HREFH_VREFH \ - 0x54F39980L,0xDA60,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8 - -#define DDVPTYPE_E_HREFL_VREFL \ - 0xE09C77E0L,0xDA60,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8 - -#endif // !defined(__DVP_INCLUDED__) - -//========================================================================== -// End of DVP.h header info -//========================================================================== - - -//========================================================================== -// The following definitions must be in sync with VPType.h in AM 2.0 SDK -//========================================================================== - -// pixel aspect ratios corresponding to a 720x480 NTSC image or a 720x576 image -typedef enum // AMPixAspectRatio -{ - KS_PixAspectRatio_NTSC4x3, - KS_PixAspectRatio_NTSC16x9, - KS_PixAspectRatio_PAL4x3, - KS_PixAspectRatio_PAL16x9, -} KS_AMPixAspectRatio ; - -typedef enum // AMVP_SELECTFORMATBY -{ - KS_AMVP_DO_NOT_CARE, - KS_AMVP_BEST_BANDWIDTH, - KS_AMVP_INPUT_SAME_AS_OUTPUT -} KS_AMVP_SELECTFORMATBY; - -typedef enum // AMVP_MODE -{ - KS_AMVP_MODE_WEAVE, - KS_AMVP_MODE_BOBINTERLEAVED, - KS_AMVP_MODE_BOBNONINTERLEAVED, - KS_AMVP_MODE_SKIPEVEN, - KS_AMVP_MODE_SKIPODD -} KS_AMVP_MODE ; - -typedef struct tagKS_AMVPDIMINFO // AMVPDIMINFO -{ - DWORD dwFieldWidth ; // [out] field width - DWORD dwFieldHeight ; // [out] field height - DWORD dwVBIWidth ; // [out] VBI data width - DWORD dwVBIHeight ; // [out] VBI data height - RECT rcValidRegion ; // [out] valid rect for data cropping -} KS_AMVPDIMINFO, *PKS_AMVPDIMINFO ; - -typedef struct tagKS_AMVPDATAINFO // AMVPDATAINFO -{ - DWORD dwSize; // Size of the struct - DWORD dwMicrosecondsPerField; // Time taken by each field - KS_AMVPDIMINFO amvpDimInfo; // Dimensional Information - DWORD dwPictAspectRatioX; // Pict aspect ratio in X dimn - DWORD dwPictAspectRatioY; // Pict aspect ratio in Y dimn - BOOL bEnableDoubleClock; // Videoport should enable double clocking - BOOL bEnableVACT; // Videoport should use an external VACT signal - BOOL bDataIsInterlaced; // Indicates that the signal is interlaced - LONG lHalfLinesOdd; // number of halflines in the odd field - BOOL bFieldPolarityInverted; // Device inverts the polarity by default - DWORD dwNumLinesInVREF; // Number of lines of data in VREF - LONG lHalfLinesEven; // number of halflines in the even field - DWORD dwReserved1; // Reserved for future use -} KS_AMVPDATAINFO, *PKS_AMVPDATAINFO; - -typedef struct tagKS_AMVPSIZE // AMVPSIZE -{ - DWORD dwWidth ; // [in] width in pixels - DWORD dwHeight ; // [in] height in pixels -} KS_AMVPSIZE, *PKS_AMVPSIZE ; - -//========================================================================== -// End of VPType.h header info -//========================================================================== - -typedef struct { - KS_AMVPSIZE Size; - DWORD MaxPixelsPerSecond; - DWORD Reserved; -} KSVPMAXPIXELRATE, *PKSVPMAXPIXELRATE; - -typedef struct { - KSPROPERTY Property; - KS_AMVPSIZE Size; -} KSVPSIZE_PROP, *PKSVPSIZE_PROP; - -typedef struct { - DWORD dwPitch; - DWORD dwXOrigin; - DWORD dwYOrigin; -} KSVPSURFACEPARAMS, *PKSVPSURFACEPARAMS; - -#endif // !defined(__IVPType__) - -// -// IVPNotify event notification -// -#define STATIC_KSEVENTSETID_VPNotify\ - 0x20c5598eL, 0xd3c8, 0x11d0, 0x8d, 0xfc, 0x00, 0xc0, 0x4f, 0xd7, 0xc0, 0x8b -DEFINE_GUIDSTRUCT("20c5598e-d3c8-11d0-8dfc-00c04fd7c08b", KSEVENTSETID_VPNotify); -#define KSEVENTSETID_VPNotify DEFINE_GUIDNAMED(KSEVENTSETID_VPNotify) - -typedef enum { - KSEVENT_VPNOTIFY_FORMATCHANGE, -} KSEVENT_VPNOTIFY; - -// -// VIDCAPTOSTI event notification -// -#define STATIC_KSEVENTSETID_VIDCAPTOSTI\ - 0xdb47de20, 0xf628, 0x11d1, 0xba, 0x41, 0x0, 0xa0, 0xc9, 0xd, 0x2b, 0x5 -DEFINE_GUIDSTRUCT("DB47DE20-F628-11d1-BA41-00A0C90D2B05", KSEVENTSETID_VIDCAPTOSTI); -#define KSEVENTSETID_VIDCAPNotify DEFINE_GUIDNAMED(KSEVENTSETID_VIDCAPTOSTI) - -typedef enum { - KSEVENT_VIDCAPTOSTI_EXT_TRIGGER, -} KSEVENT_VIDCAPTOSTI; - - -// -// IVPVBINotify event notification -// -#define STATIC_KSEVENTSETID_VPVBINotify\ - 0xec529b01L, 0x1a1f, 0x11d1, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a -DEFINE_GUIDSTRUCT("ec529b01-1a1f-11d1-bad9-00609744111a", KSEVENTSETID_VPVBINotify); -#define KSEVENTSETID_VPVBINotify DEFINE_GUIDNAMED(KSEVENTSETID_VPVBINotify) - -typedef enum { - KSEVENT_VPVBINOTIFY_FORMATCHANGE, -} KSEVENT_VPVBINOTIFY; - - -// -// closed caption information -// - -#define STATIC_KSDATAFORMAT_TYPE_AUXLine21Data \ -0x670aea80L, 0x3a82, 0x11d0, 0xb7, 0x9b, 0x00, 0xaa, 0x00, 0x37, 0x67, 0xa7 -DEFINE_GUIDSTRUCT("670aea80-3a82-11d0-b79b-00aa003767a7", KSDATAFORMAT_TYPE_AUXLine21Data); -#define KSDATAFORMAT_TYPE_AUXLine21Data DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_AUXLine21Data) - -#define STATIC_KSDATAFORMAT_SUBTYPE_Line21_BytePair \ -0x6e8d4a22L, 0x310c, 0x11d0, 0xb7, 0x9a, 0x00, 0xaa, 0x00, 0x37, 0x67, 0xa7 -DEFINE_GUIDSTRUCT("6e8d4a22-310c-11d0-b79a-00aa003767a7", KSDATAFORMAT_SUBTYPE_Line21_BytePair); -#define KSDATAFORMAT_SUBTYPE_Line21_BytePair DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_Line21_BytePair) - -#define STATIC_KSDATAFORMAT_SUBTYPE_Line21_GOPPacket \ -0x6e8d4a23L, 0x310c, 0x11d0, 0xb7, 0x9a, 0x00, 0xaa, 0x00, 0x37, 0x67, 0xa7 -DEFINE_GUIDSTRUCT("6e8d4a23-310c-11d0-b79a-00aa003767a7", KSDATAFORMAT_SUBTYPE_Line21_GOPPacket); -#define KSDATAFORMAT_SUBTYPE_Line21_GOPPacket DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_Line21_GOPPacket) - -typedef struct _KSGOP_USERDATA { - ULONG sc; - ULONG reserved1; - BYTE cFields; - CHAR l21Data[3]; -} KSGOP_USERDATA, *PKSGOP_USERDATA; - -// -// DVD encrypted PACK format type definition -// - -#define STATIC_KSDATAFORMAT_TYPE_DVD_ENCRYPTED_PACK\ - 0xed0b916a, 0x044d, 0x11d1, 0xaa, 0x78, 0x00, 0xc0, 0x4f, 0xc3, 0x1d, 0x60 -DEFINE_GUIDSTRUCT("ed0b916a-044d-11d1-aa78-00c04fc31d60", KSDATAFORMAT_TYPE_DVD_ENCRYPTED_PACK); -#define KSDATAFORMAT_TYPE_DVD_ENCRYPTED_PACK DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_DVD_ENCRYPTED_PACK) - -#define KS_AM_UseNewCSSKey 0x1 - - -// ----------------------------------------------------------------------- -// KS_AM_KSPROPSETID_TSRateChange property set definitions for time stamp -// rate changes. -// ----------------------------------------------------------------------- - - -#define STATIC_KSPROPSETID_TSRateChange\ - 0xa503c5c0, 0x1d1d, 0x11d1, 0xad, 0x80, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0 - -DEFINE_GUIDSTRUCT("A503C5C0-1D1D-11D1-AD80-444553540000", KSPROPSETID_TSRateChange); -#define KSPROPSETID_TSRateChange DEFINE_GUIDNAMED(KSPROPSETID_TSRateChange) -typedef enum { - KS_AM_RATE_SimpleRateChange=1, // rw, use KS_AM_SimpleRateChange - KS_AM_RATE_ExactRateChange=2, // rw, use KS_AM_ExactRateChange - KS_AM_RATE_MaxFullDataRate=3, // r, use KS_AM_MaxFullDataRate - KS_AM_RATE_Step=4 // w, use KS_AM_Step -} KS_AM_PROPERTY_TS_RATE_CHANGE; - -typedef struct { - // this is the simplest mechanism to set a time stamp rate change on - // a filter (simplest for the person setting the rate change, harder - // for the filter doing the rate change). - REFERENCE_TIME StartTime; //stream time at which to start this rate - LONG Rate; //new rate * 10000 (decimal) -} KS_AM_SimpleRateChange, *PKS_AM_SimpleRateChange; - -typedef struct { - REFERENCE_TIME OutputZeroTime; //input TS that maps to zero output TS - LONG Rate; //new rate * 10000 (decimal) -} KS_AM_ExactRateChange, *PKS_AM_ExactRateChange; - -typedef LONG KS_AM_MaxFullDataRate; //rate * 10000 (decimal) - -typedef DWORD KS_AM_Step; // number of frame to step - - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// The following is the original contents of this header from -// the DirectX 8.0 SDK. -// -///////////////////////////////////////////////////////////////////////////// - -#else // DirectX 8.0 content - - - typedef struct { - KSPROPERTY Property; - KSMULTIPLE_ITEM MultipleItem; - } KSMULTIPLE_DATA_PROP, *PKSMULTIPLE_DATA_PROP; - - #define STATIC_KSMEDIUMSETID_MidiBus \ - 0x05908040L, 0x3246, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("05908040-3246-11D0-A5D6-28DB04C10000", KSMEDIUMSETID_MidiBus); - #define KSMEDIUMSETID_MidiBus DEFINE_GUIDNAMED(KSMEDIUMSETID_MidiBus) - - #define STATIC_KSMEDIUMSETID_VPBus \ - 0xA18C15ECL, 0xCE43, 0x11D0, 0xAB, 0xE7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("A18C15EC-CE43-11D0-ABE7-00A0C9223196", KSMEDIUMSETID_VPBus); - #define KSMEDIUMSETID_VPBus DEFINE_GUIDNAMED(KSMEDIUMSETID_VPBus) - - #define STATIC_KSINTERFACESETID_Media \ - 0x3A13EB40L, 0x30A7, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("3A13EB40-30A7-11D0-A5D6-28DB04C10000", KSINTERFACESETID_Media); - #define KSINTERFACESETID_Media DEFINE_GUIDNAMED(KSINTERFACESETID_Media) - - typedef enum { - KSINTERFACE_MEDIA_MUSIC, - KSINTERFACE_MEDIA_WAVE_BUFFERED, - KSINTERFACE_MEDIA_WAVE_QUEUED - } KSINTERFACE_MEDIA; - - - // USB Terminals - #define INIT_USB_TERMINAL(guid, id)\ - {\ - (guid)->Data1 = 0xDFF219E0 + (USHORT)(id);\ - (guid)->Data2 = 0xF70F;\ - (guid)->Data3 = 0x11D0;\ - (guid)->Data4[0] = 0xb9;\ - (guid)->Data4[1] = 0x17;\ - (guid)->Data4[2] = 0x00;\ - (guid)->Data4[3] = 0xa0;\ - (guid)->Data4[4] = 0xc9;\ - (guid)->Data4[5] = 0x22;\ - (guid)->Data4[6] = 0x31;\ - (guid)->Data4[7] = 0x96;\ - } - #define EXTRACT_USB_TERMINAL(guid)\ - (USHORT)((guid)->Data1 - 0xDFF219E0) - #define DEFINE_USB_TERMINAL_GUID(id)\ - 0xDFF219E0+(USHORT)(id), 0xF70F, 0x11D0, 0xB9, 0x17, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - - #define STATIC_KSNODETYPE_MICROPHONE\ - DEFINE_USB_TERMINAL_GUID(0x0201) - DEFINE_GUIDSTRUCT("DFF21BE1-F70F-11D0-B917-00A0C9223196", KSNODETYPE_MICROPHONE); - #define KSNODETYPE_MICROPHONE DEFINE_GUIDNAMED(KSNODETYPE_MICROPHONE) - - #define STATIC_KSNODETYPE_DESKTOP_MICROPHONE\ - DEFINE_USB_TERMINAL_GUID(0x0202) - DEFINE_GUIDSTRUCT("DFF21BE2-F70F-11D0-B917-00A0C9223196", KSNODETYPE_DESKTOP_MICROPHONE); - #define KSNODETYPE_DESKTOP_MICROPHONE DEFINE_GUIDNAMED(KSNODETYPE_DESKTOP_MICROPHONE) - - #define STATIC_KSNODETYPE_PERSONAL_MICROPHONE\ - DEFINE_USB_TERMINAL_GUID(0x0203) - DEFINE_GUIDSTRUCT("DFF21BE3-F70F-11D0-B917-00A0C9223196", KSNODETYPE_PERSONAL_MICROPHONE); - #define KSNODETYPE_PERSONAL_MICROPHONE DEFINE_GUIDNAMED(KSNODETYPE_PERSONAL_MICROPHONE) - - #define STATIC_KSNODETYPE_OMNI_DIRECTIONAL_MICROPHONE\ - DEFINE_USB_TERMINAL_GUID(0x0204) - DEFINE_GUIDSTRUCT("DFF21BE4-F70F-11D0-B917-00A0C9223196", KSNODETYPE_OMNI_DIRECTIONAL_MICROPHONE); - #define KSNODETYPE_OMNI_DIRECTIONAL_MICROPHONE DEFINE_GUIDNAMED(KSNODETYPE_OMNI_DIRECTIONAL_MICROPHONE) - - #define STATIC_KSNODETYPE_MICROPHONE_ARRAY\ - DEFINE_USB_TERMINAL_GUID(0x0205) - DEFINE_GUIDSTRUCT("DFF21BE5-F70F-11D0-B917-00A0C9223196", KSNODETYPE_MICROPHONE_ARRAY); - #define KSNODETYPE_MICROPHONE_ARRAY DEFINE_GUIDNAMED(KSNODETYPE_MICROPHONE_ARRAY) - - #define STATIC_KSNODETYPE_PROCESSING_MICROPHONE_ARRAY\ - DEFINE_USB_TERMINAL_GUID(0x0206) - DEFINE_GUIDSTRUCT("DFF21BE6-F70F-11D0-B917-00A0C9223196", KSNODETYPE_PROCESSING_MICROPHONE_ARRAY); - #define KSNODETYPE_PROCESSING_MICROPHONE_ARRAY DEFINE_GUIDNAMED(KSNODETYPE_PROCESSING_MICROPHONE_ARRAY) - - #define STATIC_KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR \ - 0x830a44f2, 0xa32d, 0x476b, 0xbe, 0x97, 0x42, 0x84, 0x56, 0x73, 0xb3, 0x5a - DEFINE_GUIDSTRUCT("830a44f2-a32d-476b-be97-42845673b35a", KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR); - #define KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR DEFINE_GUIDNAMED(KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR) - - #define STATIC_KSNODETYPE_SPEAKER\ - DEFINE_USB_TERMINAL_GUID(0x0301) - DEFINE_GUIDSTRUCT("DFF21CE1-F70F-11D0-B917-00A0C9223196", KSNODETYPE_SPEAKER); - #define KSNODETYPE_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_SPEAKER) - - #define STATIC_KSNODETYPE_HEADPHONES\ - DEFINE_USB_TERMINAL_GUID(0x0302) - DEFINE_GUIDSTRUCT("DFF21CE2-F70F-11D0-B917-00A0C9223196", KSNODETYPE_HEADPHONES); - #define KSNODETYPE_HEADPHONES DEFINE_GUIDNAMED(KSNODETYPE_HEADPHONES) - - #define STATIC_KSNODETYPE_HEAD_MOUNTED_DISPLAY_AUDIO\ - DEFINE_USB_TERMINAL_GUID(0x0303) - DEFINE_GUIDSTRUCT("DFF21CE3-F70F-11D0-B917-00A0C9223196", KSNODETYPE_HEAD_MOUNTED_DISPLAY_AUDIO); - #define KSNODETYPE_HEAD_MOUNTED_DISPLAY_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_HEAD_MOUNTED_DISPLAY_AUDIO) - - #define STATIC_KSNODETYPE_DESKTOP_SPEAKER\ - DEFINE_USB_TERMINAL_GUID(0x0304) - DEFINE_GUIDSTRUCT("DFF21CE4-F70F-11D0-B917-00A0C9223196", KSNODETYPE_DESKTOP_SPEAKER); - #define KSNODETYPE_DESKTOP_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_DESKTOP_SPEAKER) - - #define STATIC_KSNODETYPE_ROOM_SPEAKER\ - DEFINE_USB_TERMINAL_GUID(0x0305) - DEFINE_GUIDSTRUCT("DFF21CE5-F70F-11D0-B917-00A0C9223196", KSNODETYPE_ROOM_SPEAKER); - #define KSNODETYPE_ROOM_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_ROOM_SPEAKER) - - #define STATIC_KSNODETYPE_COMMUNICATION_SPEAKER\ - DEFINE_USB_TERMINAL_GUID(0x0306) - DEFINE_GUIDSTRUCT("DFF21CE6-F70F-11D0-B917-00A0C9223196", KSNODETYPE_COMMUNICATION_SPEAKER); - #define KSNODETYPE_COMMUNICATION_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_COMMUNICATION_SPEAKER) - - #define STATIC_KSNODETYPE_LOW_FREQUENCY_EFFECTS_SPEAKER\ - DEFINE_USB_TERMINAL_GUID(0x0307) - DEFINE_GUIDSTRUCT("DFF21CE7-F70F-11D0-B917-00A0C9223196", KSNODETYPE_LOW_FREQUENCY_EFFECTS_SPEAKER); - #define KSNODETYPE_LOW_FREQUENCY_EFFECTS_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_LOW_FREQUENCY_EFFECTS_SPEAKER) - - #define STATIC_KSNODETYPE_HANDSET\ - DEFINE_USB_TERMINAL_GUID(0x0401) - DEFINE_GUIDSTRUCT("DFF21DE1-F70F-11D0-B917-00A0C9223196", KSNODETYPE_HANDSET); - #define KSNODETYPE_HANDSET DEFINE_GUIDNAMED(KSNODETYPE_HANDSET) - - #define STATIC_KSNODETYPE_HEADSET\ - DEFINE_USB_TERMINAL_GUID(0x0402) - DEFINE_GUIDSTRUCT("DFF21DE2-F70F-11D0-B917-00A0C9223196", KSNODETYPE_HEADSET); - #define KSNODETYPE_HEADSET DEFINE_GUIDNAMED(KSNODETYPE_HEADSET) - - #define STATIC_KSNODETYPE_SPEAKERPHONE_NO_ECHO_REDUCTION\ - DEFINE_USB_TERMINAL_GUID(0x0403) - DEFINE_GUIDSTRUCT("DFF21DE3-F70F-11D0-B917-00A0C9223196", KSNODETYPE_SPEAKERPHONE_NO_ECHO_REDUCTION); - #define KSNODETYPE_SPEAKERPHONE_NO_ECHO_REDUCTION DEFINE_GUIDNAMED(KSNODETYPE_SPEAKERPHONE_NO_ECHO_REDUCTION) - - #define STATIC_KSNODETYPE_ECHO_SUPPRESSING_SPEAKERPHONE\ - DEFINE_USB_TERMINAL_GUID(0x0404) - DEFINE_GUIDSTRUCT("DFF21DE4-F70F-11D0-B917-00A0C9223196", KSNODETYPE_ECHO_SUPPRESSING_SPEAKERPHONE); - #define KSNODETYPE_ECHO_SUPPRESSING_SPEAKERPHONE DEFINE_GUIDNAMED(KSNODETYPE_ECHO_SUPPRESSING_SPEAKERPHONE) - - #define STATIC_KSNODETYPE_ECHO_CANCELING_SPEAKERPHONE\ - DEFINE_USB_TERMINAL_GUID(0x0405) - DEFINE_GUIDSTRUCT("DFF21DE5-F70F-11D0-B917-00A0C9223196", KSNODETYPE_ECHO_CANCELING_SPEAKERPHONE); - #define KSNODETYPE_ECHO_CANCELING_SPEAKERPHONE DEFINE_GUIDNAMED(KSNODETYPE_ECHO_CANCELING_SPEAKERPHONE) - - #define STATIC_KSNODETYPE_PHONE_LINE\ - DEFINE_USB_TERMINAL_GUID(0x0501) - DEFINE_GUIDSTRUCT("DFF21EE1-F70F-11D0-B917-00A0C9223196", KSNODETYPE_PHONE_LINE); - #define KSNODETYPE_PHONE_LINE DEFINE_GUIDNAMED(KSNODETYPE_PHONE_LINE) - - #define STATIC_KSNODETYPE_TELEPHONE\ - DEFINE_USB_TERMINAL_GUID(0x0502) - DEFINE_GUIDSTRUCT("DFF21EE2-F70F-11D0-B917-00A0C9223196", KSNODETYPE_TELEPHONE); - #define KSNODETYPE_TELEPHONE DEFINE_GUIDNAMED(KSNODETYPE_TELEPHONE) - - #define STATIC_KSNODETYPE_DOWN_LINE_PHONE\ - DEFINE_USB_TERMINAL_GUID(0x0503) - DEFINE_GUIDSTRUCT("DFF21EE3-F70F-11D0-B917-00A0C9223196", KSNODETYPE_DOWN_LINE_PHONE); - #define KSNODETYPE_DOWN_LINE_PHONE DEFINE_GUIDNAMED(KSNODETYPE_DOWN_LINE_PHONE) - - #define STATIC_KSNODETYPE_ANALOG_CONNECTOR\ - DEFINE_USB_TERMINAL_GUID(0x601) - DEFINE_GUIDSTRUCT("DFF21FE1-F70F-11D0-B917-00A0C9223196", KSNODETYPE_ANALOG_CONNECTOR); - #define KSNODETYPE_ANALOG_CONNECTOR DEFINE_GUIDNAMED(KSNODETYPE_ANALOG_CONNECTOR) - - #define STATIC_KSNODETYPE_DIGITAL_AUDIO_INTERFACE\ - DEFINE_USB_TERMINAL_GUID(0x0602) - DEFINE_GUIDSTRUCT("DFF21FE2-F70F-11D0-B917-00A0C9223196", KSNODETYPE_DIGITAL_AUDIO_INTERFACE); - #define KSNODETYPE_DIGITAL_AUDIO_INTERFACE DEFINE_GUIDNAMED(KSNODETYPE_DIGITAL_AUDIO_INTERFACE) - - #define STATIC_KSNODETYPE_LINE_CONNECTOR\ - DEFINE_USB_TERMINAL_GUID(0x0603) - DEFINE_GUIDSTRUCT("DFF21FE3-F70F-11D0-B917-00A0C9223196", KSNODETYPE_LINE_CONNECTOR); - #define KSNODETYPE_LINE_CONNECTOR DEFINE_GUIDNAMED(KSNODETYPE_LINE_CONNECTOR) - - #define STATIC_KSNODETYPE_LEGACY_AUDIO_CONNECTOR\ - DEFINE_USB_TERMINAL_GUID(0x0604) - DEFINE_GUIDSTRUCT("DFF21FE4-F70F-11D0-B917-00A0C9223196", KSNODETYPE_LEGACY_AUDIO_CONNECTOR); - #define KSNODETYPE_LEGACY_AUDIO_CONNECTOR DEFINE_GUIDNAMED(KSNODETYPE_LEGACY_AUDIO_CONNECTOR) - - #define STATIC_KSNODETYPE_SPDIF_INTERFACE\ - DEFINE_USB_TERMINAL_GUID(0x0605) - DEFINE_GUIDSTRUCT("DFF21FE5-F70F-11D0-B917-00A0C9223196", KSNODETYPE_SPDIF_INTERFACE); - #define KSNODETYPE_SPDIF_INTERFACE DEFINE_GUIDNAMED(KSNODETYPE_SPDIF_INTERFACE) - - #define STATIC_KSNODETYPE_1394_DA_STREAM\ - DEFINE_USB_TERMINAL_GUID(0x0606) - DEFINE_GUIDSTRUCT("DFF21FE6-F70F-11D0-B917-00A0C9223196", KSNODETYPE_1394_DA_STREAM); - #define KSNODETYPE_1394_DA_STREAM DEFINE_GUIDNAMED(KSNODETYPE_1394_DA_STREAM) - - #define STATIC_KSNODETYPE_1394_DV_STREAM_SOUNDTRACK\ - DEFINE_USB_TERMINAL_GUID(0x0607) - DEFINE_GUIDSTRUCT("DFF21FE7-F70F-11D0-B917-00A0C9223196", KSNODETYPE_1394_DV_STREAM_SOUNDTRACK); - #define KSNODETYPE_1394_DV_STREAM_SOUNDTRACK DEFINE_GUIDNAMED(KSNODETYPE_1394_DV_STREAM_SOUNDTRACK) - - #define STATIC_KSNODETYPE_LEVEL_CALIBRATION_NOISE_SOURCE\ - DEFINE_USB_TERMINAL_GUID(0x0701) - DEFINE_GUIDSTRUCT("DFF220E1-F70F-11D0-B917-00A0C9223196", KSNODETYPE_LEVEL_CALIBRATION_NOISE_SOURCE); - #define KSNODETYPE_LEVEL_CALIBRATION_NOISE_SOURCE DEFINE_GUIDNAMED(KSNODETYPE_LEVEL_CALIBRATION_NOISE_SOURCE) - - #define STATIC_KSNODETYPE_EQUALIZATION_NOISE\ - DEFINE_USB_TERMINAL_GUID(0x0702) - DEFINE_GUIDSTRUCT("DFF220E2-F70F-11D0-B917-00A0C9223196", KSNODETYPE_EQUALIZATION_NOISE); - #define KSNODETYPE_EQUALIZATION_NOISE DEFINE_GUIDNAMED(KSNODETYPE_EQUALIZATION_NOISE) - - #define STATIC_KSNODETYPE_CD_PLAYER\ - DEFINE_USB_TERMINAL_GUID(0x0703) - DEFINE_GUIDSTRUCT("DFF220E3-F70F-11D0-B917-00A0C9223196", KSNODETYPE_CD_PLAYER); - #define KSNODETYPE_CD_PLAYER DEFINE_GUIDNAMED(KSNODETYPE_CD_PLAYER) - - #define STATIC_KSNODETYPE_DAT_IO_DIGITAL_AUDIO_TAPE\ - DEFINE_USB_TERMINAL_GUID(0x0704) - DEFINE_GUIDSTRUCT("DFF220E4-F70F-11D0-B917-00A0C9223196", KSNODETYPE_DAT_IO_DIGITAL_AUDIO_TAPE); - #define KSNODETYPE_DAT_IO_DIGITAL_AUDIO_TAPE DEFINE_GUIDNAMED(KSNODETYPE_DAT_IO_DIGITAL_AUDIO_TAPE) - - #define STATIC_KSNODETYPE_DCC_IO_DIGITAL_COMPACT_CASSETTE\ - DEFINE_USB_TERMINAL_GUID(0x0705) - DEFINE_GUIDSTRUCT("DFF220E5-F70F-11D0-B917-00A0C9223196", KSNODETYPE_DCC_IO_DIGITAL_COMPACT_CASSETTE); - #define KSNODETYPE_DCC_IO_DIGITAL_COMPACT_CASSETTE DEFINE_GUIDNAMED(KSNODETYPE_DCC_IO_DIGITAL_COMPACT_CASSETTE) - - #define STATIC_KSNODETYPE_MINIDISK\ - DEFINE_USB_TERMINAL_GUID(0x0706) - DEFINE_GUIDSTRUCT("DFF220E6-F70F-11D0-B917-00A0C9223196", KSNODETYPE_MINIDISK); - #define KSNODETYPE_MINIDISK DEFINE_GUIDNAMED(KSNODETYPE_MINIDISK) - - #define STATIC_KSNODETYPE_ANALOG_TAPE\ - DEFINE_USB_TERMINAL_GUID(0x0707) - DEFINE_GUIDSTRUCT("DFF220E7-F70F-11D0-B917-00A0C9223196", KSNODETYPE_ANALOG_TAPE); - #define KSNODETYPE_ANALOG_TAPE DEFINE_GUIDNAMED(KSNODETYPE_ANALOG_TAPE) - - #define STATIC_KSNODETYPE_PHONOGRAPH\ - DEFINE_USB_TERMINAL_GUID(0x0708) - DEFINE_GUIDSTRUCT("DFF220E8-F70F-11D0-B917-00A0C9223196", KSNODETYPE_PHONOGRAPH); - #define KSNODETYPE_PHONOGRAPH DEFINE_GUIDNAMED(KSNODETYPE_PHONOGRAPH) - - #define STATIC_KSNODETYPE_VCR_AUDIO\ - DEFINE_USB_TERMINAL_GUID(0x0708) - DEFINE_GUIDSTRUCT("DFF220E9-F70F-11D0-B917-00A0C9223196", KSNODETYPE_VCR_AUDIO); - #define KSNODETYPE_VCR_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_VCR_AUDIO) - - #define STATIC_KSNODETYPE_VIDEO_DISC_AUDIO\ - DEFINE_USB_TERMINAL_GUID(0x070A) - DEFINE_GUIDSTRUCT("DFF220EA-F70F-11D0-B917-00A0C9223196", KSNODETYPE_VIDEO_DISC_AUDIO); - #define KSNODETYPE_VIDEO_DISC_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_VIDEO_DISC_AUDIO) - - #define STATIC_KSNODETYPE_DVD_AUDIO\ - DEFINE_USB_TERMINAL_GUID(0x070B) - DEFINE_GUIDSTRUCT("DFF220EB-F70F-11D0-B917-00A0C9223196", KSNODETYPE_DVD_AUDIO); - #define KSNODETYPE_DVD_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_DVD_AUDIO) - - #define STATIC_KSNODETYPE_TV_TUNER_AUDIO\ - DEFINE_USB_TERMINAL_GUID(0x070C) - DEFINE_GUIDSTRUCT("DFF220EC-F70F-11D0-B917-00A0C9223196", KSNODETYPE_TV_TUNER_AUDIO); - #define KSNODETYPE_TV_TUNER_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_TV_TUNER_AUDIO) - - #define STATIC_KSNODETYPE_SATELLITE_RECEIVER_AUDIO\ - DEFINE_USB_TERMINAL_GUID(0x070D) - DEFINE_GUIDSTRUCT("DFF220ED-F70F-11D0-B917-00A0C9223196", KSNODETYPE_SATELLITE_RECEIVER_AUDIO); - #define KSNODETYPE_SATELLITE_RECEIVER_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_SATELLITE_RECEIVER_AUDIO) - - #define STATIC_KSNODETYPE_CABLE_TUNER_AUDIO\ - DEFINE_USB_TERMINAL_GUID(0x070E) - DEFINE_GUIDSTRUCT("DFF220EE-F70F-11D0-B917-00A0C9223196", KSNODETYPE_CABLE_TUNER_AUDIO); - #define KSNODETYPE_CABLE_TUNER_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_CABLE_TUNER_AUDIO) - - #define STATIC_KSNODETYPE_DSS_AUDIO\ - DEFINE_USB_TERMINAL_GUID(0x070F) - DEFINE_GUIDSTRUCT("DFF220EF-F70F-11D0-B917-00A0C9223196", KSNODETYPE_DSS_AUDIO); - #define KSNODETYPE_DSS_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_DSS_AUDIO) - - #define STATIC_KSNODETYPE_RADIO_RECEIVER\ - DEFINE_USB_TERMINAL_GUID(0x0710) - DEFINE_GUIDSTRUCT("DFF220F0-F70F-11D0-B917-00A0C9223196", KSNODETYPE_RADIO_RECEIVER); - #define KSNODETYPE_RADIO_RECEIVER DEFINE_GUIDNAMED(KSNODETYPE_RADIO_RECEIVER) - - #define STATIC_KSNODETYPE_RADIO_TRANSMITTER\ - DEFINE_USB_TERMINAL_GUID(0x0711) - DEFINE_GUIDSTRUCT("DFF220F1-F70F-11D0-B917-00A0C9223196", KSNODETYPE_RADIO_TRANSMITTER); - #define KSNODETYPE_RADIO_TRANSMITTER DEFINE_GUIDNAMED(KSNODETYPE_RADIO_TRANSMITTER) - - #define STATIC_KSNODETYPE_MULTITRACK_RECORDER\ - DEFINE_USB_TERMINAL_GUID(0x0712) - DEFINE_GUIDSTRUCT("DFF220F2-F70F-11D0-B917-00A0C9223196", KSNODETYPE_MULTITRACK_RECORDER); - #define KSNODETYPE_MULTITRACK_RECORDER DEFINE_GUIDNAMED(KSNODETYPE_MULTITRACK_RECORDER) - - #define STATIC_KSNODETYPE_SYNTHESIZER\ - DEFINE_USB_TERMINAL_GUID(0x0713) - DEFINE_GUIDSTRUCT("DFF220F3-F70F-11D0-B917-00A0C9223196", KSNODETYPE_SYNTHESIZER); - #define KSNODETYPE_SYNTHESIZER DEFINE_GUIDNAMED(KSNODETYPE_SYNTHESIZER) - - // Microsoft's WDMAUD virtual swsynth pin name guid - - #define STATIC_KSNODETYPE_SWSYNTH\ - 0x423274A0L, 0x8B81, 0x11D1, 0xA0, 0x50, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88 - DEFINE_GUIDSTRUCT("423274A0-8B81-11D1-A050-0000F8004788", KSNODETYPE_SWSYNTH); - #define KSNODETYPE_SWSYNTH DEFINE_GUIDNAMED(KSNODETYPE_SWSYNTH) - - // Microsoft's SWMIDI midi pin and node name guid - - #define STATIC_KSNODETYPE_SWMIDI\ - 0xCB9BEFA0L, 0xA251, 0x11D1, 0xA0, 0x50, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88 - DEFINE_GUIDSTRUCT("CB9BEFA0-A251-11D1-A050-0000F8004788", KSNODETYPE_SWMIDI); - #define KSNODETYPE_SWMIDI DEFINE_GUIDNAMED(KSNODETYPE_SWMIDI) - - #define STATIC_KSNODETYPE_DRM_DESCRAMBLE\ - 0xFFBB6E3FL, 0xCCFE, 0x4D84, 0x90, 0xD9, 0x42, 0x14, 0x18, 0xB0, 0x3A, 0x8E - DEFINE_GUIDSTRUCT("FFBB6E3F-CCFE-4D84-90D9-421418B03A8E", KSNODETYPE_DRM_DESCRAMBLE); - #define KSNODETYPE_DRM_DESCRAMBLE DEFINE_GUIDNAMED(KSNODETYPE_DRM_DESCRAMBLE) - - // General categories - #define STATIC_KSCATEGORY_AUDIO \ - 0x6994AD04L, 0x93EF, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("6994AD04-93EF-11D0-A3CC-00A0C9223196", KSCATEGORY_AUDIO); - #define KSCATEGORY_AUDIO DEFINE_GUIDNAMED(KSCATEGORY_AUDIO) - - #define STATIC_KSCATEGORY_VIDEO \ - 0x6994AD05L, 0x93EF, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("6994AD05-93EF-11D0-A3CC-00A0C9223196", KSCATEGORY_VIDEO); - #define KSCATEGORY_VIDEO DEFINE_GUIDNAMED(KSCATEGORY_VIDEO) - - #define STATIC_KSCATEGORY_TEXT \ - 0x6994AD06L, 0x93EF, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("6994AD06-93EF-11D0-A3CC-00A0C9223196", KSCATEGORY_TEXT); - #define KSCATEGORY_TEXT DEFINE_GUIDNAMED(KSCATEGORY_TEXT) - - #define STATIC_KSCATEGORY_NETWORK \ - 0x67C9CC3CL, 0x69C4, 0x11D2, 0x87, 0x59, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("67C9CC3C-69C4-11D2-8759-00A0C9223196", KSCATEGORY_NETWORK); - #define KSCATEGORY_NETWORK DEFINE_GUIDNAMED(KSCATEGORY_NETWORK) - - #define STATIC_KSCATEGORY_TOPOLOGY \ - 0xDDA54A40L, 0x1E4C, 0x11D1, 0xA0, 0x50, 0x40, 0x57, 0x05, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("DDA54A40-1E4C-11D1-A050-405705C10000", KSCATEGORY_TOPOLOGY); - #define KSCATEGORY_TOPOLOGY DEFINE_GUIDNAMED(KSCATEGORY_TOPOLOGY) - - #define STATIC_KSCATEGORY_VIRTUAL \ - 0x3503EAC4L, 0x1F26, 0x11D1, 0x8A, 0xB0, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("3503EAC4-1F26-11D1-8AB0-00A0C9223196", KSCATEGORY_VIRTUAL); - #define KSCATEGORY_VIRTUAL DEFINE_GUIDNAMED(KSCATEGORY_VIRTUAL) - - #define STATIC_KSCATEGORY_ACOUSTIC_ECHO_CANCEL \ - 0xBF963D80L, 0xC559, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("BF963D80-C559-11D0-8A2B-00A0C9255AC1", KSCATEGORY_ACOUSTIC_ECHO_CANCEL); - #define KSCATEGORY_ACOUSTIC_ECHO_CANCEL DEFINE_GUIDNAMED(KSCATEGORY_ACOUSTIC_ECHO_CANCEL) - - - #define STATIC_KSCATEGORY_SYSAUDIO \ - 0xA7C7A5B1L, 0x5AF3, 0x11D1, 0x9C, 0xED, 0x00, 0xA0, 0x24, 0xBF, 0x04, 0x07 - DEFINE_GUIDSTRUCT("A7C7A5B1-5AF3-11D1-9CED-00A024BF0407", KSCATEGORY_SYSAUDIO); - #define KSCATEGORY_SYSAUDIO DEFINE_GUIDNAMED(KSCATEGORY_SYSAUDIO) - - #define STATIC_KSCATEGORY_WDMAUD \ - 0x3E227E76L, 0x690D, 0x11D2, 0x81, 0x61, 0x00, 0x00, 0xF8, 0x77, 0x5B, 0xF1 - DEFINE_GUIDSTRUCT("3E227E76-690D-11D2-8161-0000F8775BF1", KSCATEGORY_WDMAUD); - #define KSCATEGORY_WDMAUD DEFINE_GUIDNAMED(KSCATEGORY_WDMAUD) - - #define STATIC_KSCATEGORY_AUDIO_GFX \ - 0x9BAF9572L, 0x340C, 0x11D3, 0xAB, 0xDC, 0x00, 0xA0, 0xC9, 0x0A, 0xB1, 0x6F - DEFINE_GUIDSTRUCT("9BAF9572-340C-11D3-ABDC-00A0C90AB16F", KSCATEGORY_AUDIO_GFX); - #define KSCATEGORY_AUDIO_GFX DEFINE_GUIDNAMED(KSCATEGORY_AUDIO_GFX) - - #define STATIC_KSCATEGORY_AUDIO_SPLITTER \ - 0x9EA331FAL, 0xB91B, 0x45F8, 0x92, 0x85, 0xBD, 0x2B, 0xC7, 0x7A, 0xFC, 0xDE - DEFINE_GUIDSTRUCT("9EA331FA-B91B-45F8-9285-BD2BC77AFCDE", KSCATEGORY_AUDIO_SPLITTER); - #define KSCATEGORY_AUDIO_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_AUDIO_SPLITTER) - - #define STATIC_KSCATEGORY_SYNTHESIZER STATIC_KSNODETYPE_SYNTHESIZER - #define KSCATEGORY_SYNTHESIZER KSNODETYPE_SYNTHESIZER - - #define STATIC_KSCATEGORY_DRM_DESCRAMBLE STATIC_KSNODETYPE_DRM_DESCRAMBLE - #define KSCATEGORY_DRM_DESCRAMBLE KSNODETYPE_DRM_DESCRAMBLE - - #define STATIC_KSCATEGORY_AUDIO_DEVICE \ - 0xFBF6F530L, 0x07B9, 0x11D2, 0xA7, 0x1E, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88 - DEFINE_GUIDSTRUCT("FBF6F530-07B9-11D2-A71E-0000F8004788", KSCATEGORY_AUDIO_DEVICE); - #define KSCATEGORY_AUDIO_DEVICE DEFINE_GUIDNAMED(KSCATEGORY_AUDIO_DEVICE) - - #define STATIC_KSCATEGORY_PREFERRED_WAVEOUT_DEVICE \ - 0xD6C5066EL, 0x72C1, 0x11D2, 0x97, 0x55, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88 - DEFINE_GUIDSTRUCT("D6C5066E-72C1-11D2-9755-0000F8004788", KSCATEGORY_PREFERRED_WAVEOUT_DEVICE); - #define KSCATEGORY_PREFERRED_WAVEOUT_DEVICE DEFINE_GUIDNAMED(KSCATEGORY_PREFERRED_WAVEOUT_DEVICE) - - #define STATIC_KSCATEGORY_PREFERRED_WAVEIN_DEVICE \ - 0xD6C50671L, 0x72C1, 0x11D2, 0x97, 0x55, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88 - DEFINE_GUIDSTRUCT("D6C50671-72C1-11D2-9755-0000F8004788", KSCATEGORY_PREFERRED_WAVEIN_DEVICE); - #define KSCATEGORY_PREFERRED_WAVEIN_DEVICE DEFINE_GUIDNAMED(KSCATEGORY_PREFERRED_WAVEIN_DEVICE) - - #define STATIC_KSCATEGORY_PREFERRED_MIDIOUT_DEVICE \ - 0xD6C50674L, 0x72C1, 0x11D2, 0x97, 0x55, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88 - DEFINE_GUIDSTRUCT("D6C50674-72C1-11D2-9755-0000F8004788", KSCATEGORY_PREFERRED_MIDIOUT_DEVICE); - #define KSCATEGORY_PREFERRED_MIDIOUT_DEVICE DEFINE_GUIDNAMED(KSCATEGORY_PREFERRED_MIDIOUT_DEVICE) - - // Special pin category for wdmaud - - #define STATIC_KSCATEGORY_WDMAUD_USE_PIN_NAME \ - 0x47A4FA20L, 0xA251, 0x11D1, 0xA0, 0x50, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88 - DEFINE_GUIDSTRUCT("47A4FA20-A251-11D1-A050-0000F8004788", KSCATEGORY_WDMAUD_USE_PIN_NAME); - #define KSCATEGORY_WDMAUD_USE_PIN_NAME DEFINE_GUIDNAMED(KSCATEGORY_WDMAUD_USE_PIN_NAME) - - // Escalante Platform Interface - - #define STATIC_KSCATEGORY_ESCALANTE_PLATFORM_DRIVER \ - 0x74f3aea8L, 0x9768, 0x11d1, 0x8e, 0x07, 0x00, 0xa0, 0xc9, 0x5e, 0xc2, 0x2e - DEFINE_GUIDSTRUCT("74f3aea8-9768-11d1-8e07-00a0c95ec22e", KSCATEGORY_ESCALANTE_PLATFORM_DRIVER); - #define KSCATEGORY_ESCALANTE_PLATFORM_DRIVER DEFINE_GUIDNAMED(KSCATEGORY_ESCALANTE_PLATFORM_DRIVER) - - // -- major types --- - - // 'vids' == MEDIATYPE_Video, - #define STATIC_KSDATAFORMAT_TYPE_VIDEO\ - 0x73646976L, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 - DEFINE_GUIDSTRUCT("73646976-0000-0010-8000-00aa00389b71", KSDATAFORMAT_TYPE_VIDEO); - #define KSDATAFORMAT_TYPE_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_VIDEO) - - // 'auds' == MEDIATYPE_Audio - #define STATIC_KSDATAFORMAT_TYPE_AUDIO\ - 0x73647561L, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 - DEFINE_GUIDSTRUCT("73647561-0000-0010-8000-00aa00389b71", KSDATAFORMAT_TYPE_AUDIO); - #define KSDATAFORMAT_TYPE_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_AUDIO) - - // 'txts' == MEDIATYPE_Text - #define STATIC_KSDATAFORMAT_TYPE_TEXT\ - 0x73747874L, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 - DEFINE_GUIDSTRUCT("73747874-0000-0010-8000-00aa00389b71", KSDATAFORMAT_TYPE_TEXT); - #define KSDATAFORMAT_TYPE_TEXT DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_TEXT) - - #if !defined( DEFINE_WAVEFORMATEX_GUID ) - #define DEFINE_WAVEFORMATEX_GUID(x) (USHORT)(x), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 - #endif - - #define STATIC_KSDATAFORMAT_SUBTYPE_WAVEFORMATEX\ - 0x00000000L, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 - DEFINE_GUIDSTRUCT("00000000-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_WAVEFORMATEX); - #define KSDATAFORMAT_SUBTYPE_WAVEFORMATEX DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_WAVEFORMATEX) - - #define INIT_WAVEFORMATEX_GUID(Guid, x)\ - {\ - *(Guid) = KSDATAFORMAT_SUBTYPE_WAVEFORMATEX;\ - (Guid)->Data1 = (USHORT)(x);\ - } - - #define EXTRACT_WAVEFORMATEX_ID(Guid)\ - (USHORT)((Guid)->Data1) - - #define IS_VALID_WAVEFORMATEX_GUID(Guid)\ - (!memcmp(((PUSHORT)&KSDATAFORMAT_SUBTYPE_WAVEFORMATEX) + 1, ((PUSHORT)(Guid)) + 1, sizeof(GUID) - sizeof(USHORT))) - - #if !defined(INIT_MMREG_MID) - //{d5a47fa7-6d98-11d1-a21a-00a0c9223196} - #define INIT_MMREG_MID(guid, id)\ - {\ - (guid)->Data1 = 0xd5a47fa7 + (USHORT)(id);\ - (guid)->Data2 = 0x6d98;\ - (guid)->Data3 = 0x11d1;\ - (guid)->Data4[0] = 0xa2;\ - (guid)->Data4[1] = 0x1a;\ - (guid)->Data4[2] = 0x00;\ - (guid)->Data4[3] = 0xa0;\ - (guid)->Data4[4] = 0xc9;\ - (guid)->Data4[5] = 0x22;\ - (guid)->Data4[6] = 0x31;\ - (guid)->Data4[7] = 0x96;\ - } - #define EXTRACT_MMREG_MID(guid)\ - (USHORT)((guid)->Data1 - 0xd5a47fa7) - #define DEFINE_MMREG_MID_GUID(id)\ - 0xd5a47fa7+(USHORT)(id), 0x6d98, 0x11d1, 0xa2, 0x1a, 0x00, 0xa0, 0xc9, 0x22, 0x31, 0x96 - - #define IS_COMPATIBLE_MMREG_MID(guid)\ - (((guid)->Data1 >= 0xd5a47fa7) &&\ - ((guid)->Data1 < 0xd5a47fa7 + 0xffff) &&\ - ((guid)->Data2 == 0x6d98) &&\ - ((guid)->Data3 == 0x11d1) &&\ - ((guid)->Data4[0] == 0xa2) &&\ - ((guid)->Data4[1] == 0x1a) &&\ - ((guid)->Data4[2] == 0x00) &&\ - ((guid)->Data4[3] == 0xa0) &&\ - ((guid)->Data4[4] == 0xc9) &&\ - ((guid)->Data4[5] == 0x22) &&\ - ((guid)->Data4[6] == 0x31) &&\ - ((guid)->Data4[7] == 0x96)) - #endif // !defined(INIT_MMREG_MID) - - #if !defined(INIT_MMREG_PID) - //{e36dc2ac-6d9a-11d1-a21a-00a0c9223196} - #define INIT_MMREG_PID(guid, id)\ - {\ - (guid)->Data1 = 0xe36dc2ac + (USHORT)(id);\ - (guid)->Data2 = 0x6d9a;\ - (guid)->Data3 = 0x11d1;\ - (guid)->Data4[0] = 0xa2;\ - (guid)->Data4[1] = 0x1a;\ - (guid)->Data4[2] = 0x00;\ - (guid)->Data4[3] = 0xa0;\ - (guid)->Data4[4] = 0xc9;\ - (guid)->Data4[5] = 0x22;\ - (guid)->Data4[6] = 0x31;\ - (guid)->Data4[7] = 0x96;\ - } - #define EXTRACT_MMREG_PID(guid)\ - (USHORT)((guid)->Data1 - 0xe36dc2ac) - #define DEFINE_MMREG_PID_GUID(id)\ - 0xe36dc2ac+(USHORT)(id), 0x6d9a, 0x11d1, 0xa2, 0x1a, 0x00, 0xa0, 0xc9, 0x22, 0x31, 0x96 - - #define IS_COMPATIBLE_MMREG_PID(guid)\ - (((guid)->Data1 >= 0xe36dc2ac) &&\ - ((guid)->Data1 < 0xe36dc2ac + 0xffff) &&\ - ((guid)->Data2 == 0x6d9a) &&\ - ((guid)->Data3 == 0x11d1) &&\ - ((guid)->Data4[0] == 0xa2) &&\ - ((guid)->Data4[1] == 0x1a) &&\ - ((guid)->Data4[2] == 0x00) &&\ - ((guid)->Data4[3] == 0xa0) &&\ - ((guid)->Data4[4] == 0xc9) &&\ - ((guid)->Data4[5] == 0x22) &&\ - ((guid)->Data4[6] == 0x31) &&\ - ((guid)->Data4[7] == 0x96)) - #endif // !defined(INIT_MMREG_PID) - - #define STATIC_KSDATAFORMAT_SUBTYPE_ANALOG\ - 0x6dba3190L, 0x67bd, 0x11cf, 0xa0, 0xf7, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 - DEFINE_GUIDSTRUCT("6dba3190-67bd-11cf-a0f7-0020afd156e4", KSDATAFORMAT_SUBTYPE_ANALOG); - #define KSDATAFORMAT_SUBTYPE_ANALOG DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ANALOG) - - #define STATIC_KSDATAFORMAT_SUBTYPE_PCM\ - DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_PCM) - DEFINE_GUIDSTRUCT("00000001-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_PCM); - #define KSDATAFORMAT_SUBTYPE_PCM DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_PCM) - - #if defined(_INC_MMREG) - #define STATIC_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT\ - DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_IEEE_FLOAT) - DEFINE_GUIDSTRUCT("00000003-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_IEEE_FLOAT); - #define KSDATAFORMAT_SUBTYPE_IEEE_FLOAT DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT) - - #define STATIC_KSDATAFORMAT_SUBTYPE_DRM\ - DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DRM) - DEFINE_GUIDSTRUCT("00000009-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_DRM); - #define KSDATAFORMAT_SUBTYPE_DRM DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DRM) - - #define STATIC_KSDATAFORMAT_SUBTYPE_ALAW\ - DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_ALAW) - DEFINE_GUIDSTRUCT("00000006-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_ALAW); - #define KSDATAFORMAT_SUBTYPE_ALAW DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ALAW) - - #define STATIC_KSDATAFORMAT_SUBTYPE_MULAW\ - DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_MULAW) - DEFINE_GUIDSTRUCT("00000007-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_MULAW); - #define KSDATAFORMAT_SUBTYPE_MULAW DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MULAW) - - #define STATIC_KSDATAFORMAT_SUBTYPE_ADPCM\ - DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_ADPCM) - DEFINE_GUIDSTRUCT("00000002-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_ADPCM); - #define KSDATAFORMAT_SUBTYPE_ADPCM DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ADPCM) - - #define STATIC_KSDATAFORMAT_SUBTYPE_MPEG\ - DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_MPEG) - DEFINE_GUIDSTRUCT("00000050-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_MPEG); - #define KSDATAFORMAT_SUBTYPE_MPEG DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG) - #endif // defined(_INC_MMREG) - - #define STATIC_KSDATAFORMAT_SPECIFIER_VC_ID\ - 0xAD98D184L, 0xAAC3, 0x11D0, 0xA4, 0x1C, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("AD98D184-AAC3-11D0-A41C-00A0C9223196", KSDATAFORMAT_SPECIFIER_VC_ID); - #define KSDATAFORMAT_SPECIFIER_VC_ID DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_VC_ID) - - #define STATIC_KSDATAFORMAT_SPECIFIER_WAVEFORMATEX\ - 0x05589f81L, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a - DEFINE_GUIDSTRUCT("05589f81-c356-11ce-bf01-00aa0055595a", KSDATAFORMAT_SPECIFIER_WAVEFORMATEX); - #define KSDATAFORMAT_SPECIFIER_WAVEFORMATEX DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX) - - #define STATIC_KSDATAFORMAT_SPECIFIER_DSOUND\ - 0x518590a2L, 0xa184, 0x11d0, 0x85, 0x22, 0x00, 0xc0, 0x4f, 0xd9, 0xba, 0xf3 - DEFINE_GUIDSTRUCT("518590a2-a184-11d0-8522-00c04fd9baf3", KSDATAFORMAT_SPECIFIER_DSOUND); - #define KSDATAFORMAT_SPECIFIER_DSOUND DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DSOUND) - - #if defined(_INC_MMSYSTEM) || defined(_INC_MMREG) - #if !defined( PACK_PRAGMAS_NOT_SUPPORTED ) - #include - #endif - typedef struct { - KSDATAFORMAT DataFormat; - WAVEFORMATEX WaveFormatEx; - } KSDATAFORMAT_WAVEFORMATEX, *PKSDATAFORMAT_WAVEFORMATEX; - - #ifndef _WAVEFORMATEXTENSIBLE_ - #define _WAVEFORMATEXTENSIBLE_ - typedef struct { - WAVEFORMATEX Format; - union { - WORD wValidBitsPerSample; /* bits of precision */ - WORD wSamplesPerBlock; /* valid if wBitsPerSample==0 */ - WORD wReserved; /* If neither applies, set to zero. */ - } Samples; - DWORD dwChannelMask; /* which channels are */ - /* present in stream */ - GUID SubFormat; - } WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE; - #endif // !_WAVEFORMATEXTENSIBLE_ - - #if !defined(WAVE_FORMAT_EXTENSIBLE) - #define WAVE_FORMAT_EXTENSIBLE 0xFFFE - #endif // !defined(WAVE_FORMAT_EXTENSIBLE) - - // DirectSound buffer description - typedef struct { - ULONG Flags; - ULONG Control; - WAVEFORMATEX WaveFormatEx; - } KSDSOUND_BUFFERDESC, *PKSDSOUND_BUFFERDESC; - - // DirectSound format - typedef struct { - KSDATAFORMAT DataFormat; - KSDSOUND_BUFFERDESC BufferDesc; - } KSDATAFORMAT_DSOUND, *PKSDATAFORMAT_DSOUND; - - #if !defined( PACK_PRAGMAS_NOT_SUPPORTED ) - #include - #endif - #endif // defined(_INC_MMSYSTEM) || defined(_INC_MMREG) - - - - // DirectSound buffer flags - #define KSDSOUND_BUFFER_PRIMARY 0x00000001 - #define KSDSOUND_BUFFER_STATIC 0x00000002 - #define KSDSOUND_BUFFER_LOCHARDWARE 0x00000004 - #define KSDSOUND_BUFFER_LOCSOFTWARE 0x00000008 - - // DirectSound buffer control flags - #define KSDSOUND_BUFFER_CTRL_3D 0x00000001 - #define KSDSOUND_BUFFER_CTRL_FREQUENCY 0x00000002 - #define KSDSOUND_BUFFER_CTRL_PAN 0x00000004 - #define KSDSOUND_BUFFER_CTRL_VOLUME 0x00000008 - #define KSDSOUND_BUFFER_CTRL_POSITIONNOTIFY 0x00000010 - - #define KSDSOUND_BUFFER_CTRL_HRTF_3D 0x40000000 - - typedef struct { - #if defined(_NTDDK_) - ULONGLONG PlayOffset; - ULONGLONG WriteOffset; - #else // !_NTDDK_ - DWORDLONG PlayOffset; - DWORDLONG WriteOffset; - #endif // !_NTDDK_ - } KSAUDIO_POSITION, *PKSAUDIO_POSITION; - - // DirectSound3D FIR context - typedef struct { - LONG Channel; - FLOAT VolSmoothScale; - FLOAT TotalDryAttenuation; - FLOAT TotalWetAttenuation; - LONG SmoothFrequency; - LONG Delay; - } KSDS3D_ITD_PARAMS, *PKSDS3D_ITD_PARAMS; - - typedef struct { - ULONG Enabled; - KSDS3D_ITD_PARAMS LeftParams; - KSDS3D_ITD_PARAMS RightParams; - ULONG Reserved; - } KSDS3D_ITD_PARAMS_MSG, *PKSDS3D_ITD_PARAMS_MSG; - - // DirectSound3D HRTF messages - - typedef struct { - ULONG Size; // This is the size of the struct in bytes - ULONG Enabled; - BOOL SwapChannels; - BOOL ZeroAzimuth; - BOOL CrossFadeOutput; - ULONG FilterSize; // This is the additional size of the filter coeff in bytes - } KSDS3D_HRTF_PARAMS_MSG, *PKSDS3D_HRTF_PARAMS_MSG; - - - // HRTF filter quality levels - typedef enum { - FULL_FILTER, - LIGHT_FILTER, - KSDS3D_FILTER_QUALITY_COUNT - } KSDS3D_HRTF_FILTER_QUALITY; - - typedef struct { - ULONG Size; // This is the size of the struct in bytes - KSDS3D_HRTF_FILTER_QUALITY Quality; - FLOAT SampleRate; - ULONG MaxFilterSize; - ULONG FilterTransientMuteLength; - ULONG FilterOverlapBufferLength; - ULONG OutputOverlapBufferLength; - ULONG Reserved; - } KSDS3D_HRTF_INIT_MSG, *PKSDS3D_HRTF_INIT_MSG; - - // Coefficient formats - typedef enum { - FLOAT_COEFF, - SHORT_COEFF, - KSDS3D_COEFF_COUNT - } KSDS3D_HRTF_COEFF_FORMAT; - - // Filter methods - typedef enum { - DIRECT_FORM, - CASCADE_FORM, - KSDS3D_FILTER_METHOD_COUNT - } KSDS3D_HRTF_FILTER_METHOD; - - // Filter methods - typedef enum { - DS3D_HRTF_VERSION_1 - } KSDS3D_HRTF_FILTER_VERSION; - - typedef struct { - KSDS3D_HRTF_FILTER_METHOD FilterMethod; - KSDS3D_HRTF_COEFF_FORMAT CoeffFormat; - KSDS3D_HRTF_FILTER_VERSION Version; - ULONG Reserved; - } KSDS3D_HRTF_FILTER_FORMAT_MSG, *PKSDS3D_HRTF_FILTER_FORMAT_MSG; - - //=========================================================================== - // DirectSound3D HAL - - - typedef struct _DS3DVECTOR { - union { - FLOAT x; - FLOAT dvX; - }; - union { - FLOAT y; - FLOAT dvY; - }; - union { - FLOAT z; - FLOAT dvZ; - }; - } DS3DVECTOR, *PDS3DVECTOR; - - - //=========================================================================== - //=========================================================================== - - // KSPROPSETID_DirectSound3DListener : {437B3414-D060-11d0-8583-00C04FD9BAF3} - - #define STATIC_KSPROPSETID_DirectSound3DListener\ - 0x437b3414L, 0xd060, 0x11d0, 0x85, 0x83, 0x00, 0xc0, 0x4f, 0xd9, 0xba, 0xf3 - DEFINE_GUIDSTRUCT("437b3414-d060-11d0-8583-00c04fd9baf3",KSPROPSETID_DirectSound3DListener); - #define KSPROPSETID_DirectSound3DListener DEFINE_GUIDNAMED(KSPROPSETID_DirectSound3DListener) - - typedef enum { - KSPROPERTY_DIRECTSOUND3DLISTENER_ALL, - KSPROPERTY_DIRECTSOUND3DLISTENER_POSITION, - KSPROPERTY_DIRECTSOUND3DLISTENER_VELOCITY, - KSPROPERTY_DIRECTSOUND3DLISTENER_ORIENTATION, - KSPROPERTY_DIRECTSOUND3DLISTENER_DISTANCEFACTOR, - KSPROPERTY_DIRECTSOUND3DLISTENER_ROLLOFFFACTOR, - KSPROPERTY_DIRECTSOUND3DLISTENER_DOPPLERFACTOR, - KSPROPERTY_DIRECTSOUND3DLISTENER_BATCH, - KSPROPERTY_DIRECTSOUND3DLISTENER_ALLOCATION - } KSPROPERTY_DIRECTSOUND3DLISTENER; - - typedef struct { - DS3DVECTOR Position; - DS3DVECTOR Velocity; - DS3DVECTOR OrientFront; - DS3DVECTOR OrientTop; - FLOAT DistanceFactor; - FLOAT RolloffFactor; - FLOAT DopplerFactor; - } KSDS3D_LISTENER_ALL, *PKSDS3D_LISTENER_ALL; - - typedef struct { - DS3DVECTOR Front; - DS3DVECTOR Top; - } KSDS3D_LISTENER_ORIENTATION, *PKSDS3D_LISTENER_ORIENTATION; - - - //=========================================================================== - //=========================================================================== - // KSPROPSETID_DirectSound3DBuffer : {437B3411-D060-11d0-8583-00C04FD9BAF3} - - #define STATIC_KSPROPSETID_DirectSound3DBuffer\ - 0x437b3411L, 0xd060, 0x11d0, 0x85, 0x83, 0x00, 0xc0, 0x4f, 0xd9, 0xba, 0xf3 - DEFINE_GUIDSTRUCT("437b3411-d060-11d0-8583-00c04fd9baf3", KSPROPSETID_DirectSound3DBuffer); - #define KSPROPSETID_DirectSound3DBuffer DEFINE_GUIDNAMED(KSPROPSETID_DirectSound3DBuffer) - - - typedef enum { - KSPROPERTY_DIRECTSOUND3DBUFFER_ALL, - KSPROPERTY_DIRECTSOUND3DBUFFER_POSITION, - KSPROPERTY_DIRECTSOUND3DBUFFER_VELOCITY, - KSPROPERTY_DIRECTSOUND3DBUFFER_CONEANGLES, - KSPROPERTY_DIRECTSOUND3DBUFFER_CONEORIENTATION, - KSPROPERTY_DIRECTSOUND3DBUFFER_CONEOUTSIDEVOLUME, - KSPROPERTY_DIRECTSOUND3DBUFFER_MINDISTANCE, - KSPROPERTY_DIRECTSOUND3DBUFFER_MAXDISTANCE, - KSPROPERTY_DIRECTSOUND3DBUFFER_MODE - } KSPROPERTY_DIRECTSOUND3DBUFFER; - - - typedef struct { - DS3DVECTOR Position; - DS3DVECTOR Velocity; - ULONG InsideConeAngle; - ULONG OutsideConeAngle; - DS3DVECTOR ConeOrientation; - LONG ConeOutsideVolume; - FLOAT MinDistance; - FLOAT MaxDistance; - ULONG Mode; - } KSDS3D_BUFFER_ALL, *PKSDS3D_BUFFER_ALL; - - typedef struct { - ULONG InsideConeAngle; - ULONG OutsideConeAngle; - } KSDS3D_BUFFER_CONE_ANGLES, *PKSDS3D_BUFFER_CONE_ANGLES; - - #define KSAUDIO_STEREO_SPEAKER_GEOMETRY_HEADPHONE (-1) - #define KSAUDIO_STEREO_SPEAKER_GEOMETRY_MIN 5 - #define KSAUDIO_STEREO_SPEAKER_GEOMETRY_NARROW 10 - #define KSAUDIO_STEREO_SPEAKER_GEOMETRY_WIDE 20 - #define KSAUDIO_STEREO_SPEAKER_GEOMETRY_MAX 180 - - #define KSDSOUND_3D_MODE_NORMAL 0x00000000 - #define KSDSOUND_3D_MODE_HEADRELATIVE 0x00000001 - #define KSDSOUND_3D_MODE_DISABLE 0x00000002 - - typedef struct { - KSDATARANGE DataRange; - ULONG MaximumChannels; - ULONG MinimumBitsPerSample; - ULONG MaximumBitsPerSample; - ULONG MinimumSampleFrequency; - ULONG MaximumSampleFrequency; - } KSDATARANGE_AUDIO, *PKSDATARANGE_AUDIO; - - //--------------------------------------------------------------------------- - - #define STATIC_KSDATAFORMAT_SUBTYPE_RIFF\ - 0x4995DAEEL, 0x9EE6, 0x11D0, 0xA4, 0x0E, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("4995DAEE-9EE6-11D0-A40E-00A0C9223196", KSDATAFORMAT_SUBTYPE_RIFF); - #define KSDATAFORMAT_SUBTYPE_RIFF DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_RIFF) - - #define STATIC_KSDATAFORMAT_SUBTYPE_RIFFWAVE\ - 0xe436eb8bL, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 - DEFINE_GUIDSTRUCT("e436eb8b-524f-11ce-9f53-0020af0ba770", KSDATAFORMAT_SUBTYPE_RIFFWAVE); - #define KSDATAFORMAT_SUBTYPE_RIFFWAVE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_RIFFWAVE) - - //=========================================================================== - //=========================================================================== - - #define STATIC_KSPROPSETID_Bibliographic \ - 0x07BA150EL, 0xE2B1, 0x11D0, 0xAC, 0x17, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("07BA150E-E2B1-11D0-AC17-00A0C9223196", KSPROPSETID_Bibliographic); - #define KSPROPSETID_Bibliographic DEFINE_GUIDNAMED(KSPROPSETID_Bibliographic) - - //Repeatable tags contain all entries within the property, each preceeded by length - typedef enum { - KSPROPERTY_BIBLIOGRAPHIC_LEADER = 'RDL ', - KSPROPERTY_BIBLIOGRAPHIC_LCCN = '010 ', - KSPROPERTY_BIBLIOGRAPHIC_ISBN = '020 ', - KSPROPERTY_BIBLIOGRAPHIC_ISSN = '220 ', - KSPROPERTY_BIBLIOGRAPHIC_CATALOGINGSOURCE = '040 ', - KSPROPERTY_BIBLIOGRAPHIC_MAINPERSONALNAME = '001 ', - KSPROPERTY_BIBLIOGRAPHIC_MAINCORPORATEBODY = '011 ', - KSPROPERTY_BIBLIOGRAPHIC_MAINMEETINGNAME = '111 ', - KSPROPERTY_BIBLIOGRAPHIC_MAINUNIFORMTITLE = '031 ', - KSPROPERTY_BIBLIOGRAPHIC_UNIFORMTITLE = '042 ', - KSPROPERTY_BIBLIOGRAPHIC_TITLESTATEMENT = '542 ', - KSPROPERTY_BIBLIOGRAPHIC_VARYINGFORMTITLE = '642 ', - KSPROPERTY_BIBLIOGRAPHIC_PUBLICATION = '062 ', - KSPROPERTY_BIBLIOGRAPHIC_PHYSICALDESCRIPTION = '003 ', - KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYTITLE = '044 ', - KSPROPERTY_BIBLIOGRAPHIC_SERIESSTATEMENT = '094 ', - KSPROPERTY_BIBLIOGRAPHIC_GENERALNOTE = '005 ', - KSPROPERTY_BIBLIOGRAPHIC_BIBLIOGRAPHYNOTE = '405 ', - KSPROPERTY_BIBLIOGRAPHIC_CONTENTSNOTE = '505 ', - KSPROPERTY_BIBLIOGRAPHIC_CREATIONCREDIT = '805 ', - KSPROPERTY_BIBLIOGRAPHIC_CITATION = '015 ', - KSPROPERTY_BIBLIOGRAPHIC_PARTICIPANT = '115 ', - KSPROPERTY_BIBLIOGRAPHIC_SUMMARY = '025 ', - KSPROPERTY_BIBLIOGRAPHIC_TARGETAUDIENCE = '125 ', - KSPROPERTY_BIBLIOGRAPHIC_ADDEDFORMAVAILABLE = '035 ', - KSPROPERTY_BIBLIOGRAPHIC_SYSTEMDETAILS = '835 ', - KSPROPERTY_BIBLIOGRAPHIC_AWARDS = '685 ', - KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYPERSONALNAME = '006 ', - KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYTOPICALTERM = '056 ', - KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYGEOGRAPHIC = '156 ', - KSPROPERTY_BIBLIOGRAPHIC_INDEXTERMGENRE = '556 ', - KSPROPERTY_BIBLIOGRAPHIC_INDEXTERMCURRICULUM = '856 ', - KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYUNIFORMTITLE = '037 ', - KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYRELATED = '047 ', - KSPROPERTY_BIBLIOGRAPHIC_SERIESSTATEMENTPERSONALNAME = '008 ', - KSPROPERTY_BIBLIOGRAPHIC_SERIESSTATEMENTUNIFORMTITLE = '038 ' - } KSPROPERTY_BIBLIOGRAPHIC; - - #define STATIC_KSPROPSETID_TopologyNode\ - 0x45FFAAA1L, 0x6E1B, 0x11D0, 0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00 - DEFINE_GUIDSTRUCT("45FFAAA1-6E1B-11D0-BCF2-444553540000", KSPROPSETID_TopologyNode); - #define KSPROPSETID_TopologyNode DEFINE_GUIDNAMED(KSPROPSETID_TopologyNode) - - typedef enum { - KSPROPERTY_TOPOLOGYNODE_ENABLE = 1, - KSPROPERTY_TOPOLOGYNODE_RESET - } KSPROPERTY_TOPOLOGYNODE; - - //=========================================================================== - #define STATIC_KSPROPSETID_DrmAudioStream\ - 0x2f2c8ddd, 0x4198, 0x4fac, 0xba, 0x29, 0x61, 0xbb, 0x5, 0xb7, 0xde, 0x6 - DEFINE_GUIDSTRUCT("2F2C8DDD-4198-4fac-BA29-61BB05B7DE06", KSPROPSETID_DrmAudioStream); - #define KSPROPSETID_DrmAudioStream DEFINE_GUIDNAMED(KSPROPSETID_DrmAudioStream) - - typedef enum { - KSPROPERTY_DRMAUDIOSTREAM_CONTENTID, - KSPROPERTY_DRMAUDIOSTREAM_AUTHENTICATEFUNCTION - } KSPROPERTY_DRMAUDIOSTREAM; - - //=========================================================================== - #define STATIC_KSPROPSETID_Audio\ - 0x45FFAAA0L, 0x6E1B, 0x11D0, 0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00 - DEFINE_GUIDSTRUCT("45FFAAA0-6E1B-11D0-BCF2-444553540000", KSPROPSETID_Audio); - #define KSPROPSETID_Audio DEFINE_GUIDNAMED(KSPROPSETID_Audio) - - typedef enum { - KSPROPERTY_AUDIO_LATENCY = 1, - KSPROPERTY_AUDIO_COPY_PROTECTION, - KSPROPERTY_AUDIO_CHANNEL_CONFIG, - KSPROPERTY_AUDIO_VOLUMELEVEL, - KSPROPERTY_AUDIO_POSITION, - KSPROPERTY_AUDIO_DYNAMIC_RANGE, - KSPROPERTY_AUDIO_QUALITY, - KSPROPERTY_AUDIO_SAMPLING_RATE, - KSPROPERTY_AUDIO_DYNAMIC_SAMPLING_RATE, - KSPROPERTY_AUDIO_MIX_LEVEL_TABLE, - KSPROPERTY_AUDIO_MIX_LEVEL_CAPS, - KSPROPERTY_AUDIO_MUX_SOURCE, - KSPROPERTY_AUDIO_MUTE, - KSPROPERTY_AUDIO_BASS, - KSPROPERTY_AUDIO_MID, - KSPROPERTY_AUDIO_TREBLE, - KSPROPERTY_AUDIO_BASS_BOOST, - KSPROPERTY_AUDIO_EQ_LEVEL, - KSPROPERTY_AUDIO_NUM_EQ_BANDS, - KSPROPERTY_AUDIO_EQ_BANDS, - KSPROPERTY_AUDIO_AGC, - KSPROPERTY_AUDIO_DELAY, - KSPROPERTY_AUDIO_LOUDNESS, - KSPROPERTY_AUDIO_WIDE_MODE, - KSPROPERTY_AUDIO_WIDENESS, - KSPROPERTY_AUDIO_REVERB_LEVEL, - KSPROPERTY_AUDIO_CHORUS_LEVEL, - KSPROPERTY_AUDIO_DEV_SPECIFIC, - KSPROPERTY_AUDIO_DEMUX_DEST, - KSPROPERTY_AUDIO_STEREO_ENHANCE, - KSPROPERTY_AUDIO_MANUFACTURE_GUID, - KSPROPERTY_AUDIO_PRODUCT_GUID, - KSPROPERTY_AUDIO_CPU_RESOURCES, - KSPROPERTY_AUDIO_STEREO_SPEAKER_GEOMETRY, - KSPROPERTY_AUDIO_SURROUND_ENCODE, - KSPROPERTY_AUDIO_3D_INTERFACE, - KSPROPERTY_AUDIO_PEAKMETER, - KSPROPERTY_AUDIO_ALGORITHM_INSTANCE - } KSPROPERTY_AUDIO; - - // Audio quality constants - #define KSAUDIO_QUALITY_WORST 0x0 - #define KSAUDIO_QUALITY_PC 0x1 - #define KSAUDIO_QUALITY_BASIC 0x2 - #define KSAUDIO_QUALITY_ADVANCED 0x3 - - // Audio CPU resource constants - #define KSAUDIO_CPU_RESOURCES_NOT_HOST_CPU 0x00000000 - #define KSAUDIO_CPU_RESOURCES_HOST_CPU 0x7FFFFFFF - - typedef struct { - BOOL fCopyrighted; - BOOL fOriginal; - } KSAUDIO_COPY_PROTECTION, *PKSAUDIO_COPY_PROTECTION; - - typedef struct { - LONG ActiveSpeakerPositions; - } KSAUDIO_CHANNEL_CONFIG, *PKSAUDIO_CHANNEL_CONFIG; - - // Speaker Positions: - #define SPEAKER_FRONT_LEFT 0x1 - #define SPEAKER_FRONT_RIGHT 0x2 - #define SPEAKER_FRONT_CENTER 0x4 - #define SPEAKER_LOW_FREQUENCY 0x8 - #define SPEAKER_BACK_LEFT 0x10 - #define SPEAKER_BACK_RIGHT 0x20 - #define SPEAKER_FRONT_LEFT_OF_CENTER 0x40 - #define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80 - #define SPEAKER_BACK_CENTER 0x100 - #define SPEAKER_SIDE_LEFT 0x200 - #define SPEAKER_SIDE_RIGHT 0x400 - #define SPEAKER_TOP_CENTER 0x800 - #define SPEAKER_TOP_FRONT_LEFT 0x1000 - #define SPEAKER_TOP_FRONT_CENTER 0x2000 - #define SPEAKER_TOP_FRONT_RIGHT 0x4000 - #define SPEAKER_TOP_BACK_LEFT 0x8000 - #define SPEAKER_TOP_BACK_CENTER 0x10000 - #define SPEAKER_TOP_BACK_RIGHT 0x20000 - - // Bit mask locations reserved for future use - #define SPEAKER_RESERVED 0x7FFC0000 - - // Used to specify that any possible permutation of speaker configurations - #define SPEAKER_ALL 0x80000000 - - // DirectSound Speaker Config - #define KSAUDIO_SPEAKER_MONO (SPEAKER_FRONT_CENTER) - #define KSAUDIO_SPEAKER_STEREO (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT) - #define KSAUDIO_SPEAKER_QUAD (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ - SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT) - #define KSAUDIO_SPEAKER_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ - SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER) - #define KSAUDIO_SPEAKER_5POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ - SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | \ - SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT) - #define KSAUDIO_SPEAKER_7POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ - SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | \ - SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | \ - SPEAKER_FRONT_LEFT_OF_CENTER | SPEAKER_FRONT_RIGHT_OF_CENTER) - - // DVD Speaker Positions - #define KSAUDIO_SPEAKER_GROUND_FRONT_LEFT SPEAKER_FRONT_LEFT - #define KSAUDIO_SPEAKER_GROUND_FRONT_CENTER SPEAKER_FRONT_CENTER - #define KSAUDIO_SPEAKER_GROUND_FRONT_RIGHT SPEAKER_FRONT_RIGHT - #define KSAUDIO_SPEAKER_GROUND_REAR_LEFT SPEAKER_BACK_LEFT - #define KSAUDIO_SPEAKER_GROUND_REAR_RIGHT SPEAKER_BACK_RIGHT - #define KSAUDIO_SPEAKER_TOP_MIDDLE SPEAKER_TOP_CENTER - #define KSAUDIO_SPEAKER_SUPER_WOOFER SPEAKER_LOW_FREQUENCY - - typedef struct { - ULONG QuietCompression; - ULONG LoudCompression; - } KSAUDIO_DYNAMIC_RANGE, *PKSAUDIO_DYNAMIC_RANGE; - - typedef struct { - BOOL Mute; - LONG Level; - } KSAUDIO_MIXLEVEL, *PKSAUDIO_MIXLEVEL; - - typedef struct { - BOOL Mute; - LONG Minimum; - LONG Maximum; - LONG Reset; - } KSAUDIO_MIX_CAPS, *PKSAUDIO_MIX_CAPS; - - typedef struct { - ULONG InputChannels; - ULONG OutputChannels; - KSAUDIO_MIX_CAPS Capabilities[1]; - } KSAUDIO_MIXCAP_TABLE, *PKSAUDIO_MIXCAP_TABLE; - - typedef enum { - SE_TECH_NONE, - SE_TECH_ANALOG_DEVICES_PHAT, - SE_TECH_CREATIVE, - SE_TECH_NATIONAL_SEMI, - SE_TECH_YAMAHA_YMERSION, - SE_TECH_BBE, - SE_TECH_CRYSTAL_SEMI, - SE_TECH_QSOUND_QXPANDER, - SE_TECH_SPATIALIZER, - SE_TECH_SRS, - SE_TECH_PLATFORM_TECH, - SE_TECH_AKM, - SE_TECH_AUREAL, - SE_TECH_AZTECH, - SE_TECH_BINAURA, - SE_TECH_ESS_TECH, - SE_TECH_HARMAN_VMAX, - SE_TECH_NVIDEA, - SE_TECH_PHILIPS_INCREDIBLE, - SE_TECH_TEXAS_INST, - SE_TECH_VLSI_TECH - } SE_TECHNIQUE; - - typedef struct { - SE_TECHNIQUE Technique; - ULONG Center; - ULONG Depth; - ULONG Reserved; - } KSAUDIO_STEREO_ENHANCE, *PKSAUDIO_STEREO_ENHANCE; - - //=========================================================================== - // Topology Node Type GUIDs - - #define STATIC_KSNODETYPE_DAC\ - 0x507AE360L, 0xC554, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("507AE360-C554-11D0-8A2B-00A0C9255AC1", KSNODETYPE_DAC); - #define KSNODETYPE_DAC DEFINE_GUIDNAMED(KSNODETYPE_DAC) - - #define STATIC_KSNODETYPE_ADC\ - 0x4D837FE0L, 0xC555, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("4D837FE0-C555-11D0-8A2B-00A0C9255AC1", KSNODETYPE_ADC); - #define KSNODETYPE_ADC DEFINE_GUIDNAMED(KSNODETYPE_ADC) - - #define STATIC_KSNODETYPE_SRC\ - 0x9DB7B9E0L, 0xC555, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("9DB7B9E0-C555-11D0-8A2B-00A0C9255AC1", KSNODETYPE_SRC); - #define KSNODETYPE_SRC DEFINE_GUIDNAMED(KSNODETYPE_SRC) - - #define STATIC_KSNODETYPE_SUPERMIX\ - 0xE573ADC0L, 0xC555, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("E573ADC0-C555-11D0-8A2B-00A0C9255AC1", KSNODETYPE_SUPERMIX); - #define KSNODETYPE_SUPERMIX DEFINE_GUIDNAMED(KSNODETYPE_SUPERMIX) - - #define STATIC_KSNODETYPE_MUX\ - 0x2CEAF780L, 0xC556, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("2CEAF780-C556-11D0-8A2B-00A0C9255AC1", KSNODETYPE_MUX); - #define KSNODETYPE_MUX DEFINE_GUIDNAMED(KSNODETYPE_MUX) - - #define STATIC_KSNODETYPE_DEMUX\ - 0xC0EB67D4L, 0xE807, 0x11D0, 0x95, 0x8A, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("C0EB67D4-E807-11D0-958A-00C04FB925D3", KSNODETYPE_DEMUX); - #define KSNODETYPE_DEMUX DEFINE_GUIDNAMED(KSNODETYPE_DEMUX) - - #define STATIC_KSNODETYPE_SUM\ - 0xDA441A60L, 0xC556, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("DA441A60-C556-11D0-8A2B-00A0C9255AC1", KSNODETYPE_SUM); - #define KSNODETYPE_SUM DEFINE_GUIDNAMED(KSNODETYPE_SUM) - - #define STATIC_KSNODETYPE_MUTE\ - 0x02B223C0L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("02B223C0-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_MUTE); - #define KSNODETYPE_MUTE DEFINE_GUIDNAMED(KSNODETYPE_MUTE) - - #define STATIC_KSNODETYPE_VOLUME\ - 0x3A5ACC00L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("3A5ACC00-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_VOLUME); - #define KSNODETYPE_VOLUME DEFINE_GUIDNAMED(KSNODETYPE_VOLUME) - - #define STATIC_KSNODETYPE_TONE\ - 0x7607E580L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("7607E580-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_TONE); - #define KSNODETYPE_TONE DEFINE_GUIDNAMED(KSNODETYPE_TONE) - - #define STATIC_KSNODETYPE_EQUALIZER\ - 0x9D41B4A0L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("9D41B4A0-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_EQUALIZER); - #define KSNODETYPE_EQUALIZER DEFINE_GUIDNAMED(KSNODETYPE_EQUALIZER) - - #define STATIC_KSNODETYPE_AGC\ - 0xE88C9BA0L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("E88C9BA0-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_AGC); - #define KSNODETYPE_AGC DEFINE_GUIDNAMED(KSNODETYPE_AGC) - - #define STATIC_KSNODETYPE_NOISE_SUPPRESS\ - 0xe07f903f, 0x62fd, 0x4e60, 0x8c, 0xdd, 0xde, 0xa7, 0x23, 0x66, 0x65, 0xb5 - DEFINE_GUIDSTRUCT("E07F903F-62FD-4e60-8CDD-DEA7236665B5", KSNODETYPE_NOISE_SUPPRESS); - #define KSNODETYPE_NOISE_SUPPRESS DEFINE_GUIDNAMED(KSNODETYPE_NOISE_SUPPRESS) - - #define STATIC_KSNODETYPE_DELAY\ - 0x144981E0L, 0xC558, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("144981E0-C558-11D0-8A2B-00A0C9255AC1", KSNODETYPE_DELAY); - #define KSNODETYPE_DELAY DEFINE_GUIDNAMED(KSNODETYPE_DELAY) - - #define STATIC_KSNODETYPE_LOUDNESS\ - 0x41887440L, 0xC558, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("41887440-C558-11D0-8A2B-00A0C9255AC1", KSNODETYPE_LOUDNESS); - #define KSNODETYPE_LOUDNESS DEFINE_GUIDNAMED(KSNODETYPE_LOUDNESS) - - #define STATIC_KSNODETYPE_PROLOGIC_DECODER\ - 0x831C2C80L, 0xC558, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("831C2C80-C558-11D0-8A2B-00A0C9255AC1", KSNODETYPE_PROLOGIC_DECODER); - #define KSNODETYPE_PROLOGIC_DECODER DEFINE_GUIDNAMED(KSNODETYPE_PROLOGIC_DECODER) - - #define STATIC_KSNODETYPE_STEREO_WIDE\ - 0xA9E69800L, 0xC558, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("A9E69800-C558-11D0-8A2B-00A0C9255AC1", KSNODETYPE_STEREO_WIDE); - #define KSNODETYPE_STEREO_WIDE DEFINE_GUIDNAMED(KSNODETYPE_STEREO_WIDE) - - #define STATIC_KSNODETYPE_STEREO_ENHANCE\ - 0xAF6878ACL, 0xE83F, 0x11D0, 0x95, 0x8A, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("AF6878AC-E83F-11D0-958A-00C04FB925D3", KSNODETYPE_STEREO_ENHANCE); - #define KSNODETYPE_STEREO_ENHANCE DEFINE_GUIDNAMED(KSNODETYPE_STEREO_ENHANCE) - - #define STATIC_KSNODETYPE_REVERB\ - 0xEF0328E0L, 0xC558, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("EF0328E0-C558-11D0-8A2B-00A0C9255AC1", KSNODETYPE_REVERB); - #define KSNODETYPE_REVERB DEFINE_GUIDNAMED(KSNODETYPE_REVERB) - - #define STATIC_KSNODETYPE_CHORUS\ - 0x20173F20L, 0xC559, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("20173F20-C559-11D0-8A2B-00A0C9255AC1", KSNODETYPE_CHORUS); - #define KSNODETYPE_CHORUS DEFINE_GUIDNAMED(KSNODETYPE_CHORUS) - - #define STATIC_KSNODETYPE_3D_EFFECTS\ - 0x55515860L, 0xC559, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("55515860-C559-11D0-8A2B-00A0C9255AC1", KSNODETYPE_3D_EFFECTS); - #define KSNODETYPE_3D_EFFECTS DEFINE_GUIDNAMED(KSNODETYPE_3D_EFFECTS) - - #define STATIC_KSNODETYPE_ACOUSTIC_ECHO_CANCEL STATIC_KSCATEGORY_ACOUSTIC_ECHO_CANCEL - #define KSNODETYPE_ACOUSTIC_ECHO_CANCEL KSCATEGORY_ACOUSTIC_ECHO_CANCEL - - #define STATIC_KSNODETYPE_MICROPHONE_ARRAY_PROCESSOR STATIC_KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR - #define KSNODETYPE_MICROPHONE_ARRAY_PROCESSOR KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR - - #define STATIC_KSNODETYPE_DEV_SPECIFIC\ - 0x941C7AC0L, 0xC559, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1 - DEFINE_GUIDSTRUCT("941C7AC0-C559-11D0-8A2B-00A0C9255AC1", KSNODETYPE_DEV_SPECIFIC); - #define KSNODETYPE_DEV_SPECIFIC DEFINE_GUIDNAMED(KSNODETYPE_DEV_SPECIFIC) - - #define STATIC_KSNODETYPE_SURROUND_ENCODER\ - 0x8074C5B2L, 0x3C66, 0x11D2, 0xB4, 0x5A, 0x30, 0x78, 0x30, 0x2C, 0x20, 0x30 - DEFINE_GUIDSTRUCT("8074C5B2-3C66-11D2-B45A-3078302C2030", KSNODETYPE_SURROUND_ENCODER); - #define KSNODETYPE_SURROUND_ENCODER DEFINE_GUIDNAMED(KSNODETYPE_SURROUND_ENCODER) - - #define STATIC_KSNODETYPE_PEAKMETER\ - 0xa085651eL, 0x5f0d, 0x4b36, 0xa8, 0x69, 0xd1, 0x95, 0xd6, 0xab, 0x4b, 0x9e - DEFINE_GUIDSTRUCT("A085651E-5F0D-4b36-A869-D195D6AB4B9E", KSNODETYPE_PEAKMETER); - #define KSNODETYPE_PEAKMETER DEFINE_GUIDNAMED(KSNODETYPE_PEAKMETER) - - //=========================================================================== - // Topology Node Name GUIDs for common audio nodes - #define STATIC_KSAUDFNAME_BASS\ - 0x185FEDE0L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDE0-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_BASS); - #define KSAUDFNAME_BASS DEFINE_GUIDNAMED(KSAUDFNAME_BASS) - - #define STATIC_KSAUDFNAME_TREBLE\ - 0x185FEDE1L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDE1-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_TREBLE); - #define KSAUDFNAME_TREBLE DEFINE_GUIDNAMED(KSAUDFNAME_TREBLE) - - #define STATIC_KSAUDFNAME_3D_STEREO\ - 0x185FEDE2L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDE2-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_3D_STEREO); - #define KSAUDFNAME_3D_STEREO DEFINE_GUIDNAMED(KSAUDFNAME_3D_STEREO) - - #define STATIC_KSAUDFNAME_MASTER_VOLUME\ - 0x185FEDE3L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDE3-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MASTER_VOLUME); - #define KSAUDFNAME_MASTER_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MASTER_VOLUME) - - #define STATIC_KSAUDFNAME_MASTER_MUTE\ - 0x185FEDE4L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDE4-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MASTER_MUTE); - #define KSAUDFNAME_MASTER_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MASTER_MUTE) - - #define STATIC_KSAUDFNAME_WAVE_VOLUME\ - 0x185FEDE5L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDE5-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_WAVE_VOLUME); - #define KSAUDFNAME_WAVE_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_WAVE_VOLUME) - - #define STATIC_KSAUDFNAME_WAVE_MUTE\ - 0x185FEDE6L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDE6-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_WAVE_MUTE); - #define KSAUDFNAME_WAVE_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_WAVE_MUTE) - - #define STATIC_KSAUDFNAME_MIDI_VOLUME\ - 0x185FEDE7L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDE7-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIDI_VOLUME); - #define KSAUDFNAME_MIDI_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MIDI_VOLUME) - - #define STATIC_KSAUDFNAME_MIDI_MUTE\ - 0x185FEDE8L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDE8-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIDI_MUTE); - #define KSAUDFNAME_MIDI_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MIDI_MUTE) - - #define STATIC_KSAUDFNAME_CD_VOLUME\ - 0x185FEDE9L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDE9-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_CD_VOLUME); - #define KSAUDFNAME_CD_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_CD_VOLUME) - - #define STATIC_KSAUDFNAME_CD_MUTE\ - 0x185FEDEAL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDEA-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_CD_MUTE); - #define KSAUDFNAME_CD_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_CD_MUTE) - - #define STATIC_KSAUDFNAME_LINE_VOLUME\ - 0x185FEDEBL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDEB-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_LINE_VOLUME); - #define KSAUDFNAME_LINE_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_LINE_VOLUME) - - #define STATIC_KSAUDFNAME_LINE_MUTE\ - 0x185FEDECL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDEC-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_LINE_MUTE); - #define KSAUDFNAME_LINE_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_LINE_MUTE) - - #define STATIC_KSAUDFNAME_MIC_VOLUME\ - 0x185FEDEDL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDED-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIC_VOLUME); - #define KSAUDFNAME_MIC_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MIC_VOLUME) - - #define STATIC_KSAUDFNAME_MIC_MUTE\ - 0x185FEDEEL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDEE-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIC_MUTE); - #define KSAUDFNAME_MIC_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MIC_MUTE) - - #define STATIC_KSAUDFNAME_RECORDING_SOURCE\ - 0x185FEDEFL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDEF-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_RECORDING_SOURCE); - #define KSAUDFNAME_RECORDING_SOURCE DEFINE_GUIDNAMED(KSAUDFNAME_RECORDING_SOURCE) - - #define STATIC_KSAUDFNAME_PC_SPEAKER_VOLUME\ - 0x185FEDF0L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDF0-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_PC_SPEAKER_VOLUME); - #define KSAUDFNAME_PC_SPEAKER_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_PC_SPEAKER_VOLUME) - - #define STATIC_KSAUDFNAME_PC_SPEAKER_MUTE\ - 0x185FEDF1L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDF1-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_PC_SPEAKER_MUTE); - #define KSAUDFNAME_PC_SPEAKER_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_PC_SPEAKER_MUTE) - - #define STATIC_KSAUDFNAME_MIDI_IN_VOLUME\ - 0x185FEDF2L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDF2-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIDI_IN_VOLUME); - #define KSAUDFNAME_MIDI_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MIDI_IN_VOLUME) - - #define STATIC_KSAUDFNAME_CD_IN_VOLUME\ - 0x185FEDF3L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDF3-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_CD_IN_VOLUME); - #define KSAUDFNAME_CD_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_CD_IN_VOLUME) - - #define STATIC_KSAUDFNAME_LINE_IN_VOLUME\ - 0x185FEDF4L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDF4-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_LINE_IN_VOLUME); - #define KSAUDFNAME_LINE_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_LINE_IN_VOLUME) - - #define STATIC_KSAUDFNAME_MIC_IN_VOLUME\ - 0x185FEDF5L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDF5-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIC_IN_VOLUME); - #define KSAUDFNAME_MIC_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MIC_IN_VOLUME) - - #define STATIC_KSAUDFNAME_WAVE_IN_VOLUME\ - 0x185FEDF6L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDF6-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_WAVE_IN_VOLUME); - #define KSAUDFNAME_WAVE_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_WAVE_IN_VOLUME) - - #define STATIC_KSAUDFNAME_VOLUME_CONTROL\ - 0x185FEDF7L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDF7-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_VOLUME_CONTROL); - #define KSAUDFNAME_VOLUME_CONTROL DEFINE_GUIDNAMED(KSAUDFNAME_VOLUME_CONTROL) - - #define STATIC_KSAUDFNAME_MIDI\ - 0x185FEDF8L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDF8-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIDI); - #define KSAUDFNAME_MIDI DEFINE_GUIDNAMED(KSAUDFNAME_MIDI) - - #define STATIC_KSAUDFNAME_LINE_IN\ - 0x185FEDF9L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDF9-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_LINE_IN); - #define KSAUDFNAME_LINE_IN DEFINE_GUIDNAMED(KSAUDFNAME_LINE_IN) - - #define STATIC_KSAUDFNAME_RECORDING_CONTROL\ - 0x185FEDFAL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDFA-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_RECORDING_CONTROL); - #define KSAUDFNAME_RECORDING_CONTROL DEFINE_GUIDNAMED(KSAUDFNAME_RECORDING_CONTROL) - - #define STATIC_KSAUDFNAME_CD_AUDIO\ - 0x185FEDFBL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDFB-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_CD_AUDIO); - #define KSAUDFNAME_CD_AUDIO DEFINE_GUIDNAMED(KSAUDFNAME_CD_AUDIO) - - #define STATIC_KSAUDFNAME_AUX_VOLUME\ - 0x185FEDFCL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDFC-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_AUX_VOLUME); - #define KSAUDFNAME_AUX_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_AUX_VOLUME) - - #define STATIC_KSAUDFNAME_AUX_MUTE\ - 0x185FEDFDL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDFD-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_AUX_MUTE); - #define KSAUDFNAME_AUX_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_AUX_MUTE) - - #define STATIC_KSAUDFNAME_AUX\ - 0x185FEDFEL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDFE-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_AUX); - #define KSAUDFNAME_AUX DEFINE_GUIDNAMED(KSAUDFNAME_AUX) - - #define STATIC_KSAUDFNAME_PC_SPEAKER\ - 0x185FEDFFL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEDFF-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_PC_SPEAKER); - #define KSAUDFNAME_PC_SPEAKER DEFINE_GUIDNAMED(KSAUDFNAME_PC_SPEAKER) - - #define STATIC_KSAUDFNAME_WAVE_OUT_MIX\ - 0x185FEE00L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("185FEE00-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_WAVE_OUT_MIX); - #define KSAUDFNAME_WAVE_OUT_MIX DEFINE_GUIDNAMED(KSAUDFNAME_WAVE_OUT_MIX) - - #define STATIC_KSAUDFNAME_MONO_OUT\ - 0xf9b41dc3L, 0x96e2, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 - DEFINE_GUIDSTRUCT("F9B41DC3-96E2-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_MONO_OUT); - #define KSAUDFNAME_MONO_OUT DEFINE_GUIDNAMED(KSAUDFNAME_MONO_OUT) - - #define STATIC_KSAUDFNAME_STEREO_MIX\ - 0xdff077L, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 - DEFINE_GUIDSTRUCT("00DFF077-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_STEREO_MIX); - #define KSAUDFNAME_STEREO_MIX DEFINE_GUIDNAMED(KSAUDFNAME_STEREO_MIX) - - #define STATIC_KSAUDFNAME_MONO_MIX\ - 0xdff078L, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 - DEFINE_GUIDSTRUCT("00DFF078-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_MONO_MIX); - #define KSAUDFNAME_MONO_MIX DEFINE_GUIDNAMED(KSAUDFNAME_MONO_MIX) - - #define STATIC_KSAUDFNAME_MONO_OUT_VOLUME\ - 0x1ad247ebL, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 - DEFINE_GUIDSTRUCT("1AD247EB-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_MONO_OUT_VOLUME); - #define KSAUDFNAME_MONO_OUT_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MONO_OUT_VOLUME) - - #define STATIC_KSAUDFNAME_MONO_OUT_MUTE\ - 0x1ad247ecL, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 - DEFINE_GUIDSTRUCT("1AD247EC-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_MONO_OUT_MUTE); - #define KSAUDFNAME_MONO_OUT_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MONO_OUT_MUTE) - - #define STATIC_KSAUDFNAME_STEREO_MIX_VOLUME\ - 0x1ad247edL, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 - DEFINE_GUIDSTRUCT("1AD247ED-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_STEREO_MIX_VOLUME); - #define KSAUDFNAME_STEREO_MIX_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_STEREO_MIX_VOLUME) - - #define STATIC_KSAUDFNAME_STEREO_MIX_MUTE\ - 0x22b0eafdL, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 - DEFINE_GUIDSTRUCT("22B0EAFD-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_STEREO_MIX_MUTE); - #define KSAUDFNAME_STEREO_MIX_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_STEREO_MIX_MUTE) - - #define STATIC_KSAUDFNAME_MONO_MIX_VOLUME\ - 0x22b0eafeL, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 - DEFINE_GUIDSTRUCT("22B0EAFE-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_MONO_MIX_VOLUME); - #define KSAUDFNAME_MONO_MIX_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MONO_MIX_VOLUME) - - #define STATIC_KSAUDFNAME_MONO_MIX_MUTE\ - 0x2bc31d69L, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 - DEFINE_GUIDSTRUCT("2BC31D69-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_MONO_MIX_MUTE); - #define KSAUDFNAME_MONO_MIX_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MONO_MIX_MUTE) - - #define STATIC_KSAUDFNAME_MICROPHONE_BOOST\ - 0x2bc31d6aL, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 - DEFINE_GUIDSTRUCT("2BC31D6A-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_MICROPHONE_BOOST); - #define KSAUDFNAME_MICROPHONE_BOOST DEFINE_GUIDNAMED(KSAUDFNAME_MICROPHONE_BOOST) - - #define STATIC_KSAUDFNAME_ALTERNATE_MICROPHONE\ - 0x2bc31d6bL, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 - DEFINE_GUIDSTRUCT("2BC31D6B-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_ALTERNATE_MICROPHONE); - #define KSAUDFNAME_ALTERNATE_MICROPHONE DEFINE_GUIDNAMED(KSAUDFNAME_ALTERNATE_MICROPHONE) - - #define STATIC_KSAUDFNAME_3D_DEPTH\ - 0x63ff5747L, 0x991f, 0x11d2, 0xac, 0x4d, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 - DEFINE_GUIDSTRUCT("63FF5747-991F-11d2-AC4D-00C04F8EFB68", KSAUDFNAME_3D_DEPTH); - #define KSAUDFNAME_3D_DEPTH DEFINE_GUIDNAMED(KSAUDFNAME_3D_DEPTH) - - #define STATIC_KSAUDFNAME_3D_CENTER\ - 0x9f0670b4L, 0x991f, 0x11d2, 0xac, 0x4d, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 - DEFINE_GUIDSTRUCT("9F0670B4-991F-11d2-AC4D-00C04F8EFB68", KSAUDFNAME_3D_CENTER); - #define KSAUDFNAME_3D_CENTER DEFINE_GUIDNAMED(KSAUDFNAME_3D_CENTER) - - #define STATIC_KSAUDFNAME_VIDEO_VOLUME\ - 0x9b46e708L, 0x992a, 0x11d2, 0xac, 0x4d, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 - DEFINE_GUIDSTRUCT("9B46E708-992A-11d2-AC4D-00C04F8EFB68", KSAUDFNAME_VIDEO_VOLUME); - #define KSAUDFNAME_VIDEO_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_VIDEO_VOLUME) - - #define STATIC_KSAUDFNAME_VIDEO_MUTE\ - 0x9b46e709L, 0x992a, 0x11d2, 0xac, 0x4d, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 - DEFINE_GUIDSTRUCT("9B46E709-992A-11d2-AC4D-00C04F8EFB68", KSAUDFNAME_VIDEO_MUTE); - #define KSAUDFNAME_VIDEO_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_VIDEO_MUTE) - - #define STATIC_KSAUDFNAME_VIDEO\ - 0x915daec4L, 0xa434, 0x11d2, 0xac, 0x52, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68 - DEFINE_GUIDSTRUCT("915DAEC4-A434-11d2-AC52-00C04F8EFB68", KSAUDFNAME_VIDEO); - #define KSAUDFNAME_VIDEO DEFINE_GUIDNAMED(KSAUDFNAME_VIDEO) - - #define STATIC_KSAUDFNAME_PEAKMETER\ - 0x57e24340L, 0xfc5b, 0x4612, 0xa5, 0x62, 0x72, 0xb1, 0x1a, 0x29, 0xdf, 0xae - DEFINE_GUIDSTRUCT("57E24340-FC5B-4612-A562-72B11A29DFAE", KSAUDFNAME_PEAKMETER); - #define KSAUDFNAME_PEAKMETER DEFINE_GUIDNAMED(KSAUDFNAME_PEAKMETER) - - // Internal topology node pin definitions - - #define KSNODEPIN_STANDARD_IN 1 - #define KSNODEPIN_STANDARD_OUT 0 - - #define KSNODEPIN_SUM_MUX_IN 1 // can be >= 1 - #define KSNODEPIN_SUM_MUX_OUT 0 - - #define KSNODEPIN_DEMUX_IN 0 - #define KSNODEPIN_DEMUX_OUT 1 // can be >= 1 - - #define KSNODEPIN_AEC_RENDER_IN 1 - #define KSNODEPIN_AEC_RENDER_OUT 0 - #define KSNODEPIN_AEC_CAPTURE_IN 2 - #define KSNODEPIN_AEC_CAPTURE_OUT 3 - - //=========================================================================== - //=========================================================================== - - #define STATIC_KSMETHODSETID_Wavetable\ - 0xDCEF31EBL, 0xD907, 0x11D0, 0x95, 0x83, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("DCEF31EB-D907-11D0-9583-00C04FB925D3", KSMETHODSETID_Wavetable); - #define KSMETHODSETID_Wavetable DEFINE_GUIDNAMED(KSMETHODSETID_Wavetable) - - typedef enum { - KSMETHOD_WAVETABLE_WAVE_ALLOC, - KSMETHOD_WAVETABLE_WAVE_FREE, - KSMETHOD_WAVETABLE_WAVE_FIND, - KSMETHOD_WAVETABLE_WAVE_WRITE - } KSMETHOD_WAVETABLE; - - typedef struct { - KSIDENTIFIER Identifier; // wave identifier - ULONG Size; // wave size - BOOL Looped; // wave looped flag - ULONG LoopPoint; // wave loop point - BOOL InROM; // wave InROM flag - KSDATAFORMAT Format; // wave format - } KSWAVETABLE_WAVE_DESC, *PKSWAVETABLE_WAVE_DESC; - - - //=========================================================================== - //=========================================================================== - - /* - Property sets and items - */ - - //=========================================================================== - //=========================================================================== - - #define STATIC_KSPROPSETID_Itd3d\ - 0x6429f090L, 0x9fd9, 0x11d0, 0xa7, 0x5b, 0x00, 0xa0, 0xc9, 0x03, 0x65, 0xe3 - DEFINE_GUIDSTRUCT("6429f090-9fd9-11d0-a75b-00a0c90365e3", KSPROPSETID_Itd3d); - #define KSPROPSETID_Itd3d DEFINE_GUIDNAMED(KSPROPSETID_Itd3d) - - typedef enum { - KSPROPERTY_ITD3D_PARAMS = 0 - } KSPROPERTY_ITD3D; - - //=========================================================================== - //=========================================================================== - - #define STATIC_KSPROPSETID_Hrtf3d\ - 0xb66decb0L, 0xa083, 0x11d0, 0x85, 0x1e, 0x00, 0xc0, 0x4f, 0xd9, 0xba, 0xf3 - DEFINE_GUIDSTRUCT("b66decb0-a083-11d0-851e-00c04fd9baf3", KSPROPSETID_Hrtf3d); - #define KSPROPSETID_Hrtf3d DEFINE_GUIDNAMED(KSPROPSETID_Hrtf3d) - - typedef enum { - KSPROPERTY_HRTF3D_PARAMS = 0, - KSPROPERTY_HRTF3D_INITIALIZE, - KSPROPERTY_HRTF3D_FILTER_FORMAT - } KSPROPERTY_HRTF3D; - - - //=========================================================================== - //=========================================================================== - - #define STATIC_KSPROPSETID_Wave_Queued\ - 0x16a15b10L, 0x16f0, 0x11d0, 0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 - DEFINE_GUIDSTRUCT("16a15b10-16f0-11d0-a195-0020afd156e4", KSPROPSETID_Wave_Queued); - #define KSPROPSETID_Wave_Queued DEFINE_GUIDNAMED(KSPROPSETID_Wave_Queued) - - #define KSPROPERTY_WAVE_QUEUED_POSITION 0x00000001 - - #define STATIC_KSMETHODSETID_Wave_Queued\ - 0x7432c160L, 0x8827, 0x11cf, 0xa1, 0x02, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 - DEFINE_GUIDSTRUCT("7432c160-8827-11cf-a102-0020afd156e4", KSMETHODSETID_Wave_Queued); - #define KSMETHODSETID_Wave_Queued DEFINE_GUIDNAMED(KSMETHODSETID_Wave_Queued) - - #define KSMETHOD_WAVE_QUEUED_BREAKLOOP 0x00000001 - - #define STATIC_KSPROPSETID_Wave\ - 0x924e54b0L, 0x630f, 0x11cf, 0xad, 0xa7, 0x08, 0x00, 0x3e, 0x30, 0x49, 0x4a - DEFINE_GUIDSTRUCT("924e54b0-630f-11cf-ada7-08003e30494a", KSPROPSETID_Wave); - #define KSPROPSETID_Wave DEFINE_GUIDNAMED(KSPROPSETID_Wave) - - typedef enum { - KSPROPERTY_WAVE_COMPATIBLE_CAPABILITIES, - KSPROPERTY_WAVE_INPUT_CAPABILITIES, - KSPROPERTY_WAVE_OUTPUT_CAPABILITIES, - KSPROPERTY_WAVE_BUFFER, - KSPROPERTY_WAVE_FREQUENCY, - KSPROPERTY_WAVE_VOLUME, - KSPROPERTY_WAVE_PAN - } KSPROPERTY_WAVE; - - typedef struct { - ULONG ulDeviceType; - } KSWAVE_COMPATCAPS, *PKSWAVE_COMPATCAPS; - - #define KSWAVE_COMPATCAPS_INPUT 0x00000000 - #define KSWAVE_COMPATCAPS_OUTPUT 0x00000001 - - typedef struct { - ULONG MaximumChannelsPerConnection; - ULONG MinimumBitsPerSample; - ULONG MaximumBitsPerSample; - ULONG MinimumSampleFrequency; - ULONG MaximumSampleFrequency; - ULONG TotalConnections; - ULONG ActiveConnections; - } KSWAVE_INPUT_CAPABILITIES, *PKSWAVE_INPUT_CAPABILITIES; - - typedef struct { - ULONG MaximumChannelsPerConnection; - ULONG MinimumBitsPerSample; - ULONG MaximumBitsPerSample; - ULONG MinimumSampleFrequency; - ULONG MaximumSampleFrequency; - ULONG TotalConnections; - ULONG StaticConnections; - ULONG StreamingConnections; - ULONG ActiveConnections; - ULONG ActiveStaticConnections; - ULONG ActiveStreamingConnections; - ULONG Total3DConnections; - ULONG Static3DConnections; - ULONG Streaming3DConnections; - ULONG Active3DConnections; - ULONG ActiveStatic3DConnections; - ULONG ActiveStreaming3DConnections; - ULONG TotalSampleMemory; - ULONG FreeSampleMemory; - ULONG LargestFreeContiguousSampleMemory; - } KSWAVE_OUTPUT_CAPABILITIES, *PKSWAVE_OUTPUT_CAPABILITIES; - - typedef struct { - LONG LeftAttenuation; - LONG RightAttenuation; - } KSWAVE_VOLUME, *PKSWAVE_VOLUME; - - #define KSWAVE_BUFFER_ATTRIBUTEF_LOOPING 0x00000001 - #define KSWAVE_BUFFER_ATTRIBUTEF_STATIC 0x00000002 - - typedef struct { - ULONG Attributes; - ULONG BufferSize; - PVOID BufferAddress; - } KSWAVE_BUFFER, *PKSWAVE_BUFFER; - - //=========================================================================== - //=========================================================================== - - #define STATIC_KSMUSIC_TECHNOLOGY_PORT\ - 0x86C92E60L, 0x62E8, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("86C92E60-62E8-11CF-A5D6-28DB04C10000", KSMUSIC_TECHNOLOGY_PORT); - #define KSMUSIC_TECHNOLOGY_PORT DEFINE_GUIDNAMED(KSMUSIC_TECHNOLOGY_PORT) - - #define STATIC_KSMUSIC_TECHNOLOGY_SQSYNTH\ - 0x0ECF4380L, 0x62E9, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("0ECF4380-62E9-11CF-A5D6-28DB04C10000", KSMUSIC_TECHNOLOGY_SQSYNTH); - #define KSMUSIC_TECHNOLOGY_SQSYNTH DEFINE_GUIDNAMED(KSMUSIC_TECHNOLOGY_SQSYNTH) - - #define STATIC_KSMUSIC_TECHNOLOGY_FMSYNTH\ - 0x252C5C80L, 0x62E9, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("252C5C80-62E9-11CF-A5D6-28DB04C10000", KSMUSIC_TECHNOLOGY_FMSYNTH); - #define KSMUSIC_TECHNOLOGY_FMSYNTH DEFINE_GUIDNAMED(KSMUSIC_TECHNOLOGY_FMSYNTH) - - #define STATIC_KSMUSIC_TECHNOLOGY_WAVETABLE\ - 0x394EC7C0L, 0x62E9, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("394EC7C0-62E9-11CF-A5D6-28DB04C10000", KSMUSIC_TECHNOLOGY_WAVETABLE); - #define KSMUSIC_TECHNOLOGY_WAVETABLE DEFINE_GUIDNAMED(KSMUSIC_TECHNOLOGY_WAVETABLE) - - #define STATIC_KSMUSIC_TECHNOLOGY_SWSYNTH\ - 0x37407736L, 0x3620, 0x11D1, 0x85, 0xD3, 0x00, 0x00, 0xF8, 0x75, 0x43, 0x80 - DEFINE_GUIDSTRUCT("37407736-3620-11D1-85D3-0000F8754380", KSMUSIC_TECHNOLOGY_SWSYNTH); - #define KSMUSIC_TECHNOLOGY_SWSYNTH DEFINE_GUIDNAMED(KSMUSIC_TECHNOLOGY_SWSYNTH) - - #define STATIC_KSPROPSETID_WaveTable\ - 0x8539E660L, 0x62E9, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("8539E660-62E9-11CF-A5D6-28DB04C10000", KSPROPSETID_WaveTable); - #define KSPROPSETID_WaveTable DEFINE_GUIDNAMED(KSPROPSETID_WaveTable) - - typedef enum { - KSPROPERTY_WAVETABLE_LOAD_SAMPLE, - KSPROPERTY_WAVETABLE_UNLOAD_SAMPLE, - KSPROPERTY_WAVETABLE_MEMORY, - KSPROPERTY_WAVETABLE_VERSION - } KSPROPERTY_WAVETABLE; - - typedef struct { - KSDATARANGE DataRange; - GUID Technology; - ULONG Channels; - ULONG Notes; - ULONG ChannelMask; - } KSDATARANGE_MUSIC, *PKSDATARANGE_MUSIC; - - //=========================================================================== - - #define STATIC_KSEVENTSETID_Cyclic\ - 0x142C1AC0L, 0x072A, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("142C1AC0-072A-11D0-A5D6-28DB04C10000", KSEVENTSETID_Cyclic); - #define KSEVENTSETID_Cyclic DEFINE_GUIDNAMED(KSEVENTSETID_Cyclic) - - typedef enum { - KSEVENT_CYCLIC_TIME_INTERVAL, - } KSEVENT_CYCLIC_TIME; - - #define STATIC_KSPROPSETID_Cyclic\ - 0x3FFEAEA0L, 0x2BEE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("3FFEAEA0-2BEE-11CF-A5D6-28DB04C10000", KSPROPSETID_Cyclic); - #define KSPROPSETID_Cyclic DEFINE_GUIDNAMED(KSPROPSETID_Cyclic) - - typedef enum { - KSPROPERTY_CYCLIC_POSITION, - } KSPROPERTY_CYCLIC; - - //=========================================================================== - #define STATIC_KSEVENTSETID_AudioControlChange\ - 0xE85E9698L, 0xFA2F, 0x11D1, 0x95, 0xBD, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3 - DEFINE_GUIDSTRUCT("E85E9698-FA2F-11D1-95BD-00C04FB925D3", KSEVENTSETID_AudioControlChange); - #define KSEVENTSETID_AudioControlChange DEFINE_GUIDNAMED(KSEVENTSETID_AudioControlChange) - - typedef enum { - KSEVENT_CONTROL_CHANGE, - } KSEVENT_AUDIO_CONTROL_CHANGE; - - //=========================================================================== - - #define STATIC_KSEVENTSETID_LoopedStreaming\ - 0x4682B940L, 0xC6EF, 0x11D0, 0x96, 0xD8, 0x00, 0xAA, 0x00, 0x51, 0xE5, 0x1D - DEFINE_GUIDSTRUCT("4682B940-C6EF-11D0-96D8-00AA0051E51D", KSEVENTSETID_LoopedStreaming); - #define KSEVENTSETID_LoopedStreaming DEFINE_GUIDNAMED(KSEVENTSETID_LoopedStreaming) - - typedef enum { - KSEVENT_LOOPEDSTREAMING_POSITION, - } KSEVENT_LOOPEDSTREAMING; - - typedef struct { - KSEVENTDATA KsEventData; - #if defined(_NTDDK_) - ULONGLONG Position; - #else // !_NTDDK_ - DWORDLONG Position; - #endif // !_NTDDK_ - } LOOPEDSTREAMING_POSITION_EVENT_DATA, *PLOOPEDSTREAMING_POSITION_EVENT_DATA ; - - #define STATIC_KSEVENTSETID_Sysaudio \ - 0x04800320L, 0x4491, 0x11D1, 0xA0, 0x50, 0x40, 0x57, 0x05, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("04800320-4491-11D1-A050-405705C10000", KSEVENTSETID_Sysaudio); - #define KSEVENTSETID_Sysaudio DEFINE_GUIDNAMED(KSEVENTSETID_Sysaudio) - - typedef enum { - KSEVENT_SYSAUDIO_ADDREMOVE_DEVICE, - KSEVENT_SYSAUDIO_CHANGE_DEVICE - } KSEVENT_SYSAUDIO; - - #define STATIC_KSPROPSETID_Sysaudio\ - 0xCBE3FAA0L, 0xCC75, 0x11D0, 0xB4, 0x65, 0x00, 0x00, 0x1A, 0x18, 0x18, 0xE6 - DEFINE_GUIDSTRUCT("CBE3FAA0-CC75-11D0-B465-00001A1818E6", KSPROPSETID_Sysaudio); - #define KSPROPSETID_Sysaudio DEFINE_GUIDNAMED(KSPROPSETID_Sysaudio) - - typedef enum { - KSPROPERTY_SYSAUDIO_DEVICE_COUNT = 1, - KSPROPERTY_SYSAUDIO_DEVICE_FRIENDLY_NAME, - KSPROPERTY_SYSAUDIO_DEVICE_INSTANCE, - KSPROPERTY_SYSAUDIO_DEVICE_INTERFACE_NAME, - KSPROPERTY_SYSAUDIO_SELECT_GRAPH, - KSPROPERTY_SYSAUDIO_CREATE_VIRTUAL_SOURCE, - KSPROPERTY_SYSAUDIO_DEVICE_DEFAULT, - KSPROPERTY_SYSAUDIO_ALWAYS_CREATE_VIRTUAL_SOURCE, - KSPROPERTY_SYSAUDIO_ADDREMOVE_LOCK, - KSPROPERTY_SYSAUDIO_ADDREMOVE_UNLOCK, - KSPROPERTY_SYSAUDIO_RENDER_PIN_INSTANCES, - KSPROPERTY_SYSAUDIO_RENDER_CONNECTION_INDEX, - KSPROPERTY_SYSAUDIO_CREATE_VIRTUAL_SOURCE_ONLY, - KSPROPERTY_SYSAUDIO_INSTANCE_INFO, - KSPROPERTY_SYSAUDIO_PREFERRED_DEVICE - } KSPROPERTY_SYSAUDIO; - - typedef struct { - KSPROPERTY Property; - GUID PinCategory; - GUID PinName; - } SYSAUDIO_CREATE_VIRTUAL_SOURCE, *PSYSAUDIO_CREATE_VIRTUAL_SOURCE; - - typedef struct { - KSPROPERTY Property; - ULONG PinId; - ULONG NodeId; - ULONG Flags; - ULONG Reserved; - } SYSAUDIO_SELECT_GRAPH, *PSYSAUDIO_SELECT_GRAPH; - - typedef struct { - KSPROPERTY Property; - ULONG Flags; - ULONG DeviceNumber; - } SYSAUDIO_INSTANCE_INFO, *PSYSAUDIO_INSTANCE_INFO; - - #define SYSAUDIO_FLAGS_DONT_COMBINE_PINS 0x00000001 - - typedef struct { - KSPROPERTY Property; - ULONG Flags; - ULONG Index; // KSPROPERTY_SYSAUDIO_DEFAULT_TYPE - } SYSAUDIO_PREFERRED_DEVICE, *PSYSAUDIO_PREFERRED_DEVICE; - - #define SYSAUDIO_FLAGS_CLEAR_PREFERRED 0x00000002 - - typedef enum { // preferred device index - KSPROPERTY_SYSAUDIO_NORMAL_DEFAULT = 0, - KSPROPERTY_SYSAUDIO_PLAYBACK_DEFAULT, - KSPROPERTY_SYSAUDIO_RECORD_DEFAULT, - KSPROPERTY_SYSAUDIO_MIDI_DEFAULT, - KSPROPERTY_SYSAUDIO_MIXER_DEFAULT - } KSPROPERTY_SYSAUDIO_DEFAULT_TYPE; - - #define STATIC_KSPROPSETID_Sysaudio_Pin \ - 0xA3A53220L, 0xC6E4, 0x11D0, 0xB4, 0x65, 0x00, 0x00, 0x1A, 0x18, 0x18, 0xE6 - DEFINE_GUIDSTRUCT("A3A53220-C6E4-11D0-B465-00001A1818E6", KSPROPSETID_Sysaudio_Pin); - #define KSPROPSETID_Sysaudio_Pin DEFINE_GUIDNAMED(KSPROPSETID_Sysaudio_Pin) - - typedef enum { - KSPROPERTY_SYSAUDIO_TOPOLOGY_CONNECTION_INDEX, - KSPROPERTY_SYSAUDIO_ATTACH_VIRTUAL_SOURCE, - KSPROPERTY_SYSAUDIO_PIN_VOLUME_NODE - } KSPROPERTY_SYSAUDIO_PIN; - - typedef struct { - KSPROPERTY Property; - ULONG MixerPinId; - ULONG Reserved; - } SYSAUDIO_ATTACH_VIRTUAL_SOURCE, *PSYSAUDIO_ATTACH_VIRTUAL_SOURCE; - - typedef struct { - KSPROPERTY Property; - ULONG NodeId; - ULONG Reserved; - } KSNODEPROPERTY, *PKSNODEPROPERTY; - - typedef struct { - KSNODEPROPERTY NodeProperty; - LONG Channel; // value to get or set - ULONG Reserved; - } KSNODEPROPERTY_AUDIO_CHANNEL, *PKSNODEPROPERTY_AUDIO_CHANNEL; - - typedef struct { - KSNODEPROPERTY NodeProperty; - ULONG DevSpecificId; - ULONG DeviceInfo; - ULONG Length; - } KSNODEPROPERTY_AUDIO_DEV_SPECIFIC, *PKSNODEPROPERTY_AUDIO_DEV_SPECIFIC; - - typedef struct { - KSNODEPROPERTY NodeProperty; - PVOID ListenerId; - #ifndef _WIN64 - ULONG Reserved; - #endif // _WIN64 - } KSNODEPROPERTY_AUDIO_3D_LISTENER, *PKSNODEPROPERTY_AUDIO_3D_LISTENER; - - typedef struct { - KSNODEPROPERTY NodeProperty; - PVOID AppContext; - ULONG Length; - #ifndef _WIN64 - ULONG Reserved; - #endif // _WIN64 - } KSNODEPROPERTY_AUDIO_PROPERTY, *PKSNODEPROPERTY_AUDIO_PROPERTY; - - //=========================================================================== - - #define STATIC_KSPROPSETID_Linear\ - 0x5A2FFE80L, 0x16B9, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("5A2FFE80-16B9-11D0-A5D6-28DB04C10000", KSPROPSETID_Linear); - #define KSPROPSETID_Linear DEFINE_GUIDNAMED(KSPROPSETID_Linear) - - typedef enum { - KSPROPERTY_LINEAR_POSITION, - } KSPROPERTY_LINEAR; - - //=========================================================================== - - // - // Midi definitions - // - - /* - Formats - */ - - #define STATIC_KSDATAFORMAT_TYPE_MUSIC\ - 0xE725D360L, 0x62CC, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("E725D360-62CC-11CF-A5D6-28DB04C10000", KSDATAFORMAT_TYPE_MUSIC); - #define KSDATAFORMAT_TYPE_MUSIC DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MUSIC) - - // 'mids' == MEDIATYPE_Midi - #define STATIC_KSDATAFORMAT_TYPE_MIDI\ - 0x7364696DL, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 - DEFINE_GUIDSTRUCT("7364696D-0000-0010-8000-00aa00389b71", KSDATAFORMAT_TYPE_MIDI); - #define KSDATAFORMAT_TYPE_MIDI DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MIDI) - - #define STATIC_KSDATAFORMAT_SUBTYPE_MIDI\ - 0x1D262760L, 0xE957, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("1D262760-E957-11CF-A5D6-28DB04C10000", KSDATAFORMAT_SUBTYPE_MIDI); - #define KSDATAFORMAT_SUBTYPE_MIDI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MIDI) - - #define STATIC_KSDATAFORMAT_SUBTYPE_MIDI_BUS\ - 0x2CA15FA0L, 0x6CFE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 - DEFINE_GUIDSTRUCT("2CA15FA0-6CFE-11CF-A5D6-28DB04C10000", KSDATAFORMAT_SUBTYPE_MIDI_BUS); - #define KSDATAFORMAT_SUBTYPE_MIDI_BUS DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MIDI_BUS) - - #define STATIC_KSDATAFORMAT_SUBTYPE_RIFFMIDI\ - 0x4995DAF0L, 0x9EE6, 0x11D0, 0xA4, 0x0E, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("4995DAF0-9EE6-11D0-A40E-00A0C9223196", KSDATAFORMAT_SUBTYPE_RIFFMIDI); - #define KSDATAFORMAT_SUBTYPE_RIFFMIDI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_RIFFMIDI) - - /* - KSDATAFORMAT_SUBTYPE_DIRECTMUSIC - see DMusicKS.h - */ - - // WARNING! This structure MUST be dword aligned - // regardless of the number of data bytes. - - typedef struct { - ULONG TimeDeltaMs; // Delta Milliseconds from the previous midiformat - // in the packet. The first midiformat in the packet - // is a delta from the PTS in the KSSTREAM_HEADER. - ULONG ByteCount; // Number of bytes of data that follow this struct. - } KSMUSICFORMAT, *PKSMUSICFORMAT; - - // - // This entire set of MPEG Standard/Dialect Guids are obsolete. Do not use them. - // - //==================================================================================================== - //==================================================================================================== - // The following official MPEG Formats, Subtypes and Specifiers are listed as required or optional - // These official MPEG GUIDs are the preferred method of supporting MPEG/AC-3 media types in new code. - // Older MPEG GUIDs should also be supported for compatibilty, but these new modes are still required. - //==================================================================================================== - //==================================================================================================== - - /* - This is a summary of what media types/specifiers will be required for all DVD+DSS+DVB+DTV MPEG decoders. - These media types are what the decoder driver must accept, hardware support for all of these media types - may or may not actually be provided by the decoder natively. These media types are intended to define - the "officially" supported MPEG/AC-3 media types that all WHQL certified decoders must implement. This - specifically includes driver and/or hardware support for all the required standards and dialects. - - All MPEG video decoders must support all of the MPEG video modes shown as [required] below. - All MPEG audio decoders must support all of the MPEG audio modes shown as [required] below. - All AC-3 audio decoders must support all of the AC-3 audio modes shown as [required] below. - The line items shown as [optional] need not be implemented, but are possible formats that might be implemented. - - Note that the input/output pin formats are defined by 2 or 3 GUIDs: TYPE, SUBTYPE, and maybe SPECIFIER. - The specifiers are included if the data format is a "dialect" that needs to be differentiated during decoding. - The decoder MUST be prepared to deal with ALL requests for _required_ "Standard" formats OR _required_ "Dialects". - - STATIC_KSDATAFORMAT_TYPE_STANDARD_ELEMENTARY_STREAM [required] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO [optional] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO [optional] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO [required] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO [optional] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO [optional] - STATIC_KSDATAFORMAT_TYPE_STANDARD_PES_PACKET [required] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO [optional] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO [optional] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO [optional] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO [optional] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO [required] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO [required] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO [optional] - STATIC_KSDATAFORMAT_TYPE_STANDARD_PACK_HEADER [required] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO [required] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO [optional] - STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO [required] - STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO [optional] - - Note that the SPECIFIER GUIDs normally identify particular versions of MPEG such as DSS and DVD. - This approach was taken to minimize the number of DSS/DVB/DVD/DTV etc. media SUBTYPES. - These specifiers are currently required to disambiguate MPEG syntax _parsing_ by the decoder - using alternate parsing routines or downloadable firmware or hardware decode settings. - - In the future these specifiers will be extended to cover new KS MPEG flavors such as DVB and DTV. - Thus, the optional specifiers will be subject to clarification and/or definition as they are needed. - - Important note: Per the ITU MPEG specs, MPEG 2 media may contain pure MPEG 1 syntax and - any "MPEG 2" PES packets may actually contain MPEG 1 payloads and MPEG 1 syntax. Some MPEG - broadcasts can revert from MPEG2 to MPEG1 format data at their discretion, without warning. - - CAUTION: Decoders MUST attempt to process MPEG data AS SOON AS POSSIBLE after reception. - In particular, elementary MPEG or MPEG PES packet streams should not be aggregated into DVD - "pack headers" internally before submission to the codec hardware if AT ALL POSSIBLE. The - reason is that mpeg data may need to be processed immediately but there may be no additional - MPEG data forthcoming to fill up the PES packet OR DVD "pack" in a timely fashion. This is - particularly true of MPEG dialects that utilize "repeat field signally" to reuse the last - decoded MPEG video field. - - */ - - ///////////////////////////////////////////////////////////////////////// - // The major data type GUIDs that define the data packet encapsulation // - ///////////////////////////////////////////////////////////////////////// - - // STATIC_KSDATAFORMAT_TYPE_STANDARD_ELEMENTARY_STREAM - #define STATIC_KSDATAFORMAT_TYPE_STANDARD_ELEMENTARY_STREAM \ - 0x36523b11L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a - DEFINE_GUIDSTRUCT("36523B11-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_TYPE_STANDARD_ELEMENTARY_STREAM ); - #define KSDATAFORMAT_TYPE_STANDARD_ELEMENTARY_STREAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STANDARD_ELEMENTARY_STREAM) - - // STATIC_KSDATAFORMAT_TYPE_STANDARD_PES_PACKET - #define STATIC_KSDATAFORMAT_TYPE_STANDARD_PES_PACKET \ - 0x36523b12L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a - DEFINE_GUIDSTRUCT("36523B12-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_TYPE_STANDARD_PES_PACKET ); - #define KSDATAFORMAT_TYPE_STANDARD_PES_PACKET DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STANDARD_PES_PACKET) - - // STATIC_KSDATAFORMAT_TYPE_STANDARD_PACK_HEADER - #define STATIC_KSDATAFORMAT_TYPE_STANDARD_PACK_HEADER \ - 0x36523b13L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a - DEFINE_GUIDSTRUCT("36523B13-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_TYPE_STANDARD_PACK_HEADER ); - #define KSDATAFORMAT_TYPE_STANDARD_PACK_HEADER DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STANDARD_PACK_HEADER) - - /////////////////////////////////////////////////////////////////////////////// - // The minor data subtype GUIDs that define the exact class of the data type.// - /////////////////////////////////////////////////////////////////////////////// - - // STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO - #define STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO \ - 0x36523b21L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a - DEFINE_GUIDSTRUCT("36523B21-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO ); - #define KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO) - - // STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO - #define STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO \ - 0x36523b22L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a - DEFINE_GUIDSTRUCT("36523B22-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO ); - #define KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO) - - // STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO - #define STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO \ - 0x36523b23L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a - DEFINE_GUIDSTRUCT("36523B23-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO ); - #define KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO) - - // STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO - #define STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO \ - 0x36523b24L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a - DEFINE_GUIDSTRUCT("36523B24-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO ); - #define KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO) - - // STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO - #define STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO \ - 0x36523b25L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a - DEFINE_GUIDSTRUCT("36523B25-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO ); - #define KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO) - - /////////////////////////////////////////////////////////////////////////////// - // The low-level specifier GUIDs that define the flavor of the data subtype. // - // Some SUBTYPES, notably MPEG2_VIDEO, MPEG2_AUDIO have different dialects. // - // These specifiers are intended to be accompanied by a specifier structure. // - /////////////////////////////////////////////////////////////////////////////// - - // STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO - #define STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO \ - 0x36523b31L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a - DEFINE_GUIDSTRUCT("36523B31-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO ); - #define KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO) - - // STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO - #define STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO \ - 0x36523b32L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a - DEFINE_GUIDSTRUCT("36523B32-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO ); - #define KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO) - - // STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO Associated with KS_MPEGVIDEOINFO2 defined later - #define STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO \ - 0x36523b33L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a - DEFINE_GUIDSTRUCT("36523B33-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO ); - #define KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO) - - // STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO Associated with KS_MPEGAUDIOINFO defined later - #define STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO \ - 0x36523b34L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a - DEFINE_GUIDSTRUCT("36523B34-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO ); - #define KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO) - - // STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO - #define STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO \ - 0x36523b35L, 0x8ee5, 0x11d1, 0x8c, 0xa3, 0x00, 0x60, 0xb0, 0x57, 0x66, 0x4a - DEFINE_GUIDSTRUCT("36523B35-8EE5-11d1-8CA3-0060B057664A", KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO ); - #define KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO) - - //==================================================================================================== - //==================================================================================================== - // *** COMPATIBILITY WARNING *** - // The *following* older DSS, MPEG, DVD & AC-3 GUID definitions are retained for backward compability. - // These MPEG GUIDs should also be supported for compatibilty, but the above newer modes are still required. - //==================================================================================================== - //==================================================================================================== - - // - // DSS definitions - // - - #define STATIC_KSDATAFORMAT_SUBTYPE_DSS_VIDEO\ - 0xa0af4f81L, 0xe163, 0x11d0, 0xba, 0xd9, 0x00, 0x60, 0x97, 0x44, 0x11, 0x1a - DEFINE_GUIDSTRUCT("a0af4f81-e163-11d0-bad9-00609744111a", KSDATAFORMAT_SUBTYPE_DSS_VIDEO); - #define KSDATAFORMAT_SUBTYPE_DSS_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DSS_VIDEO) - - #define STATIC_KSDATAFORMAT_SUBTYPE_DSS_AUDIO\ - 0xa0af4f82L, 0xe163, 0x11d0, 0xba, 0xd9, 0x00, 0x60, 0x97, 0x44, 0x11, 0x1a - DEFINE_GUIDSTRUCT("a0af4f82-e163-11d0-bad9-00609744111a", KSDATAFORMAT_SUBTYPE_DSS_AUDIO); - #define KSDATAFORMAT_SUBTYPE_DSS_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DSS_AUDIO) - - // - // End of obsolete MPEG definitions. - // - - // - // mpeg 1 definitions - // - #define STATIC_KSDATAFORMAT_SUBTYPE_MPEG1Packet\ - 0xe436eb80, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 - DEFINE_GUIDSTRUCT("e436eb80-524f-11ce-9F53-0020af0ba770", KSDATAFORMAT_SUBTYPE_MPEG1Packet); - #define KSDATAFORMAT_SUBTYPE_MPEG1Packet DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG1Packet) - - #define STATIC_KSDATAFORMAT_SUBTYPE_MPEG1Payload\ - 0xe436eb81, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 - DEFINE_GUIDSTRUCT("e436eb81-524f-11ce-9F53-0020af0ba770", KSDATAFORMAT_SUBTYPE_MPEG1Payload); - #define KSDATAFORMAT_SUBTYPE_MPEG1Payload DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG1Payload) - - // MEDIASUBTYPE_MPEG1Video - #define STATIC_KSDATAFORMAT_SUBTYPE_MPEG1Video\ - 0xe436eb86, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 - DEFINE_GUIDSTRUCT("e436eb86-524f-11ce-9f53-0020af0ba770", KSDATAFORMAT_SUBTYPE_MPEG1Video); - #define KSDATAFORMAT_SUBTYPE_MPEG1Video DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG1Video) - - //FORMAT_MPEGVideo - #define STATIC_KSDATAFORMAT_SPECIFIER_MPEG1_VIDEO\ - 0x05589f82L, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a - DEFINE_GUIDSTRUCT("05589f82-c356-11ce-bf01-00aa0055595a", KSDATAFORMAT_SPECIFIER_MPEG1_VIDEO); - #define KSDATAFORMAT_SPECIFIER_MPEG1_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_MPEG1_VIDEO) - - // - // mpeg 2 definitions - // - #define STATIC_KSDATAFORMAT_TYPE_MPEG2_PES\ - 0xe06d8020L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea - DEFINE_GUIDSTRUCT("e06d8020-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_TYPE_MPEG2_PES); - #define KSDATAFORMAT_TYPE_MPEG2_PES DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MPEG2_PES) - - #define STATIC_KSDATAFORMAT_TYPE_MPEG2_PROGRAM\ - 0xe06d8022L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea - DEFINE_GUIDSTRUCT("e06d8022-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_TYPE_MPEG2_PROGRAM); - #define KSDATAFORMAT_TYPE_MPEG2_PROGRAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MPEG2_PROGRAM) - - #define STATIC_KSDATAFORMAT_TYPE_MPEG2_TRANSPORT\ - 0xe06d8023L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea - DEFINE_GUIDSTRUCT("e06d8023-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_TYPE_MPEG2_TRANSPORT); - #define KSDATAFORMAT_TYPE_MPEG2_TRANSPORT DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MPEG2_TRANSPORT) - - #define STATIC_KSDATAFORMAT_SUBTYPE_MPEG2_VIDEO\ - 0xe06d8026L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea - DEFINE_GUIDSTRUCT("e06d8026-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SUBTYPE_MPEG2_VIDEO); - #define KSDATAFORMAT_SUBTYPE_MPEG2_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG2_VIDEO) - - // use MPEGVIDEOINFO2 (defined below) with KSDATAFORMAT_SPECIFIER_MPEG2_VIDEO - #define STATIC_KSDATAFORMAT_SPECIFIER_MPEG2_VIDEO\ - 0xe06d80e3L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea - DEFINE_GUIDSTRUCT("e06d80e3-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SPECIFIER_MPEG2_VIDEO); - #define KSDATAFORMAT_SPECIFIER_MPEG2_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_MPEG2_VIDEO) - - - // - // Mpeg2 video properties - // - - - #define STATIC_KSPROPSETID_Mpeg2Vid\ - 0xC8E11B60L, 0x0CC9, 0x11D0, 0xBD, 0x69, 0x00, 0x35, 0x05, 0xC1, 0x03, 0xA9 - DEFINE_GUIDSTRUCT("C8E11B60-0CC9-11D0-BD69-003505C103A9", KSPROPSETID_Mpeg2Vid); - #define KSPROPSETID_Mpeg2Vid DEFINE_GUIDNAMED( KSPROPSETID_Mpeg2Vid ) - - - typedef enum { - KSPROPERTY_MPEG2VID_MODES, // available output modes of decoder - KSPROPERTY_MPEG2VID_CUR_MODE, // current mode of the decoder - KSPROPERTY_MPEG2VID_4_3_RECT, // output coordinates for 4:3 source - KSPROPERTY_MPEG2VID_16_9_RECT, // output coordinates for 16:9 source - KSPROPERTY_MPEG2VID_16_9_PANSCAN, // pan and scan vectors - } KSPROPERTY_MPEG2VID; - - // - // bit field definitions for MPEG2 VIDEO mode - // - - #define KSMPEGVIDMODE_PANSCAN 0x0001 - #define KSMPEGVIDMODE_LTRBOX 0x0002 - #define KSMPEGVIDMODE_SCALE 0x0004 - - // - // rectangle definitions for the 4/3 and 16/9 cropping properties of - // the MPEG2Video decoder - // - - typedef struct _KSMPEGVID_RECT { - ULONG StartX; - ULONG StartY; - ULONG EndX; - ULONG EndY; - } KSMPEGVID_RECT, *PKSMPEGVID_RECT; - - // - // Params for pan / scan - // - - - // - // MPEG2 Audio definition - // - - #define STATIC_KSDATAFORMAT_SUBTYPE_MPEG2_AUDIO\ - 0xe06d802bL, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea - DEFINE_GUIDSTRUCT("e06d802b-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SUBTYPE_MPEG2_AUDIO); - #define KSDATAFORMAT_SUBTYPE_MPEG2_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG2_AUDIO) - - #define STATIC_KSDATAFORMAT_SPECIFIER_MPEG2_AUDIO\ - 0xe06d80e5L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea - DEFINE_GUIDSTRUCT("e06d80e5-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SPECIFIER_MPEG2_AUDIO); - #define KSDATAFORMAT_SPECIFIER_MPEG2_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_MPEG2_AUDIO) - - // - // DVD LPCM Audio definition - // - - #define STATIC_KSDATAFORMAT_SUBTYPE_LPCM_AUDIO\ - 0xe06d8032L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea - DEFINE_GUIDSTRUCT("e06d8032-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SUBTYPE_LPCM_AUDIO); - #define KSDATAFORMAT_SUBTYPE_LPCM_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_LPCM_AUDIO) - - #define STATIC_KSDATAFORMAT_SPECIFIER_LPCM_AUDIO\ - 0xe06d80e6L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea - DEFINE_GUIDSTRUCT("e06d80e6-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SPECIFIER_LPCM_AUDIO); - #define KSDATAFORMAT_SPECIFIER_LPCM_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_LPCM_AUDIO) - - // - // AC-3 definition - // - - #define STATIC_KSDATAFORMAT_SUBTYPE_AC3_AUDIO\ - 0xe06d802cL, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea - DEFINE_GUIDSTRUCT("e06d802c-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SUBTYPE_AC3_AUDIO); - #define KSDATAFORMAT_SUBTYPE_AC3_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_AC3_AUDIO) - - #define STATIC_KSDATAFORMAT_SPECIFIER_AC3_AUDIO\ - 0xe06d80e4L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea - DEFINE_GUIDSTRUCT("e06d80e4-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SPECIFIER_AC3_AUDIO); - #define KSDATAFORMAT_SPECIFIER_AC3_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_AC3_AUDIO) - - #define STATIC_KSPROPSETID_AC3\ - 0xBFABE720L, 0x6E1F, 0x11D0, 0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00 - DEFINE_GUIDSTRUCT("BFABE720-6E1F-11D0-BCF2-444553540000", KSPROPSETID_AC3); - #define KSPROPSETID_AC3 DEFINE_GUIDNAMED(KSPROPSETID_AC3) - - typedef enum { - KSPROPERTY_AC3_ERROR_CONCEALMENT = 1, - KSPROPERTY_AC3_ALTERNATE_AUDIO, - KSPROPERTY_AC3_DOWNMIX, - KSPROPERTY_AC3_BIT_STREAM_MODE, - KSPROPERTY_AC3_DIALOGUE_LEVEL, - KSPROPERTY_AC3_LANGUAGE_CODE, - KSPROPERTY_AC3_ROOM_TYPE - } KSPROPERTY_AC3; - - typedef struct { - BOOL fRepeatPreviousBlock; - BOOL fErrorInCurrentBlock; - } KSAC3_ERROR_CONCEALMENT, *PKSAC3_ERROR_CONCEALMENT; - - typedef struct { - BOOL fStereo; - ULONG DualMode; - } KSAC3_ALTERNATE_AUDIO, *PKSAC3_ALTERNATE_AUDIO; - - #define KSAC3_ALTERNATE_AUDIO_1 1 - #define KSAC3_ALTERNATE_AUDIO_2 2 - #define KSAC3_ALTERNATE_AUDIO_BOTH 3 - - typedef struct { - BOOL fDownMix; - BOOL fDolbySurround; - } KSAC3_DOWNMIX, *PKSAC3_DOWNMIX; - - typedef struct { - LONG BitStreamMode; - } KSAC3_BIT_STREAM_MODE, *PKSAC3_BIT_STREAM_MODE; - - #define KSAC3_SERVICE_MAIN_AUDIO 0 - #define KSAC3_SERVICE_NO_DIALOG 1 - #define KSAC3_SERVICE_VISUALLY_IMPAIRED 2 - #define KSAC3_SERVICE_HEARING_IMPAIRED 3 - #define KSAC3_SERVICE_DIALOG_ONLY 4 - #define KSAC3_SERVICE_COMMENTARY 5 - #define KSAC3_SERVICE_EMERGENCY_FLASH 6 - #define KSAC3_SERVICE_VOICE_OVER 7 - - typedef struct { - ULONG DialogueLevel; - } KSAC3_DIALOGUE_LEVEL, *PKSAC3_DIALOGUE_LEVEL; - - typedef struct { - BOOL fLargeRoom; - } KSAC3_ROOM_TYPE, *PKSAC3_ROOM_TYPE; - - - // - // DTS and SDDS definitions (media subtype GUIDs) - // - #define STATIC_KSDATAFORMAT_SUBTYPE_DTS_AUDIO\ - 0xe06d8033L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea - DEFINE_GUIDSTRUCT("e06d8033-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SUBTYPE_DTS_AUDIO); - #define KSDATAFORMAT_SUBTYPE_DTS_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DTS_AUDIO) - - #define STATIC_KSDATAFORMAT_SUBTYPE_SDDS_AUDIO\ - 0xe06d8034L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea - DEFINE_GUIDSTRUCT("e06d8034-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SUBTYPE_SDDS_AUDIO); - #define KSDATAFORMAT_SUBTYPE_SDDS_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_SDDS_AUDIO) - - - // - // audio decoder output properties - // - - #define STATIC_KSPROPSETID_AudioDecoderOut\ - 0x6ca6e020L, 0x43bd, 0x11d0, 0xbd, 0x6a, 0x00, 0x35, 0x05, 0xc1, 0x03, 0xa9 - DEFINE_GUIDSTRUCT("6ca6e020-43bd-11d0-bd6a-003505c103a9", KSPROPSETID_AudioDecoderOut); - #define KSPROPSETID_AudioDecoderOut DEFINE_GUIDNAMED(KSPROPSETID_AudioDecoderOut) - - typedef enum { - KSPROPERTY_AUDDECOUT_MODES, // available output modes of decoder - KSPROPERTY_AUDDECOUT_CUR_MODE, // current mode of the decoder - } KSPROPERTY_AUDDECOUT; - - #define KSAUDDECOUTMODE_STEREO_ANALOG 0x0001 - #define KSAUDDECOUTMODE_PCM_51 0x0002 - #define KSAUDDECOUTMODE_SPDIFF 0x0004 - - - - // - // subpicture definition - // - - #define STATIC_KSDATAFORMAT_SUBTYPE_SUBPICTURE\ - 0xe06d802dL, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea - DEFINE_GUIDSTRUCT("e06d802d-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SUBTYPE_SUBPICTURE); - #define KSDATAFORMAT_SUBTYPE_SUBPICTURE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_SUBPICTURE) - - - #define STATIC_KSPROPSETID_DvdSubPic\ - 0xac390460L, 0x43af, 0x11d0, 0xbd, 0x6a, 0x00, 0x35, 0x05, 0xc1, 0x03, 0xa9 - DEFINE_GUIDSTRUCT("ac390460-43af-11d0-bd6a-003505c103a9", KSPROPSETID_DvdSubPic); - #define KSPROPSETID_DvdSubPic DEFINE_GUIDNAMED(KSPROPSETID_DvdSubPic) - - typedef enum { - KSPROPERTY_DVDSUBPIC_PALETTE, - KSPROPERTY_DVDSUBPIC_HLI, - KSPROPERTY_DVDSUBPIC_COMPOSIT_ON, // TRUE for subpicture is displayed - } KSPROPERTY_DVDSUBPIC; - - typedef struct _KS_DVD_YCrCb { - UCHAR Reserved; - UCHAR Y; - UCHAR Cr; - UCHAR Cb; - } KS_DVD_YCrCb, *PKS_DVD_YCrCb; - - /* The KS_DVD_YUV structure is now superseded by KS_DVD_YCrCb above and is - here for backward compatibility only */ - - typedef struct _KS_DVD_YUV { - UCHAR Reserved; - UCHAR Y; - UCHAR V; - UCHAR U; - } KS_DVD_YUV, *PKS_DVD_YUV; - - typedef struct _KSPROPERTY_SPPAL { - KS_DVD_YUV sppal[16]; - } KSPROPERTY_SPPAL, *PKSPROPERTY_SPPAL; - - typedef struct _KS_COLCON { - UCHAR emph1col:4; - UCHAR emph2col:4; - UCHAR backcol:4; - UCHAR patcol:4; - UCHAR emph1con:4; - UCHAR emph2con:4; - UCHAR backcon:4; - UCHAR patcon:4; - - } KS_COLCON, *PKS_COLCON; - - typedef struct _KSPROPERTY_SPHLI { - USHORT HLISS; - USHORT Reserved; - ULONG StartPTM; // start presentation time in x/90000 - ULONG EndPTM; // end PTM in x/90000 - USHORT StartX; - USHORT StartY; - USHORT StopX; - USHORT StopY; - KS_COLCON ColCon; // color contrast description (4 bytes as given in HLI) - } KSPROPERTY_SPHLI, *PKSPROPERTY_SPHLI; - - typedef BOOL KSPROPERTY_COMPOSIT_ON, *PKSPROPERTY_COMPOSIT_ON; - - #define STATIC_KSPROPSETID_CopyProt \ - 0x0E8A0A40L, 0x6AEF, 0x11D0, 0x9E, 0xD0, 0x00, 0xA0, 0x24, 0xCA, 0x19, 0xB3 - DEFINE_GUIDSTRUCT("0E8A0A40-6AEF-11D0-9ED0-00A024CA19B3", KSPROPSETID_CopyProt); - #define KSPROPSETID_CopyProt DEFINE_GUIDNAMED(KSPROPSETID_CopyProt) - - typedef enum { - - KSPROPERTY_DVDCOPY_CHLG_KEY = 0x01, - KSPROPERTY_DVDCOPY_DVD_KEY1, - KSPROPERTY_DVDCOPY_DEC_KEY2, - KSPROPERTY_DVDCOPY_TITLE_KEY, - KSPROPERTY_COPY_MACROVISION, - KSPROPERTY_DVDCOPY_REGION, - KSPROPERTY_DVDCOPY_SET_COPY_STATE, - KSPROPERTY_DVDCOPY_DISC_KEY = 0x80 - - } KSPROPERTY_COPYPROT; - - typedef struct _KS_DVDCOPY_CHLGKEY { - BYTE ChlgKey[10]; - BYTE Reserved[2]; - } KS_DVDCOPY_CHLGKEY, *PKS_DVDCOPY_CHLGKEY; - - typedef struct _KS_DVDCOPY_BUSKEY { - BYTE BusKey[5]; - BYTE Reserved[1]; - } KS_DVDCOPY_BUSKEY, *PKS_DVDCOPY_BUSKEY; - - - typedef struct _KS_DVDCOPY_DISCKEY { - BYTE DiscKey[2048]; - } KS_DVDCOPY_DISCKEY, *PKS_DVDCOPY_DISCKEY; - - typedef struct _KS_DVDCOPY_REGION { - UCHAR Reserved; - UCHAR RegionData; - UCHAR Reserved2[2]; - } KS_DVDCOPY_REGION, *PKS_DVDCOPY_REGION; - - typedef struct _KS_DVDCOPY_TITLEKEY { - ULONG KeyFlags; - ULONG ReservedNT[2]; - UCHAR TitleKey[6]; - UCHAR Reserved[2]; - } KS_DVDCOPY_TITLEKEY, *PKS_DVDCOPY_TITLEKEY; - - typedef struct _KS_COPY_MACROVISION { - ULONG MACROVISIONLevel; - } KS_COPY_MACROVISION, *PKS_COPY_MACROVISION; - - typedef struct _KS_DVDCOPY_SET_COPY_STATE { - ULONG DVDCopyState; - } KS_DVDCOPY_SET_COPY_STATE, *PKS_DVDCOPY_SET_COPY_STATE; - - typedef enum { - KS_DVDCOPYSTATE_INITIALIZE, // indicates we are starting a full - // copy protection sequence. - KS_DVDCOPYSTATE_INITIALIZE_TITLE, // indicates we are starting a title - // key copy protection sequence - KS_DVDCOPYSTATE_AUTHENTICATION_NOT_REQUIRED, - KS_DVDCOPYSTATE_AUTHENTICATION_REQUIRED, - KS_DVDCOPYSTATE_DONE, - } KS_DVDCOPYSTATE; - - typedef enum { - KS_MACROVISION_DISABLED, - KS_MACROVISION_LEVEL1, - KS_MACROVISION_LEVEL2, - KS_MACROVISION_LEVEL3 - } KS_COPY_MACROVISION_LEVEL, *PKS_COPY_MACROVISION_LEVEL; - - // - // CGMS Copy Protection Flags - // - - #define KS_DVD_CGMS_RESERVED_MASK 0x00000078 - - #define KS_DVD_CGMS_COPY_PROTECT_MASK 0x00000018 - #define KS_DVD_CGMS_COPY_PERMITTED 0x00000000 - #define KS_DVD_CGMS_COPY_ONCE 0x00000010 - #define KS_DVD_CGMS_NO_COPY 0x00000018 - - #define KS_DVD_COPYRIGHT_MASK 0x00000040 - #define KS_DVD_NOT_COPYRIGHTED 0x00000000 - #define KS_DVD_COPYRIGHTED 0x00000040 - - #define KS_DVD_SECTOR_PROTECT_MASK 0x00000020 - #define KS_DVD_SECTOR_NOT_PROTECTED 0x00000000 - #define KS_DVD_SECTOR_PROTECTED 0x00000020 - - - //=========================================================================== - // The following MUST match the structures in WinGDI.h and AMVideo.h - //=========================================================================== - - #define STATIC_KSCATEGORY_TVTUNER \ - 0xa799a800L, 0xa46d, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0x24, 0x01, 0xdc, 0xd4 - DEFINE_GUIDSTRUCT("a799a800-a46d-11d0-a18c-00a02401dcd4", KSCATEGORY_TVTUNER); - #define KSCATEGORY_TVTUNER DEFINE_GUIDNAMED(KSCATEGORY_TVTUNER) - - #define STATIC_KSCATEGORY_CROSSBAR \ - 0xa799a801L, 0xa46d, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0x24, 0x01, 0xdc, 0xd4 - DEFINE_GUIDSTRUCT("a799a801-a46d-11d0-a18c-00a02401dcd4", KSCATEGORY_CROSSBAR); - #define KSCATEGORY_CROSSBAR DEFINE_GUIDNAMED(KSCATEGORY_CROSSBAR) - - #define STATIC_KSCATEGORY_TVAUDIO \ - 0xa799a802L, 0xa46d, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0x24, 0x01, 0xdc, 0xd4 - DEFINE_GUIDSTRUCT("a799a802-a46d-11d0-a18c-00a02401dcd4", KSCATEGORY_TVAUDIO); - #define KSCATEGORY_TVAUDIO DEFINE_GUIDNAMED(KSCATEGORY_TVAUDIO) - - #define STATIC_KSCATEGORY_VPMUX \ - 0xa799a803L, 0xa46d, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0x24, 0x01, 0xdc, 0xd4 - DEFINE_GUIDSTRUCT("a799a803-a46d-11d0-a18c-00a02401dcd4", KSCATEGORY_VPMUX); - #define KSCATEGORY_VPMUX DEFINE_GUIDNAMED(KSCATEGORY_VPMUX) - - #define STATIC_KSCATEGORY_VBICODEC \ - 0x07dad660L, 0x22f1, 0x11d1, 0xa9, 0xf4, 0x00, 0xc0, 0x4f, 0xbb, 0xde, 0x8f - DEFINE_GUIDSTRUCT("07dad660-22f1-11d1-a9f4-00c04fbbde8f", KSCATEGORY_VBICODEC); - #define KSCATEGORY_VBICODEC DEFINE_GUIDNAMED(KSCATEGORY_VBICODEC) - - // SUBTYPE_VPVideo - #define STATIC_KSDATAFORMAT_SUBTYPE_VPVideo\ - 0x5a9b6a40L, 0x1a22, 0x11d1, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a - DEFINE_GUIDSTRUCT("5a9b6a40-1a22-11d1-bad9-00609744111a", KSDATAFORMAT_SUBTYPE_VPVideo); - #define KSDATAFORMAT_SUBTYPE_VPVideo DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_VPVideo) - - // SUBTYPE_VPVBI - #define STATIC_KSDATAFORMAT_SUBTYPE_VPVBI\ - 0x5a9b6a41L, 0x1a22, 0x11d1, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a - DEFINE_GUIDSTRUCT("5a9b6a41-1a22-11d1-bad9-00609744111a", KSDATAFORMAT_SUBTYPE_VPVBI); - #define KSDATAFORMAT_SUBTYPE_VPVBI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_VPVBI) - - - // FORMAT_VideoInfo - #define STATIC_KSDATAFORMAT_SPECIFIER_VIDEOINFO\ - 0x05589f80L, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a - DEFINE_GUIDSTRUCT("05589f80-c356-11ce-bf01-00aa0055595a", KSDATAFORMAT_SPECIFIER_VIDEOINFO); - #define KSDATAFORMAT_SPECIFIER_VIDEOINFO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_VIDEOINFO) - - // FORMAT_VideoInfo2 - #define STATIC_KSDATAFORMAT_SPECIFIER_VIDEOINFO2\ - 0xf72a76A0L, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba - DEFINE_GUIDSTRUCT("f72a76A0-eb0a-11d0-ace4-0000c0cc16ba", KSDATAFORMAT_SPECIFIER_VIDEOINFO2); - #define KSDATAFORMAT_SPECIFIER_VIDEOINFO2 DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_VIDEOINFO2) - - // MEDIATYPE_AnalogVideo - #define STATIC_KSDATAFORMAT_TYPE_ANALOGVIDEO\ - 0x0482dde1L, 0x7817, 0x11cf, 0x8a, 0x03, 0x00, 0xaa, 0x00, 0x6e, 0xcb, 0x65 - DEFINE_GUIDSTRUCT("0482dde1-7817-11cf-8a03-00aa006ecb65", KSDATAFORMAT_TYPE_ANALOGVIDEO); - #define KSDATAFORMAT_TYPE_ANALOGVIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_ANALOGVIDEO) - - // FORMAT_AnalogVideo - #define STATIC_KSDATAFORMAT_SPECIFIER_ANALOGVIDEO\ - 0x0482dde0L, 0x7817, 0x11cf, 0x8a, 0x03, 0x00, 0xaa, 0x00, 0x6e, 0xcb, 0x65 - DEFINE_GUIDSTRUCT("0482dde0-7817-11cf-8a03-00aa006ecb65", KSDATAFORMAT_SPECIFIER_ANALOGVIDEO); - #define KSDATAFORMAT_SPECIFIER_ANALOGVIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_ANALOGVIDEO) - - // FORMAT_VBI - #define STATIC_KSDATAFORMAT_SPECIFIER_VBI\ - 0xf72a76e0L, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba - DEFINE_GUIDSTRUCT("f72a76e0-eb0a-11d0-ace4-0000c0cc16ba", KSDATAFORMAT_SPECIFIER_VBI); - #define KSDATAFORMAT_SPECIFIER_VBI DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_VBI) - - // MEDIATYPE_VBI - #define STATIC_KSDATAFORMAT_TYPE_VBI\ - 0xf72a76e1L, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba - DEFINE_GUIDSTRUCT("f72a76e1-eb0a-11d0-ace4-0000c0cc16ba", KSDATAFORMAT_TYPE_VBI); - #define KSDATAFORMAT_TYPE_VBI DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_VBI) - - // SUBTYPE_RAW8 - #define STATIC_KSDATAFORMAT_SUBTYPE_RAW8\ - 0xca20d9a0, 0x3e3e, 0x11d1, 0x9b, 0xf9, 0x0, 0xc0, 0x4f, 0xbb, 0xde, 0xbf - DEFINE_GUIDSTRUCT("ca20d9a0-3e3e-11d1-9bf9-00c04fbbdebf", KSDATAFORMAT_SUBTYPE_RAW8); - #define KSDATAFORMAT_SUBTYPE_RAW8 DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_RAW8) - - // MEDIASUBTYPE_CC - #define STATIC_KSDATAFORMAT_SUBTYPE_CC\ - 0x33214cc1, 0x11f, 0x11d2, 0xb4, 0xb1, 0x0, 0xa0, 0xd1, 0x2, 0xcf, 0xbe - DEFINE_GUIDSTRUCT("33214CC1-011F-11D2-B4B1-00A0D102CFBE", KSDATAFORMAT_SUBTYPE_CC); - #define KSDATAFORMAT_SUBTYPE_CC DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_CC) - - // MEDIASUBTYPE_NABTS - #define STATIC_KSDATAFORMAT_SUBTYPE_NABTS\ - 0xf72a76e2L, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba - DEFINE_GUIDSTRUCT("f72a76e2-eb0a-11d0-ace4-0000c0cc16ba", KSDATAFORMAT_SUBTYPE_NABTS); - #define KSDATAFORMAT_SUBTYPE_NABTS DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NABTS) - - // MEDIASUBTYPE_TELETEXT - #define STATIC_KSDATAFORMAT_SUBTYPE_TELETEXT\ - 0xf72a76e3L, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba - DEFINE_GUIDSTRUCT("f72a76e3-eb0a-11d0-ace4-0000c0cc16ba", KSDATAFORMAT_SUBTYPE_TELETEXT); - #define KSDATAFORMAT_SUBTYPE_TELETEXT DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_TELETEXT) - - - - /* constants for the biCompression field */ - #define KS_BI_RGB 0L - #define KS_BI_RLE8 1L - #define KS_BI_RLE4 2L - #define KS_BI_BITFIELDS 3L - - typedef struct tagKS_RGBQUAD { // rgbq - BYTE rgbBlue; - BYTE rgbGreen; - BYTE rgbRed; - BYTE rgbReserved; - } KS_RGBQUAD, *PKS_RGBQUAD; - - /* constants for palettes */ - #define KS_iPALETTE_COLORS 256 // Maximum colours in palette - #define KS_iEGA_COLORS 16 // Number colours in EGA palette - #define KS_iMASK_COLORS 3 // Maximum three components - #define KS_iTRUECOLOR 16 // Minimum true colour device - #define KS_iRED 0 // Index position for RED mask - #define KS_iGREEN 1 // Index position for GREEN mask - #define KS_iBLUE 2 // Index position for BLUE mask - #define KS_iPALETTE 8 // Maximum colour depth using a palette - #define KS_iMAXBITS 8 // Maximum bits per colour component - #define KS_SIZE_EGA_PALETTE (KS_iEGA_COLORS * sizeof(KS_RGBQUAD)) - #define KS_SIZE_PALETTE (KS_iPALETTE_COLORS * sizeof(KS_RGBQUAD)) - - typedef struct tagKS_BITMAPINFOHEADER{ - DWORD biSize; - LONG biWidth; - LONG biHeight; - WORD biPlanes; - WORD biBitCount; - DWORD biCompression; - DWORD biSizeImage; - LONG biXPelsPerMeter; - LONG biYPelsPerMeter; - DWORD biClrUsed; - DWORD biClrImportant; - } KS_BITMAPINFOHEADER, *PKS_BITMAPINFOHEADER; - - // Used for true colour images that also have a palette - - typedef struct tag_KS_TRUECOLORINFO { - DWORD dwBitMasks[KS_iMASK_COLORS]; - KS_RGBQUAD bmiColors[KS_iPALETTE_COLORS]; - } KS_TRUECOLORINFO, *PKS_TRUECOLORINFO; - - - #define KS_WIDTHBYTES(bits) ((DWORD)(((bits)+31) & (~31)) / 8) - #define KS_DIBWIDTHBYTES(bi) (DWORD)KS_WIDTHBYTES((DWORD)(bi).biWidth * (DWORD)(bi).biBitCount) - #define KS__DIBSIZE(bi) (KS_DIBWIDTHBYTES(bi) * (DWORD)(bi).biHeight) - #define KS_DIBSIZE(bi) ((bi).biHeight < 0 ? (-1)*(KS__DIBSIZE(bi)) : KS__DIBSIZE(bi)) - - typedef LONGLONG REFERENCE_TIME; - - // The BITMAPINFOHEADER contains all the details about the video stream such - // as the actual image dimensions and their pixel depth. A source filter may - // also request that the sink take only a section of the video by providing a - // clipping rectangle in rcSource. In the worst case where the sink filter - // forgets to check this on connection it will simply render the whole thing - // which isn't a disaster. Ideally a sink filter will check the rcSource and - // if it doesn't support image extraction and the rectangle is not empty then - // it will reject the connection. A filter should use SetRectEmpty to reset a - // rectangle to all zeroes (and IsRectEmpty to later check the rectangle). - // The rcTarget specifies the destination rectangle for the video, for most - // source filters they will set this to all zeroes, a downstream filter may - // request that the video be placed in a particular area of the buffers it - // supplies in which case it will call QueryAccept with a non empty target - - typedef struct tagKS_VIDEOINFOHEADER { - - RECT rcSource; // The bit we really want to use - RECT rcTarget; // Where the video should go - DWORD dwBitRate; // Approximate bit data rate - DWORD dwBitErrorRate; // Bit error rate for this stream - REFERENCE_TIME AvgTimePerFrame; // Average time per frame (100ns units) - - KS_BITMAPINFOHEADER bmiHeader; - - } KS_VIDEOINFOHEADER, *PKS_VIDEOINFOHEADER; - - // !!! WARNING !!! - // DO NOT use the following structure unless you are sure that the BITMAPINFOHEADER - // has a normal biSize == sizeof(BITMAPINFOHEADER) ! - // !!! WARNING !!! - - typedef struct tagKS_VIDEOINFO { - - RECT rcSource; // The bit we really want to use - RECT rcTarget; // Where the video should go - DWORD dwBitRate; // Approximate bit data rate - DWORD dwBitErrorRate; // Bit error rate for this stream - REFERENCE_TIME AvgTimePerFrame; // Average time per frame (100ns units) - - KS_BITMAPINFOHEADER bmiHeader; - - union { - KS_RGBQUAD bmiColors[KS_iPALETTE_COLORS]; // Colour palette - DWORD dwBitMasks[KS_iMASK_COLORS]; // True colour masks - KS_TRUECOLORINFO TrueColorInfo; // Both of the above - }; - - } KS_VIDEOINFO, *PKS_VIDEOINFO; - - - #define KS_SIZE_MASKS (KS_iMASK_COLORS * sizeof(DWORD)) - #define KS_SIZE_PREHEADER (FIELD_OFFSET(KS_VIDEOINFOHEADER,bmiHeader)) - - // For normal size - // #define KS_SIZE_VIDEOHEADER (sizeof(KS_BITMAPINFOHEADER) + KS_SIZE_PREHEADER) - // !!! for abnormal biSizes - #define KS_SIZE_VIDEOHEADER(pbmi) ((pbmi)->bmiHeader.biSize + KS_SIZE_PREHEADER) - - // VBI - // Used for NABTS, CC, Intercast, - typedef struct tagKS_VBIINFOHEADER { - ULONG StartLine; // inclusive - ULONG EndLine; // inclusive - ULONG SamplingFrequency; // Hz. - ULONG MinLineStartTime; // microSec * 100 from HSync LE - ULONG MaxLineStartTime; // microSec * 100 from HSync LE - ULONG ActualLineStartTime; // microSec * 100 from HSync LE - ULONG ActualLineEndTime; // microSec * 100 from HSync LE - ULONG VideoStandard; // KS_AnalogVideoStandard* - ULONG SamplesPerLine; - ULONG StrideInBytes; // May be > SamplesPerLine - ULONG BufferSize; // Bytes - } KS_VBIINFOHEADER, *PKS_VBIINFOHEADER; - - // VBI Sampling Rates - #define KS_VBIDATARATE_NABTS (5727272L) - #define KS_VBIDATARATE_CC ( 503493L) // ~= 1/1.986125e-6 - #define KS_VBISAMPLINGRATE_4X_NABTS ((long)(4*KS_VBIDATARATE_NABTS)) - #define KS_VBISAMPLINGRATE_47X_NABTS ((long)(27000000)) - #define KS_VBISAMPLINGRATE_5X_NABTS ((long)(5*KS_VBIDATARATE_NABTS)) - - #define KS_47NABTS_SCALER (KS_VBISAMPLINGRATE_47X_NABTS/(double)KS_VBIDATARATE_NABTS) - - // Analog video variant - Use this when the format is FORMAT_AnalogVideo - // - // rcSource defines the portion of the active video signal to use - // rcTarget defines the destination rectangle - // both of the above are relative to the dwActiveWidth and dwActiveHeight fields - // dwActiveWidth is currently set to 720 for all formats (but could change for HDTV) - // dwActiveHeight is 483 for NTSC and 575 for PAL/SECAM (but could change for HDTV) - - typedef struct tagKS_AnalogVideoInfo { - RECT rcSource; // Width max is 720, height varies w/ TransmissionStd - RECT rcTarget; // Where the video should go - DWORD dwActiveWidth; // Always 720 (CCIR-601 active samples per line) - DWORD dwActiveHeight; // 483 for NTSC, 575 for PAL/SECAM - REFERENCE_TIME AvgTimePerFrame; // Normal ActiveMovie units (100 nS) - } KS_ANALOGVIDEOINFO, *PKS_ANALOGVIDEOINFO; - - //=========================================================================== - // Data packet passed on Analog video stream channel change - //=========================================================================== - - #define KS_TVTUNER_CHANGE_BEGIN_TUNE 0x0001L // Starting a tuning operation - #define KS_TVTUNER_CHANGE_END_TUNE 0x0002L // Ending a tuning operation - - typedef struct tagKS_TVTUNER_CHANGE_INFO { - DWORD dwFlags; // KS_TVTUNER_CHANGE_* - DWORD dwCountryCode; - DWORD dwAnalogVideoStandard; // KS_AnalogVideoStandard - DWORD dwChannel; - } KS_TVTUNER_CHANGE_INFO, *PKS_TVTUNER_CHANGE_INFO; - - //=========================================================================== - // Video format blocks - //=========================================================================== - - typedef enum { - KS_MPEG2Level_Low, - KS_MPEG2Level_Main, - KS_MPEG2Level_High1440, - KS_MPEG2Level_High - } KS_MPEG2Level; - - typedef enum { - KS_MPEG2Profile_Simple, - KS_MPEG2Profile_Main, - KS_MPEG2Profile_SNRScalable, - KS_MPEG2Profile_SpatiallyScalable, - KS_MPEG2Profile_High - } KS_MPEG2Profile; - - #define KS_INTERLACE_IsInterlaced 0x00000001 // if 0, other interlace bits are irrelevent - #define KS_INTERLACE_1FieldPerSample 0x00000002 // else 2 fields per media sample - #define KS_INTERLACE_Field1First 0x00000004 // else Field 2 is first; top field in PAL is field 1, top field in NTSC is field 2? - #define KS_INTERLACE_UNUSED 0x00000008 // - #define KS_INTERLACE_FieldPatternMask 0x00000030 // use this mask with AMINTERLACE_FieldPat* - #define KS_INTERLACE_FieldPatField1Only 0x00000000 // Data never contains a Field2 - #define KS_INTERLACE_FieldPatField2Only 0x00000010 // Data never contains a Field1 - #define KS_INTERLACE_FieldPatBothRegular 0x00000020 // There will be a Field2 for every Field1 (required for Weave?) - #define KS_INTERLACE_FieldPatBothIrregular 0x00000030 // Random pattern of Field1s and Field2s - #define KS_INTERLACE_DisplayModeMask 0x000000c0 - #define KS_INTERLACE_DisplayModeBobOnly 0x00000000 - #define KS_INTERLACE_DisplayModeWeaveOnly 0x00000040 - #define KS_INTERLACE_DisplayModeBobOrWeave 0x00000080 - - - - #define KS_MPEG2_DoPanScan 0x00000001 //if set, the MPEG-2 video decoder should crop output image - // based on pan-scan vectors in picture_display_extension - // and change the picture aspect ratio accordingly. - #define KS_MPEG2_DVDLine21Field1 0x00000002 //if set, the MPEG-2 decoder must be able to produce an output - // pin for DVD style closed caption data found in GOP layer of field 1 - #define KS_MPEG2_DVDLine21Field2 0x00000004 //if set, the MPEG-2 decoder must be able to produce an output - // pin for DVD style closed caption data found in GOP layer of field 2 - #define KS_MPEG2_SourceIsLetterboxed 0x00000008 //if set, indicates that black bars have been encoded in the top - // and bottom of the video. - #define KS_MPEG2_FilmCameraMode 0x00000010 //if set, indicates "film mode" used for 625/50 content. If cleared, - // indicates that "camera mode" was used. - #define KS_MPEG2_LetterboxAnalogOut 0x00000020 //if set and this stream is sent to an analog output, it should - // be letterboxed. Streams sent to VGA should be letterboxed only by renderers. - #define KS_MPEG2_DSS_UserData 0x00000040 //if set, the MPEG-2 decoder must process DSS style user data - #define KS_MPEG2_DVB_UserData 0x00000080 //if set, the MPEG-2 decoder must process DVB style user data - #define KS_MPEG2_27MhzTimebase 0x00000100 //if set, the PTS,DTS timestamps advance at 27MHz rather than 90KHz - - typedef struct tagKS_VIDEOINFOHEADER2 { - RECT rcSource; - RECT rcTarget; - DWORD dwBitRate; - DWORD dwBitErrorRate; - REFERENCE_TIME AvgTimePerFrame; - DWORD dwInterlaceFlags; // use AMINTERLACE_* defines. Reject connection if undefined bits are not 0 - DWORD dwCopyProtectFlags; // use AMCOPYPROTECT_* defines. Reject connection if undefined bits are not 0 - DWORD dwPictAspectRatioX; // X dimension of picture aspect ratio, e.g. 16 for 16x9 display - DWORD dwPictAspectRatioY; // Y dimension of picture aspect ratio, e.g. 9 for 16x9 display - DWORD dwReserved1; // must be 0; reject connection otherwise - DWORD dwReserved2; // must be 0; reject connection otherwise - KS_BITMAPINFOHEADER bmiHeader; - } KS_VIDEOINFOHEADER2, *PKS_VIDEOINFOHEADER2; - - typedef struct tagKS_MPEG1VIDEOINFO { - KS_VIDEOINFOHEADER hdr; // Compatible with VIDEOINFO - DWORD dwStartTimeCode; // 25-bit Group of pictures time code at start of data - DWORD cbSequenceHeader; // Length in bytes of bSequenceHeader - BYTE bSequenceHeader[1]; // Sequence header including quantization matrices if any - } KS_MPEG1VIDEOINFO, *PKS_MPEG1VIDEOINFO; - - #define KS_MAX_SIZE_MPEG1_SEQUENCE_INFO 140 - #define KS_SIZE_MPEG1VIDEOINFO(pv) (FIELD_OFFSET(KS_MPEG1VIDEOINFO, bSequenceHeader[0]) + (pv)->cbSequenceHeader) - #define KS_MPEG1_SEQUENCE_INFO(pv) ((const BYTE *)(pv)->bSequenceHeader) - - typedef struct tagKS_MPEGVIDEOINFO2 { - KS_VIDEOINFOHEADER2 hdr; - DWORD dwStartTimeCode; // ?? not used for DVD ?? - DWORD cbSequenceHeader; // is 0 for DVD (no sequence header) - DWORD dwProfile; // use enum MPEG2Profile - DWORD dwLevel; // use enum MPEG2Level - DWORD dwFlags; // use AMMPEG2_* defines. Reject connection if undefined bits are not 0 - DWORD bSequenceHeader[1]; // DWORD instead of Byte for alignment purposes - // For MPEG-2, if a sequence_header is included, the sequence_extension - // should also be included - } KS_MPEGVIDEOINFO2, *PKS_MPEGVIDEOINFO2; - - - #define KS_SIZE_MPEGVIDEOINFO2(pv) (FIELD_OFFSET(KS_MPEGVIDEOINFO2, bSequenceHeader[0]) + (pv)->cbSequenceHeader) - #define KS_MPEG1_SEQUENCE_INFO(pv) ((const BYTE *)(pv)->bSequenceHeader) - - //=========================================================================== - // Audio format blocks - //=========================================================================== - - //if set, the PTS,DTS timestamps advance at 27MHz rather than 90KHz - #define KS_MPEGAUDIOINFO_27MhzTimebase 0x00000001 - - typedef struct tagKS_MPEAUDIOINFO { - DWORD dwFlags; // use KS_MPEGAUDIOINFO_* defines. Reject connection if undefined bits are not 0 - DWORD dwReserved1; // must be 0; reject connection otherwise - DWORD dwReserved2; // must be 0; reject connection otherwise - DWORD dwReserved3; // must be 0; reject connection otherwise - } KS_MPEGAUDIOINFO, *PKS_MPEGAUDIOINFO; - - //=========================================================================== - // Video DATAFORMATs - //=========================================================================== - - typedef struct tagKS_DATAFORMAT_VIDEOINFOHEADER { - KSDATAFORMAT DataFormat; - KS_VIDEOINFOHEADER VideoInfoHeader; - } KS_DATAFORMAT_VIDEOINFOHEADER, *PKS_DATAFORMAT_VIDEOINFOHEADER; - - typedef struct tagKS_DATAFORMAT_VIDEOINFOHEADER2 { - KSDATAFORMAT DataFormat; - KS_VIDEOINFOHEADER2 VideoInfoHeader2; - } KS_DATAFORMAT_VIDEOINFOHEADER2, *PKS_DATAFORMAT_VIDEOINFOHEADER2; - - typedef struct tagKS_DATAFORMAT_VIDEOINFO_PALETTE { - KSDATAFORMAT DataFormat; - KS_VIDEOINFO VideoInfo; - } KS_DATAFORMAT_VIDEOINFO_PALETTE, *PKS_DATAFORMAT_VIDEOINFO_PALETTE; - - typedef struct tagKS_DATAFORMAT_VBIINFOHEADER { - KSDATAFORMAT DataFormat; - KS_VBIINFOHEADER VBIInfoHeader; - } KS_DATAFORMAT_VBIINFOHEADER, *PKS_DATAFORMAT_VBIINFOHEADER; - - typedef struct _KS_VIDEO_STREAM_CONFIG_CAPS { - GUID guid; // will be MEDIATYPE_Video - ULONG VideoStandard; // logical OR of all AnalogVideoStandards - // supported - SIZE InputSize; // the inherent size of the incoming signal - // (every pixel unique) - SIZE MinCroppingSize; // smallest rcSrc cropping rect allowed - SIZE MaxCroppingSize; // largest rcSrc cropping rect allowed - int CropGranularityX; // granularity of cropping size - int CropGranularityY; - int CropAlignX; // alignment of cropping rect - int CropAlignY; - SIZE MinOutputSize; // smallest bitmap stream can produce - SIZE MaxOutputSize; // largest bitmap stream can produce - int OutputGranularityX; // granularity of output bitmap size - int OutputGranularityY; - int StretchTapsX; // 0, no stretch, 1 pix dup, 2 interp, ... - int StretchTapsY; // Describes quality of hardware scaler - int ShrinkTapsX; // - int ShrinkTapsY; // - LONGLONG MinFrameInterval; // 100 nS units - LONGLONG MaxFrameInterval; - LONG MinBitsPerSecond; - LONG MaxBitsPerSecond; - } KS_VIDEO_STREAM_CONFIG_CAPS, *PKS_VIDEO_STREAM_CONFIG_CAPS; - - //=========================================================================== - // Video DATARANGEs - //=========================================================================== - - typedef struct tagKS_DATARANGE_VIDEO { - KSDATARANGE DataRange; - BOOL bFixedSizeSamples; // all samples same size? - BOOL bTemporalCompression; // all I frames? - DWORD StreamDescriptionFlags; // KS_VIDEO_DESC_* - DWORD MemoryAllocationFlags; // KS_VIDEO_ALLOC_* - KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; - KS_VIDEOINFOHEADER VideoInfoHeader; // default format - } KS_DATARANGE_VIDEO, *PKS_DATARANGE_VIDEO; - - typedef struct tagKS_DATARANGE_VIDEO2 { - KSDATARANGE DataRange; - BOOL bFixedSizeSamples; // all samples same size? - BOOL bTemporalCompression; // all I frames? - DWORD StreamDescriptionFlags; // KS_VIDEO_DESC_* - DWORD MemoryAllocationFlags; // KS_VIDEO_ALLOC_* - KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; - KS_VIDEOINFOHEADER2 VideoInfoHeader; // default format - } KS_DATARANGE_VIDEO2, *PKS_DATARANGE_VIDEO2; - - typedef struct tagKS_DATARANGE_MPEG1_VIDEO { - KSDATARANGE DataRange; - BOOL bFixedSizeSamples; // all samples same size? - BOOL bTemporalCompression; // all I frames? - DWORD StreamDescriptionFlags; // KS_VIDEO_DESC_* - DWORD MemoryAllocationFlags; // KS_VIDEO_ALLOC_* - KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; - KS_MPEG1VIDEOINFO VideoInfoHeader; // default format - } KS_DATARANGE_MPEG1_VIDEO, *PKS_DATARANGE_MPEG1_VIDEO; - - typedef struct tagKS_DATARANGE_MPEG2_VIDEO { - KSDATARANGE DataRange; - BOOL bFixedSizeSamples; // all samples same size? - BOOL bTemporalCompression; // all I frames? - DWORD StreamDescriptionFlags; // KS_VIDEO_DESC_* - DWORD MemoryAllocationFlags; // KS_VIDEO_ALLOC_* - KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; - KS_MPEGVIDEOINFO2 VideoInfoHeader; // default format - } KS_DATARANGE_MPEG2_VIDEO, *PKS_DATARANGE_MPEG2_VIDEO; - - typedef struct tagKS_DATARANGE_VIDEO_PALETTE { - KSDATARANGE DataRange; - BOOL bFixedSizeSamples; // all samples same size? - BOOL bTemporalCompression; // all I frames? - DWORD StreamDescriptionFlags; // KS_VIDEO_DESC_* - DWORD MemoryAllocationFlags; // KS_VIDEO_ALLOC_* - KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; - KS_VIDEOINFO VideoInfo; // default format - } KS_DATARANGE_VIDEO_PALETTE, *PKS_DATARANGE_VIDEO_PALETTE; - - typedef struct tagKS_DATARANGE_VIDEO_VBI { - KSDATARANGE DataRange; - BOOL bFixedSizeSamples; // all samples same size? - BOOL bTemporalCompression; // all I frames? - DWORD StreamDescriptionFlags; // KS_VIDEO_DESC_* - DWORD MemoryAllocationFlags; // KS_VIDEO_ALLOC_* - KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; - KS_VBIINFOHEADER VBIInfoHeader; // default format - } KS_DATARANGE_VIDEO_VBI, *PKS_DATARANGE_VIDEO_VBI; - - typedef struct tagKS_DATARANGE_ANALOGVIDEO { - KSDATARANGE DataRange; - KS_ANALOGVIDEOINFO AnalogVideoInfo; - } KS_DATARANGE_ANALOGVIDEO, *PKS_DATARANGE_ANALOGVIDEO; - - //=========================================================================== - // StreamDescriptionFlags - // - // These define the "purpose" of each video stream - //=========================================================================== - - #define KS_VIDEOSTREAM_PREVIEW 0x0001 // Preview stream - #define KS_VIDEOSTREAM_CAPTURE 0x0002 // Capture stream - #define KS_VIDEOSTREAM_VBI 0x0010 // Field1 VBI - #define KS_VIDEOSTREAM_NABTS 0x0020 // Field1 NABTS - #define KS_VIDEOSTREAM_CC 0x0100 // Closed Captioning - #define KS_VIDEOSTREAM_EDS 0x0200 // Extended Data Services - #define KS_VIDEOSTREAM_TELETEXT 0x0400 // Field1 Teletext only - #define KS_VIDEOSTREAM_STILL 0x1000 // Still image input - #define KS_VIDEOSTREAM_IS_VPE 0x8000 // Is a VPE based stream? - - // MemoryAllocationFlags - #define KS_VIDEO_ALLOC_VPE_SYSTEM 0x0001 // VPE surface in system memory - #define KS_VIDEO_ALLOC_VPE_DISPLAY 0x0002 // VPE surface in display memory - #define KS_VIDEO_ALLOC_VPE_AGP 0x0004 // VPE surface in AGP memory - - ////////////////////////////////////////////////////////////// - // Capture driver VBI property sets - ////////////////////////////////////////////////////////////// - - // {F162C607-7B35-496f-AD7F-2DCA3B46B718} - #define STATIC_KSPROPSETID_VBICAP_PROPERTIES\ - 0xf162c607, 0x7b35, 0x496f, 0xad, 0x7f, 0x2d, 0xca, 0x3b, 0x46, 0xb7, 0x18 - DEFINE_GUIDSTRUCT("F162C607-7B35-496f-AD7F-2DCA3B46B718", KSPROPSETID_VBICAP_PROPERTIES); - #define KSPROPSETID_VBICAP_PROPERTIES DEFINE_GUIDNAMED(KSPROPSETID_VBICAP_PROPERTIES) - - typedef enum { - KSPROPERTY_VBICAP_PROPERTIES_PROTECTION = 0x01, - } KSPROPERTY_VBICAP; - - typedef struct _VBICAP_PROPERTIES_PROTECTION_S { - KSPROPERTY Property; - ULONG StreamIndex; // Index of stream - ULONG Status; - } VBICAP_PROPERTIES_PROTECTION_S, *PVBICAP_PROPERTIES_PROTECTION_S; - #define KS_VBICAP_PROTECTION_MV_PRESENT 0x0001L - #define KS_VBICAP_PROTECTION_MV_HARDWARE 0x0002L - #define KS_VBICAP_PROTECTION_MV_DETECTED 0x0004L - - - /***************************************************************************/ - /* VBI Related GUIDs, structs and properties for codecs(generic, cc, nabts)*/ - /***************************************************************************/ - - /////////////////////////////////////////////////////////////////////////////////////// - // IP/NABTS Protocol Reserved Group IDs - Overall Range 0x800-0x8FF [Decimal 2048-2079] - // Intervening values(0-F) are used if there are multiple providers at a particular tier - /////////////////////////////////////////////////////////////////////////////////////// - - // Used by individual content creators in show footage/data - #define KS_NABTS_GROUPID_ORIGINAL_CONTENT_BASE 0x800 - #define KS_NABTS_GROUPID_ORIGINAL_CONTENT_ADVERTISER_BASE 0x810 - - // Used by production company in finished show data - #define KS_NABTS_GROUPID_PRODUCTION_COMPANY_CONTENT_BASE 0x820 - #define KS_NABTS_GROUPID_PRODUCTION_COMPANY_ADVERTISER_BASE 0x830 - - // Used by broadcast syndicates in syndicated show data - #define KS_NABTS_GROUPID_SYNDICATED_SHOW_CONTENT_BASE 0x840 - #define KS_NABTS_GROUPID_SYNDICATED_SHOW_ADVERTISER_BASE 0x850 - - // Used by tv networks in network television data - #define KS_NABTS_GROUPID_NETWORK_WIDE_CONTENT_BASE 0x860 - #define KS_NABTS_GROUPID_NETWORK_WIDE_ADVERTISER_BASE 0x870 - - // Used by telvision stations in local programming data - #define KS_NABTS_GROUPID_TELEVISION_STATION_CONTENT_BASE 0x880 - #define KS_NABTS_GROUPID_TELEVISION_STATION_ADVERTISER_BASE 0x890 - - // Used by cable system in cable head-end originated data - #define KS_NABTS_GROUPID_LOCAL_CABLE_SYSTEM_CONTENT_BASE 0x8A0 - #define KS_NABTS_GROUPID_LOCAL_CABLE_SYSTEM_ADVERTISER_BASE 0x8B0 - - // The values between 0x8C0 - 0x8EF are reserved for future expansion - - // Used by Microsoft for Testing purposes (0x8F0 - 0x8FF) - #define KS_NABTS_GROUPID_MICROSOFT_RESERVED_TEST_DATA_BASE 0x8F0 - - ////////////////////////////////////////////////////////////// - // Stream Format FEC-corrected NABTS bundles - ////////////////////////////////////////////////////////////// - - #define STATIC_KSDATAFORMAT_TYPE_NABTS \ - 0xe757bca0, 0x39ac, 0x11d1, 0xa9, 0xf5, 0x0, 0xc0, 0x4f, 0xbb, 0xde, 0x8f - DEFINE_GUIDSTRUCT("E757BCA0-39AC-11d1-A9F5-00C04FBBDE8F", KSDATAFORMAT_TYPE_NABTS); - #define KSDATAFORMAT_TYPE_NABTS DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_NABTS) - - #define STATIC_KSDATAFORMAT_SUBTYPE_NABTS_FEC \ - 0xe757bca1, 0x39ac, 0x11d1, 0xa9, 0xf5, 0x0, 0xc0, 0x4f, 0xbb, 0xde, 0x8f - DEFINE_GUIDSTRUCT("E757BCA1-39AC-11d1-A9F5-00C04FBBDE8F", KSDATAFORMAT_SUBTYPE_NABTS_FEC); - #define KSDATAFORMAT_SUBTYPE_NABTS_FEC DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NABTS_FEC) - - - ////////////////////////////////////////////////////////////// - // NABTS Bundle data structure definition - ////////////////////////////////////////////////////////////// - - #define MAX_NABTS_VBI_LINES_PER_FIELD 11 - #define NABTS_LINES_PER_BUNDLE 16 - #define NABTS_PAYLOAD_PER_LINE 28 - #define NABTS_BYTES_PER_LINE 36 - - typedef struct _NABTSFEC_BUFFER { - ULONG dataSize; - USHORT groupID; - USHORT Reserved; - UCHAR data[NABTS_LINES_PER_BUNDLE * NABTS_PAYLOAD_PER_LINE]; - } NABTSFEC_BUFFER, *PNABTSFEC_BUFFER; - - ////////////////////////////////////////////////////////////// - // vbi codec filtering pin properties - ////////////////////////////////////////////////////////////// - - #define STATIC_KSPROPSETID_VBICodecFiltering \ - 0xcafeb0caL, 0x8715, 0x11d0, 0xbd, 0x6a, 0x00, 0x35, 0xc0, 0xed, 0xba, 0xbe - DEFINE_GUIDSTRUCT("cafeb0ca-8715-11d0-bd6a-0035c0edbabe", KSPROPSETID_VBICodecFiltering); - #define KSPROPSETID_VBICodecFiltering DEFINE_GUIDNAMED(KSPROPSETID_VBICodecFiltering) - - typedef enum { - KSPROPERTY_VBICODECFILTERING_SCANLINES_REQUESTED_BIT_ARRAY = 0x01, - KSPROPERTY_VBICODECFILTERING_SCANLINES_DISCOVERED_BIT_ARRAY, - KSPROPERTY_VBICODECFILTERING_SUBSTREAMS_REQUESTED_BIT_ARRAY, - KSPROPERTY_VBICODECFILTERING_SUBSTREAMS_DISCOVERED_BIT_ARRAY, - KSPROPERTY_VBICODECFILTERING_STATISTICS, - } KSPROPERTY_VBICODECFILTERING; - - typedef struct _VBICODECFILTERING_SCANLINES { - DWORD DwordBitArray[32]; // An array of scanline bits 0..1024(32*32) - } VBICODECFILTERING_SCANLINES, *PVBICODECFILTERING_SCANLINES; - - typedef struct _VBICODECFILTERING_NABTS_SUBSTREAMS { - DWORD SubstreamMask[128]; // An array of 4096 bits (one for each NABTS GroupID) - } VBICODECFILTERING_NABTS_SUBSTREAMS, *PVBICODECFILTERING_NABTS_SUBSTREAMS; - - typedef struct _VBICODECFILTERING_CC_SUBSTREAMS { - DWORD SubstreamMask; // An array of 32 bits (see KS_CC_SUBSTREAM *) - } VBICODECFILTERING_CC_SUBSTREAMS, *PVBICODECFILTERING_CC_SUBSTREAMS; - - #define KS_CC_SUBSTREAM_ODD 0x0001L - #define KS_CC_SUBSTREAM_EVEN 0x0002L - #define KS_CC_SUBSTREAM_SERVICE_MASK_DC1 0x00F0L // DataChannel1: CC1,CC3,T1,T3 - #define KS_CC_SUBSTREAM_SERVICE_CC1 0x0010L - #define KS_CC_SUBSTREAM_SERVICE_CC3 0x0020L - #define KS_CC_SUBSTREAM_SERVICE_T1 0x0040L - #define KS_CC_SUBSTREAM_SERVICE_T3 0x0080L - #define KS_CC_SUBSTREAM_SERVICE_MASK_DC2 0x0F00L // DataChannel2: CC2,CC4,T2,T4 - #define KS_CC_SUBSTREAM_SERVICE_CC2 0x0100L - #define KS_CC_SUBSTREAM_SERVICE_CC4 0x0200L - #define KS_CC_SUBSTREAM_SERVICE_T2 0x0400L - #define KS_CC_SUBSTREAM_SERVICE_T4 0x0800L - #define KS_CC_SUBSTREAM_SERVICE_XDS 0x1000L - - /////////////////////////////////////////////////////////////////// - // Hardware decoded CC stream format - /////////////////////////////////////////////////////////////////// - - #define CC_MAX_HW_DECODE_LINES 12 - typedef struct _CC_BYTE_PAIR { - BYTE Decoded[2]; - USHORT Reserved; - } CC_BYTE_PAIR, *PCC_BYTE_PAIR; - - typedef struct _CC_HW_FIELD { - VBICODECFILTERING_SCANLINES ScanlinesRequested; - ULONG fieldFlags; // KS_VBI_FLAG_FIELD1,2 - LONGLONG PictureNumber; - CC_BYTE_PAIR Lines[CC_MAX_HW_DECODE_LINES]; - } CC_HW_FIELD, *PCC_HW_FIELD; - - /////////////////////////////////////////////////////////////////// - // Raw NABTS stream format (TYPE_NABTS, SUBTYPE_NABTS) - /////////////////////////////////////////////////////////////////// - - // These low-level structures are byte packed( -Zp1 ) - #if !defined( PACK_PRAGMAS_NOT_SUPPORTED ) - #include - #endif - typedef struct _NABTS_BUFFER_LINE { - BYTE Confidence; - BYTE Bytes[NABTS_BYTES_PER_LINE]; - } NABTS_BUFFER_LINE, *PNABTS_BUFFER_LINE; - - #define NABTS_BUFFER_PICTURENUMBER_SUPPORT 1 - typedef struct _NABTS_BUFFER { - VBICODECFILTERING_SCANLINES ScanlinesRequested; - LONGLONG PictureNumber; - NABTS_BUFFER_LINE NabtsLines[MAX_NABTS_VBI_LINES_PER_FIELD]; - } NABTS_BUFFER, *PNABTS_BUFFER; - #if !defined( PACK_PRAGMAS_NOT_SUPPORTED ) - #include - #endif - - // - // Common codec statistics - // - - typedef struct _VBICODECFILTERING_STATISTICS_COMMON { - DWORD InputSRBsProcessed; // upstream SRBs received - DWORD OutputSRBsProcessed; // downstream SRBs sent - DWORD SRBsIgnored; // SRBs ignored due to no requests - DWORD InputSRBsMissing; // SRBs dropped upstream - DWORD OutputSRBsMissing; // Output dropped because no SRB pending - DWORD OutputFailures; // dropped because of other failure - DWORD InternalErrors; // could not process due to int. failure - DWORD ExternalErrors; // could not process due to ext. failure - DWORD InputDiscontinuities; // discontinuities received - DWORD DSPFailures; // DSP confidence failure - DWORD TvTunerChanges; // number of received KS_TVTUNER_CHANGE_BEGIN_TUNE and KS_TVTUNER_CHANGE_END_TUNE pairs. - DWORD VBIHeaderChanges; // number of received KS_VBI_FLAG_VBIINFOHEADER_CHANGE - DWORD LineConfidenceAvg; // Average of all DSP confidence results - DWORD BytesOutput; // Bytes sent downstream - } VBICODECFILTERING_STATISTICS_COMMON, *PVBICODECFILTERING_STATISTICS_COMMON; - - typedef struct _VBICODECFILTERING_STATISTICS_COMMON_PIN { - DWORD SRBsProcessed; // SRBs sent/received - DWORD SRBsIgnored; // SRBs ignored due to filtering - DWORD SRBsMissing; // SRBs not sent/received - DWORD InternalErrors; // could not send/receive due to int. failure - DWORD ExternalErrors; // could not send/receive due to ext. failure - DWORD Discontinuities; // discontinuities received/sent - DWORD LineConfidenceAvg; // Average of all DSP confidence results for this pin - DWORD BytesOutput; // Bytes sent downstream - } VBICODECFILTERING_STATISTICS_COMMON_PIN, *PVBICODECFILTERING_STATISTICS_COMMON_PIN; - - // - // Codec-specific statistics - NABTS - // - - typedef struct _VBICODECFILTERING_STATISTICS_NABTS { - VBICODECFILTERING_STATISTICS_COMMON Common; // Generic VBI statistics - DWORD FECBundleBadLines; // Un-FEC-correctable lines - DWORD FECQueueOverflows; // Number of times FEC queue overflowed - DWORD FECCorrectedLines; // Lines CSUM corrected by FEC - DWORD FECUncorrectableLines; // FEC input lines not CSUM correctable - DWORD BundlesProcessed; // Bundles received from FEC - DWORD BundlesSent2IP; // Bundles sent to IP driver - DWORD FilteredLines; // Lines processed and then dropped - // because no one was interested - } VBICODECFILTERING_STATISTICS_NABTS, *PVBICODECFILTERING_STATISTICS_NABTS; - - typedef struct _VBICODECFILTERING_STATISTICS_NABTS_PIN { - VBICODECFILTERING_STATISTICS_COMMON_PIN Common;// Generic VBI pin statistics - } VBICODECFILTERING_STATISTICS_NABTS_PIN, *PVBICODECFILTERING_STATISTICS_NABTS_PIN; - - // - // Codec-specific statistics - Closed Caption - // - - typedef struct _VBICODECFILTERING_STATISTICS_CC { - VBICODECFILTERING_STATISTICS_COMMON Common; // Generic VBI statistics - } VBICODECFILTERING_STATISTICS_CC, *PVBICODECFILTERING_STATISTICS_CC; - - - typedef struct _VBICODECFILTERING_STATISTICS_CC_PIN { - VBICODECFILTERING_STATISTICS_COMMON_PIN Common;// Generic VBI pin statistics - } VBICODECFILTERING_STATISTICS_CC_PIN, *PVBICODECFILTERING_STATISTICS_CC_PIN; - - //////////////////////////////////////////////////////////////////////////// - // VBI codec property structures(based on KSPROPERTY_VBICODECFILTERING enum) - //////////////////////////////////////////////////////////////////////////// - - // *** Most codecs support this property - // KSPROPERTY_VBICODECFILTERING_SCANLINES_REQUESTED_BIT_ARRAY - // KSPROPERTY_VBICODECFILTERING_SCANLINES_DISCOVERED_BIT_ARRAY, - typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_SCANLINES Scanlines; - } KSPROPERTY_VBICODECFILTERING_SCANLINES_S, *PKSPROPERTY_VBICODECFILTERING_SCANLINES_S; - - // *** NABTS codecs support this property - // KSPROPERTY_VBICODECFILTERING_SUBSTREAMS_REQUESTED_BIT_ARRAY, - // KSPROPERTY_VBICODECFILTERING_SUBSTREAMS_DISCOVERED_BIT_ARRAY, - typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_NABTS_SUBSTREAMS Substreams; - } KSPROPERTY_VBICODECFILTERING_NABTS_SUBSTREAMS_S, *PKSPROPERTY_VBICODECFILTERING_NABTS_SUBSTREAMS_S; - - // *** Closed captioning codecs support this property - // KSPROPERTY_VBICODECFILTERING_SUBSTREAMS_REQUESTED_BIT_ARRAY, - // KSPROPERTY_VBICODECFILTERING_SUBSTREAMS_DISCOVERED_BIT_ARRAY, - typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_CC_SUBSTREAMS Substreams; - } KSPROPERTY_VBICODECFILTERING_CC_SUBSTREAMS_S, *PKSPROPERTY_VBICODECFILTERING_CC_SUBSTREAMS_S; - - // *** Most codecs support these versions of the global and pin properties - // KSPROPERTY_VBICODECFILTERING_STATISTICS - typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_STATISTICS_COMMON Statistics; - } KSPROPERTY_VBICODECFILTERING_STATISTICS_COMMON_S, *PKSPROPERTY_VBICODECFILTERING_STATISTICS_COMMON_S; - - typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_STATISTICS_COMMON_PIN Statistics; - } KSPROPERTY_VBICODECFILTERING_STATISTICS_COMMON_PIN_S, *PKSPROPERTY_VBICODECFILTERING_STATISTICS_COMMON_PIN_S; - - // *** NABTS codecs support this version of the global and pin properties - // KSPROPERTY_VBICODECFILTERING_STATISTICS - typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_STATISTICS_NABTS Statistics; - } KSPROPERTY_VBICODECFILTERING_STATISTICS_NABTS_S, *PKSPROPERTY_VBICODECFILTERING_STATISTICS_NABTS_S; - - typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_STATISTICS_NABTS_PIN Statistics; - } KSPROPERTY_VBICODECFILTERING_STATISTICS_NABTS_PIN_S, *PKSPROPERTY_VBICODECFILTERING_STATISTICS_NABTS_PIN_S; - - // *** Closed captioning codecs support this version of the global and pin properties - // KSPROPERTY_VBICODECFILTERING_STATISTICS - - typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_STATISTICS_CC Statistics; - } KSPROPERTY_VBICODECFILTERING_STATISTICS_CC_S, *PKSPROPERTY_VBICODECFILTERING_STATISTICS_CC_S; - - typedef struct { - KSPROPERTY Property; - VBICODECFILTERING_STATISTICS_CC_PIN Statistics; - } KSPROPERTY_VBICODECFILTERING_STATISTICS_CC_PIN_S, *PKSPROPERTY_VBICODECFILTERING_STATISTICS_CC_PIN_S; - - // Standard Pin Names for the video capture filter - //=========================================================================== - - #define STATIC_PINNAME_VIDEO_CAPTURE \ - 0xfb6c4281, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba - #define STATIC_PINNAME_CAPTURE STATIC_PINNAME_VIDEO_CAPTURE - DEFINE_GUIDSTRUCT("FB6C4281-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_CAPTURE); - #define PINNAME_VIDEO_CAPTURE DEFINE_GUIDNAMED(PINNAME_VIDEO_CAPTURE) - #define PINNAME_CAPTURE PINNAME_VIDEO_CAPTURE - - #define STATIC_PINNAME_VIDEO_CC_CAPTURE \ - 0x1aad8061, 0x12d, 0x11d2, 0xb4, 0xb1, 0x0, 0xa0, 0xd1, 0x2, 0xcf, 0xbe - #define STATIC_PINNAME_CC_CAPTURE STATIC_PINNAME_VIDEO_CC_CAPTURE - DEFINE_GUIDSTRUCT("1AAD8061-012D-11d2-B4B1-00A0D102CFBE", PINNAME_VIDEO_CC_CAPTURE); - #define PINNAME_VIDEO_CC_CAPTURE DEFINE_GUIDNAMED(PINNAME_VIDEO_CC_CAPTURE) - - #define STATIC_PINNAME_VIDEO_NABTS_CAPTURE \ - 0x29703660, 0x498a, 0x11d2, 0xb4, 0xb1, 0x0, 0xa0, 0xd1, 0x2, 0xcf, 0xbe - #define STATIC_PINNAME_NABTS_CAPTURE STATIC_PINNAME_VIDEO_NABTS_CAPTURE - DEFINE_GUIDSTRUCT("29703660-498A-11d2-B4B1-00A0D102CFBE", PINNAME_VIDEO_NABTS_CAPTURE); - #define PINNAME_VIDEO_NABTS_CAPTURE DEFINE_GUIDNAMED(PINNAME_VIDEO_NABTS_CAPTURE) - - #define STATIC_PINNAME_VIDEO_PREVIEW \ - 0xfb6c4282, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba - #define STATIC_PINNAME_PREVIEW STATIC_PINNAME_VIDEO_PREVIEW - DEFINE_GUIDSTRUCT("FB6C4282-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_PREVIEW); - #define PINNAME_VIDEO_PREVIEW DEFINE_GUIDNAMED(PINNAME_VIDEO_PREVIEW) - #define PINNAME_PREVIEW PINNAME_VIDEO_PREVIEW - - #define STATIC_PINNAME_VIDEO_ANALOGVIDEOIN \ - 0xfb6c4283, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba - DEFINE_GUIDSTRUCT("FB6C4283-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_ANALOGVIDEOIN); - #define PINNAME_VIDEO_ANALOGVIDEOIN DEFINE_GUIDNAMED(PINNAME_VIDEO_ANALOGVIDEOIN) - - #define STATIC_PINNAME_VIDEO_VBI \ - 0xfb6c4284, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba - DEFINE_GUIDSTRUCT("FB6C4284-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_VBI); - #define PINNAME_VIDEO_VBI DEFINE_GUIDNAMED(PINNAME_VIDEO_VBI) - - #define STATIC_PINNAME_VIDEO_VIDEOPORT \ - 0xfb6c4285, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba - DEFINE_GUIDSTRUCT("FB6C4285-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_VIDEOPORT); - #define PINNAME_VIDEO_VIDEOPORT DEFINE_GUIDNAMED(PINNAME_VIDEO_VIDEOPORT) - - #define STATIC_PINNAME_VIDEO_NABTS \ - 0xfb6c4286, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba - DEFINE_GUIDSTRUCT("FB6C4286-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_NABTS); - #define PINNAME_VIDEO_NABTS DEFINE_GUIDNAMED(PINNAME_VIDEO_NABTS) - - #define STATIC_PINNAME_VIDEO_EDS \ - 0xfb6c4287, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba - DEFINE_GUIDSTRUCT("FB6C4287-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_EDS); - #define PINNAME_VIDEO_EDS DEFINE_GUIDNAMED(PINNAME_VIDEO_EDS) - - #define STATIC_PINNAME_VIDEO_TELETEXT \ - 0xfb6c4288, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba - DEFINE_GUIDSTRUCT("FB6C4288-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_TELETEXT); - #define PINNAME_VIDEO_TELETEXT DEFINE_GUIDNAMED(PINNAME_VIDEO_TELETEXT) - - #define STATIC_PINNAME_VIDEO_CC \ - 0xfb6c4289, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba - DEFINE_GUIDSTRUCT("FB6C4289-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_CC); - #define PINNAME_VIDEO_CC DEFINE_GUIDNAMED(PINNAME_VIDEO_CC) - - #define STATIC_PINNAME_VIDEO_STILL \ - 0xfb6c428A, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba - DEFINE_GUIDSTRUCT("FB6C428A-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_STILL); - #define PINNAME_VIDEO_STILL DEFINE_GUIDNAMED(PINNAME_VIDEO_STILL) - - #define STATIC_PINNAME_VIDEO_TIMECODE \ - 0xfb6c428B, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba - DEFINE_GUIDSTRUCT("FB6C428B-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_TIMECODE); - #define PINNAME_VIDEO_TIMECODE DEFINE_GUIDNAMED(PINNAME_VIDEO_TIMECODE) - - #define STATIC_PINNAME_VIDEO_VIDEOPORT_VBI \ - 0xfb6c428C, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba - DEFINE_GUIDSTRUCT("FB6C428C-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_VIDEOPORT_VBI); - #define PINNAME_VIDEO_VIDEOPORT_VBI DEFINE_GUIDNAMED(PINNAME_VIDEO_VIDEOPORT_VBI) - - //=========================================================================== - // KSSTREAM_HEADER extensions for digital video - //=========================================================================== - - #define KS_VIDEO_FLAG_FRAME 0x0000L // Frame or Field (default is frame) - #define KS_VIDEO_FLAG_FIELD1 0x0001L - #define KS_VIDEO_FLAG_FIELD2 0x0002L - - #define KS_VIDEO_FLAG_I_FRAME 0x0000L // I, B, or P (default is I) - #define KS_VIDEO_FLAG_P_FRAME 0x0010L - #define KS_VIDEO_FLAG_B_FRAME 0x0020L - - typedef struct tagKS_FRAME_INFO { - ULONG ExtendedHeaderSize; // Size of this extended header - DWORD dwFrameFlags; // Field1, Field2, or Frame - LONGLONG PictureNumber; - LONGLONG DropCount; - - // The following are only set when using OverlayMixer - HANDLE hDirectDraw; // user mode DDraw handle - HANDLE hSurfaceHandle; // user mode surface handle - RECT DirectDrawRect; // portion of surface locked - // Reserved fields, never reference these - DWORD Reserved1; - DWORD Reserved2; - DWORD Reserved3; - DWORD Reserved4; - } KS_FRAME_INFO, *PKS_FRAME_INFO; - - //=========================================================================== - // KSSTREAM_HEADER extensions for VBI - //=========================================================================== - - #define KS_VBI_FLAG_FIELD1 0x0001L - #define KS_VBI_FLAG_FIELD2 0x0002L - - #define KS_VBI_FLAG_MV_PRESENT 0x0100L - #define KS_VBI_FLAG_MV_HARDWARE 0x0200L - #define KS_VBI_FLAG_MV_DETECTED 0x0400L - - #define KS_VBI_FLAG_TVTUNER_CHANGE 0x0010L // TvTunerChangeInfo is valid - #define KS_VBI_FLAG_VBIINFOHEADER_CHANGE 0x0020L // VBIInfoHeader is valid - - typedef struct tagKS_VBI_FRAME_INFO { - ULONG ExtendedHeaderSize; // Size of this extended header - DWORD dwFrameFlags; // Field1, Field2, or Frame; & etc - LONGLONG PictureNumber; // Test only? - LONGLONG DropCount; // Test only? - DWORD dwSamplingFrequency; - KS_TVTUNER_CHANGE_INFO TvTunerChangeInfo; - KS_VBIINFOHEADER VBIInfoHeader; - } KS_VBI_FRAME_INFO, *PKS_VBI_FRAME_INFO; - - - //=========================================================================== - // Analog video formats, used with: - // Analog Video Decoders - // TVTuners - // Analog Video Encoders - // - // XXX_STANDARDS_SUPPORTED returns a bitmask - //=========================================================================== - - typedef enum - { - KS_AnalogVideo_None = 0x00000000, // This is a digital sensor - KS_AnalogVideo_NTSC_M = 0x00000001, // 75 IRE Setup - KS_AnalogVideo_NTSC_M_J = 0x00000002, // Japan, 0 IRE Setup - KS_AnalogVideo_NTSC_433 = 0x00000004, - - KS_AnalogVideo_PAL_B = 0x00000010, - KS_AnalogVideo_PAL_D = 0x00000020, - KS_AnalogVideo_PAL_G = 0x00000040, - KS_AnalogVideo_PAL_H = 0x00000080, - KS_AnalogVideo_PAL_I = 0x00000100, - KS_AnalogVideo_PAL_M = 0x00000200, - KS_AnalogVideo_PAL_N = 0x00000400, - - KS_AnalogVideo_PAL_60 = 0x00000800, - - KS_AnalogVideo_SECAM_B = 0x00001000, - KS_AnalogVideo_SECAM_D = 0x00002000, - KS_AnalogVideo_SECAM_G = 0x00004000, - KS_AnalogVideo_SECAM_H = 0x00008000, - KS_AnalogVideo_SECAM_K = 0x00010000, - KS_AnalogVideo_SECAM_K1 = 0x00020000, - KS_AnalogVideo_SECAM_L = 0x00040000, - KS_AnalogVideo_SECAM_L1 = 0x00080000, - - KS_AnalogVideo_PAL_N_COMBO - = 0x00100000 - } KS_AnalogVideoStandard; - - #define KS_AnalogVideo_NTSC_Mask 0x00000007 - #define KS_AnalogVideo_PAL_Mask 0x00100FF0 - #define KS_AnalogVideo_SECAM_Mask 0x000FF000 - - //=========================================================================== - // Property set definitions - // The comments show whether a given property is: - // R : READ only - // w : WRITE only - // RW : READ / WRITE - // O : Optional (return E_UNSUPPORTED if you don't handle this) - //=========================================================================== - - #define STATIC_PROPSETID_ALLOCATOR_CONTROL\ - 0x53171960, 0x148e, 0x11d2, 0x99, 0x79, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba - DEFINE_GUIDSTRUCT("53171960-148E-11d2-9979-0000C0CC16BA", PROPSETID_ALLOCATOR_CONTROL); - #define PROPSETID_ALLOCATOR_CONTROL DEFINE_GUIDNAMED(PROPSETID_ALLOCATOR_CONTROL) - typedef enum { - KSPROPERTY_ALLOCATOR_CONTROL_HONOR_COUNT, // R O (will allocate exactly this number of buffers) - KSPROPERTY_ALLOCATOR_CONTROL_SURFACE_SIZE, // R O (return 2 DWORDs specifying surface size) - } KSPROPERTY_ALLOCATOR_CONTROL; - - - //=========================================================================== - - #define STATIC_PROPSETID_VIDCAP_VIDEOPROCAMP\ - 0xC6E13360L, 0x30AC, 0x11d0, 0xa1, 0x8c, 0x00, 0xA0, 0xC9, 0x11, 0x89, 0x56 - DEFINE_GUIDSTRUCT("C6E13360-30AC-11d0-A18C-00A0C9118956", PROPSETID_VIDCAP_VIDEOPROCAMP); - #define PROPSETID_VIDCAP_VIDEOPROCAMP DEFINE_GUIDNAMED(PROPSETID_VIDCAP_VIDEOPROCAMP) - - typedef enum { - KSPROPERTY_VIDEOPROCAMP_BRIGHTNESS, // RW O - KSPROPERTY_VIDEOPROCAMP_CONTRAST, // RW O - KSPROPERTY_VIDEOPROCAMP_HUE, // RW O - KSPROPERTY_VIDEOPROCAMP_SATURATION, // RW O - KSPROPERTY_VIDEOPROCAMP_SHARPNESS, // RW O - KSPROPERTY_VIDEOPROCAMP_GAMMA, // RW O - KSPROPERTY_VIDEOPROCAMP_COLORENABLE, // RW O - KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE, // RW O - KSPROPERTY_VIDEOPROCAMP_BACKLIGHT_COMPENSATION,// RW O - KSPROPERTY_VIDEOPROCAMP_GAIN, // RW O - } KSPROPERTY_VIDCAP_VIDEOPROCAMP; - - typedef struct { - KSPROPERTY Property; - LONG Value; // Value to set or get - ULONG Flags; // KSPROPERTY_VIDEOPROCAMP_FLAGS_* - ULONG Capabilities; // KSPROPERTY_VIDEOPROCAMP_FLAGS_* - } KSPROPERTY_VIDEOPROCAMP_S, *PKSPROPERTY_VIDEOPROCAMP_S; - - #define KSPROPERTY_VIDEOPROCAMP_FLAGS_AUTO 0X0001L - #define KSPROPERTY_VIDEOPROCAMP_FLAGS_MANUAL 0X0002L - - //=========================================================================== - - #define STATIC_PROPSETID_TUNER\ - 0x6a2e0605L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 - DEFINE_GUIDSTRUCT("6a2e0605-28e4-11d0-a18c-00a0c9118956", PROPSETID_TUNER); - #define PROPSETID_TUNER DEFINE_GUIDNAMED(PROPSETID_TUNER) - - typedef enum { - KSPROPERTY_TUNER_CAPS, // R -overall device capabilities - KSPROPERTY_TUNER_MODE_CAPS, // R -capabilities in this mode - KSPROPERTY_TUNER_MODE, // RW -set a mode (TV, FM, AM, DSS) - KSPROPERTY_TUNER_STANDARD, // R -get TV standard (only if TV mode) - KSPROPERTY_TUNER_FREQUENCY, // RW -set/get frequency - KSPROPERTY_TUNER_INPUT, // RW -select an input - KSPROPERTY_TUNER_STATUS, // R -tuning status - KSPROPERTY_TUNER_IF_MEDIUM // R O-Medium for IF or Transport Pin - } KSPROPERTY_TUNER; - - typedef enum { - KSPROPERTY_TUNER_MODE_TV = 0X0001, - KSPROPERTY_TUNER_MODE_FM_RADIO = 0X0002, - KSPROPERTY_TUNER_MODE_AM_RADIO = 0X0004, - KSPROPERTY_TUNER_MODE_DSS = 0X0008, - KSPROPERTY_TUNER_MODE_ATSC = 0X0010, // also used for DVB-T, DVB-C - } KSPROPERTY_TUNER_MODES; - - // Describes how the device tunes. Only one of these flags may be set - // in KSPROPERTY_TUNER_MODE_CAPS_S.Strategy - - // Describe how the driver should attempt to tune: - // EXACT: just go to the frequency specified (no fine tuning) - // FINE: (slow) do an exhaustive search for the best signal - // COARSE: (fast) use larger frequency jumps to just determine if any signal - - typedef enum { - KS_TUNER_TUNING_EXACT = 1, // No fine tuning - KS_TUNER_TUNING_FINE, // Fine grained search - KS_TUNER_TUNING_COARSE, // Coarse search - }KS_TUNER_TUNING_FLAGS; - - typedef enum { - KS_TUNER_STRATEGY_PLL = 0X01, // Tune by PLL offset - KS_TUNER_STRATEGY_SIGNAL_STRENGTH = 0X02, // Tune by signal strength - KS_TUNER_STRATEGY_DRIVER_TUNES = 0X04, // Driver does fine tuning - }KS_TUNER_STRATEGY; - - typedef struct { - KSPROPERTY Property; - ULONG ModesSupported; // KS_PROPERTY_TUNER_MODES_* - KSPIN_MEDIUM VideoMedium; // GUID_NULL (no pin), or GUID - KSPIN_MEDIUM TVAudioMedium; // GUID_NULL (no pin), or GUID - KSPIN_MEDIUM RadioAudioMedium; // GUID_NULL (no pin), or GUID - } KSPROPERTY_TUNER_CAPS_S, *PKSPROPERTY_TUNER_CAPS_S; - - typedef struct { - KSPROPERTY Property; - KSPIN_MEDIUM IFMedium; // GUID_NULL (no pin), or GUID - } KSPROPERTY_TUNER_IF_MEDIUM_S, *PKSPROPERTY_TUNER_IF_MEDIUM_S; - - typedef struct { - KSPROPERTY Property; - ULONG Mode; // IN: KSPROPERTY_TUNER_MODE - ULONG StandardsSupported; // KS_AnalogVideo_* (if TV or DSS) - ULONG MinFrequency; // Hz - ULONG MaxFrequency; // Hz - ULONG TuningGranularity; // Hz - ULONG NumberOfInputs; // count of inputs - ULONG SettlingTime; // milliSeconds - ULONG Strategy; // KS_TUNER_STRATEGY - } KSPROPERTY_TUNER_MODE_CAPS_S, *PKSPROPERTY_TUNER_MODE_CAPS_S; - - typedef struct { - KSPROPERTY Property; - ULONG Mode; // IN: KSPROPERTY_TUNER_MODE - } KSPROPERTY_TUNER_MODE_S, *PKSPROPERTY_TUNER_MODE_S; - - typedef struct { - KSPROPERTY Property; - ULONG Frequency; // Hz - ULONG LastFrequency; // Hz (last known good) - ULONG TuningFlags; // KS_TUNER_TUNING_FLAGS - ULONG VideoSubChannel; // DSS - ULONG AudioSubChannel; // DSS - ULONG Channel; // VBI decoders - ULONG Country; // VBI decoders - } KSPROPERTY_TUNER_FREQUENCY_S, *PKSPROPERTY_TUNER_FREQUENCY_S; - - typedef struct { - KSPROPERTY Property; - ULONG Standard; // KS_AnalogVideo_* - } KSPROPERTY_TUNER_STANDARD_S, *PKSPROPERTY_TUNER_STANDARD_S; - - typedef struct { - KSPROPERTY Property; - ULONG InputIndex; // 0 to (n-1) inputs - } KSPROPERTY_TUNER_INPUT_S, *PKSPROPERTY_TUNER_INPUT_S; - - typedef struct { - KSPROPERTY Property; - ULONG CurrentFrequency; // Hz - ULONG PLLOffset; // if Strategy.KS_TUNER_STRATEGY_PLL - ULONG SignalStrength; // if Stretegy.KS_TUNER_STRATEGY_SIGNAL_STRENGTH - ULONG Busy; // TRUE if in the process of tuning - } KSPROPERTY_TUNER_STATUS_S, *PKSPROPERTY_TUNER_STATUS_S; - - #define STATIC_EVENTSETID_TUNER\ - 0x6a2e0606L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 - DEFINE_GUIDSTRUCT("6a2e0606-28e4-11d0-a18c-00a0c9118956", EVENTSETID_TUNER); - #define EVENTSETID_TUNER DEFINE_GUIDNAMED(EVENTSETID_TUNER) - - typedef enum { - KSEVENT_TUNER_CHANGED - } KSEVENT_TUNER; - - - //=========================================================================== - - #define STATIC_PROPSETID_VIDCAP_VIDEOENCODER\ - 0x6a2e0610L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 - DEFINE_GUIDSTRUCT("6a2e0610-28e4-11d0-a18c-00a0c9118956", PROPSETID_VIDCAP_VIDEOENCODER); - #define PROPSETID_VIDCAP_VIDEOENCODER DEFINE_GUIDNAMED(PROPSETID_VIDCAP_VIDEOENCODER) - - typedef enum { - KSPROPERTY_VIDEOENCODER_CAPS, // R - KSPROPERTY_VIDEOENCODER_STANDARD, // RW - KSPROPERTY_VIDEOENCODER_COPYPROTECTION, // RW O - KSPROPERTY_VIDEOENCODER_CC_ENABLE, // RW O - } KSPROPERTY_VIDCAP_VIDEOENCODER; - - typedef struct { - KSPROPERTY Property; - LONG Value; // value to get or set - ULONG Flags; // - ULONG Capabilities; // - } KSPROPERTY_VIDEOENCODER_S, *PKSPROPERTY_VIDEOENCODER_S; - - //=========================================================================== - - #define STATIC_PROPSETID_VIDCAP_VIDEODECODER\ - 0xC6E13350L, 0x30AC, 0x11d0, 0xA1, 0x8C, 0x00, 0xA0, 0xC9, 0x11, 0x89, 0x56 - DEFINE_GUIDSTRUCT("C6E13350-30AC-11d0-A18C-00A0C9118956", PROPSETID_VIDCAP_VIDEODECODER); - #define PROPSETID_VIDCAP_VIDEODECODER DEFINE_GUIDNAMED(PROPSETID_VIDCAP_VIDEODECODER) - - typedef enum { - KSPROPERTY_VIDEODECODER_CAPS, // R - KSPROPERTY_VIDEODECODER_STANDARD, // RW - KSPROPERTY_VIDEODECODER_STATUS, // R - KSPROPERTY_VIDEODECODER_OUTPUT_ENABLE, // Rw O - KSPROPERTY_VIDEODECODER_VCR_TIMING, // RW O - } KSPROPERTY_VIDCAP_VIDEODECODER; - - typedef enum { - KS_VIDEODECODER_FLAGS_CAN_DISABLE_OUTPUT = 0X0001, // VP Output can tri-stae - KS_VIDEODECODER_FLAGS_CAN_USE_VCR_LOCKING = 0X0002, // VCR PLL timings - KS_VIDEODECODER_FLAGS_CAN_INDICATE_LOCKED = 0X0004, // Can indicate valid signal - }KS_VIDEODECODER_FLAGS; - - typedef struct { - KSPROPERTY Property; - ULONG StandardsSupported; // KS_AnalogVideo_* - ULONG Capabilities; // KS_VIDEODECODER_FLAGS_* - ULONG SettlingTime; // milliseconds - ULONG HSyncPerVSync; // Number of HSync Pulses per VSync - } KSPROPERTY_VIDEODECODER_CAPS_S, *PKSPROPERTY_VIDEODECODER_CAPS_S; - - typedef struct { - KSPROPERTY Property; - ULONG NumberOfLines; // 525 or 625 lines detected - ULONG SignalLocked; // TRUE if signal is locked - } KSPROPERTY_VIDEODECODER_STATUS_S, *PKSPROPERTY_VIDEODECODER_STATUS_S; - - typedef struct { - KSPROPERTY Property; - ULONG Value; // Get or set a value - } KSPROPERTY_VIDEODECODER_S, *PKSPROPERTY_VIDEODECODER_S; - - #define STATIC_EVENTSETID_VIDEODECODER\ - 0x6a2e0621L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 - DEFINE_GUIDSTRUCT("6a2e0621-28e4-11d0-a18c-00a0c9118956", EVENTSETID_VIDEODECODER); - #define EVENTSETID_VIDEODECODER DEFINE_GUIDNAMED(EVENTSETID_VIDEODECODER) - - typedef enum { - KSEVENT_VIDEODECODER_CHANGED - } KSEVENT_VIDEODECODER; - - //=========================================================================== - - #define STATIC_PROPSETID_VIDCAP_CAMERACONTROL\ - 0xC6E13370L, 0x30AC, 0x11d0, 0xa1, 0x8C, 0x00, 0xA0, 0xC9, 0x11, 0x89, 0x56 - DEFINE_GUIDSTRUCT("C6E13370-30AC-11d0-A18C-00A0C9118956", PROPSETID_VIDCAP_CAMERACONTROL); - #define PROPSETID_VIDCAP_CAMERACONTROL DEFINE_GUIDNAMED(PROPSETID_VIDCAP_CAMERACONTROL) - - typedef enum { - KSPROPERTY_CAMERACONTROL_PAN, // RW O - KSPROPERTY_CAMERACONTROL_TILT, // RW O - KSPROPERTY_CAMERACONTROL_ROLL, // RW O - KSPROPERTY_CAMERACONTROL_ZOOM, // RW O - KSPROPERTY_CAMERACONTROL_EXPOSURE, // RW O - KSPROPERTY_CAMERACONTROL_IRIS, // RW O - KSPROPERTY_CAMERACONTROL_FOCUS, // RW O - } KSPROPERTY_VIDCAP_CAMERACONTROL; - - typedef struct { - KSPROPERTY Property; - LONG Value; // value to get or set - ULONG Flags; // KSPROPERTY_CAMERACONTROL_FLAGS_* - ULONG Capabilities; // KSPROPERTY_CAMERACONTROL_FLAGS_* - } KSPROPERTY_CAMERACONTROL_S, *PKSPROPERTY_CAMERACONTROL_S; - - #define KSPROPERTY_CAMERACONTROL_FLAGS_AUTO 0X0001L - #define KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL 0X0002L - - #define KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE 0X0000L - #define KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE 0X0010L - - - //=========================================================================== - - #define STATIC_PROPSETID_VIDCAP_CROSSBAR\ - 0x6a2e0640L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 - DEFINE_GUIDSTRUCT("6a2e0640-28e4-11d0-a18c-00a0c9118956", PROPSETID_VIDCAP_CROSSBAR); - #define PROPSETID_VIDCAP_CROSSBAR DEFINE_GUIDNAMED(PROPSETID_VIDCAP_CROSSBAR) - - typedef enum { - KSPROPERTY_CROSSBAR_CAPS, // R - KSPROPERTY_CROSSBAR_PININFO, // R - KSPROPERTY_CROSSBAR_CAN_ROUTE, // R - KSPROPERTY_CROSSBAR_ROUTE, // RW - } KSPROPERTY_VIDCAP_CROSSBAR; - - typedef struct { - KSPROPERTY Property; - ULONG NumberOfInputs; // the number of audio and video input pins - ULONG NumberOfOutputs; // the number of audio and video output pins - } KSPROPERTY_CROSSBAR_CAPS_S, *PKSPROPERTY_CROSSBAR_CAPS_S; - - typedef struct { - KSPROPERTY Property; - KSPIN_DATAFLOW Direction; // KSPIN_DATAFLOW_IN or KSPIN_DATAFLOW_OUT? - ULONG Index; // Which pin to return data for? - ULONG PinType; // KS_PhysConn_Video_* or KS_PhysConn_Audio_* - ULONG RelatedPinIndex; // For video pins, this is the related audio pin - KSPIN_MEDIUM Medium; // Identifies the hardware connection - } KSPROPERTY_CROSSBAR_PININFO_S, *PKSPROPERTY_CROSSBAR_PININFO_S; - - typedef struct { - KSPROPERTY Property; - ULONG IndexInputPin; // Zero based index of the input pin - ULONG IndexOutputPin; // Zero based index of the output pin - ULONG CanRoute; // returns non-zero on CAN_ROUTE if routing is possible - } KSPROPERTY_CROSSBAR_ROUTE_S, *PKSPROPERTY_CROSSBAR_ROUTE_S; - - #define STATIC_EVENTSETID_CROSSBAR\ - 0x6a2e0641L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 - DEFINE_GUIDSTRUCT("6a2e0641-28e4-11d0-a18c-00a0c9118956", EVENTSETID_CROSSBAR); - #define EVENTSETID_CROSSBAR DEFINE_GUIDNAMED(EVENTSETID_CROSSBAR) - - typedef enum { - KSEVENT_CROSSBAR_CHANGED - } KSEVENT_CROSSBAR; - - // The following IDs should match the AM equivalents - typedef enum { - KS_PhysConn_Video_Tuner = 1, - KS_PhysConn_Video_Composite, - KS_PhysConn_Video_SVideo, - KS_PhysConn_Video_RGB, - KS_PhysConn_Video_YRYBY, - KS_PhysConn_Video_SerialDigital, - KS_PhysConn_Video_ParallelDigital, - KS_PhysConn_Video_SCSI, - KS_PhysConn_Video_AUX, - KS_PhysConn_Video_1394, - KS_PhysConn_Video_USB, - KS_PhysConn_Video_VideoDecoder, - KS_PhysConn_Video_VideoEncoder, - KS_PhysConn_Video_SCART, - - KS_PhysConn_Audio_Tuner = 4096, - KS_PhysConn_Audio_Line, - KS_PhysConn_Audio_Mic, - KS_PhysConn_Audio_AESDigital, - KS_PhysConn_Audio_SPDIFDigital, - KS_PhysConn_Audio_SCSI, - KS_PhysConn_Audio_AUX, - KS_PhysConn_Audio_1394, - KS_PhysConn_Audio_USB, - KS_PhysConn_Audio_AudioDecoder, - } KS_PhysicalConnectorType; - - - //=========================================================================== - - #define STATIC_PROPSETID_VIDCAP_TVAUDIO\ - 0x6a2e0650L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 - DEFINE_GUIDSTRUCT("6a2e0650-28e4-11d0-a18c-00a0c9118956", PROPSETID_VIDCAP_TVAUDIO); - #define PROPSETID_VIDCAP_TVAUDIO DEFINE_GUIDNAMED(PROPSETID_VIDCAP_TVAUDIO) - - typedef enum { - KSPROPERTY_TVAUDIO_CAPS, // R - KSPROPERTY_TVAUDIO_MODE, // RW - KSPROPERTY_TVAUDIO_CURRENTLY_AVAILABLE_MODES // R - } KSPROPERTY_VIDCAP_TVAUDIO; - - #define KS_TVAUDIO_MODE_MONO 0x0001 // Mono - #define KS_TVAUDIO_MODE_STEREO 0x0002 // Stereo - #define KS_TVAUDIO_MODE_LANG_A 0x0010 // Primary language - #define KS_TVAUDIO_MODE_LANG_B 0x0020 // 2nd avail language - #define KS_TVAUDIO_MODE_LANG_C 0x0040 // 3rd avail language - - typedef struct { - KSPROPERTY Property; - ULONG Capabilities; // Bitmask of KS_TVAUDIO_MODE_* - KSPIN_MEDIUM InputMedium; - KSPIN_MEDIUM OutputMedium; - } KSPROPERTY_TVAUDIO_CAPS_S, *PKSPROPERTY_TVAUDIO_CAPS_S; - - typedef struct { - KSPROPERTY Property; - ULONG Mode; // KS_TVAUDIO_MODE_* - } KSPROPERTY_TVAUDIO_S, *PKSPROPERTY_TVAUDIO_S; - - - #define STATIC_KSEVENTSETID_VIDCAP_TVAUDIO\ - 0x6a2e0651L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 - DEFINE_GUIDSTRUCT("6a2e0651-28e4-11d0-a18c-00a0c9118956", KSEVENTSETID_VIDCAP_TVAUDIO); - #define KSEVENTSETID_VIDCAP_TVAUDIO DEFINE_GUIDNAMED(KSEVENTSETID_VIDCAP_TVAUDIO) - - typedef enum { - KSEVENT_TVAUDIO_CHANGED, - } KSEVENT_TVAUDIO; - - //=========================================================================== - #define STATIC_PROPSETID_VIDCAP_VIDEOCOMPRESSION\ - 0xC6E13343L, 0x30AC, 0x11d0, 0xA1, 0x8C, 0x00, 0xA0, 0xC9, 0x11, 0x89, 0x56 - DEFINE_GUIDSTRUCT("C6E13343-30AC-11d0-A18C-00A0C9118956", PROPSETID_VIDCAP_VIDEOCOMPRESSION); - #define PROPSETID_VIDCAP_VIDEOCOMPRESSION DEFINE_GUIDNAMED(PROPSETID_VIDCAP_VIDEOCOMPRESSION) - - typedef enum { - KSPROPERTY_VIDEOCOMPRESSION_GETINFO, // R - KSPROPERTY_VIDEOCOMPRESSION_KEYFRAME_RATE, // RW - KSPROPERTY_VIDEOCOMPRESSION_PFRAMES_PER_KEYFRAME, // RW - KSPROPERTY_VIDEOCOMPRESSION_QUALITY, // RW - KSPROPERTY_VIDEOCOMPRESSION_OVERRIDE_KEYFRAME, // W - KSPROPERTY_VIDEOCOMPRESSION_OVERRIDE_FRAME_SIZE, // W - KSPROPERTY_VIDEOCOMPRESSION_WINDOWSIZE, // RW - } KSPROPERTY_VIDCAP_VIDEOCOMPRESSION; - - typedef enum { - KS_CompressionCaps_CanQuality = 1, - KS_CompressionCaps_CanCrunch = 2, - KS_CompressionCaps_CanKeyFrame = 4, - KS_CompressionCaps_CanBFrame = 8, - KS_CompressionCaps_CanWindow = 0x10, - } KS_CompressionCaps; - - typedef struct { - KSPROPERTY Property; - // Note, no VersionString! - // Note, no DescriptionString! - ULONG StreamIndex; // zero based index of stream - LONG DefaultKeyFrameRate; // Key frame rate - LONG DefaultPFrameRate; // Predeicted frames per Key frame - LONG DefaultQuality; // 0 to 10000 - LONG NumberOfQualitySettings; // How many discreet quality settings? - LONG Capabilities; // KS_CompressionCaps_* - } KSPROPERTY_VIDEOCOMPRESSION_GETINFO_S, *PKSPROPERTY_VIDEOCOMPRESSION_GETINFO_S; - - typedef struct { - KSPROPERTY Property; - ULONG StreamIndex; // zero based index of stream - LONG Value; // value to get or set - } KSPROPERTY_VIDEOCOMPRESSION_S, *PKSPROPERTY_VIDEOCOMPRESSION_S; - - //=========================================================================== - // MEDIASUBTYPE_Overlay - #define STATIC_KSDATAFORMAT_SUBTYPE_OVERLAY\ - 0xe436eb7fL, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 - DEFINE_GUIDSTRUCT("e436eb7f-524f-11ce-9f53-0020af0ba770", KSDATAFORMAT_SUBTYPE_OVERLAY); - #define KSDATAFORMAT_SUBTYPE_OVERLAY DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_OVERLAY) - - #define STATIC_KSPROPSETID_OverlayUpdate\ - 0x490EA5CFL, 0x7681, 0x11D1, 0xA2, 0x1C, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - DEFINE_GUIDSTRUCT("490EA5CF-7681-11D1-A21C-00A0C9223196", KSPROPSETID_OverlayUpdate); - #define KSPROPSETID_OverlayUpdate DEFINE_GUIDNAMED(KSPROPSETID_OverlayUpdate) - - typedef enum { - KSPROPERTY_OVERLAYUPDATE_INTERESTS, - KSPROPERTY_OVERLAYUPDATE_CLIPLIST = 0x1, - KSPROPERTY_OVERLAYUPDATE_PALETTE = 0x2, - KSPROPERTY_OVERLAYUPDATE_COLORKEY = 0x4, - KSPROPERTY_OVERLAYUPDATE_VIDEOPOSITION = 0x8, - KSPROPERTY_OVERLAYUPDATE_DISPLAYCHANGE = 0x10, - KSPROPERTY_OVERLAYUPDATE_COLORREF = 0x10000000 - } KSPROPERTY_OVERLAYUPDATE; - - typedef struct { - ULONG PelsWidth; - ULONG PelsHeight; - ULONG BitsPerPel; - WCHAR DeviceID[1]; - } KSDISPLAYCHANGE, *PKSDISPLAYCHANGE; - - #define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_INTERESTS(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_OVERLAYUPDATE_INTERESTS,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(ULONG),\ - NULL, NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_PALETTE(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_OVERLAYUPDATE_PALETTE,\ - NULL,\ - sizeof(KSPROPERTY),\ - 0,\ - (Handler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_COLORKEY(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_OVERLAYUPDATE_COLORKEY,\ - NULL,\ - sizeof(KSPROPERTY),\ - sizeof(COLORKEY),\ - (Handler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_CLIPLIST(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_OVERLAYUPDATE_CLIPLIST,\ - NULL,\ - sizeof(KSPROPERTY),\ - 2 * sizeof(RECT) + sizeof(RGNDATAHEADER),\ - (Handler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_VIDEOPOSITION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_OVERLAYUPDATE_VIDEOPOSITION,\ - NULL,\ - sizeof(KSPROPERTY),\ - 2 * sizeof(RECT),\ - (Handler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_DISPLAYCHANGE(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_OVERLAYUPDATE_DISPLAYCHANGE,\ - NULL,\ - sizeof(KSPROPERTY),\ - sizeof(KSDISPLAYCHANGE),\ - (Handler),\ - NULL, 0, NULL, NULL, 0) - - #define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_COLORREF(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_OVERLAYUPDATE_COLORREF,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(COLORREF),\ - NULL,\ - NULL, 0, NULL, NULL, 0) - - //=========================================================================== - #define STATIC_PROPSETID_VIDCAP_VIDEOCONTROL\ - 0x6a2e0670L, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 - DEFINE_GUIDSTRUCT("6a2e0670-28e4-11d0-a18c-00a0c9118956", PROPSETID_VIDCAP_VIDEOCONTROL); - #define PROPSETID_VIDCAP_VIDEOCONTROL DEFINE_GUIDNAMED(PROPSETID_VIDCAP_VIDEOCONTROL) - - typedef enum { - KSPROPERTY_VIDEOCONTROL_CAPS, // R - KSPROPERTY_VIDEOCONTROL_ACTUAL_FRAME_RATE, // R O - KSPROPERTY_VIDEOCONTROL_FRAME_RATES, // R O - KSPROPERTY_VIDEOCONTROL_MODE, // RWO - } KSPROPERTY_VIDCAP_VIDEOCONTROL; - - typedef enum { - KS_VideoControlFlag_FlipHorizontal = 0x0001, - KS_VideoControlFlag_FlipVertical = 0x0002, - KS_Obsolete_VideoControlFlag_ExternalTriggerEnable = 0x0010, // ***WARNING *** Flag msimatch with DSHOW. - KS_Obsolete_VideoControlFlag_Trigger = 0x0020, // ***WARNING *** Flag msimatch with DSHOW. - KS_VideoControlFlag_ExternalTriggerEnable = 0x0004, - KS_VideoControlFlag_Trigger = 0x0008, - } KS_VideoControlFlags; - - typedef struct { - KSPROPERTY Property; - ULONG StreamIndex; - ULONG VideoControlCaps; // KS_VideoControlFlags_* - } KSPROPERTY_VIDEOCONTROL_CAPS_S, *PKSPROPERTY_VIDEOCONTROL_CAPS_S; - - typedef struct { - KSPROPERTY Property; - ULONG StreamIndex; - LONG Mode; // KS_VideoControlFlags_* - } KSPROPERTY_VIDEOCONTROL_MODE_S, *PKSPROPERTY_VIDEOCONTROL_MODE_S; - - typedef struct { - KSPROPERTY Property; - ULONG StreamIndex; // Index of stream - ULONG RangeIndex; // Index of range - SIZE Dimensions; // Size of image - LONGLONG CurrentActualFrameRate; // Only correct if pin is open - LONGLONG CurrentMaxAvailableFrameRate; // Max Rate temporarily limited on USB or 1394? - } KSPROPERTY_VIDEOCONTROL_ACTUAL_FRAME_RATE_S, *PKSPROPERTY_VIDEOCONTROL_ACTUAL_FRAME_RATE_S; - - // KSPROPERTY_VIDEOCONTROL_FRAME_RATES returns a list of available frame rates in 100 nS units - typedef struct { - KSPROPERTY Property; - ULONG StreamIndex; // Index of stream - ULONG RangeIndex; // Index of range - SIZE Dimensions; // Size of image - } KSPROPERTY_VIDEOCONTROL_FRAME_RATES_S, *PKSPROPERTY_VIDEOCONTROL_FRAME_RATES_S; - - //=========================================================================== - #define STATIC_PROPSETID_VIDCAP_DROPPEDFRAMES\ - 0xC6E13344L, 0x30AC, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 - DEFINE_GUIDSTRUCT("C6E13344-30AC-11d0-A18C-00A0C9118956", PROPSETID_VIDCAP_DROPPEDFRAMES); - #define PROPSETID_VIDCAP_DROPPEDFRAMES DEFINE_GUIDNAMED(PROPSETID_VIDCAP_DROPPEDFRAMES) - - typedef enum { - KSPROPERTY_DROPPEDFRAMES_CURRENT // R - } KSPROPERTY_VIDCAP_DROPPEDFRAMES; - - typedef struct { - KSPROPERTY Property; - LONGLONG PictureNumber; // Current Picture Number - LONGLONG DropCount; // Count of frames dropped - ULONG AverageFrameSize; // Average size of frames captured - } KSPROPERTY_DROPPEDFRAMES_CURRENT_S, *PKSPROPERTY_DROPPEDFRAMES_CURRENT_S; - - //=========================================================================== - // VPE - - #define STATIC_KSPROPSETID_VPConfig\ - 0xbc29a660L, 0x30e3, 0x11d0, 0x9e, 0x69, 0x00, 0xc0, 0x4f, 0xd7, 0xc1, 0x5b - DEFINE_GUIDSTRUCT("bc29a660-30e3-11d0-9e69-00c04fd7c15b", KSPROPSETID_VPConfig); - #define KSPROPSETID_VPConfig DEFINE_GUIDNAMED(KSPROPSETID_VPConfig) - - #define STATIC_KSPROPSETID_VPVBIConfig\ - 0xec529b00L, 0x1a1f, 0x11d1, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a - DEFINE_GUIDSTRUCT("ec529b00-1a1f-11d1-bad9-00609744111a", KSPROPSETID_VPVBIConfig); - #define KSPROPSETID_VPVBIConfig DEFINE_GUIDNAMED(KSPROPSETID_VPVBIConfig) - - // Both of the above property sets use the same list of properties below - - typedef enum { - KSPROPERTY_VPCONFIG_NUMCONNECTINFO, - KSPROPERTY_VPCONFIG_GETCONNECTINFO, - KSPROPERTY_VPCONFIG_SETCONNECTINFO, - KSPROPERTY_VPCONFIG_VPDATAINFO, - KSPROPERTY_VPCONFIG_MAXPIXELRATE, - KSPROPERTY_VPCONFIG_INFORMVPINPUT, - KSPROPERTY_VPCONFIG_NUMVIDEOFORMAT, - KSPROPERTY_VPCONFIG_GETVIDEOFORMAT, - KSPROPERTY_VPCONFIG_SETVIDEOFORMAT, - KSPROPERTY_VPCONFIG_INVERTPOLARITY, - KSPROPERTY_VPCONFIG_DECIMATIONCAPABILITY, // E_NOTIMPL for VBI - KSPROPERTY_VPCONFIG_SCALEFACTOR, // E_NOTIMPL for VBI - KSPROPERTY_VPCONFIG_DDRAWHANDLE, - KSPROPERTY_VPCONFIG_VIDEOPORTID, - KSPROPERTY_VPCONFIG_DDRAWSURFACEHANDLE, - KSPROPERTY_VPCONFIG_SURFACEPARAMS - } KSPROPERTY_VPCONFIG; - - //========================= - // IBasicAudio - // - #define STATIC_CLSID_KsIBasicAudioInterfaceHandler\ - 0xb9f8ac3e, 0x0f71, 0x11d2, 0xb7, 0x2c, 0x00, 0xc0, 0x4f, 0xb6, 0xbd, 0x3d - DEFINE_GUIDSTRUCT("b9f8ac3e-0f71-11d2-b72c-00c04fb6bd3d", CLSID_KsIBasicAudioInterfaceHandler); - #define CLSID_KsIBasicAudioInterfaceHandler DEFINE_GUIDNAMED(CLSID_KsIBasicAudioInterfaceHandler) - - - #if defined(__IVPType__) - - typedef struct { - AMVPSIZE Size; - DWORD MaxPixelsPerSecond; - DWORD Reserved; - } KSVPMAXPIXELRATE, *PKSVPMAXPIXELRATE; - - typedef struct { - KSPROPERTY Property; - AMVPSIZE Size; - } KSVPSIZE_PROP, *PKSVPSIZE_PROP; - - typedef struct { - DWORD dwPitch; - DWORD dwXOrigin; - DWORD dwYOrigin; - } KSVPSURFACEPARAMS, *PKSVPSURFACEPARAMS; - - #else // !defined(__IVPType__) - - #if !defined(__DDRAW_INCLUDED__) - - //========================================================================== - // The following definitions must be in sync with DDraw.h in DirectX SDK - //========================================================================== - - /* - * The FourCC code is valid. - */ - #define DDPF_FOURCC 0x00000004l - - - typedef struct _DDPIXELFORMAT - { - DWORD dwSize; // size of structure - DWORD dwFlags; // pixel format flags - DWORD dwFourCC; // (FOURCC code) - union - { - DWORD dwRGBBitCount; // how many bits per pixel (BD_1,2,4,8,16,24,32) - DWORD dwYUVBitCount; // how many bits per pixel (BD_4,8,16,24,32) - DWORD dwZBufferBitDepth; // how many bits for z buffers (BD_8,16,24,32) - DWORD dwAlphaBitDepth; // how many bits for alpha channels (BD_1,2,4,8) - }; - union - { - DWORD dwRBitMask; // mask for red bit - DWORD dwYBitMask; // mask for Y bits - }; - union - { - DWORD dwGBitMask; // mask for green bits - DWORD dwUBitMask; // mask for U bits - }; - union - { - DWORD dwBBitMask; // mask for blue bits - DWORD dwVBitMask; // mask for V bits - }; - union - { - DWORD dwRGBAlphaBitMask; // mask for alpha channel - DWORD dwYUVAlphaBitMask; // mask for alpha channel - DWORD dwRGBZBitMask; // mask for Z channel - DWORD dwYUVZBitMask; // mask for Z channel - }; - } DDPIXELFORMAT, * LPDDPIXELFORMAT; - - #endif // !defined(__DDRAW_INCLUDED__) - - //========================================================================== - // End of DDraw.h header info - //========================================================================== - - //========================================================================== - // The following definitions must be in sync with DVP.h in DirectX SDK - //========================================================================== - - #if !defined(__DVP_INCLUDED__) - - typedef struct _DDVIDEOPORTCONNECT { - DWORD dwSize; // size of the DDVIDEOPORTCONNECT structure - DWORD dwPortWidth; // Width of the video port - GUID guidTypeID; // Description of video port connection - DWORD dwFlags; // Connection flags - DWORD dwReserved1; // Reserved, set to zero. - } DDVIDEOPORTCONNECT, * LPDDVIDEOPORTCONNECT; - - #define DDVPTYPE_E_HREFH_VREFH \ - 0x54F39980L,0xDA60,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8 - - #define DDVPTYPE_E_HREFL_VREFL \ - 0xE09C77E0L,0xDA60,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8 - - #endif // !defined(__DVP_INCLUDED__) - - //========================================================================== - // End of DVP.h header info - //========================================================================== - - - //========================================================================== - // The following definitions must be in sync with VPType.h in AM 2.0 SDK - //========================================================================== - - // pixel aspect ratios corresponding to a 720x480 NTSC image or a 720x576 image - typedef enum // AMPixAspectRatio - { - KS_PixAspectRatio_NTSC4x3, - KS_PixAspectRatio_NTSC16x9, - KS_PixAspectRatio_PAL4x3, - KS_PixAspectRatio_PAL16x9, - } KS_AMPixAspectRatio ; - - typedef enum // AMVP_SELECTFORMATBY - { - KS_AMVP_DO_NOT_CARE, - KS_AMVP_BEST_BANDWIDTH, - KS_AMVP_INPUT_SAME_AS_OUTPUT - } KS_AMVP_SELECTFORMATBY; - - typedef enum // AMVP_MODE - { - KS_AMVP_MODE_WEAVE, - KS_AMVP_MODE_BOBINTERLEAVED, - KS_AMVP_MODE_BOBNONINTERLEAVED, - KS_AMVP_MODE_SKIPEVEN, - KS_AMVP_MODE_SKIPODD - } KS_AMVP_MODE ; - - typedef struct tagKS_AMVPDIMINFO // AMVPDIMINFO - { - DWORD dwFieldWidth ; // [out] field width - DWORD dwFieldHeight ; // [out] field height - DWORD dwVBIWidth ; // [out] VBI data width - DWORD dwVBIHeight ; // [out] VBI data height - RECT rcValidRegion ; // [out] valid rect for data cropping - } KS_AMVPDIMINFO, *PKS_AMVPDIMINFO ; - - typedef struct tagKS_AMVPDATAINFO // AMVPDATAINFO - { - DWORD dwSize; // Size of the struct - DWORD dwMicrosecondsPerField; // Time taken by each field - KS_AMVPDIMINFO amvpDimInfo; // Dimensional Information - DWORD dwPictAspectRatioX; // Pict aspect ratio in X dimn - DWORD dwPictAspectRatioY; // Pict aspect ratio in Y dimn - BOOL bEnableDoubleClock; // Videoport should enable double clocking - BOOL bEnableVACT; // Videoport should use an external VACT signal - BOOL bDataIsInterlaced; // Indicates that the signal is interlaced - LONG lHalfLinesOdd; // number of halflines in the odd field - BOOL bFieldPolarityInverted; // Device inverts the polarity by default - DWORD dwNumLinesInVREF; // Number of lines of data in VREF - LONG lHalfLinesEven; // number of halflines in the even field - DWORD dwReserved1; // Reserved for future use - } KS_AMVPDATAINFO, *PKS_AMVPDATAINFO; - - typedef struct tagKS_AMVPSIZE // AMVPSIZE - { - DWORD dwWidth ; // [in] width in pixels - DWORD dwHeight ; // [in] height in pixels - } KS_AMVPSIZE, *PKS_AMVPSIZE ; - - //========================================================================== - // End of VPType.h header info - //========================================================================== - - typedef struct { - KS_AMVPSIZE Size; - DWORD MaxPixelsPerSecond; - DWORD Reserved; - } KSVPMAXPIXELRATE, *PKSVPMAXPIXELRATE; - - typedef struct { - KSPROPERTY Property; - KS_AMVPSIZE Size; - } KSVPSIZE_PROP, *PKSVPSIZE_PROP; - - typedef struct { - DWORD dwPitch; - DWORD dwXOrigin; - DWORD dwYOrigin; - } KSVPSURFACEPARAMS, *PKSVPSURFACEPARAMS; - - #endif // !defined(__IVPType__) - - // - // IVPNotify event notification - // - #define STATIC_KSEVENTSETID_VPNotify\ - 0x20c5598eL, 0xd3c8, 0x11d0, 0x8d, 0xfc, 0x00, 0xc0, 0x4f, 0xd7, 0xc0, 0x8b - DEFINE_GUIDSTRUCT("20c5598e-d3c8-11d0-8dfc-00c04fd7c08b", KSEVENTSETID_VPNotify); - #define KSEVENTSETID_VPNotify DEFINE_GUIDNAMED(KSEVENTSETID_VPNotify) - - typedef enum { - KSEVENT_VPNOTIFY_FORMATCHANGE, - } KSEVENT_VPNOTIFY; - - // - // VIDCAPTOSTI event notification - // - #define STATIC_KSEVENTSETID_VIDCAPTOSTI\ - 0xdb47de20, 0xf628, 0x11d1, 0xba, 0x41, 0x0, 0xa0, 0xc9, 0xd, 0x2b, 0x5 - DEFINE_GUIDSTRUCT("DB47DE20-F628-11d1-BA41-00A0C90D2B05", KSEVENTSETID_VIDCAPTOSTI); - #define KSEVENTSETID_VIDCAPNotify DEFINE_GUIDNAMED(KSEVENTSETID_VIDCAPTOSTI) - - typedef enum { - KSEVENT_VIDCAPTOSTI_EXT_TRIGGER, - } KSEVENT_VIDCAPTOSTI; - - - // - // IVPVBINotify event notification - // - #define STATIC_KSEVENTSETID_VPVBINotify\ - 0xec529b01L, 0x1a1f, 0x11d1, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a - DEFINE_GUIDSTRUCT("ec529b01-1a1f-11d1-bad9-00609744111a", KSEVENTSETID_VPVBINotify); - #define KSEVENTSETID_VPVBINotify DEFINE_GUIDNAMED(KSEVENTSETID_VPVBINotify) - - typedef enum { - KSEVENT_VPVBINOTIFY_FORMATCHANGE, - } KSEVENT_VPVBINOTIFY; - - - // - // closed caption information - // - - #define STATIC_KSDATAFORMAT_TYPE_AUXLine21Data \ - 0x670aea80L, 0x3a82, 0x11d0, 0xb7, 0x9b, 0x00, 0xaa, 0x00, 0x37, 0x67, 0xa7 - DEFINE_GUIDSTRUCT("670aea80-3a82-11d0-b79b-00aa003767a7", KSDATAFORMAT_TYPE_AUXLine21Data); - #define KSDATAFORMAT_TYPE_AUXLine21Data DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_AUXLine21Data) - - #define STATIC_KSDATAFORMAT_SUBTYPE_Line21_BytePair \ - 0x6e8d4a22L, 0x310c, 0x11d0, 0xb7, 0x9a, 0x00, 0xaa, 0x00, 0x37, 0x67, 0xa7 - DEFINE_GUIDSTRUCT("6e8d4a22-310c-11d0-b79a-00aa003767a7", KSDATAFORMAT_SUBTYPE_Line21_BytePair); - #define KSDATAFORMAT_SUBTYPE_Line21_BytePair DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_Line21_BytePair) - - #define STATIC_KSDATAFORMAT_SUBTYPE_Line21_GOPPacket \ - 0x6e8d4a23L, 0x310c, 0x11d0, 0xb7, 0x9a, 0x00, 0xaa, 0x00, 0x37, 0x67, 0xa7 - DEFINE_GUIDSTRUCT("6e8d4a23-310c-11d0-b79a-00aa003767a7", KSDATAFORMAT_SUBTYPE_Line21_GOPPacket); - #define KSDATAFORMAT_SUBTYPE_Line21_GOPPacket DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_Line21_GOPPacket) - - typedef struct _KSGOP_USERDATA { - ULONG sc; - ULONG reserved1; - BYTE cFields; - CHAR l21Data[3]; - } KSGOP_USERDATA, *PKSGOP_USERDATA; - - // - // DVD encrypted PACK format type definition - // - - #define STATIC_KSDATAFORMAT_TYPE_DVD_ENCRYPTED_PACK\ - 0xed0b916a, 0x044d, 0x11d1, 0xaa, 0x78, 0x00, 0xc0, 0x4f, 0xc3, 0x1d, 0x60 - DEFINE_GUIDSTRUCT("ed0b916a-044d-11d1-aa78-00c04fc31d60", KSDATAFORMAT_TYPE_DVD_ENCRYPTED_PACK); - #define KSDATAFORMAT_TYPE_DVD_ENCRYPTED_PACK DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_DVD_ENCRYPTED_PACK) - - #define KS_AM_UseNewCSSKey 0x1 - - - // ----------------------------------------------------------------------- - // KS_AM_KSPROPSETID_TSRateChange property set definitions for time stamp - // rate changes. - // ----------------------------------------------------------------------- - - - #define STATIC_KSPROPSETID_TSRateChange\ - 0xa503c5c0, 0x1d1d, 0x11d1, 0xad, 0x80, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0 - - DEFINE_GUIDSTRUCT("A503C5C0-1D1D-11D1-AD80-444553540000", KSPROPSETID_TSRateChange); - #define KSPROPSETID_TSRateChange DEFINE_GUIDNAMED(KSPROPSETID_TSRateChange) - typedef enum { - KS_AM_RATE_SimpleRateChange=1, // rw, use KS_AM_SimpleRateChange - KS_AM_RATE_ExactRateChange=2, // rw, use KS_AM_ExactRateChange - KS_AM_RATE_MaxFullDataRate=3, // r, use KS_AM_MaxFullDataRate - KS_AM_RATE_Step=4 // w, use KS_AM_Step - } KS_AM_PROPERTY_TS_RATE_CHANGE; - - typedef struct { - // this is the simplest mechanism to set a time stamp rate change on - // a filter (simplest for the person setting the rate change, harder - // for the filter doing the rate change). - REFERENCE_TIME StartTime; //stream time at which to start this rate - LONG Rate; //new rate * 10000 (decimal) - } KS_AM_SimpleRateChange, *PKS_AM_SimpleRateChange; - - typedef struct { - REFERENCE_TIME OutputZeroTime; //input TS that maps to zero output TS - LONG Rate; //new rate * 10000 (decimal) - } KS_AM_ExactRateChange, *PKS_AM_ExactRateChange; - - typedef LONG KS_AM_MaxFullDataRate; //rate * 10000 (decimal) - - typedef DWORD KS_AM_Step; // number of frame to step - - -#endif // DirectX 8.0 content - - -#endif // !defined(_KSMEDIA_) diff --git a/import/DirectX8/include/ksproxy.h b/import/DirectX8/include/ksproxy.h deleted file mode 100644 index 48eb4f74f..000000000 --- a/import/DirectX8/include/ksproxy.h +++ /dev/null @@ -1,845 +0,0 @@ -/*++ - -Copyright (C) Microsoft Corporation, 1996 - 2001 - -Module Name: - - ksproxy.h - -Abstract: - - Interface definitions for WDM-CSA proxy filters. - ---*/ - -#ifndef __KSPROXY__ -#define __KSPROXY__ - -#ifdef __cplusplus -extern "C" { -#endif - -#undef KSDDKAPI -#ifdef _KSDDK_ -#define KSDDKAPI -#else // !_KSDDK_ -#define KSDDKAPI DECLSPEC_IMPORT -#endif // _KSDDK_ - -#define STATIC_IID_IKsObject\ - 0x423c13a2L, 0x2070, 0x11d0, 0x9e, 0xf7, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1 - -#define STATIC_IID_IKsPinEx\ - 0x7bb38260L, 0xd19c, 0x11d2, 0xb3, 0x8a, 0x00, 0xa0, 0xc9, 0x5e, 0xc2, 0x2e - -#define STATIC_IID_IKsPin\ - 0xb61178d1L, 0xa2d9, 0x11cf, 0x9e, 0x53, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1 - -#define STATIC_IID_IKsPinPipe\ - 0xe539cd90L, 0xa8b4, 0x11d1, 0x81, 0x89, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 - -#define STATIC_IID_IKsDataTypeHandler\ - 0x5ffbaa02L, 0x49a3, 0x11d0, 0x9f, 0x36, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1 - -#define STATIC_IID_IKsDataTypeCompletion\ - 0x827D1A0EL, 0x0F73, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - -#define STATIC_IID_IKsInterfaceHandler\ - 0xD3ABC7E0L, 0x9A61, 0x11D0, 0xA4, 0x0D, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - -#define STATIC_IID_IKsClockPropertySet\ - 0x5C5CBD84L, 0xE755, 0x11D0, 0xAC, 0x18, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - -#define STATIC_IID_IKsAllocator\ - 0x8da64899L, 0xc0d9, 0x11d0, 0x84, 0x13, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a - -#define STATIC_IID_IKsAllocatorEx\ - 0x091bb63aL, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 - - -#ifndef STATIC_IID_IKsPropertySet -#define STATIC_IID_IKsPropertySet\ - 0x31EFAC30L, 0x515C, 0x11d0, 0xA9, 0xAA, 0x00, 0xAA, 0x00, 0x61, 0xBE, 0x93 -#endif // STATIC_IID_IKsPropertySet - -#define STATIC_IID_IKsTopology\ - 0x28F54683L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - -#ifndef STATIC_IID_IKsControl -#define STATIC_IID_IKsControl\ - 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 -#endif // STATIC_IID_IKsControl - -#define STATIC_IID_IKsAggregateControl\ - 0x7F40EAC0L, 0x3947, 0x11D2, 0x87, 0x4E, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - -#define STATIC_CLSID_Proxy \ - 0x17CCA71BL, 0xECD7, 0x11D0, 0xB9, 0x08, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 - -#ifdef _KS_ - -#if !defined(__cplusplus) || _MSC_VER < 1100 -DEFINE_GUIDEX(IID_IKsObject); - -DEFINE_GUIDEX(IID_IKsPin); - -DEFINE_GUIDEX(IID_IKsPinEx); - -DEFINE_GUIDEX(IID_IKsPinPipe); - -DEFINE_GUIDEX(IID_IKsDataTypeHandler); - -DEFINE_GUIDEX(IID_IKsDataTypeCompletion); - -DEFINE_GUIDEX(IID_IKsInterfaceHandler); - -DEFINE_GUIDEX(IID_IKsClockPropertySet); - -DEFINE_GUIDEX(IID_IKsAllocator); - -DEFINE_GUIDEX(IID_IKsAllocatorEx); - -#define IID_IKsQualityForwarder KSCATEGORY_QUALITY -#endif // !defined(__cplusplus) || _MSC_VER < 1100 - -#define STATIC_IID_IKsQualityForwarder STATIC_KSCATEGORY_QUALITY - -typedef enum { - KsAllocatorMode_User, - KsAllocatorMode_Kernel -} KSALLOCATORMODE; - - -typedef enum { - FramingProp_Uninitialized, - FramingProp_None, - FramingProp_Old, - FramingProp_Ex -} FRAMING_PROP; - -typedef FRAMING_PROP *PFRAMING_PROP; - - -typedef enum { - Framing_Cache_Update, // request to bypass cache when read/write - Framing_Cache_ReadLast, - Framing_Cache_ReadOrig, - Framing_Cache_Write -} FRAMING_CACHE_OPS; - - -typedef struct { - LONGLONG MinTotalNominator; - LONGLONG MaxTotalNominator; - LONGLONG TotalDenominator; -} OPTIMAL_WEIGHT_TOTALS; - -// forward declaration -typedef struct IPin IPin; -typedef struct IKsPin IKsPin; -typedef struct IKsAllocator IKsAllocator; -typedef struct IKsAllocatorEx IKsAllocatorEx; - - -// -// allocators strategy is defined by graph manager -// -#define AllocatorStrategy_DontCare 0 - -// -// what to optimize -// -#define AllocatorStrategy_MinimizeNumberOfFrames 0x00000001 -#define AllocatorStrategy_MinimizeFrameSize 0x00000002 -#define AllocatorStrategy_MinimizeNumberOfAllocators 0x00000004 -#define AllocatorStrategy_MaximizeSpeed 0x00000008 - -// -// factors (flags) defining the Pipes properties -// -#define PipeFactor_None 0 -#define PipeFactor_UserModeUpstream 0x00000001 -#define PipeFactor_UserModeDownstream 0x00000002 -#define PipeFactor_MemoryTypes 0x00000004 -#define PipeFactor_Flags 0x00000008 -#define PipeFactor_PhysicalRanges 0x00000010 -#define PipeFactor_OptimalRanges 0x00000020 -#define PipeFactor_FixedCompression 0x00000040 -#define PipeFactor_UnknownCompression 0x00000080 - -#define PipeFactor_Buffers 0x00000100 -#define PipeFactor_Align 0x00000200 - -#define PipeFactor_PhysicalEnd 0x00000400 -#define PipeFactor_LogicalEnd 0x00000800 - - - -typedef enum { - PipeState_DontCare, - PipeState_RangeNotFixed, - PipeState_RangeFixed, - PipeState_CompressionUnknown, - PipeState_Finalized -} PIPE_STATE; - - -// -// pipe dimensions relative to BeginPin. -// - -typedef struct _PIPE_DIMENSIONS { - KS_COMPRESSION AllocatorPin; - KS_COMPRESSION MaxExpansionPin; - KS_COMPRESSION EndPin; -} PIPE_DIMENSIONS, *PPIPE_DIMENSIONS; - - -typedef enum { - Pipe_Allocator_None, - Pipe_Allocator_FirstPin, - Pipe_Allocator_LastPin, - Pipe_Allocator_MiddlePin -} PIPE_ALLOCATOR_PLACE; - -typedef PIPE_ALLOCATOR_PLACE *PPIPE_ALLOCATOR_PLACE; - - -typedef enum { - KS_MemoryTypeDontCare = 0, - KS_MemoryTypeKernelPaged, - KS_MemoryTypeKernelNonPaged, - KS_MemoryTypeDeviceHostMapped, - KS_MemoryTypeDeviceSpecific, - KS_MemoryTypeUser, - KS_MemoryTypeAnyHost -} KS_LogicalMemoryType; - -typedef KS_LogicalMemoryType *PKS_LogicalMemoryType; - - - -typedef struct _PIPE_TERMINATION { - ULONG Flags; - ULONG OutsideFactors; - ULONG Weigth; // outside weight - KS_FRAMING_RANGE PhysicalRange; - KS_FRAMING_RANGE_WEIGHTED OptimalRange; - KS_COMPRESSION Compression; // relative to the connected pin on a neighboring filter. -} PIPE_TERMINATION; - - -// -// extended allocator properties -// -typedef struct _ALLOCATOR_PROPERTIES_EX - { - long cBuffers; - long cbBuffer; - long cbAlign; - long cbPrefix; -// new part - GUID MemoryType; - GUID BusType; // one of the buses this pipe is using - PIPE_STATE State; - PIPE_TERMINATION Input; - PIPE_TERMINATION Output; - ULONG Strategy; - ULONG Flags; - ULONG Weight; - KS_LogicalMemoryType LogicalMemoryType; - PIPE_ALLOCATOR_PLACE AllocatorPlace; - PIPE_DIMENSIONS Dimensions; - KS_FRAMING_RANGE PhysicalRange; // on allocator pin - IKsAllocatorEx* PrevSegment; // doubly-linked list of KS allocators - ULONG CountNextSegments; // possible multiple dependent pipes - IKsAllocatorEx** NextSegments; - ULONG InsideFactors; // existing factors (different from "don't care") - ULONG NumberPins; -} ALLOCATOR_PROPERTIES_EX; - -typedef ALLOCATOR_PROPERTIES_EX *PALLOCATOR_PROPERTIES_EX; - - -#ifdef __STREAMS__ - -struct DECLSPEC_UUID("5C5CBD84-E755-11D0-AC18-00A0C9223196") IKsClockPropertySet; -#undef INTERFACE -#define INTERFACE IKsClockPropertySet -DECLARE_INTERFACE_(IKsClockPropertySet, IUnknown) -{ - STDMETHOD(KsGetTime)( - THIS_ - LONGLONG* Time - ) PURE; - STDMETHOD(KsSetTime)( - THIS_ - LONGLONG Time - ) PURE; - STDMETHOD(KsGetPhysicalTime)( - THIS_ - LONGLONG* Time - ) PURE; - STDMETHOD(KsSetPhysicalTime)( - THIS_ - LONGLONG Time - ) PURE; - STDMETHOD(KsGetCorrelatedTime)( - THIS_ - KSCORRELATED_TIME* CorrelatedTime - ) PURE; - STDMETHOD(KsSetCorrelatedTime)( - THIS_ - KSCORRELATED_TIME* CorrelatedTime - ) PURE; - STDMETHOD(KsGetCorrelatedPhysicalTime)( - THIS_ - KSCORRELATED_TIME* CorrelatedTime - ) PURE; - STDMETHOD(KsSetCorrelatedPhysicalTime)( - THIS_ - KSCORRELATED_TIME* CorrelatedTime - ) PURE; - STDMETHOD(KsGetResolution)( - THIS_ - KSRESOLUTION* Resolution - ) PURE; - STDMETHOD(KsGetState)( - THIS_ - KSSTATE* State - ) PURE; -}; - - -interface DECLSPEC_UUID("8da64899-c0d9-11d0-8413-0000f822fe8a") IKsAllocator; -#undef INTERFACE -#define INTERFACE IKsAllocator -DECLARE_INTERFACE_(IKsAllocator, IUnknown) -{ - STDMETHOD_(HANDLE, KsGetAllocatorHandle)( - THIS - ) PURE; - STDMETHOD_(KSALLOCATORMODE, KsGetAllocatorMode)( - THIS - ) PURE; - STDMETHOD(KsGetAllocatorStatus)( - THIS_ - PKSSTREAMALLOCATOR_STATUS AllocatorStatus - ) PURE; - STDMETHOD_(VOID, KsSetAllocatorMode)( - THIS_ - KSALLOCATORMODE Mode - ) PURE; -}; - -interface DECLSPEC_UUID("091bb63a-603f-11d1-b067-00a0c9062802") IKsAllocatorEx; -#undef INTERFACE -#define INTERFACE IKsAllocatorEx -DECLARE_INTERFACE_(IKsAllocatorEx, IKsAllocator) -{ - STDMETHOD_(PALLOCATOR_PROPERTIES_EX, KsGetProperties)( - THIS - ) PURE; - STDMETHOD_(VOID, KsSetProperties)( - THIS_ - PALLOCATOR_PROPERTIES_EX - ) PURE; - STDMETHOD_(VOID, KsSetAllocatorHandle)( - THIS_ - HANDLE AllocatorHandle - ) PURE; - STDMETHOD_(HANDLE, KsCreateAllocatorAndGetHandle)( - THIS_ - IKsPin* KsPin - ) PURE; -}; - -typedef enum { - KsPeekOperation_PeekOnly, - KsPeekOperation_AddRef -} KSPEEKOPERATION; - -typedef struct _KSSTREAM_SEGMENT *PKSSTREAM_SEGMENT; - -interface DECLSPEC_UUID("b61178d1-a2d9-11cf-9e53-00aa00a216a1") IKsPin; - -#undef INTERFACE -#define INTERFACE IKsPin -DECLARE_INTERFACE_(IKsPin, IUnknown) -{ - STDMETHOD(KsQueryMediums)( - THIS_ - PKSMULTIPLE_ITEM* MediumList - ) PURE; - STDMETHOD(KsQueryInterfaces)( - THIS_ - PKSMULTIPLE_ITEM* InterfaceList - ) PURE; - STDMETHOD(KsCreateSinkPinHandle)( - THIS_ - KSPIN_INTERFACE& Interface, - KSPIN_MEDIUM& Medium - ) PURE; - STDMETHOD(KsGetCurrentCommunication)( - THIS_ - KSPIN_COMMUNICATION *Communication, - KSPIN_INTERFACE *Interface, - KSPIN_MEDIUM *Medium - ) PURE; - STDMETHOD(KsPropagateAcquire)( - THIS - ) PURE; - STDMETHOD(KsDeliver)( - THIS_ - IMediaSample* Sample, - ULONG Flags - ) PURE; - STDMETHOD(KsMediaSamplesCompleted)( - THIS_ - PKSSTREAM_SEGMENT StreamSegment - ) PURE; - STDMETHOD_(IMemAllocator *, KsPeekAllocator)( - THIS_ - KSPEEKOPERATION Operation - ) PURE; - STDMETHOD(KsReceiveAllocator)( - THIS_ - IMemAllocator *MemAllocator - ) PURE; - STDMETHOD(KsRenegotiateAllocator)( - THIS - ) PURE; - STDMETHOD_(LONG, KsIncrementPendingIoCount)( - THIS - ) PURE; - STDMETHOD_(LONG, KsDecrementPendingIoCount)( - THIS - ) PURE; - STDMETHOD(KsQualityNotify)( - THIS_ - ULONG Proportion, - REFERENCE_TIME TimeDelta - ) PURE; -}; - -interface DECLSPEC_UUID("7bb38260-d19c-11d2-b38a-00a0c95ec22e") IKsPinEx; -#undef INTERFACE -#define INTERFACE IKsPinEx -DECLARE_INTERFACE_(IKsPinEx, IKsPin) -{ - STDMETHOD_(VOID, KsNotifyError)( - THIS_ - IMediaSample* Sample, - HRESULT hr - ) PURE; -}; - -interface DECLSPEC_UUID("e539cd90-a8b4-11d1-8189-00a0c9062802") IKsPinPipe; -#undef INTERFACE -#define INTERFACE IKsPinPipe -DECLARE_INTERFACE_(IKsPinPipe, IUnknown) -{ - STDMETHOD(KsGetPinFramingCache)( - THIS_ - PKSALLOCATOR_FRAMING_EX *FramingEx, - PFRAMING_PROP FramingProp, - FRAMING_CACHE_OPS Option - ) PURE; - STDMETHOD(KsSetPinFramingCache)( - THIS_ - PKSALLOCATOR_FRAMING_EX FramingEx, - PFRAMING_PROP FramingProp, - FRAMING_CACHE_OPS Option - ) PURE; - STDMETHOD_(IPin*, KsGetConnectedPin)( - THIS - ) PURE; - STDMETHOD_(IKsAllocatorEx*, KsGetPipe)( - THIS_ - KSPEEKOPERATION Operation - ) PURE; - STDMETHOD(KsSetPipe)( - THIS_ - IKsAllocatorEx *KsAllocator - ) PURE; - STDMETHOD_(ULONG, KsGetPipeAllocatorFlag)( - THIS - ) PURE; - STDMETHOD(KsSetPipeAllocatorFlag)( - THIS_ - ULONG Flag - ) PURE; - STDMETHOD_(GUID, KsGetPinBusCache)( - THIS - ) PURE; - STDMETHOD(KsSetPinBusCache)( - THIS_ - GUID Bus - ) PURE; -// -// very useful methods for tracing. -// - STDMETHOD_(PWCHAR, KsGetPinName)( - THIS - ) PURE; - STDMETHOD_(PWCHAR, KsGetFilterName)( - THIS - ) PURE; -}; - - -interface DECLSPEC_UUID("CD5EBE6B-8B6E-11D1-8AE0-00A0C9223196") IKsPinFactory; -#undef INTERFACE -#define INTERFACE IKsPinFactory -DECLARE_INTERFACE_(IKsPinFactory, IUnknown) -{ - STDMETHOD(KsPinFactory)( - THIS_ - ULONG* PinFactory - ) PURE; -}; - -typedef enum { - KsIoOperation_Write, - KsIoOperation_Read -} KSIOOPERATION; - -interface DECLSPEC_UUID("5ffbaa02-49a3-11d0-9f36-00aa00a216a1") IKsDataTypeHandler; -#undef INTERFACE -#define INTERFACE IKsDataTypeHandler -DECLARE_INTERFACE_(IKsDataTypeHandler, IUnknown) -{ - STDMETHOD(KsCompleteIoOperation)( - THIS_ - IMediaSample *Sample, - PVOID StreamHeader, - KSIOOPERATION IoOperation, - BOOL Cancelled - ) PURE; - STDMETHOD(KsIsMediaTypeInRanges)( - THIS_ - PVOID DataRanges - ) PURE; - STDMETHOD(KsPrepareIoOperation)( - THIS_ - IMediaSample *Sample, - PVOID StreamHeader, - KSIOOPERATION IoOperation - ) PURE; - STDMETHOD(KsQueryExtendedSize)( - THIS_ - ULONG* ExtendedSize - ) PURE; - STDMETHOD(KsSetMediaType)( - THIS_ - const AM_MEDIA_TYPE* AmMediaType - ) PURE; -}; - -interface DECLSPEC_UUID("827D1A0E-0F73-11D2-B27A-00A0C9223196") IKsDataTypeCompletion; -#undef INTERFACE -#define INTERFACE IKsDataTypeCompletion -DECLARE_INTERFACE_(IKsDataTypeCompletion, IUnknown) -{ - STDMETHOD(KsCompleteMediaType)( - THIS_ - HANDLE FilterHandle, - ULONG PinFactoryId, - AM_MEDIA_TYPE* AmMediaType - ) PURE; -}; - -interface DECLSPEC_UUID("D3ABC7E0-9A61-11d0-A40D-00A0C9223196") IKsInterfaceHandler; -#undef INTERFACE -#define INTERFACE IKsInterfaceHandler -DECLARE_INTERFACE_(IKsInterfaceHandler, IUnknown) -{ - STDMETHOD(KsSetPin)( - THIS_ - IKsPin *KsPin - ) PURE; - STDMETHOD(KsProcessMediaSamples)( - THIS_ - IKsDataTypeHandler *KsDataTypeHandler, - IMediaSample** SampleList, - PLONG SampleCount, - KSIOOPERATION IoOperation, - PKSSTREAM_SEGMENT *StreamSegment - ) PURE; - STDMETHOD(KsCompleteIo)( - THIS_ - PKSSTREAM_SEGMENT StreamSegment - ) PURE; -}; - - -// -// This structure definition is the common header required by the proxy to -// dispatch the stream segment to the interface handler. Interface handlers -// will create extended structures to include other information such as -// media samples, extended header size and so on. -// - -typedef struct _KSSTREAM_SEGMENT { - IKsInterfaceHandler *KsInterfaceHandler; - IKsDataTypeHandler *KsDataTypeHandler; - KSIOOPERATION IoOperation; - HANDLE CompletionEvent; - -} KSSTREAM_SEGMENT; - -interface DECLSPEC_UUID("423c13a2-2070-11d0-9ef7-00aa00a216a1") IKsObject; -#undef INTERFACE -#define INTERFACE IKsObject -DECLARE_INTERFACE_(IKsObject, IUnknown) -{ - STDMETHOD_(HANDLE, KsGetObjectHandle)( - THIS - ) PURE; -}; - -interface DECLSPEC_UUID("97ebaacb-95bd-11d0-a3ea-00a0c9223196") IKsQualityForwarder; -#undef INTERFACE -#define INTERFACE IKsQualityForwarder -DECLARE_INTERFACE_(IKsQualityForwarder, IKsObject) -{ - STDMETHOD_(VOID, KsFlushClient)( - THIS_ - IKsPin* Pin - ) PURE; -}; - -KSDDKAPI -HRESULT -WINAPI -KsResolveRequiredAttributes( - PKSDATARANGE DataRange, - PKSMULTIPLE_ITEM Attributes OPTIONAL - ); - -KSDDKAPI -HRESULT -WINAPI -KsOpenDefaultDevice( - REFGUID Category, - ACCESS_MASK Access, - PHANDLE DeviceHandle - ); -KSDDKAPI -HRESULT -WINAPI -KsSynchronousDeviceControl( - HANDLE Handle, - ULONG IoControl, - PVOID InBuffer, - ULONG InLength, - PVOID OutBuffer, - ULONG OutLength, - PULONG BytesReturned - ); -KSDDKAPI -HRESULT -WINAPI -KsGetMultiplePinFactoryItems( - HANDLE FilterHandle, - ULONG PinFactoryId, - ULONG PropertyId, - PVOID* Items - ); -KSDDKAPI -HRESULT -WINAPI -KsGetMediaTypeCount( - HANDLE FilterHandle, - ULONG PinFactoryId, - ULONG* MediaTypeCount - ); -KSDDKAPI -HRESULT -WINAPI -KsGetMediaType( - int Position, - AM_MEDIA_TYPE* AmMediaType, - HANDLE FilterHandle, - ULONG PinFactoryId - ); - -#endif // __STREAMS__ - -#ifndef _IKsPropertySet_ -#if !defined(__cplusplus) || _MSC_VER < 1100 -DEFINE_GUIDEX(IID_IKsPropertySet); -#endif // !defined(__cplusplus) || _MSC_VER < 1100 -#endif // _IKsPropertySet_ - -#ifndef _IKsControl_ -#if !defined(__cplusplus) || _MSC_VER < 1100 -DEFINE_GUIDEX(IID_IKsControl); -#endif // !defined(__cplusplus) || _MSC_VER < 1100 -#endif // _IKsControl_ - -#if !defined(__cplusplus) || _MSC_VER < 1100 -DEFINE_GUIDEX(IID_IKsAggregateControl); -#endif // !defined(__cplusplus) || _MSC_VER < 1100 - -#ifndef _IKsTopology_ -#if !defined(__cplusplus) || _MSC_VER < 1100 -DEFINE_GUIDEX(IID_IKsTopology); -#endif // !defined(__cplusplus) || _MSC_VER < 1100 -#endif // _IKsTopology_ - -DEFINE_GUIDSTRUCT("17CCA71B-ECD7-11D0-B908-00A0C9223196", CLSID_Proxy); -#define CLSID_Proxy DEFINE_GUIDNAMED(CLSID_Proxy) - -#else // !_KS_ - -#ifndef _IKsPropertySet_ -#if !defined(__cplusplus) || _MSC_VER < 1100 -DEFINE_GUID(IID_IKsPropertySet, STATIC_IID_IKsPropertySet); -#endif // !defined(__cplusplus) || _MSC_VER < 1100 -#endif // _IKsPropertySet_ - -#if !defined(__cplusplus) || _MSC_VER < 1100 -DEFINE_GUID(CLSID_Proxy, STATIC_CLSID_Proxy); -#else // defined(__cplusplus) && _MSC_VER >= 1100 -DECLSPEC_UUID("17CCA71B-ECD7-11D0-B908-00A0C9223196") CLSID_Proxy; -#endif // defined(__cplusplus) && _MSC_VER >= 1100 - -#endif // !_KS_ - -#ifndef _IKsPropertySet_ -#define _IKsPropertySet_ - -#define KSPROPERTY_SUPPORT_GET 1 -#define KSPROPERTY_SUPPORT_SET 2 - -#ifdef DECLARE_INTERFACE_ - -interface DECLSPEC_UUID("31EFAC30-515C-11d0-A9AA-00aa0061be93") IKsPropertySet; -#undef INTERFACE -#define INTERFACE IKsPropertySet -DECLARE_INTERFACE_(IKsPropertySet, IUnknown) -{ - STDMETHOD(Set)( - THIS_ - IN REFGUID PropSet, - IN ULONG Id, - IN LPVOID InstanceData, - IN ULONG InstanceLength, - IN LPVOID PropertyData, - IN ULONG DataLength - ) PURE; - - STDMETHOD(Get)( - THIS_ - IN REFGUID PropSet, - IN ULONG Id, - IN LPVOID InstanceData, - IN ULONG InstanceLength, - OUT LPVOID PropertyData, - IN ULONG DataLength, - OUT ULONG* BytesReturned - ) PURE; - - STDMETHOD(QuerySupported)( - THIS_ - IN REFGUID PropSet, - IN ULONG Id, - OUT ULONG* TypeSupport - ) PURE; -}; - -#endif // DECLARE_INTERFACE_ - -#endif // _IKsPropertySet_ - -#ifndef _IKsControl_ -#define _IKsControl_ - -#ifdef DECLARE_INTERFACE_ - -interface DECLSPEC_UUID("28F54685-06FD-11D2-B27A-00A0C9223196") IKsControl; -#undef INTERFACE -#define INTERFACE IKsControl -DECLARE_INTERFACE_(IKsControl, IUnknown) -{ - STDMETHOD(KsProperty)( - THIS_ - IN PKSPROPERTY Property, - IN ULONG PropertyLength, - IN OUT LPVOID PropertyData, - IN ULONG DataLength, - OUT ULONG* BytesReturned - ) PURE; - STDMETHOD(KsMethod)( - THIS_ - IN PKSMETHOD Method, - IN ULONG MethodLength, - IN OUT LPVOID MethodData, - IN ULONG DataLength, - OUT ULONG* BytesReturned - ) PURE; - STDMETHOD(KsEvent)( - THIS_ - IN PKSEVENT Event OPTIONAL, - IN ULONG EventLength, - IN OUT LPVOID EventData, - IN ULONG DataLength, - OUT ULONG* BytesReturned - ) PURE; -}; - -#endif // DECLARE_INTERFACE_ - -#endif // _IKsControl_ - - -#ifdef DECLARE_INTERFACE_ - -interface DECLSPEC_UUID("7F40EAC0-3947-11D2-874E-00A0C9223196") IKsAggregateControl; -#undef INTERFACE -#define INTERFACE IKsAggregateControl -DECLARE_INTERFACE_(IKsAggregateControl, IUnknown) -{ - STDMETHOD(KsAddAggregate)( - THIS_ - IN REFGUID AggregateClass - ) PURE; - STDMETHOD(KsRemoveAggregate)( - THIS_ - IN REFGUID AggregateClass - ) PURE; -}; - -#endif // DECLARE_INTERFACE_ - -#ifndef _IKsTopology_ -#define _IKsTopology_ - -#ifdef DECLARE_INTERFACE_ - -interface DECLSPEC_UUID("28F54683-06FD-11D2-B27A-00A0C9223196") IKsTopology; -#undef INTERFACE -#define INTERFACE IKsTopology -DECLARE_INTERFACE_(IKsTopology, IUnknown) -{ - STDMETHOD(CreateNodeInstance)( - THIS_ - IN ULONG NodeId, - IN ULONG Flags, - IN ACCESS_MASK DesiredAccess, - IN IUnknown* UnkOuter OPTIONAL, - IN REFGUID InterfaceId, - OUT LPVOID* Interface - ) PURE; -}; - -#endif // DECLARE_INTERFACE_ - -#endif // _IKsTopology_ - -#ifdef __cplusplus -} -#endif // __cplusplus - -#endif // __KSPROXY__ diff --git a/import/DirectX8/include/ksuuids.h b/import/DirectX8/include/ksuuids.h deleted file mode 100644 index 1d06ddd88..000000000 --- a/import/DirectX8/include/ksuuids.h +++ /dev/null @@ -1,228 +0,0 @@ -//------------------------------------------------------------------------------ -// File: ksuuids.h -// -// Desc: Contains the GUIDs for the MediaType type, subtype fields and format -// types for DVD/MPEG2 media types. -// -// Copyright (c) 1992 - 2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -// -// --- MPEG 2 definitions --- -// - -// 36523B13-8EE5-11d1-8CA3-0060B057664A -OUR_GUID_ENTRY(MEDIATYPE_MPEG2_PACK, -0x36523B13, 0x8EE5, 0x11d1, 0x8C, 0xA3, 0x00, 0x60, 0xB0, 0x57, 0x66, 0x4A) - -// e06d8020-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(MEDIATYPE_MPEG2_PES, -0xe06d8020, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea) - - -#if 0 -DEFINE_GUID(MEDIATYPE_CONTROL, -0xe06d8021, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea); -#endif // #if 0 - - -// e06d8026-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_VIDEO, -0xe06d8026, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea) - -// use MPEG2VIDEOINFO (defined below) with FORMAT_MPEG2_VIDEO -// e06d80e3-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(FORMAT_MPEG2_VIDEO, -0xe06d80e3, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea) - -// F72A76A0-EB0A-11d0-ACE4-0000C0CC16BA (FORMAT_VideoInfo2) -OUR_GUID_ENTRY(FORMAT_VIDEOINFO2, -0xf72a76A0L, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba) - -// MPEG2 Other subtypes -// e06d8022-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_PROGRAM, -0xe06d8022, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea) - -// e06d8023-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_TRANSPORT, -0xe06d8023, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea) - -// 138AA9A4-1EE2-4c5b-988E-19ABFDBC8A11 -OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_TRANSPORT_STRIDE, -0x138aa9a4, 0x1ee2, 0x4c5b, 0x98, 0x8e, 0x19, 0xab, 0xfd, 0xbc, 0x8a, 0x11) - -// e06d802b-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_AUDIO, -0xe06d802b, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea) - -// e06d802c-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(MEDIASUBTYPE_DOLBY_AC3, -0xe06d802c, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea) - -// e06d802d-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_SUBPICTURE, -0xe06d802d, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea) - -// e06d8032-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_LPCM_AUDIO, -0xe06d8032, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea) - -// e06d8033-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(MEDIASUBTYPE_DTS, -0xe06d8033, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea) - -// e06d8034-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(MEDIASUBTYPE_SDDS, -0xe06d8034, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea) - -// DVD-related mediatypes -// ED0B916A-044D-11d1-AA78-00C04FC31D60 -OUR_GUID_ENTRY(MEDIATYPE_DVD_ENCRYPTED_PACK, -0xed0b916a, 0x044d, 0x11d1, 0xaa, 0x78, 0x00, 0xc0, 0x04f, 0xc3, 0x1d, 0x60) - -// e06d802e-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(MEDIATYPE_DVD_NAVIGATION, -0xe06d802e, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea) - -// e06d802f-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_NAVIGATION_PCI, -0xe06d802f, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea) - -// e06d8030-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_NAVIGATION_DSI, -0xe06d8030, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea) - -// e06d8031-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_NAVIGATION_PROVIDER, -0xe06d8031, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea) - -// -// DVD - MPEG2/AC3-related Formats -// -// e06d80e3-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(FORMAT_MPEG2Video, -0xe06d80e3, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea) - -// e06d80e4-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(FORMAT_DolbyAC3, -0xe06d80e4, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea) - -// e06d80e5-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(FORMAT_MPEG2Audio, -0xe06d80e5, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea) - -// e06d80e6-db46-11cf-b4d1-00805f6cbbea -OUR_GUID_ENTRY(FORMAT_DVD_LPCMAudio, -0xe06d80e6, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea) - - -// -// KS Property Set Id (to communicate with the WDM Proxy filter) -- from -// ksmedia.h of WDM DDK. -// - -// BFABE720-6E1F-11D0-BCF2-444553540000 -OUR_GUID_ENTRY(AM_KSPROPSETID_AC3, -0xBFABE720, 0x6E1F, 0x11D0, 0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00) - -// ac390460-43af-11d0-bd6a-003505c103a9 -OUR_GUID_ENTRY(AM_KSPROPSETID_DvdSubPic, -0xac390460, 0x43af, 0x11d0, 0xbd, 0x6a, 0x00, 0x35, 0x05, 0xc1, 0x03, 0xa9) - -// 0E8A0A40L-6AEF-11D0-9ED0-00A024CA19B3 -OUR_GUID_ENTRY(AM_KSPROPSETID_CopyProt, -0x0E8A0A40, 0x6AEF, 0x11D0, 0x9E, 0xD0, 0x00, 0xA0, 0x24, 0xCA, 0x19, 0xB3) - -// A503C5C0-1D1D-11d1-AD80-444553540000 -OUR_GUID_ENTRY(AM_KSPROPSETID_TSRateChange, -0xa503c5c0, 0x1d1d, 0x11d1, 0xad, 0x80, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0) - -// 3577EB09-9582-477f-B29C-B0C452A4FF9A -OUR_GUID_ENTRY(AM_KSPROPSETID_DVD_RateChange, -0x3577eb09, 0x9582, 0x477f, 0xb2, 0x9c, 0xb0, 0xc4, 0x52, 0xa4, 0xff, 0x9a) - -// ae4720ae-aa71-42d8-b82a-fffdf58b76fd -OUR_GUID_ENTRY(AM_KSPROPSETID_DvdKaraoke, -0xae4720ae, 0xaa71, 0x42d8, 0xb8, 0x2a, 0xff, 0xfd, 0xf5, 0x8b, 0x76, 0xfd) - -// c830acbd-ab07-492f-8852-45b6987c2979 -OUR_GUID_ENTRY(AM_KSPROPSETID_FrameStep, -0xc830acbd, 0xab07, 0x492f, 0x88, 0x52, 0x45, 0xb6, 0x98, 0x7c, 0x29, 0x79) - -// -// KS categories from ks.h and ksmedia.h -// -// - -// 65E8773D-8F56-11D0-A3B9-00A0C9223196 -OUR_GUID_ENTRY(AM_KSCATEGORY_CAPTURE, -0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96) - -// 65E8773E-8F56-11D0-A3B9-00A0C9223196 -OUR_GUID_ENTRY(AM_KSCATEGORY_RENDER, -0x65E8773EL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96) - -// 1E84C900-7E70-11D0-A5D6-28DB04C10000 -OUR_GUID_ENTRY(AM_KSCATEGORY_DATACOMPRESSOR, -0x1E84C900L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00) - -// 6994AD04-93EF-11D0-A3CC-00A0C9223196 -OUR_GUID_ENTRY(AM_KSCATEGORY_AUDIO, -0x6994AD04L, 0x93EF, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96) - -// 6994AD05-93EF-11D0-A3CC-00A0C9223196 -OUR_GUID_ENTRY(AM_KSCATEGORY_VIDEO, -0x6994AD05L, 0x93EF, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96) - -// a799a800-a46d-11d0-a18c-00a02401dcd4 -OUR_GUID_ENTRY(AM_KSCATEGORY_TVTUNER, -0xa799a800L, 0xa46d, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0x24, 0x01, 0xdc, 0xd4) - -// a799a801-a46d-11d0-a18c-00a02401dcd4 -OUR_GUID_ENTRY(AM_KSCATEGORY_CROSSBAR, -0xa799a801L, 0xa46d, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0x24, 0x01, 0xdc, 0xd4) - -// a799a802-a46d-11d0-a18c-00a02401dcd4 -OUR_GUID_ENTRY(AM_KSCATEGORY_TVAUDIO, -0xa799a802L, 0xa46d, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0x24, 0x01, 0xdc, 0xd4) - - -// 07dad660L-22f1-11d1-a9f4-00c04fbbde8f -OUR_GUID_ENTRY(AM_KSCATEGORY_VBICODEC, -0x07dad660L, 0x22f1, 0x11d1, 0xa9, 0xf4, 0x00, 0xc0, 0x4f, 0xbb, 0xde, 0x8f) - - -// 0A4252A0L-7E70-11D0-A5D6-28DB04C10000 -OUR_GUID_ENTRY(AM_KSCATEGORY_SPLITTER, -0x0A4252A0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00) - - -// -// guids needed to support IKsPin interface -// - -// d3abc7e0l-9a61-11d0-a40d00a0c9223196 -OUR_GUID_ENTRY(IID_IKsInterfaceHandler, -0xD3ABC7E0L, 0x9A61, 0x11D0, 0xA4, 0x0D, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96) - -// 5ffbaa02l-49a3-11d0-9f3600aa00a216a1 -OUR_GUID_ENTRY(IID_IKsDataTypeHandler, -0x5FFBAA02L, 0x49A3, 0x11D0, 0x9F, 0x36, 0x00, 0xAA, 0x00, 0xA2, 0x16, 0xA1) - -// b61178d1-a2d9-11cf-9e53-00aa00a216a1 -OUR_GUID_ENTRY(IID_IKsPin, -0xb61178d1L, 0xa2d9, 0x11cf, 0x9e, 0x53, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1) - -// 28F54685-06FD-11D2-B27A-00A0C9223196 -OUR_GUID_ENTRY(IID_IKsControl, -0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96) - -// CD5EBE6B-8B6E-11D1-8AE0-00A0C9223196 -OUR_GUID_ENTRY(IID_IKsPinFactory, -0xCD5EBE6BL, 0x8B6E, 0x11D1, 0x8A, 0xE0, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96) - -// 1A8766A0-62CE-11CF-A5D6-28DB04C10000 -OUR_GUID_ENTRY(AM_INTERFACESETID_Standard, -0x1A8766A0L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00) diff --git a/import/DirectX8/include/mediaerr.h b/import/DirectX8/include/mediaerr.h deleted file mode 100644 index 5203d554f..000000000 --- a/import/DirectX8/include/mediaerr.h +++ /dev/null @@ -1,20 +0,0 @@ -//------------------------------------------------------------------------------ -// File: MediaErr.h -// -// Desc: Shell error codes -// -// Copyright (c) 1999 - 2000, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef _MEDIAERR_H_ -#define _MEDIAERR_H_ - -#define DMO_E_INVALIDSTREAMINDEX 0x80040201 -#define DMO_E_INVALIDTYPE 0x80040202 -#define DMO_E_TYPE_NOT_SET 0x80040203 -#define DMO_E_NOTACCEPTING 0x80040204 -#define DMO_E_TYPE_NOT_ACCEPTED 0x80040205 -#define DMO_E_NO_MORE_ITEMS 0x80040206 - -#endif _MEDIAERR_H_ diff --git a/import/DirectX8/include/mediaobj.h b/import/DirectX8/include/mediaobj.h deleted file mode 100644 index 047e3a45f..000000000 --- a/import/DirectX8/include/mediaobj.h +++ /dev/null @@ -1,1574 +0,0 @@ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 6.00.0347 */ -/* Compiler settings for mediaobj.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __mediaobj_h__ -#define __mediaobj_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __IMediaBuffer_FWD_DEFINED__ -#define __IMediaBuffer_FWD_DEFINED__ -typedef interface IMediaBuffer IMediaBuffer; -#endif /* __IMediaBuffer_FWD_DEFINED__ */ - - -#ifndef __IMediaObject_FWD_DEFINED__ -#define __IMediaObject_FWD_DEFINED__ -typedef interface IMediaObject IMediaObject; -#endif /* __IMediaObject_FWD_DEFINED__ */ - - -#ifndef __IEnumDMO_FWD_DEFINED__ -#define __IEnumDMO_FWD_DEFINED__ -typedef interface IEnumDMO IEnumDMO; -#endif /* __IEnumDMO_FWD_DEFINED__ */ - - -#ifndef __IMediaObjectInPlace_FWD_DEFINED__ -#define __IMediaObjectInPlace_FWD_DEFINED__ -typedef interface IMediaObjectInPlace IMediaObjectInPlace; -#endif /* __IMediaObjectInPlace_FWD_DEFINED__ */ - - -#ifndef __IDMOQualityControl_FWD_DEFINED__ -#define __IDMOQualityControl_FWD_DEFINED__ -typedef interface IDMOQualityControl IDMOQualityControl; -#endif /* __IDMOQualityControl_FWD_DEFINED__ */ - - -#ifndef __IDMOVideoOutputOptimizations_FWD_DEFINED__ -#define __IDMOVideoOutputOptimizations_FWD_DEFINED__ -typedef interface IDMOVideoOutputOptimizations IDMOVideoOutputOptimizations; -#endif /* __IDMOVideoOutputOptimizations_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "unknwn.h" -#include "objidl.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void * ); - -/* interface __MIDL_itf_mediaobj_0000 */ -/* [local] */ - -#ifdef __strmif_h__ -typedef AM_MEDIA_TYPE DMO_MEDIA_TYPE; -#else -typedef struct _DMOMediaType - { - GUID majortype; - GUID subtype; - BOOL bFixedSizeSamples; - BOOL bTemporalCompression; - ULONG lSampleSize; - GUID formattype; - IUnknown *pUnk; - ULONG cbFormat; - /* [size_is] */ BYTE *pbFormat; - } DMO_MEDIA_TYPE; - -typedef LONGLONG REFERENCE_TIME; - -#endif - -enum _DMO_INPUT_DATA_BUFFER_FLAGS - { DMO_INPUT_DATA_BUFFERF_SYNCPOINT = 0x1, - DMO_INPUT_DATA_BUFFERF_TIME = 0x2, - DMO_INPUT_DATA_BUFFERF_TIMELENGTH = 0x4 - } ; - -enum _DMO_OUTPUT_DATA_BUFFER_FLAGS - { DMO_OUTPUT_DATA_BUFFERF_SYNCPOINT = 0x1, - DMO_OUTPUT_DATA_BUFFERF_TIME = 0x2, - DMO_OUTPUT_DATA_BUFFERF_TIMELENGTH = 0x4, - DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE = 0x1000000 - } ; - -enum _DMO_INPUT_STATUS_FLAGS - { DMO_INPUT_STATUSF_ACCEPT_DATA = 0x1 - } ; - -enum _DMO_INPUT_STREAM_INFO_FLAGS - { DMO_INPUT_STREAMF_WHOLE_SAMPLES = 0x1, - DMO_INPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER = 0x2, - DMO_INPUT_STREAMF_FIXED_SAMPLE_SIZE = 0x4, - DMO_INPUT_STREAMF_HOLDS_BUFFERS = 0x8 - } ; - -enum _DMO_OUTPUT_STREAM_INFO_FLAGS - { DMO_OUTPUT_STREAMF_WHOLE_SAMPLES = 0x1, - DMO_OUTPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER = 0x2, - DMO_OUTPUT_STREAMF_FIXED_SAMPLE_SIZE = 0x4, - DMO_OUTPUT_STREAMF_DISCARDABLE = 0x8, - DMO_OUTPUT_STREAMF_OPTIONAL = 0x10 - } ; - -enum _DMO_SET_TYPE_FLAGS - { DMO_SET_TYPEF_TEST_ONLY = 0x1, - DMO_SET_TYPEF_CLEAR = 0x2 - } ; - -enum _DMO_PROCESS_OUTPUT_FLAGS - { DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER = 0x1 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_mediaobj_0000_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_mediaobj_0000_v0_0_s_ifspec; - -#ifndef __IMediaBuffer_INTERFACE_DEFINED__ -#define __IMediaBuffer_INTERFACE_DEFINED__ - -/* interface IMediaBuffer */ -/* [uuid][object] */ - - -EXTERN_C const IID IID_IMediaBuffer; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("59eff8b9-938c-4a26-82f2-95cb84cdc837") - IMediaBuffer : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetLength( - DWORD cbLength) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMaxLength( - /* [out] */ DWORD *pcbMaxLength) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBufferAndLength( - /* [out] */ BYTE **ppBuffer, - /* [out] */ DWORD *pcbLength) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaBufferVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaBuffer * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaBuffer * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaBuffer * This); - - HRESULT ( STDMETHODCALLTYPE *SetLength )( - IMediaBuffer * This, - DWORD cbLength); - - HRESULT ( STDMETHODCALLTYPE *GetMaxLength )( - IMediaBuffer * This, - /* [out] */ DWORD *pcbMaxLength); - - HRESULT ( STDMETHODCALLTYPE *GetBufferAndLength )( - IMediaBuffer * This, - /* [out] */ BYTE **ppBuffer, - /* [out] */ DWORD *pcbLength); - - END_INTERFACE - } IMediaBufferVtbl; - - interface IMediaBuffer - { - CONST_VTBL struct IMediaBufferVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaBuffer_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaBuffer_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaBuffer_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaBuffer_SetLength(This,cbLength) \ - (This)->lpVtbl -> SetLength(This,cbLength) - -#define IMediaBuffer_GetMaxLength(This,pcbMaxLength) \ - (This)->lpVtbl -> GetMaxLength(This,pcbMaxLength) - -#define IMediaBuffer_GetBufferAndLength(This,ppBuffer,pcbLength) \ - (This)->lpVtbl -> GetBufferAndLength(This,ppBuffer,pcbLength) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaBuffer_SetLength_Proxy( - IMediaBuffer * This, - DWORD cbLength); - - -void __RPC_STUB IMediaBuffer_SetLength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaBuffer_GetMaxLength_Proxy( - IMediaBuffer * This, - /* [out] */ DWORD *pcbMaxLength); - - -void __RPC_STUB IMediaBuffer_GetMaxLength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaBuffer_GetBufferAndLength_Proxy( - IMediaBuffer * This, - /* [out] */ BYTE **ppBuffer, - /* [out] */ DWORD *pcbLength); - - -void __RPC_STUB IMediaBuffer_GetBufferAndLength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaBuffer_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_mediaobj_0089 */ -/* [local] */ - -typedef struct _DMO_OUTPUT_DATA_BUFFER - { - IMediaBuffer *pBuffer; - DWORD dwStatus; - REFERENCE_TIME rtTimestamp; - REFERENCE_TIME rtTimelength; - } DMO_OUTPUT_DATA_BUFFER; - -typedef struct _DMO_OUTPUT_DATA_BUFFER *PDMO_OUTPUT_DATA_BUFFER; - - - -extern RPC_IF_HANDLE __MIDL_itf_mediaobj_0089_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_mediaobj_0089_v0_0_s_ifspec; - -#ifndef __IMediaObject_INTERFACE_DEFINED__ -#define __IMediaObject_INTERFACE_DEFINED__ - -/* interface IMediaObject */ -/* [uuid][object] */ - - -EXTERN_C const IID IID_IMediaObject; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("d8ad0f58-5494-4102-97c5-ec798e59bcf4") - IMediaObject : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetStreamCount( - /* [out] */ DWORD *pcInputStreams, - /* [out] */ DWORD *pcOutputStreams) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInputStreamInfo( - DWORD dwInputStreamIndex, - /* [out] */ DWORD *pdwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetOutputStreamInfo( - DWORD dwOutputStreamIndex, - /* [out] */ DWORD *pdwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInputType( - DWORD dwInputStreamIndex, - DWORD dwTypeIndex, - /* [out] */ DMO_MEDIA_TYPE *pmt) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetOutputType( - DWORD dwOutputStreamIndex, - DWORD dwTypeIndex, - /* [out] */ DMO_MEDIA_TYPE *pmt) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetInputType( - DWORD dwInputStreamIndex, - /* [in] */ const DMO_MEDIA_TYPE *pmt, - DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetOutputType( - DWORD dwOutputStreamIndex, - /* [in] */ const DMO_MEDIA_TYPE *pmt, - DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInputCurrentType( - DWORD dwInputStreamIndex, - /* [out] */ DMO_MEDIA_TYPE *pmt) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetOutputCurrentType( - DWORD dwOutputStreamIndex, - /* [out] */ DMO_MEDIA_TYPE *pmt) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInputSizeInfo( - DWORD dwInputStreamIndex, - /* [out] */ DWORD *pcbSize, - /* [out] */ DWORD *pcbMaxLookahead, - /* [out] */ DWORD *pcbAlignment) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetOutputSizeInfo( - DWORD dwOutputStreamIndex, - /* [out] */ DWORD *pcbSize, - /* [out] */ DWORD *pcbAlignment) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInputMaxLatency( - DWORD dwInputStreamIndex, - /* [out] */ REFERENCE_TIME *prtMaxLatency) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetInputMaxLatency( - DWORD dwInputStreamIndex, - REFERENCE_TIME rtMaxLatency) = 0; - - virtual HRESULT STDMETHODCALLTYPE Flush( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Discontinuity( - DWORD dwInputStreamIndex) = 0; - - virtual HRESULT STDMETHODCALLTYPE AllocateStreamingResources( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE FreeStreamingResources( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInputStatus( - DWORD dwInputStreamIndex, - /* [out] */ DWORD *dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE ProcessInput( - DWORD dwInputStreamIndex, - IMediaBuffer *pBuffer, - DWORD dwFlags, - REFERENCE_TIME rtTimestamp, - REFERENCE_TIME rtTimelength) = 0; - - virtual HRESULT STDMETHODCALLTYPE ProcessOutput( - DWORD dwFlags, - DWORD cOutputBufferCount, - /* [size_is][out][in] */ DMO_OUTPUT_DATA_BUFFER *pOutputBuffers, - /* [out] */ DWORD *pdwStatus) = 0; - - virtual HRESULT STDMETHODCALLTYPE Lock( - LONG bLock) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaObjectVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaObject * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaObject * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaObject * This); - - HRESULT ( STDMETHODCALLTYPE *GetStreamCount )( - IMediaObject * This, - /* [out] */ DWORD *pcInputStreams, - /* [out] */ DWORD *pcOutputStreams); - - HRESULT ( STDMETHODCALLTYPE *GetInputStreamInfo )( - IMediaObject * This, - DWORD dwInputStreamIndex, - /* [out] */ DWORD *pdwFlags); - - HRESULT ( STDMETHODCALLTYPE *GetOutputStreamInfo )( - IMediaObject * This, - DWORD dwOutputStreamIndex, - /* [out] */ DWORD *pdwFlags); - - HRESULT ( STDMETHODCALLTYPE *GetInputType )( - IMediaObject * This, - DWORD dwInputStreamIndex, - DWORD dwTypeIndex, - /* [out] */ DMO_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *GetOutputType )( - IMediaObject * This, - DWORD dwOutputStreamIndex, - DWORD dwTypeIndex, - /* [out] */ DMO_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *SetInputType )( - IMediaObject * This, - DWORD dwInputStreamIndex, - /* [in] */ const DMO_MEDIA_TYPE *pmt, - DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *SetOutputType )( - IMediaObject * This, - DWORD dwOutputStreamIndex, - /* [in] */ const DMO_MEDIA_TYPE *pmt, - DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *GetInputCurrentType )( - IMediaObject * This, - DWORD dwInputStreamIndex, - /* [out] */ DMO_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *GetOutputCurrentType )( - IMediaObject * This, - DWORD dwOutputStreamIndex, - /* [out] */ DMO_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *GetInputSizeInfo )( - IMediaObject * This, - DWORD dwInputStreamIndex, - /* [out] */ DWORD *pcbSize, - /* [out] */ DWORD *pcbMaxLookahead, - /* [out] */ DWORD *pcbAlignment); - - HRESULT ( STDMETHODCALLTYPE *GetOutputSizeInfo )( - IMediaObject * This, - DWORD dwOutputStreamIndex, - /* [out] */ DWORD *pcbSize, - /* [out] */ DWORD *pcbAlignment); - - HRESULT ( STDMETHODCALLTYPE *GetInputMaxLatency )( - IMediaObject * This, - DWORD dwInputStreamIndex, - /* [out] */ REFERENCE_TIME *prtMaxLatency); - - HRESULT ( STDMETHODCALLTYPE *SetInputMaxLatency )( - IMediaObject * This, - DWORD dwInputStreamIndex, - REFERENCE_TIME rtMaxLatency); - - HRESULT ( STDMETHODCALLTYPE *Flush )( - IMediaObject * This); - - HRESULT ( STDMETHODCALLTYPE *Discontinuity )( - IMediaObject * This, - DWORD dwInputStreamIndex); - - HRESULT ( STDMETHODCALLTYPE *AllocateStreamingResources )( - IMediaObject * This); - - HRESULT ( STDMETHODCALLTYPE *FreeStreamingResources )( - IMediaObject * This); - - HRESULT ( STDMETHODCALLTYPE *GetInputStatus )( - IMediaObject * This, - DWORD dwInputStreamIndex, - /* [out] */ DWORD *dwFlags); - - HRESULT ( STDMETHODCALLTYPE *ProcessInput )( - IMediaObject * This, - DWORD dwInputStreamIndex, - IMediaBuffer *pBuffer, - DWORD dwFlags, - REFERENCE_TIME rtTimestamp, - REFERENCE_TIME rtTimelength); - - HRESULT ( STDMETHODCALLTYPE *ProcessOutput )( - IMediaObject * This, - DWORD dwFlags, - DWORD cOutputBufferCount, - /* [size_is][out][in] */ DMO_OUTPUT_DATA_BUFFER *pOutputBuffers, - /* [out] */ DWORD *pdwStatus); - - HRESULT ( STDMETHODCALLTYPE *Lock )( - IMediaObject * This, - LONG bLock); - - END_INTERFACE - } IMediaObjectVtbl; - - interface IMediaObject - { - CONST_VTBL struct IMediaObjectVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaObject_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaObject_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaObject_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaObject_GetStreamCount(This,pcInputStreams,pcOutputStreams) \ - (This)->lpVtbl -> GetStreamCount(This,pcInputStreams,pcOutputStreams) - -#define IMediaObject_GetInputStreamInfo(This,dwInputStreamIndex,pdwFlags) \ - (This)->lpVtbl -> GetInputStreamInfo(This,dwInputStreamIndex,pdwFlags) - -#define IMediaObject_GetOutputStreamInfo(This,dwOutputStreamIndex,pdwFlags) \ - (This)->lpVtbl -> GetOutputStreamInfo(This,dwOutputStreamIndex,pdwFlags) - -#define IMediaObject_GetInputType(This,dwInputStreamIndex,dwTypeIndex,pmt) \ - (This)->lpVtbl -> GetInputType(This,dwInputStreamIndex,dwTypeIndex,pmt) - -#define IMediaObject_GetOutputType(This,dwOutputStreamIndex,dwTypeIndex,pmt) \ - (This)->lpVtbl -> GetOutputType(This,dwOutputStreamIndex,dwTypeIndex,pmt) - -#define IMediaObject_SetInputType(This,dwInputStreamIndex,pmt,dwFlags) \ - (This)->lpVtbl -> SetInputType(This,dwInputStreamIndex,pmt,dwFlags) - -#define IMediaObject_SetOutputType(This,dwOutputStreamIndex,pmt,dwFlags) \ - (This)->lpVtbl -> SetOutputType(This,dwOutputStreamIndex,pmt,dwFlags) - -#define IMediaObject_GetInputCurrentType(This,dwInputStreamIndex,pmt) \ - (This)->lpVtbl -> GetInputCurrentType(This,dwInputStreamIndex,pmt) - -#define IMediaObject_GetOutputCurrentType(This,dwOutputStreamIndex,pmt) \ - (This)->lpVtbl -> GetOutputCurrentType(This,dwOutputStreamIndex,pmt) - -#define IMediaObject_GetInputSizeInfo(This,dwInputStreamIndex,pcbSize,pcbMaxLookahead,pcbAlignment) \ - (This)->lpVtbl -> GetInputSizeInfo(This,dwInputStreamIndex,pcbSize,pcbMaxLookahead,pcbAlignment) - -#define IMediaObject_GetOutputSizeInfo(This,dwOutputStreamIndex,pcbSize,pcbAlignment) \ - (This)->lpVtbl -> GetOutputSizeInfo(This,dwOutputStreamIndex,pcbSize,pcbAlignment) - -#define IMediaObject_GetInputMaxLatency(This,dwInputStreamIndex,prtMaxLatency) \ - (This)->lpVtbl -> GetInputMaxLatency(This,dwInputStreamIndex,prtMaxLatency) - -#define IMediaObject_SetInputMaxLatency(This,dwInputStreamIndex,rtMaxLatency) \ - (This)->lpVtbl -> SetInputMaxLatency(This,dwInputStreamIndex,rtMaxLatency) - -#define IMediaObject_Flush(This) \ - (This)->lpVtbl -> Flush(This) - -#define IMediaObject_Discontinuity(This,dwInputStreamIndex) \ - (This)->lpVtbl -> Discontinuity(This,dwInputStreamIndex) - -#define IMediaObject_AllocateStreamingResources(This) \ - (This)->lpVtbl -> AllocateStreamingResources(This) - -#define IMediaObject_FreeStreamingResources(This) \ - (This)->lpVtbl -> FreeStreamingResources(This) - -#define IMediaObject_GetInputStatus(This,dwInputStreamIndex,dwFlags) \ - (This)->lpVtbl -> GetInputStatus(This,dwInputStreamIndex,dwFlags) - -#define IMediaObject_ProcessInput(This,dwInputStreamIndex,pBuffer,dwFlags,rtTimestamp,rtTimelength) \ - (This)->lpVtbl -> ProcessInput(This,dwInputStreamIndex,pBuffer,dwFlags,rtTimestamp,rtTimelength) - -#define IMediaObject_ProcessOutput(This,dwFlags,cOutputBufferCount,pOutputBuffers,pdwStatus) \ - (This)->lpVtbl -> ProcessOutput(This,dwFlags,cOutputBufferCount,pOutputBuffers,pdwStatus) - -#define IMediaObject_Lock(This,bLock) \ - (This)->lpVtbl -> Lock(This,bLock) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaObject_GetStreamCount_Proxy( - IMediaObject * This, - /* [out] */ DWORD *pcInputStreams, - /* [out] */ DWORD *pcOutputStreams); - - -void __RPC_STUB IMediaObject_GetStreamCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_GetInputStreamInfo_Proxy( - IMediaObject * This, - DWORD dwInputStreamIndex, - /* [out] */ DWORD *pdwFlags); - - -void __RPC_STUB IMediaObject_GetInputStreamInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_GetOutputStreamInfo_Proxy( - IMediaObject * This, - DWORD dwOutputStreamIndex, - /* [out] */ DWORD *pdwFlags); - - -void __RPC_STUB IMediaObject_GetOutputStreamInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_GetInputType_Proxy( - IMediaObject * This, - DWORD dwInputStreamIndex, - DWORD dwTypeIndex, - /* [out] */ DMO_MEDIA_TYPE *pmt); - - -void __RPC_STUB IMediaObject_GetInputType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_GetOutputType_Proxy( - IMediaObject * This, - DWORD dwOutputStreamIndex, - DWORD dwTypeIndex, - /* [out] */ DMO_MEDIA_TYPE *pmt); - - -void __RPC_STUB IMediaObject_GetOutputType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_SetInputType_Proxy( - IMediaObject * This, - DWORD dwInputStreamIndex, - /* [in] */ const DMO_MEDIA_TYPE *pmt, - DWORD dwFlags); - - -void __RPC_STUB IMediaObject_SetInputType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_SetOutputType_Proxy( - IMediaObject * This, - DWORD dwOutputStreamIndex, - /* [in] */ const DMO_MEDIA_TYPE *pmt, - DWORD dwFlags); - - -void __RPC_STUB IMediaObject_SetOutputType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_GetInputCurrentType_Proxy( - IMediaObject * This, - DWORD dwInputStreamIndex, - /* [out] */ DMO_MEDIA_TYPE *pmt); - - -void __RPC_STUB IMediaObject_GetInputCurrentType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_GetOutputCurrentType_Proxy( - IMediaObject * This, - DWORD dwOutputStreamIndex, - /* [out] */ DMO_MEDIA_TYPE *pmt); - - -void __RPC_STUB IMediaObject_GetOutputCurrentType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_GetInputSizeInfo_Proxy( - IMediaObject * This, - DWORD dwInputStreamIndex, - /* [out] */ DWORD *pcbSize, - /* [out] */ DWORD *pcbMaxLookahead, - /* [out] */ DWORD *pcbAlignment); - - -void __RPC_STUB IMediaObject_GetInputSizeInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_GetOutputSizeInfo_Proxy( - IMediaObject * This, - DWORD dwOutputStreamIndex, - /* [out] */ DWORD *pcbSize, - /* [out] */ DWORD *pcbAlignment); - - -void __RPC_STUB IMediaObject_GetOutputSizeInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_GetInputMaxLatency_Proxy( - IMediaObject * This, - DWORD dwInputStreamIndex, - /* [out] */ REFERENCE_TIME *prtMaxLatency); - - -void __RPC_STUB IMediaObject_GetInputMaxLatency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_SetInputMaxLatency_Proxy( - IMediaObject * This, - DWORD dwInputStreamIndex, - REFERENCE_TIME rtMaxLatency); - - -void __RPC_STUB IMediaObject_SetInputMaxLatency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_Flush_Proxy( - IMediaObject * This); - - -void __RPC_STUB IMediaObject_Flush_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_Discontinuity_Proxy( - IMediaObject * This, - DWORD dwInputStreamIndex); - - -void __RPC_STUB IMediaObject_Discontinuity_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_AllocateStreamingResources_Proxy( - IMediaObject * This); - - -void __RPC_STUB IMediaObject_AllocateStreamingResources_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_FreeStreamingResources_Proxy( - IMediaObject * This); - - -void __RPC_STUB IMediaObject_FreeStreamingResources_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_GetInputStatus_Proxy( - IMediaObject * This, - DWORD dwInputStreamIndex, - /* [out] */ DWORD *dwFlags); - - -void __RPC_STUB IMediaObject_GetInputStatus_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_ProcessInput_Proxy( - IMediaObject * This, - DWORD dwInputStreamIndex, - IMediaBuffer *pBuffer, - DWORD dwFlags, - REFERENCE_TIME rtTimestamp, - REFERENCE_TIME rtTimelength); - - -void __RPC_STUB IMediaObject_ProcessInput_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_ProcessOutput_Proxy( - IMediaObject * This, - DWORD dwFlags, - DWORD cOutputBufferCount, - /* [size_is][out][in] */ DMO_OUTPUT_DATA_BUFFER *pOutputBuffers, - /* [out] */ DWORD *pdwStatus); - - -void __RPC_STUB IMediaObject_ProcessOutput_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObject_Lock_Proxy( - IMediaObject * This, - LONG bLock); - - -void __RPC_STUB IMediaObject_Lock_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaObject_INTERFACE_DEFINED__ */ - - -#ifndef __IEnumDMO_INTERFACE_DEFINED__ -#define __IEnumDMO_INTERFACE_DEFINED__ - -/* interface IEnumDMO */ -/* [uuid][object] */ - - -EXTERN_C const IID IID_IEnumDMO; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("2c3cd98a-2bfa-4a53-9c27-5249ba64ba0f") - IEnumDMO : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Next( - DWORD cItemsToFetch, - /* [length_is][size_is][out] */ CLSID *pCLSID, - /* [string][length_is][size_is][out] */ WCHAR **Names, - /* [out] */ DWORD *pcItemsFetched) = 0; - - virtual HRESULT STDMETHODCALLTYPE Skip( - DWORD cItemsToSkip) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - /* [out] */ IEnumDMO **ppEnum) = 0; - - }; - -#else /* C style interface */ - - typedef struct IEnumDMOVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IEnumDMO * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IEnumDMO * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IEnumDMO * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - IEnumDMO * This, - DWORD cItemsToFetch, - /* [length_is][size_is][out] */ CLSID *pCLSID, - /* [string][length_is][size_is][out] */ WCHAR **Names, - /* [out] */ DWORD *pcItemsFetched); - - HRESULT ( STDMETHODCALLTYPE *Skip )( - IEnumDMO * This, - DWORD cItemsToSkip); - - HRESULT ( STDMETHODCALLTYPE *Reset )( - IEnumDMO * This); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IEnumDMO * This, - /* [out] */ IEnumDMO **ppEnum); - - END_INTERFACE - } IEnumDMOVtbl; - - interface IEnumDMO - { - CONST_VTBL struct IEnumDMOVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IEnumDMO_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IEnumDMO_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IEnumDMO_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IEnumDMO_Next(This,cItemsToFetch,pCLSID,Names,pcItemsFetched) \ - (This)->lpVtbl -> Next(This,cItemsToFetch,pCLSID,Names,pcItemsFetched) - -#define IEnumDMO_Skip(This,cItemsToSkip) \ - (This)->lpVtbl -> Skip(This,cItemsToSkip) - -#define IEnumDMO_Reset(This) \ - (This)->lpVtbl -> Reset(This) - -#define IEnumDMO_Clone(This,ppEnum) \ - (This)->lpVtbl -> Clone(This,ppEnum) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IEnumDMO_Next_Proxy( - IEnumDMO * This, - DWORD cItemsToFetch, - /* [length_is][size_is][out] */ CLSID *pCLSID, - /* [string][length_is][size_is][out] */ WCHAR **Names, - /* [out] */ DWORD *pcItemsFetched); - - -void __RPC_STUB IEnumDMO_Next_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumDMO_Skip_Proxy( - IEnumDMO * This, - DWORD cItemsToSkip); - - -void __RPC_STUB IEnumDMO_Skip_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumDMO_Reset_Proxy( - IEnumDMO * This); - - -void __RPC_STUB IEnumDMO_Reset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumDMO_Clone_Proxy( - IEnumDMO * This, - /* [out] */ IEnumDMO **ppEnum); - - -void __RPC_STUB IEnumDMO_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IEnumDMO_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_mediaobj_0091 */ -/* [local] */ - - -enum _DMO_INPLACE_PROCESS_FLAGS - { DMO_INPLACE_NORMAL = 0, - DMO_INPLACE_ZERO = 0x1 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_mediaobj_0091_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_mediaobj_0091_v0_0_s_ifspec; - -#ifndef __IMediaObjectInPlace_INTERFACE_DEFINED__ -#define __IMediaObjectInPlace_INTERFACE_DEFINED__ - -/* interface IMediaObjectInPlace */ -/* [uuid][object] */ - - -EXTERN_C const IID IID_IMediaObjectInPlace; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("651b9ad0-0fc7-4aa9-9538-d89931010741") - IMediaObjectInPlace : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Process( - /* [in] */ ULONG ulSize, - /* [size_is][out][in] */ BYTE *pData, - /* [in] */ REFERENCE_TIME refTimeStart, - /* [in] */ DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - /* [out] */ IMediaObjectInPlace **ppMediaObject) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetLatency( - /* [out] */ REFERENCE_TIME *pLatencyTime) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaObjectInPlaceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaObjectInPlace * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaObjectInPlace * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaObjectInPlace * This); - - HRESULT ( STDMETHODCALLTYPE *Process )( - IMediaObjectInPlace * This, - /* [in] */ ULONG ulSize, - /* [size_is][out][in] */ BYTE *pData, - /* [in] */ REFERENCE_TIME refTimeStart, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IMediaObjectInPlace * This, - /* [out] */ IMediaObjectInPlace **ppMediaObject); - - HRESULT ( STDMETHODCALLTYPE *GetLatency )( - IMediaObjectInPlace * This, - /* [out] */ REFERENCE_TIME *pLatencyTime); - - END_INTERFACE - } IMediaObjectInPlaceVtbl; - - interface IMediaObjectInPlace - { - CONST_VTBL struct IMediaObjectInPlaceVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaObjectInPlace_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaObjectInPlace_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaObjectInPlace_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaObjectInPlace_Process(This,ulSize,pData,refTimeStart,dwFlags) \ - (This)->lpVtbl -> Process(This,ulSize,pData,refTimeStart,dwFlags) - -#define IMediaObjectInPlace_Clone(This,ppMediaObject) \ - (This)->lpVtbl -> Clone(This,ppMediaObject) - -#define IMediaObjectInPlace_GetLatency(This,pLatencyTime) \ - (This)->lpVtbl -> GetLatency(This,pLatencyTime) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaObjectInPlace_Process_Proxy( - IMediaObjectInPlace * This, - /* [in] */ ULONG ulSize, - /* [size_is][out][in] */ BYTE *pData, - /* [in] */ REFERENCE_TIME refTimeStart, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IMediaObjectInPlace_Process_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObjectInPlace_Clone_Proxy( - IMediaObjectInPlace * This, - /* [out] */ IMediaObjectInPlace **ppMediaObject); - - -void __RPC_STUB IMediaObjectInPlace_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaObjectInPlace_GetLatency_Proxy( - IMediaObjectInPlace * This, - /* [out] */ REFERENCE_TIME *pLatencyTime); - - -void __RPC_STUB IMediaObjectInPlace_GetLatency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaObjectInPlace_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_mediaobj_0092 */ -/* [local] */ - - -enum _DMO_QUALITY_STATUS_FLAGS - { DMO_QUALITY_STATUS_ENABLED = 0x1 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_mediaobj_0092_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_mediaobj_0092_v0_0_s_ifspec; - -#ifndef __IDMOQualityControl_INTERFACE_DEFINED__ -#define __IDMOQualityControl_INTERFACE_DEFINED__ - -/* interface IDMOQualityControl */ -/* [uuid][object] */ - - -EXTERN_C const IID IID_IDMOQualityControl; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("65abea96-cf36-453f-af8a-705e98f16260") - IDMOQualityControl : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetNow( - /* [in] */ REFERENCE_TIME rtNow) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetStatus( - /* [in] */ DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetStatus( - /* [out] */ DWORD *pdwFlags) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDMOQualityControlVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDMOQualityControl * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDMOQualityControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDMOQualityControl * This); - - HRESULT ( STDMETHODCALLTYPE *SetNow )( - IDMOQualityControl * This, - /* [in] */ REFERENCE_TIME rtNow); - - HRESULT ( STDMETHODCALLTYPE *SetStatus )( - IDMOQualityControl * This, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *GetStatus )( - IDMOQualityControl * This, - /* [out] */ DWORD *pdwFlags); - - END_INTERFACE - } IDMOQualityControlVtbl; - - interface IDMOQualityControl - { - CONST_VTBL struct IDMOQualityControlVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDMOQualityControl_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDMOQualityControl_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDMOQualityControl_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDMOQualityControl_SetNow(This,rtNow) \ - (This)->lpVtbl -> SetNow(This,rtNow) - -#define IDMOQualityControl_SetStatus(This,dwFlags) \ - (This)->lpVtbl -> SetStatus(This,dwFlags) - -#define IDMOQualityControl_GetStatus(This,pdwFlags) \ - (This)->lpVtbl -> GetStatus(This,pdwFlags) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDMOQualityControl_SetNow_Proxy( - IDMOQualityControl * This, - /* [in] */ REFERENCE_TIME rtNow); - - -void __RPC_STUB IDMOQualityControl_SetNow_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDMOQualityControl_SetStatus_Proxy( - IDMOQualityControl * This, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IDMOQualityControl_SetStatus_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDMOQualityControl_GetStatus_Proxy( - IDMOQualityControl * This, - /* [out] */ DWORD *pdwFlags); - - -void __RPC_STUB IDMOQualityControl_GetStatus_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDMOQualityControl_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_mediaobj_0093 */ -/* [local] */ - - -enum _DMO_VIDEO_OUTPUT_STREAM_FLAGS - { DMO_VOSF_NEEDS_PREVIOUS_SAMPLE = 0x1 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_mediaobj_0093_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_mediaobj_0093_v0_0_s_ifspec; - -#ifndef __IDMOVideoOutputOptimizations_INTERFACE_DEFINED__ -#define __IDMOVideoOutputOptimizations_INTERFACE_DEFINED__ - -/* interface IDMOVideoOutputOptimizations */ -/* [uuid][object] */ - - -EXTERN_C const IID IID_IDMOVideoOutputOptimizations; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("be8f4f4e-5b16-4d29-b350-7f6b5d9298ac") - IDMOVideoOutputOptimizations : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE QueryOperationModePreferences( - ULONG ulOutputStreamIndex, - DWORD *pdwRequestedCapabilities) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetOperationMode( - ULONG ulOutputStreamIndex, - DWORD dwEnabledFeatures) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentOperationMode( - ULONG ulOutputStreamIndex, - DWORD *pdwEnabledFeatures) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentSampleRequirements( - ULONG ulOutputStreamIndex, - DWORD *pdwRequestedFeatures) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDMOVideoOutputOptimizationsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDMOVideoOutputOptimizations * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDMOVideoOutputOptimizations * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDMOVideoOutputOptimizations * This); - - HRESULT ( STDMETHODCALLTYPE *QueryOperationModePreferences )( - IDMOVideoOutputOptimizations * This, - ULONG ulOutputStreamIndex, - DWORD *pdwRequestedCapabilities); - - HRESULT ( STDMETHODCALLTYPE *SetOperationMode )( - IDMOVideoOutputOptimizations * This, - ULONG ulOutputStreamIndex, - DWORD dwEnabledFeatures); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentOperationMode )( - IDMOVideoOutputOptimizations * This, - ULONG ulOutputStreamIndex, - DWORD *pdwEnabledFeatures); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentSampleRequirements )( - IDMOVideoOutputOptimizations * This, - ULONG ulOutputStreamIndex, - DWORD *pdwRequestedFeatures); - - END_INTERFACE - } IDMOVideoOutputOptimizationsVtbl; - - interface IDMOVideoOutputOptimizations - { - CONST_VTBL struct IDMOVideoOutputOptimizationsVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDMOVideoOutputOptimizations_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDMOVideoOutputOptimizations_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDMOVideoOutputOptimizations_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDMOVideoOutputOptimizations_QueryOperationModePreferences(This,ulOutputStreamIndex,pdwRequestedCapabilities) \ - (This)->lpVtbl -> QueryOperationModePreferences(This,ulOutputStreamIndex,pdwRequestedCapabilities) - -#define IDMOVideoOutputOptimizations_SetOperationMode(This,ulOutputStreamIndex,dwEnabledFeatures) \ - (This)->lpVtbl -> SetOperationMode(This,ulOutputStreamIndex,dwEnabledFeatures) - -#define IDMOVideoOutputOptimizations_GetCurrentOperationMode(This,ulOutputStreamIndex,pdwEnabledFeatures) \ - (This)->lpVtbl -> GetCurrentOperationMode(This,ulOutputStreamIndex,pdwEnabledFeatures) - -#define IDMOVideoOutputOptimizations_GetCurrentSampleRequirements(This,ulOutputStreamIndex,pdwRequestedFeatures) \ - (This)->lpVtbl -> GetCurrentSampleRequirements(This,ulOutputStreamIndex,pdwRequestedFeatures) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDMOVideoOutputOptimizations_QueryOperationModePreferences_Proxy( - IDMOVideoOutputOptimizations * This, - ULONG ulOutputStreamIndex, - DWORD *pdwRequestedCapabilities); - - -void __RPC_STUB IDMOVideoOutputOptimizations_QueryOperationModePreferences_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDMOVideoOutputOptimizations_SetOperationMode_Proxy( - IDMOVideoOutputOptimizations * This, - ULONG ulOutputStreamIndex, - DWORD dwEnabledFeatures); - - -void __RPC_STUB IDMOVideoOutputOptimizations_SetOperationMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDMOVideoOutputOptimizations_GetCurrentOperationMode_Proxy( - IDMOVideoOutputOptimizations * This, - ULONG ulOutputStreamIndex, - DWORD *pdwEnabledFeatures); - - -void __RPC_STUB IDMOVideoOutputOptimizations_GetCurrentOperationMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDMOVideoOutputOptimizations_GetCurrentSampleRequirements_Proxy( - IDMOVideoOutputOptimizations * This, - ULONG ulOutputStreamIndex, - DWORD *pdwRequestedFeatures); - - -void __RPC_STUB IDMOVideoOutputOptimizations_GetCurrentSampleRequirements_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDMOVideoOutputOptimizations_INTERFACE_DEFINED__ */ - - -/* Additional Prototypes for ALL interfaces */ - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/medparam.h b/import/DirectX8/include/medparam.h deleted file mode 100644 index ba4200d5c..000000000 --- a/import/DirectX8/include/medparam.h +++ /dev/null @@ -1,581 +0,0 @@ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 6.00.0347 */ -/* Compiler settings for medparam.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __medparam_h__ -#define __medparam_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __IMediaParamInfo_FWD_DEFINED__ -#define __IMediaParamInfo_FWD_DEFINED__ -typedef interface IMediaParamInfo IMediaParamInfo; -#endif /* __IMediaParamInfo_FWD_DEFINED__ */ - - -#ifndef __IMediaParams_FWD_DEFINED__ -#define __IMediaParams_FWD_DEFINED__ -typedef interface IMediaParams IMediaParams; -#endif /* __IMediaParams_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "oaidl.h" -#include "ocidl.h" -#include "strmif.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void * ); - -/* interface __MIDL_itf_medparam_0000 */ -/* [local] */ - -typedef float MP_DATA; - -typedef -enum _MP_Type - { MPT_INT = 0, - MPT_FLOAT = MPT_INT + 1, - MPT_BOOL = MPT_FLOAT + 1, - MPT_ENUM = MPT_BOOL + 1, - MPT_MAX = MPT_ENUM + 1 - } MP_TYPE; - -#define MPBOOL_TRUE ( 1 ) - -#define MPBOOL_FALSE ( 0 ) - -typedef -enum _MP_CURVE_TYPE - { MP_CURVE_JUMP = 0x1, - MP_CURVE_LINEAR = 0x2, - MP_CURVE_SQUARE = 0x4, - MP_CURVE_INVSQUARE = 0x8, - MP_CURVE_SINE = 0x10 - } MP_CURVE_TYPE; - -typedef DWORD MP_CAPS; - -#define MP_CAPS_CURVE_JUMP ( MP_CURVE_JUMP ) - -#define MP_CAPS_CURVE_LINEAR ( MP_CURVE_LINEAR ) - -#define MP_CAPS_CURVE_SQUARE ( MP_CURVE_SQUARE ) - -#define MP_CAPS_CURVE_INVSQUARE ( MP_CURVE_INVSQUARE ) - -#define MP_CAPS_CURVE_SINE ( MP_CURVE_SINE ) - -typedef struct _MP_PARAMINFO - { - MP_TYPE mpType; - MP_CAPS mopCaps; - MP_DATA mpdMinValue; - MP_DATA mpdMaxValue; - MP_DATA mpdNeutralValue; - WCHAR szUnitText[ 32 ]; - WCHAR szLabel[ 32 ]; - } MP_PARAMINFO; - -typedef DWORD DWORD; - -#define DWORD_ALLPARAMS ( -1 ) - -typedef DWORD MP_TIMEDATA; - -DEFINE_GUID(GUID_TIME_REFERENCE, -0x93ad712b, 0xdaa0, 0x4ffe, 0xbc, 0x81, 0xb0, 0xce, 0x50, 0xf, 0xcd, 0xd9); -DEFINE_GUID(GUID_TIME_MUSIC, -0x574c49d, 0x5b04, 0x4b15, 0xa5, 0x42, 0xae, 0x28, 0x20, 0x30, 0x11, 0x7b); -DEFINE_GUID(GUID_TIME_SAMPLES, -0xa8593d05, 0xc43, 0x4984, 0x9a, 0x63, 0x97, 0xaf, 0x9e, 0x2, 0xc4, 0xc0); -typedef DWORD MP_FLAGS; - -#define MPF_ENVLP_STANDARD ( 0 ) - -#define MPF_ENVLP_BEGIN_CURRENTVAL ( 0x1 ) - -#define MPF_ENVLP_BEGIN_NEUTRALVAL ( 0x2 ) - -typedef struct _MP_ENVELOPE_SEGMENT - { - REFERENCE_TIME rtStart; - REFERENCE_TIME rtEnd; - MP_DATA valStart; - MP_DATA valEnd; - MP_CURVE_TYPE iCurve; - MP_FLAGS flags; - } MP_ENVELOPE_SEGMENT; - -#define MPF_PUNCHIN_REFTIME ( 0 ) - -#define MPF_PUNCHIN_NOW ( 0x1 ) - -#define MPF_PUNCHIN_STOPPED ( 0x2 ) - - - -extern RPC_IF_HANDLE __MIDL_itf_medparam_0000_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_medparam_0000_v0_0_s_ifspec; - -#ifndef __IMediaParamInfo_INTERFACE_DEFINED__ -#define __IMediaParamInfo_INTERFACE_DEFINED__ - -/* interface IMediaParamInfo */ -/* [version][uuid][object] */ - - -EXTERN_C const IID IID_IMediaParamInfo; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("6d6cbb60-a223-44aa-842f-a2f06750be6d") - IMediaParamInfo : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetParamCount( - /* [out] */ DWORD *pdwParams) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetParamInfo( - /* [in] */ DWORD dwParamIndex, - /* [out] */ MP_PARAMINFO *pInfo) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetParamText( - /* [in] */ DWORD dwParamIndex, - /* [out] */ WCHAR **ppwchText) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNumTimeFormats( - /* [out] */ DWORD *pdwNumTimeFormats) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSupportedTimeFormat( - /* [in] */ DWORD dwFormatIndex, - /* [out] */ GUID *pguidTimeFormat) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentTimeFormat( - /* [out] */ GUID *pguidTimeFormat, - /* [out] */ MP_TIMEDATA *pTimeData) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaParamInfoVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaParamInfo * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaParamInfo * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaParamInfo * This); - - HRESULT ( STDMETHODCALLTYPE *GetParamCount )( - IMediaParamInfo * This, - /* [out] */ DWORD *pdwParams); - - HRESULT ( STDMETHODCALLTYPE *GetParamInfo )( - IMediaParamInfo * This, - /* [in] */ DWORD dwParamIndex, - /* [out] */ MP_PARAMINFO *pInfo); - - HRESULT ( STDMETHODCALLTYPE *GetParamText )( - IMediaParamInfo * This, - /* [in] */ DWORD dwParamIndex, - /* [out] */ WCHAR **ppwchText); - - HRESULT ( STDMETHODCALLTYPE *GetNumTimeFormats )( - IMediaParamInfo * This, - /* [out] */ DWORD *pdwNumTimeFormats); - - HRESULT ( STDMETHODCALLTYPE *GetSupportedTimeFormat )( - IMediaParamInfo * This, - /* [in] */ DWORD dwFormatIndex, - /* [out] */ GUID *pguidTimeFormat); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentTimeFormat )( - IMediaParamInfo * This, - /* [out] */ GUID *pguidTimeFormat, - /* [out] */ MP_TIMEDATA *pTimeData); - - END_INTERFACE - } IMediaParamInfoVtbl; - - interface IMediaParamInfo - { - CONST_VTBL struct IMediaParamInfoVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaParamInfo_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaParamInfo_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaParamInfo_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaParamInfo_GetParamCount(This,pdwParams) \ - (This)->lpVtbl -> GetParamCount(This,pdwParams) - -#define IMediaParamInfo_GetParamInfo(This,dwParamIndex,pInfo) \ - (This)->lpVtbl -> GetParamInfo(This,dwParamIndex,pInfo) - -#define IMediaParamInfo_GetParamText(This,dwParamIndex,ppwchText) \ - (This)->lpVtbl -> GetParamText(This,dwParamIndex,ppwchText) - -#define IMediaParamInfo_GetNumTimeFormats(This,pdwNumTimeFormats) \ - (This)->lpVtbl -> GetNumTimeFormats(This,pdwNumTimeFormats) - -#define IMediaParamInfo_GetSupportedTimeFormat(This,dwFormatIndex,pguidTimeFormat) \ - (This)->lpVtbl -> GetSupportedTimeFormat(This,dwFormatIndex,pguidTimeFormat) - -#define IMediaParamInfo_GetCurrentTimeFormat(This,pguidTimeFormat,pTimeData) \ - (This)->lpVtbl -> GetCurrentTimeFormat(This,pguidTimeFormat,pTimeData) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaParamInfo_GetParamCount_Proxy( - IMediaParamInfo * This, - /* [out] */ DWORD *pdwParams); - - -void __RPC_STUB IMediaParamInfo_GetParamCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaParamInfo_GetParamInfo_Proxy( - IMediaParamInfo * This, - /* [in] */ DWORD dwParamIndex, - /* [out] */ MP_PARAMINFO *pInfo); - - -void __RPC_STUB IMediaParamInfo_GetParamInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaParamInfo_GetParamText_Proxy( - IMediaParamInfo * This, - /* [in] */ DWORD dwParamIndex, - /* [out] */ WCHAR **ppwchText); - - -void __RPC_STUB IMediaParamInfo_GetParamText_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaParamInfo_GetNumTimeFormats_Proxy( - IMediaParamInfo * This, - /* [out] */ DWORD *pdwNumTimeFormats); - - -void __RPC_STUB IMediaParamInfo_GetNumTimeFormats_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaParamInfo_GetSupportedTimeFormat_Proxy( - IMediaParamInfo * This, - /* [in] */ DWORD dwFormatIndex, - /* [out] */ GUID *pguidTimeFormat); - - -void __RPC_STUB IMediaParamInfo_GetSupportedTimeFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaParamInfo_GetCurrentTimeFormat_Proxy( - IMediaParamInfo * This, - /* [out] */ GUID *pguidTimeFormat, - /* [out] */ MP_TIMEDATA *pTimeData); - - -void __RPC_STUB IMediaParamInfo_GetCurrentTimeFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaParamInfo_INTERFACE_DEFINED__ */ - - -#ifndef __IMediaParams_INTERFACE_DEFINED__ -#define __IMediaParams_INTERFACE_DEFINED__ - -/* interface IMediaParams */ -/* [version][uuid][object] */ - - -EXTERN_C const IID IID_IMediaParams; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("6d6cbb61-a223-44aa-842f-a2f06750be6e") - IMediaParams : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetParam( - /* [in] */ DWORD dwParamIndex, - /* [out] */ MP_DATA *pValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetParam( - /* [in] */ DWORD dwParamIndex, - /* [in] */ MP_DATA value) = 0; - - virtual HRESULT STDMETHODCALLTYPE AddEnvelope( - /* [in] */ DWORD dwParamIndex, - /* [in] */ DWORD cSegments, - /* [in] */ MP_ENVELOPE_SEGMENT *pEnvelopeSegments) = 0; - - virtual HRESULT STDMETHODCALLTYPE FlushEnvelope( - /* [in] */ DWORD dwParamIndex, - /* [in] */ REFERENCE_TIME refTimeStart, - /* [in] */ REFERENCE_TIME refTimeEnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTimeFormat( - /* [in] */ GUID guidTimeFormat, - /* [in] */ MP_TIMEDATA mpTimeData) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaParamsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaParams * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaParams * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaParams * This); - - HRESULT ( STDMETHODCALLTYPE *GetParam )( - IMediaParams * This, - /* [in] */ DWORD dwParamIndex, - /* [out] */ MP_DATA *pValue); - - HRESULT ( STDMETHODCALLTYPE *SetParam )( - IMediaParams * This, - /* [in] */ DWORD dwParamIndex, - /* [in] */ MP_DATA value); - - HRESULT ( STDMETHODCALLTYPE *AddEnvelope )( - IMediaParams * This, - /* [in] */ DWORD dwParamIndex, - /* [in] */ DWORD cSegments, - /* [in] */ MP_ENVELOPE_SEGMENT *pEnvelopeSegments); - - HRESULT ( STDMETHODCALLTYPE *FlushEnvelope )( - IMediaParams * This, - /* [in] */ DWORD dwParamIndex, - /* [in] */ REFERENCE_TIME refTimeStart, - /* [in] */ REFERENCE_TIME refTimeEnd); - - HRESULT ( STDMETHODCALLTYPE *SetTimeFormat )( - IMediaParams * This, - /* [in] */ GUID guidTimeFormat, - /* [in] */ MP_TIMEDATA mpTimeData); - - END_INTERFACE - } IMediaParamsVtbl; - - interface IMediaParams - { - CONST_VTBL struct IMediaParamsVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaParams_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaParams_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaParams_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaParams_GetParam(This,dwParamIndex,pValue) \ - (This)->lpVtbl -> GetParam(This,dwParamIndex,pValue) - -#define IMediaParams_SetParam(This,dwParamIndex,value) \ - (This)->lpVtbl -> SetParam(This,dwParamIndex,value) - -#define IMediaParams_AddEnvelope(This,dwParamIndex,cSegments,pEnvelopeSegments) \ - (This)->lpVtbl -> AddEnvelope(This,dwParamIndex,cSegments,pEnvelopeSegments) - -#define IMediaParams_FlushEnvelope(This,dwParamIndex,refTimeStart,refTimeEnd) \ - (This)->lpVtbl -> FlushEnvelope(This,dwParamIndex,refTimeStart,refTimeEnd) - -#define IMediaParams_SetTimeFormat(This,guidTimeFormat,mpTimeData) \ - (This)->lpVtbl -> SetTimeFormat(This,guidTimeFormat,mpTimeData) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaParams_GetParam_Proxy( - IMediaParams * This, - /* [in] */ DWORD dwParamIndex, - /* [out] */ MP_DATA *pValue); - - -void __RPC_STUB IMediaParams_GetParam_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaParams_SetParam_Proxy( - IMediaParams * This, - /* [in] */ DWORD dwParamIndex, - /* [in] */ MP_DATA value); - - -void __RPC_STUB IMediaParams_SetParam_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaParams_AddEnvelope_Proxy( - IMediaParams * This, - /* [in] */ DWORD dwParamIndex, - /* [in] */ DWORD cSegments, - /* [in] */ MP_ENVELOPE_SEGMENT *pEnvelopeSegments); - - -void __RPC_STUB IMediaParams_AddEnvelope_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaParams_FlushEnvelope_Proxy( - IMediaParams * This, - /* [in] */ DWORD dwParamIndex, - /* [in] */ REFERENCE_TIME refTimeStart, - /* [in] */ REFERENCE_TIME refTimeEnd); - - -void __RPC_STUB IMediaParams_FlushEnvelope_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaParams_SetTimeFormat_Proxy( - IMediaParams * This, - /* [in] */ GUID guidTimeFormat, - /* [in] */ MP_TIMEDATA mpTimeData); - - -void __RPC_STUB IMediaParams_SetTimeFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaParams_INTERFACE_DEFINED__ */ - - -/* Additional Prototypes for ALL interfaces */ - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/mmstream.h b/import/DirectX8/include/mmstream.h deleted file mode 100644 index fd76073cd..000000000 --- a/import/DirectX8/include/mmstream.h +++ /dev/null @@ -1,846 +0,0 @@ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 6.00.0347 */ -/* Compiler settings for mmstream.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __mmstream_h__ -#define __mmstream_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __IMultiMediaStream_FWD_DEFINED__ -#define __IMultiMediaStream_FWD_DEFINED__ -typedef interface IMultiMediaStream IMultiMediaStream; -#endif /* __IMultiMediaStream_FWD_DEFINED__ */ - - -#ifndef __IMediaStream_FWD_DEFINED__ -#define __IMediaStream_FWD_DEFINED__ -typedef interface IMediaStream IMediaStream; -#endif /* __IMediaStream_FWD_DEFINED__ */ - - -#ifndef __IStreamSample_FWD_DEFINED__ -#define __IStreamSample_FWD_DEFINED__ -typedef interface IStreamSample IStreamSample; -#endif /* __IStreamSample_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "unknwn.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void * ); - -/* interface __MIDL_itf_mmstream_0000 */ -/* [local] */ - -#define MS_ERROR_CODE(x) MAKE_HRESULT(1, FACILITY_ITF, (x) + 0x400) -#define MS_SUCCESS_CODE(x) MAKE_HRESULT(0, FACILITY_ITF, x) -#define MS_S_PENDING MS_SUCCESS_CODE(1) -#define MS_S_NOUPDATE MS_SUCCESS_CODE(2) -#define MS_S_ENDOFSTREAM MS_SUCCESS_CODE(3) -#define MS_E_SAMPLEALLOC MS_ERROR_CODE(1) -#define MS_E_PURPOSEID MS_ERROR_CODE(2) -#define MS_E_NOSTREAM MS_ERROR_CODE(3) -#define MS_E_NOSEEKING MS_ERROR_CODE(4) -#define MS_E_INCOMPATIBLE MS_ERROR_CODE(5) -#define MS_E_BUSY MS_ERROR_CODE(6) -#define MS_E_NOTINIT MS_ERROR_CODE(7) -#define MS_E_SOURCEALREADYDEFINED MS_ERROR_CODE(8) -#define MS_E_INVALIDSTREAMTYPE MS_ERROR_CODE(9) -#define MS_E_NOTRUNNING MS_ERROR_CODE(10) -// {A35FF56A-9FDA-11d0-8FDF-00C04FD9189D} -DEFINE_GUID(MSPID_PrimaryVideo, -0xa35ff56a, 0x9fda, 0x11d0, 0x8f, 0xdf, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0x9d); -// {A35FF56B-9FDA-11d0-8FDF-00C04FD9189D} -DEFINE_GUID(MSPID_PrimaryAudio, -0xa35ff56b, 0x9fda, 0x11d0, 0x8f, 0xdf, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0x9d); -#if(_WIN32_WINNT < 0x0400) -typedef void ( __stdcall *PAPCFUNC )( - DWORD_PTR dwParam); - -#endif -typedef LONGLONG STREAM_TIME; - -typedef GUID MSPID; - -typedef REFGUID REFMSPID; - -typedef /* [public][public][public] */ -enum __MIDL___MIDL_itf_mmstream_0000_0001 - { STREAMTYPE_READ = 0, - STREAMTYPE_WRITE = 1, - STREAMTYPE_TRANSFORM = 2 - } STREAM_TYPE; - -typedef /* [public][public][public] */ -enum __MIDL___MIDL_itf_mmstream_0000_0002 - { STREAMSTATE_STOP = 0, - STREAMSTATE_RUN = 1 - } STREAM_STATE; - -typedef /* [public] */ -enum __MIDL___MIDL_itf_mmstream_0000_0003 - { COMPSTAT_NOUPDATEOK = 0x1, - COMPSTAT_WAIT = 0x2, - COMPSTAT_ABORT = 0x4 - } COMPLETION_STATUS_FLAGS; - - -enum __MIDL___MIDL_itf_mmstream_0000_0004 - { MMSSF_HASCLOCK = 0x1, - MMSSF_SUPPORTSEEK = 0x2, - MMSSF_ASYNCHRONOUS = 0x4 - } ; - -enum __MIDL___MIDL_itf_mmstream_0000_0005 - { SSUPDATE_ASYNC = 0x1, - SSUPDATE_CONTINUOUS = 0x2 - } ; - - - - - -extern RPC_IF_HANDLE __MIDL_itf_mmstream_0000_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_mmstream_0000_v0_0_s_ifspec; - -#ifndef __IMultiMediaStream_INTERFACE_DEFINED__ -#define __IMultiMediaStream_INTERFACE_DEFINED__ - -/* interface IMultiMediaStream */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IMultiMediaStream; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("B502D1BC-9A57-11d0-8FDE-00C04FD9189D") - IMultiMediaStream : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetInformation( - /* [out] */ DWORD *pdwFlags, - /* [out] */ STREAM_TYPE *pStreamType) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMediaStream( - /* [in] */ REFMSPID idPurpose, - /* [out] */ IMediaStream **ppMediaStream) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnumMediaStreams( - /* [in] */ long Index, - /* [out] */ IMediaStream **ppMediaStream) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetState( - /* [out] */ STREAM_STATE *pCurrentState) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetState( - /* [in] */ STREAM_STATE NewState) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTime( - /* [out] */ STREAM_TIME *pCurrentTime) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDuration( - /* [out] */ STREAM_TIME *pDuration) = 0; - - virtual HRESULT STDMETHODCALLTYPE Seek( - /* [in] */ STREAM_TIME SeekTime) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetEndOfStreamEventHandle( - /* [out] */ HANDLE *phEOS) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMultiMediaStreamVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMultiMediaStream * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMultiMediaStream * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMultiMediaStream * This); - - HRESULT ( STDMETHODCALLTYPE *GetInformation )( - IMultiMediaStream * This, - /* [out] */ DWORD *pdwFlags, - /* [out] */ STREAM_TYPE *pStreamType); - - HRESULT ( STDMETHODCALLTYPE *GetMediaStream )( - IMultiMediaStream * This, - /* [in] */ REFMSPID idPurpose, - /* [out] */ IMediaStream **ppMediaStream); - - HRESULT ( STDMETHODCALLTYPE *EnumMediaStreams )( - IMultiMediaStream * This, - /* [in] */ long Index, - /* [out] */ IMediaStream **ppMediaStream); - - HRESULT ( STDMETHODCALLTYPE *GetState )( - IMultiMediaStream * This, - /* [out] */ STREAM_STATE *pCurrentState); - - HRESULT ( STDMETHODCALLTYPE *SetState )( - IMultiMediaStream * This, - /* [in] */ STREAM_STATE NewState); - - HRESULT ( STDMETHODCALLTYPE *GetTime )( - IMultiMediaStream * This, - /* [out] */ STREAM_TIME *pCurrentTime); - - HRESULT ( STDMETHODCALLTYPE *GetDuration )( - IMultiMediaStream * This, - /* [out] */ STREAM_TIME *pDuration); - - HRESULT ( STDMETHODCALLTYPE *Seek )( - IMultiMediaStream * This, - /* [in] */ STREAM_TIME SeekTime); - - HRESULT ( STDMETHODCALLTYPE *GetEndOfStreamEventHandle )( - IMultiMediaStream * This, - /* [out] */ HANDLE *phEOS); - - END_INTERFACE - } IMultiMediaStreamVtbl; - - interface IMultiMediaStream - { - CONST_VTBL struct IMultiMediaStreamVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMultiMediaStream_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMultiMediaStream_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMultiMediaStream_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMultiMediaStream_GetInformation(This,pdwFlags,pStreamType) \ - (This)->lpVtbl -> GetInformation(This,pdwFlags,pStreamType) - -#define IMultiMediaStream_GetMediaStream(This,idPurpose,ppMediaStream) \ - (This)->lpVtbl -> GetMediaStream(This,idPurpose,ppMediaStream) - -#define IMultiMediaStream_EnumMediaStreams(This,Index,ppMediaStream) \ - (This)->lpVtbl -> EnumMediaStreams(This,Index,ppMediaStream) - -#define IMultiMediaStream_GetState(This,pCurrentState) \ - (This)->lpVtbl -> GetState(This,pCurrentState) - -#define IMultiMediaStream_SetState(This,NewState) \ - (This)->lpVtbl -> SetState(This,NewState) - -#define IMultiMediaStream_GetTime(This,pCurrentTime) \ - (This)->lpVtbl -> GetTime(This,pCurrentTime) - -#define IMultiMediaStream_GetDuration(This,pDuration) \ - (This)->lpVtbl -> GetDuration(This,pDuration) - -#define IMultiMediaStream_Seek(This,SeekTime) \ - (This)->lpVtbl -> Seek(This,SeekTime) - -#define IMultiMediaStream_GetEndOfStreamEventHandle(This,phEOS) \ - (This)->lpVtbl -> GetEndOfStreamEventHandle(This,phEOS) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMultiMediaStream_GetInformation_Proxy( - IMultiMediaStream * This, - /* [out] */ DWORD *pdwFlags, - /* [out] */ STREAM_TYPE *pStreamType); - - -void __RPC_STUB IMultiMediaStream_GetInformation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMultiMediaStream_GetMediaStream_Proxy( - IMultiMediaStream * This, - /* [in] */ REFMSPID idPurpose, - /* [out] */ IMediaStream **ppMediaStream); - - -void __RPC_STUB IMultiMediaStream_GetMediaStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMultiMediaStream_EnumMediaStreams_Proxy( - IMultiMediaStream * This, - /* [in] */ long Index, - /* [out] */ IMediaStream **ppMediaStream); - - -void __RPC_STUB IMultiMediaStream_EnumMediaStreams_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMultiMediaStream_GetState_Proxy( - IMultiMediaStream * This, - /* [out] */ STREAM_STATE *pCurrentState); - - -void __RPC_STUB IMultiMediaStream_GetState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMultiMediaStream_SetState_Proxy( - IMultiMediaStream * This, - /* [in] */ STREAM_STATE NewState); - - -void __RPC_STUB IMultiMediaStream_SetState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMultiMediaStream_GetTime_Proxy( - IMultiMediaStream * This, - /* [out] */ STREAM_TIME *pCurrentTime); - - -void __RPC_STUB IMultiMediaStream_GetTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMultiMediaStream_GetDuration_Proxy( - IMultiMediaStream * This, - /* [out] */ STREAM_TIME *pDuration); - - -void __RPC_STUB IMultiMediaStream_GetDuration_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMultiMediaStream_Seek_Proxy( - IMultiMediaStream * This, - /* [in] */ STREAM_TIME SeekTime); - - -void __RPC_STUB IMultiMediaStream_Seek_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMultiMediaStream_GetEndOfStreamEventHandle_Proxy( - IMultiMediaStream * This, - /* [out] */ HANDLE *phEOS); - - -void __RPC_STUB IMultiMediaStream_GetEndOfStreamEventHandle_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMultiMediaStream_INTERFACE_DEFINED__ */ - - -#ifndef __IMediaStream_INTERFACE_DEFINED__ -#define __IMediaStream_INTERFACE_DEFINED__ - -/* interface IMediaStream */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IMediaStream; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("B502D1BD-9A57-11d0-8FDE-00C04FD9189D") - IMediaStream : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetMultiMediaStream( - /* [out] */ IMultiMediaStream **ppMultiMediaStream) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInformation( - /* [out] */ MSPID *pPurposeId, - /* [out] */ STREAM_TYPE *pType) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetSameFormat( - /* [in] */ IMediaStream *pStreamThatHasDesiredFormat, - /* [in] */ DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE AllocateSample( - /* [in] */ DWORD dwFlags, - /* [out] */ IStreamSample **ppSample) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateSharedSample( - /* [in] */ IStreamSample *pExistingSample, - /* [in] */ DWORD dwFlags, - /* [out] */ IStreamSample **ppNewSample) = 0; - - virtual HRESULT STDMETHODCALLTYPE SendEndOfStream( - DWORD dwFlags) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaStreamVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaStream * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaStream * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaStream * This); - - HRESULT ( STDMETHODCALLTYPE *GetMultiMediaStream )( - IMediaStream * This, - /* [out] */ IMultiMediaStream **ppMultiMediaStream); - - HRESULT ( STDMETHODCALLTYPE *GetInformation )( - IMediaStream * This, - /* [out] */ MSPID *pPurposeId, - /* [out] */ STREAM_TYPE *pType); - - HRESULT ( STDMETHODCALLTYPE *SetSameFormat )( - IMediaStream * This, - /* [in] */ IMediaStream *pStreamThatHasDesiredFormat, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *AllocateSample )( - IMediaStream * This, - /* [in] */ DWORD dwFlags, - /* [out] */ IStreamSample **ppSample); - - HRESULT ( STDMETHODCALLTYPE *CreateSharedSample )( - IMediaStream * This, - /* [in] */ IStreamSample *pExistingSample, - /* [in] */ DWORD dwFlags, - /* [out] */ IStreamSample **ppNewSample); - - HRESULT ( STDMETHODCALLTYPE *SendEndOfStream )( - IMediaStream * This, - DWORD dwFlags); - - END_INTERFACE - } IMediaStreamVtbl; - - interface IMediaStream - { - CONST_VTBL struct IMediaStreamVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaStream_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaStream_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaStream_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaStream_GetMultiMediaStream(This,ppMultiMediaStream) \ - (This)->lpVtbl -> GetMultiMediaStream(This,ppMultiMediaStream) - -#define IMediaStream_GetInformation(This,pPurposeId,pType) \ - (This)->lpVtbl -> GetInformation(This,pPurposeId,pType) - -#define IMediaStream_SetSameFormat(This,pStreamThatHasDesiredFormat,dwFlags) \ - (This)->lpVtbl -> SetSameFormat(This,pStreamThatHasDesiredFormat,dwFlags) - -#define IMediaStream_AllocateSample(This,dwFlags,ppSample) \ - (This)->lpVtbl -> AllocateSample(This,dwFlags,ppSample) - -#define IMediaStream_CreateSharedSample(This,pExistingSample,dwFlags,ppNewSample) \ - (This)->lpVtbl -> CreateSharedSample(This,pExistingSample,dwFlags,ppNewSample) - -#define IMediaStream_SendEndOfStream(This,dwFlags) \ - (This)->lpVtbl -> SendEndOfStream(This,dwFlags) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaStream_GetMultiMediaStream_Proxy( - IMediaStream * This, - /* [out] */ IMultiMediaStream **ppMultiMediaStream); - - -void __RPC_STUB IMediaStream_GetMultiMediaStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaStream_GetInformation_Proxy( - IMediaStream * This, - /* [out] */ MSPID *pPurposeId, - /* [out] */ STREAM_TYPE *pType); - - -void __RPC_STUB IMediaStream_GetInformation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaStream_SetSameFormat_Proxy( - IMediaStream * This, - /* [in] */ IMediaStream *pStreamThatHasDesiredFormat, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IMediaStream_SetSameFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaStream_AllocateSample_Proxy( - IMediaStream * This, - /* [in] */ DWORD dwFlags, - /* [out] */ IStreamSample **ppSample); - - -void __RPC_STUB IMediaStream_AllocateSample_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaStream_CreateSharedSample_Proxy( - IMediaStream * This, - /* [in] */ IStreamSample *pExistingSample, - /* [in] */ DWORD dwFlags, - /* [out] */ IStreamSample **ppNewSample); - - -void __RPC_STUB IMediaStream_CreateSharedSample_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaStream_SendEndOfStream_Proxy( - IMediaStream * This, - DWORD dwFlags); - - -void __RPC_STUB IMediaStream_SendEndOfStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaStream_INTERFACE_DEFINED__ */ - - -#ifndef __IStreamSample_INTERFACE_DEFINED__ -#define __IStreamSample_INTERFACE_DEFINED__ - -/* interface IStreamSample */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IStreamSample; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("B502D1BE-9A57-11d0-8FDE-00C04FD9189D") - IStreamSample : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetMediaStream( - /* [in] */ IMediaStream **ppMediaStream) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSampleTimes( - /* [out] */ STREAM_TIME *pStartTime, - /* [out] */ STREAM_TIME *pEndTime, - /* [out] */ STREAM_TIME *pCurrentTime) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetSampleTimes( - /* [in] */ const STREAM_TIME *pStartTime, - /* [in] */ const STREAM_TIME *pEndTime) = 0; - - virtual HRESULT STDMETHODCALLTYPE Update( - /* [in] */ DWORD dwFlags, - /* [in] */ HANDLE hEvent, - /* [in] */ PAPCFUNC pfnAPC, - /* [in] */ DWORD_PTR dwAPCData) = 0; - - virtual HRESULT STDMETHODCALLTYPE CompletionStatus( - /* [in] */ DWORD dwFlags, - /* [in] */ DWORD dwMilliseconds) = 0; - - }; - -#else /* C style interface */ - - typedef struct IStreamSampleVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IStreamSample * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IStreamSample * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IStreamSample * This); - - HRESULT ( STDMETHODCALLTYPE *GetMediaStream )( - IStreamSample * This, - /* [in] */ IMediaStream **ppMediaStream); - - HRESULT ( STDMETHODCALLTYPE *GetSampleTimes )( - IStreamSample * This, - /* [out] */ STREAM_TIME *pStartTime, - /* [out] */ STREAM_TIME *pEndTime, - /* [out] */ STREAM_TIME *pCurrentTime); - - HRESULT ( STDMETHODCALLTYPE *SetSampleTimes )( - IStreamSample * This, - /* [in] */ const STREAM_TIME *pStartTime, - /* [in] */ const STREAM_TIME *pEndTime); - - HRESULT ( STDMETHODCALLTYPE *Update )( - IStreamSample * This, - /* [in] */ DWORD dwFlags, - /* [in] */ HANDLE hEvent, - /* [in] */ PAPCFUNC pfnAPC, - /* [in] */ DWORD_PTR dwAPCData); - - HRESULT ( STDMETHODCALLTYPE *CompletionStatus )( - IStreamSample * This, - /* [in] */ DWORD dwFlags, - /* [in] */ DWORD dwMilliseconds); - - END_INTERFACE - } IStreamSampleVtbl; - - interface IStreamSample - { - CONST_VTBL struct IStreamSampleVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IStreamSample_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IStreamSample_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IStreamSample_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IStreamSample_GetMediaStream(This,ppMediaStream) \ - (This)->lpVtbl -> GetMediaStream(This,ppMediaStream) - -#define IStreamSample_GetSampleTimes(This,pStartTime,pEndTime,pCurrentTime) \ - (This)->lpVtbl -> GetSampleTimes(This,pStartTime,pEndTime,pCurrentTime) - -#define IStreamSample_SetSampleTimes(This,pStartTime,pEndTime) \ - (This)->lpVtbl -> SetSampleTimes(This,pStartTime,pEndTime) - -#define IStreamSample_Update(This,dwFlags,hEvent,pfnAPC,dwAPCData) \ - (This)->lpVtbl -> Update(This,dwFlags,hEvent,pfnAPC,dwAPCData) - -#define IStreamSample_CompletionStatus(This,dwFlags,dwMilliseconds) \ - (This)->lpVtbl -> CompletionStatus(This,dwFlags,dwMilliseconds) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IStreamSample_GetMediaStream_Proxy( - IStreamSample * This, - /* [in] */ IMediaStream **ppMediaStream); - - -void __RPC_STUB IStreamSample_GetMediaStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IStreamSample_GetSampleTimes_Proxy( - IStreamSample * This, - /* [out] */ STREAM_TIME *pStartTime, - /* [out] */ STREAM_TIME *pEndTime, - /* [out] */ STREAM_TIME *pCurrentTime); - - -void __RPC_STUB IStreamSample_GetSampleTimes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IStreamSample_SetSampleTimes_Proxy( - IStreamSample * This, - /* [in] */ const STREAM_TIME *pStartTime, - /* [in] */ const STREAM_TIME *pEndTime); - - -void __RPC_STUB IStreamSample_SetSampleTimes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IStreamSample_Update_Proxy( - IStreamSample * This, - /* [in] */ DWORD dwFlags, - /* [in] */ HANDLE hEvent, - /* [in] */ PAPCFUNC pfnAPC, - /* [in] */ DWORD_PTR dwAPCData); - - -void __RPC_STUB IStreamSample_Update_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IStreamSample_CompletionStatus_Proxy( - IStreamSample * This, - /* [in] */ DWORD dwFlags, - /* [in] */ DWORD dwMilliseconds); - - -void __RPC_STUB IStreamSample_CompletionStatus_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IStreamSample_INTERFACE_DEFINED__ */ - - -/* Additional Prototypes for ALL interfaces */ - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/mpconfig.h b/import/DirectX8/include/mpconfig.h deleted file mode 100644 index 49f8cf107..000000000 --- a/import/DirectX8/include/mpconfig.h +++ /dev/null @@ -1,144 +0,0 @@ -//------------------------------------------------------------------------------ -// File: MPConfig.h -// -// Desc: -// -// Copyright (c) 1997-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __IMPConfig__ -#define __IMPConfig__ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum _AM_ASPECT_RATIO_MODE -{ - AM_ARMODE_STRETCHED, // don't do any aspect ratio correction - AM_ARMODE_LETTER_BOX, // letter box the video, paint background color in the excess region - AM_ARMODE_CROP, // crop the video to the right aspect ratio - AM_ARMODE_STRETCHED_AS_PRIMARY // follow whatever the primary stream does (in terms of the mode as well as pict-aspect-ratio values) -} AM_ASPECT_RATIO_MODE; - - -DECLARE_INTERFACE_(IMixerPinConfig, IUnknown) -{ - // this function sets the position of the stream in the display window, assuming - // that the window coordinates are {0, 0, 10000, 10000}. Thus giving arguments - // (0, 0, 5000, 5000) will put the stream in the top-left quarter. Any value greater - // than 10000 is invalid. - STDMETHOD (SetRelativePosition)(THIS_ - IN DWORD dwLeft, - IN DWORD dwTop, - IN DWORD dwRight, - IN DWORD dwBottom - ) PURE; - - // this function gets the position of the stream in the display window, assuming - // that the window coordinates are {0, 0, 10000, 10000}. Thus if the values returned - // are (0, 0, 5000, 5000), then it means that the stream is in the top-left quarter. - STDMETHOD (GetRelativePosition)(THIS_ - OUT DWORD *pdwLeft, - OUT DWORD *pdwTop, - OUT DWORD *pdwRight, - OUT DWORD *pdwBottom - ) PURE; - - // this function sets the ZOrder of the stream. The ZOrder of 0 is the closest - // to the eyes of the user, and increasing values imply greater distance. - STDMETHOD (SetZOrder)(THIS_ - IN DWORD dwZOrder - ) PURE; - - - // this function gets the ZOrder of the stream. The ZOrder of 0 is the closest - // to the eyes of the user, and increasing values imply greater distance. - STDMETHOD (GetZOrder)(THIS_ - OUT DWORD *pdwZOrder - ) PURE; - - // this function sets the colorkey being used by the stream. Setting this value on the - // primary stream sets the destination colorkey being used by the overlay surface. Setting - // this value on the secondary pin makes sense only if the stream is transparent. By default - // the destination colorkey is used as the colorkey for all transparent (secondary) streams. - STDMETHOD (SetColorKey)(THIS_ - IN COLORKEY *pColorKey - ) PURE; - - // this function gets the colorkey being used by the stream. Getting this value on the - // primary stream gets the destination colorkey being used by the overlay surface. Getting - // this value on the secondary pin returns the colorkey being used by that particular stream. - // When using this method, you are allowed to pass NULL for either pColorKey or pColor but - // not both. - STDMETHOD (GetColorKey)(THIS_ - OUT COLORKEY *pColorKey, - OUT DWORD *pColor - ) PURE; - - // this function sets the blending parameter which in turn defines, how the secondary stream - // is going to be blended with the primary stream. A value of 0 makes the secondary stream - // invisible, a value of 255 makes the primary stream invisible (in that region only ofcourse), - // and any value inbetween, say x, blends the secondary and primary streams in the ratio x : (255-x). - // If no value is set, the default is 255. - // Any value less than 0 or greater than 255 is invalid. Calling this function on the primary - // stream would result in a return value of E_UNEXPECTED. - STDMETHOD (SetBlendingParameter)(THIS_ - IN DWORD dwBlendingParameter - ) PURE; - - // this function gets the blending parameter which in turn defines, how the secondary stream - // is currently being blended with the primary stream. - STDMETHOD (GetBlendingParameter)(THIS_ - OUT DWORD *pdwBlendingParameter - ) PURE; - - - // this function is used to set the Aspect Ratio Correction mode on the pin. - // If the mode is set to letter box, black color is painted on the excess region - STDMETHOD (SetAspectRatioMode)(THIS_ - IN AM_ASPECT_RATIO_MODE amAspectRatioMode - ) PURE; - - // this function is used to get the Aspect Ratio Correction mode on the pin. - STDMETHOD (GetAspectRatioMode)(THIS_ - OUT AM_ASPECT_RATIO_MODE* pamAspectRatioMode - ) PURE; - - // this function sets the stream to be transparent. That means that the stream is not going - // to occupy the whole of the rectangle (specified by SetRelativePosition), some of the region - // is going to be transparent i.e. the stream underneath, is going to see through. - // Calling this function on the primary stream would result in a return value of E_UNEXPECTED. - STDMETHOD (SetStreamTransparent)(THIS_ - IN BOOL bStreamTransparent - ) PURE; - - // this function is used to tell whether the stream is transparent or not. - STDMETHOD (GetStreamTransparent)(THIS_ - OUT BOOL *pbStreamTransparent - ) PURE; -}; - - -DECLARE_INTERFACE_(IMixerPinConfig2, IMixerPinConfig) -{ - // this functions sets the color-controls, if the vga chip supports it. - STDMETHOD (SetOverlaySurfaceColorControls)(THIS_ - IN LPDDCOLORCONTROL pColorControl - ) PURE; - - // this functions gets the color-controls. It also returns the capability of the vga hardware - // in the dwFlags value of the struct. - STDMETHOD (GetOverlaySurfaceColorControls)(THIS_ - OUT LPDDCOLORCONTROL pColorControl - ) PURE; -}; - -#ifdef __cplusplus -} -#endif - - -#endif // #define __IMPConfig__ - diff --git a/import/DirectX8/include/mpegtype.h b/import/DirectX8/include/mpegtype.h deleted file mode 100644 index 4e79fcb00..000000000 --- a/import/DirectX8/include/mpegtype.h +++ /dev/null @@ -1,119 +0,0 @@ -//------------------------------------------------------------------------------ -// File: MPEGType.h -// -// Desc: MPEG system stream compound type definition -// -// Copyright (c) 1996-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __MPEGTYPE__ -#define __MPEGTYPE__ - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -// -// AM_MPEGSYSTEMTYPE defines the format block contents for -// data of type MEDIATYPE_MPEG1System when the format -// block GUID is FORMAT_MPEG1System -// -// The format block consists of elements of type -// AM_MPEGSYSTEMTYPE up to the length of the format block -// Each format block is 8-byte aligned from the start of -// the format block -// - -typedef struct tagAM_MPEGSTREAMTYPE -{ - DWORD dwStreamId; // Stream id of stream to process - DWORD dwReserved; // 8-byte alignment - AM_MEDIA_TYPE mt; // Type for substream - pbFormat is NULL - BYTE bFormat[1]; // Format data -} AM_MPEGSTREAMTYPE; - -typedef struct tagAM_MPEGSYSTEMTYPE -{ - DWORD dwBitRate; // Bits per second - DWORD cStreams; // Number of streams - AM_MPEGSTREAMTYPE Streams[1]; -} AM_MPEGSYSTEMTYPE; - -// -// Helper macros for AM_MPEGSTREAMTYPE -// -#define AM_MPEGSTREAMTYPE_ELEMENTLENGTH(pStreamType) \ - FIELD_OFFSET(AM_MPEGSTREAMTYPE, bFormat[(pStreamType)->mt.cbFormat]) -#define AM_MPEGSTREAMTYPE_NEXT(pStreamType) \ - ((AM_MPEGSTREAMTYPE *)((PBYTE)(pStreamType) + \ - ((AM_MPEGSTREAMTYPE_ELEMENTLENGTH(pStreamType) + 7) & ~7))) - -// -// IMpegAudioDecoder -// - -// Values for DualMode -#define AM_MPEG_AUDIO_DUAL_MERGE 0 -#define AM_MPEG_AUDIO_DUAL_LEFT 1 -#define AM_MPEG_AUDIO_DUAL_RIGHT 2 - -DECLARE_INTERFACE_(IMpegAudioDecoder, IUnknown) { - - STDMETHOD(get_FrequencyDivider) (THIS_ - unsigned long *pDivider /* [out] */ - ) PURE; - - STDMETHOD(put_FrequencyDivider) (THIS_ - unsigned long Divider /* [in] */ - ) PURE; - - STDMETHOD(get_DecoderAccuracy) (THIS_ - unsigned long *pAccuracy /* [out] */ - ) PURE; - - STDMETHOD(put_DecoderAccuracy) (THIS_ - unsigned long Accuracy /* [in] */ - ) PURE; - - STDMETHOD(get_Stereo) (THIS_ - unsigned long *pStereo /* [out] */ - ) PURE; - - STDMETHOD(put_Stereo) (THIS_ - unsigned long Stereo /* [in] */ - ) PURE; - - STDMETHOD(get_DecoderWordSize) (THIS_ - unsigned long *pWordSize /* [out] */ - ) PURE; - - STDMETHOD(put_DecoderWordSize) (THIS_ - unsigned long WordSize /* [in] */ - ) PURE; - - STDMETHOD(get_IntegerDecode) (THIS_ - unsigned long *pIntDecode /* [out] */ - ) PURE; - - STDMETHOD(put_IntegerDecode) (THIS_ - unsigned long IntDecode /* [in] */ - ) PURE; - - STDMETHOD(get_DualMode) (THIS_ - unsigned long *pIntDecode /* [out] */ - ) PURE; - - STDMETHOD(put_DualMode) (THIS_ - unsigned long IntDecode /* [in] */ - ) PURE; - - STDMETHOD(get_AudioFormat) (THIS_ - MPEG1WAVEFORMAT *lpFmt /* [out] */ - ) PURE; -}; - -#ifdef __cplusplus -} -#endif // __cplusplus -#endif // __MPEGTYPE__ diff --git a/import/DirectX8/include/multimon.h b/import/DirectX8/include/multimon.h deleted file mode 100644 index 88e2862a2..000000000 --- a/import/DirectX8/include/multimon.h +++ /dev/null @@ -1,484 +0,0 @@ -//============================================================================= -// -// multimon.h -- Stub module that fakes multiple monitor apis on Win32 OSes -// without them. -// -// By using this header your code will get back default values from -// GetSystemMetrics() for new metrics, and the new multimonitor APIs -// will act like only one display is present on a Win32 OS without -// multimonitor APIs. -// -// Exactly one source must include this with COMPILE_MULTIMON_STUBS defined. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -//============================================================================= - -#ifdef __cplusplus -extern "C" { // Assume C declarations for C++ -#endif // __cplusplus - -// -// If we are building with Win95/NT4 headers, we need to declare -// the multimonitor-related metrics and APIs ourselves. -// -#ifndef SM_CMONITORS - -#define SM_XVIRTUALSCREEN 76 -#define SM_YVIRTUALSCREEN 77 -#define SM_CXVIRTUALSCREEN 78 -#define SM_CYVIRTUALSCREEN 79 -#define SM_CMONITORS 80 -#define SM_SAMEDISPLAYFORMAT 81 - -// HMONITOR is already declared if WINVER >= 0x0500 in windef.h -// This is for components built with an older version number. -// -#if !defined(HMONITOR_DECLARED) && (WINVER < 0x0500) -DECLARE_HANDLE(HMONITOR); -#define HMONITOR_DECLARED -#endif - -#define MONITOR_DEFAULTTONULL 0x00000000 -#define MONITOR_DEFAULTTOPRIMARY 0x00000001 -#define MONITOR_DEFAULTTONEAREST 0x00000002 - -#define MONITORINFOF_PRIMARY 0x00000001 - -typedef struct tagMONITORINFO -{ - DWORD cbSize; - RECT rcMonitor; - RECT rcWork; - DWORD dwFlags; -} MONITORINFO, *LPMONITORINFO; - -#ifndef CCHDEVICENAME -#define CCHDEVICENAME 32 -#endif - -#ifdef __cplusplus -typedef struct tagMONITORINFOEXA : public tagMONITORINFO -{ - CHAR szDevice[CCHDEVICENAME]; -} MONITORINFOEXA, *LPMONITORINFOEXA; -typedef struct tagMONITORINFOEXW : public tagMONITORINFO -{ - WCHAR szDevice[CCHDEVICENAME]; -} MONITORINFOEXW, *LPMONITORINFOEXW; -#ifdef UNICODE -typedef MONITORINFOEXW MONITORINFOEX; -typedef LPMONITORINFOEXW LPMONITORINFOEX; -#else -typedef MONITORINFOEXA MONITORINFOEX; -typedef LPMONITORINFOEXA LPMONITORINFOEX; -#endif // UNICODE -#else // ndef __cplusplus -typedef struct tagMONITORINFOEXA -{ - MONITORINFO; - CHAR szDevice[CCHDEVICENAME]; -} MONITORINFOEXA, *LPMONITORINFOEXA; -typedef struct tagMONITORINFOEXW -{ - MONITORINFO; - WCHAR szDevice[CCHDEVICENAME]; -} MONITORINFOEXW, *LPMONITORINFOEXW; -#ifdef UNICODE -typedef MONITORINFOEXW MONITORINFOEX; -typedef LPMONITORINFOEXW LPMONITORINFOEX; -#else -typedef MONITORINFOEXA MONITORINFOEX; -typedef LPMONITORINFOEXA LPMONITORINFOEX; -#endif // UNICODE -#endif - -typedef BOOL (CALLBACK* MONITORENUMPROC)(HMONITOR, HDC, LPRECT, LPARAM); - -#ifndef DISPLAY_DEVICE_ATTACHED_TO_DESKTOP -typedef struct _DISPLAY_DEVICEA { - DWORD cb; - CHAR DeviceName[32]; - CHAR DeviceString[128]; - DWORD StateFlags; - CHAR DeviceID[128]; - CHAR DeviceKey[128]; -} DISPLAY_DEVICEA, *PDISPLAY_DEVICEA, *LPDISPLAY_DEVICEA; -typedef struct _DISPLAY_DEVICEW { - DWORD cb; - WCHAR DeviceName[32]; - WCHAR DeviceString[128]; - DWORD StateFlags; - WCHAR DeviceID[128]; - WCHAR DeviceKey[128]; -} DISPLAY_DEVICEW, *PDISPLAY_DEVICEW, *LPDISPLAY_DEVICEW; -#ifdef UNICODE -typedef DISPLAY_DEVICEW DISPLAY_DEVICE; -typedef PDISPLAY_DEVICEW PDISPLAY_DEVICE; -typedef LPDISPLAY_DEVICEW LPDISPLAY_DEVICE; -#else -typedef DISPLAY_DEVICEA DISPLAY_DEVICE; -typedef PDISPLAY_DEVICEA PDISPLAY_DEVICE; -typedef LPDISPLAY_DEVICEA LPDISPLAY_DEVICE; -#endif // UNICODE - -#define DISPLAY_DEVICE_ATTACHED_TO_DESKTOP 0x00000001 -#define DISPLAY_DEVICE_MULTI_DRIVER 0x00000002 -#define DISPLAY_DEVICE_PRIMARY_DEVICE 0x00000004 -#define DISPLAY_DEVICE_MIRRORING_DRIVER 0x00000008 -#define DISPLAY_DEVICE_VGA_COMPATIBLE 0x00000010 -#endif - -#endif // SM_CMONITORS - -#undef GetMonitorInfo -#undef GetSystemMetrics -#undef MonitorFromWindow -#undef MonitorFromRect -#undef MonitorFromPoint -#undef EnumDisplayMonitors -#undef EnumDisplayDevices - -// -// Define COMPILE_MULTIMON_STUBS to compile the stubs; -// otherwise, you get the declarations. -// -#ifdef COMPILE_MULTIMON_STUBS - -//----------------------------------------------------------------------------- -// -// Implement the API stubs. -// -//----------------------------------------------------------------------------- - -#ifndef MULTIMON_FNS_DEFINED - -int (WINAPI* g_pfnGetSystemMetrics)(int) = NULL; -HMONITOR (WINAPI* g_pfnMonitorFromWindow)(HWND, DWORD) = NULL; -HMONITOR (WINAPI* g_pfnMonitorFromRect)(LPCRECT, DWORD) = NULL; -HMONITOR (WINAPI* g_pfnMonitorFromPoint)(POINT, DWORD) = NULL; -BOOL (WINAPI* g_pfnGetMonitorInfo)(HMONITOR, LPMONITORINFO) = NULL; -BOOL (WINAPI* g_pfnEnumDisplayMonitors)(HDC, LPCRECT, MONITORENUMPROC, LPARAM) = NULL; -BOOL (WINAPI* g_pfnEnumDisplayDevices)(PVOID, DWORD, PDISPLAY_DEVICE,DWORD) = NULL; -BOOL g_fMultiMonInitDone = FALSE; -BOOL g_fMultimonPlatformNT = FALSE; - -#endif - -BOOL IsPlatformNT() -{ - OSVERSIONINFOA osvi = {0}; - osvi.dwOSVersionInfoSize = sizeof(osvi); - GetVersionExA((OSVERSIONINFOA*)&osvi); - return (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId); -} - -BOOL InitMultipleMonitorStubs(void) -{ - HMODULE hUser32; - if (g_fMultiMonInitDone) - { - return g_pfnGetMonitorInfo != NULL; - } - - g_fMultimonPlatformNT = IsPlatformNT(); - hUser32 = GetModuleHandle(TEXT("USER32")); - if (hUser32 && - (*(FARPROC*)&g_pfnGetSystemMetrics = GetProcAddress(hUser32,"GetSystemMetrics")) != NULL && - (*(FARPROC*)&g_pfnMonitorFromWindow = GetProcAddress(hUser32,"MonitorFromWindow")) != NULL && - (*(FARPROC*)&g_pfnMonitorFromRect = GetProcAddress(hUser32,"MonitorFromRect")) != NULL && - (*(FARPROC*)&g_pfnMonitorFromPoint = GetProcAddress(hUser32,"MonitorFromPoint")) != NULL && - (*(FARPROC*)&g_pfnEnumDisplayMonitors = GetProcAddress(hUser32,"EnumDisplayMonitors")) != NULL && -#ifdef UNICODE - (*(FARPROC*)&g_pfnEnumDisplayDevices = GetProcAddress(hUser32,"EnumDisplayDevicesW")) != NULL && - (*(FARPROC*)&g_pfnGetMonitorInfo = g_fMultimonPlatformNT ? GetProcAddress(hUser32,"GetMonitorInfoW") : - GetProcAddress(hUser32,"GetMonitorInfoA")) != NULL -#else - (*(FARPROC*)&g_pfnGetMonitorInfo = GetProcAddress(hUser32,"GetMonitorInfoA")) != NULL && - (*(FARPROC*)&g_pfnEnumDisplayDevices = GetProcAddress(hUser32,"EnumDisplayDevicesA")) != NULL -#endif - ) { - g_fMultiMonInitDone = TRUE; - return TRUE; - } - else - { - g_pfnGetSystemMetrics = NULL; - g_pfnMonitorFromWindow = NULL; - g_pfnMonitorFromRect = NULL; - g_pfnMonitorFromPoint = NULL; - g_pfnGetMonitorInfo = NULL; - g_pfnEnumDisplayMonitors = NULL; - g_pfnEnumDisplayDevices = NULL; - - g_fMultiMonInitDone = TRUE; - return FALSE; - } -} - -//----------------------------------------------------------------------------- -// -// fake implementations of Monitor APIs that work with the primary display -// no special parameter validation is made since these run in client code -// -//----------------------------------------------------------------------------- - -int WINAPI -xGetSystemMetrics(int nIndex) -{ - if (InitMultipleMonitorStubs()) - return g_pfnGetSystemMetrics(nIndex); - - switch (nIndex) - { - case SM_CMONITORS: - case SM_SAMEDISPLAYFORMAT: - return 1; - - case SM_XVIRTUALSCREEN: - case SM_YVIRTUALSCREEN: - return 0; - - case SM_CXVIRTUALSCREEN: - nIndex = SM_CXSCREEN; - break; - - case SM_CYVIRTUALSCREEN: - nIndex = SM_CYSCREEN; - break; - } - - return GetSystemMetrics(nIndex); -} - -#define xPRIMARY_MONITOR ((HMONITOR)0x12340042) - -HMONITOR WINAPI -xMonitorFromPoint(POINT ptScreenCoords, DWORD dwFlags) -{ - if (InitMultipleMonitorStubs()) - return g_pfnMonitorFromPoint(ptScreenCoords, dwFlags); - - if ((dwFlags & (MONITOR_DEFAULTTOPRIMARY | MONITOR_DEFAULTTONEAREST)) || - ((ptScreenCoords.x >= 0) && - (ptScreenCoords.x < GetSystemMetrics(SM_CXSCREEN)) && - (ptScreenCoords.y >= 0) && - (ptScreenCoords.y < GetSystemMetrics(SM_CYSCREEN)))) - { - return xPRIMARY_MONITOR; - } - - return NULL; -} - -HMONITOR WINAPI -xMonitorFromRect(LPCRECT lprcScreenCoords, DWORD dwFlags) -{ - if (InitMultipleMonitorStubs()) - return g_pfnMonitorFromRect(lprcScreenCoords, dwFlags); - - if ((dwFlags & (MONITOR_DEFAULTTOPRIMARY | MONITOR_DEFAULTTONEAREST)) || - ((lprcScreenCoords->right > 0) && - (lprcScreenCoords->bottom > 0) && - (lprcScreenCoords->left < GetSystemMetrics(SM_CXSCREEN)) && - (lprcScreenCoords->top < GetSystemMetrics(SM_CYSCREEN)))) - { - return xPRIMARY_MONITOR; - } - - return NULL; -} - -HMONITOR WINAPI -xMonitorFromWindow(HWND hWnd, DWORD dwFlags) -{ - WINDOWPLACEMENT wp; - - if (InitMultipleMonitorStubs()) - return g_pfnMonitorFromWindow(hWnd, dwFlags); - - if (dwFlags & (MONITOR_DEFAULTTOPRIMARY | MONITOR_DEFAULTTONEAREST)) - return xPRIMARY_MONITOR; - - if (IsIconic(hWnd) ? - GetWindowPlacement(hWnd, &wp) : - GetWindowRect(hWnd, &wp.rcNormalPosition)) { - - return xMonitorFromRect(&wp.rcNormalPosition, dwFlags); - } - - return NULL; -} - -BOOL WINAPI -xGetMonitorInfo(HMONITOR hMonitor, LPMONITORINFO lpMonitorInfo) -{ - RECT rcWork; - - if (InitMultipleMonitorStubs()) - { - BOOL f = g_pfnGetMonitorInfo(hMonitor, lpMonitorInfo); -#ifdef UNICODE - if (f && !g_fMultimonPlatformNT && (lpMonitorInfo->cbSize >= sizeof(MONITORINFOEX))) - { - MultiByteToWideChar(CP_ACP, 0, - (LPSTR)((MONITORINFOEX*)lpMonitorInfo)->szDevice, -1, - ((MONITORINFOEX*)lpMonitorInfo)->szDevice, (sizeof(((MONITORINFOEX*)lpMonitorInfo)->szDevice)/sizeof(TCHAR))); - } -#endif - return f; - } - - if ((hMonitor == xPRIMARY_MONITOR) && - lpMonitorInfo && - (lpMonitorInfo->cbSize >= sizeof(MONITORINFO)) && - SystemParametersInfoA(SPI_GETWORKAREA, 0, &rcWork, 0)) - { - lpMonitorInfo->rcMonitor.left = 0; - lpMonitorInfo->rcMonitor.top = 0; - lpMonitorInfo->rcMonitor.right = GetSystemMetrics(SM_CXSCREEN); - lpMonitorInfo->rcMonitor.bottom = GetSystemMetrics(SM_CYSCREEN); - lpMonitorInfo->rcWork = rcWork; - lpMonitorInfo->dwFlags = MONITORINFOF_PRIMARY; - - if (lpMonitorInfo->cbSize >= sizeof(MONITORINFOEX)) - { -#ifdef UNICODE - MultiByteToWideChar(CP_ACP, 0, "DISPLAY", -1, ((MONITORINFOEX*)lpMonitorInfo)->szDevice, (sizeof(((MONITORINFOEX*)lpMonitorInfo)->szDevice)/sizeof(TCHAR))); -#else // UNICODE - lstrcpy(((MONITORINFOEX*)lpMonitorInfo)->szDevice, TEXT("DISPLAY")); -#endif // UNICODE - } - - return TRUE; - } - - return FALSE; -} - -BOOL WINAPI -xEnumDisplayMonitors( - HDC hdcOptionalForPainting, - LPCRECT lprcEnumMonitorsThatIntersect, - MONITORENUMPROC lpfnEnumProc, - LPARAM dwData) -{ - RECT rcLimit; - - if (InitMultipleMonitorStubs()) { - return g_pfnEnumDisplayMonitors( - hdcOptionalForPainting, - lprcEnumMonitorsThatIntersect, - lpfnEnumProc, - dwData); - } - - if (!lpfnEnumProc) - return FALSE; - - rcLimit.left = 0; - rcLimit.top = 0; - rcLimit.right = GetSystemMetrics(SM_CXSCREEN); - rcLimit.bottom = GetSystemMetrics(SM_CYSCREEN); - - if (hdcOptionalForPainting) - { - RECT rcClip; - POINT ptOrg; - - switch (GetClipBox(hdcOptionalForPainting, &rcClip)) - { - default: - if (!GetDCOrgEx(hdcOptionalForPainting, &ptOrg)) - return FALSE; - - OffsetRect(&rcLimit, -ptOrg.x, -ptOrg.y); - if (IntersectRect(&rcLimit, &rcLimit, &rcClip) && - (!lprcEnumMonitorsThatIntersect || - IntersectRect(&rcLimit, &rcLimit, lprcEnumMonitorsThatIntersect))) { - - break; - } - //fall thru - case NULLREGION: - return TRUE; - case ERROR: - return FALSE; - } - } else { - if ( lprcEnumMonitorsThatIntersect && - !IntersectRect(&rcLimit, &rcLimit, lprcEnumMonitorsThatIntersect)) { - - return TRUE; - } - } - - return lpfnEnumProc( - xPRIMARY_MONITOR, - hdcOptionalForPainting, - &rcLimit, - dwData); -} - -BOOL WINAPI -xEnumDisplayDevices( - PVOID Unused, - DWORD iDevNum, - PDISPLAY_DEVICE lpDisplayDevice, - DWORD dwFlags) -{ - if (InitMultipleMonitorStubs()) - return g_pfnEnumDisplayDevices(Unused, iDevNum, lpDisplayDevice, dwFlags); - - if (Unused != NULL) - return FALSE; - - if (iDevNum != 0) - return FALSE; - - if (lpDisplayDevice == NULL || lpDisplayDevice->cb < sizeof(DISPLAY_DEVICE)) - return FALSE; - -#ifdef UNICODE - MultiByteToWideChar(CP_ACP, 0, "DISPLAY", -1, lpDisplayDevice->DeviceName, (sizeof(lpDisplayDevice->DeviceName)/sizeof(TCHAR))); - MultiByteToWideChar(CP_ACP, 0, "DISPLAY", -1, lpDisplayDevice->DeviceString, (sizeof(lpDisplayDevice->DeviceName)/sizeof(TCHAR))); -#else // UNICODE - lstrcpy((LPTSTR)lpDisplayDevice->DeviceName, TEXT("DISPLAY")); - lstrcpy((LPTSTR)lpDisplayDevice->DeviceString, TEXT("DISPLAY")); -#endif // UNICODE - - lpDisplayDevice->StateFlags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE; - - return TRUE; -} - -#undef xPRIMARY_MONITOR -#undef COMPILE_MULTIMON_STUBS - -#else // COMPILE_MULTIMON_STUBS - -extern int WINAPI xGetSystemMetrics(int); -extern HMONITOR WINAPI xMonitorFromWindow(HWND, DWORD); -extern HMONITOR WINAPI xMonitorFromRect(LPCRECT, DWORD); -extern HMONITOR WINAPI xMonitorFromPoint(POINT, DWORD); -extern BOOL WINAPI xGetMonitorInfo(HMONITOR, LPMONITORINFO); -extern BOOL WINAPI xEnumDisplayMonitors(HDC, LPCRECT, MONITORENUMPROC, LPARAM); -extern BOOL WINAPI xEnumDisplayDevices(PVOID, DWORD, PDISPLAY_DEVICE, DWORD); - -#endif // COMPILE_MULTIMON_STUBS - -// -// build defines that replace the regular APIs with our versions -// -#define GetSystemMetrics xGetSystemMetrics -#define MonitorFromWindow xMonitorFromWindow -#define MonitorFromRect xMonitorFromRect -#define MonitorFromPoint xMonitorFromPoint -#define GetMonitorInfo xGetMonitorInfo -#define EnumDisplayMonitors xEnumDisplayMonitors -#define EnumDisplayDevices xEnumDisplayDevices - -#ifdef __cplusplus -} -#endif // __cplusplus - diff --git a/import/DirectX8/include/playlist.h b/import/DirectX8/include/playlist.h deleted file mode 100644 index 605275601..000000000 --- a/import/DirectX8/include/playlist.h +++ /dev/null @@ -1,847 +0,0 @@ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 5.03.0286 */ -/* Compiler settings for playlist.idl: - Oicf (OptLev=i2), W1, Zp8, env=Win32 (32b run), ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __playlist_h__ -#define __playlist_h__ - -/* Forward Declarations */ - -#ifndef __IAMPlayListItem_FWD_DEFINED__ -#define __IAMPlayListItem_FWD_DEFINED__ -typedef interface IAMPlayListItem IAMPlayListItem; -#endif /* __IAMPlayListItem_FWD_DEFINED__ */ - - -#ifndef __IAMPlayList_FWD_DEFINED__ -#define __IAMPlayList_FWD_DEFINED__ -typedef interface IAMPlayList IAMPlayList; -#endif /* __IAMPlayList_FWD_DEFINED__ */ - - -#ifndef __ISpecifyParticularPages_FWD_DEFINED__ -#define __ISpecifyParticularPages_FWD_DEFINED__ -typedef interface ISpecifyParticularPages ISpecifyParticularPages; -#endif /* __ISpecifyParticularPages_FWD_DEFINED__ */ - - -#ifndef __IAMRebuild_FWD_DEFINED__ -#define __IAMRebuild_FWD_DEFINED__ -typedef interface IAMRebuild IAMRebuild; -#endif /* __IAMRebuild_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "unknwn.h" -#include "strmif.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void __RPC_FAR * ); - -/* interface __MIDL_itf_playlist_0000 */ -/* [local] */ - - -enum AMPlayListItemFlags - { AMPLAYLISTITEM_CANSKIP = 0x1, - AMPLAYLISTITEM_CANBIND = 0x2 - }; - - -extern RPC_IF_HANDLE __MIDL_itf_playlist_0000_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_playlist_0000_v0_0_s_ifspec; - -#ifndef __IAMPlayListItem_INTERFACE_DEFINED__ -#define __IAMPlayListItem_INTERFACE_DEFINED__ - -/* interface IAMPlayListItem */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMPlayListItem; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868ff-0ad4-11ce-b03a-0020af0ba770") - IAMPlayListItem : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetFlags( - /* [out] */ DWORD __RPC_FAR *pdwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSourceCount( - /* [out] */ DWORD __RPC_FAR *pdwSources) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSourceURL( - /* [in] */ DWORD dwSourceIndex, - /* [out] */ BSTR __RPC_FAR *pbstrURL) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSourceStart( - /* [in] */ DWORD dwSourceIndex, - /* [out] */ REFERENCE_TIME __RPC_FAR *prtStart) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSourceDuration( - /* [in] */ DWORD dwSourceIndex, - /* [out] */ REFERENCE_TIME __RPC_FAR *prtDuration) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSourceStartMarker( - /* [in] */ DWORD dwSourceIndex, - /* [out] */ DWORD __RPC_FAR *pdwMarker) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSourceEndMarker( - /* [in] */ DWORD dwSourceIndex, - /* [out] */ DWORD __RPC_FAR *pdwMarker) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSourceStartMarkerName( - /* [in] */ DWORD dwSourceIndex, - /* [out] */ BSTR __RPC_FAR *pbstrStartMarker) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSourceEndMarkerName( - /* [in] */ DWORD dwSourceIndex, - /* [out] */ BSTR __RPC_FAR *pbstrEndMarker) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetLinkURL( - /* [out] */ BSTR __RPC_FAR *pbstrURL) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetScanDuration( - /* [in] */ DWORD dwSourceIndex, - /* [out] */ REFERENCE_TIME __RPC_FAR *prtScanDuration) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMPlayListItemVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( - IAMPlayListItem __RPC_FAR * This); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( - IAMPlayListItem __RPC_FAR * This); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetFlags )( - IAMPlayListItem __RPC_FAR * This, - /* [out] */ DWORD __RPC_FAR *pdwFlags); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSourceCount )( - IAMPlayListItem __RPC_FAR * This, - /* [out] */ DWORD __RPC_FAR *pdwSources); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSourceURL )( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ DWORD dwSourceIndex, - /* [out] */ BSTR __RPC_FAR *pbstrURL); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSourceStart )( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ DWORD dwSourceIndex, - /* [out] */ REFERENCE_TIME __RPC_FAR *prtStart); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSourceDuration )( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ DWORD dwSourceIndex, - /* [out] */ REFERENCE_TIME __RPC_FAR *prtDuration); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSourceStartMarker )( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ DWORD dwSourceIndex, - /* [out] */ DWORD __RPC_FAR *pdwMarker); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSourceEndMarker )( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ DWORD dwSourceIndex, - /* [out] */ DWORD __RPC_FAR *pdwMarker); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSourceStartMarkerName )( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ DWORD dwSourceIndex, - /* [out] */ BSTR __RPC_FAR *pbstrStartMarker); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSourceEndMarkerName )( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ DWORD dwSourceIndex, - /* [out] */ BSTR __RPC_FAR *pbstrEndMarker); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetLinkURL )( - IAMPlayListItem __RPC_FAR * This, - /* [out] */ BSTR __RPC_FAR *pbstrURL); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetScanDuration )( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ DWORD dwSourceIndex, - /* [out] */ REFERENCE_TIME __RPC_FAR *prtScanDuration); - - END_INTERFACE - } IAMPlayListItemVtbl; - - interface IAMPlayListItem - { - CONST_VTBL struct IAMPlayListItemVtbl __RPC_FAR *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMPlayListItem_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMPlayListItem_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMPlayListItem_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMPlayListItem_GetFlags(This,pdwFlags) \ - (This)->lpVtbl -> GetFlags(This,pdwFlags) - -#define IAMPlayListItem_GetSourceCount(This,pdwSources) \ - (This)->lpVtbl -> GetSourceCount(This,pdwSources) - -#define IAMPlayListItem_GetSourceURL(This,dwSourceIndex,pbstrURL) \ - (This)->lpVtbl -> GetSourceURL(This,dwSourceIndex,pbstrURL) - -#define IAMPlayListItem_GetSourceStart(This,dwSourceIndex,prtStart) \ - (This)->lpVtbl -> GetSourceStart(This,dwSourceIndex,prtStart) - -#define IAMPlayListItem_GetSourceDuration(This,dwSourceIndex,prtDuration) \ - (This)->lpVtbl -> GetSourceDuration(This,dwSourceIndex,prtDuration) - -#define IAMPlayListItem_GetSourceStartMarker(This,dwSourceIndex,pdwMarker) \ - (This)->lpVtbl -> GetSourceStartMarker(This,dwSourceIndex,pdwMarker) - -#define IAMPlayListItem_GetSourceEndMarker(This,dwSourceIndex,pdwMarker) \ - (This)->lpVtbl -> GetSourceEndMarker(This,dwSourceIndex,pdwMarker) - -#define IAMPlayListItem_GetSourceStartMarkerName(This,dwSourceIndex,pbstrStartMarker) \ - (This)->lpVtbl -> GetSourceStartMarkerName(This,dwSourceIndex,pbstrStartMarker) - -#define IAMPlayListItem_GetSourceEndMarkerName(This,dwSourceIndex,pbstrEndMarker) \ - (This)->lpVtbl -> GetSourceEndMarkerName(This,dwSourceIndex,pbstrEndMarker) - -#define IAMPlayListItem_GetLinkURL(This,pbstrURL) \ - (This)->lpVtbl -> GetLinkURL(This,pbstrURL) - -#define IAMPlayListItem_GetScanDuration(This,dwSourceIndex,prtScanDuration) \ - (This)->lpVtbl -> GetScanDuration(This,dwSourceIndex,prtScanDuration) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMPlayListItem_GetFlags_Proxy( - IAMPlayListItem __RPC_FAR * This, - /* [out] */ DWORD __RPC_FAR *pdwFlags); - - -void __RPC_STUB IAMPlayListItem_GetFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPlayListItem_GetSourceCount_Proxy( - IAMPlayListItem __RPC_FAR * This, - /* [out] */ DWORD __RPC_FAR *pdwSources); - - -void __RPC_STUB IAMPlayListItem_GetSourceCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPlayListItem_GetSourceURL_Proxy( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ DWORD dwSourceIndex, - /* [out] */ BSTR __RPC_FAR *pbstrURL); - - -void __RPC_STUB IAMPlayListItem_GetSourceURL_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPlayListItem_GetSourceStart_Proxy( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ DWORD dwSourceIndex, - /* [out] */ REFERENCE_TIME __RPC_FAR *prtStart); - - -void __RPC_STUB IAMPlayListItem_GetSourceStart_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPlayListItem_GetSourceDuration_Proxy( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ DWORD dwSourceIndex, - /* [out] */ REFERENCE_TIME __RPC_FAR *prtDuration); - - -void __RPC_STUB IAMPlayListItem_GetSourceDuration_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPlayListItem_GetSourceStartMarker_Proxy( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ DWORD dwSourceIndex, - /* [out] */ DWORD __RPC_FAR *pdwMarker); - - -void __RPC_STUB IAMPlayListItem_GetSourceStartMarker_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPlayListItem_GetSourceEndMarker_Proxy( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ DWORD dwSourceIndex, - /* [out] */ DWORD __RPC_FAR *pdwMarker); - - -void __RPC_STUB IAMPlayListItem_GetSourceEndMarker_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPlayListItem_GetSourceStartMarkerName_Proxy( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ DWORD dwSourceIndex, - /* [out] */ BSTR __RPC_FAR *pbstrStartMarker); - - -void __RPC_STUB IAMPlayListItem_GetSourceStartMarkerName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPlayListItem_GetSourceEndMarkerName_Proxy( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ DWORD dwSourceIndex, - /* [out] */ BSTR __RPC_FAR *pbstrEndMarker); - - -void __RPC_STUB IAMPlayListItem_GetSourceEndMarkerName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPlayListItem_GetLinkURL_Proxy( - IAMPlayListItem __RPC_FAR * This, - /* [out] */ BSTR __RPC_FAR *pbstrURL); - - -void __RPC_STUB IAMPlayListItem_GetLinkURL_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPlayListItem_GetScanDuration_Proxy( - IAMPlayListItem __RPC_FAR * This, - /* [in] */ DWORD dwSourceIndex, - /* [out] */ REFERENCE_TIME __RPC_FAR *prtScanDuration); - - -void __RPC_STUB IAMPlayListItem_GetScanDuration_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMPlayListItem_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_playlist_0348 */ -/* [local] */ - - -enum AMPlayListFlags - { AMPLAYLIST_STARTINSCANMODE = 0x1, - AMPLAYLIST_FORCEBANNER = 0x2 - }; - -enum AMPlayListEventFlags - { AMPLAYLISTEVENT_RESUME = 0, - AMPLAYLISTEVENT_BREAK = 0x1, - AMPLAYLISTEVENT_NEXT = 0x2, - AMPLAYLISTEVENT_MASK = 0xf, - AMPLAYLISTEVENT_REFRESH = 0x10 - }; - - -extern RPC_IF_HANDLE __MIDL_itf_playlist_0348_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_playlist_0348_v0_0_s_ifspec; - -#ifndef __IAMPlayList_INTERFACE_DEFINED__ -#define __IAMPlayList_INTERFACE_DEFINED__ - -/* interface IAMPlayList */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMPlayList; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868fe-0ad4-11ce-b03a-0020af0ba770") - IAMPlayList : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetFlags( - /* [out] */ DWORD __RPC_FAR *pdwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetItemCount( - /* [out] */ DWORD __RPC_FAR *pdwItems) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetItem( - /* [in] */ DWORD dwItemIndex, - /* [out] */ IAMPlayListItem __RPC_FAR *__RPC_FAR *ppItem) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNamedEvent( - /* [in] */ WCHAR __RPC_FAR *pwszEventName, - /* [in] */ DWORD dwItemIndex, - /* [out] */ IAMPlayListItem __RPC_FAR *__RPC_FAR *ppItem, - /* [out] */ DWORD __RPC_FAR *pdwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetRepeatInfo( - /* [out] */ DWORD __RPC_FAR *pdwRepeatCount, - /* [out] */ DWORD __RPC_FAR *pdwRepeatStart, - /* [out] */ DWORD __RPC_FAR *pdwRepeatEnd) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMPlayListVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( - IAMPlayList __RPC_FAR * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( - IAMPlayList __RPC_FAR * This); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( - IAMPlayList __RPC_FAR * This); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetFlags )( - IAMPlayList __RPC_FAR * This, - /* [out] */ DWORD __RPC_FAR *pdwFlags); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetItemCount )( - IAMPlayList __RPC_FAR * This, - /* [out] */ DWORD __RPC_FAR *pdwItems); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetItem )( - IAMPlayList __RPC_FAR * This, - /* [in] */ DWORD dwItemIndex, - /* [out] */ IAMPlayListItem __RPC_FAR *__RPC_FAR *ppItem); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetNamedEvent )( - IAMPlayList __RPC_FAR * This, - /* [in] */ WCHAR __RPC_FAR *pwszEventName, - /* [in] */ DWORD dwItemIndex, - /* [out] */ IAMPlayListItem __RPC_FAR *__RPC_FAR *ppItem, - /* [out] */ DWORD __RPC_FAR *pdwFlags); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetRepeatInfo )( - IAMPlayList __RPC_FAR * This, - /* [out] */ DWORD __RPC_FAR *pdwRepeatCount, - /* [out] */ DWORD __RPC_FAR *pdwRepeatStart, - /* [out] */ DWORD __RPC_FAR *pdwRepeatEnd); - - END_INTERFACE - } IAMPlayListVtbl; - - interface IAMPlayList - { - CONST_VTBL struct IAMPlayListVtbl __RPC_FAR *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMPlayList_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMPlayList_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMPlayList_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMPlayList_GetFlags(This,pdwFlags) \ - (This)->lpVtbl -> GetFlags(This,pdwFlags) - -#define IAMPlayList_GetItemCount(This,pdwItems) \ - (This)->lpVtbl -> GetItemCount(This,pdwItems) - -#define IAMPlayList_GetItem(This,dwItemIndex,ppItem) \ - (This)->lpVtbl -> GetItem(This,dwItemIndex,ppItem) - -#define IAMPlayList_GetNamedEvent(This,pwszEventName,dwItemIndex,ppItem,pdwFlags) \ - (This)->lpVtbl -> GetNamedEvent(This,pwszEventName,dwItemIndex,ppItem,pdwFlags) - -#define IAMPlayList_GetRepeatInfo(This,pdwRepeatCount,pdwRepeatStart,pdwRepeatEnd) \ - (This)->lpVtbl -> GetRepeatInfo(This,pdwRepeatCount,pdwRepeatStart,pdwRepeatEnd) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMPlayList_GetFlags_Proxy( - IAMPlayList __RPC_FAR * This, - /* [out] */ DWORD __RPC_FAR *pdwFlags); - - -void __RPC_STUB IAMPlayList_GetFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPlayList_GetItemCount_Proxy( - IAMPlayList __RPC_FAR * This, - /* [out] */ DWORD __RPC_FAR *pdwItems); - - -void __RPC_STUB IAMPlayList_GetItemCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPlayList_GetItem_Proxy( - IAMPlayList __RPC_FAR * This, - /* [in] */ DWORD dwItemIndex, - /* [out] */ IAMPlayListItem __RPC_FAR *__RPC_FAR *ppItem); - - -void __RPC_STUB IAMPlayList_GetItem_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPlayList_GetNamedEvent_Proxy( - IAMPlayList __RPC_FAR * This, - /* [in] */ WCHAR __RPC_FAR *pwszEventName, - /* [in] */ DWORD dwItemIndex, - /* [out] */ IAMPlayListItem __RPC_FAR *__RPC_FAR *ppItem, - /* [out] */ DWORD __RPC_FAR *pdwFlags); - - -void __RPC_STUB IAMPlayList_GetNamedEvent_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPlayList_GetRepeatInfo_Proxy( - IAMPlayList __RPC_FAR * This, - /* [out] */ DWORD __RPC_FAR *pdwRepeatCount, - /* [out] */ DWORD __RPC_FAR *pdwRepeatStart, - /* [out] */ DWORD __RPC_FAR *pdwRepeatEnd); - - -void __RPC_STUB IAMPlayList_GetRepeatInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMPlayList_INTERFACE_DEFINED__ */ - - -#ifndef __ISpecifyParticularPages_INTERFACE_DEFINED__ -#define __ISpecifyParticularPages_INTERFACE_DEFINED__ - -/* interface ISpecifyParticularPages */ -/* [object][helpstring][uuid] */ - - -EXTERN_C const IID IID_ISpecifyParticularPages; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("4C437B91-6E9E-11d1-A704-006097C4E476") - ISpecifyParticularPages : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetPages( - /* [in] */ REFGUID guidWhatPages, - /* [out] */ CAUUID __RPC_FAR *pPages) = 0; - - }; - -#else /* C style interface */ - - typedef struct ISpecifyParticularPagesVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( - ISpecifyParticularPages __RPC_FAR * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( - ISpecifyParticularPages __RPC_FAR * This); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( - ISpecifyParticularPages __RPC_FAR * This); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetPages )( - ISpecifyParticularPages __RPC_FAR * This, - /* [in] */ REFGUID guidWhatPages, - /* [out] */ CAUUID __RPC_FAR *pPages); - - END_INTERFACE - } ISpecifyParticularPagesVtbl; - - interface ISpecifyParticularPages - { - CONST_VTBL struct ISpecifyParticularPagesVtbl __RPC_FAR *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ISpecifyParticularPages_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ISpecifyParticularPages_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ISpecifyParticularPages_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ISpecifyParticularPages_GetPages(This,guidWhatPages,pPages) \ - (This)->lpVtbl -> GetPages(This,guidWhatPages,pPages) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE ISpecifyParticularPages_GetPages_Proxy( - ISpecifyParticularPages __RPC_FAR * This, - /* [in] */ REFGUID guidWhatPages, - /* [out] */ CAUUID __RPC_FAR *pPages); - - -void __RPC_STUB ISpecifyParticularPages_GetPages_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ISpecifyParticularPages_INTERFACE_DEFINED__ */ - - -#ifndef __IAMRebuild_INTERFACE_DEFINED__ -#define __IAMRebuild_INTERFACE_DEFINED__ - -/* interface IAMRebuild */ -/* [object][helpstring][uuid][local] */ - - -EXTERN_C const IID IID_IAMRebuild; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("02EF04DD-7580-11d1-BECE-00C04FB6E937") - IAMRebuild : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE RebuildNow( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMRebuildVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( - IAMRebuild __RPC_FAR * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( - IAMRebuild __RPC_FAR * This); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( - IAMRebuild __RPC_FAR * This); - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RebuildNow )( - IAMRebuild __RPC_FAR * This); - - END_INTERFACE - } IAMRebuildVtbl; - - interface IAMRebuild - { - CONST_VTBL struct IAMRebuildVtbl __RPC_FAR *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMRebuild_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMRebuild_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMRebuild_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMRebuild_RebuildNow(This) \ - (This)->lpVtbl -> RebuildNow(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMRebuild_RebuildNow_Proxy( - IAMRebuild __RPC_FAR * This); - - -void __RPC_STUB IAMRebuild_RebuildNow_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMRebuild_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_playlist_0351 */ -/* [local] */ - -EXTERN_GUID(IID_IAMPlayListItem,0x56a868ff,0x0ad4,0x11ce,0xb0,0xa3,0x0,0x20,0xaf,0x0b,0xa7,0x70); -EXTERN_GUID(IID_IAMRebuild,0x2ef04dd,0x7580,0x11d1,0xbe,0xce,0x0,0xc0,0x4f,0xb6,0xe9,0x37); -EXTERN_GUID(IID_IAMPlayList,0x56a868fe,0x0ad4,0x11ce,0xb0,0xa3,0x0,0x20,0xaf,0x0b,0xa7,0x70); -EXTERN_GUID(SPECIFYPAGES_STATISTICS,0x4c437b92,0x6e9e,0x11d1,0xa7,0x4,0x0,0x60,0x97,0xc4,0xe4,0x76); -EXTERN_GUID(IID_ISpecifyParticularPages,0x4c437b91,0x6e9e,0x11d1,0xa7,0x4,0x0,0x60,0x97,0xc4,0xe4,0x76); - - -extern RPC_IF_HANDLE __MIDL_itf_playlist_0351_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_playlist_0351_v0_0_s_ifspec; - -/* Additional Prototypes for ALL interfaces */ - -unsigned long __RPC_USER BSTR_UserSize( unsigned long __RPC_FAR *, unsigned long , BSTR __RPC_FAR * ); -unsigned char __RPC_FAR * __RPC_USER BSTR_UserMarshal( unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); -unsigned char __RPC_FAR * __RPC_USER BSTR_UserUnmarshal(unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); -void __RPC_USER BSTR_UserFree( unsigned long __RPC_FAR *, BSTR __RPC_FAR * ); - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/qedit.h b/import/DirectX8/include/qedit.h deleted file mode 100644 index ce9a171dc..000000000 --- a/import/DirectX8/include/qedit.h +++ /dev/null @@ -1,19878 +0,0 @@ -//+------------------------------------------------------------------------- -// -// Microsoft Windows -// Copyright (C) Microsoft Corporation, 1999-2001. -// -//-------------------------------------------------------------------------- - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 6.00.0347 */ -/* Compiler settings for qedit.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// Separate the updated Windows XP version of this header from the downlevel -// version that shipped with the DirectX 8.0 SDK. Since development -// on BDA technology continued for Windows XP, some changes were made to -// this file in order to improve the interface and functionality. -// -// To maintain compatibility with older applications which rely on the -// DirectX 8.0 versions of these files, the DirectX 8.1 version includes -// both the Windows XP content and the DirectX 8.0 content, which are -// separated by the #if (WINVER >= 0x501) preprocessor directive. -// -// Therefore, if you define WINVER to be 0x501 to specify Windows XP, -// the revised content will be compiled. Otherwise, the original -// DirectX 8.0 content will be used. -// -///////////////////////////////////////////////////////////////////////////// - -#if (WINVER >= 0x501) // Windows XP content - - - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __qedit_h__ -#define __qedit_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __IPropertySetter_FWD_DEFINED__ -#define __IPropertySetter_FWD_DEFINED__ -typedef interface IPropertySetter IPropertySetter; -#endif /* __IPropertySetter_FWD_DEFINED__ */ - - -#ifndef __IDxtCompositor_FWD_DEFINED__ -#define __IDxtCompositor_FWD_DEFINED__ -typedef interface IDxtCompositor IDxtCompositor; -#endif /* __IDxtCompositor_FWD_DEFINED__ */ - - -#ifndef __IDxtAlphaSetter_FWD_DEFINED__ -#define __IDxtAlphaSetter_FWD_DEFINED__ -typedef interface IDxtAlphaSetter IDxtAlphaSetter; -#endif /* __IDxtAlphaSetter_FWD_DEFINED__ */ - - -#ifndef __IDxtJpeg_FWD_DEFINED__ -#define __IDxtJpeg_FWD_DEFINED__ -typedef interface IDxtJpeg IDxtJpeg; -#endif /* __IDxtJpeg_FWD_DEFINED__ */ - - -#ifndef __IDxtKey_FWD_DEFINED__ -#define __IDxtKey_FWD_DEFINED__ -typedef interface IDxtKey IDxtKey; -#endif /* __IDxtKey_FWD_DEFINED__ */ - - -#ifndef __IMediaLocator_FWD_DEFINED__ -#define __IMediaLocator_FWD_DEFINED__ -typedef interface IMediaLocator IMediaLocator; -#endif /* __IMediaLocator_FWD_DEFINED__ */ - - -#ifndef __IMediaDet_FWD_DEFINED__ -#define __IMediaDet_FWD_DEFINED__ -typedef interface IMediaDet IMediaDet; -#endif /* __IMediaDet_FWD_DEFINED__ */ - - -#ifndef __IGrfCache_FWD_DEFINED__ -#define __IGrfCache_FWD_DEFINED__ -typedef interface IGrfCache IGrfCache; -#endif /* __IGrfCache_FWD_DEFINED__ */ - - -#ifndef __IRenderEngine_FWD_DEFINED__ -#define __IRenderEngine_FWD_DEFINED__ -typedef interface IRenderEngine IRenderEngine; -#endif /* __IRenderEngine_FWD_DEFINED__ */ - - -#ifndef __IFindCompressorCB_FWD_DEFINED__ -#define __IFindCompressorCB_FWD_DEFINED__ -typedef interface IFindCompressorCB IFindCompressorCB; -#endif /* __IFindCompressorCB_FWD_DEFINED__ */ - - -#ifndef __ISmartRenderEngine_FWD_DEFINED__ -#define __ISmartRenderEngine_FWD_DEFINED__ -typedef interface ISmartRenderEngine ISmartRenderEngine; -#endif /* __ISmartRenderEngine_FWD_DEFINED__ */ - - -#ifndef __IAMTimelineObj_FWD_DEFINED__ -#define __IAMTimelineObj_FWD_DEFINED__ -typedef interface IAMTimelineObj IAMTimelineObj; -#endif /* __IAMTimelineObj_FWD_DEFINED__ */ - - -#ifndef __IAMTimelineEffectable_FWD_DEFINED__ -#define __IAMTimelineEffectable_FWD_DEFINED__ -typedef interface IAMTimelineEffectable IAMTimelineEffectable; -#endif /* __IAMTimelineEffectable_FWD_DEFINED__ */ - - -#ifndef __IAMTimelineEffect_FWD_DEFINED__ -#define __IAMTimelineEffect_FWD_DEFINED__ -typedef interface IAMTimelineEffect IAMTimelineEffect; -#endif /* __IAMTimelineEffect_FWD_DEFINED__ */ - - -#ifndef __IAMTimelineTransable_FWD_DEFINED__ -#define __IAMTimelineTransable_FWD_DEFINED__ -typedef interface IAMTimelineTransable IAMTimelineTransable; -#endif /* __IAMTimelineTransable_FWD_DEFINED__ */ - - -#ifndef __IAMTimelineSplittable_FWD_DEFINED__ -#define __IAMTimelineSplittable_FWD_DEFINED__ -typedef interface IAMTimelineSplittable IAMTimelineSplittable; -#endif /* __IAMTimelineSplittable_FWD_DEFINED__ */ - - -#ifndef __IAMTimelineTrans_FWD_DEFINED__ -#define __IAMTimelineTrans_FWD_DEFINED__ -typedef interface IAMTimelineTrans IAMTimelineTrans; -#endif /* __IAMTimelineTrans_FWD_DEFINED__ */ - - -#ifndef __IAMTimelineSrc_FWD_DEFINED__ -#define __IAMTimelineSrc_FWD_DEFINED__ -typedef interface IAMTimelineSrc IAMTimelineSrc; -#endif /* __IAMTimelineSrc_FWD_DEFINED__ */ - - -#ifndef __IAMTimelineTrack_FWD_DEFINED__ -#define __IAMTimelineTrack_FWD_DEFINED__ -typedef interface IAMTimelineTrack IAMTimelineTrack; -#endif /* __IAMTimelineTrack_FWD_DEFINED__ */ - - -#ifndef __IAMTimelineVirtualTrack_FWD_DEFINED__ -#define __IAMTimelineVirtualTrack_FWD_DEFINED__ -typedef interface IAMTimelineVirtualTrack IAMTimelineVirtualTrack; -#endif /* __IAMTimelineVirtualTrack_FWD_DEFINED__ */ - - -#ifndef __IAMTimelineComp_FWD_DEFINED__ -#define __IAMTimelineComp_FWD_DEFINED__ -typedef interface IAMTimelineComp IAMTimelineComp; -#endif /* __IAMTimelineComp_FWD_DEFINED__ */ - - -#ifndef __IAMTimelineGroup_FWD_DEFINED__ -#define __IAMTimelineGroup_FWD_DEFINED__ -typedef interface IAMTimelineGroup IAMTimelineGroup; -#endif /* __IAMTimelineGroup_FWD_DEFINED__ */ - - -#ifndef __IAMTimeline_FWD_DEFINED__ -#define __IAMTimeline_FWD_DEFINED__ -typedef interface IAMTimeline IAMTimeline; -#endif /* __IAMTimeline_FWD_DEFINED__ */ - - -#ifndef __IXml2Dex_FWD_DEFINED__ -#define __IXml2Dex_FWD_DEFINED__ -typedef interface IXml2Dex IXml2Dex; -#endif /* __IXml2Dex_FWD_DEFINED__ */ - - -#ifndef __IAMErrorLog_FWD_DEFINED__ -#define __IAMErrorLog_FWD_DEFINED__ -typedef interface IAMErrorLog IAMErrorLog; -#endif /* __IAMErrorLog_FWD_DEFINED__ */ - - -#ifndef __IAMSetErrorLog_FWD_DEFINED__ -#define __IAMSetErrorLog_FWD_DEFINED__ -typedef interface IAMSetErrorLog IAMSetErrorLog; -#endif /* __IAMSetErrorLog_FWD_DEFINED__ */ - - -#ifndef __ISampleGrabberCB_FWD_DEFINED__ -#define __ISampleGrabberCB_FWD_DEFINED__ -typedef interface ISampleGrabberCB ISampleGrabberCB; -#endif /* __ISampleGrabberCB_FWD_DEFINED__ */ - - -#ifndef __ISampleGrabber_FWD_DEFINED__ -#define __ISampleGrabber_FWD_DEFINED__ -typedef interface ISampleGrabber ISampleGrabber; -#endif /* __ISampleGrabber_FWD_DEFINED__ */ - - -#ifndef __AMTimeline_FWD_DEFINED__ -#define __AMTimeline_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class AMTimeline AMTimeline; -#else -typedef struct AMTimeline AMTimeline; -#endif /* __cplusplus */ - -#endif /* __AMTimeline_FWD_DEFINED__ */ - - -#ifndef __AMTimelineObj_FWD_DEFINED__ -#define __AMTimelineObj_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class AMTimelineObj AMTimelineObj; -#else -typedef struct AMTimelineObj AMTimelineObj; -#endif /* __cplusplus */ - -#endif /* __AMTimelineObj_FWD_DEFINED__ */ - - -#ifndef __AMTimelineSrc_FWD_DEFINED__ -#define __AMTimelineSrc_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class AMTimelineSrc AMTimelineSrc; -#else -typedef struct AMTimelineSrc AMTimelineSrc; -#endif /* __cplusplus */ - -#endif /* __AMTimelineSrc_FWD_DEFINED__ */ - - -#ifndef __AMTimelineTrack_FWD_DEFINED__ -#define __AMTimelineTrack_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class AMTimelineTrack AMTimelineTrack; -#else -typedef struct AMTimelineTrack AMTimelineTrack; -#endif /* __cplusplus */ - -#endif /* __AMTimelineTrack_FWD_DEFINED__ */ - - -#ifndef __AMTimelineComp_FWD_DEFINED__ -#define __AMTimelineComp_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class AMTimelineComp AMTimelineComp; -#else -typedef struct AMTimelineComp AMTimelineComp; -#endif /* __cplusplus */ - -#endif /* __AMTimelineComp_FWD_DEFINED__ */ - - -#ifndef __AMTimelineGroup_FWD_DEFINED__ -#define __AMTimelineGroup_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class AMTimelineGroup AMTimelineGroup; -#else -typedef struct AMTimelineGroup AMTimelineGroup; -#endif /* __cplusplus */ - -#endif /* __AMTimelineGroup_FWD_DEFINED__ */ - - -#ifndef __AMTimelineTrans_FWD_DEFINED__ -#define __AMTimelineTrans_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class AMTimelineTrans AMTimelineTrans; -#else -typedef struct AMTimelineTrans AMTimelineTrans; -#endif /* __cplusplus */ - -#endif /* __AMTimelineTrans_FWD_DEFINED__ */ - - -#ifndef __AMTimelineEffect_FWD_DEFINED__ -#define __AMTimelineEffect_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class AMTimelineEffect AMTimelineEffect; -#else -typedef struct AMTimelineEffect AMTimelineEffect; -#endif /* __cplusplus */ - -#endif /* __AMTimelineEffect_FWD_DEFINED__ */ - - -#ifndef __RenderEngine_FWD_DEFINED__ -#define __RenderEngine_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class RenderEngine RenderEngine; -#else -typedef struct RenderEngine RenderEngine; -#endif /* __cplusplus */ - -#endif /* __RenderEngine_FWD_DEFINED__ */ - - -#ifndef __SmartRenderEngine_FWD_DEFINED__ -#define __SmartRenderEngine_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class SmartRenderEngine SmartRenderEngine; -#else -typedef struct SmartRenderEngine SmartRenderEngine; -#endif /* __cplusplus */ - -#endif /* __SmartRenderEngine_FWD_DEFINED__ */ - - -#ifndef __AudMixer_FWD_DEFINED__ -#define __AudMixer_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class AudMixer AudMixer; -#else -typedef struct AudMixer AudMixer; -#endif /* __cplusplus */ - -#endif /* __AudMixer_FWD_DEFINED__ */ - - -#ifndef __Xml2Dex_FWD_DEFINED__ -#define __Xml2Dex_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class Xml2Dex Xml2Dex; -#else -typedef struct Xml2Dex Xml2Dex; -#endif /* __cplusplus */ - -#endif /* __Xml2Dex_FWD_DEFINED__ */ - - -#ifndef __MediaLocator_FWD_DEFINED__ -#define __MediaLocator_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class MediaLocator MediaLocator; -#else -typedef struct MediaLocator MediaLocator; -#endif /* __cplusplus */ - -#endif /* __MediaLocator_FWD_DEFINED__ */ - - -#ifndef __PropertySetter_FWD_DEFINED__ -#define __PropertySetter_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class PropertySetter PropertySetter; -#else -typedef struct PropertySetter PropertySetter; -#endif /* __cplusplus */ - -#endif /* __PropertySetter_FWD_DEFINED__ */ - - -#ifndef __MediaDet_FWD_DEFINED__ -#define __MediaDet_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class MediaDet MediaDet; -#else -typedef struct MediaDet MediaDet; -#endif /* __cplusplus */ - -#endif /* __MediaDet_FWD_DEFINED__ */ - - -#ifndef __SampleGrabber_FWD_DEFINED__ -#define __SampleGrabber_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class SampleGrabber SampleGrabber; -#else -typedef struct SampleGrabber SampleGrabber; -#endif /* __cplusplus */ - -#endif /* __SampleGrabber_FWD_DEFINED__ */ - - -#ifndef __NullRenderer_FWD_DEFINED__ -#define __NullRenderer_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class NullRenderer NullRenderer; -#else -typedef struct NullRenderer NullRenderer; -#endif /* __cplusplus */ - -#endif /* __NullRenderer_FWD_DEFINED__ */ - - -#ifndef __DxtCompositor_FWD_DEFINED__ -#define __DxtCompositor_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DxtCompositor DxtCompositor; -#else -typedef struct DxtCompositor DxtCompositor; -#endif /* __cplusplus */ - -#endif /* __DxtCompositor_FWD_DEFINED__ */ - - -#ifndef __DxtAlphaSetter_FWD_DEFINED__ -#define __DxtAlphaSetter_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DxtAlphaSetter DxtAlphaSetter; -#else -typedef struct DxtAlphaSetter DxtAlphaSetter; -#endif /* __cplusplus */ - -#endif /* __DxtAlphaSetter_FWD_DEFINED__ */ - - -#ifndef __DxtJpeg_FWD_DEFINED__ -#define __DxtJpeg_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DxtJpeg DxtJpeg; -#else -typedef struct DxtJpeg DxtJpeg; -#endif /* __cplusplus */ - -#endif /* __DxtJpeg_FWD_DEFINED__ */ - - -#ifndef __ColorSource_FWD_DEFINED__ -#define __ColorSource_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class ColorSource ColorSource; -#else -typedef struct ColorSource ColorSource; -#endif /* __cplusplus */ - -#endif /* __ColorSource_FWD_DEFINED__ */ - - -#ifndef __DxtKey_FWD_DEFINED__ -#define __DxtKey_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DxtKey DxtKey; -#else -typedef struct DxtKey DxtKey; -#endif /* __cplusplus */ - -#endif /* __DxtKey_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "oaidl.h" -#include "ocidl.h" -#include "dxtrans.h" -#include "amstream.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void * ); - -/* interface __MIDL_itf_qedit_0000 */ -/* [local] */ - - - - - - - - - - -typedef /* [public] */ -enum __MIDL___MIDL_itf_qedit_0000_0001 - { DEXTERF_JUMP = 0, - DEXTERF_INTERPOLATE = DEXTERF_JUMP + 1 - } DEXTERF; - -typedef /* [public][public][public][public] */ struct __MIDL___MIDL_itf_qedit_0000_0002 - { - BSTR Name; - DISPID dispID; - LONG nValues; - } DEXTER_PARAM; - -typedef /* [public][public][public][public] */ struct __MIDL___MIDL_itf_qedit_0000_0003 - { - VARIANT v; - REFERENCE_TIME rt; - DWORD dwInterp; - } DEXTER_VALUE; - - -enum __MIDL___MIDL_itf_qedit_0000_0004 - { DEXTER_AUDIO_JUMP = 0, - DEXTER_AUDIO_INTERPOLATE = DEXTER_AUDIO_JUMP + 1 - } ; -typedef /* [public] */ struct __MIDL___MIDL_itf_qedit_0000_0005 - { - REFERENCE_TIME rtEnd; - double dLevel; - BOOL bMethod; - } DEXTER_AUDIO_VOLUMEENVELOPE; - - -enum __MIDL___MIDL_itf_qedit_0000_0006 - { TIMELINE_INSERT_MODE_INSERT = 1, - TIMELINE_INSERT_MODE_OVERLAY = 2 - } ; -typedef /* [public][public][public][public][public][public][public][public] */ -enum __MIDL___MIDL_itf_qedit_0000_0007 - { TIMELINE_MAJOR_TYPE_COMPOSITE = 1, - TIMELINE_MAJOR_TYPE_TRACK = 2, - TIMELINE_MAJOR_TYPE_SOURCE = 4, - TIMELINE_MAJOR_TYPE_TRANSITION = 8, - TIMELINE_MAJOR_TYPE_EFFECT = 16, - TIMELINE_MAJOR_TYPE_GROUP = 128 - } TIMELINE_MAJOR_TYPE; - -typedef /* [public] */ -enum __MIDL___MIDL_itf_qedit_0000_0008 - { DEXTERF_BOUNDING = -1, - DEXTERF_EXACTLY_AT = 0, - DEXTERF_FORWARDS = 1 - } DEXTERF_TRACK_SEARCH_FLAGS; - -typedef struct _SCompFmt0 - { - long nFormatId; - AM_MEDIA_TYPE MediaType; - } SCompFmt0; - - -enum __MIDL___MIDL_itf_qedit_0000_0009 - { RESIZEF_STRETCH = 0, - RESIZEF_CROP = RESIZEF_STRETCH + 1, - RESIZEF_PRESERVEASPECTRATIO = RESIZEF_CROP + 1, - RESIZEF_PRESERVEASPECTRATIO_NOLETTERBOX = RESIZEF_PRESERVEASPECTRATIO + 1 - } ; - -enum __MIDL___MIDL_itf_qedit_0000_0010 - { CONNECTF_DYNAMIC_NONE = 0, - CONNECTF_DYNAMIC_SOURCES = 0x1, - CONNECTF_DYNAMIC_EFFECTS = 0x2 - } ; - -enum __MIDL___MIDL_itf_qedit_0000_0011 - { SFN_VALIDATEF_CHECK = 0x1, - SFN_VALIDATEF_POPUP = 0x2, - SFN_VALIDATEF_TELLME = 0x4, - SFN_VALIDATEF_REPLACE = 0x8, - SFN_VALIDATEF_USELOCAL = 0x10, - SFN_VALIDATEF_NOFIND = 0x20, - SFN_VALIDATEF_IGNOREMUTED = 0x40, - SFN_VALIDATEF_END = SFN_VALIDATEF_IGNOREMUTED + 1 - } ; - -enum __MIDL___MIDL_itf_qedit_0000_0012 - { DXTKEY_RGB = 0, - DXTKEY_NONRED = DXTKEY_RGB + 1, - DXTKEY_LUMINANCE = DXTKEY_NONRED + 1, - DXTKEY_ALPHA = DXTKEY_LUMINANCE + 1, - DXTKEY_HUE = DXTKEY_ALPHA + 1 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_qedit_0000_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_qedit_0000_v0_0_s_ifspec; - -#ifndef __IPropertySetter_INTERFACE_DEFINED__ -#define __IPropertySetter_INTERFACE_DEFINED__ - -/* interface IPropertySetter */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IPropertySetter; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("AE9472BD-B0C3-11D2-8D24-00A0C9441E20") - IPropertySetter : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE LoadXML( - /* [in] */ IUnknown *pxml) = 0; - - virtual HRESULT STDMETHODCALLTYPE PrintXML( - /* [out] */ char *pszXML, - /* [in] */ int cbXML, - /* [out] */ int *pcbPrinted, - /* [in] */ int indent) = 0; - - virtual HRESULT STDMETHODCALLTYPE CloneProps( - /* [out] */ IPropertySetter **ppSetter, - /* [in] */ REFERENCE_TIME rtStart, - /* [in] */ REFERENCE_TIME rtStop) = 0; - - virtual HRESULT STDMETHODCALLTYPE AddProp( - /* [in] */ DEXTER_PARAM Param, - /* [in] */ DEXTER_VALUE *paValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetProps( - /* [out] */ LONG *pcParams, - /* [out] */ DEXTER_PARAM **paParam, - /* [out] */ DEXTER_VALUE **paValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE FreeProps( - /* [in] */ LONG cParams, - /* [in] */ DEXTER_PARAM *paParam, - /* [in] */ DEXTER_VALUE *paValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE ClearProps( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SaveToBlob( - /* [out] */ LONG *pcSize, - /* [out] */ BYTE **ppb) = 0; - - virtual HRESULT STDMETHODCALLTYPE LoadFromBlob( - /* [in] */ LONG cSize, - /* [in] */ BYTE *pb) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetProps( - /* [in] */ IUnknown *pTarget, - /* [in] */ REFERENCE_TIME rtNow) = 0; - - virtual HRESULT STDMETHODCALLTYPE PrintXMLW( - /* [out] */ WCHAR *pszXML, - /* [in] */ int cchXML, - /* [out] */ int *pcchPrinted, - /* [in] */ int indent) = 0; - - }; - -#else /* C style interface */ - - typedef struct IPropertySetterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IPropertySetter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IPropertySetter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IPropertySetter * This); - - HRESULT ( STDMETHODCALLTYPE *LoadXML )( - IPropertySetter * This, - /* [in] */ IUnknown *pxml); - - HRESULT ( STDMETHODCALLTYPE *PrintXML )( - IPropertySetter * This, - /* [out] */ char *pszXML, - /* [in] */ int cbXML, - /* [out] */ int *pcbPrinted, - /* [in] */ int indent); - - HRESULT ( STDMETHODCALLTYPE *CloneProps )( - IPropertySetter * This, - /* [out] */ IPropertySetter **ppSetter, - /* [in] */ REFERENCE_TIME rtStart, - /* [in] */ REFERENCE_TIME rtStop); - - HRESULT ( STDMETHODCALLTYPE *AddProp )( - IPropertySetter * This, - /* [in] */ DEXTER_PARAM Param, - /* [in] */ DEXTER_VALUE *paValue); - - HRESULT ( STDMETHODCALLTYPE *GetProps )( - IPropertySetter * This, - /* [out] */ LONG *pcParams, - /* [out] */ DEXTER_PARAM **paParam, - /* [out] */ DEXTER_VALUE **paValue); - - HRESULT ( STDMETHODCALLTYPE *FreeProps )( - IPropertySetter * This, - /* [in] */ LONG cParams, - /* [in] */ DEXTER_PARAM *paParam, - /* [in] */ DEXTER_VALUE *paValue); - - HRESULT ( STDMETHODCALLTYPE *ClearProps )( - IPropertySetter * This); - - HRESULT ( STDMETHODCALLTYPE *SaveToBlob )( - IPropertySetter * This, - /* [out] */ LONG *pcSize, - /* [out] */ BYTE **ppb); - - HRESULT ( STDMETHODCALLTYPE *LoadFromBlob )( - IPropertySetter * This, - /* [in] */ LONG cSize, - /* [in] */ BYTE *pb); - - HRESULT ( STDMETHODCALLTYPE *SetProps )( - IPropertySetter * This, - /* [in] */ IUnknown *pTarget, - /* [in] */ REFERENCE_TIME rtNow); - - HRESULT ( STDMETHODCALLTYPE *PrintXMLW )( - IPropertySetter * This, - /* [out] */ WCHAR *pszXML, - /* [in] */ int cchXML, - /* [out] */ int *pcchPrinted, - /* [in] */ int indent); - - END_INTERFACE - } IPropertySetterVtbl; - - interface IPropertySetter - { - CONST_VTBL struct IPropertySetterVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IPropertySetter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IPropertySetter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IPropertySetter_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IPropertySetter_LoadXML(This,pxml) \ - (This)->lpVtbl -> LoadXML(This,pxml) - -#define IPropertySetter_PrintXML(This,pszXML,cbXML,pcbPrinted,indent) \ - (This)->lpVtbl -> PrintXML(This,pszXML,cbXML,pcbPrinted,indent) - -#define IPropertySetter_CloneProps(This,ppSetter,rtStart,rtStop) \ - (This)->lpVtbl -> CloneProps(This,ppSetter,rtStart,rtStop) - -#define IPropertySetter_AddProp(This,Param,paValue) \ - (This)->lpVtbl -> AddProp(This,Param,paValue) - -#define IPropertySetter_GetProps(This,pcParams,paParam,paValue) \ - (This)->lpVtbl -> GetProps(This,pcParams,paParam,paValue) - -#define IPropertySetter_FreeProps(This,cParams,paParam,paValue) \ - (This)->lpVtbl -> FreeProps(This,cParams,paParam,paValue) - -#define IPropertySetter_ClearProps(This) \ - (This)->lpVtbl -> ClearProps(This) - -#define IPropertySetter_SaveToBlob(This,pcSize,ppb) \ - (This)->lpVtbl -> SaveToBlob(This,pcSize,ppb) - -#define IPropertySetter_LoadFromBlob(This,cSize,pb) \ - (This)->lpVtbl -> LoadFromBlob(This,cSize,pb) - -#define IPropertySetter_SetProps(This,pTarget,rtNow) \ - (This)->lpVtbl -> SetProps(This,pTarget,rtNow) - -#define IPropertySetter_PrintXMLW(This,pszXML,cchXML,pcchPrinted,indent) \ - (This)->lpVtbl -> PrintXMLW(This,pszXML,cchXML,pcchPrinted,indent) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IPropertySetter_LoadXML_Proxy( - IPropertySetter * This, - /* [in] */ IUnknown *pxml); - - -void __RPC_STUB IPropertySetter_LoadXML_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPropertySetter_PrintXML_Proxy( - IPropertySetter * This, - /* [out] */ char *pszXML, - /* [in] */ int cbXML, - /* [out] */ int *pcbPrinted, - /* [in] */ int indent); - - -void __RPC_STUB IPropertySetter_PrintXML_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPropertySetter_CloneProps_Proxy( - IPropertySetter * This, - /* [out] */ IPropertySetter **ppSetter, - /* [in] */ REFERENCE_TIME rtStart, - /* [in] */ REFERENCE_TIME rtStop); - - -void __RPC_STUB IPropertySetter_CloneProps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPropertySetter_AddProp_Proxy( - IPropertySetter * This, - /* [in] */ DEXTER_PARAM Param, - /* [in] */ DEXTER_VALUE *paValue); - - -void __RPC_STUB IPropertySetter_AddProp_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPropertySetter_GetProps_Proxy( - IPropertySetter * This, - /* [out] */ LONG *pcParams, - /* [out] */ DEXTER_PARAM **paParam, - /* [out] */ DEXTER_VALUE **paValue); - - -void __RPC_STUB IPropertySetter_GetProps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPropertySetter_FreeProps_Proxy( - IPropertySetter * This, - /* [in] */ LONG cParams, - /* [in] */ DEXTER_PARAM *paParam, - /* [in] */ DEXTER_VALUE *paValue); - - -void __RPC_STUB IPropertySetter_FreeProps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPropertySetter_ClearProps_Proxy( - IPropertySetter * This); - - -void __RPC_STUB IPropertySetter_ClearProps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPropertySetter_SaveToBlob_Proxy( - IPropertySetter * This, - /* [out] */ LONG *pcSize, - /* [out] */ BYTE **ppb); - - -void __RPC_STUB IPropertySetter_SaveToBlob_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPropertySetter_LoadFromBlob_Proxy( - IPropertySetter * This, - /* [in] */ LONG cSize, - /* [in] */ BYTE *pb); - - -void __RPC_STUB IPropertySetter_LoadFromBlob_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPropertySetter_SetProps_Proxy( - IPropertySetter * This, - /* [in] */ IUnknown *pTarget, - /* [in] */ REFERENCE_TIME rtNow); - - -void __RPC_STUB IPropertySetter_SetProps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPropertySetter_PrintXMLW_Proxy( - IPropertySetter * This, - /* [out] */ WCHAR *pszXML, - /* [in] */ int cchXML, - /* [out] */ int *pcchPrinted, - /* [in] */ int indent); - - -void __RPC_STUB IPropertySetter_PrintXMLW_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IPropertySetter_INTERFACE_DEFINED__ */ - - -#ifndef __IDxtCompositor_INTERFACE_DEFINED__ -#define __IDxtCompositor_INTERFACE_DEFINED__ - -/* interface IDxtCompositor */ -/* [unique][helpstring][dual][uuid][object] */ - - -EXTERN_C const IID IID_IDxtCompositor; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("BB44391E-6ABD-422f-9E2E-385C9DFF51FC") - IDxtCompositor : public IDXEffect - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OffsetX( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_OffsetX( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OffsetY( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_OffsetY( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Width( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Width( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Height( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Height( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SrcOffsetX( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SrcOffsetX( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SrcOffsetY( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SrcOffsetY( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SrcWidth( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SrcWidth( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SrcHeight( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SrcHeight( - /* [in] */ long newVal) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDxtCompositorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDxtCompositor * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDxtCompositor * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDxtCompositor * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDxtCompositor * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDxtCompositor * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDxtCompositor * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDxtCompositor * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Capabilities )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Progress )( - IDxtCompositor * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Progress )( - IDxtCompositor * This, - /* [in] */ float newVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StepResolution )( - IDxtCompositor * This, - /* [retval][out] */ float *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Duration )( - IDxtCompositor * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Duration )( - IDxtCompositor * This, - /* [in] */ float newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OffsetX )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OffsetX )( - IDxtCompositor * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OffsetY )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OffsetY )( - IDxtCompositor * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Width )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Width )( - IDxtCompositor * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Height )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Height )( - IDxtCompositor * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SrcOffsetX )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SrcOffsetX )( - IDxtCompositor * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SrcOffsetY )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SrcOffsetY )( - IDxtCompositor * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SrcWidth )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SrcWidth )( - IDxtCompositor * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SrcHeight )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SrcHeight )( - IDxtCompositor * This, - /* [in] */ long newVal); - - END_INTERFACE - } IDxtCompositorVtbl; - - interface IDxtCompositor - { - CONST_VTBL struct IDxtCompositorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDxtCompositor_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDxtCompositor_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDxtCompositor_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDxtCompositor_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IDxtCompositor_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IDxtCompositor_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IDxtCompositor_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IDxtCompositor_get_Capabilities(This,pVal) \ - (This)->lpVtbl -> get_Capabilities(This,pVal) - -#define IDxtCompositor_get_Progress(This,pVal) \ - (This)->lpVtbl -> get_Progress(This,pVal) - -#define IDxtCompositor_put_Progress(This,newVal) \ - (This)->lpVtbl -> put_Progress(This,newVal) - -#define IDxtCompositor_get_StepResolution(This,pVal) \ - (This)->lpVtbl -> get_StepResolution(This,pVal) - -#define IDxtCompositor_get_Duration(This,pVal) \ - (This)->lpVtbl -> get_Duration(This,pVal) - -#define IDxtCompositor_put_Duration(This,newVal) \ - (This)->lpVtbl -> put_Duration(This,newVal) - - -#define IDxtCompositor_get_OffsetX(This,pVal) \ - (This)->lpVtbl -> get_OffsetX(This,pVal) - -#define IDxtCompositor_put_OffsetX(This,newVal) \ - (This)->lpVtbl -> put_OffsetX(This,newVal) - -#define IDxtCompositor_get_OffsetY(This,pVal) \ - (This)->lpVtbl -> get_OffsetY(This,pVal) - -#define IDxtCompositor_put_OffsetY(This,newVal) \ - (This)->lpVtbl -> put_OffsetY(This,newVal) - -#define IDxtCompositor_get_Width(This,pVal) \ - (This)->lpVtbl -> get_Width(This,pVal) - -#define IDxtCompositor_put_Width(This,newVal) \ - (This)->lpVtbl -> put_Width(This,newVal) - -#define IDxtCompositor_get_Height(This,pVal) \ - (This)->lpVtbl -> get_Height(This,pVal) - -#define IDxtCompositor_put_Height(This,newVal) \ - (This)->lpVtbl -> put_Height(This,newVal) - -#define IDxtCompositor_get_SrcOffsetX(This,pVal) \ - (This)->lpVtbl -> get_SrcOffsetX(This,pVal) - -#define IDxtCompositor_put_SrcOffsetX(This,newVal) \ - (This)->lpVtbl -> put_SrcOffsetX(This,newVal) - -#define IDxtCompositor_get_SrcOffsetY(This,pVal) \ - (This)->lpVtbl -> get_SrcOffsetY(This,pVal) - -#define IDxtCompositor_put_SrcOffsetY(This,newVal) \ - (This)->lpVtbl -> put_SrcOffsetY(This,newVal) - -#define IDxtCompositor_get_SrcWidth(This,pVal) \ - (This)->lpVtbl -> get_SrcWidth(This,pVal) - -#define IDxtCompositor_put_SrcWidth(This,newVal) \ - (This)->lpVtbl -> put_SrcWidth(This,newVal) - -#define IDxtCompositor_get_SrcHeight(This,pVal) \ - (This)->lpVtbl -> get_SrcHeight(This,pVal) - -#define IDxtCompositor_put_SrcHeight(This,newVal) \ - (This)->lpVtbl -> put_SrcHeight(This,newVal) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_get_OffsetX_Proxy( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IDxtCompositor_get_OffsetX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_put_OffsetX_Proxy( - IDxtCompositor * This, - /* [in] */ long newVal); - - -void __RPC_STUB IDxtCompositor_put_OffsetX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_get_OffsetY_Proxy( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IDxtCompositor_get_OffsetY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_put_OffsetY_Proxy( - IDxtCompositor * This, - /* [in] */ long newVal); - - -void __RPC_STUB IDxtCompositor_put_OffsetY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_get_Width_Proxy( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IDxtCompositor_get_Width_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_put_Width_Proxy( - IDxtCompositor * This, - /* [in] */ long newVal); - - -void __RPC_STUB IDxtCompositor_put_Width_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_get_Height_Proxy( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IDxtCompositor_get_Height_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_put_Height_Proxy( - IDxtCompositor * This, - /* [in] */ long newVal); - - -void __RPC_STUB IDxtCompositor_put_Height_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_get_SrcOffsetX_Proxy( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IDxtCompositor_get_SrcOffsetX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_put_SrcOffsetX_Proxy( - IDxtCompositor * This, - /* [in] */ long newVal); - - -void __RPC_STUB IDxtCompositor_put_SrcOffsetX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_get_SrcOffsetY_Proxy( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IDxtCompositor_get_SrcOffsetY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_put_SrcOffsetY_Proxy( - IDxtCompositor * This, - /* [in] */ long newVal); - - -void __RPC_STUB IDxtCompositor_put_SrcOffsetY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_get_SrcWidth_Proxy( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IDxtCompositor_get_SrcWidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_put_SrcWidth_Proxy( - IDxtCompositor * This, - /* [in] */ long newVal); - - -void __RPC_STUB IDxtCompositor_put_SrcWidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_get_SrcHeight_Proxy( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IDxtCompositor_get_SrcHeight_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_put_SrcHeight_Proxy( - IDxtCompositor * This, - /* [in] */ long newVal); - - -void __RPC_STUB IDxtCompositor_put_SrcHeight_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDxtCompositor_INTERFACE_DEFINED__ */ - - -#ifndef __IDxtAlphaSetter_INTERFACE_DEFINED__ -#define __IDxtAlphaSetter_INTERFACE_DEFINED__ - -/* interface IDxtAlphaSetter */ -/* [unique][helpstring][dual][uuid][object] */ - - -EXTERN_C const IID IID_IDxtAlphaSetter; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("4EE9EAD9-DA4D-43d0-9383-06B90C08B12B") - IDxtAlphaSetter : public IDXEffect - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Alpha( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Alpha( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_AlphaRamp( - /* [retval][out] */ double *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_AlphaRamp( - /* [in] */ double newVal) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDxtAlphaSetterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDxtAlphaSetter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDxtAlphaSetter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDxtAlphaSetter * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDxtAlphaSetter * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDxtAlphaSetter * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDxtAlphaSetter * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDxtAlphaSetter * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Capabilities )( - IDxtAlphaSetter * This, - /* [retval][out] */ long *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Progress )( - IDxtAlphaSetter * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Progress )( - IDxtAlphaSetter * This, - /* [in] */ float newVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StepResolution )( - IDxtAlphaSetter * This, - /* [retval][out] */ float *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Duration )( - IDxtAlphaSetter * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Duration )( - IDxtAlphaSetter * This, - /* [in] */ float newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Alpha )( - IDxtAlphaSetter * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Alpha )( - IDxtAlphaSetter * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlphaRamp )( - IDxtAlphaSetter * This, - /* [retval][out] */ double *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlphaRamp )( - IDxtAlphaSetter * This, - /* [in] */ double newVal); - - END_INTERFACE - } IDxtAlphaSetterVtbl; - - interface IDxtAlphaSetter - { - CONST_VTBL struct IDxtAlphaSetterVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDxtAlphaSetter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDxtAlphaSetter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDxtAlphaSetter_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDxtAlphaSetter_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IDxtAlphaSetter_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IDxtAlphaSetter_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IDxtAlphaSetter_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IDxtAlphaSetter_get_Capabilities(This,pVal) \ - (This)->lpVtbl -> get_Capabilities(This,pVal) - -#define IDxtAlphaSetter_get_Progress(This,pVal) \ - (This)->lpVtbl -> get_Progress(This,pVal) - -#define IDxtAlphaSetter_put_Progress(This,newVal) \ - (This)->lpVtbl -> put_Progress(This,newVal) - -#define IDxtAlphaSetter_get_StepResolution(This,pVal) \ - (This)->lpVtbl -> get_StepResolution(This,pVal) - -#define IDxtAlphaSetter_get_Duration(This,pVal) \ - (This)->lpVtbl -> get_Duration(This,pVal) - -#define IDxtAlphaSetter_put_Duration(This,newVal) \ - (This)->lpVtbl -> put_Duration(This,newVal) - - -#define IDxtAlphaSetter_get_Alpha(This,pVal) \ - (This)->lpVtbl -> get_Alpha(This,pVal) - -#define IDxtAlphaSetter_put_Alpha(This,newVal) \ - (This)->lpVtbl -> put_Alpha(This,newVal) - -#define IDxtAlphaSetter_get_AlphaRamp(This,pVal) \ - (This)->lpVtbl -> get_AlphaRamp(This,pVal) - -#define IDxtAlphaSetter_put_AlphaRamp(This,newVal) \ - (This)->lpVtbl -> put_AlphaRamp(This,newVal) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtAlphaSetter_get_Alpha_Proxy( - IDxtAlphaSetter * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IDxtAlphaSetter_get_Alpha_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtAlphaSetter_put_Alpha_Proxy( - IDxtAlphaSetter * This, - /* [in] */ long newVal); - - -void __RPC_STUB IDxtAlphaSetter_put_Alpha_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtAlphaSetter_get_AlphaRamp_Proxy( - IDxtAlphaSetter * This, - /* [retval][out] */ double *pVal); - - -void __RPC_STUB IDxtAlphaSetter_get_AlphaRamp_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtAlphaSetter_put_AlphaRamp_Proxy( - IDxtAlphaSetter * This, - /* [in] */ double newVal); - - -void __RPC_STUB IDxtAlphaSetter_put_AlphaRamp_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDxtAlphaSetter_INTERFACE_DEFINED__ */ - - -#ifndef __IDxtJpeg_INTERFACE_DEFINED__ -#define __IDxtJpeg_INTERFACE_DEFINED__ - -/* interface IDxtJpeg */ -/* [unique][helpstring][dual][uuid][object] */ - - -EXTERN_C const IID IID_IDxtJpeg; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("DE75D011-7A65-11D2-8CEA-00A0C9441E20") - IDxtJpeg : public IDXEffect - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MaskNum( - /* [retval][out] */ long *__MIDL_0018) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MaskNum( - /* [in] */ long __MIDL_0019) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MaskName( - /* [retval][out] */ BSTR *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MaskName( - /* [in] */ BSTR newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ScaleX( - /* [retval][out] */ double *__MIDL_0020) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ScaleX( - /* [in] */ double __MIDL_0021) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ScaleY( - /* [retval][out] */ double *__MIDL_0022) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ScaleY( - /* [in] */ double __MIDL_0023) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OffsetX( - /* [retval][out] */ long *__MIDL_0024) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_OffsetX( - /* [in] */ long __MIDL_0025) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OffsetY( - /* [retval][out] */ long *__MIDL_0026) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_OffsetY( - /* [in] */ long __MIDL_0027) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ReplicateX( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ReplicateX( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ReplicateY( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ReplicateY( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_BorderColor( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_BorderColor( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_BorderWidth( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_BorderWidth( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_BorderSoftness( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_BorderSoftness( - /* [in] */ long newVal) = 0; - - virtual HRESULT STDMETHODCALLTYPE ApplyChanges( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE LoadDefSettings( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDxtJpegVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDxtJpeg * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDxtJpeg * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDxtJpeg * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDxtJpeg * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDxtJpeg * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDxtJpeg * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDxtJpeg * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Capabilities )( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Progress )( - IDxtJpeg * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Progress )( - IDxtJpeg * This, - /* [in] */ float newVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StepResolution )( - IDxtJpeg * This, - /* [retval][out] */ float *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Duration )( - IDxtJpeg * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Duration )( - IDxtJpeg * This, - /* [in] */ float newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaskNum )( - IDxtJpeg * This, - /* [retval][out] */ long *__MIDL_0018); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MaskNum )( - IDxtJpeg * This, - /* [in] */ long __MIDL_0019); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaskName )( - IDxtJpeg * This, - /* [retval][out] */ BSTR *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MaskName )( - IDxtJpeg * This, - /* [in] */ BSTR newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ScaleX )( - IDxtJpeg * This, - /* [retval][out] */ double *__MIDL_0020); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ScaleX )( - IDxtJpeg * This, - /* [in] */ double __MIDL_0021); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ScaleY )( - IDxtJpeg * This, - /* [retval][out] */ double *__MIDL_0022); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ScaleY )( - IDxtJpeg * This, - /* [in] */ double __MIDL_0023); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OffsetX )( - IDxtJpeg * This, - /* [retval][out] */ long *__MIDL_0024); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OffsetX )( - IDxtJpeg * This, - /* [in] */ long __MIDL_0025); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OffsetY )( - IDxtJpeg * This, - /* [retval][out] */ long *__MIDL_0026); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OffsetY )( - IDxtJpeg * This, - /* [in] */ long __MIDL_0027); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReplicateX )( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ReplicateX )( - IDxtJpeg * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReplicateY )( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ReplicateY )( - IDxtJpeg * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_BorderColor )( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_BorderColor )( - IDxtJpeg * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_BorderWidth )( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_BorderWidth )( - IDxtJpeg * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_BorderSoftness )( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_BorderSoftness )( - IDxtJpeg * This, - /* [in] */ long newVal); - - HRESULT ( STDMETHODCALLTYPE *ApplyChanges )( - IDxtJpeg * This); - - HRESULT ( STDMETHODCALLTYPE *LoadDefSettings )( - IDxtJpeg * This); - - END_INTERFACE - } IDxtJpegVtbl; - - interface IDxtJpeg - { - CONST_VTBL struct IDxtJpegVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDxtJpeg_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDxtJpeg_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDxtJpeg_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDxtJpeg_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IDxtJpeg_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IDxtJpeg_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IDxtJpeg_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IDxtJpeg_get_Capabilities(This,pVal) \ - (This)->lpVtbl -> get_Capabilities(This,pVal) - -#define IDxtJpeg_get_Progress(This,pVal) \ - (This)->lpVtbl -> get_Progress(This,pVal) - -#define IDxtJpeg_put_Progress(This,newVal) \ - (This)->lpVtbl -> put_Progress(This,newVal) - -#define IDxtJpeg_get_StepResolution(This,pVal) \ - (This)->lpVtbl -> get_StepResolution(This,pVal) - -#define IDxtJpeg_get_Duration(This,pVal) \ - (This)->lpVtbl -> get_Duration(This,pVal) - -#define IDxtJpeg_put_Duration(This,newVal) \ - (This)->lpVtbl -> put_Duration(This,newVal) - - -#define IDxtJpeg_get_MaskNum(This,__MIDL_0018) \ - (This)->lpVtbl -> get_MaskNum(This,__MIDL_0018) - -#define IDxtJpeg_put_MaskNum(This,__MIDL_0019) \ - (This)->lpVtbl -> put_MaskNum(This,__MIDL_0019) - -#define IDxtJpeg_get_MaskName(This,pVal) \ - (This)->lpVtbl -> get_MaskName(This,pVal) - -#define IDxtJpeg_put_MaskName(This,newVal) \ - (This)->lpVtbl -> put_MaskName(This,newVal) - -#define IDxtJpeg_get_ScaleX(This,__MIDL_0020) \ - (This)->lpVtbl -> get_ScaleX(This,__MIDL_0020) - -#define IDxtJpeg_put_ScaleX(This,__MIDL_0021) \ - (This)->lpVtbl -> put_ScaleX(This,__MIDL_0021) - -#define IDxtJpeg_get_ScaleY(This,__MIDL_0022) \ - (This)->lpVtbl -> get_ScaleY(This,__MIDL_0022) - -#define IDxtJpeg_put_ScaleY(This,__MIDL_0023) \ - (This)->lpVtbl -> put_ScaleY(This,__MIDL_0023) - -#define IDxtJpeg_get_OffsetX(This,__MIDL_0024) \ - (This)->lpVtbl -> get_OffsetX(This,__MIDL_0024) - -#define IDxtJpeg_put_OffsetX(This,__MIDL_0025) \ - (This)->lpVtbl -> put_OffsetX(This,__MIDL_0025) - -#define IDxtJpeg_get_OffsetY(This,__MIDL_0026) \ - (This)->lpVtbl -> get_OffsetY(This,__MIDL_0026) - -#define IDxtJpeg_put_OffsetY(This,__MIDL_0027) \ - (This)->lpVtbl -> put_OffsetY(This,__MIDL_0027) - -#define IDxtJpeg_get_ReplicateX(This,pVal) \ - (This)->lpVtbl -> get_ReplicateX(This,pVal) - -#define IDxtJpeg_put_ReplicateX(This,newVal) \ - (This)->lpVtbl -> put_ReplicateX(This,newVal) - -#define IDxtJpeg_get_ReplicateY(This,pVal) \ - (This)->lpVtbl -> get_ReplicateY(This,pVal) - -#define IDxtJpeg_put_ReplicateY(This,newVal) \ - (This)->lpVtbl -> put_ReplicateY(This,newVal) - -#define IDxtJpeg_get_BorderColor(This,pVal) \ - (This)->lpVtbl -> get_BorderColor(This,pVal) - -#define IDxtJpeg_put_BorderColor(This,newVal) \ - (This)->lpVtbl -> put_BorderColor(This,newVal) - -#define IDxtJpeg_get_BorderWidth(This,pVal) \ - (This)->lpVtbl -> get_BorderWidth(This,pVal) - -#define IDxtJpeg_put_BorderWidth(This,newVal) \ - (This)->lpVtbl -> put_BorderWidth(This,newVal) - -#define IDxtJpeg_get_BorderSoftness(This,pVal) \ - (This)->lpVtbl -> get_BorderSoftness(This,pVal) - -#define IDxtJpeg_put_BorderSoftness(This,newVal) \ - (This)->lpVtbl -> put_BorderSoftness(This,newVal) - -#define IDxtJpeg_ApplyChanges(This) \ - (This)->lpVtbl -> ApplyChanges(This) - -#define IDxtJpeg_LoadDefSettings(This) \ - (This)->lpVtbl -> LoadDefSettings(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_MaskNum_Proxy( - IDxtJpeg * This, - /* [retval][out] */ long *__MIDL_0018); - - -void __RPC_STUB IDxtJpeg_get_MaskNum_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_MaskNum_Proxy( - IDxtJpeg * This, - /* [in] */ long __MIDL_0019); - - -void __RPC_STUB IDxtJpeg_put_MaskNum_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_MaskName_Proxy( - IDxtJpeg * This, - /* [retval][out] */ BSTR *pVal); - - -void __RPC_STUB IDxtJpeg_get_MaskName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_MaskName_Proxy( - IDxtJpeg * This, - /* [in] */ BSTR newVal); - - -void __RPC_STUB IDxtJpeg_put_MaskName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_ScaleX_Proxy( - IDxtJpeg * This, - /* [retval][out] */ double *__MIDL_0020); - - -void __RPC_STUB IDxtJpeg_get_ScaleX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_ScaleX_Proxy( - IDxtJpeg * This, - /* [in] */ double __MIDL_0021); - - -void __RPC_STUB IDxtJpeg_put_ScaleX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_ScaleY_Proxy( - IDxtJpeg * This, - /* [retval][out] */ double *__MIDL_0022); - - -void __RPC_STUB IDxtJpeg_get_ScaleY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_ScaleY_Proxy( - IDxtJpeg * This, - /* [in] */ double __MIDL_0023); - - -void __RPC_STUB IDxtJpeg_put_ScaleY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_OffsetX_Proxy( - IDxtJpeg * This, - /* [retval][out] */ long *__MIDL_0024); - - -void __RPC_STUB IDxtJpeg_get_OffsetX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_OffsetX_Proxy( - IDxtJpeg * This, - /* [in] */ long __MIDL_0025); - - -void __RPC_STUB IDxtJpeg_put_OffsetX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_OffsetY_Proxy( - IDxtJpeg * This, - /* [retval][out] */ long *__MIDL_0026); - - -void __RPC_STUB IDxtJpeg_get_OffsetY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_OffsetY_Proxy( - IDxtJpeg * This, - /* [in] */ long __MIDL_0027); - - -void __RPC_STUB IDxtJpeg_put_OffsetY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_ReplicateX_Proxy( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IDxtJpeg_get_ReplicateX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_ReplicateX_Proxy( - IDxtJpeg * This, - /* [in] */ long newVal); - - -void __RPC_STUB IDxtJpeg_put_ReplicateX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_ReplicateY_Proxy( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IDxtJpeg_get_ReplicateY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_ReplicateY_Proxy( - IDxtJpeg * This, - /* [in] */ long newVal); - - -void __RPC_STUB IDxtJpeg_put_ReplicateY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_BorderColor_Proxy( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IDxtJpeg_get_BorderColor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_BorderColor_Proxy( - IDxtJpeg * This, - /* [in] */ long newVal); - - -void __RPC_STUB IDxtJpeg_put_BorderColor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_BorderWidth_Proxy( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IDxtJpeg_get_BorderWidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_BorderWidth_Proxy( - IDxtJpeg * This, - /* [in] */ long newVal); - - -void __RPC_STUB IDxtJpeg_put_BorderWidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_BorderSoftness_Proxy( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IDxtJpeg_get_BorderSoftness_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_BorderSoftness_Proxy( - IDxtJpeg * This, - /* [in] */ long newVal); - - -void __RPC_STUB IDxtJpeg_put_BorderSoftness_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDxtJpeg_ApplyChanges_Proxy( - IDxtJpeg * This); - - -void __RPC_STUB IDxtJpeg_ApplyChanges_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDxtJpeg_LoadDefSettings_Proxy( - IDxtJpeg * This); - - -void __RPC_STUB IDxtJpeg_LoadDefSettings_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDxtJpeg_INTERFACE_DEFINED__ */ - - -#ifndef __IDxtKey_INTERFACE_DEFINED__ -#define __IDxtKey_INTERFACE_DEFINED__ - -/* interface IDxtKey */ -/* [unique][helpstring][dual][uuid][object] */ - - -EXTERN_C const IID IID_IDxtKey; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("3255de56-38fb-4901-b980-94b438010d7b") - IDxtKey : public IDXEffect - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_KeyType( - /* [retval][out] */ int *__MIDL_0028) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_KeyType( - /* [in] */ int __MIDL_0029) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Hue( - /* [retval][out] */ int *__MIDL_0030) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Hue( - /* [in] */ int __MIDL_0031) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Luminance( - /* [retval][out] */ int *__MIDL_0032) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Luminance( - /* [in] */ int __MIDL_0033) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_RGB( - /* [retval][out] */ DWORD *__MIDL_0034) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_RGB( - /* [in] */ DWORD __MIDL_0035) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Similarity( - /* [retval][out] */ int *__MIDL_0036) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Similarity( - /* [in] */ int __MIDL_0037) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Invert( - /* [retval][out] */ BOOL *__MIDL_0038) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Invert( - /* [in] */ BOOL __MIDL_0039) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDxtKeyVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDxtKey * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDxtKey * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDxtKey * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDxtKey * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDxtKey * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDxtKey * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDxtKey * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Capabilities )( - IDxtKey * This, - /* [retval][out] */ long *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Progress )( - IDxtKey * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Progress )( - IDxtKey * This, - /* [in] */ float newVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StepResolution )( - IDxtKey * This, - /* [retval][out] */ float *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Duration )( - IDxtKey * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Duration )( - IDxtKey * This, - /* [in] */ float newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyType )( - IDxtKey * This, - /* [retval][out] */ int *__MIDL_0028); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyType )( - IDxtKey * This, - /* [in] */ int __MIDL_0029); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Hue )( - IDxtKey * This, - /* [retval][out] */ int *__MIDL_0030); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Hue )( - IDxtKey * This, - /* [in] */ int __MIDL_0031); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Luminance )( - IDxtKey * This, - /* [retval][out] */ int *__MIDL_0032); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Luminance )( - IDxtKey * This, - /* [in] */ int __MIDL_0033); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RGB )( - IDxtKey * This, - /* [retval][out] */ DWORD *__MIDL_0034); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_RGB )( - IDxtKey * This, - /* [in] */ DWORD __MIDL_0035); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Similarity )( - IDxtKey * This, - /* [retval][out] */ int *__MIDL_0036); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Similarity )( - IDxtKey * This, - /* [in] */ int __MIDL_0037); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Invert )( - IDxtKey * This, - /* [retval][out] */ BOOL *__MIDL_0038); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Invert )( - IDxtKey * This, - /* [in] */ BOOL __MIDL_0039); - - END_INTERFACE - } IDxtKeyVtbl; - - interface IDxtKey - { - CONST_VTBL struct IDxtKeyVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDxtKey_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDxtKey_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDxtKey_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDxtKey_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IDxtKey_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IDxtKey_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IDxtKey_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IDxtKey_get_Capabilities(This,pVal) \ - (This)->lpVtbl -> get_Capabilities(This,pVal) - -#define IDxtKey_get_Progress(This,pVal) \ - (This)->lpVtbl -> get_Progress(This,pVal) - -#define IDxtKey_put_Progress(This,newVal) \ - (This)->lpVtbl -> put_Progress(This,newVal) - -#define IDxtKey_get_StepResolution(This,pVal) \ - (This)->lpVtbl -> get_StepResolution(This,pVal) - -#define IDxtKey_get_Duration(This,pVal) \ - (This)->lpVtbl -> get_Duration(This,pVal) - -#define IDxtKey_put_Duration(This,newVal) \ - (This)->lpVtbl -> put_Duration(This,newVal) - - -#define IDxtKey_get_KeyType(This,__MIDL_0028) \ - (This)->lpVtbl -> get_KeyType(This,__MIDL_0028) - -#define IDxtKey_put_KeyType(This,__MIDL_0029) \ - (This)->lpVtbl -> put_KeyType(This,__MIDL_0029) - -#define IDxtKey_get_Hue(This,__MIDL_0030) \ - (This)->lpVtbl -> get_Hue(This,__MIDL_0030) - -#define IDxtKey_put_Hue(This,__MIDL_0031) \ - (This)->lpVtbl -> put_Hue(This,__MIDL_0031) - -#define IDxtKey_get_Luminance(This,__MIDL_0032) \ - (This)->lpVtbl -> get_Luminance(This,__MIDL_0032) - -#define IDxtKey_put_Luminance(This,__MIDL_0033) \ - (This)->lpVtbl -> put_Luminance(This,__MIDL_0033) - -#define IDxtKey_get_RGB(This,__MIDL_0034) \ - (This)->lpVtbl -> get_RGB(This,__MIDL_0034) - -#define IDxtKey_put_RGB(This,__MIDL_0035) \ - (This)->lpVtbl -> put_RGB(This,__MIDL_0035) - -#define IDxtKey_get_Similarity(This,__MIDL_0036) \ - (This)->lpVtbl -> get_Similarity(This,__MIDL_0036) - -#define IDxtKey_put_Similarity(This,__MIDL_0037) \ - (This)->lpVtbl -> put_Similarity(This,__MIDL_0037) - -#define IDxtKey_get_Invert(This,__MIDL_0038) \ - (This)->lpVtbl -> get_Invert(This,__MIDL_0038) - -#define IDxtKey_put_Invert(This,__MIDL_0039) \ - (This)->lpVtbl -> put_Invert(This,__MIDL_0039) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtKey_get_KeyType_Proxy( - IDxtKey * This, - /* [retval][out] */ int *__MIDL_0028); - - -void __RPC_STUB IDxtKey_get_KeyType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtKey_put_KeyType_Proxy( - IDxtKey * This, - /* [in] */ int __MIDL_0029); - - -void __RPC_STUB IDxtKey_put_KeyType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtKey_get_Hue_Proxy( - IDxtKey * This, - /* [retval][out] */ int *__MIDL_0030); - - -void __RPC_STUB IDxtKey_get_Hue_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtKey_put_Hue_Proxy( - IDxtKey * This, - /* [in] */ int __MIDL_0031); - - -void __RPC_STUB IDxtKey_put_Hue_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtKey_get_Luminance_Proxy( - IDxtKey * This, - /* [retval][out] */ int *__MIDL_0032); - - -void __RPC_STUB IDxtKey_get_Luminance_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtKey_put_Luminance_Proxy( - IDxtKey * This, - /* [in] */ int __MIDL_0033); - - -void __RPC_STUB IDxtKey_put_Luminance_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtKey_get_RGB_Proxy( - IDxtKey * This, - /* [retval][out] */ DWORD *__MIDL_0034); - - -void __RPC_STUB IDxtKey_get_RGB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtKey_put_RGB_Proxy( - IDxtKey * This, - /* [in] */ DWORD __MIDL_0035); - - -void __RPC_STUB IDxtKey_put_RGB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtKey_get_Similarity_Proxy( - IDxtKey * This, - /* [retval][out] */ int *__MIDL_0036); - - -void __RPC_STUB IDxtKey_get_Similarity_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtKey_put_Similarity_Proxy( - IDxtKey * This, - /* [in] */ int __MIDL_0037); - - -void __RPC_STUB IDxtKey_put_Similarity_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtKey_get_Invert_Proxy( - IDxtKey * This, - /* [retval][out] */ BOOL *__MIDL_0038); - - -void __RPC_STUB IDxtKey_get_Invert_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtKey_put_Invert_Proxy( - IDxtKey * This, - /* [in] */ BOOL __MIDL_0039); - - -void __RPC_STUB IDxtKey_put_Invert_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDxtKey_INTERFACE_DEFINED__ */ - - -#ifndef __IMediaLocator_INTERFACE_DEFINED__ -#define __IMediaLocator_INTERFACE_DEFINED__ - -/* interface IMediaLocator */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IMediaLocator; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("288581E0-66CE-11d2-918F-00C0DF10D434") - IMediaLocator : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE FindMediaFile( - BSTR Input, - BSTR FilterString, - BSTR *pOutput, - long Flags) = 0; - - virtual HRESULT STDMETHODCALLTYPE AddFoundLocation( - BSTR DirectoryName) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaLocatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaLocator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaLocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaLocator * This); - - HRESULT ( STDMETHODCALLTYPE *FindMediaFile )( - IMediaLocator * This, - BSTR Input, - BSTR FilterString, - BSTR *pOutput, - long Flags); - - HRESULT ( STDMETHODCALLTYPE *AddFoundLocation )( - IMediaLocator * This, - BSTR DirectoryName); - - END_INTERFACE - } IMediaLocatorVtbl; - - interface IMediaLocator - { - CONST_VTBL struct IMediaLocatorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaLocator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaLocator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaLocator_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaLocator_FindMediaFile(This,Input,FilterString,pOutput,Flags) \ - (This)->lpVtbl -> FindMediaFile(This,Input,FilterString,pOutput,Flags) - -#define IMediaLocator_AddFoundLocation(This,DirectoryName) \ - (This)->lpVtbl -> AddFoundLocation(This,DirectoryName) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaLocator_FindMediaFile_Proxy( - IMediaLocator * This, - BSTR Input, - BSTR FilterString, - BSTR *pOutput, - long Flags); - - -void __RPC_STUB IMediaLocator_FindMediaFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaLocator_AddFoundLocation_Proxy( - IMediaLocator * This, - BSTR DirectoryName); - - -void __RPC_STUB IMediaLocator_AddFoundLocation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaLocator_INTERFACE_DEFINED__ */ - - -#ifndef __IMediaDet_INTERFACE_DEFINED__ -#define __IMediaDet_INTERFACE_DEFINED__ - -/* interface IMediaDet */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IMediaDet; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("65BD0710-24D2-4ff7-9324-ED2E5D3ABAFA") - IMediaDet : public IUnknown - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Filter( - /* [retval][out] */ IUnknown **pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Filter( - /* [in] */ IUnknown *newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OutputStreams( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CurrentStream( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_CurrentStream( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_StreamType( - /* [retval][out] */ GUID *pVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_StreamTypeB( - /* [retval][out] */ BSTR *pVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_StreamLength( - /* [retval][out] */ double *pVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Filename( - /* [retval][out] */ BSTR *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Filename( - /* [in] */ BSTR newVal) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetBitmapBits( - double StreamTime, - long *pBufferSize, - char *pBuffer, - long Width, - long Height) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE WriteBitmapBits( - double StreamTime, - long Width, - long Height, - BSTR Filename) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_StreamMediaType( - /* [retval][out] */ AM_MEDIA_TYPE *pVal) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetSampleGrabber( - /* [out] */ ISampleGrabber **ppVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_FrameRate( - /* [retval][out] */ double *pVal) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE EnterBitmapGrabMode( - double SeekTime) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaDetVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaDet * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaDet * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaDet * This); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Filter )( - IMediaDet * This, - /* [retval][out] */ IUnknown **pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Filter )( - IMediaDet * This, - /* [in] */ IUnknown *newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OutputStreams )( - IMediaDet * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CurrentStream )( - IMediaDet * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CurrentStream )( - IMediaDet * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StreamType )( - IMediaDet * This, - /* [retval][out] */ GUID *pVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StreamTypeB )( - IMediaDet * This, - /* [retval][out] */ BSTR *pVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StreamLength )( - IMediaDet * This, - /* [retval][out] */ double *pVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Filename )( - IMediaDet * This, - /* [retval][out] */ BSTR *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Filename )( - IMediaDet * This, - /* [in] */ BSTR newVal); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetBitmapBits )( - IMediaDet * This, - double StreamTime, - long *pBufferSize, - char *pBuffer, - long Width, - long Height); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *WriteBitmapBits )( - IMediaDet * This, - double StreamTime, - long Width, - long Height, - BSTR Filename); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StreamMediaType )( - IMediaDet * This, - /* [retval][out] */ AM_MEDIA_TYPE *pVal); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetSampleGrabber )( - IMediaDet * This, - /* [out] */ ISampleGrabber **ppVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FrameRate )( - IMediaDet * This, - /* [retval][out] */ double *pVal); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *EnterBitmapGrabMode )( - IMediaDet * This, - double SeekTime); - - END_INTERFACE - } IMediaDetVtbl; - - interface IMediaDet - { - CONST_VTBL struct IMediaDetVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaDet_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaDet_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaDet_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaDet_get_Filter(This,pVal) \ - (This)->lpVtbl -> get_Filter(This,pVal) - -#define IMediaDet_put_Filter(This,newVal) \ - (This)->lpVtbl -> put_Filter(This,newVal) - -#define IMediaDet_get_OutputStreams(This,pVal) \ - (This)->lpVtbl -> get_OutputStreams(This,pVal) - -#define IMediaDet_get_CurrentStream(This,pVal) \ - (This)->lpVtbl -> get_CurrentStream(This,pVal) - -#define IMediaDet_put_CurrentStream(This,newVal) \ - (This)->lpVtbl -> put_CurrentStream(This,newVal) - -#define IMediaDet_get_StreamType(This,pVal) \ - (This)->lpVtbl -> get_StreamType(This,pVal) - -#define IMediaDet_get_StreamTypeB(This,pVal) \ - (This)->lpVtbl -> get_StreamTypeB(This,pVal) - -#define IMediaDet_get_StreamLength(This,pVal) \ - (This)->lpVtbl -> get_StreamLength(This,pVal) - -#define IMediaDet_get_Filename(This,pVal) \ - (This)->lpVtbl -> get_Filename(This,pVal) - -#define IMediaDet_put_Filename(This,newVal) \ - (This)->lpVtbl -> put_Filename(This,newVal) - -#define IMediaDet_GetBitmapBits(This,StreamTime,pBufferSize,pBuffer,Width,Height) \ - (This)->lpVtbl -> GetBitmapBits(This,StreamTime,pBufferSize,pBuffer,Width,Height) - -#define IMediaDet_WriteBitmapBits(This,StreamTime,Width,Height,Filename) \ - (This)->lpVtbl -> WriteBitmapBits(This,StreamTime,Width,Height,Filename) - -#define IMediaDet_get_StreamMediaType(This,pVal) \ - (This)->lpVtbl -> get_StreamMediaType(This,pVal) - -#define IMediaDet_GetSampleGrabber(This,ppVal) \ - (This)->lpVtbl -> GetSampleGrabber(This,ppVal) - -#define IMediaDet_get_FrameRate(This,pVal) \ - (This)->lpVtbl -> get_FrameRate(This,pVal) - -#define IMediaDet_EnterBitmapGrabMode(This,SeekTime) \ - (This)->lpVtbl -> EnterBitmapGrabMode(This,SeekTime) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_Filter_Proxy( - IMediaDet * This, - /* [retval][out] */ IUnknown **pVal); - - -void __RPC_STUB IMediaDet_get_Filter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IMediaDet_put_Filter_Proxy( - IMediaDet * This, - /* [in] */ IUnknown *newVal); - - -void __RPC_STUB IMediaDet_put_Filter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_OutputStreams_Proxy( - IMediaDet * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IMediaDet_get_OutputStreams_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_CurrentStream_Proxy( - IMediaDet * This, - /* [retval][out] */ long *pVal); - - -void __RPC_STUB IMediaDet_get_CurrentStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IMediaDet_put_CurrentStream_Proxy( - IMediaDet * This, - /* [in] */ long newVal); - - -void __RPC_STUB IMediaDet_put_CurrentStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_StreamType_Proxy( - IMediaDet * This, - /* [retval][out] */ GUID *pVal); - - -void __RPC_STUB IMediaDet_get_StreamType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_StreamTypeB_Proxy( - IMediaDet * This, - /* [retval][out] */ BSTR *pVal); - - -void __RPC_STUB IMediaDet_get_StreamTypeB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_StreamLength_Proxy( - IMediaDet * This, - /* [retval][out] */ double *pVal); - - -void __RPC_STUB IMediaDet_get_StreamLength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_Filename_Proxy( - IMediaDet * This, - /* [retval][out] */ BSTR *pVal); - - -void __RPC_STUB IMediaDet_get_Filename_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IMediaDet_put_Filename_Proxy( - IMediaDet * This, - /* [in] */ BSTR newVal); - - -void __RPC_STUB IMediaDet_put_Filename_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMediaDet_GetBitmapBits_Proxy( - IMediaDet * This, - double StreamTime, - long *pBufferSize, - char *pBuffer, - long Width, - long Height); - - -void __RPC_STUB IMediaDet_GetBitmapBits_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMediaDet_WriteBitmapBits_Proxy( - IMediaDet * This, - double StreamTime, - long Width, - long Height, - BSTR Filename); - - -void __RPC_STUB IMediaDet_WriteBitmapBits_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_StreamMediaType_Proxy( - IMediaDet * This, - /* [retval][out] */ AM_MEDIA_TYPE *pVal); - - -void __RPC_STUB IMediaDet_get_StreamMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMediaDet_GetSampleGrabber_Proxy( - IMediaDet * This, - /* [out] */ ISampleGrabber **ppVal); - - -void __RPC_STUB IMediaDet_GetSampleGrabber_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_FrameRate_Proxy( - IMediaDet * This, - /* [retval][out] */ double *pVal); - - -void __RPC_STUB IMediaDet_get_FrameRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMediaDet_EnterBitmapGrabMode_Proxy( - IMediaDet * This, - double SeekTime); - - -void __RPC_STUB IMediaDet_EnterBitmapGrabMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaDet_INTERFACE_DEFINED__ */ - - -#ifndef __IGrfCache_INTERFACE_DEFINED__ -#define __IGrfCache_INTERFACE_DEFINED__ - -/* interface IGrfCache */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IGrfCache; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("AE9472BE-B0C3-11D2-8D24-00A0C9441E20") - IGrfCache : public IDispatch - { - public: - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE AddFilter( - IGrfCache *ChainedCache, - LONGLONG ID, - const IBaseFilter *pFilter, - LPCWSTR pName) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ConnectPins( - IGrfCache *ChainedCache, - LONGLONG PinID1, - const IPin *pPin1, - LONGLONG PinID2, - const IPin *pPin2) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetGraph( - const IGraphBuilder *pGraph) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE DoConnectionsNow( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IGrfCacheVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IGrfCache * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IGrfCache * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IGrfCache * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IGrfCache * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IGrfCache * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IGrfCache * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IGrfCache * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *AddFilter )( - IGrfCache * This, - IGrfCache *ChainedCache, - LONGLONG ID, - const IBaseFilter *pFilter, - LPCWSTR pName); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *ConnectPins )( - IGrfCache * This, - IGrfCache *ChainedCache, - LONGLONG PinID1, - const IPin *pPin1, - LONGLONG PinID2, - const IPin *pPin2); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetGraph )( - IGrfCache * This, - const IGraphBuilder *pGraph); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *DoConnectionsNow )( - IGrfCache * This); - - END_INTERFACE - } IGrfCacheVtbl; - - interface IGrfCache - { - CONST_VTBL struct IGrfCacheVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IGrfCache_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IGrfCache_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IGrfCache_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IGrfCache_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IGrfCache_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IGrfCache_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IGrfCache_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IGrfCache_AddFilter(This,ChainedCache,ID,pFilter,pName) \ - (This)->lpVtbl -> AddFilter(This,ChainedCache,ID,pFilter,pName) - -#define IGrfCache_ConnectPins(This,ChainedCache,PinID1,pPin1,PinID2,pPin2) \ - (This)->lpVtbl -> ConnectPins(This,ChainedCache,PinID1,pPin1,PinID2,pPin2) - -#define IGrfCache_SetGraph(This,pGraph) \ - (This)->lpVtbl -> SetGraph(This,pGraph) - -#define IGrfCache_DoConnectionsNow(This) \ - (This)->lpVtbl -> DoConnectionsNow(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IGrfCache_AddFilter_Proxy( - IGrfCache * This, - IGrfCache *ChainedCache, - LONGLONG ID, - const IBaseFilter *pFilter, - LPCWSTR pName); - - -void __RPC_STUB IGrfCache_AddFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IGrfCache_ConnectPins_Proxy( - IGrfCache * This, - IGrfCache *ChainedCache, - LONGLONG PinID1, - const IPin *pPin1, - LONGLONG PinID2, - const IPin *pPin2); - - -void __RPC_STUB IGrfCache_ConnectPins_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IGrfCache_SetGraph_Proxy( - IGrfCache * This, - const IGraphBuilder *pGraph); - - -void __RPC_STUB IGrfCache_SetGraph_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IGrfCache_DoConnectionsNow_Proxy( - IGrfCache * This); - - -void __RPC_STUB IGrfCache_DoConnectionsNow_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IGrfCache_INTERFACE_DEFINED__ */ - - -#ifndef __IRenderEngine_INTERFACE_DEFINED__ -#define __IRenderEngine_INTERFACE_DEFINED__ - -/* interface IRenderEngine */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IRenderEngine; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("6BEE3A81-66C9-11d2-918F-00C0DF10D434") - IRenderEngine : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetTimelineObject( - IAMTimeline *pTimeline) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimelineObject( - /* [out] */ IAMTimeline **ppTimeline) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFilterGraph( - /* [out] */ IGraphBuilder **ppFG) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFilterGraph( - IGraphBuilder *pFG) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetInterestRange( - REFERENCE_TIME Start, - REFERENCE_TIME Stop) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetInterestRange2( - double Start, - double Stop) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetRenderRange( - REFERENCE_TIME Start, - REFERENCE_TIME Stop) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetRenderRange2( - double Start, - double Stop) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetGroupOutputPin( - long Group, - /* [out] */ IPin **ppRenderPin) = 0; - - virtual HRESULT STDMETHODCALLTYPE ScrapIt( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE RenderOutputPins( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetVendorString( - /* [retval][out] */ BSTR *pVendorID) = 0; - - virtual HRESULT STDMETHODCALLTYPE ConnectFrontEnd( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetSourceConnectCallback( - IGrfCache *pCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDynamicReconnectLevel( - long Level) = 0; - - virtual HRESULT STDMETHODCALLTYPE DoSmartRecompression( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE UseInSmartRecompressionGraph( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetSourceNameValidation( - BSTR FilterString, - IMediaLocator *pOverride, - LONG Flags) = 0; - - virtual HRESULT STDMETHODCALLTYPE Commit( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Decommit( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCaps( - long Index, - long *pReturn) = 0; - - }; - -#else /* C style interface */ - - typedef struct IRenderEngineVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IRenderEngine * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IRenderEngine * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *SetTimelineObject )( - IRenderEngine * This, - IAMTimeline *pTimeline); - - HRESULT ( STDMETHODCALLTYPE *GetTimelineObject )( - IRenderEngine * This, - /* [out] */ IAMTimeline **ppTimeline); - - HRESULT ( STDMETHODCALLTYPE *GetFilterGraph )( - IRenderEngine * This, - /* [out] */ IGraphBuilder **ppFG); - - HRESULT ( STDMETHODCALLTYPE *SetFilterGraph )( - IRenderEngine * This, - IGraphBuilder *pFG); - - HRESULT ( STDMETHODCALLTYPE *SetInterestRange )( - IRenderEngine * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - HRESULT ( STDMETHODCALLTYPE *SetInterestRange2 )( - IRenderEngine * This, - double Start, - double Stop); - - HRESULT ( STDMETHODCALLTYPE *SetRenderRange )( - IRenderEngine * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - HRESULT ( STDMETHODCALLTYPE *SetRenderRange2 )( - IRenderEngine * This, - double Start, - double Stop); - - HRESULT ( STDMETHODCALLTYPE *GetGroupOutputPin )( - IRenderEngine * This, - long Group, - /* [out] */ IPin **ppRenderPin); - - HRESULT ( STDMETHODCALLTYPE *ScrapIt )( - IRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *RenderOutputPins )( - IRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *GetVendorString )( - IRenderEngine * This, - /* [retval][out] */ BSTR *pVendorID); - - HRESULT ( STDMETHODCALLTYPE *ConnectFrontEnd )( - IRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *SetSourceConnectCallback )( - IRenderEngine * This, - IGrfCache *pCallback); - - HRESULT ( STDMETHODCALLTYPE *SetDynamicReconnectLevel )( - IRenderEngine * This, - long Level); - - HRESULT ( STDMETHODCALLTYPE *DoSmartRecompression )( - IRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *UseInSmartRecompressionGraph )( - IRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *SetSourceNameValidation )( - IRenderEngine * This, - BSTR FilterString, - IMediaLocator *pOverride, - LONG Flags); - - HRESULT ( STDMETHODCALLTYPE *Commit )( - IRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *Decommit )( - IRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *GetCaps )( - IRenderEngine * This, - long Index, - long *pReturn); - - END_INTERFACE - } IRenderEngineVtbl; - - interface IRenderEngine - { - CONST_VTBL struct IRenderEngineVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IRenderEngine_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IRenderEngine_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IRenderEngine_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IRenderEngine_SetTimelineObject(This,pTimeline) \ - (This)->lpVtbl -> SetTimelineObject(This,pTimeline) - -#define IRenderEngine_GetTimelineObject(This,ppTimeline) \ - (This)->lpVtbl -> GetTimelineObject(This,ppTimeline) - -#define IRenderEngine_GetFilterGraph(This,ppFG) \ - (This)->lpVtbl -> GetFilterGraph(This,ppFG) - -#define IRenderEngine_SetFilterGraph(This,pFG) \ - (This)->lpVtbl -> SetFilterGraph(This,pFG) - -#define IRenderEngine_SetInterestRange(This,Start,Stop) \ - (This)->lpVtbl -> SetInterestRange(This,Start,Stop) - -#define IRenderEngine_SetInterestRange2(This,Start,Stop) \ - (This)->lpVtbl -> SetInterestRange2(This,Start,Stop) - -#define IRenderEngine_SetRenderRange(This,Start,Stop) \ - (This)->lpVtbl -> SetRenderRange(This,Start,Stop) - -#define IRenderEngine_SetRenderRange2(This,Start,Stop) \ - (This)->lpVtbl -> SetRenderRange2(This,Start,Stop) - -#define IRenderEngine_GetGroupOutputPin(This,Group,ppRenderPin) \ - (This)->lpVtbl -> GetGroupOutputPin(This,Group,ppRenderPin) - -#define IRenderEngine_ScrapIt(This) \ - (This)->lpVtbl -> ScrapIt(This) - -#define IRenderEngine_RenderOutputPins(This) \ - (This)->lpVtbl -> RenderOutputPins(This) - -#define IRenderEngine_GetVendorString(This,pVendorID) \ - (This)->lpVtbl -> GetVendorString(This,pVendorID) - -#define IRenderEngine_ConnectFrontEnd(This) \ - (This)->lpVtbl -> ConnectFrontEnd(This) - -#define IRenderEngine_SetSourceConnectCallback(This,pCallback) \ - (This)->lpVtbl -> SetSourceConnectCallback(This,pCallback) - -#define IRenderEngine_SetDynamicReconnectLevel(This,Level) \ - (This)->lpVtbl -> SetDynamicReconnectLevel(This,Level) - -#define IRenderEngine_DoSmartRecompression(This) \ - (This)->lpVtbl -> DoSmartRecompression(This) - -#define IRenderEngine_UseInSmartRecompressionGraph(This) \ - (This)->lpVtbl -> UseInSmartRecompressionGraph(This) - -#define IRenderEngine_SetSourceNameValidation(This,FilterString,pOverride,Flags) \ - (This)->lpVtbl -> SetSourceNameValidation(This,FilterString,pOverride,Flags) - -#define IRenderEngine_Commit(This) \ - (This)->lpVtbl -> Commit(This) - -#define IRenderEngine_Decommit(This) \ - (This)->lpVtbl -> Decommit(This) - -#define IRenderEngine_GetCaps(This,Index,pReturn) \ - (This)->lpVtbl -> GetCaps(This,Index,pReturn) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IRenderEngine_SetTimelineObject_Proxy( - IRenderEngine * This, - IAMTimeline *pTimeline); - - -void __RPC_STUB IRenderEngine_SetTimelineObject_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_GetTimelineObject_Proxy( - IRenderEngine * This, - /* [out] */ IAMTimeline **ppTimeline); - - -void __RPC_STUB IRenderEngine_GetTimelineObject_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_GetFilterGraph_Proxy( - IRenderEngine * This, - /* [out] */ IGraphBuilder **ppFG); - - -void __RPC_STUB IRenderEngine_GetFilterGraph_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_SetFilterGraph_Proxy( - IRenderEngine * This, - IGraphBuilder *pFG); - - -void __RPC_STUB IRenderEngine_SetFilterGraph_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_SetInterestRange_Proxy( - IRenderEngine * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - -void __RPC_STUB IRenderEngine_SetInterestRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_SetInterestRange2_Proxy( - IRenderEngine * This, - double Start, - double Stop); - - -void __RPC_STUB IRenderEngine_SetInterestRange2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_SetRenderRange_Proxy( - IRenderEngine * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - -void __RPC_STUB IRenderEngine_SetRenderRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_SetRenderRange2_Proxy( - IRenderEngine * This, - double Start, - double Stop); - - -void __RPC_STUB IRenderEngine_SetRenderRange2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_GetGroupOutputPin_Proxy( - IRenderEngine * This, - long Group, - /* [out] */ IPin **ppRenderPin); - - -void __RPC_STUB IRenderEngine_GetGroupOutputPin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_ScrapIt_Proxy( - IRenderEngine * This); - - -void __RPC_STUB IRenderEngine_ScrapIt_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_RenderOutputPins_Proxy( - IRenderEngine * This); - - -void __RPC_STUB IRenderEngine_RenderOutputPins_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_GetVendorString_Proxy( - IRenderEngine * This, - /* [retval][out] */ BSTR *pVendorID); - - -void __RPC_STUB IRenderEngine_GetVendorString_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_ConnectFrontEnd_Proxy( - IRenderEngine * This); - - -void __RPC_STUB IRenderEngine_ConnectFrontEnd_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_SetSourceConnectCallback_Proxy( - IRenderEngine * This, - IGrfCache *pCallback); - - -void __RPC_STUB IRenderEngine_SetSourceConnectCallback_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_SetDynamicReconnectLevel_Proxy( - IRenderEngine * This, - long Level); - - -void __RPC_STUB IRenderEngine_SetDynamicReconnectLevel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_DoSmartRecompression_Proxy( - IRenderEngine * This); - - -void __RPC_STUB IRenderEngine_DoSmartRecompression_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_UseInSmartRecompressionGraph_Proxy( - IRenderEngine * This); - - -void __RPC_STUB IRenderEngine_UseInSmartRecompressionGraph_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_SetSourceNameValidation_Proxy( - IRenderEngine * This, - BSTR FilterString, - IMediaLocator *pOverride, - LONG Flags); - - -void __RPC_STUB IRenderEngine_SetSourceNameValidation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_Commit_Proxy( - IRenderEngine * This); - - -void __RPC_STUB IRenderEngine_Commit_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_Decommit_Proxy( - IRenderEngine * This); - - -void __RPC_STUB IRenderEngine_Decommit_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRenderEngine_GetCaps_Proxy( - IRenderEngine * This, - long Index, - long *pReturn); - - -void __RPC_STUB IRenderEngine_GetCaps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IRenderEngine_INTERFACE_DEFINED__ */ - - -#ifndef __IFindCompressorCB_INTERFACE_DEFINED__ -#define __IFindCompressorCB_INTERFACE_DEFINED__ - -/* interface IFindCompressorCB */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IFindCompressorCB; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("F03FA8DE-879A-4d59-9B2C-26BB1CF83461") - IFindCompressorCB : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetCompressor( - AM_MEDIA_TYPE *pType, - AM_MEDIA_TYPE *pCompType, - /* [out] */ IBaseFilter **ppFilter) = 0; - - }; - -#else /* C style interface */ - - typedef struct IFindCompressorCBVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IFindCompressorCB * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IFindCompressorCB * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IFindCompressorCB * This); - - HRESULT ( STDMETHODCALLTYPE *GetCompressor )( - IFindCompressorCB * This, - AM_MEDIA_TYPE *pType, - AM_MEDIA_TYPE *pCompType, - /* [out] */ IBaseFilter **ppFilter); - - END_INTERFACE - } IFindCompressorCBVtbl; - - interface IFindCompressorCB - { - CONST_VTBL struct IFindCompressorCBVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IFindCompressorCB_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IFindCompressorCB_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IFindCompressorCB_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IFindCompressorCB_GetCompressor(This,pType,pCompType,ppFilter) \ - (This)->lpVtbl -> GetCompressor(This,pType,pCompType,ppFilter) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IFindCompressorCB_GetCompressor_Proxy( - IFindCompressorCB * This, - AM_MEDIA_TYPE *pType, - AM_MEDIA_TYPE *pCompType, - /* [out] */ IBaseFilter **ppFilter); - - -void __RPC_STUB IFindCompressorCB_GetCompressor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IFindCompressorCB_INTERFACE_DEFINED__ */ - - -#ifndef __ISmartRenderEngine_INTERFACE_DEFINED__ -#define __ISmartRenderEngine_INTERFACE_DEFINED__ - -/* interface ISmartRenderEngine */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_ISmartRenderEngine; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("F03FA8CE-879A-4d59-9B2C-26BB1CF83461") - ISmartRenderEngine : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetGroupCompressor( - long Group, - IBaseFilter *pCompressor) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetGroupCompressor( - long Group, - IBaseFilter **pCompressor) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFindCompressorCB( - IFindCompressorCB *pCallback) = 0; - - }; - -#else /* C style interface */ - - typedef struct ISmartRenderEngineVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ISmartRenderEngine * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ISmartRenderEngine * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ISmartRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *SetGroupCompressor )( - ISmartRenderEngine * This, - long Group, - IBaseFilter *pCompressor); - - HRESULT ( STDMETHODCALLTYPE *GetGroupCompressor )( - ISmartRenderEngine * This, - long Group, - IBaseFilter **pCompressor); - - HRESULT ( STDMETHODCALLTYPE *SetFindCompressorCB )( - ISmartRenderEngine * This, - IFindCompressorCB *pCallback); - - END_INTERFACE - } ISmartRenderEngineVtbl; - - interface ISmartRenderEngine - { - CONST_VTBL struct ISmartRenderEngineVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ISmartRenderEngine_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ISmartRenderEngine_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ISmartRenderEngine_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ISmartRenderEngine_SetGroupCompressor(This,Group,pCompressor) \ - (This)->lpVtbl -> SetGroupCompressor(This,Group,pCompressor) - -#define ISmartRenderEngine_GetGroupCompressor(This,Group,pCompressor) \ - (This)->lpVtbl -> GetGroupCompressor(This,Group,pCompressor) - -#define ISmartRenderEngine_SetFindCompressorCB(This,pCallback) \ - (This)->lpVtbl -> SetFindCompressorCB(This,pCallback) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE ISmartRenderEngine_SetGroupCompressor_Proxy( - ISmartRenderEngine * This, - long Group, - IBaseFilter *pCompressor); - - -void __RPC_STUB ISmartRenderEngine_SetGroupCompressor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ISmartRenderEngine_GetGroupCompressor_Proxy( - ISmartRenderEngine * This, - long Group, - IBaseFilter **pCompressor); - - -void __RPC_STUB ISmartRenderEngine_GetGroupCompressor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ISmartRenderEngine_SetFindCompressorCB_Proxy( - ISmartRenderEngine * This, - IFindCompressorCB *pCallback); - - -void __RPC_STUB ISmartRenderEngine_SetFindCompressorCB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ISmartRenderEngine_INTERFACE_DEFINED__ */ - - -#ifndef __IAMTimelineObj_INTERFACE_DEFINED__ -#define __IAMTimelineObj_INTERFACE_DEFINED__ - -/* interface IAMTimelineObj */ -/* [unique][helpstring][uuid][local][object] */ - - -EXTERN_C const IID IID_IAMTimelineObj; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("78530B77-61F9-11D2-8CAD-00A024580902") - IAMTimelineObj : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetStartStop( - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetStartStop2( - REFTIME *pStart, - REFTIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE FixTimes( - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE FixTimes2( - REFTIME *pStart, - REFTIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetStartStop( - REFERENCE_TIME Start, - REFERENCE_TIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetStartStop2( - REFTIME Start, - REFTIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetPropertySetter( - /* [retval][out] */ IPropertySetter **pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetPropertySetter( - IPropertySetter *newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSubObject( - /* [retval][out] */ IUnknown **pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetSubObject( - IUnknown *newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetSubObjectGUID( - GUID newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetSubObjectGUIDB( - BSTR newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSubObjectGUID( - GUID *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSubObjectGUIDB( - /* [retval][out] */ BSTR *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSubObjectLoaded( - BOOL *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetTimelineType( - TIMELINE_MAJOR_TYPE *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetTimelineType( - TIMELINE_MAJOR_TYPE newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetUserID( - long *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetUserID( - long newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetGenID( - long *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetUserName( - /* [retval][out] */ BSTR *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetUserName( - BSTR newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetUserData( - BYTE *pData, - long *pSize) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetUserData( - BYTE *pData, - long Size) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMuted( - BOOL *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMuted( - BOOL newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetLocked( - BOOL *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetLocked( - BOOL newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDirtyRange( - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDirtyRange2( - REFTIME *pStart, - REFTIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetDirtyRange( - REFERENCE_TIME Start, - REFERENCE_TIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetDirtyRange2( - REFTIME Start, - REFTIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ClearDirty( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Remove( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RemoveAll( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimelineNoRef( - IAMTimeline **ppResult) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetGroupIBelongTo( - /* [out] */ IAMTimelineGroup **ppGroup) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetEmbedDepth( - long *pVal) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTimelineObjVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineObj * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineObj * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineObj * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetStartStop )( - IAMTimelineObj * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetStartStop2 )( - IAMTimelineObj * This, - REFTIME *pStart, - REFTIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *FixTimes )( - IAMTimelineObj * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *FixTimes2 )( - IAMTimelineObj * This, - REFTIME *pStart, - REFTIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetStartStop )( - IAMTimelineObj * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetStartStop2 )( - IAMTimelineObj * This, - REFTIME Start, - REFTIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetPropertySetter )( - IAMTimelineObj * This, - /* [retval][out] */ IPropertySetter **pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetPropertySetter )( - IAMTimelineObj * This, - IPropertySetter *newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetSubObject )( - IAMTimelineObj * This, - /* [retval][out] */ IUnknown **pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetSubObject )( - IAMTimelineObj * This, - IUnknown *newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetSubObjectGUID )( - IAMTimelineObj * This, - GUID newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetSubObjectGUIDB )( - IAMTimelineObj * This, - BSTR newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetSubObjectGUID )( - IAMTimelineObj * This, - GUID *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetSubObjectGUIDB )( - IAMTimelineObj * This, - /* [retval][out] */ BSTR *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetSubObjectLoaded )( - IAMTimelineObj * This, - BOOL *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetTimelineType )( - IAMTimelineObj * This, - TIMELINE_MAJOR_TYPE *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetTimelineType )( - IAMTimelineObj * This, - TIMELINE_MAJOR_TYPE newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetUserID )( - IAMTimelineObj * This, - long *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetUserID )( - IAMTimelineObj * This, - long newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetGenID )( - IAMTimelineObj * This, - long *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetUserName )( - IAMTimelineObj * This, - /* [retval][out] */ BSTR *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetUserName )( - IAMTimelineObj * This, - BSTR newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetUserData )( - IAMTimelineObj * This, - BYTE *pData, - long *pSize); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetUserData )( - IAMTimelineObj * This, - BYTE *pData, - long Size); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMuted )( - IAMTimelineObj * This, - BOOL *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMuted )( - IAMTimelineObj * This, - BOOL newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetLocked )( - IAMTimelineObj * This, - BOOL *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetLocked )( - IAMTimelineObj * This, - BOOL newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetDirtyRange )( - IAMTimelineObj * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetDirtyRange2 )( - IAMTimelineObj * This, - REFTIME *pStart, - REFTIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetDirtyRange )( - IAMTimelineObj * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetDirtyRange2 )( - IAMTimelineObj * This, - REFTIME Start, - REFTIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *ClearDirty )( - IAMTimelineObj * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *Remove )( - IAMTimelineObj * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *RemoveAll )( - IAMTimelineObj * This); - - HRESULT ( STDMETHODCALLTYPE *GetTimelineNoRef )( - IAMTimelineObj * This, - IAMTimeline **ppResult); - - HRESULT ( STDMETHODCALLTYPE *GetGroupIBelongTo )( - IAMTimelineObj * This, - /* [out] */ IAMTimelineGroup **ppGroup); - - HRESULT ( STDMETHODCALLTYPE *GetEmbedDepth )( - IAMTimelineObj * This, - long *pVal); - - END_INTERFACE - } IAMTimelineObjVtbl; - - interface IAMTimelineObj - { - CONST_VTBL struct IAMTimelineObjVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTimelineObj_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTimelineObj_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTimelineObj_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTimelineObj_GetStartStop(This,pStart,pStop) \ - (This)->lpVtbl -> GetStartStop(This,pStart,pStop) - -#define IAMTimelineObj_GetStartStop2(This,pStart,pStop) \ - (This)->lpVtbl -> GetStartStop2(This,pStart,pStop) - -#define IAMTimelineObj_FixTimes(This,pStart,pStop) \ - (This)->lpVtbl -> FixTimes(This,pStart,pStop) - -#define IAMTimelineObj_FixTimes2(This,pStart,pStop) \ - (This)->lpVtbl -> FixTimes2(This,pStart,pStop) - -#define IAMTimelineObj_SetStartStop(This,Start,Stop) \ - (This)->lpVtbl -> SetStartStop(This,Start,Stop) - -#define IAMTimelineObj_SetStartStop2(This,Start,Stop) \ - (This)->lpVtbl -> SetStartStop2(This,Start,Stop) - -#define IAMTimelineObj_GetPropertySetter(This,pVal) \ - (This)->lpVtbl -> GetPropertySetter(This,pVal) - -#define IAMTimelineObj_SetPropertySetter(This,newVal) \ - (This)->lpVtbl -> SetPropertySetter(This,newVal) - -#define IAMTimelineObj_GetSubObject(This,pVal) \ - (This)->lpVtbl -> GetSubObject(This,pVal) - -#define IAMTimelineObj_SetSubObject(This,newVal) \ - (This)->lpVtbl -> SetSubObject(This,newVal) - -#define IAMTimelineObj_SetSubObjectGUID(This,newVal) \ - (This)->lpVtbl -> SetSubObjectGUID(This,newVal) - -#define IAMTimelineObj_SetSubObjectGUIDB(This,newVal) \ - (This)->lpVtbl -> SetSubObjectGUIDB(This,newVal) - -#define IAMTimelineObj_GetSubObjectGUID(This,pVal) \ - (This)->lpVtbl -> GetSubObjectGUID(This,pVal) - -#define IAMTimelineObj_GetSubObjectGUIDB(This,pVal) \ - (This)->lpVtbl -> GetSubObjectGUIDB(This,pVal) - -#define IAMTimelineObj_GetSubObjectLoaded(This,pVal) \ - (This)->lpVtbl -> GetSubObjectLoaded(This,pVal) - -#define IAMTimelineObj_GetTimelineType(This,pVal) \ - (This)->lpVtbl -> GetTimelineType(This,pVal) - -#define IAMTimelineObj_SetTimelineType(This,newVal) \ - (This)->lpVtbl -> SetTimelineType(This,newVal) - -#define IAMTimelineObj_GetUserID(This,pVal) \ - (This)->lpVtbl -> GetUserID(This,pVal) - -#define IAMTimelineObj_SetUserID(This,newVal) \ - (This)->lpVtbl -> SetUserID(This,newVal) - -#define IAMTimelineObj_GetGenID(This,pVal) \ - (This)->lpVtbl -> GetGenID(This,pVal) - -#define IAMTimelineObj_GetUserName(This,pVal) \ - (This)->lpVtbl -> GetUserName(This,pVal) - -#define IAMTimelineObj_SetUserName(This,newVal) \ - (This)->lpVtbl -> SetUserName(This,newVal) - -#define IAMTimelineObj_GetUserData(This,pData,pSize) \ - (This)->lpVtbl -> GetUserData(This,pData,pSize) - -#define IAMTimelineObj_SetUserData(This,pData,Size) \ - (This)->lpVtbl -> SetUserData(This,pData,Size) - -#define IAMTimelineObj_GetMuted(This,pVal) \ - (This)->lpVtbl -> GetMuted(This,pVal) - -#define IAMTimelineObj_SetMuted(This,newVal) \ - (This)->lpVtbl -> SetMuted(This,newVal) - -#define IAMTimelineObj_GetLocked(This,pVal) \ - (This)->lpVtbl -> GetLocked(This,pVal) - -#define IAMTimelineObj_SetLocked(This,newVal) \ - (This)->lpVtbl -> SetLocked(This,newVal) - -#define IAMTimelineObj_GetDirtyRange(This,pStart,pStop) \ - (This)->lpVtbl -> GetDirtyRange(This,pStart,pStop) - -#define IAMTimelineObj_GetDirtyRange2(This,pStart,pStop) \ - (This)->lpVtbl -> GetDirtyRange2(This,pStart,pStop) - -#define IAMTimelineObj_SetDirtyRange(This,Start,Stop) \ - (This)->lpVtbl -> SetDirtyRange(This,Start,Stop) - -#define IAMTimelineObj_SetDirtyRange2(This,Start,Stop) \ - (This)->lpVtbl -> SetDirtyRange2(This,Start,Stop) - -#define IAMTimelineObj_ClearDirty(This) \ - (This)->lpVtbl -> ClearDirty(This) - -#define IAMTimelineObj_Remove(This) \ - (This)->lpVtbl -> Remove(This) - -#define IAMTimelineObj_RemoveAll(This) \ - (This)->lpVtbl -> RemoveAll(This) - -#define IAMTimelineObj_GetTimelineNoRef(This,ppResult) \ - (This)->lpVtbl -> GetTimelineNoRef(This,ppResult) - -#define IAMTimelineObj_GetGroupIBelongTo(This,ppGroup) \ - (This)->lpVtbl -> GetGroupIBelongTo(This,ppGroup) - -#define IAMTimelineObj_GetEmbedDepth(This,pVal) \ - (This)->lpVtbl -> GetEmbedDepth(This,pVal) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetStartStop_Proxy( - IAMTimelineObj * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - -void __RPC_STUB IAMTimelineObj_GetStartStop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetStartStop2_Proxy( - IAMTimelineObj * This, - REFTIME *pStart, - REFTIME *pStop); - - -void __RPC_STUB IAMTimelineObj_GetStartStop2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_FixTimes_Proxy( - IAMTimelineObj * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - -void __RPC_STUB IAMTimelineObj_FixTimes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_FixTimes2_Proxy( - IAMTimelineObj * This, - REFTIME *pStart, - REFTIME *pStop); - - -void __RPC_STUB IAMTimelineObj_FixTimes2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetStartStop_Proxy( - IAMTimelineObj * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - -void __RPC_STUB IAMTimelineObj_SetStartStop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetStartStop2_Proxy( - IAMTimelineObj * This, - REFTIME Start, - REFTIME Stop); - - -void __RPC_STUB IAMTimelineObj_SetStartStop2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetPropertySetter_Proxy( - IAMTimelineObj * This, - /* [retval][out] */ IPropertySetter **pVal); - - -void __RPC_STUB IAMTimelineObj_GetPropertySetter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetPropertySetter_Proxy( - IAMTimelineObj * This, - IPropertySetter *newVal); - - -void __RPC_STUB IAMTimelineObj_SetPropertySetter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetSubObject_Proxy( - IAMTimelineObj * This, - /* [retval][out] */ IUnknown **pVal); - - -void __RPC_STUB IAMTimelineObj_GetSubObject_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetSubObject_Proxy( - IAMTimelineObj * This, - IUnknown *newVal); - - -void __RPC_STUB IAMTimelineObj_SetSubObject_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetSubObjectGUID_Proxy( - IAMTimelineObj * This, - GUID newVal); - - -void __RPC_STUB IAMTimelineObj_SetSubObjectGUID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetSubObjectGUIDB_Proxy( - IAMTimelineObj * This, - BSTR newVal); - - -void __RPC_STUB IAMTimelineObj_SetSubObjectGUIDB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetSubObjectGUID_Proxy( - IAMTimelineObj * This, - GUID *pVal); - - -void __RPC_STUB IAMTimelineObj_GetSubObjectGUID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetSubObjectGUIDB_Proxy( - IAMTimelineObj * This, - /* [retval][out] */ BSTR *pVal); - - -void __RPC_STUB IAMTimelineObj_GetSubObjectGUIDB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetSubObjectLoaded_Proxy( - IAMTimelineObj * This, - BOOL *pVal); - - -void __RPC_STUB IAMTimelineObj_GetSubObjectLoaded_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetTimelineType_Proxy( - IAMTimelineObj * This, - TIMELINE_MAJOR_TYPE *pVal); - - -void __RPC_STUB IAMTimelineObj_GetTimelineType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetTimelineType_Proxy( - IAMTimelineObj * This, - TIMELINE_MAJOR_TYPE newVal); - - -void __RPC_STUB IAMTimelineObj_SetTimelineType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetUserID_Proxy( - IAMTimelineObj * This, - long *pVal); - - -void __RPC_STUB IAMTimelineObj_GetUserID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetUserID_Proxy( - IAMTimelineObj * This, - long newVal); - - -void __RPC_STUB IAMTimelineObj_SetUserID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetGenID_Proxy( - IAMTimelineObj * This, - long *pVal); - - -void __RPC_STUB IAMTimelineObj_GetGenID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetUserName_Proxy( - IAMTimelineObj * This, - /* [retval][out] */ BSTR *pVal); - - -void __RPC_STUB IAMTimelineObj_GetUserName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetUserName_Proxy( - IAMTimelineObj * This, - BSTR newVal); - - -void __RPC_STUB IAMTimelineObj_SetUserName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetUserData_Proxy( - IAMTimelineObj * This, - BYTE *pData, - long *pSize); - - -void __RPC_STUB IAMTimelineObj_GetUserData_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetUserData_Proxy( - IAMTimelineObj * This, - BYTE *pData, - long Size); - - -void __RPC_STUB IAMTimelineObj_SetUserData_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetMuted_Proxy( - IAMTimelineObj * This, - BOOL *pVal); - - -void __RPC_STUB IAMTimelineObj_GetMuted_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetMuted_Proxy( - IAMTimelineObj * This, - BOOL newVal); - - -void __RPC_STUB IAMTimelineObj_SetMuted_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetLocked_Proxy( - IAMTimelineObj * This, - BOOL *pVal); - - -void __RPC_STUB IAMTimelineObj_GetLocked_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetLocked_Proxy( - IAMTimelineObj * This, - BOOL newVal); - - -void __RPC_STUB IAMTimelineObj_SetLocked_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetDirtyRange_Proxy( - IAMTimelineObj * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - -void __RPC_STUB IAMTimelineObj_GetDirtyRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetDirtyRange2_Proxy( - IAMTimelineObj * This, - REFTIME *pStart, - REFTIME *pStop); - - -void __RPC_STUB IAMTimelineObj_GetDirtyRange2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetDirtyRange_Proxy( - IAMTimelineObj * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - -void __RPC_STUB IAMTimelineObj_SetDirtyRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetDirtyRange2_Proxy( - IAMTimelineObj * This, - REFTIME Start, - REFTIME Stop); - - -void __RPC_STUB IAMTimelineObj_SetDirtyRange2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_ClearDirty_Proxy( - IAMTimelineObj * This); - - -void __RPC_STUB IAMTimelineObj_ClearDirty_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_Remove_Proxy( - IAMTimelineObj * This); - - -void __RPC_STUB IAMTimelineObj_Remove_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_RemoveAll_Proxy( - IAMTimelineObj * This); - - -void __RPC_STUB IAMTimelineObj_RemoveAll_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetTimelineNoRef_Proxy( - IAMTimelineObj * This, - IAMTimeline **ppResult); - - -void __RPC_STUB IAMTimelineObj_GetTimelineNoRef_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetGroupIBelongTo_Proxy( - IAMTimelineObj * This, - /* [out] */ IAMTimelineGroup **ppGroup); - - -void __RPC_STUB IAMTimelineObj_GetGroupIBelongTo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetEmbedDepth_Proxy( - IAMTimelineObj * This, - long *pVal); - - -void __RPC_STUB IAMTimelineObj_GetEmbedDepth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTimelineObj_INTERFACE_DEFINED__ */ - - -#ifndef __IAMTimelineEffectable_INTERFACE_DEFINED__ -#define __IAMTimelineEffectable_INTERFACE_DEFINED__ - -/* interface IAMTimelineEffectable */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IAMTimelineEffectable; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("EAE58537-622E-11d2-8CAD-00A024580902") - IAMTimelineEffectable : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE EffectInsBefore( - IAMTimelineObj *pFX, - long priority) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE EffectSwapPriorities( - long PriorityA, - long PriorityB) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE EffectGetCount( - long *pCount) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetEffect( - /* [out] */ IAMTimelineObj **ppFx, - long Which) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTimelineEffectableVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineEffectable * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineEffectable * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineEffectable * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *EffectInsBefore )( - IAMTimelineEffectable * This, - IAMTimelineObj *pFX, - long priority); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *EffectSwapPriorities )( - IAMTimelineEffectable * This, - long PriorityA, - long PriorityB); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *EffectGetCount )( - IAMTimelineEffectable * This, - long *pCount); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetEffect )( - IAMTimelineEffectable * This, - /* [out] */ IAMTimelineObj **ppFx, - long Which); - - END_INTERFACE - } IAMTimelineEffectableVtbl; - - interface IAMTimelineEffectable - { - CONST_VTBL struct IAMTimelineEffectableVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTimelineEffectable_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTimelineEffectable_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTimelineEffectable_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTimelineEffectable_EffectInsBefore(This,pFX,priority) \ - (This)->lpVtbl -> EffectInsBefore(This,pFX,priority) - -#define IAMTimelineEffectable_EffectSwapPriorities(This,PriorityA,PriorityB) \ - (This)->lpVtbl -> EffectSwapPriorities(This,PriorityA,PriorityB) - -#define IAMTimelineEffectable_EffectGetCount(This,pCount) \ - (This)->lpVtbl -> EffectGetCount(This,pCount) - -#define IAMTimelineEffectable_GetEffect(This,ppFx,Which) \ - (This)->lpVtbl -> GetEffect(This,ppFx,Which) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineEffectable_EffectInsBefore_Proxy( - IAMTimelineEffectable * This, - IAMTimelineObj *pFX, - long priority); - - -void __RPC_STUB IAMTimelineEffectable_EffectInsBefore_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineEffectable_EffectSwapPriorities_Proxy( - IAMTimelineEffectable * This, - long PriorityA, - long PriorityB); - - -void __RPC_STUB IAMTimelineEffectable_EffectSwapPriorities_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineEffectable_EffectGetCount_Proxy( - IAMTimelineEffectable * This, - long *pCount); - - -void __RPC_STUB IAMTimelineEffectable_EffectGetCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineEffectable_GetEffect_Proxy( - IAMTimelineEffectable * This, - /* [out] */ IAMTimelineObj **ppFx, - long Which); - - -void __RPC_STUB IAMTimelineEffectable_GetEffect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTimelineEffectable_INTERFACE_DEFINED__ */ - - -#ifndef __IAMTimelineEffect_INTERFACE_DEFINED__ -#define __IAMTimelineEffect_INTERFACE_DEFINED__ - -/* interface IAMTimelineEffect */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IAMTimelineEffect; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("BCE0C264-622D-11d2-8CAD-00A024580902") - IAMTimelineEffect : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE EffectGetPriority( - long *pVal) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTimelineEffectVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineEffect * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineEffect * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineEffect * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *EffectGetPriority )( - IAMTimelineEffect * This, - long *pVal); - - END_INTERFACE - } IAMTimelineEffectVtbl; - - interface IAMTimelineEffect - { - CONST_VTBL struct IAMTimelineEffectVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTimelineEffect_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTimelineEffect_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTimelineEffect_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTimelineEffect_EffectGetPriority(This,pVal) \ - (This)->lpVtbl -> EffectGetPriority(This,pVal) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineEffect_EffectGetPriority_Proxy( - IAMTimelineEffect * This, - long *pVal); - - -void __RPC_STUB IAMTimelineEffect_EffectGetPriority_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTimelineEffect_INTERFACE_DEFINED__ */ - - -#ifndef __IAMTimelineTransable_INTERFACE_DEFINED__ -#define __IAMTimelineTransable_INTERFACE_DEFINED__ - -/* interface IAMTimelineTransable */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IAMTimelineTransable; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("378FA386-622E-11d2-8CAD-00A024580902") - IAMTimelineTransable : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE TransAdd( - IAMTimelineObj *pTrans) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE TransGetCount( - long *pCount) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetNextTrans( - /* [out] */ IAMTimelineObj **ppTrans, - REFERENCE_TIME *pInOut) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetNextTrans2( - /* [out] */ IAMTimelineObj **ppTrans, - REFTIME *pInOut) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetTransAtTime( - /* [out] */ IAMTimelineObj **ppObj, - REFERENCE_TIME Time, - long SearchDirection) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetTransAtTime2( - /* [out] */ IAMTimelineObj **ppObj, - REFTIME Time, - long SearchDirection) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTimelineTransableVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineTransable * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineTransable * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineTransable * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *TransAdd )( - IAMTimelineTransable * This, - IAMTimelineObj *pTrans); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *TransGetCount )( - IAMTimelineTransable * This, - long *pCount); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetNextTrans )( - IAMTimelineTransable * This, - /* [out] */ IAMTimelineObj **ppTrans, - REFERENCE_TIME *pInOut); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetNextTrans2 )( - IAMTimelineTransable * This, - /* [out] */ IAMTimelineObj **ppTrans, - REFTIME *pInOut); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetTransAtTime )( - IAMTimelineTransable * This, - /* [out] */ IAMTimelineObj **ppObj, - REFERENCE_TIME Time, - long SearchDirection); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetTransAtTime2 )( - IAMTimelineTransable * This, - /* [out] */ IAMTimelineObj **ppObj, - REFTIME Time, - long SearchDirection); - - END_INTERFACE - } IAMTimelineTransableVtbl; - - interface IAMTimelineTransable - { - CONST_VTBL struct IAMTimelineTransableVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTimelineTransable_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTimelineTransable_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTimelineTransable_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTimelineTransable_TransAdd(This,pTrans) \ - (This)->lpVtbl -> TransAdd(This,pTrans) - -#define IAMTimelineTransable_TransGetCount(This,pCount) \ - (This)->lpVtbl -> TransGetCount(This,pCount) - -#define IAMTimelineTransable_GetNextTrans(This,ppTrans,pInOut) \ - (This)->lpVtbl -> GetNextTrans(This,ppTrans,pInOut) - -#define IAMTimelineTransable_GetNextTrans2(This,ppTrans,pInOut) \ - (This)->lpVtbl -> GetNextTrans2(This,ppTrans,pInOut) - -#define IAMTimelineTransable_GetTransAtTime(This,ppObj,Time,SearchDirection) \ - (This)->lpVtbl -> GetTransAtTime(This,ppObj,Time,SearchDirection) - -#define IAMTimelineTransable_GetTransAtTime2(This,ppObj,Time,SearchDirection) \ - (This)->lpVtbl -> GetTransAtTime2(This,ppObj,Time,SearchDirection) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTransable_TransAdd_Proxy( - IAMTimelineTransable * This, - IAMTimelineObj *pTrans); - - -void __RPC_STUB IAMTimelineTransable_TransAdd_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTransable_TransGetCount_Proxy( - IAMTimelineTransable * This, - long *pCount); - - -void __RPC_STUB IAMTimelineTransable_TransGetCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTransable_GetNextTrans_Proxy( - IAMTimelineTransable * This, - /* [out] */ IAMTimelineObj **ppTrans, - REFERENCE_TIME *pInOut); - - -void __RPC_STUB IAMTimelineTransable_GetNextTrans_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTransable_GetNextTrans2_Proxy( - IAMTimelineTransable * This, - /* [out] */ IAMTimelineObj **ppTrans, - REFTIME *pInOut); - - -void __RPC_STUB IAMTimelineTransable_GetNextTrans2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTransable_GetTransAtTime_Proxy( - IAMTimelineTransable * This, - /* [out] */ IAMTimelineObj **ppObj, - REFERENCE_TIME Time, - long SearchDirection); - - -void __RPC_STUB IAMTimelineTransable_GetTransAtTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTransable_GetTransAtTime2_Proxy( - IAMTimelineTransable * This, - /* [out] */ IAMTimelineObj **ppObj, - REFTIME Time, - long SearchDirection); - - -void __RPC_STUB IAMTimelineTransable_GetTransAtTime2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTimelineTransable_INTERFACE_DEFINED__ */ - - -#ifndef __IAMTimelineSplittable_INTERFACE_DEFINED__ -#define __IAMTimelineSplittable_INTERFACE_DEFINED__ - -/* interface IAMTimelineSplittable */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IAMTimelineSplittable; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("A0F840A0-D590-11d2-8D55-00A0C9441E20") - IAMTimelineSplittable : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SplitAt( - REFERENCE_TIME Time) = 0; - - virtual HRESULT STDMETHODCALLTYPE SplitAt2( - REFTIME Time) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTimelineSplittableVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineSplittable * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineSplittable * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineSplittable * This); - - HRESULT ( STDMETHODCALLTYPE *SplitAt )( - IAMTimelineSplittable * This, - REFERENCE_TIME Time); - - HRESULT ( STDMETHODCALLTYPE *SplitAt2 )( - IAMTimelineSplittable * This, - REFTIME Time); - - END_INTERFACE - } IAMTimelineSplittableVtbl; - - interface IAMTimelineSplittable - { - CONST_VTBL struct IAMTimelineSplittableVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTimelineSplittable_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTimelineSplittable_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTimelineSplittable_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTimelineSplittable_SplitAt(This,Time) \ - (This)->lpVtbl -> SplitAt(This,Time) - -#define IAMTimelineSplittable_SplitAt2(This,Time) \ - (This)->lpVtbl -> SplitAt2(This,Time) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMTimelineSplittable_SplitAt_Proxy( - IAMTimelineSplittable * This, - REFERENCE_TIME Time); - - -void __RPC_STUB IAMTimelineSplittable_SplitAt_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineSplittable_SplitAt2_Proxy( - IAMTimelineSplittable * This, - REFTIME Time); - - -void __RPC_STUB IAMTimelineSplittable_SplitAt2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTimelineSplittable_INTERFACE_DEFINED__ */ - - -#ifndef __IAMTimelineTrans_INTERFACE_DEFINED__ -#define __IAMTimelineTrans_INTERFACE_DEFINED__ - -/* interface IAMTimelineTrans */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IAMTimelineTrans; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("BCE0C265-622D-11d2-8CAD-00A024580902") - IAMTimelineTrans : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetCutPoint( - REFERENCE_TIME *pTLTime) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetCutPoint2( - REFTIME *pTLTime) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetCutPoint( - REFERENCE_TIME TLTime) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetCutPoint2( - REFTIME TLTime) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSwapInputs( - BOOL *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetSwapInputs( - BOOL pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetCutsOnly( - BOOL *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetCutsOnly( - BOOL pVal) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTimelineTransVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineTrans * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineTrans * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineTrans * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetCutPoint )( - IAMTimelineTrans * This, - REFERENCE_TIME *pTLTime); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetCutPoint2 )( - IAMTimelineTrans * This, - REFTIME *pTLTime); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetCutPoint )( - IAMTimelineTrans * This, - REFERENCE_TIME TLTime); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetCutPoint2 )( - IAMTimelineTrans * This, - REFTIME TLTime); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetSwapInputs )( - IAMTimelineTrans * This, - BOOL *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetSwapInputs )( - IAMTimelineTrans * This, - BOOL pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetCutsOnly )( - IAMTimelineTrans * This, - BOOL *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetCutsOnly )( - IAMTimelineTrans * This, - BOOL pVal); - - END_INTERFACE - } IAMTimelineTransVtbl; - - interface IAMTimelineTrans - { - CONST_VTBL struct IAMTimelineTransVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTimelineTrans_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTimelineTrans_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTimelineTrans_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTimelineTrans_GetCutPoint(This,pTLTime) \ - (This)->lpVtbl -> GetCutPoint(This,pTLTime) - -#define IAMTimelineTrans_GetCutPoint2(This,pTLTime) \ - (This)->lpVtbl -> GetCutPoint2(This,pTLTime) - -#define IAMTimelineTrans_SetCutPoint(This,TLTime) \ - (This)->lpVtbl -> SetCutPoint(This,TLTime) - -#define IAMTimelineTrans_SetCutPoint2(This,TLTime) \ - (This)->lpVtbl -> SetCutPoint2(This,TLTime) - -#define IAMTimelineTrans_GetSwapInputs(This,pVal) \ - (This)->lpVtbl -> GetSwapInputs(This,pVal) - -#define IAMTimelineTrans_SetSwapInputs(This,pVal) \ - (This)->lpVtbl -> SetSwapInputs(This,pVal) - -#define IAMTimelineTrans_GetCutsOnly(This,pVal) \ - (This)->lpVtbl -> GetCutsOnly(This,pVal) - -#define IAMTimelineTrans_SetCutsOnly(This,pVal) \ - (This)->lpVtbl -> SetCutsOnly(This,pVal) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrans_GetCutPoint_Proxy( - IAMTimelineTrans * This, - REFERENCE_TIME *pTLTime); - - -void __RPC_STUB IAMTimelineTrans_GetCutPoint_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrans_GetCutPoint2_Proxy( - IAMTimelineTrans * This, - REFTIME *pTLTime); - - -void __RPC_STUB IAMTimelineTrans_GetCutPoint2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrans_SetCutPoint_Proxy( - IAMTimelineTrans * This, - REFERENCE_TIME TLTime); - - -void __RPC_STUB IAMTimelineTrans_SetCutPoint_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrans_SetCutPoint2_Proxy( - IAMTimelineTrans * This, - REFTIME TLTime); - - -void __RPC_STUB IAMTimelineTrans_SetCutPoint2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrans_GetSwapInputs_Proxy( - IAMTimelineTrans * This, - BOOL *pVal); - - -void __RPC_STUB IAMTimelineTrans_GetSwapInputs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrans_SetSwapInputs_Proxy( - IAMTimelineTrans * This, - BOOL pVal); - - -void __RPC_STUB IAMTimelineTrans_SetSwapInputs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrans_GetCutsOnly_Proxy( - IAMTimelineTrans * This, - BOOL *pVal); - - -void __RPC_STUB IAMTimelineTrans_GetCutsOnly_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrans_SetCutsOnly_Proxy( - IAMTimelineTrans * This, - BOOL pVal); - - -void __RPC_STUB IAMTimelineTrans_SetCutsOnly_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTimelineTrans_INTERFACE_DEFINED__ */ - - -#ifndef __IAMTimelineSrc_INTERFACE_DEFINED__ -#define __IAMTimelineSrc_INTERFACE_DEFINED__ - -/* interface IAMTimelineSrc */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IAMTimelineSrc; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("78530B79-61F9-11D2-8CAD-00A024580902") - IAMTimelineSrc : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMediaTimes( - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMediaTimes2( - REFTIME *pStart, - REFTIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ModifyStopTime( - REFERENCE_TIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ModifyStopTime2( - REFTIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE FixMediaTimes( - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE FixMediaTimes2( - REFTIME *pStart, - REFTIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMediaTimes( - REFERENCE_TIME Start, - REFERENCE_TIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMediaTimes2( - REFTIME Start, - REFTIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMediaLength( - REFERENCE_TIME Length) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMediaLength2( - REFTIME Length) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMediaLength( - REFERENCE_TIME *pLength) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMediaLength2( - REFTIME *pLength) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMediaName( - /* [retval][out] */ BSTR *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMediaName( - BSTR newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SpliceWithNext( - IAMTimelineObj *pNext) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetStreamNumber( - long *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetStreamNumber( - long Val) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsNormalRate( - BOOL *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDefaultFPS( - double *pFPS) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetDefaultFPS( - double FPS) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetStretchMode( - int *pnStretchMode) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetStretchMode( - int nStretchMode) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTimelineSrcVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineSrc * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineSrc * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineSrc * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMediaTimes )( - IAMTimelineSrc * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMediaTimes2 )( - IAMTimelineSrc * This, - REFTIME *pStart, - REFTIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *ModifyStopTime )( - IAMTimelineSrc * This, - REFERENCE_TIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *ModifyStopTime2 )( - IAMTimelineSrc * This, - REFTIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *FixMediaTimes )( - IAMTimelineSrc * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *FixMediaTimes2 )( - IAMTimelineSrc * This, - REFTIME *pStart, - REFTIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMediaTimes )( - IAMTimelineSrc * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMediaTimes2 )( - IAMTimelineSrc * This, - REFTIME Start, - REFTIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMediaLength )( - IAMTimelineSrc * This, - REFERENCE_TIME Length); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMediaLength2 )( - IAMTimelineSrc * This, - REFTIME Length); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMediaLength )( - IAMTimelineSrc * This, - REFERENCE_TIME *pLength); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMediaLength2 )( - IAMTimelineSrc * This, - REFTIME *pLength); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMediaName )( - IAMTimelineSrc * This, - /* [retval][out] */ BSTR *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMediaName )( - IAMTimelineSrc * This, - BSTR newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SpliceWithNext )( - IAMTimelineSrc * This, - IAMTimelineObj *pNext); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetStreamNumber )( - IAMTimelineSrc * This, - long *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetStreamNumber )( - IAMTimelineSrc * This, - long Val); - - HRESULT ( STDMETHODCALLTYPE *IsNormalRate )( - IAMTimelineSrc * This, - BOOL *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetDefaultFPS )( - IAMTimelineSrc * This, - double *pFPS); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetDefaultFPS )( - IAMTimelineSrc * This, - double FPS); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetStretchMode )( - IAMTimelineSrc * This, - int *pnStretchMode); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetStretchMode )( - IAMTimelineSrc * This, - int nStretchMode); - - END_INTERFACE - } IAMTimelineSrcVtbl; - - interface IAMTimelineSrc - { - CONST_VTBL struct IAMTimelineSrcVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTimelineSrc_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTimelineSrc_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTimelineSrc_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTimelineSrc_GetMediaTimes(This,pStart,pStop) \ - (This)->lpVtbl -> GetMediaTimes(This,pStart,pStop) - -#define IAMTimelineSrc_GetMediaTimes2(This,pStart,pStop) \ - (This)->lpVtbl -> GetMediaTimes2(This,pStart,pStop) - -#define IAMTimelineSrc_ModifyStopTime(This,Stop) \ - (This)->lpVtbl -> ModifyStopTime(This,Stop) - -#define IAMTimelineSrc_ModifyStopTime2(This,Stop) \ - (This)->lpVtbl -> ModifyStopTime2(This,Stop) - -#define IAMTimelineSrc_FixMediaTimes(This,pStart,pStop) \ - (This)->lpVtbl -> FixMediaTimes(This,pStart,pStop) - -#define IAMTimelineSrc_FixMediaTimes2(This,pStart,pStop) \ - (This)->lpVtbl -> FixMediaTimes2(This,pStart,pStop) - -#define IAMTimelineSrc_SetMediaTimes(This,Start,Stop) \ - (This)->lpVtbl -> SetMediaTimes(This,Start,Stop) - -#define IAMTimelineSrc_SetMediaTimes2(This,Start,Stop) \ - (This)->lpVtbl -> SetMediaTimes2(This,Start,Stop) - -#define IAMTimelineSrc_SetMediaLength(This,Length) \ - (This)->lpVtbl -> SetMediaLength(This,Length) - -#define IAMTimelineSrc_SetMediaLength2(This,Length) \ - (This)->lpVtbl -> SetMediaLength2(This,Length) - -#define IAMTimelineSrc_GetMediaLength(This,pLength) \ - (This)->lpVtbl -> GetMediaLength(This,pLength) - -#define IAMTimelineSrc_GetMediaLength2(This,pLength) \ - (This)->lpVtbl -> GetMediaLength2(This,pLength) - -#define IAMTimelineSrc_GetMediaName(This,pVal) \ - (This)->lpVtbl -> GetMediaName(This,pVal) - -#define IAMTimelineSrc_SetMediaName(This,newVal) \ - (This)->lpVtbl -> SetMediaName(This,newVal) - -#define IAMTimelineSrc_SpliceWithNext(This,pNext) \ - (This)->lpVtbl -> SpliceWithNext(This,pNext) - -#define IAMTimelineSrc_GetStreamNumber(This,pVal) \ - (This)->lpVtbl -> GetStreamNumber(This,pVal) - -#define IAMTimelineSrc_SetStreamNumber(This,Val) \ - (This)->lpVtbl -> SetStreamNumber(This,Val) - -#define IAMTimelineSrc_IsNormalRate(This,pVal) \ - (This)->lpVtbl -> IsNormalRate(This,pVal) - -#define IAMTimelineSrc_GetDefaultFPS(This,pFPS) \ - (This)->lpVtbl -> GetDefaultFPS(This,pFPS) - -#define IAMTimelineSrc_SetDefaultFPS(This,FPS) \ - (This)->lpVtbl -> SetDefaultFPS(This,FPS) - -#define IAMTimelineSrc_GetStretchMode(This,pnStretchMode) \ - (This)->lpVtbl -> GetStretchMode(This,pnStretchMode) - -#define IAMTimelineSrc_SetStretchMode(This,nStretchMode) \ - (This)->lpVtbl -> SetStretchMode(This,nStretchMode) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_GetMediaTimes_Proxy( - IAMTimelineSrc * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - -void __RPC_STUB IAMTimelineSrc_GetMediaTimes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_GetMediaTimes2_Proxy( - IAMTimelineSrc * This, - REFTIME *pStart, - REFTIME *pStop); - - -void __RPC_STUB IAMTimelineSrc_GetMediaTimes2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_ModifyStopTime_Proxy( - IAMTimelineSrc * This, - REFERENCE_TIME Stop); - - -void __RPC_STUB IAMTimelineSrc_ModifyStopTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_ModifyStopTime2_Proxy( - IAMTimelineSrc * This, - REFTIME Stop); - - -void __RPC_STUB IAMTimelineSrc_ModifyStopTime2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_FixMediaTimes_Proxy( - IAMTimelineSrc * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - -void __RPC_STUB IAMTimelineSrc_FixMediaTimes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_FixMediaTimes2_Proxy( - IAMTimelineSrc * This, - REFTIME *pStart, - REFTIME *pStop); - - -void __RPC_STUB IAMTimelineSrc_FixMediaTimes2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SetMediaTimes_Proxy( - IAMTimelineSrc * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - -void __RPC_STUB IAMTimelineSrc_SetMediaTimes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SetMediaTimes2_Proxy( - IAMTimelineSrc * This, - REFTIME Start, - REFTIME Stop); - - -void __RPC_STUB IAMTimelineSrc_SetMediaTimes2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SetMediaLength_Proxy( - IAMTimelineSrc * This, - REFERENCE_TIME Length); - - -void __RPC_STUB IAMTimelineSrc_SetMediaLength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SetMediaLength2_Proxy( - IAMTimelineSrc * This, - REFTIME Length); - - -void __RPC_STUB IAMTimelineSrc_SetMediaLength2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_GetMediaLength_Proxy( - IAMTimelineSrc * This, - REFERENCE_TIME *pLength); - - -void __RPC_STUB IAMTimelineSrc_GetMediaLength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_GetMediaLength2_Proxy( - IAMTimelineSrc * This, - REFTIME *pLength); - - -void __RPC_STUB IAMTimelineSrc_GetMediaLength2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_GetMediaName_Proxy( - IAMTimelineSrc * This, - /* [retval][out] */ BSTR *pVal); - - -void __RPC_STUB IAMTimelineSrc_GetMediaName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SetMediaName_Proxy( - IAMTimelineSrc * This, - BSTR newVal); - - -void __RPC_STUB IAMTimelineSrc_SetMediaName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SpliceWithNext_Proxy( - IAMTimelineSrc * This, - IAMTimelineObj *pNext); - - -void __RPC_STUB IAMTimelineSrc_SpliceWithNext_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_GetStreamNumber_Proxy( - IAMTimelineSrc * This, - long *pVal); - - -void __RPC_STUB IAMTimelineSrc_GetStreamNumber_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SetStreamNumber_Proxy( - IAMTimelineSrc * This, - long Val); - - -void __RPC_STUB IAMTimelineSrc_SetStreamNumber_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineSrc_IsNormalRate_Proxy( - IAMTimelineSrc * This, - BOOL *pVal); - - -void __RPC_STUB IAMTimelineSrc_IsNormalRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_GetDefaultFPS_Proxy( - IAMTimelineSrc * This, - double *pFPS); - - -void __RPC_STUB IAMTimelineSrc_GetDefaultFPS_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SetDefaultFPS_Proxy( - IAMTimelineSrc * This, - double FPS); - - -void __RPC_STUB IAMTimelineSrc_SetDefaultFPS_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_GetStretchMode_Proxy( - IAMTimelineSrc * This, - int *pnStretchMode); - - -void __RPC_STUB IAMTimelineSrc_GetStretchMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SetStretchMode_Proxy( - IAMTimelineSrc * This, - int nStretchMode); - - -void __RPC_STUB IAMTimelineSrc_SetStretchMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTimelineSrc_INTERFACE_DEFINED__ */ - - -#ifndef __IAMTimelineTrack_INTERFACE_DEFINED__ -#define __IAMTimelineTrack_INTERFACE_DEFINED__ - -/* interface IAMTimelineTrack */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IAMTimelineTrack; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("EAE58538-622E-11d2-8CAD-00A024580902") - IAMTimelineTrack : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SrcAdd( - IAMTimelineObj *pSource) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetNextSrc( - /* [out] */ IAMTimelineObj **ppSrc, - REFERENCE_TIME *pInOut) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetNextSrc2( - /* [out] */ IAMTimelineObj **ppSrc, - REFTIME *pInOut) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE MoveEverythingBy( - REFERENCE_TIME Start, - REFERENCE_TIME MoveBy) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE MoveEverythingBy2( - REFTIME Start, - REFTIME MoveBy) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSourcesCount( - long *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE AreYouBlank( - long *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSrcAtTime( - /* [out] */ IAMTimelineObj **ppSrc, - REFERENCE_TIME Time, - long SearchDirection) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSrcAtTime2( - /* [out] */ IAMTimelineObj **ppSrc, - REFTIME Time, - long SearchDirection) = 0; - - virtual HRESULT STDMETHODCALLTYPE InsertSpace( - REFERENCE_TIME rtStart, - REFERENCE_TIME rtEnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE InsertSpace2( - REFTIME rtStart, - REFTIME rtEnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE ZeroBetween( - REFERENCE_TIME rtStart, - REFERENCE_TIME rtEnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE ZeroBetween2( - REFTIME rtStart, - REFTIME rtEnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNextSrcEx( - IAMTimelineObj *pLast, - /* [out] */ IAMTimelineObj **ppNext) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTimelineTrackVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineTrack * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineTrack * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineTrack * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SrcAdd )( - IAMTimelineTrack * This, - IAMTimelineObj *pSource); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetNextSrc )( - IAMTimelineTrack * This, - /* [out] */ IAMTimelineObj **ppSrc, - REFERENCE_TIME *pInOut); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetNextSrc2 )( - IAMTimelineTrack * This, - /* [out] */ IAMTimelineObj **ppSrc, - REFTIME *pInOut); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *MoveEverythingBy )( - IAMTimelineTrack * This, - REFERENCE_TIME Start, - REFERENCE_TIME MoveBy); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *MoveEverythingBy2 )( - IAMTimelineTrack * This, - REFTIME Start, - REFTIME MoveBy); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetSourcesCount )( - IAMTimelineTrack * This, - long *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *AreYouBlank )( - IAMTimelineTrack * This, - long *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetSrcAtTime )( - IAMTimelineTrack * This, - /* [out] */ IAMTimelineObj **ppSrc, - REFERENCE_TIME Time, - long SearchDirection); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetSrcAtTime2 )( - IAMTimelineTrack * This, - /* [out] */ IAMTimelineObj **ppSrc, - REFTIME Time, - long SearchDirection); - - HRESULT ( STDMETHODCALLTYPE *InsertSpace )( - IAMTimelineTrack * This, - REFERENCE_TIME rtStart, - REFERENCE_TIME rtEnd); - - HRESULT ( STDMETHODCALLTYPE *InsertSpace2 )( - IAMTimelineTrack * This, - REFTIME rtStart, - REFTIME rtEnd); - - HRESULT ( STDMETHODCALLTYPE *ZeroBetween )( - IAMTimelineTrack * This, - REFERENCE_TIME rtStart, - REFERENCE_TIME rtEnd); - - HRESULT ( STDMETHODCALLTYPE *ZeroBetween2 )( - IAMTimelineTrack * This, - REFTIME rtStart, - REFTIME rtEnd); - - HRESULT ( STDMETHODCALLTYPE *GetNextSrcEx )( - IAMTimelineTrack * This, - IAMTimelineObj *pLast, - /* [out] */ IAMTimelineObj **ppNext); - - END_INTERFACE - } IAMTimelineTrackVtbl; - - interface IAMTimelineTrack - { - CONST_VTBL struct IAMTimelineTrackVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTimelineTrack_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTimelineTrack_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTimelineTrack_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTimelineTrack_SrcAdd(This,pSource) \ - (This)->lpVtbl -> SrcAdd(This,pSource) - -#define IAMTimelineTrack_GetNextSrc(This,ppSrc,pInOut) \ - (This)->lpVtbl -> GetNextSrc(This,ppSrc,pInOut) - -#define IAMTimelineTrack_GetNextSrc2(This,ppSrc,pInOut) \ - (This)->lpVtbl -> GetNextSrc2(This,ppSrc,pInOut) - -#define IAMTimelineTrack_MoveEverythingBy(This,Start,MoveBy) \ - (This)->lpVtbl -> MoveEverythingBy(This,Start,MoveBy) - -#define IAMTimelineTrack_MoveEverythingBy2(This,Start,MoveBy) \ - (This)->lpVtbl -> MoveEverythingBy2(This,Start,MoveBy) - -#define IAMTimelineTrack_GetSourcesCount(This,pVal) \ - (This)->lpVtbl -> GetSourcesCount(This,pVal) - -#define IAMTimelineTrack_AreYouBlank(This,pVal) \ - (This)->lpVtbl -> AreYouBlank(This,pVal) - -#define IAMTimelineTrack_GetSrcAtTime(This,ppSrc,Time,SearchDirection) \ - (This)->lpVtbl -> GetSrcAtTime(This,ppSrc,Time,SearchDirection) - -#define IAMTimelineTrack_GetSrcAtTime2(This,ppSrc,Time,SearchDirection) \ - (This)->lpVtbl -> GetSrcAtTime2(This,ppSrc,Time,SearchDirection) - -#define IAMTimelineTrack_InsertSpace(This,rtStart,rtEnd) \ - (This)->lpVtbl -> InsertSpace(This,rtStart,rtEnd) - -#define IAMTimelineTrack_InsertSpace2(This,rtStart,rtEnd) \ - (This)->lpVtbl -> InsertSpace2(This,rtStart,rtEnd) - -#define IAMTimelineTrack_ZeroBetween(This,rtStart,rtEnd) \ - (This)->lpVtbl -> ZeroBetween(This,rtStart,rtEnd) - -#define IAMTimelineTrack_ZeroBetween2(This,rtStart,rtEnd) \ - (This)->lpVtbl -> ZeroBetween2(This,rtStart,rtEnd) - -#define IAMTimelineTrack_GetNextSrcEx(This,pLast,ppNext) \ - (This)->lpVtbl -> GetNextSrcEx(This,pLast,ppNext) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_SrcAdd_Proxy( - IAMTimelineTrack * This, - IAMTimelineObj *pSource); - - -void __RPC_STUB IAMTimelineTrack_SrcAdd_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_GetNextSrc_Proxy( - IAMTimelineTrack * This, - /* [out] */ IAMTimelineObj **ppSrc, - REFERENCE_TIME *pInOut); - - -void __RPC_STUB IAMTimelineTrack_GetNextSrc_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_GetNextSrc2_Proxy( - IAMTimelineTrack * This, - /* [out] */ IAMTimelineObj **ppSrc, - REFTIME *pInOut); - - -void __RPC_STUB IAMTimelineTrack_GetNextSrc2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_MoveEverythingBy_Proxy( - IAMTimelineTrack * This, - REFERENCE_TIME Start, - REFERENCE_TIME MoveBy); - - -void __RPC_STUB IAMTimelineTrack_MoveEverythingBy_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_MoveEverythingBy2_Proxy( - IAMTimelineTrack * This, - REFTIME Start, - REFTIME MoveBy); - - -void __RPC_STUB IAMTimelineTrack_MoveEverythingBy2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_GetSourcesCount_Proxy( - IAMTimelineTrack * This, - long *pVal); - - -void __RPC_STUB IAMTimelineTrack_GetSourcesCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_AreYouBlank_Proxy( - IAMTimelineTrack * This, - long *pVal); - - -void __RPC_STUB IAMTimelineTrack_AreYouBlank_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_GetSrcAtTime_Proxy( - IAMTimelineTrack * This, - /* [out] */ IAMTimelineObj **ppSrc, - REFERENCE_TIME Time, - long SearchDirection); - - -void __RPC_STUB IAMTimelineTrack_GetSrcAtTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_GetSrcAtTime2_Proxy( - IAMTimelineTrack * This, - /* [out] */ IAMTimelineObj **ppSrc, - REFTIME Time, - long SearchDirection); - - -void __RPC_STUB IAMTimelineTrack_GetSrcAtTime2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineTrack_InsertSpace_Proxy( - IAMTimelineTrack * This, - REFERENCE_TIME rtStart, - REFERENCE_TIME rtEnd); - - -void __RPC_STUB IAMTimelineTrack_InsertSpace_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineTrack_InsertSpace2_Proxy( - IAMTimelineTrack * This, - REFTIME rtStart, - REFTIME rtEnd); - - -void __RPC_STUB IAMTimelineTrack_InsertSpace2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineTrack_ZeroBetween_Proxy( - IAMTimelineTrack * This, - REFERENCE_TIME rtStart, - REFERENCE_TIME rtEnd); - - -void __RPC_STUB IAMTimelineTrack_ZeroBetween_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineTrack_ZeroBetween2_Proxy( - IAMTimelineTrack * This, - REFTIME rtStart, - REFTIME rtEnd); - - -void __RPC_STUB IAMTimelineTrack_ZeroBetween2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineTrack_GetNextSrcEx_Proxy( - IAMTimelineTrack * This, - IAMTimelineObj *pLast, - /* [out] */ IAMTimelineObj **ppNext); - - -void __RPC_STUB IAMTimelineTrack_GetNextSrcEx_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTimelineTrack_INTERFACE_DEFINED__ */ - - -#ifndef __IAMTimelineVirtualTrack_INTERFACE_DEFINED__ -#define __IAMTimelineVirtualTrack_INTERFACE_DEFINED__ - -/* interface IAMTimelineVirtualTrack */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IAMTimelineVirtualTrack; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("A8ED5F80-C2C7-11d2-8D39-00A0C9441E20") - IAMTimelineVirtualTrack : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE TrackGetPriority( - long *pPriority) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetTrackDirty( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTimelineVirtualTrackVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineVirtualTrack * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineVirtualTrack * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineVirtualTrack * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *TrackGetPriority )( - IAMTimelineVirtualTrack * This, - long *pPriority); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetTrackDirty )( - IAMTimelineVirtualTrack * This); - - END_INTERFACE - } IAMTimelineVirtualTrackVtbl; - - interface IAMTimelineVirtualTrack - { - CONST_VTBL struct IAMTimelineVirtualTrackVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTimelineVirtualTrack_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTimelineVirtualTrack_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTimelineVirtualTrack_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTimelineVirtualTrack_TrackGetPriority(This,pPriority) \ - (This)->lpVtbl -> TrackGetPriority(This,pPriority) - -#define IAMTimelineVirtualTrack_SetTrackDirty(This) \ - (This)->lpVtbl -> SetTrackDirty(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineVirtualTrack_TrackGetPriority_Proxy( - IAMTimelineVirtualTrack * This, - long *pPriority); - - -void __RPC_STUB IAMTimelineVirtualTrack_TrackGetPriority_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineVirtualTrack_SetTrackDirty_Proxy( - IAMTimelineVirtualTrack * This); - - -void __RPC_STUB IAMTimelineVirtualTrack_SetTrackDirty_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTimelineVirtualTrack_INTERFACE_DEFINED__ */ - - -#ifndef __IAMTimelineComp_INTERFACE_DEFINED__ -#define __IAMTimelineComp_INTERFACE_DEFINED__ - -/* interface IAMTimelineComp */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IAMTimelineComp; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("EAE58536-622E-11d2-8CAD-00A024580902") - IAMTimelineComp : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE VTrackInsBefore( - IAMTimelineObj *pVirtualTrack, - long Priority) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE VTrackSwapPriorities( - long VirtualTrackA, - long VirtualTrackB) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE VTrackGetCount( - long *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetVTrack( - /* [out] */ IAMTimelineObj **ppVirtualTrack, - long Which) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetCountOfType( - long *pVal, - long *pValWithComps, - TIMELINE_MAJOR_TYPE MajorType) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetRecursiveLayerOfType( - /* [out] */ IAMTimelineObj **ppVirtualTrack, - long WhichLayer, - TIMELINE_MAJOR_TYPE Type) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetRecursiveLayerOfTypeI( - /* [out] */ IAMTimelineObj **ppVirtualTrack, - /* [out][in] */ long *pWhichLayer, - TIMELINE_MAJOR_TYPE Type) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNextVTrack( - IAMTimelineObj *pVirtualTrack, - /* [out] */ IAMTimelineObj **ppNextVirtualTrack) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTimelineCompVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineComp * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineComp * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineComp * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *VTrackInsBefore )( - IAMTimelineComp * This, - IAMTimelineObj *pVirtualTrack, - long Priority); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *VTrackSwapPriorities )( - IAMTimelineComp * This, - long VirtualTrackA, - long VirtualTrackB); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *VTrackGetCount )( - IAMTimelineComp * This, - long *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetVTrack )( - IAMTimelineComp * This, - /* [out] */ IAMTimelineObj **ppVirtualTrack, - long Which); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetCountOfType )( - IAMTimelineComp * This, - long *pVal, - long *pValWithComps, - TIMELINE_MAJOR_TYPE MajorType); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetRecursiveLayerOfType )( - IAMTimelineComp * This, - /* [out] */ IAMTimelineObj **ppVirtualTrack, - long WhichLayer, - TIMELINE_MAJOR_TYPE Type); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetRecursiveLayerOfTypeI )( - IAMTimelineComp * This, - /* [out] */ IAMTimelineObj **ppVirtualTrack, - /* [out][in] */ long *pWhichLayer, - TIMELINE_MAJOR_TYPE Type); - - HRESULT ( STDMETHODCALLTYPE *GetNextVTrack )( - IAMTimelineComp * This, - IAMTimelineObj *pVirtualTrack, - /* [out] */ IAMTimelineObj **ppNextVirtualTrack); - - END_INTERFACE - } IAMTimelineCompVtbl; - - interface IAMTimelineComp - { - CONST_VTBL struct IAMTimelineCompVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTimelineComp_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTimelineComp_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTimelineComp_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTimelineComp_VTrackInsBefore(This,pVirtualTrack,Priority) \ - (This)->lpVtbl -> VTrackInsBefore(This,pVirtualTrack,Priority) - -#define IAMTimelineComp_VTrackSwapPriorities(This,VirtualTrackA,VirtualTrackB) \ - (This)->lpVtbl -> VTrackSwapPriorities(This,VirtualTrackA,VirtualTrackB) - -#define IAMTimelineComp_VTrackGetCount(This,pVal) \ - (This)->lpVtbl -> VTrackGetCount(This,pVal) - -#define IAMTimelineComp_GetVTrack(This,ppVirtualTrack,Which) \ - (This)->lpVtbl -> GetVTrack(This,ppVirtualTrack,Which) - -#define IAMTimelineComp_GetCountOfType(This,pVal,pValWithComps,MajorType) \ - (This)->lpVtbl -> GetCountOfType(This,pVal,pValWithComps,MajorType) - -#define IAMTimelineComp_GetRecursiveLayerOfType(This,ppVirtualTrack,WhichLayer,Type) \ - (This)->lpVtbl -> GetRecursiveLayerOfType(This,ppVirtualTrack,WhichLayer,Type) - -#define IAMTimelineComp_GetRecursiveLayerOfTypeI(This,ppVirtualTrack,pWhichLayer,Type) \ - (This)->lpVtbl -> GetRecursiveLayerOfTypeI(This,ppVirtualTrack,pWhichLayer,Type) - -#define IAMTimelineComp_GetNextVTrack(This,pVirtualTrack,ppNextVirtualTrack) \ - (This)->lpVtbl -> GetNextVTrack(This,pVirtualTrack,ppNextVirtualTrack) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineComp_VTrackInsBefore_Proxy( - IAMTimelineComp * This, - IAMTimelineObj *pVirtualTrack, - long Priority); - - -void __RPC_STUB IAMTimelineComp_VTrackInsBefore_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineComp_VTrackSwapPriorities_Proxy( - IAMTimelineComp * This, - long VirtualTrackA, - long VirtualTrackB); - - -void __RPC_STUB IAMTimelineComp_VTrackSwapPriorities_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineComp_VTrackGetCount_Proxy( - IAMTimelineComp * This, - long *pVal); - - -void __RPC_STUB IAMTimelineComp_VTrackGetCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineComp_GetVTrack_Proxy( - IAMTimelineComp * This, - /* [out] */ IAMTimelineObj **ppVirtualTrack, - long Which); - - -void __RPC_STUB IAMTimelineComp_GetVTrack_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineComp_GetCountOfType_Proxy( - IAMTimelineComp * This, - long *pVal, - long *pValWithComps, - TIMELINE_MAJOR_TYPE MajorType); - - -void __RPC_STUB IAMTimelineComp_GetCountOfType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineComp_GetRecursiveLayerOfType_Proxy( - IAMTimelineComp * This, - /* [out] */ IAMTimelineObj **ppVirtualTrack, - long WhichLayer, - TIMELINE_MAJOR_TYPE Type); - - -void __RPC_STUB IAMTimelineComp_GetRecursiveLayerOfType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineComp_GetRecursiveLayerOfTypeI_Proxy( - IAMTimelineComp * This, - /* [out] */ IAMTimelineObj **ppVirtualTrack, - /* [out][in] */ long *pWhichLayer, - TIMELINE_MAJOR_TYPE Type); - - -void __RPC_STUB IAMTimelineComp_GetRecursiveLayerOfTypeI_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineComp_GetNextVTrack_Proxy( - IAMTimelineComp * This, - IAMTimelineObj *pVirtualTrack, - /* [out] */ IAMTimelineObj **ppNextVirtualTrack); - - -void __RPC_STUB IAMTimelineComp_GetNextVTrack_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTimelineComp_INTERFACE_DEFINED__ */ - - -#ifndef __IAMTimelineGroup_INTERFACE_DEFINED__ -#define __IAMTimelineGroup_INTERFACE_DEFINED__ - -/* interface IAMTimelineGroup */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IAMTimelineGroup; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("9EED4F00-B8A6-11d2-8023-00C0DF10D434") - IAMTimelineGroup : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetTimeline( - IAMTimeline *pTimeline) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetTimeline( - /* [out] */ IAMTimeline **ppTimeline) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetPriority( - long *pPriority) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMediaType( - /* [out] */ AM_MEDIA_TYPE *__MIDL_0040) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMediaType( - /* [in] */ AM_MEDIA_TYPE *__MIDL_0041) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetOutputFPS( - double FPS) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetOutputFPS( - double *pFPS) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetGroupName( - BSTR pGroupName) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetGroupName( - /* [retval][out] */ BSTR *pGroupName) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetPreviewMode( - BOOL fPreview) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetPreviewMode( - BOOL *pfPreview) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMediaTypeForVB( - /* [in] */ long Val) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetOutputBuffering( - /* [out] */ int *pnBuffer) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetOutputBuffering( - /* [in] */ int nBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetSmartRecompressFormat( - long *pFormat) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSmartRecompressFormat( - long **ppFormat) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsSmartRecompressFormatSet( - BOOL *pVal) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsRecompressFormatDirty( - BOOL *pVal) = 0; - - virtual HRESULT STDMETHODCALLTYPE ClearRecompressFormatDirty( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetRecompFormatFromSource( - IAMTimelineSrc *pSource) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTimelineGroupVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineGroup * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineGroup * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineGroup * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetTimeline )( - IAMTimelineGroup * This, - IAMTimeline *pTimeline); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetTimeline )( - IAMTimelineGroup * This, - /* [out] */ IAMTimeline **ppTimeline); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetPriority )( - IAMTimelineGroup * This, - long *pPriority); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMediaType )( - IAMTimelineGroup * This, - /* [out] */ AM_MEDIA_TYPE *__MIDL_0040); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMediaType )( - IAMTimelineGroup * This, - /* [in] */ AM_MEDIA_TYPE *__MIDL_0041); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetOutputFPS )( - IAMTimelineGroup * This, - double FPS); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetOutputFPS )( - IAMTimelineGroup * This, - double *pFPS); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetGroupName )( - IAMTimelineGroup * This, - BSTR pGroupName); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetGroupName )( - IAMTimelineGroup * This, - /* [retval][out] */ BSTR *pGroupName); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetPreviewMode )( - IAMTimelineGroup * This, - BOOL fPreview); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetPreviewMode )( - IAMTimelineGroup * This, - BOOL *pfPreview); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMediaTypeForVB )( - IAMTimelineGroup * This, - /* [in] */ long Val); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetOutputBuffering )( - IAMTimelineGroup * This, - /* [out] */ int *pnBuffer); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetOutputBuffering )( - IAMTimelineGroup * This, - /* [in] */ int nBuffer); - - HRESULT ( STDMETHODCALLTYPE *SetSmartRecompressFormat )( - IAMTimelineGroup * This, - long *pFormat); - - HRESULT ( STDMETHODCALLTYPE *GetSmartRecompressFormat )( - IAMTimelineGroup * This, - long **ppFormat); - - HRESULT ( STDMETHODCALLTYPE *IsSmartRecompressFormatSet )( - IAMTimelineGroup * This, - BOOL *pVal); - - HRESULT ( STDMETHODCALLTYPE *IsRecompressFormatDirty )( - IAMTimelineGroup * This, - BOOL *pVal); - - HRESULT ( STDMETHODCALLTYPE *ClearRecompressFormatDirty )( - IAMTimelineGroup * This); - - HRESULT ( STDMETHODCALLTYPE *SetRecompFormatFromSource )( - IAMTimelineGroup * This, - IAMTimelineSrc *pSource); - - END_INTERFACE - } IAMTimelineGroupVtbl; - - interface IAMTimelineGroup - { - CONST_VTBL struct IAMTimelineGroupVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTimelineGroup_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTimelineGroup_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTimelineGroup_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTimelineGroup_SetTimeline(This,pTimeline) \ - (This)->lpVtbl -> SetTimeline(This,pTimeline) - -#define IAMTimelineGroup_GetTimeline(This,ppTimeline) \ - (This)->lpVtbl -> GetTimeline(This,ppTimeline) - -#define IAMTimelineGroup_GetPriority(This,pPriority) \ - (This)->lpVtbl -> GetPriority(This,pPriority) - -#define IAMTimelineGroup_GetMediaType(This,__MIDL_0040) \ - (This)->lpVtbl -> GetMediaType(This,__MIDL_0040) - -#define IAMTimelineGroup_SetMediaType(This,__MIDL_0041) \ - (This)->lpVtbl -> SetMediaType(This,__MIDL_0041) - -#define IAMTimelineGroup_SetOutputFPS(This,FPS) \ - (This)->lpVtbl -> SetOutputFPS(This,FPS) - -#define IAMTimelineGroup_GetOutputFPS(This,pFPS) \ - (This)->lpVtbl -> GetOutputFPS(This,pFPS) - -#define IAMTimelineGroup_SetGroupName(This,pGroupName) \ - (This)->lpVtbl -> SetGroupName(This,pGroupName) - -#define IAMTimelineGroup_GetGroupName(This,pGroupName) \ - (This)->lpVtbl -> GetGroupName(This,pGroupName) - -#define IAMTimelineGroup_SetPreviewMode(This,fPreview) \ - (This)->lpVtbl -> SetPreviewMode(This,fPreview) - -#define IAMTimelineGroup_GetPreviewMode(This,pfPreview) \ - (This)->lpVtbl -> GetPreviewMode(This,pfPreview) - -#define IAMTimelineGroup_SetMediaTypeForVB(This,Val) \ - (This)->lpVtbl -> SetMediaTypeForVB(This,Val) - -#define IAMTimelineGroup_GetOutputBuffering(This,pnBuffer) \ - (This)->lpVtbl -> GetOutputBuffering(This,pnBuffer) - -#define IAMTimelineGroup_SetOutputBuffering(This,nBuffer) \ - (This)->lpVtbl -> SetOutputBuffering(This,nBuffer) - -#define IAMTimelineGroup_SetSmartRecompressFormat(This,pFormat) \ - (This)->lpVtbl -> SetSmartRecompressFormat(This,pFormat) - -#define IAMTimelineGroup_GetSmartRecompressFormat(This,ppFormat) \ - (This)->lpVtbl -> GetSmartRecompressFormat(This,ppFormat) - -#define IAMTimelineGroup_IsSmartRecompressFormatSet(This,pVal) \ - (This)->lpVtbl -> IsSmartRecompressFormatSet(This,pVal) - -#define IAMTimelineGroup_IsRecompressFormatDirty(This,pVal) \ - (This)->lpVtbl -> IsRecompressFormatDirty(This,pVal) - -#define IAMTimelineGroup_ClearRecompressFormatDirty(This) \ - (This)->lpVtbl -> ClearRecompressFormatDirty(This) - -#define IAMTimelineGroup_SetRecompFormatFromSource(This,pSource) \ - (This)->lpVtbl -> SetRecompFormatFromSource(This,pSource) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetTimeline_Proxy( - IAMTimelineGroup * This, - IAMTimeline *pTimeline); - - -void __RPC_STUB IAMTimelineGroup_SetTimeline_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_GetTimeline_Proxy( - IAMTimelineGroup * This, - /* [out] */ IAMTimeline **ppTimeline); - - -void __RPC_STUB IAMTimelineGroup_GetTimeline_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_GetPriority_Proxy( - IAMTimelineGroup * This, - long *pPriority); - - -void __RPC_STUB IAMTimelineGroup_GetPriority_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_GetMediaType_Proxy( - IAMTimelineGroup * This, - /* [out] */ AM_MEDIA_TYPE *__MIDL_0040); - - -void __RPC_STUB IAMTimelineGroup_GetMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetMediaType_Proxy( - IAMTimelineGroup * This, - /* [in] */ AM_MEDIA_TYPE *__MIDL_0041); - - -void __RPC_STUB IAMTimelineGroup_SetMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetOutputFPS_Proxy( - IAMTimelineGroup * This, - double FPS); - - -void __RPC_STUB IAMTimelineGroup_SetOutputFPS_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_GetOutputFPS_Proxy( - IAMTimelineGroup * This, - double *pFPS); - - -void __RPC_STUB IAMTimelineGroup_GetOutputFPS_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetGroupName_Proxy( - IAMTimelineGroup * This, - BSTR pGroupName); - - -void __RPC_STUB IAMTimelineGroup_SetGroupName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_GetGroupName_Proxy( - IAMTimelineGroup * This, - /* [retval][out] */ BSTR *pGroupName); - - -void __RPC_STUB IAMTimelineGroup_GetGroupName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetPreviewMode_Proxy( - IAMTimelineGroup * This, - BOOL fPreview); - - -void __RPC_STUB IAMTimelineGroup_SetPreviewMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_GetPreviewMode_Proxy( - IAMTimelineGroup * This, - BOOL *pfPreview); - - -void __RPC_STUB IAMTimelineGroup_GetPreviewMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetMediaTypeForVB_Proxy( - IAMTimelineGroup * This, - /* [in] */ long Val); - - -void __RPC_STUB IAMTimelineGroup_SetMediaTypeForVB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_GetOutputBuffering_Proxy( - IAMTimelineGroup * This, - /* [out] */ int *pnBuffer); - - -void __RPC_STUB IAMTimelineGroup_GetOutputBuffering_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetOutputBuffering_Proxy( - IAMTimelineGroup * This, - /* [in] */ int nBuffer); - - -void __RPC_STUB IAMTimelineGroup_SetOutputBuffering_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetSmartRecompressFormat_Proxy( - IAMTimelineGroup * This, - long *pFormat); - - -void __RPC_STUB IAMTimelineGroup_SetSmartRecompressFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineGroup_GetSmartRecompressFormat_Proxy( - IAMTimelineGroup * This, - long **ppFormat); - - -void __RPC_STUB IAMTimelineGroup_GetSmartRecompressFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineGroup_IsSmartRecompressFormatSet_Proxy( - IAMTimelineGroup * This, - BOOL *pVal); - - -void __RPC_STUB IAMTimelineGroup_IsSmartRecompressFormatSet_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineGroup_IsRecompressFormatDirty_Proxy( - IAMTimelineGroup * This, - BOOL *pVal); - - -void __RPC_STUB IAMTimelineGroup_IsRecompressFormatDirty_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineGroup_ClearRecompressFormatDirty_Proxy( - IAMTimelineGroup * This); - - -void __RPC_STUB IAMTimelineGroup_ClearRecompressFormatDirty_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetRecompFormatFromSource_Proxy( - IAMTimelineGroup * This, - IAMTimelineSrc *pSource); - - -void __RPC_STUB IAMTimelineGroup_SetRecompFormatFromSource_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTimelineGroup_INTERFACE_DEFINED__ */ - - -#ifndef __IAMTimeline_INTERFACE_DEFINED__ -#define __IAMTimeline_INTERFACE_DEFINED__ - -/* interface IAMTimeline */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IAMTimeline; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("78530B74-61F9-11D2-8CAD-00A024580902") - IAMTimeline : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE CreateEmptyNode( - /* [out] */ IAMTimelineObj **ppObj, - TIMELINE_MAJOR_TYPE Type) = 0; - - virtual HRESULT STDMETHODCALLTYPE AddGroup( - IAMTimelineObj *pGroup) = 0; - - virtual HRESULT STDMETHODCALLTYPE RemGroupFromList( - IAMTimelineObj *pGroup) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetGroup( - /* [out] */ IAMTimelineObj **ppGroup, - long WhichGroup) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetGroupCount( - long *pCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE ClearAllGroups( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInsertMode( - long *pMode) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetInsertMode( - long Mode) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE EnableTransitions( - BOOL fEnabled) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE TransitionsEnabled( - BOOL *pfEnabled) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE EnableEffects( - BOOL fEnabled) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE EffectsEnabled( - BOOL *pfEnabled) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetInterestRange( - REFERENCE_TIME Start, - REFERENCE_TIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDuration( - REFERENCE_TIME *pDuration) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDuration2( - double *pDuration) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetDefaultFPS( - double FPS) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDefaultFPS( - double *pFPS) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE IsDirty( - BOOL *pDirty) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDirtyRange( - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetCountOfType( - long Group, - long *pVal, - long *pValWithComps, - TIMELINE_MAJOR_TYPE MajorType) = 0; - - virtual HRESULT STDMETHODCALLTYPE ValidateSourceNames( - long ValidateFlags, - IMediaLocator *pOverride, - LONG_PTR NotifyEventHandle) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDefaultTransition( - GUID *pGuid) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDefaultTransition( - GUID *pGuid) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDefaultEffect( - GUID *pGuid) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDefaultEffect( - GUID *pGuid) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDefaultTransitionB( - BSTR pGuid) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDefaultTransitionB( - /* [retval][out] */ BSTR *pGuid) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDefaultEffectB( - BSTR pGuid) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDefaultEffectB( - /* [retval][out] */ BSTR *pGuid) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTimelineVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimeline * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimeline * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimeline * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *CreateEmptyNode )( - IAMTimeline * This, - /* [out] */ IAMTimelineObj **ppObj, - TIMELINE_MAJOR_TYPE Type); - - HRESULT ( STDMETHODCALLTYPE *AddGroup )( - IAMTimeline * This, - IAMTimelineObj *pGroup); - - HRESULT ( STDMETHODCALLTYPE *RemGroupFromList )( - IAMTimeline * This, - IAMTimelineObj *pGroup); - - HRESULT ( STDMETHODCALLTYPE *GetGroup )( - IAMTimeline * This, - /* [out] */ IAMTimelineObj **ppGroup, - long WhichGroup); - - HRESULT ( STDMETHODCALLTYPE *GetGroupCount )( - IAMTimeline * This, - long *pCount); - - HRESULT ( STDMETHODCALLTYPE *ClearAllGroups )( - IAMTimeline * This); - - HRESULT ( STDMETHODCALLTYPE *GetInsertMode )( - IAMTimeline * This, - long *pMode); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetInsertMode )( - IAMTimeline * This, - long Mode); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *EnableTransitions )( - IAMTimeline * This, - BOOL fEnabled); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *TransitionsEnabled )( - IAMTimeline * This, - BOOL *pfEnabled); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *EnableEffects )( - IAMTimeline * This, - BOOL fEnabled); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *EffectsEnabled )( - IAMTimeline * This, - BOOL *pfEnabled); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetInterestRange )( - IAMTimeline * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetDuration )( - IAMTimeline * This, - REFERENCE_TIME *pDuration); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetDuration2 )( - IAMTimeline * This, - double *pDuration); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetDefaultFPS )( - IAMTimeline * This, - double FPS); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetDefaultFPS )( - IAMTimeline * This, - double *pFPS); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *IsDirty )( - IAMTimeline * This, - BOOL *pDirty); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetDirtyRange )( - IAMTimeline * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetCountOfType )( - IAMTimeline * This, - long Group, - long *pVal, - long *pValWithComps, - TIMELINE_MAJOR_TYPE MajorType); - - HRESULT ( STDMETHODCALLTYPE *ValidateSourceNames )( - IAMTimeline * This, - long ValidateFlags, - IMediaLocator *pOverride, - LONG_PTR NotifyEventHandle); - - HRESULT ( STDMETHODCALLTYPE *SetDefaultTransition )( - IAMTimeline * This, - GUID *pGuid); - - HRESULT ( STDMETHODCALLTYPE *GetDefaultTransition )( - IAMTimeline * This, - GUID *pGuid); - - HRESULT ( STDMETHODCALLTYPE *SetDefaultEffect )( - IAMTimeline * This, - GUID *pGuid); - - HRESULT ( STDMETHODCALLTYPE *GetDefaultEffect )( - IAMTimeline * This, - GUID *pGuid); - - HRESULT ( STDMETHODCALLTYPE *SetDefaultTransitionB )( - IAMTimeline * This, - BSTR pGuid); - - HRESULT ( STDMETHODCALLTYPE *GetDefaultTransitionB )( - IAMTimeline * This, - /* [retval][out] */ BSTR *pGuid); - - HRESULT ( STDMETHODCALLTYPE *SetDefaultEffectB )( - IAMTimeline * This, - BSTR pGuid); - - HRESULT ( STDMETHODCALLTYPE *GetDefaultEffectB )( - IAMTimeline * This, - /* [retval][out] */ BSTR *pGuid); - - END_INTERFACE - } IAMTimelineVtbl; - - interface IAMTimeline - { - CONST_VTBL struct IAMTimelineVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTimeline_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTimeline_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTimeline_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTimeline_CreateEmptyNode(This,ppObj,Type) \ - (This)->lpVtbl -> CreateEmptyNode(This,ppObj,Type) - -#define IAMTimeline_AddGroup(This,pGroup) \ - (This)->lpVtbl -> AddGroup(This,pGroup) - -#define IAMTimeline_RemGroupFromList(This,pGroup) \ - (This)->lpVtbl -> RemGroupFromList(This,pGroup) - -#define IAMTimeline_GetGroup(This,ppGroup,WhichGroup) \ - (This)->lpVtbl -> GetGroup(This,ppGroup,WhichGroup) - -#define IAMTimeline_GetGroupCount(This,pCount) \ - (This)->lpVtbl -> GetGroupCount(This,pCount) - -#define IAMTimeline_ClearAllGroups(This) \ - (This)->lpVtbl -> ClearAllGroups(This) - -#define IAMTimeline_GetInsertMode(This,pMode) \ - (This)->lpVtbl -> GetInsertMode(This,pMode) - -#define IAMTimeline_SetInsertMode(This,Mode) \ - (This)->lpVtbl -> SetInsertMode(This,Mode) - -#define IAMTimeline_EnableTransitions(This,fEnabled) \ - (This)->lpVtbl -> EnableTransitions(This,fEnabled) - -#define IAMTimeline_TransitionsEnabled(This,pfEnabled) \ - (This)->lpVtbl -> TransitionsEnabled(This,pfEnabled) - -#define IAMTimeline_EnableEffects(This,fEnabled) \ - (This)->lpVtbl -> EnableEffects(This,fEnabled) - -#define IAMTimeline_EffectsEnabled(This,pfEnabled) \ - (This)->lpVtbl -> EffectsEnabled(This,pfEnabled) - -#define IAMTimeline_SetInterestRange(This,Start,Stop) \ - (This)->lpVtbl -> SetInterestRange(This,Start,Stop) - -#define IAMTimeline_GetDuration(This,pDuration) \ - (This)->lpVtbl -> GetDuration(This,pDuration) - -#define IAMTimeline_GetDuration2(This,pDuration) \ - (This)->lpVtbl -> GetDuration2(This,pDuration) - -#define IAMTimeline_SetDefaultFPS(This,FPS) \ - (This)->lpVtbl -> SetDefaultFPS(This,FPS) - -#define IAMTimeline_GetDefaultFPS(This,pFPS) \ - (This)->lpVtbl -> GetDefaultFPS(This,pFPS) - -#define IAMTimeline_IsDirty(This,pDirty) \ - (This)->lpVtbl -> IsDirty(This,pDirty) - -#define IAMTimeline_GetDirtyRange(This,pStart,pStop) \ - (This)->lpVtbl -> GetDirtyRange(This,pStart,pStop) - -#define IAMTimeline_GetCountOfType(This,Group,pVal,pValWithComps,MajorType) \ - (This)->lpVtbl -> GetCountOfType(This,Group,pVal,pValWithComps,MajorType) - -#define IAMTimeline_ValidateSourceNames(This,ValidateFlags,pOverride,NotifyEventHandle) \ - (This)->lpVtbl -> ValidateSourceNames(This,ValidateFlags,pOverride,NotifyEventHandle) - -#define IAMTimeline_SetDefaultTransition(This,pGuid) \ - (This)->lpVtbl -> SetDefaultTransition(This,pGuid) - -#define IAMTimeline_GetDefaultTransition(This,pGuid) \ - (This)->lpVtbl -> GetDefaultTransition(This,pGuid) - -#define IAMTimeline_SetDefaultEffect(This,pGuid) \ - (This)->lpVtbl -> SetDefaultEffect(This,pGuid) - -#define IAMTimeline_GetDefaultEffect(This,pGuid) \ - (This)->lpVtbl -> GetDefaultEffect(This,pGuid) - -#define IAMTimeline_SetDefaultTransitionB(This,pGuid) \ - (This)->lpVtbl -> SetDefaultTransitionB(This,pGuid) - -#define IAMTimeline_GetDefaultTransitionB(This,pGuid) \ - (This)->lpVtbl -> GetDefaultTransitionB(This,pGuid) - -#define IAMTimeline_SetDefaultEffectB(This,pGuid) \ - (This)->lpVtbl -> SetDefaultEffectB(This,pGuid) - -#define IAMTimeline_GetDefaultEffectB(This,pGuid) \ - (This)->lpVtbl -> GetDefaultEffectB(This,pGuid) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_CreateEmptyNode_Proxy( - IAMTimeline * This, - /* [out] */ IAMTimelineObj **ppObj, - TIMELINE_MAJOR_TYPE Type); - - -void __RPC_STUB IAMTimeline_CreateEmptyNode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimeline_AddGroup_Proxy( - IAMTimeline * This, - IAMTimelineObj *pGroup); - - -void __RPC_STUB IAMTimeline_AddGroup_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimeline_RemGroupFromList_Proxy( - IAMTimeline * This, - IAMTimelineObj *pGroup); - - -void __RPC_STUB IAMTimeline_RemGroupFromList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimeline_GetGroup_Proxy( - IAMTimeline * This, - /* [out] */ IAMTimelineObj **ppGroup, - long WhichGroup); - - -void __RPC_STUB IAMTimeline_GetGroup_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimeline_GetGroupCount_Proxy( - IAMTimeline * This, - long *pCount); - - -void __RPC_STUB IAMTimeline_GetGroupCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimeline_ClearAllGroups_Proxy( - IAMTimeline * This); - - -void __RPC_STUB IAMTimeline_ClearAllGroups_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimeline_GetInsertMode_Proxy( - IAMTimeline * This, - long *pMode); - - -void __RPC_STUB IAMTimeline_GetInsertMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_SetInsertMode_Proxy( - IAMTimeline * This, - long Mode); - - -void __RPC_STUB IAMTimeline_SetInsertMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_EnableTransitions_Proxy( - IAMTimeline * This, - BOOL fEnabled); - - -void __RPC_STUB IAMTimeline_EnableTransitions_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_TransitionsEnabled_Proxy( - IAMTimeline * This, - BOOL *pfEnabled); - - -void __RPC_STUB IAMTimeline_TransitionsEnabled_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_EnableEffects_Proxy( - IAMTimeline * This, - BOOL fEnabled); - - -void __RPC_STUB IAMTimeline_EnableEffects_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_EffectsEnabled_Proxy( - IAMTimeline * This, - BOOL *pfEnabled); - - -void __RPC_STUB IAMTimeline_EffectsEnabled_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_SetInterestRange_Proxy( - IAMTimeline * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - -void __RPC_STUB IAMTimeline_SetInterestRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_GetDuration_Proxy( - IAMTimeline * This, - REFERENCE_TIME *pDuration); - - -void __RPC_STUB IAMTimeline_GetDuration_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_GetDuration2_Proxy( - IAMTimeline * This, - double *pDuration); - - -void __RPC_STUB IAMTimeline_GetDuration2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_SetDefaultFPS_Proxy( - IAMTimeline * This, - double FPS); - - -void __RPC_STUB IAMTimeline_SetDefaultFPS_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_GetDefaultFPS_Proxy( - IAMTimeline * This, - double *pFPS); - - -void __RPC_STUB IAMTimeline_GetDefaultFPS_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_IsDirty_Proxy( - IAMTimeline * This, - BOOL *pDirty); - - -void __RPC_STUB IAMTimeline_IsDirty_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_GetDirtyRange_Proxy( - IAMTimeline * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - -void __RPC_STUB IAMTimeline_GetDirtyRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_GetCountOfType_Proxy( - IAMTimeline * This, - long Group, - long *pVal, - long *pValWithComps, - TIMELINE_MAJOR_TYPE MajorType); - - -void __RPC_STUB IAMTimeline_GetCountOfType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimeline_ValidateSourceNames_Proxy( - IAMTimeline * This, - long ValidateFlags, - IMediaLocator *pOverride, - LONG_PTR NotifyEventHandle); - - -void __RPC_STUB IAMTimeline_ValidateSourceNames_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimeline_SetDefaultTransition_Proxy( - IAMTimeline * This, - GUID *pGuid); - - -void __RPC_STUB IAMTimeline_SetDefaultTransition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimeline_GetDefaultTransition_Proxy( - IAMTimeline * This, - GUID *pGuid); - - -void __RPC_STUB IAMTimeline_GetDefaultTransition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimeline_SetDefaultEffect_Proxy( - IAMTimeline * This, - GUID *pGuid); - - -void __RPC_STUB IAMTimeline_SetDefaultEffect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimeline_GetDefaultEffect_Proxy( - IAMTimeline * This, - GUID *pGuid); - - -void __RPC_STUB IAMTimeline_GetDefaultEffect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimeline_SetDefaultTransitionB_Proxy( - IAMTimeline * This, - BSTR pGuid); - - -void __RPC_STUB IAMTimeline_SetDefaultTransitionB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimeline_GetDefaultTransitionB_Proxy( - IAMTimeline * This, - /* [retval][out] */ BSTR *pGuid); - - -void __RPC_STUB IAMTimeline_GetDefaultTransitionB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimeline_SetDefaultEffectB_Proxy( - IAMTimeline * This, - BSTR pGuid); - - -void __RPC_STUB IAMTimeline_SetDefaultEffectB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimeline_GetDefaultEffectB_Proxy( - IAMTimeline * This, - /* [retval][out] */ BSTR *pGuid); - - -void __RPC_STUB IAMTimeline_GetDefaultEffectB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTimeline_INTERFACE_DEFINED__ */ - - -#ifndef __IXml2Dex_INTERFACE_DEFINED__ -#define __IXml2Dex_INTERFACE_DEFINED__ - -/* interface IXml2Dex */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IXml2Dex; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("18C628ED-962A-11D2-8D08-00A0C9441E20") - IXml2Dex : public IDispatch - { - public: - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CreateGraphFromFile( - /* [out] */ IUnknown **ppGraph, - IUnknown *pTimeline, - BSTR Filename) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE WriteGrfFile( - IUnknown *pGraph, - BSTR FileName) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE WriteXMLFile( - IUnknown *pTimeline, - BSTR FileName) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ReadXMLFile( - IUnknown *pTimeline, - BSTR XMLName) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Delete( - IUnknown *pTimeline, - double dStart, - double dEnd) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE WriteXMLPart( - IUnknown *pTimeline, - double dStart, - double dEnd, - BSTR FileName) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE PasteXMLFile( - IUnknown *pTimeline, - double dStart, - BSTR FileName) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CopyXML( - IUnknown *pTimeline, - double dStart, - double dEnd) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE PasteXML( - IUnknown *pTimeline, - double dStart) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Reset( void) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ReadXML( - IUnknown *pTimeline, - IUnknown *pXML) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE WriteXML( - IUnknown *pTimeline, - BSTR *pbstrXML) = 0; - - }; - -#else /* C style interface */ - - typedef struct IXml2DexVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IXml2Dex * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IXml2Dex * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IXml2Dex * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IXml2Dex * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IXml2Dex * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IXml2Dex * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IXml2Dex * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CreateGraphFromFile )( - IXml2Dex * This, - /* [out] */ IUnknown **ppGraph, - IUnknown *pTimeline, - BSTR Filename); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *WriteGrfFile )( - IXml2Dex * This, - IUnknown *pGraph, - BSTR FileName); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *WriteXMLFile )( - IXml2Dex * This, - IUnknown *pTimeline, - BSTR FileName); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *ReadXMLFile )( - IXml2Dex * This, - IUnknown *pTimeline, - BSTR XMLName); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Delete )( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart, - double dEnd); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *WriteXMLPart )( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart, - double dEnd, - BSTR FileName); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *PasteXMLFile )( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart, - BSTR FileName); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CopyXML )( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart, - double dEnd); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *PasteXML )( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Reset )( - IXml2Dex * This); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *ReadXML )( - IXml2Dex * This, - IUnknown *pTimeline, - IUnknown *pXML); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *WriteXML )( - IXml2Dex * This, - IUnknown *pTimeline, - BSTR *pbstrXML); - - END_INTERFACE - } IXml2DexVtbl; - - interface IXml2Dex - { - CONST_VTBL struct IXml2DexVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IXml2Dex_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IXml2Dex_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IXml2Dex_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IXml2Dex_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IXml2Dex_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IXml2Dex_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IXml2Dex_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IXml2Dex_CreateGraphFromFile(This,ppGraph,pTimeline,Filename) \ - (This)->lpVtbl -> CreateGraphFromFile(This,ppGraph,pTimeline,Filename) - -#define IXml2Dex_WriteGrfFile(This,pGraph,FileName) \ - (This)->lpVtbl -> WriteGrfFile(This,pGraph,FileName) - -#define IXml2Dex_WriteXMLFile(This,pTimeline,FileName) \ - (This)->lpVtbl -> WriteXMLFile(This,pTimeline,FileName) - -#define IXml2Dex_ReadXMLFile(This,pTimeline,XMLName) \ - (This)->lpVtbl -> ReadXMLFile(This,pTimeline,XMLName) - -#define IXml2Dex_Delete(This,pTimeline,dStart,dEnd) \ - (This)->lpVtbl -> Delete(This,pTimeline,dStart,dEnd) - -#define IXml2Dex_WriteXMLPart(This,pTimeline,dStart,dEnd,FileName) \ - (This)->lpVtbl -> WriteXMLPart(This,pTimeline,dStart,dEnd,FileName) - -#define IXml2Dex_PasteXMLFile(This,pTimeline,dStart,FileName) \ - (This)->lpVtbl -> PasteXMLFile(This,pTimeline,dStart,FileName) - -#define IXml2Dex_CopyXML(This,pTimeline,dStart,dEnd) \ - (This)->lpVtbl -> CopyXML(This,pTimeline,dStart,dEnd) - -#define IXml2Dex_PasteXML(This,pTimeline,dStart) \ - (This)->lpVtbl -> PasteXML(This,pTimeline,dStart) - -#define IXml2Dex_Reset(This) \ - (This)->lpVtbl -> Reset(This) - -#define IXml2Dex_ReadXML(This,pTimeline,pXML) \ - (This)->lpVtbl -> ReadXML(This,pTimeline,pXML) - -#define IXml2Dex_WriteXML(This,pTimeline,pbstrXML) \ - (This)->lpVtbl -> WriteXML(This,pTimeline,pbstrXML) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_CreateGraphFromFile_Proxy( - IXml2Dex * This, - /* [out] */ IUnknown **ppGraph, - IUnknown *pTimeline, - BSTR Filename); - - -void __RPC_STUB IXml2Dex_CreateGraphFromFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_WriteGrfFile_Proxy( - IXml2Dex * This, - IUnknown *pGraph, - BSTR FileName); - - -void __RPC_STUB IXml2Dex_WriteGrfFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_WriteXMLFile_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - BSTR FileName); - - -void __RPC_STUB IXml2Dex_WriteXMLFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_ReadXMLFile_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - BSTR XMLName); - - -void __RPC_STUB IXml2Dex_ReadXMLFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_Delete_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart, - double dEnd); - - -void __RPC_STUB IXml2Dex_Delete_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_WriteXMLPart_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart, - double dEnd, - BSTR FileName); - - -void __RPC_STUB IXml2Dex_WriteXMLPart_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_PasteXMLFile_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart, - BSTR FileName); - - -void __RPC_STUB IXml2Dex_PasteXMLFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_CopyXML_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart, - double dEnd); - - -void __RPC_STUB IXml2Dex_CopyXML_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_PasteXML_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart); - - -void __RPC_STUB IXml2Dex_PasteXML_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_Reset_Proxy( - IXml2Dex * This); - - -void __RPC_STUB IXml2Dex_Reset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_ReadXML_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - IUnknown *pXML); - - -void __RPC_STUB IXml2Dex_ReadXML_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_WriteXML_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - BSTR *pbstrXML); - - -void __RPC_STUB IXml2Dex_WriteXML_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IXml2Dex_INTERFACE_DEFINED__ */ - - -#ifndef __IAMErrorLog_INTERFACE_DEFINED__ -#define __IAMErrorLog_INTERFACE_DEFINED__ - -/* interface IAMErrorLog */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IAMErrorLog; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("E43E73A2-0EFA-11d3-9601-00A0C9441E20") - IAMErrorLog : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LogError( - long Severity, - BSTR pErrorString, - long ErrorCode, - long hresult, - /* [in] */ VARIANT *pExtraInfo) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMErrorLogVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMErrorLog * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMErrorLog * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMErrorLog * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *LogError )( - IAMErrorLog * This, - long Severity, - BSTR pErrorString, - long ErrorCode, - long hresult, - /* [in] */ VARIANT *pExtraInfo); - - END_INTERFACE - } IAMErrorLogVtbl; - - interface IAMErrorLog - { - CONST_VTBL struct IAMErrorLogVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMErrorLog_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMErrorLog_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMErrorLog_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMErrorLog_LogError(This,Severity,pErrorString,ErrorCode,hresult,pExtraInfo) \ - (This)->lpVtbl -> LogError(This,Severity,pErrorString,ErrorCode,hresult,pExtraInfo) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMErrorLog_LogError_Proxy( - IAMErrorLog * This, - long Severity, - BSTR pErrorString, - long ErrorCode, - long hresult, - /* [in] */ VARIANT *pExtraInfo); - - -void __RPC_STUB IAMErrorLog_LogError_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMErrorLog_INTERFACE_DEFINED__ */ - - -#ifndef __IAMSetErrorLog_INTERFACE_DEFINED__ -#define __IAMSetErrorLog_INTERFACE_DEFINED__ - -/* interface IAMSetErrorLog */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IAMSetErrorLog; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("963566DA-BE21-4eaf-88E9-35704F8F52A1") - IAMSetErrorLog : public IUnknown - { - public: - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ErrorLog( - /* [retval][out] */ IAMErrorLog **pVal) = 0; - - virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_ErrorLog( - /* [in] */ IAMErrorLog *newVal) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMSetErrorLogVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMSetErrorLog * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMSetErrorLog * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMSetErrorLog * This); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ErrorLog )( - IAMSetErrorLog * This, - /* [retval][out] */ IAMErrorLog **pVal); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ErrorLog )( - IAMSetErrorLog * This, - /* [in] */ IAMErrorLog *newVal); - - END_INTERFACE - } IAMSetErrorLogVtbl; - - interface IAMSetErrorLog - { - CONST_VTBL struct IAMSetErrorLogVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMSetErrorLog_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMSetErrorLog_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMSetErrorLog_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMSetErrorLog_get_ErrorLog(This,pVal) \ - (This)->lpVtbl -> get_ErrorLog(This,pVal) - -#define IAMSetErrorLog_put_ErrorLog(This,newVal) \ - (This)->lpVtbl -> put_ErrorLog(This,newVal) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAMSetErrorLog_get_ErrorLog_Proxy( - IAMSetErrorLog * This, - /* [retval][out] */ IAMErrorLog **pVal); - - -void __RPC_STUB IAMSetErrorLog_get_ErrorLog_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IAMSetErrorLog_put_ErrorLog_Proxy( - IAMSetErrorLog * This, - /* [in] */ IAMErrorLog *newVal); - - -void __RPC_STUB IAMSetErrorLog_put_ErrorLog_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMSetErrorLog_INTERFACE_DEFINED__ */ - - -#ifndef __ISampleGrabberCB_INTERFACE_DEFINED__ -#define __ISampleGrabberCB_INTERFACE_DEFINED__ - -/* interface ISampleGrabberCB */ -/* [unique][helpstring][local][uuid][object] */ - - -EXTERN_C const IID IID_ISampleGrabberCB; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("0579154A-2B53-4994-B0D0-E773148EFF85") - ISampleGrabberCB : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SampleCB( - double SampleTime, - IMediaSample *pSample) = 0; - - virtual HRESULT STDMETHODCALLTYPE BufferCB( - double SampleTime, - BYTE *pBuffer, - long BufferLen) = 0; - - }; - -#else /* C style interface */ - - typedef struct ISampleGrabberCBVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ISampleGrabberCB * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ISampleGrabberCB * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ISampleGrabberCB * This); - - HRESULT ( STDMETHODCALLTYPE *SampleCB )( - ISampleGrabberCB * This, - double SampleTime, - IMediaSample *pSample); - - HRESULT ( STDMETHODCALLTYPE *BufferCB )( - ISampleGrabberCB * This, - double SampleTime, - BYTE *pBuffer, - long BufferLen); - - END_INTERFACE - } ISampleGrabberCBVtbl; - - interface ISampleGrabberCB - { - CONST_VTBL struct ISampleGrabberCBVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ISampleGrabberCB_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ISampleGrabberCB_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ISampleGrabberCB_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ISampleGrabberCB_SampleCB(This,SampleTime,pSample) \ - (This)->lpVtbl -> SampleCB(This,SampleTime,pSample) - -#define ISampleGrabberCB_BufferCB(This,SampleTime,pBuffer,BufferLen) \ - (This)->lpVtbl -> BufferCB(This,SampleTime,pBuffer,BufferLen) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE ISampleGrabberCB_SampleCB_Proxy( - ISampleGrabberCB * This, - double SampleTime, - IMediaSample *pSample); - - -void __RPC_STUB ISampleGrabberCB_SampleCB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ISampleGrabberCB_BufferCB_Proxy( - ISampleGrabberCB * This, - double SampleTime, - BYTE *pBuffer, - long BufferLen); - - -void __RPC_STUB ISampleGrabberCB_BufferCB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ISampleGrabberCB_INTERFACE_DEFINED__ */ - - -#ifndef __ISampleGrabber_INTERFACE_DEFINED__ -#define __ISampleGrabber_INTERFACE_DEFINED__ - -/* interface ISampleGrabber */ -/* [unique][helpstring][local][uuid][object] */ - - -EXTERN_C const IID IID_ISampleGrabber; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("6B652FFF-11FE-4fce-92AD-0266B5D7C78F") - ISampleGrabber : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetOneShot( - BOOL OneShot) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMediaType( - const AM_MEDIA_TYPE *pType) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetConnectedMediaType( - AM_MEDIA_TYPE *pType) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetBufferSamples( - BOOL BufferThem) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentBuffer( - /* [out][in] */ long *pBufferSize, - /* [out] */ long *pBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentSample( - /* [retval][out] */ IMediaSample **ppSample) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallback( - ISampleGrabberCB *pCallback, - long WhichMethodToCallback) = 0; - - }; - -#else /* C style interface */ - - typedef struct ISampleGrabberVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ISampleGrabber * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ISampleGrabber * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ISampleGrabber * This); - - HRESULT ( STDMETHODCALLTYPE *SetOneShot )( - ISampleGrabber * This, - BOOL OneShot); - - HRESULT ( STDMETHODCALLTYPE *SetMediaType )( - ISampleGrabber * This, - const AM_MEDIA_TYPE *pType); - - HRESULT ( STDMETHODCALLTYPE *GetConnectedMediaType )( - ISampleGrabber * This, - AM_MEDIA_TYPE *pType); - - HRESULT ( STDMETHODCALLTYPE *SetBufferSamples )( - ISampleGrabber * This, - BOOL BufferThem); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentBuffer )( - ISampleGrabber * This, - /* [out][in] */ long *pBufferSize, - /* [out] */ long *pBuffer); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentSample )( - ISampleGrabber * This, - /* [retval][out] */ IMediaSample **ppSample); - - HRESULT ( STDMETHODCALLTYPE *SetCallback )( - ISampleGrabber * This, - ISampleGrabberCB *pCallback, - long WhichMethodToCallback); - - END_INTERFACE - } ISampleGrabberVtbl; - - interface ISampleGrabber - { - CONST_VTBL struct ISampleGrabberVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ISampleGrabber_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ISampleGrabber_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ISampleGrabber_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ISampleGrabber_SetOneShot(This,OneShot) \ - (This)->lpVtbl -> SetOneShot(This,OneShot) - -#define ISampleGrabber_SetMediaType(This,pType) \ - (This)->lpVtbl -> SetMediaType(This,pType) - -#define ISampleGrabber_GetConnectedMediaType(This,pType) \ - (This)->lpVtbl -> GetConnectedMediaType(This,pType) - -#define ISampleGrabber_SetBufferSamples(This,BufferThem) \ - (This)->lpVtbl -> SetBufferSamples(This,BufferThem) - -#define ISampleGrabber_GetCurrentBuffer(This,pBufferSize,pBuffer) \ - (This)->lpVtbl -> GetCurrentBuffer(This,pBufferSize,pBuffer) - -#define ISampleGrabber_GetCurrentSample(This,ppSample) \ - (This)->lpVtbl -> GetCurrentSample(This,ppSample) - -#define ISampleGrabber_SetCallback(This,pCallback,WhichMethodToCallback) \ - (This)->lpVtbl -> SetCallback(This,pCallback,WhichMethodToCallback) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE ISampleGrabber_SetOneShot_Proxy( - ISampleGrabber * This, - BOOL OneShot); - - -void __RPC_STUB ISampleGrabber_SetOneShot_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ISampleGrabber_SetMediaType_Proxy( - ISampleGrabber * This, - const AM_MEDIA_TYPE *pType); - - -void __RPC_STUB ISampleGrabber_SetMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ISampleGrabber_GetConnectedMediaType_Proxy( - ISampleGrabber * This, - AM_MEDIA_TYPE *pType); - - -void __RPC_STUB ISampleGrabber_GetConnectedMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ISampleGrabber_SetBufferSamples_Proxy( - ISampleGrabber * This, - BOOL BufferThem); - - -void __RPC_STUB ISampleGrabber_SetBufferSamples_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ISampleGrabber_GetCurrentBuffer_Proxy( - ISampleGrabber * This, - /* [out][in] */ long *pBufferSize, - /* [out] */ long *pBuffer); - - -void __RPC_STUB ISampleGrabber_GetCurrentBuffer_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ISampleGrabber_GetCurrentSample_Proxy( - ISampleGrabber * This, - /* [retval][out] */ IMediaSample **ppSample); - - -void __RPC_STUB ISampleGrabber_GetCurrentSample_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ISampleGrabber_SetCallback_Proxy( - ISampleGrabber * This, - ISampleGrabberCB *pCallback, - long WhichMethodToCallback); - - -void __RPC_STUB ISampleGrabber_SetCallback_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ISampleGrabber_INTERFACE_DEFINED__ */ - - - -#ifndef __DexterLib_LIBRARY_DEFINED__ -#define __DexterLib_LIBRARY_DEFINED__ - -/* library DexterLib */ -/* [helpstring][version][uuid] */ - - -EXTERN_C const IID LIBID_DexterLib; - -EXTERN_C const CLSID CLSID_AMTimeline; - -#ifdef __cplusplus - -class DECLSPEC_UUID("78530B75-61F9-11D2-8CAD-00A024580902") -AMTimeline; -#endif - -EXTERN_C const CLSID CLSID_AMTimelineObj; - -#ifdef __cplusplus - -class DECLSPEC_UUID("78530B78-61F9-11D2-8CAD-00A024580902") -AMTimelineObj; -#endif - -EXTERN_C const CLSID CLSID_AMTimelineSrc; - -#ifdef __cplusplus - -class DECLSPEC_UUID("78530B7A-61F9-11D2-8CAD-00A024580902") -AMTimelineSrc; -#endif - -EXTERN_C const CLSID CLSID_AMTimelineTrack; - -#ifdef __cplusplus - -class DECLSPEC_UUID("8F6C3C50-897B-11d2-8CFB-00A0C9441E20") -AMTimelineTrack; -#endif - -EXTERN_C const CLSID CLSID_AMTimelineComp; - -#ifdef __cplusplus - -class DECLSPEC_UUID("74D2EC80-6233-11d2-8CAD-00A024580902") -AMTimelineComp; -#endif - -EXTERN_C const CLSID CLSID_AMTimelineGroup; - -#ifdef __cplusplus - -class DECLSPEC_UUID("F6D371E1-B8A6-11d2-8023-00C0DF10D434") -AMTimelineGroup; -#endif - -EXTERN_C const CLSID CLSID_AMTimelineTrans; - -#ifdef __cplusplus - -class DECLSPEC_UUID("74D2EC81-6233-11d2-8CAD-00A024580902") -AMTimelineTrans; -#endif - -EXTERN_C const CLSID CLSID_AMTimelineEffect; - -#ifdef __cplusplus - -class DECLSPEC_UUID("74D2EC82-6233-11d2-8CAD-00A024580902") -AMTimelineEffect; -#endif - -EXTERN_C const CLSID CLSID_RenderEngine; - -#ifdef __cplusplus - -class DECLSPEC_UUID("64D8A8E0-80A2-11d2-8CF3-00A0C9441E20") -RenderEngine; -#endif - -EXTERN_C const CLSID CLSID_SmartRenderEngine; - -#ifdef __cplusplus - -class DECLSPEC_UUID("498B0949-BBE9-4072-98BE-6CCAEB79DC6F") -SmartRenderEngine; -#endif - -EXTERN_C const CLSID CLSID_AudMixer; - -#ifdef __cplusplus - -class DECLSPEC_UUID("036A9790-C153-11d2-9EF7-006008039E37") -AudMixer; -#endif - -EXTERN_C const CLSID CLSID_Xml2Dex; - -#ifdef __cplusplus - -class DECLSPEC_UUID("18C628EE-962A-11D2-8D08-00A0C9441E20") -Xml2Dex; -#endif - -EXTERN_C const CLSID CLSID_MediaLocator; - -#ifdef __cplusplus - -class DECLSPEC_UUID("CC1101F2-79DC-11D2-8CE6-00A0C9441E20") -MediaLocator; -#endif - -EXTERN_C const CLSID CLSID_PropertySetter; - -#ifdef __cplusplus - -class DECLSPEC_UUID("ADF95821-DED7-11d2-ACBE-0080C75E246E") -PropertySetter; -#endif - -EXTERN_C const CLSID CLSID_MediaDet; - -#ifdef __cplusplus - -class DECLSPEC_UUID("65BD0711-24D2-4ff7-9324-ED2E5D3ABAFA") -MediaDet; -#endif - -EXTERN_C const CLSID CLSID_SampleGrabber; - -#ifdef __cplusplus - -class DECLSPEC_UUID("C1F400A0-3F08-11d3-9F0B-006008039E37") -SampleGrabber; -#endif - -EXTERN_C const CLSID CLSID_NullRenderer; - -#ifdef __cplusplus - -class DECLSPEC_UUID("C1F400A4-3F08-11d3-9F0B-006008039E37") -NullRenderer; -#endif - -EXTERN_C const CLSID CLSID_DxtCompositor; - -#ifdef __cplusplus - -class DECLSPEC_UUID("BB44391D-6ABD-422f-9E2E-385C9DFF51FC") -DxtCompositor; -#endif - -EXTERN_C const CLSID CLSID_DxtAlphaSetter; - -#ifdef __cplusplus - -class DECLSPEC_UUID("506D89AE-909A-44f7-9444-ABD575896E35") -DxtAlphaSetter; -#endif - -EXTERN_C const CLSID CLSID_DxtJpeg; - -#ifdef __cplusplus - -class DECLSPEC_UUID("DE75D012-7A65-11D2-8CEA-00A0C9441E20") -DxtJpeg; -#endif - -EXTERN_C const CLSID CLSID_ColorSource; - -#ifdef __cplusplus - -class DECLSPEC_UUID("0cfdd070-581a-11d2-9ee6-006008039e37") -ColorSource; -#endif - -EXTERN_C const CLSID CLSID_DxtKey; - -#ifdef __cplusplus - -class DECLSPEC_UUID("C5B19592-145E-11d3-9F04-006008039E37") -DxtKey; -#endif -#endif /* __DexterLib_LIBRARY_DEFINED__ */ - -/* interface __MIDL_itf_qedit_0474 */ -/* [local] */ - - -enum __MIDL___MIDL_itf_qedit_0474_0001 - { E_NOTINTREE = 0x80040400, - E_RENDER_ENGINE_IS_BROKEN = 0x80040401, - E_MUST_INIT_RENDERER = 0x80040402, - E_NOTDETERMINED = 0x80040403, - E_NO_TIMELINE = 0x80040404, - S_WARN_OUTPUTRESET = 40404 - } ; -#define DEX_IDS_BAD_SOURCE_NAME 1400 -#define DEX_IDS_BAD_SOURCE_NAME2 1401 -#define DEX_IDS_MISSING_SOURCE_NAME 1402 -#define DEX_IDS_UNKNOWN_SOURCE 1403 -#define DEX_IDS_INSTALL_PROBLEM 1404 -#define DEX_IDS_NO_SOURCE_NAMES 1405 -#define DEX_IDS_BAD_MEDIATYPE 1406 -#define DEX_IDS_STREAM_NUMBER 1407 -#define DEX_IDS_OUTOFMEMORY 1408 -#define DEX_IDS_DIBSEQ_NOTALLSAME 1409 -#define DEX_IDS_CLIPTOOSHORT 1410 -#define DEX_IDS_INVALID_DXT 1411 -#define DEX_IDS_INVALID_DEFAULT_DXT 1412 -#define DEX_IDS_NO_3D 1413 -#define DEX_IDS_BROKEN_DXT 1414 -#define DEX_IDS_NO_SUCH_PROPERTY 1415 -#define DEX_IDS_ILLEGAL_PROPERTY_VAL 1416 -#define DEX_IDS_INVALID_XML 1417 -#define DEX_IDS_CANT_FIND_FILTER 1418 -#define DEX_IDS_DISK_WRITE_ERROR 1419 -#define DEX_IDS_INVALID_AUDIO_FX 1420 -#define DEX_IDS_CANT_FIND_COMPRESSOR 1421 -#define DEX_IDS_TIMELINE_PARSE 1426 -#define DEX_IDS_GRAPH_ERROR 1427 -#define DEX_IDS_GRID_ERROR 1428 -#define DEX_IDS_INTERFACE_ERROR 1429 -EXTERN_GUID(CLSID_VideoEffects1Category, 0xcc7bfb42, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59); -EXTERN_GUID(CLSID_VideoEffects2Category, 0xcc7bfb43, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59); -EXTERN_GUID(CLSID_AudioEffects1Category, 0xcc7bfb44, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59); -EXTERN_GUID(CLSID_AudioEffects2Category, 0xcc7bfb45, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59); - - -extern RPC_IF_HANDLE __MIDL_itf_qedit_0474_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_qedit_0474_v0_0_s_ifspec; - -/* Additional Prototypes for ALL interfaces */ - -unsigned long __RPC_USER BSTR_UserSize( unsigned long *, unsigned long , BSTR * ); -unsigned char * __RPC_USER BSTR_UserMarshal( unsigned long *, unsigned char *, BSTR * ); -unsigned char * __RPC_USER BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); -void __RPC_USER BSTR_UserFree( unsigned long *, BSTR * ); - -unsigned long __RPC_USER VARIANT_UserSize( unsigned long *, unsigned long , VARIANT * ); -unsigned char * __RPC_USER VARIANT_UserMarshal( unsigned long *, unsigned char *, VARIANT * ); -unsigned char * __RPC_USER VARIANT_UserUnmarshal(unsigned long *, unsigned char *, VARIANT * ); -void __RPC_USER VARIANT_UserFree( unsigned long *, VARIANT * ); - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// The following is the original contents of this header from -// the DirectX 8.0 SDK. -// -///////////////////////////////////////////////////////////////////////////// - -#else // DirectX 8.0 content - - - - /* verify that the version is high enough to compile this file*/ - #ifndef __REQUIRED_RPCNDR_H_VERSION__ - #define __REQUIRED_RPCNDR_H_VERSION__ 440 - #endif - - #include "rpc.h" - #include "rpcndr.h" - - #ifndef __RPCNDR_H_VERSION__ - #error this stub requires an updated version of - #endif // __RPCNDR_H_VERSION__ - - #ifndef COM_NO_WINDOWS_H - #include "windows.h" - #include "ole2.h" - #endif /*COM_NO_WINDOWS_H*/ - - #ifndef __qedit_h__ - #define __qedit_h__ - - #if defined(_MSC_VER) && (_MSC_VER >= 1020) - #pragma once - #endif - - /* Forward Declarations */ - - #ifndef __IPropertySetter_FWD_DEFINED__ - #define __IPropertySetter_FWD_DEFINED__ - typedef interface IPropertySetter IPropertySetter; - #endif /* __IPropertySetter_FWD_DEFINED__ */ - - - #ifndef __IDxtCompositor_FWD_DEFINED__ - #define __IDxtCompositor_FWD_DEFINED__ - typedef interface IDxtCompositor IDxtCompositor; - #endif /* __IDxtCompositor_FWD_DEFINED__ */ - - - #ifndef __IDxtAlphaSetter_FWD_DEFINED__ - #define __IDxtAlphaSetter_FWD_DEFINED__ - typedef interface IDxtAlphaSetter IDxtAlphaSetter; - #endif /* __IDxtAlphaSetter_FWD_DEFINED__ */ - - - #ifndef __IDxtJpeg_FWD_DEFINED__ - #define __IDxtJpeg_FWD_DEFINED__ - typedef interface IDxtJpeg IDxtJpeg; - #endif /* __IDxtJpeg_FWD_DEFINED__ */ - - - #ifndef __IDxtKey_FWD_DEFINED__ - #define __IDxtKey_FWD_DEFINED__ - typedef interface IDxtKey IDxtKey; - #endif /* __IDxtKey_FWD_DEFINED__ */ - - - #ifndef __IMediaLocator_FWD_DEFINED__ - #define __IMediaLocator_FWD_DEFINED__ - typedef interface IMediaLocator IMediaLocator; - #endif /* __IMediaLocator_FWD_DEFINED__ */ - - - #ifndef __IMediaDet_FWD_DEFINED__ - #define __IMediaDet_FWD_DEFINED__ - typedef interface IMediaDet IMediaDet; - #endif /* __IMediaDet_FWD_DEFINED__ */ - - - #ifndef __IGrfCache_FWD_DEFINED__ - #define __IGrfCache_FWD_DEFINED__ - typedef interface IGrfCache IGrfCache; - #endif /* __IGrfCache_FWD_DEFINED__ */ - - - #ifndef __IRenderEngine_FWD_DEFINED__ - #define __IRenderEngine_FWD_DEFINED__ - typedef interface IRenderEngine IRenderEngine; - #endif /* __IRenderEngine_FWD_DEFINED__ */ - - - #ifndef __IFindCompressorCB_FWD_DEFINED__ - #define __IFindCompressorCB_FWD_DEFINED__ - typedef interface IFindCompressorCB IFindCompressorCB; - #endif /* __IFindCompressorCB_FWD_DEFINED__ */ - - - #ifndef __ISmartRenderEngine_FWD_DEFINED__ - #define __ISmartRenderEngine_FWD_DEFINED__ - typedef interface ISmartRenderEngine ISmartRenderEngine; - #endif /* __ISmartRenderEngine_FWD_DEFINED__ */ - - - #ifndef __IAMTimelineObj_FWD_DEFINED__ - #define __IAMTimelineObj_FWD_DEFINED__ - typedef interface IAMTimelineObj IAMTimelineObj; - #endif /* __IAMTimelineObj_FWD_DEFINED__ */ - - - #ifndef __IAMTimelineEffectable_FWD_DEFINED__ - #define __IAMTimelineEffectable_FWD_DEFINED__ - typedef interface IAMTimelineEffectable IAMTimelineEffectable; - #endif /* __IAMTimelineEffectable_FWD_DEFINED__ */ - - - #ifndef __IAMTimelineEffect_FWD_DEFINED__ - #define __IAMTimelineEffect_FWD_DEFINED__ - typedef interface IAMTimelineEffect IAMTimelineEffect; - #endif /* __IAMTimelineEffect_FWD_DEFINED__ */ - - - #ifndef __IAMTimelineTransable_FWD_DEFINED__ - #define __IAMTimelineTransable_FWD_DEFINED__ - typedef interface IAMTimelineTransable IAMTimelineTransable; - #endif /* __IAMTimelineTransable_FWD_DEFINED__ */ - - - #ifndef __IAMTimelineSplittable_FWD_DEFINED__ - #define __IAMTimelineSplittable_FWD_DEFINED__ - typedef interface IAMTimelineSplittable IAMTimelineSplittable; - #endif /* __IAMTimelineSplittable_FWD_DEFINED__ */ - - - #ifndef __IAMTimelineTrans_FWD_DEFINED__ - #define __IAMTimelineTrans_FWD_DEFINED__ - typedef interface IAMTimelineTrans IAMTimelineTrans; - #endif /* __IAMTimelineTrans_FWD_DEFINED__ */ - - - #ifndef __IAMTimelineSrc_FWD_DEFINED__ - #define __IAMTimelineSrc_FWD_DEFINED__ - typedef interface IAMTimelineSrc IAMTimelineSrc; - #endif /* __IAMTimelineSrc_FWD_DEFINED__ */ - - - #ifndef __IAMTimelineTrack_FWD_DEFINED__ - #define __IAMTimelineTrack_FWD_DEFINED__ - typedef interface IAMTimelineTrack IAMTimelineTrack; - #endif /* __IAMTimelineTrack_FWD_DEFINED__ */ - - - #ifndef __IAMTimelineVirtualTrack_FWD_DEFINED__ - #define __IAMTimelineVirtualTrack_FWD_DEFINED__ - typedef interface IAMTimelineVirtualTrack IAMTimelineVirtualTrack; - #endif /* __IAMTimelineVirtualTrack_FWD_DEFINED__ */ - - - #ifndef __IAMTimelineComp_FWD_DEFINED__ - #define __IAMTimelineComp_FWD_DEFINED__ - typedef interface IAMTimelineComp IAMTimelineComp; - #endif /* __IAMTimelineComp_FWD_DEFINED__ */ - - - #ifndef __IAMTimelineGroup_FWD_DEFINED__ - #define __IAMTimelineGroup_FWD_DEFINED__ - typedef interface IAMTimelineGroup IAMTimelineGroup; - #endif /* __IAMTimelineGroup_FWD_DEFINED__ */ - - - #ifndef __IAMTimeline_FWD_DEFINED__ - #define __IAMTimeline_FWD_DEFINED__ - typedef interface IAMTimeline IAMTimeline; - #endif /* __IAMTimeline_FWD_DEFINED__ */ - - - #ifndef __IXml2Dex_FWD_DEFINED__ - #define __IXml2Dex_FWD_DEFINED__ - typedef interface IXml2Dex IXml2Dex; - #endif /* __IXml2Dex_FWD_DEFINED__ */ - - - #ifndef __IAMErrorLog_FWD_DEFINED__ - #define __IAMErrorLog_FWD_DEFINED__ - typedef interface IAMErrorLog IAMErrorLog; - #endif /* __IAMErrorLog_FWD_DEFINED__ */ - - - #ifndef __IAMSetErrorLog_FWD_DEFINED__ - #define __IAMSetErrorLog_FWD_DEFINED__ - typedef interface IAMSetErrorLog IAMSetErrorLog; - #endif /* __IAMSetErrorLog_FWD_DEFINED__ */ - - - #ifndef __ISampleGrabberCB_FWD_DEFINED__ - #define __ISampleGrabberCB_FWD_DEFINED__ - typedef interface ISampleGrabberCB ISampleGrabberCB; - #endif /* __ISampleGrabberCB_FWD_DEFINED__ */ - - - #ifndef __ISampleGrabber_FWD_DEFINED__ - #define __ISampleGrabber_FWD_DEFINED__ - typedef interface ISampleGrabber ISampleGrabber; - #endif /* __ISampleGrabber_FWD_DEFINED__ */ - - - #ifndef __AMTimeline_FWD_DEFINED__ - #define __AMTimeline_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class AMTimeline AMTimeline; - #else - typedef struct AMTimeline AMTimeline; - #endif /* __cplusplus */ - - #endif /* __AMTimeline_FWD_DEFINED__ */ - - - #ifndef __AMTimelineObj_FWD_DEFINED__ - #define __AMTimelineObj_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class AMTimelineObj AMTimelineObj; - #else - typedef struct AMTimelineObj AMTimelineObj; - #endif /* __cplusplus */ - - #endif /* __AMTimelineObj_FWD_DEFINED__ */ - - - #ifndef __AMTimelineSrc_FWD_DEFINED__ - #define __AMTimelineSrc_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class AMTimelineSrc AMTimelineSrc; - #else - typedef struct AMTimelineSrc AMTimelineSrc; - #endif /* __cplusplus */ - - #endif /* __AMTimelineSrc_FWD_DEFINED__ */ - - - #ifndef __AMTimelineTrack_FWD_DEFINED__ - #define __AMTimelineTrack_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class AMTimelineTrack AMTimelineTrack; - #else - typedef struct AMTimelineTrack AMTimelineTrack; - #endif /* __cplusplus */ - - #endif /* __AMTimelineTrack_FWD_DEFINED__ */ - - - #ifndef __AMTimelineComp_FWD_DEFINED__ - #define __AMTimelineComp_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class AMTimelineComp AMTimelineComp; - #else - typedef struct AMTimelineComp AMTimelineComp; - #endif /* __cplusplus */ - - #endif /* __AMTimelineComp_FWD_DEFINED__ */ - - - #ifndef __AMTimelineGroup_FWD_DEFINED__ - #define __AMTimelineGroup_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class AMTimelineGroup AMTimelineGroup; - #else - typedef struct AMTimelineGroup AMTimelineGroup; - #endif /* __cplusplus */ - - #endif /* __AMTimelineGroup_FWD_DEFINED__ */ - - - #ifndef __AMTimelineTrans_FWD_DEFINED__ - #define __AMTimelineTrans_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class AMTimelineTrans AMTimelineTrans; - #else - typedef struct AMTimelineTrans AMTimelineTrans; - #endif /* __cplusplus */ - - #endif /* __AMTimelineTrans_FWD_DEFINED__ */ - - - #ifndef __AMTimelineEffect_FWD_DEFINED__ - #define __AMTimelineEffect_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class AMTimelineEffect AMTimelineEffect; - #else - typedef struct AMTimelineEffect AMTimelineEffect; - #endif /* __cplusplus */ - - #endif /* __AMTimelineEffect_FWD_DEFINED__ */ - - - #ifndef __RenderEngine_FWD_DEFINED__ - #define __RenderEngine_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class RenderEngine RenderEngine; - #else - typedef struct RenderEngine RenderEngine; - #endif /* __cplusplus */ - - #endif /* __RenderEngine_FWD_DEFINED__ */ - - - #ifndef __SmartRenderEngine_FWD_DEFINED__ - #define __SmartRenderEngine_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class SmartRenderEngine SmartRenderEngine; - #else - typedef struct SmartRenderEngine SmartRenderEngine; - #endif /* __cplusplus */ - - #endif /* __SmartRenderEngine_FWD_DEFINED__ */ - - - #ifndef __AudMixer_FWD_DEFINED__ - #define __AudMixer_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class AudMixer AudMixer; - #else - typedef struct AudMixer AudMixer; - #endif /* __cplusplus */ - - #endif /* __AudMixer_FWD_DEFINED__ */ - - - #ifndef __Xml2Dex_FWD_DEFINED__ - #define __Xml2Dex_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class Xml2Dex Xml2Dex; - #else - typedef struct Xml2Dex Xml2Dex; - #endif /* __cplusplus */ - - #endif /* __Xml2Dex_FWD_DEFINED__ */ - - - #ifndef __MediaLocator_FWD_DEFINED__ - #define __MediaLocator_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class MediaLocator MediaLocator; - #else - typedef struct MediaLocator MediaLocator; - #endif /* __cplusplus */ - - #endif /* __MediaLocator_FWD_DEFINED__ */ - - - #ifndef __PropertySetter_FWD_DEFINED__ - #define __PropertySetter_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class PropertySetter PropertySetter; - #else - typedef struct PropertySetter PropertySetter; - #endif /* __cplusplus */ - - #endif /* __PropertySetter_FWD_DEFINED__ */ - - - #ifndef __MediaDet_FWD_DEFINED__ - #define __MediaDet_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class MediaDet MediaDet; - #else - typedef struct MediaDet MediaDet; - #endif /* __cplusplus */ - - #endif /* __MediaDet_FWD_DEFINED__ */ - - - #ifndef __SampleGrabber_FWD_DEFINED__ - #define __SampleGrabber_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class SampleGrabber SampleGrabber; - #else - typedef struct SampleGrabber SampleGrabber; - #endif /* __cplusplus */ - - #endif /* __SampleGrabber_FWD_DEFINED__ */ - - - #ifndef __NullRenderer_FWD_DEFINED__ - #define __NullRenderer_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class NullRenderer NullRenderer; - #else - typedef struct NullRenderer NullRenderer; - #endif /* __cplusplus */ - - #endif /* __NullRenderer_FWD_DEFINED__ */ - - - #ifndef __DxtCompositor_FWD_DEFINED__ - #define __DxtCompositor_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class DxtCompositor DxtCompositor; - #else - typedef struct DxtCompositor DxtCompositor; - #endif /* __cplusplus */ - - #endif /* __DxtCompositor_FWD_DEFINED__ */ - - - #ifndef __DxtAlphaSetter_FWD_DEFINED__ - #define __DxtAlphaSetter_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class DxtAlphaSetter DxtAlphaSetter; - #else - typedef struct DxtAlphaSetter DxtAlphaSetter; - #endif /* __cplusplus */ - - #endif /* __DxtAlphaSetter_FWD_DEFINED__ */ - - - #ifndef __DxtJpeg_FWD_DEFINED__ - #define __DxtJpeg_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class DxtJpeg DxtJpeg; - #else - typedef struct DxtJpeg DxtJpeg; - #endif /* __cplusplus */ - - #endif /* __DxtJpeg_FWD_DEFINED__ */ - - - #ifndef __ColorSource_FWD_DEFINED__ - #define __ColorSource_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class ColorSource ColorSource; - #else - typedef struct ColorSource ColorSource; - #endif /* __cplusplus */ - - #endif /* __ColorSource_FWD_DEFINED__ */ - - - #ifndef __DxtKey_FWD_DEFINED__ - #define __DxtKey_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class DxtKey DxtKey; - #else - typedef struct DxtKey DxtKey; - #endif /* __cplusplus */ - - #endif /* __DxtKey_FWD_DEFINED__ */ - - - /* header files for imported files */ - #include "oaidl.h" - #include "ocidl.h" - #include "dxtrans.h" - #include "amstream.h" - - #ifdef __cplusplus - extern "C"{ - #endif - - void * __RPC_USER MIDL_user_allocate(size_t); - void __RPC_USER MIDL_user_free( void * ); - - /* interface __MIDL_itf_qedit_0000 */ - /* [local] */ - - - - - - - - - - - typedef /* [public] */ - enum __MIDL___MIDL_itf_qedit_0000_0001 - { DEXTERF_JUMP = 0, - DEXTERF_INTERPOLATE = DEXTERF_JUMP + 1 - } DEXTERF; - - typedef /* [public][public][public][public] */ struct __MIDL___MIDL_itf_qedit_0000_0002 - { - BSTR Name; - DISPID dispID; - LONG nValues; - } DEXTER_PARAM; - - typedef /* [public][public][public][public] */ struct __MIDL___MIDL_itf_qedit_0000_0003 - { - VARIANT v; - REFERENCE_TIME rt; - DWORD dwInterp; - } DEXTER_VALUE; - - - enum __MIDL___MIDL_itf_qedit_0000_0004 - { DEXTER_AUDIO_JUMP = 0, - DEXTER_AUDIO_INTERPOLATE = DEXTER_AUDIO_JUMP + 1 - } ; - typedef /* [public] */ struct __MIDL___MIDL_itf_qedit_0000_0005 - { - REFERENCE_TIME rtEnd; - double dLevel; - BOOL bMethod; - } DEXTER_AUDIO_VOLUMEENVELOPE; - - - enum __MIDL___MIDL_itf_qedit_0000_0006 - { TIMELINE_INSERT_MODE_INSERT = 1, - TIMELINE_INSERT_MODE_OVERLAY = 2 - } ; - typedef /* [public][public][public][public][public][public][public][public] */ - enum __MIDL___MIDL_itf_qedit_0000_0007 - { TIMELINE_MAJOR_TYPE_COMPOSITE = 1, - TIMELINE_MAJOR_TYPE_TRACK = 2, - TIMELINE_MAJOR_TYPE_SOURCE = 4, - TIMELINE_MAJOR_TYPE_TRANSITION = 8, - TIMELINE_MAJOR_TYPE_EFFECT = 16, - TIMELINE_MAJOR_TYPE_GROUP = 128 - } TIMELINE_MAJOR_TYPE; - - typedef /* [public] */ - enum __MIDL___MIDL_itf_qedit_0000_0008 - { DEXTERF_BOUNDING = -1, - DEXTERF_EXACTLY_AT = 0, - DEXTERF_FORWARDS = 1 - } DEXTERF_TRACK_SEARCH_FLAGS; - - typedef struct _SCompFmt0 - { - long nFormatId; - AM_MEDIA_TYPE MediaType; - } SCompFmt0; - - - enum __MIDL___MIDL_itf_qedit_0000_0009 - { RESIZEF_STRETCH = 0, - RESIZEF_CROP = RESIZEF_STRETCH + 1, - RESIZEF_PRESERVEASPECTRATIO = RESIZEF_CROP + 1, - RESIZEF_PRESERVEASPECTRATIO_NOLETTERBOX = RESIZEF_PRESERVEASPECTRATIO + 1 - } ; - - enum __MIDL___MIDL_itf_qedit_0000_0010 - { CONNECTF_DYNAMIC_NONE = 0, - CONNECTF_DYNAMIC_SOURCES = 0x1, - CONNECTF_DYNAMIC_EFFECTS = 0x2 - } ; - - enum __MIDL___MIDL_itf_qedit_0000_0011 - { SFN_VALIDATEF_CHECK = 0x1, - SFN_VALIDATEF_POPUP = 0x2, - SFN_VALIDATEF_TELLME = 0x4, - SFN_VALIDATEF_REPLACE = 0x8, - SFN_VALIDATEF_USELOCAL = 0x10, - SFN_VALIDATEF_NOFIND = 0x20, - SFN_VALIDATEF_IGNOREMUTED = 0x40, - SFN_VALIDATEF_END = SFN_VALIDATEF_IGNOREMUTED + 1 - } ; - - enum __MIDL___MIDL_itf_qedit_0000_0012 - { DXTKEY_RGB = 0, - DXTKEY_NONRED = DXTKEY_RGB + 1, - DXTKEY_LUMINANCE = DXTKEY_NONRED + 1, - DXTKEY_ALPHA = DXTKEY_LUMINANCE + 1, - DXTKEY_HUE = DXTKEY_ALPHA + 1 - } ; - - - extern RPC_IF_HANDLE __MIDL_itf_qedit_0000_v0_0_c_ifspec; - extern RPC_IF_HANDLE __MIDL_itf_qedit_0000_v0_0_s_ifspec; - - #ifndef __IPropertySetter_INTERFACE_DEFINED__ - #define __IPropertySetter_INTERFACE_DEFINED__ - - /* interface IPropertySetter */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IPropertySetter; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("AE9472BD-B0C3-11D2-8D24-00A0C9441E20") - IPropertySetter : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE LoadXML( - /* [in] */ IUnknown *pxml) = 0; - - virtual HRESULT STDMETHODCALLTYPE PrintXML( - /* [out] */ char *pszXML, - /* [in] */ int cbXML, - /* [out] */ int *pcbPrinted, - /* [in] */ int indent) = 0; - - virtual HRESULT STDMETHODCALLTYPE CloneProps( - /* [out] */ IPropertySetter **ppSetter, - /* [in] */ REFERENCE_TIME rtStart, - /* [in] */ REFERENCE_TIME rtStop) = 0; - - virtual HRESULT STDMETHODCALLTYPE AddProp( - /* [in] */ DEXTER_PARAM Param, - /* [in] */ DEXTER_VALUE *paValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetProps( - /* [out] */ LONG *pcParams, - /* [out] */ DEXTER_PARAM **paParam, - /* [out] */ DEXTER_VALUE **paValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE FreeProps( - /* [in] */ LONG cParams, - /* [in] */ DEXTER_PARAM *paParam, - /* [in] */ DEXTER_VALUE *paValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE ClearProps( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SaveToBlob( - /* [out] */ LONG *pcSize, - /* [out] */ BYTE **ppb) = 0; - - virtual HRESULT STDMETHODCALLTYPE LoadFromBlob( - /* [in] */ LONG cSize, - /* [in] */ BYTE *pb) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetProps( - /* [in] */ IUnknown *pTarget, - /* [in] */ REFERENCE_TIME rtNow) = 0; - - }; - - #else /* C style interface */ - - typedef struct IPropertySetterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IPropertySetter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IPropertySetter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IPropertySetter * This); - - HRESULT ( STDMETHODCALLTYPE *LoadXML )( - IPropertySetter * This, - /* [in] */ IUnknown *pxml); - - HRESULT ( STDMETHODCALLTYPE *PrintXML )( - IPropertySetter * This, - /* [out] */ char *pszXML, - /* [in] */ int cbXML, - /* [out] */ int *pcbPrinted, - /* [in] */ int indent); - - HRESULT ( STDMETHODCALLTYPE *CloneProps )( - IPropertySetter * This, - /* [out] */ IPropertySetter **ppSetter, - /* [in] */ REFERENCE_TIME rtStart, - /* [in] */ REFERENCE_TIME rtStop); - - HRESULT ( STDMETHODCALLTYPE *AddProp )( - IPropertySetter * This, - /* [in] */ DEXTER_PARAM Param, - /* [in] */ DEXTER_VALUE *paValue); - - HRESULT ( STDMETHODCALLTYPE *GetProps )( - IPropertySetter * This, - /* [out] */ LONG *pcParams, - /* [out] */ DEXTER_PARAM **paParam, - /* [out] */ DEXTER_VALUE **paValue); - - HRESULT ( STDMETHODCALLTYPE *FreeProps )( - IPropertySetter * This, - /* [in] */ LONG cParams, - /* [in] */ DEXTER_PARAM *paParam, - /* [in] */ DEXTER_VALUE *paValue); - - HRESULT ( STDMETHODCALLTYPE *ClearProps )( - IPropertySetter * This); - - HRESULT ( STDMETHODCALLTYPE *SaveToBlob )( - IPropertySetter * This, - /* [out] */ LONG *pcSize, - /* [out] */ BYTE **ppb); - - HRESULT ( STDMETHODCALLTYPE *LoadFromBlob )( - IPropertySetter * This, - /* [in] */ LONG cSize, - /* [in] */ BYTE *pb); - - HRESULT ( STDMETHODCALLTYPE *SetProps )( - IPropertySetter * This, - /* [in] */ IUnknown *pTarget, - /* [in] */ REFERENCE_TIME rtNow); - - END_INTERFACE - } IPropertySetterVtbl; - - interface IPropertySetter - { - CONST_VTBL struct IPropertySetterVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IPropertySetter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IPropertySetter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IPropertySetter_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IPropertySetter_LoadXML(This,pxml) \ - (This)->lpVtbl -> LoadXML(This,pxml) - - #define IPropertySetter_PrintXML(This,pszXML,cbXML,pcbPrinted,indent) \ - (This)->lpVtbl -> PrintXML(This,pszXML,cbXML,pcbPrinted,indent) - - #define IPropertySetter_CloneProps(This,ppSetter,rtStart,rtStop) \ - (This)->lpVtbl -> CloneProps(This,ppSetter,rtStart,rtStop) - - #define IPropertySetter_AddProp(This,Param,paValue) \ - (This)->lpVtbl -> AddProp(This,Param,paValue) - - #define IPropertySetter_GetProps(This,pcParams,paParam,paValue) \ - (This)->lpVtbl -> GetProps(This,pcParams,paParam,paValue) - - #define IPropertySetter_FreeProps(This,cParams,paParam,paValue) \ - (This)->lpVtbl -> FreeProps(This,cParams,paParam,paValue) - - #define IPropertySetter_ClearProps(This) \ - (This)->lpVtbl -> ClearProps(This) - - #define IPropertySetter_SaveToBlob(This,pcSize,ppb) \ - (This)->lpVtbl -> SaveToBlob(This,pcSize,ppb) - - #define IPropertySetter_LoadFromBlob(This,cSize,pb) \ - (This)->lpVtbl -> LoadFromBlob(This,cSize,pb) - - #define IPropertySetter_SetProps(This,pTarget,rtNow) \ - (This)->lpVtbl -> SetProps(This,pTarget,rtNow) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - HRESULT STDMETHODCALLTYPE IPropertySetter_LoadXML_Proxy( - IPropertySetter * This, - /* [in] */ IUnknown *pxml); - - - void __RPC_STUB IPropertySetter_LoadXML_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IPropertySetter_PrintXML_Proxy( - IPropertySetter * This, - /* [out] */ char *pszXML, - /* [in] */ int cbXML, - /* [out] */ int *pcbPrinted, - /* [in] */ int indent); - - - void __RPC_STUB IPropertySetter_PrintXML_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IPropertySetter_CloneProps_Proxy( - IPropertySetter * This, - /* [out] */ IPropertySetter **ppSetter, - /* [in] */ REFERENCE_TIME rtStart, - /* [in] */ REFERENCE_TIME rtStop); - - - void __RPC_STUB IPropertySetter_CloneProps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IPropertySetter_AddProp_Proxy( - IPropertySetter * This, - /* [in] */ DEXTER_PARAM Param, - /* [in] */ DEXTER_VALUE *paValue); - - - void __RPC_STUB IPropertySetter_AddProp_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IPropertySetter_GetProps_Proxy( - IPropertySetter * This, - /* [out] */ LONG *pcParams, - /* [out] */ DEXTER_PARAM **paParam, - /* [out] */ DEXTER_VALUE **paValue); - - - void __RPC_STUB IPropertySetter_GetProps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IPropertySetter_FreeProps_Proxy( - IPropertySetter * This, - /* [in] */ LONG cParams, - /* [in] */ DEXTER_PARAM *paParam, - /* [in] */ DEXTER_VALUE *paValue); - - - void __RPC_STUB IPropertySetter_FreeProps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IPropertySetter_ClearProps_Proxy( - IPropertySetter * This); - - - void __RPC_STUB IPropertySetter_ClearProps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IPropertySetter_SaveToBlob_Proxy( - IPropertySetter * This, - /* [out] */ LONG *pcSize, - /* [out] */ BYTE **ppb); - - - void __RPC_STUB IPropertySetter_SaveToBlob_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IPropertySetter_LoadFromBlob_Proxy( - IPropertySetter * This, - /* [in] */ LONG cSize, - /* [in] */ BYTE *pb); - - - void __RPC_STUB IPropertySetter_LoadFromBlob_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IPropertySetter_SetProps_Proxy( - IPropertySetter * This, - /* [in] */ IUnknown *pTarget, - /* [in] */ REFERENCE_TIME rtNow); - - - void __RPC_STUB IPropertySetter_SetProps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IPropertySetter_INTERFACE_DEFINED__ */ - - - #ifndef __IDxtCompositor_INTERFACE_DEFINED__ - #define __IDxtCompositor_INTERFACE_DEFINED__ - - /* interface IDxtCompositor */ - /* [unique][helpstring][dual][uuid][object] */ - - - EXTERN_C const IID IID_IDxtCompositor; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("BB44391E-6ABD-422f-9E2E-385C9DFF51FC") - IDxtCompositor : public IDXEffect - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OffsetX( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_OffsetX( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OffsetY( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_OffsetY( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Width( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Width( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Height( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Height( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SrcOffsetX( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SrcOffsetX( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SrcOffsetY( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SrcOffsetY( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SrcWidth( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SrcWidth( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SrcHeight( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SrcHeight( - /* [in] */ long newVal) = 0; - - }; - - #else /* C style interface */ - - typedef struct IDxtCompositorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDxtCompositor * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDxtCompositor * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDxtCompositor * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDxtCompositor * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDxtCompositor * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDxtCompositor * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDxtCompositor * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Capabilities )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Progress )( - IDxtCompositor * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Progress )( - IDxtCompositor * This, - /* [in] */ float newVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StepResolution )( - IDxtCompositor * This, - /* [retval][out] */ float *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Duration )( - IDxtCompositor * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Duration )( - IDxtCompositor * This, - /* [in] */ float newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OffsetX )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OffsetX )( - IDxtCompositor * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OffsetY )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OffsetY )( - IDxtCompositor * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Width )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Width )( - IDxtCompositor * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Height )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Height )( - IDxtCompositor * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SrcOffsetX )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SrcOffsetX )( - IDxtCompositor * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SrcOffsetY )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SrcOffsetY )( - IDxtCompositor * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SrcWidth )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SrcWidth )( - IDxtCompositor * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SrcHeight )( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SrcHeight )( - IDxtCompositor * This, - /* [in] */ long newVal); - - END_INTERFACE - } IDxtCompositorVtbl; - - interface IDxtCompositor - { - CONST_VTBL struct IDxtCompositorVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IDxtCompositor_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IDxtCompositor_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IDxtCompositor_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IDxtCompositor_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IDxtCompositor_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IDxtCompositor_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IDxtCompositor_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IDxtCompositor_get_Capabilities(This,pVal) \ - (This)->lpVtbl -> get_Capabilities(This,pVal) - - #define IDxtCompositor_get_Progress(This,pVal) \ - (This)->lpVtbl -> get_Progress(This,pVal) - - #define IDxtCompositor_put_Progress(This,newVal) \ - (This)->lpVtbl -> put_Progress(This,newVal) - - #define IDxtCompositor_get_StepResolution(This,pVal) \ - (This)->lpVtbl -> get_StepResolution(This,pVal) - - #define IDxtCompositor_get_Duration(This,pVal) \ - (This)->lpVtbl -> get_Duration(This,pVal) - - #define IDxtCompositor_put_Duration(This,newVal) \ - (This)->lpVtbl -> put_Duration(This,newVal) - - - #define IDxtCompositor_get_OffsetX(This,pVal) \ - (This)->lpVtbl -> get_OffsetX(This,pVal) - - #define IDxtCompositor_put_OffsetX(This,newVal) \ - (This)->lpVtbl -> put_OffsetX(This,newVal) - - #define IDxtCompositor_get_OffsetY(This,pVal) \ - (This)->lpVtbl -> get_OffsetY(This,pVal) - - #define IDxtCompositor_put_OffsetY(This,newVal) \ - (This)->lpVtbl -> put_OffsetY(This,newVal) - - #define IDxtCompositor_get_Width(This,pVal) \ - (This)->lpVtbl -> get_Width(This,pVal) - - #define IDxtCompositor_put_Width(This,newVal) \ - (This)->lpVtbl -> put_Width(This,newVal) - - #define IDxtCompositor_get_Height(This,pVal) \ - (This)->lpVtbl -> get_Height(This,pVal) - - #define IDxtCompositor_put_Height(This,newVal) \ - (This)->lpVtbl -> put_Height(This,newVal) - - #define IDxtCompositor_get_SrcOffsetX(This,pVal) \ - (This)->lpVtbl -> get_SrcOffsetX(This,pVal) - - #define IDxtCompositor_put_SrcOffsetX(This,newVal) \ - (This)->lpVtbl -> put_SrcOffsetX(This,newVal) - - #define IDxtCompositor_get_SrcOffsetY(This,pVal) \ - (This)->lpVtbl -> get_SrcOffsetY(This,pVal) - - #define IDxtCompositor_put_SrcOffsetY(This,newVal) \ - (This)->lpVtbl -> put_SrcOffsetY(This,newVal) - - #define IDxtCompositor_get_SrcWidth(This,pVal) \ - (This)->lpVtbl -> get_SrcWidth(This,pVal) - - #define IDxtCompositor_put_SrcWidth(This,newVal) \ - (This)->lpVtbl -> put_SrcWidth(This,newVal) - - #define IDxtCompositor_get_SrcHeight(This,pVal) \ - (This)->lpVtbl -> get_SrcHeight(This,pVal) - - #define IDxtCompositor_put_SrcHeight(This,newVal) \ - (This)->lpVtbl -> put_SrcHeight(This,newVal) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_get_OffsetX_Proxy( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - - void __RPC_STUB IDxtCompositor_get_OffsetX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_put_OffsetX_Proxy( - IDxtCompositor * This, - /* [in] */ long newVal); - - - void __RPC_STUB IDxtCompositor_put_OffsetX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_get_OffsetY_Proxy( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - - void __RPC_STUB IDxtCompositor_get_OffsetY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_put_OffsetY_Proxy( - IDxtCompositor * This, - /* [in] */ long newVal); - - - void __RPC_STUB IDxtCompositor_put_OffsetY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_get_Width_Proxy( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - - void __RPC_STUB IDxtCompositor_get_Width_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_put_Width_Proxy( - IDxtCompositor * This, - /* [in] */ long newVal); - - - void __RPC_STUB IDxtCompositor_put_Width_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_get_Height_Proxy( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - - void __RPC_STUB IDxtCompositor_get_Height_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_put_Height_Proxy( - IDxtCompositor * This, - /* [in] */ long newVal); - - - void __RPC_STUB IDxtCompositor_put_Height_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_get_SrcOffsetX_Proxy( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - - void __RPC_STUB IDxtCompositor_get_SrcOffsetX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_put_SrcOffsetX_Proxy( - IDxtCompositor * This, - /* [in] */ long newVal); - - - void __RPC_STUB IDxtCompositor_put_SrcOffsetX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_get_SrcOffsetY_Proxy( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - - void __RPC_STUB IDxtCompositor_get_SrcOffsetY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_put_SrcOffsetY_Proxy( - IDxtCompositor * This, - /* [in] */ long newVal); - - - void __RPC_STUB IDxtCompositor_put_SrcOffsetY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_get_SrcWidth_Proxy( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - - void __RPC_STUB IDxtCompositor_get_SrcWidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_put_SrcWidth_Proxy( - IDxtCompositor * This, - /* [in] */ long newVal); - - - void __RPC_STUB IDxtCompositor_put_SrcWidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_get_SrcHeight_Proxy( - IDxtCompositor * This, - /* [retval][out] */ long *pVal); - - - void __RPC_STUB IDxtCompositor_get_SrcHeight_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtCompositor_put_SrcHeight_Proxy( - IDxtCompositor * This, - /* [in] */ long newVal); - - - void __RPC_STUB IDxtCompositor_put_SrcHeight_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IDxtCompositor_INTERFACE_DEFINED__ */ - - - #ifndef __IDxtAlphaSetter_INTERFACE_DEFINED__ - #define __IDxtAlphaSetter_INTERFACE_DEFINED__ - - /* interface IDxtAlphaSetter */ - /* [unique][helpstring][dual][uuid][object] */ - - - EXTERN_C const IID IID_IDxtAlphaSetter; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("4EE9EAD9-DA4D-43d0-9383-06B90C08B12B") - IDxtAlphaSetter : public IDXEffect - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Alpha( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Alpha( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_AlphaRamp( - /* [retval][out] */ double *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_AlphaRamp( - /* [in] */ double newVal) = 0; - - }; - - #else /* C style interface */ - - typedef struct IDxtAlphaSetterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDxtAlphaSetter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDxtAlphaSetter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDxtAlphaSetter * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDxtAlphaSetter * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDxtAlphaSetter * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDxtAlphaSetter * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDxtAlphaSetter * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Capabilities )( - IDxtAlphaSetter * This, - /* [retval][out] */ long *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Progress )( - IDxtAlphaSetter * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Progress )( - IDxtAlphaSetter * This, - /* [in] */ float newVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StepResolution )( - IDxtAlphaSetter * This, - /* [retval][out] */ float *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Duration )( - IDxtAlphaSetter * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Duration )( - IDxtAlphaSetter * This, - /* [in] */ float newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Alpha )( - IDxtAlphaSetter * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Alpha )( - IDxtAlphaSetter * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlphaRamp )( - IDxtAlphaSetter * This, - /* [retval][out] */ double *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlphaRamp )( - IDxtAlphaSetter * This, - /* [in] */ double newVal); - - END_INTERFACE - } IDxtAlphaSetterVtbl; - - interface IDxtAlphaSetter - { - CONST_VTBL struct IDxtAlphaSetterVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IDxtAlphaSetter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IDxtAlphaSetter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IDxtAlphaSetter_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IDxtAlphaSetter_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IDxtAlphaSetter_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IDxtAlphaSetter_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IDxtAlphaSetter_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IDxtAlphaSetter_get_Capabilities(This,pVal) \ - (This)->lpVtbl -> get_Capabilities(This,pVal) - - #define IDxtAlphaSetter_get_Progress(This,pVal) \ - (This)->lpVtbl -> get_Progress(This,pVal) - - #define IDxtAlphaSetter_put_Progress(This,newVal) \ - (This)->lpVtbl -> put_Progress(This,newVal) - - #define IDxtAlphaSetter_get_StepResolution(This,pVal) \ - (This)->lpVtbl -> get_StepResolution(This,pVal) - - #define IDxtAlphaSetter_get_Duration(This,pVal) \ - (This)->lpVtbl -> get_Duration(This,pVal) - - #define IDxtAlphaSetter_put_Duration(This,newVal) \ - (This)->lpVtbl -> put_Duration(This,newVal) - - - #define IDxtAlphaSetter_get_Alpha(This,pVal) \ - (This)->lpVtbl -> get_Alpha(This,pVal) - - #define IDxtAlphaSetter_put_Alpha(This,newVal) \ - (This)->lpVtbl -> put_Alpha(This,newVal) - - #define IDxtAlphaSetter_get_AlphaRamp(This,pVal) \ - (This)->lpVtbl -> get_AlphaRamp(This,pVal) - - #define IDxtAlphaSetter_put_AlphaRamp(This,newVal) \ - (This)->lpVtbl -> put_AlphaRamp(This,newVal) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtAlphaSetter_get_Alpha_Proxy( - IDxtAlphaSetter * This, - /* [retval][out] */ long *pVal); - - - void __RPC_STUB IDxtAlphaSetter_get_Alpha_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtAlphaSetter_put_Alpha_Proxy( - IDxtAlphaSetter * This, - /* [in] */ long newVal); - - - void __RPC_STUB IDxtAlphaSetter_put_Alpha_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtAlphaSetter_get_AlphaRamp_Proxy( - IDxtAlphaSetter * This, - /* [retval][out] */ double *pVal); - - - void __RPC_STUB IDxtAlphaSetter_get_AlphaRamp_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtAlphaSetter_put_AlphaRamp_Proxy( - IDxtAlphaSetter * This, - /* [in] */ double newVal); - - - void __RPC_STUB IDxtAlphaSetter_put_AlphaRamp_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IDxtAlphaSetter_INTERFACE_DEFINED__ */ - - - #ifndef __IDxtJpeg_INTERFACE_DEFINED__ - #define __IDxtJpeg_INTERFACE_DEFINED__ - - /* interface IDxtJpeg */ - /* [unique][helpstring][dual][uuid][object] */ - - - EXTERN_C const IID IID_IDxtJpeg; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("DE75D011-7A65-11D2-8CEA-00A0C9441E20") - IDxtJpeg : public IDXEffect - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MaskNum( - /* [retval][out] */ long *__MIDL_0018) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MaskNum( - /* [in] */ long __MIDL_0019) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MaskName( - /* [retval][out] */ BSTR *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MaskName( - /* [in] */ BSTR newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ScaleX( - /* [retval][out] */ double *__MIDL_0020) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ScaleX( - /* [in] */ double __MIDL_0021) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ScaleY( - /* [retval][out] */ double *__MIDL_0022) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ScaleY( - /* [in] */ double __MIDL_0023) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OffsetX( - /* [retval][out] */ long *__MIDL_0024) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_OffsetX( - /* [in] */ long __MIDL_0025) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OffsetY( - /* [retval][out] */ long *__MIDL_0026) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_OffsetY( - /* [in] */ long __MIDL_0027) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ReplicateX( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ReplicateX( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ReplicateY( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ReplicateY( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_BorderColor( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_BorderColor( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_BorderWidth( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_BorderWidth( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_BorderSoftness( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_BorderSoftness( - /* [in] */ long newVal) = 0; - - virtual HRESULT STDMETHODCALLTYPE ApplyChanges( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE LoadDefSettings( void) = 0; - - }; - - #else /* C style interface */ - - typedef struct IDxtJpegVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDxtJpeg * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDxtJpeg * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDxtJpeg * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDxtJpeg * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDxtJpeg * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDxtJpeg * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDxtJpeg * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Capabilities )( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Progress )( - IDxtJpeg * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Progress )( - IDxtJpeg * This, - /* [in] */ float newVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StepResolution )( - IDxtJpeg * This, - /* [retval][out] */ float *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Duration )( - IDxtJpeg * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Duration )( - IDxtJpeg * This, - /* [in] */ float newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaskNum )( - IDxtJpeg * This, - /* [retval][out] */ long *__MIDL_0018); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MaskNum )( - IDxtJpeg * This, - /* [in] */ long __MIDL_0019); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaskName )( - IDxtJpeg * This, - /* [retval][out] */ BSTR *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MaskName )( - IDxtJpeg * This, - /* [in] */ BSTR newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ScaleX )( - IDxtJpeg * This, - /* [retval][out] */ double *__MIDL_0020); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ScaleX )( - IDxtJpeg * This, - /* [in] */ double __MIDL_0021); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ScaleY )( - IDxtJpeg * This, - /* [retval][out] */ double *__MIDL_0022); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ScaleY )( - IDxtJpeg * This, - /* [in] */ double __MIDL_0023); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OffsetX )( - IDxtJpeg * This, - /* [retval][out] */ long *__MIDL_0024); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OffsetX )( - IDxtJpeg * This, - /* [in] */ long __MIDL_0025); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OffsetY )( - IDxtJpeg * This, - /* [retval][out] */ long *__MIDL_0026); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OffsetY )( - IDxtJpeg * This, - /* [in] */ long __MIDL_0027); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReplicateX )( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ReplicateX )( - IDxtJpeg * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReplicateY )( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ReplicateY )( - IDxtJpeg * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_BorderColor )( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_BorderColor )( - IDxtJpeg * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_BorderWidth )( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_BorderWidth )( - IDxtJpeg * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_BorderSoftness )( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_BorderSoftness )( - IDxtJpeg * This, - /* [in] */ long newVal); - - HRESULT ( STDMETHODCALLTYPE *ApplyChanges )( - IDxtJpeg * This); - - HRESULT ( STDMETHODCALLTYPE *LoadDefSettings )( - IDxtJpeg * This); - - END_INTERFACE - } IDxtJpegVtbl; - - interface IDxtJpeg - { - CONST_VTBL struct IDxtJpegVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IDxtJpeg_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IDxtJpeg_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IDxtJpeg_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IDxtJpeg_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IDxtJpeg_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IDxtJpeg_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IDxtJpeg_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IDxtJpeg_get_Capabilities(This,pVal) \ - (This)->lpVtbl -> get_Capabilities(This,pVal) - - #define IDxtJpeg_get_Progress(This,pVal) \ - (This)->lpVtbl -> get_Progress(This,pVal) - - #define IDxtJpeg_put_Progress(This,newVal) \ - (This)->lpVtbl -> put_Progress(This,newVal) - - #define IDxtJpeg_get_StepResolution(This,pVal) \ - (This)->lpVtbl -> get_StepResolution(This,pVal) - - #define IDxtJpeg_get_Duration(This,pVal) \ - (This)->lpVtbl -> get_Duration(This,pVal) - - #define IDxtJpeg_put_Duration(This,newVal) \ - (This)->lpVtbl -> put_Duration(This,newVal) - - - #define IDxtJpeg_get_MaskNum(This,__MIDL_0018) \ - (This)->lpVtbl -> get_MaskNum(This,__MIDL_0018) - - #define IDxtJpeg_put_MaskNum(This,__MIDL_0019) \ - (This)->lpVtbl -> put_MaskNum(This,__MIDL_0019) - - #define IDxtJpeg_get_MaskName(This,pVal) \ - (This)->lpVtbl -> get_MaskName(This,pVal) - - #define IDxtJpeg_put_MaskName(This,newVal) \ - (This)->lpVtbl -> put_MaskName(This,newVal) - - #define IDxtJpeg_get_ScaleX(This,__MIDL_0020) \ - (This)->lpVtbl -> get_ScaleX(This,__MIDL_0020) - - #define IDxtJpeg_put_ScaleX(This,__MIDL_0021) \ - (This)->lpVtbl -> put_ScaleX(This,__MIDL_0021) - - #define IDxtJpeg_get_ScaleY(This,__MIDL_0022) \ - (This)->lpVtbl -> get_ScaleY(This,__MIDL_0022) - - #define IDxtJpeg_put_ScaleY(This,__MIDL_0023) \ - (This)->lpVtbl -> put_ScaleY(This,__MIDL_0023) - - #define IDxtJpeg_get_OffsetX(This,__MIDL_0024) \ - (This)->lpVtbl -> get_OffsetX(This,__MIDL_0024) - - #define IDxtJpeg_put_OffsetX(This,__MIDL_0025) \ - (This)->lpVtbl -> put_OffsetX(This,__MIDL_0025) - - #define IDxtJpeg_get_OffsetY(This,__MIDL_0026) \ - (This)->lpVtbl -> get_OffsetY(This,__MIDL_0026) - - #define IDxtJpeg_put_OffsetY(This,__MIDL_0027) \ - (This)->lpVtbl -> put_OffsetY(This,__MIDL_0027) - - #define IDxtJpeg_get_ReplicateX(This,pVal) \ - (This)->lpVtbl -> get_ReplicateX(This,pVal) - - #define IDxtJpeg_put_ReplicateX(This,newVal) \ - (This)->lpVtbl -> put_ReplicateX(This,newVal) - - #define IDxtJpeg_get_ReplicateY(This,pVal) \ - (This)->lpVtbl -> get_ReplicateY(This,pVal) - - #define IDxtJpeg_put_ReplicateY(This,newVal) \ - (This)->lpVtbl -> put_ReplicateY(This,newVal) - - #define IDxtJpeg_get_BorderColor(This,pVal) \ - (This)->lpVtbl -> get_BorderColor(This,pVal) - - #define IDxtJpeg_put_BorderColor(This,newVal) \ - (This)->lpVtbl -> put_BorderColor(This,newVal) - - #define IDxtJpeg_get_BorderWidth(This,pVal) \ - (This)->lpVtbl -> get_BorderWidth(This,pVal) - - #define IDxtJpeg_put_BorderWidth(This,newVal) \ - (This)->lpVtbl -> put_BorderWidth(This,newVal) - - #define IDxtJpeg_get_BorderSoftness(This,pVal) \ - (This)->lpVtbl -> get_BorderSoftness(This,pVal) - - #define IDxtJpeg_put_BorderSoftness(This,newVal) \ - (This)->lpVtbl -> put_BorderSoftness(This,newVal) - - #define IDxtJpeg_ApplyChanges(This) \ - (This)->lpVtbl -> ApplyChanges(This) - - #define IDxtJpeg_LoadDefSettings(This) \ - (This)->lpVtbl -> LoadDefSettings(This) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_MaskNum_Proxy( - IDxtJpeg * This, - /* [retval][out] */ long *__MIDL_0018); - - - void __RPC_STUB IDxtJpeg_get_MaskNum_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_MaskNum_Proxy( - IDxtJpeg * This, - /* [in] */ long __MIDL_0019); - - - void __RPC_STUB IDxtJpeg_put_MaskNum_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_MaskName_Proxy( - IDxtJpeg * This, - /* [retval][out] */ BSTR *pVal); - - - void __RPC_STUB IDxtJpeg_get_MaskName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_MaskName_Proxy( - IDxtJpeg * This, - /* [in] */ BSTR newVal); - - - void __RPC_STUB IDxtJpeg_put_MaskName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_ScaleX_Proxy( - IDxtJpeg * This, - /* [retval][out] */ double *__MIDL_0020); - - - void __RPC_STUB IDxtJpeg_get_ScaleX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_ScaleX_Proxy( - IDxtJpeg * This, - /* [in] */ double __MIDL_0021); - - - void __RPC_STUB IDxtJpeg_put_ScaleX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_ScaleY_Proxy( - IDxtJpeg * This, - /* [retval][out] */ double *__MIDL_0022); - - - void __RPC_STUB IDxtJpeg_get_ScaleY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_ScaleY_Proxy( - IDxtJpeg * This, - /* [in] */ double __MIDL_0023); - - - void __RPC_STUB IDxtJpeg_put_ScaleY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_OffsetX_Proxy( - IDxtJpeg * This, - /* [retval][out] */ long *__MIDL_0024); - - - void __RPC_STUB IDxtJpeg_get_OffsetX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_OffsetX_Proxy( - IDxtJpeg * This, - /* [in] */ long __MIDL_0025); - - - void __RPC_STUB IDxtJpeg_put_OffsetX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_OffsetY_Proxy( - IDxtJpeg * This, - /* [retval][out] */ long *__MIDL_0026); - - - void __RPC_STUB IDxtJpeg_get_OffsetY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_OffsetY_Proxy( - IDxtJpeg * This, - /* [in] */ long __MIDL_0027); - - - void __RPC_STUB IDxtJpeg_put_OffsetY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_ReplicateX_Proxy( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - - void __RPC_STUB IDxtJpeg_get_ReplicateX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_ReplicateX_Proxy( - IDxtJpeg * This, - /* [in] */ long newVal); - - - void __RPC_STUB IDxtJpeg_put_ReplicateX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_ReplicateY_Proxy( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - - void __RPC_STUB IDxtJpeg_get_ReplicateY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_ReplicateY_Proxy( - IDxtJpeg * This, - /* [in] */ long newVal); - - - void __RPC_STUB IDxtJpeg_put_ReplicateY_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_BorderColor_Proxy( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - - void __RPC_STUB IDxtJpeg_get_BorderColor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_BorderColor_Proxy( - IDxtJpeg * This, - /* [in] */ long newVal); - - - void __RPC_STUB IDxtJpeg_put_BorderColor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_BorderWidth_Proxy( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - - void __RPC_STUB IDxtJpeg_get_BorderWidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_BorderWidth_Proxy( - IDxtJpeg * This, - /* [in] */ long newVal); - - - void __RPC_STUB IDxtJpeg_put_BorderWidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_get_BorderSoftness_Proxy( - IDxtJpeg * This, - /* [retval][out] */ long *pVal); - - - void __RPC_STUB IDxtJpeg_get_BorderSoftness_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtJpeg_put_BorderSoftness_Proxy( - IDxtJpeg * This, - /* [in] */ long newVal); - - - void __RPC_STUB IDxtJpeg_put_BorderSoftness_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IDxtJpeg_ApplyChanges_Proxy( - IDxtJpeg * This); - - - void __RPC_STUB IDxtJpeg_ApplyChanges_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IDxtJpeg_LoadDefSettings_Proxy( - IDxtJpeg * This); - - - void __RPC_STUB IDxtJpeg_LoadDefSettings_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IDxtJpeg_INTERFACE_DEFINED__ */ - - - #ifndef __IDxtKey_INTERFACE_DEFINED__ - #define __IDxtKey_INTERFACE_DEFINED__ - - /* interface IDxtKey */ - /* [unique][helpstring][dual][uuid][object] */ - - - EXTERN_C const IID IID_IDxtKey; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("3255de56-38fb-4901-b980-94b438010d7b") - IDxtKey : public IDXEffect - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_KeyType( - /* [retval][out] */ int *__MIDL_0028) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_KeyType( - /* [in] */ int __MIDL_0029) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Hue( - /* [retval][out] */ int *__MIDL_0030) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Hue( - /* [in] */ int __MIDL_0031) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Luminance( - /* [retval][out] */ int *__MIDL_0032) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Luminance( - /* [in] */ int __MIDL_0033) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_RGB( - /* [retval][out] */ DWORD *__MIDL_0034) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_RGB( - /* [in] */ DWORD __MIDL_0035) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Similarity( - /* [retval][out] */ int *__MIDL_0036) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Similarity( - /* [in] */ int __MIDL_0037) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Invert( - /* [retval][out] */ BOOL *__MIDL_0038) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Invert( - /* [in] */ BOOL __MIDL_0039) = 0; - - }; - - #else /* C style interface */ - - typedef struct IDxtKeyVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDxtKey * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDxtKey * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDxtKey * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDxtKey * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDxtKey * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDxtKey * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDxtKey * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Capabilities )( - IDxtKey * This, - /* [retval][out] */ long *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Progress )( - IDxtKey * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Progress )( - IDxtKey * This, - /* [in] */ float newVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StepResolution )( - IDxtKey * This, - /* [retval][out] */ float *pVal); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Duration )( - IDxtKey * This, - /* [retval][out] */ float *pVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Duration )( - IDxtKey * This, - /* [in] */ float newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyType )( - IDxtKey * This, - /* [retval][out] */ int *__MIDL_0028); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyType )( - IDxtKey * This, - /* [in] */ int __MIDL_0029); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Hue )( - IDxtKey * This, - /* [retval][out] */ int *__MIDL_0030); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Hue )( - IDxtKey * This, - /* [in] */ int __MIDL_0031); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Luminance )( - IDxtKey * This, - /* [retval][out] */ int *__MIDL_0032); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Luminance )( - IDxtKey * This, - /* [in] */ int __MIDL_0033); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RGB )( - IDxtKey * This, - /* [retval][out] */ DWORD *__MIDL_0034); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_RGB )( - IDxtKey * This, - /* [in] */ DWORD __MIDL_0035); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Similarity )( - IDxtKey * This, - /* [retval][out] */ int *__MIDL_0036); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Similarity )( - IDxtKey * This, - /* [in] */ int __MIDL_0037); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Invert )( - IDxtKey * This, - /* [retval][out] */ BOOL *__MIDL_0038); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Invert )( - IDxtKey * This, - /* [in] */ BOOL __MIDL_0039); - - END_INTERFACE - } IDxtKeyVtbl; - - interface IDxtKey - { - CONST_VTBL struct IDxtKeyVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IDxtKey_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IDxtKey_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IDxtKey_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IDxtKey_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IDxtKey_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IDxtKey_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IDxtKey_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IDxtKey_get_Capabilities(This,pVal) \ - (This)->lpVtbl -> get_Capabilities(This,pVal) - - #define IDxtKey_get_Progress(This,pVal) \ - (This)->lpVtbl -> get_Progress(This,pVal) - - #define IDxtKey_put_Progress(This,newVal) \ - (This)->lpVtbl -> put_Progress(This,newVal) - - #define IDxtKey_get_StepResolution(This,pVal) \ - (This)->lpVtbl -> get_StepResolution(This,pVal) - - #define IDxtKey_get_Duration(This,pVal) \ - (This)->lpVtbl -> get_Duration(This,pVal) - - #define IDxtKey_put_Duration(This,newVal) \ - (This)->lpVtbl -> put_Duration(This,newVal) - - - #define IDxtKey_get_KeyType(This,__MIDL_0028) \ - (This)->lpVtbl -> get_KeyType(This,__MIDL_0028) - - #define IDxtKey_put_KeyType(This,__MIDL_0029) \ - (This)->lpVtbl -> put_KeyType(This,__MIDL_0029) - - #define IDxtKey_get_Hue(This,__MIDL_0030) \ - (This)->lpVtbl -> get_Hue(This,__MIDL_0030) - - #define IDxtKey_put_Hue(This,__MIDL_0031) \ - (This)->lpVtbl -> put_Hue(This,__MIDL_0031) - - #define IDxtKey_get_Luminance(This,__MIDL_0032) \ - (This)->lpVtbl -> get_Luminance(This,__MIDL_0032) - - #define IDxtKey_put_Luminance(This,__MIDL_0033) \ - (This)->lpVtbl -> put_Luminance(This,__MIDL_0033) - - #define IDxtKey_get_RGB(This,__MIDL_0034) \ - (This)->lpVtbl -> get_RGB(This,__MIDL_0034) - - #define IDxtKey_put_RGB(This,__MIDL_0035) \ - (This)->lpVtbl -> put_RGB(This,__MIDL_0035) - - #define IDxtKey_get_Similarity(This,__MIDL_0036) \ - (This)->lpVtbl -> get_Similarity(This,__MIDL_0036) - - #define IDxtKey_put_Similarity(This,__MIDL_0037) \ - (This)->lpVtbl -> put_Similarity(This,__MIDL_0037) - - #define IDxtKey_get_Invert(This,__MIDL_0038) \ - (This)->lpVtbl -> get_Invert(This,__MIDL_0038) - - #define IDxtKey_put_Invert(This,__MIDL_0039) \ - (This)->lpVtbl -> put_Invert(This,__MIDL_0039) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtKey_get_KeyType_Proxy( - IDxtKey * This, - /* [retval][out] */ int *__MIDL_0028); - - - void __RPC_STUB IDxtKey_get_KeyType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtKey_put_KeyType_Proxy( - IDxtKey * This, - /* [in] */ int __MIDL_0029); - - - void __RPC_STUB IDxtKey_put_KeyType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtKey_get_Hue_Proxy( - IDxtKey * This, - /* [retval][out] */ int *__MIDL_0030); - - - void __RPC_STUB IDxtKey_get_Hue_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtKey_put_Hue_Proxy( - IDxtKey * This, - /* [in] */ int __MIDL_0031); - - - void __RPC_STUB IDxtKey_put_Hue_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtKey_get_Luminance_Proxy( - IDxtKey * This, - /* [retval][out] */ int *__MIDL_0032); - - - void __RPC_STUB IDxtKey_get_Luminance_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtKey_put_Luminance_Proxy( - IDxtKey * This, - /* [in] */ int __MIDL_0033); - - - void __RPC_STUB IDxtKey_put_Luminance_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtKey_get_RGB_Proxy( - IDxtKey * This, - /* [retval][out] */ DWORD *__MIDL_0034); - - - void __RPC_STUB IDxtKey_get_RGB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtKey_put_RGB_Proxy( - IDxtKey * This, - /* [in] */ DWORD __MIDL_0035); - - - void __RPC_STUB IDxtKey_put_RGB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtKey_get_Similarity_Proxy( - IDxtKey * This, - /* [retval][out] */ int *__MIDL_0036); - - - void __RPC_STUB IDxtKey_get_Similarity_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtKey_put_Similarity_Proxy( - IDxtKey * This, - /* [in] */ int __MIDL_0037); - - - void __RPC_STUB IDxtKey_put_Similarity_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDxtKey_get_Invert_Proxy( - IDxtKey * This, - /* [retval][out] */ BOOL *__MIDL_0038); - - - void __RPC_STUB IDxtKey_get_Invert_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDxtKey_put_Invert_Proxy( - IDxtKey * This, - /* [in] */ BOOL __MIDL_0039); - - - void __RPC_STUB IDxtKey_put_Invert_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IDxtKey_INTERFACE_DEFINED__ */ - - - #ifndef __IMediaLocator_INTERFACE_DEFINED__ - #define __IMediaLocator_INTERFACE_DEFINED__ - - /* interface IMediaLocator */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IMediaLocator; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("288581E0-66CE-11d2-918F-00C0DF10D434") - IMediaLocator : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE FindMediaFile( - BSTR Input, - BSTR FilterString, - BSTR *pOutput, - long Flags) = 0; - - virtual HRESULT STDMETHODCALLTYPE AddFoundLocation( - BSTR DirectoryName) = 0; - - }; - - #else /* C style interface */ - - typedef struct IMediaLocatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaLocator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaLocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaLocator * This); - - HRESULT ( STDMETHODCALLTYPE *FindMediaFile )( - IMediaLocator * This, - BSTR Input, - BSTR FilterString, - BSTR *pOutput, - long Flags); - - HRESULT ( STDMETHODCALLTYPE *AddFoundLocation )( - IMediaLocator * This, - BSTR DirectoryName); - - END_INTERFACE - } IMediaLocatorVtbl; - - interface IMediaLocator - { - CONST_VTBL struct IMediaLocatorVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IMediaLocator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IMediaLocator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IMediaLocator_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IMediaLocator_FindMediaFile(This,Input,FilterString,pOutput,Flags) \ - (This)->lpVtbl -> FindMediaFile(This,Input,FilterString,pOutput,Flags) - - #define IMediaLocator_AddFoundLocation(This,DirectoryName) \ - (This)->lpVtbl -> AddFoundLocation(This,DirectoryName) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - HRESULT STDMETHODCALLTYPE IMediaLocator_FindMediaFile_Proxy( - IMediaLocator * This, - BSTR Input, - BSTR FilterString, - BSTR *pOutput, - long Flags); - - - void __RPC_STUB IMediaLocator_FindMediaFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IMediaLocator_AddFoundLocation_Proxy( - IMediaLocator * This, - BSTR DirectoryName); - - - void __RPC_STUB IMediaLocator_AddFoundLocation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IMediaLocator_INTERFACE_DEFINED__ */ - - - #ifndef __IMediaDet_INTERFACE_DEFINED__ - #define __IMediaDet_INTERFACE_DEFINED__ - - /* interface IMediaDet */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IMediaDet; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("65BD0710-24D2-4ff7-9324-ED2E5D3ABAFA") - IMediaDet : public IUnknown - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Filter( - /* [retval][out] */ IUnknown **pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Filter( - /* [in] */ IUnknown *newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OutputStreams( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CurrentStream( - /* [retval][out] */ long *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_CurrentStream( - /* [in] */ long newVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_StreamType( - /* [retval][out] */ GUID *pVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_StreamTypeB( - /* [retval][out] */ BSTR *pVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_StreamLength( - /* [retval][out] */ double *pVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Filename( - /* [retval][out] */ BSTR *pVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Filename( - /* [in] */ BSTR newVal) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetBitmapBits( - double StreamTime, - long *pBufferSize, - char *pBuffer, - long Width, - long Height) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE WriteBitmapBits( - double StreamTime, - long Width, - long Height, - BSTR Filename) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_StreamMediaType( - /* [retval][out] */ AM_MEDIA_TYPE *pVal) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetSampleGrabber( - /* [out] */ ISampleGrabber **ppVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_FrameRate( - /* [retval][out] */ double *pVal) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE EnterBitmapGrabMode( - double SeekTime) = 0; - - }; - - #else /* C style interface */ - - typedef struct IMediaDetVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaDet * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaDet * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaDet * This); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Filter )( - IMediaDet * This, - /* [retval][out] */ IUnknown **pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Filter )( - IMediaDet * This, - /* [in] */ IUnknown *newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OutputStreams )( - IMediaDet * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CurrentStream )( - IMediaDet * This, - /* [retval][out] */ long *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CurrentStream )( - IMediaDet * This, - /* [in] */ long newVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StreamType )( - IMediaDet * This, - /* [retval][out] */ GUID *pVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StreamTypeB )( - IMediaDet * This, - /* [retval][out] */ BSTR *pVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StreamLength )( - IMediaDet * This, - /* [retval][out] */ double *pVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Filename )( - IMediaDet * This, - /* [retval][out] */ BSTR *pVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Filename )( - IMediaDet * This, - /* [in] */ BSTR newVal); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetBitmapBits )( - IMediaDet * This, - double StreamTime, - long *pBufferSize, - char *pBuffer, - long Width, - long Height); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *WriteBitmapBits )( - IMediaDet * This, - double StreamTime, - long Width, - long Height, - BSTR Filename); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StreamMediaType )( - IMediaDet * This, - /* [retval][out] */ AM_MEDIA_TYPE *pVal); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetSampleGrabber )( - IMediaDet * This, - /* [out] */ ISampleGrabber **ppVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FrameRate )( - IMediaDet * This, - /* [retval][out] */ double *pVal); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *EnterBitmapGrabMode )( - IMediaDet * This, - double SeekTime); - - END_INTERFACE - } IMediaDetVtbl; - - interface IMediaDet - { - CONST_VTBL struct IMediaDetVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IMediaDet_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IMediaDet_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IMediaDet_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IMediaDet_get_Filter(This,pVal) \ - (This)->lpVtbl -> get_Filter(This,pVal) - - #define IMediaDet_put_Filter(This,newVal) \ - (This)->lpVtbl -> put_Filter(This,newVal) - - #define IMediaDet_get_OutputStreams(This,pVal) \ - (This)->lpVtbl -> get_OutputStreams(This,pVal) - - #define IMediaDet_get_CurrentStream(This,pVal) \ - (This)->lpVtbl -> get_CurrentStream(This,pVal) - - #define IMediaDet_put_CurrentStream(This,newVal) \ - (This)->lpVtbl -> put_CurrentStream(This,newVal) - - #define IMediaDet_get_StreamType(This,pVal) \ - (This)->lpVtbl -> get_StreamType(This,pVal) - - #define IMediaDet_get_StreamTypeB(This,pVal) \ - (This)->lpVtbl -> get_StreamTypeB(This,pVal) - - #define IMediaDet_get_StreamLength(This,pVal) \ - (This)->lpVtbl -> get_StreamLength(This,pVal) - - #define IMediaDet_get_Filename(This,pVal) \ - (This)->lpVtbl -> get_Filename(This,pVal) - - #define IMediaDet_put_Filename(This,newVal) \ - (This)->lpVtbl -> put_Filename(This,newVal) - - #define IMediaDet_GetBitmapBits(This,StreamTime,pBufferSize,pBuffer,Width,Height) \ - (This)->lpVtbl -> GetBitmapBits(This,StreamTime,pBufferSize,pBuffer,Width,Height) - - #define IMediaDet_WriteBitmapBits(This,StreamTime,Width,Height,Filename) \ - (This)->lpVtbl -> WriteBitmapBits(This,StreamTime,Width,Height,Filename) - - #define IMediaDet_get_StreamMediaType(This,pVal) \ - (This)->lpVtbl -> get_StreamMediaType(This,pVal) - - #define IMediaDet_GetSampleGrabber(This,ppVal) \ - (This)->lpVtbl -> GetSampleGrabber(This,ppVal) - - #define IMediaDet_get_FrameRate(This,pVal) \ - (This)->lpVtbl -> get_FrameRate(This,pVal) - - #define IMediaDet_EnterBitmapGrabMode(This,SeekTime) \ - (This)->lpVtbl -> EnterBitmapGrabMode(This,SeekTime) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_Filter_Proxy( - IMediaDet * This, - /* [retval][out] */ IUnknown **pVal); - - - void __RPC_STUB IMediaDet_get_Filter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IMediaDet_put_Filter_Proxy( - IMediaDet * This, - /* [in] */ IUnknown *newVal); - - - void __RPC_STUB IMediaDet_put_Filter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_OutputStreams_Proxy( - IMediaDet * This, - /* [retval][out] */ long *pVal); - - - void __RPC_STUB IMediaDet_get_OutputStreams_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_CurrentStream_Proxy( - IMediaDet * This, - /* [retval][out] */ long *pVal); - - - void __RPC_STUB IMediaDet_get_CurrentStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IMediaDet_put_CurrentStream_Proxy( - IMediaDet * This, - /* [in] */ long newVal); - - - void __RPC_STUB IMediaDet_put_CurrentStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_StreamType_Proxy( - IMediaDet * This, - /* [retval][out] */ GUID *pVal); - - - void __RPC_STUB IMediaDet_get_StreamType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_StreamTypeB_Proxy( - IMediaDet * This, - /* [retval][out] */ BSTR *pVal); - - - void __RPC_STUB IMediaDet_get_StreamTypeB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_StreamLength_Proxy( - IMediaDet * This, - /* [retval][out] */ double *pVal); - - - void __RPC_STUB IMediaDet_get_StreamLength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_Filename_Proxy( - IMediaDet * This, - /* [retval][out] */ BSTR *pVal); - - - void __RPC_STUB IMediaDet_get_Filename_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IMediaDet_put_Filename_Proxy( - IMediaDet * This, - /* [in] */ BSTR newVal); - - - void __RPC_STUB IMediaDet_put_Filename_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMediaDet_GetBitmapBits_Proxy( - IMediaDet * This, - double StreamTime, - long *pBufferSize, - char *pBuffer, - long Width, - long Height); - - - void __RPC_STUB IMediaDet_GetBitmapBits_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMediaDet_WriteBitmapBits_Proxy( - IMediaDet * This, - double StreamTime, - long Width, - long Height, - BSTR Filename); - - - void __RPC_STUB IMediaDet_WriteBitmapBits_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_StreamMediaType_Proxy( - IMediaDet * This, - /* [retval][out] */ AM_MEDIA_TYPE *pVal); - - - void __RPC_STUB IMediaDet_get_StreamMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMediaDet_GetSampleGrabber_Proxy( - IMediaDet * This, - /* [out] */ ISampleGrabber **ppVal); - - - void __RPC_STUB IMediaDet_GetSampleGrabber_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMediaDet_get_FrameRate_Proxy( - IMediaDet * This, - /* [retval][out] */ double *pVal); - - - void __RPC_STUB IMediaDet_get_FrameRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMediaDet_EnterBitmapGrabMode_Proxy( - IMediaDet * This, - double SeekTime); - - - void __RPC_STUB IMediaDet_EnterBitmapGrabMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IMediaDet_INTERFACE_DEFINED__ */ - - - #ifndef __IGrfCache_INTERFACE_DEFINED__ - #define __IGrfCache_INTERFACE_DEFINED__ - - /* interface IGrfCache */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IGrfCache; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("AE9472BE-B0C3-11D2-8D24-00A0C9441E20") - IGrfCache : public IDispatch - { - public: - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE AddFilter( - IGrfCache *ChainedCache, - LONGLONG ID, - const IBaseFilter *pFilter, - LPCWSTR pName) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ConnectPins( - IGrfCache *ChainedCache, - LONGLONG PinID1, - const IPin *pPin1, - LONGLONG PinID2, - const IPin *pPin2) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetGraph( - const IGraphBuilder *pGraph) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE DoConnectionsNow( void) = 0; - - }; - - #else /* C style interface */ - - typedef struct IGrfCacheVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IGrfCache * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IGrfCache * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IGrfCache * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IGrfCache * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IGrfCache * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IGrfCache * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IGrfCache * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *AddFilter )( - IGrfCache * This, - IGrfCache *ChainedCache, - LONGLONG ID, - const IBaseFilter *pFilter, - LPCWSTR pName); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *ConnectPins )( - IGrfCache * This, - IGrfCache *ChainedCache, - LONGLONG PinID1, - const IPin *pPin1, - LONGLONG PinID2, - const IPin *pPin2); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetGraph )( - IGrfCache * This, - const IGraphBuilder *pGraph); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *DoConnectionsNow )( - IGrfCache * This); - - END_INTERFACE - } IGrfCacheVtbl; - - interface IGrfCache - { - CONST_VTBL struct IGrfCacheVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IGrfCache_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IGrfCache_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IGrfCache_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IGrfCache_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IGrfCache_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IGrfCache_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IGrfCache_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IGrfCache_AddFilter(This,ChainedCache,ID,pFilter,pName) \ - (This)->lpVtbl -> AddFilter(This,ChainedCache,ID,pFilter,pName) - - #define IGrfCache_ConnectPins(This,ChainedCache,PinID1,pPin1,PinID2,pPin2) \ - (This)->lpVtbl -> ConnectPins(This,ChainedCache,PinID1,pPin1,PinID2,pPin2) - - #define IGrfCache_SetGraph(This,pGraph) \ - (This)->lpVtbl -> SetGraph(This,pGraph) - - #define IGrfCache_DoConnectionsNow(This) \ - (This)->lpVtbl -> DoConnectionsNow(This) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IGrfCache_AddFilter_Proxy( - IGrfCache * This, - IGrfCache *ChainedCache, - LONGLONG ID, - const IBaseFilter *pFilter, - LPCWSTR pName); - - - void __RPC_STUB IGrfCache_AddFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IGrfCache_ConnectPins_Proxy( - IGrfCache * This, - IGrfCache *ChainedCache, - LONGLONG PinID1, - const IPin *pPin1, - LONGLONG PinID2, - const IPin *pPin2); - - - void __RPC_STUB IGrfCache_ConnectPins_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IGrfCache_SetGraph_Proxy( - IGrfCache * This, - const IGraphBuilder *pGraph); - - - void __RPC_STUB IGrfCache_SetGraph_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IGrfCache_DoConnectionsNow_Proxy( - IGrfCache * This); - - - void __RPC_STUB IGrfCache_DoConnectionsNow_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IGrfCache_INTERFACE_DEFINED__ */ - - - #ifndef __IRenderEngine_INTERFACE_DEFINED__ - #define __IRenderEngine_INTERFACE_DEFINED__ - - /* interface IRenderEngine */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IRenderEngine; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("6BEE3A81-66C9-11d2-918F-00C0DF10D434") - IRenderEngine : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetTimelineObject( - IAMTimeline *pTimeline) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimelineObject( - /* [out] */ IAMTimeline **ppTimeline) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFilterGraph( - /* [out] */ IGraphBuilder **ppFG) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFilterGraph( - IGraphBuilder *pFG) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetInterestRange( - REFERENCE_TIME Start, - REFERENCE_TIME Stop) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetInterestRange2( - double Start, - double Stop) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetRenderRange( - REFERENCE_TIME Start, - REFERENCE_TIME Stop) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetRenderRange2( - double Start, - double Stop) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetGroupOutputPin( - long Group, - /* [out] */ IPin **ppRenderPin) = 0; - - virtual HRESULT STDMETHODCALLTYPE ScrapIt( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE RenderOutputPins( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetVendorString( - /* [retval][out] */ BSTR *pVendorID) = 0; - - virtual HRESULT STDMETHODCALLTYPE ConnectFrontEnd( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetSourceConnectCallback( - IGrfCache *pCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDynamicReconnectLevel( - long Level) = 0; - - virtual HRESULT STDMETHODCALLTYPE DoSmartRecompression( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE UseInSmartRecompressionGraph( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetSourceNameValidation( - BSTR FilterString, - IMediaLocator *pOverride, - LONG Flags) = 0; - - virtual HRESULT STDMETHODCALLTYPE Commit( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Decommit( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCaps( - long Index, - long *pReturn) = 0; - - }; - - #else /* C style interface */ - - typedef struct IRenderEngineVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IRenderEngine * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IRenderEngine * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *SetTimelineObject )( - IRenderEngine * This, - IAMTimeline *pTimeline); - - HRESULT ( STDMETHODCALLTYPE *GetTimelineObject )( - IRenderEngine * This, - /* [out] */ IAMTimeline **ppTimeline); - - HRESULT ( STDMETHODCALLTYPE *GetFilterGraph )( - IRenderEngine * This, - /* [out] */ IGraphBuilder **ppFG); - - HRESULT ( STDMETHODCALLTYPE *SetFilterGraph )( - IRenderEngine * This, - IGraphBuilder *pFG); - - HRESULT ( STDMETHODCALLTYPE *SetInterestRange )( - IRenderEngine * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - HRESULT ( STDMETHODCALLTYPE *SetInterestRange2 )( - IRenderEngine * This, - double Start, - double Stop); - - HRESULT ( STDMETHODCALLTYPE *SetRenderRange )( - IRenderEngine * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - HRESULT ( STDMETHODCALLTYPE *SetRenderRange2 )( - IRenderEngine * This, - double Start, - double Stop); - - HRESULT ( STDMETHODCALLTYPE *GetGroupOutputPin )( - IRenderEngine * This, - long Group, - /* [out] */ IPin **ppRenderPin); - - HRESULT ( STDMETHODCALLTYPE *ScrapIt )( - IRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *RenderOutputPins )( - IRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *GetVendorString )( - IRenderEngine * This, - /* [retval][out] */ BSTR *pVendorID); - - HRESULT ( STDMETHODCALLTYPE *ConnectFrontEnd )( - IRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *SetSourceConnectCallback )( - IRenderEngine * This, - IGrfCache *pCallback); - - HRESULT ( STDMETHODCALLTYPE *SetDynamicReconnectLevel )( - IRenderEngine * This, - long Level); - - HRESULT ( STDMETHODCALLTYPE *DoSmartRecompression )( - IRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *UseInSmartRecompressionGraph )( - IRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *SetSourceNameValidation )( - IRenderEngine * This, - BSTR FilterString, - IMediaLocator *pOverride, - LONG Flags); - - HRESULT ( STDMETHODCALLTYPE *Commit )( - IRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *Decommit )( - IRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *GetCaps )( - IRenderEngine * This, - long Index, - long *pReturn); - - END_INTERFACE - } IRenderEngineVtbl; - - interface IRenderEngine - { - CONST_VTBL struct IRenderEngineVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IRenderEngine_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IRenderEngine_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IRenderEngine_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IRenderEngine_SetTimelineObject(This,pTimeline) \ - (This)->lpVtbl -> SetTimelineObject(This,pTimeline) - - #define IRenderEngine_GetTimelineObject(This,ppTimeline) \ - (This)->lpVtbl -> GetTimelineObject(This,ppTimeline) - - #define IRenderEngine_GetFilterGraph(This,ppFG) \ - (This)->lpVtbl -> GetFilterGraph(This,ppFG) - - #define IRenderEngine_SetFilterGraph(This,pFG) \ - (This)->lpVtbl -> SetFilterGraph(This,pFG) - - #define IRenderEngine_SetInterestRange(This,Start,Stop) \ - (This)->lpVtbl -> SetInterestRange(This,Start,Stop) - - #define IRenderEngine_SetInterestRange2(This,Start,Stop) \ - (This)->lpVtbl -> SetInterestRange2(This,Start,Stop) - - #define IRenderEngine_SetRenderRange(This,Start,Stop) \ - (This)->lpVtbl -> SetRenderRange(This,Start,Stop) - - #define IRenderEngine_SetRenderRange2(This,Start,Stop) \ - (This)->lpVtbl -> SetRenderRange2(This,Start,Stop) - - #define IRenderEngine_GetGroupOutputPin(This,Group,ppRenderPin) \ - (This)->lpVtbl -> GetGroupOutputPin(This,Group,ppRenderPin) - - #define IRenderEngine_ScrapIt(This) \ - (This)->lpVtbl -> ScrapIt(This) - - #define IRenderEngine_RenderOutputPins(This) \ - (This)->lpVtbl -> RenderOutputPins(This) - - #define IRenderEngine_GetVendorString(This,pVendorID) \ - (This)->lpVtbl -> GetVendorString(This,pVendorID) - - #define IRenderEngine_ConnectFrontEnd(This) \ - (This)->lpVtbl -> ConnectFrontEnd(This) - - #define IRenderEngine_SetSourceConnectCallback(This,pCallback) \ - (This)->lpVtbl -> SetSourceConnectCallback(This,pCallback) - - #define IRenderEngine_SetDynamicReconnectLevel(This,Level) \ - (This)->lpVtbl -> SetDynamicReconnectLevel(This,Level) - - #define IRenderEngine_DoSmartRecompression(This) \ - (This)->lpVtbl -> DoSmartRecompression(This) - - #define IRenderEngine_UseInSmartRecompressionGraph(This) \ - (This)->lpVtbl -> UseInSmartRecompressionGraph(This) - - #define IRenderEngine_SetSourceNameValidation(This,FilterString,pOverride,Flags) \ - (This)->lpVtbl -> SetSourceNameValidation(This,FilterString,pOverride,Flags) - - #define IRenderEngine_Commit(This) \ - (This)->lpVtbl -> Commit(This) - - #define IRenderEngine_Decommit(This) \ - (This)->lpVtbl -> Decommit(This) - - #define IRenderEngine_GetCaps(This,Index,pReturn) \ - (This)->lpVtbl -> GetCaps(This,Index,pReturn) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - HRESULT STDMETHODCALLTYPE IRenderEngine_SetTimelineObject_Proxy( - IRenderEngine * This, - IAMTimeline *pTimeline); - - - void __RPC_STUB IRenderEngine_SetTimelineObject_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_GetTimelineObject_Proxy( - IRenderEngine * This, - /* [out] */ IAMTimeline **ppTimeline); - - - void __RPC_STUB IRenderEngine_GetTimelineObject_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_GetFilterGraph_Proxy( - IRenderEngine * This, - /* [out] */ IGraphBuilder **ppFG); - - - void __RPC_STUB IRenderEngine_GetFilterGraph_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_SetFilterGraph_Proxy( - IRenderEngine * This, - IGraphBuilder *pFG); - - - void __RPC_STUB IRenderEngine_SetFilterGraph_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_SetInterestRange_Proxy( - IRenderEngine * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - - void __RPC_STUB IRenderEngine_SetInterestRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_SetInterestRange2_Proxy( - IRenderEngine * This, - double Start, - double Stop); - - - void __RPC_STUB IRenderEngine_SetInterestRange2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_SetRenderRange_Proxy( - IRenderEngine * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - - void __RPC_STUB IRenderEngine_SetRenderRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_SetRenderRange2_Proxy( - IRenderEngine * This, - double Start, - double Stop); - - - void __RPC_STUB IRenderEngine_SetRenderRange2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_GetGroupOutputPin_Proxy( - IRenderEngine * This, - long Group, - /* [out] */ IPin **ppRenderPin); - - - void __RPC_STUB IRenderEngine_GetGroupOutputPin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_ScrapIt_Proxy( - IRenderEngine * This); - - - void __RPC_STUB IRenderEngine_ScrapIt_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_RenderOutputPins_Proxy( - IRenderEngine * This); - - - void __RPC_STUB IRenderEngine_RenderOutputPins_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_GetVendorString_Proxy( - IRenderEngine * This, - /* [retval][out] */ BSTR *pVendorID); - - - void __RPC_STUB IRenderEngine_GetVendorString_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_ConnectFrontEnd_Proxy( - IRenderEngine * This); - - - void __RPC_STUB IRenderEngine_ConnectFrontEnd_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_SetSourceConnectCallback_Proxy( - IRenderEngine * This, - IGrfCache *pCallback); - - - void __RPC_STUB IRenderEngine_SetSourceConnectCallback_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_SetDynamicReconnectLevel_Proxy( - IRenderEngine * This, - long Level); - - - void __RPC_STUB IRenderEngine_SetDynamicReconnectLevel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_DoSmartRecompression_Proxy( - IRenderEngine * This); - - - void __RPC_STUB IRenderEngine_DoSmartRecompression_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_UseInSmartRecompressionGraph_Proxy( - IRenderEngine * This); - - - void __RPC_STUB IRenderEngine_UseInSmartRecompressionGraph_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_SetSourceNameValidation_Proxy( - IRenderEngine * This, - BSTR FilterString, - IMediaLocator *pOverride, - LONG Flags); - - - void __RPC_STUB IRenderEngine_SetSourceNameValidation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_Commit_Proxy( - IRenderEngine * This); - - - void __RPC_STUB IRenderEngine_Commit_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_Decommit_Proxy( - IRenderEngine * This); - - - void __RPC_STUB IRenderEngine_Decommit_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IRenderEngine_GetCaps_Proxy( - IRenderEngine * This, - long Index, - long *pReturn); - - - void __RPC_STUB IRenderEngine_GetCaps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IRenderEngine_INTERFACE_DEFINED__ */ - - - #ifndef __IFindCompressorCB_INTERFACE_DEFINED__ - #define __IFindCompressorCB_INTERFACE_DEFINED__ - - /* interface IFindCompressorCB */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IFindCompressorCB; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("F03FA8DE-879A-4d59-9B2C-26BB1CF83461") - IFindCompressorCB : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetCompressor( - AM_MEDIA_TYPE *pType, - AM_MEDIA_TYPE *pCompType, - /* [out] */ IBaseFilter **ppFilter) = 0; - - }; - - #else /* C style interface */ - - typedef struct IFindCompressorCBVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IFindCompressorCB * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IFindCompressorCB * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IFindCompressorCB * This); - - HRESULT ( STDMETHODCALLTYPE *GetCompressor )( - IFindCompressorCB * This, - AM_MEDIA_TYPE *pType, - AM_MEDIA_TYPE *pCompType, - /* [out] */ IBaseFilter **ppFilter); - - END_INTERFACE - } IFindCompressorCBVtbl; - - interface IFindCompressorCB - { - CONST_VTBL struct IFindCompressorCBVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IFindCompressorCB_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IFindCompressorCB_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IFindCompressorCB_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IFindCompressorCB_GetCompressor(This,pType,pCompType,ppFilter) \ - (This)->lpVtbl -> GetCompressor(This,pType,pCompType,ppFilter) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - HRESULT STDMETHODCALLTYPE IFindCompressorCB_GetCompressor_Proxy( - IFindCompressorCB * This, - AM_MEDIA_TYPE *pType, - AM_MEDIA_TYPE *pCompType, - /* [out] */ IBaseFilter **ppFilter); - - - void __RPC_STUB IFindCompressorCB_GetCompressor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IFindCompressorCB_INTERFACE_DEFINED__ */ - - - #ifndef __ISmartRenderEngine_INTERFACE_DEFINED__ - #define __ISmartRenderEngine_INTERFACE_DEFINED__ - - /* interface ISmartRenderEngine */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_ISmartRenderEngine; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("F03FA8CE-879A-4d59-9B2C-26BB1CF83461") - ISmartRenderEngine : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetGroupCompressor( - long Group, - IBaseFilter *pCompressor) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetGroupCompressor( - long Group, - IBaseFilter **pCompressor) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFindCompressorCB( - IFindCompressorCB *pCallback) = 0; - - }; - - #else /* C style interface */ - - typedef struct ISmartRenderEngineVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ISmartRenderEngine * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ISmartRenderEngine * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ISmartRenderEngine * This); - - HRESULT ( STDMETHODCALLTYPE *SetGroupCompressor )( - ISmartRenderEngine * This, - long Group, - IBaseFilter *pCompressor); - - HRESULT ( STDMETHODCALLTYPE *GetGroupCompressor )( - ISmartRenderEngine * This, - long Group, - IBaseFilter **pCompressor); - - HRESULT ( STDMETHODCALLTYPE *SetFindCompressorCB )( - ISmartRenderEngine * This, - IFindCompressorCB *pCallback); - - END_INTERFACE - } ISmartRenderEngineVtbl; - - interface ISmartRenderEngine - { - CONST_VTBL struct ISmartRenderEngineVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define ISmartRenderEngine_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define ISmartRenderEngine_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define ISmartRenderEngine_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define ISmartRenderEngine_SetGroupCompressor(This,Group,pCompressor) \ - (This)->lpVtbl -> SetGroupCompressor(This,Group,pCompressor) - - #define ISmartRenderEngine_GetGroupCompressor(This,Group,pCompressor) \ - (This)->lpVtbl -> GetGroupCompressor(This,Group,pCompressor) - - #define ISmartRenderEngine_SetFindCompressorCB(This,pCallback) \ - (This)->lpVtbl -> SetFindCompressorCB(This,pCallback) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - HRESULT STDMETHODCALLTYPE ISmartRenderEngine_SetGroupCompressor_Proxy( - ISmartRenderEngine * This, - long Group, - IBaseFilter *pCompressor); - - - void __RPC_STUB ISmartRenderEngine_SetGroupCompressor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE ISmartRenderEngine_GetGroupCompressor_Proxy( - ISmartRenderEngine * This, - long Group, - IBaseFilter **pCompressor); - - - void __RPC_STUB ISmartRenderEngine_GetGroupCompressor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE ISmartRenderEngine_SetFindCompressorCB_Proxy( - ISmartRenderEngine * This, - IFindCompressorCB *pCallback); - - - void __RPC_STUB ISmartRenderEngine_SetFindCompressorCB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __ISmartRenderEngine_INTERFACE_DEFINED__ */ - - - #ifndef __IAMTimelineObj_INTERFACE_DEFINED__ - #define __IAMTimelineObj_INTERFACE_DEFINED__ - - /* interface IAMTimelineObj */ - /* [unique][helpstring][uuid][local][object] */ - - - EXTERN_C const IID IID_IAMTimelineObj; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("78530B77-61F9-11D2-8CAD-00A024580902") - IAMTimelineObj : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetStartStop( - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetStartStop2( - REFTIME *pStart, - REFTIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE FixTimes( - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE FixTimes2( - REFTIME *pStart, - REFTIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetStartStop( - REFERENCE_TIME Start, - REFERENCE_TIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetStartStop2( - REFTIME Start, - REFTIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetPropertySetter( - /* [retval][out] */ IPropertySetter **pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetPropertySetter( - IPropertySetter *newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSubObject( - /* [retval][out] */ IUnknown **pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetSubObject( - IUnknown *newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetSubObjectGUID( - GUID newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetSubObjectGUIDB( - BSTR newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSubObjectGUID( - GUID *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSubObjectGUIDB( - /* [retval][out] */ BSTR *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSubObjectLoaded( - BOOL *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetTimelineType( - TIMELINE_MAJOR_TYPE *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetTimelineType( - TIMELINE_MAJOR_TYPE newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetUserID( - long *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetUserID( - long newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetGenID( - long *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetUserName( - /* [retval][out] */ BSTR *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetUserName( - BSTR newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetUserData( - BYTE *pData, - long *pSize) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetUserData( - BYTE *pData, - long Size) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMuted( - BOOL *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMuted( - BOOL newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetLocked( - BOOL *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetLocked( - BOOL newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDirtyRange( - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDirtyRange2( - REFTIME *pStart, - REFTIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetDirtyRange( - REFERENCE_TIME Start, - REFERENCE_TIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetDirtyRange2( - REFTIME Start, - REFTIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ClearDirty( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Remove( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RemoveAll( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimelineNoRef( - IAMTimeline **ppResult) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetGroupIBelongTo( - /* [out] */ IAMTimelineGroup **ppGroup) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetEmbedDepth( - long *pVal) = 0; - - }; - - #else /* C style interface */ - - typedef struct IAMTimelineObjVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineObj * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineObj * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineObj * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetStartStop )( - IAMTimelineObj * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetStartStop2 )( - IAMTimelineObj * This, - REFTIME *pStart, - REFTIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *FixTimes )( - IAMTimelineObj * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *FixTimes2 )( - IAMTimelineObj * This, - REFTIME *pStart, - REFTIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetStartStop )( - IAMTimelineObj * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetStartStop2 )( - IAMTimelineObj * This, - REFTIME Start, - REFTIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetPropertySetter )( - IAMTimelineObj * This, - /* [retval][out] */ IPropertySetter **pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetPropertySetter )( - IAMTimelineObj * This, - IPropertySetter *newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetSubObject )( - IAMTimelineObj * This, - /* [retval][out] */ IUnknown **pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetSubObject )( - IAMTimelineObj * This, - IUnknown *newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetSubObjectGUID )( - IAMTimelineObj * This, - GUID newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetSubObjectGUIDB )( - IAMTimelineObj * This, - BSTR newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetSubObjectGUID )( - IAMTimelineObj * This, - GUID *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetSubObjectGUIDB )( - IAMTimelineObj * This, - /* [retval][out] */ BSTR *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetSubObjectLoaded )( - IAMTimelineObj * This, - BOOL *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetTimelineType )( - IAMTimelineObj * This, - TIMELINE_MAJOR_TYPE *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetTimelineType )( - IAMTimelineObj * This, - TIMELINE_MAJOR_TYPE newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetUserID )( - IAMTimelineObj * This, - long *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetUserID )( - IAMTimelineObj * This, - long newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetGenID )( - IAMTimelineObj * This, - long *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetUserName )( - IAMTimelineObj * This, - /* [retval][out] */ BSTR *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetUserName )( - IAMTimelineObj * This, - BSTR newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetUserData )( - IAMTimelineObj * This, - BYTE *pData, - long *pSize); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetUserData )( - IAMTimelineObj * This, - BYTE *pData, - long Size); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMuted )( - IAMTimelineObj * This, - BOOL *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMuted )( - IAMTimelineObj * This, - BOOL newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetLocked )( - IAMTimelineObj * This, - BOOL *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetLocked )( - IAMTimelineObj * This, - BOOL newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetDirtyRange )( - IAMTimelineObj * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetDirtyRange2 )( - IAMTimelineObj * This, - REFTIME *pStart, - REFTIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetDirtyRange )( - IAMTimelineObj * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetDirtyRange2 )( - IAMTimelineObj * This, - REFTIME Start, - REFTIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *ClearDirty )( - IAMTimelineObj * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *Remove )( - IAMTimelineObj * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *RemoveAll )( - IAMTimelineObj * This); - - HRESULT ( STDMETHODCALLTYPE *GetTimelineNoRef )( - IAMTimelineObj * This, - IAMTimeline **ppResult); - - HRESULT ( STDMETHODCALLTYPE *GetGroupIBelongTo )( - IAMTimelineObj * This, - /* [out] */ IAMTimelineGroup **ppGroup); - - HRESULT ( STDMETHODCALLTYPE *GetEmbedDepth )( - IAMTimelineObj * This, - long *pVal); - - END_INTERFACE - } IAMTimelineObjVtbl; - - interface IAMTimelineObj - { - CONST_VTBL struct IAMTimelineObjVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IAMTimelineObj_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IAMTimelineObj_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IAMTimelineObj_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IAMTimelineObj_GetStartStop(This,pStart,pStop) \ - (This)->lpVtbl -> GetStartStop(This,pStart,pStop) - - #define IAMTimelineObj_GetStartStop2(This,pStart,pStop) \ - (This)->lpVtbl -> GetStartStop2(This,pStart,pStop) - - #define IAMTimelineObj_FixTimes(This,pStart,pStop) \ - (This)->lpVtbl -> FixTimes(This,pStart,pStop) - - #define IAMTimelineObj_FixTimes2(This,pStart,pStop) \ - (This)->lpVtbl -> FixTimes2(This,pStart,pStop) - - #define IAMTimelineObj_SetStartStop(This,Start,Stop) \ - (This)->lpVtbl -> SetStartStop(This,Start,Stop) - - #define IAMTimelineObj_SetStartStop2(This,Start,Stop) \ - (This)->lpVtbl -> SetStartStop2(This,Start,Stop) - - #define IAMTimelineObj_GetPropertySetter(This,pVal) \ - (This)->lpVtbl -> GetPropertySetter(This,pVal) - - #define IAMTimelineObj_SetPropertySetter(This,newVal) \ - (This)->lpVtbl -> SetPropertySetter(This,newVal) - - #define IAMTimelineObj_GetSubObject(This,pVal) \ - (This)->lpVtbl -> GetSubObject(This,pVal) - - #define IAMTimelineObj_SetSubObject(This,newVal) \ - (This)->lpVtbl -> SetSubObject(This,newVal) - - #define IAMTimelineObj_SetSubObjectGUID(This,newVal) \ - (This)->lpVtbl -> SetSubObjectGUID(This,newVal) - - #define IAMTimelineObj_SetSubObjectGUIDB(This,newVal) \ - (This)->lpVtbl -> SetSubObjectGUIDB(This,newVal) - - #define IAMTimelineObj_GetSubObjectGUID(This,pVal) \ - (This)->lpVtbl -> GetSubObjectGUID(This,pVal) - - #define IAMTimelineObj_GetSubObjectGUIDB(This,pVal) \ - (This)->lpVtbl -> GetSubObjectGUIDB(This,pVal) - - #define IAMTimelineObj_GetSubObjectLoaded(This,pVal) \ - (This)->lpVtbl -> GetSubObjectLoaded(This,pVal) - - #define IAMTimelineObj_GetTimelineType(This,pVal) \ - (This)->lpVtbl -> GetTimelineType(This,pVal) - - #define IAMTimelineObj_SetTimelineType(This,newVal) \ - (This)->lpVtbl -> SetTimelineType(This,newVal) - - #define IAMTimelineObj_GetUserID(This,pVal) \ - (This)->lpVtbl -> GetUserID(This,pVal) - - #define IAMTimelineObj_SetUserID(This,newVal) \ - (This)->lpVtbl -> SetUserID(This,newVal) - - #define IAMTimelineObj_GetGenID(This,pVal) \ - (This)->lpVtbl -> GetGenID(This,pVal) - - #define IAMTimelineObj_GetUserName(This,pVal) \ - (This)->lpVtbl -> GetUserName(This,pVal) - - #define IAMTimelineObj_SetUserName(This,newVal) \ - (This)->lpVtbl -> SetUserName(This,newVal) - - #define IAMTimelineObj_GetUserData(This,pData,pSize) \ - (This)->lpVtbl -> GetUserData(This,pData,pSize) - - #define IAMTimelineObj_SetUserData(This,pData,Size) \ - (This)->lpVtbl -> SetUserData(This,pData,Size) - - #define IAMTimelineObj_GetMuted(This,pVal) \ - (This)->lpVtbl -> GetMuted(This,pVal) - - #define IAMTimelineObj_SetMuted(This,newVal) \ - (This)->lpVtbl -> SetMuted(This,newVal) - - #define IAMTimelineObj_GetLocked(This,pVal) \ - (This)->lpVtbl -> GetLocked(This,pVal) - - #define IAMTimelineObj_SetLocked(This,newVal) \ - (This)->lpVtbl -> SetLocked(This,newVal) - - #define IAMTimelineObj_GetDirtyRange(This,pStart,pStop) \ - (This)->lpVtbl -> GetDirtyRange(This,pStart,pStop) - - #define IAMTimelineObj_GetDirtyRange2(This,pStart,pStop) \ - (This)->lpVtbl -> GetDirtyRange2(This,pStart,pStop) - - #define IAMTimelineObj_SetDirtyRange(This,Start,Stop) \ - (This)->lpVtbl -> SetDirtyRange(This,Start,Stop) - - #define IAMTimelineObj_SetDirtyRange2(This,Start,Stop) \ - (This)->lpVtbl -> SetDirtyRange2(This,Start,Stop) - - #define IAMTimelineObj_ClearDirty(This) \ - (This)->lpVtbl -> ClearDirty(This) - - #define IAMTimelineObj_Remove(This) \ - (This)->lpVtbl -> Remove(This) - - #define IAMTimelineObj_RemoveAll(This) \ - (This)->lpVtbl -> RemoveAll(This) - - #define IAMTimelineObj_GetTimelineNoRef(This,ppResult) \ - (This)->lpVtbl -> GetTimelineNoRef(This,ppResult) - - #define IAMTimelineObj_GetGroupIBelongTo(This,ppGroup) \ - (This)->lpVtbl -> GetGroupIBelongTo(This,ppGroup) - - #define IAMTimelineObj_GetEmbedDepth(This,pVal) \ - (This)->lpVtbl -> GetEmbedDepth(This,pVal) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetStartStop_Proxy( - IAMTimelineObj * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - - void __RPC_STUB IAMTimelineObj_GetStartStop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetStartStop2_Proxy( - IAMTimelineObj * This, - REFTIME *pStart, - REFTIME *pStop); - - - void __RPC_STUB IAMTimelineObj_GetStartStop2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_FixTimes_Proxy( - IAMTimelineObj * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - - void __RPC_STUB IAMTimelineObj_FixTimes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_FixTimes2_Proxy( - IAMTimelineObj * This, - REFTIME *pStart, - REFTIME *pStop); - - - void __RPC_STUB IAMTimelineObj_FixTimes2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetStartStop_Proxy( - IAMTimelineObj * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - - void __RPC_STUB IAMTimelineObj_SetStartStop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetStartStop2_Proxy( - IAMTimelineObj * This, - REFTIME Start, - REFTIME Stop); - - - void __RPC_STUB IAMTimelineObj_SetStartStop2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetPropertySetter_Proxy( - IAMTimelineObj * This, - /* [retval][out] */ IPropertySetter **pVal); - - - void __RPC_STUB IAMTimelineObj_GetPropertySetter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetPropertySetter_Proxy( - IAMTimelineObj * This, - IPropertySetter *newVal); - - - void __RPC_STUB IAMTimelineObj_SetPropertySetter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetSubObject_Proxy( - IAMTimelineObj * This, - /* [retval][out] */ IUnknown **pVal); - - - void __RPC_STUB IAMTimelineObj_GetSubObject_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetSubObject_Proxy( - IAMTimelineObj * This, - IUnknown *newVal); - - - void __RPC_STUB IAMTimelineObj_SetSubObject_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetSubObjectGUID_Proxy( - IAMTimelineObj * This, - GUID newVal); - - - void __RPC_STUB IAMTimelineObj_SetSubObjectGUID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetSubObjectGUIDB_Proxy( - IAMTimelineObj * This, - BSTR newVal); - - - void __RPC_STUB IAMTimelineObj_SetSubObjectGUIDB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetSubObjectGUID_Proxy( - IAMTimelineObj * This, - GUID *pVal); - - - void __RPC_STUB IAMTimelineObj_GetSubObjectGUID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetSubObjectGUIDB_Proxy( - IAMTimelineObj * This, - /* [retval][out] */ BSTR *pVal); - - - void __RPC_STUB IAMTimelineObj_GetSubObjectGUIDB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetSubObjectLoaded_Proxy( - IAMTimelineObj * This, - BOOL *pVal); - - - void __RPC_STUB IAMTimelineObj_GetSubObjectLoaded_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetTimelineType_Proxy( - IAMTimelineObj * This, - TIMELINE_MAJOR_TYPE *pVal); - - - void __RPC_STUB IAMTimelineObj_GetTimelineType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetTimelineType_Proxy( - IAMTimelineObj * This, - TIMELINE_MAJOR_TYPE newVal); - - - void __RPC_STUB IAMTimelineObj_SetTimelineType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetUserID_Proxy( - IAMTimelineObj * This, - long *pVal); - - - void __RPC_STUB IAMTimelineObj_GetUserID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetUserID_Proxy( - IAMTimelineObj * This, - long newVal); - - - void __RPC_STUB IAMTimelineObj_SetUserID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetGenID_Proxy( - IAMTimelineObj * This, - long *pVal); - - - void __RPC_STUB IAMTimelineObj_GetGenID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetUserName_Proxy( - IAMTimelineObj * This, - /* [retval][out] */ BSTR *pVal); - - - void __RPC_STUB IAMTimelineObj_GetUserName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetUserName_Proxy( - IAMTimelineObj * This, - BSTR newVal); - - - void __RPC_STUB IAMTimelineObj_SetUserName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetUserData_Proxy( - IAMTimelineObj * This, - BYTE *pData, - long *pSize); - - - void __RPC_STUB IAMTimelineObj_GetUserData_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetUserData_Proxy( - IAMTimelineObj * This, - BYTE *pData, - long Size); - - - void __RPC_STUB IAMTimelineObj_SetUserData_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetMuted_Proxy( - IAMTimelineObj * This, - BOOL *pVal); - - - void __RPC_STUB IAMTimelineObj_GetMuted_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetMuted_Proxy( - IAMTimelineObj * This, - BOOL newVal); - - - void __RPC_STUB IAMTimelineObj_SetMuted_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetLocked_Proxy( - IAMTimelineObj * This, - BOOL *pVal); - - - void __RPC_STUB IAMTimelineObj_GetLocked_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetLocked_Proxy( - IAMTimelineObj * This, - BOOL newVal); - - - void __RPC_STUB IAMTimelineObj_SetLocked_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetDirtyRange_Proxy( - IAMTimelineObj * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - - void __RPC_STUB IAMTimelineObj_GetDirtyRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetDirtyRange2_Proxy( - IAMTimelineObj * This, - REFTIME *pStart, - REFTIME *pStop); - - - void __RPC_STUB IAMTimelineObj_GetDirtyRange2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetDirtyRange_Proxy( - IAMTimelineObj * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - - void __RPC_STUB IAMTimelineObj_SetDirtyRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_SetDirtyRange2_Proxy( - IAMTimelineObj * This, - REFTIME Start, - REFTIME Stop); - - - void __RPC_STUB IAMTimelineObj_SetDirtyRange2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_ClearDirty_Proxy( - IAMTimelineObj * This); - - - void __RPC_STUB IAMTimelineObj_ClearDirty_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_Remove_Proxy( - IAMTimelineObj * This); - - - void __RPC_STUB IAMTimelineObj_Remove_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineObj_RemoveAll_Proxy( - IAMTimelineObj * This); - - - void __RPC_STUB IAMTimelineObj_RemoveAll_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetTimelineNoRef_Proxy( - IAMTimelineObj * This, - IAMTimeline **ppResult); - - - void __RPC_STUB IAMTimelineObj_GetTimelineNoRef_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetGroupIBelongTo_Proxy( - IAMTimelineObj * This, - /* [out] */ IAMTimelineGroup **ppGroup); - - - void __RPC_STUB IAMTimelineObj_GetGroupIBelongTo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineObj_GetEmbedDepth_Proxy( - IAMTimelineObj * This, - long *pVal); - - - void __RPC_STUB IAMTimelineObj_GetEmbedDepth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IAMTimelineObj_INTERFACE_DEFINED__ */ - - - #ifndef __IAMTimelineEffectable_INTERFACE_DEFINED__ - #define __IAMTimelineEffectable_INTERFACE_DEFINED__ - - /* interface IAMTimelineEffectable */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IAMTimelineEffectable; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("EAE58537-622E-11d2-8CAD-00A024580902") - IAMTimelineEffectable : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE EffectInsBefore( - IAMTimelineObj *pFX, - long priority) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE EffectSwapPriorities( - long PriorityA, - long PriorityB) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE EffectGetCount( - long *pCount) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetEffect( - /* [out] */ IAMTimelineObj **ppFx, - long Which) = 0; - - }; - - #else /* C style interface */ - - typedef struct IAMTimelineEffectableVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineEffectable * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineEffectable * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineEffectable * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *EffectInsBefore )( - IAMTimelineEffectable * This, - IAMTimelineObj *pFX, - long priority); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *EffectSwapPriorities )( - IAMTimelineEffectable * This, - long PriorityA, - long PriorityB); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *EffectGetCount )( - IAMTimelineEffectable * This, - long *pCount); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetEffect )( - IAMTimelineEffectable * This, - /* [out] */ IAMTimelineObj **ppFx, - long Which); - - END_INTERFACE - } IAMTimelineEffectableVtbl; - - interface IAMTimelineEffectable - { - CONST_VTBL struct IAMTimelineEffectableVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IAMTimelineEffectable_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IAMTimelineEffectable_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IAMTimelineEffectable_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IAMTimelineEffectable_EffectInsBefore(This,pFX,priority) \ - (This)->lpVtbl -> EffectInsBefore(This,pFX,priority) - - #define IAMTimelineEffectable_EffectSwapPriorities(This,PriorityA,PriorityB) \ - (This)->lpVtbl -> EffectSwapPriorities(This,PriorityA,PriorityB) - - #define IAMTimelineEffectable_EffectGetCount(This,pCount) \ - (This)->lpVtbl -> EffectGetCount(This,pCount) - - #define IAMTimelineEffectable_GetEffect(This,ppFx,Which) \ - (This)->lpVtbl -> GetEffect(This,ppFx,Which) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineEffectable_EffectInsBefore_Proxy( - IAMTimelineEffectable * This, - IAMTimelineObj *pFX, - long priority); - - - void __RPC_STUB IAMTimelineEffectable_EffectInsBefore_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineEffectable_EffectSwapPriorities_Proxy( - IAMTimelineEffectable * This, - long PriorityA, - long PriorityB); - - - void __RPC_STUB IAMTimelineEffectable_EffectSwapPriorities_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineEffectable_EffectGetCount_Proxy( - IAMTimelineEffectable * This, - long *pCount); - - - void __RPC_STUB IAMTimelineEffectable_EffectGetCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineEffectable_GetEffect_Proxy( - IAMTimelineEffectable * This, - /* [out] */ IAMTimelineObj **ppFx, - long Which); - - - void __RPC_STUB IAMTimelineEffectable_GetEffect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IAMTimelineEffectable_INTERFACE_DEFINED__ */ - - - #ifndef __IAMTimelineEffect_INTERFACE_DEFINED__ - #define __IAMTimelineEffect_INTERFACE_DEFINED__ - - /* interface IAMTimelineEffect */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IAMTimelineEffect; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("BCE0C264-622D-11d2-8CAD-00A024580902") - IAMTimelineEffect : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE EffectGetPriority( - long *pVal) = 0; - - }; - - #else /* C style interface */ - - typedef struct IAMTimelineEffectVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineEffect * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineEffect * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineEffect * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *EffectGetPriority )( - IAMTimelineEffect * This, - long *pVal); - - END_INTERFACE - } IAMTimelineEffectVtbl; - - interface IAMTimelineEffect - { - CONST_VTBL struct IAMTimelineEffectVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IAMTimelineEffect_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IAMTimelineEffect_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IAMTimelineEffect_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IAMTimelineEffect_EffectGetPriority(This,pVal) \ - (This)->lpVtbl -> EffectGetPriority(This,pVal) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineEffect_EffectGetPriority_Proxy( - IAMTimelineEffect * This, - long *pVal); - - - void __RPC_STUB IAMTimelineEffect_EffectGetPriority_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IAMTimelineEffect_INTERFACE_DEFINED__ */ - - - #ifndef __IAMTimelineTransable_INTERFACE_DEFINED__ - #define __IAMTimelineTransable_INTERFACE_DEFINED__ - - /* interface IAMTimelineTransable */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IAMTimelineTransable; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("378FA386-622E-11d2-8CAD-00A024580902") - IAMTimelineTransable : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE TransAdd( - IAMTimelineObj *pTrans) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE TransGetCount( - long *pCount) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetNextTrans( - /* [out] */ IAMTimelineObj **ppTrans, - REFERENCE_TIME *pInOut) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetNextTrans2( - /* [out] */ IAMTimelineObj **ppTrans, - REFTIME *pInOut) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetTransAtTime( - /* [out] */ IAMTimelineObj **ppObj, - REFERENCE_TIME Time, - long SearchDirection) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetTransAtTime2( - /* [out] */ IAMTimelineObj **ppObj, - REFTIME Time, - long SearchDirection) = 0; - - }; - - #else /* C style interface */ - - typedef struct IAMTimelineTransableVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineTransable * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineTransable * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineTransable * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *TransAdd )( - IAMTimelineTransable * This, - IAMTimelineObj *pTrans); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *TransGetCount )( - IAMTimelineTransable * This, - long *pCount); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetNextTrans )( - IAMTimelineTransable * This, - /* [out] */ IAMTimelineObj **ppTrans, - REFERENCE_TIME *pInOut); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetNextTrans2 )( - IAMTimelineTransable * This, - /* [out] */ IAMTimelineObj **ppTrans, - REFTIME *pInOut); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetTransAtTime )( - IAMTimelineTransable * This, - /* [out] */ IAMTimelineObj **ppObj, - REFERENCE_TIME Time, - long SearchDirection); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetTransAtTime2 )( - IAMTimelineTransable * This, - /* [out] */ IAMTimelineObj **ppObj, - REFTIME Time, - long SearchDirection); - - END_INTERFACE - } IAMTimelineTransableVtbl; - - interface IAMTimelineTransable - { - CONST_VTBL struct IAMTimelineTransableVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IAMTimelineTransable_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IAMTimelineTransable_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IAMTimelineTransable_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IAMTimelineTransable_TransAdd(This,pTrans) \ - (This)->lpVtbl -> TransAdd(This,pTrans) - - #define IAMTimelineTransable_TransGetCount(This,pCount) \ - (This)->lpVtbl -> TransGetCount(This,pCount) - - #define IAMTimelineTransable_GetNextTrans(This,ppTrans,pInOut) \ - (This)->lpVtbl -> GetNextTrans(This,ppTrans,pInOut) - - #define IAMTimelineTransable_GetNextTrans2(This,ppTrans,pInOut) \ - (This)->lpVtbl -> GetNextTrans2(This,ppTrans,pInOut) - - #define IAMTimelineTransable_GetTransAtTime(This,ppObj,Time,SearchDirection) \ - (This)->lpVtbl -> GetTransAtTime(This,ppObj,Time,SearchDirection) - - #define IAMTimelineTransable_GetTransAtTime2(This,ppObj,Time,SearchDirection) \ - (This)->lpVtbl -> GetTransAtTime2(This,ppObj,Time,SearchDirection) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTransable_TransAdd_Proxy( - IAMTimelineTransable * This, - IAMTimelineObj *pTrans); - - - void __RPC_STUB IAMTimelineTransable_TransAdd_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTransable_TransGetCount_Proxy( - IAMTimelineTransable * This, - long *pCount); - - - void __RPC_STUB IAMTimelineTransable_TransGetCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTransable_GetNextTrans_Proxy( - IAMTimelineTransable * This, - /* [out] */ IAMTimelineObj **ppTrans, - REFERENCE_TIME *pInOut); - - - void __RPC_STUB IAMTimelineTransable_GetNextTrans_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTransable_GetNextTrans2_Proxy( - IAMTimelineTransable * This, - /* [out] */ IAMTimelineObj **ppTrans, - REFTIME *pInOut); - - - void __RPC_STUB IAMTimelineTransable_GetNextTrans2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTransable_GetTransAtTime_Proxy( - IAMTimelineTransable * This, - /* [out] */ IAMTimelineObj **ppObj, - REFERENCE_TIME Time, - long SearchDirection); - - - void __RPC_STUB IAMTimelineTransable_GetTransAtTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTransable_GetTransAtTime2_Proxy( - IAMTimelineTransable * This, - /* [out] */ IAMTimelineObj **ppObj, - REFTIME Time, - long SearchDirection); - - - void __RPC_STUB IAMTimelineTransable_GetTransAtTime2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IAMTimelineTransable_INTERFACE_DEFINED__ */ - - - #ifndef __IAMTimelineSplittable_INTERFACE_DEFINED__ - #define __IAMTimelineSplittable_INTERFACE_DEFINED__ - - /* interface IAMTimelineSplittable */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IAMTimelineSplittable; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("A0F840A0-D590-11d2-8D55-00A0C9441E20") - IAMTimelineSplittable : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SplitAt( - REFERENCE_TIME Time) = 0; - - virtual HRESULT STDMETHODCALLTYPE SplitAt2( - REFTIME Time) = 0; - - }; - - #else /* C style interface */ - - typedef struct IAMTimelineSplittableVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineSplittable * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineSplittable * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineSplittable * This); - - HRESULT ( STDMETHODCALLTYPE *SplitAt )( - IAMTimelineSplittable * This, - REFERENCE_TIME Time); - - HRESULT ( STDMETHODCALLTYPE *SplitAt2 )( - IAMTimelineSplittable * This, - REFTIME Time); - - END_INTERFACE - } IAMTimelineSplittableVtbl; - - interface IAMTimelineSplittable - { - CONST_VTBL struct IAMTimelineSplittableVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IAMTimelineSplittable_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IAMTimelineSplittable_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IAMTimelineSplittable_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IAMTimelineSplittable_SplitAt(This,Time) \ - (This)->lpVtbl -> SplitAt(This,Time) - - #define IAMTimelineSplittable_SplitAt2(This,Time) \ - (This)->lpVtbl -> SplitAt2(This,Time) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - HRESULT STDMETHODCALLTYPE IAMTimelineSplittable_SplitAt_Proxy( - IAMTimelineSplittable * This, - REFERENCE_TIME Time); - - - void __RPC_STUB IAMTimelineSplittable_SplitAt_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineSplittable_SplitAt2_Proxy( - IAMTimelineSplittable * This, - REFTIME Time); - - - void __RPC_STUB IAMTimelineSplittable_SplitAt2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IAMTimelineSplittable_INTERFACE_DEFINED__ */ - - - #ifndef __IAMTimelineTrans_INTERFACE_DEFINED__ - #define __IAMTimelineTrans_INTERFACE_DEFINED__ - - /* interface IAMTimelineTrans */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IAMTimelineTrans; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("BCE0C265-622D-11d2-8CAD-00A024580902") - IAMTimelineTrans : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetCutPoint( - REFERENCE_TIME *pTLTime) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetCutPoint2( - REFTIME *pTLTime) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetCutPoint( - REFERENCE_TIME TLTime) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetCutPoint2( - REFTIME TLTime) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSwapInputs( - BOOL *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetSwapInputs( - BOOL pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetCutsOnly( - BOOL *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetCutsOnly( - BOOL pVal) = 0; - - }; - - #else /* C style interface */ - - typedef struct IAMTimelineTransVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineTrans * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineTrans * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineTrans * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetCutPoint )( - IAMTimelineTrans * This, - REFERENCE_TIME *pTLTime); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetCutPoint2 )( - IAMTimelineTrans * This, - REFTIME *pTLTime); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetCutPoint )( - IAMTimelineTrans * This, - REFERENCE_TIME TLTime); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetCutPoint2 )( - IAMTimelineTrans * This, - REFTIME TLTime); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetSwapInputs )( - IAMTimelineTrans * This, - BOOL *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetSwapInputs )( - IAMTimelineTrans * This, - BOOL pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetCutsOnly )( - IAMTimelineTrans * This, - BOOL *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetCutsOnly )( - IAMTimelineTrans * This, - BOOL pVal); - - END_INTERFACE - } IAMTimelineTransVtbl; - - interface IAMTimelineTrans - { - CONST_VTBL struct IAMTimelineTransVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IAMTimelineTrans_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IAMTimelineTrans_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IAMTimelineTrans_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IAMTimelineTrans_GetCutPoint(This,pTLTime) \ - (This)->lpVtbl -> GetCutPoint(This,pTLTime) - - #define IAMTimelineTrans_GetCutPoint2(This,pTLTime) \ - (This)->lpVtbl -> GetCutPoint2(This,pTLTime) - - #define IAMTimelineTrans_SetCutPoint(This,TLTime) \ - (This)->lpVtbl -> SetCutPoint(This,TLTime) - - #define IAMTimelineTrans_SetCutPoint2(This,TLTime) \ - (This)->lpVtbl -> SetCutPoint2(This,TLTime) - - #define IAMTimelineTrans_GetSwapInputs(This,pVal) \ - (This)->lpVtbl -> GetSwapInputs(This,pVal) - - #define IAMTimelineTrans_SetSwapInputs(This,pVal) \ - (This)->lpVtbl -> SetSwapInputs(This,pVal) - - #define IAMTimelineTrans_GetCutsOnly(This,pVal) \ - (This)->lpVtbl -> GetCutsOnly(This,pVal) - - #define IAMTimelineTrans_SetCutsOnly(This,pVal) \ - (This)->lpVtbl -> SetCutsOnly(This,pVal) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrans_GetCutPoint_Proxy( - IAMTimelineTrans * This, - REFERENCE_TIME *pTLTime); - - - void __RPC_STUB IAMTimelineTrans_GetCutPoint_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrans_GetCutPoint2_Proxy( - IAMTimelineTrans * This, - REFTIME *pTLTime); - - - void __RPC_STUB IAMTimelineTrans_GetCutPoint2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrans_SetCutPoint_Proxy( - IAMTimelineTrans * This, - REFERENCE_TIME TLTime); - - - void __RPC_STUB IAMTimelineTrans_SetCutPoint_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrans_SetCutPoint2_Proxy( - IAMTimelineTrans * This, - REFTIME TLTime); - - - void __RPC_STUB IAMTimelineTrans_SetCutPoint2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrans_GetSwapInputs_Proxy( - IAMTimelineTrans * This, - BOOL *pVal); - - - void __RPC_STUB IAMTimelineTrans_GetSwapInputs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrans_SetSwapInputs_Proxy( - IAMTimelineTrans * This, - BOOL pVal); - - - void __RPC_STUB IAMTimelineTrans_SetSwapInputs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrans_GetCutsOnly_Proxy( - IAMTimelineTrans * This, - BOOL *pVal); - - - void __RPC_STUB IAMTimelineTrans_GetCutsOnly_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrans_SetCutsOnly_Proxy( - IAMTimelineTrans * This, - BOOL pVal); - - - void __RPC_STUB IAMTimelineTrans_SetCutsOnly_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IAMTimelineTrans_INTERFACE_DEFINED__ */ - - - #ifndef __IAMTimelineSrc_INTERFACE_DEFINED__ - #define __IAMTimelineSrc_INTERFACE_DEFINED__ - - /* interface IAMTimelineSrc */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IAMTimelineSrc; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("78530B79-61F9-11D2-8CAD-00A024580902") - IAMTimelineSrc : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMediaTimes( - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMediaTimes2( - REFTIME *pStart, - REFTIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ModifyStopTime( - REFERENCE_TIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ModifyStopTime2( - REFTIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE FixMediaTimes( - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE FixMediaTimes2( - REFTIME *pStart, - REFTIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMediaTimes( - REFERENCE_TIME Start, - REFERENCE_TIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMediaTimes2( - REFTIME Start, - REFTIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMediaLength( - REFERENCE_TIME Length) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMediaLength2( - REFTIME Length) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMediaLength( - REFERENCE_TIME *pLength) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMediaLength2( - REFTIME *pLength) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMediaName( - /* [retval][out] */ BSTR *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMediaName( - BSTR newVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SpliceWithNext( - IAMTimelineObj *pNext) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetStreamNumber( - long *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetStreamNumber( - long Val) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsNormalRate( - BOOL *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDefaultFPS( - double *pFPS) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetDefaultFPS( - double FPS) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetStretchMode( - int *pnStretchMode) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetStretchMode( - int nStretchMode) = 0; - - }; - - #else /* C style interface */ - - typedef struct IAMTimelineSrcVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineSrc * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineSrc * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineSrc * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMediaTimes )( - IAMTimelineSrc * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMediaTimes2 )( - IAMTimelineSrc * This, - REFTIME *pStart, - REFTIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *ModifyStopTime )( - IAMTimelineSrc * This, - REFERENCE_TIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *ModifyStopTime2 )( - IAMTimelineSrc * This, - REFTIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *FixMediaTimes )( - IAMTimelineSrc * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *FixMediaTimes2 )( - IAMTimelineSrc * This, - REFTIME *pStart, - REFTIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMediaTimes )( - IAMTimelineSrc * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMediaTimes2 )( - IAMTimelineSrc * This, - REFTIME Start, - REFTIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMediaLength )( - IAMTimelineSrc * This, - REFERENCE_TIME Length); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMediaLength2 )( - IAMTimelineSrc * This, - REFTIME Length); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMediaLength )( - IAMTimelineSrc * This, - REFERENCE_TIME *pLength); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMediaLength2 )( - IAMTimelineSrc * This, - REFTIME *pLength); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMediaName )( - IAMTimelineSrc * This, - /* [retval][out] */ BSTR *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMediaName )( - IAMTimelineSrc * This, - BSTR newVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SpliceWithNext )( - IAMTimelineSrc * This, - IAMTimelineObj *pNext); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetStreamNumber )( - IAMTimelineSrc * This, - long *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetStreamNumber )( - IAMTimelineSrc * This, - long Val); - - HRESULT ( STDMETHODCALLTYPE *IsNormalRate )( - IAMTimelineSrc * This, - BOOL *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetDefaultFPS )( - IAMTimelineSrc * This, - double *pFPS); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetDefaultFPS )( - IAMTimelineSrc * This, - double FPS); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetStretchMode )( - IAMTimelineSrc * This, - int *pnStretchMode); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetStretchMode )( - IAMTimelineSrc * This, - int nStretchMode); - - END_INTERFACE - } IAMTimelineSrcVtbl; - - interface IAMTimelineSrc - { - CONST_VTBL struct IAMTimelineSrcVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IAMTimelineSrc_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IAMTimelineSrc_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IAMTimelineSrc_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IAMTimelineSrc_GetMediaTimes(This,pStart,pStop) \ - (This)->lpVtbl -> GetMediaTimes(This,pStart,pStop) - - #define IAMTimelineSrc_GetMediaTimes2(This,pStart,pStop) \ - (This)->lpVtbl -> GetMediaTimes2(This,pStart,pStop) - - #define IAMTimelineSrc_ModifyStopTime(This,Stop) \ - (This)->lpVtbl -> ModifyStopTime(This,Stop) - - #define IAMTimelineSrc_ModifyStopTime2(This,Stop) \ - (This)->lpVtbl -> ModifyStopTime2(This,Stop) - - #define IAMTimelineSrc_FixMediaTimes(This,pStart,pStop) \ - (This)->lpVtbl -> FixMediaTimes(This,pStart,pStop) - - #define IAMTimelineSrc_FixMediaTimes2(This,pStart,pStop) \ - (This)->lpVtbl -> FixMediaTimes2(This,pStart,pStop) - - #define IAMTimelineSrc_SetMediaTimes(This,Start,Stop) \ - (This)->lpVtbl -> SetMediaTimes(This,Start,Stop) - - #define IAMTimelineSrc_SetMediaTimes2(This,Start,Stop) \ - (This)->lpVtbl -> SetMediaTimes2(This,Start,Stop) - - #define IAMTimelineSrc_SetMediaLength(This,Length) \ - (This)->lpVtbl -> SetMediaLength(This,Length) - - #define IAMTimelineSrc_SetMediaLength2(This,Length) \ - (This)->lpVtbl -> SetMediaLength2(This,Length) - - #define IAMTimelineSrc_GetMediaLength(This,pLength) \ - (This)->lpVtbl -> GetMediaLength(This,pLength) - - #define IAMTimelineSrc_GetMediaLength2(This,pLength) \ - (This)->lpVtbl -> GetMediaLength2(This,pLength) - - #define IAMTimelineSrc_GetMediaName(This,pVal) \ - (This)->lpVtbl -> GetMediaName(This,pVal) - - #define IAMTimelineSrc_SetMediaName(This,newVal) \ - (This)->lpVtbl -> SetMediaName(This,newVal) - - #define IAMTimelineSrc_SpliceWithNext(This,pNext) \ - (This)->lpVtbl -> SpliceWithNext(This,pNext) - - #define IAMTimelineSrc_GetStreamNumber(This,pVal) \ - (This)->lpVtbl -> GetStreamNumber(This,pVal) - - #define IAMTimelineSrc_SetStreamNumber(This,Val) \ - (This)->lpVtbl -> SetStreamNumber(This,Val) - - #define IAMTimelineSrc_IsNormalRate(This,pVal) \ - (This)->lpVtbl -> IsNormalRate(This,pVal) - - #define IAMTimelineSrc_GetDefaultFPS(This,pFPS) \ - (This)->lpVtbl -> GetDefaultFPS(This,pFPS) - - #define IAMTimelineSrc_SetDefaultFPS(This,FPS) \ - (This)->lpVtbl -> SetDefaultFPS(This,FPS) - - #define IAMTimelineSrc_GetStretchMode(This,pnStretchMode) \ - (This)->lpVtbl -> GetStretchMode(This,pnStretchMode) - - #define IAMTimelineSrc_SetStretchMode(This,nStretchMode) \ - (This)->lpVtbl -> SetStretchMode(This,nStretchMode) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_GetMediaTimes_Proxy( - IAMTimelineSrc * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - - void __RPC_STUB IAMTimelineSrc_GetMediaTimes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_GetMediaTimes2_Proxy( - IAMTimelineSrc * This, - REFTIME *pStart, - REFTIME *pStop); - - - void __RPC_STUB IAMTimelineSrc_GetMediaTimes2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_ModifyStopTime_Proxy( - IAMTimelineSrc * This, - REFERENCE_TIME Stop); - - - void __RPC_STUB IAMTimelineSrc_ModifyStopTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_ModifyStopTime2_Proxy( - IAMTimelineSrc * This, - REFTIME Stop); - - - void __RPC_STUB IAMTimelineSrc_ModifyStopTime2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_FixMediaTimes_Proxy( - IAMTimelineSrc * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - - void __RPC_STUB IAMTimelineSrc_FixMediaTimes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_FixMediaTimes2_Proxy( - IAMTimelineSrc * This, - REFTIME *pStart, - REFTIME *pStop); - - - void __RPC_STUB IAMTimelineSrc_FixMediaTimes2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SetMediaTimes_Proxy( - IAMTimelineSrc * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - - void __RPC_STUB IAMTimelineSrc_SetMediaTimes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SetMediaTimes2_Proxy( - IAMTimelineSrc * This, - REFTIME Start, - REFTIME Stop); - - - void __RPC_STUB IAMTimelineSrc_SetMediaTimes2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SetMediaLength_Proxy( - IAMTimelineSrc * This, - REFERENCE_TIME Length); - - - void __RPC_STUB IAMTimelineSrc_SetMediaLength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SetMediaLength2_Proxy( - IAMTimelineSrc * This, - REFTIME Length); - - - void __RPC_STUB IAMTimelineSrc_SetMediaLength2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_GetMediaLength_Proxy( - IAMTimelineSrc * This, - REFERENCE_TIME *pLength); - - - void __RPC_STUB IAMTimelineSrc_GetMediaLength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_GetMediaLength2_Proxy( - IAMTimelineSrc * This, - REFTIME *pLength); - - - void __RPC_STUB IAMTimelineSrc_GetMediaLength2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_GetMediaName_Proxy( - IAMTimelineSrc * This, - /* [retval][out] */ BSTR *pVal); - - - void __RPC_STUB IAMTimelineSrc_GetMediaName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SetMediaName_Proxy( - IAMTimelineSrc * This, - BSTR newVal); - - - void __RPC_STUB IAMTimelineSrc_SetMediaName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SpliceWithNext_Proxy( - IAMTimelineSrc * This, - IAMTimelineObj *pNext); - - - void __RPC_STUB IAMTimelineSrc_SpliceWithNext_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_GetStreamNumber_Proxy( - IAMTimelineSrc * This, - long *pVal); - - - void __RPC_STUB IAMTimelineSrc_GetStreamNumber_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SetStreamNumber_Proxy( - IAMTimelineSrc * This, - long Val); - - - void __RPC_STUB IAMTimelineSrc_SetStreamNumber_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineSrc_IsNormalRate_Proxy( - IAMTimelineSrc * This, - BOOL *pVal); - - - void __RPC_STUB IAMTimelineSrc_IsNormalRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_GetDefaultFPS_Proxy( - IAMTimelineSrc * This, - double *pFPS); - - - void __RPC_STUB IAMTimelineSrc_GetDefaultFPS_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SetDefaultFPS_Proxy( - IAMTimelineSrc * This, - double FPS); - - - void __RPC_STUB IAMTimelineSrc_SetDefaultFPS_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_GetStretchMode_Proxy( - IAMTimelineSrc * This, - int *pnStretchMode); - - - void __RPC_STUB IAMTimelineSrc_GetStretchMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineSrc_SetStretchMode_Proxy( - IAMTimelineSrc * This, - int nStretchMode); - - - void __RPC_STUB IAMTimelineSrc_SetStretchMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IAMTimelineSrc_INTERFACE_DEFINED__ */ - - - #ifndef __IAMTimelineTrack_INTERFACE_DEFINED__ - #define __IAMTimelineTrack_INTERFACE_DEFINED__ - - /* interface IAMTimelineTrack */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IAMTimelineTrack; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("EAE58538-622E-11d2-8CAD-00A024580902") - IAMTimelineTrack : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SrcAdd( - IAMTimelineObj *pSource) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetNextSrc( - /* [out] */ IAMTimelineObj **ppSrc, - REFERENCE_TIME *pInOut) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetNextSrc2( - /* [out] */ IAMTimelineObj **ppSrc, - REFTIME *pInOut) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE MoveEverythingBy( - REFERENCE_TIME Start, - REFERENCE_TIME MoveBy) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE MoveEverythingBy2( - REFTIME Start, - REFTIME MoveBy) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSourcesCount( - long *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE AreYouBlank( - long *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSrcAtTime( - /* [out] */ IAMTimelineObj **ppSrc, - REFERENCE_TIME Time, - long SearchDirection) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSrcAtTime2( - /* [out] */ IAMTimelineObj **ppSrc, - REFTIME Time, - long SearchDirection) = 0; - - virtual HRESULT STDMETHODCALLTYPE InsertSpace( - REFERENCE_TIME rtStart, - REFERENCE_TIME rtEnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE InsertSpace2( - REFTIME rtStart, - REFTIME rtEnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE ZeroBetween( - REFERENCE_TIME rtStart, - REFERENCE_TIME rtEnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE ZeroBetween2( - REFTIME rtStart, - REFTIME rtEnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNextSrcEx( - IAMTimelineObj *pLast, - /* [out] */ IAMTimelineObj **ppNext) = 0; - - }; - - #else /* C style interface */ - - typedef struct IAMTimelineTrackVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineTrack * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineTrack * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineTrack * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SrcAdd )( - IAMTimelineTrack * This, - IAMTimelineObj *pSource); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetNextSrc )( - IAMTimelineTrack * This, - /* [out] */ IAMTimelineObj **ppSrc, - REFERENCE_TIME *pInOut); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetNextSrc2 )( - IAMTimelineTrack * This, - /* [out] */ IAMTimelineObj **ppSrc, - REFTIME *pInOut); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *MoveEverythingBy )( - IAMTimelineTrack * This, - REFERENCE_TIME Start, - REFERENCE_TIME MoveBy); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *MoveEverythingBy2 )( - IAMTimelineTrack * This, - REFTIME Start, - REFTIME MoveBy); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetSourcesCount )( - IAMTimelineTrack * This, - long *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *AreYouBlank )( - IAMTimelineTrack * This, - long *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetSrcAtTime )( - IAMTimelineTrack * This, - /* [out] */ IAMTimelineObj **ppSrc, - REFERENCE_TIME Time, - long SearchDirection); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetSrcAtTime2 )( - IAMTimelineTrack * This, - /* [out] */ IAMTimelineObj **ppSrc, - REFTIME Time, - long SearchDirection); - - HRESULT ( STDMETHODCALLTYPE *InsertSpace )( - IAMTimelineTrack * This, - REFERENCE_TIME rtStart, - REFERENCE_TIME rtEnd); - - HRESULT ( STDMETHODCALLTYPE *InsertSpace2 )( - IAMTimelineTrack * This, - REFTIME rtStart, - REFTIME rtEnd); - - HRESULT ( STDMETHODCALLTYPE *ZeroBetween )( - IAMTimelineTrack * This, - REFERENCE_TIME rtStart, - REFERENCE_TIME rtEnd); - - HRESULT ( STDMETHODCALLTYPE *ZeroBetween2 )( - IAMTimelineTrack * This, - REFTIME rtStart, - REFTIME rtEnd); - - HRESULT ( STDMETHODCALLTYPE *GetNextSrcEx )( - IAMTimelineTrack * This, - IAMTimelineObj *pLast, - /* [out] */ IAMTimelineObj **ppNext); - - END_INTERFACE - } IAMTimelineTrackVtbl; - - interface IAMTimelineTrack - { - CONST_VTBL struct IAMTimelineTrackVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IAMTimelineTrack_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IAMTimelineTrack_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IAMTimelineTrack_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IAMTimelineTrack_SrcAdd(This,pSource) \ - (This)->lpVtbl -> SrcAdd(This,pSource) - - #define IAMTimelineTrack_GetNextSrc(This,ppSrc,pInOut) \ - (This)->lpVtbl -> GetNextSrc(This,ppSrc,pInOut) - - #define IAMTimelineTrack_GetNextSrc2(This,ppSrc,pInOut) \ - (This)->lpVtbl -> GetNextSrc2(This,ppSrc,pInOut) - - #define IAMTimelineTrack_MoveEverythingBy(This,Start,MoveBy) \ - (This)->lpVtbl -> MoveEverythingBy(This,Start,MoveBy) - - #define IAMTimelineTrack_MoveEverythingBy2(This,Start,MoveBy) \ - (This)->lpVtbl -> MoveEverythingBy2(This,Start,MoveBy) - - #define IAMTimelineTrack_GetSourcesCount(This,pVal) \ - (This)->lpVtbl -> GetSourcesCount(This,pVal) - - #define IAMTimelineTrack_AreYouBlank(This,pVal) \ - (This)->lpVtbl -> AreYouBlank(This,pVal) - - #define IAMTimelineTrack_GetSrcAtTime(This,ppSrc,Time,SearchDirection) \ - (This)->lpVtbl -> GetSrcAtTime(This,ppSrc,Time,SearchDirection) - - #define IAMTimelineTrack_GetSrcAtTime2(This,ppSrc,Time,SearchDirection) \ - (This)->lpVtbl -> GetSrcAtTime2(This,ppSrc,Time,SearchDirection) - - #define IAMTimelineTrack_InsertSpace(This,rtStart,rtEnd) \ - (This)->lpVtbl -> InsertSpace(This,rtStart,rtEnd) - - #define IAMTimelineTrack_InsertSpace2(This,rtStart,rtEnd) \ - (This)->lpVtbl -> InsertSpace2(This,rtStart,rtEnd) - - #define IAMTimelineTrack_ZeroBetween(This,rtStart,rtEnd) \ - (This)->lpVtbl -> ZeroBetween(This,rtStart,rtEnd) - - #define IAMTimelineTrack_ZeroBetween2(This,rtStart,rtEnd) \ - (This)->lpVtbl -> ZeroBetween2(This,rtStart,rtEnd) - - #define IAMTimelineTrack_GetNextSrcEx(This,pLast,ppNext) \ - (This)->lpVtbl -> GetNextSrcEx(This,pLast,ppNext) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_SrcAdd_Proxy( - IAMTimelineTrack * This, - IAMTimelineObj *pSource); - - - void __RPC_STUB IAMTimelineTrack_SrcAdd_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_GetNextSrc_Proxy( - IAMTimelineTrack * This, - /* [out] */ IAMTimelineObj **ppSrc, - REFERENCE_TIME *pInOut); - - - void __RPC_STUB IAMTimelineTrack_GetNextSrc_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_GetNextSrc2_Proxy( - IAMTimelineTrack * This, - /* [out] */ IAMTimelineObj **ppSrc, - REFTIME *pInOut); - - - void __RPC_STUB IAMTimelineTrack_GetNextSrc2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_MoveEverythingBy_Proxy( - IAMTimelineTrack * This, - REFERENCE_TIME Start, - REFERENCE_TIME MoveBy); - - - void __RPC_STUB IAMTimelineTrack_MoveEverythingBy_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_MoveEverythingBy2_Proxy( - IAMTimelineTrack * This, - REFTIME Start, - REFTIME MoveBy); - - - void __RPC_STUB IAMTimelineTrack_MoveEverythingBy2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_GetSourcesCount_Proxy( - IAMTimelineTrack * This, - long *pVal); - - - void __RPC_STUB IAMTimelineTrack_GetSourcesCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_AreYouBlank_Proxy( - IAMTimelineTrack * This, - long *pVal); - - - void __RPC_STUB IAMTimelineTrack_AreYouBlank_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_GetSrcAtTime_Proxy( - IAMTimelineTrack * This, - /* [out] */ IAMTimelineObj **ppSrc, - REFERENCE_TIME Time, - long SearchDirection); - - - void __RPC_STUB IAMTimelineTrack_GetSrcAtTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineTrack_GetSrcAtTime2_Proxy( - IAMTimelineTrack * This, - /* [out] */ IAMTimelineObj **ppSrc, - REFTIME Time, - long SearchDirection); - - - void __RPC_STUB IAMTimelineTrack_GetSrcAtTime2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineTrack_InsertSpace_Proxy( - IAMTimelineTrack * This, - REFERENCE_TIME rtStart, - REFERENCE_TIME rtEnd); - - - void __RPC_STUB IAMTimelineTrack_InsertSpace_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineTrack_InsertSpace2_Proxy( - IAMTimelineTrack * This, - REFTIME rtStart, - REFTIME rtEnd); - - - void __RPC_STUB IAMTimelineTrack_InsertSpace2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineTrack_ZeroBetween_Proxy( - IAMTimelineTrack * This, - REFERENCE_TIME rtStart, - REFERENCE_TIME rtEnd); - - - void __RPC_STUB IAMTimelineTrack_ZeroBetween_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineTrack_ZeroBetween2_Proxy( - IAMTimelineTrack * This, - REFTIME rtStart, - REFTIME rtEnd); - - - void __RPC_STUB IAMTimelineTrack_ZeroBetween2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineTrack_GetNextSrcEx_Proxy( - IAMTimelineTrack * This, - IAMTimelineObj *pLast, - /* [out] */ IAMTimelineObj **ppNext); - - - void __RPC_STUB IAMTimelineTrack_GetNextSrcEx_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IAMTimelineTrack_INTERFACE_DEFINED__ */ - - - #ifndef __IAMTimelineVirtualTrack_INTERFACE_DEFINED__ - #define __IAMTimelineVirtualTrack_INTERFACE_DEFINED__ - - /* interface IAMTimelineVirtualTrack */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IAMTimelineVirtualTrack; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("A8ED5F80-C2C7-11d2-8D39-00A0C9441E20") - IAMTimelineVirtualTrack : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE TrackGetPriority( - long *pPriority) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetTrackDirty( void) = 0; - - }; - - #else /* C style interface */ - - typedef struct IAMTimelineVirtualTrackVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineVirtualTrack * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineVirtualTrack * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineVirtualTrack * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *TrackGetPriority )( - IAMTimelineVirtualTrack * This, - long *pPriority); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetTrackDirty )( - IAMTimelineVirtualTrack * This); - - END_INTERFACE - } IAMTimelineVirtualTrackVtbl; - - interface IAMTimelineVirtualTrack - { - CONST_VTBL struct IAMTimelineVirtualTrackVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IAMTimelineVirtualTrack_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IAMTimelineVirtualTrack_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IAMTimelineVirtualTrack_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IAMTimelineVirtualTrack_TrackGetPriority(This,pPriority) \ - (This)->lpVtbl -> TrackGetPriority(This,pPriority) - - #define IAMTimelineVirtualTrack_SetTrackDirty(This) \ - (This)->lpVtbl -> SetTrackDirty(This) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineVirtualTrack_TrackGetPriority_Proxy( - IAMTimelineVirtualTrack * This, - long *pPriority); - - - void __RPC_STUB IAMTimelineVirtualTrack_TrackGetPriority_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineVirtualTrack_SetTrackDirty_Proxy( - IAMTimelineVirtualTrack * This); - - - void __RPC_STUB IAMTimelineVirtualTrack_SetTrackDirty_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IAMTimelineVirtualTrack_INTERFACE_DEFINED__ */ - - - #ifndef __IAMTimelineComp_INTERFACE_DEFINED__ - #define __IAMTimelineComp_INTERFACE_DEFINED__ - - /* interface IAMTimelineComp */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IAMTimelineComp; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("EAE58536-622E-11d2-8CAD-00A024580902") - IAMTimelineComp : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE VTrackInsBefore( - IAMTimelineObj *pVirtualTrack, - long Priority) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE VTrackSwapPriorities( - long VirtualTrackA, - long VirtualTrackB) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE VTrackGetCount( - long *pVal) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetVTrack( - /* [out] */ IAMTimelineObj **ppVirtualTrack, - long Which) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetCountOfType( - long *pVal, - long *pValWithComps, - TIMELINE_MAJOR_TYPE MajorType) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetRecursiveLayerOfType( - /* [out] */ IAMTimelineObj **ppVirtualTrack, - long WhichLayer, - TIMELINE_MAJOR_TYPE Type) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetRecursiveLayerOfTypeI( - /* [out] */ IAMTimelineObj **ppVirtualTrack, - /* [out][in] */ long *pWhichLayer, - TIMELINE_MAJOR_TYPE Type) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNextVTrack( - IAMTimelineObj *pVirtualTrack, - /* [out] */ IAMTimelineObj **ppNextVirtualTrack) = 0; - - }; - - #else /* C style interface */ - - typedef struct IAMTimelineCompVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineComp * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineComp * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineComp * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *VTrackInsBefore )( - IAMTimelineComp * This, - IAMTimelineObj *pVirtualTrack, - long Priority); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *VTrackSwapPriorities )( - IAMTimelineComp * This, - long VirtualTrackA, - long VirtualTrackB); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *VTrackGetCount )( - IAMTimelineComp * This, - long *pVal); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetVTrack )( - IAMTimelineComp * This, - /* [out] */ IAMTimelineObj **ppVirtualTrack, - long Which); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetCountOfType )( - IAMTimelineComp * This, - long *pVal, - long *pValWithComps, - TIMELINE_MAJOR_TYPE MajorType); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetRecursiveLayerOfType )( - IAMTimelineComp * This, - /* [out] */ IAMTimelineObj **ppVirtualTrack, - long WhichLayer, - TIMELINE_MAJOR_TYPE Type); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetRecursiveLayerOfTypeI )( - IAMTimelineComp * This, - /* [out] */ IAMTimelineObj **ppVirtualTrack, - /* [out][in] */ long *pWhichLayer, - TIMELINE_MAJOR_TYPE Type); - - HRESULT ( STDMETHODCALLTYPE *GetNextVTrack )( - IAMTimelineComp * This, - IAMTimelineObj *pVirtualTrack, - /* [out] */ IAMTimelineObj **ppNextVirtualTrack); - - END_INTERFACE - } IAMTimelineCompVtbl; - - interface IAMTimelineComp - { - CONST_VTBL struct IAMTimelineCompVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IAMTimelineComp_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IAMTimelineComp_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IAMTimelineComp_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IAMTimelineComp_VTrackInsBefore(This,pVirtualTrack,Priority) \ - (This)->lpVtbl -> VTrackInsBefore(This,pVirtualTrack,Priority) - - #define IAMTimelineComp_VTrackSwapPriorities(This,VirtualTrackA,VirtualTrackB) \ - (This)->lpVtbl -> VTrackSwapPriorities(This,VirtualTrackA,VirtualTrackB) - - #define IAMTimelineComp_VTrackGetCount(This,pVal) \ - (This)->lpVtbl -> VTrackGetCount(This,pVal) - - #define IAMTimelineComp_GetVTrack(This,ppVirtualTrack,Which) \ - (This)->lpVtbl -> GetVTrack(This,ppVirtualTrack,Which) - - #define IAMTimelineComp_GetCountOfType(This,pVal,pValWithComps,MajorType) \ - (This)->lpVtbl -> GetCountOfType(This,pVal,pValWithComps,MajorType) - - #define IAMTimelineComp_GetRecursiveLayerOfType(This,ppVirtualTrack,WhichLayer,Type) \ - (This)->lpVtbl -> GetRecursiveLayerOfType(This,ppVirtualTrack,WhichLayer,Type) - - #define IAMTimelineComp_GetRecursiveLayerOfTypeI(This,ppVirtualTrack,pWhichLayer,Type) \ - (This)->lpVtbl -> GetRecursiveLayerOfTypeI(This,ppVirtualTrack,pWhichLayer,Type) - - #define IAMTimelineComp_GetNextVTrack(This,pVirtualTrack,ppNextVirtualTrack) \ - (This)->lpVtbl -> GetNextVTrack(This,pVirtualTrack,ppNextVirtualTrack) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineComp_VTrackInsBefore_Proxy( - IAMTimelineComp * This, - IAMTimelineObj *pVirtualTrack, - long Priority); - - - void __RPC_STUB IAMTimelineComp_VTrackInsBefore_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineComp_VTrackSwapPriorities_Proxy( - IAMTimelineComp * This, - long VirtualTrackA, - long VirtualTrackB); - - - void __RPC_STUB IAMTimelineComp_VTrackSwapPriorities_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineComp_VTrackGetCount_Proxy( - IAMTimelineComp * This, - long *pVal); - - - void __RPC_STUB IAMTimelineComp_VTrackGetCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineComp_GetVTrack_Proxy( - IAMTimelineComp * This, - /* [out] */ IAMTimelineObj **ppVirtualTrack, - long Which); - - - void __RPC_STUB IAMTimelineComp_GetVTrack_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineComp_GetCountOfType_Proxy( - IAMTimelineComp * This, - long *pVal, - long *pValWithComps, - TIMELINE_MAJOR_TYPE MajorType); - - - void __RPC_STUB IAMTimelineComp_GetCountOfType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineComp_GetRecursiveLayerOfType_Proxy( - IAMTimelineComp * This, - /* [out] */ IAMTimelineObj **ppVirtualTrack, - long WhichLayer, - TIMELINE_MAJOR_TYPE Type); - - - void __RPC_STUB IAMTimelineComp_GetRecursiveLayerOfType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineComp_GetRecursiveLayerOfTypeI_Proxy( - IAMTimelineComp * This, - /* [out] */ IAMTimelineObj **ppVirtualTrack, - /* [out][in] */ long *pWhichLayer, - TIMELINE_MAJOR_TYPE Type); - - - void __RPC_STUB IAMTimelineComp_GetRecursiveLayerOfTypeI_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineComp_GetNextVTrack_Proxy( - IAMTimelineComp * This, - IAMTimelineObj *pVirtualTrack, - /* [out] */ IAMTimelineObj **ppNextVirtualTrack); - - - void __RPC_STUB IAMTimelineComp_GetNextVTrack_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IAMTimelineComp_INTERFACE_DEFINED__ */ - - - #ifndef __IAMTimelineGroup_INTERFACE_DEFINED__ - #define __IAMTimelineGroup_INTERFACE_DEFINED__ - - /* interface IAMTimelineGroup */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IAMTimelineGroup; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("9EED4F00-B8A6-11d2-8023-00C0DF10D434") - IAMTimelineGroup : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetTimeline( - IAMTimeline *pTimeline) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetTimeline( - /* [out] */ IAMTimeline **ppTimeline) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetPriority( - long *pPriority) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMediaType( - /* [out] */ AM_MEDIA_TYPE *__MIDL_0040) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMediaType( - /* [in] */ AM_MEDIA_TYPE *__MIDL_0041) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetOutputFPS( - double FPS) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetOutputFPS( - double *pFPS) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetGroupName( - BSTR pGroupName) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetGroupName( - /* [retval][out] */ BSTR *pGroupName) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetPreviewMode( - BOOL fPreview) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetPreviewMode( - BOOL *pfPreview) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMediaTypeForVB( - /* [in] */ long Val) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetOutputBuffering( - /* [out] */ int *pnBuffer) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetOutputBuffering( - /* [in] */ int nBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetSmartRecompressFormat( - long *pFormat) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSmartRecompressFormat( - long **ppFormat) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsSmartRecompressFormatSet( - BOOL *pVal) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsRecompressFormatDirty( - BOOL *pVal) = 0; - - virtual HRESULT STDMETHODCALLTYPE ClearRecompressFormatDirty( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetRecompFormatFromSource( - IAMTimelineSrc *pSource) = 0; - - }; - - #else /* C style interface */ - - typedef struct IAMTimelineGroupVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimelineGroup * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimelineGroup * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimelineGroup * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetTimeline )( - IAMTimelineGroup * This, - IAMTimeline *pTimeline); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetTimeline )( - IAMTimelineGroup * This, - /* [out] */ IAMTimeline **ppTimeline); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetPriority )( - IAMTimelineGroup * This, - long *pPriority); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMediaType )( - IAMTimelineGroup * This, - /* [out] */ AM_MEDIA_TYPE *__MIDL_0040); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMediaType )( - IAMTimelineGroup * This, - /* [in] */ AM_MEDIA_TYPE *__MIDL_0041); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetOutputFPS )( - IAMTimelineGroup * This, - double FPS); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetOutputFPS )( - IAMTimelineGroup * This, - double *pFPS); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetGroupName )( - IAMTimelineGroup * This, - BSTR pGroupName); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetGroupName )( - IAMTimelineGroup * This, - /* [retval][out] */ BSTR *pGroupName); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetPreviewMode )( - IAMTimelineGroup * This, - BOOL fPreview); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetPreviewMode )( - IAMTimelineGroup * This, - BOOL *pfPreview); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMediaTypeForVB )( - IAMTimelineGroup * This, - /* [in] */ long Val); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetOutputBuffering )( - IAMTimelineGroup * This, - /* [out] */ int *pnBuffer); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetOutputBuffering )( - IAMTimelineGroup * This, - /* [in] */ int nBuffer); - - HRESULT ( STDMETHODCALLTYPE *SetSmartRecompressFormat )( - IAMTimelineGroup * This, - long *pFormat); - - HRESULT ( STDMETHODCALLTYPE *GetSmartRecompressFormat )( - IAMTimelineGroup * This, - long **ppFormat); - - HRESULT ( STDMETHODCALLTYPE *IsSmartRecompressFormatSet )( - IAMTimelineGroup * This, - BOOL *pVal); - - HRESULT ( STDMETHODCALLTYPE *IsRecompressFormatDirty )( - IAMTimelineGroup * This, - BOOL *pVal); - - HRESULT ( STDMETHODCALLTYPE *ClearRecompressFormatDirty )( - IAMTimelineGroup * This); - - HRESULT ( STDMETHODCALLTYPE *SetRecompFormatFromSource )( - IAMTimelineGroup * This, - IAMTimelineSrc *pSource); - - END_INTERFACE - } IAMTimelineGroupVtbl; - - interface IAMTimelineGroup - { - CONST_VTBL struct IAMTimelineGroupVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IAMTimelineGroup_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IAMTimelineGroup_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IAMTimelineGroup_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IAMTimelineGroup_SetTimeline(This,pTimeline) \ - (This)->lpVtbl -> SetTimeline(This,pTimeline) - - #define IAMTimelineGroup_GetTimeline(This,ppTimeline) \ - (This)->lpVtbl -> GetTimeline(This,ppTimeline) - - #define IAMTimelineGroup_GetPriority(This,pPriority) \ - (This)->lpVtbl -> GetPriority(This,pPriority) - - #define IAMTimelineGroup_GetMediaType(This,__MIDL_0040) \ - (This)->lpVtbl -> GetMediaType(This,__MIDL_0040) - - #define IAMTimelineGroup_SetMediaType(This,__MIDL_0041) \ - (This)->lpVtbl -> SetMediaType(This,__MIDL_0041) - - #define IAMTimelineGroup_SetOutputFPS(This,FPS) \ - (This)->lpVtbl -> SetOutputFPS(This,FPS) - - #define IAMTimelineGroup_GetOutputFPS(This,pFPS) \ - (This)->lpVtbl -> GetOutputFPS(This,pFPS) - - #define IAMTimelineGroup_SetGroupName(This,pGroupName) \ - (This)->lpVtbl -> SetGroupName(This,pGroupName) - - #define IAMTimelineGroup_GetGroupName(This,pGroupName) \ - (This)->lpVtbl -> GetGroupName(This,pGroupName) - - #define IAMTimelineGroup_SetPreviewMode(This,fPreview) \ - (This)->lpVtbl -> SetPreviewMode(This,fPreview) - - #define IAMTimelineGroup_GetPreviewMode(This,pfPreview) \ - (This)->lpVtbl -> GetPreviewMode(This,pfPreview) - - #define IAMTimelineGroup_SetMediaTypeForVB(This,Val) \ - (This)->lpVtbl -> SetMediaTypeForVB(This,Val) - - #define IAMTimelineGroup_GetOutputBuffering(This,pnBuffer) \ - (This)->lpVtbl -> GetOutputBuffering(This,pnBuffer) - - #define IAMTimelineGroup_SetOutputBuffering(This,nBuffer) \ - (This)->lpVtbl -> SetOutputBuffering(This,nBuffer) - - #define IAMTimelineGroup_SetSmartRecompressFormat(This,pFormat) \ - (This)->lpVtbl -> SetSmartRecompressFormat(This,pFormat) - - #define IAMTimelineGroup_GetSmartRecompressFormat(This,ppFormat) \ - (This)->lpVtbl -> GetSmartRecompressFormat(This,ppFormat) - - #define IAMTimelineGroup_IsSmartRecompressFormatSet(This,pVal) \ - (This)->lpVtbl -> IsSmartRecompressFormatSet(This,pVal) - - #define IAMTimelineGroup_IsRecompressFormatDirty(This,pVal) \ - (This)->lpVtbl -> IsRecompressFormatDirty(This,pVal) - - #define IAMTimelineGroup_ClearRecompressFormatDirty(This) \ - (This)->lpVtbl -> ClearRecompressFormatDirty(This) - - #define IAMTimelineGroup_SetRecompFormatFromSource(This,pSource) \ - (This)->lpVtbl -> SetRecompFormatFromSource(This,pSource) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetTimeline_Proxy( - IAMTimelineGroup * This, - IAMTimeline *pTimeline); - - - void __RPC_STUB IAMTimelineGroup_SetTimeline_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_GetTimeline_Proxy( - IAMTimelineGroup * This, - /* [out] */ IAMTimeline **ppTimeline); - - - void __RPC_STUB IAMTimelineGroup_GetTimeline_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_GetPriority_Proxy( - IAMTimelineGroup * This, - long *pPriority); - - - void __RPC_STUB IAMTimelineGroup_GetPriority_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_GetMediaType_Proxy( - IAMTimelineGroup * This, - /* [out] */ AM_MEDIA_TYPE *__MIDL_0040); - - - void __RPC_STUB IAMTimelineGroup_GetMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetMediaType_Proxy( - IAMTimelineGroup * This, - /* [in] */ AM_MEDIA_TYPE *__MIDL_0041); - - - void __RPC_STUB IAMTimelineGroup_SetMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetOutputFPS_Proxy( - IAMTimelineGroup * This, - double FPS); - - - void __RPC_STUB IAMTimelineGroup_SetOutputFPS_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_GetOutputFPS_Proxy( - IAMTimelineGroup * This, - double *pFPS); - - - void __RPC_STUB IAMTimelineGroup_GetOutputFPS_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetGroupName_Proxy( - IAMTimelineGroup * This, - BSTR pGroupName); - - - void __RPC_STUB IAMTimelineGroup_SetGroupName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_GetGroupName_Proxy( - IAMTimelineGroup * This, - /* [retval][out] */ BSTR *pGroupName); - - - void __RPC_STUB IAMTimelineGroup_GetGroupName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetPreviewMode_Proxy( - IAMTimelineGroup * This, - BOOL fPreview); - - - void __RPC_STUB IAMTimelineGroup_SetPreviewMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_GetPreviewMode_Proxy( - IAMTimelineGroup * This, - BOOL *pfPreview); - - - void __RPC_STUB IAMTimelineGroup_GetPreviewMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetMediaTypeForVB_Proxy( - IAMTimelineGroup * This, - /* [in] */ long Val); - - - void __RPC_STUB IAMTimelineGroup_SetMediaTypeForVB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_GetOutputBuffering_Proxy( - IAMTimelineGroup * This, - /* [out] */ int *pnBuffer); - - - void __RPC_STUB IAMTimelineGroup_GetOutputBuffering_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetOutputBuffering_Proxy( - IAMTimelineGroup * This, - /* [in] */ int nBuffer); - - - void __RPC_STUB IAMTimelineGroup_SetOutputBuffering_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetSmartRecompressFormat_Proxy( - IAMTimelineGroup * This, - long *pFormat); - - - void __RPC_STUB IAMTimelineGroup_SetSmartRecompressFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineGroup_GetSmartRecompressFormat_Proxy( - IAMTimelineGroup * This, - long **ppFormat); - - - void __RPC_STUB IAMTimelineGroup_GetSmartRecompressFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineGroup_IsSmartRecompressFormatSet_Proxy( - IAMTimelineGroup * This, - BOOL *pVal); - - - void __RPC_STUB IAMTimelineGroup_IsSmartRecompressFormatSet_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineGroup_IsRecompressFormatDirty_Proxy( - IAMTimelineGroup * This, - BOOL *pVal); - - - void __RPC_STUB IAMTimelineGroup_IsRecompressFormatDirty_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineGroup_ClearRecompressFormatDirty_Proxy( - IAMTimelineGroup * This); - - - void __RPC_STUB IAMTimelineGroup_ClearRecompressFormatDirty_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimelineGroup_SetRecompFormatFromSource_Proxy( - IAMTimelineGroup * This, - IAMTimelineSrc *pSource); - - - void __RPC_STUB IAMTimelineGroup_SetRecompFormatFromSource_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IAMTimelineGroup_INTERFACE_DEFINED__ */ - - - #ifndef __IAMTimeline_INTERFACE_DEFINED__ - #define __IAMTimeline_INTERFACE_DEFINED__ - - /* interface IAMTimeline */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IAMTimeline; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("78530B74-61F9-11D2-8CAD-00A024580902") - IAMTimeline : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE CreateEmptyNode( - /* [out] */ IAMTimelineObj **ppObj, - TIMELINE_MAJOR_TYPE Type) = 0; - - virtual HRESULT STDMETHODCALLTYPE AddGroup( - IAMTimelineObj *pGroup) = 0; - - virtual HRESULT STDMETHODCALLTYPE RemGroupFromList( - IAMTimelineObj *pGroup) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetGroup( - /* [out] */ IAMTimelineObj **ppGroup, - long WhichGroup) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetGroupCount( - long *pCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE ClearAllGroups( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInsertMode( - long *pMode) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetInsertMode( - long Mode) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE EnableTransitions( - BOOL fEnabled) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE TransitionsEnabled( - BOOL *pfEnabled) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE EnableEffects( - BOOL fEnabled) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE EffectsEnabled( - BOOL *pfEnabled) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetInterestRange( - REFERENCE_TIME Start, - REFERENCE_TIME Stop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDuration( - REFERENCE_TIME *pDuration) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDuration2( - double *pDuration) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetDefaultFPS( - double FPS) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDefaultFPS( - double *pFPS) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE IsDirty( - BOOL *pDirty) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDirtyRange( - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetCountOfType( - long Group, - long *pVal, - long *pValWithComps, - TIMELINE_MAJOR_TYPE MajorType) = 0; - - virtual HRESULT STDMETHODCALLTYPE ValidateSourceNames( - long ValidateFlags, - IMediaLocator *pOverride, - LONG_PTR NotifyEventHandle) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDefaultTransition( - GUID *pGuid) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDefaultTransition( - GUID *pGuid) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDefaultEffect( - GUID *pGuid) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDefaultEffect( - GUID *pGuid) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDefaultTransitionB( - BSTR pGuid) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDefaultTransitionB( - /* [retval][out] */ BSTR *pGuid) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDefaultEffectB( - BSTR pGuid) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDefaultEffectB( - /* [retval][out] */ BSTR *pGuid) = 0; - - }; - - #else /* C style interface */ - - typedef struct IAMTimelineVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimeline * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimeline * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimeline * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *CreateEmptyNode )( - IAMTimeline * This, - /* [out] */ IAMTimelineObj **ppObj, - TIMELINE_MAJOR_TYPE Type); - - HRESULT ( STDMETHODCALLTYPE *AddGroup )( - IAMTimeline * This, - IAMTimelineObj *pGroup); - - HRESULT ( STDMETHODCALLTYPE *RemGroupFromList )( - IAMTimeline * This, - IAMTimelineObj *pGroup); - - HRESULT ( STDMETHODCALLTYPE *GetGroup )( - IAMTimeline * This, - /* [out] */ IAMTimelineObj **ppGroup, - long WhichGroup); - - HRESULT ( STDMETHODCALLTYPE *GetGroupCount )( - IAMTimeline * This, - long *pCount); - - HRESULT ( STDMETHODCALLTYPE *ClearAllGroups )( - IAMTimeline * This); - - HRESULT ( STDMETHODCALLTYPE *GetInsertMode )( - IAMTimeline * This, - long *pMode); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetInsertMode )( - IAMTimeline * This, - long Mode); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *EnableTransitions )( - IAMTimeline * This, - BOOL fEnabled); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *TransitionsEnabled )( - IAMTimeline * This, - BOOL *pfEnabled); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *EnableEffects )( - IAMTimeline * This, - BOOL fEnabled); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *EffectsEnabled )( - IAMTimeline * This, - BOOL *pfEnabled); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetInterestRange )( - IAMTimeline * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetDuration )( - IAMTimeline * This, - REFERENCE_TIME *pDuration); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetDuration2 )( - IAMTimeline * This, - double *pDuration); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetDefaultFPS )( - IAMTimeline * This, - double FPS); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetDefaultFPS )( - IAMTimeline * This, - double *pFPS); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *IsDirty )( - IAMTimeline * This, - BOOL *pDirty); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetDirtyRange )( - IAMTimeline * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetCountOfType )( - IAMTimeline * This, - long Group, - long *pVal, - long *pValWithComps, - TIMELINE_MAJOR_TYPE MajorType); - - HRESULT ( STDMETHODCALLTYPE *ValidateSourceNames )( - IAMTimeline * This, - long ValidateFlags, - IMediaLocator *pOverride, - LONG_PTR NotifyEventHandle); - - HRESULT ( STDMETHODCALLTYPE *SetDefaultTransition )( - IAMTimeline * This, - GUID *pGuid); - - HRESULT ( STDMETHODCALLTYPE *GetDefaultTransition )( - IAMTimeline * This, - GUID *pGuid); - - HRESULT ( STDMETHODCALLTYPE *SetDefaultEffect )( - IAMTimeline * This, - GUID *pGuid); - - HRESULT ( STDMETHODCALLTYPE *GetDefaultEffect )( - IAMTimeline * This, - GUID *pGuid); - - HRESULT ( STDMETHODCALLTYPE *SetDefaultTransitionB )( - IAMTimeline * This, - BSTR pGuid); - - HRESULT ( STDMETHODCALLTYPE *GetDefaultTransitionB )( - IAMTimeline * This, - /* [retval][out] */ BSTR *pGuid); - - HRESULT ( STDMETHODCALLTYPE *SetDefaultEffectB )( - IAMTimeline * This, - BSTR pGuid); - - HRESULT ( STDMETHODCALLTYPE *GetDefaultEffectB )( - IAMTimeline * This, - /* [retval][out] */ BSTR *pGuid); - - END_INTERFACE - } IAMTimelineVtbl; - - interface IAMTimeline - { - CONST_VTBL struct IAMTimelineVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IAMTimeline_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IAMTimeline_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IAMTimeline_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IAMTimeline_CreateEmptyNode(This,ppObj,Type) \ - (This)->lpVtbl -> CreateEmptyNode(This,ppObj,Type) - - #define IAMTimeline_AddGroup(This,pGroup) \ - (This)->lpVtbl -> AddGroup(This,pGroup) - - #define IAMTimeline_RemGroupFromList(This,pGroup) \ - (This)->lpVtbl -> RemGroupFromList(This,pGroup) - - #define IAMTimeline_GetGroup(This,ppGroup,WhichGroup) \ - (This)->lpVtbl -> GetGroup(This,ppGroup,WhichGroup) - - #define IAMTimeline_GetGroupCount(This,pCount) \ - (This)->lpVtbl -> GetGroupCount(This,pCount) - - #define IAMTimeline_ClearAllGroups(This) \ - (This)->lpVtbl -> ClearAllGroups(This) - - #define IAMTimeline_GetInsertMode(This,pMode) \ - (This)->lpVtbl -> GetInsertMode(This,pMode) - - #define IAMTimeline_SetInsertMode(This,Mode) \ - (This)->lpVtbl -> SetInsertMode(This,Mode) - - #define IAMTimeline_EnableTransitions(This,fEnabled) \ - (This)->lpVtbl -> EnableTransitions(This,fEnabled) - - #define IAMTimeline_TransitionsEnabled(This,pfEnabled) \ - (This)->lpVtbl -> TransitionsEnabled(This,pfEnabled) - - #define IAMTimeline_EnableEffects(This,fEnabled) \ - (This)->lpVtbl -> EnableEffects(This,fEnabled) - - #define IAMTimeline_EffectsEnabled(This,pfEnabled) \ - (This)->lpVtbl -> EffectsEnabled(This,pfEnabled) - - #define IAMTimeline_SetInterestRange(This,Start,Stop) \ - (This)->lpVtbl -> SetInterestRange(This,Start,Stop) - - #define IAMTimeline_GetDuration(This,pDuration) \ - (This)->lpVtbl -> GetDuration(This,pDuration) - - #define IAMTimeline_GetDuration2(This,pDuration) \ - (This)->lpVtbl -> GetDuration2(This,pDuration) - - #define IAMTimeline_SetDefaultFPS(This,FPS) \ - (This)->lpVtbl -> SetDefaultFPS(This,FPS) - - #define IAMTimeline_GetDefaultFPS(This,pFPS) \ - (This)->lpVtbl -> GetDefaultFPS(This,pFPS) - - #define IAMTimeline_IsDirty(This,pDirty) \ - (This)->lpVtbl -> IsDirty(This,pDirty) - - #define IAMTimeline_GetDirtyRange(This,pStart,pStop) \ - (This)->lpVtbl -> GetDirtyRange(This,pStart,pStop) - - #define IAMTimeline_GetCountOfType(This,Group,pVal,pValWithComps,MajorType) \ - (This)->lpVtbl -> GetCountOfType(This,Group,pVal,pValWithComps,MajorType) - - #define IAMTimeline_ValidateSourceNames(This,ValidateFlags,pOverride,NotifyEventHandle) \ - (This)->lpVtbl -> ValidateSourceNames(This,ValidateFlags,pOverride,NotifyEventHandle) - - #define IAMTimeline_SetDefaultTransition(This,pGuid) \ - (This)->lpVtbl -> SetDefaultTransition(This,pGuid) - - #define IAMTimeline_GetDefaultTransition(This,pGuid) \ - (This)->lpVtbl -> GetDefaultTransition(This,pGuid) - - #define IAMTimeline_SetDefaultEffect(This,pGuid) \ - (This)->lpVtbl -> SetDefaultEffect(This,pGuid) - - #define IAMTimeline_GetDefaultEffect(This,pGuid) \ - (This)->lpVtbl -> GetDefaultEffect(This,pGuid) - - #define IAMTimeline_SetDefaultTransitionB(This,pGuid) \ - (This)->lpVtbl -> SetDefaultTransitionB(This,pGuid) - - #define IAMTimeline_GetDefaultTransitionB(This,pGuid) \ - (This)->lpVtbl -> GetDefaultTransitionB(This,pGuid) - - #define IAMTimeline_SetDefaultEffectB(This,pGuid) \ - (This)->lpVtbl -> SetDefaultEffectB(This,pGuid) - - #define IAMTimeline_GetDefaultEffectB(This,pGuid) \ - (This)->lpVtbl -> GetDefaultEffectB(This,pGuid) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_CreateEmptyNode_Proxy( - IAMTimeline * This, - /* [out] */ IAMTimelineObj **ppObj, - TIMELINE_MAJOR_TYPE Type); - - - void __RPC_STUB IAMTimeline_CreateEmptyNode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimeline_AddGroup_Proxy( - IAMTimeline * This, - IAMTimelineObj *pGroup); - - - void __RPC_STUB IAMTimeline_AddGroup_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimeline_RemGroupFromList_Proxy( - IAMTimeline * This, - IAMTimelineObj *pGroup); - - - void __RPC_STUB IAMTimeline_RemGroupFromList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimeline_GetGroup_Proxy( - IAMTimeline * This, - /* [out] */ IAMTimelineObj **ppGroup, - long WhichGroup); - - - void __RPC_STUB IAMTimeline_GetGroup_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimeline_GetGroupCount_Proxy( - IAMTimeline * This, - long *pCount); - - - void __RPC_STUB IAMTimeline_GetGroupCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimeline_ClearAllGroups_Proxy( - IAMTimeline * This); - - - void __RPC_STUB IAMTimeline_ClearAllGroups_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimeline_GetInsertMode_Proxy( - IAMTimeline * This, - long *pMode); - - - void __RPC_STUB IAMTimeline_GetInsertMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_SetInsertMode_Proxy( - IAMTimeline * This, - long Mode); - - - void __RPC_STUB IAMTimeline_SetInsertMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_EnableTransitions_Proxy( - IAMTimeline * This, - BOOL fEnabled); - - - void __RPC_STUB IAMTimeline_EnableTransitions_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_TransitionsEnabled_Proxy( - IAMTimeline * This, - BOOL *pfEnabled); - - - void __RPC_STUB IAMTimeline_TransitionsEnabled_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_EnableEffects_Proxy( - IAMTimeline * This, - BOOL fEnabled); - - - void __RPC_STUB IAMTimeline_EnableEffects_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_EffectsEnabled_Proxy( - IAMTimeline * This, - BOOL *pfEnabled); - - - void __RPC_STUB IAMTimeline_EffectsEnabled_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_SetInterestRange_Proxy( - IAMTimeline * This, - REFERENCE_TIME Start, - REFERENCE_TIME Stop); - - - void __RPC_STUB IAMTimeline_SetInterestRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_GetDuration_Proxy( - IAMTimeline * This, - REFERENCE_TIME *pDuration); - - - void __RPC_STUB IAMTimeline_GetDuration_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_GetDuration2_Proxy( - IAMTimeline * This, - double *pDuration); - - - void __RPC_STUB IAMTimeline_GetDuration2_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_SetDefaultFPS_Proxy( - IAMTimeline * This, - double FPS); - - - void __RPC_STUB IAMTimeline_SetDefaultFPS_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_GetDefaultFPS_Proxy( - IAMTimeline * This, - double *pFPS); - - - void __RPC_STUB IAMTimeline_GetDefaultFPS_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_IsDirty_Proxy( - IAMTimeline * This, - BOOL *pDirty); - - - void __RPC_STUB IAMTimeline_IsDirty_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_GetDirtyRange_Proxy( - IAMTimeline * This, - REFERENCE_TIME *pStart, - REFERENCE_TIME *pStop); - - - void __RPC_STUB IAMTimeline_GetDirtyRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMTimeline_GetCountOfType_Proxy( - IAMTimeline * This, - long Group, - long *pVal, - long *pValWithComps, - TIMELINE_MAJOR_TYPE MajorType); - - - void __RPC_STUB IAMTimeline_GetCountOfType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimeline_ValidateSourceNames_Proxy( - IAMTimeline * This, - long ValidateFlags, - IMediaLocator *pOverride, - LONG_PTR NotifyEventHandle); - - - void __RPC_STUB IAMTimeline_ValidateSourceNames_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimeline_SetDefaultTransition_Proxy( - IAMTimeline * This, - GUID *pGuid); - - - void __RPC_STUB IAMTimeline_SetDefaultTransition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimeline_GetDefaultTransition_Proxy( - IAMTimeline * This, - GUID *pGuid); - - - void __RPC_STUB IAMTimeline_GetDefaultTransition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimeline_SetDefaultEffect_Proxy( - IAMTimeline * This, - GUID *pGuid); - - - void __RPC_STUB IAMTimeline_SetDefaultEffect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimeline_GetDefaultEffect_Proxy( - IAMTimeline * This, - GUID *pGuid); - - - void __RPC_STUB IAMTimeline_GetDefaultEffect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimeline_SetDefaultTransitionB_Proxy( - IAMTimeline * This, - BSTR pGuid); - - - void __RPC_STUB IAMTimeline_SetDefaultTransitionB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimeline_GetDefaultTransitionB_Proxy( - IAMTimeline * This, - /* [retval][out] */ BSTR *pGuid); - - - void __RPC_STUB IAMTimeline_GetDefaultTransitionB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimeline_SetDefaultEffectB_Proxy( - IAMTimeline * This, - BSTR pGuid); - - - void __RPC_STUB IAMTimeline_SetDefaultEffectB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IAMTimeline_GetDefaultEffectB_Proxy( - IAMTimeline * This, - /* [retval][out] */ BSTR *pGuid); - - - void __RPC_STUB IAMTimeline_GetDefaultEffectB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IAMTimeline_INTERFACE_DEFINED__ */ - - - #ifndef __IXml2Dex_INTERFACE_DEFINED__ - #define __IXml2Dex_INTERFACE_DEFINED__ - - /* interface IXml2Dex */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IXml2Dex; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("18C628ED-962A-11D2-8D08-00A0C9441E20") - IXml2Dex : public IDispatch - { - public: - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CreateGraphFromFile( - /* [out] */ IUnknown **ppGraph, - IUnknown *pTimeline, - BSTR Filename) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE WriteGrfFile( - IUnknown *pGraph, - BSTR FileName) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE WriteXMLFile( - IUnknown *pTimeline, - BSTR FileName) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ReadXMLFile( - IUnknown *pTimeline, - BSTR XMLName) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Delete( - IUnknown *pTimeline, - double dStart, - double dEnd) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE WriteXMLPart( - IUnknown *pTimeline, - double dStart, - double dEnd, - BSTR FileName) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE PasteXMLFile( - IUnknown *pTimeline, - double dStart, - BSTR FileName) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CopyXML( - IUnknown *pTimeline, - double dStart, - double dEnd) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE PasteXML( - IUnknown *pTimeline, - double dStart) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Reset( void) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ReadXML( - IUnknown *pTimeline, - IUnknown *pXML) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE WriteXML( - IUnknown *pTimeline, - BSTR *pbstrXML) = 0; - - }; - - #else /* C style interface */ - - typedef struct IXml2DexVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IXml2Dex * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IXml2Dex * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IXml2Dex * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IXml2Dex * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IXml2Dex * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IXml2Dex * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IXml2Dex * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CreateGraphFromFile )( - IXml2Dex * This, - /* [out] */ IUnknown **ppGraph, - IUnknown *pTimeline, - BSTR Filename); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *WriteGrfFile )( - IXml2Dex * This, - IUnknown *pGraph, - BSTR FileName); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *WriteXMLFile )( - IXml2Dex * This, - IUnknown *pTimeline, - BSTR FileName); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *ReadXMLFile )( - IXml2Dex * This, - IUnknown *pTimeline, - BSTR XMLName); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Delete )( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart, - double dEnd); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *WriteXMLPart )( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart, - double dEnd, - BSTR FileName); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *PasteXMLFile )( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart, - BSTR FileName); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CopyXML )( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart, - double dEnd); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *PasteXML )( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Reset )( - IXml2Dex * This); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *ReadXML )( - IXml2Dex * This, - IUnknown *pTimeline, - IUnknown *pXML); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *WriteXML )( - IXml2Dex * This, - IUnknown *pTimeline, - BSTR *pbstrXML); - - END_INTERFACE - } IXml2DexVtbl; - - interface IXml2Dex - { - CONST_VTBL struct IXml2DexVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IXml2Dex_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IXml2Dex_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IXml2Dex_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IXml2Dex_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IXml2Dex_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IXml2Dex_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IXml2Dex_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IXml2Dex_CreateGraphFromFile(This,ppGraph,pTimeline,Filename) \ - (This)->lpVtbl -> CreateGraphFromFile(This,ppGraph,pTimeline,Filename) - - #define IXml2Dex_WriteGrfFile(This,pGraph,FileName) \ - (This)->lpVtbl -> WriteGrfFile(This,pGraph,FileName) - - #define IXml2Dex_WriteXMLFile(This,pTimeline,FileName) \ - (This)->lpVtbl -> WriteXMLFile(This,pTimeline,FileName) - - #define IXml2Dex_ReadXMLFile(This,pTimeline,XMLName) \ - (This)->lpVtbl -> ReadXMLFile(This,pTimeline,XMLName) - - #define IXml2Dex_Delete(This,pTimeline,dStart,dEnd) \ - (This)->lpVtbl -> Delete(This,pTimeline,dStart,dEnd) - - #define IXml2Dex_WriteXMLPart(This,pTimeline,dStart,dEnd,FileName) \ - (This)->lpVtbl -> WriteXMLPart(This,pTimeline,dStart,dEnd,FileName) - - #define IXml2Dex_PasteXMLFile(This,pTimeline,dStart,FileName) \ - (This)->lpVtbl -> PasteXMLFile(This,pTimeline,dStart,FileName) - - #define IXml2Dex_CopyXML(This,pTimeline,dStart,dEnd) \ - (This)->lpVtbl -> CopyXML(This,pTimeline,dStart,dEnd) - - #define IXml2Dex_PasteXML(This,pTimeline,dStart) \ - (This)->lpVtbl -> PasteXML(This,pTimeline,dStart) - - #define IXml2Dex_Reset(This) \ - (This)->lpVtbl -> Reset(This) - - #define IXml2Dex_ReadXML(This,pTimeline,pXML) \ - (This)->lpVtbl -> ReadXML(This,pTimeline,pXML) - - #define IXml2Dex_WriteXML(This,pTimeline,pbstrXML) \ - (This)->lpVtbl -> WriteXML(This,pTimeline,pbstrXML) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_CreateGraphFromFile_Proxy( - IXml2Dex * This, - /* [out] */ IUnknown **ppGraph, - IUnknown *pTimeline, - BSTR Filename); - - - void __RPC_STUB IXml2Dex_CreateGraphFromFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_WriteGrfFile_Proxy( - IXml2Dex * This, - IUnknown *pGraph, - BSTR FileName); - - - void __RPC_STUB IXml2Dex_WriteGrfFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_WriteXMLFile_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - BSTR FileName); - - - void __RPC_STUB IXml2Dex_WriteXMLFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_ReadXMLFile_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - BSTR XMLName); - - - void __RPC_STUB IXml2Dex_ReadXMLFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_Delete_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart, - double dEnd); - - - void __RPC_STUB IXml2Dex_Delete_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_WriteXMLPart_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart, - double dEnd, - BSTR FileName); - - - void __RPC_STUB IXml2Dex_WriteXMLPart_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_PasteXMLFile_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart, - BSTR FileName); - - - void __RPC_STUB IXml2Dex_PasteXMLFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_CopyXML_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart, - double dEnd); - - - void __RPC_STUB IXml2Dex_CopyXML_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_PasteXML_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - double dStart); - - - void __RPC_STUB IXml2Dex_PasteXML_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_Reset_Proxy( - IXml2Dex * This); - - - void __RPC_STUB IXml2Dex_Reset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_ReadXML_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - IUnknown *pXML); - - - void __RPC_STUB IXml2Dex_ReadXML_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IXml2Dex_WriteXML_Proxy( - IXml2Dex * This, - IUnknown *pTimeline, - BSTR *pbstrXML); - - - void __RPC_STUB IXml2Dex_WriteXML_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IXml2Dex_INTERFACE_DEFINED__ */ - - - #ifndef __IAMErrorLog_INTERFACE_DEFINED__ - #define __IAMErrorLog_INTERFACE_DEFINED__ - - /* interface IAMErrorLog */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IAMErrorLog; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("E43E73A2-0EFA-11d3-9601-00A0C9441E20") - IAMErrorLog : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LogError( - long Severity, - BSTR pErrorString, - long ErrorCode, - long hresult, - /* [in] */ VARIANT *pExtraInfo) = 0; - - }; - - #else /* C style interface */ - - typedef struct IAMErrorLogVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMErrorLog * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMErrorLog * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMErrorLog * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *LogError )( - IAMErrorLog * This, - long Severity, - BSTR pErrorString, - long ErrorCode, - long hresult, - /* [in] */ VARIANT *pExtraInfo); - - END_INTERFACE - } IAMErrorLogVtbl; - - interface IAMErrorLog - { - CONST_VTBL struct IAMErrorLogVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IAMErrorLog_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IAMErrorLog_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IAMErrorLog_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IAMErrorLog_LogError(This,Severity,pErrorString,ErrorCode,hresult,pExtraInfo) \ - (This)->lpVtbl -> LogError(This,Severity,pErrorString,ErrorCode,hresult,pExtraInfo) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IAMErrorLog_LogError_Proxy( - IAMErrorLog * This, - long Severity, - BSTR pErrorString, - long ErrorCode, - long hresult, - /* [in] */ VARIANT *pExtraInfo); - - - void __RPC_STUB IAMErrorLog_LogError_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IAMErrorLog_INTERFACE_DEFINED__ */ - - - #ifndef __IAMSetErrorLog_INTERFACE_DEFINED__ - #define __IAMSetErrorLog_INTERFACE_DEFINED__ - - /* interface IAMSetErrorLog */ - /* [unique][helpstring][uuid][object] */ - - - EXTERN_C const IID IID_IAMSetErrorLog; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("963566DA-BE21-4eaf-88E9-35704F8F52A1") - IAMSetErrorLog : public IUnknown - { - public: - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ErrorLog( - /* [retval][out] */ IAMErrorLog **pVal) = 0; - - virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_ErrorLog( - /* [in] */ IAMErrorLog *newVal) = 0; - - }; - - #else /* C style interface */ - - typedef struct IAMSetErrorLogVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMSetErrorLog * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMSetErrorLog * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMSetErrorLog * This); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ErrorLog )( - IAMSetErrorLog * This, - /* [retval][out] */ IAMErrorLog **pVal); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ErrorLog )( - IAMSetErrorLog * This, - /* [in] */ IAMErrorLog *newVal); - - END_INTERFACE - } IAMSetErrorLogVtbl; - - interface IAMSetErrorLog - { - CONST_VTBL struct IAMSetErrorLogVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IAMSetErrorLog_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IAMSetErrorLog_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IAMSetErrorLog_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IAMSetErrorLog_get_ErrorLog(This,pVal) \ - (This)->lpVtbl -> get_ErrorLog(This,pVal) - - #define IAMSetErrorLog_put_ErrorLog(This,newVal) \ - (This)->lpVtbl -> put_ErrorLog(This,newVal) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAMSetErrorLog_get_ErrorLog_Proxy( - IAMSetErrorLog * This, - /* [retval][out] */ IAMErrorLog **pVal); - - - void __RPC_STUB IAMSetErrorLog_get_ErrorLog_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IAMSetErrorLog_put_ErrorLog_Proxy( - IAMSetErrorLog * This, - /* [in] */ IAMErrorLog *newVal); - - - void __RPC_STUB IAMSetErrorLog_put_ErrorLog_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IAMSetErrorLog_INTERFACE_DEFINED__ */ - - - #ifndef __ISampleGrabberCB_INTERFACE_DEFINED__ - #define __ISampleGrabberCB_INTERFACE_DEFINED__ - - /* interface ISampleGrabberCB */ - /* [unique][helpstring][local][uuid][object] */ - - - EXTERN_C const IID IID_ISampleGrabberCB; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("0579154A-2B53-4994-B0D0-E773148EFF85") - ISampleGrabberCB : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SampleCB( - double SampleTime, - IMediaSample *pSample) = 0; - - virtual HRESULT STDMETHODCALLTYPE BufferCB( - double SampleTime, - BYTE *pBuffer, - long BufferLen) = 0; - - }; - - #else /* C style interface */ - - typedef struct ISampleGrabberCBVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ISampleGrabberCB * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ISampleGrabberCB * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ISampleGrabberCB * This); - - HRESULT ( STDMETHODCALLTYPE *SampleCB )( - ISampleGrabberCB * This, - double SampleTime, - IMediaSample *pSample); - - HRESULT ( STDMETHODCALLTYPE *BufferCB )( - ISampleGrabberCB * This, - double SampleTime, - BYTE *pBuffer, - long BufferLen); - - END_INTERFACE - } ISampleGrabberCBVtbl; - - interface ISampleGrabberCB - { - CONST_VTBL struct ISampleGrabberCBVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define ISampleGrabberCB_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define ISampleGrabberCB_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define ISampleGrabberCB_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define ISampleGrabberCB_SampleCB(This,SampleTime,pSample) \ - (This)->lpVtbl -> SampleCB(This,SampleTime,pSample) - - #define ISampleGrabberCB_BufferCB(This,SampleTime,pBuffer,BufferLen) \ - (This)->lpVtbl -> BufferCB(This,SampleTime,pBuffer,BufferLen) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - HRESULT STDMETHODCALLTYPE ISampleGrabberCB_SampleCB_Proxy( - ISampleGrabberCB * This, - double SampleTime, - IMediaSample *pSample); - - - void __RPC_STUB ISampleGrabberCB_SampleCB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE ISampleGrabberCB_BufferCB_Proxy( - ISampleGrabberCB * This, - double SampleTime, - BYTE *pBuffer, - long BufferLen); - - - void __RPC_STUB ISampleGrabberCB_BufferCB_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __ISampleGrabberCB_INTERFACE_DEFINED__ */ - - - #ifndef __ISampleGrabber_INTERFACE_DEFINED__ - #define __ISampleGrabber_INTERFACE_DEFINED__ - - /* interface ISampleGrabber */ - /* [unique][helpstring][local][uuid][object] */ - - - EXTERN_C const IID IID_ISampleGrabber; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("6B652FFF-11FE-4fce-92AD-0266B5D7C78F") - ISampleGrabber : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetOneShot( - BOOL OneShot) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMediaType( - const AM_MEDIA_TYPE *pType) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetConnectedMediaType( - AM_MEDIA_TYPE *pType) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetBufferSamples( - BOOL BufferThem) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentBuffer( - /* [out][in] */ long *pBufferSize, - /* [out] */ long *pBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentSample( - /* [retval][out] */ IMediaSample **ppSample) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallback( - ISampleGrabberCB *pCallback, - long WhichMethodToCallback) = 0; - - }; - - #else /* C style interface */ - - typedef struct ISampleGrabberVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ISampleGrabber * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ISampleGrabber * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ISampleGrabber * This); - - HRESULT ( STDMETHODCALLTYPE *SetOneShot )( - ISampleGrabber * This, - BOOL OneShot); - - HRESULT ( STDMETHODCALLTYPE *SetMediaType )( - ISampleGrabber * This, - const AM_MEDIA_TYPE *pType); - - HRESULT ( STDMETHODCALLTYPE *GetConnectedMediaType )( - ISampleGrabber * This, - AM_MEDIA_TYPE *pType); - - HRESULT ( STDMETHODCALLTYPE *SetBufferSamples )( - ISampleGrabber * This, - BOOL BufferThem); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentBuffer )( - ISampleGrabber * This, - /* [out][in] */ long *pBufferSize, - /* [out] */ long *pBuffer); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentSample )( - ISampleGrabber * This, - /* [retval][out] */ IMediaSample **ppSample); - - HRESULT ( STDMETHODCALLTYPE *SetCallback )( - ISampleGrabber * This, - ISampleGrabberCB *pCallback, - long WhichMethodToCallback); - - END_INTERFACE - } ISampleGrabberVtbl; - - interface ISampleGrabber - { - CONST_VTBL struct ISampleGrabberVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define ISampleGrabber_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define ISampleGrabber_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define ISampleGrabber_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define ISampleGrabber_SetOneShot(This,OneShot) \ - (This)->lpVtbl -> SetOneShot(This,OneShot) - - #define ISampleGrabber_SetMediaType(This,pType) \ - (This)->lpVtbl -> SetMediaType(This,pType) - - #define ISampleGrabber_GetConnectedMediaType(This,pType) \ - (This)->lpVtbl -> GetConnectedMediaType(This,pType) - - #define ISampleGrabber_SetBufferSamples(This,BufferThem) \ - (This)->lpVtbl -> SetBufferSamples(This,BufferThem) - - #define ISampleGrabber_GetCurrentBuffer(This,pBufferSize,pBuffer) \ - (This)->lpVtbl -> GetCurrentBuffer(This,pBufferSize,pBuffer) - - #define ISampleGrabber_GetCurrentSample(This,ppSample) \ - (This)->lpVtbl -> GetCurrentSample(This,ppSample) - - #define ISampleGrabber_SetCallback(This,pCallback,WhichMethodToCallback) \ - (This)->lpVtbl -> SetCallback(This,pCallback,WhichMethodToCallback) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - HRESULT STDMETHODCALLTYPE ISampleGrabber_SetOneShot_Proxy( - ISampleGrabber * This, - BOOL OneShot); - - - void __RPC_STUB ISampleGrabber_SetOneShot_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE ISampleGrabber_SetMediaType_Proxy( - ISampleGrabber * This, - const AM_MEDIA_TYPE *pType); - - - void __RPC_STUB ISampleGrabber_SetMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE ISampleGrabber_GetConnectedMediaType_Proxy( - ISampleGrabber * This, - AM_MEDIA_TYPE *pType); - - - void __RPC_STUB ISampleGrabber_GetConnectedMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE ISampleGrabber_SetBufferSamples_Proxy( - ISampleGrabber * This, - BOOL BufferThem); - - - void __RPC_STUB ISampleGrabber_SetBufferSamples_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE ISampleGrabber_GetCurrentBuffer_Proxy( - ISampleGrabber * This, - /* [out][in] */ long *pBufferSize, - /* [out] */ long *pBuffer); - - - void __RPC_STUB ISampleGrabber_GetCurrentBuffer_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE ISampleGrabber_GetCurrentSample_Proxy( - ISampleGrabber * This, - /* [retval][out] */ IMediaSample **ppSample); - - - void __RPC_STUB ISampleGrabber_GetCurrentSample_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE ISampleGrabber_SetCallback_Proxy( - ISampleGrabber * This, - ISampleGrabberCB *pCallback, - long WhichMethodToCallback); - - - void __RPC_STUB ISampleGrabber_SetCallback_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __ISampleGrabber_INTERFACE_DEFINED__ */ - - - - #ifndef __DexterLib_LIBRARY_DEFINED__ - #define __DexterLib_LIBRARY_DEFINED__ - - /* library DexterLib */ - /* [helpstring][version][uuid] */ - - - EXTERN_C const IID LIBID_DexterLib; - - EXTERN_C const CLSID CLSID_AMTimeline; - - #ifdef __cplusplus - - class DECLSPEC_UUID("78530B75-61F9-11D2-8CAD-00A024580902") - AMTimeline; - #endif - - EXTERN_C const CLSID CLSID_AMTimelineObj; - - #ifdef __cplusplus - - class DECLSPEC_UUID("78530B78-61F9-11D2-8CAD-00A024580902") - AMTimelineObj; - #endif - - EXTERN_C const CLSID CLSID_AMTimelineSrc; - - #ifdef __cplusplus - - class DECLSPEC_UUID("78530B7A-61F9-11D2-8CAD-00A024580902") - AMTimelineSrc; - #endif - - EXTERN_C const CLSID CLSID_AMTimelineTrack; - - #ifdef __cplusplus - - class DECLSPEC_UUID("8F6C3C50-897B-11d2-8CFB-00A0C9441E20") - AMTimelineTrack; - #endif - - EXTERN_C const CLSID CLSID_AMTimelineComp; - - #ifdef __cplusplus - - class DECLSPEC_UUID("74D2EC80-6233-11d2-8CAD-00A024580902") - AMTimelineComp; - #endif - - EXTERN_C const CLSID CLSID_AMTimelineGroup; - - #ifdef __cplusplus - - class DECLSPEC_UUID("F6D371E1-B8A6-11d2-8023-00C0DF10D434") - AMTimelineGroup; - #endif - - EXTERN_C const CLSID CLSID_AMTimelineTrans; - - #ifdef __cplusplus - - class DECLSPEC_UUID("74D2EC81-6233-11d2-8CAD-00A024580902") - AMTimelineTrans; - #endif - - EXTERN_C const CLSID CLSID_AMTimelineEffect; - - #ifdef __cplusplus - - class DECLSPEC_UUID("74D2EC82-6233-11d2-8CAD-00A024580902") - AMTimelineEffect; - #endif - - EXTERN_C const CLSID CLSID_RenderEngine; - - #ifdef __cplusplus - - class DECLSPEC_UUID("64D8A8E0-80A2-11d2-8CF3-00A0C9441E20") - RenderEngine; - #endif - - EXTERN_C const CLSID CLSID_SmartRenderEngine; - - #ifdef __cplusplus - - class DECLSPEC_UUID("498B0949-BBE9-4072-98BE-6CCAEB79DC6F") - SmartRenderEngine; - #endif - - EXTERN_C const CLSID CLSID_AudMixer; - - #ifdef __cplusplus - - class DECLSPEC_UUID("036A9790-C153-11d2-9EF7-006008039E37") - AudMixer; - #endif - - EXTERN_C const CLSID CLSID_Xml2Dex; - - #ifdef __cplusplus - - class DECLSPEC_UUID("18C628EE-962A-11D2-8D08-00A0C9441E20") - Xml2Dex; - #endif - - EXTERN_C const CLSID CLSID_MediaLocator; - - #ifdef __cplusplus - - class DECLSPEC_UUID("CC1101F2-79DC-11D2-8CE6-00A0C9441E20") - MediaLocator; - #endif - - EXTERN_C const CLSID CLSID_PropertySetter; - - #ifdef __cplusplus - - class DECLSPEC_UUID("ADF95821-DED7-11d2-ACBE-0080C75E246E") - PropertySetter; - #endif - - EXTERN_C const CLSID CLSID_MediaDet; - - #ifdef __cplusplus - - class DECLSPEC_UUID("65BD0711-24D2-4ff7-9324-ED2E5D3ABAFA") - MediaDet; - #endif - - EXTERN_C const CLSID CLSID_SampleGrabber; - - #ifdef __cplusplus - - class DECLSPEC_UUID("C1F400A0-3F08-11d3-9F0B-006008039E37") - SampleGrabber; - #endif - - EXTERN_C const CLSID CLSID_NullRenderer; - - #ifdef __cplusplus - - class DECLSPEC_UUID("C1F400A4-3F08-11d3-9F0B-006008039E37") - NullRenderer; - #endif - - EXTERN_C const CLSID CLSID_DxtCompositor; - - #ifdef __cplusplus - - class DECLSPEC_UUID("BB44391D-6ABD-422f-9E2E-385C9DFF51FC") - DxtCompositor; - #endif - - EXTERN_C const CLSID CLSID_DxtAlphaSetter; - - #ifdef __cplusplus - - class DECLSPEC_UUID("506D89AE-909A-44f7-9444-ABD575896E35") - DxtAlphaSetter; - #endif - - EXTERN_C const CLSID CLSID_DxtJpeg; - - #ifdef __cplusplus - - class DECLSPEC_UUID("DE75D012-7A65-11D2-8CEA-00A0C9441E20") - DxtJpeg; - #endif - - EXTERN_C const CLSID CLSID_ColorSource; - - #ifdef __cplusplus - - class DECLSPEC_UUID("0cfdd070-581a-11d2-9ee6-006008039e37") - ColorSource; - #endif - - EXTERN_C const CLSID CLSID_DxtKey; - - #ifdef __cplusplus - - class DECLSPEC_UUID("C5B19592-145E-11d3-9F04-006008039E37") - DxtKey; - #endif - #endif /* __DexterLib_LIBRARY_DEFINED__ */ - - /* interface __MIDL_itf_qedit_0450 */ - /* [local] */ - - - enum __MIDL___MIDL_itf_qedit_0450_0001 - { E_NOTINTREE = 0x80040400, - E_RENDER_ENGINE_IS_BROKEN = 0x80040401, - E_MUST_INIT_RENDERER = 0x80040402, - E_NOTDETERMINED = 0x80040403, - E_NO_TIMELINE = 0x80040404, - S_WARN_OUTPUTRESET = 40404 - } ; - #define DEX_IDS_BAD_SOURCE_NAME 1400 - #define DEX_IDS_BAD_SOURCE_NAME2 1401 - #define DEX_IDS_MISSING_SOURCE_NAME 1402 - #define DEX_IDS_UNKNOWN_SOURCE 1403 - #define DEX_IDS_INSTALL_PROBLEM 1404 - #define DEX_IDS_NO_SOURCE_NAMES 1405 - #define DEX_IDS_BAD_MEDIATYPE 1406 - #define DEX_IDS_STREAM_NUMBER 1407 - #define DEX_IDS_OUTOFMEMORY 1408 - #define DEX_IDS_DIBSEQ_NOTALLSAME 1409 - #define DEX_IDS_CLIPTOOSHORT 1410 - #define DEX_IDS_INVALID_DXT 1411 - #define DEX_IDS_INVALID_DEFAULT_DXT 1412 - #define DEX_IDS_NO_3D 1413 - #define DEX_IDS_BROKEN_DXT 1414 - #define DEX_IDS_NO_SUCH_PROPERTY 1415 - #define DEX_IDS_ILLEGAL_PROPERTY_VAL 1416 - #define DEX_IDS_INVALID_XML 1417 - #define DEX_IDS_CANT_FIND_FILTER 1418 - #define DEX_IDS_DISK_WRITE_ERROR 1419 - #define DEX_IDS_INVALID_AUDIO_FX 1420 - #define DEX_IDS_CANT_FIND_COMPRESSOR 1421 - #define DEX_IDS_TIMELINE_PARSE 1426 - #define DEX_IDS_GRAPH_ERROR 1427 - #define DEX_IDS_GRID_ERROR 1428 - #define DEX_IDS_INTERFACE_ERROR 1429 - EXTERN_GUID(CLSID_VideoEffects1Category, 0xcc7bfb42, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59); - EXTERN_GUID(CLSID_VideoEffects2Category, 0xcc7bfb43, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59); - EXTERN_GUID(CLSID_AudioEffects1Category, 0xcc7bfb44, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59); - EXTERN_GUID(CLSID_AudioEffects2Category, 0xcc7bfb45, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59); - - - extern RPC_IF_HANDLE __MIDL_itf_qedit_0450_v0_0_c_ifspec; - extern RPC_IF_HANDLE __MIDL_itf_qedit_0450_v0_0_s_ifspec; - - /* Additional Prototypes for ALL interfaces */ - - unsigned long __RPC_USER BSTR_UserSize( unsigned long *, unsigned long , BSTR * ); - unsigned char * __RPC_USER BSTR_UserMarshal( unsigned long *, unsigned char *, BSTR * ); - unsigned char * __RPC_USER BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); - void __RPC_USER BSTR_UserFree( unsigned long *, BSTR * ); - - unsigned long __RPC_USER VARIANT_UserSize( unsigned long *, unsigned long , VARIANT * ); - unsigned char * __RPC_USER VARIANT_UserMarshal( unsigned long *, unsigned char *, VARIANT * ); - unsigned char * __RPC_USER VARIANT_UserUnmarshal(unsigned long *, unsigned char *, VARIANT * ); - void __RPC_USER VARIANT_UserFree( unsigned long *, VARIANT * ); - - /* end of Additional Prototypes */ - - #ifdef __cplusplus - } - #endif - - #endif - - -#endif // DirectX 8.0 content \ No newline at end of file diff --git a/import/DirectX8/include/qnetwork.h b/import/DirectX8/include/qnetwork.h deleted file mode 100644 index 2df219464..000000000 --- a/import/DirectX8/include/qnetwork.h +++ /dev/null @@ -1,555 +0,0 @@ -//------------------------------------------------------------------------------ -// File: qnetwork.h -// -// Desc: This header file machine-generated by mktyplib.exe. -// Interface to type library: QuartzNetTypeLib -// -// Copyright (c) 1997-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef _QuartzNetTypeLib_H_ -#define _QuartzNetTypeLib_H_ - -DEFINE_GUID(LIBID_QuartzNetTypeLib,0x56A868B1L,0x0AD4,0x11CE,0xB0,0x3A,0x00,0x20,0xAF,0x0B,0xA7,0x70); -#ifndef BEGIN_INTERFACE -#define BEGIN_INTERFACE -#endif - -DEFINE_GUID(IID_IAMNetShowConfig,0xFA2AA8F1L,0x8B62,0x11D0,0xA5,0x20,0x00,0x00,0x00,0x00,0x00,0x00); - -/* Definition of interface: IAMNetShowConfig */ -#undef INTERFACE -#define INTERFACE IAMNetShowConfig - -DECLARE_INTERFACE_(IAMNetShowConfig, IDispatch) -{ -BEGIN_INTERFACE -#ifndef NO_BASEINTERFACE_FUNCS - - /* IUnknown methods */ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - /* IDispatch methods */ - STDMETHOD(GetTypeInfoCount)(THIS_ UINT FAR* pctinfo) PURE; - - STDMETHOD(GetTypeInfo)( - THIS_ - UINT itinfo, - LCID lcid, - ITypeInfo FAR* FAR* pptinfo) PURE; - - STDMETHOD(GetIDsOfNames)( - THIS_ - REFIID riid, - OLECHAR FAR* FAR* rgszNames, - UINT cNames, - LCID lcid, - DISPID FAR* rgdispid) PURE; - - STDMETHOD(Invoke)( - THIS_ - DISPID dispidMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS FAR* pdispparams, - VARIANT FAR* pvarResult, - EXCEPINFO FAR* pexcepinfo, - UINT FAR* puArgErr) PURE; -#endif - - /* IAMNetShowConfig methods */ - STDMETHOD(get_BufferingTime)(THIS_ double FAR* pBufferingTime) PURE; - STDMETHOD(put_BufferingTime)(THIS_ double BufferingTime) PURE; - STDMETHOD(get_UseFixedUDPPort)(THIS_ VARIANT_BOOL FAR* pUseFixedUDPPort) PURE; - STDMETHOD(put_UseFixedUDPPort)(THIS_ VARIANT_BOOL UseFixedUDPPort) PURE; - STDMETHOD(get_FixedUDPPort)(THIS_ long FAR* pFixedUDPPort) PURE; - STDMETHOD(put_FixedUDPPort)(THIS_ long FixedUDPPort) PURE; - STDMETHOD(get_UseHTTPProxy)(THIS_ VARIANT_BOOL FAR* pUseHTTPProxy) PURE; - STDMETHOD(put_UseHTTPProxy)(THIS_ VARIANT_BOOL UseHTTPProxy) PURE; - STDMETHOD(get_EnableAutoProxy)(THIS_ VARIANT_BOOL FAR* pEnableAutoProxy) PURE; - STDMETHOD(put_EnableAutoProxy)(THIS_ VARIANT_BOOL EnableAutoProxy) PURE; - STDMETHOD(get_HTTPProxyHost)(THIS_ BSTR FAR* pbstrHTTPProxyHost) PURE; - STDMETHOD(put_HTTPProxyHost)(THIS_ BSTR bstrHTTPProxyHost) PURE; - STDMETHOD(get_HTTPProxyPort)(THIS_ long FAR* pHTTPProxyPort) PURE; - STDMETHOD(put_HTTPProxyPort)(THIS_ long HTTPProxyPort) PURE; - STDMETHOD(get_EnableMulticast)(THIS_ VARIANT_BOOL FAR* pEnableMulticast) PURE; - STDMETHOD(put_EnableMulticast)(THIS_ VARIANT_BOOL EnableMulticast) PURE; - STDMETHOD(get_EnableUDP)(THIS_ VARIANT_BOOL FAR* pEnableUDP) PURE; - STDMETHOD(put_EnableUDP)(THIS_ VARIANT_BOOL EnableUDP) PURE; - STDMETHOD(get_EnableTCP)(THIS_ VARIANT_BOOL FAR* pEnableTCP) PURE; - STDMETHOD(put_EnableTCP)(THIS_ VARIANT_BOOL EnableTCP) PURE; - STDMETHOD(get_EnableHTTP)(THIS_ VARIANT_BOOL FAR* pEnableHTTP) PURE; - STDMETHOD(put_EnableHTTP)(THIS_ VARIANT_BOOL EnableHTTP) PURE; -}; - -DEFINE_GUID(IID_IAMChannelInfo,0xFA2AA8F2L,0x8B62,0x11D0,0xA5,0x20,0x00,0x00,0x00,0x00,0x00,0x00); - -/* Definition of interface: IAMChannelInfo */ -#undef INTERFACE -#define INTERFACE IAMChannelInfo - -DECLARE_INTERFACE_(IAMChannelInfo, IDispatch) -{ -BEGIN_INTERFACE -#ifndef NO_BASEINTERFACE_FUNCS - - /* IUnknown methods */ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - /* IDispatch methods */ - STDMETHOD(GetTypeInfoCount)(THIS_ UINT FAR* pctinfo) PURE; - - STDMETHOD(GetTypeInfo)( - THIS_ - UINT itinfo, - LCID lcid, - ITypeInfo FAR* FAR* pptinfo) PURE; - - STDMETHOD(GetIDsOfNames)( - THIS_ - REFIID riid, - OLECHAR FAR* FAR* rgszNames, - UINT cNames, - LCID lcid, - DISPID FAR* rgdispid) PURE; - - STDMETHOD(Invoke)( - THIS_ - DISPID dispidMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS FAR* pdispparams, - VARIANT FAR* pvarResult, - EXCEPINFO FAR* pexcepinfo, - UINT FAR* puArgErr) PURE; -#endif - - /* IAMChannelInfo methods */ - STDMETHOD(get_ChannelName)(THIS_ BSTR FAR* pbstrChannelName) PURE; - STDMETHOD(get_ChannelDescription)(THIS_ BSTR FAR* pbstrChannelDescription) PURE; - STDMETHOD(get_ChannelURL)(THIS_ BSTR FAR* pbstrChannelURL) PURE; - STDMETHOD(get_ContactAddress)(THIS_ BSTR FAR* pbstrContactAddress) PURE; - STDMETHOD(get_ContactPhone)(THIS_ BSTR FAR* pbstrContactPhone) PURE; - STDMETHOD(get_ContactEmail)(THIS_ BSTR FAR* pbstrContactEmail) PURE; -}; - -DEFINE_GUID(IID_IAMNetworkStatus,0xFA2AA8F3L,0x8B62,0x11D0,0xA5,0x20,0x00,0x00,0x00,0x00,0x00,0x00); - -/* Definition of interface: IAMNetworkStatus */ -#undef INTERFACE -#define INTERFACE IAMNetworkStatus - -DECLARE_INTERFACE_(IAMNetworkStatus, IDispatch) -{ -BEGIN_INTERFACE -#ifndef NO_BASEINTERFACE_FUNCS - - /* IUnknown methods */ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - /* IDispatch methods */ - STDMETHOD(GetTypeInfoCount)(THIS_ UINT FAR* pctinfo) PURE; - - STDMETHOD(GetTypeInfo)( - THIS_ - UINT itinfo, - LCID lcid, - ITypeInfo FAR* FAR* pptinfo) PURE; - - STDMETHOD(GetIDsOfNames)( - THIS_ - REFIID riid, - OLECHAR FAR* FAR* rgszNames, - UINT cNames, - LCID lcid, - DISPID FAR* rgdispid) PURE; - - STDMETHOD(Invoke)( - THIS_ - DISPID dispidMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS FAR* pdispparams, - VARIANT FAR* pvarResult, - EXCEPINFO FAR* pexcepinfo, - UINT FAR* puArgErr) PURE; -#endif - - /* IAMNetworkStatus methods */ - STDMETHOD(get_ReceivedPackets)(THIS_ long FAR* pReceivedPackets) PURE; - STDMETHOD(get_RecoveredPackets)(THIS_ long FAR* pRecoveredPackets) PURE; - STDMETHOD(get_LostPackets)(THIS_ long FAR* pLostPackets) PURE; - STDMETHOD(get_ReceptionQuality)(THIS_ long FAR* pReceptionQuality) PURE; - STDMETHOD(get_BufferingCount)(THIS_ long FAR* pBufferingCount) PURE; - STDMETHOD(get_IsBroadcast)(THIS_ VARIANT_BOOL FAR* pIsBroadcast) PURE; - STDMETHOD(get_BufferingProgress)(THIS_ long FAR* pBufferingProgress) PURE; -}; - -typedef enum { - AM_EXSEEK_CANSEEK = 1, - AM_EXSEEK_CANSCAN = 2, - AM_EXSEEK_MARKERSEEK = 4, - AM_EXSEEK_SCANWITHOUTCLOCK = 8, - AM_EXSEEK_NOSTANDARDREPAINT = 16, - AM_EXSEEK_BUFFERING = 32, - AM_EXSEEK_SENDS_VIDEOFRAMEREADY = 64 -} AMExtendedSeekingCapabilities; - -DEFINE_GUID(IID_IAMExtendedSeeking,0xFA2AA8F9L,0x8B62,0x11D0,0xA5,0x20,0x00,0x00,0x00,0x00,0x00,0x00); - -/* Definition of interface: IAMExtendedSeeking */ -#undef INTERFACE -#define INTERFACE IAMExtendedSeeking - -DECLARE_INTERFACE_(IAMExtendedSeeking, IDispatch) -{ -BEGIN_INTERFACE -#ifndef NO_BASEINTERFACE_FUNCS - - /* IUnknown methods */ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - /* IDispatch methods */ - STDMETHOD(GetTypeInfoCount)(THIS_ UINT FAR* pctinfo) PURE; - - STDMETHOD(GetTypeInfo)( - THIS_ - UINT itinfo, - LCID lcid, - ITypeInfo FAR* FAR* pptinfo) PURE; - - STDMETHOD(GetIDsOfNames)( - THIS_ - REFIID riid, - OLECHAR FAR* FAR* rgszNames, - UINT cNames, - LCID lcid, - DISPID FAR* rgdispid) PURE; - - STDMETHOD(Invoke)( - THIS_ - DISPID dispidMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS FAR* pdispparams, - VARIANT FAR* pvarResult, - EXCEPINFO FAR* pexcepinfo, - UINT FAR* puArgErr) PURE; -#endif - - /* IAMExtendedSeeking methods */ - STDMETHOD(get_ExSeekCapabilities)(THIS_ long FAR* pExCapabilities) PURE; - STDMETHOD(get_MarkerCount)(THIS_ long FAR* pMarkerCount) PURE; - STDMETHOD(get_CurrentMarker)(THIS_ long FAR* pCurrentMarker) PURE; - STDMETHOD(GetMarkerTime)(THIS_ long MarkerNum, double FAR* pMarkerTime) PURE; - STDMETHOD(GetMarkerName)(THIS_ long MarkerNum, BSTR FAR* pbstrMarkerName) PURE; - STDMETHOD(put_PlaybackSpeed)(THIS_ double Speed) PURE; - STDMETHOD(get_PlaybackSpeed)(THIS_ double FAR* pSpeed) PURE; -}; - -DEFINE_GUID(IID_IAMNetShowExProps,0xFA2AA8F5L,0x8B62,0x11D0,0xA5,0x20,0x00,0x00,0x00,0x00,0x00,0x00); - -/* Definition of interface: IAMNetShowExProps */ -#undef INTERFACE -#define INTERFACE IAMNetShowExProps - -DECLARE_INTERFACE_(IAMNetShowExProps, IDispatch) -{ -BEGIN_INTERFACE -#ifndef NO_BASEINTERFACE_FUNCS - - /* IUnknown methods */ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - /* IDispatch methods */ - STDMETHOD(GetTypeInfoCount)(THIS_ UINT FAR* pctinfo) PURE; - - STDMETHOD(GetTypeInfo)( - THIS_ - UINT itinfo, - LCID lcid, - ITypeInfo FAR* FAR* pptinfo) PURE; - - STDMETHOD(GetIDsOfNames)( - THIS_ - REFIID riid, - OLECHAR FAR* FAR* rgszNames, - UINT cNames, - LCID lcid, - DISPID FAR* rgdispid) PURE; - - STDMETHOD(Invoke)( - THIS_ - DISPID dispidMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS FAR* pdispparams, - VARIANT FAR* pvarResult, - EXCEPINFO FAR* pexcepinfo, - UINT FAR* puArgErr) PURE; -#endif - - /* IAMNetShowExProps methods */ - STDMETHOD(get_SourceProtocol)(THIS_ long FAR* pSourceProtocol) PURE; - STDMETHOD(get_Bandwidth)(THIS_ long FAR* pBandwidth) PURE; - STDMETHOD(get_ErrorCorrection)(THIS_ BSTR FAR* pbstrErrorCorrection) PURE; - STDMETHOD(get_CodecCount)(THIS_ long FAR* pCodecCount) PURE; - STDMETHOD(GetCodecInstalled)(THIS_ long CodecNum, VARIANT_BOOL FAR* pCodecInstalled) PURE; - STDMETHOD(GetCodecDescription)(THIS_ long CodecNum, BSTR FAR* pbstrCodecDescription) PURE; - STDMETHOD(GetCodecURL)(THIS_ long CodecNum, BSTR FAR* pbstrCodecURL) PURE; - STDMETHOD(get_CreationDate)(THIS_ DATE FAR* pCreationDate) PURE; - STDMETHOD(get_SourceLink)(THIS_ BSTR FAR* pbstrSourceLink) PURE; -}; - -DEFINE_GUID(IID_IAMExtendedErrorInfo,0xFA2AA8F6L,0x8B62,0x11D0,0xA5,0x20,0x00,0x00,0x00,0x00,0x00,0x00); - -/* Definition of interface: IAMExtendedErrorInfo */ -#undef INTERFACE -#define INTERFACE IAMExtendedErrorInfo - -DECLARE_INTERFACE_(IAMExtendedErrorInfo, IDispatch) -{ -BEGIN_INTERFACE -#ifndef NO_BASEINTERFACE_FUNCS - - /* IUnknown methods */ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - /* IDispatch methods */ - STDMETHOD(GetTypeInfoCount)(THIS_ UINT FAR* pctinfo) PURE; - - STDMETHOD(GetTypeInfo)( - THIS_ - UINT itinfo, - LCID lcid, - ITypeInfo FAR* FAR* pptinfo) PURE; - - STDMETHOD(GetIDsOfNames)( - THIS_ - REFIID riid, - OLECHAR FAR* FAR* rgszNames, - UINT cNames, - LCID lcid, - DISPID FAR* rgdispid) PURE; - - STDMETHOD(Invoke)( - THIS_ - DISPID dispidMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS FAR* pdispparams, - VARIANT FAR* pvarResult, - EXCEPINFO FAR* pexcepinfo, - UINT FAR* puArgErr) PURE; -#endif - - /* IAMExtendedErrorInfo methods */ - STDMETHOD(get_HasError)(THIS_ VARIANT_BOOL FAR* pHasError) PURE; - STDMETHOD(get_ErrorDescription)(THIS_ BSTR FAR* pbstrErrorDescription) PURE; - STDMETHOD(get_ErrorCode)(THIS_ long FAR* pErrorCode) PURE; -}; - -DEFINE_GUID(IID_IAMMediaContent,0xFA2AA8F4L,0x8B62,0x11D0,0xA5,0x20,0x00,0x00,0x00,0x00,0x00,0x00); - -/* Definition of interface: IAMMediaContent */ -#undef INTERFACE -#define INTERFACE IAMMediaContent - -DECLARE_INTERFACE_(IAMMediaContent, IDispatch) -{ -BEGIN_INTERFACE -#ifndef NO_BASEINTERFACE_FUNCS - - /* IUnknown methods */ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - /* IDispatch methods */ - STDMETHOD(GetTypeInfoCount)(THIS_ UINT FAR* pctinfo) PURE; - - STDMETHOD(GetTypeInfo)( - THIS_ - UINT itinfo, - LCID lcid, - ITypeInfo FAR* FAR* pptinfo) PURE; - - STDMETHOD(GetIDsOfNames)( - THIS_ - REFIID riid, - OLECHAR FAR* FAR* rgszNames, - UINT cNames, - LCID lcid, - DISPID FAR* rgdispid) PURE; - - STDMETHOD(Invoke)( - THIS_ - DISPID dispidMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS FAR* pdispparams, - VARIANT FAR* pvarResult, - EXCEPINFO FAR* pexcepinfo, - UINT FAR* puArgErr) PURE; -#endif - - /* IAMMediaContent methods */ - STDMETHOD(get_AuthorName)(THIS_ BSTR FAR* pbstrAuthorName) PURE; - STDMETHOD(get_Title)(THIS_ BSTR FAR* pbstrTitle) PURE; - STDMETHOD(get_Rating)(THIS_ BSTR FAR* pbstrRating) PURE; - STDMETHOD(get_Description)(THIS_ BSTR FAR* pbstrDescription) PURE; - STDMETHOD(get_Copyright)(THIS_ BSTR FAR* pbstrCopyright) PURE; - STDMETHOD(get_BaseURL)(THIS_ BSTR FAR* pbstrBaseURL) PURE; - STDMETHOD(get_LogoURL)(THIS_ BSTR FAR* pbstrLogoURL) PURE; - STDMETHOD(get_LogoIconURL)(THIS_ BSTR FAR* pbstrLogoURL) PURE; - STDMETHOD(get_WatermarkURL)(THIS_ BSTR FAR* pbstrWatermarkURL) PURE; - STDMETHOD(get_MoreInfoURL)(THIS_ BSTR FAR* pbstrMoreInfoURL) PURE; - STDMETHOD(get_MoreInfoBannerImage)(THIS_ BSTR FAR* pbstrMoreInfoBannerImage) PURE; - STDMETHOD(get_MoreInfoBannerURL)(THIS_ BSTR FAR* pbstrMoreInfoBannerURL) PURE; - STDMETHOD(get_MoreInfoText)(THIS_ BSTR FAR* pbstrMoreInfoText) PURE; -}; - -DEFINE_GUID(IID_IAMMediaContent2,0xCE8F78C1L,0x74D9,0x11D2,0xB0,0x9D,0x00,0xA0,0xC9,0xA8,0x11,0x17); - -/* Definition of interface: IAMMediaContent2 */ -#undef INTERFACE -#define INTERFACE IAMMediaContent2 - -DECLARE_INTERFACE_(IAMMediaContent2, IDispatch) -{ -BEGIN_INTERFACE -#ifndef NO_BASEINTERFACE_FUNCS - - /* IUnknown methods */ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - /* IDispatch methods */ - STDMETHOD(GetTypeInfoCount)(THIS_ UINT FAR* pctinfo) PURE; - - STDMETHOD(GetTypeInfo)( - THIS_ - UINT itinfo, - LCID lcid, - ITypeInfo FAR* FAR* pptinfo) PURE; - - STDMETHOD(GetIDsOfNames)( - THIS_ - REFIID riid, - OLECHAR FAR* FAR* rgszNames, - UINT cNames, - LCID lcid, - DISPID FAR* rgdispid) PURE; - - STDMETHOD(Invoke)( - THIS_ - DISPID dispidMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS FAR* pdispparams, - VARIANT FAR* pvarResult, - EXCEPINFO FAR* pexcepinfo, - UINT FAR* puArgErr) PURE; -#endif - - /* IAMMediaContent2 methods */ - STDMETHOD(get_MediaParameter)(THIS_ long EntryNum, BSTR bstrName, BSTR FAR* pbstrValue) PURE; - STDMETHOD(get_MediaParameterName)(THIS_ long EntryNum, long Index, BSTR FAR* pbstrName) PURE; - STDMETHOD(get_PlaylistCount)(THIS_ long FAR* pNumberEntries) PURE; -}; - -DEFINE_GUID(IID_IAMNetShowPreroll,0xAAE7E4E2L,0x6388,0x11D1,0x8D,0x93,0x00,0x60,0x97,0xC9,0xA2,0xB2); - -/* Definition of interface: IAMNetShowPreroll */ -#undef INTERFACE -#define INTERFACE IAMNetShowPreroll - -DECLARE_INTERFACE_(IAMNetShowPreroll, IDispatch) -{ -BEGIN_INTERFACE -#ifndef NO_BASEINTERFACE_FUNCS - - /* IUnknown methods */ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; - - /* IDispatch methods */ - STDMETHOD(GetTypeInfoCount)(THIS_ UINT FAR* pctinfo) PURE; - - STDMETHOD(GetTypeInfo)( - THIS_ - UINT itinfo, - LCID lcid, - ITypeInfo FAR* FAR* pptinfo) PURE; - - STDMETHOD(GetIDsOfNames)( - THIS_ - REFIID riid, - OLECHAR FAR* FAR* rgszNames, - UINT cNames, - LCID lcid, - DISPID FAR* rgdispid) PURE; - - STDMETHOD(Invoke)( - THIS_ - DISPID dispidMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS FAR* pdispparams, - VARIANT FAR* pvarResult, - EXCEPINFO FAR* pexcepinfo, - UINT FAR* puArgErr) PURE; -#endif - - /* IAMNetShowPreroll methods */ - STDMETHOD(put_Preroll)(THIS_ VARIANT_BOOL fPreroll) PURE; - STDMETHOD(get_Preroll)(THIS_ VARIANT_BOOL FAR* pfPreroll) PURE; -}; - -DEFINE_GUID(IID_IDShowPlugin,0x4746B7C8L,0x700E,0x11D1,0xBE,0xCC,0x00,0xC0,0x4F,0xB6,0xE9,0x37); - -/* Definition of interface: IDShowPlugin */ -#undef INTERFACE -#define INTERFACE IDShowPlugin - -DECLARE_INTERFACE_(IDShowPlugin, IUnknown) -{ -BEGIN_INTERFACE -#ifndef NO_BASEINTERFACE_FUNCS - - /* IUnknown methods */ - STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; - STDMETHOD_(ULONG, Release)(THIS) PURE; -#endif - - /* IDShowPlugin methods */ - STDMETHOD(get_URL)(THIS_ BSTR FAR* pURL) PURE; - STDMETHOD(get_UserAgent)(THIS_ BSTR FAR* pUserAgent) PURE; -}; - -#endif diff --git a/import/DirectX8/include/regbag.h b/import/DirectX8/include/regbag.h deleted file mode 100644 index faded963f..000000000 --- a/import/DirectX8/include/regbag.h +++ /dev/null @@ -1,193 +0,0 @@ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 6.00.0347 */ -/* Compiler settings for regbag.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __regbag_h__ -#define __regbag_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __ICreatePropBagOnRegKey_FWD_DEFINED__ -#define __ICreatePropBagOnRegKey_FWD_DEFINED__ -typedef interface ICreatePropBagOnRegKey ICreatePropBagOnRegKey; -#endif /* __ICreatePropBagOnRegKey_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "objidl.h" -#include "oaidl.h" -#include "ocidl.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void * ); - -/* interface __MIDL_itf_regbag_0000 */ -/* [local] */ - -//+------------------------------------------------------------------------- -// -// Microsoft Windows -// Copyright (C) Microsoft Corporation, 1999-2001. -// -//-------------------------------------------------------------------------- -#pragma once - - -extern RPC_IF_HANDLE __MIDL_itf_regbag_0000_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_regbag_0000_v0_0_s_ifspec; - -#ifndef __ICreatePropBagOnRegKey_INTERFACE_DEFINED__ -#define __ICreatePropBagOnRegKey_INTERFACE_DEFINED__ - -/* interface ICreatePropBagOnRegKey */ -/* [local][unique][helpstring][uuid][restricted][hidden][object] */ - - -EXTERN_C const IID IID_ICreatePropBagOnRegKey; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("8A674B48-1F63-11d3-B64C-00C04F79498E") - ICreatePropBagOnRegKey : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Create( - /* [in] */ HKEY hkey, - /* [in] */ LPCOLESTR subkey, - /* [in] */ DWORD ulOptions, - /* [in] */ DWORD samDesired, - REFIID iid, - /* [out] */ LPVOID *ppBag) = 0; - - }; - -#else /* C style interface */ - - typedef struct ICreatePropBagOnRegKeyVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ICreatePropBagOnRegKey * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ICreatePropBagOnRegKey * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ICreatePropBagOnRegKey * This); - - HRESULT ( STDMETHODCALLTYPE *Create )( - ICreatePropBagOnRegKey * This, - /* [in] */ HKEY hkey, - /* [in] */ LPCOLESTR subkey, - /* [in] */ DWORD ulOptions, - /* [in] */ DWORD samDesired, - REFIID iid, - /* [out] */ LPVOID *ppBag); - - END_INTERFACE - } ICreatePropBagOnRegKeyVtbl; - - interface ICreatePropBagOnRegKey - { - CONST_VTBL struct ICreatePropBagOnRegKeyVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ICreatePropBagOnRegKey_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ICreatePropBagOnRegKey_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ICreatePropBagOnRegKey_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ICreatePropBagOnRegKey_Create(This,hkey,subkey,ulOptions,samDesired,iid,ppBag) \ - (This)->lpVtbl -> Create(This,hkey,subkey,ulOptions,samDesired,iid,ppBag) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE ICreatePropBagOnRegKey_Create_Proxy( - ICreatePropBagOnRegKey * This, - /* [in] */ HKEY hkey, - /* [in] */ LPCOLESTR subkey, - /* [in] */ DWORD ulOptions, - /* [in] */ DWORD samDesired, - REFIID iid, - /* [out] */ LPVOID *ppBag); - - -void __RPC_STUB ICreatePropBagOnRegKey_Create_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ICreatePropBagOnRegKey_INTERFACE_DEFINED__ */ - - -/* Additional Prototypes for ALL interfaces */ - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/rmxfguid.h b/import/DirectX8/include/rmxfguid.h deleted file mode 100644 index d3326ccc9..000000000 --- a/import/DirectX8/include/rmxfguid.h +++ /dev/null @@ -1,223 +0,0 @@ -/*************************************************************************** - * - * Copyright (C) 1998-1999 Microsoft Corporation. All Rights Reserved. - * - * File: rmxfguid.h - * - * Content: Defines GUIDs of D3DRM's templates. - * - ***************************************************************************/ - -#ifndef __RMXFGUID_H_ -#define __RMXFGUID_H_ - -/* {2B957100-9E9A-11cf-AB39-0020AF71E433} */ -DEFINE_GUID(TID_D3DRMInfo, -0x2b957100, 0x9e9a, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); - -/* {3D82AB44-62DA-11cf-AB39-0020AF71E433} */ -DEFINE_GUID(TID_D3DRMMesh, -0x3d82ab44, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); - -/* {3D82AB5E-62DA-11cf-AB39-0020AF71E433} */ -DEFINE_GUID(TID_D3DRMVector, -0x3d82ab5e, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); - -/* {3D82AB5F-62DA-11cf-AB39-0020AF71E433} */ -DEFINE_GUID(TID_D3DRMMeshFace, -0x3d82ab5f, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); - -/* {3D82AB4D-62DA-11cf-AB39-0020AF71E433} */ -DEFINE_GUID(TID_D3DRMMaterial, -0x3d82ab4d, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); - -/* {35FF44E1-6C7C-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMMaterialArray, -0x35ff44e1, 0x6c7c, 0x11cf, 0x8F, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {3D82AB46-62DA-11cf-AB39-0020AF71E433} */ -DEFINE_GUID(TID_D3DRMFrame, -0x3d82ab46, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); - -/* {F6F23F41-7686-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMFrameTransformMatrix, -0xf6f23f41, 0x7686, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {F6F23F42-7686-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMMeshMaterialList, -0xf6f23f42, 0x7686, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {F6F23F40-7686-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMMeshTextureCoords, -0xf6f23f40, 0x7686, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {F6F23F43-7686-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMMeshNormals, -0xf6f23f43, 0x7686, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {F6F23F44-7686-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMCoords2d, -0xf6f23f44, 0x7686, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {F6F23F45-7686-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMMatrix4x4, -0xf6f23f45, 0x7686, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {3D82AB4F-62DA-11cf-AB39-0020AF71E433} */ -DEFINE_GUID(TID_D3DRMAnimation, -0x3d82ab4f, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); - -/* {3D82AB50-62DA-11cf-AB39-0020AF71E433} */ -DEFINE_GUID(TID_D3DRMAnimationSet, -0x3d82ab50, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); - -/* {10DD46A8-775B-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMAnimationKey, -0x10dd46a8, 0x775b, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xA3); - -/* {10DD46A9-775B-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMFloatKeys, -0x10dd46a9, 0x775b, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xA3); - -/* {01411840-7786-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMMaterialAmbientColor, -0x01411840, 0x7786, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xA3); - -/* {01411841-7786-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMMaterialDiffuseColor, -0x01411841, 0x7786, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xA3); - -/* {01411842-7786-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMMaterialSpecularColor, -0x01411842, 0x7786, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xA3); - -/* {D3E16E80-7835-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMMaterialEmissiveColor, -0xd3e16e80, 0x7835, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {01411843-7786-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMMaterialPower, -0x01411843, 0x7786, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xA3); - -/* {35FF44E0-6C7C-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMColorRGBA, -0x35ff44e0, 0x6c7c, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xA3); - -/* {D3E16E81-7835-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMColorRGB, -0xd3e16e81, 0x7835, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {A42790E0-7810-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMGuid, -0xa42790e0, 0x7810, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {A42790E1-7810-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMTextureFilename, -0xa42790e1, 0x7810, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {A42790E2-7810-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMTextureReference, -0xa42790e2, 0x7810, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {1630B820-7842-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMIndexedColor, -0x1630b820, 0x7842, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {1630B821-7842-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMMeshVertexColors, -0x1630b821, 0x7842, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {4885AE60-78E8-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMMaterialWrap, -0x4885ae60, 0x78e8, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {537DA6A0-CA37-11d0-941C-0080C80CFA7B} */ -DEFINE_GUID(TID_D3DRMBoolean, -0x537da6a0, 0xca37, 0x11d0, 0x94, 0x1c, 0x0, 0x80, 0xc8, 0xc, 0xfa, 0x7b); - -/* {ED1EC5C0-C0A8-11d0-941C-0080C80CFA7B} */ -DEFINE_GUID(TID_D3DRMMeshFaceWraps, -0xed1ec5c0, 0xc0a8, 0x11d0, 0x94, 0x1c, 0x0, 0x80, 0xc8, 0xc, 0xfa, 0x7b); - -/* {4885AE63-78E8-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMBoolean2d, -0x4885ae63, 0x78e8, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {F406B180-7B3B-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMTimedFloatKeys, -0xf406b180, 0x7b3b, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {E2BF56C0-840F-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMAnimationOptions, -0xe2bf56c0, 0x840f, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {E2BF56C1-840F-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMFramePosition, -0xe2bf56c1, 0x840f, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {E2BF56C2-840F-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMFrameVelocity, -0xe2bf56c2, 0x840f, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {E2BF56C3-840F-11cf-8F52-0040333594A3} */ -DEFINE_GUID(TID_D3DRMFrameRotation, -0xe2bf56c3, 0x840f, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3); - -/* {3D82AB4A-62DA-11cf-AB39-0020AF71E433} */ -DEFINE_GUID(TID_D3DRMLight, -0x3d82ab4a, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); - -/* {3D82AB51-62DA-11cf-AB39-0020AF71E433} */ -DEFINE_GUID(TID_D3DRMCamera, -0x3d82ab51, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); - -/* {E5745280-B24F-11cf-9DD5-00AA00A71A2F} */ -DEFINE_GUID(TID_D3DRMAppData, -0xe5745280, 0xb24f, 0x11cf, 0x9d, 0xd5, 0x0, 0xaa, 0x0, 0xa7, 0x1a, 0x2f); - -/* {AED22740-B31F-11cf-9DD5-00AA00A71A2F} */ -DEFINE_GUID(TID_D3DRMLightUmbra, -0xaed22740, 0xb31f, 0x11cf, 0x9d, 0xd5, 0x0, 0xaa, 0x0, 0xa7, 0x1a, 0x2f); - -/* {AED22742-B31F-11cf-9DD5-00AA00A71A2F} */ -DEFINE_GUID(TID_D3DRMLightRange, -0xaed22742, 0xb31f, 0x11cf, 0x9d, 0xd5, 0x0, 0xaa, 0x0, 0xa7, 0x1a, 0x2f); - -/* {AED22741-B31F-11cf-9DD5-00AA00A71A2F} */ -DEFINE_GUID(TID_D3DRMLightPenumbra, -0xaed22741, 0xb31f, 0x11cf, 0x9d, 0xd5, 0x0, 0xaa, 0x0, 0xa7, 0x1a, 0x2f); - -/* {A8A98BA0-C5E5-11cf-B941-0080C80CFA7B} */ -DEFINE_GUID(TID_D3DRMLightAttenuation, -0xa8a98ba0, 0xc5e5, 0x11cf, 0xb9, 0x41, 0x0, 0x80, 0xc8, 0xc, 0xfa, 0x7b); - -/* {3A23EEA0-94B1-11d0-AB39-0020AF71E433} */ -DEFINE_GUID(TID_D3DRMInlineData, -0x3a23eea0, 0x94b1, 0x11d0, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); - -/* {3A23EEA1-94B1-11d0-AB39-0020AF71E433} */ -DEFINE_GUID(TID_D3DRMUrl, -0x3a23eea1, 0x94b1, 0x11d0, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33); - -/* {8A63C360-997D-11d0-941C-0080C80CFA7B} */ -DEFINE_GUID(TID_D3DRMProgressiveMesh, -0x8A63C360, 0x997D, 0x11d0, 0x94, 0x1C, 0x0, 0x80, 0xC8, 0x0C, 0xFA, 0x7B); - -/* {98116AA0-BDBA-11d1-82C0-00A0C9697271} */ -DEFINE_GUID(TID_D3DRMExternalVisual, -0x98116AA0, 0xBDBA, 0x11d1, 0x82, 0xC0, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x71); - -/* {7F0F21E0-BFE1-11d1-82C0-00A0C9697271} */ -DEFINE_GUID(TID_D3DRMStringProperty, -0x7f0f21e0, 0xbfe1, 0x11d1, 0x82, 0xc0, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x71); - -/* {7F0F21E1-BFE1-11d1-82C0-00A0C9697271} */ -DEFINE_GUID(TID_D3DRMPropertyBag, -0x7f0f21e1, 0xbfe1, 0x11d1, 0x82, 0xc0, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x71); - -// {7F5D5EA0-D53A-11d1-82C0-00A0C9697271} -DEFINE_GUID(TID_D3DRMRightHanded, -0x7f5d5ea0, 0xd53a, 0x11d1, 0x82, 0xc0, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x71); - -#endif /* __RMXFGUID_H_ */ - diff --git a/import/DirectX8/include/rmxftmpl.h b/import/DirectX8/include/rmxftmpl.h deleted file mode 100644 index e0018d046..000000000 --- a/import/DirectX8/include/rmxftmpl.h +++ /dev/null @@ -1,339 +0,0 @@ -/* D3DRM XFile templates in binary form */ - -#ifndef _RMXFTMPL_H_ -#define _RMXFTMPL_H_ - -unsigned char D3DRM_XTEMPLATES[] = { - 0x78, 0x6f, 0x66, 0x20, 0x30, 0x33, 0x30, 0x32, 0x62, - 0x69, 0x6e, 0x20, 0x30, 0x30, 0x36, 0x34, 0x1f, 0, 0x1, - 0, 0x6, 0, 0, 0, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0xa, 0, 0x5, 0, 0x43, 0xab, 0x82, 0x3d, 0xda, - 0x62, 0xcf, 0x11, 0xab, 0x39, 0, 0x20, 0xaf, 0x71, 0xe4, - 0x33, 0x28, 0, 0x1, 0, 0x5, 0, 0, 0, 0x6d, - 0x61, 0x6a, 0x6f, 0x72, 0x14, 0, 0x28, 0, 0x1, 0, - 0x5, 0, 0, 0, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x14, - 0, 0x29, 0, 0x1, 0, 0x5, 0, 0, 0, 0x66, - 0x6c, 0x61, 0x67, 0x73, 0x14, 0, 0xb, 0, 0x1f, 0, - 0x1, 0, 0x6, 0, 0, 0, 0x56, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0xa, 0, 0x5, 0, 0x5e, 0xab, 0x82, 0x3d, - 0xda, 0x62, 0xcf, 0x11, 0xab, 0x39, 0, 0x20, 0xaf, 0x71, - 0xe4, 0x33, 0x2a, 0, 0x1, 0, 0x1, 0, 0, 0, - 0x78, 0x14, 0, 0x2a, 0, 0x1, 0, 0x1, 0, 0, - 0, 0x79, 0x14, 0, 0x2a, 0, 0x1, 0, 0x1, 0, - 0, 0, 0x7a, 0x14, 0, 0xb, 0, 0x1f, 0, 0x1, - 0, 0x8, 0, 0, 0, 0x43, 0x6f, 0x6f, 0x72, 0x64, - 0x73, 0x32, 0x64, 0xa, 0, 0x5, 0, 0x44, 0x3f, 0xf2, - 0xf6, 0x86, 0x76, 0xcf, 0x11, 0x8f, 0x52, 0, 0x40, 0x33, - 0x35, 0x94, 0xa3, 0x2a, 0, 0x1, 0, 0x1, 0, 0, - 0, 0x75, 0x14, 0, 0x2a, 0, 0x1, 0, 0x1, 0, - 0, 0, 0x76, 0x14, 0, 0xb, 0, 0x1f, 0, 0x1, - 0, 0x9, 0, 0, 0, 0x4d, 0x61, 0x74, 0x72, 0x69, - 0x78, 0x34, 0x78, 0x34, 0xa, 0, 0x5, 0, 0x45, 0x3f, - 0xf2, 0xf6, 0x86, 0x76, 0xcf, 0x11, 0x8f, 0x52, 0, 0x40, - 0x33, 0x35, 0x94, 0xa3, 0x34, 0, 0x2a, 0, 0x1, 0, - 0x6, 0, 0, 0, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, - 0xe, 0, 0x3, 0, 0x10, 0, 0, 0, 0xf, 0, - 0x14, 0, 0xb, 0, 0x1f, 0, 0x1, 0, 0x9, 0, - 0, 0, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x52, 0x47, 0x42, - 0x41, 0xa, 0, 0x5, 0, 0xe0, 0x44, 0xff, 0x35, 0x7c, - 0x6c, 0xcf, 0x11, 0x8f, 0x52, 0, 0x40, 0x33, 0x35, 0x94, - 0xa3, 0x2a, 0, 0x1, 0, 0x3, 0, 0, 0, 0x72, - 0x65, 0x64, 0x14, 0, 0x2a, 0, 0x1, 0, 0x5, 0, - 0, 0, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x14, 0, 0x2a, - 0, 0x1, 0, 0x4, 0, 0, 0, 0x62, 0x6c, 0x75, - 0x65, 0x14, 0, 0x2a, 0, 0x1, 0, 0x5, 0, 0, - 0, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x14, 0, 0xb, 0, - 0x1f, 0, 0x1, 0, 0x8, 0, 0, 0, 0x43, 0x6f, - 0x6c, 0x6f, 0x72, 0x52, 0x47, 0x42, 0xa, 0, 0x5, 0, - 0x81, 0x6e, 0xe1, 0xd3, 0x35, 0x78, 0xcf, 0x11, 0x8f, 0x52, - 0, 0x40, 0x33, 0x35, 0x94, 0xa3, 0x2a, 0, 0x1, 0, - 0x3, 0, 0, 0, 0x72, 0x65, 0x64, 0x14, 0, 0x2a, - 0, 0x1, 0, 0x5, 0, 0, 0, 0x67, 0x72, 0x65, - 0x65, 0x6e, 0x14, 0, 0x2a, 0, 0x1, 0, 0x4, 0, - 0, 0, 0x62, 0x6c, 0x75, 0x65, 0x14, 0, 0xb, 0, - 0x1f, 0, 0x1, 0, 0xc, 0, 0, 0, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, - 0xa, 0, 0x5, 0, 0x20, 0xb8, 0x30, 0x16, 0x42, 0x78, - 0xcf, 0x11, 0x8f, 0x52, 0, 0x40, 0x33, 0x35, 0x94, 0xa3, - 0x29, 0, 0x1, 0, 0x5, 0, 0, 0, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x14, 0, 0x1, 0, 0x9, 0, 0, - 0, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x52, 0x47, 0x42, 0x41, - 0x1, 0, 0xa, 0, 0, 0, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x14, 0, 0xb, 0, - 0x1f, 0, 0x1, 0, 0x7, 0, 0, 0, 0x42, 0x6f, - 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0xa, 0, 0x5, 0, 0xa0, - 0xa6, 0x7d, 0x53, 0x37, 0xca, 0xd0, 0x11, 0x94, 0x1c, 0, - 0x80, 0xc8, 0xc, 0xfa, 0x7b, 0x29, 0, 0x1, 0, 0x9, - 0, 0, 0, 0x74, 0x72, 0x75, 0x65, 0x66, 0x61, 0x6c, - 0x73, 0x65, 0x14, 0, 0xb, 0, 0x1f, 0, 0x1, 0, - 0x9, 0, 0, 0, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, - 0x6e, 0x32, 0x64, 0xa, 0, 0x5, 0, 0x63, 0xae, 0x85, - 0x48, 0xe8, 0x78, 0xcf, 0x11, 0x8f, 0x52, 0, 0x40, 0x33, - 0x35, 0x94, 0xa3, 0x1, 0, 0x7, 0, 0, 0, 0x42, - 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x1, 0, 0x1, 0, - 0, 0, 0x75, 0x14, 0, 0x1, 0, 0x7, 0, 0, - 0, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x1, 0, - 0x1, 0, 0, 0, 0x76, 0x14, 0, 0xb, 0, 0x1f, - 0, 0x1, 0, 0xc, 0, 0, 0, 0x4d, 0x61, 0x74, - 0x65, 0x72, 0x69, 0x61, 0x6c, 0x57, 0x72, 0x61, 0x70, 0xa, - 0, 0x5, 0, 0x60, 0xae, 0x85, 0x48, 0xe8, 0x78, 0xcf, - 0x11, 0x8f, 0x52, 0, 0x40, 0x33, 0x35, 0x94, 0xa3, 0x1, - 0, 0x7, 0, 0, 0, 0x42, 0x6f, 0x6f, 0x6c, 0x65, - 0x61, 0x6e, 0x1, 0, 0x1, 0, 0, 0, 0x75, 0x14, - 0, 0x1, 0, 0x7, 0, 0, 0, 0x42, 0x6f, 0x6f, - 0x6c, 0x65, 0x61, 0x6e, 0x1, 0, 0x1, 0, 0, 0, - 0x76, 0x14, 0, 0xb, 0, 0x1f, 0, 0x1, 0, 0xf, - 0, 0, 0, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, - 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0xa, 0, - 0x5, 0, 0xe1, 0x90, 0x27, 0xa4, 0x10, 0x78, 0xcf, 0x11, - 0x8f, 0x52, 0, 0x40, 0x33, 0x35, 0x94, 0xa3, 0x31, 0, - 0x1, 0, 0x8, 0, 0, 0, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x14, 0, 0xb, 0, 0x1f, 0, - 0x1, 0, 0x8, 0, 0, 0, 0x4d, 0x61, 0x74, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0xa, 0, 0x5, 0, 0x4d, 0xab, - 0x82, 0x3d, 0xda, 0x62, 0xcf, 0x11, 0xab, 0x39, 0, 0x20, - 0xaf, 0x71, 0xe4, 0x33, 0x1, 0, 0x9, 0, 0, 0, - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x52, 0x47, 0x42, 0x41, 0x1, - 0, 0x9, 0, 0, 0, 0x66, 0x61, 0x63, 0x65, 0x43, - 0x6f, 0x6c, 0x6f, 0x72, 0x14, 0, 0x2a, 0, 0x1, 0, - 0x5, 0, 0, 0, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x14, - 0, 0x1, 0, 0x8, 0, 0, 0, 0x43, 0x6f, 0x6c, - 0x6f, 0x72, 0x52, 0x47, 0x42, 0x1, 0, 0xd, 0, 0, - 0, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x43, - 0x6f, 0x6c, 0x6f, 0x72, 0x14, 0, 0x1, 0, 0x8, 0, - 0, 0, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x52, 0x47, 0x42, - 0x1, 0, 0xd, 0, 0, 0, 0x65, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x14, - 0, 0xe, 0, 0x12, 0, 0x12, 0, 0x12, 0, 0xf, - 0, 0xb, 0, 0x1f, 0, 0x1, 0, 0x8, 0, 0, - 0, 0x4d, 0x65, 0x73, 0x68, 0x46, 0x61, 0x63, 0x65, 0xa, - 0, 0x5, 0, 0x5f, 0xab, 0x82, 0x3d, 0xda, 0x62, 0xcf, - 0x11, 0xab, 0x39, 0, 0x20, 0xaf, 0x71, 0xe4, 0x33, 0x29, - 0, 0x1, 0, 0x12, 0, 0, 0, 0x6e, 0x46, 0x61, - 0x63, 0x65, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, - 0x64, 0x69, 0x63, 0x65, 0x73, 0x14, 0, 0x34, 0, 0x29, - 0, 0x1, 0, 0x11, 0, 0, 0, 0x66, 0x61, 0x63, - 0x65, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, - 0x69, 0x63, 0x65, 0x73, 0xe, 0, 0x1, 0, 0x12, 0, - 0, 0, 0x6e, 0x46, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, - 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, - 0xf, 0, 0x14, 0, 0xb, 0, 0x1f, 0, 0x1, 0, - 0xd, 0, 0, 0, 0x4d, 0x65, 0x73, 0x68, 0x46, 0x61, - 0x63, 0x65, 0x57, 0x72, 0x61, 0x70, 0x73, 0xa, 0, 0x5, - 0, 0xc0, 0xc5, 0x1e, 0xed, 0xa8, 0xc0, 0xd0, 0x11, 0x94, - 0x1c, 0, 0x80, 0xc8, 0xc, 0xfa, 0x7b, 0x29, 0, 0x1, - 0, 0xf, 0, 0, 0, 0x6e, 0x46, 0x61, 0x63, 0x65, - 0x57, 0x72, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x14, 0, 0x34, 0, 0x1, 0, 0x9, 0, 0, 0, - 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x32, 0x64, 0x1, - 0, 0xe, 0, 0, 0, 0x66, 0x61, 0x63, 0x65, 0x57, - 0x72, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0xe, - 0, 0x1, 0, 0xf, 0, 0, 0, 0x6e, 0x46, 0x61, - 0x63, 0x65, 0x57, 0x72, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0xf, 0, 0x14, 0, 0xb, 0, 0x1f, 0, - 0x1, 0, 0x11, 0, 0, 0, 0x4d, 0x65, 0x73, 0x68, - 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x6f, - 0x72, 0x64, 0x73, 0xa, 0, 0x5, 0, 0x40, 0x3f, 0xf2, - 0xf6, 0x86, 0x76, 0xcf, 0x11, 0x8f, 0x52, 0, 0x40, 0x33, - 0x35, 0x94, 0xa3, 0x29, 0, 0x1, 0, 0xe, 0, 0, - 0, 0x6e, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, - 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x14, 0, 0x34, 0, 0x1, - 0, 0x8, 0, 0, 0, 0x43, 0x6f, 0x6f, 0x72, 0x64, - 0x73, 0x32, 0x64, 0x1, 0, 0xd, 0, 0, 0, 0x74, - 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x6f, 0x72, - 0x64, 0x73, 0xe, 0, 0x1, 0, 0xe, 0, 0, 0, - 0x6e, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x6f, - 0x6f, 0x72, 0x64, 0x73, 0xf, 0, 0x14, 0, 0xb, 0, - 0x1f, 0, 0x1, 0, 0x10, 0, 0, 0, 0x4d, 0x65, - 0x73, 0x68, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x4c, 0x69, 0x73, 0x74, 0xa, 0, 0x5, 0, 0x42, 0x3f, - 0xf2, 0xf6, 0x86, 0x76, 0xcf, 0x11, 0x8f, 0x52, 0, 0x40, - 0x33, 0x35, 0x94, 0xa3, 0x29, 0, 0x1, 0, 0xa, 0, - 0, 0, 0x6e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x73, 0x14, 0, 0x29, 0, 0x1, 0, 0xc, 0, - 0, 0, 0x6e, 0x46, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x65, 0x73, 0x14, 0, 0x34, 0, 0x29, 0, - 0x1, 0, 0xb, 0, 0, 0, 0x66, 0x61, 0x63, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0xe, 0, 0x1, - 0, 0xc, 0, 0, 0, 0x6e, 0x46, 0x61, 0x63, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0xf, 0, 0x14, - 0, 0xe, 0, 0x1, 0, 0x8, 0, 0, 0, 0x4d, - 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0xf, 0, 0xb, - 0, 0x1f, 0, 0x1, 0, 0xb, 0, 0, 0, 0x4d, - 0x65, 0x73, 0x68, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, - 0xa, 0, 0x5, 0, 0x43, 0x3f, 0xf2, 0xf6, 0x86, 0x76, - 0xcf, 0x11, 0x8f, 0x52, 0, 0x40, 0x33, 0x35, 0x94, 0xa3, - 0x29, 0, 0x1, 0, 0x8, 0, 0, 0, 0x6e, 0x4e, - 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, 0x14, 0, 0x34, 0, - 0x1, 0, 0x6, 0, 0, 0, 0x56, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x1, 0, 0x7, 0, 0, 0, 0x6e, 0x6f, - 0x72, 0x6d, 0x61, 0x6c, 0x73, 0xe, 0, 0x1, 0, 0x8, - 0, 0, 0, 0x6e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, - 0x73, 0xf, 0, 0x14, 0, 0x29, 0, 0x1, 0, 0xc, - 0, 0, 0, 0x6e, 0x46, 0x61, 0x63, 0x65, 0x4e, 0x6f, - 0x72, 0x6d, 0x61, 0x6c, 0x73, 0x14, 0, 0x34, 0, 0x1, - 0, 0x8, 0, 0, 0, 0x4d, 0x65, 0x73, 0x68, 0x46, - 0x61, 0x63, 0x65, 0x1, 0, 0xb, 0, 0, 0, 0x66, - 0x61, 0x63, 0x65, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, - 0xe, 0, 0x1, 0, 0xc, 0, 0, 0, 0x6e, 0x46, - 0x61, 0x63, 0x65, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, - 0xf, 0, 0x14, 0, 0xb, 0, 0x1f, 0, 0x1, 0, - 0x10, 0, 0, 0, 0x4d, 0x65, 0x73, 0x68, 0x56, 0x65, - 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x73, - 0xa, 0, 0x5, 0, 0x21, 0xb8, 0x30, 0x16, 0x42, 0x78, - 0xcf, 0x11, 0x8f, 0x52, 0, 0x40, 0x33, 0x35, 0x94, 0xa3, - 0x29, 0, 0x1, 0, 0xd, 0, 0, 0, 0x6e, 0x56, - 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, - 0x73, 0x14, 0, 0x34, 0, 0x1, 0, 0xc, 0, 0, - 0, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x64, 0x43, 0x6f, - 0x6c, 0x6f, 0x72, 0x1, 0, 0xc, 0, 0, 0, 0x76, - 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, - 0x73, 0xe, 0, 0x1, 0, 0xd, 0, 0, 0, 0x6e, - 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, - 0x72, 0x73, 0xf, 0, 0x14, 0, 0xb, 0, 0x1f, 0, - 0x1, 0, 0x4, 0, 0, 0, 0x4d, 0x65, 0x73, 0x68, - 0xa, 0, 0x5, 0, 0x44, 0xab, 0x82, 0x3d, 0xda, 0x62, - 0xcf, 0x11, 0xab, 0x39, 0, 0x20, 0xaf, 0x71, 0xe4, 0x33, - 0x29, 0, 0x1, 0, 0x9, 0, 0, 0, 0x6e, 0x56, - 0x65, 0x72, 0x74, 0x69, 0x63, 0x65, 0x73, 0x14, 0, 0x34, - 0, 0x1, 0, 0x6, 0, 0, 0, 0x56, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x1, 0, 0x8, 0, 0, 0, 0x76, - 0x65, 0x72, 0x74, 0x69, 0x63, 0x65, 0x73, 0xe, 0, 0x1, - 0, 0x9, 0, 0, 0, 0x6e, 0x56, 0x65, 0x72, 0x74, - 0x69, 0x63, 0x65, 0x73, 0xf, 0, 0x14, 0, 0x29, 0, - 0x1, 0, 0x6, 0, 0, 0, 0x6e, 0x46, 0x61, 0x63, - 0x65, 0x73, 0x14, 0, 0x34, 0, 0x1, 0, 0x8, 0, - 0, 0, 0x4d, 0x65, 0x73, 0x68, 0x46, 0x61, 0x63, 0x65, - 0x1, 0, 0x5, 0, 0, 0, 0x66, 0x61, 0x63, 0x65, - 0x73, 0xe, 0, 0x1, 0, 0x6, 0, 0, 0, 0x6e, - 0x46, 0x61, 0x63, 0x65, 0x73, 0xf, 0, 0x14, 0, 0xe, - 0, 0x12, 0, 0x12, 0, 0x12, 0, 0xf, 0, 0xb, - 0, 0x1f, 0, 0x1, 0, 0x14, 0, 0, 0, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x6f, 0x72, 0x6d, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0xa, - 0, 0x5, 0, 0x41, 0x3f, 0xf2, 0xf6, 0x86, 0x76, 0xcf, - 0x11, 0x8f, 0x52, 0, 0x40, 0x33, 0x35, 0x94, 0xa3, 0x1, - 0, 0x9, 0, 0, 0, 0x4d, 0x61, 0x74, 0x72, 0x69, - 0x78, 0x34, 0x78, 0x34, 0x1, 0, 0xb, 0, 0, 0, - 0x66, 0x72, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x74, 0x72, 0x69, - 0x78, 0x14, 0, 0xb, 0, 0x1f, 0, 0x1, 0, 0x5, - 0, 0, 0, 0x46, 0x72, 0x61, 0x6d, 0x65, 0xa, 0, - 0x5, 0, 0x46, 0xab, 0x82, 0x3d, 0xda, 0x62, 0xcf, 0x11, - 0xab, 0x39, 0, 0x20, 0xaf, 0x71, 0xe4, 0x33, 0xe, 0, - 0x12, 0, 0x12, 0, 0x12, 0, 0xf, 0, 0xb, 0, - 0x1f, 0, 0x1, 0, 0x9, 0, 0, 0, 0x46, 0x6c, - 0x6f, 0x61, 0x74, 0x4b, 0x65, 0x79, 0x73, 0xa, 0, 0x5, - 0, 0xa9, 0x46, 0xdd, 0x10, 0x5b, 0x77, 0xcf, 0x11, 0x8f, - 0x52, 0, 0x40, 0x33, 0x35, 0x94, 0xa3, 0x29, 0, 0x1, - 0, 0x7, 0, 0, 0, 0x6e, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x14, 0, 0x34, 0, 0x2a, 0, 0x1, 0, - 0x6, 0, 0, 0, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0xe, 0, 0x1, 0, 0x7, 0, 0, 0, 0x6e, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0xf, 0, 0x14, 0, 0xb, - 0, 0x1f, 0, 0x1, 0, 0xe, 0, 0, 0, 0x54, - 0x69, 0x6d, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x4b, - 0x65, 0x79, 0x73, 0xa, 0, 0x5, 0, 0x80, 0xb1, 0x6, - 0xf4, 0x3b, 0x7b, 0xcf, 0x11, 0x8f, 0x52, 0, 0x40, 0x33, - 0x35, 0x94, 0xa3, 0x29, 0, 0x1, 0, 0x4, 0, 0, - 0, 0x74, 0x69, 0x6d, 0x65, 0x14, 0, 0x1, 0, 0x9, - 0, 0, 0, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x4b, 0x65, - 0x79, 0x73, 0x1, 0, 0x6, 0, 0, 0, 0x74, 0x66, - 0x6b, 0x65, 0x79, 0x73, 0x14, 0, 0xb, 0, 0x1f, 0, - 0x1, 0, 0xc, 0, 0, 0, 0x41, 0x6e, 0x69, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0xa, 0, - 0x5, 0, 0xa8, 0x46, 0xdd, 0x10, 0x5b, 0x77, 0xcf, 0x11, - 0x8f, 0x52, 0, 0x40, 0x33, 0x35, 0x94, 0xa3, 0x29, 0, - 0x1, 0, 0x7, 0, 0, 0, 0x6b, 0x65, 0x79, 0x54, - 0x79, 0x70, 0x65, 0x14, 0, 0x29, 0, 0x1, 0, 0x5, - 0, 0, 0, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x14, 0, - 0x34, 0, 0x1, 0, 0xe, 0, 0, 0, 0x54, 0x69, - 0x6d, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x4b, 0x65, - 0x79, 0x73, 0x1, 0, 0x4, 0, 0, 0, 0x6b, 0x65, - 0x79, 0x73, 0xe, 0, 0x1, 0, 0x5, 0, 0, 0, - 0x6e, 0x4b, 0x65, 0x79, 0x73, 0xf, 0, 0x14, 0, 0xb, - 0, 0x1f, 0, 0x1, 0, 0x10, 0, 0, 0, 0x41, - 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa, 0, 0x5, 0, 0xc0, - 0x56, 0xbf, 0xe2, 0xf, 0x84, 0xcf, 0x11, 0x8f, 0x52, 0, - 0x40, 0x33, 0x35, 0x94, 0xa3, 0x29, 0, 0x1, 0, 0xa, - 0, 0, 0, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6c, 0x6f, - 0x73, 0x65, 0x64, 0x14, 0, 0x29, 0, 0x1, 0, 0xf, - 0, 0, 0, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x14, 0, - 0xb, 0, 0x1f, 0, 0x1, 0, 0x9, 0, 0, 0, - 0x41, 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa, - 0, 0x5, 0, 0x4f, 0xab, 0x82, 0x3d, 0xda, 0x62, 0xcf, - 0x11, 0xab, 0x39, 0, 0x20, 0xaf, 0x71, 0xe4, 0x33, 0xe, - 0, 0x12, 0, 0x12, 0, 0x12, 0, 0xf, 0, 0xb, - 0, 0x1f, 0, 0x1, 0, 0xc, 0, 0, 0, 0x41, - 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, - 0x74, 0xa, 0, 0x5, 0, 0x50, 0xab, 0x82, 0x3d, 0xda, - 0x62, 0xcf, 0x11, 0xab, 0x39, 0, 0x20, 0xaf, 0x71, 0xe4, - 0x33, 0xe, 0, 0x1, 0, 0x9, 0, 0, 0, 0x41, - 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xf, 0, - 0xb, 0, 0x1f, 0, 0x1, 0, 0xa, 0, 0, 0, - 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x61, 0x74, 0x61, - 0xa, 0, 0x5, 0, 0xa0, 0xee, 0x23, 0x3a, 0xb1, 0x94, - 0xd0, 0x11, 0xab, 0x39, 0, 0x20, 0xaf, 0x71, 0xe4, 0x33, - 0xe, 0, 0x1, 0, 0x6, 0, 0, 0, 0x42, 0x49, - 0x4e, 0x41, 0x52, 0x59, 0xf, 0, 0xb, 0, 0x1f, 0, - 0x1, 0, 0x3, 0, 0, 0, 0x55, 0x72, 0x6c, 0xa, - 0, 0x5, 0, 0xa1, 0xee, 0x23, 0x3a, 0xb1, 0x94, 0xd0, - 0x11, 0xab, 0x39, 0, 0x20, 0xaf, 0x71, 0xe4, 0x33, 0x29, - 0, 0x1, 0, 0x5, 0, 0, 0, 0x6e, 0x55, 0x72, - 0x6c, 0x73, 0x14, 0, 0x34, 0, 0x31, 0, 0x1, 0, - 0x4, 0, 0, 0, 0x75, 0x72, 0x6c, 0x73, 0xe, 0, - 0x1, 0, 0x5, 0, 0, 0, 0x6e, 0x55, 0x72, 0x6c, - 0x73, 0xf, 0, 0x14, 0, 0xb, 0, 0x1f, 0, 0x1, - 0, 0xf, 0, 0, 0, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x73, 0x68, - 0xa, 0, 0x5, 0, 0x60, 0xc3, 0x63, 0x8a, 0x7d, 0x99, - 0xd0, 0x11, 0x94, 0x1c, 0, 0x80, 0xc8, 0xc, 0xfa, 0x7b, - 0xe, 0, 0x1, 0, 0x3, 0, 0, 0, 0x55, 0x72, - 0x6c, 0x13, 0, 0x1, 0, 0xa, 0, 0, 0, 0x49, - 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x61, 0x74, 0x61, 0xf, - 0, 0xb, 0, 0x1f, 0, 0x1, 0, 0x4, 0, 0, - 0, 0x47, 0x75, 0x69, 0x64, 0xa, 0, 0x5, 0, 0xe0, - 0x90, 0x27, 0xa4, 0x10, 0x78, 0xcf, 0x11, 0x8f, 0x52, 0, - 0x40, 0x33, 0x35, 0x94, 0xa3, 0x29, 0, 0x1, 0, 0x5, - 0, 0, 0, 0x64, 0x61, 0x74, 0x61, 0x31, 0x14, 0, - 0x28, 0, 0x1, 0, 0x5, 0, 0, 0, 0x64, 0x61, - 0x74, 0x61, 0x32, 0x14, 0, 0x28, 0, 0x1, 0, 0x5, - 0, 0, 0, 0x64, 0x61, 0x74, 0x61, 0x33, 0x14, 0, - 0x34, 0, 0x2d, 0, 0x1, 0, 0x5, 0, 0, 0, - 0x64, 0x61, 0x74, 0x61, 0x34, 0xe, 0, 0x3, 0, 0x8, - 0, 0, 0, 0xf, 0, 0x14, 0, 0xb, 0, 0x1f, - 0, 0x1, 0, 0xe, 0, 0, 0, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x79, 0xa, 0, 0x5, 0, 0xe0, 0x21, 0xf, 0x7f, 0xe1, - 0xbf, 0xd1, 0x11, 0x82, 0xc0, 0, 0xa0, 0xc9, 0x69, 0x72, - 0x71, 0x31, 0, 0x1, 0, 0x3, 0, 0, 0, 0x6b, - 0x65, 0x79, 0x14, 0, 0x31, 0, 0x1, 0, 0x5, 0, - 0, 0, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x14, 0, 0xb, - 0, 0x1f, 0, 0x1, 0, 0xb, 0, 0, 0, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x42, 0x61, 0x67, - 0xa, 0, 0x5, 0, 0xe1, 0x21, 0xf, 0x7f, 0xe1, 0xbf, - 0xd1, 0x11, 0x82, 0xc0, 0, 0xa0, 0xc9, 0x69, 0x72, 0x71, - 0xe, 0, 0x1, 0, 0xe, 0, 0, 0, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x79, 0xf, 0, 0xb, 0, 0x1f, 0, 0x1, 0, - 0xe, 0, 0, 0, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0xa, 0, - 0x5, 0, 0xa0, 0x6a, 0x11, 0x98, 0xba, 0xbd, 0xd1, 0x11, - 0x82, 0xc0, 0, 0xa0, 0xc9, 0x69, 0x72, 0x71, 0x1, 0, - 0x4, 0, 0, 0, 0x47, 0x75, 0x69, 0x64, 0x1, 0, - 0x12, 0, 0, 0, 0x67, 0x75, 0x69, 0x64, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x56, 0x69, 0x73, 0x75, - 0x61, 0x6c, 0x14, 0, 0xe, 0, 0x12, 0, 0x12, 0, - 0x12, 0, 0xf, 0, 0xb, 0, 0x1f, 0, 0x1, 0, - 0xb, 0, 0, 0, 0x52, 0x69, 0x67, 0x68, 0x74, 0x48, - 0x61, 0x6e, 0x64, 0x65, 0x64, 0xa, 0, 0x5, 0, 0xa0, - 0x5e, 0x5d, 0x7f, 0x3a, 0xd5, 0xd1, 0x11, 0x82, 0xc0, 0, - 0xa0, 0xc9, 0x69, 0x72, 0x71, 0x29, 0, 0x1, 0, 0xc, - 0, 0, 0, 0x62, 0x52, 0x69, 0x67, 0x68, 0x74, 0x48, - 0x61, 0x6e, 0x64, 0x65, 0x64, 0x14, 0, 0xb, 0 -}; - -#define D3DRM_XTEMPLATE_BYTES 3278 - -#endif /* _RMXFTMPL_H_ */ diff --git a/import/DirectX8/include/strmif.h b/import/DirectX8/include/strmif.h deleted file mode 100644 index 3eda1cb47..000000000 --- a/import/DirectX8/include/strmif.h +++ /dev/null @@ -1,29217 +0,0 @@ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 6.00.0347 */ -/* Compiler settings for strmif.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __strmif_h__ -#define __strmif_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __ICreateDevEnum_FWD_DEFINED__ -#define __ICreateDevEnum_FWD_DEFINED__ -typedef interface ICreateDevEnum ICreateDevEnum; -#endif /* __ICreateDevEnum_FWD_DEFINED__ */ - - -#ifndef __IPin_FWD_DEFINED__ -#define __IPin_FWD_DEFINED__ -typedef interface IPin IPin; -#endif /* __IPin_FWD_DEFINED__ */ - - -#ifndef __IEnumPins_FWD_DEFINED__ -#define __IEnumPins_FWD_DEFINED__ -typedef interface IEnumPins IEnumPins; -#endif /* __IEnumPins_FWD_DEFINED__ */ - - -#ifndef __IEnumMediaTypes_FWD_DEFINED__ -#define __IEnumMediaTypes_FWD_DEFINED__ -typedef interface IEnumMediaTypes IEnumMediaTypes; -#endif /* __IEnumMediaTypes_FWD_DEFINED__ */ - - -#ifndef __IFilterGraph_FWD_DEFINED__ -#define __IFilterGraph_FWD_DEFINED__ -typedef interface IFilterGraph IFilterGraph; -#endif /* __IFilterGraph_FWD_DEFINED__ */ - - -#ifndef __IEnumFilters_FWD_DEFINED__ -#define __IEnumFilters_FWD_DEFINED__ -typedef interface IEnumFilters IEnumFilters; -#endif /* __IEnumFilters_FWD_DEFINED__ */ - - -#ifndef __IMediaFilter_FWD_DEFINED__ -#define __IMediaFilter_FWD_DEFINED__ -typedef interface IMediaFilter IMediaFilter; -#endif /* __IMediaFilter_FWD_DEFINED__ */ - - -#ifndef __IBaseFilter_FWD_DEFINED__ -#define __IBaseFilter_FWD_DEFINED__ -typedef interface IBaseFilter IBaseFilter; -#endif /* __IBaseFilter_FWD_DEFINED__ */ - - -#ifndef __IReferenceClock_FWD_DEFINED__ -#define __IReferenceClock_FWD_DEFINED__ -typedef interface IReferenceClock IReferenceClock; -#endif /* __IReferenceClock_FWD_DEFINED__ */ - - -#ifndef __IReferenceClock2_FWD_DEFINED__ -#define __IReferenceClock2_FWD_DEFINED__ -typedef interface IReferenceClock2 IReferenceClock2; -#endif /* __IReferenceClock2_FWD_DEFINED__ */ - - -#ifndef __IMediaSample_FWD_DEFINED__ -#define __IMediaSample_FWD_DEFINED__ -typedef interface IMediaSample IMediaSample; -#endif /* __IMediaSample_FWD_DEFINED__ */ - - -#ifndef __IMediaSample2_FWD_DEFINED__ -#define __IMediaSample2_FWD_DEFINED__ -typedef interface IMediaSample2 IMediaSample2; -#endif /* __IMediaSample2_FWD_DEFINED__ */ - - -#ifndef __IMemAllocator_FWD_DEFINED__ -#define __IMemAllocator_FWD_DEFINED__ -typedef interface IMemAllocator IMemAllocator; -#endif /* __IMemAllocator_FWD_DEFINED__ */ - - -#ifndef __IMemAllocatorCallbackTemp_FWD_DEFINED__ -#define __IMemAllocatorCallbackTemp_FWD_DEFINED__ -typedef interface IMemAllocatorCallbackTemp IMemAllocatorCallbackTemp; -#endif /* __IMemAllocatorCallbackTemp_FWD_DEFINED__ */ - - -#ifndef __IMemAllocatorNotifyCallbackTemp_FWD_DEFINED__ -#define __IMemAllocatorNotifyCallbackTemp_FWD_DEFINED__ -typedef interface IMemAllocatorNotifyCallbackTemp IMemAllocatorNotifyCallbackTemp; -#endif /* __IMemAllocatorNotifyCallbackTemp_FWD_DEFINED__ */ - - -#ifndef __IMemInputPin_FWD_DEFINED__ -#define __IMemInputPin_FWD_DEFINED__ -typedef interface IMemInputPin IMemInputPin; -#endif /* __IMemInputPin_FWD_DEFINED__ */ - - -#ifndef __IAMovieSetup_FWD_DEFINED__ -#define __IAMovieSetup_FWD_DEFINED__ -typedef interface IAMovieSetup IAMovieSetup; -#endif /* __IAMovieSetup_FWD_DEFINED__ */ - - -#ifndef __IMediaSeeking_FWD_DEFINED__ -#define __IMediaSeeking_FWD_DEFINED__ -typedef interface IMediaSeeking IMediaSeeking; -#endif /* __IMediaSeeking_FWD_DEFINED__ */ - - -#ifndef __IEnumRegFilters_FWD_DEFINED__ -#define __IEnumRegFilters_FWD_DEFINED__ -typedef interface IEnumRegFilters IEnumRegFilters; -#endif /* __IEnumRegFilters_FWD_DEFINED__ */ - - -#ifndef __IFilterMapper_FWD_DEFINED__ -#define __IFilterMapper_FWD_DEFINED__ -typedef interface IFilterMapper IFilterMapper; -#endif /* __IFilterMapper_FWD_DEFINED__ */ - - -#ifndef __IFilterMapper2_FWD_DEFINED__ -#define __IFilterMapper2_FWD_DEFINED__ -typedef interface IFilterMapper2 IFilterMapper2; -#endif /* __IFilterMapper2_FWD_DEFINED__ */ - - -#ifndef __IFilterMapper3_FWD_DEFINED__ -#define __IFilterMapper3_FWD_DEFINED__ -typedef interface IFilterMapper3 IFilterMapper3; -#endif /* __IFilterMapper3_FWD_DEFINED__ */ - - -#ifndef __IQualityControl_FWD_DEFINED__ -#define __IQualityControl_FWD_DEFINED__ -typedef interface IQualityControl IQualityControl; -#endif /* __IQualityControl_FWD_DEFINED__ */ - - -#ifndef __IOverlayNotify_FWD_DEFINED__ -#define __IOverlayNotify_FWD_DEFINED__ -typedef interface IOverlayNotify IOverlayNotify; -#endif /* __IOverlayNotify_FWD_DEFINED__ */ - - -#ifndef __IOverlayNotify2_FWD_DEFINED__ -#define __IOverlayNotify2_FWD_DEFINED__ -typedef interface IOverlayNotify2 IOverlayNotify2; -#endif /* __IOverlayNotify2_FWD_DEFINED__ */ - - -#ifndef __IOverlay_FWD_DEFINED__ -#define __IOverlay_FWD_DEFINED__ -typedef interface IOverlay IOverlay; -#endif /* __IOverlay_FWD_DEFINED__ */ - - -#ifndef __IMediaEventSink_FWD_DEFINED__ -#define __IMediaEventSink_FWD_DEFINED__ -typedef interface IMediaEventSink IMediaEventSink; -#endif /* __IMediaEventSink_FWD_DEFINED__ */ - - -#ifndef __IFileSourceFilter_FWD_DEFINED__ -#define __IFileSourceFilter_FWD_DEFINED__ -typedef interface IFileSourceFilter IFileSourceFilter; -#endif /* __IFileSourceFilter_FWD_DEFINED__ */ - - -#ifndef __IFileSinkFilter_FWD_DEFINED__ -#define __IFileSinkFilter_FWD_DEFINED__ -typedef interface IFileSinkFilter IFileSinkFilter; -#endif /* __IFileSinkFilter_FWD_DEFINED__ */ - - -#ifndef __IFileSinkFilter2_FWD_DEFINED__ -#define __IFileSinkFilter2_FWD_DEFINED__ -typedef interface IFileSinkFilter2 IFileSinkFilter2; -#endif /* __IFileSinkFilter2_FWD_DEFINED__ */ - - -#ifndef __IGraphBuilder_FWD_DEFINED__ -#define __IGraphBuilder_FWD_DEFINED__ -typedef interface IGraphBuilder IGraphBuilder; -#endif /* __IGraphBuilder_FWD_DEFINED__ */ - - -#ifndef __ICaptureGraphBuilder_FWD_DEFINED__ -#define __ICaptureGraphBuilder_FWD_DEFINED__ -typedef interface ICaptureGraphBuilder ICaptureGraphBuilder; -#endif /* __ICaptureGraphBuilder_FWD_DEFINED__ */ - - -#ifndef __IAMCopyCaptureFileProgress_FWD_DEFINED__ -#define __IAMCopyCaptureFileProgress_FWD_DEFINED__ -typedef interface IAMCopyCaptureFileProgress IAMCopyCaptureFileProgress; -#endif /* __IAMCopyCaptureFileProgress_FWD_DEFINED__ */ - - -#ifndef __ICaptureGraphBuilder2_FWD_DEFINED__ -#define __ICaptureGraphBuilder2_FWD_DEFINED__ -typedef interface ICaptureGraphBuilder2 ICaptureGraphBuilder2; -#endif /* __ICaptureGraphBuilder2_FWD_DEFINED__ */ - - -#ifndef __IFilterGraph2_FWD_DEFINED__ -#define __IFilterGraph2_FWD_DEFINED__ -typedef interface IFilterGraph2 IFilterGraph2; -#endif /* __IFilterGraph2_FWD_DEFINED__ */ - - -#ifndef __IStreamBuilder_FWD_DEFINED__ -#define __IStreamBuilder_FWD_DEFINED__ -typedef interface IStreamBuilder IStreamBuilder; -#endif /* __IStreamBuilder_FWD_DEFINED__ */ - - -#ifndef __IAsyncReader_FWD_DEFINED__ -#define __IAsyncReader_FWD_DEFINED__ -typedef interface IAsyncReader IAsyncReader; -#endif /* __IAsyncReader_FWD_DEFINED__ */ - - -#ifndef __IGraphVersion_FWD_DEFINED__ -#define __IGraphVersion_FWD_DEFINED__ -typedef interface IGraphVersion IGraphVersion; -#endif /* __IGraphVersion_FWD_DEFINED__ */ - - -#ifndef __IResourceConsumer_FWD_DEFINED__ -#define __IResourceConsumer_FWD_DEFINED__ -typedef interface IResourceConsumer IResourceConsumer; -#endif /* __IResourceConsumer_FWD_DEFINED__ */ - - -#ifndef __IResourceManager_FWD_DEFINED__ -#define __IResourceManager_FWD_DEFINED__ -typedef interface IResourceManager IResourceManager; -#endif /* __IResourceManager_FWD_DEFINED__ */ - - -#ifndef __IDistributorNotify_FWD_DEFINED__ -#define __IDistributorNotify_FWD_DEFINED__ -typedef interface IDistributorNotify IDistributorNotify; -#endif /* __IDistributorNotify_FWD_DEFINED__ */ - - -#ifndef __IAMStreamControl_FWD_DEFINED__ -#define __IAMStreamControl_FWD_DEFINED__ -typedef interface IAMStreamControl IAMStreamControl; -#endif /* __IAMStreamControl_FWD_DEFINED__ */ - - -#ifndef __ISeekingPassThru_FWD_DEFINED__ -#define __ISeekingPassThru_FWD_DEFINED__ -typedef interface ISeekingPassThru ISeekingPassThru; -#endif /* __ISeekingPassThru_FWD_DEFINED__ */ - - -#ifndef __IAMStreamConfig_FWD_DEFINED__ -#define __IAMStreamConfig_FWD_DEFINED__ -typedef interface IAMStreamConfig IAMStreamConfig; -#endif /* __IAMStreamConfig_FWD_DEFINED__ */ - - -#ifndef __IConfigInterleaving_FWD_DEFINED__ -#define __IConfigInterleaving_FWD_DEFINED__ -typedef interface IConfigInterleaving IConfigInterleaving; -#endif /* __IConfigInterleaving_FWD_DEFINED__ */ - - -#ifndef __IConfigAviMux_FWD_DEFINED__ -#define __IConfigAviMux_FWD_DEFINED__ -typedef interface IConfigAviMux IConfigAviMux; -#endif /* __IConfigAviMux_FWD_DEFINED__ */ - - -#ifndef __IAMVideoCompression_FWD_DEFINED__ -#define __IAMVideoCompression_FWD_DEFINED__ -typedef interface IAMVideoCompression IAMVideoCompression; -#endif /* __IAMVideoCompression_FWD_DEFINED__ */ - - -#ifndef __IAMVfwCaptureDialogs_FWD_DEFINED__ -#define __IAMVfwCaptureDialogs_FWD_DEFINED__ -typedef interface IAMVfwCaptureDialogs IAMVfwCaptureDialogs; -#endif /* __IAMVfwCaptureDialogs_FWD_DEFINED__ */ - - -#ifndef __IAMVfwCompressDialogs_FWD_DEFINED__ -#define __IAMVfwCompressDialogs_FWD_DEFINED__ -typedef interface IAMVfwCompressDialogs IAMVfwCompressDialogs; -#endif /* __IAMVfwCompressDialogs_FWD_DEFINED__ */ - - -#ifndef __IAMDroppedFrames_FWD_DEFINED__ -#define __IAMDroppedFrames_FWD_DEFINED__ -typedef interface IAMDroppedFrames IAMDroppedFrames; -#endif /* __IAMDroppedFrames_FWD_DEFINED__ */ - - -#ifndef __IAMAudioInputMixer_FWD_DEFINED__ -#define __IAMAudioInputMixer_FWD_DEFINED__ -typedef interface IAMAudioInputMixer IAMAudioInputMixer; -#endif /* __IAMAudioInputMixer_FWD_DEFINED__ */ - - -#ifndef __IAMBufferNegotiation_FWD_DEFINED__ -#define __IAMBufferNegotiation_FWD_DEFINED__ -typedef interface IAMBufferNegotiation IAMBufferNegotiation; -#endif /* __IAMBufferNegotiation_FWD_DEFINED__ */ - - -#ifndef __IAMAnalogVideoDecoder_FWD_DEFINED__ -#define __IAMAnalogVideoDecoder_FWD_DEFINED__ -typedef interface IAMAnalogVideoDecoder IAMAnalogVideoDecoder; -#endif /* __IAMAnalogVideoDecoder_FWD_DEFINED__ */ - - -#ifndef __IAMVideoProcAmp_FWD_DEFINED__ -#define __IAMVideoProcAmp_FWD_DEFINED__ -typedef interface IAMVideoProcAmp IAMVideoProcAmp; -#endif /* __IAMVideoProcAmp_FWD_DEFINED__ */ - - -#ifndef __IAMCameraControl_FWD_DEFINED__ -#define __IAMCameraControl_FWD_DEFINED__ -typedef interface IAMCameraControl IAMCameraControl; -#endif /* __IAMCameraControl_FWD_DEFINED__ */ - - -#ifndef __IAMVideoControl_FWD_DEFINED__ -#define __IAMVideoControl_FWD_DEFINED__ -typedef interface IAMVideoControl IAMVideoControl; -#endif /* __IAMVideoControl_FWD_DEFINED__ */ - - -#ifndef __IAMCrossbar_FWD_DEFINED__ -#define __IAMCrossbar_FWD_DEFINED__ -typedef interface IAMCrossbar IAMCrossbar; -#endif /* __IAMCrossbar_FWD_DEFINED__ */ - - -#ifndef __IAMTuner_FWD_DEFINED__ -#define __IAMTuner_FWD_DEFINED__ -typedef interface IAMTuner IAMTuner; -#endif /* __IAMTuner_FWD_DEFINED__ */ - - -#ifndef __IAMTunerNotification_FWD_DEFINED__ -#define __IAMTunerNotification_FWD_DEFINED__ -typedef interface IAMTunerNotification IAMTunerNotification; -#endif /* __IAMTunerNotification_FWD_DEFINED__ */ - - -#ifndef __IAMTVTuner_FWD_DEFINED__ -#define __IAMTVTuner_FWD_DEFINED__ -typedef interface IAMTVTuner IAMTVTuner; -#endif /* __IAMTVTuner_FWD_DEFINED__ */ - - -#ifndef __IBPCSatelliteTuner_FWD_DEFINED__ -#define __IBPCSatelliteTuner_FWD_DEFINED__ -typedef interface IBPCSatelliteTuner IBPCSatelliteTuner; -#endif /* __IBPCSatelliteTuner_FWD_DEFINED__ */ - - -#ifndef __IAMTVAudio_FWD_DEFINED__ -#define __IAMTVAudio_FWD_DEFINED__ -typedef interface IAMTVAudio IAMTVAudio; -#endif /* __IAMTVAudio_FWD_DEFINED__ */ - - -#ifndef __IAMTVAudioNotification_FWD_DEFINED__ -#define __IAMTVAudioNotification_FWD_DEFINED__ -typedef interface IAMTVAudioNotification IAMTVAudioNotification; -#endif /* __IAMTVAudioNotification_FWD_DEFINED__ */ - - -#ifndef __IAMAnalogVideoEncoder_FWD_DEFINED__ -#define __IAMAnalogVideoEncoder_FWD_DEFINED__ -typedef interface IAMAnalogVideoEncoder IAMAnalogVideoEncoder; -#endif /* __IAMAnalogVideoEncoder_FWD_DEFINED__ */ - - -#ifndef __IKsPropertySet_FWD_DEFINED__ -#define __IKsPropertySet_FWD_DEFINED__ -typedef interface IKsPropertySet IKsPropertySet; -#endif /* __IKsPropertySet_FWD_DEFINED__ */ - - -#ifndef __IMediaPropertyBag_FWD_DEFINED__ -#define __IMediaPropertyBag_FWD_DEFINED__ -typedef interface IMediaPropertyBag IMediaPropertyBag; -#endif /* __IMediaPropertyBag_FWD_DEFINED__ */ - - -#ifndef __IPersistMediaPropertyBag_FWD_DEFINED__ -#define __IPersistMediaPropertyBag_FWD_DEFINED__ -typedef interface IPersistMediaPropertyBag IPersistMediaPropertyBag; -#endif /* __IPersistMediaPropertyBag_FWD_DEFINED__ */ - - -#ifndef __IAMPhysicalPinInfo_FWD_DEFINED__ -#define __IAMPhysicalPinInfo_FWD_DEFINED__ -typedef interface IAMPhysicalPinInfo IAMPhysicalPinInfo; -#endif /* __IAMPhysicalPinInfo_FWD_DEFINED__ */ - - -#ifndef __IAMExtDevice_FWD_DEFINED__ -#define __IAMExtDevice_FWD_DEFINED__ -typedef interface IAMExtDevice IAMExtDevice; -#endif /* __IAMExtDevice_FWD_DEFINED__ */ - - -#ifndef __IAMExtTransport_FWD_DEFINED__ -#define __IAMExtTransport_FWD_DEFINED__ -typedef interface IAMExtTransport IAMExtTransport; -#endif /* __IAMExtTransport_FWD_DEFINED__ */ - - -#ifndef __IAMTimecodeReader_FWD_DEFINED__ -#define __IAMTimecodeReader_FWD_DEFINED__ -typedef interface IAMTimecodeReader IAMTimecodeReader; -#endif /* __IAMTimecodeReader_FWD_DEFINED__ */ - - -#ifndef __IAMTimecodeGenerator_FWD_DEFINED__ -#define __IAMTimecodeGenerator_FWD_DEFINED__ -typedef interface IAMTimecodeGenerator IAMTimecodeGenerator; -#endif /* __IAMTimecodeGenerator_FWD_DEFINED__ */ - - -#ifndef __IAMTimecodeDisplay_FWD_DEFINED__ -#define __IAMTimecodeDisplay_FWD_DEFINED__ -typedef interface IAMTimecodeDisplay IAMTimecodeDisplay; -#endif /* __IAMTimecodeDisplay_FWD_DEFINED__ */ - - -#ifndef __IAMDevMemoryAllocator_FWD_DEFINED__ -#define __IAMDevMemoryAllocator_FWD_DEFINED__ -typedef interface IAMDevMemoryAllocator IAMDevMemoryAllocator; -#endif /* __IAMDevMemoryAllocator_FWD_DEFINED__ */ - - -#ifndef __IAMDevMemoryControl_FWD_DEFINED__ -#define __IAMDevMemoryControl_FWD_DEFINED__ -typedef interface IAMDevMemoryControl IAMDevMemoryControl; -#endif /* __IAMDevMemoryControl_FWD_DEFINED__ */ - - -#ifndef __IAMStreamSelect_FWD_DEFINED__ -#define __IAMStreamSelect_FWD_DEFINED__ -typedef interface IAMStreamSelect IAMStreamSelect; -#endif /* __IAMStreamSelect_FWD_DEFINED__ */ - - -#ifndef __IAMResourceControl_FWD_DEFINED__ -#define __IAMResourceControl_FWD_DEFINED__ -typedef interface IAMResourceControl IAMResourceControl; -#endif /* __IAMResourceControl_FWD_DEFINED__ */ - - -#ifndef __IAMClockAdjust_FWD_DEFINED__ -#define __IAMClockAdjust_FWD_DEFINED__ -typedef interface IAMClockAdjust IAMClockAdjust; -#endif /* __IAMClockAdjust_FWD_DEFINED__ */ - - -#ifndef __IAMFilterMiscFlags_FWD_DEFINED__ -#define __IAMFilterMiscFlags_FWD_DEFINED__ -typedef interface IAMFilterMiscFlags IAMFilterMiscFlags; -#endif /* __IAMFilterMiscFlags_FWD_DEFINED__ */ - - -#ifndef __IDrawVideoImage_FWD_DEFINED__ -#define __IDrawVideoImage_FWD_DEFINED__ -typedef interface IDrawVideoImage IDrawVideoImage; -#endif /* __IDrawVideoImage_FWD_DEFINED__ */ - - -#ifndef __IDecimateVideoImage_FWD_DEFINED__ -#define __IDecimateVideoImage_FWD_DEFINED__ -typedef interface IDecimateVideoImage IDecimateVideoImage; -#endif /* __IDecimateVideoImage_FWD_DEFINED__ */ - - -#ifndef __IAMVideoDecimationProperties_FWD_DEFINED__ -#define __IAMVideoDecimationProperties_FWD_DEFINED__ -typedef interface IAMVideoDecimationProperties IAMVideoDecimationProperties; -#endif /* __IAMVideoDecimationProperties_FWD_DEFINED__ */ - - -#ifndef __IVideoFrameStep_FWD_DEFINED__ -#define __IVideoFrameStep_FWD_DEFINED__ -typedef interface IVideoFrameStep IVideoFrameStep; -#endif /* __IVideoFrameStep_FWD_DEFINED__ */ - - -#ifndef __IAMLatency_FWD_DEFINED__ -#define __IAMLatency_FWD_DEFINED__ -typedef interface IAMLatency IAMLatency; -#endif /* __IAMLatency_FWD_DEFINED__ */ - - -#ifndef __IAMPushSource_FWD_DEFINED__ -#define __IAMPushSource_FWD_DEFINED__ -typedef interface IAMPushSource IAMPushSource; -#endif /* __IAMPushSource_FWD_DEFINED__ */ - - -#ifndef __IAMDeviceRemoval_FWD_DEFINED__ -#define __IAMDeviceRemoval_FWD_DEFINED__ -typedef interface IAMDeviceRemoval IAMDeviceRemoval; -#endif /* __IAMDeviceRemoval_FWD_DEFINED__ */ - - -#ifndef __IDVEnc_FWD_DEFINED__ -#define __IDVEnc_FWD_DEFINED__ -typedef interface IDVEnc IDVEnc; -#endif /* __IDVEnc_FWD_DEFINED__ */ - - -#ifndef __IIPDVDec_FWD_DEFINED__ -#define __IIPDVDec_FWD_DEFINED__ -typedef interface IIPDVDec IIPDVDec; -#endif /* __IIPDVDec_FWD_DEFINED__ */ - - -#ifndef __IDVRGB219_FWD_DEFINED__ -#define __IDVRGB219_FWD_DEFINED__ -typedef interface IDVRGB219 IDVRGB219; -#endif /* __IDVRGB219_FWD_DEFINED__ */ - - -#ifndef __IDVSplitter_FWD_DEFINED__ -#define __IDVSplitter_FWD_DEFINED__ -typedef interface IDVSplitter IDVSplitter; -#endif /* __IDVSplitter_FWD_DEFINED__ */ - - -#ifndef __IAMAudioRendererStats_FWD_DEFINED__ -#define __IAMAudioRendererStats_FWD_DEFINED__ -typedef interface IAMAudioRendererStats IAMAudioRendererStats; -#endif /* __IAMAudioRendererStats_FWD_DEFINED__ */ - - -#ifndef __IAMGraphStreams_FWD_DEFINED__ -#define __IAMGraphStreams_FWD_DEFINED__ -typedef interface IAMGraphStreams IAMGraphStreams; -#endif /* __IAMGraphStreams_FWD_DEFINED__ */ - - -#ifndef __IAMOverlayFX_FWD_DEFINED__ -#define __IAMOverlayFX_FWD_DEFINED__ -typedef interface IAMOverlayFX IAMOverlayFX; -#endif /* __IAMOverlayFX_FWD_DEFINED__ */ - - -#ifndef __IAMOpenProgress_FWD_DEFINED__ -#define __IAMOpenProgress_FWD_DEFINED__ -typedef interface IAMOpenProgress IAMOpenProgress; -#endif /* __IAMOpenProgress_FWD_DEFINED__ */ - - -#ifndef __IMpeg2Demultiplexer_FWD_DEFINED__ -#define __IMpeg2Demultiplexer_FWD_DEFINED__ -typedef interface IMpeg2Demultiplexer IMpeg2Demultiplexer; -#endif /* __IMpeg2Demultiplexer_FWD_DEFINED__ */ - - -#ifndef __IEnumStreamIdMap_FWD_DEFINED__ -#define __IEnumStreamIdMap_FWD_DEFINED__ -typedef interface IEnumStreamIdMap IEnumStreamIdMap; -#endif /* __IEnumStreamIdMap_FWD_DEFINED__ */ - - -#ifndef __IMPEG2StreamIdMap_FWD_DEFINED__ -#define __IMPEG2StreamIdMap_FWD_DEFINED__ -typedef interface IMPEG2StreamIdMap IMPEG2StreamIdMap; -#endif /* __IMPEG2StreamIdMap_FWD_DEFINED__ */ - - -#ifndef __IRegisterServiceProvider_FWD_DEFINED__ -#define __IRegisterServiceProvider_FWD_DEFINED__ -typedef interface IRegisterServiceProvider IRegisterServiceProvider; -#endif /* __IRegisterServiceProvider_FWD_DEFINED__ */ - - -#ifndef __IAMDecoderCaps_FWD_DEFINED__ -#define __IAMDecoderCaps_FWD_DEFINED__ -typedef interface IAMDecoderCaps IAMDecoderCaps; -#endif /* __IAMDecoderCaps_FWD_DEFINED__ */ - - -#ifndef __IAMClockSlave_FWD_DEFINED__ -#define __IAMClockSlave_FWD_DEFINED__ -typedef interface IAMClockSlave IAMClockSlave; -#endif /* __IAMClockSlave_FWD_DEFINED__ */ - - -#ifndef __IDvdControl_FWD_DEFINED__ -#define __IDvdControl_FWD_DEFINED__ -typedef interface IDvdControl IDvdControl; -#endif /* __IDvdControl_FWD_DEFINED__ */ - - -#ifndef __IDvdInfo_FWD_DEFINED__ -#define __IDvdInfo_FWD_DEFINED__ -typedef interface IDvdInfo IDvdInfo; -#endif /* __IDvdInfo_FWD_DEFINED__ */ - - -#ifndef __IDvdCmd_FWD_DEFINED__ -#define __IDvdCmd_FWD_DEFINED__ -typedef interface IDvdCmd IDvdCmd; -#endif /* __IDvdCmd_FWD_DEFINED__ */ - - -#ifndef __IDvdState_FWD_DEFINED__ -#define __IDvdState_FWD_DEFINED__ -typedef interface IDvdState IDvdState; -#endif /* __IDvdState_FWD_DEFINED__ */ - - -#ifndef __IDvdControl2_FWD_DEFINED__ -#define __IDvdControl2_FWD_DEFINED__ -typedef interface IDvdControl2 IDvdControl2; -#endif /* __IDvdControl2_FWD_DEFINED__ */ - - -#ifndef __IDvdInfo2_FWD_DEFINED__ -#define __IDvdInfo2_FWD_DEFINED__ -typedef interface IDvdInfo2 IDvdInfo2; -#endif /* __IDvdInfo2_FWD_DEFINED__ */ - - -#ifndef __IDvdGraphBuilder_FWD_DEFINED__ -#define __IDvdGraphBuilder_FWD_DEFINED__ -typedef interface IDvdGraphBuilder IDvdGraphBuilder; -#endif /* __IDvdGraphBuilder_FWD_DEFINED__ */ - - -#ifndef __IDDrawExclModeVideo_FWD_DEFINED__ -#define __IDDrawExclModeVideo_FWD_DEFINED__ -typedef interface IDDrawExclModeVideo IDDrawExclModeVideo; -#endif /* __IDDrawExclModeVideo_FWD_DEFINED__ */ - - -#ifndef __IDDrawExclModeVideoCallback_FWD_DEFINED__ -#define __IDDrawExclModeVideoCallback_FWD_DEFINED__ -typedef interface IDDrawExclModeVideoCallback IDDrawExclModeVideoCallback; -#endif /* __IDDrawExclModeVideoCallback_FWD_DEFINED__ */ - - -#ifndef __IPinConnection_FWD_DEFINED__ -#define __IPinConnection_FWD_DEFINED__ -typedef interface IPinConnection IPinConnection; -#endif /* __IPinConnection_FWD_DEFINED__ */ - - -#ifndef __IPinFlowControl_FWD_DEFINED__ -#define __IPinFlowControl_FWD_DEFINED__ -typedef interface IPinFlowControl IPinFlowControl; -#endif /* __IPinFlowControl_FWD_DEFINED__ */ - - -#ifndef __IGraphConfig_FWD_DEFINED__ -#define __IGraphConfig_FWD_DEFINED__ -typedef interface IGraphConfig IGraphConfig; -#endif /* __IGraphConfig_FWD_DEFINED__ */ - - -#ifndef __IGraphConfigCallback_FWD_DEFINED__ -#define __IGraphConfigCallback_FWD_DEFINED__ -typedef interface IGraphConfigCallback IGraphConfigCallback; -#endif /* __IGraphConfigCallback_FWD_DEFINED__ */ - - -#ifndef __IFilterChain_FWD_DEFINED__ -#define __IFilterChain_FWD_DEFINED__ -typedef interface IFilterChain IFilterChain; -#endif /* __IFilterChain_FWD_DEFINED__ */ - - -#ifndef __IVMRImagePresenter_FWD_DEFINED__ -#define __IVMRImagePresenter_FWD_DEFINED__ -typedef interface IVMRImagePresenter IVMRImagePresenter; -#endif /* __IVMRImagePresenter_FWD_DEFINED__ */ - - -#ifndef __IVMRSurfaceAllocator_FWD_DEFINED__ -#define __IVMRSurfaceAllocator_FWD_DEFINED__ -typedef interface IVMRSurfaceAllocator IVMRSurfaceAllocator; -#endif /* __IVMRSurfaceAllocator_FWD_DEFINED__ */ - - -#ifndef __IVMRSurfaceAllocatorNotify_FWD_DEFINED__ -#define __IVMRSurfaceAllocatorNotify_FWD_DEFINED__ -typedef interface IVMRSurfaceAllocatorNotify IVMRSurfaceAllocatorNotify; -#endif /* __IVMRSurfaceAllocatorNotify_FWD_DEFINED__ */ - - -#ifndef __IVMRWindowlessControl_FWD_DEFINED__ -#define __IVMRWindowlessControl_FWD_DEFINED__ -typedef interface IVMRWindowlessControl IVMRWindowlessControl; -#endif /* __IVMRWindowlessControl_FWD_DEFINED__ */ - - -#ifndef __IVMRMixerControl_FWD_DEFINED__ -#define __IVMRMixerControl_FWD_DEFINED__ -typedef interface IVMRMixerControl IVMRMixerControl; -#endif /* __IVMRMixerControl_FWD_DEFINED__ */ - - -#ifndef __IVMRMonitorConfig_FWD_DEFINED__ -#define __IVMRMonitorConfig_FWD_DEFINED__ -typedef interface IVMRMonitorConfig IVMRMonitorConfig; -#endif /* __IVMRMonitorConfig_FWD_DEFINED__ */ - - -#ifndef __IVMRFilterConfig_FWD_DEFINED__ -#define __IVMRFilterConfig_FWD_DEFINED__ -typedef interface IVMRFilterConfig IVMRFilterConfig; -#endif /* __IVMRFilterConfig_FWD_DEFINED__ */ - - -#ifndef __IVMRMixerBitmap_FWD_DEFINED__ -#define __IVMRMixerBitmap_FWD_DEFINED__ -typedef interface IVMRMixerBitmap IVMRMixerBitmap; -#endif /* __IVMRMixerBitmap_FWD_DEFINED__ */ - - -#ifndef __IVMRImageCompositor_FWD_DEFINED__ -#define __IVMRImageCompositor_FWD_DEFINED__ -typedef interface IVMRImageCompositor IVMRImageCompositor; -#endif /* __IVMRImageCompositor_FWD_DEFINED__ */ - - -#ifndef __IVMRVideoStreamControl_FWD_DEFINED__ -#define __IVMRVideoStreamControl_FWD_DEFINED__ -typedef interface IVMRVideoStreamControl IVMRVideoStreamControl; -#endif /* __IVMRVideoStreamControl_FWD_DEFINED__ */ - - -#ifndef __IVMRSurface_FWD_DEFINED__ -#define __IVMRSurface_FWD_DEFINED__ -typedef interface IVMRSurface IVMRSurface; -#endif /* __IVMRSurface_FWD_DEFINED__ */ - - -#ifndef __IVMRImagePresenterConfig_FWD_DEFINED__ -#define __IVMRImagePresenterConfig_FWD_DEFINED__ -typedef interface IVMRImagePresenterConfig IVMRImagePresenterConfig; -#endif /* __IVMRImagePresenterConfig_FWD_DEFINED__ */ - - -#ifndef __IVMRImagePresenterExclModeConfig_FWD_DEFINED__ -#define __IVMRImagePresenterExclModeConfig_FWD_DEFINED__ -typedef interface IVMRImagePresenterExclModeConfig IVMRImagePresenterExclModeConfig; -#endif /* __IVMRImagePresenterExclModeConfig_FWD_DEFINED__ */ - - -#ifndef __IVPManager_FWD_DEFINED__ -#define __IVPManager_FWD_DEFINED__ -typedef interface IVPManager IVPManager; -#endif /* __IVPManager_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "unknwn.h" -#include "objidl.h" -#include "oaidl.h" -#include "ocidl.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void * ); - -/* interface __MIDL_itf_strmif_0000 */ -/* [local] */ - -//+------------------------------------------------------------------------- -// -// Copyright (C) Microsoft Corporation, 1999-2001. -// -//-------------------------------------------------------------------------- -// Disable /W4 compiler warning C4201: nameless struct/union -#pragma warning(disable:4201) // Disable C4201: nameless struct/union - -#define CDEF_CLASS_DEFAULT 0x0001 -#define CDEF_BYPASS_CLASS_MANAGER 0x0002 -#define CDEF_MERIT_ABOVE_DO_NOT_USE 0x0008 -#define CDEF_DEVMON_CMGR_DEVICE 0x0010 -#define CDEF_DEVMON_DMO 0x0020 -#define CDEF_DEVMON_PNP_DEVICE 0x0040 -#define CDEF_DEVMON_FILTER 0x0080 -#define CDEF_DEVMON_SELECTIVE_MASK 0x00f0 - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0000_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0000_v0_0_s_ifspec; - -#ifndef __ICreateDevEnum_INTERFACE_DEFINED__ -#define __ICreateDevEnum_INTERFACE_DEFINED__ - -/* interface ICreateDevEnum */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_ICreateDevEnum; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("29840822-5B84-11D0-BD3B-00A0C911CE86") - ICreateDevEnum : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE CreateClassEnumerator( - /* [in] */ REFCLSID clsidDeviceClass, - /* [out] */ IEnumMoniker **ppEnumMoniker, - /* [in] */ DWORD dwFlags) = 0; - - }; - -#else /* C style interface */ - - typedef struct ICreateDevEnumVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ICreateDevEnum * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ICreateDevEnum * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ICreateDevEnum * This); - - HRESULT ( STDMETHODCALLTYPE *CreateClassEnumerator )( - ICreateDevEnum * This, - /* [in] */ REFCLSID clsidDeviceClass, - /* [out] */ IEnumMoniker **ppEnumMoniker, - /* [in] */ DWORD dwFlags); - - END_INTERFACE - } ICreateDevEnumVtbl; - - interface ICreateDevEnum - { - CONST_VTBL struct ICreateDevEnumVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ICreateDevEnum_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ICreateDevEnum_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ICreateDevEnum_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ICreateDevEnum_CreateClassEnumerator(This,clsidDeviceClass,ppEnumMoniker,dwFlags) \ - (This)->lpVtbl -> CreateClassEnumerator(This,clsidDeviceClass,ppEnumMoniker,dwFlags) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE ICreateDevEnum_CreateClassEnumerator_Proxy( - ICreateDevEnum * This, - /* [in] */ REFCLSID clsidDeviceClass, - /* [out] */ IEnumMoniker **ppEnumMoniker, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB ICreateDevEnum_CreateClassEnumerator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ICreateDevEnum_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0112 */ -/* [local] */ - -#define CHARS_IN_GUID 39 -typedef struct _AMMediaType - { - GUID majortype; - GUID subtype; - BOOL bFixedSizeSamples; - BOOL bTemporalCompression; - ULONG lSampleSize; - GUID formattype; - IUnknown *pUnk; - ULONG cbFormat; - /* [size_is] */ BYTE *pbFormat; - } AM_MEDIA_TYPE; - -typedef -enum _PinDirection - { PINDIR_INPUT = 0, - PINDIR_OUTPUT = PINDIR_INPUT + 1 - } PIN_DIRECTION; - -#define MAX_PIN_NAME 128 -#define MAX_FILTER_NAME 128 -typedef LONGLONG REFERENCE_TIME; - -typedef double REFTIME; - -typedef DWORD_PTR HSEMAPHORE; - -typedef DWORD_PTR HEVENT; - -typedef struct _AllocatorProperties - { - long cBuffers; - long cbBuffer; - long cbAlign; - long cbPrefix; - } ALLOCATOR_PROPERTIES; - - - - - - - - - - - - - - - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0112_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0112_v0_0_s_ifspec; - -#ifndef __IPin_INTERFACE_DEFINED__ -#define __IPin_INTERFACE_DEFINED__ - -/* interface IPin */ -/* [unique][uuid][object] */ - -typedef struct _PinInfo - { - IBaseFilter *pFilter; - PIN_DIRECTION dir; - WCHAR achName[ 128 ]; - } PIN_INFO; - - -EXTERN_C const IID IID_IPin; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a86891-0ad4-11ce-b03a-0020af0ba770") - IPin : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Connect( - /* [in] */ IPin *pReceivePin, - /* [in] */ const AM_MEDIA_TYPE *pmt) = 0; - - virtual HRESULT STDMETHODCALLTYPE ReceiveConnection( - /* [in] */ IPin *pConnector, - /* [in] */ const AM_MEDIA_TYPE *pmt) = 0; - - virtual HRESULT STDMETHODCALLTYPE Disconnect( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE ConnectedTo( - /* [out] */ IPin **pPin) = 0; - - virtual HRESULT STDMETHODCALLTYPE ConnectionMediaType( - /* [out] */ AM_MEDIA_TYPE *pmt) = 0; - - virtual HRESULT STDMETHODCALLTYPE QueryPinInfo( - /* [out] */ PIN_INFO *pInfo) = 0; - - virtual HRESULT STDMETHODCALLTYPE QueryDirection( - /* [out] */ PIN_DIRECTION *pPinDir) = 0; - - virtual HRESULT STDMETHODCALLTYPE QueryId( - /* [out] */ LPWSTR *Id) = 0; - - virtual HRESULT STDMETHODCALLTYPE QueryAccept( - /* [in] */ const AM_MEDIA_TYPE *pmt) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnumMediaTypes( - /* [out] */ IEnumMediaTypes **ppEnum) = 0; - - virtual HRESULT STDMETHODCALLTYPE QueryInternalConnections( - /* [out] */ IPin **apPin, - /* [out][in] */ ULONG *nPin) = 0; - - virtual HRESULT STDMETHODCALLTYPE EndOfStream( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE BeginFlush( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE EndFlush( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE NewSegment( - /* [in] */ REFERENCE_TIME tStart, - /* [in] */ REFERENCE_TIME tStop, - /* [in] */ double dRate) = 0; - - }; - -#else /* C style interface */ - - typedef struct IPinVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IPin * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IPin * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IPin * This); - - HRESULT ( STDMETHODCALLTYPE *Connect )( - IPin * This, - /* [in] */ IPin *pReceivePin, - /* [in] */ const AM_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *ReceiveConnection )( - IPin * This, - /* [in] */ IPin *pConnector, - /* [in] */ const AM_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *Disconnect )( - IPin * This); - - HRESULT ( STDMETHODCALLTYPE *ConnectedTo )( - IPin * This, - /* [out] */ IPin **pPin); - - HRESULT ( STDMETHODCALLTYPE *ConnectionMediaType )( - IPin * This, - /* [out] */ AM_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *QueryPinInfo )( - IPin * This, - /* [out] */ PIN_INFO *pInfo); - - HRESULT ( STDMETHODCALLTYPE *QueryDirection )( - IPin * This, - /* [out] */ PIN_DIRECTION *pPinDir); - - HRESULT ( STDMETHODCALLTYPE *QueryId )( - IPin * This, - /* [out] */ LPWSTR *Id); - - HRESULT ( STDMETHODCALLTYPE *QueryAccept )( - IPin * This, - /* [in] */ const AM_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *EnumMediaTypes )( - IPin * This, - /* [out] */ IEnumMediaTypes **ppEnum); - - HRESULT ( STDMETHODCALLTYPE *QueryInternalConnections )( - IPin * This, - /* [out] */ IPin **apPin, - /* [out][in] */ ULONG *nPin); - - HRESULT ( STDMETHODCALLTYPE *EndOfStream )( - IPin * This); - - HRESULT ( STDMETHODCALLTYPE *BeginFlush )( - IPin * This); - - HRESULT ( STDMETHODCALLTYPE *EndFlush )( - IPin * This); - - HRESULT ( STDMETHODCALLTYPE *NewSegment )( - IPin * This, - /* [in] */ REFERENCE_TIME tStart, - /* [in] */ REFERENCE_TIME tStop, - /* [in] */ double dRate); - - END_INTERFACE - } IPinVtbl; - - interface IPin - { - CONST_VTBL struct IPinVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IPin_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IPin_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IPin_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IPin_Connect(This,pReceivePin,pmt) \ - (This)->lpVtbl -> Connect(This,pReceivePin,pmt) - -#define IPin_ReceiveConnection(This,pConnector,pmt) \ - (This)->lpVtbl -> ReceiveConnection(This,pConnector,pmt) - -#define IPin_Disconnect(This) \ - (This)->lpVtbl -> Disconnect(This) - -#define IPin_ConnectedTo(This,pPin) \ - (This)->lpVtbl -> ConnectedTo(This,pPin) - -#define IPin_ConnectionMediaType(This,pmt) \ - (This)->lpVtbl -> ConnectionMediaType(This,pmt) - -#define IPin_QueryPinInfo(This,pInfo) \ - (This)->lpVtbl -> QueryPinInfo(This,pInfo) - -#define IPin_QueryDirection(This,pPinDir) \ - (This)->lpVtbl -> QueryDirection(This,pPinDir) - -#define IPin_QueryId(This,Id) \ - (This)->lpVtbl -> QueryId(This,Id) - -#define IPin_QueryAccept(This,pmt) \ - (This)->lpVtbl -> QueryAccept(This,pmt) - -#define IPin_EnumMediaTypes(This,ppEnum) \ - (This)->lpVtbl -> EnumMediaTypes(This,ppEnum) - -#define IPin_QueryInternalConnections(This,apPin,nPin) \ - (This)->lpVtbl -> QueryInternalConnections(This,apPin,nPin) - -#define IPin_EndOfStream(This) \ - (This)->lpVtbl -> EndOfStream(This) - -#define IPin_BeginFlush(This) \ - (This)->lpVtbl -> BeginFlush(This) - -#define IPin_EndFlush(This) \ - (This)->lpVtbl -> EndFlush(This) - -#define IPin_NewSegment(This,tStart,tStop,dRate) \ - (This)->lpVtbl -> NewSegment(This,tStart,tStop,dRate) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IPin_Connect_Proxy( - IPin * This, - /* [in] */ IPin *pReceivePin, - /* [in] */ const AM_MEDIA_TYPE *pmt); - - -void __RPC_STUB IPin_Connect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPin_ReceiveConnection_Proxy( - IPin * This, - /* [in] */ IPin *pConnector, - /* [in] */ const AM_MEDIA_TYPE *pmt); - - -void __RPC_STUB IPin_ReceiveConnection_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPin_Disconnect_Proxy( - IPin * This); - - -void __RPC_STUB IPin_Disconnect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPin_ConnectedTo_Proxy( - IPin * This, - /* [out] */ IPin **pPin); - - -void __RPC_STUB IPin_ConnectedTo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPin_ConnectionMediaType_Proxy( - IPin * This, - /* [out] */ AM_MEDIA_TYPE *pmt); - - -void __RPC_STUB IPin_ConnectionMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPin_QueryPinInfo_Proxy( - IPin * This, - /* [out] */ PIN_INFO *pInfo); - - -void __RPC_STUB IPin_QueryPinInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPin_QueryDirection_Proxy( - IPin * This, - /* [out] */ PIN_DIRECTION *pPinDir); - - -void __RPC_STUB IPin_QueryDirection_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPin_QueryId_Proxy( - IPin * This, - /* [out] */ LPWSTR *Id); - - -void __RPC_STUB IPin_QueryId_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPin_QueryAccept_Proxy( - IPin * This, - /* [in] */ const AM_MEDIA_TYPE *pmt); - - -void __RPC_STUB IPin_QueryAccept_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPin_EnumMediaTypes_Proxy( - IPin * This, - /* [out] */ IEnumMediaTypes **ppEnum); - - -void __RPC_STUB IPin_EnumMediaTypes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPin_QueryInternalConnections_Proxy( - IPin * This, - /* [out] */ IPin **apPin, - /* [out][in] */ ULONG *nPin); - - -void __RPC_STUB IPin_QueryInternalConnections_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPin_EndOfStream_Proxy( - IPin * This); - - -void __RPC_STUB IPin_EndOfStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPin_BeginFlush_Proxy( - IPin * This); - - -void __RPC_STUB IPin_BeginFlush_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPin_EndFlush_Proxy( - IPin * This); - - -void __RPC_STUB IPin_EndFlush_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPin_NewSegment_Proxy( - IPin * This, - /* [in] */ REFERENCE_TIME tStart, - /* [in] */ REFERENCE_TIME tStop, - /* [in] */ double dRate); - - -void __RPC_STUB IPin_NewSegment_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IPin_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0113 */ -/* [local] */ - -typedef IPin *PPIN; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0113_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0113_v0_0_s_ifspec; - -#ifndef __IEnumPins_INTERFACE_DEFINED__ -#define __IEnumPins_INTERFACE_DEFINED__ - -/* interface IEnumPins */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IEnumPins; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a86892-0ad4-11ce-b03a-0020af0ba770") - IEnumPins : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Next( - /* [in] */ ULONG cPins, - /* [size_is][out] */ IPin **ppPins, - /* [out] */ ULONG *pcFetched) = 0; - - virtual HRESULT STDMETHODCALLTYPE Skip( - /* [in] */ ULONG cPins) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - /* [out] */ IEnumPins **ppEnum) = 0; - - }; - -#else /* C style interface */ - - typedef struct IEnumPinsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IEnumPins * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IEnumPins * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IEnumPins * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - IEnumPins * This, - /* [in] */ ULONG cPins, - /* [size_is][out] */ IPin **ppPins, - /* [out] */ ULONG *pcFetched); - - HRESULT ( STDMETHODCALLTYPE *Skip )( - IEnumPins * This, - /* [in] */ ULONG cPins); - - HRESULT ( STDMETHODCALLTYPE *Reset )( - IEnumPins * This); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IEnumPins * This, - /* [out] */ IEnumPins **ppEnum); - - END_INTERFACE - } IEnumPinsVtbl; - - interface IEnumPins - { - CONST_VTBL struct IEnumPinsVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IEnumPins_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IEnumPins_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IEnumPins_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IEnumPins_Next(This,cPins,ppPins,pcFetched) \ - (This)->lpVtbl -> Next(This,cPins,ppPins,pcFetched) - -#define IEnumPins_Skip(This,cPins) \ - (This)->lpVtbl -> Skip(This,cPins) - -#define IEnumPins_Reset(This) \ - (This)->lpVtbl -> Reset(This) - -#define IEnumPins_Clone(This,ppEnum) \ - (This)->lpVtbl -> Clone(This,ppEnum) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IEnumPins_Next_Proxy( - IEnumPins * This, - /* [in] */ ULONG cPins, - /* [size_is][out] */ IPin **ppPins, - /* [out] */ ULONG *pcFetched); - - -void __RPC_STUB IEnumPins_Next_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumPins_Skip_Proxy( - IEnumPins * This, - /* [in] */ ULONG cPins); - - -void __RPC_STUB IEnumPins_Skip_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumPins_Reset_Proxy( - IEnumPins * This); - - -void __RPC_STUB IEnumPins_Reset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumPins_Clone_Proxy( - IEnumPins * This, - /* [out] */ IEnumPins **ppEnum); - - -void __RPC_STUB IEnumPins_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IEnumPins_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0114 */ -/* [local] */ - -typedef IEnumPins *PENUMPINS; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0114_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0114_v0_0_s_ifspec; - -#ifndef __IEnumMediaTypes_INTERFACE_DEFINED__ -#define __IEnumMediaTypes_INTERFACE_DEFINED__ - -/* interface IEnumMediaTypes */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IEnumMediaTypes; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("89c31040-846b-11ce-97d3-00aa0055595a") - IEnumMediaTypes : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Next( - /* [in] */ ULONG cMediaTypes, - /* [size_is][out] */ AM_MEDIA_TYPE **ppMediaTypes, - /* [out] */ ULONG *pcFetched) = 0; - - virtual HRESULT STDMETHODCALLTYPE Skip( - /* [in] */ ULONG cMediaTypes) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - /* [out] */ IEnumMediaTypes **ppEnum) = 0; - - }; - -#else /* C style interface */ - - typedef struct IEnumMediaTypesVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IEnumMediaTypes * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IEnumMediaTypes * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IEnumMediaTypes * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - IEnumMediaTypes * This, - /* [in] */ ULONG cMediaTypes, - /* [size_is][out] */ AM_MEDIA_TYPE **ppMediaTypes, - /* [out] */ ULONG *pcFetched); - - HRESULT ( STDMETHODCALLTYPE *Skip )( - IEnumMediaTypes * This, - /* [in] */ ULONG cMediaTypes); - - HRESULT ( STDMETHODCALLTYPE *Reset )( - IEnumMediaTypes * This); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IEnumMediaTypes * This, - /* [out] */ IEnumMediaTypes **ppEnum); - - END_INTERFACE - } IEnumMediaTypesVtbl; - - interface IEnumMediaTypes - { - CONST_VTBL struct IEnumMediaTypesVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IEnumMediaTypes_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IEnumMediaTypes_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IEnumMediaTypes_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IEnumMediaTypes_Next(This,cMediaTypes,ppMediaTypes,pcFetched) \ - (This)->lpVtbl -> Next(This,cMediaTypes,ppMediaTypes,pcFetched) - -#define IEnumMediaTypes_Skip(This,cMediaTypes) \ - (This)->lpVtbl -> Skip(This,cMediaTypes) - -#define IEnumMediaTypes_Reset(This) \ - (This)->lpVtbl -> Reset(This) - -#define IEnumMediaTypes_Clone(This,ppEnum) \ - (This)->lpVtbl -> Clone(This,ppEnum) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IEnumMediaTypes_Next_Proxy( - IEnumMediaTypes * This, - /* [in] */ ULONG cMediaTypes, - /* [size_is][out] */ AM_MEDIA_TYPE **ppMediaTypes, - /* [out] */ ULONG *pcFetched); - - -void __RPC_STUB IEnumMediaTypes_Next_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumMediaTypes_Skip_Proxy( - IEnumMediaTypes * This, - /* [in] */ ULONG cMediaTypes); - - -void __RPC_STUB IEnumMediaTypes_Skip_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumMediaTypes_Reset_Proxy( - IEnumMediaTypes * This); - - -void __RPC_STUB IEnumMediaTypes_Reset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumMediaTypes_Clone_Proxy( - IEnumMediaTypes * This, - /* [out] */ IEnumMediaTypes **ppEnum); - - -void __RPC_STUB IEnumMediaTypes_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IEnumMediaTypes_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0115 */ -/* [local] */ - -typedef IEnumMediaTypes *PENUMMEDIATYPES; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0115_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0115_v0_0_s_ifspec; - -#ifndef __IFilterGraph_INTERFACE_DEFINED__ -#define __IFilterGraph_INTERFACE_DEFINED__ - -/* interface IFilterGraph */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IFilterGraph; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a8689f-0ad4-11ce-b03a-0020af0ba770") - IFilterGraph : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE AddFilter( - /* [in] */ IBaseFilter *pFilter, - /* [string][in] */ LPCWSTR pName) = 0; - - virtual HRESULT STDMETHODCALLTYPE RemoveFilter( - /* [in] */ IBaseFilter *pFilter) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnumFilters( - /* [out] */ IEnumFilters **ppEnum) = 0; - - virtual HRESULT STDMETHODCALLTYPE FindFilterByName( - /* [string][in] */ LPCWSTR pName, - /* [out] */ IBaseFilter **ppFilter) = 0; - - virtual HRESULT STDMETHODCALLTYPE ConnectDirect( - /* [in] */ IPin *ppinOut, - /* [in] */ IPin *ppinIn, - /* [unique][in] */ const AM_MEDIA_TYPE *pmt) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reconnect( - /* [in] */ IPin *ppin) = 0; - - virtual HRESULT STDMETHODCALLTYPE Disconnect( - /* [in] */ IPin *ppin) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDefaultSyncSource( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IFilterGraphVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IFilterGraph * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IFilterGraph * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IFilterGraph * This); - - HRESULT ( STDMETHODCALLTYPE *AddFilter )( - IFilterGraph * This, - /* [in] */ IBaseFilter *pFilter, - /* [string][in] */ LPCWSTR pName); - - HRESULT ( STDMETHODCALLTYPE *RemoveFilter )( - IFilterGraph * This, - /* [in] */ IBaseFilter *pFilter); - - HRESULT ( STDMETHODCALLTYPE *EnumFilters )( - IFilterGraph * This, - /* [out] */ IEnumFilters **ppEnum); - - HRESULT ( STDMETHODCALLTYPE *FindFilterByName )( - IFilterGraph * This, - /* [string][in] */ LPCWSTR pName, - /* [out] */ IBaseFilter **ppFilter); - - HRESULT ( STDMETHODCALLTYPE *ConnectDirect )( - IFilterGraph * This, - /* [in] */ IPin *ppinOut, - /* [in] */ IPin *ppinIn, - /* [unique][in] */ const AM_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *Reconnect )( - IFilterGraph * This, - /* [in] */ IPin *ppin); - - HRESULT ( STDMETHODCALLTYPE *Disconnect )( - IFilterGraph * This, - /* [in] */ IPin *ppin); - - HRESULT ( STDMETHODCALLTYPE *SetDefaultSyncSource )( - IFilterGraph * This); - - END_INTERFACE - } IFilterGraphVtbl; - - interface IFilterGraph - { - CONST_VTBL struct IFilterGraphVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IFilterGraph_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IFilterGraph_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IFilterGraph_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IFilterGraph_AddFilter(This,pFilter,pName) \ - (This)->lpVtbl -> AddFilter(This,pFilter,pName) - -#define IFilterGraph_RemoveFilter(This,pFilter) \ - (This)->lpVtbl -> RemoveFilter(This,pFilter) - -#define IFilterGraph_EnumFilters(This,ppEnum) \ - (This)->lpVtbl -> EnumFilters(This,ppEnum) - -#define IFilterGraph_FindFilterByName(This,pName,ppFilter) \ - (This)->lpVtbl -> FindFilterByName(This,pName,ppFilter) - -#define IFilterGraph_ConnectDirect(This,ppinOut,ppinIn,pmt) \ - (This)->lpVtbl -> ConnectDirect(This,ppinOut,ppinIn,pmt) - -#define IFilterGraph_Reconnect(This,ppin) \ - (This)->lpVtbl -> Reconnect(This,ppin) - -#define IFilterGraph_Disconnect(This,ppin) \ - (This)->lpVtbl -> Disconnect(This,ppin) - -#define IFilterGraph_SetDefaultSyncSource(This) \ - (This)->lpVtbl -> SetDefaultSyncSource(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IFilterGraph_AddFilter_Proxy( - IFilterGraph * This, - /* [in] */ IBaseFilter *pFilter, - /* [string][in] */ LPCWSTR pName); - - -void __RPC_STUB IFilterGraph_AddFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterGraph_RemoveFilter_Proxy( - IFilterGraph * This, - /* [in] */ IBaseFilter *pFilter); - - -void __RPC_STUB IFilterGraph_RemoveFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterGraph_EnumFilters_Proxy( - IFilterGraph * This, - /* [out] */ IEnumFilters **ppEnum); - - -void __RPC_STUB IFilterGraph_EnumFilters_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterGraph_FindFilterByName_Proxy( - IFilterGraph * This, - /* [string][in] */ LPCWSTR pName, - /* [out] */ IBaseFilter **ppFilter); - - -void __RPC_STUB IFilterGraph_FindFilterByName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterGraph_ConnectDirect_Proxy( - IFilterGraph * This, - /* [in] */ IPin *ppinOut, - /* [in] */ IPin *ppinIn, - /* [unique][in] */ const AM_MEDIA_TYPE *pmt); - - -void __RPC_STUB IFilterGraph_ConnectDirect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterGraph_Reconnect_Proxy( - IFilterGraph * This, - /* [in] */ IPin *ppin); - - -void __RPC_STUB IFilterGraph_Reconnect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterGraph_Disconnect_Proxy( - IFilterGraph * This, - /* [in] */ IPin *ppin); - - -void __RPC_STUB IFilterGraph_Disconnect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterGraph_SetDefaultSyncSource_Proxy( - IFilterGraph * This); - - -void __RPC_STUB IFilterGraph_SetDefaultSyncSource_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IFilterGraph_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0116 */ -/* [local] */ - -typedef IFilterGraph *PFILTERGRAPH; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0116_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0116_v0_0_s_ifspec; - -#ifndef __IEnumFilters_INTERFACE_DEFINED__ -#define __IEnumFilters_INTERFACE_DEFINED__ - -/* interface IEnumFilters */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IEnumFilters; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a86893-0ad4-11ce-b03a-0020af0ba770") - IEnumFilters : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Next( - /* [in] */ ULONG cFilters, - /* [out] */ IBaseFilter **ppFilter, - /* [out] */ ULONG *pcFetched) = 0; - - virtual HRESULT STDMETHODCALLTYPE Skip( - /* [in] */ ULONG cFilters) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - /* [out] */ IEnumFilters **ppEnum) = 0; - - }; - -#else /* C style interface */ - - typedef struct IEnumFiltersVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IEnumFilters * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IEnumFilters * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IEnumFilters * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - IEnumFilters * This, - /* [in] */ ULONG cFilters, - /* [out] */ IBaseFilter **ppFilter, - /* [out] */ ULONG *pcFetched); - - HRESULT ( STDMETHODCALLTYPE *Skip )( - IEnumFilters * This, - /* [in] */ ULONG cFilters); - - HRESULT ( STDMETHODCALLTYPE *Reset )( - IEnumFilters * This); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IEnumFilters * This, - /* [out] */ IEnumFilters **ppEnum); - - END_INTERFACE - } IEnumFiltersVtbl; - - interface IEnumFilters - { - CONST_VTBL struct IEnumFiltersVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IEnumFilters_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IEnumFilters_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IEnumFilters_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IEnumFilters_Next(This,cFilters,ppFilter,pcFetched) \ - (This)->lpVtbl -> Next(This,cFilters,ppFilter,pcFetched) - -#define IEnumFilters_Skip(This,cFilters) \ - (This)->lpVtbl -> Skip(This,cFilters) - -#define IEnumFilters_Reset(This) \ - (This)->lpVtbl -> Reset(This) - -#define IEnumFilters_Clone(This,ppEnum) \ - (This)->lpVtbl -> Clone(This,ppEnum) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IEnumFilters_Next_Proxy( - IEnumFilters * This, - /* [in] */ ULONG cFilters, - /* [out] */ IBaseFilter **ppFilter, - /* [out] */ ULONG *pcFetched); - - -void __RPC_STUB IEnumFilters_Next_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumFilters_Skip_Proxy( - IEnumFilters * This, - /* [in] */ ULONG cFilters); - - -void __RPC_STUB IEnumFilters_Skip_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumFilters_Reset_Proxy( - IEnumFilters * This); - - -void __RPC_STUB IEnumFilters_Reset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumFilters_Clone_Proxy( - IEnumFilters * This, - /* [out] */ IEnumFilters **ppEnum); - - -void __RPC_STUB IEnumFilters_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IEnumFilters_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0117 */ -/* [local] */ - -typedef IEnumFilters *PENUMFILTERS; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0117_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0117_v0_0_s_ifspec; - -#ifndef __IMediaFilter_INTERFACE_DEFINED__ -#define __IMediaFilter_INTERFACE_DEFINED__ - -/* interface IMediaFilter */ -/* [unique][uuid][object] */ - -typedef -enum _FilterState - { State_Stopped = 0, - State_Paused = State_Stopped + 1, - State_Running = State_Paused + 1 - } FILTER_STATE; - - -EXTERN_C const IID IID_IMediaFilter; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a86899-0ad4-11ce-b03a-0020af0ba770") - IMediaFilter : public IPersist - { - public: - virtual HRESULT STDMETHODCALLTYPE Stop( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Pause( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Run( - REFERENCE_TIME tStart) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetState( - /* [in] */ DWORD dwMilliSecsTimeout, - /* [out] */ FILTER_STATE *State) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetSyncSource( - /* [in] */ IReferenceClock *pClock) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSyncSource( - /* [out] */ IReferenceClock **pClock) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaFilterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaFilter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaFilter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaFilter * This); - - HRESULT ( STDMETHODCALLTYPE *GetClassID )( - IMediaFilter * This, - /* [out] */ CLSID *pClassID); - - HRESULT ( STDMETHODCALLTYPE *Stop )( - IMediaFilter * This); - - HRESULT ( STDMETHODCALLTYPE *Pause )( - IMediaFilter * This); - - HRESULT ( STDMETHODCALLTYPE *Run )( - IMediaFilter * This, - REFERENCE_TIME tStart); - - HRESULT ( STDMETHODCALLTYPE *GetState )( - IMediaFilter * This, - /* [in] */ DWORD dwMilliSecsTimeout, - /* [out] */ FILTER_STATE *State); - - HRESULT ( STDMETHODCALLTYPE *SetSyncSource )( - IMediaFilter * This, - /* [in] */ IReferenceClock *pClock); - - HRESULT ( STDMETHODCALLTYPE *GetSyncSource )( - IMediaFilter * This, - /* [out] */ IReferenceClock **pClock); - - END_INTERFACE - } IMediaFilterVtbl; - - interface IMediaFilter - { - CONST_VTBL struct IMediaFilterVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaFilter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaFilter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaFilter_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaFilter_GetClassID(This,pClassID) \ - (This)->lpVtbl -> GetClassID(This,pClassID) - - -#define IMediaFilter_Stop(This) \ - (This)->lpVtbl -> Stop(This) - -#define IMediaFilter_Pause(This) \ - (This)->lpVtbl -> Pause(This) - -#define IMediaFilter_Run(This,tStart) \ - (This)->lpVtbl -> Run(This,tStart) - -#define IMediaFilter_GetState(This,dwMilliSecsTimeout,State) \ - (This)->lpVtbl -> GetState(This,dwMilliSecsTimeout,State) - -#define IMediaFilter_SetSyncSource(This,pClock) \ - (This)->lpVtbl -> SetSyncSource(This,pClock) - -#define IMediaFilter_GetSyncSource(This,pClock) \ - (This)->lpVtbl -> GetSyncSource(This,pClock) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaFilter_Stop_Proxy( - IMediaFilter * This); - - -void __RPC_STUB IMediaFilter_Stop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaFilter_Pause_Proxy( - IMediaFilter * This); - - -void __RPC_STUB IMediaFilter_Pause_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaFilter_Run_Proxy( - IMediaFilter * This, - REFERENCE_TIME tStart); - - -void __RPC_STUB IMediaFilter_Run_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaFilter_GetState_Proxy( - IMediaFilter * This, - /* [in] */ DWORD dwMilliSecsTimeout, - /* [out] */ FILTER_STATE *State); - - -void __RPC_STUB IMediaFilter_GetState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaFilter_SetSyncSource_Proxy( - IMediaFilter * This, - /* [in] */ IReferenceClock *pClock); - - -void __RPC_STUB IMediaFilter_SetSyncSource_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaFilter_GetSyncSource_Proxy( - IMediaFilter * This, - /* [out] */ IReferenceClock **pClock); - - -void __RPC_STUB IMediaFilter_GetSyncSource_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaFilter_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0118 */ -/* [local] */ - -typedef IMediaFilter *PMEDIAFILTER; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0118_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0118_v0_0_s_ifspec; - -#ifndef __IBaseFilter_INTERFACE_DEFINED__ -#define __IBaseFilter_INTERFACE_DEFINED__ - -/* interface IBaseFilter */ -/* [unique][uuid][object] */ - -typedef struct _FilterInfo - { - WCHAR achName[ 128 ]; - IFilterGraph *pGraph; - } FILTER_INFO; - - -EXTERN_C const IID IID_IBaseFilter; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a86895-0ad4-11ce-b03a-0020af0ba770") - IBaseFilter : public IMediaFilter - { - public: - virtual HRESULT STDMETHODCALLTYPE EnumPins( - /* [out] */ IEnumPins **ppEnum) = 0; - - virtual HRESULT STDMETHODCALLTYPE FindPin( - /* [string][in] */ LPCWSTR Id, - /* [out] */ IPin **ppPin) = 0; - - virtual HRESULT STDMETHODCALLTYPE QueryFilterInfo( - /* [out] */ FILTER_INFO *pInfo) = 0; - - virtual HRESULT STDMETHODCALLTYPE JoinFilterGraph( - /* [in] */ IFilterGraph *pGraph, - /* [string][in] */ LPCWSTR pName) = 0; - - virtual HRESULT STDMETHODCALLTYPE QueryVendorInfo( - /* [string][out] */ LPWSTR *pVendorInfo) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBaseFilterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBaseFilter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBaseFilter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBaseFilter * This); - - HRESULT ( STDMETHODCALLTYPE *GetClassID )( - IBaseFilter * This, - /* [out] */ CLSID *pClassID); - - HRESULT ( STDMETHODCALLTYPE *Stop )( - IBaseFilter * This); - - HRESULT ( STDMETHODCALLTYPE *Pause )( - IBaseFilter * This); - - HRESULT ( STDMETHODCALLTYPE *Run )( - IBaseFilter * This, - REFERENCE_TIME tStart); - - HRESULT ( STDMETHODCALLTYPE *GetState )( - IBaseFilter * This, - /* [in] */ DWORD dwMilliSecsTimeout, - /* [out] */ FILTER_STATE *State); - - HRESULT ( STDMETHODCALLTYPE *SetSyncSource )( - IBaseFilter * This, - /* [in] */ IReferenceClock *pClock); - - HRESULT ( STDMETHODCALLTYPE *GetSyncSource )( - IBaseFilter * This, - /* [out] */ IReferenceClock **pClock); - - HRESULT ( STDMETHODCALLTYPE *EnumPins )( - IBaseFilter * This, - /* [out] */ IEnumPins **ppEnum); - - HRESULT ( STDMETHODCALLTYPE *FindPin )( - IBaseFilter * This, - /* [string][in] */ LPCWSTR Id, - /* [out] */ IPin **ppPin); - - HRESULT ( STDMETHODCALLTYPE *QueryFilterInfo )( - IBaseFilter * This, - /* [out] */ FILTER_INFO *pInfo); - - HRESULT ( STDMETHODCALLTYPE *JoinFilterGraph )( - IBaseFilter * This, - /* [in] */ IFilterGraph *pGraph, - /* [string][in] */ LPCWSTR pName); - - HRESULT ( STDMETHODCALLTYPE *QueryVendorInfo )( - IBaseFilter * This, - /* [string][out] */ LPWSTR *pVendorInfo); - - END_INTERFACE - } IBaseFilterVtbl; - - interface IBaseFilter - { - CONST_VTBL struct IBaseFilterVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBaseFilter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBaseFilter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBaseFilter_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBaseFilter_GetClassID(This,pClassID) \ - (This)->lpVtbl -> GetClassID(This,pClassID) - - -#define IBaseFilter_Stop(This) \ - (This)->lpVtbl -> Stop(This) - -#define IBaseFilter_Pause(This) \ - (This)->lpVtbl -> Pause(This) - -#define IBaseFilter_Run(This,tStart) \ - (This)->lpVtbl -> Run(This,tStart) - -#define IBaseFilter_GetState(This,dwMilliSecsTimeout,State) \ - (This)->lpVtbl -> GetState(This,dwMilliSecsTimeout,State) - -#define IBaseFilter_SetSyncSource(This,pClock) \ - (This)->lpVtbl -> SetSyncSource(This,pClock) - -#define IBaseFilter_GetSyncSource(This,pClock) \ - (This)->lpVtbl -> GetSyncSource(This,pClock) - - -#define IBaseFilter_EnumPins(This,ppEnum) \ - (This)->lpVtbl -> EnumPins(This,ppEnum) - -#define IBaseFilter_FindPin(This,Id,ppPin) \ - (This)->lpVtbl -> FindPin(This,Id,ppPin) - -#define IBaseFilter_QueryFilterInfo(This,pInfo) \ - (This)->lpVtbl -> QueryFilterInfo(This,pInfo) - -#define IBaseFilter_JoinFilterGraph(This,pGraph,pName) \ - (This)->lpVtbl -> JoinFilterGraph(This,pGraph,pName) - -#define IBaseFilter_QueryVendorInfo(This,pVendorInfo) \ - (This)->lpVtbl -> QueryVendorInfo(This,pVendorInfo) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBaseFilter_EnumPins_Proxy( - IBaseFilter * This, - /* [out] */ IEnumPins **ppEnum); - - -void __RPC_STUB IBaseFilter_EnumPins_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBaseFilter_FindPin_Proxy( - IBaseFilter * This, - /* [string][in] */ LPCWSTR Id, - /* [out] */ IPin **ppPin); - - -void __RPC_STUB IBaseFilter_FindPin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBaseFilter_QueryFilterInfo_Proxy( - IBaseFilter * This, - /* [out] */ FILTER_INFO *pInfo); - - -void __RPC_STUB IBaseFilter_QueryFilterInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBaseFilter_JoinFilterGraph_Proxy( - IBaseFilter * This, - /* [in] */ IFilterGraph *pGraph, - /* [string][in] */ LPCWSTR pName); - - -void __RPC_STUB IBaseFilter_JoinFilterGraph_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBaseFilter_QueryVendorInfo_Proxy( - IBaseFilter * This, - /* [string][out] */ LPWSTR *pVendorInfo); - - -void __RPC_STUB IBaseFilter_QueryVendorInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBaseFilter_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0119 */ -/* [local] */ - -typedef IBaseFilter *PFILTER; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0119_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0119_v0_0_s_ifspec; - -#ifndef __IReferenceClock_INTERFACE_DEFINED__ -#define __IReferenceClock_INTERFACE_DEFINED__ - -/* interface IReferenceClock */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IReferenceClock; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a86897-0ad4-11ce-b03a-0020af0ba770") - IReferenceClock : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetTime( - /* [out] */ REFERENCE_TIME *pTime) = 0; - - virtual HRESULT STDMETHODCALLTYPE AdviseTime( - /* [in] */ REFERENCE_TIME baseTime, - /* [in] */ REFERENCE_TIME streamTime, - /* [in] */ HEVENT hEvent, - /* [out] */ DWORD_PTR *pdwAdviseCookie) = 0; - - virtual HRESULT STDMETHODCALLTYPE AdvisePeriodic( - /* [in] */ REFERENCE_TIME startTime, - /* [in] */ REFERENCE_TIME periodTime, - /* [in] */ HSEMAPHORE hSemaphore, - /* [out] */ DWORD_PTR *pdwAdviseCookie) = 0; - - virtual HRESULT STDMETHODCALLTYPE Unadvise( - /* [in] */ DWORD_PTR dwAdviseCookie) = 0; - - }; - -#else /* C style interface */ - - typedef struct IReferenceClockVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IReferenceClock * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IReferenceClock * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IReferenceClock * This); - - HRESULT ( STDMETHODCALLTYPE *GetTime )( - IReferenceClock * This, - /* [out] */ REFERENCE_TIME *pTime); - - HRESULT ( STDMETHODCALLTYPE *AdviseTime )( - IReferenceClock * This, - /* [in] */ REFERENCE_TIME baseTime, - /* [in] */ REFERENCE_TIME streamTime, - /* [in] */ HEVENT hEvent, - /* [out] */ DWORD_PTR *pdwAdviseCookie); - - HRESULT ( STDMETHODCALLTYPE *AdvisePeriodic )( - IReferenceClock * This, - /* [in] */ REFERENCE_TIME startTime, - /* [in] */ REFERENCE_TIME periodTime, - /* [in] */ HSEMAPHORE hSemaphore, - /* [out] */ DWORD_PTR *pdwAdviseCookie); - - HRESULT ( STDMETHODCALLTYPE *Unadvise )( - IReferenceClock * This, - /* [in] */ DWORD_PTR dwAdviseCookie); - - END_INTERFACE - } IReferenceClockVtbl; - - interface IReferenceClock - { - CONST_VTBL struct IReferenceClockVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IReferenceClock_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IReferenceClock_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IReferenceClock_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IReferenceClock_GetTime(This,pTime) \ - (This)->lpVtbl -> GetTime(This,pTime) - -#define IReferenceClock_AdviseTime(This,baseTime,streamTime,hEvent,pdwAdviseCookie) \ - (This)->lpVtbl -> AdviseTime(This,baseTime,streamTime,hEvent,pdwAdviseCookie) - -#define IReferenceClock_AdvisePeriodic(This,startTime,periodTime,hSemaphore,pdwAdviseCookie) \ - (This)->lpVtbl -> AdvisePeriodic(This,startTime,periodTime,hSemaphore,pdwAdviseCookie) - -#define IReferenceClock_Unadvise(This,dwAdviseCookie) \ - (This)->lpVtbl -> Unadvise(This,dwAdviseCookie) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IReferenceClock_GetTime_Proxy( - IReferenceClock * This, - /* [out] */ REFERENCE_TIME *pTime); - - -void __RPC_STUB IReferenceClock_GetTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IReferenceClock_AdviseTime_Proxy( - IReferenceClock * This, - /* [in] */ REFERENCE_TIME baseTime, - /* [in] */ REFERENCE_TIME streamTime, - /* [in] */ HEVENT hEvent, - /* [out] */ DWORD_PTR *pdwAdviseCookie); - - -void __RPC_STUB IReferenceClock_AdviseTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IReferenceClock_AdvisePeriodic_Proxy( - IReferenceClock * This, - /* [in] */ REFERENCE_TIME startTime, - /* [in] */ REFERENCE_TIME periodTime, - /* [in] */ HSEMAPHORE hSemaphore, - /* [out] */ DWORD_PTR *pdwAdviseCookie); - - -void __RPC_STUB IReferenceClock_AdvisePeriodic_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IReferenceClock_Unadvise_Proxy( - IReferenceClock * This, - /* [in] */ DWORD_PTR dwAdviseCookie); - - -void __RPC_STUB IReferenceClock_Unadvise_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IReferenceClock_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0120 */ -/* [local] */ - -typedef IReferenceClock *PREFERENCECLOCK; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0120_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0120_v0_0_s_ifspec; - -#ifndef __IReferenceClock2_INTERFACE_DEFINED__ -#define __IReferenceClock2_INTERFACE_DEFINED__ - -/* interface IReferenceClock2 */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IReferenceClock2; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("36b73885-c2c8-11cf-8b46-00805f6cef60") - IReferenceClock2 : public IReferenceClock - { - public: - }; - -#else /* C style interface */ - - typedef struct IReferenceClock2Vtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IReferenceClock2 * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IReferenceClock2 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IReferenceClock2 * This); - - HRESULT ( STDMETHODCALLTYPE *GetTime )( - IReferenceClock2 * This, - /* [out] */ REFERENCE_TIME *pTime); - - HRESULT ( STDMETHODCALLTYPE *AdviseTime )( - IReferenceClock2 * This, - /* [in] */ REFERENCE_TIME baseTime, - /* [in] */ REFERENCE_TIME streamTime, - /* [in] */ HEVENT hEvent, - /* [out] */ DWORD_PTR *pdwAdviseCookie); - - HRESULT ( STDMETHODCALLTYPE *AdvisePeriodic )( - IReferenceClock2 * This, - /* [in] */ REFERENCE_TIME startTime, - /* [in] */ REFERENCE_TIME periodTime, - /* [in] */ HSEMAPHORE hSemaphore, - /* [out] */ DWORD_PTR *pdwAdviseCookie); - - HRESULT ( STDMETHODCALLTYPE *Unadvise )( - IReferenceClock2 * This, - /* [in] */ DWORD_PTR dwAdviseCookie); - - END_INTERFACE - } IReferenceClock2Vtbl; - - interface IReferenceClock2 - { - CONST_VTBL struct IReferenceClock2Vtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IReferenceClock2_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IReferenceClock2_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IReferenceClock2_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IReferenceClock2_GetTime(This,pTime) \ - (This)->lpVtbl -> GetTime(This,pTime) - -#define IReferenceClock2_AdviseTime(This,baseTime,streamTime,hEvent,pdwAdviseCookie) \ - (This)->lpVtbl -> AdviseTime(This,baseTime,streamTime,hEvent,pdwAdviseCookie) - -#define IReferenceClock2_AdvisePeriodic(This,startTime,periodTime,hSemaphore,pdwAdviseCookie) \ - (This)->lpVtbl -> AdvisePeriodic(This,startTime,periodTime,hSemaphore,pdwAdviseCookie) - -#define IReferenceClock2_Unadvise(This,dwAdviseCookie) \ - (This)->lpVtbl -> Unadvise(This,dwAdviseCookie) - - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __IReferenceClock2_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0121 */ -/* [local] */ - -typedef IReferenceClock2 *PREFERENCECLOCK2; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0121_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0121_v0_0_s_ifspec; - -#ifndef __IMediaSample_INTERFACE_DEFINED__ -#define __IMediaSample_INTERFACE_DEFINED__ - -/* interface IMediaSample */ -/* [unique][uuid][object][local] */ - - -EXTERN_C const IID IID_IMediaSample; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a8689a-0ad4-11ce-b03a-0020af0ba770") - IMediaSample : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetPointer( - /* [out] */ BYTE **ppBuffer) = 0; - - virtual long STDMETHODCALLTYPE GetSize( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTime( - /* [out] */ REFERENCE_TIME *pTimeStart, - /* [out] */ REFERENCE_TIME *pTimeEnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTime( - /* [in] */ REFERENCE_TIME *pTimeStart, - /* [in] */ REFERENCE_TIME *pTimeEnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsSyncPoint( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetSyncPoint( - BOOL bIsSyncPoint) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsPreroll( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetPreroll( - BOOL bIsPreroll) = 0; - - virtual long STDMETHODCALLTYPE GetActualDataLength( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetActualDataLength( - long __MIDL_0010) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMediaType( - AM_MEDIA_TYPE **ppMediaType) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMediaType( - AM_MEDIA_TYPE *pMediaType) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsDiscontinuity( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDiscontinuity( - BOOL bDiscontinuity) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMediaTime( - /* [out] */ LONGLONG *pTimeStart, - /* [out] */ LONGLONG *pTimeEnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMediaTime( - /* [in] */ LONGLONG *pTimeStart, - /* [in] */ LONGLONG *pTimeEnd) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaSampleVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaSample * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaSample * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaSample * This); - - HRESULT ( STDMETHODCALLTYPE *GetPointer )( - IMediaSample * This, - /* [out] */ BYTE **ppBuffer); - - long ( STDMETHODCALLTYPE *GetSize )( - IMediaSample * This); - - HRESULT ( STDMETHODCALLTYPE *GetTime )( - IMediaSample * This, - /* [out] */ REFERENCE_TIME *pTimeStart, - /* [out] */ REFERENCE_TIME *pTimeEnd); - - HRESULT ( STDMETHODCALLTYPE *SetTime )( - IMediaSample * This, - /* [in] */ REFERENCE_TIME *pTimeStart, - /* [in] */ REFERENCE_TIME *pTimeEnd); - - HRESULT ( STDMETHODCALLTYPE *IsSyncPoint )( - IMediaSample * This); - - HRESULT ( STDMETHODCALLTYPE *SetSyncPoint )( - IMediaSample * This, - BOOL bIsSyncPoint); - - HRESULT ( STDMETHODCALLTYPE *IsPreroll )( - IMediaSample * This); - - HRESULT ( STDMETHODCALLTYPE *SetPreroll )( - IMediaSample * This, - BOOL bIsPreroll); - - long ( STDMETHODCALLTYPE *GetActualDataLength )( - IMediaSample * This); - - HRESULT ( STDMETHODCALLTYPE *SetActualDataLength )( - IMediaSample * This, - long __MIDL_0010); - - HRESULT ( STDMETHODCALLTYPE *GetMediaType )( - IMediaSample * This, - AM_MEDIA_TYPE **ppMediaType); - - HRESULT ( STDMETHODCALLTYPE *SetMediaType )( - IMediaSample * This, - AM_MEDIA_TYPE *pMediaType); - - HRESULT ( STDMETHODCALLTYPE *IsDiscontinuity )( - IMediaSample * This); - - HRESULT ( STDMETHODCALLTYPE *SetDiscontinuity )( - IMediaSample * This, - BOOL bDiscontinuity); - - HRESULT ( STDMETHODCALLTYPE *GetMediaTime )( - IMediaSample * This, - /* [out] */ LONGLONG *pTimeStart, - /* [out] */ LONGLONG *pTimeEnd); - - HRESULT ( STDMETHODCALLTYPE *SetMediaTime )( - IMediaSample * This, - /* [in] */ LONGLONG *pTimeStart, - /* [in] */ LONGLONG *pTimeEnd); - - END_INTERFACE - } IMediaSampleVtbl; - - interface IMediaSample - { - CONST_VTBL struct IMediaSampleVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaSample_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaSample_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaSample_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaSample_GetPointer(This,ppBuffer) \ - (This)->lpVtbl -> GetPointer(This,ppBuffer) - -#define IMediaSample_GetSize(This) \ - (This)->lpVtbl -> GetSize(This) - -#define IMediaSample_GetTime(This,pTimeStart,pTimeEnd) \ - (This)->lpVtbl -> GetTime(This,pTimeStart,pTimeEnd) - -#define IMediaSample_SetTime(This,pTimeStart,pTimeEnd) \ - (This)->lpVtbl -> SetTime(This,pTimeStart,pTimeEnd) - -#define IMediaSample_IsSyncPoint(This) \ - (This)->lpVtbl -> IsSyncPoint(This) - -#define IMediaSample_SetSyncPoint(This,bIsSyncPoint) \ - (This)->lpVtbl -> SetSyncPoint(This,bIsSyncPoint) - -#define IMediaSample_IsPreroll(This) \ - (This)->lpVtbl -> IsPreroll(This) - -#define IMediaSample_SetPreroll(This,bIsPreroll) \ - (This)->lpVtbl -> SetPreroll(This,bIsPreroll) - -#define IMediaSample_GetActualDataLength(This) \ - (This)->lpVtbl -> GetActualDataLength(This) - -#define IMediaSample_SetActualDataLength(This,__MIDL_0010) \ - (This)->lpVtbl -> SetActualDataLength(This,__MIDL_0010) - -#define IMediaSample_GetMediaType(This,ppMediaType) \ - (This)->lpVtbl -> GetMediaType(This,ppMediaType) - -#define IMediaSample_SetMediaType(This,pMediaType) \ - (This)->lpVtbl -> SetMediaType(This,pMediaType) - -#define IMediaSample_IsDiscontinuity(This) \ - (This)->lpVtbl -> IsDiscontinuity(This) - -#define IMediaSample_SetDiscontinuity(This,bDiscontinuity) \ - (This)->lpVtbl -> SetDiscontinuity(This,bDiscontinuity) - -#define IMediaSample_GetMediaTime(This,pTimeStart,pTimeEnd) \ - (This)->lpVtbl -> GetMediaTime(This,pTimeStart,pTimeEnd) - -#define IMediaSample_SetMediaTime(This,pTimeStart,pTimeEnd) \ - (This)->lpVtbl -> SetMediaTime(This,pTimeStart,pTimeEnd) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaSample_GetPointer_Proxy( - IMediaSample * This, - /* [out] */ BYTE **ppBuffer); - - -void __RPC_STUB IMediaSample_GetPointer_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -long STDMETHODCALLTYPE IMediaSample_GetSize_Proxy( - IMediaSample * This); - - -void __RPC_STUB IMediaSample_GetSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSample_GetTime_Proxy( - IMediaSample * This, - /* [out] */ REFERENCE_TIME *pTimeStart, - /* [out] */ REFERENCE_TIME *pTimeEnd); - - -void __RPC_STUB IMediaSample_GetTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSample_SetTime_Proxy( - IMediaSample * This, - /* [in] */ REFERENCE_TIME *pTimeStart, - /* [in] */ REFERENCE_TIME *pTimeEnd); - - -void __RPC_STUB IMediaSample_SetTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSample_IsSyncPoint_Proxy( - IMediaSample * This); - - -void __RPC_STUB IMediaSample_IsSyncPoint_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSample_SetSyncPoint_Proxy( - IMediaSample * This, - BOOL bIsSyncPoint); - - -void __RPC_STUB IMediaSample_SetSyncPoint_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSample_IsPreroll_Proxy( - IMediaSample * This); - - -void __RPC_STUB IMediaSample_IsPreroll_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSample_SetPreroll_Proxy( - IMediaSample * This, - BOOL bIsPreroll); - - -void __RPC_STUB IMediaSample_SetPreroll_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -long STDMETHODCALLTYPE IMediaSample_GetActualDataLength_Proxy( - IMediaSample * This); - - -void __RPC_STUB IMediaSample_GetActualDataLength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSample_SetActualDataLength_Proxy( - IMediaSample * This, - long __MIDL_0010); - - -void __RPC_STUB IMediaSample_SetActualDataLength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSample_GetMediaType_Proxy( - IMediaSample * This, - AM_MEDIA_TYPE **ppMediaType); - - -void __RPC_STUB IMediaSample_GetMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSample_SetMediaType_Proxy( - IMediaSample * This, - AM_MEDIA_TYPE *pMediaType); - - -void __RPC_STUB IMediaSample_SetMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSample_IsDiscontinuity_Proxy( - IMediaSample * This); - - -void __RPC_STUB IMediaSample_IsDiscontinuity_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSample_SetDiscontinuity_Proxy( - IMediaSample * This, - BOOL bDiscontinuity); - - -void __RPC_STUB IMediaSample_SetDiscontinuity_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSample_GetMediaTime_Proxy( - IMediaSample * This, - /* [out] */ LONGLONG *pTimeStart, - /* [out] */ LONGLONG *pTimeEnd); - - -void __RPC_STUB IMediaSample_GetMediaTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSample_SetMediaTime_Proxy( - IMediaSample * This, - /* [in] */ LONGLONG *pTimeStart, - /* [in] */ LONGLONG *pTimeEnd); - - -void __RPC_STUB IMediaSample_SetMediaTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaSample_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0122 */ -/* [local] */ - -typedef IMediaSample *PMEDIASAMPLE; - - -enum tagAM_SAMPLE_PROPERTY_FLAGS - { AM_SAMPLE_SPLICEPOINT = 0x1, - AM_SAMPLE_PREROLL = 0x2, - AM_SAMPLE_DATADISCONTINUITY = 0x4, - AM_SAMPLE_TYPECHANGED = 0x8, - AM_SAMPLE_TIMEVALID = 0x10, - AM_SAMPLE_TIMEDISCONTINUITY = 0x40, - AM_SAMPLE_FLUSH_ON_PAUSE = 0x80, - AM_SAMPLE_STOPVALID = 0x100, - AM_SAMPLE_ENDOFSTREAM = 0x200, - AM_STREAM_MEDIA = 0, - AM_STREAM_CONTROL = 1 - } ; -typedef struct tagAM_SAMPLE2_PROPERTIES - { - DWORD cbData; - DWORD dwTypeSpecificFlags; - DWORD dwSampleFlags; - LONG lActual; - REFERENCE_TIME tStart; - REFERENCE_TIME tStop; - DWORD dwStreamId; - AM_MEDIA_TYPE *pMediaType; - BYTE *pbBuffer; - LONG cbBuffer; - } AM_SAMPLE2_PROPERTIES; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0122_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0122_v0_0_s_ifspec; - -#ifndef __IMediaSample2_INTERFACE_DEFINED__ -#define __IMediaSample2_INTERFACE_DEFINED__ - -/* interface IMediaSample2 */ -/* [unique][uuid][object][local] */ - - -EXTERN_C const IID IID_IMediaSample2; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("36b73884-c2c8-11cf-8b46-00805f6cef60") - IMediaSample2 : public IMediaSample - { - public: - virtual HRESULT STDMETHODCALLTYPE GetProperties( - /* [in] */ DWORD cbProperties, - /* [size_is][out] */ BYTE *pbProperties) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetProperties( - /* [in] */ DWORD cbProperties, - /* [size_is][in] */ const BYTE *pbProperties) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaSample2Vtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaSample2 * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaSample2 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaSample2 * This); - - HRESULT ( STDMETHODCALLTYPE *GetPointer )( - IMediaSample2 * This, - /* [out] */ BYTE **ppBuffer); - - long ( STDMETHODCALLTYPE *GetSize )( - IMediaSample2 * This); - - HRESULT ( STDMETHODCALLTYPE *GetTime )( - IMediaSample2 * This, - /* [out] */ REFERENCE_TIME *pTimeStart, - /* [out] */ REFERENCE_TIME *pTimeEnd); - - HRESULT ( STDMETHODCALLTYPE *SetTime )( - IMediaSample2 * This, - /* [in] */ REFERENCE_TIME *pTimeStart, - /* [in] */ REFERENCE_TIME *pTimeEnd); - - HRESULT ( STDMETHODCALLTYPE *IsSyncPoint )( - IMediaSample2 * This); - - HRESULT ( STDMETHODCALLTYPE *SetSyncPoint )( - IMediaSample2 * This, - BOOL bIsSyncPoint); - - HRESULT ( STDMETHODCALLTYPE *IsPreroll )( - IMediaSample2 * This); - - HRESULT ( STDMETHODCALLTYPE *SetPreroll )( - IMediaSample2 * This, - BOOL bIsPreroll); - - long ( STDMETHODCALLTYPE *GetActualDataLength )( - IMediaSample2 * This); - - HRESULT ( STDMETHODCALLTYPE *SetActualDataLength )( - IMediaSample2 * This, - long __MIDL_0010); - - HRESULT ( STDMETHODCALLTYPE *GetMediaType )( - IMediaSample2 * This, - AM_MEDIA_TYPE **ppMediaType); - - HRESULT ( STDMETHODCALLTYPE *SetMediaType )( - IMediaSample2 * This, - AM_MEDIA_TYPE *pMediaType); - - HRESULT ( STDMETHODCALLTYPE *IsDiscontinuity )( - IMediaSample2 * This); - - HRESULT ( STDMETHODCALLTYPE *SetDiscontinuity )( - IMediaSample2 * This, - BOOL bDiscontinuity); - - HRESULT ( STDMETHODCALLTYPE *GetMediaTime )( - IMediaSample2 * This, - /* [out] */ LONGLONG *pTimeStart, - /* [out] */ LONGLONG *pTimeEnd); - - HRESULT ( STDMETHODCALLTYPE *SetMediaTime )( - IMediaSample2 * This, - /* [in] */ LONGLONG *pTimeStart, - /* [in] */ LONGLONG *pTimeEnd); - - HRESULT ( STDMETHODCALLTYPE *GetProperties )( - IMediaSample2 * This, - /* [in] */ DWORD cbProperties, - /* [size_is][out] */ BYTE *pbProperties); - - HRESULT ( STDMETHODCALLTYPE *SetProperties )( - IMediaSample2 * This, - /* [in] */ DWORD cbProperties, - /* [size_is][in] */ const BYTE *pbProperties); - - END_INTERFACE - } IMediaSample2Vtbl; - - interface IMediaSample2 - { - CONST_VTBL struct IMediaSample2Vtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaSample2_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaSample2_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaSample2_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaSample2_GetPointer(This,ppBuffer) \ - (This)->lpVtbl -> GetPointer(This,ppBuffer) - -#define IMediaSample2_GetSize(This) \ - (This)->lpVtbl -> GetSize(This) - -#define IMediaSample2_GetTime(This,pTimeStart,pTimeEnd) \ - (This)->lpVtbl -> GetTime(This,pTimeStart,pTimeEnd) - -#define IMediaSample2_SetTime(This,pTimeStart,pTimeEnd) \ - (This)->lpVtbl -> SetTime(This,pTimeStart,pTimeEnd) - -#define IMediaSample2_IsSyncPoint(This) \ - (This)->lpVtbl -> IsSyncPoint(This) - -#define IMediaSample2_SetSyncPoint(This,bIsSyncPoint) \ - (This)->lpVtbl -> SetSyncPoint(This,bIsSyncPoint) - -#define IMediaSample2_IsPreroll(This) \ - (This)->lpVtbl -> IsPreroll(This) - -#define IMediaSample2_SetPreroll(This,bIsPreroll) \ - (This)->lpVtbl -> SetPreroll(This,bIsPreroll) - -#define IMediaSample2_GetActualDataLength(This) \ - (This)->lpVtbl -> GetActualDataLength(This) - -#define IMediaSample2_SetActualDataLength(This,__MIDL_0010) \ - (This)->lpVtbl -> SetActualDataLength(This,__MIDL_0010) - -#define IMediaSample2_GetMediaType(This,ppMediaType) \ - (This)->lpVtbl -> GetMediaType(This,ppMediaType) - -#define IMediaSample2_SetMediaType(This,pMediaType) \ - (This)->lpVtbl -> SetMediaType(This,pMediaType) - -#define IMediaSample2_IsDiscontinuity(This) \ - (This)->lpVtbl -> IsDiscontinuity(This) - -#define IMediaSample2_SetDiscontinuity(This,bDiscontinuity) \ - (This)->lpVtbl -> SetDiscontinuity(This,bDiscontinuity) - -#define IMediaSample2_GetMediaTime(This,pTimeStart,pTimeEnd) \ - (This)->lpVtbl -> GetMediaTime(This,pTimeStart,pTimeEnd) - -#define IMediaSample2_SetMediaTime(This,pTimeStart,pTimeEnd) \ - (This)->lpVtbl -> SetMediaTime(This,pTimeStart,pTimeEnd) - - -#define IMediaSample2_GetProperties(This,cbProperties,pbProperties) \ - (This)->lpVtbl -> GetProperties(This,cbProperties,pbProperties) - -#define IMediaSample2_SetProperties(This,cbProperties,pbProperties) \ - (This)->lpVtbl -> SetProperties(This,cbProperties,pbProperties) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaSample2_GetProperties_Proxy( - IMediaSample2 * This, - /* [in] */ DWORD cbProperties, - /* [size_is][out] */ BYTE *pbProperties); - - -void __RPC_STUB IMediaSample2_GetProperties_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSample2_SetProperties_Proxy( - IMediaSample2 * This, - /* [in] */ DWORD cbProperties, - /* [size_is][in] */ const BYTE *pbProperties); - - -void __RPC_STUB IMediaSample2_SetProperties_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaSample2_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0123 */ -/* [local] */ - -typedef IMediaSample2 *PMEDIASAMPLE2; - -#define AM_GBF_PREVFRAMESKIPPED 1 -#define AM_GBF_NOTASYNCPOINT 2 -#define AM_GBF_NOWAIT 4 -#define AM_GBF_NODDSURFACELOCK 8 - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0123_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0123_v0_0_s_ifspec; - -#ifndef __IMemAllocator_INTERFACE_DEFINED__ -#define __IMemAllocator_INTERFACE_DEFINED__ - -/* interface IMemAllocator */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IMemAllocator; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a8689c-0ad4-11ce-b03a-0020af0ba770") - IMemAllocator : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetProperties( - /* [in] */ ALLOCATOR_PROPERTIES *pRequest, - /* [out] */ ALLOCATOR_PROPERTIES *pActual) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetProperties( - /* [out] */ ALLOCATOR_PROPERTIES *pProps) = 0; - - virtual HRESULT STDMETHODCALLTYPE Commit( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Decommit( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBuffer( - /* [out] */ IMediaSample **ppBuffer, - /* [in] */ REFERENCE_TIME *pStartTime, - /* [in] */ REFERENCE_TIME *pEndTime, - /* [in] */ DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE ReleaseBuffer( - /* [in] */ IMediaSample *pBuffer) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMemAllocatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMemAllocator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMemAllocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMemAllocator * This); - - HRESULT ( STDMETHODCALLTYPE *SetProperties )( - IMemAllocator * This, - /* [in] */ ALLOCATOR_PROPERTIES *pRequest, - /* [out] */ ALLOCATOR_PROPERTIES *pActual); - - HRESULT ( STDMETHODCALLTYPE *GetProperties )( - IMemAllocator * This, - /* [out] */ ALLOCATOR_PROPERTIES *pProps); - - HRESULT ( STDMETHODCALLTYPE *Commit )( - IMemAllocator * This); - - HRESULT ( STDMETHODCALLTYPE *Decommit )( - IMemAllocator * This); - - HRESULT ( STDMETHODCALLTYPE *GetBuffer )( - IMemAllocator * This, - /* [out] */ IMediaSample **ppBuffer, - /* [in] */ REFERENCE_TIME *pStartTime, - /* [in] */ REFERENCE_TIME *pEndTime, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *ReleaseBuffer )( - IMemAllocator * This, - /* [in] */ IMediaSample *pBuffer); - - END_INTERFACE - } IMemAllocatorVtbl; - - interface IMemAllocator - { - CONST_VTBL struct IMemAllocatorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMemAllocator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMemAllocator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMemAllocator_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMemAllocator_SetProperties(This,pRequest,pActual) \ - (This)->lpVtbl -> SetProperties(This,pRequest,pActual) - -#define IMemAllocator_GetProperties(This,pProps) \ - (This)->lpVtbl -> GetProperties(This,pProps) - -#define IMemAllocator_Commit(This) \ - (This)->lpVtbl -> Commit(This) - -#define IMemAllocator_Decommit(This) \ - (This)->lpVtbl -> Decommit(This) - -#define IMemAllocator_GetBuffer(This,ppBuffer,pStartTime,pEndTime,dwFlags) \ - (This)->lpVtbl -> GetBuffer(This,ppBuffer,pStartTime,pEndTime,dwFlags) - -#define IMemAllocator_ReleaseBuffer(This,pBuffer) \ - (This)->lpVtbl -> ReleaseBuffer(This,pBuffer) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMemAllocator_SetProperties_Proxy( - IMemAllocator * This, - /* [in] */ ALLOCATOR_PROPERTIES *pRequest, - /* [out] */ ALLOCATOR_PROPERTIES *pActual); - - -void __RPC_STUB IMemAllocator_SetProperties_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMemAllocator_GetProperties_Proxy( - IMemAllocator * This, - /* [out] */ ALLOCATOR_PROPERTIES *pProps); - - -void __RPC_STUB IMemAllocator_GetProperties_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMemAllocator_Commit_Proxy( - IMemAllocator * This); - - -void __RPC_STUB IMemAllocator_Commit_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMemAllocator_Decommit_Proxy( - IMemAllocator * This); - - -void __RPC_STUB IMemAllocator_Decommit_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMemAllocator_GetBuffer_Proxy( - IMemAllocator * This, - /* [out] */ IMediaSample **ppBuffer, - /* [in] */ REFERENCE_TIME *pStartTime, - /* [in] */ REFERENCE_TIME *pEndTime, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IMemAllocator_GetBuffer_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMemAllocator_ReleaseBuffer_Proxy( - IMemAllocator * This, - /* [in] */ IMediaSample *pBuffer); - - -void __RPC_STUB IMemAllocator_ReleaseBuffer_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMemAllocator_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0124 */ -/* [local] */ - -typedef IMemAllocator *PMEMALLOCATOR; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0124_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0124_v0_0_s_ifspec; - -#ifndef __IMemAllocatorCallbackTemp_INTERFACE_DEFINED__ -#define __IMemAllocatorCallbackTemp_INTERFACE_DEFINED__ - -/* interface IMemAllocatorCallbackTemp */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IMemAllocatorCallbackTemp; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("379a0cf0-c1de-11d2-abf5-00a0c905f375") - IMemAllocatorCallbackTemp : public IMemAllocator - { - public: - virtual HRESULT STDMETHODCALLTYPE SetNotify( - /* [in] */ IMemAllocatorNotifyCallbackTemp *pNotify) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFreeCount( - /* [out] */ LONG *plBuffersFree) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMemAllocatorCallbackTempVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMemAllocatorCallbackTemp * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMemAllocatorCallbackTemp * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMemAllocatorCallbackTemp * This); - - HRESULT ( STDMETHODCALLTYPE *SetProperties )( - IMemAllocatorCallbackTemp * This, - /* [in] */ ALLOCATOR_PROPERTIES *pRequest, - /* [out] */ ALLOCATOR_PROPERTIES *pActual); - - HRESULT ( STDMETHODCALLTYPE *GetProperties )( - IMemAllocatorCallbackTemp * This, - /* [out] */ ALLOCATOR_PROPERTIES *pProps); - - HRESULT ( STDMETHODCALLTYPE *Commit )( - IMemAllocatorCallbackTemp * This); - - HRESULT ( STDMETHODCALLTYPE *Decommit )( - IMemAllocatorCallbackTemp * This); - - HRESULT ( STDMETHODCALLTYPE *GetBuffer )( - IMemAllocatorCallbackTemp * This, - /* [out] */ IMediaSample **ppBuffer, - /* [in] */ REFERENCE_TIME *pStartTime, - /* [in] */ REFERENCE_TIME *pEndTime, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *ReleaseBuffer )( - IMemAllocatorCallbackTemp * This, - /* [in] */ IMediaSample *pBuffer); - - HRESULT ( STDMETHODCALLTYPE *SetNotify )( - IMemAllocatorCallbackTemp * This, - /* [in] */ IMemAllocatorNotifyCallbackTemp *pNotify); - - HRESULT ( STDMETHODCALLTYPE *GetFreeCount )( - IMemAllocatorCallbackTemp * This, - /* [out] */ LONG *plBuffersFree); - - END_INTERFACE - } IMemAllocatorCallbackTempVtbl; - - interface IMemAllocatorCallbackTemp - { - CONST_VTBL struct IMemAllocatorCallbackTempVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMemAllocatorCallbackTemp_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMemAllocatorCallbackTemp_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMemAllocatorCallbackTemp_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMemAllocatorCallbackTemp_SetProperties(This,pRequest,pActual) \ - (This)->lpVtbl -> SetProperties(This,pRequest,pActual) - -#define IMemAllocatorCallbackTemp_GetProperties(This,pProps) \ - (This)->lpVtbl -> GetProperties(This,pProps) - -#define IMemAllocatorCallbackTemp_Commit(This) \ - (This)->lpVtbl -> Commit(This) - -#define IMemAllocatorCallbackTemp_Decommit(This) \ - (This)->lpVtbl -> Decommit(This) - -#define IMemAllocatorCallbackTemp_GetBuffer(This,ppBuffer,pStartTime,pEndTime,dwFlags) \ - (This)->lpVtbl -> GetBuffer(This,ppBuffer,pStartTime,pEndTime,dwFlags) - -#define IMemAllocatorCallbackTemp_ReleaseBuffer(This,pBuffer) \ - (This)->lpVtbl -> ReleaseBuffer(This,pBuffer) - - -#define IMemAllocatorCallbackTemp_SetNotify(This,pNotify) \ - (This)->lpVtbl -> SetNotify(This,pNotify) - -#define IMemAllocatorCallbackTemp_GetFreeCount(This,plBuffersFree) \ - (This)->lpVtbl -> GetFreeCount(This,plBuffersFree) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMemAllocatorCallbackTemp_SetNotify_Proxy( - IMemAllocatorCallbackTemp * This, - /* [in] */ IMemAllocatorNotifyCallbackTemp *pNotify); - - -void __RPC_STUB IMemAllocatorCallbackTemp_SetNotify_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMemAllocatorCallbackTemp_GetFreeCount_Proxy( - IMemAllocatorCallbackTemp * This, - /* [out] */ LONG *plBuffersFree); - - -void __RPC_STUB IMemAllocatorCallbackTemp_GetFreeCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMemAllocatorCallbackTemp_INTERFACE_DEFINED__ */ - - -#ifndef __IMemAllocatorNotifyCallbackTemp_INTERFACE_DEFINED__ -#define __IMemAllocatorNotifyCallbackTemp_INTERFACE_DEFINED__ - -/* interface IMemAllocatorNotifyCallbackTemp */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IMemAllocatorNotifyCallbackTemp; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("92980b30-c1de-11d2-abf5-00a0c905f375") - IMemAllocatorNotifyCallbackTemp : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE NotifyRelease( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMemAllocatorNotifyCallbackTempVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMemAllocatorNotifyCallbackTemp * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMemAllocatorNotifyCallbackTemp * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMemAllocatorNotifyCallbackTemp * This); - - HRESULT ( STDMETHODCALLTYPE *NotifyRelease )( - IMemAllocatorNotifyCallbackTemp * This); - - END_INTERFACE - } IMemAllocatorNotifyCallbackTempVtbl; - - interface IMemAllocatorNotifyCallbackTemp - { - CONST_VTBL struct IMemAllocatorNotifyCallbackTempVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMemAllocatorNotifyCallbackTemp_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMemAllocatorNotifyCallbackTemp_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMemAllocatorNotifyCallbackTemp_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMemAllocatorNotifyCallbackTemp_NotifyRelease(This) \ - (This)->lpVtbl -> NotifyRelease(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMemAllocatorNotifyCallbackTemp_NotifyRelease_Proxy( - IMemAllocatorNotifyCallbackTemp * This); - - -void __RPC_STUB IMemAllocatorNotifyCallbackTemp_NotifyRelease_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMemAllocatorNotifyCallbackTemp_INTERFACE_DEFINED__ */ - - -#ifndef __IMemInputPin_INTERFACE_DEFINED__ -#define __IMemInputPin_INTERFACE_DEFINED__ - -/* interface IMemInputPin */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IMemInputPin; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a8689d-0ad4-11ce-b03a-0020af0ba770") - IMemInputPin : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetAllocator( - /* [out] */ IMemAllocator **ppAllocator) = 0; - - virtual HRESULT STDMETHODCALLTYPE NotifyAllocator( - /* [in] */ IMemAllocator *pAllocator, - /* [in] */ BOOL bReadOnly) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAllocatorRequirements( - /* [out] */ ALLOCATOR_PROPERTIES *pProps) = 0; - - virtual HRESULT STDMETHODCALLTYPE Receive( - /* [in] */ IMediaSample *pSample) = 0; - - virtual HRESULT STDMETHODCALLTYPE ReceiveMultiple( - /* [size_is][in] */ IMediaSample **pSamples, - /* [in] */ long nSamples, - /* [out] */ long *nSamplesProcessed) = 0; - - virtual HRESULT STDMETHODCALLTYPE ReceiveCanBlock( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMemInputPinVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMemInputPin * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMemInputPin * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMemInputPin * This); - - HRESULT ( STDMETHODCALLTYPE *GetAllocator )( - IMemInputPin * This, - /* [out] */ IMemAllocator **ppAllocator); - - HRESULT ( STDMETHODCALLTYPE *NotifyAllocator )( - IMemInputPin * This, - /* [in] */ IMemAllocator *pAllocator, - /* [in] */ BOOL bReadOnly); - - HRESULT ( STDMETHODCALLTYPE *GetAllocatorRequirements )( - IMemInputPin * This, - /* [out] */ ALLOCATOR_PROPERTIES *pProps); - - HRESULT ( STDMETHODCALLTYPE *Receive )( - IMemInputPin * This, - /* [in] */ IMediaSample *pSample); - - HRESULT ( STDMETHODCALLTYPE *ReceiveMultiple )( - IMemInputPin * This, - /* [size_is][in] */ IMediaSample **pSamples, - /* [in] */ long nSamples, - /* [out] */ long *nSamplesProcessed); - - HRESULT ( STDMETHODCALLTYPE *ReceiveCanBlock )( - IMemInputPin * This); - - END_INTERFACE - } IMemInputPinVtbl; - - interface IMemInputPin - { - CONST_VTBL struct IMemInputPinVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMemInputPin_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMemInputPin_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMemInputPin_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMemInputPin_GetAllocator(This,ppAllocator) \ - (This)->lpVtbl -> GetAllocator(This,ppAllocator) - -#define IMemInputPin_NotifyAllocator(This,pAllocator,bReadOnly) \ - (This)->lpVtbl -> NotifyAllocator(This,pAllocator,bReadOnly) - -#define IMemInputPin_GetAllocatorRequirements(This,pProps) \ - (This)->lpVtbl -> GetAllocatorRequirements(This,pProps) - -#define IMemInputPin_Receive(This,pSample) \ - (This)->lpVtbl -> Receive(This,pSample) - -#define IMemInputPin_ReceiveMultiple(This,pSamples,nSamples,nSamplesProcessed) \ - (This)->lpVtbl -> ReceiveMultiple(This,pSamples,nSamples,nSamplesProcessed) - -#define IMemInputPin_ReceiveCanBlock(This) \ - (This)->lpVtbl -> ReceiveCanBlock(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMemInputPin_GetAllocator_Proxy( - IMemInputPin * This, - /* [out] */ IMemAllocator **ppAllocator); - - -void __RPC_STUB IMemInputPin_GetAllocator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMemInputPin_NotifyAllocator_Proxy( - IMemInputPin * This, - /* [in] */ IMemAllocator *pAllocator, - /* [in] */ BOOL bReadOnly); - - -void __RPC_STUB IMemInputPin_NotifyAllocator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMemInputPin_GetAllocatorRequirements_Proxy( - IMemInputPin * This, - /* [out] */ ALLOCATOR_PROPERTIES *pProps); - - -void __RPC_STUB IMemInputPin_GetAllocatorRequirements_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMemInputPin_Receive_Proxy( - IMemInputPin * This, - /* [in] */ IMediaSample *pSample); - - -void __RPC_STUB IMemInputPin_Receive_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMemInputPin_ReceiveMultiple_Proxy( - IMemInputPin * This, - /* [size_is][in] */ IMediaSample **pSamples, - /* [in] */ long nSamples, - /* [out] */ long *nSamplesProcessed); - - -void __RPC_STUB IMemInputPin_ReceiveMultiple_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMemInputPin_ReceiveCanBlock_Proxy( - IMemInputPin * This); - - -void __RPC_STUB IMemInputPin_ReceiveCanBlock_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMemInputPin_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0127 */ -/* [local] */ - -typedef IMemInputPin *PMEMINPUTPIN; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0127_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0127_v0_0_s_ifspec; - -#ifndef __IAMovieSetup_INTERFACE_DEFINED__ -#define __IAMovieSetup_INTERFACE_DEFINED__ - -/* interface IAMovieSetup */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMovieSetup; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("a3d8cec0-7e5a-11cf-bbc5-00805f6cef20") - IAMovieSetup : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Register( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Unregister( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMovieSetupVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMovieSetup * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMovieSetup * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMovieSetup * This); - - HRESULT ( STDMETHODCALLTYPE *Register )( - IAMovieSetup * This); - - HRESULT ( STDMETHODCALLTYPE *Unregister )( - IAMovieSetup * This); - - END_INTERFACE - } IAMovieSetupVtbl; - - interface IAMovieSetup - { - CONST_VTBL struct IAMovieSetupVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMovieSetup_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMovieSetup_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMovieSetup_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMovieSetup_Register(This) \ - (This)->lpVtbl -> Register(This) - -#define IAMovieSetup_Unregister(This) \ - (This)->lpVtbl -> Unregister(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMovieSetup_Register_Proxy( - IAMovieSetup * This); - - -void __RPC_STUB IAMovieSetup_Register_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMovieSetup_Unregister_Proxy( - IAMovieSetup * This); - - -void __RPC_STUB IAMovieSetup_Unregister_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMovieSetup_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0128 */ -/* [local] */ - -typedef IAMovieSetup *PAMOVIESETUP; - -typedef -enum AM_SEEKING_SeekingFlags - { AM_SEEKING_NoPositioning = 0, - AM_SEEKING_AbsolutePositioning = 0x1, - AM_SEEKING_RelativePositioning = 0x2, - AM_SEEKING_IncrementalPositioning = 0x3, - AM_SEEKING_PositioningBitsMask = 0x3, - AM_SEEKING_SeekToKeyFrame = 0x4, - AM_SEEKING_ReturnTime = 0x8, - AM_SEEKING_Segment = 0x10, - AM_SEEKING_NoFlush = 0x20 - } AM_SEEKING_SEEKING_FLAGS; - -typedef -enum AM_SEEKING_SeekingCapabilities - { AM_SEEKING_CanSeekAbsolute = 0x1, - AM_SEEKING_CanSeekForwards = 0x2, - AM_SEEKING_CanSeekBackwards = 0x4, - AM_SEEKING_CanGetCurrentPos = 0x8, - AM_SEEKING_CanGetStopPos = 0x10, - AM_SEEKING_CanGetDuration = 0x20, - AM_SEEKING_CanPlayBackwards = 0x40, - AM_SEEKING_CanDoSegments = 0x80, - AM_SEEKING_Source = 0x100 - } AM_SEEKING_SEEKING_CAPABILITIES; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0128_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0128_v0_0_s_ifspec; - -#ifndef __IMediaSeeking_INTERFACE_DEFINED__ -#define __IMediaSeeking_INTERFACE_DEFINED__ - -/* interface IMediaSeeking */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IMediaSeeking; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("36b73880-c2c8-11cf-8b46-00805f6cef60") - IMediaSeeking : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetCapabilities( - /* [out] */ DWORD *pCapabilities) = 0; - - virtual HRESULT STDMETHODCALLTYPE CheckCapabilities( - /* [out][in] */ DWORD *pCapabilities) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsFormatSupported( - /* [in] */ const GUID *pFormat) = 0; - - virtual HRESULT STDMETHODCALLTYPE QueryPreferredFormat( - /* [out] */ GUID *pFormat) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimeFormat( - /* [out] */ GUID *pFormat) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsUsingTimeFormat( - /* [in] */ const GUID *pFormat) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTimeFormat( - /* [in] */ const GUID *pFormat) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDuration( - /* [out] */ LONGLONG *pDuration) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetStopPosition( - /* [out] */ LONGLONG *pStop) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentPosition( - /* [out] */ LONGLONG *pCurrent) = 0; - - virtual HRESULT STDMETHODCALLTYPE ConvertTimeFormat( - /* [out] */ LONGLONG *pTarget, - /* [in] */ const GUID *pTargetFormat, - /* [in] */ LONGLONG Source, - /* [in] */ const GUID *pSourceFormat) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetPositions( - /* [out][in] */ LONGLONG *pCurrent, - /* [in] */ DWORD dwCurrentFlags, - /* [out][in] */ LONGLONG *pStop, - /* [in] */ DWORD dwStopFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetPositions( - /* [out] */ LONGLONG *pCurrent, - /* [out] */ LONGLONG *pStop) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailable( - /* [out] */ LONGLONG *pEarliest, - /* [out] */ LONGLONG *pLatest) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetRate( - /* [in] */ double dRate) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetRate( - /* [out] */ double *pdRate) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetPreroll( - /* [out] */ LONGLONG *pllPreroll) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaSeekingVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaSeeking * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaSeeking * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaSeeking * This); - - HRESULT ( STDMETHODCALLTYPE *GetCapabilities )( - IMediaSeeking * This, - /* [out] */ DWORD *pCapabilities); - - HRESULT ( STDMETHODCALLTYPE *CheckCapabilities )( - IMediaSeeking * This, - /* [out][in] */ DWORD *pCapabilities); - - HRESULT ( STDMETHODCALLTYPE *IsFormatSupported )( - IMediaSeeking * This, - /* [in] */ const GUID *pFormat); - - HRESULT ( STDMETHODCALLTYPE *QueryPreferredFormat )( - IMediaSeeking * This, - /* [out] */ GUID *pFormat); - - HRESULT ( STDMETHODCALLTYPE *GetTimeFormat )( - IMediaSeeking * This, - /* [out] */ GUID *pFormat); - - HRESULT ( STDMETHODCALLTYPE *IsUsingTimeFormat )( - IMediaSeeking * This, - /* [in] */ const GUID *pFormat); - - HRESULT ( STDMETHODCALLTYPE *SetTimeFormat )( - IMediaSeeking * This, - /* [in] */ const GUID *pFormat); - - HRESULT ( STDMETHODCALLTYPE *GetDuration )( - IMediaSeeking * This, - /* [out] */ LONGLONG *pDuration); - - HRESULT ( STDMETHODCALLTYPE *GetStopPosition )( - IMediaSeeking * This, - /* [out] */ LONGLONG *pStop); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentPosition )( - IMediaSeeking * This, - /* [out] */ LONGLONG *pCurrent); - - HRESULT ( STDMETHODCALLTYPE *ConvertTimeFormat )( - IMediaSeeking * This, - /* [out] */ LONGLONG *pTarget, - /* [in] */ const GUID *pTargetFormat, - /* [in] */ LONGLONG Source, - /* [in] */ const GUID *pSourceFormat); - - HRESULT ( STDMETHODCALLTYPE *SetPositions )( - IMediaSeeking * This, - /* [out][in] */ LONGLONG *pCurrent, - /* [in] */ DWORD dwCurrentFlags, - /* [out][in] */ LONGLONG *pStop, - /* [in] */ DWORD dwStopFlags); - - HRESULT ( STDMETHODCALLTYPE *GetPositions )( - IMediaSeeking * This, - /* [out] */ LONGLONG *pCurrent, - /* [out] */ LONGLONG *pStop); - - HRESULT ( STDMETHODCALLTYPE *GetAvailable )( - IMediaSeeking * This, - /* [out] */ LONGLONG *pEarliest, - /* [out] */ LONGLONG *pLatest); - - HRESULT ( STDMETHODCALLTYPE *SetRate )( - IMediaSeeking * This, - /* [in] */ double dRate); - - HRESULT ( STDMETHODCALLTYPE *GetRate )( - IMediaSeeking * This, - /* [out] */ double *pdRate); - - HRESULT ( STDMETHODCALLTYPE *GetPreroll )( - IMediaSeeking * This, - /* [out] */ LONGLONG *pllPreroll); - - END_INTERFACE - } IMediaSeekingVtbl; - - interface IMediaSeeking - { - CONST_VTBL struct IMediaSeekingVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaSeeking_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaSeeking_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaSeeking_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaSeeking_GetCapabilities(This,pCapabilities) \ - (This)->lpVtbl -> GetCapabilities(This,pCapabilities) - -#define IMediaSeeking_CheckCapabilities(This,pCapabilities) \ - (This)->lpVtbl -> CheckCapabilities(This,pCapabilities) - -#define IMediaSeeking_IsFormatSupported(This,pFormat) \ - (This)->lpVtbl -> IsFormatSupported(This,pFormat) - -#define IMediaSeeking_QueryPreferredFormat(This,pFormat) \ - (This)->lpVtbl -> QueryPreferredFormat(This,pFormat) - -#define IMediaSeeking_GetTimeFormat(This,pFormat) \ - (This)->lpVtbl -> GetTimeFormat(This,pFormat) - -#define IMediaSeeking_IsUsingTimeFormat(This,pFormat) \ - (This)->lpVtbl -> IsUsingTimeFormat(This,pFormat) - -#define IMediaSeeking_SetTimeFormat(This,pFormat) \ - (This)->lpVtbl -> SetTimeFormat(This,pFormat) - -#define IMediaSeeking_GetDuration(This,pDuration) \ - (This)->lpVtbl -> GetDuration(This,pDuration) - -#define IMediaSeeking_GetStopPosition(This,pStop) \ - (This)->lpVtbl -> GetStopPosition(This,pStop) - -#define IMediaSeeking_GetCurrentPosition(This,pCurrent) \ - (This)->lpVtbl -> GetCurrentPosition(This,pCurrent) - -#define IMediaSeeking_ConvertTimeFormat(This,pTarget,pTargetFormat,Source,pSourceFormat) \ - (This)->lpVtbl -> ConvertTimeFormat(This,pTarget,pTargetFormat,Source,pSourceFormat) - -#define IMediaSeeking_SetPositions(This,pCurrent,dwCurrentFlags,pStop,dwStopFlags) \ - (This)->lpVtbl -> SetPositions(This,pCurrent,dwCurrentFlags,pStop,dwStopFlags) - -#define IMediaSeeking_GetPositions(This,pCurrent,pStop) \ - (This)->lpVtbl -> GetPositions(This,pCurrent,pStop) - -#define IMediaSeeking_GetAvailable(This,pEarliest,pLatest) \ - (This)->lpVtbl -> GetAvailable(This,pEarliest,pLatest) - -#define IMediaSeeking_SetRate(This,dRate) \ - (This)->lpVtbl -> SetRate(This,dRate) - -#define IMediaSeeking_GetRate(This,pdRate) \ - (This)->lpVtbl -> GetRate(This,pdRate) - -#define IMediaSeeking_GetPreroll(This,pllPreroll) \ - (This)->lpVtbl -> GetPreroll(This,pllPreroll) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_GetCapabilities_Proxy( - IMediaSeeking * This, - /* [out] */ DWORD *pCapabilities); - - -void __RPC_STUB IMediaSeeking_GetCapabilities_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_CheckCapabilities_Proxy( - IMediaSeeking * This, - /* [out][in] */ DWORD *pCapabilities); - - -void __RPC_STUB IMediaSeeking_CheckCapabilities_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_IsFormatSupported_Proxy( - IMediaSeeking * This, - /* [in] */ const GUID *pFormat); - - -void __RPC_STUB IMediaSeeking_IsFormatSupported_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_QueryPreferredFormat_Proxy( - IMediaSeeking * This, - /* [out] */ GUID *pFormat); - - -void __RPC_STUB IMediaSeeking_QueryPreferredFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_GetTimeFormat_Proxy( - IMediaSeeking * This, - /* [out] */ GUID *pFormat); - - -void __RPC_STUB IMediaSeeking_GetTimeFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_IsUsingTimeFormat_Proxy( - IMediaSeeking * This, - /* [in] */ const GUID *pFormat); - - -void __RPC_STUB IMediaSeeking_IsUsingTimeFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_SetTimeFormat_Proxy( - IMediaSeeking * This, - /* [in] */ const GUID *pFormat); - - -void __RPC_STUB IMediaSeeking_SetTimeFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_GetDuration_Proxy( - IMediaSeeking * This, - /* [out] */ LONGLONG *pDuration); - - -void __RPC_STUB IMediaSeeking_GetDuration_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_GetStopPosition_Proxy( - IMediaSeeking * This, - /* [out] */ LONGLONG *pStop); - - -void __RPC_STUB IMediaSeeking_GetStopPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_GetCurrentPosition_Proxy( - IMediaSeeking * This, - /* [out] */ LONGLONG *pCurrent); - - -void __RPC_STUB IMediaSeeking_GetCurrentPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_ConvertTimeFormat_Proxy( - IMediaSeeking * This, - /* [out] */ LONGLONG *pTarget, - /* [in] */ const GUID *pTargetFormat, - /* [in] */ LONGLONG Source, - /* [in] */ const GUID *pSourceFormat); - - -void __RPC_STUB IMediaSeeking_ConvertTimeFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_SetPositions_Proxy( - IMediaSeeking * This, - /* [out][in] */ LONGLONG *pCurrent, - /* [in] */ DWORD dwCurrentFlags, - /* [out][in] */ LONGLONG *pStop, - /* [in] */ DWORD dwStopFlags); - - -void __RPC_STUB IMediaSeeking_SetPositions_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_GetPositions_Proxy( - IMediaSeeking * This, - /* [out] */ LONGLONG *pCurrent, - /* [out] */ LONGLONG *pStop); - - -void __RPC_STUB IMediaSeeking_GetPositions_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_GetAvailable_Proxy( - IMediaSeeking * This, - /* [out] */ LONGLONG *pEarliest, - /* [out] */ LONGLONG *pLatest); - - -void __RPC_STUB IMediaSeeking_GetAvailable_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_SetRate_Proxy( - IMediaSeeking * This, - /* [in] */ double dRate); - - -void __RPC_STUB IMediaSeeking_SetRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_GetRate_Proxy( - IMediaSeeking * This, - /* [out] */ double *pdRate); - - -void __RPC_STUB IMediaSeeking_GetRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMediaSeeking_GetPreroll_Proxy( - IMediaSeeking * This, - /* [out] */ LONGLONG *pllPreroll); - - -void __RPC_STUB IMediaSeeking_GetPreroll_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaSeeking_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0129 */ -/* [local] */ - -typedef IMediaSeeking *PMEDIASEEKING; - -enum tagAM_MEDIAEVENT_FLAGS -{ - AM_MEDIAEVENT_NONOTIFY = 0x01 -}; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -typedef /* [public][public] */ struct __MIDL___MIDL_itf_strmif_0129_0001 - { - CLSID Clsid; - LPWSTR Name; - } REGFILTER; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0129_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0129_v0_0_s_ifspec; - -#ifndef __IEnumRegFilters_INTERFACE_DEFINED__ -#define __IEnumRegFilters_INTERFACE_DEFINED__ - -/* interface IEnumRegFilters */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IEnumRegFilters; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868a4-0ad4-11ce-b03a-0020af0ba770") - IEnumRegFilters : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Next( - /* [in] */ ULONG cFilters, - /* [out] */ REGFILTER **apRegFilter, - /* [out] */ ULONG *pcFetched) = 0; - - virtual HRESULT STDMETHODCALLTYPE Skip( - /* [in] */ ULONG cFilters) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - /* [out] */ IEnumRegFilters **ppEnum) = 0; - - }; - -#else /* C style interface */ - - typedef struct IEnumRegFiltersVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IEnumRegFilters * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IEnumRegFilters * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IEnumRegFilters * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - IEnumRegFilters * This, - /* [in] */ ULONG cFilters, - /* [out] */ REGFILTER **apRegFilter, - /* [out] */ ULONG *pcFetched); - - HRESULT ( STDMETHODCALLTYPE *Skip )( - IEnumRegFilters * This, - /* [in] */ ULONG cFilters); - - HRESULT ( STDMETHODCALLTYPE *Reset )( - IEnumRegFilters * This); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IEnumRegFilters * This, - /* [out] */ IEnumRegFilters **ppEnum); - - END_INTERFACE - } IEnumRegFiltersVtbl; - - interface IEnumRegFilters - { - CONST_VTBL struct IEnumRegFiltersVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IEnumRegFilters_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IEnumRegFilters_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IEnumRegFilters_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IEnumRegFilters_Next(This,cFilters,apRegFilter,pcFetched) \ - (This)->lpVtbl -> Next(This,cFilters,apRegFilter,pcFetched) - -#define IEnumRegFilters_Skip(This,cFilters) \ - (This)->lpVtbl -> Skip(This,cFilters) - -#define IEnumRegFilters_Reset(This) \ - (This)->lpVtbl -> Reset(This) - -#define IEnumRegFilters_Clone(This,ppEnum) \ - (This)->lpVtbl -> Clone(This,ppEnum) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IEnumRegFilters_Next_Proxy( - IEnumRegFilters * This, - /* [in] */ ULONG cFilters, - /* [out] */ REGFILTER **apRegFilter, - /* [out] */ ULONG *pcFetched); - - -void __RPC_STUB IEnumRegFilters_Next_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumRegFilters_Skip_Proxy( - IEnumRegFilters * This, - /* [in] */ ULONG cFilters); - - -void __RPC_STUB IEnumRegFilters_Skip_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumRegFilters_Reset_Proxy( - IEnumRegFilters * This); - - -void __RPC_STUB IEnumRegFilters_Reset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumRegFilters_Clone_Proxy( - IEnumRegFilters * This, - /* [out] */ IEnumRegFilters **ppEnum); - - -void __RPC_STUB IEnumRegFilters_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IEnumRegFilters_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0131 */ -/* [local] */ - -typedef IEnumRegFilters *PENUMREGFILTERS; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0131_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0131_v0_0_s_ifspec; - -#ifndef __IFilterMapper_INTERFACE_DEFINED__ -#define __IFilterMapper_INTERFACE_DEFINED__ - -/* interface IFilterMapper */ -/* [unique][uuid][object] */ - - -enum __MIDL_IFilterMapper_0001 - { MERIT_PREFERRED = 0x800000, - MERIT_NORMAL = 0x600000, - MERIT_UNLIKELY = 0x400000, - MERIT_DO_NOT_USE = 0x200000, - MERIT_SW_COMPRESSOR = 0x100000, - MERIT_HW_COMPRESSOR = 0x100050 - } ; - -EXTERN_C const IID IID_IFilterMapper; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868a3-0ad4-11ce-b03a-0020af0ba770") - IFilterMapper : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE RegisterFilter( - /* [in] */ CLSID clsid, - /* [in] */ LPCWSTR Name, - /* [in] */ DWORD dwMerit) = 0; - - virtual HRESULT STDMETHODCALLTYPE RegisterFilterInstance( - /* [in] */ CLSID clsid, - /* [in] */ LPCWSTR Name, - /* [out] */ CLSID *MRId) = 0; - - virtual HRESULT STDMETHODCALLTYPE RegisterPin( - /* [in] */ CLSID Filter, - /* [in] */ LPCWSTR Name, - /* [in] */ BOOL bRendered, - /* [in] */ BOOL bOutput, - /* [in] */ BOOL bZero, - /* [in] */ BOOL bMany, - /* [in] */ CLSID ConnectsToFilter, - /* [in] */ LPCWSTR ConnectsToPin) = 0; - - virtual HRESULT STDMETHODCALLTYPE RegisterPinType( - /* [in] */ CLSID clsFilter, - /* [in] */ LPCWSTR strName, - /* [in] */ CLSID clsMajorType, - /* [in] */ CLSID clsSubType) = 0; - - virtual HRESULT STDMETHODCALLTYPE UnregisterFilter( - /* [in] */ CLSID Filter) = 0; - - virtual HRESULT STDMETHODCALLTYPE UnregisterFilterInstance( - /* [in] */ CLSID MRId) = 0; - - virtual HRESULT STDMETHODCALLTYPE UnregisterPin( - /* [in] */ CLSID Filter, - /* [in] */ LPCWSTR Name) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnumMatchingFilters( - /* [out] */ IEnumRegFilters **ppEnum, - /* [in] */ DWORD dwMerit, - /* [in] */ BOOL bInputNeeded, - /* [in] */ CLSID clsInMaj, - /* [in] */ CLSID clsInSub, - /* [in] */ BOOL bRender, - /* [in] */ BOOL bOututNeeded, - /* [in] */ CLSID clsOutMaj, - /* [in] */ CLSID clsOutSub) = 0; - - }; - -#else /* C style interface */ - - typedef struct IFilterMapperVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IFilterMapper * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IFilterMapper * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IFilterMapper * This); - - HRESULT ( STDMETHODCALLTYPE *RegisterFilter )( - IFilterMapper * This, - /* [in] */ CLSID clsid, - /* [in] */ LPCWSTR Name, - /* [in] */ DWORD dwMerit); - - HRESULT ( STDMETHODCALLTYPE *RegisterFilterInstance )( - IFilterMapper * This, - /* [in] */ CLSID clsid, - /* [in] */ LPCWSTR Name, - /* [out] */ CLSID *MRId); - - HRESULT ( STDMETHODCALLTYPE *RegisterPin )( - IFilterMapper * This, - /* [in] */ CLSID Filter, - /* [in] */ LPCWSTR Name, - /* [in] */ BOOL bRendered, - /* [in] */ BOOL bOutput, - /* [in] */ BOOL bZero, - /* [in] */ BOOL bMany, - /* [in] */ CLSID ConnectsToFilter, - /* [in] */ LPCWSTR ConnectsToPin); - - HRESULT ( STDMETHODCALLTYPE *RegisterPinType )( - IFilterMapper * This, - /* [in] */ CLSID clsFilter, - /* [in] */ LPCWSTR strName, - /* [in] */ CLSID clsMajorType, - /* [in] */ CLSID clsSubType); - - HRESULT ( STDMETHODCALLTYPE *UnregisterFilter )( - IFilterMapper * This, - /* [in] */ CLSID Filter); - - HRESULT ( STDMETHODCALLTYPE *UnregisterFilterInstance )( - IFilterMapper * This, - /* [in] */ CLSID MRId); - - HRESULT ( STDMETHODCALLTYPE *UnregisterPin )( - IFilterMapper * This, - /* [in] */ CLSID Filter, - /* [in] */ LPCWSTR Name); - - HRESULT ( STDMETHODCALLTYPE *EnumMatchingFilters )( - IFilterMapper * This, - /* [out] */ IEnumRegFilters **ppEnum, - /* [in] */ DWORD dwMerit, - /* [in] */ BOOL bInputNeeded, - /* [in] */ CLSID clsInMaj, - /* [in] */ CLSID clsInSub, - /* [in] */ BOOL bRender, - /* [in] */ BOOL bOututNeeded, - /* [in] */ CLSID clsOutMaj, - /* [in] */ CLSID clsOutSub); - - END_INTERFACE - } IFilterMapperVtbl; - - interface IFilterMapper - { - CONST_VTBL struct IFilterMapperVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IFilterMapper_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IFilterMapper_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IFilterMapper_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IFilterMapper_RegisterFilter(This,clsid,Name,dwMerit) \ - (This)->lpVtbl -> RegisterFilter(This,clsid,Name,dwMerit) - -#define IFilterMapper_RegisterFilterInstance(This,clsid,Name,MRId) \ - (This)->lpVtbl -> RegisterFilterInstance(This,clsid,Name,MRId) - -#define IFilterMapper_RegisterPin(This,Filter,Name,bRendered,bOutput,bZero,bMany,ConnectsToFilter,ConnectsToPin) \ - (This)->lpVtbl -> RegisterPin(This,Filter,Name,bRendered,bOutput,bZero,bMany,ConnectsToFilter,ConnectsToPin) - -#define IFilterMapper_RegisterPinType(This,clsFilter,strName,clsMajorType,clsSubType) \ - (This)->lpVtbl -> RegisterPinType(This,clsFilter,strName,clsMajorType,clsSubType) - -#define IFilterMapper_UnregisterFilter(This,Filter) \ - (This)->lpVtbl -> UnregisterFilter(This,Filter) - -#define IFilterMapper_UnregisterFilterInstance(This,MRId) \ - (This)->lpVtbl -> UnregisterFilterInstance(This,MRId) - -#define IFilterMapper_UnregisterPin(This,Filter,Name) \ - (This)->lpVtbl -> UnregisterPin(This,Filter,Name) - -#define IFilterMapper_EnumMatchingFilters(This,ppEnum,dwMerit,bInputNeeded,clsInMaj,clsInSub,bRender,bOututNeeded,clsOutMaj,clsOutSub) \ - (This)->lpVtbl -> EnumMatchingFilters(This,ppEnum,dwMerit,bInputNeeded,clsInMaj,clsInSub,bRender,bOututNeeded,clsOutMaj,clsOutSub) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IFilterMapper_RegisterFilter_Proxy( - IFilterMapper * This, - /* [in] */ CLSID clsid, - /* [in] */ LPCWSTR Name, - /* [in] */ DWORD dwMerit); - - -void __RPC_STUB IFilterMapper_RegisterFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterMapper_RegisterFilterInstance_Proxy( - IFilterMapper * This, - /* [in] */ CLSID clsid, - /* [in] */ LPCWSTR Name, - /* [out] */ CLSID *MRId); - - -void __RPC_STUB IFilterMapper_RegisterFilterInstance_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterMapper_RegisterPin_Proxy( - IFilterMapper * This, - /* [in] */ CLSID Filter, - /* [in] */ LPCWSTR Name, - /* [in] */ BOOL bRendered, - /* [in] */ BOOL bOutput, - /* [in] */ BOOL bZero, - /* [in] */ BOOL bMany, - /* [in] */ CLSID ConnectsToFilter, - /* [in] */ LPCWSTR ConnectsToPin); - - -void __RPC_STUB IFilterMapper_RegisterPin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterMapper_RegisterPinType_Proxy( - IFilterMapper * This, - /* [in] */ CLSID clsFilter, - /* [in] */ LPCWSTR strName, - /* [in] */ CLSID clsMajorType, - /* [in] */ CLSID clsSubType); - - -void __RPC_STUB IFilterMapper_RegisterPinType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterMapper_UnregisterFilter_Proxy( - IFilterMapper * This, - /* [in] */ CLSID Filter); - - -void __RPC_STUB IFilterMapper_UnregisterFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterMapper_UnregisterFilterInstance_Proxy( - IFilterMapper * This, - /* [in] */ CLSID MRId); - - -void __RPC_STUB IFilterMapper_UnregisterFilterInstance_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterMapper_UnregisterPin_Proxy( - IFilterMapper * This, - /* [in] */ CLSID Filter, - /* [in] */ LPCWSTR Name); - - -void __RPC_STUB IFilterMapper_UnregisterPin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterMapper_EnumMatchingFilters_Proxy( - IFilterMapper * This, - /* [out] */ IEnumRegFilters **ppEnum, - /* [in] */ DWORD dwMerit, - /* [in] */ BOOL bInputNeeded, - /* [in] */ CLSID clsInMaj, - /* [in] */ CLSID clsInSub, - /* [in] */ BOOL bRender, - /* [in] */ BOOL bOututNeeded, - /* [in] */ CLSID clsOutMaj, - /* [in] */ CLSID clsOutSub); - - -void __RPC_STUB IFilterMapper_EnumMatchingFilters_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IFilterMapper_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0133 */ -/* [local] */ - -typedef /* [public][public][public][public][public][public][public] */ struct __MIDL___MIDL_itf_strmif_0133_0001 - { - const CLSID *clsMajorType; - const CLSID *clsMinorType; - } REGPINTYPES; - -typedef /* [public][public][public] */ struct __MIDL___MIDL_itf_strmif_0133_0002 - { - LPWSTR strName; - BOOL bRendered; - BOOL bOutput; - BOOL bZero; - BOOL bMany; - const CLSID *clsConnectsToFilter; - const WCHAR *strConnectsToPin; - UINT nMediaTypes; - const REGPINTYPES *lpMediaType; - } REGFILTERPINS; - -typedef /* [public][public][public][public][public][public] */ struct __MIDL___MIDL_itf_strmif_0133_0003 - { - CLSID clsMedium; - DWORD dw1; - DWORD dw2; - } REGPINMEDIUM; - - -enum __MIDL___MIDL_itf_strmif_0133_0004 - { REG_PINFLAG_B_ZERO = 0x1, - REG_PINFLAG_B_RENDERER = 0x2, - REG_PINFLAG_B_MANY = 0x4, - REG_PINFLAG_B_OUTPUT = 0x8 - } ; -typedef /* [public][public][public] */ struct __MIDL___MIDL_itf_strmif_0133_0005 - { - DWORD dwFlags; - UINT cInstances; - UINT nMediaTypes; - /* [size_is] */ const REGPINTYPES *lpMediaType; - UINT nMediums; - /* [size_is] */ const REGPINMEDIUM *lpMedium; - const CLSID *clsPinCategory; - } REGFILTERPINS2; - -typedef /* [public][public] */ struct __MIDL___MIDL_itf_strmif_0133_0006 - { - DWORD dwVersion; - DWORD dwMerit; - /* [switch_type][switch_is] */ union - { - /* [case()] */ struct - { - ULONG cPins; - /* [size_is] */ const REGFILTERPINS *rgPins; - } ; - /* [case()] */ struct - { - ULONG cPins2; - /* [size_is] */ const REGFILTERPINS2 *rgPins2; - } ; - /* [default] */ /* Empty union arm */ - } ; - } REGFILTER2; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0133_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0133_v0_0_s_ifspec; - -#ifndef __IFilterMapper2_INTERFACE_DEFINED__ -#define __IFilterMapper2_INTERFACE_DEFINED__ - -/* interface IFilterMapper2 */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IFilterMapper2; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("b79bb0b0-33c1-11d1-abe1-00a0c905f375") - IFilterMapper2 : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE CreateCategory( - /* [in] */ REFCLSID clsidCategory, - /* [in] */ DWORD dwCategoryMerit, - /* [in] */ LPCWSTR Description) = 0; - - virtual HRESULT STDMETHODCALLTYPE UnregisterFilter( - /* [in] */ const CLSID *pclsidCategory, - /* [in] */ const OLECHAR *szInstance, - /* [in] */ REFCLSID Filter) = 0; - - virtual HRESULT STDMETHODCALLTYPE RegisterFilter( - /* [in] */ REFCLSID clsidFilter, - /* [in] */ LPCWSTR Name, - /* [out][in] */ IMoniker **ppMoniker, - /* [in] */ const CLSID *pclsidCategory, - /* [in] */ const OLECHAR *szInstance, - /* [in] */ const REGFILTER2 *prf2) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnumMatchingFilters( - /* [out] */ IEnumMoniker **ppEnum, - /* [in] */ DWORD dwFlags, - /* [in] */ BOOL bExactMatch, - /* [in] */ DWORD dwMerit, - /* [in] */ BOOL bInputNeeded, - /* [in] */ DWORD cInputTypes, - /* [size_is] */ const GUID *pInputTypes, - /* [in] */ const REGPINMEDIUM *pMedIn, - /* [in] */ const CLSID *pPinCategoryIn, - /* [in] */ BOOL bRender, - /* [in] */ BOOL bOutputNeeded, - /* [in] */ DWORD cOutputTypes, - /* [size_is] */ const GUID *pOutputTypes, - /* [in] */ const REGPINMEDIUM *pMedOut, - /* [in] */ const CLSID *pPinCategoryOut) = 0; - - }; - -#else /* C style interface */ - - typedef struct IFilterMapper2Vtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IFilterMapper2 * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IFilterMapper2 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IFilterMapper2 * This); - - HRESULT ( STDMETHODCALLTYPE *CreateCategory )( - IFilterMapper2 * This, - /* [in] */ REFCLSID clsidCategory, - /* [in] */ DWORD dwCategoryMerit, - /* [in] */ LPCWSTR Description); - - HRESULT ( STDMETHODCALLTYPE *UnregisterFilter )( - IFilterMapper2 * This, - /* [in] */ const CLSID *pclsidCategory, - /* [in] */ const OLECHAR *szInstance, - /* [in] */ REFCLSID Filter); - - HRESULT ( STDMETHODCALLTYPE *RegisterFilter )( - IFilterMapper2 * This, - /* [in] */ REFCLSID clsidFilter, - /* [in] */ LPCWSTR Name, - /* [out][in] */ IMoniker **ppMoniker, - /* [in] */ const CLSID *pclsidCategory, - /* [in] */ const OLECHAR *szInstance, - /* [in] */ const REGFILTER2 *prf2); - - HRESULT ( STDMETHODCALLTYPE *EnumMatchingFilters )( - IFilterMapper2 * This, - /* [out] */ IEnumMoniker **ppEnum, - /* [in] */ DWORD dwFlags, - /* [in] */ BOOL bExactMatch, - /* [in] */ DWORD dwMerit, - /* [in] */ BOOL bInputNeeded, - /* [in] */ DWORD cInputTypes, - /* [size_is] */ const GUID *pInputTypes, - /* [in] */ const REGPINMEDIUM *pMedIn, - /* [in] */ const CLSID *pPinCategoryIn, - /* [in] */ BOOL bRender, - /* [in] */ BOOL bOutputNeeded, - /* [in] */ DWORD cOutputTypes, - /* [size_is] */ const GUID *pOutputTypes, - /* [in] */ const REGPINMEDIUM *pMedOut, - /* [in] */ const CLSID *pPinCategoryOut); - - END_INTERFACE - } IFilterMapper2Vtbl; - - interface IFilterMapper2 - { - CONST_VTBL struct IFilterMapper2Vtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IFilterMapper2_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IFilterMapper2_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IFilterMapper2_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IFilterMapper2_CreateCategory(This,clsidCategory,dwCategoryMerit,Description) \ - (This)->lpVtbl -> CreateCategory(This,clsidCategory,dwCategoryMerit,Description) - -#define IFilterMapper2_UnregisterFilter(This,pclsidCategory,szInstance,Filter) \ - (This)->lpVtbl -> UnregisterFilter(This,pclsidCategory,szInstance,Filter) - -#define IFilterMapper2_RegisterFilter(This,clsidFilter,Name,ppMoniker,pclsidCategory,szInstance,prf2) \ - (This)->lpVtbl -> RegisterFilter(This,clsidFilter,Name,ppMoniker,pclsidCategory,szInstance,prf2) - -#define IFilterMapper2_EnumMatchingFilters(This,ppEnum,dwFlags,bExactMatch,dwMerit,bInputNeeded,cInputTypes,pInputTypes,pMedIn,pPinCategoryIn,bRender,bOutputNeeded,cOutputTypes,pOutputTypes,pMedOut,pPinCategoryOut) \ - (This)->lpVtbl -> EnumMatchingFilters(This,ppEnum,dwFlags,bExactMatch,dwMerit,bInputNeeded,cInputTypes,pInputTypes,pMedIn,pPinCategoryIn,bRender,bOutputNeeded,cOutputTypes,pOutputTypes,pMedOut,pPinCategoryOut) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IFilterMapper2_CreateCategory_Proxy( - IFilterMapper2 * This, - /* [in] */ REFCLSID clsidCategory, - /* [in] */ DWORD dwCategoryMerit, - /* [in] */ LPCWSTR Description); - - -void __RPC_STUB IFilterMapper2_CreateCategory_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterMapper2_UnregisterFilter_Proxy( - IFilterMapper2 * This, - /* [in] */ const CLSID *pclsidCategory, - /* [in] */ const OLECHAR *szInstance, - /* [in] */ REFCLSID Filter); - - -void __RPC_STUB IFilterMapper2_UnregisterFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterMapper2_RegisterFilter_Proxy( - IFilterMapper2 * This, - /* [in] */ REFCLSID clsidFilter, - /* [in] */ LPCWSTR Name, - /* [out][in] */ IMoniker **ppMoniker, - /* [in] */ const CLSID *pclsidCategory, - /* [in] */ const OLECHAR *szInstance, - /* [in] */ const REGFILTER2 *prf2); - - -void __RPC_STUB IFilterMapper2_RegisterFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterMapper2_EnumMatchingFilters_Proxy( - IFilterMapper2 * This, - /* [out] */ IEnumMoniker **ppEnum, - /* [in] */ DWORD dwFlags, - /* [in] */ BOOL bExactMatch, - /* [in] */ DWORD dwMerit, - /* [in] */ BOOL bInputNeeded, - /* [in] */ DWORD cInputTypes, - /* [size_is] */ const GUID *pInputTypes, - /* [in] */ const REGPINMEDIUM *pMedIn, - /* [in] */ const CLSID *pPinCategoryIn, - /* [in] */ BOOL bRender, - /* [in] */ BOOL bOutputNeeded, - /* [in] */ DWORD cOutputTypes, - /* [size_is] */ const GUID *pOutputTypes, - /* [in] */ const REGPINMEDIUM *pMedOut, - /* [in] */ const CLSID *pPinCategoryOut); - - -void __RPC_STUB IFilterMapper2_EnumMatchingFilters_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IFilterMapper2_INTERFACE_DEFINED__ */ - - -#ifndef __IFilterMapper3_INTERFACE_DEFINED__ -#define __IFilterMapper3_INTERFACE_DEFINED__ - -/* interface IFilterMapper3 */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IFilterMapper3; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("b79bb0b1-33c1-11d1-abe1-00a0c905f375") - IFilterMapper3 : public IFilterMapper2 - { - public: - virtual HRESULT STDMETHODCALLTYPE GetICreateDevEnum( - /* [out] */ ICreateDevEnum **ppEnum) = 0; - - }; - -#else /* C style interface */ - - typedef struct IFilterMapper3Vtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IFilterMapper3 * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IFilterMapper3 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IFilterMapper3 * This); - - HRESULT ( STDMETHODCALLTYPE *CreateCategory )( - IFilterMapper3 * This, - /* [in] */ REFCLSID clsidCategory, - /* [in] */ DWORD dwCategoryMerit, - /* [in] */ LPCWSTR Description); - - HRESULT ( STDMETHODCALLTYPE *UnregisterFilter )( - IFilterMapper3 * This, - /* [in] */ const CLSID *pclsidCategory, - /* [in] */ const OLECHAR *szInstance, - /* [in] */ REFCLSID Filter); - - HRESULT ( STDMETHODCALLTYPE *RegisterFilter )( - IFilterMapper3 * This, - /* [in] */ REFCLSID clsidFilter, - /* [in] */ LPCWSTR Name, - /* [out][in] */ IMoniker **ppMoniker, - /* [in] */ const CLSID *pclsidCategory, - /* [in] */ const OLECHAR *szInstance, - /* [in] */ const REGFILTER2 *prf2); - - HRESULT ( STDMETHODCALLTYPE *EnumMatchingFilters )( - IFilterMapper3 * This, - /* [out] */ IEnumMoniker **ppEnum, - /* [in] */ DWORD dwFlags, - /* [in] */ BOOL bExactMatch, - /* [in] */ DWORD dwMerit, - /* [in] */ BOOL bInputNeeded, - /* [in] */ DWORD cInputTypes, - /* [size_is] */ const GUID *pInputTypes, - /* [in] */ const REGPINMEDIUM *pMedIn, - /* [in] */ const CLSID *pPinCategoryIn, - /* [in] */ BOOL bRender, - /* [in] */ BOOL bOutputNeeded, - /* [in] */ DWORD cOutputTypes, - /* [size_is] */ const GUID *pOutputTypes, - /* [in] */ const REGPINMEDIUM *pMedOut, - /* [in] */ const CLSID *pPinCategoryOut); - - HRESULT ( STDMETHODCALLTYPE *GetICreateDevEnum )( - IFilterMapper3 * This, - /* [out] */ ICreateDevEnum **ppEnum); - - END_INTERFACE - } IFilterMapper3Vtbl; - - interface IFilterMapper3 - { - CONST_VTBL struct IFilterMapper3Vtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IFilterMapper3_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IFilterMapper3_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IFilterMapper3_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IFilterMapper3_CreateCategory(This,clsidCategory,dwCategoryMerit,Description) \ - (This)->lpVtbl -> CreateCategory(This,clsidCategory,dwCategoryMerit,Description) - -#define IFilterMapper3_UnregisterFilter(This,pclsidCategory,szInstance,Filter) \ - (This)->lpVtbl -> UnregisterFilter(This,pclsidCategory,szInstance,Filter) - -#define IFilterMapper3_RegisterFilter(This,clsidFilter,Name,ppMoniker,pclsidCategory,szInstance,prf2) \ - (This)->lpVtbl -> RegisterFilter(This,clsidFilter,Name,ppMoniker,pclsidCategory,szInstance,prf2) - -#define IFilterMapper3_EnumMatchingFilters(This,ppEnum,dwFlags,bExactMatch,dwMerit,bInputNeeded,cInputTypes,pInputTypes,pMedIn,pPinCategoryIn,bRender,bOutputNeeded,cOutputTypes,pOutputTypes,pMedOut,pPinCategoryOut) \ - (This)->lpVtbl -> EnumMatchingFilters(This,ppEnum,dwFlags,bExactMatch,dwMerit,bInputNeeded,cInputTypes,pInputTypes,pMedIn,pPinCategoryIn,bRender,bOutputNeeded,cOutputTypes,pOutputTypes,pMedOut,pPinCategoryOut) - - -#define IFilterMapper3_GetICreateDevEnum(This,ppEnum) \ - (This)->lpVtbl -> GetICreateDevEnum(This,ppEnum) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IFilterMapper3_GetICreateDevEnum_Proxy( - IFilterMapper3 * This, - /* [out] */ ICreateDevEnum **ppEnum); - - -void __RPC_STUB IFilterMapper3_GetICreateDevEnum_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IFilterMapper3_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0136 */ -/* [local] */ - -typedef -enum tagQualityMessageType - { Famine = 0, - Flood = Famine + 1 - } QualityMessageType; - -typedef struct tagQuality - { - QualityMessageType Type; - long Proportion; - REFERENCE_TIME Late; - REFERENCE_TIME TimeStamp; - } Quality; - -typedef IQualityControl *PQUALITYCONTROL; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0136_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0136_v0_0_s_ifspec; - -#ifndef __IQualityControl_INTERFACE_DEFINED__ -#define __IQualityControl_INTERFACE_DEFINED__ - -/* interface IQualityControl */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IQualityControl; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868a5-0ad4-11ce-b03a-0020af0ba770") - IQualityControl : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Notify( - /* [in] */ IBaseFilter *pSelf, - /* [in] */ Quality q) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetSink( - /* [in] */ IQualityControl *piqc) = 0; - - }; - -#else /* C style interface */ - - typedef struct IQualityControlVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IQualityControl * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IQualityControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IQualityControl * This); - - HRESULT ( STDMETHODCALLTYPE *Notify )( - IQualityControl * This, - /* [in] */ IBaseFilter *pSelf, - /* [in] */ Quality q); - - HRESULT ( STDMETHODCALLTYPE *SetSink )( - IQualityControl * This, - /* [in] */ IQualityControl *piqc); - - END_INTERFACE - } IQualityControlVtbl; - - interface IQualityControl - { - CONST_VTBL struct IQualityControlVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IQualityControl_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IQualityControl_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IQualityControl_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IQualityControl_Notify(This,pSelf,q) \ - (This)->lpVtbl -> Notify(This,pSelf,q) - -#define IQualityControl_SetSink(This,piqc) \ - (This)->lpVtbl -> SetSink(This,piqc) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IQualityControl_Notify_Proxy( - IQualityControl * This, - /* [in] */ IBaseFilter *pSelf, - /* [in] */ Quality q); - - -void __RPC_STUB IQualityControl_Notify_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IQualityControl_SetSink_Proxy( - IQualityControl * This, - /* [in] */ IQualityControl *piqc); - - -void __RPC_STUB IQualityControl_SetSink_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IQualityControl_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0137 */ -/* [local] */ - - -enum __MIDL___MIDL_itf_strmif_0137_0001 - { CK_NOCOLORKEY = 0, - CK_INDEX = 0x1, - CK_RGB = 0x2 - } ; -typedef struct tagCOLORKEY - { - DWORD KeyType; - DWORD PaletteIndex; - COLORREF LowColorValue; - COLORREF HighColorValue; - } COLORKEY; - - -enum __MIDL___MIDL_itf_strmif_0137_0002 - { ADVISE_NONE = 0, - ADVISE_CLIPPING = 0x1, - ADVISE_PALETTE = 0x2, - ADVISE_COLORKEY = 0x4, - ADVISE_POSITION = 0x8, - ADVISE_DISPLAY_CHANGE = 0x10 - } ; -#define ADVISE_ALL ( ADVISE_CLIPPING | ADVISE_PALETTE | ADVISE_COLORKEY | ADVISE_POSITION ) - -#define ADVISE_ALL2 ( ADVISE_ALL | ADVISE_DISPLAY_CHANGE ) - -#ifndef _WINGDI_ -typedef struct _RGNDATAHEADER - { - DWORD dwSize; - DWORD iType; - DWORD nCount; - DWORD nRgnSize; - RECT rcBound; - } RGNDATAHEADER; - -typedef struct _RGNDATA - { - RGNDATAHEADER rdh; - char Buffer[ 1 ]; - } RGNDATA; - -#endif - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0137_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0137_v0_0_s_ifspec; - -#ifndef __IOverlayNotify_INTERFACE_DEFINED__ -#define __IOverlayNotify_INTERFACE_DEFINED__ - -/* interface IOverlayNotify */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IOverlayNotify; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868a0-0ad4-11ce-b03a-0020af0ba770") - IOverlayNotify : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE OnPaletteChange( - /* [in] */ DWORD dwColors, - /* [in] */ const PALETTEENTRY *pPalette) = 0; - - virtual HRESULT STDMETHODCALLTYPE OnClipChange( - /* [in] */ const RECT *pSourceRect, - /* [in] */ const RECT *pDestinationRect, - /* [in] */ const RGNDATA *pRgnData) = 0; - - virtual HRESULT STDMETHODCALLTYPE OnColorKeyChange( - /* [in] */ const COLORKEY *pColorKey) = 0; - - virtual HRESULT STDMETHODCALLTYPE OnPositionChange( - /* [in] */ const RECT *pSourceRect, - /* [in] */ const RECT *pDestinationRect) = 0; - - }; - -#else /* C style interface */ - - typedef struct IOverlayNotifyVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IOverlayNotify * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IOverlayNotify * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IOverlayNotify * This); - - HRESULT ( STDMETHODCALLTYPE *OnPaletteChange )( - IOverlayNotify * This, - /* [in] */ DWORD dwColors, - /* [in] */ const PALETTEENTRY *pPalette); - - HRESULT ( STDMETHODCALLTYPE *OnClipChange )( - IOverlayNotify * This, - /* [in] */ const RECT *pSourceRect, - /* [in] */ const RECT *pDestinationRect, - /* [in] */ const RGNDATA *pRgnData); - - HRESULT ( STDMETHODCALLTYPE *OnColorKeyChange )( - IOverlayNotify * This, - /* [in] */ const COLORKEY *pColorKey); - - HRESULT ( STDMETHODCALLTYPE *OnPositionChange )( - IOverlayNotify * This, - /* [in] */ const RECT *pSourceRect, - /* [in] */ const RECT *pDestinationRect); - - END_INTERFACE - } IOverlayNotifyVtbl; - - interface IOverlayNotify - { - CONST_VTBL struct IOverlayNotifyVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IOverlayNotify_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IOverlayNotify_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IOverlayNotify_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IOverlayNotify_OnPaletteChange(This,dwColors,pPalette) \ - (This)->lpVtbl -> OnPaletteChange(This,dwColors,pPalette) - -#define IOverlayNotify_OnClipChange(This,pSourceRect,pDestinationRect,pRgnData) \ - (This)->lpVtbl -> OnClipChange(This,pSourceRect,pDestinationRect,pRgnData) - -#define IOverlayNotify_OnColorKeyChange(This,pColorKey) \ - (This)->lpVtbl -> OnColorKeyChange(This,pColorKey) - -#define IOverlayNotify_OnPositionChange(This,pSourceRect,pDestinationRect) \ - (This)->lpVtbl -> OnPositionChange(This,pSourceRect,pDestinationRect) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IOverlayNotify_OnPaletteChange_Proxy( - IOverlayNotify * This, - /* [in] */ DWORD dwColors, - /* [in] */ const PALETTEENTRY *pPalette); - - -void __RPC_STUB IOverlayNotify_OnPaletteChange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IOverlayNotify_OnClipChange_Proxy( - IOverlayNotify * This, - /* [in] */ const RECT *pSourceRect, - /* [in] */ const RECT *pDestinationRect, - /* [in] */ const RGNDATA *pRgnData); - - -void __RPC_STUB IOverlayNotify_OnClipChange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IOverlayNotify_OnColorKeyChange_Proxy( - IOverlayNotify * This, - /* [in] */ const COLORKEY *pColorKey); - - -void __RPC_STUB IOverlayNotify_OnColorKeyChange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IOverlayNotify_OnPositionChange_Proxy( - IOverlayNotify * This, - /* [in] */ const RECT *pSourceRect, - /* [in] */ const RECT *pDestinationRect); - - -void __RPC_STUB IOverlayNotify_OnPositionChange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IOverlayNotify_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0138 */ -/* [local] */ - -typedef IOverlayNotify *POVERLAYNOTIFY; - -#if !defined(HMONITOR_DECLARED) && !defined(HMONITOR) && (WINVER < 0x0500) -#define HMONITOR_DECLARED -#if 0 -typedef HANDLE HMONITOR; - -#endif -DECLARE_HANDLE(HMONITOR); -#endif - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0138_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0138_v0_0_s_ifspec; - -#ifndef __IOverlayNotify2_INTERFACE_DEFINED__ -#define __IOverlayNotify2_INTERFACE_DEFINED__ - -/* interface IOverlayNotify2 */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IOverlayNotify2; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("680EFA10-D535-11D1-87C8-00A0C9223196") - IOverlayNotify2 : public IOverlayNotify - { - public: - virtual HRESULT STDMETHODCALLTYPE OnDisplayChange( - HMONITOR hMonitor) = 0; - - }; - -#else /* C style interface */ - - typedef struct IOverlayNotify2Vtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IOverlayNotify2 * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IOverlayNotify2 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IOverlayNotify2 * This); - - HRESULT ( STDMETHODCALLTYPE *OnPaletteChange )( - IOverlayNotify2 * This, - /* [in] */ DWORD dwColors, - /* [in] */ const PALETTEENTRY *pPalette); - - HRESULT ( STDMETHODCALLTYPE *OnClipChange )( - IOverlayNotify2 * This, - /* [in] */ const RECT *pSourceRect, - /* [in] */ const RECT *pDestinationRect, - /* [in] */ const RGNDATA *pRgnData); - - HRESULT ( STDMETHODCALLTYPE *OnColorKeyChange )( - IOverlayNotify2 * This, - /* [in] */ const COLORKEY *pColorKey); - - HRESULT ( STDMETHODCALLTYPE *OnPositionChange )( - IOverlayNotify2 * This, - /* [in] */ const RECT *pSourceRect, - /* [in] */ const RECT *pDestinationRect); - - HRESULT ( STDMETHODCALLTYPE *OnDisplayChange )( - IOverlayNotify2 * This, - HMONITOR hMonitor); - - END_INTERFACE - } IOverlayNotify2Vtbl; - - interface IOverlayNotify2 - { - CONST_VTBL struct IOverlayNotify2Vtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IOverlayNotify2_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IOverlayNotify2_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IOverlayNotify2_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IOverlayNotify2_OnPaletteChange(This,dwColors,pPalette) \ - (This)->lpVtbl -> OnPaletteChange(This,dwColors,pPalette) - -#define IOverlayNotify2_OnClipChange(This,pSourceRect,pDestinationRect,pRgnData) \ - (This)->lpVtbl -> OnClipChange(This,pSourceRect,pDestinationRect,pRgnData) - -#define IOverlayNotify2_OnColorKeyChange(This,pColorKey) \ - (This)->lpVtbl -> OnColorKeyChange(This,pColorKey) - -#define IOverlayNotify2_OnPositionChange(This,pSourceRect,pDestinationRect) \ - (This)->lpVtbl -> OnPositionChange(This,pSourceRect,pDestinationRect) - - -#define IOverlayNotify2_OnDisplayChange(This,hMonitor) \ - (This)->lpVtbl -> OnDisplayChange(This,hMonitor) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IOverlayNotify2_OnDisplayChange_Proxy( - IOverlayNotify2 * This, - HMONITOR hMonitor); - - -void __RPC_STUB IOverlayNotify2_OnDisplayChange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IOverlayNotify2_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0139 */ -/* [local] */ - -typedef IOverlayNotify2 *POVERLAYNOTIFY2; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0139_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0139_v0_0_s_ifspec; - -#ifndef __IOverlay_INTERFACE_DEFINED__ -#define __IOverlay_INTERFACE_DEFINED__ - -/* interface IOverlay */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IOverlay; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868a1-0ad4-11ce-b03a-0020af0ba770") - IOverlay : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetPalette( - /* [out] */ DWORD *pdwColors, - /* [out] */ PALETTEENTRY **ppPalette) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetPalette( - /* [in] */ DWORD dwColors, - /* [in] */ PALETTEENTRY *pPalette) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDefaultColorKey( - /* [out] */ COLORKEY *pColorKey) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetColorKey( - /* [out] */ COLORKEY *pColorKey) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetColorKey( - /* [out][in] */ COLORKEY *pColorKey) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetWindowHandle( - /* [out] */ HWND *pHwnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetClipList( - /* [out] */ RECT *pSourceRect, - /* [out] */ RECT *pDestinationRect, - /* [out] */ RGNDATA **ppRgnData) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetVideoPosition( - /* [out] */ RECT *pSourceRect, - /* [out] */ RECT *pDestinationRect) = 0; - - virtual HRESULT STDMETHODCALLTYPE Advise( - /* [in] */ IOverlayNotify *pOverlayNotify, - /* [in] */ DWORD dwInterests) = 0; - - virtual HRESULT STDMETHODCALLTYPE Unadvise( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IOverlayVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IOverlay * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IOverlay * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IOverlay * This); - - HRESULT ( STDMETHODCALLTYPE *GetPalette )( - IOverlay * This, - /* [out] */ DWORD *pdwColors, - /* [out] */ PALETTEENTRY **ppPalette); - - HRESULT ( STDMETHODCALLTYPE *SetPalette )( - IOverlay * This, - /* [in] */ DWORD dwColors, - /* [in] */ PALETTEENTRY *pPalette); - - HRESULT ( STDMETHODCALLTYPE *GetDefaultColorKey )( - IOverlay * This, - /* [out] */ COLORKEY *pColorKey); - - HRESULT ( STDMETHODCALLTYPE *GetColorKey )( - IOverlay * This, - /* [out] */ COLORKEY *pColorKey); - - HRESULT ( STDMETHODCALLTYPE *SetColorKey )( - IOverlay * This, - /* [out][in] */ COLORKEY *pColorKey); - - HRESULT ( STDMETHODCALLTYPE *GetWindowHandle )( - IOverlay * This, - /* [out] */ HWND *pHwnd); - - HRESULT ( STDMETHODCALLTYPE *GetClipList )( - IOverlay * This, - /* [out] */ RECT *pSourceRect, - /* [out] */ RECT *pDestinationRect, - /* [out] */ RGNDATA **ppRgnData); - - HRESULT ( STDMETHODCALLTYPE *GetVideoPosition )( - IOverlay * This, - /* [out] */ RECT *pSourceRect, - /* [out] */ RECT *pDestinationRect); - - HRESULT ( STDMETHODCALLTYPE *Advise )( - IOverlay * This, - /* [in] */ IOverlayNotify *pOverlayNotify, - /* [in] */ DWORD dwInterests); - - HRESULT ( STDMETHODCALLTYPE *Unadvise )( - IOverlay * This); - - END_INTERFACE - } IOverlayVtbl; - - interface IOverlay - { - CONST_VTBL struct IOverlayVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IOverlay_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IOverlay_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IOverlay_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IOverlay_GetPalette(This,pdwColors,ppPalette) \ - (This)->lpVtbl -> GetPalette(This,pdwColors,ppPalette) - -#define IOverlay_SetPalette(This,dwColors,pPalette) \ - (This)->lpVtbl -> SetPalette(This,dwColors,pPalette) - -#define IOverlay_GetDefaultColorKey(This,pColorKey) \ - (This)->lpVtbl -> GetDefaultColorKey(This,pColorKey) - -#define IOverlay_GetColorKey(This,pColorKey) \ - (This)->lpVtbl -> GetColorKey(This,pColorKey) - -#define IOverlay_SetColorKey(This,pColorKey) \ - (This)->lpVtbl -> SetColorKey(This,pColorKey) - -#define IOverlay_GetWindowHandle(This,pHwnd) \ - (This)->lpVtbl -> GetWindowHandle(This,pHwnd) - -#define IOverlay_GetClipList(This,pSourceRect,pDestinationRect,ppRgnData) \ - (This)->lpVtbl -> GetClipList(This,pSourceRect,pDestinationRect,ppRgnData) - -#define IOverlay_GetVideoPosition(This,pSourceRect,pDestinationRect) \ - (This)->lpVtbl -> GetVideoPosition(This,pSourceRect,pDestinationRect) - -#define IOverlay_Advise(This,pOverlayNotify,dwInterests) \ - (This)->lpVtbl -> Advise(This,pOverlayNotify,dwInterests) - -#define IOverlay_Unadvise(This) \ - (This)->lpVtbl -> Unadvise(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IOverlay_GetPalette_Proxy( - IOverlay * This, - /* [out] */ DWORD *pdwColors, - /* [out] */ PALETTEENTRY **ppPalette); - - -void __RPC_STUB IOverlay_GetPalette_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IOverlay_SetPalette_Proxy( - IOverlay * This, - /* [in] */ DWORD dwColors, - /* [in] */ PALETTEENTRY *pPalette); - - -void __RPC_STUB IOverlay_SetPalette_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IOverlay_GetDefaultColorKey_Proxy( - IOverlay * This, - /* [out] */ COLORKEY *pColorKey); - - -void __RPC_STUB IOverlay_GetDefaultColorKey_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IOverlay_GetColorKey_Proxy( - IOverlay * This, - /* [out] */ COLORKEY *pColorKey); - - -void __RPC_STUB IOverlay_GetColorKey_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IOverlay_SetColorKey_Proxy( - IOverlay * This, - /* [out][in] */ COLORKEY *pColorKey); - - -void __RPC_STUB IOverlay_SetColorKey_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IOverlay_GetWindowHandle_Proxy( - IOverlay * This, - /* [out] */ HWND *pHwnd); - - -void __RPC_STUB IOverlay_GetWindowHandle_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IOverlay_GetClipList_Proxy( - IOverlay * This, - /* [out] */ RECT *pSourceRect, - /* [out] */ RECT *pDestinationRect, - /* [out] */ RGNDATA **ppRgnData); - - -void __RPC_STUB IOverlay_GetClipList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IOverlay_GetVideoPosition_Proxy( - IOverlay * This, - /* [out] */ RECT *pSourceRect, - /* [out] */ RECT *pDestinationRect); - - -void __RPC_STUB IOverlay_GetVideoPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IOverlay_Advise_Proxy( - IOverlay * This, - /* [in] */ IOverlayNotify *pOverlayNotify, - /* [in] */ DWORD dwInterests); - - -void __RPC_STUB IOverlay_Advise_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IOverlay_Unadvise_Proxy( - IOverlay * This); - - -void __RPC_STUB IOverlay_Unadvise_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IOverlay_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0140 */ -/* [local] */ - -typedef IOverlay *POVERLAY; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0140_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0140_v0_0_s_ifspec; - -#ifndef __IMediaEventSink_INTERFACE_DEFINED__ -#define __IMediaEventSink_INTERFACE_DEFINED__ - -/* interface IMediaEventSink */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IMediaEventSink; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868a2-0ad4-11ce-b03a-0020af0ba770") - IMediaEventSink : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Notify( - /* [in] */ long EventCode, - /* [in] */ LONG_PTR EventParam1, - /* [in] */ LONG_PTR EventParam2) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaEventSinkVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaEventSink * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaEventSink * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaEventSink * This); - - HRESULT ( STDMETHODCALLTYPE *Notify )( - IMediaEventSink * This, - /* [in] */ long EventCode, - /* [in] */ LONG_PTR EventParam1, - /* [in] */ LONG_PTR EventParam2); - - END_INTERFACE - } IMediaEventSinkVtbl; - - interface IMediaEventSink - { - CONST_VTBL struct IMediaEventSinkVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaEventSink_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaEventSink_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaEventSink_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaEventSink_Notify(This,EventCode,EventParam1,EventParam2) \ - (This)->lpVtbl -> Notify(This,EventCode,EventParam1,EventParam2) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaEventSink_Notify_Proxy( - IMediaEventSink * This, - /* [in] */ long EventCode, - /* [in] */ LONG_PTR EventParam1, - /* [in] */ LONG_PTR EventParam2); - - -void __RPC_STUB IMediaEventSink_Notify_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaEventSink_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0141 */ -/* [local] */ - -typedef IMediaEventSink *PMEDIAEVENTSINK; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0141_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0141_v0_0_s_ifspec; - -#ifndef __IFileSourceFilter_INTERFACE_DEFINED__ -#define __IFileSourceFilter_INTERFACE_DEFINED__ - -/* interface IFileSourceFilter */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IFileSourceFilter; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868a6-0ad4-11ce-b03a-0020af0ba770") - IFileSourceFilter : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Load( - /* [in] */ LPCOLESTR pszFileName, - /* [unique][in] */ const AM_MEDIA_TYPE *pmt) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurFile( - /* [out] */ LPOLESTR *ppszFileName, - /* [out] */ AM_MEDIA_TYPE *pmt) = 0; - - }; - -#else /* C style interface */ - - typedef struct IFileSourceFilterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IFileSourceFilter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IFileSourceFilter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IFileSourceFilter * This); - - HRESULT ( STDMETHODCALLTYPE *Load )( - IFileSourceFilter * This, - /* [in] */ LPCOLESTR pszFileName, - /* [unique][in] */ const AM_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *GetCurFile )( - IFileSourceFilter * This, - /* [out] */ LPOLESTR *ppszFileName, - /* [out] */ AM_MEDIA_TYPE *pmt); - - END_INTERFACE - } IFileSourceFilterVtbl; - - interface IFileSourceFilter - { - CONST_VTBL struct IFileSourceFilterVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IFileSourceFilter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IFileSourceFilter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IFileSourceFilter_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IFileSourceFilter_Load(This,pszFileName,pmt) \ - (This)->lpVtbl -> Load(This,pszFileName,pmt) - -#define IFileSourceFilter_GetCurFile(This,ppszFileName,pmt) \ - (This)->lpVtbl -> GetCurFile(This,ppszFileName,pmt) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IFileSourceFilter_Load_Proxy( - IFileSourceFilter * This, - /* [in] */ LPCOLESTR pszFileName, - /* [unique][in] */ const AM_MEDIA_TYPE *pmt); - - -void __RPC_STUB IFileSourceFilter_Load_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFileSourceFilter_GetCurFile_Proxy( - IFileSourceFilter * This, - /* [out] */ LPOLESTR *ppszFileName, - /* [out] */ AM_MEDIA_TYPE *pmt); - - -void __RPC_STUB IFileSourceFilter_GetCurFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IFileSourceFilter_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0142 */ -/* [local] */ - -typedef IFileSourceFilter *PFILTERFILESOURCE; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0142_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0142_v0_0_s_ifspec; - -#ifndef __IFileSinkFilter_INTERFACE_DEFINED__ -#define __IFileSinkFilter_INTERFACE_DEFINED__ - -/* interface IFileSinkFilter */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IFileSinkFilter; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("a2104830-7c70-11cf-8bce-00aa00a3f1a6") - IFileSinkFilter : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetFileName( - /* [in] */ LPCOLESTR pszFileName, - /* [unique][in] */ const AM_MEDIA_TYPE *pmt) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurFile( - /* [out] */ LPOLESTR *ppszFileName, - /* [out] */ AM_MEDIA_TYPE *pmt) = 0; - - }; - -#else /* C style interface */ - - typedef struct IFileSinkFilterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IFileSinkFilter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IFileSinkFilter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IFileSinkFilter * This); - - HRESULT ( STDMETHODCALLTYPE *SetFileName )( - IFileSinkFilter * This, - /* [in] */ LPCOLESTR pszFileName, - /* [unique][in] */ const AM_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *GetCurFile )( - IFileSinkFilter * This, - /* [out] */ LPOLESTR *ppszFileName, - /* [out] */ AM_MEDIA_TYPE *pmt); - - END_INTERFACE - } IFileSinkFilterVtbl; - - interface IFileSinkFilter - { - CONST_VTBL struct IFileSinkFilterVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IFileSinkFilter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IFileSinkFilter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IFileSinkFilter_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IFileSinkFilter_SetFileName(This,pszFileName,pmt) \ - (This)->lpVtbl -> SetFileName(This,pszFileName,pmt) - -#define IFileSinkFilter_GetCurFile(This,ppszFileName,pmt) \ - (This)->lpVtbl -> GetCurFile(This,ppszFileName,pmt) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IFileSinkFilter_SetFileName_Proxy( - IFileSinkFilter * This, - /* [in] */ LPCOLESTR pszFileName, - /* [unique][in] */ const AM_MEDIA_TYPE *pmt); - - -void __RPC_STUB IFileSinkFilter_SetFileName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFileSinkFilter_GetCurFile_Proxy( - IFileSinkFilter * This, - /* [out] */ LPOLESTR *ppszFileName, - /* [out] */ AM_MEDIA_TYPE *pmt); - - -void __RPC_STUB IFileSinkFilter_GetCurFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IFileSinkFilter_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0143 */ -/* [local] */ - -typedef IFileSinkFilter *PFILTERFILESINK; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0143_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0143_v0_0_s_ifspec; - -#ifndef __IFileSinkFilter2_INTERFACE_DEFINED__ -#define __IFileSinkFilter2_INTERFACE_DEFINED__ - -/* interface IFileSinkFilter2 */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IFileSinkFilter2; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("00855B90-CE1B-11d0-BD4F-00A0C911CE86") - IFileSinkFilter2 : public IFileSinkFilter - { - public: - virtual HRESULT STDMETHODCALLTYPE SetMode( - /* [in] */ DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMode( - /* [out] */ DWORD *pdwFlags) = 0; - - }; - -#else /* C style interface */ - - typedef struct IFileSinkFilter2Vtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IFileSinkFilter2 * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IFileSinkFilter2 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IFileSinkFilter2 * This); - - HRESULT ( STDMETHODCALLTYPE *SetFileName )( - IFileSinkFilter2 * This, - /* [in] */ LPCOLESTR pszFileName, - /* [unique][in] */ const AM_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *GetCurFile )( - IFileSinkFilter2 * This, - /* [out] */ LPOLESTR *ppszFileName, - /* [out] */ AM_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *SetMode )( - IFileSinkFilter2 * This, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *GetMode )( - IFileSinkFilter2 * This, - /* [out] */ DWORD *pdwFlags); - - END_INTERFACE - } IFileSinkFilter2Vtbl; - - interface IFileSinkFilter2 - { - CONST_VTBL struct IFileSinkFilter2Vtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IFileSinkFilter2_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IFileSinkFilter2_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IFileSinkFilter2_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IFileSinkFilter2_SetFileName(This,pszFileName,pmt) \ - (This)->lpVtbl -> SetFileName(This,pszFileName,pmt) - -#define IFileSinkFilter2_GetCurFile(This,ppszFileName,pmt) \ - (This)->lpVtbl -> GetCurFile(This,ppszFileName,pmt) - - -#define IFileSinkFilter2_SetMode(This,dwFlags) \ - (This)->lpVtbl -> SetMode(This,dwFlags) - -#define IFileSinkFilter2_GetMode(This,pdwFlags) \ - (This)->lpVtbl -> GetMode(This,pdwFlags) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IFileSinkFilter2_SetMode_Proxy( - IFileSinkFilter2 * This, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IFileSinkFilter2_SetMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFileSinkFilter2_GetMode_Proxy( - IFileSinkFilter2 * This, - /* [out] */ DWORD *pdwFlags); - - -void __RPC_STUB IFileSinkFilter2_GetMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IFileSinkFilter2_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0144 */ -/* [local] */ - -typedef IFileSinkFilter2 *PFILESINKFILTER2; - -typedef /* [public] */ -enum __MIDL___MIDL_itf_strmif_0144_0001 - { AM_FILE_OVERWRITE = 0x1 - } AM_FILESINK_FLAGS; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0144_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0144_v0_0_s_ifspec; - -#ifndef __IGraphBuilder_INTERFACE_DEFINED__ -#define __IGraphBuilder_INTERFACE_DEFINED__ - -/* interface IGraphBuilder */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IGraphBuilder; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868a9-0ad4-11ce-b03a-0020af0ba770") - IGraphBuilder : public IFilterGraph - { - public: - virtual HRESULT STDMETHODCALLTYPE Connect( - /* [in] */ IPin *ppinOut, - /* [in] */ IPin *ppinIn) = 0; - - virtual HRESULT STDMETHODCALLTYPE Render( - /* [in] */ IPin *ppinOut) = 0; - - virtual HRESULT STDMETHODCALLTYPE RenderFile( - /* [in] */ LPCWSTR lpcwstrFile, - /* [unique][in] */ LPCWSTR lpcwstrPlayList) = 0; - - virtual HRESULT STDMETHODCALLTYPE AddSourceFilter( - /* [in] */ LPCWSTR lpcwstrFileName, - /* [unique][in] */ LPCWSTR lpcwstrFilterName, - /* [out] */ IBaseFilter **ppFilter) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetLogFile( - /* [in] */ DWORD_PTR hFile) = 0; - - virtual HRESULT STDMETHODCALLTYPE Abort( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE ShouldOperationContinue( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IGraphBuilderVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IGraphBuilder * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IGraphBuilder * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IGraphBuilder * This); - - HRESULT ( STDMETHODCALLTYPE *AddFilter )( - IGraphBuilder * This, - /* [in] */ IBaseFilter *pFilter, - /* [string][in] */ LPCWSTR pName); - - HRESULT ( STDMETHODCALLTYPE *RemoveFilter )( - IGraphBuilder * This, - /* [in] */ IBaseFilter *pFilter); - - HRESULT ( STDMETHODCALLTYPE *EnumFilters )( - IGraphBuilder * This, - /* [out] */ IEnumFilters **ppEnum); - - HRESULT ( STDMETHODCALLTYPE *FindFilterByName )( - IGraphBuilder * This, - /* [string][in] */ LPCWSTR pName, - /* [out] */ IBaseFilter **ppFilter); - - HRESULT ( STDMETHODCALLTYPE *ConnectDirect )( - IGraphBuilder * This, - /* [in] */ IPin *ppinOut, - /* [in] */ IPin *ppinIn, - /* [unique][in] */ const AM_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *Reconnect )( - IGraphBuilder * This, - /* [in] */ IPin *ppin); - - HRESULT ( STDMETHODCALLTYPE *Disconnect )( - IGraphBuilder * This, - /* [in] */ IPin *ppin); - - HRESULT ( STDMETHODCALLTYPE *SetDefaultSyncSource )( - IGraphBuilder * This); - - HRESULT ( STDMETHODCALLTYPE *Connect )( - IGraphBuilder * This, - /* [in] */ IPin *ppinOut, - /* [in] */ IPin *ppinIn); - - HRESULT ( STDMETHODCALLTYPE *Render )( - IGraphBuilder * This, - /* [in] */ IPin *ppinOut); - - HRESULT ( STDMETHODCALLTYPE *RenderFile )( - IGraphBuilder * This, - /* [in] */ LPCWSTR lpcwstrFile, - /* [unique][in] */ LPCWSTR lpcwstrPlayList); - - HRESULT ( STDMETHODCALLTYPE *AddSourceFilter )( - IGraphBuilder * This, - /* [in] */ LPCWSTR lpcwstrFileName, - /* [unique][in] */ LPCWSTR lpcwstrFilterName, - /* [out] */ IBaseFilter **ppFilter); - - HRESULT ( STDMETHODCALLTYPE *SetLogFile )( - IGraphBuilder * This, - /* [in] */ DWORD_PTR hFile); - - HRESULT ( STDMETHODCALLTYPE *Abort )( - IGraphBuilder * This); - - HRESULT ( STDMETHODCALLTYPE *ShouldOperationContinue )( - IGraphBuilder * This); - - END_INTERFACE - } IGraphBuilderVtbl; - - interface IGraphBuilder - { - CONST_VTBL struct IGraphBuilderVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IGraphBuilder_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IGraphBuilder_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IGraphBuilder_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IGraphBuilder_AddFilter(This,pFilter,pName) \ - (This)->lpVtbl -> AddFilter(This,pFilter,pName) - -#define IGraphBuilder_RemoveFilter(This,pFilter) \ - (This)->lpVtbl -> RemoveFilter(This,pFilter) - -#define IGraphBuilder_EnumFilters(This,ppEnum) \ - (This)->lpVtbl -> EnumFilters(This,ppEnum) - -#define IGraphBuilder_FindFilterByName(This,pName,ppFilter) \ - (This)->lpVtbl -> FindFilterByName(This,pName,ppFilter) - -#define IGraphBuilder_ConnectDirect(This,ppinOut,ppinIn,pmt) \ - (This)->lpVtbl -> ConnectDirect(This,ppinOut,ppinIn,pmt) - -#define IGraphBuilder_Reconnect(This,ppin) \ - (This)->lpVtbl -> Reconnect(This,ppin) - -#define IGraphBuilder_Disconnect(This,ppin) \ - (This)->lpVtbl -> Disconnect(This,ppin) - -#define IGraphBuilder_SetDefaultSyncSource(This) \ - (This)->lpVtbl -> SetDefaultSyncSource(This) - - -#define IGraphBuilder_Connect(This,ppinOut,ppinIn) \ - (This)->lpVtbl -> Connect(This,ppinOut,ppinIn) - -#define IGraphBuilder_Render(This,ppinOut) \ - (This)->lpVtbl -> Render(This,ppinOut) - -#define IGraphBuilder_RenderFile(This,lpcwstrFile,lpcwstrPlayList) \ - (This)->lpVtbl -> RenderFile(This,lpcwstrFile,lpcwstrPlayList) - -#define IGraphBuilder_AddSourceFilter(This,lpcwstrFileName,lpcwstrFilterName,ppFilter) \ - (This)->lpVtbl -> AddSourceFilter(This,lpcwstrFileName,lpcwstrFilterName,ppFilter) - -#define IGraphBuilder_SetLogFile(This,hFile) \ - (This)->lpVtbl -> SetLogFile(This,hFile) - -#define IGraphBuilder_Abort(This) \ - (This)->lpVtbl -> Abort(This) - -#define IGraphBuilder_ShouldOperationContinue(This) \ - (This)->lpVtbl -> ShouldOperationContinue(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IGraphBuilder_Connect_Proxy( - IGraphBuilder * This, - /* [in] */ IPin *ppinOut, - /* [in] */ IPin *ppinIn); - - -void __RPC_STUB IGraphBuilder_Connect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IGraphBuilder_Render_Proxy( - IGraphBuilder * This, - /* [in] */ IPin *ppinOut); - - -void __RPC_STUB IGraphBuilder_Render_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IGraphBuilder_RenderFile_Proxy( - IGraphBuilder * This, - /* [in] */ LPCWSTR lpcwstrFile, - /* [unique][in] */ LPCWSTR lpcwstrPlayList); - - -void __RPC_STUB IGraphBuilder_RenderFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IGraphBuilder_AddSourceFilter_Proxy( - IGraphBuilder * This, - /* [in] */ LPCWSTR lpcwstrFileName, - /* [unique][in] */ LPCWSTR lpcwstrFilterName, - /* [out] */ IBaseFilter **ppFilter); - - -void __RPC_STUB IGraphBuilder_AddSourceFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IGraphBuilder_SetLogFile_Proxy( - IGraphBuilder * This, - /* [in] */ DWORD_PTR hFile); - - -void __RPC_STUB IGraphBuilder_SetLogFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IGraphBuilder_Abort_Proxy( - IGraphBuilder * This); - - -void __RPC_STUB IGraphBuilder_Abort_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IGraphBuilder_ShouldOperationContinue_Proxy( - IGraphBuilder * This); - - -void __RPC_STUB IGraphBuilder_ShouldOperationContinue_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IGraphBuilder_INTERFACE_DEFINED__ */ - - -#ifndef __ICaptureGraphBuilder_INTERFACE_DEFINED__ -#define __ICaptureGraphBuilder_INTERFACE_DEFINED__ - -/* interface ICaptureGraphBuilder */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_ICaptureGraphBuilder; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("bf87b6e0-8c27-11d0-b3f0-00aa003761c5") - ICaptureGraphBuilder : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetFiltergraph( - /* [in] */ IGraphBuilder *pfg) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFiltergraph( - /* [out] */ IGraphBuilder **ppfg) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetOutputFileName( - /* [in] */ const GUID *pType, - /* [in] */ LPCOLESTR lpstrFile, - /* [out] */ IBaseFilter **ppf, - /* [out] */ IFileSinkFilter **ppSink) = 0; - - virtual /* [local] */ HRESULT STDMETHODCALLTYPE FindInterface( - /* [unique][in] */ const GUID *pCategory, - /* [in] */ IBaseFilter *pf, - /* [in] */ REFIID riid, - /* [out] */ void **ppint) = 0; - - virtual HRESULT STDMETHODCALLTYPE RenderStream( - /* [in] */ const GUID *pCategory, - /* [in] */ IUnknown *pSource, - /* [in] */ IBaseFilter *pfCompressor, - /* [in] */ IBaseFilter *pfRenderer) = 0; - - virtual HRESULT STDMETHODCALLTYPE ControlStream( - /* [in] */ const GUID *pCategory, - /* [in] */ IBaseFilter *pFilter, - /* [in] */ REFERENCE_TIME *pstart, - /* [in] */ REFERENCE_TIME *pstop, - /* [in] */ WORD wStartCookie, - /* [in] */ WORD wStopCookie) = 0; - - virtual HRESULT STDMETHODCALLTYPE AllocCapFile( - /* [in] */ LPCOLESTR lpstr, - /* [in] */ DWORDLONG dwlSize) = 0; - - virtual HRESULT STDMETHODCALLTYPE CopyCaptureFile( - /* [in] */ LPOLESTR lpwstrOld, - /* [in] */ LPOLESTR lpwstrNew, - /* [in] */ int fAllowEscAbort, - /* [in] */ IAMCopyCaptureFileProgress *pCallback) = 0; - - }; - -#else /* C style interface */ - - typedef struct ICaptureGraphBuilderVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ICaptureGraphBuilder * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ICaptureGraphBuilder * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ICaptureGraphBuilder * This); - - HRESULT ( STDMETHODCALLTYPE *SetFiltergraph )( - ICaptureGraphBuilder * This, - /* [in] */ IGraphBuilder *pfg); - - HRESULT ( STDMETHODCALLTYPE *GetFiltergraph )( - ICaptureGraphBuilder * This, - /* [out] */ IGraphBuilder **ppfg); - - HRESULT ( STDMETHODCALLTYPE *SetOutputFileName )( - ICaptureGraphBuilder * This, - /* [in] */ const GUID *pType, - /* [in] */ LPCOLESTR lpstrFile, - /* [out] */ IBaseFilter **ppf, - /* [out] */ IFileSinkFilter **ppSink); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *FindInterface )( - ICaptureGraphBuilder * This, - /* [unique][in] */ const GUID *pCategory, - /* [in] */ IBaseFilter *pf, - /* [in] */ REFIID riid, - /* [out] */ void **ppint); - - HRESULT ( STDMETHODCALLTYPE *RenderStream )( - ICaptureGraphBuilder * This, - /* [in] */ const GUID *pCategory, - /* [in] */ IUnknown *pSource, - /* [in] */ IBaseFilter *pfCompressor, - /* [in] */ IBaseFilter *pfRenderer); - - HRESULT ( STDMETHODCALLTYPE *ControlStream )( - ICaptureGraphBuilder * This, - /* [in] */ const GUID *pCategory, - /* [in] */ IBaseFilter *pFilter, - /* [in] */ REFERENCE_TIME *pstart, - /* [in] */ REFERENCE_TIME *pstop, - /* [in] */ WORD wStartCookie, - /* [in] */ WORD wStopCookie); - - HRESULT ( STDMETHODCALLTYPE *AllocCapFile )( - ICaptureGraphBuilder * This, - /* [in] */ LPCOLESTR lpstr, - /* [in] */ DWORDLONG dwlSize); - - HRESULT ( STDMETHODCALLTYPE *CopyCaptureFile )( - ICaptureGraphBuilder * This, - /* [in] */ LPOLESTR lpwstrOld, - /* [in] */ LPOLESTR lpwstrNew, - /* [in] */ int fAllowEscAbort, - /* [in] */ IAMCopyCaptureFileProgress *pCallback); - - END_INTERFACE - } ICaptureGraphBuilderVtbl; - - interface ICaptureGraphBuilder - { - CONST_VTBL struct ICaptureGraphBuilderVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ICaptureGraphBuilder_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ICaptureGraphBuilder_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ICaptureGraphBuilder_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ICaptureGraphBuilder_SetFiltergraph(This,pfg) \ - (This)->lpVtbl -> SetFiltergraph(This,pfg) - -#define ICaptureGraphBuilder_GetFiltergraph(This,ppfg) \ - (This)->lpVtbl -> GetFiltergraph(This,ppfg) - -#define ICaptureGraphBuilder_SetOutputFileName(This,pType,lpstrFile,ppf,ppSink) \ - (This)->lpVtbl -> SetOutputFileName(This,pType,lpstrFile,ppf,ppSink) - -#define ICaptureGraphBuilder_FindInterface(This,pCategory,pf,riid,ppint) \ - (This)->lpVtbl -> FindInterface(This,pCategory,pf,riid,ppint) - -#define ICaptureGraphBuilder_RenderStream(This,pCategory,pSource,pfCompressor,pfRenderer) \ - (This)->lpVtbl -> RenderStream(This,pCategory,pSource,pfCompressor,pfRenderer) - -#define ICaptureGraphBuilder_ControlStream(This,pCategory,pFilter,pstart,pstop,wStartCookie,wStopCookie) \ - (This)->lpVtbl -> ControlStream(This,pCategory,pFilter,pstart,pstop,wStartCookie,wStopCookie) - -#define ICaptureGraphBuilder_AllocCapFile(This,lpstr,dwlSize) \ - (This)->lpVtbl -> AllocCapFile(This,lpstr,dwlSize) - -#define ICaptureGraphBuilder_CopyCaptureFile(This,lpwstrOld,lpwstrNew,fAllowEscAbort,pCallback) \ - (This)->lpVtbl -> CopyCaptureFile(This,lpwstrOld,lpwstrNew,fAllowEscAbort,pCallback) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder_SetFiltergraph_Proxy( - ICaptureGraphBuilder * This, - /* [in] */ IGraphBuilder *pfg); - - -void __RPC_STUB ICaptureGraphBuilder_SetFiltergraph_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder_GetFiltergraph_Proxy( - ICaptureGraphBuilder * This, - /* [out] */ IGraphBuilder **ppfg); - - -void __RPC_STUB ICaptureGraphBuilder_GetFiltergraph_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder_SetOutputFileName_Proxy( - ICaptureGraphBuilder * This, - /* [in] */ const GUID *pType, - /* [in] */ LPCOLESTR lpstrFile, - /* [out] */ IBaseFilter **ppf, - /* [out] */ IFileSinkFilter **ppSink); - - -void __RPC_STUB ICaptureGraphBuilder_SetOutputFileName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [call_as] */ HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder_RemoteFindInterface_Proxy( - ICaptureGraphBuilder * This, - /* [unique][in] */ const GUID *pCategory, - /* [in] */ IBaseFilter *pf, - /* [in] */ REFIID riid, - /* [out] */ IUnknown **ppint); - - -void __RPC_STUB ICaptureGraphBuilder_RemoteFindInterface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder_RenderStream_Proxy( - ICaptureGraphBuilder * This, - /* [in] */ const GUID *pCategory, - /* [in] */ IUnknown *pSource, - /* [in] */ IBaseFilter *pfCompressor, - /* [in] */ IBaseFilter *pfRenderer); - - -void __RPC_STUB ICaptureGraphBuilder_RenderStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder_ControlStream_Proxy( - ICaptureGraphBuilder * This, - /* [in] */ const GUID *pCategory, - /* [in] */ IBaseFilter *pFilter, - /* [in] */ REFERENCE_TIME *pstart, - /* [in] */ REFERENCE_TIME *pstop, - /* [in] */ WORD wStartCookie, - /* [in] */ WORD wStopCookie); - - -void __RPC_STUB ICaptureGraphBuilder_ControlStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder_AllocCapFile_Proxy( - ICaptureGraphBuilder * This, - /* [in] */ LPCOLESTR lpstr, - /* [in] */ DWORDLONG dwlSize); - - -void __RPC_STUB ICaptureGraphBuilder_AllocCapFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder_CopyCaptureFile_Proxy( - ICaptureGraphBuilder * This, - /* [in] */ LPOLESTR lpwstrOld, - /* [in] */ LPOLESTR lpwstrNew, - /* [in] */ int fAllowEscAbort, - /* [in] */ IAMCopyCaptureFileProgress *pCallback); - - -void __RPC_STUB ICaptureGraphBuilder_CopyCaptureFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ICaptureGraphBuilder_INTERFACE_DEFINED__ */ - - -#ifndef __IAMCopyCaptureFileProgress_INTERFACE_DEFINED__ -#define __IAMCopyCaptureFileProgress_INTERFACE_DEFINED__ - -/* interface IAMCopyCaptureFileProgress */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMCopyCaptureFileProgress; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("670d1d20-a068-11d0-b3f0-00aa003761c5") - IAMCopyCaptureFileProgress : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Progress( - /* [in] */ int iProgress) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMCopyCaptureFileProgressVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMCopyCaptureFileProgress * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMCopyCaptureFileProgress * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMCopyCaptureFileProgress * This); - - HRESULT ( STDMETHODCALLTYPE *Progress )( - IAMCopyCaptureFileProgress * This, - /* [in] */ int iProgress); - - END_INTERFACE - } IAMCopyCaptureFileProgressVtbl; - - interface IAMCopyCaptureFileProgress - { - CONST_VTBL struct IAMCopyCaptureFileProgressVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMCopyCaptureFileProgress_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMCopyCaptureFileProgress_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMCopyCaptureFileProgress_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMCopyCaptureFileProgress_Progress(This,iProgress) \ - (This)->lpVtbl -> Progress(This,iProgress) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMCopyCaptureFileProgress_Progress_Proxy( - IAMCopyCaptureFileProgress * This, - /* [in] */ int iProgress); - - -void __RPC_STUB IAMCopyCaptureFileProgress_Progress_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMCopyCaptureFileProgress_INTERFACE_DEFINED__ */ - - -#ifndef __ICaptureGraphBuilder2_INTERFACE_DEFINED__ -#define __ICaptureGraphBuilder2_INTERFACE_DEFINED__ - -/* interface ICaptureGraphBuilder2 */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_ICaptureGraphBuilder2; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("93E5A4E0-2D50-11d2-ABFA-00A0C9C6E38D") - ICaptureGraphBuilder2 : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetFiltergraph( - /* [in] */ IGraphBuilder *pfg) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFiltergraph( - /* [out] */ IGraphBuilder **ppfg) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetOutputFileName( - /* [in] */ const GUID *pType, - /* [in] */ LPCOLESTR lpstrFile, - /* [out] */ IBaseFilter **ppf, - /* [out] */ IFileSinkFilter **ppSink) = 0; - - virtual /* [local] */ HRESULT STDMETHODCALLTYPE FindInterface( - /* [in] */ const GUID *pCategory, - /* [in] */ const GUID *pType, - /* [in] */ IBaseFilter *pf, - /* [in] */ REFIID riid, - /* [out] */ void **ppint) = 0; - - virtual HRESULT STDMETHODCALLTYPE RenderStream( - /* [in] */ const GUID *pCategory, - /* [in] */ const GUID *pType, - /* [in] */ IUnknown *pSource, - /* [in] */ IBaseFilter *pfCompressor, - /* [in] */ IBaseFilter *pfRenderer) = 0; - - virtual HRESULT STDMETHODCALLTYPE ControlStream( - /* [in] */ const GUID *pCategory, - /* [in] */ const GUID *pType, - /* [in] */ IBaseFilter *pFilter, - /* [in] */ REFERENCE_TIME *pstart, - /* [in] */ REFERENCE_TIME *pstop, - /* [in] */ WORD wStartCookie, - /* [in] */ WORD wStopCookie) = 0; - - virtual HRESULT STDMETHODCALLTYPE AllocCapFile( - /* [in] */ LPCOLESTR lpstr, - /* [in] */ DWORDLONG dwlSize) = 0; - - virtual HRESULT STDMETHODCALLTYPE CopyCaptureFile( - /* [in] */ LPOLESTR lpwstrOld, - /* [in] */ LPOLESTR lpwstrNew, - /* [in] */ int fAllowEscAbort, - /* [in] */ IAMCopyCaptureFileProgress *pCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE FindPin( - /* [in] */ IUnknown *pSource, - /* [in] */ PIN_DIRECTION pindir, - /* [in] */ const GUID *pCategory, - /* [in] */ const GUID *pType, - /* [in] */ BOOL fUnconnected, - /* [in] */ int num, - /* [out] */ IPin **ppPin) = 0; - - }; - -#else /* C style interface */ - - typedef struct ICaptureGraphBuilder2Vtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ICaptureGraphBuilder2 * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ICaptureGraphBuilder2 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ICaptureGraphBuilder2 * This); - - HRESULT ( STDMETHODCALLTYPE *SetFiltergraph )( - ICaptureGraphBuilder2 * This, - /* [in] */ IGraphBuilder *pfg); - - HRESULT ( STDMETHODCALLTYPE *GetFiltergraph )( - ICaptureGraphBuilder2 * This, - /* [out] */ IGraphBuilder **ppfg); - - HRESULT ( STDMETHODCALLTYPE *SetOutputFileName )( - ICaptureGraphBuilder2 * This, - /* [in] */ const GUID *pType, - /* [in] */ LPCOLESTR lpstrFile, - /* [out] */ IBaseFilter **ppf, - /* [out] */ IFileSinkFilter **ppSink); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *FindInterface )( - ICaptureGraphBuilder2 * This, - /* [in] */ const GUID *pCategory, - /* [in] */ const GUID *pType, - /* [in] */ IBaseFilter *pf, - /* [in] */ REFIID riid, - /* [out] */ void **ppint); - - HRESULT ( STDMETHODCALLTYPE *RenderStream )( - ICaptureGraphBuilder2 * This, - /* [in] */ const GUID *pCategory, - /* [in] */ const GUID *pType, - /* [in] */ IUnknown *pSource, - /* [in] */ IBaseFilter *pfCompressor, - /* [in] */ IBaseFilter *pfRenderer); - - HRESULT ( STDMETHODCALLTYPE *ControlStream )( - ICaptureGraphBuilder2 * This, - /* [in] */ const GUID *pCategory, - /* [in] */ const GUID *pType, - /* [in] */ IBaseFilter *pFilter, - /* [in] */ REFERENCE_TIME *pstart, - /* [in] */ REFERENCE_TIME *pstop, - /* [in] */ WORD wStartCookie, - /* [in] */ WORD wStopCookie); - - HRESULT ( STDMETHODCALLTYPE *AllocCapFile )( - ICaptureGraphBuilder2 * This, - /* [in] */ LPCOLESTR lpstr, - /* [in] */ DWORDLONG dwlSize); - - HRESULT ( STDMETHODCALLTYPE *CopyCaptureFile )( - ICaptureGraphBuilder2 * This, - /* [in] */ LPOLESTR lpwstrOld, - /* [in] */ LPOLESTR lpwstrNew, - /* [in] */ int fAllowEscAbort, - /* [in] */ IAMCopyCaptureFileProgress *pCallback); - - HRESULT ( STDMETHODCALLTYPE *FindPin )( - ICaptureGraphBuilder2 * This, - /* [in] */ IUnknown *pSource, - /* [in] */ PIN_DIRECTION pindir, - /* [in] */ const GUID *pCategory, - /* [in] */ const GUID *pType, - /* [in] */ BOOL fUnconnected, - /* [in] */ int num, - /* [out] */ IPin **ppPin); - - END_INTERFACE - } ICaptureGraphBuilder2Vtbl; - - interface ICaptureGraphBuilder2 - { - CONST_VTBL struct ICaptureGraphBuilder2Vtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ICaptureGraphBuilder2_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ICaptureGraphBuilder2_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ICaptureGraphBuilder2_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ICaptureGraphBuilder2_SetFiltergraph(This,pfg) \ - (This)->lpVtbl -> SetFiltergraph(This,pfg) - -#define ICaptureGraphBuilder2_GetFiltergraph(This,ppfg) \ - (This)->lpVtbl -> GetFiltergraph(This,ppfg) - -#define ICaptureGraphBuilder2_SetOutputFileName(This,pType,lpstrFile,ppf,ppSink) \ - (This)->lpVtbl -> SetOutputFileName(This,pType,lpstrFile,ppf,ppSink) - -#define ICaptureGraphBuilder2_FindInterface(This,pCategory,pType,pf,riid,ppint) \ - (This)->lpVtbl -> FindInterface(This,pCategory,pType,pf,riid,ppint) - -#define ICaptureGraphBuilder2_RenderStream(This,pCategory,pType,pSource,pfCompressor,pfRenderer) \ - (This)->lpVtbl -> RenderStream(This,pCategory,pType,pSource,pfCompressor,pfRenderer) - -#define ICaptureGraphBuilder2_ControlStream(This,pCategory,pType,pFilter,pstart,pstop,wStartCookie,wStopCookie) \ - (This)->lpVtbl -> ControlStream(This,pCategory,pType,pFilter,pstart,pstop,wStartCookie,wStopCookie) - -#define ICaptureGraphBuilder2_AllocCapFile(This,lpstr,dwlSize) \ - (This)->lpVtbl -> AllocCapFile(This,lpstr,dwlSize) - -#define ICaptureGraphBuilder2_CopyCaptureFile(This,lpwstrOld,lpwstrNew,fAllowEscAbort,pCallback) \ - (This)->lpVtbl -> CopyCaptureFile(This,lpwstrOld,lpwstrNew,fAllowEscAbort,pCallback) - -#define ICaptureGraphBuilder2_FindPin(This,pSource,pindir,pCategory,pType,fUnconnected,num,ppPin) \ - (This)->lpVtbl -> FindPin(This,pSource,pindir,pCategory,pType,fUnconnected,num,ppPin) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder2_SetFiltergraph_Proxy( - ICaptureGraphBuilder2 * This, - /* [in] */ IGraphBuilder *pfg); - - -void __RPC_STUB ICaptureGraphBuilder2_SetFiltergraph_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder2_GetFiltergraph_Proxy( - ICaptureGraphBuilder2 * This, - /* [out] */ IGraphBuilder **ppfg); - - -void __RPC_STUB ICaptureGraphBuilder2_GetFiltergraph_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder2_SetOutputFileName_Proxy( - ICaptureGraphBuilder2 * This, - /* [in] */ const GUID *pType, - /* [in] */ LPCOLESTR lpstrFile, - /* [out] */ IBaseFilter **ppf, - /* [out] */ IFileSinkFilter **ppSink); - - -void __RPC_STUB ICaptureGraphBuilder2_SetOutputFileName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [call_as] */ HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder2_RemoteFindInterface_Proxy( - ICaptureGraphBuilder2 * This, - /* [in] */ const GUID *pCategory, - /* [in] */ const GUID *pType, - /* [in] */ IBaseFilter *pf, - /* [in] */ REFIID riid, - /* [out] */ IUnknown **ppint); - - -void __RPC_STUB ICaptureGraphBuilder2_RemoteFindInterface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder2_RenderStream_Proxy( - ICaptureGraphBuilder2 * This, - /* [in] */ const GUID *pCategory, - /* [in] */ const GUID *pType, - /* [in] */ IUnknown *pSource, - /* [in] */ IBaseFilter *pfCompressor, - /* [in] */ IBaseFilter *pfRenderer); - - -void __RPC_STUB ICaptureGraphBuilder2_RenderStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder2_ControlStream_Proxy( - ICaptureGraphBuilder2 * This, - /* [in] */ const GUID *pCategory, - /* [in] */ const GUID *pType, - /* [in] */ IBaseFilter *pFilter, - /* [in] */ REFERENCE_TIME *pstart, - /* [in] */ REFERENCE_TIME *pstop, - /* [in] */ WORD wStartCookie, - /* [in] */ WORD wStopCookie); - - -void __RPC_STUB ICaptureGraphBuilder2_ControlStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder2_AllocCapFile_Proxy( - ICaptureGraphBuilder2 * This, - /* [in] */ LPCOLESTR lpstr, - /* [in] */ DWORDLONG dwlSize); - - -void __RPC_STUB ICaptureGraphBuilder2_AllocCapFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder2_CopyCaptureFile_Proxy( - ICaptureGraphBuilder2 * This, - /* [in] */ LPOLESTR lpwstrOld, - /* [in] */ LPOLESTR lpwstrNew, - /* [in] */ int fAllowEscAbort, - /* [in] */ IAMCopyCaptureFileProgress *pCallback); - - -void __RPC_STUB ICaptureGraphBuilder2_CopyCaptureFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder2_FindPin_Proxy( - ICaptureGraphBuilder2 * This, - /* [in] */ IUnknown *pSource, - /* [in] */ PIN_DIRECTION pindir, - /* [in] */ const GUID *pCategory, - /* [in] */ const GUID *pType, - /* [in] */ BOOL fUnconnected, - /* [in] */ int num, - /* [out] */ IPin **ppPin); - - -void __RPC_STUB ICaptureGraphBuilder2_FindPin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ICaptureGraphBuilder2_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0148 */ -/* [local] */ - - -enum _AM_RENSDEREXFLAGS - { AM_RENDEREX_RENDERTOEXISTINGRENDERERS = 0x1 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0148_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0148_v0_0_s_ifspec; - -#ifndef __IFilterGraph2_INTERFACE_DEFINED__ -#define __IFilterGraph2_INTERFACE_DEFINED__ - -/* interface IFilterGraph2 */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IFilterGraph2; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("36b73882-c2c8-11cf-8b46-00805f6cef60") - IFilterGraph2 : public IGraphBuilder - { - public: - virtual HRESULT STDMETHODCALLTYPE AddSourceFilterForMoniker( - /* [in] */ IMoniker *pMoniker, - /* [in] */ IBindCtx *pCtx, - /* [unique][in] */ LPCWSTR lpcwstrFilterName, - /* [out] */ IBaseFilter **ppFilter) = 0; - - virtual HRESULT STDMETHODCALLTYPE ReconnectEx( - /* [in] */ IPin *ppin, - /* [unique][in] */ const AM_MEDIA_TYPE *pmt) = 0; - - virtual HRESULT STDMETHODCALLTYPE RenderEx( - /* [in] */ IPin *pPinOut, - /* [in] */ DWORD dwFlags, - /* [out][in] */ DWORD *pvContext) = 0; - - }; - -#else /* C style interface */ - - typedef struct IFilterGraph2Vtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IFilterGraph2 * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IFilterGraph2 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IFilterGraph2 * This); - - HRESULT ( STDMETHODCALLTYPE *AddFilter )( - IFilterGraph2 * This, - /* [in] */ IBaseFilter *pFilter, - /* [string][in] */ LPCWSTR pName); - - HRESULT ( STDMETHODCALLTYPE *RemoveFilter )( - IFilterGraph2 * This, - /* [in] */ IBaseFilter *pFilter); - - HRESULT ( STDMETHODCALLTYPE *EnumFilters )( - IFilterGraph2 * This, - /* [out] */ IEnumFilters **ppEnum); - - HRESULT ( STDMETHODCALLTYPE *FindFilterByName )( - IFilterGraph2 * This, - /* [string][in] */ LPCWSTR pName, - /* [out] */ IBaseFilter **ppFilter); - - HRESULT ( STDMETHODCALLTYPE *ConnectDirect )( - IFilterGraph2 * This, - /* [in] */ IPin *ppinOut, - /* [in] */ IPin *ppinIn, - /* [unique][in] */ const AM_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *Reconnect )( - IFilterGraph2 * This, - /* [in] */ IPin *ppin); - - HRESULT ( STDMETHODCALLTYPE *Disconnect )( - IFilterGraph2 * This, - /* [in] */ IPin *ppin); - - HRESULT ( STDMETHODCALLTYPE *SetDefaultSyncSource )( - IFilterGraph2 * This); - - HRESULT ( STDMETHODCALLTYPE *Connect )( - IFilterGraph2 * This, - /* [in] */ IPin *ppinOut, - /* [in] */ IPin *ppinIn); - - HRESULT ( STDMETHODCALLTYPE *Render )( - IFilterGraph2 * This, - /* [in] */ IPin *ppinOut); - - HRESULT ( STDMETHODCALLTYPE *RenderFile )( - IFilterGraph2 * This, - /* [in] */ LPCWSTR lpcwstrFile, - /* [unique][in] */ LPCWSTR lpcwstrPlayList); - - HRESULT ( STDMETHODCALLTYPE *AddSourceFilter )( - IFilterGraph2 * This, - /* [in] */ LPCWSTR lpcwstrFileName, - /* [unique][in] */ LPCWSTR lpcwstrFilterName, - /* [out] */ IBaseFilter **ppFilter); - - HRESULT ( STDMETHODCALLTYPE *SetLogFile )( - IFilterGraph2 * This, - /* [in] */ DWORD_PTR hFile); - - HRESULT ( STDMETHODCALLTYPE *Abort )( - IFilterGraph2 * This); - - HRESULT ( STDMETHODCALLTYPE *ShouldOperationContinue )( - IFilterGraph2 * This); - - HRESULT ( STDMETHODCALLTYPE *AddSourceFilterForMoniker )( - IFilterGraph2 * This, - /* [in] */ IMoniker *pMoniker, - /* [in] */ IBindCtx *pCtx, - /* [unique][in] */ LPCWSTR lpcwstrFilterName, - /* [out] */ IBaseFilter **ppFilter); - - HRESULT ( STDMETHODCALLTYPE *ReconnectEx )( - IFilterGraph2 * This, - /* [in] */ IPin *ppin, - /* [unique][in] */ const AM_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *RenderEx )( - IFilterGraph2 * This, - /* [in] */ IPin *pPinOut, - /* [in] */ DWORD dwFlags, - /* [out][in] */ DWORD *pvContext); - - END_INTERFACE - } IFilterGraph2Vtbl; - - interface IFilterGraph2 - { - CONST_VTBL struct IFilterGraph2Vtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IFilterGraph2_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IFilterGraph2_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IFilterGraph2_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IFilterGraph2_AddFilter(This,pFilter,pName) \ - (This)->lpVtbl -> AddFilter(This,pFilter,pName) - -#define IFilterGraph2_RemoveFilter(This,pFilter) \ - (This)->lpVtbl -> RemoveFilter(This,pFilter) - -#define IFilterGraph2_EnumFilters(This,ppEnum) \ - (This)->lpVtbl -> EnumFilters(This,ppEnum) - -#define IFilterGraph2_FindFilterByName(This,pName,ppFilter) \ - (This)->lpVtbl -> FindFilterByName(This,pName,ppFilter) - -#define IFilterGraph2_ConnectDirect(This,ppinOut,ppinIn,pmt) \ - (This)->lpVtbl -> ConnectDirect(This,ppinOut,ppinIn,pmt) - -#define IFilterGraph2_Reconnect(This,ppin) \ - (This)->lpVtbl -> Reconnect(This,ppin) - -#define IFilterGraph2_Disconnect(This,ppin) \ - (This)->lpVtbl -> Disconnect(This,ppin) - -#define IFilterGraph2_SetDefaultSyncSource(This) \ - (This)->lpVtbl -> SetDefaultSyncSource(This) - - -#define IFilterGraph2_Connect(This,ppinOut,ppinIn) \ - (This)->lpVtbl -> Connect(This,ppinOut,ppinIn) - -#define IFilterGraph2_Render(This,ppinOut) \ - (This)->lpVtbl -> Render(This,ppinOut) - -#define IFilterGraph2_RenderFile(This,lpcwstrFile,lpcwstrPlayList) \ - (This)->lpVtbl -> RenderFile(This,lpcwstrFile,lpcwstrPlayList) - -#define IFilterGraph2_AddSourceFilter(This,lpcwstrFileName,lpcwstrFilterName,ppFilter) \ - (This)->lpVtbl -> AddSourceFilter(This,lpcwstrFileName,lpcwstrFilterName,ppFilter) - -#define IFilterGraph2_SetLogFile(This,hFile) \ - (This)->lpVtbl -> SetLogFile(This,hFile) - -#define IFilterGraph2_Abort(This) \ - (This)->lpVtbl -> Abort(This) - -#define IFilterGraph2_ShouldOperationContinue(This) \ - (This)->lpVtbl -> ShouldOperationContinue(This) - - -#define IFilterGraph2_AddSourceFilterForMoniker(This,pMoniker,pCtx,lpcwstrFilterName,ppFilter) \ - (This)->lpVtbl -> AddSourceFilterForMoniker(This,pMoniker,pCtx,lpcwstrFilterName,ppFilter) - -#define IFilterGraph2_ReconnectEx(This,ppin,pmt) \ - (This)->lpVtbl -> ReconnectEx(This,ppin,pmt) - -#define IFilterGraph2_RenderEx(This,pPinOut,dwFlags,pvContext) \ - (This)->lpVtbl -> RenderEx(This,pPinOut,dwFlags,pvContext) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IFilterGraph2_AddSourceFilterForMoniker_Proxy( - IFilterGraph2 * This, - /* [in] */ IMoniker *pMoniker, - /* [in] */ IBindCtx *pCtx, - /* [unique][in] */ LPCWSTR lpcwstrFilterName, - /* [out] */ IBaseFilter **ppFilter); - - -void __RPC_STUB IFilterGraph2_AddSourceFilterForMoniker_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterGraph2_ReconnectEx_Proxy( - IFilterGraph2 * This, - /* [in] */ IPin *ppin, - /* [unique][in] */ const AM_MEDIA_TYPE *pmt); - - -void __RPC_STUB IFilterGraph2_ReconnectEx_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterGraph2_RenderEx_Proxy( - IFilterGraph2 * This, - /* [in] */ IPin *pPinOut, - /* [in] */ DWORD dwFlags, - /* [out][in] */ DWORD *pvContext); - - -void __RPC_STUB IFilterGraph2_RenderEx_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IFilterGraph2_INTERFACE_DEFINED__ */ - - -#ifndef __IStreamBuilder_INTERFACE_DEFINED__ -#define __IStreamBuilder_INTERFACE_DEFINED__ - -/* interface IStreamBuilder */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IStreamBuilder; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868bf-0ad4-11ce-b03a-0020af0ba770") - IStreamBuilder : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Render( - /* [in] */ IPin *ppinOut, - /* [in] */ IGraphBuilder *pGraph) = 0; - - virtual HRESULT STDMETHODCALLTYPE Backout( - /* [in] */ IPin *ppinOut, - /* [in] */ IGraphBuilder *pGraph) = 0; - - }; - -#else /* C style interface */ - - typedef struct IStreamBuilderVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IStreamBuilder * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IStreamBuilder * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IStreamBuilder * This); - - HRESULT ( STDMETHODCALLTYPE *Render )( - IStreamBuilder * This, - /* [in] */ IPin *ppinOut, - /* [in] */ IGraphBuilder *pGraph); - - HRESULT ( STDMETHODCALLTYPE *Backout )( - IStreamBuilder * This, - /* [in] */ IPin *ppinOut, - /* [in] */ IGraphBuilder *pGraph); - - END_INTERFACE - } IStreamBuilderVtbl; - - interface IStreamBuilder - { - CONST_VTBL struct IStreamBuilderVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IStreamBuilder_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IStreamBuilder_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IStreamBuilder_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IStreamBuilder_Render(This,ppinOut,pGraph) \ - (This)->lpVtbl -> Render(This,ppinOut,pGraph) - -#define IStreamBuilder_Backout(This,ppinOut,pGraph) \ - (This)->lpVtbl -> Backout(This,ppinOut,pGraph) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IStreamBuilder_Render_Proxy( - IStreamBuilder * This, - /* [in] */ IPin *ppinOut, - /* [in] */ IGraphBuilder *pGraph); - - -void __RPC_STUB IStreamBuilder_Render_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IStreamBuilder_Backout_Proxy( - IStreamBuilder * This, - /* [in] */ IPin *ppinOut, - /* [in] */ IGraphBuilder *pGraph); - - -void __RPC_STUB IStreamBuilder_Backout_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IStreamBuilder_INTERFACE_DEFINED__ */ - - -#ifndef __IAsyncReader_INTERFACE_DEFINED__ -#define __IAsyncReader_INTERFACE_DEFINED__ - -/* interface IAsyncReader */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAsyncReader; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868aa-0ad4-11ce-b03a-0020af0ba770") - IAsyncReader : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE RequestAllocator( - /* [in] */ IMemAllocator *pPreferred, - /* [in] */ ALLOCATOR_PROPERTIES *pProps, - /* [out] */ IMemAllocator **ppActual) = 0; - - virtual HRESULT STDMETHODCALLTYPE Request( - /* [in] */ IMediaSample *pSample, - /* [in] */ DWORD_PTR dwUser) = 0; - - virtual HRESULT STDMETHODCALLTYPE WaitForNext( - /* [in] */ DWORD dwTimeout, - /* [out] */ IMediaSample **ppSample, - /* [out] */ DWORD_PTR *pdwUser) = 0; - - virtual HRESULT STDMETHODCALLTYPE SyncReadAligned( - /* [in] */ IMediaSample *pSample) = 0; - - virtual HRESULT STDMETHODCALLTYPE SyncRead( - /* [in] */ LONGLONG llPosition, - /* [in] */ LONG lLength, - /* [size_is][out] */ BYTE *pBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE Length( - /* [out] */ LONGLONG *pTotal, - /* [out] */ LONGLONG *pAvailable) = 0; - - virtual HRESULT STDMETHODCALLTYPE BeginFlush( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE EndFlush( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAsyncReaderVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAsyncReader * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAsyncReader * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAsyncReader * This); - - HRESULT ( STDMETHODCALLTYPE *RequestAllocator )( - IAsyncReader * This, - /* [in] */ IMemAllocator *pPreferred, - /* [in] */ ALLOCATOR_PROPERTIES *pProps, - /* [out] */ IMemAllocator **ppActual); - - HRESULT ( STDMETHODCALLTYPE *Request )( - IAsyncReader * This, - /* [in] */ IMediaSample *pSample, - /* [in] */ DWORD_PTR dwUser); - - HRESULT ( STDMETHODCALLTYPE *WaitForNext )( - IAsyncReader * This, - /* [in] */ DWORD dwTimeout, - /* [out] */ IMediaSample **ppSample, - /* [out] */ DWORD_PTR *pdwUser); - - HRESULT ( STDMETHODCALLTYPE *SyncReadAligned )( - IAsyncReader * This, - /* [in] */ IMediaSample *pSample); - - HRESULT ( STDMETHODCALLTYPE *SyncRead )( - IAsyncReader * This, - /* [in] */ LONGLONG llPosition, - /* [in] */ LONG lLength, - /* [size_is][out] */ BYTE *pBuffer); - - HRESULT ( STDMETHODCALLTYPE *Length )( - IAsyncReader * This, - /* [out] */ LONGLONG *pTotal, - /* [out] */ LONGLONG *pAvailable); - - HRESULT ( STDMETHODCALLTYPE *BeginFlush )( - IAsyncReader * This); - - HRESULT ( STDMETHODCALLTYPE *EndFlush )( - IAsyncReader * This); - - END_INTERFACE - } IAsyncReaderVtbl; - - interface IAsyncReader - { - CONST_VTBL struct IAsyncReaderVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAsyncReader_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAsyncReader_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAsyncReader_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAsyncReader_RequestAllocator(This,pPreferred,pProps,ppActual) \ - (This)->lpVtbl -> RequestAllocator(This,pPreferred,pProps,ppActual) - -#define IAsyncReader_Request(This,pSample,dwUser) \ - (This)->lpVtbl -> Request(This,pSample,dwUser) - -#define IAsyncReader_WaitForNext(This,dwTimeout,ppSample,pdwUser) \ - (This)->lpVtbl -> WaitForNext(This,dwTimeout,ppSample,pdwUser) - -#define IAsyncReader_SyncReadAligned(This,pSample) \ - (This)->lpVtbl -> SyncReadAligned(This,pSample) - -#define IAsyncReader_SyncRead(This,llPosition,lLength,pBuffer) \ - (This)->lpVtbl -> SyncRead(This,llPosition,lLength,pBuffer) - -#define IAsyncReader_Length(This,pTotal,pAvailable) \ - (This)->lpVtbl -> Length(This,pTotal,pAvailable) - -#define IAsyncReader_BeginFlush(This) \ - (This)->lpVtbl -> BeginFlush(This) - -#define IAsyncReader_EndFlush(This) \ - (This)->lpVtbl -> EndFlush(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAsyncReader_RequestAllocator_Proxy( - IAsyncReader * This, - /* [in] */ IMemAllocator *pPreferred, - /* [in] */ ALLOCATOR_PROPERTIES *pProps, - /* [out] */ IMemAllocator **ppActual); - - -void __RPC_STUB IAsyncReader_RequestAllocator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAsyncReader_Request_Proxy( - IAsyncReader * This, - /* [in] */ IMediaSample *pSample, - /* [in] */ DWORD_PTR dwUser); - - -void __RPC_STUB IAsyncReader_Request_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAsyncReader_WaitForNext_Proxy( - IAsyncReader * This, - /* [in] */ DWORD dwTimeout, - /* [out] */ IMediaSample **ppSample, - /* [out] */ DWORD_PTR *pdwUser); - - -void __RPC_STUB IAsyncReader_WaitForNext_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAsyncReader_SyncReadAligned_Proxy( - IAsyncReader * This, - /* [in] */ IMediaSample *pSample); - - -void __RPC_STUB IAsyncReader_SyncReadAligned_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAsyncReader_SyncRead_Proxy( - IAsyncReader * This, - /* [in] */ LONGLONG llPosition, - /* [in] */ LONG lLength, - /* [size_is][out] */ BYTE *pBuffer); - - -void __RPC_STUB IAsyncReader_SyncRead_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAsyncReader_Length_Proxy( - IAsyncReader * This, - /* [out] */ LONGLONG *pTotal, - /* [out] */ LONGLONG *pAvailable); - - -void __RPC_STUB IAsyncReader_Length_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAsyncReader_BeginFlush_Proxy( - IAsyncReader * This); - - -void __RPC_STUB IAsyncReader_BeginFlush_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAsyncReader_EndFlush_Proxy( - IAsyncReader * This); - - -void __RPC_STUB IAsyncReader_EndFlush_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAsyncReader_INTERFACE_DEFINED__ */ - - -#ifndef __IGraphVersion_INTERFACE_DEFINED__ -#define __IGraphVersion_INTERFACE_DEFINED__ - -/* interface IGraphVersion */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IGraphVersion; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868ab-0ad4-11ce-b03a-0020af0ba770") - IGraphVersion : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE QueryVersion( - LONG *pVersion) = 0; - - }; - -#else /* C style interface */ - - typedef struct IGraphVersionVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IGraphVersion * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IGraphVersion * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IGraphVersion * This); - - HRESULT ( STDMETHODCALLTYPE *QueryVersion )( - IGraphVersion * This, - LONG *pVersion); - - END_INTERFACE - } IGraphVersionVtbl; - - interface IGraphVersion - { - CONST_VTBL struct IGraphVersionVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IGraphVersion_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IGraphVersion_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IGraphVersion_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IGraphVersion_QueryVersion(This,pVersion) \ - (This)->lpVtbl -> QueryVersion(This,pVersion) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IGraphVersion_QueryVersion_Proxy( - IGraphVersion * This, - LONG *pVersion); - - -void __RPC_STUB IGraphVersion_QueryVersion_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IGraphVersion_INTERFACE_DEFINED__ */ - - -#ifndef __IResourceConsumer_INTERFACE_DEFINED__ -#define __IResourceConsumer_INTERFACE_DEFINED__ - -/* interface IResourceConsumer */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IResourceConsumer; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868ad-0ad4-11ce-b03a-0020af0ba770") - IResourceConsumer : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE AcquireResource( - /* [in] */ LONG idResource) = 0; - - virtual HRESULT STDMETHODCALLTYPE ReleaseResource( - /* [in] */ LONG idResource) = 0; - - }; - -#else /* C style interface */ - - typedef struct IResourceConsumerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IResourceConsumer * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IResourceConsumer * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IResourceConsumer * This); - - HRESULT ( STDMETHODCALLTYPE *AcquireResource )( - IResourceConsumer * This, - /* [in] */ LONG idResource); - - HRESULT ( STDMETHODCALLTYPE *ReleaseResource )( - IResourceConsumer * This, - /* [in] */ LONG idResource); - - END_INTERFACE - } IResourceConsumerVtbl; - - interface IResourceConsumer - { - CONST_VTBL struct IResourceConsumerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IResourceConsumer_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IResourceConsumer_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IResourceConsumer_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IResourceConsumer_AcquireResource(This,idResource) \ - (This)->lpVtbl -> AcquireResource(This,idResource) - -#define IResourceConsumer_ReleaseResource(This,idResource) \ - (This)->lpVtbl -> ReleaseResource(This,idResource) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IResourceConsumer_AcquireResource_Proxy( - IResourceConsumer * This, - /* [in] */ LONG idResource); - - -void __RPC_STUB IResourceConsumer_AcquireResource_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IResourceConsumer_ReleaseResource_Proxy( - IResourceConsumer * This, - /* [in] */ LONG idResource); - - -void __RPC_STUB IResourceConsumer_ReleaseResource_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IResourceConsumer_INTERFACE_DEFINED__ */ - - -#ifndef __IResourceManager_INTERFACE_DEFINED__ -#define __IResourceManager_INTERFACE_DEFINED__ - -/* interface IResourceManager */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IResourceManager; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868ac-0ad4-11ce-b03a-0020af0ba770") - IResourceManager : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Register( - /* [in] */ LPCWSTR pName, - /* [in] */ LONG cResource, - /* [out] */ LONG *plToken) = 0; - - virtual HRESULT STDMETHODCALLTYPE RegisterGroup( - /* [in] */ LPCWSTR pName, - /* [in] */ LONG cResource, - /* [size_is][in] */ LONG *palTokens, - /* [out] */ LONG *plToken) = 0; - - virtual HRESULT STDMETHODCALLTYPE RequestResource( - /* [in] */ LONG idResource, - /* [in] */ IUnknown *pFocusObject, - /* [in] */ IResourceConsumer *pConsumer) = 0; - - virtual HRESULT STDMETHODCALLTYPE NotifyAcquire( - /* [in] */ LONG idResource, - /* [in] */ IResourceConsumer *pConsumer, - /* [in] */ HRESULT hr) = 0; - - virtual HRESULT STDMETHODCALLTYPE NotifyRelease( - /* [in] */ LONG idResource, - /* [in] */ IResourceConsumer *pConsumer, - /* [in] */ BOOL bStillWant) = 0; - - virtual HRESULT STDMETHODCALLTYPE CancelRequest( - /* [in] */ LONG idResource, - /* [in] */ IResourceConsumer *pConsumer) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFocus( - /* [in] */ IUnknown *pFocusObject) = 0; - - virtual HRESULT STDMETHODCALLTYPE ReleaseFocus( - /* [in] */ IUnknown *pFocusObject) = 0; - - }; - -#else /* C style interface */ - - typedef struct IResourceManagerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IResourceManager * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IResourceManager * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IResourceManager * This); - - HRESULT ( STDMETHODCALLTYPE *Register )( - IResourceManager * This, - /* [in] */ LPCWSTR pName, - /* [in] */ LONG cResource, - /* [out] */ LONG *plToken); - - HRESULT ( STDMETHODCALLTYPE *RegisterGroup )( - IResourceManager * This, - /* [in] */ LPCWSTR pName, - /* [in] */ LONG cResource, - /* [size_is][in] */ LONG *palTokens, - /* [out] */ LONG *plToken); - - HRESULT ( STDMETHODCALLTYPE *RequestResource )( - IResourceManager * This, - /* [in] */ LONG idResource, - /* [in] */ IUnknown *pFocusObject, - /* [in] */ IResourceConsumer *pConsumer); - - HRESULT ( STDMETHODCALLTYPE *NotifyAcquire )( - IResourceManager * This, - /* [in] */ LONG idResource, - /* [in] */ IResourceConsumer *pConsumer, - /* [in] */ HRESULT hr); - - HRESULT ( STDMETHODCALLTYPE *NotifyRelease )( - IResourceManager * This, - /* [in] */ LONG idResource, - /* [in] */ IResourceConsumer *pConsumer, - /* [in] */ BOOL bStillWant); - - HRESULT ( STDMETHODCALLTYPE *CancelRequest )( - IResourceManager * This, - /* [in] */ LONG idResource, - /* [in] */ IResourceConsumer *pConsumer); - - HRESULT ( STDMETHODCALLTYPE *SetFocus )( - IResourceManager * This, - /* [in] */ IUnknown *pFocusObject); - - HRESULT ( STDMETHODCALLTYPE *ReleaseFocus )( - IResourceManager * This, - /* [in] */ IUnknown *pFocusObject); - - END_INTERFACE - } IResourceManagerVtbl; - - interface IResourceManager - { - CONST_VTBL struct IResourceManagerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IResourceManager_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IResourceManager_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IResourceManager_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IResourceManager_Register(This,pName,cResource,plToken) \ - (This)->lpVtbl -> Register(This,pName,cResource,plToken) - -#define IResourceManager_RegisterGroup(This,pName,cResource,palTokens,plToken) \ - (This)->lpVtbl -> RegisterGroup(This,pName,cResource,palTokens,plToken) - -#define IResourceManager_RequestResource(This,idResource,pFocusObject,pConsumer) \ - (This)->lpVtbl -> RequestResource(This,idResource,pFocusObject,pConsumer) - -#define IResourceManager_NotifyAcquire(This,idResource,pConsumer,hr) \ - (This)->lpVtbl -> NotifyAcquire(This,idResource,pConsumer,hr) - -#define IResourceManager_NotifyRelease(This,idResource,pConsumer,bStillWant) \ - (This)->lpVtbl -> NotifyRelease(This,idResource,pConsumer,bStillWant) - -#define IResourceManager_CancelRequest(This,idResource,pConsumer) \ - (This)->lpVtbl -> CancelRequest(This,idResource,pConsumer) - -#define IResourceManager_SetFocus(This,pFocusObject) \ - (This)->lpVtbl -> SetFocus(This,pFocusObject) - -#define IResourceManager_ReleaseFocus(This,pFocusObject) \ - (This)->lpVtbl -> ReleaseFocus(This,pFocusObject) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IResourceManager_Register_Proxy( - IResourceManager * This, - /* [in] */ LPCWSTR pName, - /* [in] */ LONG cResource, - /* [out] */ LONG *plToken); - - -void __RPC_STUB IResourceManager_Register_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IResourceManager_RegisterGroup_Proxy( - IResourceManager * This, - /* [in] */ LPCWSTR pName, - /* [in] */ LONG cResource, - /* [size_is][in] */ LONG *palTokens, - /* [out] */ LONG *plToken); - - -void __RPC_STUB IResourceManager_RegisterGroup_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IResourceManager_RequestResource_Proxy( - IResourceManager * This, - /* [in] */ LONG idResource, - /* [in] */ IUnknown *pFocusObject, - /* [in] */ IResourceConsumer *pConsumer); - - -void __RPC_STUB IResourceManager_RequestResource_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IResourceManager_NotifyAcquire_Proxy( - IResourceManager * This, - /* [in] */ LONG idResource, - /* [in] */ IResourceConsumer *pConsumer, - /* [in] */ HRESULT hr); - - -void __RPC_STUB IResourceManager_NotifyAcquire_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IResourceManager_NotifyRelease_Proxy( - IResourceManager * This, - /* [in] */ LONG idResource, - /* [in] */ IResourceConsumer *pConsumer, - /* [in] */ BOOL bStillWant); - - -void __RPC_STUB IResourceManager_NotifyRelease_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IResourceManager_CancelRequest_Proxy( - IResourceManager * This, - /* [in] */ LONG idResource, - /* [in] */ IResourceConsumer *pConsumer); - - -void __RPC_STUB IResourceManager_CancelRequest_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IResourceManager_SetFocus_Proxy( - IResourceManager * This, - /* [in] */ IUnknown *pFocusObject); - - -void __RPC_STUB IResourceManager_SetFocus_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IResourceManager_ReleaseFocus_Proxy( - IResourceManager * This, - /* [in] */ IUnknown *pFocusObject); - - -void __RPC_STUB IResourceManager_ReleaseFocus_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IResourceManager_INTERFACE_DEFINED__ */ - - -#ifndef __IDistributorNotify_INTERFACE_DEFINED__ -#define __IDistributorNotify_INTERFACE_DEFINED__ - -/* interface IDistributorNotify */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IDistributorNotify; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56a868af-0ad4-11ce-b03a-0020af0ba770") - IDistributorNotify : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Stop( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Pause( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Run( - REFERENCE_TIME tStart) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetSyncSource( - /* [in] */ IReferenceClock *pClock) = 0; - - virtual HRESULT STDMETHODCALLTYPE NotifyGraphChange( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDistributorNotifyVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDistributorNotify * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDistributorNotify * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDistributorNotify * This); - - HRESULT ( STDMETHODCALLTYPE *Stop )( - IDistributorNotify * This); - - HRESULT ( STDMETHODCALLTYPE *Pause )( - IDistributorNotify * This); - - HRESULT ( STDMETHODCALLTYPE *Run )( - IDistributorNotify * This, - REFERENCE_TIME tStart); - - HRESULT ( STDMETHODCALLTYPE *SetSyncSource )( - IDistributorNotify * This, - /* [in] */ IReferenceClock *pClock); - - HRESULT ( STDMETHODCALLTYPE *NotifyGraphChange )( - IDistributorNotify * This); - - END_INTERFACE - } IDistributorNotifyVtbl; - - interface IDistributorNotify - { - CONST_VTBL struct IDistributorNotifyVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDistributorNotify_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDistributorNotify_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDistributorNotify_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDistributorNotify_Stop(This) \ - (This)->lpVtbl -> Stop(This) - -#define IDistributorNotify_Pause(This) \ - (This)->lpVtbl -> Pause(This) - -#define IDistributorNotify_Run(This,tStart) \ - (This)->lpVtbl -> Run(This,tStart) - -#define IDistributorNotify_SetSyncSource(This,pClock) \ - (This)->lpVtbl -> SetSyncSource(This,pClock) - -#define IDistributorNotify_NotifyGraphChange(This) \ - (This)->lpVtbl -> NotifyGraphChange(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDistributorNotify_Stop_Proxy( - IDistributorNotify * This); - - -void __RPC_STUB IDistributorNotify_Stop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDistributorNotify_Pause_Proxy( - IDistributorNotify * This); - - -void __RPC_STUB IDistributorNotify_Pause_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDistributorNotify_Run_Proxy( - IDistributorNotify * This, - REFERENCE_TIME tStart); - - -void __RPC_STUB IDistributorNotify_Run_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDistributorNotify_SetSyncSource_Proxy( - IDistributorNotify * This, - /* [in] */ IReferenceClock *pClock); - - -void __RPC_STUB IDistributorNotify_SetSyncSource_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDistributorNotify_NotifyGraphChange_Proxy( - IDistributorNotify * This); - - -void __RPC_STUB IDistributorNotify_NotifyGraphChange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDistributorNotify_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0155 */ -/* [local] */ - -typedef /* [public] */ -enum __MIDL___MIDL_itf_strmif_0155_0001 - { AM_STREAM_INFO_START_DEFINED = 0x1, - AM_STREAM_INFO_STOP_DEFINED = 0x2, - AM_STREAM_INFO_DISCARDING = 0x4, - AM_STREAM_INFO_STOP_SEND_EXTRA = 0x10 - } AM_STREAM_INFO_FLAGS; - -typedef /* [public][public] */ struct __MIDL___MIDL_itf_strmif_0155_0002 - { - REFERENCE_TIME tStart; - REFERENCE_TIME tStop; - DWORD dwStartCookie; - DWORD dwStopCookie; - DWORD dwFlags; - } AM_STREAM_INFO; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0155_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0155_v0_0_s_ifspec; - -#ifndef __IAMStreamControl_INTERFACE_DEFINED__ -#define __IAMStreamControl_INTERFACE_DEFINED__ - -/* interface IAMStreamControl */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMStreamControl; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("36b73881-c2c8-11cf-8b46-00805f6cef60") - IAMStreamControl : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE StartAt( - /* [in] */ const REFERENCE_TIME *ptStart, - /* [in] */ DWORD dwCookie) = 0; - - virtual HRESULT STDMETHODCALLTYPE StopAt( - /* [in] */ const REFERENCE_TIME *ptStop, - /* [in] */ BOOL bSendExtra, - /* [in] */ DWORD dwCookie) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInfo( - /* [out] */ AM_STREAM_INFO *pInfo) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMStreamControlVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMStreamControl * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMStreamControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMStreamControl * This); - - HRESULT ( STDMETHODCALLTYPE *StartAt )( - IAMStreamControl * This, - /* [in] */ const REFERENCE_TIME *ptStart, - /* [in] */ DWORD dwCookie); - - HRESULT ( STDMETHODCALLTYPE *StopAt )( - IAMStreamControl * This, - /* [in] */ const REFERENCE_TIME *ptStop, - /* [in] */ BOOL bSendExtra, - /* [in] */ DWORD dwCookie); - - HRESULT ( STDMETHODCALLTYPE *GetInfo )( - IAMStreamControl * This, - /* [out] */ AM_STREAM_INFO *pInfo); - - END_INTERFACE - } IAMStreamControlVtbl; - - interface IAMStreamControl - { - CONST_VTBL struct IAMStreamControlVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMStreamControl_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMStreamControl_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMStreamControl_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMStreamControl_StartAt(This,ptStart,dwCookie) \ - (This)->lpVtbl -> StartAt(This,ptStart,dwCookie) - -#define IAMStreamControl_StopAt(This,ptStop,bSendExtra,dwCookie) \ - (This)->lpVtbl -> StopAt(This,ptStop,bSendExtra,dwCookie) - -#define IAMStreamControl_GetInfo(This,pInfo) \ - (This)->lpVtbl -> GetInfo(This,pInfo) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMStreamControl_StartAt_Proxy( - IAMStreamControl * This, - /* [in] */ const REFERENCE_TIME *ptStart, - /* [in] */ DWORD dwCookie); - - -void __RPC_STUB IAMStreamControl_StartAt_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMStreamControl_StopAt_Proxy( - IAMStreamControl * This, - /* [in] */ const REFERENCE_TIME *ptStop, - /* [in] */ BOOL bSendExtra, - /* [in] */ DWORD dwCookie); - - -void __RPC_STUB IAMStreamControl_StopAt_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMStreamControl_GetInfo_Proxy( - IAMStreamControl * This, - /* [out] */ AM_STREAM_INFO *pInfo); - - -void __RPC_STUB IAMStreamControl_GetInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMStreamControl_INTERFACE_DEFINED__ */ - - -#ifndef __ISeekingPassThru_INTERFACE_DEFINED__ -#define __ISeekingPassThru_INTERFACE_DEFINED__ - -/* interface ISeekingPassThru */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_ISeekingPassThru; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("36b73883-c2c8-11cf-8b46-00805f6cef60") - ISeekingPassThru : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Init( - /* [in] */ BOOL bSupportRendering, - /* [in] */ IPin *pPin) = 0; - - }; - -#else /* C style interface */ - - typedef struct ISeekingPassThruVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ISeekingPassThru * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ISeekingPassThru * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ISeekingPassThru * This); - - HRESULT ( STDMETHODCALLTYPE *Init )( - ISeekingPassThru * This, - /* [in] */ BOOL bSupportRendering, - /* [in] */ IPin *pPin); - - END_INTERFACE - } ISeekingPassThruVtbl; - - interface ISeekingPassThru - { - CONST_VTBL struct ISeekingPassThruVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ISeekingPassThru_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ISeekingPassThru_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ISeekingPassThru_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ISeekingPassThru_Init(This,bSupportRendering,pPin) \ - (This)->lpVtbl -> Init(This,bSupportRendering,pPin) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE ISeekingPassThru_Init_Proxy( - ISeekingPassThru * This, - /* [in] */ BOOL bSupportRendering, - /* [in] */ IPin *pPin); - - -void __RPC_STUB ISeekingPassThru_Init_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ISeekingPassThru_INTERFACE_DEFINED__ */ - - -#ifndef __IAMStreamConfig_INTERFACE_DEFINED__ -#define __IAMStreamConfig_INTERFACE_DEFINED__ - -/* interface IAMStreamConfig */ -/* [unique][uuid][object] */ - -typedef struct _VIDEO_STREAM_CONFIG_CAPS - { - GUID guid; - ULONG VideoStandard; - SIZE InputSize; - SIZE MinCroppingSize; - SIZE MaxCroppingSize; - int CropGranularityX; - int CropGranularityY; - int CropAlignX; - int CropAlignY; - SIZE MinOutputSize; - SIZE MaxOutputSize; - int OutputGranularityX; - int OutputGranularityY; - int StretchTapsX; - int StretchTapsY; - int ShrinkTapsX; - int ShrinkTapsY; - LONGLONG MinFrameInterval; - LONGLONG MaxFrameInterval; - LONG MinBitsPerSecond; - LONG MaxBitsPerSecond; - } VIDEO_STREAM_CONFIG_CAPS; - -typedef struct _AUDIO_STREAM_CONFIG_CAPS - { - GUID guid; - ULONG MinimumChannels; - ULONG MaximumChannels; - ULONG ChannelsGranularity; - ULONG MinimumBitsPerSample; - ULONG MaximumBitsPerSample; - ULONG BitsPerSampleGranularity; - ULONG MinimumSampleFrequency; - ULONG MaximumSampleFrequency; - ULONG SampleFrequencyGranularity; - } AUDIO_STREAM_CONFIG_CAPS; - - -EXTERN_C const IID IID_IAMStreamConfig; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("C6E13340-30AC-11d0-A18C-00A0C9118956") - IAMStreamConfig : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetFormat( - /* [in] */ AM_MEDIA_TYPE *pmt) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFormat( - /* [out] */ AM_MEDIA_TYPE **ppmt) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNumberOfCapabilities( - /* [out] */ int *piCount, - /* [out] */ int *piSize) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetStreamCaps( - /* [in] */ int iIndex, - /* [out] */ AM_MEDIA_TYPE **ppmt, - /* [out] */ BYTE *pSCC) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMStreamConfigVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMStreamConfig * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMStreamConfig * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMStreamConfig * This); - - HRESULT ( STDMETHODCALLTYPE *SetFormat )( - IAMStreamConfig * This, - /* [in] */ AM_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *GetFormat )( - IAMStreamConfig * This, - /* [out] */ AM_MEDIA_TYPE **ppmt); - - HRESULT ( STDMETHODCALLTYPE *GetNumberOfCapabilities )( - IAMStreamConfig * This, - /* [out] */ int *piCount, - /* [out] */ int *piSize); - - HRESULT ( STDMETHODCALLTYPE *GetStreamCaps )( - IAMStreamConfig * This, - /* [in] */ int iIndex, - /* [out] */ AM_MEDIA_TYPE **ppmt, - /* [out] */ BYTE *pSCC); - - END_INTERFACE - } IAMStreamConfigVtbl; - - interface IAMStreamConfig - { - CONST_VTBL struct IAMStreamConfigVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMStreamConfig_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMStreamConfig_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMStreamConfig_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMStreamConfig_SetFormat(This,pmt) \ - (This)->lpVtbl -> SetFormat(This,pmt) - -#define IAMStreamConfig_GetFormat(This,ppmt) \ - (This)->lpVtbl -> GetFormat(This,ppmt) - -#define IAMStreamConfig_GetNumberOfCapabilities(This,piCount,piSize) \ - (This)->lpVtbl -> GetNumberOfCapabilities(This,piCount,piSize) - -#define IAMStreamConfig_GetStreamCaps(This,iIndex,ppmt,pSCC) \ - (This)->lpVtbl -> GetStreamCaps(This,iIndex,ppmt,pSCC) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMStreamConfig_SetFormat_Proxy( - IAMStreamConfig * This, - /* [in] */ AM_MEDIA_TYPE *pmt); - - -void __RPC_STUB IAMStreamConfig_SetFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMStreamConfig_GetFormat_Proxy( - IAMStreamConfig * This, - /* [out] */ AM_MEDIA_TYPE **ppmt); - - -void __RPC_STUB IAMStreamConfig_GetFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMStreamConfig_GetNumberOfCapabilities_Proxy( - IAMStreamConfig * This, - /* [out] */ int *piCount, - /* [out] */ int *piSize); - - -void __RPC_STUB IAMStreamConfig_GetNumberOfCapabilities_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMStreamConfig_GetStreamCaps_Proxy( - IAMStreamConfig * This, - /* [in] */ int iIndex, - /* [out] */ AM_MEDIA_TYPE **ppmt, - /* [out] */ BYTE *pSCC); - - -void __RPC_STUB IAMStreamConfig_GetStreamCaps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMStreamConfig_INTERFACE_DEFINED__ */ - - -#ifndef __IConfigInterleaving_INTERFACE_DEFINED__ -#define __IConfigInterleaving_INTERFACE_DEFINED__ - -/* interface IConfigInterleaving */ -/* [unique][uuid][object] */ - -typedef /* [public][public][public] */ -enum __MIDL_IConfigInterleaving_0001 - { INTERLEAVE_NONE = 0, - INTERLEAVE_CAPTURE = INTERLEAVE_NONE + 1, - INTERLEAVE_FULL = INTERLEAVE_CAPTURE + 1, - INTERLEAVE_NONE_BUFFERED = INTERLEAVE_FULL + 1 - } InterleavingMode; - - -EXTERN_C const IID IID_IConfigInterleaving; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("BEE3D220-157B-11d0-BD23-00A0C911CE86") - IConfigInterleaving : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE put_Mode( - /* [in] */ InterleavingMode mode) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Mode( - /* [out] */ InterleavingMode *pMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_Interleaving( - /* [in] */ const REFERENCE_TIME *prtInterleave, - /* [in] */ const REFERENCE_TIME *prtPreroll) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Interleaving( - /* [out] */ REFERENCE_TIME *prtInterleave, - /* [out] */ REFERENCE_TIME *prtPreroll) = 0; - - }; - -#else /* C style interface */ - - typedef struct IConfigInterleavingVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IConfigInterleaving * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IConfigInterleaving * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IConfigInterleaving * This); - - HRESULT ( STDMETHODCALLTYPE *put_Mode )( - IConfigInterleaving * This, - /* [in] */ InterleavingMode mode); - - HRESULT ( STDMETHODCALLTYPE *get_Mode )( - IConfigInterleaving * This, - /* [out] */ InterleavingMode *pMode); - - HRESULT ( STDMETHODCALLTYPE *put_Interleaving )( - IConfigInterleaving * This, - /* [in] */ const REFERENCE_TIME *prtInterleave, - /* [in] */ const REFERENCE_TIME *prtPreroll); - - HRESULT ( STDMETHODCALLTYPE *get_Interleaving )( - IConfigInterleaving * This, - /* [out] */ REFERENCE_TIME *prtInterleave, - /* [out] */ REFERENCE_TIME *prtPreroll); - - END_INTERFACE - } IConfigInterleavingVtbl; - - interface IConfigInterleaving - { - CONST_VTBL struct IConfigInterleavingVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IConfigInterleaving_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IConfigInterleaving_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IConfigInterleaving_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IConfigInterleaving_put_Mode(This,mode) \ - (This)->lpVtbl -> put_Mode(This,mode) - -#define IConfigInterleaving_get_Mode(This,pMode) \ - (This)->lpVtbl -> get_Mode(This,pMode) - -#define IConfigInterleaving_put_Interleaving(This,prtInterleave,prtPreroll) \ - (This)->lpVtbl -> put_Interleaving(This,prtInterleave,prtPreroll) - -#define IConfigInterleaving_get_Interleaving(This,prtInterleave,prtPreroll) \ - (This)->lpVtbl -> get_Interleaving(This,prtInterleave,prtPreroll) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IConfigInterleaving_put_Mode_Proxy( - IConfigInterleaving * This, - /* [in] */ InterleavingMode mode); - - -void __RPC_STUB IConfigInterleaving_put_Mode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IConfigInterleaving_get_Mode_Proxy( - IConfigInterleaving * This, - /* [out] */ InterleavingMode *pMode); - - -void __RPC_STUB IConfigInterleaving_get_Mode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IConfigInterleaving_put_Interleaving_Proxy( - IConfigInterleaving * This, - /* [in] */ const REFERENCE_TIME *prtInterleave, - /* [in] */ const REFERENCE_TIME *prtPreroll); - - -void __RPC_STUB IConfigInterleaving_put_Interleaving_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IConfigInterleaving_get_Interleaving_Proxy( - IConfigInterleaving * This, - /* [out] */ REFERENCE_TIME *prtInterleave, - /* [out] */ REFERENCE_TIME *prtPreroll); - - -void __RPC_STUB IConfigInterleaving_get_Interleaving_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IConfigInterleaving_INTERFACE_DEFINED__ */ - - -#ifndef __IConfigAviMux_INTERFACE_DEFINED__ -#define __IConfigAviMux_INTERFACE_DEFINED__ - -/* interface IConfigAviMux */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IConfigAviMux; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("5ACD6AA0-F482-11ce-8B67-00AA00A3F1A6") - IConfigAviMux : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetMasterStream( - /* [in] */ LONG iStream) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMasterStream( - /* [out] */ LONG *pStream) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetOutputCompatibilityIndex( - /* [in] */ BOOL fOldIndex) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetOutputCompatibilityIndex( - /* [out] */ BOOL *pfOldIndex) = 0; - - }; - -#else /* C style interface */ - - typedef struct IConfigAviMuxVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IConfigAviMux * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IConfigAviMux * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IConfigAviMux * This); - - HRESULT ( STDMETHODCALLTYPE *SetMasterStream )( - IConfigAviMux * This, - /* [in] */ LONG iStream); - - HRESULT ( STDMETHODCALLTYPE *GetMasterStream )( - IConfigAviMux * This, - /* [out] */ LONG *pStream); - - HRESULT ( STDMETHODCALLTYPE *SetOutputCompatibilityIndex )( - IConfigAviMux * This, - /* [in] */ BOOL fOldIndex); - - HRESULT ( STDMETHODCALLTYPE *GetOutputCompatibilityIndex )( - IConfigAviMux * This, - /* [out] */ BOOL *pfOldIndex); - - END_INTERFACE - } IConfigAviMuxVtbl; - - interface IConfigAviMux - { - CONST_VTBL struct IConfigAviMuxVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IConfigAviMux_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IConfigAviMux_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IConfigAviMux_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IConfigAviMux_SetMasterStream(This,iStream) \ - (This)->lpVtbl -> SetMasterStream(This,iStream) - -#define IConfigAviMux_GetMasterStream(This,pStream) \ - (This)->lpVtbl -> GetMasterStream(This,pStream) - -#define IConfigAviMux_SetOutputCompatibilityIndex(This,fOldIndex) \ - (This)->lpVtbl -> SetOutputCompatibilityIndex(This,fOldIndex) - -#define IConfigAviMux_GetOutputCompatibilityIndex(This,pfOldIndex) \ - (This)->lpVtbl -> GetOutputCompatibilityIndex(This,pfOldIndex) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IConfigAviMux_SetMasterStream_Proxy( - IConfigAviMux * This, - /* [in] */ LONG iStream); - - -void __RPC_STUB IConfigAviMux_SetMasterStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IConfigAviMux_GetMasterStream_Proxy( - IConfigAviMux * This, - /* [out] */ LONG *pStream); - - -void __RPC_STUB IConfigAviMux_GetMasterStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IConfigAviMux_SetOutputCompatibilityIndex_Proxy( - IConfigAviMux * This, - /* [in] */ BOOL fOldIndex); - - -void __RPC_STUB IConfigAviMux_SetOutputCompatibilityIndex_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IConfigAviMux_GetOutputCompatibilityIndex_Proxy( - IConfigAviMux * This, - /* [out] */ BOOL *pfOldIndex); - - -void __RPC_STUB IConfigAviMux_GetOutputCompatibilityIndex_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IConfigAviMux_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0162 */ -/* [local] */ - -typedef /* [public] */ -enum __MIDL___MIDL_itf_strmif_0162_0001 - { CompressionCaps_CanQuality = 0x1, - CompressionCaps_CanCrunch = 0x2, - CompressionCaps_CanKeyFrame = 0x4, - CompressionCaps_CanBFrame = 0x8, - CompressionCaps_CanWindow = 0x10 - } CompressionCaps; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0162_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0162_v0_0_s_ifspec; - -#ifndef __IAMVideoCompression_INTERFACE_DEFINED__ -#define __IAMVideoCompression_INTERFACE_DEFINED__ - -/* interface IAMVideoCompression */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMVideoCompression; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("C6E13343-30AC-11d0-A18C-00A0C9118956") - IAMVideoCompression : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE put_KeyFrameRate( - /* [in] */ long KeyFrameRate) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_KeyFrameRate( - /* [out] */ long *pKeyFrameRate) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_PFramesPerKeyFrame( - /* [in] */ long PFramesPerKeyFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_PFramesPerKeyFrame( - /* [out] */ long *pPFramesPerKeyFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_Quality( - /* [in] */ double Quality) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Quality( - /* [out] */ double *pQuality) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_WindowSize( - /* [in] */ DWORDLONG WindowSize) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_WindowSize( - /* [out] */ DWORDLONG *pWindowSize) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInfo( - /* [size_is][out] */ WCHAR *pszVersion, - /* [out][in] */ int *pcbVersion, - /* [size_is][out] */ LPWSTR pszDescription, - /* [out][in] */ int *pcbDescription, - /* [out] */ long *pDefaultKeyFrameRate, - /* [out] */ long *pDefaultPFramesPerKey, - /* [out] */ double *pDefaultQuality, - /* [out] */ long *pCapabilities) = 0; - - virtual HRESULT STDMETHODCALLTYPE OverrideKeyFrame( - /* [in] */ long FrameNumber) = 0; - - virtual HRESULT STDMETHODCALLTYPE OverrideFrameSize( - /* [in] */ long FrameNumber, - /* [in] */ long Size) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMVideoCompressionVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMVideoCompression * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMVideoCompression * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMVideoCompression * This); - - HRESULT ( STDMETHODCALLTYPE *put_KeyFrameRate )( - IAMVideoCompression * This, - /* [in] */ long KeyFrameRate); - - HRESULT ( STDMETHODCALLTYPE *get_KeyFrameRate )( - IAMVideoCompression * This, - /* [out] */ long *pKeyFrameRate); - - HRESULT ( STDMETHODCALLTYPE *put_PFramesPerKeyFrame )( - IAMVideoCompression * This, - /* [in] */ long PFramesPerKeyFrame); - - HRESULT ( STDMETHODCALLTYPE *get_PFramesPerKeyFrame )( - IAMVideoCompression * This, - /* [out] */ long *pPFramesPerKeyFrame); - - HRESULT ( STDMETHODCALLTYPE *put_Quality )( - IAMVideoCompression * This, - /* [in] */ double Quality); - - HRESULT ( STDMETHODCALLTYPE *get_Quality )( - IAMVideoCompression * This, - /* [out] */ double *pQuality); - - HRESULT ( STDMETHODCALLTYPE *put_WindowSize )( - IAMVideoCompression * This, - /* [in] */ DWORDLONG WindowSize); - - HRESULT ( STDMETHODCALLTYPE *get_WindowSize )( - IAMVideoCompression * This, - /* [out] */ DWORDLONG *pWindowSize); - - HRESULT ( STDMETHODCALLTYPE *GetInfo )( - IAMVideoCompression * This, - /* [size_is][out] */ WCHAR *pszVersion, - /* [out][in] */ int *pcbVersion, - /* [size_is][out] */ LPWSTR pszDescription, - /* [out][in] */ int *pcbDescription, - /* [out] */ long *pDefaultKeyFrameRate, - /* [out] */ long *pDefaultPFramesPerKey, - /* [out] */ double *pDefaultQuality, - /* [out] */ long *pCapabilities); - - HRESULT ( STDMETHODCALLTYPE *OverrideKeyFrame )( - IAMVideoCompression * This, - /* [in] */ long FrameNumber); - - HRESULT ( STDMETHODCALLTYPE *OverrideFrameSize )( - IAMVideoCompression * This, - /* [in] */ long FrameNumber, - /* [in] */ long Size); - - END_INTERFACE - } IAMVideoCompressionVtbl; - - interface IAMVideoCompression - { - CONST_VTBL struct IAMVideoCompressionVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMVideoCompression_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMVideoCompression_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMVideoCompression_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMVideoCompression_put_KeyFrameRate(This,KeyFrameRate) \ - (This)->lpVtbl -> put_KeyFrameRate(This,KeyFrameRate) - -#define IAMVideoCompression_get_KeyFrameRate(This,pKeyFrameRate) \ - (This)->lpVtbl -> get_KeyFrameRate(This,pKeyFrameRate) - -#define IAMVideoCompression_put_PFramesPerKeyFrame(This,PFramesPerKeyFrame) \ - (This)->lpVtbl -> put_PFramesPerKeyFrame(This,PFramesPerKeyFrame) - -#define IAMVideoCompression_get_PFramesPerKeyFrame(This,pPFramesPerKeyFrame) \ - (This)->lpVtbl -> get_PFramesPerKeyFrame(This,pPFramesPerKeyFrame) - -#define IAMVideoCompression_put_Quality(This,Quality) \ - (This)->lpVtbl -> put_Quality(This,Quality) - -#define IAMVideoCompression_get_Quality(This,pQuality) \ - (This)->lpVtbl -> get_Quality(This,pQuality) - -#define IAMVideoCompression_put_WindowSize(This,WindowSize) \ - (This)->lpVtbl -> put_WindowSize(This,WindowSize) - -#define IAMVideoCompression_get_WindowSize(This,pWindowSize) \ - (This)->lpVtbl -> get_WindowSize(This,pWindowSize) - -#define IAMVideoCompression_GetInfo(This,pszVersion,pcbVersion,pszDescription,pcbDescription,pDefaultKeyFrameRate,pDefaultPFramesPerKey,pDefaultQuality,pCapabilities) \ - (This)->lpVtbl -> GetInfo(This,pszVersion,pcbVersion,pszDescription,pcbDescription,pDefaultKeyFrameRate,pDefaultPFramesPerKey,pDefaultQuality,pCapabilities) - -#define IAMVideoCompression_OverrideKeyFrame(This,FrameNumber) \ - (This)->lpVtbl -> OverrideKeyFrame(This,FrameNumber) - -#define IAMVideoCompression_OverrideFrameSize(This,FrameNumber,Size) \ - (This)->lpVtbl -> OverrideFrameSize(This,FrameNumber,Size) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMVideoCompression_put_KeyFrameRate_Proxy( - IAMVideoCompression * This, - /* [in] */ long KeyFrameRate); - - -void __RPC_STUB IAMVideoCompression_put_KeyFrameRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoCompression_get_KeyFrameRate_Proxy( - IAMVideoCompression * This, - /* [out] */ long *pKeyFrameRate); - - -void __RPC_STUB IAMVideoCompression_get_KeyFrameRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoCompression_put_PFramesPerKeyFrame_Proxy( - IAMVideoCompression * This, - /* [in] */ long PFramesPerKeyFrame); - - -void __RPC_STUB IAMVideoCompression_put_PFramesPerKeyFrame_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoCompression_get_PFramesPerKeyFrame_Proxy( - IAMVideoCompression * This, - /* [out] */ long *pPFramesPerKeyFrame); - - -void __RPC_STUB IAMVideoCompression_get_PFramesPerKeyFrame_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoCompression_put_Quality_Proxy( - IAMVideoCompression * This, - /* [in] */ double Quality); - - -void __RPC_STUB IAMVideoCompression_put_Quality_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoCompression_get_Quality_Proxy( - IAMVideoCompression * This, - /* [out] */ double *pQuality); - - -void __RPC_STUB IAMVideoCompression_get_Quality_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoCompression_put_WindowSize_Proxy( - IAMVideoCompression * This, - /* [in] */ DWORDLONG WindowSize); - - -void __RPC_STUB IAMVideoCompression_put_WindowSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoCompression_get_WindowSize_Proxy( - IAMVideoCompression * This, - /* [out] */ DWORDLONG *pWindowSize); - - -void __RPC_STUB IAMVideoCompression_get_WindowSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoCompression_GetInfo_Proxy( - IAMVideoCompression * This, - /* [size_is][out] */ WCHAR *pszVersion, - /* [out][in] */ int *pcbVersion, - /* [size_is][out] */ LPWSTR pszDescription, - /* [out][in] */ int *pcbDescription, - /* [out] */ long *pDefaultKeyFrameRate, - /* [out] */ long *pDefaultPFramesPerKey, - /* [out] */ double *pDefaultQuality, - /* [out] */ long *pCapabilities); - - -void __RPC_STUB IAMVideoCompression_GetInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoCompression_OverrideKeyFrame_Proxy( - IAMVideoCompression * This, - /* [in] */ long FrameNumber); - - -void __RPC_STUB IAMVideoCompression_OverrideKeyFrame_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoCompression_OverrideFrameSize_Proxy( - IAMVideoCompression * This, - /* [in] */ long FrameNumber, - /* [in] */ long Size); - - -void __RPC_STUB IAMVideoCompression_OverrideFrameSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMVideoCompression_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0163 */ -/* [local] */ - -typedef /* [public] */ -enum __MIDL___MIDL_itf_strmif_0163_0001 - { VfwCaptureDialog_Source = 0x1, - VfwCaptureDialog_Format = 0x2, - VfwCaptureDialog_Display = 0x4 - } VfwCaptureDialogs; - -typedef /* [public] */ -enum __MIDL___MIDL_itf_strmif_0163_0002 - { VfwCompressDialog_Config = 0x1, - VfwCompressDialog_About = 0x2, - VfwCompressDialog_QueryConfig = 0x4, - VfwCompressDialog_QueryAbout = 0x8 - } VfwCompressDialogs; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0163_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0163_v0_0_s_ifspec; - -#ifndef __IAMVfwCaptureDialogs_INTERFACE_DEFINED__ -#define __IAMVfwCaptureDialogs_INTERFACE_DEFINED__ - -/* interface IAMVfwCaptureDialogs */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IAMVfwCaptureDialogs; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("D8D715A0-6E5E-11D0-B3F0-00AA003761C5") - IAMVfwCaptureDialogs : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE HasDialog( - /* [in] */ int iDialog) = 0; - - virtual HRESULT STDMETHODCALLTYPE ShowDialog( - /* [in] */ int iDialog, - /* [in] */ HWND hwnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SendDriverMessage( - /* [in] */ int iDialog, - /* [in] */ int uMsg, - /* [in] */ long dw1, - /* [in] */ long dw2) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMVfwCaptureDialogsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMVfwCaptureDialogs * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMVfwCaptureDialogs * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMVfwCaptureDialogs * This); - - HRESULT ( STDMETHODCALLTYPE *HasDialog )( - IAMVfwCaptureDialogs * This, - /* [in] */ int iDialog); - - HRESULT ( STDMETHODCALLTYPE *ShowDialog )( - IAMVfwCaptureDialogs * This, - /* [in] */ int iDialog, - /* [in] */ HWND hwnd); - - HRESULT ( STDMETHODCALLTYPE *SendDriverMessage )( - IAMVfwCaptureDialogs * This, - /* [in] */ int iDialog, - /* [in] */ int uMsg, - /* [in] */ long dw1, - /* [in] */ long dw2); - - END_INTERFACE - } IAMVfwCaptureDialogsVtbl; - - interface IAMVfwCaptureDialogs - { - CONST_VTBL struct IAMVfwCaptureDialogsVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMVfwCaptureDialogs_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMVfwCaptureDialogs_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMVfwCaptureDialogs_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMVfwCaptureDialogs_HasDialog(This,iDialog) \ - (This)->lpVtbl -> HasDialog(This,iDialog) - -#define IAMVfwCaptureDialogs_ShowDialog(This,iDialog,hwnd) \ - (This)->lpVtbl -> ShowDialog(This,iDialog,hwnd) - -#define IAMVfwCaptureDialogs_SendDriverMessage(This,iDialog,uMsg,dw1,dw2) \ - (This)->lpVtbl -> SendDriverMessage(This,iDialog,uMsg,dw1,dw2) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMVfwCaptureDialogs_HasDialog_Proxy( - IAMVfwCaptureDialogs * This, - /* [in] */ int iDialog); - - -void __RPC_STUB IAMVfwCaptureDialogs_HasDialog_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVfwCaptureDialogs_ShowDialog_Proxy( - IAMVfwCaptureDialogs * This, - /* [in] */ int iDialog, - /* [in] */ HWND hwnd); - - -void __RPC_STUB IAMVfwCaptureDialogs_ShowDialog_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVfwCaptureDialogs_SendDriverMessage_Proxy( - IAMVfwCaptureDialogs * This, - /* [in] */ int iDialog, - /* [in] */ int uMsg, - /* [in] */ long dw1, - /* [in] */ long dw2); - - -void __RPC_STUB IAMVfwCaptureDialogs_SendDriverMessage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMVfwCaptureDialogs_INTERFACE_DEFINED__ */ - - -#ifndef __IAMVfwCompressDialogs_INTERFACE_DEFINED__ -#define __IAMVfwCompressDialogs_INTERFACE_DEFINED__ - -/* interface IAMVfwCompressDialogs */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IAMVfwCompressDialogs; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("D8D715A3-6E5E-11D0-B3F0-00AA003761C5") - IAMVfwCompressDialogs : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE ShowDialog( - /* [in] */ int iDialog, - /* [in] */ HWND hwnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetState( - /* [size_is][out] */ LPVOID pState, - /* [out][in] */ int *pcbState) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetState( - /* [size_is][in] */ LPVOID pState, - /* [in] */ int cbState) = 0; - - virtual HRESULT STDMETHODCALLTYPE SendDriverMessage( - /* [in] */ int uMsg, - /* [in] */ long dw1, - /* [in] */ long dw2) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMVfwCompressDialogsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMVfwCompressDialogs * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMVfwCompressDialogs * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMVfwCompressDialogs * This); - - HRESULT ( STDMETHODCALLTYPE *ShowDialog )( - IAMVfwCompressDialogs * This, - /* [in] */ int iDialog, - /* [in] */ HWND hwnd); - - HRESULT ( STDMETHODCALLTYPE *GetState )( - IAMVfwCompressDialogs * This, - /* [size_is][out] */ LPVOID pState, - /* [out][in] */ int *pcbState); - - HRESULT ( STDMETHODCALLTYPE *SetState )( - IAMVfwCompressDialogs * This, - /* [size_is][in] */ LPVOID pState, - /* [in] */ int cbState); - - HRESULT ( STDMETHODCALLTYPE *SendDriverMessage )( - IAMVfwCompressDialogs * This, - /* [in] */ int uMsg, - /* [in] */ long dw1, - /* [in] */ long dw2); - - END_INTERFACE - } IAMVfwCompressDialogsVtbl; - - interface IAMVfwCompressDialogs - { - CONST_VTBL struct IAMVfwCompressDialogsVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMVfwCompressDialogs_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMVfwCompressDialogs_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMVfwCompressDialogs_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMVfwCompressDialogs_ShowDialog(This,iDialog,hwnd) \ - (This)->lpVtbl -> ShowDialog(This,iDialog,hwnd) - -#define IAMVfwCompressDialogs_GetState(This,pState,pcbState) \ - (This)->lpVtbl -> GetState(This,pState,pcbState) - -#define IAMVfwCompressDialogs_SetState(This,pState,cbState) \ - (This)->lpVtbl -> SetState(This,pState,cbState) - -#define IAMVfwCompressDialogs_SendDriverMessage(This,uMsg,dw1,dw2) \ - (This)->lpVtbl -> SendDriverMessage(This,uMsg,dw1,dw2) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMVfwCompressDialogs_ShowDialog_Proxy( - IAMVfwCompressDialogs * This, - /* [in] */ int iDialog, - /* [in] */ HWND hwnd); - - -void __RPC_STUB IAMVfwCompressDialogs_ShowDialog_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVfwCompressDialogs_GetState_Proxy( - IAMVfwCompressDialogs * This, - /* [size_is][out] */ LPVOID pState, - /* [out][in] */ int *pcbState); - - -void __RPC_STUB IAMVfwCompressDialogs_GetState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVfwCompressDialogs_SetState_Proxy( - IAMVfwCompressDialogs * This, - /* [size_is][in] */ LPVOID pState, - /* [in] */ int cbState); - - -void __RPC_STUB IAMVfwCompressDialogs_SetState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVfwCompressDialogs_SendDriverMessage_Proxy( - IAMVfwCompressDialogs * This, - /* [in] */ int uMsg, - /* [in] */ long dw1, - /* [in] */ long dw2); - - -void __RPC_STUB IAMVfwCompressDialogs_SendDriverMessage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMVfwCompressDialogs_INTERFACE_DEFINED__ */ - - -#ifndef __IAMDroppedFrames_INTERFACE_DEFINED__ -#define __IAMDroppedFrames_INTERFACE_DEFINED__ - -/* interface IAMDroppedFrames */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMDroppedFrames; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("C6E13344-30AC-11d0-A18C-00A0C9118956") - IAMDroppedFrames : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetNumDropped( - /* [out] */ long *plDropped) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNumNotDropped( - /* [out] */ long *plNotDropped) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDroppedInfo( - /* [in] */ long lSize, - /* [out] */ long *plArray, - /* [out] */ long *plNumCopied) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAverageFrameSize( - /* [out] */ long *plAverageSize) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMDroppedFramesVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMDroppedFrames * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMDroppedFrames * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMDroppedFrames * This); - - HRESULT ( STDMETHODCALLTYPE *GetNumDropped )( - IAMDroppedFrames * This, - /* [out] */ long *plDropped); - - HRESULT ( STDMETHODCALLTYPE *GetNumNotDropped )( - IAMDroppedFrames * This, - /* [out] */ long *plNotDropped); - - HRESULT ( STDMETHODCALLTYPE *GetDroppedInfo )( - IAMDroppedFrames * This, - /* [in] */ long lSize, - /* [out] */ long *plArray, - /* [out] */ long *plNumCopied); - - HRESULT ( STDMETHODCALLTYPE *GetAverageFrameSize )( - IAMDroppedFrames * This, - /* [out] */ long *plAverageSize); - - END_INTERFACE - } IAMDroppedFramesVtbl; - - interface IAMDroppedFrames - { - CONST_VTBL struct IAMDroppedFramesVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMDroppedFrames_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMDroppedFrames_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMDroppedFrames_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMDroppedFrames_GetNumDropped(This,plDropped) \ - (This)->lpVtbl -> GetNumDropped(This,plDropped) - -#define IAMDroppedFrames_GetNumNotDropped(This,plNotDropped) \ - (This)->lpVtbl -> GetNumNotDropped(This,plNotDropped) - -#define IAMDroppedFrames_GetDroppedInfo(This,lSize,plArray,plNumCopied) \ - (This)->lpVtbl -> GetDroppedInfo(This,lSize,plArray,plNumCopied) - -#define IAMDroppedFrames_GetAverageFrameSize(This,plAverageSize) \ - (This)->lpVtbl -> GetAverageFrameSize(This,plAverageSize) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMDroppedFrames_GetNumDropped_Proxy( - IAMDroppedFrames * This, - /* [out] */ long *plDropped); - - -void __RPC_STUB IAMDroppedFrames_GetNumDropped_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMDroppedFrames_GetNumNotDropped_Proxy( - IAMDroppedFrames * This, - /* [out] */ long *plNotDropped); - - -void __RPC_STUB IAMDroppedFrames_GetNumNotDropped_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMDroppedFrames_GetDroppedInfo_Proxy( - IAMDroppedFrames * This, - /* [in] */ long lSize, - /* [out] */ long *plArray, - /* [out] */ long *plNumCopied); - - -void __RPC_STUB IAMDroppedFrames_GetDroppedInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMDroppedFrames_GetAverageFrameSize_Proxy( - IAMDroppedFrames * This, - /* [out] */ long *plAverageSize); - - -void __RPC_STUB IAMDroppedFrames_GetAverageFrameSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMDroppedFrames_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0166 */ -/* [local] */ - -#define AMF_AUTOMATICGAIN -1.0 - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0166_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0166_v0_0_s_ifspec; - -#ifndef __IAMAudioInputMixer_INTERFACE_DEFINED__ -#define __IAMAudioInputMixer_INTERFACE_DEFINED__ - -/* interface IAMAudioInputMixer */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMAudioInputMixer; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("54C39221-8380-11d0-B3F0-00AA003761C5") - IAMAudioInputMixer : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE put_Enable( - /* [in] */ BOOL fEnable) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Enable( - /* [out] */ BOOL *pfEnable) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_Mono( - /* [in] */ BOOL fMono) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Mono( - /* [out] */ BOOL *pfMono) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_MixLevel( - /* [in] */ double Level) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_MixLevel( - /* [out] */ double *pLevel) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_Pan( - /* [in] */ double Pan) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Pan( - /* [out] */ double *pPan) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_Loudness( - /* [in] */ BOOL fLoudness) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Loudness( - /* [out] */ BOOL *pfLoudness) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_Treble( - /* [in] */ double Treble) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Treble( - /* [out] */ double *pTreble) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_TrebleRange( - /* [out] */ double *pRange) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_Bass( - /* [in] */ double Bass) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Bass( - /* [out] */ double *pBass) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_BassRange( - /* [out] */ double *pRange) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMAudioInputMixerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMAudioInputMixer * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMAudioInputMixer * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMAudioInputMixer * This); - - HRESULT ( STDMETHODCALLTYPE *put_Enable )( - IAMAudioInputMixer * This, - /* [in] */ BOOL fEnable); - - HRESULT ( STDMETHODCALLTYPE *get_Enable )( - IAMAudioInputMixer * This, - /* [out] */ BOOL *pfEnable); - - HRESULT ( STDMETHODCALLTYPE *put_Mono )( - IAMAudioInputMixer * This, - /* [in] */ BOOL fMono); - - HRESULT ( STDMETHODCALLTYPE *get_Mono )( - IAMAudioInputMixer * This, - /* [out] */ BOOL *pfMono); - - HRESULT ( STDMETHODCALLTYPE *put_MixLevel )( - IAMAudioInputMixer * This, - /* [in] */ double Level); - - HRESULT ( STDMETHODCALLTYPE *get_MixLevel )( - IAMAudioInputMixer * This, - /* [out] */ double *pLevel); - - HRESULT ( STDMETHODCALLTYPE *put_Pan )( - IAMAudioInputMixer * This, - /* [in] */ double Pan); - - HRESULT ( STDMETHODCALLTYPE *get_Pan )( - IAMAudioInputMixer * This, - /* [out] */ double *pPan); - - HRESULT ( STDMETHODCALLTYPE *put_Loudness )( - IAMAudioInputMixer * This, - /* [in] */ BOOL fLoudness); - - HRESULT ( STDMETHODCALLTYPE *get_Loudness )( - IAMAudioInputMixer * This, - /* [out] */ BOOL *pfLoudness); - - HRESULT ( STDMETHODCALLTYPE *put_Treble )( - IAMAudioInputMixer * This, - /* [in] */ double Treble); - - HRESULT ( STDMETHODCALLTYPE *get_Treble )( - IAMAudioInputMixer * This, - /* [out] */ double *pTreble); - - HRESULT ( STDMETHODCALLTYPE *get_TrebleRange )( - IAMAudioInputMixer * This, - /* [out] */ double *pRange); - - HRESULT ( STDMETHODCALLTYPE *put_Bass )( - IAMAudioInputMixer * This, - /* [in] */ double Bass); - - HRESULT ( STDMETHODCALLTYPE *get_Bass )( - IAMAudioInputMixer * This, - /* [out] */ double *pBass); - - HRESULT ( STDMETHODCALLTYPE *get_BassRange )( - IAMAudioInputMixer * This, - /* [out] */ double *pRange); - - END_INTERFACE - } IAMAudioInputMixerVtbl; - - interface IAMAudioInputMixer - { - CONST_VTBL struct IAMAudioInputMixerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMAudioInputMixer_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMAudioInputMixer_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMAudioInputMixer_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMAudioInputMixer_put_Enable(This,fEnable) \ - (This)->lpVtbl -> put_Enable(This,fEnable) - -#define IAMAudioInputMixer_get_Enable(This,pfEnable) \ - (This)->lpVtbl -> get_Enable(This,pfEnable) - -#define IAMAudioInputMixer_put_Mono(This,fMono) \ - (This)->lpVtbl -> put_Mono(This,fMono) - -#define IAMAudioInputMixer_get_Mono(This,pfMono) \ - (This)->lpVtbl -> get_Mono(This,pfMono) - -#define IAMAudioInputMixer_put_MixLevel(This,Level) \ - (This)->lpVtbl -> put_MixLevel(This,Level) - -#define IAMAudioInputMixer_get_MixLevel(This,pLevel) \ - (This)->lpVtbl -> get_MixLevel(This,pLevel) - -#define IAMAudioInputMixer_put_Pan(This,Pan) \ - (This)->lpVtbl -> put_Pan(This,Pan) - -#define IAMAudioInputMixer_get_Pan(This,pPan) \ - (This)->lpVtbl -> get_Pan(This,pPan) - -#define IAMAudioInputMixer_put_Loudness(This,fLoudness) \ - (This)->lpVtbl -> put_Loudness(This,fLoudness) - -#define IAMAudioInputMixer_get_Loudness(This,pfLoudness) \ - (This)->lpVtbl -> get_Loudness(This,pfLoudness) - -#define IAMAudioInputMixer_put_Treble(This,Treble) \ - (This)->lpVtbl -> put_Treble(This,Treble) - -#define IAMAudioInputMixer_get_Treble(This,pTreble) \ - (This)->lpVtbl -> get_Treble(This,pTreble) - -#define IAMAudioInputMixer_get_TrebleRange(This,pRange) \ - (This)->lpVtbl -> get_TrebleRange(This,pRange) - -#define IAMAudioInputMixer_put_Bass(This,Bass) \ - (This)->lpVtbl -> put_Bass(This,Bass) - -#define IAMAudioInputMixer_get_Bass(This,pBass) \ - (This)->lpVtbl -> get_Bass(This,pBass) - -#define IAMAudioInputMixer_get_BassRange(This,pRange) \ - (This)->lpVtbl -> get_BassRange(This,pRange) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMAudioInputMixer_put_Enable_Proxy( - IAMAudioInputMixer * This, - /* [in] */ BOOL fEnable); - - -void __RPC_STUB IAMAudioInputMixer_put_Enable_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAudioInputMixer_get_Enable_Proxy( - IAMAudioInputMixer * This, - /* [out] */ BOOL *pfEnable); - - -void __RPC_STUB IAMAudioInputMixer_get_Enable_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAudioInputMixer_put_Mono_Proxy( - IAMAudioInputMixer * This, - /* [in] */ BOOL fMono); - - -void __RPC_STUB IAMAudioInputMixer_put_Mono_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAudioInputMixer_get_Mono_Proxy( - IAMAudioInputMixer * This, - /* [out] */ BOOL *pfMono); - - -void __RPC_STUB IAMAudioInputMixer_get_Mono_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAudioInputMixer_put_MixLevel_Proxy( - IAMAudioInputMixer * This, - /* [in] */ double Level); - - -void __RPC_STUB IAMAudioInputMixer_put_MixLevel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAudioInputMixer_get_MixLevel_Proxy( - IAMAudioInputMixer * This, - /* [out] */ double *pLevel); - - -void __RPC_STUB IAMAudioInputMixer_get_MixLevel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAudioInputMixer_put_Pan_Proxy( - IAMAudioInputMixer * This, - /* [in] */ double Pan); - - -void __RPC_STUB IAMAudioInputMixer_put_Pan_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAudioInputMixer_get_Pan_Proxy( - IAMAudioInputMixer * This, - /* [out] */ double *pPan); - - -void __RPC_STUB IAMAudioInputMixer_get_Pan_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAudioInputMixer_put_Loudness_Proxy( - IAMAudioInputMixer * This, - /* [in] */ BOOL fLoudness); - - -void __RPC_STUB IAMAudioInputMixer_put_Loudness_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAudioInputMixer_get_Loudness_Proxy( - IAMAudioInputMixer * This, - /* [out] */ BOOL *pfLoudness); - - -void __RPC_STUB IAMAudioInputMixer_get_Loudness_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAudioInputMixer_put_Treble_Proxy( - IAMAudioInputMixer * This, - /* [in] */ double Treble); - - -void __RPC_STUB IAMAudioInputMixer_put_Treble_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAudioInputMixer_get_Treble_Proxy( - IAMAudioInputMixer * This, - /* [out] */ double *pTreble); - - -void __RPC_STUB IAMAudioInputMixer_get_Treble_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAudioInputMixer_get_TrebleRange_Proxy( - IAMAudioInputMixer * This, - /* [out] */ double *pRange); - - -void __RPC_STUB IAMAudioInputMixer_get_TrebleRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAudioInputMixer_put_Bass_Proxy( - IAMAudioInputMixer * This, - /* [in] */ double Bass); - - -void __RPC_STUB IAMAudioInputMixer_put_Bass_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAudioInputMixer_get_Bass_Proxy( - IAMAudioInputMixer * This, - /* [out] */ double *pBass); - - -void __RPC_STUB IAMAudioInputMixer_get_Bass_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAudioInputMixer_get_BassRange_Proxy( - IAMAudioInputMixer * This, - /* [out] */ double *pRange); - - -void __RPC_STUB IAMAudioInputMixer_get_BassRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMAudioInputMixer_INTERFACE_DEFINED__ */ - - -#ifndef __IAMBufferNegotiation_INTERFACE_DEFINED__ -#define __IAMBufferNegotiation_INTERFACE_DEFINED__ - -/* interface IAMBufferNegotiation */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMBufferNegotiation; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("56ED71A0-AF5F-11D0-B3F0-00AA003761C5") - IAMBufferNegotiation : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SuggestAllocatorProperties( - /* [in] */ const ALLOCATOR_PROPERTIES *pprop) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAllocatorProperties( - /* [out] */ ALLOCATOR_PROPERTIES *pprop) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMBufferNegotiationVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMBufferNegotiation * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMBufferNegotiation * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMBufferNegotiation * This); - - HRESULT ( STDMETHODCALLTYPE *SuggestAllocatorProperties )( - IAMBufferNegotiation * This, - /* [in] */ const ALLOCATOR_PROPERTIES *pprop); - - HRESULT ( STDMETHODCALLTYPE *GetAllocatorProperties )( - IAMBufferNegotiation * This, - /* [out] */ ALLOCATOR_PROPERTIES *pprop); - - END_INTERFACE - } IAMBufferNegotiationVtbl; - - interface IAMBufferNegotiation - { - CONST_VTBL struct IAMBufferNegotiationVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMBufferNegotiation_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMBufferNegotiation_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMBufferNegotiation_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMBufferNegotiation_SuggestAllocatorProperties(This,pprop) \ - (This)->lpVtbl -> SuggestAllocatorProperties(This,pprop) - -#define IAMBufferNegotiation_GetAllocatorProperties(This,pprop) \ - (This)->lpVtbl -> GetAllocatorProperties(This,pprop) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMBufferNegotiation_SuggestAllocatorProperties_Proxy( - IAMBufferNegotiation * This, - /* [in] */ const ALLOCATOR_PROPERTIES *pprop); - - -void __RPC_STUB IAMBufferNegotiation_SuggestAllocatorProperties_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMBufferNegotiation_GetAllocatorProperties_Proxy( - IAMBufferNegotiation * This, - /* [out] */ ALLOCATOR_PROPERTIES *pprop); - - -void __RPC_STUB IAMBufferNegotiation_GetAllocatorProperties_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMBufferNegotiation_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0168 */ -/* [local] */ - -typedef -enum tagAnalogVideoStandard - { AnalogVideo_None = 0, - AnalogVideo_NTSC_M = 0x1, - AnalogVideo_NTSC_M_J = 0x2, - AnalogVideo_NTSC_433 = 0x4, - AnalogVideo_PAL_B = 0x10, - AnalogVideo_PAL_D = 0x20, - AnalogVideo_PAL_G = 0x40, - AnalogVideo_PAL_H = 0x80, - AnalogVideo_PAL_I = 0x100, - AnalogVideo_PAL_M = 0x200, - AnalogVideo_PAL_N = 0x400, - AnalogVideo_PAL_60 = 0x800, - AnalogVideo_SECAM_B = 0x1000, - AnalogVideo_SECAM_D = 0x2000, - AnalogVideo_SECAM_G = 0x4000, - AnalogVideo_SECAM_H = 0x8000, - AnalogVideo_SECAM_K = 0x10000, - AnalogVideo_SECAM_K1 = 0x20000, - AnalogVideo_SECAM_L = 0x40000, - AnalogVideo_SECAM_L1 = 0x80000, - AnalogVideo_PAL_N_COMBO = 0x100000 - } AnalogVideoStandard; - -#define AnalogVideo_NTSC_Mask 0x00000007 -#define AnalogVideo_PAL_Mask 0x00100FF0 -#define AnalogVideo_SECAM_Mask 0x000FF000 -typedef -enum tagTunerInputType - { TunerInputCable = 0, - TunerInputAntenna = TunerInputCable + 1 - } TunerInputType; - -typedef /* [public] */ -enum __MIDL___MIDL_itf_strmif_0168_0001 - { VideoCopyProtectionMacrovisionBasic = 0, - VideoCopyProtectionMacrovisionCBI = VideoCopyProtectionMacrovisionBasic + 1 - } VideoCopyProtectionType; - -typedef -enum tagPhysicalConnectorType - { PhysConn_Video_Tuner = 1, - PhysConn_Video_Composite = PhysConn_Video_Tuner + 1, - PhysConn_Video_SVideo = PhysConn_Video_Composite + 1, - PhysConn_Video_RGB = PhysConn_Video_SVideo + 1, - PhysConn_Video_YRYBY = PhysConn_Video_RGB + 1, - PhysConn_Video_SerialDigital = PhysConn_Video_YRYBY + 1, - PhysConn_Video_ParallelDigital = PhysConn_Video_SerialDigital + 1, - PhysConn_Video_SCSI = PhysConn_Video_ParallelDigital + 1, - PhysConn_Video_AUX = PhysConn_Video_SCSI + 1, - PhysConn_Video_1394 = PhysConn_Video_AUX + 1, - PhysConn_Video_USB = PhysConn_Video_1394 + 1, - PhysConn_Video_VideoDecoder = PhysConn_Video_USB + 1, - PhysConn_Video_VideoEncoder = PhysConn_Video_VideoDecoder + 1, - PhysConn_Video_SCART = PhysConn_Video_VideoEncoder + 1, - PhysConn_Video_Black = PhysConn_Video_SCART + 1, - PhysConn_Audio_Tuner = 0x1000, - PhysConn_Audio_Line = PhysConn_Audio_Tuner + 1, - PhysConn_Audio_Mic = PhysConn_Audio_Line + 1, - PhysConn_Audio_AESDigital = PhysConn_Audio_Mic + 1, - PhysConn_Audio_SPDIFDigital = PhysConn_Audio_AESDigital + 1, - PhysConn_Audio_SCSI = PhysConn_Audio_SPDIFDigital + 1, - PhysConn_Audio_AUX = PhysConn_Audio_SCSI + 1, - PhysConn_Audio_1394 = PhysConn_Audio_AUX + 1, - PhysConn_Audio_USB = PhysConn_Audio_1394 + 1, - PhysConn_Audio_AudioDecoder = PhysConn_Audio_USB + 1 - } PhysicalConnectorType; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0168_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0168_v0_0_s_ifspec; - -#ifndef __IAMAnalogVideoDecoder_INTERFACE_DEFINED__ -#define __IAMAnalogVideoDecoder_INTERFACE_DEFINED__ - -/* interface IAMAnalogVideoDecoder */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMAnalogVideoDecoder; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("C6E13350-30AC-11d0-A18C-00A0C9118956") - IAMAnalogVideoDecoder : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE get_AvailableTVFormats( - /* [out] */ long *lAnalogVideoStandard) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_TVFormat( - /* [in] */ long lAnalogVideoStandard) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_TVFormat( - /* [out] */ long *plAnalogVideoStandard) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_HorizontalLocked( - /* [out] */ long *plLocked) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_VCRHorizontalLocking( - /* [in] */ long lVCRHorizontalLocking) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_VCRHorizontalLocking( - /* [out] */ long *plVCRHorizontalLocking) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_NumberOfLines( - /* [out] */ long *plNumberOfLines) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_OutputEnable( - /* [in] */ long lOutputEnable) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_OutputEnable( - /* [out] */ long *plOutputEnable) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMAnalogVideoDecoderVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMAnalogVideoDecoder * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMAnalogVideoDecoder * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMAnalogVideoDecoder * This); - - HRESULT ( STDMETHODCALLTYPE *get_AvailableTVFormats )( - IAMAnalogVideoDecoder * This, - /* [out] */ long *lAnalogVideoStandard); - - HRESULT ( STDMETHODCALLTYPE *put_TVFormat )( - IAMAnalogVideoDecoder * This, - /* [in] */ long lAnalogVideoStandard); - - HRESULT ( STDMETHODCALLTYPE *get_TVFormat )( - IAMAnalogVideoDecoder * This, - /* [out] */ long *plAnalogVideoStandard); - - HRESULT ( STDMETHODCALLTYPE *get_HorizontalLocked )( - IAMAnalogVideoDecoder * This, - /* [out] */ long *plLocked); - - HRESULT ( STDMETHODCALLTYPE *put_VCRHorizontalLocking )( - IAMAnalogVideoDecoder * This, - /* [in] */ long lVCRHorizontalLocking); - - HRESULT ( STDMETHODCALLTYPE *get_VCRHorizontalLocking )( - IAMAnalogVideoDecoder * This, - /* [out] */ long *plVCRHorizontalLocking); - - HRESULT ( STDMETHODCALLTYPE *get_NumberOfLines )( - IAMAnalogVideoDecoder * This, - /* [out] */ long *plNumberOfLines); - - HRESULT ( STDMETHODCALLTYPE *put_OutputEnable )( - IAMAnalogVideoDecoder * This, - /* [in] */ long lOutputEnable); - - HRESULT ( STDMETHODCALLTYPE *get_OutputEnable )( - IAMAnalogVideoDecoder * This, - /* [out] */ long *plOutputEnable); - - END_INTERFACE - } IAMAnalogVideoDecoderVtbl; - - interface IAMAnalogVideoDecoder - { - CONST_VTBL struct IAMAnalogVideoDecoderVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMAnalogVideoDecoder_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMAnalogVideoDecoder_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMAnalogVideoDecoder_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMAnalogVideoDecoder_get_AvailableTVFormats(This,lAnalogVideoStandard) \ - (This)->lpVtbl -> get_AvailableTVFormats(This,lAnalogVideoStandard) - -#define IAMAnalogVideoDecoder_put_TVFormat(This,lAnalogVideoStandard) \ - (This)->lpVtbl -> put_TVFormat(This,lAnalogVideoStandard) - -#define IAMAnalogVideoDecoder_get_TVFormat(This,plAnalogVideoStandard) \ - (This)->lpVtbl -> get_TVFormat(This,plAnalogVideoStandard) - -#define IAMAnalogVideoDecoder_get_HorizontalLocked(This,plLocked) \ - (This)->lpVtbl -> get_HorizontalLocked(This,plLocked) - -#define IAMAnalogVideoDecoder_put_VCRHorizontalLocking(This,lVCRHorizontalLocking) \ - (This)->lpVtbl -> put_VCRHorizontalLocking(This,lVCRHorizontalLocking) - -#define IAMAnalogVideoDecoder_get_VCRHorizontalLocking(This,plVCRHorizontalLocking) \ - (This)->lpVtbl -> get_VCRHorizontalLocking(This,plVCRHorizontalLocking) - -#define IAMAnalogVideoDecoder_get_NumberOfLines(This,plNumberOfLines) \ - (This)->lpVtbl -> get_NumberOfLines(This,plNumberOfLines) - -#define IAMAnalogVideoDecoder_put_OutputEnable(This,lOutputEnable) \ - (This)->lpVtbl -> put_OutputEnable(This,lOutputEnable) - -#define IAMAnalogVideoDecoder_get_OutputEnable(This,plOutputEnable) \ - (This)->lpVtbl -> get_OutputEnable(This,plOutputEnable) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMAnalogVideoDecoder_get_AvailableTVFormats_Proxy( - IAMAnalogVideoDecoder * This, - /* [out] */ long *lAnalogVideoStandard); - - -void __RPC_STUB IAMAnalogVideoDecoder_get_AvailableTVFormats_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAnalogVideoDecoder_put_TVFormat_Proxy( - IAMAnalogVideoDecoder * This, - /* [in] */ long lAnalogVideoStandard); - - -void __RPC_STUB IAMAnalogVideoDecoder_put_TVFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAnalogVideoDecoder_get_TVFormat_Proxy( - IAMAnalogVideoDecoder * This, - /* [out] */ long *plAnalogVideoStandard); - - -void __RPC_STUB IAMAnalogVideoDecoder_get_TVFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAnalogVideoDecoder_get_HorizontalLocked_Proxy( - IAMAnalogVideoDecoder * This, - /* [out] */ long *plLocked); - - -void __RPC_STUB IAMAnalogVideoDecoder_get_HorizontalLocked_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAnalogVideoDecoder_put_VCRHorizontalLocking_Proxy( - IAMAnalogVideoDecoder * This, - /* [in] */ long lVCRHorizontalLocking); - - -void __RPC_STUB IAMAnalogVideoDecoder_put_VCRHorizontalLocking_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAnalogVideoDecoder_get_VCRHorizontalLocking_Proxy( - IAMAnalogVideoDecoder * This, - /* [out] */ long *plVCRHorizontalLocking); - - -void __RPC_STUB IAMAnalogVideoDecoder_get_VCRHorizontalLocking_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAnalogVideoDecoder_get_NumberOfLines_Proxy( - IAMAnalogVideoDecoder * This, - /* [out] */ long *plNumberOfLines); - - -void __RPC_STUB IAMAnalogVideoDecoder_get_NumberOfLines_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAnalogVideoDecoder_put_OutputEnable_Proxy( - IAMAnalogVideoDecoder * This, - /* [in] */ long lOutputEnable); - - -void __RPC_STUB IAMAnalogVideoDecoder_put_OutputEnable_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAnalogVideoDecoder_get_OutputEnable_Proxy( - IAMAnalogVideoDecoder * This, - /* [out] */ long *plOutputEnable); - - -void __RPC_STUB IAMAnalogVideoDecoder_get_OutputEnable_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMAnalogVideoDecoder_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0169 */ -/* [local] */ - -typedef -enum tagVideoProcAmpProperty - { VideoProcAmp_Brightness = 0, - VideoProcAmp_Contrast = VideoProcAmp_Brightness + 1, - VideoProcAmp_Hue = VideoProcAmp_Contrast + 1, - VideoProcAmp_Saturation = VideoProcAmp_Hue + 1, - VideoProcAmp_Sharpness = VideoProcAmp_Saturation + 1, - VideoProcAmp_Gamma = VideoProcAmp_Sharpness + 1, - VideoProcAmp_ColorEnable = VideoProcAmp_Gamma + 1, - VideoProcAmp_WhiteBalance = VideoProcAmp_ColorEnable + 1, - VideoProcAmp_BacklightCompensation = VideoProcAmp_WhiteBalance + 1, - VideoProcAmp_Gain = VideoProcAmp_BacklightCompensation + 1 - } VideoProcAmpProperty; - -typedef -enum tagVideoProcAmpFlags - { VideoProcAmp_Flags_Auto = 0x1, - VideoProcAmp_Flags_Manual = 0x2 - } VideoProcAmpFlags; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0169_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0169_v0_0_s_ifspec; - -#ifndef __IAMVideoProcAmp_INTERFACE_DEFINED__ -#define __IAMVideoProcAmp_INTERFACE_DEFINED__ - -/* interface IAMVideoProcAmp */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMVideoProcAmp; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("C6E13360-30AC-11d0-A18C-00A0C9118956") - IAMVideoProcAmp : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetRange( - /* [in] */ long Property, - /* [out] */ long *pMin, - /* [out] */ long *pMax, - /* [out] */ long *pSteppingDelta, - /* [out] */ long *pDefault, - /* [out] */ long *pCapsFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE Set( - /* [in] */ long Property, - /* [in] */ long lValue, - /* [in] */ long Flags) = 0; - - virtual HRESULT STDMETHODCALLTYPE Get( - /* [in] */ long Property, - /* [out] */ long *lValue, - /* [out] */ long *Flags) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMVideoProcAmpVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMVideoProcAmp * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMVideoProcAmp * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMVideoProcAmp * This); - - HRESULT ( STDMETHODCALLTYPE *GetRange )( - IAMVideoProcAmp * This, - /* [in] */ long Property, - /* [out] */ long *pMin, - /* [out] */ long *pMax, - /* [out] */ long *pSteppingDelta, - /* [out] */ long *pDefault, - /* [out] */ long *pCapsFlags); - - HRESULT ( STDMETHODCALLTYPE *Set )( - IAMVideoProcAmp * This, - /* [in] */ long Property, - /* [in] */ long lValue, - /* [in] */ long Flags); - - HRESULT ( STDMETHODCALLTYPE *Get )( - IAMVideoProcAmp * This, - /* [in] */ long Property, - /* [out] */ long *lValue, - /* [out] */ long *Flags); - - END_INTERFACE - } IAMVideoProcAmpVtbl; - - interface IAMVideoProcAmp - { - CONST_VTBL struct IAMVideoProcAmpVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMVideoProcAmp_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMVideoProcAmp_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMVideoProcAmp_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMVideoProcAmp_GetRange(This,Property,pMin,pMax,pSteppingDelta,pDefault,pCapsFlags) \ - (This)->lpVtbl -> GetRange(This,Property,pMin,pMax,pSteppingDelta,pDefault,pCapsFlags) - -#define IAMVideoProcAmp_Set(This,Property,lValue,Flags) \ - (This)->lpVtbl -> Set(This,Property,lValue,Flags) - -#define IAMVideoProcAmp_Get(This,Property,lValue,Flags) \ - (This)->lpVtbl -> Get(This,Property,lValue,Flags) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMVideoProcAmp_GetRange_Proxy( - IAMVideoProcAmp * This, - /* [in] */ long Property, - /* [out] */ long *pMin, - /* [out] */ long *pMax, - /* [out] */ long *pSteppingDelta, - /* [out] */ long *pDefault, - /* [out] */ long *pCapsFlags); - - -void __RPC_STUB IAMVideoProcAmp_GetRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoProcAmp_Set_Proxy( - IAMVideoProcAmp * This, - /* [in] */ long Property, - /* [in] */ long lValue, - /* [in] */ long Flags); - - -void __RPC_STUB IAMVideoProcAmp_Set_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoProcAmp_Get_Proxy( - IAMVideoProcAmp * This, - /* [in] */ long Property, - /* [out] */ long *lValue, - /* [out] */ long *Flags); - - -void __RPC_STUB IAMVideoProcAmp_Get_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMVideoProcAmp_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0170 */ -/* [local] */ - -typedef -enum tagCameraControlProperty - { CameraControl_Pan = 0, - CameraControl_Tilt = CameraControl_Pan + 1, - CameraControl_Roll = CameraControl_Tilt + 1, - CameraControl_Zoom = CameraControl_Roll + 1, - CameraControl_Exposure = CameraControl_Zoom + 1, - CameraControl_Iris = CameraControl_Exposure + 1, - CameraControl_Focus = CameraControl_Iris + 1 - } CameraControlProperty; - -typedef -enum tagCameraControlFlags - { CameraControl_Flags_Auto = 0x1, - CameraControl_Flags_Manual = 0x2 - } CameraControlFlags; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0170_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0170_v0_0_s_ifspec; - -#ifndef __IAMCameraControl_INTERFACE_DEFINED__ -#define __IAMCameraControl_INTERFACE_DEFINED__ - -/* interface IAMCameraControl */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMCameraControl; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("C6E13370-30AC-11d0-A18C-00A0C9118956") - IAMCameraControl : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetRange( - /* [in] */ long Property, - /* [out] */ long *pMin, - /* [out] */ long *pMax, - /* [out] */ long *pSteppingDelta, - /* [out] */ long *pDefault, - /* [out] */ long *pCapsFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE Set( - /* [in] */ long Property, - /* [in] */ long lValue, - /* [in] */ long Flags) = 0; - - virtual HRESULT STDMETHODCALLTYPE Get( - /* [in] */ long Property, - /* [out] */ long *lValue, - /* [out] */ long *Flags) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMCameraControlVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMCameraControl * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMCameraControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMCameraControl * This); - - HRESULT ( STDMETHODCALLTYPE *GetRange )( - IAMCameraControl * This, - /* [in] */ long Property, - /* [out] */ long *pMin, - /* [out] */ long *pMax, - /* [out] */ long *pSteppingDelta, - /* [out] */ long *pDefault, - /* [out] */ long *pCapsFlags); - - HRESULT ( STDMETHODCALLTYPE *Set )( - IAMCameraControl * This, - /* [in] */ long Property, - /* [in] */ long lValue, - /* [in] */ long Flags); - - HRESULT ( STDMETHODCALLTYPE *Get )( - IAMCameraControl * This, - /* [in] */ long Property, - /* [out] */ long *lValue, - /* [out] */ long *Flags); - - END_INTERFACE - } IAMCameraControlVtbl; - - interface IAMCameraControl - { - CONST_VTBL struct IAMCameraControlVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMCameraControl_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMCameraControl_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMCameraControl_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMCameraControl_GetRange(This,Property,pMin,pMax,pSteppingDelta,pDefault,pCapsFlags) \ - (This)->lpVtbl -> GetRange(This,Property,pMin,pMax,pSteppingDelta,pDefault,pCapsFlags) - -#define IAMCameraControl_Set(This,Property,lValue,Flags) \ - (This)->lpVtbl -> Set(This,Property,lValue,Flags) - -#define IAMCameraControl_Get(This,Property,lValue,Flags) \ - (This)->lpVtbl -> Get(This,Property,lValue,Flags) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMCameraControl_GetRange_Proxy( - IAMCameraControl * This, - /* [in] */ long Property, - /* [out] */ long *pMin, - /* [out] */ long *pMax, - /* [out] */ long *pSteppingDelta, - /* [out] */ long *pDefault, - /* [out] */ long *pCapsFlags); - - -void __RPC_STUB IAMCameraControl_GetRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMCameraControl_Set_Proxy( - IAMCameraControl * This, - /* [in] */ long Property, - /* [in] */ long lValue, - /* [in] */ long Flags); - - -void __RPC_STUB IAMCameraControl_Set_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMCameraControl_Get_Proxy( - IAMCameraControl * This, - /* [in] */ long Property, - /* [out] */ long *lValue, - /* [out] */ long *Flags); - - -void __RPC_STUB IAMCameraControl_Get_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMCameraControl_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0171 */ -/* [local] */ - -typedef -enum tagVideoControlFlags - { VideoControlFlag_FlipHorizontal = 0x1, - VideoControlFlag_FlipVertical = 0x2, - VideoControlFlag_ExternalTriggerEnable = 0x4, - VideoControlFlag_Trigger = 0x8 - } VideoControlFlags; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0171_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0171_v0_0_s_ifspec; - -#ifndef __IAMVideoControl_INTERFACE_DEFINED__ -#define __IAMVideoControl_INTERFACE_DEFINED__ - -/* interface IAMVideoControl */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMVideoControl; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("6a2e0670-28e4-11d0-a18c-00a0c9118956") - IAMVideoControl : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetCaps( - /* [in] */ IPin *pPin, - /* [out] */ long *pCapsFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMode( - /* [in] */ IPin *pPin, - /* [in] */ long Mode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMode( - /* [in] */ IPin *pPin, - /* [out] */ long *Mode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentActualFrameRate( - /* [in] */ IPin *pPin, - /* [out] */ LONGLONG *ActualFrameRate) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMaxAvailableFrameRate( - /* [in] */ IPin *pPin, - /* [in] */ long iIndex, - /* [in] */ SIZE Dimensions, - /* [out] */ LONGLONG *MaxAvailableFrameRate) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFrameRateList( - /* [in] */ IPin *pPin, - /* [in] */ long iIndex, - /* [in] */ SIZE Dimensions, - /* [out] */ long *ListSize, - /* [out] */ LONGLONG **FrameRates) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMVideoControlVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMVideoControl * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMVideoControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMVideoControl * This); - - HRESULT ( STDMETHODCALLTYPE *GetCaps )( - IAMVideoControl * This, - /* [in] */ IPin *pPin, - /* [out] */ long *pCapsFlags); - - HRESULT ( STDMETHODCALLTYPE *SetMode )( - IAMVideoControl * This, - /* [in] */ IPin *pPin, - /* [in] */ long Mode); - - HRESULT ( STDMETHODCALLTYPE *GetMode )( - IAMVideoControl * This, - /* [in] */ IPin *pPin, - /* [out] */ long *Mode); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentActualFrameRate )( - IAMVideoControl * This, - /* [in] */ IPin *pPin, - /* [out] */ LONGLONG *ActualFrameRate); - - HRESULT ( STDMETHODCALLTYPE *GetMaxAvailableFrameRate )( - IAMVideoControl * This, - /* [in] */ IPin *pPin, - /* [in] */ long iIndex, - /* [in] */ SIZE Dimensions, - /* [out] */ LONGLONG *MaxAvailableFrameRate); - - HRESULT ( STDMETHODCALLTYPE *GetFrameRateList )( - IAMVideoControl * This, - /* [in] */ IPin *pPin, - /* [in] */ long iIndex, - /* [in] */ SIZE Dimensions, - /* [out] */ long *ListSize, - /* [out] */ LONGLONG **FrameRates); - - END_INTERFACE - } IAMVideoControlVtbl; - - interface IAMVideoControl - { - CONST_VTBL struct IAMVideoControlVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMVideoControl_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMVideoControl_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMVideoControl_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMVideoControl_GetCaps(This,pPin,pCapsFlags) \ - (This)->lpVtbl -> GetCaps(This,pPin,pCapsFlags) - -#define IAMVideoControl_SetMode(This,pPin,Mode) \ - (This)->lpVtbl -> SetMode(This,pPin,Mode) - -#define IAMVideoControl_GetMode(This,pPin,Mode) \ - (This)->lpVtbl -> GetMode(This,pPin,Mode) - -#define IAMVideoControl_GetCurrentActualFrameRate(This,pPin,ActualFrameRate) \ - (This)->lpVtbl -> GetCurrentActualFrameRate(This,pPin,ActualFrameRate) - -#define IAMVideoControl_GetMaxAvailableFrameRate(This,pPin,iIndex,Dimensions,MaxAvailableFrameRate) \ - (This)->lpVtbl -> GetMaxAvailableFrameRate(This,pPin,iIndex,Dimensions,MaxAvailableFrameRate) - -#define IAMVideoControl_GetFrameRateList(This,pPin,iIndex,Dimensions,ListSize,FrameRates) \ - (This)->lpVtbl -> GetFrameRateList(This,pPin,iIndex,Dimensions,ListSize,FrameRates) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMVideoControl_GetCaps_Proxy( - IAMVideoControl * This, - /* [in] */ IPin *pPin, - /* [out] */ long *pCapsFlags); - - -void __RPC_STUB IAMVideoControl_GetCaps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoControl_SetMode_Proxy( - IAMVideoControl * This, - /* [in] */ IPin *pPin, - /* [in] */ long Mode); - - -void __RPC_STUB IAMVideoControl_SetMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoControl_GetMode_Proxy( - IAMVideoControl * This, - /* [in] */ IPin *pPin, - /* [out] */ long *Mode); - - -void __RPC_STUB IAMVideoControl_GetMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoControl_GetCurrentActualFrameRate_Proxy( - IAMVideoControl * This, - /* [in] */ IPin *pPin, - /* [out] */ LONGLONG *ActualFrameRate); - - -void __RPC_STUB IAMVideoControl_GetCurrentActualFrameRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoControl_GetMaxAvailableFrameRate_Proxy( - IAMVideoControl * This, - /* [in] */ IPin *pPin, - /* [in] */ long iIndex, - /* [in] */ SIZE Dimensions, - /* [out] */ LONGLONG *MaxAvailableFrameRate); - - -void __RPC_STUB IAMVideoControl_GetMaxAvailableFrameRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoControl_GetFrameRateList_Proxy( - IAMVideoControl * This, - /* [in] */ IPin *pPin, - /* [in] */ long iIndex, - /* [in] */ SIZE Dimensions, - /* [out] */ long *ListSize, - /* [out] */ LONGLONG **FrameRates); - - -void __RPC_STUB IAMVideoControl_GetFrameRateList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMVideoControl_INTERFACE_DEFINED__ */ - - -#ifndef __IAMCrossbar_INTERFACE_DEFINED__ -#define __IAMCrossbar_INTERFACE_DEFINED__ - -/* interface IAMCrossbar */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMCrossbar; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("C6E13380-30AC-11d0-A18C-00A0C9118956") - IAMCrossbar : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE get_PinCounts( - /* [out] */ long *OutputPinCount, - /* [out] */ long *InputPinCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE CanRoute( - /* [in] */ long OutputPinIndex, - /* [in] */ long InputPinIndex) = 0; - - virtual HRESULT STDMETHODCALLTYPE Route( - /* [in] */ long OutputPinIndex, - /* [in] */ long InputPinIndex) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_IsRoutedTo( - /* [in] */ long OutputPinIndex, - /* [out] */ long *InputPinIndex) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_CrossbarPinInfo( - /* [in] */ BOOL IsInputPin, - /* [in] */ long PinIndex, - /* [out] */ long *PinIndexRelated, - /* [out] */ long *PhysicalType) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMCrossbarVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMCrossbar * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMCrossbar * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMCrossbar * This); - - HRESULT ( STDMETHODCALLTYPE *get_PinCounts )( - IAMCrossbar * This, - /* [out] */ long *OutputPinCount, - /* [out] */ long *InputPinCount); - - HRESULT ( STDMETHODCALLTYPE *CanRoute )( - IAMCrossbar * This, - /* [in] */ long OutputPinIndex, - /* [in] */ long InputPinIndex); - - HRESULT ( STDMETHODCALLTYPE *Route )( - IAMCrossbar * This, - /* [in] */ long OutputPinIndex, - /* [in] */ long InputPinIndex); - - HRESULT ( STDMETHODCALLTYPE *get_IsRoutedTo )( - IAMCrossbar * This, - /* [in] */ long OutputPinIndex, - /* [out] */ long *InputPinIndex); - - HRESULT ( STDMETHODCALLTYPE *get_CrossbarPinInfo )( - IAMCrossbar * This, - /* [in] */ BOOL IsInputPin, - /* [in] */ long PinIndex, - /* [out] */ long *PinIndexRelated, - /* [out] */ long *PhysicalType); - - END_INTERFACE - } IAMCrossbarVtbl; - - interface IAMCrossbar - { - CONST_VTBL struct IAMCrossbarVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMCrossbar_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMCrossbar_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMCrossbar_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMCrossbar_get_PinCounts(This,OutputPinCount,InputPinCount) \ - (This)->lpVtbl -> get_PinCounts(This,OutputPinCount,InputPinCount) - -#define IAMCrossbar_CanRoute(This,OutputPinIndex,InputPinIndex) \ - (This)->lpVtbl -> CanRoute(This,OutputPinIndex,InputPinIndex) - -#define IAMCrossbar_Route(This,OutputPinIndex,InputPinIndex) \ - (This)->lpVtbl -> Route(This,OutputPinIndex,InputPinIndex) - -#define IAMCrossbar_get_IsRoutedTo(This,OutputPinIndex,InputPinIndex) \ - (This)->lpVtbl -> get_IsRoutedTo(This,OutputPinIndex,InputPinIndex) - -#define IAMCrossbar_get_CrossbarPinInfo(This,IsInputPin,PinIndex,PinIndexRelated,PhysicalType) \ - (This)->lpVtbl -> get_CrossbarPinInfo(This,IsInputPin,PinIndex,PinIndexRelated,PhysicalType) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMCrossbar_get_PinCounts_Proxy( - IAMCrossbar * This, - /* [out] */ long *OutputPinCount, - /* [out] */ long *InputPinCount); - - -void __RPC_STUB IAMCrossbar_get_PinCounts_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMCrossbar_CanRoute_Proxy( - IAMCrossbar * This, - /* [in] */ long OutputPinIndex, - /* [in] */ long InputPinIndex); - - -void __RPC_STUB IAMCrossbar_CanRoute_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMCrossbar_Route_Proxy( - IAMCrossbar * This, - /* [in] */ long OutputPinIndex, - /* [in] */ long InputPinIndex); - - -void __RPC_STUB IAMCrossbar_Route_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMCrossbar_get_IsRoutedTo_Proxy( - IAMCrossbar * This, - /* [in] */ long OutputPinIndex, - /* [out] */ long *InputPinIndex); - - -void __RPC_STUB IAMCrossbar_get_IsRoutedTo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMCrossbar_get_CrossbarPinInfo_Proxy( - IAMCrossbar * This, - /* [in] */ BOOL IsInputPin, - /* [in] */ long PinIndex, - /* [out] */ long *PinIndexRelated, - /* [out] */ long *PhysicalType); - - -void __RPC_STUB IAMCrossbar_get_CrossbarPinInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMCrossbar_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0173 */ -/* [local] */ - -typedef -enum tagAMTunerSubChannel - { AMTUNER_SUBCHAN_NO_TUNE = -2, - AMTUNER_SUBCHAN_DEFAULT = -1 - } AMTunerSubChannel; - -typedef -enum tagAMTunerSignalStrength - { AMTUNER_HASNOSIGNALSTRENGTH = -1, - AMTUNER_NOSIGNAL = 0, - AMTUNER_SIGNALPRESENT = 1 - } AMTunerSignalStrength; - -typedef -enum tagAMTunerModeType - { AMTUNER_MODE_DEFAULT = 0, - AMTUNER_MODE_TV = 0x1, - AMTUNER_MODE_FM_RADIO = 0x2, - AMTUNER_MODE_AM_RADIO = 0x4, - AMTUNER_MODE_DSS = 0x8 - } AMTunerModeType; - -typedef -enum tagAMTunerEventType - { AMTUNER_EVENT_CHANGED = 0x1 - } AMTunerEventType; - - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0173_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0173_v0_0_s_ifspec; - -#ifndef __IAMTuner_INTERFACE_DEFINED__ -#define __IAMTuner_INTERFACE_DEFINED__ - -/* interface IAMTuner */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMTuner; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("211A8761-03AC-11d1-8D13-00AA00BD8339") - IAMTuner : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE put_Channel( - /* [in] */ long lChannel, - /* [in] */ long lVideoSubChannel, - /* [in] */ long lAudioSubChannel) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Channel( - /* [out] */ long *plChannel, - /* [out] */ long *plVideoSubChannel, - /* [out] */ long *plAudioSubChannel) = 0; - - virtual HRESULT STDMETHODCALLTYPE ChannelMinMax( - /* [out] */ long *lChannelMin, - /* [out] */ long *lChannelMax) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_CountryCode( - /* [in] */ long lCountryCode) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_CountryCode( - /* [out] */ long *plCountryCode) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_TuningSpace( - /* [in] */ long lTuningSpace) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_TuningSpace( - /* [out] */ long *plTuningSpace) = 0; - - virtual /* [local] */ HRESULT STDMETHODCALLTYPE Logon( - /* [in] */ HANDLE hCurrentUser) = 0; - - virtual HRESULT STDMETHODCALLTYPE Logout( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SignalPresent( - /* [out] */ long *plSignalStrength) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_Mode( - /* [in] */ AMTunerModeType lMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Mode( - /* [out] */ AMTunerModeType *plMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailableModes( - /* [out] */ long *plModes) = 0; - - virtual HRESULT STDMETHODCALLTYPE RegisterNotificationCallBack( - /* [in] */ IAMTunerNotification *pNotify, - /* [in] */ long lEvents) = 0; - - virtual HRESULT STDMETHODCALLTYPE UnRegisterNotificationCallBack( - /* [in] */ IAMTunerNotification *pNotify) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTunerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTuner * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTuner * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTuner * This); - - HRESULT ( STDMETHODCALLTYPE *put_Channel )( - IAMTuner * This, - /* [in] */ long lChannel, - /* [in] */ long lVideoSubChannel, - /* [in] */ long lAudioSubChannel); - - HRESULT ( STDMETHODCALLTYPE *get_Channel )( - IAMTuner * This, - /* [out] */ long *plChannel, - /* [out] */ long *plVideoSubChannel, - /* [out] */ long *plAudioSubChannel); - - HRESULT ( STDMETHODCALLTYPE *ChannelMinMax )( - IAMTuner * This, - /* [out] */ long *lChannelMin, - /* [out] */ long *lChannelMax); - - HRESULT ( STDMETHODCALLTYPE *put_CountryCode )( - IAMTuner * This, - /* [in] */ long lCountryCode); - - HRESULT ( STDMETHODCALLTYPE *get_CountryCode )( - IAMTuner * This, - /* [out] */ long *plCountryCode); - - HRESULT ( STDMETHODCALLTYPE *put_TuningSpace )( - IAMTuner * This, - /* [in] */ long lTuningSpace); - - HRESULT ( STDMETHODCALLTYPE *get_TuningSpace )( - IAMTuner * This, - /* [out] */ long *plTuningSpace); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Logon )( - IAMTuner * This, - /* [in] */ HANDLE hCurrentUser); - - HRESULT ( STDMETHODCALLTYPE *Logout )( - IAMTuner * This); - - HRESULT ( STDMETHODCALLTYPE *SignalPresent )( - IAMTuner * This, - /* [out] */ long *plSignalStrength); - - HRESULT ( STDMETHODCALLTYPE *put_Mode )( - IAMTuner * This, - /* [in] */ AMTunerModeType lMode); - - HRESULT ( STDMETHODCALLTYPE *get_Mode )( - IAMTuner * This, - /* [out] */ AMTunerModeType *plMode); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableModes )( - IAMTuner * This, - /* [out] */ long *plModes); - - HRESULT ( STDMETHODCALLTYPE *RegisterNotificationCallBack )( - IAMTuner * This, - /* [in] */ IAMTunerNotification *pNotify, - /* [in] */ long lEvents); - - HRESULT ( STDMETHODCALLTYPE *UnRegisterNotificationCallBack )( - IAMTuner * This, - /* [in] */ IAMTunerNotification *pNotify); - - END_INTERFACE - } IAMTunerVtbl; - - interface IAMTuner - { - CONST_VTBL struct IAMTunerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTuner_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTuner_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTuner_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTuner_put_Channel(This,lChannel,lVideoSubChannel,lAudioSubChannel) \ - (This)->lpVtbl -> put_Channel(This,lChannel,lVideoSubChannel,lAudioSubChannel) - -#define IAMTuner_get_Channel(This,plChannel,plVideoSubChannel,plAudioSubChannel) \ - (This)->lpVtbl -> get_Channel(This,plChannel,plVideoSubChannel,plAudioSubChannel) - -#define IAMTuner_ChannelMinMax(This,lChannelMin,lChannelMax) \ - (This)->lpVtbl -> ChannelMinMax(This,lChannelMin,lChannelMax) - -#define IAMTuner_put_CountryCode(This,lCountryCode) \ - (This)->lpVtbl -> put_CountryCode(This,lCountryCode) - -#define IAMTuner_get_CountryCode(This,plCountryCode) \ - (This)->lpVtbl -> get_CountryCode(This,plCountryCode) - -#define IAMTuner_put_TuningSpace(This,lTuningSpace) \ - (This)->lpVtbl -> put_TuningSpace(This,lTuningSpace) - -#define IAMTuner_get_TuningSpace(This,plTuningSpace) \ - (This)->lpVtbl -> get_TuningSpace(This,plTuningSpace) - -#define IAMTuner_Logon(This,hCurrentUser) \ - (This)->lpVtbl -> Logon(This,hCurrentUser) - -#define IAMTuner_Logout(This) \ - (This)->lpVtbl -> Logout(This) - -#define IAMTuner_SignalPresent(This,plSignalStrength) \ - (This)->lpVtbl -> SignalPresent(This,plSignalStrength) - -#define IAMTuner_put_Mode(This,lMode) \ - (This)->lpVtbl -> put_Mode(This,lMode) - -#define IAMTuner_get_Mode(This,plMode) \ - (This)->lpVtbl -> get_Mode(This,plMode) - -#define IAMTuner_GetAvailableModes(This,plModes) \ - (This)->lpVtbl -> GetAvailableModes(This,plModes) - -#define IAMTuner_RegisterNotificationCallBack(This,pNotify,lEvents) \ - (This)->lpVtbl -> RegisterNotificationCallBack(This,pNotify,lEvents) - -#define IAMTuner_UnRegisterNotificationCallBack(This,pNotify) \ - (This)->lpVtbl -> UnRegisterNotificationCallBack(This,pNotify) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMTuner_put_Channel_Proxy( - IAMTuner * This, - /* [in] */ long lChannel, - /* [in] */ long lVideoSubChannel, - /* [in] */ long lAudioSubChannel); - - -void __RPC_STUB IAMTuner_put_Channel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTuner_get_Channel_Proxy( - IAMTuner * This, - /* [out] */ long *plChannel, - /* [out] */ long *plVideoSubChannel, - /* [out] */ long *plAudioSubChannel); - - -void __RPC_STUB IAMTuner_get_Channel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTuner_ChannelMinMax_Proxy( - IAMTuner * This, - /* [out] */ long *lChannelMin, - /* [out] */ long *lChannelMax); - - -void __RPC_STUB IAMTuner_ChannelMinMax_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTuner_put_CountryCode_Proxy( - IAMTuner * This, - /* [in] */ long lCountryCode); - - -void __RPC_STUB IAMTuner_put_CountryCode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTuner_get_CountryCode_Proxy( - IAMTuner * This, - /* [out] */ long *plCountryCode); - - -void __RPC_STUB IAMTuner_get_CountryCode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTuner_put_TuningSpace_Proxy( - IAMTuner * This, - /* [in] */ long lTuningSpace); - - -void __RPC_STUB IAMTuner_put_TuningSpace_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTuner_get_TuningSpace_Proxy( - IAMTuner * This, - /* [out] */ long *plTuningSpace); - - -void __RPC_STUB IAMTuner_get_TuningSpace_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [local] */ HRESULT STDMETHODCALLTYPE IAMTuner_Logon_Proxy( - IAMTuner * This, - /* [in] */ HANDLE hCurrentUser); - - -void __RPC_STUB IAMTuner_Logon_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTuner_Logout_Proxy( - IAMTuner * This); - - -void __RPC_STUB IAMTuner_Logout_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTuner_SignalPresent_Proxy( - IAMTuner * This, - /* [out] */ long *plSignalStrength); - - -void __RPC_STUB IAMTuner_SignalPresent_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTuner_put_Mode_Proxy( - IAMTuner * This, - /* [in] */ AMTunerModeType lMode); - - -void __RPC_STUB IAMTuner_put_Mode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTuner_get_Mode_Proxy( - IAMTuner * This, - /* [out] */ AMTunerModeType *plMode); - - -void __RPC_STUB IAMTuner_get_Mode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTuner_GetAvailableModes_Proxy( - IAMTuner * This, - /* [out] */ long *plModes); - - -void __RPC_STUB IAMTuner_GetAvailableModes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTuner_RegisterNotificationCallBack_Proxy( - IAMTuner * This, - /* [in] */ IAMTunerNotification *pNotify, - /* [in] */ long lEvents); - - -void __RPC_STUB IAMTuner_RegisterNotificationCallBack_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTuner_UnRegisterNotificationCallBack_Proxy( - IAMTuner * This, - /* [in] */ IAMTunerNotification *pNotify); - - -void __RPC_STUB IAMTuner_UnRegisterNotificationCallBack_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTuner_INTERFACE_DEFINED__ */ - - -#ifndef __IAMTunerNotification_INTERFACE_DEFINED__ -#define __IAMTunerNotification_INTERFACE_DEFINED__ - -/* interface IAMTunerNotification */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMTunerNotification; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("211A8760-03AC-11d1-8D13-00AA00BD8339") - IAMTunerNotification : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE OnEvent( - /* [in] */ AMTunerEventType Event) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTunerNotificationVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTunerNotification * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTunerNotification * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTunerNotification * This); - - HRESULT ( STDMETHODCALLTYPE *OnEvent )( - IAMTunerNotification * This, - /* [in] */ AMTunerEventType Event); - - END_INTERFACE - } IAMTunerNotificationVtbl; - - interface IAMTunerNotification - { - CONST_VTBL struct IAMTunerNotificationVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTunerNotification_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTunerNotification_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTunerNotification_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTunerNotification_OnEvent(This,Event) \ - (This)->lpVtbl -> OnEvent(This,Event) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMTunerNotification_OnEvent_Proxy( - IAMTunerNotification * This, - /* [in] */ AMTunerEventType Event); - - -void __RPC_STUB IAMTunerNotification_OnEvent_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTunerNotification_INTERFACE_DEFINED__ */ - - -#ifndef __IAMTVTuner_INTERFACE_DEFINED__ -#define __IAMTVTuner_INTERFACE_DEFINED__ - -/* interface IAMTVTuner */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMTVTuner; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("211A8766-03AC-11d1-8D13-00AA00BD8339") - IAMTVTuner : public IAMTuner - { - public: - virtual HRESULT STDMETHODCALLTYPE get_AvailableTVFormats( - /* [out] */ long *lAnalogVideoStandard) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_TVFormat( - /* [out] */ long *plAnalogVideoStandard) = 0; - - virtual HRESULT STDMETHODCALLTYPE AutoTune( - /* [in] */ long lChannel, - /* [out] */ long *plFoundSignal) = 0; - - virtual HRESULT STDMETHODCALLTYPE StoreAutoTune( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_NumInputConnections( - /* [out] */ long *plNumInputConnections) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_InputType( - /* [in] */ long lIndex, - /* [in] */ TunerInputType InputType) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_InputType( - /* [in] */ long lIndex, - /* [out] */ TunerInputType *pInputType) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_ConnectInput( - /* [in] */ long lIndex) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_ConnectInput( - /* [out] */ long *plIndex) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_VideoFrequency( - /* [out] */ long *lFreq) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_AudioFrequency( - /* [out] */ long *lFreq) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTVTunerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTVTuner * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTVTuner * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTVTuner * This); - - HRESULT ( STDMETHODCALLTYPE *put_Channel )( - IAMTVTuner * This, - /* [in] */ long lChannel, - /* [in] */ long lVideoSubChannel, - /* [in] */ long lAudioSubChannel); - - HRESULT ( STDMETHODCALLTYPE *get_Channel )( - IAMTVTuner * This, - /* [out] */ long *plChannel, - /* [out] */ long *plVideoSubChannel, - /* [out] */ long *plAudioSubChannel); - - HRESULT ( STDMETHODCALLTYPE *ChannelMinMax )( - IAMTVTuner * This, - /* [out] */ long *lChannelMin, - /* [out] */ long *lChannelMax); - - HRESULT ( STDMETHODCALLTYPE *put_CountryCode )( - IAMTVTuner * This, - /* [in] */ long lCountryCode); - - HRESULT ( STDMETHODCALLTYPE *get_CountryCode )( - IAMTVTuner * This, - /* [out] */ long *plCountryCode); - - HRESULT ( STDMETHODCALLTYPE *put_TuningSpace )( - IAMTVTuner * This, - /* [in] */ long lTuningSpace); - - HRESULT ( STDMETHODCALLTYPE *get_TuningSpace )( - IAMTVTuner * This, - /* [out] */ long *plTuningSpace); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Logon )( - IAMTVTuner * This, - /* [in] */ HANDLE hCurrentUser); - - HRESULT ( STDMETHODCALLTYPE *Logout )( - IAMTVTuner * This); - - HRESULT ( STDMETHODCALLTYPE *SignalPresent )( - IAMTVTuner * This, - /* [out] */ long *plSignalStrength); - - HRESULT ( STDMETHODCALLTYPE *put_Mode )( - IAMTVTuner * This, - /* [in] */ AMTunerModeType lMode); - - HRESULT ( STDMETHODCALLTYPE *get_Mode )( - IAMTVTuner * This, - /* [out] */ AMTunerModeType *plMode); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableModes )( - IAMTVTuner * This, - /* [out] */ long *plModes); - - HRESULT ( STDMETHODCALLTYPE *RegisterNotificationCallBack )( - IAMTVTuner * This, - /* [in] */ IAMTunerNotification *pNotify, - /* [in] */ long lEvents); - - HRESULT ( STDMETHODCALLTYPE *UnRegisterNotificationCallBack )( - IAMTVTuner * This, - /* [in] */ IAMTunerNotification *pNotify); - - HRESULT ( STDMETHODCALLTYPE *get_AvailableTVFormats )( - IAMTVTuner * This, - /* [out] */ long *lAnalogVideoStandard); - - HRESULT ( STDMETHODCALLTYPE *get_TVFormat )( - IAMTVTuner * This, - /* [out] */ long *plAnalogVideoStandard); - - HRESULT ( STDMETHODCALLTYPE *AutoTune )( - IAMTVTuner * This, - /* [in] */ long lChannel, - /* [out] */ long *plFoundSignal); - - HRESULT ( STDMETHODCALLTYPE *StoreAutoTune )( - IAMTVTuner * This); - - HRESULT ( STDMETHODCALLTYPE *get_NumInputConnections )( - IAMTVTuner * This, - /* [out] */ long *plNumInputConnections); - - HRESULT ( STDMETHODCALLTYPE *put_InputType )( - IAMTVTuner * This, - /* [in] */ long lIndex, - /* [in] */ TunerInputType InputType); - - HRESULT ( STDMETHODCALLTYPE *get_InputType )( - IAMTVTuner * This, - /* [in] */ long lIndex, - /* [out] */ TunerInputType *pInputType); - - HRESULT ( STDMETHODCALLTYPE *put_ConnectInput )( - IAMTVTuner * This, - /* [in] */ long lIndex); - - HRESULT ( STDMETHODCALLTYPE *get_ConnectInput )( - IAMTVTuner * This, - /* [out] */ long *plIndex); - - HRESULT ( STDMETHODCALLTYPE *get_VideoFrequency )( - IAMTVTuner * This, - /* [out] */ long *lFreq); - - HRESULT ( STDMETHODCALLTYPE *get_AudioFrequency )( - IAMTVTuner * This, - /* [out] */ long *lFreq); - - END_INTERFACE - } IAMTVTunerVtbl; - - interface IAMTVTuner - { - CONST_VTBL struct IAMTVTunerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTVTuner_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTVTuner_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTVTuner_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTVTuner_put_Channel(This,lChannel,lVideoSubChannel,lAudioSubChannel) \ - (This)->lpVtbl -> put_Channel(This,lChannel,lVideoSubChannel,lAudioSubChannel) - -#define IAMTVTuner_get_Channel(This,plChannel,plVideoSubChannel,plAudioSubChannel) \ - (This)->lpVtbl -> get_Channel(This,plChannel,plVideoSubChannel,plAudioSubChannel) - -#define IAMTVTuner_ChannelMinMax(This,lChannelMin,lChannelMax) \ - (This)->lpVtbl -> ChannelMinMax(This,lChannelMin,lChannelMax) - -#define IAMTVTuner_put_CountryCode(This,lCountryCode) \ - (This)->lpVtbl -> put_CountryCode(This,lCountryCode) - -#define IAMTVTuner_get_CountryCode(This,plCountryCode) \ - (This)->lpVtbl -> get_CountryCode(This,plCountryCode) - -#define IAMTVTuner_put_TuningSpace(This,lTuningSpace) \ - (This)->lpVtbl -> put_TuningSpace(This,lTuningSpace) - -#define IAMTVTuner_get_TuningSpace(This,plTuningSpace) \ - (This)->lpVtbl -> get_TuningSpace(This,plTuningSpace) - -#define IAMTVTuner_Logon(This,hCurrentUser) \ - (This)->lpVtbl -> Logon(This,hCurrentUser) - -#define IAMTVTuner_Logout(This) \ - (This)->lpVtbl -> Logout(This) - -#define IAMTVTuner_SignalPresent(This,plSignalStrength) \ - (This)->lpVtbl -> SignalPresent(This,plSignalStrength) - -#define IAMTVTuner_put_Mode(This,lMode) \ - (This)->lpVtbl -> put_Mode(This,lMode) - -#define IAMTVTuner_get_Mode(This,plMode) \ - (This)->lpVtbl -> get_Mode(This,plMode) - -#define IAMTVTuner_GetAvailableModes(This,plModes) \ - (This)->lpVtbl -> GetAvailableModes(This,plModes) - -#define IAMTVTuner_RegisterNotificationCallBack(This,pNotify,lEvents) \ - (This)->lpVtbl -> RegisterNotificationCallBack(This,pNotify,lEvents) - -#define IAMTVTuner_UnRegisterNotificationCallBack(This,pNotify) \ - (This)->lpVtbl -> UnRegisterNotificationCallBack(This,pNotify) - - -#define IAMTVTuner_get_AvailableTVFormats(This,lAnalogVideoStandard) \ - (This)->lpVtbl -> get_AvailableTVFormats(This,lAnalogVideoStandard) - -#define IAMTVTuner_get_TVFormat(This,plAnalogVideoStandard) \ - (This)->lpVtbl -> get_TVFormat(This,plAnalogVideoStandard) - -#define IAMTVTuner_AutoTune(This,lChannel,plFoundSignal) \ - (This)->lpVtbl -> AutoTune(This,lChannel,plFoundSignal) - -#define IAMTVTuner_StoreAutoTune(This) \ - (This)->lpVtbl -> StoreAutoTune(This) - -#define IAMTVTuner_get_NumInputConnections(This,plNumInputConnections) \ - (This)->lpVtbl -> get_NumInputConnections(This,plNumInputConnections) - -#define IAMTVTuner_put_InputType(This,lIndex,InputType) \ - (This)->lpVtbl -> put_InputType(This,lIndex,InputType) - -#define IAMTVTuner_get_InputType(This,lIndex,pInputType) \ - (This)->lpVtbl -> get_InputType(This,lIndex,pInputType) - -#define IAMTVTuner_put_ConnectInput(This,lIndex) \ - (This)->lpVtbl -> put_ConnectInput(This,lIndex) - -#define IAMTVTuner_get_ConnectInput(This,plIndex) \ - (This)->lpVtbl -> get_ConnectInput(This,plIndex) - -#define IAMTVTuner_get_VideoFrequency(This,lFreq) \ - (This)->lpVtbl -> get_VideoFrequency(This,lFreq) - -#define IAMTVTuner_get_AudioFrequency(This,lFreq) \ - (This)->lpVtbl -> get_AudioFrequency(This,lFreq) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMTVTuner_get_AvailableTVFormats_Proxy( - IAMTVTuner * This, - /* [out] */ long *lAnalogVideoStandard); - - -void __RPC_STUB IAMTVTuner_get_AvailableTVFormats_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTVTuner_get_TVFormat_Proxy( - IAMTVTuner * This, - /* [out] */ long *plAnalogVideoStandard); - - -void __RPC_STUB IAMTVTuner_get_TVFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTVTuner_AutoTune_Proxy( - IAMTVTuner * This, - /* [in] */ long lChannel, - /* [out] */ long *plFoundSignal); - - -void __RPC_STUB IAMTVTuner_AutoTune_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTVTuner_StoreAutoTune_Proxy( - IAMTVTuner * This); - - -void __RPC_STUB IAMTVTuner_StoreAutoTune_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTVTuner_get_NumInputConnections_Proxy( - IAMTVTuner * This, - /* [out] */ long *plNumInputConnections); - - -void __RPC_STUB IAMTVTuner_get_NumInputConnections_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTVTuner_put_InputType_Proxy( - IAMTVTuner * This, - /* [in] */ long lIndex, - /* [in] */ TunerInputType InputType); - - -void __RPC_STUB IAMTVTuner_put_InputType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTVTuner_get_InputType_Proxy( - IAMTVTuner * This, - /* [in] */ long lIndex, - /* [out] */ TunerInputType *pInputType); - - -void __RPC_STUB IAMTVTuner_get_InputType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTVTuner_put_ConnectInput_Proxy( - IAMTVTuner * This, - /* [in] */ long lIndex); - - -void __RPC_STUB IAMTVTuner_put_ConnectInput_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTVTuner_get_ConnectInput_Proxy( - IAMTVTuner * This, - /* [out] */ long *plIndex); - - -void __RPC_STUB IAMTVTuner_get_ConnectInput_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTVTuner_get_VideoFrequency_Proxy( - IAMTVTuner * This, - /* [out] */ long *lFreq); - - -void __RPC_STUB IAMTVTuner_get_VideoFrequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTVTuner_get_AudioFrequency_Proxy( - IAMTVTuner * This, - /* [out] */ long *lFreq); - - -void __RPC_STUB IAMTVTuner_get_AudioFrequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTVTuner_INTERFACE_DEFINED__ */ - - -#ifndef __IBPCSatelliteTuner_INTERFACE_DEFINED__ -#define __IBPCSatelliteTuner_INTERFACE_DEFINED__ - -/* interface IBPCSatelliteTuner */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IBPCSatelliteTuner; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("211A8765-03AC-11d1-8D13-00AA00BD8339") - IBPCSatelliteTuner : public IAMTuner - { - public: - virtual HRESULT STDMETHODCALLTYPE get_DefaultSubChannelTypes( - /* [out] */ long *plDefaultVideoType, - /* [out] */ long *plDefaultAudioType) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_DefaultSubChannelTypes( - /* [in] */ long lDefaultVideoType, - /* [in] */ long lDefaultAudioType) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsTapingPermitted( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBPCSatelliteTunerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBPCSatelliteTuner * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBPCSatelliteTuner * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBPCSatelliteTuner * This); - - HRESULT ( STDMETHODCALLTYPE *put_Channel )( - IBPCSatelliteTuner * This, - /* [in] */ long lChannel, - /* [in] */ long lVideoSubChannel, - /* [in] */ long lAudioSubChannel); - - HRESULT ( STDMETHODCALLTYPE *get_Channel )( - IBPCSatelliteTuner * This, - /* [out] */ long *plChannel, - /* [out] */ long *plVideoSubChannel, - /* [out] */ long *plAudioSubChannel); - - HRESULT ( STDMETHODCALLTYPE *ChannelMinMax )( - IBPCSatelliteTuner * This, - /* [out] */ long *lChannelMin, - /* [out] */ long *lChannelMax); - - HRESULT ( STDMETHODCALLTYPE *put_CountryCode )( - IBPCSatelliteTuner * This, - /* [in] */ long lCountryCode); - - HRESULT ( STDMETHODCALLTYPE *get_CountryCode )( - IBPCSatelliteTuner * This, - /* [out] */ long *plCountryCode); - - HRESULT ( STDMETHODCALLTYPE *put_TuningSpace )( - IBPCSatelliteTuner * This, - /* [in] */ long lTuningSpace); - - HRESULT ( STDMETHODCALLTYPE *get_TuningSpace )( - IBPCSatelliteTuner * This, - /* [out] */ long *plTuningSpace); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Logon )( - IBPCSatelliteTuner * This, - /* [in] */ HANDLE hCurrentUser); - - HRESULT ( STDMETHODCALLTYPE *Logout )( - IBPCSatelliteTuner * This); - - HRESULT ( STDMETHODCALLTYPE *SignalPresent )( - IBPCSatelliteTuner * This, - /* [out] */ long *plSignalStrength); - - HRESULT ( STDMETHODCALLTYPE *put_Mode )( - IBPCSatelliteTuner * This, - /* [in] */ AMTunerModeType lMode); - - HRESULT ( STDMETHODCALLTYPE *get_Mode )( - IBPCSatelliteTuner * This, - /* [out] */ AMTunerModeType *plMode); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableModes )( - IBPCSatelliteTuner * This, - /* [out] */ long *plModes); - - HRESULT ( STDMETHODCALLTYPE *RegisterNotificationCallBack )( - IBPCSatelliteTuner * This, - /* [in] */ IAMTunerNotification *pNotify, - /* [in] */ long lEvents); - - HRESULT ( STDMETHODCALLTYPE *UnRegisterNotificationCallBack )( - IBPCSatelliteTuner * This, - /* [in] */ IAMTunerNotification *pNotify); - - HRESULT ( STDMETHODCALLTYPE *get_DefaultSubChannelTypes )( - IBPCSatelliteTuner * This, - /* [out] */ long *plDefaultVideoType, - /* [out] */ long *plDefaultAudioType); - - HRESULT ( STDMETHODCALLTYPE *put_DefaultSubChannelTypes )( - IBPCSatelliteTuner * This, - /* [in] */ long lDefaultVideoType, - /* [in] */ long lDefaultAudioType); - - HRESULT ( STDMETHODCALLTYPE *IsTapingPermitted )( - IBPCSatelliteTuner * This); - - END_INTERFACE - } IBPCSatelliteTunerVtbl; - - interface IBPCSatelliteTuner - { - CONST_VTBL struct IBPCSatelliteTunerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBPCSatelliteTuner_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBPCSatelliteTuner_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBPCSatelliteTuner_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBPCSatelliteTuner_put_Channel(This,lChannel,lVideoSubChannel,lAudioSubChannel) \ - (This)->lpVtbl -> put_Channel(This,lChannel,lVideoSubChannel,lAudioSubChannel) - -#define IBPCSatelliteTuner_get_Channel(This,plChannel,plVideoSubChannel,plAudioSubChannel) \ - (This)->lpVtbl -> get_Channel(This,plChannel,plVideoSubChannel,plAudioSubChannel) - -#define IBPCSatelliteTuner_ChannelMinMax(This,lChannelMin,lChannelMax) \ - (This)->lpVtbl -> ChannelMinMax(This,lChannelMin,lChannelMax) - -#define IBPCSatelliteTuner_put_CountryCode(This,lCountryCode) \ - (This)->lpVtbl -> put_CountryCode(This,lCountryCode) - -#define IBPCSatelliteTuner_get_CountryCode(This,plCountryCode) \ - (This)->lpVtbl -> get_CountryCode(This,plCountryCode) - -#define IBPCSatelliteTuner_put_TuningSpace(This,lTuningSpace) \ - (This)->lpVtbl -> put_TuningSpace(This,lTuningSpace) - -#define IBPCSatelliteTuner_get_TuningSpace(This,plTuningSpace) \ - (This)->lpVtbl -> get_TuningSpace(This,plTuningSpace) - -#define IBPCSatelliteTuner_Logon(This,hCurrentUser) \ - (This)->lpVtbl -> Logon(This,hCurrentUser) - -#define IBPCSatelliteTuner_Logout(This) \ - (This)->lpVtbl -> Logout(This) - -#define IBPCSatelliteTuner_SignalPresent(This,plSignalStrength) \ - (This)->lpVtbl -> SignalPresent(This,plSignalStrength) - -#define IBPCSatelliteTuner_put_Mode(This,lMode) \ - (This)->lpVtbl -> put_Mode(This,lMode) - -#define IBPCSatelliteTuner_get_Mode(This,plMode) \ - (This)->lpVtbl -> get_Mode(This,plMode) - -#define IBPCSatelliteTuner_GetAvailableModes(This,plModes) \ - (This)->lpVtbl -> GetAvailableModes(This,plModes) - -#define IBPCSatelliteTuner_RegisterNotificationCallBack(This,pNotify,lEvents) \ - (This)->lpVtbl -> RegisterNotificationCallBack(This,pNotify,lEvents) - -#define IBPCSatelliteTuner_UnRegisterNotificationCallBack(This,pNotify) \ - (This)->lpVtbl -> UnRegisterNotificationCallBack(This,pNotify) - - -#define IBPCSatelliteTuner_get_DefaultSubChannelTypes(This,plDefaultVideoType,plDefaultAudioType) \ - (This)->lpVtbl -> get_DefaultSubChannelTypes(This,plDefaultVideoType,plDefaultAudioType) - -#define IBPCSatelliteTuner_put_DefaultSubChannelTypes(This,lDefaultVideoType,lDefaultAudioType) \ - (This)->lpVtbl -> put_DefaultSubChannelTypes(This,lDefaultVideoType,lDefaultAudioType) - -#define IBPCSatelliteTuner_IsTapingPermitted(This) \ - (This)->lpVtbl -> IsTapingPermitted(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBPCSatelliteTuner_get_DefaultSubChannelTypes_Proxy( - IBPCSatelliteTuner * This, - /* [out] */ long *plDefaultVideoType, - /* [out] */ long *plDefaultAudioType); - - -void __RPC_STUB IBPCSatelliteTuner_get_DefaultSubChannelTypes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBPCSatelliteTuner_put_DefaultSubChannelTypes_Proxy( - IBPCSatelliteTuner * This, - /* [in] */ long lDefaultVideoType, - /* [in] */ long lDefaultAudioType); - - -void __RPC_STUB IBPCSatelliteTuner_put_DefaultSubChannelTypes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IBPCSatelliteTuner_IsTapingPermitted_Proxy( - IBPCSatelliteTuner * This); - - -void __RPC_STUB IBPCSatelliteTuner_IsTapingPermitted_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBPCSatelliteTuner_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0177 */ -/* [local] */ - -typedef -enum tagTVAudioMode - { AMTVAUDIO_MODE_MONO = 0x1, - AMTVAUDIO_MODE_STEREO = 0x2, - AMTVAUDIO_MODE_LANG_A = 0x10, - AMTVAUDIO_MODE_LANG_B = 0x20, - AMTVAUDIO_MODE_LANG_C = 0x40 - } TVAudioMode; - -typedef -enum tagAMTVAudioEventType - { AMTVAUDIO_EVENT_CHANGED = 0x1 - } AMTVAudioEventType; - - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0177_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0177_v0_0_s_ifspec; - -#ifndef __IAMTVAudio_INTERFACE_DEFINED__ -#define __IAMTVAudio_INTERFACE_DEFINED__ - -/* interface IAMTVAudio */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IAMTVAudio; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("83EC1C30-23D1-11d1-99E6-00A0C9560266") - IAMTVAudio : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetHardwareSupportedTVAudioModes( - /* [out] */ long *plModes) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailableTVAudioModes( - /* [out] */ long *plModes) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_TVAudioMode( - /* [out] */ long *plMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_TVAudioMode( - /* [in] */ long lMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE RegisterNotificationCallBack( - /* [in] */ IAMTunerNotification *pNotify, - /* [in] */ long lEvents) = 0; - - virtual HRESULT STDMETHODCALLTYPE UnRegisterNotificationCallBack( - IAMTunerNotification *pNotify) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTVAudioVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTVAudio * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTVAudio * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTVAudio * This); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareSupportedTVAudioModes )( - IAMTVAudio * This, - /* [out] */ long *plModes); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableTVAudioModes )( - IAMTVAudio * This, - /* [out] */ long *plModes); - - HRESULT ( STDMETHODCALLTYPE *get_TVAudioMode )( - IAMTVAudio * This, - /* [out] */ long *plMode); - - HRESULT ( STDMETHODCALLTYPE *put_TVAudioMode )( - IAMTVAudio * This, - /* [in] */ long lMode); - - HRESULT ( STDMETHODCALLTYPE *RegisterNotificationCallBack )( - IAMTVAudio * This, - /* [in] */ IAMTunerNotification *pNotify, - /* [in] */ long lEvents); - - HRESULT ( STDMETHODCALLTYPE *UnRegisterNotificationCallBack )( - IAMTVAudio * This, - IAMTunerNotification *pNotify); - - END_INTERFACE - } IAMTVAudioVtbl; - - interface IAMTVAudio - { - CONST_VTBL struct IAMTVAudioVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTVAudio_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTVAudio_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTVAudio_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTVAudio_GetHardwareSupportedTVAudioModes(This,plModes) \ - (This)->lpVtbl -> GetHardwareSupportedTVAudioModes(This,plModes) - -#define IAMTVAudio_GetAvailableTVAudioModes(This,plModes) \ - (This)->lpVtbl -> GetAvailableTVAudioModes(This,plModes) - -#define IAMTVAudio_get_TVAudioMode(This,plMode) \ - (This)->lpVtbl -> get_TVAudioMode(This,plMode) - -#define IAMTVAudio_put_TVAudioMode(This,lMode) \ - (This)->lpVtbl -> put_TVAudioMode(This,lMode) - -#define IAMTVAudio_RegisterNotificationCallBack(This,pNotify,lEvents) \ - (This)->lpVtbl -> RegisterNotificationCallBack(This,pNotify,lEvents) - -#define IAMTVAudio_UnRegisterNotificationCallBack(This,pNotify) \ - (This)->lpVtbl -> UnRegisterNotificationCallBack(This,pNotify) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMTVAudio_GetHardwareSupportedTVAudioModes_Proxy( - IAMTVAudio * This, - /* [out] */ long *plModes); - - -void __RPC_STUB IAMTVAudio_GetHardwareSupportedTVAudioModes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTVAudio_GetAvailableTVAudioModes_Proxy( - IAMTVAudio * This, - /* [out] */ long *plModes); - - -void __RPC_STUB IAMTVAudio_GetAvailableTVAudioModes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTVAudio_get_TVAudioMode_Proxy( - IAMTVAudio * This, - /* [out] */ long *plMode); - - -void __RPC_STUB IAMTVAudio_get_TVAudioMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTVAudio_put_TVAudioMode_Proxy( - IAMTVAudio * This, - /* [in] */ long lMode); - - -void __RPC_STUB IAMTVAudio_put_TVAudioMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTVAudio_RegisterNotificationCallBack_Proxy( - IAMTVAudio * This, - /* [in] */ IAMTunerNotification *pNotify, - /* [in] */ long lEvents); - - -void __RPC_STUB IAMTVAudio_RegisterNotificationCallBack_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTVAudio_UnRegisterNotificationCallBack_Proxy( - IAMTVAudio * This, - IAMTunerNotification *pNotify); - - -void __RPC_STUB IAMTVAudio_UnRegisterNotificationCallBack_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTVAudio_INTERFACE_DEFINED__ */ - - -#ifndef __IAMTVAudioNotification_INTERFACE_DEFINED__ -#define __IAMTVAudioNotification_INTERFACE_DEFINED__ - -/* interface IAMTVAudioNotification */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IAMTVAudioNotification; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("83EC1C33-23D1-11d1-99E6-00A0C9560266") - IAMTVAudioNotification : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE OnEvent( - /* [in] */ AMTVAudioEventType Event) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTVAudioNotificationVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTVAudioNotification * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTVAudioNotification * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTVAudioNotification * This); - - HRESULT ( STDMETHODCALLTYPE *OnEvent )( - IAMTVAudioNotification * This, - /* [in] */ AMTVAudioEventType Event); - - END_INTERFACE - } IAMTVAudioNotificationVtbl; - - interface IAMTVAudioNotification - { - CONST_VTBL struct IAMTVAudioNotificationVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTVAudioNotification_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTVAudioNotification_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTVAudioNotification_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTVAudioNotification_OnEvent(This,Event) \ - (This)->lpVtbl -> OnEvent(This,Event) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMTVAudioNotification_OnEvent_Proxy( - IAMTVAudioNotification * This, - /* [in] */ AMTVAudioEventType Event); - - -void __RPC_STUB IAMTVAudioNotification_OnEvent_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTVAudioNotification_INTERFACE_DEFINED__ */ - - -#ifndef __IAMAnalogVideoEncoder_INTERFACE_DEFINED__ -#define __IAMAnalogVideoEncoder_INTERFACE_DEFINED__ - -/* interface IAMAnalogVideoEncoder */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMAnalogVideoEncoder; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("C6E133B0-30AC-11d0-A18C-00A0C9118956") - IAMAnalogVideoEncoder : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE get_AvailableTVFormats( - /* [out] */ long *lAnalogVideoStandard) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_TVFormat( - /* [in] */ long lAnalogVideoStandard) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_TVFormat( - /* [out] */ long *plAnalogVideoStandard) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_CopyProtection( - /* [in] */ long lVideoCopyProtection) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_CopyProtection( - /* [out] */ long *lVideoCopyProtection) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_CCEnable( - /* [in] */ long lCCEnable) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_CCEnable( - /* [out] */ long *lCCEnable) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMAnalogVideoEncoderVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMAnalogVideoEncoder * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMAnalogVideoEncoder * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMAnalogVideoEncoder * This); - - HRESULT ( STDMETHODCALLTYPE *get_AvailableTVFormats )( - IAMAnalogVideoEncoder * This, - /* [out] */ long *lAnalogVideoStandard); - - HRESULT ( STDMETHODCALLTYPE *put_TVFormat )( - IAMAnalogVideoEncoder * This, - /* [in] */ long lAnalogVideoStandard); - - HRESULT ( STDMETHODCALLTYPE *get_TVFormat )( - IAMAnalogVideoEncoder * This, - /* [out] */ long *plAnalogVideoStandard); - - HRESULT ( STDMETHODCALLTYPE *put_CopyProtection )( - IAMAnalogVideoEncoder * This, - /* [in] */ long lVideoCopyProtection); - - HRESULT ( STDMETHODCALLTYPE *get_CopyProtection )( - IAMAnalogVideoEncoder * This, - /* [out] */ long *lVideoCopyProtection); - - HRESULT ( STDMETHODCALLTYPE *put_CCEnable )( - IAMAnalogVideoEncoder * This, - /* [in] */ long lCCEnable); - - HRESULT ( STDMETHODCALLTYPE *get_CCEnable )( - IAMAnalogVideoEncoder * This, - /* [out] */ long *lCCEnable); - - END_INTERFACE - } IAMAnalogVideoEncoderVtbl; - - interface IAMAnalogVideoEncoder - { - CONST_VTBL struct IAMAnalogVideoEncoderVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMAnalogVideoEncoder_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMAnalogVideoEncoder_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMAnalogVideoEncoder_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMAnalogVideoEncoder_get_AvailableTVFormats(This,lAnalogVideoStandard) \ - (This)->lpVtbl -> get_AvailableTVFormats(This,lAnalogVideoStandard) - -#define IAMAnalogVideoEncoder_put_TVFormat(This,lAnalogVideoStandard) \ - (This)->lpVtbl -> put_TVFormat(This,lAnalogVideoStandard) - -#define IAMAnalogVideoEncoder_get_TVFormat(This,plAnalogVideoStandard) \ - (This)->lpVtbl -> get_TVFormat(This,plAnalogVideoStandard) - -#define IAMAnalogVideoEncoder_put_CopyProtection(This,lVideoCopyProtection) \ - (This)->lpVtbl -> put_CopyProtection(This,lVideoCopyProtection) - -#define IAMAnalogVideoEncoder_get_CopyProtection(This,lVideoCopyProtection) \ - (This)->lpVtbl -> get_CopyProtection(This,lVideoCopyProtection) - -#define IAMAnalogVideoEncoder_put_CCEnable(This,lCCEnable) \ - (This)->lpVtbl -> put_CCEnable(This,lCCEnable) - -#define IAMAnalogVideoEncoder_get_CCEnable(This,lCCEnable) \ - (This)->lpVtbl -> get_CCEnable(This,lCCEnable) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMAnalogVideoEncoder_get_AvailableTVFormats_Proxy( - IAMAnalogVideoEncoder * This, - /* [out] */ long *lAnalogVideoStandard); - - -void __RPC_STUB IAMAnalogVideoEncoder_get_AvailableTVFormats_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAnalogVideoEncoder_put_TVFormat_Proxy( - IAMAnalogVideoEncoder * This, - /* [in] */ long lAnalogVideoStandard); - - -void __RPC_STUB IAMAnalogVideoEncoder_put_TVFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAnalogVideoEncoder_get_TVFormat_Proxy( - IAMAnalogVideoEncoder * This, - /* [out] */ long *plAnalogVideoStandard); - - -void __RPC_STUB IAMAnalogVideoEncoder_get_TVFormat_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAnalogVideoEncoder_put_CopyProtection_Proxy( - IAMAnalogVideoEncoder * This, - /* [in] */ long lVideoCopyProtection); - - -void __RPC_STUB IAMAnalogVideoEncoder_put_CopyProtection_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAnalogVideoEncoder_get_CopyProtection_Proxy( - IAMAnalogVideoEncoder * This, - /* [out] */ long *lVideoCopyProtection); - - -void __RPC_STUB IAMAnalogVideoEncoder_get_CopyProtection_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAnalogVideoEncoder_put_CCEnable_Proxy( - IAMAnalogVideoEncoder * This, - /* [in] */ long lCCEnable); - - -void __RPC_STUB IAMAnalogVideoEncoder_put_CCEnable_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMAnalogVideoEncoder_get_CCEnable_Proxy( - IAMAnalogVideoEncoder * This, - /* [out] */ long *lCCEnable); - - -void __RPC_STUB IAMAnalogVideoEncoder_get_CCEnable_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMAnalogVideoEncoder_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0180 */ -/* [local] */ - -typedef /* [public] */ -enum __MIDL___MIDL_itf_strmif_0180_0001 - { AMPROPERTY_PIN_CATEGORY = 0, - AMPROPERTY_PIN_MEDIUM = AMPROPERTY_PIN_CATEGORY + 1 - } AMPROPERTY_PIN; - -#ifndef _IKsPropertySet_ -#define _IKsPropertySet_ -#define KSPROPERTY_SUPPORT_GET 1 -#define KSPROPERTY_SUPPORT_SET 2 - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0180_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0180_v0_0_s_ifspec; - -#ifndef __IKsPropertySet_INTERFACE_DEFINED__ -#define __IKsPropertySet_INTERFACE_DEFINED__ - -/* interface IKsPropertySet */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IKsPropertySet; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("31EFAC30-515C-11d0-A9AA-00AA0061BE93") - IKsPropertySet : public IUnknown - { - public: - virtual /* [local] */ HRESULT STDMETHODCALLTYPE Set( - /* [in] */ REFGUID guidPropSet, - /* [in] */ DWORD dwPropID, - /* [size_is][in] */ LPVOID pInstanceData, - /* [in] */ DWORD cbInstanceData, - /* [size_is][in] */ LPVOID pPropData, - /* [in] */ DWORD cbPropData) = 0; - - virtual /* [local] */ HRESULT STDMETHODCALLTYPE Get( - /* [in] */ REFGUID guidPropSet, - /* [in] */ DWORD dwPropID, - /* [size_is][in] */ LPVOID pInstanceData, - /* [in] */ DWORD cbInstanceData, - /* [size_is][out] */ LPVOID pPropData, - /* [in] */ DWORD cbPropData, - /* [out] */ DWORD *pcbReturned) = 0; - - virtual HRESULT STDMETHODCALLTYPE QuerySupported( - /* [in] */ REFGUID guidPropSet, - /* [in] */ DWORD dwPropID, - /* [out] */ DWORD *pTypeSupport) = 0; - - }; - -#else /* C style interface */ - - typedef struct IKsPropertySetVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IKsPropertySet * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IKsPropertySet * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IKsPropertySet * This); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Set )( - IKsPropertySet * This, - /* [in] */ REFGUID guidPropSet, - /* [in] */ DWORD dwPropID, - /* [size_is][in] */ LPVOID pInstanceData, - /* [in] */ DWORD cbInstanceData, - /* [size_is][in] */ LPVOID pPropData, - /* [in] */ DWORD cbPropData); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Get )( - IKsPropertySet * This, - /* [in] */ REFGUID guidPropSet, - /* [in] */ DWORD dwPropID, - /* [size_is][in] */ LPVOID pInstanceData, - /* [in] */ DWORD cbInstanceData, - /* [size_is][out] */ LPVOID pPropData, - /* [in] */ DWORD cbPropData, - /* [out] */ DWORD *pcbReturned); - - HRESULT ( STDMETHODCALLTYPE *QuerySupported )( - IKsPropertySet * This, - /* [in] */ REFGUID guidPropSet, - /* [in] */ DWORD dwPropID, - /* [out] */ DWORD *pTypeSupport); - - END_INTERFACE - } IKsPropertySetVtbl; - - interface IKsPropertySet - { - CONST_VTBL struct IKsPropertySetVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IKsPropertySet_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IKsPropertySet_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IKsPropertySet_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IKsPropertySet_Set(This,guidPropSet,dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData) \ - (This)->lpVtbl -> Set(This,guidPropSet,dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData) - -#define IKsPropertySet_Get(This,guidPropSet,dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData,pcbReturned) \ - (This)->lpVtbl -> Get(This,guidPropSet,dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData,pcbReturned) - -#define IKsPropertySet_QuerySupported(This,guidPropSet,dwPropID,pTypeSupport) \ - (This)->lpVtbl -> QuerySupported(This,guidPropSet,dwPropID,pTypeSupport) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [call_as] */ HRESULT STDMETHODCALLTYPE IKsPropertySet_RemoteSet_Proxy( - IKsPropertySet * This, - /* [in] */ REFGUID guidPropSet, - /* [in] */ DWORD dwPropID, - /* [size_is][in] */ byte *pInstanceData, - /* [in] */ DWORD cbInstanceData, - /* [size_is][in] */ byte *pPropData, - /* [in] */ DWORD cbPropData); - - -void __RPC_STUB IKsPropertySet_RemoteSet_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [call_as] */ HRESULT STDMETHODCALLTYPE IKsPropertySet_RemoteGet_Proxy( - IKsPropertySet * This, - /* [in] */ REFGUID guidPropSet, - /* [in] */ DWORD dwPropID, - /* [size_is][in] */ byte *pInstanceData, - /* [in] */ DWORD cbInstanceData, - /* [size_is][out] */ byte *pPropData, - /* [in] */ DWORD cbPropData, - /* [out] */ DWORD *pcbReturned); - - -void __RPC_STUB IKsPropertySet_RemoteGet_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IKsPropertySet_QuerySupported_Proxy( - IKsPropertySet * This, - /* [in] */ REFGUID guidPropSet, - /* [in] */ DWORD dwPropID, - /* [out] */ DWORD *pTypeSupport); - - -void __RPC_STUB IKsPropertySet_QuerySupported_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IKsPropertySet_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0181 */ -/* [local] */ - -#endif // _IKsPropertySet_ - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0181_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0181_v0_0_s_ifspec; - -#ifndef __IMediaPropertyBag_INTERFACE_DEFINED__ -#define __IMediaPropertyBag_INTERFACE_DEFINED__ - -/* interface IMediaPropertyBag */ -/* [unique][uuid][object] */ - -typedef IMediaPropertyBag *LPMEDIAPROPERTYBAG; - - -EXTERN_C const IID IID_IMediaPropertyBag; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("6025A880-C0D5-11d0-BD4E-00A0C911CE86") - IMediaPropertyBag : public IPropertyBag - { - public: - virtual HRESULT STDMETHODCALLTYPE EnumProperty( - /* [in] */ ULONG iProperty, - /* [out][in] */ VARIANT *pvarPropertyName, - /* [out][in] */ VARIANT *pvarPropertyValue) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMediaPropertyBagVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMediaPropertyBag * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMediaPropertyBag * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMediaPropertyBag * This); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Read )( - IMediaPropertyBag * This, - /* [in] */ LPCOLESTR pszPropName, - /* [out][in] */ VARIANT *pVar, - /* [in] */ IErrorLog *pErrorLog); - - HRESULT ( STDMETHODCALLTYPE *Write )( - IMediaPropertyBag * This, - /* [in] */ LPCOLESTR pszPropName, - /* [in] */ VARIANT *pVar); - - HRESULT ( STDMETHODCALLTYPE *EnumProperty )( - IMediaPropertyBag * This, - /* [in] */ ULONG iProperty, - /* [out][in] */ VARIANT *pvarPropertyName, - /* [out][in] */ VARIANT *pvarPropertyValue); - - END_INTERFACE - } IMediaPropertyBagVtbl; - - interface IMediaPropertyBag - { - CONST_VTBL struct IMediaPropertyBagVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMediaPropertyBag_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMediaPropertyBag_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMediaPropertyBag_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMediaPropertyBag_Read(This,pszPropName,pVar,pErrorLog) \ - (This)->lpVtbl -> Read(This,pszPropName,pVar,pErrorLog) - -#define IMediaPropertyBag_Write(This,pszPropName,pVar) \ - (This)->lpVtbl -> Write(This,pszPropName,pVar) - - -#define IMediaPropertyBag_EnumProperty(This,iProperty,pvarPropertyName,pvarPropertyValue) \ - (This)->lpVtbl -> EnumProperty(This,iProperty,pvarPropertyName,pvarPropertyValue) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMediaPropertyBag_EnumProperty_Proxy( - IMediaPropertyBag * This, - /* [in] */ ULONG iProperty, - /* [out][in] */ VARIANT *pvarPropertyName, - /* [out][in] */ VARIANT *pvarPropertyValue); - - -void __RPC_STUB IMediaPropertyBag_EnumProperty_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMediaPropertyBag_INTERFACE_DEFINED__ */ - - -#ifndef __IPersistMediaPropertyBag_INTERFACE_DEFINED__ -#define __IPersistMediaPropertyBag_INTERFACE_DEFINED__ - -/* interface IPersistMediaPropertyBag */ -/* [unique][uuid][object] */ - -typedef IPersistMediaPropertyBag *LPPERSISTMEDIAPROPERTYBAG; - - -EXTERN_C const IID IID_IPersistMediaPropertyBag; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("5738E040-B67F-11d0-BD4D-00A0C911CE86") - IPersistMediaPropertyBag : public IPersist - { - public: - virtual HRESULT STDMETHODCALLTYPE InitNew( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Load( - /* [in] */ IMediaPropertyBag *pPropBag, - /* [in] */ IErrorLog *pErrorLog) = 0; - - virtual HRESULT STDMETHODCALLTYPE Save( - /* [in] */ IMediaPropertyBag *pPropBag, - /* [in] */ BOOL fClearDirty, - /* [in] */ BOOL fSaveAllProperties) = 0; - - }; - -#else /* C style interface */ - - typedef struct IPersistMediaPropertyBagVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IPersistMediaPropertyBag * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IPersistMediaPropertyBag * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IPersistMediaPropertyBag * This); - - HRESULT ( STDMETHODCALLTYPE *GetClassID )( - IPersistMediaPropertyBag * This, - /* [out] */ CLSID *pClassID); - - HRESULT ( STDMETHODCALLTYPE *InitNew )( - IPersistMediaPropertyBag * This); - - HRESULT ( STDMETHODCALLTYPE *Load )( - IPersistMediaPropertyBag * This, - /* [in] */ IMediaPropertyBag *pPropBag, - /* [in] */ IErrorLog *pErrorLog); - - HRESULT ( STDMETHODCALLTYPE *Save )( - IPersistMediaPropertyBag * This, - /* [in] */ IMediaPropertyBag *pPropBag, - /* [in] */ BOOL fClearDirty, - /* [in] */ BOOL fSaveAllProperties); - - END_INTERFACE - } IPersistMediaPropertyBagVtbl; - - interface IPersistMediaPropertyBag - { - CONST_VTBL struct IPersistMediaPropertyBagVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IPersistMediaPropertyBag_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IPersistMediaPropertyBag_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IPersistMediaPropertyBag_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IPersistMediaPropertyBag_GetClassID(This,pClassID) \ - (This)->lpVtbl -> GetClassID(This,pClassID) - - -#define IPersistMediaPropertyBag_InitNew(This) \ - (This)->lpVtbl -> InitNew(This) - -#define IPersistMediaPropertyBag_Load(This,pPropBag,pErrorLog) \ - (This)->lpVtbl -> Load(This,pPropBag,pErrorLog) - -#define IPersistMediaPropertyBag_Save(This,pPropBag,fClearDirty,fSaveAllProperties) \ - (This)->lpVtbl -> Save(This,pPropBag,fClearDirty,fSaveAllProperties) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IPersistMediaPropertyBag_InitNew_Proxy( - IPersistMediaPropertyBag * This); - - -void __RPC_STUB IPersistMediaPropertyBag_InitNew_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPersistMediaPropertyBag_Load_Proxy( - IPersistMediaPropertyBag * This, - /* [in] */ IMediaPropertyBag *pPropBag, - /* [in] */ IErrorLog *pErrorLog); - - -void __RPC_STUB IPersistMediaPropertyBag_Load_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPersistMediaPropertyBag_Save_Proxy( - IPersistMediaPropertyBag * This, - /* [in] */ IMediaPropertyBag *pPropBag, - /* [in] */ BOOL fClearDirty, - /* [in] */ BOOL fSaveAllProperties); - - -void __RPC_STUB IPersistMediaPropertyBag_Save_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IPersistMediaPropertyBag_INTERFACE_DEFINED__ */ - - -#ifndef __IAMPhysicalPinInfo_INTERFACE_DEFINED__ -#define __IAMPhysicalPinInfo_INTERFACE_DEFINED__ - -/* interface IAMPhysicalPinInfo */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMPhysicalPinInfo; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("F938C991-3029-11cf-8C44-00AA006B6814") - IAMPhysicalPinInfo : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetPhysicalType( - /* [out] */ long *pType, - /* [out] */ LPOLESTR *ppszType) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMPhysicalPinInfoVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMPhysicalPinInfo * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMPhysicalPinInfo * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMPhysicalPinInfo * This); - - HRESULT ( STDMETHODCALLTYPE *GetPhysicalType )( - IAMPhysicalPinInfo * This, - /* [out] */ long *pType, - /* [out] */ LPOLESTR *ppszType); - - END_INTERFACE - } IAMPhysicalPinInfoVtbl; - - interface IAMPhysicalPinInfo - { - CONST_VTBL struct IAMPhysicalPinInfoVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMPhysicalPinInfo_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMPhysicalPinInfo_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMPhysicalPinInfo_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMPhysicalPinInfo_GetPhysicalType(This,pType,ppszType) \ - (This)->lpVtbl -> GetPhysicalType(This,pType,ppszType) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMPhysicalPinInfo_GetPhysicalType_Proxy( - IAMPhysicalPinInfo * This, - /* [out] */ long *pType, - /* [out] */ LPOLESTR *ppszType); - - -void __RPC_STUB IAMPhysicalPinInfo_GetPhysicalType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMPhysicalPinInfo_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0328 */ -/* [local] */ - -typedef IAMPhysicalPinInfo *PAMPHYSICALPININFO; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0328_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0328_v0_0_s_ifspec; - -#ifndef __IAMExtDevice_INTERFACE_DEFINED__ -#define __IAMExtDevice_INTERFACE_DEFINED__ - -/* interface IAMExtDevice */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMExtDevice; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("B5730A90-1A2C-11cf-8C23-00AA006B6814") - IAMExtDevice : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetCapability( - /* [in] */ long Capability, - /* [out] */ long *pValue, - /* [out] */ double *pdblValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_ExternalDeviceID( - /* [out] */ LPOLESTR *ppszData) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_ExternalDeviceVersion( - /* [out] */ LPOLESTR *ppszData) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_DevicePower( - /* [in] */ long PowerMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_DevicePower( - /* [out] */ long *pPowerMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE Calibrate( - /* [in] */ HEVENT hEvent, - /* [in] */ long Mode, - /* [out] */ long *pStatus) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_DevicePort( - /* [in] */ long DevicePort) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_DevicePort( - /* [out] */ long *pDevicePort) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMExtDeviceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMExtDevice * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMExtDevice * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMExtDevice * This); - - HRESULT ( STDMETHODCALLTYPE *GetCapability )( - IAMExtDevice * This, - /* [in] */ long Capability, - /* [out] */ long *pValue, - /* [out] */ double *pdblValue); - - HRESULT ( STDMETHODCALLTYPE *get_ExternalDeviceID )( - IAMExtDevice * This, - /* [out] */ LPOLESTR *ppszData); - - HRESULT ( STDMETHODCALLTYPE *get_ExternalDeviceVersion )( - IAMExtDevice * This, - /* [out] */ LPOLESTR *ppszData); - - HRESULT ( STDMETHODCALLTYPE *put_DevicePower )( - IAMExtDevice * This, - /* [in] */ long PowerMode); - - HRESULT ( STDMETHODCALLTYPE *get_DevicePower )( - IAMExtDevice * This, - /* [out] */ long *pPowerMode); - - HRESULT ( STDMETHODCALLTYPE *Calibrate )( - IAMExtDevice * This, - /* [in] */ HEVENT hEvent, - /* [in] */ long Mode, - /* [out] */ long *pStatus); - - HRESULT ( STDMETHODCALLTYPE *put_DevicePort )( - IAMExtDevice * This, - /* [in] */ long DevicePort); - - HRESULT ( STDMETHODCALLTYPE *get_DevicePort )( - IAMExtDevice * This, - /* [out] */ long *pDevicePort); - - END_INTERFACE - } IAMExtDeviceVtbl; - - interface IAMExtDevice - { - CONST_VTBL struct IAMExtDeviceVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMExtDevice_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMExtDevice_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMExtDevice_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMExtDevice_GetCapability(This,Capability,pValue,pdblValue) \ - (This)->lpVtbl -> GetCapability(This,Capability,pValue,pdblValue) - -#define IAMExtDevice_get_ExternalDeviceID(This,ppszData) \ - (This)->lpVtbl -> get_ExternalDeviceID(This,ppszData) - -#define IAMExtDevice_get_ExternalDeviceVersion(This,ppszData) \ - (This)->lpVtbl -> get_ExternalDeviceVersion(This,ppszData) - -#define IAMExtDevice_put_DevicePower(This,PowerMode) \ - (This)->lpVtbl -> put_DevicePower(This,PowerMode) - -#define IAMExtDevice_get_DevicePower(This,pPowerMode) \ - (This)->lpVtbl -> get_DevicePower(This,pPowerMode) - -#define IAMExtDevice_Calibrate(This,hEvent,Mode,pStatus) \ - (This)->lpVtbl -> Calibrate(This,hEvent,Mode,pStatus) - -#define IAMExtDevice_put_DevicePort(This,DevicePort) \ - (This)->lpVtbl -> put_DevicePort(This,DevicePort) - -#define IAMExtDevice_get_DevicePort(This,pDevicePort) \ - (This)->lpVtbl -> get_DevicePort(This,pDevicePort) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMExtDevice_GetCapability_Proxy( - IAMExtDevice * This, - /* [in] */ long Capability, - /* [out] */ long *pValue, - /* [out] */ double *pdblValue); - - -void __RPC_STUB IAMExtDevice_GetCapability_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtDevice_get_ExternalDeviceID_Proxy( - IAMExtDevice * This, - /* [out] */ LPOLESTR *ppszData); - - -void __RPC_STUB IAMExtDevice_get_ExternalDeviceID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtDevice_get_ExternalDeviceVersion_Proxy( - IAMExtDevice * This, - /* [out] */ LPOLESTR *ppszData); - - -void __RPC_STUB IAMExtDevice_get_ExternalDeviceVersion_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtDevice_put_DevicePower_Proxy( - IAMExtDevice * This, - /* [in] */ long PowerMode); - - -void __RPC_STUB IAMExtDevice_put_DevicePower_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtDevice_get_DevicePower_Proxy( - IAMExtDevice * This, - /* [out] */ long *pPowerMode); - - -void __RPC_STUB IAMExtDevice_get_DevicePower_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtDevice_Calibrate_Proxy( - IAMExtDevice * This, - /* [in] */ HEVENT hEvent, - /* [in] */ long Mode, - /* [out] */ long *pStatus); - - -void __RPC_STUB IAMExtDevice_Calibrate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtDevice_put_DevicePort_Proxy( - IAMExtDevice * This, - /* [in] */ long DevicePort); - - -void __RPC_STUB IAMExtDevice_put_DevicePort_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtDevice_get_DevicePort_Proxy( - IAMExtDevice * This, - /* [out] */ long *pDevicePort); - - -void __RPC_STUB IAMExtDevice_get_DevicePort_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMExtDevice_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0329 */ -/* [local] */ - -typedef IAMExtDevice *PEXTDEVICE; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0329_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0329_v0_0_s_ifspec; - -#ifndef __IAMExtTransport_INTERFACE_DEFINED__ -#define __IAMExtTransport_INTERFACE_DEFINED__ - -/* interface IAMExtTransport */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMExtTransport; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("A03CD5F0-3045-11cf-8C44-00AA006B6814") - IAMExtTransport : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetCapability( - /* [in] */ long Capability, - /* [out] */ long *pValue, - /* [out] */ double *pdblValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_MediaState( - /* [in] */ long State) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_MediaState( - /* [out] */ long *pState) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_LocalControl( - /* [in] */ long State) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_LocalControl( - /* [out] */ long *pState) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetStatus( - /* [in] */ long StatusItem, - /* [out] */ long *pValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTransportBasicParameters( - /* [in] */ long Param, - /* [out] */ long *pValue, - /* [out] */ LPOLESTR *ppszData) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTransportBasicParameters( - /* [in] */ long Param, - /* [in] */ long Value, - /* [in] */ LPCOLESTR pszData) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTransportVideoParameters( - /* [in] */ long Param, - /* [out] */ long *pValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTransportVideoParameters( - /* [in] */ long Param, - /* [in] */ long Value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTransportAudioParameters( - /* [in] */ long Param, - /* [out] */ long *pValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTransportAudioParameters( - /* [in] */ long Param, - /* [in] */ long Value) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_Mode( - /* [in] */ long Mode) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Mode( - /* [out] */ long *pMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_Rate( - /* [in] */ double dblRate) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_Rate( - /* [out] */ double *pdblRate) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetChase( - /* [out] */ long *pEnabled, - /* [out] */ long *pOffset, - /* [out] */ HEVENT *phEvent) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetChase( - /* [in] */ long Enable, - /* [in] */ long Offset, - /* [in] */ HEVENT hEvent) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBump( - /* [out] */ long *pSpeed, - /* [out] */ long *pDuration) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetBump( - /* [in] */ long Speed, - /* [in] */ long Duration) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_AntiClogControl( - /* [out] */ long *pEnabled) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_AntiClogControl( - /* [in] */ long Enable) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetEditPropertySet( - /* [in] */ long EditID, - /* [out] */ long *pState) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetEditPropertySet( - /* [out][in] */ long *pEditID, - /* [in] */ long State) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetEditProperty( - /* [in] */ long EditID, - /* [in] */ long Param, - /* [out] */ long *pValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetEditProperty( - /* [in] */ long EditID, - /* [in] */ long Param, - /* [in] */ long Value) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_EditStart( - /* [out] */ long *pValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_EditStart( - /* [in] */ long Value) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMExtTransportVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMExtTransport * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMExtTransport * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMExtTransport * This); - - HRESULT ( STDMETHODCALLTYPE *GetCapability )( - IAMExtTransport * This, - /* [in] */ long Capability, - /* [out] */ long *pValue, - /* [out] */ double *pdblValue); - - HRESULT ( STDMETHODCALLTYPE *put_MediaState )( - IAMExtTransport * This, - /* [in] */ long State); - - HRESULT ( STDMETHODCALLTYPE *get_MediaState )( - IAMExtTransport * This, - /* [out] */ long *pState); - - HRESULT ( STDMETHODCALLTYPE *put_LocalControl )( - IAMExtTransport * This, - /* [in] */ long State); - - HRESULT ( STDMETHODCALLTYPE *get_LocalControl )( - IAMExtTransport * This, - /* [out] */ long *pState); - - HRESULT ( STDMETHODCALLTYPE *GetStatus )( - IAMExtTransport * This, - /* [in] */ long StatusItem, - /* [out] */ long *pValue); - - HRESULT ( STDMETHODCALLTYPE *GetTransportBasicParameters )( - IAMExtTransport * This, - /* [in] */ long Param, - /* [out] */ long *pValue, - /* [out] */ LPOLESTR *ppszData); - - HRESULT ( STDMETHODCALLTYPE *SetTransportBasicParameters )( - IAMExtTransport * This, - /* [in] */ long Param, - /* [in] */ long Value, - /* [in] */ LPCOLESTR pszData); - - HRESULT ( STDMETHODCALLTYPE *GetTransportVideoParameters )( - IAMExtTransport * This, - /* [in] */ long Param, - /* [out] */ long *pValue); - - HRESULT ( STDMETHODCALLTYPE *SetTransportVideoParameters )( - IAMExtTransport * This, - /* [in] */ long Param, - /* [in] */ long Value); - - HRESULT ( STDMETHODCALLTYPE *GetTransportAudioParameters )( - IAMExtTransport * This, - /* [in] */ long Param, - /* [out] */ long *pValue); - - HRESULT ( STDMETHODCALLTYPE *SetTransportAudioParameters )( - IAMExtTransport * This, - /* [in] */ long Param, - /* [in] */ long Value); - - HRESULT ( STDMETHODCALLTYPE *put_Mode )( - IAMExtTransport * This, - /* [in] */ long Mode); - - HRESULT ( STDMETHODCALLTYPE *get_Mode )( - IAMExtTransport * This, - /* [out] */ long *pMode); - - HRESULT ( STDMETHODCALLTYPE *put_Rate )( - IAMExtTransport * This, - /* [in] */ double dblRate); - - HRESULT ( STDMETHODCALLTYPE *get_Rate )( - IAMExtTransport * This, - /* [out] */ double *pdblRate); - - HRESULT ( STDMETHODCALLTYPE *GetChase )( - IAMExtTransport * This, - /* [out] */ long *pEnabled, - /* [out] */ long *pOffset, - /* [out] */ HEVENT *phEvent); - - HRESULT ( STDMETHODCALLTYPE *SetChase )( - IAMExtTransport * This, - /* [in] */ long Enable, - /* [in] */ long Offset, - /* [in] */ HEVENT hEvent); - - HRESULT ( STDMETHODCALLTYPE *GetBump )( - IAMExtTransport * This, - /* [out] */ long *pSpeed, - /* [out] */ long *pDuration); - - HRESULT ( STDMETHODCALLTYPE *SetBump )( - IAMExtTransport * This, - /* [in] */ long Speed, - /* [in] */ long Duration); - - HRESULT ( STDMETHODCALLTYPE *get_AntiClogControl )( - IAMExtTransport * This, - /* [out] */ long *pEnabled); - - HRESULT ( STDMETHODCALLTYPE *put_AntiClogControl )( - IAMExtTransport * This, - /* [in] */ long Enable); - - HRESULT ( STDMETHODCALLTYPE *GetEditPropertySet )( - IAMExtTransport * This, - /* [in] */ long EditID, - /* [out] */ long *pState); - - HRESULT ( STDMETHODCALLTYPE *SetEditPropertySet )( - IAMExtTransport * This, - /* [out][in] */ long *pEditID, - /* [in] */ long State); - - HRESULT ( STDMETHODCALLTYPE *GetEditProperty )( - IAMExtTransport * This, - /* [in] */ long EditID, - /* [in] */ long Param, - /* [out] */ long *pValue); - - HRESULT ( STDMETHODCALLTYPE *SetEditProperty )( - IAMExtTransport * This, - /* [in] */ long EditID, - /* [in] */ long Param, - /* [in] */ long Value); - - HRESULT ( STDMETHODCALLTYPE *get_EditStart )( - IAMExtTransport * This, - /* [out] */ long *pValue); - - HRESULT ( STDMETHODCALLTYPE *put_EditStart )( - IAMExtTransport * This, - /* [in] */ long Value); - - END_INTERFACE - } IAMExtTransportVtbl; - - interface IAMExtTransport - { - CONST_VTBL struct IAMExtTransportVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMExtTransport_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMExtTransport_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMExtTransport_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMExtTransport_GetCapability(This,Capability,pValue,pdblValue) \ - (This)->lpVtbl -> GetCapability(This,Capability,pValue,pdblValue) - -#define IAMExtTransport_put_MediaState(This,State) \ - (This)->lpVtbl -> put_MediaState(This,State) - -#define IAMExtTransport_get_MediaState(This,pState) \ - (This)->lpVtbl -> get_MediaState(This,pState) - -#define IAMExtTransport_put_LocalControl(This,State) \ - (This)->lpVtbl -> put_LocalControl(This,State) - -#define IAMExtTransport_get_LocalControl(This,pState) \ - (This)->lpVtbl -> get_LocalControl(This,pState) - -#define IAMExtTransport_GetStatus(This,StatusItem,pValue) \ - (This)->lpVtbl -> GetStatus(This,StatusItem,pValue) - -#define IAMExtTransport_GetTransportBasicParameters(This,Param,pValue,ppszData) \ - (This)->lpVtbl -> GetTransportBasicParameters(This,Param,pValue,ppszData) - -#define IAMExtTransport_SetTransportBasicParameters(This,Param,Value,pszData) \ - (This)->lpVtbl -> SetTransportBasicParameters(This,Param,Value,pszData) - -#define IAMExtTransport_GetTransportVideoParameters(This,Param,pValue) \ - (This)->lpVtbl -> GetTransportVideoParameters(This,Param,pValue) - -#define IAMExtTransport_SetTransportVideoParameters(This,Param,Value) \ - (This)->lpVtbl -> SetTransportVideoParameters(This,Param,Value) - -#define IAMExtTransport_GetTransportAudioParameters(This,Param,pValue) \ - (This)->lpVtbl -> GetTransportAudioParameters(This,Param,pValue) - -#define IAMExtTransport_SetTransportAudioParameters(This,Param,Value) \ - (This)->lpVtbl -> SetTransportAudioParameters(This,Param,Value) - -#define IAMExtTransport_put_Mode(This,Mode) \ - (This)->lpVtbl -> put_Mode(This,Mode) - -#define IAMExtTransport_get_Mode(This,pMode) \ - (This)->lpVtbl -> get_Mode(This,pMode) - -#define IAMExtTransport_put_Rate(This,dblRate) \ - (This)->lpVtbl -> put_Rate(This,dblRate) - -#define IAMExtTransport_get_Rate(This,pdblRate) \ - (This)->lpVtbl -> get_Rate(This,pdblRate) - -#define IAMExtTransport_GetChase(This,pEnabled,pOffset,phEvent) \ - (This)->lpVtbl -> GetChase(This,pEnabled,pOffset,phEvent) - -#define IAMExtTransport_SetChase(This,Enable,Offset,hEvent) \ - (This)->lpVtbl -> SetChase(This,Enable,Offset,hEvent) - -#define IAMExtTransport_GetBump(This,pSpeed,pDuration) \ - (This)->lpVtbl -> GetBump(This,pSpeed,pDuration) - -#define IAMExtTransport_SetBump(This,Speed,Duration) \ - (This)->lpVtbl -> SetBump(This,Speed,Duration) - -#define IAMExtTransport_get_AntiClogControl(This,pEnabled) \ - (This)->lpVtbl -> get_AntiClogControl(This,pEnabled) - -#define IAMExtTransport_put_AntiClogControl(This,Enable) \ - (This)->lpVtbl -> put_AntiClogControl(This,Enable) - -#define IAMExtTransport_GetEditPropertySet(This,EditID,pState) \ - (This)->lpVtbl -> GetEditPropertySet(This,EditID,pState) - -#define IAMExtTransport_SetEditPropertySet(This,pEditID,State) \ - (This)->lpVtbl -> SetEditPropertySet(This,pEditID,State) - -#define IAMExtTransport_GetEditProperty(This,EditID,Param,pValue) \ - (This)->lpVtbl -> GetEditProperty(This,EditID,Param,pValue) - -#define IAMExtTransport_SetEditProperty(This,EditID,Param,Value) \ - (This)->lpVtbl -> SetEditProperty(This,EditID,Param,Value) - -#define IAMExtTransport_get_EditStart(This,pValue) \ - (This)->lpVtbl -> get_EditStart(This,pValue) - -#define IAMExtTransport_put_EditStart(This,Value) \ - (This)->lpVtbl -> put_EditStart(This,Value) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_GetCapability_Proxy( - IAMExtTransport * This, - /* [in] */ long Capability, - /* [out] */ long *pValue, - /* [out] */ double *pdblValue); - - -void __RPC_STUB IAMExtTransport_GetCapability_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_put_MediaState_Proxy( - IAMExtTransport * This, - /* [in] */ long State); - - -void __RPC_STUB IAMExtTransport_put_MediaState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_get_MediaState_Proxy( - IAMExtTransport * This, - /* [out] */ long *pState); - - -void __RPC_STUB IAMExtTransport_get_MediaState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_put_LocalControl_Proxy( - IAMExtTransport * This, - /* [in] */ long State); - - -void __RPC_STUB IAMExtTransport_put_LocalControl_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_get_LocalControl_Proxy( - IAMExtTransport * This, - /* [out] */ long *pState); - - -void __RPC_STUB IAMExtTransport_get_LocalControl_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_GetStatus_Proxy( - IAMExtTransport * This, - /* [in] */ long StatusItem, - /* [out] */ long *pValue); - - -void __RPC_STUB IAMExtTransport_GetStatus_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_GetTransportBasicParameters_Proxy( - IAMExtTransport * This, - /* [in] */ long Param, - /* [out] */ long *pValue, - /* [out] */ LPOLESTR *ppszData); - - -void __RPC_STUB IAMExtTransport_GetTransportBasicParameters_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_SetTransportBasicParameters_Proxy( - IAMExtTransport * This, - /* [in] */ long Param, - /* [in] */ long Value, - /* [in] */ LPCOLESTR pszData); - - -void __RPC_STUB IAMExtTransport_SetTransportBasicParameters_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_GetTransportVideoParameters_Proxy( - IAMExtTransport * This, - /* [in] */ long Param, - /* [out] */ long *pValue); - - -void __RPC_STUB IAMExtTransport_GetTransportVideoParameters_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_SetTransportVideoParameters_Proxy( - IAMExtTransport * This, - /* [in] */ long Param, - /* [in] */ long Value); - - -void __RPC_STUB IAMExtTransport_SetTransportVideoParameters_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_GetTransportAudioParameters_Proxy( - IAMExtTransport * This, - /* [in] */ long Param, - /* [out] */ long *pValue); - - -void __RPC_STUB IAMExtTransport_GetTransportAudioParameters_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_SetTransportAudioParameters_Proxy( - IAMExtTransport * This, - /* [in] */ long Param, - /* [in] */ long Value); - - -void __RPC_STUB IAMExtTransport_SetTransportAudioParameters_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_put_Mode_Proxy( - IAMExtTransport * This, - /* [in] */ long Mode); - - -void __RPC_STUB IAMExtTransport_put_Mode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_get_Mode_Proxy( - IAMExtTransport * This, - /* [out] */ long *pMode); - - -void __RPC_STUB IAMExtTransport_get_Mode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_put_Rate_Proxy( - IAMExtTransport * This, - /* [in] */ double dblRate); - - -void __RPC_STUB IAMExtTransport_put_Rate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_get_Rate_Proxy( - IAMExtTransport * This, - /* [out] */ double *pdblRate); - - -void __RPC_STUB IAMExtTransport_get_Rate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_GetChase_Proxy( - IAMExtTransport * This, - /* [out] */ long *pEnabled, - /* [out] */ long *pOffset, - /* [out] */ HEVENT *phEvent); - - -void __RPC_STUB IAMExtTransport_GetChase_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_SetChase_Proxy( - IAMExtTransport * This, - /* [in] */ long Enable, - /* [in] */ long Offset, - /* [in] */ HEVENT hEvent); - - -void __RPC_STUB IAMExtTransport_SetChase_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_GetBump_Proxy( - IAMExtTransport * This, - /* [out] */ long *pSpeed, - /* [out] */ long *pDuration); - - -void __RPC_STUB IAMExtTransport_GetBump_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_SetBump_Proxy( - IAMExtTransport * This, - /* [in] */ long Speed, - /* [in] */ long Duration); - - -void __RPC_STUB IAMExtTransport_SetBump_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_get_AntiClogControl_Proxy( - IAMExtTransport * This, - /* [out] */ long *pEnabled); - - -void __RPC_STUB IAMExtTransport_get_AntiClogControl_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_put_AntiClogControl_Proxy( - IAMExtTransport * This, - /* [in] */ long Enable); - - -void __RPC_STUB IAMExtTransport_put_AntiClogControl_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_GetEditPropertySet_Proxy( - IAMExtTransport * This, - /* [in] */ long EditID, - /* [out] */ long *pState); - - -void __RPC_STUB IAMExtTransport_GetEditPropertySet_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_SetEditPropertySet_Proxy( - IAMExtTransport * This, - /* [out][in] */ long *pEditID, - /* [in] */ long State); - - -void __RPC_STUB IAMExtTransport_SetEditPropertySet_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_GetEditProperty_Proxy( - IAMExtTransport * This, - /* [in] */ long EditID, - /* [in] */ long Param, - /* [out] */ long *pValue); - - -void __RPC_STUB IAMExtTransport_GetEditProperty_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_SetEditProperty_Proxy( - IAMExtTransport * This, - /* [in] */ long EditID, - /* [in] */ long Param, - /* [in] */ long Value); - - -void __RPC_STUB IAMExtTransport_SetEditProperty_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_get_EditStart_Proxy( - IAMExtTransport * This, - /* [out] */ long *pValue); - - -void __RPC_STUB IAMExtTransport_get_EditStart_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMExtTransport_put_EditStart_Proxy( - IAMExtTransport * This, - /* [in] */ long Value); - - -void __RPC_STUB IAMExtTransport_put_EditStart_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMExtTransport_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0330 */ -/* [local] */ - -typedef IAMExtTransport *PIAMEXTTRANSPORT; - -#if 0 -/* the following is what MIDL knows how to remote */ -typedef struct tagTIMECODE - { - WORD wFrameRate; - WORD wFrameFract; - DWORD dwFrames; - } TIMECODE; - -#else /* 0 */ -#ifndef TIMECODE_DEFINED -#define TIMECODE_DEFINED -typedef union _timecode { - struct { - WORD wFrameRate; - WORD wFrameFract; - DWORD dwFrames; - }; - DWORDLONG qw; - } TIMECODE; - -#endif /* TIMECODE_DEFINED */ -#endif /* 0 */ -typedef TIMECODE *PTIMECODE; - -typedef struct tagTIMECODE_SAMPLE - { - LONGLONG qwTick; - TIMECODE timecode; - DWORD dwUser; - DWORD dwFlags; - } TIMECODE_SAMPLE; - -typedef TIMECODE_SAMPLE *PTIMECODE_SAMPLE; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0330_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0330_v0_0_s_ifspec; - -#ifndef __IAMTimecodeReader_INTERFACE_DEFINED__ -#define __IAMTimecodeReader_INTERFACE_DEFINED__ - -/* interface IAMTimecodeReader */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMTimecodeReader; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("9B496CE1-811B-11cf-8C77-00AA006B6814") - IAMTimecodeReader : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetTCRMode( - /* [in] */ long Param, - /* [out] */ long *pValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTCRMode( - /* [in] */ long Param, - /* [in] */ long Value) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_VITCLine( - /* [in] */ long Line) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_VITCLine( - /* [out] */ long *pLine) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimecode( - /* [out] */ PTIMECODE_SAMPLE pTimecodeSample) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTimecodeReaderVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimecodeReader * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimecodeReader * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimecodeReader * This); - - HRESULT ( STDMETHODCALLTYPE *GetTCRMode )( - IAMTimecodeReader * This, - /* [in] */ long Param, - /* [out] */ long *pValue); - - HRESULT ( STDMETHODCALLTYPE *SetTCRMode )( - IAMTimecodeReader * This, - /* [in] */ long Param, - /* [in] */ long Value); - - HRESULT ( STDMETHODCALLTYPE *put_VITCLine )( - IAMTimecodeReader * This, - /* [in] */ long Line); - - HRESULT ( STDMETHODCALLTYPE *get_VITCLine )( - IAMTimecodeReader * This, - /* [out] */ long *pLine); - - HRESULT ( STDMETHODCALLTYPE *GetTimecode )( - IAMTimecodeReader * This, - /* [out] */ PTIMECODE_SAMPLE pTimecodeSample); - - END_INTERFACE - } IAMTimecodeReaderVtbl; - - interface IAMTimecodeReader - { - CONST_VTBL struct IAMTimecodeReaderVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTimecodeReader_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTimecodeReader_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTimecodeReader_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTimecodeReader_GetTCRMode(This,Param,pValue) \ - (This)->lpVtbl -> GetTCRMode(This,Param,pValue) - -#define IAMTimecodeReader_SetTCRMode(This,Param,Value) \ - (This)->lpVtbl -> SetTCRMode(This,Param,Value) - -#define IAMTimecodeReader_put_VITCLine(This,Line) \ - (This)->lpVtbl -> put_VITCLine(This,Line) - -#define IAMTimecodeReader_get_VITCLine(This,pLine) \ - (This)->lpVtbl -> get_VITCLine(This,pLine) - -#define IAMTimecodeReader_GetTimecode(This,pTimecodeSample) \ - (This)->lpVtbl -> GetTimecode(This,pTimecodeSample) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMTimecodeReader_GetTCRMode_Proxy( - IAMTimecodeReader * This, - /* [in] */ long Param, - /* [out] */ long *pValue); - - -void __RPC_STUB IAMTimecodeReader_GetTCRMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimecodeReader_SetTCRMode_Proxy( - IAMTimecodeReader * This, - /* [in] */ long Param, - /* [in] */ long Value); - - -void __RPC_STUB IAMTimecodeReader_SetTCRMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimecodeReader_put_VITCLine_Proxy( - IAMTimecodeReader * This, - /* [in] */ long Line); - - -void __RPC_STUB IAMTimecodeReader_put_VITCLine_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimecodeReader_get_VITCLine_Proxy( - IAMTimecodeReader * This, - /* [out] */ long *pLine); - - -void __RPC_STUB IAMTimecodeReader_get_VITCLine_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimecodeReader_GetTimecode_Proxy( - IAMTimecodeReader * This, - /* [out] */ PTIMECODE_SAMPLE pTimecodeSample); - - -void __RPC_STUB IAMTimecodeReader_GetTimecode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTimecodeReader_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0331 */ -/* [local] */ - -typedef IAMTimecodeReader *PIAMTIMECODEREADER; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0331_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0331_v0_0_s_ifspec; - -#ifndef __IAMTimecodeGenerator_INTERFACE_DEFINED__ -#define __IAMTimecodeGenerator_INTERFACE_DEFINED__ - -/* interface IAMTimecodeGenerator */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMTimecodeGenerator; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("9B496CE0-811B-11cf-8C77-00AA006B6814") - IAMTimecodeGenerator : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetTCGMode( - /* [in] */ long Param, - /* [out] */ long *pValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTCGMode( - /* [in] */ long Param, - /* [in] */ long Value) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_VITCLine( - /* [in] */ long Line) = 0; - - virtual HRESULT STDMETHODCALLTYPE get_VITCLine( - /* [out] */ long *pLine) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTimecode( - /* [in] */ PTIMECODE_SAMPLE pTimecodeSample) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimecode( - /* [out] */ PTIMECODE_SAMPLE pTimecodeSample) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTimecodeGeneratorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimecodeGenerator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimecodeGenerator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimecodeGenerator * This); - - HRESULT ( STDMETHODCALLTYPE *GetTCGMode )( - IAMTimecodeGenerator * This, - /* [in] */ long Param, - /* [out] */ long *pValue); - - HRESULT ( STDMETHODCALLTYPE *SetTCGMode )( - IAMTimecodeGenerator * This, - /* [in] */ long Param, - /* [in] */ long Value); - - HRESULT ( STDMETHODCALLTYPE *put_VITCLine )( - IAMTimecodeGenerator * This, - /* [in] */ long Line); - - HRESULT ( STDMETHODCALLTYPE *get_VITCLine )( - IAMTimecodeGenerator * This, - /* [out] */ long *pLine); - - HRESULT ( STDMETHODCALLTYPE *SetTimecode )( - IAMTimecodeGenerator * This, - /* [in] */ PTIMECODE_SAMPLE pTimecodeSample); - - HRESULT ( STDMETHODCALLTYPE *GetTimecode )( - IAMTimecodeGenerator * This, - /* [out] */ PTIMECODE_SAMPLE pTimecodeSample); - - END_INTERFACE - } IAMTimecodeGeneratorVtbl; - - interface IAMTimecodeGenerator - { - CONST_VTBL struct IAMTimecodeGeneratorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTimecodeGenerator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTimecodeGenerator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTimecodeGenerator_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTimecodeGenerator_GetTCGMode(This,Param,pValue) \ - (This)->lpVtbl -> GetTCGMode(This,Param,pValue) - -#define IAMTimecodeGenerator_SetTCGMode(This,Param,Value) \ - (This)->lpVtbl -> SetTCGMode(This,Param,Value) - -#define IAMTimecodeGenerator_put_VITCLine(This,Line) \ - (This)->lpVtbl -> put_VITCLine(This,Line) - -#define IAMTimecodeGenerator_get_VITCLine(This,pLine) \ - (This)->lpVtbl -> get_VITCLine(This,pLine) - -#define IAMTimecodeGenerator_SetTimecode(This,pTimecodeSample) \ - (This)->lpVtbl -> SetTimecode(This,pTimecodeSample) - -#define IAMTimecodeGenerator_GetTimecode(This,pTimecodeSample) \ - (This)->lpVtbl -> GetTimecode(This,pTimecodeSample) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMTimecodeGenerator_GetTCGMode_Proxy( - IAMTimecodeGenerator * This, - /* [in] */ long Param, - /* [out] */ long *pValue); - - -void __RPC_STUB IAMTimecodeGenerator_GetTCGMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimecodeGenerator_SetTCGMode_Proxy( - IAMTimecodeGenerator * This, - /* [in] */ long Param, - /* [in] */ long Value); - - -void __RPC_STUB IAMTimecodeGenerator_SetTCGMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimecodeGenerator_put_VITCLine_Proxy( - IAMTimecodeGenerator * This, - /* [in] */ long Line); - - -void __RPC_STUB IAMTimecodeGenerator_put_VITCLine_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimecodeGenerator_get_VITCLine_Proxy( - IAMTimecodeGenerator * This, - /* [out] */ long *pLine); - - -void __RPC_STUB IAMTimecodeGenerator_get_VITCLine_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimecodeGenerator_SetTimecode_Proxy( - IAMTimecodeGenerator * This, - /* [in] */ PTIMECODE_SAMPLE pTimecodeSample); - - -void __RPC_STUB IAMTimecodeGenerator_SetTimecode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimecodeGenerator_GetTimecode_Proxy( - IAMTimecodeGenerator * This, - /* [out] */ PTIMECODE_SAMPLE pTimecodeSample); - - -void __RPC_STUB IAMTimecodeGenerator_GetTimecode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTimecodeGenerator_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0332 */ -/* [local] */ - -typedef IAMTimecodeGenerator *PIAMTIMECODEGENERATOR; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0332_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0332_v0_0_s_ifspec; - -#ifndef __IAMTimecodeDisplay_INTERFACE_DEFINED__ -#define __IAMTimecodeDisplay_INTERFACE_DEFINED__ - -/* interface IAMTimecodeDisplay */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMTimecodeDisplay; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("9B496CE2-811B-11cf-8C77-00AA006B6814") - IAMTimecodeDisplay : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetTCDisplayEnable( - /* [out] */ long *pState) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTCDisplayEnable( - /* [in] */ long State) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTCDisplay( - /* [in] */ long Param, - /* [out] */ long *pValue) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTCDisplay( - /* [in] */ long Param, - /* [in] */ long Value) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMTimecodeDisplayVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMTimecodeDisplay * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMTimecodeDisplay * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMTimecodeDisplay * This); - - HRESULT ( STDMETHODCALLTYPE *GetTCDisplayEnable )( - IAMTimecodeDisplay * This, - /* [out] */ long *pState); - - HRESULT ( STDMETHODCALLTYPE *SetTCDisplayEnable )( - IAMTimecodeDisplay * This, - /* [in] */ long State); - - HRESULT ( STDMETHODCALLTYPE *GetTCDisplay )( - IAMTimecodeDisplay * This, - /* [in] */ long Param, - /* [out] */ long *pValue); - - HRESULT ( STDMETHODCALLTYPE *SetTCDisplay )( - IAMTimecodeDisplay * This, - /* [in] */ long Param, - /* [in] */ long Value); - - END_INTERFACE - } IAMTimecodeDisplayVtbl; - - interface IAMTimecodeDisplay - { - CONST_VTBL struct IAMTimecodeDisplayVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMTimecodeDisplay_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMTimecodeDisplay_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMTimecodeDisplay_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMTimecodeDisplay_GetTCDisplayEnable(This,pState) \ - (This)->lpVtbl -> GetTCDisplayEnable(This,pState) - -#define IAMTimecodeDisplay_SetTCDisplayEnable(This,State) \ - (This)->lpVtbl -> SetTCDisplayEnable(This,State) - -#define IAMTimecodeDisplay_GetTCDisplay(This,Param,pValue) \ - (This)->lpVtbl -> GetTCDisplay(This,Param,pValue) - -#define IAMTimecodeDisplay_SetTCDisplay(This,Param,Value) \ - (This)->lpVtbl -> SetTCDisplay(This,Param,Value) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMTimecodeDisplay_GetTCDisplayEnable_Proxy( - IAMTimecodeDisplay * This, - /* [out] */ long *pState); - - -void __RPC_STUB IAMTimecodeDisplay_GetTCDisplayEnable_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimecodeDisplay_SetTCDisplayEnable_Proxy( - IAMTimecodeDisplay * This, - /* [in] */ long State); - - -void __RPC_STUB IAMTimecodeDisplay_SetTCDisplayEnable_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimecodeDisplay_GetTCDisplay_Proxy( - IAMTimecodeDisplay * This, - /* [in] */ long Param, - /* [out] */ long *pValue); - - -void __RPC_STUB IAMTimecodeDisplay_GetTCDisplay_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMTimecodeDisplay_SetTCDisplay_Proxy( - IAMTimecodeDisplay * This, - /* [in] */ long Param, - /* [in] */ long Value); - - -void __RPC_STUB IAMTimecodeDisplay_SetTCDisplay_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMTimecodeDisplay_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0333 */ -/* [local] */ - -typedef IAMTimecodeDisplay *PIAMTIMECODEDISPLAY; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0333_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0333_v0_0_s_ifspec; - -#ifndef __IAMDevMemoryAllocator_INTERFACE_DEFINED__ -#define __IAMDevMemoryAllocator_INTERFACE_DEFINED__ - -/* interface IAMDevMemoryAllocator */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMDevMemoryAllocator; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("c6545bf0-e76b-11d0-bd52-00a0c911ce86") - IAMDevMemoryAllocator : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetInfo( - /* [out] */ DWORD *pdwcbTotalFree, - /* [out] */ DWORD *pdwcbLargestFree, - /* [out] */ DWORD *pdwcbTotalMemory, - /* [out] */ DWORD *pdwcbMinimumChunk) = 0; - - virtual HRESULT STDMETHODCALLTYPE CheckMemory( - /* [in] */ const BYTE *pBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE Alloc( - /* [out] */ BYTE **ppBuffer, - /* [out][in] */ DWORD *pdwcbBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE Free( - /* [in] */ BYTE *pBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDevMemoryObject( - /* [out] */ IUnknown **ppUnkInnner, - /* [in] */ IUnknown *pUnkOuter) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMDevMemoryAllocatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMDevMemoryAllocator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMDevMemoryAllocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMDevMemoryAllocator * This); - - HRESULT ( STDMETHODCALLTYPE *GetInfo )( - IAMDevMemoryAllocator * This, - /* [out] */ DWORD *pdwcbTotalFree, - /* [out] */ DWORD *pdwcbLargestFree, - /* [out] */ DWORD *pdwcbTotalMemory, - /* [out] */ DWORD *pdwcbMinimumChunk); - - HRESULT ( STDMETHODCALLTYPE *CheckMemory )( - IAMDevMemoryAllocator * This, - /* [in] */ const BYTE *pBuffer); - - HRESULT ( STDMETHODCALLTYPE *Alloc )( - IAMDevMemoryAllocator * This, - /* [out] */ BYTE **ppBuffer, - /* [out][in] */ DWORD *pdwcbBuffer); - - HRESULT ( STDMETHODCALLTYPE *Free )( - IAMDevMemoryAllocator * This, - /* [in] */ BYTE *pBuffer); - - HRESULT ( STDMETHODCALLTYPE *GetDevMemoryObject )( - IAMDevMemoryAllocator * This, - /* [out] */ IUnknown **ppUnkInnner, - /* [in] */ IUnknown *pUnkOuter); - - END_INTERFACE - } IAMDevMemoryAllocatorVtbl; - - interface IAMDevMemoryAllocator - { - CONST_VTBL struct IAMDevMemoryAllocatorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMDevMemoryAllocator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMDevMemoryAllocator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMDevMemoryAllocator_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMDevMemoryAllocator_GetInfo(This,pdwcbTotalFree,pdwcbLargestFree,pdwcbTotalMemory,pdwcbMinimumChunk) \ - (This)->lpVtbl -> GetInfo(This,pdwcbTotalFree,pdwcbLargestFree,pdwcbTotalMemory,pdwcbMinimumChunk) - -#define IAMDevMemoryAllocator_CheckMemory(This,pBuffer) \ - (This)->lpVtbl -> CheckMemory(This,pBuffer) - -#define IAMDevMemoryAllocator_Alloc(This,ppBuffer,pdwcbBuffer) \ - (This)->lpVtbl -> Alloc(This,ppBuffer,pdwcbBuffer) - -#define IAMDevMemoryAllocator_Free(This,pBuffer) \ - (This)->lpVtbl -> Free(This,pBuffer) - -#define IAMDevMemoryAllocator_GetDevMemoryObject(This,ppUnkInnner,pUnkOuter) \ - (This)->lpVtbl -> GetDevMemoryObject(This,ppUnkInnner,pUnkOuter) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMDevMemoryAllocator_GetInfo_Proxy( - IAMDevMemoryAllocator * This, - /* [out] */ DWORD *pdwcbTotalFree, - /* [out] */ DWORD *pdwcbLargestFree, - /* [out] */ DWORD *pdwcbTotalMemory, - /* [out] */ DWORD *pdwcbMinimumChunk); - - -void __RPC_STUB IAMDevMemoryAllocator_GetInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMDevMemoryAllocator_CheckMemory_Proxy( - IAMDevMemoryAllocator * This, - /* [in] */ const BYTE *pBuffer); - - -void __RPC_STUB IAMDevMemoryAllocator_CheckMemory_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMDevMemoryAllocator_Alloc_Proxy( - IAMDevMemoryAllocator * This, - /* [out] */ BYTE **ppBuffer, - /* [out][in] */ DWORD *pdwcbBuffer); - - -void __RPC_STUB IAMDevMemoryAllocator_Alloc_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMDevMemoryAllocator_Free_Proxy( - IAMDevMemoryAllocator * This, - /* [in] */ BYTE *pBuffer); - - -void __RPC_STUB IAMDevMemoryAllocator_Free_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMDevMemoryAllocator_GetDevMemoryObject_Proxy( - IAMDevMemoryAllocator * This, - /* [out] */ IUnknown **ppUnkInnner, - /* [in] */ IUnknown *pUnkOuter); - - -void __RPC_STUB IAMDevMemoryAllocator_GetDevMemoryObject_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMDevMemoryAllocator_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0334 */ -/* [local] */ - -typedef IAMDevMemoryAllocator *PAMDEVMEMORYALLOCATOR; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0334_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0334_v0_0_s_ifspec; - -#ifndef __IAMDevMemoryControl_INTERFACE_DEFINED__ -#define __IAMDevMemoryControl_INTERFACE_DEFINED__ - -/* interface IAMDevMemoryControl */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMDevMemoryControl; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("c6545bf1-e76b-11d0-bd52-00a0c911ce86") - IAMDevMemoryControl : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE QueryWriteSync( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE WriteSync( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDevId( - /* [out] */ DWORD *pdwDevId) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMDevMemoryControlVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMDevMemoryControl * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMDevMemoryControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMDevMemoryControl * This); - - HRESULT ( STDMETHODCALLTYPE *QueryWriteSync )( - IAMDevMemoryControl * This); - - HRESULT ( STDMETHODCALLTYPE *WriteSync )( - IAMDevMemoryControl * This); - - HRESULT ( STDMETHODCALLTYPE *GetDevId )( - IAMDevMemoryControl * This, - /* [out] */ DWORD *pdwDevId); - - END_INTERFACE - } IAMDevMemoryControlVtbl; - - interface IAMDevMemoryControl - { - CONST_VTBL struct IAMDevMemoryControlVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMDevMemoryControl_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMDevMemoryControl_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMDevMemoryControl_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMDevMemoryControl_QueryWriteSync(This) \ - (This)->lpVtbl -> QueryWriteSync(This) - -#define IAMDevMemoryControl_WriteSync(This) \ - (This)->lpVtbl -> WriteSync(This) - -#define IAMDevMemoryControl_GetDevId(This,pdwDevId) \ - (This)->lpVtbl -> GetDevId(This,pdwDevId) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMDevMemoryControl_QueryWriteSync_Proxy( - IAMDevMemoryControl * This); - - -void __RPC_STUB IAMDevMemoryControl_QueryWriteSync_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMDevMemoryControl_WriteSync_Proxy( - IAMDevMemoryControl * This); - - -void __RPC_STUB IAMDevMemoryControl_WriteSync_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMDevMemoryControl_GetDevId_Proxy( - IAMDevMemoryControl * This, - /* [out] */ DWORD *pdwDevId); - - -void __RPC_STUB IAMDevMemoryControl_GetDevId_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMDevMemoryControl_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0335 */ -/* [local] */ - -typedef IAMDevMemoryControl *PAMDEVMEMORYCONTROL; - - -enum _AMSTREAMSELECTINFOFLAGS - { AMSTREAMSELECTINFO_ENABLED = 0x1, - AMSTREAMSELECTINFO_EXCLUSIVE = 0x2 - } ; - -enum _AMSTREAMSELECTENABLEFLAGS - { AMSTREAMSELECTENABLE_ENABLE = 0x1, - AMSTREAMSELECTENABLE_ENABLEALL = 0x2 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0335_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0335_v0_0_s_ifspec; - -#ifndef __IAMStreamSelect_INTERFACE_DEFINED__ -#define __IAMStreamSelect_INTERFACE_DEFINED__ - -/* interface IAMStreamSelect */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMStreamSelect; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("c1960960-17f5-11d1-abe1-00a0c905f375") - IAMStreamSelect : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Count( - /* [out] */ DWORD *pcStreams) = 0; - - virtual HRESULT STDMETHODCALLTYPE Info( - /* [in] */ long lIndex, - /* [out] */ AM_MEDIA_TYPE **ppmt, - /* [out] */ DWORD *pdwFlags, - /* [out] */ LCID *plcid, - /* [out] */ DWORD *pdwGroup, - /* [out] */ WCHAR **ppszName, - /* [out] */ IUnknown **ppObject, - /* [out] */ IUnknown **ppUnk) = 0; - - virtual HRESULT STDMETHODCALLTYPE Enable( - /* [in] */ long lIndex, - /* [in] */ DWORD dwFlags) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMStreamSelectVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMStreamSelect * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMStreamSelect * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMStreamSelect * This); - - HRESULT ( STDMETHODCALLTYPE *Count )( - IAMStreamSelect * This, - /* [out] */ DWORD *pcStreams); - - HRESULT ( STDMETHODCALLTYPE *Info )( - IAMStreamSelect * This, - /* [in] */ long lIndex, - /* [out] */ AM_MEDIA_TYPE **ppmt, - /* [out] */ DWORD *pdwFlags, - /* [out] */ LCID *plcid, - /* [out] */ DWORD *pdwGroup, - /* [out] */ WCHAR **ppszName, - /* [out] */ IUnknown **ppObject, - /* [out] */ IUnknown **ppUnk); - - HRESULT ( STDMETHODCALLTYPE *Enable )( - IAMStreamSelect * This, - /* [in] */ long lIndex, - /* [in] */ DWORD dwFlags); - - END_INTERFACE - } IAMStreamSelectVtbl; - - interface IAMStreamSelect - { - CONST_VTBL struct IAMStreamSelectVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMStreamSelect_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMStreamSelect_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMStreamSelect_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMStreamSelect_Count(This,pcStreams) \ - (This)->lpVtbl -> Count(This,pcStreams) - -#define IAMStreamSelect_Info(This,lIndex,ppmt,pdwFlags,plcid,pdwGroup,ppszName,ppObject,ppUnk) \ - (This)->lpVtbl -> Info(This,lIndex,ppmt,pdwFlags,plcid,pdwGroup,ppszName,ppObject,ppUnk) - -#define IAMStreamSelect_Enable(This,lIndex,dwFlags) \ - (This)->lpVtbl -> Enable(This,lIndex,dwFlags) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMStreamSelect_Count_Proxy( - IAMStreamSelect * This, - /* [out] */ DWORD *pcStreams); - - -void __RPC_STUB IAMStreamSelect_Count_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMStreamSelect_Info_Proxy( - IAMStreamSelect * This, - /* [in] */ long lIndex, - /* [out] */ AM_MEDIA_TYPE **ppmt, - /* [out] */ DWORD *pdwFlags, - /* [out] */ LCID *plcid, - /* [out] */ DWORD *pdwGroup, - /* [out] */ WCHAR **ppszName, - /* [out] */ IUnknown **ppObject, - /* [out] */ IUnknown **ppUnk); - - -void __RPC_STUB IAMStreamSelect_Info_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMStreamSelect_Enable_Proxy( - IAMStreamSelect * This, - /* [in] */ long lIndex, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IAMStreamSelect_Enable_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMStreamSelect_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0336 */ -/* [local] */ - -typedef IAMStreamSelect *PAMSTREAMSELECT; - - -enum _AMRESCTL_RESERVEFLAGS - { AMRESCTL_RESERVEFLAGS_RESERVE = 0, - AMRESCTL_RESERVEFLAGS_UNRESERVE = 0x1 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0336_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0336_v0_0_s_ifspec; - -#ifndef __IAMResourceControl_INTERFACE_DEFINED__ -#define __IAMResourceControl_INTERFACE_DEFINED__ - -/* interface IAMResourceControl */ -/* [local][unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMResourceControl; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("8389d2d0-77d7-11d1-abe6-00a0c905f375") - IAMResourceControl : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Reserve( - /* [in] */ DWORD dwFlags, - /* [in] */ PVOID pvReserved) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMResourceControlVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMResourceControl * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMResourceControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMResourceControl * This); - - HRESULT ( STDMETHODCALLTYPE *Reserve )( - IAMResourceControl * This, - /* [in] */ DWORD dwFlags, - /* [in] */ PVOID pvReserved); - - END_INTERFACE - } IAMResourceControlVtbl; - - interface IAMResourceControl - { - CONST_VTBL struct IAMResourceControlVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMResourceControl_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMResourceControl_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMResourceControl_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMResourceControl_Reserve(This,dwFlags,pvReserved) \ - (This)->lpVtbl -> Reserve(This,dwFlags,pvReserved) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMResourceControl_Reserve_Proxy( - IAMResourceControl * This, - /* [in] */ DWORD dwFlags, - /* [in] */ PVOID pvReserved); - - -void __RPC_STUB IAMResourceControl_Reserve_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMResourceControl_INTERFACE_DEFINED__ */ - - -#ifndef __IAMClockAdjust_INTERFACE_DEFINED__ -#define __IAMClockAdjust_INTERFACE_DEFINED__ - -/* interface IAMClockAdjust */ -/* [local][unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMClockAdjust; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("4d5466b0-a49c-11d1-abe8-00a0c905f375") - IAMClockAdjust : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetClockDelta( - /* [in] */ REFERENCE_TIME rtDelta) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMClockAdjustVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMClockAdjust * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMClockAdjust * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMClockAdjust * This); - - HRESULT ( STDMETHODCALLTYPE *SetClockDelta )( - IAMClockAdjust * This, - /* [in] */ REFERENCE_TIME rtDelta); - - END_INTERFACE - } IAMClockAdjustVtbl; - - interface IAMClockAdjust - { - CONST_VTBL struct IAMClockAdjustVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMClockAdjust_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMClockAdjust_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMClockAdjust_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMClockAdjust_SetClockDelta(This,rtDelta) \ - (This)->lpVtbl -> SetClockDelta(This,rtDelta) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMClockAdjust_SetClockDelta_Proxy( - IAMClockAdjust * This, - /* [in] */ REFERENCE_TIME rtDelta); - - -void __RPC_STUB IAMClockAdjust_SetClockDelta_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMClockAdjust_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0338 */ -/* [local] */ - - -enum _AM_FILTER_MISC_FLAGS - { AM_FILTER_MISC_FLAGS_IS_RENDERER = 0x1, - AM_FILTER_MISC_FLAGS_IS_SOURCE = 0x2 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0338_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0338_v0_0_s_ifspec; - -#ifndef __IAMFilterMiscFlags_INTERFACE_DEFINED__ -#define __IAMFilterMiscFlags_INTERFACE_DEFINED__ - -/* interface IAMFilterMiscFlags */ -/* [local][unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMFilterMiscFlags; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("2dd74950-a890-11d1-abe8-00a0c905f375") - IAMFilterMiscFlags : public IUnknown - { - public: - virtual ULONG STDMETHODCALLTYPE GetMiscFlags( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMFilterMiscFlagsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMFilterMiscFlags * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMFilterMiscFlags * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMFilterMiscFlags * This); - - ULONG ( STDMETHODCALLTYPE *GetMiscFlags )( - IAMFilterMiscFlags * This); - - END_INTERFACE - } IAMFilterMiscFlagsVtbl; - - interface IAMFilterMiscFlags - { - CONST_VTBL struct IAMFilterMiscFlagsVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMFilterMiscFlags_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMFilterMiscFlags_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMFilterMiscFlags_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMFilterMiscFlags_GetMiscFlags(This) \ - (This)->lpVtbl -> GetMiscFlags(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -ULONG STDMETHODCALLTYPE IAMFilterMiscFlags_GetMiscFlags_Proxy( - IAMFilterMiscFlags * This); - - -void __RPC_STUB IAMFilterMiscFlags_GetMiscFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMFilterMiscFlags_INTERFACE_DEFINED__ */ - - -#ifndef __IDrawVideoImage_INTERFACE_DEFINED__ -#define __IDrawVideoImage_INTERFACE_DEFINED__ - -/* interface IDrawVideoImage */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IDrawVideoImage; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("48efb120-ab49-11d2-aed2-00a0c995e8d5") - IDrawVideoImage : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE DrawVideoImageBegin( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE DrawVideoImageEnd( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE DrawVideoImageDraw( - /* [in] */ HDC hdc, - /* [in] */ LPRECT lprcSrc, - /* [in] */ LPRECT lprcDst) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDrawVideoImageVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDrawVideoImage * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDrawVideoImage * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDrawVideoImage * This); - - HRESULT ( STDMETHODCALLTYPE *DrawVideoImageBegin )( - IDrawVideoImage * This); - - HRESULT ( STDMETHODCALLTYPE *DrawVideoImageEnd )( - IDrawVideoImage * This); - - HRESULT ( STDMETHODCALLTYPE *DrawVideoImageDraw )( - IDrawVideoImage * This, - /* [in] */ HDC hdc, - /* [in] */ LPRECT lprcSrc, - /* [in] */ LPRECT lprcDst); - - END_INTERFACE - } IDrawVideoImageVtbl; - - interface IDrawVideoImage - { - CONST_VTBL struct IDrawVideoImageVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDrawVideoImage_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDrawVideoImage_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDrawVideoImage_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDrawVideoImage_DrawVideoImageBegin(This) \ - (This)->lpVtbl -> DrawVideoImageBegin(This) - -#define IDrawVideoImage_DrawVideoImageEnd(This) \ - (This)->lpVtbl -> DrawVideoImageEnd(This) - -#define IDrawVideoImage_DrawVideoImageDraw(This,hdc,lprcSrc,lprcDst) \ - (This)->lpVtbl -> DrawVideoImageDraw(This,hdc,lprcSrc,lprcDst) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDrawVideoImage_DrawVideoImageBegin_Proxy( - IDrawVideoImage * This); - - -void __RPC_STUB IDrawVideoImage_DrawVideoImageBegin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDrawVideoImage_DrawVideoImageEnd_Proxy( - IDrawVideoImage * This); - - -void __RPC_STUB IDrawVideoImage_DrawVideoImageEnd_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDrawVideoImage_DrawVideoImageDraw_Proxy( - IDrawVideoImage * This, - /* [in] */ HDC hdc, - /* [in] */ LPRECT lprcSrc, - /* [in] */ LPRECT lprcDst); - - -void __RPC_STUB IDrawVideoImage_DrawVideoImageDraw_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDrawVideoImage_INTERFACE_DEFINED__ */ - - -#ifndef __IDecimateVideoImage_INTERFACE_DEFINED__ -#define __IDecimateVideoImage_INTERFACE_DEFINED__ - -/* interface IDecimateVideoImage */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IDecimateVideoImage; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("2e5ea3e0-e924-11d2-b6da-00a0c995e8df") - IDecimateVideoImage : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetDecimationImageSize( - /* [in] */ long lWidth, - /* [in] */ long lHeight) = 0; - - virtual HRESULT STDMETHODCALLTYPE ResetDecimationImageSize( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDecimateVideoImageVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDecimateVideoImage * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDecimateVideoImage * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDecimateVideoImage * This); - - HRESULT ( STDMETHODCALLTYPE *SetDecimationImageSize )( - IDecimateVideoImage * This, - /* [in] */ long lWidth, - /* [in] */ long lHeight); - - HRESULT ( STDMETHODCALLTYPE *ResetDecimationImageSize )( - IDecimateVideoImage * This); - - END_INTERFACE - } IDecimateVideoImageVtbl; - - interface IDecimateVideoImage - { - CONST_VTBL struct IDecimateVideoImageVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDecimateVideoImage_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDecimateVideoImage_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDecimateVideoImage_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDecimateVideoImage_SetDecimationImageSize(This,lWidth,lHeight) \ - (This)->lpVtbl -> SetDecimationImageSize(This,lWidth,lHeight) - -#define IDecimateVideoImage_ResetDecimationImageSize(This) \ - (This)->lpVtbl -> ResetDecimationImageSize(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDecimateVideoImage_SetDecimationImageSize_Proxy( - IDecimateVideoImage * This, - /* [in] */ long lWidth, - /* [in] */ long lHeight); - - -void __RPC_STUB IDecimateVideoImage_SetDecimationImageSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDecimateVideoImage_ResetDecimationImageSize_Proxy( - IDecimateVideoImage * This); - - -void __RPC_STUB IDecimateVideoImage_ResetDecimationImageSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDecimateVideoImage_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0341 */ -/* [local] */ - -typedef -enum _DECIMATION_USAGE - { DECIMATION_LEGACY = 0, - DECIMATION_USE_DECODER_ONLY = DECIMATION_LEGACY + 1, - DECIMATION_USE_VIDEOPORT_ONLY = DECIMATION_USE_DECODER_ONLY + 1, - DECIMATION_USE_OVERLAY_ONLY = DECIMATION_USE_VIDEOPORT_ONLY + 1, - DECIMATION_DEFAULT = DECIMATION_USE_OVERLAY_ONLY + 1 - } DECIMATION_USAGE; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0341_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0341_v0_0_s_ifspec; - -#ifndef __IAMVideoDecimationProperties_INTERFACE_DEFINED__ -#define __IAMVideoDecimationProperties_INTERFACE_DEFINED__ - -/* interface IAMVideoDecimationProperties */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IAMVideoDecimationProperties; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("60d32930-13da-11d3-9ec6-c4fcaef5c7be") - IAMVideoDecimationProperties : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE QueryDecimationUsage( - /* [out] */ DECIMATION_USAGE *lpUsage) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDecimationUsage( - /* [in] */ DECIMATION_USAGE Usage) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMVideoDecimationPropertiesVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMVideoDecimationProperties * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMVideoDecimationProperties * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMVideoDecimationProperties * This); - - HRESULT ( STDMETHODCALLTYPE *QueryDecimationUsage )( - IAMVideoDecimationProperties * This, - /* [out] */ DECIMATION_USAGE *lpUsage); - - HRESULT ( STDMETHODCALLTYPE *SetDecimationUsage )( - IAMVideoDecimationProperties * This, - /* [in] */ DECIMATION_USAGE Usage); - - END_INTERFACE - } IAMVideoDecimationPropertiesVtbl; - - interface IAMVideoDecimationProperties - { - CONST_VTBL struct IAMVideoDecimationPropertiesVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMVideoDecimationProperties_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMVideoDecimationProperties_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMVideoDecimationProperties_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMVideoDecimationProperties_QueryDecimationUsage(This,lpUsage) \ - (This)->lpVtbl -> QueryDecimationUsage(This,lpUsage) - -#define IAMVideoDecimationProperties_SetDecimationUsage(This,Usage) \ - (This)->lpVtbl -> SetDecimationUsage(This,Usage) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMVideoDecimationProperties_QueryDecimationUsage_Proxy( - IAMVideoDecimationProperties * This, - /* [out] */ DECIMATION_USAGE *lpUsage); - - -void __RPC_STUB IAMVideoDecimationProperties_QueryDecimationUsage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoDecimationProperties_SetDecimationUsage_Proxy( - IAMVideoDecimationProperties * This, - /* [in] */ DECIMATION_USAGE Usage); - - -void __RPC_STUB IAMVideoDecimationProperties_SetDecimationUsage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMVideoDecimationProperties_INTERFACE_DEFINED__ */ - - -#ifndef __IVideoFrameStep_INTERFACE_DEFINED__ -#define __IVideoFrameStep_INTERFACE_DEFINED__ - -/* interface IVideoFrameStep */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IVideoFrameStep; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("e46a9787-2b71-444d-a4b5-1fab7b708d6a") - IVideoFrameStep : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Step( - DWORD dwFrames, - /* [unique] */ IUnknown *pStepObject) = 0; - - virtual HRESULT STDMETHODCALLTYPE CanStep( - long bMultiple, - /* [unique] */ IUnknown *pStepObject) = 0; - - virtual HRESULT STDMETHODCALLTYPE CancelStep( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IVideoFrameStepVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IVideoFrameStep * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IVideoFrameStep * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IVideoFrameStep * This); - - HRESULT ( STDMETHODCALLTYPE *Step )( - IVideoFrameStep * This, - DWORD dwFrames, - /* [unique] */ IUnknown *pStepObject); - - HRESULT ( STDMETHODCALLTYPE *CanStep )( - IVideoFrameStep * This, - long bMultiple, - /* [unique] */ IUnknown *pStepObject); - - HRESULT ( STDMETHODCALLTYPE *CancelStep )( - IVideoFrameStep * This); - - END_INTERFACE - } IVideoFrameStepVtbl; - - interface IVideoFrameStep - { - CONST_VTBL struct IVideoFrameStepVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IVideoFrameStep_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IVideoFrameStep_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IVideoFrameStep_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IVideoFrameStep_Step(This,dwFrames,pStepObject) \ - (This)->lpVtbl -> Step(This,dwFrames,pStepObject) - -#define IVideoFrameStep_CanStep(This,bMultiple,pStepObject) \ - (This)->lpVtbl -> CanStep(This,bMultiple,pStepObject) - -#define IVideoFrameStep_CancelStep(This) \ - (This)->lpVtbl -> CancelStep(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IVideoFrameStep_Step_Proxy( - IVideoFrameStep * This, - DWORD dwFrames, - /* [unique] */ IUnknown *pStepObject); - - -void __RPC_STUB IVideoFrameStep_Step_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVideoFrameStep_CanStep_Proxy( - IVideoFrameStep * This, - long bMultiple, - /* [unique] */ IUnknown *pStepObject); - - -void __RPC_STUB IVideoFrameStep_CanStep_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVideoFrameStep_CancelStep_Proxy( - IVideoFrameStep * This); - - -void __RPC_STUB IVideoFrameStep_CancelStep_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IVideoFrameStep_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0343 */ -/* [local] */ - - -enum _AM_PUSHSOURCE_FLAGS - { AM_PUSHSOURCECAPS_INTERNAL_RM = 0x1, - AM_PUSHSOURCECAPS_NOT_LIVE = 0x2, - AM_PUSHSOURCECAPS_PRIVATE_CLOCK = 0x4, - AM_PUSHSOURCEREQS_USE_STREAM_CLOCK = 0x10000 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0343_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0343_v0_0_s_ifspec; - -#ifndef __IAMLatency_INTERFACE_DEFINED__ -#define __IAMLatency_INTERFACE_DEFINED__ - -/* interface IAMLatency */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMLatency; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("62EA93BA-EC62-11d2-B770-00C04FB6BD3D") - IAMLatency : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetLatency( - /* [in] */ REFERENCE_TIME *prtLatency) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMLatencyVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMLatency * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMLatency * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMLatency * This); - - HRESULT ( STDMETHODCALLTYPE *GetLatency )( - IAMLatency * This, - /* [in] */ REFERENCE_TIME *prtLatency); - - END_INTERFACE - } IAMLatencyVtbl; - - interface IAMLatency - { - CONST_VTBL struct IAMLatencyVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMLatency_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMLatency_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMLatency_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMLatency_GetLatency(This,prtLatency) \ - (This)->lpVtbl -> GetLatency(This,prtLatency) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMLatency_GetLatency_Proxy( - IAMLatency * This, - /* [in] */ REFERENCE_TIME *prtLatency); - - -void __RPC_STUB IAMLatency_GetLatency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMLatency_INTERFACE_DEFINED__ */ - - -#ifndef __IAMPushSource_INTERFACE_DEFINED__ -#define __IAMPushSource_INTERFACE_DEFINED__ - -/* interface IAMPushSource */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMPushSource; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("F185FE76-E64E-11d2-B76E-00C04FB6BD3D") - IAMPushSource : public IAMLatency - { - public: - virtual HRESULT STDMETHODCALLTYPE GetPushSourceFlags( - /* [out] */ ULONG *pFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetPushSourceFlags( - /* [in] */ ULONG Flags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetStreamOffset( - /* [in] */ REFERENCE_TIME rtOffset) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetStreamOffset( - /* [out] */ REFERENCE_TIME *prtOffset) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMaxStreamOffset( - /* [out] */ REFERENCE_TIME *prtMaxOffset) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMaxStreamOffset( - /* [in] */ REFERENCE_TIME rtMaxOffset) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMPushSourceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMPushSource * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMPushSource * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMPushSource * This); - - HRESULT ( STDMETHODCALLTYPE *GetLatency )( - IAMPushSource * This, - /* [in] */ REFERENCE_TIME *prtLatency); - - HRESULT ( STDMETHODCALLTYPE *GetPushSourceFlags )( - IAMPushSource * This, - /* [out] */ ULONG *pFlags); - - HRESULT ( STDMETHODCALLTYPE *SetPushSourceFlags )( - IAMPushSource * This, - /* [in] */ ULONG Flags); - - HRESULT ( STDMETHODCALLTYPE *SetStreamOffset )( - IAMPushSource * This, - /* [in] */ REFERENCE_TIME rtOffset); - - HRESULT ( STDMETHODCALLTYPE *GetStreamOffset )( - IAMPushSource * This, - /* [out] */ REFERENCE_TIME *prtOffset); - - HRESULT ( STDMETHODCALLTYPE *GetMaxStreamOffset )( - IAMPushSource * This, - /* [out] */ REFERENCE_TIME *prtMaxOffset); - - HRESULT ( STDMETHODCALLTYPE *SetMaxStreamOffset )( - IAMPushSource * This, - /* [in] */ REFERENCE_TIME rtMaxOffset); - - END_INTERFACE - } IAMPushSourceVtbl; - - interface IAMPushSource - { - CONST_VTBL struct IAMPushSourceVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMPushSource_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMPushSource_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMPushSource_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMPushSource_GetLatency(This,prtLatency) \ - (This)->lpVtbl -> GetLatency(This,prtLatency) - - -#define IAMPushSource_GetPushSourceFlags(This,pFlags) \ - (This)->lpVtbl -> GetPushSourceFlags(This,pFlags) - -#define IAMPushSource_SetPushSourceFlags(This,Flags) \ - (This)->lpVtbl -> SetPushSourceFlags(This,Flags) - -#define IAMPushSource_SetStreamOffset(This,rtOffset) \ - (This)->lpVtbl -> SetStreamOffset(This,rtOffset) - -#define IAMPushSource_GetStreamOffset(This,prtOffset) \ - (This)->lpVtbl -> GetStreamOffset(This,prtOffset) - -#define IAMPushSource_GetMaxStreamOffset(This,prtMaxOffset) \ - (This)->lpVtbl -> GetMaxStreamOffset(This,prtMaxOffset) - -#define IAMPushSource_SetMaxStreamOffset(This,rtMaxOffset) \ - (This)->lpVtbl -> SetMaxStreamOffset(This,rtMaxOffset) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMPushSource_GetPushSourceFlags_Proxy( - IAMPushSource * This, - /* [out] */ ULONG *pFlags); - - -void __RPC_STUB IAMPushSource_GetPushSourceFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPushSource_SetPushSourceFlags_Proxy( - IAMPushSource * This, - /* [in] */ ULONG Flags); - - -void __RPC_STUB IAMPushSource_SetPushSourceFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPushSource_SetStreamOffset_Proxy( - IAMPushSource * This, - /* [in] */ REFERENCE_TIME rtOffset); - - -void __RPC_STUB IAMPushSource_SetStreamOffset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPushSource_GetStreamOffset_Proxy( - IAMPushSource * This, - /* [out] */ REFERENCE_TIME *prtOffset); - - -void __RPC_STUB IAMPushSource_GetStreamOffset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPushSource_GetMaxStreamOffset_Proxy( - IAMPushSource * This, - /* [out] */ REFERENCE_TIME *prtMaxOffset); - - -void __RPC_STUB IAMPushSource_GetMaxStreamOffset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMPushSource_SetMaxStreamOffset_Proxy( - IAMPushSource * This, - /* [in] */ REFERENCE_TIME rtMaxOffset); - - -void __RPC_STUB IAMPushSource_SetMaxStreamOffset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMPushSource_INTERFACE_DEFINED__ */ - - -#ifndef __IAMDeviceRemoval_INTERFACE_DEFINED__ -#define __IAMDeviceRemoval_INTERFACE_DEFINED__ - -/* interface IAMDeviceRemoval */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMDeviceRemoval; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("f90a6130-b658-11d2-ae49-0000f8754b99") - IAMDeviceRemoval : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE DeviceInfo( - /* [out] */ CLSID *pclsidInterfaceClass, - /* [out] */ WCHAR **pwszSymbolicLink) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reassociate( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Disassociate( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMDeviceRemovalVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMDeviceRemoval * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMDeviceRemoval * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMDeviceRemoval * This); - - HRESULT ( STDMETHODCALLTYPE *DeviceInfo )( - IAMDeviceRemoval * This, - /* [out] */ CLSID *pclsidInterfaceClass, - /* [out] */ WCHAR **pwszSymbolicLink); - - HRESULT ( STDMETHODCALLTYPE *Reassociate )( - IAMDeviceRemoval * This); - - HRESULT ( STDMETHODCALLTYPE *Disassociate )( - IAMDeviceRemoval * This); - - END_INTERFACE - } IAMDeviceRemovalVtbl; - - interface IAMDeviceRemoval - { - CONST_VTBL struct IAMDeviceRemovalVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMDeviceRemoval_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMDeviceRemoval_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMDeviceRemoval_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMDeviceRemoval_DeviceInfo(This,pclsidInterfaceClass,pwszSymbolicLink) \ - (This)->lpVtbl -> DeviceInfo(This,pclsidInterfaceClass,pwszSymbolicLink) - -#define IAMDeviceRemoval_Reassociate(This) \ - (This)->lpVtbl -> Reassociate(This) - -#define IAMDeviceRemoval_Disassociate(This) \ - (This)->lpVtbl -> Disassociate(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMDeviceRemoval_DeviceInfo_Proxy( - IAMDeviceRemoval * This, - /* [out] */ CLSID *pclsidInterfaceClass, - /* [out] */ WCHAR **pwszSymbolicLink); - - -void __RPC_STUB IAMDeviceRemoval_DeviceInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMDeviceRemoval_Reassociate_Proxy( - IAMDeviceRemoval * This); - - -void __RPC_STUB IAMDeviceRemoval_Reassociate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMDeviceRemoval_Disassociate_Proxy( - IAMDeviceRemoval * This); - - -void __RPC_STUB IAMDeviceRemoval_Disassociate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMDeviceRemoval_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0345 */ -/* [local] */ - -typedef /* [public][public][public] */ struct __MIDL___MIDL_itf_strmif_0345_0001 - { - DWORD dwDVAAuxSrc; - DWORD dwDVAAuxCtl; - DWORD dwDVAAuxSrc1; - DWORD dwDVAAuxCtl1; - DWORD dwDVVAuxSrc; - DWORD dwDVVAuxCtl; - DWORD dwDVReserved[ 2 ]; - } DVINFO; - -typedef struct __MIDL___MIDL_itf_strmif_0345_0001 *PDVINFO; - - -enum _DVENCODERRESOLUTION - { DVENCODERRESOLUTION_720x480 = 2012, - DVENCODERRESOLUTION_360x240 = 2013, - DVENCODERRESOLUTION_180x120 = 2014, - DVENCODERRESOLUTION_88x60 = 2015 - } ; - -enum _DVENCODERVIDEOFORMAT - { DVENCODERVIDEOFORMAT_NTSC = 2000, - DVENCODERVIDEOFORMAT_PAL = 2001 - } ; - -enum _DVENCODERFORMAT - { DVENCODERFORMAT_DVSD = 2007, - DVENCODERFORMAT_DVHD = 2008, - DVENCODERFORMAT_DVSL = 2009 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0345_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0345_v0_0_s_ifspec; - -#ifndef __IDVEnc_INTERFACE_DEFINED__ -#define __IDVEnc_INTERFACE_DEFINED__ - -/* interface IDVEnc */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IDVEnc; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("d18e17a0-aacb-11d0-afb0-00aa00b67a42") - IDVEnc : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE get_IFormatResolution( - /* [out] */ int *VideoFormat, - /* [out] */ int *DVFormat, - /* [out] */ int *Resolution, - /* [in] */ BYTE fDVInfo, - /* [out] */ DVINFO *sDVInfo) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_IFormatResolution( - /* [in] */ int VideoFormat, - /* [in] */ int DVFormat, - /* [in] */ int Resolution, - /* [in] */ BYTE fDVInfo, - /* [in] */ DVINFO *sDVInfo) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDVEncVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDVEnc * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDVEnc * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDVEnc * This); - - HRESULT ( STDMETHODCALLTYPE *get_IFormatResolution )( - IDVEnc * This, - /* [out] */ int *VideoFormat, - /* [out] */ int *DVFormat, - /* [out] */ int *Resolution, - /* [in] */ BYTE fDVInfo, - /* [out] */ DVINFO *sDVInfo); - - HRESULT ( STDMETHODCALLTYPE *put_IFormatResolution )( - IDVEnc * This, - /* [in] */ int VideoFormat, - /* [in] */ int DVFormat, - /* [in] */ int Resolution, - /* [in] */ BYTE fDVInfo, - /* [in] */ DVINFO *sDVInfo); - - END_INTERFACE - } IDVEncVtbl; - - interface IDVEnc - { - CONST_VTBL struct IDVEncVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDVEnc_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDVEnc_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDVEnc_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDVEnc_get_IFormatResolution(This,VideoFormat,DVFormat,Resolution,fDVInfo,sDVInfo) \ - (This)->lpVtbl -> get_IFormatResolution(This,VideoFormat,DVFormat,Resolution,fDVInfo,sDVInfo) - -#define IDVEnc_put_IFormatResolution(This,VideoFormat,DVFormat,Resolution,fDVInfo,sDVInfo) \ - (This)->lpVtbl -> put_IFormatResolution(This,VideoFormat,DVFormat,Resolution,fDVInfo,sDVInfo) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDVEnc_get_IFormatResolution_Proxy( - IDVEnc * This, - /* [out] */ int *VideoFormat, - /* [out] */ int *DVFormat, - /* [out] */ int *Resolution, - /* [in] */ BYTE fDVInfo, - /* [out] */ DVINFO *sDVInfo); - - -void __RPC_STUB IDVEnc_get_IFormatResolution_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDVEnc_put_IFormatResolution_Proxy( - IDVEnc * This, - /* [in] */ int VideoFormat, - /* [in] */ int DVFormat, - /* [in] */ int Resolution, - /* [in] */ BYTE fDVInfo, - /* [in] */ DVINFO *sDVInfo); - - -void __RPC_STUB IDVEnc_put_IFormatResolution_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDVEnc_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0346 */ -/* [local] */ - - -enum _DVDECODERRESOLUTION - { DVDECODERRESOLUTION_720x480 = 1000, - DVDECODERRESOLUTION_360x240 = 1001, - DVDECODERRESOLUTION_180x120 = 1002, - DVDECODERRESOLUTION_88x60 = 1003 - } ; - -enum _DVRESOLUTION - { DVRESOLUTION_FULL = 1000, - DVRESOLUTION_HALF = 1001, - DVRESOLUTION_QUARTER = 1002, - DVRESOLUTION_DC = 1003 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0346_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0346_v0_0_s_ifspec; - -#ifndef __IIPDVDec_INTERFACE_DEFINED__ -#define __IIPDVDec_INTERFACE_DEFINED__ - -/* interface IIPDVDec */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IIPDVDec; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("b8e8bd60-0bfe-11d0-af91-00aa00b67a42") - IIPDVDec : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE get_IPDisplay( - /* [out] */ int *displayPix) = 0; - - virtual HRESULT STDMETHODCALLTYPE put_IPDisplay( - /* [in] */ int displayPix) = 0; - - }; - -#else /* C style interface */ - - typedef struct IIPDVDecVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IIPDVDec * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IIPDVDec * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IIPDVDec * This); - - HRESULT ( STDMETHODCALLTYPE *get_IPDisplay )( - IIPDVDec * This, - /* [out] */ int *displayPix); - - HRESULT ( STDMETHODCALLTYPE *put_IPDisplay )( - IIPDVDec * This, - /* [in] */ int displayPix); - - END_INTERFACE - } IIPDVDecVtbl; - - interface IIPDVDec - { - CONST_VTBL struct IIPDVDecVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IIPDVDec_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IIPDVDec_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IIPDVDec_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IIPDVDec_get_IPDisplay(This,displayPix) \ - (This)->lpVtbl -> get_IPDisplay(This,displayPix) - -#define IIPDVDec_put_IPDisplay(This,displayPix) \ - (This)->lpVtbl -> put_IPDisplay(This,displayPix) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IIPDVDec_get_IPDisplay_Proxy( - IIPDVDec * This, - /* [out] */ int *displayPix); - - -void __RPC_STUB IIPDVDec_get_IPDisplay_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IIPDVDec_put_IPDisplay_Proxy( - IIPDVDec * This, - /* [in] */ int displayPix); - - -void __RPC_STUB IIPDVDec_put_IPDisplay_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IIPDVDec_INTERFACE_DEFINED__ */ - - -#ifndef __IDVRGB219_INTERFACE_DEFINED__ -#define __IDVRGB219_INTERFACE_DEFINED__ - -/* interface IDVRGB219 */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IDVRGB219; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("58473A19-2BC8-4663-8012-25F81BABDDD1") - IDVRGB219 : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetRGB219( - /* [in] */ BOOL bState) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDVRGB219Vtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDVRGB219 * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDVRGB219 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDVRGB219 * This); - - HRESULT ( STDMETHODCALLTYPE *SetRGB219 )( - IDVRGB219 * This, - /* [in] */ BOOL bState); - - END_INTERFACE - } IDVRGB219Vtbl; - - interface IDVRGB219 - { - CONST_VTBL struct IDVRGB219Vtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDVRGB219_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDVRGB219_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDVRGB219_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDVRGB219_SetRGB219(This,bState) \ - (This)->lpVtbl -> SetRGB219(This,bState) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDVRGB219_SetRGB219_Proxy( - IDVRGB219 * This, - /* [in] */ BOOL bState); - - -void __RPC_STUB IDVRGB219_SetRGB219_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDVRGB219_INTERFACE_DEFINED__ */ - - -#ifndef __IDVSplitter_INTERFACE_DEFINED__ -#define __IDVSplitter_INTERFACE_DEFINED__ - -/* interface IDVSplitter */ -/* [uuid][object] */ - - -EXTERN_C const IID IID_IDVSplitter; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("92a3a302-da7c-4a1f-ba7e-1802bb5d2d02") - IDVSplitter : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE DiscardAlternateVideoFrames( - /* [in] */ int nDiscard) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDVSplitterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDVSplitter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDVSplitter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDVSplitter * This); - - HRESULT ( STDMETHODCALLTYPE *DiscardAlternateVideoFrames )( - IDVSplitter * This, - /* [in] */ int nDiscard); - - END_INTERFACE - } IDVSplitterVtbl; - - interface IDVSplitter - { - CONST_VTBL struct IDVSplitterVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDVSplitter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDVSplitter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDVSplitter_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDVSplitter_DiscardAlternateVideoFrames(This,nDiscard) \ - (This)->lpVtbl -> DiscardAlternateVideoFrames(This,nDiscard) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDVSplitter_DiscardAlternateVideoFrames_Proxy( - IDVSplitter * This, - /* [in] */ int nDiscard); - - -void __RPC_STUB IDVSplitter_DiscardAlternateVideoFrames_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDVSplitter_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0349 */ -/* [local] */ - - -enum _AM_AUDIO_RENDERER_STAT_PARAM - { AM_AUDREND_STAT_PARAM_BREAK_COUNT = 1, - AM_AUDREND_STAT_PARAM_SLAVE_MODE = AM_AUDREND_STAT_PARAM_BREAK_COUNT + 1, - AM_AUDREND_STAT_PARAM_SILENCE_DUR = AM_AUDREND_STAT_PARAM_SLAVE_MODE + 1, - AM_AUDREND_STAT_PARAM_LAST_BUFFER_DUR = AM_AUDREND_STAT_PARAM_SILENCE_DUR + 1, - AM_AUDREND_STAT_PARAM_DISCONTINUITIES = AM_AUDREND_STAT_PARAM_LAST_BUFFER_DUR + 1, - AM_AUDREND_STAT_PARAM_SLAVE_RATE = AM_AUDREND_STAT_PARAM_DISCONTINUITIES + 1, - AM_AUDREND_STAT_PARAM_SLAVE_DROPWRITE_DUR = AM_AUDREND_STAT_PARAM_SLAVE_RATE + 1, - AM_AUDREND_STAT_PARAM_SLAVE_HIGHLOWERROR = AM_AUDREND_STAT_PARAM_SLAVE_DROPWRITE_DUR + 1, - AM_AUDREND_STAT_PARAM_SLAVE_LASTHIGHLOWERROR = AM_AUDREND_STAT_PARAM_SLAVE_HIGHLOWERROR + 1, - AM_AUDREND_STAT_PARAM_SLAVE_ACCUMERROR = AM_AUDREND_STAT_PARAM_SLAVE_LASTHIGHLOWERROR + 1, - AM_AUDREND_STAT_PARAM_BUFFERFULLNESS = AM_AUDREND_STAT_PARAM_SLAVE_ACCUMERROR + 1, - AM_AUDREND_STAT_PARAM_JITTER = AM_AUDREND_STAT_PARAM_BUFFERFULLNESS + 1 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0349_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0349_v0_0_s_ifspec; - -#ifndef __IAMAudioRendererStats_INTERFACE_DEFINED__ -#define __IAMAudioRendererStats_INTERFACE_DEFINED__ - -/* interface IAMAudioRendererStats */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMAudioRendererStats; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("22320CB2-D41A-11d2-BF7C-D7CB9DF0BF93") - IAMAudioRendererStats : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetStatParam( - /* [in] */ DWORD dwParam, - /* [out] */ DWORD *pdwParam1, - /* [out] */ DWORD *pdwParam2) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMAudioRendererStatsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMAudioRendererStats * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMAudioRendererStats * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMAudioRendererStats * This); - - HRESULT ( STDMETHODCALLTYPE *GetStatParam )( - IAMAudioRendererStats * This, - /* [in] */ DWORD dwParam, - /* [out] */ DWORD *pdwParam1, - /* [out] */ DWORD *pdwParam2); - - END_INTERFACE - } IAMAudioRendererStatsVtbl; - - interface IAMAudioRendererStats - { - CONST_VTBL struct IAMAudioRendererStatsVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMAudioRendererStats_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMAudioRendererStats_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMAudioRendererStats_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMAudioRendererStats_GetStatParam(This,dwParam,pdwParam1,pdwParam2) \ - (This)->lpVtbl -> GetStatParam(This,dwParam,pdwParam1,pdwParam2) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMAudioRendererStats_GetStatParam_Proxy( - IAMAudioRendererStats * This, - /* [in] */ DWORD dwParam, - /* [out] */ DWORD *pdwParam1, - /* [out] */ DWORD *pdwParam2); - - -void __RPC_STUB IAMAudioRendererStats_GetStatParam_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMAudioRendererStats_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0351 */ -/* [local] */ - - -enum _AM_INTF_SEARCH_FLAGS - { AM_INTF_SEARCH_INPUT_PIN = 0x1, - AM_INTF_SEARCH_OUTPUT_PIN = 0x2, - AM_INTF_SEARCH_FILTER = 0x4 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0351_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0351_v0_0_s_ifspec; - -#ifndef __IAMGraphStreams_INTERFACE_DEFINED__ -#define __IAMGraphStreams_INTERFACE_DEFINED__ - -/* interface IAMGraphStreams */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMGraphStreams; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("632105FA-072E-11d3-8AF9-00C04FB6BD3D") - IAMGraphStreams : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE FindUpstreamInterface( - /* [in] */ IPin *pPin, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvInterface, - /* [in] */ DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SyncUsingStreamOffset( - /* [in] */ BOOL bUseStreamOffset) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMaxGraphLatency( - /* [in] */ REFERENCE_TIME rtMaxGraphLatency) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMGraphStreamsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMGraphStreams * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMGraphStreams * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMGraphStreams * This); - - HRESULT ( STDMETHODCALLTYPE *FindUpstreamInterface )( - IAMGraphStreams * This, - /* [in] */ IPin *pPin, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvInterface, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *SyncUsingStreamOffset )( - IAMGraphStreams * This, - /* [in] */ BOOL bUseStreamOffset); - - HRESULT ( STDMETHODCALLTYPE *SetMaxGraphLatency )( - IAMGraphStreams * This, - /* [in] */ REFERENCE_TIME rtMaxGraphLatency); - - END_INTERFACE - } IAMGraphStreamsVtbl; - - interface IAMGraphStreams - { - CONST_VTBL struct IAMGraphStreamsVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMGraphStreams_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMGraphStreams_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMGraphStreams_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMGraphStreams_FindUpstreamInterface(This,pPin,riid,ppvInterface,dwFlags) \ - (This)->lpVtbl -> FindUpstreamInterface(This,pPin,riid,ppvInterface,dwFlags) - -#define IAMGraphStreams_SyncUsingStreamOffset(This,bUseStreamOffset) \ - (This)->lpVtbl -> SyncUsingStreamOffset(This,bUseStreamOffset) - -#define IAMGraphStreams_SetMaxGraphLatency(This,rtMaxGraphLatency) \ - (This)->lpVtbl -> SetMaxGraphLatency(This,rtMaxGraphLatency) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMGraphStreams_FindUpstreamInterface_Proxy( - IAMGraphStreams * This, - /* [in] */ IPin *pPin, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvInterface, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IAMGraphStreams_FindUpstreamInterface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMGraphStreams_SyncUsingStreamOffset_Proxy( - IAMGraphStreams * This, - /* [in] */ BOOL bUseStreamOffset); - - -void __RPC_STUB IAMGraphStreams_SyncUsingStreamOffset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMGraphStreams_SetMaxGraphLatency_Proxy( - IAMGraphStreams * This, - /* [in] */ REFERENCE_TIME rtMaxGraphLatency); - - -void __RPC_STUB IAMGraphStreams_SetMaxGraphLatency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMGraphStreams_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0352 */ -/* [local] */ - - -enum AMOVERLAYFX - { AMOVERFX_NOFX = 0, - AMOVERFX_MIRRORLEFTRIGHT = 0x2, - AMOVERFX_MIRRORUPDOWN = 0x4, - AMOVERFX_DEINTERLACE = 0x8 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0352_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0352_v0_0_s_ifspec; - -#ifndef __IAMOverlayFX_INTERFACE_DEFINED__ -#define __IAMOverlayFX_INTERFACE_DEFINED__ - -/* interface IAMOverlayFX */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMOverlayFX; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("62fae250-7e65-4460-bfc9-6398b322073c") - IAMOverlayFX : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE QueryOverlayFXCaps( - /* [out] */ DWORD *lpdwOverlayFXCaps) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetOverlayFX( - /* [in] */ DWORD dwOverlayFX) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetOverlayFX( - /* [out] */ DWORD *lpdwOverlayFX) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMOverlayFXVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMOverlayFX * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMOverlayFX * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMOverlayFX * This); - - HRESULT ( STDMETHODCALLTYPE *QueryOverlayFXCaps )( - IAMOverlayFX * This, - /* [out] */ DWORD *lpdwOverlayFXCaps); - - HRESULT ( STDMETHODCALLTYPE *SetOverlayFX )( - IAMOverlayFX * This, - /* [in] */ DWORD dwOverlayFX); - - HRESULT ( STDMETHODCALLTYPE *GetOverlayFX )( - IAMOverlayFX * This, - /* [out] */ DWORD *lpdwOverlayFX); - - END_INTERFACE - } IAMOverlayFXVtbl; - - interface IAMOverlayFX - { - CONST_VTBL struct IAMOverlayFXVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMOverlayFX_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMOverlayFX_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMOverlayFX_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMOverlayFX_QueryOverlayFXCaps(This,lpdwOverlayFXCaps) \ - (This)->lpVtbl -> QueryOverlayFXCaps(This,lpdwOverlayFXCaps) - -#define IAMOverlayFX_SetOverlayFX(This,dwOverlayFX) \ - (This)->lpVtbl -> SetOverlayFX(This,dwOverlayFX) - -#define IAMOverlayFX_GetOverlayFX(This,lpdwOverlayFX) \ - (This)->lpVtbl -> GetOverlayFX(This,lpdwOverlayFX) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMOverlayFX_QueryOverlayFXCaps_Proxy( - IAMOverlayFX * This, - /* [out] */ DWORD *lpdwOverlayFXCaps); - - -void __RPC_STUB IAMOverlayFX_QueryOverlayFXCaps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMOverlayFX_SetOverlayFX_Proxy( - IAMOverlayFX * This, - /* [in] */ DWORD dwOverlayFX); - - -void __RPC_STUB IAMOverlayFX_SetOverlayFX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMOverlayFX_GetOverlayFX_Proxy( - IAMOverlayFX * This, - /* [out] */ DWORD *lpdwOverlayFX); - - -void __RPC_STUB IAMOverlayFX_GetOverlayFX_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMOverlayFX_INTERFACE_DEFINED__ */ - - -#ifndef __IAMOpenProgress_INTERFACE_DEFINED__ -#define __IAMOpenProgress_INTERFACE_DEFINED__ - -/* interface IAMOpenProgress */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMOpenProgress; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("8E1C39A1-DE53-11cf-AA63-0080C744528D") - IAMOpenProgress : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE QueryProgress( - /* [out] */ LONGLONG *pllTotal, - /* [out] */ LONGLONG *pllCurrent) = 0; - - virtual HRESULT STDMETHODCALLTYPE AbortOperation( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMOpenProgressVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMOpenProgress * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMOpenProgress * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMOpenProgress * This); - - HRESULT ( STDMETHODCALLTYPE *QueryProgress )( - IAMOpenProgress * This, - /* [out] */ LONGLONG *pllTotal, - /* [out] */ LONGLONG *pllCurrent); - - HRESULT ( STDMETHODCALLTYPE *AbortOperation )( - IAMOpenProgress * This); - - END_INTERFACE - } IAMOpenProgressVtbl; - - interface IAMOpenProgress - { - CONST_VTBL struct IAMOpenProgressVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMOpenProgress_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMOpenProgress_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMOpenProgress_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMOpenProgress_QueryProgress(This,pllTotal,pllCurrent) \ - (This)->lpVtbl -> QueryProgress(This,pllTotal,pllCurrent) - -#define IAMOpenProgress_AbortOperation(This) \ - (This)->lpVtbl -> AbortOperation(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMOpenProgress_QueryProgress_Proxy( - IAMOpenProgress * This, - /* [out] */ LONGLONG *pllTotal, - /* [out] */ LONGLONG *pllCurrent); - - -void __RPC_STUB IAMOpenProgress_QueryProgress_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMOpenProgress_AbortOperation_Proxy( - IAMOpenProgress * This); - - -void __RPC_STUB IAMOpenProgress_AbortOperation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMOpenProgress_INTERFACE_DEFINED__ */ - - -#ifndef __IMpeg2Demultiplexer_INTERFACE_DEFINED__ -#define __IMpeg2Demultiplexer_INTERFACE_DEFINED__ - -/* interface IMpeg2Demultiplexer */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IMpeg2Demultiplexer; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("436eee9c-264f-4242-90e1-4e330c107512") - IMpeg2Demultiplexer : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE CreateOutputPin( - /* [in] */ AM_MEDIA_TYPE *pMediaType, - /* [in] */ LPWSTR pszPinName, - /* [out] */ IPin **ppIPin) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetOutputPinMediaType( - /* [in] */ LPWSTR pszPinName, - /* [in] */ AM_MEDIA_TYPE *pMediaType) = 0; - - virtual HRESULT STDMETHODCALLTYPE DeleteOutputPin( - /* [in] */ LPWSTR pszPinName) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMpeg2DemultiplexerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMpeg2Demultiplexer * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMpeg2Demultiplexer * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMpeg2Demultiplexer * This); - - HRESULT ( STDMETHODCALLTYPE *CreateOutputPin )( - IMpeg2Demultiplexer * This, - /* [in] */ AM_MEDIA_TYPE *pMediaType, - /* [in] */ LPWSTR pszPinName, - /* [out] */ IPin **ppIPin); - - HRESULT ( STDMETHODCALLTYPE *SetOutputPinMediaType )( - IMpeg2Demultiplexer * This, - /* [in] */ LPWSTR pszPinName, - /* [in] */ AM_MEDIA_TYPE *pMediaType); - - HRESULT ( STDMETHODCALLTYPE *DeleteOutputPin )( - IMpeg2Demultiplexer * This, - /* [in] */ LPWSTR pszPinName); - - END_INTERFACE - } IMpeg2DemultiplexerVtbl; - - interface IMpeg2Demultiplexer - { - CONST_VTBL struct IMpeg2DemultiplexerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMpeg2Demultiplexer_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMpeg2Demultiplexer_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMpeg2Demultiplexer_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMpeg2Demultiplexer_CreateOutputPin(This,pMediaType,pszPinName,ppIPin) \ - (This)->lpVtbl -> CreateOutputPin(This,pMediaType,pszPinName,ppIPin) - -#define IMpeg2Demultiplexer_SetOutputPinMediaType(This,pszPinName,pMediaType) \ - (This)->lpVtbl -> SetOutputPinMediaType(This,pszPinName,pMediaType) - -#define IMpeg2Demultiplexer_DeleteOutputPin(This,pszPinName) \ - (This)->lpVtbl -> DeleteOutputPin(This,pszPinName) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMpeg2Demultiplexer_CreateOutputPin_Proxy( - IMpeg2Demultiplexer * This, - /* [in] */ AM_MEDIA_TYPE *pMediaType, - /* [in] */ LPWSTR pszPinName, - /* [out] */ IPin **ppIPin); - - -void __RPC_STUB IMpeg2Demultiplexer_CreateOutputPin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMpeg2Demultiplexer_SetOutputPinMediaType_Proxy( - IMpeg2Demultiplexer * This, - /* [in] */ LPWSTR pszPinName, - /* [in] */ AM_MEDIA_TYPE *pMediaType); - - -void __RPC_STUB IMpeg2Demultiplexer_SetOutputPinMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMpeg2Demultiplexer_DeleteOutputPin_Proxy( - IMpeg2Demultiplexer * This, - /* [in] */ LPWSTR pszPinName); - - -void __RPC_STUB IMpeg2Demultiplexer_DeleteOutputPin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMpeg2Demultiplexer_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0355 */ -/* [local] */ - -#define MPEG2_PROGRAM_STREAM_MAP 0x00000000 -#define MPEG2_PROGRAM_ELEMENTARY_STREAM 0x00000001 -#define MPEG2_PROGRAM_DIRECTORY_PES_PACKET 0x00000002 -#define MPEG2_PROGRAM_PACK_HEADER 0x00000003 -#define MPEG2_PROGRAM_PES_STREAM 0x00000004 -#define MPEG2_PROGRAM_SYSTEM_HEADER 0x00000005 -#define SUBSTREAM_FILTER_VAL_NONE 0x10000000 -typedef /* [public][public] */ struct __MIDL___MIDL_itf_strmif_0355_0001 - { - ULONG stream_id; - DWORD dwMediaSampleContent; - ULONG ulSubstreamFilterValue; - int iDataOffset; - } STREAM_ID_MAP; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0355_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0355_v0_0_s_ifspec; - -#ifndef __IEnumStreamIdMap_INTERFACE_DEFINED__ -#define __IEnumStreamIdMap_INTERFACE_DEFINED__ - -/* interface IEnumStreamIdMap */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IEnumStreamIdMap; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("945C1566-6202-46fc-96C7-D87F289C6534") - IEnumStreamIdMap : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Next( - /* [in] */ ULONG cRequest, - /* [size_is][out][in] */ STREAM_ID_MAP *pStreamIdMap, - /* [out] */ ULONG *pcReceived) = 0; - - virtual HRESULT STDMETHODCALLTYPE Skip( - /* [in] */ ULONG cRecords) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - /* [out] */ IEnumStreamIdMap **ppIEnumStreamIdMap) = 0; - - }; - -#else /* C style interface */ - - typedef struct IEnumStreamIdMapVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IEnumStreamIdMap * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IEnumStreamIdMap * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IEnumStreamIdMap * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - IEnumStreamIdMap * This, - /* [in] */ ULONG cRequest, - /* [size_is][out][in] */ STREAM_ID_MAP *pStreamIdMap, - /* [out] */ ULONG *pcReceived); - - HRESULT ( STDMETHODCALLTYPE *Skip )( - IEnumStreamIdMap * This, - /* [in] */ ULONG cRecords); - - HRESULT ( STDMETHODCALLTYPE *Reset )( - IEnumStreamIdMap * This); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IEnumStreamIdMap * This, - /* [out] */ IEnumStreamIdMap **ppIEnumStreamIdMap); - - END_INTERFACE - } IEnumStreamIdMapVtbl; - - interface IEnumStreamIdMap - { - CONST_VTBL struct IEnumStreamIdMapVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IEnumStreamIdMap_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IEnumStreamIdMap_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IEnumStreamIdMap_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IEnumStreamIdMap_Next(This,cRequest,pStreamIdMap,pcReceived) \ - (This)->lpVtbl -> Next(This,cRequest,pStreamIdMap,pcReceived) - -#define IEnumStreamIdMap_Skip(This,cRecords) \ - (This)->lpVtbl -> Skip(This,cRecords) - -#define IEnumStreamIdMap_Reset(This) \ - (This)->lpVtbl -> Reset(This) - -#define IEnumStreamIdMap_Clone(This,ppIEnumStreamIdMap) \ - (This)->lpVtbl -> Clone(This,ppIEnumStreamIdMap) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IEnumStreamIdMap_Next_Proxy( - IEnumStreamIdMap * This, - /* [in] */ ULONG cRequest, - /* [size_is][out][in] */ STREAM_ID_MAP *pStreamIdMap, - /* [out] */ ULONG *pcReceived); - - -void __RPC_STUB IEnumStreamIdMap_Next_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumStreamIdMap_Skip_Proxy( - IEnumStreamIdMap * This, - /* [in] */ ULONG cRecords); - - -void __RPC_STUB IEnumStreamIdMap_Skip_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumStreamIdMap_Reset_Proxy( - IEnumStreamIdMap * This); - - -void __RPC_STUB IEnumStreamIdMap_Reset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumStreamIdMap_Clone_Proxy( - IEnumStreamIdMap * This, - /* [out] */ IEnumStreamIdMap **ppIEnumStreamIdMap); - - -void __RPC_STUB IEnumStreamIdMap_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IEnumStreamIdMap_INTERFACE_DEFINED__ */ - - -#ifndef __IMPEG2StreamIdMap_INTERFACE_DEFINED__ -#define __IMPEG2StreamIdMap_INTERFACE_DEFINED__ - -/* interface IMPEG2StreamIdMap */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IMPEG2StreamIdMap; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("D0E04C47-25B8-4369-925A-362A01D95444") - IMPEG2StreamIdMap : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE MapStreamId( - /* [in] */ ULONG ulStreamId, - /* [in] */ DWORD MediaSampleContent, - /* [in] */ ULONG ulSubstreamFilterValue, - /* [in] */ int iDataOffset) = 0; - - virtual HRESULT STDMETHODCALLTYPE UnmapStreamId( - /* [in] */ ULONG culStreamId, - /* [in] */ ULONG *pulStreamId) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnumStreamIdMap( - /* [out] */ IEnumStreamIdMap **ppIEnumStreamIdMap) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMPEG2StreamIdMapVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMPEG2StreamIdMap * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMPEG2StreamIdMap * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMPEG2StreamIdMap * This); - - HRESULT ( STDMETHODCALLTYPE *MapStreamId )( - IMPEG2StreamIdMap * This, - /* [in] */ ULONG ulStreamId, - /* [in] */ DWORD MediaSampleContent, - /* [in] */ ULONG ulSubstreamFilterValue, - /* [in] */ int iDataOffset); - - HRESULT ( STDMETHODCALLTYPE *UnmapStreamId )( - IMPEG2StreamIdMap * This, - /* [in] */ ULONG culStreamId, - /* [in] */ ULONG *pulStreamId); - - HRESULT ( STDMETHODCALLTYPE *EnumStreamIdMap )( - IMPEG2StreamIdMap * This, - /* [out] */ IEnumStreamIdMap **ppIEnumStreamIdMap); - - END_INTERFACE - } IMPEG2StreamIdMapVtbl; - - interface IMPEG2StreamIdMap - { - CONST_VTBL struct IMPEG2StreamIdMapVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMPEG2StreamIdMap_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMPEG2StreamIdMap_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMPEG2StreamIdMap_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMPEG2StreamIdMap_MapStreamId(This,ulStreamId,MediaSampleContent,ulSubstreamFilterValue,iDataOffset) \ - (This)->lpVtbl -> MapStreamId(This,ulStreamId,MediaSampleContent,ulSubstreamFilterValue,iDataOffset) - -#define IMPEG2StreamIdMap_UnmapStreamId(This,culStreamId,pulStreamId) \ - (This)->lpVtbl -> UnmapStreamId(This,culStreamId,pulStreamId) - -#define IMPEG2StreamIdMap_EnumStreamIdMap(This,ppIEnumStreamIdMap) \ - (This)->lpVtbl -> EnumStreamIdMap(This,ppIEnumStreamIdMap) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IMPEG2StreamIdMap_MapStreamId_Proxy( - IMPEG2StreamIdMap * This, - /* [in] */ ULONG ulStreamId, - /* [in] */ DWORD MediaSampleContent, - /* [in] */ ULONG ulSubstreamFilterValue, - /* [in] */ int iDataOffset); - - -void __RPC_STUB IMPEG2StreamIdMap_MapStreamId_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMPEG2StreamIdMap_UnmapStreamId_Proxy( - IMPEG2StreamIdMap * This, - /* [in] */ ULONG culStreamId, - /* [in] */ ULONG *pulStreamId); - - -void __RPC_STUB IMPEG2StreamIdMap_UnmapStreamId_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IMPEG2StreamIdMap_EnumStreamIdMap_Proxy( - IMPEG2StreamIdMap * This, - /* [out] */ IEnumStreamIdMap **ppIEnumStreamIdMap); - - -void __RPC_STUB IMPEG2StreamIdMap_EnumStreamIdMap_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMPEG2StreamIdMap_INTERFACE_DEFINED__ */ - - -#ifndef __IRegisterServiceProvider_INTERFACE_DEFINED__ -#define __IRegisterServiceProvider_INTERFACE_DEFINED__ - -/* interface IRegisterServiceProvider */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IRegisterServiceProvider; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("7B3A2F01-0751-48DD-B556-004785171C54") - IRegisterServiceProvider : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE RegisterService( - /* [in] */ REFGUID guidService, - /* [in] */ IUnknown *pUnkObject) = 0; - - }; - -#else /* C style interface */ - - typedef struct IRegisterServiceProviderVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IRegisterServiceProvider * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IRegisterServiceProvider * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IRegisterServiceProvider * This); - - HRESULT ( STDMETHODCALLTYPE *RegisterService )( - IRegisterServiceProvider * This, - /* [in] */ REFGUID guidService, - /* [in] */ IUnknown *pUnkObject); - - END_INTERFACE - } IRegisterServiceProviderVtbl; - - interface IRegisterServiceProvider - { - CONST_VTBL struct IRegisterServiceProviderVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IRegisterServiceProvider_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IRegisterServiceProvider_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IRegisterServiceProvider_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IRegisterServiceProvider_RegisterService(This,guidService,pUnkObject) \ - (This)->lpVtbl -> RegisterService(This,guidService,pUnkObject) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IRegisterServiceProvider_RegisterService_Proxy( - IRegisterServiceProvider * This, - /* [in] */ REFGUID guidService, - /* [in] */ IUnknown *pUnkObject); - - -void __RPC_STUB IRegisterServiceProvider_RegisterService_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IRegisterServiceProvider_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0358 */ -/* [local] */ - -#define AM_GETDECODERCAP_QUERY_VMR_SUPPORT 0x00000001 -#define VMR_NOTSUPPORTED 0x00000000 -#define VMR_SUPPORTED 0x00000001 -#define AM_QUERY_DECODER_VMR_SUPPORT 0x00000001 -#define AM_QUERY_DECODER_DXVA_1_SUPPORT 0x00000002 -#define AM_QUERY_DECODER_DVD_SUPPORT 0x00000003 -#define AM_QUERY_DECODER_ATSC_SD_SUPPORT 0x00000004 -#define AM_QUERY_DECODER_ATSC_HD_SUPPORT 0x00000005 -#define DECODER_CAP_NOTSUPPORTED 0x00000000 -#define DECODER_CAP_SUPPORTED 0x00000001 - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0358_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0358_v0_0_s_ifspec; - -#ifndef __IAMDecoderCaps_INTERFACE_DEFINED__ -#define __IAMDecoderCaps_INTERFACE_DEFINED__ - -/* interface IAMDecoderCaps */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IAMDecoderCaps; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("c0dff467-d499-4986-972b-e1d9090fa941") - IAMDecoderCaps : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetDecoderCaps( - /* [in] */ DWORD dwCapIndex, - /* [out] */ DWORD *lpdwCap) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMDecoderCapsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMDecoderCaps * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMDecoderCaps * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMDecoderCaps * This); - - HRESULT ( STDMETHODCALLTYPE *GetDecoderCaps )( - IAMDecoderCaps * This, - /* [in] */ DWORD dwCapIndex, - /* [out] */ DWORD *lpdwCap); - - END_INTERFACE - } IAMDecoderCapsVtbl; - - interface IAMDecoderCaps - { - CONST_VTBL struct IAMDecoderCapsVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMDecoderCaps_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMDecoderCaps_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMDecoderCaps_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMDecoderCaps_GetDecoderCaps(This,dwCapIndex,lpdwCap) \ - (This)->lpVtbl -> GetDecoderCaps(This,dwCapIndex,lpdwCap) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMDecoderCaps_GetDecoderCaps_Proxy( - IAMDecoderCaps * This, - /* [in] */ DWORD dwCapIndex, - /* [out] */ DWORD *lpdwCap); - - -void __RPC_STUB IAMDecoderCaps_GetDecoderCaps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMDecoderCaps_INTERFACE_DEFINED__ */ - - -#ifndef __IAMClockSlave_INTERFACE_DEFINED__ -#define __IAMClockSlave_INTERFACE_DEFINED__ - -/* interface IAMClockSlave */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IAMClockSlave; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("9FD52741-176D-4b36-8F51-CA8F933223BE") - IAMClockSlave : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetErrorTolerance( - /* [in] */ DWORD dwTolerance) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetErrorTolerance( - /* [out] */ DWORD *pdwTolerance) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMClockSlaveVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMClockSlave * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMClockSlave * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMClockSlave * This); - - HRESULT ( STDMETHODCALLTYPE *SetErrorTolerance )( - IAMClockSlave * This, - /* [in] */ DWORD dwTolerance); - - HRESULT ( STDMETHODCALLTYPE *GetErrorTolerance )( - IAMClockSlave * This, - /* [out] */ DWORD *pdwTolerance); - - END_INTERFACE - } IAMClockSlaveVtbl; - - interface IAMClockSlave - { - CONST_VTBL struct IAMClockSlaveVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMClockSlave_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMClockSlave_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMClockSlave_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMClockSlave_SetErrorTolerance(This,dwTolerance) \ - (This)->lpVtbl -> SetErrorTolerance(This,dwTolerance) - -#define IAMClockSlave_GetErrorTolerance(This,pdwTolerance) \ - (This)->lpVtbl -> GetErrorTolerance(This,pdwTolerance) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMClockSlave_SetErrorTolerance_Proxy( - IAMClockSlave * This, - /* [in] */ DWORD dwTolerance); - - -void __RPC_STUB IAMClockSlave_SetErrorTolerance_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMClockSlave_GetErrorTolerance_Proxy( - IAMClockSlave * This, - /* [out] */ DWORD *pdwTolerance); - - -void __RPC_STUB IAMClockSlave_GetErrorTolerance_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMClockSlave_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0360 */ -/* [local] */ - -#include - - - - - - - - - -typedef -enum tagDVD_DOMAIN - { DVD_DOMAIN_FirstPlay = 1, - DVD_DOMAIN_VideoManagerMenu = DVD_DOMAIN_FirstPlay + 1, - DVD_DOMAIN_VideoTitleSetMenu = DVD_DOMAIN_VideoManagerMenu + 1, - DVD_DOMAIN_Title = DVD_DOMAIN_VideoTitleSetMenu + 1, - DVD_DOMAIN_Stop = DVD_DOMAIN_Title + 1 - } DVD_DOMAIN; - -typedef -enum tagDVD_MENU_ID - { DVD_MENU_Title = 2, - DVD_MENU_Root = 3, - DVD_MENU_Subpicture = 4, - DVD_MENU_Audio = 5, - DVD_MENU_Angle = 6, - DVD_MENU_Chapter = 7 - } DVD_MENU_ID; - -typedef -enum tagDVD_DISC_SIDE - { DVD_SIDE_A = 1, - DVD_SIDE_B = 2 - } DVD_DISC_SIDE; - -typedef -enum tagDVD_PREFERRED_DISPLAY_MODE - { DISPLAY_CONTENT_DEFAULT = 0, - DISPLAY_16x9 = 1, - DISPLAY_4x3_PANSCAN_PREFERRED = 2, - DISPLAY_4x3_LETTERBOX_PREFERRED = 3 - } DVD_PREFERRED_DISPLAY_MODE; - -typedef WORD DVD_REGISTER; - -typedef DVD_REGISTER GPRMARRAY[ 16 ]; - -typedef DVD_REGISTER SPRMARRAY[ 24 ]; - -typedef struct tagDVD_ATR - { - ULONG ulCAT; - BYTE pbATRI[ 768 ]; - } DVD_ATR; - -typedef BYTE DVD_VideoATR[ 2 ]; - -typedef BYTE DVD_AudioATR[ 8 ]; - -typedef BYTE DVD_SubpictureATR[ 6 ]; - -typedef -enum tagDVD_FRAMERATE - { DVD_FPS_25 = 1, - DVD_FPS_30NonDrop = 3 - } DVD_FRAMERATE; - -typedef struct tagDVD_TIMECODE -{ - ULONG Hours1 :4; // Hours - ULONG Hours10 :4; // Tens of Hours - - ULONG Minutes1 :4; // Minutes - ULONG Minutes10:4; // Tens of Minutes - - ULONG Seconds1 :4; // Seconds - ULONG Seconds10:4; // Tens of Seconds - - ULONG Frames1 :4; // Frames - ULONG Frames10 :2; // Tens of Frames - - ULONG FrameRateCode: 2; // use DVD_FRAMERATE to indicate frames/sec and drop/non-drop -} DVD_TIMECODE; -typedef -enum tagDVD_TIMECODE_FLAGS - { DVD_TC_FLAG_25fps = 0x1, - DVD_TC_FLAG_30fps = 0x2, - DVD_TC_FLAG_DropFrame = 0x4, - DVD_TC_FLAG_Interpolated = 0x8 - } DVD_TIMECODE_FLAGS; - -typedef struct tagDVD_HMSF_TIMECODE - { - BYTE bHours; - BYTE bMinutes; - BYTE bSeconds; - BYTE bFrames; - } DVD_HMSF_TIMECODE; - -typedef struct tagDVD_PLAYBACK_LOCATION2 - { - ULONG TitleNum; - ULONG ChapterNum; - DVD_HMSF_TIMECODE TimeCode; - ULONG TimeCodeFlags; - } DVD_PLAYBACK_LOCATION2; - -typedef struct tagDVD_PLAYBACK_LOCATION - { - ULONG TitleNum; - ULONG ChapterNum; - ULONG TimeCode; - } DVD_PLAYBACK_LOCATION; - -typedef DWORD VALID_UOP_SOMTHING_OR_OTHER; - -typedef /* [public] */ -enum __MIDL___MIDL_itf_strmif_0360_0001 - { UOP_FLAG_Play_Title_Or_AtTime = 0x1, - UOP_FLAG_Play_Chapter = 0x2, - UOP_FLAG_Play_Title = 0x4, - UOP_FLAG_Stop = 0x8, - UOP_FLAG_ReturnFromSubMenu = 0x10, - UOP_FLAG_Play_Chapter_Or_AtTime = 0x20, - UOP_FLAG_PlayPrev_Or_Replay_Chapter = 0x40, - UOP_FLAG_PlayNext_Chapter = 0x80, - UOP_FLAG_Play_Forwards = 0x100, - UOP_FLAG_Play_Backwards = 0x200, - UOP_FLAG_ShowMenu_Title = 0x400, - UOP_FLAG_ShowMenu_Root = 0x800, - UOP_FLAG_ShowMenu_SubPic = 0x1000, - UOP_FLAG_ShowMenu_Audio = 0x2000, - UOP_FLAG_ShowMenu_Angle = 0x4000, - UOP_FLAG_ShowMenu_Chapter = 0x8000, - UOP_FLAG_Resume = 0x10000, - UOP_FLAG_Select_Or_Activate_Button = 0x20000, - UOP_FLAG_Still_Off = 0x40000, - UOP_FLAG_Pause_On = 0x80000, - UOP_FLAG_Select_Audio_Stream = 0x100000, - UOP_FLAG_Select_SubPic_Stream = 0x200000, - UOP_FLAG_Select_Angle = 0x400000, - UOP_FLAG_Select_Karaoke_Audio_Presentation_Mode = 0x800000, - UOP_FLAG_Select_Video_Mode_Preference = 0x1000000 - } VALID_UOP_FLAG; - -typedef /* [public] */ -enum __MIDL___MIDL_itf_strmif_0360_0002 - { DVD_CMD_FLAG_None = 0, - DVD_CMD_FLAG_Flush = 0x1, - DVD_CMD_FLAG_SendEvents = 0x2, - DVD_CMD_FLAG_Block = 0x4, - DVD_CMD_FLAG_StartWhenRendered = 0x8, - DVD_CMD_FLAG_EndAfterRendered = 0x10 - } DVD_CMD_FLAGS; - -typedef /* [public][public] */ -enum __MIDL___MIDL_itf_strmif_0360_0003 - { DVD_ResetOnStop = 1, - DVD_NotifyParentalLevelChange = 2, - DVD_HMSF_TimeCodeEvents = 3 - } DVD_OPTION_FLAG; - -typedef /* [public][public] */ -enum __MIDL___MIDL_itf_strmif_0360_0004 - { DVD_Relative_Upper = 1, - DVD_Relative_Lower = 2, - DVD_Relative_Left = 3, - DVD_Relative_Right = 4 - } DVD_RELATIVE_BUTTON; - -typedef -enum tagDVD_PARENTAL_LEVEL - { DVD_PARENTAL_LEVEL_8 = 0x8000, - DVD_PARENTAL_LEVEL_7 = 0x4000, - DVD_PARENTAL_LEVEL_6 = 0x2000, - DVD_PARENTAL_LEVEL_5 = 0x1000, - DVD_PARENTAL_LEVEL_4 = 0x800, - DVD_PARENTAL_LEVEL_3 = 0x400, - DVD_PARENTAL_LEVEL_2 = 0x200, - DVD_PARENTAL_LEVEL_1 = 0x100 - } DVD_PARENTAL_LEVEL; - -typedef -enum tagDVD_AUDIO_LANG_EXT - { DVD_AUD_EXT_NotSpecified = 0, - DVD_AUD_EXT_Captions = 1, - DVD_AUD_EXT_VisuallyImpaired = 2, - DVD_AUD_EXT_DirectorComments1 = 3, - DVD_AUD_EXT_DirectorComments2 = 4 - } DVD_AUDIO_LANG_EXT; - -typedef -enum tagDVD_SUBPICTURE_LANG_EXT - { DVD_SP_EXT_NotSpecified = 0, - DVD_SP_EXT_Caption_Normal = 1, - DVD_SP_EXT_Caption_Big = 2, - DVD_SP_EXT_Caption_Children = 3, - DVD_SP_EXT_CC_Normal = 5, - DVD_SP_EXT_CC_Big = 6, - DVD_SP_EXT_CC_Children = 7, - DVD_SP_EXT_Forced = 9, - DVD_SP_EXT_DirectorComments_Normal = 13, - DVD_SP_EXT_DirectorComments_Big = 14, - DVD_SP_EXT_DirectorComments_Children = 15 - } DVD_SUBPICTURE_LANG_EXT; - -typedef -enum tagDVD_AUDIO_APPMODE - { DVD_AudioMode_None = 0, - DVD_AudioMode_Karaoke = 1, - DVD_AudioMode_Surround = 2, - DVD_AudioMode_Other = 3 - } DVD_AUDIO_APPMODE; - -typedef -enum tagDVD_AUDIO_FORMAT - { DVD_AudioFormat_AC3 = 0, - DVD_AudioFormat_MPEG1 = 1, - DVD_AudioFormat_MPEG1_DRC = 2, - DVD_AudioFormat_MPEG2 = 3, - DVD_AudioFormat_MPEG2_DRC = 4, - DVD_AudioFormat_LPCM = 5, - DVD_AudioFormat_DTS = 6, - DVD_AudioFormat_SDDS = 7, - DVD_AudioFormat_Other = 8 - } DVD_AUDIO_FORMAT; - -typedef -enum tagDVD_KARAOKE_DOWNMIX - { DVD_Mix_0to0 = 0x1, - DVD_Mix_1to0 = 0x2, - DVD_Mix_2to0 = 0x4, - DVD_Mix_3to0 = 0x8, - DVD_Mix_4to0 = 0x10, - DVD_Mix_Lto0 = 0x20, - DVD_Mix_Rto0 = 0x40, - DVD_Mix_0to1 = 0x100, - DVD_Mix_1to1 = 0x200, - DVD_Mix_2to1 = 0x400, - DVD_Mix_3to1 = 0x800, - DVD_Mix_4to1 = 0x1000, - DVD_Mix_Lto1 = 0x2000, - DVD_Mix_Rto1 = 0x4000 - } DVD_KARAOKE_DOWNMIX; - -typedef struct tagDVD_AudioAttributes - { - DVD_AUDIO_APPMODE AppMode; - BYTE AppModeData; - DVD_AUDIO_FORMAT AudioFormat; - LCID Language; - DVD_AUDIO_LANG_EXT LanguageExtension; - BOOL fHasMultichannelInfo; - DWORD dwFrequency; - BYTE bQuantization; - BYTE bNumberOfChannels; - DWORD dwReserved[ 2 ]; - } DVD_AudioAttributes; - -typedef struct tagDVD_MUA_MixingInfo - { - BOOL fMixTo0; - BOOL fMixTo1; - BOOL fMix0InPhase; - BOOL fMix1InPhase; - DWORD dwSpeakerPosition; - } DVD_MUA_MixingInfo; - -typedef struct tagDVD_MUA_Coeff - { - double log2_alpha; - double log2_beta; - } DVD_MUA_Coeff; - -typedef struct tagDVD_MultichannelAudioAttributes - { - DVD_MUA_MixingInfo Info[ 8 ]; - DVD_MUA_Coeff Coeff[ 8 ]; - } DVD_MultichannelAudioAttributes; - -typedef -enum tagDVD_KARAOKE_CONTENTS - { DVD_Karaoke_GuideVocal1 = 0x1, - DVD_Karaoke_GuideVocal2 = 0x2, - DVD_Karaoke_GuideMelody1 = 0x4, - DVD_Karaoke_GuideMelody2 = 0x8, - DVD_Karaoke_GuideMelodyA = 0x10, - DVD_Karaoke_GuideMelodyB = 0x20, - DVD_Karaoke_SoundEffectA = 0x40, - DVD_Karaoke_SoundEffectB = 0x80 - } DVD_KARAOKE_CONTENTS; - -typedef -enum tagDVD_KARAOKE_ASSIGNMENT - { DVD_Assignment_reserved0 = 0, - DVD_Assignment_reserved1 = 1, - DVD_Assignment_LR = 2, - DVD_Assignment_LRM = 3, - DVD_Assignment_LR1 = 4, - DVD_Assignment_LRM1 = 5, - DVD_Assignment_LR12 = 6, - DVD_Assignment_LRM12 = 7 - } DVD_KARAOKE_ASSIGNMENT; - -typedef struct tagDVD_KaraokeAttributes - { - BYTE bVersion; - BOOL fMasterOfCeremoniesInGuideVocal1; - BOOL fDuet; - DVD_KARAOKE_ASSIGNMENT ChannelAssignment; - WORD wChannelContents[ 8 ]; - } DVD_KaraokeAttributes; - -typedef -enum tagDVD_VIDEO_COMPRESSION - { DVD_VideoCompression_Other = 0, - DVD_VideoCompression_MPEG1 = 1, - DVD_VideoCompression_MPEG2 = 2 - } DVD_VIDEO_COMPRESSION; - -typedef struct tagDVD_VideoAttributes - { - BOOL fPanscanPermitted; - BOOL fLetterboxPermitted; - ULONG ulAspectX; - ULONG ulAspectY; - ULONG ulFrameRate; - ULONG ulFrameHeight; - DVD_VIDEO_COMPRESSION Compression; - BOOL fLine21Field1InGOP; - BOOL fLine21Field2InGOP; - ULONG ulSourceResolutionX; - ULONG ulSourceResolutionY; - BOOL fIsSourceLetterboxed; - BOOL fIsFilmMode; - } DVD_VideoAttributes; - -typedef -enum tagDVD_SUBPICTURE_TYPE - { DVD_SPType_NotSpecified = 0, - DVD_SPType_Language = 1, - DVD_SPType_Other = 2 - } DVD_SUBPICTURE_TYPE; - -typedef -enum tagDVD_SUBPICTURE_CODING - { DVD_SPCoding_RunLength = 0, - DVD_SPCoding_Extended = 1, - DVD_SPCoding_Other = 2 - } DVD_SUBPICTURE_CODING; - -typedef struct tagDVD_SubpictureAttributes - { - DVD_SUBPICTURE_TYPE Type; - DVD_SUBPICTURE_CODING CodingMode; - LCID Language; - DVD_SUBPICTURE_LANG_EXT LanguageExtension; - } DVD_SubpictureAttributes; - -typedef -enum tagDVD_TITLE_APPMODE - { DVD_AppMode_Not_Specified = 0, - DVD_AppMode_Karaoke = 1, - DVD_AppMode_Other = 3 - } DVD_TITLE_APPMODE; - -typedef struct tagDVD_TitleMainAttributes - { - DVD_TITLE_APPMODE AppMode; - DVD_VideoAttributes VideoAttributes; - ULONG ulNumberOfAudioStreams; - DVD_AudioAttributes AudioAttributes[ 8 ]; - DVD_MultichannelAudioAttributes MultichannelAudioAttributes[ 8 ]; - ULONG ulNumberOfSubpictureStreams; - DVD_SubpictureAttributes SubpictureAttributes[ 32 ]; - } DVD_TitleAttributes; - -typedef struct tagDVD_MenuAttributes - { - BOOL fCompatibleRegion[ 8 ]; - DVD_VideoAttributes VideoAttributes; - BOOL fAudioPresent; - DVD_AudioAttributes AudioAttributes; - BOOL fSubpicturePresent; - DVD_SubpictureAttributes SubpictureAttributes; - } DVD_MenuAttributes; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0360_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0360_v0_0_s_ifspec; - -#ifndef __IDvdControl_INTERFACE_DEFINED__ -#define __IDvdControl_INTERFACE_DEFINED__ - -/* interface IDvdControl */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IDvdControl; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("A70EFE61-E2A3-11d0-A9BE-00AA0061BE93") - IDvdControl : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE TitlePlay( - /* [in] */ ULONG ulTitle) = 0; - - virtual HRESULT STDMETHODCALLTYPE ChapterPlay( - /* [in] */ ULONG ulTitle, - /* [in] */ ULONG ulChapter) = 0; - - virtual HRESULT STDMETHODCALLTYPE TimePlay( - /* [in] */ ULONG ulTitle, - /* [in] */ ULONG bcdTime) = 0; - - virtual HRESULT STDMETHODCALLTYPE StopForResume( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GoUp( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE TimeSearch( - /* [in] */ ULONG bcdTime) = 0; - - virtual HRESULT STDMETHODCALLTYPE ChapterSearch( - /* [in] */ ULONG ulChapter) = 0; - - virtual HRESULT STDMETHODCALLTYPE PrevPGSearch( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE TopPGSearch( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE NextPGSearch( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE ForwardScan( - /* [in] */ double dwSpeed) = 0; - - virtual HRESULT STDMETHODCALLTYPE BackwardScan( - /* [in] */ double dwSpeed) = 0; - - virtual HRESULT STDMETHODCALLTYPE MenuCall( - /* [in] */ DVD_MENU_ID MenuID) = 0; - - virtual HRESULT STDMETHODCALLTYPE Resume( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE UpperButtonSelect( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE LowerButtonSelect( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE LeftButtonSelect( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE RightButtonSelect( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE ButtonActivate( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE ButtonSelectAndActivate( - /* [in] */ ULONG ulButton) = 0; - - virtual HRESULT STDMETHODCALLTYPE StillOff( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE PauseOn( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE PauseOff( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE MenuLanguageSelect( - /* [in] */ LCID Language) = 0; - - virtual HRESULT STDMETHODCALLTYPE AudioStreamChange( - /* [in] */ ULONG ulAudio) = 0; - - virtual HRESULT STDMETHODCALLTYPE SubpictureStreamChange( - /* [in] */ ULONG ulSubPicture, - /* [in] */ BOOL bDisplay) = 0; - - virtual HRESULT STDMETHODCALLTYPE AngleChange( - /* [in] */ ULONG ulAngle) = 0; - - virtual HRESULT STDMETHODCALLTYPE ParentalLevelSelect( - /* [in] */ ULONG ulParentalLevel) = 0; - - virtual HRESULT STDMETHODCALLTYPE ParentalCountrySelect( - /* [in] */ WORD wCountry) = 0; - - virtual HRESULT STDMETHODCALLTYPE KaraokeAudioPresentationModeChange( - /* [in] */ ULONG ulMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE VideoModePreferrence( - /* [in] */ ULONG ulPreferredDisplayMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetRoot( - /* [in] */ LPCWSTR pszPath) = 0; - - virtual HRESULT STDMETHODCALLTYPE MouseActivate( - /* [in] */ POINT point) = 0; - - virtual HRESULT STDMETHODCALLTYPE MouseSelect( - /* [in] */ POINT point) = 0; - - virtual HRESULT STDMETHODCALLTYPE ChapterPlayAutoStop( - /* [in] */ ULONG ulTitle, - /* [in] */ ULONG ulChapter, - /* [in] */ ULONG ulChaptersToPlay) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDvdControlVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDvdControl * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDvdControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDvdControl * This); - - HRESULT ( STDMETHODCALLTYPE *TitlePlay )( - IDvdControl * This, - /* [in] */ ULONG ulTitle); - - HRESULT ( STDMETHODCALLTYPE *ChapterPlay )( - IDvdControl * This, - /* [in] */ ULONG ulTitle, - /* [in] */ ULONG ulChapter); - - HRESULT ( STDMETHODCALLTYPE *TimePlay )( - IDvdControl * This, - /* [in] */ ULONG ulTitle, - /* [in] */ ULONG bcdTime); - - HRESULT ( STDMETHODCALLTYPE *StopForResume )( - IDvdControl * This); - - HRESULT ( STDMETHODCALLTYPE *GoUp )( - IDvdControl * This); - - HRESULT ( STDMETHODCALLTYPE *TimeSearch )( - IDvdControl * This, - /* [in] */ ULONG bcdTime); - - HRESULT ( STDMETHODCALLTYPE *ChapterSearch )( - IDvdControl * This, - /* [in] */ ULONG ulChapter); - - HRESULT ( STDMETHODCALLTYPE *PrevPGSearch )( - IDvdControl * This); - - HRESULT ( STDMETHODCALLTYPE *TopPGSearch )( - IDvdControl * This); - - HRESULT ( STDMETHODCALLTYPE *NextPGSearch )( - IDvdControl * This); - - HRESULT ( STDMETHODCALLTYPE *ForwardScan )( - IDvdControl * This, - /* [in] */ double dwSpeed); - - HRESULT ( STDMETHODCALLTYPE *BackwardScan )( - IDvdControl * This, - /* [in] */ double dwSpeed); - - HRESULT ( STDMETHODCALLTYPE *MenuCall )( - IDvdControl * This, - /* [in] */ DVD_MENU_ID MenuID); - - HRESULT ( STDMETHODCALLTYPE *Resume )( - IDvdControl * This); - - HRESULT ( STDMETHODCALLTYPE *UpperButtonSelect )( - IDvdControl * This); - - HRESULT ( STDMETHODCALLTYPE *LowerButtonSelect )( - IDvdControl * This); - - HRESULT ( STDMETHODCALLTYPE *LeftButtonSelect )( - IDvdControl * This); - - HRESULT ( STDMETHODCALLTYPE *RightButtonSelect )( - IDvdControl * This); - - HRESULT ( STDMETHODCALLTYPE *ButtonActivate )( - IDvdControl * This); - - HRESULT ( STDMETHODCALLTYPE *ButtonSelectAndActivate )( - IDvdControl * This, - /* [in] */ ULONG ulButton); - - HRESULT ( STDMETHODCALLTYPE *StillOff )( - IDvdControl * This); - - HRESULT ( STDMETHODCALLTYPE *PauseOn )( - IDvdControl * This); - - HRESULT ( STDMETHODCALLTYPE *PauseOff )( - IDvdControl * This); - - HRESULT ( STDMETHODCALLTYPE *MenuLanguageSelect )( - IDvdControl * This, - /* [in] */ LCID Language); - - HRESULT ( STDMETHODCALLTYPE *AudioStreamChange )( - IDvdControl * This, - /* [in] */ ULONG ulAudio); - - HRESULT ( STDMETHODCALLTYPE *SubpictureStreamChange )( - IDvdControl * This, - /* [in] */ ULONG ulSubPicture, - /* [in] */ BOOL bDisplay); - - HRESULT ( STDMETHODCALLTYPE *AngleChange )( - IDvdControl * This, - /* [in] */ ULONG ulAngle); - - HRESULT ( STDMETHODCALLTYPE *ParentalLevelSelect )( - IDvdControl * This, - /* [in] */ ULONG ulParentalLevel); - - HRESULT ( STDMETHODCALLTYPE *ParentalCountrySelect )( - IDvdControl * This, - /* [in] */ WORD wCountry); - - HRESULT ( STDMETHODCALLTYPE *KaraokeAudioPresentationModeChange )( - IDvdControl * This, - /* [in] */ ULONG ulMode); - - HRESULT ( STDMETHODCALLTYPE *VideoModePreferrence )( - IDvdControl * This, - /* [in] */ ULONG ulPreferredDisplayMode); - - HRESULT ( STDMETHODCALLTYPE *SetRoot )( - IDvdControl * This, - /* [in] */ LPCWSTR pszPath); - - HRESULT ( STDMETHODCALLTYPE *MouseActivate )( - IDvdControl * This, - /* [in] */ POINT point); - - HRESULT ( STDMETHODCALLTYPE *MouseSelect )( - IDvdControl * This, - /* [in] */ POINT point); - - HRESULT ( STDMETHODCALLTYPE *ChapterPlayAutoStop )( - IDvdControl * This, - /* [in] */ ULONG ulTitle, - /* [in] */ ULONG ulChapter, - /* [in] */ ULONG ulChaptersToPlay); - - END_INTERFACE - } IDvdControlVtbl; - - interface IDvdControl - { - CONST_VTBL struct IDvdControlVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDvdControl_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDvdControl_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDvdControl_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDvdControl_TitlePlay(This,ulTitle) \ - (This)->lpVtbl -> TitlePlay(This,ulTitle) - -#define IDvdControl_ChapterPlay(This,ulTitle,ulChapter) \ - (This)->lpVtbl -> ChapterPlay(This,ulTitle,ulChapter) - -#define IDvdControl_TimePlay(This,ulTitle,bcdTime) \ - (This)->lpVtbl -> TimePlay(This,ulTitle,bcdTime) - -#define IDvdControl_StopForResume(This) \ - (This)->lpVtbl -> StopForResume(This) - -#define IDvdControl_GoUp(This) \ - (This)->lpVtbl -> GoUp(This) - -#define IDvdControl_TimeSearch(This,bcdTime) \ - (This)->lpVtbl -> TimeSearch(This,bcdTime) - -#define IDvdControl_ChapterSearch(This,ulChapter) \ - (This)->lpVtbl -> ChapterSearch(This,ulChapter) - -#define IDvdControl_PrevPGSearch(This) \ - (This)->lpVtbl -> PrevPGSearch(This) - -#define IDvdControl_TopPGSearch(This) \ - (This)->lpVtbl -> TopPGSearch(This) - -#define IDvdControl_NextPGSearch(This) \ - (This)->lpVtbl -> NextPGSearch(This) - -#define IDvdControl_ForwardScan(This,dwSpeed) \ - (This)->lpVtbl -> ForwardScan(This,dwSpeed) - -#define IDvdControl_BackwardScan(This,dwSpeed) \ - (This)->lpVtbl -> BackwardScan(This,dwSpeed) - -#define IDvdControl_MenuCall(This,MenuID) \ - (This)->lpVtbl -> MenuCall(This,MenuID) - -#define IDvdControl_Resume(This) \ - (This)->lpVtbl -> Resume(This) - -#define IDvdControl_UpperButtonSelect(This) \ - (This)->lpVtbl -> UpperButtonSelect(This) - -#define IDvdControl_LowerButtonSelect(This) \ - (This)->lpVtbl -> LowerButtonSelect(This) - -#define IDvdControl_LeftButtonSelect(This) \ - (This)->lpVtbl -> LeftButtonSelect(This) - -#define IDvdControl_RightButtonSelect(This) \ - (This)->lpVtbl -> RightButtonSelect(This) - -#define IDvdControl_ButtonActivate(This) \ - (This)->lpVtbl -> ButtonActivate(This) - -#define IDvdControl_ButtonSelectAndActivate(This,ulButton) \ - (This)->lpVtbl -> ButtonSelectAndActivate(This,ulButton) - -#define IDvdControl_StillOff(This) \ - (This)->lpVtbl -> StillOff(This) - -#define IDvdControl_PauseOn(This) \ - (This)->lpVtbl -> PauseOn(This) - -#define IDvdControl_PauseOff(This) \ - (This)->lpVtbl -> PauseOff(This) - -#define IDvdControl_MenuLanguageSelect(This,Language) \ - (This)->lpVtbl -> MenuLanguageSelect(This,Language) - -#define IDvdControl_AudioStreamChange(This,ulAudio) \ - (This)->lpVtbl -> AudioStreamChange(This,ulAudio) - -#define IDvdControl_SubpictureStreamChange(This,ulSubPicture,bDisplay) \ - (This)->lpVtbl -> SubpictureStreamChange(This,ulSubPicture,bDisplay) - -#define IDvdControl_AngleChange(This,ulAngle) \ - (This)->lpVtbl -> AngleChange(This,ulAngle) - -#define IDvdControl_ParentalLevelSelect(This,ulParentalLevel) \ - (This)->lpVtbl -> ParentalLevelSelect(This,ulParentalLevel) - -#define IDvdControl_ParentalCountrySelect(This,wCountry) \ - (This)->lpVtbl -> ParentalCountrySelect(This,wCountry) - -#define IDvdControl_KaraokeAudioPresentationModeChange(This,ulMode) \ - (This)->lpVtbl -> KaraokeAudioPresentationModeChange(This,ulMode) - -#define IDvdControl_VideoModePreferrence(This,ulPreferredDisplayMode) \ - (This)->lpVtbl -> VideoModePreferrence(This,ulPreferredDisplayMode) - -#define IDvdControl_SetRoot(This,pszPath) \ - (This)->lpVtbl -> SetRoot(This,pszPath) - -#define IDvdControl_MouseActivate(This,point) \ - (This)->lpVtbl -> MouseActivate(This,point) - -#define IDvdControl_MouseSelect(This,point) \ - (This)->lpVtbl -> MouseSelect(This,point) - -#define IDvdControl_ChapterPlayAutoStop(This,ulTitle,ulChapter,ulChaptersToPlay) \ - (This)->lpVtbl -> ChapterPlayAutoStop(This,ulTitle,ulChapter,ulChaptersToPlay) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDvdControl_TitlePlay_Proxy( - IDvdControl * This, - /* [in] */ ULONG ulTitle); - - -void __RPC_STUB IDvdControl_TitlePlay_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_ChapterPlay_Proxy( - IDvdControl * This, - /* [in] */ ULONG ulTitle, - /* [in] */ ULONG ulChapter); - - -void __RPC_STUB IDvdControl_ChapterPlay_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_TimePlay_Proxy( - IDvdControl * This, - /* [in] */ ULONG ulTitle, - /* [in] */ ULONG bcdTime); - - -void __RPC_STUB IDvdControl_TimePlay_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_StopForResume_Proxy( - IDvdControl * This); - - -void __RPC_STUB IDvdControl_StopForResume_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_GoUp_Proxy( - IDvdControl * This); - - -void __RPC_STUB IDvdControl_GoUp_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_TimeSearch_Proxy( - IDvdControl * This, - /* [in] */ ULONG bcdTime); - - -void __RPC_STUB IDvdControl_TimeSearch_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_ChapterSearch_Proxy( - IDvdControl * This, - /* [in] */ ULONG ulChapter); - - -void __RPC_STUB IDvdControl_ChapterSearch_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_PrevPGSearch_Proxy( - IDvdControl * This); - - -void __RPC_STUB IDvdControl_PrevPGSearch_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_TopPGSearch_Proxy( - IDvdControl * This); - - -void __RPC_STUB IDvdControl_TopPGSearch_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_NextPGSearch_Proxy( - IDvdControl * This); - - -void __RPC_STUB IDvdControl_NextPGSearch_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_ForwardScan_Proxy( - IDvdControl * This, - /* [in] */ double dwSpeed); - - -void __RPC_STUB IDvdControl_ForwardScan_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_BackwardScan_Proxy( - IDvdControl * This, - /* [in] */ double dwSpeed); - - -void __RPC_STUB IDvdControl_BackwardScan_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_MenuCall_Proxy( - IDvdControl * This, - /* [in] */ DVD_MENU_ID MenuID); - - -void __RPC_STUB IDvdControl_MenuCall_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_Resume_Proxy( - IDvdControl * This); - - -void __RPC_STUB IDvdControl_Resume_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_UpperButtonSelect_Proxy( - IDvdControl * This); - - -void __RPC_STUB IDvdControl_UpperButtonSelect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_LowerButtonSelect_Proxy( - IDvdControl * This); - - -void __RPC_STUB IDvdControl_LowerButtonSelect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_LeftButtonSelect_Proxy( - IDvdControl * This); - - -void __RPC_STUB IDvdControl_LeftButtonSelect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_RightButtonSelect_Proxy( - IDvdControl * This); - - -void __RPC_STUB IDvdControl_RightButtonSelect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_ButtonActivate_Proxy( - IDvdControl * This); - - -void __RPC_STUB IDvdControl_ButtonActivate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_ButtonSelectAndActivate_Proxy( - IDvdControl * This, - /* [in] */ ULONG ulButton); - - -void __RPC_STUB IDvdControl_ButtonSelectAndActivate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_StillOff_Proxy( - IDvdControl * This); - - -void __RPC_STUB IDvdControl_StillOff_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_PauseOn_Proxy( - IDvdControl * This); - - -void __RPC_STUB IDvdControl_PauseOn_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_PauseOff_Proxy( - IDvdControl * This); - - -void __RPC_STUB IDvdControl_PauseOff_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_MenuLanguageSelect_Proxy( - IDvdControl * This, - /* [in] */ LCID Language); - - -void __RPC_STUB IDvdControl_MenuLanguageSelect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_AudioStreamChange_Proxy( - IDvdControl * This, - /* [in] */ ULONG ulAudio); - - -void __RPC_STUB IDvdControl_AudioStreamChange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_SubpictureStreamChange_Proxy( - IDvdControl * This, - /* [in] */ ULONG ulSubPicture, - /* [in] */ BOOL bDisplay); - - -void __RPC_STUB IDvdControl_SubpictureStreamChange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_AngleChange_Proxy( - IDvdControl * This, - /* [in] */ ULONG ulAngle); - - -void __RPC_STUB IDvdControl_AngleChange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_ParentalLevelSelect_Proxy( - IDvdControl * This, - /* [in] */ ULONG ulParentalLevel); - - -void __RPC_STUB IDvdControl_ParentalLevelSelect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_ParentalCountrySelect_Proxy( - IDvdControl * This, - /* [in] */ WORD wCountry); - - -void __RPC_STUB IDvdControl_ParentalCountrySelect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_KaraokeAudioPresentationModeChange_Proxy( - IDvdControl * This, - /* [in] */ ULONG ulMode); - - -void __RPC_STUB IDvdControl_KaraokeAudioPresentationModeChange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_VideoModePreferrence_Proxy( - IDvdControl * This, - /* [in] */ ULONG ulPreferredDisplayMode); - - -void __RPC_STUB IDvdControl_VideoModePreferrence_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_SetRoot_Proxy( - IDvdControl * This, - /* [in] */ LPCWSTR pszPath); - - -void __RPC_STUB IDvdControl_SetRoot_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_MouseActivate_Proxy( - IDvdControl * This, - /* [in] */ POINT point); - - -void __RPC_STUB IDvdControl_MouseActivate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_MouseSelect_Proxy( - IDvdControl * This, - /* [in] */ POINT point); - - -void __RPC_STUB IDvdControl_MouseSelect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl_ChapterPlayAutoStop_Proxy( - IDvdControl * This, - /* [in] */ ULONG ulTitle, - /* [in] */ ULONG ulChapter, - /* [in] */ ULONG ulChaptersToPlay); - - -void __RPC_STUB IDvdControl_ChapterPlayAutoStop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDvdControl_INTERFACE_DEFINED__ */ - - -#ifndef __IDvdInfo_INTERFACE_DEFINED__ -#define __IDvdInfo_INTERFACE_DEFINED__ - -/* interface IDvdInfo */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IDvdInfo; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("A70EFE60-E2A3-11d0-A9BE-00AA0061BE93") - IDvdInfo : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetCurrentDomain( - /* [out] */ DVD_DOMAIN *pDomain) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentLocation( - /* [out] */ DVD_PLAYBACK_LOCATION *pLocation) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTotalTitleTime( - /* [out] */ ULONG *pulTotalTime) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentButton( - /* [out] */ ULONG *pulButtonsAvailable, - /* [out] */ ULONG *pulCurrentButton) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentAngle( - /* [out] */ ULONG *pulAnglesAvailable, - /* [out] */ ULONG *pulCurrentAngle) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentAudio( - /* [out] */ ULONG *pulStreamsAvailable, - /* [out] */ ULONG *pulCurrentStream) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentSubpicture( - /* [out] */ ULONG *pulStreamsAvailable, - /* [out] */ ULONG *pulCurrentStream, - /* [out] */ BOOL *pIsDisabled) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentUOPS( - /* [out] */ VALID_UOP_SOMTHING_OR_OTHER *pUOP) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAllSPRMs( - /* [out] */ SPRMARRAY *pRegisterArray) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAllGPRMs( - /* [out] */ GPRMARRAY *pRegisterArray) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAudioLanguage( - /* [in] */ ULONG ulStream, - /* [out] */ LCID *pLanguage) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSubpictureLanguage( - /* [in] */ ULONG ulStream, - /* [out] */ LCID *pLanguage) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTitleAttributes( - /* [in] */ ULONG ulTitle, - /* [out] */ DVD_ATR *pATR) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetVMGAttributes( - /* [out] */ DVD_ATR *pATR) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentVideoAttributes( - /* [out] */ DVD_VideoATR *pATR) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentAudioAttributes( - /* [out] */ DVD_AudioATR *pATR) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentSubpictureAttributes( - /* [out] */ DVD_SubpictureATR *pATR) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentVolumeInfo( - /* [out] */ ULONG *pulNumOfVol, - /* [out] */ ULONG *pulThisVolNum, - /* [out] */ DVD_DISC_SIDE *pSide, - /* [out] */ ULONG *pulNumOfTitles) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDVDTextInfo( - /* [size_is][out] */ BYTE *pTextManager, - /* [in] */ ULONG ulBufSize, - /* [out] */ ULONG *pulActualSize) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetPlayerParentalLevel( - /* [out] */ ULONG *pulParentalLevel, - /* [out] */ ULONG *pulCountryCode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNumberOfChapters( - /* [in] */ ULONG ulTitle, - /* [out] */ ULONG *pulNumberOfChapters) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTitleParentalLevels( - /* [in] */ ULONG ulTitle, - /* [out] */ ULONG *pulParentalLevels) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetRoot( - /* [size_is][out] */ LPSTR pRoot, - /* [in] */ ULONG ulBufSize, - /* [out] */ ULONG *pulActualSize) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDvdInfoVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDvdInfo * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDvdInfo * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDvdInfo * This); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentDomain )( - IDvdInfo * This, - /* [out] */ DVD_DOMAIN *pDomain); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentLocation )( - IDvdInfo * This, - /* [out] */ DVD_PLAYBACK_LOCATION *pLocation); - - HRESULT ( STDMETHODCALLTYPE *GetTotalTitleTime )( - IDvdInfo * This, - /* [out] */ ULONG *pulTotalTime); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentButton )( - IDvdInfo * This, - /* [out] */ ULONG *pulButtonsAvailable, - /* [out] */ ULONG *pulCurrentButton); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentAngle )( - IDvdInfo * This, - /* [out] */ ULONG *pulAnglesAvailable, - /* [out] */ ULONG *pulCurrentAngle); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentAudio )( - IDvdInfo * This, - /* [out] */ ULONG *pulStreamsAvailable, - /* [out] */ ULONG *pulCurrentStream); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentSubpicture )( - IDvdInfo * This, - /* [out] */ ULONG *pulStreamsAvailable, - /* [out] */ ULONG *pulCurrentStream, - /* [out] */ BOOL *pIsDisabled); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentUOPS )( - IDvdInfo * This, - /* [out] */ VALID_UOP_SOMTHING_OR_OTHER *pUOP); - - HRESULT ( STDMETHODCALLTYPE *GetAllSPRMs )( - IDvdInfo * This, - /* [out] */ SPRMARRAY *pRegisterArray); - - HRESULT ( STDMETHODCALLTYPE *GetAllGPRMs )( - IDvdInfo * This, - /* [out] */ GPRMARRAY *pRegisterArray); - - HRESULT ( STDMETHODCALLTYPE *GetAudioLanguage )( - IDvdInfo * This, - /* [in] */ ULONG ulStream, - /* [out] */ LCID *pLanguage); - - HRESULT ( STDMETHODCALLTYPE *GetSubpictureLanguage )( - IDvdInfo * This, - /* [in] */ ULONG ulStream, - /* [out] */ LCID *pLanguage); - - HRESULT ( STDMETHODCALLTYPE *GetTitleAttributes )( - IDvdInfo * This, - /* [in] */ ULONG ulTitle, - /* [out] */ DVD_ATR *pATR); - - HRESULT ( STDMETHODCALLTYPE *GetVMGAttributes )( - IDvdInfo * This, - /* [out] */ DVD_ATR *pATR); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentVideoAttributes )( - IDvdInfo * This, - /* [out] */ DVD_VideoATR *pATR); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentAudioAttributes )( - IDvdInfo * This, - /* [out] */ DVD_AudioATR *pATR); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentSubpictureAttributes )( - IDvdInfo * This, - /* [out] */ DVD_SubpictureATR *pATR); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentVolumeInfo )( - IDvdInfo * This, - /* [out] */ ULONG *pulNumOfVol, - /* [out] */ ULONG *pulThisVolNum, - /* [out] */ DVD_DISC_SIDE *pSide, - /* [out] */ ULONG *pulNumOfTitles); - - HRESULT ( STDMETHODCALLTYPE *GetDVDTextInfo )( - IDvdInfo * This, - /* [size_is][out] */ BYTE *pTextManager, - /* [in] */ ULONG ulBufSize, - /* [out] */ ULONG *pulActualSize); - - HRESULT ( STDMETHODCALLTYPE *GetPlayerParentalLevel )( - IDvdInfo * This, - /* [out] */ ULONG *pulParentalLevel, - /* [out] */ ULONG *pulCountryCode); - - HRESULT ( STDMETHODCALLTYPE *GetNumberOfChapters )( - IDvdInfo * This, - /* [in] */ ULONG ulTitle, - /* [out] */ ULONG *pulNumberOfChapters); - - HRESULT ( STDMETHODCALLTYPE *GetTitleParentalLevels )( - IDvdInfo * This, - /* [in] */ ULONG ulTitle, - /* [out] */ ULONG *pulParentalLevels); - - HRESULT ( STDMETHODCALLTYPE *GetRoot )( - IDvdInfo * This, - /* [size_is][out] */ LPSTR pRoot, - /* [in] */ ULONG ulBufSize, - /* [out] */ ULONG *pulActualSize); - - END_INTERFACE - } IDvdInfoVtbl; - - interface IDvdInfo - { - CONST_VTBL struct IDvdInfoVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDvdInfo_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDvdInfo_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDvdInfo_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDvdInfo_GetCurrentDomain(This,pDomain) \ - (This)->lpVtbl -> GetCurrentDomain(This,pDomain) - -#define IDvdInfo_GetCurrentLocation(This,pLocation) \ - (This)->lpVtbl -> GetCurrentLocation(This,pLocation) - -#define IDvdInfo_GetTotalTitleTime(This,pulTotalTime) \ - (This)->lpVtbl -> GetTotalTitleTime(This,pulTotalTime) - -#define IDvdInfo_GetCurrentButton(This,pulButtonsAvailable,pulCurrentButton) \ - (This)->lpVtbl -> GetCurrentButton(This,pulButtonsAvailable,pulCurrentButton) - -#define IDvdInfo_GetCurrentAngle(This,pulAnglesAvailable,pulCurrentAngle) \ - (This)->lpVtbl -> GetCurrentAngle(This,pulAnglesAvailable,pulCurrentAngle) - -#define IDvdInfo_GetCurrentAudio(This,pulStreamsAvailable,pulCurrentStream) \ - (This)->lpVtbl -> GetCurrentAudio(This,pulStreamsAvailable,pulCurrentStream) - -#define IDvdInfo_GetCurrentSubpicture(This,pulStreamsAvailable,pulCurrentStream,pIsDisabled) \ - (This)->lpVtbl -> GetCurrentSubpicture(This,pulStreamsAvailable,pulCurrentStream,pIsDisabled) - -#define IDvdInfo_GetCurrentUOPS(This,pUOP) \ - (This)->lpVtbl -> GetCurrentUOPS(This,pUOP) - -#define IDvdInfo_GetAllSPRMs(This,pRegisterArray) \ - (This)->lpVtbl -> GetAllSPRMs(This,pRegisterArray) - -#define IDvdInfo_GetAllGPRMs(This,pRegisterArray) \ - (This)->lpVtbl -> GetAllGPRMs(This,pRegisterArray) - -#define IDvdInfo_GetAudioLanguage(This,ulStream,pLanguage) \ - (This)->lpVtbl -> GetAudioLanguage(This,ulStream,pLanguage) - -#define IDvdInfo_GetSubpictureLanguage(This,ulStream,pLanguage) \ - (This)->lpVtbl -> GetSubpictureLanguage(This,ulStream,pLanguage) - -#define IDvdInfo_GetTitleAttributes(This,ulTitle,pATR) \ - (This)->lpVtbl -> GetTitleAttributes(This,ulTitle,pATR) - -#define IDvdInfo_GetVMGAttributes(This,pATR) \ - (This)->lpVtbl -> GetVMGAttributes(This,pATR) - -#define IDvdInfo_GetCurrentVideoAttributes(This,pATR) \ - (This)->lpVtbl -> GetCurrentVideoAttributes(This,pATR) - -#define IDvdInfo_GetCurrentAudioAttributes(This,pATR) \ - (This)->lpVtbl -> GetCurrentAudioAttributes(This,pATR) - -#define IDvdInfo_GetCurrentSubpictureAttributes(This,pATR) \ - (This)->lpVtbl -> GetCurrentSubpictureAttributes(This,pATR) - -#define IDvdInfo_GetCurrentVolumeInfo(This,pulNumOfVol,pulThisVolNum,pSide,pulNumOfTitles) \ - (This)->lpVtbl -> GetCurrentVolumeInfo(This,pulNumOfVol,pulThisVolNum,pSide,pulNumOfTitles) - -#define IDvdInfo_GetDVDTextInfo(This,pTextManager,ulBufSize,pulActualSize) \ - (This)->lpVtbl -> GetDVDTextInfo(This,pTextManager,ulBufSize,pulActualSize) - -#define IDvdInfo_GetPlayerParentalLevel(This,pulParentalLevel,pulCountryCode) \ - (This)->lpVtbl -> GetPlayerParentalLevel(This,pulParentalLevel,pulCountryCode) - -#define IDvdInfo_GetNumberOfChapters(This,ulTitle,pulNumberOfChapters) \ - (This)->lpVtbl -> GetNumberOfChapters(This,ulTitle,pulNumberOfChapters) - -#define IDvdInfo_GetTitleParentalLevels(This,ulTitle,pulParentalLevels) \ - (This)->lpVtbl -> GetTitleParentalLevels(This,ulTitle,pulParentalLevels) - -#define IDvdInfo_GetRoot(This,pRoot,ulBufSize,pulActualSize) \ - (This)->lpVtbl -> GetRoot(This,pRoot,ulBufSize,pulActualSize) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetCurrentDomain_Proxy( - IDvdInfo * This, - /* [out] */ DVD_DOMAIN *pDomain); - - -void __RPC_STUB IDvdInfo_GetCurrentDomain_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetCurrentLocation_Proxy( - IDvdInfo * This, - /* [out] */ DVD_PLAYBACK_LOCATION *pLocation); - - -void __RPC_STUB IDvdInfo_GetCurrentLocation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetTotalTitleTime_Proxy( - IDvdInfo * This, - /* [out] */ ULONG *pulTotalTime); - - -void __RPC_STUB IDvdInfo_GetTotalTitleTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetCurrentButton_Proxy( - IDvdInfo * This, - /* [out] */ ULONG *pulButtonsAvailable, - /* [out] */ ULONG *pulCurrentButton); - - -void __RPC_STUB IDvdInfo_GetCurrentButton_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetCurrentAngle_Proxy( - IDvdInfo * This, - /* [out] */ ULONG *pulAnglesAvailable, - /* [out] */ ULONG *pulCurrentAngle); - - -void __RPC_STUB IDvdInfo_GetCurrentAngle_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetCurrentAudio_Proxy( - IDvdInfo * This, - /* [out] */ ULONG *pulStreamsAvailable, - /* [out] */ ULONG *pulCurrentStream); - - -void __RPC_STUB IDvdInfo_GetCurrentAudio_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetCurrentSubpicture_Proxy( - IDvdInfo * This, - /* [out] */ ULONG *pulStreamsAvailable, - /* [out] */ ULONG *pulCurrentStream, - /* [out] */ BOOL *pIsDisabled); - - -void __RPC_STUB IDvdInfo_GetCurrentSubpicture_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetCurrentUOPS_Proxy( - IDvdInfo * This, - /* [out] */ VALID_UOP_SOMTHING_OR_OTHER *pUOP); - - -void __RPC_STUB IDvdInfo_GetCurrentUOPS_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetAllSPRMs_Proxy( - IDvdInfo * This, - /* [out] */ SPRMARRAY *pRegisterArray); - - -void __RPC_STUB IDvdInfo_GetAllSPRMs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetAllGPRMs_Proxy( - IDvdInfo * This, - /* [out] */ GPRMARRAY *pRegisterArray); - - -void __RPC_STUB IDvdInfo_GetAllGPRMs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetAudioLanguage_Proxy( - IDvdInfo * This, - /* [in] */ ULONG ulStream, - /* [out] */ LCID *pLanguage); - - -void __RPC_STUB IDvdInfo_GetAudioLanguage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetSubpictureLanguage_Proxy( - IDvdInfo * This, - /* [in] */ ULONG ulStream, - /* [out] */ LCID *pLanguage); - - -void __RPC_STUB IDvdInfo_GetSubpictureLanguage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetTitleAttributes_Proxy( - IDvdInfo * This, - /* [in] */ ULONG ulTitle, - /* [out] */ DVD_ATR *pATR); - - -void __RPC_STUB IDvdInfo_GetTitleAttributes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetVMGAttributes_Proxy( - IDvdInfo * This, - /* [out] */ DVD_ATR *pATR); - - -void __RPC_STUB IDvdInfo_GetVMGAttributes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetCurrentVideoAttributes_Proxy( - IDvdInfo * This, - /* [out] */ DVD_VideoATR *pATR); - - -void __RPC_STUB IDvdInfo_GetCurrentVideoAttributes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetCurrentAudioAttributes_Proxy( - IDvdInfo * This, - /* [out] */ DVD_AudioATR *pATR); - - -void __RPC_STUB IDvdInfo_GetCurrentAudioAttributes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetCurrentSubpictureAttributes_Proxy( - IDvdInfo * This, - /* [out] */ DVD_SubpictureATR *pATR); - - -void __RPC_STUB IDvdInfo_GetCurrentSubpictureAttributes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetCurrentVolumeInfo_Proxy( - IDvdInfo * This, - /* [out] */ ULONG *pulNumOfVol, - /* [out] */ ULONG *pulThisVolNum, - /* [out] */ DVD_DISC_SIDE *pSide, - /* [out] */ ULONG *pulNumOfTitles); - - -void __RPC_STUB IDvdInfo_GetCurrentVolumeInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetDVDTextInfo_Proxy( - IDvdInfo * This, - /* [size_is][out] */ BYTE *pTextManager, - /* [in] */ ULONG ulBufSize, - /* [out] */ ULONG *pulActualSize); - - -void __RPC_STUB IDvdInfo_GetDVDTextInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetPlayerParentalLevel_Proxy( - IDvdInfo * This, - /* [out] */ ULONG *pulParentalLevel, - /* [out] */ ULONG *pulCountryCode); - - -void __RPC_STUB IDvdInfo_GetPlayerParentalLevel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetNumberOfChapters_Proxy( - IDvdInfo * This, - /* [in] */ ULONG ulTitle, - /* [out] */ ULONG *pulNumberOfChapters); - - -void __RPC_STUB IDvdInfo_GetNumberOfChapters_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetTitleParentalLevels_Proxy( - IDvdInfo * This, - /* [in] */ ULONG ulTitle, - /* [out] */ ULONG *pulParentalLevels); - - -void __RPC_STUB IDvdInfo_GetTitleParentalLevels_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo_GetRoot_Proxy( - IDvdInfo * This, - /* [size_is][out] */ LPSTR pRoot, - /* [in] */ ULONG ulBufSize, - /* [out] */ ULONG *pulActualSize); - - -void __RPC_STUB IDvdInfo_GetRoot_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDvdInfo_INTERFACE_DEFINED__ */ - - -#ifndef __IDvdCmd_INTERFACE_DEFINED__ -#define __IDvdCmd_INTERFACE_DEFINED__ - -/* interface IDvdCmd */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IDvdCmd; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("5a4a97e4-94ee-4a55-9751-74b5643aa27d") - IDvdCmd : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE WaitForStart( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE WaitForEnd( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDvdCmdVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDvdCmd * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDvdCmd * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDvdCmd * This); - - HRESULT ( STDMETHODCALLTYPE *WaitForStart )( - IDvdCmd * This); - - HRESULT ( STDMETHODCALLTYPE *WaitForEnd )( - IDvdCmd * This); - - END_INTERFACE - } IDvdCmdVtbl; - - interface IDvdCmd - { - CONST_VTBL struct IDvdCmdVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDvdCmd_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDvdCmd_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDvdCmd_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDvdCmd_WaitForStart(This) \ - (This)->lpVtbl -> WaitForStart(This) - -#define IDvdCmd_WaitForEnd(This) \ - (This)->lpVtbl -> WaitForEnd(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDvdCmd_WaitForStart_Proxy( - IDvdCmd * This); - - -void __RPC_STUB IDvdCmd_WaitForStart_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdCmd_WaitForEnd_Proxy( - IDvdCmd * This); - - -void __RPC_STUB IDvdCmd_WaitForEnd_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDvdCmd_INTERFACE_DEFINED__ */ - - -#ifndef __IDvdState_INTERFACE_DEFINED__ -#define __IDvdState_INTERFACE_DEFINED__ - -/* interface IDvdState */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IDvdState; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("86303d6d-1c4a-4087-ab42-f711167048ef") - IDvdState : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetDiscID( - /* [out] */ ULONGLONG *pullUniqueID) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetParentalLevel( - /* [out] */ ULONG *pulParentalLevel) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDvdStateVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDvdState * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDvdState * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDvdState * This); - - HRESULT ( STDMETHODCALLTYPE *GetDiscID )( - IDvdState * This, - /* [out] */ ULONGLONG *pullUniqueID); - - HRESULT ( STDMETHODCALLTYPE *GetParentalLevel )( - IDvdState * This, - /* [out] */ ULONG *pulParentalLevel); - - END_INTERFACE - } IDvdStateVtbl; - - interface IDvdState - { - CONST_VTBL struct IDvdStateVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDvdState_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDvdState_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDvdState_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDvdState_GetDiscID(This,pullUniqueID) \ - (This)->lpVtbl -> GetDiscID(This,pullUniqueID) - -#define IDvdState_GetParentalLevel(This,pulParentalLevel) \ - (This)->lpVtbl -> GetParentalLevel(This,pulParentalLevel) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDvdState_GetDiscID_Proxy( - IDvdState * This, - /* [out] */ ULONGLONG *pullUniqueID); - - -void __RPC_STUB IDvdState_GetDiscID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdState_GetParentalLevel_Proxy( - IDvdState * This, - /* [out] */ ULONG *pulParentalLevel); - - -void __RPC_STUB IDvdState_GetParentalLevel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDvdState_INTERFACE_DEFINED__ */ - - -#ifndef __IDvdControl2_INTERFACE_DEFINED__ -#define __IDvdControl2_INTERFACE_DEFINED__ - -/* interface IDvdControl2 */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IDvdControl2; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("33BC7430-EEC0-11D2-8201-00A0C9D74842") - IDvdControl2 : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE PlayTitle( - /* [in] */ ULONG ulTitle, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE PlayChapterInTitle( - /* [in] */ ULONG ulTitle, - /* [in] */ ULONG ulChapter, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE PlayAtTimeInTitle( - /* [in] */ ULONG ulTitle, - /* [in] */ DVD_HMSF_TIMECODE *pStartTime, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE Stop( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE ReturnFromSubmenu( - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE PlayAtTime( - /* [in] */ DVD_HMSF_TIMECODE *pTime, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE PlayChapter( - /* [in] */ ULONG ulChapter, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE PlayPrevChapter( - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE ReplayChapter( - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE PlayNextChapter( - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE PlayForwards( - /* [in] */ double dSpeed, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE PlayBackwards( - /* [in] */ double dSpeed, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE ShowMenu( - /* [in] */ DVD_MENU_ID MenuID, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE Resume( - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SelectRelativeButton( - DVD_RELATIVE_BUTTON buttonDir) = 0; - - virtual HRESULT STDMETHODCALLTYPE ActivateButton( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SelectButton( - /* [in] */ ULONG ulButton) = 0; - - virtual HRESULT STDMETHODCALLTYPE SelectAndActivateButton( - /* [in] */ ULONG ulButton) = 0; - - virtual HRESULT STDMETHODCALLTYPE StillOff( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Pause( - /* [in] */ BOOL bState) = 0; - - virtual HRESULT STDMETHODCALLTYPE SelectAudioStream( - /* [in] */ ULONG ulAudio, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SelectSubpictureStream( - /* [in] */ ULONG ulSubPicture, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetSubpictureState( - /* [in] */ BOOL bState, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SelectAngle( - /* [in] */ ULONG ulAngle, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SelectParentalLevel( - /* [in] */ ULONG ulParentalLevel) = 0; - - virtual HRESULT STDMETHODCALLTYPE SelectParentalCountry( - /* [in] */ BYTE bCountry[ 2 ]) = 0; - - virtual HRESULT STDMETHODCALLTYPE SelectKaraokeAudioPresentationMode( - /* [in] */ ULONG ulMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE SelectVideoModePreference( - /* [in] */ ULONG ulPreferredDisplayMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDVDDirectory( - /* [in] */ LPCWSTR pszwPath) = 0; - - virtual HRESULT STDMETHODCALLTYPE ActivateAtPosition( - /* [in] */ POINT point) = 0; - - virtual HRESULT STDMETHODCALLTYPE SelectAtPosition( - /* [in] */ POINT point) = 0; - - virtual HRESULT STDMETHODCALLTYPE PlayChaptersAutoStop( - /* [in] */ ULONG ulTitle, - /* [in] */ ULONG ulChapter, - /* [in] */ ULONG ulChaptersToPlay, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE AcceptParentalLevelChange( - /* [in] */ BOOL bAccept) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetOption( - /* [in] */ DVD_OPTION_FLAG flag, - /* [in] */ BOOL fState) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetState( - /* [in] */ IDvdState *pState, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE PlayPeriodInTitleAutoStop( - /* [in] */ ULONG ulTitle, - /* [in] */ DVD_HMSF_TIMECODE *pStartTime, - /* [in] */ DVD_HMSF_TIMECODE *pEndTime, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetGPRM( - /* [in] */ ULONG ulIndex, - /* [in] */ WORD wValue, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SelectDefaultMenuLanguage( - /* [in] */ LCID Language) = 0; - - virtual HRESULT STDMETHODCALLTYPE SelectDefaultAudioLanguage( - /* [in] */ LCID Language, - /* [in] */ DVD_AUDIO_LANG_EXT audioExtension) = 0; - - virtual HRESULT STDMETHODCALLTYPE SelectDefaultSubpictureLanguage( - /* [in] */ LCID Language, - /* [in] */ DVD_SUBPICTURE_LANG_EXT subpictureExtension) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDvdControl2Vtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDvdControl2 * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDvdControl2 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDvdControl2 * This); - - HRESULT ( STDMETHODCALLTYPE *PlayTitle )( - IDvdControl2 * This, - /* [in] */ ULONG ulTitle, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *PlayChapterInTitle )( - IDvdControl2 * This, - /* [in] */ ULONG ulTitle, - /* [in] */ ULONG ulChapter, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *PlayAtTimeInTitle )( - IDvdControl2 * This, - /* [in] */ ULONG ulTitle, - /* [in] */ DVD_HMSF_TIMECODE *pStartTime, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *Stop )( - IDvdControl2 * This); - - HRESULT ( STDMETHODCALLTYPE *ReturnFromSubmenu )( - IDvdControl2 * This, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *PlayAtTime )( - IDvdControl2 * This, - /* [in] */ DVD_HMSF_TIMECODE *pTime, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *PlayChapter )( - IDvdControl2 * This, - /* [in] */ ULONG ulChapter, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *PlayPrevChapter )( - IDvdControl2 * This, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *ReplayChapter )( - IDvdControl2 * This, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *PlayNextChapter )( - IDvdControl2 * This, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *PlayForwards )( - IDvdControl2 * This, - /* [in] */ double dSpeed, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *PlayBackwards )( - IDvdControl2 * This, - /* [in] */ double dSpeed, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *ShowMenu )( - IDvdControl2 * This, - /* [in] */ DVD_MENU_ID MenuID, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *Resume )( - IDvdControl2 * This, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *SelectRelativeButton )( - IDvdControl2 * This, - DVD_RELATIVE_BUTTON buttonDir); - - HRESULT ( STDMETHODCALLTYPE *ActivateButton )( - IDvdControl2 * This); - - HRESULT ( STDMETHODCALLTYPE *SelectButton )( - IDvdControl2 * This, - /* [in] */ ULONG ulButton); - - HRESULT ( STDMETHODCALLTYPE *SelectAndActivateButton )( - IDvdControl2 * This, - /* [in] */ ULONG ulButton); - - HRESULT ( STDMETHODCALLTYPE *StillOff )( - IDvdControl2 * This); - - HRESULT ( STDMETHODCALLTYPE *Pause )( - IDvdControl2 * This, - /* [in] */ BOOL bState); - - HRESULT ( STDMETHODCALLTYPE *SelectAudioStream )( - IDvdControl2 * This, - /* [in] */ ULONG ulAudio, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *SelectSubpictureStream )( - IDvdControl2 * This, - /* [in] */ ULONG ulSubPicture, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *SetSubpictureState )( - IDvdControl2 * This, - /* [in] */ BOOL bState, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *SelectAngle )( - IDvdControl2 * This, - /* [in] */ ULONG ulAngle, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *SelectParentalLevel )( - IDvdControl2 * This, - /* [in] */ ULONG ulParentalLevel); - - HRESULT ( STDMETHODCALLTYPE *SelectParentalCountry )( - IDvdControl2 * This, - /* [in] */ BYTE bCountry[ 2 ]); - - HRESULT ( STDMETHODCALLTYPE *SelectKaraokeAudioPresentationMode )( - IDvdControl2 * This, - /* [in] */ ULONG ulMode); - - HRESULT ( STDMETHODCALLTYPE *SelectVideoModePreference )( - IDvdControl2 * This, - /* [in] */ ULONG ulPreferredDisplayMode); - - HRESULT ( STDMETHODCALLTYPE *SetDVDDirectory )( - IDvdControl2 * This, - /* [in] */ LPCWSTR pszwPath); - - HRESULT ( STDMETHODCALLTYPE *ActivateAtPosition )( - IDvdControl2 * This, - /* [in] */ POINT point); - - HRESULT ( STDMETHODCALLTYPE *SelectAtPosition )( - IDvdControl2 * This, - /* [in] */ POINT point); - - HRESULT ( STDMETHODCALLTYPE *PlayChaptersAutoStop )( - IDvdControl2 * This, - /* [in] */ ULONG ulTitle, - /* [in] */ ULONG ulChapter, - /* [in] */ ULONG ulChaptersToPlay, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *AcceptParentalLevelChange )( - IDvdControl2 * This, - /* [in] */ BOOL bAccept); - - HRESULT ( STDMETHODCALLTYPE *SetOption )( - IDvdControl2 * This, - /* [in] */ DVD_OPTION_FLAG flag, - /* [in] */ BOOL fState); - - HRESULT ( STDMETHODCALLTYPE *SetState )( - IDvdControl2 * This, - /* [in] */ IDvdState *pState, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *PlayPeriodInTitleAutoStop )( - IDvdControl2 * This, - /* [in] */ ULONG ulTitle, - /* [in] */ DVD_HMSF_TIMECODE *pStartTime, - /* [in] */ DVD_HMSF_TIMECODE *pEndTime, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *SetGPRM )( - IDvdControl2 * This, - /* [in] */ ULONG ulIndex, - /* [in] */ WORD wValue, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *SelectDefaultMenuLanguage )( - IDvdControl2 * This, - /* [in] */ LCID Language); - - HRESULT ( STDMETHODCALLTYPE *SelectDefaultAudioLanguage )( - IDvdControl2 * This, - /* [in] */ LCID Language, - /* [in] */ DVD_AUDIO_LANG_EXT audioExtension); - - HRESULT ( STDMETHODCALLTYPE *SelectDefaultSubpictureLanguage )( - IDvdControl2 * This, - /* [in] */ LCID Language, - /* [in] */ DVD_SUBPICTURE_LANG_EXT subpictureExtension); - - END_INTERFACE - } IDvdControl2Vtbl; - - interface IDvdControl2 - { - CONST_VTBL struct IDvdControl2Vtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDvdControl2_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDvdControl2_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDvdControl2_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDvdControl2_PlayTitle(This,ulTitle,dwFlags,ppCmd) \ - (This)->lpVtbl -> PlayTitle(This,ulTitle,dwFlags,ppCmd) - -#define IDvdControl2_PlayChapterInTitle(This,ulTitle,ulChapter,dwFlags,ppCmd) \ - (This)->lpVtbl -> PlayChapterInTitle(This,ulTitle,ulChapter,dwFlags,ppCmd) - -#define IDvdControl2_PlayAtTimeInTitle(This,ulTitle,pStartTime,dwFlags,ppCmd) \ - (This)->lpVtbl -> PlayAtTimeInTitle(This,ulTitle,pStartTime,dwFlags,ppCmd) - -#define IDvdControl2_Stop(This) \ - (This)->lpVtbl -> Stop(This) - -#define IDvdControl2_ReturnFromSubmenu(This,dwFlags,ppCmd) \ - (This)->lpVtbl -> ReturnFromSubmenu(This,dwFlags,ppCmd) - -#define IDvdControl2_PlayAtTime(This,pTime,dwFlags,ppCmd) \ - (This)->lpVtbl -> PlayAtTime(This,pTime,dwFlags,ppCmd) - -#define IDvdControl2_PlayChapter(This,ulChapter,dwFlags,ppCmd) \ - (This)->lpVtbl -> PlayChapter(This,ulChapter,dwFlags,ppCmd) - -#define IDvdControl2_PlayPrevChapter(This,dwFlags,ppCmd) \ - (This)->lpVtbl -> PlayPrevChapter(This,dwFlags,ppCmd) - -#define IDvdControl2_ReplayChapter(This,dwFlags,ppCmd) \ - (This)->lpVtbl -> ReplayChapter(This,dwFlags,ppCmd) - -#define IDvdControl2_PlayNextChapter(This,dwFlags,ppCmd) \ - (This)->lpVtbl -> PlayNextChapter(This,dwFlags,ppCmd) - -#define IDvdControl2_PlayForwards(This,dSpeed,dwFlags,ppCmd) \ - (This)->lpVtbl -> PlayForwards(This,dSpeed,dwFlags,ppCmd) - -#define IDvdControl2_PlayBackwards(This,dSpeed,dwFlags,ppCmd) \ - (This)->lpVtbl -> PlayBackwards(This,dSpeed,dwFlags,ppCmd) - -#define IDvdControl2_ShowMenu(This,MenuID,dwFlags,ppCmd) \ - (This)->lpVtbl -> ShowMenu(This,MenuID,dwFlags,ppCmd) - -#define IDvdControl2_Resume(This,dwFlags,ppCmd) \ - (This)->lpVtbl -> Resume(This,dwFlags,ppCmd) - -#define IDvdControl2_SelectRelativeButton(This,buttonDir) \ - (This)->lpVtbl -> SelectRelativeButton(This,buttonDir) - -#define IDvdControl2_ActivateButton(This) \ - (This)->lpVtbl -> ActivateButton(This) - -#define IDvdControl2_SelectButton(This,ulButton) \ - (This)->lpVtbl -> SelectButton(This,ulButton) - -#define IDvdControl2_SelectAndActivateButton(This,ulButton) \ - (This)->lpVtbl -> SelectAndActivateButton(This,ulButton) - -#define IDvdControl2_StillOff(This) \ - (This)->lpVtbl -> StillOff(This) - -#define IDvdControl2_Pause(This,bState) \ - (This)->lpVtbl -> Pause(This,bState) - -#define IDvdControl2_SelectAudioStream(This,ulAudio,dwFlags,ppCmd) \ - (This)->lpVtbl -> SelectAudioStream(This,ulAudio,dwFlags,ppCmd) - -#define IDvdControl2_SelectSubpictureStream(This,ulSubPicture,dwFlags,ppCmd) \ - (This)->lpVtbl -> SelectSubpictureStream(This,ulSubPicture,dwFlags,ppCmd) - -#define IDvdControl2_SetSubpictureState(This,bState,dwFlags,ppCmd) \ - (This)->lpVtbl -> SetSubpictureState(This,bState,dwFlags,ppCmd) - -#define IDvdControl2_SelectAngle(This,ulAngle,dwFlags,ppCmd) \ - (This)->lpVtbl -> SelectAngle(This,ulAngle,dwFlags,ppCmd) - -#define IDvdControl2_SelectParentalLevel(This,ulParentalLevel) \ - (This)->lpVtbl -> SelectParentalLevel(This,ulParentalLevel) - -#define IDvdControl2_SelectParentalCountry(This,bCountry) \ - (This)->lpVtbl -> SelectParentalCountry(This,bCountry) - -#define IDvdControl2_SelectKaraokeAudioPresentationMode(This,ulMode) \ - (This)->lpVtbl -> SelectKaraokeAudioPresentationMode(This,ulMode) - -#define IDvdControl2_SelectVideoModePreference(This,ulPreferredDisplayMode) \ - (This)->lpVtbl -> SelectVideoModePreference(This,ulPreferredDisplayMode) - -#define IDvdControl2_SetDVDDirectory(This,pszwPath) \ - (This)->lpVtbl -> SetDVDDirectory(This,pszwPath) - -#define IDvdControl2_ActivateAtPosition(This,point) \ - (This)->lpVtbl -> ActivateAtPosition(This,point) - -#define IDvdControl2_SelectAtPosition(This,point) \ - (This)->lpVtbl -> SelectAtPosition(This,point) - -#define IDvdControl2_PlayChaptersAutoStop(This,ulTitle,ulChapter,ulChaptersToPlay,dwFlags,ppCmd) \ - (This)->lpVtbl -> PlayChaptersAutoStop(This,ulTitle,ulChapter,ulChaptersToPlay,dwFlags,ppCmd) - -#define IDvdControl2_AcceptParentalLevelChange(This,bAccept) \ - (This)->lpVtbl -> AcceptParentalLevelChange(This,bAccept) - -#define IDvdControl2_SetOption(This,flag,fState) \ - (This)->lpVtbl -> SetOption(This,flag,fState) - -#define IDvdControl2_SetState(This,pState,dwFlags,ppCmd) \ - (This)->lpVtbl -> SetState(This,pState,dwFlags,ppCmd) - -#define IDvdControl2_PlayPeriodInTitleAutoStop(This,ulTitle,pStartTime,pEndTime,dwFlags,ppCmd) \ - (This)->lpVtbl -> PlayPeriodInTitleAutoStop(This,ulTitle,pStartTime,pEndTime,dwFlags,ppCmd) - -#define IDvdControl2_SetGPRM(This,ulIndex,wValue,dwFlags,ppCmd) \ - (This)->lpVtbl -> SetGPRM(This,ulIndex,wValue,dwFlags,ppCmd) - -#define IDvdControl2_SelectDefaultMenuLanguage(This,Language) \ - (This)->lpVtbl -> SelectDefaultMenuLanguage(This,Language) - -#define IDvdControl2_SelectDefaultAudioLanguage(This,Language,audioExtension) \ - (This)->lpVtbl -> SelectDefaultAudioLanguage(This,Language,audioExtension) - -#define IDvdControl2_SelectDefaultSubpictureLanguage(This,Language,subpictureExtension) \ - (This)->lpVtbl -> SelectDefaultSubpictureLanguage(This,Language,subpictureExtension) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDvdControl2_PlayTitle_Proxy( - IDvdControl2 * This, - /* [in] */ ULONG ulTitle, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_PlayTitle_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_PlayChapterInTitle_Proxy( - IDvdControl2 * This, - /* [in] */ ULONG ulTitle, - /* [in] */ ULONG ulChapter, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_PlayChapterInTitle_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_PlayAtTimeInTitle_Proxy( - IDvdControl2 * This, - /* [in] */ ULONG ulTitle, - /* [in] */ DVD_HMSF_TIMECODE *pStartTime, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_PlayAtTimeInTitle_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_Stop_Proxy( - IDvdControl2 * This); - - -void __RPC_STUB IDvdControl2_Stop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_ReturnFromSubmenu_Proxy( - IDvdControl2 * This, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_ReturnFromSubmenu_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_PlayAtTime_Proxy( - IDvdControl2 * This, - /* [in] */ DVD_HMSF_TIMECODE *pTime, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_PlayAtTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_PlayChapter_Proxy( - IDvdControl2 * This, - /* [in] */ ULONG ulChapter, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_PlayChapter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_PlayPrevChapter_Proxy( - IDvdControl2 * This, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_PlayPrevChapter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_ReplayChapter_Proxy( - IDvdControl2 * This, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_ReplayChapter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_PlayNextChapter_Proxy( - IDvdControl2 * This, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_PlayNextChapter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_PlayForwards_Proxy( - IDvdControl2 * This, - /* [in] */ double dSpeed, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_PlayForwards_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_PlayBackwards_Proxy( - IDvdControl2 * This, - /* [in] */ double dSpeed, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_PlayBackwards_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_ShowMenu_Proxy( - IDvdControl2 * This, - /* [in] */ DVD_MENU_ID MenuID, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_ShowMenu_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_Resume_Proxy( - IDvdControl2 * This, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_Resume_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SelectRelativeButton_Proxy( - IDvdControl2 * This, - DVD_RELATIVE_BUTTON buttonDir); - - -void __RPC_STUB IDvdControl2_SelectRelativeButton_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_ActivateButton_Proxy( - IDvdControl2 * This); - - -void __RPC_STUB IDvdControl2_ActivateButton_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SelectButton_Proxy( - IDvdControl2 * This, - /* [in] */ ULONG ulButton); - - -void __RPC_STUB IDvdControl2_SelectButton_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SelectAndActivateButton_Proxy( - IDvdControl2 * This, - /* [in] */ ULONG ulButton); - - -void __RPC_STUB IDvdControl2_SelectAndActivateButton_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_StillOff_Proxy( - IDvdControl2 * This); - - -void __RPC_STUB IDvdControl2_StillOff_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_Pause_Proxy( - IDvdControl2 * This, - /* [in] */ BOOL bState); - - -void __RPC_STUB IDvdControl2_Pause_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SelectAudioStream_Proxy( - IDvdControl2 * This, - /* [in] */ ULONG ulAudio, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_SelectAudioStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SelectSubpictureStream_Proxy( - IDvdControl2 * This, - /* [in] */ ULONG ulSubPicture, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_SelectSubpictureStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SetSubpictureState_Proxy( - IDvdControl2 * This, - /* [in] */ BOOL bState, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_SetSubpictureState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SelectAngle_Proxy( - IDvdControl2 * This, - /* [in] */ ULONG ulAngle, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_SelectAngle_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SelectParentalLevel_Proxy( - IDvdControl2 * This, - /* [in] */ ULONG ulParentalLevel); - - -void __RPC_STUB IDvdControl2_SelectParentalLevel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SelectParentalCountry_Proxy( - IDvdControl2 * This, - /* [in] */ BYTE bCountry[ 2 ]); - - -void __RPC_STUB IDvdControl2_SelectParentalCountry_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SelectKaraokeAudioPresentationMode_Proxy( - IDvdControl2 * This, - /* [in] */ ULONG ulMode); - - -void __RPC_STUB IDvdControl2_SelectKaraokeAudioPresentationMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SelectVideoModePreference_Proxy( - IDvdControl2 * This, - /* [in] */ ULONG ulPreferredDisplayMode); - - -void __RPC_STUB IDvdControl2_SelectVideoModePreference_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SetDVDDirectory_Proxy( - IDvdControl2 * This, - /* [in] */ LPCWSTR pszwPath); - - -void __RPC_STUB IDvdControl2_SetDVDDirectory_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_ActivateAtPosition_Proxy( - IDvdControl2 * This, - /* [in] */ POINT point); - - -void __RPC_STUB IDvdControl2_ActivateAtPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SelectAtPosition_Proxy( - IDvdControl2 * This, - /* [in] */ POINT point); - - -void __RPC_STUB IDvdControl2_SelectAtPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_PlayChaptersAutoStop_Proxy( - IDvdControl2 * This, - /* [in] */ ULONG ulTitle, - /* [in] */ ULONG ulChapter, - /* [in] */ ULONG ulChaptersToPlay, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_PlayChaptersAutoStop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_AcceptParentalLevelChange_Proxy( - IDvdControl2 * This, - /* [in] */ BOOL bAccept); - - -void __RPC_STUB IDvdControl2_AcceptParentalLevelChange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SetOption_Proxy( - IDvdControl2 * This, - /* [in] */ DVD_OPTION_FLAG flag, - /* [in] */ BOOL fState); - - -void __RPC_STUB IDvdControl2_SetOption_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SetState_Proxy( - IDvdControl2 * This, - /* [in] */ IDvdState *pState, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_SetState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_PlayPeriodInTitleAutoStop_Proxy( - IDvdControl2 * This, - /* [in] */ ULONG ulTitle, - /* [in] */ DVD_HMSF_TIMECODE *pStartTime, - /* [in] */ DVD_HMSF_TIMECODE *pEndTime, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_PlayPeriodInTitleAutoStop_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SetGPRM_Proxy( - IDvdControl2 * This, - /* [in] */ ULONG ulIndex, - /* [in] */ WORD wValue, - /* [in] */ DWORD dwFlags, - /* [out] */ IDvdCmd **ppCmd); - - -void __RPC_STUB IDvdControl2_SetGPRM_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SelectDefaultMenuLanguage_Proxy( - IDvdControl2 * This, - /* [in] */ LCID Language); - - -void __RPC_STUB IDvdControl2_SelectDefaultMenuLanguage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SelectDefaultAudioLanguage_Proxy( - IDvdControl2 * This, - /* [in] */ LCID Language, - /* [in] */ DVD_AUDIO_LANG_EXT audioExtension); - - -void __RPC_STUB IDvdControl2_SelectDefaultAudioLanguage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdControl2_SelectDefaultSubpictureLanguage_Proxy( - IDvdControl2 * This, - /* [in] */ LCID Language, - /* [in] */ DVD_SUBPICTURE_LANG_EXT subpictureExtension); - - -void __RPC_STUB IDvdControl2_SelectDefaultSubpictureLanguage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDvdControl2_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0371 */ -/* [local] */ - - -enum DVD_TextStringType - { DVD_Struct_Volume = 0x1, - DVD_Struct_Title = 0x2, - DVD_Struct_ParentalID = 0x3, - DVD_Struct_PartOfTitle = 0x4, - DVD_Struct_Cell = 0x5, - DVD_Stream_Audio = 0x10, - DVD_Stream_Subpicture = 0x11, - DVD_Stream_Angle = 0x12, - DVD_Channel_Audio = 0x20, - DVD_General_Name = 0x30, - DVD_General_Comments = 0x31, - DVD_Title_Series = 0x38, - DVD_Title_Movie = 0x39, - DVD_Title_Video = 0x3a, - DVD_Title_Album = 0x3b, - DVD_Title_Song = 0x3c, - DVD_Title_Other = 0x3f, - DVD_Title_Sub_Series = 0x40, - DVD_Title_Sub_Movie = 0x41, - DVD_Title_Sub_Video = 0x42, - DVD_Title_Sub_Album = 0x43, - DVD_Title_Sub_Song = 0x44, - DVD_Title_Sub_Other = 0x47, - DVD_Title_Orig_Series = 0x48, - DVD_Title_Orig_Movie = 0x49, - DVD_Title_Orig_Video = 0x4a, - DVD_Title_Orig_Album = 0x4b, - DVD_Title_Orig_Song = 0x4c, - DVD_Title_Orig_Other = 0x4f, - DVD_Other_Scene = 0x50, - DVD_Other_Cut = 0x51, - DVD_Other_Take = 0x52 - } ; - -enum DVD_TextCharSet - { DVD_CharSet_Unicode = 0, - DVD_CharSet_ISO646 = 1, - DVD_CharSet_JIS_Roman_Kanji = 2, - DVD_CharSet_ISO8859_1 = 3, - DVD_CharSet_ShiftJIS_Kanji_Roman_Katakana = 4 - } ; -#define DVD_TITLE_MENU 0x000 -#define DVD_STREAM_DATA_CURRENT 0x800 -#define DVD_STREAM_DATA_VMGM 0x400 -#define DVD_STREAM_DATA_VTSM 0x401 -#define DVD_DEFAULT_AUDIO_STREAM 0x0f -typedef struct tagDVD_DECODER_CAPS - { - DWORD dwSize; - DWORD dwAudioCaps; - double dFwdMaxRateVideo; - double dFwdMaxRateAudio; - double dFwdMaxRateSP; - double dBwdMaxRateVideo; - double dBwdMaxRateAudio; - double dBwdMaxRateSP; - DWORD dwRes1; - DWORD dwRes2; - DWORD dwRes3; - DWORD dwRes4; - } DVD_DECODER_CAPS; - -#define DVD_AUDIO_CAPS_AC3 0x00000001 -#define DVD_AUDIO_CAPS_MPEG2 0x00000002 -#define DVD_AUDIO_CAPS_LPCM 0x00000004 -#define DVD_AUDIO_CAPS_DTS 0x00000008 -#define DVD_AUDIO_CAPS_SDDS 0x00000010 - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0371_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0371_v0_0_s_ifspec; - -#ifndef __IDvdInfo2_INTERFACE_DEFINED__ -#define __IDvdInfo2_INTERFACE_DEFINED__ - -/* interface IDvdInfo2 */ -/* [unique][uuid][object] */ - - -EXTERN_C const IID IID_IDvdInfo2; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("34151510-EEC0-11D2-8201-00A0C9D74842") - IDvdInfo2 : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetCurrentDomain( - /* [out] */ DVD_DOMAIN *pDomain) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentLocation( - /* [out] */ DVD_PLAYBACK_LOCATION2 *pLocation) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTotalTitleTime( - /* [out] */ DVD_HMSF_TIMECODE *pTotalTime, - /* [out] */ ULONG *ulTimeCodeFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentButton( - /* [out] */ ULONG *pulButtonsAvailable, - /* [out] */ ULONG *pulCurrentButton) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentAngle( - /* [out] */ ULONG *pulAnglesAvailable, - /* [out] */ ULONG *pulCurrentAngle) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentAudio( - /* [out] */ ULONG *pulStreamsAvailable, - /* [out] */ ULONG *pulCurrentStream) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentSubpicture( - /* [out] */ ULONG *pulStreamsAvailable, - /* [out] */ ULONG *pulCurrentStream, - /* [out] */ BOOL *pbIsDisabled) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentUOPS( - /* [out] */ ULONG *pulUOPs) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAllSPRMs( - /* [out] */ SPRMARRAY *pRegisterArray) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAllGPRMs( - /* [out] */ GPRMARRAY *pRegisterArray) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAudioLanguage( - /* [in] */ ULONG ulStream, - /* [out] */ LCID *pLanguage) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSubpictureLanguage( - /* [in] */ ULONG ulStream, - /* [out] */ LCID *pLanguage) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTitleAttributes( - /* [in] */ ULONG ulTitle, - /* [out] */ DVD_MenuAttributes *pMenu, - /* [out] */ DVD_TitleAttributes *pTitle) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetVMGAttributes( - /* [out] */ DVD_MenuAttributes *pATR) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentVideoAttributes( - /* [out] */ DVD_VideoAttributes *pATR) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAudioAttributes( - /* [in] */ ULONG ulStream, - /* [out] */ DVD_AudioAttributes *pATR) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetKaraokeAttributes( - /* [in] */ ULONG ulStream, - /* [out] */ DVD_KaraokeAttributes *pAttributes) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSubpictureAttributes( - /* [in] */ ULONG ulStream, - /* [out] */ DVD_SubpictureAttributes *pATR) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDVDVolumeInfo( - /* [out] */ ULONG *pulNumOfVolumes, - /* [out] */ ULONG *pulVolume, - /* [out] */ DVD_DISC_SIDE *pSide, - /* [out] */ ULONG *pulNumOfTitles) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDVDTextNumberOfLanguages( - /* [out] */ ULONG *pulNumOfLangs) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDVDTextLanguageInfo( - /* [in] */ ULONG ulLangIndex, - /* [out] */ ULONG *pulNumOfStrings, - /* [out] */ LCID *pLangCode, - /* [out] */ enum DVD_TextCharSet *pbCharacterSet) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDVDTextStringAsNative( - /* [in] */ ULONG ulLangIndex, - /* [in] */ ULONG ulStringIndex, - /* [out] */ BYTE *pbBuffer, - /* [in] */ ULONG ulMaxBufferSize, - /* [out] */ ULONG *pulActualSize, - /* [out] */ enum DVD_TextStringType *pType) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDVDTextStringAsUnicode( - /* [in] */ ULONG ulLangIndex, - /* [in] */ ULONG ulStringIndex, - /* [out] */ WCHAR *pchwBuffer, - /* [in] */ ULONG ulMaxBufferSize, - /* [out] */ ULONG *pulActualSize, - /* [out] */ enum DVD_TextStringType *pType) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetPlayerParentalLevel( - /* [out] */ ULONG *pulParentalLevel, - /* [out] */ BYTE pbCountryCode[ 2 ]) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNumberOfChapters( - /* [in] */ ULONG ulTitle, - /* [out] */ ULONG *pulNumOfChapters) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTitleParentalLevels( - /* [in] */ ULONG ulTitle, - /* [out] */ ULONG *pulParentalLevels) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDVDDirectory( - /* [size_is][out] */ LPWSTR pszwPath, - /* [in] */ ULONG ulMaxSize, - /* [out] */ ULONG *pulActualSize) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsAudioStreamEnabled( - /* [in] */ ULONG ulStreamNum, - /* [out] */ BOOL *pbEnabled) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDiscID( - /* [in] */ LPCWSTR pszwPath, - /* [out] */ ULONGLONG *pullDiscID) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetState( - /* [out] */ IDvdState **pStateData) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMenuLanguages( - /* [out] */ LCID *pLanguages, - /* [in] */ ULONG ulMaxLanguages, - /* [out] */ ULONG *pulActualLanguages) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetButtonAtPosition( - /* [in] */ POINT point, - /* [out] */ ULONG *pulButtonIndex) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCmdFromEvent( - /* [in] */ LONG_PTR lParam1, - /* [out] */ IDvdCmd **pCmdObj) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDefaultMenuLanguage( - /* [out] */ LCID *pLanguage) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDefaultAudioLanguage( - /* [out] */ LCID *pLanguage, - /* [out] */ DVD_AUDIO_LANG_EXT *pAudioExtension) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDefaultSubpictureLanguage( - /* [out] */ LCID *pLanguage, - /* [out] */ DVD_SUBPICTURE_LANG_EXT *pSubpictureExtension) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDecoderCaps( - /* [out] */ DVD_DECODER_CAPS *pCaps) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetButtonRect( - /* [in] */ ULONG ulButton, - /* [out] */ RECT *pRect) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsSubpictureStreamEnabled( - /* [in] */ ULONG ulStreamNum, - /* [out] */ BOOL *pbEnabled) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDvdInfo2Vtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDvdInfo2 * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDvdInfo2 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDvdInfo2 * This); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentDomain )( - IDvdInfo2 * This, - /* [out] */ DVD_DOMAIN *pDomain); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentLocation )( - IDvdInfo2 * This, - /* [out] */ DVD_PLAYBACK_LOCATION2 *pLocation); - - HRESULT ( STDMETHODCALLTYPE *GetTotalTitleTime )( - IDvdInfo2 * This, - /* [out] */ DVD_HMSF_TIMECODE *pTotalTime, - /* [out] */ ULONG *ulTimeCodeFlags); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentButton )( - IDvdInfo2 * This, - /* [out] */ ULONG *pulButtonsAvailable, - /* [out] */ ULONG *pulCurrentButton); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentAngle )( - IDvdInfo2 * This, - /* [out] */ ULONG *pulAnglesAvailable, - /* [out] */ ULONG *pulCurrentAngle); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentAudio )( - IDvdInfo2 * This, - /* [out] */ ULONG *pulStreamsAvailable, - /* [out] */ ULONG *pulCurrentStream); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentSubpicture )( - IDvdInfo2 * This, - /* [out] */ ULONG *pulStreamsAvailable, - /* [out] */ ULONG *pulCurrentStream, - /* [out] */ BOOL *pbIsDisabled); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentUOPS )( - IDvdInfo2 * This, - /* [out] */ ULONG *pulUOPs); - - HRESULT ( STDMETHODCALLTYPE *GetAllSPRMs )( - IDvdInfo2 * This, - /* [out] */ SPRMARRAY *pRegisterArray); - - HRESULT ( STDMETHODCALLTYPE *GetAllGPRMs )( - IDvdInfo2 * This, - /* [out] */ GPRMARRAY *pRegisterArray); - - HRESULT ( STDMETHODCALLTYPE *GetAudioLanguage )( - IDvdInfo2 * This, - /* [in] */ ULONG ulStream, - /* [out] */ LCID *pLanguage); - - HRESULT ( STDMETHODCALLTYPE *GetSubpictureLanguage )( - IDvdInfo2 * This, - /* [in] */ ULONG ulStream, - /* [out] */ LCID *pLanguage); - - HRESULT ( STDMETHODCALLTYPE *GetTitleAttributes )( - IDvdInfo2 * This, - /* [in] */ ULONG ulTitle, - /* [out] */ DVD_MenuAttributes *pMenu, - /* [out] */ DVD_TitleAttributes *pTitle); - - HRESULT ( STDMETHODCALLTYPE *GetVMGAttributes )( - IDvdInfo2 * This, - /* [out] */ DVD_MenuAttributes *pATR); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentVideoAttributes )( - IDvdInfo2 * This, - /* [out] */ DVD_VideoAttributes *pATR); - - HRESULT ( STDMETHODCALLTYPE *GetAudioAttributes )( - IDvdInfo2 * This, - /* [in] */ ULONG ulStream, - /* [out] */ DVD_AudioAttributes *pATR); - - HRESULT ( STDMETHODCALLTYPE *GetKaraokeAttributes )( - IDvdInfo2 * This, - /* [in] */ ULONG ulStream, - /* [out] */ DVD_KaraokeAttributes *pAttributes); - - HRESULT ( STDMETHODCALLTYPE *GetSubpictureAttributes )( - IDvdInfo2 * This, - /* [in] */ ULONG ulStream, - /* [out] */ DVD_SubpictureAttributes *pATR); - - HRESULT ( STDMETHODCALLTYPE *GetDVDVolumeInfo )( - IDvdInfo2 * This, - /* [out] */ ULONG *pulNumOfVolumes, - /* [out] */ ULONG *pulVolume, - /* [out] */ DVD_DISC_SIDE *pSide, - /* [out] */ ULONG *pulNumOfTitles); - - HRESULT ( STDMETHODCALLTYPE *GetDVDTextNumberOfLanguages )( - IDvdInfo2 * This, - /* [out] */ ULONG *pulNumOfLangs); - - HRESULT ( STDMETHODCALLTYPE *GetDVDTextLanguageInfo )( - IDvdInfo2 * This, - /* [in] */ ULONG ulLangIndex, - /* [out] */ ULONG *pulNumOfStrings, - /* [out] */ LCID *pLangCode, - /* [out] */ enum DVD_TextCharSet *pbCharacterSet); - - HRESULT ( STDMETHODCALLTYPE *GetDVDTextStringAsNative )( - IDvdInfo2 * This, - /* [in] */ ULONG ulLangIndex, - /* [in] */ ULONG ulStringIndex, - /* [out] */ BYTE *pbBuffer, - /* [in] */ ULONG ulMaxBufferSize, - /* [out] */ ULONG *pulActualSize, - /* [out] */ enum DVD_TextStringType *pType); - - HRESULT ( STDMETHODCALLTYPE *GetDVDTextStringAsUnicode )( - IDvdInfo2 * This, - /* [in] */ ULONG ulLangIndex, - /* [in] */ ULONG ulStringIndex, - /* [out] */ WCHAR *pchwBuffer, - /* [in] */ ULONG ulMaxBufferSize, - /* [out] */ ULONG *pulActualSize, - /* [out] */ enum DVD_TextStringType *pType); - - HRESULT ( STDMETHODCALLTYPE *GetPlayerParentalLevel )( - IDvdInfo2 * This, - /* [out] */ ULONG *pulParentalLevel, - /* [out] */ BYTE pbCountryCode[ 2 ]); - - HRESULT ( STDMETHODCALLTYPE *GetNumberOfChapters )( - IDvdInfo2 * This, - /* [in] */ ULONG ulTitle, - /* [out] */ ULONG *pulNumOfChapters); - - HRESULT ( STDMETHODCALLTYPE *GetTitleParentalLevels )( - IDvdInfo2 * This, - /* [in] */ ULONG ulTitle, - /* [out] */ ULONG *pulParentalLevels); - - HRESULT ( STDMETHODCALLTYPE *GetDVDDirectory )( - IDvdInfo2 * This, - /* [size_is][out] */ LPWSTR pszwPath, - /* [in] */ ULONG ulMaxSize, - /* [out] */ ULONG *pulActualSize); - - HRESULT ( STDMETHODCALLTYPE *IsAudioStreamEnabled )( - IDvdInfo2 * This, - /* [in] */ ULONG ulStreamNum, - /* [out] */ BOOL *pbEnabled); - - HRESULT ( STDMETHODCALLTYPE *GetDiscID )( - IDvdInfo2 * This, - /* [in] */ LPCWSTR pszwPath, - /* [out] */ ULONGLONG *pullDiscID); - - HRESULT ( STDMETHODCALLTYPE *GetState )( - IDvdInfo2 * This, - /* [out] */ IDvdState **pStateData); - - HRESULT ( STDMETHODCALLTYPE *GetMenuLanguages )( - IDvdInfo2 * This, - /* [out] */ LCID *pLanguages, - /* [in] */ ULONG ulMaxLanguages, - /* [out] */ ULONG *pulActualLanguages); - - HRESULT ( STDMETHODCALLTYPE *GetButtonAtPosition )( - IDvdInfo2 * This, - /* [in] */ POINT point, - /* [out] */ ULONG *pulButtonIndex); - - HRESULT ( STDMETHODCALLTYPE *GetCmdFromEvent )( - IDvdInfo2 * This, - /* [in] */ LONG_PTR lParam1, - /* [out] */ IDvdCmd **pCmdObj); - - HRESULT ( STDMETHODCALLTYPE *GetDefaultMenuLanguage )( - IDvdInfo2 * This, - /* [out] */ LCID *pLanguage); - - HRESULT ( STDMETHODCALLTYPE *GetDefaultAudioLanguage )( - IDvdInfo2 * This, - /* [out] */ LCID *pLanguage, - /* [out] */ DVD_AUDIO_LANG_EXT *pAudioExtension); - - HRESULT ( STDMETHODCALLTYPE *GetDefaultSubpictureLanguage )( - IDvdInfo2 * This, - /* [out] */ LCID *pLanguage, - /* [out] */ DVD_SUBPICTURE_LANG_EXT *pSubpictureExtension); - - HRESULT ( STDMETHODCALLTYPE *GetDecoderCaps )( - IDvdInfo2 * This, - /* [out] */ DVD_DECODER_CAPS *pCaps); - - HRESULT ( STDMETHODCALLTYPE *GetButtonRect )( - IDvdInfo2 * This, - /* [in] */ ULONG ulButton, - /* [out] */ RECT *pRect); - - HRESULT ( STDMETHODCALLTYPE *IsSubpictureStreamEnabled )( - IDvdInfo2 * This, - /* [in] */ ULONG ulStreamNum, - /* [out] */ BOOL *pbEnabled); - - END_INTERFACE - } IDvdInfo2Vtbl; - - interface IDvdInfo2 - { - CONST_VTBL struct IDvdInfo2Vtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDvdInfo2_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDvdInfo2_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDvdInfo2_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDvdInfo2_GetCurrentDomain(This,pDomain) \ - (This)->lpVtbl -> GetCurrentDomain(This,pDomain) - -#define IDvdInfo2_GetCurrentLocation(This,pLocation) \ - (This)->lpVtbl -> GetCurrentLocation(This,pLocation) - -#define IDvdInfo2_GetTotalTitleTime(This,pTotalTime,ulTimeCodeFlags) \ - (This)->lpVtbl -> GetTotalTitleTime(This,pTotalTime,ulTimeCodeFlags) - -#define IDvdInfo2_GetCurrentButton(This,pulButtonsAvailable,pulCurrentButton) \ - (This)->lpVtbl -> GetCurrentButton(This,pulButtonsAvailable,pulCurrentButton) - -#define IDvdInfo2_GetCurrentAngle(This,pulAnglesAvailable,pulCurrentAngle) \ - (This)->lpVtbl -> GetCurrentAngle(This,pulAnglesAvailable,pulCurrentAngle) - -#define IDvdInfo2_GetCurrentAudio(This,pulStreamsAvailable,pulCurrentStream) \ - (This)->lpVtbl -> GetCurrentAudio(This,pulStreamsAvailable,pulCurrentStream) - -#define IDvdInfo2_GetCurrentSubpicture(This,pulStreamsAvailable,pulCurrentStream,pbIsDisabled) \ - (This)->lpVtbl -> GetCurrentSubpicture(This,pulStreamsAvailable,pulCurrentStream,pbIsDisabled) - -#define IDvdInfo2_GetCurrentUOPS(This,pulUOPs) \ - (This)->lpVtbl -> GetCurrentUOPS(This,pulUOPs) - -#define IDvdInfo2_GetAllSPRMs(This,pRegisterArray) \ - (This)->lpVtbl -> GetAllSPRMs(This,pRegisterArray) - -#define IDvdInfo2_GetAllGPRMs(This,pRegisterArray) \ - (This)->lpVtbl -> GetAllGPRMs(This,pRegisterArray) - -#define IDvdInfo2_GetAudioLanguage(This,ulStream,pLanguage) \ - (This)->lpVtbl -> GetAudioLanguage(This,ulStream,pLanguage) - -#define IDvdInfo2_GetSubpictureLanguage(This,ulStream,pLanguage) \ - (This)->lpVtbl -> GetSubpictureLanguage(This,ulStream,pLanguage) - -#define IDvdInfo2_GetTitleAttributes(This,ulTitle,pMenu,pTitle) \ - (This)->lpVtbl -> GetTitleAttributes(This,ulTitle,pMenu,pTitle) - -#define IDvdInfo2_GetVMGAttributes(This,pATR) \ - (This)->lpVtbl -> GetVMGAttributes(This,pATR) - -#define IDvdInfo2_GetCurrentVideoAttributes(This,pATR) \ - (This)->lpVtbl -> GetCurrentVideoAttributes(This,pATR) - -#define IDvdInfo2_GetAudioAttributes(This,ulStream,pATR) \ - (This)->lpVtbl -> GetAudioAttributes(This,ulStream,pATR) - -#define IDvdInfo2_GetKaraokeAttributes(This,ulStream,pAttributes) \ - (This)->lpVtbl -> GetKaraokeAttributes(This,ulStream,pAttributes) - -#define IDvdInfo2_GetSubpictureAttributes(This,ulStream,pATR) \ - (This)->lpVtbl -> GetSubpictureAttributes(This,ulStream,pATR) - -#define IDvdInfo2_GetDVDVolumeInfo(This,pulNumOfVolumes,pulVolume,pSide,pulNumOfTitles) \ - (This)->lpVtbl -> GetDVDVolumeInfo(This,pulNumOfVolumes,pulVolume,pSide,pulNumOfTitles) - -#define IDvdInfo2_GetDVDTextNumberOfLanguages(This,pulNumOfLangs) \ - (This)->lpVtbl -> GetDVDTextNumberOfLanguages(This,pulNumOfLangs) - -#define IDvdInfo2_GetDVDTextLanguageInfo(This,ulLangIndex,pulNumOfStrings,pLangCode,pbCharacterSet) \ - (This)->lpVtbl -> GetDVDTextLanguageInfo(This,ulLangIndex,pulNumOfStrings,pLangCode,pbCharacterSet) - -#define IDvdInfo2_GetDVDTextStringAsNative(This,ulLangIndex,ulStringIndex,pbBuffer,ulMaxBufferSize,pulActualSize,pType) \ - (This)->lpVtbl -> GetDVDTextStringAsNative(This,ulLangIndex,ulStringIndex,pbBuffer,ulMaxBufferSize,pulActualSize,pType) - -#define IDvdInfo2_GetDVDTextStringAsUnicode(This,ulLangIndex,ulStringIndex,pchwBuffer,ulMaxBufferSize,pulActualSize,pType) \ - (This)->lpVtbl -> GetDVDTextStringAsUnicode(This,ulLangIndex,ulStringIndex,pchwBuffer,ulMaxBufferSize,pulActualSize,pType) - -#define IDvdInfo2_GetPlayerParentalLevel(This,pulParentalLevel,pbCountryCode) \ - (This)->lpVtbl -> GetPlayerParentalLevel(This,pulParentalLevel,pbCountryCode) - -#define IDvdInfo2_GetNumberOfChapters(This,ulTitle,pulNumOfChapters) \ - (This)->lpVtbl -> GetNumberOfChapters(This,ulTitle,pulNumOfChapters) - -#define IDvdInfo2_GetTitleParentalLevels(This,ulTitle,pulParentalLevels) \ - (This)->lpVtbl -> GetTitleParentalLevels(This,ulTitle,pulParentalLevels) - -#define IDvdInfo2_GetDVDDirectory(This,pszwPath,ulMaxSize,pulActualSize) \ - (This)->lpVtbl -> GetDVDDirectory(This,pszwPath,ulMaxSize,pulActualSize) - -#define IDvdInfo2_IsAudioStreamEnabled(This,ulStreamNum,pbEnabled) \ - (This)->lpVtbl -> IsAudioStreamEnabled(This,ulStreamNum,pbEnabled) - -#define IDvdInfo2_GetDiscID(This,pszwPath,pullDiscID) \ - (This)->lpVtbl -> GetDiscID(This,pszwPath,pullDiscID) - -#define IDvdInfo2_GetState(This,pStateData) \ - (This)->lpVtbl -> GetState(This,pStateData) - -#define IDvdInfo2_GetMenuLanguages(This,pLanguages,ulMaxLanguages,pulActualLanguages) \ - (This)->lpVtbl -> GetMenuLanguages(This,pLanguages,ulMaxLanguages,pulActualLanguages) - -#define IDvdInfo2_GetButtonAtPosition(This,point,pulButtonIndex) \ - (This)->lpVtbl -> GetButtonAtPosition(This,point,pulButtonIndex) - -#define IDvdInfo2_GetCmdFromEvent(This,lParam1,pCmdObj) \ - (This)->lpVtbl -> GetCmdFromEvent(This,lParam1,pCmdObj) - -#define IDvdInfo2_GetDefaultMenuLanguage(This,pLanguage) \ - (This)->lpVtbl -> GetDefaultMenuLanguage(This,pLanguage) - -#define IDvdInfo2_GetDefaultAudioLanguage(This,pLanguage,pAudioExtension) \ - (This)->lpVtbl -> GetDefaultAudioLanguage(This,pLanguage,pAudioExtension) - -#define IDvdInfo2_GetDefaultSubpictureLanguage(This,pLanguage,pSubpictureExtension) \ - (This)->lpVtbl -> GetDefaultSubpictureLanguage(This,pLanguage,pSubpictureExtension) - -#define IDvdInfo2_GetDecoderCaps(This,pCaps) \ - (This)->lpVtbl -> GetDecoderCaps(This,pCaps) - -#define IDvdInfo2_GetButtonRect(This,ulButton,pRect) \ - (This)->lpVtbl -> GetButtonRect(This,ulButton,pRect) - -#define IDvdInfo2_IsSubpictureStreamEnabled(This,ulStreamNum,pbEnabled) \ - (This)->lpVtbl -> IsSubpictureStreamEnabled(This,ulStreamNum,pbEnabled) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetCurrentDomain_Proxy( - IDvdInfo2 * This, - /* [out] */ DVD_DOMAIN *pDomain); - - -void __RPC_STUB IDvdInfo2_GetCurrentDomain_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetCurrentLocation_Proxy( - IDvdInfo2 * This, - /* [out] */ DVD_PLAYBACK_LOCATION2 *pLocation); - - -void __RPC_STUB IDvdInfo2_GetCurrentLocation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetTotalTitleTime_Proxy( - IDvdInfo2 * This, - /* [out] */ DVD_HMSF_TIMECODE *pTotalTime, - /* [out] */ ULONG *ulTimeCodeFlags); - - -void __RPC_STUB IDvdInfo2_GetTotalTitleTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetCurrentButton_Proxy( - IDvdInfo2 * This, - /* [out] */ ULONG *pulButtonsAvailable, - /* [out] */ ULONG *pulCurrentButton); - - -void __RPC_STUB IDvdInfo2_GetCurrentButton_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetCurrentAngle_Proxy( - IDvdInfo2 * This, - /* [out] */ ULONG *pulAnglesAvailable, - /* [out] */ ULONG *pulCurrentAngle); - - -void __RPC_STUB IDvdInfo2_GetCurrentAngle_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetCurrentAudio_Proxy( - IDvdInfo2 * This, - /* [out] */ ULONG *pulStreamsAvailable, - /* [out] */ ULONG *pulCurrentStream); - - -void __RPC_STUB IDvdInfo2_GetCurrentAudio_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetCurrentSubpicture_Proxy( - IDvdInfo2 * This, - /* [out] */ ULONG *pulStreamsAvailable, - /* [out] */ ULONG *pulCurrentStream, - /* [out] */ BOOL *pbIsDisabled); - - -void __RPC_STUB IDvdInfo2_GetCurrentSubpicture_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetCurrentUOPS_Proxy( - IDvdInfo2 * This, - /* [out] */ ULONG *pulUOPs); - - -void __RPC_STUB IDvdInfo2_GetCurrentUOPS_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetAllSPRMs_Proxy( - IDvdInfo2 * This, - /* [out] */ SPRMARRAY *pRegisterArray); - - -void __RPC_STUB IDvdInfo2_GetAllSPRMs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetAllGPRMs_Proxy( - IDvdInfo2 * This, - /* [out] */ GPRMARRAY *pRegisterArray); - - -void __RPC_STUB IDvdInfo2_GetAllGPRMs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetAudioLanguage_Proxy( - IDvdInfo2 * This, - /* [in] */ ULONG ulStream, - /* [out] */ LCID *pLanguage); - - -void __RPC_STUB IDvdInfo2_GetAudioLanguage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetSubpictureLanguage_Proxy( - IDvdInfo2 * This, - /* [in] */ ULONG ulStream, - /* [out] */ LCID *pLanguage); - - -void __RPC_STUB IDvdInfo2_GetSubpictureLanguage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetTitleAttributes_Proxy( - IDvdInfo2 * This, - /* [in] */ ULONG ulTitle, - /* [out] */ DVD_MenuAttributes *pMenu, - /* [out] */ DVD_TitleAttributes *pTitle); - - -void __RPC_STUB IDvdInfo2_GetTitleAttributes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetVMGAttributes_Proxy( - IDvdInfo2 * This, - /* [out] */ DVD_MenuAttributes *pATR); - - -void __RPC_STUB IDvdInfo2_GetVMGAttributes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetCurrentVideoAttributes_Proxy( - IDvdInfo2 * This, - /* [out] */ DVD_VideoAttributes *pATR); - - -void __RPC_STUB IDvdInfo2_GetCurrentVideoAttributes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetAudioAttributes_Proxy( - IDvdInfo2 * This, - /* [in] */ ULONG ulStream, - /* [out] */ DVD_AudioAttributes *pATR); - - -void __RPC_STUB IDvdInfo2_GetAudioAttributes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetKaraokeAttributes_Proxy( - IDvdInfo2 * This, - /* [in] */ ULONG ulStream, - /* [out] */ DVD_KaraokeAttributes *pAttributes); - - -void __RPC_STUB IDvdInfo2_GetKaraokeAttributes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetSubpictureAttributes_Proxy( - IDvdInfo2 * This, - /* [in] */ ULONG ulStream, - /* [out] */ DVD_SubpictureAttributes *pATR); - - -void __RPC_STUB IDvdInfo2_GetSubpictureAttributes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetDVDVolumeInfo_Proxy( - IDvdInfo2 * This, - /* [out] */ ULONG *pulNumOfVolumes, - /* [out] */ ULONG *pulVolume, - /* [out] */ DVD_DISC_SIDE *pSide, - /* [out] */ ULONG *pulNumOfTitles); - - -void __RPC_STUB IDvdInfo2_GetDVDVolumeInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetDVDTextNumberOfLanguages_Proxy( - IDvdInfo2 * This, - /* [out] */ ULONG *pulNumOfLangs); - - -void __RPC_STUB IDvdInfo2_GetDVDTextNumberOfLanguages_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetDVDTextLanguageInfo_Proxy( - IDvdInfo2 * This, - /* [in] */ ULONG ulLangIndex, - /* [out] */ ULONG *pulNumOfStrings, - /* [out] */ LCID *pLangCode, - /* [out] */ enum DVD_TextCharSet *pbCharacterSet); - - -void __RPC_STUB IDvdInfo2_GetDVDTextLanguageInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetDVDTextStringAsNative_Proxy( - IDvdInfo2 * This, - /* [in] */ ULONG ulLangIndex, - /* [in] */ ULONG ulStringIndex, - /* [out] */ BYTE *pbBuffer, - /* [in] */ ULONG ulMaxBufferSize, - /* [out] */ ULONG *pulActualSize, - /* [out] */ enum DVD_TextStringType *pType); - - -void __RPC_STUB IDvdInfo2_GetDVDTextStringAsNative_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetDVDTextStringAsUnicode_Proxy( - IDvdInfo2 * This, - /* [in] */ ULONG ulLangIndex, - /* [in] */ ULONG ulStringIndex, - /* [out] */ WCHAR *pchwBuffer, - /* [in] */ ULONG ulMaxBufferSize, - /* [out] */ ULONG *pulActualSize, - /* [out] */ enum DVD_TextStringType *pType); - - -void __RPC_STUB IDvdInfo2_GetDVDTextStringAsUnicode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetPlayerParentalLevel_Proxy( - IDvdInfo2 * This, - /* [out] */ ULONG *pulParentalLevel, - /* [out] */ BYTE pbCountryCode[ 2 ]); - - -void __RPC_STUB IDvdInfo2_GetPlayerParentalLevel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetNumberOfChapters_Proxy( - IDvdInfo2 * This, - /* [in] */ ULONG ulTitle, - /* [out] */ ULONG *pulNumOfChapters); - - -void __RPC_STUB IDvdInfo2_GetNumberOfChapters_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetTitleParentalLevels_Proxy( - IDvdInfo2 * This, - /* [in] */ ULONG ulTitle, - /* [out] */ ULONG *pulParentalLevels); - - -void __RPC_STUB IDvdInfo2_GetTitleParentalLevels_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetDVDDirectory_Proxy( - IDvdInfo2 * This, - /* [size_is][out] */ LPWSTR pszwPath, - /* [in] */ ULONG ulMaxSize, - /* [out] */ ULONG *pulActualSize); - - -void __RPC_STUB IDvdInfo2_GetDVDDirectory_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_IsAudioStreamEnabled_Proxy( - IDvdInfo2 * This, - /* [in] */ ULONG ulStreamNum, - /* [out] */ BOOL *pbEnabled); - - -void __RPC_STUB IDvdInfo2_IsAudioStreamEnabled_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetDiscID_Proxy( - IDvdInfo2 * This, - /* [in] */ LPCWSTR pszwPath, - /* [out] */ ULONGLONG *pullDiscID); - - -void __RPC_STUB IDvdInfo2_GetDiscID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetState_Proxy( - IDvdInfo2 * This, - /* [out] */ IDvdState **pStateData); - - -void __RPC_STUB IDvdInfo2_GetState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetMenuLanguages_Proxy( - IDvdInfo2 * This, - /* [out] */ LCID *pLanguages, - /* [in] */ ULONG ulMaxLanguages, - /* [out] */ ULONG *pulActualLanguages); - - -void __RPC_STUB IDvdInfo2_GetMenuLanguages_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetButtonAtPosition_Proxy( - IDvdInfo2 * This, - /* [in] */ POINT point, - /* [out] */ ULONG *pulButtonIndex); - - -void __RPC_STUB IDvdInfo2_GetButtonAtPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetCmdFromEvent_Proxy( - IDvdInfo2 * This, - /* [in] */ LONG_PTR lParam1, - /* [out] */ IDvdCmd **pCmdObj); - - -void __RPC_STUB IDvdInfo2_GetCmdFromEvent_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetDefaultMenuLanguage_Proxy( - IDvdInfo2 * This, - /* [out] */ LCID *pLanguage); - - -void __RPC_STUB IDvdInfo2_GetDefaultMenuLanguage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetDefaultAudioLanguage_Proxy( - IDvdInfo2 * This, - /* [out] */ LCID *pLanguage, - /* [out] */ DVD_AUDIO_LANG_EXT *pAudioExtension); - - -void __RPC_STUB IDvdInfo2_GetDefaultAudioLanguage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetDefaultSubpictureLanguage_Proxy( - IDvdInfo2 * This, - /* [out] */ LCID *pLanguage, - /* [out] */ DVD_SUBPICTURE_LANG_EXT *pSubpictureExtension); - - -void __RPC_STUB IDvdInfo2_GetDefaultSubpictureLanguage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetDecoderCaps_Proxy( - IDvdInfo2 * This, - /* [out] */ DVD_DECODER_CAPS *pCaps); - - -void __RPC_STUB IDvdInfo2_GetDecoderCaps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_GetButtonRect_Proxy( - IDvdInfo2 * This, - /* [in] */ ULONG ulButton, - /* [out] */ RECT *pRect); - - -void __RPC_STUB IDvdInfo2_GetButtonRect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdInfo2_IsSubpictureStreamEnabled_Proxy( - IDvdInfo2 * This, - /* [in] */ ULONG ulStreamNum, - /* [out] */ BOOL *pbEnabled); - - -void __RPC_STUB IDvdInfo2_IsSubpictureStreamEnabled_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDvdInfo2_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0373 */ -/* [local] */ - -typedef -enum _AM_DVD_GRAPH_FLAGS - { AM_DVD_HWDEC_PREFER = 0x1, - AM_DVD_HWDEC_ONLY = 0x2, - AM_DVD_SWDEC_PREFER = 0x4, - AM_DVD_SWDEC_ONLY = 0x8, - AM_DVD_NOVPE = 0x100 - } AM_DVD_GRAPH_FLAGS; - -typedef -enum _AM_DVD_STREAM_FLAGS - { AM_DVD_STREAM_VIDEO = 0x1, - AM_DVD_STREAM_AUDIO = 0x2, - AM_DVD_STREAM_SUBPIC = 0x4 - } AM_DVD_STREAM_FLAGS; - -typedef /* [public][public] */ struct __MIDL___MIDL_itf_strmif_0373_0001 - { - HRESULT hrVPEStatus; - BOOL bDvdVolInvalid; - BOOL bDvdVolUnknown; - BOOL bNoLine21In; - BOOL bNoLine21Out; - int iNumStreams; - int iNumStreamsFailed; - DWORD dwFailedStreamsFlag; - } AM_DVD_RENDERSTATUS; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0373_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0373_v0_0_s_ifspec; - -#ifndef __IDvdGraphBuilder_INTERFACE_DEFINED__ -#define __IDvdGraphBuilder_INTERFACE_DEFINED__ - -/* interface IDvdGraphBuilder */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IDvdGraphBuilder; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("FCC152B6-F372-11d0-8E00-00C04FD7C08B") - IDvdGraphBuilder : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetFiltergraph( - /* [out] */ IGraphBuilder **ppGB) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDvdInterface( - /* [in] */ REFIID riid, - /* [out] */ void **ppvIF) = 0; - - virtual HRESULT STDMETHODCALLTYPE RenderDvdVideoVolume( - /* [in] */ LPCWSTR lpcwszPathName, - /* [in] */ DWORD dwFlags, - /* [out] */ AM_DVD_RENDERSTATUS *pStatus) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDvdGraphBuilderVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDvdGraphBuilder * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDvdGraphBuilder * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDvdGraphBuilder * This); - - HRESULT ( STDMETHODCALLTYPE *GetFiltergraph )( - IDvdGraphBuilder * This, - /* [out] */ IGraphBuilder **ppGB); - - HRESULT ( STDMETHODCALLTYPE *GetDvdInterface )( - IDvdGraphBuilder * This, - /* [in] */ REFIID riid, - /* [out] */ void **ppvIF); - - HRESULT ( STDMETHODCALLTYPE *RenderDvdVideoVolume )( - IDvdGraphBuilder * This, - /* [in] */ LPCWSTR lpcwszPathName, - /* [in] */ DWORD dwFlags, - /* [out] */ AM_DVD_RENDERSTATUS *pStatus); - - END_INTERFACE - } IDvdGraphBuilderVtbl; - - interface IDvdGraphBuilder - { - CONST_VTBL struct IDvdGraphBuilderVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDvdGraphBuilder_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDvdGraphBuilder_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDvdGraphBuilder_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDvdGraphBuilder_GetFiltergraph(This,ppGB) \ - (This)->lpVtbl -> GetFiltergraph(This,ppGB) - -#define IDvdGraphBuilder_GetDvdInterface(This,riid,ppvIF) \ - (This)->lpVtbl -> GetDvdInterface(This,riid,ppvIF) - -#define IDvdGraphBuilder_RenderDvdVideoVolume(This,lpcwszPathName,dwFlags,pStatus) \ - (This)->lpVtbl -> RenderDvdVideoVolume(This,lpcwszPathName,dwFlags,pStatus) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDvdGraphBuilder_GetFiltergraph_Proxy( - IDvdGraphBuilder * This, - /* [out] */ IGraphBuilder **ppGB); - - -void __RPC_STUB IDvdGraphBuilder_GetFiltergraph_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdGraphBuilder_GetDvdInterface_Proxy( - IDvdGraphBuilder * This, - /* [in] */ REFIID riid, - /* [out] */ void **ppvIF); - - -void __RPC_STUB IDvdGraphBuilder_GetDvdInterface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDvdGraphBuilder_RenderDvdVideoVolume_Proxy( - IDvdGraphBuilder * This, - /* [in] */ LPCWSTR lpcwszPathName, - /* [in] */ DWORD dwFlags, - /* [out] */ AM_DVD_RENDERSTATUS *pStatus); - - -void __RPC_STUB IDvdGraphBuilder_RenderDvdVideoVolume_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDvdGraphBuilder_INTERFACE_DEFINED__ */ - - -#ifndef __IDDrawExclModeVideo_INTERFACE_DEFINED__ -#define __IDDrawExclModeVideo_INTERFACE_DEFINED__ - -/* interface IDDrawExclModeVideo */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IDDrawExclModeVideo; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("153ACC21-D83B-11d1-82BF-00A0C9696C8F") - IDDrawExclModeVideo : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetDDrawObject( - /* [in] */ IDirectDraw *pDDrawObject) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDDrawObject( - /* [out] */ IDirectDraw **ppDDrawObject, - /* [out] */ BOOL *pbUsingExternal) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDDrawSurface( - /* [in] */ IDirectDrawSurface *pDDrawSurface) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDDrawSurface( - /* [out] */ IDirectDrawSurface **ppDDrawSurface, - /* [out] */ BOOL *pbUsingExternal) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDrawParameters( - /* [in] */ const RECT *prcSource, - /* [in] */ const RECT *prcTarget) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNativeVideoProps( - /* [out] */ DWORD *pdwVideoWidth, - /* [out] */ DWORD *pdwVideoHeight, - /* [out] */ DWORD *pdwPictAspectRatioX, - /* [out] */ DWORD *pdwPictAspectRatioY) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallbackInterface( - /* [in] */ IDDrawExclModeVideoCallback *pCallback, - /* [in] */ DWORD dwFlags) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDDrawExclModeVideoVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDDrawExclModeVideo * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDDrawExclModeVideo * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDDrawExclModeVideo * This); - - HRESULT ( STDMETHODCALLTYPE *SetDDrawObject )( - IDDrawExclModeVideo * This, - /* [in] */ IDirectDraw *pDDrawObject); - - HRESULT ( STDMETHODCALLTYPE *GetDDrawObject )( - IDDrawExclModeVideo * This, - /* [out] */ IDirectDraw **ppDDrawObject, - /* [out] */ BOOL *pbUsingExternal); - - HRESULT ( STDMETHODCALLTYPE *SetDDrawSurface )( - IDDrawExclModeVideo * This, - /* [in] */ IDirectDrawSurface *pDDrawSurface); - - HRESULT ( STDMETHODCALLTYPE *GetDDrawSurface )( - IDDrawExclModeVideo * This, - /* [out] */ IDirectDrawSurface **ppDDrawSurface, - /* [out] */ BOOL *pbUsingExternal); - - HRESULT ( STDMETHODCALLTYPE *SetDrawParameters )( - IDDrawExclModeVideo * This, - /* [in] */ const RECT *prcSource, - /* [in] */ const RECT *prcTarget); - - HRESULT ( STDMETHODCALLTYPE *GetNativeVideoProps )( - IDDrawExclModeVideo * This, - /* [out] */ DWORD *pdwVideoWidth, - /* [out] */ DWORD *pdwVideoHeight, - /* [out] */ DWORD *pdwPictAspectRatioX, - /* [out] */ DWORD *pdwPictAspectRatioY); - - HRESULT ( STDMETHODCALLTYPE *SetCallbackInterface )( - IDDrawExclModeVideo * This, - /* [in] */ IDDrawExclModeVideoCallback *pCallback, - /* [in] */ DWORD dwFlags); - - END_INTERFACE - } IDDrawExclModeVideoVtbl; - - interface IDDrawExclModeVideo - { - CONST_VTBL struct IDDrawExclModeVideoVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDDrawExclModeVideo_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDDrawExclModeVideo_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDDrawExclModeVideo_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDDrawExclModeVideo_SetDDrawObject(This,pDDrawObject) \ - (This)->lpVtbl -> SetDDrawObject(This,pDDrawObject) - -#define IDDrawExclModeVideo_GetDDrawObject(This,ppDDrawObject,pbUsingExternal) \ - (This)->lpVtbl -> GetDDrawObject(This,ppDDrawObject,pbUsingExternal) - -#define IDDrawExclModeVideo_SetDDrawSurface(This,pDDrawSurface) \ - (This)->lpVtbl -> SetDDrawSurface(This,pDDrawSurface) - -#define IDDrawExclModeVideo_GetDDrawSurface(This,ppDDrawSurface,pbUsingExternal) \ - (This)->lpVtbl -> GetDDrawSurface(This,ppDDrawSurface,pbUsingExternal) - -#define IDDrawExclModeVideo_SetDrawParameters(This,prcSource,prcTarget) \ - (This)->lpVtbl -> SetDrawParameters(This,prcSource,prcTarget) - -#define IDDrawExclModeVideo_GetNativeVideoProps(This,pdwVideoWidth,pdwVideoHeight,pdwPictAspectRatioX,pdwPictAspectRatioY) \ - (This)->lpVtbl -> GetNativeVideoProps(This,pdwVideoWidth,pdwVideoHeight,pdwPictAspectRatioX,pdwPictAspectRatioY) - -#define IDDrawExclModeVideo_SetCallbackInterface(This,pCallback,dwFlags) \ - (This)->lpVtbl -> SetCallbackInterface(This,pCallback,dwFlags) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDDrawExclModeVideo_SetDDrawObject_Proxy( - IDDrawExclModeVideo * This, - /* [in] */ IDirectDraw *pDDrawObject); - - -void __RPC_STUB IDDrawExclModeVideo_SetDDrawObject_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDDrawExclModeVideo_GetDDrawObject_Proxy( - IDDrawExclModeVideo * This, - /* [out] */ IDirectDraw **ppDDrawObject, - /* [out] */ BOOL *pbUsingExternal); - - -void __RPC_STUB IDDrawExclModeVideo_GetDDrawObject_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDDrawExclModeVideo_SetDDrawSurface_Proxy( - IDDrawExclModeVideo * This, - /* [in] */ IDirectDrawSurface *pDDrawSurface); - - -void __RPC_STUB IDDrawExclModeVideo_SetDDrawSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDDrawExclModeVideo_GetDDrawSurface_Proxy( - IDDrawExclModeVideo * This, - /* [out] */ IDirectDrawSurface **ppDDrawSurface, - /* [out] */ BOOL *pbUsingExternal); - - -void __RPC_STUB IDDrawExclModeVideo_GetDDrawSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDDrawExclModeVideo_SetDrawParameters_Proxy( - IDDrawExclModeVideo * This, - /* [in] */ const RECT *prcSource, - /* [in] */ const RECT *prcTarget); - - -void __RPC_STUB IDDrawExclModeVideo_SetDrawParameters_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDDrawExclModeVideo_GetNativeVideoProps_Proxy( - IDDrawExclModeVideo * This, - /* [out] */ DWORD *pdwVideoWidth, - /* [out] */ DWORD *pdwVideoHeight, - /* [out] */ DWORD *pdwPictAspectRatioX, - /* [out] */ DWORD *pdwPictAspectRatioY); - - -void __RPC_STUB IDDrawExclModeVideo_GetNativeVideoProps_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDDrawExclModeVideo_SetCallbackInterface_Proxy( - IDDrawExclModeVideo * This, - /* [in] */ IDDrawExclModeVideoCallback *pCallback, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IDDrawExclModeVideo_SetCallbackInterface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDDrawExclModeVideo_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0375 */ -/* [local] */ - - -enum _AM_OVERLAY_NOTIFY_FLAGS - { AM_OVERLAY_NOTIFY_VISIBLE_CHANGE = 0x1, - AM_OVERLAY_NOTIFY_SOURCE_CHANGE = 0x2, - AM_OVERLAY_NOTIFY_DEST_CHANGE = 0x4 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0375_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0375_v0_0_s_ifspec; - -#ifndef __IDDrawExclModeVideoCallback_INTERFACE_DEFINED__ -#define __IDDrawExclModeVideoCallback_INTERFACE_DEFINED__ - -/* interface IDDrawExclModeVideoCallback */ -/* [unique][uuid][local][object] */ - - -EXTERN_C const IID IID_IDDrawExclModeVideoCallback; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("913c24a0-20ab-11d2-9038-00a0c9697298") - IDDrawExclModeVideoCallback : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE OnUpdateOverlay( - /* [in] */ BOOL bBefore, - /* [in] */ DWORD dwFlags, - /* [in] */ BOOL bOldVisible, - /* [in] */ const RECT *prcOldSrc, - /* [in] */ const RECT *prcOldDest, - /* [in] */ BOOL bNewVisible, - /* [in] */ const RECT *prcNewSrc, - /* [in] */ const RECT *prcNewDest) = 0; - - virtual HRESULT STDMETHODCALLTYPE OnUpdateColorKey( - /* [in] */ const COLORKEY *pKey, - /* [in] */ DWORD dwColor) = 0; - - virtual HRESULT STDMETHODCALLTYPE OnUpdateSize( - /* [in] */ DWORD dwWidth, - /* [in] */ DWORD dwHeight, - /* [in] */ DWORD dwARWidth, - /* [in] */ DWORD dwARHeight) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDDrawExclModeVideoCallbackVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDDrawExclModeVideoCallback * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDDrawExclModeVideoCallback * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDDrawExclModeVideoCallback * This); - - HRESULT ( STDMETHODCALLTYPE *OnUpdateOverlay )( - IDDrawExclModeVideoCallback * This, - /* [in] */ BOOL bBefore, - /* [in] */ DWORD dwFlags, - /* [in] */ BOOL bOldVisible, - /* [in] */ const RECT *prcOldSrc, - /* [in] */ const RECT *prcOldDest, - /* [in] */ BOOL bNewVisible, - /* [in] */ const RECT *prcNewSrc, - /* [in] */ const RECT *prcNewDest); - - HRESULT ( STDMETHODCALLTYPE *OnUpdateColorKey )( - IDDrawExclModeVideoCallback * This, - /* [in] */ const COLORKEY *pKey, - /* [in] */ DWORD dwColor); - - HRESULT ( STDMETHODCALLTYPE *OnUpdateSize )( - IDDrawExclModeVideoCallback * This, - /* [in] */ DWORD dwWidth, - /* [in] */ DWORD dwHeight, - /* [in] */ DWORD dwARWidth, - /* [in] */ DWORD dwARHeight); - - END_INTERFACE - } IDDrawExclModeVideoCallbackVtbl; - - interface IDDrawExclModeVideoCallback - { - CONST_VTBL struct IDDrawExclModeVideoCallbackVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDDrawExclModeVideoCallback_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDDrawExclModeVideoCallback_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDDrawExclModeVideoCallback_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDDrawExclModeVideoCallback_OnUpdateOverlay(This,bBefore,dwFlags,bOldVisible,prcOldSrc,prcOldDest,bNewVisible,prcNewSrc,prcNewDest) \ - (This)->lpVtbl -> OnUpdateOverlay(This,bBefore,dwFlags,bOldVisible,prcOldSrc,prcOldDest,bNewVisible,prcNewSrc,prcNewDest) - -#define IDDrawExclModeVideoCallback_OnUpdateColorKey(This,pKey,dwColor) \ - (This)->lpVtbl -> OnUpdateColorKey(This,pKey,dwColor) - -#define IDDrawExclModeVideoCallback_OnUpdateSize(This,dwWidth,dwHeight,dwARWidth,dwARHeight) \ - (This)->lpVtbl -> OnUpdateSize(This,dwWidth,dwHeight,dwARWidth,dwARHeight) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDDrawExclModeVideoCallback_OnUpdateOverlay_Proxy( - IDDrawExclModeVideoCallback * This, - /* [in] */ BOOL bBefore, - /* [in] */ DWORD dwFlags, - /* [in] */ BOOL bOldVisible, - /* [in] */ const RECT *prcOldSrc, - /* [in] */ const RECT *prcOldDest, - /* [in] */ BOOL bNewVisible, - /* [in] */ const RECT *prcNewSrc, - /* [in] */ const RECT *prcNewDest); - - -void __RPC_STUB IDDrawExclModeVideoCallback_OnUpdateOverlay_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDDrawExclModeVideoCallback_OnUpdateColorKey_Proxy( - IDDrawExclModeVideoCallback * This, - /* [in] */ const COLORKEY *pKey, - /* [in] */ DWORD dwColor); - - -void __RPC_STUB IDDrawExclModeVideoCallback_OnUpdateColorKey_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDDrawExclModeVideoCallback_OnUpdateSize_Proxy( - IDDrawExclModeVideoCallback * This, - /* [in] */ DWORD dwWidth, - /* [in] */ DWORD dwHeight, - /* [in] */ DWORD dwARWidth, - /* [in] */ DWORD dwARHeight); - - -void __RPC_STUB IDDrawExclModeVideoCallback_OnUpdateSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDDrawExclModeVideoCallback_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0376 */ -/* [local] */ - - - - - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0376_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0376_v0_0_s_ifspec; - -#ifndef __IPinConnection_INTERFACE_DEFINED__ -#define __IPinConnection_INTERFACE_DEFINED__ - -/* interface IPinConnection */ -/* [unique][uuid][object][local] */ - - -EXTERN_C const IID IID_IPinConnection; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("4a9a62d3-27d4-403d-91e9-89f540e55534") - IPinConnection : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE DynamicQueryAccept( - /* [in] */ const AM_MEDIA_TYPE *pmt) = 0; - - virtual HRESULT STDMETHODCALLTYPE NotifyEndOfStream( - /* [in] */ HANDLE hNotifyEvent) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsEndPin( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE DynamicDisconnect( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IPinConnectionVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IPinConnection * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IPinConnection * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IPinConnection * This); - - HRESULT ( STDMETHODCALLTYPE *DynamicQueryAccept )( - IPinConnection * This, - /* [in] */ const AM_MEDIA_TYPE *pmt); - - HRESULT ( STDMETHODCALLTYPE *NotifyEndOfStream )( - IPinConnection * This, - /* [in] */ HANDLE hNotifyEvent); - - HRESULT ( STDMETHODCALLTYPE *IsEndPin )( - IPinConnection * This); - - HRESULT ( STDMETHODCALLTYPE *DynamicDisconnect )( - IPinConnection * This); - - END_INTERFACE - } IPinConnectionVtbl; - - interface IPinConnection - { - CONST_VTBL struct IPinConnectionVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IPinConnection_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IPinConnection_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IPinConnection_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IPinConnection_DynamicQueryAccept(This,pmt) \ - (This)->lpVtbl -> DynamicQueryAccept(This,pmt) - -#define IPinConnection_NotifyEndOfStream(This,hNotifyEvent) \ - (This)->lpVtbl -> NotifyEndOfStream(This,hNotifyEvent) - -#define IPinConnection_IsEndPin(This) \ - (This)->lpVtbl -> IsEndPin(This) - -#define IPinConnection_DynamicDisconnect(This) \ - (This)->lpVtbl -> DynamicDisconnect(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IPinConnection_DynamicQueryAccept_Proxy( - IPinConnection * This, - /* [in] */ const AM_MEDIA_TYPE *pmt); - - -void __RPC_STUB IPinConnection_DynamicQueryAccept_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPinConnection_NotifyEndOfStream_Proxy( - IPinConnection * This, - /* [in] */ HANDLE hNotifyEvent); - - -void __RPC_STUB IPinConnection_NotifyEndOfStream_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPinConnection_IsEndPin_Proxy( - IPinConnection * This); - - -void __RPC_STUB IPinConnection_IsEndPin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IPinConnection_DynamicDisconnect_Proxy( - IPinConnection * This); - - -void __RPC_STUB IPinConnection_DynamicDisconnect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IPinConnection_INTERFACE_DEFINED__ */ - - -#ifndef __IPinFlowControl_INTERFACE_DEFINED__ -#define __IPinFlowControl_INTERFACE_DEFINED__ - -/* interface IPinFlowControl */ -/* [unique][uuid][object][local] */ - - -EXTERN_C const IID IID_IPinFlowControl; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("c56e9858-dbf3-4f6b-8119-384af2060deb") - IPinFlowControl : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Block( - /* [in] */ DWORD dwBlockFlags, - /* [in] */ HANDLE hEvent) = 0; - - }; - -#else /* C style interface */ - - typedef struct IPinFlowControlVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IPinFlowControl * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IPinFlowControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IPinFlowControl * This); - - HRESULT ( STDMETHODCALLTYPE *Block )( - IPinFlowControl * This, - /* [in] */ DWORD dwBlockFlags, - /* [in] */ HANDLE hEvent); - - END_INTERFACE - } IPinFlowControlVtbl; - - interface IPinFlowControl - { - CONST_VTBL struct IPinFlowControlVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IPinFlowControl_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IPinFlowControl_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IPinFlowControl_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IPinFlowControl_Block(This,dwBlockFlags,hEvent) \ - (This)->lpVtbl -> Block(This,dwBlockFlags,hEvent) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IPinFlowControl_Block_Proxy( - IPinFlowControl * This, - /* [in] */ DWORD dwBlockFlags, - /* [in] */ HANDLE hEvent); - - -void __RPC_STUB IPinFlowControl_Block_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IPinFlowControl_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0378 */ -/* [local] */ - - -enum _AM_PIN_FLOW_CONTROL_BLOCK_FLAGS - { AM_PIN_FLOW_CONTROL_BLOCK = 0x1 - } ; -typedef -enum _AM_GRAPH_CONFIG_RECONNECT_FLAGS - { AM_GRAPH_CONFIG_RECONNECT_DIRECTCONNECT = 0x1, - AM_GRAPH_CONFIG_RECONNECT_CACHE_REMOVED_FILTERS = 0x2, - AM_GRAPH_CONFIG_RECONNECT_USE_ONLY_CACHED_FILTERS = 0x4 - } AM_GRAPH_CONFIG_RECONNECT_FLAGS; - - -enum _REM_FILTER_FLAGS - { REMFILTERF_LEAVECONNECTED = 0x1 - } ; -typedef -enum _AM_FILTER_FLAGS - { AM_FILTER_FLAGS_REMOVABLE = 0x1 - } AM_FILTER_FLAGS; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0378_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0378_v0_0_s_ifspec; - -#ifndef __IGraphConfig_INTERFACE_DEFINED__ -#define __IGraphConfig_INTERFACE_DEFINED__ - -/* interface IGraphConfig */ -/* [unique][uuid][object][local] */ - - -EXTERN_C const IID IID_IGraphConfig; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("03A1EB8E-32BF-4245-8502-114D08A9CB88") - IGraphConfig : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Reconnect( - /* [in] */ IPin *pOutputPin, - /* [in] */ IPin *pInputPin, - /* [in] */ const AM_MEDIA_TYPE *pmtFirstConnection, - /* [in] */ IBaseFilter *pUsingFilter, - /* [in] */ HANDLE hAbortEvent, - /* [in] */ DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reconfigure( - /* [in] */ IGraphConfigCallback *pCallback, - /* [in] */ PVOID pvContext, - /* [in] */ DWORD dwFlags, - /* [in] */ HANDLE hAbortEvent) = 0; - - virtual HRESULT STDMETHODCALLTYPE AddFilterToCache( - /* [in] */ IBaseFilter *pFilter) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnumCacheFilter( - /* [out] */ IEnumFilters **pEnum) = 0; - - virtual HRESULT STDMETHODCALLTYPE RemoveFilterFromCache( - /* [in] */ IBaseFilter *pFilter) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetStartTime( - /* [out] */ REFERENCE_TIME *prtStart) = 0; - - virtual HRESULT STDMETHODCALLTYPE PushThroughData( - /* [in] */ IPin *pOutputPin, - /* [in] */ IPinConnection *pConnection, - /* [in] */ HANDLE hEventAbort) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFilterFlags( - /* [in] */ IBaseFilter *pFilter, - /* [in] */ DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFilterFlags( - /* [in] */ IBaseFilter *pFilter, - /* [out] */ DWORD *pdwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE RemoveFilterEx( - /* [in] */ IBaseFilter *pFilter, - DWORD Flags) = 0; - - }; - -#else /* C style interface */ - - typedef struct IGraphConfigVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IGraphConfig * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IGraphConfig * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IGraphConfig * This); - - HRESULT ( STDMETHODCALLTYPE *Reconnect )( - IGraphConfig * This, - /* [in] */ IPin *pOutputPin, - /* [in] */ IPin *pInputPin, - /* [in] */ const AM_MEDIA_TYPE *pmtFirstConnection, - /* [in] */ IBaseFilter *pUsingFilter, - /* [in] */ HANDLE hAbortEvent, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *Reconfigure )( - IGraphConfig * This, - /* [in] */ IGraphConfigCallback *pCallback, - /* [in] */ PVOID pvContext, - /* [in] */ DWORD dwFlags, - /* [in] */ HANDLE hAbortEvent); - - HRESULT ( STDMETHODCALLTYPE *AddFilterToCache )( - IGraphConfig * This, - /* [in] */ IBaseFilter *pFilter); - - HRESULT ( STDMETHODCALLTYPE *EnumCacheFilter )( - IGraphConfig * This, - /* [out] */ IEnumFilters **pEnum); - - HRESULT ( STDMETHODCALLTYPE *RemoveFilterFromCache )( - IGraphConfig * This, - /* [in] */ IBaseFilter *pFilter); - - HRESULT ( STDMETHODCALLTYPE *GetStartTime )( - IGraphConfig * This, - /* [out] */ REFERENCE_TIME *prtStart); - - HRESULT ( STDMETHODCALLTYPE *PushThroughData )( - IGraphConfig * This, - /* [in] */ IPin *pOutputPin, - /* [in] */ IPinConnection *pConnection, - /* [in] */ HANDLE hEventAbort); - - HRESULT ( STDMETHODCALLTYPE *SetFilterFlags )( - IGraphConfig * This, - /* [in] */ IBaseFilter *pFilter, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *GetFilterFlags )( - IGraphConfig * This, - /* [in] */ IBaseFilter *pFilter, - /* [out] */ DWORD *pdwFlags); - - HRESULT ( STDMETHODCALLTYPE *RemoveFilterEx )( - IGraphConfig * This, - /* [in] */ IBaseFilter *pFilter, - DWORD Flags); - - END_INTERFACE - } IGraphConfigVtbl; - - interface IGraphConfig - { - CONST_VTBL struct IGraphConfigVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IGraphConfig_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IGraphConfig_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IGraphConfig_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IGraphConfig_Reconnect(This,pOutputPin,pInputPin,pmtFirstConnection,pUsingFilter,hAbortEvent,dwFlags) \ - (This)->lpVtbl -> Reconnect(This,pOutputPin,pInputPin,pmtFirstConnection,pUsingFilter,hAbortEvent,dwFlags) - -#define IGraphConfig_Reconfigure(This,pCallback,pvContext,dwFlags,hAbortEvent) \ - (This)->lpVtbl -> Reconfigure(This,pCallback,pvContext,dwFlags,hAbortEvent) - -#define IGraphConfig_AddFilterToCache(This,pFilter) \ - (This)->lpVtbl -> AddFilterToCache(This,pFilter) - -#define IGraphConfig_EnumCacheFilter(This,pEnum) \ - (This)->lpVtbl -> EnumCacheFilter(This,pEnum) - -#define IGraphConfig_RemoveFilterFromCache(This,pFilter) \ - (This)->lpVtbl -> RemoveFilterFromCache(This,pFilter) - -#define IGraphConfig_GetStartTime(This,prtStart) \ - (This)->lpVtbl -> GetStartTime(This,prtStart) - -#define IGraphConfig_PushThroughData(This,pOutputPin,pConnection,hEventAbort) \ - (This)->lpVtbl -> PushThroughData(This,pOutputPin,pConnection,hEventAbort) - -#define IGraphConfig_SetFilterFlags(This,pFilter,dwFlags) \ - (This)->lpVtbl -> SetFilterFlags(This,pFilter,dwFlags) - -#define IGraphConfig_GetFilterFlags(This,pFilter,pdwFlags) \ - (This)->lpVtbl -> GetFilterFlags(This,pFilter,pdwFlags) - -#define IGraphConfig_RemoveFilterEx(This,pFilter,Flags) \ - (This)->lpVtbl -> RemoveFilterEx(This,pFilter,Flags) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IGraphConfig_Reconnect_Proxy( - IGraphConfig * This, - /* [in] */ IPin *pOutputPin, - /* [in] */ IPin *pInputPin, - /* [in] */ const AM_MEDIA_TYPE *pmtFirstConnection, - /* [in] */ IBaseFilter *pUsingFilter, - /* [in] */ HANDLE hAbortEvent, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IGraphConfig_Reconnect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IGraphConfig_Reconfigure_Proxy( - IGraphConfig * This, - /* [in] */ IGraphConfigCallback *pCallback, - /* [in] */ PVOID pvContext, - /* [in] */ DWORD dwFlags, - /* [in] */ HANDLE hAbortEvent); - - -void __RPC_STUB IGraphConfig_Reconfigure_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IGraphConfig_AddFilterToCache_Proxy( - IGraphConfig * This, - /* [in] */ IBaseFilter *pFilter); - - -void __RPC_STUB IGraphConfig_AddFilterToCache_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IGraphConfig_EnumCacheFilter_Proxy( - IGraphConfig * This, - /* [out] */ IEnumFilters **pEnum); - - -void __RPC_STUB IGraphConfig_EnumCacheFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IGraphConfig_RemoveFilterFromCache_Proxy( - IGraphConfig * This, - /* [in] */ IBaseFilter *pFilter); - - -void __RPC_STUB IGraphConfig_RemoveFilterFromCache_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IGraphConfig_GetStartTime_Proxy( - IGraphConfig * This, - /* [out] */ REFERENCE_TIME *prtStart); - - -void __RPC_STUB IGraphConfig_GetStartTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IGraphConfig_PushThroughData_Proxy( - IGraphConfig * This, - /* [in] */ IPin *pOutputPin, - /* [in] */ IPinConnection *pConnection, - /* [in] */ HANDLE hEventAbort); - - -void __RPC_STUB IGraphConfig_PushThroughData_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IGraphConfig_SetFilterFlags_Proxy( - IGraphConfig * This, - /* [in] */ IBaseFilter *pFilter, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IGraphConfig_SetFilterFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IGraphConfig_GetFilterFlags_Proxy( - IGraphConfig * This, - /* [in] */ IBaseFilter *pFilter, - /* [out] */ DWORD *pdwFlags); - - -void __RPC_STUB IGraphConfig_GetFilterFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IGraphConfig_RemoveFilterEx_Proxy( - IGraphConfig * This, - /* [in] */ IBaseFilter *pFilter, - DWORD Flags); - - -void __RPC_STUB IGraphConfig_RemoveFilterEx_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IGraphConfig_INTERFACE_DEFINED__ */ - - -#ifndef __IGraphConfigCallback_INTERFACE_DEFINED__ -#define __IGraphConfigCallback_INTERFACE_DEFINED__ - -/* interface IGraphConfigCallback */ -/* [unique][uuid][object][local] */ - - -EXTERN_C const IID IID_IGraphConfigCallback; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("ade0fd60-d19d-11d2-abf6-00a0c905f375") - IGraphConfigCallback : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Reconfigure( - PVOID pvContext, - DWORD dwFlags) = 0; - - }; - -#else /* C style interface */ - - typedef struct IGraphConfigCallbackVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IGraphConfigCallback * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IGraphConfigCallback * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IGraphConfigCallback * This); - - HRESULT ( STDMETHODCALLTYPE *Reconfigure )( - IGraphConfigCallback * This, - PVOID pvContext, - DWORD dwFlags); - - END_INTERFACE - } IGraphConfigCallbackVtbl; - - interface IGraphConfigCallback - { - CONST_VTBL struct IGraphConfigCallbackVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IGraphConfigCallback_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IGraphConfigCallback_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IGraphConfigCallback_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IGraphConfigCallback_Reconfigure(This,pvContext,dwFlags) \ - (This)->lpVtbl -> Reconfigure(This,pvContext,dwFlags) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IGraphConfigCallback_Reconfigure_Proxy( - IGraphConfigCallback * This, - PVOID pvContext, - DWORD dwFlags); - - -void __RPC_STUB IGraphConfigCallback_Reconfigure_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IGraphConfigCallback_INTERFACE_DEFINED__ */ - - -#ifndef __IFilterChain_INTERFACE_DEFINED__ -#define __IFilterChain_INTERFACE_DEFINED__ - -/* interface IFilterChain */ -/* [unique][uuid][object][local] */ - - -EXTERN_C const IID IID_IFilterChain; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("DCFBDCF6-0DC2-45f5-9AB2-7C330EA09C29") - IFilterChain : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE StartChain( - /* [in] */ IBaseFilter *pStartFilter, - /* [in] */ IBaseFilter *pEndFilter) = 0; - - virtual HRESULT STDMETHODCALLTYPE PauseChain( - /* [in] */ IBaseFilter *pStartFilter, - /* [in] */ IBaseFilter *pEndFilter) = 0; - - virtual HRESULT STDMETHODCALLTYPE StopChain( - /* [in] */ IBaseFilter *pStartFilter, - /* [in] */ IBaseFilter *pEndFilter) = 0; - - virtual HRESULT STDMETHODCALLTYPE RemoveChain( - /* [in] */ IBaseFilter *pStartFilter, - /* [in] */ IBaseFilter *pEndFilter) = 0; - - }; - -#else /* C style interface */ - - typedef struct IFilterChainVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IFilterChain * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IFilterChain * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IFilterChain * This); - - HRESULT ( STDMETHODCALLTYPE *StartChain )( - IFilterChain * This, - /* [in] */ IBaseFilter *pStartFilter, - /* [in] */ IBaseFilter *pEndFilter); - - HRESULT ( STDMETHODCALLTYPE *PauseChain )( - IFilterChain * This, - /* [in] */ IBaseFilter *pStartFilter, - /* [in] */ IBaseFilter *pEndFilter); - - HRESULT ( STDMETHODCALLTYPE *StopChain )( - IFilterChain * This, - /* [in] */ IBaseFilter *pStartFilter, - /* [in] */ IBaseFilter *pEndFilter); - - HRESULT ( STDMETHODCALLTYPE *RemoveChain )( - IFilterChain * This, - /* [in] */ IBaseFilter *pStartFilter, - /* [in] */ IBaseFilter *pEndFilter); - - END_INTERFACE - } IFilterChainVtbl; - - interface IFilterChain - { - CONST_VTBL struct IFilterChainVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IFilterChain_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IFilterChain_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IFilterChain_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IFilterChain_StartChain(This,pStartFilter,pEndFilter) \ - (This)->lpVtbl -> StartChain(This,pStartFilter,pEndFilter) - -#define IFilterChain_PauseChain(This,pStartFilter,pEndFilter) \ - (This)->lpVtbl -> PauseChain(This,pStartFilter,pEndFilter) - -#define IFilterChain_StopChain(This,pStartFilter,pEndFilter) \ - (This)->lpVtbl -> StopChain(This,pStartFilter,pEndFilter) - -#define IFilterChain_RemoveChain(This,pStartFilter,pEndFilter) \ - (This)->lpVtbl -> RemoveChain(This,pStartFilter,pEndFilter) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IFilterChain_StartChain_Proxy( - IFilterChain * This, - /* [in] */ IBaseFilter *pStartFilter, - /* [in] */ IBaseFilter *pEndFilter); - - -void __RPC_STUB IFilterChain_StartChain_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterChain_PauseChain_Proxy( - IFilterChain * This, - /* [in] */ IBaseFilter *pStartFilter, - /* [in] */ IBaseFilter *pEndFilter); - - -void __RPC_STUB IFilterChain_PauseChain_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterChain_StopChain_Proxy( - IFilterChain * This, - /* [in] */ IBaseFilter *pStartFilter, - /* [in] */ IBaseFilter *pEndFilter); - - -void __RPC_STUB IFilterChain_StopChain_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IFilterChain_RemoveChain_Proxy( - IFilterChain * This, - /* [in] */ IBaseFilter *pStartFilter, - /* [in] */ IBaseFilter *pEndFilter); - - -void __RPC_STUB IFilterChain_RemoveChain_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IFilterChain_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0381 */ -/* [local] */ - -// Restore the previous setting for C4201 compiler warning -#pragma warning(default:4201) - - -#if 0 -typedef DWORD *LPDIRECTDRAW7; - -typedef DWORD *LPDIRECTDRAWSURFACE7; - -typedef DWORD *LPDDPIXELFORMAT; - -typedef DWORD *LPBITMAPINFOHEADER; - -typedef /* [public][public][public][public][public][public] */ struct __MIDL___MIDL_itf_strmif_0381_0001 - { - DWORD dw1; - DWORD dw2; - } DDCOLORKEY; - -typedef DDCOLORKEY *LPDDCOLORKEY; - -#endif -#include - - - - - - - - - - - - -typedef /* [public] */ -enum __MIDL___MIDL_itf_strmif_0381_0002 - { VMRSample_SyncPoint = 0x1, - VMRSample_Preroll = 0x2, - VMRSample_Discontinuity = 0x4, - VMRSample_TimeValid = 0x8 - } VMRPresentationFlags; - -typedef struct tagVMRPRESENTATIONINFO - { - DWORD dwFlags; - LPDIRECTDRAWSURFACE7 lpSurf; - REFERENCE_TIME rtStart; - REFERENCE_TIME rtEnd; - SIZE szAspectRatio; - RECT rcSrc; - RECT rcDst; - DWORD dwTypeSpecificFlags; - DWORD dwInterlaceFlags; - } VMRPRESENTATIONINFO; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0381_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0381_v0_0_s_ifspec; - -#ifndef __IVMRImagePresenter_INTERFACE_DEFINED__ -#define __IVMRImagePresenter_INTERFACE_DEFINED__ - -/* interface IVMRImagePresenter */ -/* [unique][helpstring][uuid][local][object][local] */ - - -EXTERN_C const IID IID_IVMRImagePresenter; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("CE704FE7-E71E-41fb-BAA2-C4403E1182F5") - IVMRImagePresenter : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE StartPresenting( - /* [in] */ DWORD_PTR dwUserID) = 0; - - virtual HRESULT STDMETHODCALLTYPE StopPresenting( - /* [in] */ DWORD_PTR dwUserID) = 0; - - virtual HRESULT STDMETHODCALLTYPE PresentImage( - /* [in] */ DWORD_PTR dwUserID, - /* [in] */ VMRPRESENTATIONINFO *lpPresInfo) = 0; - - }; - -#else /* C style interface */ - - typedef struct IVMRImagePresenterVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IVMRImagePresenter * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IVMRImagePresenter * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IVMRImagePresenter * This); - - HRESULT ( STDMETHODCALLTYPE *StartPresenting )( - IVMRImagePresenter * This, - /* [in] */ DWORD_PTR dwUserID); - - HRESULT ( STDMETHODCALLTYPE *StopPresenting )( - IVMRImagePresenter * This, - /* [in] */ DWORD_PTR dwUserID); - - HRESULT ( STDMETHODCALLTYPE *PresentImage )( - IVMRImagePresenter * This, - /* [in] */ DWORD_PTR dwUserID, - /* [in] */ VMRPRESENTATIONINFO *lpPresInfo); - - END_INTERFACE - } IVMRImagePresenterVtbl; - - interface IVMRImagePresenter - { - CONST_VTBL struct IVMRImagePresenterVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IVMRImagePresenter_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IVMRImagePresenter_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IVMRImagePresenter_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IVMRImagePresenter_StartPresenting(This,dwUserID) \ - (This)->lpVtbl -> StartPresenting(This,dwUserID) - -#define IVMRImagePresenter_StopPresenting(This,dwUserID) \ - (This)->lpVtbl -> StopPresenting(This,dwUserID) - -#define IVMRImagePresenter_PresentImage(This,dwUserID,lpPresInfo) \ - (This)->lpVtbl -> PresentImage(This,dwUserID,lpPresInfo) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IVMRImagePresenter_StartPresenting_Proxy( - IVMRImagePresenter * This, - /* [in] */ DWORD_PTR dwUserID); - - -void __RPC_STUB IVMRImagePresenter_StartPresenting_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRImagePresenter_StopPresenting_Proxy( - IVMRImagePresenter * This, - /* [in] */ DWORD_PTR dwUserID); - - -void __RPC_STUB IVMRImagePresenter_StopPresenting_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRImagePresenter_PresentImage_Proxy( - IVMRImagePresenter * This, - /* [in] */ DWORD_PTR dwUserID, - /* [in] */ VMRPRESENTATIONINFO *lpPresInfo); - - -void __RPC_STUB IVMRImagePresenter_PresentImage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IVMRImagePresenter_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0382 */ -/* [local] */ - -typedef /* [public] */ -enum __MIDL___MIDL_itf_strmif_0382_0001 - { AMAP_PIXELFORMAT_VALID = 0x1, - AMAP_3D_TARGET = 0x2, - AMAP_ALLOW_SYSMEM = 0x4, - AMAP_FORCE_SYSMEM = 0x8, - AMAP_DIRECTED_FLIP = 0x10, - AMAP_DXVA_TARGET = 0x20 - } VMRSurfaceAllocationFlags; - -typedef struct tagVMRALLOCATIONINFO - { - DWORD dwFlags; - LPBITMAPINFOHEADER lpHdr; - LPDDPIXELFORMAT lpPixFmt; - SIZE szAspectRatio; - DWORD dwMinBuffers; - DWORD dwMaxBuffers; - DWORD dwInterlaceFlags; - SIZE szNativeSize; - } VMRALLOCATIONINFO; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0382_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0382_v0_0_s_ifspec; - -#ifndef __IVMRSurfaceAllocator_INTERFACE_DEFINED__ -#define __IVMRSurfaceAllocator_INTERFACE_DEFINED__ - -/* interface IVMRSurfaceAllocator */ -/* [unique][helpstring][uuid][local][object][local] */ - - -EXTERN_C const IID IID_IVMRSurfaceAllocator; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("31ce832e-4484-458b-8cca-f4d7e3db0b52") - IVMRSurfaceAllocator : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE AllocateSurface( - /* [in] */ DWORD_PTR dwUserID, - /* [in] */ VMRALLOCATIONINFO *lpAllocInfo, - /* [out][in] */ DWORD *lpdwActualBuffers, - /* [out] */ LPDIRECTDRAWSURFACE7 *lplpSurface) = 0; - - virtual HRESULT STDMETHODCALLTYPE FreeSurface( - /* [in] */ DWORD_PTR dwID) = 0; - - virtual HRESULT STDMETHODCALLTYPE PrepareSurface( - /* [in] */ DWORD_PTR dwUserID, - /* [in] */ LPDIRECTDRAWSURFACE7 lpSurface, - /* [in] */ DWORD dwSurfaceFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE AdviseNotify( - /* [in] */ IVMRSurfaceAllocatorNotify *lpIVMRSurfAllocNotify) = 0; - - }; - -#else /* C style interface */ - - typedef struct IVMRSurfaceAllocatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IVMRSurfaceAllocator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IVMRSurfaceAllocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IVMRSurfaceAllocator * This); - - HRESULT ( STDMETHODCALLTYPE *AllocateSurface )( - IVMRSurfaceAllocator * This, - /* [in] */ DWORD_PTR dwUserID, - /* [in] */ VMRALLOCATIONINFO *lpAllocInfo, - /* [out][in] */ DWORD *lpdwActualBuffers, - /* [out] */ LPDIRECTDRAWSURFACE7 *lplpSurface); - - HRESULT ( STDMETHODCALLTYPE *FreeSurface )( - IVMRSurfaceAllocator * This, - /* [in] */ DWORD_PTR dwID); - - HRESULT ( STDMETHODCALLTYPE *PrepareSurface )( - IVMRSurfaceAllocator * This, - /* [in] */ DWORD_PTR dwUserID, - /* [in] */ LPDIRECTDRAWSURFACE7 lpSurface, - /* [in] */ DWORD dwSurfaceFlags); - - HRESULT ( STDMETHODCALLTYPE *AdviseNotify )( - IVMRSurfaceAllocator * This, - /* [in] */ IVMRSurfaceAllocatorNotify *lpIVMRSurfAllocNotify); - - END_INTERFACE - } IVMRSurfaceAllocatorVtbl; - - interface IVMRSurfaceAllocator - { - CONST_VTBL struct IVMRSurfaceAllocatorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IVMRSurfaceAllocator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IVMRSurfaceAllocator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IVMRSurfaceAllocator_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IVMRSurfaceAllocator_AllocateSurface(This,dwUserID,lpAllocInfo,lpdwActualBuffers,lplpSurface) \ - (This)->lpVtbl -> AllocateSurface(This,dwUserID,lpAllocInfo,lpdwActualBuffers,lplpSurface) - -#define IVMRSurfaceAllocator_FreeSurface(This,dwID) \ - (This)->lpVtbl -> FreeSurface(This,dwID) - -#define IVMRSurfaceAllocator_PrepareSurface(This,dwUserID,lpSurface,dwSurfaceFlags) \ - (This)->lpVtbl -> PrepareSurface(This,dwUserID,lpSurface,dwSurfaceFlags) - -#define IVMRSurfaceAllocator_AdviseNotify(This,lpIVMRSurfAllocNotify) \ - (This)->lpVtbl -> AdviseNotify(This,lpIVMRSurfAllocNotify) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocator_AllocateSurface_Proxy( - IVMRSurfaceAllocator * This, - /* [in] */ DWORD_PTR dwUserID, - /* [in] */ VMRALLOCATIONINFO *lpAllocInfo, - /* [out][in] */ DWORD *lpdwActualBuffers, - /* [out] */ LPDIRECTDRAWSURFACE7 *lplpSurface); - - -void __RPC_STUB IVMRSurfaceAllocator_AllocateSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocator_FreeSurface_Proxy( - IVMRSurfaceAllocator * This, - /* [in] */ DWORD_PTR dwID); - - -void __RPC_STUB IVMRSurfaceAllocator_FreeSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocator_PrepareSurface_Proxy( - IVMRSurfaceAllocator * This, - /* [in] */ DWORD_PTR dwUserID, - /* [in] */ LPDIRECTDRAWSURFACE7 lpSurface, - /* [in] */ DWORD dwSurfaceFlags); - - -void __RPC_STUB IVMRSurfaceAllocator_PrepareSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocator_AdviseNotify_Proxy( - IVMRSurfaceAllocator * This, - /* [in] */ IVMRSurfaceAllocatorNotify *lpIVMRSurfAllocNotify); - - -void __RPC_STUB IVMRSurfaceAllocator_AdviseNotify_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IVMRSurfaceAllocator_INTERFACE_DEFINED__ */ - - -#ifndef __IVMRSurfaceAllocatorNotify_INTERFACE_DEFINED__ -#define __IVMRSurfaceAllocatorNotify_INTERFACE_DEFINED__ - -/* interface IVMRSurfaceAllocatorNotify */ -/* [unique][helpstring][uuid][local][object][local] */ - - -EXTERN_C const IID IID_IVMRSurfaceAllocatorNotify; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("aada05a8-5a4e-4729-af0b-cea27aed51e2") - IVMRSurfaceAllocatorNotify : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE AdviseSurfaceAllocator( - /* [in] */ DWORD_PTR dwUserID, - /* [in] */ IVMRSurfaceAllocator *lpIVRMSurfaceAllocator) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDDrawDevice( - /* [in] */ LPDIRECTDRAW7 lpDDrawDevice, - /* [in] */ HMONITOR hMonitor) = 0; - - virtual HRESULT STDMETHODCALLTYPE ChangeDDrawDevice( - /* [in] */ LPDIRECTDRAW7 lpDDrawDevice, - /* [in] */ HMONITOR hMonitor) = 0; - - virtual HRESULT STDMETHODCALLTYPE RestoreDDrawSurfaces( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE NotifyEvent( - /* [in] */ LONG EventCode, - /* [in] */ LONG_PTR Param1, - /* [in] */ LONG_PTR Param2) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetBorderColor( - /* [in] */ COLORREF clrBorder) = 0; - - }; - -#else /* C style interface */ - - typedef struct IVMRSurfaceAllocatorNotifyVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IVMRSurfaceAllocatorNotify * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IVMRSurfaceAllocatorNotify * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IVMRSurfaceAllocatorNotify * This); - - HRESULT ( STDMETHODCALLTYPE *AdviseSurfaceAllocator )( - IVMRSurfaceAllocatorNotify * This, - /* [in] */ DWORD_PTR dwUserID, - /* [in] */ IVMRSurfaceAllocator *lpIVRMSurfaceAllocator); - - HRESULT ( STDMETHODCALLTYPE *SetDDrawDevice )( - IVMRSurfaceAllocatorNotify * This, - /* [in] */ LPDIRECTDRAW7 lpDDrawDevice, - /* [in] */ HMONITOR hMonitor); - - HRESULT ( STDMETHODCALLTYPE *ChangeDDrawDevice )( - IVMRSurfaceAllocatorNotify * This, - /* [in] */ LPDIRECTDRAW7 lpDDrawDevice, - /* [in] */ HMONITOR hMonitor); - - HRESULT ( STDMETHODCALLTYPE *RestoreDDrawSurfaces )( - IVMRSurfaceAllocatorNotify * This); - - HRESULT ( STDMETHODCALLTYPE *NotifyEvent )( - IVMRSurfaceAllocatorNotify * This, - /* [in] */ LONG EventCode, - /* [in] */ LONG_PTR Param1, - /* [in] */ LONG_PTR Param2); - - HRESULT ( STDMETHODCALLTYPE *SetBorderColor )( - IVMRSurfaceAllocatorNotify * This, - /* [in] */ COLORREF clrBorder); - - END_INTERFACE - } IVMRSurfaceAllocatorNotifyVtbl; - - interface IVMRSurfaceAllocatorNotify - { - CONST_VTBL struct IVMRSurfaceAllocatorNotifyVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IVMRSurfaceAllocatorNotify_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IVMRSurfaceAllocatorNotify_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IVMRSurfaceAllocatorNotify_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IVMRSurfaceAllocatorNotify_AdviseSurfaceAllocator(This,dwUserID,lpIVRMSurfaceAllocator) \ - (This)->lpVtbl -> AdviseSurfaceAllocator(This,dwUserID,lpIVRMSurfaceAllocator) - -#define IVMRSurfaceAllocatorNotify_SetDDrawDevice(This,lpDDrawDevice,hMonitor) \ - (This)->lpVtbl -> SetDDrawDevice(This,lpDDrawDevice,hMonitor) - -#define IVMRSurfaceAllocatorNotify_ChangeDDrawDevice(This,lpDDrawDevice,hMonitor) \ - (This)->lpVtbl -> ChangeDDrawDevice(This,lpDDrawDevice,hMonitor) - -#define IVMRSurfaceAllocatorNotify_RestoreDDrawSurfaces(This) \ - (This)->lpVtbl -> RestoreDDrawSurfaces(This) - -#define IVMRSurfaceAllocatorNotify_NotifyEvent(This,EventCode,Param1,Param2) \ - (This)->lpVtbl -> NotifyEvent(This,EventCode,Param1,Param2) - -#define IVMRSurfaceAllocatorNotify_SetBorderColor(This,clrBorder) \ - (This)->lpVtbl -> SetBorderColor(This,clrBorder) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocatorNotify_AdviseSurfaceAllocator_Proxy( - IVMRSurfaceAllocatorNotify * This, - /* [in] */ DWORD_PTR dwUserID, - /* [in] */ IVMRSurfaceAllocator *lpIVRMSurfaceAllocator); - - -void __RPC_STUB IVMRSurfaceAllocatorNotify_AdviseSurfaceAllocator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocatorNotify_SetDDrawDevice_Proxy( - IVMRSurfaceAllocatorNotify * This, - /* [in] */ LPDIRECTDRAW7 lpDDrawDevice, - /* [in] */ HMONITOR hMonitor); - - -void __RPC_STUB IVMRSurfaceAllocatorNotify_SetDDrawDevice_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocatorNotify_ChangeDDrawDevice_Proxy( - IVMRSurfaceAllocatorNotify * This, - /* [in] */ LPDIRECTDRAW7 lpDDrawDevice, - /* [in] */ HMONITOR hMonitor); - - -void __RPC_STUB IVMRSurfaceAllocatorNotify_ChangeDDrawDevice_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocatorNotify_RestoreDDrawSurfaces_Proxy( - IVMRSurfaceAllocatorNotify * This); - - -void __RPC_STUB IVMRSurfaceAllocatorNotify_RestoreDDrawSurfaces_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocatorNotify_NotifyEvent_Proxy( - IVMRSurfaceAllocatorNotify * This, - /* [in] */ LONG EventCode, - /* [in] */ LONG_PTR Param1, - /* [in] */ LONG_PTR Param2); - - -void __RPC_STUB IVMRSurfaceAllocatorNotify_NotifyEvent_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocatorNotify_SetBorderColor_Proxy( - IVMRSurfaceAllocatorNotify * This, - /* [in] */ COLORREF clrBorder); - - -void __RPC_STUB IVMRSurfaceAllocatorNotify_SetBorderColor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IVMRSurfaceAllocatorNotify_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0384 */ -/* [local] */ - -typedef /* [public] */ -enum __MIDL___MIDL_itf_strmif_0384_0001 - { VMR_ARMODE_NONE = 0, - VMR_ARMODE_LETTER_BOX = VMR_ARMODE_NONE + 1 - } VMR_ASPECT_RATIO_MODE; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0384_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0384_v0_0_s_ifspec; - -#ifndef __IVMRWindowlessControl_INTERFACE_DEFINED__ -#define __IVMRWindowlessControl_INTERFACE_DEFINED__ - -/* interface IVMRWindowlessControl */ -/* [unique][helpstring][uuid][local][object][local] */ - - -EXTERN_C const IID IID_IVMRWindowlessControl; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("0eb1088c-4dcd-46f0-878f-39dae86a51b7") - IVMRWindowlessControl : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetNativeVideoSize( - /* [out] */ LONG *lpWidth, - /* [out] */ LONG *lpHeight, - /* [out] */ LONG *lpARWidth, - /* [out] */ LONG *lpARHeight) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMinIdealVideoSize( - /* [out] */ LONG *lpWidth, - /* [out] */ LONG *lpHeight) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMaxIdealVideoSize( - /* [out] */ LONG *lpWidth, - /* [out] */ LONG *lpHeight) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVideoPosition( - /* [in] */ const LPRECT lpSRCRect, - /* [in] */ const LPRECT lpDSTRect) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetVideoPosition( - /* [out] */ LPRECT lpSRCRect, - /* [out] */ LPRECT lpDSTRect) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAspectRatioMode( - /* [out] */ DWORD *lpAspectRatioMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetAspectRatioMode( - /* [in] */ DWORD AspectRatioMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVideoClippingWindow( - /* [in] */ HWND hwnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE RepaintVideo( - /* [in] */ HWND hwnd, - /* [in] */ HDC hdc) = 0; - - virtual HRESULT STDMETHODCALLTYPE DisplayModeChanged( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentImage( - /* [out] */ BYTE **lpDib) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetBorderColor( - /* [in] */ COLORREF Clr) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBorderColor( - /* [out] */ COLORREF *lpClr) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetColorKey( - /* [in] */ COLORREF Clr) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetColorKey( - /* [out] */ COLORREF *lpClr) = 0; - - }; - -#else /* C style interface */ - - typedef struct IVMRWindowlessControlVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IVMRWindowlessControl * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IVMRWindowlessControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IVMRWindowlessControl * This); - - HRESULT ( STDMETHODCALLTYPE *GetNativeVideoSize )( - IVMRWindowlessControl * This, - /* [out] */ LONG *lpWidth, - /* [out] */ LONG *lpHeight, - /* [out] */ LONG *lpARWidth, - /* [out] */ LONG *lpARHeight); - - HRESULT ( STDMETHODCALLTYPE *GetMinIdealVideoSize )( - IVMRWindowlessControl * This, - /* [out] */ LONG *lpWidth, - /* [out] */ LONG *lpHeight); - - HRESULT ( STDMETHODCALLTYPE *GetMaxIdealVideoSize )( - IVMRWindowlessControl * This, - /* [out] */ LONG *lpWidth, - /* [out] */ LONG *lpHeight); - - HRESULT ( STDMETHODCALLTYPE *SetVideoPosition )( - IVMRWindowlessControl * This, - /* [in] */ const LPRECT lpSRCRect, - /* [in] */ const LPRECT lpDSTRect); - - HRESULT ( STDMETHODCALLTYPE *GetVideoPosition )( - IVMRWindowlessControl * This, - /* [out] */ LPRECT lpSRCRect, - /* [out] */ LPRECT lpDSTRect); - - HRESULT ( STDMETHODCALLTYPE *GetAspectRatioMode )( - IVMRWindowlessControl * This, - /* [out] */ DWORD *lpAspectRatioMode); - - HRESULT ( STDMETHODCALLTYPE *SetAspectRatioMode )( - IVMRWindowlessControl * This, - /* [in] */ DWORD AspectRatioMode); - - HRESULT ( STDMETHODCALLTYPE *SetVideoClippingWindow )( - IVMRWindowlessControl * This, - /* [in] */ HWND hwnd); - - HRESULT ( STDMETHODCALLTYPE *RepaintVideo )( - IVMRWindowlessControl * This, - /* [in] */ HWND hwnd, - /* [in] */ HDC hdc); - - HRESULT ( STDMETHODCALLTYPE *DisplayModeChanged )( - IVMRWindowlessControl * This); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentImage )( - IVMRWindowlessControl * This, - /* [out] */ BYTE **lpDib); - - HRESULT ( STDMETHODCALLTYPE *SetBorderColor )( - IVMRWindowlessControl * This, - /* [in] */ COLORREF Clr); - - HRESULT ( STDMETHODCALLTYPE *GetBorderColor )( - IVMRWindowlessControl * This, - /* [out] */ COLORREF *lpClr); - - HRESULT ( STDMETHODCALLTYPE *SetColorKey )( - IVMRWindowlessControl * This, - /* [in] */ COLORREF Clr); - - HRESULT ( STDMETHODCALLTYPE *GetColorKey )( - IVMRWindowlessControl * This, - /* [out] */ COLORREF *lpClr); - - END_INTERFACE - } IVMRWindowlessControlVtbl; - - interface IVMRWindowlessControl - { - CONST_VTBL struct IVMRWindowlessControlVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IVMRWindowlessControl_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IVMRWindowlessControl_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IVMRWindowlessControl_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IVMRWindowlessControl_GetNativeVideoSize(This,lpWidth,lpHeight,lpARWidth,lpARHeight) \ - (This)->lpVtbl -> GetNativeVideoSize(This,lpWidth,lpHeight,lpARWidth,lpARHeight) - -#define IVMRWindowlessControl_GetMinIdealVideoSize(This,lpWidth,lpHeight) \ - (This)->lpVtbl -> GetMinIdealVideoSize(This,lpWidth,lpHeight) - -#define IVMRWindowlessControl_GetMaxIdealVideoSize(This,lpWidth,lpHeight) \ - (This)->lpVtbl -> GetMaxIdealVideoSize(This,lpWidth,lpHeight) - -#define IVMRWindowlessControl_SetVideoPosition(This,lpSRCRect,lpDSTRect) \ - (This)->lpVtbl -> SetVideoPosition(This,lpSRCRect,lpDSTRect) - -#define IVMRWindowlessControl_GetVideoPosition(This,lpSRCRect,lpDSTRect) \ - (This)->lpVtbl -> GetVideoPosition(This,lpSRCRect,lpDSTRect) - -#define IVMRWindowlessControl_GetAspectRatioMode(This,lpAspectRatioMode) \ - (This)->lpVtbl -> GetAspectRatioMode(This,lpAspectRatioMode) - -#define IVMRWindowlessControl_SetAspectRatioMode(This,AspectRatioMode) \ - (This)->lpVtbl -> SetAspectRatioMode(This,AspectRatioMode) - -#define IVMRWindowlessControl_SetVideoClippingWindow(This,hwnd) \ - (This)->lpVtbl -> SetVideoClippingWindow(This,hwnd) - -#define IVMRWindowlessControl_RepaintVideo(This,hwnd,hdc) \ - (This)->lpVtbl -> RepaintVideo(This,hwnd,hdc) - -#define IVMRWindowlessControl_DisplayModeChanged(This) \ - (This)->lpVtbl -> DisplayModeChanged(This) - -#define IVMRWindowlessControl_GetCurrentImage(This,lpDib) \ - (This)->lpVtbl -> GetCurrentImage(This,lpDib) - -#define IVMRWindowlessControl_SetBorderColor(This,Clr) \ - (This)->lpVtbl -> SetBorderColor(This,Clr) - -#define IVMRWindowlessControl_GetBorderColor(This,lpClr) \ - (This)->lpVtbl -> GetBorderColor(This,lpClr) - -#define IVMRWindowlessControl_SetColorKey(This,Clr) \ - (This)->lpVtbl -> SetColorKey(This,Clr) - -#define IVMRWindowlessControl_GetColorKey(This,lpClr) \ - (This)->lpVtbl -> GetColorKey(This,lpClr) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IVMRWindowlessControl_GetNativeVideoSize_Proxy( - IVMRWindowlessControl * This, - /* [out] */ LONG *lpWidth, - /* [out] */ LONG *lpHeight, - /* [out] */ LONG *lpARWidth, - /* [out] */ LONG *lpARHeight); - - -void __RPC_STUB IVMRWindowlessControl_GetNativeVideoSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRWindowlessControl_GetMinIdealVideoSize_Proxy( - IVMRWindowlessControl * This, - /* [out] */ LONG *lpWidth, - /* [out] */ LONG *lpHeight); - - -void __RPC_STUB IVMRWindowlessControl_GetMinIdealVideoSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRWindowlessControl_GetMaxIdealVideoSize_Proxy( - IVMRWindowlessControl * This, - /* [out] */ LONG *lpWidth, - /* [out] */ LONG *lpHeight); - - -void __RPC_STUB IVMRWindowlessControl_GetMaxIdealVideoSize_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRWindowlessControl_SetVideoPosition_Proxy( - IVMRWindowlessControl * This, - /* [in] */ const LPRECT lpSRCRect, - /* [in] */ const LPRECT lpDSTRect); - - -void __RPC_STUB IVMRWindowlessControl_SetVideoPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRWindowlessControl_GetVideoPosition_Proxy( - IVMRWindowlessControl * This, - /* [out] */ LPRECT lpSRCRect, - /* [out] */ LPRECT lpDSTRect); - - -void __RPC_STUB IVMRWindowlessControl_GetVideoPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRWindowlessControl_GetAspectRatioMode_Proxy( - IVMRWindowlessControl * This, - /* [out] */ DWORD *lpAspectRatioMode); - - -void __RPC_STUB IVMRWindowlessControl_GetAspectRatioMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRWindowlessControl_SetAspectRatioMode_Proxy( - IVMRWindowlessControl * This, - /* [in] */ DWORD AspectRatioMode); - - -void __RPC_STUB IVMRWindowlessControl_SetAspectRatioMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRWindowlessControl_SetVideoClippingWindow_Proxy( - IVMRWindowlessControl * This, - /* [in] */ HWND hwnd); - - -void __RPC_STUB IVMRWindowlessControl_SetVideoClippingWindow_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRWindowlessControl_RepaintVideo_Proxy( - IVMRWindowlessControl * This, - /* [in] */ HWND hwnd, - /* [in] */ HDC hdc); - - -void __RPC_STUB IVMRWindowlessControl_RepaintVideo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRWindowlessControl_DisplayModeChanged_Proxy( - IVMRWindowlessControl * This); - - -void __RPC_STUB IVMRWindowlessControl_DisplayModeChanged_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRWindowlessControl_GetCurrentImage_Proxy( - IVMRWindowlessControl * This, - /* [out] */ BYTE **lpDib); - - -void __RPC_STUB IVMRWindowlessControl_GetCurrentImage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRWindowlessControl_SetBorderColor_Proxy( - IVMRWindowlessControl * This, - /* [in] */ COLORREF Clr); - - -void __RPC_STUB IVMRWindowlessControl_SetBorderColor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRWindowlessControl_GetBorderColor_Proxy( - IVMRWindowlessControl * This, - /* [out] */ COLORREF *lpClr); - - -void __RPC_STUB IVMRWindowlessControl_GetBorderColor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRWindowlessControl_SetColorKey_Proxy( - IVMRWindowlessControl * This, - /* [in] */ COLORREF Clr); - - -void __RPC_STUB IVMRWindowlessControl_SetColorKey_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRWindowlessControl_GetColorKey_Proxy( - IVMRWindowlessControl * This, - /* [out] */ COLORREF *lpClr); - - -void __RPC_STUB IVMRWindowlessControl_GetColorKey_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IVMRWindowlessControl_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0385 */ -/* [local] */ - -typedef /* [public] */ -enum __MIDL___MIDL_itf_strmif_0385_0001 - { MixerPref_NoDecimation = 0x1, - MixerPref_DecimateOutput = 0x2, - MixerPref_DecimateMask = 0xf, - MixerPref_BiLinearFiltering = 0x10, - MixerPref_PointFiltering = 0x20, - MixerPref_FilteringMask = 0xf0, - MixerPref_RenderTargetRGB = 0x100, - MixerPref_RenderTargetYUV420 = 0x200, - MixerPref_RenderTargetYUV422 = 0x400, - MixerPref_RenderTargetYUV444 = 0x800, - MixerPref_RenderTargetReserved = 0xf000, - MixerPref_RenderTargetMask = 0xff00 - } VMRMixerPrefs; - -typedef struct _NORMALIZEDRECT - { - float left; - float top; - float right; - float bottom; - } NORMALIZEDRECT; - -typedef struct _NORMALIZEDRECT *PNORMALIZEDRECT; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0385_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0385_v0_0_s_ifspec; - -#ifndef __IVMRMixerControl_INTERFACE_DEFINED__ -#define __IVMRMixerControl_INTERFACE_DEFINED__ - -/* interface IVMRMixerControl */ -/* [unique][helpstring][uuid][local][object][local] */ - - -EXTERN_C const IID IID_IVMRMixerControl; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("1c1a17b0-bed0-415d-974b-dc6696131599") - IVMRMixerControl : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetAlpha( - /* [in] */ DWORD dwStreamID, - /* [in] */ float Alpha) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAlpha( - /* [in] */ DWORD dwStreamID, - /* [out] */ float *pAlpha) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetZOrder( - /* [in] */ DWORD dwStreamID, - /* [in] */ DWORD dwZ) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetZOrder( - /* [in] */ DWORD dwStreamID, - /* [out] */ DWORD *pZ) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetOutputRect( - /* [in] */ DWORD dwStreamID, - /* [in] */ const NORMALIZEDRECT *pRect) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetOutputRect( - /* [in] */ DWORD dwStreamID, - /* [out] */ NORMALIZEDRECT *pRect) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetBackgroundClr( - /* [in] */ COLORREF ClrBkg) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBackgroundClr( - /* [in] */ COLORREF *lpClrBkg) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMixingPrefs( - /* [in] */ DWORD dwMixerPrefs) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMixingPrefs( - /* [out] */ DWORD *pdwMixerPrefs) = 0; - - }; - -#else /* C style interface */ - - typedef struct IVMRMixerControlVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IVMRMixerControl * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IVMRMixerControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IVMRMixerControl * This); - - HRESULT ( STDMETHODCALLTYPE *SetAlpha )( - IVMRMixerControl * This, - /* [in] */ DWORD dwStreamID, - /* [in] */ float Alpha); - - HRESULT ( STDMETHODCALLTYPE *GetAlpha )( - IVMRMixerControl * This, - /* [in] */ DWORD dwStreamID, - /* [out] */ float *pAlpha); - - HRESULT ( STDMETHODCALLTYPE *SetZOrder )( - IVMRMixerControl * This, - /* [in] */ DWORD dwStreamID, - /* [in] */ DWORD dwZ); - - HRESULT ( STDMETHODCALLTYPE *GetZOrder )( - IVMRMixerControl * This, - /* [in] */ DWORD dwStreamID, - /* [out] */ DWORD *pZ); - - HRESULT ( STDMETHODCALLTYPE *SetOutputRect )( - IVMRMixerControl * This, - /* [in] */ DWORD dwStreamID, - /* [in] */ const NORMALIZEDRECT *pRect); - - HRESULT ( STDMETHODCALLTYPE *GetOutputRect )( - IVMRMixerControl * This, - /* [in] */ DWORD dwStreamID, - /* [out] */ NORMALIZEDRECT *pRect); - - HRESULT ( STDMETHODCALLTYPE *SetBackgroundClr )( - IVMRMixerControl * This, - /* [in] */ COLORREF ClrBkg); - - HRESULT ( STDMETHODCALLTYPE *GetBackgroundClr )( - IVMRMixerControl * This, - /* [in] */ COLORREF *lpClrBkg); - - HRESULT ( STDMETHODCALLTYPE *SetMixingPrefs )( - IVMRMixerControl * This, - /* [in] */ DWORD dwMixerPrefs); - - HRESULT ( STDMETHODCALLTYPE *GetMixingPrefs )( - IVMRMixerControl * This, - /* [out] */ DWORD *pdwMixerPrefs); - - END_INTERFACE - } IVMRMixerControlVtbl; - - interface IVMRMixerControl - { - CONST_VTBL struct IVMRMixerControlVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IVMRMixerControl_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IVMRMixerControl_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IVMRMixerControl_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IVMRMixerControl_SetAlpha(This,dwStreamID,Alpha) \ - (This)->lpVtbl -> SetAlpha(This,dwStreamID,Alpha) - -#define IVMRMixerControl_GetAlpha(This,dwStreamID,pAlpha) \ - (This)->lpVtbl -> GetAlpha(This,dwStreamID,pAlpha) - -#define IVMRMixerControl_SetZOrder(This,dwStreamID,dwZ) \ - (This)->lpVtbl -> SetZOrder(This,dwStreamID,dwZ) - -#define IVMRMixerControl_GetZOrder(This,dwStreamID,pZ) \ - (This)->lpVtbl -> GetZOrder(This,dwStreamID,pZ) - -#define IVMRMixerControl_SetOutputRect(This,dwStreamID,pRect) \ - (This)->lpVtbl -> SetOutputRect(This,dwStreamID,pRect) - -#define IVMRMixerControl_GetOutputRect(This,dwStreamID,pRect) \ - (This)->lpVtbl -> GetOutputRect(This,dwStreamID,pRect) - -#define IVMRMixerControl_SetBackgroundClr(This,ClrBkg) \ - (This)->lpVtbl -> SetBackgroundClr(This,ClrBkg) - -#define IVMRMixerControl_GetBackgroundClr(This,lpClrBkg) \ - (This)->lpVtbl -> GetBackgroundClr(This,lpClrBkg) - -#define IVMRMixerControl_SetMixingPrefs(This,dwMixerPrefs) \ - (This)->lpVtbl -> SetMixingPrefs(This,dwMixerPrefs) - -#define IVMRMixerControl_GetMixingPrefs(This,pdwMixerPrefs) \ - (This)->lpVtbl -> GetMixingPrefs(This,pdwMixerPrefs) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IVMRMixerControl_SetAlpha_Proxy( - IVMRMixerControl * This, - /* [in] */ DWORD dwStreamID, - /* [in] */ float Alpha); - - -void __RPC_STUB IVMRMixerControl_SetAlpha_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRMixerControl_GetAlpha_Proxy( - IVMRMixerControl * This, - /* [in] */ DWORD dwStreamID, - /* [out] */ float *pAlpha); - - -void __RPC_STUB IVMRMixerControl_GetAlpha_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRMixerControl_SetZOrder_Proxy( - IVMRMixerControl * This, - /* [in] */ DWORD dwStreamID, - /* [in] */ DWORD dwZ); - - -void __RPC_STUB IVMRMixerControl_SetZOrder_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRMixerControl_GetZOrder_Proxy( - IVMRMixerControl * This, - /* [in] */ DWORD dwStreamID, - /* [out] */ DWORD *pZ); - - -void __RPC_STUB IVMRMixerControl_GetZOrder_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRMixerControl_SetOutputRect_Proxy( - IVMRMixerControl * This, - /* [in] */ DWORD dwStreamID, - /* [in] */ const NORMALIZEDRECT *pRect); - - -void __RPC_STUB IVMRMixerControl_SetOutputRect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRMixerControl_GetOutputRect_Proxy( - IVMRMixerControl * This, - /* [in] */ DWORD dwStreamID, - /* [out] */ NORMALIZEDRECT *pRect); - - -void __RPC_STUB IVMRMixerControl_GetOutputRect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRMixerControl_SetBackgroundClr_Proxy( - IVMRMixerControl * This, - /* [in] */ COLORREF ClrBkg); - - -void __RPC_STUB IVMRMixerControl_SetBackgroundClr_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRMixerControl_GetBackgroundClr_Proxy( - IVMRMixerControl * This, - /* [in] */ COLORREF *lpClrBkg); - - -void __RPC_STUB IVMRMixerControl_GetBackgroundClr_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRMixerControl_SetMixingPrefs_Proxy( - IVMRMixerControl * This, - /* [in] */ DWORD dwMixerPrefs); - - -void __RPC_STUB IVMRMixerControl_SetMixingPrefs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRMixerControl_GetMixingPrefs_Proxy( - IVMRMixerControl * This, - /* [out] */ DWORD *pdwMixerPrefs); - - -void __RPC_STUB IVMRMixerControl_GetMixingPrefs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IVMRMixerControl_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0386 */ -/* [local] */ - -typedef struct tagVMRGUID - { - GUID *pGUID; - GUID GUID; - } VMRGUID; - -typedef struct tagVMRMONITORINFO - { - VMRGUID guid; - RECT rcMonitor; - HMONITOR hMon; - DWORD dwFlags; - wchar_t szDevice[ 32 ]; - wchar_t szDescription[ 256 ]; - LARGE_INTEGER liDriverVersion; - DWORD dwVendorId; - DWORD dwDeviceId; - DWORD dwSubSysId; - DWORD dwRevision; - } VMRMONITORINFO; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0386_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0386_v0_0_s_ifspec; - -#ifndef __IVMRMonitorConfig_INTERFACE_DEFINED__ -#define __IVMRMonitorConfig_INTERFACE_DEFINED__ - -/* interface IVMRMonitorConfig */ -/* [unique][helpstring][uuid][local][object] */ - - -EXTERN_C const IID IID_IVMRMonitorConfig; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("9cf0b1b6-fbaa-4b7f-88cf-cf1f130a0dce") - IVMRMonitorConfig : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetMonitor( - /* [in] */ const VMRGUID *pGUID) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMonitor( - /* [out] */ VMRGUID *pGUID) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDefaultMonitor( - /* [in] */ const VMRGUID *pGUID) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDefaultMonitor( - /* [out] */ VMRGUID *pGUID) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailableMonitors( - /* [size_is][out] */ VMRMONITORINFO *pInfo, - /* [in] */ DWORD dwMaxInfoArraySize, - /* [out] */ DWORD *pdwNumDevices) = 0; - - }; - -#else /* C style interface */ - - typedef struct IVMRMonitorConfigVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IVMRMonitorConfig * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IVMRMonitorConfig * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IVMRMonitorConfig * This); - - HRESULT ( STDMETHODCALLTYPE *SetMonitor )( - IVMRMonitorConfig * This, - /* [in] */ const VMRGUID *pGUID); - - HRESULT ( STDMETHODCALLTYPE *GetMonitor )( - IVMRMonitorConfig * This, - /* [out] */ VMRGUID *pGUID); - - HRESULT ( STDMETHODCALLTYPE *SetDefaultMonitor )( - IVMRMonitorConfig * This, - /* [in] */ const VMRGUID *pGUID); - - HRESULT ( STDMETHODCALLTYPE *GetDefaultMonitor )( - IVMRMonitorConfig * This, - /* [out] */ VMRGUID *pGUID); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableMonitors )( - IVMRMonitorConfig * This, - /* [size_is][out] */ VMRMONITORINFO *pInfo, - /* [in] */ DWORD dwMaxInfoArraySize, - /* [out] */ DWORD *pdwNumDevices); - - END_INTERFACE - } IVMRMonitorConfigVtbl; - - interface IVMRMonitorConfig - { - CONST_VTBL struct IVMRMonitorConfigVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IVMRMonitorConfig_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IVMRMonitorConfig_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IVMRMonitorConfig_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IVMRMonitorConfig_SetMonitor(This,pGUID) \ - (This)->lpVtbl -> SetMonitor(This,pGUID) - -#define IVMRMonitorConfig_GetMonitor(This,pGUID) \ - (This)->lpVtbl -> GetMonitor(This,pGUID) - -#define IVMRMonitorConfig_SetDefaultMonitor(This,pGUID) \ - (This)->lpVtbl -> SetDefaultMonitor(This,pGUID) - -#define IVMRMonitorConfig_GetDefaultMonitor(This,pGUID) \ - (This)->lpVtbl -> GetDefaultMonitor(This,pGUID) - -#define IVMRMonitorConfig_GetAvailableMonitors(This,pInfo,dwMaxInfoArraySize,pdwNumDevices) \ - (This)->lpVtbl -> GetAvailableMonitors(This,pInfo,dwMaxInfoArraySize,pdwNumDevices) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IVMRMonitorConfig_SetMonitor_Proxy( - IVMRMonitorConfig * This, - /* [in] */ const VMRGUID *pGUID); - - -void __RPC_STUB IVMRMonitorConfig_SetMonitor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRMonitorConfig_GetMonitor_Proxy( - IVMRMonitorConfig * This, - /* [out] */ VMRGUID *pGUID); - - -void __RPC_STUB IVMRMonitorConfig_GetMonitor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRMonitorConfig_SetDefaultMonitor_Proxy( - IVMRMonitorConfig * This, - /* [in] */ const VMRGUID *pGUID); - - -void __RPC_STUB IVMRMonitorConfig_SetDefaultMonitor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRMonitorConfig_GetDefaultMonitor_Proxy( - IVMRMonitorConfig * This, - /* [out] */ VMRGUID *pGUID); - - -void __RPC_STUB IVMRMonitorConfig_GetDefaultMonitor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRMonitorConfig_GetAvailableMonitors_Proxy( - IVMRMonitorConfig * This, - /* [size_is][out] */ VMRMONITORINFO *pInfo, - /* [in] */ DWORD dwMaxInfoArraySize, - /* [out] */ DWORD *pdwNumDevices); - - -void __RPC_STUB IVMRMonitorConfig_GetAvailableMonitors_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IVMRMonitorConfig_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0387 */ -/* [local] */ - -typedef /* [public] */ -enum __MIDL___MIDL_itf_strmif_0387_0001 - { RenderPrefs_ForceOffscreen = 0x1, - RenderPrefs_ForceOverlays = 0x2, - RenderPrefs_AllowOverlays = 0, - RenderPrefs_AllowOffscreen = 0, - RenderPrefs_DoNotRenderColorKeyAndBorder = 0x8, - RenderPrefs_RestrictToInitialMonitor = 0x10, - RenderPrefs_PreferAGPMemWhenMixing = 0x20, - RenderPrefs_Mask = 0x3f - } VMRRenderPrefs; - -typedef /* [public] */ -enum __MIDL___MIDL_itf_strmif_0387_0002 - { VMRMode_Windowed = 0x1, - VMRMode_Windowless = 0x2, - VMRMode_Renderless = 0x4, - VMRMode_Mask = 0x7 - } VMRMode; - - -enum __MIDL___MIDL_itf_strmif_0387_0003 - { MAX_NUMBER_OF_STREAMS = 16 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0387_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0387_v0_0_s_ifspec; - -#ifndef __IVMRFilterConfig_INTERFACE_DEFINED__ -#define __IVMRFilterConfig_INTERFACE_DEFINED__ - -/* interface IVMRFilterConfig */ -/* [unique][helpstring][uuid][local][object] */ - - -EXTERN_C const IID IID_IVMRFilterConfig; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("9e5530c5-7034-48b4-bb46-0b8a6efc8e36") - IVMRFilterConfig : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetImageCompositor( - /* [in] */ IVMRImageCompositor *lpVMRImgCompositor) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetNumberOfStreams( - /* [in] */ DWORD dwMaxStreams) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetNumberOfStreams( - /* [out] */ DWORD *pdwMaxStreams) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetRenderingPrefs( - /* [in] */ DWORD dwRenderFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetRenderingPrefs( - /* [out] */ DWORD *pdwRenderFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetRenderingMode( - /* [in] */ DWORD Mode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetRenderingMode( - /* [out] */ DWORD *pMode) = 0; - - }; - -#else /* C style interface */ - - typedef struct IVMRFilterConfigVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IVMRFilterConfig * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IVMRFilterConfig * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IVMRFilterConfig * This); - - HRESULT ( STDMETHODCALLTYPE *SetImageCompositor )( - IVMRFilterConfig * This, - /* [in] */ IVMRImageCompositor *lpVMRImgCompositor); - - HRESULT ( STDMETHODCALLTYPE *SetNumberOfStreams )( - IVMRFilterConfig * This, - /* [in] */ DWORD dwMaxStreams); - - HRESULT ( STDMETHODCALLTYPE *GetNumberOfStreams )( - IVMRFilterConfig * This, - /* [out] */ DWORD *pdwMaxStreams); - - HRESULT ( STDMETHODCALLTYPE *SetRenderingPrefs )( - IVMRFilterConfig * This, - /* [in] */ DWORD dwRenderFlags); - - HRESULT ( STDMETHODCALLTYPE *GetRenderingPrefs )( - IVMRFilterConfig * This, - /* [out] */ DWORD *pdwRenderFlags); - - HRESULT ( STDMETHODCALLTYPE *SetRenderingMode )( - IVMRFilterConfig * This, - /* [in] */ DWORD Mode); - - HRESULT ( STDMETHODCALLTYPE *GetRenderingMode )( - IVMRFilterConfig * This, - /* [out] */ DWORD *pMode); - - END_INTERFACE - } IVMRFilterConfigVtbl; - - interface IVMRFilterConfig - { - CONST_VTBL struct IVMRFilterConfigVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IVMRFilterConfig_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IVMRFilterConfig_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IVMRFilterConfig_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IVMRFilterConfig_SetImageCompositor(This,lpVMRImgCompositor) \ - (This)->lpVtbl -> SetImageCompositor(This,lpVMRImgCompositor) - -#define IVMRFilterConfig_SetNumberOfStreams(This,dwMaxStreams) \ - (This)->lpVtbl -> SetNumberOfStreams(This,dwMaxStreams) - -#define IVMRFilterConfig_GetNumberOfStreams(This,pdwMaxStreams) \ - (This)->lpVtbl -> GetNumberOfStreams(This,pdwMaxStreams) - -#define IVMRFilterConfig_SetRenderingPrefs(This,dwRenderFlags) \ - (This)->lpVtbl -> SetRenderingPrefs(This,dwRenderFlags) - -#define IVMRFilterConfig_GetRenderingPrefs(This,pdwRenderFlags) \ - (This)->lpVtbl -> GetRenderingPrefs(This,pdwRenderFlags) - -#define IVMRFilterConfig_SetRenderingMode(This,Mode) \ - (This)->lpVtbl -> SetRenderingMode(This,Mode) - -#define IVMRFilterConfig_GetRenderingMode(This,pMode) \ - (This)->lpVtbl -> GetRenderingMode(This,pMode) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IVMRFilterConfig_SetImageCompositor_Proxy( - IVMRFilterConfig * This, - /* [in] */ IVMRImageCompositor *lpVMRImgCompositor); - - -void __RPC_STUB IVMRFilterConfig_SetImageCompositor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRFilterConfig_SetNumberOfStreams_Proxy( - IVMRFilterConfig * This, - /* [in] */ DWORD dwMaxStreams); - - -void __RPC_STUB IVMRFilterConfig_SetNumberOfStreams_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRFilterConfig_GetNumberOfStreams_Proxy( - IVMRFilterConfig * This, - /* [out] */ DWORD *pdwMaxStreams); - - -void __RPC_STUB IVMRFilterConfig_GetNumberOfStreams_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRFilterConfig_SetRenderingPrefs_Proxy( - IVMRFilterConfig * This, - /* [in] */ DWORD dwRenderFlags); - - -void __RPC_STUB IVMRFilterConfig_SetRenderingPrefs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRFilterConfig_GetRenderingPrefs_Proxy( - IVMRFilterConfig * This, - /* [out] */ DWORD *pdwRenderFlags); - - -void __RPC_STUB IVMRFilterConfig_GetRenderingPrefs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRFilterConfig_SetRenderingMode_Proxy( - IVMRFilterConfig * This, - /* [in] */ DWORD Mode); - - -void __RPC_STUB IVMRFilterConfig_SetRenderingMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRFilterConfig_GetRenderingMode_Proxy( - IVMRFilterConfig * This, - /* [out] */ DWORD *pMode); - - -void __RPC_STUB IVMRFilterConfig_GetRenderingMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IVMRFilterConfig_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0388 */ -/* [local] */ - -typedef struct _VMRALPHABITMAP - { - DWORD dwFlags; - HDC hdc; - LPDIRECTDRAWSURFACE7 pDDS; - RECT rSrc; - NORMALIZEDRECT rDest; - FLOAT fAlpha; - COLORREF clrSrcKey; - } VMRALPHABITMAP; - -typedef struct _VMRALPHABITMAP *PVMRALPHABITMAP; - -#define VMRBITMAP_DISABLE 0x00000001 -#define VMRBITMAP_HDC 0x00000002 -#define VMRBITMAP_ENTIREDDS 0x00000004 -#define VMRBITMAP_SRCCOLORKEY 0x00000008 -#define VMRBITMAP_SRCRECT 0x00000010 - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0388_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0388_v0_0_s_ifspec; - -#ifndef __IVMRMixerBitmap_INTERFACE_DEFINED__ -#define __IVMRMixerBitmap_INTERFACE_DEFINED__ - -/* interface IVMRMixerBitmap */ -/* [unique][helpstring][uuid][local][object] */ - - -EXTERN_C const IID IID_IVMRMixerBitmap; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("1E673275-0257-40aa-AF20-7C608D4A0428") - IVMRMixerBitmap : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetAlphaBitmap( - /* [in] */ const VMRALPHABITMAP *pBmpParms) = 0; - - virtual HRESULT STDMETHODCALLTYPE UpdateAlphaBitmapParameters( - /* [in] */ PVMRALPHABITMAP pBmpParms) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAlphaBitmapParameters( - /* [out] */ PVMRALPHABITMAP pBmpParms) = 0; - - }; - -#else /* C style interface */ - - typedef struct IVMRMixerBitmapVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IVMRMixerBitmap * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IVMRMixerBitmap * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IVMRMixerBitmap * This); - - HRESULT ( STDMETHODCALLTYPE *SetAlphaBitmap )( - IVMRMixerBitmap * This, - /* [in] */ const VMRALPHABITMAP *pBmpParms); - - HRESULT ( STDMETHODCALLTYPE *UpdateAlphaBitmapParameters )( - IVMRMixerBitmap * This, - /* [in] */ PVMRALPHABITMAP pBmpParms); - - HRESULT ( STDMETHODCALLTYPE *GetAlphaBitmapParameters )( - IVMRMixerBitmap * This, - /* [out] */ PVMRALPHABITMAP pBmpParms); - - END_INTERFACE - } IVMRMixerBitmapVtbl; - - interface IVMRMixerBitmap - { - CONST_VTBL struct IVMRMixerBitmapVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IVMRMixerBitmap_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IVMRMixerBitmap_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IVMRMixerBitmap_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IVMRMixerBitmap_SetAlphaBitmap(This,pBmpParms) \ - (This)->lpVtbl -> SetAlphaBitmap(This,pBmpParms) - -#define IVMRMixerBitmap_UpdateAlphaBitmapParameters(This,pBmpParms) \ - (This)->lpVtbl -> UpdateAlphaBitmapParameters(This,pBmpParms) - -#define IVMRMixerBitmap_GetAlphaBitmapParameters(This,pBmpParms) \ - (This)->lpVtbl -> GetAlphaBitmapParameters(This,pBmpParms) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IVMRMixerBitmap_SetAlphaBitmap_Proxy( - IVMRMixerBitmap * This, - /* [in] */ const VMRALPHABITMAP *pBmpParms); - - -void __RPC_STUB IVMRMixerBitmap_SetAlphaBitmap_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRMixerBitmap_UpdateAlphaBitmapParameters_Proxy( - IVMRMixerBitmap * This, - /* [in] */ PVMRALPHABITMAP pBmpParms); - - -void __RPC_STUB IVMRMixerBitmap_UpdateAlphaBitmapParameters_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRMixerBitmap_GetAlphaBitmapParameters_Proxy( - IVMRMixerBitmap * This, - /* [out] */ PVMRALPHABITMAP pBmpParms); - - -void __RPC_STUB IVMRMixerBitmap_GetAlphaBitmapParameters_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IVMRMixerBitmap_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_strmif_0389 */ -/* [local] */ - -typedef struct _VMRVIDEOSTREAMINFO - { - LPDIRECTDRAWSURFACE7 pddsVideoSurface; - DWORD dwWidth; - DWORD dwHeight; - DWORD dwStrmID; - FLOAT fAlpha; - DDCOLORKEY ddClrKey; - NORMALIZEDRECT rNormal; - } VMRVIDEOSTREAMINFO; - - - -extern RPC_IF_HANDLE __MIDL_itf_strmif_0389_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_strmif_0389_v0_0_s_ifspec; - -#ifndef __IVMRImageCompositor_INTERFACE_DEFINED__ -#define __IVMRImageCompositor_INTERFACE_DEFINED__ - -/* interface IVMRImageCompositor */ -/* [unique][helpstring][uuid][local][object][local] */ - - -EXTERN_C const IID IID_IVMRImageCompositor; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("7a4fb5af-479f-4074-bb40-ce6722e43c82") - IVMRImageCompositor : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE InitCompositionTarget( - /* [in] */ IUnknown *pD3DDevice, - /* [in] */ LPDIRECTDRAWSURFACE7 pddsRenderTarget) = 0; - - virtual HRESULT STDMETHODCALLTYPE TermCompositionTarget( - /* [in] */ IUnknown *pD3DDevice, - /* [in] */ LPDIRECTDRAWSURFACE7 pddsRenderTarget) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetStreamMediaType( - /* [in] */ DWORD dwStrmID, - /* [in] */ AM_MEDIA_TYPE *pmt, - /* [in] */ BOOL fTexture) = 0; - - virtual HRESULT STDMETHODCALLTYPE CompositeImage( - /* [in] */ IUnknown *pD3DDevice, - /* [in] */ LPDIRECTDRAWSURFACE7 pddsRenderTarget, - /* [in] */ AM_MEDIA_TYPE *pmtRenderTarget, - /* [in] */ REFERENCE_TIME rtStart, - /* [in] */ REFERENCE_TIME rtEnd, - /* [in] */ DWORD dwClrBkGnd, - /* [in] */ VMRVIDEOSTREAMINFO *pVideoStreamInfo, - /* [in] */ UINT cStreams) = 0; - - }; - -#else /* C style interface */ - - typedef struct IVMRImageCompositorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IVMRImageCompositor * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IVMRImageCompositor * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IVMRImageCompositor * This); - - HRESULT ( STDMETHODCALLTYPE *InitCompositionTarget )( - IVMRImageCompositor * This, - /* [in] */ IUnknown *pD3DDevice, - /* [in] */ LPDIRECTDRAWSURFACE7 pddsRenderTarget); - - HRESULT ( STDMETHODCALLTYPE *TermCompositionTarget )( - IVMRImageCompositor * This, - /* [in] */ IUnknown *pD3DDevice, - /* [in] */ LPDIRECTDRAWSURFACE7 pddsRenderTarget); - - HRESULT ( STDMETHODCALLTYPE *SetStreamMediaType )( - IVMRImageCompositor * This, - /* [in] */ DWORD dwStrmID, - /* [in] */ AM_MEDIA_TYPE *pmt, - /* [in] */ BOOL fTexture); - - HRESULT ( STDMETHODCALLTYPE *CompositeImage )( - IVMRImageCompositor * This, - /* [in] */ IUnknown *pD3DDevice, - /* [in] */ LPDIRECTDRAWSURFACE7 pddsRenderTarget, - /* [in] */ AM_MEDIA_TYPE *pmtRenderTarget, - /* [in] */ REFERENCE_TIME rtStart, - /* [in] */ REFERENCE_TIME rtEnd, - /* [in] */ DWORD dwClrBkGnd, - /* [in] */ VMRVIDEOSTREAMINFO *pVideoStreamInfo, - /* [in] */ UINT cStreams); - - END_INTERFACE - } IVMRImageCompositorVtbl; - - interface IVMRImageCompositor - { - CONST_VTBL struct IVMRImageCompositorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IVMRImageCompositor_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IVMRImageCompositor_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IVMRImageCompositor_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IVMRImageCompositor_InitCompositionTarget(This,pD3DDevice,pddsRenderTarget) \ - (This)->lpVtbl -> InitCompositionTarget(This,pD3DDevice,pddsRenderTarget) - -#define IVMRImageCompositor_TermCompositionTarget(This,pD3DDevice,pddsRenderTarget) \ - (This)->lpVtbl -> TermCompositionTarget(This,pD3DDevice,pddsRenderTarget) - -#define IVMRImageCompositor_SetStreamMediaType(This,dwStrmID,pmt,fTexture) \ - (This)->lpVtbl -> SetStreamMediaType(This,dwStrmID,pmt,fTexture) - -#define IVMRImageCompositor_CompositeImage(This,pD3DDevice,pddsRenderTarget,pmtRenderTarget,rtStart,rtEnd,dwClrBkGnd,pVideoStreamInfo,cStreams) \ - (This)->lpVtbl -> CompositeImage(This,pD3DDevice,pddsRenderTarget,pmtRenderTarget,rtStart,rtEnd,dwClrBkGnd,pVideoStreamInfo,cStreams) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IVMRImageCompositor_InitCompositionTarget_Proxy( - IVMRImageCompositor * This, - /* [in] */ IUnknown *pD3DDevice, - /* [in] */ LPDIRECTDRAWSURFACE7 pddsRenderTarget); - - -void __RPC_STUB IVMRImageCompositor_InitCompositionTarget_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRImageCompositor_TermCompositionTarget_Proxy( - IVMRImageCompositor * This, - /* [in] */ IUnknown *pD3DDevice, - /* [in] */ LPDIRECTDRAWSURFACE7 pddsRenderTarget); - - -void __RPC_STUB IVMRImageCompositor_TermCompositionTarget_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRImageCompositor_SetStreamMediaType_Proxy( - IVMRImageCompositor * This, - /* [in] */ DWORD dwStrmID, - /* [in] */ AM_MEDIA_TYPE *pmt, - /* [in] */ BOOL fTexture); - - -void __RPC_STUB IVMRImageCompositor_SetStreamMediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRImageCompositor_CompositeImage_Proxy( - IVMRImageCompositor * This, - /* [in] */ IUnknown *pD3DDevice, - /* [in] */ LPDIRECTDRAWSURFACE7 pddsRenderTarget, - /* [in] */ AM_MEDIA_TYPE *pmtRenderTarget, - /* [in] */ REFERENCE_TIME rtStart, - /* [in] */ REFERENCE_TIME rtEnd, - /* [in] */ DWORD dwClrBkGnd, - /* [in] */ VMRVIDEOSTREAMINFO *pVideoStreamInfo, - /* [in] */ UINT cStreams); - - -void __RPC_STUB IVMRImageCompositor_CompositeImage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IVMRImageCompositor_INTERFACE_DEFINED__ */ - - -#ifndef __IVMRVideoStreamControl_INTERFACE_DEFINED__ -#define __IVMRVideoStreamControl_INTERFACE_DEFINED__ - -/* interface IVMRVideoStreamControl */ -/* [unique][helpstring][uuid][local][object] */ - - -EXTERN_C const IID IID_IVMRVideoStreamControl; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("058d1f11-2a54-4bef-bd54-df706626b727") - IVMRVideoStreamControl : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetColorKey( - /* [in] */ LPDDCOLORKEY lpClrKey) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetColorKey( - /* [out] */ LPDDCOLORKEY lpClrKey) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetStreamActiveState( - /* [in] */ BOOL fActive) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetStreamActiveState( - /* [out] */ BOOL *lpfActive) = 0; - - }; - -#else /* C style interface */ - - typedef struct IVMRVideoStreamControlVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IVMRVideoStreamControl * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IVMRVideoStreamControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IVMRVideoStreamControl * This); - - HRESULT ( STDMETHODCALLTYPE *SetColorKey )( - IVMRVideoStreamControl * This, - /* [in] */ LPDDCOLORKEY lpClrKey); - - HRESULT ( STDMETHODCALLTYPE *GetColorKey )( - IVMRVideoStreamControl * This, - /* [out] */ LPDDCOLORKEY lpClrKey); - - HRESULT ( STDMETHODCALLTYPE *SetStreamActiveState )( - IVMRVideoStreamControl * This, - /* [in] */ BOOL fActive); - - HRESULT ( STDMETHODCALLTYPE *GetStreamActiveState )( - IVMRVideoStreamControl * This, - /* [out] */ BOOL *lpfActive); - - END_INTERFACE - } IVMRVideoStreamControlVtbl; - - interface IVMRVideoStreamControl - { - CONST_VTBL struct IVMRVideoStreamControlVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IVMRVideoStreamControl_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IVMRVideoStreamControl_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IVMRVideoStreamControl_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IVMRVideoStreamControl_SetColorKey(This,lpClrKey) \ - (This)->lpVtbl -> SetColorKey(This,lpClrKey) - -#define IVMRVideoStreamControl_GetColorKey(This,lpClrKey) \ - (This)->lpVtbl -> GetColorKey(This,lpClrKey) - -#define IVMRVideoStreamControl_SetStreamActiveState(This,fActive) \ - (This)->lpVtbl -> SetStreamActiveState(This,fActive) - -#define IVMRVideoStreamControl_GetStreamActiveState(This,lpfActive) \ - (This)->lpVtbl -> GetStreamActiveState(This,lpfActive) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IVMRVideoStreamControl_SetColorKey_Proxy( - IVMRVideoStreamControl * This, - /* [in] */ LPDDCOLORKEY lpClrKey); - - -void __RPC_STUB IVMRVideoStreamControl_SetColorKey_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRVideoStreamControl_GetColorKey_Proxy( - IVMRVideoStreamControl * This, - /* [out] */ LPDDCOLORKEY lpClrKey); - - -void __RPC_STUB IVMRVideoStreamControl_GetColorKey_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRVideoStreamControl_SetStreamActiveState_Proxy( - IVMRVideoStreamControl * This, - /* [in] */ BOOL fActive); - - -void __RPC_STUB IVMRVideoStreamControl_SetStreamActiveState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRVideoStreamControl_GetStreamActiveState_Proxy( - IVMRVideoStreamControl * This, - /* [out] */ BOOL *lpfActive); - - -void __RPC_STUB IVMRVideoStreamControl_GetStreamActiveState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IVMRVideoStreamControl_INTERFACE_DEFINED__ */ - - -#ifndef __IVMRSurface_INTERFACE_DEFINED__ -#define __IVMRSurface_INTERFACE_DEFINED__ - -/* interface IVMRSurface */ -/* [unique][helpstring][uuid][local][object][local] */ - - -EXTERN_C const IID IID_IVMRSurface; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("a9849bbe-9ec8-4263-b764-62730f0d15d0") - IVMRSurface : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE IsSurfaceLocked( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE LockSurface( - /* [out] */ BYTE **lpSurface) = 0; - - virtual HRESULT STDMETHODCALLTYPE UnlockSurface( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSurface( - /* [out] */ LPDIRECTDRAWSURFACE7 *lplpSurface) = 0; - - }; - -#else /* C style interface */ - - typedef struct IVMRSurfaceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IVMRSurface * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IVMRSurface * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IVMRSurface * This); - - HRESULT ( STDMETHODCALLTYPE *IsSurfaceLocked )( - IVMRSurface * This); - - HRESULT ( STDMETHODCALLTYPE *LockSurface )( - IVMRSurface * This, - /* [out] */ BYTE **lpSurface); - - HRESULT ( STDMETHODCALLTYPE *UnlockSurface )( - IVMRSurface * This); - - HRESULT ( STDMETHODCALLTYPE *GetSurface )( - IVMRSurface * This, - /* [out] */ LPDIRECTDRAWSURFACE7 *lplpSurface); - - END_INTERFACE - } IVMRSurfaceVtbl; - - interface IVMRSurface - { - CONST_VTBL struct IVMRSurfaceVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IVMRSurface_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IVMRSurface_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IVMRSurface_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IVMRSurface_IsSurfaceLocked(This) \ - (This)->lpVtbl -> IsSurfaceLocked(This) - -#define IVMRSurface_LockSurface(This,lpSurface) \ - (This)->lpVtbl -> LockSurface(This,lpSurface) - -#define IVMRSurface_UnlockSurface(This) \ - (This)->lpVtbl -> UnlockSurface(This) - -#define IVMRSurface_GetSurface(This,lplpSurface) \ - (This)->lpVtbl -> GetSurface(This,lplpSurface) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IVMRSurface_IsSurfaceLocked_Proxy( - IVMRSurface * This); - - -void __RPC_STUB IVMRSurface_IsSurfaceLocked_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRSurface_LockSurface_Proxy( - IVMRSurface * This, - /* [out] */ BYTE **lpSurface); - - -void __RPC_STUB IVMRSurface_LockSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRSurface_UnlockSurface_Proxy( - IVMRSurface * This); - - -void __RPC_STUB IVMRSurface_UnlockSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRSurface_GetSurface_Proxy( - IVMRSurface * This, - /* [out] */ LPDIRECTDRAWSURFACE7 *lplpSurface); - - -void __RPC_STUB IVMRSurface_GetSurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IVMRSurface_INTERFACE_DEFINED__ */ - - -#ifndef __IVMRImagePresenterConfig_INTERFACE_DEFINED__ -#define __IVMRImagePresenterConfig_INTERFACE_DEFINED__ - -/* interface IVMRImagePresenterConfig */ -/* [unique][helpstring][uuid][local][object][local] */ - - -EXTERN_C const IID IID_IVMRImagePresenterConfig; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("9f3a1c85-8555-49ba-935f-be5b5b29d178") - IVMRImagePresenterConfig : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetRenderingPrefs( - /* [in] */ DWORD dwRenderFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetRenderingPrefs( - /* [out] */ DWORD *dwRenderFlags) = 0; - - }; - -#else /* C style interface */ - - typedef struct IVMRImagePresenterConfigVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IVMRImagePresenterConfig * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IVMRImagePresenterConfig * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IVMRImagePresenterConfig * This); - - HRESULT ( STDMETHODCALLTYPE *SetRenderingPrefs )( - IVMRImagePresenterConfig * This, - /* [in] */ DWORD dwRenderFlags); - - HRESULT ( STDMETHODCALLTYPE *GetRenderingPrefs )( - IVMRImagePresenterConfig * This, - /* [out] */ DWORD *dwRenderFlags); - - END_INTERFACE - } IVMRImagePresenterConfigVtbl; - - interface IVMRImagePresenterConfig - { - CONST_VTBL struct IVMRImagePresenterConfigVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IVMRImagePresenterConfig_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IVMRImagePresenterConfig_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IVMRImagePresenterConfig_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IVMRImagePresenterConfig_SetRenderingPrefs(This,dwRenderFlags) \ - (This)->lpVtbl -> SetRenderingPrefs(This,dwRenderFlags) - -#define IVMRImagePresenterConfig_GetRenderingPrefs(This,dwRenderFlags) \ - (This)->lpVtbl -> GetRenderingPrefs(This,dwRenderFlags) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IVMRImagePresenterConfig_SetRenderingPrefs_Proxy( - IVMRImagePresenterConfig * This, - /* [in] */ DWORD dwRenderFlags); - - -void __RPC_STUB IVMRImagePresenterConfig_SetRenderingPrefs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRImagePresenterConfig_GetRenderingPrefs_Proxy( - IVMRImagePresenterConfig * This, - /* [out] */ DWORD *dwRenderFlags); - - -void __RPC_STUB IVMRImagePresenterConfig_GetRenderingPrefs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IVMRImagePresenterConfig_INTERFACE_DEFINED__ */ - - -#ifndef __IVMRImagePresenterExclModeConfig_INTERFACE_DEFINED__ -#define __IVMRImagePresenterExclModeConfig_INTERFACE_DEFINED__ - -/* interface IVMRImagePresenterExclModeConfig */ -/* [unique][helpstring][uuid][local][object][local] */ - - -EXTERN_C const IID IID_IVMRImagePresenterExclModeConfig; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("e6f7ce40-4673-44f1-8f77-5499d68cb4ea") - IVMRImagePresenterExclModeConfig : public IVMRImagePresenterConfig - { - public: - virtual HRESULT STDMETHODCALLTYPE SetXlcModeDDObjAndPrimarySurface( - /* [in] */ LPDIRECTDRAW7 lpDDObj, - /* [in] */ LPDIRECTDRAWSURFACE7 lpPrimarySurf) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetXlcModeDDObjAndPrimarySurface( - /* [out] */ LPDIRECTDRAW7 *lpDDObj, - /* [out] */ LPDIRECTDRAWSURFACE7 *lpPrimarySurf) = 0; - - }; - -#else /* C style interface */ - - typedef struct IVMRImagePresenterExclModeConfigVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IVMRImagePresenterExclModeConfig * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IVMRImagePresenterExclModeConfig * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IVMRImagePresenterExclModeConfig * This); - - HRESULT ( STDMETHODCALLTYPE *SetRenderingPrefs )( - IVMRImagePresenterExclModeConfig * This, - /* [in] */ DWORD dwRenderFlags); - - HRESULT ( STDMETHODCALLTYPE *GetRenderingPrefs )( - IVMRImagePresenterExclModeConfig * This, - /* [out] */ DWORD *dwRenderFlags); - - HRESULT ( STDMETHODCALLTYPE *SetXlcModeDDObjAndPrimarySurface )( - IVMRImagePresenterExclModeConfig * This, - /* [in] */ LPDIRECTDRAW7 lpDDObj, - /* [in] */ LPDIRECTDRAWSURFACE7 lpPrimarySurf); - - HRESULT ( STDMETHODCALLTYPE *GetXlcModeDDObjAndPrimarySurface )( - IVMRImagePresenterExclModeConfig * This, - /* [out] */ LPDIRECTDRAW7 *lpDDObj, - /* [out] */ LPDIRECTDRAWSURFACE7 *lpPrimarySurf); - - END_INTERFACE - } IVMRImagePresenterExclModeConfigVtbl; - - interface IVMRImagePresenterExclModeConfig - { - CONST_VTBL struct IVMRImagePresenterExclModeConfigVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IVMRImagePresenterExclModeConfig_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IVMRImagePresenterExclModeConfig_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IVMRImagePresenterExclModeConfig_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IVMRImagePresenterExclModeConfig_SetRenderingPrefs(This,dwRenderFlags) \ - (This)->lpVtbl -> SetRenderingPrefs(This,dwRenderFlags) - -#define IVMRImagePresenterExclModeConfig_GetRenderingPrefs(This,dwRenderFlags) \ - (This)->lpVtbl -> GetRenderingPrefs(This,dwRenderFlags) - - -#define IVMRImagePresenterExclModeConfig_SetXlcModeDDObjAndPrimarySurface(This,lpDDObj,lpPrimarySurf) \ - (This)->lpVtbl -> SetXlcModeDDObjAndPrimarySurface(This,lpDDObj,lpPrimarySurf) - -#define IVMRImagePresenterExclModeConfig_GetXlcModeDDObjAndPrimarySurface(This,lpDDObj,lpPrimarySurf) \ - (This)->lpVtbl -> GetXlcModeDDObjAndPrimarySurface(This,lpDDObj,lpPrimarySurf) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IVMRImagePresenterExclModeConfig_SetXlcModeDDObjAndPrimarySurface_Proxy( - IVMRImagePresenterExclModeConfig * This, - /* [in] */ LPDIRECTDRAW7 lpDDObj, - /* [in] */ LPDIRECTDRAWSURFACE7 lpPrimarySurf); - - -void __RPC_STUB IVMRImagePresenterExclModeConfig_SetXlcModeDDObjAndPrimarySurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVMRImagePresenterExclModeConfig_GetXlcModeDDObjAndPrimarySurface_Proxy( - IVMRImagePresenterExclModeConfig * This, - /* [out] */ LPDIRECTDRAW7 *lpDDObj, - /* [out] */ LPDIRECTDRAWSURFACE7 *lpPrimarySurf); - - -void __RPC_STUB IVMRImagePresenterExclModeConfig_GetXlcModeDDObjAndPrimarySurface_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IVMRImagePresenterExclModeConfig_INTERFACE_DEFINED__ */ - - -#ifndef __IVPManager_INTERFACE_DEFINED__ -#define __IVPManager_INTERFACE_DEFINED__ - -/* interface IVPManager */ -/* [unique][helpstring][uuid][local][object][local] */ - - -EXTERN_C const IID IID_IVPManager; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("aac18c18-e186-46d2-825d-a1f8dc8e395a") - IVPManager : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetVideoPortIndex( - /* [in] */ DWORD dwVideoPortIndex) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetVideoPortIndex( - /* [out] */ DWORD *pdwVideoPortIndex) = 0; - - }; - -#else /* C style interface */ - - typedef struct IVPManagerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IVPManager * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IVPManager * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IVPManager * This); - - HRESULT ( STDMETHODCALLTYPE *SetVideoPortIndex )( - IVPManager * This, - /* [in] */ DWORD dwVideoPortIndex); - - HRESULT ( STDMETHODCALLTYPE *GetVideoPortIndex )( - IVPManager * This, - /* [out] */ DWORD *pdwVideoPortIndex); - - END_INTERFACE - } IVPManagerVtbl; - - interface IVPManager - { - CONST_VTBL struct IVPManagerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IVPManager_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IVPManager_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IVPManager_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IVPManager_SetVideoPortIndex(This,dwVideoPortIndex) \ - (This)->lpVtbl -> SetVideoPortIndex(This,dwVideoPortIndex) - -#define IVPManager_GetVideoPortIndex(This,pdwVideoPortIndex) \ - (This)->lpVtbl -> GetVideoPortIndex(This,pdwVideoPortIndex) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IVPManager_SetVideoPortIndex_Proxy( - IVPManager * This, - /* [in] */ DWORD dwVideoPortIndex); - - -void __RPC_STUB IVPManager_SetVideoPortIndex_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IVPManager_GetVideoPortIndex_Proxy( - IVPManager * This, - /* [out] */ DWORD *pdwVideoPortIndex); - - -void __RPC_STUB IVPManager_GetVideoPortIndex_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IVPManager_INTERFACE_DEFINED__ */ - - -/* Additional Prototypes for ALL interfaces */ - -unsigned long __RPC_USER VARIANT_UserSize( unsigned long *, unsigned long , VARIANT * ); -unsigned char * __RPC_USER VARIANT_UserMarshal( unsigned long *, unsigned char *, VARIANT * ); -unsigned char * __RPC_USER VARIANT_UserUnmarshal(unsigned long *, unsigned char *, VARIANT * ); -void __RPC_USER VARIANT_UserFree( unsigned long *, VARIANT * ); - -/* [local] */ HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder_FindInterface_Proxy( - ICaptureGraphBuilder * This, - /* [unique][in] */ const GUID *pCategory, - /* [in] */ IBaseFilter *pf, - /* [in] */ REFIID riid, - /* [out] */ void **ppint); - - -/* [call_as] */ HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder_FindInterface_Stub( - ICaptureGraphBuilder * This, - /* [unique][in] */ const GUID *pCategory, - /* [in] */ IBaseFilter *pf, - /* [in] */ REFIID riid, - /* [out] */ IUnknown **ppint); - -/* [local] */ HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder2_FindInterface_Proxy( - ICaptureGraphBuilder2 * This, - /* [in] */ const GUID *pCategory, - /* [in] */ const GUID *pType, - /* [in] */ IBaseFilter *pf, - /* [in] */ REFIID riid, - /* [out] */ void **ppint); - - -/* [call_as] */ HRESULT STDMETHODCALLTYPE ICaptureGraphBuilder2_FindInterface_Stub( - ICaptureGraphBuilder2 * This, - /* [in] */ const GUID *pCategory, - /* [in] */ const GUID *pType, - /* [in] */ IBaseFilter *pf, - /* [in] */ REFIID riid, - /* [out] */ IUnknown **ppint); - -/* [local] */ HRESULT STDMETHODCALLTYPE IKsPropertySet_Set_Proxy( - IKsPropertySet * This, - /* [in] */ REFGUID guidPropSet, - /* [in] */ DWORD dwPropID, - /* [size_is][in] */ LPVOID pInstanceData, - /* [in] */ DWORD cbInstanceData, - /* [size_is][in] */ LPVOID pPropData, - /* [in] */ DWORD cbPropData); - - -/* [call_as] */ HRESULT STDMETHODCALLTYPE IKsPropertySet_Set_Stub( - IKsPropertySet * This, - /* [in] */ REFGUID guidPropSet, - /* [in] */ DWORD dwPropID, - /* [size_is][in] */ byte *pInstanceData, - /* [in] */ DWORD cbInstanceData, - /* [size_is][in] */ byte *pPropData, - /* [in] */ DWORD cbPropData); - -/* [local] */ HRESULT STDMETHODCALLTYPE IKsPropertySet_Get_Proxy( - IKsPropertySet * This, - /* [in] */ REFGUID guidPropSet, - /* [in] */ DWORD dwPropID, - /* [size_is][in] */ LPVOID pInstanceData, - /* [in] */ DWORD cbInstanceData, - /* [size_is][out] */ LPVOID pPropData, - /* [in] */ DWORD cbPropData, - /* [out] */ DWORD *pcbReturned); - - -/* [call_as] */ HRESULT STDMETHODCALLTYPE IKsPropertySet_Get_Stub( - IKsPropertySet * This, - /* [in] */ REFGUID guidPropSet, - /* [in] */ DWORD dwPropID, - /* [size_is][in] */ byte *pInstanceData, - /* [in] */ DWORD cbInstanceData, - /* [size_is][out] */ byte *pPropData, - /* [in] */ DWORD cbPropData, - /* [out] */ DWORD *pcbReturned); - - - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/tune.h b/import/DirectX8/include/tune.h deleted file mode 100644 index bf10da2f0..000000000 --- a/import/DirectX8/include/tune.h +++ /dev/null @@ -1,815 +0,0 @@ -//------------------------------------------------------------------------------ -// File: Tune.h -// -// Desc: Additional infrastructure to extend the tuner.idl. Works nicely -// from C++. -// -// Copyright (c) 1999 - 2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#pragma once - -#ifndef TUNE_H -#define TUNE_H - -#include - -namespace BDATuningModel { - -const long DEFAULT_MIN_CHANNEL = 2; -const long DEFAULT_MAX_CHANNEL = 999; -const long DEFAULT_MIN_FREQUENCY = 535; //bottom us am -const long DEFAULT_MAX_FREQUENCY = 108000; // top us fm -const long DEFAULT_ANALOG_TUNER_COUNTRY_CODE = 1; //usa -const TunerInputType DEFAULT_ANALOG_TUNER_INPUT_TYPE = TunerInputCable; //usa - -typedef CComQIPtr PQTuningSpaceContainer; -typedef CComQIPtr PQTuningSpace; -typedef CComQIPtr PQAnalogRadioTuningSpace; -typedef CComQIPtr PQAnalogTVTuningSpace; -typedef CComQIPtr PQATSCTuningSpace; -typedef CComQIPtr PQTuneRequest; -typedef CComQIPtr PQChannelTuneRequest; -typedef CComQIPtr PQATSCChannelTuneRequest; -typedef CComQIPtr PQLocator; -typedef CComQIPtr PQATSCLocator; -typedef CComQIPtr PQDVBTuningSpace; -typedef CComQIPtr PQDVBTuneRequest; -typedef CComQIPtr PQDVBSLocator; -typedef CComQIPtr PQDVBTLocator; - -// tuning space container -class TNTuningSpaceContainer : public PQTuningSpaceContainer { - TNTuningSpaceContainer() {} - TNTuningSpaceContainer(const PQTuningSpaceContainer &a) : PQTuningSpaceContainer(a) {} - TNTuningSpaceContainer(ITuningSpace *p) : PQTuningSpaceContainer(p) {} - TNTuningSpaceContainer(IUnknown *p) : PQTuningSpaceContainer(p) {} - TNTuningSpaceContainer(const TNTuningSpaceContainer &a) : PQTuningSpaceContainer(a) {} - TNTuningSpaceContainer& operator=(TNTuningSpaceContainer& rhs) { - PQTuningSpaceContainer::operator=(rhs); - return *this; - } - -}; - -// tuning spaces -template class TNTuningSpaceHelper : public TUNINGSPACETYPE { -public: - TNTuningSpaceHelper() {} - TNTuningSpaceHelper(const TUNINGSPACETYPE &a) : TUNINGSPACETYPE(a) {} - TNTuningSpaceHelper(ITuningSpace *p) : TUNINGSPACETYPE(p) {} - TNTuningSpaceHelper(IUnknown *p) : TUNINGSPACETYPE(p) {} - TNTuningSpaceHelper(const TNTuningSpaceHelper &a) : TUNINGSPACETYPE(a) {} - TNTuningSpaceHelper& operator=(TNTuningSpaceHelper& rhs) { - TUNINGSPACETYPE::operator=(rhs); - return *this; - } - TNTuningSpaceHelper& operator=(TUNINGSPACETYPE& rhs) { - TUNINGSPACETYPE::operator=(rhs); - return *this; - } - TNTuningSpaceHelper& operator=(IUnknown *rhs) { - TUNINGSPACETYPE::operator=(rhs); - return *this; - } - TNTuningSpaceHelper& operator=(ITuningSpace *rhs) { - TUNINGSPACETYPE::operator=(rhs); - return *this; - } - bool operator==(TUNINGSPACETYPE& rhs) { - CComBSTR rhsname; - HRESULT hr = rhs->get_UniqueName(&rhsname); - if (FAILED(hr)) { - return false; - } - CComBSTR name; - hr = (*this)->get_UniqueName(&name); - if (FAILED(hr)) { - return false; - } - return name == rhsname; - } - bool operator!=(TUNINGSPACETYPE& rhs) { - return !operator==(rhs); - } - PQTuneRequest CreateTuneRequest() { - PQTuneRequest p; - HRESULT hr = (*this)->CreateTuneRequest(&p); - if (FAILED(hr)) { - return PQTuneRequest(); - } - return p; - } - - PQLocator Locator() { - _ASSERT(*this); - PQLocator ts; - HRESULT hr = (*this)->get_DefaultLocator(&ts); - if (FAILED(hr)) { - return PQLocator(); - } - return ts; - } - - HRESULT Locator(PQLocator& l) { - _ASSERT(*this); - return (*this)->put_Locator(l); - } - - void Clone() { - PQTuningSpace t; - HRESULT hr = (*this)->Clone(&t); - if (FAILED(hr) || !t) { - Release(); // clone failed, clear ourselves - return; - } - TUNINGSPACETYPE::operator=(t); - } - -}; - -typedef TNTuningSpaceHelper TNTuningSpace; - -template class TNAnalogRadioTuningSpaceHelper : public TNTuningSpaceHelper { -public: - TNAnalogRadioTuningSpaceHelper() {} - TNAnalogRadioTuningSpaceHelper(const TUNINGSPACETYPE &a) : TNTuningSpaceHelper(a) {} - TNAnalogRadioTuningSpaceHelper(IUnknown *p) : TNTuningSpaceHelper(p) {} - TNAnalogRadioTuningSpaceHelper(const TNAnalogRadioTuningSpaceHelper &a) : TNTuningSpaceHelper(a) {} - TNAnalogRadioTuningSpaceHelper& operator=(TNAnalogRadioTuningSpaceHelper& rhs) { - TNTuningSpaceHelper::operator=(rhs); - return *this; - } - template TNAnalogRadioTuningSpaceHelper& operator=(TNTuningSpaceHelper& rhs) { - TNTuningSpaceHelper::operator=(TUNINGSPACETYPE(rhs)); - return *this; - } - TNAnalogRadioTuningSpaceHelper& operator=(TUNINGSPACETYPE& rhs) { - TNTuningSpaceHelper::operator=(rhs); - return *this; - } - TNAnalogRadioTuningSpaceHelper& operator=(IUnknown* rhs) { - TNTuningSpaceHelper::operator=(rhs); - return *this; - } - long MaxFrequency() { - _ASSERT(*this); - long freq; - HRESULT hr = (*this)->get_MaxFrequency(&freq); - if (FAILED(hr)) { - freq = DEFAULT_MAX_FREQUENCY; - } - return freq; - } - HRESULT MaxFrequency(long freq) { - _ASSERT(*this); - return (*this)->put_MaxFrequency(freq); - } - long MinFrequency() { - _ASSERT(*this); - long freq; - HRESULT hr = (*this)->get_MinFrequency(&freq); - if (FAILED(hr)) { - freq = DEFAULT_MIN_FREQUENCY; - } - return freq; - } - HRESULT MinFrequency(long freq) { - _ASSERT(*this); - return (*this)->put_MinFrequency(freq); - } -}; -typedef TNAnalogRadioTuningSpaceHelper TNAnalogRadioTuningSpace; - -template class TNAnalogTVTuningSpaceHelper : public TNTuningSpaceHelper { -public: - TNAnalogTVTuningSpaceHelper() {} - TNAnalogTVTuningSpaceHelper(const TUNINGSPACETYPE &a) : TNTuningSpaceHelper(a) {} - TNAnalogTVTuningSpaceHelper(IUnknown *p) : TNTuningSpaceHelper(p) {} - TNAnalogTVTuningSpaceHelper(const TNAnalogTVTuningSpaceHelper &a) : TNTuningSpaceHelper(a) {} - TNAnalogTVTuningSpaceHelper& operator=(TNAnalogTVTuningSpaceHelper& rhs) { - TNTuningSpaceHelper::operator=(rhs); - return *this; - } - template TNAnalogTVTuningSpaceHelper& operator=(TNTuningSpaceHelper& rhs) { - TNTuningSpaceHelper::operator=(TUNINGSPACETYPE(rhs)); - return *this; - } - TNAnalogTVTuningSpaceHelper& operator=(TUNINGSPACETYPE& rhs) { - TNTuningSpaceHelper::operator=(rhs); - return *this; - } - TNAnalogTVTuningSpaceHelper& operator=(IUnknown* rhs) { - TNTuningSpaceHelper::operator=(rhs); - return *this; - } - TunerInputType InputType() { - _ASSERT(*this); - TunerInputType ti; - HRESULT hr = (*this)->get_InputType(&ti); - if (FAILED(hr)) { - ti = DEFAULT_ANALOG_TUNER_INPUT_TYPE; - } - return ti; - } - HRESULT InputType(TunerInputType ti) { - _ASSERT(*this); - return (*this)->put_InputType(&ti); - } - long CountryCode() { - _ASSERT(*this); - long cc; - HRESULT hr = (*this)->get_CountryCode(&cc); - if (FAILED(hr)) { - cc = DEFAULT_ANALOG_TUNER_INPUT_TYPE; - } - return cc; - } - HRESULT CountryCode(long cc) { - _ASSERT(*this); - return (*this)->put_CountryCode(cc); - } - long MinChannel() { - _ASSERT(*this); - long chan; - HRESULT hr = (*this)->get_MinChannel(&chan); - if (FAILED(hr)) { - chan = DEFAULT_MIN_CHANNEL; - } - return chan; - } - HRESULT MinChannel(long chan) { - _ASSERT(*this); - return (*this)->put_MinChannel(chan); - } - long MaxChannel() { - _ASSERT(*this); - long chan; - HRESULT hr = (*this)->get_MaxChannel(&chan); - if (FAILED(hr)) { - chan = DEFAULT_MAX_CHANNEL; - } - return chan; - } - HRESULT MaxChannel(long chan) { - _ASSERT(*this); - return (*this)->put_MaxChannel(chan); - } -}; -typedef TNAnalogTVTuningSpaceHelper TNAnalogTVTuningSpace; - -template class TNATSCTuningSpaceHelper : public TNAnalogTVTuningSpaceHelper { -public: - TNATSCTuningSpaceHelper() {} - TNATSCTuningSpaceHelper(const TUNINGSPACETYPE &a) : TNAnalogTVTuningSpaceHelper(a) {} - TNATSCTuningSpaceHelper(IUnknown *p) : TNAnalogTVTuningSpaceHelper(p) {} - TNATSCTuningSpaceHelper(const TNATSCTuningSpaceHelper &a) : TNAnalogTVTuningSpaceHelper(a) {} - - TNATSCTuningSpaceHelper& operator=(TNATSCTuningSpaceHelper& rhs) { - TNAnalogTVTuningSpaceHelper::operator=(rhs); - return *this; - } - template TNATSCTuningSpaceHelper& operator=(TNTuningSpaceHelper& rhs) { - TNAnalogTVTuningSpaceHelper::operator=(TUNINGSPACETYPE(rhs)); - return *this; - } - TNATSCTuningSpaceHelper& operator=(TUNINGSPACETYPE& rhs) { - TNAnalogTVTuningSpaceHelper::operator=(rhs); - return *this; - } - TNATSCTuningSpaceHelper& operator=(IUnknown* rhs) { - TNAnalogTVTuningSpaceHelper::operator=(rhs); - return *this; - } - long MinMinorChannel() { - _ASSERT(*this); - long chan; - HRESULT hr = (*this)->get_MinMinorChannel(&chan); - if (FAILED(hr)) { - chan = DEFAULT_MIN_CHANNEL; - } - return chan; - } - HRESULT MinMinorChannel(long chan) { - _ASSERT(*this); - return (*this)->put_MinMinorChannel(chan); - } - - long MaxMinorChannel() { - _ASSERT(*this); - long chan; - HRESULT hr = (*this)->get_MaxMinorChannel(&chan); - if (FAILED(hr)) { - chan = DEFAULT_MAX_CHANNEL; - } - return chan; - } - HRESULT MaxMinorChannel(long chan) { - _ASSERT(*this); - return (*this)->put_MaxMinorChannel(chan); - } - long MinPhysicalChannel() { - _ASSERT(*this); - long chan; - HRESULT hr = (*this)->get_MinPhysicalChannel(&chan); - if (FAILED(hr)) { - chan = DEFAULT_MIN_CHANNEL; - } - return chan; - } - HRESULT MinPhysicalChannel(long chan) { - _ASSERT(*this); - return (*this)->put_MinPhysicalChannel(chan); - } - - long MaxPhysicalChannel() { - _ASSERT(*this); - long chan; - HRESULT hr = (*this)->get_MaxPhysicalChannel(&chan); - if (FAILED(hr)) { - chan = DEFAULT_MAX_CHANNEL; - } - return chan; - } - - HRESULT MaxPhysicalChannel(long chan) { - _ASSERT(*this); - return (*this)->put_MaxPhysicalChannel(chan); - } -}; -typedef TNATSCTuningSpaceHelper TNATSCTuningSpace; - -// dvb tuning space -template class TNDVBTuningSpaceHelper : public TNTuningSpaceHelper { -public: - TNDVBTuningSpaceHelper() {} - TNDVBTuningSpaceHelper(const TUNINGSPACETYPE &a) : TNTuningSpaceHelper(a) {} - TNDVBTuningSpaceHelper(IUnknown *p) : TNTuningSpaceHelper(p) {} - TNDVBTuningSpaceHelper(const TNDVBTuningSpaceHelper &a) : TNTuningSpaceHelper(a) {} - TNDVBTuningSpaceHelper& operator=(TNDVBTuningSpaceHelper& rhs) { - TNTuningSpaceHelper::operator=(rhs); - return *this; - } - template TNDVBTuningSpaceHelper& operator=(TNTuningSpaceHelper& rhs) { - TNTuningSpaceHelper::operator=(TUNINGSPACETYPE(rhs)); - return *this; - } - TNDVBTuningSpaceHelper& operator=(TUNINGSPACETYPE& rhs) { - TNTuningSpaceHelper::operator=(rhs); - return *this; - } - TNDVBTuningSpaceHelper& operator=(IUnknown* rhs) { - TNTuningSpaceHelper::operator=(rhs); - return *this; - } - DVBSystemType SystemType() const { - DVBSystemType st; - HRESULT hr = (*this)->get_SystemType(&st); - if (FAILED(hr)) { - return DVB_Cable; - } - return st; - } - HRESULT SystemType(DVBSystemType st) { - _ASSERT(*this); - return (*this)->put_SystemType(st); - } -}; -typedef TNDVBTuningSpaceHelper TNDVBTuningSpace; - -// locators -template class TNLocatorHelper : public LOCATORTYPE { -public: - TNLocatorHelper() {} - TNLocatorHelper(const LOCATORTYPE &a) : LOCATORTYPE(a) {} - TNLocatorHelper(IUnknown *p) : LOCATORTYPE(p) {} - TNLocatorHelper(const TNLocatorHelper &a) : LOCATORTYPE(a) {} - TNLocatorHelper(ILocator *p) : LOCATORTYPE(p) {} - TNLocatorHelper& operator=(TNLocatorHelper& rhs) { - LOCATORTYPE::operator=(rhs); - return *this; - } - TNLocatorHelper& operator=(LOCATORTYPE& rhs) { - LOCATORTYPE::operator=(rhs); - return *this; - } - TNLocatorHelper& operator=(ILocator* rhs) { - LOCATORTYPE::operator=(rhs); - return *this; - } - TNLocatorHelper& operator=(IUnknown* rhs) { - LOCATORTYPE::operator=(rhs); - return *this; - } - - void Clone() { - PQLocator t; - HRESULT hr = (*this)->Clone(&t); - if (FAILED(hr) || !t) { - Release(); // clone failed, clear ourselves - return; - } - LOCATORTYPE::operator=(t); - } - - long CarrierFrequency() { - _ASSERT(*this); - long f; - HRESULT hr = (*this)->get_CarrierFrequency(&f); - if (FAILED(hr)) { - return -1; - } - return f; - } - HRESULT CarrierFrequency(long f) { - _ASSERT(*this); - return (*this)->put_CarrierFrequency(f); - } - - FECMethod InnerFEC() { - _ASSERT(*this); - FECMethod f; - HRESULT hr = (*this)->get_InnerFEC(&f); - if (FAILED(hr)) { - return BDA_FEC_METHOD_NOT_SET; - } - return f; - } - HRESULT InnerFEC(FECMethod f) { - _ASSERT(*this); - return (*this)->put_InnerFEC(f); - } - BinaryConvolutionCodeRate InnerFECRate() { - _ASSERT(*this); - BinaryConvolutionCodeRate f; - HRESULT hr = (*this)->get_InnerFECRate(&f); - if (FAILED(hr)) { - return BDA_BCC_RATE_NOT_SET; - } - return f; - } - HRESULT InnerFECRate(BinaryConvolutionCodeRate f) { - _ASSERT(*this); - return (*this)->put_InnerFECRate(f); - } - FECMethod OuterFEC() { - _ASSERT(*this); - FECMethod f; - HRESULT hr = (*this)->get_OuterFEC(&f); - if (FAILED(hr)) { - return BDA_FEC_METHOD_NOT_SET; - } - return f; - } - HRESULT OuterFEC(FECMethod f) { - _ASSERT(*this); - return (*this)->put_OuterFEC(f); - } - BinaryConvolutionCodeRate OuterFECRate() { - _ASSERT(*this); - BinaryConvolutionCodeRate f; - HRESULT hr = (*this)->get_OuterFECRate(&f); - if (FAILED(hr)) { - return BDA_BCC_RATE_NOT_SET; - } - return f; - } - HRESULT OuterFECRate(BinaryConvolutionCodeRate f) { - _ASSERT(*this); - return (*this)->put_OuterFECRate(f); - } - ModulationType Modulation() { - _ASSERT(*this); - ModulationType f; - HRESULT hr = (*this)->get_Modulation(&f); - if (FAILED(hr)) { - return BDA_MOD_NOT_SET; - } - return f; - } - HRESULT Modulation(ModulationType f) { - _ASSERT(*this); - return (*this)->put_Modulation(f); - } - - long SymbolRate() { - _ASSERT(*this); - long f; - HRESULT hr = (*this)->get_SymbolRate(&f); - if (FAILED(hr)) { - return -1; - } - return f; - } - HRESULT SymbolRate(long f) { - _ASSERT(*this); - return (*this)->put_SymbolRate(f); - } - -}; -typedef TNLocatorHelper TNLocator; - -template class TNATSCLocatorHelper : public TNLocatorHelper { -public: - TNATSCLocatorHelper() {} - TNATSCLocatorHelper(const LOCATORTYPE &a) : TNLocatorHelper(a) {} - TNATSCLocatorHelper(IUnknown *p) : TNLocatorHelper(p) {} - TNATSCLocatorHelper(const TNATSCLocatorHelper &a) : TNLocatorHelper(a) {} - TNATSCLocatorHelper(IATSCLocator *p) : TNLocatorHelper(p) {} - TNATSCLocatorHelper(const TNLocatorHelper &a) : TNLocatorHelper(a) {} - TNATSCLocatorHelper& operator=(TNATSCLocatorHelper& rhs) { - TNLocatorHelper::operator=(rhs); - return *this; - } - TNATSCLocatorHelper& operator=(TNLocatorHelper& rhs) { - TNLocatorHelper::operator=(rhs); - return *this; - } - TNATSCLocatorHelper& operator=(LOCATORTYPE& rhs) { - TNLocatorHelper::operator=(rhs); - return *this; - } - TNATSCLocatorHelper& operator=(IATSCLocator* rhs) { - TNLocatorHelper::operator=(rhs); - return *this; - } - TNATSCLocatorHelper& operator=(IUnknown* rhs) { - TNLocatorHelper::operator=(rhs); - return *this; - } - - long PhysicalChannel() { - _ASSERT(*this); - long pc; - HRESULT hr = (*this)->get_PhysicalChannel(&pc); - if (FAILED(hr)) { - return -1; - } - return pc; - } - HRESULT PhysicalChannel(long pc) { - _ASSERT(*this); - return (*this)->put_PhysicalChannel(pc); - } - - long TSID() { - _ASSERT(*this); - long pc; - HRESULT hr = (*this)->get_TSID(&pc); - if (FAILED(hr)) { - return -1; - } - return pc; - } - HRESULT TSID(long pc) { - _ASSERT(*this); - return (*this)->put_TSID(pc); - } - - long ProgramNumber() { - _ASSERT(*this); - long pc; - HRESULT hr = (*this)->get_ProgramNumber(&pc); - if (FAILED(hr)) { - return -1; - } - return pc; - } - HRESULT ProgramNumber(long pc) { - _ASSERT(*this); - return (*this)->put_ProgramNumber(pc); - } -}; -typedef TNATSCLocatorHelper TNATSCLocator; - -// tune requests -template class TNTuneRequestHelper : public TUNEREQUESTTYPE { -public: - TNTuneRequestHelper() {} - TNTuneRequestHelper(const TUNEREQUESTTYPE &a) : TUNEREQUESTTYPE(a) {} - TNTuneRequestHelper(IUnknown *p) : TUNEREQUESTTYPE(p) {} - TNTuneRequestHelper(const TNTuneRequestHelper &a) : TUNEREQUESTTYPE(a) {} - TNTuneRequestHelper(ITuneRequest *p) : TUNEREQUESTTYPE(p) {} - TNTuneRequestHelper& operator=(TNTuneRequestHelper& rhs) { - TUNEREQUESTTYPE::operator=(rhs); - return *this; - } - TNTuneRequestHelper& operator=(TUNEREQUESTTYPE& rhs) { - TUNEREQUESTTYPE::operator=(rhs); - return *this; - } - TNTuneRequestHelper& operator=(ITuneRequest* rhs) { - TUNEREQUESTTYPE::operator=(rhs); - return *this; - } - TNTuneRequestHelper& operator=(IUnknown* rhs) { - TUNEREQUESTTYPE::operator=(rhs); - return *this; - } - // this function creates a new instance of the base ITuneRequest* and copies - // all the values of the current ITuneRequest and sets this to the new one - // this provides the value semantics needed by the network providers - void Clone() { - PQTuneRequest t; - HRESULT hr = (*this)->Clone(&t); - if (FAILED(hr) || !t) { - Release(); // clone failed, clear ourselves - return; - } - TUNEREQUESTTYPE::operator=(t); - } - - PQTuningSpace TuningSpace() { - _ASSERT(*this); - PQTuningSpace ts; - HRESULT hr = (*this)->get_TuningSpace(&ts); - if (FAILED(hr)) { - return PQTuningSpace(); - } - return ts; - } - - LOCATORTYPE Locator() { - _ASSERT(*this); - PQLocator pc; - HRESULT hr = (*this)->get_Locator(&pc); - if (FAILED(hr)) { - return PQLocator().p; - } - return pc.p; - } - HRESULT Locator(LOCATORTYPE& pc) { - _ASSERT(*this); - return (*this)->put_Locator(pc); - } -}; - -typedef TNTuneRequestHelper TNTuneRequest; - -template class TNChannelTuneRequestHelper : public TNTuneRequestHelper { -public: - TNChannelTuneRequestHelper() {} - TNChannelTuneRequestHelper(const TNTuneRequest &a) : TNTuneRequestHelper(a) {} - TNChannelTuneRequestHelper(IChannelTuneRequest *p) : TNTuneRequestHelper(p) {} - TNChannelTuneRequestHelper(IUnknown *p) : TNTuneRequestHelper(p) {} - TNChannelTuneRequestHelper(const TNTuneRequestHelper &a) : TNTuneRequestHelper(a) {} - TNChannelTuneRequestHelper(const TNChannelTuneRequestHelper &a) : TNTuneRequestHelper(a) {} - TNChannelTuneRequestHelper& operator=(TNChannelTuneRequestHelper& rhs) { - TNTuneRequestHelper::operator=(rhs); - return *this; - } - template TNChannelTuneRequestHelper& operator=(TNTuneRequestHelper& rhs) { - TNTuneRequestHelper::operator=(TUNEREQUESTTYPE(rhs)); - return *this; - } - TNChannelTuneRequestHelper& operator=(TUNEREQUESTTYPE& rhs) { - TNTuneRequestHelper::operator=(rhs); - return *this; - } - TNChannelTuneRequestHelper& operator=(IChannelTuneRequest* rhs) { - TNTuneRequestHelper::operator=(rhs); - return *this; - } - TNChannelTuneRequestHelper& operator=(IUnknown* rhs) { - TUNEREQUESTTYPE::operator=(rhs); - return *this; - } - long Channel() { - _ASSERT(*this); - long c; - HRESULT hr = (*this)->get_Channel(&c); - if (FAILED(hr)) { - return -1; - } - return c; - } - HRESULT Channel(long c) { - _ASSERT(*this); - return (*this)->put_Channel(c); - } -}; - -typedef TNChannelTuneRequestHelper TNChannelTuneRequest; - -template class TNATSCChannelTuneRequestHelper : public TNChannelTuneRequestHelper { -public: - TNATSCChannelTuneRequestHelper() {} - TNATSCChannelTuneRequestHelper(const TNTuneRequest &a) : TNChannelTuneRequestHelper(a) {} - TNATSCChannelTuneRequestHelper(IATSCChannelTuneRequest *p) : TNChannelTuneRequestHelper(p) {} - TNATSCChannelTuneRequestHelper(IUnknown *p) : TNChannelTuneRequestHelper(p) {} - TNATSCChannelTuneRequestHelper(const TNChannelTuneRequestHelper &a) : TNChannelTuneRequestHelper(a) {} - TNATSCChannelTuneRequestHelper(const TNATSCChannelTuneRequestHelper &a) : TNChannelTuneRequestHelper(a) {} - TNATSCChannelTuneRequestHelper& operator=(TNATSCChannelTuneRequestHelper& rhs) { - TNChannelTuneRequestHelper::operator=(rhs); - return *this; - } - templateTNATSCChannelTuneRequestHelper& operator=(TNTuneRequestHelper& rhs) { - TNChannelTuneRequestHelper::operator=(TR(rhs)); - return *this; - } - TNATSCChannelTuneRequestHelper& operator=(TUNEREQUESTTYPE& rhs) { - TNChannelTuneRequestHelper::operator=(rhs); - return *this; - } - TNATSCChannelTuneRequestHelper& operator=(IATSCChannelTuneRequest *rhs) { - TNChannelTuneRequestHelper::operator=(rhs); - return *this; - } - TNTuneRequestHelper& operator=(IUnknown* rhs) { - TUNEREQUESTTYPE::operator=(rhs); - return *this; - } - long MinorChannel() { - _ASSERT(*this); - long mc; - HRESULT hr = (*this)->get_MinorChannel(&mc); - if (FAILED(hr)) { - return -1; - } - return mc; - } - HRESULT MinorChannel(long mc) { - _ASSERT(*this); - return (*this)->put_MinorChannel(mc); - } -}; -typedef TNATSCChannelTuneRequestHelper TNATSCChannelTuneRequest; - -template class TNDVBTuneRequestHelper : public TNTuneRequestHelper { -public: - TNDVBTuneRequestHelper() {} - TNDVBTuneRequestHelper(const TNTuneRequest &a) : TNTuneRequestHelper(a) {} - TNDVBTuneRequestHelper(IDVBTuneRequest *p) : TNTuneRequestHelper(p) {} - TNDVBTuneRequestHelper(IUnknown *p) : TNTuneRequestHelper(p) {} - TNDVBTuneRequestHelper(const TNTuneRequestHelper &a) : TNTuneRequestHelper(a) {} - TNDVBTuneRequestHelper(const TNDVBTuneRequestHelper &a) : TNTuneRequestHelper(a) {} - TNDVBTuneRequestHelper& operator=(TNDVBTuneRequestHelper& rhs) { - TNTuneRequestHelper::operator=(rhs); - return *this; - } - template TNDVBTuneRequestHelper& operator=(TNTuneRequestHelper& rhs) { - TNTuneRequestHelper::operator=(TUNEREQUESTTYPE(rhs)); - return *this; - } - TNDVBTuneRequestHelper& operator=(TUNEREQUESTTYPE& rhs) { - TNTuneRequestHelper::operator=(rhs); - return *this; - } - TNDVBTuneRequestHelper& operator=(IDVBTuneRequest* rhs) { - TNTuneRequestHelper::operator=(rhs); - return *this; - } - TNDVBTuneRequestHelper& operator=(IUnknown* rhs) { - TUNEREQUESTTYPE::operator=(rhs); - return *this; - } - long ONID() { - _ASSERT(*this); - long c; - HRESULT hr = (*this)->get_ONID(&c); - if (FAILED(hr)) { - return -1; - } - return c; - } - HRESULT ONID(long c) { - _ASSERT(*this); - return (*this)->put_ONID(c); - } - long TSID() { - _ASSERT(*this); - long c; - HRESULT hr = (*this)->get_TSID(&c); - if (FAILED(hr)) { - return -1; - } - return c; - } - HRESULT TSID(long c) { - _ASSERT(*this); - return (*this)->put_TSID(c); - } - long SID() { - _ASSERT(*this); - long c; - HRESULT hr = (*this)->get_SID(&c); - if (FAILED(hr)) { - return -1; - } - return c; - } - HRESULT SID(long c) { - _ASSERT(*this); - return (*this)->put_SID(c); - } -}; -typedef TNDVBTuneRequestHelper TNDVBTuneRequest; -}; // namespace - -#ifndef NO_DEFAULT_BDATUNINGMODEL_NAMESPACE -using namespace BDATuningModel; -#endif - -#endif -// end of file - tune.h diff --git a/import/DirectX8/include/tuner.h b/import/DirectX8/include/tuner.h deleted file mode 100644 index 12199d040..000000000 --- a/import/DirectX8/include/tuner.h +++ /dev/null @@ -1,21517 +0,0 @@ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// Separate the updated Windows XP version of this header from the downlevel -// version that shipped with the DirectX 8.0 SDK. Since development -// on BDA technology continued for Windows XP, some changes were made to -// this file in order to improve the interface and functionality. -// -// To maintain compatibility with older applications which rely on the -// DirectX 8.0 versions of these files, the DirectX 8.1 version includes -// both the Windows XP content and the DirectX 8.0 content, which are -// separated by the #if (WINVER >= 0x501) preprocessor directive. -// -// Therefore, if you define WINVER to be 0x501 to specify Windows XP, -// the revised content will be compiled. Otherwise, the original -// DirectX 8.0 content will be used. -// -///////////////////////////////////////////////////////////////////////////// - -#if (WINVER >= 0x501) // Windows XP content - - - - /* File created by MIDL compiler version 6.00.0347 */ -/* Compiler settings for tuner.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __tuner_h__ -#define __tuner_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __ITuningSpaces_FWD_DEFINED__ -#define __ITuningSpaces_FWD_DEFINED__ -typedef interface ITuningSpaces ITuningSpaces; -#endif /* __ITuningSpaces_FWD_DEFINED__ */ - - -#ifndef __ITuningSpaceContainer_FWD_DEFINED__ -#define __ITuningSpaceContainer_FWD_DEFINED__ -typedef interface ITuningSpaceContainer ITuningSpaceContainer; -#endif /* __ITuningSpaceContainer_FWD_DEFINED__ */ - - -#ifndef __ITuningSpace_FWD_DEFINED__ -#define __ITuningSpace_FWD_DEFINED__ -typedef interface ITuningSpace ITuningSpace; -#endif /* __ITuningSpace_FWD_DEFINED__ */ - - -#ifndef __IEnumTuningSpaces_FWD_DEFINED__ -#define __IEnumTuningSpaces_FWD_DEFINED__ -typedef interface IEnumTuningSpaces IEnumTuningSpaces; -#endif /* __IEnumTuningSpaces_FWD_DEFINED__ */ - - -#ifndef __IDVBTuningSpace_FWD_DEFINED__ -#define __IDVBTuningSpace_FWD_DEFINED__ -typedef interface IDVBTuningSpace IDVBTuningSpace; -#endif /* __IDVBTuningSpace_FWD_DEFINED__ */ - - -#ifndef __IDVBTuningSpace2_FWD_DEFINED__ -#define __IDVBTuningSpace2_FWD_DEFINED__ -typedef interface IDVBTuningSpace2 IDVBTuningSpace2; -#endif /* __IDVBTuningSpace2_FWD_DEFINED__ */ - - -#ifndef __IDVBSTuningSpace_FWD_DEFINED__ -#define __IDVBSTuningSpace_FWD_DEFINED__ -typedef interface IDVBSTuningSpace IDVBSTuningSpace; -#endif /* __IDVBSTuningSpace_FWD_DEFINED__ */ - - -#ifndef __IAnalogTVTuningSpace_FWD_DEFINED__ -#define __IAnalogTVTuningSpace_FWD_DEFINED__ -typedef interface IAnalogTVTuningSpace IAnalogTVTuningSpace; -#endif /* __IAnalogTVTuningSpace_FWD_DEFINED__ */ - - -#ifndef __IATSCTuningSpace_FWD_DEFINED__ -#define __IATSCTuningSpace_FWD_DEFINED__ -typedef interface IATSCTuningSpace IATSCTuningSpace; -#endif /* __IATSCTuningSpace_FWD_DEFINED__ */ - - -#ifndef __IAnalogRadioTuningSpace_FWD_DEFINED__ -#define __IAnalogRadioTuningSpace_FWD_DEFINED__ -typedef interface IAnalogRadioTuningSpace IAnalogRadioTuningSpace; -#endif /* __IAnalogRadioTuningSpace_FWD_DEFINED__ */ - - -#ifndef __ITuneRequest_FWD_DEFINED__ -#define __ITuneRequest_FWD_DEFINED__ -typedef interface ITuneRequest ITuneRequest; -#endif /* __ITuneRequest_FWD_DEFINED__ */ - - -#ifndef __IChannelTuneRequest_FWD_DEFINED__ -#define __IChannelTuneRequest_FWD_DEFINED__ -typedef interface IChannelTuneRequest IChannelTuneRequest; -#endif /* __IChannelTuneRequest_FWD_DEFINED__ */ - - -#ifndef __IATSCChannelTuneRequest_FWD_DEFINED__ -#define __IATSCChannelTuneRequest_FWD_DEFINED__ -typedef interface IATSCChannelTuneRequest IATSCChannelTuneRequest; -#endif /* __IATSCChannelTuneRequest_FWD_DEFINED__ */ - - -#ifndef __IDVBTuneRequest_FWD_DEFINED__ -#define __IDVBTuneRequest_FWD_DEFINED__ -typedef interface IDVBTuneRequest IDVBTuneRequest; -#endif /* __IDVBTuneRequest_FWD_DEFINED__ */ - - -#ifndef __IMPEG2TuneRequest_FWD_DEFINED__ -#define __IMPEG2TuneRequest_FWD_DEFINED__ -typedef interface IMPEG2TuneRequest IMPEG2TuneRequest; -#endif /* __IMPEG2TuneRequest_FWD_DEFINED__ */ - - -#ifndef __IMPEG2TuneRequestFactory_FWD_DEFINED__ -#define __IMPEG2TuneRequestFactory_FWD_DEFINED__ -typedef interface IMPEG2TuneRequestFactory IMPEG2TuneRequestFactory; -#endif /* __IMPEG2TuneRequestFactory_FWD_DEFINED__ */ - - -#ifndef __IMPEG2TuneRequestSupport_FWD_DEFINED__ -#define __IMPEG2TuneRequestSupport_FWD_DEFINED__ -typedef interface IMPEG2TuneRequestSupport IMPEG2TuneRequestSupport; -#endif /* __IMPEG2TuneRequestSupport_FWD_DEFINED__ */ - - -#ifndef __ITuner_FWD_DEFINED__ -#define __ITuner_FWD_DEFINED__ -typedef interface ITuner ITuner; -#endif /* __ITuner_FWD_DEFINED__ */ - - -#ifndef __IScanningTuner_FWD_DEFINED__ -#define __IScanningTuner_FWD_DEFINED__ -typedef interface IScanningTuner IScanningTuner; -#endif /* __IScanningTuner_FWD_DEFINED__ */ - - -#ifndef __IComponentType_FWD_DEFINED__ -#define __IComponentType_FWD_DEFINED__ -typedef interface IComponentType IComponentType; -#endif /* __IComponentType_FWD_DEFINED__ */ - - -#ifndef __ILanguageComponentType_FWD_DEFINED__ -#define __ILanguageComponentType_FWD_DEFINED__ -typedef interface ILanguageComponentType ILanguageComponentType; -#endif /* __ILanguageComponentType_FWD_DEFINED__ */ - - -#ifndef __IMPEG2ComponentType_FWD_DEFINED__ -#define __IMPEG2ComponentType_FWD_DEFINED__ -typedef interface IMPEG2ComponentType IMPEG2ComponentType; -#endif /* __IMPEG2ComponentType_FWD_DEFINED__ */ - - -#ifndef __IATSCComponentType_FWD_DEFINED__ -#define __IATSCComponentType_FWD_DEFINED__ -typedef interface IATSCComponentType IATSCComponentType; -#endif /* __IATSCComponentType_FWD_DEFINED__ */ - - -#ifndef __IEnumComponentTypes_FWD_DEFINED__ -#define __IEnumComponentTypes_FWD_DEFINED__ -typedef interface IEnumComponentTypes IEnumComponentTypes; -#endif /* __IEnumComponentTypes_FWD_DEFINED__ */ - - -#ifndef __IComponentTypes_FWD_DEFINED__ -#define __IComponentTypes_FWD_DEFINED__ -typedef interface IComponentTypes IComponentTypes; -#endif /* __IComponentTypes_FWD_DEFINED__ */ - - -#ifndef __IComponent_FWD_DEFINED__ -#define __IComponent_FWD_DEFINED__ -typedef interface IComponent IComponent; -#endif /* __IComponent_FWD_DEFINED__ */ - - -#ifndef __IMPEG2Component_FWD_DEFINED__ -#define __IMPEG2Component_FWD_DEFINED__ -typedef interface IMPEG2Component IMPEG2Component; -#endif /* __IMPEG2Component_FWD_DEFINED__ */ - - -#ifndef __IEnumComponents_FWD_DEFINED__ -#define __IEnumComponents_FWD_DEFINED__ -typedef interface IEnumComponents IEnumComponents; -#endif /* __IEnumComponents_FWD_DEFINED__ */ - - -#ifndef __IComponents_FWD_DEFINED__ -#define __IComponents_FWD_DEFINED__ -typedef interface IComponents IComponents; -#endif /* __IComponents_FWD_DEFINED__ */ - - -#ifndef __ILocator_FWD_DEFINED__ -#define __ILocator_FWD_DEFINED__ -typedef interface ILocator ILocator; -#endif /* __ILocator_FWD_DEFINED__ */ - - -#ifndef __IATSCLocator_FWD_DEFINED__ -#define __IATSCLocator_FWD_DEFINED__ -typedef interface IATSCLocator IATSCLocator; -#endif /* __IATSCLocator_FWD_DEFINED__ */ - - -#ifndef __IDVBTLocator_FWD_DEFINED__ -#define __IDVBTLocator_FWD_DEFINED__ -typedef interface IDVBTLocator IDVBTLocator; -#endif /* __IDVBTLocator_FWD_DEFINED__ */ - - -#ifndef __IDVBSLocator_FWD_DEFINED__ -#define __IDVBSLocator_FWD_DEFINED__ -typedef interface IDVBSLocator IDVBSLocator; -#endif /* __IDVBSLocator_FWD_DEFINED__ */ - - -#ifndef __IDVBCLocator_FWD_DEFINED__ -#define __IDVBCLocator_FWD_DEFINED__ -typedef interface IDVBCLocator IDVBCLocator; -#endif /* __IDVBCLocator_FWD_DEFINED__ */ - - -#ifndef __IBroadcastEvent_FWD_DEFINED__ -#define __IBroadcastEvent_FWD_DEFINED__ -typedef interface IBroadcastEvent IBroadcastEvent; -#endif /* __IBroadcastEvent_FWD_DEFINED__ */ - - -#ifndef __SystemTuningSpaces_FWD_DEFINED__ -#define __SystemTuningSpaces_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class SystemTuningSpaces SystemTuningSpaces; -#else -typedef struct SystemTuningSpaces SystemTuningSpaces; -#endif /* __cplusplus */ - -#endif /* __SystemTuningSpaces_FWD_DEFINED__ */ - - -#ifndef __TuningSpace_FWD_DEFINED__ -#define __TuningSpace_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class TuningSpace TuningSpace; -#else -typedef struct TuningSpace TuningSpace; -#endif /* __cplusplus */ - -#endif /* __TuningSpace_FWD_DEFINED__ */ - - -#ifndef __ATSCTuningSpace_FWD_DEFINED__ -#define __ATSCTuningSpace_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class ATSCTuningSpace ATSCTuningSpace; -#else -typedef struct ATSCTuningSpace ATSCTuningSpace; -#endif /* __cplusplus */ - -#endif /* __ATSCTuningSpace_FWD_DEFINED__ */ - - -#ifndef __AnalogRadioTuningSpace_FWD_DEFINED__ -#define __AnalogRadioTuningSpace_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class AnalogRadioTuningSpace AnalogRadioTuningSpace; -#else -typedef struct AnalogRadioTuningSpace AnalogRadioTuningSpace; -#endif /* __cplusplus */ - -#endif /* __AnalogRadioTuningSpace_FWD_DEFINED__ */ - - -#ifndef __AnalogTVTuningSpace_FWD_DEFINED__ -#define __AnalogTVTuningSpace_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class AnalogTVTuningSpace AnalogTVTuningSpace; -#else -typedef struct AnalogTVTuningSpace AnalogTVTuningSpace; -#endif /* __cplusplus */ - -#endif /* __AnalogTVTuningSpace_FWD_DEFINED__ */ - - -#ifndef __DVBTuningSpace_FWD_DEFINED__ -#define __DVBTuningSpace_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DVBTuningSpace DVBTuningSpace; -#else -typedef struct DVBTuningSpace DVBTuningSpace; -#endif /* __cplusplus */ - -#endif /* __DVBTuningSpace_FWD_DEFINED__ */ - - -#ifndef __DVBSTuningSpace_FWD_DEFINED__ -#define __DVBSTuningSpace_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DVBSTuningSpace DVBSTuningSpace; -#else -typedef struct DVBSTuningSpace DVBSTuningSpace; -#endif /* __cplusplus */ - -#endif /* __DVBSTuningSpace_FWD_DEFINED__ */ - - -#ifndef __ComponentTypes_FWD_DEFINED__ -#define __ComponentTypes_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class ComponentTypes ComponentTypes; -#else -typedef struct ComponentTypes ComponentTypes; -#endif /* __cplusplus */ - -#endif /* __ComponentTypes_FWD_DEFINED__ */ - - -#ifndef __ComponentType_FWD_DEFINED__ -#define __ComponentType_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class ComponentType ComponentType; -#else -typedef struct ComponentType ComponentType; -#endif /* __cplusplus */ - -#endif /* __ComponentType_FWD_DEFINED__ */ - - -#ifndef __LanguageComponentType_FWD_DEFINED__ -#define __LanguageComponentType_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class LanguageComponentType LanguageComponentType; -#else -typedef struct LanguageComponentType LanguageComponentType; -#endif /* __cplusplus */ - -#endif /* __LanguageComponentType_FWD_DEFINED__ */ - - -#ifndef __MPEG2ComponentType_FWD_DEFINED__ -#define __MPEG2ComponentType_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class MPEG2ComponentType MPEG2ComponentType; -#else -typedef struct MPEG2ComponentType MPEG2ComponentType; -#endif /* __cplusplus */ - -#endif /* __MPEG2ComponentType_FWD_DEFINED__ */ - - -#ifndef __ATSCComponentType_FWD_DEFINED__ -#define __ATSCComponentType_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class ATSCComponentType ATSCComponentType; -#else -typedef struct ATSCComponentType ATSCComponentType; -#endif /* __cplusplus */ - -#endif /* __ATSCComponentType_FWD_DEFINED__ */ - - -#ifndef __Components_FWD_DEFINED__ -#define __Components_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class Components Components; -#else -typedef struct Components Components; -#endif /* __cplusplus */ - -#endif /* __Components_FWD_DEFINED__ */ - - -#ifndef __Component_FWD_DEFINED__ -#define __Component_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class Component Component; -#else -typedef struct Component Component; -#endif /* __cplusplus */ - -#endif /* __Component_FWD_DEFINED__ */ - - -#ifndef __MPEG2Component_FWD_DEFINED__ -#define __MPEG2Component_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class MPEG2Component MPEG2Component; -#else -typedef struct MPEG2Component MPEG2Component; -#endif /* __cplusplus */ - -#endif /* __MPEG2Component_FWD_DEFINED__ */ - - -#ifndef __TuneRequest_FWD_DEFINED__ -#define __TuneRequest_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class TuneRequest TuneRequest; -#else -typedef struct TuneRequest TuneRequest; -#endif /* __cplusplus */ - -#endif /* __TuneRequest_FWD_DEFINED__ */ - - -#ifndef __ChannelTuneRequest_FWD_DEFINED__ -#define __ChannelTuneRequest_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class ChannelTuneRequest ChannelTuneRequest; -#else -typedef struct ChannelTuneRequest ChannelTuneRequest; -#endif /* __cplusplus */ - -#endif /* __ChannelTuneRequest_FWD_DEFINED__ */ - - -#ifndef __ATSCChannelTuneRequest_FWD_DEFINED__ -#define __ATSCChannelTuneRequest_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class ATSCChannelTuneRequest ATSCChannelTuneRequest; -#else -typedef struct ATSCChannelTuneRequest ATSCChannelTuneRequest; -#endif /* __cplusplus */ - -#endif /* __ATSCChannelTuneRequest_FWD_DEFINED__ */ - - -#ifndef __MPEG2TuneRequest_FWD_DEFINED__ -#define __MPEG2TuneRequest_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class MPEG2TuneRequest MPEG2TuneRequest; -#else -typedef struct MPEG2TuneRequest MPEG2TuneRequest; -#endif /* __cplusplus */ - -#endif /* __MPEG2TuneRequest_FWD_DEFINED__ */ - - -#ifndef __MPEG2TuneRequestFactory_FWD_DEFINED__ -#define __MPEG2TuneRequestFactory_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class MPEG2TuneRequestFactory MPEG2TuneRequestFactory; -#else -typedef struct MPEG2TuneRequestFactory MPEG2TuneRequestFactory; -#endif /* __cplusplus */ - -#endif /* __MPEG2TuneRequestFactory_FWD_DEFINED__ */ - - -#ifndef __Locator_FWD_DEFINED__ -#define __Locator_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class Locator Locator; -#else -typedef struct Locator Locator; -#endif /* __cplusplus */ - -#endif /* __Locator_FWD_DEFINED__ */ - - -#ifndef __ATSCLocator_FWD_DEFINED__ -#define __ATSCLocator_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class ATSCLocator ATSCLocator; -#else -typedef struct ATSCLocator ATSCLocator; -#endif /* __cplusplus */ - -#endif /* __ATSCLocator_FWD_DEFINED__ */ - - -#ifndef __DVBTLocator_FWD_DEFINED__ -#define __DVBTLocator_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DVBTLocator DVBTLocator; -#else -typedef struct DVBTLocator DVBTLocator; -#endif /* __cplusplus */ - -#endif /* __DVBTLocator_FWD_DEFINED__ */ - - -#ifndef __DVBSLocator_FWD_DEFINED__ -#define __DVBSLocator_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DVBSLocator DVBSLocator; -#else -typedef struct DVBSLocator DVBSLocator; -#endif /* __cplusplus */ - -#endif /* __DVBSLocator_FWD_DEFINED__ */ - - -#ifndef __DVBCLocator_FWD_DEFINED__ -#define __DVBCLocator_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DVBCLocator DVBCLocator; -#else -typedef struct DVBCLocator DVBCLocator; -#endif /* __cplusplus */ - -#endif /* __DVBCLocator_FWD_DEFINED__ */ - - -#ifndef __DVBTuneRequest_FWD_DEFINED__ -#define __DVBTuneRequest_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class DVBTuneRequest DVBTuneRequest; -#else -typedef struct DVBTuneRequest DVBTuneRequest; -#endif /* __cplusplus */ - -#endif /* __DVBTuneRequest_FWD_DEFINED__ */ - - -#ifndef __CreatePropBagOnRegKey_FWD_DEFINED__ -#define __CreatePropBagOnRegKey_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class CreatePropBagOnRegKey CreatePropBagOnRegKey; -#else -typedef struct CreatePropBagOnRegKey CreatePropBagOnRegKey; -#endif /* __cplusplus */ - -#endif /* __CreatePropBagOnRegKey_FWD_DEFINED__ */ - - -#ifndef __BroadcastEventService_FWD_DEFINED__ -#define __BroadcastEventService_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class BroadcastEventService BroadcastEventService; -#else -typedef struct BroadcastEventService BroadcastEventService; -#endif /* __cplusplus */ - -#endif /* __BroadcastEventService_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "oaidl.h" -#include "comcat.h" -#include "strmif.h" -#include "bdatypes.h" -#include "regbag.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void * ); - -/* interface __MIDL_itf_tuner_0000 */ -/* [local] */ - -//+------------------------------------------------------------------------- -// -// Microsoft Windows -// Copyright (C) Microsoft Corporation, 1999-2001. -// -//-------------------------------------------------------------------------- -#pragma once -#include - - - - - - - - - - - - - - - - - - - - -enum __MIDL___MIDL_itf_tuner_0000_0001 - { DISPID_TUNER_TS_UNIQUENAME = 1, - DISPID_TUNER_TS_FRIENDLYNAME = 2, - DISPID_TUNER_TS_CLSID = 3, - DISPID_TUNER_TS_NETWORKTYPE = 4, - DISPID_TUNER_TS__NETWORKTYPE = 5, - DISPID_TUNER_TS_CREATETUNEREQUEST = 6, - DISPID_TUNER_TS_ENUMCATEGORYGUIDS = 7, - DISPID_TUNER_TS_ENUMDEVICEMONIKERS = 8, - DISPID_TUNER_TS_DEFAULTPREFERREDCOMPONENTTYPES = 9, - DISPID_TUNER_TS_FREQMAP = 10, - DISPID_TUNER_TS_DEFLOCATOR = 11, - DISPID_TUNER_TS_CLONE = 12, - DISPID_TUNER_TR_TUNINGSPACE = 1, - DISPID_TUNER_TR_COMPONENTS = 2, - DISPID_TUNER_TR_CLONE = 3, - DISPID_TUNER_TR_LOCATOR = 4, - DISPID_TUNER_CT_CATEGORY = 1, - DISPID_TUNER_CT_MEDIAMAJORTYPE = 2, - DISPID_TUNER_CT__MEDIAMAJORTYPE = 3, - DISPID_TUNER_CT_MEDIASUBTYPE = 4, - DISPID_TUNER_CT__MEDIASUBTYPE = 5, - DISPID_TUNER_CT_MEDIAFORMATTYPE = 6, - DISPID_TUNER_CT__MEDIAFORMATTYPE = 7, - DISPID_TUNER_CT_MEDIATYPE = 8, - DISPID_TUNER_CT_CLONE = 9, - DISPID_TUNER_LCT_LANGID = 100, - DISPID_TUNER_MP2CT_TYPE = 200, - DISPID_TUNER_ATSCCT_FLAGS = 300, - DISPID_TUNER_L_CARRFREQ = 1, - DISPID_TUNER_L_INNERFECMETHOD = 2, - DISPID_TUNER_L_INNERFECRATE = 3, - DISPID_TUNER_L_OUTERFECMETHOD = 4, - DISPID_TUNER_L_OUTERFECRATE = 5, - DISPID_TUNER_L_MOD = 6, - DISPID_TUNER_L_SYMRATE = 7, - DISPID_TUNER_L_CLONE = 8, - DISPID_TUNER_L_ATSC_PHYS_CHANNEL = 201, - DISPID_TUNER_L_ATSC_TSID = 202, - DISPID_TUNER_L_DVBT_BANDWIDTH = 301, - DISPID_TUNER_L_DVBT_LPINNERFECMETHOD = 302, - DISPID_TUNER_L_DVBT_LPINNERFECRATE = 303, - DISPID_TUNER_L_DVBT_GUARDINTERVAL = 304, - DISPID_TUNER_L_DVBT_HALPHA = 305, - DISPID_TUNER_L_DVBT_TRANSMISSIONMODE = 306, - DISPID_TUNER_L_DVBT_INUSE = 307, - DISPID_TUNER_L_DVBS_POLARISATION = 401, - DISPID_TUNER_L_DVBS_WEST = 402, - DISPID_TUNER_L_DVBS_ORBITAL = 403, - DISPID_TUNER_L_DVBS_AZIMUTH = 404, - DISPID_TUNER_L_DVBS_ELEVATION = 405, - DISPID_TUNER_C_TYPE = 1, - DISPID_TUNER_C_STATUS = 2, - DISPID_TUNER_C_LANGID = 3, - DISPID_TUNER_C_DESCRIPTION = 4, - DISPID_TUNER_C_CLONE = 5, - DISPID_TUNER_C_MP2_PID = 101, - DISPID_TUNER_C_MP2_PCRPID = 102, - DISPID_TUNER_C_MP2_PROGNO = 103, - DISPID_TUNER_TS_DVB_SYSTEMTYPE = 101, - DISPID_TUNER_TS_DVB2_NETWORK_ID = 102, - DISPID_TUNER_TS_DVBS_LOW_OSC_FREQ = 1001, - DISPID_TUNER_TS_DVBS_HI_OSC_FREQ = 1002, - DISPID_TUNER_TS_DVBS_LNB_SWITCH_FREQ = 1003, - DISPID_TUNER_TS_DVBS_INPUT_RANGE = 1004, - DISPID_TUNER_TS_DVBS_SPECTRAL_INVERSION = 1005, - DISPID_TUNER_TS_AR_MINFREQUENCY = 101, - DISPID_TUNER_TS_AR_MAXFREQUENCY = 102, - DISPID_TUNER_TS_AR_STEP = 103, - DISPID_TUNER_TS_ATV_MINCHANNEL = 101, - DISPID_TUNER_TS_ATV_MAXCHANNEL = 102, - DISPID_TUNER_TS_ATV_INPUTTYPE = 103, - DISPID_TUNER_TS_ATV_COUNTRYCODE = 104, - DISPID_TUNER_TS_ATSC_MINMINORCHANNEL = 201, - DISPID_TUNER_TS_ATSC_MAXMINORCHANNEL = 202, - DISPID_TUNER_TS_ATSC_MINPHYSCHANNEL = 203, - DISPID_TUNER_TS_ATSC_MAXPHYSCHANNEL = 204, - DISPID_CHTUNER_ATVAC_CHANNEL = 101, - DISPID_CHTUNER_ATVDC_SYSTEM = 101, - DISPID_CHTUNER_ATVDC_CONTENT = 102, - DISPID_CHTUNER_CTR_CHANNEL = 101, - DISPID_CHTUNER_ACTR_MINOR_CHANNEL = 201, - DISPID_DVBTUNER_DVBC_ATTRIBUTESVALID = 101, - DISPID_DVBTUNER_DVBC_PID = 102, - DISPID_DVBTUNER_DVBC_TAG = 103, - DISPID_DVBTUNER_DVBC_COMPONENTTYPE = 104, - DISPID_DVBTUNER_ONID = 101, - DISPID_DVBTUNER_TSID = 102, - DISPID_DVBTUNER_SID = 103, - DISPID_MP2TUNER_TSID = 101, - DISPID_MP2TUNER_PROGNO = 102, - DISPID_MP2TUNERFACTORY_CREATETUNEREQUEST = 1 - } ; - - -extern RPC_IF_HANDLE __MIDL_itf_tuner_0000_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_tuner_0000_v0_0_s_ifspec; - -#ifndef __ITuningSpaces_INTERFACE_DEFINED__ -#define __ITuningSpaces_INTERFACE_DEFINED__ - -/* interface ITuningSpaces */ -/* [unique][helpstring][nonextensible][oleautomation][dual][uuid][object] */ - - -EXTERN_C const IID IID_ITuningSpaces; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("901284E4-33FE-4b69-8D63-634A596F3756") - ITuningSpaces : public IDispatch - { - public: - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( - /* [retval][out] */ long *Count) = 0; - - virtual /* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( - /* [retval][out] */ IEnumVARIANT **NewEnum) = 0; - - virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Item( - /* [in] */ VARIANT varIndex, - /* [retval][out] */ ITuningSpace **TuningSpace) = 0; - - virtual /* [helpstring][restricted][hidden][propget] */ HRESULT STDMETHODCALLTYPE get_EnumTuningSpaces( - /* [retval][out] */ IEnumTuningSpaces **NewEnum) = 0; - - }; - -#else /* C style interface */ - - typedef struct ITuningSpacesVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ITuningSpaces * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ITuningSpaces * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ITuningSpaces * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - ITuningSpaces * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - ITuningSpaces * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - ITuningSpaces * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - ITuningSpaces * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( - ITuningSpaces * This, - /* [retval][out] */ long *Count); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( - ITuningSpaces * This, - /* [retval][out] */ IEnumVARIANT **NewEnum); - - /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Item )( - ITuningSpaces * This, - /* [in] */ VARIANT varIndex, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][restricted][hidden][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnumTuningSpaces )( - ITuningSpaces * This, - /* [retval][out] */ IEnumTuningSpaces **NewEnum); - - END_INTERFACE - } ITuningSpacesVtbl; - - interface ITuningSpaces - { - CONST_VTBL struct ITuningSpacesVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ITuningSpaces_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ITuningSpaces_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ITuningSpaces_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ITuningSpaces_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define ITuningSpaces_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define ITuningSpaces_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define ITuningSpaces_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define ITuningSpaces_get_Count(This,Count) \ - (This)->lpVtbl -> get_Count(This,Count) - -#define ITuningSpaces_get__NewEnum(This,NewEnum) \ - (This)->lpVtbl -> get__NewEnum(This,NewEnum) - -#define ITuningSpaces_get_Item(This,varIndex,TuningSpace) \ - (This)->lpVtbl -> get_Item(This,varIndex,TuningSpace) - -#define ITuningSpaces_get_EnumTuningSpaces(This,NewEnum) \ - (This)->lpVtbl -> get_EnumTuningSpaces(This,NewEnum) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpaces_get_Count_Proxy( - ITuningSpaces * This, - /* [retval][out] */ long *Count); - - -void __RPC_STUB ITuningSpaces_get_Count_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpaces_get__NewEnum_Proxy( - ITuningSpaces * This, - /* [retval][out] */ IEnumVARIANT **NewEnum); - - -void __RPC_STUB ITuningSpaces_get__NewEnum_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE ITuningSpaces_get_Item_Proxy( - ITuningSpaces * This, - /* [in] */ VARIANT varIndex, - /* [retval][out] */ ITuningSpace **TuningSpace); - - -void __RPC_STUB ITuningSpaces_get_Item_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][restricted][hidden][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpaces_get_EnumTuningSpaces_Proxy( - ITuningSpaces * This, - /* [retval][out] */ IEnumTuningSpaces **NewEnum); - - -void __RPC_STUB ITuningSpaces_get_EnumTuningSpaces_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ITuningSpaces_INTERFACE_DEFINED__ */ - - -#ifndef __ITuningSpaceContainer_INTERFACE_DEFINED__ -#define __ITuningSpaceContainer_INTERFACE_DEFINED__ - -/* interface ITuningSpaceContainer */ -/* [unique][helpstring][nonextensible][hidden][oleautomation][dual][uuid][object] */ - - -EXTERN_C const IID IID_ITuningSpaceContainer; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("5B692E84-E2F1-11d2-9493-00C04F72D980") - ITuningSpaceContainer : public IDispatch - { - public: - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( - /* [retval][out] */ long *Count) = 0; - - virtual /* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( - /* [retval][out] */ IEnumVARIANT **NewEnum) = 0; - - virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Item( - /* [in] */ VARIANT varIndex, - /* [retval][out] */ ITuningSpace **TuningSpace) = 0; - - virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_Item( - /* [in] */ VARIANT varIndex, - /* [in] */ ITuningSpace *TuningSpace) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE TuningSpacesForCLSID( - /* [in] */ BSTR SpaceCLSID, - /* [retval][out] */ ITuningSpaces **NewColl) = 0; - - virtual /* [helpstring][restricted][hidden] */ HRESULT STDMETHODCALLTYPE _TuningSpacesForCLSID( - /* [in] */ REFCLSID SpaceCLSID, - /* [retval][out] */ ITuningSpaces **NewColl) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE TuningSpacesForName( - /* [in] */ BSTR Name, - /* [retval][out] */ ITuningSpaces **NewColl) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE FindID( - /* [in] */ ITuningSpace *TuningSpace, - /* [retval][out] */ long *ID) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( - /* [in] */ ITuningSpace *TuningSpace, - /* [retval][out] */ VARIANT *NewIndex) = 0; - - virtual /* [helpstring][restricted][hidden][propget] */ HRESULT STDMETHODCALLTYPE get_EnumTuningSpaces( - /* [retval][out] */ IEnumTuningSpaces **ppEnum) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( - /* [in] */ VARIANT Index) = 0; - - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_MaxCount( - /* [retval][out] */ long *MaxCount) = 0; - - virtual /* [helpstring][restricted][hidden][propput] */ HRESULT STDMETHODCALLTYPE put_MaxCount( - /* [in] */ long MaxCount) = 0; - - }; - -#else /* C style interface */ - - typedef struct ITuningSpaceContainerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ITuningSpaceContainer * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ITuningSpaceContainer * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ITuningSpaceContainer * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - ITuningSpaceContainer * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - ITuningSpaceContainer * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - ITuningSpaceContainer * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - ITuningSpaceContainer * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( - ITuningSpaceContainer * This, - /* [retval][out] */ long *Count); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( - ITuningSpaceContainer * This, - /* [retval][out] */ IEnumVARIANT **NewEnum); - - /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Item )( - ITuningSpaceContainer * This, - /* [in] */ VARIANT varIndex, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_Item )( - ITuningSpaceContainer * This, - /* [in] */ VARIANT varIndex, - /* [in] */ ITuningSpace *TuningSpace); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *TuningSpacesForCLSID )( - ITuningSpaceContainer * This, - /* [in] */ BSTR SpaceCLSID, - /* [retval][out] */ ITuningSpaces **NewColl); - - /* [helpstring][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *_TuningSpacesForCLSID )( - ITuningSpaceContainer * This, - /* [in] */ REFCLSID SpaceCLSID, - /* [retval][out] */ ITuningSpaces **NewColl); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *TuningSpacesForName )( - ITuningSpaceContainer * This, - /* [in] */ BSTR Name, - /* [retval][out] */ ITuningSpaces **NewColl); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *FindID )( - ITuningSpaceContainer * This, - /* [in] */ ITuningSpace *TuningSpace, - /* [retval][out] */ long *ID); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( - ITuningSpaceContainer * This, - /* [in] */ ITuningSpace *TuningSpace, - /* [retval][out] */ VARIANT *NewIndex); - - /* [helpstring][restricted][hidden][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnumTuningSpaces )( - ITuningSpaceContainer * This, - /* [retval][out] */ IEnumTuningSpaces **ppEnum); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( - ITuningSpaceContainer * This, - /* [in] */ VARIANT Index); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxCount )( - ITuningSpaceContainer * This, - /* [retval][out] */ long *MaxCount); - - /* [helpstring][restricted][hidden][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MaxCount )( - ITuningSpaceContainer * This, - /* [in] */ long MaxCount); - - END_INTERFACE - } ITuningSpaceContainerVtbl; - - interface ITuningSpaceContainer - { - CONST_VTBL struct ITuningSpaceContainerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ITuningSpaceContainer_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ITuningSpaceContainer_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ITuningSpaceContainer_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ITuningSpaceContainer_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define ITuningSpaceContainer_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define ITuningSpaceContainer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define ITuningSpaceContainer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define ITuningSpaceContainer_get_Count(This,Count) \ - (This)->lpVtbl -> get_Count(This,Count) - -#define ITuningSpaceContainer_get__NewEnum(This,NewEnum) \ - (This)->lpVtbl -> get__NewEnum(This,NewEnum) - -#define ITuningSpaceContainer_get_Item(This,varIndex,TuningSpace) \ - (This)->lpVtbl -> get_Item(This,varIndex,TuningSpace) - -#define ITuningSpaceContainer_put_Item(This,varIndex,TuningSpace) \ - (This)->lpVtbl -> put_Item(This,varIndex,TuningSpace) - -#define ITuningSpaceContainer_TuningSpacesForCLSID(This,SpaceCLSID,NewColl) \ - (This)->lpVtbl -> TuningSpacesForCLSID(This,SpaceCLSID,NewColl) - -#define ITuningSpaceContainer__TuningSpacesForCLSID(This,SpaceCLSID,NewColl) \ - (This)->lpVtbl -> _TuningSpacesForCLSID(This,SpaceCLSID,NewColl) - -#define ITuningSpaceContainer_TuningSpacesForName(This,Name,NewColl) \ - (This)->lpVtbl -> TuningSpacesForName(This,Name,NewColl) - -#define ITuningSpaceContainer_FindID(This,TuningSpace,ID) \ - (This)->lpVtbl -> FindID(This,TuningSpace,ID) - -#define ITuningSpaceContainer_Add(This,TuningSpace,NewIndex) \ - (This)->lpVtbl -> Add(This,TuningSpace,NewIndex) - -#define ITuningSpaceContainer_get_EnumTuningSpaces(This,ppEnum) \ - (This)->lpVtbl -> get_EnumTuningSpaces(This,ppEnum) - -#define ITuningSpaceContainer_Remove(This,Index) \ - (This)->lpVtbl -> Remove(This,Index) - -#define ITuningSpaceContainer_get_MaxCount(This,MaxCount) \ - (This)->lpVtbl -> get_MaxCount(This,MaxCount) - -#define ITuningSpaceContainer_put_MaxCount(This,MaxCount) \ - (This)->lpVtbl -> put_MaxCount(This,MaxCount) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_get_Count_Proxy( - ITuningSpaceContainer * This, - /* [retval][out] */ long *Count); - - -void __RPC_STUB ITuningSpaceContainer_get_Count_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_get__NewEnum_Proxy( - ITuningSpaceContainer * This, - /* [retval][out] */ IEnumVARIANT **NewEnum); - - -void __RPC_STUB ITuningSpaceContainer_get__NewEnum_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_get_Item_Proxy( - ITuningSpaceContainer * This, - /* [in] */ VARIANT varIndex, - /* [retval][out] */ ITuningSpace **TuningSpace); - - -void __RPC_STUB ITuningSpaceContainer_get_Item_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_put_Item_Proxy( - ITuningSpaceContainer * This, - /* [in] */ VARIANT varIndex, - /* [in] */ ITuningSpace *TuningSpace); - - -void __RPC_STUB ITuningSpaceContainer_put_Item_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_TuningSpacesForCLSID_Proxy( - ITuningSpaceContainer * This, - /* [in] */ BSTR SpaceCLSID, - /* [retval][out] */ ITuningSpaces **NewColl); - - -void __RPC_STUB ITuningSpaceContainer_TuningSpacesForCLSID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][restricted][hidden] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer__TuningSpacesForCLSID_Proxy( - ITuningSpaceContainer * This, - /* [in] */ REFCLSID SpaceCLSID, - /* [retval][out] */ ITuningSpaces **NewColl); - - -void __RPC_STUB ITuningSpaceContainer__TuningSpacesForCLSID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_TuningSpacesForName_Proxy( - ITuningSpaceContainer * This, - /* [in] */ BSTR Name, - /* [retval][out] */ ITuningSpaces **NewColl); - - -void __RPC_STUB ITuningSpaceContainer_TuningSpacesForName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_FindID_Proxy( - ITuningSpaceContainer * This, - /* [in] */ ITuningSpace *TuningSpace, - /* [retval][out] */ long *ID); - - -void __RPC_STUB ITuningSpaceContainer_FindID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_Add_Proxy( - ITuningSpaceContainer * This, - /* [in] */ ITuningSpace *TuningSpace, - /* [retval][out] */ VARIANT *NewIndex); - - -void __RPC_STUB ITuningSpaceContainer_Add_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][restricted][hidden][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_get_EnumTuningSpaces_Proxy( - ITuningSpaceContainer * This, - /* [retval][out] */ IEnumTuningSpaces **ppEnum); - - -void __RPC_STUB ITuningSpaceContainer_get_EnumTuningSpaces_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_Remove_Proxy( - ITuningSpaceContainer * This, - /* [in] */ VARIANT Index); - - -void __RPC_STUB ITuningSpaceContainer_Remove_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_get_MaxCount_Proxy( - ITuningSpaceContainer * This, - /* [retval][out] */ long *MaxCount); - - -void __RPC_STUB ITuningSpaceContainer_get_MaxCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][restricted][hidden][propput] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_put_MaxCount_Proxy( - ITuningSpaceContainer * This, - /* [in] */ long MaxCount); - - -void __RPC_STUB ITuningSpaceContainer_put_MaxCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ITuningSpaceContainer_INTERFACE_DEFINED__ */ - - -#ifndef __ITuningSpace_INTERFACE_DEFINED__ -#define __ITuningSpace_INTERFACE_DEFINED__ - -/* interface ITuningSpace */ -/* [unique][helpstring][nonextensible][oleautomation][dual][uuid][object] */ - - -EXTERN_C const IID IID_ITuningSpace; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("061C6E30-E622-11d2-9493-00C04F72D980") - ITuningSpace : public IDispatch - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_UniqueName( - /* [retval][out] */ BSTR *Name) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_UniqueName( - /* [in] */ BSTR Name) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_FriendlyName( - /* [retval][out] */ BSTR *Name) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_FriendlyName( - /* [in] */ BSTR Name) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CLSID( - /* [retval][out] */ BSTR *SpaceCLSID) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_NetworkType( - /* [retval][out] */ BSTR *NetworkTypeGuid) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_NetworkType( - /* [in] */ BSTR NetworkTypeGuid) = 0; - - virtual /* [restricted][hidden][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NetworkType( - /* [retval][out] */ GUID *NetworkTypeGuid) = 0; - - virtual /* [restricted][hidden][helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put__NetworkType( - /* [in] */ REFCLSID NetworkTypeGuid) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CreateTuneRequest( - /* [retval][out] */ ITuneRequest **TuneRequest) = 0; - - virtual /* [restricted][hidden][id] */ HRESULT STDMETHODCALLTYPE EnumCategoryGUIDs( - /* [retval][out] */ IEnumGUID **ppEnum) = 0; - - virtual /* [restricted][hidden][id] */ HRESULT STDMETHODCALLTYPE EnumDeviceMonikers( - /* [retval][out] */ IEnumMoniker **ppEnum) = 0; - - virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_DefaultPreferredComponentTypes( - /* [retval][out] */ IComponentTypes **ComponentTypes) = 0; - - virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_DefaultPreferredComponentTypes( - /* [in] */ IComponentTypes *NewComponentTypes) = 0; - - virtual /* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE get_FrequencyMapping( - /* [retval][out] */ BSTR *pMapping) = 0; - - virtual /* [restricted][hidden][id][propput] */ HRESULT STDMETHODCALLTYPE put_FrequencyMapping( - BSTR Mapping) = 0; - - virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_DefaultLocator( - /* [retval][out] */ ILocator **LocatorVal) = 0; - - virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_DefaultLocator( - /* [in] */ ILocator *LocatorVal) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - /* [retval][out] */ ITuningSpace **NewTS) = 0; - - }; - -#else /* C style interface */ - - typedef struct ITuningSpaceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ITuningSpace * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ITuningSpace * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ITuningSpace * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - ITuningSpace * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - ITuningSpace * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - ITuningSpace * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - ITuningSpace * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueName )( - ITuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_UniqueName )( - ITuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( - ITuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( - ITuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CLSID )( - ITuningSpace * This, - /* [retval][out] */ BSTR *SpaceCLSID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_NetworkType )( - ITuningSpace * This, - /* [retval][out] */ BSTR *NetworkTypeGuid); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_NetworkType )( - ITuningSpace * This, - /* [in] */ BSTR NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NetworkType )( - ITuningSpace * This, - /* [retval][out] */ GUID *NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__NetworkType )( - ITuningSpace * This, - /* [in] */ REFCLSID NetworkTypeGuid); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CreateTuneRequest )( - ITuningSpace * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumCategoryGUIDs )( - ITuningSpace * This, - /* [retval][out] */ IEnumGUID **ppEnum); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumDeviceMonikers )( - ITuningSpace * This, - /* [retval][out] */ IEnumMoniker **ppEnum); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes )( - ITuningSpace * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes )( - ITuningSpace * This, - /* [in] */ IComponentTypes *NewComponentTypes); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FrequencyMapping )( - ITuningSpace * This, - /* [retval][out] */ BSTR *pMapping); - - /* [restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FrequencyMapping )( - ITuningSpace * This, - BSTR Mapping); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultLocator )( - ITuningSpace * This, - /* [retval][out] */ ILocator **LocatorVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultLocator )( - ITuningSpace * This, - /* [in] */ ILocator *LocatorVal); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - ITuningSpace * This, - /* [retval][out] */ ITuningSpace **NewTS); - - END_INTERFACE - } ITuningSpaceVtbl; - - interface ITuningSpace - { - CONST_VTBL struct ITuningSpaceVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ITuningSpace_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ITuningSpace_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ITuningSpace_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ITuningSpace_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define ITuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define ITuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define ITuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define ITuningSpace_get_UniqueName(This,Name) \ - (This)->lpVtbl -> get_UniqueName(This,Name) - -#define ITuningSpace_put_UniqueName(This,Name) \ - (This)->lpVtbl -> put_UniqueName(This,Name) - -#define ITuningSpace_get_FriendlyName(This,Name) \ - (This)->lpVtbl -> get_FriendlyName(This,Name) - -#define ITuningSpace_put_FriendlyName(This,Name) \ - (This)->lpVtbl -> put_FriendlyName(This,Name) - -#define ITuningSpace_get_CLSID(This,SpaceCLSID) \ - (This)->lpVtbl -> get_CLSID(This,SpaceCLSID) - -#define ITuningSpace_get_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get_NetworkType(This,NetworkTypeGuid) - -#define ITuningSpace_put_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put_NetworkType(This,NetworkTypeGuid) - -#define ITuningSpace_get__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get__NetworkType(This,NetworkTypeGuid) - -#define ITuningSpace_put__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put__NetworkType(This,NetworkTypeGuid) - -#define ITuningSpace_CreateTuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> CreateTuneRequest(This,TuneRequest) - -#define ITuningSpace_EnumCategoryGUIDs(This,ppEnum) \ - (This)->lpVtbl -> EnumCategoryGUIDs(This,ppEnum) - -#define ITuningSpace_EnumDeviceMonikers(This,ppEnum) \ - (This)->lpVtbl -> EnumDeviceMonikers(This,ppEnum) - -#define ITuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> get_DefaultPreferredComponentTypes(This,ComponentTypes) - -#define ITuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) \ - (This)->lpVtbl -> put_DefaultPreferredComponentTypes(This,NewComponentTypes) - -#define ITuningSpace_get_FrequencyMapping(This,pMapping) \ - (This)->lpVtbl -> get_FrequencyMapping(This,pMapping) - -#define ITuningSpace_put_FrequencyMapping(This,Mapping) \ - (This)->lpVtbl -> put_FrequencyMapping(This,Mapping) - -#define ITuningSpace_get_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> get_DefaultLocator(This,LocatorVal) - -#define ITuningSpace_put_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> put_DefaultLocator(This,LocatorVal) - -#define ITuningSpace_Clone(This,NewTS) \ - (This)->lpVtbl -> Clone(This,NewTS) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpace_get_UniqueName_Proxy( - ITuningSpace * This, - /* [retval][out] */ BSTR *Name); - - -void __RPC_STUB ITuningSpace_get_UniqueName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ITuningSpace_put_UniqueName_Proxy( - ITuningSpace * This, - /* [in] */ BSTR Name); - - -void __RPC_STUB ITuningSpace_put_UniqueName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpace_get_FriendlyName_Proxy( - ITuningSpace * This, - /* [retval][out] */ BSTR *Name); - - -void __RPC_STUB ITuningSpace_get_FriendlyName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ITuningSpace_put_FriendlyName_Proxy( - ITuningSpace * This, - /* [in] */ BSTR Name); - - -void __RPC_STUB ITuningSpace_put_FriendlyName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpace_get_CLSID_Proxy( - ITuningSpace * This, - /* [retval][out] */ BSTR *SpaceCLSID); - - -void __RPC_STUB ITuningSpace_get_CLSID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpace_get_NetworkType_Proxy( - ITuningSpace * This, - /* [retval][out] */ BSTR *NetworkTypeGuid); - - -void __RPC_STUB ITuningSpace_get_NetworkType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ITuningSpace_put_NetworkType_Proxy( - ITuningSpace * This, - /* [in] */ BSTR NetworkTypeGuid); - - -void __RPC_STUB ITuningSpace_put_NetworkType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [restricted][hidden][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpace_get__NetworkType_Proxy( - ITuningSpace * This, - /* [retval][out] */ GUID *NetworkTypeGuid); - - -void __RPC_STUB ITuningSpace_get__NetworkType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [restricted][hidden][helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ITuningSpace_put__NetworkType_Proxy( - ITuningSpace * This, - /* [in] */ REFCLSID NetworkTypeGuid); - - -void __RPC_STUB ITuningSpace_put__NetworkType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ITuningSpace_CreateTuneRequest_Proxy( - ITuningSpace * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - -void __RPC_STUB ITuningSpace_CreateTuneRequest_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [restricted][hidden][id] */ HRESULT STDMETHODCALLTYPE ITuningSpace_EnumCategoryGUIDs_Proxy( - ITuningSpace * This, - /* [retval][out] */ IEnumGUID **ppEnum); - - -void __RPC_STUB ITuningSpace_EnumCategoryGUIDs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [restricted][hidden][id] */ HRESULT STDMETHODCALLTYPE ITuningSpace_EnumDeviceMonikers_Proxy( - ITuningSpace * This, - /* [retval][out] */ IEnumMoniker **ppEnum); - - -void __RPC_STUB ITuningSpace_EnumDeviceMonikers_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpace_get_DefaultPreferredComponentTypes_Proxy( - ITuningSpace * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - -void __RPC_STUB ITuningSpace_get_DefaultPreferredComponentTypes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][propput] */ HRESULT STDMETHODCALLTYPE ITuningSpace_put_DefaultPreferredComponentTypes_Proxy( - ITuningSpace * This, - /* [in] */ IComponentTypes *NewComponentTypes); - - -void __RPC_STUB ITuningSpace_put_DefaultPreferredComponentTypes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpace_get_FrequencyMapping_Proxy( - ITuningSpace * This, - /* [retval][out] */ BSTR *pMapping); - - -void __RPC_STUB ITuningSpace_get_FrequencyMapping_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [restricted][hidden][id][propput] */ HRESULT STDMETHODCALLTYPE ITuningSpace_put_FrequencyMapping_Proxy( - ITuningSpace * This, - BSTR Mapping); - - -void __RPC_STUB ITuningSpace_put_FrequencyMapping_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpace_get_DefaultLocator_Proxy( - ITuningSpace * This, - /* [retval][out] */ ILocator **LocatorVal); - - -void __RPC_STUB ITuningSpace_get_DefaultLocator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][propput] */ HRESULT STDMETHODCALLTYPE ITuningSpace_put_DefaultLocator_Proxy( - ITuningSpace * This, - /* [in] */ ILocator *LocatorVal); - - -void __RPC_STUB ITuningSpace_put_DefaultLocator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE ITuningSpace_Clone_Proxy( - ITuningSpace * This, - /* [retval][out] */ ITuningSpace **NewTS); - - -void __RPC_STUB ITuningSpace_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ITuningSpace_INTERFACE_DEFINED__ */ - - -#ifndef __IEnumTuningSpaces_INTERFACE_DEFINED__ -#define __IEnumTuningSpaces_INTERFACE_DEFINED__ - -/* interface IEnumTuningSpaces */ -/* [unique][uuid][object][restricted][hidden] */ - - -EXTERN_C const IID IID_IEnumTuningSpaces; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("8B8EB248-FC2B-11d2-9D8C-00C04F72D980") - IEnumTuningSpaces : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Next( - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ ITuningSpace **rgelt, - /* [out] */ ULONG *pceltFetched) = 0; - - virtual HRESULT STDMETHODCALLTYPE Skip( - /* [in] */ ULONG celt) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - /* [out] */ IEnumTuningSpaces **ppEnum) = 0; - - }; - -#else /* C style interface */ - - typedef struct IEnumTuningSpacesVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IEnumTuningSpaces * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IEnumTuningSpaces * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IEnumTuningSpaces * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - IEnumTuningSpaces * This, - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ ITuningSpace **rgelt, - /* [out] */ ULONG *pceltFetched); - - HRESULT ( STDMETHODCALLTYPE *Skip )( - IEnumTuningSpaces * This, - /* [in] */ ULONG celt); - - HRESULT ( STDMETHODCALLTYPE *Reset )( - IEnumTuningSpaces * This); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IEnumTuningSpaces * This, - /* [out] */ IEnumTuningSpaces **ppEnum); - - END_INTERFACE - } IEnumTuningSpacesVtbl; - - interface IEnumTuningSpaces - { - CONST_VTBL struct IEnumTuningSpacesVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IEnumTuningSpaces_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IEnumTuningSpaces_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IEnumTuningSpaces_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IEnumTuningSpaces_Next(This,celt,rgelt,pceltFetched) \ - (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) - -#define IEnumTuningSpaces_Skip(This,celt) \ - (This)->lpVtbl -> Skip(This,celt) - -#define IEnumTuningSpaces_Reset(This) \ - (This)->lpVtbl -> Reset(This) - -#define IEnumTuningSpaces_Clone(This,ppEnum) \ - (This)->lpVtbl -> Clone(This,ppEnum) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IEnumTuningSpaces_Next_Proxy( - IEnumTuningSpaces * This, - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ ITuningSpace **rgelt, - /* [out] */ ULONG *pceltFetched); - - -void __RPC_STUB IEnumTuningSpaces_Next_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumTuningSpaces_Skip_Proxy( - IEnumTuningSpaces * This, - /* [in] */ ULONG celt); - - -void __RPC_STUB IEnumTuningSpaces_Skip_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumTuningSpaces_Reset_Proxy( - IEnumTuningSpaces * This); - - -void __RPC_STUB IEnumTuningSpaces_Reset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumTuningSpaces_Clone_Proxy( - IEnumTuningSpaces * This, - /* [out] */ IEnumTuningSpaces **ppEnum); - - -void __RPC_STUB IEnumTuningSpaces_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IEnumTuningSpaces_INTERFACE_DEFINED__ */ - - -#ifndef __IDVBTuningSpace_INTERFACE_DEFINED__ -#define __IDVBTuningSpace_INTERFACE_DEFINED__ - -/* interface IDVBTuningSpace */ -/* [unique][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_IDVBTuningSpace; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("ADA0B268-3B19-4e5b-ACC4-49F852BE13BA") - IDVBTuningSpace : public ITuningSpace - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SystemType( - /* [retval][out] */ DVBSystemType *SysType) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SystemType( - /* [in] */ DVBSystemType SysType) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDVBTuningSpaceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDVBTuningSpace * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDVBTuningSpace * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDVBTuningSpace * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDVBTuningSpace * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDVBTuningSpace * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDVBTuningSpace * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDVBTuningSpace * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueName )( - IDVBTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_UniqueName )( - IDVBTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( - IDVBTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( - IDVBTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CLSID )( - IDVBTuningSpace * This, - /* [retval][out] */ BSTR *SpaceCLSID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_NetworkType )( - IDVBTuningSpace * This, - /* [retval][out] */ BSTR *NetworkTypeGuid); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_NetworkType )( - IDVBTuningSpace * This, - /* [in] */ BSTR NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NetworkType )( - IDVBTuningSpace * This, - /* [retval][out] */ GUID *NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__NetworkType )( - IDVBTuningSpace * This, - /* [in] */ REFCLSID NetworkTypeGuid); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CreateTuneRequest )( - IDVBTuningSpace * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumCategoryGUIDs )( - IDVBTuningSpace * This, - /* [retval][out] */ IEnumGUID **ppEnum); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumDeviceMonikers )( - IDVBTuningSpace * This, - /* [retval][out] */ IEnumMoniker **ppEnum); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes )( - IDVBTuningSpace * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes )( - IDVBTuningSpace * This, - /* [in] */ IComponentTypes *NewComponentTypes); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FrequencyMapping )( - IDVBTuningSpace * This, - /* [retval][out] */ BSTR *pMapping); - - /* [restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FrequencyMapping )( - IDVBTuningSpace * This, - BSTR Mapping); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultLocator )( - IDVBTuningSpace * This, - /* [retval][out] */ ILocator **LocatorVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultLocator )( - IDVBTuningSpace * This, - /* [in] */ ILocator *LocatorVal); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IDVBTuningSpace * This, - /* [retval][out] */ ITuningSpace **NewTS); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SystemType )( - IDVBTuningSpace * This, - /* [retval][out] */ DVBSystemType *SysType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SystemType )( - IDVBTuningSpace * This, - /* [in] */ DVBSystemType SysType); - - END_INTERFACE - } IDVBTuningSpaceVtbl; - - interface IDVBTuningSpace - { - CONST_VTBL struct IDVBTuningSpaceVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDVBTuningSpace_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDVBTuningSpace_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDVBTuningSpace_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDVBTuningSpace_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IDVBTuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IDVBTuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IDVBTuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IDVBTuningSpace_get_UniqueName(This,Name) \ - (This)->lpVtbl -> get_UniqueName(This,Name) - -#define IDVBTuningSpace_put_UniqueName(This,Name) \ - (This)->lpVtbl -> put_UniqueName(This,Name) - -#define IDVBTuningSpace_get_FriendlyName(This,Name) \ - (This)->lpVtbl -> get_FriendlyName(This,Name) - -#define IDVBTuningSpace_put_FriendlyName(This,Name) \ - (This)->lpVtbl -> put_FriendlyName(This,Name) - -#define IDVBTuningSpace_get_CLSID(This,SpaceCLSID) \ - (This)->lpVtbl -> get_CLSID(This,SpaceCLSID) - -#define IDVBTuningSpace_get_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get_NetworkType(This,NetworkTypeGuid) - -#define IDVBTuningSpace_put_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put_NetworkType(This,NetworkTypeGuid) - -#define IDVBTuningSpace_get__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get__NetworkType(This,NetworkTypeGuid) - -#define IDVBTuningSpace_put__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put__NetworkType(This,NetworkTypeGuid) - -#define IDVBTuningSpace_CreateTuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> CreateTuneRequest(This,TuneRequest) - -#define IDVBTuningSpace_EnumCategoryGUIDs(This,ppEnum) \ - (This)->lpVtbl -> EnumCategoryGUIDs(This,ppEnum) - -#define IDVBTuningSpace_EnumDeviceMonikers(This,ppEnum) \ - (This)->lpVtbl -> EnumDeviceMonikers(This,ppEnum) - -#define IDVBTuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> get_DefaultPreferredComponentTypes(This,ComponentTypes) - -#define IDVBTuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) \ - (This)->lpVtbl -> put_DefaultPreferredComponentTypes(This,NewComponentTypes) - -#define IDVBTuningSpace_get_FrequencyMapping(This,pMapping) \ - (This)->lpVtbl -> get_FrequencyMapping(This,pMapping) - -#define IDVBTuningSpace_put_FrequencyMapping(This,Mapping) \ - (This)->lpVtbl -> put_FrequencyMapping(This,Mapping) - -#define IDVBTuningSpace_get_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> get_DefaultLocator(This,LocatorVal) - -#define IDVBTuningSpace_put_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> put_DefaultLocator(This,LocatorVal) - -#define IDVBTuningSpace_Clone(This,NewTS) \ - (This)->lpVtbl -> Clone(This,NewTS) - - -#define IDVBTuningSpace_get_SystemType(This,SysType) \ - (This)->lpVtbl -> get_SystemType(This,SysType) - -#define IDVBTuningSpace_put_SystemType(This,SysType) \ - (This)->lpVtbl -> put_SystemType(This,SysType) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTuningSpace_get_SystemType_Proxy( - IDVBTuningSpace * This, - /* [retval][out] */ DVBSystemType *SysType); - - -void __RPC_STUB IDVBTuningSpace_get_SystemType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTuningSpace_put_SystemType_Proxy( - IDVBTuningSpace * This, - /* [in] */ DVBSystemType SysType); - - -void __RPC_STUB IDVBTuningSpace_put_SystemType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDVBTuningSpace_INTERFACE_DEFINED__ */ - - -#ifndef __IDVBTuningSpace2_INTERFACE_DEFINED__ -#define __IDVBTuningSpace2_INTERFACE_DEFINED__ - -/* interface IDVBTuningSpace2 */ -/* [unique][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_IDVBTuningSpace2; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("843188B4-CE62-43db-966B-8145A094E040") - IDVBTuningSpace2 : public IDVBTuningSpace - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_NetworkID( - /* [retval][out] */ long *NetworkID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_NetworkID( - /* [in] */ long NetworkID) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDVBTuningSpace2Vtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDVBTuningSpace2 * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDVBTuningSpace2 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDVBTuningSpace2 * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDVBTuningSpace2 * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDVBTuningSpace2 * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDVBTuningSpace2 * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDVBTuningSpace2 * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueName )( - IDVBTuningSpace2 * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_UniqueName )( - IDVBTuningSpace2 * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( - IDVBTuningSpace2 * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( - IDVBTuningSpace2 * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CLSID )( - IDVBTuningSpace2 * This, - /* [retval][out] */ BSTR *SpaceCLSID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_NetworkType )( - IDVBTuningSpace2 * This, - /* [retval][out] */ BSTR *NetworkTypeGuid); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_NetworkType )( - IDVBTuningSpace2 * This, - /* [in] */ BSTR NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NetworkType )( - IDVBTuningSpace2 * This, - /* [retval][out] */ GUID *NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__NetworkType )( - IDVBTuningSpace2 * This, - /* [in] */ REFCLSID NetworkTypeGuid); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CreateTuneRequest )( - IDVBTuningSpace2 * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumCategoryGUIDs )( - IDVBTuningSpace2 * This, - /* [retval][out] */ IEnumGUID **ppEnum); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumDeviceMonikers )( - IDVBTuningSpace2 * This, - /* [retval][out] */ IEnumMoniker **ppEnum); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes )( - IDVBTuningSpace2 * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes )( - IDVBTuningSpace2 * This, - /* [in] */ IComponentTypes *NewComponentTypes); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FrequencyMapping )( - IDVBTuningSpace2 * This, - /* [retval][out] */ BSTR *pMapping); - - /* [restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FrequencyMapping )( - IDVBTuningSpace2 * This, - BSTR Mapping); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultLocator )( - IDVBTuningSpace2 * This, - /* [retval][out] */ ILocator **LocatorVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultLocator )( - IDVBTuningSpace2 * This, - /* [in] */ ILocator *LocatorVal); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IDVBTuningSpace2 * This, - /* [retval][out] */ ITuningSpace **NewTS); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SystemType )( - IDVBTuningSpace2 * This, - /* [retval][out] */ DVBSystemType *SysType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SystemType )( - IDVBTuningSpace2 * This, - /* [in] */ DVBSystemType SysType); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_NetworkID )( - IDVBTuningSpace2 * This, - /* [retval][out] */ long *NetworkID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_NetworkID )( - IDVBTuningSpace2 * This, - /* [in] */ long NetworkID); - - END_INTERFACE - } IDVBTuningSpace2Vtbl; - - interface IDVBTuningSpace2 - { - CONST_VTBL struct IDVBTuningSpace2Vtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDVBTuningSpace2_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDVBTuningSpace2_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDVBTuningSpace2_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDVBTuningSpace2_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IDVBTuningSpace2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IDVBTuningSpace2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IDVBTuningSpace2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IDVBTuningSpace2_get_UniqueName(This,Name) \ - (This)->lpVtbl -> get_UniqueName(This,Name) - -#define IDVBTuningSpace2_put_UniqueName(This,Name) \ - (This)->lpVtbl -> put_UniqueName(This,Name) - -#define IDVBTuningSpace2_get_FriendlyName(This,Name) \ - (This)->lpVtbl -> get_FriendlyName(This,Name) - -#define IDVBTuningSpace2_put_FriendlyName(This,Name) \ - (This)->lpVtbl -> put_FriendlyName(This,Name) - -#define IDVBTuningSpace2_get_CLSID(This,SpaceCLSID) \ - (This)->lpVtbl -> get_CLSID(This,SpaceCLSID) - -#define IDVBTuningSpace2_get_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get_NetworkType(This,NetworkTypeGuid) - -#define IDVBTuningSpace2_put_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put_NetworkType(This,NetworkTypeGuid) - -#define IDVBTuningSpace2_get__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get__NetworkType(This,NetworkTypeGuid) - -#define IDVBTuningSpace2_put__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put__NetworkType(This,NetworkTypeGuid) - -#define IDVBTuningSpace2_CreateTuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> CreateTuneRequest(This,TuneRequest) - -#define IDVBTuningSpace2_EnumCategoryGUIDs(This,ppEnum) \ - (This)->lpVtbl -> EnumCategoryGUIDs(This,ppEnum) - -#define IDVBTuningSpace2_EnumDeviceMonikers(This,ppEnum) \ - (This)->lpVtbl -> EnumDeviceMonikers(This,ppEnum) - -#define IDVBTuningSpace2_get_DefaultPreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> get_DefaultPreferredComponentTypes(This,ComponentTypes) - -#define IDVBTuningSpace2_put_DefaultPreferredComponentTypes(This,NewComponentTypes) \ - (This)->lpVtbl -> put_DefaultPreferredComponentTypes(This,NewComponentTypes) - -#define IDVBTuningSpace2_get_FrequencyMapping(This,pMapping) \ - (This)->lpVtbl -> get_FrequencyMapping(This,pMapping) - -#define IDVBTuningSpace2_put_FrequencyMapping(This,Mapping) \ - (This)->lpVtbl -> put_FrequencyMapping(This,Mapping) - -#define IDVBTuningSpace2_get_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> get_DefaultLocator(This,LocatorVal) - -#define IDVBTuningSpace2_put_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> put_DefaultLocator(This,LocatorVal) - -#define IDVBTuningSpace2_Clone(This,NewTS) \ - (This)->lpVtbl -> Clone(This,NewTS) - - -#define IDVBTuningSpace2_get_SystemType(This,SysType) \ - (This)->lpVtbl -> get_SystemType(This,SysType) - -#define IDVBTuningSpace2_put_SystemType(This,SysType) \ - (This)->lpVtbl -> put_SystemType(This,SysType) - - -#define IDVBTuningSpace2_get_NetworkID(This,NetworkID) \ - (This)->lpVtbl -> get_NetworkID(This,NetworkID) - -#define IDVBTuningSpace2_put_NetworkID(This,NetworkID) \ - (This)->lpVtbl -> put_NetworkID(This,NetworkID) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTuningSpace2_get_NetworkID_Proxy( - IDVBTuningSpace2 * This, - /* [retval][out] */ long *NetworkID); - - -void __RPC_STUB IDVBTuningSpace2_get_NetworkID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTuningSpace2_put_NetworkID_Proxy( - IDVBTuningSpace2 * This, - /* [in] */ long NetworkID); - - -void __RPC_STUB IDVBTuningSpace2_put_NetworkID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDVBTuningSpace2_INTERFACE_DEFINED__ */ - - -#ifndef __IDVBSTuningSpace_INTERFACE_DEFINED__ -#define __IDVBSTuningSpace_INTERFACE_DEFINED__ - -/* interface IDVBSTuningSpace */ -/* [unique][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_IDVBSTuningSpace; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("CDF7BE60-D954-42fd-A972-78971958E470") - IDVBSTuningSpace : public IDVBTuningSpace2 - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_LowOscillator( - /* [retval][out] */ long *LowOscillator) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_LowOscillator( - /* [in] */ long LowOscillator) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_HighOscillator( - /* [retval][out] */ long *HighOscillator) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_HighOscillator( - /* [in] */ long HighOscillator) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_LNBSwitch( - /* [retval][out] */ long *LNBSwitch) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_LNBSwitch( - /* [in] */ long LNBSwitch) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_InputRange( - /* [retval][out] */ BSTR *InputRange) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_InputRange( - /* [in] */ BSTR InputRange) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SpectralInversion( - /* [retval][out] */ SpectralInversion *SpectralInversionVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SpectralInversion( - /* [in] */ SpectralInversion SpectralInversionVal) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDVBSTuningSpaceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDVBSTuningSpace * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDVBSTuningSpace * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDVBSTuningSpace * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDVBSTuningSpace * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDVBSTuningSpace * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDVBSTuningSpace * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDVBSTuningSpace * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueName )( - IDVBSTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_UniqueName )( - IDVBSTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( - IDVBSTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( - IDVBSTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CLSID )( - IDVBSTuningSpace * This, - /* [retval][out] */ BSTR *SpaceCLSID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_NetworkType )( - IDVBSTuningSpace * This, - /* [retval][out] */ BSTR *NetworkTypeGuid); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_NetworkType )( - IDVBSTuningSpace * This, - /* [in] */ BSTR NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NetworkType )( - IDVBSTuningSpace * This, - /* [retval][out] */ GUID *NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__NetworkType )( - IDVBSTuningSpace * This, - /* [in] */ REFCLSID NetworkTypeGuid); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CreateTuneRequest )( - IDVBSTuningSpace * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumCategoryGUIDs )( - IDVBSTuningSpace * This, - /* [retval][out] */ IEnumGUID **ppEnum); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumDeviceMonikers )( - IDVBSTuningSpace * This, - /* [retval][out] */ IEnumMoniker **ppEnum); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes )( - IDVBSTuningSpace * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes )( - IDVBSTuningSpace * This, - /* [in] */ IComponentTypes *NewComponentTypes); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FrequencyMapping )( - IDVBSTuningSpace * This, - /* [retval][out] */ BSTR *pMapping); - - /* [restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FrequencyMapping )( - IDVBSTuningSpace * This, - BSTR Mapping); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultLocator )( - IDVBSTuningSpace * This, - /* [retval][out] */ ILocator **LocatorVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultLocator )( - IDVBSTuningSpace * This, - /* [in] */ ILocator *LocatorVal); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IDVBSTuningSpace * This, - /* [retval][out] */ ITuningSpace **NewTS); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SystemType )( - IDVBSTuningSpace * This, - /* [retval][out] */ DVBSystemType *SysType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SystemType )( - IDVBSTuningSpace * This, - /* [in] */ DVBSystemType SysType); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_NetworkID )( - IDVBSTuningSpace * This, - /* [retval][out] */ long *NetworkID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_NetworkID )( - IDVBSTuningSpace * This, - /* [in] */ long NetworkID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LowOscillator )( - IDVBSTuningSpace * This, - /* [retval][out] */ long *LowOscillator); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LowOscillator )( - IDVBSTuningSpace * This, - /* [in] */ long LowOscillator); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HighOscillator )( - IDVBSTuningSpace * This, - /* [retval][out] */ long *HighOscillator); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HighOscillator )( - IDVBSTuningSpace * This, - /* [in] */ long HighOscillator); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LNBSwitch )( - IDVBSTuningSpace * This, - /* [retval][out] */ long *LNBSwitch); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LNBSwitch )( - IDVBSTuningSpace * This, - /* [in] */ long LNBSwitch); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InputRange )( - IDVBSTuningSpace * This, - /* [retval][out] */ BSTR *InputRange); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InputRange )( - IDVBSTuningSpace * This, - /* [in] */ BSTR InputRange); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SpectralInversion )( - IDVBSTuningSpace * This, - /* [retval][out] */ SpectralInversion *SpectralInversionVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SpectralInversion )( - IDVBSTuningSpace * This, - /* [in] */ SpectralInversion SpectralInversionVal); - - END_INTERFACE - } IDVBSTuningSpaceVtbl; - - interface IDVBSTuningSpace - { - CONST_VTBL struct IDVBSTuningSpaceVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDVBSTuningSpace_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDVBSTuningSpace_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDVBSTuningSpace_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDVBSTuningSpace_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IDVBSTuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IDVBSTuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IDVBSTuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IDVBSTuningSpace_get_UniqueName(This,Name) \ - (This)->lpVtbl -> get_UniqueName(This,Name) - -#define IDVBSTuningSpace_put_UniqueName(This,Name) \ - (This)->lpVtbl -> put_UniqueName(This,Name) - -#define IDVBSTuningSpace_get_FriendlyName(This,Name) \ - (This)->lpVtbl -> get_FriendlyName(This,Name) - -#define IDVBSTuningSpace_put_FriendlyName(This,Name) \ - (This)->lpVtbl -> put_FriendlyName(This,Name) - -#define IDVBSTuningSpace_get_CLSID(This,SpaceCLSID) \ - (This)->lpVtbl -> get_CLSID(This,SpaceCLSID) - -#define IDVBSTuningSpace_get_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get_NetworkType(This,NetworkTypeGuid) - -#define IDVBSTuningSpace_put_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put_NetworkType(This,NetworkTypeGuid) - -#define IDVBSTuningSpace_get__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get__NetworkType(This,NetworkTypeGuid) - -#define IDVBSTuningSpace_put__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put__NetworkType(This,NetworkTypeGuid) - -#define IDVBSTuningSpace_CreateTuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> CreateTuneRequest(This,TuneRequest) - -#define IDVBSTuningSpace_EnumCategoryGUIDs(This,ppEnum) \ - (This)->lpVtbl -> EnumCategoryGUIDs(This,ppEnum) - -#define IDVBSTuningSpace_EnumDeviceMonikers(This,ppEnum) \ - (This)->lpVtbl -> EnumDeviceMonikers(This,ppEnum) - -#define IDVBSTuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> get_DefaultPreferredComponentTypes(This,ComponentTypes) - -#define IDVBSTuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) \ - (This)->lpVtbl -> put_DefaultPreferredComponentTypes(This,NewComponentTypes) - -#define IDVBSTuningSpace_get_FrequencyMapping(This,pMapping) \ - (This)->lpVtbl -> get_FrequencyMapping(This,pMapping) - -#define IDVBSTuningSpace_put_FrequencyMapping(This,Mapping) \ - (This)->lpVtbl -> put_FrequencyMapping(This,Mapping) - -#define IDVBSTuningSpace_get_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> get_DefaultLocator(This,LocatorVal) - -#define IDVBSTuningSpace_put_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> put_DefaultLocator(This,LocatorVal) - -#define IDVBSTuningSpace_Clone(This,NewTS) \ - (This)->lpVtbl -> Clone(This,NewTS) - - -#define IDVBSTuningSpace_get_SystemType(This,SysType) \ - (This)->lpVtbl -> get_SystemType(This,SysType) - -#define IDVBSTuningSpace_put_SystemType(This,SysType) \ - (This)->lpVtbl -> put_SystemType(This,SysType) - - -#define IDVBSTuningSpace_get_NetworkID(This,NetworkID) \ - (This)->lpVtbl -> get_NetworkID(This,NetworkID) - -#define IDVBSTuningSpace_put_NetworkID(This,NetworkID) \ - (This)->lpVtbl -> put_NetworkID(This,NetworkID) - - -#define IDVBSTuningSpace_get_LowOscillator(This,LowOscillator) \ - (This)->lpVtbl -> get_LowOscillator(This,LowOscillator) - -#define IDVBSTuningSpace_put_LowOscillator(This,LowOscillator) \ - (This)->lpVtbl -> put_LowOscillator(This,LowOscillator) - -#define IDVBSTuningSpace_get_HighOscillator(This,HighOscillator) \ - (This)->lpVtbl -> get_HighOscillator(This,HighOscillator) - -#define IDVBSTuningSpace_put_HighOscillator(This,HighOscillator) \ - (This)->lpVtbl -> put_HighOscillator(This,HighOscillator) - -#define IDVBSTuningSpace_get_LNBSwitch(This,LNBSwitch) \ - (This)->lpVtbl -> get_LNBSwitch(This,LNBSwitch) - -#define IDVBSTuningSpace_put_LNBSwitch(This,LNBSwitch) \ - (This)->lpVtbl -> put_LNBSwitch(This,LNBSwitch) - -#define IDVBSTuningSpace_get_InputRange(This,InputRange) \ - (This)->lpVtbl -> get_InputRange(This,InputRange) - -#define IDVBSTuningSpace_put_InputRange(This,InputRange) \ - (This)->lpVtbl -> put_InputRange(This,InputRange) - -#define IDVBSTuningSpace_get_SpectralInversion(This,SpectralInversionVal) \ - (This)->lpVtbl -> get_SpectralInversion(This,SpectralInversionVal) - -#define IDVBSTuningSpace_put_SpectralInversion(This,SpectralInversionVal) \ - (This)->lpVtbl -> put_SpectralInversion(This,SpectralInversionVal) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_get_LowOscillator_Proxy( - IDVBSTuningSpace * This, - /* [retval][out] */ long *LowOscillator); - - -void __RPC_STUB IDVBSTuningSpace_get_LowOscillator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_put_LowOscillator_Proxy( - IDVBSTuningSpace * This, - /* [in] */ long LowOscillator); - - -void __RPC_STUB IDVBSTuningSpace_put_LowOscillator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_get_HighOscillator_Proxy( - IDVBSTuningSpace * This, - /* [retval][out] */ long *HighOscillator); - - -void __RPC_STUB IDVBSTuningSpace_get_HighOscillator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_put_HighOscillator_Proxy( - IDVBSTuningSpace * This, - /* [in] */ long HighOscillator); - - -void __RPC_STUB IDVBSTuningSpace_put_HighOscillator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_get_LNBSwitch_Proxy( - IDVBSTuningSpace * This, - /* [retval][out] */ long *LNBSwitch); - - -void __RPC_STUB IDVBSTuningSpace_get_LNBSwitch_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_put_LNBSwitch_Proxy( - IDVBSTuningSpace * This, - /* [in] */ long LNBSwitch); - - -void __RPC_STUB IDVBSTuningSpace_put_LNBSwitch_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_get_InputRange_Proxy( - IDVBSTuningSpace * This, - /* [retval][out] */ BSTR *InputRange); - - -void __RPC_STUB IDVBSTuningSpace_get_InputRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_put_InputRange_Proxy( - IDVBSTuningSpace * This, - /* [in] */ BSTR InputRange); - - -void __RPC_STUB IDVBSTuningSpace_put_InputRange_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_get_SpectralInversion_Proxy( - IDVBSTuningSpace * This, - /* [retval][out] */ SpectralInversion *SpectralInversionVal); - - -void __RPC_STUB IDVBSTuningSpace_get_SpectralInversion_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_put_SpectralInversion_Proxy( - IDVBSTuningSpace * This, - /* [in] */ SpectralInversion SpectralInversionVal); - - -void __RPC_STUB IDVBSTuningSpace_put_SpectralInversion_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDVBSTuningSpace_INTERFACE_DEFINED__ */ - - -#ifndef __IAnalogTVTuningSpace_INTERFACE_DEFINED__ -#define __IAnalogTVTuningSpace_INTERFACE_DEFINED__ - -/* interface IAnalogTVTuningSpace */ -/* [unique][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_IAnalogTVTuningSpace; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("2A6E293C-2595-11d3-B64C-00C04F79498E") - IAnalogTVTuningSpace : public ITuningSpace - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MinChannel( - /* [retval][out] */ long *MinChannelVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MinChannel( - /* [in] */ long NewMinChannelVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MaxChannel( - /* [retval][out] */ long *MaxChannelVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MaxChannel( - /* [in] */ long NewMaxChannelVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_InputType( - /* [retval][out] */ TunerInputType *InputTypeVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_InputType( - /* [in] */ TunerInputType NewInputTypeVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CountryCode( - /* [retval][out] */ long *CountryCodeVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_CountryCode( - /* [in] */ long NewCountryCodeVal) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAnalogTVTuningSpaceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAnalogTVTuningSpace * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAnalogTVTuningSpace * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAnalogTVTuningSpace * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IAnalogTVTuningSpace * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IAnalogTVTuningSpace * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IAnalogTVTuningSpace * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IAnalogTVTuningSpace * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueName )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_UniqueName )( - IAnalogTVTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( - IAnalogTVTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CLSID )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ BSTR *SpaceCLSID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_NetworkType )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ BSTR *NetworkTypeGuid); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_NetworkType )( - IAnalogTVTuningSpace * This, - /* [in] */ BSTR NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NetworkType )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ GUID *NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__NetworkType )( - IAnalogTVTuningSpace * This, - /* [in] */ REFCLSID NetworkTypeGuid); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CreateTuneRequest )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumCategoryGUIDs )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ IEnumGUID **ppEnum); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumDeviceMonikers )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ IEnumMoniker **ppEnum); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes )( - IAnalogTVTuningSpace * This, - /* [in] */ IComponentTypes *NewComponentTypes); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FrequencyMapping )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ BSTR *pMapping); - - /* [restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FrequencyMapping )( - IAnalogTVTuningSpace * This, - BSTR Mapping); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultLocator )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ ILocator **LocatorVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultLocator )( - IAnalogTVTuningSpace * This, - /* [in] */ ILocator *LocatorVal); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ ITuningSpace **NewTS); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinChannel )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ long *MinChannelVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MinChannel )( - IAnalogTVTuningSpace * This, - /* [in] */ long NewMinChannelVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxChannel )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ long *MaxChannelVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MaxChannel )( - IAnalogTVTuningSpace * This, - /* [in] */ long NewMaxChannelVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InputType )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ TunerInputType *InputTypeVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InputType )( - IAnalogTVTuningSpace * This, - /* [in] */ TunerInputType NewInputTypeVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CountryCode )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ long *CountryCodeVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CountryCode )( - IAnalogTVTuningSpace * This, - /* [in] */ long NewCountryCodeVal); - - END_INTERFACE - } IAnalogTVTuningSpaceVtbl; - - interface IAnalogTVTuningSpace - { - CONST_VTBL struct IAnalogTVTuningSpaceVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAnalogTVTuningSpace_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAnalogTVTuningSpace_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAnalogTVTuningSpace_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAnalogTVTuningSpace_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IAnalogTVTuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IAnalogTVTuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IAnalogTVTuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IAnalogTVTuningSpace_get_UniqueName(This,Name) \ - (This)->lpVtbl -> get_UniqueName(This,Name) - -#define IAnalogTVTuningSpace_put_UniqueName(This,Name) \ - (This)->lpVtbl -> put_UniqueName(This,Name) - -#define IAnalogTVTuningSpace_get_FriendlyName(This,Name) \ - (This)->lpVtbl -> get_FriendlyName(This,Name) - -#define IAnalogTVTuningSpace_put_FriendlyName(This,Name) \ - (This)->lpVtbl -> put_FriendlyName(This,Name) - -#define IAnalogTVTuningSpace_get_CLSID(This,SpaceCLSID) \ - (This)->lpVtbl -> get_CLSID(This,SpaceCLSID) - -#define IAnalogTVTuningSpace_get_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get_NetworkType(This,NetworkTypeGuid) - -#define IAnalogTVTuningSpace_put_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put_NetworkType(This,NetworkTypeGuid) - -#define IAnalogTVTuningSpace_get__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get__NetworkType(This,NetworkTypeGuid) - -#define IAnalogTVTuningSpace_put__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put__NetworkType(This,NetworkTypeGuid) - -#define IAnalogTVTuningSpace_CreateTuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> CreateTuneRequest(This,TuneRequest) - -#define IAnalogTVTuningSpace_EnumCategoryGUIDs(This,ppEnum) \ - (This)->lpVtbl -> EnumCategoryGUIDs(This,ppEnum) - -#define IAnalogTVTuningSpace_EnumDeviceMonikers(This,ppEnum) \ - (This)->lpVtbl -> EnumDeviceMonikers(This,ppEnum) - -#define IAnalogTVTuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> get_DefaultPreferredComponentTypes(This,ComponentTypes) - -#define IAnalogTVTuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) \ - (This)->lpVtbl -> put_DefaultPreferredComponentTypes(This,NewComponentTypes) - -#define IAnalogTVTuningSpace_get_FrequencyMapping(This,pMapping) \ - (This)->lpVtbl -> get_FrequencyMapping(This,pMapping) - -#define IAnalogTVTuningSpace_put_FrequencyMapping(This,Mapping) \ - (This)->lpVtbl -> put_FrequencyMapping(This,Mapping) - -#define IAnalogTVTuningSpace_get_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> get_DefaultLocator(This,LocatorVal) - -#define IAnalogTVTuningSpace_put_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> put_DefaultLocator(This,LocatorVal) - -#define IAnalogTVTuningSpace_Clone(This,NewTS) \ - (This)->lpVtbl -> Clone(This,NewTS) - - -#define IAnalogTVTuningSpace_get_MinChannel(This,MinChannelVal) \ - (This)->lpVtbl -> get_MinChannel(This,MinChannelVal) - -#define IAnalogTVTuningSpace_put_MinChannel(This,NewMinChannelVal) \ - (This)->lpVtbl -> put_MinChannel(This,NewMinChannelVal) - -#define IAnalogTVTuningSpace_get_MaxChannel(This,MaxChannelVal) \ - (This)->lpVtbl -> get_MaxChannel(This,MaxChannelVal) - -#define IAnalogTVTuningSpace_put_MaxChannel(This,NewMaxChannelVal) \ - (This)->lpVtbl -> put_MaxChannel(This,NewMaxChannelVal) - -#define IAnalogTVTuningSpace_get_InputType(This,InputTypeVal) \ - (This)->lpVtbl -> get_InputType(This,InputTypeVal) - -#define IAnalogTVTuningSpace_put_InputType(This,NewInputTypeVal) \ - (This)->lpVtbl -> put_InputType(This,NewInputTypeVal) - -#define IAnalogTVTuningSpace_get_CountryCode(This,CountryCodeVal) \ - (This)->lpVtbl -> get_CountryCode(This,CountryCodeVal) - -#define IAnalogTVTuningSpace_put_CountryCode(This,NewCountryCodeVal) \ - (This)->lpVtbl -> put_CountryCode(This,NewCountryCodeVal) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_get_MinChannel_Proxy( - IAnalogTVTuningSpace * This, - /* [retval][out] */ long *MinChannelVal); - - -void __RPC_STUB IAnalogTVTuningSpace_get_MinChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_put_MinChannel_Proxy( - IAnalogTVTuningSpace * This, - /* [in] */ long NewMinChannelVal); - - -void __RPC_STUB IAnalogTVTuningSpace_put_MinChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_get_MaxChannel_Proxy( - IAnalogTVTuningSpace * This, - /* [retval][out] */ long *MaxChannelVal); - - -void __RPC_STUB IAnalogTVTuningSpace_get_MaxChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_put_MaxChannel_Proxy( - IAnalogTVTuningSpace * This, - /* [in] */ long NewMaxChannelVal); - - -void __RPC_STUB IAnalogTVTuningSpace_put_MaxChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_get_InputType_Proxy( - IAnalogTVTuningSpace * This, - /* [retval][out] */ TunerInputType *InputTypeVal); - - -void __RPC_STUB IAnalogTVTuningSpace_get_InputType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_put_InputType_Proxy( - IAnalogTVTuningSpace * This, - /* [in] */ TunerInputType NewInputTypeVal); - - -void __RPC_STUB IAnalogTVTuningSpace_put_InputType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_get_CountryCode_Proxy( - IAnalogTVTuningSpace * This, - /* [retval][out] */ long *CountryCodeVal); - - -void __RPC_STUB IAnalogTVTuningSpace_get_CountryCode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_put_CountryCode_Proxy( - IAnalogTVTuningSpace * This, - /* [in] */ long NewCountryCodeVal); - - -void __RPC_STUB IAnalogTVTuningSpace_put_CountryCode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAnalogTVTuningSpace_INTERFACE_DEFINED__ */ - - -#ifndef __IATSCTuningSpace_INTERFACE_DEFINED__ -#define __IATSCTuningSpace_INTERFACE_DEFINED__ - -/* interface IATSCTuningSpace */ -/* [unique][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_IATSCTuningSpace; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("0369B4E2-45B6-11d3-B650-00C04F79498E") - IATSCTuningSpace : public IAnalogTVTuningSpace - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MinMinorChannel( - /* [retval][out] */ long *MinMinorChannelVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MinMinorChannel( - /* [in] */ long NewMinMinorChannelVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MaxMinorChannel( - /* [retval][out] */ long *MaxMinorChannelVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MaxMinorChannel( - /* [in] */ long NewMaxMinorChannelVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MinPhysicalChannel( - /* [retval][out] */ long *MinPhysicalChannelVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MinPhysicalChannel( - /* [in] */ long NewMinPhysicalChannelVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MaxPhysicalChannel( - /* [retval][out] */ long *MaxPhysicalChannelVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MaxPhysicalChannel( - /* [in] */ long NewMaxPhysicalChannelVal) = 0; - - }; - -#else /* C style interface */ - - typedef struct IATSCTuningSpaceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IATSCTuningSpace * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IATSCTuningSpace * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IATSCTuningSpace * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IATSCTuningSpace * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IATSCTuningSpace * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IATSCTuningSpace * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IATSCTuningSpace * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueName )( - IATSCTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_UniqueName )( - IATSCTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( - IATSCTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( - IATSCTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CLSID )( - IATSCTuningSpace * This, - /* [retval][out] */ BSTR *SpaceCLSID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_NetworkType )( - IATSCTuningSpace * This, - /* [retval][out] */ BSTR *NetworkTypeGuid); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_NetworkType )( - IATSCTuningSpace * This, - /* [in] */ BSTR NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NetworkType )( - IATSCTuningSpace * This, - /* [retval][out] */ GUID *NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__NetworkType )( - IATSCTuningSpace * This, - /* [in] */ REFCLSID NetworkTypeGuid); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CreateTuneRequest )( - IATSCTuningSpace * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumCategoryGUIDs )( - IATSCTuningSpace * This, - /* [retval][out] */ IEnumGUID **ppEnum); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumDeviceMonikers )( - IATSCTuningSpace * This, - /* [retval][out] */ IEnumMoniker **ppEnum); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes )( - IATSCTuningSpace * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes )( - IATSCTuningSpace * This, - /* [in] */ IComponentTypes *NewComponentTypes); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FrequencyMapping )( - IATSCTuningSpace * This, - /* [retval][out] */ BSTR *pMapping); - - /* [restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FrequencyMapping )( - IATSCTuningSpace * This, - BSTR Mapping); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultLocator )( - IATSCTuningSpace * This, - /* [retval][out] */ ILocator **LocatorVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultLocator )( - IATSCTuningSpace * This, - /* [in] */ ILocator *LocatorVal); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IATSCTuningSpace * This, - /* [retval][out] */ ITuningSpace **NewTS); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinChannel )( - IATSCTuningSpace * This, - /* [retval][out] */ long *MinChannelVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MinChannel )( - IATSCTuningSpace * This, - /* [in] */ long NewMinChannelVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxChannel )( - IATSCTuningSpace * This, - /* [retval][out] */ long *MaxChannelVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MaxChannel )( - IATSCTuningSpace * This, - /* [in] */ long NewMaxChannelVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InputType )( - IATSCTuningSpace * This, - /* [retval][out] */ TunerInputType *InputTypeVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InputType )( - IATSCTuningSpace * This, - /* [in] */ TunerInputType NewInputTypeVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CountryCode )( - IATSCTuningSpace * This, - /* [retval][out] */ long *CountryCodeVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CountryCode )( - IATSCTuningSpace * This, - /* [in] */ long NewCountryCodeVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinMinorChannel )( - IATSCTuningSpace * This, - /* [retval][out] */ long *MinMinorChannelVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MinMinorChannel )( - IATSCTuningSpace * This, - /* [in] */ long NewMinMinorChannelVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxMinorChannel )( - IATSCTuningSpace * This, - /* [retval][out] */ long *MaxMinorChannelVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MaxMinorChannel )( - IATSCTuningSpace * This, - /* [in] */ long NewMaxMinorChannelVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinPhysicalChannel )( - IATSCTuningSpace * This, - /* [retval][out] */ long *MinPhysicalChannelVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MinPhysicalChannel )( - IATSCTuningSpace * This, - /* [in] */ long NewMinPhysicalChannelVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxPhysicalChannel )( - IATSCTuningSpace * This, - /* [retval][out] */ long *MaxPhysicalChannelVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MaxPhysicalChannel )( - IATSCTuningSpace * This, - /* [in] */ long NewMaxPhysicalChannelVal); - - END_INTERFACE - } IATSCTuningSpaceVtbl; - - interface IATSCTuningSpace - { - CONST_VTBL struct IATSCTuningSpaceVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IATSCTuningSpace_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IATSCTuningSpace_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IATSCTuningSpace_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IATSCTuningSpace_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IATSCTuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IATSCTuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IATSCTuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IATSCTuningSpace_get_UniqueName(This,Name) \ - (This)->lpVtbl -> get_UniqueName(This,Name) - -#define IATSCTuningSpace_put_UniqueName(This,Name) \ - (This)->lpVtbl -> put_UniqueName(This,Name) - -#define IATSCTuningSpace_get_FriendlyName(This,Name) \ - (This)->lpVtbl -> get_FriendlyName(This,Name) - -#define IATSCTuningSpace_put_FriendlyName(This,Name) \ - (This)->lpVtbl -> put_FriendlyName(This,Name) - -#define IATSCTuningSpace_get_CLSID(This,SpaceCLSID) \ - (This)->lpVtbl -> get_CLSID(This,SpaceCLSID) - -#define IATSCTuningSpace_get_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get_NetworkType(This,NetworkTypeGuid) - -#define IATSCTuningSpace_put_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put_NetworkType(This,NetworkTypeGuid) - -#define IATSCTuningSpace_get__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get__NetworkType(This,NetworkTypeGuid) - -#define IATSCTuningSpace_put__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put__NetworkType(This,NetworkTypeGuid) - -#define IATSCTuningSpace_CreateTuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> CreateTuneRequest(This,TuneRequest) - -#define IATSCTuningSpace_EnumCategoryGUIDs(This,ppEnum) \ - (This)->lpVtbl -> EnumCategoryGUIDs(This,ppEnum) - -#define IATSCTuningSpace_EnumDeviceMonikers(This,ppEnum) \ - (This)->lpVtbl -> EnumDeviceMonikers(This,ppEnum) - -#define IATSCTuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> get_DefaultPreferredComponentTypes(This,ComponentTypes) - -#define IATSCTuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) \ - (This)->lpVtbl -> put_DefaultPreferredComponentTypes(This,NewComponentTypes) - -#define IATSCTuningSpace_get_FrequencyMapping(This,pMapping) \ - (This)->lpVtbl -> get_FrequencyMapping(This,pMapping) - -#define IATSCTuningSpace_put_FrequencyMapping(This,Mapping) \ - (This)->lpVtbl -> put_FrequencyMapping(This,Mapping) - -#define IATSCTuningSpace_get_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> get_DefaultLocator(This,LocatorVal) - -#define IATSCTuningSpace_put_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> put_DefaultLocator(This,LocatorVal) - -#define IATSCTuningSpace_Clone(This,NewTS) \ - (This)->lpVtbl -> Clone(This,NewTS) - - -#define IATSCTuningSpace_get_MinChannel(This,MinChannelVal) \ - (This)->lpVtbl -> get_MinChannel(This,MinChannelVal) - -#define IATSCTuningSpace_put_MinChannel(This,NewMinChannelVal) \ - (This)->lpVtbl -> put_MinChannel(This,NewMinChannelVal) - -#define IATSCTuningSpace_get_MaxChannel(This,MaxChannelVal) \ - (This)->lpVtbl -> get_MaxChannel(This,MaxChannelVal) - -#define IATSCTuningSpace_put_MaxChannel(This,NewMaxChannelVal) \ - (This)->lpVtbl -> put_MaxChannel(This,NewMaxChannelVal) - -#define IATSCTuningSpace_get_InputType(This,InputTypeVal) \ - (This)->lpVtbl -> get_InputType(This,InputTypeVal) - -#define IATSCTuningSpace_put_InputType(This,NewInputTypeVal) \ - (This)->lpVtbl -> put_InputType(This,NewInputTypeVal) - -#define IATSCTuningSpace_get_CountryCode(This,CountryCodeVal) \ - (This)->lpVtbl -> get_CountryCode(This,CountryCodeVal) - -#define IATSCTuningSpace_put_CountryCode(This,NewCountryCodeVal) \ - (This)->lpVtbl -> put_CountryCode(This,NewCountryCodeVal) - - -#define IATSCTuningSpace_get_MinMinorChannel(This,MinMinorChannelVal) \ - (This)->lpVtbl -> get_MinMinorChannel(This,MinMinorChannelVal) - -#define IATSCTuningSpace_put_MinMinorChannel(This,NewMinMinorChannelVal) \ - (This)->lpVtbl -> put_MinMinorChannel(This,NewMinMinorChannelVal) - -#define IATSCTuningSpace_get_MaxMinorChannel(This,MaxMinorChannelVal) \ - (This)->lpVtbl -> get_MaxMinorChannel(This,MaxMinorChannelVal) - -#define IATSCTuningSpace_put_MaxMinorChannel(This,NewMaxMinorChannelVal) \ - (This)->lpVtbl -> put_MaxMinorChannel(This,NewMaxMinorChannelVal) - -#define IATSCTuningSpace_get_MinPhysicalChannel(This,MinPhysicalChannelVal) \ - (This)->lpVtbl -> get_MinPhysicalChannel(This,MinPhysicalChannelVal) - -#define IATSCTuningSpace_put_MinPhysicalChannel(This,NewMinPhysicalChannelVal) \ - (This)->lpVtbl -> put_MinPhysicalChannel(This,NewMinPhysicalChannelVal) - -#define IATSCTuningSpace_get_MaxPhysicalChannel(This,MaxPhysicalChannelVal) \ - (This)->lpVtbl -> get_MaxPhysicalChannel(This,MaxPhysicalChannelVal) - -#define IATSCTuningSpace_put_MaxPhysicalChannel(This,NewMaxPhysicalChannelVal) \ - (This)->lpVtbl -> put_MaxPhysicalChannel(This,NewMaxPhysicalChannelVal) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IATSCTuningSpace_get_MinMinorChannel_Proxy( - IATSCTuningSpace * This, - /* [retval][out] */ long *MinMinorChannelVal); - - -void __RPC_STUB IATSCTuningSpace_get_MinMinorChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IATSCTuningSpace_put_MinMinorChannel_Proxy( - IATSCTuningSpace * This, - /* [in] */ long NewMinMinorChannelVal); - - -void __RPC_STUB IATSCTuningSpace_put_MinMinorChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IATSCTuningSpace_get_MaxMinorChannel_Proxy( - IATSCTuningSpace * This, - /* [retval][out] */ long *MaxMinorChannelVal); - - -void __RPC_STUB IATSCTuningSpace_get_MaxMinorChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IATSCTuningSpace_put_MaxMinorChannel_Proxy( - IATSCTuningSpace * This, - /* [in] */ long NewMaxMinorChannelVal); - - -void __RPC_STUB IATSCTuningSpace_put_MaxMinorChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IATSCTuningSpace_get_MinPhysicalChannel_Proxy( - IATSCTuningSpace * This, - /* [retval][out] */ long *MinPhysicalChannelVal); - - -void __RPC_STUB IATSCTuningSpace_get_MinPhysicalChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IATSCTuningSpace_put_MinPhysicalChannel_Proxy( - IATSCTuningSpace * This, - /* [in] */ long NewMinPhysicalChannelVal); - - -void __RPC_STUB IATSCTuningSpace_put_MinPhysicalChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IATSCTuningSpace_get_MaxPhysicalChannel_Proxy( - IATSCTuningSpace * This, - /* [retval][out] */ long *MaxPhysicalChannelVal); - - -void __RPC_STUB IATSCTuningSpace_get_MaxPhysicalChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IATSCTuningSpace_put_MaxPhysicalChannel_Proxy( - IATSCTuningSpace * This, - /* [in] */ long NewMaxPhysicalChannelVal); - - -void __RPC_STUB IATSCTuningSpace_put_MaxPhysicalChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IATSCTuningSpace_INTERFACE_DEFINED__ */ - - -#ifndef __IAnalogRadioTuningSpace_INTERFACE_DEFINED__ -#define __IAnalogRadioTuningSpace_INTERFACE_DEFINED__ - -/* interface IAnalogRadioTuningSpace */ -/* [unique][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_IAnalogRadioTuningSpace; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("2A6E293B-2595-11d3-B64C-00C04F79498E") - IAnalogRadioTuningSpace : public ITuningSpace - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MinFrequency( - /* [retval][out] */ long *MinFrequencyVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MinFrequency( - /* [in] */ long NewMinFrequencyVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MaxFrequency( - /* [retval][out] */ long *MaxFrequencyVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MaxFrequency( - /* [in] */ long NewMaxFrequencyVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Step( - /* [retval][out] */ long *StepVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Step( - /* [in] */ long NewStepVal) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAnalogRadioTuningSpaceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAnalogRadioTuningSpace * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAnalogRadioTuningSpace * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAnalogRadioTuningSpace * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IAnalogRadioTuningSpace * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IAnalogRadioTuningSpace * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IAnalogRadioTuningSpace * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IAnalogRadioTuningSpace * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueName )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_UniqueName )( - IAnalogRadioTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( - IAnalogRadioTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CLSID )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ BSTR *SpaceCLSID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_NetworkType )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ BSTR *NetworkTypeGuid); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_NetworkType )( - IAnalogRadioTuningSpace * This, - /* [in] */ BSTR NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NetworkType )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ GUID *NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__NetworkType )( - IAnalogRadioTuningSpace * This, - /* [in] */ REFCLSID NetworkTypeGuid); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CreateTuneRequest )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumCategoryGUIDs )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ IEnumGUID **ppEnum); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumDeviceMonikers )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ IEnumMoniker **ppEnum); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes )( - IAnalogRadioTuningSpace * This, - /* [in] */ IComponentTypes *NewComponentTypes); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FrequencyMapping )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ BSTR *pMapping); - - /* [restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FrequencyMapping )( - IAnalogRadioTuningSpace * This, - BSTR Mapping); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultLocator )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ ILocator **LocatorVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultLocator )( - IAnalogRadioTuningSpace * This, - /* [in] */ ILocator *LocatorVal); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ ITuningSpace **NewTS); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinFrequency )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ long *MinFrequencyVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MinFrequency )( - IAnalogRadioTuningSpace * This, - /* [in] */ long NewMinFrequencyVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxFrequency )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ long *MaxFrequencyVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MaxFrequency )( - IAnalogRadioTuningSpace * This, - /* [in] */ long NewMaxFrequencyVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Step )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ long *StepVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Step )( - IAnalogRadioTuningSpace * This, - /* [in] */ long NewStepVal); - - END_INTERFACE - } IAnalogRadioTuningSpaceVtbl; - - interface IAnalogRadioTuningSpace - { - CONST_VTBL struct IAnalogRadioTuningSpaceVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAnalogRadioTuningSpace_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAnalogRadioTuningSpace_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAnalogRadioTuningSpace_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAnalogRadioTuningSpace_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IAnalogRadioTuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IAnalogRadioTuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IAnalogRadioTuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IAnalogRadioTuningSpace_get_UniqueName(This,Name) \ - (This)->lpVtbl -> get_UniqueName(This,Name) - -#define IAnalogRadioTuningSpace_put_UniqueName(This,Name) \ - (This)->lpVtbl -> put_UniqueName(This,Name) - -#define IAnalogRadioTuningSpace_get_FriendlyName(This,Name) \ - (This)->lpVtbl -> get_FriendlyName(This,Name) - -#define IAnalogRadioTuningSpace_put_FriendlyName(This,Name) \ - (This)->lpVtbl -> put_FriendlyName(This,Name) - -#define IAnalogRadioTuningSpace_get_CLSID(This,SpaceCLSID) \ - (This)->lpVtbl -> get_CLSID(This,SpaceCLSID) - -#define IAnalogRadioTuningSpace_get_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get_NetworkType(This,NetworkTypeGuid) - -#define IAnalogRadioTuningSpace_put_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put_NetworkType(This,NetworkTypeGuid) - -#define IAnalogRadioTuningSpace_get__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get__NetworkType(This,NetworkTypeGuid) - -#define IAnalogRadioTuningSpace_put__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put__NetworkType(This,NetworkTypeGuid) - -#define IAnalogRadioTuningSpace_CreateTuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> CreateTuneRequest(This,TuneRequest) - -#define IAnalogRadioTuningSpace_EnumCategoryGUIDs(This,ppEnum) \ - (This)->lpVtbl -> EnumCategoryGUIDs(This,ppEnum) - -#define IAnalogRadioTuningSpace_EnumDeviceMonikers(This,ppEnum) \ - (This)->lpVtbl -> EnumDeviceMonikers(This,ppEnum) - -#define IAnalogRadioTuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> get_DefaultPreferredComponentTypes(This,ComponentTypes) - -#define IAnalogRadioTuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) \ - (This)->lpVtbl -> put_DefaultPreferredComponentTypes(This,NewComponentTypes) - -#define IAnalogRadioTuningSpace_get_FrequencyMapping(This,pMapping) \ - (This)->lpVtbl -> get_FrequencyMapping(This,pMapping) - -#define IAnalogRadioTuningSpace_put_FrequencyMapping(This,Mapping) \ - (This)->lpVtbl -> put_FrequencyMapping(This,Mapping) - -#define IAnalogRadioTuningSpace_get_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> get_DefaultLocator(This,LocatorVal) - -#define IAnalogRadioTuningSpace_put_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> put_DefaultLocator(This,LocatorVal) - -#define IAnalogRadioTuningSpace_Clone(This,NewTS) \ - (This)->lpVtbl -> Clone(This,NewTS) - - -#define IAnalogRadioTuningSpace_get_MinFrequency(This,MinFrequencyVal) \ - (This)->lpVtbl -> get_MinFrequency(This,MinFrequencyVal) - -#define IAnalogRadioTuningSpace_put_MinFrequency(This,NewMinFrequencyVal) \ - (This)->lpVtbl -> put_MinFrequency(This,NewMinFrequencyVal) - -#define IAnalogRadioTuningSpace_get_MaxFrequency(This,MaxFrequencyVal) \ - (This)->lpVtbl -> get_MaxFrequency(This,MaxFrequencyVal) - -#define IAnalogRadioTuningSpace_put_MaxFrequency(This,NewMaxFrequencyVal) \ - (This)->lpVtbl -> put_MaxFrequency(This,NewMaxFrequencyVal) - -#define IAnalogRadioTuningSpace_get_Step(This,StepVal) \ - (This)->lpVtbl -> get_Step(This,StepVal) - -#define IAnalogRadioTuningSpace_put_Step(This,NewStepVal) \ - (This)->lpVtbl -> put_Step(This,NewStepVal) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_get_MinFrequency_Proxy( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ long *MinFrequencyVal); - - -void __RPC_STUB IAnalogRadioTuningSpace_get_MinFrequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_put_MinFrequency_Proxy( - IAnalogRadioTuningSpace * This, - /* [in] */ long NewMinFrequencyVal); - - -void __RPC_STUB IAnalogRadioTuningSpace_put_MinFrequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_get_MaxFrequency_Proxy( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ long *MaxFrequencyVal); - - -void __RPC_STUB IAnalogRadioTuningSpace_get_MaxFrequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_put_MaxFrequency_Proxy( - IAnalogRadioTuningSpace * This, - /* [in] */ long NewMaxFrequencyVal); - - -void __RPC_STUB IAnalogRadioTuningSpace_put_MaxFrequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_get_Step_Proxy( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ long *StepVal); - - -void __RPC_STUB IAnalogRadioTuningSpace_get_Step_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_put_Step_Proxy( - IAnalogRadioTuningSpace * This, - /* [in] */ long NewStepVal); - - -void __RPC_STUB IAnalogRadioTuningSpace_put_Step_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAnalogRadioTuningSpace_INTERFACE_DEFINED__ */ - - -#ifndef __ITuneRequest_INTERFACE_DEFINED__ -#define __ITuneRequest_INTERFACE_DEFINED__ - -/* interface ITuneRequest */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - -EXTERN_C const IID IID_ITuneRequest; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("07DDC146-FC3D-11d2-9D8C-00C04F72D980") - ITuneRequest : public IDispatch - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_TuningSpace( - /* [retval][out] */ ITuningSpace **TuningSpace) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Components( - /* [retval][out] */ IComponents **Components) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clone( - /* [retval][out] */ ITuneRequest **NewTuneRequest) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Locator( - /* [retval][out] */ ILocator **Locator) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Locator( - /* [in] */ ILocator *Locator) = 0; - - }; - -#else /* C style interface */ - - typedef struct ITuneRequestVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ITuneRequest * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ITuneRequest * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ITuneRequest * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - ITuneRequest * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - ITuneRequest * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - ITuneRequest * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - ITuneRequest * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuningSpace )( - ITuneRequest * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Components )( - ITuneRequest * This, - /* [retval][out] */ IComponents **Components); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - ITuneRequest * This, - /* [retval][out] */ ITuneRequest **NewTuneRequest); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Locator )( - ITuneRequest * This, - /* [retval][out] */ ILocator **Locator); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Locator )( - ITuneRequest * This, - /* [in] */ ILocator *Locator); - - END_INTERFACE - } ITuneRequestVtbl; - - interface ITuneRequest - { - CONST_VTBL struct ITuneRequestVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ITuneRequest_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ITuneRequest_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ITuneRequest_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ITuneRequest_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define ITuneRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define ITuneRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define ITuneRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define ITuneRequest_get_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> get_TuningSpace(This,TuningSpace) - -#define ITuneRequest_get_Components(This,Components) \ - (This)->lpVtbl -> get_Components(This,Components) - -#define ITuneRequest_Clone(This,NewTuneRequest) \ - (This)->lpVtbl -> Clone(This,NewTuneRequest) - -#define ITuneRequest_get_Locator(This,Locator) \ - (This)->lpVtbl -> get_Locator(This,Locator) - -#define ITuneRequest_put_Locator(This,Locator) \ - (This)->lpVtbl -> put_Locator(This,Locator) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ITuneRequest_get_TuningSpace_Proxy( - ITuneRequest * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - -void __RPC_STUB ITuneRequest_get_TuningSpace_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ITuneRequest_get_Components_Proxy( - ITuneRequest * This, - /* [retval][out] */ IComponents **Components); - - -void __RPC_STUB ITuneRequest_get_Components_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ITuneRequest_Clone_Proxy( - ITuneRequest * This, - /* [retval][out] */ ITuneRequest **NewTuneRequest); - - -void __RPC_STUB ITuneRequest_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ITuneRequest_get_Locator_Proxy( - ITuneRequest * This, - /* [retval][out] */ ILocator **Locator); - - -void __RPC_STUB ITuneRequest_get_Locator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ITuneRequest_put_Locator_Proxy( - ITuneRequest * This, - /* [in] */ ILocator *Locator); - - -void __RPC_STUB ITuneRequest_put_Locator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ITuneRequest_INTERFACE_DEFINED__ */ - - -#ifndef __IChannelTuneRequest_INTERFACE_DEFINED__ -#define __IChannelTuneRequest_INTERFACE_DEFINED__ - -/* interface IChannelTuneRequest */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - -EXTERN_C const IID IID_IChannelTuneRequest; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("0369B4E0-45B6-11d3-B650-00C04F79498E") - IChannelTuneRequest : public ITuneRequest - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Channel( - /* [retval][out] */ long *Channel) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Channel( - /* [in] */ long Channel) = 0; - - }; - -#else /* C style interface */ - - typedef struct IChannelTuneRequestVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IChannelTuneRequest * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IChannelTuneRequest * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IChannelTuneRequest * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IChannelTuneRequest * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IChannelTuneRequest * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IChannelTuneRequest * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IChannelTuneRequest * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuningSpace )( - IChannelTuneRequest * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Components )( - IChannelTuneRequest * This, - /* [retval][out] */ IComponents **Components); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IChannelTuneRequest * This, - /* [retval][out] */ ITuneRequest **NewTuneRequest); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Locator )( - IChannelTuneRequest * This, - /* [retval][out] */ ILocator **Locator); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Locator )( - IChannelTuneRequest * This, - /* [in] */ ILocator *Locator); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Channel )( - IChannelTuneRequest * This, - /* [retval][out] */ long *Channel); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Channel )( - IChannelTuneRequest * This, - /* [in] */ long Channel); - - END_INTERFACE - } IChannelTuneRequestVtbl; - - interface IChannelTuneRequest - { - CONST_VTBL struct IChannelTuneRequestVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IChannelTuneRequest_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IChannelTuneRequest_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IChannelTuneRequest_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IChannelTuneRequest_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IChannelTuneRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IChannelTuneRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IChannelTuneRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IChannelTuneRequest_get_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> get_TuningSpace(This,TuningSpace) - -#define IChannelTuneRequest_get_Components(This,Components) \ - (This)->lpVtbl -> get_Components(This,Components) - -#define IChannelTuneRequest_Clone(This,NewTuneRequest) \ - (This)->lpVtbl -> Clone(This,NewTuneRequest) - -#define IChannelTuneRequest_get_Locator(This,Locator) \ - (This)->lpVtbl -> get_Locator(This,Locator) - -#define IChannelTuneRequest_put_Locator(This,Locator) \ - (This)->lpVtbl -> put_Locator(This,Locator) - - -#define IChannelTuneRequest_get_Channel(This,Channel) \ - (This)->lpVtbl -> get_Channel(This,Channel) - -#define IChannelTuneRequest_put_Channel(This,Channel) \ - (This)->lpVtbl -> put_Channel(This,Channel) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IChannelTuneRequest_get_Channel_Proxy( - IChannelTuneRequest * This, - /* [retval][out] */ long *Channel); - - -void __RPC_STUB IChannelTuneRequest_get_Channel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IChannelTuneRequest_put_Channel_Proxy( - IChannelTuneRequest * This, - /* [in] */ long Channel); - - -void __RPC_STUB IChannelTuneRequest_put_Channel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IChannelTuneRequest_INTERFACE_DEFINED__ */ - - -#ifndef __IATSCChannelTuneRequest_INTERFACE_DEFINED__ -#define __IATSCChannelTuneRequest_INTERFACE_DEFINED__ - -/* interface IATSCChannelTuneRequest */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - -EXTERN_C const IID IID_IATSCChannelTuneRequest; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("0369B4E1-45B6-11d3-B650-00C04F79498E") - IATSCChannelTuneRequest : public IChannelTuneRequest - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MinorChannel( - /* [retval][out] */ long *MinorChannel) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MinorChannel( - /* [in] */ long MinorChannel) = 0; - - }; - -#else /* C style interface */ - - typedef struct IATSCChannelTuneRequestVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IATSCChannelTuneRequest * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IATSCChannelTuneRequest * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IATSCChannelTuneRequest * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IATSCChannelTuneRequest * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IATSCChannelTuneRequest * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IATSCChannelTuneRequest * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IATSCChannelTuneRequest * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuningSpace )( - IATSCChannelTuneRequest * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Components )( - IATSCChannelTuneRequest * This, - /* [retval][out] */ IComponents **Components); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IATSCChannelTuneRequest * This, - /* [retval][out] */ ITuneRequest **NewTuneRequest); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Locator )( - IATSCChannelTuneRequest * This, - /* [retval][out] */ ILocator **Locator); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Locator )( - IATSCChannelTuneRequest * This, - /* [in] */ ILocator *Locator); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Channel )( - IATSCChannelTuneRequest * This, - /* [retval][out] */ long *Channel); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Channel )( - IATSCChannelTuneRequest * This, - /* [in] */ long Channel); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinorChannel )( - IATSCChannelTuneRequest * This, - /* [retval][out] */ long *MinorChannel); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MinorChannel )( - IATSCChannelTuneRequest * This, - /* [in] */ long MinorChannel); - - END_INTERFACE - } IATSCChannelTuneRequestVtbl; - - interface IATSCChannelTuneRequest - { - CONST_VTBL struct IATSCChannelTuneRequestVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IATSCChannelTuneRequest_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IATSCChannelTuneRequest_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IATSCChannelTuneRequest_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IATSCChannelTuneRequest_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IATSCChannelTuneRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IATSCChannelTuneRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IATSCChannelTuneRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IATSCChannelTuneRequest_get_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> get_TuningSpace(This,TuningSpace) - -#define IATSCChannelTuneRequest_get_Components(This,Components) \ - (This)->lpVtbl -> get_Components(This,Components) - -#define IATSCChannelTuneRequest_Clone(This,NewTuneRequest) \ - (This)->lpVtbl -> Clone(This,NewTuneRequest) - -#define IATSCChannelTuneRequest_get_Locator(This,Locator) \ - (This)->lpVtbl -> get_Locator(This,Locator) - -#define IATSCChannelTuneRequest_put_Locator(This,Locator) \ - (This)->lpVtbl -> put_Locator(This,Locator) - - -#define IATSCChannelTuneRequest_get_Channel(This,Channel) \ - (This)->lpVtbl -> get_Channel(This,Channel) - -#define IATSCChannelTuneRequest_put_Channel(This,Channel) \ - (This)->lpVtbl -> put_Channel(This,Channel) - - -#define IATSCChannelTuneRequest_get_MinorChannel(This,MinorChannel) \ - (This)->lpVtbl -> get_MinorChannel(This,MinorChannel) - -#define IATSCChannelTuneRequest_put_MinorChannel(This,MinorChannel) \ - (This)->lpVtbl -> put_MinorChannel(This,MinorChannel) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IATSCChannelTuneRequest_get_MinorChannel_Proxy( - IATSCChannelTuneRequest * This, - /* [retval][out] */ long *MinorChannel); - - -void __RPC_STUB IATSCChannelTuneRequest_get_MinorChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IATSCChannelTuneRequest_put_MinorChannel_Proxy( - IATSCChannelTuneRequest * This, - /* [in] */ long MinorChannel); - - -void __RPC_STUB IATSCChannelTuneRequest_put_MinorChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IATSCChannelTuneRequest_INTERFACE_DEFINED__ */ - - -#ifndef __IDVBTuneRequest_INTERFACE_DEFINED__ -#define __IDVBTuneRequest_INTERFACE_DEFINED__ - -/* interface IDVBTuneRequest */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - -EXTERN_C const IID IID_IDVBTuneRequest; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("0D6F567E-A636-42bb-83BA-CE4C1704AFA2") - IDVBTuneRequest : public ITuneRequest - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ONID( - /* [retval][out] */ long *ONID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ONID( - /* [in] */ long ONID) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_TSID( - /* [retval][out] */ long *TSID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_TSID( - /* [in] */ long TSID) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SID( - /* [retval][out] */ long *SID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SID( - /* [in] */ long SID) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDVBTuneRequestVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDVBTuneRequest * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDVBTuneRequest * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDVBTuneRequest * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDVBTuneRequest * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDVBTuneRequest * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDVBTuneRequest * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDVBTuneRequest * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuningSpace )( - IDVBTuneRequest * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Components )( - IDVBTuneRequest * This, - /* [retval][out] */ IComponents **Components); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IDVBTuneRequest * This, - /* [retval][out] */ ITuneRequest **NewTuneRequest); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Locator )( - IDVBTuneRequest * This, - /* [retval][out] */ ILocator **Locator); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Locator )( - IDVBTuneRequest * This, - /* [in] */ ILocator *Locator); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ONID )( - IDVBTuneRequest * This, - /* [retval][out] */ long *ONID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ONID )( - IDVBTuneRequest * This, - /* [in] */ long ONID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TSID )( - IDVBTuneRequest * This, - /* [retval][out] */ long *TSID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_TSID )( - IDVBTuneRequest * This, - /* [in] */ long TSID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SID )( - IDVBTuneRequest * This, - /* [retval][out] */ long *SID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SID )( - IDVBTuneRequest * This, - /* [in] */ long SID); - - END_INTERFACE - } IDVBTuneRequestVtbl; - - interface IDVBTuneRequest - { - CONST_VTBL struct IDVBTuneRequestVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDVBTuneRequest_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDVBTuneRequest_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDVBTuneRequest_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDVBTuneRequest_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IDVBTuneRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IDVBTuneRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IDVBTuneRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IDVBTuneRequest_get_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> get_TuningSpace(This,TuningSpace) - -#define IDVBTuneRequest_get_Components(This,Components) \ - (This)->lpVtbl -> get_Components(This,Components) - -#define IDVBTuneRequest_Clone(This,NewTuneRequest) \ - (This)->lpVtbl -> Clone(This,NewTuneRequest) - -#define IDVBTuneRequest_get_Locator(This,Locator) \ - (This)->lpVtbl -> get_Locator(This,Locator) - -#define IDVBTuneRequest_put_Locator(This,Locator) \ - (This)->lpVtbl -> put_Locator(This,Locator) - - -#define IDVBTuneRequest_get_ONID(This,ONID) \ - (This)->lpVtbl -> get_ONID(This,ONID) - -#define IDVBTuneRequest_put_ONID(This,ONID) \ - (This)->lpVtbl -> put_ONID(This,ONID) - -#define IDVBTuneRequest_get_TSID(This,TSID) \ - (This)->lpVtbl -> get_TSID(This,TSID) - -#define IDVBTuneRequest_put_TSID(This,TSID) \ - (This)->lpVtbl -> put_TSID(This,TSID) - -#define IDVBTuneRequest_get_SID(This,SID) \ - (This)->lpVtbl -> get_SID(This,SID) - -#define IDVBTuneRequest_put_SID(This,SID) \ - (This)->lpVtbl -> put_SID(This,SID) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTuneRequest_get_ONID_Proxy( - IDVBTuneRequest * This, - /* [retval][out] */ long *ONID); - - -void __RPC_STUB IDVBTuneRequest_get_ONID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTuneRequest_put_ONID_Proxy( - IDVBTuneRequest * This, - /* [in] */ long ONID); - - -void __RPC_STUB IDVBTuneRequest_put_ONID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTuneRequest_get_TSID_Proxy( - IDVBTuneRequest * This, - /* [retval][out] */ long *TSID); - - -void __RPC_STUB IDVBTuneRequest_get_TSID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTuneRequest_put_TSID_Proxy( - IDVBTuneRequest * This, - /* [in] */ long TSID); - - -void __RPC_STUB IDVBTuneRequest_put_TSID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTuneRequest_get_SID_Proxy( - IDVBTuneRequest * This, - /* [retval][out] */ long *SID); - - -void __RPC_STUB IDVBTuneRequest_get_SID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTuneRequest_put_SID_Proxy( - IDVBTuneRequest * This, - /* [in] */ long SID); - - -void __RPC_STUB IDVBTuneRequest_put_SID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDVBTuneRequest_INTERFACE_DEFINED__ */ - - -#ifndef __IMPEG2TuneRequest_INTERFACE_DEFINED__ -#define __IMPEG2TuneRequest_INTERFACE_DEFINED__ - -/* interface IMPEG2TuneRequest */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - -EXTERN_C const IID IID_IMPEG2TuneRequest; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("EB7D987F-8A01-42ad-B8AE-574DEEE44D1A") - IMPEG2TuneRequest : public ITuneRequest - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_TSID( - /* [retval][out] */ long *TSID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_TSID( - /* [in] */ long TSID) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ProgNo( - /* [retval][out] */ long *ProgNo) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ProgNo( - /* [in] */ long ProgNo) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMPEG2TuneRequestVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMPEG2TuneRequest * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMPEG2TuneRequest * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMPEG2TuneRequest * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IMPEG2TuneRequest * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IMPEG2TuneRequest * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IMPEG2TuneRequest * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IMPEG2TuneRequest * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuningSpace )( - IMPEG2TuneRequest * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Components )( - IMPEG2TuneRequest * This, - /* [retval][out] */ IComponents **Components); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IMPEG2TuneRequest * This, - /* [retval][out] */ ITuneRequest **NewTuneRequest); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Locator )( - IMPEG2TuneRequest * This, - /* [retval][out] */ ILocator **Locator); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Locator )( - IMPEG2TuneRequest * This, - /* [in] */ ILocator *Locator); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TSID )( - IMPEG2TuneRequest * This, - /* [retval][out] */ long *TSID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_TSID )( - IMPEG2TuneRequest * This, - /* [in] */ long TSID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProgNo )( - IMPEG2TuneRequest * This, - /* [retval][out] */ long *ProgNo); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ProgNo )( - IMPEG2TuneRequest * This, - /* [in] */ long ProgNo); - - END_INTERFACE - } IMPEG2TuneRequestVtbl; - - interface IMPEG2TuneRequest - { - CONST_VTBL struct IMPEG2TuneRequestVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMPEG2TuneRequest_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMPEG2TuneRequest_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMPEG2TuneRequest_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMPEG2TuneRequest_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IMPEG2TuneRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IMPEG2TuneRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IMPEG2TuneRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IMPEG2TuneRequest_get_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> get_TuningSpace(This,TuningSpace) - -#define IMPEG2TuneRequest_get_Components(This,Components) \ - (This)->lpVtbl -> get_Components(This,Components) - -#define IMPEG2TuneRequest_Clone(This,NewTuneRequest) \ - (This)->lpVtbl -> Clone(This,NewTuneRequest) - -#define IMPEG2TuneRequest_get_Locator(This,Locator) \ - (This)->lpVtbl -> get_Locator(This,Locator) - -#define IMPEG2TuneRequest_put_Locator(This,Locator) \ - (This)->lpVtbl -> put_Locator(This,Locator) - - -#define IMPEG2TuneRequest_get_TSID(This,TSID) \ - (This)->lpVtbl -> get_TSID(This,TSID) - -#define IMPEG2TuneRequest_put_TSID(This,TSID) \ - (This)->lpVtbl -> put_TSID(This,TSID) - -#define IMPEG2TuneRequest_get_ProgNo(This,ProgNo) \ - (This)->lpVtbl -> get_ProgNo(This,ProgNo) - -#define IMPEG2TuneRequest_put_ProgNo(This,ProgNo) \ - (This)->lpVtbl -> put_ProgNo(This,ProgNo) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMPEG2TuneRequest_get_TSID_Proxy( - IMPEG2TuneRequest * This, - /* [retval][out] */ long *TSID); - - -void __RPC_STUB IMPEG2TuneRequest_get_TSID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IMPEG2TuneRequest_put_TSID_Proxy( - IMPEG2TuneRequest * This, - /* [in] */ long TSID); - - -void __RPC_STUB IMPEG2TuneRequest_put_TSID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMPEG2TuneRequest_get_ProgNo_Proxy( - IMPEG2TuneRequest * This, - /* [retval][out] */ long *ProgNo); - - -void __RPC_STUB IMPEG2TuneRequest_get_ProgNo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IMPEG2TuneRequest_put_ProgNo_Proxy( - IMPEG2TuneRequest * This, - /* [in] */ long ProgNo); - - -void __RPC_STUB IMPEG2TuneRequest_put_ProgNo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMPEG2TuneRequest_INTERFACE_DEFINED__ */ - - -#ifndef __IMPEG2TuneRequestFactory_INTERFACE_DEFINED__ -#define __IMPEG2TuneRequestFactory_INTERFACE_DEFINED__ - -/* interface IMPEG2TuneRequestFactory */ -/* [unique][helpstring][oleautomation][dual][uuid][hidden][nonextensible][object] */ - - -EXTERN_C const IID IID_IMPEG2TuneRequestFactory; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("14E11ABD-EE37-4893-9EA1-6964DE933E39") - IMPEG2TuneRequestFactory : public IDispatch - { - public: - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CreateTuneRequest( - /* [in] */ ITuningSpace *TuningSpace, - /* [retval][out] */ IMPEG2TuneRequest **TuneRequest) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMPEG2TuneRequestFactoryVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMPEG2TuneRequestFactory * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMPEG2TuneRequestFactory * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMPEG2TuneRequestFactory * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IMPEG2TuneRequestFactory * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IMPEG2TuneRequestFactory * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IMPEG2TuneRequestFactory * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IMPEG2TuneRequestFactory * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CreateTuneRequest )( - IMPEG2TuneRequestFactory * This, - /* [in] */ ITuningSpace *TuningSpace, - /* [retval][out] */ IMPEG2TuneRequest **TuneRequest); - - END_INTERFACE - } IMPEG2TuneRequestFactoryVtbl; - - interface IMPEG2TuneRequestFactory - { - CONST_VTBL struct IMPEG2TuneRequestFactoryVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMPEG2TuneRequestFactory_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMPEG2TuneRequestFactory_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMPEG2TuneRequestFactory_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMPEG2TuneRequestFactory_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IMPEG2TuneRequestFactory_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IMPEG2TuneRequestFactory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IMPEG2TuneRequestFactory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IMPEG2TuneRequestFactory_CreateTuneRequest(This,TuningSpace,TuneRequest) \ - (This)->lpVtbl -> CreateTuneRequest(This,TuningSpace,TuneRequest) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMPEG2TuneRequestFactory_CreateTuneRequest_Proxy( - IMPEG2TuneRequestFactory * This, - /* [in] */ ITuningSpace *TuningSpace, - /* [retval][out] */ IMPEG2TuneRequest **TuneRequest); - - -void __RPC_STUB IMPEG2TuneRequestFactory_CreateTuneRequest_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMPEG2TuneRequestFactory_INTERFACE_DEFINED__ */ - - -#ifndef __IMPEG2TuneRequestSupport_INTERFACE_DEFINED__ -#define __IMPEG2TuneRequestSupport_INTERFACE_DEFINED__ - -/* interface IMPEG2TuneRequestSupport */ -/* [unique][helpstring][uuid][nonextensible][restricted][hidden][object] */ - - -EXTERN_C const IID IID_IMPEG2TuneRequestSupport; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("1B9D5FC3-5BBC-4b6c-BB18-B9D10E3EEEBF") - IMPEG2TuneRequestSupport : public IUnknown - { - public: - }; - -#else /* C style interface */ - - typedef struct IMPEG2TuneRequestSupportVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMPEG2TuneRequestSupport * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMPEG2TuneRequestSupport * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMPEG2TuneRequestSupport * This); - - END_INTERFACE - } IMPEG2TuneRequestSupportVtbl; - - interface IMPEG2TuneRequestSupport - { - CONST_VTBL struct IMPEG2TuneRequestSupportVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMPEG2TuneRequestSupport_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMPEG2TuneRequestSupport_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMPEG2TuneRequestSupport_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __IMPEG2TuneRequestSupport_INTERFACE_DEFINED__ */ - - -#ifndef __ITuner_INTERFACE_DEFINED__ -#define __ITuner_INTERFACE_DEFINED__ - -/* interface ITuner */ -/* [unique][helpstring][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_ITuner; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("28C52640-018A-11d3-9D8E-00C04F72D980") - ITuner : public IUnknown - { - public: - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_TuningSpace( - /* [retval][out] */ ITuningSpace **TuningSpace) = 0; - - virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_TuningSpace( - /* [in] */ ITuningSpace *TuningSpace) = 0; - - virtual /* [helpstring][restricted][hidden] */ HRESULT STDMETHODCALLTYPE EnumTuningSpaces( - /* [retval][out] */ IEnumTuningSpaces **ppEnum) = 0; - - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_TuneRequest( - /* [retval][out] */ ITuneRequest **TuneRequest) = 0; - - virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_TuneRequest( - /* [in] */ ITuneRequest *TuneRequest) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Validate( - /* [in] */ ITuneRequest *TuneRequest) = 0; - - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_PreferredComponentTypes( - /* [retval][out] */ IComponentTypes **ComponentTypes) = 0; - - virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_PreferredComponentTypes( - /* [in] */ IComponentTypes *ComponentTypes) = 0; - - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_SignalStrength( - /* [retval][out] */ long *Strength) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE TriggerSignalEvents( - /* [in] */ long Interval) = 0; - - }; - -#else /* C style interface */ - - typedef struct ITunerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ITuner * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ITuner * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ITuner * This); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuningSpace )( - ITuner * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_TuningSpace )( - ITuner * This, - /* [in] */ ITuningSpace *TuningSpace); - - /* [helpstring][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *EnumTuningSpaces )( - ITuner * This, - /* [retval][out] */ IEnumTuningSpaces **ppEnum); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuneRequest )( - ITuner * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_TuneRequest )( - ITuner * This, - /* [in] */ ITuneRequest *TuneRequest); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *Validate )( - ITuner * This, - /* [in] */ ITuneRequest *TuneRequest); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PreferredComponentTypes )( - ITuner * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_PreferredComponentTypes )( - ITuner * This, - /* [in] */ IComponentTypes *ComponentTypes); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignalStrength )( - ITuner * This, - /* [retval][out] */ long *Strength); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *TriggerSignalEvents )( - ITuner * This, - /* [in] */ long Interval); - - END_INTERFACE - } ITunerVtbl; - - interface ITuner - { - CONST_VTBL struct ITunerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ITuner_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ITuner_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ITuner_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ITuner_get_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> get_TuningSpace(This,TuningSpace) - -#define ITuner_put_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> put_TuningSpace(This,TuningSpace) - -#define ITuner_EnumTuningSpaces(This,ppEnum) \ - (This)->lpVtbl -> EnumTuningSpaces(This,ppEnum) - -#define ITuner_get_TuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> get_TuneRequest(This,TuneRequest) - -#define ITuner_put_TuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> put_TuneRequest(This,TuneRequest) - -#define ITuner_Validate(This,TuneRequest) \ - (This)->lpVtbl -> Validate(This,TuneRequest) - -#define ITuner_get_PreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> get_PreferredComponentTypes(This,ComponentTypes) - -#define ITuner_put_PreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> put_PreferredComponentTypes(This,ComponentTypes) - -#define ITuner_get_SignalStrength(This,Strength) \ - (This)->lpVtbl -> get_SignalStrength(This,Strength) - -#define ITuner_TriggerSignalEvents(This,Interval) \ - (This)->lpVtbl -> TriggerSignalEvents(This,Interval) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ITuner_get_TuningSpace_Proxy( - ITuner * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - -void __RPC_STUB ITuner_get_TuningSpace_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE ITuner_put_TuningSpace_Proxy( - ITuner * This, - /* [in] */ ITuningSpace *TuningSpace); - - -void __RPC_STUB ITuner_put_TuningSpace_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][restricted][hidden] */ HRESULT STDMETHODCALLTYPE ITuner_EnumTuningSpaces_Proxy( - ITuner * This, - /* [retval][out] */ IEnumTuningSpaces **ppEnum); - - -void __RPC_STUB ITuner_EnumTuningSpaces_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ITuner_get_TuneRequest_Proxy( - ITuner * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - -void __RPC_STUB ITuner_get_TuneRequest_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE ITuner_put_TuneRequest_Proxy( - ITuner * This, - /* [in] */ ITuneRequest *TuneRequest); - - -void __RPC_STUB ITuner_put_TuneRequest_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE ITuner_Validate_Proxy( - ITuner * This, - /* [in] */ ITuneRequest *TuneRequest); - - -void __RPC_STUB ITuner_Validate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ITuner_get_PreferredComponentTypes_Proxy( - ITuner * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - -void __RPC_STUB ITuner_get_PreferredComponentTypes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE ITuner_put_PreferredComponentTypes_Proxy( - ITuner * This, - /* [in] */ IComponentTypes *ComponentTypes); - - -void __RPC_STUB ITuner_put_PreferredComponentTypes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ITuner_get_SignalStrength_Proxy( - ITuner * This, - /* [retval][out] */ long *Strength); - - -void __RPC_STUB ITuner_get_SignalStrength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE ITuner_TriggerSignalEvents_Proxy( - ITuner * This, - /* [in] */ long Interval); - - -void __RPC_STUB ITuner_TriggerSignalEvents_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ITuner_INTERFACE_DEFINED__ */ - - -#ifndef __IScanningTuner_INTERFACE_DEFINED__ -#define __IScanningTuner_INTERFACE_DEFINED__ - -/* interface IScanningTuner */ -/* [unique][helpstring][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_IScanningTuner; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("1DFD0A5C-0284-11d3-9D8E-00C04F72D980") - IScanningTuner : public ITuner - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SeekUp( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SeekDown( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ScanUp( - /* [in] */ long MillisecondsPause) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ScanDown( - /* [in] */ long MillisecondsPause) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE AutoProgram( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IScanningTunerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IScanningTuner * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IScanningTuner * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IScanningTuner * This); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuningSpace )( - IScanningTuner * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_TuningSpace )( - IScanningTuner * This, - /* [in] */ ITuningSpace *TuningSpace); - - /* [helpstring][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *EnumTuningSpaces )( - IScanningTuner * This, - /* [retval][out] */ IEnumTuningSpaces **ppEnum); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuneRequest )( - IScanningTuner * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_TuneRequest )( - IScanningTuner * This, - /* [in] */ ITuneRequest *TuneRequest); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *Validate )( - IScanningTuner * This, - /* [in] */ ITuneRequest *TuneRequest); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PreferredComponentTypes )( - IScanningTuner * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_PreferredComponentTypes )( - IScanningTuner * This, - /* [in] */ IComponentTypes *ComponentTypes); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignalStrength )( - IScanningTuner * This, - /* [retval][out] */ long *Strength); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *TriggerSignalEvents )( - IScanningTuner * This, - /* [in] */ long Interval); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SeekUp )( - IScanningTuner * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SeekDown )( - IScanningTuner * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *ScanUp )( - IScanningTuner * This, - /* [in] */ long MillisecondsPause); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *ScanDown )( - IScanningTuner * This, - /* [in] */ long MillisecondsPause); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *AutoProgram )( - IScanningTuner * This); - - END_INTERFACE - } IScanningTunerVtbl; - - interface IScanningTuner - { - CONST_VTBL struct IScanningTunerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IScanningTuner_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IScanningTuner_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IScanningTuner_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IScanningTuner_get_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> get_TuningSpace(This,TuningSpace) - -#define IScanningTuner_put_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> put_TuningSpace(This,TuningSpace) - -#define IScanningTuner_EnumTuningSpaces(This,ppEnum) \ - (This)->lpVtbl -> EnumTuningSpaces(This,ppEnum) - -#define IScanningTuner_get_TuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> get_TuneRequest(This,TuneRequest) - -#define IScanningTuner_put_TuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> put_TuneRequest(This,TuneRequest) - -#define IScanningTuner_Validate(This,TuneRequest) \ - (This)->lpVtbl -> Validate(This,TuneRequest) - -#define IScanningTuner_get_PreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> get_PreferredComponentTypes(This,ComponentTypes) - -#define IScanningTuner_put_PreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> put_PreferredComponentTypes(This,ComponentTypes) - -#define IScanningTuner_get_SignalStrength(This,Strength) \ - (This)->lpVtbl -> get_SignalStrength(This,Strength) - -#define IScanningTuner_TriggerSignalEvents(This,Interval) \ - (This)->lpVtbl -> TriggerSignalEvents(This,Interval) - - -#define IScanningTuner_SeekUp(This) \ - (This)->lpVtbl -> SeekUp(This) - -#define IScanningTuner_SeekDown(This) \ - (This)->lpVtbl -> SeekDown(This) - -#define IScanningTuner_ScanUp(This,MillisecondsPause) \ - (This)->lpVtbl -> ScanUp(This,MillisecondsPause) - -#define IScanningTuner_ScanDown(This,MillisecondsPause) \ - (This)->lpVtbl -> ScanDown(This,MillisecondsPause) - -#define IScanningTuner_AutoProgram(This) \ - (This)->lpVtbl -> AutoProgram(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IScanningTuner_SeekUp_Proxy( - IScanningTuner * This); - - -void __RPC_STUB IScanningTuner_SeekUp_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IScanningTuner_SeekDown_Proxy( - IScanningTuner * This); - - -void __RPC_STUB IScanningTuner_SeekDown_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IScanningTuner_ScanUp_Proxy( - IScanningTuner * This, - /* [in] */ long MillisecondsPause); - - -void __RPC_STUB IScanningTuner_ScanUp_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IScanningTuner_ScanDown_Proxy( - IScanningTuner * This, - /* [in] */ long MillisecondsPause); - - -void __RPC_STUB IScanningTuner_ScanDown_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IScanningTuner_AutoProgram_Proxy( - IScanningTuner * This); - - -void __RPC_STUB IScanningTuner_AutoProgram_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IScanningTuner_INTERFACE_DEFINED__ */ - - -#ifndef __IComponentType_INTERFACE_DEFINED__ -#define __IComponentType_INTERFACE_DEFINED__ - -/* interface IComponentType */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_IComponentType; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("6A340DC0-0311-11d3-9D8E-00C04F72D980") - IComponentType : public IDispatch - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Category( - /* [retval][out] */ ComponentCategory *Category) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Category( - /* [in] */ ComponentCategory Category) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MediaMajorType( - /* [retval][out] */ BSTR *MediaMajorType) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MediaMajorType( - /* [in] */ BSTR MediaMajorType) = 0; - - virtual /* [restricted][hidden][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__MediaMajorType( - /* [retval][out] */ GUID *MediaMajorTypeGuid) = 0; - - virtual /* [restricted][hidden][helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put__MediaMajorType( - /* [in] */ REFCLSID MediaMajorTypeGuid) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MediaSubType( - /* [retval][out] */ BSTR *MediaSubType) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MediaSubType( - /* [in] */ BSTR MediaSubType) = 0; - - virtual /* [restricted][hidden][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__MediaSubType( - /* [retval][out] */ GUID *MediaSubTypeGuid) = 0; - - virtual /* [restricted][hidden][helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put__MediaSubType( - /* [in] */ REFCLSID MediaSubTypeGuid) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MediaFormatType( - /* [retval][out] */ BSTR *MediaFormatType) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MediaFormatType( - /* [in] */ BSTR MediaFormatType) = 0; - - virtual /* [restricted][hidden][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__MediaFormatType( - /* [retval][out] */ GUID *MediaFormatTypeGuid) = 0; - - virtual /* [restricted][hidden][helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put__MediaFormatType( - /* [in] */ REFCLSID MediaFormatTypeGuid) = 0; - - virtual /* [helpstring][restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE get_MediaType( - /* [retval][out] */ AM_MEDIA_TYPE *MediaType) = 0; - - virtual /* [helpstring][restricted][hidden][id][propput] */ HRESULT STDMETHODCALLTYPE put_MediaType( - /* [in] */ AM_MEDIA_TYPE *MediaType) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clone( - /* [retval][out] */ IComponentType **NewCT) = 0; - - }; - -#else /* C style interface */ - - typedef struct IComponentTypeVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IComponentType * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IComponentType * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IComponentType * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IComponentType * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IComponentType * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IComponentType * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IComponentType * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Category )( - IComponentType * This, - /* [retval][out] */ ComponentCategory *Category); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Category )( - IComponentType * This, - /* [in] */ ComponentCategory Category); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaMajorType )( - IComponentType * This, - /* [retval][out] */ BSTR *MediaMajorType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaMajorType )( - IComponentType * This, - /* [in] */ BSTR MediaMajorType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaMajorType )( - IComponentType * This, - /* [retval][out] */ GUID *MediaMajorTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaMajorType )( - IComponentType * This, - /* [in] */ REFCLSID MediaMajorTypeGuid); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaSubType )( - IComponentType * This, - /* [retval][out] */ BSTR *MediaSubType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaSubType )( - IComponentType * This, - /* [in] */ BSTR MediaSubType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaSubType )( - IComponentType * This, - /* [retval][out] */ GUID *MediaSubTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaSubType )( - IComponentType * This, - /* [in] */ REFCLSID MediaSubTypeGuid); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaFormatType )( - IComponentType * This, - /* [retval][out] */ BSTR *MediaFormatType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaFormatType )( - IComponentType * This, - /* [in] */ BSTR MediaFormatType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaFormatType )( - IComponentType * This, - /* [retval][out] */ GUID *MediaFormatTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaFormatType )( - IComponentType * This, - /* [in] */ REFCLSID MediaFormatTypeGuid); - - /* [helpstring][restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaType )( - IComponentType * This, - /* [retval][out] */ AM_MEDIA_TYPE *MediaType); - - /* [helpstring][restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaType )( - IComponentType * This, - /* [in] */ AM_MEDIA_TYPE *MediaType); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IComponentType * This, - /* [retval][out] */ IComponentType **NewCT); - - END_INTERFACE - } IComponentTypeVtbl; - - interface IComponentType - { - CONST_VTBL struct IComponentTypeVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IComponentType_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IComponentType_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IComponentType_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IComponentType_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IComponentType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IComponentType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IComponentType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IComponentType_get_Category(This,Category) \ - (This)->lpVtbl -> get_Category(This,Category) - -#define IComponentType_put_Category(This,Category) \ - (This)->lpVtbl -> put_Category(This,Category) - -#define IComponentType_get_MediaMajorType(This,MediaMajorType) \ - (This)->lpVtbl -> get_MediaMajorType(This,MediaMajorType) - -#define IComponentType_put_MediaMajorType(This,MediaMajorType) \ - (This)->lpVtbl -> put_MediaMajorType(This,MediaMajorType) - -#define IComponentType_get__MediaMajorType(This,MediaMajorTypeGuid) \ - (This)->lpVtbl -> get__MediaMajorType(This,MediaMajorTypeGuid) - -#define IComponentType_put__MediaMajorType(This,MediaMajorTypeGuid) \ - (This)->lpVtbl -> put__MediaMajorType(This,MediaMajorTypeGuid) - -#define IComponentType_get_MediaSubType(This,MediaSubType) \ - (This)->lpVtbl -> get_MediaSubType(This,MediaSubType) - -#define IComponentType_put_MediaSubType(This,MediaSubType) \ - (This)->lpVtbl -> put_MediaSubType(This,MediaSubType) - -#define IComponentType_get__MediaSubType(This,MediaSubTypeGuid) \ - (This)->lpVtbl -> get__MediaSubType(This,MediaSubTypeGuid) - -#define IComponentType_put__MediaSubType(This,MediaSubTypeGuid) \ - (This)->lpVtbl -> put__MediaSubType(This,MediaSubTypeGuid) - -#define IComponentType_get_MediaFormatType(This,MediaFormatType) \ - (This)->lpVtbl -> get_MediaFormatType(This,MediaFormatType) - -#define IComponentType_put_MediaFormatType(This,MediaFormatType) \ - (This)->lpVtbl -> put_MediaFormatType(This,MediaFormatType) - -#define IComponentType_get__MediaFormatType(This,MediaFormatTypeGuid) \ - (This)->lpVtbl -> get__MediaFormatType(This,MediaFormatTypeGuid) - -#define IComponentType_put__MediaFormatType(This,MediaFormatTypeGuid) \ - (This)->lpVtbl -> put__MediaFormatType(This,MediaFormatTypeGuid) - -#define IComponentType_get_MediaType(This,MediaType) \ - (This)->lpVtbl -> get_MediaType(This,MediaType) - -#define IComponentType_put_MediaType(This,MediaType) \ - (This)->lpVtbl -> put_MediaType(This,MediaType) - -#define IComponentType_Clone(This,NewCT) \ - (This)->lpVtbl -> Clone(This,NewCT) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentType_get_Category_Proxy( - IComponentType * This, - /* [retval][out] */ ComponentCategory *Category); - - -void __RPC_STUB IComponentType_get_Category_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponentType_put_Category_Proxy( - IComponentType * This, - /* [in] */ ComponentCategory Category); - - -void __RPC_STUB IComponentType_put_Category_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentType_get_MediaMajorType_Proxy( - IComponentType * This, - /* [retval][out] */ BSTR *MediaMajorType); - - -void __RPC_STUB IComponentType_get_MediaMajorType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponentType_put_MediaMajorType_Proxy( - IComponentType * This, - /* [in] */ BSTR MediaMajorType); - - -void __RPC_STUB IComponentType_put_MediaMajorType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [restricted][hidden][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentType_get__MediaMajorType_Proxy( - IComponentType * This, - /* [retval][out] */ GUID *MediaMajorTypeGuid); - - -void __RPC_STUB IComponentType_get__MediaMajorType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [restricted][hidden][helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponentType_put__MediaMajorType_Proxy( - IComponentType * This, - /* [in] */ REFCLSID MediaMajorTypeGuid); - - -void __RPC_STUB IComponentType_put__MediaMajorType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentType_get_MediaSubType_Proxy( - IComponentType * This, - /* [retval][out] */ BSTR *MediaSubType); - - -void __RPC_STUB IComponentType_get_MediaSubType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponentType_put_MediaSubType_Proxy( - IComponentType * This, - /* [in] */ BSTR MediaSubType); - - -void __RPC_STUB IComponentType_put_MediaSubType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [restricted][hidden][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentType_get__MediaSubType_Proxy( - IComponentType * This, - /* [retval][out] */ GUID *MediaSubTypeGuid); - - -void __RPC_STUB IComponentType_get__MediaSubType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [restricted][hidden][helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponentType_put__MediaSubType_Proxy( - IComponentType * This, - /* [in] */ REFCLSID MediaSubTypeGuid); - - -void __RPC_STUB IComponentType_put__MediaSubType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentType_get_MediaFormatType_Proxy( - IComponentType * This, - /* [retval][out] */ BSTR *MediaFormatType); - - -void __RPC_STUB IComponentType_get_MediaFormatType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponentType_put_MediaFormatType_Proxy( - IComponentType * This, - /* [in] */ BSTR MediaFormatType); - - -void __RPC_STUB IComponentType_put_MediaFormatType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [restricted][hidden][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentType_get__MediaFormatType_Proxy( - IComponentType * This, - /* [retval][out] */ GUID *MediaFormatTypeGuid); - - -void __RPC_STUB IComponentType_get__MediaFormatType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [restricted][hidden][helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponentType_put__MediaFormatType_Proxy( - IComponentType * This, - /* [in] */ REFCLSID MediaFormatTypeGuid); - - -void __RPC_STUB IComponentType_put__MediaFormatType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentType_get_MediaType_Proxy( - IComponentType * This, - /* [retval][out] */ AM_MEDIA_TYPE *MediaType); - - -void __RPC_STUB IComponentType_get_MediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][restricted][hidden][id][propput] */ HRESULT STDMETHODCALLTYPE IComponentType_put_MediaType_Proxy( - IComponentType * This, - /* [in] */ AM_MEDIA_TYPE *MediaType); - - -void __RPC_STUB IComponentType_put_MediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IComponentType_Clone_Proxy( - IComponentType * This, - /* [retval][out] */ IComponentType **NewCT); - - -void __RPC_STUB IComponentType_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IComponentType_INTERFACE_DEFINED__ */ - - -#ifndef __ILanguageComponentType_INTERFACE_DEFINED__ -#define __ILanguageComponentType_INTERFACE_DEFINED__ - -/* interface ILanguageComponentType */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_ILanguageComponentType; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("B874C8BA-0FA2-11d3-9D8E-00C04F72D980") - ILanguageComponentType : public IComponentType - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_LangID( - /* [retval][out] */ long *LangID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_LangID( - /* [in] */ long LangID) = 0; - - }; - -#else /* C style interface */ - - typedef struct ILanguageComponentTypeVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILanguageComponentType * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ILanguageComponentType * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ILanguageComponentType * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - ILanguageComponentType * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - ILanguageComponentType * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - ILanguageComponentType * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - ILanguageComponentType * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Category )( - ILanguageComponentType * This, - /* [retval][out] */ ComponentCategory *Category); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Category )( - ILanguageComponentType * This, - /* [in] */ ComponentCategory Category); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaMajorType )( - ILanguageComponentType * This, - /* [retval][out] */ BSTR *MediaMajorType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaMajorType )( - ILanguageComponentType * This, - /* [in] */ BSTR MediaMajorType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaMajorType )( - ILanguageComponentType * This, - /* [retval][out] */ GUID *MediaMajorTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaMajorType )( - ILanguageComponentType * This, - /* [in] */ REFCLSID MediaMajorTypeGuid); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaSubType )( - ILanguageComponentType * This, - /* [retval][out] */ BSTR *MediaSubType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaSubType )( - ILanguageComponentType * This, - /* [in] */ BSTR MediaSubType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaSubType )( - ILanguageComponentType * This, - /* [retval][out] */ GUID *MediaSubTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaSubType )( - ILanguageComponentType * This, - /* [in] */ REFCLSID MediaSubTypeGuid); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaFormatType )( - ILanguageComponentType * This, - /* [retval][out] */ BSTR *MediaFormatType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaFormatType )( - ILanguageComponentType * This, - /* [in] */ BSTR MediaFormatType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaFormatType )( - ILanguageComponentType * This, - /* [retval][out] */ GUID *MediaFormatTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaFormatType )( - ILanguageComponentType * This, - /* [in] */ REFCLSID MediaFormatTypeGuid); - - /* [helpstring][restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaType )( - ILanguageComponentType * This, - /* [retval][out] */ AM_MEDIA_TYPE *MediaType); - - /* [helpstring][restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaType )( - ILanguageComponentType * This, - /* [in] */ AM_MEDIA_TYPE *MediaType); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - ILanguageComponentType * This, - /* [retval][out] */ IComponentType **NewCT); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LangID )( - ILanguageComponentType * This, - /* [retval][out] */ long *LangID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LangID )( - ILanguageComponentType * This, - /* [in] */ long LangID); - - END_INTERFACE - } ILanguageComponentTypeVtbl; - - interface ILanguageComponentType - { - CONST_VTBL struct ILanguageComponentTypeVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ILanguageComponentType_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ILanguageComponentType_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ILanguageComponentType_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ILanguageComponentType_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define ILanguageComponentType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define ILanguageComponentType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define ILanguageComponentType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define ILanguageComponentType_get_Category(This,Category) \ - (This)->lpVtbl -> get_Category(This,Category) - -#define ILanguageComponentType_put_Category(This,Category) \ - (This)->lpVtbl -> put_Category(This,Category) - -#define ILanguageComponentType_get_MediaMajorType(This,MediaMajorType) \ - (This)->lpVtbl -> get_MediaMajorType(This,MediaMajorType) - -#define ILanguageComponentType_put_MediaMajorType(This,MediaMajorType) \ - (This)->lpVtbl -> put_MediaMajorType(This,MediaMajorType) - -#define ILanguageComponentType_get__MediaMajorType(This,MediaMajorTypeGuid) \ - (This)->lpVtbl -> get__MediaMajorType(This,MediaMajorTypeGuid) - -#define ILanguageComponentType_put__MediaMajorType(This,MediaMajorTypeGuid) \ - (This)->lpVtbl -> put__MediaMajorType(This,MediaMajorTypeGuid) - -#define ILanguageComponentType_get_MediaSubType(This,MediaSubType) \ - (This)->lpVtbl -> get_MediaSubType(This,MediaSubType) - -#define ILanguageComponentType_put_MediaSubType(This,MediaSubType) \ - (This)->lpVtbl -> put_MediaSubType(This,MediaSubType) - -#define ILanguageComponentType_get__MediaSubType(This,MediaSubTypeGuid) \ - (This)->lpVtbl -> get__MediaSubType(This,MediaSubTypeGuid) - -#define ILanguageComponentType_put__MediaSubType(This,MediaSubTypeGuid) \ - (This)->lpVtbl -> put__MediaSubType(This,MediaSubTypeGuid) - -#define ILanguageComponentType_get_MediaFormatType(This,MediaFormatType) \ - (This)->lpVtbl -> get_MediaFormatType(This,MediaFormatType) - -#define ILanguageComponentType_put_MediaFormatType(This,MediaFormatType) \ - (This)->lpVtbl -> put_MediaFormatType(This,MediaFormatType) - -#define ILanguageComponentType_get__MediaFormatType(This,MediaFormatTypeGuid) \ - (This)->lpVtbl -> get__MediaFormatType(This,MediaFormatTypeGuid) - -#define ILanguageComponentType_put__MediaFormatType(This,MediaFormatTypeGuid) \ - (This)->lpVtbl -> put__MediaFormatType(This,MediaFormatTypeGuid) - -#define ILanguageComponentType_get_MediaType(This,MediaType) \ - (This)->lpVtbl -> get_MediaType(This,MediaType) - -#define ILanguageComponentType_put_MediaType(This,MediaType) \ - (This)->lpVtbl -> put_MediaType(This,MediaType) - -#define ILanguageComponentType_Clone(This,NewCT) \ - (This)->lpVtbl -> Clone(This,NewCT) - - -#define ILanguageComponentType_get_LangID(This,LangID) \ - (This)->lpVtbl -> get_LangID(This,LangID) - -#define ILanguageComponentType_put_LangID(This,LangID) \ - (This)->lpVtbl -> put_LangID(This,LangID) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ILanguageComponentType_get_LangID_Proxy( - ILanguageComponentType * This, - /* [retval][out] */ long *LangID); - - -void __RPC_STUB ILanguageComponentType_get_LangID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ILanguageComponentType_put_LangID_Proxy( - ILanguageComponentType * This, - /* [in] */ long LangID); - - -void __RPC_STUB ILanguageComponentType_put_LangID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ILanguageComponentType_INTERFACE_DEFINED__ */ - - -#ifndef __IMPEG2ComponentType_INTERFACE_DEFINED__ -#define __IMPEG2ComponentType_INTERFACE_DEFINED__ - -/* interface IMPEG2ComponentType */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_IMPEG2ComponentType; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("2C073D84-B51C-48c9-AA9F-68971E1F6E38") - IMPEG2ComponentType : public ILanguageComponentType - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_StreamType( - /* [retval][out] */ MPEG2StreamType *MP2StreamType) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_StreamType( - /* [in] */ MPEG2StreamType MP2StreamType) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMPEG2ComponentTypeVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMPEG2ComponentType * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMPEG2ComponentType * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMPEG2ComponentType * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IMPEG2ComponentType * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IMPEG2ComponentType * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IMPEG2ComponentType * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IMPEG2ComponentType * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Category )( - IMPEG2ComponentType * This, - /* [retval][out] */ ComponentCategory *Category); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Category )( - IMPEG2ComponentType * This, - /* [in] */ ComponentCategory Category); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaMajorType )( - IMPEG2ComponentType * This, - /* [retval][out] */ BSTR *MediaMajorType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaMajorType )( - IMPEG2ComponentType * This, - /* [in] */ BSTR MediaMajorType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaMajorType )( - IMPEG2ComponentType * This, - /* [retval][out] */ GUID *MediaMajorTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaMajorType )( - IMPEG2ComponentType * This, - /* [in] */ REFCLSID MediaMajorTypeGuid); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaSubType )( - IMPEG2ComponentType * This, - /* [retval][out] */ BSTR *MediaSubType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaSubType )( - IMPEG2ComponentType * This, - /* [in] */ BSTR MediaSubType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaSubType )( - IMPEG2ComponentType * This, - /* [retval][out] */ GUID *MediaSubTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaSubType )( - IMPEG2ComponentType * This, - /* [in] */ REFCLSID MediaSubTypeGuid); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaFormatType )( - IMPEG2ComponentType * This, - /* [retval][out] */ BSTR *MediaFormatType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaFormatType )( - IMPEG2ComponentType * This, - /* [in] */ BSTR MediaFormatType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaFormatType )( - IMPEG2ComponentType * This, - /* [retval][out] */ GUID *MediaFormatTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaFormatType )( - IMPEG2ComponentType * This, - /* [in] */ REFCLSID MediaFormatTypeGuid); - - /* [helpstring][restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaType )( - IMPEG2ComponentType * This, - /* [retval][out] */ AM_MEDIA_TYPE *MediaType); - - /* [helpstring][restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaType )( - IMPEG2ComponentType * This, - /* [in] */ AM_MEDIA_TYPE *MediaType); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IMPEG2ComponentType * This, - /* [retval][out] */ IComponentType **NewCT); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LangID )( - IMPEG2ComponentType * This, - /* [retval][out] */ long *LangID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LangID )( - IMPEG2ComponentType * This, - /* [in] */ long LangID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StreamType )( - IMPEG2ComponentType * This, - /* [retval][out] */ MPEG2StreamType *MP2StreamType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_StreamType )( - IMPEG2ComponentType * This, - /* [in] */ MPEG2StreamType MP2StreamType); - - END_INTERFACE - } IMPEG2ComponentTypeVtbl; - - interface IMPEG2ComponentType - { - CONST_VTBL struct IMPEG2ComponentTypeVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMPEG2ComponentType_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMPEG2ComponentType_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMPEG2ComponentType_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMPEG2ComponentType_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IMPEG2ComponentType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IMPEG2ComponentType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IMPEG2ComponentType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IMPEG2ComponentType_get_Category(This,Category) \ - (This)->lpVtbl -> get_Category(This,Category) - -#define IMPEG2ComponentType_put_Category(This,Category) \ - (This)->lpVtbl -> put_Category(This,Category) - -#define IMPEG2ComponentType_get_MediaMajorType(This,MediaMajorType) \ - (This)->lpVtbl -> get_MediaMajorType(This,MediaMajorType) - -#define IMPEG2ComponentType_put_MediaMajorType(This,MediaMajorType) \ - (This)->lpVtbl -> put_MediaMajorType(This,MediaMajorType) - -#define IMPEG2ComponentType_get__MediaMajorType(This,MediaMajorTypeGuid) \ - (This)->lpVtbl -> get__MediaMajorType(This,MediaMajorTypeGuid) - -#define IMPEG2ComponentType_put__MediaMajorType(This,MediaMajorTypeGuid) \ - (This)->lpVtbl -> put__MediaMajorType(This,MediaMajorTypeGuid) - -#define IMPEG2ComponentType_get_MediaSubType(This,MediaSubType) \ - (This)->lpVtbl -> get_MediaSubType(This,MediaSubType) - -#define IMPEG2ComponentType_put_MediaSubType(This,MediaSubType) \ - (This)->lpVtbl -> put_MediaSubType(This,MediaSubType) - -#define IMPEG2ComponentType_get__MediaSubType(This,MediaSubTypeGuid) \ - (This)->lpVtbl -> get__MediaSubType(This,MediaSubTypeGuid) - -#define IMPEG2ComponentType_put__MediaSubType(This,MediaSubTypeGuid) \ - (This)->lpVtbl -> put__MediaSubType(This,MediaSubTypeGuid) - -#define IMPEG2ComponentType_get_MediaFormatType(This,MediaFormatType) \ - (This)->lpVtbl -> get_MediaFormatType(This,MediaFormatType) - -#define IMPEG2ComponentType_put_MediaFormatType(This,MediaFormatType) \ - (This)->lpVtbl -> put_MediaFormatType(This,MediaFormatType) - -#define IMPEG2ComponentType_get__MediaFormatType(This,MediaFormatTypeGuid) \ - (This)->lpVtbl -> get__MediaFormatType(This,MediaFormatTypeGuid) - -#define IMPEG2ComponentType_put__MediaFormatType(This,MediaFormatTypeGuid) \ - (This)->lpVtbl -> put__MediaFormatType(This,MediaFormatTypeGuid) - -#define IMPEG2ComponentType_get_MediaType(This,MediaType) \ - (This)->lpVtbl -> get_MediaType(This,MediaType) - -#define IMPEG2ComponentType_put_MediaType(This,MediaType) \ - (This)->lpVtbl -> put_MediaType(This,MediaType) - -#define IMPEG2ComponentType_Clone(This,NewCT) \ - (This)->lpVtbl -> Clone(This,NewCT) - - -#define IMPEG2ComponentType_get_LangID(This,LangID) \ - (This)->lpVtbl -> get_LangID(This,LangID) - -#define IMPEG2ComponentType_put_LangID(This,LangID) \ - (This)->lpVtbl -> put_LangID(This,LangID) - - -#define IMPEG2ComponentType_get_StreamType(This,MP2StreamType) \ - (This)->lpVtbl -> get_StreamType(This,MP2StreamType) - -#define IMPEG2ComponentType_put_StreamType(This,MP2StreamType) \ - (This)->lpVtbl -> put_StreamType(This,MP2StreamType) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMPEG2ComponentType_get_StreamType_Proxy( - IMPEG2ComponentType * This, - /* [retval][out] */ MPEG2StreamType *MP2StreamType); - - -void __RPC_STUB IMPEG2ComponentType_get_StreamType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IMPEG2ComponentType_put_StreamType_Proxy( - IMPEG2ComponentType * This, - /* [in] */ MPEG2StreamType MP2StreamType); - - -void __RPC_STUB IMPEG2ComponentType_put_StreamType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMPEG2ComponentType_INTERFACE_DEFINED__ */ - - -#ifndef __IATSCComponentType_INTERFACE_DEFINED__ -#define __IATSCComponentType_INTERFACE_DEFINED__ - -/* interface IATSCComponentType */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_IATSCComponentType; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("FC189E4D-7BD4-4125-B3B3-3A76A332CC96") - IATSCComponentType : public IMPEG2ComponentType - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Flags( - /* [retval][out] */ long *Flags) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Flags( - /* [in] */ long flags) = 0; - - }; - -#else /* C style interface */ - - typedef struct IATSCComponentTypeVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IATSCComponentType * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IATSCComponentType * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IATSCComponentType * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IATSCComponentType * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IATSCComponentType * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IATSCComponentType * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IATSCComponentType * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Category )( - IATSCComponentType * This, - /* [retval][out] */ ComponentCategory *Category); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Category )( - IATSCComponentType * This, - /* [in] */ ComponentCategory Category); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaMajorType )( - IATSCComponentType * This, - /* [retval][out] */ BSTR *MediaMajorType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaMajorType )( - IATSCComponentType * This, - /* [in] */ BSTR MediaMajorType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaMajorType )( - IATSCComponentType * This, - /* [retval][out] */ GUID *MediaMajorTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaMajorType )( - IATSCComponentType * This, - /* [in] */ REFCLSID MediaMajorTypeGuid); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaSubType )( - IATSCComponentType * This, - /* [retval][out] */ BSTR *MediaSubType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaSubType )( - IATSCComponentType * This, - /* [in] */ BSTR MediaSubType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaSubType )( - IATSCComponentType * This, - /* [retval][out] */ GUID *MediaSubTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaSubType )( - IATSCComponentType * This, - /* [in] */ REFCLSID MediaSubTypeGuid); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaFormatType )( - IATSCComponentType * This, - /* [retval][out] */ BSTR *MediaFormatType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaFormatType )( - IATSCComponentType * This, - /* [in] */ BSTR MediaFormatType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaFormatType )( - IATSCComponentType * This, - /* [retval][out] */ GUID *MediaFormatTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaFormatType )( - IATSCComponentType * This, - /* [in] */ REFCLSID MediaFormatTypeGuid); - - /* [helpstring][restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaType )( - IATSCComponentType * This, - /* [retval][out] */ AM_MEDIA_TYPE *MediaType); - - /* [helpstring][restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaType )( - IATSCComponentType * This, - /* [in] */ AM_MEDIA_TYPE *MediaType); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IATSCComponentType * This, - /* [retval][out] */ IComponentType **NewCT); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LangID )( - IATSCComponentType * This, - /* [retval][out] */ long *LangID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LangID )( - IATSCComponentType * This, - /* [in] */ long LangID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StreamType )( - IATSCComponentType * This, - /* [retval][out] */ MPEG2StreamType *MP2StreamType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_StreamType )( - IATSCComponentType * This, - /* [in] */ MPEG2StreamType MP2StreamType); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Flags )( - IATSCComponentType * This, - /* [retval][out] */ long *Flags); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Flags )( - IATSCComponentType * This, - /* [in] */ long flags); - - END_INTERFACE - } IATSCComponentTypeVtbl; - - interface IATSCComponentType - { - CONST_VTBL struct IATSCComponentTypeVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IATSCComponentType_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IATSCComponentType_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IATSCComponentType_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IATSCComponentType_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IATSCComponentType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IATSCComponentType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IATSCComponentType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IATSCComponentType_get_Category(This,Category) \ - (This)->lpVtbl -> get_Category(This,Category) - -#define IATSCComponentType_put_Category(This,Category) \ - (This)->lpVtbl -> put_Category(This,Category) - -#define IATSCComponentType_get_MediaMajorType(This,MediaMajorType) \ - (This)->lpVtbl -> get_MediaMajorType(This,MediaMajorType) - -#define IATSCComponentType_put_MediaMajorType(This,MediaMajorType) \ - (This)->lpVtbl -> put_MediaMajorType(This,MediaMajorType) - -#define IATSCComponentType_get__MediaMajorType(This,MediaMajorTypeGuid) \ - (This)->lpVtbl -> get__MediaMajorType(This,MediaMajorTypeGuid) - -#define IATSCComponentType_put__MediaMajorType(This,MediaMajorTypeGuid) \ - (This)->lpVtbl -> put__MediaMajorType(This,MediaMajorTypeGuid) - -#define IATSCComponentType_get_MediaSubType(This,MediaSubType) \ - (This)->lpVtbl -> get_MediaSubType(This,MediaSubType) - -#define IATSCComponentType_put_MediaSubType(This,MediaSubType) \ - (This)->lpVtbl -> put_MediaSubType(This,MediaSubType) - -#define IATSCComponentType_get__MediaSubType(This,MediaSubTypeGuid) \ - (This)->lpVtbl -> get__MediaSubType(This,MediaSubTypeGuid) - -#define IATSCComponentType_put__MediaSubType(This,MediaSubTypeGuid) \ - (This)->lpVtbl -> put__MediaSubType(This,MediaSubTypeGuid) - -#define IATSCComponentType_get_MediaFormatType(This,MediaFormatType) \ - (This)->lpVtbl -> get_MediaFormatType(This,MediaFormatType) - -#define IATSCComponentType_put_MediaFormatType(This,MediaFormatType) \ - (This)->lpVtbl -> put_MediaFormatType(This,MediaFormatType) - -#define IATSCComponentType_get__MediaFormatType(This,MediaFormatTypeGuid) \ - (This)->lpVtbl -> get__MediaFormatType(This,MediaFormatTypeGuid) - -#define IATSCComponentType_put__MediaFormatType(This,MediaFormatTypeGuid) \ - (This)->lpVtbl -> put__MediaFormatType(This,MediaFormatTypeGuid) - -#define IATSCComponentType_get_MediaType(This,MediaType) \ - (This)->lpVtbl -> get_MediaType(This,MediaType) - -#define IATSCComponentType_put_MediaType(This,MediaType) \ - (This)->lpVtbl -> put_MediaType(This,MediaType) - -#define IATSCComponentType_Clone(This,NewCT) \ - (This)->lpVtbl -> Clone(This,NewCT) - - -#define IATSCComponentType_get_LangID(This,LangID) \ - (This)->lpVtbl -> get_LangID(This,LangID) - -#define IATSCComponentType_put_LangID(This,LangID) \ - (This)->lpVtbl -> put_LangID(This,LangID) - - -#define IATSCComponentType_get_StreamType(This,MP2StreamType) \ - (This)->lpVtbl -> get_StreamType(This,MP2StreamType) - -#define IATSCComponentType_put_StreamType(This,MP2StreamType) \ - (This)->lpVtbl -> put_StreamType(This,MP2StreamType) - - -#define IATSCComponentType_get_Flags(This,Flags) \ - (This)->lpVtbl -> get_Flags(This,Flags) - -#define IATSCComponentType_put_Flags(This,flags) \ - (This)->lpVtbl -> put_Flags(This,flags) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IATSCComponentType_get_Flags_Proxy( - IATSCComponentType * This, - /* [retval][out] */ long *Flags); - - -void __RPC_STUB IATSCComponentType_get_Flags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IATSCComponentType_put_Flags_Proxy( - IATSCComponentType * This, - /* [in] */ long flags); - - -void __RPC_STUB IATSCComponentType_put_Flags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IATSCComponentType_INTERFACE_DEFINED__ */ - - -#ifndef __IEnumComponentTypes_INTERFACE_DEFINED__ -#define __IEnumComponentTypes_INTERFACE_DEFINED__ - -/* interface IEnumComponentTypes */ -/* [unique][uuid][object][restricted][hidden] */ - - -EXTERN_C const IID IID_IEnumComponentTypes; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("8A674B4A-1F63-11d3-B64C-00C04F79498E") - IEnumComponentTypes : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Next( - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ IComponentType **rgelt, - /* [out] */ ULONG *pceltFetched) = 0; - - virtual HRESULT STDMETHODCALLTYPE Skip( - /* [in] */ ULONG celt) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - /* [out] */ IEnumComponentTypes **ppEnum) = 0; - - }; - -#else /* C style interface */ - - typedef struct IEnumComponentTypesVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IEnumComponentTypes * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IEnumComponentTypes * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IEnumComponentTypes * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - IEnumComponentTypes * This, - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ IComponentType **rgelt, - /* [out] */ ULONG *pceltFetched); - - HRESULT ( STDMETHODCALLTYPE *Skip )( - IEnumComponentTypes * This, - /* [in] */ ULONG celt); - - HRESULT ( STDMETHODCALLTYPE *Reset )( - IEnumComponentTypes * This); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IEnumComponentTypes * This, - /* [out] */ IEnumComponentTypes **ppEnum); - - END_INTERFACE - } IEnumComponentTypesVtbl; - - interface IEnumComponentTypes - { - CONST_VTBL struct IEnumComponentTypesVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IEnumComponentTypes_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IEnumComponentTypes_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IEnumComponentTypes_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IEnumComponentTypes_Next(This,celt,rgelt,pceltFetched) \ - (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) - -#define IEnumComponentTypes_Skip(This,celt) \ - (This)->lpVtbl -> Skip(This,celt) - -#define IEnumComponentTypes_Reset(This) \ - (This)->lpVtbl -> Reset(This) - -#define IEnumComponentTypes_Clone(This,ppEnum) \ - (This)->lpVtbl -> Clone(This,ppEnum) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IEnumComponentTypes_Next_Proxy( - IEnumComponentTypes * This, - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ IComponentType **rgelt, - /* [out] */ ULONG *pceltFetched); - - -void __RPC_STUB IEnumComponentTypes_Next_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumComponentTypes_Skip_Proxy( - IEnumComponentTypes * This, - /* [in] */ ULONG celt); - - -void __RPC_STUB IEnumComponentTypes_Skip_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumComponentTypes_Reset_Proxy( - IEnumComponentTypes * This); - - -void __RPC_STUB IEnumComponentTypes_Reset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumComponentTypes_Clone_Proxy( - IEnumComponentTypes * This, - /* [out] */ IEnumComponentTypes **ppEnum); - - -void __RPC_STUB IEnumComponentTypes_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IEnumComponentTypes_INTERFACE_DEFINED__ */ - - -#ifndef __IComponentTypes_INTERFACE_DEFINED__ -#define __IComponentTypes_INTERFACE_DEFINED__ - -/* interface IComponentTypes */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_IComponentTypes; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("0DC13D4A-0313-11d3-9D8E-00C04F72D980") - IComponentTypes : public IDispatch - { - public: - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( - /* [retval][out] */ long *Count) = 0; - - virtual /* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( - /* [retval][out] */ IEnumVARIANT **ppNewEnum) = 0; - - virtual /* [helpstring][restricted][hidden] */ HRESULT STDMETHODCALLTYPE EnumComponentTypes( - /* [retval][out] */ IEnumComponentTypes **ppNewEnum) = 0; - - virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Item( - /* [in] */ VARIANT Index, - /* [retval][out] */ IComponentType **ComponentType) = 0; - - virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_Item( - /* [in] */ VARIANT Index, - /* [in] */ IComponentType *ComponentType) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( - /* [in] */ IComponentType *ComponentType, - /* [retval][out] */ VARIANT *NewIndex) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( - /* [in] */ VARIANT Index) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Clone( - /* [retval][out] */ IComponentTypes **NewList) = 0; - - }; - -#else /* C style interface */ - - typedef struct IComponentTypesVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IComponentTypes * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IComponentTypes * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IComponentTypes * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IComponentTypes * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IComponentTypes * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IComponentTypes * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IComponentTypes * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( - IComponentTypes * This, - /* [retval][out] */ long *Count); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( - IComponentTypes * This, - /* [retval][out] */ IEnumVARIANT **ppNewEnum); - - /* [helpstring][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *EnumComponentTypes )( - IComponentTypes * This, - /* [retval][out] */ IEnumComponentTypes **ppNewEnum); - - /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Item )( - IComponentTypes * This, - /* [in] */ VARIANT Index, - /* [retval][out] */ IComponentType **ComponentType); - - /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_Item )( - IComponentTypes * This, - /* [in] */ VARIANT Index, - /* [in] */ IComponentType *ComponentType); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( - IComponentTypes * This, - /* [in] */ IComponentType *ComponentType, - /* [retval][out] */ VARIANT *NewIndex); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( - IComponentTypes * This, - /* [in] */ VARIANT Index); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IComponentTypes * This, - /* [retval][out] */ IComponentTypes **NewList); - - END_INTERFACE - } IComponentTypesVtbl; - - interface IComponentTypes - { - CONST_VTBL struct IComponentTypesVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IComponentTypes_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IComponentTypes_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IComponentTypes_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IComponentTypes_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IComponentTypes_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IComponentTypes_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IComponentTypes_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IComponentTypes_get_Count(This,Count) \ - (This)->lpVtbl -> get_Count(This,Count) - -#define IComponentTypes_get__NewEnum(This,ppNewEnum) \ - (This)->lpVtbl -> get__NewEnum(This,ppNewEnum) - -#define IComponentTypes_EnumComponentTypes(This,ppNewEnum) \ - (This)->lpVtbl -> EnumComponentTypes(This,ppNewEnum) - -#define IComponentTypes_get_Item(This,Index,ComponentType) \ - (This)->lpVtbl -> get_Item(This,Index,ComponentType) - -#define IComponentTypes_put_Item(This,Index,ComponentType) \ - (This)->lpVtbl -> put_Item(This,Index,ComponentType) - -#define IComponentTypes_Add(This,ComponentType,NewIndex) \ - (This)->lpVtbl -> Add(This,ComponentType,NewIndex) - -#define IComponentTypes_Remove(This,Index) \ - (This)->lpVtbl -> Remove(This,Index) - -#define IComponentTypes_Clone(This,NewList) \ - (This)->lpVtbl -> Clone(This,NewList) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IComponentTypes_get_Count_Proxy( - IComponentTypes * This, - /* [retval][out] */ long *Count); - - -void __RPC_STUB IComponentTypes_get_Count_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentTypes_get__NewEnum_Proxy( - IComponentTypes * This, - /* [retval][out] */ IEnumVARIANT **ppNewEnum); - - -void __RPC_STUB IComponentTypes_get__NewEnum_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][restricted][hidden] */ HRESULT STDMETHODCALLTYPE IComponentTypes_EnumComponentTypes_Proxy( - IComponentTypes * This, - /* [retval][out] */ IEnumComponentTypes **ppNewEnum); - - -void __RPC_STUB IComponentTypes_EnumComponentTypes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IComponentTypes_get_Item_Proxy( - IComponentTypes * This, - /* [in] */ VARIANT Index, - /* [retval][out] */ IComponentType **ComponentType); - - -void __RPC_STUB IComponentTypes_get_Item_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IComponentTypes_put_Item_Proxy( - IComponentTypes * This, - /* [in] */ VARIANT Index, - /* [in] */ IComponentType *ComponentType); - - -void __RPC_STUB IComponentTypes_put_Item_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IComponentTypes_Add_Proxy( - IComponentTypes * This, - /* [in] */ IComponentType *ComponentType, - /* [retval][out] */ VARIANT *NewIndex); - - -void __RPC_STUB IComponentTypes_Add_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IComponentTypes_Remove_Proxy( - IComponentTypes * This, - /* [in] */ VARIANT Index); - - -void __RPC_STUB IComponentTypes_Remove_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IComponentTypes_Clone_Proxy( - IComponentTypes * This, - /* [retval][out] */ IComponentTypes **NewList); - - -void __RPC_STUB IComponentTypes_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IComponentTypes_INTERFACE_DEFINED__ */ - - -#ifndef __IComponent_INTERFACE_DEFINED__ -#define __IComponent_INTERFACE_DEFINED__ - -/* interface IComponent */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - -EXTERN_C const IID IID_IComponent; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("1A5576FC-0E19-11d3-9D8E-00C04F72D980") - IComponent : public IDispatch - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Type( - /* [retval][out] */ IComponentType **CT) = 0; - - virtual /* [helpstring][id][propput][restricted][hidden] */ HRESULT STDMETHODCALLTYPE put_Type( - /* [in] */ IComponentType *CT) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_DescLangID( - /* [retval][out] */ long *LangID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_DescLangID( - /* [in] */ long LangID) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Status( - /* [retval][out] */ ComponentStatus *Status) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Status( - /* [in] */ ComponentStatus Status) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Description( - /* [retval][out] */ BSTR *Description) = 0; - - virtual /* [helpstring][id][propput][restricted][hidden] */ HRESULT STDMETHODCALLTYPE put_Description( - /* [in] */ BSTR Description) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clone( - /* [retval][out] */ IComponent **NewComponent) = 0; - - }; - -#else /* C style interface */ - - typedef struct IComponentVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IComponent * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IComponent * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IComponent * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IComponent * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IComponent * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IComponent * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IComponent * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( - IComponent * This, - /* [retval][out] */ IComponentType **CT); - - /* [helpstring][id][propput][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *put_Type )( - IComponent * This, - /* [in] */ IComponentType *CT); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DescLangID )( - IComponent * This, - /* [retval][out] */ long *LangID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DescLangID )( - IComponent * This, - /* [in] */ long LangID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( - IComponent * This, - /* [retval][out] */ ComponentStatus *Status); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Status )( - IComponent * This, - /* [in] */ ComponentStatus Status); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Description )( - IComponent * This, - /* [retval][out] */ BSTR *Description); - - /* [helpstring][id][propput][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *put_Description )( - IComponent * This, - /* [in] */ BSTR Description); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IComponent * This, - /* [retval][out] */ IComponent **NewComponent); - - END_INTERFACE - } IComponentVtbl; - - interface IComponent - { - CONST_VTBL struct IComponentVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IComponent_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IComponent_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IComponent_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IComponent_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IComponent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IComponent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IComponent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IComponent_get_Type(This,CT) \ - (This)->lpVtbl -> get_Type(This,CT) - -#define IComponent_put_Type(This,CT) \ - (This)->lpVtbl -> put_Type(This,CT) - -#define IComponent_get_DescLangID(This,LangID) \ - (This)->lpVtbl -> get_DescLangID(This,LangID) - -#define IComponent_put_DescLangID(This,LangID) \ - (This)->lpVtbl -> put_DescLangID(This,LangID) - -#define IComponent_get_Status(This,Status) \ - (This)->lpVtbl -> get_Status(This,Status) - -#define IComponent_put_Status(This,Status) \ - (This)->lpVtbl -> put_Status(This,Status) - -#define IComponent_get_Description(This,Description) \ - (This)->lpVtbl -> get_Description(This,Description) - -#define IComponent_put_Description(This,Description) \ - (This)->lpVtbl -> put_Description(This,Description) - -#define IComponent_Clone(This,NewComponent) \ - (This)->lpVtbl -> Clone(This,NewComponent) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponent_get_Type_Proxy( - IComponent * This, - /* [retval][out] */ IComponentType **CT); - - -void __RPC_STUB IComponent_get_Type_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput][restricted][hidden] */ HRESULT STDMETHODCALLTYPE IComponent_put_Type_Proxy( - IComponent * This, - /* [in] */ IComponentType *CT); - - -void __RPC_STUB IComponent_put_Type_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponent_get_DescLangID_Proxy( - IComponent * This, - /* [retval][out] */ long *LangID); - - -void __RPC_STUB IComponent_get_DescLangID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponent_put_DescLangID_Proxy( - IComponent * This, - /* [in] */ long LangID); - - -void __RPC_STUB IComponent_put_DescLangID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponent_get_Status_Proxy( - IComponent * This, - /* [retval][out] */ ComponentStatus *Status); - - -void __RPC_STUB IComponent_get_Status_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponent_put_Status_Proxy( - IComponent * This, - /* [in] */ ComponentStatus Status); - - -void __RPC_STUB IComponent_put_Status_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponent_get_Description_Proxy( - IComponent * This, - /* [retval][out] */ BSTR *Description); - - -void __RPC_STUB IComponent_get_Description_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput][restricted][hidden] */ HRESULT STDMETHODCALLTYPE IComponent_put_Description_Proxy( - IComponent * This, - /* [in] */ BSTR Description); - - -void __RPC_STUB IComponent_put_Description_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IComponent_Clone_Proxy( - IComponent * This, - /* [retval][out] */ IComponent **NewComponent); - - -void __RPC_STUB IComponent_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IComponent_INTERFACE_DEFINED__ */ - - -#ifndef __IMPEG2Component_INTERFACE_DEFINED__ -#define __IMPEG2Component_INTERFACE_DEFINED__ - -/* interface IMPEG2Component */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - -EXTERN_C const IID IID_IMPEG2Component; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("1493E353-1EB6-473c-802D-8E6B8EC9D2A9") - IMPEG2Component : public IComponent - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_PID( - /* [retval][out] */ long *PID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_PID( - /* [in] */ long PID) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_PCRPID( - /* [retval][out] */ long *PCRPID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_PCRPID( - /* [in] */ long PCRPID) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ProgramNumber( - /* [retval][out] */ long *ProgramNumber) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ProgramNumber( - /* [in] */ long ProgramNumber) = 0; - - }; - -#else /* C style interface */ - - typedef struct IMPEG2ComponentVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMPEG2Component * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMPEG2Component * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMPEG2Component * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IMPEG2Component * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IMPEG2Component * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IMPEG2Component * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IMPEG2Component * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( - IMPEG2Component * This, - /* [retval][out] */ IComponentType **CT); - - /* [helpstring][id][propput][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *put_Type )( - IMPEG2Component * This, - /* [in] */ IComponentType *CT); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DescLangID )( - IMPEG2Component * This, - /* [retval][out] */ long *LangID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DescLangID )( - IMPEG2Component * This, - /* [in] */ long LangID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( - IMPEG2Component * This, - /* [retval][out] */ ComponentStatus *Status); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Status )( - IMPEG2Component * This, - /* [in] */ ComponentStatus Status); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Description )( - IMPEG2Component * This, - /* [retval][out] */ BSTR *Description); - - /* [helpstring][id][propput][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *put_Description )( - IMPEG2Component * This, - /* [in] */ BSTR Description); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IMPEG2Component * This, - /* [retval][out] */ IComponent **NewComponent); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PID )( - IMPEG2Component * This, - /* [retval][out] */ long *PID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_PID )( - IMPEG2Component * This, - /* [in] */ long PID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PCRPID )( - IMPEG2Component * This, - /* [retval][out] */ long *PCRPID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_PCRPID )( - IMPEG2Component * This, - /* [in] */ long PCRPID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProgramNumber )( - IMPEG2Component * This, - /* [retval][out] */ long *ProgramNumber); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ProgramNumber )( - IMPEG2Component * This, - /* [in] */ long ProgramNumber); - - END_INTERFACE - } IMPEG2ComponentVtbl; - - interface IMPEG2Component - { - CONST_VTBL struct IMPEG2ComponentVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IMPEG2Component_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IMPEG2Component_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IMPEG2Component_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IMPEG2Component_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IMPEG2Component_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IMPEG2Component_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IMPEG2Component_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IMPEG2Component_get_Type(This,CT) \ - (This)->lpVtbl -> get_Type(This,CT) - -#define IMPEG2Component_put_Type(This,CT) \ - (This)->lpVtbl -> put_Type(This,CT) - -#define IMPEG2Component_get_DescLangID(This,LangID) \ - (This)->lpVtbl -> get_DescLangID(This,LangID) - -#define IMPEG2Component_put_DescLangID(This,LangID) \ - (This)->lpVtbl -> put_DescLangID(This,LangID) - -#define IMPEG2Component_get_Status(This,Status) \ - (This)->lpVtbl -> get_Status(This,Status) - -#define IMPEG2Component_put_Status(This,Status) \ - (This)->lpVtbl -> put_Status(This,Status) - -#define IMPEG2Component_get_Description(This,Description) \ - (This)->lpVtbl -> get_Description(This,Description) - -#define IMPEG2Component_put_Description(This,Description) \ - (This)->lpVtbl -> put_Description(This,Description) - -#define IMPEG2Component_Clone(This,NewComponent) \ - (This)->lpVtbl -> Clone(This,NewComponent) - - -#define IMPEG2Component_get_PID(This,PID) \ - (This)->lpVtbl -> get_PID(This,PID) - -#define IMPEG2Component_put_PID(This,PID) \ - (This)->lpVtbl -> put_PID(This,PID) - -#define IMPEG2Component_get_PCRPID(This,PCRPID) \ - (This)->lpVtbl -> get_PCRPID(This,PCRPID) - -#define IMPEG2Component_put_PCRPID(This,PCRPID) \ - (This)->lpVtbl -> put_PCRPID(This,PCRPID) - -#define IMPEG2Component_get_ProgramNumber(This,ProgramNumber) \ - (This)->lpVtbl -> get_ProgramNumber(This,ProgramNumber) - -#define IMPEG2Component_put_ProgramNumber(This,ProgramNumber) \ - (This)->lpVtbl -> put_ProgramNumber(This,ProgramNumber) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMPEG2Component_get_PID_Proxy( - IMPEG2Component * This, - /* [retval][out] */ long *PID); - - -void __RPC_STUB IMPEG2Component_get_PID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IMPEG2Component_put_PID_Proxy( - IMPEG2Component * This, - /* [in] */ long PID); - - -void __RPC_STUB IMPEG2Component_put_PID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMPEG2Component_get_PCRPID_Proxy( - IMPEG2Component * This, - /* [retval][out] */ long *PCRPID); - - -void __RPC_STUB IMPEG2Component_get_PCRPID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IMPEG2Component_put_PCRPID_Proxy( - IMPEG2Component * This, - /* [in] */ long PCRPID); - - -void __RPC_STUB IMPEG2Component_put_PCRPID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMPEG2Component_get_ProgramNumber_Proxy( - IMPEG2Component * This, - /* [retval][out] */ long *ProgramNumber); - - -void __RPC_STUB IMPEG2Component_get_ProgramNumber_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IMPEG2Component_put_ProgramNumber_Proxy( - IMPEG2Component * This, - /* [in] */ long ProgramNumber); - - -void __RPC_STUB IMPEG2Component_put_ProgramNumber_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IMPEG2Component_INTERFACE_DEFINED__ */ - - -#ifndef __IEnumComponents_INTERFACE_DEFINED__ -#define __IEnumComponents_INTERFACE_DEFINED__ - -/* interface IEnumComponents */ -/* [unique][uuid][object][restricted][hidden] */ - - -EXTERN_C const IID IID_IEnumComponents; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("2A6E2939-2595-11d3-B64C-00C04F79498E") - IEnumComponents : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Next( - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ IComponent **rgelt, - /* [out] */ ULONG *pceltFetched) = 0; - - virtual HRESULT STDMETHODCALLTYPE Skip( - /* [in] */ ULONG celt) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - /* [out] */ IEnumComponents **ppEnum) = 0; - - }; - -#else /* C style interface */ - - typedef struct IEnumComponentsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IEnumComponents * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IEnumComponents * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IEnumComponents * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - IEnumComponents * This, - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ IComponent **rgelt, - /* [out] */ ULONG *pceltFetched); - - HRESULT ( STDMETHODCALLTYPE *Skip )( - IEnumComponents * This, - /* [in] */ ULONG celt); - - HRESULT ( STDMETHODCALLTYPE *Reset )( - IEnumComponents * This); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IEnumComponents * This, - /* [out] */ IEnumComponents **ppEnum); - - END_INTERFACE - } IEnumComponentsVtbl; - - interface IEnumComponents - { - CONST_VTBL struct IEnumComponentsVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IEnumComponents_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IEnumComponents_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IEnumComponents_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IEnumComponents_Next(This,celt,rgelt,pceltFetched) \ - (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) - -#define IEnumComponents_Skip(This,celt) \ - (This)->lpVtbl -> Skip(This,celt) - -#define IEnumComponents_Reset(This) \ - (This)->lpVtbl -> Reset(This) - -#define IEnumComponents_Clone(This,ppEnum) \ - (This)->lpVtbl -> Clone(This,ppEnum) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IEnumComponents_Next_Proxy( - IEnumComponents * This, - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ IComponent **rgelt, - /* [out] */ ULONG *pceltFetched); - - -void __RPC_STUB IEnumComponents_Next_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumComponents_Skip_Proxy( - IEnumComponents * This, - /* [in] */ ULONG celt); - - -void __RPC_STUB IEnumComponents_Skip_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumComponents_Reset_Proxy( - IEnumComponents * This); - - -void __RPC_STUB IEnumComponents_Reset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IEnumComponents_Clone_Proxy( - IEnumComponents * This, - /* [out] */ IEnumComponents **ppEnum); - - -void __RPC_STUB IEnumComponents_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IEnumComponents_INTERFACE_DEFINED__ */ - - -#ifndef __IComponents_INTERFACE_DEFINED__ -#define __IComponents_INTERFACE_DEFINED__ - -/* interface IComponents */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - -EXTERN_C const IID IID_IComponents; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("FCD01846-0E19-11d3-9D8E-00C04F72D980") - IComponents : public IDispatch - { - public: - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( - /* [retval][out] */ long *Count) = 0; - - virtual /* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( - /* [retval][out] */ IEnumVARIANT **ppNewEnum) = 0; - - virtual /* [helpstring][restricted][hidden] */ HRESULT STDMETHODCALLTYPE EnumComponents( - /* [retval][out] */ IEnumComponents **ppNewEnum) = 0; - - virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Item( - /* [in] */ VARIANT Index, - /* [retval][out] */ IComponent **ppComponent) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( - /* [in] */ IComponent *Component, - /* [retval][out] */ VARIANT *NewIndex) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( - /* [in] */ VARIANT Index) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Clone( - /* [retval][out] */ IComponents **NewList) = 0; - - }; - -#else /* C style interface */ - - typedef struct IComponentsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IComponents * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IComponents * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IComponents * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IComponents * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IComponents * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IComponents * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IComponents * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( - IComponents * This, - /* [retval][out] */ long *Count); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( - IComponents * This, - /* [retval][out] */ IEnumVARIANT **ppNewEnum); - - /* [helpstring][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *EnumComponents )( - IComponents * This, - /* [retval][out] */ IEnumComponents **ppNewEnum); - - /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Item )( - IComponents * This, - /* [in] */ VARIANT Index, - /* [retval][out] */ IComponent **ppComponent); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( - IComponents * This, - /* [in] */ IComponent *Component, - /* [retval][out] */ VARIANT *NewIndex); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( - IComponents * This, - /* [in] */ VARIANT Index); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IComponents * This, - /* [retval][out] */ IComponents **NewList); - - END_INTERFACE - } IComponentsVtbl; - - interface IComponents - { - CONST_VTBL struct IComponentsVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IComponents_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IComponents_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IComponents_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IComponents_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IComponents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IComponents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IComponents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IComponents_get_Count(This,Count) \ - (This)->lpVtbl -> get_Count(This,Count) - -#define IComponents_get__NewEnum(This,ppNewEnum) \ - (This)->lpVtbl -> get__NewEnum(This,ppNewEnum) - -#define IComponents_EnumComponents(This,ppNewEnum) \ - (This)->lpVtbl -> EnumComponents(This,ppNewEnum) - -#define IComponents_get_Item(This,Index,ppComponent) \ - (This)->lpVtbl -> get_Item(This,Index,ppComponent) - -#define IComponents_Add(This,Component,NewIndex) \ - (This)->lpVtbl -> Add(This,Component,NewIndex) - -#define IComponents_Remove(This,Index) \ - (This)->lpVtbl -> Remove(This,Index) - -#define IComponents_Clone(This,NewList) \ - (This)->lpVtbl -> Clone(This,NewList) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IComponents_get_Count_Proxy( - IComponents * This, - /* [retval][out] */ long *Count); - - -void __RPC_STUB IComponents_get_Count_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE IComponents_get__NewEnum_Proxy( - IComponents * This, - /* [retval][out] */ IEnumVARIANT **ppNewEnum); - - -void __RPC_STUB IComponents_get__NewEnum_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][restricted][hidden] */ HRESULT STDMETHODCALLTYPE IComponents_EnumComponents_Proxy( - IComponents * This, - /* [retval][out] */ IEnumComponents **ppNewEnum); - - -void __RPC_STUB IComponents_EnumComponents_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IComponents_get_Item_Proxy( - IComponents * This, - /* [in] */ VARIANT Index, - /* [retval][out] */ IComponent **ppComponent); - - -void __RPC_STUB IComponents_get_Item_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IComponents_Add_Proxy( - IComponents * This, - /* [in] */ IComponent *Component, - /* [retval][out] */ VARIANT *NewIndex); - - -void __RPC_STUB IComponents_Add_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IComponents_Remove_Proxy( - IComponents * This, - /* [in] */ VARIANT Index); - - -void __RPC_STUB IComponents_Remove_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IComponents_Clone_Proxy( - IComponents * This, - /* [retval][out] */ IComponents **NewList); - - -void __RPC_STUB IComponents_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IComponents_INTERFACE_DEFINED__ */ - - -#ifndef __ILocator_INTERFACE_DEFINED__ -#define __ILocator_INTERFACE_DEFINED__ - -/* interface ILocator */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - -EXTERN_C const IID IID_ILocator; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("286D7F89-760C-4F89-80C4-66841D2507AA") - ILocator : public IDispatch - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CarrierFrequency( - /* [retval][out] */ long *Frequency) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_CarrierFrequency( - /* [in] */ long Frequency) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_InnerFEC( - /* [retval][out] */ FECMethod *FEC) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_InnerFEC( - /* [in] */ FECMethod FEC) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_InnerFECRate( - /* [retval][out] */ BinaryConvolutionCodeRate *FEC) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_InnerFECRate( - /* [in] */ BinaryConvolutionCodeRate FEC) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OuterFEC( - /* [retval][out] */ FECMethod *FEC) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_OuterFEC( - /* [in] */ FECMethod FEC) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OuterFECRate( - /* [retval][out] */ BinaryConvolutionCodeRate *FEC) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_OuterFECRate( - /* [in] */ BinaryConvolutionCodeRate FEC) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Modulation( - /* [retval][out] */ ModulationType *Modulation) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Modulation( - /* [in] */ ModulationType Modulation) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SymbolRate( - /* [retval][out] */ long *Rate) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SymbolRate( - /* [in] */ long Rate) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clone( - /* [retval][out] */ ILocator **NewLocator) = 0; - - }; - -#else /* C style interface */ - - typedef struct ILocatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILocator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ILocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ILocator * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - ILocator * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - ILocator * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - ILocator * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - ILocator * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CarrierFrequency )( - ILocator * This, - /* [retval][out] */ long *Frequency); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CarrierFrequency )( - ILocator * This, - /* [in] */ long Frequency); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFEC )( - ILocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFEC )( - ILocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFECRate )( - ILocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFECRate )( - ILocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFEC )( - ILocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFEC )( - ILocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFECRate )( - ILocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFECRate )( - ILocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Modulation )( - ILocator * This, - /* [retval][out] */ ModulationType *Modulation); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Modulation )( - ILocator * This, - /* [in] */ ModulationType Modulation); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SymbolRate )( - ILocator * This, - /* [retval][out] */ long *Rate); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SymbolRate )( - ILocator * This, - /* [in] */ long Rate); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - ILocator * This, - /* [retval][out] */ ILocator **NewLocator); - - END_INTERFACE - } ILocatorVtbl; - - interface ILocator - { - CONST_VTBL struct ILocatorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ILocator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define ILocator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define ILocator_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define ILocator_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define ILocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define ILocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define ILocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define ILocator_get_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> get_CarrierFrequency(This,Frequency) - -#define ILocator_put_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> put_CarrierFrequency(This,Frequency) - -#define ILocator_get_InnerFEC(This,FEC) \ - (This)->lpVtbl -> get_InnerFEC(This,FEC) - -#define ILocator_put_InnerFEC(This,FEC) \ - (This)->lpVtbl -> put_InnerFEC(This,FEC) - -#define ILocator_get_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> get_InnerFECRate(This,FEC) - -#define ILocator_put_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> put_InnerFECRate(This,FEC) - -#define ILocator_get_OuterFEC(This,FEC) \ - (This)->lpVtbl -> get_OuterFEC(This,FEC) - -#define ILocator_put_OuterFEC(This,FEC) \ - (This)->lpVtbl -> put_OuterFEC(This,FEC) - -#define ILocator_get_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> get_OuterFECRate(This,FEC) - -#define ILocator_put_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> put_OuterFECRate(This,FEC) - -#define ILocator_get_Modulation(This,Modulation) \ - (This)->lpVtbl -> get_Modulation(This,Modulation) - -#define ILocator_put_Modulation(This,Modulation) \ - (This)->lpVtbl -> put_Modulation(This,Modulation) - -#define ILocator_get_SymbolRate(This,Rate) \ - (This)->lpVtbl -> get_SymbolRate(This,Rate) - -#define ILocator_put_SymbolRate(This,Rate) \ - (This)->lpVtbl -> put_SymbolRate(This,Rate) - -#define ILocator_Clone(This,NewLocator) \ - (This)->lpVtbl -> Clone(This,NewLocator) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ILocator_get_CarrierFrequency_Proxy( - ILocator * This, - /* [retval][out] */ long *Frequency); - - -void __RPC_STUB ILocator_get_CarrierFrequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ILocator_put_CarrierFrequency_Proxy( - ILocator * This, - /* [in] */ long Frequency); - - -void __RPC_STUB ILocator_put_CarrierFrequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ILocator_get_InnerFEC_Proxy( - ILocator * This, - /* [retval][out] */ FECMethod *FEC); - - -void __RPC_STUB ILocator_get_InnerFEC_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ILocator_put_InnerFEC_Proxy( - ILocator * This, - /* [in] */ FECMethod FEC); - - -void __RPC_STUB ILocator_put_InnerFEC_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ILocator_get_InnerFECRate_Proxy( - ILocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - -void __RPC_STUB ILocator_get_InnerFECRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ILocator_put_InnerFECRate_Proxy( - ILocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - -void __RPC_STUB ILocator_put_InnerFECRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ILocator_get_OuterFEC_Proxy( - ILocator * This, - /* [retval][out] */ FECMethod *FEC); - - -void __RPC_STUB ILocator_get_OuterFEC_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ILocator_put_OuterFEC_Proxy( - ILocator * This, - /* [in] */ FECMethod FEC); - - -void __RPC_STUB ILocator_put_OuterFEC_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ILocator_get_OuterFECRate_Proxy( - ILocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - -void __RPC_STUB ILocator_get_OuterFECRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ILocator_put_OuterFECRate_Proxy( - ILocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - -void __RPC_STUB ILocator_put_OuterFECRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ILocator_get_Modulation_Proxy( - ILocator * This, - /* [retval][out] */ ModulationType *Modulation); - - -void __RPC_STUB ILocator_get_Modulation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ILocator_put_Modulation_Proxy( - ILocator * This, - /* [in] */ ModulationType Modulation); - - -void __RPC_STUB ILocator_put_Modulation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ILocator_get_SymbolRate_Proxy( - ILocator * This, - /* [retval][out] */ long *Rate); - - -void __RPC_STUB ILocator_get_SymbolRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ILocator_put_SymbolRate_Proxy( - ILocator * This, - /* [in] */ long Rate); - - -void __RPC_STUB ILocator_put_SymbolRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ILocator_Clone_Proxy( - ILocator * This, - /* [retval][out] */ ILocator **NewLocator); - - -void __RPC_STUB ILocator_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __ILocator_INTERFACE_DEFINED__ */ - - -#ifndef __IATSCLocator_INTERFACE_DEFINED__ -#define __IATSCLocator_INTERFACE_DEFINED__ - -/* interface IATSCLocator */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_IATSCLocator; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("BF8D986F-8C2B-4131-94D7-4D3D9FCC21EF") - IATSCLocator : public ILocator - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_PhysicalChannel( - /* [retval][out] */ long *PhysicalChannel) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_PhysicalChannel( - /* [in] */ long PhysicalChannel) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_TSID( - /* [retval][out] */ long *TSID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_TSID( - /* [in] */ long TSID) = 0; - - }; - -#else /* C style interface */ - - typedef struct IATSCLocatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IATSCLocator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IATSCLocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IATSCLocator * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IATSCLocator * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IATSCLocator * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IATSCLocator * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IATSCLocator * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CarrierFrequency )( - IATSCLocator * This, - /* [retval][out] */ long *Frequency); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CarrierFrequency )( - IATSCLocator * This, - /* [in] */ long Frequency); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFEC )( - IATSCLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFEC )( - IATSCLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFECRate )( - IATSCLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFECRate )( - IATSCLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFEC )( - IATSCLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFEC )( - IATSCLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFECRate )( - IATSCLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFECRate )( - IATSCLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Modulation )( - IATSCLocator * This, - /* [retval][out] */ ModulationType *Modulation); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Modulation )( - IATSCLocator * This, - /* [in] */ ModulationType Modulation); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SymbolRate )( - IATSCLocator * This, - /* [retval][out] */ long *Rate); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SymbolRate )( - IATSCLocator * This, - /* [in] */ long Rate); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IATSCLocator * This, - /* [retval][out] */ ILocator **NewLocator); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PhysicalChannel )( - IATSCLocator * This, - /* [retval][out] */ long *PhysicalChannel); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_PhysicalChannel )( - IATSCLocator * This, - /* [in] */ long PhysicalChannel); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TSID )( - IATSCLocator * This, - /* [retval][out] */ long *TSID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_TSID )( - IATSCLocator * This, - /* [in] */ long TSID); - - END_INTERFACE - } IATSCLocatorVtbl; - - interface IATSCLocator - { - CONST_VTBL struct IATSCLocatorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IATSCLocator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IATSCLocator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IATSCLocator_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IATSCLocator_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IATSCLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IATSCLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IATSCLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IATSCLocator_get_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> get_CarrierFrequency(This,Frequency) - -#define IATSCLocator_put_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> put_CarrierFrequency(This,Frequency) - -#define IATSCLocator_get_InnerFEC(This,FEC) \ - (This)->lpVtbl -> get_InnerFEC(This,FEC) - -#define IATSCLocator_put_InnerFEC(This,FEC) \ - (This)->lpVtbl -> put_InnerFEC(This,FEC) - -#define IATSCLocator_get_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> get_InnerFECRate(This,FEC) - -#define IATSCLocator_put_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> put_InnerFECRate(This,FEC) - -#define IATSCLocator_get_OuterFEC(This,FEC) \ - (This)->lpVtbl -> get_OuterFEC(This,FEC) - -#define IATSCLocator_put_OuterFEC(This,FEC) \ - (This)->lpVtbl -> put_OuterFEC(This,FEC) - -#define IATSCLocator_get_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> get_OuterFECRate(This,FEC) - -#define IATSCLocator_put_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> put_OuterFECRate(This,FEC) - -#define IATSCLocator_get_Modulation(This,Modulation) \ - (This)->lpVtbl -> get_Modulation(This,Modulation) - -#define IATSCLocator_put_Modulation(This,Modulation) \ - (This)->lpVtbl -> put_Modulation(This,Modulation) - -#define IATSCLocator_get_SymbolRate(This,Rate) \ - (This)->lpVtbl -> get_SymbolRate(This,Rate) - -#define IATSCLocator_put_SymbolRate(This,Rate) \ - (This)->lpVtbl -> put_SymbolRate(This,Rate) - -#define IATSCLocator_Clone(This,NewLocator) \ - (This)->lpVtbl -> Clone(This,NewLocator) - - -#define IATSCLocator_get_PhysicalChannel(This,PhysicalChannel) \ - (This)->lpVtbl -> get_PhysicalChannel(This,PhysicalChannel) - -#define IATSCLocator_put_PhysicalChannel(This,PhysicalChannel) \ - (This)->lpVtbl -> put_PhysicalChannel(This,PhysicalChannel) - -#define IATSCLocator_get_TSID(This,TSID) \ - (This)->lpVtbl -> get_TSID(This,TSID) - -#define IATSCLocator_put_TSID(This,TSID) \ - (This)->lpVtbl -> put_TSID(This,TSID) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IATSCLocator_get_PhysicalChannel_Proxy( - IATSCLocator * This, - /* [retval][out] */ long *PhysicalChannel); - - -void __RPC_STUB IATSCLocator_get_PhysicalChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IATSCLocator_put_PhysicalChannel_Proxy( - IATSCLocator * This, - /* [in] */ long PhysicalChannel); - - -void __RPC_STUB IATSCLocator_put_PhysicalChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IATSCLocator_get_TSID_Proxy( - IATSCLocator * This, - /* [retval][out] */ long *TSID); - - -void __RPC_STUB IATSCLocator_get_TSID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IATSCLocator_put_TSID_Proxy( - IATSCLocator * This, - /* [in] */ long TSID); - - -void __RPC_STUB IATSCLocator_put_TSID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IATSCLocator_INTERFACE_DEFINED__ */ - - -#ifndef __IDVBTLocator_INTERFACE_DEFINED__ -#define __IDVBTLocator_INTERFACE_DEFINED__ - -/* interface IDVBTLocator */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_IDVBTLocator; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("8664DA16-DDA2-42ac-926A-C18F9127C302") - IDVBTLocator : public ILocator - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Bandwidth( - /* [retval][out] */ long *BandWidthVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Bandwidth( - /* [in] */ long BandwidthVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_LPInnerFEC( - /* [retval][out] */ FECMethod *FEC) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_LPInnerFEC( - /* [in] */ FECMethod FEC) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_LPInnerFECRate( - /* [retval][out] */ BinaryConvolutionCodeRate *FEC) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_LPInnerFECRate( - /* [in] */ BinaryConvolutionCodeRate FEC) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_HAlpha( - /* [retval][out] */ HierarchyAlpha *Alpha) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_HAlpha( - /* [in] */ HierarchyAlpha Alpha) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Guard( - /* [retval][out] */ GuardInterval *GI) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Guard( - /* [in] */ GuardInterval GI) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Mode( - /* [retval][out] */ TransmissionMode *mode) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Mode( - /* [in] */ TransmissionMode mode) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OtherFrequencyInUse( - /* [retval][out] */ VARIANT_BOOL *OtherFrequencyInUseVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_OtherFrequencyInUse( - /* [in] */ VARIANT_BOOL OtherFrequencyInUseVal) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDVBTLocatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDVBTLocator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDVBTLocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDVBTLocator * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDVBTLocator * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDVBTLocator * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDVBTLocator * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDVBTLocator * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CarrierFrequency )( - IDVBTLocator * This, - /* [retval][out] */ long *Frequency); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CarrierFrequency )( - IDVBTLocator * This, - /* [in] */ long Frequency); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFEC )( - IDVBTLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFEC )( - IDVBTLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFECRate )( - IDVBTLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFECRate )( - IDVBTLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFEC )( - IDVBTLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFEC )( - IDVBTLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFECRate )( - IDVBTLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFECRate )( - IDVBTLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Modulation )( - IDVBTLocator * This, - /* [retval][out] */ ModulationType *Modulation); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Modulation )( - IDVBTLocator * This, - /* [in] */ ModulationType Modulation); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SymbolRate )( - IDVBTLocator * This, - /* [retval][out] */ long *Rate); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SymbolRate )( - IDVBTLocator * This, - /* [in] */ long Rate); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IDVBTLocator * This, - /* [retval][out] */ ILocator **NewLocator); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Bandwidth )( - IDVBTLocator * This, - /* [retval][out] */ long *BandWidthVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Bandwidth )( - IDVBTLocator * This, - /* [in] */ long BandwidthVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LPInnerFEC )( - IDVBTLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LPInnerFEC )( - IDVBTLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LPInnerFECRate )( - IDVBTLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LPInnerFECRate )( - IDVBTLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HAlpha )( - IDVBTLocator * This, - /* [retval][out] */ HierarchyAlpha *Alpha); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HAlpha )( - IDVBTLocator * This, - /* [in] */ HierarchyAlpha Alpha); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Guard )( - IDVBTLocator * This, - /* [retval][out] */ GuardInterval *GI); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Guard )( - IDVBTLocator * This, - /* [in] */ GuardInterval GI); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Mode )( - IDVBTLocator * This, - /* [retval][out] */ TransmissionMode *mode); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Mode )( - IDVBTLocator * This, - /* [in] */ TransmissionMode mode); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OtherFrequencyInUse )( - IDVBTLocator * This, - /* [retval][out] */ VARIANT_BOOL *OtherFrequencyInUseVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OtherFrequencyInUse )( - IDVBTLocator * This, - /* [in] */ VARIANT_BOOL OtherFrequencyInUseVal); - - END_INTERFACE - } IDVBTLocatorVtbl; - - interface IDVBTLocator - { - CONST_VTBL struct IDVBTLocatorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDVBTLocator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDVBTLocator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDVBTLocator_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDVBTLocator_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IDVBTLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IDVBTLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IDVBTLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IDVBTLocator_get_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> get_CarrierFrequency(This,Frequency) - -#define IDVBTLocator_put_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> put_CarrierFrequency(This,Frequency) - -#define IDVBTLocator_get_InnerFEC(This,FEC) \ - (This)->lpVtbl -> get_InnerFEC(This,FEC) - -#define IDVBTLocator_put_InnerFEC(This,FEC) \ - (This)->lpVtbl -> put_InnerFEC(This,FEC) - -#define IDVBTLocator_get_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> get_InnerFECRate(This,FEC) - -#define IDVBTLocator_put_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> put_InnerFECRate(This,FEC) - -#define IDVBTLocator_get_OuterFEC(This,FEC) \ - (This)->lpVtbl -> get_OuterFEC(This,FEC) - -#define IDVBTLocator_put_OuterFEC(This,FEC) \ - (This)->lpVtbl -> put_OuterFEC(This,FEC) - -#define IDVBTLocator_get_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> get_OuterFECRate(This,FEC) - -#define IDVBTLocator_put_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> put_OuterFECRate(This,FEC) - -#define IDVBTLocator_get_Modulation(This,Modulation) \ - (This)->lpVtbl -> get_Modulation(This,Modulation) - -#define IDVBTLocator_put_Modulation(This,Modulation) \ - (This)->lpVtbl -> put_Modulation(This,Modulation) - -#define IDVBTLocator_get_SymbolRate(This,Rate) \ - (This)->lpVtbl -> get_SymbolRate(This,Rate) - -#define IDVBTLocator_put_SymbolRate(This,Rate) \ - (This)->lpVtbl -> put_SymbolRate(This,Rate) - -#define IDVBTLocator_Clone(This,NewLocator) \ - (This)->lpVtbl -> Clone(This,NewLocator) - - -#define IDVBTLocator_get_Bandwidth(This,BandWidthVal) \ - (This)->lpVtbl -> get_Bandwidth(This,BandWidthVal) - -#define IDVBTLocator_put_Bandwidth(This,BandwidthVal) \ - (This)->lpVtbl -> put_Bandwidth(This,BandwidthVal) - -#define IDVBTLocator_get_LPInnerFEC(This,FEC) \ - (This)->lpVtbl -> get_LPInnerFEC(This,FEC) - -#define IDVBTLocator_put_LPInnerFEC(This,FEC) \ - (This)->lpVtbl -> put_LPInnerFEC(This,FEC) - -#define IDVBTLocator_get_LPInnerFECRate(This,FEC) \ - (This)->lpVtbl -> get_LPInnerFECRate(This,FEC) - -#define IDVBTLocator_put_LPInnerFECRate(This,FEC) \ - (This)->lpVtbl -> put_LPInnerFECRate(This,FEC) - -#define IDVBTLocator_get_HAlpha(This,Alpha) \ - (This)->lpVtbl -> get_HAlpha(This,Alpha) - -#define IDVBTLocator_put_HAlpha(This,Alpha) \ - (This)->lpVtbl -> put_HAlpha(This,Alpha) - -#define IDVBTLocator_get_Guard(This,GI) \ - (This)->lpVtbl -> get_Guard(This,GI) - -#define IDVBTLocator_put_Guard(This,GI) \ - (This)->lpVtbl -> put_Guard(This,GI) - -#define IDVBTLocator_get_Mode(This,mode) \ - (This)->lpVtbl -> get_Mode(This,mode) - -#define IDVBTLocator_put_Mode(This,mode) \ - (This)->lpVtbl -> put_Mode(This,mode) - -#define IDVBTLocator_get_OtherFrequencyInUse(This,OtherFrequencyInUseVal) \ - (This)->lpVtbl -> get_OtherFrequencyInUse(This,OtherFrequencyInUseVal) - -#define IDVBTLocator_put_OtherFrequencyInUse(This,OtherFrequencyInUseVal) \ - (This)->lpVtbl -> put_OtherFrequencyInUse(This,OtherFrequencyInUseVal) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_get_Bandwidth_Proxy( - IDVBTLocator * This, - /* [retval][out] */ long *BandWidthVal); - - -void __RPC_STUB IDVBTLocator_get_Bandwidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_put_Bandwidth_Proxy( - IDVBTLocator * This, - /* [in] */ long BandwidthVal); - - -void __RPC_STUB IDVBTLocator_put_Bandwidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_get_LPInnerFEC_Proxy( - IDVBTLocator * This, - /* [retval][out] */ FECMethod *FEC); - - -void __RPC_STUB IDVBTLocator_get_LPInnerFEC_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_put_LPInnerFEC_Proxy( - IDVBTLocator * This, - /* [in] */ FECMethod FEC); - - -void __RPC_STUB IDVBTLocator_put_LPInnerFEC_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_get_LPInnerFECRate_Proxy( - IDVBTLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - -void __RPC_STUB IDVBTLocator_get_LPInnerFECRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_put_LPInnerFECRate_Proxy( - IDVBTLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - -void __RPC_STUB IDVBTLocator_put_LPInnerFECRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_get_HAlpha_Proxy( - IDVBTLocator * This, - /* [retval][out] */ HierarchyAlpha *Alpha); - - -void __RPC_STUB IDVBTLocator_get_HAlpha_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_put_HAlpha_Proxy( - IDVBTLocator * This, - /* [in] */ HierarchyAlpha Alpha); - - -void __RPC_STUB IDVBTLocator_put_HAlpha_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_get_Guard_Proxy( - IDVBTLocator * This, - /* [retval][out] */ GuardInterval *GI); - - -void __RPC_STUB IDVBTLocator_get_Guard_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_put_Guard_Proxy( - IDVBTLocator * This, - /* [in] */ GuardInterval GI); - - -void __RPC_STUB IDVBTLocator_put_Guard_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_get_Mode_Proxy( - IDVBTLocator * This, - /* [retval][out] */ TransmissionMode *mode); - - -void __RPC_STUB IDVBTLocator_get_Mode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_put_Mode_Proxy( - IDVBTLocator * This, - /* [in] */ TransmissionMode mode); - - -void __RPC_STUB IDVBTLocator_put_Mode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_get_OtherFrequencyInUse_Proxy( - IDVBTLocator * This, - /* [retval][out] */ VARIANT_BOOL *OtherFrequencyInUseVal); - - -void __RPC_STUB IDVBTLocator_get_OtherFrequencyInUse_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_put_OtherFrequencyInUse_Proxy( - IDVBTLocator * This, - /* [in] */ VARIANT_BOOL OtherFrequencyInUseVal); - - -void __RPC_STUB IDVBTLocator_put_OtherFrequencyInUse_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDVBTLocator_INTERFACE_DEFINED__ */ - - -#ifndef __IDVBSLocator_INTERFACE_DEFINED__ -#define __IDVBSLocator_INTERFACE_DEFINED__ - -/* interface IDVBSLocator */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_IDVBSLocator; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("3D7C353C-0D04-45f1-A742-F97CC1188DC8") - IDVBSLocator : public ILocator - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SignalPolarisation( - /* [retval][out] */ Polarisation *PolarisationVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SignalPolarisation( - /* [in] */ Polarisation PolarisationVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_WestPosition( - /* [retval][out] */ VARIANT_BOOL *WestLongitude) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_WestPosition( - /* [in] */ VARIANT_BOOL WestLongitude) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OrbitalPosition( - /* [retval][out] */ long *longitude) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_OrbitalPosition( - /* [in] */ long longitude) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Azimuth( - /* [retval][out] */ long *Azimuth) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Azimuth( - /* [in] */ long Azimuth) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Elevation( - /* [retval][out] */ long *Elevation) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Elevation( - /* [in] */ long Elevation) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDVBSLocatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDVBSLocator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDVBSLocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDVBSLocator * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDVBSLocator * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDVBSLocator * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDVBSLocator * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDVBSLocator * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CarrierFrequency )( - IDVBSLocator * This, - /* [retval][out] */ long *Frequency); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CarrierFrequency )( - IDVBSLocator * This, - /* [in] */ long Frequency); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFEC )( - IDVBSLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFEC )( - IDVBSLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFECRate )( - IDVBSLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFECRate )( - IDVBSLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFEC )( - IDVBSLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFEC )( - IDVBSLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFECRate )( - IDVBSLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFECRate )( - IDVBSLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Modulation )( - IDVBSLocator * This, - /* [retval][out] */ ModulationType *Modulation); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Modulation )( - IDVBSLocator * This, - /* [in] */ ModulationType Modulation); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SymbolRate )( - IDVBSLocator * This, - /* [retval][out] */ long *Rate); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SymbolRate )( - IDVBSLocator * This, - /* [in] */ long Rate); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IDVBSLocator * This, - /* [retval][out] */ ILocator **NewLocator); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignalPolarisation )( - IDVBSLocator * This, - /* [retval][out] */ Polarisation *PolarisationVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignalPolarisation )( - IDVBSLocator * This, - /* [in] */ Polarisation PolarisationVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_WestPosition )( - IDVBSLocator * This, - /* [retval][out] */ VARIANT_BOOL *WestLongitude); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_WestPosition )( - IDVBSLocator * This, - /* [in] */ VARIANT_BOOL WestLongitude); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OrbitalPosition )( - IDVBSLocator * This, - /* [retval][out] */ long *longitude); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OrbitalPosition )( - IDVBSLocator * This, - /* [in] */ long longitude); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Azimuth )( - IDVBSLocator * This, - /* [retval][out] */ long *Azimuth); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Azimuth )( - IDVBSLocator * This, - /* [in] */ long Azimuth); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Elevation )( - IDVBSLocator * This, - /* [retval][out] */ long *Elevation); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Elevation )( - IDVBSLocator * This, - /* [in] */ long Elevation); - - END_INTERFACE - } IDVBSLocatorVtbl; - - interface IDVBSLocator - { - CONST_VTBL struct IDVBSLocatorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDVBSLocator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDVBSLocator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDVBSLocator_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDVBSLocator_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IDVBSLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IDVBSLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IDVBSLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IDVBSLocator_get_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> get_CarrierFrequency(This,Frequency) - -#define IDVBSLocator_put_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> put_CarrierFrequency(This,Frequency) - -#define IDVBSLocator_get_InnerFEC(This,FEC) \ - (This)->lpVtbl -> get_InnerFEC(This,FEC) - -#define IDVBSLocator_put_InnerFEC(This,FEC) \ - (This)->lpVtbl -> put_InnerFEC(This,FEC) - -#define IDVBSLocator_get_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> get_InnerFECRate(This,FEC) - -#define IDVBSLocator_put_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> put_InnerFECRate(This,FEC) - -#define IDVBSLocator_get_OuterFEC(This,FEC) \ - (This)->lpVtbl -> get_OuterFEC(This,FEC) - -#define IDVBSLocator_put_OuterFEC(This,FEC) \ - (This)->lpVtbl -> put_OuterFEC(This,FEC) - -#define IDVBSLocator_get_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> get_OuterFECRate(This,FEC) - -#define IDVBSLocator_put_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> put_OuterFECRate(This,FEC) - -#define IDVBSLocator_get_Modulation(This,Modulation) \ - (This)->lpVtbl -> get_Modulation(This,Modulation) - -#define IDVBSLocator_put_Modulation(This,Modulation) \ - (This)->lpVtbl -> put_Modulation(This,Modulation) - -#define IDVBSLocator_get_SymbolRate(This,Rate) \ - (This)->lpVtbl -> get_SymbolRate(This,Rate) - -#define IDVBSLocator_put_SymbolRate(This,Rate) \ - (This)->lpVtbl -> put_SymbolRate(This,Rate) - -#define IDVBSLocator_Clone(This,NewLocator) \ - (This)->lpVtbl -> Clone(This,NewLocator) - - -#define IDVBSLocator_get_SignalPolarisation(This,PolarisationVal) \ - (This)->lpVtbl -> get_SignalPolarisation(This,PolarisationVal) - -#define IDVBSLocator_put_SignalPolarisation(This,PolarisationVal) \ - (This)->lpVtbl -> put_SignalPolarisation(This,PolarisationVal) - -#define IDVBSLocator_get_WestPosition(This,WestLongitude) \ - (This)->lpVtbl -> get_WestPosition(This,WestLongitude) - -#define IDVBSLocator_put_WestPosition(This,WestLongitude) \ - (This)->lpVtbl -> put_WestPosition(This,WestLongitude) - -#define IDVBSLocator_get_OrbitalPosition(This,longitude) \ - (This)->lpVtbl -> get_OrbitalPosition(This,longitude) - -#define IDVBSLocator_put_OrbitalPosition(This,longitude) \ - (This)->lpVtbl -> put_OrbitalPosition(This,longitude) - -#define IDVBSLocator_get_Azimuth(This,Azimuth) \ - (This)->lpVtbl -> get_Azimuth(This,Azimuth) - -#define IDVBSLocator_put_Azimuth(This,Azimuth) \ - (This)->lpVtbl -> put_Azimuth(This,Azimuth) - -#define IDVBSLocator_get_Elevation(This,Elevation) \ - (This)->lpVtbl -> get_Elevation(This,Elevation) - -#define IDVBSLocator_put_Elevation(This,Elevation) \ - (This)->lpVtbl -> put_Elevation(This,Elevation) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_get_SignalPolarisation_Proxy( - IDVBSLocator * This, - /* [retval][out] */ Polarisation *PolarisationVal); - - -void __RPC_STUB IDVBSLocator_get_SignalPolarisation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_put_SignalPolarisation_Proxy( - IDVBSLocator * This, - /* [in] */ Polarisation PolarisationVal); - - -void __RPC_STUB IDVBSLocator_put_SignalPolarisation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_get_WestPosition_Proxy( - IDVBSLocator * This, - /* [retval][out] */ VARIANT_BOOL *WestLongitude); - - -void __RPC_STUB IDVBSLocator_get_WestPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_put_WestPosition_Proxy( - IDVBSLocator * This, - /* [in] */ VARIANT_BOOL WestLongitude); - - -void __RPC_STUB IDVBSLocator_put_WestPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_get_OrbitalPosition_Proxy( - IDVBSLocator * This, - /* [retval][out] */ long *longitude); - - -void __RPC_STUB IDVBSLocator_get_OrbitalPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_put_OrbitalPosition_Proxy( - IDVBSLocator * This, - /* [in] */ long longitude); - - -void __RPC_STUB IDVBSLocator_put_OrbitalPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_get_Azimuth_Proxy( - IDVBSLocator * This, - /* [retval][out] */ long *Azimuth); - - -void __RPC_STUB IDVBSLocator_get_Azimuth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_put_Azimuth_Proxy( - IDVBSLocator * This, - /* [in] */ long Azimuth); - - -void __RPC_STUB IDVBSLocator_put_Azimuth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_get_Elevation_Proxy( - IDVBSLocator * This, - /* [retval][out] */ long *Elevation); - - -void __RPC_STUB IDVBSLocator_get_Elevation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_put_Elevation_Proxy( - IDVBSLocator * This, - /* [in] */ long Elevation); - - -void __RPC_STUB IDVBSLocator_put_Elevation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDVBSLocator_INTERFACE_DEFINED__ */ - - -#ifndef __IDVBCLocator_INTERFACE_DEFINED__ -#define __IDVBCLocator_INTERFACE_DEFINED__ - -/* interface IDVBCLocator */ -/* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_IDVBCLocator; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("6E42F36E-1DD2-43c4-9F78-69D25AE39034") - IDVBCLocator : public ILocator - { - public: - }; - -#else /* C style interface */ - - typedef struct IDVBCLocatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDVBCLocator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDVBCLocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDVBCLocator * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDVBCLocator * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDVBCLocator * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDVBCLocator * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDVBCLocator * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CarrierFrequency )( - IDVBCLocator * This, - /* [retval][out] */ long *Frequency); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CarrierFrequency )( - IDVBCLocator * This, - /* [in] */ long Frequency); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFEC )( - IDVBCLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFEC )( - IDVBCLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFECRate )( - IDVBCLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFECRate )( - IDVBCLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFEC )( - IDVBCLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFEC )( - IDVBCLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFECRate )( - IDVBCLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFECRate )( - IDVBCLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Modulation )( - IDVBCLocator * This, - /* [retval][out] */ ModulationType *Modulation); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Modulation )( - IDVBCLocator * This, - /* [in] */ ModulationType Modulation); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SymbolRate )( - IDVBCLocator * This, - /* [retval][out] */ long *Rate); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SymbolRate )( - IDVBCLocator * This, - /* [in] */ long Rate); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IDVBCLocator * This, - /* [retval][out] */ ILocator **NewLocator); - - END_INTERFACE - } IDVBCLocatorVtbl; - - interface IDVBCLocator - { - CONST_VTBL struct IDVBCLocatorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDVBCLocator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDVBCLocator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDVBCLocator_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDVBCLocator_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IDVBCLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IDVBCLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IDVBCLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IDVBCLocator_get_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> get_CarrierFrequency(This,Frequency) - -#define IDVBCLocator_put_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> put_CarrierFrequency(This,Frequency) - -#define IDVBCLocator_get_InnerFEC(This,FEC) \ - (This)->lpVtbl -> get_InnerFEC(This,FEC) - -#define IDVBCLocator_put_InnerFEC(This,FEC) \ - (This)->lpVtbl -> put_InnerFEC(This,FEC) - -#define IDVBCLocator_get_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> get_InnerFECRate(This,FEC) - -#define IDVBCLocator_put_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> put_InnerFECRate(This,FEC) - -#define IDVBCLocator_get_OuterFEC(This,FEC) \ - (This)->lpVtbl -> get_OuterFEC(This,FEC) - -#define IDVBCLocator_put_OuterFEC(This,FEC) \ - (This)->lpVtbl -> put_OuterFEC(This,FEC) - -#define IDVBCLocator_get_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> get_OuterFECRate(This,FEC) - -#define IDVBCLocator_put_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> put_OuterFECRate(This,FEC) - -#define IDVBCLocator_get_Modulation(This,Modulation) \ - (This)->lpVtbl -> get_Modulation(This,Modulation) - -#define IDVBCLocator_put_Modulation(This,Modulation) \ - (This)->lpVtbl -> put_Modulation(This,Modulation) - -#define IDVBCLocator_get_SymbolRate(This,Rate) \ - (This)->lpVtbl -> get_SymbolRate(This,Rate) - -#define IDVBCLocator_put_SymbolRate(This,Rate) \ - (This)->lpVtbl -> put_SymbolRate(This,Rate) - -#define IDVBCLocator_Clone(This,NewLocator) \ - (This)->lpVtbl -> Clone(This,NewLocator) - - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __IDVBCLocator_INTERFACE_DEFINED__ */ - - -#ifndef __IBroadcastEvent_INTERFACE_DEFINED__ -#define __IBroadcastEvent_INTERFACE_DEFINED__ - -/* interface IBroadcastEvent */ -/* [unique][helpstring][uuid][nonextensible][hidden][object] */ - - -EXTERN_C const IID IID_IBroadcastEvent; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("3B21263F-26E8-489d-AAC4-924F7EFD9511") - IBroadcastEvent : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Fire( - GUID EventID) = 0; - - }; - -#else /* C style interface */ - - typedef struct IBroadcastEventVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IBroadcastEvent * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IBroadcastEvent * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IBroadcastEvent * This); - - HRESULT ( STDMETHODCALLTYPE *Fire )( - IBroadcastEvent * This, - GUID EventID); - - END_INTERFACE - } IBroadcastEventVtbl; - - interface IBroadcastEvent - { - CONST_VTBL struct IBroadcastEventVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IBroadcastEvent_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IBroadcastEvent_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IBroadcastEvent_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IBroadcastEvent_Fire(This,EventID) \ - (This)->lpVtbl -> Fire(This,EventID) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IBroadcastEvent_Fire_Proxy( - IBroadcastEvent * This, - GUID EventID); - - -void __RPC_STUB IBroadcastEvent_Fire_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IBroadcastEvent_INTERFACE_DEFINED__ */ - - - -#ifndef __TunerLib_LIBRARY_DEFINED__ -#define __TunerLib_LIBRARY_DEFINED__ - -/* library TunerLib */ -/* [helpstring][version][uuid] */ - -#define SID_SBroadcastEventService CLSID_BroadcastEventService - -EXTERN_C const IID LIBID_TunerLib; - -EXTERN_C const CLSID CLSID_SystemTuningSpaces; - -#ifdef __cplusplus - -class DECLSPEC_UUID("D02AAC50-027E-11d3-9D8E-00C04F72D980") -SystemTuningSpaces; -#endif - -EXTERN_C const CLSID CLSID_TuningSpace; - -#ifdef __cplusplus - -class DECLSPEC_UUID("5FFDC5E6-B83A-4b55-B6E8-C69E765FE9DB") -TuningSpace; -#endif - -EXTERN_C const CLSID CLSID_ATSCTuningSpace; - -#ifdef __cplusplus - -class DECLSPEC_UUID("A2E30750-6C3D-11d3-B653-00C04F79498E") -ATSCTuningSpace; -#endif - -EXTERN_C const CLSID CLSID_AnalogRadioTuningSpace; - -#ifdef __cplusplus - -class DECLSPEC_UUID("8A674B4C-1F63-11d3-B64C-00C04F79498E") -AnalogRadioTuningSpace; -#endif - -EXTERN_C const CLSID CLSID_AnalogTVTuningSpace; - -#ifdef __cplusplus - -class DECLSPEC_UUID("8A674B4D-1F63-11d3-B64C-00C04F79498E") -AnalogTVTuningSpace; -#endif - -EXTERN_C const CLSID CLSID_DVBTuningSpace; - -#ifdef __cplusplus - -class DECLSPEC_UUID("C6B14B32-76AA-4a86-A7AC-5C79AAF58DA7") -DVBTuningSpace; -#endif - -EXTERN_C const CLSID CLSID_DVBSTuningSpace; - -#ifdef __cplusplus - -class DECLSPEC_UUID("B64016F3-C9A2-4066-96F0-BD9563314726") -DVBSTuningSpace; -#endif - -EXTERN_C const CLSID CLSID_ComponentTypes; - -#ifdef __cplusplus - -class DECLSPEC_UUID("A1A2B1C4-0E3A-11d3-9D8E-00C04F72D980") -ComponentTypes; -#endif - -EXTERN_C const CLSID CLSID_ComponentType; - -#ifdef __cplusplus - -class DECLSPEC_UUID("823535A0-0318-11d3-9D8E-00C04F72D980") -ComponentType; -#endif - -EXTERN_C const CLSID CLSID_LanguageComponentType; - -#ifdef __cplusplus - -class DECLSPEC_UUID("1BE49F30-0E1B-11d3-9D8E-00C04F72D980") -LanguageComponentType; -#endif - -EXTERN_C const CLSID CLSID_MPEG2ComponentType; - -#ifdef __cplusplus - -class DECLSPEC_UUID("418008F3-CF67-4668-9628-10DC52BE1D08") -MPEG2ComponentType; -#endif - -EXTERN_C const CLSID CLSID_ATSCComponentType; - -#ifdef __cplusplus - -class DECLSPEC_UUID("A8DCF3D5-0780-4ef4-8A83-2CFFAACB8ACE") -ATSCComponentType; -#endif - -EXTERN_C const CLSID CLSID_Components; - -#ifdef __cplusplus - -class DECLSPEC_UUID("809B6661-94C4-49e6-B6EC-3F0F862215AA") -Components; -#endif - -EXTERN_C const CLSID CLSID_Component; - -#ifdef __cplusplus - -class DECLSPEC_UUID("59DC47A8-116C-11d3-9D8E-00C04F72D980") -Component; -#endif - -EXTERN_C const CLSID CLSID_MPEG2Component; - -#ifdef __cplusplus - -class DECLSPEC_UUID("055CB2D7-2969-45cd-914B-76890722F112") -MPEG2Component; -#endif - -EXTERN_C const CLSID CLSID_TuneRequest; - -#ifdef __cplusplus - -class DECLSPEC_UUID("B46E0D38-AB35-4a06-A137-70576B01B39F") -TuneRequest; -#endif - -EXTERN_C const CLSID CLSID_ChannelTuneRequest; - -#ifdef __cplusplus - -class DECLSPEC_UUID("0369B4E5-45B6-11d3-B650-00C04F79498E") -ChannelTuneRequest; -#endif - -EXTERN_C const CLSID CLSID_ATSCChannelTuneRequest; - -#ifdef __cplusplus - -class DECLSPEC_UUID("0369B4E6-45B6-11d3-B650-00C04F79498E") -ATSCChannelTuneRequest; -#endif - -EXTERN_C const CLSID CLSID_MPEG2TuneRequest; - -#ifdef __cplusplus - -class DECLSPEC_UUID("0955AC62-BF2E-4cba-A2B9-A63F772D46CF") -MPEG2TuneRequest; -#endif - -EXTERN_C const CLSID CLSID_MPEG2TuneRequestFactory; - -#ifdef __cplusplus - -class DECLSPEC_UUID("2C63E4EB-4CEA-41b8-919C-E947EA19A77C") -MPEG2TuneRequestFactory; -#endif - -EXTERN_C const CLSID CLSID_Locator; - -#ifdef __cplusplus - -class DECLSPEC_UUID("0888C883-AC4F-4943-B516-2C38D9B34562") -Locator; -#endif - -EXTERN_C const CLSID CLSID_ATSCLocator; - -#ifdef __cplusplus - -class DECLSPEC_UUID("8872FF1B-98FA-4d7a-8D93-C9F1055F85BB") -ATSCLocator; -#endif - -EXTERN_C const CLSID CLSID_DVBTLocator; - -#ifdef __cplusplus - -class DECLSPEC_UUID("9CD64701-BDF3-4d14-8E03-F12983D86664") -DVBTLocator; -#endif - -EXTERN_C const CLSID CLSID_DVBSLocator; - -#ifdef __cplusplus - -class DECLSPEC_UUID("1DF7D126-4050-47f0-A7CF-4C4CA9241333") -DVBSLocator; -#endif - -EXTERN_C const CLSID CLSID_DVBCLocator; - -#ifdef __cplusplus - -class DECLSPEC_UUID("C531D9FD-9685-4028-8B68-6E1232079F1E") -DVBCLocator; -#endif - -EXTERN_C const CLSID CLSID_DVBTuneRequest; - -#ifdef __cplusplus - -class DECLSPEC_UUID("15D6504A-5494-499c-886C-973C9E53B9F1") -DVBTuneRequest; -#endif - -EXTERN_C const CLSID CLSID_CreatePropBagOnRegKey; - -#ifdef __cplusplus - -class DECLSPEC_UUID("8A674B49-1F63-11d3-B64C-00C04F79498E") -CreatePropBagOnRegKey; -#endif - -EXTERN_C const CLSID CLSID_BroadcastEventService; - -#ifdef __cplusplus - -class DECLSPEC_UUID("0B3FFB92-0919-4934-9D5B-619C719D0202") -BroadcastEventService; -#endif -#endif /* __TunerLib_LIBRARY_DEFINED__ */ - -/* Additional Prototypes for ALL interfaces */ - -unsigned long __RPC_USER BSTR_UserSize( unsigned long *, unsigned long , BSTR * ); -unsigned char * __RPC_USER BSTR_UserMarshal( unsigned long *, unsigned char *, BSTR * ); -unsigned char * __RPC_USER BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); -void __RPC_USER BSTR_UserFree( unsigned long *, BSTR * ); - -unsigned long __RPC_USER VARIANT_UserSize( unsigned long *, unsigned long , VARIANT * ); -unsigned char * __RPC_USER VARIANT_UserMarshal( unsigned long *, unsigned char *, VARIANT * ); -unsigned char * __RPC_USER VARIANT_UserUnmarshal(unsigned long *, unsigned char *, VARIANT * ); -void __RPC_USER VARIANT_UserFree( unsigned long *, VARIANT * ); - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - - - -///////////////////////////////////////////////////////////////////////////// -// -// Windows XP vs. DirectX 8.0 header merge -// -// The following is the original contents of this header from -// the DirectX 8.0 SDK. -// -///////////////////////////////////////////////////////////////////////////// - -#else // DirectX 8.0 content - - - /* File created by MIDL compiler version 6.00.0338 */ - /* Compiler settings for tuner.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() - */ - //@@MIDL_FILE_HEADING( ) - - - /* verify that the version is high enough to compile this file*/ - #ifndef __REQUIRED_RPCNDR_H_VERSION__ - #define __REQUIRED_RPCNDR_H_VERSION__ 440 - #endif - - #include "rpc.h" - #include "rpcndr.h" - - #ifndef __RPCNDR_H_VERSION__ - #error this stub requires an updated version of - #endif // __RPCNDR_H_VERSION__ - - #ifndef COM_NO_WINDOWS_H - #include "windows.h" - #include "ole2.h" - #endif /*COM_NO_WINDOWS_H*/ - - #ifndef __tuner_h__ - #define __tuner_h__ - - #if defined(_MSC_VER) && (_MSC_VER >= 1020) - #pragma once - #endif - - /* Forward Declarations */ - - #ifndef __ITuningSpaces_FWD_DEFINED__ - #define __ITuningSpaces_FWD_DEFINED__ - typedef interface ITuningSpaces ITuningSpaces; - #endif /* __ITuningSpaces_FWD_DEFINED__ */ - - - #ifndef __ITuningSpaceContainer_FWD_DEFINED__ - #define __ITuningSpaceContainer_FWD_DEFINED__ - typedef interface ITuningSpaceContainer ITuningSpaceContainer; - #endif /* __ITuningSpaceContainer_FWD_DEFINED__ */ - - - #ifndef __ITuningSpace_FWD_DEFINED__ - #define __ITuningSpace_FWD_DEFINED__ - typedef interface ITuningSpace ITuningSpace; - #endif /* __ITuningSpace_FWD_DEFINED__ */ - - - #ifndef __IEnumTuningSpaces_FWD_DEFINED__ - #define __IEnumTuningSpaces_FWD_DEFINED__ - typedef interface IEnumTuningSpaces IEnumTuningSpaces; - #endif /* __IEnumTuningSpaces_FWD_DEFINED__ */ - - - #ifndef __IDVBTuningSpace_FWD_DEFINED__ - #define __IDVBTuningSpace_FWD_DEFINED__ - typedef interface IDVBTuningSpace IDVBTuningSpace; - #endif /* __IDVBTuningSpace_FWD_DEFINED__ */ - - - #ifndef __IAnalogTVTuningSpace_FWD_DEFINED__ - #define __IAnalogTVTuningSpace_FWD_DEFINED__ - typedef interface IAnalogTVTuningSpace IAnalogTVTuningSpace; - #endif /* __IAnalogTVTuningSpace_FWD_DEFINED__ */ - - - #ifndef __IATSCTuningSpace_FWD_DEFINED__ - #define __IATSCTuningSpace_FWD_DEFINED__ - typedef interface IATSCTuningSpace IATSCTuningSpace; - #endif /* __IATSCTuningSpace_FWD_DEFINED__ */ - - - #ifndef __IAnalogRadioTuningSpace_FWD_DEFINED__ - #define __IAnalogRadioTuningSpace_FWD_DEFINED__ - typedef interface IAnalogRadioTuningSpace IAnalogRadioTuningSpace; - #endif /* __IAnalogRadioTuningSpace_FWD_DEFINED__ */ - - - #ifndef __ITuneRequest_FWD_DEFINED__ - #define __ITuneRequest_FWD_DEFINED__ - typedef interface ITuneRequest ITuneRequest; - #endif /* __ITuneRequest_FWD_DEFINED__ */ - - - #ifndef __IChannelTuneRequest_FWD_DEFINED__ - #define __IChannelTuneRequest_FWD_DEFINED__ - typedef interface IChannelTuneRequest IChannelTuneRequest; - #endif /* __IChannelTuneRequest_FWD_DEFINED__ */ - - - #ifndef __IATSCChannelTuneRequest_FWD_DEFINED__ - #define __IATSCChannelTuneRequest_FWD_DEFINED__ - typedef interface IATSCChannelTuneRequest IATSCChannelTuneRequest; - #endif /* __IATSCChannelTuneRequest_FWD_DEFINED__ */ - - - #ifndef __IDVBTuneRequest_FWD_DEFINED__ - #define __IDVBTuneRequest_FWD_DEFINED__ - typedef interface IDVBTuneRequest IDVBTuneRequest; - #endif /* __IDVBTuneRequest_FWD_DEFINED__ */ - - - #ifndef __ITuner_FWD_DEFINED__ - #define __ITuner_FWD_DEFINED__ - typedef interface ITuner ITuner; - #endif /* __ITuner_FWD_DEFINED__ */ - - - #ifndef __IScanningTuner_FWD_DEFINED__ - #define __IScanningTuner_FWD_DEFINED__ - typedef interface IScanningTuner IScanningTuner; - #endif /* __IScanningTuner_FWD_DEFINED__ */ - - - #ifndef __ITunerEvents_FWD_DEFINED__ - #define __ITunerEvents_FWD_DEFINED__ - typedef interface ITunerEvents ITunerEvents; - #endif /* __ITunerEvents_FWD_DEFINED__ */ - - - #ifndef __ISignalEvents_FWD_DEFINED__ - #define __ISignalEvents_FWD_DEFINED__ - typedef interface ISignalEvents ISignalEvents; - #endif /* __ISignalEvents_FWD_DEFINED__ */ - - - #ifndef __IComponentType_FWD_DEFINED__ - #define __IComponentType_FWD_DEFINED__ - typedef interface IComponentType IComponentType; - #endif /* __IComponentType_FWD_DEFINED__ */ - - - #ifndef __ILanguageComponentType_FWD_DEFINED__ - #define __ILanguageComponentType_FWD_DEFINED__ - typedef interface ILanguageComponentType ILanguageComponentType; - #endif /* __ILanguageComponentType_FWD_DEFINED__ */ - - - #ifndef __IMPEG2ComponentType_FWD_DEFINED__ - #define __IMPEG2ComponentType_FWD_DEFINED__ - typedef interface IMPEG2ComponentType IMPEG2ComponentType; - #endif /* __IMPEG2ComponentType_FWD_DEFINED__ */ - - - #ifndef __IATSCComponentType_FWD_DEFINED__ - #define __IATSCComponentType_FWD_DEFINED__ - typedef interface IATSCComponentType IATSCComponentType; - #endif /* __IATSCComponentType_FWD_DEFINED__ */ - - - #ifndef __IEnumComponentTypes_FWD_DEFINED__ - #define __IEnumComponentTypes_FWD_DEFINED__ - typedef interface IEnumComponentTypes IEnumComponentTypes; - #endif /* __IEnumComponentTypes_FWD_DEFINED__ */ - - - #ifndef __IComponentTypes_FWD_DEFINED__ - #define __IComponentTypes_FWD_DEFINED__ - typedef interface IComponentTypes IComponentTypes; - #endif /* __IComponentTypes_FWD_DEFINED__ */ - - - #ifndef __IComponent_FWD_DEFINED__ - #define __IComponent_FWD_DEFINED__ - typedef interface IComponent IComponent; - #endif /* __IComponent_FWD_DEFINED__ */ - - - #ifndef __IMPEG2Component_FWD_DEFINED__ - #define __IMPEG2Component_FWD_DEFINED__ - typedef interface IMPEG2Component IMPEG2Component; - #endif /* __IMPEG2Component_FWD_DEFINED__ */ - - - #ifndef __IEnumComponents_FWD_DEFINED__ - #define __IEnumComponents_FWD_DEFINED__ - typedef interface IEnumComponents IEnumComponents; - #endif /* __IEnumComponents_FWD_DEFINED__ */ - - - #ifndef __IComponents_FWD_DEFINED__ - #define __IComponents_FWD_DEFINED__ - typedef interface IComponents IComponents; - #endif /* __IComponents_FWD_DEFINED__ */ - - - #ifndef __ILocator_FWD_DEFINED__ - #define __ILocator_FWD_DEFINED__ - typedef interface ILocator ILocator; - #endif /* __ILocator_FWD_DEFINED__ */ - - - #ifndef __IATSCLocator_FWD_DEFINED__ - #define __IATSCLocator_FWD_DEFINED__ - typedef interface IATSCLocator IATSCLocator; - #endif /* __IATSCLocator_FWD_DEFINED__ */ - - - #ifndef __IDVBTLocator_FWD_DEFINED__ - #define __IDVBTLocator_FWD_DEFINED__ - typedef interface IDVBTLocator IDVBTLocator; - #endif /* __IDVBTLocator_FWD_DEFINED__ */ - - - #ifndef __IDVBSLocator_FWD_DEFINED__ - #define __IDVBSLocator_FWD_DEFINED__ - typedef interface IDVBSLocator IDVBSLocator; - #endif /* __IDVBSLocator_FWD_DEFINED__ */ - - - #ifndef __IDVBCLocator_FWD_DEFINED__ - #define __IDVBCLocator_FWD_DEFINED__ - typedef interface IDVBCLocator IDVBCLocator; - #endif /* __IDVBCLocator_FWD_DEFINED__ */ - - - #ifndef __SystemTuningSpaces_FWD_DEFINED__ - #define __SystemTuningSpaces_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class SystemTuningSpaces SystemTuningSpaces; - #else - typedef struct SystemTuningSpaces SystemTuningSpaces; - #endif /* __cplusplus */ - - #endif /* __SystemTuningSpaces_FWD_DEFINED__ */ - - - #ifndef __TuningSpace_FWD_DEFINED__ - #define __TuningSpace_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class TuningSpace TuningSpace; - #else - typedef struct TuningSpace TuningSpace; - #endif /* __cplusplus */ - - #endif /* __TuningSpace_FWD_DEFINED__ */ - - - #ifndef __ATSCTuningSpace_FWD_DEFINED__ - #define __ATSCTuningSpace_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class ATSCTuningSpace ATSCTuningSpace; - #else - typedef struct ATSCTuningSpace ATSCTuningSpace; - #endif /* __cplusplus */ - - #endif /* __ATSCTuningSpace_FWD_DEFINED__ */ - - - #ifndef __AnalogRadioTuningSpace_FWD_DEFINED__ - #define __AnalogRadioTuningSpace_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class AnalogRadioTuningSpace AnalogRadioTuningSpace; - #else - typedef struct AnalogRadioTuningSpace AnalogRadioTuningSpace; - #endif /* __cplusplus */ - - #endif /* __AnalogRadioTuningSpace_FWD_DEFINED__ */ - - - #ifndef __AnalogTVTuningSpace_FWD_DEFINED__ - #define __AnalogTVTuningSpace_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class AnalogTVTuningSpace AnalogTVTuningSpace; - #else - typedef struct AnalogTVTuningSpace AnalogTVTuningSpace; - #endif /* __cplusplus */ - - #endif /* __AnalogTVTuningSpace_FWD_DEFINED__ */ - - - #ifndef __DVBTuningSpace_FWD_DEFINED__ - #define __DVBTuningSpace_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class DVBTuningSpace DVBTuningSpace; - #else - typedef struct DVBTuningSpace DVBTuningSpace; - #endif /* __cplusplus */ - - #endif /* __DVBTuningSpace_FWD_DEFINED__ */ - - - #ifndef __ComponentTypes_FWD_DEFINED__ - #define __ComponentTypes_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class ComponentTypes ComponentTypes; - #else - typedef struct ComponentTypes ComponentTypes; - #endif /* __cplusplus */ - - #endif /* __ComponentTypes_FWD_DEFINED__ */ - - - #ifndef __ComponentType_FWD_DEFINED__ - #define __ComponentType_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class ComponentType ComponentType; - #else - typedef struct ComponentType ComponentType; - #endif /* __cplusplus */ - - #endif /* __ComponentType_FWD_DEFINED__ */ - - - #ifndef __LanguageComponentType_FWD_DEFINED__ - #define __LanguageComponentType_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class LanguageComponentType LanguageComponentType; - #else - typedef struct LanguageComponentType LanguageComponentType; - #endif /* __cplusplus */ - - #endif /* __LanguageComponentType_FWD_DEFINED__ */ - - - #ifndef __MPEG2ComponentType_FWD_DEFINED__ - #define __MPEG2ComponentType_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class MPEG2ComponentType MPEG2ComponentType; - #else - typedef struct MPEG2ComponentType MPEG2ComponentType; - #endif /* __cplusplus */ - - #endif /* __MPEG2ComponentType_FWD_DEFINED__ */ - - - #ifndef __ATSCComponentType_FWD_DEFINED__ - #define __ATSCComponentType_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class ATSCComponentType ATSCComponentType; - #else - typedef struct ATSCComponentType ATSCComponentType; - #endif /* __cplusplus */ - - #endif /* __ATSCComponentType_FWD_DEFINED__ */ - - - #ifndef __Components_FWD_DEFINED__ - #define __Components_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class Components Components; - #else - typedef struct Components Components; - #endif /* __cplusplus */ - - #endif /* __Components_FWD_DEFINED__ */ - - - #ifndef __Component_FWD_DEFINED__ - #define __Component_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class Component Component; - #else - typedef struct Component Component; - #endif /* __cplusplus */ - - #endif /* __Component_FWD_DEFINED__ */ - - - #ifndef __MPEG2Component_FWD_DEFINED__ - #define __MPEG2Component_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class MPEG2Component MPEG2Component; - #else - typedef struct MPEG2Component MPEG2Component; - #endif /* __cplusplus */ - - #endif /* __MPEG2Component_FWD_DEFINED__ */ - - - #ifndef __TuneRequest_FWD_DEFINED__ - #define __TuneRequest_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class TuneRequest TuneRequest; - #else - typedef struct TuneRequest TuneRequest; - #endif /* __cplusplus */ - - #endif /* __TuneRequest_FWD_DEFINED__ */ - - - #ifndef __ChannelTuneRequest_FWD_DEFINED__ - #define __ChannelTuneRequest_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class ChannelTuneRequest ChannelTuneRequest; - #else - typedef struct ChannelTuneRequest ChannelTuneRequest; - #endif /* __cplusplus */ - - #endif /* __ChannelTuneRequest_FWD_DEFINED__ */ - - - #ifndef __ATSCChannelTuneRequest_FWD_DEFINED__ - #define __ATSCChannelTuneRequest_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class ATSCChannelTuneRequest ATSCChannelTuneRequest; - #else - typedef struct ATSCChannelTuneRequest ATSCChannelTuneRequest; - #endif /* __cplusplus */ - - #endif /* __ATSCChannelTuneRequest_FWD_DEFINED__ */ - - - #ifndef __Locator_FWD_DEFINED__ - #define __Locator_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class Locator Locator; - #else - typedef struct Locator Locator; - #endif /* __cplusplus */ - - #endif /* __Locator_FWD_DEFINED__ */ - - - #ifndef __ATSCLocator_FWD_DEFINED__ - #define __ATSCLocator_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class ATSCLocator ATSCLocator; - #else - typedef struct ATSCLocator ATSCLocator; - #endif /* __cplusplus */ - - #endif /* __ATSCLocator_FWD_DEFINED__ */ - - - #ifndef __DVBTLocator_FWD_DEFINED__ - #define __DVBTLocator_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class DVBTLocator DVBTLocator; - #else - typedef struct DVBTLocator DVBTLocator; - #endif /* __cplusplus */ - - #endif /* __DVBTLocator_FWD_DEFINED__ */ - - - #ifndef __DVBSLocator_FWD_DEFINED__ - #define __DVBSLocator_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class DVBSLocator DVBSLocator; - #else - typedef struct DVBSLocator DVBSLocator; - #endif /* __cplusplus */ - - #endif /* __DVBSLocator_FWD_DEFINED__ */ - - - #ifndef __DVBCLocator_FWD_DEFINED__ - #define __DVBCLocator_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class DVBCLocator DVBCLocator; - #else - typedef struct DVBCLocator DVBCLocator; - #endif /* __cplusplus */ - - #endif /* __DVBCLocator_FWD_DEFINED__ */ - - - #ifndef __DVBTuneRequest_FWD_DEFINED__ - #define __DVBTuneRequest_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class DVBTuneRequest DVBTuneRequest; - #else - typedef struct DVBTuneRequest DVBTuneRequest; - #endif /* __cplusplus */ - - #endif /* __DVBTuneRequest_FWD_DEFINED__ */ - - - #ifndef __CreatePropBagOnRegKey_FWD_DEFINED__ - #define __CreatePropBagOnRegKey_FWD_DEFINED__ - - #ifdef __cplusplus - typedef class CreatePropBagOnRegKey CreatePropBagOnRegKey; - #else - typedef struct CreatePropBagOnRegKey CreatePropBagOnRegKey; - #endif /* __cplusplus */ - - #endif /* __CreatePropBagOnRegKey_FWD_DEFINED__ */ - - - /* header files for imported files */ - #include "oaidl.h" - #include "comcat.h" - #include "strmif.h" - #include "bdatypes.h" - #include "regbag.h" - - #ifdef __cplusplus - extern "C"{ - #endif - - void * __RPC_USER MIDL_user_allocate(size_t); - void __RPC_USER MIDL_user_free( void * ); - - /* interface __MIDL_itf_tuner_0000 */ - /* [local] */ - - //+------------------------------------------------------------------------- - // - // Microsoft Windows - // Copyright (C) Microsoft Corporation, 1999-2001. - // - //-------------------------------------------------------------------------- - #pragma once - #include - - - - - - - - - - - - - - - - - - - - - - enum __MIDL___MIDL_itf_tuner_0000_0001 - { DISPID_TUNER_TS_UNIQUENAME = 1, - DISPID_TUNER_TS_FRIENDLYNAME = 2, - DISPID_TUNER_TS_CLSID = 3, - DISPID_TUNER_TS_NETWORKTYPE = 4, - DISPID_TUNER_TS__NETWORKTYPE = 5, - DISPID_TUNER_TS_CREATETUNEREQUEST = 6, - DISPID_TUNER_TS_ENUMCATEGORYGUIDS = 7, - DISPID_TUNER_TS_ENUMDEVICEMONIKERS = 8, - DISPID_TUNER_TS_DEFAULTPREFERREDCOMPONENTTYPES = 9, - DISPID_TUNER_TS_FREQMAP = 10, - DISPID_TUNER_TS_DEFLOCATOR = 11, - DISPID_TUNER_TS_CLONE = 12, - DISPID_TUNER_TR_TUNINGSPACE = 1, - DISPID_TUNER_TR_COMPONENTS = 2, - DISPID_TUNER_TR_CLONE = 3, - DISPID_TUNER_TR_LOCATOR = 4, - DISPID_TUNER_CT_CATEGORY = 1, - DISPID_TUNER_CT_MEDIAMAJORTYPE = 2, - DISPID_TUNER_CT__MEDIAMAJORTYPE = 3, - DISPID_TUNER_CT_MEDIASUBTYPE = 4, - DISPID_TUNER_CT__MEDIASUBTYPE = 5, - DISPID_TUNER_CT_MEDIAFORMATTYPE = 6, - DISPID_TUNER_CT__MEDIAFORMATTYPE = 7, - DISPID_TUNER_CT_MEDIATYPE = 8, - DISPID_TUNER_CT_CLONE = 9, - DISPID_TUNER_LCT_LANGID = 100, - DISPID_TUNER_MP2CT_TYPE = 200, - DISPID_TUNER_ATSCCT_FLAGS = 300, - DISPID_TUNER_L_CARRFREQ = 1, - DISPID_TUNER_L_INNERFECMETHOD = 2, - DISPID_TUNER_L_INNERFECRATE = 3, - DISPID_TUNER_L_OUTERFECMETHOD = 4, - DISPID_TUNER_L_OUTERFECRATE = 5, - DISPID_TUNER_L_MOD = 6, - DISPID_TUNER_L_SYMRATE = 7, - DISPID_TUNER_L_CLONE = 8, - DISPID_TUNER_L_ATSC_PHYS_CHANNEL = 201, - DISPID_TUNER_L_ATSC_TSID = 202, - DISPID_TUNER_L_DVBT_BANDWIDTH = 301, - DISPID_TUNER_L_DVBT_LPINNERFECMETHOD = 302, - DISPID_TUNER_L_DVBT_LPINNERFECRATE = 303, - DISPID_TUNER_L_DVBT_GUARDINTERVAL = 304, - DISPID_TUNER_L_DVBT_HALPHA = 305, - DISPID_TUNER_L_DVBT_TRANSMISSIONMODE = 306, - DISPID_TUNER_L_DVBT_INUSE = 307, - DISPID_TUNER_L_DVBS_POLARISATION = 401, - DISPID_TUNER_L_DVBS_WEST = 402, - DISPID_TUNER_L_DVBS_ORBITAL = 403, - DISPID_TUNER_L_DVBS_AZIMUTH = 404, - DISPID_TUNER_L_DVBS_ELEVATION = 405, - DISPID_TUNER_C_TYPE = 1, - DISPID_TUNER_C_STATUS = 2, - DISPID_TUNER_C_LANGID = 3, - DISPID_TUNER_C_DESCRIPTION = 4, - DISPID_TUNER_C_CLONE = 5, - DISPID_TUNER_C_MP2_PID = 101, - DISPID_TUNER_C_MP2_PCRPID = 102, - DISPID_TUNER_C_MP2_PROGNO = 103, - DISPID_TUNER_TS_DVB_SYSTEMTYPE = 101, - DISPID_TUNER_TS_AR_MINFREQUENCY = 101, - DISPID_TUNER_TS_AR_MAXFREQUENCY = 102, - DISPID_TUNER_TS_AR_STEP = 103, - DISPID_TUNER_TS_ATV_MINCHANNEL = 101, - DISPID_TUNER_TS_ATV_MAXCHANNEL = 102, - DISPID_TUNER_TS_ATV_INPUTTYPE = 103, - DISPID_TUNER_TS_ATV_COUNTRYCODE = 104, - DISPID_TUNER_TS_ATSC_MINMINORCHANNEL = 201, - DISPID_TUNER_TS_ATSC_MAXMINORCHANNEL = 202, - DISPID_TUNER_TS_ATSC_MINPHYSCHANNEL = 203, - DISPID_TUNER_TS_ATSC_MAXPHYSCHANNEL = 204, - DISPID_CHTUNER_ATVAC_CHANNEL = 101, - DISPID_CHTUNER_ATVDC_SYSTEM = 101, - DISPID_CHTUNER_ATVDC_CONTENT = 102, - DISPID_CHTUNER_CTR_CHANNEL = 101, - DISPID_CHTUNER_ACTR_MINOR_CHANNEL = 201, - DISPID_DVBTUNER_DVBC_ATTRIBUTESVALID = 101, - DISPID_DVBTUNER_DVBC_PID = 102, - DISPID_DVBTUNER_DVBC_TAG = 103, - DISPID_DVBTUNER_DVBC_COMPONENTTYPE = 104, - DISPID_DVBTUNER_ONID = 101, - DISPID_DVBTUNER_TSID = 102, - DISPID_DVBTUNER_SID = 103 - } ; - - - extern RPC_IF_HANDLE __MIDL_itf_tuner_0000_v0_0_c_ifspec; - extern RPC_IF_HANDLE __MIDL_itf_tuner_0000_v0_0_s_ifspec; - - #ifndef __ITuningSpaces_INTERFACE_DEFINED__ - #define __ITuningSpaces_INTERFACE_DEFINED__ - - /* interface ITuningSpaces */ - /* [unique][helpstring][nonextensible][oleautomation][dual][uuid][object] */ - - - EXTERN_C const IID IID_ITuningSpaces; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("901284E4-33FE-4b69-8D63-634A596F3756") - ITuningSpaces : public IDispatch - { - public: - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( - /* [retval][out] */ long *Count) = 0; - - virtual /* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( - /* [retval][out] */ IEnumVARIANT **NewEnum) = 0; - - virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Item( - /* [in] */ VARIANT varIndex, - /* [retval][out] */ ITuningSpace **TuningSpace) = 0; - - virtual /* [helpstring][restricted][hidden][propget] */ HRESULT STDMETHODCALLTYPE get_EnumTuningSpaces( - /* [retval][out] */ IEnumTuningSpaces **NewEnum) = 0; - - }; - - #else /* C style interface */ - - typedef struct ITuningSpacesVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ITuningSpaces * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ITuningSpaces * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ITuningSpaces * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - ITuningSpaces * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - ITuningSpaces * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - ITuningSpaces * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - ITuningSpaces * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( - ITuningSpaces * This, - /* [retval][out] */ long *Count); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( - ITuningSpaces * This, - /* [retval][out] */ IEnumVARIANT **NewEnum); - - /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Item )( - ITuningSpaces * This, - /* [in] */ VARIANT varIndex, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][restricted][hidden][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnumTuningSpaces )( - ITuningSpaces * This, - /* [retval][out] */ IEnumTuningSpaces **NewEnum); - - END_INTERFACE - } ITuningSpacesVtbl; - - interface ITuningSpaces - { - CONST_VTBL struct ITuningSpacesVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define ITuningSpaces_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define ITuningSpaces_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define ITuningSpaces_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define ITuningSpaces_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define ITuningSpaces_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define ITuningSpaces_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define ITuningSpaces_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define ITuningSpaces_get_Count(This,Count) \ - (This)->lpVtbl -> get_Count(This,Count) - - #define ITuningSpaces_get__NewEnum(This,NewEnum) \ - (This)->lpVtbl -> get__NewEnum(This,NewEnum) - - #define ITuningSpaces_get_Item(This,varIndex,TuningSpace) \ - (This)->lpVtbl -> get_Item(This,varIndex,TuningSpace) - - #define ITuningSpaces_get_EnumTuningSpaces(This,NewEnum) \ - (This)->lpVtbl -> get_EnumTuningSpaces(This,NewEnum) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpaces_get_Count_Proxy( - ITuningSpaces * This, - /* [retval][out] */ long *Count); - - - void __RPC_STUB ITuningSpaces_get_Count_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpaces_get__NewEnum_Proxy( - ITuningSpaces * This, - /* [retval][out] */ IEnumVARIANT **NewEnum); - - - void __RPC_STUB ITuningSpaces_get__NewEnum_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE ITuningSpaces_get_Item_Proxy( - ITuningSpaces * This, - /* [in] */ VARIANT varIndex, - /* [retval][out] */ ITuningSpace **TuningSpace); - - - void __RPC_STUB ITuningSpaces_get_Item_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][restricted][hidden][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpaces_get_EnumTuningSpaces_Proxy( - ITuningSpaces * This, - /* [retval][out] */ IEnumTuningSpaces **NewEnum); - - - void __RPC_STUB ITuningSpaces_get_EnumTuningSpaces_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __ITuningSpaces_INTERFACE_DEFINED__ */ - - - #ifndef __ITuningSpaceContainer_INTERFACE_DEFINED__ - #define __ITuningSpaceContainer_INTERFACE_DEFINED__ - - /* interface ITuningSpaceContainer */ - /* [unique][helpstring][nonextensible][hidden][oleautomation][dual][uuid][object] */ - - - EXTERN_C const IID IID_ITuningSpaceContainer; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("5B692E84-E2F1-11d2-9493-00C04F72D980") - ITuningSpaceContainer : public IDispatch - { - public: - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( - /* [retval][out] */ long *Count) = 0; - - virtual /* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( - /* [retval][out] */ IEnumVARIANT **NewEnum) = 0; - - virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Item( - /* [in] */ VARIANT varIndex, - /* [retval][out] */ ITuningSpace **TuningSpace) = 0; - - virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_Item( - /* [in] */ VARIANT varIndex, - /* [in] */ ITuningSpace *TuningSpace) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE TuningSpacesForCLSID( - /* [in] */ BSTR SpaceCLSID, - /* [retval][out] */ ITuningSpaces **NewColl) = 0; - - virtual /* [helpstring][restricted][hidden] */ HRESULT STDMETHODCALLTYPE _TuningSpacesForCLSID( - /* [in] */ REFCLSID SpaceCLSID, - /* [retval][out] */ ITuningSpaces **NewColl) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE TuningSpacesForName( - /* [in] */ BSTR Name, - /* [retval][out] */ ITuningSpaces **NewColl) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE FindID( - /* [in] */ ITuningSpace *TuningSpace, - /* [retval][out] */ long *ID) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( - /* [in] */ ITuningSpace *TuningSpace, - /* [retval][out] */ VARIANT *NewIndex) = 0; - - virtual /* [helpstring][restricted][hidden][propget] */ HRESULT STDMETHODCALLTYPE get_EnumTuningSpaces( - /* [retval][out] */ IEnumTuningSpaces **ppEnum) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( - /* [in] */ VARIANT Index) = 0; - - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_MaxCount( - /* [retval][out] */ long *MaxCount) = 0; - - virtual /* [helpstring][restricted][hidden][propput] */ HRESULT STDMETHODCALLTYPE put_MaxCount( - /* [in] */ long MaxCount) = 0; - - }; - - #else /* C style interface */ - - typedef struct ITuningSpaceContainerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ITuningSpaceContainer * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ITuningSpaceContainer * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ITuningSpaceContainer * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - ITuningSpaceContainer * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - ITuningSpaceContainer * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - ITuningSpaceContainer * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - ITuningSpaceContainer * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( - ITuningSpaceContainer * This, - /* [retval][out] */ long *Count); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( - ITuningSpaceContainer * This, - /* [retval][out] */ IEnumVARIANT **NewEnum); - - /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Item )( - ITuningSpaceContainer * This, - /* [in] */ VARIANT varIndex, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_Item )( - ITuningSpaceContainer * This, - /* [in] */ VARIANT varIndex, - /* [in] */ ITuningSpace *TuningSpace); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *TuningSpacesForCLSID )( - ITuningSpaceContainer * This, - /* [in] */ BSTR SpaceCLSID, - /* [retval][out] */ ITuningSpaces **NewColl); - - /* [helpstring][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *_TuningSpacesForCLSID )( - ITuningSpaceContainer * This, - /* [in] */ REFCLSID SpaceCLSID, - /* [retval][out] */ ITuningSpaces **NewColl); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *TuningSpacesForName )( - ITuningSpaceContainer * This, - /* [in] */ BSTR Name, - /* [retval][out] */ ITuningSpaces **NewColl); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *FindID )( - ITuningSpaceContainer * This, - /* [in] */ ITuningSpace *TuningSpace, - /* [retval][out] */ long *ID); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( - ITuningSpaceContainer * This, - /* [in] */ ITuningSpace *TuningSpace, - /* [retval][out] */ VARIANT *NewIndex); - - /* [helpstring][restricted][hidden][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnumTuningSpaces )( - ITuningSpaceContainer * This, - /* [retval][out] */ IEnumTuningSpaces **ppEnum); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( - ITuningSpaceContainer * This, - /* [in] */ VARIANT Index); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxCount )( - ITuningSpaceContainer * This, - /* [retval][out] */ long *MaxCount); - - /* [helpstring][restricted][hidden][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MaxCount )( - ITuningSpaceContainer * This, - /* [in] */ long MaxCount); - - END_INTERFACE - } ITuningSpaceContainerVtbl; - - interface ITuningSpaceContainer - { - CONST_VTBL struct ITuningSpaceContainerVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define ITuningSpaceContainer_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define ITuningSpaceContainer_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define ITuningSpaceContainer_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define ITuningSpaceContainer_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define ITuningSpaceContainer_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define ITuningSpaceContainer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define ITuningSpaceContainer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define ITuningSpaceContainer_get_Count(This,Count) \ - (This)->lpVtbl -> get_Count(This,Count) - - #define ITuningSpaceContainer_get__NewEnum(This,NewEnum) \ - (This)->lpVtbl -> get__NewEnum(This,NewEnum) - - #define ITuningSpaceContainer_get_Item(This,varIndex,TuningSpace) \ - (This)->lpVtbl -> get_Item(This,varIndex,TuningSpace) - - #define ITuningSpaceContainer_put_Item(This,varIndex,TuningSpace) \ - (This)->lpVtbl -> put_Item(This,varIndex,TuningSpace) - - #define ITuningSpaceContainer_TuningSpacesForCLSID(This,SpaceCLSID,NewColl) \ - (This)->lpVtbl -> TuningSpacesForCLSID(This,SpaceCLSID,NewColl) - - #define ITuningSpaceContainer__TuningSpacesForCLSID(This,SpaceCLSID,NewColl) \ - (This)->lpVtbl -> _TuningSpacesForCLSID(This,SpaceCLSID,NewColl) - - #define ITuningSpaceContainer_TuningSpacesForName(This,Name,NewColl) \ - (This)->lpVtbl -> TuningSpacesForName(This,Name,NewColl) - - #define ITuningSpaceContainer_FindID(This,TuningSpace,ID) \ - (This)->lpVtbl -> FindID(This,TuningSpace,ID) - - #define ITuningSpaceContainer_Add(This,TuningSpace,NewIndex) \ - (This)->lpVtbl -> Add(This,TuningSpace,NewIndex) - - #define ITuningSpaceContainer_get_EnumTuningSpaces(This,ppEnum) \ - (This)->lpVtbl -> get_EnumTuningSpaces(This,ppEnum) - - #define ITuningSpaceContainer_Remove(This,Index) \ - (This)->lpVtbl -> Remove(This,Index) - - #define ITuningSpaceContainer_get_MaxCount(This,MaxCount) \ - (This)->lpVtbl -> get_MaxCount(This,MaxCount) - - #define ITuningSpaceContainer_put_MaxCount(This,MaxCount) \ - (This)->lpVtbl -> put_MaxCount(This,MaxCount) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_get_Count_Proxy( - ITuningSpaceContainer * This, - /* [retval][out] */ long *Count); - - - void __RPC_STUB ITuningSpaceContainer_get_Count_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_get__NewEnum_Proxy( - ITuningSpaceContainer * This, - /* [retval][out] */ IEnumVARIANT **NewEnum); - - - void __RPC_STUB ITuningSpaceContainer_get__NewEnum_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_get_Item_Proxy( - ITuningSpaceContainer * This, - /* [in] */ VARIANT varIndex, - /* [retval][out] */ ITuningSpace **TuningSpace); - - - void __RPC_STUB ITuningSpaceContainer_get_Item_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_put_Item_Proxy( - ITuningSpaceContainer * This, - /* [in] */ VARIANT varIndex, - /* [in] */ ITuningSpace *TuningSpace); - - - void __RPC_STUB ITuningSpaceContainer_put_Item_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_TuningSpacesForCLSID_Proxy( - ITuningSpaceContainer * This, - /* [in] */ BSTR SpaceCLSID, - /* [retval][out] */ ITuningSpaces **NewColl); - - - void __RPC_STUB ITuningSpaceContainer_TuningSpacesForCLSID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][restricted][hidden] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer__TuningSpacesForCLSID_Proxy( - ITuningSpaceContainer * This, - /* [in] */ REFCLSID SpaceCLSID, - /* [retval][out] */ ITuningSpaces **NewColl); - - - void __RPC_STUB ITuningSpaceContainer__TuningSpacesForCLSID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_TuningSpacesForName_Proxy( - ITuningSpaceContainer * This, - /* [in] */ BSTR Name, - /* [retval][out] */ ITuningSpaces **NewColl); - - - void __RPC_STUB ITuningSpaceContainer_TuningSpacesForName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_FindID_Proxy( - ITuningSpaceContainer * This, - /* [in] */ ITuningSpace *TuningSpace, - /* [retval][out] */ long *ID); - - - void __RPC_STUB ITuningSpaceContainer_FindID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_Add_Proxy( - ITuningSpaceContainer * This, - /* [in] */ ITuningSpace *TuningSpace, - /* [retval][out] */ VARIANT *NewIndex); - - - void __RPC_STUB ITuningSpaceContainer_Add_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][restricted][hidden][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_get_EnumTuningSpaces_Proxy( - ITuningSpaceContainer * This, - /* [retval][out] */ IEnumTuningSpaces **ppEnum); - - - void __RPC_STUB ITuningSpaceContainer_get_EnumTuningSpaces_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_Remove_Proxy( - ITuningSpaceContainer * This, - /* [in] */ VARIANT Index); - - - void __RPC_STUB ITuningSpaceContainer_Remove_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_get_MaxCount_Proxy( - ITuningSpaceContainer * This, - /* [retval][out] */ long *MaxCount); - - - void __RPC_STUB ITuningSpaceContainer_get_MaxCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][restricted][hidden][propput] */ HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_put_MaxCount_Proxy( - ITuningSpaceContainer * This, - /* [in] */ long MaxCount); - - - void __RPC_STUB ITuningSpaceContainer_put_MaxCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __ITuningSpaceContainer_INTERFACE_DEFINED__ */ - - - #ifndef __ITuningSpace_INTERFACE_DEFINED__ - #define __ITuningSpace_INTERFACE_DEFINED__ - - /* interface ITuningSpace */ - /* [unique][helpstring][nonextensible][oleautomation][dual][uuid][object] */ - - - EXTERN_C const IID IID_ITuningSpace; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("061C6E30-E622-11d2-9493-00C04F72D980") - ITuningSpace : public IDispatch - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_UniqueName( - /* [retval][out] */ BSTR *Name) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_UniqueName( - /* [in] */ BSTR Name) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_FriendlyName( - /* [retval][out] */ BSTR *Name) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_FriendlyName( - /* [in] */ BSTR Name) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CLSID( - /* [retval][out] */ BSTR *SpaceCLSID) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_NetworkType( - /* [retval][out] */ BSTR *NetworkTypeGuid) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_NetworkType( - /* [in] */ BSTR NetworkTypeGuid) = 0; - - virtual /* [restricted][hidden][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NetworkType( - /* [retval][out] */ GUID *NetworkTypeGuid) = 0; - - virtual /* [restricted][hidden][helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put__NetworkType( - /* [in] */ REFCLSID NetworkTypeGuid) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CreateTuneRequest( - /* [retval][out] */ ITuneRequest **TuneRequest) = 0; - - virtual /* [restricted][hidden][id] */ HRESULT STDMETHODCALLTYPE EnumCategoryGUIDs( - /* [retval][out] */ IEnumGUID **ppEnum) = 0; - - virtual /* [restricted][hidden][id] */ HRESULT STDMETHODCALLTYPE EnumDeviceMonikers( - /* [retval][out] */ IEnumMoniker **ppEnum) = 0; - - virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_DefaultPreferredComponentTypes( - /* [retval][out] */ IComponentTypes **ComponentTypes) = 0; - - virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_DefaultPreferredComponentTypes( - /* [in] */ IComponentTypes *NewComponentTypes) = 0; - - virtual /* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE get_FrequencyMapping( - /* [retval][out] */ BSTR *pMapping) = 0; - - virtual /* [restricted][hidden][id][propput] */ HRESULT STDMETHODCALLTYPE put_FrequencyMapping( - BSTR Mapping) = 0; - - virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_DefaultLocator( - /* [retval][out] */ ILocator **LocatorVal) = 0; - - virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_DefaultLocator( - /* [in] */ ILocator *LocatorVal) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - /* [retval][out] */ ITuningSpace **NewTS) = 0; - - }; - - #else /* C style interface */ - - typedef struct ITuningSpaceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ITuningSpace * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ITuningSpace * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ITuningSpace * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - ITuningSpace * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - ITuningSpace * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - ITuningSpace * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - ITuningSpace * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueName )( - ITuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_UniqueName )( - ITuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( - ITuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( - ITuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CLSID )( - ITuningSpace * This, - /* [retval][out] */ BSTR *SpaceCLSID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_NetworkType )( - ITuningSpace * This, - /* [retval][out] */ BSTR *NetworkTypeGuid); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_NetworkType )( - ITuningSpace * This, - /* [in] */ BSTR NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NetworkType )( - ITuningSpace * This, - /* [retval][out] */ GUID *NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__NetworkType )( - ITuningSpace * This, - /* [in] */ REFCLSID NetworkTypeGuid); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CreateTuneRequest )( - ITuningSpace * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumCategoryGUIDs )( - ITuningSpace * This, - /* [retval][out] */ IEnumGUID **ppEnum); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumDeviceMonikers )( - ITuningSpace * This, - /* [retval][out] */ IEnumMoniker **ppEnum); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes )( - ITuningSpace * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes )( - ITuningSpace * This, - /* [in] */ IComponentTypes *NewComponentTypes); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FrequencyMapping )( - ITuningSpace * This, - /* [retval][out] */ BSTR *pMapping); - - /* [restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FrequencyMapping )( - ITuningSpace * This, - BSTR Mapping); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultLocator )( - ITuningSpace * This, - /* [retval][out] */ ILocator **LocatorVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultLocator )( - ITuningSpace * This, - /* [in] */ ILocator *LocatorVal); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - ITuningSpace * This, - /* [retval][out] */ ITuningSpace **NewTS); - - END_INTERFACE - } ITuningSpaceVtbl; - - interface ITuningSpace - { - CONST_VTBL struct ITuningSpaceVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define ITuningSpace_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define ITuningSpace_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define ITuningSpace_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define ITuningSpace_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define ITuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define ITuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define ITuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define ITuningSpace_get_UniqueName(This,Name) \ - (This)->lpVtbl -> get_UniqueName(This,Name) - - #define ITuningSpace_put_UniqueName(This,Name) \ - (This)->lpVtbl -> put_UniqueName(This,Name) - - #define ITuningSpace_get_FriendlyName(This,Name) \ - (This)->lpVtbl -> get_FriendlyName(This,Name) - - #define ITuningSpace_put_FriendlyName(This,Name) \ - (This)->lpVtbl -> put_FriendlyName(This,Name) - - #define ITuningSpace_get_CLSID(This,SpaceCLSID) \ - (This)->lpVtbl -> get_CLSID(This,SpaceCLSID) - - #define ITuningSpace_get_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get_NetworkType(This,NetworkTypeGuid) - - #define ITuningSpace_put_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put_NetworkType(This,NetworkTypeGuid) - - #define ITuningSpace_get__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get__NetworkType(This,NetworkTypeGuid) - - #define ITuningSpace_put__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put__NetworkType(This,NetworkTypeGuid) - - #define ITuningSpace_CreateTuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> CreateTuneRequest(This,TuneRequest) - - #define ITuningSpace_EnumCategoryGUIDs(This,ppEnum) \ - (This)->lpVtbl -> EnumCategoryGUIDs(This,ppEnum) - - #define ITuningSpace_EnumDeviceMonikers(This,ppEnum) \ - (This)->lpVtbl -> EnumDeviceMonikers(This,ppEnum) - - #define ITuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> get_DefaultPreferredComponentTypes(This,ComponentTypes) - - #define ITuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) \ - (This)->lpVtbl -> put_DefaultPreferredComponentTypes(This,NewComponentTypes) - - #define ITuningSpace_get_FrequencyMapping(This,pMapping) \ - (This)->lpVtbl -> get_FrequencyMapping(This,pMapping) - - #define ITuningSpace_put_FrequencyMapping(This,Mapping) \ - (This)->lpVtbl -> put_FrequencyMapping(This,Mapping) - - #define ITuningSpace_get_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> get_DefaultLocator(This,LocatorVal) - - #define ITuningSpace_put_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> put_DefaultLocator(This,LocatorVal) - - #define ITuningSpace_Clone(This,NewTS) \ - (This)->lpVtbl -> Clone(This,NewTS) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpace_get_UniqueName_Proxy( - ITuningSpace * This, - /* [retval][out] */ BSTR *Name); - - - void __RPC_STUB ITuningSpace_get_UniqueName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ITuningSpace_put_UniqueName_Proxy( - ITuningSpace * This, - /* [in] */ BSTR Name); - - - void __RPC_STUB ITuningSpace_put_UniqueName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpace_get_FriendlyName_Proxy( - ITuningSpace * This, - /* [retval][out] */ BSTR *Name); - - - void __RPC_STUB ITuningSpace_get_FriendlyName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ITuningSpace_put_FriendlyName_Proxy( - ITuningSpace * This, - /* [in] */ BSTR Name); - - - void __RPC_STUB ITuningSpace_put_FriendlyName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpace_get_CLSID_Proxy( - ITuningSpace * This, - /* [retval][out] */ BSTR *SpaceCLSID); - - - void __RPC_STUB ITuningSpace_get_CLSID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpace_get_NetworkType_Proxy( - ITuningSpace * This, - /* [retval][out] */ BSTR *NetworkTypeGuid); - - - void __RPC_STUB ITuningSpace_get_NetworkType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ITuningSpace_put_NetworkType_Proxy( - ITuningSpace * This, - /* [in] */ BSTR NetworkTypeGuid); - - - void __RPC_STUB ITuningSpace_put_NetworkType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpace_get__NetworkType_Proxy( - ITuningSpace * This, - /* [retval][out] */ GUID *NetworkTypeGuid); - - - void __RPC_STUB ITuningSpace_get__NetworkType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ITuningSpace_put__NetworkType_Proxy( - ITuningSpace * This, - /* [in] */ REFCLSID NetworkTypeGuid); - - - void __RPC_STUB ITuningSpace_put__NetworkType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ITuningSpace_CreateTuneRequest_Proxy( - ITuningSpace * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - - void __RPC_STUB ITuningSpace_CreateTuneRequest_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [restricted][hidden][id] */ HRESULT STDMETHODCALLTYPE ITuningSpace_EnumCategoryGUIDs_Proxy( - ITuningSpace * This, - /* [retval][out] */ IEnumGUID **ppEnum); - - - void __RPC_STUB ITuningSpace_EnumCategoryGUIDs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [restricted][hidden][id] */ HRESULT STDMETHODCALLTYPE ITuningSpace_EnumDeviceMonikers_Proxy( - ITuningSpace * This, - /* [retval][out] */ IEnumMoniker **ppEnum); - - - void __RPC_STUB ITuningSpace_EnumDeviceMonikers_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpace_get_DefaultPreferredComponentTypes_Proxy( - ITuningSpace * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - - void __RPC_STUB ITuningSpace_get_DefaultPreferredComponentTypes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [id][propput] */ HRESULT STDMETHODCALLTYPE ITuningSpace_put_DefaultPreferredComponentTypes_Proxy( - ITuningSpace * This, - /* [in] */ IComponentTypes *NewComponentTypes); - - - void __RPC_STUB ITuningSpace_put_DefaultPreferredComponentTypes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpace_get_FrequencyMapping_Proxy( - ITuningSpace * This, - /* [retval][out] */ BSTR *pMapping); - - - void __RPC_STUB ITuningSpace_get_FrequencyMapping_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [restricted][hidden][id][propput] */ HRESULT STDMETHODCALLTYPE ITuningSpace_put_FrequencyMapping_Proxy( - ITuningSpace * This, - BSTR Mapping); - - - void __RPC_STUB ITuningSpace_put_FrequencyMapping_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [id][propget] */ HRESULT STDMETHODCALLTYPE ITuningSpace_get_DefaultLocator_Proxy( - ITuningSpace * This, - /* [retval][out] */ ILocator **LocatorVal); - - - void __RPC_STUB ITuningSpace_get_DefaultLocator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [id][propput] */ HRESULT STDMETHODCALLTYPE ITuningSpace_put_DefaultLocator_Proxy( - ITuningSpace * This, - /* [in] */ ILocator *LocatorVal); - - - void __RPC_STUB ITuningSpace_put_DefaultLocator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE ITuningSpace_Clone_Proxy( - ITuningSpace * This, - /* [retval][out] */ ITuningSpace **NewTS); - - - void __RPC_STUB ITuningSpace_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __ITuningSpace_INTERFACE_DEFINED__ */ - - - #ifndef __IEnumTuningSpaces_INTERFACE_DEFINED__ - #define __IEnumTuningSpaces_INTERFACE_DEFINED__ - - /* interface IEnumTuningSpaces */ - /* [unique][uuid][object][restricted][hidden] */ - - - EXTERN_C const IID IID_IEnumTuningSpaces; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("8B8EB248-FC2B-11d2-9D8C-00C04F72D980") - IEnumTuningSpaces : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Next( - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ ITuningSpace **rgelt, - /* [out] */ ULONG *pceltFetched) = 0; - - virtual HRESULT STDMETHODCALLTYPE Skip( - /* [in] */ ULONG celt) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - /* [out] */ IEnumTuningSpaces **ppEnum) = 0; - - }; - - #else /* C style interface */ - - typedef struct IEnumTuningSpacesVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IEnumTuningSpaces * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IEnumTuningSpaces * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IEnumTuningSpaces * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - IEnumTuningSpaces * This, - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ ITuningSpace **rgelt, - /* [out] */ ULONG *pceltFetched); - - HRESULT ( STDMETHODCALLTYPE *Skip )( - IEnumTuningSpaces * This, - /* [in] */ ULONG celt); - - HRESULT ( STDMETHODCALLTYPE *Reset )( - IEnumTuningSpaces * This); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IEnumTuningSpaces * This, - /* [out] */ IEnumTuningSpaces **ppEnum); - - END_INTERFACE - } IEnumTuningSpacesVtbl; - - interface IEnumTuningSpaces - { - CONST_VTBL struct IEnumTuningSpacesVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IEnumTuningSpaces_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IEnumTuningSpaces_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IEnumTuningSpaces_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IEnumTuningSpaces_Next(This,celt,rgelt,pceltFetched) \ - (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) - - #define IEnumTuningSpaces_Skip(This,celt) \ - (This)->lpVtbl -> Skip(This,celt) - - #define IEnumTuningSpaces_Reset(This) \ - (This)->lpVtbl -> Reset(This) - - #define IEnumTuningSpaces_Clone(This,ppEnum) \ - (This)->lpVtbl -> Clone(This,ppEnum) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - HRESULT STDMETHODCALLTYPE IEnumTuningSpaces_Next_Proxy( - IEnumTuningSpaces * This, - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ ITuningSpace **rgelt, - /* [out] */ ULONG *pceltFetched); - - - void __RPC_STUB IEnumTuningSpaces_Next_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IEnumTuningSpaces_Skip_Proxy( - IEnumTuningSpaces * This, - /* [in] */ ULONG celt); - - - void __RPC_STUB IEnumTuningSpaces_Skip_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IEnumTuningSpaces_Reset_Proxy( - IEnumTuningSpaces * This); - - - void __RPC_STUB IEnumTuningSpaces_Reset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IEnumTuningSpaces_Clone_Proxy( - IEnumTuningSpaces * This, - /* [out] */ IEnumTuningSpaces **ppEnum); - - - void __RPC_STUB IEnumTuningSpaces_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IEnumTuningSpaces_INTERFACE_DEFINED__ */ - - - #ifndef __IDVBTuningSpace_INTERFACE_DEFINED__ - #define __IDVBTuningSpace_INTERFACE_DEFINED__ - - /* interface IDVBTuningSpace */ - /* [unique][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_IDVBTuningSpace; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("ADA0B268-3B19-4e5b-ACC4-49F852BE13BA") - IDVBTuningSpace : public ITuningSpace - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SystemType( - /* [retval][out] */ DVBSystemType *SysType) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SystemType( - /* [in] */ DVBSystemType SysType) = 0; - - }; - - #else /* C style interface */ - - typedef struct IDVBTuningSpaceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDVBTuningSpace * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDVBTuningSpace * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDVBTuningSpace * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDVBTuningSpace * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDVBTuningSpace * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDVBTuningSpace * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDVBTuningSpace * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueName )( - IDVBTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_UniqueName )( - IDVBTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( - IDVBTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( - IDVBTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CLSID )( - IDVBTuningSpace * This, - /* [retval][out] */ BSTR *SpaceCLSID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_NetworkType )( - IDVBTuningSpace * This, - /* [retval][out] */ BSTR *NetworkTypeGuid); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_NetworkType )( - IDVBTuningSpace * This, - /* [in] */ BSTR NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NetworkType )( - IDVBTuningSpace * This, - /* [retval][out] */ GUID *NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__NetworkType )( - IDVBTuningSpace * This, - /* [in] */ REFCLSID NetworkTypeGuid); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CreateTuneRequest )( - IDVBTuningSpace * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumCategoryGUIDs )( - IDVBTuningSpace * This, - /* [retval][out] */ IEnumGUID **ppEnum); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumDeviceMonikers )( - IDVBTuningSpace * This, - /* [retval][out] */ IEnumMoniker **ppEnum); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes )( - IDVBTuningSpace * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes )( - IDVBTuningSpace * This, - /* [in] */ IComponentTypes *NewComponentTypes); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FrequencyMapping )( - IDVBTuningSpace * This, - /* [retval][out] */ BSTR *pMapping); - - /* [restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FrequencyMapping )( - IDVBTuningSpace * This, - BSTR Mapping); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultLocator )( - IDVBTuningSpace * This, - /* [retval][out] */ ILocator **LocatorVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultLocator )( - IDVBTuningSpace * This, - /* [in] */ ILocator *LocatorVal); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IDVBTuningSpace * This, - /* [retval][out] */ ITuningSpace **NewTS); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SystemType )( - IDVBTuningSpace * This, - /* [retval][out] */ DVBSystemType *SysType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SystemType )( - IDVBTuningSpace * This, - /* [in] */ DVBSystemType SysType); - - END_INTERFACE - } IDVBTuningSpaceVtbl; - - interface IDVBTuningSpace - { - CONST_VTBL struct IDVBTuningSpaceVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IDVBTuningSpace_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IDVBTuningSpace_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IDVBTuningSpace_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IDVBTuningSpace_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IDVBTuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IDVBTuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IDVBTuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IDVBTuningSpace_get_UniqueName(This,Name) \ - (This)->lpVtbl -> get_UniqueName(This,Name) - - #define IDVBTuningSpace_put_UniqueName(This,Name) \ - (This)->lpVtbl -> put_UniqueName(This,Name) - - #define IDVBTuningSpace_get_FriendlyName(This,Name) \ - (This)->lpVtbl -> get_FriendlyName(This,Name) - - #define IDVBTuningSpace_put_FriendlyName(This,Name) \ - (This)->lpVtbl -> put_FriendlyName(This,Name) - - #define IDVBTuningSpace_get_CLSID(This,SpaceCLSID) \ - (This)->lpVtbl -> get_CLSID(This,SpaceCLSID) - - #define IDVBTuningSpace_get_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get_NetworkType(This,NetworkTypeGuid) - - #define IDVBTuningSpace_put_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put_NetworkType(This,NetworkTypeGuid) - - #define IDVBTuningSpace_get__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get__NetworkType(This,NetworkTypeGuid) - - #define IDVBTuningSpace_put__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put__NetworkType(This,NetworkTypeGuid) - - #define IDVBTuningSpace_CreateTuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> CreateTuneRequest(This,TuneRequest) - - #define IDVBTuningSpace_EnumCategoryGUIDs(This,ppEnum) \ - (This)->lpVtbl -> EnumCategoryGUIDs(This,ppEnum) - - #define IDVBTuningSpace_EnumDeviceMonikers(This,ppEnum) \ - (This)->lpVtbl -> EnumDeviceMonikers(This,ppEnum) - - #define IDVBTuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> get_DefaultPreferredComponentTypes(This,ComponentTypes) - - #define IDVBTuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) \ - (This)->lpVtbl -> put_DefaultPreferredComponentTypes(This,NewComponentTypes) - - #define IDVBTuningSpace_get_FrequencyMapping(This,pMapping) \ - (This)->lpVtbl -> get_FrequencyMapping(This,pMapping) - - #define IDVBTuningSpace_put_FrequencyMapping(This,Mapping) \ - (This)->lpVtbl -> put_FrequencyMapping(This,Mapping) - - #define IDVBTuningSpace_get_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> get_DefaultLocator(This,LocatorVal) - - #define IDVBTuningSpace_put_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> put_DefaultLocator(This,LocatorVal) - - #define IDVBTuningSpace_Clone(This,NewTS) \ - (This)->lpVtbl -> Clone(This,NewTS) - - - #define IDVBTuningSpace_get_SystemType(This,SysType) \ - (This)->lpVtbl -> get_SystemType(This,SysType) - - #define IDVBTuningSpace_put_SystemType(This,SysType) \ - (This)->lpVtbl -> put_SystemType(This,SysType) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTuningSpace_get_SystemType_Proxy( - IDVBTuningSpace * This, - /* [retval][out] */ DVBSystemType *SysType); - - - void __RPC_STUB IDVBTuningSpace_get_SystemType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTuningSpace_put_SystemType_Proxy( - IDVBTuningSpace * This, - /* [in] */ DVBSystemType SysType); - - - void __RPC_STUB IDVBTuningSpace_put_SystemType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IDVBTuningSpace_INTERFACE_DEFINED__ */ - - - #ifndef __IAnalogTVTuningSpace_INTERFACE_DEFINED__ - #define __IAnalogTVTuningSpace_INTERFACE_DEFINED__ - - /* interface IAnalogTVTuningSpace */ - /* [unique][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_IAnalogTVTuningSpace; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("2A6E293C-2595-11d3-B64C-00C04F79498E") - IAnalogTVTuningSpace : public ITuningSpace - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MinChannel( - /* [retval][out] */ long *MinChannelVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MinChannel( - /* [in] */ long NewMinChannelVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MaxChannel( - /* [retval][out] */ long *MaxChannelVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MaxChannel( - /* [in] */ long NewMaxChannelVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_InputType( - /* [retval][out] */ TunerInputType *InputTypeVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_InputType( - /* [in] */ TunerInputType NewInputTypeVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CountryCode( - /* [retval][out] */ long *CountryCodeVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_CountryCode( - /* [in] */ long NewCountryCodeVal) = 0; - - }; - - #else /* C style interface */ - - typedef struct IAnalogTVTuningSpaceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAnalogTVTuningSpace * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAnalogTVTuningSpace * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAnalogTVTuningSpace * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IAnalogTVTuningSpace * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IAnalogTVTuningSpace * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IAnalogTVTuningSpace * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IAnalogTVTuningSpace * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueName )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_UniqueName )( - IAnalogTVTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( - IAnalogTVTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CLSID )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ BSTR *SpaceCLSID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_NetworkType )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ BSTR *NetworkTypeGuid); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_NetworkType )( - IAnalogTVTuningSpace * This, - /* [in] */ BSTR NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NetworkType )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ GUID *NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__NetworkType )( - IAnalogTVTuningSpace * This, - /* [in] */ REFCLSID NetworkTypeGuid); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CreateTuneRequest )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumCategoryGUIDs )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ IEnumGUID **ppEnum); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumDeviceMonikers )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ IEnumMoniker **ppEnum); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes )( - IAnalogTVTuningSpace * This, - /* [in] */ IComponentTypes *NewComponentTypes); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FrequencyMapping )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ BSTR *pMapping); - - /* [restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FrequencyMapping )( - IAnalogTVTuningSpace * This, - BSTR Mapping); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultLocator )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ ILocator **LocatorVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultLocator )( - IAnalogTVTuningSpace * This, - /* [in] */ ILocator *LocatorVal); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ ITuningSpace **NewTS); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinChannel )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ long *MinChannelVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MinChannel )( - IAnalogTVTuningSpace * This, - /* [in] */ long NewMinChannelVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxChannel )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ long *MaxChannelVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MaxChannel )( - IAnalogTVTuningSpace * This, - /* [in] */ long NewMaxChannelVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InputType )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ TunerInputType *InputTypeVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InputType )( - IAnalogTVTuningSpace * This, - /* [in] */ TunerInputType NewInputTypeVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CountryCode )( - IAnalogTVTuningSpace * This, - /* [retval][out] */ long *CountryCodeVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CountryCode )( - IAnalogTVTuningSpace * This, - /* [in] */ long NewCountryCodeVal); - - END_INTERFACE - } IAnalogTVTuningSpaceVtbl; - - interface IAnalogTVTuningSpace - { - CONST_VTBL struct IAnalogTVTuningSpaceVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IAnalogTVTuningSpace_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IAnalogTVTuningSpace_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IAnalogTVTuningSpace_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IAnalogTVTuningSpace_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IAnalogTVTuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IAnalogTVTuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IAnalogTVTuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IAnalogTVTuningSpace_get_UniqueName(This,Name) \ - (This)->lpVtbl -> get_UniqueName(This,Name) - - #define IAnalogTVTuningSpace_put_UniqueName(This,Name) \ - (This)->lpVtbl -> put_UniqueName(This,Name) - - #define IAnalogTVTuningSpace_get_FriendlyName(This,Name) \ - (This)->lpVtbl -> get_FriendlyName(This,Name) - - #define IAnalogTVTuningSpace_put_FriendlyName(This,Name) \ - (This)->lpVtbl -> put_FriendlyName(This,Name) - - #define IAnalogTVTuningSpace_get_CLSID(This,SpaceCLSID) \ - (This)->lpVtbl -> get_CLSID(This,SpaceCLSID) - - #define IAnalogTVTuningSpace_get_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get_NetworkType(This,NetworkTypeGuid) - - #define IAnalogTVTuningSpace_put_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put_NetworkType(This,NetworkTypeGuid) - - #define IAnalogTVTuningSpace_get__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get__NetworkType(This,NetworkTypeGuid) - - #define IAnalogTVTuningSpace_put__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put__NetworkType(This,NetworkTypeGuid) - - #define IAnalogTVTuningSpace_CreateTuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> CreateTuneRequest(This,TuneRequest) - - #define IAnalogTVTuningSpace_EnumCategoryGUIDs(This,ppEnum) \ - (This)->lpVtbl -> EnumCategoryGUIDs(This,ppEnum) - - #define IAnalogTVTuningSpace_EnumDeviceMonikers(This,ppEnum) \ - (This)->lpVtbl -> EnumDeviceMonikers(This,ppEnum) - - #define IAnalogTVTuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> get_DefaultPreferredComponentTypes(This,ComponentTypes) - - #define IAnalogTVTuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) \ - (This)->lpVtbl -> put_DefaultPreferredComponentTypes(This,NewComponentTypes) - - #define IAnalogTVTuningSpace_get_FrequencyMapping(This,pMapping) \ - (This)->lpVtbl -> get_FrequencyMapping(This,pMapping) - - #define IAnalogTVTuningSpace_put_FrequencyMapping(This,Mapping) \ - (This)->lpVtbl -> put_FrequencyMapping(This,Mapping) - - #define IAnalogTVTuningSpace_get_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> get_DefaultLocator(This,LocatorVal) - - #define IAnalogTVTuningSpace_put_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> put_DefaultLocator(This,LocatorVal) - - #define IAnalogTVTuningSpace_Clone(This,NewTS) \ - (This)->lpVtbl -> Clone(This,NewTS) - - - #define IAnalogTVTuningSpace_get_MinChannel(This,MinChannelVal) \ - (This)->lpVtbl -> get_MinChannel(This,MinChannelVal) - - #define IAnalogTVTuningSpace_put_MinChannel(This,NewMinChannelVal) \ - (This)->lpVtbl -> put_MinChannel(This,NewMinChannelVal) - - #define IAnalogTVTuningSpace_get_MaxChannel(This,MaxChannelVal) \ - (This)->lpVtbl -> get_MaxChannel(This,MaxChannelVal) - - #define IAnalogTVTuningSpace_put_MaxChannel(This,NewMaxChannelVal) \ - (This)->lpVtbl -> put_MaxChannel(This,NewMaxChannelVal) - - #define IAnalogTVTuningSpace_get_InputType(This,InputTypeVal) \ - (This)->lpVtbl -> get_InputType(This,InputTypeVal) - - #define IAnalogTVTuningSpace_put_InputType(This,NewInputTypeVal) \ - (This)->lpVtbl -> put_InputType(This,NewInputTypeVal) - - #define IAnalogTVTuningSpace_get_CountryCode(This,CountryCodeVal) \ - (This)->lpVtbl -> get_CountryCode(This,CountryCodeVal) - - #define IAnalogTVTuningSpace_put_CountryCode(This,NewCountryCodeVal) \ - (This)->lpVtbl -> put_CountryCode(This,NewCountryCodeVal) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_get_MinChannel_Proxy( - IAnalogTVTuningSpace * This, - /* [retval][out] */ long *MinChannelVal); - - - void __RPC_STUB IAnalogTVTuningSpace_get_MinChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_put_MinChannel_Proxy( - IAnalogTVTuningSpace * This, - /* [in] */ long NewMinChannelVal); - - - void __RPC_STUB IAnalogTVTuningSpace_put_MinChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_get_MaxChannel_Proxy( - IAnalogTVTuningSpace * This, - /* [retval][out] */ long *MaxChannelVal); - - - void __RPC_STUB IAnalogTVTuningSpace_get_MaxChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_put_MaxChannel_Proxy( - IAnalogTVTuningSpace * This, - /* [in] */ long NewMaxChannelVal); - - - void __RPC_STUB IAnalogTVTuningSpace_put_MaxChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_get_InputType_Proxy( - IAnalogTVTuningSpace * This, - /* [retval][out] */ TunerInputType *InputTypeVal); - - - void __RPC_STUB IAnalogTVTuningSpace_get_InputType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_put_InputType_Proxy( - IAnalogTVTuningSpace * This, - /* [in] */ TunerInputType NewInputTypeVal); - - - void __RPC_STUB IAnalogTVTuningSpace_put_InputType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_get_CountryCode_Proxy( - IAnalogTVTuningSpace * This, - /* [retval][out] */ long *CountryCodeVal); - - - void __RPC_STUB IAnalogTVTuningSpace_get_CountryCode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_put_CountryCode_Proxy( - IAnalogTVTuningSpace * This, - /* [in] */ long NewCountryCodeVal); - - - void __RPC_STUB IAnalogTVTuningSpace_put_CountryCode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IAnalogTVTuningSpace_INTERFACE_DEFINED__ */ - - - #ifndef __IATSCTuningSpace_INTERFACE_DEFINED__ - #define __IATSCTuningSpace_INTERFACE_DEFINED__ - - /* interface IATSCTuningSpace */ - /* [unique][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_IATSCTuningSpace; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("0369B4E2-45B6-11d3-B650-00C04F79498E") - IATSCTuningSpace : public IAnalogTVTuningSpace - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MinMinorChannel( - /* [retval][out] */ long *MinMinorChannelVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MinMinorChannel( - /* [in] */ long NewMinMinorChannelVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MaxMinorChannel( - /* [retval][out] */ long *MaxMinorChannelVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MaxMinorChannel( - /* [in] */ long NewMaxMinorChannelVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MinPhysicalChannel( - /* [retval][out] */ long *MinPhysicalChannelVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MinPhysicalChannel( - /* [in] */ long NewMinPhysicalChannelVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MaxPhysicalChannel( - /* [retval][out] */ long *MaxPhysicalChannelVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MaxPhysicalChannel( - /* [in] */ long NewMaxPhysicalChannelVal) = 0; - - }; - - #else /* C style interface */ - - typedef struct IATSCTuningSpaceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IATSCTuningSpace * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IATSCTuningSpace * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IATSCTuningSpace * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IATSCTuningSpace * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IATSCTuningSpace * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IATSCTuningSpace * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IATSCTuningSpace * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueName )( - IATSCTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_UniqueName )( - IATSCTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( - IATSCTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( - IATSCTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CLSID )( - IATSCTuningSpace * This, - /* [retval][out] */ BSTR *SpaceCLSID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_NetworkType )( - IATSCTuningSpace * This, - /* [retval][out] */ BSTR *NetworkTypeGuid); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_NetworkType )( - IATSCTuningSpace * This, - /* [in] */ BSTR NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NetworkType )( - IATSCTuningSpace * This, - /* [retval][out] */ GUID *NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__NetworkType )( - IATSCTuningSpace * This, - /* [in] */ REFCLSID NetworkTypeGuid); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CreateTuneRequest )( - IATSCTuningSpace * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumCategoryGUIDs )( - IATSCTuningSpace * This, - /* [retval][out] */ IEnumGUID **ppEnum); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumDeviceMonikers )( - IATSCTuningSpace * This, - /* [retval][out] */ IEnumMoniker **ppEnum); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes )( - IATSCTuningSpace * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes )( - IATSCTuningSpace * This, - /* [in] */ IComponentTypes *NewComponentTypes); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FrequencyMapping )( - IATSCTuningSpace * This, - /* [retval][out] */ BSTR *pMapping); - - /* [restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FrequencyMapping )( - IATSCTuningSpace * This, - BSTR Mapping); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultLocator )( - IATSCTuningSpace * This, - /* [retval][out] */ ILocator **LocatorVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultLocator )( - IATSCTuningSpace * This, - /* [in] */ ILocator *LocatorVal); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IATSCTuningSpace * This, - /* [retval][out] */ ITuningSpace **NewTS); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinChannel )( - IATSCTuningSpace * This, - /* [retval][out] */ long *MinChannelVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MinChannel )( - IATSCTuningSpace * This, - /* [in] */ long NewMinChannelVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxChannel )( - IATSCTuningSpace * This, - /* [retval][out] */ long *MaxChannelVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MaxChannel )( - IATSCTuningSpace * This, - /* [in] */ long NewMaxChannelVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InputType )( - IATSCTuningSpace * This, - /* [retval][out] */ TunerInputType *InputTypeVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InputType )( - IATSCTuningSpace * This, - /* [in] */ TunerInputType NewInputTypeVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CountryCode )( - IATSCTuningSpace * This, - /* [retval][out] */ long *CountryCodeVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CountryCode )( - IATSCTuningSpace * This, - /* [in] */ long NewCountryCodeVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinMinorChannel )( - IATSCTuningSpace * This, - /* [retval][out] */ long *MinMinorChannelVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MinMinorChannel )( - IATSCTuningSpace * This, - /* [in] */ long NewMinMinorChannelVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxMinorChannel )( - IATSCTuningSpace * This, - /* [retval][out] */ long *MaxMinorChannelVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MaxMinorChannel )( - IATSCTuningSpace * This, - /* [in] */ long NewMaxMinorChannelVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinPhysicalChannel )( - IATSCTuningSpace * This, - /* [retval][out] */ long *MinPhysicalChannelVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MinPhysicalChannel )( - IATSCTuningSpace * This, - /* [in] */ long NewMinPhysicalChannelVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxPhysicalChannel )( - IATSCTuningSpace * This, - /* [retval][out] */ long *MaxPhysicalChannelVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MaxPhysicalChannel )( - IATSCTuningSpace * This, - /* [in] */ long NewMaxPhysicalChannelVal); - - END_INTERFACE - } IATSCTuningSpaceVtbl; - - interface IATSCTuningSpace - { - CONST_VTBL struct IATSCTuningSpaceVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IATSCTuningSpace_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IATSCTuningSpace_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IATSCTuningSpace_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IATSCTuningSpace_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IATSCTuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IATSCTuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IATSCTuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IATSCTuningSpace_get_UniqueName(This,Name) \ - (This)->lpVtbl -> get_UniqueName(This,Name) - - #define IATSCTuningSpace_put_UniqueName(This,Name) \ - (This)->lpVtbl -> put_UniqueName(This,Name) - - #define IATSCTuningSpace_get_FriendlyName(This,Name) \ - (This)->lpVtbl -> get_FriendlyName(This,Name) - - #define IATSCTuningSpace_put_FriendlyName(This,Name) \ - (This)->lpVtbl -> put_FriendlyName(This,Name) - - #define IATSCTuningSpace_get_CLSID(This,SpaceCLSID) \ - (This)->lpVtbl -> get_CLSID(This,SpaceCLSID) - - #define IATSCTuningSpace_get_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get_NetworkType(This,NetworkTypeGuid) - - #define IATSCTuningSpace_put_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put_NetworkType(This,NetworkTypeGuid) - - #define IATSCTuningSpace_get__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get__NetworkType(This,NetworkTypeGuid) - - #define IATSCTuningSpace_put__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put__NetworkType(This,NetworkTypeGuid) - - #define IATSCTuningSpace_CreateTuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> CreateTuneRequest(This,TuneRequest) - - #define IATSCTuningSpace_EnumCategoryGUIDs(This,ppEnum) \ - (This)->lpVtbl -> EnumCategoryGUIDs(This,ppEnum) - - #define IATSCTuningSpace_EnumDeviceMonikers(This,ppEnum) \ - (This)->lpVtbl -> EnumDeviceMonikers(This,ppEnum) - - #define IATSCTuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> get_DefaultPreferredComponentTypes(This,ComponentTypes) - - #define IATSCTuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) \ - (This)->lpVtbl -> put_DefaultPreferredComponentTypes(This,NewComponentTypes) - - #define IATSCTuningSpace_get_FrequencyMapping(This,pMapping) \ - (This)->lpVtbl -> get_FrequencyMapping(This,pMapping) - - #define IATSCTuningSpace_put_FrequencyMapping(This,Mapping) \ - (This)->lpVtbl -> put_FrequencyMapping(This,Mapping) - - #define IATSCTuningSpace_get_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> get_DefaultLocator(This,LocatorVal) - - #define IATSCTuningSpace_put_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> put_DefaultLocator(This,LocatorVal) - - #define IATSCTuningSpace_Clone(This,NewTS) \ - (This)->lpVtbl -> Clone(This,NewTS) - - - #define IATSCTuningSpace_get_MinChannel(This,MinChannelVal) \ - (This)->lpVtbl -> get_MinChannel(This,MinChannelVal) - - #define IATSCTuningSpace_put_MinChannel(This,NewMinChannelVal) \ - (This)->lpVtbl -> put_MinChannel(This,NewMinChannelVal) - - #define IATSCTuningSpace_get_MaxChannel(This,MaxChannelVal) \ - (This)->lpVtbl -> get_MaxChannel(This,MaxChannelVal) - - #define IATSCTuningSpace_put_MaxChannel(This,NewMaxChannelVal) \ - (This)->lpVtbl -> put_MaxChannel(This,NewMaxChannelVal) - - #define IATSCTuningSpace_get_InputType(This,InputTypeVal) \ - (This)->lpVtbl -> get_InputType(This,InputTypeVal) - - #define IATSCTuningSpace_put_InputType(This,NewInputTypeVal) \ - (This)->lpVtbl -> put_InputType(This,NewInputTypeVal) - - #define IATSCTuningSpace_get_CountryCode(This,CountryCodeVal) \ - (This)->lpVtbl -> get_CountryCode(This,CountryCodeVal) - - #define IATSCTuningSpace_put_CountryCode(This,NewCountryCodeVal) \ - (This)->lpVtbl -> put_CountryCode(This,NewCountryCodeVal) - - - #define IATSCTuningSpace_get_MinMinorChannel(This,MinMinorChannelVal) \ - (This)->lpVtbl -> get_MinMinorChannel(This,MinMinorChannelVal) - - #define IATSCTuningSpace_put_MinMinorChannel(This,NewMinMinorChannelVal) \ - (This)->lpVtbl -> put_MinMinorChannel(This,NewMinMinorChannelVal) - - #define IATSCTuningSpace_get_MaxMinorChannel(This,MaxMinorChannelVal) \ - (This)->lpVtbl -> get_MaxMinorChannel(This,MaxMinorChannelVal) - - #define IATSCTuningSpace_put_MaxMinorChannel(This,NewMaxMinorChannelVal) \ - (This)->lpVtbl -> put_MaxMinorChannel(This,NewMaxMinorChannelVal) - - #define IATSCTuningSpace_get_MinPhysicalChannel(This,MinPhysicalChannelVal) \ - (This)->lpVtbl -> get_MinPhysicalChannel(This,MinPhysicalChannelVal) - - #define IATSCTuningSpace_put_MinPhysicalChannel(This,NewMinPhysicalChannelVal) \ - (This)->lpVtbl -> put_MinPhysicalChannel(This,NewMinPhysicalChannelVal) - - #define IATSCTuningSpace_get_MaxPhysicalChannel(This,MaxPhysicalChannelVal) \ - (This)->lpVtbl -> get_MaxPhysicalChannel(This,MaxPhysicalChannelVal) - - #define IATSCTuningSpace_put_MaxPhysicalChannel(This,NewMaxPhysicalChannelVal) \ - (This)->lpVtbl -> put_MaxPhysicalChannel(This,NewMaxPhysicalChannelVal) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IATSCTuningSpace_get_MinMinorChannel_Proxy( - IATSCTuningSpace * This, - /* [retval][out] */ long *MinMinorChannelVal); - - - void __RPC_STUB IATSCTuningSpace_get_MinMinorChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IATSCTuningSpace_put_MinMinorChannel_Proxy( - IATSCTuningSpace * This, - /* [in] */ long NewMinMinorChannelVal); - - - void __RPC_STUB IATSCTuningSpace_put_MinMinorChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IATSCTuningSpace_get_MaxMinorChannel_Proxy( - IATSCTuningSpace * This, - /* [retval][out] */ long *MaxMinorChannelVal); - - - void __RPC_STUB IATSCTuningSpace_get_MaxMinorChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IATSCTuningSpace_put_MaxMinorChannel_Proxy( - IATSCTuningSpace * This, - /* [in] */ long NewMaxMinorChannelVal); - - - void __RPC_STUB IATSCTuningSpace_put_MaxMinorChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IATSCTuningSpace_get_MinPhysicalChannel_Proxy( - IATSCTuningSpace * This, - /* [retval][out] */ long *MinPhysicalChannelVal); - - - void __RPC_STUB IATSCTuningSpace_get_MinPhysicalChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IATSCTuningSpace_put_MinPhysicalChannel_Proxy( - IATSCTuningSpace * This, - /* [in] */ long NewMinPhysicalChannelVal); - - - void __RPC_STUB IATSCTuningSpace_put_MinPhysicalChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IATSCTuningSpace_get_MaxPhysicalChannel_Proxy( - IATSCTuningSpace * This, - /* [retval][out] */ long *MaxPhysicalChannelVal); - - - void __RPC_STUB IATSCTuningSpace_get_MaxPhysicalChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IATSCTuningSpace_put_MaxPhysicalChannel_Proxy( - IATSCTuningSpace * This, - /* [in] */ long NewMaxPhysicalChannelVal); - - - void __RPC_STUB IATSCTuningSpace_put_MaxPhysicalChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IATSCTuningSpace_INTERFACE_DEFINED__ */ - - - #ifndef __IAnalogRadioTuningSpace_INTERFACE_DEFINED__ - #define __IAnalogRadioTuningSpace_INTERFACE_DEFINED__ - - /* interface IAnalogRadioTuningSpace */ - /* [unique][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_IAnalogRadioTuningSpace; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("2A6E293B-2595-11d3-B64C-00C04F79498E") - IAnalogRadioTuningSpace : public ITuningSpace - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MinFrequency( - /* [retval][out] */ long *MinFrequencyVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MinFrequency( - /* [in] */ long NewMinFrequencyVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MaxFrequency( - /* [retval][out] */ long *MaxFrequencyVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MaxFrequency( - /* [in] */ long NewMaxFrequencyVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Step( - /* [retval][out] */ long *StepVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Step( - /* [in] */ long NewStepVal) = 0; - - }; - - #else /* C style interface */ - - typedef struct IAnalogRadioTuningSpaceVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAnalogRadioTuningSpace * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAnalogRadioTuningSpace * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAnalogRadioTuningSpace * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IAnalogRadioTuningSpace * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IAnalogRadioTuningSpace * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IAnalogRadioTuningSpace * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IAnalogRadioTuningSpace * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueName )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_UniqueName )( - IAnalogRadioTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ BSTR *Name); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( - IAnalogRadioTuningSpace * This, - /* [in] */ BSTR Name); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CLSID )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ BSTR *SpaceCLSID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_NetworkType )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ BSTR *NetworkTypeGuid); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_NetworkType )( - IAnalogRadioTuningSpace * This, - /* [in] */ BSTR NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NetworkType )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ GUID *NetworkTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__NetworkType )( - IAnalogRadioTuningSpace * This, - /* [in] */ REFCLSID NetworkTypeGuid); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CreateTuneRequest )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumCategoryGUIDs )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ IEnumGUID **ppEnum); - - /* [restricted][hidden][id] */ HRESULT ( STDMETHODCALLTYPE *EnumDeviceMonikers )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ IEnumMoniker **ppEnum); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes )( - IAnalogRadioTuningSpace * This, - /* [in] */ IComponentTypes *NewComponentTypes); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FrequencyMapping )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ BSTR *pMapping); - - /* [restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_FrequencyMapping )( - IAnalogRadioTuningSpace * This, - BSTR Mapping); - - /* [id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultLocator )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ ILocator **LocatorVal); - - /* [id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DefaultLocator )( - IAnalogRadioTuningSpace * This, - /* [in] */ ILocator *LocatorVal); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ ITuningSpace **NewTS); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinFrequency )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ long *MinFrequencyVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MinFrequency )( - IAnalogRadioTuningSpace * This, - /* [in] */ long NewMinFrequencyVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxFrequency )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ long *MaxFrequencyVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MaxFrequency )( - IAnalogRadioTuningSpace * This, - /* [in] */ long NewMaxFrequencyVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Step )( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ long *StepVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Step )( - IAnalogRadioTuningSpace * This, - /* [in] */ long NewStepVal); - - END_INTERFACE - } IAnalogRadioTuningSpaceVtbl; - - interface IAnalogRadioTuningSpace - { - CONST_VTBL struct IAnalogRadioTuningSpaceVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IAnalogRadioTuningSpace_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IAnalogRadioTuningSpace_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IAnalogRadioTuningSpace_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IAnalogRadioTuningSpace_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IAnalogRadioTuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IAnalogRadioTuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IAnalogRadioTuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IAnalogRadioTuningSpace_get_UniqueName(This,Name) \ - (This)->lpVtbl -> get_UniqueName(This,Name) - - #define IAnalogRadioTuningSpace_put_UniqueName(This,Name) \ - (This)->lpVtbl -> put_UniqueName(This,Name) - - #define IAnalogRadioTuningSpace_get_FriendlyName(This,Name) \ - (This)->lpVtbl -> get_FriendlyName(This,Name) - - #define IAnalogRadioTuningSpace_put_FriendlyName(This,Name) \ - (This)->lpVtbl -> put_FriendlyName(This,Name) - - #define IAnalogRadioTuningSpace_get_CLSID(This,SpaceCLSID) \ - (This)->lpVtbl -> get_CLSID(This,SpaceCLSID) - - #define IAnalogRadioTuningSpace_get_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get_NetworkType(This,NetworkTypeGuid) - - #define IAnalogRadioTuningSpace_put_NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put_NetworkType(This,NetworkTypeGuid) - - #define IAnalogRadioTuningSpace_get__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> get__NetworkType(This,NetworkTypeGuid) - - #define IAnalogRadioTuningSpace_put__NetworkType(This,NetworkTypeGuid) \ - (This)->lpVtbl -> put__NetworkType(This,NetworkTypeGuid) - - #define IAnalogRadioTuningSpace_CreateTuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> CreateTuneRequest(This,TuneRequest) - - #define IAnalogRadioTuningSpace_EnumCategoryGUIDs(This,ppEnum) \ - (This)->lpVtbl -> EnumCategoryGUIDs(This,ppEnum) - - #define IAnalogRadioTuningSpace_EnumDeviceMonikers(This,ppEnum) \ - (This)->lpVtbl -> EnumDeviceMonikers(This,ppEnum) - - #define IAnalogRadioTuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> get_DefaultPreferredComponentTypes(This,ComponentTypes) - - #define IAnalogRadioTuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) \ - (This)->lpVtbl -> put_DefaultPreferredComponentTypes(This,NewComponentTypes) - - #define IAnalogRadioTuningSpace_get_FrequencyMapping(This,pMapping) \ - (This)->lpVtbl -> get_FrequencyMapping(This,pMapping) - - #define IAnalogRadioTuningSpace_put_FrequencyMapping(This,Mapping) \ - (This)->lpVtbl -> put_FrequencyMapping(This,Mapping) - - #define IAnalogRadioTuningSpace_get_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> get_DefaultLocator(This,LocatorVal) - - #define IAnalogRadioTuningSpace_put_DefaultLocator(This,LocatorVal) \ - (This)->lpVtbl -> put_DefaultLocator(This,LocatorVal) - - #define IAnalogRadioTuningSpace_Clone(This,NewTS) \ - (This)->lpVtbl -> Clone(This,NewTS) - - - #define IAnalogRadioTuningSpace_get_MinFrequency(This,MinFrequencyVal) \ - (This)->lpVtbl -> get_MinFrequency(This,MinFrequencyVal) - - #define IAnalogRadioTuningSpace_put_MinFrequency(This,NewMinFrequencyVal) \ - (This)->lpVtbl -> put_MinFrequency(This,NewMinFrequencyVal) - - #define IAnalogRadioTuningSpace_get_MaxFrequency(This,MaxFrequencyVal) \ - (This)->lpVtbl -> get_MaxFrequency(This,MaxFrequencyVal) - - #define IAnalogRadioTuningSpace_put_MaxFrequency(This,NewMaxFrequencyVal) \ - (This)->lpVtbl -> put_MaxFrequency(This,NewMaxFrequencyVal) - - #define IAnalogRadioTuningSpace_get_Step(This,StepVal) \ - (This)->lpVtbl -> get_Step(This,StepVal) - - #define IAnalogRadioTuningSpace_put_Step(This,NewStepVal) \ - (This)->lpVtbl -> put_Step(This,NewStepVal) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_get_MinFrequency_Proxy( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ long *MinFrequencyVal); - - - void __RPC_STUB IAnalogRadioTuningSpace_get_MinFrequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_put_MinFrequency_Proxy( - IAnalogRadioTuningSpace * This, - /* [in] */ long NewMinFrequencyVal); - - - void __RPC_STUB IAnalogRadioTuningSpace_put_MinFrequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_get_MaxFrequency_Proxy( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ long *MaxFrequencyVal); - - - void __RPC_STUB IAnalogRadioTuningSpace_get_MaxFrequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_put_MaxFrequency_Proxy( - IAnalogRadioTuningSpace * This, - /* [in] */ long NewMaxFrequencyVal); - - - void __RPC_STUB IAnalogRadioTuningSpace_put_MaxFrequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_get_Step_Proxy( - IAnalogRadioTuningSpace * This, - /* [retval][out] */ long *StepVal); - - - void __RPC_STUB IAnalogRadioTuningSpace_get_Step_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_put_Step_Proxy( - IAnalogRadioTuningSpace * This, - /* [in] */ long NewStepVal); - - - void __RPC_STUB IAnalogRadioTuningSpace_put_Step_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IAnalogRadioTuningSpace_INTERFACE_DEFINED__ */ - - - #ifndef __ITuneRequest_INTERFACE_DEFINED__ - #define __ITuneRequest_INTERFACE_DEFINED__ - - /* interface ITuneRequest */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - - EXTERN_C const IID IID_ITuneRequest; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("07DDC146-FC3D-11d2-9D8C-00C04F72D980") - ITuneRequest : public IDispatch - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_TuningSpace( - /* [retval][out] */ ITuningSpace **TuningSpace) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Components( - /* [retval][out] */ IComponents **Components) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clone( - /* [retval][out] */ ITuneRequest **NewTuneRequest) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Locator( - /* [retval][out] */ ILocator **Locator) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Locator( - /* [in] */ ILocator *Locator) = 0; - - }; - - #else /* C style interface */ - - typedef struct ITuneRequestVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ITuneRequest * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ITuneRequest * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ITuneRequest * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - ITuneRequest * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - ITuneRequest * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - ITuneRequest * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - ITuneRequest * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuningSpace )( - ITuneRequest * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Components )( - ITuneRequest * This, - /* [retval][out] */ IComponents **Components); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - ITuneRequest * This, - /* [retval][out] */ ITuneRequest **NewTuneRequest); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Locator )( - ITuneRequest * This, - /* [retval][out] */ ILocator **Locator); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Locator )( - ITuneRequest * This, - /* [in] */ ILocator *Locator); - - END_INTERFACE - } ITuneRequestVtbl; - - interface ITuneRequest - { - CONST_VTBL struct ITuneRequestVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define ITuneRequest_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define ITuneRequest_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define ITuneRequest_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define ITuneRequest_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define ITuneRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define ITuneRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define ITuneRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define ITuneRequest_get_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> get_TuningSpace(This,TuningSpace) - - #define ITuneRequest_get_Components(This,Components) \ - (This)->lpVtbl -> get_Components(This,Components) - - #define ITuneRequest_Clone(This,NewTuneRequest) \ - (This)->lpVtbl -> Clone(This,NewTuneRequest) - - #define ITuneRequest_get_Locator(This,Locator) \ - (This)->lpVtbl -> get_Locator(This,Locator) - - #define ITuneRequest_put_Locator(This,Locator) \ - (This)->lpVtbl -> put_Locator(This,Locator) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ITuneRequest_get_TuningSpace_Proxy( - ITuneRequest * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - - void __RPC_STUB ITuneRequest_get_TuningSpace_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ITuneRequest_get_Components_Proxy( - ITuneRequest * This, - /* [retval][out] */ IComponents **Components); - - - void __RPC_STUB ITuneRequest_get_Components_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ITuneRequest_Clone_Proxy( - ITuneRequest * This, - /* [retval][out] */ ITuneRequest **NewTuneRequest); - - - void __RPC_STUB ITuneRequest_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ITuneRequest_get_Locator_Proxy( - ITuneRequest * This, - /* [retval][out] */ ILocator **Locator); - - - void __RPC_STUB ITuneRequest_get_Locator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ITuneRequest_put_Locator_Proxy( - ITuneRequest * This, - /* [in] */ ILocator *Locator); - - - void __RPC_STUB ITuneRequest_put_Locator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __ITuneRequest_INTERFACE_DEFINED__ */ - - - #ifndef __IChannelTuneRequest_INTERFACE_DEFINED__ - #define __IChannelTuneRequest_INTERFACE_DEFINED__ - - /* interface IChannelTuneRequest */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - - EXTERN_C const IID IID_IChannelTuneRequest; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("0369B4E0-45B6-11d3-B650-00C04F79498E") - IChannelTuneRequest : public ITuneRequest - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Channel( - /* [retval][out] */ long *Channel) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Channel( - /* [in] */ long Channel) = 0; - - }; - - #else /* C style interface */ - - typedef struct IChannelTuneRequestVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IChannelTuneRequest * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IChannelTuneRequest * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IChannelTuneRequest * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IChannelTuneRequest * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IChannelTuneRequest * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IChannelTuneRequest * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IChannelTuneRequest * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuningSpace )( - IChannelTuneRequest * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Components )( - IChannelTuneRequest * This, - /* [retval][out] */ IComponents **Components); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IChannelTuneRequest * This, - /* [retval][out] */ ITuneRequest **NewTuneRequest); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Locator )( - IChannelTuneRequest * This, - /* [retval][out] */ ILocator **Locator); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Locator )( - IChannelTuneRequest * This, - /* [in] */ ILocator *Locator); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Channel )( - IChannelTuneRequest * This, - /* [retval][out] */ long *Channel); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Channel )( - IChannelTuneRequest * This, - /* [in] */ long Channel); - - END_INTERFACE - } IChannelTuneRequestVtbl; - - interface IChannelTuneRequest - { - CONST_VTBL struct IChannelTuneRequestVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IChannelTuneRequest_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IChannelTuneRequest_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IChannelTuneRequest_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IChannelTuneRequest_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IChannelTuneRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IChannelTuneRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IChannelTuneRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IChannelTuneRequest_get_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> get_TuningSpace(This,TuningSpace) - - #define IChannelTuneRequest_get_Components(This,Components) \ - (This)->lpVtbl -> get_Components(This,Components) - - #define IChannelTuneRequest_Clone(This,NewTuneRequest) \ - (This)->lpVtbl -> Clone(This,NewTuneRequest) - - #define IChannelTuneRequest_get_Locator(This,Locator) \ - (This)->lpVtbl -> get_Locator(This,Locator) - - #define IChannelTuneRequest_put_Locator(This,Locator) \ - (This)->lpVtbl -> put_Locator(This,Locator) - - - #define IChannelTuneRequest_get_Channel(This,Channel) \ - (This)->lpVtbl -> get_Channel(This,Channel) - - #define IChannelTuneRequest_put_Channel(This,Channel) \ - (This)->lpVtbl -> put_Channel(This,Channel) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IChannelTuneRequest_get_Channel_Proxy( - IChannelTuneRequest * This, - /* [retval][out] */ long *Channel); - - - void __RPC_STUB IChannelTuneRequest_get_Channel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IChannelTuneRequest_put_Channel_Proxy( - IChannelTuneRequest * This, - /* [in] */ long Channel); - - - void __RPC_STUB IChannelTuneRequest_put_Channel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IChannelTuneRequest_INTERFACE_DEFINED__ */ - - - #ifndef __IATSCChannelTuneRequest_INTERFACE_DEFINED__ - #define __IATSCChannelTuneRequest_INTERFACE_DEFINED__ - - /* interface IATSCChannelTuneRequest */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - - EXTERN_C const IID IID_IATSCChannelTuneRequest; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("0369B4E1-45B6-11d3-B650-00C04F79498E") - IATSCChannelTuneRequest : public IChannelTuneRequest - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MinorChannel( - /* [retval][out] */ long *MinorChannel) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MinorChannel( - /* [in] */ long MinorChannel) = 0; - - }; - - #else /* C style interface */ - - typedef struct IATSCChannelTuneRequestVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IATSCChannelTuneRequest * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IATSCChannelTuneRequest * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IATSCChannelTuneRequest * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IATSCChannelTuneRequest * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IATSCChannelTuneRequest * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IATSCChannelTuneRequest * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IATSCChannelTuneRequest * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuningSpace )( - IATSCChannelTuneRequest * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Components )( - IATSCChannelTuneRequest * This, - /* [retval][out] */ IComponents **Components); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IATSCChannelTuneRequest * This, - /* [retval][out] */ ITuneRequest **NewTuneRequest); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Locator )( - IATSCChannelTuneRequest * This, - /* [retval][out] */ ILocator **Locator); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Locator )( - IATSCChannelTuneRequest * This, - /* [in] */ ILocator *Locator); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Channel )( - IATSCChannelTuneRequest * This, - /* [retval][out] */ long *Channel); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Channel )( - IATSCChannelTuneRequest * This, - /* [in] */ long Channel); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinorChannel )( - IATSCChannelTuneRequest * This, - /* [retval][out] */ long *MinorChannel); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MinorChannel )( - IATSCChannelTuneRequest * This, - /* [in] */ long MinorChannel); - - END_INTERFACE - } IATSCChannelTuneRequestVtbl; - - interface IATSCChannelTuneRequest - { - CONST_VTBL struct IATSCChannelTuneRequestVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IATSCChannelTuneRequest_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IATSCChannelTuneRequest_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IATSCChannelTuneRequest_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IATSCChannelTuneRequest_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IATSCChannelTuneRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IATSCChannelTuneRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IATSCChannelTuneRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IATSCChannelTuneRequest_get_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> get_TuningSpace(This,TuningSpace) - - #define IATSCChannelTuneRequest_get_Components(This,Components) \ - (This)->lpVtbl -> get_Components(This,Components) - - #define IATSCChannelTuneRequest_Clone(This,NewTuneRequest) \ - (This)->lpVtbl -> Clone(This,NewTuneRequest) - - #define IATSCChannelTuneRequest_get_Locator(This,Locator) \ - (This)->lpVtbl -> get_Locator(This,Locator) - - #define IATSCChannelTuneRequest_put_Locator(This,Locator) \ - (This)->lpVtbl -> put_Locator(This,Locator) - - - #define IATSCChannelTuneRequest_get_Channel(This,Channel) \ - (This)->lpVtbl -> get_Channel(This,Channel) - - #define IATSCChannelTuneRequest_put_Channel(This,Channel) \ - (This)->lpVtbl -> put_Channel(This,Channel) - - - #define IATSCChannelTuneRequest_get_MinorChannel(This,MinorChannel) \ - (This)->lpVtbl -> get_MinorChannel(This,MinorChannel) - - #define IATSCChannelTuneRequest_put_MinorChannel(This,MinorChannel) \ - (This)->lpVtbl -> put_MinorChannel(This,MinorChannel) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IATSCChannelTuneRequest_get_MinorChannel_Proxy( - IATSCChannelTuneRequest * This, - /* [retval][out] */ long *MinorChannel); - - - void __RPC_STUB IATSCChannelTuneRequest_get_MinorChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IATSCChannelTuneRequest_put_MinorChannel_Proxy( - IATSCChannelTuneRequest * This, - /* [in] */ long MinorChannel); - - - void __RPC_STUB IATSCChannelTuneRequest_put_MinorChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IATSCChannelTuneRequest_INTERFACE_DEFINED__ */ - - - #ifndef __IDVBTuneRequest_INTERFACE_DEFINED__ - #define __IDVBTuneRequest_INTERFACE_DEFINED__ - - /* interface IDVBTuneRequest */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - - EXTERN_C const IID IID_IDVBTuneRequest; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("0D6F567E-A636-42bb-83BA-CE4C1704AFA2") - IDVBTuneRequest : public ITuneRequest - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ONID( - /* [retval][out] */ long *ONID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ONID( - /* [in] */ long ONID) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_TSID( - /* [retval][out] */ long *TSID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_TSID( - /* [in] */ long TSID) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SID( - /* [retval][out] */ long *SID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SID( - /* [in] */ long SID) = 0; - - }; - - #else /* C style interface */ - - typedef struct IDVBTuneRequestVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDVBTuneRequest * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDVBTuneRequest * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDVBTuneRequest * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDVBTuneRequest * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDVBTuneRequest * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDVBTuneRequest * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDVBTuneRequest * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuningSpace )( - IDVBTuneRequest * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Components )( - IDVBTuneRequest * This, - /* [retval][out] */ IComponents **Components); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IDVBTuneRequest * This, - /* [retval][out] */ ITuneRequest **NewTuneRequest); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Locator )( - IDVBTuneRequest * This, - /* [retval][out] */ ILocator **Locator); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Locator )( - IDVBTuneRequest * This, - /* [in] */ ILocator *Locator); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ONID )( - IDVBTuneRequest * This, - /* [retval][out] */ long *ONID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ONID )( - IDVBTuneRequest * This, - /* [in] */ long ONID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TSID )( - IDVBTuneRequest * This, - /* [retval][out] */ long *TSID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_TSID )( - IDVBTuneRequest * This, - /* [in] */ long TSID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SID )( - IDVBTuneRequest * This, - /* [retval][out] */ long *SID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SID )( - IDVBTuneRequest * This, - /* [in] */ long SID); - - END_INTERFACE - } IDVBTuneRequestVtbl; - - interface IDVBTuneRequest - { - CONST_VTBL struct IDVBTuneRequestVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IDVBTuneRequest_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IDVBTuneRequest_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IDVBTuneRequest_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IDVBTuneRequest_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IDVBTuneRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IDVBTuneRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IDVBTuneRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IDVBTuneRequest_get_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> get_TuningSpace(This,TuningSpace) - - #define IDVBTuneRequest_get_Components(This,Components) \ - (This)->lpVtbl -> get_Components(This,Components) - - #define IDVBTuneRequest_Clone(This,NewTuneRequest) \ - (This)->lpVtbl -> Clone(This,NewTuneRequest) - - #define IDVBTuneRequest_get_Locator(This,Locator) \ - (This)->lpVtbl -> get_Locator(This,Locator) - - #define IDVBTuneRequest_put_Locator(This,Locator) \ - (This)->lpVtbl -> put_Locator(This,Locator) - - - #define IDVBTuneRequest_get_ONID(This,ONID) \ - (This)->lpVtbl -> get_ONID(This,ONID) - - #define IDVBTuneRequest_put_ONID(This,ONID) \ - (This)->lpVtbl -> put_ONID(This,ONID) - - #define IDVBTuneRequest_get_TSID(This,TSID) \ - (This)->lpVtbl -> get_TSID(This,TSID) - - #define IDVBTuneRequest_put_TSID(This,TSID) \ - (This)->lpVtbl -> put_TSID(This,TSID) - - #define IDVBTuneRequest_get_SID(This,SID) \ - (This)->lpVtbl -> get_SID(This,SID) - - #define IDVBTuneRequest_put_SID(This,SID) \ - (This)->lpVtbl -> put_SID(This,SID) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTuneRequest_get_ONID_Proxy( - IDVBTuneRequest * This, - /* [retval][out] */ long *ONID); - - - void __RPC_STUB IDVBTuneRequest_get_ONID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTuneRequest_put_ONID_Proxy( - IDVBTuneRequest * This, - /* [in] */ long ONID); - - - void __RPC_STUB IDVBTuneRequest_put_ONID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTuneRequest_get_TSID_Proxy( - IDVBTuneRequest * This, - /* [retval][out] */ long *TSID); - - - void __RPC_STUB IDVBTuneRequest_get_TSID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTuneRequest_put_TSID_Proxy( - IDVBTuneRequest * This, - /* [in] */ long TSID); - - - void __RPC_STUB IDVBTuneRequest_put_TSID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTuneRequest_get_SID_Proxy( - IDVBTuneRequest * This, - /* [retval][out] */ long *SID); - - - void __RPC_STUB IDVBTuneRequest_get_SID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTuneRequest_put_SID_Proxy( - IDVBTuneRequest * This, - /* [in] */ long SID); - - - void __RPC_STUB IDVBTuneRequest_put_SID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IDVBTuneRequest_INTERFACE_DEFINED__ */ - - - #ifndef __ITuner_INTERFACE_DEFINED__ - #define __ITuner_INTERFACE_DEFINED__ - - /* interface ITuner */ - /* [unique][helpstring][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_ITuner; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("28C52640-018A-11d3-9D8E-00C04F72D980") - ITuner : public IUnknown - { - public: - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_TuningSpace( - /* [retval][out] */ ITuningSpace **TuningSpace) = 0; - - virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_TuningSpace( - /* [in] */ ITuningSpace *TuningSpace) = 0; - - virtual /* [helpstring][restricted][hidden] */ HRESULT STDMETHODCALLTYPE EnumTuningSpaces( - /* [retval][out] */ IEnumTuningSpaces **ppEnum) = 0; - - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_TuneRequest( - /* [retval][out] */ ITuneRequest **TuneRequest) = 0; - - virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_TuneRequest( - /* [in] */ ITuneRequest *TuneRequest) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Validate( - /* [in] */ ITuneRequest *TuneRequest) = 0; - - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_PreferredComponentTypes( - /* [retval][out] */ IComponentTypes **ComponentTypes) = 0; - - virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_PreferredComponentTypes( - /* [in] */ IComponentTypes *ComponentTypes) = 0; - - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_SignalStrength( - /* [retval][out] */ long *Strength) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE TriggerSignalEvents( - /* [in] */ long Interval) = 0; - - }; - - #else /* C style interface */ - - typedef struct ITunerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ITuner * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ITuner * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ITuner * This); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuningSpace )( - ITuner * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_TuningSpace )( - ITuner * This, - /* [in] */ ITuningSpace *TuningSpace); - - /* [helpstring][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *EnumTuningSpaces )( - ITuner * This, - /* [retval][out] */ IEnumTuningSpaces **ppEnum); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuneRequest )( - ITuner * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_TuneRequest )( - ITuner * This, - /* [in] */ ITuneRequest *TuneRequest); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *Validate )( - ITuner * This, - /* [in] */ ITuneRequest *TuneRequest); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PreferredComponentTypes )( - ITuner * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_PreferredComponentTypes )( - ITuner * This, - /* [in] */ IComponentTypes *ComponentTypes); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignalStrength )( - ITuner * This, - /* [retval][out] */ long *Strength); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *TriggerSignalEvents )( - ITuner * This, - /* [in] */ long Interval); - - END_INTERFACE - } ITunerVtbl; - - interface ITuner - { - CONST_VTBL struct ITunerVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define ITuner_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define ITuner_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define ITuner_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define ITuner_get_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> get_TuningSpace(This,TuningSpace) - - #define ITuner_put_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> put_TuningSpace(This,TuningSpace) - - #define ITuner_EnumTuningSpaces(This,ppEnum) \ - (This)->lpVtbl -> EnumTuningSpaces(This,ppEnum) - - #define ITuner_get_TuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> get_TuneRequest(This,TuneRequest) - - #define ITuner_put_TuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> put_TuneRequest(This,TuneRequest) - - #define ITuner_Validate(This,TuneRequest) \ - (This)->lpVtbl -> Validate(This,TuneRequest) - - #define ITuner_get_PreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> get_PreferredComponentTypes(This,ComponentTypes) - - #define ITuner_put_PreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> put_PreferredComponentTypes(This,ComponentTypes) - - #define ITuner_get_SignalStrength(This,Strength) \ - (This)->lpVtbl -> get_SignalStrength(This,Strength) - - #define ITuner_TriggerSignalEvents(This,Interval) \ - (This)->lpVtbl -> TriggerSignalEvents(This,Interval) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ITuner_get_TuningSpace_Proxy( - ITuner * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - - void __RPC_STUB ITuner_get_TuningSpace_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE ITuner_put_TuningSpace_Proxy( - ITuner * This, - /* [in] */ ITuningSpace *TuningSpace); - - - void __RPC_STUB ITuner_put_TuningSpace_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][restricted][hidden] */ HRESULT STDMETHODCALLTYPE ITuner_EnumTuningSpaces_Proxy( - ITuner * This, - /* [retval][out] */ IEnumTuningSpaces **ppEnum); - - - void __RPC_STUB ITuner_EnumTuningSpaces_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ITuner_get_TuneRequest_Proxy( - ITuner * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - - void __RPC_STUB ITuner_get_TuneRequest_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE ITuner_put_TuneRequest_Proxy( - ITuner * This, - /* [in] */ ITuneRequest *TuneRequest); - - - void __RPC_STUB ITuner_put_TuneRequest_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE ITuner_Validate_Proxy( - ITuner * This, - /* [in] */ ITuneRequest *TuneRequest); - - - void __RPC_STUB ITuner_Validate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ITuner_get_PreferredComponentTypes_Proxy( - ITuner * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - - void __RPC_STUB ITuner_get_PreferredComponentTypes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE ITuner_put_PreferredComponentTypes_Proxy( - ITuner * This, - /* [in] */ IComponentTypes *ComponentTypes); - - - void __RPC_STUB ITuner_put_PreferredComponentTypes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ITuner_get_SignalStrength_Proxy( - ITuner * This, - /* [retval][out] */ long *Strength); - - - void __RPC_STUB ITuner_get_SignalStrength_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE ITuner_TriggerSignalEvents_Proxy( - ITuner * This, - /* [in] */ long Interval); - - - void __RPC_STUB ITuner_TriggerSignalEvents_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __ITuner_INTERFACE_DEFINED__ */ - - - #ifndef __IScanningTuner_INTERFACE_DEFINED__ - #define __IScanningTuner_INTERFACE_DEFINED__ - - /* interface IScanningTuner */ - /* [unique][helpstring][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_IScanningTuner; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("1DFD0A5C-0284-11d3-9D8E-00C04F72D980") - IScanningTuner : public ITuner - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SeekUp( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SeekDown( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ScanUp( - /* [in] */ long MillisecondsPause) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ScanDown( - /* [in] */ long MillisecondsPause) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE AutoProgram( void) = 0; - - }; - - #else /* C style interface */ - - typedef struct IScanningTunerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IScanningTuner * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IScanningTuner * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IScanningTuner * This); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuningSpace )( - IScanningTuner * This, - /* [retval][out] */ ITuningSpace **TuningSpace); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_TuningSpace )( - IScanningTuner * This, - /* [in] */ ITuningSpace *TuningSpace); - - /* [helpstring][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *EnumTuningSpaces )( - IScanningTuner * This, - /* [retval][out] */ IEnumTuningSpaces **ppEnum); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TuneRequest )( - IScanningTuner * This, - /* [retval][out] */ ITuneRequest **TuneRequest); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_TuneRequest )( - IScanningTuner * This, - /* [in] */ ITuneRequest *TuneRequest); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *Validate )( - IScanningTuner * This, - /* [in] */ ITuneRequest *TuneRequest); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PreferredComponentTypes )( - IScanningTuner * This, - /* [retval][out] */ IComponentTypes **ComponentTypes); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_PreferredComponentTypes )( - IScanningTuner * This, - /* [in] */ IComponentTypes *ComponentTypes); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignalStrength )( - IScanningTuner * This, - /* [retval][out] */ long *Strength); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *TriggerSignalEvents )( - IScanningTuner * This, - /* [in] */ long Interval); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SeekUp )( - IScanningTuner * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SeekDown )( - IScanningTuner * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *ScanUp )( - IScanningTuner * This, - /* [in] */ long MillisecondsPause); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *ScanDown )( - IScanningTuner * This, - /* [in] */ long MillisecondsPause); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *AutoProgram )( - IScanningTuner * This); - - END_INTERFACE - } IScanningTunerVtbl; - - interface IScanningTuner - { - CONST_VTBL struct IScanningTunerVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IScanningTuner_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IScanningTuner_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IScanningTuner_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IScanningTuner_get_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> get_TuningSpace(This,TuningSpace) - - #define IScanningTuner_put_TuningSpace(This,TuningSpace) \ - (This)->lpVtbl -> put_TuningSpace(This,TuningSpace) - - #define IScanningTuner_EnumTuningSpaces(This,ppEnum) \ - (This)->lpVtbl -> EnumTuningSpaces(This,ppEnum) - - #define IScanningTuner_get_TuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> get_TuneRequest(This,TuneRequest) - - #define IScanningTuner_put_TuneRequest(This,TuneRequest) \ - (This)->lpVtbl -> put_TuneRequest(This,TuneRequest) - - #define IScanningTuner_Validate(This,TuneRequest) \ - (This)->lpVtbl -> Validate(This,TuneRequest) - - #define IScanningTuner_get_PreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> get_PreferredComponentTypes(This,ComponentTypes) - - #define IScanningTuner_put_PreferredComponentTypes(This,ComponentTypes) \ - (This)->lpVtbl -> put_PreferredComponentTypes(This,ComponentTypes) - - #define IScanningTuner_get_SignalStrength(This,Strength) \ - (This)->lpVtbl -> get_SignalStrength(This,Strength) - - #define IScanningTuner_TriggerSignalEvents(This,Interval) \ - (This)->lpVtbl -> TriggerSignalEvents(This,Interval) - - - #define IScanningTuner_SeekUp(This) \ - (This)->lpVtbl -> SeekUp(This) - - #define IScanningTuner_SeekDown(This) \ - (This)->lpVtbl -> SeekDown(This) - - #define IScanningTuner_ScanUp(This,MillisecondsPause) \ - (This)->lpVtbl -> ScanUp(This,MillisecondsPause) - - #define IScanningTuner_ScanDown(This,MillisecondsPause) \ - (This)->lpVtbl -> ScanDown(This,MillisecondsPause) - - #define IScanningTuner_AutoProgram(This) \ - (This)->lpVtbl -> AutoProgram(This) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IScanningTuner_SeekUp_Proxy( - IScanningTuner * This); - - - void __RPC_STUB IScanningTuner_SeekUp_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IScanningTuner_SeekDown_Proxy( - IScanningTuner * This); - - - void __RPC_STUB IScanningTuner_SeekDown_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IScanningTuner_ScanUp_Proxy( - IScanningTuner * This, - /* [in] */ long MillisecondsPause); - - - void __RPC_STUB IScanningTuner_ScanUp_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IScanningTuner_ScanDown_Proxy( - IScanningTuner * This, - /* [in] */ long MillisecondsPause); - - - void __RPC_STUB IScanningTuner_ScanDown_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IScanningTuner_AutoProgram_Proxy( - IScanningTuner * This); - - - void __RPC_STUB IScanningTuner_AutoProgram_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IScanningTuner_INTERFACE_DEFINED__ */ - - - #ifndef __ITunerEvents_INTERFACE_DEFINED__ - #define __ITunerEvents_INTERFACE_DEFINED__ - - /* interface ITunerEvents */ - /* [unique][helpstring][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_ITunerEvents; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("68481420-0280-11d3-9D8E-00C04F72D980") - ITunerEvents : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnTune( - /* [in] */ ITuneRequest **Request, - /* [in] */ long *Strength) = 0; - - }; - - #else /* C style interface */ - - typedef struct ITunerEventsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ITunerEvents * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ITunerEvents * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ITunerEvents * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *OnTune )( - ITunerEvents * This, - /* [in] */ ITuneRequest **Request, - /* [in] */ long *Strength); - - END_INTERFACE - } ITunerEventsVtbl; - - interface ITunerEvents - { - CONST_VTBL struct ITunerEventsVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define ITunerEvents_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define ITunerEvents_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define ITunerEvents_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define ITunerEvents_OnTune(This,Request,Strength) \ - (This)->lpVtbl -> OnTune(This,Request,Strength) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE ITunerEvents_OnTune_Proxy( - ITunerEvents * This, - /* [in] */ ITuneRequest **Request, - /* [in] */ long *Strength); - - - void __RPC_STUB ITunerEvents_OnTune_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __ITunerEvents_INTERFACE_DEFINED__ */ - - - #ifndef __ISignalEvents_INTERFACE_DEFINED__ - #define __ISignalEvents_INTERFACE_DEFINED__ - - /* interface ISignalEvents */ - /* [unique][helpstring][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_ISignalEvents; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("85E2439E-0E23-11d3-9D8E-00C04F72D980") - ISignalEvents : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnSignal( - /* [out] */ long *Strength) = 0; - - }; - - #else /* C style interface */ - - typedef struct ISignalEventsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ISignalEvents * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ISignalEvents * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ISignalEvents * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *OnSignal )( - ISignalEvents * This, - /* [out] */ long *Strength); - - END_INTERFACE - } ISignalEventsVtbl; - - interface ISignalEvents - { - CONST_VTBL struct ISignalEventsVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define ISignalEvents_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define ISignalEvents_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define ISignalEvents_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define ISignalEvents_OnSignal(This,Strength) \ - (This)->lpVtbl -> OnSignal(This,Strength) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE ISignalEvents_OnSignal_Proxy( - ISignalEvents * This, - /* [out] */ long *Strength); - - - void __RPC_STUB ISignalEvents_OnSignal_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __ISignalEvents_INTERFACE_DEFINED__ */ - - - #ifndef __IComponentType_INTERFACE_DEFINED__ - #define __IComponentType_INTERFACE_DEFINED__ - - /* interface IComponentType */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_IComponentType; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("6A340DC0-0311-11d3-9D8E-00C04F72D980") - IComponentType : public IDispatch - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Category( - /* [retval][out] */ ComponentCategory *Category) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Category( - /* [in] */ ComponentCategory Category) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MediaMajorType( - /* [retval][out] */ BSTR *MediaMajorType) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MediaMajorType( - /* [in] */ BSTR MediaMajorType) = 0; - - virtual /* [restricted][hidden][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__MediaMajorType( - /* [retval][out] */ GUID *MediaMajorTypeGuid) = 0; - - virtual /* [restricted][hidden][helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put__MediaMajorType( - /* [in] */ REFCLSID MediaMajorTypeGuid) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MediaSubType( - /* [retval][out] */ BSTR *MediaSubType) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MediaSubType( - /* [in] */ BSTR MediaSubType) = 0; - - virtual /* [restricted][hidden][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__MediaSubType( - /* [retval][out] */ GUID *MediaSubTypeGuid) = 0; - - virtual /* [restricted][hidden][helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put__MediaSubType( - /* [in] */ REFCLSID MediaSubTypeGuid) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MediaFormatType( - /* [retval][out] */ BSTR *MediaFormatType) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_MediaFormatType( - /* [in] */ BSTR MediaFormatType) = 0; - - virtual /* [restricted][hidden][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__MediaFormatType( - /* [retval][out] */ GUID *MediaFormatTypeGuid) = 0; - - virtual /* [restricted][hidden][helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put__MediaFormatType( - /* [in] */ REFCLSID MediaFormatTypeGuid) = 0; - - virtual /* [helpstring][restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE get_MediaType( - /* [retval][out] */ AM_MEDIA_TYPE *MediaType) = 0; - - virtual /* [helpstring][restricted][hidden][id][propput] */ HRESULT STDMETHODCALLTYPE put_MediaType( - /* [in] */ AM_MEDIA_TYPE *MediaType) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clone( - /* [retval][out] */ IComponentType **NewCT) = 0; - - }; - - #else /* C style interface */ - - typedef struct IComponentTypeVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IComponentType * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IComponentType * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IComponentType * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IComponentType * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IComponentType * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IComponentType * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IComponentType * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Category )( - IComponentType * This, - /* [retval][out] */ ComponentCategory *Category); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Category )( - IComponentType * This, - /* [in] */ ComponentCategory Category); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaMajorType )( - IComponentType * This, - /* [retval][out] */ BSTR *MediaMajorType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaMajorType )( - IComponentType * This, - /* [in] */ BSTR MediaMajorType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaMajorType )( - IComponentType * This, - /* [retval][out] */ GUID *MediaMajorTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaMajorType )( - IComponentType * This, - /* [in] */ REFCLSID MediaMajorTypeGuid); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaSubType )( - IComponentType * This, - /* [retval][out] */ BSTR *MediaSubType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaSubType )( - IComponentType * This, - /* [in] */ BSTR MediaSubType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaSubType )( - IComponentType * This, - /* [retval][out] */ GUID *MediaSubTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaSubType )( - IComponentType * This, - /* [in] */ REFCLSID MediaSubTypeGuid); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaFormatType )( - IComponentType * This, - /* [retval][out] */ BSTR *MediaFormatType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaFormatType )( - IComponentType * This, - /* [in] */ BSTR MediaFormatType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaFormatType )( - IComponentType * This, - /* [retval][out] */ GUID *MediaFormatTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaFormatType )( - IComponentType * This, - /* [in] */ REFCLSID MediaFormatTypeGuid); - - /* [helpstring][restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaType )( - IComponentType * This, - /* [retval][out] */ AM_MEDIA_TYPE *MediaType); - - /* [helpstring][restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaType )( - IComponentType * This, - /* [in] */ AM_MEDIA_TYPE *MediaType); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IComponentType * This, - /* [retval][out] */ IComponentType **NewCT); - - END_INTERFACE - } IComponentTypeVtbl; - - interface IComponentType - { - CONST_VTBL struct IComponentTypeVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IComponentType_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IComponentType_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IComponentType_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IComponentType_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IComponentType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IComponentType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IComponentType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IComponentType_get_Category(This,Category) \ - (This)->lpVtbl -> get_Category(This,Category) - - #define IComponentType_put_Category(This,Category) \ - (This)->lpVtbl -> put_Category(This,Category) - - #define IComponentType_get_MediaMajorType(This,MediaMajorType) \ - (This)->lpVtbl -> get_MediaMajorType(This,MediaMajorType) - - #define IComponentType_put_MediaMajorType(This,MediaMajorType) \ - (This)->lpVtbl -> put_MediaMajorType(This,MediaMajorType) - - #define IComponentType_get__MediaMajorType(This,MediaMajorTypeGuid) \ - (This)->lpVtbl -> get__MediaMajorType(This,MediaMajorTypeGuid) - - #define IComponentType_put__MediaMajorType(This,MediaMajorTypeGuid) \ - (This)->lpVtbl -> put__MediaMajorType(This,MediaMajorTypeGuid) - - #define IComponentType_get_MediaSubType(This,MediaSubType) \ - (This)->lpVtbl -> get_MediaSubType(This,MediaSubType) - - #define IComponentType_put_MediaSubType(This,MediaSubType) \ - (This)->lpVtbl -> put_MediaSubType(This,MediaSubType) - - #define IComponentType_get__MediaSubType(This,MediaSubTypeGuid) \ - (This)->lpVtbl -> get__MediaSubType(This,MediaSubTypeGuid) - - #define IComponentType_put__MediaSubType(This,MediaSubTypeGuid) \ - (This)->lpVtbl -> put__MediaSubType(This,MediaSubTypeGuid) - - #define IComponentType_get_MediaFormatType(This,MediaFormatType) \ - (This)->lpVtbl -> get_MediaFormatType(This,MediaFormatType) - - #define IComponentType_put_MediaFormatType(This,MediaFormatType) \ - (This)->lpVtbl -> put_MediaFormatType(This,MediaFormatType) - - #define IComponentType_get__MediaFormatType(This,MediaFormatTypeGuid) \ - (This)->lpVtbl -> get__MediaFormatType(This,MediaFormatTypeGuid) - - #define IComponentType_put__MediaFormatType(This,MediaFormatTypeGuid) \ - (This)->lpVtbl -> put__MediaFormatType(This,MediaFormatTypeGuid) - - #define IComponentType_get_MediaType(This,MediaType) \ - (This)->lpVtbl -> get_MediaType(This,MediaType) - - #define IComponentType_put_MediaType(This,MediaType) \ - (This)->lpVtbl -> put_MediaType(This,MediaType) - - #define IComponentType_Clone(This,NewCT) \ - (This)->lpVtbl -> Clone(This,NewCT) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentType_get_Category_Proxy( - IComponentType * This, - /* [retval][out] */ ComponentCategory *Category); - - - void __RPC_STUB IComponentType_get_Category_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponentType_put_Category_Proxy( - IComponentType * This, - /* [in] */ ComponentCategory Category); - - - void __RPC_STUB IComponentType_put_Category_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentType_get_MediaMajorType_Proxy( - IComponentType * This, - /* [retval][out] */ BSTR *MediaMajorType); - - - void __RPC_STUB IComponentType_get_MediaMajorType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponentType_put_MediaMajorType_Proxy( - IComponentType * This, - /* [in] */ BSTR MediaMajorType); - - - void __RPC_STUB IComponentType_put_MediaMajorType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentType_get__MediaMajorType_Proxy( - IComponentType * This, - /* [retval][out] */ GUID *MediaMajorTypeGuid); - - - void __RPC_STUB IComponentType_get__MediaMajorType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponentType_put__MediaMajorType_Proxy( - IComponentType * This, - /* [in] */ REFCLSID MediaMajorTypeGuid); - - - void __RPC_STUB IComponentType_put__MediaMajorType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentType_get_MediaSubType_Proxy( - IComponentType * This, - /* [retval][out] */ BSTR *MediaSubType); - - - void __RPC_STUB IComponentType_get_MediaSubType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponentType_put_MediaSubType_Proxy( - IComponentType * This, - /* [in] */ BSTR MediaSubType); - - - void __RPC_STUB IComponentType_put_MediaSubType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentType_get__MediaSubType_Proxy( - IComponentType * This, - /* [retval][out] */ GUID *MediaSubTypeGuid); - - - void __RPC_STUB IComponentType_get__MediaSubType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponentType_put__MediaSubType_Proxy( - IComponentType * This, - /* [in] */ REFCLSID MediaSubTypeGuid); - - - void __RPC_STUB IComponentType_put__MediaSubType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentType_get_MediaFormatType_Proxy( - IComponentType * This, - /* [retval][out] */ BSTR *MediaFormatType); - - - void __RPC_STUB IComponentType_get_MediaFormatType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponentType_put_MediaFormatType_Proxy( - IComponentType * This, - /* [in] */ BSTR MediaFormatType); - - - void __RPC_STUB IComponentType_put_MediaFormatType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentType_get__MediaFormatType_Proxy( - IComponentType * This, - /* [retval][out] */ GUID *MediaFormatTypeGuid); - - - void __RPC_STUB IComponentType_get__MediaFormatType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponentType_put__MediaFormatType_Proxy( - IComponentType * This, - /* [in] */ REFCLSID MediaFormatTypeGuid); - - - void __RPC_STUB IComponentType_put__MediaFormatType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentType_get_MediaType_Proxy( - IComponentType * This, - /* [retval][out] */ AM_MEDIA_TYPE *MediaType); - - - void __RPC_STUB IComponentType_get_MediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][restricted][hidden][id][propput] */ HRESULT STDMETHODCALLTYPE IComponentType_put_MediaType_Proxy( - IComponentType * This, - /* [in] */ AM_MEDIA_TYPE *MediaType); - - - void __RPC_STUB IComponentType_put_MediaType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IComponentType_Clone_Proxy( - IComponentType * This, - /* [retval][out] */ IComponentType **NewCT); - - - void __RPC_STUB IComponentType_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IComponentType_INTERFACE_DEFINED__ */ - - - #ifndef __ILanguageComponentType_INTERFACE_DEFINED__ - #define __ILanguageComponentType_INTERFACE_DEFINED__ - - /* interface ILanguageComponentType */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_ILanguageComponentType; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("B874C8BA-0FA2-11d3-9D8E-00C04F72D980") - ILanguageComponentType : public IComponentType - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_LangID( - /* [retval][out] */ long *LangID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_LangID( - /* [in] */ long LangID) = 0; - - }; - - #else /* C style interface */ - - typedef struct ILanguageComponentTypeVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILanguageComponentType * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ILanguageComponentType * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ILanguageComponentType * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - ILanguageComponentType * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - ILanguageComponentType * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - ILanguageComponentType * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - ILanguageComponentType * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Category )( - ILanguageComponentType * This, - /* [retval][out] */ ComponentCategory *Category); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Category )( - ILanguageComponentType * This, - /* [in] */ ComponentCategory Category); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaMajorType )( - ILanguageComponentType * This, - /* [retval][out] */ BSTR *MediaMajorType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaMajorType )( - ILanguageComponentType * This, - /* [in] */ BSTR MediaMajorType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaMajorType )( - ILanguageComponentType * This, - /* [retval][out] */ GUID *MediaMajorTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaMajorType )( - ILanguageComponentType * This, - /* [in] */ REFCLSID MediaMajorTypeGuid); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaSubType )( - ILanguageComponentType * This, - /* [retval][out] */ BSTR *MediaSubType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaSubType )( - ILanguageComponentType * This, - /* [in] */ BSTR MediaSubType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaSubType )( - ILanguageComponentType * This, - /* [retval][out] */ GUID *MediaSubTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaSubType )( - ILanguageComponentType * This, - /* [in] */ REFCLSID MediaSubTypeGuid); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaFormatType )( - ILanguageComponentType * This, - /* [retval][out] */ BSTR *MediaFormatType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaFormatType )( - ILanguageComponentType * This, - /* [in] */ BSTR MediaFormatType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaFormatType )( - ILanguageComponentType * This, - /* [retval][out] */ GUID *MediaFormatTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaFormatType )( - ILanguageComponentType * This, - /* [in] */ REFCLSID MediaFormatTypeGuid); - - /* [helpstring][restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaType )( - ILanguageComponentType * This, - /* [retval][out] */ AM_MEDIA_TYPE *MediaType); - - /* [helpstring][restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaType )( - ILanguageComponentType * This, - /* [in] */ AM_MEDIA_TYPE *MediaType); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - ILanguageComponentType * This, - /* [retval][out] */ IComponentType **NewCT); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LangID )( - ILanguageComponentType * This, - /* [retval][out] */ long *LangID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LangID )( - ILanguageComponentType * This, - /* [in] */ long LangID); - - END_INTERFACE - } ILanguageComponentTypeVtbl; - - interface ILanguageComponentType - { - CONST_VTBL struct ILanguageComponentTypeVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define ILanguageComponentType_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define ILanguageComponentType_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define ILanguageComponentType_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define ILanguageComponentType_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define ILanguageComponentType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define ILanguageComponentType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define ILanguageComponentType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define ILanguageComponentType_get_Category(This,Category) \ - (This)->lpVtbl -> get_Category(This,Category) - - #define ILanguageComponentType_put_Category(This,Category) \ - (This)->lpVtbl -> put_Category(This,Category) - - #define ILanguageComponentType_get_MediaMajorType(This,MediaMajorType) \ - (This)->lpVtbl -> get_MediaMajorType(This,MediaMajorType) - - #define ILanguageComponentType_put_MediaMajorType(This,MediaMajorType) \ - (This)->lpVtbl -> put_MediaMajorType(This,MediaMajorType) - - #define ILanguageComponentType_get__MediaMajorType(This,MediaMajorTypeGuid) \ - (This)->lpVtbl -> get__MediaMajorType(This,MediaMajorTypeGuid) - - #define ILanguageComponentType_put__MediaMajorType(This,MediaMajorTypeGuid) \ - (This)->lpVtbl -> put__MediaMajorType(This,MediaMajorTypeGuid) - - #define ILanguageComponentType_get_MediaSubType(This,MediaSubType) \ - (This)->lpVtbl -> get_MediaSubType(This,MediaSubType) - - #define ILanguageComponentType_put_MediaSubType(This,MediaSubType) \ - (This)->lpVtbl -> put_MediaSubType(This,MediaSubType) - - #define ILanguageComponentType_get__MediaSubType(This,MediaSubTypeGuid) \ - (This)->lpVtbl -> get__MediaSubType(This,MediaSubTypeGuid) - - #define ILanguageComponentType_put__MediaSubType(This,MediaSubTypeGuid) \ - (This)->lpVtbl -> put__MediaSubType(This,MediaSubTypeGuid) - - #define ILanguageComponentType_get_MediaFormatType(This,MediaFormatType) \ - (This)->lpVtbl -> get_MediaFormatType(This,MediaFormatType) - - #define ILanguageComponentType_put_MediaFormatType(This,MediaFormatType) \ - (This)->lpVtbl -> put_MediaFormatType(This,MediaFormatType) - - #define ILanguageComponentType_get__MediaFormatType(This,MediaFormatTypeGuid) \ - (This)->lpVtbl -> get__MediaFormatType(This,MediaFormatTypeGuid) - - #define ILanguageComponentType_put__MediaFormatType(This,MediaFormatTypeGuid) \ - (This)->lpVtbl -> put__MediaFormatType(This,MediaFormatTypeGuid) - - #define ILanguageComponentType_get_MediaType(This,MediaType) \ - (This)->lpVtbl -> get_MediaType(This,MediaType) - - #define ILanguageComponentType_put_MediaType(This,MediaType) \ - (This)->lpVtbl -> put_MediaType(This,MediaType) - - #define ILanguageComponentType_Clone(This,NewCT) \ - (This)->lpVtbl -> Clone(This,NewCT) - - - #define ILanguageComponentType_get_LangID(This,LangID) \ - (This)->lpVtbl -> get_LangID(This,LangID) - - #define ILanguageComponentType_put_LangID(This,LangID) \ - (This)->lpVtbl -> put_LangID(This,LangID) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ILanguageComponentType_get_LangID_Proxy( - ILanguageComponentType * This, - /* [retval][out] */ long *LangID); - - - void __RPC_STUB ILanguageComponentType_get_LangID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ILanguageComponentType_put_LangID_Proxy( - ILanguageComponentType * This, - /* [in] */ long LangID); - - - void __RPC_STUB ILanguageComponentType_put_LangID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __ILanguageComponentType_INTERFACE_DEFINED__ */ - - - #ifndef __IMPEG2ComponentType_INTERFACE_DEFINED__ - #define __IMPEG2ComponentType_INTERFACE_DEFINED__ - - /* interface IMPEG2ComponentType */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_IMPEG2ComponentType; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("2C073D84-B51C-48c9-AA9F-68971E1F6E38") - IMPEG2ComponentType : public ILanguageComponentType - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_StreamType( - /* [retval][out] */ MPEG2StreamType *MP2StreamType) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_StreamType( - /* [in] */ MPEG2StreamType MP2StreamType) = 0; - - }; - - #else /* C style interface */ - - typedef struct IMPEG2ComponentTypeVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMPEG2ComponentType * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMPEG2ComponentType * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMPEG2ComponentType * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IMPEG2ComponentType * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IMPEG2ComponentType * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IMPEG2ComponentType * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IMPEG2ComponentType * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Category )( - IMPEG2ComponentType * This, - /* [retval][out] */ ComponentCategory *Category); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Category )( - IMPEG2ComponentType * This, - /* [in] */ ComponentCategory Category); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaMajorType )( - IMPEG2ComponentType * This, - /* [retval][out] */ BSTR *MediaMajorType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaMajorType )( - IMPEG2ComponentType * This, - /* [in] */ BSTR MediaMajorType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaMajorType )( - IMPEG2ComponentType * This, - /* [retval][out] */ GUID *MediaMajorTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaMajorType )( - IMPEG2ComponentType * This, - /* [in] */ REFCLSID MediaMajorTypeGuid); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaSubType )( - IMPEG2ComponentType * This, - /* [retval][out] */ BSTR *MediaSubType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaSubType )( - IMPEG2ComponentType * This, - /* [in] */ BSTR MediaSubType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaSubType )( - IMPEG2ComponentType * This, - /* [retval][out] */ GUID *MediaSubTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaSubType )( - IMPEG2ComponentType * This, - /* [in] */ REFCLSID MediaSubTypeGuid); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaFormatType )( - IMPEG2ComponentType * This, - /* [retval][out] */ BSTR *MediaFormatType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaFormatType )( - IMPEG2ComponentType * This, - /* [in] */ BSTR MediaFormatType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaFormatType )( - IMPEG2ComponentType * This, - /* [retval][out] */ GUID *MediaFormatTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaFormatType )( - IMPEG2ComponentType * This, - /* [in] */ REFCLSID MediaFormatTypeGuid); - - /* [helpstring][restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaType )( - IMPEG2ComponentType * This, - /* [retval][out] */ AM_MEDIA_TYPE *MediaType); - - /* [helpstring][restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaType )( - IMPEG2ComponentType * This, - /* [in] */ AM_MEDIA_TYPE *MediaType); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IMPEG2ComponentType * This, - /* [retval][out] */ IComponentType **NewCT); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LangID )( - IMPEG2ComponentType * This, - /* [retval][out] */ long *LangID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LangID )( - IMPEG2ComponentType * This, - /* [in] */ long LangID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StreamType )( - IMPEG2ComponentType * This, - /* [retval][out] */ MPEG2StreamType *MP2StreamType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_StreamType )( - IMPEG2ComponentType * This, - /* [in] */ MPEG2StreamType MP2StreamType); - - END_INTERFACE - } IMPEG2ComponentTypeVtbl; - - interface IMPEG2ComponentType - { - CONST_VTBL struct IMPEG2ComponentTypeVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IMPEG2ComponentType_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IMPEG2ComponentType_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IMPEG2ComponentType_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IMPEG2ComponentType_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IMPEG2ComponentType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IMPEG2ComponentType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IMPEG2ComponentType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IMPEG2ComponentType_get_Category(This,Category) \ - (This)->lpVtbl -> get_Category(This,Category) - - #define IMPEG2ComponentType_put_Category(This,Category) \ - (This)->lpVtbl -> put_Category(This,Category) - - #define IMPEG2ComponentType_get_MediaMajorType(This,MediaMajorType) \ - (This)->lpVtbl -> get_MediaMajorType(This,MediaMajorType) - - #define IMPEG2ComponentType_put_MediaMajorType(This,MediaMajorType) \ - (This)->lpVtbl -> put_MediaMajorType(This,MediaMajorType) - - #define IMPEG2ComponentType_get__MediaMajorType(This,MediaMajorTypeGuid) \ - (This)->lpVtbl -> get__MediaMajorType(This,MediaMajorTypeGuid) - - #define IMPEG2ComponentType_put__MediaMajorType(This,MediaMajorTypeGuid) \ - (This)->lpVtbl -> put__MediaMajorType(This,MediaMajorTypeGuid) - - #define IMPEG2ComponentType_get_MediaSubType(This,MediaSubType) \ - (This)->lpVtbl -> get_MediaSubType(This,MediaSubType) - - #define IMPEG2ComponentType_put_MediaSubType(This,MediaSubType) \ - (This)->lpVtbl -> put_MediaSubType(This,MediaSubType) - - #define IMPEG2ComponentType_get__MediaSubType(This,MediaSubTypeGuid) \ - (This)->lpVtbl -> get__MediaSubType(This,MediaSubTypeGuid) - - #define IMPEG2ComponentType_put__MediaSubType(This,MediaSubTypeGuid) \ - (This)->lpVtbl -> put__MediaSubType(This,MediaSubTypeGuid) - - #define IMPEG2ComponentType_get_MediaFormatType(This,MediaFormatType) \ - (This)->lpVtbl -> get_MediaFormatType(This,MediaFormatType) - - #define IMPEG2ComponentType_put_MediaFormatType(This,MediaFormatType) \ - (This)->lpVtbl -> put_MediaFormatType(This,MediaFormatType) - - #define IMPEG2ComponentType_get__MediaFormatType(This,MediaFormatTypeGuid) \ - (This)->lpVtbl -> get__MediaFormatType(This,MediaFormatTypeGuid) - - #define IMPEG2ComponentType_put__MediaFormatType(This,MediaFormatTypeGuid) \ - (This)->lpVtbl -> put__MediaFormatType(This,MediaFormatTypeGuid) - - #define IMPEG2ComponentType_get_MediaType(This,MediaType) \ - (This)->lpVtbl -> get_MediaType(This,MediaType) - - #define IMPEG2ComponentType_put_MediaType(This,MediaType) \ - (This)->lpVtbl -> put_MediaType(This,MediaType) - - #define IMPEG2ComponentType_Clone(This,NewCT) \ - (This)->lpVtbl -> Clone(This,NewCT) - - - #define IMPEG2ComponentType_get_LangID(This,LangID) \ - (This)->lpVtbl -> get_LangID(This,LangID) - - #define IMPEG2ComponentType_put_LangID(This,LangID) \ - (This)->lpVtbl -> put_LangID(This,LangID) - - - #define IMPEG2ComponentType_get_StreamType(This,MP2StreamType) \ - (This)->lpVtbl -> get_StreamType(This,MP2StreamType) - - #define IMPEG2ComponentType_put_StreamType(This,MP2StreamType) \ - (This)->lpVtbl -> put_StreamType(This,MP2StreamType) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMPEG2ComponentType_get_StreamType_Proxy( - IMPEG2ComponentType * This, - /* [retval][out] */ MPEG2StreamType *MP2StreamType); - - - void __RPC_STUB IMPEG2ComponentType_get_StreamType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IMPEG2ComponentType_put_StreamType_Proxy( - IMPEG2ComponentType * This, - /* [in] */ MPEG2StreamType MP2StreamType); - - - void __RPC_STUB IMPEG2ComponentType_put_StreamType_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IMPEG2ComponentType_INTERFACE_DEFINED__ */ - - - #ifndef __IATSCComponentType_INTERFACE_DEFINED__ - #define __IATSCComponentType_INTERFACE_DEFINED__ - - /* interface IATSCComponentType */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_IATSCComponentType; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("FC189E4D-7BD4-4125-B3B3-3A76A332CC96") - IATSCComponentType : public IMPEG2ComponentType - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Flags( - /* [retval][out] */ long *Flags) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Flags( - /* [in] */ long flags) = 0; - - }; - - #else /* C style interface */ - - typedef struct IATSCComponentTypeVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IATSCComponentType * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IATSCComponentType * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IATSCComponentType * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IATSCComponentType * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IATSCComponentType * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IATSCComponentType * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IATSCComponentType * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Category )( - IATSCComponentType * This, - /* [retval][out] */ ComponentCategory *Category); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Category )( - IATSCComponentType * This, - /* [in] */ ComponentCategory Category); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaMajorType )( - IATSCComponentType * This, - /* [retval][out] */ BSTR *MediaMajorType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaMajorType )( - IATSCComponentType * This, - /* [in] */ BSTR MediaMajorType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaMajorType )( - IATSCComponentType * This, - /* [retval][out] */ GUID *MediaMajorTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaMajorType )( - IATSCComponentType * This, - /* [in] */ REFCLSID MediaMajorTypeGuid); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaSubType )( - IATSCComponentType * This, - /* [retval][out] */ BSTR *MediaSubType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaSubType )( - IATSCComponentType * This, - /* [in] */ BSTR MediaSubType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaSubType )( - IATSCComponentType * This, - /* [retval][out] */ GUID *MediaSubTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaSubType )( - IATSCComponentType * This, - /* [in] */ REFCLSID MediaSubTypeGuid); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaFormatType )( - IATSCComponentType * This, - /* [retval][out] */ BSTR *MediaFormatType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaFormatType )( - IATSCComponentType * This, - /* [in] */ BSTR MediaFormatType); - - /* [restricted][hidden][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__MediaFormatType )( - IATSCComponentType * This, - /* [retval][out] */ GUID *MediaFormatTypeGuid); - - /* [restricted][hidden][helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put__MediaFormatType )( - IATSCComponentType * This, - /* [in] */ REFCLSID MediaFormatTypeGuid); - - /* [helpstring][restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaType )( - IATSCComponentType * This, - /* [retval][out] */ AM_MEDIA_TYPE *MediaType); - - /* [helpstring][restricted][hidden][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MediaType )( - IATSCComponentType * This, - /* [in] */ AM_MEDIA_TYPE *MediaType); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IATSCComponentType * This, - /* [retval][out] */ IComponentType **NewCT); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LangID )( - IATSCComponentType * This, - /* [retval][out] */ long *LangID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LangID )( - IATSCComponentType * This, - /* [in] */ long LangID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_StreamType )( - IATSCComponentType * This, - /* [retval][out] */ MPEG2StreamType *MP2StreamType); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_StreamType )( - IATSCComponentType * This, - /* [in] */ MPEG2StreamType MP2StreamType); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Flags )( - IATSCComponentType * This, - /* [retval][out] */ long *Flags); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Flags )( - IATSCComponentType * This, - /* [in] */ long flags); - - END_INTERFACE - } IATSCComponentTypeVtbl; - - interface IATSCComponentType - { - CONST_VTBL struct IATSCComponentTypeVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IATSCComponentType_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IATSCComponentType_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IATSCComponentType_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IATSCComponentType_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IATSCComponentType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IATSCComponentType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IATSCComponentType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IATSCComponentType_get_Category(This,Category) \ - (This)->lpVtbl -> get_Category(This,Category) - - #define IATSCComponentType_put_Category(This,Category) \ - (This)->lpVtbl -> put_Category(This,Category) - - #define IATSCComponentType_get_MediaMajorType(This,MediaMajorType) \ - (This)->lpVtbl -> get_MediaMajorType(This,MediaMajorType) - - #define IATSCComponentType_put_MediaMajorType(This,MediaMajorType) \ - (This)->lpVtbl -> put_MediaMajorType(This,MediaMajorType) - - #define IATSCComponentType_get__MediaMajorType(This,MediaMajorTypeGuid) \ - (This)->lpVtbl -> get__MediaMajorType(This,MediaMajorTypeGuid) - - #define IATSCComponentType_put__MediaMajorType(This,MediaMajorTypeGuid) \ - (This)->lpVtbl -> put__MediaMajorType(This,MediaMajorTypeGuid) - - #define IATSCComponentType_get_MediaSubType(This,MediaSubType) \ - (This)->lpVtbl -> get_MediaSubType(This,MediaSubType) - - #define IATSCComponentType_put_MediaSubType(This,MediaSubType) \ - (This)->lpVtbl -> put_MediaSubType(This,MediaSubType) - - #define IATSCComponentType_get__MediaSubType(This,MediaSubTypeGuid) \ - (This)->lpVtbl -> get__MediaSubType(This,MediaSubTypeGuid) - - #define IATSCComponentType_put__MediaSubType(This,MediaSubTypeGuid) \ - (This)->lpVtbl -> put__MediaSubType(This,MediaSubTypeGuid) - - #define IATSCComponentType_get_MediaFormatType(This,MediaFormatType) \ - (This)->lpVtbl -> get_MediaFormatType(This,MediaFormatType) - - #define IATSCComponentType_put_MediaFormatType(This,MediaFormatType) \ - (This)->lpVtbl -> put_MediaFormatType(This,MediaFormatType) - - #define IATSCComponentType_get__MediaFormatType(This,MediaFormatTypeGuid) \ - (This)->lpVtbl -> get__MediaFormatType(This,MediaFormatTypeGuid) - - #define IATSCComponentType_put__MediaFormatType(This,MediaFormatTypeGuid) \ - (This)->lpVtbl -> put__MediaFormatType(This,MediaFormatTypeGuid) - - #define IATSCComponentType_get_MediaType(This,MediaType) \ - (This)->lpVtbl -> get_MediaType(This,MediaType) - - #define IATSCComponentType_put_MediaType(This,MediaType) \ - (This)->lpVtbl -> put_MediaType(This,MediaType) - - #define IATSCComponentType_Clone(This,NewCT) \ - (This)->lpVtbl -> Clone(This,NewCT) - - - #define IATSCComponentType_get_LangID(This,LangID) \ - (This)->lpVtbl -> get_LangID(This,LangID) - - #define IATSCComponentType_put_LangID(This,LangID) \ - (This)->lpVtbl -> put_LangID(This,LangID) - - - #define IATSCComponentType_get_StreamType(This,MP2StreamType) \ - (This)->lpVtbl -> get_StreamType(This,MP2StreamType) - - #define IATSCComponentType_put_StreamType(This,MP2StreamType) \ - (This)->lpVtbl -> put_StreamType(This,MP2StreamType) - - - #define IATSCComponentType_get_Flags(This,Flags) \ - (This)->lpVtbl -> get_Flags(This,Flags) - - #define IATSCComponentType_put_Flags(This,flags) \ - (This)->lpVtbl -> put_Flags(This,flags) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IATSCComponentType_get_Flags_Proxy( - IATSCComponentType * This, - /* [retval][out] */ long *Flags); - - - void __RPC_STUB IATSCComponentType_get_Flags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IATSCComponentType_put_Flags_Proxy( - IATSCComponentType * This, - /* [in] */ long flags); - - - void __RPC_STUB IATSCComponentType_put_Flags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IATSCComponentType_INTERFACE_DEFINED__ */ - - - #ifndef __IEnumComponentTypes_INTERFACE_DEFINED__ - #define __IEnumComponentTypes_INTERFACE_DEFINED__ - - /* interface IEnumComponentTypes */ - /* [unique][uuid][object][restricted][hidden] */ - - - EXTERN_C const IID IID_IEnumComponentTypes; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("8A674B4A-1F63-11d3-B64C-00C04F79498E") - IEnumComponentTypes : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Next( - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ IComponentType **rgelt, - /* [out] */ ULONG *pceltFetched) = 0; - - virtual HRESULT STDMETHODCALLTYPE Skip( - /* [in] */ ULONG celt) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - /* [out] */ IEnumComponentTypes **ppEnum) = 0; - - }; - - #else /* C style interface */ - - typedef struct IEnumComponentTypesVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IEnumComponentTypes * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IEnumComponentTypes * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IEnumComponentTypes * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - IEnumComponentTypes * This, - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ IComponentType **rgelt, - /* [out] */ ULONG *pceltFetched); - - HRESULT ( STDMETHODCALLTYPE *Skip )( - IEnumComponentTypes * This, - /* [in] */ ULONG celt); - - HRESULT ( STDMETHODCALLTYPE *Reset )( - IEnumComponentTypes * This); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IEnumComponentTypes * This, - /* [out] */ IEnumComponentTypes **ppEnum); - - END_INTERFACE - } IEnumComponentTypesVtbl; - - interface IEnumComponentTypes - { - CONST_VTBL struct IEnumComponentTypesVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IEnumComponentTypes_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IEnumComponentTypes_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IEnumComponentTypes_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IEnumComponentTypes_Next(This,celt,rgelt,pceltFetched) \ - (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) - - #define IEnumComponentTypes_Skip(This,celt) \ - (This)->lpVtbl -> Skip(This,celt) - - #define IEnumComponentTypes_Reset(This) \ - (This)->lpVtbl -> Reset(This) - - #define IEnumComponentTypes_Clone(This,ppEnum) \ - (This)->lpVtbl -> Clone(This,ppEnum) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - HRESULT STDMETHODCALLTYPE IEnumComponentTypes_Next_Proxy( - IEnumComponentTypes * This, - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ IComponentType **rgelt, - /* [out] */ ULONG *pceltFetched); - - - void __RPC_STUB IEnumComponentTypes_Next_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IEnumComponentTypes_Skip_Proxy( - IEnumComponentTypes * This, - /* [in] */ ULONG celt); - - - void __RPC_STUB IEnumComponentTypes_Skip_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IEnumComponentTypes_Reset_Proxy( - IEnumComponentTypes * This); - - - void __RPC_STUB IEnumComponentTypes_Reset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IEnumComponentTypes_Clone_Proxy( - IEnumComponentTypes * This, - /* [out] */ IEnumComponentTypes **ppEnum); - - - void __RPC_STUB IEnumComponentTypes_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IEnumComponentTypes_INTERFACE_DEFINED__ */ - - - #ifndef __IComponentTypes_INTERFACE_DEFINED__ - #define __IComponentTypes_INTERFACE_DEFINED__ - - /* interface IComponentTypes */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_IComponentTypes; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("0DC13D4A-0313-11d3-9D8E-00C04F72D980") - IComponentTypes : public IDispatch - { - public: - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( - /* [retval][out] */ long *Count) = 0; - - virtual /* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( - /* [retval][out] */ IEnumVARIANT **ppNewEnum) = 0; - - virtual /* [helpstring][restricted][hidden] */ HRESULT STDMETHODCALLTYPE EnumComponentTypes( - /* [retval][out] */ IEnumComponentTypes **ppNewEnum) = 0; - - virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Item( - /* [in] */ VARIANT Index, - /* [retval][out] */ IComponentType **ComponentType) = 0; - - virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_Item( - /* [in] */ VARIANT Index, - /* [in] */ IComponentType *ComponentType) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( - /* [in] */ IComponentType *ComponentType, - /* [retval][out] */ VARIANT *NewIndex) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( - /* [in] */ VARIANT Index) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Clone( - /* [retval][out] */ IComponentTypes **NewList) = 0; - - }; - - #else /* C style interface */ - - typedef struct IComponentTypesVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IComponentTypes * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IComponentTypes * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IComponentTypes * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IComponentTypes * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IComponentTypes * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IComponentTypes * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IComponentTypes * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( - IComponentTypes * This, - /* [retval][out] */ long *Count); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( - IComponentTypes * This, - /* [retval][out] */ IEnumVARIANT **ppNewEnum); - - /* [helpstring][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *EnumComponentTypes )( - IComponentTypes * This, - /* [retval][out] */ IEnumComponentTypes **ppNewEnum); - - /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Item )( - IComponentTypes * This, - /* [in] */ VARIANT Index, - /* [retval][out] */ IComponentType **ComponentType); - - /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_Item )( - IComponentTypes * This, - /* [in] */ VARIANT Index, - /* [in] */ IComponentType *ComponentType); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( - IComponentTypes * This, - /* [in] */ IComponentType *ComponentType, - /* [retval][out] */ VARIANT *NewIndex); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( - IComponentTypes * This, - /* [in] */ VARIANT Index); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IComponentTypes * This, - /* [retval][out] */ IComponentTypes **NewList); - - END_INTERFACE - } IComponentTypesVtbl; - - interface IComponentTypes - { - CONST_VTBL struct IComponentTypesVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IComponentTypes_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IComponentTypes_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IComponentTypes_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IComponentTypes_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IComponentTypes_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IComponentTypes_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IComponentTypes_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IComponentTypes_get_Count(This,Count) \ - (This)->lpVtbl -> get_Count(This,Count) - - #define IComponentTypes_get__NewEnum(This,ppNewEnum) \ - (This)->lpVtbl -> get__NewEnum(This,ppNewEnum) - - #define IComponentTypes_EnumComponentTypes(This,ppNewEnum) \ - (This)->lpVtbl -> EnumComponentTypes(This,ppNewEnum) - - #define IComponentTypes_get_Item(This,Index,ComponentType) \ - (This)->lpVtbl -> get_Item(This,Index,ComponentType) - - #define IComponentTypes_put_Item(This,Index,ComponentType) \ - (This)->lpVtbl -> put_Item(This,Index,ComponentType) - - #define IComponentTypes_Add(This,ComponentType,NewIndex) \ - (This)->lpVtbl -> Add(This,ComponentType,NewIndex) - - #define IComponentTypes_Remove(This,Index) \ - (This)->lpVtbl -> Remove(This,Index) - - #define IComponentTypes_Clone(This,NewList) \ - (This)->lpVtbl -> Clone(This,NewList) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IComponentTypes_get_Count_Proxy( - IComponentTypes * This, - /* [retval][out] */ long *Count); - - - void __RPC_STUB IComponentTypes_get_Count_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE IComponentTypes_get__NewEnum_Proxy( - IComponentTypes * This, - /* [retval][out] */ IEnumVARIANT **ppNewEnum); - - - void __RPC_STUB IComponentTypes_get__NewEnum_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][restricted][hidden] */ HRESULT STDMETHODCALLTYPE IComponentTypes_EnumComponentTypes_Proxy( - IComponentTypes * This, - /* [retval][out] */ IEnumComponentTypes **ppNewEnum); - - - void __RPC_STUB IComponentTypes_EnumComponentTypes_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IComponentTypes_get_Item_Proxy( - IComponentTypes * This, - /* [in] */ VARIANT Index, - /* [retval][out] */ IComponentType **ComponentType); - - - void __RPC_STUB IComponentTypes_get_Item_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IComponentTypes_put_Item_Proxy( - IComponentTypes * This, - /* [in] */ VARIANT Index, - /* [in] */ IComponentType *ComponentType); - - - void __RPC_STUB IComponentTypes_put_Item_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IComponentTypes_Add_Proxy( - IComponentTypes * This, - /* [in] */ IComponentType *ComponentType, - /* [retval][out] */ VARIANT *NewIndex); - - - void __RPC_STUB IComponentTypes_Add_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IComponentTypes_Remove_Proxy( - IComponentTypes * This, - /* [in] */ VARIANT Index); - - - void __RPC_STUB IComponentTypes_Remove_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IComponentTypes_Clone_Proxy( - IComponentTypes * This, - /* [retval][out] */ IComponentTypes **NewList); - - - void __RPC_STUB IComponentTypes_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IComponentTypes_INTERFACE_DEFINED__ */ - - - #ifndef __IComponent_INTERFACE_DEFINED__ - #define __IComponent_INTERFACE_DEFINED__ - - /* interface IComponent */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - - EXTERN_C const IID IID_IComponent; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("1A5576FC-0E19-11d3-9D8E-00C04F72D980") - IComponent : public IDispatch - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Type( - /* [retval][out] */ IComponentType **CT) = 0; - - virtual /* [helpstring][id][propput][restricted][hidden] */ HRESULT STDMETHODCALLTYPE put_Type( - /* [in] */ IComponentType *CT) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_DescLangID( - /* [retval][out] */ long *LangID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_DescLangID( - /* [in] */ long LangID) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Status( - /* [retval][out] */ ComponentStatus *Status) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Status( - /* [in] */ ComponentStatus Status) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Description( - /* [retval][out] */ BSTR *Description) = 0; - - virtual /* [helpstring][id][propput][restricted][hidden] */ HRESULT STDMETHODCALLTYPE put_Description( - /* [in] */ BSTR Description) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clone( - /* [retval][out] */ IComponent **NewComponent) = 0; - - }; - - #else /* C style interface */ - - typedef struct IComponentVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IComponent * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IComponent * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IComponent * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IComponent * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IComponent * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IComponent * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IComponent * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( - IComponent * This, - /* [retval][out] */ IComponentType **CT); - - /* [helpstring][id][propput][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *put_Type )( - IComponent * This, - /* [in] */ IComponentType *CT); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DescLangID )( - IComponent * This, - /* [retval][out] */ long *LangID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DescLangID )( - IComponent * This, - /* [in] */ long LangID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( - IComponent * This, - /* [retval][out] */ ComponentStatus *Status); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Status )( - IComponent * This, - /* [in] */ ComponentStatus Status); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Description )( - IComponent * This, - /* [retval][out] */ BSTR *Description); - - /* [helpstring][id][propput][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *put_Description )( - IComponent * This, - /* [in] */ BSTR Description); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IComponent * This, - /* [retval][out] */ IComponent **NewComponent); - - END_INTERFACE - } IComponentVtbl; - - interface IComponent - { - CONST_VTBL struct IComponentVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IComponent_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IComponent_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IComponent_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IComponent_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IComponent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IComponent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IComponent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IComponent_get_Type(This,CT) \ - (This)->lpVtbl -> get_Type(This,CT) - - #define IComponent_put_Type(This,CT) \ - (This)->lpVtbl -> put_Type(This,CT) - - #define IComponent_get_DescLangID(This,LangID) \ - (This)->lpVtbl -> get_DescLangID(This,LangID) - - #define IComponent_put_DescLangID(This,LangID) \ - (This)->lpVtbl -> put_DescLangID(This,LangID) - - #define IComponent_get_Status(This,Status) \ - (This)->lpVtbl -> get_Status(This,Status) - - #define IComponent_put_Status(This,Status) \ - (This)->lpVtbl -> put_Status(This,Status) - - #define IComponent_get_Description(This,Description) \ - (This)->lpVtbl -> get_Description(This,Description) - - #define IComponent_put_Description(This,Description) \ - (This)->lpVtbl -> put_Description(This,Description) - - #define IComponent_Clone(This,NewComponent) \ - (This)->lpVtbl -> Clone(This,NewComponent) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponent_get_Type_Proxy( - IComponent * This, - /* [retval][out] */ IComponentType **CT); - - - void __RPC_STUB IComponent_get_Type_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput][restricted][hidden] */ HRESULT STDMETHODCALLTYPE IComponent_put_Type_Proxy( - IComponent * This, - /* [in] */ IComponentType *CT); - - - void __RPC_STUB IComponent_put_Type_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponent_get_DescLangID_Proxy( - IComponent * This, - /* [retval][out] */ long *LangID); - - - void __RPC_STUB IComponent_get_DescLangID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponent_put_DescLangID_Proxy( - IComponent * This, - /* [in] */ long LangID); - - - void __RPC_STUB IComponent_put_DescLangID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponent_get_Status_Proxy( - IComponent * This, - /* [retval][out] */ ComponentStatus *Status); - - - void __RPC_STUB IComponent_get_Status_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IComponent_put_Status_Proxy( - IComponent * This, - /* [in] */ ComponentStatus Status); - - - void __RPC_STUB IComponent_put_Status_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IComponent_get_Description_Proxy( - IComponent * This, - /* [retval][out] */ BSTR *Description); - - - void __RPC_STUB IComponent_get_Description_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput][restricted][hidden] */ HRESULT STDMETHODCALLTYPE IComponent_put_Description_Proxy( - IComponent * This, - /* [in] */ BSTR Description); - - - void __RPC_STUB IComponent_put_Description_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IComponent_Clone_Proxy( - IComponent * This, - /* [retval][out] */ IComponent **NewComponent); - - - void __RPC_STUB IComponent_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IComponent_INTERFACE_DEFINED__ */ - - - #ifndef __IMPEG2Component_INTERFACE_DEFINED__ - #define __IMPEG2Component_INTERFACE_DEFINED__ - - /* interface IMPEG2Component */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - - EXTERN_C const IID IID_IMPEG2Component; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("1493E353-1EB6-473c-802D-8E6B8EC9D2A9") - IMPEG2Component : public IComponent - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_PID( - /* [retval][out] */ long *PID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_PID( - /* [in] */ long PID) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_PCRPID( - /* [retval][out] */ long *PCRPID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_PCRPID( - /* [in] */ long PCRPID) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ProgramNumber( - /* [retval][out] */ long *ProgramNumber) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ProgramNumber( - /* [in] */ long ProgramNumber) = 0; - - }; - - #else /* C style interface */ - - typedef struct IMPEG2ComponentVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IMPEG2Component * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IMPEG2Component * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IMPEG2Component * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IMPEG2Component * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IMPEG2Component * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IMPEG2Component * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IMPEG2Component * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( - IMPEG2Component * This, - /* [retval][out] */ IComponentType **CT); - - /* [helpstring][id][propput][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *put_Type )( - IMPEG2Component * This, - /* [in] */ IComponentType *CT); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DescLangID )( - IMPEG2Component * This, - /* [retval][out] */ long *LangID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DescLangID )( - IMPEG2Component * This, - /* [in] */ long LangID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( - IMPEG2Component * This, - /* [retval][out] */ ComponentStatus *Status); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Status )( - IMPEG2Component * This, - /* [in] */ ComponentStatus Status); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Description )( - IMPEG2Component * This, - /* [retval][out] */ BSTR *Description); - - /* [helpstring][id][propput][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *put_Description )( - IMPEG2Component * This, - /* [in] */ BSTR Description); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IMPEG2Component * This, - /* [retval][out] */ IComponent **NewComponent); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PID )( - IMPEG2Component * This, - /* [retval][out] */ long *PID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_PID )( - IMPEG2Component * This, - /* [in] */ long PID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PCRPID )( - IMPEG2Component * This, - /* [retval][out] */ long *PCRPID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_PCRPID )( - IMPEG2Component * This, - /* [in] */ long PCRPID); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProgramNumber )( - IMPEG2Component * This, - /* [retval][out] */ long *ProgramNumber); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ProgramNumber )( - IMPEG2Component * This, - /* [in] */ long ProgramNumber); - - END_INTERFACE - } IMPEG2ComponentVtbl; - - interface IMPEG2Component - { - CONST_VTBL struct IMPEG2ComponentVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IMPEG2Component_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IMPEG2Component_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IMPEG2Component_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IMPEG2Component_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IMPEG2Component_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IMPEG2Component_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IMPEG2Component_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IMPEG2Component_get_Type(This,CT) \ - (This)->lpVtbl -> get_Type(This,CT) - - #define IMPEG2Component_put_Type(This,CT) \ - (This)->lpVtbl -> put_Type(This,CT) - - #define IMPEG2Component_get_DescLangID(This,LangID) \ - (This)->lpVtbl -> get_DescLangID(This,LangID) - - #define IMPEG2Component_put_DescLangID(This,LangID) \ - (This)->lpVtbl -> put_DescLangID(This,LangID) - - #define IMPEG2Component_get_Status(This,Status) \ - (This)->lpVtbl -> get_Status(This,Status) - - #define IMPEG2Component_put_Status(This,Status) \ - (This)->lpVtbl -> put_Status(This,Status) - - #define IMPEG2Component_get_Description(This,Description) \ - (This)->lpVtbl -> get_Description(This,Description) - - #define IMPEG2Component_put_Description(This,Description) \ - (This)->lpVtbl -> put_Description(This,Description) - - #define IMPEG2Component_Clone(This,NewComponent) \ - (This)->lpVtbl -> Clone(This,NewComponent) - - - #define IMPEG2Component_get_PID(This,PID) \ - (This)->lpVtbl -> get_PID(This,PID) - - #define IMPEG2Component_put_PID(This,PID) \ - (This)->lpVtbl -> put_PID(This,PID) - - #define IMPEG2Component_get_PCRPID(This,PCRPID) \ - (This)->lpVtbl -> get_PCRPID(This,PCRPID) - - #define IMPEG2Component_put_PCRPID(This,PCRPID) \ - (This)->lpVtbl -> put_PCRPID(This,PCRPID) - - #define IMPEG2Component_get_ProgramNumber(This,ProgramNumber) \ - (This)->lpVtbl -> get_ProgramNumber(This,ProgramNumber) - - #define IMPEG2Component_put_ProgramNumber(This,ProgramNumber) \ - (This)->lpVtbl -> put_ProgramNumber(This,ProgramNumber) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMPEG2Component_get_PID_Proxy( - IMPEG2Component * This, - /* [retval][out] */ long *PID); - - - void __RPC_STUB IMPEG2Component_get_PID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IMPEG2Component_put_PID_Proxy( - IMPEG2Component * This, - /* [in] */ long PID); - - - void __RPC_STUB IMPEG2Component_put_PID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMPEG2Component_get_PCRPID_Proxy( - IMPEG2Component * This, - /* [retval][out] */ long *PCRPID); - - - void __RPC_STUB IMPEG2Component_get_PCRPID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IMPEG2Component_put_PCRPID_Proxy( - IMPEG2Component * This, - /* [in] */ long PCRPID); - - - void __RPC_STUB IMPEG2Component_put_PCRPID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IMPEG2Component_get_ProgramNumber_Proxy( - IMPEG2Component * This, - /* [retval][out] */ long *ProgramNumber); - - - void __RPC_STUB IMPEG2Component_get_ProgramNumber_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IMPEG2Component_put_ProgramNumber_Proxy( - IMPEG2Component * This, - /* [in] */ long ProgramNumber); - - - void __RPC_STUB IMPEG2Component_put_ProgramNumber_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IMPEG2Component_INTERFACE_DEFINED__ */ - - - #ifndef __IEnumComponents_INTERFACE_DEFINED__ - #define __IEnumComponents_INTERFACE_DEFINED__ - - /* interface IEnumComponents */ - /* [unique][uuid][object][restricted][hidden] */ - - - EXTERN_C const IID IID_IEnumComponents; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("2A6E2939-2595-11d3-B64C-00C04F79498E") - IEnumComponents : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Next( - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ IComponent **rgelt, - /* [out] */ ULONG *pceltFetched) = 0; - - virtual HRESULT STDMETHODCALLTYPE Skip( - /* [in] */ ULONG celt) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - /* [out] */ IEnumComponents **ppEnum) = 0; - - }; - - #else /* C style interface */ - - typedef struct IEnumComponentsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IEnumComponents * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IEnumComponents * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IEnumComponents * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - IEnumComponents * This, - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ IComponent **rgelt, - /* [out] */ ULONG *pceltFetched); - - HRESULT ( STDMETHODCALLTYPE *Skip )( - IEnumComponents * This, - /* [in] */ ULONG celt); - - HRESULT ( STDMETHODCALLTYPE *Reset )( - IEnumComponents * This); - - HRESULT ( STDMETHODCALLTYPE *Clone )( - IEnumComponents * This, - /* [out] */ IEnumComponents **ppEnum); - - END_INTERFACE - } IEnumComponentsVtbl; - - interface IEnumComponents - { - CONST_VTBL struct IEnumComponentsVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IEnumComponents_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IEnumComponents_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IEnumComponents_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IEnumComponents_Next(This,celt,rgelt,pceltFetched) \ - (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) - - #define IEnumComponents_Skip(This,celt) \ - (This)->lpVtbl -> Skip(This,celt) - - #define IEnumComponents_Reset(This) \ - (This)->lpVtbl -> Reset(This) - - #define IEnumComponents_Clone(This,ppEnum) \ - (This)->lpVtbl -> Clone(This,ppEnum) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - HRESULT STDMETHODCALLTYPE IEnumComponents_Next_Proxy( - IEnumComponents * This, - /* [in] */ ULONG celt, - /* [length_is][size_is][out] */ IComponent **rgelt, - /* [out] */ ULONG *pceltFetched); - - - void __RPC_STUB IEnumComponents_Next_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IEnumComponents_Skip_Proxy( - IEnumComponents * This, - /* [in] */ ULONG celt); - - - void __RPC_STUB IEnumComponents_Skip_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IEnumComponents_Reset_Proxy( - IEnumComponents * This); - - - void __RPC_STUB IEnumComponents_Reset_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - HRESULT STDMETHODCALLTYPE IEnumComponents_Clone_Proxy( - IEnumComponents * This, - /* [out] */ IEnumComponents **ppEnum); - - - void __RPC_STUB IEnumComponents_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IEnumComponents_INTERFACE_DEFINED__ */ - - - #ifndef __IComponents_INTERFACE_DEFINED__ - #define __IComponents_INTERFACE_DEFINED__ - - /* interface IComponents */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - - EXTERN_C const IID IID_IComponents; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("FCD01846-0E19-11d3-9D8E-00C04F72D980") - IComponents : public IDispatch - { - public: - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Count( - /* [retval][out] */ long *Count) = 0; - - virtual /* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( - /* [retval][out] */ IEnumVARIANT **ppNewEnum) = 0; - - virtual /* [helpstring][restricted][hidden] */ HRESULT STDMETHODCALLTYPE EnumComponents( - /* [retval][out] */ IEnumComponents **ppNewEnum) = 0; - - virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Item( - /* [in] */ VARIANT Index, - /* [retval][out] */ IComponent **ppComponent) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( - /* [in] */ IComponent *Component, - /* [retval][out] */ VARIANT *NewIndex) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( - /* [in] */ VARIANT Index) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Clone( - /* [retval][out] */ IComponents **NewList) = 0; - - }; - - #else /* C style interface */ - - typedef struct IComponentsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IComponents * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IComponents * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IComponents * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IComponents * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IComponents * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IComponents * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IComponents * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( - IComponents * This, - /* [retval][out] */ long *Count); - - /* [restricted][hidden][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( - IComponents * This, - /* [retval][out] */ IEnumVARIANT **ppNewEnum); - - /* [helpstring][restricted][hidden] */ HRESULT ( STDMETHODCALLTYPE *EnumComponents )( - IComponents * This, - /* [retval][out] */ IEnumComponents **ppNewEnum); - - /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Item )( - IComponents * This, - /* [in] */ VARIANT Index, - /* [retval][out] */ IComponent **ppComponent); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( - IComponents * This, - /* [in] */ IComponent *Component, - /* [retval][out] */ VARIANT *NewIndex); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( - IComponents * This, - /* [in] */ VARIANT Index); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IComponents * This, - /* [retval][out] */ IComponents **NewList); - - END_INTERFACE - } IComponentsVtbl; - - interface IComponents - { - CONST_VTBL struct IComponentsVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IComponents_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IComponents_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IComponents_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IComponents_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IComponents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IComponents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IComponents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IComponents_get_Count(This,Count) \ - (This)->lpVtbl -> get_Count(This,Count) - - #define IComponents_get__NewEnum(This,ppNewEnum) \ - (This)->lpVtbl -> get__NewEnum(This,ppNewEnum) - - #define IComponents_EnumComponents(This,ppNewEnum) \ - (This)->lpVtbl -> EnumComponents(This,ppNewEnum) - - #define IComponents_get_Item(This,Index,ppComponent) \ - (This)->lpVtbl -> get_Item(This,Index,ppComponent) - - #define IComponents_Add(This,Component,NewIndex) \ - (This)->lpVtbl -> Add(This,Component,NewIndex) - - #define IComponents_Remove(This,Index) \ - (This)->lpVtbl -> Remove(This,Index) - - #define IComponents_Clone(This,NewList) \ - (This)->lpVtbl -> Clone(This,NewList) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IComponents_get_Count_Proxy( - IComponents * This, - /* [retval][out] */ long *Count); - - - void __RPC_STUB IComponents_get_Count_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [restricted][hidden][id][propget] */ HRESULT STDMETHODCALLTYPE IComponents_get__NewEnum_Proxy( - IComponents * This, - /* [retval][out] */ IEnumVARIANT **ppNewEnum); - - - void __RPC_STUB IComponents_get__NewEnum_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][restricted][hidden] */ HRESULT STDMETHODCALLTYPE IComponents_EnumComponents_Proxy( - IComponents * This, - /* [retval][out] */ IEnumComponents **ppNewEnum); - - - void __RPC_STUB IComponents_EnumComponents_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IComponents_get_Item_Proxy( - IComponents * This, - /* [in] */ VARIANT Index, - /* [retval][out] */ IComponent **ppComponent); - - - void __RPC_STUB IComponents_get_Item_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IComponents_Add_Proxy( - IComponents * This, - /* [in] */ IComponent *Component, - /* [retval][out] */ VARIANT *NewIndex); - - - void __RPC_STUB IComponents_Add_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IComponents_Remove_Proxy( - IComponents * This, - /* [in] */ VARIANT Index); - - - void __RPC_STUB IComponents_Remove_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring] */ HRESULT STDMETHODCALLTYPE IComponents_Clone_Proxy( - IComponents * This, - /* [retval][out] */ IComponents **NewList); - - - void __RPC_STUB IComponents_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IComponents_INTERFACE_DEFINED__ */ - - - #ifndef __ILocator_INTERFACE_DEFINED__ - #define __ILocator_INTERFACE_DEFINED__ - - /* interface ILocator */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][object] */ - - - EXTERN_C const IID IID_ILocator; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("286D7F89-760C-4F89-80C4-66841D2507AA") - ILocator : public IDispatch - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CarrierFrequency( - /* [retval][out] */ long *Frequency) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_CarrierFrequency( - /* [in] */ long Frequency) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_InnerFEC( - /* [retval][out] */ FECMethod *FEC) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_InnerFEC( - /* [in] */ FECMethod FEC) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_InnerFECRate( - /* [retval][out] */ BinaryConvolutionCodeRate *FEC) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_InnerFECRate( - /* [in] */ BinaryConvolutionCodeRate FEC) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OuterFEC( - /* [retval][out] */ FECMethod *FEC) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_OuterFEC( - /* [in] */ FECMethod FEC) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OuterFECRate( - /* [retval][out] */ BinaryConvolutionCodeRate *FEC) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_OuterFECRate( - /* [in] */ BinaryConvolutionCodeRate FEC) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Modulation( - /* [retval][out] */ ModulationType *Modulation) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Modulation( - /* [in] */ ModulationType Modulation) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SymbolRate( - /* [retval][out] */ long *Rate) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SymbolRate( - /* [in] */ long Rate) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clone( - /* [retval][out] */ ILocator **NewLocator) = 0; - - }; - - #else /* C style interface */ - - typedef struct ILocatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILocator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ILocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ILocator * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - ILocator * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - ILocator * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - ILocator * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - ILocator * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CarrierFrequency )( - ILocator * This, - /* [retval][out] */ long *Frequency); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CarrierFrequency )( - ILocator * This, - /* [in] */ long Frequency); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFEC )( - ILocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFEC )( - ILocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFECRate )( - ILocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFECRate )( - ILocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFEC )( - ILocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFEC )( - ILocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFECRate )( - ILocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFECRate )( - ILocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Modulation )( - ILocator * This, - /* [retval][out] */ ModulationType *Modulation); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Modulation )( - ILocator * This, - /* [in] */ ModulationType Modulation); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SymbolRate )( - ILocator * This, - /* [retval][out] */ long *Rate); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SymbolRate )( - ILocator * This, - /* [in] */ long Rate); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - ILocator * This, - /* [retval][out] */ ILocator **NewLocator); - - END_INTERFACE - } ILocatorVtbl; - - interface ILocator - { - CONST_VTBL struct ILocatorVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define ILocator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define ILocator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define ILocator_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define ILocator_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define ILocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define ILocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define ILocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define ILocator_get_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> get_CarrierFrequency(This,Frequency) - - #define ILocator_put_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> put_CarrierFrequency(This,Frequency) - - #define ILocator_get_InnerFEC(This,FEC) \ - (This)->lpVtbl -> get_InnerFEC(This,FEC) - - #define ILocator_put_InnerFEC(This,FEC) \ - (This)->lpVtbl -> put_InnerFEC(This,FEC) - - #define ILocator_get_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> get_InnerFECRate(This,FEC) - - #define ILocator_put_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> put_InnerFECRate(This,FEC) - - #define ILocator_get_OuterFEC(This,FEC) \ - (This)->lpVtbl -> get_OuterFEC(This,FEC) - - #define ILocator_put_OuterFEC(This,FEC) \ - (This)->lpVtbl -> put_OuterFEC(This,FEC) - - #define ILocator_get_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> get_OuterFECRate(This,FEC) - - #define ILocator_put_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> put_OuterFECRate(This,FEC) - - #define ILocator_get_Modulation(This,Modulation) \ - (This)->lpVtbl -> get_Modulation(This,Modulation) - - #define ILocator_put_Modulation(This,Modulation) \ - (This)->lpVtbl -> put_Modulation(This,Modulation) - - #define ILocator_get_SymbolRate(This,Rate) \ - (This)->lpVtbl -> get_SymbolRate(This,Rate) - - #define ILocator_put_SymbolRate(This,Rate) \ - (This)->lpVtbl -> put_SymbolRate(This,Rate) - - #define ILocator_Clone(This,NewLocator) \ - (This)->lpVtbl -> Clone(This,NewLocator) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ILocator_get_CarrierFrequency_Proxy( - ILocator * This, - /* [retval][out] */ long *Frequency); - - - void __RPC_STUB ILocator_get_CarrierFrequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ILocator_put_CarrierFrequency_Proxy( - ILocator * This, - /* [in] */ long Frequency); - - - void __RPC_STUB ILocator_put_CarrierFrequency_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ILocator_get_InnerFEC_Proxy( - ILocator * This, - /* [retval][out] */ FECMethod *FEC); - - - void __RPC_STUB ILocator_get_InnerFEC_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ILocator_put_InnerFEC_Proxy( - ILocator * This, - /* [in] */ FECMethod FEC); - - - void __RPC_STUB ILocator_put_InnerFEC_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ILocator_get_InnerFECRate_Proxy( - ILocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - - void __RPC_STUB ILocator_get_InnerFECRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ILocator_put_InnerFECRate_Proxy( - ILocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - - void __RPC_STUB ILocator_put_InnerFECRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ILocator_get_OuterFEC_Proxy( - ILocator * This, - /* [retval][out] */ FECMethod *FEC); - - - void __RPC_STUB ILocator_get_OuterFEC_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ILocator_put_OuterFEC_Proxy( - ILocator * This, - /* [in] */ FECMethod FEC); - - - void __RPC_STUB ILocator_put_OuterFEC_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ILocator_get_OuterFECRate_Proxy( - ILocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - - void __RPC_STUB ILocator_get_OuterFECRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ILocator_put_OuterFECRate_Proxy( - ILocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - - void __RPC_STUB ILocator_put_OuterFECRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ILocator_get_Modulation_Proxy( - ILocator * This, - /* [retval][out] */ ModulationType *Modulation); - - - void __RPC_STUB ILocator_get_Modulation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ILocator_put_Modulation_Proxy( - ILocator * This, - /* [in] */ ModulationType Modulation); - - - void __RPC_STUB ILocator_put_Modulation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE ILocator_get_SymbolRate_Proxy( - ILocator * This, - /* [retval][out] */ long *Rate); - - - void __RPC_STUB ILocator_get_SymbolRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE ILocator_put_SymbolRate_Proxy( - ILocator * This, - /* [in] */ long Rate); - - - void __RPC_STUB ILocator_put_SymbolRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ILocator_Clone_Proxy( - ILocator * This, - /* [retval][out] */ ILocator **NewLocator); - - - void __RPC_STUB ILocator_Clone_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __ILocator_INTERFACE_DEFINED__ */ - - - #ifndef __IATSCLocator_INTERFACE_DEFINED__ - #define __IATSCLocator_INTERFACE_DEFINED__ - - /* interface IATSCLocator */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_IATSCLocator; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("BF8D986F-8C2B-4131-94D7-4D3D9FCC21EF") - IATSCLocator : public ILocator - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_PhysicalChannel( - /* [retval][out] */ long *PhysicalChannel) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_PhysicalChannel( - /* [in] */ long PhysicalChannel) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_TSID( - /* [retval][out] */ long *TSID) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_TSID( - /* [in] */ long TSID) = 0; - - }; - - #else /* C style interface */ - - typedef struct IATSCLocatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IATSCLocator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IATSCLocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IATSCLocator * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IATSCLocator * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IATSCLocator * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IATSCLocator * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IATSCLocator * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CarrierFrequency )( - IATSCLocator * This, - /* [retval][out] */ long *Frequency); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CarrierFrequency )( - IATSCLocator * This, - /* [in] */ long Frequency); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFEC )( - IATSCLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFEC )( - IATSCLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFECRate )( - IATSCLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFECRate )( - IATSCLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFEC )( - IATSCLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFEC )( - IATSCLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFECRate )( - IATSCLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFECRate )( - IATSCLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Modulation )( - IATSCLocator * This, - /* [retval][out] */ ModulationType *Modulation); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Modulation )( - IATSCLocator * This, - /* [in] */ ModulationType Modulation); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SymbolRate )( - IATSCLocator * This, - /* [retval][out] */ long *Rate); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SymbolRate )( - IATSCLocator * This, - /* [in] */ long Rate); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IATSCLocator * This, - /* [retval][out] */ ILocator **NewLocator); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PhysicalChannel )( - IATSCLocator * This, - /* [retval][out] */ long *PhysicalChannel); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_PhysicalChannel )( - IATSCLocator * This, - /* [in] */ long PhysicalChannel); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_TSID )( - IATSCLocator * This, - /* [retval][out] */ long *TSID); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_TSID )( - IATSCLocator * This, - /* [in] */ long TSID); - - END_INTERFACE - } IATSCLocatorVtbl; - - interface IATSCLocator - { - CONST_VTBL struct IATSCLocatorVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IATSCLocator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IATSCLocator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IATSCLocator_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IATSCLocator_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IATSCLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IATSCLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IATSCLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IATSCLocator_get_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> get_CarrierFrequency(This,Frequency) - - #define IATSCLocator_put_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> put_CarrierFrequency(This,Frequency) - - #define IATSCLocator_get_InnerFEC(This,FEC) \ - (This)->lpVtbl -> get_InnerFEC(This,FEC) - - #define IATSCLocator_put_InnerFEC(This,FEC) \ - (This)->lpVtbl -> put_InnerFEC(This,FEC) - - #define IATSCLocator_get_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> get_InnerFECRate(This,FEC) - - #define IATSCLocator_put_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> put_InnerFECRate(This,FEC) - - #define IATSCLocator_get_OuterFEC(This,FEC) \ - (This)->lpVtbl -> get_OuterFEC(This,FEC) - - #define IATSCLocator_put_OuterFEC(This,FEC) \ - (This)->lpVtbl -> put_OuterFEC(This,FEC) - - #define IATSCLocator_get_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> get_OuterFECRate(This,FEC) - - #define IATSCLocator_put_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> put_OuterFECRate(This,FEC) - - #define IATSCLocator_get_Modulation(This,Modulation) \ - (This)->lpVtbl -> get_Modulation(This,Modulation) - - #define IATSCLocator_put_Modulation(This,Modulation) \ - (This)->lpVtbl -> put_Modulation(This,Modulation) - - #define IATSCLocator_get_SymbolRate(This,Rate) \ - (This)->lpVtbl -> get_SymbolRate(This,Rate) - - #define IATSCLocator_put_SymbolRate(This,Rate) \ - (This)->lpVtbl -> put_SymbolRate(This,Rate) - - #define IATSCLocator_Clone(This,NewLocator) \ - (This)->lpVtbl -> Clone(This,NewLocator) - - - #define IATSCLocator_get_PhysicalChannel(This,PhysicalChannel) \ - (This)->lpVtbl -> get_PhysicalChannel(This,PhysicalChannel) - - #define IATSCLocator_put_PhysicalChannel(This,PhysicalChannel) \ - (This)->lpVtbl -> put_PhysicalChannel(This,PhysicalChannel) - - #define IATSCLocator_get_TSID(This,TSID) \ - (This)->lpVtbl -> get_TSID(This,TSID) - - #define IATSCLocator_put_TSID(This,TSID) \ - (This)->lpVtbl -> put_TSID(This,TSID) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IATSCLocator_get_PhysicalChannel_Proxy( - IATSCLocator * This, - /* [retval][out] */ long *PhysicalChannel); - - - void __RPC_STUB IATSCLocator_get_PhysicalChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IATSCLocator_put_PhysicalChannel_Proxy( - IATSCLocator * This, - /* [in] */ long PhysicalChannel); - - - void __RPC_STUB IATSCLocator_put_PhysicalChannel_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IATSCLocator_get_TSID_Proxy( - IATSCLocator * This, - /* [retval][out] */ long *TSID); - - - void __RPC_STUB IATSCLocator_get_TSID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IATSCLocator_put_TSID_Proxy( - IATSCLocator * This, - /* [in] */ long TSID); - - - void __RPC_STUB IATSCLocator_put_TSID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IATSCLocator_INTERFACE_DEFINED__ */ - - - #ifndef __IDVBTLocator_INTERFACE_DEFINED__ - #define __IDVBTLocator_INTERFACE_DEFINED__ - - /* interface IDVBTLocator */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_IDVBTLocator; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("8664DA16-DDA2-42ac-926A-C18F9127C302") - IDVBTLocator : public ILocator - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Bandwidth( - /* [retval][out] */ long *BandWidthVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Bandwidth( - /* [in] */ long BandwidthVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_LPInnerFEC( - /* [retval][out] */ FECMethod *FEC) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_LPInnerFEC( - /* [in] */ FECMethod FEC) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_LPInnerFECRate( - /* [retval][out] */ BinaryConvolutionCodeRate *FEC) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_LPInnerFECRate( - /* [in] */ BinaryConvolutionCodeRate FEC) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_HAlpha( - /* [retval][out] */ HierarchyAlpha *Alpha) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_HAlpha( - /* [in] */ HierarchyAlpha Alpha) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Guard( - /* [retval][out] */ GuardInterval *GI) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Guard( - /* [in] */ GuardInterval GI) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Mode( - /* [retval][out] */ TransmissionMode *mode) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Mode( - /* [in] */ TransmissionMode mode) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OtherFrequencyInUse( - /* [retval][out] */ VARIANT_BOOL *OtherFrequencyInUseVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_OtherFrequencyInUse( - /* [in] */ VARIANT_BOOL OtherFrequencyInUseVal) = 0; - - }; - - #else /* C style interface */ - - typedef struct IDVBTLocatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDVBTLocator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDVBTLocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDVBTLocator * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDVBTLocator * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDVBTLocator * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDVBTLocator * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDVBTLocator * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CarrierFrequency )( - IDVBTLocator * This, - /* [retval][out] */ long *Frequency); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CarrierFrequency )( - IDVBTLocator * This, - /* [in] */ long Frequency); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFEC )( - IDVBTLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFEC )( - IDVBTLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFECRate )( - IDVBTLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFECRate )( - IDVBTLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFEC )( - IDVBTLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFEC )( - IDVBTLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFECRate )( - IDVBTLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFECRate )( - IDVBTLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Modulation )( - IDVBTLocator * This, - /* [retval][out] */ ModulationType *Modulation); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Modulation )( - IDVBTLocator * This, - /* [in] */ ModulationType Modulation); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SymbolRate )( - IDVBTLocator * This, - /* [retval][out] */ long *Rate); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SymbolRate )( - IDVBTLocator * This, - /* [in] */ long Rate); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IDVBTLocator * This, - /* [retval][out] */ ILocator **NewLocator); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Bandwidth )( - IDVBTLocator * This, - /* [retval][out] */ long *BandWidthVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Bandwidth )( - IDVBTLocator * This, - /* [in] */ long BandwidthVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LPInnerFEC )( - IDVBTLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LPInnerFEC )( - IDVBTLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LPInnerFECRate )( - IDVBTLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LPInnerFECRate )( - IDVBTLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HAlpha )( - IDVBTLocator * This, - /* [retval][out] */ HierarchyAlpha *Alpha); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HAlpha )( - IDVBTLocator * This, - /* [in] */ HierarchyAlpha Alpha); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Guard )( - IDVBTLocator * This, - /* [retval][out] */ GuardInterval *GI); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Guard )( - IDVBTLocator * This, - /* [in] */ GuardInterval GI); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Mode )( - IDVBTLocator * This, - /* [retval][out] */ TransmissionMode *mode); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Mode )( - IDVBTLocator * This, - /* [in] */ TransmissionMode mode); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OtherFrequencyInUse )( - IDVBTLocator * This, - /* [retval][out] */ VARIANT_BOOL *OtherFrequencyInUseVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OtherFrequencyInUse )( - IDVBTLocator * This, - /* [in] */ VARIANT_BOOL OtherFrequencyInUseVal); - - END_INTERFACE - } IDVBTLocatorVtbl; - - interface IDVBTLocator - { - CONST_VTBL struct IDVBTLocatorVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IDVBTLocator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IDVBTLocator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IDVBTLocator_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IDVBTLocator_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IDVBTLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IDVBTLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IDVBTLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IDVBTLocator_get_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> get_CarrierFrequency(This,Frequency) - - #define IDVBTLocator_put_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> put_CarrierFrequency(This,Frequency) - - #define IDVBTLocator_get_InnerFEC(This,FEC) \ - (This)->lpVtbl -> get_InnerFEC(This,FEC) - - #define IDVBTLocator_put_InnerFEC(This,FEC) \ - (This)->lpVtbl -> put_InnerFEC(This,FEC) - - #define IDVBTLocator_get_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> get_InnerFECRate(This,FEC) - - #define IDVBTLocator_put_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> put_InnerFECRate(This,FEC) - - #define IDVBTLocator_get_OuterFEC(This,FEC) \ - (This)->lpVtbl -> get_OuterFEC(This,FEC) - - #define IDVBTLocator_put_OuterFEC(This,FEC) \ - (This)->lpVtbl -> put_OuterFEC(This,FEC) - - #define IDVBTLocator_get_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> get_OuterFECRate(This,FEC) - - #define IDVBTLocator_put_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> put_OuterFECRate(This,FEC) - - #define IDVBTLocator_get_Modulation(This,Modulation) \ - (This)->lpVtbl -> get_Modulation(This,Modulation) - - #define IDVBTLocator_put_Modulation(This,Modulation) \ - (This)->lpVtbl -> put_Modulation(This,Modulation) - - #define IDVBTLocator_get_SymbolRate(This,Rate) \ - (This)->lpVtbl -> get_SymbolRate(This,Rate) - - #define IDVBTLocator_put_SymbolRate(This,Rate) \ - (This)->lpVtbl -> put_SymbolRate(This,Rate) - - #define IDVBTLocator_Clone(This,NewLocator) \ - (This)->lpVtbl -> Clone(This,NewLocator) - - - #define IDVBTLocator_get_Bandwidth(This,BandWidthVal) \ - (This)->lpVtbl -> get_Bandwidth(This,BandWidthVal) - - #define IDVBTLocator_put_Bandwidth(This,BandwidthVal) \ - (This)->lpVtbl -> put_Bandwidth(This,BandwidthVal) - - #define IDVBTLocator_get_LPInnerFEC(This,FEC) \ - (This)->lpVtbl -> get_LPInnerFEC(This,FEC) - - #define IDVBTLocator_put_LPInnerFEC(This,FEC) \ - (This)->lpVtbl -> put_LPInnerFEC(This,FEC) - - #define IDVBTLocator_get_LPInnerFECRate(This,FEC) \ - (This)->lpVtbl -> get_LPInnerFECRate(This,FEC) - - #define IDVBTLocator_put_LPInnerFECRate(This,FEC) \ - (This)->lpVtbl -> put_LPInnerFECRate(This,FEC) - - #define IDVBTLocator_get_HAlpha(This,Alpha) \ - (This)->lpVtbl -> get_HAlpha(This,Alpha) - - #define IDVBTLocator_put_HAlpha(This,Alpha) \ - (This)->lpVtbl -> put_HAlpha(This,Alpha) - - #define IDVBTLocator_get_Guard(This,GI) \ - (This)->lpVtbl -> get_Guard(This,GI) - - #define IDVBTLocator_put_Guard(This,GI) \ - (This)->lpVtbl -> put_Guard(This,GI) - - #define IDVBTLocator_get_Mode(This,mode) \ - (This)->lpVtbl -> get_Mode(This,mode) - - #define IDVBTLocator_put_Mode(This,mode) \ - (This)->lpVtbl -> put_Mode(This,mode) - - #define IDVBTLocator_get_OtherFrequencyInUse(This,OtherFrequencyInUseVal) \ - (This)->lpVtbl -> get_OtherFrequencyInUse(This,OtherFrequencyInUseVal) - - #define IDVBTLocator_put_OtherFrequencyInUse(This,OtherFrequencyInUseVal) \ - (This)->lpVtbl -> put_OtherFrequencyInUse(This,OtherFrequencyInUseVal) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_get_Bandwidth_Proxy( - IDVBTLocator * This, - /* [retval][out] */ long *BandWidthVal); - - - void __RPC_STUB IDVBTLocator_get_Bandwidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_put_Bandwidth_Proxy( - IDVBTLocator * This, - /* [in] */ long BandwidthVal); - - - void __RPC_STUB IDVBTLocator_put_Bandwidth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_get_LPInnerFEC_Proxy( - IDVBTLocator * This, - /* [retval][out] */ FECMethod *FEC); - - - void __RPC_STUB IDVBTLocator_get_LPInnerFEC_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_put_LPInnerFEC_Proxy( - IDVBTLocator * This, - /* [in] */ FECMethod FEC); - - - void __RPC_STUB IDVBTLocator_put_LPInnerFEC_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_get_LPInnerFECRate_Proxy( - IDVBTLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - - void __RPC_STUB IDVBTLocator_get_LPInnerFECRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_put_LPInnerFECRate_Proxy( - IDVBTLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - - void __RPC_STUB IDVBTLocator_put_LPInnerFECRate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_get_HAlpha_Proxy( - IDVBTLocator * This, - /* [retval][out] */ HierarchyAlpha *Alpha); - - - void __RPC_STUB IDVBTLocator_get_HAlpha_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_put_HAlpha_Proxy( - IDVBTLocator * This, - /* [in] */ HierarchyAlpha Alpha); - - - void __RPC_STUB IDVBTLocator_put_HAlpha_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_get_Guard_Proxy( - IDVBTLocator * This, - /* [retval][out] */ GuardInterval *GI); - - - void __RPC_STUB IDVBTLocator_get_Guard_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_put_Guard_Proxy( - IDVBTLocator * This, - /* [in] */ GuardInterval GI); - - - void __RPC_STUB IDVBTLocator_put_Guard_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_get_Mode_Proxy( - IDVBTLocator * This, - /* [retval][out] */ TransmissionMode *mode); - - - void __RPC_STUB IDVBTLocator_get_Mode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_put_Mode_Proxy( - IDVBTLocator * This, - /* [in] */ TransmissionMode mode); - - - void __RPC_STUB IDVBTLocator_put_Mode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_get_OtherFrequencyInUse_Proxy( - IDVBTLocator * This, - /* [retval][out] */ VARIANT_BOOL *OtherFrequencyInUseVal); - - - void __RPC_STUB IDVBTLocator_get_OtherFrequencyInUse_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBTLocator_put_OtherFrequencyInUse_Proxy( - IDVBTLocator * This, - /* [in] */ VARIANT_BOOL OtherFrequencyInUseVal); - - - void __RPC_STUB IDVBTLocator_put_OtherFrequencyInUse_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IDVBTLocator_INTERFACE_DEFINED__ */ - - - #ifndef __IDVBSLocator_INTERFACE_DEFINED__ - #define __IDVBSLocator_INTERFACE_DEFINED__ - - /* interface IDVBSLocator */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_IDVBSLocator; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("3D7C353C-0D04-45f1-A742-F97CC1188DC8") - IDVBSLocator : public ILocator - { - public: - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SignalPolarisation( - /* [retval][out] */ Polarisation *PolarisationVal) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SignalPolarisation( - /* [in] */ Polarisation PolarisationVal) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_WestPosition( - /* [retval][out] */ VARIANT_BOOL *WestLongitude) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_WestPosition( - /* [in] */ VARIANT_BOOL WestLongitude) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OrbitalPosition( - /* [retval][out] */ long *longitude) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_OrbitalPosition( - /* [in] */ long longitude) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Azimuth( - /* [retval][out] */ long *Azimuth) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Azimuth( - /* [in] */ long Azimuth) = 0; - - virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Elevation( - /* [retval][out] */ long *Elevation) = 0; - - virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Elevation( - /* [in] */ long Elevation) = 0; - - }; - - #else /* C style interface */ - - typedef struct IDVBSLocatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDVBSLocator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDVBSLocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDVBSLocator * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDVBSLocator * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDVBSLocator * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDVBSLocator * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDVBSLocator * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CarrierFrequency )( - IDVBSLocator * This, - /* [retval][out] */ long *Frequency); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CarrierFrequency )( - IDVBSLocator * This, - /* [in] */ long Frequency); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFEC )( - IDVBSLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFEC )( - IDVBSLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFECRate )( - IDVBSLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFECRate )( - IDVBSLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFEC )( - IDVBSLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFEC )( - IDVBSLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFECRate )( - IDVBSLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFECRate )( - IDVBSLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Modulation )( - IDVBSLocator * This, - /* [retval][out] */ ModulationType *Modulation); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Modulation )( - IDVBSLocator * This, - /* [in] */ ModulationType Modulation); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SymbolRate )( - IDVBSLocator * This, - /* [retval][out] */ long *Rate); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SymbolRate )( - IDVBSLocator * This, - /* [in] */ long Rate); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IDVBSLocator * This, - /* [retval][out] */ ILocator **NewLocator); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignalPolarisation )( - IDVBSLocator * This, - /* [retval][out] */ Polarisation *PolarisationVal); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignalPolarisation )( - IDVBSLocator * This, - /* [in] */ Polarisation PolarisationVal); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_WestPosition )( - IDVBSLocator * This, - /* [retval][out] */ VARIANT_BOOL *WestLongitude); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_WestPosition )( - IDVBSLocator * This, - /* [in] */ VARIANT_BOOL WestLongitude); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OrbitalPosition )( - IDVBSLocator * This, - /* [retval][out] */ long *longitude); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OrbitalPosition )( - IDVBSLocator * This, - /* [in] */ long longitude); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Azimuth )( - IDVBSLocator * This, - /* [retval][out] */ long *Azimuth); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Azimuth )( - IDVBSLocator * This, - /* [in] */ long Azimuth); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Elevation )( - IDVBSLocator * This, - /* [retval][out] */ long *Elevation); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Elevation )( - IDVBSLocator * This, - /* [in] */ long Elevation); - - END_INTERFACE - } IDVBSLocatorVtbl; - - interface IDVBSLocator - { - CONST_VTBL struct IDVBSLocatorVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IDVBSLocator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IDVBSLocator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IDVBSLocator_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IDVBSLocator_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IDVBSLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IDVBSLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IDVBSLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IDVBSLocator_get_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> get_CarrierFrequency(This,Frequency) - - #define IDVBSLocator_put_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> put_CarrierFrequency(This,Frequency) - - #define IDVBSLocator_get_InnerFEC(This,FEC) \ - (This)->lpVtbl -> get_InnerFEC(This,FEC) - - #define IDVBSLocator_put_InnerFEC(This,FEC) \ - (This)->lpVtbl -> put_InnerFEC(This,FEC) - - #define IDVBSLocator_get_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> get_InnerFECRate(This,FEC) - - #define IDVBSLocator_put_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> put_InnerFECRate(This,FEC) - - #define IDVBSLocator_get_OuterFEC(This,FEC) \ - (This)->lpVtbl -> get_OuterFEC(This,FEC) - - #define IDVBSLocator_put_OuterFEC(This,FEC) \ - (This)->lpVtbl -> put_OuterFEC(This,FEC) - - #define IDVBSLocator_get_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> get_OuterFECRate(This,FEC) - - #define IDVBSLocator_put_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> put_OuterFECRate(This,FEC) - - #define IDVBSLocator_get_Modulation(This,Modulation) \ - (This)->lpVtbl -> get_Modulation(This,Modulation) - - #define IDVBSLocator_put_Modulation(This,Modulation) \ - (This)->lpVtbl -> put_Modulation(This,Modulation) - - #define IDVBSLocator_get_SymbolRate(This,Rate) \ - (This)->lpVtbl -> get_SymbolRate(This,Rate) - - #define IDVBSLocator_put_SymbolRate(This,Rate) \ - (This)->lpVtbl -> put_SymbolRate(This,Rate) - - #define IDVBSLocator_Clone(This,NewLocator) \ - (This)->lpVtbl -> Clone(This,NewLocator) - - - #define IDVBSLocator_get_SignalPolarisation(This,PolarisationVal) \ - (This)->lpVtbl -> get_SignalPolarisation(This,PolarisationVal) - - #define IDVBSLocator_put_SignalPolarisation(This,PolarisationVal) \ - (This)->lpVtbl -> put_SignalPolarisation(This,PolarisationVal) - - #define IDVBSLocator_get_WestPosition(This,WestLongitude) \ - (This)->lpVtbl -> get_WestPosition(This,WestLongitude) - - #define IDVBSLocator_put_WestPosition(This,WestLongitude) \ - (This)->lpVtbl -> put_WestPosition(This,WestLongitude) - - #define IDVBSLocator_get_OrbitalPosition(This,longitude) \ - (This)->lpVtbl -> get_OrbitalPosition(This,longitude) - - #define IDVBSLocator_put_OrbitalPosition(This,longitude) \ - (This)->lpVtbl -> put_OrbitalPosition(This,longitude) - - #define IDVBSLocator_get_Azimuth(This,Azimuth) \ - (This)->lpVtbl -> get_Azimuth(This,Azimuth) - - #define IDVBSLocator_put_Azimuth(This,Azimuth) \ - (This)->lpVtbl -> put_Azimuth(This,Azimuth) - - #define IDVBSLocator_get_Elevation(This,Elevation) \ - (This)->lpVtbl -> get_Elevation(This,Elevation) - - #define IDVBSLocator_put_Elevation(This,Elevation) \ - (This)->lpVtbl -> put_Elevation(This,Elevation) - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_get_SignalPolarisation_Proxy( - IDVBSLocator * This, - /* [retval][out] */ Polarisation *PolarisationVal); - - - void __RPC_STUB IDVBSLocator_get_SignalPolarisation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_put_SignalPolarisation_Proxy( - IDVBSLocator * This, - /* [in] */ Polarisation PolarisationVal); - - - void __RPC_STUB IDVBSLocator_put_SignalPolarisation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_get_WestPosition_Proxy( - IDVBSLocator * This, - /* [retval][out] */ VARIANT_BOOL *WestLongitude); - - - void __RPC_STUB IDVBSLocator_get_WestPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_put_WestPosition_Proxy( - IDVBSLocator * This, - /* [in] */ VARIANT_BOOL WestLongitude); - - - void __RPC_STUB IDVBSLocator_put_WestPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_get_OrbitalPosition_Proxy( - IDVBSLocator * This, - /* [retval][out] */ long *longitude); - - - void __RPC_STUB IDVBSLocator_get_OrbitalPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_put_OrbitalPosition_Proxy( - IDVBSLocator * This, - /* [in] */ long longitude); - - - void __RPC_STUB IDVBSLocator_put_OrbitalPosition_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_get_Azimuth_Proxy( - IDVBSLocator * This, - /* [retval][out] */ long *Azimuth); - - - void __RPC_STUB IDVBSLocator_get_Azimuth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_put_Azimuth_Proxy( - IDVBSLocator * This, - /* [in] */ long Azimuth); - - - void __RPC_STUB IDVBSLocator_put_Azimuth_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_get_Elevation_Proxy( - IDVBSLocator * This, - /* [retval][out] */ long *Elevation); - - - void __RPC_STUB IDVBSLocator_get_Elevation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDVBSLocator_put_Elevation_Proxy( - IDVBSLocator * This, - /* [in] */ long Elevation); - - - void __RPC_STUB IDVBSLocator_put_Elevation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - - #endif /* __IDVBSLocator_INTERFACE_DEFINED__ */ - - - #ifndef __IDVBCLocator_INTERFACE_DEFINED__ - #define __IDVBCLocator_INTERFACE_DEFINED__ - - /* interface IDVBCLocator */ - /* [unique][helpstring][oleautomation][dual][uuid][nonextensible][hidden][object] */ - - - EXTERN_C const IID IID_IDVBCLocator; - - #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("6E42F36E-1DD2-43c4-9F78-69D25AE39034") - IDVBCLocator : public ILocator - { - public: - }; - - #else /* C style interface */ - - typedef struct IDVBCLocatorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDVBCLocator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDVBCLocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDVBCLocator * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDVBCLocator * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDVBCLocator * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDVBCLocator * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDVBCLocator * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CarrierFrequency )( - IDVBCLocator * This, - /* [retval][out] */ long *Frequency); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CarrierFrequency )( - IDVBCLocator * This, - /* [in] */ long Frequency); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFEC )( - IDVBCLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFEC )( - IDVBCLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_InnerFECRate )( - IDVBCLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_InnerFECRate )( - IDVBCLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFEC )( - IDVBCLocator * This, - /* [retval][out] */ FECMethod *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFEC )( - IDVBCLocator * This, - /* [in] */ FECMethod FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OuterFECRate )( - IDVBCLocator * This, - /* [retval][out] */ BinaryConvolutionCodeRate *FEC); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OuterFECRate )( - IDVBCLocator * This, - /* [in] */ BinaryConvolutionCodeRate FEC); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Modulation )( - IDVBCLocator * This, - /* [retval][out] */ ModulationType *Modulation); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Modulation )( - IDVBCLocator * This, - /* [in] */ ModulationType Modulation); - - /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SymbolRate )( - IDVBCLocator * This, - /* [retval][out] */ long *Rate); - - /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SymbolRate )( - IDVBCLocator * This, - /* [in] */ long Rate); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clone )( - IDVBCLocator * This, - /* [retval][out] */ ILocator **NewLocator); - - END_INTERFACE - } IDVBCLocatorVtbl; - - interface IDVBCLocator - { - CONST_VTBL struct IDVBCLocatorVtbl *lpVtbl; - }; - - - - #ifdef COBJMACROS - - - #define IDVBCLocator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - - #define IDVBCLocator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - - #define IDVBCLocator_Release(This) \ - (This)->lpVtbl -> Release(This) - - - #define IDVBCLocator_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - - #define IDVBCLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - - #define IDVBCLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - - #define IDVBCLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - - #define IDVBCLocator_get_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> get_CarrierFrequency(This,Frequency) - - #define IDVBCLocator_put_CarrierFrequency(This,Frequency) \ - (This)->lpVtbl -> put_CarrierFrequency(This,Frequency) - - #define IDVBCLocator_get_InnerFEC(This,FEC) \ - (This)->lpVtbl -> get_InnerFEC(This,FEC) - - #define IDVBCLocator_put_InnerFEC(This,FEC) \ - (This)->lpVtbl -> put_InnerFEC(This,FEC) - - #define IDVBCLocator_get_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> get_InnerFECRate(This,FEC) - - #define IDVBCLocator_put_InnerFECRate(This,FEC) \ - (This)->lpVtbl -> put_InnerFECRate(This,FEC) - - #define IDVBCLocator_get_OuterFEC(This,FEC) \ - (This)->lpVtbl -> get_OuterFEC(This,FEC) - - #define IDVBCLocator_put_OuterFEC(This,FEC) \ - (This)->lpVtbl -> put_OuterFEC(This,FEC) - - #define IDVBCLocator_get_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> get_OuterFECRate(This,FEC) - - #define IDVBCLocator_put_OuterFECRate(This,FEC) \ - (This)->lpVtbl -> put_OuterFECRate(This,FEC) - - #define IDVBCLocator_get_Modulation(This,Modulation) \ - (This)->lpVtbl -> get_Modulation(This,Modulation) - - #define IDVBCLocator_put_Modulation(This,Modulation) \ - (This)->lpVtbl -> put_Modulation(This,Modulation) - - #define IDVBCLocator_get_SymbolRate(This,Rate) \ - (This)->lpVtbl -> get_SymbolRate(This,Rate) - - #define IDVBCLocator_put_SymbolRate(This,Rate) \ - (This)->lpVtbl -> put_SymbolRate(This,Rate) - - #define IDVBCLocator_Clone(This,NewLocator) \ - (This)->lpVtbl -> Clone(This,NewLocator) - - - #endif /* COBJMACROS */ - - - #endif /* C style interface */ - - - - - #endif /* __IDVBCLocator_INTERFACE_DEFINED__ */ - - - - #ifndef __TunerLib_LIBRARY_DEFINED__ - #define __TunerLib_LIBRARY_DEFINED__ - - /* library TunerLib */ - /* [helpstring][version][uuid] */ - - - EXTERN_C const IID LIBID_TunerLib; - - EXTERN_C const CLSID CLSID_SystemTuningSpaces; - - #ifdef __cplusplus - - class DECLSPEC_UUID("D02AAC50-027E-11d3-9D8E-00C04F72D980") - SystemTuningSpaces; - #endif - - EXTERN_C const CLSID CLSID_TuningSpace; - - #ifdef __cplusplus - - class DECLSPEC_UUID("5FFDC5E6-B83A-4b55-B6E8-C69E765FE9DB") - TuningSpace; - #endif - - EXTERN_C const CLSID CLSID_ATSCTuningSpace; - - #ifdef __cplusplus - - class DECLSPEC_UUID("A2E30750-6C3D-11d3-B653-00C04F79498E") - ATSCTuningSpace; - #endif - - EXTERN_C const CLSID CLSID_AnalogRadioTuningSpace; - - #ifdef __cplusplus - - class DECLSPEC_UUID("8A674B4C-1F63-11d3-B64C-00C04F79498E") - AnalogRadioTuningSpace; - #endif - - EXTERN_C const CLSID CLSID_AnalogTVTuningSpace; - - #ifdef __cplusplus - - class DECLSPEC_UUID("8A674B4D-1F63-11d3-B64C-00C04F79498E") - AnalogTVTuningSpace; - #endif - - EXTERN_C const CLSID CLSID_DVBTuningSpace; - - #ifdef __cplusplus - - class DECLSPEC_UUID("C6B14B32-76AA-4a86-A7AC-5C79AAF58DA7") - DVBTuningSpace; - #endif - - EXTERN_C const CLSID CLSID_ComponentTypes; - - #ifdef __cplusplus - - class DECLSPEC_UUID("A1A2B1C4-0E3A-11d3-9D8E-00C04F72D980") - ComponentTypes; - #endif - - EXTERN_C const CLSID CLSID_ComponentType; - - #ifdef __cplusplus - - class DECLSPEC_UUID("823535A0-0318-11d3-9D8E-00C04F72D980") - ComponentType; - #endif - - EXTERN_C const CLSID CLSID_LanguageComponentType; - - #ifdef __cplusplus - - class DECLSPEC_UUID("1BE49F30-0E1B-11d3-9D8E-00C04F72D980") - LanguageComponentType; - #endif - - EXTERN_C const CLSID CLSID_MPEG2ComponentType; - - #ifdef __cplusplus - - class DECLSPEC_UUID("418008F3-CF67-4668-9628-10DC52BE1D08") - MPEG2ComponentType; - #endif - - EXTERN_C const CLSID CLSID_ATSCComponentType; - - #ifdef __cplusplus - - class DECLSPEC_UUID("A8DCF3D5-0780-4ef4-8A83-2CFFAACB8ACE") - ATSCComponentType; - #endif - - EXTERN_C const CLSID CLSID_Components; - - #ifdef __cplusplus - - class DECLSPEC_UUID("809B6661-94C4-49e6-B6EC-3F0F862215AA") - Components; - #endif - - EXTERN_C const CLSID CLSID_Component; - - #ifdef __cplusplus - - class DECLSPEC_UUID("59DC47A8-116C-11d3-9D8E-00C04F72D980") - Component; - #endif - - EXTERN_C const CLSID CLSID_MPEG2Component; - - #ifdef __cplusplus - - class DECLSPEC_UUID("055CB2D7-2969-45cd-914B-76890722F112") - MPEG2Component; - #endif - - EXTERN_C const CLSID CLSID_TuneRequest; - - #ifdef __cplusplus - - class DECLSPEC_UUID("B46E0D38-AB35-4a06-A137-70576B01B39F") - TuneRequest; - #endif - - EXTERN_C const CLSID CLSID_ChannelTuneRequest; - - #ifdef __cplusplus - - class DECLSPEC_UUID("0369B4E5-45B6-11d3-B650-00C04F79498E") - ChannelTuneRequest; - #endif - - EXTERN_C const CLSID CLSID_ATSCChannelTuneRequest; - - #ifdef __cplusplus - - class DECLSPEC_UUID("0369B4E6-45B6-11d3-B650-00C04F79498E") - ATSCChannelTuneRequest; - #endif - - EXTERN_C const CLSID CLSID_Locator; - - #ifdef __cplusplus - - class DECLSPEC_UUID("0888C883-AC4F-4943-B516-2C38D9B34562") - Locator; - #endif - - EXTERN_C const CLSID CLSID_ATSCLocator; - - #ifdef __cplusplus - - class DECLSPEC_UUID("8872FF1B-98FA-4d7a-8D93-C9F1055F85BB") - ATSCLocator; - #endif - - EXTERN_C const CLSID CLSID_DVBTLocator; - - #ifdef __cplusplus - - class DECLSPEC_UUID("9CD64701-BDF3-4d14-8E03-F12983D86664") - DVBTLocator; - #endif - - EXTERN_C const CLSID CLSID_DVBSLocator; - - #ifdef __cplusplus - - class DECLSPEC_UUID("1DF7D126-4050-47f0-A7CF-4C4CA9241333") - DVBSLocator; - #endif - - EXTERN_C const CLSID CLSID_DVBCLocator; - - #ifdef __cplusplus - - class DECLSPEC_UUID("C531D9FD-9685-4028-8B68-6E1232079F1E") - DVBCLocator; - #endif - - EXTERN_C const CLSID CLSID_DVBTuneRequest; - - #ifdef __cplusplus - - class DECLSPEC_UUID("15D6504A-5494-499c-886C-973C9E53B9F1") - DVBTuneRequest; - #endif - - EXTERN_C const CLSID CLSID_CreatePropBagOnRegKey; - - #ifdef __cplusplus - - class DECLSPEC_UUID("8A674B49-1F63-11d3-B64C-00C04F79498E") - CreatePropBagOnRegKey; - #endif - #endif /* __TunerLib_LIBRARY_DEFINED__ */ - - /* Additional Prototypes for ALL interfaces */ - - unsigned long __RPC_USER BSTR_UserSize( unsigned long *, unsigned long , BSTR * ); - unsigned char * __RPC_USER BSTR_UserMarshal( unsigned long *, unsigned char *, BSTR * ); - unsigned char * __RPC_USER BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); - void __RPC_USER BSTR_UserFree( unsigned long *, BSTR * ); - - unsigned long __RPC_USER VARIANT_UserSize( unsigned long *, unsigned long , VARIANT * ); - unsigned char * __RPC_USER VARIANT_UserMarshal( unsigned long *, unsigned char *, VARIANT * ); - unsigned char * __RPC_USER VARIANT_UserUnmarshal(unsigned long *, unsigned char *, VARIANT * ); - void __RPC_USER VARIANT_UserFree( unsigned long *, VARIANT * ); - - /* end of Additional Prototypes */ - - #ifdef __cplusplus - } - #endif - - #endif - - -#endif // DirectX 8.0 content \ No newline at end of file diff --git a/import/DirectX8/include/uuids.h b/import/DirectX8/include/uuids.h deleted file mode 100644 index 61bb5799e..000000000 --- a/import/DirectX8/include/uuids.h +++ /dev/null @@ -1,1312 +0,0 @@ -//------------------------------------------------------------------------------ -// File: uuids.h -// -// Desc: Contains the GUIDs for the MediaType type, subtype fields and format -// types for standard media types, and also class IDs for well-known -// components. -// -// Copyright (c) 1992 - 2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -// -// We want to use this list for generating strings for debugging too, -// so we redefine OUR_GUID_ENTRY depending on what we want to do. -// -// It is imperative that all entries in this file are declared using -// OUR_GUID_ENTRY, as that macro might have been defined in advance of -// including this file. See wxdebug.cpp in the -// samples\multimedia\directshow\baseclasses directory. -// - -#ifndef OUR_GUID_ENTRY - #define OUR_GUID_ENTRY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8); -#endif - - -// -- to allow consistent labeling of Media types and subtypes -- - -#define MEDIATYPE_NULL GUID_NULL -#define MEDIASUBTYPE_NULL GUID_NULL - -// -- Use this subtype if you don't have a use for a subtype for your type -// e436eb8e-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_None -OUR_GUID_ENTRY(MEDIASUBTYPE_None, -0xe436eb8e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - - -// -- major types --- - - -// 73646976-0000-0010-8000-00AA00389B71 'vids' == MEDIATYPE_Video -OUR_GUID_ENTRY(MEDIATYPE_Video, -0x73646976, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 73647561-0000-0010-8000-00AA00389B71 'auds' == MEDIATYPE_Audio -OUR_GUID_ENTRY(MEDIATYPE_Audio, -0x73647561, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 73747874-0000-0010-8000-00AA00389B71 'txts' == MEDIATYPE_Text -OUR_GUID_ENTRY(MEDIATYPE_Text, -0x73747874, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 7364696D-0000-0010-8000-00AA00389B71 'mids' == MEDIATYPE_Midi -OUR_GUID_ENTRY(MEDIATYPE_Midi, -0x7364696D, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// e436eb83-524f-11ce-9f53-0020af0ba770 MEDIATYPE_Stream -OUR_GUID_ENTRY(MEDIATYPE_Stream, -0xe436eb83, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// 73(s)76(v)61(a)69(i)-0000-0010-8000-00AA00389B71 'iavs' == MEDIATYPE_Interleaved -OUR_GUID_ENTRY(MEDIATYPE_Interleaved, -0x73766169, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 656c6966-0000-0010-8000-00AA00389B71 'file' == MEDIATYPE_File -OUR_GUID_ENTRY(MEDIATYPE_File, -0x656c6966, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 73636d64-0000-0010-8000-00AA00389B71 'scmd' == MEDIATYPE_ScriptCommand -OUR_GUID_ENTRY(MEDIATYPE_ScriptCommand, -0x73636d64, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 670AEA80-3A82-11d0-B79B-00AA003767A7 MEDIATYPE_AUXLine21Data -OUR_GUID_ENTRY(MEDIATYPE_AUXLine21Data, -0x670aea80, 0x3a82, 0x11d0, 0xb7, 0x9b, 0x0, 0xaa, 0x0, 0x37, 0x67, 0xa7) - -// F72A76E1-EB0A-11D0-ACE4-0000C0CC16BA MEDIATYPE_VBI -OUR_GUID_ENTRY(MEDIATYPE_VBI, -0xf72a76e1, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba) - -// 0482DEE3-7817-11cf-8a03-00aa006ecb65 MEDIATYPE_Timecode -OUR_GUID_ENTRY(MEDIATYPE_Timecode, -0x482dee3, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// 74726c6d-0000-0010-8000-00AA00389B71 'lmrt' == MEDIATYPE_LMRT -OUR_GUID_ENTRY(MEDIATYPE_LMRT, -0x74726c6d, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 74726c6d-0000-0010-8000-00AA00389B71 'urls' == MEDIATYPE_URL_STREAM -OUR_GUID_ENTRY(MEDIATYPE_URL_STREAM, -0x736c7275, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// -- sub types --- - -// 4C504C43-0000-0010-8000-00AA00389B71 'CLPL' == MEDIASUBTYPE_CLPL -OUR_GUID_ENTRY(MEDIASUBTYPE_CLPL, -0x4C504C43, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 56595559-0000-0010-8000-00AA00389B71 'YUYV' == MEDIASUBTYPE_YUYV -OUR_GUID_ENTRY(MEDIASUBTYPE_YUYV, -0x56595559, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 56555949-0000-0010-8000-00AA00389B71 'IYUV' == MEDIASUBTYPE_IYUV -OUR_GUID_ENTRY(MEDIASUBTYPE_IYUV, -0x56555949, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 39555659-0000-0010-8000-00AA00389B71 'YVU9' == MEDIASUBTYPE_YVU9 -OUR_GUID_ENTRY(MEDIASUBTYPE_YVU9, -0x39555659, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 31313459-0000-0010-8000-00AA00389B71 'Y411' == MEDIASUBTYPE_Y411 -OUR_GUID_ENTRY(MEDIASUBTYPE_Y411, -0x31313459, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 50313459-0000-0010-8000-00AA00389B71 'Y41P' == MEDIASUBTYPE_Y41P -OUR_GUID_ENTRY(MEDIASUBTYPE_Y41P, -0x50313459, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 32595559-0000-0010-8000-00AA00389B71 'YUY2' == MEDIASUBTYPE_YUY2 -OUR_GUID_ENTRY(MEDIASUBTYPE_YUY2, -0x32595559, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 55595659-0000-0010-8000-00AA00389B71 'YVYU' == MEDIASUBTYPE_YVYU -OUR_GUID_ENTRY(MEDIASUBTYPE_YVYU, -0x55595659, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 59565955-0000-0010-8000-00AA00389B71 'UYVY' == MEDIASUBTYPE_UYVY -OUR_GUID_ENTRY(MEDIASUBTYPE_UYVY, -0x59565955, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 31313259-0000-0010-8000-00AA00389B71 'Y211' == MEDIASUBTYPE_Y211 -OUR_GUID_ENTRY(MEDIASUBTYPE_Y211, -0x31313259, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 31313259-0000-0010-8000-00AA00389B71 'YV12' == MEDIASUBTYPE_YV12 -OUR_GUID_ENTRY(MEDIASUBTYPE_YV12, -0x32315659, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 524a4c43-0000-0010-8000-00AA00389B71 'CLJR' == MEDIASUBTYPE_CLJR -OUR_GUID_ENTRY(MEDIASUBTYPE_CLJR, -0x524a4c43, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 39304649-0000-0010-8000-00AA00389B71 'IF09' == MEDIASUBTYPE_IF09 -OUR_GUID_ENTRY(MEDIASUBTYPE_IF09, -0x39304649, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 414c5043-0000-0010-8000-00AA00389B71 'CPLA' == MEDIASUBTYPE_CPLA -OUR_GUID_ENTRY(MEDIASUBTYPE_CPLA, -0x414c5043, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 47504A4D-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_MJPG -OUR_GUID_ENTRY(MEDIASUBTYPE_MJPG, -0x47504A4D, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 4A4D5654-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_TVMJ -OUR_GUID_ENTRY(MEDIASUBTYPE_TVMJ, -0x4A4D5654, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 454B4157-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_WAKE -OUR_GUID_ENTRY(MEDIASUBTYPE_WAKE, -0x454B4157, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 43434643-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_CFCC -OUR_GUID_ENTRY(MEDIASUBTYPE_CFCC, -0x43434643, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 47504A49-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_IJPG -OUR_GUID_ENTRY(MEDIASUBTYPE_IJPG, -0x47504A49, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 6D756C50-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_Plum -OUR_GUID_ENTRY(MEDIASUBTYPE_Plum, -0x6D756C50, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// FAST DV-Master -// 53435644-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_DVCS -OUR_GUID_ENTRY(MEDIASUBTYPE_DVCS, -0x53435644, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// FAST DV-Master -// 44535644-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_DVSD -OUR_GUID_ENTRY(MEDIASUBTYPE_DVSD, -0x44535644, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// MIROVideo DV -// 4656444D-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_MDVF -OUR_GUID_ENTRY(MEDIASUBTYPE_MDVF, -0x4656444D, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// e436eb78-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_RGB1 -// e436eb78-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_RGB1 -OUR_GUID_ENTRY(MEDIASUBTYPE_RGB1, -0xe436eb78, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436eb79-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_RGB4 -OUR_GUID_ENTRY(MEDIASUBTYPE_RGB4, -0xe436eb79, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436eb7a-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_RGB8 -OUR_GUID_ENTRY(MEDIASUBTYPE_RGB8, -0xe436eb7a, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436eb7b-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_RGB565 -OUR_GUID_ENTRY(MEDIASUBTYPE_RGB565, -0xe436eb7b, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436eb7c-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_RGB555 -OUR_GUID_ENTRY(MEDIASUBTYPE_RGB555, -0xe436eb7c, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436eb7d-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_RGB24 -OUR_GUID_ENTRY(MEDIASUBTYPE_RGB24, -0xe436eb7d, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436eb7e-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_RGB32 -OUR_GUID_ENTRY(MEDIASUBTYPE_RGB32, -0xe436eb7e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - - -// -// RGB surfaces that contain per pixel alpha values. -// - -// 297C55AF-E209-4cb3-B757-C76D6B9C88A8 MEDIASUBTYPE_ARGB1555 -OUR_GUID_ENTRY(MEDIASUBTYPE_ARGB1555, -0x297c55af, 0xe209, 0x4cb3, 0xb7, 0x57, 0xc7, 0x6d, 0x6b, 0x9c, 0x88, 0xa8) - -// 6E6415E6-5C24-425f-93CD-80102B3D1CCA MEDIASUBTYPE_ARGB4444 -OUR_GUID_ENTRY(MEDIASUBTYPE_ARGB4444, -0x6e6415e6, 0x5c24, 0x425f, 0x93, 0xcd, 0x80, 0x10, 0x2b, 0x3d, 0x1c, 0xca) - -// 773c9ac0-3274-11d0-B724-00aa006c1A01 MEDIASUBTYPE_ARGB32 -OUR_GUID_ENTRY(MEDIASUBTYPE_ARGB32, -0x773c9ac0, 0x3274, 0x11d0, 0xb7, 0x24, 0x0, 0xaa, 0x0, 0x6c, 0x1a, 0x1 ) - -// 56555941-0000-0010-8000-00AA00389B71 'AYUV' == MEDIASUBTYPE_AYUV -// -// See the DX-VA header and documentation for a description of this format. -// -OUR_GUID_ENTRY(MEDIASUBTYPE_AYUV, -0x56555941, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 34344941-0000-0010-8000-00AA00389B71 'AI44' == MEDIASUBTYPE_AI44 -// -// See the DX-VA header and documentation for a description of this format. -// -OUR_GUID_ENTRY(MEDIASUBTYPE_AI44, -0x34344941, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 34344149-0000-0010-8000-00AA00389B71 'IA44' == MEDIASUBTYPE_IA44 -// -// See the DX-VA header and documentation for a description of this format. -// -OUR_GUID_ENTRY(MEDIASUBTYPE_IA44, -0x34344149, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - - -// -// DirectX7 D3D Render Target media subtypes. -// - -// 32335237-0000-0010-8000-00AA00389B71 '7R32' == MEDIASUBTYPE_RGB32_D3D_DX7_RT -OUR_GUID_ENTRY(MEDIASUBTYPE_RGB32_D3D_DX7_RT, -0x32335237, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 36315237-0000-0010-8000-00AA00389B71 '7R16' == MEDIASUBTYPE_RGB16_D3D_DX7_RT -OUR_GUID_ENTRY(MEDIASUBTYPE_RGB16_D3D_DX7_RT, -0x36315237, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 38384137-0000-0010-8000-00AA00389B71 '7A88' == MEDIASUBTYPE_ARGB32_D3D_DX7_RT -OUR_GUID_ENTRY(MEDIASUBTYPE_ARGB32_D3D_DX7_RT, -0x38384137, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 34344137-0000-0010-8000-00AA00389B71 '7A44' == MEDIASUBTYPE_ARGB4444_D3D_DX7_RT -OUR_GUID_ENTRY(MEDIASUBTYPE_ARGB4444_D3D_DX7_RT, -0x34344137, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 35314137-0000-0010-8000-00AA00389B71 '7A15' == MEDIASUBTYPE_ARGB1555_D3D_DX7_RT -OUR_GUID_ENTRY(MEDIASUBTYPE_ARGB1555_D3D_DX7_RT, -0x35314137, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - - -#define MEDIASUBTYPE_HASALPHA(mt) ( ((mt).subtype == MEDIASUBTYPE_ARGB4444) || \ - ((mt).subtype == MEDIASUBTYPE_ARGB32) || \ - ((mt).subtype == MEDIASUBTYPE_AYUV) || \ - ((mt).subtype == MEDIASUBTYPE_AI44) || \ - ((mt).subtype == MEDIASUBTYPE_IA44) || \ - ((mt).subtype == MEDIASUBTYPE_ARGB1555) || \ - ((mt).subtype == MEDIASUBTYPE_ARGB32_D3D_DX7_RT) || \ - ((mt).subtype == MEDIASUBTYPE_ARGB4444_D3D_DX7_RT) || \ - ((mt).subtype == MEDIASUBTYPE_ARGB1555_D3D_DX7_RT) ) - -#define MEDIASUBTYPE_D3D_DX7_RT(mt) (((mt).subtype == MEDIASUBTYPE_ARGB32_D3D_DX7_RT) || \ - ((mt).subtype == MEDIASUBTYPE_ARGB4444_D3D_DX7_RT) || \ - ((mt).subtype == MEDIASUBTYPE_ARGB1555_D3D_DX7_RT) || \ - ((mt).subtype == MEDIASUBTYPE_RGB32_D3D_DX7_RT) || \ - ((mt).subtype == MEDIASUBTYPE_RGB16_D3D_DX7_RT)) - - -// e436eb7f-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_Overlay -OUR_GUID_ENTRY(MEDIASUBTYPE_Overlay, -0xe436eb7f, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436eb80-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_MPEGPacket -OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG1Packet, -0xe436eb80, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436eb81-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_MPEG1Payload -OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG1Payload, -0xe436eb81, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// 00000050-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_MPEG1AudioPayload -OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG1AudioPayload, -0x00000050, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71) - -// e436eb82-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_MPEG1SystemStream -OUR_GUID_ENTRY(MEDIATYPE_MPEG1SystemStream, -0xe436eb82, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// the next consecutive number is assigned to MEDIATYPE_Stream and appears higher up -// e436eb84-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_MPEG1System -OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG1System, -0xe436eb84, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436eb85-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_MPEG1VideoCD -OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG1VideoCD, -0xe436eb85, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436eb86-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_MPEG1Video -OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG1Video, -0xe436eb86, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436eb87-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_MPEG1Audio -OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG1Audio, -0xe436eb87, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436eb88-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_Avi -OUR_GUID_ENTRY(MEDIASUBTYPE_Avi, -0xe436eb88, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// {3DB80F90-9412-11d1-ADED-0000F8754B99} MEDIASUBTYPE_Asf -OUR_GUID_ENTRY(MEDIASUBTYPE_Asf, -0x3db80f90, 0x9412, 0x11d1, 0xad, 0xed, 0x0, 0x0, 0xf8, 0x75, 0x4b, 0x99) - -// e436eb89-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_QTMovie -OUR_GUID_ENTRY(MEDIASUBTYPE_QTMovie, -0xe436eb89, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// 617a7072-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_Rpza -OUR_GUID_ENTRY(MEDIASUBTYPE_QTRpza, -0x617a7072, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 20636d73-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_Smc -OUR_GUID_ENTRY(MEDIASUBTYPE_QTSmc, -0x20636d73, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 20656c72-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_Rle -OUR_GUID_ENTRY(MEDIASUBTYPE_QTRle, -0x20656c72, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 6765706a-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_Jpeg -OUR_GUID_ENTRY(MEDIASUBTYPE_QTJpeg, -0x6765706a, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// e436eb8a-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_PCMAudio_Obsolete -OUR_GUID_ENTRY(MEDIASUBTYPE_PCMAudio_Obsolete, -0xe436eb8a, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// 00000001-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_PCM -OUR_GUID_ENTRY(MEDIASUBTYPE_PCM, -0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71) - -// e436eb8b-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_WAVE -OUR_GUID_ENTRY(MEDIASUBTYPE_WAVE, -0xe436eb8b, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436eb8c-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_AU -OUR_GUID_ENTRY(MEDIASUBTYPE_AU, -0xe436eb8c, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436eb8d-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_AIFF -OUR_GUID_ENTRY(MEDIASUBTYPE_AIFF, -0xe436eb8d, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// 64(d)73(s)76(v)64(d)-0000-0010-8000-00AA00389B71 'dvsd' == MEDIASUBTYPE_dvsd -OUR_GUID_ENTRY(MEDIASUBTYPE_dvsd, -0x64737664, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 64(d)68(h)76(v)64(d)-0000-0010-8000-00AA00389B71 'dvhd' == MEDIASUBTYPE_dvhd -OUR_GUID_ENTRY(MEDIASUBTYPE_dvhd, -0x64687664, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 6c(l)73(s)76(v)64(d)-0000-0010-8000-00AA00389B71 'dvsl' == MEDIASUBTYPE_dvsl -OUR_GUID_ENTRY(MEDIASUBTYPE_dvsl, -0x6c737664, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// 6E8D4A22-310C-11d0-B79A-00AA003767A7 MEDIASUBTYPE_Line21_BytePair -OUR_GUID_ENTRY(MEDIASUBTYPE_Line21_BytePair, -0x6e8d4a22, 0x310c, 0x11d0, 0xb7, 0x9a, 0x0, 0xaa, 0x0, 0x37, 0x67, 0xa7) - -// 6E8D4A23-310C-11d0-B79A-00AA003767A7 MEDIASUBTYPE_Line21_GOPPacket -OUR_GUID_ENTRY(MEDIASUBTYPE_Line21_GOPPacket, -0x6e8d4a23, 0x310c, 0x11d0, 0xb7, 0x9a, 0x0, 0xaa, 0x0, 0x37, 0x67, 0xa7) - -// 6E8D4A24-310C-11d0-B79A-00AA003767A7 MEDIASUBTYPE_Line21_VBIRawData -OUR_GUID_ENTRY(MEDIASUBTYPE_Line21_VBIRawData, -0x6e8d4a24, 0x310c, 0x11d0, 0xb7, 0x9a, 0x0, 0xaa, 0x0, 0x37, 0x67, 0xa7) - -// F72A76E3-EB0A-11D0-ACE4-0000C0CC16BA MEDIASUBTYPE_TELETEXT -OUR_GUID_ENTRY(MEDIASUBTYPE_TELETEXT, -0xf72a76e3, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba) - -// derived from WAVE_FORMAT_DRM -// 00000009-0000-0010-8000-00aa00389b71 -OUR_GUID_ENTRY(MEDIASUBTYPE_DRM_Audio, -0x00000009, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// derived from WAVE_FORMAT_IEEE_FLOAT -// 00000003-0000-0010-8000-00aa00389b71 -OUR_GUID_ENTRY(MEDIASUBTYPE_IEEE_FLOAT, -0x00000003, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// derived from WAVE_FORMAT_DOLBY_AC3_SPDIF -// 00000092-0000-0010-8000-00aa00389b71 -OUR_GUID_ENTRY(MEDIASUBTYPE_DOLBY_AC3_SPDIF, -0x00000092, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// derived from WAVE_FORMAT_RAW_SPORT -// 00000240-0000-0010-8000-00aa00389b71 -OUR_GUID_ENTRY(MEDIASUBTYPE_RAW_SPORT, -0x00000240, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - -// derived from wave format tag 0x241, call it SPDIF_TAG_241h for now -// 00000241-0000-0010-8000-00aa00389b71 -OUR_GUID_ENTRY(MEDIASUBTYPE_SPDIF_TAG_241h, -0x00000241, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71) - - - -// DirectShow DSS definitions - -// A0AF4F81-E163-11d0-BAD9-00609744111A -OUR_GUID_ENTRY(MEDIASUBTYPE_DssVideo, -0xa0af4f81, 0xe163, 0x11d0, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a) - -// A0AF4F82-E163-11d0-BAD9-00609744111A -OUR_GUID_ENTRY(MEDIASUBTYPE_DssAudio, -0xa0af4f82, 0xe163, 0x11d0, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a) - -// 5A9B6A40-1A22-11D1-BAD9-00609744111A -OUR_GUID_ENTRY(MEDIASUBTYPE_VPVideo, -0x5a9b6a40, 0x1a22, 0x11d1, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a) - -// 5A9B6A41-1A22-11D1-BAD9-00609744111A -OUR_GUID_ENTRY(MEDIASUBTYPE_VPVBI, -0x5a9b6a41, 0x1a22, 0x11d1, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a) - -// BF87B6E0-8C27-11d0-B3F0-00AA003761C5 Capture graph building -OUR_GUID_ENTRY(CLSID_CaptureGraphBuilder, -0xBF87B6E0, 0x8C27, 0x11d0, 0xB3, 0xF0, 0x0, 0xAA, 0x00, 0x37, 0x61, 0xC5) - -// BF87B6E1-8C27-11d0-B3F0-00AA003761C5 New Capture graph building -OUR_GUID_ENTRY(CLSID_CaptureGraphBuilder2, -0xBF87B6E1, 0x8C27, 0x11d0, 0xB3, 0xF0, 0x0, 0xAA, 0x00, 0x37, 0x61, 0xC5) - -// e436ebb0-524f-11ce-9f53-0020af0ba770 Prototype filtergraph -OUR_GUID_ENTRY(CLSID_ProtoFilterGraph, -0xe436ebb0, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436ebb1-524f-11ce-9f53-0020af0ba770 Reference clock -OUR_GUID_ENTRY(CLSID_SystemClock, -0xe436ebb1, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436ebb2-524f-11ce-9f53-0020af0ba770 Filter Mapper -OUR_GUID_ENTRY(CLSID_FilterMapper, -0xe436ebb2, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436ebb3-524f-11ce-9f53-0020af0ba770 Filter Graph -OUR_GUID_ENTRY(CLSID_FilterGraph, -0xe436ebb3, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e436ebb8-524f-11ce-9f53-0020af0ba770 Filter Graph no thread -OUR_GUID_ENTRY(CLSID_FilterGraphNoThread, -0xe436ebb8, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// e4bbd160-4269-11ce-838d-00aa0055595a MPEG System stream -OUR_GUID_ENTRY(CLSID_MPEG1Doc, -0xe4bbd160, 0x4269, 0x11ce, 0x83, 0x8d, 0x0, 0xaa, 0x0, 0x55, 0x59, 0x5a) - -// 701722e0-8ae3-11ce-a85c-00aa002feab5 MPEG file reader -OUR_GUID_ENTRY(CLSID_FileSource, -0x701722e0, 0x8ae3, 0x11ce, 0xa8, 0x5c, 0x00, 0xaa, 0x00, 0x2f, 0xea, 0xb5) - -// 26C25940-4CA9-11ce-A828-00AA002FEAB5 Takes MPEG1 packets as input -OUR_GUID_ENTRY(CLSID_MPEG1PacketPlayer, -0x26c25940, 0x4ca9, 0x11ce, 0xa8, 0x28, 0x0, 0xaa, 0x0, 0x2f, 0xea, 0xb5) - -// 336475d0-942a-11ce-a870-00aa002feab5 MPEG splitter -OUR_GUID_ENTRY(CLSID_MPEG1Splitter, -0x336475d0, 0x942a, 0x11ce, 0xa8, 0x70, 0x00, 0xaa, 0x00, 0x2f, 0xea, 0xb5) - -// feb50740-7bef-11ce-9bd9-0000e202599c MPEG video decoder -OUR_GUID_ENTRY(CLSID_CMpegVideoCodec, -0xfeb50740, 0x7bef, 0x11ce, 0x9b, 0xd9, 0x0, 0x0, 0xe2, 0x2, 0x59, 0x9c) - -// 4a2286e0-7bef-11ce-9bd9-0000e202599c MPEG audio decoder -OUR_GUID_ENTRY(CLSID_CMpegAudioCodec, -0x4a2286e0, 0x7bef, 0x11ce, 0x9b, 0xd9, 0x0, 0x0, 0xe2, 0x2, 0x59, 0x9c) - -// e30629d3-27e5-11ce-875d-00608cb78066 Text renderer -OUR_GUID_ENTRY(CLSID_TextRender, -0xe30629d3, 0x27e5, 0x11ce, 0x87, 0x5d, 0x0, 0x60, 0x8c, 0xb7, 0x80, 0x66) - - - -// {F8388A40-D5BB-11d0-BE5A-0080C706568E} -OUR_GUID_ENTRY(CLSID_InfTee, -0xf8388a40, 0xd5bb, 0x11d0, 0xbe, 0x5a, 0x0, 0x80, 0xc7, 0x6, 0x56, 0x8e) - -// 1b544c20-fd0b-11ce-8c63-00aa0044b51e Avi Stream Splitter -OUR_GUID_ENTRY(CLSID_AviSplitter, -0x1b544c20, 0xfd0b, 0x11ce, 0x8c, 0x63, 0x0, 0xaa, 0x00, 0x44, 0xb5, 0x1e) - -// 1b544c21-fd0b-11ce-8c63-00aa0044b51e Avi File Reader -OUR_GUID_ENTRY(CLSID_AviReader, -0x1b544c21, 0xfd0b, 0x11ce, 0x8c, 0x63, 0x0, 0xaa, 0x00, 0x44, 0xb5, 0x1e) - -// 1b544c22-fd0b-11ce-8c63-00aa0044b51e Vfw 2.0 Capture Driver -OUR_GUID_ENTRY(CLSID_VfwCapture, -0x1b544c22, 0xfd0b, 0x11ce, 0x8c, 0x63, 0x0, 0xaa, 0x00, 0x44, 0xb5, 0x1e) - -OUR_GUID_ENTRY(CLSID_CaptureProperties, -0x1B544c22, 0xFD0B, 0x11ce, 0x8C, 0x63, 0x00, 0xAA, 0x00, 0x44, 0xB5, 0x1F) - -//e436ebb4-524f-11ce-9f53-0020af0ba770 Control Distributor -OUR_GUID_ENTRY(CLSID_FGControl, -0xe436ebb4, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// 44584800-F8EE-11ce-B2D4-00DD01101B85 .MOV reader (old) -OUR_GUID_ENTRY(CLSID_MOVReader, -0x44584800, 0xf8ee, 0x11ce, 0xb2, 0xd4, 0x00, 0xdd, 0x1, 0x10, 0x1b, 0x85) - -// D51BD5A0-7548-11cf-A520-0080C77EF58A QT Splitter -OUR_GUID_ENTRY(CLSID_QuickTimeParser, -0xd51bd5a0, 0x7548, 0x11cf, 0xa5, 0x20, 0x0, 0x80, 0xc7, 0x7e, 0xf5, 0x8a) - -// FDFE9681-74A3-11d0-AFA7-00AA00B67A42 QT Decoder -OUR_GUID_ENTRY(CLSID_QTDec, -0xfdfe9681, 0x74a3, 0x11d0, 0xaf, 0xa7, 0x0, 0xaa, 0x0, 0xb6, 0x7a, 0x42) - -// D3588AB0-0781-11ce-B03A-0020AF0BA770 AVIFile-based reader -OUR_GUID_ENTRY(CLSID_AVIDoc, -0xd3588ab0, 0x0781, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0xb, 0xa7, 0x70) - -// 70e102b0-5556-11ce-97c0-00aa0055595a Video renderer -OUR_GUID_ENTRY(CLSID_VideoRenderer, -0x70e102b0, 0x5556, 0x11ce, 0x97, 0xc0, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a) - -// 1643e180-90f5-11ce-97d5-00aa0055595a Colour space convertor -OUR_GUID_ENTRY(CLSID_Colour, -0x1643e180, 0x90f5, 0x11ce, 0x97, 0xd5, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a) - -// 1da08500-9edc-11cf-bc10-00aa00ac74f6 VGA 16 color ditherer -OUR_GUID_ENTRY(CLSID_Dither, -0x1da08500, 0x9edc, 0x11cf, 0xbc, 0x10, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6) - -// 07167665-5011-11cf-BF33-00AA0055595A Modex video renderer -OUR_GUID_ENTRY(CLSID_ModexRenderer, -0x7167665, 0x5011, 0x11cf, 0xbf, 0x33, 0x0, 0xaa, 0x0, 0x55, 0x59, 0x5a) - -// e30629d1-27e5-11ce-875d-00608cb78066 Waveout audio renderer -OUR_GUID_ENTRY(CLSID_AudioRender, -0xe30629d1, 0x27e5, 0x11ce, 0x87, 0x5d, 0x0, 0x60, 0x8c, 0xb7, 0x80, 0x66) - -// 05589faf-c356-11ce-bf01-00aa0055595a Audio Renderer Property Page -OUR_GUID_ENTRY(CLSID_AudioProperties, -0x05589faf, 0xc356, 0x11ce, 0xbf, 0x01, 0x0, 0xaa, 0x0, 0x55, 0x59, 0x5a) - -// 79376820-07D0-11cf-A24D-0020AFD79767 DSound audio renderer -OUR_GUID_ENTRY(CLSID_DSoundRender, -0x79376820, 0x07D0, 0x11CF, 0xA2, 0x4D, 0x0, 0x20, 0xAF, 0xD7, 0x97, 0x67) - -// e30629d2-27e5-11ce-875d-00608cb78066 Wavein audio recorder -OUR_GUID_ENTRY(CLSID_AudioRecord, -0xe30629d2, 0x27e5, 0x11ce, 0x87, 0x5d, 0x0, 0x60, 0x8c, 0xb7, 0x80, 0x66) - -// {2CA8CA52-3C3F-11d2-B73D-00C04FB6BD3D} IAMAudioInputMixer property page -OUR_GUID_ENTRY(CLSID_AudioInputMixerProperties, -0x2ca8ca52, 0x3c3f, 0x11d2, 0xb7, 0x3d, 0x0, 0xc0, 0x4f, 0xb6, 0xbd, 0x3d) - -// {CF49D4E0-1115-11ce-B03A-0020AF0BA770} AVI Decoder -OUR_GUID_ENTRY(CLSID_AVIDec, -0xcf49d4e0, 0x1115, 0x11ce, 0xb0, 0x3a, 0x0, 0x20, 0xaf, 0xb, 0xa7, 0x70) - -// {A888DF60-1E90-11cf-AC98-00AA004C0FA9} AVI ICDraw* wrapper -OUR_GUID_ENTRY(CLSID_AVIDraw, -0xa888df60, 0x1e90, 0x11cf, 0xac, 0x98, 0x0, 0xaa, 0x0, 0x4c, 0xf, 0xa9) - -// 6a08cf80-0e18-11cf-a24d-0020afd79767 ACM Wrapper -OUR_GUID_ENTRY(CLSID_ACMWrapper, -0x6a08cf80, 0x0e18, 0x11cf, 0xa2, 0x4d, 0x0, 0x20, 0xaf, 0xd7, 0x97, 0x67) - -// {e436ebb5-524f-11ce-9f53-0020af0ba770} Async File Reader -OUR_GUID_ENTRY(CLSID_AsyncReader, -0xe436ebb5, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// {e436ebb6-524f-11ce-9f53-0020af0ba770} Async URL Reader -OUR_GUID_ENTRY(CLSID_URLReader, -0xe436ebb6, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// {e436ebb7-524f-11ce-9f53-0020af0ba770} IPersistMoniker PID -OUR_GUID_ENTRY(CLSID_PersistMonikerPID, -0xe436ebb7, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) - -// {5f2759c0-7685-11cf-8b23-00805f6cef60} IAMovie plug-in distributor -OUR_GUID_ENTRY(CLSID_AMovie, -0x5f2759c0, 0x7685, 0x11cf, 0x8b, 0x23, 0x00, 0x80, 0x5f, 0x6c, 0xef, 0x60) - -// {D76E2820-1563-11cf-AC98-00AA004C0FA9} -OUR_GUID_ENTRY(CLSID_AVICo, -0xd76e2820, 0x1563, 0x11cf, 0xac, 0x98, 0x0, 0xaa, 0x0, 0x4c, 0xf, 0xa9) - -// {8596E5F0-0DA5-11d0-BD21-00A0C911CE86} -OUR_GUID_ENTRY(CLSID_FileWriter, -0x8596e5f0, 0xda5, 0x11d0, 0xbd, 0x21, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86) - -// {E2510970-F137-11CE-8B67-00AA00A3F1A6} AVI mux filter -OUR_GUID_ENTRY(CLSID_AviDest, -0xe2510970, 0xf137, 0x11ce, 0x8b, 0x67, 0x0, 0xaa, 0x0, 0xa3, 0xf1, 0xa6) - -// {C647B5C0-157C-11d0-BD23-00A0C911CE86} -OUR_GUID_ENTRY(CLSID_AviMuxProptyPage, -0xc647b5c0, 0x157c, 0x11d0, 0xbd, 0x23, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86) - -// {0A9AE910-85C0-11d0-BD42-00A0C911CE86} -OUR_GUID_ENTRY(CLSID_AviMuxProptyPage1, -0xa9ae910, 0x85c0, 0x11d0, 0xbd, 0x42, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86) - -// {07b65360-c445-11ce-afde-00aa006c14f4} -OUR_GUID_ENTRY(CLSID_AVIMIDIRender, -0x07b65360, 0xc445, 0x11ce, 0xaf, 0xde, 0x00, 0xaa, 0x00, 0x6c, 0x14, 0xf4) - -// {187463A0-5BB7-11d3-ACBE-0080C75E246E} WMSDK-based ASF reader -OUR_GUID_ENTRY(CLSID_WMAsfReader, -0x187463a0, 0x5bb7, 0x11d3, 0xac, 0xbe, 0x0, 0x80, 0xc7, 0x5e, 0x24, 0x6e) - -// {7c23220e-55bb-11d3-8b16-00c04fb6bd3d} WMSDK-based ASF writer -OUR_GUID_ENTRY(CLSID_WMAsfWriter, -0x7c23220e, 0x55bb, 0x11d3, 0x8b, 0x16, 0x0, 0xc0, 0x4f, 0xb6, 0xbd, 0x3d) - -// {afb6c280-2c41-11d3-8a60-0000f81e0e4a} -OUR_GUID_ENTRY(CLSID_MPEG2Demultiplexer, -0xafb6c280, 0x2c41, 0x11d3, 0x8a, 0x60, 0x00, 0x00, 0xf8, 0x1e, 0x0e, 0x4a) - -// {3ae86b20-7be8-11d1-abe6-00a0c905f375} -OUR_GUID_ENTRY(CLSID_MMSPLITTER, -0x3ae86b20, 0x7be8, 0x11d1, 0xab, 0xe6, 0x00, 0xa0, 0xc9, 0x05, 0xf3, 0x75) - - -// {B1B77C00-C3E4-11cf-AF79-00AA00B67A42} DV video decoder -OUR_GUID_ENTRY(CLSID_DVVideoCodec, -0xb1b77c00, 0xc3e4, 0x11cf, 0xaf, 0x79, 0x0, 0xaa, 0x0, 0xb6, 0x7a, 0x42) - -// {13AA3650-BB6F-11d0-AFB9-00AA00B67A42} DV video encoder -OUR_GUID_ENTRY(CLSID_DVVideoEnc, -0x13aa3650, 0xbb6f, 0x11d0, 0xaf, 0xb9, 0x0, 0xaa, 0x0, 0xb6, 0x7a, 0x42) - -// {4EB31670-9FC6-11cf-AF6E-00AA00B67A42} DV splitter -OUR_GUID_ENTRY(CLSID_DVSplitter, -0x4eb31670, 0x9fc6, 0x11cf, 0xaf, 0x6e, 0x0, 0xaa, 0x0, 0xb6, 0x7a, 0x42) - -// {129D7E40-C10D-11d0-AFB9-00AA00B67A42} DV muxer -OUR_GUID_ENTRY(CLSID_DVMux, -0x129d7e40, 0xc10d, 0x11d0, 0xaf, 0xb9, 0x0, 0xaa, 0x0, 0xb6, 0x7a, 0x42) - -// {060AF76C-68DD-11d0-8FC1-00C04FD9189D} -OUR_GUID_ENTRY(CLSID_SeekingPassThru, -0x60af76c, 0x68dd, 0x11d0, 0x8f, 0xc1, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0x9d) - -// 6E8D4A20-310C-11d0-B79A-00AA003767A7 Line21 (CC) Decoder -OUR_GUID_ENTRY(CLSID_Line21Decoder, -0x6e8d4a20, 0x310c, 0x11d0, 0xb7, 0x9a, 0x0, 0xaa, 0x0, 0x37, 0x67, 0xa7) - -// E4206432-01A1-4BEE-B3E1-3702C8EDC574 Line21 (CC) Decoder v2 -OUR_GUID_ENTRY(CLSID_Line21Decoder2, -0xe4206432, 0x01a1, 0x4bee, 0xb3, 0xe1, 0x37, 0x02, 0xc8, 0xed, 0xc5, 0x74) - -// {CD8743A1-3736-11d0-9E69-00C04FD7C15B} -OUR_GUID_ENTRY(CLSID_OverlayMixer, -0xcd8743a1, 0x3736, 0x11d0, 0x9e, 0x69, 0x0, 0xc0, 0x4f, 0xd7, 0xc1, 0x5b) - -// {814B9800-1C88-11d1-BAD9-00609744111A} -OUR_GUID_ENTRY(CLSID_VBISurfaces, -0x814b9800, 0x1c88, 0x11d1, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a) - -// {70BC06E0-5666-11d3-A184-00105AEF9F33} WST Teletext Decoder -OUR_GUID_ENTRY(CLSID_WSTDecoder, -0x70bc06e0, 0x5666, 0x11d3, 0xa1, 0x84, 0x0, 0x10, 0x5a, 0xef, 0x9f, 0x33) - -// {301056D0-6DFF-11d2-9EEB-006008039E37} -OUR_GUID_ENTRY(CLSID_MjpegDec, -0x301056d0, 0x6dff, 0x11d2, 0x9e, 0xeb, 0x0, 0x60, 0x8, 0x3, 0x9e, 0x37) - -// {B80AB0A0-7416-11d2-9EEB-006008039E37} -OUR_GUID_ENTRY(CLSID_MJPGEnc, -0xb80ab0a0, 0x7416, 0x11d2, 0x9e, 0xeb, 0x0, 0x60, 0x8, 0x3, 0x9e, 0x37) - - - -// pnp objects and categories -// 62BE5D10-60EB-11d0-BD3B-00A0C911CE86 ICreateDevEnum -OUR_GUID_ENTRY(CLSID_SystemDeviceEnum, -0x62BE5D10,0x60EB,0x11d0,0xBD,0x3B,0x00,0xA0,0xC9,0x11,0xCE,0x86) - -// 4315D437-5B8C-11d0-BD3B-00A0C911CE86 -OUR_GUID_ENTRY(CLSID_CDeviceMoniker, -0x4315D437,0x5B8C,0x11d0,0xBD,0x3B,0x00,0xA0,0xC9,0x11,0xCE,0x86) - -// 860BB310-5D01-11d0-BD3B-00A0C911CE86 Video capture category -OUR_GUID_ENTRY(CLSID_VideoInputDeviceCategory, -0x860BB310,0x5D01,0x11d0,0xBD,0x3B,0x00,0xA0,0xC9,0x11,0xCE,0x86) -OUR_GUID_ENTRY(CLSID_CVidCapClassManager, -0x860BB310,0x5D01,0x11d0,0xBD,0x3B,0x00,0xA0,0xC9,0x11,0xCE,0x86) - -// 083863F1-70DE-11d0-BD40-00A0C911CE86 Filter category -OUR_GUID_ENTRY(CLSID_LegacyAmFilterCategory, -0x083863F1,0x70DE,0x11d0,0xBD,0x40,0x00,0xA0,0xC9,0x11,0xCE,0x86) -OUR_GUID_ENTRY(CLSID_CQzFilterClassManager, -0x083863F1,0x70DE,0x11d0,0xBD,0x40,0x00,0xA0,0xC9,0x11,0xCE,0x86) - -// 33D9A760-90C8-11d0-BD43-00A0C911CE86 -OUR_GUID_ENTRY(CLSID_VideoCompressorCategory, -0x33d9a760, 0x90c8, 0x11d0, 0xbd, 0x43, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86) -OUR_GUID_ENTRY(CLSID_CIcmCoClassManager, -0x33d9a760, 0x90c8, 0x11d0, 0xbd, 0x43, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86) - -// 33D9A761-90C8-11d0-BD43-00A0C911CE86 -OUR_GUID_ENTRY(CLSID_AudioCompressorCategory, -0x33d9a761, 0x90c8, 0x11d0, 0xbd, 0x43, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86) -OUR_GUID_ENTRY(CLSID_CAcmCoClassManager, -0x33d9a761, 0x90c8, 0x11d0, 0xbd, 0x43, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86) - -// 33D9A762-90C8-11d0-BD43-00A0C911CE86 Audio source cateogry -OUR_GUID_ENTRY(CLSID_AudioInputDeviceCategory, -0x33d9a762, 0x90c8, 0x11d0, 0xbd, 0x43, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86) -OUR_GUID_ENTRY(CLSID_CWaveinClassManager, -0x33d9a762, 0x90c8, 0x11d0, 0xbd, 0x43, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86) - -// E0F158E1-CB04-11d0-BD4E-00A0C911CE86 Audio renderer category -OUR_GUID_ENTRY(CLSID_AudioRendererCategory, -0xe0f158e1, 0xcb04, 0x11d0, 0xbd, 0x4e, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86) -OUR_GUID_ENTRY(CLSID_CWaveOutClassManager, -0xe0f158e1, 0xcb04, 0x11d0, 0xbd, 0x4e, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86) - -// 4EFE2452-168A-11d1-BC76-00C04FB9453B Midi renderer category -OUR_GUID_ENTRY(CLSID_MidiRendererCategory, -0x4EfE2452, 0x168A, 0x11d1, 0xBC, 0x76, 0x0, 0xc0, 0x4F, 0xB9, 0x45, 0x3B) -OUR_GUID_ENTRY(CLSID_CMidiOutClassManager, -0x4EfE2452, 0x168A, 0x11d1, 0xBC, 0x76, 0x0, 0xc0, 0x4F, 0xB9, 0x45, 0x3B) - -// CC7BFB41-F175-11d1-A392-00E0291F3959 External Renderers Category -OUR_GUID_ENTRY(CLSID_TransmitCategory, -0xcc7bfb41, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59) - -// CC7BFB46-F175-11d1-A392-00E0291F3959 Device Control Filters -OUR_GUID_ENTRY(CLSID_DeviceControlCategory, -0xcc7bfb46, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59) - -// DA4E3DA0-D07D-11d0-BD50-00A0C911CE86 -OUR_GUID_ENTRY(CLSID_ActiveMovieCategories, -0xda4e3da0, 0xd07d, 0x11d0, 0xbd, 0x50, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86) - -// 2721AE20-7E70-11D0-A5D6-28DB04C10000 -OUR_GUID_ENTRY(CLSID_DVDHWDecodersCategory, -0x2721AE20, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00) - -// CDA42200-BD88-11d0-BD4E-00A0C911CE86 -OUR_GUID_ENTRY(CLSID_FilterMapper2, -0xcda42200, 0xbd88, 0x11d0, 0xbd, 0x4e, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86) - - -// 1e651cc0-b199-11d0-8212-00c04fc32c45 -OUR_GUID_ENTRY(CLSID_MemoryAllocator, -0x1e651cc0, 0xb199, 0x11d0, 0x82, 0x12, 0x00, 0xc0, 0x4f, 0xc3, 0x2c, 0x45) - -// CDBD8D00-C193-11d0-BD4E-00A0C911CE86 -OUR_GUID_ENTRY(CLSID_MediaPropertyBag, -0xcdbd8d00, 0xc193, 0x11d0, 0xbd, 0x4e, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86) - -// FCC152B7-F372-11d0-8E00-00C04FD7C08B -OUR_GUID_ENTRY(CLSID_DvdGraphBuilder, -0xFCC152B7, 0xF372, 0x11d0, 0x8E, 0x00, 0x00, 0xC0, 0x4F, 0xD7, 0xC0, 0x8B) - -// 9B8C4620-2C1A-11d0-8493-00A02438AD48 -OUR_GUID_ENTRY(CLSID_DVDNavigator, -0x9b8c4620, 0x2c1a, 0x11d0, 0x84, 0x93, 0x0, 0xa0, 0x24, 0x38, 0xad, 0x48) - -// f963c5cf-a659-4a93-9638-caf3cd277d13 -OUR_GUID_ENTRY(CLSID_DVDState, -0xf963c5cf, 0xa659, 0x4a93, 0x96, 0x38, 0xca, 0xf3, 0xcd, 0x27, 0x7d, 0x13) - -// CC58E280-8AA1-11d1-B3F1-00AA003761C5 -OUR_GUID_ENTRY(CLSID_SmartTee, -0xcc58e280, 0x8aa1, 0x11d1, 0xb3, 0xf1, 0x0, 0xaa, 0x0, 0x37, 0x61, 0xc5) - -// -- format types --- - -// 0F6417D6-C318-11D0-A43F-00A0C9223196 FORMAT_None -OUR_GUID_ENTRY(FORMAT_None, -0x0F6417D6, 0xc318, 0x11d0, 0xa4, 0x3f, 0x00, 0xa0, 0xc9, 0x22, 0x31, 0x96) - -// 05589f80-c356-11ce-bf01-00aa0055595a FORMAT_VideoInfo -OUR_GUID_ENTRY(FORMAT_VideoInfo, -0x05589f80, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a) - -// F72A76A0-EB0A-11d0-ACE4-0000C0CC16BA FORMAT_VideoInfo2 -OUR_GUID_ENTRY(FORMAT_VideoInfo2, -0xf72a76A0, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba) - -// 05589f81-c356-11ce-bf01-00aa0055595a FORMAT_WaveFormatEx -OUR_GUID_ENTRY(FORMAT_WaveFormatEx, -0x05589f81, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a) - -// 05589f82-c356-11ce-bf01-00aa0055595a FORMAT_MPEGVideo -OUR_GUID_ENTRY(FORMAT_MPEGVideo, -0x05589f82, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a) - -// 05589f83-c356-11ce-bf01-00aa0055595a FORMAT_MPEGStreams -OUR_GUID_ENTRY(FORMAT_MPEGStreams, -0x05589f83, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a) - -// 05589f84-c356-11ce-bf01-00aa0055595a FORMAT_DvInfo, DVINFO -OUR_GUID_ENTRY(FORMAT_DvInfo, -0x05589f84, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a) - - -// -- Video related GUIDs --- - - -// 944d4c00-dd52-11ce-bf0e-00aa0055595a -OUR_GUID_ENTRY(CLSID_DirectDrawProperties, -0x944d4c00, 0xdd52, 0x11ce, 0xbf, 0x0e, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a) - -// 59ce6880-acf8-11cf-b56e-0080c7c4b68a -OUR_GUID_ENTRY(CLSID_PerformanceProperties, -0x59ce6880, 0xacf8, 0x11cf, 0xb5, 0x6e, 0x00, 0x80, 0xc7, 0xc4, 0xb6, 0x8a) - -// 418afb70-f8b8-11ce-aac6-0020af0b99a3 -OUR_GUID_ENTRY(CLSID_QualityProperties, -0x418afb70, 0xf8b8, 0x11ce, 0xaa, 0xc6, 0x00, 0x20, 0xaf, 0x0b, 0x99, 0xa3) - -// 61ded640-e912-11ce-a099-00aa00479a58 -OUR_GUID_ENTRY(IID_IBaseVideoMixer, -0x61ded640, 0xe912, 0x11ce, 0xa0, 0x99, 0x00, 0xaa, 0x00, 0x47, 0x9a, 0x58) - -// 36d39eb0-dd75-11ce-bf0e-00aa0055595a -OUR_GUID_ENTRY(IID_IDirectDrawVideo, -0x36d39eb0, 0xdd75, 0x11ce, 0xbf, 0x0e, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a) - -// bd0ecb0-f8e2-11ce-aac6-0020af0b99a3 -OUR_GUID_ENTRY(IID_IQualProp, -0x1bd0ecb0, 0xf8e2, 0x11ce, 0xaa, 0xc6, 0x00, 0x20, 0xaf, 0x0b, 0x99, 0xa3) - -// {CE292861-FC88-11d0-9E69-00C04FD7C15B} -OUR_GUID_ENTRY(CLSID_VPObject, -0xce292861, 0xfc88, 0x11d0, 0x9e, 0x69, 0x0, 0xc0, 0x4f, 0xd7, 0xc1, 0x5b) - -// {CE292862-FC88-11d0-9E69-00C04FD7C15B} -OUR_GUID_ENTRY(IID_IVPObject, -0xce292862, 0xfc88, 0x11d0, 0x9e, 0x69, 0x0, 0xc0, 0x4f, 0xd7, 0xc1, 0x5b) - -// {25DF12C1-3DE0-11d1-9E69-00C04FD7C15B} -OUR_GUID_ENTRY(IID_IVPControl, -0x25df12c1, 0x3de0, 0x11d1, 0x9e, 0x69, 0x0, 0xc0, 0x4f, 0xd7, 0xc1, 0x5b) - -// {814B9801-1C88-11d1-BAD9-00609744111A} -OUR_GUID_ENTRY(CLSID_VPVBIObject, -0x814b9801, 0x1c88, 0x11d1, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a) - -// {814B9802-1C88-11d1-BAD9-00609744111A} -OUR_GUID_ENTRY(IID_IVPVBIObject, -0x814b9802, 0x1c88, 0x11d1, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a) - -// {BC29A660-30E3-11d0-9E69-00C04FD7C15B} -OUR_GUID_ENTRY(IID_IVPConfig, -0xbc29a660, 0x30e3, 0x11d0, 0x9e, 0x69, 0x0, 0xc0, 0x4f, 0xd7, 0xc1, 0x5b) - -// {C76794A1-D6C5-11d0-9E69-00C04FD7C15B} -OUR_GUID_ENTRY(IID_IVPNotify, -0xc76794a1, 0xd6c5, 0x11d0, 0x9e, 0x69, 0x0, 0xc0, 0x4f, 0xd7, 0xc1, 0x5b) - -// {EBF47183-8764-11d1-9E69-00C04FD7C15B} -OUR_GUID_ENTRY(IID_IVPNotify2, -0xebf47183, 0x8764, 0x11d1, 0x9e, 0x69, 0x0, 0xc0, 0x4f, 0xd7, 0xc1, 0x5b) - - -// {EC529B00-1A1F-11D1-BAD9-00609744111A} -OUR_GUID_ENTRY(IID_IVPVBIConfig, -0xec529b00, 0x1a1f, 0x11d1, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a) - -// {EC529B01-1A1F-11D1-BAD9-00609744111A} -OUR_GUID_ENTRY(IID_IVPVBINotify, -0xec529b01, 0x1a1f, 0x11d1, 0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a) - -// {593CDDE1-0759-11d1-9E69-00C04FD7C15B} -OUR_GUID_ENTRY(IID_IMixerPinConfig, -0x593cdde1, 0x759, 0x11d1, 0x9e, 0x69, 0x0, 0xc0, 0x4f, 0xd7, 0xc1, 0x5b) - -// {EBF47182-8764-11d1-9E69-00C04FD7C15B} -OUR_GUID_ENTRY(IID_IMixerPinConfig2, -0xebf47182, 0x8764, 0x11d1, 0x9e, 0x69, 0x0, 0xc0, 0x4f, 0xd7, 0xc1, 0x5b) - - -// {FA2AA8F4-8B62-11D0-A520-000000000000) -OUR_GUID_ENTRY(IID_IAMMediaContent, -0xFA2AA8F4, 0x8B62, 0x11D0, 0xA5, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) - - -// This is a bit awkward. The OLE GUIDs are separated out into a different -// file from the main header files. The header files can then be included -// multiple times and are protected with the following statements, -// -// #ifndef __SOMETHING_DEFINED__ -// #define __SOMETHING_DEFINED__ -// all the header contents -// #endif // __SOMETHING_DEFINED__ -// -// When the actual GUIDs are to be defined (using initguid), the GUID header -// file can then be included to really define them just once. Unfortunately, -// DirectDraw has the GUIDs defined in the main header file. So if the base -// classes bring in ddraw.h to get at the DirectDraw structures and so on, -// nobody would then be able to really include ddraw.h to allocate the GUID -// memory structures because of the aforementioned header file protection. -// Therefore, the DirectDraw GUIDs are defined and really allocated here. - -#ifndef __DDRAW_INCLUDED__ -OUR_GUID_ENTRY(CLSID_DirectDraw, 0xD7B70EE0,0x4340,0x11CF,0xB0,0x63,0x00,0x20,0xAF,0xC2,0xCD,0x35) -OUR_GUID_ENTRY(CLSID_DirectDrawClipper, 0x593817A0,0x7DB3,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xb9,0x33,0x56) -OUR_GUID_ENTRY(IID_IDirectDraw, 0x6C14DB80,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60) -OUR_GUID_ENTRY(IID_IDirectDraw2, 0xB3A6F3E0,0x2B43,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xB9,0x33,0x56) -OUR_GUID_ENTRY(IID_IDirectDrawSurface, 0x6C14DB81,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60) -OUR_GUID_ENTRY(IID_IDirectDrawSurface2, 0x57805885,0x6eec,0x11cf,0x94,0x41,0xa8,0x23,0x03,0xc1,0x0e,0x27) -OUR_GUID_ENTRY(IID_IDirectDrawSurface3, 0xDA044E00,0x69B2,0x11D0,0xA1,0xD5,0x00,0xAA,0x00,0xB8,0xDF,0xBB) -OUR_GUID_ENTRY(IID_IDirectDrawSurface4, 0x0B2B8630,0xAD35,0x11D0,0x8E,0xA6,0x00,0x60,0x97,0x97,0xEA,0x5B) -OUR_GUID_ENTRY(IID_IDirectDrawSurface7, 0x06675a80,0x3b9b,0x11d2,0xb9,0x2f,0x00,0x60,0x97,0x97,0xea,0x5b) -OUR_GUID_ENTRY(IID_IDirectDrawPalette, 0x6C14DB84,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60) -OUR_GUID_ENTRY(IID_IDirectDrawClipper, 0x6C14DB85,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60) -OUR_GUID_ENTRY(IID_IDirectDrawColorControl, 0x4B9F0EE0,0x0D7E,0x11D0,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8) -#endif - -#ifndef __DVP_INCLUDED__ -OUR_GUID_ENTRY(IID_IDDVideoPortContainer, 0x6C142760,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60) -#endif - -#ifndef __DDKM_INCLUDED__ -OUR_GUID_ENTRY(IID_IDirectDrawKernel, 0x8D56C120,0x6A08,0x11D0,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8) -OUR_GUID_ENTRY(IID_IDirectDrawSurfaceKernel, 0x60755DA0,0x6A40,0x11D0,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8) -#endif - -// 0618aa30-6bc4-11cf-bf36-00aa0055595a -OUR_GUID_ENTRY(CLSID_ModexProperties, -0x0618aa30, 0x6bc4, 0x11cf, 0xbf, 0x36, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a) - -// dd1d7110-7836-11cf-bf47-00aa0055595a -OUR_GUID_ENTRY(IID_IFullScreenVideo, -0xdd1d7110, 0x7836, 0x11cf, 0xbf, 0x47, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a) - -// 53479470-f1dd-11cf-bc42-00aa00ac74f6 -OUR_GUID_ENTRY(IID_IFullScreenVideoEx, -0x53479470, 0xf1dd, 0x11cf, 0xbc, 0x42, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6) - -// {101193C0-0BFE-11d0-AF91-00AA00B67A42} DV decoder property -OUR_GUID_ENTRY(CLSID_DVDecPropertiesPage, -0x101193c0, 0xbfe, 0x11d0, 0xaf, 0x91, 0x0, 0xaa, 0x0, 0xb6, 0x7a, 0x42) - -// {4150F050-BB6F-11d0-AFB9-00AA00B67A42} DV encoder property -OUR_GUID_ENTRY(CLSID_DVEncPropertiesPage, -0x4150f050, 0xbb6f, 0x11d0, 0xaf, 0xb9, 0x0, 0xaa, 0x0, 0xb6, 0x7a, 0x42) - -// {4DB880E0-C10D-11d0-AFB9-00AA00B67A42} DV Muxer property -OUR_GUID_ENTRY(CLSID_DVMuxPropertyPage, -0x4db880e0, 0xc10d, 0x11d0, 0xaf, 0xb9, 0x0, 0xaa, 0x0, 0xb6, 0x7a, 0x42) - - -// -- Direct Sound Audio related GUID --- - -// 546F4260-D53E-11cf-B3F0-00AA003761C5 -OUR_GUID_ENTRY(IID_IAMDirectSound, -0x546f4260, 0xd53e, 0x11cf, 0xb3, 0xf0, 0x0, 0xaa, 0x0, 0x37, 0x61, 0xc5) - -// -- MPEG audio decoder properties - -// {b45dd570-3c77-11d1-abe1-00a0c905f375} -OUR_GUID_ENTRY(IID_IMpegAudioDecoder, -0xb45dd570, 0x3c77, 0x11d1, 0xab, 0xe1, 0x00, 0xa0, 0xc9, 0x05, 0xf3, 0x75) - -// --- Line21 Decoder interface GUID --- - -// 6E8D4A21-310C-11d0-B79A-00AA003767A7 IID_IAMLine21Decoder -OUR_GUID_ENTRY(IID_IAMLine21Decoder, -0x6e8d4a21, 0x310c, 0x11d0, 0xb7, 0x9a, 0x0, 0xaa, 0x0, 0x37, 0x67, 0xa7) - -// --- WST Decoder interface GUID --- - -// C056DE21-75C2-11d3-A184-00105AEF9F33 IID_IAMWstDecoder -OUR_GUID_ENTRY(IID_IAMWstDecoder, -0xc056de21, 0x75c2, 0x11d3, 0xa1, 0x84, 0x0, 0x10, 0x5a, 0xef, 0x9f, 0x33) - -// --- WST Decoder Property Page --- - -// 04E27F80-91E4-11d3-A184-00105AEF9F33 WST Decoder Property Page -OUR_GUID_ENTRY(CLSID_WstDecoderPropertyPage, -0x4e27f80, 0x91e4, 0x11d3, 0xa1, 0x84, 0x0, 0x10, 0x5a, 0xef, 0x9f, 0x33) - - -// -- Analog video related GUIDs --- - - -// -- format types --- -// 0482DDE0-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(FORMAT_AnalogVideo, -0x482dde0, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - - -// -- major type, Analog Video - -// 0482DDE1-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIATYPE_AnalogVideo, -0x482dde1, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - - -// -- Analog Video subtypes, NTSC - -// 0482DDE2-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIASUBTYPE_AnalogVideo_NTSC_M, -0x482dde2, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// -- Analog Video subtypes, PAL - -// 0482DDE5-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIASUBTYPE_AnalogVideo_PAL_B, -0x482dde5, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// 0482DDE6-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIASUBTYPE_AnalogVideo_PAL_D, -0x482dde6, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// 0482DDE7-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIASUBTYPE_AnalogVideo_PAL_G, -0x482dde7, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// 0482DDE8-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIASUBTYPE_AnalogVideo_PAL_H, -0x482dde8, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// 0482DDE9-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIASUBTYPE_AnalogVideo_PAL_I, -0x482dde9, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// 0482DDEA-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIASUBTYPE_AnalogVideo_PAL_M, -0x482ddea, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// 0482DDEB-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIASUBTYPE_AnalogVideo_PAL_N, -0x482ddeb, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// 0482DDEC-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIASUBTYPE_AnalogVideo_PAL_N_COMBO, -0x482ddec, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// -- Analog Video subtypes, SECAM - -// 0482DDF0-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIASUBTYPE_AnalogVideo_SECAM_B, -0x482ddf0, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// 0482DDF1-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIASUBTYPE_AnalogVideo_SECAM_D, -0x482ddf1, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// 0482DDF2-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIASUBTYPE_AnalogVideo_SECAM_G, -0x482ddf2, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// 0482DDF3-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIASUBTYPE_AnalogVideo_SECAM_H, -0x482ddf3, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// 0482DDF4-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIASUBTYPE_AnalogVideo_SECAM_K, -0x482ddf4, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// 0482DDF5-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIASUBTYPE_AnalogVideo_SECAM_K1, -0x482ddf5, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// 0482DDF6-7817-11cf-8A03-00AA006ECB65 -OUR_GUID_ENTRY(MEDIASUBTYPE_AnalogVideo_SECAM_L, -0x482ddf6, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - - -// -- External audio related GUIDs --- - -// -- major types, Analog Audio - -// 0482DEE1-7817-11cf-8a03-00aa006ecb65 -OUR_GUID_ENTRY(MEDIATYPE_AnalogAudio, -0x482dee1, 0x7817, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// -// DirectShow's include file based on ksmedia.h from WDM DDK -// -#include "ksuuids.h" - - -// -- Well-known time format GUIDs --- - - -// 00000000-0000-0000-0000-000000000000 -OUR_GUID_ENTRY(TIME_FORMAT_NONE, -0L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - -// 7b785570-8c82-11cf-bc0c-00aa00ac74f6 -OUR_GUID_ENTRY(TIME_FORMAT_FRAME, -0x7b785570, 0x8c82, 0x11cf, 0xbc, 0xc, 0x0, 0xaa, 0x0, 0xac, 0x74, 0xf6) - -// 7b785571-8c82-11cf-bc0c-00aa00ac74f6 -OUR_GUID_ENTRY(TIME_FORMAT_BYTE, -0x7b785571, 0x8c82, 0x11cf, 0xbc, 0xc, 0x0, 0xaa, 0x0, 0xac, 0x74, 0xf6) - -// 7b785572-8c82-11cf-bc0c-00aa00ac74f6 -OUR_GUID_ENTRY(TIME_FORMAT_SAMPLE, -0x7b785572, 0x8c82, 0x11cf, 0xbc, 0xc, 0x0, 0xaa, 0x0, 0xac, 0x74, 0xf6) - -// 7b785573-8c82-11cf-bc0c-00aa00ac74f6 -OUR_GUID_ENTRY(TIME_FORMAT_FIELD, -0x7b785573, 0x8c82, 0x11cf, 0xbc, 0xc, 0x0, 0xaa, 0x0, 0xac, 0x74, 0xf6) - - -// 7b785574-8c82-11cf-bc0c-00aa00ac74f6 -OUR_GUID_ENTRY(TIME_FORMAT_MEDIA_TIME, -0x7b785574, 0x8c82, 0x11cf, 0xbc, 0xc, 0x0, 0xaa, 0x0, 0xac, 0x74, 0xf6) - - -// for IKsPropertySet - -// 9B00F101-1567-11d1-B3F1-00AA003761C5 -OUR_GUID_ENTRY(AMPROPSETID_Pin, -0x9b00f101, 0x1567, 0x11d1, 0xb3, 0xf1, 0x0, 0xaa, 0x0, 0x37, 0x61, 0xc5) - -// fb6c4281-0353-11d1-905f-0000c0cc16ba -OUR_GUID_ENTRY(PIN_CATEGORY_CAPTURE, -0xfb6c4281, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba) - -// fb6c4282-0353-11d1-905f-0000c0cc16ba -OUR_GUID_ENTRY(PIN_CATEGORY_PREVIEW, -0xfb6c4282, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba) - -// fb6c4283-0353-11d1-905f-0000c0cc16ba -OUR_GUID_ENTRY(PIN_CATEGORY_ANALOGVIDEOIN, -0xfb6c4283, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba) - -// fb6c4284-0353-11d1-905f-0000c0cc16ba -OUR_GUID_ENTRY(PIN_CATEGORY_VBI, -0xfb6c4284, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba) - -// fb6c4285-0353-11d1-905f-0000c0cc16ba -OUR_GUID_ENTRY(PIN_CATEGORY_VIDEOPORT, -0xfb6c4285, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba) - -// fb6c4286-0353-11d1-905f-0000c0cc16ba -OUR_GUID_ENTRY(PIN_CATEGORY_NABTS, -0xfb6c4286, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba) - -// fb6c4287-0353-11d1-905f-0000c0cc16ba -OUR_GUID_ENTRY(PIN_CATEGORY_EDS, -0xfb6c4287, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba) - -// fb6c4288-0353-11d1-905f-0000c0cc16ba -OUR_GUID_ENTRY(PIN_CATEGORY_TELETEXT, -0xfb6c4288, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba) - -// fb6c4289-0353-11d1-905f-0000c0cc16ba -OUR_GUID_ENTRY(PIN_CATEGORY_CC, -0xfb6c4289, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba) - -// fb6c428a-0353-11d1-905f-0000c0cc16ba -OUR_GUID_ENTRY(PIN_CATEGORY_STILL, -0xfb6c428a, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba) - -// fb6c428b-0353-11d1-905f-0000c0cc16ba -OUR_GUID_ENTRY(PIN_CATEGORY_TIMECODE, -0xfb6c428b, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba) - -// fb6c428c-0353-11d1-905f-0000c0cc16ba -OUR_GUID_ENTRY(PIN_CATEGORY_VIDEOPORT_VBI, -0xfb6c428c, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba) - - -// The following special GUIDS are used by ICaptureGraphBuilder::FindInterface - -// {AC798BE0-98E3-11d1-B3F1-00AA003761C5} -OUR_GUID_ENTRY(LOOK_UPSTREAM_ONLY, -0xac798be0, 0x98e3, 0x11d1, 0xb3, 0xf1, 0x0, 0xaa, 0x0, 0x37, 0x61, 0xc5) - -// {AC798BE1-98E3-11d1-B3F1-00AA003761C5} -OUR_GUID_ENTRY(LOOK_DOWNSTREAM_ONLY, -0xac798be1, 0x98e3, 0x11d1, 0xb3, 0xf1, 0x0, 0xaa, 0x0, 0x37, 0x61, 0xc5) - -// ------------------------------------------------------------------------- -// KSProxy GUIDS -// ------------------------------------------------------------------------- - -// {266EEE41-6C63-11cf-8A03-00AA006ECB65} -OUR_GUID_ENTRY(CLSID_TVTunerFilterPropertyPage, -0x266eee41, 0x6c63, 0x11cf, 0x8a, 0x3, 0x0, 0xaa, 0x0, 0x6e, 0xcb, 0x65) - -// {71F96461-78F3-11d0-A18C-00A0C9118956} -OUR_GUID_ENTRY(CLSID_CrossbarFilterPropertyPage, -0x71f96461, 0x78f3, 0x11d0, 0xa1, 0x8c, 0x0, 0xa0, 0xc9, 0x11, 0x89, 0x56) - -// {71F96463-78F3-11d0-A18C-00A0C9118956} -OUR_GUID_ENTRY(CLSID_TVAudioFilterPropertyPage, -0x71f96463, 0x78f3, 0x11d0, 0xa1, 0x8c, 0x0, 0xa0, 0xc9, 0x11, 0x89, 0x56) - -// {71F96464-78F3-11d0-A18C-00A0C9118956} -OUR_GUID_ENTRY(CLSID_VideoProcAmpPropertyPage, -0x71f96464, 0x78f3, 0x11d0, 0xa1, 0x8c, 0x0, 0xa0, 0xc9, 0x11, 0x89, 0x56) - -// {71F96465-78F3-11d0-A18C-00A0C9118956} -OUR_GUID_ENTRY(CLSID_CameraControlPropertyPage, -0x71f96465, 0x78f3, 0x11d0, 0xa1, 0x8c, 0x0, 0xa0, 0xc9, 0x11, 0x89, 0x56) - -// {71F96466-78F3-11d0-A18C-00A0C9118956} -OUR_GUID_ENTRY(CLSID_AnalogVideoDecoderPropertyPage, -0x71f96466, 0x78f3, 0x11d0, 0xa1, 0x8c, 0x0, 0xa0, 0xc9, 0x11, 0x89, 0x56) - -// {71F96467-78F3-11d0-A18C-00A0C9118956} -OUR_GUID_ENTRY(CLSID_VideoStreamConfigPropertyPage, -0x71f96467, 0x78f3, 0x11d0, 0xa1, 0x8c, 0x0, 0xa0, 0xc9, 0x11, 0x89, 0x56) - -// {37E92A92-D9AA-11d2-BF84-8EF2B1555AED} Audio Renderer Advanced Property Page -OUR_GUID_ENTRY(CLSID_AudioRendererAdvancedProperties, -0x37e92a92, 0xd9aa, 0x11d2, 0xbf, 0x84, 0x8e, 0xf2, 0xb1, 0x55, 0x5a, 0xed) - - -// ------------------------------------------------------------------------- -// VMR GUIDS -// ------------------------------------------------------------------------- - -// {B87BEB7B-8D29-423f-AE4D-6582C10175AC} -OUR_GUID_ENTRY(CLSID_VideoMixingRenderer, -0xB87BEB7B, 0x8D29, 0x423f, 0xAE, 0x4D, 0x65, 0x82, 0xC1, 0x01, 0x75, 0xAC) - -// {6BC1CFFA-8FC1-4261-AC22-CFB4CC38DB50} -OUR_GUID_ENTRY(CLSID_VideoRendererDefault, -0x6BC1CFFA, 0x8FC1, 0x4261, 0xAC, 0x22, 0xCF, 0xB4, 0xCC, 0x38, 0xDB, 0x50) - -// {99d54f63-1a69-41ae-aa4d-c976eb3f0713} -OUR_GUID_ENTRY(CLSID_AllocPresenter, -0x99d54f63, 0x1a69, 0x41ae, 0xaa, 0x4d, 0xc9, 0x76, 0xeb, 0x3f, 0x07, 0x13) - -// {4444ac9e-242e-471b-a3c7-45dcd46352bc} -OUR_GUID_ENTRY(CLSID_AllocPresenterDDXclMode, -0x4444ac9e, 0x242e, 0x471b, 0xa3, 0xc7, 0x45, 0xdc, 0xd4, 0x63, 0x52, 0xbc) - -// {6f26a6cd-967b-47fd-874a-7aed2c9d25a2} -OUR_GUID_ENTRY(CLSID_VideoPortManager, -0x6f26a6cd, 0x967b, 0x47fd, 0x87, 0x4a, 0x7a, 0xed, 0x2c, 0x9d, 0x25, 0xa2) - -// ------------------------------------------------------------------------- -// BDA Network Provider GUIDS -// ------------------------------------------------------------------------- - -// {0DAD2FDD-5FD7-11D3-8F50-00C04F7971E2} -OUR_GUID_ENTRY(CLSID_ATSCNetworkProvider, -0x0dad2fdd, 0x5fd7, 0x11d3, 0x8f, 0x50, 0x00, 0xc0, 0x4f, 0x79, 0x71, 0xe2) - -// {E3444D16-5AC4-4386-88DF-13FD230E1DDA} -OUR_GUID_ENTRY(CLSID_ATSCNetworkPropertyPage, -0xe3444d16, 0x5ac4, 0x4386, 0x88, 0xdf, 0x13, 0xfd, 0x23, 0x0e, 0x1d, 0xda) - -// {FA4B375A-45B4-4d45-8440-263957B11623} -OUR_GUID_ENTRY(CLSID_DVBSNetworkProvider, -0xfa4b375a, 0x45b4, 0x4d45, 0x84, 0x40, 0x26, 0x39, 0x57, 0xb1, 0x16, 0x23) - - -// ------------------------------------------------------------------------- -// TVE Receiver filter guids -// ------------------------------------------------------------------------- - -// The CLSID used by the TVE Receiver filter -// {05500280-FAA5-4DF9-8246-BFC23AC5CEA8} -OUR_GUID_ENTRY(CLSID_DShowTVEFilter, -0x05500280, 0xFAA5, 0x4DF9, 0x82, 0x46, 0xBF, 0xC2, 0x3A, 0xC5, 0xCE, 0xA8) - -// {05500281-FAA5-4DF9-8246-BFC23AC5CEA8} -OUR_GUID_ENTRY(CLSID_TVEFilterTuneProperties, -0x05500281, 0xFAA5, 0x4DF9, 0x82, 0x46, 0xBF, 0xC2, 0x3A, 0xC5, 0xCE, 0xA8) - - -// {05500282-FAA5-4DF9-8246-BFC23AC5CEA8} -OUR_GUID_ENTRY(CLSID_TVEFilterCCProperties, -0x05500282, 0xFAA5, 0x4DF9, 0x82, 0x46, 0xBF, 0xC2, 0x3A, 0xC5, 0xCE, 0xA8) - -// {05500283-FAA5-4DF9-8246-BFC23AC5CEA8} -OUR_GUID_ENTRY(CLSID_TVEFilterStatsProperties, -0x05500283, 0xFAA5, 0x4DF9, 0x82, 0x46, 0xBF, 0xC2, 0x3A, 0xC5, 0xCE, 0xA8) - -#undef OUR_GUID_ENTRY diff --git a/import/DirectX8/include/vfwmsgs.h b/import/DirectX8/include/vfwmsgs.h deleted file mode 100644 index ea66d121c..000000000 --- a/import/DirectX8/include/vfwmsgs.h +++ /dev/null @@ -1,1325 +0,0 @@ - // no longer used - but might get - // our own facility in the future? - // FacilityNames=(FACILITY_VFW=0x4) - // To add a message: - // - // The MessageId is the number of the message. - // Accepted severities are 'Success' and 'Warning'. - // - // Facility should be FACILITY_ITF (was FACILITY_VFW). - // - // The SymbolicName is the name used in the code to identify the message. - // The text of a message starts the line after 'Language=' and - // ends before a line with only a '.' in column one. -// -// Values are 32 bit values layed out as follows: -// -// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 -// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 -// +---+-+-+-----------------------+-------------------------------+ -// |Sev|C|R| Facility | Code | -// +---+-+-+-----------------------+-------------------------------+ -// -// where -// -// Sev - is the severity code -// -// 00 - Success -// 01 - Informational -// 10 - Warning -// 11 - Error -// -// C - is the Customer code flag -// -// R - is a reserved bit -// -// Facility - is the facility code -// -// Code - is the facility's status code -// -// -// Define the facility codes -// - - -// -// Define the severity codes -// - - -// -// MessageId: VFW_E_INVALIDMEDIATYPE -// -// MessageText: -// -// An invalid media type was specified.%0 -// -#define VFW_E_INVALIDMEDIATYPE ((HRESULT)0x80040200L) - -// -// MessageId: VFW_E_INVALIDSUBTYPE -// -// MessageText: -// -// An invalid media subtype was specified.%0 -// -#define VFW_E_INVALIDSUBTYPE ((HRESULT)0x80040201L) - -// -// MessageId: VFW_E_NEED_OWNER -// -// MessageText: -// -// This object can only be created as an aggregated object.%0 -// -#define VFW_E_NEED_OWNER ((HRESULT)0x80040202L) - -// -// MessageId: VFW_E_ENUM_OUT_OF_SYNC -// -// MessageText: -// -// The enumerator has become invalid.%0 -// -#define VFW_E_ENUM_OUT_OF_SYNC ((HRESULT)0x80040203L) - -// -// MessageId: VFW_E_ALREADY_CONNECTED -// -// MessageText: -// -// At least one of the pins involved in the operation is already connected.%0 -// -#define VFW_E_ALREADY_CONNECTED ((HRESULT)0x80040204L) - -// -// MessageId: VFW_E_FILTER_ACTIVE -// -// MessageText: -// -// This operation cannot be performed because the filter is active.%0 -// -#define VFW_E_FILTER_ACTIVE ((HRESULT)0x80040205L) - -// -// MessageId: VFW_E_NO_TYPES -// -// MessageText: -// -// One of the specified pins supports no media types.%0 -// -#define VFW_E_NO_TYPES ((HRESULT)0x80040206L) - -// -// MessageId: VFW_E_NO_ACCEPTABLE_TYPES -// -// MessageText: -// -// There is no common media type between these pins.%0 -// -#define VFW_E_NO_ACCEPTABLE_TYPES ((HRESULT)0x80040207L) - -// -// MessageId: VFW_E_INVALID_DIRECTION -// -// MessageText: -// -// Two pins of the same direction cannot be connected together.%0 -// -#define VFW_E_INVALID_DIRECTION ((HRESULT)0x80040208L) - -// -// MessageId: VFW_E_NOT_CONNECTED -// -// MessageText: -// -// The operation cannot be performed because the pins are not connected.%0 -// -#define VFW_E_NOT_CONNECTED ((HRESULT)0x80040209L) - -// -// MessageId: VFW_E_NO_ALLOCATOR -// -// MessageText: -// -// No sample buffer allocator is available.%0 -// -#define VFW_E_NO_ALLOCATOR ((HRESULT)0x8004020AL) - -// -// MessageId: VFW_E_RUNTIME_ERROR -// -// MessageText: -// -// A run-time error occurred.%0 -// -#define VFW_E_RUNTIME_ERROR ((HRESULT)0x8004020BL) - -// -// MessageId: VFW_E_BUFFER_NOTSET -// -// MessageText: -// -// No buffer space has been set.%0 -// -#define VFW_E_BUFFER_NOTSET ((HRESULT)0x8004020CL) - -// -// MessageId: VFW_E_BUFFER_OVERFLOW -// -// MessageText: -// -// The buffer is not big enough.%0 -// -#define VFW_E_BUFFER_OVERFLOW ((HRESULT)0x8004020DL) - -// -// MessageId: VFW_E_BADALIGN -// -// MessageText: -// -// An invalid alignment was specified.%0 -// -#define VFW_E_BADALIGN ((HRESULT)0x8004020EL) - -// -// MessageId: VFW_E_ALREADY_COMMITTED -// -// MessageText: -// -// Cannot change allocated memory while the filter is active.%0 -// -#define VFW_E_ALREADY_COMMITTED ((HRESULT)0x8004020FL) - -// -// MessageId: VFW_E_BUFFERS_OUTSTANDING -// -// MessageText: -// -// One or more buffers are still active.%0 -// -#define VFW_E_BUFFERS_OUTSTANDING ((HRESULT)0x80040210L) - -// -// MessageId: VFW_E_NOT_COMMITTED -// -// MessageText: -// -// Cannot allocate a sample when the allocator is not active.%0 -// -#define VFW_E_NOT_COMMITTED ((HRESULT)0x80040211L) - -// -// MessageId: VFW_E_SIZENOTSET -// -// MessageText: -// -// Cannot allocate memory because no size has been set.%0 -// -#define VFW_E_SIZENOTSET ((HRESULT)0x80040212L) - -// -// MessageId: VFW_E_NO_CLOCK -// -// MessageText: -// -// Cannot lock for synchronization because no clock has been defined.%0 -// -#define VFW_E_NO_CLOCK ((HRESULT)0x80040213L) - -// -// MessageId: VFW_E_NO_SINK -// -// MessageText: -// -// Quality messages could not be sent because no quality sink has been defined.%0 -// -#define VFW_E_NO_SINK ((HRESULT)0x80040214L) - -// -// MessageId: VFW_E_NO_INTERFACE -// -// MessageText: -// -// A required interface has not been implemented.%0 -// -#define VFW_E_NO_INTERFACE ((HRESULT)0x80040215L) - -// -// MessageId: VFW_E_NOT_FOUND -// -// MessageText: -// -// An object or name was not found.%0 -// -#define VFW_E_NOT_FOUND ((HRESULT)0x80040216L) - -// -// MessageId: VFW_E_CANNOT_CONNECT -// -// MessageText: -// -// No combination of intermediate filters could be found to make the connection.%0 -// -#define VFW_E_CANNOT_CONNECT ((HRESULT)0x80040217L) - -// -// MessageId: VFW_E_CANNOT_RENDER -// -// MessageText: -// -// No combination of filters could be found to render the stream.%0 -// -#define VFW_E_CANNOT_RENDER ((HRESULT)0x80040218L) - -// -// MessageId: VFW_E_CHANGING_FORMAT -// -// MessageText: -// -// Could not change formats dynamically.%0 -// -#define VFW_E_CHANGING_FORMAT ((HRESULT)0x80040219L) - -// -// MessageId: VFW_E_NO_COLOR_KEY_SET -// -// MessageText: -// -// No color key has been set.%0 -// -#define VFW_E_NO_COLOR_KEY_SET ((HRESULT)0x8004021AL) - -// -// MessageId: VFW_E_NOT_OVERLAY_CONNECTION -// -// MessageText: -// -// Current pin connection is not using the IOverlay transport.%0 -// -#define VFW_E_NOT_OVERLAY_CONNECTION ((HRESULT)0x8004021BL) - -// -// MessageId: VFW_E_NOT_SAMPLE_CONNECTION -// -// MessageText: -// -// Current pin connection is not using the IMemInputPin transport.%0 -// -#define VFW_E_NOT_SAMPLE_CONNECTION ((HRESULT)0x8004021CL) - -// -// MessageId: VFW_E_PALETTE_SET -// -// MessageText: -// -// Setting a color key would conflict with the palette already set.%0 -// -#define VFW_E_PALETTE_SET ((HRESULT)0x8004021DL) - -// -// MessageId: VFW_E_COLOR_KEY_SET -// -// MessageText: -// -// Setting a palette would conflict with the color key already set.%0 -// -#define VFW_E_COLOR_KEY_SET ((HRESULT)0x8004021EL) - -// -// MessageId: VFW_E_NO_COLOR_KEY_FOUND -// -// MessageText: -// -// No matching color key is available.%0 -// -#define VFW_E_NO_COLOR_KEY_FOUND ((HRESULT)0x8004021FL) - -// -// MessageId: VFW_E_NO_PALETTE_AVAILABLE -// -// MessageText: -// -// No palette is available.%0 -// -#define VFW_E_NO_PALETTE_AVAILABLE ((HRESULT)0x80040220L) - -// -// MessageId: VFW_E_NO_DISPLAY_PALETTE -// -// MessageText: -// -// Display does not use a palette.%0 -// -#define VFW_E_NO_DISPLAY_PALETTE ((HRESULT)0x80040221L) - -// -// MessageId: VFW_E_TOO_MANY_COLORS -// -// MessageText: -// -// Too many colors for the current display settings.%0 -// -#define VFW_E_TOO_MANY_COLORS ((HRESULT)0x80040222L) - -// -// MessageId: VFW_E_STATE_CHANGED -// -// MessageText: -// -// The state changed while waiting to process the sample.%0 -// -#define VFW_E_STATE_CHANGED ((HRESULT)0x80040223L) - -// -// MessageId: VFW_E_NOT_STOPPED -// -// MessageText: -// -// The operation could not be performed because the filter is not stopped.%0 -// -#define VFW_E_NOT_STOPPED ((HRESULT)0x80040224L) - -// -// MessageId: VFW_E_NOT_PAUSED -// -// MessageText: -// -// The operation could not be performed because the filter is not paused.%0 -// -#define VFW_E_NOT_PAUSED ((HRESULT)0x80040225L) - -// -// MessageId: VFW_E_NOT_RUNNING -// -// MessageText: -// -// The operation could not be performed because the filter is not running.%0 -// -#define VFW_E_NOT_RUNNING ((HRESULT)0x80040226L) - -// -// MessageId: VFW_E_WRONG_STATE -// -// MessageText: -// -// The operation could not be performed because the filter is in the wrong state.%0 -// -#define VFW_E_WRONG_STATE ((HRESULT)0x80040227L) - -// -// MessageId: VFW_E_START_TIME_AFTER_END -// -// MessageText: -// -// The sample start time is after the sample end time.%0 -// -#define VFW_E_START_TIME_AFTER_END ((HRESULT)0x80040228L) - -// -// MessageId: VFW_E_INVALID_RECT -// -// MessageText: -// -// The supplied rectangle is invalid.%0 -// -#define VFW_E_INVALID_RECT ((HRESULT)0x80040229L) - -// -// MessageId: VFW_E_TYPE_NOT_ACCEPTED -// -// MessageText: -// -// This pin cannot use the supplied media type.%0 -// -#define VFW_E_TYPE_NOT_ACCEPTED ((HRESULT)0x8004022AL) - -// -// MessageId: VFW_E_SAMPLE_REJECTED -// -// MessageText: -// -// This sample cannot be rendered.%0 -// -#define VFW_E_SAMPLE_REJECTED ((HRESULT)0x8004022BL) - -// -// MessageId: VFW_E_SAMPLE_REJECTED_EOS -// -// MessageText: -// -// This sample cannot be rendered because the end of the stream has been reached.%0 -// -#define VFW_E_SAMPLE_REJECTED_EOS ((HRESULT)0x8004022CL) - -// -// MessageId: VFW_E_DUPLICATE_NAME -// -// MessageText: -// -// An attempt to add a filter with a duplicate name failed.%0 -// -#define VFW_E_DUPLICATE_NAME ((HRESULT)0x8004022DL) - -// -// MessageId: VFW_S_DUPLICATE_NAME -// -// MessageText: -// -// An attempt to add a filter with a duplicate name succeeded with a modified name.%0 -// -#define VFW_S_DUPLICATE_NAME ((HRESULT)0x0004022DL) - -// -// MessageId: VFW_E_TIMEOUT -// -// MessageText: -// -// A time-out has expired.%0 -// -#define VFW_E_TIMEOUT ((HRESULT)0x8004022EL) - -// -// MessageId: VFW_E_INVALID_FILE_FORMAT -// -// MessageText: -// -// The file format is invalid.%0 -// -#define VFW_E_INVALID_FILE_FORMAT ((HRESULT)0x8004022FL) - -// -// MessageId: VFW_E_ENUM_OUT_OF_RANGE -// -// MessageText: -// -// The list has already been exhausted.%0 -// -#define VFW_E_ENUM_OUT_OF_RANGE ((HRESULT)0x80040230L) - -// -// MessageId: VFW_E_CIRCULAR_GRAPH -// -// MessageText: -// -// The filter graph is circular.%0 -// -#define VFW_E_CIRCULAR_GRAPH ((HRESULT)0x80040231L) - -// -// MessageId: VFW_E_NOT_ALLOWED_TO_SAVE -// -// MessageText: -// -// Updates are not allowed in this state.%0 -// -#define VFW_E_NOT_ALLOWED_TO_SAVE ((HRESULT)0x80040232L) - -// -// MessageId: VFW_E_TIME_ALREADY_PASSED -// -// MessageText: -// -// An attempt was made to queue a command for a time in the past.%0 -// -#define VFW_E_TIME_ALREADY_PASSED ((HRESULT)0x80040233L) - -// -// MessageId: VFW_E_ALREADY_CANCELLED -// -// MessageText: -// -// The queued command has already been canceled.%0 -// -#define VFW_E_ALREADY_CANCELLED ((HRESULT)0x80040234L) - -// -// MessageId: VFW_E_CORRUPT_GRAPH_FILE -// -// MessageText: -// -// Cannot render the file because it is corrupt.%0 -// -#define VFW_E_CORRUPT_GRAPH_FILE ((HRESULT)0x80040235L) - -// -// MessageId: VFW_E_ADVISE_ALREADY_SET -// -// MessageText: -// -// An overlay advise link already exists.%0 -// -#define VFW_E_ADVISE_ALREADY_SET ((HRESULT)0x80040236L) - -// -// MessageId: VFW_S_STATE_INTERMEDIATE -// -// MessageText: -// -// The state transition has not completed.%0 -// -#define VFW_S_STATE_INTERMEDIATE ((HRESULT)0x00040237L) - -// -// MessageId: VFW_E_NO_MODEX_AVAILABLE -// -// MessageText: -// -// No full-screen modes are available.%0 -// -#define VFW_E_NO_MODEX_AVAILABLE ((HRESULT)0x80040238L) - -// -// MessageId: VFW_E_NO_ADVISE_SET -// -// MessageText: -// -// This Advise cannot be canceled because it was not successfully set.%0 -// -#define VFW_E_NO_ADVISE_SET ((HRESULT)0x80040239L) - -// -// MessageId: VFW_E_NO_FULLSCREEN -// -// MessageText: -// -// A full-screen mode is not available.%0 -// -#define VFW_E_NO_FULLSCREEN ((HRESULT)0x8004023AL) - -// -// MessageId: VFW_E_IN_FULLSCREEN_MODE -// -// MessageText: -// -// Cannot call IVideoWindow methods while in full-screen mode.%0 -// -#define VFW_E_IN_FULLSCREEN_MODE ((HRESULT)0x8004023BL) - -// -// MessageId: VFW_E_UNKNOWN_FILE_TYPE -// -// MessageText: -// -// The media type of this file is not recognized.%0 -// -#define VFW_E_UNKNOWN_FILE_TYPE ((HRESULT)0x80040240L) - -// -// MessageId: VFW_E_CANNOT_LOAD_SOURCE_FILTER -// -// MessageText: -// -// The source filter for this file could not be loaded.%0 -// -#define VFW_E_CANNOT_LOAD_SOURCE_FILTER ((HRESULT)0x80040241L) - -// -// MessageId: VFW_S_PARTIAL_RENDER -// -// MessageText: -// -// Some of the streams in this movie are in an unsupported format.%0 -// -#define VFW_S_PARTIAL_RENDER ((HRESULT)0x00040242L) - -// -// MessageId: VFW_E_FILE_TOO_SHORT -// -// MessageText: -// -// A file appeared to be incomplete.%0 -// -#define VFW_E_FILE_TOO_SHORT ((HRESULT)0x80040243L) - -// -// MessageId: VFW_E_INVALID_FILE_VERSION -// -// MessageText: -// -// The version number of the file is invalid.%0 -// -#define VFW_E_INVALID_FILE_VERSION ((HRESULT)0x80040244L) - -// -// MessageId: VFW_S_SOME_DATA_IGNORED -// -// MessageText: -// -// The file contained some property settings that were not used.%0 -// -#define VFW_S_SOME_DATA_IGNORED ((HRESULT)0x00040245L) - -// -// MessageId: VFW_S_CONNECTIONS_DEFERRED -// -// MessageText: -// -// Some connections have failed and have been deferred.%0 -// -#define VFW_S_CONNECTIONS_DEFERRED ((HRESULT)0x00040246L) - -// -// MessageId: VFW_E_INVALID_CLSID -// -// MessageText: -// -// This file is corrupt: it contains an invalid class identifier.%0 -// -#define VFW_E_INVALID_CLSID ((HRESULT)0x80040247L) - -// -// MessageId: VFW_E_INVALID_MEDIA_TYPE -// -// MessageText: -// -// This file is corrupt: it contains an invalid media type.%0 -// -#define VFW_E_INVALID_MEDIA_TYPE ((HRESULT)0x80040248L) - - // Message id from WINWarning.H -// -// MessageId: VFW_E_BAD_KEY -// -// MessageText: -// -// A registry entry is corrupt.%0 -// -#define VFW_E_BAD_KEY ((HRESULT)0x800403F2L) - - // Message id from WINWarning.H -// -// MessageId: VFW_S_NO_MORE_ITEMS -// -// MessageText: -// -// The end of the list has been reached.%0 -// -#define VFW_S_NO_MORE_ITEMS ((HRESULT)0x00040103L) - -// -// MessageId: VFW_E_SAMPLE_TIME_NOT_SET -// -// MessageText: -// -// No time stamp has been set for this sample.%0 -// -#define VFW_E_SAMPLE_TIME_NOT_SET ((HRESULT)0x80040249L) - -// -// MessageId: VFW_S_RESOURCE_NOT_NEEDED -// -// MessageText: -// -// The resource specified is no longer needed.%0 -// -#define VFW_S_RESOURCE_NOT_NEEDED ((HRESULT)0x00040250L) - -// -// MessageId: VFW_E_MEDIA_TIME_NOT_SET -// -// MessageText: -// -// No media time stamp has been set for this sample.%0 -// -#define VFW_E_MEDIA_TIME_NOT_SET ((HRESULT)0x80040251L) - -// -// MessageId: VFW_E_NO_TIME_FORMAT_SET -// -// MessageText: -// -// No media time format has been selected.%0 -// -#define VFW_E_NO_TIME_FORMAT_SET ((HRESULT)0x80040252L) - -// -// MessageId: VFW_E_MONO_AUDIO_HW -// -// MessageText: -// -// Cannot change balance because audio device is mono only.%0 -// -#define VFW_E_MONO_AUDIO_HW ((HRESULT)0x80040253L) - -// -// MessageId: VFW_S_MEDIA_TYPE_IGNORED -// -// MessageText: -// -// A connection could not be made with the media type in the persistent graph,%0 -// but has been made with a negotiated media type.%0 -// -#define VFW_S_MEDIA_TYPE_IGNORED ((HRESULT)0x00040254L) - -// -// MessageId: VFW_E_NO_DECOMPRESSOR -// -// MessageText: -// -// Cannot play back the video stream: no suitable decompressor could be found.%0 -// -#define VFW_E_NO_DECOMPRESSOR ((HRESULT)0x80040255L) - -// -// MessageId: VFW_E_NO_AUDIO_HARDWARE -// -// MessageText: -// -// Cannot play back the audio stream: no audio hardware is available, or the hardware is not responding.%0 -// -#define VFW_E_NO_AUDIO_HARDWARE ((HRESULT)0x80040256L) - -// -// MessageId: VFW_S_VIDEO_NOT_RENDERED -// -// MessageText: -// -// Cannot play back the video stream: no suitable decompressor could be found.%0 -// -#define VFW_S_VIDEO_NOT_RENDERED ((HRESULT)0x00040257L) - -// -// MessageId: VFW_S_AUDIO_NOT_RENDERED -// -// MessageText: -// -// Cannot play back the audio stream: no audio hardware is available.%0 -// -#define VFW_S_AUDIO_NOT_RENDERED ((HRESULT)0x00040258L) - -// -// MessageId: VFW_E_RPZA -// -// MessageText: -// -// Cannot play back the video stream: format 'RPZA' is not supported.%0 -// -#define VFW_E_RPZA ((HRESULT)0x80040259L) - -// -// MessageId: VFW_S_RPZA -// -// MessageText: -// -// Cannot play back the video stream: format 'RPZA' is not supported.%0 -// -#define VFW_S_RPZA ((HRESULT)0x0004025AL) - -// -// MessageId: VFW_E_PROCESSOR_NOT_SUITABLE -// -// MessageText: -// -// ActiveMovie cannot play MPEG movies on this processor.%0 -// -#define VFW_E_PROCESSOR_NOT_SUITABLE ((HRESULT)0x8004025BL) - -// -// MessageId: VFW_E_UNSUPPORTED_AUDIO -// -// MessageText: -// -// Cannot play back the audio stream: the audio format is not supported.%0 -// -#define VFW_E_UNSUPPORTED_AUDIO ((HRESULT)0x8004025CL) - -// -// MessageId: VFW_E_UNSUPPORTED_VIDEO -// -// MessageText: -// -// Cannot play back the video stream: the video format is not supported.%0 -// -#define VFW_E_UNSUPPORTED_VIDEO ((HRESULT)0x8004025DL) - -// -// MessageId: VFW_E_MPEG_NOT_CONSTRAINED -// -// MessageText: -// -// ActiveMovie cannot play this video stream because it falls outside the constrained standard.%0 -// -#define VFW_E_MPEG_NOT_CONSTRAINED ((HRESULT)0x8004025EL) - -// -// MessageId: VFW_E_NOT_IN_GRAPH -// -// MessageText: -// -// Cannot perform the requested function on an object that is not in the filter graph.%0 -// -#define VFW_E_NOT_IN_GRAPH ((HRESULT)0x8004025FL) - -// -// MessageId: VFW_S_ESTIMATED -// -// MessageText: -// -// The value returned had to be estimated. It's accuracy can not be guaranteed.%0 -// -#define VFW_S_ESTIMATED ((HRESULT)0x00040260L) - -// -// MessageId: VFW_E_NO_TIME_FORMAT -// -// MessageText: -// -// Cannot get or set time related information on an object that is using a time format of TIME_FORMAT_NONE.%0 -// -#define VFW_E_NO_TIME_FORMAT ((HRESULT)0x80040261L) - -// -// MessageId: VFW_E_READ_ONLY -// -// MessageText: -// -// The connection cannot be made because the stream is read only and the filter alters the data.%0 -// -#define VFW_E_READ_ONLY ((HRESULT)0x80040262L) - -// -// MessageId: VFW_S_RESERVED -// -// MessageText: -// -// This success code is reserved for internal purposes within ActiveMovie.%0 -// -#define VFW_S_RESERVED ((HRESULT)0x00040263L) - -// -// MessageId: VFW_E_BUFFER_UNDERFLOW -// -// MessageText: -// -// The buffer is not full enough.%0 -// -#define VFW_E_BUFFER_UNDERFLOW ((HRESULT)0x80040264L) - -// -// MessageId: VFW_E_UNSUPPORTED_STREAM -// -// MessageText: -// -// Cannot play back the file. The format is not supported.%0 -// -#define VFW_E_UNSUPPORTED_STREAM ((HRESULT)0x80040265L) - -// -// MessageId: VFW_E_NO_TRANSPORT -// -// MessageText: -// -// Pins cannot connect due to not supporting the same transport.%0 -// -#define VFW_E_NO_TRANSPORT ((HRESULT)0x80040266L) - -// -// MessageId: VFW_S_STREAM_OFF -// -// MessageText: -// -// The stream has been turned off.%0 -// -#define VFW_S_STREAM_OFF ((HRESULT)0x00040267L) - -// -// MessageId: VFW_S_CANT_CUE -// -// MessageText: -// -// The graph can't be cued because of lack of or corrupt data.%0 -// -#define VFW_S_CANT_CUE ((HRESULT)0x00040268L) - -// -// MessageId: VFW_E_BAD_VIDEOCD -// -// MessageText: -// -// The Video CD can't be read correctly by the device or is the data is corrupt.%0 -// -#define VFW_E_BAD_VIDEOCD ((HRESULT)0x80040269L) - -// -// MessageId: VFW_S_NO_STOP_TIME -// -// MessageText: -// -// The stop time for the sample was not set.%0 -// -#define VFW_S_NO_STOP_TIME ((HRESULT)0x00040270L) - -// -// MessageId: VFW_E_OUT_OF_VIDEO_MEMORY -// -// MessageText: -// -// There is not enough Video Memory at this display resolution and number of colors. Reducing resolution might help.%0 -// -#define VFW_E_OUT_OF_VIDEO_MEMORY ((HRESULT)0x80040271L) - -// -// MessageId: VFW_E_VP_NEGOTIATION_FAILED -// -// MessageText: -// -// The VideoPort connection negotiation process has failed.%0 -// -#define VFW_E_VP_NEGOTIATION_FAILED ((HRESULT)0x80040272L) - -// -// MessageId: VFW_E_DDRAW_CAPS_NOT_SUITABLE -// -// MessageText: -// -// Either DirectDraw has not been installed or the Video Card capabilities are not suitable. Make sure the display is not in 16 color mode.%0 -// -#define VFW_E_DDRAW_CAPS_NOT_SUITABLE ((HRESULT)0x80040273L) - -// -// MessageId: VFW_E_NO_VP_HARDWARE -// -// MessageText: -// -// No VideoPort hardware is available, or the hardware is not responding.%0 -// -#define VFW_E_NO_VP_HARDWARE ((HRESULT)0x80040274L) - -// -// MessageId: VFW_E_NO_CAPTURE_HARDWARE -// -// MessageText: -// -// No Capture hardware is available, or the hardware is not responding.%0 -// -#define VFW_E_NO_CAPTURE_HARDWARE ((HRESULT)0x80040275L) - -// -// MessageId: VFW_E_DVD_OPERATION_INHIBITED -// -// MessageText: -// -// This User Operation is inhibited by DVD Content at this time.%0 -// -#define VFW_E_DVD_OPERATION_INHIBITED ((HRESULT)0x80040276L) - -// -// MessageId: VFW_E_DVD_INVALIDDOMAIN -// -// MessageText: -// -// This Operation is not permitted in the current domain.%0 -// -#define VFW_E_DVD_INVALIDDOMAIN ((HRESULT)0x80040277L) - -// -// MessageId: VFW_E_DVD_NO_BUTTON -// -// MessageText: -// -// The specified button is invalid or is not present at the current time, or there is no button present at the specified location.%0 -// -#define VFW_E_DVD_NO_BUTTON ((HRESULT)0x80040278L) - -// -// MessageId: VFW_E_DVD_GRAPHNOTREADY -// -// MessageText: -// -// DVD-Video playback graph has not been built yet.%0 -// -#define VFW_E_DVD_GRAPHNOTREADY ((HRESULT)0x80040279L) - -// -// MessageId: VFW_E_DVD_RENDERFAIL -// -// MessageText: -// -// DVD-Video playback graph building failed.%0 -// -#define VFW_E_DVD_RENDERFAIL ((HRESULT)0x8004027AL) - -// -// MessageId: VFW_E_DVD_DECNOTENOUGH -// -// MessageText: -// -// DVD-Video playback graph could not be built due to insufficient decoders.%0 -// -#define VFW_E_DVD_DECNOTENOUGH ((HRESULT)0x8004027BL) - -// -// MessageId: VFW_E_DDRAW_VERSION_NOT_SUITABLE -// -// MessageText: -// -// Version number of DirectDraw not suitable. Make sure to install dx5 or higher version.%0 -// -#define VFW_E_DDRAW_VERSION_NOT_SUITABLE ((HRESULT)0x8004027CL) - -// -// MessageId: VFW_E_COPYPROT_FAILED -// -// MessageText: -// -// Copy protection cannot be enabled. Please make sure any other copy protected content is not being shown now.%0 -// -#define VFW_E_COPYPROT_FAILED ((HRESULT)0x8004027DL) - -// -// MessageId: VFW_S_NOPREVIEWPIN -// -// MessageText: -// -// There was no preview pin available, so the capture pin output is being split to provide both capture and preview.%0 -// -#define VFW_S_NOPREVIEWPIN ((HRESULT)0x0004027EL) - -// -// MessageId: VFW_E_TIME_EXPIRED -// -// MessageText: -// -// This object cannot be used anymore as its time has expired.%0 -// -#define VFW_E_TIME_EXPIRED ((HRESULT)0x8004027FL) - -// -// MessageId: VFW_S_DVD_NON_ONE_SEQUENTIAL -// -// MessageText: -// -// The current title was not a sequential set of chapters (PGC), and the returned timing information might not be continuous.%0 -// -#define VFW_S_DVD_NON_ONE_SEQUENTIAL ((HRESULT)0x00040280L) - -// -// MessageId: VFW_E_DVD_WRONG_SPEED -// -// MessageText: -// -// The operation cannot be performed at the current playback speed.%0 -// -#define VFW_E_DVD_WRONG_SPEED ((HRESULT)0x80040281L) - -// -// MessageId: VFW_E_DVD_MENU_DOES_NOT_EXIST -// -// MessageText: -// -// The specified menu doesn't exist.%0 -// -#define VFW_E_DVD_MENU_DOES_NOT_EXIST ((HRESULT)0x80040282L) - -// -// MessageId: VFW_E_DVD_CMD_CANCELLED -// -// MessageText: -// -// The specified command was either cancelled or no longer exists.%0 -// -#define VFW_E_DVD_CMD_CANCELLED ((HRESULT)0x80040283L) - -// -// MessageId: VFW_E_DVD_STATE_WRONG_VERSION -// -// MessageText: -// -// The data did not contain a recognized version.%0 -// -#define VFW_E_DVD_STATE_WRONG_VERSION ((HRESULT)0x80040284L) - -// -// MessageId: VFW_E_DVD_STATE_CORRUPT -// -// MessageText: -// -// The state data was corrupt.%0 -// -#define VFW_E_DVD_STATE_CORRUPT ((HRESULT)0x80040285L) - -// -// MessageId: VFW_E_DVD_STATE_WRONG_DISC -// -// MessageText: -// -// The state data is from a different disc.%0 -// -#define VFW_E_DVD_STATE_WRONG_DISC ((HRESULT)0x80040286L) - -// -// MessageId: VFW_E_DVD_INCOMPATIBLE_REGION -// -// MessageText: -// -// The region was not compatible with the current drive.%0 -// -#define VFW_E_DVD_INCOMPATIBLE_REGION ((HRESULT)0x80040287L) - -// -// MessageId: VFW_E_DVD_NO_ATTRIBUTES -// -// MessageText: -// -// The requested DVD stream attribute does not exist.%0 -// -#define VFW_E_DVD_NO_ATTRIBUTES ((HRESULT)0x80040288L) - -// -// MessageId: VFW_E_DVD_NO_GOUP_PGC -// -// MessageText: -// -// Currently there is no GoUp (Annex J user function) program chain (PGC).%0 -// -#define VFW_E_DVD_NO_GOUP_PGC ((HRESULT)0x80040289L) - -// -// MessageId: VFW_E_DVD_LOW_PARENTAL_LEVEL -// -// MessageText: -// -// The current parental level was too low.%0 -// -#define VFW_E_DVD_LOW_PARENTAL_LEVEL ((HRESULT)0x8004028AL) - -// -// MessageId: VFW_E_DVD_NOT_IN_KARAOKE_MODE -// -// MessageText: -// -// The current audio is not karaoke content.%0 -// -#define VFW_E_DVD_NOT_IN_KARAOKE_MODE ((HRESULT)0x8004028BL) - -// -// MessageId: VFW_S_DVD_CHANNEL_CONTENTS_NOT_AVAILABLE -// -// MessageText: -// -// The audio stream did not contain sufficient information to determine the contents of each channel.%0 -// -#define VFW_S_DVD_CHANNEL_CONTENTS_NOT_AVAILABLE ((HRESULT)0x0004028CL) - -// -// MessageId: VFW_S_DVD_NOT_ACCURATE -// -// MessageText: -// -// The seek into the movie was not frame accurate.%0 -// -#define VFW_S_DVD_NOT_ACCURATE ((HRESULT)0x0004028DL) - -// -// MessageId: VFW_E_FRAME_STEP_UNSUPPORTED -// -// MessageText: -// -// Frame step is not supported on this configuration.%0 -// -#define VFW_E_FRAME_STEP_UNSUPPORTED ((HRESULT)0x8004028EL) - -// -// MessageId: VFW_E_DVD_STREAM_DISABLED -// -// MessageText: -// -// The specified stream is disabled and cannot be selected.%0 -// -#define VFW_E_DVD_STREAM_DISABLED ((HRESULT)0x8004028FL) - -// -// MessageId: VFW_E_DVD_TITLE_UNKNOWN -// -// MessageText: -// -// The operation depends on the current title number, however the navigator has not yet entered the VTSM or the title domains, -// so the 'current' title index is unknown.%0 -// -#define VFW_E_DVD_TITLE_UNKNOWN ((HRESULT)0x80040290L) - -// -// MessageId: VFW_E_DVD_INVALID_DISC -// -// MessageText: -// -// The specified path does not point to a valid DVD disc.%0 -// -#define VFW_E_DVD_INVALID_DISC ((HRESULT)0x80040291L) - -// -// MessageId: VFW_E_DVD_NO_RESUME_INFORMATION -// -// MessageText: -// -// There is currently no resume information.%0 -// -#define VFW_E_DVD_NO_RESUME_INFORMATION ((HRESULT)0x80040292L) - -// -// MessageId: VFW_E_PIN_ALREADY_BLOCKED_ON_THIS_THREAD -// -// MessageText: -// -// This thread has already blocked this output pin. There is no need to call IPinFlowControl::Block() again.%0 -// -#define VFW_E_PIN_ALREADY_BLOCKED_ON_THIS_THREAD ((HRESULT)0x80040293L) - -// -// MessageId: VFW_E_PIN_ALREADY_BLOCKED -// -// MessageText: -// -// IPinFlowControl::Block() has been called on another thread. The current thread cannot make any assumptions about this pin's block state.%0 -// -#define VFW_E_PIN_ALREADY_BLOCKED ((HRESULT)0x80040294L) - -// -// MessageId: VFW_E_CERTIFICATION_FAILURE -// -// MessageText: -// -// An operation failed due to a certification failure.%0 -// -#define VFW_E_CERTIFICATION_FAILURE ((HRESULT)0x80040295L) - -// -// MessageId: VFW_E_VMR_NOT_IN_MIXER_MODE -// -// MessageText: -// -// The VMR has not yet created a mixing component. That is, IVMRFilterConfig::SetNumberofStreams has not yet been called.%0 -// -#define VFW_E_VMR_NOT_IN_MIXER_MODE ((HRESULT)0x80040296L) - -// -// -// E_PROP_SET_UNSUPPORTED and E_PROP_ID_UNSUPPORTED are added here using -// HRESULT_FROM_WIN32() because VC5 doesn't have WinNT's new error codes -// from winerror.h, and because it is more convienent to have them already -// formed as HRESULTs. These should correspond to: -// HRESULT_FROM_WIN32(ERROR_NOT_FOUND) == E_PROP_ID_UNSUPPORTED -// HRESULT_FROM_WIN32(ERROR_SET_NOT_FOUND) == E_PROP_SET_UNSUPPORTED -#if !defined(E_PROP_SET_UNSUPPORTED) -// -// MessageId: E_PROP_SET_UNSUPPORTED -// -// MessageText: -// -// The Specified property set is not supported.%0 -// -#define E_PROP_SET_UNSUPPORTED ((HRESULT)0x80070492L) - -#endif //!defined(E_PROP_SET_UNSUPPORTED) -#if !defined(E_PROP_ID_UNSUPPORTED) -// -// MessageId: E_PROP_ID_UNSUPPORTED -// -// MessageText: -// -// The specified property ID is not supported for the specified property set.%0 -// -#define E_PROP_ID_UNSUPPORTED ((HRESULT)0x80070490L) - -#endif //!defined(E_PROP_ID_UNSUPPORTED) diff --git a/import/DirectX8/include/videoacc.h b/import/DirectX8/include/videoacc.h deleted file mode 100644 index ff768877e..000000000 --- a/import/DirectX8/include/videoacc.h +++ /dev/null @@ -1,661 +0,0 @@ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 6.00.0347 */ -/* Compiler settings for videoacc.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __videoacc_h__ -#define __videoacc_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __IAMVideoAcceleratorNotify_FWD_DEFINED__ -#define __IAMVideoAcceleratorNotify_FWD_DEFINED__ -typedef interface IAMVideoAcceleratorNotify IAMVideoAcceleratorNotify; -#endif /* __IAMVideoAcceleratorNotify_FWD_DEFINED__ */ - - -#ifndef __IAMVideoAccelerator_FWD_DEFINED__ -#define __IAMVideoAccelerator_FWD_DEFINED__ -typedef interface IAMVideoAccelerator IAMVideoAccelerator; -#endif /* __IAMVideoAccelerator_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "unknwn.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void * ); - -/* interface __MIDL_itf_videoacc_0000 */ -/* [local] */ - -// -// The following declarations within the 'if 0' block are dummy typedefs used to make -// the motncomp.idl file build. The actual definitions are contained in ddraw.h and amva.h -// -#if 0 -typedef void *LPVOID; - -typedef void *LPGUID; - -typedef void *LPDIRECTDRAWSURFACE; - -typedef void *LPDDPIXELFORMAT; - -typedef void *LPAMVAInternalMemInfo; - -typedef void AMVAUncompDataInfo; - -typedef void *LPAMVACompBufferInfo; - -typedef void AMVABUFFERINFO; - -typedef void AMVAEndFrameInfo; - -typedef void *LPAMVAUncompBufferInfo; - -typedef void AMVABeginFrameInfo; - -typedef IUnknown *IMediaSample; - -#endif -#include -#include - - -extern RPC_IF_HANDLE __MIDL_itf_videoacc_0000_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_videoacc_0000_v0_0_s_ifspec; - -#ifndef __IAMVideoAcceleratorNotify_INTERFACE_DEFINED__ -#define __IAMVideoAcceleratorNotify_INTERFACE_DEFINED__ - -/* interface IAMVideoAcceleratorNotify */ -/* [unique][helpstring][uuid][object][local] */ - - -EXTERN_C const IID IID_IAMVideoAcceleratorNotify; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("256A6A21-FBAD-11d1-82BF-00A0C9696C8F") - IAMVideoAcceleratorNotify : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetUncompSurfacesInfo( - /* [in] */ const GUID *pGuid, - /* [out][in] */ LPAMVAUncompBufferInfo pUncompBufferInfo) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetUncompSurfacesInfo( - /* [in] */ DWORD dwActualUncompSurfacesAllocated) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCreateVideoAcceleratorData( - /* [in] */ const GUID *pGuid, - /* [out] */ LPDWORD pdwSizeMiscData, - /* [out] */ LPVOID *ppMiscData) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMVideoAcceleratorNotifyVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMVideoAcceleratorNotify * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMVideoAcceleratorNotify * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMVideoAcceleratorNotify * This); - - HRESULT ( STDMETHODCALLTYPE *GetUncompSurfacesInfo )( - IAMVideoAcceleratorNotify * This, - /* [in] */ const GUID *pGuid, - /* [out][in] */ LPAMVAUncompBufferInfo pUncompBufferInfo); - - HRESULT ( STDMETHODCALLTYPE *SetUncompSurfacesInfo )( - IAMVideoAcceleratorNotify * This, - /* [in] */ DWORD dwActualUncompSurfacesAllocated); - - HRESULT ( STDMETHODCALLTYPE *GetCreateVideoAcceleratorData )( - IAMVideoAcceleratorNotify * This, - /* [in] */ const GUID *pGuid, - /* [out] */ LPDWORD pdwSizeMiscData, - /* [out] */ LPVOID *ppMiscData); - - END_INTERFACE - } IAMVideoAcceleratorNotifyVtbl; - - interface IAMVideoAcceleratorNotify - { - CONST_VTBL struct IAMVideoAcceleratorNotifyVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMVideoAcceleratorNotify_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMVideoAcceleratorNotify_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMVideoAcceleratorNotify_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMVideoAcceleratorNotify_GetUncompSurfacesInfo(This,pGuid,pUncompBufferInfo) \ - (This)->lpVtbl -> GetUncompSurfacesInfo(This,pGuid,pUncompBufferInfo) - -#define IAMVideoAcceleratorNotify_SetUncompSurfacesInfo(This,dwActualUncompSurfacesAllocated) \ - (This)->lpVtbl -> SetUncompSurfacesInfo(This,dwActualUncompSurfacesAllocated) - -#define IAMVideoAcceleratorNotify_GetCreateVideoAcceleratorData(This,pGuid,pdwSizeMiscData,ppMiscData) \ - (This)->lpVtbl -> GetCreateVideoAcceleratorData(This,pGuid,pdwSizeMiscData,ppMiscData) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMVideoAcceleratorNotify_GetUncompSurfacesInfo_Proxy( - IAMVideoAcceleratorNotify * This, - /* [in] */ const GUID *pGuid, - /* [out][in] */ LPAMVAUncompBufferInfo pUncompBufferInfo); - - -void __RPC_STUB IAMVideoAcceleratorNotify_GetUncompSurfacesInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoAcceleratorNotify_SetUncompSurfacesInfo_Proxy( - IAMVideoAcceleratorNotify * This, - /* [in] */ DWORD dwActualUncompSurfacesAllocated); - - -void __RPC_STUB IAMVideoAcceleratorNotify_SetUncompSurfacesInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoAcceleratorNotify_GetCreateVideoAcceleratorData_Proxy( - IAMVideoAcceleratorNotify * This, - /* [in] */ const GUID *pGuid, - /* [out] */ LPDWORD pdwSizeMiscData, - /* [out] */ LPVOID *ppMiscData); - - -void __RPC_STUB IAMVideoAcceleratorNotify_GetCreateVideoAcceleratorData_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMVideoAcceleratorNotify_INTERFACE_DEFINED__ */ - - -#ifndef __IAMVideoAccelerator_INTERFACE_DEFINED__ -#define __IAMVideoAccelerator_INTERFACE_DEFINED__ - -/* interface IAMVideoAccelerator */ -/* [unique][helpstring][uuid][object][local] */ - - -EXTERN_C const IID IID_IAMVideoAccelerator; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("256A6A22-FBAD-11d1-82BF-00A0C9696C8F") - IAMVideoAccelerator : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE GetVideoAcceleratorGUIDs( - /* [out][in] */ LPDWORD pdwNumGuidsSupported, - /* [out][in] */ LPGUID pGuidsSupported) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetUncompFormatsSupported( - /* [in] */ const GUID *pGuid, - /* [out][in] */ LPDWORD pdwNumFormatsSupported, - /* [out][in] */ LPDDPIXELFORMAT pFormatsSupported) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInternalMemInfo( - /* [in] */ const GUID *pGuid, - /* [in] */ const AMVAUncompDataInfo *pamvaUncompDataInfo, - /* [out][in] */ LPAMVAInternalMemInfo pamvaInternalMemInfo) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCompBufferInfo( - /* [in] */ const GUID *pGuid, - /* [in] */ const AMVAUncompDataInfo *pamvaUncompDataInfo, - /* [out][in] */ LPDWORD pdwNumTypesCompBuffers, - /* [out] */ LPAMVACompBufferInfo pamvaCompBufferInfo) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInternalCompBufferInfo( - /* [out][in] */ LPDWORD pdwNumTypesCompBuffers, - /* [out] */ LPAMVACompBufferInfo pamvaCompBufferInfo) = 0; - - virtual HRESULT STDMETHODCALLTYPE BeginFrame( - /* [in] */ const AMVABeginFrameInfo *amvaBeginFrameInfo) = 0; - - virtual HRESULT STDMETHODCALLTYPE EndFrame( - /* [in] */ const AMVAEndFrameInfo *pEndFrameInfo) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBuffer( - /* [in] */ DWORD dwTypeIndex, - /* [in] */ DWORD dwBufferIndex, - /* [in] */ BOOL bReadOnly, - /* [out] */ LPVOID *ppBuffer, - /* [out] */ LONG *lpStride) = 0; - - virtual HRESULT STDMETHODCALLTYPE ReleaseBuffer( - /* [in] */ DWORD dwTypeIndex, - /* [in] */ DWORD dwBufferIndex) = 0; - - virtual HRESULT STDMETHODCALLTYPE Execute( - /* [in] */ DWORD dwFunction, - /* [in] */ LPVOID lpPrivateInputData, - /* [in] */ DWORD cbPrivateInputData, - /* [in] */ LPVOID lpPrivateOutputDat, - /* [in] */ DWORD cbPrivateOutputData, - /* [in] */ DWORD dwNumBuffers, - /* [in] */ const AMVABUFFERINFO *pamvaBufferInfo) = 0; - - virtual HRESULT STDMETHODCALLTYPE QueryRenderStatus( - /* [in] */ DWORD dwTypeIndex, - /* [in] */ DWORD dwBufferIndex, - /* [in] */ DWORD dwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE DisplayFrame( - /* [in] */ DWORD dwFlipToIndex, - /* [in] */ IMediaSample *pMediaSample) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAMVideoAcceleratorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAMVideoAccelerator * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAMVideoAccelerator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAMVideoAccelerator * This); - - HRESULT ( STDMETHODCALLTYPE *GetVideoAcceleratorGUIDs )( - IAMVideoAccelerator * This, - /* [out][in] */ LPDWORD pdwNumGuidsSupported, - /* [out][in] */ LPGUID pGuidsSupported); - - HRESULT ( STDMETHODCALLTYPE *GetUncompFormatsSupported )( - IAMVideoAccelerator * This, - /* [in] */ const GUID *pGuid, - /* [out][in] */ LPDWORD pdwNumFormatsSupported, - /* [out][in] */ LPDDPIXELFORMAT pFormatsSupported); - - HRESULT ( STDMETHODCALLTYPE *GetInternalMemInfo )( - IAMVideoAccelerator * This, - /* [in] */ const GUID *pGuid, - /* [in] */ const AMVAUncompDataInfo *pamvaUncompDataInfo, - /* [out][in] */ LPAMVAInternalMemInfo pamvaInternalMemInfo); - - HRESULT ( STDMETHODCALLTYPE *GetCompBufferInfo )( - IAMVideoAccelerator * This, - /* [in] */ const GUID *pGuid, - /* [in] */ const AMVAUncompDataInfo *pamvaUncompDataInfo, - /* [out][in] */ LPDWORD pdwNumTypesCompBuffers, - /* [out] */ LPAMVACompBufferInfo pamvaCompBufferInfo); - - HRESULT ( STDMETHODCALLTYPE *GetInternalCompBufferInfo )( - IAMVideoAccelerator * This, - /* [out][in] */ LPDWORD pdwNumTypesCompBuffers, - /* [out] */ LPAMVACompBufferInfo pamvaCompBufferInfo); - - HRESULT ( STDMETHODCALLTYPE *BeginFrame )( - IAMVideoAccelerator * This, - /* [in] */ const AMVABeginFrameInfo *amvaBeginFrameInfo); - - HRESULT ( STDMETHODCALLTYPE *EndFrame )( - IAMVideoAccelerator * This, - /* [in] */ const AMVAEndFrameInfo *pEndFrameInfo); - - HRESULT ( STDMETHODCALLTYPE *GetBuffer )( - IAMVideoAccelerator * This, - /* [in] */ DWORD dwTypeIndex, - /* [in] */ DWORD dwBufferIndex, - /* [in] */ BOOL bReadOnly, - /* [out] */ LPVOID *ppBuffer, - /* [out] */ LONG *lpStride); - - HRESULT ( STDMETHODCALLTYPE *ReleaseBuffer )( - IAMVideoAccelerator * This, - /* [in] */ DWORD dwTypeIndex, - /* [in] */ DWORD dwBufferIndex); - - HRESULT ( STDMETHODCALLTYPE *Execute )( - IAMVideoAccelerator * This, - /* [in] */ DWORD dwFunction, - /* [in] */ LPVOID lpPrivateInputData, - /* [in] */ DWORD cbPrivateInputData, - /* [in] */ LPVOID lpPrivateOutputDat, - /* [in] */ DWORD cbPrivateOutputData, - /* [in] */ DWORD dwNumBuffers, - /* [in] */ const AMVABUFFERINFO *pamvaBufferInfo); - - HRESULT ( STDMETHODCALLTYPE *QueryRenderStatus )( - IAMVideoAccelerator * This, - /* [in] */ DWORD dwTypeIndex, - /* [in] */ DWORD dwBufferIndex, - /* [in] */ DWORD dwFlags); - - HRESULT ( STDMETHODCALLTYPE *DisplayFrame )( - IAMVideoAccelerator * This, - /* [in] */ DWORD dwFlipToIndex, - /* [in] */ IMediaSample *pMediaSample); - - END_INTERFACE - } IAMVideoAcceleratorVtbl; - - interface IAMVideoAccelerator - { - CONST_VTBL struct IAMVideoAcceleratorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAMVideoAccelerator_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAMVideoAccelerator_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAMVideoAccelerator_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAMVideoAccelerator_GetVideoAcceleratorGUIDs(This,pdwNumGuidsSupported,pGuidsSupported) \ - (This)->lpVtbl -> GetVideoAcceleratorGUIDs(This,pdwNumGuidsSupported,pGuidsSupported) - -#define IAMVideoAccelerator_GetUncompFormatsSupported(This,pGuid,pdwNumFormatsSupported,pFormatsSupported) \ - (This)->lpVtbl -> GetUncompFormatsSupported(This,pGuid,pdwNumFormatsSupported,pFormatsSupported) - -#define IAMVideoAccelerator_GetInternalMemInfo(This,pGuid,pamvaUncompDataInfo,pamvaInternalMemInfo) \ - (This)->lpVtbl -> GetInternalMemInfo(This,pGuid,pamvaUncompDataInfo,pamvaInternalMemInfo) - -#define IAMVideoAccelerator_GetCompBufferInfo(This,pGuid,pamvaUncompDataInfo,pdwNumTypesCompBuffers,pamvaCompBufferInfo) \ - (This)->lpVtbl -> GetCompBufferInfo(This,pGuid,pamvaUncompDataInfo,pdwNumTypesCompBuffers,pamvaCompBufferInfo) - -#define IAMVideoAccelerator_GetInternalCompBufferInfo(This,pdwNumTypesCompBuffers,pamvaCompBufferInfo) \ - (This)->lpVtbl -> GetInternalCompBufferInfo(This,pdwNumTypesCompBuffers,pamvaCompBufferInfo) - -#define IAMVideoAccelerator_BeginFrame(This,amvaBeginFrameInfo) \ - (This)->lpVtbl -> BeginFrame(This,amvaBeginFrameInfo) - -#define IAMVideoAccelerator_EndFrame(This,pEndFrameInfo) \ - (This)->lpVtbl -> EndFrame(This,pEndFrameInfo) - -#define IAMVideoAccelerator_GetBuffer(This,dwTypeIndex,dwBufferIndex,bReadOnly,ppBuffer,lpStride) \ - (This)->lpVtbl -> GetBuffer(This,dwTypeIndex,dwBufferIndex,bReadOnly,ppBuffer,lpStride) - -#define IAMVideoAccelerator_ReleaseBuffer(This,dwTypeIndex,dwBufferIndex) \ - (This)->lpVtbl -> ReleaseBuffer(This,dwTypeIndex,dwBufferIndex) - -#define IAMVideoAccelerator_Execute(This,dwFunction,lpPrivateInputData,cbPrivateInputData,lpPrivateOutputDat,cbPrivateOutputData,dwNumBuffers,pamvaBufferInfo) \ - (This)->lpVtbl -> Execute(This,dwFunction,lpPrivateInputData,cbPrivateInputData,lpPrivateOutputDat,cbPrivateOutputData,dwNumBuffers,pamvaBufferInfo) - -#define IAMVideoAccelerator_QueryRenderStatus(This,dwTypeIndex,dwBufferIndex,dwFlags) \ - (This)->lpVtbl -> QueryRenderStatus(This,dwTypeIndex,dwBufferIndex,dwFlags) - -#define IAMVideoAccelerator_DisplayFrame(This,dwFlipToIndex,pMediaSample) \ - (This)->lpVtbl -> DisplayFrame(This,dwFlipToIndex,pMediaSample) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAMVideoAccelerator_GetVideoAcceleratorGUIDs_Proxy( - IAMVideoAccelerator * This, - /* [out][in] */ LPDWORD pdwNumGuidsSupported, - /* [out][in] */ LPGUID pGuidsSupported); - - -void __RPC_STUB IAMVideoAccelerator_GetVideoAcceleratorGUIDs_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoAccelerator_GetUncompFormatsSupported_Proxy( - IAMVideoAccelerator * This, - /* [in] */ const GUID *pGuid, - /* [out][in] */ LPDWORD pdwNumFormatsSupported, - /* [out][in] */ LPDDPIXELFORMAT pFormatsSupported); - - -void __RPC_STUB IAMVideoAccelerator_GetUncompFormatsSupported_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoAccelerator_GetInternalMemInfo_Proxy( - IAMVideoAccelerator * This, - /* [in] */ const GUID *pGuid, - /* [in] */ const AMVAUncompDataInfo *pamvaUncompDataInfo, - /* [out][in] */ LPAMVAInternalMemInfo pamvaInternalMemInfo); - - -void __RPC_STUB IAMVideoAccelerator_GetInternalMemInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoAccelerator_GetCompBufferInfo_Proxy( - IAMVideoAccelerator * This, - /* [in] */ const GUID *pGuid, - /* [in] */ const AMVAUncompDataInfo *pamvaUncompDataInfo, - /* [out][in] */ LPDWORD pdwNumTypesCompBuffers, - /* [out] */ LPAMVACompBufferInfo pamvaCompBufferInfo); - - -void __RPC_STUB IAMVideoAccelerator_GetCompBufferInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoAccelerator_GetInternalCompBufferInfo_Proxy( - IAMVideoAccelerator * This, - /* [out][in] */ LPDWORD pdwNumTypesCompBuffers, - /* [out] */ LPAMVACompBufferInfo pamvaCompBufferInfo); - - -void __RPC_STUB IAMVideoAccelerator_GetInternalCompBufferInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoAccelerator_BeginFrame_Proxy( - IAMVideoAccelerator * This, - /* [in] */ const AMVABeginFrameInfo *amvaBeginFrameInfo); - - -void __RPC_STUB IAMVideoAccelerator_BeginFrame_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoAccelerator_EndFrame_Proxy( - IAMVideoAccelerator * This, - /* [in] */ const AMVAEndFrameInfo *pEndFrameInfo); - - -void __RPC_STUB IAMVideoAccelerator_EndFrame_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoAccelerator_GetBuffer_Proxy( - IAMVideoAccelerator * This, - /* [in] */ DWORD dwTypeIndex, - /* [in] */ DWORD dwBufferIndex, - /* [in] */ BOOL bReadOnly, - /* [out] */ LPVOID *ppBuffer, - /* [out] */ LONG *lpStride); - - -void __RPC_STUB IAMVideoAccelerator_GetBuffer_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoAccelerator_ReleaseBuffer_Proxy( - IAMVideoAccelerator * This, - /* [in] */ DWORD dwTypeIndex, - /* [in] */ DWORD dwBufferIndex); - - -void __RPC_STUB IAMVideoAccelerator_ReleaseBuffer_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoAccelerator_Execute_Proxy( - IAMVideoAccelerator * This, - /* [in] */ DWORD dwFunction, - /* [in] */ LPVOID lpPrivateInputData, - /* [in] */ DWORD cbPrivateInputData, - /* [in] */ LPVOID lpPrivateOutputDat, - /* [in] */ DWORD cbPrivateOutputData, - /* [in] */ DWORD dwNumBuffers, - /* [in] */ const AMVABUFFERINFO *pamvaBufferInfo); - - -void __RPC_STUB IAMVideoAccelerator_Execute_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoAccelerator_QueryRenderStatus_Proxy( - IAMVideoAccelerator * This, - /* [in] */ DWORD dwTypeIndex, - /* [in] */ DWORD dwBufferIndex, - /* [in] */ DWORD dwFlags); - - -void __RPC_STUB IAMVideoAccelerator_QueryRenderStatus_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAMVideoAccelerator_DisplayFrame_Proxy( - IAMVideoAccelerator * This, - /* [in] */ DWORD dwFlipToIndex, - /* [in] */ IMediaSample *pMediaSample); - - -void __RPC_STUB IAMVideoAccelerator_DisplayFrame_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAMVideoAccelerator_INTERFACE_DEFINED__ */ - - -/* Additional Prototypes for ALL interfaces */ - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/import/DirectX8/include/vpconfig.h b/import/DirectX8/include/vpconfig.h deleted file mode 100644 index 776d99f51..000000000 --- a/import/DirectX8/include/vpconfig.h +++ /dev/null @@ -1,135 +0,0 @@ -//------------------------------------------------------------------------------ -// File: VPConfig.h -// -// Desc: An interface exposed by the decoder to help it and the filter -// configuring the videoport to communicate. -// -// Copyright (c) 1992-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __IVPConfig__ -#define __IVPConfig__ - -#ifdef __cplusplus -extern "C" { -#endif - -// IVPBaseConfig -DECLARE_INTERFACE_(IVPBaseConfig, IUnknown) -{ -public: - - // gets the various connection information structures (guid, portwidth) - // in an array of structures. If the pointer to the array is NULL, first - // parameter returns the total number of formats supported. - STDMETHOD (GetConnectInfo)(THIS_ - IN OUT LPDWORD pdwNumConnectInfo, - IN OUT LPDDVIDEOPORTCONNECT pddVPConnectInfo - ) PURE; - - // sets the connection entry chosen (0, 1, .. ,(dwNumProposedEntries-1)) - STDMETHOD (SetConnectInfo)(THIS_ - IN DWORD dwChosenEntry - ) PURE; - - // gets various data parameters, includes dimensionnal info - STDMETHOD (GetVPDataInfo)(THIS_ - IN OUT LPAMVPDATAINFO pamvpDataInfo - ) PURE; - - // retrives maximum pixels per second rate expected for a given - // format and a given scaling factor. If decoder does not support - // those scaling factors, then it gives the rate and the nearest - // scaling factors. - STDMETHOD (GetMaxPixelRate)(THIS_ - IN OUT LPAMVPSIZE pamvpSize, - OUT LPDWORD pdwMaxPixelsPerSecond - ) PURE; - - // informs the callee of the videoformats supported by the videoport - STDMETHOD (InformVPInputFormats)(THIS_ - IN DWORD dwNumFormats, - IN LPDDPIXELFORMAT pDDPixelFormats - ) PURE; - - // gets the various formats supported by the decoder in an array - // of structures. If the pointer to the array is NULL, first parameter - // returns the total number of formats supported. - STDMETHOD (GetVideoFormats)(THIS_ - IN OUT LPDWORD pdwNumFormats, - IN OUT LPDDPIXELFORMAT pddPixelFormats - ) PURE; - - // sets the format entry chosen (0, 1, .. ,(dwNumProposedEntries-1)) - STDMETHOD (SetVideoFormat)(THIS_ - IN DWORD dwChosenEntry - ) PURE; - - // asks the decoder to treat even fields like odd fields and visa versa - STDMETHOD (SetInvertPolarity)(THIS_ - ) PURE; - - // the mixer uses this function to determine if the callee wants - // the vpmixer to use its overlay surface and if so to get a pointer to it - STDMETHOD (GetOverlaySurface)(THIS_ - OUT LPDIRECTDRAWSURFACE* ppddOverlaySurface - ) PURE; - - // sets the direct draw kernel handle - STDMETHOD (SetDirectDrawKernelHandle)(THIS_ - IN ULONG_PTR dwDDKernelHandle - ) PURE; - - // sets the video port id - STDMETHOD (SetVideoPortID)(THIS_ - IN DWORD dwVideoPortID - ) PURE; - - // sets the direct draw surface kernel handle - STDMETHOD (SetDDSurfaceKernelHandles)(THIS_ - IN DWORD cHandles, - IN ULONG_PTR *rgDDKernelHandles - ) PURE; - - // Tells driver about surface created on its behalf by ovmixer/vbisurf and - // returned from videoport/ddraw. Should always return NOERROR or E_NOIMPL. - // dwPitch is the pitch of the surface (distance in pixels between the start - // pixels of two consecutive lines of the surface). (dwXOrigin, dwYOrigin) - // are the (X, Y) coordinates of the pixel at which valid data starts. - STDMETHOD (SetSurfaceParameters)(THIS_ - IN DWORD dwPitch, - IN DWORD dwXOrigin, - IN DWORD dwYOrigin - ) PURE; -}; - -// IVPConfig -DECLARE_INTERFACE_(IVPConfig, IVPBaseConfig) -{ -public: - // the mixer uses this function to determine if the callee wants - // the mixer to decimate VIDEO data at its own descrition - STDMETHOD (IsVPDecimationAllowed)(THIS_ - OUT LPBOOL pbIsDecimationAllowed - ) PURE; - - // sets the scaling factors. If decoder does not support these, - // then it sets the values to the nearest factors it can support - STDMETHOD (SetScalingFactors)(THIS_ - IN LPAMVPSIZE pamvpSize - ) PURE; -}; - -// IVPVBIConfig -DECLARE_INTERFACE_(IVPVBIConfig, IVPBaseConfig) -{ -public: -}; - -#ifdef __cplusplus -} -#endif - - -#endif // __IVPConfig__ diff --git a/import/DirectX8/include/vpnotify.h b/import/DirectX8/include/vpnotify.h deleted file mode 100644 index 2e1d1b6b0..000000000 --- a/import/DirectX8/include/vpnotify.h +++ /dev/null @@ -1,92 +0,0 @@ -//------------------------------------------------------------------------------ -// File: VPNotify.h -// -// Desc: -// -// Copyright (c) 1997-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __IVPNotify__ -#define __IVPNotify__ - -#ifdef __cplusplus -extern "C" { -#endif - -// interface IVPBaseNotify -DECLARE_INTERFACE_(IVPBaseNotify, IUnknown) -{ -public: - // this function initializes the reconnection to the decoder. - STDMETHOD (RenegotiateVPParameters)(THIS_ - ) PURE; - -}; - -// interface IVPNotify -DECLARE_INTERFACE_(IVPNotify, IVPBaseNotify) -{ -public: - // function to set the mode (bob, weave etc) - STDMETHOD (SetDeinterlaceMode)(THIS_ - IN AMVP_MODE mode - ) PURE; - - // function to get the mode (bob, weave etc) - STDMETHOD (GetDeinterlaceMode)(THIS_ - OUT AMVP_MODE *pMode - ) PURE; -}; - -// interface IVPNotify -DECLARE_INTERFACE_(IVPNotify2, IVPNotify) -{ -public: -// function to set the mode (bob, weave etc) - STDMETHOD (SetVPSyncMaster)(THIS_ - IN BOOL bVPSyncMaster - ) PURE; - - // function to get the mode (bob, weave etc) - STDMETHOD (GetVPSyncMaster)(THIS_ - OUT BOOL *pbVPSyncMaster - ) PURE; - - /* - // this function sets the directdraw surface that the mixer is supposed to use. - STDMETHOD (SetDirectDrawSurface)(THIS_ - IN LPDIRECTDRAWSURFACE pDirectDrawSurface - ) PURE; - - // this function gets the directdraw surface that the mixer is using - STDMETHOD (GetDirectDrawSurface)(THIS_ - OUT LPDIRECTDRAWSURFACE *ppDirectDrawSurface - ) PURE; - - // this functions sets the color-controls, if the chip supports it. - STDMETHOD (SetVPColorControls)(THIS_ - IN LPDDCOLORCONTROL pColorControl - ) PURE; - - // this functions also returns the capability of the hardware in the dwFlags - // value of the struct. - STDMETHOD (GetVPColorControls)(THIS_ - OUT LPDDCOLORCONTROL *ppColorControl - ) PURE; - */ -}; - - -// interface IVPVBINotify -DECLARE_INTERFACE_(IVPVBINotify, IVPBaseNotify) -{ -public: -}; - -#ifdef __cplusplus -} -#endif - - -#endif // __IVPNotify__ diff --git a/import/DirectX8/include/vptype.h b/import/DirectX8/include/vptype.h deleted file mode 100644 index b03baae69..000000000 --- a/import/DirectX8/include/vptype.h +++ /dev/null @@ -1,78 +0,0 @@ -//------------------------------------------------------------------------------ -// File: VPType.h -// -// Desc: This file includes all the data structures defined for the IVPConfig -// interface. -// -// Copyright (c) 1997-2001, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -#ifndef __IVPType__ -#define __IVPType__ - -#ifdef __cplusplus -extern "C" { -#endif - - // enum to specify the criterion, which the vpmixer is supposed to use - // in order to select the video format - typedef enum _AMVP_SELECT_FORMAT_BY - { - AMVP_DO_NOT_CARE, - AMVP_BEST_BANDWIDTH, - AMVP_INPUT_SAME_AS_OUTPUT - } AMVP_SELECT_FORMAT_BY; - - // enum to specify the various mode - typedef enum _AMVP_MODE - { - AMVP_MODE_WEAVE, - AMVP_MODE_BOBINTERLEAVED, - AMVP_MODE_BOBNONINTERLEAVED, - AMVP_MODE_SKIPEVEN, - AMVP_MODE_SKIPODD - } AMVP_MODE; - - // struct to specify the width and height. The context could be anything - // such as scaling cropping etc. - typedef struct _AMVPSIZE - { - DWORD dwWidth; // the width - DWORD dwHeight; // the height - } AMVPSIZE, *LPAMVPSIZE; - - // struct to specify the dimensional characteristics of the input stream - typedef struct _AMVPDIMINFO - { - DWORD dwFieldWidth; // Field height of the data - DWORD dwFieldHeight; // Field width of the data - DWORD dwVBIWidth; // Width of the VBI data - DWORD dwVBIHeight; // Height of the VBI data - RECT rcValidRegion; // The vaild rectangle, used for cropping - } AMVPDIMINFO, *LPAMVPDIMINFO; - - // struct to specify the various data specific characteristics of the input stream - typedef struct _AMVPDATAINFO - { - DWORD dwSize; // Size of the struct - DWORD dwMicrosecondsPerField; // Time taken by each field - AMVPDIMINFO amvpDimInfo; // Dimensional Information - DWORD dwPictAspectRatioX; // X dimension of Picture Aspect Ratio - DWORD dwPictAspectRatioY; // Y dimension of Picture Aspect Ratio - BOOL bEnableDoubleClock; // Videoport should enable double clocking - BOOL bEnableVACT; // Videoport should use an external VACT signal - BOOL bDataIsInterlaced; // Indicates that the signal is interlaced - LONG lHalfLinesOdd; // number of halflines in the odd field - BOOL bFieldPolarityInverted; // Device inverts the polarity by default - DWORD dwNumLinesInVREF; // Number of lines of data in VREF - LONG lHalfLinesEven; // number of halflines in the even field - DWORD dwReserved1; // Reserved for future use - } AMVPDATAINFO, *LPAMVPDATAINFO; - - -#ifdef __cplusplus -} -#endif - -#endif // __IVPType__ diff --git a/import/DirectX8/include/xprtdefs.h b/import/DirectX8/include/xprtdefs.h deleted file mode 100644 index eb2a229db..000000000 --- a/import/DirectX8/include/xprtdefs.h +++ /dev/null @@ -1,673 +0,0 @@ -//=========================================================================== -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY -// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR -// PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -//=========================================================================== -// -// filename XPrtDefs.h (Derived from edevdefs.h) -// -// External Device (like a VCR) control interface parameter and value definitions -// -// Note:new constants added: ED_BASE+800L -> ED_BASE+811L -// -// 1-30-98: -// New constant added for DVCR: ED_BASE+900L -> ED_BASE+1000L -// - -#ifndef __XPRTDEFS__ -#define __XPRTDEFS__ - - -#define ED_BASE 0x1000L - -// this is used to tell the device communications object which -// physical communications port to use. -#define DEV_PORT_SIM 1 -#define DEV_PORT_COM1 2 // standard serial ports -#define DEV_PORT_COM2 3 -#define DEV_PORT_COM3 4 -#define DEV_PORT_COM4 5 -#define DEV_PORT_DIAQ 6 // Diaquest driver -#define DEV_PORT_ARTI 7 // ARTI driver -#define DEV_PORT_1394 8 // IEEE 1394 Bus -#define DEV_PORT_USB 9 // Universal Serial Bus -#define DEV_PORT_MIN DEV_PORT_SIM -#define DEV_PORT_MAX DEV_PORT_USB - - -// IAMExtDevice Capability Items: unless otherwise specified, these items return -// OATRUE or OAFALSE. All return values are in pdwValue unless otherwise specified: - -#define ED_DEVCAP_CAN_RECORD ED_BASE+1L -#define ED_DEVCAP_CAN_RECORD_STROBE ED_BASE+2L // for multitrack devices: - // switches currently recording tracks off - // and selected non-recording tracks into record -#define ED_DEVCAP_HAS_AUDIO ED_BASE+3L -#define ED_DEVCAP_HAS_VIDEO ED_BASE+4L -#define ED_DEVCAP_USES_FILES ED_BASE+5L -#define ED_DEVCAP_CAN_SAVE ED_BASE+6L - -#define ED_DEVCAP_DEVICE_TYPE ED_BASE+7L // returns one of the following: -#define ED_DEVTYPE_VCR ED_BASE+8L -#define ED_DEVTYPE_LASERDISK ED_BASE+9L -#define ED_DEVTYPE_ATR ED_BASE+10L -#define ED_DEVTYPE_DDR ED_BASE+11L -#define ED_DEVTYPE_ROUTER ED_BASE+12L -#define ED_DEVTYPE_KEYER ED_BASE+13L -#define ED_DEVTYPE_MIXER_VIDEO ED_BASE+14L -#define ED_DEVTYPE_DVE ED_BASE+15L -#define ED_DEVTYPE_WIPEGEN ED_BASE+16L -#define ED_DEVTYPE_MIXER_AUDIO ED_BASE+17L -#define ED_DEVTYPE_CG ED_BASE+18L -#define ED_DEVTYPE_TBC ED_BASE+19L -#define ED_DEVTYPE_TCG ED_BASE+20L -#define ED_DEVTYPE_GPI ED_BASE+21L -#define ED_DEVTYPE_JOYSTICK ED_BASE+22L -#define ED_DEVTYPE_KEYBOARD ED_BASE+23L - -// returns mfr-specific ID from external device. -#define ED_DEVCAP_EXTERNAL_DEVICE_ID ED_BASE+24L - -#define ED_DEVCAP_TIMECODE_READ ED_BASE+25L -#define ED_DEVCAP_TIMECODE_WRITE ED_BASE+26L -// used for seekable non-timecode enabled devices -#define ED_DEVCAP_CTLTRK_READ ED_BASE+27L -// used for seekable non-timecode enabled devices -#define ED_DEVCAP_INDEX_READ ED_BASE+28L - -// returns device preroll time in current time format -#define ED_DEVCAP_PREROLL ED_BASE+29L -// returns device postroll time in current time format -#define ED_DEVCAP_POSTROLL ED_BASE+30L - -// returns indication of device’s synchronization accuracy. -#define ED_DEVCAP_SYNC_ACCURACY ED_BASE+31L // returns one of the following: -#define ED_SYNCACC_PRECISE ED_BASE+32L -#define ED_SYNCACC_FRAME ED_BASE+33L -#define ED_SYNCACC_ROUGH ED_BASE+34L - -// returns device’s normal framerate. -#define ED_DEVCAP_NORMAL_RATE ED_BASE+35L // returns one of the following: -#define ED_RATE_24 ED_BASE+36L -#define ED_RATE_25 ED_BASE+37L -#define ED_RATE_2997 ED_BASE+38L -#define ED_RATE_30 ED_BASE+39L - -#define ED_DEVCAP_CAN_PREVIEW ED_BASE+40L -#define ED_DEVCAP_CAN_MONITOR_SOURCES ED_BASE+41L - -// indicates implementation allows testing of methods/parameters by -// setting the hi bit of a parm that makes sense - see individual methods -// for details. -#define ED_DEVCAP_CAN_TEST ED_BASE+42L - -// indicates device accepts video as an input. -#define ED_DEVCAP_VIDEO_INPUTS ED_BASE+43L - -// indicates device accepts audio as an input. -#define ED_DEVCAP_AUDIO_INPUTS ED_BASE+44L - -#define ED_DEVCAP_NEEDS_CALIBRATING ED_BASE+45L - -#define ED_DEVCAP_SEEK_TYPE ED_BASE+46L // returns one of the following: -#define ED_SEEK_PERFECT ED_BASE+47L // indicates device can execute seek - // within 1 video frames without signal - // break (like a DDR) -#define ED_SEEK_FAST ED_BASE+48L // indicates device can move pretty quick - // with short break in signal -#define ED_SEEK_SLOW ED_BASE+49L // seeks like a tape transport - -#define ED_POWER_ON ED_BASE+50L -#define ED_POWER_OFF ED_BASE+51L -#define ED_POWER_STANDBY ED_BASE+52L - -#define ED_ACTIVE ED_BASE+53L -#define ED_INACTIVE ED_BASE+54L -#define ED_ALL ED_BASE+55L -#define ED_TEST ED_BASE+56L - -// IAMExtTransport Capability Items: unless otherwise specified, these items return -// OATRUE or OAFALSE. All return values are in pdwValue unless otherwise specified: - -#define ED_TRANSCAP_CAN_EJECT ED_BASE+100L -#define ED_TRANSCAP_CAN_BUMP_PLAY ED_BASE+101L // variable speed for synchronizing -#define ED_TRANSCAP_CAN_PLAY_BACKWARDS ED_BASE+102L // servo locked for use during an edit -#define ED_TRANSCAP_CAN_SET_EE ED_BASE+103L // show device’s input on its output -#define ED_TRANSCAP_CAN_SET_PB ED_BASE+104L // show media playback on device’s output -#define ED_TRANSCAP_CAN_DELAY_VIDEO_IN ED_BASE+105L // transport can do delayed-in video edits -#define ED_TRANSCAP_CAN_DELAY_VIDEO_OUT ED_BASE+106L // transport can do delayed-out video edits -#define ED_TRANSCAP_CAN_DELAY_AUDIO_IN ED_BASE+107L // transport can do delayed-in audio edits -#define ED_TRANSCAP_CAN_DELAY_AUDIO_OUT ED_BASE+108L // transport can do delayed-out audio edits -#define ED_TRANSCAP_FWD_VARIABLE_MAX ED_BASE+109L // max forward speed (multiple of play speed) - // in pdblValue -#define ED_TRANSCAP_FWD_VARIABLE_MIN ED_BASE+800L // min forward speed (multiple of play speed) - // in pdblValue -#define ED_TRANSCAP_REV_VARIABLE_MAX ED_BASE+110L // max reverse speed (multiple of play speed) in - // pdblValue -#define ED_TRANSCAP_REV_VARIABLE_MIN ED_BASE+801L // min reverse speed (multiple of play speed) - // in pdblValue -#define ED_TRANSCAP_FWD_SHUTTLE_MAX ED_BASE+802L // max forward speed in Shuttle mode (multiple - // of play speed) in pdblValue -#define ED_TRANSCAP_FWD_SHUTTLE_MIN ED_BASE+803L // min forward speed in Shuttle mode (multiple - // of play speed) in pdblValue -#define ED_TRANSCAP_REV_SHUTTLE_MAX ED_BASE+804L // max reverse speed in Shuttle mode (multiple - // of play speed) in pdblValue -#define ED_TRANSCAP_REV_SHUTTLE_MIN ED_BASE+805L // min reverse speed in Shuttle mode (multiple - // of play speed) in pdblValue -#define ED_TRANSCAP_NUM_AUDIO_TRACKS ED_BASE+111L // returns number of audio tracks -#define ED_TRANSCAP_LTC_TRACK ED_BASE+112L // returns track number of LTC timecode track. - // ED_ALL means no dedicated timecode track -#define ED_TRANSCAP_NEEDS_TBC ED_BASE+113L // device’s output not stable -#define ED_TRANSCAP_NEEDS_CUEING ED_BASE+114L // device must be cued prior to performing edit -#define ED_TRANSCAP_CAN_INSERT ED_BASE+115L -#define ED_TRANSCAP_CAN_ASSEMBLE ED_BASE+116L -#define ED_TRANSCAP_FIELD_STEP ED_BASE+117L // device responds to Frame Advance command by - // advancing one field -#define ED_TRANSCAP_CLOCK_INC_RATE ED_BASE+118L // VISCA command - keep for compatibility -#define ED_TRANSCAP_CAN_DETECT_LENGTH ED_BASE+119L -#define ED_TRANSCAP_CAN_FREEZE ED_BASE+120L -#define ED_TRANSCAP_HAS_TUNER ED_BASE+121L -#define ED_TRANSCAP_HAS_TIMER ED_BASE+122L -#define ED_TRANSCAP_HAS_CLOCK ED_BASE+123L -#define ED_TRANSCAP_MULTIPLE_EDITS ED_BASE+806L // OATRUE means device/filter can support - // multiple edit events -#define ED_TRANSCAP_IS_MASTER ED_BASE+807L // OATRUE means device is the master clock - // for synchronizing (this sets timecode-to- - // reference clock offset for editing) -#define ED_TRANSCAP_HAS_DT ED_BASE+814L // OATRUE means device has Dynamic Tracking - -// IAMExtTransport Media States -#define ED_MEDIA_SPIN_UP ED_BASE+130L -#define ED_MEDIA_SPIN_DOWN ED_BASE+131L -#define ED_MEDIA_UNLOAD ED_BASE+132L - -// IAMExtTransport Modes -#define ED_MODE_PLAY ED_BASE+200L -#define ED_MODE_STOP ED_BASE+201L -#define ED_MODE_FREEZE ED_BASE+202L // really "pause" -#define ED_MODE_THAW ED_BASE+203L -#define ED_MODE_FF ED_BASE+204L -#define ED_MODE_REW ED_BASE+205L -#define ED_MODE_RECORD ED_BASE+206L -#define ED_MODE_RECORD_STROBE ED_BASE+207L -#define ED_MODE_RECORD_FREEZE ED_BASE+808L // never "put", only "get" -#define ED_MODE_STEP ED_BASE+208L // same as "jog" -#define ED_MODE_STEP_FWD ED_BASE+208L // same as ED_MODE_STEP -#define ED_MODE_STEP_REV ED_BASE+809L -#define ED_MODE_SHUTTLE ED_BASE+209L -#define ED_MODE_EDIT_CUE ED_BASE+210L -#define ED_MODE_VAR_SPEED ED_BASE+211L -#define ED_MODE_PERFORM ED_BASE+212L // returned status only -#define ED_MODE_LINK_ON ED_BASE+280L -#define ED_MODE_LINK_OFF ED_BASE+281L -#define ED_MODE_NOTIFY_ENABLE ED_BASE+810L -#define ED_MODE_NOTIFY_DISABLE ED_BASE+811L -#define ED_MODE_SHOT_SEARCH ED_BASE+812L - -// IAMTimecodeReader/Generator/Display defines -// -// Timecode Generator Mode params and values: -// -#define ED_TCG_TIMECODE_TYPE ED_BASE+400L // can be one of the following: -#define ED_TCG_SMPTE_LTC ED_BASE+401L -#define ED_TCG_SMPTE_VITC ED_BASE+402L -#define ED_TCG_MIDI_QF ED_BASE+403L -#define ED_TCG_MIDI_FULL ED_BASE+404L - -#define ED_TCG_FRAMERATE ED_BASE+405L // can be one of the following: -#define ED_FORMAT_SMPTE_30 ED_BASE+406L -#define ED_FORMAT_SMPTE_30DROP ED_BASE+407L -#define ED_FORMAT_SMPTE_25 ED_BASE+408L -#define ED_FORMAT_SMPTE_24 ED_BASE+409L - -#define ED_TCG_SYNC_SOURCE ED_BASE+410L // can be one of the following: -#define ED_TCG_VIDEO ED_BASE+411L -#define ED_TCG_READER ED_BASE+412L -#define ED_TCG_FREE ED_BASE+413L - -#define ED_TCG_REFERENCE_SOURCE ED_BASE+414L // can have one these values: - // ED_TCG_FREE || ED_TCG_READER - // (for regen/jamsync) - -// TimeCodeReader Mode params and values: -#define ED_TCR_SOURCE ED_BASE+416L // can be one of the following: -// ED_TCG (already defined) -#define ED_TCR_LTC ED_BASE+417L -#define ED_TCR_VITC ED_BASE+418L -#define ED_TCR_CT ED_BASE+419L // Control Track -#define ED_TCR_FTC ED_BASE+420L // File TimeCode - for file-based devices - // that wish they were transports -// ED_MODE_NOTIFY_ENABLE can be OATRUE or OAFALSE (defined in transport mode -// section of this file). -#define ED_TCR_LAST_VALUE ED_BASE+421L // for notification mode - - // successive calls to GetTimecode - // return the last read value -// TimeCode Display Mode params and values: -// -#define ED_TCD_SOURCE ED_BASE+422L // can be one of the following: -#define ED_TCR ED_BASE+423L -#define ED_TCG ED_BASE+424L - -#define ED_TCD_SIZE ED_BASE+425L // can be one of the following: -#define ED_SMALL ED_BASE+426L -#define ED_MED ED_BASE+427L -#define ED_LARGE ED_BASE+428L - -#define ED_TCD_POSITION ED_BASE+429L // can be one of the following: -#define ED_TOP 0x0001 -#define ED_MIDDLE 0x0002 -#define ED_BOTTOM 0x0004 // or’d with -#define ED_LEFT 0x0100 -#define ED_CENTER 0x0200 -#define ED_RIGHT 0x0400 - -#define ED_TCD_INTENSITY ED_BASE+436L // can be one of the following: -#define ED_HIGH ED_BASE+437L -#define ED_LOW ED_BASE+438L - -#define ED_TCD_TRANSPARENCY ED_BASE+439L // 0-4, 0 is opaque - -#define ED_TCD_INVERT ED_BASE+440L // OATRUE=black on white - // OAFALSE=white on black -// IAMExtTransport defines -// -// Transport status, params and values -// - -// IAMExtTransport Status items and and values: -#define ED_MODE ED_BASE+500L // see ED_MODE_xxx values above -#define ED_ERROR ED_BASE+501L -#define ED_LOCAL ED_BASE+502L -#define ED_RECORD_INHIBIT ED_BASE+503L -#define ED_SERVO_LOCK ED_BASE+504L -#define ED_MEDIA_PRESENT ED_BASE+505L -#define ED_MEDIA_LENGTH ED_BASE+506L -#define ED_MEDIA_SIZE ED_BASE+507L -#define ED_MEDIA_TRACK_COUNT ED_BASE+508L -#define ED_MEDIA_TRACK_LENGTH ED_BASE+509L -#define ED_MEDIA_SIDE ED_BASE+510L - -#define ED_MEDIA_TYPE ED_BASE+511L // can be one of the following: -#define ED_MEDIA_VHS ED_BASE+512L -#define ED_MEDIA_SVHS ED_BASE+513L -#define ED_MEDIA_HI8 ED_BASE+514L -#define ED_MEDIA_UMATIC ED_BASE+515L -#define ED_MEDIA_DVC ED_BASE+516L -#define ED_MEDIA_1_INCH ED_BASE+517L -#define ED_MEDIA_D1 ED_BASE+518L -#define ED_MEDIA_D2 ED_BASE+519L -#define ED_MEDIA_D3 ED_BASE+520L -#define ED_MEDIA_D5 ED_BASE+521L -#define ED_MEDIA_DBETA ED_BASE+522L -#define ED_MEDIA_BETA ED_BASE+523L -#define ED_MEDIA_8MM ED_BASE+524L -#define ED_MEDIA_DDR ED_BASE+525L -#define ED_MEDIA_SX ED_BASE+813L -#define ED_MEDIA_OTHER ED_BASE+526L -#define ED_MEDIA_CLV ED_BASE+527L -#define ED_MEDIA_CAV ED_BASE+528L -#define ED_MEDIA_POSITION ED_BASE+529L - -#define ED_MEDIA_NEO ED_BASE+531L // Mini digital tape for MPEG2TS signal - -#define ED_LINK_MODE ED_BASE+530L // OATRUE if transport controls - // are linked to graph's RUN, - // STOP, and PAUSE methods - -// IAMExtTransport Basic Parms -#define ED_TRANSBASIC_TIME_FORMAT ED_BASE+540L // can be one of the following: -#define ED_FORMAT_MILLISECONDS ED_BASE+541L -#define ED_FORMAT_FRAMES ED_BASE+542L -#define ED_FORMAT_REFERENCE_TIME ED_BASE+543L - -#define ED_FORMAT_HMSF ED_BASE+547L -#define ED_FORMAT_TMSF ED_BASE+548L - -#define ED_TRANSBASIC_TIME_REFERENCE ED_BASE+549L // can be one of the following: -#define ED_TIMEREF_TIMECODE ED_BASE+550L -#define ED_TIMEREF_CONTROL_TRACK ED_BASE+551L -#define ED_TIMEREF_INDEX ED_BASE+552L - -#define ED_TRANSBASIC_SUPERIMPOSE ED_BASE+553L // enable/disable onscreen display -#define ED_TRANSBASIC_END_STOP_ACTION ED_BASE+554L // can be one of: ED_MODE_STOP | - // ED_MODE_REWIND | ED_MODE_FREEZE -#define ED_TRANSBASIC_RECORD_FORMAT ED_BASE+555L // can be one of the following: -#define ED_RECORD_FORMAT_SP ED_BASE+556L -#define ED_RECORD_FORMAT_LP ED_BASE+557L -#define ED_RECORD_FORMAT_EP ED_BASE+558L - -#define ED_TRANSBASIC_STEP_COUNT ED_BASE+559L -#define ED_TRANSBASIC_STEP_UNIT ED_BASE+560L // can be one of the following: -#define ED_STEP_FIELD ED_BASE+561L -#define ED_STEP_FRAME ED_BASE+562L -#define ED_STEP_3_2 ED_BASE+563L - -#define ED_TRANSBASIC_PREROLL ED_BASE+564L -#define ED_TRANSBASIC_RECPREROLL ED_BASE+565L -#define ED_TRANSBASIC_POSTROLL ED_BASE+566L -#define ED_TRANSBASIC_EDIT_DELAY ED_BASE+567L -#define ED_TRANSBASIC_PLAYTC_DELAY ED_BASE+568L -#define ED_TRANSBASIC_RECTC_DELAY ED_BASE+569L -#define ED_TRANSBASIC_EDIT_FIELD ED_BASE+570L -#define ED_TRANSBASIC_FRAME_SERVO ED_BASE+571L -#define ED_TRANSBASIC_CF_SERVO ED_BASE+572L -#define ED_TRANSBASIC_SERVO_REF ED_BASE+573L // can be one of the following: -#define ED_REF_EXTERNAL ED_BASE+574L -#define ED_REF_INPUT ED_BASE+575L -#define ED_REF_INTERNAL ED_BASE+576L -#define ED_REF_AUTO ED_BASE+577L - -#define ED_TRANSBASIC_WARN_GL ED_BASE+578L -#define ED_TRANSBASIC_SET_TRACKING ED_BASE+579L // can be one of the following: -#define ED_TRACKING_PLUS ED_BASE+580L -#define ED_TRACKING_MINUS ED_BASE+581L -#define ED_TRACKING_RESET ED_BASE+582L - -#define ED_TRANSBASIC_SET_FREEZE_TIMEOUT ED_BASE+583L -#define ED_TRANSBASIC_VOLUME_NAME ED_BASE+584L -#define ED_TRANSBASIC_BALLISTIC_1 ED_BASE+585L // space for proprietary data -#define ED_TRANSBASIC_BALLISTIC_2 ED_BASE+586L -#define ED_TRANSBASIC_BALLISTIC_3 ED_BASE+587L -#define ED_TRANSBASIC_BALLISTIC_4 ED_BASE+588L -#define ED_TRANSBASIC_BALLISTIC_5 ED_BASE+589L -#define ED_TRANSBASIC_BALLISTIC_6 ED_BASE+590L -#define ED_TRANSBASIC_BALLISTIC_7 ED_BASE+591L -#define ED_TRANSBASIC_BALLISTIC_8 ED_BASE+592L -#define ED_TRANSBASIC_BALLISTIC_9 ED_BASE+593L -#define ED_TRANSBASIC_BALLISTIC_10 ED_BASE+594L -#define ED_TRANSBASIC_BALLISTIC_11 ED_BASE+595L -#define ED_TRANSBASIC_BALLISTIC_12 ED_BASE+596L -#define ED_TRANSBASIC_BALLISTIC_13 ED_BASE+597L -#define ED_TRANSBASIC_BALLISTIC_14 ED_BASE+598L -#define ED_TRANSBASIC_BALLISTIC_15 ED_BASE+599L -#define ED_TRANSBASIC_BALLISTIC_16 ED_BASE+600L -#define ED_TRANSBASIC_BALLISTIC_17 ED_BASE+601L -#define ED_TRANSBASIC_BALLISTIC_18 ED_BASE+602L -#define ED_TRANSBASIC_BALLISTIC_19 ED_BASE+603L -#define ED_TRANSBASIC_BALLISTIC_20 ED_BASE+604L - -// consumer VCR items -#define ED_TRANSBASIC_SETCLOCK ED_BASE+605L -#define ED_TRANSBASIC_SET_COUNTER_FORMAT ED_BASE+606L // uses time format flags -#define ED_TRANSBASIC_SET_COUNTER_VALUE ED_BASE+607L - -#define ED_TRANSBASIC_SETTUNER_CH_UP ED_BASE+608L -#define ED_TRANSBASIC_SETTUNER_CH_DN ED_BASE+609L -#define ED_TRANSBASIC_SETTUNER_SK_UP ED_BASE+610L -#define ED_TRANSBASIC_SETTUNER_SK_DN ED_BASE+611L -#define ED_TRANSBASIC_SETTUNER_CH ED_BASE+612L -#define ED_TRANSBASIC_SETTUNER_NUM ED_BASE+613L - -#define ED_TRANSBASIC_SETTIMER_EVENT ED_BASE+614L -#define ED_TRANSBASIC_SETTIMER_STARTDAY ED_BASE+615L -#define ED_TRANSBASIC_SETTIMER_STARTTIME ED_BASE+616L -#define ED_TRANSBASIC_SETTIMER_STOPDAY ED_BASE+617L -#define ED_TRANSBASIC_SETTIMER_STOPTIME ED_BASE+618L - -// IAMExtTransport video parameters -#define ED_TRANSVIDEO_SET_OUTPUT ED_BASE+630L // can be one of the following: -#define ED_E2E ED_BASE+631L -#define ED_PLAYBACK ED_BASE+632L -#define ED_OFF ED_BASE+633L - -#define ED_TRANSVIDEO_SET_SOURCE ED_BASE+634L - -// IAMExtTransport audio parameters -#define ED_TRANSAUDIO_ENABLE_OUTPUT ED_BASE+640L // can be the following: -#define ED_AUDIO_ALL 0x10000000 // or any of the following OR'd together -#define ED_AUDIO_1 0x0000001L -#define ED_AUDIO_2 0x0000002L -#define ED_AUDIO_3 0x0000004L -#define ED_AUDIO_4 0x0000008L -#define ED_AUDIO_5 0x0000010L -#define ED_AUDIO_6 0x0000020L -#define ED_AUDIO_7 0x0000040L -#define ED_AUDIO_8 0x0000080L -#define ED_AUDIO_9 0x0000100L -#define ED_AUDIO_10 0x0000200L -#define ED_AUDIO_11 0x0000400L -#define ED_AUDIO_12 0x0000800L -#define ED_AUDIO_13 0x0001000L -#define ED_AUDIO_14 0x0002000L -#define ED_AUDIO_15 0x0004000L -#define ED_AUDIO_16 0x0008000L -#define ED_AUDIO_17 0x0010000L -#define ED_AUDIO_18 0x0020000L -#define ED_AUDIO_19 0x0040000L -#define ED_AUDIO_20 0x0080000L -#define ED_AUDIO_21 0x0100000L -#define ED_AUDIO_22 0x0200000L -#define ED_AUDIO_23 0x0400000L -#define ED_AUDIO_24 0x0800000L -#define ED_VIDEO 0x2000000L // for Edit props below - -#define ED_TRANSAUDIO_ENABLE_RECORD ED_BASE+642L -#define ED_TRANSAUDIO_ENABLE_SELSYNC ED_BASE+643L -#define ED_TRANSAUDIO_SET_SOURCE ED_BASE+644L -#define ED_TRANSAUDIO_SET_MONITOR ED_BASE+645L - - -// Edit Property Set-related defs - -// The following values reflect (and control) the state of an -// edit property set -#define ED_INVALID ED_BASE+652L -#define ED_EXECUTING ED_BASE+653L -#define ED_REGISTER ED_BASE+654L -#define ED_DELETE ED_BASE+655L - -// Edit property set parameters and values -#define ED_EDIT_HEVENT ED_BASE+656L // event handle to signal event - // completion -#define ED_EDIT_TEST ED_BASE+657L // returns OAFALSE if filter thinks - // edit can be done, OATRUE if not -#define ED_EDIT_IMMEDIATE ED_BASE+658L // OATRUE means start put the - // device into edit mode (editing - // "on the fly") immediately upon - // execution of Mode(ED_MODE_EDIT_CUE) -#define ED_EDIT_MODE ED_BASE+659L -// can be one of the following values: -#define ED_EDIT_MODE_ASSEMBLE ED_BASE+660L -#define ED_EDIT_MODE_INSERT ED_BASE+661L -#define ED_EDIT_MODE_CRASH_RECORD ED_BASE+662L -#define ED_EDIT_MODE_BOOKMARK_TIME ED_BASE+663L // these two are for -#define ED_EDIT_MODE_BOOKMARK_CHAPTER ED_BASE+664L // laserdisks - -#define ED_EDIT_MASTER ED_BASE+666L // OATRUE causes device - // not to synchronize - -#define ED_EDIT_TRACK ED_BASE+667L -// can be one of the following possible OR'd values: -// ED_VIDEO, ED_AUDIO_1 thru ED_AUDIO_24 (or ED_AUDIO_ALL) - -#define ED_EDIT_SRC_INPOINT ED_BASE+668L // in current time format -#define ED_EDIT_SRC_OUTPOINT ED_BASE+669L // in current time format -#define ED_EDIT_REC_INPOINT ED_BASE+670L // in current time format -#define ED_EDIT_REC_OUTPOINT ED_BASE+671L // in current time format - -#define ED_EDIT_REHEARSE_MODE ED_BASE+672L -// can be one of the following possible values: -#define ED_EDIT_BVB ED_BASE+673L // means rehearse the edit with - // "black-video-black" -#define ED_EDIT_VBV ED_BASE+674L -#define ED_EDIT_VVV ED_BASE+675L -#define ED_EDIT_PERFORM ED_BASE+676L // means perform the edit with no - // rehearsal. - -// Set this property to OATRUE to kill the edit if in progress -#define ED_EDIT_ABORT ED_BASE+677L -// how long to wait for edit to complete -#define ED_EDIT_TIMEOUT ED_BASE+678L // in current time format - -// This property causes the device to seek to a point specified by -// ED_EDIT_SEEK_MODE (see below). NOTE: Only one event at a time can seek. -#define ED_EDIT_SEEK ED_BASE+679L // OATRUE means do it now. -#define ED_EDIT_SEEK_MODE ED_BASE+680L -//possible values: -#define ED_EDIT_SEEK_EDIT_IN ED_BASE+681L // seek to edit's inpoint -#define ED_EDIT_SEEK_EDIT_OUT ED_BASE+682L // seek to edit's outpoint -#define ED_EDIT_SEEK_PREROLL ED_BASE+683L // seek to edit's - // inpoint-preroll -#define ED_EDIT_SEEK_PREROLL_CT ED_BASE+684L // seek to preroll point - // using control track (used for tapes with - // discontinuoustimecode before edit point: seek - // to inpoint using timecode, then backup to - // preroll point using control track) -#define ED_EDIT_SEEK_BOOKMARK ED_BASE+685L // seek to bookmark (just like - // timecode search) -// This property is used for multiple-VCR systems where each machine must -// cue to a different location relative to the graph's reference clock. The -// basic idea is that an edit event is setup with an ED_EDIT_OFFSET property -// that tells the VCR what offset to maintain between it's timecode (converted -// to reference clock units) and the reference clock. -#define ED_EDIT_OFFSET ED_BASE+686L // in current time format - -#define ED_EDIT_PREREAD ED_BASE+815L // OATRUE means device supports - // pre-read (recorder can also be - // player - -// -// Some error codes: -// -// device could be in local mode -#define ED_ERR_DEVICE_NOT_READY ED_BASE+700L - - - - - - -// ************************************************** -// -// New constants added for implementation of DVCR -// -// ************************************************** - - -// -// New Device type (a DV has two subunits: camera and VCR) -// -#define ED_DEVTYPE_CAMERA ED_BASE+900L - -#define ED_DEVTYPE_TUNER ED_BASE+901L - -#define ED_DEVTYPE_DVHS ED_BASE+902L - -#define ED_DEVTYPE_UNKNOWN ED_BASE+903L - -// -// Unknownn capability -// Instead of return E_NOTIMPL, or S_OK with OAFALSE, it may return S_OK with _UNKNOWN -// -#define ED_CAPABILITY_UNKNOWN ED_BASE+910L - - -// -// Send RAW extenal device command via Get/SetTransportBasicParameters() -// -#define ED_RAW_EXT_DEV_CMD ED_BASE+920L - - -// -// MEDIUM INFO -// -#define ED_MEDIA_VHSC ED_BASE+925L // New media type -#define ED_MEDIA_UNKNOWN ED_BASE+926L // Unknown media -#define ED_MEDIA_NOT_PRESENT ED_BASE+927L - - -// -// Device Control command that can result in pending state. -// -#define ED_CONTROL_HEVENT_GET ED_BASE+928L // To get a sychronous event handle -#define ED_CONTROL_HEVENT_RELEASE ED_BASE+929L // To release sychronous event handle must match what it got - -#define ED_DEV_REMOVED_HEVENT_GET ED_BASE+960L // To be a notify event and will be signal if device is removed. -#define ED_DEV_REMOVED_HEVENT_RELEASE ED_BASE+961L // Release this event handle - - -// -// TRANSPORT STATE -// -#define ED_NOTIFY_HEVENT_GET ED_BASE+930L // To get a sychronous event handle -#define ED_NOTIFY_HEVENT_RELEASE ED_BASE+931L // To release sychronous event handle must match what it got -#define ED_MODE_CHANGE_NOTIFY ED_BASE+932L // This is asynchronous operation, wait for event. - -#define ED_MODE_PLAY_FASTEST_FWD ED_BASE+933L -#define ED_MODE_PLAY_SLOWEST_FWD ED_BASE+934L -#define ED_MODE_PLAY_FASTEST_REV ED_BASE+935L -#define ED_MODE_PLAY_SLOWEST_REV ED_BASE+936L - -#define ED_MODE_WIND ED_BASE+937L -#define ED_MODE_REW_FASTEST ED_BASE+938L // High speed rewind - -#define ED_MODE_REV_PLAY ED_BASE+939L // x1 speed reverse play - - - -// -// TRANSPOSRTBASIC: input and output signal -// -#define ED_TRANSBASIC_INPUT_SIGNAL ED_BASE+940L -#define ED_TRANSBASIC_OUTPUT_SIGNAL ED_BASE+941L - -#define ED_TRANSBASIC_SIGNAL_525_60_SD ED_BASE+942L -#define ED_TRANSBASIC_SIGNAL_525_60_SDL ED_BASE+943L -#define ED_TRANSBASIC_SIGNAL_625_50_SD ED_BASE+944L -#define ED_TRANSBASIC_SIGNAL_625_50_SDL ED_BASE+945L - -#define ED_TRANSBASIC_SIGNAL_625_60_HD ED_BASE+947L -#define ED_TRANSBASIC_SIGNAL_625_50_HD ED_BASE+948L - -#define ED_TRANSBASIC_SIGNAL_MPEG2TS ED_BASE+946L - -#define ED_TRANSBASIC_SIGNAL_2500_60_MPEG ED_BASE+980L -#define ED_TRANSBASIC_SIGNAL_1250_60_MPEG ED_BASE+981L -#define ED_TRANSBASIC_SIGNAL_0625_60_MPEG ED_BASE+982L - -#define ED_TRANSBASIC_SIGNAL_2500_50_MPEG ED_BASE+985L -#define ED_TRANSBASIC_SIGNAL_1250_50_MPEG ED_BASE+986L -#define ED_TRANSBASIC_SIGNAL_0625_50_MPEG ED_BASE+987L - -#define ED_TRANSBASIC_SIGNAL_UNKNOWN ED_BASE+990L - -// -// TIMECODE/AbsoluteTrackNumber/RealTimeCounter read/seek/write -// -#define ED_DEVCAP_TIMECODE_SEEK ED_BASE+950L - -#define ED_DEVCAP_ATN_READ ED_BASE+951L -#define ED_DEVCAP_ATN_SEEK ED_BASE+952L -#define ED_DEVCAP_ATN_WRITE ED_BASE+953L - -#define ED_DEVCAP_RTC_READ ED_BASE+954L -#define ED_DEVCAP_RTC_SEEK ED_BASE+955L -#define ED_DEVCAP_RTC_WRITE ED_BASE+956L - -// -// Basic parameter -// -#define ED_TIMEREF_ATN ED_BASE+958L - - -// -// GUID used to identify a class driver -// - -#ifndef OUR_GUID_ENTRY - #define OUR_GUID_ENTRY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8); -#endif - -// 8C0F6AF2-0EDB-44c1-8AEB-59040BD830ED MSTapeDeviceGUID -OUR_GUID_ENTRY(MSTapeDeviceGUID, -0x8C0F6AF2, 0x0EDB, 0x44c1, 0x8A, 0xEB, 0x59, 0x04, 0x0B, 0xD8, 0x30, 0xED) - -#endif // __XPRTDEFS__ - -// eof XPrtDefs.h diff --git a/import/DirectX8/lib/DSETUP.lib b/import/DirectX8/lib/DSETUP.lib deleted file mode 100644 index b809eeb6a4eabc56b219a1c6a2bb2168cd77944b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5510 zcmcIo&2JM&6n}PFXq=GvBRN!RRg;7&P|1yr?Zj$S*~Mw=VnXB(sJIwoZ$Q@u^t`k4-n`$;o43Dt>x;YX zVdv=U$d^g=DiqS0LO#8nQ@fK}{5hS@=2`P@1OV0n<{twrJO@~O1F)3h@&fND%TJj^ zmjEnzf_IeoYbJ?Z0FsqwOjgk+N#Z4w*joUS=sPB{`}mBqyv8Jc2mPR|Y?8EEl^X{) zYmHWUuYRpoIcVIhwaWFqM)Lq#t^H=T>ej=r%z&vI-#7QKx5}kP30h@yXmrLumW@Yd z$0!fYN5-&jj2{k4#dIFsnGXi7DK=gnZU^wdY`BM-acGXl#;`OP^vq6sZ1#^!#T~~a zyo|hk+z#TyGU7hO`ZEq_sb99NjDBbj+Q-E$ow=mcjM+CjzQed)9*Ggt&WrVP%jU5r zOs+6^TFH30=xgm>?_Rs}b1|!1p~FBP`<*eqWei8Sk1lL0ma1MJIf2Y*qpGOoap>_| zvu6lYeW)}>+()(F?$*ac^Z3vmWrt2it&H|?gm$JAm26)>>i@FWtd=|iYHMd_t=xpQ z5=dK*=K-EC0K8cQNFg`9KzX{1oD~Ilg7P{Ju#1MzRsbTa057rqHU{txb@%bUhPHRm zW)t;Df$#x*2r)PZ=iwt*hA1pS9OfYc7a#!(um~XtPqmqw#yLDvE=E$gLcbfDthX41 zyVR&X-g|ksW=S@AoOgC>lOhmP$o_p^JUPMSApuEZ_TwecLE(Rxui2ndM}X4sQQaQg|vo4-rR#xE;u8;?}ZcQTn}3 z46o{f6&;q>_t`QTt>)e#7hx`=kC(+Sjn0oWGnqvrE=dihi>DTRialnMOBA zL_a}bFS?pJ5A%YqlJu2GuVytwoOKyNkhZ2&I`;m_q!Mf|{g7!tJ-^wkWA-%2xvM;h z9BaOas90W3kk!NcG>G|(9`OpI5wVH2dXxkbwA~CCWgle9W*=m#Gi*4i84NjF(65;Y zfer|PY!@#Q*vxq>z8aE_J>5VgI;Ipfxg?T6?PjnQ`t9lkC#L(8&4!yfwmCtAj@4d5 zRQy;{SF2R<66owP_Q<6qBI0M3iYiJ%3D9l^i*GKg&!9ELI_Jg{|6$lLXBt;3a+ECM zl`Sh?CD7U9x}#s`=ZJ`;tfHzVu>@;314ei9$Dzvn>xf82oU&G_&bD!8=X^g-pbA;R Zw5s>hpyfSy{tHB+N?4$IeG|yo{{ceBczgf= diff --git a/import/DirectX8/lib/LIBCI.lib b/import/DirectX8/lib/LIBCI.lib deleted file mode 100644 index 43313f10528b9503e08f9b009cf585b10cf73916..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165800 zcmeFa34E5txiNZY&t0*HXY1+XeHK#;_+NZuf}ir7ds zO?SdzsR!=>aR%^cNx@YE@nP*7|YWwy7@8tJ9 znfIP+?%D3SXP;-n>sz<1S^vgSGs=BaS6`Q{ug%ua^vUH}{kt+-HLG6imyQa8OiK`) z|A|-c>D&?o?(>%QL2$!=1;Kkdg5YD%{Oz7^oe~7*xvwM$UXAD1w+F#1d@`Baf>-r9 zdPk5cdnU+?J@;?_G&~$+qR+y21(}0+nmdBb`QNwCh46Rr${^EP7i88TO>MsoGV9L_ zG9B*-GMxv4%%L9d44`V$nbgOyXtxD!$F46lgLLtzo}Bs{+ENy-|!i6{Qlrod9rr~Biv`^3&9BU zoH;KT@&C=Ip&{G8sVl#wt#v~#cUEIlu5r%tY%cevAm*?#LR$uKbK`R5cXju=obpv^ z*} zoi3Lc24#UZ3`MJK%r#^ibB#G0TGYXC3F(cw>N(=U#GrDCW)gB&*s3Vg>L{Vc5>#eo z&(b_v+Bdf6b2;XGqfYNaRa6NG$@$6@hc%nJ!Kiwd03})8e%tB*f(; zbaKSPmEy2Wl@NsR2;K3bOE!Y6j{L3(e@i4+w{L9Sa#b!QRxO-^jPKmk)n;kPAXKqR zsYUG@TUxiaws+>7fS1i_TF6YMf3%X%})EY$^24(bUNQkLX$0gK3N{far zQk0$&4V`r52z6oTV1(U7PW`TqxYvZgC88$hjVEN(O38IC@Gjj5bS`8;beL5}933xy zGi39+-Q{33O@x?+4#PtO>9J8|V`)y|SfVK%OQ}`u-U3UBXTEid=Du~&*&iiTM+r5S z;Ff@;MvB092+P1Hhnb=a!E;S51!|Ib*Fw=GH`xVI&6>|c+BSA5a=9><**c0>w18Qs zw<3LvTux^^I||~-=_7=qEN&(riPIwN&{ZfZS~dxoM4po!7XCiG%)ajro>#+$3aWJki@))^u-aha%gicx4x&QQp?Fp>^A8bO6L- zc9D>}@~wGkOck-YQOI62L{T=(3_DpUc$IgJ^CW|lT$ZYCMd&A5e5Ue|u8Yu+z&@#8 zm`&;}3>PawRfe$&g~E`$u1M%w6M8^&CF$`TPskr=2FV3TmPwnIE<^Bw({6PkSl4(% z@W7!qFq}PQut4+hym$!J!Bw6;R7`OsV2tRSu>Id2J5w`!XmwKj6x8Om&X02q#p5fE zZLRq$*Ru~0W*K!7%eZ~>I!L|=6jasHZbs+CClib=!|K*Gz5`0RGAG5?rJZBF3gyaP zg%^;BSiDNaCFZg=)I=wW5+q)VB>h_z1R{M|9Jz?H#oktuTeKfWY`(3t)5nT_Nf6w| z#wGC3!fsb*t|nK#uCB5!>l^D@ldWxAC&nVI>*_)Mt{KE{UC#2eHp97Y&{);w28&f) zZm?L@gN8~F}IOeDNQKRXkaL!Kkvp`(3o4h`fig1)@GN&Qp5cVpf z4ocly)}cmkskKC-cP+&zS4)ZOPU{xcnASyUw6NO{cA~Yui~_5pgc?hbNa{|orBdBF zy}TK29GW!YoUl%VxK|#@tTg|Vzm$%O&!WmWfJqy zwZ@IEWSO70l7I31Lg}cStquKa`7{JCEurk1*qJ^GfYRc(7*z?5c{3R$Hp zE-Rj?e2TuLY3?~vPuCiHoR4Za1ivJ==&a^BX%%~MShM3yR2w5qsu#^a2Q!{f4xNL9 z+B|2asvcB4Rg34Nwq&=NNb1NhY@926HfuWiZ}A)!{iP<5!V)yOPYsz;f~x6L5nj^V zv_Jw{KS+f2{IW!M$-*Uz#6!1 zH-(d>&5akd=%1281kP7&9zc+}LB z4Z_n+3p`(*lc+80O)D!-_N1a) zP{Vmyi$;?57>8q-b!wj16n*GuW^Fxx>C?7buB7BxFa%_wp3Usuc)2Lo7IAfE8M-(k zvR)W8TTqf?9?okNWolbgtfwsm1Jve9MCxSK-S#?f=!RV&!8 z)!iF5$HvtnEnu4Lun`mX$u9X#U0qQZ5w8Z(j&qmf&R#gTIoB}jyz|d(YFsksg82aH)I=Tiq4_(UNk>sXBg14yrYh-fqN;SwNtYbe*Iwu!6Wm7K&ySaf!gg<|2v?9hzq~ zqQ;>4h6PfDM%gqcIz)>^psGJ)qvJR>r8}zn%n`Cl1SCsUXz6;#sfo~#D4~Wd)TEr@ zp_PL4v7@w*K{z>#cFs+v_AK*s#7a2lSGv;q7AH@oJbSvh7xgdLP~Ry(3E3UJdmn5^QstA zOL3UVtfk2l#a{*`5mJm9+Id%8luwz}G(NQisbNcu7uYD~O^26`njQqfC(aLoEuBHI{w+c9UpE9n$9sa{nU4j* zDc=f$lKX<-_Fo6VZJA84GeKP| zaBDKbZ`(4#nd>vbJ32DKfzC|OyeSjhdqpN#yd@LNzXi{`Gr`y1p9$W2PbRqfJ8<8Z z3BK}!OtAgOnPB|SGr@Ns$pjyM4E&$W1XaJu1TXK;1pAL45!{&_5xg*SL@@8n5kX5P z2u9$qNdAfg^>=un{ze7-%gEo6f%%&rOb^EEzmo&=N9yVLn~Fc$?H{=pgCjYS2Yu6* z!4o+O^pk@lg0aEzL0K>^I5s#g7!#BP$ACUMI59XSI4zhEoEl6DrUWMi6N7S~D-MD$ z({p$je?Me~dm^}2$fJ0lhLFy{AHx_r)(ThcGZrOJ$eF&82H*hBO2(Zz^xNSR0fd+R%OO*KAqB zPF_cf%_|8N@sO03Zc|g-opi&++MptNWCjfk#C1|0?2ugr=uaP^(~n6A*H^+6R5++) zPM97+Y~XK#^WyLiIi^WaY?8Q2cZ-}J>4fr!E{`Tzjp5Mrb`=8&v)qB0Qizefs^z=J z{n+&)i%bYjlTujIHO|_Kl4b45k4p}P#v>*%jdToE7NuxD>3G_mX0ewy=x}o5C$2pX2l6 zYTYqTSJ@Y*tIUhjRo2DnD&yjGm2Gjl%CtCLWlWr|vL#MGsKlGa!36JSU8FWtA$m+% z8!8Y(u<9eEP(x~enpziTTx^oYaS0P5Glg|FZ_NadZTwlaP>&B6#`Zx<&Ce%MB_F zAwo!G>1MgXdzv_wn22i_n#va^(-VA#1rnX|ifk{CdEC@h%jDI-*ixoqvLw1ns3wW4 z;%jt*PgxSa+_nDwp=|0H484}NfUG8m3IYY4^tUhSD?W|+k z#^!{bxM`<&%(lnK#$7}9Bs~(gBcQ&Etw<5Nsd0(qL4tCtmhac!*e4W9@?whFcA#V9bqzvVIDWGfzksUn zGgdayGjY*lL$PBlJRNB=E_PDV>_fMJ)Qn49{E1|o*`gM*(;1nNamfoue#Ry358+yp z*$tsG&aN(n!6s!~(QSrOXI_ol3(|Kt>UtLoS*jg(S;kysin}XyS0r*IeaFqM6RqG^2WNFnN{UtE*-VHyS;Pm#po%ubza<+ zZ`riE<6@l25Ct_IKY|2zaYjEW&7EC!cB4|=;W(HxF5DT+UDx+C?%KIB)mWia=(t2+mCMkjv==hTET^mU!7xlZTHh6o*v$zY+wdCJZ{RkJS}#n3!myfgy66~4w5-~ zc49E@kgHU|q4z5sd*3Y8&+fZpXMK33~A2AeTKPmR4MOrt>=w0*VOXz%4~MltXbvdv$ECU z{^7-$6N3-^@`jlexVv*3_7c-fU%RDkO@3>e`W0X=W)OV1(EQT>N0kQC*-vrEn_&ME za3>z7h==1}d1>jTf~zpxgJ1^eR|4}XjU(&w((I+v*S6+cl~;Kmi}!=T{95BO_?;`w z?V7%YzzW=es?0e2`#ms4Me4W4<)ZwUj#6MI`nW`X(}0=h<6`_6zoo#e^>K;(HUjfD zAD2r?$F0D8W(eFd2={Bi?A17C5Ar3(uN3q@19SLDSYXofWh~rY2h8a{E|!im;A((b zsBt6k+lGrD+7#pe#lWofa9JHcg9@-47&50ZhMFr)#_dSLZ4)^N1uF|CHv)IJ#unhW z#4jSJQ$ha)Fd0SwhB%SawYX#GvWoda#EbcNGB7hVj`_E+v~*5X?z=&+2j)u}H<;WP z!?BhCm{9H$($NCUEgF}Wjve6fMPSar{lYYar`5L`fVorS1`GFbU`8Jy>?B{3@^1;8 zrvY=7#!(ED!lj&k1DNkR{G^^o(mMsX{lJt$2hkY0I%93yy4LQ_d}sUWGx4lxFTb14 z`}tb7?7ZbGsvoVtq`2?7j!bX&GrgBQ+mb)wrln=7R_vWG%mmwe&9l9iymVgQgYxUV zo0gXJUh|UJ`-=LOJm1onE8JU1;R*WgUv<&i-Xm$0P|)5 zMhN;vX;%mm$U#$U~QJpyd_cLUH_pqG+}$2kxKpe}R`y{q^!h$(pd zn6k|)k{VB>a$^K($gBLYcON%GekH%6c|pHTc#3d>BnYa-#_%h}w*00mo>_6z_OiYo z?#J&y|9fFxMM)+o%JTe@Vxt24_Vny2`P0KE?CJ<6?Lh%F4cd0H{>z02Yt>q@G5gnu&B^}0#%GrIE_s$M$GqZa z;2QL_y%gMZ#etsP&;03;6ZTDduxGat@SY_v4d|8!ZOtmvy6j%XOv|;n~_O<&@J_351s?{AuFyw*^6%5Vn&)v-Q z!MHss>Xw2G#}J3(nLFkS52>~aKSXcx|A?R*k2{`V->4u%?OKTE^Y0p1IRdB3f}mn? zb#?7brR<4eCI>j%XAJq!FvpZB585+SZHjKF?ihk06l9LYo9W4({v#yFpciTn#2|*w z2!*jJ$S`F3I_bxoP=>}At2zxa@a2qu7+;lR^mXd8#~-l1@}STV;&FvR%2*afw|_Wfk< zcdf7c=mmxt-xtfJAj4h|b4nQ#!^iY*Rd#O9vmO*=O7UhMzUM!;H`uU#uYD1tI6-Jb zU3jIt?34(G^ zM0%kKjwcU1N_v;XF*R_6Q5cnWML`r1x+*nAF4aVGw{809@4#SM!& ztiqztKTNsfJBDu%d{X-&#^euCf#@dd>w#Tw`K9%RL&YIRvj)Pe@)Y^4Ew2NAWj)C_31zx7-lUvZSzWv4sV842vhHd~%6~zo8*kRDJ1;H0 zR7oU$1XDHVV-#n`P|vtfU-=sHm{3F3*C`E23^YD;WsGOy8Ls8t^I04)XGE4BLuGm*r4`c>5num3KPKf0O$6QLU zQhKL+^OWWj!rZ801%k2TvS(uHszMB@cNNA>*NLDOWTxOvPw&6=v0}{`si=Z%&AP0g{rvVt)q+t|Kk ztHtA= zDe({a${|m4kF`2!tx4Qu$-}Sm)BmVHR+2)L7Q!T#(&0eRWrt!SMe)_lLIc z2ry6Yw38&WUw1BeUF`5nn|Iv|%npsC9!r{cZ36x6!2D3-*t1QVhb#mAn8Pr8gNKH? zE^Qui0Wh01PSVSH^+-C{XY2vy76+G>j!y#fb&X3)2iwSR0rOLhQ}M&PiPJv-MCRI_ z116)ogQDM)@`d?)1Te>F9Mh2&zte!JAA;W`_@4{RI*ns?r}4WPnA?Wn$Nb|O#~m6s zSo|IU=HVguF}=S6=9z=w$Kg*Y1qCLpJedE-Ym5N#N=xsFz@0G!zY6%T1?D0Lm&UIR zm~ID`RKAS&wHh;2{J3s%YlL5XUfpove~wAiOeH&GMQXbJX}U1n*WoFXKE`CR;U)E& z|BWFBZ-TI+Za>{F?0W!nCe^!UKhWFsQhsDdMyQ-1>BuyHlL#STn#7wWVb?~@I8B7D zOd`k*P?=19vP)Ga!+3T?iURZ`WSCzjv-A^$Hqia7iol+`@jH;jP>87*%A^B>5ik65 zkixD^nM}trxoO6oE-42{O_#9SS`@6OCmkMnaB!gFe+q026W21y+rF5YBZKAl6yv{{ zEmF%BtM;&ZsI;-8dj_5|iRm=4;U%4H{)drBGsKaRf@3dU72F%dhF7fMSl}ZADT%(_ zJ9p(reViyvauw|E7;s8RCa+YKm=I-SL0~w6q@INLVmvCT)E=&3L`KFkX%47EWfCK< zqZi7f3Xv6m86FiP^?_^1dt}hJdk=}M+^$)GA8MCWDuW4lg$zW3 z{M~k&(TR@xiE61hkDYZH_X~!U%6dA%D2m&zGn)!B^Taj!V%4Fb5`&Sq(>l_nAjAA8 z$Eo|DLsl?1S}K|d`QLt63Sw{)SKd{!c}E#8X+%F)Ix*swvS!Ap9mDnv3Plm!WL- zC>4vr2T5ffSU%Ty7W9f2~P75xH-PWGhoFosOz6jH1%j@DPpIU!-th`uJ)SM#o z`IDcSdaVr$LsKzFNLaLfP7&}nxhhIXsL{|Fe;Ya>N5n!`Gj@q`Xa=8{v13YIIaD)t zYy>iR`afCt)gxn^)w~+zi?aUEhsNI>rppYNF|S6>G!Mxe@x^~XEQaEzVoWToqXd&! zUR6}pG)Ki!aWtqt=c8hr*^1kGddXp@uCS?qh>78>l^m{>;3Nl=2nfP;3f6`*#>?Pm|tofTN&ZUcG%fv$J#m>N~)fU3Wo5s zQSS<1uGKh6Z_23m-N1a*!KJ0+>%i>MxU_Vz&i??Ir!-E*FL~6PL3iLNb_rn8_)*)R z0L)~KV>;5}R}aitL-3mf|K|a-RpS`VG=8@M^Q9s9QIFpZ%zYX+So|IaX8#cUnBM;Z z=B0z+$6b%*s!J2*-~TJ4z!CeAkl>%AKxD#XJb$ZE;2RMZRmAW{f$lgxbri@^g&GC2 z&#wYuZE_9!oAFWLTu_G^1v28%QJ@Nu0zMB$K>nVS$5lEvhefQsvly$dPa|FUR zmLrhIS$$vz8-Z}0v5sA57{b#=Aj^T-u5r|$xs(yeyMVdP!KL-czXl9;H;Z94Ng7FU z1oC}gex-3Le#s*c4(&^IPdkktTbtv7snEE=diZs~EF6O0B=9>Im~M?@G}F@i5n#SJ z1V4^I?gD0y#tjy~hk*Ir5d4^4u1CIj5d6lVUYz{@U$j2AYQu+30-bzu$Ih*zrpkfJ_8N8R;N7 z6J+$AvJ8|k0GVOf1ZDuja~{eV$|ge)43>cs1|U~^n1fsfI;a82Eg@%?11CRn1r5KShXNfRv0K%p9hBfUQbGho}de@z| z>d}baxxY4&g!;RzjU+`R+{Bl(9+EWvXy2GV{1`Q(vZ~e@euU@v^ zpDQ5$TmeB}{GTfz@pJtDTmkuq8h~)J^`8R}y^_JMj%zq_dR13I%*|Ti2xK?|khwpd z@COyU*KPp94u9NmK19vRv(xL&vD3xwZ+Y$Zq5X3OM0H{RxdKAzd~F6GFa6=FM_=gx z#Oy=+=L(2g0fEBf2*m7Raz98IAAuyH{w^bsq=*cA1fq^srLBNe&eSU!YOrBeK>T$P zy8=>MIm@|8Y;y21j6mLsZIm~#I>03D!TL`-a!NNTe%P&n_f`Lg3mwS0H1m^7;$9zs(L3$4` zw>!9`^1TB7zXS{}`4Gc?RvNzrz^u@?wDO$@|E(IMIHvRK0q)&H@VgaEJ_5`cy30%z z66UiB0RJh^Es<_@S~@lXcdf>zrGx#`USNKpaf8X}lfXPT1iy#D??qsK%8l$WVLB4( ztH67M*rwopl-Q=>O-?GF z%u;P6PsiW~b|mUT#RX!;?ge7JKa4rqjHgWaaa$i_qR!FrKiCMTV_>(O`oM`I(mOvJ zN{D8rWQ6c69u+ON12l%&>tXj!7$Szf`jFp1cWDpqV(NQPF&^kH5rOP$D#pP=9VX<_ z95KANMB+Ce9M#UlC9o+ORWX@>-zp}j!N#mt*ZeJp4flpEdG={o)Ix>Wm?3lUl*zpm zi(o5~BZ~`!Hk^By&KAEcG`1f_?v-mQy()!FZO`_aAU{$P+JBh*8|>bx^MxI=Rwb4a zqmnogHm+@z$yIlhxU!%IZ-U?5*iRnvEW|A^{cEvxoWb}q)F1d*kvjnr`_4}!SDD5@V0%-);7 zL{B!sdT!s+;+^}t$MnrF?VUfacmDXk`DMNH%j>VMD9Mk7!wG%!$IqT$-u1eHd_{@& z){$8$m+9Sv8}@LP6;V_XysxC^KqmiW-`@TwsKVFaDU&0#DrYGi>xI^e_iC}>6a+i_O$#?pbt@ni11xBu|I4B}BZ&^%u6c9|$Xb)|!y{6_{C z^gXjIOfpV(7Wd7cGUm>pze^{eM{;3_&4oEV+lvF-r`g1_xlVd^?%ICpm^+&W`s>&Ed*2;XYwv~I{jiQDvcS|E5y4zHY5Q{d((bi}pnfW`~^- zJR3gi%fGqq9oiQ$zAuj13Nln&CSKMiyD#6~b57|o1u~LxrT0j|jMv;gdhYly8@}j@IWOrh>KCa^CyapN~#Esk;zJ z=F_B~?w@QqU!*znq^`1dX^N_Y5<`7%j~#Y(>mzIRS9U*liP|GxvAC+PekMpTs#6b2 zeHLvKWk*rycB9YPxf73FJpVo}&G~$A=6*RC!QehFaIR+D425nV3OTFX3xdyv6v;7X z#)I-^&+31@c*Q4dZhS-g!WA3LXJ_7py*5AXWm1BY(mKWg<6JzvnXRgxccU@wisEji z;(*Cdspf-pRU%z9f{~PR*I0Q-aiwJ}s0Eoyyfb*t`Q$ggYE$umPQ_SBMN5l(-w`Mp zNtYu(Y$>e#Ja7KsyI?~n zR-ICIQ_2fg3NjPv2=m_U|MhgB`C^PMO*m%iV(DU?^*O5>-dxTcVi#m?#hZ2U9c7oU zu<0^qaZl8Fh#R=p0wgAs4gH(lF%=dG-3yv9ZZSzdN5}A_SPWUy{TQAU(+TB*nTI#| zU9tLqF+9k?MsvC5T&`o-$q(Hrr&w4MK(}GFjC%X+<*~4s!vz_3kC+>0*UrI0t_kaX zI;@Gp8P35MG==sNLCc1=4IA+FMgEGH@+8n~=(oIi$)6_1Laz`Edrl1Vqn|lxiw*rQ z9acpc`V(R3QWlOpPxivX4_t-9^!yb*8d#rm;bckG!Z|_1>h^?hx#BZ)>eFLB7G#P+ zghTQ->-d4pgb!UdWJ8u*q~W1-|BI;nEKB#gT+VzB)%`4`e6xj)SXNOVynF>;BWsZF zBI4k?GqVN0ix#O<`z;H?h=OXbENn_9%T0z3Cw&26c*mgQ6uEscr_A%x3FCW_P^LZQ@)?ioCSvu;CWIv zH|*gjtte2ho{IRd(|VKt(!#wSj_=Vp6K;HlopTDD_2N)@uFRJn7{GLCekNyTx@T}0 z-F@16He34tJ#|(5gSHG z#xXK!#F-75d>ga#bhz|gP;z&W3xXZL+VR4FobZ!LKPvdq3r!{E-32=y%yi^dUf)!b zhqVy2;{3>-B_$(zzFUkRrQc?3@sOU^Pgc_-v-b>| zp@?H)ej;X<@eP>=J4T#0(2Ti0%suPr3zoqN@<*;P z(^?l^h}?Z(K;|Yn&N~iIkwk#K(jqyp#D1=l0?IHALPT+?Uh*KbDwTFxWjOoArr)|# z4=dfCA_FYQu=din{fjHVW_u^>6Vs^M|7n}Rml*a=Xwa3?h7@=F#)@Y9MlU`1ovYPt z;BM#)p&-M$&iXy+y`N~cp>r0VrZ6yJbtnSfq_nhju`8l!2E!sZM#b<$<|qCu3X&Ka zJr>fx*`F%Nusj(1zvMZvLp*5DK6P;V|jX zmEmVYYd+t)X1#43Ok=1%+l!VXtwCsLaBd}PP~SPnS0tq8WtfEDESKR^JP@{msXfA! z?&HQy8`~@=>42hvOa6p1N=`W)biZ{*Rh4%&uW9A#(6YJ4v~qP-b^7oyTe;JMPoR~% z2esbFLQ*StwV7%$C6@4|z4yV5H?3AsTwz$Z!&XVpC6GQH55I_Zr^ZpvWgmkxvqT)n z!;b^=yv9)yaw+>`UIyk^>LwVC%egaEq*KL}15@SWV*6C6gMQ^3491djUmFlhLbsO4c;)X3); zKi0-K0n?#zY5B~2$piCt9~Vmp_4|8(`HaR<|JZQxLmNi_{{VBJhfDq<-@_VX{K~!| zXP%sN@_Ql)=gdqIm&LOmxN#I@7-~Ik1+@f*Jzog#XKG6RK znAM!lgyFxWdc+B`AHnf(-EvVsC+!ES1AR6yT^h&wmXwZv0sTY3)NuL}hS5w4m-Y7p zz}&BKVf{_WzuyCM(r9u^&%ckt?e)Mss&Rvb+kjrj2KGE)1`GGSzEM#&Y61B5 z15?Ew9t_iw#_#pOEOu~7{N};`a$r8_;L`Zr4$K`6j{M@Ii@O=E{d^7oON#Dw&c(C8 zhmVJutp`{JJ`W3cH(ug=UeWowViD}US7*nguc|Hh23_=ni_AN<6JsfC>N|(?g?0ws zbH!GLcMgxbH@*+2vmeN7PvgJ2G;O;0C_ zjk(6QQ(e)mhEiF${a6r{XccRi3U($rUyBArEEfTSb;RJROhaLj)EKKw&J2 zRBmkNXvphOzB#uT{?rxX)I>$H+FdKQVSdT+t?;BaFDapA_9>x-MKXo|A&4XRpUs`O zjmmsfwd`QOoG#cw^+^RR*N`(Cb8I83)ByNi?fBIpmy%+K3Zvv zi?hYnvgCPw!P07vQqi(4NYbmNJ+^|E(jFg%Z55ufU^m`F>ya{v_=W0YuIj_CqHv#v zZ&|X6suYUroA9Wc>{r89B!ae3XcQ?nt!XA&*9?wgxdx9CtxLo<4eyJ^R)aTIJK!pD zlPHIc!9jn^)0Kb{B>|(1BIUNASI{1)?|p8ND6*anuRS;)K05J~1#9tE?Lil8szl!j z+tB5xwhkUld%%{)Z4VAb3tS;QD)7EsY%Hn{u_YAHE2*NTsD-F`uTn9oiuV?Y=Na>CW23Si&nqpaYlR1kiSbm*dYjnrRZu9dz50uw zQrX$VR!L#kS5oNi9ExD#EU4;F*h$b~UEA~1^*>{06~>*1WUE|| zc^}@CoBw#^k;OW(_*IC9ChZ%j?5Pm5IRCLfm~Ws~)y+az<~UHTwKTb};dmx)m35BfhbzAx5@f(+$G$qa$U*GQ=q>0dl$ubGf5 zAARnt*4J3=YjnuTd;=8(hVGO*HKi?!zhu7id&|dsCzTjK&I~v0d#g)z=)|aWT&gKS zP!0SGcS4`er4L+y2bkz^J?}nF;=_iK8tqdrZ~Aw&--|LLRl1zu9^U(5ntCv5rLk>}x5%O_MhcPI~fT>93@yAzOt7FI= zawNkDMs~>YKCAMO;p>-Ze6WP|0U^XCNdWm>C6pDh0M z@sd-Fb2Y+Z$i%39e$}XP498Nc>hUwA&}Q}&hIP5V26dTvsC>C;9}lW8nL2c&y#{S1 zjbJ40H8m>jisGjIMBoZCAH|z#|J9LCBS9J1X!hx}tDSAGY@7twf{aP~s%3w9?8Gqb zGZ7ZkPK-+XOiVQ}?G6R$qEQsu%)SJh_F1}~DvX+jzV)`(*9?i_HtG3&c3k;;)@#CVAFQUH3LKQvkl`uWzi*6JTPj9 zoV$WK2~@knyDi`M-)XzwC^`)N-KYHQ3Cnq==4^MrnQwmtu~baZmn(#4U5j#b~x*I;Qb1R%G;|46Q!s1h`AuY05&CIHKAo*G-D>jp(_j0O}n zh}PW{JQ()PlH`y5fbnp=fB+bZcG`OW4ZwU`<0z*|>-oK){|=bV94NpHCimY3=77e9 za-WcY-l9jEiF;k1?*=6darpF%W&@6&7m#i zdn<5-k}n)Usuj2f*wp$xh9sb|R4~W^jTjDP)IMYmyUJv4oYO01K|9`AJVi2H|3>Q2F9-6$hqvA|A^KKjeal=sGz49LmZUmwnVCv7{x;Pw5-mQYd zYn@qi>s#_n&u�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%0DjB*XP$SpFX(As{Fm^|9+XilPFR%8 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 literal 0 HcmV?d00001 From 1175190b15a25c1e0f1c9cee71b297ecbc275fa1 Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Wed, 25 Jul 2018 15:49:34 +0100 Subject: [PATCH 0077/1000] Detect DepthFormat is supported and fallback if not --- src/CxbxKrnl/EmuD3D8.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/CxbxKrnl/EmuD3D8.cpp b/src/CxbxKrnl/EmuD3D8.cpp index a26f541c6..e5a3de309 100644 --- a/src/CxbxKrnl/EmuD3D8.cpp +++ b/src/CxbxKrnl/EmuD3D8.cpp @@ -2063,8 +2063,23 @@ static DWORD WINAPI EmuCreateDeviceProxy(LPVOID) // Direct3D8: (WARN) :Device that was created without D3DCREATE_MULTITHREADED is being used by a thread other than the creation thread. g_EmuCDPD.BehaviorFlags |= D3DCREATE_MULTITHREADED; + // If a depth stencil format is set, enable AutoDepthStencil + if (g_EmuCDPD.HostPresentationParameters.AutoDepthStencilFormat != 0) { + g_EmuCDPD.HostPresentationParameters.EnableAutoDepthStencil = TRUE; + } + + // If the depth stencil format is unsupported by the host, use a sensible fallback + if (g_pDirect3D->CheckDeviceFormat( + D3DADAPTER_DEFAULT, + XTL::D3DDEVTYPE_HAL, + g_EmuCDPD.HostPresentationParameters.BackBufferFormat, + D3DUSAGE_DEPTHSTENCIL, + XTL::D3DRTYPE_SURFACE, + g_EmuCDPD.HostPresentationParameters.AutoDepthStencilFormat) != D3D_OK) { + g_EmuCDPD.HostPresentationParameters.AutoDepthStencilFormat = XTL::D3DFMT_D24S8; + } + // For some reason, D3DFMT_D16_LOCKABLE as the AudoDepthStencil causes CreateDevice to fail... - g_EmuCDPD.HostPresentationParameters.EnableAutoDepthStencil = TRUE; if (g_EmuCDPD.HostPresentationParameters.AutoDepthStencilFormat == XTL::D3DFMT_D16_LOCKABLE) { g_EmuCDPD.HostPresentationParameters.AutoDepthStencilFormat = XTL::D3DFMT_D16; } From e11c4f3d70bdd6a9cd9175a88b6684e0c9d1d429 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Mon, 25 Jun 2018 18:31:40 +0200 Subject: [PATCH 0078/1000] LLE : Draw Xbox framebuffer instead of blitting it (Unfinished) --- src/devices/video/nv2a.cpp | 252 ++++++++++++++++++++++++++++--------- 1 file changed, 191 insertions(+), 61 deletions(-) diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index 501ca33b9..49107e6c9 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -428,51 +428,51 @@ GLuint Get_YUV_to_RGB_shader_program() // and https://gist.github.com/roxlu/9329339 static const char *OPENGL_SHADER_YUV[2] = { /* vertex shader */ - "#version 330 core\n" - "layout(location = 0) in vec3 vertexPosition_modelspace;\n" - "layout(location = 1) in vec2 vertexUV;\n" - "out vec2 v_tex_coord;\n" - "void main() {\n" - " gl_Position = vec4(vertexPosition_modelspace,1);\n" - " v_tex_coord = vertexUV;\n" - "}\n", + "#version 330 core \n" + "layout(location = 0) in vec3 vertexPosition_modelspace; \n" + "layout(location = 1) in vec2 vertexUV; \n" + "out vec2 v_tex_coord; \n" + "void main() { \n" + " gl_Position = vec4(vertexPosition_modelspace,1); \n" + " v_tex_coord = vertexUV; \n" + "} \n", /* fragment shader */ - "#version 330 core\n" - "in vec2 v_tex_coord;\n" - "uniform sampler2D yuyv_tex;\n" - "out vec4 out_rgba;\n" - "// YUV offset \n" - "const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\n" - "// RGB coefficients \n" - "const vec3 Rcoeff = vec3(1.164, 0.000, 1.596);\n" - "const vec3 Gcoeff = vec3(1.164, -0.391, -0.813);\n" - "const vec3 Bcoeff = vec3(1.164, 2.018, 0.000);\n" - "void main(void)\n" - "{\n" - " // Fetch 4:2:2 YUYV macropixel \n" - " vec4 yuyv = texture2D(yuyv_tex, v_tex_coord);\n" - " // Now r-g-b-a is actually y1-u-y2-v \n" - " float u = yuyv.g;\n" - " float v = yuyv.a;\n" - " vec3 yuv;\n" - " // Convert texture coordinate into texture x position \n" - " ivec2 texture_size = textureSize(yuyv_tex, 0);\n" - " float texture_x = v_tex_coord.x * texture_size.x;\n" - " // Depending on fragment x position choose y1-u-v or y2-u-v \n" - " if (mod(texture_x, 1.0) >= 0.5) { // left half \n" - " float y1 = yuyv.r;\n" - " yuv = vec3(y1, u, v);\n" - " } else { // right half \n" - " float y2 = yuyv.b;\n" - " yuv = vec3(y2, u, v);\n" - " }\n" - " // Do the color transform \n" - " yuv += offset;\n" - " out_rgba.r = dot(yuv, Rcoeff);\n" - " out_rgba.g = dot(yuv, Gcoeff);\n" - " out_rgba.b = dot(yuv, Bcoeff);\n" - " out_rgba.a = 1.0;\n" - "}\n" + "#version 330 core \n" + "in vec2 v_tex_coord; \n" + "uniform sampler2D yuyv_tex; \n" + "out vec4 out_rgba; \n" + "// YUV offset \n" + "const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814); \n" + "// RGB coefficients \n" + "const vec3 Rcoeff = vec3(1.164, 0.000, 1.596); \n" + "const vec3 Gcoeff = vec3(1.164, -0.391, -0.813); \n" + "const vec3 Bcoeff = vec3(1.164, 2.018, 0.000); \n" + "void main(void) \n" + "{ \n" + " // Fetch 4:2:2 YUYV macropixel \n" + " vec4 yuyv = texture2D(yuyv_tex, v_tex_coord); \n" + " // Now r-g-b-a is actually y1-u-y2-v \n" + " float u = yuyv.g; \n" + " float v = yuyv.a; \n" + " vec3 yuv; \n" + " // Convert texture coordinate into texture x position \n" + " ivec2 texture_size = textureSize(yuyv_tex, 0); \n" + " float texture_x = v_tex_coord.x * texture_size.x; \n" + " // Depending on fragment x position choose y1-u-v or y2-u-v \n" + " if (mod(texture_x, 1.0) >= 0.5) { // left half \n" + " float y1 = yuyv.r; \n" + " yuv = vec3(y1, u, v); \n" + " } else { // right half \n" + " float y2 = yuyv.b; \n" + " yuv = vec3(y2, u, v); \n" + " } \n" + " // Do the color transform \n" + " yuv += offset; \n" + " out_rgba.r = dot(yuv, Rcoeff); \n" + " out_rgba.g = dot(yuv, Gcoeff); \n" + " out_rgba.b = dot(yuv, Bcoeff); \n" + " out_rgba.a = 1.0; \n" + "} \n" }; // Bind shader @@ -512,23 +512,126 @@ GLuint Get_YUV_to_RGB_shader_program() return shader_program_yuv_to_rgb; } -extern void UpdateFPSCounter(); -void NV2ADevice::UpdateHostDisplay(NV2AState *d) +#ifdef DRAW_FRAMEBUFFER // Shaders don't compile yet + +GLuint m_vao, m_framebuffer_vertex_buffer_object, m_framebuffer_element_buffer_object, m_tex = -1; +GLuint m_framebuffer_shader_program = -1; + +GLint m_framebuffer_attribute_location_position = -1; +GLint m_framebuffer_attribute_location_texture = -1; + +/* + * Initialize Shaders + */ +void InitShaders(void) { - if (!d->pgraph.opengl_enabled) { - return; - } + static const char *gl_framebuffer_shader_src[2] = { + /* vertex shader */ + "#version 330 core \n" + "layout(location = 0) in vec2 in_Position; \n" + "layout(location = 1) in vec2 in_Texcoord; \n" + "out vec2 Texcoord; \n" + "void main() \n" + "{ \n" + " Texcoord = in_Texcoord; \n" + " gl_Position = vec4(in_Position, 0.0, 1.0); \n" + "} \n", + /* fragment shader */ + "#version 330 core \n" + "in vec2 Texcoord; \n" + "out vec4 out_Color; \n" + "uniform sampler2D tex; \n" + "void main() \n" + "{ \n" + " out_Color = texture2D(tex, Texcoord); \n" + "} \n" + }; - lockGL(&d->pgraph); + glGetError(); // reset GL_CHECK +#if 0 + glGenVertexArrays(1, &m_vao); + glBindVertexArray(m_vao); +#endif - NV2A_GL_DGROUP_BEGIN("VGA Frame"); + m_framebuffer_shader_program = glCreateProgram(); + GL_CHECK(); + // Compile vertex shader + GLuint vertex_shader = create_gl_shader(GL_VERTEX_SHADER, gl_framebuffer_shader_src[0], "Framebuffer vertex shader"); + // Compile fragment shader + GLuint fragment_shader = create_gl_shader(GL_FRAGMENT_SHADER, gl_framebuffer_shader_src[1], "Framebuffer fragment shader"); + + // Link vertex and fragment shaders + glAttachShader(m_framebuffer_shader_program, vertex_shader); + glAttachShader(m_framebuffer_shader_program, fragment_shader); + glBindFragDataLocation(m_framebuffer_shader_program, 0, "out_Color"); + glLinkProgram(m_framebuffer_shader_program); + + m_framebuffer_attribute_location_position = glGetAttribLocation(m_framebuffer_shader_program, "in_Position"); + m_framebuffer_attribute_location_texture = glGetAttribLocation(m_framebuffer_shader_program, "in_Texcoord"); +} + +/* + * Initialize Geometry + */ +void InitGeometry() +{ + static const GLfloat verts[6][4] = { + // x y s t + { -1.0f, -1.0f, 0.0f, 1.0f }, // BL + { -1.0f, 1.0f, 0.0f, 0.0f }, // TL + { 1.0f, 1.0f, 1.0f, 0.0f }, // TR + { 1.0f, -1.0f, 1.0f, 1.0f }, // BR + }; + + static const GLint indicies[] = { + 0, 1, 2, 0, 2, 3 + }; + + // Populate vertex buffer + glGenBuffers(1, &m_framebuffer_vertex_buffer_object); + glBindBuffer(GL_ARRAY_BUFFER, m_framebuffer_vertex_buffer_object); + glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW); + + // Populate element buffer + glGenBuffers(1, &m_framebuffer_element_buffer_object); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_framebuffer_element_buffer_object); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indicies), indicies, GL_STATIC_DRAW); +} + +void BindGeometry() +{ + glUseProgram(m_framebuffer_shader_program); + + glBindBuffer(GL_ARRAY_BUFFER, m_framebuffer_vertex_buffer_object); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_framebuffer_element_buffer_object); + + // Bind vertex position attribute + glVertexAttribPointer(m_framebuffer_attribute_location_position, 2, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), (void*)0); + glEnableVertexAttribArray(m_framebuffer_attribute_location_position); + + // Bind vertex texture coordinate attribute + glVertexAttribPointer(m_framebuffer_attribute_location_texture, 2, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), (void*)(2*sizeof(GLfloat))); + glEnableVertexAttribArray(m_framebuffer_attribute_location_texture); +} + +void cxbx_gl_initialize() +{ + InitShaders(); + InitGeometry(); +} + +#endif // DRAW_FRAMEBUFFER + +static GLsizei frame_width = 640; +static GLsizei frame_height = 480; + +void cxbx_gl_update_framebuffer(NV2AState *d) +{ static ULONG PreviousAvDisplayModeFormat = 0; static GLenum gl_frame_internal_format = GL_RGBA; - static GLenum gl_frame_format = GL_RGBA; - static GLenum gl_frame_type = GL_UNSIGNED_INT_8_8_8_8; - static GLsizei frame_width = 640; - static GLsizei frame_height = 480; + static GLenum gl_frame_format = GL_BGRA; // Was GL_RGBA; + static GLenum gl_frame_type = GL_UNSIGNED_INT_8_8_8_8_REV; // Was GL_UNSIGNED_INT_8_8_8_8; static GLuint frame_texture = -1; // Convert AV Format to OpenGl format details & destroy the texture if format changed.. @@ -578,6 +681,11 @@ void NV2ADevice::UpdateHostDisplay(NV2AState *d) GL_CHECK(); #endif +#ifdef DRAW_FRAMEBUFFER // Shaders don't compile yet + // Draw frame texture to an internal frame buffer + BindGeometry(); + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, NULL); +#else // Copy frame texture to an internal frame buffer glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer); glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, frame_texture, 0); @@ -586,9 +694,14 @@ void NV2ADevice::UpdateHostDisplay(NV2AState *d) // TODO: Use window size/actual framebuffer size rather than hard coding 640x480 // Note : dstY0 and dstY1 are swapped so the screen doesn't appear upside down glBlitFramebuffer(0, 0, frame_width, frame_height, 0, 480, 640, 0, GL_COLOR_BUFFER_BIT, filter); - // Detach internal framebuffer - glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); +#endif + // Restore xbox framebuffer + glBindFramebuffer(GL_FRAMEBUFFER, d->pgraph.gl_framebuffer); +} + +void cxbx_gl_render_overlays(NV2AState *d) +{ // NV2A supports 2 video overlays for (int v = 0; v < 2; v++) { uint32_t video_buffer_use = (v == 0) ? NV_PVIDEO_BUFFER_0_USE : NV_PVIDEO_BUFFER_1_USE; @@ -760,14 +873,28 @@ void NV2ADevice::UpdateHostDisplay(NV2AState *d) glUseProgram(0); } +} + +extern void UpdateFPSCounter(); +void NV2ADevice::UpdateHostDisplay(NV2AState *d) +{ + if (!d->pgraph.opengl_enabled) { + return; + } + + lockGL(&d->pgraph); + + NV2A_GL_DGROUP_BEGIN("VGA Frame"); + + cxbx_gl_update_framebuffer(d); + + cxbx_gl_render_overlays(d); // We currently don't double buffer, so no need to call swap... glo_swap(d->pgraph.gl_context); - // Restore previous framebuffer - glBindFramebuffer(GL_FRAMEBUFFER, d->pgraph.gl_framebuffer); - NV2A_GL_DGROUP_END(); + unlockGL(&d->pgraph); UpdateFPSCounter(); @@ -884,7 +1011,10 @@ void NV2ADevice::Init() pgraph_init(m_nv2a_state); // Only spawn VBlank thread when LLE is enabled - if (bLLE_GPU) { + if (d->pgraph.opengl_enabled) { +#ifdef DRAW_FRAMEBUFFER + cxbx_gl_initialize(); +#endif vblank_thread = std::thread(nv2a_vblank_thread, d); } From 0973cd18bc418f8d914cd982d118044ae736e240 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Fri, 29 Jun 2018 17:26:34 +0200 Subject: [PATCH 0079/1000] LLE : More work on Xbox framebuffer drawing (still doesn't work AND broke overlays) --- src/devices/video/nv2a.cpp | 516 ++++++++++++++++++----------- src/devices/video/nv2a_shaders.cpp | 2 +- 2 files changed, 331 insertions(+), 187 deletions(-) diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index 49107e6c9..5f1b32ba2 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -390,12 +390,24 @@ void AvGetFormatSize(ULONG mode, int* width, int* height) *height = 480; } +void _check_gl_reset() +{ + while (true) { + GLenum err = glGetError(); + if (err == GL_NO_ERROR) + return; + if (err == 0) + return; + } +} + void _check_gl_error(const char *file, int line) { - GLenum err; - while ((err = glGetError()) != GL_NO_ERROR) { + while (true) { + GLenum err = glGetError(); char *error; switch (err) { + case GL_NO_ERROR: return; case GL_INVALID_ENUM: error = "GL_INVALID_ENUM"; break; case GL_INVALID_VALUE: error = "GL_INVALID_VALUE"; break; case GL_INVALID_OPERATION: error = "GL_INVALID_OPERATION"; break; @@ -405,7 +417,7 @@ void _check_gl_error(const char *file, int line) case GL_INVALID_FRAMEBUFFER_OPERATION: error = "GL_INVALID_FRAMEBUFFER_OPERATION"; break; //case GL_INVALID_FRAMEBUFFER_OPERATION_EXT: error = "GL_INVALID_FRAMEBUFFER_OPERATION_EXT"; break; case GL_CONTEXT_LOST: error = "GL_CONTEXT_LOST"; break; - default: error = nullptr; + default: error = "(unknown)"; break; } printf("OpenGL error 0x%.8X %s\n", err, error); @@ -413,9 +425,25 @@ void _check_gl_error(const char *file, int line) } } +#define GL_RESET() _check_gl_reset #define GL_CHECK() _check_gl_error(__FILE__,__LINE__) -static GLint yuyv_tex_loc = -1; +enum { + SAMP_TEXCOORD = 5, +}; + +enum { + FRAG_COLOR = 0, +}; + +enum { + ATTR_POSITION = 0, + ATTR_TEXCOORD = 4, +}; + +static GLint m_overlay_uniform_location_texture = -1; +static GLint m_overlay_attribute_location_position = -1; +static GLint m_overlay_attribute_location_texture = -1; GLuint Get_YUV_to_RGB_shader_program() { @@ -429,18 +457,34 @@ GLuint Get_YUV_to_RGB_shader_program() static const char *OPENGL_SHADER_YUV[2] = { /* vertex shader */ "#version 330 core \n" - "layout(location = 0) in vec3 vertexPosition_modelspace; \n" - "layout(location = 1) in vec2 vertexUV; \n" - "out vec2 v_tex_coord; \n" - "void main() { \n" - " gl_Position = vec4(vertexPosition_modelspace,1); \n" - " v_tex_coord = vertexUV; \n" - "} \n", - /* fragment shader */ + "#define ATTR_POSITION 0 \n" + "#define ATTR_TEXCOORD 4 \n" + "precision highp float; \n" + "precision highp int; \n" + "layout(std140, column_major) uniform; \n" + "layout(location = ATTR_POSITION) in vec2 Position; \n" + "layout(location = ATTR_TEXCOORD) in vec2 Texcoord; \n" + "out block \n" + "{ \n" + " vec2 Texcoord; \n" + "} Out; \n" + "void main() \n" + "{ \n" + " Out.Texcoord = Texcoord; \n" + " gl_Position = vec4(Position, 0.0, 1.0); \n" + "} \n" + , /* fragment shader */ "#version 330 core \n" - "in vec2 v_tex_coord; \n" - "uniform sampler2D yuyv_tex; \n" - "out vec4 out_rgba; \n" + "#define FRAG_COLOR 0 \n" + "precision highp float; \n" + "precision highp int; \n" + "layout(std140, column_major) uniform; \n" + "uniform sampler2D tex_yuyv; \n" + "in block \n" + "{ \n" + " vec2 Texcoord; \n" + "} In; \n" + "layout(location = FRAG_COLOR, index = 0) out vec4 Color; \n" "// YUV offset \n" "const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814); \n" "// RGB coefficients \n" @@ -450,16 +494,16 @@ GLuint Get_YUV_to_RGB_shader_program() "void main(void) \n" "{ \n" " // Fetch 4:2:2 YUYV macropixel \n" - " vec4 yuyv = texture2D(yuyv_tex, v_tex_coord); \n" + " vec4 yuyv = texture2D(tex_yuyv, In.Texcoord); \n" " // Now r-g-b-a is actually y1-u-y2-v \n" " float u = yuyv.g; \n" " float v = yuyv.a; \n" " vec3 yuv; \n" " // Convert texture coordinate into texture x position \n" - " ivec2 texture_size = textureSize(yuyv_tex, 0); \n" - " float texture_x = v_tex_coord.x * texture_size.x; \n" + " ivec2 texture_size = textureSize(tex_yuyv, 0); \n" + " float texture_x = In.Texcoord.x * texture_size.x; \n" " // Depending on fragment x position choose y1-u-v or y2-u-v \n" - " if (mod(texture_x, 1.0) >= 0.5) { // left half \n" + " if (mod(texture_x, 1.0) < 0.5) { // left half \n" " float y1 = yuyv.r; \n" " yuv = vec3(y1, u, v); \n" " } else { // right half \n" @@ -468,57 +512,63 @@ GLuint Get_YUV_to_RGB_shader_program() " } \n" " // Do the color transform \n" " yuv += offset; \n" - " out_rgba.r = dot(yuv, Rcoeff); \n" - " out_rgba.g = dot(yuv, Gcoeff); \n" - " out_rgba.b = dot(yuv, Bcoeff); \n" - " out_rgba.a = 1.0; \n" + " Color.r = dot(yuv, Rcoeff); \n" + " Color.g = dot(yuv, Gcoeff); \n" + " Color.b = dot(yuv, Bcoeff); \n" + " Color.a = 1.0; \n" "} \n" }; // Bind shader - static GLuint shader_program_yuv_to_rgb = -1; - if (shader_program_yuv_to_rgb == -1) { - shader_program_yuv_to_rgb = glCreateProgram(); // glCreateProgramObjectARB() + static GLuint shader_program_name_yuv_to_rgb = -1; + if (shader_program_name_yuv_to_rgb == -1) { + GLuint vertex_shader_name = create_gl_shader(GL_VERTEX_SHADER, OPENGL_SHADER_YUV[0], "YUV>RGB Vertex shader"); + GL_CHECK(); + GLuint fragment_shader_name = create_gl_shader(GL_FRAGMENT_SHADER, OPENGL_SHADER_YUV[1], "YUV>RGB Fragment shader"); GL_CHECK(); - GLuint vertex_shader = create_gl_shader(GL_VERTEX_SHADER, OPENGL_SHADER_YUV[0], "YUV>RGB Vertex shader"); + shader_program_name_yuv_to_rgb = glCreateProgram(); GL_CHECK(); - GLuint fragment_shader = create_gl_shader(GL_FRAGMENT_SHADER, OPENGL_SHADER_YUV[1], "YUV>RGB Fragment shader"); + glAttachShader(shader_program_name_yuv_to_rgb, vertex_shader_name); GL_CHECK(); - glAttachShader(shader_program_yuv_to_rgb, vertex_shader); // glAttachObjectARB + glAttachShader(shader_program_name_yuv_to_rgb, fragment_shader_name); GL_CHECK(); - glAttachShader(shader_program_yuv_to_rgb, fragment_shader); // glAttachObjectARB + glBindAttribLocation(shader_program_name_yuv_to_rgb, ATTR_POSITION, "Position"); GL_CHECK(); - - glLinkProgram(shader_program_yuv_to_rgb); + glBindAttribLocation(shader_program_name_yuv_to_rgb, ATTR_TEXCOORD, "Texcoord"); + GL_CHECK(); + glBindFragDataLocation(shader_program_name_yuv_to_rgb, FRAG_COLOR, "Color"); + GL_CHECK(); + glLinkProgram(shader_program_name_yuv_to_rgb); GL_CHECK(); /* Check it linked */ GLint linked = 0; - glGetProgramiv(shader_program_yuv_to_rgb, GL_LINK_STATUS, &linked); + glGetProgramiv(shader_program_name_yuv_to_rgb, GL_LINK_STATUS, &linked); GL_CHECK(); if (!linked) { GLchar log[2048]; - glGetProgramInfoLog(shader_program_yuv_to_rgb, 2048, NULL, log); + glGetProgramInfoLog(shader_program_name_yuv_to_rgb, 2048, NULL, log); fprintf(stderr, "nv2a: shader linking failed: %s\n", log); abort(); } - yuyv_tex_loc = glGetUniformLocation(shader_program_yuv_to_rgb, "yuyv_tex"); + m_overlay_uniform_location_texture = glGetUniformLocation(shader_program_name_yuv_to_rgb, "tex_yuyv"); GL_CHECK(); - assert(yuyv_tex_loc >= 0); + assert(m_overlay_uniform_location_texture >= 0); } - return shader_program_yuv_to_rgb; + return shader_program_name_yuv_to_rgb; } -#ifdef DRAW_FRAMEBUFFER // Shaders don't compile yet +//#define DRAW_FRAMEBUFFER // Doesn't show anything yet + +#ifdef DRAW_FRAMEBUFFER -GLuint m_vao, m_framebuffer_vertex_buffer_object, m_framebuffer_element_buffer_object, m_tex = -1; GLuint m_framebuffer_shader_program = -1; - -GLint m_framebuffer_attribute_location_position = -1; -GLint m_framebuffer_attribute_location_texture = -1; +GLuint m_framebuffer_uniform_location_texture = -1; +GLuint m_framebuffer_vertex_buffer_object = -1; +GLuint m_framebuffer_vertex_array_name = -1; /* * Initialize Shaders @@ -527,56 +577,85 @@ void InitShaders(void) { static const char *gl_framebuffer_shader_src[2] = { /* vertex shader */ - "#version 330 core \n" - "layout(location = 0) in vec2 in_Position; \n" - "layout(location = 1) in vec2 in_Texcoord; \n" - "out vec2 Texcoord; \n" - "void main() \n" - "{ \n" - " Texcoord = in_Texcoord; \n" - " gl_Position = vec4(in_Position, 0.0, 1.0); \n" - "} \n", - /* fragment shader */ - "#version 330 core \n" - "in vec2 Texcoord; \n" - "out vec4 out_Color; \n" - "uniform sampler2D tex; \n" - "void main() \n" - "{ \n" - " out_Color = texture2D(tex, Texcoord); \n" - "} \n" + "#version 330 core \n" + "#define ATTR_POSITION 0 \n" + "#define ATTR_TEXCOORD 4 \n" + "precision highp float; \n" + "precision highp int; \n" + "layout(std140, column_major) uniform; \n" + "layout(location = ATTR_POSITION) in vec2 Position; \n" + "layout(location = ATTR_TEXCOORD) in vec2 Texcoord; \n" + "out block \n" + "{ \n" + " vec2 Texcoord; \n" + "} Out; \n" + "void main() \n" + "{ \n" + " Out.Texcoord = Texcoord; \n" + " gl_Position = vec4(Position, 0.0, 1.0); \n" + "} \n" + , /* fragment shader */ + "#version 330 core \n" + "#define FRAG_COLOR 0 \n" + "precision highp float; \n" + "precision highp int; \n" + "layout(std140, column_major) uniform; \n" + "uniform sampler2D tex; \n" + "in block \n" + "{ \n" + " vec2 Texcoord; \n" + "} In; \n" + "layout(location = FRAG_COLOR, index = 0) out vec4 Color; \n" + "void main() \n" + "{ \n" + " Color = texture2D(tex, In.Texcoord); \n" + "} \n" }; - glGetError(); // reset GL_CHECK + GL_RESET(); #if 0 glGenVertexArrays(1, &m_vao); - glBindVertexArray(m_vao); + glBindVertexArray(m_vao); #endif - m_framebuffer_shader_program = glCreateProgram(); - GL_CHECK(); - - // Compile vertex shader + // Compile vertex shader GLuint vertex_shader = create_gl_shader(GL_VERTEX_SHADER, gl_framebuffer_shader_src[0], "Framebuffer vertex shader"); - // Compile fragment shader + // Compile fragment shader GLuint fragment_shader = create_gl_shader(GL_FRAGMENT_SHADER, gl_framebuffer_shader_src[1], "Framebuffer fragment shader"); - // Link vertex and fragment shaders + m_framebuffer_shader_program = glCreateProgram(); + GL_CHECK(); + // Link vertex and fragment shaders glAttachShader(m_framebuffer_shader_program, vertex_shader); - glAttachShader(m_framebuffer_shader_program, fragment_shader); - glBindFragDataLocation(m_framebuffer_shader_program, 0, "out_Color"); - glLinkProgram(m_framebuffer_shader_program); + GL_CHECK(); + glAttachShader(m_framebuffer_shader_program, fragment_shader); + GL_CHECK(); + glBindAttribLocation(m_framebuffer_shader_program, ATTR_POSITION, "Position"); + GL_CHECK(); + glBindAttribLocation(m_framebuffer_shader_program, ATTR_TEXCOORD, "Texcoord"); + GL_CHECK(); + glBindFragDataLocation(m_framebuffer_shader_program, FRAG_COLOR, "Color"); + GL_CHECK(); + glLinkProgram(m_framebuffer_shader_program); + GL_CHECK(); + /* Check it linked */ + GLint linked = 0; + glGetProgramiv(m_framebuffer_shader_program, GL_LINK_STATUS, &linked); + GL_CHECK(); + if (!linked) { + GLchar log[2048]; + glGetProgramInfoLog(m_framebuffer_shader_program, 2048, NULL, log); + fprintf(stderr, "nv2a: shader linking failed: %s\n", log); + abort(); + } - m_framebuffer_attribute_location_position = glGetAttribLocation(m_framebuffer_shader_program, "in_Position"); - m_framebuffer_attribute_location_texture = glGetAttribLocation(m_framebuffer_shader_program, "in_Texcoord"); + m_framebuffer_uniform_location_texture = glGetUniformLocation(m_framebuffer_shader_program, "tex"); + GL_CHECK(); } -/* - * Initialize Geometry - */ void InitGeometry() { - static const GLfloat verts[6][4] = { + static const GLfloat vertices[6][4] = { // x y s t { -1.0f, -1.0f, 0.0f, 1.0f }, // BL { -1.0f, 1.0f, 0.0f, 0.0f }, // TL @@ -584,41 +663,65 @@ void InitGeometry() { 1.0f, -1.0f, 1.0f, 1.0f }, // BR }; - static const GLint indicies[] = { - 0, 1, 2, 0, 2, 3 - }; - // Populate vertex buffer glGenBuffers(1, &m_framebuffer_vertex_buffer_object); + GL_CHECK(); glBindBuffer(GL_ARRAY_BUFFER, m_framebuffer_vertex_buffer_object); - glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW); - - // Populate element buffer - glGenBuffers(1, &m_framebuffer_element_buffer_object); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_framebuffer_element_buffer_object); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indicies), indicies, GL_STATIC_DRAW); + GL_CHECK(); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + GL_CHECK(); + glBindBuffer(GL_ARRAY_BUFFER, 0); + GL_CHECK(); } -void BindGeometry() +void InitVertexArray() { - glUseProgram(m_framebuffer_shader_program); + glGenVertexArrays(1, &m_framebuffer_vertex_array_name); + GL_CHECK(); + glBindVertexArray(m_framebuffer_vertex_array_name); + GL_CHECK(); glBindBuffer(GL_ARRAY_BUFFER, m_framebuffer_vertex_buffer_object); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_framebuffer_element_buffer_object); + GL_CHECK(); // Bind vertex position attribute - glVertexAttribPointer(m_framebuffer_attribute_location_position, 2, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), (void*)0); - glEnableVertexAttribArray(m_framebuffer_attribute_location_position); - + // Bind vertex position attribute + glVertexAttribPointer( + /*index=*/ATTR_POSITION, + /*size=vec*/2, + /*type=*/GL_FLOAT, + /*normalized?=*/GL_FALSE, + /*stride=*/4 * sizeof(GLfloat), + /*array buffer offset=*/(void*)0 + ); + GL_CHECK(); // Bind vertex texture coordinate attribute - glVertexAttribPointer(m_framebuffer_attribute_location_texture, 2, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), (void*)(2*sizeof(GLfloat))); - glEnableVertexAttribArray(m_framebuffer_attribute_location_texture); + glVertexAttribPointer( + /*index=*/ATTR_TEXCOORD, + /*size=vec*/2, + /*type=*/GL_FLOAT, + /*normalized?=*/GL_FALSE, + /*stride=*/4 * sizeof(GLfloat), + /*array buffer offset=*/(void*)(2 * sizeof(GLfloat)) + ); + GL_CHECK(); + glEnableVertexAttribArray(ATTR_POSITION); + GL_CHECK(); + glEnableVertexAttribArray(ATTR_TEXCOORD); + GL_CHECK(); + glBindVertexArray(0); + GL_CHECK(); } -void cxbx_gl_initialize() +void cxbx_gl_initialize(NV2AState *d) { + lockGL(&d->pgraph); + InitShaders(); InitGeometry(); + InitVertexArray(); + + unlockGL(&d->pgraph); } #endif // DRAW_FRAMEBUFFER @@ -628,20 +731,20 @@ static GLsizei frame_height = 480; void cxbx_gl_update_framebuffer(NV2AState *d) { - static ULONG PreviousAvDisplayModeFormat = 0; - static GLenum gl_frame_internal_format = GL_RGBA; - static GLenum gl_frame_format = GL_BGRA; // Was GL_RGBA; - static GLenum gl_frame_type = GL_UNSIGNED_INT_8_8_8_8_REV; // Was GL_UNSIGNED_INT_8_8_8_8; - static GLuint frame_texture = -1; + static GLenum frame_gl_internal_format = GL_RGBA8; + static GLenum frame_gl_format = GL_BGRA; + static GLenum frame_gl_type = GL_UNSIGNED_INT_8_8_8_8_REV; + static GLuint frame_gl_texture = -1; // Convert AV Format to OpenGl format details & destroy the texture if format changed.. // This is required for titles that use a non ARGB framebuffer, such was Beats of Rage + static ULONG PreviousAvDisplayModeFormat = 0; if (PreviousAvDisplayModeFormat != g_AvDisplayModeFormat) { - AvDisplayModeFormatToGL(g_AvDisplayModeFormat, &gl_frame_internal_format, &gl_frame_format, &gl_frame_type); + AvDisplayModeFormatToGL(g_AvDisplayModeFormat, &frame_gl_internal_format, &frame_gl_format, &frame_gl_type); AvGetFormatSize(AvpCurrentMode, &frame_width, &frame_height); - if (frame_texture != -1) { - glDeleteTextures(1, &frame_texture); - frame_texture = -1; + if (frame_gl_texture != -1) { + glDeleteTextures(1, &frame_gl_texture); + frame_gl_texture = -1; } PreviousAvDisplayModeFormat = g_AvDisplayModeFormat; @@ -649,22 +752,32 @@ void cxbx_gl_update_framebuffer(NV2AState *d) glGetError(); // reset GL_CHECK - // If we need to create a new texture, do so, otherwise, update the existing - hwaddr frame_pixels = /*CONTIGUOUS_MEMORY_BASE=*/0x80000000 | d->pcrtc.start; // NV_PCRTC_START - if (frame_texture == -1) { - glGenTextures(1, &frame_texture); - glBindTexture(GL_TEXTURE_2D, frame_texture); - glTexImage2D(GL_TEXTURE_2D, 0, gl_frame_internal_format, frame_width, frame_height, 0, gl_frame_format, gl_frame_type, (void*)frame_pixels); - } else { - glBindTexture(GL_TEXTURE_2D, frame_texture); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, frame_width, frame_height, gl_frame_format, gl_frame_type, (void*)frame_pixels); + // If we need to create a (new) texture, do so + if (frame_gl_texture == -1) { + glGenTextures(1, &frame_gl_texture); + GL_CHECK(); + glBindTexture(GL_TEXTURE_2D, frame_gl_texture); + GL_CHECK(); + glTexImage2D(GL_TEXTURE_2D, 0, frame_gl_internal_format, frame_width, frame_height, 0, frame_gl_format, frame_gl_type, NULL); + GL_CHECK(); } - glBindTexture(GL_TEXTURE_2D, 0); + + // Update the frame texture + glBindTexture(GL_TEXTURE_2D, frame_gl_texture); + GL_CHECK(); + // TODO : Get the correct swizzle from the av format (see kelvin_color_format_map) + static const GLint swizzle_mask_RGBA[4] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA }; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_mask_RGBA); + GL_CHECK(); + + hwaddr frame_pixels = /*CONTIGUOUS_MEMORY_BASE=*/0x80000000 | d->pcrtc.start; // NV_PCRTC_START + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, frame_width, frame_height, frame_gl_format, frame_gl_type, (void*)frame_pixels); + GL_CHECK(); // If we need to create an OpenGL framebuffer, do so - static GLuint framebuffer = -1; - if (framebuffer == -1) { - glGenFramebuffers(1, &framebuffer); + static GLuint frame_gl_framebuffer = -1; + if (frame_gl_framebuffer == -1) { + glGenFramebuffers(1, &frame_gl_framebuffer); GL_CHECK(); } @@ -673,7 +786,9 @@ void cxbx_gl_update_framebuffer(NV2AState *d) // Target the actual framebuffer glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); -#ifdef DEBUG + GL_CHECK(); + +#ifdef DEBUG_NV2A_GL // If the screen turns purple, glBlitFramebuffer below failed glClearColor(1.0f, 0.0f, 1.0f, 1.0f); GL_CHECK(); @@ -681,23 +796,39 @@ void cxbx_gl_update_framebuffer(NV2AState *d) GL_CHECK(); #endif -#ifdef DRAW_FRAMEBUFFER // Shaders don't compile yet +#ifdef DRAW_FRAMEBUFFER // Draw frame texture to an internal frame buffer - BindGeometry(); - glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, NULL); + glUseProgram(m_framebuffer_shader_program); + GL_CHECK(); + glUniform1i(m_framebuffer_uniform_location_texture, SAMP_TEXCOORD); + GL_CHECK(); + glActiveTexture(GL_TEXTURE0); + GL_CHECK(); + glBindTexture(GL_TEXTURE_2D, frame_gl_texture); + GL_CHECK(); + glBindVertexArray(m_framebuffer_vertex_array_name); + GL_CHECK(); + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + GL_CHECK(); #else // Copy frame texture to an internal frame buffer - glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer); - glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, frame_texture, 0); + glBindFramebuffer(GL_READ_FRAMEBUFFER, frame_gl_framebuffer); + GL_CHECK(); + glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, frame_gl_texture, 0); + GL_CHECK(); // Blit the active internal 'read' frame buffer to the actual 'draw' framebuffer static const GLenum filter = GL_NEAREST; // TODO: Use window size/actual framebuffer size rather than hard coding 640x480 // Note : dstY0 and dstY1 are swapped so the screen doesn't appear upside down glBlitFramebuffer(0, 0, frame_width, frame_height, 0, 480, 640, 0, GL_COLOR_BUFFER_BIT, filter); + GL_CHECK(); #endif + glBindTexture(GL_TEXTURE_2D, 0); + GL_CHECK(); // Restore xbox framebuffer glBindFramebuffer(GL_FRAMEBUFFER, d->pgraph.gl_framebuffer); + GL_CHECK(); } void cxbx_gl_render_overlays(NV2AState *d) @@ -738,7 +869,7 @@ void cxbx_gl_render_overlays(NV2AState *d) int overlay_out_height = GET_MASK(d->pvideo.regs[NV_PVIDEO_SIZE_OUT(v)], NV_PVIDEO_SIZE_OUT_HEIGHT); // If we need to create a new overlay texture, do so, otherwise, update the existing - static GLuint overlay_texture = -1; + static GLuint overlay_gl_texture = -1; // Detect changes in overlay dimensions static int static_overlay_in_width = 0; @@ -750,9 +881,9 @@ void cxbx_gl_render_overlays(NV2AState *d) static_overlay_in_width = overlay_in_width; static_overlay_in_height = overlay_in_height; static_overlay_pitch = overlay_pitch; - if (overlay_texture != -1) { - glDeleteTextures(1, &overlay_texture); - overlay_texture = -1; + if (overlay_gl_texture != -1) { + glDeleteTextures(1, &overlay_gl_texture); + overlay_gl_texture = -1; } } @@ -760,26 +891,36 @@ void cxbx_gl_render_overlays(NV2AState *d) // Render using texture #0 glActiveTexture(GL_TEXTURE0); + GL_CHECK(); - static const GLenum gl_overlay_internal_format = GL_RGBA8; - static const GLenum gl_overlay_format = GL_BGRA; - static const GLenum gl_overlay_type = GL_UNSIGNED_BYTE; + static const GLenum overlay_gl_internal_format = GL_RGBA8; + static const GLenum overlay_gl_format = GL_BGRA; + static const GLenum overlay_gl_type = GL_UNSIGNED_INT_8_8_8_8_REV; hwaddr overlay_pixels = /*CONTIGUOUS_MEMORY_BASE=*/0x80000000 | overlay_offset; - if (overlay_texture == -1) { - glGenTextures(1, &overlay_texture); + if (overlay_gl_texture == -1) { + glGenTextures(1, &overlay_gl_texture); + GL_CHECK(); + glBindTexture(GL_TEXTURE_2D, overlay_gl_texture); + GL_CHECK(); + glTexImage2D(GL_TEXTURE_2D, 0, overlay_gl_internal_format, overlay_pitch / 4, overlay_in_height, 0, overlay_gl_format, overlay_gl_type, NULL); + GL_CHECK(); + } - glBindTexture(GL_TEXTURE_2D, overlay_texture); - glTexImage2D(GL_TEXTURE_2D, 0, gl_overlay_internal_format, overlay_pitch / 4, overlay_in_height, 0, gl_overlay_format, gl_overlay_type, (void*)overlay_pixels); - } - else { - glBindTexture(GL_TEXTURE_2D, overlay_texture); // update the YUV video texturing unit - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, overlay_pitch / 4, overlay_in_height, gl_overlay_format, gl_overlay_type, (void*)overlay_pixels); - } + // update the YUV video texturing unit + glBindTexture(GL_TEXTURE_2D, overlay_gl_texture); + GL_CHECK(); + static const GLint swizzle_mask_BGRA[4] = { GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA }; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_mask_BGRA); + GL_CHECK(); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, overlay_pitch / 4, overlay_in_height, overlay_gl_format, overlay_gl_type, (void*)overlay_pixels); + GL_CHECK(); // Don't average YUYV samples when resizing glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + GL_CHECK(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + GL_CHECK(); // Note : we cannot convert overlay_offset into actual top/left coordinate, so assume (0,0) static const int overlay_in_s = 0; @@ -816,63 +957,66 @@ void cxbx_gl_render_overlays(NV2AState *d) GLfloat dstY1f = (GLfloat)((dstY1 / frame_height) * 2.0f) - 1.0f; glDisable(GL_CULL_FACE); + GL_CHECK(); glUseProgram(Get_YUV_to_RGB_shader_program()); + GL_CHECK(); // Attach texture #0 to the shader sampler location - glUniform1i(yuyv_tex_loc, 0); + glUniform1i(m_overlay_uniform_location_texture, 0); + GL_CHECK(); - // Feed screen coordinates through a vertex buffer object - const GLfloat vertex_buffer_data[] = { - dstX0f, dstY0f, 0.0f, - dstX1f, dstY0f, 0.0f, - dstX1f, dstY1f, 0.0f, - dstX0f, dstY1f, 0.0f, + // Feed screen and texture coordinates through a vertex buffer object + const GLfloat overlay_vertex_buffer_data[] = { + dstX0f, dstY0f, srcX0f, srcY0f, + dstX1f, dstY0f, srcX1f, srcY0f, + dstX1f, dstY1f, srcX1f, srcY1f, + dstX0f, dstY1f, srcX0f, srcY1f, }; - static GLuint vertexbuffer = -1; - if (vertexbuffer == -1) { - glGenBuffers(1, &vertexbuffer); - } - glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer_data), vertex_buffer_data, GL_STREAM_DRAW); - glVertexAttribPointer( - 0, // layout(location = 0) in the vertex shader. - 3, // size = vec3 - GL_FLOAT, // type - GL_FALSE, // normalized? - 0, // stride - (void*)0 // array buffer offset - ); - glEnableVertexAttribArray(0); - // Feed texture coordinates through another vertex buffer object - const GLfloat uv_buffer_data[] = { - srcX0f, srcY0f, - srcX1f, srcY0f, - srcX1f, srcY1f, - srcX0f, srcY1f, - }; - static GLuint uvbuffer = -1; - if (uvbuffer == -1) { - glGenBuffers(1, &uvbuffer); + static GLuint overlay_gl_vertex_buffer_object = -1; + if (overlay_gl_vertex_buffer_object == -1) { + glGenBuffers(1, &overlay_gl_vertex_buffer_object); + GL_CHECK(); } - glBindBuffer(GL_ARRAY_BUFFER, uvbuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(uv_buffer_data), uv_buffer_data, GL_STREAM_DRAW); - glVertexAttribPointer( - 1, // layout(location = 1) in the vertex shader. - 2, // size = vec2 - GL_FLOAT, // type - GL_FALSE, // normalized? - 0, // stride - (void*)0 // array buffer offset - ); - glEnableVertexAttribArray(1); + glBindBuffer(GL_ARRAY_BUFFER, overlay_gl_vertex_buffer_object); + GL_CHECK(); + glBufferData(GL_ARRAY_BUFFER, sizeof(overlay_vertex_buffer_data), overlay_vertex_buffer_data, GL_STREAM_DRAW); + GL_CHECK(); + // Bind vertex position attribute + glVertexAttribPointer( + /*index=*/ATTR_POSITION, + /*size=vec*/2, + /*type=*/GL_FLOAT, + /*normalized?=*/GL_FALSE, + /*stride=*/4*sizeof(GLfloat), + /*array buffer offset=*/(void*)0 + ); + GL_CHECK(); + // Bind vertex texture coordinate attribute + glVertexAttribPointer( + /*index=*/ATTR_TEXCOORD, + /*size=vec*/2, + /*type=*/GL_FLOAT, + /*normalized?=*/GL_FALSE, + /*stride=*/4*sizeof(GLfloat), + /*array buffer offset=*/(void*)(2 * sizeof(GLfloat)) + ); + GL_CHECK(); + glEnableVertexAttribArray(ATTR_POSITION); + GL_CHECK(); + glEnableVertexAttribArray(ATTR_TEXCOORD); + GL_CHECK(); // Finally! Draw the dang overlay... glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - - glUseProgram(0); + GL_CHECK(); + glBindBuffer(GL_ARRAY_BUFFER, 0); + GL_CHECK(); } + + glUseProgram(0); + GL_CHECK(); } extern void UpdateFPSCounter(); @@ -1013,7 +1157,7 @@ void NV2ADevice::Init() // Only spawn VBlank thread when LLE is enabled if (d->pgraph.opengl_enabled) { #ifdef DRAW_FRAMEBUFFER - cxbx_gl_initialize(); + cxbx_gl_initialize(d); #endif vblank_thread = std::thread(nv2a_vblank_thread, d); } diff --git a/src/devices/video/nv2a_shaders.cpp b/src/devices/video/nv2a_shaders.cpp index 0186b7f62..bd9865853 100644 --- a/src/devices/video/nv2a_shaders.cpp +++ b/src/devices/video/nv2a_shaders.cpp @@ -775,7 +775,7 @@ STRUCT_VERTEX_DATA); NV2A_DPRINTF("compile new %s, code:\n%s\n", name, code); GLuint shader = glCreateShader(gl_shader_type); - glShaderSource(shader, 1, &code, 0); + glShaderSource(shader, 1, &code, NULL); glCompileShader(shader); /* Check it compiled */ From 48f88e49985eb6f26fedead6d06de99617efba2f Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Tue, 3 Jul 2018 10:10:32 +0200 Subject: [PATCH 0080/1000] LLE : Fixed rendering overlay. Also skip rendering framebuffer when overlay overlaps it fully anyway. --- src/devices/video/nv2a.cpp | 60 ++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index 5f1b32ba2..9d326cbc9 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -454,37 +454,48 @@ GLuint Get_YUV_to_RGB_shader_program() // to https://github.com/kolyvan/kxmovie/blob/master/kxmovie/KxMovieGLView.m // and https://www.opengl.org/discussion_boards/archive/index.php/t-169186.html // and https://gist.github.com/roxlu/9329339 + // https://github.com/g-truc/ogl-samples/blob/master/data/gl-330/texture-2d.vert static const char *OPENGL_SHADER_YUV[2] = { /* vertex shader */ "#version 330 core \n" "#define ATTR_POSITION 0 \n" "#define ATTR_TEXCOORD 4 \n" + " \n" "precision highp float; \n" "precision highp int; \n" "layout(std140, column_major) uniform; \n" + " \n" "layout(location = ATTR_POSITION) in vec2 Position; \n" "layout(location = ATTR_TEXCOORD) in vec2 Texcoord; \n" + " \n" "out block \n" "{ \n" " vec2 Texcoord; \n" "} Out; \n" + " \n" "void main() \n" "{ \n" " Out.Texcoord = Texcoord; \n" " gl_Position = vec4(Position, 0.0, 1.0); \n" "} \n" , /* fragment shader */ + // https://github.com/g-truc/ogl-samples/blob/master/data/gl-330/texture-2d.frag "#version 330 core \n" "#define FRAG_COLOR 0 \n" + " \n" "precision highp float; \n" "precision highp int; \n" "layout(std140, column_major) uniform; \n" + " \n" "uniform sampler2D tex_yuyv; \n" + " \n" "in block \n" "{ \n" " vec2 Texcoord; \n" "} In; \n" + " \n" "layout(location = FRAG_COLOR, index = 0) out vec4 Color; \n" + " \n" "// YUV offset \n" "const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814); \n" "// RGB coefficients \n" @@ -613,10 +624,6 @@ void InitShaders(void) }; GL_RESET(); -#if 0 - glGenVertexArrays(1, &m_vao); - glBindVertexArray(m_vao); -#endif // Compile vertex shader GLuint vertex_shader = create_gl_shader(GL_VERTEX_SHADER, gl_framebuffer_shader_src[0], "Framebuffer vertex shader"); @@ -729,7 +736,7 @@ void cxbx_gl_initialize(NV2AState *d) static GLsizei frame_width = 640; static GLsizei frame_height = 480; -void cxbx_gl_update_framebuffer(NV2AState *d) +void cxbx_gl_render_framebuffer(NV2AState *d) { static GLenum frame_gl_internal_format = GL_RGBA8; static GLenum frame_gl_format = GL_BGRA; @@ -750,8 +757,6 @@ void cxbx_gl_update_framebuffer(NV2AState *d) PreviousAvDisplayModeFormat = g_AvDisplayModeFormat; } - glGetError(); // reset GL_CHECK - // If we need to create a (new) texture, do so if (frame_gl_texture == -1) { glGenTextures(1, &frame_gl_texture); @@ -784,10 +789,6 @@ void cxbx_gl_update_framebuffer(NV2AState *d) // Note : The following is modelled partially after pgraph_update_surface() // TODO : pgraph_update_surface() also unswizzles - should we too? - // Target the actual framebuffer - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); - GL_CHECK(); - #ifdef DEBUG_NV2A_GL // If the screen turns purple, glBlitFramebuffer below failed glClearColor(1.0f, 0.0f, 1.0f, 1.0f); @@ -826,9 +827,6 @@ void cxbx_gl_update_framebuffer(NV2AState *d) glBindTexture(GL_TEXTURE_2D, 0); GL_CHECK(); - // Restore xbox framebuffer - glBindFramebuffer(GL_FRAMEBUFFER, d->pgraph.gl_framebuffer); - GL_CHECK(); } void cxbx_gl_render_overlays(NV2AState *d) @@ -966,6 +964,12 @@ void cxbx_gl_render_overlays(NV2AState *d) glUniform1i(m_overlay_uniform_location_texture, 0); GL_CHECK(); + glActiveTexture(GL_TEXTURE0); + GL_CHECK(); + + glBindTexture(GL_TEXTURE_2D, overlay_gl_texture); + GL_CHECK(); + // Feed screen and texture coordinates through a vertex buffer object const GLfloat overlay_vertex_buffer_data[] = { dstX0f, dstY0f, srcX0f, srcY0f, @@ -974,6 +978,14 @@ void cxbx_gl_render_overlays(NV2AState *d) dstX0f, dstY1f, srcX0f, srcY1f, }; + static GLuint m_framebuffer_vertex_array_name = -1; + if (m_framebuffer_vertex_array_name == -1) { + glGenVertexArrays(1, &m_framebuffer_vertex_array_name); + GL_CHECK(); + } + glBindVertexArray(m_framebuffer_vertex_array_name); + GL_CHECK(); + static GLuint overlay_gl_vertex_buffer_object = -1; if (overlay_gl_vertex_buffer_object == -1) { glGenBuffers(1, &overlay_gl_vertex_buffer_object); @@ -1013,6 +1025,8 @@ void cxbx_gl_render_overlays(NV2AState *d) GL_CHECK(); glBindBuffer(GL_ARRAY_BUFFER, 0); GL_CHECK(); + glBindVertexArray(0); + GL_CHECK(); } glUseProgram(0); @@ -1030,10 +1044,26 @@ void NV2ADevice::UpdateHostDisplay(NV2AState *d) NV2A_GL_DGROUP_BEGIN("VGA Frame"); - cxbx_gl_update_framebuffer(d); + glGetError(); // reset GL_CHECK + + // Target the actual framebuffer + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + GL_CHECK(); + + // When either overlay is enabled and not transparent (TODO : and overlay fills entire screen) + if (((d->pvideo.regs[NV_PVIDEO_BUFFER] & NV_PVIDEO_BUFFER_0_USE) && (GET_MASK(d->pvideo.regs[NV_PVIDEO_FORMAT(0)], NV_PVIDEO_FORMAT_DISPLAY) == 0)) + || ((d->pvideo.regs[NV_PVIDEO_BUFFER] & NV_PVIDEO_BUFFER_1_USE) && (GET_MASK(d->pvideo.regs[NV_PVIDEO_FORMAT(1)], NV_PVIDEO_FORMAT_DISPLAY) == 0))) { + // skip framebuffer draw + } else { + cxbx_gl_render_framebuffer(d); + } cxbx_gl_render_overlays(d); + // Restore xbox framebuffer + glBindFramebuffer(GL_FRAMEBUFFER, d->pgraph.gl_framebuffer); + GL_CHECK(); + // We currently don't double buffer, so no need to call swap... glo_swap(d->pgraph.gl_context); From 2dc8dff4c4a6f6bd5175845004390f72636af766 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Tue, 3 Jul 2018 12:02:13 +0200 Subject: [PATCH 0081/1000] LLE : Cleanup, disabled DRAW_FRAMEBUFFER for now so the framebuffer is visible again. Hopefully, DRAW_FRAMEBUFFER will work in the next commit! --- src/devices/video/nv2a.cpp | 82 ++++++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 31 deletions(-) diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index 9d326cbc9..ea5d160ab 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -425,11 +425,11 @@ void _check_gl_error(const char *file, int line) } } -#define GL_RESET() _check_gl_reset +#define GL_RESET() _check_gl_reset() #define GL_CHECK() _check_gl_error(__FILE__,__LINE__) enum { - SAMP_TEXCOORD = 5, + SAMP_TEXCOORD = 0, }; enum { @@ -533,13 +533,16 @@ GLuint Get_YUV_to_RGB_shader_program() // Bind shader static GLuint shader_program_name_yuv_to_rgb = -1; if (shader_program_name_yuv_to_rgb == -1) { + // Compile vertex shader GLuint vertex_shader_name = create_gl_shader(GL_VERTEX_SHADER, OPENGL_SHADER_YUV[0], "YUV>RGB Vertex shader"); GL_CHECK(); + // Compile fragment shader GLuint fragment_shader_name = create_gl_shader(GL_FRAGMENT_SHADER, OPENGL_SHADER_YUV[1], "YUV>RGB Fragment shader"); GL_CHECK(); shader_program_name_yuv_to_rgb = glCreateProgram(); GL_CHECK(); + // Link vertex and fragment shaders glAttachShader(shader_program_name_yuv_to_rgb, vertex_shader_name); GL_CHECK(); glAttachShader(shader_program_name_yuv_to_rgb, fragment_shader_name); @@ -591,15 +594,19 @@ void InitShaders(void) "#version 330 core \n" "#define ATTR_POSITION 0 \n" "#define ATTR_TEXCOORD 4 \n" + " \n" "precision highp float; \n" "precision highp int; \n" "layout(std140, column_major) uniform; \n" + " \n" "layout(location = ATTR_POSITION) in vec2 Position; \n" "layout(location = ATTR_TEXCOORD) in vec2 Texcoord; \n" + " \n" "out block \n" "{ \n" " vec2 Texcoord; \n" "} Out; \n" + " \n" "void main() \n" "{ \n" " Out.Texcoord = Texcoord; \n" @@ -608,27 +615,32 @@ void InitShaders(void) , /* fragment shader */ "#version 330 core \n" "#define FRAG_COLOR 0 \n" + " \n" "precision highp float; \n" "precision highp int; \n" "layout(std140, column_major) uniform; \n" + " \n" "uniform sampler2D tex; \n" + " \n" "in block \n" "{ \n" " vec2 Texcoord; \n" "} In; \n" + " \n" "layout(location = FRAG_COLOR, index = 0) out vec4 Color; \n" + " \n" "void main() \n" "{ \n" " Color = texture2D(tex, In.Texcoord); \n" "} \n" }; - GL_RESET(); - // Compile vertex shader GLuint vertex_shader = create_gl_shader(GL_VERTEX_SHADER, gl_framebuffer_shader_src[0], "Framebuffer vertex shader"); + GL_CHECK(); // Compile fragment shader GLuint fragment_shader = create_gl_shader(GL_FRAGMENT_SHADER, gl_framebuffer_shader_src[1], "Framebuffer fragment shader"); + GL_CHECK(); m_framebuffer_shader_program = glCreateProgram(); GL_CHECK(); @@ -645,6 +657,7 @@ void InitShaders(void) GL_CHECK(); glLinkProgram(m_framebuffer_shader_program); GL_CHECK(); + /* Check it linked */ GLint linked = 0; glGetProgramiv(m_framebuffer_shader_program, GL_LINK_STATUS, &linked); @@ -658,16 +671,17 @@ void InitShaders(void) m_framebuffer_uniform_location_texture = glGetUniformLocation(m_framebuffer_shader_program, "tex"); GL_CHECK(); + assert(m_framebuffer_uniform_location_texture >= 0); } void InitGeometry() { - static const GLfloat vertices[6][4] = { + static const GLfloat vertices[] = { // x y s t - { -1.0f, -1.0f, 0.0f, 1.0f }, // BL - { -1.0f, 1.0f, 0.0f, 0.0f }, // TL - { 1.0f, 1.0f, 1.0f, 0.0f }, // TR - { 1.0f, -1.0f, 1.0f, 1.0f }, // BR + -1.0f, -1.0f, 0.0f, 0.0f, // BL + 1.0f, -1.0f, 1.0f, 0.0f, // BR + 1.0f, 1.0f, 1.0f, 1.0f, // TR + -1.0f, 1.0f, 0.0f, 1.0f, // TL }; // Populate vertex buffer @@ -691,7 +705,6 @@ void InitVertexArray() glBindBuffer(GL_ARRAY_BUFFER, m_framebuffer_vertex_buffer_object); GL_CHECK(); - // Bind vertex position attribute // Bind vertex position attribute glVertexAttribPointer( /*index=*/ATTR_POSITION, @@ -724,6 +737,8 @@ void cxbx_gl_initialize(NV2AState *d) { lockGL(&d->pgraph); + GL_RESET(); + InitShaders(); InitGeometry(); InitVertexArray(); @@ -790,7 +805,7 @@ void cxbx_gl_render_framebuffer(NV2AState *d) // TODO : pgraph_update_surface() also unswizzles - should we too? #ifdef DEBUG_NV2A_GL - // If the screen turns purple, glBlitFramebuffer below failed + // If the screen turns purple, glDrawArrays/glBlitFramebuffer below failed glClearColor(1.0f, 0.0f, 1.0f, 1.0f); GL_CHECK(); glClear(GL_COLOR_BUFFER_BIT); @@ -809,6 +824,12 @@ void cxbx_gl_render_framebuffer(NV2AState *d) GL_CHECK(); glBindVertexArray(m_framebuffer_vertex_array_name); GL_CHECK(); + glBindBuffer(GL_ARRAY_BUFFER, m_framebuffer_vertex_buffer_object); + GL_CHECK(); + glEnableVertexAttribArray(ATTR_POSITION); + GL_CHECK(); + glEnableVertexAttribArray(ATTR_TEXCOORD); + GL_CHECK(); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); GL_CHECK(); #else @@ -824,9 +845,6 @@ void cxbx_gl_render_framebuffer(NV2AState *d) glBlitFramebuffer(0, 0, frame_width, frame_height, 0, 480, 640, 0, GL_COLOR_BUFFER_BIT, filter); GL_CHECK(); #endif - - glBindTexture(GL_TEXTURE_2D, 0); - GL_CHECK(); } void cxbx_gl_render_overlays(NV2AState *d) @@ -954,14 +972,11 @@ void cxbx_gl_render_overlays(NV2AState *d) GLfloat dstY0f = (GLfloat)((dstY0 / frame_height) * 2.0f) - 1.0f; GLfloat dstY1f = (GLfloat)((dstY1 / frame_height) * 2.0f) - 1.0f; - glDisable(GL_CULL_FACE); - GL_CHECK(); - glUseProgram(Get_YUV_to_RGB_shader_program()); GL_CHECK(); // Attach texture #0 to the shader sampler location - glUniform1i(m_overlay_uniform_location_texture, 0); + glUniform1i(m_overlay_uniform_location_texture, SAMP_TEXCOORD); GL_CHECK(); glActiveTexture(GL_TEXTURE0); @@ -1023,14 +1038,7 @@ void cxbx_gl_render_overlays(NV2AState *d) // Finally! Draw the dang overlay... glDrawArrays(GL_TRIANGLE_FAN, 0, 4); GL_CHECK(); - glBindBuffer(GL_ARRAY_BUFFER, 0); - GL_CHECK(); - glBindVertexArray(0); - GL_CHECK(); } - - glUseProgram(0); - GL_CHECK(); } extern void UpdateFPSCounter(); @@ -1044,27 +1052,39 @@ void NV2ADevice::UpdateHostDisplay(NV2AState *d) NV2A_GL_DGROUP_BEGIN("VGA Frame"); - glGetError(); // reset GL_CHECK + GL_RESET(); - // Target the actual framebuffer - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + // Target the host framebuffer + glBindFramebuffer(GL_FRAMEBUFFER, 0); +// glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); GL_CHECK(); - // When either overlay is enabled and not transparent (TODO : and overlay fills entire screen) + glDisable(GL_CULL_FACE); + GL_CHECK(); + + // Is either overlay enabled and not transparent (TODO : and overlay fills entire screen) ? if (((d->pvideo.regs[NV_PVIDEO_BUFFER] & NV_PVIDEO_BUFFER_0_USE) && (GET_MASK(d->pvideo.regs[NV_PVIDEO_FORMAT(0)], NV_PVIDEO_FORMAT_DISPLAY) == 0)) || ((d->pvideo.regs[NV_PVIDEO_BUFFER] & NV_PVIDEO_BUFFER_1_USE) && (GET_MASK(d->pvideo.regs[NV_PVIDEO_FORMAT(1)], NV_PVIDEO_FORMAT_DISPLAY) == 0))) { - // skip framebuffer draw + // Then the framebuffer won't be visible anyway, so doesn't have to be rendered } else { cxbx_gl_render_framebuffer(d); } cxbx_gl_render_overlays(d); + glBindTexture(GL_TEXTURE_2D, 0); + GL_CHECK(); + glBindBuffer(GL_ARRAY_BUFFER, 0); + GL_CHECK(); + glBindVertexArray(0); + GL_CHECK(); + glUseProgram(0); + GL_CHECK(); + // Restore xbox framebuffer glBindFramebuffer(GL_FRAMEBUFFER, d->pgraph.gl_framebuffer); GL_CHECK(); - // We currently don't double buffer, so no need to call swap... glo_swap(d->pgraph.gl_context); NV2A_GL_DGROUP_END(); From 420b62221eab6157fb60e9c7c7b6a622d0b60e72 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Tue, 3 Jul 2018 15:58:05 +0200 Subject: [PATCH 0082/1000] LLE : Moved pvideo overlay state into a struct, cleaning up more code. --- src/devices/video/nv2a.cpp | 417 ++++++++++++++++++++----------------- src/devices/video/nv2a.h | 24 +++ 2 files changed, 253 insertions(+), 188 deletions(-) diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index ea5d160ab..2a143b01a 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -441,9 +441,9 @@ enum { ATTR_TEXCOORD = 4, }; -static GLint m_overlay_uniform_location_texture = -1; -static GLint m_overlay_attribute_location_position = -1; -static GLint m_overlay_attribute_location_texture = -1; +static GLint m_overlay_gl_uniform_location_texture = -1; +static GLint m_overlay_gl_attribute_location_position = -1; +static GLint m_overlay_gl_attribute_location_texture = -1; GLuint Get_YUV_to_RGB_shader_program() { @@ -567,9 +567,9 @@ GLuint Get_YUV_to_RGB_shader_program() abort(); } - m_overlay_uniform_location_texture = glGetUniformLocation(shader_program_name_yuv_to_rgb, "tex_yuyv"); + m_overlay_gl_uniform_location_texture = glGetUniformLocation(shader_program_name_yuv_to_rgb, "tex_yuyv"); GL_CHECK(); - assert(m_overlay_uniform_location_texture >= 0); + assert(m_overlay_gl_uniform_location_texture >= 0); } return shader_program_name_yuv_to_rgb; @@ -579,15 +579,12 @@ GLuint Get_YUV_to_RGB_shader_program() #ifdef DRAW_FRAMEBUFFER -GLuint m_framebuffer_shader_program = -1; -GLuint m_framebuffer_uniform_location_texture = -1; -GLuint m_framebuffer_vertex_buffer_object = -1; -GLuint m_framebuffer_vertex_array_name = -1; +GLuint m_framebuffer_gl_shader_program = -1; +GLuint m_framebuffer_gl_uniform_location_texture = -1; +GLuint m_framebuffer_gl_vertex_buffer_object = -1; +GLuint m_framebuffer_gl_vertex_array_object = -1; -/* - * Initialize Shaders - */ -void InitShaders(void) +void InitFramebufferShaders(void) { static const char *gl_framebuffer_shader_src[2] = { /* vertex shader */ @@ -642,39 +639,39 @@ void InitShaders(void) GLuint fragment_shader = create_gl_shader(GL_FRAGMENT_SHADER, gl_framebuffer_shader_src[1], "Framebuffer fragment shader"); GL_CHECK(); - m_framebuffer_shader_program = glCreateProgram(); + m_framebuffer_gl_shader_program = glCreateProgram(); GL_CHECK(); // Link vertex and fragment shaders - glAttachShader(m_framebuffer_shader_program, vertex_shader); + glAttachShader(m_framebuffer_gl_shader_program, vertex_shader); GL_CHECK(); - glAttachShader(m_framebuffer_shader_program, fragment_shader); + glAttachShader(m_framebuffer_gl_shader_program, fragment_shader); GL_CHECK(); - glBindAttribLocation(m_framebuffer_shader_program, ATTR_POSITION, "Position"); + glBindAttribLocation(m_framebuffer_gl_shader_program, ATTR_POSITION, "Position"); GL_CHECK(); - glBindAttribLocation(m_framebuffer_shader_program, ATTR_TEXCOORD, "Texcoord"); + glBindAttribLocation(m_framebuffer_gl_shader_program, ATTR_TEXCOORD, "Texcoord"); GL_CHECK(); - glBindFragDataLocation(m_framebuffer_shader_program, FRAG_COLOR, "Color"); + glBindFragDataLocation(m_framebuffer_gl_shader_program, FRAG_COLOR, "Color"); GL_CHECK(); - glLinkProgram(m_framebuffer_shader_program); + glLinkProgram(m_framebuffer_gl_shader_program); GL_CHECK(); /* Check it linked */ GLint linked = 0; - glGetProgramiv(m_framebuffer_shader_program, GL_LINK_STATUS, &linked); + glGetProgramiv(m_framebuffer_gl_shader_program, GL_LINK_STATUS, &linked); GL_CHECK(); if (!linked) { GLchar log[2048]; - glGetProgramInfoLog(m_framebuffer_shader_program, 2048, NULL, log); + glGetProgramInfoLog(m_framebuffer_gl_shader_program, 2048, NULL, log); fprintf(stderr, "nv2a: shader linking failed: %s\n", log); abort(); } - m_framebuffer_uniform_location_texture = glGetUniformLocation(m_framebuffer_shader_program, "tex"); + m_framebuffer_gl_uniform_location_texture = glGetUniformLocation(m_framebuffer_gl_shader_program, "tex"); GL_CHECK(); - assert(m_framebuffer_uniform_location_texture >= 0); + assert(m_framebuffer_gl_uniform_location_texture >= 0); } -void InitGeometry() +void InitFramebufferGeometry() { static const GLfloat vertices[] = { // x y s t @@ -684,27 +681,17 @@ void InitGeometry() -1.0f, 1.0f, 0.0f, 1.0f, // TL }; + glGenVertexArrays(1, &m_framebuffer_gl_vertex_array_object); + GL_CHECK(); + glBindVertexArray(m_framebuffer_gl_vertex_array_object); + GL_CHECK(); // Populate vertex buffer - glGenBuffers(1, &m_framebuffer_vertex_buffer_object); + glGenBuffers(1, &m_framebuffer_gl_vertex_buffer_object); GL_CHECK(); - glBindBuffer(GL_ARRAY_BUFFER, m_framebuffer_vertex_buffer_object); + glBindBuffer(GL_ARRAY_BUFFER, m_framebuffer_gl_vertex_buffer_object); GL_CHECK(); - glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + glEnableVertexAttribArray(ATTR_POSITION); GL_CHECK(); - glBindBuffer(GL_ARRAY_BUFFER, 0); - GL_CHECK(); -} - -void InitVertexArray() -{ - glGenVertexArrays(1, &m_framebuffer_vertex_array_name); - GL_CHECK(); - glBindVertexArray(m_framebuffer_vertex_array_name); - GL_CHECK(); - - glBindBuffer(GL_ARRAY_BUFFER, m_framebuffer_vertex_buffer_object); - GL_CHECK(); - // Bind vertex position attribute glVertexAttribPointer( /*index=*/ATTR_POSITION, @@ -715,6 +702,8 @@ void InitVertexArray() /*array buffer offset=*/(void*)0 ); GL_CHECK(); + glEnableVertexAttribArray(ATTR_TEXCOORD); + GL_CHECK(); // Bind vertex texture coordinate attribute glVertexAttribPointer( /*index=*/ATTR_TEXCOORD, @@ -725,52 +714,67 @@ void InitVertexArray() /*array buffer offset=*/(void*)(2 * sizeof(GLfloat)) ); GL_CHECK(); - glEnableVertexAttribArray(ATTR_POSITION); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); GL_CHECK(); - glEnableVertexAttribArray(ATTR_TEXCOORD); + + // Unbind everything we've used + glBindBuffer(GL_ARRAY_BUFFER, 0); GL_CHECK(); glBindVertexArray(0); GL_CHECK(); } -void cxbx_gl_initialize(NV2AState *d) +void cxbx_gl_framebuffer_initialize(NV2AState *d) { lockGL(&d->pgraph); GL_RESET(); - InitShaders(); - InitGeometry(); - InitVertexArray(); + InitFramebufferShaders(); + InitFramebufferGeometry(); unlockGL(&d->pgraph); } #endif // DRAW_FRAMEBUFFER +static GLenum frame_gl_internal_format = GL_RGBA8; +static GLenum frame_gl_format = GL_BGRA; +static GLenum frame_gl_type = GL_UNSIGNED_INT_8_8_8_8_REV; +static GLuint frame_gl_texture = -1; + static GLsizei frame_width = 640; static GLsizei frame_height = 480; -void cxbx_gl_render_framebuffer(NV2AState *d) -{ - static GLenum frame_gl_internal_format = GL_RGBA8; - static GLenum frame_gl_format = GL_BGRA; - static GLenum frame_gl_type = GL_UNSIGNED_INT_8_8_8_8_REV; - static GLuint frame_gl_texture = -1; +void cxbx_gl_update_displaymode() { + // Convert AV Format to OpenGl format details & destroy the texture if format changed. + // This is required for titles that use a non ARGB framebuffer, such as Beats of Rage + static ULONG PreviousAvDisplayModeFormat = -1; + static GLsizei old_frame_width = 640; + static GLsizei old_frame_height = 480; - // Convert AV Format to OpenGl format details & destroy the texture if format changed.. - // This is required for titles that use a non ARGB framebuffer, such was Beats of Rage - static ULONG PreviousAvDisplayModeFormat = 0; if (PreviousAvDisplayModeFormat != g_AvDisplayModeFormat) { + PreviousAvDisplayModeFormat = g_AvDisplayModeFormat; AvDisplayModeFormatToGL(g_AvDisplayModeFormat, &frame_gl_internal_format, &frame_gl_format, &frame_gl_type); AvGetFormatSize(AvpCurrentMode, &frame_width, &frame_height); - if (frame_gl_texture != -1) { - glDeleteTextures(1, &frame_gl_texture); - frame_gl_texture = -1; + // Detect changes in framebuffer dimensions + if (old_frame_width != frame_width + || old_frame_height != frame_height) { + old_frame_width = frame_width; + old_frame_height = frame_height; + if (frame_gl_texture != -1) { + glDeleteTextures(1, &frame_gl_texture); + frame_gl_texture = -1; + } } - - PreviousAvDisplayModeFormat = g_AvDisplayModeFormat; } +} + +void cxbx_gl_render_framebuffer(NV2AState *d) +{ + // Render using texture #0 + glActiveTexture(GL_TEXTURE0); + GL_CHECK(); // If we need to create a (new) texture, do so if (frame_gl_texture == -1) { @@ -781,10 +785,12 @@ void cxbx_gl_render_framebuffer(NV2AState *d) glTexImage2D(GL_TEXTURE_2D, 0, frame_gl_internal_format, frame_width, frame_height, 0, frame_gl_format, frame_gl_type, NULL); GL_CHECK(); } + else { + // Update the frame texture + glBindTexture(GL_TEXTURE_2D, frame_gl_texture); + GL_CHECK(); + } - // Update the frame texture - glBindTexture(GL_TEXTURE_2D, frame_gl_texture); - GL_CHECK(); // TODO : Get the correct swizzle from the av format (see kelvin_color_format_map) static const GLint swizzle_mask_RGBA[4] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA }; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_mask_RGBA); @@ -794,13 +800,6 @@ void cxbx_gl_render_framebuffer(NV2AState *d) glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, frame_width, frame_height, frame_gl_format, frame_gl_type, (void*)frame_pixels); GL_CHECK(); - // If we need to create an OpenGL framebuffer, do so - static GLuint frame_gl_framebuffer = -1; - if (frame_gl_framebuffer == -1) { - glGenFramebuffers(1, &frame_gl_framebuffer); - GL_CHECK(); - } - // Note : The following is modelled partially after pgraph_update_surface() // TODO : pgraph_update_surface() also unswizzles - should we too? @@ -814,17 +813,19 @@ void cxbx_gl_render_framebuffer(NV2AState *d) #ifdef DRAW_FRAMEBUFFER // Draw frame texture to an internal frame buffer - glUseProgram(m_framebuffer_shader_program); + glUseProgram(m_framebuffer_gl_shader_program); GL_CHECK(); - glUniform1i(m_framebuffer_uniform_location_texture, SAMP_TEXCOORD); + glUniform1i(m_framebuffer_gl_uniform_location_texture, SAMP_TEXCOORD); GL_CHECK(); +#if 0 // State already set above : glActiveTexture(GL_TEXTURE0); GL_CHECK(); glBindTexture(GL_TEXTURE_2D, frame_gl_texture); GL_CHECK(); - glBindVertexArray(m_framebuffer_vertex_array_name); +#endif + glBindVertexArray(m_framebuffer_gl_vertex_array_object); GL_CHECK(); - glBindBuffer(GL_ARRAY_BUFFER, m_framebuffer_vertex_buffer_object); + glBindBuffer(GL_ARRAY_BUFFER, m_framebuffer_gl_vertex_buffer_object); GL_CHECK(); glEnableVertexAttribArray(ATTR_POSITION); GL_CHECK(); @@ -833,10 +834,17 @@ void cxbx_gl_render_framebuffer(NV2AState *d) glDrawArrays(GL_TRIANGLE_FAN, 0, 4); GL_CHECK(); #else + // If we need to create an OpenGL framebuffer, do so + static GLuint frame_gl_framebuffer = -1; + if (frame_gl_framebuffer == -1) { + glGenFramebuffers(1, &frame_gl_framebuffer); + GL_CHECK(); + } + // Copy frame texture to an internal frame buffer glBindFramebuffer(GL_READ_FRAMEBUFFER, frame_gl_framebuffer); GL_CHECK(); - glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, frame_gl_texture, 0); + glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, frame_gl_texture, /*level=*/0); GL_CHECK(); // Blit the active internal 'read' frame buffer to the actual 'draw' framebuffer static const GLenum filter = GL_NEAREST; @@ -847,60 +855,80 @@ void cxbx_gl_render_framebuffer(NV2AState *d) #endif } -void cxbx_gl_render_overlays(NV2AState *d) +void pvideo_init(NV2AState *d) { - // NV2A supports 2 video overlays - for (int v = 0; v < 2; v++) { - uint32_t video_buffer_use = (v == 0) ? NV_PVIDEO_BUFFER_0_USE : NV_PVIDEO_BUFFER_1_USE; - if (!(d->pvideo.regs[NV_PVIDEO_BUFFER] & video_buffer_use)) { - continue; - } + d->pvideo.overlays[0].gl_texture = -1; + d->pvideo.overlays[1].gl_texture = -1; +} - // Get overlay measures (from xqemu nv2a_overlay_draw_line) : - uint32_t overlay_offset_high_26 = d->pvideo.regs[NV_PVIDEO_OFFSET(v)]; - uint32_t overlay_offset_lower_6 = d->pvideo.regs[NV_PVIDEO_POINT_IN(v)] >> 3; - uint32_t overlay_size_in = d->pvideo.regs[NV_PVIDEO_SIZE_IN(v)]; - uint32_t overlay_color_key = d->pvideo.regs[NV_PVIDEO_COLOR_KEY(v)]; - uint32_t overlay_format = d->pvideo.regs[NV_PVIDEO_FORMAT(v)]; +void cxbx_gl_parse_overlay(NV2AState *d, int v) +{ + OverlayState &overlay = d->pvideo.overlays[v]; + + uint32_t video_buffer_use = (v == 0) ? NV_PVIDEO_BUFFER_0_USE : NV_PVIDEO_BUFFER_1_USE; + overlay.video_buffer_use = d->pvideo.regs[NV_PVIDEO_BUFFER] & video_buffer_use; + + // Get overlay measures (from xqemu nv2a_overlay_draw_line) : + uint32_t overlay_offset_high_26 = d->pvideo.regs[NV_PVIDEO_OFFSET(v)]; + uint32_t overlay_offset_lower_6 = d->pvideo.regs[NV_PVIDEO_POINT_IN(v)] >> 3; + uint32_t overlay_size_in = d->pvideo.regs[NV_PVIDEO_SIZE_IN(v)]; + uint32_t overlay_color_key = d->pvideo.regs[NV_PVIDEO_COLOR_KEY(v)]; + uint32_t overlay_format = d->pvideo.regs[NV_PVIDEO_FORMAT(v)]; #ifdef DEBUG - // Check a few assumptions - hwaddr overlay_base = d->pvideo.regs[NV_PVIDEO_BASE(v)]; - hwaddr overlay_limit = d->pvideo.regs[NV_PVIDEO_LIMIT(v)]; - assert(overlay_base == 0); - assert(overlay_limit == (128 * ONE_MB) - 1); // = CONTIGUOUS_MEMORY_CHIHIRO_SIZE - 1 - assert(GET_MASK(overlay_format, NV_PVIDEO_FORMAT_COLOR) == NV_PVIDEO_FORMAT_COLOR_LE_CR8YB8CB8YA8); + // Check a few assumptions + overlay.base = d->pvideo.regs[NV_PVIDEO_BASE(v)]; + overlay.limit = d->pvideo.regs[NV_PVIDEO_LIMIT(v)]; + assert(overlay.base == 0); + assert(overlay.limit == (128 * ONE_MB) - 1); // = CONTIGUOUS_MEMORY_CHIHIRO_SIZE - 1 + assert(GET_MASK(overlay_format, NV_PVIDEO_FORMAT_COLOR) == NV_PVIDEO_FORMAT_COLOR_LE_CR8YB8CB8YA8); + #endif - // Derive actual attributes - int overlay_pitch = overlay_format & NV_PVIDEO_FORMAT_PITCH; - bool overlay_is_transparent = GET_MASK(overlay_format, NV_PVIDEO_FORMAT_DISPLAY); - hwaddr overlay_offset = overlay_offset_high_26 | overlay_offset_lower_6; - uint32_t overlay_size_in_height_width = overlay_size_in - (overlay_offset_lower_6 >> 1); - uint32_t overlay_in_height = overlay_size_in_height_width >> 16; - uint32_t overlay_in_width = overlay_size_in_height_width & 0xFFFF; + // Derive actual attributes + overlay.pitch = overlay_format & NV_PVIDEO_FORMAT_PITCH; + overlay.is_transparent = GET_MASK(overlay_format, NV_PVIDEO_FORMAT_DISPLAY); + overlay.offset = overlay_offset_high_26 | overlay_offset_lower_6; - int overlay_out_x = GET_MASK(d->pvideo.regs[NV_PVIDEO_POINT_OUT(v)], NV_PVIDEO_POINT_OUT_X); - int overlay_out_y = GET_MASK(d->pvideo.regs[NV_PVIDEO_POINT_OUT(v)], NV_PVIDEO_POINT_OUT_Y); - int overlay_out_width = GET_MASK(d->pvideo.regs[NV_PVIDEO_SIZE_OUT(v)], NV_PVIDEO_SIZE_OUT_WIDTH); - int overlay_out_height = GET_MASK(d->pvideo.regs[NV_PVIDEO_SIZE_OUT(v)], NV_PVIDEO_SIZE_OUT_HEIGHT); + uint32_t overlay_size_in_height_width = overlay_size_in - (overlay_offset_lower_6 >> 1); + overlay.in_height = overlay_size_in_height_width >> 16; + overlay.in_width = overlay_size_in_height_width & 0xFFFF; - // If we need to create a new overlay texture, do so, otherwise, update the existing - static GLuint overlay_gl_texture = -1; + overlay.out_x = GET_MASK(d->pvideo.regs[NV_PVIDEO_POINT_OUT(v)], NV_PVIDEO_POINT_OUT_X); + overlay.out_y = GET_MASK(d->pvideo.regs[NV_PVIDEO_POINT_OUT(v)], NV_PVIDEO_POINT_OUT_Y); + overlay.out_width = GET_MASK(d->pvideo.regs[NV_PVIDEO_SIZE_OUT(v)], NV_PVIDEO_SIZE_OUT_WIDTH); + overlay.out_height = GET_MASK(d->pvideo.regs[NV_PVIDEO_SIZE_OUT(v)], NV_PVIDEO_SIZE_OUT_HEIGHT); - // Detect changes in overlay dimensions - static int static_overlay_in_width = 0; - static int static_overlay_in_height = 0; - static int static_overlay_pitch = 0; - if (static_overlay_in_width != overlay_in_width - || static_overlay_in_height != overlay_in_height - || static_overlay_pitch != overlay_pitch) { - static_overlay_in_width = overlay_in_width; - static_overlay_in_height = overlay_in_height; - static_overlay_pitch = overlay_pitch; - if (overlay_gl_texture != -1) { - glDeleteTextures(1, &overlay_gl_texture); - overlay_gl_texture = -1; - } + // Detect changes in overlay dimensions + if (overlay.old_in_width != overlay.in_width + || overlay.old_in_height != overlay.in_height + || overlay.old_pitch != overlay.pitch) { + overlay.old_in_width = overlay.in_width; + overlay.old_in_height = overlay.in_height; + overlay.old_pitch = overlay.pitch; + if (overlay.gl_texture != -1) { + glDeleteTextures(1, &overlay.gl_texture); + overlay.gl_texture = -1; + } + } + + overlay.covers_framebuffer = overlay.video_buffer_use + && (!overlay.is_transparent) + && (overlay.out_x == 0) + && (overlay.out_y == 0) + && (overlay.out_width == frame_width) + && (overlay.out_height == frame_height); +} + +void cxbx_gl_render_overlays(NV2AState *d) +{ + static const GLenum overlay_gl_internal_format = GL_RGBA8; + static const GLenum overlay_gl_format = GL_BGRA; + static const GLenum overlay_gl_type = GL_UNSIGNED_INT_8_8_8_8_REV; + + for (int v = 0; v < 2; v++) { + OverlayState &overlay = d->pvideo.overlays[v]; + if (!overlay.video_buffer_use) { + continue; } // TODO : Speed this up using 2 PixelBufferObjects (and use asynchronous DMA transfer)? @@ -909,27 +937,27 @@ void cxbx_gl_render_overlays(NV2AState *d) glActiveTexture(GL_TEXTURE0); GL_CHECK(); - static const GLenum overlay_gl_internal_format = GL_RGBA8; - static const GLenum overlay_gl_format = GL_BGRA; - static const GLenum overlay_gl_type = GL_UNSIGNED_INT_8_8_8_8_REV; - - hwaddr overlay_pixels = /*CONTIGUOUS_MEMORY_BASE=*/0x80000000 | overlay_offset; - if (overlay_gl_texture == -1) { - glGenTextures(1, &overlay_gl_texture); + // If we need to create a (new) overlay texture, do so + if (overlay.gl_texture == -1) { + glGenTextures(1, &overlay.gl_texture); GL_CHECK(); - glBindTexture(GL_TEXTURE_2D, overlay_gl_texture); + glBindTexture(GL_TEXTURE_2D, overlay.gl_texture); GL_CHECK(); - glTexImage2D(GL_TEXTURE_2D, 0, overlay_gl_internal_format, overlay_pitch / 4, overlay_in_height, 0, overlay_gl_format, overlay_gl_type, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, overlay_gl_internal_format, overlay.pitch / 4, overlay.in_height, 0, overlay_gl_format, overlay_gl_type, NULL); + GL_CHECK(); + } + else { + // update the YUV video texturing unit + glBindTexture(GL_TEXTURE_2D, overlay.gl_texture); GL_CHECK(); } - // update the YUV video texturing unit - glBindTexture(GL_TEXTURE_2D, overlay_gl_texture); - GL_CHECK(); static const GLint swizzle_mask_BGRA[4] = { GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA }; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_mask_BGRA); GL_CHECK(); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, overlay_pitch / 4, overlay_in_height, overlay_gl_format, overlay_gl_type, (void*)overlay_pixels); + + hwaddr overlay_pixels = /*CONTIGUOUS_MEMORY_BASE=*/0x80000000 | overlay.offset; + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, overlay.pitch / 4, overlay.in_height, overlay_gl_format, overlay_gl_type, (void*)overlay_pixels); GL_CHECK(); // Don't average YUYV samples when resizing @@ -945,26 +973,23 @@ void cxbx_gl_render_overlays(NV2AState *d) // Determine source and destination coordinates, with that draw the overlay over the framebuffer GLint srcX0 = overlay_in_s; GLint srcY0 = overlay_in_t; - GLint srcX1 = overlay_in_width; - GLint srcY1 = overlay_in_height; - GLint dstX0 = overlay_out_x; - GLint dstY0 = overlay_out_y; - GLint dstX1 = overlay_out_width; - GLint dstY1 = overlay_out_height; + GLint srcX1 = overlay.in_width; + GLint srcY1 = overlay.in_height; + GLint dstX0 = overlay.out_x; + GLint dstY0 = overlay.out_y; + GLint dstX1 = overlay.out_width; + GLint dstY1 = overlay.out_height; // Detect some special cases, for later finetuning - if (overlay_in_s != 0 || overlay_in_t != 0 || overlay_out_x != 0 || overlay_out_y != 0 || overlay_out_width != 640 || overlay_out_height != 480) { + if (overlay_in_s != 0 || overlay_in_t != 0 || !overlay.covers_framebuffer) { LOG_TEST_CASE("Non-standard overlay dimensions"); } - // Flip Y to prevent upside down rendering - GLint tmp = dstY0; dstY0 = dstY1; dstY1 = tmp; - // Convert UV coordinates to [0.0, 1.0] - GLfloat srcX0f = (GLfloat)srcX0 / overlay_in_width; - GLfloat srcX1f = (GLfloat)srcX1 / overlay_in_width; - GLfloat srcY0f = (GLfloat)srcY0 / overlay_in_height; - GLfloat srcY1f = (GLfloat)srcY1 / overlay_in_height; + GLfloat srcX0f = (GLfloat)srcX0 / overlay.in_width; + GLfloat srcX1f = (GLfloat)srcX1 / overlay.in_width; + GLfloat srcY0f = (GLfloat)srcY0 / overlay.in_height; + GLfloat srcY1f = (GLfloat)srcY1 / overlay.in_height; // Convert screen coordinates to [-1.0, 1.0] GLfloat dstX0f = (GLfloat)((dstX0 / frame_width) * 2.0f) - 1.0f; @@ -976,14 +1001,18 @@ void cxbx_gl_render_overlays(NV2AState *d) GL_CHECK(); // Attach texture #0 to the shader sampler location - glUniform1i(m_overlay_uniform_location_texture, SAMP_TEXCOORD); + glUniform1i(m_overlay_gl_uniform_location_texture, SAMP_TEXCOORD); GL_CHECK(); +#if 0 // State already set above : glActiveTexture(GL_TEXTURE0); GL_CHECK(); - glBindTexture(GL_TEXTURE_2D, overlay_gl_texture); + glBindTexture(GL_TEXTURE_2D, overlay.gl_texture); GL_CHECK(); +#endif + // Flip Y to prevent upside down rendering + std::swap(srcY0f, srcY1f); // Feed screen and texture coordinates through a vertex buffer object const GLfloat overlay_vertex_buffer_data[] = { @@ -993,48 +1022,52 @@ void cxbx_gl_render_overlays(NV2AState *d) dstX0f, dstY1f, srcX0f, srcY1f, }; - static GLuint m_framebuffer_vertex_array_name = -1; - if (m_framebuffer_vertex_array_name == -1) { - glGenVertexArrays(1, &m_framebuffer_vertex_array_name); + static GLuint overlaybuffer_gl_vertex_array_object = -1; + if (overlaybuffer_gl_vertex_array_object == -1) { + glGenVertexArrays(1, &overlaybuffer_gl_vertex_array_object); GL_CHECK(); } - glBindVertexArray(m_framebuffer_vertex_array_name); + glBindVertexArray(overlaybuffer_gl_vertex_array_object); GL_CHECK(); static GLuint overlay_gl_vertex_buffer_object = -1; if (overlay_gl_vertex_buffer_object == -1) { glGenBuffers(1, &overlay_gl_vertex_buffer_object); GL_CHECK(); + glBindBuffer(GL_ARRAY_BUFFER, overlay_gl_vertex_buffer_object); + GL_CHECK(); + glEnableVertexAttribArray(ATTR_POSITION); + GL_CHECK(); + // Bind vertex position attribute + glVertexAttribPointer( + /*index=*/ATTR_POSITION, + /*size=vec*/2, + /*type=*/GL_FLOAT, + /*normalized?=*/GL_FALSE, + /*stride=*/4 * sizeof(GLfloat), + /*array buffer offset=*/(void*)0 + ); + GL_CHECK(); + glEnableVertexAttribArray(ATTR_TEXCOORD); + GL_CHECK(); + // Bind vertex texture coordinate attribute + glVertexAttribPointer( + /*index=*/ATTR_TEXCOORD, + /*size=vec*/2, + /*type=*/GL_FLOAT, + /*normalized?=*/GL_FALSE, + /*stride=*/4 * sizeof(GLfloat), + /*array buffer offset=*/(void*)(2 * sizeof(GLfloat)) + ); + GL_CHECK(); + } + else { + glBindBuffer(GL_ARRAY_BUFFER, overlay_gl_vertex_buffer_object); + GL_CHECK(); } - glBindBuffer(GL_ARRAY_BUFFER, overlay_gl_vertex_buffer_object); - GL_CHECK(); glBufferData(GL_ARRAY_BUFFER, sizeof(overlay_vertex_buffer_data), overlay_vertex_buffer_data, GL_STREAM_DRAW); GL_CHECK(); - // Bind vertex position attribute - glVertexAttribPointer( - /*index=*/ATTR_POSITION, - /*size=vec*/2, - /*type=*/GL_FLOAT, - /*normalized?=*/GL_FALSE, - /*stride=*/4*sizeof(GLfloat), - /*array buffer offset=*/(void*)0 - ); - GL_CHECK(); - // Bind vertex texture coordinate attribute - glVertexAttribPointer( - /*index=*/ATTR_TEXCOORD, - /*size=vec*/2, - /*type=*/GL_FLOAT, - /*normalized?=*/GL_FALSE, - /*stride=*/4*sizeof(GLfloat), - /*array buffer offset=*/(void*)(2 * sizeof(GLfloat)) - ); - GL_CHECK(); - glEnableVertexAttribArray(ATTR_POSITION); - GL_CHECK(); - glEnableVertexAttribArray(ATTR_TEXCOORD); - GL_CHECK(); // Finally! Draw the dang overlay... glDrawArrays(GL_TRIANGLE_FAN, 0, 4); GL_CHECK(); @@ -1056,15 +1089,20 @@ void NV2ADevice::UpdateHostDisplay(NV2AState *d) // Target the host framebuffer glBindFramebuffer(GL_FRAMEBUFFER, 0); -// glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); GL_CHECK(); glDisable(GL_CULL_FACE); GL_CHECK(); - // Is either overlay enabled and not transparent (TODO : and overlay fills entire screen) ? - if (((d->pvideo.regs[NV_PVIDEO_BUFFER] & NV_PVIDEO_BUFFER_0_USE) && (GET_MASK(d->pvideo.regs[NV_PVIDEO_FORMAT(0)], NV_PVIDEO_FORMAT_DISPLAY) == 0)) - || ((d->pvideo.regs[NV_PVIDEO_BUFFER] & NV_PVIDEO_BUFFER_1_USE) && (GET_MASK(d->pvideo.regs[NV_PVIDEO_FORMAT(1)], NV_PVIDEO_FORMAT_DISPLAY) == 0))) { + cxbx_gl_update_displaymode(); + + for (int v = 0; v < 2; v++) { + cxbx_gl_parse_overlay(d, v); + } + + // Is either overlay fullscreen ? + if (d->pvideo.overlays[0].covers_framebuffer + || d->pvideo.overlays[1].covers_framebuffer) { // Then the framebuffer won't be visible anyway, so doesn't have to be rendered } else { cxbx_gl_render_framebuffer(d); @@ -1072,6 +1110,7 @@ void NV2ADevice::UpdateHostDisplay(NV2AState *d) cxbx_gl_render_overlays(d); + // Unbind everything we've used glBindTexture(GL_TEXTURE_2D, 0); GL_CHECK(); glBindBuffer(GL_ARRAY_BUFFER, 0); @@ -1202,13 +1241,15 @@ void NV2ADevice::Init() qemu_cond_init(&d->pfifo.cache1.cache_cond); qemu_cond_init(&d->pvideo.interrupt_cond); // d->pfifo.puller_thread = std::thread(pfifo_puller_thread, d); - pgraph_init(m_nv2a_state); + pgraph_init(d); // Only spawn VBlank thread when LLE is enabled if (d->pgraph.opengl_enabled) { #ifdef DRAW_FRAMEBUFFER - cxbx_gl_initialize(d); + cxbx_gl_framebuffer_initialize(d); #endif + pvideo_init(d); + vblank_thread = std::thread(nv2a_vblank_thread, d); } diff --git a/src/devices/video/nv2a.h b/src/devices/video/nv2a.h index 52c3009c5..9ebbdc2e1 100644 --- a/src/devices/video/nv2a.h +++ b/src/devices/video/nv2a.h @@ -463,6 +463,29 @@ typedef struct Cache1State { std::queue working_cache; } Cache1State; +typedef struct OverlayState { + bool video_buffer_use; + int pitch; + bool is_transparent; +#ifdef DEBUG + hwaddr base; + hwaddr limit; +#endif + hwaddr offset; + uint32_t in_height; + uint32_t in_width; + int out_x; + int out_y; + int out_width; + int out_height; + + bool covers_framebuffer; + int old_in_width; + int old_in_height; + int old_pitch; + GLuint gl_texture = -1; +} OverlayState; + typedef struct ChannelControl { xbaddr dma_put; xbaddr dma_get; @@ -510,6 +533,7 @@ typedef struct NV2AState { uint32_t pending_interrupts; uint32_t enabled_interrupts; QemuCond interrupt_cond; + OverlayState overlays[2]; // NV2A supports 2 video overlays uint32_t regs[NV_PVIDEO_SIZE]; // TODO : union } pvideo; From 7f8c0903ce67e0aa1b609da1de9c383303b88cc3 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Thu, 5 Jul 2018 09:47:44 +0200 Subject: [PATCH 0083/1000] LLE : Detect framebuffer format changes --- src/devices/video/nv2a.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index 2a143b01a..765f316bd 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -750,6 +750,9 @@ void cxbx_gl_update_displaymode() { // Convert AV Format to OpenGl format details & destroy the texture if format changed. // This is required for titles that use a non ARGB framebuffer, such as Beats of Rage static ULONG PreviousAvDisplayModeFormat = -1; + static GLenum old_frame_gl_internal_format = GL_RGBA8; + static GLenum old_frame_gl_format = GL_BGRA; + static GLenum old_frame_gl_type = GL_UNSIGNED_INT_8_8_8_8_REV; static GLsizei old_frame_width = 640; static GLsizei old_frame_height = 480; @@ -758,8 +761,14 @@ void cxbx_gl_update_displaymode() { AvDisplayModeFormatToGL(g_AvDisplayModeFormat, &frame_gl_internal_format, &frame_gl_format, &frame_gl_type); AvGetFormatSize(AvpCurrentMode, &frame_width, &frame_height); // Detect changes in framebuffer dimensions - if (old_frame_width != frame_width + if (old_frame_gl_internal_format != frame_gl_internal_format + || old_frame_gl_format != frame_gl_format + || old_frame_gl_type != frame_gl_type + || old_frame_width != frame_width || old_frame_height != frame_height) { + old_frame_gl_internal_format = frame_gl_internal_format; + old_frame_gl_format = frame_gl_format; + old_frame_gl_type = frame_gl_type; old_frame_width = frame_width; old_frame_height = frame_height; if (frame_gl_texture != -1) { @@ -886,7 +895,7 @@ void cxbx_gl_parse_overlay(NV2AState *d, int v) #endif // Derive actual attributes overlay.pitch = overlay_format & NV_PVIDEO_FORMAT_PITCH; - overlay.is_transparent = GET_MASK(overlay_format, NV_PVIDEO_FORMAT_DISPLAY); + overlay.is_transparent = overlay_format & NV_PVIDEO_FORMAT_DISPLAY; overlay.offset = overlay_offset_high_26 | overlay_offset_lower_6; uint32_t overlay_size_in_height_width = overlay_size_in - (overlay_offset_lower_6 >> 1); From e7ac16ef0a27e82d0b4e2bf98d5659cf56e07e8a Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Thu, 5 Jul 2018 13:13:44 +0200 Subject: [PATCH 0084/1000] LLE : More cleanup --- src/devices/video/nv2a.cpp | 171 +++++++++++++++---------------------- 1 file changed, 71 insertions(+), 100 deletions(-) diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index 765f316bd..e7b15a112 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -690,7 +690,7 @@ void InitFramebufferGeometry() GL_CHECK(); glBindBuffer(GL_ARRAY_BUFFER, m_framebuffer_gl_vertex_buffer_object); GL_CHECK(); - glEnableVertexAttribArray(ATTR_POSITION); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); GL_CHECK(); // Bind vertex position attribute glVertexAttribPointer( @@ -702,7 +702,7 @@ void InitFramebufferGeometry() /*array buffer offset=*/(void*)0 ); GL_CHECK(); - glEnableVertexAttribArray(ATTR_TEXCOORD); + glEnableVertexAttribArray(ATTR_POSITION); GL_CHECK(); // Bind vertex texture coordinate attribute glVertexAttribPointer( @@ -714,12 +714,9 @@ void InitFramebufferGeometry() /*array buffer offset=*/(void*)(2 * sizeof(GLfloat)) ); GL_CHECK(); - glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + glEnableVertexAttribArray(ATTR_TEXCOORD); GL_CHECK(); - // Unbind everything we've used - glBindBuffer(GL_ARRAY_BUFFER, 0); - GL_CHECK(); glBindVertexArray(0); GL_CHECK(); } @@ -781,32 +778,35 @@ void cxbx_gl_update_displaymode() { void cxbx_gl_render_framebuffer(NV2AState *d) { - // Render using texture #0 - glActiveTexture(GL_TEXTURE0); - GL_CHECK(); - // If we need to create a (new) texture, do so if (frame_gl_texture == -1) { glGenTextures(1, &frame_gl_texture); GL_CHECK(); glBindTexture(GL_TEXTURE_2D, frame_gl_texture); GL_CHECK(); - glTexImage2D(GL_TEXTURE_2D, 0, frame_gl_internal_format, frame_width, frame_height, 0, frame_gl_format, frame_gl_type, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); + GL_CHECK(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); + GL_CHECK(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + GL_CHECK(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + GL_CHECK(); + // TODO : Get the correct swizzle from the av format (see kelvin_color_format_map) + static const GLint swizzle_mask_RGBA[4] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA }; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_mask_RGBA); + GL_CHECK(); + glTexImage2D(GL_TEXTURE_2D, /*level=*/0, frame_gl_internal_format, frame_width, frame_height, /*border=*/0, frame_gl_format, frame_gl_type, NULL); GL_CHECK(); } else { - // Update the frame texture glBindTexture(GL_TEXTURE_2D, frame_gl_texture); GL_CHECK(); } - // TODO : Get the correct swizzle from the av format (see kelvin_color_format_map) - static const GLint swizzle_mask_RGBA[4] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA }; - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_mask_RGBA); - GL_CHECK(); - + // Update the frame texture hwaddr frame_pixels = /*CONTIGUOUS_MEMORY_BASE=*/0x80000000 | d->pcrtc.start; // NV_PCRTC_START - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, frame_width, frame_height, frame_gl_format, frame_gl_type, (void*)frame_pixels); + glTexSubImage2D(GL_TEXTURE_2D, /*level=*/0, /*xoffset=*/0, /*yoffset=*/0, frame_width, frame_height, frame_gl_format, frame_gl_type, (void*)frame_pixels); GL_CHECK(); // Note : The following is modelled partially after pgraph_update_surface() @@ -826,22 +826,12 @@ void cxbx_gl_render_framebuffer(NV2AState *d) GL_CHECK(); glUniform1i(m_framebuffer_gl_uniform_location_texture, SAMP_TEXCOORD); GL_CHECK(); -#if 0 // State already set above : - glActiveTexture(GL_TEXTURE0); - GL_CHECK(); - glBindTexture(GL_TEXTURE_2D, frame_gl_texture); - GL_CHECK(); -#endif glBindVertexArray(m_framebuffer_gl_vertex_array_object); GL_CHECK(); - glBindBuffer(GL_ARRAY_BUFFER, m_framebuffer_gl_vertex_buffer_object); - GL_CHECK(); - glEnableVertexAttribArray(ATTR_POSITION); - GL_CHECK(); - glEnableVertexAttribArray(ATTR_TEXCOORD); - GL_CHECK(); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); GL_CHECK(); + glBindVertexArray(0); + GL_CHECK(); #else // If we need to create an OpenGL framebuffer, do so static GLuint frame_gl_framebuffer = -1; @@ -861,6 +851,9 @@ void cxbx_gl_render_framebuffer(NV2AState *d) // Note : dstY0 and dstY1 are swapped so the screen doesn't appear upside down glBlitFramebuffer(0, 0, frame_width, frame_height, 0, 480, 640, 0, GL_COLOR_BUFFER_BIT, filter); GL_CHECK(); + // Detach internal framebuffer + glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); + GL_CHECK(); #endif } @@ -942,37 +935,35 @@ void cxbx_gl_render_overlays(NV2AState *d) // TODO : Speed this up using 2 PixelBufferObjects (and use asynchronous DMA transfer)? - // Render using texture #0 - glActiveTexture(GL_TEXTURE0); - GL_CHECK(); - // If we need to create a (new) overlay texture, do so if (overlay.gl_texture == -1) { glGenTextures(1, &overlay.gl_texture); GL_CHECK(); glBindTexture(GL_TEXTURE_2D, overlay.gl_texture); GL_CHECK(); - glTexImage2D(GL_TEXTURE_2D, 0, overlay_gl_internal_format, overlay.pitch / 4, overlay.in_height, 0, overlay_gl_format, overlay_gl_type, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); + GL_CHECK(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); + GL_CHECK(); + // Don't average YUYV samples when resizing + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + GL_CHECK(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + GL_CHECK(); + static const GLint swizzle_mask_BGRA[4] = { GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA }; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_mask_BGRA); + GL_CHECK(); + glTexImage2D(GL_TEXTURE_2D, /*level=*/0, overlay_gl_internal_format, overlay.pitch / 4, overlay.in_height, /*border=*/0, overlay_gl_format, overlay_gl_type, NULL); GL_CHECK(); } else { - // update the YUV video texturing unit glBindTexture(GL_TEXTURE_2D, overlay.gl_texture); GL_CHECK(); } - static const GLint swizzle_mask_BGRA[4] = { GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA }; - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_mask_BGRA); - GL_CHECK(); - + // Update the YUV video texture hwaddr overlay_pixels = /*CONTIGUOUS_MEMORY_BASE=*/0x80000000 | overlay.offset; - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, overlay.pitch / 4, overlay.in_height, overlay_gl_format, overlay_gl_type, (void*)overlay_pixels); - GL_CHECK(); - - // Don't average YUYV samples when resizing - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - GL_CHECK(); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexSubImage2D(GL_TEXTURE_2D, /*level=*/0, /*xoffset=*/0, /*yoffset=*/0, overlay.pitch / 4, overlay.in_height, overlay_gl_format, overlay_gl_type, (void*)overlay_pixels); GL_CHECK(); // Note : we cannot convert overlay_offset into actual top/left coordinate, so assume (0,0) @@ -1013,13 +1004,6 @@ void cxbx_gl_render_overlays(NV2AState *d) glUniform1i(m_overlay_gl_uniform_location_texture, SAMP_TEXCOORD); GL_CHECK(); -#if 0 // State already set above : - glActiveTexture(GL_TEXTURE0); - GL_CHECK(); - - glBindTexture(GL_TEXTURE_2D, overlay.gl_texture); - GL_CHECK(); -#endif // Flip Y to prevent upside down rendering std::swap(srcY0f, srcY1f); @@ -1031,51 +1015,39 @@ void cxbx_gl_render_overlays(NV2AState *d) dstX0f, dstY1f, srcX0f, srcY1f, }; - static GLuint overlaybuffer_gl_vertex_array_object = -1; - if (overlaybuffer_gl_vertex_array_object == -1) { - glGenVertexArrays(1, &overlaybuffer_gl_vertex_array_object); - GL_CHECK(); - } - glBindVertexArray(overlaybuffer_gl_vertex_array_object); - GL_CHECK(); - static GLuint overlay_gl_vertex_buffer_object = -1; if (overlay_gl_vertex_buffer_object == -1) { - glGenBuffers(1, &overlay_gl_vertex_buffer_object); - GL_CHECK(); - glBindBuffer(GL_ARRAY_BUFFER, overlay_gl_vertex_buffer_object); - GL_CHECK(); - glEnableVertexAttribArray(ATTR_POSITION); - GL_CHECK(); - // Bind vertex position attribute - glVertexAttribPointer( - /*index=*/ATTR_POSITION, - /*size=vec*/2, - /*type=*/GL_FLOAT, - /*normalized?=*/GL_FALSE, - /*stride=*/4 * sizeof(GLfloat), - /*array buffer offset=*/(void*)0 - ); - GL_CHECK(); - glEnableVertexAttribArray(ATTR_TEXCOORD); - GL_CHECK(); - // Bind vertex texture coordinate attribute - glVertexAttribPointer( - /*index=*/ATTR_TEXCOORD, - /*size=vec*/2, - /*type=*/GL_FLOAT, - /*normalized?=*/GL_FALSE, - /*stride=*/4 * sizeof(GLfloat), - /*array buffer offset=*/(void*)(2 * sizeof(GLfloat)) - ); - GL_CHECK(); - } - else { - glBindBuffer(GL_ARRAY_BUFFER, overlay_gl_vertex_buffer_object); + glGenBuffers(1, &overlay_gl_vertex_buffer_object); GL_CHECK(); } - glBufferData(GL_ARRAY_BUFFER, sizeof(overlay_vertex_buffer_data), overlay_vertex_buffer_data, GL_STREAM_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, overlay_gl_vertex_buffer_object); + GL_CHECK(); + glBufferData(GL_ARRAY_BUFFER, sizeof(overlay_vertex_buffer_data), overlay_vertex_buffer_data, GL_DYNAMIC_DRAW); + GL_CHECK(); + // Bind vertex position attribute + glVertexAttribPointer( + /*index=*/ATTR_POSITION, + /*size=vec*/2, + /*type=*/GL_FLOAT, + /*normalized?=*/GL_FALSE, + /*stride=*/4 * sizeof(GLfloat), + /*array buffer offset=*/(void*)0 + ); + GL_CHECK(); + glEnableVertexAttribArray(ATTR_POSITION); + GL_CHECK(); + // Bind vertex texture coordinate attribute + glVertexAttribPointer( + /*index=*/ATTR_TEXCOORD, + /*size=vec*/2, + /*type=*/GL_FLOAT, + /*normalized?=*/GL_FALSE, + /*stride=*/4 * sizeof(GLfloat), + /*array buffer offset=*/(void*)(2 * sizeof(GLfloat)) + ); + GL_CHECK(); + glEnableVertexAttribArray(ATTR_TEXCOORD); GL_CHECK(); // Finally! Draw the dang overlay... glDrawArrays(GL_TRIANGLE_FAN, 0, 4); @@ -1099,9 +1071,11 @@ void NV2ADevice::UpdateHostDisplay(NV2AState *d) // Target the host framebuffer glBindFramebuffer(GL_FRAMEBUFFER, 0); GL_CHECK(); - glDisable(GL_CULL_FACE); GL_CHECK(); + // Render using texture #0 + glActiveTexture(GL_TEXTURE0); + GL_CHECK(); cxbx_gl_update_displaymode(); @@ -1120,15 +1094,12 @@ void NV2ADevice::UpdateHostDisplay(NV2AState *d) cxbx_gl_render_overlays(d); // Unbind everything we've used - glBindTexture(GL_TEXTURE_2D, 0); + glUseProgram(0); GL_CHECK(); glBindBuffer(GL_ARRAY_BUFFER, 0); GL_CHECK(); - glBindVertexArray(0); + glBindTexture(GL_TEXTURE_2D, 0); GL_CHECK(); - glUseProgram(0); - GL_CHECK(); - // Restore xbox framebuffer glBindFramebuffer(GL_FRAMEBUFFER, d->pgraph.gl_framebuffer); GL_CHECK(); From 1e043178334272f6f118addb58cc919943c605a1 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Thu, 5 Jul 2018 15:29:34 +0200 Subject: [PATCH 0085/1000] LLE : Framebuffer drawing works! (Ditched blitting) --- src/devices/video/nv2a.cpp | 219 ++++++++++++++----------------------- 1 file changed, 83 insertions(+), 136 deletions(-) diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index e7b15a112..0fac25814 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -575,16 +575,9 @@ GLuint Get_YUV_to_RGB_shader_program() return shader_program_name_yuv_to_rgb; } -//#define DRAW_FRAMEBUFFER // Doesn't show anything yet - -#ifdef DRAW_FRAMEBUFFER - -GLuint m_framebuffer_gl_shader_program = -1; GLuint m_framebuffer_gl_uniform_location_texture = -1; -GLuint m_framebuffer_gl_vertex_buffer_object = -1; -GLuint m_framebuffer_gl_vertex_array_object = -1; -void InitFramebufferShaders(void) +GLuint GetFramebufferShaderProgram() { static const char *gl_framebuffer_shader_src[2] = { /* vertex shader */ @@ -632,109 +625,51 @@ void InitFramebufferShaders(void) "} \n" }; - // Compile vertex shader - GLuint vertex_shader = create_gl_shader(GL_VERTEX_SHADER, gl_framebuffer_shader_src[0], "Framebuffer vertex shader"); - GL_CHECK(); - // Compile fragment shader - GLuint fragment_shader = create_gl_shader(GL_FRAGMENT_SHADER, gl_framebuffer_shader_src[1], "Framebuffer fragment shader"); - GL_CHECK(); + // Bind shader + static GLuint m_framebuffer_gl_shader_program = -1; + if (m_framebuffer_gl_shader_program == -1) { + m_framebuffer_gl_shader_program = glCreateProgram(); + // Compile vertex shader + GLuint vertex_shader = create_gl_shader(GL_VERTEX_SHADER, gl_framebuffer_shader_src[0], "Framebuffer vertex shader"); + GL_CHECK(); + // Compile fragment shader + GLuint fragment_shader = create_gl_shader(GL_FRAGMENT_SHADER, gl_framebuffer_shader_src[1], "Framebuffer fragment shader"); + GL_CHECK(); - m_framebuffer_gl_shader_program = glCreateProgram(); - GL_CHECK(); - // Link vertex and fragment shaders - glAttachShader(m_framebuffer_gl_shader_program, vertex_shader); - GL_CHECK(); - glAttachShader(m_framebuffer_gl_shader_program, fragment_shader); - GL_CHECK(); - glBindAttribLocation(m_framebuffer_gl_shader_program, ATTR_POSITION, "Position"); - GL_CHECK(); - glBindAttribLocation(m_framebuffer_gl_shader_program, ATTR_TEXCOORD, "Texcoord"); - GL_CHECK(); - glBindFragDataLocation(m_framebuffer_gl_shader_program, FRAG_COLOR, "Color"); - GL_CHECK(); - glLinkProgram(m_framebuffer_gl_shader_program); - GL_CHECK(); + GL_CHECK(); + // Link vertex and fragment shaders + glAttachShader(m_framebuffer_gl_shader_program, vertex_shader); + GL_CHECK(); + glAttachShader(m_framebuffer_gl_shader_program, fragment_shader); + GL_CHECK(); + glBindAttribLocation(m_framebuffer_gl_shader_program, ATTR_POSITION, "Position"); + GL_CHECK(); + glBindAttribLocation(m_framebuffer_gl_shader_program, ATTR_TEXCOORD, "Texcoord"); + GL_CHECK(); + glBindFragDataLocation(m_framebuffer_gl_shader_program, FRAG_COLOR, "Color"); + GL_CHECK(); + glLinkProgram(m_framebuffer_gl_shader_program); + GL_CHECK(); - /* Check it linked */ - GLint linked = 0; - glGetProgramiv(m_framebuffer_gl_shader_program, GL_LINK_STATUS, &linked); - GL_CHECK(); - if (!linked) { - GLchar log[2048]; - glGetProgramInfoLog(m_framebuffer_gl_shader_program, 2048, NULL, log); - fprintf(stderr, "nv2a: shader linking failed: %s\n", log); - abort(); + /* Check it linked */ + GLint linked = 0; + glGetProgramiv(m_framebuffer_gl_shader_program, GL_LINK_STATUS, &linked); + GL_CHECK(); + if (!linked) { + GLchar log[2048]; + glGetProgramInfoLog(m_framebuffer_gl_shader_program, 2048, NULL, log); + fprintf(stderr, "nv2a: shader linking failed: %s\n", log); + abort(); + } + + m_framebuffer_gl_uniform_location_texture = glGetUniformLocation(m_framebuffer_gl_shader_program, "tex"); + GL_CHECK(); + assert(m_framebuffer_gl_uniform_location_texture >= 0); } - m_framebuffer_gl_uniform_location_texture = glGetUniformLocation(m_framebuffer_gl_shader_program, "tex"); - GL_CHECK(); - assert(m_framebuffer_gl_uniform_location_texture >= 0); + return m_framebuffer_gl_shader_program; } -void InitFramebufferGeometry() -{ - static const GLfloat vertices[] = { - // x y s t - -1.0f, -1.0f, 0.0f, 0.0f, // BL - 1.0f, -1.0f, 1.0f, 0.0f, // BR - 1.0f, 1.0f, 1.0f, 1.0f, // TR - -1.0f, 1.0f, 0.0f, 1.0f, // TL - }; - - glGenVertexArrays(1, &m_framebuffer_gl_vertex_array_object); - GL_CHECK(); - glBindVertexArray(m_framebuffer_gl_vertex_array_object); - GL_CHECK(); - // Populate vertex buffer - glGenBuffers(1, &m_framebuffer_gl_vertex_buffer_object); - GL_CHECK(); - glBindBuffer(GL_ARRAY_BUFFER, m_framebuffer_gl_vertex_buffer_object); - GL_CHECK(); - glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - GL_CHECK(); - // Bind vertex position attribute - glVertexAttribPointer( - /*index=*/ATTR_POSITION, - /*size=vec*/2, - /*type=*/GL_FLOAT, - /*normalized?=*/GL_FALSE, - /*stride=*/4 * sizeof(GLfloat), - /*array buffer offset=*/(void*)0 - ); - GL_CHECK(); - glEnableVertexAttribArray(ATTR_POSITION); - GL_CHECK(); - // Bind vertex texture coordinate attribute - glVertexAttribPointer( - /*index=*/ATTR_TEXCOORD, - /*size=vec*/2, - /*type=*/GL_FLOAT, - /*normalized?=*/GL_FALSE, - /*stride=*/4 * sizeof(GLfloat), - /*array buffer offset=*/(void*)(2 * sizeof(GLfloat)) - ); - GL_CHECK(); - glEnableVertexAttribArray(ATTR_TEXCOORD); - GL_CHECK(); - // Unbind everything we've used - glBindVertexArray(0); - GL_CHECK(); -} - -void cxbx_gl_framebuffer_initialize(NV2AState *d) -{ - lockGL(&d->pgraph); - - GL_RESET(); - - InitFramebufferShaders(); - InitFramebufferGeometry(); - - unlockGL(&d->pgraph); -} - -#endif // DRAW_FRAMEBUFFER - static GLenum frame_gl_internal_format = GL_RGBA8; static GLenum frame_gl_format = GL_BGRA; static GLenum frame_gl_type = GL_UNSIGNED_INT_8_8_8_8_REV; @@ -820,41 +755,56 @@ void cxbx_gl_render_framebuffer(NV2AState *d) GL_CHECK(); #endif -#ifdef DRAW_FRAMEBUFFER // Draw frame texture to an internal frame buffer - glUseProgram(m_framebuffer_gl_shader_program); + glUseProgram(GetFramebufferShaderProgram()); GL_CHECK(); glUniform1i(m_framebuffer_gl_uniform_location_texture, SAMP_TEXCOORD); GL_CHECK(); - glBindVertexArray(m_framebuffer_gl_vertex_array_object); + + static const GLfloat vertices[] = { + // x y s t + -1.0f, -1.0f, 0.0f, 1.0f, // BL + 1.0f, -1.0f, 1.0f, 1.0f, // BR + 1.0f, 1.0f, 1.0f, 0.0f, // TR + -1.0f, 1.0f, 0.0f, 0.0f, // TL + }; + + // Populate vertex buffer + static GLuint m_framebuffer_gl_vertex_buffer_object = -1; + if (m_framebuffer_gl_vertex_buffer_object == -1) { + glGenBuffers(1, &m_framebuffer_gl_vertex_buffer_object); + GL_CHECK(); + } + glBindBuffer(GL_ARRAY_BUFFER, m_framebuffer_gl_vertex_buffer_object); + GL_CHECK(); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW); + GL_CHECK(); + // Bind vertex position attribute + glVertexAttribPointer( + /*index=*/ATTR_POSITION, + /*size=vec*/2, + /*type=*/GL_FLOAT, + /*normalized?=*/GL_FALSE, + /*stride=*/4 * sizeof(GLfloat), + /*array buffer offset=*/(void*)0 + ); + GL_CHECK(); + glEnableVertexAttribArray(ATTR_POSITION); + GL_CHECK(); + // Bind vertex texture coordinate attribute + glVertexAttribPointer( + /*index=*/ATTR_TEXCOORD, + /*size=vec*/2, + /*type=*/GL_FLOAT, + /*normalized?=*/GL_FALSE, + /*stride=*/4 * sizeof(GLfloat), + /*array buffer offset=*/(void*)(2 * sizeof(GLfloat)) + ); + GL_CHECK(); + glEnableVertexAttribArray(ATTR_TEXCOORD); GL_CHECK(); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); GL_CHECK(); - glBindVertexArray(0); - GL_CHECK(); -#else - // If we need to create an OpenGL framebuffer, do so - static GLuint frame_gl_framebuffer = -1; - if (frame_gl_framebuffer == -1) { - glGenFramebuffers(1, &frame_gl_framebuffer); - GL_CHECK(); - } - - // Copy frame texture to an internal frame buffer - glBindFramebuffer(GL_READ_FRAMEBUFFER, frame_gl_framebuffer); - GL_CHECK(); - glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, frame_gl_texture, /*level=*/0); - GL_CHECK(); - // Blit the active internal 'read' frame buffer to the actual 'draw' framebuffer - static const GLenum filter = GL_NEAREST; - // TODO: Use window size/actual framebuffer size rather than hard coding 640x480 - // Note : dstY0 and dstY1 are swapped so the screen doesn't appear upside down - glBlitFramebuffer(0, 0, frame_width, frame_height, 0, 480, 640, 0, GL_COLOR_BUFFER_BIT, filter); - GL_CHECK(); - // Detach internal framebuffer - glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); - GL_CHECK(); -#endif } void pvideo_init(NV2AState *d) @@ -1225,9 +1175,6 @@ void NV2ADevice::Init() // Only spawn VBlank thread when LLE is enabled if (d->pgraph.opengl_enabled) { -#ifdef DRAW_FRAMEBUFFER - cxbx_gl_framebuffer_initialize(d); -#endif pvideo_init(d); vblank_thread = std::thread(nv2a_vblank_thread, d); From c56e76d1ca9a7cf9d6a73d66102492c1baf5e70b Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Thu, 5 Jul 2018 15:39:18 +0200 Subject: [PATCH 0086/1000] LLE : Make GL_RESET() and GL_CHECK() macro's a no-up when compiled without DEBUG_NV2A_GL --- src/devices/video/nv2a.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index 0fac25814..7c2ff264a 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -425,8 +425,13 @@ void _check_gl_error(const char *file, int line) } } +#ifdef DEBUG_NV2A_GL #define GL_RESET() _check_gl_reset() #define GL_CHECK() _check_gl_error(__FILE__,__LINE__) +#else +#define GL_RESET() +#define GL_CHECK() +#endif enum { SAMP_TEXCOORD = 0, From 7dd02fdf709955a214899b307a5e377a84cf511a Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Thu, 5 Jul 2018 17:12:46 +0200 Subject: [PATCH 0087/1000] LLE : Graceful shutdown, avoiding exceptions --- src/CxbxKrnl/CxbxKrnl.cpp | 2 ++ src/devices/video/EmuNV2A_PFIFO.cpp | 6 ++++ src/devices/video/EmuNV2A_PGRAPH.cpp | 6 ++++ src/devices/video/nv2a.cpp | 53 +++++++++++++++++++++------- src/devices/video/nv2a.h | 2 +- 5 files changed, 56 insertions(+), 13 deletions(-) diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index 65b12ab83..12cae1405 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -1694,6 +1694,8 @@ void CxbxKrnlShutDown() int BootFlags = 0; g_EmuShared->SetBootFlags(&BootFlags); + delete g_NV2A; // TODO : g_pXbox + if (CxbxKrnl_hEmuParent != NULL) SendMessage(CxbxKrnl_hEmuParent, WM_PARENTNOTIFY, WM_DESTROY, 0); diff --git a/src/devices/video/EmuNV2A_PFIFO.cpp b/src/devices/video/EmuNV2A_PFIFO.cpp index 54476d251..d2e6c3be5 100644 --- a/src/devices/video/EmuNV2A_PFIFO.cpp +++ b/src/devices/video/EmuNV2A_PFIFO.cpp @@ -399,6 +399,12 @@ int pfifo_puller_thread(NV2AState *d) qemu_mutex_lock(&d->pgraph.lock); while (!state->working_cache.empty()) { + if (d->exiting) { + qemu_mutex_lock(&d->pgraph.lock); + glo_set_current(NULL); + return 0; + } + CacheEntry* command = state->working_cache.front(); state->working_cache.pop(); diff --git a/src/devices/video/EmuNV2A_PGRAPH.cpp b/src/devices/video/EmuNV2A_PGRAPH.cpp index c17e68574..83cce536d 100644 --- a/src/devices/video/EmuNV2A_PGRAPH.cpp +++ b/src/devices/video/EmuNV2A_PGRAPH.cpp @@ -2854,6 +2854,12 @@ void pgraph_destroy(PGRAPHState *pg) unlockGL(pg); } + + qemu_mutex_destroy(&pg->lock); + qemu_mutex_destroy(&pg->gl_lock); + qemu_cond_destroy(&pg->interrupt_cond); + qemu_cond_destroy(&pg->fifo_access_cond); + qemu_cond_destroy(&pg->flip_3d); } static void pgraph_update_shader_constants(PGRAPHState *pg, diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index 7c2ff264a..bc5daa48e 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -678,7 +678,7 @@ GLuint GetFramebufferShaderProgram() static GLenum frame_gl_internal_format = GL_RGBA8; static GLenum frame_gl_format = GL_BGRA; static GLenum frame_gl_type = GL_UNSIGNED_INT_8_8_8_8_REV; -static GLuint frame_gl_texture = -1; +static GLuint frame_gl_texture = 0; static GLsizei frame_width = 640; static GLsizei frame_height = 480; @@ -708,9 +708,9 @@ void cxbx_gl_update_displaymode() { old_frame_gl_type = frame_gl_type; old_frame_width = frame_width; old_frame_height = frame_height; - if (frame_gl_texture != -1) { + if (frame_gl_texture) { glDeleteTextures(1, &frame_gl_texture); - frame_gl_texture = -1; + frame_gl_texture = 0; } } } @@ -719,7 +719,7 @@ void cxbx_gl_update_displaymode() { void cxbx_gl_render_framebuffer(NV2AState *d) { // If we need to create a (new) texture, do so - if (frame_gl_texture == -1) { + if (!frame_gl_texture) { glGenTextures(1, &frame_gl_texture); GL_CHECK(); glBindTexture(GL_TEXTURE_2D, frame_gl_texture); @@ -814,8 +814,23 @@ void cxbx_gl_render_framebuffer(NV2AState *d) void pvideo_init(NV2AState *d) { - d->pvideo.overlays[0].gl_texture = -1; - d->pvideo.overlays[1].gl_texture = -1; + d->pvideo.overlays[0].gl_texture = 0; + d->pvideo.overlays[1].gl_texture = 0; + //qemu_cond_init(&d->pvideo.interrupt_cond); +} + +void pvideo_destroy(NV2AState *d) +{ + if (d->pvideo.overlays[0].gl_texture) { + glDeleteTextures(1, &d->pvideo.overlays[0].gl_texture); + d->pvideo.overlays[0].gl_texture = 0; + } + + if (d->pvideo.overlays[1].gl_texture) { + glDeleteTextures(1, &d->pvideo.overlays[1].gl_texture); + d->pvideo.overlays[1].gl_texture = 0; + } + //qemu_cond_destroy(&d->pvideo.interrupt_cond); } void cxbx_gl_parse_overlay(NV2AState *d, int v) @@ -862,9 +877,9 @@ void cxbx_gl_parse_overlay(NV2AState *d, int v) overlay.old_in_width = overlay.in_width; overlay.old_in_height = overlay.in_height; overlay.old_pitch = overlay.pitch; - if (overlay.gl_texture != -1) { + if (overlay.gl_texture) { glDeleteTextures(1, &overlay.gl_texture); - overlay.gl_texture = -1; + overlay.gl_texture = 0; } } @@ -891,7 +906,7 @@ void cxbx_gl_render_overlays(NV2AState *d) // TODO : Speed this up using 2 PixelBufferObjects (and use asynchronous DMA transfer)? // If we need to create a (new) overlay texture, do so - if (overlay.gl_texture == -1) { + if (!overlay.gl_texture) { glGenTextures(1, &overlay.gl_texture); GL_CHECK(); glBindTexture(GL_TEXTURE_2D, overlay.gl_texture); @@ -1074,7 +1089,7 @@ static void nv2a_vblank_thread(NV2AState *d) CxbxSetThreadName("Cxbx NV2A VBLANK"); auto nextVBlankTime = GetNextVBlankTime(); - while (true) { + while (!d->exiting) { // Handle VBlank if (std::chrono::steady_clock::now() > nextVBlankTime) { d->pcrtc.pending_interrupts |= NV_PCRTC_INTR_0_VBLANK; @@ -1136,6 +1151,7 @@ NV2ADevice::NV2ADevice() NV2ADevice::~NV2ADevice() { + Reset(); // TODO : Review this delete m_nv2a_state; } @@ -1174,8 +1190,6 @@ void NV2ADevice::Init() // Setup the conditions/mutexes qemu_mutex_init(&d->pfifo.cache1.cache_lock); qemu_cond_init(&d->pfifo.cache1.cache_cond); - qemu_cond_init(&d->pvideo.interrupt_cond); -// d->pfifo.puller_thread = std::thread(pfifo_puller_thread, d); pgraph_init(d); // Only spawn VBlank thread when LLE is enabled @@ -1190,6 +1204,21 @@ void NV2ADevice::Init() void NV2ADevice::Reset() { + NV2AState *d = m_nv2a_state; // glue + if (!d) return; + + d->exiting = true; + qemu_cond_signal(&d->pfifo.cache1.cache_cond); + d->pfifo.puller_thread.join(); // was qemu_thread_join(&d->pfifo.puller_thread); + + if (d->pgraph.opengl_enabled) { + vblank_thread.join(); + pvideo_destroy(d); + } + + pgraph_destroy(&d->pgraph); + qemu_mutex_destroy(&d->pfifo.cache1.cache_lock); + qemu_cond_destroy(&d->pfifo.cache1.cache_cond); } uint32_t NV2ADevice::IORead(int barIndex, uint32_t port, unsigned size) diff --git a/src/devices/video/nv2a.h b/src/devices/video/nv2a.h index 9ebbdc2e1..e215f0d38 100644 --- a/src/devices/video/nv2a.h +++ b/src/devices/video/nv2a.h @@ -532,7 +532,7 @@ typedef struct NV2AState { struct { uint32_t pending_interrupts; uint32_t enabled_interrupts; - QemuCond interrupt_cond; + //QemuCond interrupt_cond; OverlayState overlays[2]; // NV2A supports 2 video overlays uint32_t regs[NV_PVIDEO_SIZE]; // TODO : union } pvideo; From cd5069705b3459daf8dc0031d4939c523d658970 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Mon, 9 Jul 2018 16:21:46 +0200 Subject: [PATCH 0088/1000] LLE : Simplified and improved swizzle masks. Introduced NV2ADevice::BlockRead/Write for faster hardcoded MMIO. Also, 16 bit framebuffers now read their width from VGa control registers. --- src/CxbxKrnl/EmuKrnlAv.cpp | 28 ++-- src/devices/video/EmuNV2A_PGRAPH.cpp | 107 ++++++++------ src/devices/video/nv2a.cpp | 211 +++++++++++++++------------ src/devices/video/nv2a.h | 4 + 4 files changed, 202 insertions(+), 148 deletions(-) diff --git a/src/CxbxKrnl/EmuKrnlAv.cpp b/src/CxbxKrnl/EmuKrnlAv.cpp index 5ce1e5a60..e63e09df2 100644 --- a/src/CxbxKrnl/EmuKrnlAv.cpp +++ b/src/CxbxKrnl/EmuKrnlAv.cpp @@ -58,7 +58,9 @@ namespace NtDll #include "EmuX86.h" #include "EmuKrnlAvModes.h" +#include "devices\Xbox.h" // For g_NV2A #include "devices\video\nv2a_int.h" +#include "devices\video\nv2a.h" // For NV2ABlockInfo, EmuNV2A_Block() #ifndef VOID #define VOID void @@ -87,27 +89,34 @@ VOID REG_WR32(VOID* Ptr, xboxkrnl::ULONG Addr, xboxkrnl::ULONG Val) VOID CRTC_WR(VOID* Ptr, xboxkrnl::UCHAR i, xboxkrnl::UCHAR d) { - REG_WR08(Ptr, NV_PRMCIO_CRX__COLOR, i); - REG_WR08(Ptr, NV_PRMCIO_CR__COLOR, d); + static const NV2ABlockInfo* block = EmuNV2A_Block(NV_PRMCIO_CRX__COLOR); + + g_NV2A->BlockWrite(block, NV_PRMCIO_CRX__COLOR, i, sizeof(uint8_t)); + g_NV2A->BlockWrite(block, NV_PRMCIO_CR__COLOR, d, sizeof(uint8_t)); } VOID SRX_WR(VOID *Ptr, xboxkrnl::UCHAR i, xboxkrnl::UCHAR d) - { - REG_WR08(Ptr, NV_PRMVIO_SRX, i); - REG_WR08(Ptr, NV_PRMVIO_SR, (d)); + static const NV2ABlockInfo* block = EmuNV2A_Block(NV_PRMVIO_SRX); + + g_NV2A->BlockWrite(block, NV_PRMVIO_SRX, i, sizeof(uint8_t)); + g_NV2A->BlockWrite(block, NV_PRMVIO_SR, d, sizeof(uint8_t)); } VOID GRX_WR(VOID *Ptr, xboxkrnl::UCHAR i, xboxkrnl::UCHAR d) { - REG_WR08(Ptr, NV_PRMVIO_GRX, i); - REG_WR08(Ptr, NV_PRMVIO_GX, (d)); + static const NV2ABlockInfo* block = EmuNV2A_Block(NV_PRMVIO_GRX); + + g_NV2A->BlockWrite(block, NV_PRMVIO_GRX, i, sizeof(uint8_t)); + g_NV2A->BlockWrite(block, NV_PRMVIO_GX, d, sizeof(uint8_t)); } VOID ARX_WR(VOID *Ptr, xboxkrnl::UCHAR i, xboxkrnl::UCHAR d) { - REG_WR08(Ptr, NV_PRMCIO_ARX, i); - REG_WR08(Ptr, NV_PRMCIO_ARX, (d)); + static const NV2ABlockInfo* block = EmuNV2A_Block(NV_PRMCIO_ARX); + + g_NV2A->BlockWrite(block, NV_PRMCIO_ARX, i, sizeof(uint8_t)); + g_NV2A->BlockWrite(block, NV_PRMCIO_ARX, d, sizeof(uint8_t)); } @@ -310,6 +319,7 @@ XBSYSAPI EXPORTNUM(3) xboxkrnl::ULONG NTAPI xboxkrnl::AvSetDisplayMode Pitch /= 8; + AvpCurrentMode = Mode; // Short-circuit the quick path for now if (AvpCurrentMode == Mode) { REG_WR32(RegisterBase, NV_PRAMDAC_GENERAL_CONTROL, GeneralControl); diff --git a/src/devices/video/EmuNV2A_PGRAPH.cpp b/src/devices/video/EmuNV2A_PGRAPH.cpp index 83cce536d..632e50856 100644 --- a/src/devices/video/EmuNV2A_PGRAPH.cpp +++ b/src/devices/video/EmuNV2A_PGRAPH.cpp @@ -137,17 +137,28 @@ typedef struct ColorFormatInfo { GLint gl_internal_format; GLenum gl_format; // == 0 for compressed formats GLenum gl_type; - GLint gl_swizzle_mask[4]; + GLint *gl_swizzle_mask; } ColorFormatInfo; +static GLint gl_swizzle_mask_0RG1[4] = { GL_ZERO, GL_RED, GL_GREEN, GL_ONE }; +static GLint gl_swizzle_mask_111R[4] = { GL_ONE, GL_ONE, GL_ONE, GL_RED }; +static GLint gl_swizzle_mask_ARGB[4] = { GL_ALPHA, GL_RED, GL_GREEN, GL_BLUE }; +static GLint gl_swizzle_mask_BGRA[4] = { GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA }; +static GLint gl_swizzle_mask_GGGR[4] = { GL_GREEN, GL_GREEN, GL_GREEN, GL_RED }; +static GLint gl_swizzle_mask_R0G1[4] = { GL_RED, GL_ZERO, GL_GREEN, GL_ONE }; +static GLint gl_swizzle_mask_RRGG[4] = { GL_RED, GL_RED, GL_GREEN, GL_GREEN }; +static GLint gl_swizzle_mask_RRR1[4] = { GL_RED, GL_RED, GL_RED, GL_ONE }; +static GLint gl_swizzle_mask_RRRG[4] = { GL_RED, GL_RED, GL_RED, GL_GREEN }; +static GLint gl_swizzle_mask_RRRR[4] = { GL_RED, GL_RED, GL_RED, GL_RED }; + // Note : Avoid designated initializers to facilitate C++ builds static const ColorFormatInfo kelvin_color_format_map[256] = { //0x00 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_Y8] = {1, swizzled, GL_R8, GL_RED, GL_UNSIGNED_BYTE, - {GL_RED, GL_RED, GL_RED, GL_ONE}}, + gl_swizzle_mask_RRR1}, //0x01 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_AY8] = {1, swizzled, GL_R8, GL_RED, GL_UNSIGNED_BYTE, - {GL_RED, GL_RED, GL_RED, GL_RED}}, + gl_swizzle_mask_RRRR}, //0x02 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_A1R5G5B5] = {2, swizzled, GL_RGB5_A1, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, //0x03 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_X1R5G5B5] = @@ -187,31 +198,31 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { {4, linear, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, //0x13 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_Y8] = {1, linear, GL_R8, GL_RED, GL_UNSIGNED_BYTE, - {GL_RED, GL_RED, GL_RED, GL_ONE}}, + gl_swizzle_mask_RRR1}, //0x14 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_SY8] = {1, linear, GL_R8, GL_RED, GL_BYTE, - {GL_RED, GL_RED, GL_RED, GL_ONE}}, // TODO : Verify + gl_swizzle_mask_RRR1}, // TODO : Verify //0x15 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X7SY9] = // See convert_texture_data {2, linear, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify //0x16 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R8B8] = {2, linear, GL_RG8_SNORM, GL_RG, GL_UNSIGNED_BYTE, - {GL_RED, GL_ZERO, GL_GREEN, GL_ONE}}, // TODO : Verify + gl_swizzle_mask_R0G1}, // TODO : Verify //0x17 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_G8B8] = {2, linear, GL_RG8_SNORM, GL_RG, GL_UNSIGNED_BYTE, - {GL_ZERO, GL_RED, GL_GREEN, GL_ONE}}, // TODO : Verify + gl_swizzle_mask_0RG1}, // TODO : Verify //0x18 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_SG8SB8] = {2, linear, GL_RG8_SNORM, GL_RG, GL_BYTE, - {GL_ZERO, GL_RED, GL_GREEN, GL_ONE}}, // TODO : Verify + gl_swizzle_mask_0RG1}, // TODO : Verify //0x19 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_A8] = {1, swizzled, GL_R8, GL_RED, GL_UNSIGNED_BYTE, - {GL_ONE, GL_ONE, GL_ONE, GL_RED}}, + gl_swizzle_mask_111R}, //0x1A [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_A8Y8] = {2, swizzled, GL_RG8, GL_RG, GL_UNSIGNED_BYTE, - {GL_GREEN, GL_GREEN, GL_GREEN, GL_RED}}, + gl_swizzle_mask_GGGR}, //0x1B [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_AY8] = {1, linear, GL_R8, GL_RED, GL_UNSIGNED_BYTE, - {GL_RED, GL_RED, GL_RED, GL_RED}}, + gl_swizzle_mask_RRRR}, //0x1C [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X1R5G5B5] = {2, linear, GL_RGB5, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, //0x1D [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A4R4G4B4] = @@ -220,10 +231,10 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { {4, linear, GL_RGB8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, //0x1F [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8] = {1, linear, GL_R8, GL_RED, GL_UNSIGNED_BYTE, - {GL_ONE, GL_ONE, GL_ONE, GL_RED}}, + gl_swizzle_mask_111R}, //0x20 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8Y8] = {2, linear, GL_RG8, GL_RG, GL_UNSIGNED_BYTE, - {GL_GREEN, GL_GREEN, GL_GREEN, GL_RED}}, + gl_swizzle_mask_GGGR}, //0x21 [?] = {}, //0x22 [?] = @@ -241,10 +252,10 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { {2, swizzled, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, //0x28 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_G8B8] = {2, swizzled, GL_RG8_SNORM, GL_RG, GL_UNSIGNED_BYTE, - {GL_ZERO, GL_RED, GL_GREEN, GL_ONE}}, + gl_swizzle_mask_0RG1}, //0x29 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R8B8] = {2, swizzled, GL_RG8_SNORM, GL_RG, GL_UNSIGNED_BYTE, - {GL_RED, GL_ZERO, GL_GREEN, GL_ONE}}, + gl_swizzle_mask_R0G1}, //0x2A [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_DEPTH_X8_Y24_FIXED] = {4, swizzled, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, // TODO : Verify //0x2B [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_DEPTH_X8_Y24_FLOAT] = @@ -266,18 +277,18 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { {2, linear, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_FLOAT}, // TODO : Verify //0x32 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_Y16] = {2, swizzled, GL_R16, GL_RED, GL_UNSIGNED_SHORT, // TODO : Verify - {GL_RED, GL_RED, GL_RED, GL_ONE}}, + gl_swizzle_mask_RRR1}, //0x33 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_YB_16_YA_16] = {4, swizzled, GL_R16, GL_RED, GL_UNSIGNED_SHORT, // TODO : Verify - {GL_RED, GL_RED, GL_RED, GL_GREEN}}, + gl_swizzle_mask_RRRG}, //0x34 [NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_A4V6YB6A4U6YA6] = {4, linear}, // TODO : Complete this declaration //0x35 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_Y16] = {2, linear, GL_R16, GL_RED, GL_UNSIGNED_SHORT, - {GL_RED, GL_RED, GL_RED, GL_ONE}}, + gl_swizzle_mask_RRR1}, //0x36 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_YB16YA16] = {4, linear, GL_R16, GL_RED, GL_UNSIGNED_SHORT, // TODO : Verify - {GL_RED, GL_RED, GL_GREEN, GL_GREEN}}, + gl_swizzle_mask_RRGG}, //0x37 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R6G5B5] = // See convert_texture_data {2, linear, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, //0x38 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R5G5B5A1] = // See convert_texture_data @@ -373,7 +384,7 @@ static GraphicsObject* lookup_graphics_object(PGRAPHState *s, hwaddr instance_ad static float convert_f16_to_float(uint16_t f16); static float convert_f24_to_float(uint32_t f24); static uint8_t* convert_texture_data(const unsigned int color_format, const uint8_t *data, const uint8_t *palette_data, const unsigned int width, const unsigned int height, const unsigned int depth, const unsigned int row_pitch, const unsigned int slice_pitch); -static void upload_gl_texture(GLenum gl_target, const TextureShape s, const uint8_t *texture_data, const uint8_t *palette_data); +static int upload_gl_texture(GLenum gl_target, const TextureShape s, const uint8_t *texture_data, const uint8_t *palette_data); static TextureBinding* generate_texture(const TextureShape s, const uint8_t *texture_data, const uint8_t *palette_data); static guint texture_key_hash(gconstpointer key); static gboolean texture_key_equal(gconstpointer a, gconstpointer b); @@ -4185,6 +4196,10 @@ extern void ____UYVYToARGBRow_C(const uint8* src_uyvy, uint8* rgb_buf, int width extern void R5G5B5A1ToARGBRow_C(const uint8* src_r5g5b5a1, uint8* dst_argb, int width); extern void R4G4B4A4ToARGBRow_C(const uint8* src_argb4444, uint8* dst_argb, int width); +/* 'converted_format' indicates the format that results when convert_texture_data() returns non-NULL converted_data. */ +static const int converted_format = NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R8G8B8A8; +// TODO : Verify that NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R8G8B8A8 is indeed the correct output format + static uint8_t* convert_texture_data(const unsigned int color_format, const uint8_t *data, const uint8_t *palette_data, @@ -4280,13 +4295,14 @@ static uint8_t* convert_texture_data(const unsigned int color_format, } } -static void upload_gl_texture(GLenum gl_target, +/* returns the format of the output, either identical to the input format, or the converted format - see converted_format */ +static int upload_gl_texture(GLenum gl_target, const TextureShape s, const uint8_t *texture_data, const uint8_t *palette_data) { //assert(pg->opengl_enabled); - + int resulting_format = s.color_format; ColorFormatInfo f = kelvin_color_format_map[s.color_format]; switch(gl_target) { @@ -4310,9 +4326,11 @@ static void upload_gl_texture(GLenum gl_target, s.width, s.height, 1, s.pitch, 0); - glTexImage2D(gl_target, 0, f.gl_internal_format, + resulting_format = converted ? converted_format : resulting_format; + ColorFormatInfo cf = kelvin_color_format_map[resulting_format]; + glTexImage2D(gl_target, 0, cf.gl_internal_format, s.width, s.height, 0, - f.gl_format, f.gl_type, + cf.gl_format, cf.gl_type, converted ? converted : unswizzled ? unswizzled : texture_data); if (converted) { @@ -4371,9 +4389,11 @@ static void upload_gl_texture(GLenum gl_target, width, height, 1, pitch, 0); - glTexImage2D(gl_target, level, f.gl_internal_format, + resulting_format = converted ? converted_format : resulting_format; + ColorFormatInfo cf = kelvin_color_format_map[resulting_format]; + glTexImage2D(gl_target, level, cf.gl_internal_format, width, height, 0, - f.gl_format, f.gl_type, + cf.gl_format, cf.gl_type, converted ? converted : unswizzled ? unswizzled : texture_data); if (converted) { @@ -4412,9 +4432,11 @@ static void upload_gl_texture(GLenum gl_target, width, height, depth, row_pitch, slice_pitch); - glTexImage3D(gl_target, level, f.gl_internal_format, + resulting_format = converted ? converted_format : resulting_format; + ColorFormatInfo cf = kelvin_color_format_map[resulting_format]; + glTexImage3D(gl_target, level, cf.gl_internal_format, width, height, depth, 0, - f.gl_format, f.gl_type, + cf.gl_format, cf.gl_type, converted ? converted : unswizzled ? unswizzled : texture_data); if (converted) { @@ -4436,6 +4458,7 @@ static void upload_gl_texture(GLenum gl_target, assert(false); break; } + return resulting_format; } static TextureBinding* generate_texture(const TextureShape s, @@ -4487,6 +4510,20 @@ static TextureBinding* generate_texture(const TextureShape s, s.dimensionality, s.cubemap ? " (Cubemap)" : "", s.width, s.height, s.depth); + /* Linear textures don't support mipmapping */ + if (f.encoding != linear) { + glTexParameteri(gl_target, GL_TEXTURE_BASE_LEVEL, + s.min_mipmap_level); + glTexParameteri(gl_target, GL_TEXTURE_MAX_LEVEL, + s.levels - 1); + } + + /* Set this before calling upload_gl_texture() to prevent possible conversions */ + if (f.gl_swizzle_mask) { + glTexParameteriv(gl_target, GL_TEXTURE_SWIZZLE_RGBA, + f.gl_swizzle_mask); + } + if (gl_target == GL_TEXTURE_CUBE_MAP) { size_t length = 0; @@ -4515,20 +4552,6 @@ static TextureBinding* generate_texture(const TextureShape s, upload_gl_texture(gl_target, s, texture_data, palette_data); } - /* Linear textures don't support mipmapping */ - if (f.encoding != linear) { - glTexParameteri(gl_target, GL_TEXTURE_BASE_LEVEL, - s.min_mipmap_level); - glTexParameteri(gl_target, GL_TEXTURE_MAX_LEVEL, - s.levels - 1); - } - - if (f.gl_swizzle_mask[0] != 0 || f.gl_swizzle_mask[1] != 0 - || f.gl_swizzle_mask[2] != 0 || f.gl_swizzle_mask[3] != 0) { - glTexParameteriv(gl_target, GL_TEXTURE_SWIZZLE_RGBA, - (const GLint *)f.gl_swizzle_mask); - } - TextureBinding* ret = (TextureBinding *)g_malloc(sizeof(TextureBinding)); ret->gl_target = gl_target; ret->gl_texture = gl_texture; diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index bc5daa48e..fd81dcef3 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -333,47 +333,6 @@ extern std::chrono::time_pointprmcio.cr[NV_CIO_CRE_PIXEL_INDEX] & 0x03; + if (frame_pixel_bytes == 2) { + // Test case : Arctic Thunder, sets a 16 bit framebuffer (R5G6B5) not via + // AvSetDisplayMode(), but via VGA control register writes, which implies + // that g_AvDisplayModeFormat cannot be used to determine the framebuffer + // width. Instead, read the framebuffer width from the VGA control register : + frame_width = (d->prmcio.cr[NV_CIO_CR_OFFSET_INDEX] * 8) / frame_pixel_bytes; + } } void cxbx_gl_render_framebuffer(NV2AState *d) { + // Update the frame texture + uint8_t* frame_pixels = (uint8_t*)(/*CONTIGUOUS_MEMORY_BASE=*/0x80000000 | d->pcrtc.start); // NV_PCRTC_START + uint8_t* palette_data = xbnullptr; // Note : Framebuffer formats aren't paletized + + TextureShape s; + s.cubemap = false; // Note : Unused in upload_gl_texture GL_TEXTURE_2D path + s.dimensionality = 2; // Note : Unused in upload_gl_texture GL_TEXTURE_2D path + s.color_format = g_AvDisplayModeFormat; + s.levels = 1; + s.width = frame_width; + s.height = frame_height; + s.depth = 0; // Note : Unused in upload_gl_texture GL_TEXTURE_2D path + s.min_mipmap_level = 0; + s.max_mipmap_level = 0; + s.pitch = 0; // Note : Unused in upload_gl_texture GL_TEXTURE_2D path + // If we need to create a (new) texture, do so if (!frame_gl_texture) { glGenTextures(1, &frame_gl_texture); @@ -732,10 +720,6 @@ void cxbx_gl_render_framebuffer(NV2AState *d) GL_CHECK(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); GL_CHECK(); - // TODO : Get the correct swizzle from the av format (see kelvin_color_format_map) - static const GLint swizzle_mask_RGBA[4] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA }; - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_mask_RGBA); - GL_CHECK(); glTexImage2D(GL_TEXTURE_2D, /*level=*/0, frame_gl_internal_format, frame_width, frame_height, /*border=*/0, frame_gl_format, frame_gl_type, NULL); GL_CHECK(); } @@ -744,11 +728,20 @@ void cxbx_gl_render_framebuffer(NV2AState *d) GL_CHECK(); } - // Update the frame texture - hwaddr frame_pixels = /*CONTIGUOUS_MEMORY_BASE=*/0x80000000 | d->pcrtc.start; // NV_PCRTC_START - glTexSubImage2D(GL_TEXTURE_2D, /*level=*/0, /*xoffset=*/0, /*yoffset=*/0, frame_width, frame_height, frame_gl_format, frame_gl_type, (void*)frame_pixels); + int rf = upload_gl_texture(GL_TEXTURE_2D, + s, + frame_pixels, + palette_data); GL_CHECK(); + // Note : It'd be less code to use generate_texture(), except that puts linear formats + // into GL_TEXTURE_RECTANGLE, while we need GL_TEXTURE_2D here. So instead, handle the + // difference here by separately setting the resulting format's RGBA swizzle: + ColorFormatInfo cfi = kelvin_color_format_map[rf]; + if (cfi.gl_swizzle_mask) { + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, cfi.gl_swizzle_mask); + } + // Note : The following is modelled partially after pgraph_update_surface() // TODO : pgraph_update_surface() also unswizzles - should we too? @@ -896,7 +889,7 @@ void cxbx_gl_render_overlays(NV2AState *d) static const GLenum overlay_gl_internal_format = GL_RGBA8; static const GLenum overlay_gl_format = GL_BGRA; static const GLenum overlay_gl_type = GL_UNSIGNED_INT_8_8_8_8_REV; - + for (int v = 0; v < 2; v++) { OverlayState &overlay = d->pvideo.overlays[v]; if (!overlay.video_buffer_use) { @@ -920,8 +913,8 @@ void cxbx_gl_render_overlays(NV2AState *d) GL_CHECK(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); GL_CHECK(); - static const GLint swizzle_mask_BGRA[4] = { GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA }; - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_mask_BGRA); + // Note : YUYV formats are sampled using BGRA in OPENGL_SHADER_YUV[1] fragment shader + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, gl_swizzle_mask_BGRA); GL_CHECK(); glTexImage2D(GL_TEXTURE_2D, /*level=*/0, overlay_gl_internal_format, overlay.pitch / 4, overlay.in_height, /*border=*/0, overlay_gl_format, overlay_gl_type, NULL); GL_CHECK(); @@ -1047,7 +1040,7 @@ void NV2ADevice::UpdateHostDisplay(NV2AState *d) glActiveTexture(GL_TEXTURE0); GL_CHECK(); - cxbx_gl_update_displaymode(); + cxbx_gl_update_displaymode(d); for (int v = 0; v < 2; v++) { cxbx_gl_parse_overlay(d, v); @@ -1230,27 +1223,34 @@ void NV2ADevice::IOWrite(int barIndex, uint32_t port, uint32_t value, unsigned s { } +uint32_t NV2ADevice::BlockRead(const NV2ABlockInfo* block, uint32_t addr, unsigned size) +{ + switch (size) { + case sizeof(uint8_t) : + return block->ops.read(m_nv2a_state, addr - block->offset) & 0xFF; + case sizeof(uint16_t) : + assert((addr & 1) == 0); // TODO : What if this fails? + + return block->ops.read(m_nv2a_state, addr - block->offset) & 0xFFFF; + case sizeof(uint32_t) : + assert((addr & 3) == 0); // TODO : What if this fails? + + return block->ops.read(m_nv2a_state, addr - block->offset); + default: + assert(false); + + return 0; + } +} + uint32_t NV2ADevice::MMIORead(int barIndex, uint32_t addr, unsigned size) { - switch (barIndex) { case 0: { // Access NV2A regardless weither HLE is disabled or not (ignoring bLLE_GPU) const NV2ABlockInfo* block = EmuNV2A_Block(addr); - if (block != nullptr) { - switch (size) { - case sizeof(uint8_t) : - return block->ops.read(m_nv2a_state, addr - block->offset) & 0xFF; - case sizeof(uint16_t) : - assert((addr & 1) == 0); // TODO : What if this fails? - - return block->ops.read(m_nv2a_state, addr - block->offset) & 0xFFFF; - case sizeof(uint32_t) : - assert((addr & 3) == 0); // TODO : What if this fails? - - return block->ops.read(m_nv2a_state, addr - block->offset); - } + return BlockRead(block, addr, size); } break; } @@ -1264,6 +1264,49 @@ uint32_t NV2ADevice::MMIORead(int barIndex, uint32_t addr, unsigned size) return 0; } +void NV2ADevice::BlockWrite(const NV2ABlockInfo* block, uint32_t addr, uint32_t value, unsigned size) +{ + switch (size) { + case sizeof(uint8_t) : { +#if 0 + xbaddr aligned_addr; + uint32_t aligned_value; + int shift; + uint32_t mask; + + aligned_addr = addr & ~3; + aligned_value = block->ops.read(m_nv2a_state, aligned_addr - block->offset); + shift = (addr & 3) * 8; + mask = 0xFF << shift; + block->ops.write(m_nv2a_state, aligned_addr - block->offset, (aligned_value & ~mask) | (value << shift)); +#else + block->ops.write(m_nv2a_state, addr - block->offset, value); +#endif + return; + } + case sizeof(uint16_t) : { + assert((addr & 1) == 0); // TODO : What if this fails? + + xbaddr aligned_addr; + uint32_t aligned_value; + int shift; + uint32_t mask; + + aligned_addr = addr & ~3; + aligned_value = block->ops.read(m_nv2a_state, aligned_addr - block->offset); + shift = (addr & 2) * 16; + mask = 0xFFFF << shift; + block->ops.write(m_nv2a_state, aligned_addr - block->offset, (aligned_value & ~mask) | (value << shift)); + return; + } + case sizeof(uint32_t) : + assert((addr & 3) == 0); // TODO : What if this fails? + + block->ops.write(m_nv2a_state, addr - block->offset, value); + return; + } +} + void NV2ADevice::MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned size) { switch (barIndex) { @@ -1272,37 +1315,11 @@ void NV2ADevice::MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned const NV2ABlockInfo* block = EmuNV2A_Block(addr); if (block != nullptr) { - xbaddr aligned_addr; - uint32_t aligned_value; - int shift; - uint32_t mask; - - switch (size) { - case sizeof(uint8_t) : - aligned_addr = addr & ~3; - aligned_value = block->ops.read(m_nv2a_state, aligned_addr - block->offset); - shift = (addr & 3) * 8; - mask = 0xFF << shift; - block->ops.write(m_nv2a_state, aligned_addr - block->offset, (aligned_value & ~mask) | (value << shift)); - return; - case sizeof(uint16_t) : - assert((addr & 1) == 0); // TODO : What if this fails? - - aligned_addr = addr & ~3; - aligned_value = block->ops.read(m_nv2a_state, aligned_addr - block->offset); - shift = (addr & 2) * 16; - mask = 0xFFFF << shift; - block->ops.write(m_nv2a_state, aligned_addr - block->offset, (aligned_value & ~mask) | (value << shift)); - return; - case sizeof(uint32_t) : - assert((addr & 3) == 0); // TODO : What if this fails? - - block->ops.write(m_nv2a_state, addr - block->offset, value); - return; - } + BlockWrite(block, addr, value, size); + return; } - break; + break; } case 1: { // TODO : access physical memory diff --git a/src/devices/video/nv2a.h b/src/devices/video/nv2a.h index e215f0d38..b47d67933 100644 --- a/src/devices/video/nv2a.h +++ b/src/devices/video/nv2a.h @@ -593,6 +593,8 @@ typedef struct NV2ABlockInfo { MemoryRegionOps ops; } NV2ABlockInfo; +const NV2ABlockInfo* EmuNV2A_Block(xbaddr addr); + #if 0 // Valid after PCI init : #define NV20_REG_BASE_KERNEL 0xFD000000 @@ -669,7 +671,9 @@ public: uint32_t IORead(int barIndex, uint32_t port, unsigned size); void IOWrite(int barIndex, uint32_t port, uint32_t value, unsigned size); + uint32_t BlockRead(const NV2ABlockInfo* block, uint32_t addr, unsigned size); uint32_t MMIORead(int barIndex, uint32_t addr, unsigned size); + void BlockWrite(const NV2ABlockInfo* block, uint32_t addr, uint32_t value, unsigned size); void MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned size); static void UpdateHostDisplay(NV2AState *d); From 7a9e0668af39be60d082cc71570ba156259ab4cc Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Tue, 10 Jul 2018 14:28:24 +0200 Subject: [PATCH 0089/1000] LLE : Fixed LLE convert_texture_data resulting converted_format and use the correct decoder for CR8YB8CB8YA8 format. This fixes wrong colors in WWE RAW2 intro's. --- src/CxbxKrnl/EmuD3D8.cpp | 1 + src/devices/video/EmuNV2A_PGRAPH.cpp | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/CxbxKrnl/EmuD3D8.cpp b/src/CxbxKrnl/EmuD3D8.cpp index e5a3de309..76c1ad30b 100644 --- a/src/CxbxKrnl/EmuD3D8.cpp +++ b/src/CxbxKrnl/EmuD3D8.cpp @@ -1699,6 +1699,7 @@ std::chrono::time_point Date: Thu, 12 Jul 2018 15:16:07 +0200 Subject: [PATCH 0090/1000] LLE : Small cleanups --- src/CxbxKrnl/EmuD3D8.cpp | 1 - src/devices/video/nv2a.cpp | 3 +-- src/devices/video/nv2a.h | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/CxbxKrnl/EmuD3D8.cpp b/src/CxbxKrnl/EmuD3D8.cpp index 76c1ad30b..e5a3de309 100644 --- a/src/CxbxKrnl/EmuD3D8.cpp +++ b/src/CxbxKrnl/EmuD3D8.cpp @@ -1699,7 +1699,6 @@ std::chrono::time_pointpvideo.overlays[0].gl_texture = 0; - d->pvideo.overlays[1].gl_texture = 0; //qemu_cond_init(&d->pvideo.interrupt_cond); } @@ -823,6 +821,7 @@ void pvideo_destroy(NV2AState *d) glDeleteTextures(1, &d->pvideo.overlays[1].gl_texture); d->pvideo.overlays[1].gl_texture = 0; } + //qemu_cond_destroy(&d->pvideo.interrupt_cond); } diff --git a/src/devices/video/nv2a.h b/src/devices/video/nv2a.h index b47d67933..07c3a5f7d 100644 --- a/src/devices/video/nv2a.h +++ b/src/devices/video/nv2a.h @@ -483,7 +483,7 @@ typedef struct OverlayState { int old_in_width; int old_in_height; int old_pitch; - GLuint gl_texture = -1; + GLuint gl_texture; } OverlayState; typedef struct ChannelControl { From a3c13093153cbd8108474a6521b9ff1bc33d87ee Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Thu, 12 Jul 2018 17:20:48 +0200 Subject: [PATCH 0091/1000] LLE : Read all frame width bits from their respective VGA control registers. No more short-circuit in AvSetDisplayMode. --- src/CxbxKrnl/EmuKrnlAv.cpp | 28 ++++++----- src/CxbxKrnl/EmuKrnlAvModes.h | 70 ++++++++++++++-------------- src/devices/video/EmuNV2A_PGRAPH.cpp | 2 +- src/devices/video/nv2a.cpp | 30 ++++++++---- src/devices/video/nv2a.h | 2 +- 5 files changed, 73 insertions(+), 59 deletions(-) diff --git a/src/CxbxKrnl/EmuKrnlAv.cpp b/src/CxbxKrnl/EmuKrnlAv.cpp index e63e09df2..805e728c7 100644 --- a/src/CxbxKrnl/EmuKrnlAv.cpp +++ b/src/CxbxKrnl/EmuKrnlAv.cpp @@ -319,11 +319,9 @@ XBSYSAPI EXPORTNUM(3) xboxkrnl::ULONG NTAPI xboxkrnl::AvSetDisplayMode Pitch /= 8; - AvpCurrentMode = Mode; // Short-circuit the quick path for now - if (AvpCurrentMode == Mode) - { + if (AvpCurrentMode == Mode) { REG_WR32(RegisterBase, NV_PRAMDAC_GENERAL_CONTROL, GeneralControl); - CRTC_WR(RegisterBase, NV_CIO_SR_LOCK_INDEX, NV_CIO_SR_UNLOCK_RW_VALUE); /* crtc lock */ + CRTC_WR(RegisterBase, NV_CIO_SR_LOCK_INDEX /*=0x1c*/, NV_CIO_SR_UNLOCK_RW_VALUE); /* crtc lock */ CRTC_WR(RegisterBase, NV_CIO_CR_OFFSET_INDEX /*=0x13*/, (UCHAR)(Pitch & 0xFF)); /* sets screen pitch */ CRTC_WR(RegisterBase, NV_CIO_CRE_RPC0_INDEX /*=0x19*/, (UCHAR)((Pitch & 0x700) >> 3)); /* repaint control 0 */ CRTC_WR(RegisterBase, NV_CIO_CRE_PIXEL_INDEX /*=0x28*/, 0x80 | CR28Depth); @@ -336,6 +334,8 @@ XBSYSAPI EXPORTNUM(3) xboxkrnl::ULONG NTAPI xboxkrnl::AvSetDisplayMode RETURN(STATUS_SUCCESS); } + CRTC_WR(RegisterBase, NV_CIO_CRE_PIXEL_INDEX /*=0x28*/, 0x80 | CR28Depth); + // TODO: Lots of setup/TV encoder configuration // Ignored for now since we don't emulate that stuff yet... @@ -351,9 +351,9 @@ XBSYSAPI EXPORTNUM(3) xboxkrnl::ULONG NTAPI xboxkrnl::AvSetDisplayMode } if (Mode & AV_MODE_FLAGS_SCART) { - REG_WR32(RegisterBase, 0x680630, 0); - REG_WR32(RegisterBase, 0x6808C4, 0); - REG_WR32(RegisterBase, 0x68084C, 0); + REG_WR32(RegisterBase, 0x00680630, 0); // NV_RAMDAC + 0x0630 + REG_WR32(RegisterBase, 0x006808C4, 0); // NV_RAMDAC + 0x08C4 + REG_WR32(RegisterBase, 0x0068084C, 0); // NV_RAMDAC + 0x084C } const UCHAR* pByte = AvpSRXRegisters; @@ -381,7 +381,7 @@ XBSYSAPI EXPORTNUM(3) xboxkrnl::ULONG NTAPI xboxkrnl::AvSetDisplayMode REG_WR08(RegisterBase, NV_PRMCIO_ARX, 0x20); - CRTC_WR(RegisterBase, 0x11, 0x00); + CRTC_WR(RegisterBase, NV_CIO_CR_VRE_INDEX /*=0x11*/, 0x00); pByte = AvpCRTCRegisters[iCRTC]; pByteMax = pByte + sizeof(AvpCRTCRegisters[0]); @@ -389,15 +389,19 @@ XBSYSAPI EXPORTNUM(3) xboxkrnl::ULONG NTAPI xboxkrnl::AvSetDisplayMode UCHAR Register = AvpCRTCRegisters[0][i]; UCHAR Data = *pByte; - if (Register == 0x13) { + switch (Register) { + case NV_CIO_CR_OFFSET_INDEX /*=0x13*/: Data = (UCHAR)(Pitch & 0xFF); - } else if (Register == 0x19) { + break; + case NV_CIO_CRE_RPC0_INDEX /*=0x19*/: Data |= (UCHAR)((Pitch & 0x700) >> 3); - } else if (Register == 0x25) { + break; + case NV_CIO_CRE_LSR_INDEX /*=0x25*/: Data |= (UCHAR)((Pitch & 0x800) >> 6); + break; } - CRTC_WR(RegisterBase, AvpCRTCRegisters[0][i], Data); + CRTC_WR(RegisterBase, Register, Data); } // TODO: More TV Encoder stuff... diff --git a/src/CxbxKrnl/EmuKrnlAvModes.h b/src/CxbxKrnl/EmuKrnlAvModes.h index 1765f45b1..e86e6a3d1 100644 --- a/src/CxbxKrnl/EmuKrnlAvModes.h +++ b/src/CxbxKrnl/EmuKrnlAvModes.h @@ -122,25 +122,25 @@ // Register Tables const ULONG AvpRegisters[][26] = { -{ /* offset */ 0x00680898, 0x0068089C, 0x006808C0, 0x006808C4, 0x0068084C, 0x00680630, 0x00680800, 0x00680804, 0x00680808, 0x0068080C, 0x00680810, 0x00680814, 0x00680818, 0x00680820, 0x00680824, 0x00680828, 0x0068082C, 0x00680830, 0x00680834, 0x00680838, 0x00680848, 0x00680680, 0x00680684, 0x00680688, 0x0068068C, 0x00680690 }, /* offset */ -{ /* 1 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001F2, 0x000001F4, 0x00000000, 0x000001DF, 0x0000027F, 0x000003A7, 0x00000257, 0x000002F3, 0x00000333, 0x00000000, 0x0000027F, 0x10100111, 0x000C6ED0, 0x0000020D, 0x0000009B, 0x0000026C, 0x00000000 }, /* 1 */ -{ /* 2 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001F2, 0x000001F4, 0x00000000, 0x000001DF, 0x000002CF, 0x000003A7, 0x000002A7, 0x0000031B, 0x0000035B, 0x00000000, 0x000002CF, 0x10100111, 0x000DF05C, 0x0000020D, 0x000000AE, 0x000002B8, 0x00000000 }, /* 2 */ -{ /* 3 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001F4, 0x000001F6, 0x00000000, 0x000001DF, 0x0000027F, 0x0000035F, 0x00000257, 0x000002CF, 0x0000030F, 0x00000000, 0x0000027F, 0x10100111, 0x000F387C, 0x00000271, 0x000000BE, 0x000002F8, 0x00000000 }, /* 3 */ -{ /* 4 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001F4, 0x000001F6, 0x00000000, 0x000001DF, 0x000002CF, 0x0000035F, 0x000002AF, 0x0000030B, 0x0000034B, 0x00000000, 0x000002CF, 0x10100111, 0x0010D2A4, 0x00000271, 0x000000D2, 0x00000348, 0x00000000 }, /* 4 */ -{ /* 5 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x0000023F, 0x00000270, 0x0000023F, 0x00000256, 0x00000258, 0x00000000, 0x0000023F, 0x0000027F, 0x0000035F, 0x00000257, 0x000002CF, 0x0000030F, 0x00000000, 0x0000027F, 0x10100111, 0x000F07A8, 0x00000271, 0x0000009D, 0x00000276, 0x00000000 }, /* 5 */ -{ /* 6 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x0000023F, 0x00000270, 0x0000023F, 0x00000256, 0x00000258, 0x00000000, 0x0000023F, 0x000002CF, 0x0000035F, 0x000002AF, 0x0000030B, 0x0000034B, 0x00000000, 0x000002CF, 0x10100111, 0x0010E62C, 0x00000271, 0x000000B1, 0x000002C4, 0x00000000 }, /* 6 */ -{ /* 7 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001E8, 0x000001EE, 0x00000000, 0x000001DF, 0x000002CF, 0x00000359, 0x0000029F, 0x000002E1, 0x00000320, 0x00000000, 0x000002CF, 0x10100011, 0x0000035A, 0x00000001, 0x000000AB, 0x000002AE, 0x00000001 }, /* 7 */ -{ /* 8 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001E8, 0x000001EE, 0x00000000, 0x000001DF, 0x000002CF, 0x00000359, 0x0000029F, 0x000002E1, 0x00000320, 0x00000000, 0x000002CF, 0x10100111, 0x0000035A, 0x00000001, 0x000000AB, 0x000002AE, 0x00000001 }, /* 8 */ -{ /* 9 */ 0x0AA94000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000003, 0x000002CF, 0x000002ED, 0x000002CF, 0x000002D4, 0x000002D9, 0x00000000, 0x000002CF, 0x000004FF, 0x00000671, 0x000004FF, 0x00000545, 0x00000595, 0x000000A0, 0x0000045F, 0x10100011, 0x00000672, 0x00000001, 0x0000014A, 0x00000528, 0x00000001 }, /* 9 */ -{ /* A */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000003, 0x000002CF, 0x000002ED, 0x000002CF, 0x000002D4, 0x000002D9, 0x00000000, 0x000002CF, 0x000004FF, 0x00000671, 0x000004CF, 0x00000545, 0x00000595, 0x00000000, 0x000004FF, 0x10100011, 0x00000672, 0x00000001, 0x0000014A, 0x00000528, 0x00000001 }, /* A */ -{ /* B */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000003, 0x000002CF, 0x000002ED, 0x000002CF, 0x000002D4, 0x000002D9, 0x00000000, 0x000002CF, 0x000004FF, 0x00000671, 0x000004FF, 0x00000545, 0x00000595, 0x00000000, 0x000004FF, 0x10100111, 0x00000672, 0x00000001, 0x0000014A, 0x00000528, 0x00000001 }, /* B */ -{ /* C */ 0x071AE000, 0x07183800, 0x00000000, 0x40801080, 0x00801080, 0x00000003, 0x00000437, 0x00000464, 0x0000043C, 0x0000043C, 0x00000446, 0x00000000, 0x00000437, 0x0000077F, 0x00000897, 0x000007AA, 0x000007AB, 0x00000803, 0x000000F0, 0x0000068F, 0x10133011, 0x00000898, 0x00000001, 0x000001B8, 0x000006E0, 0x00000001 }, /* C */ -{ /* D */ 0x10000000, 0x07183800, 0x00000000, 0x40801080, 0x00801080, 0x00000003, 0x00000437, 0x00000464, 0x0000043C, 0x0000043C, 0x00000446, 0x00000000, 0x00000437, 0x0000077F, 0x00000897, 0x00000759, 0x000007AB, 0x00000803, 0x00000000, 0x0000077F, 0x10133011, 0x00000898, 0x00000001, 0x000001B8, 0x000006E0, 0x00000001 }, /* D */ -{ /* E */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000003, 0x00000437, 0x00000464, 0x0000043B, 0x0000043B, 0x00000445, 0x00000000, 0x00000437, 0x0000077F, 0x00000897, 0x000007AB, 0x000007AC, 0x00000804, 0x00000000, 0x0000077F, 0x10133111, 0x00000898, 0x00000001, 0x000001B8, 0x000006E0, 0x00000001 }, /* E */ -{ /* F */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001F2, 0x000001F4, 0x00000000, 0x000001DF, 0x0000027F, 0x000003A7, 0x000002A7, 0x000002F3, 0x00000333, 0x00000000, 0x0000027F, 0x10100111, 0x000DF05C, 0x0000020D, 0x000000AE, 0x000002B8, 0x00000000 }, /* F */ -{ /* 10 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001F4, 0x000001F6, 0x00000000, 0x000001DF, 0x0000027F, 0x0000035F, 0x000002A7, 0x000002CF, 0x0000030F, 0x00000000, 0x0000027F, 0x10100111, 0x000DF05C, 0x0000020D, 0x000000AE, 0x000002B8, 0x00000000 }, /* 10 */ -{ /* 11 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001E8, 0x000001EE, 0x00000000, 0x000001DF, 0x000002CF, 0x00000359, 0x000002CF, 0x000002DF, 0x0000031E, 0x00000020, 0x000002AD, 0x10100011, 0x0000035A, 0x00000001, 0x000000AB, 0x000002AE, 0x00000001 }, /* 11 */ -{ /* 12 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x0000023F, 0x00000270, 0x0000023F, 0x00000256, 0x00000258, 0x00000000, 0x0000023F, 0x0000027F, 0x0000035F, 0x00000257, 0x000002CF, 0x0000030F, 0x00000000, 0x0000027F, 0x10100111, 0x000F07A8, 0x00000271, 0x0000009D, 0x00000276, 0x00000000 }, /* 12 */ + { /* offset */ 0x00680898, 0x0068089C, 0x006808C0, 0x006808C4, 0x0068084C, 0x00680630, 0x00680800, 0x00680804, 0x00680808, 0x0068080C, 0x00680810, 0x00680814, 0x00680818, 0x00680820, 0x00680824, 0x00680828, 0x0068082C, 0x00680830, 0x00680834, 0x00680838, 0x00680848, 0x00680680, 0x00680684, 0x00680688, 0x0068068C, 0x00680690 }, /* offset */ + { /* 1 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001F2, 0x000001F4, 0x00000000, 0x000001DF, 0x0000027F, 0x000003A7, 0x00000257, 0x000002F3, 0x00000333, 0x00000000, 0x0000027F, 0x10100111, 0x000C6ED0, 0x0000020D, 0x0000009B, 0x0000026C, 0x00000000 }, /* 1 */ + { /* 2 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001F2, 0x000001F4, 0x00000000, 0x000001DF, 0x000002CF, 0x000003A7, 0x000002A7, 0x0000031B, 0x0000035B, 0x00000000, 0x000002CF, 0x10100111, 0x000DF05C, 0x0000020D, 0x000000AE, 0x000002B8, 0x00000000 }, /* 2 */ + { /* 3 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001F4, 0x000001F6, 0x00000000, 0x000001DF, 0x0000027F, 0x0000035F, 0x00000257, 0x000002CF, 0x0000030F, 0x00000000, 0x0000027F, 0x10100111, 0x000F387C, 0x00000271, 0x000000BE, 0x000002F8, 0x00000000 }, /* 3 */ + { /* 4 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001F4, 0x000001F6, 0x00000000, 0x000001DF, 0x000002CF, 0x0000035F, 0x000002AF, 0x0000030B, 0x0000034B, 0x00000000, 0x000002CF, 0x10100111, 0x0010D2A4, 0x00000271, 0x000000D2, 0x00000348, 0x00000000 }, /* 4 */ + { /* 5 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x0000023F, 0x00000270, 0x0000023F, 0x00000256, 0x00000258, 0x00000000, 0x0000023F, 0x0000027F, 0x0000035F, 0x00000257, 0x000002CF, 0x0000030F, 0x00000000, 0x0000027F, 0x10100111, 0x000F07A8, 0x00000271, 0x0000009D, 0x00000276, 0x00000000 }, /* 5 */ + { /* 6 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x0000023F, 0x00000270, 0x0000023F, 0x00000256, 0x00000258, 0x00000000, 0x0000023F, 0x000002CF, 0x0000035F, 0x000002AF, 0x0000030B, 0x0000034B, 0x00000000, 0x000002CF, 0x10100111, 0x0010E62C, 0x00000271, 0x000000B1, 0x000002C4, 0x00000000 }, /* 6 */ + { /* 7 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001E8, 0x000001EE, 0x00000000, 0x000001DF, 0x000002CF, 0x00000359, 0x0000029F, 0x000002E1, 0x00000320, 0x00000000, 0x000002CF, 0x10100011, 0x0000035A, 0x00000001, 0x000000AB, 0x000002AE, 0x00000001 }, /* 7 */ + { /* 8 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001E8, 0x000001EE, 0x00000000, 0x000001DF, 0x000002CF, 0x00000359, 0x0000029F, 0x000002E1, 0x00000320, 0x00000000, 0x000002CF, 0x10100111, 0x0000035A, 0x00000001, 0x000000AB, 0x000002AE, 0x00000001 }, /* 8 */ + { /* 9 */ 0x0AA94000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000003, 0x000002CF, 0x000002ED, 0x000002CF, 0x000002D4, 0x000002D9, 0x00000000, 0x000002CF, 0x000004FF, 0x00000671, 0x000004FF, 0x00000545, 0x00000595, 0x000000A0, 0x0000045F, 0x10100011, 0x00000672, 0x00000001, 0x0000014A, 0x00000528, 0x00000001 }, /* 9 */ + { /* A */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000003, 0x000002CF, 0x000002ED, 0x000002CF, 0x000002D4, 0x000002D9, 0x00000000, 0x000002CF, 0x000004FF, 0x00000671, 0x000004CF, 0x00000545, 0x00000595, 0x00000000, 0x000004FF, 0x10100011, 0x00000672, 0x00000001, 0x0000014A, 0x00000528, 0x00000001 }, /* A */ + { /* B */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000003, 0x000002CF, 0x000002ED, 0x000002CF, 0x000002D4, 0x000002D9, 0x00000000, 0x000002CF, 0x000004FF, 0x00000671, 0x000004FF, 0x00000545, 0x00000595, 0x00000000, 0x000004FF, 0x10100111, 0x00000672, 0x00000001, 0x0000014A, 0x00000528, 0x00000001 }, /* B */ + { /* C */ 0x071AE000, 0x07183800, 0x00000000, 0x40801080, 0x00801080, 0x00000003, 0x00000437, 0x00000464, 0x0000043C, 0x0000043C, 0x00000446, 0x00000000, 0x00000437, 0x0000077F, 0x00000897, 0x000007AA, 0x000007AB, 0x00000803, 0x000000F0, 0x0000068F, 0x10133011, 0x00000898, 0x00000001, 0x000001B8, 0x000006E0, 0x00000001 }, /* C */ + { /* D */ 0x10000000, 0x07183800, 0x00000000, 0x40801080, 0x00801080, 0x00000003, 0x00000437, 0x00000464, 0x0000043C, 0x0000043C, 0x00000446, 0x00000000, 0x00000437, 0x0000077F, 0x00000897, 0x00000759, 0x000007AB, 0x00000803, 0x00000000, 0x0000077F, 0x10133011, 0x00000898, 0x00000001, 0x000001B8, 0x000006E0, 0x00000001 }, /* D */ + { /* E */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000003, 0x00000437, 0x00000464, 0x0000043B, 0x0000043B, 0x00000445, 0x00000000, 0x00000437, 0x0000077F, 0x00000897, 0x000007AB, 0x000007AC, 0x00000804, 0x00000000, 0x0000077F, 0x10133111, 0x00000898, 0x00000001, 0x000001B8, 0x000006E0, 0x00000001 }, /* E */ + { /* F */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001F2, 0x000001F4, 0x00000000, 0x000001DF, 0x0000027F, 0x000003A7, 0x000002A7, 0x000002F3, 0x00000333, 0x00000000, 0x0000027F, 0x10100111, 0x000DF05C, 0x0000020D, 0x000000AE, 0x000002B8, 0x00000000 }, /* F */ + { /* 10 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001F4, 0x000001F6, 0x00000000, 0x000001DF, 0x0000027F, 0x0000035F, 0x000002A7, 0x000002CF, 0x0000030F, 0x00000000, 0x0000027F, 0x10100111, 0x000DF05C, 0x0000020D, 0x000000AE, 0x000002B8, 0x00000000 }, /* 10 */ + { /* 11 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x000001DF, 0x0000020C, 0x000001DF, 0x000001E8, 0x000001EE, 0x00000000, 0x000001DF, 0x000002CF, 0x00000359, 0x000002CF, 0x000002DF, 0x0000031E, 0x00000020, 0x000002AD, 0x10100011, 0x0000035A, 0x00000001, 0x000000AB, 0x000002AE, 0x00000001 }, /* 11 */ + { /* 12 */ 0x10000000, 0x10000000, 0x00000000, 0x40801080, 0x00801080, 0x00000002, 0x0000023F, 0x00000270, 0x0000023F, 0x00000256, 0x00000258, 0x00000000, 0x0000023F, 0x0000027F, 0x0000035F, 0x00000257, 0x000002CF, 0x0000030F, 0x00000000, 0x0000027F, 0x10100111, 0x000F07A8, 0x00000271, 0x0000009D, 0x00000276, 0x00000000 }, /* 12 */ }; const UCHAR AvpSRXRegisters[] = @@ -161,22 +161,22 @@ const UCHAR AvpARXRegisters[] = const UCHAR AvpCRTCRegisters[][34] = { { /* offset */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x20, 0x25, 0x2D, 0x33, 0x39, 0x41 }, /* offset */ -{ /* 1 */ 0x70, 0x4F, 0x4F, 0x94, 0x5D, 0xBF, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0x04, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 1 */ -{ /* 2 */ 0x70, 0x59, 0x59, 0x94, 0x62, 0xA4, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0x04, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 2 */ -{ /* 3 */ 0x67, 0x4F, 0x4F, 0x8B, 0x59, 0xBB, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x06, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 3 */ -{ /* 4 */ 0x67, 0x59, 0x59, 0x8B, 0x5E, 0xBF, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x06, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 4 */ -{ /* 5 */ 0x67, 0x4F, 0x4F, 0x8B, 0x59, 0xBB, 0x6F, 0xF0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x08, 0x3F, 0x00, 0x00, 0x3F, 0x70, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 5 */ -{ /* 6 */ 0x67, 0x59, 0x59, 0x8B, 0x5E, 0xBF, 0x6F, 0xF0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x08, 0x3F, 0x00, 0x00, 0x3F, 0x70, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 6 */ -{ /* 7 */ 0x59, 0x4F, 0x4F, 0x9D, 0x51, 0x39, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x0E, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 7 */ -{ /* 8 */ 0x63, 0x59, 0x59, 0x87, 0x5B, 0xA3, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x0E, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 8 */ -{ /* 9 */ 0x78, 0x4F, 0x4F, 0x9C, 0x57, 0xA1, 0xFC, 0x1F, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x09, 0xDF, 0x00, 0x00, 0xDF, 0xFD, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 9 */ -{ /* A */ 0xC8, 0x9F, 0x9F, 0x8C, 0xA7, 0x31, 0xEC, 0xF0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD4, 0x09, 0xCF, 0x00, 0x00, 0xCF, 0xED, 0xE3, 0xFF, 0x00, 0x38, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* A */ -{ /* B */ 0x67, 0x4F, 0x4F, 0x8B, 0x54, 0xBF, 0x03, 0x11, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0x06, 0xEF, 0x00, 0x00, 0xEF, 0x04, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0x36, 0x00 }, /* B */ -{ /* C */ 0x04, 0xEF, 0xEF, 0x88, 0xF4, 0x3F, 0x2F, 0xF0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x02, 0x1B, 0x00, 0x00, 0x1B, 0x30, 0xE3, 0xFF, 0x00, 0x38, 0x05, 0x80, 0x00, 0x01, 0x11, 0x10, 0x00 }, /* C */ -{ /* D */ 0x70, 0x4F, 0x4F, 0x94, 0x5D, 0xBF, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0x04, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* D */ -{ /* E */ 0x67, 0x4F, 0x4F, 0x8B, 0x59, 0xBF, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x06, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x00, 0x00, 0x11, 0xFF, 0x00 }, /* E */ -{ /* F */ 0x61, 0x57, 0x57, 0x85, 0x59, 0xBF, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x0E, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* F */ -{ /* 10 */ 0x67, 0x4F, 0x4F, 0x94, 0x59, 0xBF, 0x6F, 0xF0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x08, 0x3F, 0x00, 0x00, 0x3F, 0x70, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 10 */ + { /* 1 */ 0x70, 0x4F, 0x4F, 0x94, 0x5D, 0xBF, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0x04, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 1 */ + { /* 2 */ 0x70, 0x59, 0x59, 0x94, 0x62, 0xA4, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0x04, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 2 */ + { /* 3 */ 0x67, 0x4F, 0x4F, 0x8B, 0x59, 0xBB, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x06, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 3 */ + { /* 4 */ 0x67, 0x59, 0x59, 0x8B, 0x5E, 0xBF, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x06, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 4 */ + { /* 5 */ 0x67, 0x4F, 0x4F, 0x8B, 0x59, 0xBB, 0x6F, 0xF0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x08, 0x3F, 0x00, 0x00, 0x3F, 0x70, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 5 */ + { /* 6 */ 0x67, 0x59, 0x59, 0x8B, 0x5E, 0xBF, 0x6F, 0xF0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x08, 0x3F, 0x00, 0x00, 0x3F, 0x70, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 6 */ + { /* 7 */ 0x59, 0x4F, 0x4F, 0x9D, 0x51, 0x39, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x0E, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 7 */ + { /* 8 */ 0x63, 0x59, 0x59, 0x87, 0x5B, 0xA3, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x0E, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 8 */ + { /* 9 */ 0x78, 0x4F, 0x4F, 0x9C, 0x57, 0xA1, 0xFC, 0x1F, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x09, 0xDF, 0x00, 0x00, 0xDF, 0xFD, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 9 */ + { /* A */ 0xC8, 0x9F, 0x9F, 0x8C, 0xA7, 0x31, 0xEC, 0xF0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD4, 0x09, 0xCF, 0x00, 0x00, 0xCF, 0xED, 0xE3, 0xFF, 0x00, 0x38, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* A */ + { /* B */ 0x67, 0x4F, 0x4F, 0x8B, 0x54, 0xBF, 0x03, 0x11, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0x06, 0xEF, 0x00, 0x00, 0xEF, 0x04, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0x36, 0x00 }, /* B */ + { /* C */ 0x04, 0xEF, 0xEF, 0x88, 0xF4, 0x3F, 0x2F, 0xF0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x02, 0x1B, 0x00, 0x00, 0x1B, 0x30, 0xE3, 0xFF, 0x00, 0x38, 0x05, 0x80, 0x00, 0x01, 0x11, 0x10, 0x00 }, /* C */ + { /* D */ 0x70, 0x4F, 0x4F, 0x94, 0x5D, 0xBF, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0x04, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* D */ + { /* E */ 0x67, 0x4F, 0x4F, 0x8B, 0x59, 0xBF, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x06, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x00, 0x00, 0x11, 0xFF, 0x00 }, /* E */ + { /* F */ 0x61, 0x57, 0x57, 0x85, 0x59, 0xBF, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x0E, 0xDF, 0x00, 0x00, 0xDF, 0x0C, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* F */ + { /* 10 */ 0x67, 0x4F, 0x4F, 0x94, 0x59, 0xBF, 0x6F, 0xF0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x08, 0x3F, 0x00, 0x00, 0x3F, 0x70, 0xE3, 0xFF, 0x00, 0x3A, 0x05, 0x80, 0x10, 0x00, 0x11, 0xFF, 0x00 }, /* 10 */ }; typedef struct diff --git a/src/devices/video/EmuNV2A_PGRAPH.cpp b/src/devices/video/EmuNV2A_PGRAPH.cpp index 4eb6ee574..93ac1c961 100644 --- a/src/devices/video/EmuNV2A_PGRAPH.cpp +++ b/src/devices/video/EmuNV2A_PGRAPH.cpp @@ -4521,7 +4521,7 @@ static TextureBinding* generate_texture(const TextureShape s, s.levels - 1); } - /* Set this before calling upload_gl_texture() to prevent possible conversions */ + /* Set this before calling upload_gl_texture() to prevent potential conversions */ if (f.gl_swizzle_mask) { glTexParameteriv(gl_target, GL_TEXTURE_SWIZZLE_RGBA, f.gl_swizzle_mask); diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index 3d0471071..36f7817d7 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -679,12 +679,21 @@ void cxbx_gl_update_displaymode(NV2AState *d) { } int frame_pixel_bytes = d->prmcio.cr[NV_CIO_CRE_PIXEL_INDEX] & 0x03; - if (frame_pixel_bytes == 2) { + if (frame_pixel_bytes >= 2) { + if (frame_pixel_bytes == 3) { + // Test-case : WWE RAW2 + frame_pixel_bytes++; + } + // Test case : Arctic Thunder, sets a 16 bit framebuffer (R5G6B5) not via // AvSetDisplayMode(), but via VGA control register writes, which implies // that g_AvDisplayModeFormat cannot be used to determine the framebuffer - // width. Instead, read the framebuffer width from the VGA control register : - frame_width = (d->prmcio.cr[NV_CIO_CR_OFFSET_INDEX] * 8) / frame_pixel_bytes; + // width. Instead, read the framebuffer width from the VGA control registers : + frame_width = ((int)d->prmcio.cr[NV_CIO_CR_OFFSET_INDEX]) + | (0x700 & ((int)d->prmcio.cr[NV_CIO_CRE_RPC0_INDEX] << 3)) + | (0x800 & ((int)d->prmcio.cr[NV_CIO_CRE_LSR_INDEX] << 6)); + frame_width *= 8; + frame_width /= frame_pixel_bytes; } } @@ -1020,11 +1029,12 @@ void cxbx_gl_render_overlays(NV2AState *d) extern void UpdateFPSCounter(); void NV2ADevice::UpdateHostDisplay(NV2AState *d) { - if (!d->pgraph.opengl_enabled) { + PGRAPHState *pg = &d->pgraph; + if (!pg->opengl_enabled) { return; } - lockGL(&d->pgraph); + lockGL(pg); NV2A_GL_DGROUP_BEGIN("VGA Frame"); @@ -1058,19 +1068,19 @@ void NV2ADevice::UpdateHostDisplay(NV2AState *d) // Unbind everything we've used glUseProgram(0); GL_CHECK(); - glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0);//pg->gl_memory_buffer); GL_CHECK(); - glBindTexture(GL_TEXTURE_2D, 0); + glBindTexture(GL_TEXTURE_2D, 0);//pg->gl_color_buffer); GL_CHECK(); // Restore xbox framebuffer - glBindFramebuffer(GL_FRAMEBUFFER, d->pgraph.gl_framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, pg->gl_framebuffer); GL_CHECK(); - glo_swap(d->pgraph.gl_context); + glo_swap(pg->gl_context); NV2A_GL_DGROUP_END(); - unlockGL(&d->pgraph); + unlockGL(pg); UpdateFPSCounter(); } diff --git a/src/devices/video/nv2a.h b/src/devices/video/nv2a.h index 07c3a5f7d..513ad0e05 100644 --- a/src/devices/video/nv2a.h +++ b/src/devices/video/nv2a.h @@ -532,7 +532,7 @@ typedef struct NV2AState { struct { uint32_t pending_interrupts; uint32_t enabled_interrupts; - //QemuCond interrupt_cond; + //QemuCond interrupt_cond; // pvideo.interrupt_cond not used (yet) OverlayState overlays[2]; // NV2A supports 2 video overlays uint32_t regs[NV_PVIDEO_SIZE]; // TODO : union } pvideo; From 3a7a3eb87578b679ccb9907d47d96096f3a59f75 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Thu, 12 Jul 2018 18:06:29 +0200 Subject: [PATCH 0092/1000] LLE : No need to convert R5G5B5A1 and R4G4B4A4 formats - they're natively supported in OpenGL (thanks JayFoxRox, for noticing) --- src/devices/video/EmuNV2A_PGRAPH.cpp | 54 ++++++++-------------------- 1 file changed, 14 insertions(+), 40 deletions(-) diff --git a/src/devices/video/EmuNV2A_PGRAPH.cpp b/src/devices/video/EmuNV2A_PGRAPH.cpp index 93ac1c961..38d0cfa2d 100644 --- a/src/devices/video/EmuNV2A_PGRAPH.cpp +++ b/src/devices/video/EmuNV2A_PGRAPH.cpp @@ -202,7 +202,7 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { //0x14 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_SY8] = {1, linear, GL_R8, GL_RED, GL_BYTE, gl_swizzle_mask_RRR1}, // TODO : Verify - //0x15 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X7SY9] = // See convert_texture_data + //0x15 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X7SY9] = // See convert_texture_data FIXME {2, linear, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify //0x16 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R8B8] = {2, linear, GL_RG8_SNORM, GL_RG, GL_UNSIGNED_BYTE, @@ -245,11 +245,11 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { {2, linear, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}, // TODO : Verify //0x25 [NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_YB8CR8YA8CB8] = // See convert_texture_data calling ____YUY2ToARGBRow_C {2, linear, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}, // TODO : Verify - //0x26 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8CR8CB8Y8] = // See convert_texture_data + //0x26 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8CR8CB8Y8] = // See convert_texture_data FIXME {2, linear, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}, // TODO : Verify - //0x27 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R6G5B5] = // See convert_texture_data - {2, swizzled, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, + //0x27 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R6G5B5] = // See convert_texture_data calling __R6G5B5ToARGBRow_C + {2, swizzled, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify //0x28 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_G8B8] = {2, swizzled, GL_RG8_SNORM, GL_RG, GL_UNSIGNED_BYTE, gl_swizzle_mask_0RG1}, @@ -289,12 +289,12 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { //0x36 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_YB16YA16] = {4, linear, GL_R16, GL_RED, GL_UNSIGNED_SHORT, // TODO : Verify gl_swizzle_mask_RRGG}, - //0x37 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R6G5B5] = // See convert_texture_data - {2, linear, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, - //0x38 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R5G5B5A1] = // See convert_texture_data - {2, swizzled, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify - //0x39 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R4G4B4A4] = // See convert_texture_data - {2, swizzled, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify + //0x37 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R6G5B5] = // See convert_texture_data calling __R6G5B5ToARGBRow_C + {2, linear, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify + //0x38 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R5G5B5A1] = + {2, swizzled, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1}, // TODO : Verify + //0x39 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R4G4B4A4] = + {2, swizzled, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4}, // TODO : Verify //0x3A [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_A8B8G8R8] = {4, swizzled, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify //0x3B [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_B8G8R8A8] = @@ -302,10 +302,10 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { //0x3C [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R8G8B8A8] = {4, swizzled, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}, - //0x3D [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R5G5B5A1] = // See convert_texture_data - {2, linear, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify - //0x3E [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R4G4B4A4] = // See convert_texture_data - {2, linear, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify + //0x3D [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R5G5B5A1] = + {2, linear, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1}, // TODO : Verify + //0x3E [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R4G4B4A4] = + {2, linear, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4}, // TODO : Verify //0x3F [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8B8G8R8] = {4, linear, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify @@ -4193,8 +4193,6 @@ static float convert_f24_to_float(uint32_t f24) { extern void __R6G5B5ToARGBRow_C(const uint8* src_r6g5b5, uint8* dst_argb, int width); extern void ____YUY2ToARGBRow_C(const uint8* src_yuy2, uint8* rgb_buf, int width); extern void ____UYVYToARGBRow_C(const uint8* src_uyvy, uint8* rgb_buf, int width); -extern void R5G5B5A1ToARGBRow_C(const uint8* src_r5g5b5a1, uint8* dst_argb, int width); -extern void R4G4B4A4ToARGBRow_C(const uint8* src_argb4444, uint8* dst_argb, int width); /* 'converted_format' indicates the format that results when convert_texture_data() returns non-NULL converted_data. */ static const int converted_format = NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8R8G8B8; @@ -4268,30 +4266,6 @@ static uint8_t* convert_texture_data(const unsigned int color_format, __R6G5B5ToARGBRow_C((const uint8*)rgb655, (uint8*)pixel, width); } return converted_data; - } - case NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R5G5B5A1: - case NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R5G5B5A1: { - assert(depth == 1); /* FIXME */ - uint8_t *converted_data = (uint8_t*)g_malloc(width * height * 4); - unsigned int y; - for (y = 0; y < height; y++) { - uint16_t r5g5b5a1 = *(uint16_t*)(data + y * row_pitch); - int8_t *pixel = (int8_t*)&converted_data[(y * width) * 4]; - R5G5B5A1ToARGBRow_C((uint8_t *)r5g5b5a1, (uint8_t *)pixel, width); - } - return converted_data; - } - case NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R4G4B4A4: - case NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R4G4B4A4: { - assert(depth == 1); /* FIXME */ - uint8_t *converted_data = (uint8_t*)g_malloc(width * height * 4); - unsigned int y; - for (y = 0; y < height; y++) { - uint16_t r4g4b4a4 = *(uint16_t*)(data + y * row_pitch); - int8_t *pixel = (int8_t*)&converted_data[(y * width) * 4]; - R4G4B4A4ToARGBRow_C((uint8_t *)r4g4b4a4, (uint8_t *)pixel, width); - } - return converted_data; } default: return NULL; From 3e5741cdf9ee6e3d9160f6cedd4da10f5100cc16 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Fri, 13 Jul 2018 11:22:09 +0200 Subject: [PATCH 0093/1000] LLE : Thorough review of kelvin_color_format_map (correcting a few format declarations, and applied a define for all formats declarations that are converted) --- src/devices/video/EmuNV2A_PGRAPH.cpp | 112 +++++++++++++++------------ src/devices/video/nv2a_int.h | 2 +- 2 files changed, 62 insertions(+), 52 deletions(-) diff --git a/src/devices/video/EmuNV2A_PGRAPH.cpp b/src/devices/video/EmuNV2A_PGRAPH.cpp index 38d0cfa2d..3c1860922 100644 --- a/src/devices/video/EmuNV2A_PGRAPH.cpp +++ b/src/devices/video/EmuNV2A_PGRAPH.cpp @@ -137,16 +137,18 @@ typedef struct ColorFormatInfo { GLint gl_internal_format; GLenum gl_format; // == 0 for compressed formats GLenum gl_type; - GLint *gl_swizzle_mask; + GLint *gl_swizzle_mask; // == nullptr when gl_internal_format, gl_format and gl_type are sufficient } ColorFormatInfo; +// Resulting gl_internal_format, gl_format and gl_type values, for formats handled by convert_texture_data() +#define GL_CONVERT_TEXTURE_DATA_RESULTING_FORMAT GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV + static GLint gl_swizzle_mask_0RG1[4] = { GL_ZERO, GL_RED, GL_GREEN, GL_ONE }; static GLint gl_swizzle_mask_111R[4] = { GL_ONE, GL_ONE, GL_ONE, GL_RED }; static GLint gl_swizzle_mask_ARGB[4] = { GL_ALPHA, GL_RED, GL_GREEN, GL_BLUE }; static GLint gl_swizzle_mask_BGRA[4] = { GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA }; static GLint gl_swizzle_mask_GGGR[4] = { GL_GREEN, GL_GREEN, GL_GREEN, GL_RED }; static GLint gl_swizzle_mask_R0G1[4] = { GL_RED, GL_ZERO, GL_GREEN, GL_ONE }; -static GLint gl_swizzle_mask_RRGG[4] = { GL_RED, GL_RED, GL_GREEN, GL_GREEN }; static GLint gl_swizzle_mask_RRR1[4] = { GL_RED, GL_RED, GL_RED, GL_ONE }; static GLint gl_swizzle_mask_RRRG[4] = { GL_RED, GL_RED, GL_RED, GL_GREEN }; static GLint gl_swizzle_mask_RRRR[4] = { GL_RED, GL_RED, GL_RED, GL_RED }; @@ -180,7 +182,7 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { /* paletted texture */ //0x0B [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_I8_A8R8G8B8] = // See convert_texture_data - {1, swizzled, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, + {1, swizzled, GL_CONVERT_TEXTURE_DATA_RESULTING_FORMAT}, //0x0C [NV097_SET_TEXTURE_FORMAT_COLOR_L_DXT1_A1R5G5B5] = {4, compressed, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 0, GL_RGBA}, @@ -200,15 +202,15 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { {1, linear, GL_R8, GL_RED, GL_UNSIGNED_BYTE, gl_swizzle_mask_RRR1}, //0x14 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_SY8] = - {1, linear, GL_R8, GL_RED, GL_BYTE, + {1, linear, GL_R8_SNORM, GL_RED, GL_BYTE, gl_swizzle_mask_RRR1}, // TODO : Verify //0x15 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X7SY9] = // See convert_texture_data FIXME - {2, linear, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify + {2, linear, GL_CONVERT_TEXTURE_DATA_RESULTING_FORMAT}, // TODO : Verify //0x16 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R8B8] = - {2, linear, GL_RG8_SNORM, GL_RG, GL_UNSIGNED_BYTE, + {2, linear, GL_RG8, GL_RG, GL_UNSIGNED_BYTE, gl_swizzle_mask_R0G1}, // TODO : Verify //0x17 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_G8B8] = - {2, linear, GL_RG8_SNORM, GL_RG, GL_UNSIGNED_BYTE, + {2, linear, GL_RG8, GL_RG, GL_UNSIGNED_BYTE, gl_swizzle_mask_0RG1}, // TODO : Verify //0x18 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_SG8SB8] = {2, linear, GL_RG8_SNORM, GL_RG, GL_BYTE, @@ -242,19 +244,19 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { //0x23 [?] = {}, //0x24 [NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_CR8YB8CB8YA8] = // See convert_texture_data calling ____UYVYToARGBRow_C - {2, linear, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}, // TODO : Verify + {2, linear, GL_CONVERT_TEXTURE_DATA_RESULTING_FORMAT}, // TODO : Verify //0x25 [NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_YB8CR8YA8CB8] = // See convert_texture_data calling ____YUY2ToARGBRow_C - {2, linear, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}, // TODO : Verify + {2, linear, GL_CONVERT_TEXTURE_DATA_RESULTING_FORMAT}, // TODO : Verify //0x26 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8CR8CB8Y8] = // See convert_texture_data FIXME - {2, linear, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}, // TODO : Verify + {2, linear, GL_CONVERT_TEXTURE_DATA_RESULTING_FORMAT}, // TODO : Verify //0x27 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R6G5B5] = // See convert_texture_data calling __R6G5B5ToARGBRow_C - {2, swizzled, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify + {2, swizzled, GL_CONVERT_TEXTURE_DATA_RESULTING_FORMAT}, // TODO : Verify //0x28 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_G8B8] = - {2, swizzled, GL_RG8_SNORM, GL_RG, GL_UNSIGNED_BYTE, + {2, swizzled, GL_RG8, GL_RG, GL_UNSIGNED_BYTE, gl_swizzle_mask_0RG1}, //0x29 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R8B8] = - {2, swizzled, GL_RG8_SNORM, GL_RG, GL_UNSIGNED_BYTE, + {2, swizzled, GL_RG8, GL_RG, GL_UNSIGNED_BYTE, gl_swizzle_mask_R0G1}, //0x2A [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_DEPTH_X8_Y24_FIXED] = {4, swizzled, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, // TODO : Verify @@ -278,21 +280,21 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { //0x32 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_Y16] = {2, swizzled, GL_R16, GL_RED, GL_UNSIGNED_SHORT, // TODO : Verify gl_swizzle_mask_RRR1}, - //0x33 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_YB_16_YA_16] = - {4, swizzled, GL_R16, GL_RED, GL_UNSIGNED_SHORT, // TODO : Verify + //0x33 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_YB16YA16] = + {4, swizzled, GL_RG16, GL_RG, GL_UNSIGNED_SHORT, // TODO : Verify gl_swizzle_mask_RRRG}, - //0x34 [NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_A4V6YB6A4U6YA6] = - {4, linear}, // TODO : Complete this declaration + //0x34 [NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_A4V6YB6A4U6YA6] = // TODO : handle in convert_texture_data + {2, linear, GL_CONVERT_TEXTURE_DATA_RESULTING_FORMAT}, // TODO : Verify //0x35 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_Y16] = {2, linear, GL_R16, GL_RED, GL_UNSIGNED_SHORT, gl_swizzle_mask_RRR1}, //0x36 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_YB16YA16] = - {4, linear, GL_R16, GL_RED, GL_UNSIGNED_SHORT, // TODO : Verify - gl_swizzle_mask_RRGG}, + {4, linear, GL_RG16, GL_RG, GL_UNSIGNED_SHORT, // TODO : Verify + gl_swizzle_mask_RRRG}, //0x37 [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R6G5B5] = // See convert_texture_data calling __R6G5B5ToARGBRow_C - {2, linear, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, // TODO : Verify + {2, linear, GL_CONVERT_TEXTURE_DATA_RESULTING_FORMAT}, // TODO : Verify //0x38 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R5G5B5A1] = - {2, swizzled, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1}, // TODO : Verify + {2, swizzled, GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1}, // TODO : Verify //0x39 [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R4G4B4A4] = {2, swizzled, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4}, // TODO : Verify //0x3A [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_A8B8G8R8] = @@ -303,7 +305,7 @@ static const ColorFormatInfo kelvin_color_format_map[256] = { //0x3C [NV097_SET_TEXTURE_FORMAT_COLOR_SZ_R8G8B8A8] = {4, swizzled, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}, //0x3D [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R5G5B5A1] = - {2, linear, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1}, // TODO : Verify + {2, linear, GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1}, // TODO : Verify //0x3E [NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R4G4B4A4] = {2, linear, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4}, // TODO : Verify @@ -343,9 +345,9 @@ static const SurfaceColorFormatInfo kelvin_surface_color_format_map[16] = { //0x08 [NV097_SET_SURFACE_FORMAT_COLOR_LE_A8R8G8B8] = {4, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV}, //0x09 [NV097_SET_SURFACE_FORMAT_COLOR_LE_B8] = - {}, // TODO : {1, GL_R8, GL_R8, GL_UNSIGNED_BYTE}, // PatrickvL guesstimate + {}, // TODO : {1, GL_R8, GL_RED, GL_UNSIGNED_BYTE}, // PatrickvL guesstimate //0x0A [NV097_SET_SURFACE_FORMAT_COLOR_LE_G8B8] = - {}, + {}, // TODO : {2, GL_RG8, GL_RG, GL_UNSIGNED_BYTE}, // PatrickvL guesstimate //0x0B [?] = {}, //0x0C [?] = @@ -2493,46 +2495,49 @@ static void pgraph_handle_method(NV2AState *d, glClearColor(red, green, blue, alpha); } - pgraph_update_surface(d, true, write_color, write_zeta); - glEnable(GL_SCISSOR_TEST); + if (gl_mask) { + pgraph_update_surface(d, true, write_color, write_zeta); - unsigned int xmin = GET_MASK(pg->regs[NV_PGRAPH_CLEARRECTX], + glEnable(GL_SCISSOR_TEST); + + unsigned int xmin = GET_MASK(pg->regs[NV_PGRAPH_CLEARRECTX], NV_PGRAPH_CLEARRECTX_XMIN); - unsigned int xmax = GET_MASK(pg->regs[NV_PGRAPH_CLEARRECTX], + unsigned int xmax = GET_MASK(pg->regs[NV_PGRAPH_CLEARRECTX], NV_PGRAPH_CLEARRECTX_XMAX); - unsigned int ymin = GET_MASK(pg->regs[NV_PGRAPH_CLEARRECTY], + unsigned int ymin = GET_MASK(pg->regs[NV_PGRAPH_CLEARRECTY], NV_PGRAPH_CLEARRECTY_YMIN); - unsigned int ymax = GET_MASK(pg->regs[NV_PGRAPH_CLEARRECTY], + unsigned int ymax = GET_MASK(pg->regs[NV_PGRAPH_CLEARRECTY], NV_PGRAPH_CLEARRECTY_YMAX); - unsigned int scissor_x = xmin; - unsigned int scissor_y = pg->surface_shape.clip_height - ymax - 1; + unsigned int scissor_x = xmin; + unsigned int scissor_y = pg->surface_shape.clip_height - ymax - 1; - unsigned int scissor_width = xmax - xmin + 1; - unsigned int scissor_height = ymax - ymin + 1; + unsigned int scissor_width = xmax - xmin + 1; + unsigned int scissor_height = ymax - ymin + 1; - pgraph_apply_anti_aliasing_factor(pg, &scissor_x, &scissor_y); - pgraph_apply_anti_aliasing_factor(pg, &scissor_width, &scissor_height); + pgraph_apply_anti_aliasing_factor(pg, &scissor_x, &scissor_y); + pgraph_apply_anti_aliasing_factor(pg, &scissor_width, &scissor_height); - /* FIXME: Should this really be inverted instead of ymin? */ - glScissor(scissor_x, scissor_y, scissor_width, scissor_height); + /* FIXME: Should this really be inverted instead of ymin? */ + glScissor(scissor_x, scissor_y, scissor_width, scissor_height); - NV2A_DPRINTF("------------------CLEAR 0x%x %d,%d - %d,%d %x---------------\n", - parameter, xmin, ymin, xmax, ymax, d->pgraph.regs[NV_PGRAPH_COLORCLEARVALUE]); + NV2A_DPRINTF("------------------CLEAR 0x%x %d,%d - %d,%d %x---------------\n", + parameter, xmin, ymin, xmax, ymax, d->pgraph.regs[NV_PGRAPH_COLORCLEARVALUE]); - /* Dither */ - /* FIXME: Maybe also disable it here? + GL implementation dependent */ - if (pg->regs[NV_PGRAPH_CONTROL_0] & + /* Dither */ + /* FIXME: Maybe also disable it here? + GL implementation dependent */ + if (pg->regs[NV_PGRAPH_CONTROL_0] & NV_PGRAPH_CONTROL_0_DITHERENABLE) { - glEnable(GL_DITHER); - } else { - glDisable(GL_DITHER); + glEnable(GL_DITHER); + } else { + glDisable(GL_DITHER); + } + + glClear(gl_mask); + + glDisable(GL_SCISSOR_TEST); } - - glClear(gl_mask); - - glDisable(GL_SCISSOR_TEST); } pgraph_set_surface_dirty(pg, write_color, write_zeta); @@ -3288,7 +3293,8 @@ static void pgraph_update_surface_part(NV2AState *d, bool upload, bool color) { hwaddr dma_address; GLuint *gl_buffer; unsigned int bytes_per_pixel; - GLenum gl_internal_format, gl_format, gl_type, gl_attachment; + GLint gl_internal_format; + GLenum gl_format, gl_type, gl_attachment; if (color) { surface = &pg->surface_color; @@ -4251,6 +4257,10 @@ static uint8_t* convert_texture_data(const unsigned int color_format, } return converted_data; } + case NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_A4V6YB6A4U6YA6: { + assert(false); /* FIXME */ + return NULL; + } case NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8CR8CB8Y8: { assert(false); /* FIXME */ return NULL; diff --git a/src/devices/video/nv2a_int.h b/src/devices/video/nv2a_int.h index 985ae5e74..c792e49c3 100644 --- a/src/devices/video/nv2a_int.h +++ b/src/devices/video/nv2a_int.h @@ -1407,7 +1407,7 @@ # define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_DEPTH_Y16_FIXED 0x30 # define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_DEPTH_Y16_FLOAT 0x31 # define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_Y16 0x32 -# define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_YB_16_YA_16 0x33 +# define NV097_SET_TEXTURE_FORMAT_COLOR_SZ_YB16YA16 0x33 // was NV097_SET_TEXTURE_FORMAT_COLOR_SZ_YB_16_YA_16 # define NV097_SET_TEXTURE_FORMAT_COLOR_LC_IMAGE_A4V6YB6A4U6YA6 0x34 # define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_Y16 0x35 # define NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_YB16YA16 0x36 From 1fe1e73705b20bd507ea68f5cf904fd5656fdb39 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Mon, 16 Jul 2018 12:14:24 +0200 Subject: [PATCH 0094/1000] LLE : Derive display mode (except frame_height) from PRAMDAC, remode dead code, indenting fixes, temporarily restored blitting code for debugging purposes (still works), slight code reordering. Alas, still no output from framebuffer drawing... --- src/devices/video/EmuNV2A_PRAMDAC.cpp | 2 +- src/devices/video/nv2a.cpp | 199 +++++++++++++++----------- 2 files changed, 120 insertions(+), 81 deletions(-) diff --git a/src/devices/video/EmuNV2A_PRAMDAC.cpp b/src/devices/video/EmuNV2A_PRAMDAC.cpp index 2cd190d6c..94ee70853 100644 --- a/src/devices/video/EmuNV2A_PRAMDAC.cpp +++ b/src/devices/video/EmuNV2A_PRAMDAC.cpp @@ -58,7 +58,7 @@ DEVICE_WRITE32(PRAMDAC) break; default: - //DEVICE_WRITE32_REG(pramdac); // Was : DEBUG_WRITE32_UNHANDLED(PRAMDAC); + DEVICE_WRITE32_REG(pramdac); // Was : DEBUG_WRITE32_UNHANDLED(PRAMDAC); break; } diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index 36f7817d7..c3c2c2213 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -406,8 +406,6 @@ enum { }; static GLint m_overlay_gl_uniform_location_texture = -1; -static GLint m_overlay_gl_attribute_location_position = -1; -static GLint m_overlay_gl_attribute_location_texture = -1; GLuint Get_YUV_to_RGB_shader_program() { @@ -439,8 +437,8 @@ GLuint Get_YUV_to_RGB_shader_program() " \n" "void main() \n" "{ \n" - " Out.Texcoord = Texcoord; \n" - " gl_Position = vec4(Position, 0.0, 1.0); \n" + " Out.Texcoord = Texcoord; \n" + " gl_Position = vec4(Position, 0.0, 1.0); \n" "} \n" , /* fragment shader */ // https://github.com/g-truc/ogl-samples/blob/master/data/gl-330/texture-2d.frag @@ -468,29 +466,29 @@ GLuint Get_YUV_to_RGB_shader_program() "const vec3 Bcoeff = vec3(1.164, 2.018, 0.000); \n" "void main(void) \n" "{ \n" - " // Fetch 4:2:2 YUYV macropixel \n" - " vec4 yuyv = texture2D(tex_yuyv, In.Texcoord); \n" - " // Now r-g-b-a is actually y1-u-y2-v \n" - " float u = yuyv.g; \n" - " float v = yuyv.a; \n" - " vec3 yuv; \n" - " // Convert texture coordinate into texture x position \n" - " ivec2 texture_size = textureSize(tex_yuyv, 0); \n" - " float texture_x = In.Texcoord.x * texture_size.x; \n" - " // Depending on fragment x position choose y1-u-v or y2-u-v \n" - " if (mod(texture_x, 1.0) < 0.5) { // left half \n" - " float y1 = yuyv.r; \n" - " yuv = vec3(y1, u, v); \n" - " } else { // right half \n" - " float y2 = yuyv.b; \n" - " yuv = vec3(y2, u, v); \n" - " } \n" - " // Do the color transform \n" - " yuv += offset; \n" - " Color.r = dot(yuv, Rcoeff); \n" - " Color.g = dot(yuv, Gcoeff); \n" - " Color.b = dot(yuv, Bcoeff); \n" - " Color.a = 1.0; \n" + " // Fetch 4:2:2 YUYV macropixel \n" + " vec4 yuyv = texture2D(tex_yuyv, In.Texcoord); \n" + " // Now r-g-b-a is actually y1-u-y2-v \n" + " float u = yuyv.g; \n" + " float v = yuyv.a; \n" + " vec3 yuv; \n" + " // Convert texture coordinate into texture x position \n" + " ivec2 texture_size = textureSize(tex_yuyv, 0); \n" + " float texture_x = In.Texcoord.x * texture_size.x; \n" + " // Depending on fragment x position choose y1-u-v or y2-u-v \n" + " if (mod(texture_x, 1.0) < 0.5) { // left half \n" + " float y1 = yuyv.r; \n" + " yuv = vec3(y1, u, v); \n" + " } else { // right half \n" + " float y2 = yuyv.b; \n" + " yuv = vec3(y2, u, v); \n" + " } \n" + " // Do the color transform \n" + " yuv += offset; \n" + " Color.r = dot(yuv, Rcoeff); \n" + " Color.g = dot(yuv, Gcoeff); \n" + " Color.b = dot(yuv, Bcoeff); \n" + " Color.a = 1.0; \n" "} \n" }; @@ -561,7 +559,7 @@ GLuint GetFramebufferShaderProgram() " vec2 Texcoord; \n" "} Out; \n" " \n" - "void main() \n" + "void main(void) \n" "{ \n" " Out.Texcoord = Texcoord; \n" " gl_Position = vec4(Position, 0.0, 1.0); \n" @@ -592,7 +590,6 @@ GLuint GetFramebufferShaderProgram() // Bind shader static GLuint m_framebuffer_gl_shader_program = -1; if (m_framebuffer_gl_shader_program == -1) { - m_framebuffer_gl_shader_program = glCreateProgram(); // Compile vertex shader GLuint vertex_shader = create_gl_shader(GL_VERTEX_SHADER, gl_framebuffer_shader_src[0], "Framebuffer vertex shader"); GL_CHECK(); @@ -600,6 +597,7 @@ GLuint GetFramebufferShaderProgram() GLuint fragment_shader = create_gl_shader(GL_FRAGMENT_SHADER, gl_framebuffer_shader_src[1], "Framebuffer fragment shader"); GL_CHECK(); + m_framebuffer_gl_shader_program = glCreateProgram(); GL_CHECK(); // Link vertex and fragment shaders glAttachShader(m_framebuffer_gl_shader_program, vertex_shader); @@ -634,6 +632,9 @@ GLuint GetFramebufferShaderProgram() return m_framebuffer_gl_shader_program; } +static int display_mode_format = 0; +static int frame_pixel_bytes = 1; + static GLenum frame_gl_internal_format = GL_RGBA8; static GLenum frame_gl_format = GL_BGRA; static GLenum frame_gl_type = GL_UNSIGNED_INT_8_8_8_8_REV; @@ -643,57 +644,73 @@ static GLsizei frame_width = 640; static GLsizei frame_height = 480; void cxbx_gl_update_displaymode(NV2AState *d) { - // Convert AV Format to OpenGl format details & destroy the texture if format changed. - // This is required for titles that use a non ARGB framebuffer, such as Beats of Rage - static ULONG PreviousAvDisplayModeFormat = -1; static GLenum old_frame_gl_internal_format = GL_RGBA8; static GLenum old_frame_gl_format = GL_BGRA; static GLenum old_frame_gl_type = GL_UNSIGNED_INT_8_8_8_8_REV; static GLsizei old_frame_width = 640; static GLsizei old_frame_height = 480; - if (PreviousAvDisplayModeFormat != g_AvDisplayModeFormat) { - PreviousAvDisplayModeFormat = g_AvDisplayModeFormat; + // Derive display mode and bytes per pixel from actual hardware register contents: + // This is required for titles that use a non ARGB framebuffer, such as Beats of Rage + switch (d->prmcio.cr[NV_CIO_CRE_PIXEL_INDEX] & 0x03) { + case 0: + assert(false); // TODO : Verify this + display_mode_format = g_AvDisplayModeFormat; + // TODO : Remove g_AvDisplayModeFormat entirely + frame_pixel_bytes = 1; break; + case 1: + assert(false); // TODO : Verify this + display_mode_format = g_AvDisplayModeFormat; + frame_pixel_bytes = 1; break; + case 2: + if (d->pramdac.regs[NV_PRAMDAC_GENERAL_CONTROL & (NV_PRAMDAC_SIZE - 1)] & NV_PRAMDAC_GENERAL_CONTROL_ALT_MODE_SEL) + display_mode_format = NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R5G6B5; + else + display_mode_format = NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X1R5G5B5; - frame_gl_internal_format = kelvin_color_format_map[g_AvDisplayModeFormat].gl_internal_format; - frame_gl_format = kelvin_color_format_map[g_AvDisplayModeFormat].gl_format; - frame_gl_type = kelvin_color_format_map[g_AvDisplayModeFormat].gl_type; - - AvGetFormatSize(AvpCurrentMode, &frame_width, &frame_height); - // Detect changes in framebuffer dimensions - if (old_frame_gl_internal_format != frame_gl_internal_format - || old_frame_gl_format != frame_gl_format - || old_frame_gl_type != frame_gl_type - || old_frame_width != frame_width - || old_frame_height != frame_height) { - old_frame_gl_internal_format = frame_gl_internal_format; - old_frame_gl_format = frame_gl_format; - old_frame_gl_type = frame_gl_type; - old_frame_width = frame_width; - old_frame_height = frame_height; - if (frame_gl_texture) { - glDeleteTextures(1, &frame_gl_texture); - frame_gl_texture = 0; - } - } + frame_pixel_bytes = 2; break; + case 3: + // Test-case : WWE RAW2 + display_mode_format = NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X8R8G8B8; + frame_pixel_bytes = 4; break; } - int frame_pixel_bytes = d->prmcio.cr[NV_CIO_CRE_PIXEL_INDEX] & 0x03; - if (frame_pixel_bytes >= 2) { - if (frame_pixel_bytes == 3) { - // Test-case : WWE RAW2 - frame_pixel_bytes++; - } + // Convert displau format to OpenGl format details + frame_gl_internal_format = kelvin_color_format_map[display_mode_format].gl_internal_format; + frame_gl_format = kelvin_color_format_map[display_mode_format].gl_format; + frame_gl_type = kelvin_color_format_map[display_mode_format].gl_type; - // Test case : Arctic Thunder, sets a 16 bit framebuffer (R5G6B5) not via - // AvSetDisplayMode(), but via VGA control register writes, which implies - // that g_AvDisplayModeFormat cannot be used to determine the framebuffer - // width. Instead, read the framebuffer width from the VGA control registers : - frame_width = ((int)d->prmcio.cr[NV_CIO_CR_OFFSET_INDEX]) - | (0x700 & ((int)d->prmcio.cr[NV_CIO_CRE_RPC0_INDEX] << 3)) - | (0x800 & ((int)d->prmcio.cr[NV_CIO_CRE_LSR_INDEX] << 6)); - frame_width *= 8; - frame_width /= frame_pixel_bytes; + // TODO : Replace the call to AvGetFormatSize() with deriving + // frame_height from hardware register(s) + AvGetFormatSize(AvpCurrentMode, &frame_width, &frame_height); + + // Test case : Arctic Thunder, sets a 16 bit framebuffer (R5G6B5) not via + // AvSetDisplayMode(), but via VGA control register writes, which implies + // that g_AvDisplayModeFormat cannot be used to determine the framebuffer + // width. Instead, read the framebuffer width from the VGA control registers : + frame_width = ((int)d->prmcio.cr[NV_CIO_CR_OFFSET_INDEX]) + | (0x700 & ((int)d->prmcio.cr[NV_CIO_CRE_RPC0_INDEX] << 3)) + | (0x800 & ((int)d->prmcio.cr[NV_CIO_CRE_LSR_INDEX] << 6)); + frame_width *= 8; + frame_width /= frame_pixel_bytes; + + // Detect changes in framebuffer dimensions + + if (old_frame_gl_internal_format != frame_gl_internal_format + || old_frame_gl_format != frame_gl_format + || old_frame_gl_type != frame_gl_type + || old_frame_width != frame_width + || old_frame_height != frame_height) { + old_frame_gl_internal_format = frame_gl_internal_format; + old_frame_gl_format = frame_gl_format; + old_frame_gl_type = frame_gl_type; + old_frame_width = frame_width; + old_frame_height = frame_height; + if (frame_gl_texture) { + // Destroy the texture if format changed + glDeleteTextures(1, &frame_gl_texture); + frame_gl_texture = 0; + } } } @@ -706,7 +723,7 @@ void cxbx_gl_render_framebuffer(NV2AState *d) TextureShape s; s.cubemap = false; // Note : Unused in upload_gl_texture GL_TEXTURE_2D path s.dimensionality = 2; // Note : Unused in upload_gl_texture GL_TEXTURE_2D path - s.color_format = g_AvDisplayModeFormat; + s.color_format = display_mode_format; s.levels = 1; s.width = frame_width; s.height = frame_height; @@ -751,8 +768,17 @@ void cxbx_gl_render_framebuffer(NV2AState *d) glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, cfi.gl_swizzle_mask); } - // Note : The following is modelled partially after pgraph_update_surface() - // TODO : pgraph_update_surface() also unswizzles - should we too? +#if 0 // old + // If we need to create an OpenGL framebuffer, do so + static GLuint framebuffer = -1; + if (framebuffer == -1) { + glGenFramebuffers(1, &framebuffer); + GL_CHECK(); + } + + // Target the actual framebuffer + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); +#endif #ifdef DEBUG_NV2A_GL // If the screen turns purple, glDrawArrays/glBlitFramebuffer below failed @@ -762,6 +788,17 @@ void cxbx_gl_render_framebuffer(NV2AState *d) GL_CHECK(); #endif +#if 0 // old + // Copy frame texture to an internal frame buffer + glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer); + glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, frame_gl_texture, /*level=*/0); + // Blit the active internal 'read' frame buffer to the actual 'draw' framebuffer + static const GLenum filter = GL_NEAREST; + // Note : dstY0 and dstY1 are swapped so the screen doesn't appear upside down + glBlitFramebuffer(0, 0, frame_width, frame_height, 0, frame_height, frame_width, 0, GL_COLOR_BUFFER_BIT, filter); + // Detach internal framebuffer + glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); +#else // Draw frame texture to an internal frame buffer glUseProgram(GetFramebufferShaderProgram()); GL_CHECK(); @@ -782,6 +819,7 @@ void cxbx_gl_render_framebuffer(NV2AState *d) glGenBuffers(1, &m_framebuffer_gl_vertex_buffer_object); GL_CHECK(); } + glBindBuffer(GL_ARRAY_BUFFER, m_framebuffer_gl_vertex_buffer_object); GL_CHECK(); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW); @@ -812,6 +850,7 @@ void cxbx_gl_render_framebuffer(NV2AState *d) GL_CHECK(); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); GL_CHECK(); +#endif } void pvideo_init(NV2AState *d) @@ -1038,10 +1077,16 @@ void NV2ADevice::UpdateHostDisplay(NV2AState *d) NV2A_GL_DGROUP_BEGIN("VGA Frame"); + cxbx_gl_update_displaymode(d); + + for (int v = 0; v < 2; v++) { + cxbx_gl_parse_overlay(d, v); + } + GL_RESET(); // Target the host framebuffer - glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); // NOTE : If disabled, overlays don't show?! GL_CHECK(); glDisable(GL_CULL_FACE); GL_CHECK(); @@ -1049,12 +1094,6 @@ void NV2ADevice::UpdateHostDisplay(NV2AState *d) glActiveTexture(GL_TEXTURE0); GL_CHECK(); - cxbx_gl_update_displaymode(d); - - for (int v = 0; v < 2; v++) { - cxbx_gl_parse_overlay(d, v); - } - // Is either overlay fullscreen ? if (d->pvideo.overlays[0].covers_framebuffer || d->pvideo.overlays[1].covers_framebuffer) { From cb2c65bbd26321a086dc40814a9eaf9d63549396 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Mon, 16 Jul 2018 16:07:04 +0200 Subject: [PATCH 0095/1000] LLE : Derive frame height via hardware (VGA control registers) --- src/CxbxKrnl/EmuKrnlAv.cpp | 8 ---- src/CxbxKrnl/EmuKrnlAvModes.h | 26 ++++++++++- src/devices/video/nv2a.cpp | 82 ++++++++++++++++------------------- 3 files changed, 62 insertions(+), 54 deletions(-) diff --git a/src/CxbxKrnl/EmuKrnlAv.cpp b/src/CxbxKrnl/EmuKrnlAv.cpp index 805e728c7..4c3918172 100644 --- a/src/CxbxKrnl/EmuKrnlAv.cpp +++ b/src/CxbxKrnl/EmuKrnlAv.cpp @@ -256,9 +256,6 @@ XBSYSAPI EXPORTNUM(2) VOID NTAPI xboxkrnl::AvSendTVEncoderOption } } -// Cached Display Mode format, used by NV2A to deermine framebuffer format -ULONG g_AvDisplayModeFormat = 0; - // ****************************************************************** // * 0x0003 - AvSetDisplayMode() // ****************************************************************** @@ -313,10 +310,6 @@ XBSYSAPI EXPORTNUM(3) xboxkrnl::ULONG NTAPI xboxkrnl::AvSetDisplayMode break; } - // HACK: Store D3D format that was set, so we can decode it in nv2a swap - // TODO: Fix this so nv2a state is used to get these values... - g_AvDisplayModeFormat = Format; - Pitch /= 8; if (AvpCurrentMode == Mode) { @@ -329,7 +322,6 @@ XBSYSAPI EXPORTNUM(3) xboxkrnl::ULONG NTAPI xboxkrnl::AvSetDisplayMode AvSendTVEncoderOption(RegisterBase, AV_OPTION_FLICKER_FILTER, 5, NULL); AvSendTVEncoderOption(RegisterBase, AV_OPTION_ENABLE_LUMA_FILTER, FALSE, NULL); - AvpCurrentMode = Mode; RETURN(STATUS_SUCCESS); } diff --git a/src/CxbxKrnl/EmuKrnlAvModes.h b/src/CxbxKrnl/EmuKrnlAvModes.h index e86e6a3d1..8412fb3a0 100644 --- a/src/CxbxKrnl/EmuKrnlAvModes.h +++ b/src/CxbxKrnl/EmuKrnlAvModes.h @@ -1,4 +1,26 @@ #pragma once + +// Mode enum values where: +// +// 0xC0000000 - output mode mask: +// +// 0x00000000 - 480 line SDTV +// 0x40000000 - 525 line SDTV +// 0x80000000 - HDTV +// 0xC0000000 - VGA +// +// 0x10000000 - enable WSS (_16x9) +// 0x20000000 - use SCART output (_RGB) +// +// 0x01000000 - disable DAC A +// 0x02000000 - disable DAC B +// 0x04000000 - disable DAC C +// 0x08000000 - disable DAC D +// +// 0x00FF0000 - register table index +// 0x0000FF00 - CRTC table index +// 0x000000FF - TV table index, based on output mode mask above + #define AV_MODE_TABLE_VERSION 0 #define AV_MODE_OFF 0x00000000 @@ -109,8 +131,8 @@ #define AV_MODE_FLAGS_DACC_DISABLE 0x04000000 #define AV_MODE_FLAGS_DACD_DISABLE 0x08000000 -#define AV_MODE_FLAGS_WSS 0x10000000 -#define AV_MODE_FLAGS_SCART 0x20000000 +#define AV_MODE_FLAGS_WSS 0x10000000 // _16x9 +#define AV_MODE_FLAGS_SCART 0x20000000 // _RGB #define AV_MODE_FLAGS_NTSCJ 0x00000080 #define AV_MODE_OUT_MASK 0xC0000000 diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index c3c2c2213..be6c0c764 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -66,7 +66,6 @@ namespace xboxkrnl #include "CxbxKrnl\EmuFS.h" #include "CxbxKrnl\EmuKrnl.h" #include "CxbxKrnl\HLEIntercept.h" -#include "CxbxKrnl\EmuKrnlAvModes.h" #include "vga.h" #include "nv2a.h" // For NV2AState @@ -330,25 +329,6 @@ const NV2ABlockInfo* EmuNV2A_Block(xbaddr addr) std::thread vblank_thread; extern std::chrono::time_point> GetNextVBlankTime(); -extern ULONG AvpCurrentMode; // Current AV Mode -extern ULONG g_AvDisplayModeFormat; // Current AV FrameBuffer Format - -void AvGetFormatSize(ULONG mode, int* width, int* height) -{ - // Iterate through the display mode table until we find a matching mode - for (unsigned int i = 0; i < g_DisplayModeCount; i++) { - if (g_DisplayModes[i].DisplayMode == mode) { - *width = g_DisplayModes[i].Width; - *height = g_DisplayModes[i].Height; - return; - } - } - - // if we couldn't find a valid mode, fallback to 640x480 - *width = 640; - *height = 480; -} - void _check_gl_reset() { while (true) { @@ -652,27 +632,37 @@ void cxbx_gl_update_displaymode(NV2AState *d) { // Derive display mode and bytes per pixel from actual hardware register contents: // This is required for titles that use a non ARGB framebuffer, such as Beats of Rage + bool alt_mode = d->pramdac.regs[NV_PRAMDAC_GENERAL_CONTROL & (NV_PRAMDAC_SIZE - 1)] + & NV_PRAMDAC_GENERAL_CONTROL_ALT_MODE_SEL; switch (d->prmcio.cr[NV_CIO_CRE_PIXEL_INDEX] & 0x03) { - case 0: + case 1: // 8bpp assert(false); // TODO : Verify this - display_mode_format = g_AvDisplayModeFormat; - // TODO : Remove g_AvDisplayModeFormat entirely - frame_pixel_bytes = 1; break; - case 1: - assert(false); // TODO : Verify this - display_mode_format = g_AvDisplayModeFormat; - frame_pixel_bytes = 1; break; - case 2: - if (d->pramdac.regs[NV_PRAMDAC_GENERAL_CONTROL & (NV_PRAMDAC_SIZE - 1)] & NV_PRAMDAC_GENERAL_CONTROL_ALT_MODE_SEL) + frame_pixel_bytes = 1; + break; + case 2: // 15 or 16 bpp + if (alt_mode) { + // Test case : Arctic Thunder display_mode_format = NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_R5G6B5; - else + } + else { display_mode_format = NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X1R5G5B5; + } - frame_pixel_bytes = 2; break; - case 3: - // Test-case : WWE RAW2 - display_mode_format = NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X8R8G8B8; - frame_pixel_bytes = 4; break; + frame_pixel_bytes = 2; + break; + case 0: // VGA; Fall through + case 3: // 24 or 32 bpp + if (alt_mode) { + // Test-case : WWE RAW2 + display_mode_format = NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_X8R8G8B8; + } + else { + // Test-case : XDK sample DolphinClassic (after VGA fall-through) + display_mode_format = NV097_SET_TEXTURE_FORMAT_COLOR_LU_IMAGE_A8R8G8B8; + } + + frame_pixel_bytes = 4; + break; } // Convert displau format to OpenGl format details @@ -680,13 +670,9 @@ void cxbx_gl_update_displaymode(NV2AState *d) { frame_gl_format = kelvin_color_format_map[display_mode_format].gl_format; frame_gl_type = kelvin_color_format_map[display_mode_format].gl_type; - // TODO : Replace the call to AvGetFormatSize() with deriving - // frame_height from hardware register(s) - AvGetFormatSize(AvpCurrentMode, &frame_width, &frame_height); - // Test case : Arctic Thunder, sets a 16 bit framebuffer (R5G6B5) not via // AvSetDisplayMode(), but via VGA control register writes, which implies - // that g_AvDisplayModeFormat cannot be used to determine the framebuffer + // that it's format argument cannot be used to determine the framebuffer // width. Instead, read the framebuffer width from the VGA control registers : frame_width = ((int)d->prmcio.cr[NV_CIO_CR_OFFSET_INDEX]) | (0x700 & ((int)d->prmcio.cr[NV_CIO_CRE_RPC0_INDEX] << 3)) @@ -694,8 +680,14 @@ void cxbx_gl_update_displaymode(NV2AState *d) { frame_width *= 8; frame_width /= frame_pixel_bytes; - // Detect changes in framebuffer dimensions + // Derive frame_height from hardware registers + frame_height = ((int)d->prmcio.cr[NV_CIO_CR_VDE_INDEX]) + | (((int)d->prmcio.cr[NV_CIO_CR_OVL_INDEX] & 0x02) >> 1 << 8) + | (((int)d->prmcio.cr[NV_CIO_CR_OVL_INDEX] & 0x40) >> 6 << 9) + | (((int)d->prmcio.cr[NV_CIO_CRE_LSR_INDEX] & 0x02) >> 1 << 10); + frame_height++; + // Detect changes in framebuffer dimensions if (old_frame_gl_internal_format != frame_gl_internal_format || old_frame_gl_format != frame_gl_format || old_frame_gl_type != frame_gl_type @@ -708,6 +700,7 @@ void cxbx_gl_update_displaymode(NV2AState *d) { old_frame_height = frame_height; if (frame_gl_texture) { // Destroy the texture if format changed + // Test case : XDK sample DolphinClassic glDeleteTextures(1, &frame_gl_texture); frame_gl_texture = 0; } @@ -768,7 +761,8 @@ void cxbx_gl_render_framebuffer(NV2AState *d) glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, cfi.gl_swizzle_mask); } -#if 0 // old +//#define BLIT_FRAMEBUFFER +#ifdef BLIT_FRAMEBUFFER // If we need to create an OpenGL framebuffer, do so static GLuint framebuffer = -1; if (framebuffer == -1) { @@ -788,7 +782,7 @@ void cxbx_gl_render_framebuffer(NV2AState *d) GL_CHECK(); #endif -#if 0 // old +#ifdef BLIT_FRAMEBUFFER // Copy frame texture to an internal frame buffer glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer); glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, frame_gl_texture, /*level=*/0); From 76b983bd17dcaca568a00605846fd4135a9b21c7 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Tue, 17 Jul 2018 10:39:44 +0200 Subject: [PATCH 0096/1000] LLE : Comment typo --- src/devices/video/nv2a.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index be6c0c764..46ad358ba 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -793,7 +793,7 @@ void cxbx_gl_render_framebuffer(NV2AState *d) // Detach internal framebuffer glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); #else - // Draw frame texture to an internal frame buffer + // Draw frame texture to host frame buffer glUseProgram(GetFramebufferShaderProgram()); GL_CHECK(); glUniform1i(m_framebuffer_gl_uniform_location_texture, SAMP_TEXCOORD); From adfa2dfa5281bb64363b1b43f1684994d7e4407d Mon Sep 17 00:00:00 2001 From: patrickvl Date: Wed, 25 Jul 2018 17:53:01 +0200 Subject: [PATCH 0097/1000] LLE : For any texture with multiple levels (or faces), use the given TextureShape's.color_format. Otherwise, when a first step selects another resulting_format, all following steps would incorrectly interpret the input using that format. --- src/devices/video/EmuNV2A_PGRAPH.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/devices/video/EmuNV2A_PGRAPH.cpp b/src/devices/video/EmuNV2A_PGRAPH.cpp index 3c1860922..886332ba0 100644 --- a/src/devices/video/EmuNV2A_PGRAPH.cpp +++ b/src/devices/video/EmuNV2A_PGRAPH.cpp @@ -4313,7 +4313,7 @@ static int upload_gl_texture(GLenum gl_target, s.width, s.height, 1, s.pitch, 0); - resulting_format = converted ? converted_format : resulting_format; + resulting_format = converted ? converted_format : s.color_format; ColorFormatInfo cf = kelvin_color_format_map[resulting_format]; glTexImage2D(gl_target, 0, cf.gl_internal_format, s.width, s.height, 0, @@ -4376,7 +4376,7 @@ static int upload_gl_texture(GLenum gl_target, width, height, 1, pitch, 0); - resulting_format = converted ? converted_format : resulting_format; + resulting_format = converted ? converted_format : s.color_format; ColorFormatInfo cf = kelvin_color_format_map[resulting_format]; glTexImage2D(gl_target, level, cf.gl_internal_format, width, height, 0, @@ -4390,7 +4390,7 @@ static int upload_gl_texture(GLenum gl_target, g_free(unswizzled); } - texture_data += width * height * f.bytes_per_pixel; + texture_data += pitch * height; } width /= 2; @@ -4419,7 +4419,7 @@ static int upload_gl_texture(GLenum gl_target, width, height, depth, row_pitch, slice_pitch); - resulting_format = converted ? converted_format : resulting_format; + resulting_format = converted ? converted_format : s.color_format; ColorFormatInfo cf = kelvin_color_format_map[resulting_format]; glTexImage3D(gl_target, level, cf.gl_internal_format, width, height, depth, 0, From 0fc52707024fb431a34fe402564abfe39541df3f Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Fri, 27 Jul 2018 22:14:09 +0100 Subject: [PATCH 0098/1000] Prevent side-effects of the lock/unlock action for FS --- src/CxbxKrnl/EmuFS.cpp | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/CxbxKrnl/EmuFS.cpp b/src/CxbxKrnl/EmuFS.cpp index b4b491371..15b3026e9 100644 --- a/src/CxbxKrnl/EmuFS.cpp +++ b/src/CxbxKrnl/EmuFS.cpp @@ -130,35 +130,32 @@ xboxkrnl::KPCR* KeGetPcr(); uint32_t fs_lock = 0; -__declspec(naked) void LockFSInternal() -{ - __asm { - mov eax, 1 - xchg eax, [fs_lock] - test eax, eax - jnz LockFSInternal - ret - } -} - __declspec(naked) void LockFS() { - __asm { - push eax - call LockFSInternal - pop eax - ret + __asm { + pushfd + pushad + spinlock : + mov eax, 1 + xchg eax, fs_lock + test eax, eax + jnz spinlock + popad + popfd + ret } } __declspec(naked) void UnlockFS() { - __asm { - push eax - xor eax, eax - xchg eax, [fs_lock] - pop eax - ret + __asm { + pushfd + pushad + xor eax, eax + xchg eax, fs_lock + popad + popfd + ret } } From 96a91944b80e0dc2e3ce75128876c9e7b34a9dd7 Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Sat, 28 Jul 2018 19:42:57 +0100 Subject: [PATCH 0099/1000] Quick Fix: RtlLeaveCriticalSectionAndRegion no longer fails kernel test suite --- src/CxbxKrnl/EmuKrnlRtl.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/CxbxKrnl/EmuKrnlRtl.cpp b/src/CxbxKrnl/EmuKrnlRtl.cpp index 94a367878..93411908a 100644 --- a/src/CxbxKrnl/EmuKrnlRtl.cpp +++ b/src/CxbxKrnl/EmuKrnlRtl.cpp @@ -1280,7 +1280,10 @@ XBSYSAPI EXPORTNUM(295) xboxkrnl::VOID NTAPI xboxkrnl::RtlLeaveCriticalSectionAn LOG_FUNC_ONE_ARG(CriticalSection); RtlLeaveCriticalSection(CriticalSection); - KeLeaveCriticalRegion(); + + if (CriticalSection->RecursionCount == 0) { + KeLeaveCriticalRegion(); + } } // ****************************************************************** From 3d18703c865224ec9384682b60317f4d98a30c38 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Sun, 29 Jul 2018 14:43:51 +0200 Subject: [PATCH 0100/1000] Bug fixes, still no input (kernel problem?) --- src/CxbxKrnl/CxbxKrnl.cpp | 10 +- src/CxbxKrnl/Timer.cpp | 5 +- src/devices/usb/Hub.cpp | 4 +- src/devices/usb/OHCI.cpp | 291 ++++++++++++++++++++++----------- src/devices/usb/OHCI.h | 7 +- src/devices/usb/XidGamepad.cpp | 2 +- 6 files changed, 209 insertions(+), 110 deletions(-) diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index be222041f..32199f36d 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -108,7 +108,7 @@ bool g_bIsRetail = false; DWORD_PTR g_CPUXbox = 0; DWORD_PTR g_CPUOthers = 0; -// Indicates to enable/disable all interrupts when cli and sti instructions are executed +// Indicates to disable/enable all interrupts when cli and sti instructions are executed std::atomic_bool g_bEnableAllInterrupts = true; // Set by the VMManager during initialization. Exported because it's needed in other parts of the emu @@ -654,7 +654,7 @@ void TriggerPendingConnectedInterrupts() { for (int i = 0; i < MAX_BUS_INTERRUPT_LEVEL; i++) { // If the interrupt is pending and connected, process it - if (HalSystemInterrupts[i].IsPending() && EmuInterruptList[i] && EmuInterruptList[i]->Connected) { + if (g_bEnableAllInterrupts && HalSystemInterrupts[i].IsPending() && EmuInterruptList[i] && EmuInterruptList[i]->Connected) { HalSystemInterrupts[i].Trigger(EmuInterruptList[i]); } } @@ -672,10 +672,8 @@ static unsigned int WINAPI CxbxKrnlInterruptThread(PVOID param) #endif while (true) { - if (g_bEnableAllInterrupts) { - TriggerPendingConnectedInterrupts(); - Sleep(1); - } + TriggerPendingConnectedInterrupts(); + Sleep(1); } return 0; diff --git a/src/CxbxKrnl/Timer.cpp b/src/CxbxKrnl/Timer.cpp index 782e5acdf..31e87d2a8 100644 --- a/src/CxbxKrnl/Timer.cpp +++ b/src/CxbxKrnl/Timer.cpp @@ -80,7 +80,7 @@ inline uint64_t GetTime_NS(TimerObject* Timer) // Calculates the next expire time of the timer static inline uint64_t GetNextExpireTime(TimerObject* Timer) { - return GetTime_NS(Timer) + Timer->ExpireTime_MS.load() * SCALE_MS; + return GetTime_NS(Timer) + Timer->ExpireTime_MS.load(); } // Deallocates the memory of the timer @@ -145,7 +145,8 @@ TimerObject* Timer_Create(pTimerCB Callback, void* Arg, unsigned int Factor) return pTimer; } -// Starts the timer +// Starts the timer +// Expire_MS must be expressed in NS void Timer_Start(TimerObject* Timer, uint64_t Expire_MS) { Timer->ExpireTime_MS.store(Expire_MS); diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index 506a238e4..c9729f6ba 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -238,7 +238,7 @@ int Hub::UsbHubClaimPort(XboxDeviceState* dev, int port) m_UsbDev = g_USB0; } - while (m_UsbDev->m_HostController->m_bFrameTime) {} + while (m_UsbDev->m_HostController->m_bFrameTime) { Sleep(1); } m_UsbDev->m_HostController->m_bFrameTime = true; for (auto usb_port : m_UsbDev->m_FreePorts) { @@ -709,7 +709,7 @@ void Hub::HubCleanUp() void Hub::HubDestroy() { - while (m_UsbDev->m_HostController->m_bFrameTime) {} + while (m_UsbDev->m_HostController->m_bFrameTime) { Sleep(1); } m_UsbDev->m_HostController->m_bFrameTime = true; m_pPeripheralFuncStruct->handle_destroy(); m_UsbDev->m_HostController->m_bFrameTime = false; diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index 23cfa1fd6..e503c7151 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -123,7 +123,7 @@ namespace xboxkrnl #define OHCI_ED_EN_MASK (0xF< 50 real ms) - m_pEOFtimer = Timer_Create(OHCI_FrameBoundaryWrapper, this, 50); + m_pEOFtimer = Timer_Create(OHCI_FrameBoundaryWrapper, this, 100); + TestOut("Bus start.\n"); DbgPrintf("%s: Operational mode event\n", LOG_STR_OHCI); @@ -930,13 +947,16 @@ void OHCI::OHCI_BusStop() // Delete existing EOF timer Timer_Exit(m_pEOFtimer); } - m_pEOFtimer = nullptr; + m_pEOFtimer = nullptr; + TestOut("Bus stop\n"); } void OHCI::OHCI_SOF(bool bCreate) { // set current SOF time - m_SOFtime = GetTime_NS(m_pEOFtimer); + m_SOFtime = GetTime_NS(m_pEOFtimer); + + TestOut("OHCI_SOF -> m_SOFtime is 0x%X\n", m_SOFtime); // make timer expire at SOF + 1 virtual ms from now if (bCreate) { @@ -950,7 +970,9 @@ void OHCI::OHCI_ChangeState(uint32_t Value) { uint32_t OldState = m_Registers.HcControl & OHCI_CTL_HCFS; m_Registers.HcControl = Value; - uint32_t NewState = m_Registers.HcControl & OHCI_CTL_HCFS; + uint32_t NewState = m_Registers.HcControl & OHCI_CTL_HCFS; + + TestOut("OldState 0x%X\n", OldState); // no state change if (OldState == NewState) { @@ -960,20 +982,24 @@ void OHCI::OHCI_ChangeState(uint32_t Value) switch (NewState) { case Operational: - OHCI_BusStart(); + OHCI_BusStart(); + TestOut("NewState Operational\n"); break; case Suspend: OHCI_BusStop(); - DbgPrintf("%s: Suspend mode event\n", LOG_STR_OHCI); + DbgPrintf("%s: Suspend mode event\n", LOG_STR_OHCI); + TestOut("NewState Suspend\n"); break; case Resume: - DbgPrintf("%s: Resume mode event\n", LOG_STR_OHCI); + DbgPrintf("%s: Resume mode event\n", LOG_STR_OHCI); + TestOut("NewState Resume\n"); break; case Reset: - OHCI_StateReset(); + OHCI_StateReset(); + TestOut("NewState Reset\n"); break; default: @@ -1003,101 +1029,125 @@ uint32_t OHCI::OHCI_ReadRegister(xbaddr Addr) switch (Addr >> 2) // read the register { case 0: // HcRevision - ret = m_Registers.HcRevision; + ret = m_Registers.HcRevision; + TestOut("m_Registers.HcRevision: 0x%X\n", m_Registers.HcRevision); break; case 1: // HcControl - ret = m_Registers.HcControl; + ret = m_Registers.HcControl; + TestOut("m_Registers.HcControl: 0x%X\n", m_Registers.HcControl); break; case 2: // HcCommandStatus - ret = m_Registers.HcCommandStatus; + ret = m_Registers.HcCommandStatus; + TestOut("m_Registers.HcCommandStatus: 0x%X\n", m_Registers.HcCommandStatus); break; case 3: // HcInterruptStatus - ret = m_Registers.HcInterruptStatus; + ret = m_Registers.HcInterruptStatus; + TestOut("m_Registers.HcInterruptStatus: 0x%X\n", m_Registers.HcInterruptStatus); break; case 4: // HcInterruptEnable case 5: // HcInterruptDisable - ret = m_Registers.HcInterrupt; + ret = m_Registers.HcInterrupt; + TestOut("m_Registers.HcInterrupt: 0x%X\n", m_Registers.HcInterrupt); break; case 6: // HcHCCA - ret = m_Registers.HcHCCA; + ret = m_Registers.HcHCCA; + TestOut("m_Registers.HcHCCA: 0x%X\n", m_Registers.HcHCCA); break; case 7: // HcPeriodCurrentED - ret = m_Registers.HcPeriodCurrentED; + ret = m_Registers.HcPeriodCurrentED; + TestOut("m_Registers.HcPeriodCurrentED: 0x%X\n", m_Registers.HcPeriodCurrentED); break; case 8: // HcControlHeadED - ret = m_Registers.HcControlHeadED; + ret = m_Registers.HcControlHeadED; + TestOut("m_Registers.HcControlHeadED: 0x%X\n", m_Registers.HcControlHeadED); break; case 9: // HcControlCurrentED - ret = m_Registers.HcControlCurrentED; + ret = m_Registers.HcControlCurrentED; + TestOut("m_Registers.HcControlCurrentED: 0x%X\n", m_Registers.HcControlCurrentED); break; case 10: // HcBulkHeadED - ret = m_Registers.HcBulkHeadED; + ret = m_Registers.HcBulkHeadED; + TestOut("m_Registers.HcBulkHeadED: 0x%X\n", m_Registers.HcBulkHeadED); break; case 11: // HcBulkCurrentED - ret = m_Registers.HcBulkCurrentED; + ret = m_Registers.HcBulkCurrentED; + TestOut("m_Registers.HcBulkCurrentED: 0x%X\n", m_Registers.HcBulkCurrentED); break; case 12: // HcDoneHead - ret = m_Registers.HcDoneHead; + ret = m_Registers.HcDoneHead; + TestOut("m_Registers.HcDoneHead: 0x%X\n", m_Registers.HcDoneHead); break; case 13: // HcFmInterval - ret = m_Registers.HcFmInterval; + ret = m_Registers.HcFmInterval; + TestOut("m_Registers.HcFmInterval: 0x%X\n", m_Registers.HcFmInterval); break; case 14: // HcFmRemaining - ret = OHCI_GetFrameRemaining(); + ret = OHCI_GetFrameRemaining(); + TestOut("m_Registers.HcFmRemaining: 0x%X\n", m_Registers.HcFmRemaining); break; case 15: // HcFmNumber - ret = m_Registers.HcFmNumber; + ret = m_Registers.HcFmNumber; + TestOut("m_Registers.HcFmNumber: 0x%X\n", m_Registers.HcFmNumber); break; case 16: // HcPeriodicStart - ret = m_Registers.HcPeriodicStart; + ret = m_Registers.HcPeriodicStart; + TestOut("m_Registers.HcPeriodicStart: 0x%X\n", m_Registers.HcPeriodicStart); break; case 17: // HcLSThreshold - ret = m_Registers.HcLSThreshold; + ret = m_Registers.HcLSThreshold; + TestOut("m_Registers.HcLSThreshold: 0x%X\n", m_Registers.HcLSThreshold); break; case 18: // HcRhDescriptorA - ret = m_Registers.HcRhDescriptorA; + ret = m_Registers.HcRhDescriptorA; + TestOut("m_Registers.HcRhDescriptorA: 0x%X\n", m_Registers.HcRhDescriptorA); break; case 19: // HcRhDescriptorB - ret = m_Registers.HcRhDescriptorB; + ret = m_Registers.HcRhDescriptorB; + TestOut("m_Registers.HcRhDescriptorB: 0x%X\n", m_Registers.HcRhDescriptorB); break; case 20: // HcRhStatus - ret = m_Registers.HcRhStatus; + ret = m_Registers.HcRhStatus; + TestOut("m_Registers.HcRhStatus: 0x%X\n", m_Registers.HcRhStatus); break; // Always report that the port power is on since the Xbox cannot switch off the electrical current to it case 21: // RhPort 0 - ret = m_Registers.RhPort[0].HcRhPortStatus | OHCI_PORT_PPS; + ret = m_Registers.RhPort[0].HcRhPortStatus | OHCI_PORT_PPS; + TestOut("m_Registers.RhPort[0].HcRhPortStatus: 0x%X\n", m_Registers.RhPort[0].HcRhPortStatus | OHCI_PORT_PPS); break; case 22: // RhPort 1 - ret = m_Registers.RhPort[1].HcRhPortStatus | OHCI_PORT_PPS; + ret = m_Registers.RhPort[1].HcRhPortStatus | OHCI_PORT_PPS; + TestOut("m_Registers.RhPort[1].HcRhPortStatus: 0x%X\n", m_Registers.RhPort[1].HcRhPortStatus | OHCI_PORT_PPS); break; case 23: - ret = 0; + ret = 0 | OHCI_PORT_PPS; + TestOut("m_Registers.RhPort[2].HcRhPortStatus: 0x%X\n", ret); break; case 24: - ret = 0; + ret = 0 | OHCI_PORT_PPS; + TestOut("m_Registers.RhPort[3].HcRhPortStatus: 0x%X\n", ret); break; default: @@ -1118,16 +1168,20 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) switch (Addr >> 2) { case 0: // HcRevision - // This register is read-only + // This register is read-only + TestOut("W m_Registers.HcRevision: 0x%X\n", Value); break; - case 1: // HcControl - OHCI_ChangeState(Value); + case 1: // HcControl + TestOut("W m_Registers.HcControl: 0x%X\n", Value); + OHCI_ChangeState(Value); + TestOut("W m_Registers.HcControl: 0x%X\n", m_Registers.HcControl); break; case 2: // HcCommandStatus { - // SOC is read-only + // SOC is read-only + TestOut("W m_Registers.HcCommandStatus: 0x%X\n", Value); Value &= ~OHCI_STATUS_SOC; // From the standard: "The Host Controller must ensure that bits written as 1 become set @@ -1137,104 +1191,142 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) if (m_Registers.HcCommandStatus & OHCI_STATUS_HCR) { // Do a hardware reset OHCI_StateReset(); - } + } + TestOut("W m_Registers.HcCommandStatus: 0x%X\n", m_Registers.HcCommandStatus); } break; - case 3: // HcInterruptStatus + case 3: // HcInterruptStatus + TestOut("W m_Registers.HcInterruptStatus: 0x%X\n", Value); m_Registers.HcInterruptStatus &= ~Value; - OHCI_UpdateInterrupt(); + OHCI_UpdateInterrupt(); + TestOut("W m_Registers.HcInterruptStatus: 0x%X\n", m_Registers.HcInterruptStatus); break; - case 4: // HcInterruptEnable + case 4: // HcInterruptEnable + TestOut("W m_Registers.HcInterruptEnable: 0x%X\n", Value); m_Registers.HcInterrupt |= Value; - OHCI_UpdateInterrupt(); + OHCI_UpdateInterrupt(); + TestOut("W m_Registers.HcInterruptEnable: 0x%X\n", m_Registers.HcInterrupt); break; - case 5: // HcInterruptDisable + case 5: // HcInterruptDisable + TestOut("W m_Registers.HcInterruptDisable: 0x%X\n", Value); m_Registers.HcInterrupt &= ~Value; - OHCI_UpdateInterrupt(); + OHCI_UpdateInterrupt(); + TestOut("W m_Registers.HcInterruptDisable: 0x%X\n", m_Registers.HcInterrupt); break; case 6: // HcHCCA - // The standard says the minimum alignment is 256 bytes and so bits 0 through 7 are always zero - m_Registers.HcHCCA = Value & OHCI_HCCA_MASK; + // The standard says the minimum alignment is 256 bytes and so bits 0 through 7 are always zero + TestOut("W m_Registers.HcHCCA: 0x%X\n", Value); + m_Registers.HcHCCA = Value & OHCI_HCCA_MASK; + TestOut("W m_Registers.HcHCCA: 0x%X\n", m_Registers.HcHCCA); break; case 7: // HcPeriodCurrentED - // This register is read-only + // This register is read-only + TestOut("W m_Registers.HcPeriodCurrentED: 0x%X\n", Value); break; - case 8: // HcControlHeadED - m_Registers.HcControlHeadED = Value & OHCI_DPTR_MASK; + case 8: // HcControlHeadED + TestOut("W m_Registers.HcControlHeadED: 0x%X\n", Value); + m_Registers.HcControlHeadED = Value & OHCI_DPTR_MASK; + TestOut("W m_Registers.HcControlHeadED: 0x%X\n", m_Registers.HcControlHeadED); break; - case 9: // HcControlCurrentED - m_Registers.HcControlCurrentED = Value & OHCI_DPTR_MASK; + case 9: // HcControlCurrentED + TestOut("W m_Registers.HcControlCurrentED: 0x%X\n", Value); + m_Registers.HcControlCurrentED = Value & OHCI_DPTR_MASK; + TestOut("W m_Registers.HcControlCurrentED: 0x%X\n", m_Registers.HcControlCurrentED); break; - case 10: // HcBulkHeadED - m_Registers.HcBulkHeadED = Value & OHCI_DPTR_MASK; + case 10: // HcBulkHeadED + TestOut("W m_Registers.HcBulkHeadED: 0x%X\n", Value); + m_Registers.HcBulkHeadED = Value & OHCI_DPTR_MASK; + TestOut("W m_Registers.HcBulkHeadED: 0x%X\n", m_Registers.HcBulkHeadED); break; - case 11: // HcBulkCurrentED - m_Registers.HcBulkCurrentED = Value & OHCI_DPTR_MASK; + case 11: // HcBulkCurrentED + TestOut("W m_Registers.HcBulkCurrentED: 0x%X\n", Value); + m_Registers.HcBulkCurrentED = Value & OHCI_DPTR_MASK; + TestOut("W m_Registers.HcBulkCurrentED: 0x%X\n", m_Registers.HcBulkCurrentED); break; - case 12: // HcDoneHead + case 12: // HcDoneHead + TestOut("W m_Registers.HcDoneHead: 0x%X\n", Value); // This register is read-only break; case 13: // HcFmInterval - { - if ((Value & OHCI_FMI_FIT) != (m_Registers.HcFmInterval & OHCI_FMI_FIT)) { + { + TestOut("W m_Registers.HcFmInterval: 0x%X\n", Value); + if ((Value & OHCI_FMI_FI) != (m_Registers.HcFmInterval & OHCI_FMI_FI)) { DbgPrintf("%s: Changing frame interval duration. New value is %u\n", LOG_STR_OHCI, Value & OHCI_FMI_FI); } - m_Registers.HcFmInterval = Value & ~0xC000; + m_Registers.HcFmInterval = Value & ~0xC000; + TestOut("W m_Registers.HcFmInterval: 0x%X\n", m_Registers.HcFmInterval); } break; case 14: // HcFmRemaining - // This register is read-only + // This register is read-only + TestOut("W m_Registers.HcFmRemaining: 0x%X\n", Value); break; case 15: // HcFmNumber - // This register is read-only + // This register is read-only + TestOut("W m_Registers.HcFmNumber: 0x%X\n", Value); break; - case 16: // HcPeriodicStart - m_Registers.HcPeriodicStart = Value & 0x3FFF; + case 16: // HcPeriodicStart + TestOut("W m_Registers.HcPeriodicStart: 0x%X\n", Value); + m_Registers.HcPeriodicStart = Value & 0x3FFF; + TestOut("W m_Registers.HcPeriodicStart: 0x%X\n", m_Registers.HcPeriodicStart); break; - case 17: // HcLSThreshold - m_Registers.HcLSThreshold = Value & 0xFFF; + case 17: // HcLSThreshold + TestOut("W m_Registers.HcLSThreshold: 0x%X\n", Value); + m_Registers.HcLSThreshold = Value & 0xFFF; + TestOut("W m_Registers.HcLSThreshold: 0x%X\n", m_Registers.HcLSThreshold); break; - case 18: // HcRhDescriptorA + case 18: // HcRhDescriptorA + TestOut("W m_Registers.HcRhDescriptorA: 0x%X\n", Value); m_Registers.HcRhDescriptorA &= ~OHCI_RHA_RW_MASK; - m_Registers.HcRhDescriptorA |= Value & OHCI_RHA_RW_MASK; // ?? + m_Registers.HcRhDescriptorA |= Value & OHCI_RHA_RW_MASK; // ?? + TestOut("W m_Registers.HcRhDescriptorA: 0x%X\n", m_Registers.HcRhDescriptorA); break; - case 19: // HcRhDescriptorB + case 19: // HcRhDescriptorB + TestOut("W m_Registers.HcRhDescriptorB: 0x%X\n", Value); // Don't do anything, the attached devices are all removable and PowerSwitchingMode is always 0 break; - case 20: // HcRhStatus - OHCI_SetHubStatus(Value); + case 20: // HcRhStatus + TestOut("W m_Registers.HcRhStatus: 0x%X\n", Value); + OHCI_SetHubStatus(Value); + TestOut("W m_Registers.HcRhStatus: 0x%X\n", m_Registers.HcRhStatus); break; - case 21: // RhPort 0 - OHCI_PortSetStatus(0, Value); + case 21: // RhPort 0 + TestOut("W m_Registers.RhPort 0: 0x%X\n", Value); + OHCI_PortSetStatus(0, Value); + TestOut("W m_Registers.RhPort 0: 0x%X\n", m_Registers.RhPort[0].HcRhPortStatus); break; - case 22: // RhPort 1 - OHCI_PortSetStatus(1, Value); + case 22: // RhPort 1 + TestOut("W m_Registers.RhPort 1: 0x%X\n", Value); + OHCI_PortSetStatus(1, Value); + TestOut("W m_Registers.RhPort 1: 0x%X\n", m_Registers.RhPort[1].HcRhPortStatus); break; case 23: + TestOut("W m_Registers.RhPort 2: 0x%X\n", Value); break; case 24: + TestOut("W m_Registers.RhPort 3: 0x%X\n", Value); break; default: @@ -1245,10 +1337,11 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) void OHCI::OHCI_UpdateInterrupt() { - if ((m_Registers.HcInterrupt & OHCI_INTR_MIE) && (m_Registers.HcInterruptStatus & m_Registers.HcInterrupt)) { - HalSystemInterrupts[m_IrqNum].Assert(true); + if ((m_Registers.HcInterrupt & OHCI_INTR_MIE) && (m_Registers.HcInterruptStatus & m_Registers.HcInterrupt)) { + HalSystemInterrupts[m_IrqNum].Assert(false); + HalSystemInterrupts[m_IrqNum].Assert(true); + TestOut("Fired interrupt -> m_Registers.HcInterruptStatus is 0x%X\n", m_Registers.HcInterruptStatus); } - else { HalSystemInterrupts[m_IrqNum].Assert(false); } } void OHCI::OHCI_SetInterrupt(uint32_t Value) @@ -1428,7 +1521,9 @@ int OHCI::OHCI_PortSetIfConnected(int i, uint32_t Value) void OHCI::OHCI_Detach(USBPort* Port) { OHCIPort* port = &m_Registers.RhPort[Port->PortIndex]; - uint32_t old_state = port->HcRhPortStatus; + uint32_t old_state = port->HcRhPortStatus; + + TestOut("OHCI_Detach\n"); OHCI_AsyncCancelDevice(Port->Dev); @@ -1454,7 +1549,9 @@ void OHCI::OHCI_Detach(USBPort* Port) void OHCI::OHCI_Attach(USBPort* Port) { OHCIPort* port = &m_Registers.RhPort[Port->PortIndex]; - uint32_t old_state = port->HcRhPortStatus; + uint32_t old_state = port->HcRhPortStatus; + + TestOut("OHCI_Attach\n"); // set connect status port->HcRhPortStatus |= OHCI_PORT_CCS | OHCI_PORT_CSC; @@ -1480,12 +1577,14 @@ void OHCI::OHCI_Attach(USBPort* Port) } void OHCI::OHCI_ChildDetach(XboxDeviceState* child) -{ +{ + TestOut("OHCI_ChildDetach\n"); OHCI_AsyncCancelDevice(child); } void OHCI::OHCI_Wakeup(USBPort* port1) { + TestOut("OHCI_Wakeup\n"); OHCIPort* port = &m_Registers.RhPort[port1->PortIndex]; uint32_t intr = 0; if (port->HcRhPortStatus & OHCI_PORT_PSS) { @@ -1522,7 +1621,7 @@ void OHCI::OHCI_AsyncCancelDevice(XboxDeviceState* dev) m_UsbDevice->USB_IsPacketInflight(&m_UsbPacket) && m_UsbPacket.Endpoint->Dev == dev) { m_UsbDevice->USB_CancelPacket(&m_UsbPacket); - m_AsyncTD = 0; + m_AsyncTD = xbnull; } } diff --git a/src/devices/usb/OHCI.h b/src/devices/usb/OHCI.h index 1556a45a1..3f1b3e776 100644 --- a/src/devices/usb/OHCI.h +++ b/src/devices/usb/OHCI.h @@ -48,7 +48,8 @@ // SOF: start of frame; the beginning of a USB-defined frame // EOF: end of frame; the end of a USB-defined frame // ED: endpoint descriptor; a memory structure used by the HC to communicate with an endpoint -// TD: transfer descriptor; a memory structure used by the HC to transfer a block of data to/from a device endpoint +// TD: transfer descriptor; a memory structure used by the HC to transfer a block of data to/from a device endpoint +// HCCA: Host Controller Communications Area; shared memory between the HC and HCD /* endpoint descriptor */ @@ -157,7 +158,7 @@ class OHCI private: // pointer to g_USB0 or g_USB1 USBDevice* m_UsbDevice = nullptr; - // all the registers available on the OHCI standard + // all the registers available in the OHCI standard OHCI_Registers m_Registers; // end-of-frame timer TimerObject* m_pEOFtimer = nullptr; @@ -246,7 +247,7 @@ class OHCI // process an isochronous TD int OHCI_ServiceIsoTD(OHCI_ED* ed, int completion); // find the usb device with the supplied address - XboxDeviceState* OHCI::OHCI_FindDevice(uint8_t Addr); + XboxDeviceState* OHCI_FindDevice(uint8_t Addr); // cancel a packet when a device is removed void OHCI_AsyncCancelDevice(XboxDeviceState* dev); // Process Control and Bulk lists diff --git a/src/devices/usb/XidGamepad.cpp b/src/devices/usb/XidGamepad.cpp index 66d260b56..4b8dfa3c8 100644 --- a/src/devices/usb/XidGamepad.cpp +++ b/src/devices/usb/XidGamepad.cpp @@ -257,7 +257,7 @@ int XidGamepad::UsbXidClaimPort(XboxDeviceState* dev, int port) return -1; } - while (m_UsbDev->m_HostController->m_bFrameTime) {} + while (m_UsbDev->m_HostController->m_bFrameTime) { Sleep(1); } m_UsbDev->m_HostController->m_bFrameTime = true; m_Port = port; From d06c4d62caf24cb778fdd14f92215589b713acb5 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Mon, 30 Jul 2018 15:35:12 +0200 Subject: [PATCH 0101/1000] Dropped support for USB1 device --- src/devices/PCIDevice.h | 4 +-- src/devices/Xbox.cpp | 10 +++++--- src/devices/Xbox.h | 3 +-- src/devices/usb/Hub.cpp | 15 ++++------- src/devices/usb/OHCI.cpp | 47 +++++++++++++++++----------------- src/devices/usb/OHCI.h | 6 ++--- src/devices/usb/USBDevice.cpp | 15 +++-------- src/devices/usb/USBDevice.h | 2 +- src/devices/usb/XidGamepad.cpp | 34 ++++++++++++------------ 9 files changed, 61 insertions(+), 75 deletions(-) diff --git a/src/devices/PCIDevice.h b/src/devices/PCIDevice.h index e3f22ed7e..498aea25e 100644 --- a/src/devices/PCIDevice.h +++ b/src/devices/PCIDevice.h @@ -66,7 +66,7 @@ #define AC97_BASE 0xFEC00000 #define AC97_SIZE 0x1000 #define USB0_BASE 0xFED00000 -#define USB1_BASE 0xFED08000 +#define USB1_BASE 0xFED08000 // alpha kits only #define USB_SIZE 0x1000 #define NVNet_BASE 0xFEF00000 #define NVNet_SIZE 0x400 @@ -150,4 +150,4 @@ private: */ }; -#endif \ No newline at end of file +#endif diff --git a/src/devices/Xbox.cpp b/src/devices/Xbox.cpp index 558db59c4..7a20b555a 100644 --- a/src/devices/Xbox.cpp +++ b/src/devices/Xbox.cpp @@ -47,7 +47,6 @@ NVNetDevice* g_NVNet; NV2ADevice* g_NV2A; ADM1032Device* g_ADM1032; USBDevice* g_USB0; -USBDevice* g_USB1; MCPXRevision MCPXRevisionFromHardwareModel(HardwareModel hardwareModel) { @@ -134,7 +133,6 @@ void InitXboxHardware(HardwareModel hardwareModel) g_ADM1032 = new ADM1032Device(); if (bLLE_USB) { g_USB0 = new USBDevice(); - g_USB1 = new USBDevice(); } // Connect devices to SM bus @@ -164,9 +162,13 @@ void InitXboxHardware(HardwareModel hardwareModel) //g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(5, 0)), g_NVAPU); //g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(6, 0)), g_AC97); g_PCIBus->ConnectDevice(PCI_DEVID(1, PCI_DEVFN(0, 0)), g_NV2A, NV2A_ADDR); - if (bLLE_USB) { + if (bLLE_USB) { + // ergo720: according to some research done by LukeUsher, only Xbox Alpha Kits have a two HCs configuration. This seems to also be confirmed by the xboxdevwiki, + // which states that it has a xircom PGPCI2(OPTI 82C861) 2 USB port PCI card -> 2 ports, not 4. Finally, I disassembled various xbe's and discovered that the number + // of ports per HC is hardcoded as 4 in the driver instead of being detected at runtime by reading the HcRhDescriptorA register and so a game would have to be + // recompiled to support 2 HCs, which further confirms the point. Because we are not going to emulate an Alpha Kit, we can simply ignore the USB1 device. + g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(2, 0)), g_USB0, USB0_BASE); - g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(3, 0)), g_USB1, USB1_BASE); } // TODO : Handle other SMBUS Addresses, like PIC_ADDRESS, XCALIBUR_ADDRESS diff --git a/src/devices/Xbox.h b/src/devices/Xbox.h index 11b0cb442..5dfedc829 100644 --- a/src/devices/Xbox.h +++ b/src/devices/Xbox.h @@ -80,6 +80,5 @@ extern EEPROMDevice* g_EEPROM; extern NVNetDevice* g_NVNet; extern NV2ADevice* g_NV2A; extern USBDevice* g_USB0; -extern USBDevice* g_USB1; -extern void InitXboxHardware(HardwareModel hardwareModel); \ No newline at end of file +extern void InitXboxHardware(HardwareModel hardwareModel); diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index c9729f6ba..d8aa787e2 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -87,8 +87,7 @@ namespace xboxkrnl // To avoid including Xbox.h -extern USBDevice* g_USB0; -extern USBDevice* g_USB1; +extern USBDevice* g_USB0; Hub* g_HubObjArray[4] = { nullptr }; @@ -230,28 +229,24 @@ int Hub::UsbHubClaimPort(XboxDeviceState* dev, int port) assert(dev->Port == nullptr); + m_UsbDev = g_USB0; + it = m_UsbDev->m_FreePorts.end(); i = 0; - if (port > 2) { - m_UsbDev = g_USB1; - } - else { - m_UsbDev = g_USB0; - } while (m_UsbDev->m_HostController->m_bFrameTime) { Sleep(1); } m_UsbDev->m_HostController->m_bFrameTime = true; for (auto usb_port : m_UsbDev->m_FreePorts) { if (usb_port->Path == std::to_string(port)) { + it = m_UsbDev->m_FreePorts.begin() + i; break; } i++; } - if (i == 2) { + if (it == m_UsbDev->m_FreePorts.end()) { EmuWarning("Port requested %d not found (in use?)", port); return -1; } - it = m_UsbDev->m_FreePorts.begin() + i; dev->Port = *it; (*it)->Dev = dev; m_UsbDev->m_FreePorts.erase(it); diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index e503c7151..880d18262 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -207,12 +207,11 @@ namespace xboxkrnl #endif // DEBUG -OHCI::OHCI(int Irq, USBDevice* UsbObj) +OHCI::OHCI(USBDevice* UsbObj) { int offset = 0; USBPortOps* ops; - m_IrqNum = Irq; m_UsbDevice = UsbObj; m_bFrameTime = false; ops = new USBPortOps(); @@ -226,12 +225,8 @@ OHCI::OHCI(int Irq, USBDevice* UsbObj) ops->complete = std::bind(&OHCI::OHCI_AsyncCompletePacket, this, _1, _2); } - if (m_IrqNum == 9) { - offset = 2; - } - - for (int i = 0; i < 2; i++) { - m_UsbDevice->USB_RegisterPort(&m_Registers.RhPort[i].UsbPort, i + offset, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL, ops); + for (int i = 0; i < 4; i++) { + m_UsbDevice->USB_RegisterPort(&m_Registers.RhPort[i].UsbPort, i, USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL, ops); } OHCI_PacketInit(&m_UsbPacket); @@ -863,7 +858,7 @@ XboxDeviceState* OHCI::OHCI_FindDevice(uint8_t Addr) XboxDeviceState* dev; int i; - for (i = 0; i < 2; i++) { + for (i = 0; i < 4; i++) { if ((m_Registers.RhPort[i].HcRhPortStatus & OHCI_PORT_PES) == 0) { continue; // port is disabled } @@ -905,13 +900,13 @@ void OHCI::OHCI_StateReset() m_Registers.HcPeriodicStart = 0; m_Registers.HcLSThreshold = OHCI_LS_THRESH; - m_Registers.HcRhDescriptorA = OHCI_RHA_NPS | 2; // The xbox lacks the hw to switch off the power on the ports and has 2 ports per HC + m_Registers.HcRhDescriptorA = OHCI_RHA_NOCP | OHCI_RHA_NPS | 4; // The xbox lacks the hw to switch off the power on the ports and has 4 ports per HC m_Registers.HcRhDescriptorB = 0; // The attached devices are removable and use PowerSwitchingMode to control the power on the ports m_Registers.HcRhStatus = 0; m_DoneCount = 7; - for (int i = 0; i < 2; i++) + for (int i = 0; i < 4; i++) { OHCIPort* Port = &m_Registers.RhPort[i]; Port->HcRhPortStatus = 0; @@ -1132,21 +1127,21 @@ uint32_t OHCI::OHCI_ReadRegister(xbaddr Addr) // Always report that the port power is on since the Xbox cannot switch off the electrical current to it case 21: // RhPort 0 ret = m_Registers.RhPort[0].HcRhPortStatus | OHCI_PORT_PPS; - TestOut("m_Registers.RhPort[0].HcRhPortStatus: 0x%X\n", m_Registers.RhPort[0].HcRhPortStatus | OHCI_PORT_PPS); + TestOut("m_Registers.RhPort[0].HcRhPortStatus: 0x%X\n", ret); break; case 22: // RhPort 1 ret = m_Registers.RhPort[1].HcRhPortStatus | OHCI_PORT_PPS; - TestOut("m_Registers.RhPort[1].HcRhPortStatus: 0x%X\n", m_Registers.RhPort[1].HcRhPortStatus | OHCI_PORT_PPS); + TestOut("m_Registers.RhPort[1].HcRhPortStatus: 0x%X\n", ret); break; case 23: - ret = 0 | OHCI_PORT_PPS; + ret = m_Registers.RhPort[2].HcRhPortStatus | OHCI_PORT_PPS; TestOut("m_Registers.RhPort[2].HcRhPortStatus: 0x%X\n", ret); break; case 24: - ret = 0 | OHCI_PORT_PPS; + ret = m_Registers.RhPort[3].HcRhPortStatus | OHCI_PORT_PPS; TestOut("m_Registers.RhPort[3].HcRhPortStatus: 0x%X\n", ret); break; @@ -1321,12 +1316,16 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) TestOut("W m_Registers.RhPort 1: 0x%X\n", m_Registers.RhPort[1].HcRhPortStatus); break; - case 23: - TestOut("W m_Registers.RhPort 2: 0x%X\n", Value); + case 23: // RhPort 2 + TestOut("W m_Registers.RhPort 2: 0x%X\n", Value); + OHCI_PortSetStatus(2, Value); + TestOut("W m_Registers.RhPort 2: 0x%X\n", m_Registers.RhPort[2].HcRhPortStatus); break; - case 24: - TestOut("W m_Registers.RhPort 3: 0x%X\n", Value); + case 24: // RhPort 3 + TestOut("W m_Registers.RhPort 3: 0x%X\n", Value); + OHCI_PortSetStatus(3, Value); + TestOut("W m_Registers.RhPort 3: 0x%X\n", m_Registers.RhPort[3].HcRhPortStatus); break; default: @@ -1338,8 +1337,8 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) void OHCI::OHCI_UpdateInterrupt() { if ((m_Registers.HcInterrupt & OHCI_INTR_MIE) && (m_Registers.HcInterruptStatus & m_Registers.HcInterrupt)) { - HalSystemInterrupts[m_IrqNum].Assert(false); - HalSystemInterrupts[m_IrqNum].Assert(true); + HalSystemInterrupts[1].Assert(false); + HalSystemInterrupts[1].Assert(true); TestOut("Fired interrupt -> m_Registers.HcInterruptStatus is 0x%X\n", m_Registers.HcInterruptStatus); } } @@ -1378,7 +1377,7 @@ void OHCI::OHCI_StopEndpoints() XboxDeviceState* dev; int i, j; - for (i = 0; i < 2; i++) { + for (i = 0; i < 4; i++) { dev = m_Registers.RhPort[i].UsbPort.Dev; if (dev && dev->Attached) { m_UsbDevice->USB_DeviceEPstopped(dev, &dev->EP_ctl); @@ -1404,7 +1403,7 @@ void OHCI::OHCI_SetHubStatus(uint32_t Value) if (Value & OHCI_RHS_LPS) { int i; - for (i = 0; i < 2; i++) { + for (i = 0; i < 4; i++) { OHCI_PortPower(i, 0); } DbgPrintf("%s: powered down all ports\n", LOG_STR_OHCI); @@ -1413,7 +1412,7 @@ void OHCI::OHCI_SetHubStatus(uint32_t Value) if (Value & OHCI_RHS_LPSC) { int i; - for (i = 0; i < 2; i++) { + for (i = 0; i < 4; i++) { OHCI_PortPower(i, 1); } DbgPrintf("%s: powered up all ports\n", LOG_STR_OHCI); diff --git a/src/devices/usb/OHCI.h b/src/devices/usb/OHCI.h index 3f1b3e776..1734df856 100644 --- a/src/devices/usb/OHCI.h +++ b/src/devices/usb/OHCI.h @@ -133,7 +133,7 @@ struct OHCI_Registers uint32_t HcRhDescriptorA; uint32_t HcRhDescriptorB; uint32_t HcRhStatus; - OHCIPort RhPort[2]; // 2 ports per HC, for a total of 4 USB ports + OHCIPort RhPort[4]; // 4 ports per HC }; @@ -146,7 +146,7 @@ class OHCI std::atomic_bool m_bFrameTime; // constructor - OHCI(int Irqn, USBDevice* UsbObj); + OHCI(USBDevice* UsbObj); // destructor ~OHCI() {} // read a register @@ -174,8 +174,6 @@ class OHCI uint8_t m_UsbBuffer[8192] = {}; // the value of HcControl in the previous frame uint32_t m_OldHcControl; - // irq number - int m_IrqNum; // Done Queue Interrupt Counter int m_DoneCount; // the address of the pending TD diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index 7e716edaa..91da0c401 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -69,14 +69,8 @@ void USBDevice::Init(unsigned int address) m_DeviceId = 0x01C2; m_VendorId = PCI_VENDOR_ID_NVIDIA; - if (address == USB0_BASE) { - m_HostController = new OHCI(1, this); - m_PciPath = "pci.0:02.0"; - return; - } - - m_HostController = new OHCI(9, this); - m_PciPath = "pci.0:03.0"; + m_HostController = new OHCI(this); + m_PciPath = "pci.0:02.0"; } uint32_t USBDevice::MMIORead(int barIndex, uint32_t addr, unsigned size) @@ -739,7 +733,6 @@ void USBDevice::USB_CreateSerial(XboxDeviceState* dev, std::string&& str) { const USBDesc* desc = USBDesc_GetUsbDeviceDesc(dev); int index = desc->id.iSerialNumber; - std::string str2; assert(index != 0 && str.empty() == false); str += '-'; @@ -995,7 +988,7 @@ int USBDevice::USBDesc_HandleControl(XboxDeviceState* dev, USBPacket *p, // From the standard: "This request allows the host to select an alternate setting for the specified interface" // wValue = Alternative Setting; wIndex = Interface ret = USBDesc_SetInterface(dev, index, value); - DbgPrintf("%s; received standard SetInterface() request for device at address 0x%X. Interface selected is %d, Alternative Setting \ + DbgPrintf("%s: received standard SetInterface() request for device at address 0x%X. Interface selected is %d, Alternative Setting \ is %d and returned %d\n", LOG_STR_USB, dev->Addr, index, value, ret); break; } @@ -1252,7 +1245,7 @@ int USBDevice::USB_ReadStringDesc(XboxDeviceState* dev, int index, uint8_t* dest // From the standard: "The UNICODE string descriptor is not NULL-terminated. The string length is // computed by subtracting two from the value of the first byte of the descriptor" - bLength = strlen(str) * 2 + 2; + bLength = std::strlen(str) * 2 + 2; dest[0] = bLength; dest[1] = USB_DT_STRING; i = 0; pos = 2; diff --git a/src/devices/usb/USBDevice.h b/src/devices/usb/USBDevice.h index 401b2cb8f..0c506335c 100644 --- a/src/devices/usb/USBDevice.h +++ b/src/devices/usb/USBDevice.h @@ -106,7 +106,7 @@ class USBDevice : public PCIDevice { void USB_PacketCheckState(USBPacket* p, USBPacketState expected); // process the packet void USB_ProcessOne(USBPacket* p); - // + // TODO void USB_DoParameter(XboxDeviceState* s, USBPacket* p); // process a setup token void USB_DoTokenSetup(XboxDeviceState* s, USBPacket* p); diff --git a/src/devices/usb/XidGamepad.cpp b/src/devices/usb/XidGamepad.cpp index 4b8dfa3c8..9ca3292fe 100644 --- a/src/devices/usb/XidGamepad.cpp +++ b/src/devices/usb/XidGamepad.cpp @@ -58,6 +58,8 @@ namespace xboxkrnl #define HID_SET_REPORT 0x09 #define XID_GET_CAPABILITIES 0x01 +// To avoid including Xbox.h +extern USBDevice* g_USB0; XidGamepad* g_XidControllerObjArray[4]; @@ -240,28 +242,26 @@ int XidGamepad::UsbXidClaimPort(XboxDeviceState* dev, int port) assert(dev->Port == nullptr); - for (int j = 0; j < 4; j++) { - if (g_HubObjArray[j]) { - i = 0; - for (auto usb_port : g_HubObjArray[j]->m_UsbDev->m_FreePorts) { - if (usb_port->Path == (std::to_string(port) + ".2")) { - m_UsbDev = g_HubObjArray[j]->m_UsbDev; - break; - } - i++; - } - } - } - if (m_UsbDev == nullptr) { - EmuWarning("Port requested %d.2 not found (in use?)", port); - return -1; - } + m_UsbDev = g_USB0; + it = m_UsbDev->m_FreePorts.end(); + i = 0; while (m_UsbDev->m_HostController->m_bFrameTime) { Sleep(1); } m_UsbDev->m_HostController->m_bFrameTime = true; + for (auto usb_port : m_UsbDev->m_FreePorts) { + if (usb_port->Path == (std::to_string(port) + ".2")) { + it = m_UsbDev->m_FreePorts.begin() + i; + break; + } + i++; + } + if (it == m_UsbDev->m_FreePorts.end()) { + EmuWarning("Port requested %d.2 not found (in use?)", port); + return -1; + } + m_Port = port; - it = m_UsbDev->m_FreePorts.begin() + i; dev->Port = *it; (*it)->Dev = dev; m_UsbDev->m_FreePorts.erase(it); From 2db659b9904ced10b3fd669ecfba4af13c426b66 Mon Sep 17 00:00:00 2001 From: gandalfthewhite19890404 Date: Tue, 31 Jul 2018 14:32:08 +0300 Subject: [PATCH 0102/1000] Update PushBuffer.cpp Visual Studio 2015 compile fix 1 --- src/CxbxKrnl/EmuD3D8/PushBuffer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CxbxKrnl/EmuD3D8/PushBuffer.cpp b/src/CxbxKrnl/EmuD3D8/PushBuffer.cpp index 611b3aecd..1eed41588 100644 --- a/src/CxbxKrnl/EmuD3D8/PushBuffer.cpp +++ b/src/CxbxKrnl/EmuD3D8/PushBuffer.cpp @@ -177,7 +177,7 @@ DWORD CxbxGetStrideFromVertexShaderHandle(DWORD dwVertexShader) { using namespace XTL; - DWORD Stride = 0; + XTL::DWORD Stride = 0; if (VshHandleIsVertexShader(dwVertexShader)) { // Test-case : Crash 'n' Burn [45530014] @@ -337,7 +337,7 @@ void HLE_pgraph_handle_method( //DWORD vertex data array, //To be used as a replacement for DrawVerticesUP, the caller needs to set the vertex format using IDirect3DDevice8::SetVertexShader before calling BeginPush. All attributes in the vertex format must be padded DWORD multiples, and the vertex attributes must be specified in the canonical FVF ordering (position followed by weight, normal, diffuse, and so on). // retrieve vertex shader - DWORD dwVertexShader = g_CurrentXboxVertexShaderHandle; + XTL::DWORD dwVertexShader = g_CurrentXboxVertexShaderHandle; if (dwVertexShader == 0) { LOG_TEST_CASE("FVF Vertex Shader is null"); dwVertexShader = -1; @@ -345,9 +345,9 @@ void HLE_pgraph_handle_method( // render vertices if (dwVertexShader != -1) { - DWORD dwVertexStride = CxbxGetStrideFromVertexShaderHandle(dwVertexShader); + XTL::DWORD dwVertexStride = CxbxGetStrideFromVertexShaderHandle(dwVertexShader); if (dwVertexStride > 0) { - UINT VertexCount = (pg->inline_array_length * sizeof(DWORD)) / dwVertexStride; + XTL::UINT VertexCount = (pg->inline_array_length * sizeof(XTL::DWORD)) / dwVertexStride; CxbxDrawContext DrawContext = {}; DrawContext.XboxPrimitiveType = (X_D3DPRIMITIVETYPE)pg->primitive_mode; From 88ee402cd340d9d88073fd03b409c57cd7211893 Mon Sep 17 00:00:00 2001 From: gandalfthewhite19890404 Date: Tue, 31 Jul 2018 14:33:00 +0300 Subject: [PATCH 0103/1000] Update VertexShader.cpp Visual Studio 2015 compile fix 2 --- src/CxbxKrnl/EmuD3D8/VertexShader.cpp | 64 +++++++++++++-------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/CxbxKrnl/EmuD3D8/VertexShader.cpp b/src/CxbxKrnl/EmuD3D8/VertexShader.cpp index 5cf956acf..d87b80e0d 100644 --- a/src/CxbxKrnl/EmuD3D8/VertexShader.cpp +++ b/src/CxbxKrnl/EmuD3D8/VertexShader.cpp @@ -44,10 +44,10 @@ #include -#ifdef CXBX_USE_VS30 -//#define CXBX_USE_VS30 // Separate the port to Vertex Shader model 3.0 from the port to Direct3D9 -#endif - +#ifdef CXBX_USE_VS30 +//#define CXBX_USE_VS30 // Separate the port to Vertex Shader model 3.0 from the port to Direct3D9 +#endif + // **************************************************************************** // * Vertex shader function recompiler // **************************************************************************** @@ -1821,8 +1821,8 @@ static DWORD VshConvertToken_CONSTMEM( // D3DVSD_CONST DbgVshPrintf("\tD3DVSD_CONST("); - DWORD ConstantAddress = (*pToken & X_D3DVSD_CONSTADDRESSMASK) >> X_D3DVSD_CONSTADDRESSSHIFT; - DWORD Count = (*pToken & X_D3DVSD_CONSTCOUNTMASK) >> X_D3DVSD_CONSTCOUNTSHIFT; + XTL::DWORD ConstantAddress = (*pToken & X_D3DVSD_CONSTADDRESSMASK) >> X_D3DVSD_CONSTADDRESSSHIFT; + XTL::DWORD Count = (*pToken & X_D3DVSD_CONSTCOUNTMASK) >> X_D3DVSD_CONSTCOUNTSHIFT; DbgVshPrintf("%d, %d),\n", ConstantAddress, Count); #ifdef CXBX_USE_D3D9 @@ -1996,12 +1996,12 @@ static void VshConvertToken_STREAMDATA_SKIPBYTES( #endif } -static void VshConvertToken_STREAMDATA_REG( - DWORD *pToken, - XTL::D3DVERTEXELEMENT *pRecompiled, - boolean IsFixedFunction, - CxbxVertexShaderPatch *pPatchData -) +static void VshConvertToken_STREAMDATA_REG( + DWORD *pToken, + XTL::D3DVERTEXELEMENT *pRecompiled, + boolean IsFixedFunction, + CxbxVertexShaderPatch *pPatchData +) { using namespace XTL; @@ -2253,12 +2253,12 @@ static void VshConvertToken_STREAMDATA_REG( } } -static void VshConvertToken_STREAMDATA( - DWORD *pToken, - XTL::D3DVERTEXELEMENT *pRecompiled, - boolean IsFixedFunction, - CxbxVertexShaderPatch *pPatchData -) +static void VshConvertToken_STREAMDATA( + DWORD *pToken, + XTL::D3DVERTEXELEMENT *pRecompiled, + boolean IsFixedFunction, + CxbxVertexShaderPatch *pPatchData +) { using namespace XTL; if (*pToken & X_D3DVSD_MASK_SKIP) @@ -2276,12 +2276,12 @@ static void VshConvertToken_STREAMDATA( } } -static DWORD VshRecompileToken( - DWORD *pToken, - XTL::D3DVERTEXELEMENT *&pRecompiled, - boolean IsFixedFunction, - CxbxVertexShaderPatch *pPatchData -) +static DWORD VshRecompileToken( + DWORD *pToken, + XTL::D3DVERTEXELEMENT *&pRecompiled, + boolean IsFixedFunction, + CxbxVertexShaderPatch *pPatchData +) { using namespace XTL; @@ -2368,14 +2368,14 @@ DWORD XTL::EmuRecompileVshDeclaration break; } - DWORD Step = VshRecompileToken(pDeclaration, pRecompiled, IsFixedFunction, &PatchData); - pDeclaration += Step; -#ifndef CXBX_USE_D3D9 - pRecompiled += Step; -#endif - } - - VshEndPreviousStreamPatch(&PatchData); + DWORD Step = VshRecompileToken(pDeclaration, pRecompiled, IsFixedFunction, &PatchData); + pDeclaration += Step; +#ifndef CXBX_USE_D3D9 + pRecompiled += Step; +#endif + } + + VshEndPreviousStreamPatch(&PatchData); DbgVshPrintf("\tD3DVSD_END()\n};\n"); DbgVshPrintf("// NbrStreams: %d\n", PatchData.pVertexShaderInfoToSet->NumberOfVertexStreams); From a42a11458326e0ea32e8815f969a47f3fa8abf28 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Tue, 31 Jul 2018 21:44:10 +0200 Subject: [PATCH 0104/1000] Disabled LLE USB --- .gitmodules | 4 - build/win32/Cxbx.sln | 89 -------- build/win32/Cxbx.vcxproj | 158 +------------- import/SDL-mirror | 1 - resource/Cxbx.rc | 2 +- src/Common/Input/InputConfig.cpp | 3 +- src/Common/Input/InputConfig.h | 4 +- src/Common/Input/SDL2_Device.cpp | 3 + src/Common/Input/SDL2_Device.h | 4 +- src/Cxbx/ResCxbx.h | 2 +- src/Cxbx/WndMain.cpp | 10 +- src/CxbxKrnl/CxbxKrnl.cpp | 4 +- src/CxbxKrnl/HLEIntercept.cpp | 5 +- src/CxbxKrnl/Timer.cpp | 3 +- src/devices/usb/Hub.cpp | 13 +- src/devices/usb/OHCI.cpp | 353 +++++++++++-------------------- src/devices/usb/OHCI.h | 4 +- src/devices/usb/USBDevice.cpp | 8 +- src/devices/usb/UsbCommon.h | 10 +- src/devices/usb/XidGamepad.cpp | 12 +- 20 files changed, 182 insertions(+), 510 deletions(-) delete mode 160000 import/SDL-mirror diff --git a/.gitmodules b/.gitmodules index c0e5ff063..bfb466842 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,7 +10,3 @@ [submodule "import/XbSymbolDatabase"] path = import/XbSymbolDatabase url = https://github.com/Cxbx-Reloaded/XbSymbolDatabase.git -[submodule "SDL-mirror"] - path = import/SDL-mirror - url = https://github.com/spurious/SDL-mirror - branch = release-2.0.8 diff --git a/build/win32/Cxbx.sln b/build/win32/Cxbx.sln index bbb26e36f..e9955397a 100644 --- a/build/win32/Cxbx.sln +++ b/build/win32/Cxbx.sln @@ -26,18 +26,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XbSymbolDatabase", "..\..\i EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CxbxVSBC", "CxbxVSBC.vcxproj", "{EFA81330-D410-4232-9A0C-1D8B91B6FFFF}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL2", "..\..\import\SDL-mirror\VisualC\SDL\SDL.vcxproj", "{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL2main", "..\..\import\SDL-mirror\VisualC\SDLmain\SDLmain.vcxproj", "{DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_Direct3D9|Any CPU = Debug_Direct3D9|Any CPU Debug_Direct3D9|Win32 = Debug_Direct3D9|Win32 Debug_Direct3D9|x64 = Debug_Direct3D9|x64 - Debug_USB_Packets|Any CPU = Debug_USB_Packets|Any CPU - Debug_USB_Packets|Win32 = Debug_USB_Packets|Win32 - Debug_USB_Packets|x64 = Debug_USB_Packets|x64 Debug|Any CPU = Debug|Any CPU Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 @@ -50,11 +43,6 @@ Global {E7A72D3D-5810-4078-A243-348B59726365}.Debug_Direct3D9|Win32.ActiveCfg = Debug_Direct3D9|Win32 {E7A72D3D-5810-4078-A243-348B59726365}.Debug_Direct3D9|Win32.Build.0 = Debug_Direct3D9|Win32 {E7A72D3D-5810-4078-A243-348B59726365}.Debug_Direct3D9|x64.ActiveCfg = Debug|Win32 - {E7A72D3D-5810-4078-A243-348B59726365}.Debug_USB_Packets|Any CPU.ActiveCfg = Debug_USB_Packets|Win32 - {E7A72D3D-5810-4078-A243-348B59726365}.Debug_USB_Packets|Any CPU.Build.0 = Debug_USB_Packets|Win32 - {E7A72D3D-5810-4078-A243-348B59726365}.Debug_USB_Packets|Win32.ActiveCfg = Debug_USB_Packets|Win32 - {E7A72D3D-5810-4078-A243-348B59726365}.Debug_USB_Packets|Win32.Build.0 = Debug_USB_Packets|Win32 - {E7A72D3D-5810-4078-A243-348B59726365}.Debug_USB_Packets|x64.ActiveCfg = Debug|Win32 {E7A72D3D-5810-4078-A243-348B59726365}.Debug|Any CPU.ActiveCfg = Debug|Win32 {E7A72D3D-5810-4078-A243-348B59726365}.Debug|Win32.ActiveCfg = Debug|Win32 {E7A72D3D-5810-4078-A243-348B59726365}.Debug|Win32.Build.0 = Debug|Win32 @@ -68,12 +56,6 @@ Global {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_Direct3D9|x64.ActiveCfg = Debug|x64 {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_Direct3D9|x64.Build.0 = Debug|x64 - {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_USB_Packets|Any CPU.ActiveCfg = Debug|Win32 - {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_USB_Packets|Any CPU.Build.0 = Debug|Win32 - {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Win32 - {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_USB_Packets|Win32.Build.0 = Debug|Win32 - {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_USB_Packets|x64.ActiveCfg = Debug|x64 - {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_USB_Packets|x64.Build.0 = Debug|x64 {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug|Any CPU.ActiveCfg = Debug|Win32 {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug|Win32.ActiveCfg = Debug|Win32 {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug|Win32.Build.0 = Debug|Win32 @@ -89,11 +71,6 @@ Global {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_Direct3D9|x64.ActiveCfg = Debug|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_Direct3D9|x64.Build.0 = Debug|Any CPU - {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_USB_Packets|Any CPU.ActiveCfg = Debug|Any CPU - {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_USB_Packets|Any CPU.Build.0 = Debug|Any CPU - {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Any CPU - {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_USB_Packets|x64.ActiveCfg = Debug|Any CPU - {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_USB_Packets|x64.Build.0 = Debug|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug|Any CPU.Build.0 = Debug|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug|Win32.ActiveCfg = Debug|Any CPU @@ -109,11 +86,6 @@ Global {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Any CPU {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_Direct3D9|x64.ActiveCfg = Debug|Any CPU {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_Direct3D9|x64.Build.0 = Debug|Any CPU - {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_USB_Packets|Any CPU.ActiveCfg = Debug|Any CPU - {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_USB_Packets|Any CPU.Build.0 = Debug|Any CPU - {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Any CPU - {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_USB_Packets|x64.ActiveCfg = Debug|Any CPU - {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_USB_Packets|x64.Build.0 = Debug|Any CPU {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug|Any CPU.Build.0 = Debug|Any CPU {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug|Win32.ActiveCfg = Debug|Any CPU @@ -129,11 +101,6 @@ Global {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|x64.ActiveCfg = Debug|x64 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|x64.Build.0 = Debug|x64 - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_USB_Packets|Any CPU.ActiveCfg = Debug|Win32 - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Win32 - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_USB_Packets|Win32.Build.0 = Debug|Win32 - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_USB_Packets|x64.ActiveCfg = Debug|x64 - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_USB_Packets|x64.Build.0 = Debug|x64 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug|Any CPU.ActiveCfg = Debug|Win32 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug|Win32.ActiveCfg = Debug|Win32 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug|Win32.Build.0 = Debug|Win32 @@ -148,12 +115,6 @@ Global {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Win32 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_Direct3D9|x64.ActiveCfg = Debug|Win32 - {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_USB_Packets|Any CPU.ActiveCfg = Release|x64 - {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_USB_Packets|Any CPU.Build.0 = Release|x64 - {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Win32 - {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_USB_Packets|Win32.Build.0 = Debug|Win32 - {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_USB_Packets|x64.ActiveCfg = Debug|x64 - {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_USB_Packets|x64.Build.0 = Debug|x64 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug|Any CPU.ActiveCfg = Debug|Win32 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug|Win32.ActiveCfg = Debug|Win32 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug|Win32.Build.0 = Debug|Win32 @@ -168,12 +129,6 @@ Global {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_Direct3D9|x64.ActiveCfg = Debug|x64 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_Direct3D9|x64.Build.0 = Debug|x64 - {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_USB_Packets|Any CPU.ActiveCfg = Release|Win32 - {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_USB_Packets|Any CPU.Build.0 = Release|Win32 - {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Win32 - {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_USB_Packets|Win32.Build.0 = Debug|Win32 - {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_USB_Packets|x64.ActiveCfg = Debug|x64 - {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_USB_Packets|x64.Build.0 = Debug|x64 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug|Any CPU.ActiveCfg = Debug|Win32 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug|Win32.ActiveCfg = Debug|Win32 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug|Win32.Build.0 = Debug|Win32 @@ -184,50 +139,6 @@ Global {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Release|Win32.Build.0 = Release|Win32 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Release|x64.ActiveCfg = Release|x64 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Release|x64.Build.0 = Release|x64 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_Direct3D9|Any CPU.ActiveCfg = Release|x64 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_Direct3D9|Any CPU.Build.0 = Release|x64 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Win32 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_Direct3D9|x64.ActiveCfg = Debug|x64 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_Direct3D9|x64.Build.0 = Debug|x64 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_USB_Packets|Any CPU.ActiveCfg = Release|x64 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_USB_Packets|Any CPU.Build.0 = Release|x64 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Win32 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_USB_Packets|Win32.Build.0 = Debug|Win32 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_USB_Packets|x64.ActiveCfg = Debug|x64 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug_USB_Packets|x64.Build.0 = Debug|x64 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|Win32.ActiveCfg = Debug|Win32 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|Win32.Build.0 = Debug|Win32 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|x64.ActiveCfg = Debug|x64 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|x64.Build.0 = Debug|x64 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Any CPU.ActiveCfg = Release|Win32 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Win32.ActiveCfg = Release|Win32 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Win32.Build.0 = Release|Win32 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|x64.ActiveCfg = Release|x64 - {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|x64.Build.0 = Release|x64 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_Direct3D9|Any CPU.ActiveCfg = Release|x64 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_Direct3D9|Any CPU.Build.0 = Release|x64 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Win32 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_Direct3D9|x64.ActiveCfg = Debug|x64 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_Direct3D9|x64.Build.0 = Debug|x64 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_USB_Packets|Any CPU.ActiveCfg = Release|x64 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_USB_Packets|Any CPU.Build.0 = Release|x64 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_USB_Packets|Win32.ActiveCfg = Debug|Win32 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_USB_Packets|Win32.Build.0 = Debug|Win32 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_USB_Packets|x64.ActiveCfg = Debug|x64 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug_USB_Packets|x64.Build.0 = Debug|x64 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|Win32.ActiveCfg = Debug|Win32 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|Win32.Build.0 = Debug|Win32 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|x64.ActiveCfg = Debug|x64 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|x64.Build.0 = Debug|x64 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|Any CPU.ActiveCfg = Release|Win32 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|Win32.ActiveCfg = Release|Win32 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|Win32.Build.0 = Release|Win32 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|x64.ActiveCfg = Release|x64 - {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index 2f63af725..8537ca598 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -5,10 +5,6 @@ Debug_Direct3D9 Win32 - - Debug_USB_Packets - Win32 - Debug Win32 @@ -36,12 +32,6 @@ MultiByte $(DefaultPlatformToolset) - - Application - false - MultiByte - $(DefaultPlatformToolset) - Application false @@ -59,10 +49,6 @@ - - - - @@ -71,26 +57,20 @@ <_ProjectFileVersion>10.0.40219.1 false - false false false AllRules.ruleset - AllRules.ruleset AllRules.ruleset - - AllRules.ruleset ..\..\import\DirectX8\include;$(IncludePath) - ..\..\import\DirectX8\include;$(IncludePath) ..\..\import\DirectX9\include;$(IncludePath) ..\..\import\DirectX8\lib;$(LibraryPath) - ..\..\import\DirectX8\lib;$(LibraryPath) $(LibraryPath) ..\..\import\DirectX8\include;$(IncludePath) ..\..\import\DirectX8\lib;$(LibraryPath) @@ -100,11 +80,6 @@ $(Configuration)\$(ProjectName)\ - - Build - - $(Configuration)\$(ProjectName) - Build @@ -144,7 +119,7 @@ Include\Win32\Cxbx;%(AdditionalIncludeDirectories) - legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;%(AdditionalDependencies) true $(Configuration)\;..\..\import\distorm\lib\Win32\;..\..\import\glew-2.0.0\lib\Release\Win32\;%(AdditionalLibraryDirectories) libcmt;%(IgnoreSpecificDefaultLibraries) @@ -175,67 +150,6 @@ Generate version header - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\..\..\bin\debug/Cxbx.tlb - - - - - Disabled - ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\;..\..\import\SDL-mirror\include - NOMINMAX;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;DEBUG_PACKET;DEBUG_ISOCH;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebugDLL - false - Level3 - true - ProgramDatabase - true - StreamingSIMDExtensions2 - true - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - Include\Win32\Cxbx;%(AdditionalIncludeDirectories) - - - legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - true - $(Configuration)\;..\..\import\distorm\lib\Win32\;..\..\import\glew-2.0.0\lib\Release\Win32\;%(AdditionalLibraryDirectories) - msvcrt;%(IgnoreSpecificDefaultLibraries) - true - true - Windows - false - - - MachineX86 - false - 0x10000 - true - true - - - true - - - copy $(SolutionDir)..\..\import\glew-2.0.0\bin\Release\Win32\glew32.dll $(TargetDir) - - - - - - - CALL "$(SolutionDir)Version.bat" "$(SolutionDir)..\..\src\Version.h" - Generate version header - - _DEBUG;%(PreprocessorDefinitions) @@ -265,7 +179,7 @@ Include\Win32\Cxbx;%(AdditionalIncludeDirectories) - legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;%(AdditionalDependencies) true $(Configuration)\;..\..\import\distorm\lib\Win32\;..\..\import\glew-2.0.0\lib\Release\Win32\;%(AdditionalLibraryDirectories) libcmt;%(IgnoreSpecificDefaultLibraries) @@ -334,7 +248,7 @@ Include\Win32\Cxbx;%(AdditionalIncludeDirectories) - legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;%(AdditionalDependencies) true $(Configuration)\;..\..\import\distorm\lib\Win32\;..\..\import\glew-2.0.0\lib\Release\Win32\;%(AdditionalLibraryDirectories) libcmt;%(IgnoreSpecificDefaultLibraries) @@ -502,10 +416,8 @@ %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) \cxbx\git\cxbx-ds\resource;%(AdditionalIncludeDirectories) - \cxbx\git\cxbx-ds\resource;%(AdditionalIncludeDirectories) \cxbx\git\cxbx-ds\resource;%(AdditionalIncludeDirectories) %(PreprocessorDefinitions) \cxbx\git\cxbx-ds\resource;%(AdditionalIncludeDirectories) @@ -527,11 +439,9 @@ %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -539,143 +449,115 @@ %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) false %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -699,11 +581,9 @@ %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -713,32 +593,26 @@ %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -747,21 +621,17 @@ %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -770,11 +640,9 @@ %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -785,10 +653,8 @@ %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) @@ -796,30 +662,24 @@ %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) @@ -827,60 +687,48 @@ %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) diff --git a/import/SDL-mirror b/import/SDL-mirror deleted file mode 160000 index ef5bf55e8..000000000 --- a/import/SDL-mirror +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ef5bf55e83c9d0ccf7a02bc2b08b0d6e46e1b6ef diff --git a/resource/Cxbx.rc b/resource/Cxbx.rc index 8e3d5f3e4..cefc315d6 100644 --- a/resource/Cxbx.rc +++ b/resource/Cxbx.rc @@ -485,7 +485,7 @@ BEGIN POPUP "&LLE (Experimental)", 65535,MFT_STRING,MFS_ENABLED BEGIN MENUITEM "LLE &GPU", ID_EMULATION_LLE_GPU,MFT_STRING,MFS_ENABLED - MENUITEM "LLE &USB", ID_EMULATION_LLE_USB,MFT_STRING,MFS_ENABLED + //MENUITEM "LLE &USB", ID_EMULATION_LLE_USB,MFT_STRING,MFS_ENABLED // Reenable this when LLE USB actually works END POPUP "Hacks", 65535,MFT_STRING,MFS_ENABLED BEGIN diff --git a/src/Common/Input/InputConfig.cpp b/src/Common/Input/InputConfig.cpp index e6bc626dd..d74095ea6 100644 --- a/src/Common/Input/InputConfig.cpp +++ b/src/Common/Input/InputConfig.cpp @@ -33,7 +33,7 @@ // * All rights reserved // * // ****************************************************************** - +#if 0 // Reenable this when LLE USB actually works #define _XBOXKRNL_DEFEXTRN_ // prevent name collisions @@ -483,3 +483,4 @@ SDL2Devices* InputDeviceManager::FindDeviceFromXboxPort(int port) } return nullptr; } +#endif diff --git a/src/Common/Input/InputConfig.h b/src/Common/Input/InputConfig.h index 1d6a28e1d..0f204c401 100644 --- a/src/Common/Input/InputConfig.h +++ b/src/Common/Input/InputConfig.h @@ -36,7 +36,7 @@ #ifndef INPUTCONFIG_H_ #define INPUTCONFIG_H_ - +#if 0 // Reenable this when LLE USB actually works #include #include #include "SDL.h" @@ -124,5 +124,5 @@ class InputDeviceManager }; extern InputDeviceManager* g_InputDeviceManager; - +#endif #endif diff --git a/src/Common/Input/SDL2_Device.cpp b/src/Common/Input/SDL2_Device.cpp index ff481e46d..978c5294d 100644 --- a/src/Common/Input/SDL2_Device.cpp +++ b/src/Common/Input/SDL2_Device.cpp @@ -34,6 +34,7 @@ // * // ****************************************************************** +#if 0 // Reenable this when LLE USB actually works #include "SDL2_Device.h" #include @@ -216,3 +217,5 @@ bool SDL2Devices::ReadButtonState(uint16_t* wButtons, uint8_t* bAnalogButtons, i } return false; } + +#endif diff --git a/src/Common/Input/SDL2_Device.h b/src/Common/Input/SDL2_Device.h index d5bf68d8e..ee666d9a1 100644 --- a/src/Common/Input/SDL2_Device.h +++ b/src/Common/Input/SDL2_Device.h @@ -36,7 +36,7 @@ #ifndef SDL2DEVICE_H_ #define SDL2DEVICE_H_ - +#if 0 // Reenable this when LLE USB actually works #include "InputConfig.h" @@ -119,5 +119,5 @@ class SDL2Devices // indicates that the button state has been updated since the last time it was read std::atomic_bool bStateDirty; }; - +#endif #endif diff --git a/src/Cxbx/ResCxbx.h b/src/Cxbx/ResCxbx.h index 9f0ab17dd..7b5f220aa 100644 --- a/src/Cxbx/ResCxbx.h +++ b/src/Cxbx/ResCxbx.h @@ -244,7 +244,7 @@ #define ID_EMULATION_LLE_APU 40039 #define ID_EMULATION_LLE_GPU 40040 #define ID_EMULATION_LLE_JIT 40041 -#define ID_EMULATION_LLE_USB 40042 +//#define ID_EMULATION_LLE_USB 40042 // Reenable this when LLE USB actually works #define ID_SETTINGS_CONFIG_CONTROLLER 40046 #define ID_SETTINGS_CONFIG_VIDEO 40047 #define ID_SETTINGS_CONFIG_AUDIO 40048 diff --git a/src/Cxbx/WndMain.cpp b/src/Cxbx/WndMain.cpp index 6fea5f356..68bb051e5 100644 --- a/src/Cxbx/WndMain.cpp +++ b/src/Cxbx/WndMain.cpp @@ -1465,14 +1465,14 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP RefreshMenus(); } break; - +#if 0 // Reenable this when LLE USB actually works case ID_EMULATION_LLE_USB: { m_FlagsLLE = m_FlagsLLE ^ LLE_USB; RefreshMenus(); } break; - +#endif case ID_EMULATION_START: if (m_Xbe != nullptr) { @@ -1937,8 +1937,8 @@ void WndMain::RefreshMenus() chk_flag = (m_FlagsLLE & LLE_GPU) ? MF_CHECKED : MF_UNCHECKED; CheckMenuItem(settings_menu, ID_EMULATION_LLE_GPU, chk_flag); - chk_flag = (m_FlagsLLE & LLE_USB) ? MF_CHECKED : MF_UNCHECKED; - CheckMenuItem(settings_menu, ID_EMULATION_LLE_USB, chk_flag); + //chk_flag = (m_FlagsLLE & LLE_USB) ? MF_CHECKED : MF_UNCHECKED; // Reenable this when LLE USB actually works + //CheckMenuItem(settings_menu, ID_EMULATION_LLE_USB, chk_flag); chk_flag = (m_DisablePixelShaders) ? MF_CHECKED : MF_UNCHECKED; CheckMenuItem(settings_menu, ID_HACKS_DISABLEPIXELSHADERS, chk_flag); @@ -2609,7 +2609,7 @@ void WndMain::DrawLedBitmap(HWND hwnd, bool bdefault) if (FlagsLLE == 0) { sprintf(flagString, "HLE"); } - else if ((FlagsLLE & LLE_GPU) != 0) { + else if ((FlagsLLE & LLE_GPU) == 0) { strcat(flagString, " HLE"); } } diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index 32199f36d..ffd2103bf 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -1301,7 +1301,7 @@ __declspec(noreturn) void CxbxKrnlInit g_EmuShared->GetFlagsLLE(&CxbxLLE_Flags); bLLE_APU = (CxbxLLE_Flags & LLE_APU) > 0; bLLE_GPU = (CxbxLLE_Flags & LLE_GPU) > 0; - bLLE_USB = (CxbxLLE_Flags & LLE_USB) > 0; + //bLLE_USB = (CxbxLLE_Flags & LLE_USB) > 0; // Reenable this when LLE USB actually works bLLE_JIT = (CxbxLLE_Flags & LLE_JIT) > 0; } @@ -1465,6 +1465,7 @@ __declspec(noreturn) void CxbxKrnlInit InitXboxHardware(HardwareModel::Revision1_5); // TODO : Make configurable if (bLLE_USB) { +#if 0 // Reenable this when LLE USB actually works int ret; g_InputDeviceManager = new InputDeviceManager; ret = g_InputDeviceManager->EnumSdl2Devices(); @@ -1473,6 +1474,7 @@ __declspec(noreturn) void CxbxKrnlInit // Temporary: the device type and bindings should be read from emushared, for now always assume one xbox controller g_InputDeviceManager->ConnectDeviceToXbox(1, MS_CONTROLLER_DUKE); } +#endif } // Now the hardware devices exist, couple the EEPROM buffer to it's device diff --git a/src/CxbxKrnl/HLEIntercept.cpp b/src/CxbxKrnl/HLEIntercept.cpp index 07f0a456b..6cfb73d1c 100644 --- a/src/CxbxKrnl/HLEIntercept.cpp +++ b/src/CxbxKrnl/HLEIntercept.cpp @@ -350,13 +350,14 @@ void EmuUpdateLLEStatus(uint32_t XbLibScan) FlagsLLE ^= LLE_APU; EmuOutputMessage(XB_OUTPUT_MESSAGE_INFO, "Fallback to LLE APU."); } - +#if 0 // Reenable this when LLE USB actually works if ((FlagsLLE & LLE_USB) == false && (XbLibScan & XbSymbolLib_XAPILIB) == 0) { bLLE_USB = true; FlagsLLE ^= LLE_USB; EmuOutputMessage(XB_OUTPUT_MESSAGE_INFO, "Fallback to LLE USB."); - } + } +#endif g_EmuShared->SetFlagsLLE(&FlagsLLE); } diff --git a/src/CxbxKrnl/Timer.cpp b/src/CxbxKrnl/Timer.cpp index 31e87d2a8..4f7a9f642 100644 --- a/src/CxbxKrnl/Timer.cpp +++ b/src/CxbxKrnl/Timer.cpp @@ -114,7 +114,8 @@ void ClockThread(TimerObject* Timer) return; } NewExpireTime = GetNextExpireTime(Timer); - } + } + Sleep(1); // prevent burning the cpu } } diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index d8aa787e2..5fedab005 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -46,7 +46,7 @@ namespace xboxkrnl #include "Hub.h" #include "CxbxKrnl\EmuKrnl.h" // For EmuWarning -#define LOG_STR_HUB "Hub" +#define LOG_STR_HUB "Hub:" #define NUM_PORTS 8 @@ -86,6 +86,9 @@ namespace xboxkrnl #define PORT_C_RESET 20 +// Acknowledgment: XQEMU (GPLv2) + + // To avoid including Xbox.h extern USBDevice* g_USB0; @@ -372,7 +375,7 @@ void Hub::UsbHub_HandleControl(XboxDeviceState* dev, USBPacket* p, goto fail; } port = &m_HubState->ports[n]; - DbgPrintf("%s: %s GetPortStatus -> Address 0x%X, wIndex %d, wPortStatus %d, wPortChange %d\n", + DbgPrintf("%s %s GetPortStatus -> Address 0x%X, wIndex %d, wPortStatus %d, wPortChange %d\n", LOG_STR_HUB, __func__, m_HubState->dev.Addr, index, port->wPortStatus, port->wPortChange); data[0] = port->wPortStatus; data[1] = port->wPortStatus >> 8; @@ -397,7 +400,7 @@ void Hub::UsbHub_HandleControl(XboxDeviceState* dev, USBPacket* p, USBHubPort* port; XboxDeviceState* dev; - DbgPrintf("%s: %s SetPortFeature -> Address 0x%X, wIndex %d, Feature %s\n", + DbgPrintf("%s %s SetPortFeature -> Address 0x%X, wIndex %d, Feature %s\n", LOG_STR_HUB, __func__, m_HubState->dev.Addr, index, GetFeatureName(value)); if (n >= NUM_PORTS) { @@ -435,7 +438,7 @@ void Hub::UsbHub_HandleControl(XboxDeviceState* dev, USBPacket* p, unsigned int n = index - 1; USBHubPort *port; - DbgPrintf("%s: %s ClearPortFeature -> Address 0x%X, wIndex %d, Feature %s\n", + DbgPrintf("%s %s ClearPortFeature -> Address 0x%X, wIndex %d, Feature %s\n", LOG_STR_HUB, __func__, m_HubState->dev.Addr, index, GetFeatureName(value)); if (n >= NUM_PORTS) { @@ -522,7 +525,7 @@ void Hub::UsbHub_HandleData(XboxDeviceState* dev, USBPacket* p) p->Status = USB_RET_BABBLE; return; } - DbgPrintf("%s: %s Address 0x%X, Status %d\n", LOG_STR_HUB, __func__, m_HubState->dev.Addr, status); + DbgPrintf("%s %s Address 0x%X, Status %d\n", LOG_STR_HUB, __func__, m_HubState->dev.Addr, status); for (i = 0; i < n; i++) { buf[i] = status >> (8 * i); } diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index 880d18262..21577f015 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -46,7 +46,11 @@ namespace xboxkrnl #include "CxbxKrnl\EmuKrnl.h" // For HalSystemInterrupt #include "CxbxCommon.h" -#define LOG_STR_OHCI "Ohci" +#define LOG_STR_OHCI "Ohci:" + +/* Define these two if you want to dump usb packets */ +//#define DEBUG_ISOCH +//#define DEBUG_PACKET /* These macros are used to access the bits of the various registers */ // HcControl @@ -197,14 +201,7 @@ namespace xboxkrnl #define OHCI_OFFSET_MASK 0xFFF -// Temporary output (useful for debugging LLE USB) -#define DEBUG - -#ifdef DEBUG - -#define TestOut printf - -#endif // DEBUG +// Acknowledgment: XQEMU (GPLv2) OHCI::OHCI(USBDevice* UsbObj) @@ -247,13 +244,10 @@ void OHCI::OHCI_FrameBoundaryWorker() OHCI_HCCA hcca; while (m_bFrameTime) { Sleep(1); } - m_bFrameTime = true; - - TestOut("Frame processing started\n"); - TestOut("HcControl: 0x%X, HcFmNumber: 0x%X, HcInterruptStatus: 0x%X\n", m_Registers.HcControl, m_Registers.HcFmNumber, m_Registers.HcInterruptStatus); + m_bFrameTime = true; if (OHCI_ReadHCCA(m_Registers.HcHCCA, &hcca)) { - EmuWarning("%s: HCCA read error at physical address 0x%X", m_Registers.HcHCCA, LOG_STR_OHCI); + EmuWarning("%s HCCA read error at physical address 0x%X", m_Registers.HcHCCA, LOG_STR_OHCI); OHCI_FatalError(); m_bFrameTime = false; return; @@ -283,13 +277,11 @@ void OHCI::OHCI_FrameBoundaryWorker() m_bFrameTime = false; return; } - - TestOut("HcFmRemaining: 0x%X, HcFmInterval: 0x%X - before\n", m_Registers.HcFmRemaining, m_Registers.HcFmInterval); + // From the standard: "This bit is loaded from the FrameIntervalToggle field of // HcFmInterval whenever FrameRemaining reaches 0." m_Registers.HcFmRemaining = (m_Registers.HcFmInterval & OHCI_FMI_FIT) == 0 ? - m_Registers.HcFmRemaining & ~OHCI_FMR_FRT : m_Registers.HcFmRemaining | OHCI_FMR_FRT; - TestOut("HcFmRemaining: 0x%X, HcFmInterval: 0x%X - after\n", m_Registers.HcFmRemaining, m_Registers.HcFmInterval); + m_Registers.HcFmRemaining & ~OHCI_FMR_FRT : m_Registers.HcFmRemaining | OHCI_FMR_FRT; // Increment frame number m_Registers.HcFmNumber = (m_Registers.HcFmNumber + 1) & 0xFFFF; // prevent overflow @@ -299,7 +291,7 @@ void OHCI::OHCI_FrameBoundaryWorker() if (!m_Registers.HcDoneHead) { // From the standard: "This is set to zero whenever HC writes the content of this // register to HCCA. It also sets the WritebackDoneHead of HcInterruptStatus." - CxbxKrnlCleanup("%s: HcDoneHead is zero but WritebackDoneHead interrupt is not set!\n", LOG_STR_OHCI); + CxbxKrnlCleanup("%s HcDoneHead is zero but WritebackDoneHead interrupt is not set!\n", LOG_STR_OHCI); } if (m_Registers.HcInterrupt & m_Registers.HcInterruptStatus) { @@ -326,13 +318,10 @@ void OHCI::OHCI_FrameBoundaryWorker() // Writeback HCCA if (OHCI_WriteHCCA(m_Registers.HcHCCA, &hcca)) { - EmuWarning("%s: HCCA write error at physical address 0x%X", LOG_STR_OHCI, m_Registers.HcHCCA); + EmuWarning("%s HCCA write error at physical address 0x%X", LOG_STR_OHCI, m_Registers.HcHCCA); OHCI_FatalError(); } - TestOut("Frame processing ended\n"); - TestOut("HcControl: 0x%X, HcFmNumber: 0x%X, HcInterruptStatus: 0x%X\n", m_Registers.HcControl, m_Registers.HcFmNumber, m_Registers.HcInterruptStatus); - m_bFrameTime = false; } @@ -344,8 +333,7 @@ void OHCI::OHCI_FatalError() OHCI_SetInterrupt(OHCI_INTR_UE); OHCI_BusStop(); - DbgPrintf("%s: an unrecoverable error occoured!\n", LOG_STR_OHCI); - TestOut("Fatal error"); + DbgPrintf("%s an unrecoverable error occoured!\n", LOG_STR_OHCI); } bool OHCI::OHCI_ReadHCCA(xbaddr Paddr, OHCI_HCCA* Hcca) @@ -546,7 +534,7 @@ int OHCI::OHCI_ServiceEDlist(xbaddr Head, int Completion) for (current = Head; current; current = next_ed) { if (OHCI_ReadED(current, &ed)) { - EmuWarning("%s: ED read error at physical address 0x%X", LOG_STR_OHCI, current); + EmuWarning("%s ED read error at physical address 0x%X", LOG_STR_OHCI, current); OHCI_FatalError(); return 0; } @@ -623,12 +611,12 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) addr = Ed->HeadP & OHCI_DPTR_MASK; // See if this TD has already been submitted to the device completion = (addr == m_AsyncTD); - if (completion && !m_AsyncComplete) { // ?? + if (completion && !m_AsyncComplete) { DbgPrintf("Skipping async TD\n"); return 1; } if (OHCI_ReadTD(addr, &td)) { - EmuWarning("%s: TD read error at physical address 0x%X", LOG_STR_OHCI, addr); + EmuWarning("%s TD read error at physical address 0x%X", LOG_STR_OHCI, addr); OHCI_FatalError(); return 0; } @@ -676,7 +664,7 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) pid = USB_TOKEN_SETUP; break; default: - EmuWarning("%s: bad direction", LOG_STR_OHCI); + EmuWarning("%s bad direction", LOG_STR_OHCI); return 1; } @@ -728,7 +716,7 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) // From XQEMU: "??? The hardware should allow one active packet per endpoint. // We only allow one active packet per controller. This should be sufficient // as long as devices respond in a timely manner." - DbgPrintf("%s: too many pending packets\n", LOG_STR_OHCI); + DbgPrintf("%s too many pending packets\n", LOG_STR_OHCI); return 1; } dev = OHCI_FindDevice(OHCI_BM(Ed->Flags, ED_FA)); @@ -802,29 +790,29 @@ int OHCI::OHCI_ServiceTD(OHCI_ED* Ed) } else { if (ret >= 0) { - DbgPrintf("%s: Underrun\n", LOG_STR_OHCI); + DbgPrintf("%s Underrun\n", LOG_STR_OHCI); OHCI_SET_BM(td.Flags, TD_CC, OHCI_CC_DATAUNDERRUN); } else { switch (ret) { case USB_RET_IOERROR: case USB_RET_NODEV: - DbgPrintf("%s: Received DEV ERROR\n", LOG_STR_OHCI); + DbgPrintf("%s Received DEV ERROR\n", LOG_STR_OHCI); OHCI_SET_BM(td.Flags, TD_CC, OHCI_CC_DEVICENOTRESPONDING); break; case USB_RET_NAK: - DbgPrintf("%s: Received NAK\n", LOG_STR_OHCI); + DbgPrintf("%s Received NAK\n", LOG_STR_OHCI); return 1; case USB_RET_STALL: - DbgPrintf("%s: Received STALL\n", LOG_STR_OHCI); + DbgPrintf("%s Received STALL\n", LOG_STR_OHCI); OHCI_SET_BM(td.Flags, TD_CC, OHCI_CC_STALL); break; case USB_RET_BABBLE: - DbgPrintf("%s: Received BABBLE\n", LOG_STR_OHCI); + DbgPrintf("%s Received BABBLE\n", LOG_STR_OHCI); OHCI_SET_BM(td.Flags, TD_CC, OHCI_CC_DATAOVERRUN); break; default: - DbgPrintf("%s: Bad device response %d\n", LOG_STR_OHCI, ret); + DbgPrintf("%s Bad device response %d\n", LOG_STR_OHCI, ret); OHCI_SET_BM(td.Flags, TD_CC, OHCI_CC_UNDEXPETEDPID); OHCI_SET_BM(td.Flags, TD_EC, 3); } @@ -921,16 +909,15 @@ void OHCI::OHCI_StateReset() OHCI_StopEndpoints(); - DbgPrintf("%s: Reset mode event.\n", LOG_STR_OHCI); + DbgPrintf("%s Reset mode event.\n", LOG_STR_OHCI); } void OHCI::OHCI_BusStart() { // Create the EOF timer. Let's try a factor of 50 (1 virtual ms -> 50 real ms) - m_pEOFtimer = Timer_Create(OHCI_FrameBoundaryWrapper, this, 100); - TestOut("Bus start.\n"); + m_pEOFtimer = Timer_Create(OHCI_FrameBoundaryWrapper, this, 100); - DbgPrintf("%s: Operational mode event\n", LOG_STR_OHCI); + DbgPrintf("%s Operational mode event\n", LOG_STR_OHCI); // SOF event OHCI_SOF(true); @@ -942,16 +929,13 @@ void OHCI::OHCI_BusStop() // Delete existing EOF timer Timer_Exit(m_pEOFtimer); } - m_pEOFtimer = nullptr; - TestOut("Bus stop\n"); + m_pEOFtimer = nullptr; } void OHCI::OHCI_SOF(bool bCreate) { // set current SOF time - m_SOFtime = GetTime_NS(m_pEOFtimer); - - TestOut("OHCI_SOF -> m_SOFtime is 0x%X\n", m_SOFtime); + m_SOFtime = GetTime_NS(m_pEOFtimer); // make timer expire at SOF + 1 virtual ms from now if (bCreate) { @@ -965,9 +949,7 @@ void OHCI::OHCI_ChangeState(uint32_t Value) { uint32_t OldState = m_Registers.HcControl & OHCI_CTL_HCFS; m_Registers.HcControl = Value; - uint32_t NewState = m_Registers.HcControl & OHCI_CTL_HCFS; - - TestOut("OldState 0x%X\n", OldState); + uint32_t NewState = m_Registers.HcControl & OHCI_CTL_HCFS; // no state change if (OldState == NewState) { @@ -977,28 +959,24 @@ void OHCI::OHCI_ChangeState(uint32_t Value) switch (NewState) { case Operational: - OHCI_BusStart(); - TestOut("NewState Operational\n"); + OHCI_BusStart(); break; case Suspend: OHCI_BusStop(); - DbgPrintf("%s: Suspend mode event\n", LOG_STR_OHCI); - TestOut("NewState Suspend\n"); + DbgPrintf("%s Suspend mode event\n", LOG_STR_OHCI); break; case Resume: - DbgPrintf("%s: Resume mode event\n", LOG_STR_OHCI); - TestOut("NewState Resume\n"); + DbgPrintf("%s Resume mode event\n", LOG_STR_OHCI); break; case Reset: - OHCI_StateReset(); - TestOut("NewState Reset\n"); + OHCI_StateReset(); break; default: - EmuWarning("%s: Unknown USB mode!", LOG_STR_OHCI); + EmuWarning("%s Unknown USB mode!", LOG_STR_OHCI); } } @@ -1017,136 +995,112 @@ uint32_t OHCI::OHCI_ReadRegister(xbaddr Addr) if (Addr & 3) { // The standard allows only aligned reads to the registers - DbgPrintf("%s: Unaligned read. Ignoring.\n", LOG_STR_OHCI); + DbgPrintf("%s Unaligned read. Ignoring.\n", LOG_STR_OHCI); return ret; } else { switch (Addr >> 2) // read the register { case 0: // HcRevision - ret = m_Registers.HcRevision; - TestOut("m_Registers.HcRevision: 0x%X\n", m_Registers.HcRevision); + ret = m_Registers.HcRevision; break; case 1: // HcControl - ret = m_Registers.HcControl; - TestOut("m_Registers.HcControl: 0x%X\n", m_Registers.HcControl); + ret = m_Registers.HcControl; break; case 2: // HcCommandStatus - ret = m_Registers.HcCommandStatus; - TestOut("m_Registers.HcCommandStatus: 0x%X\n", m_Registers.HcCommandStatus); + ret = m_Registers.HcCommandStatus; break; case 3: // HcInterruptStatus - ret = m_Registers.HcInterruptStatus; - TestOut("m_Registers.HcInterruptStatus: 0x%X\n", m_Registers.HcInterruptStatus); + ret = m_Registers.HcInterruptStatus; break; case 4: // HcInterruptEnable case 5: // HcInterruptDisable - ret = m_Registers.HcInterrupt; - TestOut("m_Registers.HcInterrupt: 0x%X\n", m_Registers.HcInterrupt); + ret = m_Registers.HcInterrupt; break; case 6: // HcHCCA - ret = m_Registers.HcHCCA; - TestOut("m_Registers.HcHCCA: 0x%X\n", m_Registers.HcHCCA); + ret = m_Registers.HcHCCA; break; case 7: // HcPeriodCurrentED - ret = m_Registers.HcPeriodCurrentED; - TestOut("m_Registers.HcPeriodCurrentED: 0x%X\n", m_Registers.HcPeriodCurrentED); + ret = m_Registers.HcPeriodCurrentED; break; case 8: // HcControlHeadED - ret = m_Registers.HcControlHeadED; - TestOut("m_Registers.HcControlHeadED: 0x%X\n", m_Registers.HcControlHeadED); + ret = m_Registers.HcControlHeadED; break; case 9: // HcControlCurrentED - ret = m_Registers.HcControlCurrentED; - TestOut("m_Registers.HcControlCurrentED: 0x%X\n", m_Registers.HcControlCurrentED); + ret = m_Registers.HcControlCurrentED; break; case 10: // HcBulkHeadED - ret = m_Registers.HcBulkHeadED; - TestOut("m_Registers.HcBulkHeadED: 0x%X\n", m_Registers.HcBulkHeadED); + ret = m_Registers.HcBulkHeadED; break; case 11: // HcBulkCurrentED - ret = m_Registers.HcBulkCurrentED; - TestOut("m_Registers.HcBulkCurrentED: 0x%X\n", m_Registers.HcBulkCurrentED); + ret = m_Registers.HcBulkCurrentED; break; case 12: // HcDoneHead - ret = m_Registers.HcDoneHead; - TestOut("m_Registers.HcDoneHead: 0x%X\n", m_Registers.HcDoneHead); + ret = m_Registers.HcDoneHead; break; case 13: // HcFmInterval - ret = m_Registers.HcFmInterval; - TestOut("m_Registers.HcFmInterval: 0x%X\n", m_Registers.HcFmInterval); + ret = m_Registers.HcFmInterval; break; case 14: // HcFmRemaining - ret = OHCI_GetFrameRemaining(); - TestOut("m_Registers.HcFmRemaining: 0x%X\n", m_Registers.HcFmRemaining); + ret = OHCI_GetFrameRemaining(); break; case 15: // HcFmNumber - ret = m_Registers.HcFmNumber; - TestOut("m_Registers.HcFmNumber: 0x%X\n", m_Registers.HcFmNumber); + ret = m_Registers.HcFmNumber; break; case 16: // HcPeriodicStart - ret = m_Registers.HcPeriodicStart; - TestOut("m_Registers.HcPeriodicStart: 0x%X\n", m_Registers.HcPeriodicStart); + ret = m_Registers.HcPeriodicStart; break; case 17: // HcLSThreshold - ret = m_Registers.HcLSThreshold; - TestOut("m_Registers.HcLSThreshold: 0x%X\n", m_Registers.HcLSThreshold); + ret = m_Registers.HcLSThreshold; break; case 18: // HcRhDescriptorA - ret = m_Registers.HcRhDescriptorA; - TestOut("m_Registers.HcRhDescriptorA: 0x%X\n", m_Registers.HcRhDescriptorA); + ret = m_Registers.HcRhDescriptorA; break; case 19: // HcRhDescriptorB - ret = m_Registers.HcRhDescriptorB; - TestOut("m_Registers.HcRhDescriptorB: 0x%X\n", m_Registers.HcRhDescriptorB); + ret = m_Registers.HcRhDescriptorB; break; case 20: // HcRhStatus - ret = m_Registers.HcRhStatus; - TestOut("m_Registers.HcRhStatus: 0x%X\n", m_Registers.HcRhStatus); + ret = m_Registers.HcRhStatus; break; // Always report that the port power is on since the Xbox cannot switch off the electrical current to it case 21: // RhPort 0 - ret = m_Registers.RhPort[0].HcRhPortStatus | OHCI_PORT_PPS; - TestOut("m_Registers.RhPort[0].HcRhPortStatus: 0x%X\n", ret); + ret = m_Registers.RhPort[0].HcRhPortStatus | OHCI_PORT_PPS; break; case 22: // RhPort 1 - ret = m_Registers.RhPort[1].HcRhPortStatus | OHCI_PORT_PPS; - TestOut("m_Registers.RhPort[1].HcRhPortStatus: 0x%X\n", ret); + ret = m_Registers.RhPort[1].HcRhPortStatus | OHCI_PORT_PPS; break; case 23: ret = m_Registers.RhPort[2].HcRhPortStatus | OHCI_PORT_PPS; - TestOut("m_Registers.RhPort[2].HcRhPortStatus: 0x%X\n", ret); break; case 24: ret = m_Registers.RhPort[3].HcRhPortStatus | OHCI_PORT_PPS; - TestOut("m_Registers.RhPort[3].HcRhPortStatus: 0x%X\n", ret); break; default: - EmuWarning("%s: Read register operation with bad offset %u. Ignoring.", LOG_STR_OHCI, Addr >> 2); + EmuWarning("%s Read register operation with bad offset %u. Ignoring.", LOG_STR_OHCI, Addr >> 2); } return ret; } @@ -1156,27 +1110,23 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) { if (Addr & 3) { // The standard allows only aligned writes to the registers - DbgPrintf("%s: Unaligned write. Ignoring.\n", LOG_STR_OHCI); + DbgPrintf("%s Unaligned write. Ignoring.\n", LOG_STR_OHCI); return; } else { switch (Addr >> 2) { case 0: // HcRevision - // This register is read-only - TestOut("W m_Registers.HcRevision: 0x%X\n", Value); + // This register is read-only break; - case 1: // HcControl - TestOut("W m_Registers.HcControl: 0x%X\n", Value); - OHCI_ChangeState(Value); - TestOut("W m_Registers.HcControl: 0x%X\n", m_Registers.HcControl); + case 1: // HcControl + OHCI_ChangeState(Value); break; case 2: // HcCommandStatus { - // SOC is read-only - TestOut("W m_Registers.HcCommandStatus: 0x%X\n", Value); + // SOC is read-only Value &= ~OHCI_STATUS_SOC; // From the standard: "The Host Controller must ensure that bits written as 1 become set @@ -1186,150 +1136,110 @@ void OHCI::OHCI_WriteRegister(xbaddr Addr, uint32_t Value) if (m_Registers.HcCommandStatus & OHCI_STATUS_HCR) { // Do a hardware reset OHCI_StateReset(); - } - TestOut("W m_Registers.HcCommandStatus: 0x%X\n", m_Registers.HcCommandStatus); + } } break; - case 3: // HcInterruptStatus - TestOut("W m_Registers.HcInterruptStatus: 0x%X\n", Value); + case 3: // HcInterruptStatus m_Registers.HcInterruptStatus &= ~Value; - OHCI_UpdateInterrupt(); - TestOut("W m_Registers.HcInterruptStatus: 0x%X\n", m_Registers.HcInterruptStatus); + OHCI_UpdateInterrupt(); break; - case 4: // HcInterruptEnable - TestOut("W m_Registers.HcInterruptEnable: 0x%X\n", Value); + case 4: // HcInterruptEnable m_Registers.HcInterrupt |= Value; - OHCI_UpdateInterrupt(); - TestOut("W m_Registers.HcInterruptEnable: 0x%X\n", m_Registers.HcInterrupt); + OHCI_UpdateInterrupt(); break; - case 5: // HcInterruptDisable - TestOut("W m_Registers.HcInterruptDisable: 0x%X\n", Value); + case 5: // HcInterruptDisable m_Registers.HcInterrupt &= ~Value; - OHCI_UpdateInterrupt(); - TestOut("W m_Registers.HcInterruptDisable: 0x%X\n", m_Registers.HcInterrupt); + OHCI_UpdateInterrupt(); break; case 6: // HcHCCA - // The standard says the minimum alignment is 256 bytes and so bits 0 through 7 are always zero - TestOut("W m_Registers.HcHCCA: 0x%X\n", Value); - m_Registers.HcHCCA = Value & OHCI_HCCA_MASK; - TestOut("W m_Registers.HcHCCA: 0x%X\n", m_Registers.HcHCCA); + // The standard says the minimum alignment is 256 bytes and so bits 0 through 7 are always zero + m_Registers.HcHCCA = Value & OHCI_HCCA_MASK; break; case 7: // HcPeriodCurrentED - // This register is read-only - TestOut("W m_Registers.HcPeriodCurrentED: 0x%X\n", Value); + // This register is read-only break; - case 8: // HcControlHeadED - TestOut("W m_Registers.HcControlHeadED: 0x%X\n", Value); - m_Registers.HcControlHeadED = Value & OHCI_DPTR_MASK; - TestOut("W m_Registers.HcControlHeadED: 0x%X\n", m_Registers.HcControlHeadED); + case 8: // HcControlHeadED + m_Registers.HcControlHeadED = Value & OHCI_DPTR_MASK; break; - case 9: // HcControlCurrentED - TestOut("W m_Registers.HcControlCurrentED: 0x%X\n", Value); - m_Registers.HcControlCurrentED = Value & OHCI_DPTR_MASK; - TestOut("W m_Registers.HcControlCurrentED: 0x%X\n", m_Registers.HcControlCurrentED); + case 9: // HcControlCurrentED + m_Registers.HcControlCurrentED = Value & OHCI_DPTR_MASK; break; - case 10: // HcBulkHeadED - TestOut("W m_Registers.HcBulkHeadED: 0x%X\n", Value); - m_Registers.HcBulkHeadED = Value & OHCI_DPTR_MASK; - TestOut("W m_Registers.HcBulkHeadED: 0x%X\n", m_Registers.HcBulkHeadED); + case 10: // HcBulkHeadED + m_Registers.HcBulkHeadED = Value & OHCI_DPTR_MASK; break; - case 11: // HcBulkCurrentED - TestOut("W m_Registers.HcBulkCurrentED: 0x%X\n", Value); - m_Registers.HcBulkCurrentED = Value & OHCI_DPTR_MASK; - TestOut("W m_Registers.HcBulkCurrentED: 0x%X\n", m_Registers.HcBulkCurrentED); + case 11: // HcBulkCurrentED + m_Registers.HcBulkCurrentED = Value & OHCI_DPTR_MASK; break; - case 12: // HcDoneHead - TestOut("W m_Registers.HcDoneHead: 0x%X\n", Value); + case 12: // HcDoneHead // This register is read-only break; case 13: // HcFmInterval - { - TestOut("W m_Registers.HcFmInterval: 0x%X\n", Value); + { if ((Value & OHCI_FMI_FI) != (m_Registers.HcFmInterval & OHCI_FMI_FI)) { - DbgPrintf("%s: Changing frame interval duration. New value is %u\n", LOG_STR_OHCI, Value & OHCI_FMI_FI); + DbgPrintf("%s Changing frame interval duration. New value is %u\n", LOG_STR_OHCI, Value & OHCI_FMI_FI); } - m_Registers.HcFmInterval = Value & ~0xC000; - TestOut("W m_Registers.HcFmInterval: 0x%X\n", m_Registers.HcFmInterval); + m_Registers.HcFmInterval = Value & ~0xC000; } break; case 14: // HcFmRemaining - // This register is read-only - TestOut("W m_Registers.HcFmRemaining: 0x%X\n", Value); + // This register is read-only break; case 15: // HcFmNumber - // This register is read-only - TestOut("W m_Registers.HcFmNumber: 0x%X\n", Value); + // This register is read-only break; - case 16: // HcPeriodicStart - TestOut("W m_Registers.HcPeriodicStart: 0x%X\n", Value); - m_Registers.HcPeriodicStart = Value & 0x3FFF; - TestOut("W m_Registers.HcPeriodicStart: 0x%X\n", m_Registers.HcPeriodicStart); + case 16: // HcPeriodicStart + m_Registers.HcPeriodicStart = Value & 0x3FFF; break; - case 17: // HcLSThreshold - TestOut("W m_Registers.HcLSThreshold: 0x%X\n", Value); - m_Registers.HcLSThreshold = Value & 0xFFF; - TestOut("W m_Registers.HcLSThreshold: 0x%X\n", m_Registers.HcLSThreshold); + case 17: // HcLSThreshold + m_Registers.HcLSThreshold = Value & 0xFFF; break; - case 18: // HcRhDescriptorA - TestOut("W m_Registers.HcRhDescriptorA: 0x%X\n", Value); + case 18: // HcRhDescriptorA m_Registers.HcRhDescriptorA &= ~OHCI_RHA_RW_MASK; - m_Registers.HcRhDescriptorA |= Value & OHCI_RHA_RW_MASK; // ?? - TestOut("W m_Registers.HcRhDescriptorA: 0x%X\n", m_Registers.HcRhDescriptorA); + m_Registers.HcRhDescriptorA |= Value & OHCI_RHA_RW_MASK; // ?? break; - case 19: // HcRhDescriptorB - TestOut("W m_Registers.HcRhDescriptorB: 0x%X\n", Value); + case 19: // HcRhDescriptorB // Don't do anything, the attached devices are all removable and PowerSwitchingMode is always 0 break; - case 20: // HcRhStatus - TestOut("W m_Registers.HcRhStatus: 0x%X\n", Value); - OHCI_SetHubStatus(Value); - TestOut("W m_Registers.HcRhStatus: 0x%X\n", m_Registers.HcRhStatus); + case 20: // HcRhStatus + OHCI_SetHubStatus(Value); break; - case 21: // RhPort 0 - TestOut("W m_Registers.RhPort 0: 0x%X\n", Value); - OHCI_PortSetStatus(0, Value); - TestOut("W m_Registers.RhPort 0: 0x%X\n", m_Registers.RhPort[0].HcRhPortStatus); + case 21: // RhPort 0 + OHCI_PortSetStatus(0, Value); break; - case 22: // RhPort 1 - TestOut("W m_Registers.RhPort 1: 0x%X\n", Value); - OHCI_PortSetStatus(1, Value); - TestOut("W m_Registers.RhPort 1: 0x%X\n", m_Registers.RhPort[1].HcRhPortStatus); + case 22: // RhPort 1 + OHCI_PortSetStatus(1, Value); break; - case 23: // RhPort 2 - TestOut("W m_Registers.RhPort 2: 0x%X\n", Value); + case 23: // RhPort 2 OHCI_PortSetStatus(2, Value); - TestOut("W m_Registers.RhPort 2: 0x%X\n", m_Registers.RhPort[2].HcRhPortStatus); break; - case 24: // RhPort 3 - TestOut("W m_Registers.RhPort 3: 0x%X\n", Value); + case 24: // RhPort 3 OHCI_PortSetStatus(3, Value); - TestOut("W m_Registers.RhPort 3: 0x%X\n", m_Registers.RhPort[3].HcRhPortStatus); break; default: - EmuWarning("%s: Write register operation with bad offset %u. Ignoring.", LOG_STR_OHCI, Addr >> 2); + EmuWarning("%s Write register operation with bad offset %u. Ignoring.", LOG_STR_OHCI, Addr >> 2); } } } @@ -1338,8 +1248,7 @@ void OHCI::OHCI_UpdateInterrupt() { if ((m_Registers.HcInterrupt & OHCI_INTR_MIE) && (m_Registers.HcInterruptStatus & m_Registers.HcInterrupt)) { HalSystemInterrupts[1].Assert(false); - HalSystemInterrupts[1].Assert(true); - TestOut("Fired interrupt -> m_Registers.HcInterruptStatus is 0x%X\n", m_Registers.HcInterruptStatus); + HalSystemInterrupts[1].Assert(true); } } @@ -1406,7 +1315,7 @@ void OHCI::OHCI_SetHubStatus(uint32_t Value) for (i = 0; i < 4; i++) { OHCI_PortPower(i, 0); } - DbgPrintf("%s: powered down all ports\n", LOG_STR_OHCI); + DbgPrintf("%s powered down all ports\n", LOG_STR_OHCI); } if (Value & OHCI_RHS_LPSC) { @@ -1415,7 +1324,7 @@ void OHCI::OHCI_SetHubStatus(uint32_t Value) for (i = 0; i < 4; i++) { OHCI_PortPower(i, 1); } - DbgPrintf("%s: powered up all ports\n", LOG_STR_OHCI); + DbgPrintf("%s powered up all ports\n", LOG_STR_OHCI); } if (Value & OHCI_RHS_DRWE) { @@ -1464,11 +1373,11 @@ void OHCI::OHCI_PortSetStatus(int PortNum, uint32_t Value) OHCI_PortSetIfConnected(PortNum, Value & OHCI_PORT_PES); if (OHCI_PortSetIfConnected(PortNum, Value & OHCI_PORT_PSS)) { - DbgPrintf("%s: port %d: SUSPEND\n", LOG_STR_OHCI, PortNum); + DbgPrintf("%s port %d: SUSPEND\n", LOG_STR_OHCI, PortNum); } if (OHCI_PortSetIfConnected(PortNum, Value & OHCI_PORT_PRS)) { - DbgPrintf("%s: port %d: RESET\n", LOG_STR_OHCI, PortNum); + DbgPrintf("%s port %d: RESET\n", LOG_STR_OHCI, PortNum); m_UsbDevice->USB_DeviceReset(port->UsbPort.Dev); port->HcRhPortStatus &= ~OHCI_PORT_PRS; // ??? Should this also set OHCI_PORT_PESC @@ -1520,9 +1429,7 @@ int OHCI::OHCI_PortSetIfConnected(int i, uint32_t Value) void OHCI::OHCI_Detach(USBPort* Port) { OHCIPort* port = &m_Registers.RhPort[Port->PortIndex]; - uint32_t old_state = port->HcRhPortStatus; - - TestOut("OHCI_Detach\n"); + uint32_t old_state = port->HcRhPortStatus; OHCI_AsyncCancelDevice(Port->Dev); @@ -1538,7 +1445,7 @@ void OHCI::OHCI_Detach(USBPort* Port) port->HcRhPortStatus |= OHCI_PORT_PESC; } - DbgPrintf("%s: Detached port %d\n", LOG_STR_OHCI, Port->PortIndex); + DbgPrintf("%s Detached port %d\n", LOG_STR_OHCI, Port->PortIndex); if (old_state != port->HcRhPortStatus) { OHCI_SetInterrupt(OHCI_INTR_RHSC); @@ -1548,9 +1455,7 @@ void OHCI::OHCI_Detach(USBPort* Port) void OHCI::OHCI_Attach(USBPort* Port) { OHCIPort* port = &m_Registers.RhPort[Port->PortIndex]; - uint32_t old_state = port->HcRhPortStatus; - - TestOut("OHCI_Attach\n"); + uint32_t old_state = port->HcRhPortStatus; // set connect status port->HcRhPortStatus |= OHCI_PORT_CCS | OHCI_PORT_CSC; @@ -1568,7 +1473,7 @@ void OHCI::OHCI_Attach(USBPort* Port) OHCI_SetInterrupt(OHCI_INTR_RD); } - DbgPrintf("%s: Attached port %d\n", LOG_STR_OHCI, Port->PortIndex); + DbgPrintf("%s Attached port %d\n", LOG_STR_OHCI, Port->PortIndex); if (old_state != port->HcRhPortStatus) { OHCI_SetInterrupt(OHCI_INTR_RHSC); @@ -1576,25 +1481,23 @@ void OHCI::OHCI_Attach(USBPort* Port) } void OHCI::OHCI_ChildDetach(XboxDeviceState* child) -{ - TestOut("OHCI_ChildDetach\n"); +{ OHCI_AsyncCancelDevice(child); } void OHCI::OHCI_Wakeup(USBPort* port1) { - TestOut("OHCI_Wakeup\n"); OHCIPort* port = &m_Registers.RhPort[port1->PortIndex]; uint32_t intr = 0; if (port->HcRhPortStatus & OHCI_PORT_PSS) { - DbgPrintf("%s: port %d: wakeup\n", LOG_STR_OHCI, port1->PortIndex); + DbgPrintf("%s port %d: wakeup\n", LOG_STR_OHCI, port1->PortIndex); port->HcRhPortStatus |= OHCI_PORT_PSSC; port->HcRhPortStatus &= ~OHCI_PORT_PSS; intr = OHCI_INTR_RHSC; } // Note that the controller can be suspended even if this port is not if ((m_Registers.HcControl & OHCI_CTL_HCFS) == Suspend) { - DbgPrintf("%s: remote-wakeup: SUSPEND->RESUME\n", LOG_STR_OHCI); + DbgPrintf("%s remote-wakeup: SUSPEND->RESUME\n", LOG_STR_OHCI); // From the standard: "The only interrupts possible in the USBSUSPEND state are ResumeDetected (the // Host Controller will have changed the HostControllerFunctionalState to the USBRESUME state) // and OwnershipChange." @@ -1629,7 +1532,7 @@ void OHCI::OHCI_ProcessLists(int completion) // Only process the control list if it is enabled (HcControl) and has available TD's (HcCommandStatus) if ((m_Registers.HcControl & OHCI_CTL_CLE) && (m_Registers.HcCommandStatus & OHCI_STATUS_CLF)) { if (m_Registers.HcControlCurrentED && m_Registers.HcControlCurrentED != m_Registers.HcControlHeadED) { - DbgPrintf("%s: head 0x%X, current 0x%X\n", + DbgPrintf("%s head 0x%X, current 0x%X\n", LOG_STR_OHCI, m_Registers.HcControlHeadED, m_Registers.HcControlCurrentED); } if (!OHCI_ServiceEDlist(m_Registers.HcControlHeadED, completion)) { @@ -1670,7 +1573,7 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) addr = ed->HeadP & OHCI_DPTR_MASK; if (OHCI_ReadIsoTD(addr, &iso_td)) { - DbgPrintf("%s: ISO_TD read error at physical address 0x%X\n", LOG_STR_OHCI, addr); + DbgPrintf("%s ISO_TD read error at physical address 0x%X\n", LOG_STR_OHCI, addr); OHCI_FatalError(); return 0; } @@ -1701,13 +1604,13 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) if (relative_frame_number < 0) { // From the standard: "If the relative frame number is negative, then the current frame is earlier than the 0th frame // of the Isochronous TD and the Host Controller advances to the next ED." - DbgPrintf("%s: ISO_TD R=%d < 0\n", LOG_STR_OHCI, relative_frame_number); + DbgPrintf("%s ISO_TD R=%d < 0\n", LOG_STR_OHCI, relative_frame_number); return 1; } else if (relative_frame_number > frame_count) { // From the standard: "If the relative frame number is greater than // FrameCount, then the Isochronous TD has expired and a error condition exists." - DbgPrintf("%s: ISO_TD R=%d > FC=%d\n", LOG_STR_OHCI, relative_frame_number, frame_count); + DbgPrintf("%s ISO_TD R=%d > FC=%d\n", LOG_STR_OHCI, relative_frame_number, frame_count); OHCI_SET_BM(iso_td.Flags, TD_CC, OHCI_CC_DATAOVERRUN); ed->HeadP &= ~OHCI_DPTR_MASK; ed->HeadP |= (iso_td.NextTD & OHCI_DPTR_MASK); @@ -1748,12 +1651,12 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) pid = USB_TOKEN_SETUP; break; default: - EmuWarning("%s: Bad direction %d", LOG_STR_OHCI, dir); + EmuWarning("%s Bad direction %d", LOG_STR_OHCI, dir); return 1; } if (!iso_td.BufferPage0 || !iso_td.BufferEnd) { - DbgPrintf("%s: ISO_TD bp 0x%.8X be 0x%.8X\n", LOG_STR_OHCI, iso_td.BufferPage0, iso_td.BufferEnd); + DbgPrintf("%s ISO_TD bp 0x%.8X be 0x%.8X\n", LOG_STR_OHCI, iso_td.BufferPage0, iso_td.BufferEnd); return 1; } @@ -1771,12 +1674,12 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) if (!(OHCI_BM(start_offset, TD_PSW_CC) & 0xE) || ((relative_frame_number < frame_count) && !(OHCI_BM(next_offset, TD_PSW_CC) & 0xE))) { - DbgPrintf("%s: ISO_TD cc != not accessed 0x%.8x 0x%.8x\n", LOG_STR_OHCI, start_offset, next_offset); + DbgPrintf("%s ISO_TD cc != not accessed 0x%.8x 0x%.8x\n", LOG_STR_OHCI, start_offset, next_offset); return 1; } if ((relative_frame_number < frame_count) && (start_offset > next_offset)) { - printf("%s: ISO_TD start_offset=0x%.8x > next_offset=0x%.8x\n", LOG_STR_OHCI, start_offset, next_offset); + printf("%s ISO_TD start_offset=0x%.8x > next_offset=0x%.8x\n", LOG_STR_OHCI, start_offset, next_offset); return 1; } @@ -1874,12 +1777,12 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) else { // Handle the error condition if (ret > static_cast(len)) { // Sequence Error - DbgPrintf("%s: DataOverrun %d > %zu\n", LOG_STR_OHCI, ret, len); + DbgPrintf("%s DataOverrun %d > %zu\n", LOG_STR_OHCI, ret, len); OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_CC, OHCI_CC_DATAOVERRUN); OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_SIZE, len); } else if (ret >= 0) { // Sequence Error - DbgPrintf("%s: DataUnderrun %d\n", LOG_STR_OHCI, ret); + DbgPrintf("%s DataUnderrun %d\n", LOG_STR_OHCI, ret); OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_CC, OHCI_CC_DATAUNDERRUN); } else { @@ -1891,12 +1794,12 @@ int OHCI::OHCI_ServiceIsoTD(OHCI_ED* ed, int completion) break; case USB_RET_NAK: // NAK and STALL case USB_RET_STALL: - DbgPrintf("%s: got NAK/STALL %d\n", LOG_STR_OHCI, ret); + DbgPrintf("%s got NAK/STALL %d\n", LOG_STR_OHCI, ret); OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_CC, OHCI_CC_STALL); OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_SIZE, 0); break; default: // Unknown Error - DbgPrintf("%s: Bad device response %d\n", LOG_STR_OHCI, ret); + DbgPrintf("%s Bad device response %d\n", LOG_STR_OHCI, ret); OHCI_SET_BM(iso_td.Offset[relative_frame_number], TD_PSW_CC, OHCI_CC_UNDEXPETEDPID); break; } diff --git a/src/devices/usb/OHCI.h b/src/devices/usb/OHCI.h index 1734df856..22ea569fd 100644 --- a/src/devices/usb/OHCI.h +++ b/src/devices/usb/OHCI.h @@ -178,8 +178,8 @@ class OHCI int m_DoneCount; // the address of the pending TD xbaddr m_AsyncTD = xbnull; - // ergo720: I think it signals that a TD has been processed completely - bool m_AsyncComplete = 0; + // indicates if there is s a pending asynchronous packet to process + int m_AsyncComplete = 0; // EOF callback wrapper static void OHCI_FrameBoundaryWrapper(void* pVoid); diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index 91da0c401..37958332a 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -55,6 +55,9 @@ namespace xboxkrnl #define SETUP_STATE_ACK 3 #define SETUP_STATE_PARAM 4 + +// Acknowledgment: XQEMU (GPLv2) + void USBDevice::Init(unsigned int address) { @@ -203,10 +206,9 @@ void USBDevice::USB_PacketSetup(USBPacket* p, int Pid, USBEndpoint* Ep, unsigned p->Stream = Stream; p->Status = USB_RET_SUCCESS; p->ActualLength = 0; - p->Parameter = 0; + p->Parameter = 0ULL; p->ShortNotOK = ShortNotOK; p->IntReq = IntReq; - p->Combined = nullptr; IoVecReset(&p->IoVec); p->State = USB_PACKET_SETUP; } @@ -505,7 +507,7 @@ void USBDevice::DoTokenOut(XboxDeviceState* s, USBPacket* p) void USBDevice::USB_PacketCopy(USBPacket* p, void* ptr, size_t bytes) { - IOVector* iov = p->Combined ? &p->Combined->IoVec : &p->IoVec; + IOVector* iov = &p->IoVec; assert(p->ActualLength >= 0); assert(p->ActualLength + bytes <= iov->Size); diff --git a/src/devices/usb/UsbCommon.h b/src/devices/usb/UsbCommon.h index 3efe6135e..d9c1eb295 100644 --- a/src/devices/usb/UsbCommon.h +++ b/src/devices/usb/UsbCommon.h @@ -205,7 +205,7 @@ struct USBDescIface { uint8_t ndesc; // number of device-specific class descriptors (if any) USBDescOther* descs; // pointer to the extra class descriptors - const USBDescEndpoint* eps; // endpoints supported by this interface + const USBDescEndpoint* eps; // endpoints supported by this interface }; /* @@ -415,12 +415,6 @@ struct XboxDeviceState { const USBDescIface* Ifaces[USB_MAX_INTERFACES]; // interface in use }; -struct USBCombinedPacket { - USBPacket* First; - QTAILQ_HEAD(packets_head, USBPacket) Packets; - IOVector IoVec; -}; - /* Structure used to hold information about an active USB packet */ struct USBPacket { int Pid; // Packet ID (used to identify the type of packet that is being sent) @@ -435,9 +429,7 @@ struct USBPacket { int ActualLength; // number of bytes actually written to DataBuffer // Internal use by the USB layer USBPacketState State; - USBCombinedPacket* Combined; QTAILQ_ENTRY(USBPacket) Queue; - QTAILQ_ENTRY(USBPacket) CombinedEntry; }; struct USBPortOps { diff --git a/src/devices/usb/XidGamepad.cpp b/src/devices/usb/XidGamepad.cpp index 9ca3292fe..0ce592a28 100644 --- a/src/devices/usb/XidGamepad.cpp +++ b/src/devices/usb/XidGamepad.cpp @@ -56,7 +56,11 @@ namespace xboxkrnl #define HID_GET_REPORT 0x01 #define HID_SET_REPORT 0x09 -#define XID_GET_CAPABILITIES 0x01 +#define XID_GET_CAPABILITIES 0x01 + + +// Acknowledgment: XQEMU (GPLv2) + // To avoid including Xbox.h extern USBDevice* g_USB0; @@ -351,6 +355,7 @@ void XidGamepad::UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, // If the buffer has the correct length the full input data is transferred." if (value == 0x0100) { if (length <= m_XidState->in_state.bLength) { +#if 0 // Reenable this when LLE USB actually works SDL2Devices* controller = g_InputDeviceManager->FindDeviceFromXboxPort(m_Port); if (controller != nullptr) { controller->ReadButtonState(&m_XidState->in_state.wButtons, m_XidState->in_state.bAnalogButtons, @@ -363,6 +368,7 @@ void XidGamepad::UsbXid_HandleControl(XboxDeviceState* dev, USBPacket* p, p->Status = USB_RET_STALL; assert(0); } +#endif std::memcpy(data, &m_XidState->in_state, m_XidState->in_state.bLength); p->ActualLength = length; } @@ -478,6 +484,7 @@ void XidGamepad::UsbXid_HandleData(XboxDeviceState* dev, USBPacket* p) switch (p->Pid) { case USB_TOKEN_IN: { if (p->Endpoint->Num == 2) { +#if 0 // Reenable this when LLE USB actually works SDL2Devices* controller = g_InputDeviceManager->FindDeviceFromXboxPort(m_Port); if (controller != nullptr) { bool ret; @@ -488,8 +495,10 @@ void XidGamepad::UsbXid_HandleData(XboxDeviceState* dev, USBPacket* p) m_UsbDev->USB_PacketCopy(p, &m_XidState->in_state, m_XidState->in_state.bLength); } else { +#endif p->Status = USB_RET_NAK; } +#if 0 // Reenable this when LLE USB actually works } else { p->Status = USB_RET_STALL; @@ -499,6 +508,7 @@ void XidGamepad::UsbXid_HandleData(XboxDeviceState* dev, USBPacket* p) else { assert(0); } +#endif break; } From 169806b2edf92f6fad62e68e1e1a08574e905545 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Wed, 1 Aug 2018 00:36:05 +0200 Subject: [PATCH 0105/1000] Added some comments --- build/win32/Cxbx.vcxproj | 6 +++--- src/Common/CxbxCommon.cpp | 6 +++++- src/devices/usb/Hub.cpp | 1 + src/devices/usb/OHCI.cpp | 1 + src/devices/usb/OHCI.h | 2 +- src/devices/usb/USBDevice.cpp | 1 + src/devices/usb/USBDevice.h | 2 +- src/devices/usb/UsbCommon.h | 20 ++++++++++---------- src/devices/usb/XidGamepad.cpp | 1 + 9 files changed, 24 insertions(+), 16 deletions(-) diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index 8537ca598..559c46e98 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -102,7 +102,7 @@ Disabled - ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\;..\..\import\SDL-mirror\include + ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\ NOMINMAX;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -162,7 +162,7 @@ Disabled - ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\;..\..\import\SDL-mirror\include + ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\ CXBX_USE_D3D9;NOMINMAX;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -223,7 +223,7 @@ MaxSpeed AnySuitable - ..\..\src;..\..\src\Common;..\..\src\Common\Win32\;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\src\Common\Win32;..\..\import\subhook\;..\..\import\SDL-mirror\include + ..\..\src;..\..\src\Common;..\..\src\Common\Win32\;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\src\Common\Win32;..\..\import\subhook\ NOMINMAX;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreadedDLL diff --git a/src/Common/CxbxCommon.cpp b/src/Common/CxbxCommon.cpp index 1bbc5aceb..971ec9b3d 100644 --- a/src/Common/CxbxCommon.cpp +++ b/src/Common/CxbxCommon.cpp @@ -41,7 +41,11 @@ #ifndef MIN #define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#endif +#endif + + +// Acknowledgment: all the functions present at the moment are from XQEMU (GPLv2) +// https://xqemu.com/ // Disable a compiler warning relative to uint64_t -> uint32_t conversions in Muldiv64. This function is taken from diff --git a/src/devices/usb/Hub.cpp b/src/devices/usb/Hub.cpp index 5fedab005..fd49a8f8a 100644 --- a/src/devices/usb/Hub.cpp +++ b/src/devices/usb/Hub.cpp @@ -87,6 +87,7 @@ namespace xboxkrnl // Acknowledgment: XQEMU (GPLv2) +// https://xqemu.com/ // To avoid including Xbox.h diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index 21577f015..3361322ae 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -202,6 +202,7 @@ namespace xboxkrnl // Acknowledgment: XQEMU (GPLv2) +// https://xqemu.com/ OHCI::OHCI(USBDevice* UsbObj) diff --git a/src/devices/usb/OHCI.h b/src/devices/usb/OHCI.h index 22ea569fd..1f6b011e2 100644 --- a/src/devices/usb/OHCI.h +++ b/src/devices/usb/OHCI.h @@ -178,7 +178,7 @@ class OHCI int m_DoneCount; // the address of the pending TD xbaddr m_AsyncTD = xbnull; - // indicates if there is s a pending asynchronous packet to process + // indicates if there is a pending asynchronous packet to process int m_AsyncComplete = 0; // EOF callback wrapper diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index 37958332a..e830b06bf 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -57,6 +57,7 @@ namespace xboxkrnl // Acknowledgment: XQEMU (GPLv2) +// https://xqemu.com/ void USBDevice::Init(unsigned int address) diff --git a/src/devices/usb/USBDevice.h b/src/devices/usb/USBDevice.h index 0c506335c..2c44e7fda 100644 --- a/src/devices/usb/USBDevice.h +++ b/src/devices/usb/USBDevice.h @@ -106,7 +106,7 @@ class USBDevice : public PCIDevice { void USB_PacketCheckState(USBPacket* p, USBPacketState expected); // process the packet void USB_ProcessOne(USBPacket* p); - // TODO + // xhci only? void USB_DoParameter(XboxDeviceState* s, USBPacket* p); // process a setup token void USB_DoTokenSetup(XboxDeviceState* s, USBPacket* p); diff --git a/src/devices/usb/UsbCommon.h b/src/devices/usb/UsbCommon.h index d9c1eb295..4055ce924 100644 --- a/src/devices/usb/UsbCommon.h +++ b/src/devices/usb/UsbCommon.h @@ -417,16 +417,16 @@ struct XboxDeviceState { /* Structure used to hold information about an active USB packet */ struct USBPacket { - int Pid; // Packet ID (used to identify the type of packet that is being sent) - uint32_t Id; // Paddr of the TD for this packet - USBEndpoint* Endpoint; // endpoint this packet is transferred to - unsigned int Stream; - IOVector IoVec; // used to perform vectored I/O - uint64_t Parameter; // control transfers - bool ShortNotOK; // the bufferRounding mode of the TD for this packet - bool IntReq; // whether or not to generate an interrupt for this packet (DelayInterrupt of the TD is zero) - int Status; // USB_RET_* status code - int ActualLength; // number of bytes actually written to DataBuffer + int Pid; // Packet ID (used to identify the type of packet that is being sent) + uint32_t Id; // Paddr of the TD for this packet + USBEndpoint* Endpoint; // endpoint this packet is transferred to + unsigned int Stream; + IOVector IoVec; // used to perform vectored I/O + uint64_t Parameter; // this seems to be used only in xhci and it's 0 otherwise. If so, this can be removed + bool ShortNotOK; // the bufferRounding mode of the TD for this packet + bool IntReq; // whether or not to generate an interrupt for this packet (DelayInterrupt of the TD is zero) + int Status; // USB_RET_* status code + int ActualLength; // number of bytes actually written to DataBuffer // Internal use by the USB layer USBPacketState State; QTAILQ_ENTRY(USBPacket) Queue; diff --git a/src/devices/usb/XidGamepad.cpp b/src/devices/usb/XidGamepad.cpp index 0ce592a28..4bc946331 100644 --- a/src/devices/usb/XidGamepad.cpp +++ b/src/devices/usb/XidGamepad.cpp @@ -60,6 +60,7 @@ namespace xboxkrnl // Acknowledgment: XQEMU (GPLv2) +// https://xqemu.com/ // To avoid including Xbox.h From bf78bb7fd61d537fd3bdbf95f8c5926f76a4900b Mon Sep 17 00:00:00 2001 From: ergo720 Date: Wed, 1 Aug 2018 11:45:04 +0200 Subject: [PATCH 0106/1000] Small improvements --- src/Common/Input/InputConfig.cpp | 18 ------------------ src/CxbxKrnl/CxbxKrnl.cpp | 6 ++++-- src/devices/EmuNVNet.cpp | 6 +++--- src/devices/EmuNVNet.h | 2 +- src/devices/MCPXDevice.cpp | 2 +- src/devices/MCPXDevice.h | 2 +- src/devices/PCIBus.cpp | 6 +++--- src/devices/PCIBus.h | 4 ++-- src/devices/PCIDevice.h | 6 +++--- src/devices/SMBus.cpp | 6 +++--- src/devices/SMBus.h | 4 ++-- src/devices/Xbox.cpp | 8 ++++---- src/devices/usb/OHCI.cpp | 2 +- src/devices/usb/USBDevice.cpp | 4 ++-- src/devices/usb/USBDevice.h | 2 +- src/devices/video/nv2a.cpp | 4 ++-- src/devices/video/nv2a.h | 2 +- 17 files changed, 34 insertions(+), 50 deletions(-) diff --git a/src/Common/Input/InputConfig.cpp b/src/Common/Input/InputConfig.cpp index d74095ea6..be2759f62 100644 --- a/src/Common/Input/InputConfig.cpp +++ b/src/Common/Input/InputConfig.cpp @@ -304,24 +304,6 @@ void InputDeviceManager::InputThread(InputDeviceManager* pVoid) break; } - //case SDL_CONTROLLERBUTTONUP: - //case SDL_CONTROLLERBUTTONDOWN: { - // pVoid->UpdateButtonState(event.cbutton.which, event.cbutton.button, event.cbutton.state); - // break; - //} - - //case SDL_CONTROLLERAXISMOTION: { - // pVoid->UpdateAxisState(event.caxis.which, event.caxis.axis, event.caxis.value); - // break; - //} - - //case SDL_CONTROLLERDEVICEADDED: { - - //} - //case SDL_CONTROLLERDEVICEREMOVED: { - - //} - case SDL_QUIT: { bContinue = false; break; diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index cffe7a038..f32383d50 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -654,7 +654,7 @@ void TriggerPendingConnectedInterrupts() { for (int i = 0; i < MAX_BUS_INTERRUPT_LEVEL; i++) { // If the interrupt is pending and connected, process it - if (g_bEnableAllInterrupts && HalSystemInterrupts[i].IsPending() && EmuInterruptList[i] && EmuInterruptList[i]->Connected) { + if (HalSystemInterrupts[i].IsPending() && EmuInterruptList[i] && EmuInterruptList[i]->Connected) { HalSystemInterrupts[i].Trigger(EmuInterruptList[i]); } } @@ -672,7 +672,9 @@ static unsigned int WINAPI CxbxKrnlInterruptThread(PVOID param) #endif while (true) { - TriggerPendingConnectedInterrupts(); + if (g_bEnableAllInterrupts) { + TriggerPendingConnectedInterrupts(); + } Sleep(1); } diff --git a/src/devices/EmuNVNet.cpp b/src/devices/EmuNVNet.cpp index f63ee5d90..40fc80a3a 100644 --- a/src/devices/EmuNVNet.cpp +++ b/src/devices/EmuNVNet.cpp @@ -514,14 +514,14 @@ void EmuNVNet_Write(xbaddr addr, uint32_t value, int size) // PCI Device functions -void NVNetDevice::Init(unsigned int address) +void NVNetDevice::Init() { PCIBarRegister r; // Register Memory bar : r.Raw.type = PCI_BAR_TYPE_MEMORY; - r.Memory.address = address >> 4; - RegisterBAR(0, NVNet_SIZE, r.value); + r.Memory.address = NVNET_BASE >> 4; + RegisterBAR(0, NVNET_SIZE, r.value); // Register IO bar : r.Raw.type = PCI_BAR_TYPE_IO; diff --git a/src/devices/EmuNVNet.h b/src/devices/EmuNVNet.h index e669665fd..5253bf898 100644 --- a/src/devices/EmuNVNet.h +++ b/src/devices/EmuNVNet.h @@ -39,7 +39,7 @@ class NVNetDevice : public PCIDevice { public: // PCI Device functions - void Init(unsigned int address); + void Init(); void Reset(); uint32_t IORead(int barIndex, uint32_t port, unsigned size); void IOWrite(int barIndex, uint32_t port, uint32_t value, unsigned size); diff --git a/src/devices/MCPXDevice.cpp b/src/devices/MCPXDevice.cpp index e2a7c4381..ec0ff9264 100644 --- a/src/devices/MCPXDevice.cpp +++ b/src/devices/MCPXDevice.cpp @@ -49,7 +49,7 @@ MCPXDevice::MCPXDevice(MCPXRevision revision) // PCI Device functions -void MCPXDevice::Init(unsigned int address) +void MCPXDevice::Init() { // m_DeviceId = ?; // m_VendorId = PCI_VENDOR_ID_NVIDIA; diff --git a/src/devices/MCPXDevice.h b/src/devices/MCPXDevice.h index 5141be11c..73a42c375 100644 --- a/src/devices/MCPXDevice.h +++ b/src/devices/MCPXDevice.h @@ -51,7 +51,7 @@ public: MCPXDevice(MCPXRevision revision); // PCI Device functions - void Init(unsigned int address); + void Init(); void Reset(); uint32_t IORead(int barIndex, uint32_t port, unsigned size); diff --git a/src/devices/PCIBus.cpp b/src/devices/PCIBus.cpp index a02121f86..759c266db 100644 --- a/src/devices/PCIBus.cpp +++ b/src/devices/PCIBus.cpp @@ -37,7 +37,7 @@ #include "PCIBus.h" #include -void PCIBus::ConnectDevice(uint32_t deviceId, PCIDevice *pDevice, unsigned int address) +void PCIBus::ConnectDevice(uint32_t deviceId, PCIDevice *pDevice) { if (m_Devices.find(deviceId) != m_Devices.end()) { printf("PCIBus: Attempting to connect two devices to the same device address\n"); @@ -45,7 +45,7 @@ void PCIBus::ConnectDevice(uint32_t deviceId, PCIDevice *pDevice, unsigned int a } m_Devices[deviceId] = pDevice; - pDevice->Init(address); + pDevice->Init(); } void PCIBus::IOWriteConfigAddress(uint32_t pData) @@ -161,4 +161,4 @@ void PCIBus::Reset() for (auto it = m_Devices.begin(); it != m_Devices.end(); ++it) { it->second->Reset(); } -} \ No newline at end of file +} diff --git a/src/devices/PCIBus.h b/src/devices/PCIBus.h index ba51d6a24..1f5678643 100644 --- a/src/devices/PCIBus.h +++ b/src/devices/PCIBus.h @@ -66,7 +66,7 @@ typedef struct { class PCIBus { public: - void ConnectDevice(uint32_t deviceId, PCIDevice *pDevice, unsigned int address); + void ConnectDevice(uint32_t deviceId, PCIDevice *pDevice); bool IORead(uint32_t addr, uint32_t* value, unsigned size); bool IOWrite(uint32_t addr, uint32_t value, unsigned size); @@ -84,4 +84,4 @@ private: PCIConfigAddressRegister m_configAddressRegister; }; -#endif \ No newline at end of file +#endif diff --git a/src/devices/PCIDevice.h b/src/devices/PCIDevice.h index 498aea25e..d0327372d 100644 --- a/src/devices/PCIDevice.h +++ b/src/devices/PCIDevice.h @@ -68,8 +68,8 @@ #define USB0_BASE 0xFED00000 #define USB1_BASE 0xFED08000 // alpha kits only #define USB_SIZE 0x1000 -#define NVNet_BASE 0xFEF00000 -#define NVNet_SIZE 0x400 +#define NVNET_BASE 0xFEF00000 +#define NVNET_SIZE 0x400 #define BIOS_BASE 0xFF000000 // this takes into account that the bios covers the top 16 MiB of memory #define BIOS_XBOX_SIZE 0xFFFE00 #define BIOS_CHIHIRO_SIZE 0x1000000 @@ -123,7 +123,7 @@ typedef struct { class PCIDevice { // PCI Device Interface public: - virtual void Init(unsigned int address) = 0; + virtual void Init() = 0; virtual void Reset() = 0; virtual uint32_t IORead(int barIndex, uint32_t port, unsigned size) = 0; virtual void IOWrite(int barIndex, uint32_t port, uint32_t value, unsigned size) = 0; diff --git a/src/devices/SMBus.cpp b/src/devices/SMBus.cpp index 01d55bf0b..85c3cd9da 100644 --- a/src/devices/SMBus.cpp +++ b/src/devices/SMBus.cpp @@ -38,11 +38,11 @@ #include "SMBus.h" -void SMBus::Init(unsigned int address) +void SMBus::Init() { PCIBarRegister r; r.Raw.type = PCI_BAR_TYPE_IO; - r.IO.address = address; + r.IO.address = 0xC000; RegisterBAR(1, 32, r.value); m_DeviceId = 0x01B4; @@ -254,4 +254,4 @@ uint32_t SMBus::MMIORead(int barIndex, uint32_t addr, unsigned size) void SMBus::MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned size) { -} \ No newline at end of file +} diff --git a/src/devices/SMBus.h b/src/devices/SMBus.h index 9ec7a3bf0..bd27b48c2 100644 --- a/src/devices/SMBus.h +++ b/src/devices/SMBus.h @@ -87,7 +87,7 @@ class SMBus : public PCIDevice { using PCIDevice::PCIDevice; // PCI Functions - void Init(unsigned int address); + void Init(); void Reset(); uint32_t IORead(int barIndex, uint32_t addr, unsigned size = sizeof(uint8_t)); @@ -114,4 +114,4 @@ class SMBus : public PCIDevice { std::map m_Devices; }; -#endif \ No newline at end of file +#endif diff --git a/src/devices/Xbox.cpp b/src/devices/Xbox.cpp index 7a20b555a..9113619e8 100644 --- a/src/devices/Xbox.cpp +++ b/src/devices/Xbox.cpp @@ -156,19 +156,19 @@ void InitXboxHardware(HardwareModel hardwareModel) } // Connect devices to PCI bus - g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(1, 1)), g_SMBus, 0xC000); - g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(4, 0)), g_NVNet, NVNet_BASE); + g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(1, 1)), g_SMBus); + g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(4, 0)), g_NVNet); //g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(4, 1)), g_MCPX); // MCPX device ID = 0x0808 ? //g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(5, 0)), g_NVAPU); //g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(6, 0)), g_AC97); - g_PCIBus->ConnectDevice(PCI_DEVID(1, PCI_DEVFN(0, 0)), g_NV2A, NV2A_ADDR); + g_PCIBus->ConnectDevice(PCI_DEVID(1, PCI_DEVFN(0, 0)), g_NV2A); if (bLLE_USB) { // ergo720: according to some research done by LukeUsher, only Xbox Alpha Kits have a two HCs configuration. This seems to also be confirmed by the xboxdevwiki, // which states that it has a xircom PGPCI2(OPTI 82C861) 2 USB port PCI card -> 2 ports, not 4. Finally, I disassembled various xbe's and discovered that the number // of ports per HC is hardcoded as 4 in the driver instead of being detected at runtime by reading the HcRhDescriptorA register and so a game would have to be // recompiled to support 2 HCs, which further confirms the point. Because we are not going to emulate an Alpha Kit, we can simply ignore the USB1 device. - g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(2, 0)), g_USB0, USB0_BASE); + g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(2, 0)), g_USB0); } // TODO : Handle other SMBUS Addresses, like PIC_ADDRESS, XCALIBUR_ADDRESS diff --git a/src/devices/usb/OHCI.cpp b/src/devices/usb/OHCI.cpp index 3361322ae..46bd55f37 100644 --- a/src/devices/usb/OHCI.cpp +++ b/src/devices/usb/OHCI.cpp @@ -916,7 +916,7 @@ void OHCI::OHCI_StateReset() void OHCI::OHCI_BusStart() { // Create the EOF timer. Let's try a factor of 50 (1 virtual ms -> 50 real ms) - m_pEOFtimer = Timer_Create(OHCI_FrameBoundaryWrapper, this, 100); + m_pEOFtimer = Timer_Create(OHCI_FrameBoundaryWrapper, this, 50); DbgPrintf("%s Operational mode event\n", LOG_STR_OHCI); diff --git a/src/devices/usb/USBDevice.cpp b/src/devices/usb/USBDevice.cpp index e830b06bf..bc29202d6 100644 --- a/src/devices/usb/USBDevice.cpp +++ b/src/devices/usb/USBDevice.cpp @@ -60,13 +60,13 @@ namespace xboxkrnl // https://xqemu.com/ -void USBDevice::Init(unsigned int address) +void USBDevice::Init() { PCIBarRegister r; // Register Memory bar : r.Raw.type = PCI_BAR_TYPE_MEMORY; - r.Memory.address = address >> 4; + r.Memory.address = USB0_BASE >> 4; RegisterBAR(0, USB_SIZE, r.value); // Taken from https://github.com/docbrown/vxb/wiki/Xbox-Hardware-Information diff --git a/src/devices/usb/USBDevice.h b/src/devices/usb/USBDevice.h index 2c44e7fda..88d13818d 100644 --- a/src/devices/usb/USBDevice.h +++ b/src/devices/usb/USBDevice.h @@ -54,7 +54,7 @@ class USBDevice : public PCIDevice { ~USBDevice() {} // PCI Device functions - void Init(unsigned int address); + void Init(); void Reset() {} uint32_t IORead(int barIndex, uint32_t port, unsigned size) { return 0; } diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index aede3c54e..501ca33b9 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -846,13 +846,13 @@ NV2ADevice::~NV2ADevice() // PCI Device functions -void NV2ADevice::Init(unsigned int address) +void NV2ADevice::Init() { PCIBarRegister r; // Register Memory bar : r.Raw.type = PCI_BAR_TYPE_MEMORY; - r.Memory.address = address >> 4; + r.Memory.address = NV2A_ADDR >> 4; RegisterBAR(0, NV2A_SIZE, r.value); // Register physical memory on bar 1 diff --git a/src/devices/video/nv2a.h b/src/devices/video/nv2a.h index 62d54f60d..9119dd7dc 100644 --- a/src/devices/video/nv2a.h +++ b/src/devices/video/nv2a.h @@ -637,7 +637,7 @@ public: ~NV2ADevice(); // PCI Device functions - void Init(unsigned int address); + void Init(); void Reset(); uint32_t IORead(int barIndex, uint32_t port, unsigned size); From fb93add62e6a3bafdfdcda857981387d486b02ef Mon Sep 17 00:00:00 2001 From: ergo720 Date: Wed, 1 Aug 2018 20:24:53 +0200 Subject: [PATCH 0107/1000] Fix g_XbeType != true --- src/CxbxKrnl/VMManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CxbxKrnl/VMManager.cpp b/src/CxbxKrnl/VMManager.cpp index fc69fe3a8..f401cc4fb 100644 --- a/src/CxbxKrnl/VMManager.cpp +++ b/src/CxbxKrnl/VMManager.cpp @@ -1723,7 +1723,7 @@ xboxkrnl::NTSTATUS VMManager::XbAllocateVirtualMemory(VAddr* addr, ULONG ZeroBit } if (AlignedCapturedBase >= XBE_IMAGE_BASE + ROUND_UP_4K(CxbxKrnl_Xbe->m_Header.dwSizeofImage) && - (g_XbeType != true ? AlignedCapturedBase < CHIHIRO_MEMORY_SIZE : AlignedCapturedBase < XBE_MAX_VA)) + (g_bIsRetail != true ? AlignedCapturedBase < CHIHIRO_MEMORY_SIZE : AlignedCapturedBase < XBE_MAX_VA)) { // We can't commit on the memory placeholder after the xbe image or in the reserved area after it (128 MiB systems only) From f7d94360e7c3d7a969ed07f2bfed7f5acecc78ea Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Thu, 2 Aug 2018 08:18:17 +0100 Subject: [PATCH 0108/1000] Disable new FrameBuffer Drawing (Use Blit instead) This makes this PR able to be merged, and retains the LLE overlay fixes from this PR. --- src/devices/video/nv2a.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/video/nv2a.cpp b/src/devices/video/nv2a.cpp index 46ad358ba..6536c7ef3 100644 --- a/src/devices/video/nv2a.cpp +++ b/src/devices/video/nv2a.cpp @@ -761,7 +761,7 @@ void cxbx_gl_render_framebuffer(NV2AState *d) glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, cfi.gl_swizzle_mask); } -//#define BLIT_FRAMEBUFFER +#define BLIT_FRAMEBUFFER #ifdef BLIT_FRAMEBUFFER // If we need to create an OpenGL framebuffer, do so static GLuint framebuffer = -1; From 155c76cc4922df2a66c007ac5ad07ca01db59f96 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Thu, 2 Aug 2018 16:04:06 +0200 Subject: [PATCH 0109/1000] Remove HLE flag for GPU --- src/Cxbx/WndMain.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Cxbx/WndMain.cpp b/src/Cxbx/WndMain.cpp index 68bb051e5..9de358cd1 100644 --- a/src/Cxbx/WndMain.cpp +++ b/src/Cxbx/WndMain.cpp @@ -2609,9 +2609,6 @@ void WndMain::DrawLedBitmap(HWND hwnd, bool bdefault) if (FlagsLLE == 0) { sprintf(flagString, "HLE"); } - else if ((FlagsLLE & LLE_GPU) == 0) { - strcat(flagString, " HLE"); - } } SelectObject(m_LedDC, m_Brushes[ActiveLEDColor]); From 99ccc1d221784b1e241e42d3af5703d934347ac2 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Thu, 2 Aug 2018 17:54:06 +0200 Subject: [PATCH 0110/1000] Fix for issue #1342 --- src/Cxbx/DlgAbout.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/Cxbx/DlgAbout.cpp b/src/Cxbx/DlgAbout.cpp index e9260b1e5..db5fd911a 100644 --- a/src/Cxbx/DlgAbout.cpp +++ b/src/Cxbx/DlgAbout.cpp @@ -111,6 +111,23 @@ INT_PTR CALLBACK DlgAboutProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa SizeofResource(GetModuleHandle(NULL), rContributors) ); + size_t position = 0; + while (true) { + if (position > contributors.length()) { + break; + } + position = contributors.find('\n', position); + if (position == std::string::npos) { + break; + } + if (position != 0 && contributors.compare(position - 1, 2U, "\r\n") == 0) { + position++; + continue; + } + contributors.insert(position, 1, '\r'); + position += 2; + } + tab = CreateWindowEx( NULL, "EDIT", contributors.c_str(), WS_CHILD | WS_VSCROLL |ES_MULTILINE | ES_READONLY, @@ -134,6 +151,23 @@ INT_PTR CALLBACK DlgAboutProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa SizeofResource(GetModuleHandle(NULL), rCopying) ); + position = 0; + while (true) { + if (position > copying.length()) { + break; + } + position = copying.find('\n', position); + if (position == std::string::npos) { + break; + } + if (position != 0 && copying.compare(position - 1, 2U, "\r\n") == 0) { + position++; + continue; + } + copying.insert(position, 1, '\r'); + position += 2; + } + tab = CreateWindowEx( NULL, "EDIT", copying.c_str(), WS_CHILD | WS_VSCROLL | ES_MULTILINE | ES_READONLY, From 59f8bb1b67df549fd5a71bcc18478e6365c1022f Mon Sep 17 00:00:00 2001 From: ergo720 Date: Thu, 2 Aug 2018 18:17:17 +0200 Subject: [PATCH 0111/1000] Make the fix a standalone function --- src/Common/CxbxCommon.cpp | 22 +++++++++++++++++++++- src/Common/CxbxCommon.h | 5 ++++- src/Cxbx/DlgAbout.cpp | 35 +++-------------------------------- 3 files changed, 28 insertions(+), 34 deletions(-) diff --git a/src/Common/CxbxCommon.cpp b/src/Common/CxbxCommon.cpp index 971ec9b3d..7eb2883a0 100644 --- a/src/Common/CxbxCommon.cpp +++ b/src/Common/CxbxCommon.cpp @@ -44,7 +44,7 @@ #endif -// Acknowledgment: all the functions present at the moment are from XQEMU (GPLv2) +// Acknowledgment: some the functions present are from XQEMU (GPLv2) // https://xqemu.com/ @@ -175,3 +175,23 @@ void WriteWords(xbaddr Paddr, uint16_t* Buffer, int Number) std::memcpy(reinterpret_cast(Paddr + CONTIGUOUS_MEMORY_BASE), Buffer, 2); // dropped big -> little endian conversion from XQEMU } } + +void unix2dos(std::string& string) +{ + size_t position = 0; + while (true) { + if (position > string.length()) { + break; + } + position = string.find('\n', position); + if (position == std::string::npos) { + break; + } + if (position != 0 && string.compare(position - 1, 2U, "\r\n") == 0) { + position++; + continue; + } + string.insert(position, 1, '\r'); + position += 2; + } +} diff --git a/src/Common/CxbxCommon.h b/src/Common/CxbxCommon.h index 5a8bf3e0e..e8f87f60a 100644 --- a/src/Common/CxbxCommon.h +++ b/src/Common/CxbxCommon.h @@ -40,6 +40,7 @@ #include "Cxbx.h" #include #include +#include /* This is a linux struct for vectored I/O. See readv() and writev() */ struct IoVec @@ -66,7 +67,9 @@ size_t IoVecFromBuffer(const IoVec* iov, unsigned int iov_cnt, size_t offset, vo void WriteDwords(xbaddr Paddr, uint32_t* Buffer, int Number); void GetDwords(xbaddr Paddr, uint32_t* Buffer, int Number); void GetWords(xbaddr Paddr, uint16_t* Buffer, int Number); -void WriteWords(xbaddr Paddr, uint16_t* Buffer, int Number); +void WriteWords(xbaddr Paddr, uint16_t* Buffer, int Number); + +void unix2dos(std::string& string); #define GET_WORD_LOW(value) (uint8_t)((value) & 0xFF) #define GET_WORD_HIGH(value) (uint8_t)(((value) >> 8) & 0xFF) diff --git a/src/Cxbx/DlgAbout.cpp b/src/Cxbx/DlgAbout.cpp index db5fd911a..53ba83cb8 100644 --- a/src/Cxbx/DlgAbout.cpp +++ b/src/Cxbx/DlgAbout.cpp @@ -39,6 +39,7 @@ #include "CxbxVersion.h" #include "DlgAbout.h" #include "ResCxbx.h" +#include "CxbxCommon.h" #include #include @@ -111,22 +112,7 @@ INT_PTR CALLBACK DlgAboutProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa SizeofResource(GetModuleHandle(NULL), rContributors) ); - size_t position = 0; - while (true) { - if (position > contributors.length()) { - break; - } - position = contributors.find('\n', position); - if (position == std::string::npos) { - break; - } - if (position != 0 && contributors.compare(position - 1, 2U, "\r\n") == 0) { - position++; - continue; - } - contributors.insert(position, 1, '\r'); - position += 2; - } + unix2dos(contributors); tab = CreateWindowEx( NULL, "EDIT", contributors.c_str(), @@ -151,22 +137,7 @@ INT_PTR CALLBACK DlgAboutProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa SizeofResource(GetModuleHandle(NULL), rCopying) ); - position = 0; - while (true) { - if (position > copying.length()) { - break; - } - position = copying.find('\n', position); - if (position == std::string::npos) { - break; - } - if (position != 0 && copying.compare(position - 1, 2U, "\r\n") == 0) { - position++; - continue; - } - copying.insert(position, 1, '\r'); - position += 2; - } + unix2dos(copying); tab = CreateWindowEx( NULL, "EDIT", copying.c_str(), From 463b288335e7b39f5653166917d9f76c79b01869 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Thu, 2 Aug 2018 18:47:15 +0200 Subject: [PATCH 0112/1000] Remove unneeded check --- src/Common/CxbxCommon.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Common/CxbxCommon.cpp b/src/Common/CxbxCommon.cpp index 7eb2883a0..4051da03e 100644 --- a/src/Common/CxbxCommon.cpp +++ b/src/Common/CxbxCommon.cpp @@ -180,9 +180,6 @@ void unix2dos(std::string& string) { size_t position = 0; while (true) { - if (position > string.length()) { - break; - } position = string.find('\n', position); if (position == std::string::npos) { break; From 28bfaccd1dc242c47f283b7bb5065ed800420542 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Fri, 3 Aug 2018 16:25:39 +0200 Subject: [PATCH 0113/1000] Fix a crash in the dashboard --- src/CxbxKrnl/Emu.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CxbxKrnl/Emu.cpp b/src/CxbxKrnl/Emu.cpp index fc0588621..9096b6433 100644 --- a/src/CxbxKrnl/Emu.cpp +++ b/src/CxbxKrnl/Emu.cpp @@ -84,8 +84,8 @@ std::string FormatTitleId(uint32_t title_id) // EG: MS-001 for 1st tile published by MS, EA-002 for 2nd title by EA, etc // Some special Xbes (Dashboard, XDK Samples) use non-alphanumeric serials // We fall back to Hex for those - char pTitleId1 = (title_id >> 24) & 0xFF; - char pTitleId2 = (title_id >> 16) & 0xFF; + unsigned char pTitleId1 = (title_id >> 24) & 0xFF; + unsigned char pTitleId2 = (title_id >> 16) & 0xFF; if (!isalnum(pTitleId1) || !isalnum(pTitleId2)) { // Prefix was non-printable, so we need to print a hex reprentation of the entire title_id From b44804ee7136f01dcce6d37ba54cbad0eb4ee326 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Fri, 3 Aug 2018 18:25:30 +0200 Subject: [PATCH 0114/1000] Fix unicode characters printed in the dashboard title --- src/CxbxKrnl/Emu.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/CxbxKrnl/Emu.cpp b/src/CxbxKrnl/Emu.cpp index 9096b6433..cc75036a5 100644 --- a/src/CxbxKrnl/Emu.cpp +++ b/src/CxbxKrnl/Emu.cpp @@ -84,10 +84,10 @@ std::string FormatTitleId(uint32_t title_id) // EG: MS-001 for 1st tile published by MS, EA-002 for 2nd title by EA, etc // Some special Xbes (Dashboard, XDK Samples) use non-alphanumeric serials // We fall back to Hex for those - unsigned char pTitleId1 = (title_id >> 24) & 0xFF; - unsigned char pTitleId2 = (title_id >> 16) & 0xFF; + uint8_t pTitleId1 = (title_id >> 24) & 0xFF; + uint8_t pTitleId2 = (title_id >> 16) & 0xFF; - if (!isalnum(pTitleId1) || !isalnum(pTitleId2)) { + if ((pTitleId1 < 65 || pTitleId1 > 90) || (pTitleId2 < 65 || pTitleId2 > 90)) { // Prefix was non-printable, so we need to print a hex reprentation of the entire title_id ss << std::setfill('0') << std::setw(8) << std::hex << std::uppercase << title_id; return ss.str(); From f89fedee958dbc86ae65caf0915580c6f7fb3b1e Mon Sep 17 00:00:00 2001 From: ergo720 Date: Fri, 3 Aug 2018 19:05:27 +0200 Subject: [PATCH 0115/1000] added comment --- src/CxbxKrnl/Emu.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/CxbxKrnl/Emu.cpp b/src/CxbxKrnl/Emu.cpp index cc75036a5..a0cb6e4a2 100644 --- a/src/CxbxKrnl/Emu.cpp +++ b/src/CxbxKrnl/Emu.cpp @@ -84,6 +84,8 @@ std::string FormatTitleId(uint32_t title_id) // EG: MS-001 for 1st tile published by MS, EA-002 for 2nd title by EA, etc // Some special Xbes (Dashboard, XDK Samples) use non-alphanumeric serials // We fall back to Hex for those + // ergo720: we cannot use isalnum() here because it will treat chars in the range -1 - 255 as valid ascii chars which can + // lead to unicode characters being printed in the title (e.g.: dashboard uses 0xFE and 0xFE) uint8_t pTitleId1 = (title_id >> 24) & 0xFF; uint8_t pTitleId2 = (title_id >> 16) & 0xFF; From ca080c9bc4fdee93c77edbdf2838a7e2183fd890 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Fri, 3 Aug 2018 19:06:40 +0200 Subject: [PATCH 0116/1000] Amend last comment --- src/CxbxKrnl/Emu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CxbxKrnl/Emu.cpp b/src/CxbxKrnl/Emu.cpp index a0cb6e4a2..1c844e4c3 100644 --- a/src/CxbxKrnl/Emu.cpp +++ b/src/CxbxKrnl/Emu.cpp @@ -85,7 +85,7 @@ std::string FormatTitleId(uint32_t title_id) // Some special Xbes (Dashboard, XDK Samples) use non-alphanumeric serials // We fall back to Hex for those // ergo720: we cannot use isalnum() here because it will treat chars in the range -1 - 255 as valid ascii chars which can - // lead to unicode characters being printed in the title (e.g.: dashboard uses 0xFE and 0xFE) + // lead to unicode characters being printed in the title (e.g.: dashboard uses 0xFE and 0xFF) uint8_t pTitleId1 = (title_id >> 24) & 0xFF; uint8_t pTitleId2 = (title_id >> 16) & 0xFF; From 5ccdb35632bb872c046f39d1c7ec981862a9796b Mon Sep 17 00:00:00 2001 From: ergo720 Date: Fri, 3 Aug 2018 23:50:09 +0200 Subject: [PATCH 0117/1000] Refactored kernel crypto functions + implemented XcUpdateCrypto (doesn't work yet) --- import/OpenXDK/include/xboxkrnl/xbox.h | 40 +- src/CxbxKrnl/EmuKrnlXc.cpp | 562 +++++++++++++++++++------ 2 files changed, 465 insertions(+), 137 deletions(-) diff --git a/import/OpenXDK/include/xboxkrnl/xbox.h b/import/OpenXDK/include/xboxkrnl/xbox.h index 90b09d86e..3fad1459b 100644 --- a/import/OpenXDK/include/xboxkrnl/xbox.h +++ b/import/OpenXDK/include/xboxkrnl/xbox.h @@ -412,7 +412,43 @@ XBSYSAPI EXPORTNUM(350) ULONG NTAPI XcCryptService IN PVOID pArgs ); -typedef PVOID PCRYPTO_VECTOR; // TODO : Expand +/* Function pointers which point to all the kernel crypto functions. Used by PCRYPTO_VECTOR. */ +typedef VOID(NTAPI *pfXcSHAInit)(PUCHAR pbSHAContext); +typedef VOID(NTAPI *pfXcSHAUpdate)(PUCHAR pbSHAContext, PUCHAR pbInput, ULONG dwInputLength); +typedef VOID(NTAPI *pfXcSHAFinal)(PUCHAR pbSHAContext, PUCHAR pbDigest); +typedef VOID(NTAPI *pfXcRC4Key)(PUCHAR pbKeyStruct, ULONG dwKeyLength, PUCHAR pbKey); +typedef VOID(NTAPI *pfXcRC4Crypt)(PUCHAR pbKeyStruct, ULONG dwInputLength, PUCHAR pbInput); +typedef VOID(NTAPI *pfXcHMAC)(PBYTE pbKeyMaterial, ULONG cbKeyMaterial, PBYTE pbData, ULONG cbData, PBYTE pbData2, ULONG cbData2, PBYTE HmacData); +typedef ULONG(NTAPI *pfXcPKEncPublic)(PUCHAR pbPubKey, PUCHAR pbInput, PUCHAR pbOutput); +typedef ULONG(NTAPI *pfXcPKDecPrivate)(PUCHAR pbPrvKey, PUCHAR pbInput, PUCHAR pbOutput); +typedef ULONG(NTAPI *pfXcPKGetKeyLen)(PUCHAR pbPubKey); +typedef BOOLEAN(NTAPI *pfXcVerifyPKCS1Signature)(PUCHAR pbSig, PUCHAR pbPubKey, PUCHAR pbDigest); +typedef ULONG(NTAPI *pfXcModExp)(LPDWORD pA, LPDWORD pB, LPDWORD pC, LPDWORD pD, ULONG dwN); +typedef VOID(NTAPI *pfXcDESKeyParity)(PUCHAR pbKey, ULONG dwKeyLength); +typedef VOID(NTAPI *pfXcKeyTable)(ULONG dwCipher, PUCHAR pbKeyTable, PUCHAR pbKey); +typedef VOID(NTAPI *pfXcBlockCrypt)(ULONG dwCipher, PUCHAR pbOutput, PUCHAR pbInput, PUCHAR pbKeyTable, ULONG dwOp); +typedef VOID(NTAPI *pfXcBlockCryptCBC)(ULONG dwCipher, ULONG dwInputLength, PUCHAR pbOutput, PUCHAR pbInput, PUCHAR pbKeyTable, ULONG dwOp, PUCHAR pbFeedback); +typedef ULONG(NTAPI *pfXcCryptService)(ULONG dwOp, PVOID pArgs); + +/* Struct which contains all the pointers to the crypto functions */ +typedef struct { + pfXcSHAInit pXcSHAInit; + pfXcSHAUpdate pXcSHAUpdate; + pfXcSHAFinal pXcSHAFinal; + pfXcRC4Key pXcRC4Key; + pfXcRC4Crypt pXcRC4Crypt; + pfXcHMAC pXcHMAC; + pfXcPKEncPublic pXcPKEncPublic; + pfXcPKDecPrivate pXcPKDecPrivate; + pfXcPKGetKeyLen pXcPKGetKeyLen; + pfXcVerifyPKCS1Signature pXcVerifyPKCS1Signature; + pfXcModExp pXcModExp; + pfXcDESKeyParity pXcDESKeyParity; + pfXcKeyTable pXcKeyTable; + pfXcBlockCrypt pXcBlockCrypt; + pfXcBlockCryptCBC pXcBlockCryptCBC; + pfXcCryptService pXcCryptService; +} CRYPTO_VECTOR, *PCRYPTO_VECTOR; // ****************************************************************** // * 0x015F - XcUpdateCrypto() @@ -525,5 +561,3 @@ XBSYSAPI EXPORTNUM(373) NTSTATUS NTAPI IrtSweep // PROFILING ); #endif - - diff --git a/src/CxbxKrnl/EmuKrnlXc.cpp b/src/CxbxKrnl/EmuKrnlXc.cpp index 925b2ba25..ee95b30ed 100644 --- a/src/CxbxKrnl/EmuKrnlXc.cpp +++ b/src/CxbxKrnl/EmuKrnlXc.cpp @@ -53,123 +53,73 @@ namespace xboxkrnl namespace NtDll { #include "EmuNtDll.h" -}; +}; + + +// The following are the default implementations of the crypto functions -// ****************************************************************** -// * 0x014F - XcSHAInit() -// ****************************************************************** -XBSYSAPI EXPORTNUM(335) xboxkrnl::VOID NTAPI xboxkrnl::XcSHAInit +xboxkrnl::VOID NTAPI JumpedSHAInit ( - IN PUCHAR pbSHAContext + xboxkrnl::PUCHAR pbSHAContext ) { - LOG_FUNC_ONE_ARG_TYPE(PBYTE, pbSHAContext); - - // The sha1 context supplied by this function has an extra 24 bytes at the beginning which are unsed by our implementation, + // The sha1 context supplied to this function has an extra 24 bytes at the beginning which are unsed by our implementation, // so we skip them. The same is true for XcSHAUpdate and XcSHAFinal SHA1Init((SHA1_CTX*)(pbSHAContext + 24)); } -// ****************************************************************** -// * 0x0150 - XcSHAUpdate() -// ****************************************************************** -XBSYSAPI EXPORTNUM(336) xboxkrnl::VOID NTAPI xboxkrnl::XcSHAUpdate +xboxkrnl::VOID NTAPI JumpedSHAUpdate ( - PUCHAR pbSHAContext, - PUCHAR pbInput, - ULONG dwInputLength + xboxkrnl::PUCHAR pbSHAContext, + xboxkrnl::PUCHAR pbInput, + xboxkrnl::ULONG dwInputLength ) { - LOG_FUNC_BEGIN - LOG_FUNC_ARG_OUT(pbSHAContext) - LOG_FUNC_ARG_OUT(pbInput) - LOG_FUNC_ARG(dwInputLength) - LOG_FUNC_END; - SHA1Update((SHA1_CTX*)(pbSHAContext + 24), pbInput, dwInputLength); } -// ****************************************************************** -// * 0x0151 - XcSHAFinal() -// ****************************************************************** -XBSYSAPI EXPORTNUM(337) xboxkrnl::VOID NTAPI xboxkrnl::XcSHAFinal +xboxkrnl::VOID NTAPI JumpedSHAFinal ( - IN PUCHAR pbSHAContext, - IN PUCHAR pbDigest + xboxkrnl::PUCHAR pbSHAContext, + xboxkrnl::PUCHAR pbDigest ) { - LOG_FUNC_BEGIN - LOG_FUNC_ARG_TYPE(PBYTE, pbSHAContext) - LOG_FUNC_ARG_TYPE(PBYTE, pbDigest) - LOG_FUNC_END; - SHA1Final(pbDigest, (SHA1_CTX*)(pbSHAContext + 24)); } - -// ****************************************************************** -// * 0x0152 - XcRC4Key() -// ****************************************************************** -XBSYSAPI EXPORTNUM(338) xboxkrnl::VOID NTAPI xboxkrnl::XcRC4Key + +xboxkrnl::VOID NTAPI JumpedRC4Key ( - IN PUCHAR pbKeyStruct, - IN ULONG dwKeyLength, - IN PUCHAR pbKey + xboxkrnl::PUCHAR pbKeyStruct, + xboxkrnl::ULONG dwKeyLength, + xboxkrnl::PUCHAR pbKey ) { - LOG_FUNC_BEGIN - LOG_FUNC_ARG_TYPE(PBYTE, pbKeyStruct) - LOG_FUNC_ARG(dwKeyLength) - LOG_FUNC_ARG_TYPE(PBYTE, pbKey) - LOG_FUNC_END; - Rc4Initialise((Rc4Context*)pbKeyStruct, pbKey, dwKeyLength, 0); } -// ****************************************************************** -// * 0x0153 - XcRC4Crypt -// ****************************************************************** -XBSYSAPI EXPORTNUM(339) xboxkrnl::VOID NTAPI xboxkrnl::XcRC4Crypt +xboxkrnl::VOID NTAPI JumpedRC4Crypt ( - IN PUCHAR pbKeyStruct, - IN ULONG dwInputLength, - IN PUCHAR pbInput + xboxkrnl::PUCHAR pbKeyStruct, + xboxkrnl::ULONG dwInputLength, + xboxkrnl::PUCHAR pbInput ) { - LOG_FUNC_BEGIN - LOG_FUNC_ARG_TYPE(PBYTE, pbKeyStruct) - LOG_FUNC_ARG(dwInputLength) - LOG_FUNC_ARG_TYPE(PBYTE, pbInput) - LOG_FUNC_END; - Rc4Xor((Rc4Context*)pbKeyStruct, pbInput, pbInput, dwInputLength); } -// ****************************************************************** -// * 0x0154 - XcHMAC() -// ****************************************************************** -XBSYSAPI EXPORTNUM(340) xboxkrnl::VOID NTAPI xboxkrnl::XcHMAC +xboxkrnl::VOID NTAPI JumpedHMAC ( - IN PBYTE pbKeyMaterial, - IN ULONG cbKeyMaterial, - IN PBYTE pbData, - IN ULONG cbData, - IN PBYTE pbData2, - IN ULONG cbData2, - OUT PBYTE HmacData + xboxkrnl::PBYTE pbKeyMaterial, + xboxkrnl::ULONG cbKeyMaterial, + xboxkrnl::PBYTE pbData, + xboxkrnl::ULONG cbData, + xboxkrnl::PBYTE pbData2, + xboxkrnl::ULONG cbData2, + xboxkrnl::PBYTE HmacData ) { - LOG_FUNC_BEGIN - LOG_FUNC_ARG(pbKeyMaterial) - LOG_FUNC_ARG(cbKeyMaterial) - LOG_FUNC_ARG(pbData) - LOG_FUNC_ARG(cbData) - LOG_FUNC_ARG(pbData2) - LOG_FUNC_ARG(cbData2) - LOG_FUNC_ARG_OUT(HmacData) - LOG_FUNC_END; - - if (cbKeyMaterial > 64) { + if (cbKeyMaterial > 64) { cbKeyMaterial = 64; } @@ -199,7 +149,7 @@ XBSYSAPI EXPORTNUM(340) xboxkrnl::VOID NTAPI xboxkrnl::XcHMAC } BYTE Temp[64 + A_SHA_DIGEST_LEN]; - SHA1Final(Temp + 64 , &ShaContext); + SHA1Final(Temp + 64, &ShaContext); RtlCopyMemory(Temp, Pad2, 64); SHA1Init(&ShaContext); @@ -207,6 +157,381 @@ XBSYSAPI EXPORTNUM(340) xboxkrnl::VOID NTAPI xboxkrnl::XcHMAC SHA1Final(HmacData, &ShaContext); } +xboxkrnl::ULONG NTAPI JumpedPKEncPublic +( + xboxkrnl::PUCHAR pbPubKey, + xboxkrnl::PUCHAR pbInput, + xboxkrnl::PUCHAR pbOutput +) +{ + ULONG ret = 0; + + LOG_UNIMPLEMENTED(); + + return ret; +} + +xboxkrnl::ULONG NTAPI JumpedPKDecPrivate +( + xboxkrnl::PUCHAR pbPrvKey, + xboxkrnl::PUCHAR pbInput, + xboxkrnl::PUCHAR pbOutput +) +{ + ULONG ret = 0; + + LOG_UNIMPLEMENTED(); + + return ret; +} + +xboxkrnl::ULONG NTAPI JumpedPKGetKeyLen +( + xboxkrnl::PUCHAR pbPubKey +) +{ + ULONG ret = 0; + + LOG_UNIMPLEMENTED(); + + return ret; +} + +xboxkrnl::BOOLEAN NTAPI JumpedVerifyPKCS1Signature +( + xboxkrnl::PUCHAR pbSig, + xboxkrnl::PUCHAR pbPubKey, + xboxkrnl::PUCHAR pbDigest +) +{ + BOOLEAN ret = TRUE; + + LOG_UNIMPLEMENTED(); + + return ret; +} + +xboxkrnl::ULONG NTAPI JumpedModExp +( + xboxkrnl::LPDWORD pA, + xboxkrnl::LPDWORD pB, + xboxkrnl::LPDWORD pC, + xboxkrnl::LPDWORD pD, + xboxkrnl::ULONG dwN +) +{ + ULONG ret = 0; + + LOG_UNIMPLEMENTED(); + + return ret; +} + +xboxkrnl::VOID NTAPI JumpedDESKeyParity +( + xboxkrnl::PUCHAR pbKey, + xboxkrnl::ULONG dwKeyLength +) +{ + LOG_UNIMPLEMENTED(); +} + +xboxkrnl::VOID NTAPI JumpedKeyTable +( + xboxkrnl::ULONG dwCipher, + xboxkrnl::PUCHAR pbKeyTable, + xboxkrnl::PUCHAR pbKey +) +{ + LOG_UNIMPLEMENTED(); +} + +xboxkrnl::VOID NTAPI JumpedBlockCrypt +( + xboxkrnl::ULONG dwCipher, + xboxkrnl::PUCHAR pbOutput, + xboxkrnl::PUCHAR pbInput, + xboxkrnl::PUCHAR pbKeyTable, + xboxkrnl::ULONG dwOp +) +{ + LOG_UNIMPLEMENTED(); +} + +xboxkrnl::VOID NTAPI JumpedBlockCryptCBC +( + xboxkrnl::ULONG dwCipher, + xboxkrnl::ULONG dwInputLength, + xboxkrnl::PUCHAR pbOutput, + xboxkrnl::PUCHAR pbInput, + xboxkrnl::PUCHAR pbKeyTable, + xboxkrnl::ULONG dwOp, + xboxkrnl::PUCHAR pbFeedback +) +{ + LOG_UNIMPLEMENTED(); +} + +xboxkrnl::ULONG NTAPI JumpedCryptService +( + xboxkrnl::ULONG dwOp, + xboxkrnl::PVOID pArgs +) +{ + ULONG ret = 0; + + LOG_UNIMPLEMENTED(); + + return ret; +} + +/* This struct contains the original crypto functions exposed by the kernel */ +const xboxkrnl::CRYPTO_VECTOR DefaultCryptoStruct = +{ + JumpedSHAInit, + JumpedSHAUpdate, + JumpedSHAFinal, + JumpedRC4Key, + JumpedRC4Crypt, + JumpedHMAC, + JumpedPKEncPublic, + JumpedPKDecPrivate, + JumpedPKGetKeyLen, + JumpedVerifyPKCS1Signature, + JumpedModExp, + JumpedDESKeyParity, + JumpedKeyTable, + JumpedBlockCrypt, + JumpedBlockCryptCBC, + JumpedCryptService +}; + +/* This struct contains the updated crypto functions which can be changed by the title with XcUpdateCrypto */ +xboxkrnl::CRYPTO_VECTOR UpdatedCryptoStruct = +{ + JumpedSHAInit, + JumpedSHAUpdate, + JumpedSHAFinal, + JumpedRC4Key, + JumpedRC4Crypt, + JumpedHMAC, + JumpedPKEncPublic, + JumpedPKDecPrivate, + JumpedPKGetKeyLen, + JumpedVerifyPKCS1Signature, + JumpedModExp, + JumpedDESKeyParity, + JumpedKeyTable, + JumpedBlockCrypt, + JumpedBlockCryptCBC, + JumpedCryptService +}; + +// ****************************************************************** +// * 0x015F - XcUpdateCrypto() +// ****************************************************************** +XBSYSAPI EXPORTNUM(351) xboxkrnl::VOID NTAPI xboxkrnl::XcUpdateCrypto +( + IN PCRYPTO_VECTOR pNewVector, + OUT PCRYPTO_VECTOR pROMVector OPTIONAL +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG(pNewVector) + LOG_FUNC_ARG_OUT(pROMVector) + LOG_FUNC_END; + + // This function changes the default crypto function implementations with those supplied by the title (if not NULL) + + if (pNewVector->pXcSHAInit) + { + UpdatedCryptoStruct.pXcSHAInit = pNewVector->pXcSHAInit; + } + if (pNewVector->pXcSHAUpdate) + { + UpdatedCryptoStruct.pXcSHAUpdate = pNewVector->pXcSHAUpdate; + } + if (pNewVector->pXcSHAFinal) + { + UpdatedCryptoStruct.pXcSHAFinal = pNewVector->pXcSHAFinal; + } + if (pNewVector->pXcRC4Key) + { + UpdatedCryptoStruct.pXcRC4Key = pNewVector->pXcRC4Key; + } + if (pNewVector->pXcRC4Crypt) + { + UpdatedCryptoStruct.pXcRC4Crypt = pNewVector->pXcRC4Crypt; + } + if (pNewVector->pXcHMAC) + { + UpdatedCryptoStruct.pXcHMAC = pNewVector->pXcHMAC; + } + if (pNewVector->pXcPKEncPublic) + { + UpdatedCryptoStruct.pXcPKEncPublic = pNewVector->pXcPKEncPublic; + } + if (pNewVector->pXcPKDecPrivate) + { + UpdatedCryptoStruct.pXcPKDecPrivate = pNewVector->pXcPKDecPrivate; + } + if (pNewVector->pXcPKGetKeyLen) + { + UpdatedCryptoStruct.pXcPKGetKeyLen = pNewVector->pXcPKGetKeyLen; + } + if (pNewVector->pXcVerifyPKCS1Signature) + { + UpdatedCryptoStruct.pXcVerifyPKCS1Signature = pNewVector->pXcVerifyPKCS1Signature; + } + if (pNewVector->pXcModExp) + { + UpdatedCryptoStruct.pXcModExp = pNewVector->pXcModExp; + } + if (pNewVector->pXcDESKeyParity) + { + UpdatedCryptoStruct.pXcDESKeyParity = pNewVector->pXcDESKeyParity; + } + if (pNewVector->pXcKeyTable) + { + UpdatedCryptoStruct.pXcKeyTable = pNewVector->pXcKeyTable; + } + if (pNewVector->pXcBlockCrypt) + { + UpdatedCryptoStruct.pXcBlockCrypt = pNewVector->pXcBlockCrypt; + } + if (pNewVector->pXcBlockCryptCBC) + { + UpdatedCryptoStruct.pXcBlockCryptCBC = pNewVector->pXcBlockCryptCBC; + } + if (pNewVector->pXcCryptService) + { + UpdatedCryptoStruct.pXcCryptService = pNewVector->pXcCryptService; + } + + // Return to the title the original implementations if it supplied an out buffer + + if (pROMVector) + { + *pROMVector = DefaultCryptoStruct; + } +} + +// The following functions simply jump to the corresponding registered crypto functions + +// ****************************************************************** +// * 0x014F - XcSHAInit() +// ****************************************************************** +XBSYSAPI EXPORTNUM(335) xboxkrnl::VOID NTAPI xboxkrnl::XcSHAInit +( + IN PUCHAR pbSHAContext +) +{ + LOG_FUNC_ONE_ARG_TYPE(PBYTE, pbSHAContext); + + UpdatedCryptoStruct.pXcSHAInit(pbSHAContext); +} + +// ****************************************************************** +// * 0x0150 - XcSHAUpdate() +// ****************************************************************** +XBSYSAPI EXPORTNUM(336) xboxkrnl::VOID NTAPI xboxkrnl::XcSHAUpdate +( + PUCHAR pbSHAContext, + PUCHAR pbInput, + ULONG dwInputLength +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG_OUT(pbSHAContext) + LOG_FUNC_ARG_OUT(pbInput) + LOG_FUNC_ARG(dwInputLength) + LOG_FUNC_END; + + UpdatedCryptoStruct.pXcSHAUpdate(pbSHAContext, pbInput, dwInputLength); +} + +// ****************************************************************** +// * 0x0151 - XcSHAFinal() +// ****************************************************************** +XBSYSAPI EXPORTNUM(337) xboxkrnl::VOID NTAPI xboxkrnl::XcSHAFinal +( + IN PUCHAR pbSHAContext, + IN PUCHAR pbDigest +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG_TYPE(PBYTE, pbSHAContext) + LOG_FUNC_ARG_TYPE(PBYTE, pbDigest) + LOG_FUNC_END; + + UpdatedCryptoStruct.pXcSHAFinal(pbDigest, pbSHAContext); +} + +// ****************************************************************** +// * 0x0152 - XcRC4Key() +// ****************************************************************** +XBSYSAPI EXPORTNUM(338) xboxkrnl::VOID NTAPI xboxkrnl::XcRC4Key +( + IN PUCHAR pbKeyStruct, + IN ULONG dwKeyLength, + IN PUCHAR pbKey +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG_TYPE(PBYTE, pbKeyStruct) + LOG_FUNC_ARG(dwKeyLength) + LOG_FUNC_ARG_TYPE(PBYTE, pbKey) + LOG_FUNC_END; + + UpdatedCryptoStruct.pXcRC4Key(pbKeyStruct, dwKeyLength, pbKey); +} + +// ****************************************************************** +// * 0x0153 - XcRC4Crypt +// ****************************************************************** +XBSYSAPI EXPORTNUM(339) xboxkrnl::VOID NTAPI xboxkrnl::XcRC4Crypt +( + IN PUCHAR pbKeyStruct, + IN ULONG dwInputLength, + IN PUCHAR pbInput +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG_TYPE(PBYTE, pbKeyStruct) + LOG_FUNC_ARG(dwInputLength) + LOG_FUNC_ARG_TYPE(PBYTE, pbInput) + LOG_FUNC_END; + + UpdatedCryptoStruct.pXcRC4Crypt(pbKeyStruct, dwInputLength, pbInput); +} + +// ****************************************************************** +// * 0x0154 - XcHMAC() +// ****************************************************************** +XBSYSAPI EXPORTNUM(340) xboxkrnl::VOID NTAPI xboxkrnl::XcHMAC +( + IN PBYTE pbKeyMaterial, + IN ULONG cbKeyMaterial, + IN PBYTE pbData, + IN ULONG cbData, + IN PBYTE pbData2, + IN ULONG cbData2, + OUT PBYTE HmacData +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG(pbKeyMaterial) + LOG_FUNC_ARG(cbKeyMaterial) + LOG_FUNC_ARG(pbData) + LOG_FUNC_ARG(cbData) + LOG_FUNC_ARG(pbData2) + LOG_FUNC_ARG(cbData2) + LOG_FUNC_ARG_OUT(HmacData) + LOG_FUNC_END; + + UpdatedCryptoStruct.pXcHMAC(pbKeyMaterial, cbKeyMaterial, pbData, cbData, pbData2, cbData2, HmacData); +} + // ****************************************************************** // * 0x0155 - XcPKEncPublic() // ****************************************************************** @@ -221,11 +546,9 @@ XBSYSAPI EXPORTNUM(341) xboxkrnl::ULONG NTAPI xboxkrnl::XcPKEncPublic LOG_FUNC_ARG_TYPE(PBYTE, pbPubKey) LOG_FUNC_ARG_TYPE(PBYTE, pbInput) LOG_FUNC_ARG_OUT(pbOutput) - LOG_FUNC_END; + LOG_FUNC_END; - ULONG ret = 0; - - LOG_UNIMPLEMENTED(); + ULONG ret = UpdatedCryptoStruct.pXcPKEncPublic(pbPubKey, pbInput, pbOutput); RETURN(ret); } @@ -244,11 +567,9 @@ XBSYSAPI EXPORTNUM(342) xboxkrnl::ULONG NTAPI xboxkrnl::XcPKDecPrivate LOG_FUNC_ARG_TYPE(PBYTE, pbPrvKey) LOG_FUNC_ARG_TYPE(PBYTE, pbInput) LOG_FUNC_ARG_OUT(pbOutput) - LOG_FUNC_END; + LOG_FUNC_END; - ULONG ret = 0; - - LOG_UNIMPLEMENTED(); + ULONG ret = UpdatedCryptoStruct.pXcPKDecPrivate(pbPrvKey, pbInput, pbOutput); RETURN(ret); } @@ -263,9 +584,7 @@ XBSYSAPI EXPORTNUM(343) xboxkrnl::ULONG NTAPI xboxkrnl::XcPKGetKeyLen { LOG_FUNC_ONE_ARG_TYPE(PBYTE, pbPubKey); - ULONG ret = 0; - - LOG_UNIMPLEMENTED(); + ULONG ret = UpdatedCryptoStruct.pXcPKGetKeyLen(pbPubKey); RETURN(ret); } @@ -284,11 +603,9 @@ XBSYSAPI EXPORTNUM(344) xboxkrnl::BOOLEAN NTAPI xboxkrnl::XcVerifyPKCS1Signature LOG_FUNC_ARG_TYPE(PBYTE, pbSig) LOG_FUNC_ARG_TYPE(PBYTE, pbPubKey) LOG_FUNC_ARG_TYPE(PBYTE, pbDigest) - LOG_FUNC_END; + LOG_FUNC_END; - BOOLEAN ret = TRUE; - - LOG_UNIMPLEMENTED(); + BOOLEAN ret = UpdatedCryptoStruct.pXcVerifyPKCS1Signature(pbSig, pbPubKey, pbDigest); RETURN(ret); } @@ -311,11 +628,9 @@ XBSYSAPI EXPORTNUM(345) xboxkrnl::ULONG NTAPI xboxkrnl::XcModExp LOG_FUNC_ARG(pC) LOG_FUNC_ARG(pD) LOG_FUNC_ARG(dwN) - LOG_FUNC_END; + LOG_FUNC_END; - ULONG ret = 0; - - LOG_UNIMPLEMENTED(); + ULONG ret = UpdatedCryptoStruct.pXcModExp(pA, pB, pC, pD, dwN); RETURN(ret); } @@ -332,9 +647,9 @@ XBSYSAPI EXPORTNUM(346) xboxkrnl::VOID NTAPI xboxkrnl::XcDESKeyParity LOG_FUNC_BEGIN LOG_FUNC_ARG_TYPE(PBYTE, pbKey) LOG_FUNC_ARG(dwKeyLength) - LOG_FUNC_END; + LOG_FUNC_END; - LOG_UNIMPLEMENTED(); + UpdatedCryptoStruct.pXcDESKeyParity(pbKey, dwKeyLength); } // ****************************************************************** @@ -351,9 +666,9 @@ XBSYSAPI EXPORTNUM(347) xboxkrnl::VOID NTAPI xboxkrnl::XcKeyTable LOG_FUNC_ARG(dwCipher) LOG_FUNC_ARG_OUT(pbKeyTable) LOG_FUNC_ARG_TYPE(PBYTE, pbKey) - LOG_FUNC_END; + LOG_FUNC_END; - LOG_UNIMPLEMENTED(); + UpdatedCryptoStruct.pXcKeyTable(dwCipher, pbKeyTable, pbKey); } // ****************************************************************** @@ -374,9 +689,9 @@ XBSYSAPI EXPORTNUM(348) xboxkrnl::VOID NTAPI xboxkrnl::XcBlockCrypt LOG_FUNC_ARG_TYPE(PBYTE, pbInput) LOG_FUNC_ARG_TYPE(PBYTE, pbKeyTable) LOG_FUNC_ARG(dwOp) - LOG_FUNC_END; + LOG_FUNC_END; - LOG_UNIMPLEMENTED(); + UpdatedCryptoStruct.pXcBlockCrypt(dwCipher, pbOutput, pbInput, pbKeyTable, dwOp); } // ****************************************************************** @@ -401,9 +716,9 @@ XBSYSAPI EXPORTNUM(349) xboxkrnl::VOID NTAPI xboxkrnl::XcBlockCryptCBC LOG_FUNC_ARG_TYPE(PBYTE, pbKeyTable) LOG_FUNC_ARG(dwOp) LOG_FUNC_ARG_TYPE(PBYTE, pbFeedback) - LOG_FUNC_END; + LOG_FUNC_END; - LOG_UNIMPLEMENTED(); + UpdatedCryptoStruct.pXcBlockCryptCBC(dwCipher, dwInputLength, pbOutput, pbInput, pbKeyTable, dwOp, pbFeedback); } // ****************************************************************** @@ -418,30 +733,9 @@ XBSYSAPI EXPORTNUM(350) xboxkrnl::ULONG NTAPI xboxkrnl::XcCryptService LOG_FUNC_BEGIN LOG_FUNC_ARG(dwOp) LOG_FUNC_ARG(pArgs) - LOG_FUNC_END; + LOG_FUNC_END; - ULONG ret = 0; - - LOG_UNIMPLEMENTED(); + ULONG ret = UpdatedCryptoStruct.pXcCryptService(dwOp, pArgs); RETURN(ret); -} - -typedef PVOID PCRYPTO_VECTOR; - -// ****************************************************************** -// * 0x015F - XcUpdateCrypto() -// ****************************************************************** -XBSYSAPI EXPORTNUM(351) xboxkrnl::VOID NTAPI xboxkrnl::XcUpdateCrypto -( - IN PCRYPTO_VECTOR pNewVector, - OUT PCRYPTO_VECTOR pROMVector OPTIONAL -) -{ - LOG_FUNC_BEGIN - LOG_FUNC_ARG(pNewVector) - LOG_FUNC_ARG_OUT(pROMVector) - LOG_FUNC_END; - - LOG_UNIMPLEMENTED(); -} +} From a7daa7f00c7491670eac4ffa8baf13cbf45323a1 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Sat, 4 Aug 2018 15:46:17 +0200 Subject: [PATCH 0118/1000] Correct previous commit --- src/CxbxKrnl/EmuKrnlXc.cpp | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/src/CxbxKrnl/EmuKrnlXc.cpp b/src/CxbxKrnl/EmuKrnlXc.cpp index ee95b30ed..9a39311d3 100644 --- a/src/CxbxKrnl/EmuKrnlXc.cpp +++ b/src/CxbxKrnl/EmuKrnlXc.cpp @@ -307,25 +307,7 @@ const xboxkrnl::CRYPTO_VECTOR DefaultCryptoStruct = }; /* This struct contains the updated crypto functions which can be changed by the title with XcUpdateCrypto */ -xboxkrnl::CRYPTO_VECTOR UpdatedCryptoStruct = -{ - JumpedSHAInit, - JumpedSHAUpdate, - JumpedSHAFinal, - JumpedRC4Key, - JumpedRC4Crypt, - JumpedHMAC, - JumpedPKEncPublic, - JumpedPKDecPrivate, - JumpedPKGetKeyLen, - JumpedVerifyPKCS1Signature, - JumpedModExp, - JumpedDESKeyParity, - JumpedKeyTable, - JumpedBlockCrypt, - JumpedBlockCryptCBC, - JumpedCryptService -}; +xboxkrnl::CRYPTO_VECTOR UpdatedCryptoStruct = DefaultCryptoStruct; // ****************************************************************** // * 0x015F - XcUpdateCrypto() @@ -339,7 +321,7 @@ XBSYSAPI EXPORTNUM(351) xboxkrnl::VOID NTAPI xboxkrnl::XcUpdateCrypto LOG_FUNC_BEGIN LOG_FUNC_ARG(pNewVector) LOG_FUNC_ARG_OUT(pROMVector) - LOG_FUNC_END; + LOG_FUNC_END; // This function changes the default crypto function implementations with those supplied by the title (if not NULL) @@ -464,7 +446,7 @@ XBSYSAPI EXPORTNUM(337) xboxkrnl::VOID NTAPI xboxkrnl::XcSHAFinal LOG_FUNC_ARG_TYPE(PBYTE, pbDigest) LOG_FUNC_END; - UpdatedCryptoStruct.pXcSHAFinal(pbDigest, pbSHAContext); + UpdatedCryptoStruct.pXcSHAFinal(pbSHAContext, pbDigest); } // ****************************************************************** From 110090ff08ec9c6bdeea1845494880ecde60bc79 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Sun, 5 Aug 2018 14:37:13 +0200 Subject: [PATCH 0119/1000] Implemented XcDESKeyParity --- src/CxbxKrnl/EmuKrnlXc.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/CxbxKrnl/EmuKrnlXc.cpp b/src/CxbxKrnl/EmuKrnlXc.cpp index 9a39311d3..87fb81bd5 100644 --- a/src/CxbxKrnl/EmuKrnlXc.cpp +++ b/src/CxbxKrnl/EmuKrnlXc.cpp @@ -56,6 +56,10 @@ namespace NtDll }; +// Used by JumpedDESKeyParity +static const xboxkrnl::BYTE DESParityTable[] = { 0x00,0x01,0x01,0x02,0x01,0x02,0x02,0x03,0x01,0x02,0x02,0x03,0x02,0x03,0x03,0x04 }; + + // The following are the default implementations of the crypto functions xboxkrnl::VOID NTAPI JumpedSHAInit @@ -233,7 +237,15 @@ xboxkrnl::VOID NTAPI JumpedDESKeyParity xboxkrnl::ULONG dwKeyLength ) { - LOG_UNIMPLEMENTED(); + // This function sets the parity on the DES key to be odd + // Test case: Halo, Tenchu, dashboard, Splinter Cell 1 and 2, ... + + for (DWORD i = 0; i < dwKeyLength; i++) + { + if (!((DESParityTable[pbKey[i] >> 4] + DESParityTable[pbKey[i] & 0x0F]) % 2)) { + pbKey[i] = pbKey[i] ^ 0x01; + } + } } xboxkrnl::VOID NTAPI JumpedKeyTable From 07a05f0e52d55768ddda27fc78a30b36c14afbbe Mon Sep 17 00:00:00 2001 From: RadWolfie Date: Tue, 7 Aug 2018 02:30:07 -0500 Subject: [PATCH 0120/1000] Use settings ini file method (#1370) * Import SimpleIni module * Rename XBController to DInputController Since it's only about configure DirectInput support. * Append to previous 2 commits * Initialize Settings class * Append to previous commit * Properly use EmuXTL header instead of EmuShared * Move audio variables into setting class * Move video variables into Settings class * Append to previous commit * Move hack variables into Settings class * Append previous commit * Append to third previous commit * Move xbox controller port map to Settings class * Append to second previous commit * Move DirectInput Controller map to Settings class * Remove old XInput member variable * Append to second previous commit * Tiny Fixup * Remove Load/Save from EmuShared class * Move both GUI and emulate/core to Settings class * Oops, append to DirectInput controller's commit(s) * Fix spaces to tab plus remove useless extra spaces * Code format fixes * Fix EmuShared's Set____ function to include const type. Then "set" functions are supportive for both const and non-const variables. * Add Sync and GetDataLocation functions to Settings class * Move include filesystem into root header file. * Introduce Verify function in Settings class * Fix old bug for console remains open * Making some adjustments... * Append * Another fix for any output prints crash. * Add Delete function to Settings class Plus keep save's file path if has given one. * Fix LLE_USB to set into Settings class' member variable. * No longer rely on GUI's end to reset LLE flags for multi-xbe titles. * Simulate what GUI will do except in standalone kernel mode support. * Move m_StorageLocation into Settings class as central. Plus optimization for GetDataLocation function. * Update sentence... * Remove m_XbePath from EmuShared class. Since kernel process is launching by on its own without rely on GUI process. * Update copyright * Fix DirectInput config not responding message * Implement new feature: Bypass running as admin warning message * Rename Emulate Settings to Core Settings Plus move AllowAdminPrivilage option to core. * Add reserve space for Settings' structure to integrate into EmuShared * Ensure all reserves are set to 0 by default. * Append to "Rename Emulate Settings to Core Settings" commit * Fix rebase loss. * Fix kernel mode process's window screen * Correction: use bool for allowAdminPrivilege and add a save data * Few fixes for allowAdminPrivilege * Implement support to prevent tamper shared memory between GUI processes. NOTE: Kernel process will be using same shared memory since guiProcessID will remain as 0. * Various improvement * Use std library functions * Use single column spaces for align support on different tab size * Include failsafe if custom and file path string values are bad format Apparently ARRAYSIZE isn't define on other compilers. * Last ARRAYSIZE replacement plus buffer overflow protection * Replace WinAPI to std library's filesystem * Revert support for 2+ emulation process at same time. Emulation's graphic screen has corruption between both windows. Not even a wrapper to D3D9 will fix it. --- .gitmodules | 3 + build/win32/Cxbx.vcxproj | 23 +- build/win32/Cxbx.vcxproj.filters | 37 +- import/simpleini | 1 + resource/Cxbx.rc | 1 + src/Common/Settings.cpp | 715 ++++++++++++++++++ src/Common/Settings.hpp | 225 ++++++ ...{XBController.cpp => DInputController.cpp} | 294 ++----- .../{XBController.h => DInputController.h} | 40 +- src/Common/Win32/EmuShared.cpp | 34 +- src/Common/Win32/XBAudio.cpp | 117 --- src/Common/Win32/XBAudio.h | 93 --- src/Common/Win32/XBPortMapping.cpp | 136 +--- src/Common/Win32/XBPortMapping.h | 10 +- src/Common/Win32/XBVideo.cpp | 127 ---- src/Common/Win32/XBVideo.h | 107 --- src/Common/Xbe.cpp | 2 +- src/Cxbx.h | 9 + src/Cxbx/DlgAudioConfig.cpp | 32 +- src/Cxbx/DlgControllerConfig.cpp | 29 +- src/Cxbx/DlgVideoConfig.cpp | 47 +- src/Cxbx/DlgXboxControllerPortMapping.cpp | 12 +- src/Cxbx/ResCxbx.h | 3 +- src/Cxbx/WinMain.cpp | 90 ++- src/Cxbx/WndMain.cpp | 645 +++++----------- src/Cxbx/WndMain.h | 52 +- src/CxbxKrnl/CxbxKrnl.cpp | 58 +- src/CxbxKrnl/CxbxKrnl.h | 1 + src/CxbxKrnl/EmuD3D8.cpp | 66 +- src/CxbxKrnl/EmuDInput.cpp | 17 +- src/CxbxKrnl/EmuDSound.cpp | 7 +- src/CxbxKrnl/EmuDSoundInline.hpp | 6 +- src/CxbxKrnl/EmuKrnlHal.cpp | 7 +- src/CxbxKrnl/EmuShared.h | 158 ++-- src/CxbxKrnl/EmuXapi.cpp | 9 +- src/CxbxKrnl/HLEIntercept.cpp | 8 +- 36 files changed, 1602 insertions(+), 1619 deletions(-) create mode 160000 import/simpleini create mode 100644 src/Common/Settings.cpp create mode 100644 src/Common/Settings.hpp rename src/Common/Win32/{XBController.cpp => DInputController.cpp} (77%) rename src/Common/Win32/{XBController.h => DInputController.h} (89%) delete mode 100644 src/Common/Win32/XBAudio.cpp delete mode 100644 src/Common/Win32/XBAudio.h delete mode 100644 src/Common/Win32/XBVideo.cpp delete mode 100644 src/Common/Win32/XBVideo.h diff --git a/.gitmodules b/.gitmodules index bfb466842..4ac3615ce 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ [submodule "import/XbSymbolDatabase"] path = import/XbSymbolDatabase url = https://github.com/Cxbx-Reloaded/XbSymbolDatabase.git +[submodule "import/simpleini"] + path = import/simpleini + url = https://github.com/brofield/simpleini diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index b507409c6..c13f5345f 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -102,7 +102,7 @@ Disabled - ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\ + ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\;..\..\import\simpleini NOMINMAX;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -162,7 +162,7 @@ Disabled - ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\ + ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\;..\..\import\simpleini CXBX_USE_D3D9;NOMINMAX;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -223,7 +223,7 @@ MaxSpeed AnySuitable - ..\..\src;..\..\src\Common;..\..\src\Common\Win32\;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\src\Common\Win32;..\..\import\subhook\ + ..\..\src;..\..\src\Common;..\..\src\Common\Win32\;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\src\Common\Win32;..\..\import\subhook\;..\..\import\simpleini NOMINMAX;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreadedDLL @@ -284,9 +284,9 @@ + - @@ -352,9 +352,8 @@ - + - @@ -427,10 +426,10 @@ + - @@ -709,7 +708,7 @@ %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) @@ -725,14 +724,6 @@ %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - diff --git a/build/win32/Cxbx.vcxproj.filters b/build/win32/Cxbx.vcxproj.filters index 87dbdff57..d4d32750d 100644 --- a/build/win32/Cxbx.vcxproj.filters +++ b/build/win32/Cxbx.vcxproj.filters @@ -94,15 +94,9 @@ Shared - - Shared - Shared - - Shared - Emulator @@ -184,9 +178,6 @@ GUI - - Shared - Emulator @@ -317,6 +308,12 @@ Cross Platform + + Cross Platform + + + Shared + @@ -352,6 +349,9 @@ Kernel + + Shared + Shared @@ -367,15 +367,9 @@ Shared - - Shared - Shared - - Shared - Emulator @@ -472,9 +466,6 @@ GUI - - Shared - Emulator @@ -616,12 +607,16 @@ Shared\Input - - Shared - Cross Platform + + + Cross Platform + + + Shared + diff --git a/import/simpleini b/import/simpleini new file mode 160000 index 000000000..2af65fcc5 --- /dev/null +++ b/import/simpleini @@ -0,0 +1 @@ +Subproject commit 2af65fcc504f8242752755e836709762ef7ce062 diff --git a/resource/Cxbx.rc b/resource/Cxbx.rc index cefc315d6..aa4ee302c 100644 --- a/resource/Cxbx.rc +++ b/resource/Cxbx.rc @@ -499,6 +499,7 @@ BEGIN MENUITEM "Skip rdtsc patching", ID_HACKS_SKIPRDTSCPATCHING,MFT_STRING,MFS_ENABLED MENUITEM "Scale Xbox viewport to host (and back)", ID_HACKS_SCALEVIEWPORT,MFT_STRING,MFS_ENABLED END + MENUITEM "Allow Admin Privilege", ID_SETTINGS_ALLOWADMINPRIVILEGE,MFT_STRING,MFS_ENABLED MENUITEM MFT_SEPARATOR MENUITEM "Reset To Defaults", ID_SETTINGS_INITIALIZE,MFT_STRING,MFS_ENABLED END diff --git a/src/Common/Settings.cpp b/src/Common/Settings.cpp new file mode 100644 index 000000000..308c9ed89 --- /dev/null +++ b/src/Common/Settings.cpp @@ -0,0 +1,715 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * Cxbx->Common->Settings.cpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2018 wutno (#/g/punk - Rizon) +// * (c) 2018 RadWolfie +// * +// * All rights reserved +// * +// ****************************************************************** + +#include "Settings.hpp" +#include "CxbxKrnl/Emu.h" +#include "CxbxKrnl/EmuShared.h" + +// TODO: Implement Qt support when real CPU emulation is available. +#ifndef QT_VERSION // NOTE: Non-Qt will be using current directory for data +#include // For SHGetSpecialFolderPath and CSIDL_APPDATA +#else +static_assert(false, "Please implement support for cross-platform's user profile data."); + +#include // for create directory +#include // for check file existance +#include // for cross-platform's user profile support +#endif + +// NOTE: Update settings_version when add/edit/delete setting's structure. +const uint settings_version = 2; + +Settings* g_Settings = nullptr; + +#define szSettings_setup_error "ERROR: Either setup have a problem or do not have write permission to directory." +#define szSettings_init_error "ERROR: Unable to initialize Settings class." +#define szSettings_save_user_option_message "If you want to save your settings in current/portable directory,\nclick 'Yes'." \ + "\n\nIf you want to store your settings in user profile directory,\nclick 'No'." \ + "\n\nClicking cancel will abort Cxbx-Reloaded." + +#define szSettings_settings_file "/settings.ini" +#define szSettings_cxbx_reloaded_directory "/Cxbx-Reloaded" + +static const char* section_gui = "gui"; +static struct { + const char* CxbxDebugMode = "CxbxDebugMode"; + const char* CxbxDebugLogFile = "CxbxDebugLogFile"; + const char* RecentXbeFiles = "RecentXbeFiles"; + const char* DataStorageToggle = "DataStorageToggle"; + const char* DataCustomLocation = "DataCustomLocation"; +} sect_gui_keys; + +static const char* section_core = "core"; +static struct { + const char* FlagsLLE = "FlagsLLE"; + const char* KrnlDebugMode = "KrnlDebugMode"; + const char* KrnlDebugLogFile = "KrnlDebugLogFile"; + const char* AllowAdminPrivilege = "AllowAdminPrivilege"; +} sect_core_keys; + +static const char* section_video = "video"; +static struct { + const char* VideoResolution = "VideoResolution"; + const char* adapter = "adapter"; + const char* Direct3DDevice = "Direct3DDevice"; + const char* VSync = "VSync"; + const char* FullScreen = "FullScreen"; + const char* HardwareYUV = "HardwareYUV"; +} sect_video_keys; + +static const char* section_audio = "audio"; +static struct { + const char* adapter = "adapter"; + const char* adapter_value = "%08X %04X %04X %02X%02X %02X%02X%02X%02X%02X%02X"; + const char* codec_pcm = "PCM"; + const char* codec_xadpcm = "XADPCM"; + const char* codec_unknown = "UnknownCodec"; +} sect_audio_keys; + +static const char* section_controller_dinput = "controller-dinput"; +// All keys so far are dynamic +static struct { + const char* device_name = "DeviceName 0x%.02X"; + const char* object_name = "Object : \"%s\""; + const char* object_name_value = "%08X %08X %08X"; +} sect_controller_dinput_keys; + +static const char* section_controller_port = "controller-port"; +// All keys so far are dynamic +static struct { + const char* xbox_port_x_host_type = "XboxPort%dHostType"; + const char* xbox_port_x_host_port = "XboxPort%dHostPort"; +} sect_controller_port_keys; + +static const char* section_hack = "hack"; +static struct { + const char* DisablePixelShaders = "DisablePixelShaders"; + const char* UncapFramerate = "UncapFramerate"; + const char* UseAllCores = "UseAllCores"; + const char* SkipRdtscPatching = "SkipRdtscPatching"; + const char* ScaleViewPort = "ScaleViewPort"; + const char* DirectHostBackBufferAccess = "DirectHostBackBufferAccess"; +} sect_hack_keys; + +std::string GenerateCurrentDirectoryStr() +{ + // NOTE: There is no cross-platform support for getting file's current directory. + return std::filesystem::current_path().generic_string(); +} + +// NOTE: This function will be only have Qt support, std::filesystem doesn't have generic support. +// Plus appending support for each OSes are not worthy to work on. +std::string GenerateUserProfileDirectoryStr() +{ + // ======================================================== + // TODO: Use QT's QDir and QFile classes for cross-platform + // with QStandardPaths::GenericDataLocation for generic User Profile location. + // NOTE: LibRetro compile build will not have user profile option support. + // ======================================================== + char folderOption[MAX_PATH]; + std::string genDirectory; + // TODO: Use QDir and QStandardPaths::GenericDataLocation for get user profile directory to support cross-platform + BOOL bRet = SHGetSpecialFolderPathA(NULL, folderOption, CSIDL_APPDATA, TRUE); // NOTE: Windows only support + if (!bRet) { + return ""; + } + genDirectory = folderOption; + genDirectory.append(szSettings_cxbx_reloaded_directory); + + return genDirectory; +} + +bool Settings::Init() +{ + m_si.SetMultiKey(true); + + bool bRet = LoadUserConfig(); + + // Enter setup installer process + if (!bRet) { + + std::string saveFile; +#ifdef RETRO_API_VERSION // TODO: Change me to #ifndef QT_VERSION + // Can only have one option without Qt. + saveFile = GenerateCurrentDirectoryStr(); + saveFile.append(szSettings_settings_file); + +#else // Only support for Qt compile build. + int iRet = MessageBox(nullptr, szSettings_save_user_option_message, "Cxbx-Reloaded", MB_YESNOCANCEL | MB_ICONQUESTION); + + if (iRet == IDYES) { + saveFile = GenerateCurrentDirectoryStr(); + saveFile.append(szSettings_settings_file); + } + else if (iRet == IDNO){ + saveFile = GenerateUserProfileDirectoryStr(); + if (saveFile.size() == 0) { + return false; + } + + // Check if data directory exist. + bRet = std::filesystem::exists(saveFile); + if (!bRet) { + // Then try create data directory. + bRet = std::filesystem::create_directory(saveFile); + if (!bRet) { + // Unable to create a data directory + return false; + } + } + + saveFile.append(szSettings_settings_file); + } + else { + return false; + } +#endif + + bRet = Save(saveFile); + + // Check if saving a file is a success. + if (!bRet) { + MessageBox(nullptr, szSettings_setup_error, "Cxbx-Reloaded", MB_OK); + return false; + } + + // Final check if able to auto load settings file. + bRet = LoadUserConfig(); + } + return bRet; +} + +bool Settings::LoadUserConfig() +{ + std::string fileSearch = GenerateCurrentDirectoryStr(); + + fileSearch.append(szSettings_settings_file); + + // Check and see if file exist from portable, current, directory. + if (std::filesystem::exists(fileSearch) == false) { + + fileSearch = GenerateUserProfileDirectoryStr(); + if (fileSearch.size() == 0) { + return false; + } + fileSearch.append(szSettings_settings_file); + + // Check if user profile directory settings file exist + if (std::filesystem::exists(fileSearch) == false) { + return false; + } + } + + return LoadFile(fileSearch); +} + +bool Settings::LoadFile(std::string file_path) +{ + bool bRet; + const char* si_data; + int iStatus; + std::list si_list; + std::list::iterator si_list_iterator; + + SI_Error siError = m_si.LoadFile(file_path.c_str()); + + if (siError != SI_OK) { + return false; + } + m_file_path = file_path; + + // ==== GUI Begin =========== + + m_gui.CxbxDebugMode = (DebugMode)m_si.GetLongValue(section_gui, sect_gui_keys.CxbxDebugMode, /*Default=*/DM_NONE); + si_data = m_si.GetValue(section_gui, sect_gui_keys.CxbxDebugLogFile, /*Default=*/nullptr); + // Fallback to null string if value is empty or contain bigger string. + if (si_data == nullptr || std::strlen(si_data) >= MAX_PATH) { + m_gui.szCxbxDebugFile = ""; + } + else { + m_gui.szCxbxDebugFile = si_data; + } + + m_gui.DataStorageToggle = m_si.GetLongValue(section_gui, sect_gui_keys.DataStorageToggle, /*Default=*/CXBX_DATA_APPDATA); + si_data = m_si.GetValue(section_gui, sect_gui_keys.DataCustomLocation, /*Default=*/nullptr); + // Fallback to null string if value is empty or contain bigger string. + if (si_data == nullptr || std::strlen(si_data) >= MAX_PATH) { + m_gui.szCustomLocation = ""; + } + else { + m_gui.szCustomLocation = si_data; + } + + // GUI - Recent xbe file paths + uint index = 0; + uint list_max = std::size(m_gui.szRecentXbeFiles); + bRet = m_si.GetAllValues(section_gui, sect_gui_keys.RecentXbeFiles, si_list);/*Default=empty list*/ + if (bRet) { + si_list_iterator = si_list.begin(); + for (si_list_iterator; si_list_iterator != si_list.end(); si_list_iterator++) { + // Exit loop when list has reach the limit. + if (index == list_max) { + break; + } + // Do not accept any file path greater or equal to MAX_PATH + if (std::strlen(si_list_iterator->pItem) >= MAX_PATH) { + continue; + } + m_gui.szRecentXbeFiles[index] = si_list_iterator->pItem; + index++; + } + } + // Set all or remaining recent xbe file paths to null string + while (index < list_max) { + m_gui.szRecentXbeFiles[index] = ""; + index++; + } + + // ==== GUI End ============= + + // ==== Core Begin ========== + + m_core.FlagsLLE = m_si.GetLongValue(section_core, sect_core_keys.FlagsLLE, /*Default=*/LLE_NONE); + m_core.KrnlDebugMode = (DebugMode)m_si.GetLongValue(section_core, sect_core_keys.KrnlDebugMode, /*Default=*/DM_NONE); + si_data = m_si.GetValue(section_core, sect_core_keys.KrnlDebugLogFile, /*Default=*/nullptr); + // Fallback to null string if value is empty or contain bigger string. + if (si_data == nullptr || std::strlen(si_data) >= MAX_PATH) { + m_core.szKrnlDebug[0] = '\0'; + } + else { + std::strncpy(m_core.szKrnlDebug, si_data, MAX_PATH); + } + + m_core.allowAdminPrivilege = m_si.GetBoolValue(section_core, sect_core_keys.AllowAdminPrivilege, /*Default=*/false); + + // ==== Core End ============ + + // ==== Hack Begin ========== + + m_hacks.DisablePixelShaders = m_si.GetBoolValue(section_hack, sect_hack_keys.DisablePixelShaders, /*Default=*/false); + m_hacks.UncapFramerate = m_si.GetBoolValue(section_hack, sect_hack_keys.UncapFramerate, /*Default=*/false); + m_hacks.UseAllCores = m_si.GetBoolValue(section_hack, sect_hack_keys.UseAllCores, /*Default=*/false); + m_hacks.SkipRdtscPatching = m_si.GetBoolValue(section_hack, sect_hack_keys.SkipRdtscPatching, /*Default=*/false); + m_hacks.ScaleViewport = m_si.GetBoolValue(section_hack, sect_hack_keys.ScaleViewPort, /*Default=*/false); + m_hacks.DirectHostBackBufferAccess = m_si.GetBoolValue(section_hack, sect_hack_keys.DirectHostBackBufferAccess, /*Default=*/true); + + // ==== Hack End ============ + + // ==== Video Begin ========= + + // Video - Resolution config + si_data = m_si.GetValue(section_video, sect_video_keys.VideoResolution, /*Default=*/nullptr); + // Fallback to null string if value is empty or contain bigger string. + if (si_data == nullptr || std::strlen(si_data) >= std::size(m_video.szVideoResolution)) { + m_video.szVideoResolution[0] = '\0'; + } + else { + std::strncpy(m_video.szVideoResolution, si_data, std::size(m_video.szVideoResolution)); + } + + m_video.adapter = m_si.GetLongValue(section_video, sect_video_keys.adapter, /*Default=*/0); + m_video.direct3DDevice = m_si.GetLongValue(section_video, sect_video_keys.Direct3DDevice, /*Default=*/0); + m_video.bVSync = m_si.GetBoolValue(section_video, sect_video_keys.VSync, /*Default=*/false); + m_video.bFullScreen = m_si.GetBoolValue(section_video, sect_video_keys.FullScreen, /*Default=*/false); + m_video.bHardwareYUV = m_si.GetBoolValue(section_video, sect_video_keys.HardwareYUV, /*Default=*/false); + + // ==== Video End =========== + + // ==== Audio Begin ========= + + // Audio - Adapter config + si_data = m_si.GetValue(section_audio, sect_audio_keys.adapter, /*Default=*/nullptr); + if (si_data == nullptr) { + // Default to primary audio device + m_audio.adapterGUID = { 0 }; + } + else { + iStatus = std::sscanf(si_data, sect_audio_keys.adapter_value, + &m_audio.adapterGUID.Data1, &m_audio.adapterGUID.Data2, &m_audio.adapterGUID.Data3, + &m_audio.adapterGUID.Data4[0], &m_audio.adapterGUID.Data4[1], &m_audio.adapterGUID.Data4[2], &m_audio.adapterGUID.Data4[3], + &m_audio.adapterGUID.Data4[4], &m_audio.adapterGUID.Data4[5], &m_audio.adapterGUID.Data4[6], &m_audio.adapterGUID.Data4[7]); + + // Fallback to primary audio device if file contain invalid value. + if (iStatus != 11 /*= total arguments*/) { + m_audio.adapterGUID = { 0 }; + } + } + + m_audio.codec_pcm = m_si.GetBoolValue(section_audio, sect_audio_keys.codec_pcm, /*Default=*/true, nullptr); + m_audio.codec_xadpcm = m_si.GetBoolValue(section_audio, sect_audio_keys.codec_xadpcm, /*Default=*/true, nullptr); + m_audio.codec_unknown = m_si.GetBoolValue(section_audio, sect_audio_keys.codec_unknown, /*Default=*/true, nullptr); + + // ==== Audio End =========== + + // ==== Controller Begin ==== + + int v = 0; + char szKeyName[64]; + + // ****************************************************************** + // * Load Device Names + // ****************************************************************** + for (v = 0; v < XBCTRL_MAX_DEVICES; v++) { + std::sprintf(szKeyName, sect_controller_dinput_keys.device_name, v); + si_data = m_si.GetValue(section_controller_dinput, szKeyName, /*Default=*/nullptr); + + // Fallback to null string if value is empty or contain bigger string. + if (si_data == nullptr || std::strlen(si_data) >= MAX_PATH) { + // default is a null string + m_controller_dinput.DeviceName[v][0] = '\0'; + } + else { + std::strncpy(m_controller_dinput.DeviceName[v], si_data, MAX_PATH); + } + } + + // ****************************************************************** + // * Load Object Configuration + // ****************************************************************** + for (v = 0; vSetCoreSettings(&m_core); + + // register Video settings + g_EmuShared->SetVideoSettings(&m_video); + + // register Audio settings + g_EmuShared->SetAudioSettings(&m_audio); + + // register Controller settings + g_EmuShared->SetControllerDInputSettings(&m_controller_dinput); + g_EmuShared->SetControllerPortSettings(&m_controller_port); + + // register Hacks settings + g_EmuShared->SetHackSettings(&m_hacks); + + // register data location setting + g_EmuShared->SetStorageLocation(GetDataLocation().c_str()); +} + +void Settings::Verify() +{ + // Prevent using an incorrect path from the registry if the debug folders have been moved + char szDebugPath[MAX_PATH]; + char szDebugName[MAX_PATH]; + + if (m_gui.CxbxDebugMode == DM_FILE) { + + if(m_gui.szCxbxDebugFile.size() == 0) { + m_gui.CxbxDebugMode = DM_NONE; + } + else { + std::strcpy(szDebugName, strrchr(m_gui.szCxbxDebugFile.c_str(), '\\')); + + if(m_gui.szCxbxDebugFile.size() < std::strlen(szDebugName)) { + m_gui.szCxbxDebugFile = ""; + m_gui.CxbxDebugMode = DM_NONE; + } + else { + std::strncpy(szDebugPath, m_gui.szCxbxDebugFile.c_str(), m_gui.szCxbxDebugFile.size() - std::strlen(szDebugName)); + + if(std::filesystem::exists(szDebugPath) == false) { + m_gui.szCxbxDebugFile = ""; + m_gui.CxbxDebugMode = DM_NONE; + } + } + } + } + + if (m_core.KrnlDebugMode == DM_FILE) { + + if(std::strlen(m_core.szKrnlDebug) == 0) { + m_core.KrnlDebugMode = DM_NONE; + } + else { + std::strcpy(szDebugName, strrchr(m_core.szKrnlDebug, '\\')); + + if(std::strlen(m_core.szKrnlDebug) < std::strlen(szDebugName)) { + memset(m_core.szKrnlDebug, '\0', MAX_PATH); + m_core.KrnlDebugMode = DM_NONE; + } + else { + std::strncpy(szDebugPath, m_core.szKrnlDebug, std::strlen(m_core.szKrnlDebug) - std::strlen(szDebugName)); + + if(std::filesystem::exists(szDebugPath) == false) { + memset(m_core.szKrnlDebug, '\0', MAX_PATH); + m_core.KrnlDebugMode = DM_NONE; + } + } + } + } +} + +std::string Settings::GetDataLocation() +{ + + // Optimization purpose for not require to re-process when toggle state has not changed. + if (m_current_DataStorageToggle == m_gui.DataStorageToggle) { + return m_current_data_location; + } + + switch (m_gui.DataStorageToggle) { + default: +#ifdef RETRO_API_VERSION // TODO: Change me to #ifndef QT_VERSION + + m_gui.DataStorageToggle = CXBX_DATA_CURDIR; + +#else // Only support for Qt compile build. + + m_gui.DataStorageToggle = CXBX_DATA_APPDATA; + // If unknown value, default to CXBX_DATA_APPDATA (below, don't use break) + + case CXBX_DATA_APPDATA: + m_current_data_location = GenerateUserProfileDirectoryStr(); + break; +#endif + + case CXBX_DATA_CURDIR: + m_current_data_location = GenerateCurrentDirectoryStr(); + break; + + case CXBX_DATA_CUSTOM: + m_current_data_location = m_gui.szCustomLocation; + break; + } + m_current_DataStorageToggle = m_gui.DataStorageToggle; + + return m_current_data_location; +} + +// ****************************************************************** +// * Input Device Name Lookup Table +// ****************************************************************** +const char *Settings::s_controller_dinput::XboxControllerObjectNameLookup[XBCTRL_OBJECT_COUNT] = +{ + // ****************************************************************** + // * Analog Axis + // ****************************************************************** + "LThumbPosX", "LThumbNegX", "LThumbPosY", "LThumbNegY", + "RThumbPosX", "RThumbNegX", "RThumbPosY", "RThumbNegY", + + // ****************************************************************** + // * Analog Buttons + // ****************************************************************** + "A", "B", "X", "Y", "Black", "White", "LTrigger", "RTrigger", + + // ****************************************************************** + // * Digital Buttons + // ****************************************************************** + "DPadUp", "DPadDown", "DPadLeft", "DPadRight", + "Back", "Start", "LThumb", "RThumb" +}; diff --git a/src/Common/Settings.hpp b/src/Common/Settings.hpp new file mode 100644 index 000000000..20b22327d --- /dev/null +++ b/src/Common/Settings.hpp @@ -0,0 +1,225 @@ +// ****************************************************************** +// * +// * .,-::::: .,:: .::::::::. .,:: .: +// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; +// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' +// * $$$ Y$$$P $$""""Y$$ Y$$$P +// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, +// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, +// * +// * Cxbx->Common->Settings.hpp +// * +// * This file is part of the Cxbx project. +// * +// * Cxbx and Cxbe are free software; you can redistribute them +// * and/or modify them under the terms of the GNU General Public +// * License as published by the Free Software Foundation; either +// * version 2 of the license, or (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have recieved a copy of the GNU General Public License +// * along with this program; see the file COPYING. +// * If not, write to the Free Software Foundation, Inc., +// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. +// * +// * (c) 2002-2003 Aaron Robinson +// * (c) 2017-2018 RadWolfie +// * +// * All rights reserved +// * +// ****************************************************************** +#ifndef SETTINGS_HPP +#define SETTINGS_HPP +#include "Cxbx.h" + +#include "SimpleIni.h" +#include + +#define szSettings_alloc_error "ERROR: Unable to allocate Settings class." + +// Cxbx-Reloaded's data storage location. +typedef enum _CXBX_DATA { + CXBX_DATA_APPDATA = 0, + CXBX_DATA_CURDIR = 1, + CXBX_DATA_CUSTOM = 2, +} CXBX_DATA; + +// ****************************************************************** +// * Xbox Controller Object IDs +// ****************************************************************** +enum XBCtrlObject +{ + // ****************************************************************** + // * Analog Axis + // ****************************************************************** + XBCTRL_OBJECT_LTHUMBPOSX = 0, + XBCTRL_OBJECT_LTHUMBNEGX, + XBCTRL_OBJECT_LTHUMBPOSY, + XBCTRL_OBJECT_LTHUMBNEGY, + XBCTRL_OBJECT_RTHUMBPOSX, + XBCTRL_OBJECT_RTHUMBNEGX, + XBCTRL_OBJECT_RTHUMBPOSY, + XBCTRL_OBJECT_RTHUMBNEGY, + // ****************************************************************** + // * Analog Buttons + // ****************************************************************** + XBCTRL_OBJECT_A, + XBCTRL_OBJECT_B, + XBCTRL_OBJECT_X, + XBCTRL_OBJECT_Y, + XBCTRL_OBJECT_BLACK, + XBCTRL_OBJECT_WHITE, + XBCTRL_OBJECT_LTRIGGER, + XBCTRL_OBJECT_RTRIGGER, + // ****************************************************************** + // * Digital Buttons + // ****************************************************************** + XBCTRL_OBJECT_DPADUP, + XBCTRL_OBJECT_DPADDOWN, + XBCTRL_OBJECT_DPADLEFT, + XBCTRL_OBJECT_DPADRIGHT, + XBCTRL_OBJECT_BACK, + XBCTRL_OBJECT_START, + XBCTRL_OBJECT_LTHUMB, + XBCTRL_OBJECT_RTHUMB, + // ****************************************************************** + // * Total number of components + // ****************************************************************** + XBCTRL_OBJECT_COUNT +}; + +// ****************************************************************** +// * Maximum number of devices allowed +// ****************************************************************** +#define XBCTRL_MAX_DEVICES XBCTRL_OBJECT_COUNT + +#define XBCTRL_MAX_GAMEPAD_PORTS 4 + +// ****************************************************************** +// * Xbox Controller Object Config +// ****************************************************************** +struct XBCtrlObjectCfg +{ + int dwDevice; // offset into m_InputDevice + int dwInfo; // extended information, depending on dwFlags + int dwFlags; // flags explaining the data format +}; + +enum { + LLE_NONE = 0, + LLE_APU = 1 << 0, + LLE_GPU = 1 << 1, + LLE_JIT = 1 << 2, + LLE_USB = 1 << 3, +}; + +class Settings +{ +public: + bool Init(); + bool LoadUserConfig(); + bool LoadFile(std::string file_path); + bool Save(std::string file_path = ""); + void Delete(); + void SyncToEmulator(); + void Verify(); + std::string GetDataLocation(); + + // GUI settings + struct s_gui { + DebugMode CxbxDebugMode; + std::string szCxbxDebugFile; + std::string szRecentXbeFiles[10]; + uint DataStorageToggle; + std::string szCustomLocation = ""; + } m_gui; + + // Core settings + struct s_core { + uint FlagsLLE; + DebugMode KrnlDebugMode; + char szKrnlDebug[MAX_PATH] = ""; + char szStorageLocation[MAX_PATH] = ""; + bool allowAdminPrivilege; + bool Reserved2 = 0; + bool Reserved3 = 0; + bool Reserved4 = 0; + int Reserved99[10] = { 0 }; + } m_core; + + // Video settings + struct s_video { + char szVideoResolution[100] = ""; + uint adapter; + uint direct3DDevice; + bool bVSync; + bool bFullScreen; + bool bHardwareYUV; + bool Reserved4 = 0; + int Reserved99[10] = { 0 }; + } m_video; + + // Audio settings + struct s_audio { + GUID adapterGUID; + bool codec_pcm ; + bool codec_xadpcm; + bool codec_unknown; + bool Reserved4 = 0; + int Reserved99[14] = { 0 }; + } m_audio; + + // Controller settings + struct s_controller_dinput { + + // ****************************************************************** + // * Input Device Name Lookup Table + // ****************************************************************** + static const char *XboxControllerObjectNameLookup[XBCTRL_OBJECT_COUNT]; + + // ****************************************************************** + // * Device Names + // ****************************************************************** + char DeviceName[XBCTRL_MAX_DEVICES][MAX_PATH]; + + // ****************************************************************** + // * Object Configuration + // ****************************************************************** + XBCtrlObjectCfg ObjectConfig[XBCTRL_OBJECT_COUNT]; + + } m_controller_dinput; + + struct s_controller_port { + uint XboxPortMapHostType[XBCTRL_MAX_GAMEPAD_PORTS] = { 1, 1, 1, 1 }; + uint XboxPortMapHostPort[XBCTRL_MAX_GAMEPAD_PORTS] = { 0, 1, 2, 3 }; + } m_controller_port; + + // Hack settings + struct s_hack { + bool DisablePixelShaders; + bool UncapFramerate; + bool UseAllCores; + bool SkipRdtscPatching; + bool ScaleViewport; + bool DirectHostBackBufferAccess; + bool Reserved7 = 0; + bool Reserved8 = 0; + int Reserved99[8] = { 0 }; + } m_hacks; + +private: + std::string m_file_path = ""; + CSimpleIniA m_si; + std::string m_current_data_location; + uint m_current_DataStorageToggle = -1; +}; + +// Settings manager +extern Settings* g_Settings; +extern const uint settings_version; + +#endif diff --git a/src/Common/Win32/XBController.cpp b/src/Common/Win32/DInputController.cpp similarity index 77% rename from src/Common/Win32/XBController.cpp rename to src/Common/Win32/DInputController.cpp index 402ae7639..0cd0e11f5 100644 --- a/src/Common/Win32/XBController.cpp +++ b/src/Common/Win32/DInputController.cpp @@ -9,7 +9,7 @@ // * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, // * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, // * -// * Cxbx->Win32->XBController.cpp +// * Cxbx->Win32->DInputController.cpp // * // * This file is part of the Cxbx project. // * @@ -33,7 +33,7 @@ // * All rights reserved // * // ****************************************************************** -#include "XBController.h" +#include "DInputController.h" #include "CxbxKrnl/EmuShared.h" #include "CxbxKrnl/EmuXTL.h" @@ -42,28 +42,29 @@ #define FIELD_OFFSET(type,field) ((ULONG)&(((type *)0)->field)) // ****************************************************************** -// * func: XBController::XBController +// * func: DInputController::DInputController // ****************************************************************** -XBController::XBController() +DInputController::DInputController() { m_CurrentState = XBCTRL_STATE_NONE; int v=0; - for(v=0;v=m_dwInputDeviceCount;v--) - m_DeviceName[v][0] = '\0'; + m_settings.DeviceName[v][0] = '\0'; for(v=0;v= m_dwInputDeviceCount) + if(m_settings.ObjectConfig[v].dwDevice >= m_dwInputDeviceCount) { - printf("Warning: Device Mapped to %s was not found!\n", m_DeviceNameLookup[v]); - m_ObjectConfig[v].dwDevice = -1; + printf("Warning: Device Mapped to %s was not found!\n", Settings::s_controller_dinput::XboxControllerObjectNameLookup[v]); + m_settings.ObjectConfig[v].dwDevice = -1; } } @@ -474,9 +347,9 @@ void XBController::ListenBegin(HWND hwnd) } // ****************************************************************** -// * func: XBController::ListenPoll +// * func: DInputController::ListenPoll // ****************************************************************** -void XBController::ListenPoll(XTL::X_XINPUT_STATE *Controller) +void DInputController::ListenPoll(XTL::X_XINPUT_STATE *Controller) { if(Controller == NULL) return; @@ -504,9 +377,9 @@ void XBController::ListenPoll(XTL::X_XINPUT_STATE *Controller) // ****************************************************************** for(int v=0;v=0;v--) { @@ -921,14 +794,14 @@ void XBController::DInputCleanup() } // ****************************************************************** -// * func: XBController::Map +// * func: DInputController::Map // ****************************************************************** -void XBController::Map(XBCtrlObject object, const char *szDeviceName, int dwInfo, int dwFlags) +void DInputController::Map(XBCtrlObject object, const char *szDeviceName, int dwInfo, int dwFlags) { // Initialize InputMapping instance - m_ObjectConfig[object].dwDevice = Insert(szDeviceName); - m_ObjectConfig[object].dwInfo = dwInfo; - m_ObjectConfig[object].dwFlags = dwFlags; + m_settings.ObjectConfig[object].dwDevice = Insert(szDeviceName); + m_settings.ObjectConfig[object].dwInfo = dwInfo; + m_settings.ObjectConfig[object].dwFlags = dwFlags; // Purge unused device slots for(int v=0;vtszInstanceName)) return DIENUM_CONTINUE; @@ -1040,9 +913,9 @@ BOOL XBController::EnumGameCtrlCallback(XTL::LPCDIDEVICEINSTANCE lpddi) } // ****************************************************************** -// * func: XBController::EnumObjectsCallback +// * func: DInputController::EnumObjectsCallback // ****************************************************************** -BOOL XBController::EnumObjectsCallback(XTL::LPCDIDEVICEOBJECTINSTANCE lpddoi) +BOOL DInputController::EnumObjectsCallback(XTL::LPCDIDEVICEOBJECTINSTANCE lpddoi) { if(lpddoi->dwType & DIDFT_AXIS) { @@ -1095,7 +968,7 @@ BOOL XBController::EnumObjectsCallback(XTL::LPCDIDEVICEOBJECTINSTANCE lpddoi) // ****************************************************************** BOOL CALLBACK WrapEnumGameCtrlCallback(XTL::LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef) { - XBController *context = (XBController*)pvRef; + DInputController *context = (DInputController*)pvRef; return context->EnumGameCtrlCallback(lpddi); } @@ -1105,30 +978,7 @@ BOOL CALLBACK WrapEnumGameCtrlCallback(XTL::LPCDIDEVICEINSTANCE lpddi, LPVOID pv // ****************************************************************** BOOL CALLBACK WrapEnumObjectsCallback(XTL::LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef) { - XBController *context = (XBController*)pvRef; + DInputController *context = (DInputController*)pvRef; return context->EnumObjectsCallback(lpddoi); } - -// ****************************************************************** -// * Input Device Name Lookup Table -// ****************************************************************** -const char *XBController::m_DeviceNameLookup[XBCTRL_OBJECT_COUNT] = -{ - // ****************************************************************** - // * Analog Axis - // ****************************************************************** - "LThumbPosX", "LThumbNegX", "LThumbPosY", "LThumbNegY", - "RThumbPosX", "RThumbNegX", "RThumbPosY", "RThumbNegY", - - // ****************************************************************** - // * Analog Buttons - // ****************************************************************** - "A", "B", "X", "Y", "Black", "White", "LTrigger", "RTrigger", - - // ****************************************************************** - // * Digital Buttons - // ****************************************************************** - "DPadUp", "DPadDown", "DPadLeft", "DPadRight", - "Back", "Start", "LThumb", "RThumb", -}; diff --git a/src/Common/Win32/XBController.h b/src/Common/Win32/DInputController.h similarity index 89% rename from src/Common/Win32/XBController.h rename to src/Common/Win32/DInputController.h index 1758effd4..2ea794ae4 100644 --- a/src/Common/Win32/XBController.h +++ b/src/Common/Win32/DInputController.h @@ -7,7 +7,7 @@ // * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, // * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, // * -// * Cxbx->Win32->Cxbx->XBController.h +// * Cxbx->Win32->Cxbx->DInputController.h // * // * This file is part of the Cxbx project. // * @@ -31,8 +31,8 @@ // * All rights reserved // * // ****************************************************************** -#ifndef XBCONTROLLER_H -#define XBCONTROLLER_H +#ifndef DINPUTCONTROLLER_H +#define DINPUTCONTROLLER_H #include "Cxbx.h" #include "Common/Error.h" @@ -43,7 +43,8 @@ #include #include "CxbxKrnl/EmuXTL.h" - +#include "Common/Settings.hpp" +/* // ****************************************************************** // * Xbox Controller Object IDs // ****************************************************************** @@ -101,25 +102,19 @@ struct XBCtrlObjectCfg int dwDevice; // offset into m_InputDevice int dwInfo; // extended information, depending on dwFlags int dwFlags; // flags explaining the data format -}; +};*/ // ****************************************************************** -// * class: XBController +// * class: DInputController // ****************************************************************** -class XBController : public Error +class DInputController : public Error { public: // ****************************************************************** // * Initialization // ****************************************************************** - XBController(); - ~XBController(); - - // ****************************************************************** - // * Registry Load/Save - // ****************************************************************** - void Load(const char *szRegistryKey); - void Save(const char *szRegistryKey); + DInputController(); + ~DInputController(); // ****************************************************************** // * Configuration @@ -147,9 +142,9 @@ class XBController : public Error bool DeviceIsUsed(const char *szDeviceName); // ****************************************************************** - // * Input Device Name Lookup Table + // * Settings for DirectInput Device(s) // ****************************************************************** - static const char *m_DeviceNameLookup[XBCTRL_OBJECT_COUNT]; + Settings::s_controller_dinput m_settings; private: // ****************************************************************** @@ -179,16 +174,6 @@ class XBController : public Error friend BOOL CALLBACK WrapEnumGameCtrlCallback(XTL::LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef); friend BOOL CALLBACK WrapEnumObjectsCallback(XTL::LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef); - // ****************************************************************** - // * Device Names - // ****************************************************************** - char m_DeviceName[XBCTRL_MAX_DEVICES][260]; - - // ****************************************************************** - // * Object Configuration - // ****************************************************************** - XBCtrlObjectCfg m_ObjectConfig[XBCTRL_OBJECT_COUNT]; - // ****************************************************************** // * DirectInput // ****************************************************************** @@ -220,7 +205,6 @@ class XBController : public Error // ****************************************************************** int m_dwInputDeviceCount; int m_dwCurObject; - }; // ****************************************************************** diff --git a/src/Common/Win32/EmuShared.cpp b/src/Common/Win32/EmuShared.cpp index 6868de5a3..d28c1a3bb 100644 --- a/src/Common/Win32/EmuShared.cpp +++ b/src/Common/Win32/EmuShared.cpp @@ -56,7 +56,7 @@ HANDLE hMapObject = NULL; // ****************************************************************** // * func: EmuShared::EmuSharedInit // ****************************************************************** -void EmuShared::Init() +void EmuShared::Init(DWORD guiProcessID) { // ****************************************************************** // * Ensure initialization only occurs once @@ -73,6 +73,8 @@ void EmuShared::Init() // * Create the shared memory "file" // ****************************************************************** { + // NOTE: guiProcessID support is not available due to 2+ emulation is causing problem with graphic screen. + std::string emuSharedStr = "Local\\EmuShared-s" + std::to_string(settings_version);// +"-p" + std::to_string(guiProcessID); hMapObject = CreateFileMapping ( INVALID_HANDLE_VALUE, // Paging file @@ -80,7 +82,7 @@ void EmuShared::Init() PAGE_READWRITE, // read/write access 0, // size: high 32 bits sizeof(EmuShared), // size: low 32 bits - "Local\\EmuShared" // name of map object + emuSharedStr.c_str() // name of map object ); if(hMapObject == NULL) @@ -110,8 +112,9 @@ void EmuShared::Init() // ****************************************************************** // * Executed only on first initialization of shared memory // ****************************************************************** - if(bRequireConstruction) + if (bRequireConstruction) { g_EmuShared->EmuShared::EmuShared(); + } g_EmuShared->m_RefCount++; } @@ -135,10 +138,16 @@ void EmuShared::Cleanup() // ****************************************************************** EmuShared::EmuShared() { - Load(); m_bDebugging = false; - m_bEmulating = false; + m_bEmulating_status = false; m_bFirstLaunch = false; + + // Reserve space (default to 0) + m_bReserved1 = false; + m_bReserved2 = false; + m_bReserved3 = false; + m_bReserved4 = false; + memset(m_Reserved99, 0, sizeof(m_Reserved99)); } // ****************************************************************** @@ -146,19 +155,4 @@ EmuShared::EmuShared() // ****************************************************************** EmuShared::~EmuShared() { - Save(); -} - -void EmuShared::Load() -{ - m_XBController.Load("Software\\Cxbx-Reloaded\\XBController"); - m_XBVideo.Load("Software\\Cxbx-Reloaded\\XBVideo"); - m_XBAudio.Load("Software\\Cxbx-Reloaded\\XBAudio"); -} - -void EmuShared::Save() -{ - m_XBController.Save("Software\\Cxbx-Reloaded\\XBController"); - m_XBVideo.Save("Software\\Cxbx-Reloaded\\XBVideo"); - m_XBAudio.Save("Software\\Cxbx-Reloaded\\XBAudio"); } diff --git a/src/Common/Win32/XBAudio.cpp b/src/Common/Win32/XBAudio.cpp deleted file mode 100644 index 31b2df565..000000000 --- a/src/Common/Win32/XBAudio.cpp +++ /dev/null @@ -1,117 +0,0 @@ -// This is an open source non-commercial project. Dear PVS-Studio, please check it. -// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com -// ****************************************************************** -// * -// * .,-::::: .,:: .::::::::. .,:: .: -// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; -// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' -// * $$$ Y$$$P $$""""Y$$ Y$$$P -// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, -// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, -// * -// * Cxbx->Common->Win32->XBAudio.cpp -// * -// * This file is part of the Cxbx project. -// * -// * Cxbx and Cxbe are free software; you can redistribute them -// * and/or modify them under the terms of the GNU General Public -// * License as published by the Free Software Foundation; either -// * version 2 of the license, or (at your option) any later version. -// * -// * This program is distributed in the hope that it will be useful, -// * but WITHOUT ANY WARRANTY; without even the implied warranty of -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// * GNU General Public License for more details. -// * -// * You should have recieved a copy of the GNU General Public License -// * along with this program; see the file COPYING. -// * If not, write to the Free Software Foundation, Inc., -// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. -// * -// * (c) 2017 RadWolfie -// * -// * All rights reserved -// * -// ****************************************************************** -#include "XBAudio.h" - -#include - -// ****************************************************************** -// * func: XBAudio::XBAudio -// ****************************************************************** -XBAudio::XBAudio() : m_bPCM(true), m_bXADPCM(true), m_bUnknownCodec(true) -{ - m_binAudioAdapter = { 0 }; -} - -// ****************************************************************** -// * func: XBAudio::~XBAudio -// ****************************************************************** -XBAudio::~XBAudio() -{ -} - -// ****************************************************************** -// * func: XBAudio::Load -// ****************************************************************** -void XBAudio::Load(const char *szRegistryKey) -{ - // ****************************************************************** - // * Load Configuration from Registry - // ****************************************************************** - { - DWORD dwDisposition, dwType, dwSize; - HKEY hKey; - - if(RegCreateKeyEx(HKEY_CURRENT_USER, szRegistryKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) - { - - dwType = REG_DWORD; dwSize = sizeof(m_binAudioAdapter); - RegQueryValueEx(hKey, "AudioAdapter", NULL, &dwType, (PBYTE)&m_binAudioAdapter, &dwSize); - - dwType = REG_DWORD; dwSize = sizeof(m_bPCM); - RegQueryValueEx(hKey, "PCM", NULL, &dwType, (PBYTE)&m_bPCM, &dwSize); - - dwType = REG_DWORD; dwSize = sizeof(m_bXADPCM); - RegQueryValueEx(hKey, "XADPCM", NULL, &dwType, (PBYTE)&m_bXADPCM, &dwSize); - - dwType = REG_DWORD; dwSize = sizeof(m_bUnknownCodec); - RegQueryValueEx(hKey, "UnknownCodec", NULL, &dwType, (PBYTE)&m_bUnknownCodec, &dwSize); - - RegCloseKey(hKey); - } - } -} - -// ****************************************************************** -// * func: XBAudio::Save -// ****************************************************************** -void XBAudio::Save(const char *szRegistryKey) -{ - // ****************************************************************** - // * Save Configuration to Registry - // ****************************************************************** - if (g_SaveOnExit) { - DWORD dwDisposition, dwType, dwSize; - HKEY hKey; - - if(RegCreateKeyEx(HKEY_CURRENT_USER, szRegistryKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) - { - - dwType = REG_BINARY; dwSize = sizeof(m_binAudioAdapter); - RegSetValueEx(hKey, "AudioAdapter", 0, dwType, (PBYTE)&m_binAudioAdapter, dwSize); - - dwType = REG_DWORD; dwSize = sizeof(m_bPCM); - RegSetValueEx(hKey, "PCM", 0, dwType, (PBYTE)&m_bPCM, dwSize); - - dwType = REG_DWORD; dwSize = sizeof(m_bXADPCM); - RegSetValueEx(hKey, "XADPCM", 0, dwType, (PBYTE)&m_bXADPCM, dwSize); - - dwType = REG_DWORD; dwSize = sizeof(m_bUnknownCodec); - RegSetValueEx(hKey, "UnknownCodec", 0, dwType, (PBYTE)&m_bUnknownCodec, dwSize); - - RegCloseKey(hKey); - } - } -} diff --git a/src/Common/Win32/XBAudio.h b/src/Common/Win32/XBAudio.h deleted file mode 100644 index d4d28436c..000000000 --- a/src/Common/Win32/XBAudio.h +++ /dev/null @@ -1,93 +0,0 @@ -// ****************************************************************** -// * -// * .,-::::: .,:: .::::::::. .,:: .: -// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; -// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' -// * $$$ Y$$$P $$""""Y$$ Y$$$P -// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, -// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, -// * -// * Cxbx->Common->Win32->Cxbx->XBAudio.h -// * -// * This file is part of the Cxbx project. -// * -// * Cxbx and Cxbe are free software; you can redistribute them -// * and/or modify them under the terms of the GNU General Public -// * License as published by the Free Software Foundation; either -// * version 2 of the license, or (at your option) any later version. -// * -// * This program is distributed in the hope that it will be useful, -// * but WITHOUT ANY WARRANTY; without even the implied warranty of -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// * GNU General Public License for more details. -// * -// * You should have recieved a copy of the GNU General Public License -// * along with this program; see the file COPYING. -// * If not, write to the Free Software Foundation, Inc., -// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. -// * -// * (c) 2017 RadWolfie -// * -// * All rights reserved -// * -// ****************************************************************** -#ifndef XBAUDIO_H -#define XBAUDIO_H - -#include "Cxbx.h" -#include "Common/Error.h" -#include "Mutex.h" - -// ****************************************************************** -// * class: XBAudio -// ****************************************************************** -class XBAudio : public Error -{ - public: - // ****************************************************************** - // * Initialization - // ****************************************************************** - XBAudio(); - ~XBAudio(); - - // ****************************************************************** - // * Registry Load/Save - // ****************************************************************** - void Load(const char *szRegistryKey); - void Save(const char *szRegistryKey); - - // ****************************************************************** - // * SetAudioAdapter - // ****************************************************************** - void SetAudioAdapter(GUID binAudioAdapter) { m_binAudioAdapter = binAudioAdapter; } - GUID GetAudioAdapter() const { return m_binAudioAdapter; } - - // ****************************************************************** - // * PCM Toggling - // ****************************************************************** - void SetPCM(BOOL bPCM) { m_bPCM = bPCM; } - BOOL GetPCM() const { return m_bPCM; } - - // ****************************************************************** - // * XADPCM Toggling - // ****************************************************************** - void SetXADPCM(BOOL bXADPCM) { m_bXADPCM = bXADPCM; } - BOOL GetXADPCM() const { return m_bXADPCM; } - - // ****************************************************************** - // * Unknown Codec Toggling - // ****************************************************************** - void SetUnknownCodec(BOOL bUnknownCodec) { m_bUnknownCodec = bUnknownCodec; } - BOOL GetUnknownCodec() const { return m_bUnknownCodec; } - - private: - // ****************************************************************** - // * Configuration - // ****************************************************************** - GUID m_binAudioAdapter; - BOOL m_bPCM; - BOOL m_bXADPCM; - BOOL m_bUnknownCodec; -}; - -#endif diff --git a/src/Common/Win32/XBPortMapping.cpp b/src/Common/Win32/XBPortMapping.cpp index 27106ac77..282409dc1 100644 --- a/src/Common/Win32/XBPortMapping.cpp +++ b/src/Common/Win32/XBPortMapping.cpp @@ -45,132 +45,22 @@ namespace xboxkrnl }; #include -//#include "CxbxKrnl.h" -//#include "Logging.h" -//#include "Emu.h" -//#include "EmuKrnl.h" // For DefaultLaunchDataPage -//#include "EmuFile.h" -//#include "EmuFS.h" -//#include "EmuShared.h" -//#include "HLEIntercept.h" -//#include "CxbxVSBC/CxbxVSBC.h" -//#include "Windef.h" -//#include +#include "CxbxKrnl/EmuShared.h" +#include "Common/Settings.hpp" +static Settings::s_controller_port g_ControllerPortMap; -DWORD g_XboxPortMapHostType[] = { 1,1,1,1 }; -DWORD g_XboxPortMapHostPort[] = { 0,1,2,3 }; - -// XInputSetState status waiters - -void XBPortMappingLoad(const char *szRegistryKey) +void XBPortMappingSet(Settings::s_controller_port &controller_port_settings) { - { - DWORD dwDisposition, dwType, dwSize; - HKEY hKey; - - if (RegCreateKeyEx(HKEY_CURRENT_USER, szRegistryKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) - { - dwType = REG_DWORD; dwSize = sizeof(DWORD); - LSTATUS result; - result = RegQueryValueEx(hKey, "XboxPort0HostType", NULL, &dwType, (PBYTE)&g_XboxPortMapHostType[0], &dwSize); - if (result != ERROR_SUCCESS) { - //default to use XInput - g_XboxPortMapHostType[0] = 1; - } - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "XboxPort0HostPort", NULL, &dwType, (PBYTE)&g_XboxPortMapHostPort[0], &dwSize); - if (result != ERROR_SUCCESS) { - g_XboxPortMapHostPort[0] = 0; - } - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "XboxPort1HostType", NULL, &dwType, (PBYTE)&g_XboxPortMapHostType[1], &dwSize); - if (result != ERROR_SUCCESS) { - //default to use XInput - g_XboxPortMapHostType[1] = 1; - } - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "XboxPort1HostPort", NULL, &dwType, (PBYTE)&g_XboxPortMapHostPort[1], &dwSize); - if (result != ERROR_SUCCESS) { - g_XboxPortMapHostPort[1] = 1; - } - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "XboxPort2HostType", NULL, &dwType, (PBYTE)&g_XboxPortMapHostType[2], &dwSize); - if (result != ERROR_SUCCESS) { - //default to use XInput - g_XboxPortMapHostType[2] = 1; - } - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "XboxPort2HostPort", NULL, &dwType, (PBYTE)&g_XboxPortMapHostPort[2], &dwSize); - if (result != ERROR_SUCCESS) { - g_XboxPortMapHostPort[2] = 2; - } - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "XboxPort3HostType", NULL, &dwType, (PBYTE)&g_XboxPortMapHostType[3], &dwSize); - if (result != ERROR_SUCCESS) { - //default to use XInput - g_XboxPortMapHostType[3] = 1; - } - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "XboxPort3HostPort", NULL, &dwType, (PBYTE)&g_XboxPortMapHostPort[3], &dwSize); - if (result != ERROR_SUCCESS) { - g_XboxPortMapHostPort[3] = 3; - } - - RegCloseKey(hKey); - } - } + g_ControllerPortMap = controller_port_settings; } // ****************************************************************** // * func: Save // ****************************************************************** -void XBPortMappingSave(const char *szRegistryKey) +void XBPortMappingGet(Settings::s_controller_port &controller_port_settings) { - // ****************************************************************** - // * Save Configuration to Registry - // ****************************************************************** - //if (g_SaveOnExit) { - DWORD dwDisposition, dwType, dwSize; - HKEY hKey; - - if (RegCreateKeyEx(HKEY_CURRENT_USER, szRegistryKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) - { - dwType = REG_DWORD; dwSize = sizeof(DWORD); - RegSetValueEx(hKey, "XboxPort0HostType", 0, dwType, (PBYTE)&g_XboxPortMapHostType[0], dwSize); - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - RegSetValueEx(hKey, "XboxPort0HostPort", 0, dwType, (PBYTE)&g_XboxPortMapHostPort[0], dwSize); - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - RegSetValueEx(hKey, "XboxPort1HostType", 0, dwType, (PBYTE)&g_XboxPortMapHostType[1], dwSize); - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - RegSetValueEx(hKey, "XboxPort1HostPort", 0, dwType, (PBYTE)&g_XboxPortMapHostPort[1], dwSize); - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - RegSetValueEx(hKey, "XboxPort2HostType", 0, dwType, (PBYTE)&g_XboxPortMapHostType[2], dwSize); - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - RegSetValueEx(hKey, "XboxPort2HostPort", 0, dwType, (PBYTE)&g_XboxPortMapHostPort[2], dwSize); - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - RegSetValueEx(hKey, "XboxPort3HostType", 0, dwType, (PBYTE)&g_XboxPortMapHostType[3], dwSize); - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - RegSetValueEx(hKey, "XboxPort3HostPort", 0, dwType, (PBYTE)&g_XboxPortMapHostPort[3], dwSize); - - - RegCloseKey(hKey); - } - //} + controller_port_settings = g_ControllerPortMap; } //Set HostType and HostPort setting from global array per xbox port. The setted value will take effect from next time xbe loading. @@ -178,23 +68,23 @@ void SetXboxPortToHostPort(DWORD dwXboxPort, DWORD dwHostType, DWORD dwHostPort) { //set host type and host port in global array per xbox port, will be used when xbe get reloaded. //only host type and host port can be set in this time. because the xbox DeviceType can only be determined when loading the xbe. - g_XboxPortMapHostType[dwXboxPort] = dwHostType; - g_XboxPortMapHostPort[dwXboxPort] = dwHostPort; + g_ControllerPortMap.XboxPortMapHostType[dwXboxPort] = dwHostType; + g_ControllerPortMap.XboxPortMapHostPort[dwXboxPort] = dwHostPort; } //retrieve HostType and HostPort setting from global array per xbox port. void GetXboxPortToHostPort(DWORD dwXboxPort, DWORD &dwHostType, DWORD &dwHostPort) { //get Host Type and Host Port per xbox port - dwHostType = g_XboxPortMapHostType[dwXboxPort]; - dwHostPort = g_XboxPortMapHostPort[dwXboxPort]; + dwHostType = g_ControllerPortMap.XboxPortMapHostType[dwXboxPort]; + dwHostPort = g_ControllerPortMap.XboxPortMapHostPort[dwXboxPort]; } DWORD GetXboxPortMapHostType(DWORD dwXboxPort) { - return g_XboxPortMapHostType[dwXboxPort]; + return g_ControllerPortMap.XboxPortMapHostType[dwXboxPort]; } DWORD GetXboxPortMapHostPort(DWORD dwXboxPort) { - return g_XboxPortMapHostPort[dwXboxPort]; + return g_ControllerPortMap.XboxPortMapHostPort[dwXboxPort]; } diff --git a/src/Common/Win32/XBPortMapping.h b/src/Common/Win32/XBPortMapping.h index ab2e8c059..d3ae9f6f4 100644 --- a/src/Common/Win32/XBPortMapping.h +++ b/src/Common/Win32/XBPortMapping.h @@ -34,8 +34,6 @@ #ifndef XBPORTMAPPING_H #define XBPORTMAPPING_H -#include "../CxbxKrnl/EmuXapi.h" - extern void SetXboxPortToHostPort(DWORD dwXboxPort, DWORD dwHostType, DWORD dwHostPort); extern void GetXboxPortToHostPort(DWORD dwXboxPort, DWORD &dwHostType, DWORD &dwHostPort); @@ -44,12 +42,12 @@ extern DWORD GetXboxPortMapHostType(DWORD dwXboxPort); extern DWORD GetXboxPortMapHostPort(DWORD dwXboxPort); // ****************************************************************** -// * Load Configuration from Registry +// * Set configuration // ****************************************************************** -extern void XBPortMappingLoad(const char *szRegistryKey); +extern void XBPortMappingSet(Settings::s_controller_port &controller_port_settings); // ****************************************************************** -// * Save Configuration from Registry +// * Get configuration // ****************************************************************** -extern void XBPortMappingSave(const char *szRegistryKey); +extern void XBPortMappingGet(Settings::s_controller_port &controller_port_settings); #endif diff --git a/src/Common/Win32/XBVideo.cpp b/src/Common/Win32/XBVideo.cpp deleted file mode 100644 index aa5dbcc85..000000000 --- a/src/Common/Win32/XBVideo.cpp +++ /dev/null @@ -1,127 +0,0 @@ -// This is an open source non-commercial project. Dear PVS-Studio, please check it. -// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com -// ****************************************************************** -// * -// * .,-::::: .,:: .::::::::. .,:: .: -// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; -// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' -// * $$$ Y$$$P $$""""Y$$ Y$$$P -// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, -// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, -// * -// * Cxbx->Win32->XBVideo.cpp -// * -// * This file is part of the Cxbx project. -// * -// * Cxbx and Cxbe are free software; you can redistribute them -// * and/or modify them under the terms of the GNU General Public -// * License as published by the Free Software Foundation; either -// * version 2 of the license, or (at your option) any later version. -// * -// * This program is distributed in the hope that it will be useful, -// * but WITHOUT ANY WARRANTY; without even the implied warranty of -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// * GNU General Public License for more details. -// * -// * You should have recieved a copy of the GNU General Public License -// * along with this program; see the file COPYING. -// * If not, write to the Free Software Foundation, Inc., -// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. -// * -// * (c) 2002-2003 Aaron Robinson -// * -// * All rights reserved -// * -// ****************************************************************** -#include "XBVideo.h" - -#include - -// ****************************************************************** -// * func: XBVideo::XBVideo -// ****************************************************************** -XBVideo::XBVideo() : m_bVSync(false), m_bFullscreen(false), m_bHardwareYUV(false) -{ - strcpy(m_szVideoResolution, "Automatic (Default)"); -} - -// ****************************************************************** -// * func: XBVideo::~XBVideo -// ****************************************************************** -XBVideo::~XBVideo() -{ -} - -// ****************************************************************** -// * func: XBVideo::Load -// ****************************************************************** -void XBVideo::Load(const char *szRegistryKey) -{ - // ****************************************************************** - // * Load Configuration from Registry - // ****************************************************************** - { - DWORD dwDisposition, dwType, dwSize; - HKEY hKey; - - if(RegCreateKeyEx(HKEY_CURRENT_USER, szRegistryKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) - { - dwType = REG_SZ; dwSize = sizeof(m_szVideoResolution); - RegQueryValueEx(hKey, "VideoResolution", NULL, &dwType, (PBYTE)m_szVideoResolution, &dwSize); - - dwType = REG_DWORD; dwSize = sizeof(m_dwDisplayAdapter); - RegQueryValueEx(hKey, "DisplayAdapter", NULL, &dwType, (PBYTE)&m_dwDisplayAdapter, &dwSize); - - dwType = REG_DWORD; dwSize = sizeof(m_dwDirect3DDevice); - RegQueryValueEx(hKey, "Direct3DDevice", NULL, &dwType, (PBYTE)&m_dwDirect3DDevice, &dwSize); - - dwType = REG_DWORD; dwSize = sizeof(m_bFullscreen); - RegQueryValueEx(hKey, "Fullscreen", NULL, &dwType, (PBYTE)&m_bFullscreen, &dwSize); - - dwType = REG_DWORD; dwSize = sizeof(m_bVSync); - RegQueryValueEx(hKey, "VSync", NULL, &dwType, (PBYTE)&m_bVSync, &dwSize); - - dwType = REG_DWORD; dwSize = sizeof(m_bHardwareYUV); - RegQueryValueEx(hKey, "HardwareYUV", NULL, &dwType, (PBYTE)&m_bHardwareYUV, &dwSize); - - RegCloseKey(hKey); - } - } -} - -// ****************************************************************** -// * func: XBVideo::Save -// ****************************************************************** -void XBVideo::Save(const char *szRegistryKey) -{ - // ****************************************************************** - // * Save Configuration to Registry - // ****************************************************************** - if (g_SaveOnExit) { - DWORD dwDisposition, dwType, dwSize; - HKEY hKey; - - if(RegCreateKeyEx(HKEY_CURRENT_USER, szRegistryKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) - { - dwType = REG_SZ; dwSize = sizeof(m_szVideoResolution); - RegSetValueEx(hKey, "VideoResolution", 0, dwType, (PBYTE)m_szVideoResolution, dwSize); - - dwType = REG_DWORD; dwSize = sizeof(m_dwDisplayAdapter); - RegSetValueEx(hKey, "DisplayAdapter", 0, dwType, (PBYTE)&m_dwDisplayAdapter, dwSize); - - dwType = REG_DWORD; dwSize = sizeof(m_dwDirect3DDevice); - RegSetValueEx(hKey, "Direct3DDevice", 0, dwType, (PBYTE)&m_dwDirect3DDevice, dwSize); - - dwType = REG_DWORD; dwSize = sizeof(m_bFullscreen); - RegSetValueEx(hKey, "Fullscreen", 0, dwType, (PBYTE)&m_bFullscreen, dwSize); - - dwType = REG_DWORD; dwSize = sizeof(m_bVSync); - RegSetValueEx(hKey, "VSync", 0, dwType, (PBYTE)&m_bVSync, dwSize); - - dwType = REG_DWORD; dwSize = sizeof(m_bHardwareYUV); - RegSetValueEx(hKey, "HardwareYUV", 0, dwType, (PBYTE)&m_bHardwareYUV, dwSize); - - RegCloseKey(hKey); - } - } -} diff --git a/src/Common/Win32/XBVideo.h b/src/Common/Win32/XBVideo.h deleted file mode 100644 index 43630e44d..000000000 --- a/src/Common/Win32/XBVideo.h +++ /dev/null @@ -1,107 +0,0 @@ -// ****************************************************************** -// * -// * .,-::::: .,:: .::::::::. .,:: .: -// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;; -// * [[[ '[[,,[[' [[[__[[\. '[[,,[[' -// * $$$ Y$$$P $$""""Y$$ Y$$$P -// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo, -// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm, -// * -// * Cxbx->Win32->Cxbx->XBVideo.h -// * -// * This file is part of the Cxbx project. -// * -// * Cxbx and Cxbe are free software; you can redistribute them -// * and/or modify them under the terms of the GNU General Public -// * License as published by the Free Software Foundation; either -// * version 2 of the license, or (at your option) any later version. -// * -// * This program is distributed in the hope that it will be useful, -// * but WITHOUT ANY WARRANTY; without even the implied warranty of -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// * GNU General Public License for more details. -// * -// * You should have recieved a copy of the GNU General Public License -// * along with this program; see the file COPYING. -// * If not, write to the Free Software Foundation, Inc., -// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. -// * -// * (c) 2002-2003 Aaron Robinson -// * -// * All rights reserved -// * -// ****************************************************************** -#ifndef XBVIDEO_H -#define XBVIDEO_H - -#include "Cxbx.h" -#include "Common/Error.h" -#include "Mutex.h" - -// ****************************************************************** -// * class: XBVideo -// ****************************************************************** -class XBVideo : public Error -{ - public: - // ****************************************************************** - // * Initialization - // ****************************************************************** - XBVideo(); - ~XBVideo(); - - // ****************************************************************** - // * Registry Load/Save - // ****************************************************************** - void Load(const char *szRegistryKey); - void Save(const char *szRegistryKey); - - // ****************************************************************** - // * SetDirect3DDevice - // ****************************************************************** - void SetDirect3DDevice(DWORD dwDirect3DDevice) { m_dwDirect3DDevice = dwDirect3DDevice; } - DWORD GetDirect3DDevice() const { return m_dwDirect3DDevice; } - - // ****************************************************************** - // * SetDisplayAdapter - // ****************************************************************** - void SetDisplayAdapter(DWORD dwDisplayAdapter) { m_dwDisplayAdapter = dwDisplayAdapter; } - DWORD GetDisplayAdapter() const { return m_dwDisplayAdapter; } - - // ****************************************************************** - // * SetVideoResolution - // ****************************************************************** - void SetVideoResolution(const char *szBuffer) { strcpy(m_szVideoResolution, szBuffer); } - const char *GetVideoResolution(){ return m_szVideoResolution; } - - // ****************************************************************** - // * Fullscreen Toggling - // ****************************************************************** - void SetFullscreen(BOOL bFullscreen) { m_bFullscreen = bFullscreen; } - BOOL GetFullscreen() const { return m_bFullscreen; } - - // ****************************************************************** - // * VSync Toggling - // ****************************************************************** - void SetVSync(BOOL bVSync) { m_bVSync = bVSync; } - BOOL GetVSync() const { return m_bVSync; } - - // ****************************************************************** - // * Hardware YUV Toggling - // ****************************************************************** - void SetHardwareYUV(BOOL bHardwareYUV) { m_bHardwareYUV = bHardwareYUV; } - BOOL GetHardwareYUV() const { return m_bHardwareYUV; } - - private: - // ****************************************************************** - // * Configuration - // ****************************************************************** - char m_szVideoResolution[100]; - DWORD m_dwDisplayAdapter; - DWORD m_dwDirect3DDevice; - BOOL m_bVSync; - BOOL m_bFullscreen; - BOOL m_bHardwareYUV; -}; - -#endif diff --git a/src/Common/Xbe.cpp b/src/Common/Xbe.cpp index f430b290a..4962908ed 100644 --- a/src/Common/Xbe.cpp +++ b/src/Common/Xbe.cpp @@ -47,9 +47,9 @@ namespace xboxkrnl #include // For ctime #include "devices\LED.h" // For LED::Sequence #include "CxbxKrnl/CxbxKrnl.h" // For CxbxKrnlPrintUEM -#include "CxbxKrnl/EmuShared.h" // Include this to avoid including EmuXapi.h and EmuD3D8.h #include "CxbxKrnl\EmuSha.h" // For the SHA functions #include "CxbxKrnl\EmuRsa.h" // For the RSA functions +#include "CxbxKrnl/EmuXTL.h" // For LDT_FROM_DASHBOARD and CxbxInitWindow namespace fs = std::experimental::filesystem; diff --git a/src/Cxbx.h b/src/Cxbx.h index 56b9ad612..b77ef4c11 100644 --- a/src/Cxbx.h +++ b/src/Cxbx.h @@ -157,4 +157,13 @@ extern volatile bool g_bPrintfOn; #define CxbxSetThreadName(Name) #endif +// NOTE: The reason filesystem is here is for force compress "experimental" namespace +// to work with same old and new filesystem's functions. Untested, yet should work fine. +#include +#ifdef _EXPERIMENTAL_FILESYSTEM_ +namespace std { + namespace filesystem = std::experimental::filesystem; +} +#endif + #endif diff --git a/src/Cxbx/DlgAudioConfig.cpp b/src/Cxbx/DlgAudioConfig.cpp index 0509ef627..ba266d88a 100644 --- a/src/Cxbx/DlgAudioConfig.cpp +++ b/src/Cxbx/DlgAudioConfig.cpp @@ -34,7 +34,7 @@ // * // ****************************************************************** -#include "CxbxKrnl/EmuShared.h" +#include "Common/Settings.hpp" // for g_Settings #include "DlgAudioConfig.h" #include "ResCxbx.h" @@ -49,7 +49,7 @@ static BOOL CALLBACK DSEnumProc(LPGUID lpGUID, LPCTSTR lpszDesc, LPCTSTR lpszDrv static VOID RefreshAudioAdapter(); /*! audio configuration */ -static XBAudio g_XBAudio; +static Settings::s_audio g_XBAudio; /*! changes flag */ static BOOL g_bHasChanges = FALSE; /*! handle to audio adapter list window */ @@ -61,7 +61,7 @@ VOID ShowAudioConfig(HWND hwnd) g_bHasChanges = FALSE; /*! retrieve audio configuration */ - g_EmuShared->GetXBAudio(&g_XBAudio); + g_XBAudio = g_Settings->m_audio; /*! show dialog box */ DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_AUDIO_CFG), hwnd, DlgAudioConfigProc); @@ -82,7 +82,7 @@ BOOL CALLBACK DSEnumProc(LPGUID lpGUID, LPCTSTR lpszDesc, LPCTSTR lpszDrvName, L binGUID = { 0 }; } - GUID curGUID = g_XBAudio.GetAudioAdapter(); + GUID curGUID = g_XBAudio.adapterGUID; /*! activate configured audio adapter */ if (curGUID == binGUID) { @@ -108,7 +108,7 @@ INT_PTR CALLBACK DlgAudioConfigProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPAR SendMessage(g_hAudioAdapter, CB_RESETCONTENT, 0, 0); - XTL::DirectSoundEnumerate(&DSEnumProc, NULL); + DirectSoundEnumerate(&DSEnumProc, NULL); } /*! refresh UI based on currently selected audio adapter */ @@ -116,11 +116,11 @@ INT_PTR CALLBACK DlgAudioConfigProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPAR /*! check appropriate options */ { - SendMessage(GetDlgItem(hWndDlg, IDC_AC_PCM), BM_SETCHECK, (WPARAM)g_XBAudio.GetPCM(), 0); + SendMessage(GetDlgItem(hWndDlg, IDC_AC_PCM), BM_SETCHECK, (WPARAM)g_XBAudio.codec_pcm, 0); - SendMessage(GetDlgItem(hWndDlg, IDC_AC_XADPCM), BM_SETCHECK, (WPARAM)g_XBAudio.GetXADPCM(), 0); + SendMessage(GetDlgItem(hWndDlg, IDC_AC_XADPCM), BM_SETCHECK, (WPARAM)g_XBAudio.codec_xadpcm, 0); - SendMessage(GetDlgItem(hWndDlg, IDC_AC_UNKNOWN_CODEC), BM_SETCHECK, (WPARAM)g_XBAudio.GetUnknownCodec(), 0); + SendMessage(GetDlgItem(hWndDlg, IDC_AC_UNKNOWN_CODEC), BM_SETCHECK, (WPARAM)g_XBAudio.codec_unknown, 0); } } break; @@ -163,21 +163,21 @@ INT_PTR CALLBACK DlgAudioConfigProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPAR /*! save PCM/XADPCM/UnknownCodec options */ { - LRESULT lRet = SendMessage(GetDlgItem(hWndDlg, IDC_AC_PCM), BM_GETCHECK, 0, 0); + LRESULT lRet = SendMessage(GetDlgItem(hWndDlg, IDC_AC_PCM), BM_GETCHECK, 0, 0); - g_XBAudio.SetPCM(lRet == BST_CHECKED); + g_XBAudio.codec_pcm = (lRet == BST_CHECKED); lRet = SendMessage(GetDlgItem(hWndDlg, IDC_AC_XADPCM), BM_GETCHECK, 0, 0); - g_XBAudio.SetXADPCM(lRet == BST_CHECKED); + g_XBAudio.codec_xadpcm = (lRet == BST_CHECKED); lRet = SendMessage(GetDlgItem(hWndDlg, IDC_AC_UNKNOWN_CODEC), BM_GETCHECK, 0, 0); - g_XBAudio.SetUnknownCodec(lRet == BST_CHECKED); + g_XBAudio.codec_unknown = (lRet == BST_CHECKED); } /*! save audio configuration */ - g_EmuShared->SetXBAudio(&g_XBAudio); + g_Settings->m_audio = g_XBAudio; EndDialog(hWndDlg, wParam); } @@ -203,7 +203,7 @@ VOID RefreshAudioAdapter() { /*! save configured audio adapter */ { - GUID oldGUID = g_XBAudio.GetAudioAdapter(); + GUID oldGUID = g_XBAudio.adapterGUID; DWORD dwAudioAdapter = (DWORD)SendMessage(g_hAudioAdapter, CB_GETCURSEL, 0, 0); @@ -222,13 +222,13 @@ VOID RefreshAudioAdapter() if(binGUID != oldGUID) { g_bHasChanges = TRUE; - g_XBAudio.SetAudioAdapter(binGUID); + g_XBAudio.adapterGUID = binGUID; } // Force save default audio device if selected audio device is invalid. if (pGUID == (LPGUID)CB_ERR) { SendMessage(g_hAudioAdapter, CB_SETCURSEL, 0, 0); - g_EmuShared->SetXBAudio(&g_XBAudio); + g_Settings->m_audio = g_XBAudio; MessageBox(nullptr, "Your selected audio adapter is invalid,\n" "reverting to default audio adapter.", "Cxbx-Reloaded", MB_OK | MB_ICONEXCLAMATION); } diff --git a/src/Cxbx/DlgControllerConfig.cpp b/src/Cxbx/DlgControllerConfig.cpp index c697873b6..3df2ea548 100644 --- a/src/Cxbx/DlgControllerConfig.cpp +++ b/src/Cxbx/DlgControllerConfig.cpp @@ -34,11 +34,13 @@ // * // ****************************************************************** -#include "CxbxKrnl/EmuShared.h" +#include "Common/Settings.hpp" // for g_Settings #include "DlgControllerConfig.h" #include "ResCxbx.h" +#include "Common/Win32/DInputController.h" +#define DIRECTINPUT_VERSION 0x0800 #include #include @@ -50,7 +52,7 @@ static VOID ConfigureInput(HWND hWndDlg, HWND hWndButton, XBCtrlObject object); static VOID EnableButtonWindows(HWND hWndDlg, HWND hExclude, BOOL bEnable); /*! controller configuration */ -static XBController g_XBController; +static DInputController g_DInputController; /*! changes flag */ static BOOL g_bHasChanges = FALSE; @@ -60,7 +62,7 @@ VOID ShowControllerConfig(HWND hwnd) g_bHasChanges = FALSE; /*! retrieve controller configuration */ - g_EmuShared->GetXBController(&g_XBController); + g_DInputController.m_settings = g_Settings->m_controller_dinput; /*! show dialog box */ DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_CONTROLLER_CFG), hwnd, DlgControllerConfigProc); @@ -114,7 +116,7 @@ INT_PTR CALLBACK DlgControllerConfigProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, break; case IDC_INPUT_CONFIG_ACCEPT: - g_EmuShared->SetXBController(&g_XBController); + g_Settings->m_controller_dinput = g_DInputController.m_settings; EndDialog(hWndDlg, wParam); break; @@ -286,7 +288,7 @@ VOID ConfigureInput(HWND hWndDlg, HWND hWndButton, XBCtrlObject object) SetWindowText(GetDlgItem(hWndDlg, IDC_CONFIG_STATUS), "Waiting for your input..."); GetWindowText(hWndButton, szOrgText, 32); - g_XBController.ConfigBegin(hWndDlg, object); + g_DInputController.ConfigBegin(hWndDlg, object); // wait for input, or 5 second timeout for(int v=100;v>0;v--) @@ -299,14 +301,19 @@ VOID ConfigureInput(HWND hWndDlg, HWND hWndButton, XBCtrlObject object) sprintf(szBuffer, "%d", (v+19)/20); SetWindowText(hWndButton, szBuffer); + + // NOTE: This fix false positive of non-responding message when inputting all keys at once. + // Source: https://msdn.microsoft.com/en-us/library/windows/desktop/ms633526%28v=vs.85%29.aspx + MSG Msg; + PeekMessage(&Msg, hWndDlg, 0, 0, PM_NOREMOVE); } - if(g_XBController.HasError()) + if(g_DInputController.HasError()) { goto cleanup; } - if(g_XBController.ConfigPoll(szNewText)) + if(g_DInputController.ConfigPoll(szNewText)) { break; } @@ -314,13 +321,13 @@ VOID ConfigureInput(HWND hWndDlg, HWND hWndButton, XBCtrlObject object) Sleep(50); } - if(g_XBController.HasError()) + if(g_DInputController.HasError()) { goto cleanup; } else { - g_XBController.ConfigEnd(); + g_DInputController.ConfigEnd(); } cleanup: @@ -330,9 +337,9 @@ cleanup: /*! update window with status */ { - if(g_XBController.HasError()) + if(g_DInputController.HasError()) { - sprintf(szNewText, "%s", g_XBController.GetError().c_str()); + sprintf(szNewText, "%s", g_DInputController.GetError().c_str()); } SetWindowText(hWndButton, szOrgText); diff --git a/src/Cxbx/DlgVideoConfig.cpp b/src/Cxbx/DlgVideoConfig.cpp index 8cb7d8093..738974079 100644 --- a/src/Cxbx/DlgVideoConfig.cpp +++ b/src/Cxbx/DlgVideoConfig.cpp @@ -34,12 +34,12 @@ // * // ****************************************************************** -#include "CxbxKrnl/EmuShared.h" +#include "Common/Settings.hpp" // for g_Settings #include "DlgVideoConfig.h" #include "ResCxbx.h" -#include "CxbxKrnl/EmuD3D8Types.h" +#include "CxbxKrnl/EmuXTL.h" /*! windows dialog procedure */ static INT_PTR CALLBACK DlgVideoConfigProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -51,7 +51,7 @@ static VOID RefreshDirect3DDevice(); /*! direct3d instance */ static XTL::IDirect3D *g_pDirect3D = 0; /*! video configuration */ -static XBVideo g_XBVideo; +static Settings::s_video g_XBVideo; /*! changes flag */ static BOOL g_bHasChanges = FALSE; /*! number of adapters */ @@ -69,7 +69,7 @@ VOID ShowVideoConfig(HWND hwnd) g_bHasChanges = FALSE; /*! retrieve video configuration */ - g_EmuShared->GetXBVideo(&g_XBVideo); + g_XBVideo = g_Settings->m_video; /*! initialize direct3d */ { @@ -122,18 +122,18 @@ INT_PTR CALLBACK DlgVideoConfigProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPAR } /*! activate configured display adapter */ - SendMessage(g_hDisplayAdapter, CB_SETCURSEL, g_XBVideo.GetDisplayAdapter(), 0); + SendMessage(g_hDisplayAdapter, CB_SETCURSEL, g_XBVideo.adapter, 0); /*! refresh UI based on currently selected display adapter */ RefreshDisplayAdapter(); /*! check appropriate options */ { - SendMessage(GetDlgItem(hWndDlg, IDC_CV_FULLSCREEN), BM_SETCHECK, (WPARAM)g_XBVideo.GetFullscreen(), 0); + SendMessage(GetDlgItem(hWndDlg, IDC_CV_FULLSCREEN), BM_SETCHECK, (WPARAM)g_XBVideo.bFullScreen, 0); - SendMessage(GetDlgItem(hWndDlg, IDC_CV_VSYNC), BM_SETCHECK, (WPARAM)g_XBVideo.GetVSync(), 0); + SendMessage(GetDlgItem(hWndDlg, IDC_CV_VSYNC), BM_SETCHECK, (WPARAM)g_XBVideo.bVSync, 0); - SendMessage(GetDlgItem(hWndDlg, IDC_CV_HARDWAREYUV), BM_SETCHECK, (WPARAM)g_XBVideo.GetHardwareYUV(), 0); + SendMessage(GetDlgItem(hWndDlg, IDC_CV_HARDWAREYUV), BM_SETCHECK, (WPARAM)g_XBVideo.bHardwareYUV, 0); } } break; @@ -183,26 +183,29 @@ INT_PTR CALLBACK DlgVideoConfigProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPAR lRet = SendMessage(hVideoResolution, CB_GETLBTEXT, (WPARAM)lRet, (LPARAM)szBuffer); - g_XBVideo.SetVideoResolution(szBuffer); + strncpy(g_XBVideo.szVideoResolution, szBuffer, std::size(g_XBVideo.szVideoResolution)); + + // For prevent buffer overflow whenever copy string from another location. + g_XBVideo.szVideoResolution[std::size(g_XBVideo.szVideoResolution)-1] = '\0'; } /*! save fullscreen/vsync/YUV options */ { LRESULT lRet = SendMessage(GetDlgItem(hWndDlg, IDC_CV_FULLSCREEN), BM_GETCHECK, 0, 0); - g_XBVideo.SetFullscreen(lRet == BST_CHECKED); + g_XBVideo.bFullScreen = (lRet == BST_CHECKED); lRet = SendMessage(GetDlgItem(hWndDlg, IDC_CV_VSYNC), BM_GETCHECK, 0, 0); - g_XBVideo.SetVSync(lRet == BST_CHECKED); + g_XBVideo.bVSync = (lRet == BST_CHECKED); lRet = SendMessage(GetDlgItem(hWndDlg, IDC_CV_HARDWAREYUV), BM_GETCHECK, 0, 0); - g_XBVideo.SetHardwareYUV(lRet == BST_CHECKED); + g_XBVideo.bHardwareYUV = (lRet == BST_CHECKED); } /*! save video configuration */ - g_EmuShared->SetXBVideo(&g_XBVideo); + g_Settings->m_video = g_XBVideo; EndDialog(hWndDlg, wParam); } @@ -238,7 +241,7 @@ VOID RefreshDisplayAdapter() { /*! save configured display adapter */ { - DWORD dwOld = g_XBVideo.GetDisplayAdapter(); + DWORD dwOld = g_XBVideo.adapter; DWORD dwDisplayAdapter = (DWORD)SendMessage(g_hDisplayAdapter, CB_GETCURSEL, 0, 0); @@ -246,7 +249,7 @@ VOID RefreshDisplayAdapter() { g_bHasChanges = TRUE; - g_XBVideo.SetDisplayAdapter(dwDisplayAdapter); + g_XBVideo.adapter = dwDisplayAdapter; } } @@ -267,7 +270,7 @@ VOID RefreshDisplayAdapter() XTL::D3DCAPS Caps; /*! verify device is available */ - if(g_pDirect3D->GetDeviceCaps(g_XBVideo.GetDisplayAdapter(), devType[d], &Caps) == D3D_OK) + if(g_pDirect3D->GetDeviceCaps(g_XBVideo.adapter, devType[d], &Caps) == D3D_OK) { /*! add device to list */ SendMessage(g_hDirect3DDevice, CB_ADDSTRING, 0, (LPARAM)szDevType[d]); @@ -276,7 +279,7 @@ VOID RefreshDisplayAdapter() } /*! activate configured device */ - SendMessage(g_hDirect3DDevice, CB_SETCURSEL, g_XBVideo.GetDirect3DDevice(), 0); + SendMessage(g_hDirect3DDevice, CB_SETCURSEL, g_XBVideo.direct3DDevice, 0); /*! refresh based on new device selection */ RefreshDirect3DDevice(); @@ -290,7 +293,7 @@ VOID RefreshDirect3DDevice() /*! save configured device */ { - DWORD dwOld = g_XBVideo.GetDirect3DDevice(); + DWORD dwOld = g_XBVideo.direct3DDevice; DWORD dwDirect3DDevice = SendMessage(g_hDirect3DDevice, CB_GETCURSEL, 0, 0); @@ -298,7 +301,7 @@ VOID RefreshDirect3DDevice() { g_bHasChanges = TRUE; - g_XBVideo.SetDirect3DDevice(dwDirect3DDevice); + g_XBVideo.direct3DDevice = dwDirect3DDevice; } } @@ -310,7 +313,7 @@ VOID RefreshDirect3DDevice() /*! enumerate display modes */ { uint32 dwAdapterModeCount = g_pDirect3D->GetAdapterModeCount( - g_XBVideo.GetDisplayAdapter() + g_XBVideo.adapter #ifdef CXBX_USE_D3D9 , XTL::D3DFMT_X8R8G8B8 #endif @@ -326,7 +329,7 @@ VOID RefreshDirect3DDevice() XTL::D3DDISPLAYMODE displayMode; g_pDirect3D->EnumAdapterModes( - g_XBVideo.GetDisplayAdapter(), + g_XBVideo.adapter, #ifdef CXBX_USE_D3D9 XTL::D3DFMT_X8R8G8B8, #endif @@ -367,7 +370,7 @@ VOID RefreshDirect3DDevice() } /*! if current mode is the configured video resolution, activate it in the list */ - if(strcmp(szBuffer, g_XBVideo.GetVideoResolution()) == 0) + if(strcmp(szBuffer, g_XBVideo.szVideoResolution) == 0) { dwVideoResolution = v+1; } diff --git a/src/Cxbx/DlgXboxControllerPortMapping.cpp b/src/Cxbx/DlgXboxControllerPortMapping.cpp index b69af3a5e..9357c52fc 100644 --- a/src/Cxbx/DlgXboxControllerPortMapping.cpp +++ b/src/Cxbx/DlgXboxControllerPortMapping.cpp @@ -34,11 +34,13 @@ // * // ****************************************************************** -#include "CxbxKrnl/EmuShared.h" +#include "Common/Settings.hpp" // for g_Settings + #include "DlgXboxControllerPortMapping.h" #include "../Common/Win32/XBPortMapping.h" #include "Windowsx.h" #include "ResCxbx.h" +#include "CxbxKrnl/EmuXTL.h" #include @@ -70,8 +72,8 @@ INT_PTR CALLBACK DlgXboxControllerPortMappingProc(HWND hWndDlg, UINT uMsg, WPARA { /*! set window icon */ SetClassLong(hWndDlg, GCL_HICON, (LONG)LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_CXBX))); - //Load saved configuration from registry. - XBPortMappingLoad("Software\\Cxbx-Reloaded\\XboxPortHostMapping");//"Software\\Cxbx-Reloaded\\XboxPortHostMapping" + // Load configuration from settings. + XBPortMappingSet(g_Settings->m_controller_port); //Init dialog selections per global array contenst. XTL::DWORD port = 0; int index = 0; @@ -140,8 +142,8 @@ INT_PTR CALLBACK DlgXboxControllerPortMappingProc(HWND hWndDlg, UINT uMsg, WPARA EndDialog(hWndDlg, wParam); break; case IDC_HOST_APPLY: - //save configuration to registry. - XBPortMappingSave("Software\\Cxbx-Reloaded\\XboxPortHostMapping"); + // Save configuration to settings. + XBPortMappingGet(g_Settings->m_controller_port); EndDialog(hWndDlg, wParam); break; //set host type and host port in global array xbox to host bridge for xbox port 0 diff --git a/src/Cxbx/ResCxbx.h b/src/Cxbx/ResCxbx.h index 7b5f220aa..87e2c2367 100644 --- a/src/Cxbx/ResCxbx.h +++ b/src/Cxbx/ResCxbx.h @@ -281,6 +281,7 @@ #define ID_SETTINGS_CONFIG_DLOCCUSTOM 40104 #define ID_SETTINGS_CONFIG_DLOCAPPDATA 40105 #define ID_SETTINGS_CONFIG_DLOCCURDIR 40106 +#define ID_SETTINGS_ALLOWADMINPRIVILEGE 40107 #define IDC_STATIC -1 // Next default values for new objects @@ -288,7 +289,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 135 -#define _APS_NEXT_COMMAND_VALUE 40107 +#define _APS_NEXT_COMMAND_VALUE 40108 #define _APS_NEXT_CONTROL_VALUE 1256 #define _APS_NEXT_SYMED_VALUE 104 #endif diff --git a/src/Cxbx/WinMain.cpp b/src/Cxbx/WinMain.cpp index 8c976e7a7..80c907cbf 100644 --- a/src/Cxbx/WinMain.cpp +++ b/src/Cxbx/WinMain.cpp @@ -39,6 +39,7 @@ #include "CxbxKrnl/CxbxKrnl.h" #include "CxbxKrnl/Emu.h" #include "CxbxKrnl/EmuShared.h" +#include "Common/Settings.hpp" #include // Enable Visual Styles @@ -68,26 +69,65 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine if ((UINT_PTR)GetModuleHandle(nullptr) != CXBX_BASE_ADDR) { /*! CXBX_BASE_ADDR is defined as 0x00010000, which is the base address of - the Cxbx.exe host executable. + the Cxbx.exe host executable. Set in Cxbx Project options, Linker, Advanced, Base Address */ MessageBox(NULL, "Cxbx.exe is not loaded to base address 0x00010000 (which is a requirement for Xbox emulation)", "Cxbx-Reloaded", MB_OK | MB_ICONERROR); return EXIT_FAILURE; } + bool bRet, bKernel; + HWND hWnd = nullptr; + DWORD guiProcessID = 0; + + if (__argc >= 2 && std::strcmp(__argv[1], "/load") == 0 && std::strlen(__argv[2]) > 0) { + bKernel = true; + + // Perform check if command line contain gui's hWnd value. + if (__argc > 2) { + hWnd = (HWND)std::stoi(__argv[3], nullptr, 10); + + hWnd = IsWindow(hWnd) ? hWnd : nullptr; + if (hWnd != nullptr) { + // We don't need thread ID from window handle. + GetWindowThreadProcessId(hWnd, &guiProcessID); + } + } + } + else { + bKernel = false; + guiProcessID = GetCurrentProcessId(); + } + /*! initialize shared memory */ - EmuShared::Init(); + EmuShared::Init(guiProcessID); bool bFirstLaunch; g_EmuShared->GetIsFirstLaunch(&bFirstLaunch); /* check if process is launch with elevated access then prompt for continue on or not. */ if (!bFirstLaunch) { + + g_Settings = new Settings(); + + if (g_Settings == nullptr) { + MessageBox(nullptr, szSettings_alloc_error, "Cxbx-Reloaded", MB_OK); + EmuShared::Cleanup(); + return EXIT_FAILURE; + } + + bRet = g_Settings->Init(); + if (!bRet) { + EmuShared::Cleanup(); + return EXIT_FAILURE; + } + bool bElevated = CxbxIsElevated(); - if (bElevated && !bFirstLaunch) { + + if (bElevated && !g_Settings->m_core.allowAdminPrivilege) { int ret = MessageBox(NULL, "Cxbx-Reloaded has detected that it has been launched with Administrator rights.\n" - "\nThis is dangerous, as a maliciously modified Xbox titles could take control of your system.\n" - "\nAre you sure you want to continue?", "Cxbx-Reloaded", MB_YESNO | MB_ICONWARNING); + "\nThis is dangerous, as a maliciously modified Xbox titles could take control of your system.\n" + "\nAre you sure you want to continue?", "Cxbx-Reloaded", MB_YESNO | MB_ICONWARNING); if (ret != IDYES) { EmuShared::Cleanup(); return EXIT_FAILURE; @@ -96,7 +136,28 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine g_EmuShared->SetIsFirstLaunch(true); } - if (__argc >= 2 && strcmp(__argv[1], "/load") == 0 && strlen(__argv[2]) > 0) { + if (bKernel) { + + // NOTE: This is designated for standalone kernel mode launch without GUI + if (g_Settings != nullptr) { + + // Reset to default + g_EmuShared->Reset(); + + g_Settings->Verify(); + g_Settings->SyncToEmulator(); + + // We don't need to keep Settings open plus allow emulator to use unused memory. + delete g_Settings; + g_Settings = nullptr; + + // Perform identical to what GUI will do to certain EmuShared's variable before launch. + g_EmuShared->SetIsEmulating(true); + + // NOTE: This setting the ready status is optional. Internal kernel process is checking if GUI is running. + // Except if enforce check, then we need to re-set ready status every time for non-GUI. + //g_EmuShared->SetIsReady(true); + } /* Initialize Cxbx File Paths */ CxbxInitFilePaths(); @@ -105,6 +166,23 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine return EXIT_SUCCESS; } + // If 2nd GUI executable is launched, load settings file for GUI for editable support. + if (g_Settings == nullptr) { + g_Settings = new Settings(); + + if (g_Settings == nullptr) { + MessageBox(nullptr, szSettings_alloc_error, "Cxbx-Reloaded", MB_OK); + EmuShared::Cleanup(); + return EXIT_FAILURE; + } + + bRet = g_Settings->Init(); + if (!bRet) { + EmuShared::Cleanup(); + return EXIT_FAILURE; + } + } + INITCOMMONCONTROLSEX icc; icc.dwSize = sizeof(icc); icc.dwICC = ICC_WIN95_CLASSES; diff --git a/src/Cxbx/WndMain.cpp b/src/Cxbx/WndMain.cpp index 9de358cd1..0c6d03aed 100644 --- a/src/Cxbx/WndMain.cpp +++ b/src/Cxbx/WndMain.cpp @@ -29,6 +29,8 @@ // * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA. // * // * (c) 2002-2003 Aaron Robinson +// * (c) 2017-2018 RadWolfie +// * (c) 2018 wutno (#/g/punk - Rizon) // * // * All rights reserved // * @@ -42,6 +44,9 @@ #include "DlgXboxControllerPortMapping.h" #include "Common/XbePrinter.h" // For DumpInformation #include "CxbxKrnl/EmuShared.h" +#include "CxbxKrnl/EmuXTL.h" +#include "Common/Settings.hpp" + #include "..\CxbxKrnl\CxbxKrnl.h" // For CxbxConvertArgToString and CxbxExec #include "ResCxbx.h" #include "CxbxVersion.h" @@ -65,7 +70,7 @@ static int splashLogoWidth, splashLogoHeight; bool g_SaveOnExit = true; -void ClearHLECache(char sStorageLocation[MAX_PATH]) +void ClearHLECache(const char sStorageLocation[MAX_PATH]) { std::string cacheDir = std::string(sStorageLocation) + "\\HLECache\\"; std::string fullpath = cacheDir + "*.ini"; @@ -93,14 +98,10 @@ void ClearHLECache(char sStorageLocation[MAX_PATH]) printf("Cleared HLE Cache\n"); } -void WndMain::InitializeSettings() { - HKEY hKey; - if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Cxbx-Reloaded", 0, KEY_ENUMERATE_SUB_KEYS | DELETE | KEY_QUERY_VALUE | KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) { - RegDeleteTree(hKey, NULL); - RegCloseKey(hKey); - - g_SaveOnExit = false; - } +void WndMain::InitializeSettings() +{ + g_Settings->Delete(); + g_SaveOnExit = false; } #define TIMERID_FPS 0 @@ -116,10 +117,10 @@ void WndMain::ResizeWindow(HWND hwnd, bool bForGUI) m_h = 480; if (!bForGUI) { // For emulation, get the configured window dimensions - XBVideo XBVideoConf; - g_EmuShared->GetXBVideo(&XBVideoConf); + Settings::s_video XBVideoConf; + g_EmuShared->GetVideoSettings(&XBVideoConf); - const char* resolution = XBVideoConf.GetVideoResolution(); + const char* resolution = XBVideoConf.szVideoResolution; if (2 != sscanf(resolution, "%d x %d", &m_w, &m_h)) { DbgPrintf("Couldn't parse resolution : %s.\n", resolution); } @@ -166,301 +167,42 @@ WndMain::WndMain(HINSTANCE x_hInstance) : m_bXbeChanged(false), m_bIsStarted(false), m_hwndChild(nullptr), - m_KrnlDebug(DM_NONE), - m_CxbxDebug(DM_NONE), - m_FlagsLLE(0), - m_StorageToggle(CXBX_DATA_APPDATA), - m_StorageLocation(""), - m_dwRecentXbe(0), m_hDebuggerProc(nullptr), m_hDebuggerMonitorThread(), m_prevWindowLoc({ -1, -1 }) { - // initialize members - { - m_classname = "WndMain"; - m_wndname = "Cxbx-Reloaded " _CXBX_VERSION; + // initialize members + { + m_classname = "WndMain"; + m_wndname = "Cxbx-Reloaded " _CXBX_VERSION; + } - m_XbeFilename = (char*)calloc(1, MAX_PATH); + // load configuration from settings file + { + // NOTE: Settings has already been initalized/load from file before WndMain constructed. - m_CxbxDebugFilename = (char*)calloc(1, MAX_PATH); - m_KrnlDebugFilename = (char*)calloc(1, MAX_PATH); + g_Settings->Verify(); - for(int v=0;vSetStorageLocation(g_Settings->GetDataLocation().c_str()); - // load configuration from registry - { - DWORD dwDisposition, dwType, dwSize; - HKEY hKey; - - if(RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Cxbx-Reloaded", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) - { - LONG result = ERROR_SUCCESS; - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "LLEFLAGS", NULL, &dwType, (PBYTE)&m_FlagsLLE, &dwSize); - if (result != ERROR_SUCCESS) { - m_FlagsLLE = 0; + unsigned int i = 0; + do { + if (g_Settings->m_gui.szRecentXbeFiles[i].size() == 0) { + break; } + i++; + } while (i < RECENT_XBE_LIST_MAX); - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "HackDisablePixelShaders", NULL, &dwType, (PBYTE)&m_DisablePixelShaders, &dwSize); - if (result != ERROR_SUCCESS) { - m_DisablePixelShaders = 0; - } - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "HackUncapFrameRate", NULL, &dwType, (PBYTE)&m_UncapFramerate, &dwSize); - if (result != ERROR_SUCCESS) { - m_UncapFramerate = 0; - } - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "HackUseAllCores", NULL, &dwType, (PBYTE)&m_UseAllCores, &dwSize); - if (result != ERROR_SUCCESS) { - m_UseAllCores = 0; - } - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "HackSkipRdtscPatching", NULL, &dwType, (PBYTE)&m_SkipRdtscPatching, &dwSize); - if (result != ERROR_SUCCESS) { - m_SkipRdtscPatching = 0; - } - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "HackScaleViewport", NULL, &dwType, (PBYTE)&m_ScaleViewport, &dwSize); - if (result != ERROR_SUCCESS) { - m_ScaleViewport = 0; - } - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "HackDirectBackBufferAccess", NULL, &dwType, (PBYTE)&m_DirectHostBackBufferAccess, &dwSize); - if (result != ERROR_SUCCESS) { - m_DirectHostBackBufferAccess = 1; - } - - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "CxbxDebug", NULL, &dwType, (PBYTE)&m_CxbxDebug, &dwSize); - if (result != ERROR_SUCCESS) { - m_CxbxDebug = DebugMode::DM_NONE; - } - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "KrnlDebug", NULL, &dwType, (PBYTE)&m_KrnlDebug, &dwSize); - if (result != ERROR_SUCCESS) { - m_KrnlDebug = DebugMode::DM_NONE; - } - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "RecentXbe", NULL, &dwType, (PBYTE)&m_dwRecentXbe, &dwSize); - if (result != ERROR_SUCCESS) { - m_dwRecentXbe = 0; - } - - dwType = REG_SZ; dwSize = MAX_PATH; ULONG lErrCodeCxbxDebugFilename; - lErrCodeCxbxDebugFilename = RegQueryValueEx(hKey, "CxbxDebugFilename", NULL, &dwType, (PBYTE)m_CxbxDebugFilename, &dwSize); - if (lErrCodeCxbxDebugFilename != ERROR_SUCCESS) { - m_CxbxDebugFilename[0] = '\0'; - } - - dwType = REG_SZ; dwSize = MAX_PATH; LONG lErrCodeKrnlDebugFilename; - lErrCodeKrnlDebugFilename = RegQueryValueEx(hKey, "KrnlDebugFilename", NULL, &dwType, (PBYTE)m_KrnlDebugFilename, &dwSize); - if (lErrCodeKrnlDebugFilename != ERROR_SUCCESS) { - m_KrnlDebugFilename[0] = '\0'; - } - - dwType = REG_DWORD; dwSize = sizeof(DWORD); - result = RegQueryValueEx(hKey, "DataStorageToggle", NULL, &dwType, (PBYTE)&m_StorageToggle, &dwSize); - if (result != ERROR_SUCCESS) { - m_StorageToggle = CXBX_DATA_APPDATA; - } - - switch (m_StorageToggle) { - case CXBX_DATA_APPDATA: - default: - SHGetSpecialFolderPath(NULL, m_StorageLocation, CSIDL_APPDATA, TRUE); - m_StorageToggle = CXBX_DATA_APPDATA; - strncat(m_StorageLocation, "\\Cxbx-Reloaded", MAX_PATH); - break; - - case CXBX_DATA_CURDIR: - GetCurrentDirectory(MAX_PATH, m_StorageLocation); - break; - - case CXBX_DATA_CUSTOM: - dwType = REG_SZ; dwSize = MAX_PATH; - result = RegQueryValueEx(hKey, "DataStorageLocation", NULL, &dwType, (PBYTE)&m_StorageLocation, &dwSize); - if (result != ERROR_SUCCESS) { - SHGetSpecialFolderPath(NULL, m_StorageLocation, CSIDL_APPDATA, TRUE); - strncat(m_StorageLocation, "\\Cxbx-Reloaded", MAX_PATH); - } - break; - } - // NOTE: This is a requirement for pre-verification from GUI. Used in CxbxInitFilePaths function. - g_EmuShared->SetStorageLocation(m_StorageLocation); - - // Prevent using an incorrect path from the registry if the debug folders have been moved - if (m_CxbxDebug == DM_FILE) - { - if(lErrCodeCxbxDebugFilename == ERROR_FILE_NOT_FOUND || strlen(m_CxbxDebugFilename) == 0) - { - m_CxbxDebug = DM_NONE; - } - else - { - char *CxbxDebugPath = (char*)calloc(1, MAX_PATH); - char *CxbxDebugName = (char*)calloc(1, MAX_PATH); - - strcpy(CxbxDebugName, strrchr(m_CxbxDebugFilename, '\\')); - - if(strlen(m_CxbxDebugFilename) < strlen(CxbxDebugName)) - { - memset((char*)m_CxbxDebugFilename, '\0', MAX_PATH); - m_CxbxDebug = DM_NONE; - } - else - { - strncpy(CxbxDebugPath, m_CxbxDebugFilename, strlen(m_CxbxDebugFilename) - strlen(CxbxDebugName)); - if(PathFileExists((LPCSTR)CxbxDebugPath) == FALSE) - { - memset((char*)m_CxbxDebugFilename, '\0', MAX_PATH); - m_CxbxDebug = DM_NONE; - } - } - free(CxbxDebugPath); - free(CxbxDebugName); - } - } - - if (m_KrnlDebug == DM_FILE) - { - if(lErrCodeKrnlDebugFilename == ERROR_FILE_NOT_FOUND || strlen(m_KrnlDebugFilename) == 0) - { - m_KrnlDebug = DM_NONE; - } - else - { - char *KrnlDebugPath = (char*)calloc(1, MAX_PATH); - char *KrnlDebugName = (char*)calloc(1, MAX_PATH); - - strcpy(KrnlDebugName, strrchr(m_KrnlDebugFilename, '\\')); - - if(strlen(m_KrnlDebugFilename) < strlen(KrnlDebugName)) - { - memset((char*)m_KrnlDebugFilename, '\0', MAX_PATH); - m_KrnlDebug = DM_NONE; - } - else - { - strncpy(KrnlDebugPath, m_KrnlDebugFilename, strlen(m_KrnlDebugFilename) - strlen(KrnlDebugName)); - if(PathFileExists((LPCSTR)KrnlDebugPath) == FALSE) - { - memset((char*)m_KrnlDebugFilename, '\0', MAX_PATH); - m_KrnlDebug = DM_NONE; - } - } - free(KrnlDebugPath); - free(KrnlDebugName); - } - } - - int v=0; - - for(v=0;vSave(); } // Close opened debugger monitor if there is one @@ -469,11 +211,7 @@ WndMain::~WndMain() // cleanup allocations { delete m_Xbe; - - free(m_XbeFilename); - - free(m_CxbxDebugFilename); - free(m_KrnlDebugFilename); + delete g_Settings; } } @@ -525,7 +263,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP m_SplashDC = CreateCompatibleDC(hDC); m_LogoDC = CreateCompatibleDC(hDC); - + m_OrigBmp = (HBITMAP)SelectObject(m_SplashDC, m_SplashBmp); m_OrigLogo = (HBITMAP)SelectObject(m_LogoDC, m_LogoBmp); @@ -596,7 +334,6 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP pCMD->dwChildProcID = lParam; // lParam is process ID. std::thread(CrashMonitorWrapper, pCMD).detach(); - g_EmuShared->SetFlagsLLE(&m_FlagsLLE); g_EmuShared->SetIsEmulating(true); // NOTE: Putting in here raise to low or medium risk due to debugger will launch itself. (Current workaround) g_EmuShared->SetIsReady(true); break; @@ -1264,8 +1001,8 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP break; } - m_StorageToggle = CXBX_DATA_CUSTOM; - strncpy(m_StorageLocation, szDirTemp.c_str(), MAX_PATH); + g_Settings->m_gui.DataStorageToggle = CXBX_DATA_CUSTOM; + g_Settings->m_gui.szCustomLocation = szDirTemp; RefreshMenus(); } } @@ -1273,35 +1010,28 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP case ID_SETTINGS_CONFIG_DLOCAPPDATA: { - char szDir[MAX_PATH]; - - SHGetSpecialFolderPath(NULL, szDir, CSIDL_APPDATA, TRUE); - m_StorageToggle = CXBX_DATA_APPDATA; - strncpy(m_StorageLocation, szDir, MAX_PATH); - strncat(m_StorageLocation, "\\Cxbx-Reloaded", MAX_PATH); + g_Settings->m_gui.DataStorageToggle = CXBX_DATA_APPDATA; RefreshMenus(); } break; case ID_SETTINGS_CONFIG_DLOCCURDIR: { - - GetCurrentDirectory(MAX_PATH, m_StorageLocation); - m_StorageToggle = CXBX_DATA_CURDIR; + g_Settings->m_gui.DataStorageToggle = CXBX_DATA_CURDIR; RefreshMenus(); } break; case ID_CACHE_CLEARHLECACHE_ALL: { - ClearHLECache(m_StorageLocation); + ClearHLECache(g_Settings->GetDataLocation().c_str()); MessageBox(m_hwnd, "The entire HLE Cache has been cleared.", "Cxbx-Reloaded", MB_OK); } break; case ID_CACHE_CLEARHLECACHE_CURRENT: { - std::string cacheDir = std::string(m_StorageLocation) + "\\HLECache\\"; + std::string cacheDir = g_Settings->GetDataLocation() + "\\HLECache\\"; // Hash the loaded XBE's header, use it as a filename uint32_t uiHash = XXHash32::hash((void*)&m_Xbe->m_Header, sizeof(Xbe::Header), 0); @@ -1332,11 +1062,12 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP case ID_EMULATION_DEBUGOUTPUTKERNEL_CONSOLE: { - if (m_KrnlDebug == DM_NONE || m_KrnlDebug == DM_FILE) - m_KrnlDebug = DM_CONSOLE; - else - m_KrnlDebug = DM_NONE; - + if (g_Settings->m_core.KrnlDebugMode == DM_NONE || g_Settings->m_core.KrnlDebugMode == DM_FILE) { + g_Settings->m_core.KrnlDebugMode = DM_CONSOLE; + } + else { + g_Settings->m_core.KrnlDebugMode = DM_NONE; + } MessageBox(m_hwnd, "This will not take effect until the next time emulation is started.\n", "Cxbx-Reloaded", MB_OK); RefreshMenus(); @@ -1347,9 +1078,8 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP case ID_EMULATION_DEBUGOUTPUTKERNEL_FILE: { - if (m_KrnlDebug == DM_FILE) - { - m_KrnlDebug = DM_NONE; + if (g_Settings->m_core.KrnlDebugMode == DM_FILE) { + g_Settings->m_core.KrnlDebugMode = DM_NONE; RefreshMenus(); @@ -1377,9 +1107,9 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP { MessageBox(m_hwnd, "This will not take effect until emulation is (re)started.\n", "Cxbx-Reloaded", MB_OK); - strncpy(m_KrnlDebugFilename, ofn.lpstrFile, MAX_PATH - 1); + strncpy(g_Settings->m_core.szKrnlDebug, ofn.lpstrFile, MAX_PATH - 1); - m_KrnlDebug = DM_FILE; + g_Settings->m_core.KrnlDebugMode = DM_FILE; RefreshMenus(); @@ -1391,11 +1121,12 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP case ID_EMULATION_DEBUGOUTPUTGUI_CONSOLE: { - if (m_CxbxDebug == DM_NONE || m_CxbxDebug == DM_FILE) - m_CxbxDebug = DM_CONSOLE; - else - m_CxbxDebug = DM_NONE; - + if (g_Settings->m_gui.CxbxDebugMode == DM_NONE || g_Settings->m_gui.CxbxDebugMode == DM_FILE) { + g_Settings->m_gui.CxbxDebugMode = DM_CONSOLE; + } + else { + g_Settings->m_gui.CxbxDebugMode = DM_NONE; + } RefreshMenus(); UpdateDebugConsoles(); @@ -1404,9 +1135,9 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP case ID_EMULATION_DEBUGOUTPUTGUI_FILE: { - if (m_CxbxDebug == DM_FILE) + if (g_Settings->m_gui.CxbxDebugMode == DM_FILE) { - m_CxbxDebug = DM_NONE; + g_Settings->m_gui.CxbxDebugMode = DM_NONE; RefreshMenus(); @@ -1432,9 +1163,9 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP if (GetSaveFileName(&ofn) != FALSE) { - strncpy(m_CxbxDebugFilename, ofn.lpstrFile, MAX_PATH - 1); + g_Settings->m_gui.szCxbxDebugFile = ofn.lpstrFile; - m_CxbxDebug = DM_FILE; + g_Settings->m_gui.CxbxDebugMode = DM_FILE; RefreshMenus(); @@ -1447,28 +1178,28 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP case ID_EMULATION_LLE_JIT: { - m_FlagsLLE = m_FlagsLLE ^ LLE_JIT; + g_Settings->m_core.FlagsLLE = g_Settings->m_core.FlagsLLE ^ LLE_JIT; RefreshMenus(); } break; case ID_EMULATION_LLE_APU: { - m_FlagsLLE = m_FlagsLLE ^ LLE_APU; + g_Settings->m_core.FlagsLLE = g_Settings->m_core.FlagsLLE ^ LLE_APU; RefreshMenus(); } break; case ID_EMULATION_LLE_GPU: { - m_FlagsLLE = m_FlagsLLE ^ LLE_GPU; + g_Settings->m_core.FlagsLLE = g_Settings->m_core.FlagsLLE ^ LLE_GPU; RefreshMenus(); } break; #if 0 // Reenable this when LLE USB actually works case ID_EMULATION_LLE_USB: { - m_FlagsLLE = m_FlagsLLE ^ LLE_USB; + g_Settings->m_core.FlagsLLE = g_Settings->m_core.FlagsLLE ^ LLE_USB; RefreshMenus(); } break; @@ -1492,32 +1223,37 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP break; case ID_HACKS_DISABLEPIXELSHADERS: - m_DisablePixelShaders = !m_DisablePixelShaders; + g_Settings->m_hacks.DisablePixelShaders = !g_Settings->m_hacks.DisablePixelShaders; RefreshMenus(); break; case ID_HACKS_UNCAPFRAMERATE: - m_UncapFramerate = !m_UncapFramerate; + g_Settings->m_hacks.UncapFramerate = !g_Settings->m_hacks.UncapFramerate; RefreshMenus(); break; case ID_HACKS_RUNXBOXTHREADSONALLCORES: - m_UseAllCores = !m_UseAllCores; + g_Settings->m_hacks.UseAllCores = !g_Settings->m_hacks.UseAllCores; RefreshMenus(); break; case ID_HACKS_SKIPRDTSCPATCHING: - m_SkipRdtscPatching = !m_SkipRdtscPatching; + g_Settings->m_hacks.SkipRdtscPatching = !g_Settings->m_hacks.SkipRdtscPatching; RefreshMenus(); break; case ID_HACKS_SCALEVIEWPORT: - m_ScaleViewport = !m_ScaleViewport; + g_Settings->m_hacks.ScaleViewport = !g_Settings->m_hacks.ScaleViewport; RefreshMenus(); break; case ID_HACKS_RENDERDIRECTLYTOHOSTBACKBUFFER: - m_DirectHostBackBufferAccess = !m_DirectHostBackBufferAccess; + g_Settings->m_hacks.DirectHostBackBufferAccess = !g_Settings->m_hacks.DirectHostBackBufferAccess; + RefreshMenus(); + break; + + case ID_SETTINGS_ALLOWADMINPRIVILEGE: + g_Settings->m_core.allowAdminPrivilege = !g_Settings->m_core.allowAdminPrivilege; RefreshMenus(); break; @@ -1713,7 +1449,7 @@ void WndMain::LoadGameLogo() } gameLogoWidth = 0; - gameLogoHeight = 0; + gameLogoHeight = 0; uint8 *ImageData = NULL; XTL::X_D3DPixelContainer XboxPixelContainer = {}; @@ -1740,7 +1476,7 @@ void WndMain::LoadGameLogo() ImageData = (uint8 *)(pSection + sizeof(DWORD) + pDDSHeader->dwSize); //gameLogoHeight = pDDSHeader->dwHeight; //gameLogoWidth = pDDSHeader->dwWidth; - + // TODO : Use PixelCopy code here to decode. For now, fake it : XTL::CxbxSetPixelContainerHeader(&XboxPixelContainer, 0, // Common - could be X_D3DCOMMON_TYPE_TEXTURE @@ -1888,36 +1624,38 @@ void WndMain::RefreshMenus() HMENU emul_debg = GetSubMenu(view_menu, 0); HMENU emul_krnl = GetSubMenu(view_menu, 1); - if (m_KrnlDebug == DM_CONSOLE) - { - CheckMenuItem(emul_krnl, ID_EMULATION_DEBUGOUTPUTKERNEL_CONSOLE, MF_CHECKED); - CheckMenuItem(emul_krnl, ID_EMULATION_DEBUGOUTPUTKERNEL_FILE, MF_UNCHECKED); - } - else if (m_KrnlDebug == DM_FILE) - { - CheckMenuItem(emul_krnl, ID_EMULATION_DEBUGOUTPUTKERNEL_CONSOLE, MF_UNCHECKED); - CheckMenuItem(emul_krnl, ID_EMULATION_DEBUGOUTPUTKERNEL_FILE, MF_CHECKED); - } - else - { - CheckMenuItem(emul_krnl, ID_EMULATION_DEBUGOUTPUTKERNEL_CONSOLE, MF_UNCHECKED); - CheckMenuItem(emul_krnl, ID_EMULATION_DEBUGOUTPUTKERNEL_FILE, MF_UNCHECKED); + switch (g_Settings->m_core.KrnlDebugMode) { + case DM_CONSOLE: + CheckMenuItem(emul_krnl, ID_EMULATION_DEBUGOUTPUTKERNEL_CONSOLE, MF_CHECKED); + CheckMenuItem(emul_krnl, ID_EMULATION_DEBUGOUTPUTKERNEL_FILE, MF_UNCHECKED); + break; + + case DM_FILE: + CheckMenuItem(emul_krnl, ID_EMULATION_DEBUGOUTPUTKERNEL_CONSOLE, MF_UNCHECKED); + CheckMenuItem(emul_krnl, ID_EMULATION_DEBUGOUTPUTKERNEL_FILE, MF_CHECKED); + break; + + default: + CheckMenuItem(emul_krnl, ID_EMULATION_DEBUGOUTPUTKERNEL_CONSOLE, MF_UNCHECKED); + CheckMenuItem(emul_krnl, ID_EMULATION_DEBUGOUTPUTKERNEL_FILE, MF_UNCHECKED); + break; } - if (m_CxbxDebug == DM_CONSOLE) - { - CheckMenuItem(emul_debg, ID_EMULATION_DEBUGOUTPUTGUI_CONSOLE, MF_CHECKED); - CheckMenuItem(emul_debg, ID_EMULATION_DEBUGOUTPUTGUI_FILE, MF_UNCHECKED); - } - else if (m_CxbxDebug == DM_FILE) - { - CheckMenuItem(emul_debg, ID_EMULATION_DEBUGOUTPUTGUI_CONSOLE, MF_UNCHECKED); - CheckMenuItem(emul_debg, ID_EMULATION_DEBUGOUTPUTGUI_FILE, MF_CHECKED); - } - else - { - CheckMenuItem(emul_debg, ID_EMULATION_DEBUGOUTPUTGUI_CONSOLE, MF_UNCHECKED); - CheckMenuItem(emul_debg, ID_EMULATION_DEBUGOUTPUTGUI_FILE, MF_UNCHECKED); + switch (g_Settings->m_gui.CxbxDebugMode) { + case DM_CONSOLE: + CheckMenuItem(emul_debg, ID_EMULATION_DEBUGOUTPUTGUI_CONSOLE, MF_CHECKED); + CheckMenuItem(emul_debg, ID_EMULATION_DEBUGOUTPUTGUI_FILE, MF_UNCHECKED); + break; + + case DM_FILE: + CheckMenuItem(emul_debg, ID_EMULATION_DEBUGOUTPUTGUI_CONSOLE, MF_UNCHECKED); + CheckMenuItem(emul_debg, ID_EMULATION_DEBUGOUTPUTGUI_FILE, MF_CHECKED); + break; + + default: + CheckMenuItem(emul_debg, ID_EMULATION_DEBUGOUTPUTGUI_CONSOLE, MF_UNCHECKED); + CheckMenuItem(emul_debg, ID_EMULATION_DEBUGOUTPUTGUI_FILE, MF_UNCHECKED); + break; } } @@ -1928,55 +1666,58 @@ void WndMain::RefreshMenus() // enable/disable clear current hle cache EnableMenuItem(settings_menu, ID_CACHE_CLEARHLECACHE_CURRENT, MF_BYCOMMAND | MF_WhenXbeLoadedNotRunning); - UINT chk_flag = (m_FlagsLLE & LLE_JIT) ? MF_CHECKED : MF_UNCHECKED; + UINT chk_flag = (g_Settings->m_core.FlagsLLE & LLE_JIT) ? MF_CHECKED : MF_UNCHECKED; CheckMenuItem(settings_menu, ID_EMULATION_LLE_JIT, chk_flag); - chk_flag = (m_FlagsLLE & LLE_APU) ? MF_CHECKED : MF_UNCHECKED; + chk_flag = (g_Settings->m_core.FlagsLLE & LLE_APU) ? MF_CHECKED : MF_UNCHECKED; CheckMenuItem(settings_menu, ID_EMULATION_LLE_APU, chk_flag); - chk_flag = (m_FlagsLLE & LLE_GPU) ? MF_CHECKED : MF_UNCHECKED; + chk_flag = (g_Settings->m_core.FlagsLLE & LLE_GPU) ? MF_CHECKED : MF_UNCHECKED; CheckMenuItem(settings_menu, ID_EMULATION_LLE_GPU, chk_flag); - //chk_flag = (m_FlagsLLE & LLE_USB) ? MF_CHECKED : MF_UNCHECKED; // Reenable this when LLE USB actually works + //chk_flag = (g_Settings->m_core.FlagsLLE & LLE_USB) ? MF_CHECKED : MF_UNCHECKED; // Reenable this when LLE USB actually works //CheckMenuItem(settings_menu, ID_EMULATION_LLE_USB, chk_flag); - chk_flag = (m_DisablePixelShaders) ? MF_CHECKED : MF_UNCHECKED; + chk_flag = (g_Settings->m_hacks.DisablePixelShaders) ? MF_CHECKED : MF_UNCHECKED; CheckMenuItem(settings_menu, ID_HACKS_DISABLEPIXELSHADERS, chk_flag); - chk_flag = (m_UncapFramerate) ? MF_CHECKED : MF_UNCHECKED; + chk_flag = (g_Settings->m_hacks.UncapFramerate) ? MF_CHECKED : MF_UNCHECKED; CheckMenuItem(settings_menu, ID_HACKS_UNCAPFRAMERATE, chk_flag); - chk_flag = (m_UseAllCores) ? MF_CHECKED : MF_UNCHECKED; + chk_flag = (g_Settings->m_hacks.UseAllCores) ? MF_CHECKED : MF_UNCHECKED; CheckMenuItem(settings_menu, ID_HACKS_RUNXBOXTHREADSONALLCORES, chk_flag); - chk_flag = (m_SkipRdtscPatching) ? MF_CHECKED : MF_UNCHECKED; + chk_flag = (g_Settings->m_hacks.SkipRdtscPatching) ? MF_CHECKED : MF_UNCHECKED; CheckMenuItem(settings_menu, ID_HACKS_SKIPRDTSCPATCHING, chk_flag); - - chk_flag = (m_ScaleViewport) ? MF_CHECKED : MF_UNCHECKED; + + chk_flag = (g_Settings->m_hacks.ScaleViewport) ? MF_CHECKED : MF_UNCHECKED; CheckMenuItem(settings_menu, ID_HACKS_SCALEVIEWPORT, chk_flag); - chk_flag = (m_DirectHostBackBufferAccess) ? MF_CHECKED : MF_UNCHECKED; + chk_flag = (g_Settings->m_hacks.DirectHostBackBufferAccess) ? MF_CHECKED : MF_UNCHECKED; CheckMenuItem(settings_menu, ID_HACKS_RENDERDIRECTLYTOHOSTBACKBUFFER, chk_flag); - //bad - switch (m_StorageToggle) - { + switch (g_Settings->m_gui.DataStorageToggle) { case CXBX_DATA_APPDATA: CheckMenuItem(settings_menu, ID_SETTINGS_CONFIG_DLOCAPPDATA, MF_CHECKED); CheckMenuItem(settings_menu, ID_SETTINGS_CONFIG_DLOCCURDIR, MF_UNCHECKED); CheckMenuItem(settings_menu, ID_SETTINGS_CONFIG_DLOCCUSTOM, MF_UNCHECKED); break; + case CXBX_DATA_CURDIR: CheckMenuItem(settings_menu, ID_SETTINGS_CONFIG_DLOCAPPDATA, MF_UNCHECKED); CheckMenuItem(settings_menu, ID_SETTINGS_CONFIG_DLOCCURDIR, MF_CHECKED); CheckMenuItem(settings_menu, ID_SETTINGS_CONFIG_DLOCCUSTOM, MF_UNCHECKED); break; + case CXBX_DATA_CUSTOM: CheckMenuItem(settings_menu, ID_SETTINGS_CONFIG_DLOCAPPDATA, MF_UNCHECKED); CheckMenuItem(settings_menu, ID_SETTINGS_CONFIG_DLOCCURDIR, MF_UNCHECKED); CheckMenuItem(settings_menu, ID_SETTINGS_CONFIG_DLOCCUSTOM, MF_CHECKED); break; } + + chk_flag = (g_Settings->m_core.allowAdminPrivilege) ? MF_CHECKED : MF_UNCHECKED; + CheckMenuItem(settings_menu, ID_SETTINGS_ALLOWADMINPRIVILEGE, chk_flag); } // emulation menu @@ -1998,37 +1739,38 @@ void WndMain::RefreshMenus() // update debug consoles void WndMain::UpdateDebugConsoles() { - if(m_CxbxDebug == DM_CONSOLE) - { - if(AllocConsole()) - { - freopen("CONOUT$", "wt", stdout); + switch (g_Settings->m_gui.CxbxDebugMode) { + case DM_CONSOLE: + if (AllocConsole()) { + freopen("CONOUT$", "wt", stdout); - SetConsoleTitle("Cxbx-Reloaded : Debug Console"); + SetConsoleTitle("Cxbx-Reloaded : Debug Console"); - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED); + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED); + + printf("%s", "WndMain: Debug console allocated.\n"); + + SetForegroundWindow(m_hwnd); + } + break; + + case DM_FILE: + + freopen(g_Settings->m_gui.szCxbxDebugFile.c_str(), "wt", stdout); + FreeConsole(); printf("%s", "WndMain: Debug console allocated.\n"); + break; - SetForegroundWindow(m_hwnd); - } - } - else if(m_CxbxDebug == DM_FILE) - { - FreeConsole(); + default: - freopen(m_CxbxDebugFilename, "wt", stdout); - - printf("%s", "WndMain: Debug console allocated.\n"); - } - else - { - FreeConsole(); - - char buffer[16]; - - if(GetConsoleTitle(buffer, 16) != NULL) + if (GetConsoleWindow() != NULL) { + fclose(stdout); + FreeConsole(); + } freopen("nul", "w", stdout); + + break; } } @@ -2063,7 +1805,7 @@ void WndMain::UpdateRecentFiles() // NOTE: Resource defines ID_FILE_RXBE_0 through ID_FILE_RXBE_9 must be in order for(int v=0;vm_gui.szRecentXbeFiles[v]); AppendMenu(RXbeMenu, MF_STRING, ID_FILE_RXBE_0 + v, szBuffer); } } @@ -2147,62 +1889,47 @@ void WndMain::OpenXbe(const char *x_filename) } // save this xbe to the list of recent xbe files - if(m_XbeFilename[0] != '\0') - { + if(m_XbeFilename[0] != '\0') { bool found = false; // if this filename already exists, temporarily remove it - for(int c=0, r=0;cm_gui.szRecentXbeFiles[c].c_str(), m_XbeFilename) == 0) { found = true; r++; } - if(r != c) - { - if(m_szRecentXbe[r] == 0 || r > m_dwRecentXbe - 1) - { - free(m_szRecentXbe[c]); - m_szRecentXbe[c] = 0; + if(r != c) { + if(g_Settings->m_gui.szRecentXbeFiles[r].c_str() == 0 || r > m_dwRecentXbe - 1) { + g_Settings->m_gui.szRecentXbeFiles[c] = ""; } - else - { - strncpy(m_szRecentXbe[c], m_szRecentXbe[r], MAX_PATH-1); + else { + g_Settings->m_gui.szRecentXbeFiles[c] = g_Settings->m_gui.szRecentXbeFiles[r]; } } } - if(found) + if (found) { m_dwRecentXbe--; + } // move all items down one, removing the last one if necessary - for(int v=RECENT_XBE_SIZE-1;v>0;v--) - { - if(m_szRecentXbe[v-1] == 0) - { - free(m_szRecentXbe[v]); - m_szRecentXbe[v] = 0; + for (int v = RECENT_XBE_LIST_MAX - 1;v > 0; v--) { + + if(g_Settings->m_gui.szRecentXbeFiles[v-1].size() == 0) { + g_Settings->m_gui.szRecentXbeFiles[v] = ""; } - else - { - if(m_szRecentXbe[v] == 0) - m_szRecentXbe[v] = (char*)calloc(1, MAX_PATH); - strncpy(m_szRecentXbe[v], m_szRecentXbe[v-1], MAX_PATH-1); + else { + g_Settings->m_gui.szRecentXbeFiles[v] = g_Settings->m_gui.szRecentXbeFiles[v - 1]; } } // add new item as first index - { - if(m_szRecentXbe[0] == 0) - m_szRecentXbe[0] = (char*)calloc(1, MAX_PATH); + g_Settings->m_gui.szRecentXbeFiles[0] = m_XbeFilename; - strcpy(m_szRecentXbe[0], m_XbeFilename); - } - - if(m_dwRecentXbe < RECENT_XBE_SIZE) + if (m_dwRecentXbe < RECENT_XBE_LIST_MAX) { m_dwRecentXbe++; + } } UpdateRecentFiles(); @@ -2276,7 +2003,7 @@ void WndMain::OpenMRU(int mru) // Open the dashboard xbe if found void WndMain::OpenDashboard() { - std::string DashboardPath = std::string(m_StorageLocation) + std::string("\\EmuDisk\\Partition2\\xboxdash.xbe"); + std::string DashboardPath = g_Settings->GetDataLocation() + std::string("\\EmuDisk\\Partition2\\xboxdash.xbe"); OpenXbe(DashboardPath.c_str()); } @@ -2349,25 +2076,11 @@ void WndMain::StartEmulation(HWND hwndParent, DebuggerState LocalDebuggerState / return; } - // Reset to default - g_EmuShared->Reset(); + // Reset to default + g_EmuShared->Reset(); - // register xbe path with emulator process - g_EmuShared->SetXbePath(m_Xbe->m_szPath); - - // register LLE flags with emulator process - g_EmuShared->SetFlagsLLE(&m_FlagsLLE); - - // register Hacks with emulator process - g_EmuShared->SetDisablePixelShaders(&m_DisablePixelShaders); - g_EmuShared->SetUncapFramerate(&m_UncapFramerate); - g_EmuShared->SetUseAllCores(&m_UseAllCores); - g_EmuShared->SetSkipRdtscPatching(&m_SkipRdtscPatching); - g_EmuShared->SetScaleViewport(&m_ScaleViewport); - g_EmuShared->SetDirectHostBackBufferAccess(&m_DirectHostBackBufferAccess); - - // register storage location with emulator process - g_EmuShared->SetStorageLocation(m_StorageLocation); + // register all emulator settings to kernel process + g_Settings->SyncToEmulator(); // Preserve previous GUI window location. HWND hOwner = GetParent(m_hwnd); @@ -2379,7 +2092,7 @@ void WndMain::StartEmulation(HWND hwndParent, DebuggerState LocalDebuggerState / m_prevWindowLoc.x = curWindowPos.left - m_prevWindowLoc.x; m_prevWindowLoc.y = curWindowPos.top - m_prevWindowLoc.y; - if (m_ScaleViewport) { + if (g_Settings->m_hacks.ScaleViewport) { // Set the window size to emulation dimensions // Note : Doing this here assures the emulation process will use // the configured dimensions (because if done inside the emulation @@ -2400,7 +2113,7 @@ void WndMain::StartEmulation(HWND hwndParent, DebuggerState LocalDebuggerState / g_EmuShared->SetDebuggingFlag(&AttachLocalDebugger); std::string szProcArgsBuffer; - XTL::CxbxConvertArgToString(szProcArgsBuffer, szExeFileName, m_XbeFilename, hwndParent, m_KrnlDebug, m_KrnlDebugFilename); + XTL::CxbxConvertArgToString(szProcArgsBuffer, szExeFileName, m_XbeFilename, hwndParent, g_Settings->m_core.KrnlDebugMode, g_Settings->m_core.szKrnlDebug); if (AttachLocalDebugger) { @@ -2584,7 +2297,7 @@ void WndMain::DrawLedBitmap(HWND hwnd, bool bdefault) else { // draw colored bitmap int LedSequence[4] = { XBOX_LED_COLOUR_OFF, XBOX_LED_COLOUR_OFF, XBOX_LED_COLOUR_OFF, XBOX_LED_COLOUR_OFF }; static int LedSequenceOffset = 0; - int FlagsLLE = 0; + uint FlagsLLE = 0; g_EmuShared->GetLedSequence(LedSequence); @@ -2592,7 +2305,7 @@ void WndMain::DrawLedBitmap(HWND hwnd, bool bdefault) ActiveLEDColor = LedSequence[LedSequenceOffset & 3]; ++LedSequenceOffset; - g_EmuShared->GetFlagsLLE(&FlagsLLE); + g_EmuShared->GetFlagsLLEStatus(&FlagsLLE); // Set LLE flags string based on selected LLE flags if (FlagsLLE & LLE_APU) { strcat(flagString, "A"); diff --git a/src/Cxbx/WndMain.h b/src/Cxbx/WndMain.h index 2b3522d6e..52ef6dc3e 100644 --- a/src/Cxbx/WndMain.h +++ b/src/Cxbx/WndMain.h @@ -42,14 +42,7 @@ // ****************************************************************** // * constants // ****************************************************************** -#define RECENT_XBE_SIZE 10 - -// Cxbx-Reloaded's data storage location. -typedef enum _CXBX_DATA { - CXBX_DATA_APPDATA = 0, - CXBX_DATA_CURDIR = 1, - CXBX_DATA_CUSTOM = 2, -} CXBX_DATA; +#define RECENT_XBE_LIST_MAX 10 typedef struct _Crash_Manager_Data { LPVOID pWndMain; @@ -205,7 +198,7 @@ class WndMain : public Wnd // ****************************************************************** // * cached filenames // ****************************************************************** - char *m_XbeFilename; + char m_XbeFilename[MAX_PATH]; // ****************************************************************** // * cached window, process, and thread handle @@ -218,50 +211,11 @@ class WndMain : public Wnd // * Recent Xbe files // ****************************************************************** int m_dwRecentXbe; - char *m_szRecentXbe[RECENT_XBE_SIZE]; // ****************************************************************** // * is this window fully initialized? // ****************************************************************** - bool m_bCreated; - - // ****************************************************************** - // * current debug mode type - // ****************************************************************** - DebugMode m_CxbxDebug; - DebugMode m_KrnlDebug; - - // ****************************************************************** - // * LLE flags - // ****************************************************************** - int m_FlagsLLE; - - // ****************************************************************** - // * XInput Enabled Flag - // ****************************************************************** - int m_XInputEnabled; - - // ****************************************************************** - // * Hack Flags - // ****************************************************************** - int m_DisablePixelShaders; - int m_UncapFramerate; - int m_UseAllCores; - int m_SkipRdtscPatching; - int m_ScaleViewport; - int m_DirectHostBackBufferAccess; - - // ****************************************************************** - // * debug output filenames - // ****************************************************************** - char *m_CxbxDebugFilename; - char *m_KrnlDebugFilename; - - // ****************************************************************** - // * Storage location - // ****************************************************************** - CXBX_DATA m_StorageToggle; - char m_StorageLocation[MAX_PATH]; + bool m_bCreated; // ****************************************************************** // * Previous GUI window location (before start emulation) diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index 9b14e696c..3d2ea6067 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -53,16 +53,15 @@ namespace xboxkrnl #include "EmuEEPROM.h" // For CxbxRestoreEEPROM, EEPROM, XboxFactoryGameRegion #include "EmuKrnl.h" #include "EmuShared.h" +#include "EmuXTL.h" #include "HLEIntercept.h" #include "ReservedMemory.h" // For virtual_memory_placeholder #include "VMManager.h" #include "CxbxDebugger.h" #include "EmuX86.h" -#include #include #include -#include #include // For time() #include // For std::ostringstream @@ -97,6 +96,7 @@ char szFolder_CxbxReloadedData[MAX_PATH] = { 0 }; char szFilePath_EEPROM_bin[MAX_PATH] = { 0 }; char szFilePath_memory_bin[MAX_PATH] = { 0 }; char szFilePath_page_tables[MAX_PATH] = { 0 }; +char szFilePath_Xbe[MAX_PATH] = { 0 }; std::string CxbxBasePath; HANDLE CxbxBasePathHandle; @@ -577,27 +577,27 @@ void PrintCurrentConfigurationLog() // Print current video configuration (DirectX/HLE) if (!bLLE_GPU) { - XBVideo XBVideoConf; - g_EmuShared->GetXBVideo(&XBVideoConf); + Settings::s_video XBVideoConf; + g_EmuShared->GetVideoSettings(&XBVideoConf); printf("--------------------------- VIDEO CONFIG ---------------------------\n"); - printf("Direct3D Device: %s\n", XBVideoConf.GetDirect3DDevice() == 0 ? "Direct3D HAL (Hardware Accelerated)" : "Direct3D REF (Software)"); - printf("Video Resolution: %s\n", XBVideoConf.GetVideoResolution()); - printf("Force VSync is %s\n", XBVideoConf.GetVSync() ? "enabled" : "disabled"); - printf("Fullscreen is %s\n", XBVideoConf.GetFullscreen() ? "enabled" : "disabled"); - printf("Hardware YUV is %s\n", XBVideoConf.GetHardwareYUV() ? "enabled" : "disabled"); + printf("Direct3D Device: %s\n", XBVideoConf.direct3DDevice == 0 ? "Direct3D HAL (Hardware Accelerated)" : "Direct3D REF (Software)"); + printf("Video Resolution: %s\n", XBVideoConf.szVideoResolution); + printf("Force VSync is %s\n", XBVideoConf.bVSync ? "enabled" : "disabled"); + printf("Fullscreen is %s\n", XBVideoConf.bFullScreen ? "enabled" : "disabled"); + printf("Hardware YUV is %s\n", XBVideoConf.bHardwareYUV ? "enabled" : "disabled"); } // Print current audio configuration { - XBAudio XBAudioConf; - g_EmuShared->GetXBAudio(&XBAudioConf); + Settings::s_audio XBAudioConf; + g_EmuShared->GetAudioSettings(&XBAudioConf); printf("--------------------------- AUDIO CONFIG ---------------------------\n"); - printf("Audio Adapter: %s\n", XBAudioConf.GetAudioAdapter().Data1 == 0 ? "Primary Audio Device" : "Secondary Audio Device"); - printf("PCM is %s\n", XBAudioConf.GetPCM() ? "enabled" : "disabled"); - printf("XADPCM is %s\n", XBAudioConf.GetXADPCM() ? "enabled" : "disabled"); - printf("Unknown Codec is %s\n", XBAudioConf.GetUnknownCodec() ? "enabled" : "disabled"); + printf("Audio Adapter: %s\n", XBAudioConf.adapterGUID.Data1 == 0 ? "Primary Audio Device" : "Secondary Audio Device"); + printf("PCM is %s\n", XBAudioConf.codec_pcm ? "enabled" : "disabled"); + printf("XADPCM is %s\n", XBAudioConf.codec_xadpcm ? "enabled" : "disabled"); + printf("Unknown Codec is %s\n", XBAudioConf.codec_unknown ? "enabled" : "disabled"); } // Print Enabled Hacks @@ -868,13 +868,13 @@ void CxbxKrnlMain(int argc, char* argv[]) // Get DCHandle : HWND hWnd = 0; if (argc > 2) { - hWnd = (HWND)StrToInt(argv[3]); + hWnd = (HWND)std::atoi(argv[3]); } // Get KernelDebugMode : DebugMode DbgMode = DebugMode::DM_NONE; if (argc > 3) { - DbgMode = (DebugMode)StrToInt(argv[4]); + DbgMode = (DebugMode)std::atoi(argv[4]); } // Get KernelDebugFileName : @@ -1077,9 +1077,9 @@ void CxbxKrnlMain(int argc, char* argv[]) // Now we can load and run the XBE : // MapAndRunXBE(XbePath, DCHandle); { - // Load Xbe (this one will reside above WinMain's virtual_memory_placeholder) - g_EmuShared->SetXbePath(xbePath.c_str()); - CxbxKrnl_Xbe = new Xbe(xbePath.c_str(), false); // TODO : Instead of using the Xbe class, port Dxbx _ReadXbeBlock() + strncpy(szFilePath_Xbe, xbePath.c_str(), MAX_PATH - 1); + // Load Xbe (this one will reside above WinMain's virtual_memory_placeholder) + CxbxKrnl_Xbe = new Xbe(szFilePath_Xbe, false); // TODO : Instead of using the Xbe class, port Dxbx _ReadXbeBlock() if (CxbxKrnl_Xbe->HasFatalError()) { CxbxKrnlCleanup(CxbxKrnl_Xbe->GetError().c_str()); @@ -1303,8 +1303,8 @@ __declspec(noreturn) void CxbxKrnlInit // Read which components need to be LLE'ed : { - int CxbxLLE_Flags; - g_EmuShared->GetFlagsLLE(&CxbxLLE_Flags); + uint CxbxLLE_Flags; + g_EmuShared->GetFlagsLLEStatus(&CxbxLLE_Flags); bLLE_APU = (CxbxLLE_Flags & LLE_APU) > 0; bLLE_GPU = (CxbxLLE_Flags & LLE_GPU) > 0; //bLLE_USB = (CxbxLLE_Flags & LLE_USB) > 0; // Reenable this when LLE USB actually works @@ -1340,10 +1340,10 @@ __declspec(noreturn) void CxbxKrnlInit // Determine XBE Path memset(szBuffer, 0, MAX_PATH); - g_EmuShared->GetXbePath(szBuffer); + strncpy(szBuffer, szFilePath_Xbe, MAX_PATH); std::string xbePath(szBuffer); - PathRemoveFileSpec(szBuffer); std::string xbeDirectory(szBuffer); + xbeDirectory = xbeDirectory.substr(0, xbeDirectory.find_last_of("\\/")); CxbxBasePathHandle = CreateFile(CxbxBasePath.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); memset(szBuffer, 0, MAX_PATH); // Games may assume they are running from CdRom : @@ -1538,15 +1538,15 @@ void CxbxInitFilePaths() g_EmuShared->GetStorageLocation(szFolder_CxbxReloadedData); // Make sure our data folder exists : - int result = SHCreateDirectoryEx(nullptr, szFolder_CxbxReloadedData, nullptr); - if ((result != ERROR_SUCCESS) && (result != ERROR_ALREADY_EXISTS)) { - CxbxKrnlCleanup("CxbxInitFilePaths : Couldn't create Cxbx-Reloaded AppData folder!"); + bool result = std::filesystem::exists(szFolder_CxbxReloadedData); + if (!result && !std::filesystem::create_directory(szFolder_CxbxReloadedData)) { + CxbxKrnlCleanup("CxbxInitFilePaths : Couldn't create Cxbx-Reloaded's data folder!"); } // Make sure the EmuDisk folder exists std::string emuDisk = std::string(szFolder_CxbxReloadedData) + std::string("\\EmuDisk"); - result = SHCreateDirectoryEx(nullptr, emuDisk.c_str(), nullptr); - if ((result != ERROR_SUCCESS) && (result != ERROR_ALREADY_EXISTS)) { + result = std::filesystem::exists(emuDisk); + if (!result && !std::filesystem::create_directory(emuDisk)) { CxbxKrnlCleanup("CxbxInitFilePaths : Couldn't create Cxbx-Reloaded EmuDisk folder!"); } diff --git a/src/CxbxKrnl/CxbxKrnl.h b/src/CxbxKrnl/CxbxKrnl.h index 9bf123098..0fd6810a8 100644 --- a/src/CxbxKrnl/CxbxKrnl.h +++ b/src/CxbxKrnl/CxbxKrnl.h @@ -308,6 +308,7 @@ extern std::string CxbxKrnl_DebugFileName; extern char szFilePath_CxbxReloaded_Exe[MAX_PATH]; extern char szFolder_CxbxReloadedData[MAX_PATH]; extern char szFilePath_EEPROM_bin[MAX_PATH]; +extern char szFilePath_Xbe[MAX_PATH]; #ifdef __cplusplus } diff --git a/src/CxbxKrnl/EmuD3D8.cpp b/src/CxbxKrnl/EmuD3D8.cpp index 1ea04cd95..23e323ab3 100644 --- a/src/CxbxKrnl/EmuD3D8.cpp +++ b/src/CxbxKrnl/EmuD3D8.cpp @@ -58,7 +58,7 @@ namespace xboxkrnl #include "Logging.h" #include "EmuD3D8Logging.h" #include "HLEIntercept.h" // for bLLE_GPU -#include "Cxbx\\ResCxbx.h" +#include "Cxbx/ResCxbx.h" #include #include @@ -102,7 +102,7 @@ static XTL::LPDIRECTDRAW7 g_pDD7 = NULL; // DirectDraw7 static XTL::DDCAPS g_DriverCaps = { 0 }; static HBRUSH g_hBgBrush = NULL; // Background Brush static volatile bool g_bRenderWindowActive = false; -static XBVideo g_XBVideo; +static Settings::s_video g_XBVideo; static XTL::D3DVBLANKCALLBACK g_pVBCallback = NULL; // Vertical-Blank callback routine static std::condition_variable g_VBConditionVariable; // Used in BlockUntilVerticalBlank static std::mutex g_VBConditionMutex; // Used in BlockUntilVerticalBlank @@ -485,9 +485,9 @@ const char *D3DErrorString(HRESULT hResult) VOID XTL::CxbxInitWindow(bool bFullInit) { - g_EmuShared->GetXBVideo(&g_XBVideo); + g_EmuShared->GetVideoSettings(&g_XBVideo); - if(g_XBVideo.GetFullscreen()) + if(g_XBVideo.bFullScreen) CxbxKrnl_hEmuParent = NULL; // create timing thread @@ -1342,8 +1342,8 @@ VOID XTL::EmuD3DInit() // Initialise CreateDevice Proxy Data struct { g_EmuCDPD = {0}; - g_EmuCDPD.Adapter = g_XBVideo.GetDisplayAdapter(); - g_EmuCDPD.DeviceType = (g_XBVideo.GetDirect3DDevice() == 0) ? D3DDEVTYPE_HAL : D3DDEVTYPE_REF; + g_EmuCDPD.Adapter = g_XBVideo.adapter; + g_EmuCDPD.DeviceType = (g_XBVideo.direct3DDevice == 0) ? D3DDEVTYPE_HAL : D3DDEVTYPE_REF; g_EmuCDPD.hFocusWindow = g_hEmuWindow; } @@ -1422,15 +1422,31 @@ static DWORD WINAPI EmuRenderWindow(LPVOID lpVoid) // create the window { - HWND hwndParent = GetDesktopWindow(); - DWORD dwStyle = WS_POPUP; + // Peform selection if running in GUI or kernel mode first. + HWND hwndParent = (!CxbxKrnl_hEmuParent ? GetDesktopWindow() : CxbxKrnl_hEmuParent); + DWORD dwStyle = WS_POPUP; RECT windowRect = { 0 }; - if (!g_XBVideo.GetFullscreen()) { - hwndParent = CxbxKrnl_hEmuParent; - GetWindowRect(hwndParent, &windowRect); - dwStyle = (CxbxKrnl_hEmuParent == 0) ? WS_OVERLAPPEDWINDOW : WS_CHILD; - } + // Obtain the selected resolution from GUI or full desktop screen in kernel mode. + if (!GetWindowRect(hwndParent, &windowRect)) { + // Fall back resolution if failed + windowRect = { 0, 0, 640, 480 }; + } + + // Then perform additional checks if not running in full screen. + if (!g_XBVideo.bFullScreen) { + + // If running as kernel mode, force use the xbox's default resolution. + if (!CxbxKrnl_hEmuParent) { + // Xbox default resolution (standalone window is resizable by the way) + windowRect.right = 640; + windowRect.bottom = 480; + dwStyle = WS_OVERLAPPEDWINDOW; + } + else { + dwStyle = WS_CHILD; + } + } g_hEmuWindow = CreateWindow ( @@ -1444,10 +1460,10 @@ static DWORD WINAPI EmuRenderWindow(LPVOID lpVoid) ); } - ShowWindow(g_hEmuWindow, ((CxbxKrnl_hEmuParent == 0) || g_XBVideo.GetFullscreen()) ? SW_SHOWDEFAULT : SW_SHOWMAXIMIZED); + ShowWindow(g_hEmuWindow, ((CxbxKrnl_hEmuParent == 0) || g_XBVideo.bFullScreen) ? SW_SHOWDEFAULT : SW_SHOWMAXIMIZED); UpdateWindow(g_hEmuWindow); - if(!g_XBVideo.GetFullscreen() && (CxbxKrnl_hEmuParent != NULL)) + if(!g_XBVideo.bFullScreen && (CxbxKrnl_hEmuParent != NULL)) { SetFocus(CxbxKrnl_hEmuParent); } @@ -1511,7 +1527,7 @@ static DWORD WINAPI EmuRenderWindow(LPVOID lpVoid) // simple helper function void ToggleFauxFullscreen(HWND hWnd) { - if(g_XBVideo.GetFullscreen()) + if(g_XBVideo.bFullScreen) return; static LONG lRestore = 0, lRestoreEx = 0; @@ -1599,7 +1615,7 @@ static LRESULT WINAPI EmuMsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPar /*! disable fullscreen if we are set to faux mode, and faux fullscreen is active */ if(wParam == VK_ESCAPE) { - if(g_XBVideo.GetFullscreen()) + if(g_XBVideo.bFullScreen) { SendMessage(hWnd, WM_CLOSE, 0, 0); } @@ -1647,7 +1663,7 @@ static LRESULT WINAPI EmuMsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPar case SIZE_MINIMIZED: { - if(g_XBVideo.GetFullscreen()) + if(g_XBVideo.bFullScreen) CxbxKrnlCleanup(NULL); if(!g_bEmuSuspended) @@ -1676,7 +1692,7 @@ static LRESULT WINAPI EmuMsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPar case WM_SETCURSOR: { - if(g_XBVideo.GetFullscreen() || g_bIsFauxFullscreen) + if(g_XBVideo.bFullScreen || g_bIsFauxFullscreen) { SetCursor(NULL); return D3D_OK; // = 0 @@ -1939,9 +1955,9 @@ static DWORD WINAPI EmuCreateDeviceProxy(LPVOID) // make adjustments to parameters to make sense with windows Direct3D { - g_EmuCDPD.HostPresentationParameters.Windowed = !g_XBVideo.GetFullscreen(); + g_EmuCDPD.HostPresentationParameters.Windowed = !g_XBVideo.bFullScreen; - if(g_XBVideo.GetVSync()) + if(g_XBVideo.bVSync) #ifdef CXBX_USE_D3D9 g_EmuCDPD.HostPresentationParameters.SwapEffect = XTL::D3DSWAPEFFECT_COPY; #else @@ -1951,11 +1967,11 @@ static DWORD WINAPI EmuCreateDeviceProxy(LPVOID) g_EmuCDPD.HostPresentationParameters.BackBufferFormat = XTL::EmuXB2PC_D3DFormat(g_EmuCDPD.XboxPresentationParameters.BackBufferFormat); g_EmuCDPD.HostPresentationParameters.AutoDepthStencilFormat = XTL::EmuXB2PC_D3DFormat(g_EmuCDPD.XboxPresentationParameters.AutoDepthStencilFormat); - if(!g_XBVideo.GetVSync() && (g_D3DCaps.PresentationIntervals & D3DPRESENT_INTERVAL_IMMEDIATE) && g_XBVideo.GetFullscreen()) + if(!g_XBVideo.bVSync && (g_D3DCaps.PresentationIntervals & D3DPRESENT_INTERVAL_IMMEDIATE) && g_XBVideo.bFullScreen) g_EmuCDPD.HostPresentationParameters.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; else { - if(g_D3DCaps.PresentationIntervals & D3DPRESENT_INTERVAL_ONE && g_XBVideo.GetFullscreen()) + if(g_D3DCaps.PresentationIntervals & D3DPRESENT_INTERVAL_ONE && g_XBVideo.bFullScreen) g_EmuCDPD.HostPresentationParameters.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_ONE; else g_EmuCDPD.HostPresentationParameters.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; @@ -1996,7 +2012,7 @@ static DWORD WINAPI EmuCreateDeviceProxy(LPVOID) // retrieve resolution from configuration if(g_EmuCDPD.HostPresentationParameters.Windowed) { - const char* resolution = g_XBVideo.GetVideoResolution(); + const char* resolution = g_XBVideo.szVideoResolution; if (2 != sscanf(resolution, "%u x %u", &g_EmuCDPD.HostPresentationParameters.BackBufferWidth, &g_EmuCDPD.HostPresentationParameters.BackBufferHeight)) { DbgPrintf("EmuCreateDeviceProxy: Couldn't parse resolution : %s.\n", resolution); } @@ -2018,7 +2034,7 @@ static DWORD WINAPI EmuCreateDeviceProxy(LPVOID) { char szBackBufferFormat[16] = {}; - const char* resolution = g_XBVideo.GetVideoResolution(); + const char* resolution = g_XBVideo.szVideoResolution; if (4 != sscanf(resolution, "%u x %u %*dbit %s (%u hz)", &g_EmuCDPD.HostPresentationParameters.BackBufferWidth, &g_EmuCDPD.HostPresentationParameters.BackBufferHeight, diff --git a/src/CxbxKrnl/EmuDInput.cpp b/src/CxbxKrnl/EmuDInput.cpp index c470ef56f..7edb39053 100644 --- a/src/CxbxKrnl/EmuDInput.cpp +++ b/src/CxbxKrnl/EmuDInput.cpp @@ -40,22 +40,23 @@ #include "Emu.h" #include "EmuXTL.h" #include "EmuShared.h" +#include "Common/Win32/DInputController.h" // ****************************************************************** // * Static Variable(s) // ****************************************************************** -static XBController g_XBController; +static DInputController g_DInputController; // ****************************************************************** // * XTL::EmuDInputInit // ****************************************************************** bool XTL::EmuDInputInit() { - g_EmuShared->GetXBController(&g_XBController); + g_EmuShared->GetControllerDInputSettings(&g_DInputController.m_settings); - g_XBController.ListenBegin(g_hEmuWindow); + g_DInputController.ListenBegin(g_hEmuWindow); - if(g_XBController.HasError()) + if(g_DInputController.HasError()) return false; return true; @@ -66,7 +67,7 @@ bool XTL::EmuDInputInit() // ****************************************************************** void XTL::EmuDInputCleanup() { - g_XBController.ListenEnd(); + g_DInputController.ListenEnd(); } //emulated dwPacketNumber for DirectInput controller @@ -77,13 +78,13 @@ DWORD dwPacketNumber_DirectInput = 0; // ****************************************************************** void XTL::EmuDInputPoll(XTL::PX_XINPUT_STATE pXboxController) { - g_XBController.ListenPoll(pXboxController); + g_DInputController.ListenPoll(pXboxController); //increment of emulated PacketNumber and report back to Controller. dwPacketNumber_DirectInput++; pXboxController->dwPacketNumber = dwPacketNumber_DirectInput; - if(g_XBController.HasError()) - MessageBox(NULL, g_XBController.GetError().c_str(), "Cxbx-Reloaded [*UNHANDLED!*]", MB_OK); // TODO: Handle this! + if(g_DInputController.HasError()) + MessageBox(NULL, g_DInputController.GetError().c_str(), "Cxbx-Reloaded [*UNHANDLED!*]", MB_OK); // TODO: Handle this! return; } diff --git a/src/CxbxKrnl/EmuDSound.cpp b/src/CxbxKrnl/EmuDSound.cpp index 1837ad5c0..40f2d5167 100755 --- a/src/CxbxKrnl/EmuDSound.cpp +++ b/src/CxbxKrnl/EmuDSound.cpp @@ -51,6 +51,7 @@ namespace xboxkrnl { #include "EmuFS.h" #include "EmuShared.h" #include "EmuXTL.h" +#include "Common/Settings.hpp" #ifndef _DEBUG_TRACE @@ -194,7 +195,7 @@ XTL::X_XFileMediaObject::_vtbl XTL::X_XFileMediaObject::vtbl = #define vector_ds_stream std::vector // Static Variable(s) -XBAudio g_XBAudio = XBAudio(); +static Settings::s_audio g_XBAudio = { 0 }; extern LPDIRECTSOUND8 g_pDSound8 = nullptr; //This is necessary in order to allow share with EmuDSoundInline.hpp static LPDIRECTSOUNDBUFFER g_pDSoundPrimaryBuffer = nullptr; //TODO: RadWolfie - How to implement support if primary does not permit it for DSP usage? @@ -228,7 +229,7 @@ extern "C" { void CxbxInitAudio() { - g_EmuShared->GetXBAudio(&g_XBAudio); + g_EmuShared->GetAudioSettings(&g_XBAudio); } #ifdef __cplusplus @@ -269,7 +270,7 @@ HRESULT WINAPI XTL::EMUPATCH(DirectSoundCreate) g_bDSoundCreateCalled = TRUE; if (!initialized || g_pDSound8 == nullptr) { - hRet = DirectSoundCreate8(&g_XBAudio.GetAudioAdapter(), &g_pDSound8, NULL); + hRet = DirectSoundCreate8(&g_XBAudio.adapterGUID, &g_pDSound8, NULL); LPCSTR dsErrorMsg = nullptr; diff --git a/src/CxbxKrnl/EmuDSoundInline.hpp b/src/CxbxKrnl/EmuDSoundInline.hpp index 7bcb9c4b5..b680091bb 100644 --- a/src/CxbxKrnl/EmuDSoundInline.hpp +++ b/src/CxbxKrnl/EmuDSoundInline.hpp @@ -1714,15 +1714,15 @@ inline HRESULT HybridDirectSoundBuffer_SetVolume( lVolume += Xb_volumeMixbin - Xb_dwHeadroom; if ((dwEmuFlags & DSE_FLAG_PCM) > 0) { - if (!g_XBAudio.GetPCM()) { + if (!g_XBAudio.codec_pcm) { lVolume = DSBVOLUME_MIN; } } else if ((dwEmuFlags & DSE_FLAG_XADPCM) > 0) { - if (!g_XBAudio.GetXADPCM()) { + if (!g_XBAudio.codec_xadpcm) { lVolume = DSBVOLUME_MIN; } } else if ((dwEmuFlags & DSE_FLAG_PCM_UNKNOWN) > 0) { - if (!g_XBAudio.GetUnknownCodec()) { + if (!g_XBAudio.codec_unknown) { lVolume = DSBVOLUME_MIN; } } diff --git a/src/CxbxKrnl/EmuKrnlHal.cpp b/src/CxbxKrnl/EmuKrnlHal.cpp index e4d5628ed..e76625b43 100644 --- a/src/CxbxKrnl/EmuKrnlHal.cpp +++ b/src/CxbxKrnl/EmuKrnlHal.cpp @@ -601,14 +601,11 @@ XBSYSAPI EXPORTNUM(49) xboxkrnl::VOID DECLSPEC_NORETURN NTAPI xboxkrnl::HalRetur xboxkrnl::HalWriteSMBusValue(SMBUS_ADDRESS_SYSTEM_MICRO_CONTROLLER, SMC_COMMAND_SCRATCH, 0, SMC_SCRATCH_DISPLAY_FATAL_ERROR); - char szWorkingDirectoy[MAX_PATH]; - g_EmuShared->GetXbePath(szWorkingDirectoy); - std::string szProcArgsBuffer; - CxbxConvertArgToString(szProcArgsBuffer, szFilePath_CxbxReloaded_Exe, szWorkingDirectoy, CxbxKrnl_hEmuParent, CxbxKrnl_DebugMode, CxbxKrnl_DebugFileName.c_str()); + CxbxConvertArgToString(szProcArgsBuffer, szFilePath_CxbxReloaded_Exe, szFilePath_Xbe, CxbxKrnl_hEmuParent, CxbxKrnl_DebugMode, CxbxKrnl_DebugFileName.c_str()); if (!CxbxExec(szProcArgsBuffer, nullptr, false)) { - CxbxKrnlCleanup("Could not launch %s", szWorkingDirectoy); + CxbxKrnlCleanup("Could not launch %s", szFilePath_Xbe); } break; } diff --git a/src/CxbxKrnl/EmuShared.h b/src/CxbxKrnl/EmuShared.h index 3c78f8b40..e4a035af5 100644 --- a/src/CxbxKrnl/EmuShared.h +++ b/src/CxbxKrnl/EmuShared.h @@ -34,10 +34,9 @@ #ifndef EMUSHARED_H #define EMUSHARED_H -#include "Cxbx.h" -#include "Common/Win32/XBController.h" -#include "Common/Win32/XBVideo.h" -#include "Common/Win32/XBAudio.h" +#include "Cxbx.h" +#include "Common/Settings.hpp" +#include "Mutex.h" #include @@ -46,13 +45,6 @@ enum { XBOX_LED_COLOUR_GREEN, XBOX_LED_COLOUR_RED, XBOX_LED_COLOUR_ORANGE, -}; - -enum { - LLE_APU = 1 << 0, - LLE_GPU = 1 << 1, - LLE_JIT = 1 << 2, - LLE_USB = 1 << 3, }; // Kernel boot flags @@ -76,10 +68,7 @@ class EmuShared : public Mutex // ****************************************************************** // * Each process needs to call this to initialize shared memory // ****************************************************************** - static void Init(); - - void Load(); - void Save(); + static void Init(DWORD guiProcessID); // ****************************************************************** // * Each process needs to call this to cleanup shared memory @@ -90,95 +79,102 @@ class EmuShared : public Mutex // * Check if shared memory is used on launch // ****************************************************************** void GetIsFirstLaunch(bool *isFirstLaunch) { Lock(); *isFirstLaunch = m_bFirstLaunch; Unlock(); } - void SetIsFirstLaunch(bool isFirstLaunch) { Lock(); m_bFirstLaunch = isFirstLaunch; Unlock(); } + void SetIsFirstLaunch(const bool isFirstLaunch) { Lock(); m_bFirstLaunch = isFirstLaunch; Unlock(); } // ****************************************************************** // * Check if parent process is emulating title // ****************************************************************** - void GetIsEmulating(bool *isEmulating) { Lock(); *isEmulating = m_bEmulating; Unlock(); } - void SetIsEmulating(bool isEmulating) { Lock(); m_bEmulating = isEmulating; Unlock(); } + void GetIsEmulating(bool *isEmulating) { Lock(); *isEmulating = m_bEmulating_status; Unlock(); } + void SetIsEmulating(const bool isEmulating) { Lock(); m_bEmulating_status = isEmulating; Unlock(); } // ****************************************************************** // * Each child process need to wait until parent process is ready // ****************************************************************** - void GetIsReady(bool *isReady) { Lock(); *isReady = m_bReady; Unlock(); } - void SetIsReady(bool isReady) { Lock(); m_bReady = isReady; Unlock(); } + void GetIsReady(bool *isReady) { Lock(); *isReady = m_bReady_status; Unlock(); } + void SetIsReady(const bool isReady) { Lock(); m_bReady_status = isReady; Unlock(); } // ****************************************************************** // * Check if previous kernel mode process is running. // ****************************************************************** void GetKrnlProcID(unsigned int *krnlProcID) { Lock(); *krnlProcID = m_dwKrnlProcID; Unlock(); } - void SetKrnlProcID(unsigned int krnlProcID) { Lock(); m_dwKrnlProcID = krnlProcID; Unlock(); } + void SetKrnlProcID(const unsigned int krnlProcID) { Lock(); m_dwKrnlProcID = krnlProcID; Unlock(); } + + // ****************************************************************** + // * Xbox Core Accessors + // ****************************************************************** + void GetCoreSettings( Settings::s_core *emulate) { Lock(); *emulate = m_core; Unlock(); } + void SetCoreSettings(const Settings::s_core *emulate) { Lock(); m_core = *emulate; Unlock(); } // ****************************************************************** // * Xbox Video Accessors // ****************************************************************** - void GetXBVideo( XBVideo *video) { Lock(); *video = XBVideo(m_XBVideo); Unlock(); } - void SetXBVideo(const XBVideo *video) { Lock(); m_XBVideo = XBVideo(*video); Unlock(); } + void GetVideoSettings( Settings::s_video *video) { Lock(); *video = m_video; Unlock(); } + void SetVideoSettings(const Settings::s_video *video) { Lock(); m_video = *video; Unlock(); } // ****************************************************************** // * Xbox Audio Accessors // ****************************************************************** - void GetXBAudio( XBAudio *audio) { Lock(); *audio = XBAudio(m_XBAudio); Unlock(); } - void SetXBAudio(const XBAudio *audio) { Lock(); m_XBAudio = XBAudio(*audio); Unlock(); } + void GetAudioSettings( Settings::s_audio *audio) { Lock(); *audio = m_audio; Unlock(); } + void SetAudioSettings(const Settings::s_audio *audio) { Lock(); m_audio = *audio; Unlock(); } // ****************************************************************** // * Xbox Controller Accessors // ****************************************************************** - void GetXBController( XBController *ctrl) { Lock(); *ctrl = XBController(m_XBController); Unlock(); } - void SetXBController(const XBController *ctrl) { Lock(); m_XBController = XBController(*ctrl); Unlock(); } - - // ****************************************************************** - // * Xbe Path Accessors - // ****************************************************************** - void GetXbePath( char *path) { Lock(); strcpy(path, m_XbePath); Unlock(); } - void SetXbePath(const char *path) { Lock(); strcpy(m_XbePath, path); Unlock(); } + void GetControllerDInputSettings( Settings::s_controller_dinput *ctrl) { Lock(); *ctrl = m_controller_dinput; Unlock(); } + void SetControllerDInputSettings(const Settings::s_controller_dinput *ctrl) { Lock(); m_controller_dinput = *ctrl; Unlock(); } + void GetControllerPortSettings( Settings::s_controller_port *ctrl) { Lock(); *ctrl = m_controller_port; Unlock(); } + void SetControllerPortSettings(const Settings::s_controller_port *ctrl) { Lock(); m_controller_port = *ctrl; Unlock(); } // ****************************************************************** // * LLE Flags Accessors // ****************************************************************** - void GetFlagsLLE( int *flags) { Lock(); *flags = m_FlagsLLE; Unlock(); } - void SetFlagsLLE(const int *flags) { Lock(); m_FlagsLLE = *flags; Unlock(); } + void GetFlagsLLE( uint *flags) { Lock(); *flags = m_core.FlagsLLE; Unlock(); } + void SetFlagsLLE(const uint *flags) { Lock(); m_core.FlagsLLE = *flags; Unlock(); } + void GetFlagsLLEStatus( uint *flags) { Lock(); *flags = m_FlagsLLE_status; Unlock(); } + void SetFlagsLLEStatus(const uint flags) { Lock(); m_FlagsLLE_status = flags; Unlock(); } // ****************************************************************** // * Boot flag Accessors // ****************************************************************** - void GetBootFlags(int *value) { Lock(); *value = m_BootFlags; Unlock(); } - void SetBootFlags(int *value) { Lock(); m_BootFlags = *value; Unlock(); } + void GetBootFlags(int *value) { Lock(); *value = m_BootFlags_status; Unlock(); } + void SetBootFlags(const int *value) { Lock(); m_BootFlags_status = *value; Unlock(); } // ****************************************************************** // * Hack Flag Accessors - // ****************************************************************** - void GetDisablePixelShaders(int* value) { Lock(); *value = m_DisablePixelShaders; Unlock(); } - void SetDisablePixelShaders(int* value) { Lock(); m_DisablePixelShaders = *value; Unlock(); } - void GetUncapFramerate(int* value) { Lock(); *value = m_UncapFramerate; Unlock(); } - void SetUncapFramerate(int* value) { Lock(); m_UncapFramerate = *value; Unlock(); } - void GetUseAllCores(int* value) { Lock(); *value = m_UseAllCores; Unlock(); } - void SetUseAllCores(int* value) { Lock(); m_UseAllCores = *value; Unlock(); } - void GetSkipRdtscPatching(int* value) { Lock(); *value = m_SkipRdtscPatching; Unlock(); } - void SetSkipRdtscPatching(int* value) { Lock(); m_SkipRdtscPatching = *value; Unlock(); } - void GetScaleViewport(int* value) { Lock(); *value = m_ScaleViewport; Unlock(); } - void SetScaleViewport(int* value) { Lock(); m_ScaleViewport = *value; Unlock(); } - void GetDirectHostBackBufferAccess(int* value) { Lock(); *value = m_DirectHostBackBufferAccess; Unlock(); } - void SetDirectHostBackBufferAccess(int* value) { Lock(); m_DirectHostBackBufferAccess = *value; Unlock(); } + // ****************************************************************** + void GetHackSettings(Settings::s_hack *hacks) { Lock(); *hacks = m_hacks; Unlock(); } + void SetHackSettings(Settings::s_hack *hacks) { Lock(); m_hacks = *hacks; Unlock(); } + + void GetDisablePixelShaders(int* value) { Lock(); *value = m_hacks.DisablePixelShaders; Unlock(); } + void SetDisablePixelShaders(const int* value) { Lock(); m_hacks.DisablePixelShaders = *value; Unlock(); } + void GetUncapFramerate(int* value) { Lock(); *value = m_hacks.UncapFramerate; Unlock(); } + void SetUncapFramerate(const int* value) { Lock(); m_hacks.UncapFramerate = *value; Unlock(); } + void GetUseAllCores(int* value) { Lock(); *value = m_hacks.UseAllCores; Unlock(); } + void SetUseAllCores(const int* value) { Lock(); m_hacks.UseAllCores = *value; Unlock(); } + void GetSkipRdtscPatching(int* value) { Lock(); *value = m_hacks.SkipRdtscPatching; Unlock(); } + void SetSkipRdtscPatching(const int* value) { Lock(); m_hacks.SkipRdtscPatching = *value; Unlock(); } + void GetScaleViewport(int* value) { Lock(); *value = m_hacks.ScaleViewport; Unlock(); } + void SetScaleViewport(const int* value) { Lock(); m_hacks.ScaleViewport = *value; Unlock(); } + void GetDirectHostBackBufferAccess(int* value) { Lock(); *value = m_hacks.DirectHostBackBufferAccess; Unlock(); } + void SetDirectHostBackBufferAccess(const int* value) { Lock(); m_hacks.DirectHostBackBufferAccess = *value; Unlock(); } // ****************************************************************** // * MSpF/Benchmark values Accessors // ****************************************************************** - void GetCurrentMSpF(float *value) { Lock(); *value = m_MSpF; Unlock(); } - void SetCurrentMSpF(float *value) { Lock(); m_MSpF = *value; Unlock(); } + void GetCurrentMSpF(float *value) { Lock(); *value = m_MSpF_status; Unlock(); } + void SetCurrentMSpF(const float *value) { Lock(); m_MSpF_status = *value; Unlock(); } // ****************************************************************** // * FPS/Benchmark values Accessors // ****************************************************************** - void GetCurrentFPS(float *value) { Lock(); *value = m_FPS; Unlock(); } - void SetCurrentFPS(float *value) { Lock(); m_FPS = *value; Unlock(); } + void GetCurrentFPS(float *value) { Lock(); *value = m_FPS_status; Unlock(); } + void SetCurrentFPS(const float *value) { Lock(); m_FPS_status = *value; Unlock(); } // ****************************************************************** // * Debugging flag Accessors // ****************************************************************** void GetDebuggingFlag(bool *value) { Lock(); *value = m_bDebugging; Unlock(); } - void SetDebuggingFlag(bool *value) { Lock(); m_bDebugging = *value; Unlock(); } + void SetDebuggingFlag(const bool *value) { Lock(); m_bDebugging = *value; Unlock(); } // ****************************************************************** // * Xbox LED values Accessors @@ -188,7 +184,7 @@ class EmuShared : public Mutex Lock(); for (int i = 0; i < 4; ++i) { - value[i] = m_LedSequence[i]; + value[i] = m_LedSequence_status[i]; } Unlock(); } @@ -197,7 +193,7 @@ class EmuShared : public Mutex Lock(); for (int i = 0; i < 4; ++i) { - m_LedSequence[i] = value[i]; + m_LedSequence_status[i] = value[i]; } Unlock(); } @@ -205,8 +201,8 @@ class EmuShared : public Mutex // ****************************************************************** // * File storage location // ****************************************************************** - void GetStorageLocation(char *path) { Lock(); strcpy(path, m_StorageLocation); Unlock(); } - void SetStorageLocation(char *path) { Lock(); strcpy(m_StorageLocation, path); Unlock(); } + void GetStorageLocation(char *path) { Lock(); strncpy(path, m_core.szStorageLocation, MAX_PATH); Unlock(); } + void SetStorageLocation(const char *path) { Lock(); strncpy(m_core.szStorageLocation, path, MAX_PATH); Unlock(); } // ****************************************************************** // * Reset specific variables to default for kernel mode. @@ -214,9 +210,10 @@ class EmuShared : public Mutex void ResetKrnl() { Lock(); - m_BootFlags = 0; - m_MSpF = 0.0f; - m_FPS = 0.0f; + m_BootFlags_status = 0; + m_MSpF_status = 0.0f; + m_FPS_status = 0.0f; + m_FlagsLLE_status = m_core.FlagsLLE; Unlock(); } @@ -227,6 +224,7 @@ class EmuShared : public Mutex { Lock(); ResetKrnl(); + m_bEmulating_status = 0; m_dwKrnlProcID = 0; Unlock(); } @@ -241,32 +239,30 @@ class EmuShared : public Mutex // ****************************************************************** // * Shared configuration // ****************************************************************** - XBController m_XBController; - XBVideo m_XBVideo; - XBAudio m_XBAudio; - char m_XbePath[MAX_PATH]; - int m_BootFlags; - int m_FlagsLLE; - int m_Reserved1; - int m_DisablePixelShaders; - int m_UncapFramerate; - int m_UseAllCores; - int m_SkipRdtscPatching; - float m_MSpF; - float m_FPS; + int m_BootFlags_status; + unsigned int m_FlagsLLE_status; + float m_MSpF_status; + float m_FPS_status; bool m_bReserved1; bool m_bDebugging; - bool m_bReady; - bool m_bEmulating; - int m_LedSequence[4]; - int m_ScaleViewport; - int m_DirectHostBackBufferAccess; - char m_StorageLocation[MAX_PATH]; + bool m_bReady_status; + bool m_bEmulating_status; + int m_LedSequence_status[4]; bool m_bFirstLaunch; bool m_bReserved2; bool m_bReserved3; bool m_bReserved4; unsigned int m_dwKrnlProcID; // Only used for kernel mode level. + int m_Reserved99[32]; // Reserve space + + // Settings class in memory should not be tampered by third-party. + // Third-party program should only be allow to edit settings.ini file. + Settings::s_controller_dinput m_controller_dinput; + Settings::s_controller_port m_controller_port; + Settings::s_core m_core; + Settings::s_video m_video; + Settings::s_audio m_audio; + Settings::s_hack m_hacks; }; // ****************************************************************** diff --git a/src/CxbxKrnl/EmuXapi.cpp b/src/CxbxKrnl/EmuXapi.cpp index 71d2f1cad..cb29abe5c 100644 --- a/src/CxbxKrnl/EmuXapi.cpp +++ b/src/CxbxKrnl/EmuXapi.cpp @@ -51,6 +51,7 @@ namespace xboxkrnl #include "EmuKrnl.h" // For DefaultLaunchDataPage #include "EmuFile.h" #include "EmuFS.h" +#include "EmuXTL.h" #include "EmuShared.h" #include "../Common/Win32/XBPortMapping.h" #include "HLEIntercept.h" @@ -81,8 +82,6 @@ PFARPROC1 fnCxbxVSBCOpen; //typedef DWORD(*fnCxbxVSBCGetState)(UCHAR *); XTL::PXPP_DEVICE_TYPE gDeviceType_Gamepad = nullptr; -#include "EmuXTL.h" - XTL::X_POLLING_PARAMETERS_HANDLE g_pph[4]; XTL::X_XINPUT_POLLING_PARAMETERS g_pp[4]; @@ -123,8 +122,10 @@ int FindDeviceInfoIndexByDeviceType(XTL::PXPP_DEVICE_TYPE DeviceType) //this is called in the end of SetupXboxDeviceTypes(), later we'll move this code to accept user configuration. void InitXboxControllerHostBridge(void) { - //load host type and port configuration from registry. - XBPortMappingLoad("Software\\Cxbx-Reloaded\\XboxPortHostMapping"); + //load host type and port configuration from settings. + Settings::s_controller_port ControllerPortMap; + g_EmuShared->GetControllerPortSettings(&ControllerPortMap); + XBPortMappingSet(ControllerPortMap); total_xinput_gamepad = XTL::XInputGamepad_Connected(); int port; diff --git a/src/CxbxKrnl/HLEIntercept.cpp b/src/CxbxKrnl/HLEIntercept.cpp index 6cfb73d1c..1bf2fb529 100644 --- a/src/CxbxKrnl/HLEIntercept.cpp +++ b/src/CxbxKrnl/HLEIntercept.cpp @@ -333,7 +333,7 @@ void EmuD3D_Init_DeferredStates() // Update shared structure with GUI process void EmuUpdateLLEStatus(uint32_t XbLibScan) { - int FlagsLLE; + uint FlagsLLE; g_EmuShared->GetFlagsLLE(&FlagsLLE); if ((FlagsLLE & LLE_GPU) == false @@ -358,7 +358,7 @@ void EmuUpdateLLEStatus(uint32_t XbLibScan) EmuOutputMessage(XB_OUTPUT_MESSAGE_INFO, "Fallback to LLE USB."); } #endif - g_EmuShared->SetFlagsLLE(&FlagsLLE); + g_EmuShared->SetFlagsLLEStatus(FlagsLLE); } // NOTE: EmuHLEIntercept do not get to be in XbSymbolDatabase, do the intecept in Cxbx project only. @@ -400,8 +400,8 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader) } EmuUpdateLLEStatus(XbLibScan); - int gFlagsLLE; - g_EmuShared->GetFlagsLLE(&gFlagsLLE); + uint gFlagsLLE; + g_EmuShared->GetFlagsLLEStatus(&gFlagsLLE); printf("\n"); printf("*******************************************************************************\n"); From 4412fef9bb5584a5b492eae43f7cf727ff3c1bbb Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Wed, 8 Aug 2018 09:08:50 +0100 Subject: [PATCH 0121/1000] Initial D3D9 port (#1375) --- build/win32/Cxbx.sln | 43 +- build/win32/Cxbx.vcxproj | 161 +- build/win32/Cxbx.vcxproj.filters | 1 - import/DirectX8/DXReadme.txt | 1036 - import/DirectX8/bin/DXUtils/DXCapsViewer.exe | Bin 102400 -> 0 bytes import/DirectX8/bin/DXUtils/DxTex.exe | Bin 516096 -> 0 bytes import/DirectX8/bin/DXUtils/KillHelp.exe | Bin 36864 -> 0 bytes .../DirectX8/bin/DXUtils/XFiles/conv3ds.exe | Bin 103424 -> 0 bytes .../DirectX8/bin/DXUtils/XFiles/conv3ds.txt | 170 - import/DirectX8/bin/DXUtils/XFiles/convx.exe | Bin 22528 -> 0 bytes .../DirectX8/bin/DXUtils/XFiles/convxof.exe | Bin 56832 -> 0 bytes import/DirectX8/bin/DXUtils/dbmon.exe | Bin 5904 -> 0 bytes import/DirectX8/bin/DXUtils/directx.cpl | Bin 86016 -> 0 bytes import/DirectX8/bin/DXUtils/dmodump.dll | Bin 23552 -> 0 bytes import/DirectX8/bin/DXUtils/dmotest.chm | Bin 45301 -> 0 bytes import/DirectX8/bin/DXUtils/dmotest.exe | Bin 119296 -> 0 bytes import/DirectX8/bin/DXUtils/dp8log.exe | Bin 5120 -> 0 bytes import/DirectX8/bin/DXUtils/dp8log.txt | 115 - import/DirectX8/bin/DXUtils/dp8parse.dll | Bin 45568 -> 0 bytes import/DirectX8/bin/DXUtils/dxtex.txt | 176 - import/DirectX8/bin/DXUtils/fedit.chm | Bin 30345 -> 0 bytes import/DirectX8/bin/DXUtils/fedit.exe | Bin 168720 -> 0 bytes import/DirectX8/bin/DXUtils/graphedit.chm | Bin 39716 -> 0 bytes import/DirectX8/bin/DXUtils/graphedt.exe | Bin 155136 -> 0 bytes import/DirectX8/bin/DXUtils/proppage.dll | Bin 185856 -> 0 bytes import/DirectX8/bin/DXUtils/psa.exe | Bin 200704 -> 0 bytes import/DirectX8/bin/DXUtils/vsa.exe | Bin 200704 -> 0 bytes .../DirectXEULAs/DirectX End User EULA.txt | 24 - .../doc/DirectXEULAs/DirectX SDK EULA.txt | 59 - .../doc/DirectXEULAs/directx redist.txt | 19 - import/DirectX8/include/DShow.h | 78 - import/DirectX8/include/DShowIDL/amstream.idl | 336 - import/DirectX8/include/DShowIDL/amvpe.idl | 170 - import/DirectX8/include/DShowIDL/austream.idl | 106 - import/DirectX8/include/DShowIDL/axcore.idl | 1284 - import/DirectX8/include/DShowIDL/axextend.idl | 9423 ----- import/DirectX8/include/DShowIDL/bdaiface.idl | 1744 - import/DirectX8/include/DShowIDL/control.odl | 909 - import/DirectX8/include/DShowIDL/ddstream.idl | 86 - import/DirectX8/include/DShowIDL/devenum.idl | 38 - import/DirectX8/include/DShowIDL/dmodshow.idl | 34 - import/DirectX8/include/DShowIDL/dshowasf.idl | 59 - import/DirectX8/include/DShowIDL/dvdif.idl | 2324 -- import/DirectX8/include/DShowIDL/dxtrans.idl | 2322 -- import/DirectX8/include/DShowIDL/dyngraph.idl | 318 - import/DirectX8/include/DShowIDL/iamovie.idl | 144 - import/DirectX8/include/DShowIDL/mediaobj.idl | 411 - import/DirectX8/include/DShowIDL/medparam.idl | 228 - import/DirectX8/include/DShowIDL/mmstream.idl | 190 - import/DirectX8/include/DShowIDL/qedit.idl | 1702 - import/DirectX8/include/DShowIDL/regbag.idl | 52 - import/DirectX8/include/DShowIDL/strmif.idl | 56 - import/DirectX8/include/DShowIDL/tuner.idl | 4225 --- import/DirectX8/include/DShowIDL/videoacc.idl | 172 - import/DirectX8/include/activecf.h | 19 - import/DirectX8/include/amaudio.h | 54 - import/DirectX8/include/amparse.h | 38 - import/DirectX8/include/amstream.h | 2295 -- import/DirectX8/include/amva.h | 85 - import/DirectX8/include/amvideo.h | 433 - import/DirectX8/include/atsmedia.h | 34 - import/DirectX8/include/audevcod.h | 53 - import/DirectX8/include/austream.h | 715 - import/DirectX8/include/aviriff.h | 402 - import/DirectX8/include/basetsd.h.old | 342 - import/DirectX8/include/bdaiface.h | 3881 -- import/DirectX8/include/bdamedia.h | 2984 -- import/DirectX8/include/bdatypes.h | 1176 - import/DirectX8/include/comlite.h | 26 - import/DirectX8/include/control.h | 5544 --- import/DirectX8/include/d3d.h | 1688 - import/DirectX8/include/d3d8.h | 1279 - import/DirectX8/include/d3d8caps.h | 362 - import/DirectX8/include/d3d8types.h | 1675 - import/DirectX8/include/d3dcaps.h | 599 - import/DirectX8/include/d3drm.h | 342 - import/DirectX8/include/d3drmdef.h | 695 - import/DirectX8/include/d3drmobj.h | 1666 - import/DirectX8/include/d3drmwin.h | 50 - import/DirectX8/include/d3dtypes.h | 2117 -- import/DirectX8/include/d3dvec.inl | 255 - import/DirectX8/include/d3dx.h | 26 - import/DirectX8/include/d3dx8.h | 45 - import/DirectX8/include/d3dx8core.h | 563 - import/DirectX8/include/d3dx8effect.h | 226 - import/DirectX8/include/d3dx8math.h | 1215 - import/DirectX8/include/d3dx8math.inl | 1757 - import/DirectX8/include/d3dx8mesh.h | 760 - import/DirectX8/include/d3dx8shape.h | 220 - import/DirectX8/include/d3dx8tex.h | 1592 - import/DirectX8/include/d3dxcore.h | 1027 - import/DirectX8/include/d3dxerr.h | 407 - import/DirectX8/include/d3dxmath.h | 1085 - import/DirectX8/include/d3dxmath.inl | 1809 - import/DirectX8/include/d3dxshapes.h | 209 - import/DirectX8/include/d3dxsprite.h | 321 - import/DirectX8/include/ddraw.h | 5703 --- import/DirectX8/include/ddrawex.h | 218 - import/DirectX8/include/ddstream.h | 533 - import/DirectX8/include/dls1.h | 267 - import/DirectX8/include/dls2.h | 130 - import/DirectX8/include/dmdls.h | 199 - import/DirectX8/include/dmerror.h | 843 - import/DirectX8/include/dmksctrl.h | 167 - import/DirectX8/include/dmo.h | 29 - import/DirectX8/include/dmodshow.h | 176 - import/DirectX8/include/dmoimpl.h | 645 - import/DirectX8/include/dmoreg.h | 110 - import/DirectX8/include/dmort.h | 75 - import/DirectX8/include/dmplugin.h | 281 - import/DirectX8/include/dmusbuff.h | 41 - import/DirectX8/include/dmusicc.h | 784 - import/DirectX8/include/dmusicf.h | 2373 -- import/DirectX8/include/dmusici.h | 1964 -- import/DirectX8/include/dmusics.h | 193 - import/DirectX8/include/dpaddr.h | 375 - import/DirectX8/include/dplay.h | 2146 -- import/DirectX8/include/dplay8.h | 1189 - import/DirectX8/include/dplobby.h | 853 - import/DirectX8/include/dplobby8.h | 407 - import/DirectX8/include/dsetup.h | 308 - import/DirectX8/include/dshowasf.h | 329 - import/DirectX8/include/dv.h | 62 - import/DirectX8/include/dvdevcod.h | 731 - import/DirectX8/include/dvdmedia.h | 418 - import/DirectX8/include/dvoice.h | 856 - import/DirectX8/include/dvp.h | 966 - import/DirectX8/include/dx7todx8.h | 98 - import/DirectX8/include/dxerr8.h | 100 - import/DirectX8/include/dxfile.h | 240 - import/DirectX8/include/dxsdk.inc | 131 - import/DirectX8/include/dxtrans.h | 5362 --- import/DirectX8/include/dxva.h | 628 - import/DirectX8/include/edevdefs.h | 531 - import/DirectX8/include/errors.h | 47 - import/DirectX8/include/evcode.h | 415 - import/DirectX8/include/il21dec.h | 112 - import/DirectX8/include/ks.h | 11337 ------ import/DirectX8/include/ksguid.h | 29 - import/DirectX8/include/ksmedia.h | 9074 ----- import/DirectX8/include/ksproxy.h | 845 - import/DirectX8/include/ksuuids.h | 228 - import/DirectX8/include/mediaerr.h | 20 - import/DirectX8/include/mediaobj.h | 1574 - import/DirectX8/include/medparam.h | 581 - import/DirectX8/include/mmstream.h | 846 - import/DirectX8/include/mpconfig.h | 144 - import/DirectX8/include/mpegtype.h | 119 - import/DirectX8/include/multimon.h | 484 - import/DirectX8/include/playlist.h | 847 - import/DirectX8/include/qedit.h | 19878 ----------- import/DirectX8/include/qnetwork.h | 555 - import/DirectX8/include/regbag.h | 193 - import/DirectX8/include/rmxfguid.h | 223 - import/DirectX8/include/rmxftmpl.h | 339 - import/DirectX8/include/strmif.h | 29217 ---------------- import/DirectX8/include/tune.h | 815 - import/DirectX8/include/tuner.h | 21517 ------------ import/DirectX8/include/uuids.h | 1312 - import/DirectX8/include/vfwmsgs.h | 1325 - import/DirectX8/include/videoacc.h | 661 - import/DirectX8/include/vpconfig.h | 135 - import/DirectX8/include/vpnotify.h | 92 - import/DirectX8/include/vptype.h | 78 - import/DirectX8/include/xprtdefs.h | 673 - import/DirectX8/lib/DSETUP.lib | Bin 5510 -> 0 bytes import/DirectX8/lib/LIBCI.lib | Bin 165800 -> 0 bytes import/DirectX8/lib/amstrmid.lib | Bin 262536 -> 0 bytes import/DirectX8/lib/d3d8.lib | Bin 2466 -> 0 bytes import/DirectX8/lib/d3dx.lib | Bin 614546 -> 0 bytes import/DirectX8/lib/d3dx8.lib | Bin 2150226 -> 0 bytes import/DirectX8/lib/d3dx8d.lib | Bin 53414 -> 0 bytes import/DirectX8/lib/d3dx8dt.lib | Bin 2711810 -> 0 bytes import/DirectX8/lib/d3dxd.lib | Bin 615396 -> 0 bytes import/DirectX8/lib/d3dxof.lib | Bin 1722 -> 0 bytes import/DirectX8/lib/ddraw.lib | Bin 4540 -> 0 bytes import/DirectX8/lib/dinput.lib | Bin 17790 -> 0 bytes import/DirectX8/lib/dmoguids.lib | Bin 22810 -> 0 bytes import/DirectX8/lib/dplayx.lib | Bin 3142 -> 0 bytes import/DirectX8/lib/dpnaddr.lib | Bin 1830 -> 0 bytes import/DirectX8/lib/dpnet.lib | Bin 1776 -> 0 bytes import/DirectX8/lib/dpnlobby.lib | Bin 1828 -> 0 bytes import/DirectX8/lib/dpvoice.lib | Bin 1814 -> 0 bytes import/DirectX8/lib/dxerr8.lib | Bin 1082890 -> 0 bytes import/DirectX8/lib/dxguid.lib | Bin 104752 -> 0 bytes import/DirectX8/lib/dxtrans.lib | Bin 3700 -> 0 bytes import/DirectX8/lib/ksproxy.lib | Bin 3054 -> 0 bytes import/DirectX8/lib/ksuser.lib | Bin 182452 -> 0 bytes import/DirectX8/lib/msdmo.lib | Bin 4620 -> 0 bytes import/DirectX8/lib/qedit.lib | Bin 1198 -> 0 bytes import/DirectX8/lib/quartz.lib | Bin 2370 -> 0 bytes import/DirectX8/lib/strmiids.lib | Bin 262536 -> 0 bytes import/DirectX8/readme.txt | 1 - import/DirectX9/include/DxErr.h | 99 - import/d3d8to9 | 1 - src/Common/Settings.cpp | 46 +- src/Cxbx/DlgVideoConfig.cpp | 8 +- src/CxbxKrnl/CxbxKrnl.cpp | 8 +- src/CxbxKrnl/EmuD3D8.cpp | 458 +- src/CxbxKrnl/EmuD3D8/Convert.cpp | 46 +- src/CxbxKrnl/EmuD3D8/PixelShader.cpp | 86 +- src/CxbxKrnl/EmuD3D8/PixelShader.h | 2 - src/CxbxKrnl/EmuD3D8/PushBuffer.cpp | 2 - src/CxbxKrnl/EmuD3D8/State.cpp | 49 +- src/CxbxKrnl/EmuD3D8/VertexBuffer.cpp | 44 +- src/CxbxKrnl/EmuD3D8/VertexShader.cpp | 462 +- src/CxbxKrnl/EmuD3D8Logging.cpp | 78 - src/CxbxKrnl/EmuD3D8Logging.h | 10 - src/CxbxKrnl/EmuD3D8Types.h | 48 +- 209 files changed, 421 insertions(+), 203489 deletions(-) delete mode 100644 import/DirectX8/DXReadme.txt delete mode 100644 import/DirectX8/bin/DXUtils/DXCapsViewer.exe delete mode 100644 import/DirectX8/bin/DXUtils/DxTex.exe delete mode 100644 import/DirectX8/bin/DXUtils/KillHelp.exe delete mode 100644 import/DirectX8/bin/DXUtils/XFiles/conv3ds.exe delete mode 100644 import/DirectX8/bin/DXUtils/XFiles/conv3ds.txt delete mode 100644 import/DirectX8/bin/DXUtils/XFiles/convx.exe delete mode 100644 import/DirectX8/bin/DXUtils/XFiles/convxof.exe delete mode 100644 import/DirectX8/bin/DXUtils/dbmon.exe delete mode 100644 import/DirectX8/bin/DXUtils/directx.cpl delete mode 100644 import/DirectX8/bin/DXUtils/dmodump.dll delete mode 100644 import/DirectX8/bin/DXUtils/dmotest.chm delete mode 100644 import/DirectX8/bin/DXUtils/dmotest.exe delete mode 100644 import/DirectX8/bin/DXUtils/dp8log.exe delete mode 100644 import/DirectX8/bin/DXUtils/dp8log.txt delete mode 100644 import/DirectX8/bin/DXUtils/dp8parse.dll delete mode 100644 import/DirectX8/bin/DXUtils/dxtex.txt delete mode 100644 import/DirectX8/bin/DXUtils/fedit.chm delete mode 100644 import/DirectX8/bin/DXUtils/fedit.exe delete mode 100644 import/DirectX8/bin/DXUtils/graphedit.chm delete mode 100644 import/DirectX8/bin/DXUtils/graphedt.exe delete mode 100644 import/DirectX8/bin/DXUtils/proppage.dll delete mode 100644 import/DirectX8/bin/DXUtils/psa.exe delete mode 100644 import/DirectX8/bin/DXUtils/vsa.exe delete mode 100644 import/DirectX8/doc/DirectXEULAs/DirectX End User EULA.txt delete mode 100644 import/DirectX8/doc/DirectXEULAs/DirectX SDK EULA.txt delete mode 100644 import/DirectX8/doc/DirectXEULAs/directx redist.txt delete mode 100644 import/DirectX8/include/DShow.h delete mode 100644 import/DirectX8/include/DShowIDL/amstream.idl delete mode 100644 import/DirectX8/include/DShowIDL/amvpe.idl delete mode 100644 import/DirectX8/include/DShowIDL/austream.idl delete mode 100644 import/DirectX8/include/DShowIDL/axcore.idl delete mode 100644 import/DirectX8/include/DShowIDL/axextend.idl delete mode 100644 import/DirectX8/include/DShowIDL/bdaiface.idl delete mode 100644 import/DirectX8/include/DShowIDL/control.odl delete mode 100644 import/DirectX8/include/DShowIDL/ddstream.idl delete mode 100644 import/DirectX8/include/DShowIDL/devenum.idl delete mode 100644 import/DirectX8/include/DShowIDL/dmodshow.idl delete mode 100644 import/DirectX8/include/DShowIDL/dshowasf.idl delete mode 100644 import/DirectX8/include/DShowIDL/dvdif.idl delete mode 100644 import/DirectX8/include/DShowIDL/dxtrans.idl delete mode 100644 import/DirectX8/include/DShowIDL/dyngraph.idl delete mode 100644 import/DirectX8/include/DShowIDL/iamovie.idl delete mode 100644 import/DirectX8/include/DShowIDL/mediaobj.idl delete mode 100644 import/DirectX8/include/DShowIDL/medparam.idl delete mode 100644 import/DirectX8/include/DShowIDL/mmstream.idl delete mode 100644 import/DirectX8/include/DShowIDL/qedit.idl delete mode 100644 import/DirectX8/include/DShowIDL/regbag.idl delete mode 100644 import/DirectX8/include/DShowIDL/strmif.idl delete mode 100644 import/DirectX8/include/DShowIDL/tuner.idl delete mode 100644 import/DirectX8/include/DShowIDL/videoacc.idl delete mode 100644 import/DirectX8/include/activecf.h delete mode 100644 import/DirectX8/include/amaudio.h delete mode 100644 import/DirectX8/include/amparse.h delete mode 100644 import/DirectX8/include/amstream.h delete mode 100644 import/DirectX8/include/amva.h delete mode 100644 import/DirectX8/include/amvideo.h delete mode 100644 import/DirectX8/include/atsmedia.h delete mode 100644 import/DirectX8/include/audevcod.h delete mode 100644 import/DirectX8/include/austream.h delete mode 100644 import/DirectX8/include/aviriff.h delete mode 100644 import/DirectX8/include/basetsd.h.old delete mode 100644 import/DirectX8/include/bdaiface.h delete mode 100644 import/DirectX8/include/bdamedia.h delete mode 100644 import/DirectX8/include/bdatypes.h delete mode 100644 import/DirectX8/include/comlite.h delete mode 100644 import/DirectX8/include/control.h delete mode 100644 import/DirectX8/include/d3d.h delete mode 100644 import/DirectX8/include/d3d8.h delete mode 100644 import/DirectX8/include/d3d8caps.h delete mode 100644 import/DirectX8/include/d3d8types.h delete mode 100644 import/DirectX8/include/d3dcaps.h delete mode 100644 import/DirectX8/include/d3drm.h delete mode 100644 import/DirectX8/include/d3drmdef.h delete mode 100644 import/DirectX8/include/d3drmobj.h delete mode 100644 import/DirectX8/include/d3drmwin.h delete mode 100644 import/DirectX8/include/d3dtypes.h delete mode 100644 import/DirectX8/include/d3dvec.inl delete mode 100644 import/DirectX8/include/d3dx.h delete mode 100644 import/DirectX8/include/d3dx8.h delete mode 100644 import/DirectX8/include/d3dx8core.h delete mode 100644 import/DirectX8/include/d3dx8effect.h delete mode 100644 import/DirectX8/include/d3dx8math.h delete mode 100644 import/DirectX8/include/d3dx8math.inl delete mode 100644 import/DirectX8/include/d3dx8mesh.h delete mode 100644 import/DirectX8/include/d3dx8shape.h delete mode 100644 import/DirectX8/include/d3dx8tex.h delete mode 100644 import/DirectX8/include/d3dxcore.h delete mode 100644 import/DirectX8/include/d3dxerr.h delete mode 100644 import/DirectX8/include/d3dxmath.h delete mode 100644 import/DirectX8/include/d3dxmath.inl delete mode 100644 import/DirectX8/include/d3dxshapes.h delete mode 100644 import/DirectX8/include/d3dxsprite.h delete mode 100644 import/DirectX8/include/ddraw.h delete mode 100644 import/DirectX8/include/ddrawex.h delete mode 100644 import/DirectX8/include/ddstream.h delete mode 100644 import/DirectX8/include/dls1.h delete mode 100644 import/DirectX8/include/dls2.h delete mode 100644 import/DirectX8/include/dmdls.h delete mode 100644 import/DirectX8/include/dmerror.h delete mode 100644 import/DirectX8/include/dmksctrl.h delete mode 100644 import/DirectX8/include/dmo.h delete mode 100644 import/DirectX8/include/dmodshow.h delete mode 100644 import/DirectX8/include/dmoimpl.h delete mode 100644 import/DirectX8/include/dmoreg.h delete mode 100644 import/DirectX8/include/dmort.h delete mode 100644 import/DirectX8/include/dmplugin.h delete mode 100644 import/DirectX8/include/dmusbuff.h delete mode 100644 import/DirectX8/include/dmusicc.h delete mode 100644 import/DirectX8/include/dmusicf.h delete mode 100644 import/DirectX8/include/dmusici.h delete mode 100644 import/DirectX8/include/dmusics.h delete mode 100644 import/DirectX8/include/dpaddr.h delete mode 100644 import/DirectX8/include/dplay.h delete mode 100644 import/DirectX8/include/dplay8.h delete mode 100644 import/DirectX8/include/dplobby.h delete mode 100644 import/DirectX8/include/dplobby8.h delete mode 100644 import/DirectX8/include/dsetup.h delete mode 100644 import/DirectX8/include/dshowasf.h delete mode 100644 import/DirectX8/include/dv.h delete mode 100644 import/DirectX8/include/dvdevcod.h delete mode 100644 import/DirectX8/include/dvdmedia.h delete mode 100644 import/DirectX8/include/dvoice.h delete mode 100644 import/DirectX8/include/dvp.h delete mode 100644 import/DirectX8/include/dx7todx8.h delete mode 100644 import/DirectX8/include/dxerr8.h delete mode 100644 import/DirectX8/include/dxfile.h delete mode 100644 import/DirectX8/include/dxsdk.inc delete mode 100644 import/DirectX8/include/dxtrans.h delete mode 100644 import/DirectX8/include/dxva.h delete mode 100644 import/DirectX8/include/edevdefs.h delete mode 100644 import/DirectX8/include/errors.h delete mode 100644 import/DirectX8/include/evcode.h delete mode 100644 import/DirectX8/include/il21dec.h delete mode 100644 import/DirectX8/include/ks.h delete mode 100644 import/DirectX8/include/ksguid.h delete mode 100644 import/DirectX8/include/ksmedia.h delete mode 100644 import/DirectX8/include/ksproxy.h delete mode 100644 import/DirectX8/include/ksuuids.h delete mode 100644 import/DirectX8/include/mediaerr.h delete mode 100644 import/DirectX8/include/mediaobj.h delete mode 100644 import/DirectX8/include/medparam.h delete mode 100644 import/DirectX8/include/mmstream.h delete mode 100644 import/DirectX8/include/mpconfig.h delete mode 100644 import/DirectX8/include/mpegtype.h delete mode 100644 import/DirectX8/include/multimon.h delete mode 100644 import/DirectX8/include/playlist.h delete mode 100644 import/DirectX8/include/qedit.h delete mode 100644 import/DirectX8/include/qnetwork.h delete mode 100644 import/DirectX8/include/regbag.h delete mode 100644 import/DirectX8/include/rmxfguid.h delete mode 100644 import/DirectX8/include/rmxftmpl.h delete mode 100644 import/DirectX8/include/strmif.h delete mode 100644 import/DirectX8/include/tune.h delete mode 100644 import/DirectX8/include/tuner.h delete mode 100644 import/DirectX8/include/uuids.h delete mode 100644 import/DirectX8/include/vfwmsgs.h delete mode 100644 import/DirectX8/include/videoacc.h delete mode 100644 import/DirectX8/include/vpconfig.h delete mode 100644 import/DirectX8/include/vpnotify.h delete mode 100644 import/DirectX8/include/vptype.h delete mode 100644 import/DirectX8/include/xprtdefs.h delete mode 100644 import/DirectX8/lib/DSETUP.lib delete mode 100644 import/DirectX8/lib/LIBCI.lib delete mode 100644 import/DirectX8/lib/amstrmid.lib delete mode 100644 import/DirectX8/lib/d3d8.lib delete mode 100644 import/DirectX8/lib/d3dx.lib delete mode 100644 import/DirectX8/lib/d3dx8.lib delete mode 100644 import/DirectX8/lib/d3dx8d.lib delete mode 100644 import/DirectX8/lib/d3dx8dt.lib delete mode 100644 import/DirectX8/lib/d3dxd.lib delete mode 100644 import/DirectX8/lib/d3dxof.lib delete mode 100644 import/DirectX8/lib/ddraw.lib delete mode 100644 import/DirectX8/lib/dinput.lib delete mode 100644 import/DirectX8/lib/dmoguids.lib delete mode 100644 import/DirectX8/lib/dplayx.lib delete mode 100644 import/DirectX8/lib/dpnaddr.lib delete mode 100644 import/DirectX8/lib/dpnet.lib delete mode 100644 import/DirectX8/lib/dpnlobby.lib delete mode 100644 import/DirectX8/lib/dpvoice.lib delete mode 100644 import/DirectX8/lib/dxerr8.lib delete mode 100644 import/DirectX8/lib/dxguid.lib delete mode 100644 import/DirectX8/lib/dxtrans.lib delete mode 100644 import/DirectX8/lib/ksproxy.lib delete mode 100644 import/DirectX8/lib/ksuser.lib delete mode 100644 import/DirectX8/lib/msdmo.lib delete mode 100644 import/DirectX8/lib/qedit.lib delete mode 100644 import/DirectX8/lib/quartz.lib delete mode 100644 import/DirectX8/lib/strmiids.lib delete mode 100644 import/DirectX8/readme.txt delete mode 160000 import/d3d8to9 diff --git a/build/win32/Cxbx.sln b/build/win32/Cxbx.sln index e9955397a..77603fd66 100644 --- a/build/win32/Cxbx.sln +++ b/build/win32/Cxbx.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.27703.2026 +VisualStudioVersion = 15.0.27130.2020 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Cxbx", "Cxbx.vcxproj", "{E7A72D3D-5810-4078-A243-348B59726365}" ProjectSection(ProjectDependencies) = postProject @@ -28,9 +28,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CxbxVSBC", "CxbxVSBC.vcxpro EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Direct3D9|Any CPU = Debug_Direct3D9|Any CPU - Debug_Direct3D9|Win32 = Debug_Direct3D9|Win32 - Debug_Direct3D9|x64 = Debug_Direct3D9|x64 Debug|Any CPU = Debug|Any CPU Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 @@ -39,10 +36,6 @@ Global Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E7A72D3D-5810-4078-A243-348B59726365}.Debug_Direct3D9|Any CPU.ActiveCfg = Debug|Win32 - {E7A72D3D-5810-4078-A243-348B59726365}.Debug_Direct3D9|Win32.ActiveCfg = Debug_Direct3D9|Win32 - {E7A72D3D-5810-4078-A243-348B59726365}.Debug_Direct3D9|Win32.Build.0 = Debug_Direct3D9|Win32 - {E7A72D3D-5810-4078-A243-348B59726365}.Debug_Direct3D9|x64.ActiveCfg = Debug|Win32 {E7A72D3D-5810-4078-A243-348B59726365}.Debug|Any CPU.ActiveCfg = Debug|Win32 {E7A72D3D-5810-4078-A243-348B59726365}.Debug|Win32.ActiveCfg = Debug|Win32 {E7A72D3D-5810-4078-A243-348B59726365}.Debug|Win32.Build.0 = Debug|Win32 @@ -51,11 +44,6 @@ Global {E7A72D3D-5810-4078-A243-348B59726365}.Release|Win32.ActiveCfg = Release|Win32 {E7A72D3D-5810-4078-A243-348B59726365}.Release|Win32.Build.0 = Release|Win32 {E7A72D3D-5810-4078-A243-348B59726365}.Release|x64.ActiveCfg = Release|Win32 - {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_Direct3D9|Any CPU.ActiveCfg = Debug|Win32 - {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Win32 - {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 - {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_Direct3D9|x64.ActiveCfg = Debug|x64 - {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug_Direct3D9|x64.Build.0 = Debug|x64 {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug|Any CPU.ActiveCfg = Debug|Win32 {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug|Win32.ActiveCfg = Debug|Win32 {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Debug|Win32.Build.0 = Debug|Win32 @@ -66,11 +54,6 @@ Global {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Release|Win32.Build.0 = Release|Win32 {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Release|x64.ActiveCfg = Release|x64 {CD2DDE93-B45E-4D11-876D-D0056C3DD407}.Release|x64.Build.0 = Release|x64 - {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_Direct3D9|Any CPU.ActiveCfg = Debug|Any CPU - {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_Direct3D9|Any CPU.Build.0 = Debug|Any CPU - {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Any CPU - {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_Direct3D9|x64.ActiveCfg = Debug|Any CPU - {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug_Direct3D9|x64.Build.0 = Debug|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug|Any CPU.Build.0 = Debug|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Debug|Win32.ActiveCfg = Debug|Any CPU @@ -81,11 +64,6 @@ Global {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Release|Win32.ActiveCfg = Release|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Release|x64.ActiveCfg = Release|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Release|x64.Build.0 = Release|Any CPU - {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_Direct3D9|Any CPU.ActiveCfg = Debug|Any CPU - {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_Direct3D9|Any CPU.Build.0 = Debug|Any CPU - {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Any CPU - {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_Direct3D9|x64.ActiveCfg = Debug|Any CPU - {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug_Direct3D9|x64.Build.0 = Debug|Any CPU {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug|Any CPU.Build.0 = Debug|Any CPU {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug|Win32.ActiveCfg = Debug|Any CPU @@ -96,11 +74,6 @@ Global {9131B025-5019-4DEE-84A3-86D2703A81C0}.Release|Win32.ActiveCfg = Release|Any CPU {9131B025-5019-4DEE-84A3-86D2703A81C0}.Release|x64.ActiveCfg = Release|Any CPU {9131B025-5019-4DEE-84A3-86D2703A81C0}.Release|x64.Build.0 = Release|Any CPU - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|Any CPU.ActiveCfg = Debug|Win32 - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Win32 - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|x64.ActiveCfg = Debug|x64 - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug_Direct3D9|x64.Build.0 = Debug|x64 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug|Any CPU.ActiveCfg = Debug|Win32 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug|Win32.ActiveCfg = Debug|Win32 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug|Win32.Build.0 = Debug|Win32 @@ -108,13 +81,7 @@ Global {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|Any CPU.ActiveCfg = Release|Win32 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|Win32.ActiveCfg = Release|Win32 {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|Win32.Build.0 = Release|Win32 - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|x64.ActiveCfg = Release|x64 - {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|x64.Build.0 = Release|x64 - {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_Direct3D9|Any CPU.ActiveCfg = Release|Win32 - {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_Direct3D9|Any CPU.Build.0 = Release|Win32 - {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Win32 - {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 - {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug_Direct3D9|x64.ActiveCfg = Debug|Win32 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|x64.ActiveCfg = Release|Win32 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug|Any CPU.ActiveCfg = Debug|Win32 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug|Win32.ActiveCfg = Debug|Win32 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Debug|Win32.Build.0 = Debug|Win32 @@ -123,12 +90,6 @@ Global {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Release|Win32.ActiveCfg = Release|Win32 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Release|Win32.Build.0 = Release|Win32 {B8D9AFC2-B38F-4714-846D-8A2754F076C9}.Release|x64.ActiveCfg = Release|Win32 - {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_Direct3D9|Any CPU.ActiveCfg = Release|x64 - {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_Direct3D9|Any CPU.Build.0 = Release|x64 - {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_Direct3D9|Win32.ActiveCfg = Debug|Win32 - {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_Direct3D9|Win32.Build.0 = Debug|Win32 - {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_Direct3D9|x64.ActiveCfg = Debug|x64 - {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug_Direct3D9|x64.Build.0 = Debug|x64 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug|Any CPU.ActiveCfg = Debug|Win32 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug|Win32.ActiveCfg = Debug|Win32 {EFA81330-D410-4232-9A0C-1D8B91B6FFFF}.Debug|Win32.Build.0 = Debug|Win32 diff --git a/build/win32/Cxbx.vcxproj b/build/win32/Cxbx.vcxproj index c13f5345f..a9ad0f107 100644 --- a/build/win32/Cxbx.vcxproj +++ b/build/win32/Cxbx.vcxproj @@ -1,10 +1,6 @@  - - Debug_Direct3D9 - Win32 - Debug Win32 @@ -32,12 +28,6 @@ MultiByte $(DefaultPlatformToolset) - - Application - false - MultiByte - $(DefaultPlatformToolset) - @@ -49,29 +39,19 @@ - - - - <_ProjectFileVersion>10.0.40219.1 false - false false AllRules.ruleset - AllRules.ruleset - - AllRules.ruleset ..\..\import\DirectX8\include;$(IncludePath) - ..\..\import\DirectX9\include;$(IncludePath) ..\..\import\DirectX8\lib;$(LibraryPath) - $(LibraryPath) ..\..\import\DirectX8\include;$(IncludePath) ..\..\import\DirectX8\lib;$(LibraryPath) @@ -80,11 +60,6 @@ $(Configuration)\$(ProjectName)\ - - Build - - $(Configuration)\$(ProjectName)\ - Build @@ -102,68 +77,8 @@ Disabled - ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\;..\..\import\simpleini - NOMINMAX;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebugDLL - false - Level3 - true - ProgramDatabase - true - StreamingSIMDExtensions2 - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - Include\Win32\Cxbx;%(AdditionalIncludeDirectories) - - - legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;%(AdditionalDependencies) - true - $(Configuration)\;..\..\import\distorm\lib\Win32\;..\..\import\glew-2.0.0\lib\Release\Win32\;%(AdditionalLibraryDirectories) - libcmt;%(IgnoreSpecificDefaultLibraries) - true - true - Windows - false - - - MachineX86 - false - 0x10000 - true - true - - - true - - - copy $(SolutionDir)..\..\import\glew-2.0.0\bin\Release\Win32\glew32.dll $(TargetDir) - - - - - - - CALL "$(SolutionDir)Version.bat" "$(SolutionDir)..\..\src\Version.h" - Generate version header - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\..\..\bin\debug/Cxbx.tlb - - - - - Disabled - ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\;..\..\import\simpleini - CXBX_USE_D3D9;NOMINMAX;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + ..\..\src\Common;..\..\src;..\..\src\Common\Win32;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\import\subhook\;..\..\import\DirectX9\include;..\..\import\simpleini + NOMINMAX;_WIN32_WINNT=0x0601;WIN32;CXBX_USE_D3D9;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL false @@ -223,8 +138,8 @@ MaxSpeed AnySuitable - ..\..\src;..\..\src\Common;..\..\src\Common\Win32\;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\src\Common\Win32;..\..\import\subhook\;..\..\import\simpleini - NOMINMAX;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + ..\..\src;..\..\src\Common;..\..\src\Common\Win32\;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\src\Common\Win32;..\..\import\subhook\;..\..\import\DirectX9\include;..\..\import\simpleini + NOMINMAX;_WIN32_WINNT=0x0601;WIN32;CXBX_USE_D3D9;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreadedDLL true @@ -248,9 +163,9 @@ Include\Win32\Cxbx;%(AdditionalIncludeDirectories) - legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;%(AdditionalDependencies) + legacy_stdio_definitions.lib;d3d9.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr9.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx9.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;%(AdditionalDependencies) true - $(Configuration)\;..\..\import\distorm\lib\Win32\;..\..\import\glew-2.0.0\lib\Release\Win32\;%(AdditionalLibraryDirectories) + $(Configuration)\;..\..\import\distorm\lib\Win32\;..\..\import\glew-2.0.0\lib\Release\Win32\;..\..\import\DirectX9\lib\;%(AdditionalLibraryDirectories) libcmt;%(IgnoreSpecificDefaultLibraries) Windows false @@ -415,9 +330,7 @@ %(PreprocessorDefinitions) - %(PreprocessorDefinitions) \cxbx\git\cxbx-ds\resource;%(AdditionalIncludeDirectories) - \cxbx\git\cxbx-ds\resource;%(AdditionalIncludeDirectories) %(PreprocessorDefinitions) \cxbx\git\cxbx-ds\resource;%(AdditionalIncludeDirectories) @@ -438,126 +351,96 @@ %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) false %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -580,10 +463,8 @@ %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -592,27 +473,21 @@ %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -620,18 +495,14 @@ %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -639,10 +510,8 @@ %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -652,75 +521,57 @@ %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) diff --git a/build/win32/Cxbx.vcxproj.filters b/build/win32/Cxbx.vcxproj.filters index d4d32750d..a1c504138 100644 --- a/build/win32/Cxbx.vcxproj.filters +++ b/build/win32/Cxbx.vcxproj.filters @@ -610,7 +610,6 @@ Cross Platform - Cross Platform diff --git a/import/DirectX8/DXReadme.txt b/import/DirectX8/DXReadme.txt deleted file mode 100644 index 9625ca232..000000000 --- a/import/DirectX8/DXReadme.txt +++ /dev/null @@ -1,1036 +0,0 @@ -Microsoft(R) DirectX (R) 8.1 SDK - Final Release - -This is the Final Release of Microsoft's DirectX 8.1 Software Development -Kit (SDK). It contains all DirectX software required to create -DirectX 8.1 compliant applications. Following the Final Release, -parts of this SDK will also be made available for download at the -Microsoft DirectX developer webpage . - -Major components include: DirectX 8.1 system components (runtimes); -DirectX 8.1 Application Programming Interface (API) Documentation -for each of the DirectX core areas (written for C++ or Visual Basic -developers); DirectX 8.1 headers & libraries; Sample applications -and source code; miscellaneous tools and utilities. - -After installing, those new to DirectX should start with the -DirectX 8.1 documentation. More seasoned developers may also -want to view the "WHAT'S NEW" section. Professional DirectX -developers should refer to the "KNOWN ISSUES" section prior to -raising concerns - - -__________________________________________________________________ - - - -Contents: - -- INSTALLATION -- WHAT'S NEW -- CD LAYOUT -- DIRECTX 8.1 SDK RELEASE NOTES AND KNOWN ISSUES -- COMPILER SUPPORT - - -__________________________________________________________________ - - - -INSTALLATION: - -- ALWAYS UNINSTALL PREVIOUS RELEASES of the DirectX SDK prior to - installing DirectX 8.1 SDK Release (see UNINSTALL). Installing - on top of a previous installation will cause you problems. - -- In addition, you should uninstall any DirectX SDK installations - that may be part of a Microsoft Platform SDK installation prior - to installing the DirectX 8.1 SDK. - -- DirectX 8.1 SDK does not support pre-release versions of Windows XP, - Windows 95, Windows NT, or NEC PC98 systems. Installations on - these systems have been blocked. - -- On Windows 2000 or Windows XP, You must be logged on as an - administrator before installing the DirectX 8.1 SDK, installing - the runtime, using any of SDK tools, or running any of the SDK samples. - -- Running the DirectX 8.1 SDK install on Windows XP and later checked - builds may result in assertions from inside the install package. - We have found no cases where continuing on past the assert dialog - boxes results in improper installation of the DirectX 8.1 SDK, so - it is safe to continue past these asserts. - -- An Internal error can occur after the NTFS permissions for the - Administrators group or the System account have been removed from - the %SystemRoot%\Installer folder. To resolve this issue, reset - the NTFS permissions for the %SystemRoot%\Installer folder so - that it includes both the Administrators group and the System - account. Search the Microsoft knowledge base article for more - information. - -- Please be alerted to the fact that using the "subst" command can - result in path names that are too long for the installer to operate - correctly. Please do not use this command for determining target drives - of the DirectX SDK installer prior to invoking the installer. This is - also liable to cause the SDK uninstaller to fail. - -- The DirectX 8.1 runtime installer should not be run in Compatibility Mode. - -- The DirectX 8.1 runtime requires a Pentium compatible CPU for operation. - Setup will not install on processors that do not report Pentium - compatibility. Some older Cyrix processors, while compatible with - the Pentium instruction set, report as x486 processors, and thus do not - support installation of the DirectX 8.1 runtime. - -- When installing the DirectX 8.1 developer runtime from the DirectX 8.1 SDK - you will notice that the size requirements are calculated incorrectly. - Please allow an extra 80 MB free above the calculated disk space when installing - the developer runtimes. The extra free space is required for uncompression - and installation of the developer runtimes. Only 40 MB is actually - needed once the developer runtime installation is complete. The DirectX - Setup API will check for and display error messages when these requirements - are not met. - - -UNINSTALL: - -To uninstall, use "Add/Remove Programs" from the Control Panel to -uninstall the InstallShield installations. - - - -__________________________________________________________________ - - - -WHAT'S NEW: - -DirectX 8.1 shipped as an integral part of Windows XP and is available -for all versions of Windows 98, Windows ME and Windows 2000. Developers -choosing to support Windows 95 should continue to use DirectX 8.0a. - -DirectX 8.1 includes all of the previous DirectX 8.0 functionality as -well as new DirectX graphics features and new DirectShow features specific to -Windows XP. - -DirectX 8.1 graphics supports the following new features: - - - new pixel shader models 1.2, 1.3, and 1.4 - - new high precision texture formats - - new nPatch quadratic interpolation order - - new dynamic texture support - - new D3DX methods - - updated DirectX graphics documentation - -There have been considerable improvements made to the DirectShow content -for the DirectX 8.1 SDK. These improvements include updating existing samples, -adding many new samples (including Windows XP samples), providing modified -source code for the sampleGrabber, and improving documentation. See the -DirectShow section below for more specific information. - -The SDK contains several new tools, they include: - - screensaver framework - - AppWizard support - - DX error lookup tool, - - MView mesh viewer - - DP8sim network simulator - -This DirectX 8.1 version of DirectMusic Producer sports a number of new features to streamline the authoring process for composers and sound designers. Some of these features include low enough software synthesizer latency to input musical performances from a keyboard in real time (WDM driver required), easier wave capture, and improved DLS/wave editing features like one-click stereo wave insert, insert silence and a resample wave option. Segment Designer features include multiple wave insert as segments, the ability to edit segment length based on clocktime, and ability to start and stop segments while editing DMO effects. Other improvements include many bug fixes, an improved look to segment strips and customizable wallpaper. Documentation has been thoroughly revamped and a new tutorial with a sample game is also available. - - -__________________________________________________________________ - - - -CD LAYOUT: - - -The following is a brief description of the directories found with a complete -DirectX 8.1 SDK download. Depending on options specified during -installation, some of these directories can be installed on your hard drive. - -\Bin - \DXUtils - High level DirectX applications & tools. - All can be accessed from the Start menu if "Utilities" are installed. - - Note: Japanese systems will require Internet Explorer 5.0 (IE5) for - the DirectX Control Panel to display properly. IE5 can be found at - http://www.microsoft.com/windows/ie/default.htm. - - \AppWizard - - This is the DirectX 8.1 application Wizard that can be plugged - into Microsoft Visual C++ 6.0. The AppWizard creates a minimal C++ - template application that optionally integrates Direct3D, - DirectInput, DirectMusic, DirectSound, and DirectPlay to work - together in conjunction. It creates basic-- yet easy to build - upon-- functionality, demonstrating the use of each of these - components right from the start. - - To install: - 1. Go to \Bin\DXutils\AppWizard\ directory. - 2. copy DxAppWiz.awx to C:\Program Files\Microsoft - Visual Studio\Common\MSDev98\Template - To use: - 1. run VC6 - 2. Click "New", under the "New Projects" tab, click the "DirectX - AppWizard" wizard. - 3. Type a project name and click OK. - 4. Choose wizard options, and click finish when done. - 5. Build and run the new project. - -\Doc - Contains reference documentation for the DirectX 8.1 APIs. - This Documentation must be viewed with Windows HTMLHelp. - - Note: The HTMLHelp viewer requires a minimum installation of - Internet Explorer 5.0 (IE5). IE5 can be found at - http://www.microsoft.com/windows/ie/default.htm. - -\Essentls - \DMusProd (DirectMusic Producer) - - DirectMusic Producer is the authoring tool for DirectMusic. It - allows composers and sound designers to use the interactive and - variable resources of DirectMusic along with the consistent sound - performance of DLS. DirectX Audio Scripting can also be authored - and tested within Producer. The DirectMusic Producer setup program - and all files are located here. - -\Extras - \Direct3D - - Skinning exporter tools - \DirectShow - - Contains the DVDBoilerplate. See readme.txt within the directory - for more information. - - Contains additional media that can be used with DirectShow and the - DirectShow Editing Services (DES) interfaces. - \Documentation - - Contains DirectX 7 HTMLHelp Documentation for English and Japanese. - - Also contains DirectX 7 Documentation in Microsoft Word format - (English only). - - Contains DirectX 8 HTMLHelp Documentation for Japanese. - \Symbols - - Contains directories of DirectX 8.1 symbol files for - Win9x, Win2000 and WinXP (retail and debug for each). -\Include - contains DirectX 8.1 include files for DirectX core components. - -\Lib - contains DirectX 8.1 library files for DirectX core components. - -\License - Text versions of the DirectX SDK and End User License Agreements and - the Redistributable License Agreement. - -\Redist - Redistributable versions of the DirectX 8.1 Runtime. - -\Samples - Contains all sample code and sample binaries. Most samples can be - accessed from the Start menu when installed via the downloaded - InstallShield setup. - -\SDKDev - This directory contains the runtime installs that are installed with - the SDK. They are English only and contain both debug and retail - DirectX 8.1 system components that can be "switched" between retail - and debug without re-installing. For the DirectX 8.1 components, - retail or debug can be switched via the DirectX Control Panel. - - The \retail folder contains the setup that will install non-DirectX 8.1 - retail components while the \debug folder will install all debug - components. Both install DX8.1 retail and debug components; These are - the only components that can be "switched". The \window XP folder - contains the Windows XP version of these files. - -\Suppport - This folder contains support tools required for the SDK installation. - It can be deleted following installation. - -\System32 - This folder contains support tools required for the SDK installation. - It can be deleted following installation. - - -__________________________________________________________________ - - - -========================================= -DIRECTX 8.1 SDK NOTES -========================================= -New features: - -Direct3D SDK graphics support includes - -Added new Direct3D samples, - (cull, lighting, volume fog, self-shadowing bumpmapping ) - - -enhanced usage of D3DX in the samples, - - -continued improvement of the D3Dx documentations, - - -the SDK now contains a graphics screensaver framework - - -MView mesh utility, useful for previewing meshes, normals, etc. - -- The SDK screensaver framework is modeled after the graphics sample framework. The - screeensaver sample framework provides multi-monitor support; something the standard - graphics sample framework does not. There is one simple screensaver sample - provided, "Moire", that uses the screensaver framework. The DirectPlay Maze Client - also uses this screensaver framework, but is not intended as a screensaver framework - sample. You can find the screensaver framework with the common sample classes - (d3dsaver.cpp & d3dsaver.h), the Moire screensaver sample with the Direct3D samples - and the Maze Client with the DirectPlay samples. - -- DirectX AppWizard for Visual C++ v6.0. A DirectX AppWizard is included in the - DirectX 8.1 release. See "What's New" or "CD Layout"-"Extras"-"AppWizard" - for more information - -- DirectX error lookup tool providing error lookup for Directx 8.x interfaces only. There is - also an error lookup function you may use in your application. - -Issues: - - -- Be sure to set the paths to the DirectX 8.1 lib and headers within Visual - Studio. They must be listed first. Otherwise you may experience compiler - errors. - -- You must regserve the VB OCX before running the VB samples if you install the - DirectX 8.1 SDK before Visual Studio. The easiest way is to open visual Studio, - which registers the ocx for you. - -- The DirectDraw "Debug Level" slider in DirectX Control Panel Applet does - not function. Instead use the "Debug Output Level" slider on the Direct3D - tab, this will effect both DDraw and D3D8. Also note that DirectDraw labels - it's debug spew as coming from "Direct3D8". - -- Netmeeting and WindowsWP remoting disables graphic hardware acceleration. - - -========================================= -Documentation -========================================= -Issues: - -- The links to the DirectX 8.1 documentation files from the start menu do not - work on Windows 98 SE. On all supported versions of Windows proper icons - are not displayed for the start mention documentation links. - -- For proper viewing of the DirectX Documentation, install the docs from - the DirectX 8.1 SDK CD. Specify a full installation, or if you chose a - Custom install, ensure that you've selected Documentation. - -- The known issues with the DirectX 8.1 Documentation are written up in a - separate file. You will find these issues listed in the - DirectX8_Doc_Readme.txt file found in the \dxf\dxsdk\doc\DirectX8 - folder. This file is also installed into the \doc\DirectX8 - when Documentation is installed. - -- See \dxf\dxsdk\extras\documentation for other related - documentation from previous versions of DirectX. The Japanese version of - DirectX 8.0 help files have been added. - - -========================================= -DirectX for Visual Basic Samples: -========================================= -Issues: - -- DBMON.exe is a console application which allows the Visual Basic DirectX - developer to take advantage of extended output that debug installs of - DirectX provide. This application works only under Windows 2000. - To use, execute the application. All debug output will be captured and sent - to the console window. If you are not seeing debug output, ensure that - you have installed the debug version of DirectX, that you are logged on to an - account with admin priviledges, and that you are running Windows 2000. - -- If you are experiencing problems searching for and connecting to sessions - using DirectPlay for VisualBasic, you may need to update your system. - To update, install DCOM98 from: - http://download.microsoft.com/msdownload/dcom/98/x86/en/dcom98.exe - - -========================================= -DirectX Audio (DirectSound & DirectMusic) -========================================= -Issues: - -- ParamEQ and Distortion effects have parameters that are sampling rate - dependent. - Setting these params to a value that is out of range for that sampling - rate will result in: - Distortion: Parameters are 'clipped' at the valid range for the - sampling rate - ParamEQ: If the frequency is greater than can be supported by the - sampling rate, the effect is disabled- In the DirectMusic - 3DAudio sample, there may be some breakup if Doppler is set > 4 -- DirectSound buffers that are created with DSBCAPS_CTRLFX must be at - least 100ms in length. - - -========================================= -Direct3D -========================================= -New features: - -- new pixel shader models 1.2, 1.3, and 1.4 -- new high precision texture formats -- new nPatch quadratic interpolation order -- new dynamic texture support -- new D3DX methods - -New for DirectX 8.1 are pixel shader versions 1.2, 1.3, and 1.4. Information -on the new instructions is integrated into the pixel shader reference. - -Dynamic textures are a new Microsoft® DirectX® 8.1 feature. To find out if -the driver supports dynamic textures, check the D3DCAPS2_DYNAMICTEXTURES -flag of the D3DCAPS8 structure. See SDK Documentation section -"Using Dynamic Textures". - -Higher precision texture formats. - -New npatch quadratic interpolation order. - -In D3DX there have been a number of updates. See the D3DX section below. - -New exporter support, in the extras folder. Includes 3DSmax4 and Maya4 support. - -General Issues include: - -- Alt-enter in the samples results in texture corruption for some drivers. - Workaround: Get newer drivers. -- The value for MaxPrimitiveCount defines the max number of vertices - as well as the max number of primitives that can be sent to a - DrawIndexedPrimitive or DrawPrimitive call. -- A bug in the Windows2000 kernel causes an issue upon mode-switches for - AGP surfaces locked with the NOSYSLOCK flag. The contents of any such - surface may become inaccessible for the duration of the NOSYSLOCK lock - if a mode-switch happens after the Lock and before the Unlock. This happens - for both DX7 and DX8 applications. The most likely scenario is a DX8 - application running on a driver that supports hardware vertex buffers, - but using software vertex processing (fixed or shader). Under these - scenarios, Direct3D might keep a NOSYSLOCK lock on an AGP vertex buffer. - If the user alt-tabs out of the application or does anything else to cause - a mode-change, the thread writing into the vertex buffer may fault. There - is no known workaround. -- When using the function ValidateDevice on Win9x the return value will be - DD_OK if it is successful. - -Point Sprite issues: - -- When using the Direct3D software T&L pipeline (device created with - D3DCREATE_SOFTWARE_VERTEXPROCESSING flag set or with - D3DCREATE_MIXED_VERTEXPROCESSING flag and software vertex processing - toggled on), then point sprite support is guaranteed. When using - hardware vertex processing, some older drivers may not support point - sprites, indicated by d3dcaps->MaxPointSize = 0. Upgrading to a DX8 - driver for these parts will enable them. - - To ensure consistent behavior for point sprite support, set - D3DRS_CULLMODE = D3DCULL_NONE - D3DRS_FILLMODE = D3DFILL_SOLID - when rendering point sprites. - -Vertex Shader issues: - -- Two vertex shader instructions may produce implementation-specific - results for out-of-range inputs, such as the log of a negative number. - The log, logp and y- component of the lit instruction macro should not - be passed negative values for this reason. - -Driver/Device Specific Issues: - -- The Windows Millennium driver for the ATI Rage 128 fails (draws nothing) - when using vertex shaders which output more than two texture coordinates - per texture coordinate set when the D3DTTFF_PROJECTED bit is not set. - - -Direct3D Sample issues: - - -- There are miscellaneous issues with some display hardware & drivers. - Please let us know of any problems you encounter and specify whether you - believe it is sample or driver related. - - -========================================= -D3DX -========================================= -New features: - --D3DX math function CPU-specific optimizations, --new methods on PMesh, --loading volumes and cube textures from resources, --new functions, including - -D3DXMatrixMultiplyTranspose(), - -D3DXQuaternionSquadSetup(), - -D3DXSplitMesh(), - -D3DXIntersectTri(), - -D3DXComputeNormalMap(). - -Issues: - -- This product includes software developed by the University of California, - Berkeley and its contributors D3DX Mesh APIs. - -- SetLOD and/or UpdateTextures (when updating between dissimilar miplevels) - will produce an AV with mipvolumes in Refrast and potentially some drivers. - -- If you create vertex shaders with constants in the declarator, please verify - that every vertex shader that has the shader constants in the declaration is - created with the correct usage flag. Always use: - D3DUSAGE_SOFTWAREPROCESSING for software vertex processing, - 0 for hardware vertex processing. - - Failure to do so may result in your vertex shaders not validating on the - DirectX 8.1 runtime. This behavior will only be different from DirectX 8.0 - on devices which are created with D3DCREATE_SOFTWARE_VERTEXPROCESSING flag. - -========================================= -DirectInput -========================================= -New features: - --Action Mapper sample - a single player version of multimapper. - -Issues: - -- There are some know issues that can cause mouse behavior to be very sluggish - when debugging using DirectInput on Windows 2000 (Windows XP does not - exhibit this behavior at all). The DirectX control panel has options to - select input device emulation for mouse and keyboard which makes the devices - perform properly inside the debugger. - These settings are global so effect all DirectInput clients. They only - improve performance when using the debug binaries, and only for applications - that employ foreground exclusive device access. Some features, such as - masking the Windows keys, are not available when devices are emulated so - emulation is only recommended for debugging. - -- On Windows 98, 98 Second Edition and Millennium Edition, the Gravis GrIP gamepad may not report data after a reboot. - To fix this you need to run the Game Controller tool from the Control Panel and click Refresh. - - If the Game Controllers tool is missing from Control Panel, you need to restore a backup copy of the Joy.cpl file. To do this: - - 1. Close the Control Panel, if it is open. - 2. Click Start, point to Find, and then click Files Or Folders. - 3. In the Named box, type joy.bak. - 4. In the Look In box, click My Computer, and then click Find Now. - 5. In the list of found files, right-click Joy.bak, and then click Rename. - 6. Type joy.cpl, and then press ENTER. - 7. Close the Find: Files Named Joy.bak window. - 8. Open the Control Panel - -- The following devices are supported with device images in this release. - + ACT LABS RS - + ACT LABS Force RS - + Gravis Xterminator Dual Control - + Gravis Gamepad Pro - + Gravis Eliminator Gamepad Pro - + Gravis Xterminator Digital GamePad - + Guillemot Dual Analog Gamepad - + Guillemot Digital Gamepad - + InterAct/3dfx SV-262A HammerHead Fx - + InterAct Axispad - + InterAct SV-251 Raider Digital - + Logitech WingMan Formula (Yellow) - + Logitech WingMan Extreme Digital 3D - + Logitech WingMan Gamepad Black (USB) - + Logitech Wingman Rally Force USB - + Logitech Wingman Rumblepad - + Microsoft Sidewinder Gamepad Pro - + Microsoft SideWinder Force Feedback Wheel - + Microsoft SideWinder Force Feedback Pro - + Microsoft Sidewinder FF 2 - + Microsoft Sidewinder Dual Strike - + Microsoft Sidewinder Precision 2 - + Microsoft Sidewinder Plug and Play - + Microsoft SideWinder Game Pad - + Microsoft SideWinder Precision Racing Wheel - + Microsoft SideWinder Precision Pro - + Microsoft SideWinder Freestyle Pro - + Microsoft SideWinder 3D Pro - - -========================================= -DirectPlay -========================================= -New features: - -- You can test your application under a variety of network conditions - with the new DP8Sim tool. -- SDK documentation now contains DirectPlay tutorials - -Issues: - -- To use DirectPlay Voice in full duplex mode, we recommend that you update - to the latest drivers for your audio device. Some older drivers do not - provide reliable full duplex performance. -- If you successfully connect to a location with any asynchronous - enumerations still active, the enumerations will be canceled automatically - for you. The DPN_MSGID_ASYNC_OP_COMPLETE messages for the enumerations - will list DPNERR_CONNECTING as the result code. As with all asynchronous - operations, if you attempt to call CancelAsyncOperation on the handle - after you have received its DPN_MSGID_ASYNC_OP_COMPLETE message, you - will get back the DPNERR_INVALIDHANDLE error code. Be aware that this - is the expected behavior and that you should not exit with an error - condition. - -Notes on NATs (Network Address Translators): - -- There are many different NAT solutions available, some of which are - different from others. We have attempted to document some of the issues - with various NAT solutions, but is not comprehensive. Please refer to - the DirectX Developer Page at for - further information on these issues. -- When performing the first operation over the TCP/IP service provider, - DirectPlay attempts to detect a Network Address Translator (NAT) or - firewall. This increases the time that the Connect, Host, or EnumHosts - calls take. If you are sure that your machine is not behind a NAT or - firewall, you can set the following registry key values to 0 to disable - the detection: - - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectPlayNATHelp\DPNHPAST\DirectPlay8Priority - - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectPlayNATHelp\DPNHUPnP\DirectPlay8Priority - - As with all registry modifications, only perform them if you are comfortable - doing so, and have a back up. - - DirectPlay Voice codecs via Windows ACM (Audio Compression Manager): - -- DirectPlay Voice uses the following codecs via the Windows ACM: - - Microsoft ADPCM - - Microsoft GSM - - DSP Group Truespeech - -- Installation of these codecs with Windows is optional. If they - are not installed, then one or more of the compression types in - DirectPlay Voice will not function. If the application attempts - to use a compression type that is not functional due to a missing - ACM codec, it will receive the DVERR_COMPRESSIONNOTSUPPORTED - return code. - -- On Windows 2000, the user can install these codecs through the - Add/Remove Hardware wizard. The user should select - "Add/Troubleshoot a device". When a list of hardware is presented, - the user should select "Add a new device", then on the next - page select "No, I want to select the hardware from a list". - This will bring up a list of hardware. Select "Sound, video, and - game controllers". The "Audio Codecs" item is listed under - "(Standard system devices)". - -- On Windows 9x, the user can install these codecs through the - Add New Hardware wizard. When prompted, the user should select - "No, I want to select the hardware from a list". In the list of - device types, codecs are listed under "Sound video and game - controllers". The codecs are listed under two manufacturers. - The ADPCM and GSM codecs are listed under "Microsoft Audio - Codecs" and the Truespeech codec is listed under "DSP Group". - - -========================================= -Broadcast Driver Architecture -========================================= - -Known issues with Broadcast IP Data Reception under Windows 2000: - -- After rebooting a Windows 2000 system with a BDA receiver card installed, - the BDA NDIS IP NIC is not immediately active. It becomes active only - when an application inserts the BDA IPSink filter into a graph and connects - its input pin. Once activated by connecting the IPSink filter's input pin, - it takes 20 to 30 seconds for the BDA NDIS IP NIC to be assigned an IP - address. The address assigned will be a Net 10 address. Once activated, - the BDA NDIS IP NIC will remain active until the system is rebooted. - -- There may be some applications that use the BDA NDIS IP NIC as the default - LAN adapter. These apps will fail if the BDA NDIS IP NIC is active. To - de-activate the BDA NDIS IP NIC, reboot the system and do not run a TV graph - or application. - -- When viewing a BDA Network provider property page with GraphEdit, you cannot - enter a -1 value. As a workaround, enter 0 and click the down arrow to set - the value to -1. - -- Pin connections with mpe/slip with ipsink may fail if NO tuner is - installed post - DX8.1 installation. This behavior is exactly as seen - in Windows XP. This may be due to the TV tuner driver not being - properly installed. Automatic loading of BDA NDIS miniport is restricted - by design. The solution is to right click and install the bda.inf, followed by - a machine reboot. - - -========================================= -DirectShow -========================================= - -What's New in DirectShow for DirectX 8.1: -There have been considerable improvements made to the DirectShow content -for the DirectX 8.1 SDK. Below is a brief summary of the updates. - -Improvements to existing samples -------------------------------------- -There have been many enhancements and refinements to the existing -DirectX 8.1 samples for this release, including: - -- New features and functionality -- Numerous bug fixes, including Windows XP support issues -- UNICODE and IA64 support -- ASF-enabled versions of the PlayWnd and MFC Jukebox samples -- Clean compilation with Warning Level 4 -- Improved video window repainting for Jukebox-style applications -- Updated resource files and version information blocks -- Digital Video sample (Capture\DVApp) was rewritten to take - advantage of the ICaptureGraphBuilder2 interface to build its graphs. -- Sample XTL files have been updated in 8.1 to reflect a change in the - DES XML parser on Windows XP. XML attributes must now be specified - in *lowercase*. Mixed-case attributes will fail on Windows XP. - -New DirectShow samples -------------------------------------- -- Audio Capture (Capture\AudioCap) -- DMO-enabled Player (Players\PlayDMO) -- DMO Enumerator (Misc\DMOEnum) -- Filter Mapper (Misc\Mapper) -- Grabber Sample Filter (Filters\Grabber) (modified from DX8 SampleGrabber) -- JukeboxASF (Players\JukeboxASF) -- PlayCap with Moniker (Capture\PlayCapMoniker) -- PlayWndASF (Players\PlayWndASF) -- Still Image Viewer (Players\StillView) -- Utility source code and routines in the DirectShow\Common directory - -New DirectShow samples for Windows XP -------------------------------------- -Windows XP provides new functionality that is not present in downlevel -operating systems (Windows 9x, Windows 2000). The DirectShow_WinXP -directory provides samples to demonstrate using the new Video Mixing -Renderer and the new Microsoft Video Control (for use with the Windows -Driver Model and Broadcast Driver Architecture). - -The new samples include: - -- Video Control - C++, Visual Basic, and HTML samples of rendering - ATSC, DVB, and Analog television in a Windows application. The - new Video Control encapsulates much of the new functionality and - aids developers in creating television-enabled applications. - -- Video Mixing Renderer (VMR) - - Cube - - Renderless - - Text Player - - VMR Mix - - VMR Player - - VMR Exclusive Mode (VMRXcl) - -See the DirectShow_WinXP directory for more detailed information -about these new samples. - - -Updated Documentation -------------------------------------- -The DirectShow documentation has been significantly enhanced for -DirectX 8.1. It adds information for the new features available in -Windows XP and expands on previously presented material for the -Microsoft TV Technologies. - - -Modified SampleGrabber filter source code -------------------------------------- -There have been several requests for Microsoft to publish the source -code for the popular SampleGrabber filter. To that end, we now provide -a modified (simpler) version of the sample grabber filter, which uses -a new GUID and new CLSID to prevent collisions with the original -DirectX 8.0 filter. You can review and modify the source code for this -filter and use it in your own applications. See the Filters\Grabber -directory for more information. - - -Windows XP support in header files -------------------------------------- -DirectX 8.1 provides support for the following Windows platforms: - - Windows 98, Windows 98 Second Edition, Windows Millennium Edition - - Windows 2000 - - Windows XP - -Because Windows XP adds new functionality which is not present on -downlevel systems, many of the headers in the \DXSDK\include directory -have been revised to allow developers to use new Windows XP functionality -when desired, with full downlevel compatibility. This is achieved by -adding the following conditionally compiled sections to the relevant -header files: - - #if (WINVER >= 0x501) - // Windows XP content - #else - // Downlevel content - #endif - -To enable Windows XP features and to utilize the new portions of the -affected headers, set the Windows version to 0x501 (the Windows XP -version) in your Visual C++ project files. If the Windows version is -less than 0x501, the original DirectX 8.0 content will be used to allow -full backward compatibility with the DirectX 8.0 SDK. Similar -improvements were also made to the Interface Definition Files (IDLs) -in the \DXSDK\include\DShowIDL directory. - -See the Samples\DirectShow and Samples\DirectShow_WinXP directories -for more information. - - -Runtime improvements -------------------------------------- -The DirectX 8.1 binaries and redist files have received various improvements -since the DirectX 8.0 release, including a large subset of the modifications -that were made for Windows XP. - - -Revised GraphEdit application -------------------------------------- -The GraphEdit utility benefits from several improvements, particularly -with respect to its user interface, menus, and toolbar. Additionally, - -- Graph resizing code (View->xxx %) handles all sizes correctly, and - you can resize your graphs using the menu, keyboard +/- keys, and - Ctrl+MouseWheel. - -- You can optionally disable the seek bar (and its timed updates), which - has been known to cause difficulty when debugging filters with GraphEdit. - -- To preserve screen real estate, source and file writer filters displayed - in GraphEdit will now only display their corresponding filenames as the - filter name, instead of displaying the fully qualified path name. - For example, a file source for the file - "C:\DXSDK\samples\Multimedia\Media\lake.mpg" would display "lake.mpg". - - -DirectShow Samples: -------------------------------------- -- DirectX 8.1 contains several new DirectShow samples and many updates - to existing samples. New C++ samples include: - - Capture\AudioCap, Capture\PlayCapMoniker - - Misc\DMOEnum, Misc\Mapper - - Players\JukeboxASF, Players\PlayWndASF, Players\PlayDMO, Players\StillView - -- In order to launch GraphEdit from the StillView or Jukebox applications, - GraphEdt.exe must be installed with the DirectX SDK or exist on your path - -- There are several .XTL sample files in the \media folder. These files - demonstrate some of the functionality available in the DirectShow Editing - Services. You can render these files using the XTLTest C++ sample and - the XTLTestVB and DexterVB VisualBasic samples. All provided XTL files - refer to media that ships in the SDK's media directory. Rendering XTL - files is a great way to get an idea of what the new DirectShow Editing - Services APIs make possible. For a simple demo, drag a few of the SDK - media directory's sample .XTL files onto the XTLTestVB sample's client area. - -- The DirectShow Visual Basic samples demonstrate more of the DES functionality - than the C++ samples. Be sure to run SlideShowVB and TrimmerVB if you are - interested in DES. You can also use the DexterVB ("Dexter Explorer") - application as an XTL development/test tool. - -- The Texture3D sample is known to fail on some systems (referencing - invalid memory), for which you may see an error message. We recommend - updating your video card drivers to the most current revision, as that - usually resolves the problem. - -- The DirectShow IDL files are currently located in the - \include\DShowIDL directory of the SDK for your convenience. - -- You will be required to build the \BaseClasses libraries before any sample - that depends on them can be built or executed. Please review the Readme.Txt - file in the DirectShow samples root directory for more information on - building the samples. - -- If you select the Debug runtime when installing the SDK, then the video renderer - will display frame counters on DirectShow video windows. These frame counters - will appear on all DirectShow applications, whether built as Debug or Release versions. - To disable the frame counters, switch to DirectX Release binaries by running "Install Retail" - from the DirectX SDK's "Runtime Installs" Start Menu item. Note that you must have - enabled the capability to switch between Debug and Release binaries when you installed - the SDK, by checking the "Copy DirectX Setup Files" option on the install options page. - This is not an issue on Windows XP, however, because the Video Mixing Renderer does - not display these frame counters by default. - - - -DirectShow 8.0 release notes: -------------------------------------- - -- Application development using the DirectShow base classes libraries requires - installation of the DirectShow samples. The source code for the base classes - is now included as a sample project, rather than as a separate Classes\Base - directory. You must compile these base classes to generate strmbase.lib and - strmbasd.lib, which are no longer installed as binary files. If you are - linking with strmbase.lib or strmbasd.lib with your own application, be sure - to build and link with the updated DirectX 8 libraries (instead of the older - libraries that are may be installed with Visual C++ or the Microsoft Platform SDK). - -- The samples included with the SDK are configured to compile and link with - the updated libraries, which are generated by building the BaseClasses project. - Further build instructions are provided in: - \samples\Multimedia\DirectShow\readme.txt. - -- The header file, along with many other DirectShow-specific header - files, is now located in the DirectShow samples BaseClasses directory, - which includes the BaseClasses source code and header files. You must add - the BaseClasses directory to the beginning of your project's include path - settings in order for Visual C++ to find all of the updated header files. - -- To use the Teletext Decoder Fonts that are shipped with DX8, make sure that - the WST_* fonts are installed by examining the \windows\fonts directory. - -- There is a known problem with the MP3 decoder filter when used with - Audio Effects DMOs. If you add an audio effect DMO (like WavesReverb, Echo, - or Flange) to an existing MP3 filter graph, the audio could be played back - at double speed. The problem would occur whenever the MP3 decoder is connected - to a downstream audio effect dmo (via the dmo filter wrapper) that offers a - default audio input type which doesn't match the native format of the - uncompressed MP3 stream. For example, if you render a 22kHz MP3 file and - add a DMO Audio effect, the MP3 filter could misinterpret the input type as - being 44kHz when it is actually 22kHz. This would not be a problem for 44kHz - MP3 files. This issue will be fixed in a future release. - -- If you have the SDK on CD-ROM, the Extras\DirectShow\Media directory - contains additional media that can be used with DirectShow and the DirectShow - Editing Services (DES) interfaces. We have included DV-encoded AVI videos, - larger MPEG videos, and higher-quality JPEG images. Since the DV files are - very large, you should copy them to your hard disk before playing them to - ensure the best performance. - -- Remote graph spying with GraphEdit works only on Windows 2000. - -- The DirectShow Editing Services (DES) Color Generator source filter may - generate blue or green components incorrectly if they have small values. - For best results, use solid primary colors or set Blue and Green - components to values of either 0xFF or 0x00. - -- For this release, the WavesReverb DMO will only accept 16-bit audio input. - If you attempt to connect the WavesReverb DMO to an 8-bit audio source, - the connection will fail. - -- The sample XTL files have been updated in 8.1 to reflect a change in the - DES XML parser on Windows XP. XML attributes must now be specified - in *lowercase*. Mixed-case attributes will fail on Windows XP. - -- GraphEdit has been revised for 8.1 to improve its user interface and to - correct problems with zoom levels. - -- The IRenderEngine::SetRenderRange method does not work if there is an - effect on a source clip, where the source clip does not start at time - zero. - -__________________________________________________________________ - - -COMPILER SUPPORT - -- All DirectX 8.1 SDK samples are developed and compiled with Visual Studio 6.0. - The DirectX 8.1 SDK samples are optimized to compile with Visual Studio 6.0, - and we have provided Visual Studio 6.0 DSP files for your convenience. - -- All DirectX 8.1 SDK samples have been compiled with Visual Studio 7.0, and - that development environment is supported, even though no explicit project - files are provided. - -- The DirectX SDK no longer supports using Visual Studio 5.0. While this may - work, any issues with using Visual Studio 5.0 and the DirectX 8.1 SDK will - not be addressed in this release or future releases. The DirectX 8.0a SDK supports - VC 5.0 ( with the SP3 linker fix ) and Windows 95, so this may be an option for some - developers. - - -__________________________________________________________________ - - -SPECIAL THANKS - -Marlin Studios - -Textures used in the Billboard sample, tree02S.tga, tree01S.tga & tree35S.tga, -are provided courtesy of Marlin Studios (http://www.marlinstudios.com). -They are provided for use with this sample only and cannot be distributed -with any application without prior written consent. - -Viewpoint Digital, Inc. - -The model used by the Visual Basic AutoParts sample, engine1.x, is provided -courtesy of Viewpoint Digital, Inc. (http://www.viewpoint.com). It is provided -for use with this sample only and cannot be distributed with any application -without prior written consent. V6 Engine Model copyright 1999 Viewpoint -Digital, Inc.. - -3DCAFE and Platinum Pictures - -The model in the Dolphin samples, Dolphin.x, is derived from the model files -(dolphins.zip) provided courtesy of 3DCAFE and Platinum Pictures -(http://www.3dcafe.com/). It is provided for use with this sample only. -For further terms of use please visit the 3DCAFE site or contact 3DCAFE. - - -__________________________________________________________________ - - -ROLAND SOUNDCANVAS SOUND SET FOR GENERAL MIDI AND GS FORMAT - -The Roland SoundCanvas Sound Set includes the necessary sounds to make a -complete General MIDI compatible sound set. It also includes additional -sounds necessary to make a complete GS Format compatible sound set. - -WHAT IS THE GS FORMAT? - -The GS Format is a standardized set of specifications for sound sources -that defines the manner in which multitimbral sound generating devices -will respond to MIDI messages. The GS Format also complies with General -MIDI System Level 1. - -The GS Format also defines a number of other details over and above the -features of General MIDI. These include unique specifications for sound -and functions available for tone editing, effects, and other specifications -concerning the manner in which sound sources will respond to MIDI messages. -Any device that is equipped with GS Format sound sources can faithfully -reproduce both General MIDI sound recordings and GS Format MIDI sound -recordings. - -HOW TO CONTACT ROLAND: - -For more information, please contact: - -Roland Corporation U.S. -7200 Dominion Circle -Los Angeles, CA 90040-3696 - -Phone: 323-685-5141 -Fax: 323-722-7408 - -COPYRIGHT NOTICE AND LICENSE LIMITATIONS - -Roland GS Sound Set/Microsoft (P) 1996 Roland Corporation U.S. - -The Roland GS Sound Set/Microsoft, the "Sample Set", incorporates the -Roland SoundCanvas Sound Set. Roland Corporation U.S. owns the Sample Set -and all copyrights pertaining thereto and has licensed the Sample Set for -use solely on Microsoft operating system products and Microsoft Application -Products. - -Roland reserves all rights to the Sample Set not expressly granted by Roland -Corporation U.S. or by Microsoft under the terms of Microsoft's End User -License Agreement. - -The Sample Set may only be redistributed with your software application as a -part of a Microsoft operating system product installation and under the terms -of Microsoft's End User License Agreement. The Sample Set may not be -separated from the Microsoft operating system product; the Sample Set may -only be installed by the Microsoft installation procedure for the associated -Microsoft operating system product or for an associated software development -kit. All other uses of the Sample Set require a separate written license -from Roland Corporation U.S. - -The Sample Set may not be used, copied or redistributed in hardware ROM or -similar technology of any device without prior express written permission -from an authorized representative of Roland Corporation U.S. The Sample -Set may not be redistributed with any Musical Instrument . A "Musical -Instrument" is any device that is capable of generating musical sounds -without being directly connected to a computer with a licensed Microsoft -operating system product. You may not modify the Sample Set under any -circumstances. - diff --git a/import/DirectX8/bin/DXUtils/DXCapsViewer.exe b/import/DirectX8/bin/DXUtils/DXCapsViewer.exe deleted file mode 100644 index 6513bd15a64c836f76ab547295d34be31166ff81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102400 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 diff --git a/import/DirectX8/bin/DXUtils/DxTex.exe b/import/DirectX8/bin/DXUtils/DxTex.exe deleted file mode 100644 index 0e94c56a7af804976fc1def0af55c8e854626c56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 516096 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

    {yknn(lZrul)%-OuRxy9q5^M)3e3O=vMwfP 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 d`TGxKvHJSU=);TEh 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 diff --git a/import/DirectX8/bin/DXUtils/KillHelp.exe b/import/DirectX8/bin/DXUtils/KillHelp.exe deleted file mode 100644 index c367270d559fffbf2572a4a7a619c74f33508336..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 SQUa3_n3TYz1pdDxf&UA8mGk%j diff --git a/import/DirectX8/bin/DXUtils/XFiles/conv3ds.exe b/import/DirectX8/bin/DXUtils/XFiles/conv3ds.exe deleted file mode 100644 index 8b5edbe56f339b63844dca7f08d3eb6d6c0b76e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103424 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