def ThreadLoop(self, startupEvent): try: hDir = CreateFile( self.path, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE, None, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, 0) if hDir == INVALID_HANDLE_VALUE: self.startException = FormatError() startupEvent.set() return overlapped = OVERLAPPED() overlapped.hEvent = CreateEvent(None, 1, 0, None) buffer = (c_byte * BUFSIZE)() events = (HANDLE * 2)(overlapped.hEvent, self.stopEvent) flags = (FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_SECURITY) includeSubdirs = self.includeSubdirs renamePath = None bytesReturned = DWORD() noneCallback = cast(None, LPOVERLAPPED_COMPLETION_ROUTINE) startupEvent.set() while 1: ReadDirectoryChangesW(hDir, buffer, BUFSIZE, includeSubdirs, flags, byref(bytesReturned), byref(overlapped), noneCallback) rc = MsgWaitForMultipleObjects(2, events, 0, INFINITE, QS_ALLINPUT) if rc == WAIT_OBJECT_0: res = GetOverlappedResult(hDir, byref(overlapped), byref(bytesReturned), 1) address = addressof(buffer) while True: fni = FILE_NOTIFY_INFORMATION.from_address(address) length = fni.FileNameLength / WCHAR_SIZE fileName = wstring_at(address + 12, length) action = fni.Action fullFilename = os.path.join(self.path, fileName) if action == FILE_ACTION_ADDED: self.TriggerEvent("Created", (fullFilename, )) elif action == FILE_ACTION_REMOVED: self.TriggerEvent("Deleted", (fullFilename, )) elif action == FILE_ACTION_MODIFIED: self.TriggerEvent("Updated", (fullFilename, )) elif action == FILE_ACTION_RENAMED_OLD_NAME: renamePath = fullFilename elif action == FILE_ACTION_RENAMED_NEW_NAME: self.TriggerEvent("Renamed", (renamePath, fullFilename)) renamePath = None if fni.NextEntryOffset == 0: break address += fni.NextEntryOffset elif rc == WAIT_OBJECT_0 + 1: break CloseHandle(hDir) except: self.thread = None raise
def SetControlValue(hmixer, mixerControl, value): ''' Sets the volumne from the pointer of the object passed through ' [Note: original source taken from MSDN http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q178456&] This function sets the value for a volume control. Returns True if successful ''' valueDetails = MIXERCONTROLDETAILS_UNSIGNED() valueDetails.dwValue = value mixerControlDetails = MIXERCONTROLDETAILS() mixerControlDetails.cbStruct = sizeof(MIXERCONTROLDETAILS) mixerControlDetails.item = 0 mixerControlDetails.dwControlID = mixerControl.dwControlID mixerControlDetails.cbDetails = sizeof(valueDetails) mixerControlDetails.paDetails = addressof(valueDetails) mixerControlDetails.cChannels = 1 # Set the control value rc = mixerSetControlDetails(hmixer, byref(mixerControlDetails), 0) if rc != MMSYSERR_NOERROR: raise SoundMixerException()
def SetControlValue(self, mixer, controlId, value): valueDetails = MIXERCONTROLDETAILS_UNSIGNED() valueDetails.dwValue = value mixerControlDetails = MIXERCONTROLDETAILS() mixerControlDetails.cbStruct = sizeof(MIXERCONTROLDETAILS) mixerControlDetails.item = 0 mixerControlDetails.dwControlID = controlId mixerControlDetails.cbDetails = sizeof(valueDetails) mixerControlDetails.paDetails = addressof(valueDetails) mixerControlDetails.cChannels = 1 rc = mixerSetControlDetails(mixer, byref(mixerControlDetails), 0) if rc != MMSYSERR_NOERROR: raise SoundMixerException()
def GetControlValue(hmixer, mixerControl): valueDetails = MIXERCONTROLDETAILS_UNSIGNED() mixerControlDetails = MIXERCONTROLDETAILS() mixerControlDetails.cbStruct = sizeof(MIXERCONTROLDETAILS) mixerControlDetails.item = 0 mixerControlDetails.dwControlID = mixerControl.dwControlID mixerControlDetails.cbDetails = sizeof(valueDetails) mixerControlDetails.paDetails = addressof(valueDetails) mixerControlDetails.cChannels = 1 # Get the control value rc = mixerGetControlDetails(hmixer, byref(mixerControlDetails), 0) if rc != MMSYSERR_NOERROR: raise SoundMixerException() return valueDetails.dwValue
def ThreadLoop(self, startupEvent): try: hDir = CreateFile( self.path, FILE_LIST_DIRECTORY, FILE_SHARE_READ|FILE_SHARE_WRITE, None, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OVERLAPPED, 0 ) if hDir == INVALID_HANDLE_VALUE: self.startException = FormatError() startupEvent.set() return overlapped = OVERLAPPED() overlapped.hEvent = CreateEvent(None, 1, 0, None) buffer = (c_byte * BUFSIZE )() events = (HANDLE * 2)(overlapped.hEvent, self.stopEvent) flags = ( FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_SECURITY ) includeSubdirs = self.includeSubdirs renamePath = None bytesReturned = DWORD() noneCallback = cast(None, LPOVERLAPPED_COMPLETION_ROUTINE) startupEvent.set() while 1: ReadDirectoryChangesW( hDir, buffer, BUFSIZE, includeSubdirs, flags, byref(bytesReturned), byref(overlapped), noneCallback ) rc = MsgWaitForMultipleObjects( 2, events, 0, INFINITE, QS_ALLINPUT ) if rc == WAIT_OBJECT_0: res = GetOverlappedResult( hDir, byref(overlapped), byref(bytesReturned), 1 ) address = addressof(buffer) while True: fni = FILE_NOTIFY_INFORMATION.from_address(address) length = fni.FileNameLength / WCHAR_SIZE fileName = wstring_at(address + 12, length) action = fni.Action fullFilename = os.path.join(self.path, fileName) if action == FILE_ACTION_ADDED: self.TriggerEvent("Created", (fullFilename,)) elif action == FILE_ACTION_REMOVED: self.TriggerEvent("Deleted", (fullFilename,)) elif action == FILE_ACTION_MODIFIED: self.TriggerEvent("Updated", (fullFilename,)) elif action == FILE_ACTION_RENAMED_OLD_NAME: renamePath = fullFilename elif action == FILE_ACTION_RENAMED_NEW_NAME: self.TriggerEvent( "Renamed", (renamePath, fullFilename) ) renamePath = None if fni.NextEntryOffset == 0: break address += fni.NextEntryOffset elif rc == WAIT_OBJECT_0+1: break CloseHandle(hDir) except: self.thread = None raise