summaryrefslogtreecommitdiff
path: root/src/sound_node.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/sound_node.py')
-rwxr-xr-xsrc/sound_node.py90
1 files changed, 0 insertions, 90 deletions
diff --git a/src/sound_node.py b/src/sound_node.py
deleted file mode 100755
index 9d53362..0000000
--- a/src/sound_node.py
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/usr/bin/env python3
-import os
-
-from typing import Optional
-
-from home.config import config
-from home.audio import amixer
-from home.media import MediaNodeServer, SoundRecordStorage, SoundRecorder
-from home import http
-
-
-# This script must be run as root as it runs arecord.
-# Implements HTTP API for amixer and arecord.
-# -------------------------------------------
-
-def _amixer_control_response(control):
- info = amixer.get(control)
- caps = amixer.get_caps(control)
- return http.ok({
- 'caps': caps,
- 'info': info
- })
-
-
-class SoundNodeServer(MediaNodeServer):
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
-
- self.get('/amixer/get-all/', self.amixer_get_all)
- self.get('/amixer/get/{control}/', self.amixer_get)
- self.get('/amixer/{op:mute|unmute|cap|nocap}/{control}/', self.amixer_set)
- self.get('/amixer/{op:incr|decr}/{control}/', self.amixer_volume)
-
- async def amixer_get_all(self, request: http.Request):
- controls_info = amixer.get_all()
- return self.ok(controls_info)
-
- async def amixer_get(self, request: http.Request):
- control = request.match_info['control']
- if not amixer.has_control(control):
- raise ValueError(f'invalid control: {control}')
-
- return _amixer_control_response(control)
-
- async def amixer_set(self, request: http.Request):
- op = request.match_info['op']
- control = request.match_info['control']
- if not amixer.has_control(control):
- raise ValueError(f'invalid control: {control}')
-
- f = getattr(amixer, op)
- f(control)
-
- return _amixer_control_response(control)
-
- async def amixer_volume(self, request: http.Request):
- op = request.match_info['op']
- control = request.match_info['control']
- if not amixer.has_control(control):
- raise ValueError(f'invalid control: {control}')
-
- def get_step() -> Optional[int]:
- if 'step' in request.query:
- step = int(request.query['step'])
- if not 1 <= step <= 50:
- raise ValueError('invalid step value')
- return step
- return None
-
- f = getattr(amixer, op)
- f(control, step=get_step())
-
- return _amixer_control_response(control)
-
-
-if __name__ == '__main__':
- if not os.getegid() == 0:
- raise RuntimeError("Must be run as root.")
-
- config.load('sound_node')
-
- storage = SoundRecordStorage(config['node']['storage'])
-
- recorder = SoundRecorder(storage=storage)
- recorder.start_thread()
-
- server = SoundNodeServer(recorder=recorder,
- storage=storage,
- addr=config.get_addr('node.listen'))
- server.run()