Browse Source

first commit

master
scooty 3 months ago
parent
commit
fecb6800b9
  1. BIN
      door.wav
  2. BIN
      lmutracker3
  3. 67
      lmutracker3.mm
  4. 82
      squeek.py

BIN
door.wav

Binary file not shown.

BIN
lmutracker3

Binary file not shown.

67
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 <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

@ -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()
Loading…
Cancel
Save