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
|
"""PyAudio Example: Query PortAudio Host APIs, devices, and supported rates."""
import pyaudio
STANDARD_SAMPLE_RATES = [
8000.0, 9600.0, 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0,
44100.0, 48000.0, 88200.0, 96000.0, 192000.0
]
def print_header(header):
print()
print(header)
print("=" * len(header))
def print_device_info(p, device_info):
for name, value in device_info.items():
# If host API, value is an index, so also print the friendly name.
if name == "hostApi":
value = f"{value} ({p.get_host_api_info_by_index(value)['name']})"
# Crashing? See http://stackoverflow.com/a/5146914
print(f"{name}: {value}")
# Print supported format rates
input_supported_rates = []
output_supported_rates = []
full_duplex_rates = []
for rate in STANDARD_SAMPLE_RATES:
if device_info["maxInputChannels"] > 0:
try:
if p.is_format_supported(
rate,
input_device=device_info["index"],
input_channels=device_info["maxInputChannels"],
input_format=pyaudio.paInt16):
input_supported_rates.append(rate)
except ValueError:
pass
if device_info["maxOutputChannels"] > 0:
try:
if p.is_format_supported(
rate,
output_device=device_info["index"],
output_channels=device_info["maxOutputChannels"],
output_format=pyaudio.paInt16):
output_supported_rates.append(rate)
except ValueError:
pass
if (device_info["maxInputChannels"] > 0
and device_info["maxOutputChannels"] > 0):
try:
if p.is_format_supported(
rate,
input_device=device_info["index"],
input_channels=device_info["maxInputChannels"],
input_format=pyaudio.paInt16,
output_device=device_info["index"],
output_channels=device_info["maxOutputChannels"],
output_format=pyaudio.paInt16):
full_duplex_rates.append(rate)
except ValueError:
pass
if input_supported_rates:
print(f"Input rates: {input_supported_rates}")
if output_supported_rates:
print(f"Output rates: {output_supported_rates}")
if full_duplex_rates:
print(f"Full duplex rates: {full_duplex_rates}")
print("-" * 32)
def print_system_info(p):
print_header("PortAudio System Info")
print(f"Version: {pyaudio.get_portaudio_version()}")
print(f"Version Text: {pyaudio.get_portaudio_version_text()}")
print(f"Number of Host APIs: {p.get_host_api_count()}")
print(f"Number of Devices: {p.get_device_count()}")
def print_all_host_apis(p):
print_header("Host APIs")
for i in range(p.get_host_api_count()):
for key, value in p.get_host_api_info_by_index(i).items():
print(f"{key}: {value}")
print("-" * 26)
def print_all_device_infos(p):
print_header("Devices")
for i in range(p.get_device_count()):
print_device_info(p, p.get_device_info_by_index(i))
def print_default_devices(p):
print_header("Default Devices")
try:
device_info = p.get_default_input_device_info()
except IOError as err:
print(f"No Input devices: {err}")
else:
print(f"Default Input Device: {device_info['index']}")
print_device_info(p, device_info)
try:
device_info = p.get_default_output_device_info()
except IOError as err:
print(f"No Output devices: {err}")
else:
print(f"Default Output Device: {device_info['index']}")
print_device_info(p, device_info)
if __name__ == "__main__":
p = pyaudio.PyAudio()
print_system_info(p)
print_all_host_apis(p)
print_all_device_infos(p)
print_default_devices(p)
p.terminate()
|