pax_global_header00006660000000000000000000000064126442127410014515gustar00rootroot0000000000000052 comment=4358ca108cb3393958f38b9366c70cf6b2aa1d0e kinect-audio-setup-0.5/000077500000000000000000000000001264421274100150735ustar00rootroot00000000000000kinect-audio-setup-0.5/.gitignore000066400000000000000000000001471264421274100170650ustar00rootroot00000000000000kinect_upload_fw/kinect_upload_fw kinect_upload_fw/endian kinect_upload_fw/endian.h *.exe *.o *~ *.swp kinect-audio-setup-0.5/Makefile000066400000000000000000000006361264421274100165400ustar00rootroot00000000000000all: $(MAKE) -C kinect_upload_fw install: $(MAKE) -C kinect_upload_fw install install_udev_rules: install -d $(DESTDIR)/lib/udev/rules.d install -m 644 contrib/55-kinect_audio.rules.in $(DESTDIR)/lib/udev/rules.d/55-kinect_audio.rules ./kinect_patch_udev_rules \ "$(FIRMWARE_PATH)" \ "$(LOADER_PATH)" \ "$(DESTDIR)/lib/udev/rules.d/55-kinect_audio.rules" clean: $(MAKE) -C kinect_upload_fw clean kinect-audio-setup-0.5/NEWS000066400000000000000000000010651264421274100155740ustar00rootroot00000000000000News for v0.5: ============== * Fix broken links to the Kinect For Windows EULA * kinect_fetch_fw: save the firmware as UACFirmware instead of UACFirmware.C9C6E852_35A3_41DC_A57D_BDDEB43DFD04 * Add a kinect_patch_udev_rules script to improve the installation of the udev rules file provided in contrib/ * Makefile: add a install_udev_rules target News for v0.4: ============== * kinect_upload_fw: fix setting the USB configuration for some devices * kinect_upload_fw: make the code more robust * Drop the Changelog file and use a NEWS file kinect-audio-setup-0.5/README000066400000000000000000000042161264421274100157560ustar00rootroot00000000000000kinect-audio-setup makes audio input from the Microsoft Kinect Sensor device work on GNU/Linux systems. When the Kinect is first plugged in the USB port it shows up as a generic USB device with a bulk endpoint; after uploading a certain firmware a reenumeration takes place and a USB Audio Class (UAC) device becomes available. kinect-audio-setup provides tools to download the firmware off the net at installation time —since the firmware is not redistributable—, and it sets up udev rules to call the firmware loader when the device is plugged in to finally get the USB Audio Class device. Note that for all the magic to happen automatically pulseaudio >= 1.0 is needed, as it contains the kinect-audio.conf profile which fixes audio device detection: https://bugs.freedesktop.org/show_bug.cgi?id=39664 kinect-audio-setup provides: - kinect_fetch_fw which downloads and extracts the firmware from the Microsoft Kinect SDK; - kinect_upload_fw which loads the firmware to the generic USB device in order to get the USB Audio Class device to show up; - udev rules to call kinect_upload_fw when the device is plugged in. To install kinect-audio-setup from the source distribution follow the steps below with superuser rights: Install kinect_upload_fw first: # make install it will be copied to /usr/local/sbin by default, assign the PREFIX variable on the command line to install it to another location. Then install the udev rules to automate the firmware loading: # make install_udev_rules \ FIRMWARE_PATH=/lib/firmware/kinect/UACFirmware LOADER_PATH=/usr/local/sbin/kinect_upload_fw Then run the firmware fetcher script (remember this is only needed once): # ./kinect_fetch_fw /lib/firmware/kinect # udevadm control --reload-rules The UAC firmware is downloaded from the Microsoft Kinect SDK at http://www.kinectforwindows.org, the license of the SDK can be found at http://research.microsoft.com/en-us/um/legal/kinectsdk-tou_noncommercial.htm === Acknowledgements A special thanks goes to Steven Toth from http://kernellabs.com, who kindly sponsored a Kinect to Antonio Ospite and made kinect-audio-setup possible in its current form. kinect-audio-setup-0.5/contrib/000077500000000000000000000000001264421274100165335ustar00rootroot00000000000000kinect-audio-setup-0.5/contrib/55-kinect_audio.rules.in000066400000000000000000000002751264421274100231050ustar00rootroot00000000000000# Rule to load the Kinect UAC firmware on the "generic" usb device ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="02ad", RUN+="@LOADER_PATH@ @FIRMWARE_PATH@" kinect-audio-setup-0.5/kinect_fetch_fw000077500000000000000000000041411264421274100201430ustar00rootroot00000000000000#!/bin/sh # # kinect_fetch_fw - Fetch and install the Microsoft Kinect UAC firmware # # Copyright (C) 2011-2016 Antonio Ospite # # This program is free software. It comes without any warranty, to # the extent permitted by applicable law. You can redistribute it # and/or modify it under the terms of the Do What The Fuck You Want # To Public License, Version 2, as published by Sam Hocevar. See # http://sam.zoy.org/wtfpl/COPYING for more details. # # wget and 7z from p7zip-full are needed, they can be installed with # sudo aptitude install wget p7zip-full # # NOTE: p7zip-full >= 9.20 is required in order to extract .msi files # correctly set -e SDK_URL=${SDK_URL:-"http://download.microsoft.com/download/F/9/9/F99791F2-D5BE-478A-B77A-830AD14950C3/KinectSDK-v1.0-beta2-x86.msi"} SDK_MD5="40764fe9e00911bda5095e5be777e311" [ $# -lt 1 ] && { echo "usage: $(basename "$0") " 1>&2; exit 1; } FW_DESTDIR=$(readlink -m $1) command -v wget >/dev/null 2>&1 || { echo "$(basename "$0"): command 'wget' is needed." 1>&2 ; exit 1; } command -v 7z >/dev/null 2>&1 || { echo "$(basename "$0"): command '7z' is needed." 1>&2; exit 1; } TEMPDIR=$(mktemp -d) trap 'rm -rf "$TEMPDIR" >/dev/null 2>&1' 0 trap "exit 2" 1 2 3 15 cat << EOM This script is going to download the UAC Firmware for the Microsoft Kinect Sensor device from the Microsoft Kinect for Windows SDK: http://kinectforwindows.org/ The full license of the SDK can be found at: http://research.microsoft.com/en-us/um/legal/kinectsdk-tou_noncommercial.htm EOM cd "$TEMPDIR" ARCHIVE_NAME=$(basename "$SDK_URL") rm -f "$ARCHIVE_NAME" && wget "$SDK_URL" -O "$ARCHIVE_NAME" ARCHIVE_MD5=$(md5sum "$ARCHIVE_NAME" | grep --only-matching -m 1 '^[0-9a-f]*') if [ "$ARCHIVE_MD5" != "$SDK_MD5" ]; then echo "$(basename "$0"): Invalid hash for file '$ARCHIVE_NAME'." 1>&2 exit 1 fi echo -n "Extracting the UAC firmware..." 7z e -y -r "$ARCHIVE_NAME" "UACFirmware.*" > /dev/null echo " done." FW_FILE=$(ls UACFirmware.* | cut -d ' ' -f 1) FIRMWARE_PATH="${FW_DESTDIR}/UACFirmware" install -d "$FW_DESTDIR" install -m 644 "$FW_FILE" "$FIRMWARE_PATH" kinect-audio-setup-0.5/kinect_patch_udev_rules000077500000000000000000000025771264421274100217250ustar00rootroot00000000000000#!/bin/sh # # kinect_patch_udev_rules - Patch contrib/ udev rules file to load UACFirmware # # Copyright (C) 2016 Antonio Ospite # # This program is free software. It comes without any warranty, to # the extent permitted by applicable law. You can redistribute it # and/or modify it under the terms of the Do What The Fuck You Want # To Public License, Version 2, as published by Sam Hocevar. See # http://sam.zoy.org/wtfpl/COPYING for more details. set -e [ $# -lt 3 ] && { echo "usage: $(basename "$0") <55-kinect_audio.rules path>" 1>&2; exit 1; } FIRMWARE_PATH="$1" LOADER_PATH="$2" UDEV_RULES_PATH="$3" [ "x$FIRMWARE_PATH" != "x" ] || { echo "Empty FIRMWARE_PATH" 1>&2; exit 1;} [ "x$LOADER_PATH" != "x" ] || { echo "Empty LOADER_PATH" 1>&2; exit 1;} # The udev rules file must exist the other files may not exist just yet: they # may be under a prefixed path different from the final one, like in the case # when this is called at package creation time. [ -f "$UDEV_RULES_PATH" ] || { echo "Cannot find the udev rules file: $UDEV_RULES_PATH" 1>&2; exit 1; } if grep -q "@LOADER_PATH@ @FIRMWARE_PATH@" "$UDEV_RULES_PATH"; then sed -e "s|@LOADER_PATH@|${LOADER_PATH}|g" \ -e "s|@FIRMWARE_PATH@|${FIRMWARE_PATH}|g" \ -i "$UDEV_RULES_PATH" else echo "$UDEV_RULES_PATH does not contain the expected placeholders." 2>&1 exit 1 fi kinect-audio-setup-0.5/kinect_upload_fw/000077500000000000000000000000001264421274100204105ustar00rootroot00000000000000kinect-audio-setup-0.5/kinect_upload_fw/Makefile000066400000000000000000000023401264421274100220470ustar00rootroot00000000000000CFLAGS ?= -std=c99 -pedantic -Wall -Wextra -O2 # Don't make pedantic checks errors, # as vanilla libusb-1.0.8 can't live with that #CFLAGS += -pedantic-errors # GCC >= 4.6 #CFLAGS += -Wunused-but-set-variable CFLAGS += -fno-common \ -Wall \ -Wextra \ -Wformat=2 \ -Winit-self \ -Winline \ -Wpacked \ -Wp,-D_FORTIFY_SOURCE=2 \ -Wpointer-arith \ -Wlarger-than-65500 \ -Wmissing-declarations \ -Wmissing-format-attribute \ -Wmissing-noreturn \ -Wmissing-prototypes \ -Wnested-externs \ -Wold-style-definition \ -Wredundant-decls \ -Wsign-compare \ -Wstrict-aliasing=2 \ -Wstrict-prototypes \ -Wswitch-enum \ -Wundef \ -Wunreachable-code \ -Wwrite-strings ifneq ($(CC),clang) CFLAGS += -Wunsafe-loop-optimizations endif CFLAGS += $(shell pkg-config --cflags libusb-1.0) LDLIBS += $(shell pkg-config --libs libusb-1.0) PREFIX ?= /usr/local bindir := $(PREFIX)/sbin all: kinect_upload_fw endian: endian.o endian.h: endian rm -f endian.h ./endian > endian.h kinect_upload_fw.o: endian.h kinect_upload_fw: kinect_upload_fw.o install: kinect_upload_fw install -d $(DESTDIR)$(bindir) install -m 755 kinect_upload_fw $(DESTDIR)$(bindir) clean: rm -rf *~ *.o kinect_upload_fw endian endian.h kinect-audio-setup-0.5/kinect_upload_fw/endian.c000066400000000000000000000007271264421274100220200ustar00rootroot00000000000000#include #include static int little_endian(void) { int i = 0; ((char *) (&i))[0] = 1; return (i == 1); } int main(void) { printf("#ifndef __ENDIAN_H\n"); printf("#define __ENDIAN_H\n"); printf("\n"); printf("#define __LITTLE_ENDIAN 1234\n"); printf("#define __BIG_ENDIAN 4321\n"); printf("#define __BYTE_ORDER __%s_ENDIAN\n", little_endian() ? "LITTLE" : "BIG"); printf("\n"); printf("#endif /* __ENDIAN_H */\n"); exit(0); } kinect-audio-setup-0.5/kinect_upload_fw/kinect_upload_fw.c000066400000000000000000000224661264421274100241030ustar00rootroot00000000000000/* * Copyright 2011 Drew Fisher . All rights reserved. * Copyright (C) 2016 Antonio Ospite * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ''AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL DREW FISHER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are * those of the authors and should not be interpreted as representing official * policies, either expressed or implied, of Drew Fisher. */ #include #include #include #include #include #include #include "endian.h" #define KINECT_AUDIO_VID 0x045e #define KINECT_AUDIO_PID 0x02ad #define KINECT_AUDIO_CONFIGURATION 1 #define KINECT_AUDIO_INTERFACE 0 #define KINECT_AUDIO_IN_EP 0x81 #define KINECT_AUDIO_OUT_EP 0x01 static libusb_device_handle *dev; static unsigned int seq; typedef struct { uint32_t magic; uint32_t seq; uint32_t bytes; uint32_t cmd; uint32_t write_addr; uint32_t unk; } bootloader_command; typedef struct { uint32_t magic; uint32_t seq; uint32_t status; } status_code; #define LOG(...) printf(__VA_ARGS__) #if __BYTE_ORDER == __BIG_ENDIAN static inline uint32_t fn_le32(uint32_t d) { return (d<<24) | ((d<<8)&0xFF0000) | ((d>>8)&0xFF00) | (d>>24); } #else #define fn_le32(x) (x) #endif static void dump_bl_cmd(bootloader_command cmd) { int i; for (i = 0; i < 24; i++) LOG("%02X ", ((unsigned char*)(&cmd))[i]); LOG("\n"); } static int get_first_reply(void) { unsigned char buffer[512]; int res; int transferred = 0; res = libusb_bulk_transfer(dev, KINECT_AUDIO_IN_EP, buffer, 512, &transferred, 0); if (res != 0 ) { LOG("Error reading first reply: %d\ttransferred: %d (expected %d)\n", res, transferred, 0x60); return res; } LOG("Reading first reply: "); int i; for (i = 0; i < transferred; ++i) { LOG("%02X ", buffer[i]); } LOG("\n"); return res; } static int get_reply(void) { union { status_code buffer; /* The following is needed because libusb_bulk_transfer might * fail when working on a buffer smaller than 512 bytes. */ unsigned char dump[512]; } reply; int res; int transferred = 0; res = libusb_bulk_transfer(dev, KINECT_AUDIO_IN_EP, reply.dump, 512, &transferred, 0); if (res != 0 || transferred != sizeof(status_code)) { LOG("Error reading reply: %d\ttransferred: %d (expected %zu)\n", res, transferred, sizeof(status_code)); return res; } if (fn_le32(reply.buffer.magic) != 0x0a6fe000) { LOG("Error reading reply: invalid magic %08X\n", reply.buffer.magic); return -1; } if (fn_le32(reply.buffer.seq) != seq) { LOG("Error reading reply: non-matching sequence number %08X (expected %08X)\n", reply.buffer.seq, seq); return -1; } if (fn_le32(reply.buffer.status) != 0) { LOG("Notice reading reply: last uint32_t was nonzero: %d\n", reply.buffer.status); } LOG("Reading reply: "); int i; for (i = 0; i < transferred; ++i) { LOG("%02X ", reply.dump[i]); } LOG("\n"); return res; } static int upload_firmware(FILE *fw) { int res; seq = 1; bootloader_command cmd; cmd.magic = fn_le32(0x06022009); cmd.seq = fn_le32(seq); cmd.bytes = fn_le32(0x60); cmd.cmd = fn_le32(0); cmd.write_addr = fn_le32(0x15); cmd.unk = fn_le32(0); LOG("About to send: "); dump_bl_cmd(cmd); int transferred = 0; res = libusb_bulk_transfer(dev, KINECT_AUDIO_OUT_EP, (unsigned char *)&cmd, sizeof(cmd), &transferred, 0); if (res != 0 || transferred != sizeof(cmd)) { LOG("Error: res: %d\ttransferred: %d (expected %zu)\n", res, transferred, sizeof(cmd)); goto out; } // This first one doesn't have the usual magic bytes at the beginning, // and is 96 bytes long - much longer than the usual 12-byte replies. res = get_first_reply(); if (res < 0) { LOG("get_first_reply() failed"); goto out; } // I'm not sure why we do this twice here, but maybe it'll make sense // later. res = get_reply(); if (res < 0) { LOG("First get_reply() failed"); goto out; } seq++; // Split addr declaration and assignment in order to compile as C++, // otherwise this would give "jump to label '...' crosses initialization" // errors. uint32_t addr; addr = 0x00080000; unsigned char page[0x4000]; int read; do { read = (int)fread(page, 1, 0x4000, fw); if (read <= 0) { break; } //LOG(""); cmd.seq = fn_le32(seq); cmd.bytes = fn_le32((unsigned int)read); cmd.cmd = fn_le32(0x03); cmd.write_addr = fn_le32(addr); LOG("About to send: "); dump_bl_cmd(cmd); // Send it off! transferred = 0; res = libusb_bulk_transfer(dev, KINECT_AUDIO_OUT_EP, (unsigned char *)&cmd, sizeof(cmd), &transferred, 0); if (res != 0 || transferred != sizeof(cmd)) { LOG("Error: res: %d\ttransferred: %d (expected %zu)\n", res, transferred, sizeof(cmd)); goto out; } int bytes_sent = 0; while (bytes_sent < read) { int to_send = (read - bytes_sent > 512 ? 512 : read - bytes_sent); transferred = 0; res = libusb_bulk_transfer(dev, KINECT_AUDIO_OUT_EP, &page[bytes_sent], to_send, &transferred, 0); if (res != 0 || transferred != to_send) { LOG("Error: res: %d\ttransferred: %d (expected %d)\n", res, transferred, to_send); goto out; } bytes_sent += to_send; } res = get_reply(); if (res < 0) { LOG("get_reply failed"); goto out; } addr += (uint32_t)read; seq++; } while (read > 0); cmd.seq = fn_le32(seq); cmd.bytes = fn_le32(0); cmd.cmd = fn_le32(0x04); cmd.write_addr = fn_le32(0x00080030); dump_bl_cmd(cmd); transferred = 0; res = libusb_bulk_transfer(dev, KINECT_AUDIO_OUT_EP, (unsigned char *)&cmd, sizeof(cmd), &transferred, 0); if (res != 0 || transferred != sizeof(cmd)) { LOG("Error: res: %d\ttransferred: %d (expected %zu)\n", res, transferred, sizeof(cmd)); goto out; } res = get_reply(); seq++; out: return res; } int main(int argc, char *argv[]) { char default_filename[] = "firmware.bin"; char *filename = default_filename; int ret = 0; if (argc == 2) { filename = argv[1]; } FILE *fw = fopen(filename, "rb"); if (fw == NULL) { fprintf(stderr, "Failed to open %s: %s\n", filename, strerror(errno)); return -errno; } ret = libusb_init(NULL); if (ret < 0) { fprintf(stderr, "libusb_init failed: %s\n", libusb_error_name(ret)); goto out; } libusb_set_debug(NULL, 3); dev = libusb_open_device_with_vid_pid(NULL, KINECT_AUDIO_VID, KINECT_AUDIO_PID); if (dev == NULL) { fprintf(stderr, "libusb_open failed: %s\n", strerror(errno)); ret = -errno; goto out_libusb_exit; } int current_configuration = -1; ret = libusb_get_configuration(dev, ¤t_configuration); if (ret < 0) { fprintf(stderr, "libusb_get_configuration failed: %s\n", libusb_error_name(ret)); goto out_libusb_close; } if (current_configuration != KINECT_AUDIO_CONFIGURATION) { ret = libusb_set_configuration(dev, KINECT_AUDIO_CONFIGURATION); if (ret < 0) { fprintf(stderr, "libusb_set_configuration failed: %s\n", libusb_error_name(ret)); fprintf(stderr, "Cannot set configuration %d\n", KINECT_AUDIO_CONFIGURATION); goto out_libusb_close; } } libusb_set_auto_detach_kernel_driver(dev, 1); ret = libusb_claim_interface(dev, KINECT_AUDIO_INTERFACE); if (ret < 0) { fprintf(stderr, "libusb_claim_interface failed: %s\n", libusb_error_name(ret)); fprintf(stderr, "Cannot claim interface %d\n", KINECT_AUDIO_INTERFACE); goto out_libusb_close; } /* * Checking that the configuration has not changed, as suggested in * http://libusb.sourceforge.net/api-1.0/caveats.html */ current_configuration = -1; ret = libusb_get_configuration(dev, ¤t_configuration); if (ret < 0) { fprintf(stderr, "libusb_get_configuration after claim failed: %s\n", libusb_error_name(ret)); goto out_libusb_release_interface; } if (current_configuration != KINECT_AUDIO_CONFIGURATION) { fprintf(stderr, "libusb configuration changed (expected: %d, current: %d)\n", KINECT_AUDIO_CONFIGURATION, current_configuration); ret = -EINVAL; goto out_libusb_release_interface; } ret = upload_firmware(fw); // Now the device reenumerates. out_libusb_release_interface: libusb_release_interface(dev, KINECT_AUDIO_INTERFACE); out_libusb_close: libusb_close(dev); out_libusb_exit: libusb_exit(NULL); out: fclose(fw); return ret; } kinect-audio-setup-0.5/windows/000077500000000000000000000000001264421274100165655ustar00rootroot00000000000000kinect-audio-setup-0.5/windows/README.asciidoc000066400000000000000000000041241264421274100212230ustar00rootroot00000000000000Cross-compiling kinect_upload_fw for Windows under Linux ======================================================== Adapted from http://www.tinc-vpn.org/examples/cross-compiling-windows-binary/ Installing the prerequisites for cross-compilation -------------------------------------------------- sudo apt-get install mingw32 wine git-core Setting up the build directory and getting the dependencies: mkdir $HOME/mingw cd $HOME/mingw wget http://kinect.dashhacks.com/sites/kinect-hacks.com/files/libusb-win32-bin-1.2.2.0.zip unzip libusb-win32-bin-1.2.2.0.zip git clone git://github.com/OpenKinect/libfreenect.git --branch unstable Compiling kinect_upload_fw -------------------------- cd $HOME/mingw git clone git://git.ao2.it/kinect-audio-setup.git cd kinect-audio-setup/kinect_upload_fw CC=i586-mingw32msvc-gcc make endian LDFLAGS= wine ./endian > endian.h i586-mingw32msvc-g++ kinect_upload_fw.c -o kinect_upload_fw.exe \ $HOME/mingw/libfreenect/platform/windows/libusb10emu/libusb-1.0/failguard.cpp \ $HOME/mingw/libfreenect/platform/windows/libusb10emu/libusb-1.0/libusbemu.cpp \ -I$HOME/mingw/libfreenect/platform/windows/libusb10emu/libusb-1.0 \ -I$HOME/mingw/libfreenect/platform/windows/libusb10emu \ -I$HOME/mingw/libusb-win32-bin-1.2.2.0/include \ -I$HOME/mingw/libfreenect/include \ -I$HOME/mingw/libfreenect/src \ $HOME/mingw/libusb-win32-bin-1.2.2.0/lib/gcc/libusb.a Using kinect_upload_fw.exe on Windows ------------------------------------- First of all, make sure the drivers from ''libfreenect'' are installed, they are under ''platform/windows/inf''. Download the MSR Kinect SDK from: http://download.microsoft.com/download/8/4/C/84C9EF40-EE49-42C2-AE26-C6E30921182F/KinectSDK32.msi Explore ''KinectSDK32.msi'' using 7-zip from http://www.7-zip.org, extract the ''media1.cab'' file in it and extract the firmware file from ''media1.cab'', the firmware file is named ''UACFirmware.*''. Put ''kinect_upload_fw.exe'', the firmware file and ''kinect_upload_fw.bat'' file in the same directory and double_click on the ''kinect_upload_fw.bat'' file. kinect-audio-setup-0.5/windows/kinect_upload_fw.bat000066400000000000000000000013651264421274100225770ustar00rootroot00000000000000REM First of all, make sure the drivers from ''libfreenect'' are installed, REM they are in ''platform/windows/inf'' in the libfreenect code base.. REM REM Download the MSR Kinect SDK from: REM http://download.microsoft.com/download/8/4/C/84C9EF40-EE49-42C2-AE26-C6E30921182F/KinectSDK32.msi REM REM Explore ''KinectSDK32.msi'' using 7-zip from http://www.7-zip.org, extract the REM ''media1.cab'' file in it and get the firmware file, named ''UACFirmware.*'' REM REM Put ''kinect_upload_fw.exe'', the firmware file and ''kinect_upload_fw.bat'' REM file in the same directory and double_click on the ''kinect_upload_fw.bat'' REM file. Set FIRMWARE="UACFirmware.C9C6E852_35A3_41DC_A57D_BDDEB43DFD04" kinect_upload_fw.exe %FIRMWARE% @PAUSE