diff --git a/door.wav b/door.wav new file mode 100644 index 0000000..debb6c1 Binary files /dev/null and b/door.wav differ diff --git a/lmutracker3 b/lmutracker3 new file mode 100755 index 0000000..415b413 Binary files /dev/null and b/lmutracker3 differ diff --git a/lmutracker3.mm b/lmutracker3.mm new file mode 100644 index 0000000..cf71529 --- /dev/null +++ b/lmutracker3.mm @@ -0,0 +1,67 @@ +// squeeky door laptop hinge haha +// +// lmutracker.mm +// +// clang -o lmutracker lmutracker.mm -framework IOKit -framework CoreFoundation +//// +// mplayer -ss 00:00:01.90 -endpos 00:00:02.90 door.mp3 +// +// via:https://stackoverflow.com/questions/17625495/how-do-you-programmatically-access-the-ambient-light-sensor-on-mac-os-x-10-5 + + +#include +#import +#import + +static double updateInterval = 0; //0 means only run once +static io_connect_t dataPort = 0; + +void updateTimerCallBack(CFRunLoopTimerRef timer, void *info) { + kern_return_t kr; + uint32_t outputs = 2; + uint64_t values[outputs]; + + kr = IOConnectCallMethod(dataPort, 0, nil, 0, nil, 0, values, &outputs, nil, 0); + if (kr == KERN_SUCCESS) { + printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b%8lld", values[0]); + //return; + exit(0); // exit program after getting value! + } + + if (kr == kIOReturnBusy) { + return; + } + + mach_error("I/O Kit error:", kr); + exit(kr); +} + +int main(void) { + kern_return_t kr; + io_service_t serviceObject; + CFRunLoopTimerRef updateTimer; + + serviceObject = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleLMUController")); + if (!serviceObject) { + fprintf(stderr, "failed to find ambient light sensors\n"); + exit(1); + } + + kr = IOServiceOpen(serviceObject, mach_task_self(), 0, &dataPort); + IOObjectRelease(serviceObject); + if (kr != KERN_SUCCESS) { + mach_error("IOServiceOpen:", kr); + exit(kr); + } + + setbuf(stdout, NULL); + printf("%8ld", 0L); + + updateTimer = CFRunLoopTimerCreate(kCFAllocatorDefault, + CFAbsoluteTimeGetCurrent() + updateInterval, updateInterval, + 0, 0, updateTimerCallBack, NULL); + CFRunLoopAddTimer(CFRunLoopGetCurrent(), updateTimer, kCFRunLoopDefaultMode); + CFRunLoopRun(); + + exit(0); +} \ No newline at end of file diff --git a/squeek.py b/squeek.py new file mode 100644 index 0000000..79f43fa --- /dev/null +++ b/squeek.py @@ -0,0 +1,82 @@ +import subprocess +import shlex +from threading import Thread +from time import sleep +import pyaudio #pip3 install pyaudio +import wave + +# set desired values +start = 1 +length = 3 + +# open wave file +wave_file = wave.open('door.wav', 'rb') + +# initialize audio +py_audio = pyaudio.PyAudio() +stream = py_audio.open(format=py_audio.get_format_from_width(wave_file.getsampwidth()), + channels=wave_file.getnchannels(), + rate=wave_file.getframerate(), + output=True) + +# skip unwanted frames +n_frames = int(start * wave_file.getframerate()) +wave_file.setpos(n_frames) + +# write desired frames to audio buffer +n_frames = int(length * wave_file.getframerate()) +frames = wave_file.readframes(n_frames) + + + +def run_command(command): + process = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE) + while True: + output = process.stdout.readline().decode() + if output == '' and process.poll() is not None: + break + if output: + output = output.strip() + return int(output[20:]) + rc = process.poll() + return rc + + +class Worker(Thread): + def __init__(self, custom_handler): + + self.handler = custom_handler + + def run(self): + + currentValue = 0 #store values to check if ambient light is increasing or decreasing, dont do anything if no change, play from position based on scale(0-100k is mapped to 0-100% of song) + previousValue = 0 + while(True): + sleep(0.05) + #sleep(0.05) + currentValue = run_command("./lmutracker3") + if currentValue > previousValue: + print("light is increasing") + stream.write(frames) + + # close and terminate everything properly + #stream.close() + #py_audio.terminate() + #wave_file.close() + elif currentValue < previousValue: + print("light is decreasing") + else: + print("light remains the same") + previousValue = currentValue + #print(testval) + #check handler + if self.handler: + #do something + pass +handler = {} +worker = Worker(handler) + +#start thread +worker.run() + +