audio panel can be enabled in config; audio recording debug statements

This commit is contained in:
Frank DeMarco 2020-06-27 15:20:02 -04:00
parent 74cb3c7b1e
commit 6f8985d3f4
4 changed files with 34 additions and 11 deletions

View File

@ -22,7 +22,10 @@ class Audio(Animation):
if self.check_command_line("-mute"): if self.check_command_line("-mute"):
self.get_configuration().set("audio", "volume", 0) self.get_configuration().set("audio", "volume", 0)
self.register(self.play_sfx) self.register(self.play_sfx)
self.audio_panel = AudioPanel(self) if self.get_configuration("audio", "panel-enabled"):
self.audio_panel = AudioPanel(self)
else:
self.audio_panel = None
self.subscribe(self.respond) self.subscribe(self.respond)
self.sfx = {} self.sfx = {}
self.load_sfx() self.load_sfx()
@ -199,9 +202,13 @@ class Audio(Animation):
return False return False
return True return True
def is_audio_panel_active(self):
return self.audio_panel and self.audio_panel.active
def update(self): def update(self):
Animation.update(self) Animation.update(self)
self.audio_panel.update() if self.audio_panel:
self.audio_panel.update()
class BGM(GameChild): class BGM(GameChild):

View File

@ -105,8 +105,10 @@ class Configuration(RawConfigParser):
set_option(section, "directory-name-format", "%Y%m%d%H%M%S", False) set_option(section, "directory-name-format", "%Y%m%d%H%M%S", False)
set_option(section, "file-extension", "png", False) set_option(section, "file-extension", "png", False)
set_option(section, "frame-format", "RGB", False) set_option(section, "frame-format", "RGB", False)
set_option(section, "framerate", "100", False) set_option(section, "framerate", "40", False)
set_option(section, "temp-directory", "", False) set_option(section, "temp-directory", "", False)
set_option(section, "record-audio", "yes", False)
set_option(section, "filename-digits", "6", False)
section = "mouse" section = "mouse"
add_section(section) add_section(section)
set_option(section, "visible", "yes", False) set_option(section, "visible", "yes", False)
@ -152,6 +154,7 @@ class Configuration(RawConfigParser):
set_option(section, "sfx-volume", "1.0", False) set_option(section, "sfx-volume", "1.0", False)
set_option(section, "bgm-volume", "1.0", False) set_option(section, "bgm-volume", "1.0", False)
set_option(section, "volume", "1.0", False) set_option(section, "volume", "1.0", False)
set_option(section, "panel-enabled", "no", False)
set_option(section, "panel-font", None, False) set_option(section, "panel-font", None, False)
section = "interpolator-gui" section = "interpolator-gui"
add_section(section) add_section(section)
@ -416,9 +419,9 @@ class TypeDeclarations(dict):
"video-recordings": {"path": ["rel-path", "path"], "video-recordings": {"path": ["rel-path", "path"],
"int": "framerate", "int": ["framerate", "filename-digits"],
"bool": "enable"}, "bool": ["enable", "record-audio"]},
"setup": {"list": ["classifiers", "resource-search-path", "setup": {"list": ["classifiers", "resource-search-path",
"requirements", "data-exclude", "requirements", "data-exclude",
@ -452,7 +455,10 @@ class TypeDeclarations(dict):
"bgm-repository-path", "bgm-project-path" "bgm-repository-path", "bgm-project-path"
], ],
"float": ["sfx-volume", "bgm-volume", "volume"] "float": ["sfx-volume", "bgm-volume", "volume"],
"bool": "panel-enabled"
}, },
"event": {"int": "command-id-offset"}, "event": {"int": "command-id-offset"},

View File

@ -59,7 +59,7 @@ class Game(Animation):
def frame(self): def frame(self):
self.time_filter.update() self.time_filter.update()
self.delegate.dispatch() self.delegate.dispatch()
if not self.interpolator.is_gui_active() and not self.get_audio().audio_panel.active: if not self.interpolator.is_gui_active() and not self.get_audio().is_audio_panel_active():
Animation.update(self) Animation.update(self)
if self.confirming_quit: if self.confirming_quit:
self.time_filter.close() self.time_filter.close()

View File

@ -45,6 +45,10 @@ class VideoRecorder(GameChild):
elif compare(event, "reset-game"): elif compare(event, "reset-game"):
self.reset() self.reset()
def is_audio_recording_enabled(self):
return self.get_configuration("video-recordings", "record-audio") or\
self.check_command_line("-enable-sound-recording")
def toggle_record(self): def toggle_record(self):
recording = not self.recording recording = not self.recording
if recording: if recording:
@ -53,7 +57,8 @@ class VideoRecorder(GameChild):
if temp_dir == "": if temp_dir == "":
temp_dir = None temp_dir = None
self.frames = TemporaryFile(dir=temp_dir) self.frames = TemporaryFile(dir=temp_dir)
if self.check_command_line("-enable-sound-recording"): print("writing video frames to {}".format(self.frames.name))
if self.is_audio_recording_enabled():
import pyaudio import pyaudio
import wave import wave
self.audio_frames = [] self.audio_frames = []
@ -61,9 +66,12 @@ class VideoRecorder(GameChild):
def audio_callback(in_data, frame_count, time_info, status): def audio_callback(in_data, frame_count, time_info, status):
self.audio_frames.append(in_data) self.audio_frames.append(in_data)
return (in_data, pyaudio.paContinue) return (in_data, pyaudio.paContinue)
for ii in range(self.audio_recorder.get_device_count()):
print("device {}: {}".format(ii, self.audio_recorder.get_device_info_by_index(ii)))
self.audio_stream = self.audio_recorder.open(format=pyaudio.paInt32, channels=2, rate=44100, self.audio_stream = self.audio_recorder.open(format=pyaudio.paInt32, channels=2, rate=44100,
frames_per_buffer=1024, frames_per_buffer=1024,
input=True, stream_callback=audio_callback) input=True, stream_callback=audio_callback)
print("writing audio data to {}".format(self.audio_stream))
else: else:
self.write_frames() self.write_frames()
self.recording = recording self.recording = recording
@ -75,7 +83,7 @@ class VideoRecorder(GameChild):
root = join(self.root, strftime(self.directory_name_format)) root = join(self.root, strftime(self.directory_name_format))
if not exists(root): if not exists(root):
makedirs(root) makedirs(root)
if self.check_command_line("-enable-sound-recording"): if self.is_audio_recording_enabled():
import pyaudio import pyaudio
import wave import wave
self.audio_stream.stop_stream() self.audio_stream.stop_stream()
@ -87,14 +95,16 @@ class VideoRecorder(GameChild):
wf.setframerate(44100) wf.setframerate(44100)
wf.writeframes(b"".join(self.audio_frames)) wf.writeframes(b"".join(self.audio_frames))
wf.close() wf.close()
print("saved audio in {}".format(root))
size = self.display_surface.get_size() size = self.display_surface.get_size()
frames = self.frames frames = self.frames
frames.seek(0) frames.seek(0)
for ii, frame in enumerate( for ii, frame in enumerate(
iter(lambda: frames.read(self.frame_length), b'')): iter(lambda: frames.read(self.frame_length), b'')):
path = join(root, "%04i.png" % ii) path = join(root, "{:0{digits}}.png".format(
ii, digits=self.get_configuration("video-recordings", "filename-digits")))
save(frombuffer(frame, size, self.frame_format), path) save(frombuffer(frame, size, self.frame_format), path)
print("wrote video frames to " + root) print("saved video frames in {}".format(root))
def update(self): def update(self):
ticks = get_ticks() ticks = get_ticks()