Skip to content

Commit 29af03e

Browse files
stream_record.py: avoid seeking by writing large file size
1 parent d2f80db commit 29af03e

File tree

1 file changed

+10
-19
lines changed

1 file changed

+10
-19
lines changed

internal_filesystem/lib/mpos/audio/stream_record.py

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class RecordStream:
4646
# Default recording parameters
4747
DEFAULT_SAMPLE_RATE = 16000 # 16kHz - good for voice
4848
DEFAULT_MAX_DURATION_MS = 60000 # 60 seconds max
49+
DEFAULT_FILESIZE = 1024 * 1024 * 1024 # 1GB data size because it can't be quickly set after recording
4950

5051
def __init__(self, file_path, duration_ms, sample_rate, i2s_pins, on_complete):
5152
"""
@@ -128,7 +129,7 @@ def _create_wav_header(sample_rate, num_channels, bits_per_sample, data_size):
128129
return bytes(header)
129130

130131
@staticmethod
131-
def _update_wav_header(f, data_size):
132+
def _update_wav_header(file_path, data_size):
132133
"""
133134
Update WAV header with final data size.
134135
@@ -138,6 +139,8 @@ def _update_wav_header(f, data_size):
138139
"""
139140
file_size = data_size + 36
140141

142+
f = open(file_path, 'r+b')
143+
141144
# Update file size at offset 4
142145
f.seek(4)
143146
f.write(file_size.to_bytes(4, 'little'))
@@ -146,6 +149,9 @@ def _update_wav_header(f, data_size):
146149
f.seek(40)
147150
f.write(data_size.to_bytes(4, 'little'))
148151

152+
f.close()
153+
154+
149155
# ----------------------------------------------------------------------
150156
# Desktop simulation - generate 440Hz sine wave
151157
# ----------------------------------------------------------------------
@@ -214,7 +220,7 @@ def record(self):
214220
self.sample_rate,
215221
num_channels=1,
216222
bits_per_sample=16,
217-
data_size=0
223+
data_size=self.DEFAULT_FILESIZE
218224
)
219225
f.write(header)
220226
print(f"RecordStream: Header written ({len(header)} bytes)")
@@ -319,23 +325,8 @@ def record(self):
319325
f.close()
320326
print(f"RecordStream: File closed in {time.ticks_diff(time.ticks_ms(), t0)}ms")
321327

322-
# Now reopen to update header
323-
# This avoids the massive delay caused by seeking backwards in a large file
324-
# on ESP32 with SD card (FAT filesystem buffering issue)
325-
print(f"RecordStream: Reopening file to update WAV header...")
326-
t0 = time.ticks_ms()
327-
f = open(self.file_path, 'r+b')
328-
print(f"RecordStream: File reopened in {time.ticks_diff(time.ticks_ms(), t0)}ms")
329-
330-
print(f"RecordStream: Updating WAV header with data_size={self._bytes_recorded}")
331-
t0 = time.ticks_ms()
332-
self._update_wav_header(f, self._bytes_recorded)
333-
print(f"RecordStream: Header updated in {time.ticks_diff(time.ticks_ms(), t0)}ms")
334-
335-
print(f"RecordStream: Closing header file...")
336-
t0 = time.ticks_ms()
337-
f.close()
338-
print(f"RecordStream: Header file closed in {time.ticks_diff(time.ticks_ms(), t0)}ms")
328+
# Disabled because seeking takes too long on LittleFS2:
329+
#self._update_wav_header(self.file_path, self._bytes_recorded)
339330

340331
elapsed_ms = time.ticks_diff(time.ticks_ms(), start_time)
341332
print(f"RecordStream: Finished recording {self._bytes_recorded} bytes ({elapsed_ms}ms)")

0 commit comments

Comments
 (0)