Browse Source

Added render tool; added jacklib_helpers.py

tags/v0.9.0
falkTX 13 years ago
parent
commit
4ec14a08b6
12 changed files with 821 additions and 9 deletions
  1. +9
    -6
      Makefile
  2. BIN
      src/icons/16x16/document-open.png
  3. BIN
      src/icons/16x16/media-playback-stop.png
  4. BIN
      src/icons/16x16/media-record.png
  5. BIN
      src/icons/48x48/media-record.png
  6. +4
    -0
      src/icons/icons.qrc
  7. +0
    -1
      src/jacklib.py
  8. +55
    -0
      src/jacklib_helpers.py
  9. +1
    -1
      src/logs.py
  10. +305
    -0
      src/render.py
  11. +8
    -1
      src/shared.py
  12. +439
    -0
      src/ui/render.ui

+ 9
- 6
Makefile View File

@@ -4,8 +4,8 @@
# Created by falkTX
#

PYUIC = pyuic4
PYRCC = pyrcc4
PYUIC = pyuic4 --pyqt3-wrapper
PYRCC = pyrcc4 -py3

all: build

@@ -14,21 +14,24 @@ build: UI RES LANG
UI: tools

tools: \
src/ui_logs.py
src/ui_logs.py src/ui_render.py

src/ui_logs.py: src/ui/logs.ui
$(PYUIC) -w -o src/ui_logs.py $<
$(PYUIC) -o src/ui_logs.py $<

src/ui_render.py: src/ui/render.ui
$(PYUIC) -o src/ui_render.py $<

RES: src/icons_rc.py

src/icons_rc.py: src/icons/icons.qrc
$(PYRCC) -py3 -o src/icons_rc.py $<
$(PYRCC) -o src/icons_rc.py $<

LANG:
# pylupdate4 -verbose src/lang/lang.pro
# lrelease src/lang/lang.pro

clean:
rm -f *~ src/*~ src/*.pyc src/*.so src/ui_*.py src/icons_rc.py
rm -f *~ src/*~ src/*.pyc src/*.dll src/*.so src/ui_*.py src/icons_rc.py

distclean: clean

BIN
src/icons/16x16/document-open.png View File

Before After
Width: 16  |  Height: 16  |  Size: 702B

BIN
src/icons/16x16/media-playback-stop.png View File

Before After
Width: 16  |  Height: 16  |  Size: 499B

BIN
src/icons/16x16/media-record.png View File

Before After
Width: 16  |  Height: 16  |  Size: 697B

BIN
src/icons/48x48/media-record.png View File

Before After
Width: 48  |  Height: 48  |  Size: 2.8KB

+ 4
- 0
src/icons/icons.qrc View File

@@ -1,6 +1,10 @@
<RCC version="1.0">
<qresource prefix="/">
<file>16x16/document-open.png</file>
<file>16x16/edit-delete.png</file>
<file>16x16/media-record.png</file>
<file>16x16/media-playback-stop.png</file>
<file>16x16/window-close.png</file>
<file>48x48/media-record.png</file>
</qresource>
</RCC>

+ 0
- 1
src/jacklib.py View File

@@ -781,7 +781,6 @@ def midi_get_lost_event_count(port_buffer):

# Session


def set_timebase_callback(client, session_callback, arg):
jacklib.jack_set_timebase_callback.argtypes = [POINTER(jack_client_t), JackSessionCallback, c_void_p]
jacklib.jack_set_timebase_callback.restype = c_int


+ 55
- 0
src/jacklib_helpers.py View File

@@ -0,0 +1,55 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Helper functions for extra jacklib functionality
# Copyright (C) 2012 Filipe Coelho <falktx@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# For a full copy of the GNU General Public License see the COPYING file

import jacklib

def get_jack_status_error_string(c_status):
status = c_status.value
error_string = ""

if (status & jacklib.JackFailure):
error_string += "Overall operation failed;\n"
if (status & jacklib.JackInvalidOption):
error_string += "The operation contained an invalid or unsupported option;\n"
if (status & jacklib.JackNameNotUnique):
error_string += "The desired client name was not unique;\n"
if (status & jacklib.JackServerStarted):
error_string += "The JACK server was started as a result of this operation;\n"
if (status & jacklib.JackServerFailed):
error_string += "Unable to connect to the JACK server;\n"
if (status & jacklib.JackServerError):
error_string += "Communication error with the JACK server;\n"
if (status & jacklib.JackNoSuchClient):
error_string += "Requested client does not exist;\n"
if (status & jacklib.JackLoadFailure):
error_string += "Unable to load internal client;\n"
if (status & jacklib.JackInitFailure):
error_string += "Unable to initialize client;\n"
if (status & jacklib.JackShmFailure):
error_string += "Unable to access shared memory;\n"
if (status & jacklib.JackVersionError):
error_string += "Client's protocol version does not match;\n"
if (status & jacklib.JackBackendError):
error_string += "Backend Error;\n"
if (status & jacklib.JackClientZombie):
error_string += "Client is being shutdown against its will;\n"

if (error_string):
error_string = error_string.strip().rsplit(";", 1)[0]+"."

return error_string

+ 1
- 1
src/logs.py View File

@@ -215,7 +215,7 @@ class LogsReadThread(QThread):
if (self.LOG_FILE_LADISH):
self.log_ladish_file.close()

# Class Window
# Logs Window
class LogsW(QDialog, ui_logs.Ui_LogsW):

LOG_PATH = os.path.join(HOME, ".log")


+ 305
- 0
src/render.py View File

@@ -0,0 +1,305 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# JACK-Capture frontend, with freewheel and transport support
# Copyright (C) 2012 Filipe Coelho <falktx@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# For a full copy of the GNU General Public License see the COPYING file

# Imports (Global)
from PyQt4.QtCore import pyqtSlot, Qt, QProcess, QTime, QTimer, SIGNAL, SLOT
from PyQt4.QtGui import QDialog
from time import sleep

# Imports (Custom Stuff)
import ui_render
from shared import *
from jacklib_helpers import *

global jack_client
jack_client = None

# Render Window
class RenderW(QDialog, ui_render.Ui_RenderW):
def __init__(self, parent, flags):
QDialog.__init__(self, parent, flags)
self.setupUi(self)

# -------------------------------------------------------------
# Get JACK client and base information

global jack_client
if (jack_client):
self.m_jack_client = jack_client
self.m_closeClient = False
else:
self.m_jack_client = jacklib.client_open("Render-Dialog", jacklib.JackNoStartServer, None)
self.m_closeClient = True

self.m_buffer_size = jacklib.get_buffer_size(self.m_jack_client)
for i in range(self.cb_buffer_size.count()):
if (int(self.cb_buffer_size.itemText(i)) == self.m_buffer_size):
self.cb_buffer_size.setCurrentIndex(i)

self.m_sample_rate = jacklib.get_sample_rate(self.m_jack_client)

# -------------------------------------------------------------
# Internal stuff

self.m_max_time = 180
self.m_last_time = 0
self.m_freewheel = False

self.m_timer = QTimer(self)
self.m_process = QProcess(self)

# -------------------------------------------------------------
# Set-up GUI stuff

# Get List of formats
self.m_process.start("jack_capture", ["-pf"])
self.m_process.waitForFinished()

formats = str(self.m_process.readAllStandardOutput(), encoding="ascii").split(" ")
for i in range(len(formats)-1):
self.cb_format.addItem(formats[i])
if (formats[i] == "wav"):
self.cb_format.setCurrentIndex(i)

self.cb_depth.setCurrentIndex(4) #Float
self.rb_stereo.setChecked(True)

self.te_end.setTime(QTime(0, 3, 0))
self.progressBar.setMinimum(0)
self.progressBar.setMaximum(0)
self.progressBar.setValue(0)

self.b_render.setIcon(getIcon("media-record"))
self.b_stop.setIcon(getIcon("media-playback-stop"))
self.b_close.setIcon(getIcon("window-close"))
self.b_open.setIcon(getIcon("document-open"))
self.b_stop.setVisible(False)
self.le_folder.setText(HOME)

# -------------------------------------------------------------
# Set-up connections

self.connect(self.b_render, SIGNAL("clicked()"), SLOT("slot_renderStart()"))
self.connect(self.b_stop, SIGNAL("clicked()"), SLOT("slot_renderStop()"))
self.connect(self.b_open, SIGNAL("clicked()"), SLOT("slot_getAndSetPath()"))
self.connect(self.b_now_start, SIGNAL("clicked()"), SLOT("slot_setStartNow()"))
self.connect(self.b_now_end, SIGNAL("clicked()"), SLOT("slot_setEndNow()"))
self.connect(self.te_start, SIGNAL("timeChanged(const QTime)"), SLOT("slot_updateStartTime(const QTime)"))
self.connect(self.te_end, SIGNAL("timeChanged(const QTime)"), SLOT("slot_updateEndTime(const QTime)"))
self.connect(self.m_timer, SIGNAL("timeout()"), SLOT("slot_updateProgressbar()"))

@pyqtSlot()
def slot_renderStart(self):
if (os.path.exists(self.le_folder.text()) == False):
QMessageBox.warning(self, self.tr("Warning"), self.tr("The selected directory does not exist. Please choose a valid one."))
return

self.group_render.setEnabled(False)
self.group_time.setEnabled(False)
self.group_encoding.setEnabled(False)
self.b_render.setVisible(False)
self.b_stop.setVisible(True)
self.b_close.setEnabled(False)

self.m_freewheel = (self.cb_render_mode.currentIndex() == 1)
new_buffer_size = int(self.cb_buffer_size.currentText())

time_start = self.te_start.time()
time_end = self.te_end.time()
min_time = (time_start.hour()*3600)+(time_start.minute()*60)+(time_start.second())
max_time = (time_end.hour()*3600)+(time_end.minute()*60)+(time_end.second())
self.m_max_time = max_time

self.progressBar.setMinimum(min_time)
self.progressBar.setMaximum(max_time)
self.progressBar.setValue(min_time)
self.progressBar.update()

if (self.m_freewheel):
self.m_timer.setInterval(100)
else:
self.m_timer.setInterval(500)

arguments = []

# Bit depth
arguments.append("-b")
arguments.append(self.cb_depth.currentText())

# Channels
arguments.append("-c")
if (self.rb_mono.isChecked()):
arguments.append("1")
elif (self.rb_stereo.isChecked()):
arguments.append("2")
else:
arguments.append(str(self.sb_channels.value()))

# Format
arguments.append("-f")
arguments.append(self.cb_format.currentText())

# Controlled by transport
arguments.append("-jt")

# Silent mode
arguments.append("-dc")
arguments.append("-s")

# Change current directory
os.chdir(self.le_folder.text())

if (new_buffer_size != jacklib.get_buffer_size(self.m_jack_client)):
print("NOTICE: buffer size changed before render")
jacklib.set_buffer_size(self.m_jack_client, new_buffer_size)

if (jacklib.transport_query(self.m_jack_client, None) > jacklib.JackTransportStopped): # >TransportStopped is rolling/starting
jacklib.transport_stop(self.m_jack_client)

jacklib.transport_locate(self.m_jack_client, min_time*self.m_sample_rate)
self.m_last_time = -1

self.m_process.start("jack_capture", arguments)
self.m_process.waitForStarted()

if (self.m_freewheel):
sleep(1)
print("NOTICE: rendering in freewheel mode")
jacklib.set_freewheel(jack_client, 1)

self.m_timer.start()
jacklib.transport_start(self.m_jack_client)

@pyqtSlot()
def slot_renderStop(self):
jacklib.transport_stop(self.m_jack_client)

if (self.m_freewheel):
jacklib.set_freewheel(self.m_jack_client, 0)

sleep(1)

self.m_process.close()
self.m_timer.stop()

self.group_render.setEnabled(True)
self.group_time.setEnabled(True)
self.group_encoding.setEnabled(True)
self.b_render.setVisible(True)
self.b_stop.setVisible(False)
self.b_close.setEnabled(True)

self.progressBar.setMinimum(0)
self.progressBar.setMaximum(0)
self.progressBar.setValue(0)
self.progressBar.update()

# Restore buffer size
new_buffer_size = jacklib.get_buffer_size(self.m_jack_client)
if (new_buffer_size != self.m_buffer_size):
jacklib.set_buffer_size(self.m_jack_client, new_buffer_size)

@pyqtSlot()
def slot_getAndSetPath(self):
getAndSetPath(self, self.le_folder.text(), self.le_folder)

@pyqtSlot()
def slot_setStartNow(self):
time = jacklib.get_current_transport_frame(self.m_jack_client)/self.m_sample_rate
secs = time % 60
mins = (time / 60) % 60
hrs = (time / 3600) % 60
self.te_start.setTime(QTime(hrs, mins, secs))

@pyqtSlot()
def slot_setEndNow(self):
time = jacklib.get_current_transport_frame(self.m_jack_client)/self.m_sample_rate
secs = time % 60
mins = (time / 60) % 60
hrs = (time / 3600) % 60
self.te_end.setTime(QTime(hrs, mins, secs))

@pyqtSlot(QTime)
def slot_updateStartTime(self, time):
if (time >= self.te_end.time()):
self.te_end.setTime(time)
self.b_render.setEnabled(False)
else:
self.b_render.setEnabled(True)

@pyqtSlot(QTime)
def slot_updateEndTime(self, time):
if (time <= self.te_start.time()):
time = self.te_start.setTime(time)
self.b_render.setEnabled(False)
else:
self.b_render.setEnabled(True)

@pyqtSlot()
def slot_updateProgressbar(self):
time = jacklib.get_current_transport_frame(self.m_jack_client)/self.m_sample_rate
self.progressBar.setValue(time)

if (time > self.m_max_time or (self.m_last_time > time and self.m_freewheel == False)):
self.slot_renderStop()

self.m_last_time = time

def closeEvent(self, event):
if (self.m_closeClient):
jacklib.client_close(self.m_jack_client)
QDialog.closeEvent(self, event)

# -------------------------------------------------------------
# Allow to use this as a standalone app
if __name__ == '__main__':

# Additional imports
import sys
from PyQt4.QtGui import QApplication

# App initialization
app = QApplication(sys.argv)

for iPATH in PATH:
if os.path.exists(os.path.join(iPATH, "jack_capture")):
break
else:
QMessageBox.critical(None, app.translate("RenderW", "Error"), app.translate("RenderW", "The 'jack_capture' application is not available.\nIs not possible to render without it!"))
sys.exit(1)

jack_status = jacklib.jack_status_t(0)
jack_client = jacklib.client_open("Render", jacklib.JackNoStartServer, jacklib.pointer(jack_status))

if not jack_client:
QMessageBox.critical(None, app.translate("RenderW", "Error"), app.translate("RenderW", "Could not connect to JACK, possible errors:\n%s" % (get_jack_status_error_string(jack_status))))
sys.exit(1)

# Show GUI
gui = RenderW(None, Qt.WindowFlags())
gui.setWindowIcon(getIcon("media-record", 48))
gui.show()

# App-Loop
ret = app.exec_()

if (jack_client):
jacklib.client_close(jack_client)

# Exit properly
sys.exit(ret)

+ 8
- 1
src/shared.py View File

@@ -19,7 +19,7 @@
# Imports (Global)
import os
from PyQt4.QtCore import qDebug, qWarning
from PyQt4.QtGui import QIcon
from PyQt4.QtGui import QIcon, QMessageBox, QFileDialog

# Small integrity tests
HOME = os.getenv("HOME")
@@ -41,3 +41,10 @@ else:
# Get Icon from user theme, using our own as backup (Oxygen)
def getIcon(icon, size=16):
return QIcon.fromTheme(icon, QIcon(":/%ix%i/%s.png" % (size, size, icon)))

# QLineEdit and QPushButtom combo
def getAndSetPath(self, currentPath, lineEdit):
newPath = QFileDialog.getExistingDirectory(self, self.tr("Set Path"), currentPath, QFileDialog.ShowDirsOnly)
if (newPath):
lineEdit.setText(newPath)
return newPath

+ 439
- 0
src/ui/render.ui View File

@@ -0,0 +1,439 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>RenderW</class>
<widget class="QDialog" name="RenderW">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>585</width>
<height>332</height>
</rect>
</property>
<property name="windowTitle">
<string>Render</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="3" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QProgressBar" name="progressBar">
<property name="value">
<number>24</number>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="b_render">
<property name="text">
<string>&amp;Render</string>
</property>
<property name="icon">
<iconset resource="../icons/icons.qrc">
<normaloff>:/16x16/media-record.png</normaloff>:/16x16/media-record.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="b_stop">
<property name="text">
<string>&amp;Stop</string>
</property>
<property name="icon">
<iconset resource="../icons/icons.qrc">
<normaloff>:/16x16/media-playback-stop.png</normaloff>:/16x16/media-playback-stop.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="b_close">
<property name="text">
<string>&amp;Close</string>
</property>
<property name="icon">
<iconset resource="../icons/icons.qrc">
<normaloff>:/16x16/window-close.png</normaloff>:/16x16/window-close.png</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0" colspan="2">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="group_render">
<property name="title">
<string>Render Options</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Render &amp;Mode:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>cb_render_mode</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="cb_render_mode">
<item>
<property name="text">
<string>Realtime</string>
</property>
</item>
<item>
<property name="text">
<string>Freewheel</string>
</property>
</item>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>275</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>&amp;Buffer Size:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>cb_buffer_size</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="cb_buffer_size">
<property name="editable">
<bool>true</bool>
</property>
<item>
<property name="text">
<string>32</string>
</property>
</item>
<item>
<property name="text">
<string>64</string>
</property>
</item>
<item>
<property name="text">
<string>128</string>
</property>
</item>
<item>
<property name="text">
<string>256</string>
</property>
</item>
<item>
<property name="text">
<string>512</string>
</property>
</item>
<item>
<property name="text">
<string>1024</string>
</property>
</item>
<item>
<property name="text">
<string>2048</string>
</property>
</item>
<item>
<property name="text">
<string>4096</string>
</property>
</item>
<item>
<property name="text">
<string>8192</string>
</property>
</item>
</widget>
</item>
<item row="1" column="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>275</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Output folder:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLineEdit" name="le_folder"/>
</item>
<item>
<widget class="QToolButton" name="b_open">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../icons/icons.qrc">
<normaloff>:/16x16/document-open.png</normaloff>:/16x16/document-open.png</iconset>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="group_time">
<property name="title">
<string>Time</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>&amp;Start Time:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>te_start</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QTimeEdit" name="te_start">
<property name="displayFormat">
<string>hh:mm:ss</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>&amp;End Time:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>te_end</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QTimeEdit" name="te_end">
<property name="displayFormat">
<string>hh:mm:ss</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="b_now_start">
<property name="text">
<string>now</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="b_now_end">
<property name="text">
<string>now</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="1">
<widget class="QGroupBox" name="group_encoding">
<property name="title">
<string>Encoding</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>&amp;Format:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>cb_format</cstring>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2">
<widget class="QComboBox" name="cb_format"/>
</item>
<item row="0" column="3">
<widget class="QToolButton" name="tb_format">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Bit &amp;Depth:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>cb_depth</cstring>
</property>
</widget>
</item>
<item row="1" column="1" colspan="3">
<widget class="QComboBox" name="cb_depth">
<item>
<property name="text">
<string notr="true">8</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">16</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">24</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">32</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Float</string>
</property>
</item>
</widget>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="rb_mono">
<property name="text">
<string>Mono</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QRadioButton" name="rb_stereo">
<property name="text">
<string>Stereo</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QRadioButton" name="rb_outro">
<property name="text">
<string>Outro:</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QSpinBox" name="sb_channels">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimum">
<number>1</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="../icons/icons.qrc"/>
</resources>
<connections>
<connection>
<sender>b_close</sender>
<signal>clicked()</signal>
<receiver>RenderW</receiver>
<slot>close()</slot>
<hints>
<hint type="sourcelabel">
<x>465</x>
<y>343</y>
</hint>
<hint type="destinationlabel">
<x>258</x>
<y>183</y>
</hint>
</hints>
</connection>
<connection>
<sender>rb_outro</sender>
<signal>toggled(bool)</signal>
<receiver>sb_channels</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>405</x>
<y>259</y>
</hint>
<hint type="destinationlabel">
<x>484</x>
<y>255</y>
</hint>
</hints>
</connection>
</connections>
</ui>

Loading…
Cancel
Save