def __init__(self): super(AudioTest, self).__init__() self.m_device = QAudioDeviceInfo.defaultOutputDevice() self.m_output = None self.initializeWindow() self.initializeAudio()
def __init__(self, parent=None): print("Tone Widget inst") QWidget.__init__(self, parent) self.activeGen = ActiveGen(sampleRate=SAMPLE_RATE, samplePerRead=Meep.SAMPLES_PER_READ) self.createUI(self) # Meep playback format initialization format = QAudioFormat() format.setChannelCount(AUDIO_CHANS) format.setSampleRate(SAMPLE_RATE) format.setSampleSize(SAMPLE_SIZE) format.setCodec("audio/pcm") format.setByteOrder(QAudioFormat.LittleEndian) format.setSampleType(QAudioFormat.SignedInt) # check compatibility of format with device info = QAudioDeviceInfo(QAudioDeviceInfo.defaultOutputDevice()) if info.isFormatSupported(format) is False: print( "Raw audio format not supported by backend, cannot play audio." ) return None # Audio Output init self.output = QAudioOutput(format, self) output_buffer_size = \ int(2*SAMPLE_RATE \ *CTRL_INTERVAL/1000) self.output.setBufferSize(output_buffer_size) # initialize and start the audio playback self.generator = Meep(format, self.activeGen, self) self.generator.start() self.output.start(self.generator) # Create the port reader object self.midiListener = MidiPortReader() # Create a thread which will read it self.listenerThread = QThread() # move QObjet to a new thread self.midiListener.moveToThread(self.listenerThread) # Connect the signals to slot functions self.midiListener.newNoteFrequency.connect(self.activeGen.setFreq) self.midiListener.newNotePress.connect(self.activeGen.setNote) # Tell Qt the function to call # when it starts the thread self.listenerThread.started.connect(self.midiListener.listener) # start the thread self.listenerThread.start()
def __init__(self, parent=None): QWidget.__init__(self, parent) format = QAudioFormat() format.setChannelCount(1) format.setSampleRate(22050) format.setSampleSize(16) format.setCodec("audio/pcm") format.setByteOrder(QAudioFormat.LittleEndian) format.setSampleType(QAudioFormat.SignedInt) self.output = QAudioOutput(format, self) self.frequency = 440 self.volume = 0 self.buffer = QBuffer() self.data = QByteArray() self.deviceLineEdit = QLineEdit() self.deviceLineEdit.setReadOnly(True) self.deviceLineEdit.setText( QAudioDeviceInfo.defaultOutputDevice().deviceName()) self.pitchSlider = QSlider(Qt.Horizontal) self.pitchSlider.setMaximum(100) self.volumeSlider = QSlider(Qt.Horizontal) self.volumeSlider.setMaximum(32767) self.volumeSlider.setPageStep(1024) self.playButton = QPushButton(self.tr("&Play")) self.pitchSlider.valueChanged.connect(self.changeFrequency) self.volumeSlider.valueChanged.connect(self.changeVolume) self.playButton.clicked.connect(self.play) formLayout = QFormLayout() formLayout.addRow(self.tr("Device:"), self.deviceLineEdit) formLayout.addRow(self.tr("P&itch:"), self.pitchSlider) formLayout.addRow(self.tr("&Volume:"), self.volumeSlider) buttonLayout = QVBoxLayout() buttonLayout.addWidget(self.playButton) buttonLayout.addStretch() horizontalLayout = QHBoxLayout(self) horizontalLayout.addLayout(formLayout) horizontalLayout.addLayout(buttonLayout) self.play() self.createData()
def initializeAudio(self): self.m_pullTimer = QTimer(self, timeout=self.pullTimerExpired) self.m_pullMode = True self.m_format = QAudioFormat() self.m_format.setSampleRate(self.DataSampleRateHz) self.m_format.setChannelCount(1) self.m_format.setSampleSize(16) self.m_format.setCodec('audio/pcm') self.m_format.setByteOrder(QAudioFormat.LittleEndian) self.m_format.setSampleType(QAudioFormat.SignedInt) info = QAudioDeviceInfo(QAudioDeviceInfo.defaultOutputDevice()) if not info.isFormatSupported(self.m_format): qWarning("Default format not supported - trying to use nearest") self.m_format = info.nearestFormat(self.m_format) self.m_generator = Generator(self.m_format, self.DurationSeconds * 1000000, self.ToneSampleRateHz, self) self.createAudioOutput()
def _uic(self): """ set up our layout which consists of: Big Honkin' Label [input combobox] [output combobox] [volume slider] [x] Mute hooking put the signals to useful slots is the job of __init__. Here just make the layout. """ self.setMinimumWidth(400) # Create the big honkin' label and logo icon_pixmap = QPixmap(":/icon.png").scaledToWidth(64) icon_label = QLabel() icon_label.setPixmap(icon_pixmap) text_label = QLabel("Sidetone!") hb_label = QHBoxLayout() hb_label.addStretch(1) hb_label.addWidget(icon_label, 0) hb_label.addWidget(text_label, 0) hb_label.addStretch(1) # Create a list of QAudioInfo objects for inputs self.input_info_list = QAudioDeviceInfo.availableDevices(QAudio.AudioInput) if 0 == len(self.input_info_list): self.input_info_list = [QAudioDeviceInfo.defaultInputDevice()] # Create a combo box and populate it with names of inputs self.cb_inputs = QComboBox() self.cb_inputs.addItems([audio_info.deviceName() for audio_info in self.input_info_list]) # Create a list of QAudioInfo objects for outputs self.otput_info_list = QAudioDeviceInfo.availableDevices(QAudio.AudioOutput) if 0 == len(self.otput_info_list): self.otput_info_list = [QAudioDeviceInfo.defaultOutputDevice()] self.status_bar.showMessage( "{} inputs {} otputs".format(len(self.input_info_list), len(self.otput_info_list)), 2000 ) # Create a combo box and populate it with names of outputs self.cb_otputs = QComboBox() self.cb_otputs.addItems([audio_info.deviceName() for audio_info in self.otput_info_list]) # Lay those two out aligned to the outside hb_combos = QHBoxLayout() hb_combos.addWidget(self.cb_inputs, 1) hb_combos.addStretch(0) hb_combos.addWidget(self.cb_otputs, 1) # Create a volume slider from 0 to 100. self.volume = QSlider(Qt.Horizontal, self) self.volume.setMinimum(0) self.volume.setMaximum(100) self.volume.setTickInterval(10) self.volume.setTickPosition(QSlider.TicksBothSides) # Create a checkbox "Mute" self.mute = QCheckBox("Mute") # Put those together in a row squeezed in the center hb_volume = QHBoxLayout() hb_volume.addStretch(1) hb_volume.addWidget(self.volume, 1) hb_volume.addWidget(self.mute, 0) hb_volume.addStretch(1) # Stack all those up as this widget's layout vlayout = QVBoxLayout() vlayout.addLayout(hb_label) vlayout.addLayout(hb_combos) vlayout.addLayout(hb_volume) self.setLayout(vlayout)
def _uic(self): ''' set up our layout which consists of: Big Honkin' Label [input combobox] [output combobox] [volume slider] [x] Mute hooking put the signals to useful slots is the job of __init__. Here just make the layout. ''' self.setMinimumWidth(400) # Create the big honkin' label and logo icon_pixmap = QPixmap(':/icon.png').scaledToWidth(64) icon_label = QLabel() icon_label.setPixmap(icon_pixmap) text_label = QLabel("Sidetone!") hb_label = QHBoxLayout() hb_label.addStretch(1) hb_label.addWidget(icon_label, 0) hb_label.addWidget(text_label, 0) hb_label.addStretch(1) # Create a list of QAudioInfo objects for inputs self.input_info_list = QAudioDeviceInfo.availableDevices( QAudio.AudioInput) if 0 == len(self.input_info_list): self.input_info_list = [QAudioDeviceInfo.defaultInputDevice()] # Create a combo box and populate it with names of inputs self.cb_inputs = QComboBox() self.cb_inputs.addItems( [audio_info.deviceName() for audio_info in self.input_info_list]) # Create a list of QAudioInfo objects for outputs self.otput_info_list = QAudioDeviceInfo.availableDevices( QAudio.AudioOutput) if 0 == len(self.otput_info_list): self.otput_info_list = [QAudioDeviceInfo.defaultOutputDevice()] self.status_bar.showMessage( '{} inputs {} otputs'.format(len(self.input_info_list), len(self.otput_info_list)), 2000) # Create a combo box and populate it with names of outputs self.cb_otputs = QComboBox() self.cb_otputs.addItems( [audio_info.deviceName() for audio_info in self.otput_info_list]) # Lay those two out aligned to the outside hb_combos = QHBoxLayout() hb_combos.addWidget(self.cb_inputs, 1) hb_combos.addStretch(0) hb_combos.addWidget(self.cb_otputs, 1) # Create a volume slider from 0 to 100. self.volume = QSlider(Qt.Horizontal, self) self.volume.setMinimum(0) self.volume.setMaximum(100) self.volume.setTickInterval(10) self.volume.setTickPosition(QSlider.TicksBothSides) # Create a checkbox "Mute" self.mute = QCheckBox('Mute') # Put those together in a row squeezed in the center hb_volume = QHBoxLayout() hb_volume.addStretch(1) hb_volume.addWidget(self.volume, 1) hb_volume.addWidget(self.mute, 0) hb_volume.addStretch(1) # Stack all those up as this widget's layout vlayout = QVBoxLayout() vlayout.addLayout(hb_label) vlayout.addLayout(hb_combos) vlayout.addLayout(hb_volume) self.setLayout(vlayout)
def _uic(self): ''' set up our layout which consists of: Big Honkin' Label [input combobox] [output combobox] [volume slider] [x] Mute Hooking the signals to useful slots is the job of __init__. Here just make the layout. ''' self.setMinimumWidth(400) # Create the big honkin' label and logo icon_pixmap = QPixmap(':/icon.png').scaledToWidth(64) icon_label = QLabel() icon_label.setPixmap(icon_pixmap) text_label = QLabel("Sidetone!") hb_label = QHBoxLayout() hb_label.addStretch(1) hb_label.addWidget(icon_label, 0) hb_label.addWidget(text_label, 0) hb_label.addStretch(1) # Create a list of QAudioInfo objects for inputs self.input_info_list = QAudioDeviceInfo.availableDevices( QAudio.AudioInput) if 0 == len(self.input_info_list): self.input_info_list = [QAudioDeviceInfo.defaultInputDevice()] # Make a list of the name-strings for those items. in_dev_names = [ audio_info.deviceName() for audio_info in self.input_info_list ] # Create a combo box and populate it with those names self.cb_inputs = QComboBox() self.cb_inputs.addItems(in_dev_names) # If the in_dev_name from the previous run is in the current list, # make it current, otherwise pick the first item. in_dev_name = self.settings.value('in_dev_name', 'unknown') if in_dev_name in in_dev_names: self.cb_inputs.setCurrentIndex(in_dev_names.index(in_dev_name)) else: self.cb_inputs.setCurrentIndex(0) # Create a list of QAudioInfo objects for outputs self.otput_info_list = QAudioDeviceInfo.availableDevices( QAudio.AudioOutput) if 0 == len(self.otput_info_list): self.otput_info_list = [QAudioDeviceInfo.defaultOutputDevice()] # Make a list of the name-strings of those things ot_dev_names = [ audio_info.deviceName() for audio_info in self.otput_info_list ] # Create a combo box and populate it with those names self.cb_otputs = QComboBox() self.cb_otputs.addItems(ot_dev_names) # If the ot_dev_name from the previous run is in the current list, # make it the current choice in the box. ot_dev_name = self.settings.value('ot_dev_name', 'unknown') if ot_dev_name in ot_dev_names: self.cb_otputs.setCurrentIndex(ot_dev_names.index(ot_dev_name)) else: self.cb_otputs.setCurrentIndex(0) #self.show_status( #'{} inputs {} otputs'.format(len(self.input_info_list),len(self.otput_info_list)) #) # Create a combo box and populate it with names of outputs # Lay those two out aligned to the outside hb_combos = QHBoxLayout() hb_combos.addWidget(self.cb_inputs, 1) hb_combos.addStretch(0) hb_combos.addWidget(self.cb_otputs, 1) # Create a volume slider from 0 to 100. self.volume = QSlider(Qt.Horizontal, self) self.volume.setMinimum(0) self.volume.setMaximum(100) self.volume.setTickInterval(10) self.volume.setTickPosition(QSlider.TicksBothSides) # set the volume slider to the value from the previous run, or zero. self.volume.setValue(self.settings.value('volume', 0)) # Create a checkbox "Mute" self.mute = QCheckBox('Mute') # Set it to the value at the end of the last run, or to True self.mute.setChecked(bool(self.settings.value('mute_status', 1))) # Put those together in a row squeezed in the center hb_volume = QHBoxLayout() hb_volume.addStretch(1) hb_volume.addWidget(self.volume, 1) hb_volume.addWidget(self.mute, 0) hb_volume.addStretch(1) # Stack all those up as this widget's layout vlayout = QVBoxLayout() vlayout.addLayout(hb_label) vlayout.addLayout(hb_combos) vlayout.addLayout(hb_volume) self.setLayout(vlayout)
class Options(object): default_app_options_file = "./options.json" default_app_volume = 25 default_app_timer_interval = 200 default_app_play_button_behaviour = 1 default_app_last_folder_opened = "/" default_app_playlist_autoplay = 1 default_app_output_device = QAudioDeviceInfo.defaultOutputDevice().deviceName() json_volume_name = "default_volume" json_timer_name = "default_timer_interval" json_play_button_name = "default_play_button_behaviour" json_music_folders_name = "music_folders" json_last_folder_opened_name = "default_last_folder_opened" json_playlist_autoplay = "default_playlist_autoplay" json_output_device = "default_output_device" def __init__(self): self.default_user_volume = None self.default_user_timer_interval = None self.default_user_play_button_behaviour = None self.user_music_folders = None self.default_user_last_folder_opened = None self.default_user_playlist_autoplay = None self.default_user_output_device = None self.json_user_defaults = None self.get_user_defaults() @staticmethod def get_default_option(user_option, app_option): if user_option is None: return app_option else: return user_option def get_default_volume(self): return self.get_default_option(self.default_user_volume, self.default_app_volume) def get_default_timer_interval(self): return self.get_default_option(self.default_user_timer_interval, self.default_app_timer_interval) def get_default_play_button(self): return self.get_default_option(self.default_user_play_button_behaviour, self.default_app_play_button_behaviour) def get_default_last_folder_opened(self): return self.get_default_option(self.default_user_last_folder_opened, self.default_app_last_folder_opened) def get_default_playlist_autoplay(self): return self.get_default_option(self.default_user_playlist_autoplay, self.default_app_playlist_autoplay) def get_default_output_device(self): return self.get_default_option(self.default_user_output_device, self.default_app_output_device) def get_user_defaults(self): if not os.path.exists(self.default_app_options_file): return with open(self.default_app_options_file, 'r') as file: if os.stat(self.default_app_options_file).st_size == 0: # If the file is empty return self.json_user_defaults = json.load(file) self.default_user_volume = self.set_user_default(self.json_volume_name) self.default_user_timer_interval = self.set_user_default(self.json_timer_name) self.default_user_play_button_behaviour = self.set_user_default(self.json_play_button_name) self.user_music_folders = self.set_user_default(self.json_music_folders_name) self.default_user_last_folder_opened = self.set_user_default(self.json_last_folder_opened_name) self.default_user_playlist_autoplay = self.set_user_default(self.json_playlist_autoplay) self.default_user_output_device = self.set_user_default(self.json_output_device) def save_user_defaults(self, volume=None, timer_interval=None, play_button_behaviour=None, music_folder=None, last_folder_opened=None, playlist_autoplay=None, output_device=None): if volume is None: volume = self.get_default_volume() else: self.default_user_volume = volume if timer_interval is None: timer_interval = self.get_default_timer_interval() else: self.default_user_timer_interval = timer_interval if play_button_behaviour is None: play_button_behaviour = self.get_default_play_button() else: self.default_user_play_button_behaviour = play_button_behaviour if music_folder is not None: if self.user_music_folders is None: # list(self.user_music_folders).append(music_folder) self.user_music_folders = [music_folder] else: self.user_music_folders.append(music_folder) if last_folder_opened is None: last_folder_opened = self.get_default_last_folder_opened() else: self.default_user_last_folder_opened = last_folder_opened if playlist_autoplay is None: playlist_autoplay = self.get_default_playlist_autoplay() else: self.default_user_playlist_autoplay = playlist_autoplay if output_device is None: output_device = self.get_default_output_device() else: self.default_user_output_device = output_device info_dicts = {'{}'.format(self.json_volume_name): volume, '{}'.format(self.json_timer_name): timer_interval, '{}'.format(self.json_play_button_name): play_button_behaviour, self.json_music_folders_name: self.user_music_folders, '{}'.format(self.json_last_folder_opened_name): last_folder_opened, '{}'.format(self.json_playlist_autoplay): playlist_autoplay, '{}'.format(self.json_output_device): output_device} json_string = json.dumps(info_dicts, indent=4, separators=(',', ' : ')) with open(self.default_app_options_file, 'w') as file: file.write(json_string) def delete_music_folder(self, folder): try: self.user_music_folders.remove(folder) except ValueError: return info_dicts = {'{}'.format(self.json_volume_name): self.default_user_volume, '{}'.format(self.json_timer_name): self.default_user_timer_interval, '{}'.format(self.json_play_button_name): self.default_user_play_button_behaviour, self.json_music_folders_name: self.user_music_folders, '{}'.format(self.json_last_folder_opened_name): self.default_user_last_folder_opened, '{}'.format(self.json_playlist_autoplay): self.default_user_playlist_autoplay, '{}'.format(self.json_output_device): self.default_user_output_device} json_string = json.dumps(info_dicts, indent=4, separators=(',', ' : ')) with open(self.default_app_options_file, 'w') as file: file.write(json_string) def set_user_default(self, option_name): try: return self.json_user_defaults[option_name] except KeyError: return None