Skip to content
Snippets Groups Projects
Commit 5f8c7b93 authored by Pintér Gergő's avatar Pintér Gergő
Browse files

Működő, hang, az eredeti tervvel

parent a1d58a86
No related branches found
No related tags found
No related merge requests found
...@@ -4,6 +4,7 @@ import time ...@@ -4,6 +4,7 @@ import time
import threading import threading
import constants as c import constants as c
# Globális változók # Globális változók
sample_rate = 44100 sample_rate = 44100
phase_left = 0 phase_left = 0
...@@ -12,6 +13,9 @@ is_playing = False ...@@ -12,6 +13,9 @@ is_playing = False
last_call_time = 0 last_call_time = 0
controller_lock = threading.Lock() controller_lock = threading.Lock()
stream = None stream = None
volume = 0.2
max_volume = 1
past_first_N3 = False
def check_pip(tester_list): def check_pip(tester_list):
...@@ -22,16 +26,21 @@ def check_pip(tester_list): ...@@ -22,16 +26,21 @@ def check_pip(tester_list):
- Itt implementáljuk a logikát, ami dönt a feedbackról. Ez visszamenőleg tudja elemezni a listát - Itt implementáljuk a logikát, ami dönt a feedbackról. Ez visszamenőleg tudja elemezni a listát
és ennek megfelelően dönt és ennek megfelelően dönt
- Meghívhatja az audio_controller és az analyze_file is - Meghívhatja az audio_controller és az analyze_file is
- Addig nincsen feedback, amég az első N3 ciklus meg nem történt, hogy az alvás megszilárduljon.
:param tester_list: Yasa_output_list, vagy kimentett lista :param tester_list: Yasa_output_list, vagy kimentett lista
:return: bool, szükséges e az audiofeedback az aktuális epochra :return: bool, szükséges e az audiofeedback az aktuális epochra
""" """
if len(tester_list) > 60: global past_first_N3
if not past_first_N3:
last_ten = [{k: v for k, v in elem.items() if k != 'Stage'} for elem in tester_list[-10:]]
deep_sleep_met = all((elem['N3'] > 0.6) for elem in last_ten)
if deep_sleep_met:
past_first_N3 = True
else:
last_probas = [{k: v for k, v in elem.items() if k != 'Stage'} for elem in tester_list[-c.CHECK_LEN:]] last_probas = [{k: v for k, v in elem.items() if k != 'Stage'} for elem in tester_list[-c.CHECK_LEN:]]
all_conditions_met = all((elem['N2'] + elem['N3'] > 0.7) and (elem['N3'] <= 0.5) for elem in last_probas) all_conditions_met = all((elem['N2'] + elem['N3'] > c.N2_N3) and (elem['N3'] <= c.N3) for elem in last_probas)
pre_check_conditions_met = all( return all_conditions_met
(elem['N2'] + elem['N3'] + elem['R'] >= 0.6) for elem in tester_list[-c.CHECK_LEN - 15:-c.CHECK_LEN])
return all_conditions_met and pre_check_conditions_met
def callback(outdata, frames, time, status): def callback(outdata, frames, time, status):
...@@ -42,10 +51,10 @@ def callback(outdata, frames, time, status): ...@@ -42,10 +51,10 @@ def callback(outdata, frames, time, status):
- Létrehozza és betölti folyamatosan a binautális ütemet a streameléshez, és követi a fázist - Létrehozza és betölti folyamatosan a binautális ütemet a streameléshez, és követi a fázist
- Korrigálja a túlcsordulást a végén - Korrigálja a túlcsordulást a végén
""" """
global phase_left, phase_right global phase_left, phase_right, volume
t = (np.arange(frames) / sample_rate).reshape(-1, 1) t = (np.arange(frames) / sample_rate).reshape(-1, 1)
left = np.sin(2 * np.pi * c.FREQUENCY_LEFT * t + phase_left) left = np.sin(2 * np.pi * c.FREQUENCY_LEFT * t + phase_left) * volume
right = np.sin(2 * np.pi * c.FREQUENCY_RIGHT * t + phase_right) right = np.sin(2 * np.pi * c.FREQUENCY_RIGHT * t + phase_right) * volume
outdata[:] = np.hstack([left, right]) outdata[:] = np.hstack([left, right])
phase_left += 2 * np.pi * c.FREQUENCY_LEFT * frames / sample_rate phase_left += 2 * np.pi * c.FREQUENCY_LEFT * frames / sample_rate
phase_right += 2 * np.pi * c.FREQUENCY_RIGHT * frames / sample_rate phase_right += 2 * np.pi * c.FREQUENCY_RIGHT * frames / sample_rate
...@@ -64,8 +73,9 @@ def start_stream(): ...@@ -64,8 +73,9 @@ def start_stream():
lesz kellően, és nem recseg amikor nagyobb számításigény merül fel a kódban lesz kellően, és nem recseg amikor nagyobb számításigény merül fel a kódban
""" """
global is_playing, stream global is_playing, stream, volume
if not is_playing: if not is_playing:
volume = 0.2
stream = sd.OutputStream(channels=2, callback=callback, samplerate=sample_rate, blocksize=sample_rate) stream = sd.OutputStream(channels=2, callback=callback, samplerate=sample_rate, blocksize=sample_rate)
stream.start() stream.start()
is_playing = True is_playing = True
...@@ -93,7 +103,7 @@ def audio_controller(yasa_output_list): ...@@ -93,7 +103,7 @@ def audio_controller(yasa_output_list):
lejátszás lejátszás
- Ha valami miatt egy percig nincs hívás leállítja a lejátszást - Ha valami miatt egy percig nincs hívás leállítja a lejátszást
""" """
global is_playing, last_call_time, controller_lock global is_playing, last_call_time, controller_lock, volume
should_play = check_pip(yasa_output_list) should_play = check_pip(yasa_output_list)
with controller_lock: with controller_lock:
current_time = time.time() current_time = time.time()
...@@ -106,5 +116,9 @@ def audio_controller(yasa_output_list): ...@@ -106,5 +116,9 @@ def audio_controller(yasa_output_list):
start_stream() start_stream()
elif not should_play and is_playing: elif not should_play and is_playing:
stop_stream() stop_stream()
elif should_play and is_playing:
volume = min(volume + 0.2, max_volume)
last_call_time = current_time last_call_time = current_time
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment