first commit

This commit is contained in:
scooty 2021-07-31 23:30:58 +02:00
parent 8bd8921c2a
commit fecb6800b9
4 changed files with 149 additions and 0 deletions

BIN
door.wav Normal file

Binary file not shown.

BIN
lmutracker3 Executable file

Binary file not shown.

67
lmutracker3.mm Normal file
View File

@ -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 <mach/mach.h>
#import <IOKit/IOKitLib.h>
#import <CoreFoundation/CoreFoundation.h>
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);
}

82
squeek.py Normal file
View File

@ -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()