1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
|
#! /usr/bin/python3
# -*- coding: utf-8 -*-
"""Test Import / Export and recording.
recording-test.py loads a WAV file, plays it, recording at the same time until
the end of the track, and then exports the recording as a WAV with "-out"
appended to the file name.
To run the test without input prompts, set valid values for
PATH and INFILE.
User supplied variables
-------
PATH: Path to the folder containing the input test file. Also used for exporting the result.
INFILE: Name of the input WAV file.
With a little modification, can be suitable for rinse and repeat with different
input files.
Make sure Audacity is running and that mod-script-pipe is enabled
before running this script.
"""
import os
import sys
import time
import json
# Platform specific file name and file path.
# PATH is the location of files to be imported / exported.
#PATH = './'
PATH = ""
while not os.path.isdir(PATH):
PATH = os.path.realpath(input('Path to test folder: '))
if not os.path.isdir(PATH):
print('Invalid path. Try again.')
print('Test folder: ' + PATH)
#INFILE = "testfile.wav"
INFILE = ""
while not os.path.isfile(os.path.join(PATH, INFILE)):
INFILE = input('Name of input WAV file: ')
# Ensure we have the .wav extension.
INFILE = os.path.splitext(INFILE)[0] + '.wav'
if not os.path.isfile(os.path.join(PATH, INFILE)):
print(f"{os.path.join(PATH, INFILE)} not found. Try again.")
else:
print(f"Input file: {os.path.join(PATH, INFILE)}")
# Remove file extension.
INFILE = os.path.splitext(INFILE)[0]
# Platform specific constants
if sys.platform == 'win32':
print("recording-test.py, running on windows")
PIPE_TO_AUDACITY = '\\\\.\\pipe\\ToSrvPipe'
PIPE_FROM_AUDACITY = '\\\\.\\pipe\\FromSrvPipe'
EOL = '\r\n\0'
else:
print("recording-test.py, running on linux or mac")
PIPE_TO_AUDACITY = '/tmp/audacity_script_pipe.to.' + str(os.getuid())
PIPE_FROM_AUDACITY = '/tmp/audacity_script_pipe.from.' + str(os.getuid())
EOL = '\n'
print("Write to \"" + PIPE_TO_AUDACITY +"\"")
if not os.path.exists(PIPE_TO_AUDACITY):
print(""" ..does not exist.
Ensure Audacity is running with mod-script-pipe.""")
sys.exit()
print("Read from \"" + PIPE_FROM_AUDACITY +"\"")
if not os.path.exists(PIPE_FROM_AUDACITY):
print(""" ..does not exist.
Ensure Audacity is running with mod-script-pipe.""")
sys.exit()
print("-- Both pipes exist. Good.")
TOPIPE = open(PIPE_TO_AUDACITY, 'w')
print("-- File to write to has been opened")
FROMPIPE = open(PIPE_FROM_AUDACITY, 'r')
print("-- File to read from has now been opened too\r\n")
def send_command(command):
"""Send a command to Audacity."""
print("Send: >>> "+command)
TOPIPE.write(command + EOL)
TOPIPE.flush()
def get_response():
"""Get response from Audacity."""
line = FROMPIPE.readline()
result = ""
while True:
result += line
line = FROMPIPE.readline()
# print(f"Line read: [{line}]")
if line == '\n':
return result
def do_command(command):
"""Do the command. Return the response."""
send_command(command)
# time.sleep(0.1) # may be required on slow machines
response = get_response()
print("Rcvd: <<< " + response)
return response
def play_record(filename):
"""Import track and record to new track.
Note that a stop command is not required as playback will stop at end of selection.
"""
do_command(f"Import2: Filename={os.path.join(PATH, filename + '.wav')}")
do_command("Select: Track=0")
do_command("SelTrackStartToEnd")
# Our imported file has one clip. Find the length of it.
clipsinfo = do_command("GetInfo: Type=Clips")
clipsinfo = clipsinfo[:clipsinfo.rfind('BatchCommand finished: OK')]
clips = json.loads(clipsinfo)
duration = clips[0]['end'] - clips[0]['start']
# Now we can start recording.
do_command("Record2ndChoice")
print('Sleeping until recording is complete...')
time.sleep(duration + 0.1)
def export(filename):
"""Export the new track, and deleted both tracks."""
do_command("Select: Track=1 mode=Set")
do_command("SelTrackStartToEnd")
do_command(f"Export2: Filename={os.path.join(PATH, filename)} NumChannels=1.0")
do_command("SelectAll")
do_command("RemoveTracks")
def do_one_file(name):
"""Run test with one input file only."""
play_record(name)
export(name + "-out.wav")
def quick_test():
"""Quick test to ensure pipe is working."""
do_command('Help: CommandName=Help')
quick_test()
# Run the test with "testfile.wav" in the specified PATH.
do_one_file(INFILE)
|