mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-05-30 15:42:34 +02:00
Merged 04bd883b65b9922c35216b92b4da52245fdc7f5b from master
This commit is contained in:
commit
c0446ea5f7
59
.gitignore
vendored
59
.gitignore
vendored
@ -13,13 +13,25 @@ rivendell-*.zip
|
|||||||
.libs
|
.libs
|
||||||
aclocal.m4
|
aclocal.m4
|
||||||
autom4te.cache
|
autom4te.cache
|
||||||
|
cae/caed
|
||||||
|
compile
|
||||||
|
conf/rd-bin.conf
|
||||||
config.guess
|
config.guess
|
||||||
config.log
|
config.log
|
||||||
config.status
|
config.status
|
||||||
config.sub
|
config.sub
|
||||||
configure
|
configure
|
||||||
depcomp
|
depcomp
|
||||||
|
helpers/cwrap
|
||||||
|
helpers/jsmin
|
||||||
|
importers/nexgen_filter
|
||||||
|
importers/panel_copy
|
||||||
|
importers/rdcatch_copy
|
||||||
|
importers/rivendell_filter
|
||||||
|
importers/sas_filter
|
||||||
|
importers/wings_filter
|
||||||
install-sh
|
install-sh
|
||||||
|
lib/rdpaths.h
|
||||||
libtool
|
libtool
|
||||||
ltmain.sh
|
ltmain.sh
|
||||||
m4
|
m4
|
||||||
@ -28,9 +40,56 @@ missing
|
|||||||
Makefile.in
|
Makefile.in
|
||||||
Makefile
|
Makefile
|
||||||
moc_*
|
moc_*
|
||||||
|
rdadmin/rdadmin
|
||||||
|
rdairplay/rdairplay
|
||||||
|
rdcastmanager/rdcastmanager
|
||||||
|
rdcartslots/rdcartslots
|
||||||
|
rdcatch/rdcatch
|
||||||
|
rdcatchd/rdcatchd
|
||||||
|
rdlibrary/rdlibrary
|
||||||
|
rdlogedit/rdlogedit
|
||||||
|
rdlogin/rdlogin
|
||||||
|
rdlogmanager/rdlogmanager
|
||||||
|
rdmonitor/rdmonitor
|
||||||
|
rdpanel/rdpanel
|
||||||
|
rdrepld/rdrepld
|
||||||
rdrepld-suse
|
rdrepld-suse
|
||||||
|
rdselect/rdselect
|
||||||
|
ripcd/ripcd
|
||||||
rivendell
|
rivendell
|
||||||
rivendell-suse
|
rivendell-suse
|
||||||
rivendell.spec
|
rivendell.spec
|
||||||
slack-desc
|
slack-desc
|
||||||
|
tests/audio_convert_test
|
||||||
|
tests/audio_export_test
|
||||||
|
tests/audio_import_test
|
||||||
tests/audio_peaks_test
|
tests/audio_peaks_test
|
||||||
|
tests/datedecode_test
|
||||||
|
tests/reserve_carts_test
|
||||||
|
tests/sas_switch_torture
|
||||||
|
tests/sas_torture
|
||||||
|
tests/stringcode_test
|
||||||
|
tests/test_pam
|
||||||
|
tests/timer_test
|
||||||
|
tests/upload_test
|
||||||
|
utils/rdhpiinfo/rdhpiinfo
|
||||||
|
utils/rddgimport/rddgimport
|
||||||
|
utils/rddiscimport/rddiscimport
|
||||||
|
utils/rdcheckcuts/rdcheckcuts
|
||||||
|
utils/rdmarkerset/rdmarkerset
|
||||||
|
utils/rmlsend/rmlsend
|
||||||
|
utils/rdpurgecasts/rdpurgecasts
|
||||||
|
utils/rdchunk/rdchunk
|
||||||
|
utils/rdcleandirs/rdcleandirs
|
||||||
|
utils/rdsoftkeys/rdsoftkeys
|
||||||
|
utils/rddbcheck/rddbcheck
|
||||||
|
utils/rdalsaconfig/rdalsaconfig
|
||||||
|
utils/rdpopup/rdpopup
|
||||||
|
utils/rddelete/rddelete
|
||||||
|
utils/rdgpimon/rdgpimon
|
||||||
|
utils/rdimport/rdimport
|
||||||
|
utils/rdcollect/rdcollect
|
||||||
|
utils/rdmaint/rdmaint
|
||||||
|
utils/rdgen/rdgen
|
||||||
|
utils/sas_shim/sas_shim
|
||||||
|
web/rdfeed/rdfeed.xml
|
||||||
|
3
AUTHORS
3
AUTHORS
@ -42,6 +42,9 @@ Alban Peignier <alban.peignier@free.fr>
|
|||||||
Daniel Roviriego <danifernando@gmail.com>
|
Daniel Roviriego <danifernando@gmail.com>
|
||||||
Portuguese Translation (pt_BR).
|
Portuguese Translation (pt_BR).
|
||||||
|
|
||||||
|
Chris Smowton
|
||||||
|
MP4 imporatation support.
|
||||||
|
|
||||||
Scott Spillers <scotts@paravelsystems.com>
|
Scott Spillers <scotts@paravelsystems.com>
|
||||||
The Icon set
|
The Icon set
|
||||||
|
|
||||||
|
104
ChangeLog
104
ChangeLog
@ -14794,13 +14794,91 @@
|
|||||||
2015-02-24 Fred Gleason <fredg@paravelsystems.com>
|
2015-02-24 Fred Gleason <fredg@paravelsystems.com>
|
||||||
* Updated 'NEWS'.
|
* Updated 'NEWS'.
|
||||||
* Incremented the package version to 2.10.3.
|
* Incremented the package version to 2.10.3.
|
||||||
|
2015-02-25 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Updated 'conf/rlm_padpoint.conf' to reflect new 'standard' port
|
||||||
|
value.
|
||||||
|
2015-02-27 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Renamed the 'SAS User Serial Interface' driver to
|
||||||
|
'SAS USI (3 digit)'.
|
||||||
|
* Added an 'SAS USI (2 digit)' swticher driver in
|
||||||
|
'ripcd/sasusi2digit.cpp' and 'ripcd/sasusi2digit.h'.
|
||||||
|
2015-03-04 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Added support for 'scp' and 'sftp' protocols in
|
||||||
|
'rdcatch/edit_upload.cpp'.
|
||||||
|
* Added support for 'scp' and 'sftp' protocols in
|
||||||
|
'rdcatch/edit_download.cpp'.
|
||||||
|
2015-03-04 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Incremented the package version to 2.10.3int00.
|
||||||
|
2015-03-05 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Renamed the 'SAS USI (3 digit)' driver to
|
||||||
|
'SAS User Serial Interface'.
|
||||||
|
* Renamed the 'SAS USI (2 digit)' driver to
|
||||||
|
'SAS 16000(D)'.
|
||||||
|
2015-03-05 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Modified the 'SAS USI' driver in 'ripcd/sasusi.cpp' to support
|
||||||
|
four digit endpoint numbers.
|
||||||
|
2015-03-05 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Increased 'MAX_ENDPOINTS' in 'lib/rd.h' from 1024 to 2048.
|
||||||
|
2015-03-05 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Increased digit count on endpoints from 3 to 4 in
|
||||||
|
'rdadmin/list_endpoints.cpp'.
|
||||||
|
2015-03-06 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Incremented the package version to 2.10.3int01.
|
||||||
|
2015-03-09 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Merged patch from Chris Smowton to enable importation of
|
||||||
|
MP4 files [GitHub pull request #000029].
|
||||||
|
* Added prerequisites for MP4 importation in 'INSTALL'.
|
||||||
|
2015-03-09 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Added a 'STATIONS.HAVE_MP4_DECODE' field to the database.
|
||||||
|
* Incremented the database version to 243.
|
||||||
|
* Added a 'Capability::HaveMp4Decode' value to the
|
||||||
|
'RDStation::Capability' enumeration in 'lib/rdstation.cpp' and
|
||||||
|
'lib/rdstation.h'.
|
||||||
|
2015-03-10 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Fixed a bug in 'lib/rdcdplayer.cpp' that threw a segfault
|
||||||
|
when opening the ripper with no CD inserted under RHEL 7.
|
||||||
|
2015-03-16 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Added 'DESCRIPTION', 'OUTCUE', 'FILENAME' and '*_POINT' fields
|
||||||
|
to the 'Cart CSV Report' in 'rdlibrary/list_reports.cpp'.
|
||||||
|
2015-03-17 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Updated 'get_distro.sh' to detect RHEL 7 correctly.
|
||||||
|
2015-03-23 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Fixed a fencepost bug in 'ripcd/sasusi.cpp' that caused the
|
||||||
|
last relay in the list to fail to respond to a 'GO' RML.
|
||||||
|
2015-04-02 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Modified the definition of the 'JACK_CLIENTS.COMMAND_LINE'
|
||||||
|
field from 'char(255)' to 'text' in the database.
|
||||||
|
* Incremented the database version to 244.
|
||||||
|
2015-04-06 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Fixed a bug in 'rdlibrary/disk_ripper.cpp' that caused the tracks
|
||||||
|
from discs with no CDDB data to received scrambled/incorrect cart
|
||||||
|
titles.
|
||||||
|
2015-04-07 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Added a 'RDLIBRARY.READ_ISRC' field to the database.
|
||||||
|
* Incremented the database version to 245.
|
||||||
|
* Added 'RDLibraryConf::readIsrc()' and 'RDLibraryConf::setReadIsrc()'
|
||||||
|
methods in 'lib/rdlibrary_conf.cpp' and 'lib/rdlibrary_conf.h'.
|
||||||
|
* Added a 'Read ISRCs from CD' control to the 'Edit RDLibrary' dialog
|
||||||
|
in 'rdadmin/edit_rdlibrary.cpp' and 'rdadmin/edi_rdlibrary.h'.
|
||||||
|
* Implemented the 'Read ISRCs from CD' option in the full disc
|
||||||
|
ripper in 'rdlibrary/disk_ripper.cpp'.
|
||||||
|
* Implemented the 'Read ISRCs from CD' option in the per-track disc
|
||||||
|
ripper in 'rdlibrary/cdripper.cpp'.
|
||||||
|
2015-04-21 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Incremented the package version to 2.10.3int02.
|
||||||
|
2015-05-20 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Added default parameters to the 'PadPoint' RLM in 'rlm_padpoint.c'.
|
||||||
|
2015-05-28 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Added rdcleandirs(8) utility in 'utils/rdcleandirs/'.
|
||||||
|
2015-05-28 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Added an 'RDMatrix::RossNkScp' value to the 'RDMatrix::Type'
|
||||||
|
enumeration in 'lib/rdmatrix.cpp' and 'lib/rdmatrix.h'.
|
||||||
|
* Implemented a switcher driver for the Ross NK line of video
|
||||||
|
switchers via the SCP/A serial interface in 'ripcd/rossnkscp.cpp'
|
||||||
|
and 'riptcd/rossnkscp.h'.
|
||||||
2015-06-10 Fred Gleason <fredg@paravelsystems.com>
|
2015-06-10 Fred Gleason <fredg@paravelsystems.com>
|
||||||
* Refactored 'LogPlay' class to provide per-instance RDCae instances.
|
* Refactored 'LogPlay' class to provide per-instance RDCae instances.
|
||||||
in 'rdairplay/log_play.cpp' and 'rdairplay/log_play.h'.
|
in 'rdairplay/log_play.cpp' and 'rdairplay/log_play.h'.
|
||||||
2015-06-10 Fred Gleason <fredg@paravelsystems.com>
|
|
||||||
* Incremented the package version to 2.10.3caefix00.
|
|
||||||
2015-06-22 Fred Gleason <fredg@paravelsystems.com>
|
|
||||||
* Incremented the package version to 2.10.3caefix01.
|
|
||||||
2015-07-02 Fred Gleason <fredg@paravelsystems.com>
|
2015-07-02 Fred Gleason <fredg@paravelsystems.com>
|
||||||
* Fixed a bug in 'LogPlay::refresh()' that caused a segfault
|
* Fixed a bug in 'LogPlay::refresh()' that caused a segfault
|
||||||
in 'rdairplay/log_play.cpp'.
|
in 'rdairplay/log_play.cpp'.
|
||||||
@ -14814,26 +14892,16 @@
|
|||||||
* Instrumented 'LogPlay::graceTimerData()' in
|
* Instrumented 'LogPlay::graceTimerData()' in
|
||||||
'rdairplay/log_play.cpp'.
|
'rdairplay/log_play.cpp'.
|
||||||
* Instrumented 'RLMHost::timerData()' in 'rdairplay/rlmhost.cpp'.
|
* Instrumented 'RLMHost::timerData()' in 'rdairplay/rlmhost.cpp'.
|
||||||
2015-07-14 Fred Gleason <fredg@paravelsystems.com>
|
|
||||||
* Incremented the package version to 2.10.3caefix02.
|
|
||||||
2015-07-14 Fred Gleason <fredg@paravelsystems.com>
|
|
||||||
* Incremented the package version to 2.10.3caefix03.
|
|
||||||
2015-08-12 Fred Gleason <fredg@paravelsystems.com>
|
2015-08-12 Fred Gleason <fredg@paravelsystems.com>
|
||||||
* Instrumented the cleanup phase of the 'LogPlay::refresh()' method in
|
* Instrumented the cleanup phase of the 'LogPlay::refresh()' method in
|
||||||
'rdairplay/log_play.cpp'.
|
'rdairplay/log_play.cpp'.
|
||||||
2015-08-12 Fred Gleason <fredg@paravelsystems.com>
|
|
||||||
* Incremented the package version to 2.10.3caefix04.
|
|
||||||
2015-08-13 Fred Gleason <fredg@paravelsystems.com>
|
2015-08-13 Fred Gleason <fredg@paravelsystems.com>
|
||||||
* Commented out the 'qApp->processEvents()' call in the
|
* Commented out the 'qApp->processEvents()' call in the
|
||||||
'refreshStatusChangedData()' method in 'rdairplay/rdairplay.cpp'.
|
'refreshStatusChangedData()' method in 'rdairplay/rdairplay.cpp'.
|
||||||
2015-08-13 Fred Gleason <fredg@paravelsystems.com>
|
|
||||||
* Incremented the package version to 2.10.3caefix05.
|
|
||||||
2015-08-29 Fred Gleason <fredg@paravelsystems.com>
|
2015-08-29 Fred Gleason <fredg@paravelsystems.com>
|
||||||
* Removed instrumentation code in 'rdairplay/hourselector.cpp'.
|
* Removed instrumentation code in 'rdairplay/hourselector.cpp'.
|
||||||
* Removed instrumentation code in 'rdairplay/log_play.cpp'.
|
* Removed instrumentation code in 'rdairplay/log_play.cpp'.
|
||||||
* Removed instrumentation code in 'rdairplay/rlmhost.cpp'.
|
* Removed instrumentation code in 'rdairplay/rlmhost.cpp'.
|
||||||
2015-08-29 Fred Gleason <fredg@paravelsystems.com>
|
|
||||||
* Incremented the package version to 2.10.3caefix06.
|
|
||||||
2015-08-30 Fred Gleason <fredg@paravelsystems.com>
|
2015-08-30 Fred Gleason <fredg@paravelsystems.com>
|
||||||
* Added an 'RDAudioConvert::Stage3Pcm24()' method in
|
* Added an 'RDAudioConvert::Stage3Pcm24()' method in
|
||||||
'lib/rdaudioconvert.cpp' and 'lib/rdaudioconvert.h'.
|
'lib/rdaudioconvert.cpp' and 'lib/rdaudioconvert.h'.
|
||||||
@ -14860,10 +14928,6 @@
|
|||||||
2015-08-30 Fred Gleason <fredg@paravelsystems.com>
|
2015-08-30 Fred Gleason <fredg@paravelsystems.com>
|
||||||
* Added PCM24 play-out and capture support for JACK in
|
* Added PCM24 play-out and capture support for JACK in
|
||||||
'cae/cae_jack.cpp' and 'cae/cae.h'.
|
'cae/cae_jack.cpp' and 'cae/cae.h'.
|
||||||
2015-08-30 Fred Gleason <fredg@paravelsystems.com>
|
|
||||||
* Incremented the package version to 2.10.3-pcm24.0.
|
|
||||||
2015-08-30 Fred Gleason <fredg@paravelsystems.com>
|
|
||||||
* Incremented the package version to 2.10.3pcm24.0.
|
|
||||||
2015-08-30 Fred Gleason <fredg@paravelsystems.com>
|
2015-08-30 Fred Gleason <fredg@paravelsystems.com>
|
||||||
* Added a --frames=' parameter in 'tests/audio_peaks_test.cpp'.
|
* Added a --frames=' parameter in 'tests/audio_peaks_test.cpp'.
|
||||||
* Fixed a fencepost bug in generating peak energy data in
|
* Fixed a fencepost bug in generating peak energy data in
|
||||||
@ -14876,10 +14940,6 @@
|
|||||||
2015-09-07 Fred Gleason <fredg@paravelsystems.com>
|
2015-09-07 Fred Gleason <fredg@paravelsystems.com>
|
||||||
* Added PCM24 play-out and capture support for ALSA in
|
* Added PCM24 play-out and capture support for ALSA in
|
||||||
'cae/cae_alsa.cpp' and 'cae/cae.h'.
|
'cae/cae_alsa.cpp' and 'cae/cae.h'.
|
||||||
2015-09-08 Fred Gleason <fredg@paravelsystems.com>
|
|
||||||
* Incremented the package version to 2.10.3pcm24.1.
|
|
||||||
2015-09-09 Fred Gleason <fredg@paravelsystems.com>
|
2015-09-09 Fred Gleason <fredg@paravelsystems.com>
|
||||||
* Added 'src_float_to_int()' and 'src_int_to_float()' functions in
|
* Added 'src_float_to_int()' and 'src_int_to_float()' functions in
|
||||||
'cae/cae.cpp' and 'cae/cae.h'.
|
'cae/cae.cpp' and 'cae/cae.h'.
|
||||||
2015-09-09 Fred Gleason <fredg@paravelsystems.com>
|
|
||||||
* Incremented the package version to 2.10.3pcm24.2.
|
|
||||||
|
4
INSTALL
4
INSTALL
@ -84,6 +84,10 @@ GPIO Driver
|
|||||||
A kernel driver for the line of data-acquisition boards from
|
A kernel driver for the line of data-acquisition boards from
|
||||||
MeasurementComputing. See http://www.rivendellaudio.org/.
|
MeasurementComputing. See http://www.rivendellaudio.org/.
|
||||||
|
|
||||||
|
FAAD2 / mp4v2 - AAC/MP4 Decoding Libraries. Needed for MP4 file importation.
|
||||||
|
Available at http://www.audiocoding.com/faad2.html and
|
||||||
|
https://code.google.com/p/mp4v2/ respectively.
|
||||||
|
|
||||||
LAME - MPEG Layer 3 Encoder Library. Needed for MPEG Layer 3 exporting.
|
LAME - MPEG Layer 3 Encoder Library. Needed for MPEG Layer 3 exporting.
|
||||||
Available at http://lame.sourceforge.net/.
|
Available at http://lame.sourceforge.net/.
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
2.10.3pcm24.2
|
2.10.3int02
|
1
cae/.gitignore
vendored
1
cae/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
caed
|
|
16
cae/cae.cpp
16
cae/cae.cpp
@ -2006,6 +2006,11 @@ void MainObject::ProbeCaps(RDStation *station)
|
|||||||
station->setHaveCapability(RDStation::HaveTwoLame,LoadTwoLame());
|
station->setHaveCapability(RDStation::HaveTwoLame,LoadTwoLame());
|
||||||
station->setHaveCapability(RDStation::HaveMpg321,LoadMad());
|
station->setHaveCapability(RDStation::HaveMpg321,LoadMad());
|
||||||
|
|
||||||
|
//
|
||||||
|
// MP4 Decoder
|
||||||
|
//
|
||||||
|
station->setHaveCapability(RDStation::HaveMp4Decode,CheckMp4Decode());
|
||||||
|
|
||||||
#ifdef HPI
|
#ifdef HPI
|
||||||
station->setDriverVersion(RDStation::Hpi,hpiVersion());
|
station->setDriverVersion(RDStation::Hpi,hpiVersion());
|
||||||
#else
|
#else
|
||||||
@ -2062,6 +2067,17 @@ bool MainObject::CheckLame()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool MainObject::CheckMp4Decode()
|
||||||
|
{
|
||||||
|
#ifdef HAVE_MP4_LIBS
|
||||||
|
return (dlopen("libfaad.so",RTLD_LAZY)!=NULL)&&
|
||||||
|
(dlopen("libmp4v2.so",RTLD_LAZY)!=NULL);
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif // HAVE_MP4_LIBS
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool MainObject::LoadTwoLame()
|
bool MainObject::LoadTwoLame()
|
||||||
{
|
{
|
||||||
#ifdef HAVE_TWOLAME
|
#ifdef HAVE_TWOLAME
|
||||||
|
@ -358,6 +358,7 @@ class MainObject : public QObject
|
|||||||
#endif // ALSA
|
#endif // ALSA
|
||||||
|
|
||||||
bool CheckLame();
|
bool CheckLame();
|
||||||
|
bool CheckMp4Decode();
|
||||||
|
|
||||||
//
|
//
|
||||||
// TwoLAME Encoder
|
// TwoLAME Encoder
|
||||||
|
1
conf/.gitignore
vendored
1
conf/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rd-bin.conf
|
|
@ -17,12 +17,12 @@
|
|||||||
; IP Address
|
; IP Address
|
||||||
;
|
;
|
||||||
; The IP address of the remote PadPoint UDP port, in dotted-quad notation.
|
; The IP address of the remote PadPoint UDP port, in dotted-quad notation.
|
||||||
IpAddress=192.168.10.30
|
IpAddress=127.0.0.1
|
||||||
|
|
||||||
; UDP Port
|
; UDP Port
|
||||||
;
|
;
|
||||||
; The UDP port number of the remote PadPoint UDP port, in the range 0 - 65,535.
|
; The UDP port number of the remote PadPoint UDP port, in the range 0 - 65,535.
|
||||||
UdpPort=1234
|
UdpPort=3355
|
||||||
|
|
||||||
; Log Selection
|
; Log Selection
|
||||||
;
|
;
|
||||||
|
21
configure.ac
21
configure.ac
@ -78,6 +78,8 @@ AC_ARG_ENABLE(lame,[ --disable-lame disable MPEG Layer 3 encode suppor
|
|||||||
[LAME_DISABLED=yes],[])
|
[LAME_DISABLED=yes],[])
|
||||||
AC_ARG_ENABLE(flac,[ --disable-flac disable FLAC encode/decode support],
|
AC_ARG_ENABLE(flac,[ --disable-flac disable FLAC encode/decode support],
|
||||||
[FLAC_DISABLED=yes],[])
|
[FLAC_DISABLED=yes],[])
|
||||||
|
AC_ARG_ENABLE(mp4v2,[ --disable-mp4 disable M4A decode support],
|
||||||
|
[MP4V2_DISABLED=yes],[])
|
||||||
|
|
||||||
#
|
#
|
||||||
# Check for Qt
|
# Check for Qt
|
||||||
@ -208,6 +210,19 @@ if test -z $FLAC_DISABLED ; then
|
|||||||
AC_CHECK_LIB(FLAC,FLAC__metadata_get_tags,[FLAC_METADATA_FOUND=yes],[])
|
AC_CHECK_LIB(FLAC,FLAC__metadata_get_tags,[FLAC_METADATA_FOUND=yes],[])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
#
|
||||||
|
# Check for MP4V2
|
||||||
|
#
|
||||||
|
if test -z $MP4V2_DISABLED ; then
|
||||||
|
AC_CHECK_HEADER(mp4v2/mp4v2.h,[MP4V2_HEADER_FOUND=yes],[])
|
||||||
|
if test $MP4V2_HEADER_FOUND ; then
|
||||||
|
AC_CHECK_HEADER(neaacdec.h,[MP4V2_FOUND=yes],[])
|
||||||
|
if test $MP4V2_FOUND ; then
|
||||||
|
AC_DEFINE(HAVE_MP4_LIBS)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
#
|
#
|
||||||
# Set Hard Library Dependencies
|
# Set Hard Library Dependencies
|
||||||
#
|
#
|
||||||
@ -427,6 +442,7 @@ AC_CONFIG_FILES([rivendell.spec \
|
|||||||
utils/rdalsaconfig/Makefile \
|
utils/rdalsaconfig/Makefile \
|
||||||
utils/rdcheckcuts/Makefile \
|
utils/rdcheckcuts/Makefile \
|
||||||
utils/rdchunk/Makefile \
|
utils/rdchunk/Makefile \
|
||||||
|
utils/rdcleandirs/Makefile \
|
||||||
utils/rdcollect/Makefile \
|
utils/rdcollect/Makefile \
|
||||||
utils/rddbcheck/Makefile \
|
utils/rddbcheck/Makefile \
|
||||||
utils/rddelete/Makefile \
|
utils/rddelete/Makefile \
|
||||||
@ -534,6 +550,11 @@ AC_MSG_NOTICE("| OggVorbis Encoding/Decoding Support ... No |")
|
|||||||
else
|
else
|
||||||
AC_MSG_NOTICE("| OggVorbis Encoding/Decoding Support ... Yes |")
|
AC_MSG_NOTICE("| OggVorbis Encoding/Decoding Support ... Yes |")
|
||||||
fi
|
fi
|
||||||
|
if test -z $MP4V2_FOUND ; then
|
||||||
|
AC_MSG_NOTICE("| M4A Decoding Support ... No |")
|
||||||
|
else
|
||||||
|
AC_MSG_NOTICE("| M4A Decoding Support ... Yes |")
|
||||||
|
fi
|
||||||
AC_MSG_NOTICE("| |")
|
AC_MSG_NOTICE("| |")
|
||||||
AC_MSG_NOTICE("| Optional Components: |")
|
AC_MSG_NOTICE("| Optional Components: |")
|
||||||
if test -z $USING_PAM ; then
|
if test -z $USING_PAM ; then
|
||||||
|
@ -22,10 +22,12 @@ LiveWire Multicast GPIO
|
|||||||
Local Audio Adapter
|
Local Audio Adapter
|
||||||
Logitek vGuest
|
Logitek vGuest
|
||||||
Quartz Electronics Type 1 Routing Protocol
|
Quartz Electronics Type 1 Routing Protocol
|
||||||
|
Ross NK Video Switchers (via SCP/A Serial Interface)
|
||||||
Serial Port Modem Control Lines
|
Serial Port Modem Control Lines
|
||||||
|
Sierra Automated Systems 16000(D) Audio Router
|
||||||
Sierra Automated Systems 32000 Audio Router
|
Sierra Automated Systems 32000 Audio Router
|
||||||
Sierra Automated Systems 64000 Audio Router
|
Sierra Automated Systems 64000 Audio Router
|
||||||
Sierra Automated Systems Universal Serial Interface (USI)
|
Sierra Automated Systems User Serial Interface (USI)
|
||||||
Sine Systems ACU-1 (Prophet version)
|
Sine Systems ACU-1 (Prophet version)
|
||||||
Software Authority Protocol
|
Software Authority Protocol
|
||||||
StarGuide III Satellite Receiver
|
StarGuide III Satellite Receiver
|
||||||
@ -510,6 +512,22 @@ Control can done either by means of an RS-232C connection or by means of
|
|||||||
TCP/IP to TCP port 23.
|
TCP/IP to TCP port 23.
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------------------------------------------
|
||||||
|
Ross NK Video Switchers (via SCP/A Serial Interface)
|
||||||
|
|
||||||
|
Driver Name: Ross NK-SCP/A Interface
|
||||||
|
|
||||||
|
Supported RML Commands:
|
||||||
|
Switch Take ('ST')
|
||||||
|
|
||||||
|
GENERAL NOTES:
|
||||||
|
Control is done by means of an RS-232C connection to a NK-SCP/A serial
|
||||||
|
interface. Serial port parameters should be set to 9600 baud rate, no parity,
|
||||||
|
8 data bits, 1 stop bit, CR termination. The Breakaway to use is defined
|
||||||
|
by setting the 'Card' parameter in the driver configuration, with
|
||||||
|
Card 0 = Breakaway 1, Card 1 = Breakaway 2, etc.
|
||||||
|
|
||||||
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
SERIAL PORT MODEM CONTROL LINES
|
SERIAL PORT MODEM CONTROL LINES
|
||||||
|
|
||||||
@ -535,6 +553,26 @@ device. The lines map as follows:
|
|||||||
2 Ready To Send (RTS)
|
2 Ready To Send (RTS)
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------------------------------------------
|
||||||
|
SIERRA AUTOMATED SYSTEMS 16000(D) AUDIO ROUTER
|
||||||
|
|
||||||
|
Driver Name: SAS 16000(D)
|
||||||
|
|
||||||
|
Supported RML Commands:
|
||||||
|
Switch Take ('ST')
|
||||||
|
|
||||||
|
GENERAL NOTES:
|
||||||
|
Both analog and AES3 digital (D) variants are supported. Control can done
|
||||||
|
by means of an RS-232C connection to the 'User Serial Interface' port on
|
||||||
|
the unit. Serial port parameters should be:
|
||||||
|
|
||||||
|
Baud Rate: 9600
|
||||||
|
Parity: None
|
||||||
|
Data Bits: 8
|
||||||
|
Stop Bits: 1
|
||||||
|
Terminator: None
|
||||||
|
|
||||||
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
SIERRA AUTOMATED SYSTEMS 32000 AUDIO ROUTER
|
SIERRA AUTOMATED SYSTEMS 32000 AUDIO ROUTER
|
||||||
|
|
||||||
@ -591,9 +629,9 @@ outputs as well as audio crosspoints.
|
|||||||
|
|
||||||
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
SIERRA AUTOMATED SYSTEMS Universal Serial Interface (USI)
|
SIERRA AUTOMATED SYSTEMS User Serial Interface (USI)
|
||||||
|
|
||||||
Driver Name: SAS User Serial Interface
|
Driver Name: SAS USI
|
||||||
|
|
||||||
Supported RML Commands:
|
Supported RML Commands:
|
||||||
Switch Take ('ST')
|
Switch Take ('ST')
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
RDLIBRARY Table Layout for Rivendell
|
RDLIBRARY Table Layout for Rivendell
|
||||||
|
|
||||||
The RDLIBRARY table holds configuration data for the RDLibrary widget.
|
The RDLIBRARY table holds configuration data for the RDLibrary widget.
|
||||||
Following is the layout of a record in the RDLIBRARY table:
|
|
||||||
|
|
||||||
FIELD NAME TYPE REMARKS
|
FIELD NAME TYPE REMARKS
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
@ -32,6 +31,7 @@ RIPPER_DEVICE char(64)
|
|||||||
PARANOIA_LEVEL int(11)
|
PARANOIA_LEVEL int(11)
|
||||||
RIPPER_LEVEL int(11)
|
RIPPER_LEVEL int(11)
|
||||||
CDDB_SERVER char(64)
|
CDDB_SERVER char(64)
|
||||||
|
READ_ISRC enum('N','Y')
|
||||||
ENABLE_EDITOR enum('N','Y')
|
ENABLE_EDITOR enum('N','Y')
|
||||||
SRC_CONVERTER int(11)
|
SRC_CONVERTER int(11)
|
||||||
LIMIT_SEARCH int(11) 0 = No, 1 = Yes, 2 = Previous
|
LIMIT_SEARCH int(11) 0 = No, 1 = Yes, 2 = Previous
|
||||||
|
@ -40,6 +40,7 @@ HAVE_FLAC enum('N','Y')
|
|||||||
HAVE_TWOLAME enum('N','Y')
|
HAVE_TWOLAME enum('N','Y')
|
||||||
HAVE_LAME enum('N','Y')
|
HAVE_LAME enum('N','Y')
|
||||||
HAVE_MPG321 enum('N','Y')
|
HAVE_MPG321 enum('N','Y')
|
||||||
|
HAVE_MP4_DECODE enum('N','Y')
|
||||||
HPI_VERSION char(16)
|
HPI_VERSION char(16)
|
||||||
JACK_VERSION char(16)
|
JACK_VERSION char(16)
|
||||||
ALSA_VERSION char(16)
|
ALSA_VERSION char(16)
|
||||||
|
@ -58,6 +58,9 @@ case "$1" in
|
|||||||
if test $VER = "release" ; then
|
if test $VER = "release" ; then
|
||||||
VER=`awk '/release/ {print $4}' /etc/redhat-release`
|
VER=`awk '/release/ {print $4}' /etc/redhat-release`
|
||||||
fi
|
fi
|
||||||
|
if test $VER = "Enterprise" ; then
|
||||||
|
VER=`awk '/release/ {print $7}' /etc/redhat-release`
|
||||||
|
fi
|
||||||
echo $VER
|
echo $VER
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
@ -80,6 +83,9 @@ case "$1" in
|
|||||||
if test $VER = "release" ; then
|
if test $VER = "release" ; then
|
||||||
VER=`awk '/release/ {print $4}' /etc/redhat-release`
|
VER=`awk '/release/ {print $4}' /etc/redhat-release`
|
||||||
fi
|
fi
|
||||||
|
if test $VER = "Enterprise" ; then
|
||||||
|
VER=`awk '/release/ {print $7}' /etc/redhat-release`
|
||||||
|
fi
|
||||||
echo $VER | awk -F '.' '{print $1}'
|
echo $VER | awk -F '.' '{print $1}'
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
@ -98,6 +104,9 @@ case "$1" in
|
|||||||
if test $VER = "release" ; then
|
if test $VER = "release" ; then
|
||||||
VER=`awk '/release/ {print $4}' /etc/redhat-release`
|
VER=`awk '/release/ {print $4}' /etc/redhat-release`
|
||||||
fi
|
fi
|
||||||
|
if test $VER = "Enterprise" ; then
|
||||||
|
VER=`awk '/release/ {print $7}' /etc/redhat-release`
|
||||||
|
fi
|
||||||
echo $VER | awk -F '.' '{print $2}'
|
echo $VER | awk -F '.' '{print $2}'
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
2
helpers/.gitignore
vendored
2
helpers/.gitignore
vendored
@ -1,2 +0,0 @@
|
|||||||
cwrap
|
|
||||||
jsmin
|
|
6
importers/.gitignore
vendored
6
importers/.gitignore
vendored
@ -1,6 +0,0 @@
|
|||||||
nexgen_filter
|
|
||||||
panel_copy
|
|
||||||
rdcatch_copy
|
|
||||||
rivendell_filter
|
|
||||||
sas_filter
|
|
||||||
wings_filter
|
|
1
lib/.gitignore
vendored
1
lib/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdpaths.h
|
|
@ -177,6 +177,7 @@ dist_librd_la_SOURCES = dbversion.h\
|
|||||||
rdmeteraverage.cpp rdmeteraverage.h\
|
rdmeteraverage.cpp rdmeteraverage.h\
|
||||||
rdmixer.cpp rdmixer.h\
|
rdmixer.cpp rdmixer.h\
|
||||||
rdmonitor_config.cpp rdmonitor_config.h\
|
rdmonitor_config.cpp rdmonitor_config.h\
|
||||||
|
rdmp4.cpp rdmp4.h\
|
||||||
rdnownext.cpp rdnownext.h\
|
rdnownext.cpp rdnownext.h\
|
||||||
rdoneshot.cpp rdoneshot.h\
|
rdoneshot.cpp rdoneshot.h\
|
||||||
rdpam.cpp rdpam.h\
|
rdpam.cpp rdpam.h\
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
/*
|
/*
|
||||||
* Current Database Version
|
* Current Database Version
|
||||||
*/
|
*/
|
||||||
#define RD_VERSION_DATABASE 242
|
#define RD_VERSION_DATABASE 245
|
||||||
|
|
||||||
|
|
||||||
#endif // DBVERSION_H
|
#endif // DBVERSION_H
|
||||||
|
2
lib/rd.h
2
lib/rd.h
@ -157,7 +157,7 @@
|
|||||||
/*
|
/*
|
||||||
* Max number of inputs or outputs in a switcher
|
* Max number of inputs or outputs in a switcher
|
||||||
*/
|
*/
|
||||||
#define MAX_ENDPOINTS 1024
|
#define MAX_ENDPOINTS 2048
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Max number of attached switcher matrices per workstation
|
* Max number of attached switcher matrices per workstation
|
||||||
|
@ -22,11 +22,13 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <sndfile.h>
|
#include <sndfile.h>
|
||||||
#include <samplerate.h>
|
#include <samplerate.h>
|
||||||
@ -39,6 +41,10 @@
|
|||||||
#include <FLAC++/encoder.h>
|
#include <FLAC++/encoder.h>
|
||||||
#include <rdflacdecode.h>
|
#include <rdflacdecode.h>
|
||||||
#endif // HAVE_FLAC
|
#endif // HAVE_FLAC
|
||||||
|
#ifdef HAVE_MP4_LIBS
|
||||||
|
#include <mp4v2/mp4v2.h>
|
||||||
|
#include <neaacdec.h>
|
||||||
|
#endif // HAVE_MP4_LIBS
|
||||||
#include <id3/tag.h>
|
#include <id3/tag.h>
|
||||||
#include <qfile.h>
|
#include <qfile.h>
|
||||||
|
|
||||||
@ -306,6 +312,11 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage1Convert(const QString &srcfile,
|
|||||||
delete wave;
|
delete wave;
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
case RDWaveFile::M4A:
|
||||||
|
err=Stage1M4A(dstfile,wave);
|
||||||
|
delete wave;
|
||||||
|
return err;
|
||||||
|
|
||||||
case RDWaveFile::Aiff:
|
case RDWaveFile::Aiff:
|
||||||
case RDWaveFile::Unknown:
|
case RDWaveFile::Unknown:
|
||||||
break;
|
break;
|
||||||
@ -672,6 +683,165 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage1Mpeg(const QString &dstfile,
|
|||||||
#endif // HAVE_MAD
|
#endif // HAVE_MAD
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Based on libfaad's frontend/main.c, but using libmp4v2 for MP4 access.
|
||||||
|
RDAudioConvert::ErrorCode RDAudioConvert::Stage1M4A(const QString &dstfile,
|
||||||
|
RDWaveFile *wave)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_MP4_LIBS
|
||||||
|
SNDFILE *sf_dst=NULL;
|
||||||
|
SF_INFO sf_dst_info;
|
||||||
|
MP4FileHandle f;
|
||||||
|
MP4TrackId audioTrack;
|
||||||
|
MP4SampleId firstSample, lastSample;
|
||||||
|
uint32_t aacBufSize, aacConfigSize;
|
||||||
|
uint8_t *aacBuf, *aacConfigBuffer;
|
||||||
|
NeAACDecHandle hDecoder;
|
||||||
|
NeAACDecConfigurationPtr config;
|
||||||
|
unsigned long foundSampleRate;
|
||||||
|
unsigned char foundChannels;
|
||||||
|
RDAudioConvert::ErrorCode ret = RDAudioConvert::ErrorOk;
|
||||||
|
|
||||||
|
if(!dlmp4.load()) {
|
||||||
|
return RDAudioConvert::ErrorFormatNotSupported;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Open source
|
||||||
|
//
|
||||||
|
f = dlmp4.MP4Read(wave->getName());
|
||||||
|
if(f == MP4_INVALID_FILE_HANDLE)
|
||||||
|
return RDAudioConvert::ErrorNoSource;
|
||||||
|
|
||||||
|
audioTrack = dlmp4.getMP4AACTrack(f);
|
||||||
|
firstSample = 1;
|
||||||
|
lastSample = dlmp4.MP4GetTrackNumberOfSamples(f, audioTrack);
|
||||||
|
if(conv_start_point > 0) {
|
||||||
|
|
||||||
|
double startsecs = ((double)conv_start_point) / 1000;
|
||||||
|
MP4Timestamp startts = (MP4Timestamp)(startsecs * wave->getSamplesPerSec());
|
||||||
|
firstSample = dlmp4.MP4GetSampleIdFromTime(f, audioTrack, startts, /*need_sync=*/false);
|
||||||
|
if(firstSample == MP4_INVALID_SAMPLE_ID) {
|
||||||
|
ret = RDAudioConvert::ErrorInvalidSource;
|
||||||
|
goto out_mp4;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if(conv_end_point > 0) {
|
||||||
|
|
||||||
|
double stopsecs = ((double)conv_end_point) / 1000;
|
||||||
|
MP4Timestamp stopts = (MP4Timestamp)(stopsecs * wave->getSamplesPerSec());
|
||||||
|
lastSample = dlmp4.MP4GetSampleIdFromTime(f, audioTrack, stopts, /*need_sync=*/false);
|
||||||
|
if(lastSample == MP4_INVALID_SAMPLE_ID) {
|
||||||
|
ret = RDAudioConvert::ErrorInvalidSource;
|
||||||
|
goto out_mp4;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
aacBufSize = dlmp4.MP4GetTrackMaxSampleSize(f, audioTrack);
|
||||||
|
aacBuf = (uint8_t*)malloc(aacBufSize);
|
||||||
|
if(!aacBufSize || !aacBuf) {
|
||||||
|
// Probably the source's fault for specifying a massive buffer.
|
||||||
|
ret = RDAudioConvert::ErrorInvalidSource;
|
||||||
|
goto out_mp4;
|
||||||
|
}
|
||||||
|
|
||||||
|
dlmp4.MP4GetTrackESConfiguration(f, audioTrack, &aacConfigBuffer, &aacConfigSize);
|
||||||
|
if(!aacConfigBuffer) {
|
||||||
|
ret = RDAudioConvert::ErrorInvalidSource;
|
||||||
|
goto out_mp4_buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Open Destination
|
||||||
|
//
|
||||||
|
|
||||||
|
memset(&sf_dst_info,0,sizeof(sf_dst_info));
|
||||||
|
sf_dst_info.format=SF_FORMAT_WAV|SF_FORMAT_FLOAT;
|
||||||
|
sf_dst_info.channels=wave->getChannels();
|
||||||
|
sf_dst_info.samplerate=wave->getSamplesPerSec();
|
||||||
|
if((sf_dst=sf_open(dstfile,SFM_WRITE,&sf_dst_info))==NULL) {
|
||||||
|
ret = RDAudioConvert::ErrorNoDestination;
|
||||||
|
goto out_mp4_configbuf;
|
||||||
|
}
|
||||||
|
sf_command(sf_dst,SFC_SET_NORM_DOUBLE,NULL,SF_FALSE);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialize Decoder
|
||||||
|
//
|
||||||
|
hDecoder = dlmp4.NeAACDecOpen();
|
||||||
|
|
||||||
|
config = dlmp4.NeAACDecGetCurrentConfiguration(hDecoder);
|
||||||
|
config->outputFormat = FAAD_FMT_FLOAT;
|
||||||
|
config->downMatrix = 1; // Downmix >2 channels to stereo.
|
||||||
|
if(!dlmp4.NeAACDecSetConfiguration(hDecoder, config)) {
|
||||||
|
ret = RDAudioConvert::ErrorInvalidSource;
|
||||||
|
goto out_decoder;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dlmp4.NeAACDecInit2(hDecoder, aacConfigBuffer, aacConfigSize, &foundSampleRate, &foundChannels) < 0) {
|
||||||
|
ret = RDAudioConvert::ErrorInvalidSource;
|
||||||
|
goto out_decoder;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(foundSampleRate != wave->getSamplesPerSec() || foundChannels != wave->getChannels()) {
|
||||||
|
fprintf(stderr, "M4A header information inconsistent with actual file? Header: %u/%u; file: %lu/%u\n",
|
||||||
|
wave->getSamplesPerSec(), (unsigned)wave->getChannels(), foundSampleRate, (unsigned)foundChannels);
|
||||||
|
ret = RDAudioConvert::ErrorInvalidSource;
|
||||||
|
goto out_decoder;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Decode
|
||||||
|
//
|
||||||
|
for(MP4SampleId i = firstSample; i <= lastSample; ++i) {
|
||||||
|
|
||||||
|
uint32_t aacBytes = aacBufSize;
|
||||||
|
if(!dlmp4.MP4ReadSample(f, audioTrack, i, &aacBuf, &aacBytes, 0, 0, 0, 0)) {
|
||||||
|
ret = RDAudioConvert::ErrorInvalidSource;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
NeAACDecFrameInfo frameInfo;
|
||||||
|
// The library docs are not clear about the lifetime or cleanup of sample_buffer.
|
||||||
|
// I hope it lives until the next NeAACDecDecode call, and is cleaned up by NeAACDecClose
|
||||||
|
void* sample_buffer = dlmp4.NeAACDecDecode(hDecoder, &frameInfo, aacBuf, aacBytes);
|
||||||
|
if(!sample_buffer) {
|
||||||
|
ret = RDAudioConvert::ErrorInvalidSource;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdatePeak((const float*)sample_buffer, frameInfo.samples);
|
||||||
|
|
||||||
|
if(sf_write_float(sf_dst, (const float*)sample_buffer, frameInfo.samples) != (sf_count_t)frameInfo.samples) {
|
||||||
|
ret = RDAudioConvert::ErrorInternal;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Cleanup
|
||||||
|
//
|
||||||
|
|
||||||
|
out_decoder:
|
||||||
|
dlmp4.NeAACDecClose(hDecoder);
|
||||||
|
// out_sf:
|
||||||
|
sf_close(sf_dst);
|
||||||
|
out_mp4_configbuf:
|
||||||
|
free(aacConfigBuffer);
|
||||||
|
out_mp4_buf:
|
||||||
|
free(aacBuf);
|
||||||
|
out_mp4:
|
||||||
|
dlmp4.MP4Close(f, 0);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
#else
|
||||||
|
return RDAudioConvert::ErrorFormatNotSupported;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
RDAudioConvert::ErrorCode RDAudioConvert::Stage1SndFile(const QString &dstfile,
|
RDAudioConvert::ErrorCode RDAudioConvert::Stage1SndFile(const QString &dstfile,
|
||||||
SNDFILE *sf_src,
|
SNDFILE *sf_src,
|
||||||
|
@ -31,6 +31,9 @@
|
|||||||
#ifdef HAVE_MAD
|
#ifdef HAVE_MAD
|
||||||
#include <mad.h>
|
#include <mad.h>
|
||||||
#endif // HAVE_MAD
|
#endif // HAVE_MAD
|
||||||
|
|
||||||
|
#include <rdmp4.h>
|
||||||
|
|
||||||
#include <qobject.h>
|
#include <qobject.h>
|
||||||
|
|
||||||
#include <rdwavedata.h>
|
#include <rdwavedata.h>
|
||||||
@ -68,6 +71,8 @@ class RDAudioConvert : public QObject
|
|||||||
RDWaveFile *wave);
|
RDWaveFile *wave);
|
||||||
RDAudioConvert::ErrorCode Stage1Mpeg(const QString &dstfile,
|
RDAudioConvert::ErrorCode Stage1Mpeg(const QString &dstfile,
|
||||||
RDWaveFile *wave);
|
RDWaveFile *wave);
|
||||||
|
RDAudioConvert::ErrorCode Stage1M4A(const QString &dstfile,
|
||||||
|
RDWaveFile *wave);
|
||||||
RDAudioConvert::ErrorCode Stage1SndFile(const QString &dstfile,
|
RDAudioConvert::ErrorCode Stage1SndFile(const QString &dstfile,
|
||||||
SNDFILE *sf_src,
|
SNDFILE *sf_src,
|
||||||
SF_INFO *sf_src_info);
|
SF_INFO *sf_src_info);
|
||||||
@ -150,6 +155,9 @@ class RDAudioConvert : public QObject
|
|||||||
int (*lame_encode_flush)(lame_global_flags *,unsigned char *,int);
|
int (*lame_encode_flush)(lame_global_flags *,unsigned char *,int);
|
||||||
int (*lame_set_bWriteVbrTag)(lame_global_flags *, int);
|
int (*lame_set_bWriteVbrTag)(lame_global_flags *, int);
|
||||||
#endif // HAVE_LAME
|
#endif // HAVE_LAME
|
||||||
|
#ifdef HAVE_MP4_LIBS
|
||||||
|
DLMP4 dlmp4;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -201,13 +201,15 @@ int RDCdPlayer::rightVolume()
|
|||||||
|
|
||||||
void RDCdPlayer::setCddbRecord(RDCddbRecord *rec)
|
void RDCdPlayer::setCddbRecord(RDCddbRecord *rec)
|
||||||
{
|
{
|
||||||
rec->setTracks(cdrom_track_count);
|
if(cdrom_track_count>0) {
|
||||||
rec->setDiscId(cdrom_disc_id);
|
rec->setTracks(cdrom_track_count);
|
||||||
rec->setDiscLength(75*(60*cdrom_track_start[cdrom_track_count].msf.minute+
|
rec->setDiscId(cdrom_disc_id);
|
||||||
cdrom_track_start[cdrom_track_count].msf.second)+
|
rec->setDiscLength(75*(60*cdrom_track_start[cdrom_track_count].msf.minute+
|
||||||
cdrom_track_start[cdrom_track_count].msf.frame);
|
cdrom_track_start[cdrom_track_count].msf.second)+
|
||||||
for(int i=0;i<cdrom_track_count;i++) {
|
cdrom_track_start[cdrom_track_count].msf.frame);
|
||||||
rec->setTrackOffset(i,trackOffset(i));
|
for(int i=0;i<cdrom_track_count;i++) {
|
||||||
|
rec->setTrackOffset(i,trackOffset(i));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -460,6 +462,7 @@ void RDCdPlayer::ReadToc()
|
|||||||
//
|
//
|
||||||
if(ioctl(cdrom_fd,CDROMREADTOCHDR,&tochdr)<0) {
|
if(ioctl(cdrom_fd,CDROMREADTOCHDR,&tochdr)<0) {
|
||||||
cdrom_track_count=0;
|
cdrom_track_count=0;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
cdrom_track_count=tochdr.cdth_trk1-tochdr.cdth_trk0+1;
|
cdrom_track_count=tochdr.cdth_trk1-tochdr.cdth_trk0+1;
|
||||||
|
|
||||||
|
@ -288,6 +288,19 @@ void RDLibraryConf::setCddbServer(QString server) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool RDLibraryConf::readIsrc() const
|
||||||
|
{
|
||||||
|
return RDBool(RDGetSqlValue("RDLIBRARY","ID",lib_id,"READ_ISRC").
|
||||||
|
toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RDLibraryConf::setReadIsrc(bool state) const
|
||||||
|
{
|
||||||
|
SetRow("READ_ISRC",RDYesNo(state));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool RDLibraryConf::enableEditor() const
|
bool RDLibraryConf::enableEditor() const
|
||||||
{
|
{
|
||||||
return RDBool(RDGetSqlValue("RDLIBRARY","ID",lib_id,"ENABLE_EDITOR").
|
return RDBool(RDGetSqlValue("RDLIBRARY","ID",lib_id,"ENABLE_EDITOR").
|
||||||
|
@ -71,6 +71,8 @@ class RDLibraryConf
|
|||||||
void setRipperLevel(int level) const;
|
void setRipperLevel(int level) const;
|
||||||
QString cddbServer() const;
|
QString cddbServer() const;
|
||||||
void setCddbServer(QString server) const;
|
void setCddbServer(QString server) const;
|
||||||
|
bool readIsrc() const;
|
||||||
|
void setReadIsrc(bool state) const;
|
||||||
bool enableEditor() const;
|
bool enableEditor() const;
|
||||||
void setEnableEditor(bool state) const;
|
void setEnableEditor(bool state) const;
|
||||||
void getSettings(RDSettings *s) const;
|
void getSettings(RDSettings *s) const;
|
||||||
|
@ -64,7 +64,9 @@ bool __mx_primary_controls[RDMatrix::LastType][RDMatrix::LastControl]=
|
|||||||
{0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0}, // BT Sentinel 4 Web
|
{0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0}, // BT Sentinel 4 Web
|
||||||
{0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, // BT GPI-16
|
{0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, // BT GPI-16
|
||||||
{0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, // Modem Lines
|
{0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, // Modem Lines
|
||||||
{0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0} // Software Authority
|
{0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0}, // Software Authority
|
||||||
|
{0,1,1,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1,1,1,0,0,0,0,1,0,0,0,0}, // SAS 16000
|
||||||
|
{0,1,0,0,0,0,0,0,1,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0} // Ross NK/SCP
|
||||||
};
|
};
|
||||||
bool __mx_backup_controls[RDMatrix::LastType][RDMatrix::LastControl]=
|
bool __mx_backup_controls[RDMatrix::LastType][RDMatrix::LastControl]=
|
||||||
{
|
{
|
||||||
@ -103,7 +105,9 @@ bool __mx_backup_controls[RDMatrix::LastType][RDMatrix::LastControl]=
|
|||||||
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, // BT Sentinel 4 Web
|
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, // BT Sentinel 4 Web
|
||||||
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, // BT GPI-16
|
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, // BT GPI-16
|
||||||
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, // Modem Lines
|
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, // Modem Lines
|
||||||
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} // Software Authority
|
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, // Software Authority
|
||||||
|
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, // SAS 16000
|
||||||
|
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} // ROSS NK/SCP
|
||||||
};
|
};
|
||||||
|
|
||||||
int __mx_default_values[RDMatrix::LastType][RDMatrix::LastControl]=
|
int __mx_default_values[RDMatrix::LastType][RDMatrix::LastControl]=
|
||||||
@ -143,7 +147,9 @@ int __mx_default_values[RDMatrix::LastType][RDMatrix::LastControl]=
|
|||||||
{1,0,0,0,0,0,0,0,0,0,0,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, // BT Sentinel 4 Web
|
{1,0,0,0,0,0,0,0,0,0,0,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, // BT Sentinel 4 Web
|
||||||
{0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, // BT GPI-16
|
{0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, // BT GPI-16
|
||||||
{0,0,0,0,0,0,0,0,0,0,0,0,0,4,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, // Modem Lines
|
{0,0,0,0,0,0,0,0,0,0,0,0,0,4,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, // Modem Lines
|
||||||
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0} // Software Authority
|
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, // Software Authority
|
||||||
|
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, // SAS 16000
|
||||||
|
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0} // Ross NK/SCP
|
||||||
};
|
};
|
||||||
|
|
||||||
RDMatrix::RDMatrix(const QString &station,int matrix)
|
RDMatrix::RDMatrix(const QString &station,int matrix)
|
||||||
@ -603,8 +609,12 @@ QString RDMatrix::typeString(RDMatrix::Type type)
|
|||||||
return QString("BroadcastTools ACS 8.2");
|
return QString("BroadcastTools ACS 8.2");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RDMatrix::Sas16000:
|
||||||
|
return QString("SAS 16000(D)");
|
||||||
|
break;
|
||||||
|
|
||||||
case RDMatrix::SasUsi:
|
case RDMatrix::SasUsi:
|
||||||
return QString("SAS User Serial Interface");
|
return QString("SAS USI");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RDMatrix::Bt16x2:
|
case RDMatrix::Bt16x2:
|
||||||
@ -691,6 +701,10 @@ QString RDMatrix::typeString(RDMatrix::Type type)
|
|||||||
return QString("Software Authority Protocol");
|
return QString("Software Authority Protocol");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RDMatrix::RossNkScp:
|
||||||
|
return QString("Ross NK-SCP/A Interface");
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return QString("Unknown Type");
|
return QString("Unknown Type");
|
||||||
break;
|
break;
|
||||||
|
@ -33,12 +33,12 @@ class RDMatrix
|
|||||||
enum PortType {TtyPort=0,TcpPort=1,NoPort=2};
|
enum PortType {TtyPort=0,TcpPort=1,NoPort=2};
|
||||||
enum Type {LocalGpio=0,GenericGpo=1,GenericSerial=2,Sas32000=3,Sas64000=4,
|
enum Type {LocalGpio=0,GenericGpo=1,GenericSerial=2,Sas32000=3,Sas64000=4,
|
||||||
Unity4000=5,BtSs82=6,Bt10x1=7,Sas64000Gpi=8,Bt16x1=9,Bt8x2=10,
|
Unity4000=5,BtSs82=6,Bt10x1=7,Sas64000Gpi=8,Bt16x1=9,Bt8x2=10,
|
||||||
BtAcs82=11,SasUsi=12,Bt16x2=13,BtSs124=14,LocalAudioAdapter=15,
|
BtAcs82=11,SasUsi=12,Bt16x2=13,BtSs124=14,
|
||||||
LogitekVguest=16,BtSs164=17,StarGuideIII=18,BtSs42=19,
|
LocalAudioAdapter=15,LogitekVguest=16,BtSs164=17,StarGuideIII=18,
|
||||||
LiveWireLwrpAudio=20,Quartz1=21,BtSs44=22,BtSrc8III=23,BtSrc16=24,
|
BtSs42=19,LiveWireLwrpAudio=20,Quartz1=21,BtSs44=22,BtSrc8III=23,
|
||||||
Harlond=25,Acu1p=26,LiveWireMcastGpio=27,Am16=28,
|
BtSrc16=24,Harlond=25,Acu1p=26,LiveWireMcastGpio=27,Am16=28,
|
||||||
LiveWireLwrpGpio=29,BtSentinel4Web=30,BtGpi16=31,ModemLines=32,
|
LiveWireLwrpGpio=29,BtSentinel4Web=30,BtGpi16=31,ModemLines=32,
|
||||||
SoftwareAuthority=33,LastType=34};
|
SoftwareAuthority=33,Sas16000=34,RossNkScp=35,LastType=36};
|
||||||
enum Endpoint {Input=0,Output=1};
|
enum Endpoint {Input=0,Output=1};
|
||||||
enum Mode {Stereo=0,Left=1,Right=2};
|
enum Mode {Stereo=0,Left=1,Right=2};
|
||||||
enum VguestAttribute {VguestEngine=0,VguestDevice=1,VguestSurface=2,
|
enum VguestAttribute {VguestEngine=0,VguestDevice=1,VguestSurface=2,
|
||||||
|
108
lib/rdmp4.cpp
Normal file
108
lib/rdmp4.cpp
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
// rdmp4.cpp
|
||||||
|
//
|
||||||
|
// Helpers for dealing with MP4 files.
|
||||||
|
//
|
||||||
|
// (C) Copyright 2014 Christopher Smowton <chris@smowton.net>
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Library General Public License
|
||||||
|
// version 2 as published by the Free Software Foundation.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public
|
||||||
|
// License along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifdef HAVE_MP4_LIBS
|
||||||
|
|
||||||
|
#include <rdmp4.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
|
|
||||||
|
MP4TrackId DLMP4::getMP4AACTrack(MP4FileHandle f)
|
||||||
|
{
|
||||||
|
|
||||||
|
uint32_t nTracks = this->MP4GetNumberOfTracks(f, NULL, 0);
|
||||||
|
|
||||||
|
for(uint32_t trackIndex = 0; trackIndex < nTracks; ++trackIndex) {
|
||||||
|
|
||||||
|
MP4TrackId thisTrack = this->MP4FindTrackId(f, trackIndex);
|
||||||
|
const char* trackType = this->MP4GetTrackType(f, thisTrack);
|
||||||
|
if(trackType && !strcmp(trackType, MP4_AUDIO_TRACK_TYPE)) {
|
||||||
|
|
||||||
|
const char* dataName = this->MP4GetTrackMediaDataName(f, thisTrack);
|
||||||
|
// The M4A format is only currently useful for AAC in an M4A container:
|
||||||
|
if(dataName &&
|
||||||
|
(!strcasecmp(dataName, "mp4a")) &&
|
||||||
|
this->MP4GetTrackEsdsObjectTypeId(f, thisTrack) == MP4_MPEG4_AUDIO_TYPE) {
|
||||||
|
|
||||||
|
return thisTrack;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return MP4_INVALID_TRACK_ID;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#define check_dlsym(lval, libhandle, symname) \
|
||||||
|
*(void**)(&lval) = dlsym(libhandle, symname); \
|
||||||
|
if(!lval) return false;
|
||||||
|
|
||||||
|
bool DLMP4::load()
|
||||||
|
{
|
||||||
|
|
||||||
|
if(loadSuccess)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
neaac_handle = dlopen("libfaad.so",RTLD_LAZY);
|
||||||
|
mp4_handle = dlopen("libmp4v2.so",RTLD_LAZY);
|
||||||
|
|
||||||
|
if(!neaac_handle || !mp4_handle)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
check_dlsym(this->MP4Read, mp4_handle, "MP4Read");
|
||||||
|
check_dlsym(this->MP4GetTrackNumberOfSamples, mp4_handle, "MP4GetTrackNumberOfSamples");
|
||||||
|
check_dlsym(this->MP4GetSampleIdFromTime, mp4_handle, "MP4GetSampleIdFromTime");
|
||||||
|
check_dlsym(this->MP4GetTrackMaxSampleSize, mp4_handle, "MP4GetTrackMaxSampleSize");
|
||||||
|
check_dlsym(this->MP4GetTrackESConfiguration, mp4_handle, "MP4GetTrackESConfiguration");
|
||||||
|
check_dlsym(this->MP4ReadSample, mp4_handle, "MP4ReadSample");
|
||||||
|
check_dlsym(this->MP4GetTrackBitRate, mp4_handle, "MP4GetTrackBitRate");
|
||||||
|
check_dlsym(this->MP4GetTrackAudioChannels, mp4_handle, "MP4GetTrackAudioChannels");
|
||||||
|
check_dlsym(this->MP4GetTrackDuration, mp4_handle, "MP4GetTrackDuration");
|
||||||
|
check_dlsym(this->MP4ConvertFromTrackDuration, mp4_handle, "MP4ConvertFromTrackDuration");
|
||||||
|
check_dlsym(this->MP4GetTrackTimeScale, mp4_handle, "MP4GetTrackTimeScale");
|
||||||
|
check_dlsym(this->MP4GetNumberOfTracks, mp4_handle, "MP4GetNumberOfTracks");
|
||||||
|
check_dlsym(this->MP4FindTrackId, mp4_handle, "MP4FindTrackId");
|
||||||
|
check_dlsym(this->MP4GetTrackType, mp4_handle, "MP4GetTrackType");
|
||||||
|
check_dlsym(this->MP4GetTrackMediaDataName, mp4_handle, "MP4GetTrackMediaDataName");
|
||||||
|
check_dlsym(this->MP4GetTrackEsdsObjectTypeId, mp4_handle, "MP4GetTrackEsdsObjectTypeId");
|
||||||
|
check_dlsym(this->MP4TagsAlloc, mp4_handle, "MP4TagsAlloc");
|
||||||
|
check_dlsym(this->MP4TagsFetch, mp4_handle, "MP4TagsFetch");
|
||||||
|
check_dlsym(this->MP4TagsFree, mp4_handle, "MP4TagsFree");
|
||||||
|
check_dlsym(this->MP4Close, mp4_handle, "MP4Close");
|
||||||
|
|
||||||
|
check_dlsym(this->NeAACDecOpen, neaac_handle, "NeAACDecOpen");
|
||||||
|
check_dlsym(this->NeAACDecGetCurrentConfiguration, neaac_handle, "NeAACDecGetCurrentConfiguration");
|
||||||
|
check_dlsym(this->NeAACDecSetConfiguration, neaac_handle, "NeAACDecSetConfiguration");
|
||||||
|
check_dlsym(this->NeAACDecInit2, neaac_handle, "NeAACDecInit2");
|
||||||
|
check_dlsym(this->NeAACDecDecode, neaac_handle, "NeAACDecDecode");
|
||||||
|
check_dlsym(this->NeAACDecClose, neaac_handle, "NeAACDecClose");
|
||||||
|
|
||||||
|
loadSuccess = true;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef check_dlsym
|
||||||
|
|
||||||
|
#endif // HAVE_MP4_LIBS
|
97
lib/rdmp4.h
Normal file
97
lib/rdmp4.h
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
// rdmp4.h
|
||||||
|
//
|
||||||
|
// Helpers for dealing with MP4 files.
|
||||||
|
//
|
||||||
|
// (C) Copyright 2014 Christopher Smowton <chris@smowton.net>
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Library General Public License
|
||||||
|
// version 2 as published by the Free Software Foundation.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public
|
||||||
|
// License along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef RDMP4_H
|
||||||
|
#define RDMP4_H
|
||||||
|
#ifdef HAVE_MP4_LIBS
|
||||||
|
|
||||||
|
#include <mp4v2/mp4v2.h>
|
||||||
|
#include <neaacdec.h>
|
||||||
|
// neaacdec.h defines "LC", as in "low-complexity AAC", which clashes with a Rivendell Command.
|
||||||
|
#undef LC
|
||||||
|
|
||||||
|
struct DLMP4 {
|
||||||
|
|
||||||
|
DLMP4() : loadSuccess(false) {}
|
||||||
|
|
||||||
|
void *neaac_handle;
|
||||||
|
void *mp4_handle;
|
||||||
|
bool loadSuccess;
|
||||||
|
|
||||||
|
// MP4v2 Functions
|
||||||
|
MP4FileHandle (*MP4Read) (const char* fileName);
|
||||||
|
MP4SampleId (*MP4GetTrackNumberOfSamples) (MP4FileHandle hFile, MP4TrackId trackId);
|
||||||
|
MP4SampleId (*MP4GetSampleIdFromTime) (MP4FileHandle hFile, MP4TrackId trackId, MP4Timestamp when, bool wantSyncSample);
|
||||||
|
uint32_t (*MP4GetTrackMaxSampleSize) (MP4FileHandle hFile, MP4TrackId trackId);
|
||||||
|
bool (*MP4GetTrackESConfiguration) (MP4FileHandle hFile, MP4TrackId trackId, uint8_t** ppConfig, uint32_t* pConfigSize);
|
||||||
|
bool (*MP4ReadSample) (
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4SampleId sampleId,
|
||||||
|
uint8_t** ppBytes,
|
||||||
|
uint32_t* pNumBytes,
|
||||||
|
MP4Timestamp* pStartTime,
|
||||||
|
MP4Duration* pDuration,
|
||||||
|
MP4Duration* pRenderingOffset,
|
||||||
|
bool* pIsSyncSample);
|
||||||
|
uint32_t (*MP4GetTrackBitRate) (MP4FileHandle hFile, MP4TrackId trackId);
|
||||||
|
int (*MP4GetTrackAudioChannels) (MP4FileHandle hFile, MP4TrackId trackId);
|
||||||
|
MP4Duration (*MP4GetTrackDuration) (MP4FileHandle hFile, MP4TrackId trackId);
|
||||||
|
uint64_t (*MP4ConvertFromTrackDuration) (
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4Duration duration,
|
||||||
|
uint32_t timeScale);
|
||||||
|
uint32_t (*MP4GetTrackTimeScale) (MP4FileHandle hFile, MP4TrackId trackId);
|
||||||
|
uint32_t (*MP4GetNumberOfTracks) (MP4FileHandle hFile, const char* type, uint8_t subType);
|
||||||
|
MP4TrackId (*MP4FindTrackId) (MP4FileHandle hFile, uint32_t trackIdx);
|
||||||
|
const char* (*MP4GetTrackType) (MP4FileHandle hFile, MP4TrackId);
|
||||||
|
const char* (*MP4GetTrackMediaDataName) (MP4FileHandle hFile, MP4TrackId);
|
||||||
|
uint8_t (*MP4GetTrackEsdsObjectTypeId) (MP4FileHandle hFile, MP4TrackId);
|
||||||
|
const MP4Tags* (*MP4TagsAlloc) (void);
|
||||||
|
bool (*MP4TagsFetch) (const MP4Tags* tags, MP4FileHandle hFile);
|
||||||
|
void (*MP4TagsFree) (const MP4Tags* tags);
|
||||||
|
void (*MP4Close) (MP4FileHandle hFile, uint32_t flags);
|
||||||
|
|
||||||
|
// libfaad / NeAACDec functions
|
||||||
|
NeAACDecHandle (*NeAACDecOpen) (void);
|
||||||
|
NeAACDecConfigurationPtr (*NeAACDecGetCurrentConfiguration) (NeAACDecHandle hDecoder);
|
||||||
|
unsigned char (*NeAACDecSetConfiguration) (NeAACDecHandle hDecoder, NeAACDecConfigurationPtr config);
|
||||||
|
char (*NeAACDecInit2)(NeAACDecHandle hDecoder,
|
||||||
|
unsigned char *pBuffer,
|
||||||
|
unsigned long SizeOfDecoderSpecificInfo,
|
||||||
|
unsigned long *samplerate,
|
||||||
|
unsigned char *channels);
|
||||||
|
void* (*NeAACDecDecode) (NeAACDecHandle hDecoder,
|
||||||
|
NeAACDecFrameInfo *hInfo,
|
||||||
|
unsigned char *buffer,
|
||||||
|
unsigned long buffer_size);
|
||||||
|
void (*NeAACDecClose) (NeAACDecHandle hDecoder);
|
||||||
|
|
||||||
|
// Helper functions:
|
||||||
|
MP4TrackId getMP4AACTrack(MP4FileHandle f);
|
||||||
|
|
||||||
|
bool load();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // HAVE_MP4_LIBS
|
||||||
|
#endif // RDMP4_H
|
@ -487,6 +487,10 @@ bool RDStation::haveCapability(Capability cap) const
|
|||||||
"HAVE_LAME").toString());
|
"HAVE_LAME").toString());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RDStation::HaveMp4Decode:
|
||||||
|
return RDBool(RDGetSqlValue("STATIONS","NAME",station_name,
|
||||||
|
"HAVE_MP4_DECODE").toString());
|
||||||
|
|
||||||
case RDStation::HaveMpg321:
|
case RDStation::HaveMpg321:
|
||||||
return RDBool(RDGetSqlValue("STATIONS","NAME",station_name,
|
return RDBool(RDGetSqlValue("STATIONS","NAME",station_name,
|
||||||
"HAVE_MPG321").toString());
|
"HAVE_MPG321").toString());
|
||||||
@ -519,6 +523,10 @@ void RDStation::setHaveCapability(Capability cap,bool state) const
|
|||||||
SetRow("HAVE_LAME",state);
|
SetRow("HAVE_LAME",state);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RDStation::HaveMp4Decode:
|
||||||
|
SetRow("HAVE_MP4_DECODE",state);
|
||||||
|
break;
|
||||||
|
|
||||||
case RDStation::HaveMpg321:
|
case RDStation::HaveMpg321:
|
||||||
SetRow("HAVE_MPG321",state);
|
SetRow("HAVE_MPG321",state);
|
||||||
break;
|
break;
|
||||||
|
@ -42,7 +42,7 @@ class RDStation
|
|||||||
UserSec=1 /**< UserSec - user based security. */
|
UserSec=1 /**< UserSec - user based security. */
|
||||||
};
|
};
|
||||||
enum Capability {HaveOggenc=0,HaveOgg123=1,HaveFlac=2,
|
enum Capability {HaveOggenc=0,HaveOgg123=1,HaveFlac=2,
|
||||||
HaveLame=3,HaveMpg321=4,HaveTwoLame=5};
|
HaveLame=3,HaveMpg321=4,HaveTwoLame=5,HaveMp4Decode=6};
|
||||||
enum FilterMode {FilterSynchronous=0,FilterAsynchronous=1};
|
enum FilterMode {FilterSynchronous=0,FilterAsynchronous=1};
|
||||||
RDStation(const QString &name,bool create=false);
|
RDStation(const QString &name,bool create=false);
|
||||||
~RDStation();
|
~RDStation();
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include <id3/tag.h>
|
#include <id3/tag.h>
|
||||||
#include <id3/misc_support.h>
|
#include <id3/misc_support.h>
|
||||||
@ -45,6 +46,11 @@
|
|||||||
#include <rd.h>
|
#include <rd.h>
|
||||||
#include <rdwavefile.h>
|
#include <rdwavefile.h>
|
||||||
#include <rdconf.h>
|
#include <rdconf.h>
|
||||||
|
#include <rdmp4.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_MP4_LIBS
|
||||||
|
#include <mp4v2/mp4v2.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
RDWaveFile::RDWaveFile(QString file_name)
|
RDWaveFile::RDWaveFile(QString file_name)
|
||||||
{
|
{
|
||||||
@ -319,6 +325,75 @@ bool RDWaveFile::openWave(RDWaveData *data)
|
|||||||
ReadId3Metadata();
|
ReadId3Metadata();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RDWaveFile::M4A:
|
||||||
|
{
|
||||||
|
#ifdef HAVE_MP4_LIBS
|
||||||
|
|
||||||
|
// MP4 libs must already be loaded by now for file to have that type.
|
||||||
|
assert(dlmp4.load());
|
||||||
|
format_tag=WAVE_FORMAT_M4A;
|
||||||
|
|
||||||
|
MP4FileHandle f = dlmp4.MP4Read(getName());
|
||||||
|
if(f == MP4_INVALID_FILE_HANDLE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Find an audio track, and populate sample rate, bits/sample etc.
|
||||||
|
MP4TrackId audioTrack = dlmp4.getMP4AACTrack(f);
|
||||||
|
|
||||||
|
if(audioTrack == MP4_INVALID_TRACK_ID) {
|
||||||
|
dlmp4.MP4Close(f, 0);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Found audio track. Get audio data:
|
||||||
|
avg_bytes_per_sec = dlmp4.MP4GetTrackBitRate(f, audioTrack);
|
||||||
|
channels = dlmp4.MP4GetTrackAudioChannels(f, audioTrack);
|
||||||
|
|
||||||
|
MP4Duration trackDuration = dlmp4.MP4GetTrackDuration(f, audioTrack);
|
||||||
|
ext_time_length = (unsigned)dlmp4.MP4ConvertFromTrackDuration(f, audioTrack, trackDuration,
|
||||||
|
MP4_MSECS_TIME_SCALE);
|
||||||
|
time_length = ext_time_length / 1000;
|
||||||
|
samples_per_sec = dlmp4.MP4GetTrackTimeScale(f, audioTrack);
|
||||||
|
bits_per_sample = 16;
|
||||||
|
data_start = 0;
|
||||||
|
sample_length = dlmp4.MP4GetTrackNumberOfSamples(f, audioTrack);
|
||||||
|
data_length = sample_length * 2 * channels;
|
||||||
|
data_chunk = true;
|
||||||
|
format_chunk = true;
|
||||||
|
wave_type = RDWaveFile::M4A;
|
||||||
|
|
||||||
|
// Now extract metadata (title, artist, etc)
|
||||||
|
|
||||||
|
if(wave_data) {
|
||||||
|
|
||||||
|
const MP4Tags* tags = dlmp4.MP4TagsAlloc();
|
||||||
|
dlmp4.MP4TagsFetch(tags, f);
|
||||||
|
|
||||||
|
wave_data->setMetadataFound(true);
|
||||||
|
|
||||||
|
if(tags->name)
|
||||||
|
wave_data->setTitle(tags->name);
|
||||||
|
if(tags->artist)
|
||||||
|
wave_data->setArtist(tags->artist);
|
||||||
|
if(tags->composer)
|
||||||
|
wave_data->setComposer(tags->composer);
|
||||||
|
if(tags->album)
|
||||||
|
wave_data->setAlbum(tags->album);
|
||||||
|
|
||||||
|
dlmp4.MP4TagsFree(tags);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dlmp4.MP4Close(f, 0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case RDWaveFile::Ogg:
|
case RDWaveFile::Ogg:
|
||||||
#ifdef HAVE_VORBIS
|
#ifdef HAVE_VORBIS
|
||||||
format_tag=WAVE_FORMAT_VORBIS;
|
format_tag=WAVE_FORMAT_VORBIS;
|
||||||
@ -2071,6 +2146,9 @@ RDWaveFile::Type RDWaveFile::GetType(int fd)
|
|||||||
if(IsOgg(fd)) {
|
if(IsOgg(fd)) {
|
||||||
return RDWaveFile::Ogg;
|
return RDWaveFile::Ogg;
|
||||||
}
|
}
|
||||||
|
if(IsM4A(fd)) {
|
||||||
|
return RDWaveFile::M4A;
|
||||||
|
}
|
||||||
if(IsMpeg(fd)) {
|
if(IsMpeg(fd)) {
|
||||||
return RDWaveFile::Mpeg;
|
return RDWaveFile::Mpeg;
|
||||||
}
|
}
|
||||||
@ -2262,6 +2340,20 @@ bool RDWaveFile::IsAiff(int fd)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RDWaveFile::IsM4A(int fd)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_MP4_LIBS
|
||||||
|
if(!dlmp4.load())
|
||||||
|
return false;
|
||||||
|
MP4FileHandle f = dlmp4.MP4Read(getName());
|
||||||
|
bool ret = f != MP4_INVALID_FILE_HANDLE;
|
||||||
|
if(ret)
|
||||||
|
dlmp4.MP4Close(f, 0);
|
||||||
|
return ret;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
off_t RDWaveFile::FindChunk(int fd,const char *chunk_name,unsigned *chunk_size,
|
off_t RDWaveFile::FindChunk(int fd,const char *chunk_name,unsigned *chunk_size,
|
||||||
bool big_end)
|
bool big_end)
|
||||||
|
@ -40,6 +40,8 @@
|
|||||||
#include <vorbis/vorbisenc.h>
|
#include <vorbis/vorbisenc.h>
|
||||||
#endif // HAVE_VORBIS
|
#endif // HAVE_VORBIS
|
||||||
|
|
||||||
|
#include <rdmp4.h>
|
||||||
|
|
||||||
#include <rdwavedata.h>
|
#include <rdwavedata.h>
|
||||||
#include <rdringbuffer.h>
|
#include <rdringbuffer.h>
|
||||||
#include <rdsettings.h>
|
#include <rdsettings.h>
|
||||||
@ -115,7 +117,7 @@ class RDWaveFile
|
|||||||
enum Format {Pcm8=0,Pcm16=1,Float32=2,MpegL1=3,MpegL2=4,MpegL3=5,
|
enum Format {Pcm8=0,Pcm16=1,Float32=2,MpegL1=3,MpegL2=4,MpegL3=5,
|
||||||
DolbyAc2=6,DolbyAc3=7,Vorbis=8,Pcm24=9};
|
DolbyAc2=6,DolbyAc3=7,Vorbis=8,Pcm24=9};
|
||||||
enum Type {Unknown=0,Wave=1,Mpeg=2,Ogg=3,Atx=4,Tmc=5,Flac=6,Ambos=7,
|
enum Type {Unknown=0,Wave=1,Mpeg=2,Ogg=3,Atx=4,Tmc=5,Flac=6,Ambos=7,
|
||||||
Aiff=8};
|
Aiff=8,M4A=9};
|
||||||
enum MpegID {NonMpeg=0,Mpeg1=1,Mpeg2=2};
|
enum MpegID {NonMpeg=0,Mpeg1=1,Mpeg2=2};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1034,6 +1036,7 @@ class RDWaveFile
|
|||||||
bool IsTmc(int fd);
|
bool IsTmc(int fd);
|
||||||
bool IsFlac(int fd);
|
bool IsFlac(int fd);
|
||||||
bool IsAiff(int fd);
|
bool IsAiff(int fd);
|
||||||
|
bool IsM4A(int fd);
|
||||||
off_t FindChunk(int fd,const char *chunk_name,unsigned *chunk_size,
|
off_t FindChunk(int fd,const char *chunk_name,unsigned *chunk_size,
|
||||||
bool big_end=false);
|
bool big_end=false);
|
||||||
bool GetChunk(int fd,const char *chunk_name,unsigned *chunk_size,
|
bool GetChunk(int fd,const char *chunk_name,unsigned *chunk_size,
|
||||||
@ -1228,6 +1231,10 @@ class RDWaveFile
|
|||||||
ogg_page ogg_pg;
|
ogg_page ogg_pg;
|
||||||
ogg_packet ogg_pack;
|
ogg_packet ogg_pack;
|
||||||
#endif // HAVE_VORBIS
|
#endif // HAVE_VORBIS
|
||||||
|
#ifdef HAVE_MP4_LIBS
|
||||||
|
DLMP4 dlmp4;
|
||||||
|
#endif
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -1366,6 +1373,7 @@ class RDWaveFile
|
|||||||
*/
|
*/
|
||||||
#define WAVE_FORMAT_VORBIS 0xFFFF
|
#define WAVE_FORMAT_VORBIS 0xFFFF
|
||||||
#define WAVE_FORMAT_FLAC 0xFFFE
|
#define WAVE_FORMAT_FLAC 0xFFFE
|
||||||
|
#define WAVE_FORMAT_M4A 0xFFFD
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Proprietary Format Categories
|
* Proprietary Format Categories
|
||||||
|
1
rdadmin/.gitignore
vendored
1
rdadmin/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdadmin
|
|
@ -644,6 +644,7 @@ bool CreateDb(QString name,QString pwd)
|
|||||||
HAVE_TWOLAME enum('N','Y') default 'N',\
|
HAVE_TWOLAME enum('N','Y') default 'N',\
|
||||||
HAVE_LAME enum('N','Y') default 'N',\
|
HAVE_LAME enum('N','Y') default 'N',\
|
||||||
HAVE_MPG321 enum('N','Y') default 'N',\
|
HAVE_MPG321 enum('N','Y') default 'N',\
|
||||||
|
HAVE_MP4_DECODE enum('N','Y') default 'N',\
|
||||||
HPI_VERSION char(16),\
|
HPI_VERSION char(16),\
|
||||||
JACK_VERSION char(16),\
|
JACK_VERSION char(16),\
|
||||||
ALSA_VERSION char(16),\
|
ALSA_VERSION char(16),\
|
||||||
@ -1007,6 +1008,7 @@ bool CreateDb(QString name,QString pwd)
|
|||||||
PARANOIA_LEVEL INT DEFAULT 0,\
|
PARANOIA_LEVEL INT DEFAULT 0,\
|
||||||
RIPPER_LEVEL INT DEFAULT -1300,\
|
RIPPER_LEVEL INT DEFAULT -1300,\
|
||||||
CDDB_SERVER CHAR(64) DEFAULT \"freedb.freedb.org\",\
|
CDDB_SERVER CHAR(64) DEFAULT \"freedb.freedb.org\",\
|
||||||
|
READ_ISRC enum('N','Y') default 'Y',\
|
||||||
ENABLE_EDITOR enum('N','Y') default 'N',\
|
ENABLE_EDITOR enum('N','Y') default 'N',\
|
||||||
SRC_CONVERTER int default 1,\
|
SRC_CONVERTER int default 1,\
|
||||||
LIMIT_SEARCH int default 1,\
|
LIMIT_SEARCH int default 1,\
|
||||||
@ -2236,7 +2238,7 @@ bool CreateDb(QString name,QString pwd)
|
|||||||
ID int unsigned auto_increment not null primary key, \
|
ID int unsigned auto_increment not null primary key, \
|
||||||
STATION_NAME char(64) not null,\
|
STATION_NAME char(64) not null,\
|
||||||
DESCRIPTION char(64),\
|
DESCRIPTION char(64),\
|
||||||
COMMAND_LINE char(255) not null,\
|
COMMAND_LINE text not null,\
|
||||||
index IDX_STATION_NAME (STATION_NAME))");
|
index IDX_STATION_NAME (STATION_NAME))");
|
||||||
if(!RunQuery(sql)) {
|
if(!RunQuery(sql)) {
|
||||||
return false;
|
return false;
|
||||||
@ -8086,6 +8088,26 @@ int UpdateDb(int ver)
|
|||||||
delete q;
|
delete q;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(ver<243) {
|
||||||
|
sql=QString("alter table STATIONS add column ")+
|
||||||
|
"HAVE_MP4_DECODE enum('N','Y') default 'N' after HAVE_MPG321";
|
||||||
|
q=new QSqlQuery(sql);
|
||||||
|
delete q;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ver<244) {
|
||||||
|
sql=QString("alter table JACK_CLIENTS modify column ")+
|
||||||
|
"COMMAND_LINE text not null";
|
||||||
|
q=new QSqlQuery(sql);
|
||||||
|
delete q;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ver<245) {
|
||||||
|
sql=QString("alter table RDLIBRARY add column ")+
|
||||||
|
"READ_ISRC enum('N','Y') default 'Y' after CDDB_SERVER";
|
||||||
|
q=new QSqlQuery(sql);
|
||||||
|
delete q;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// **** End of version updates ****
|
// **** End of version updates ****
|
||||||
|
@ -175,94 +175,105 @@ EditRDLibrary::EditRDLibrary(RDStation *station,RDStation *cae_station,
|
|||||||
lib_paranoia_label->setGeometry(25,210,130,19);
|
lib_paranoia_label->setGeometry(25,210,130,19);
|
||||||
lib_paranoia_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
lib_paranoia_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Read ISRC
|
||||||
|
//
|
||||||
|
lib_isrc_box=new QComboBox(this);
|
||||||
|
lib_isrc_box->setGeometry(160,232,60,19);
|
||||||
|
QLabel *lib_isrc_label=
|
||||||
|
new QLabel(lib_isrc_box,tr("&Read ISRCs from CD:"),this);
|
||||||
|
lib_isrc_label->setGeometry(25,232,130,19);
|
||||||
|
lib_isrc_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Ripper Level
|
// Ripper Level
|
||||||
//
|
//
|
||||||
lib_riplevel_spin=new QSpinBox(this);
|
lib_riplevel_spin=new QSpinBox(this);
|
||||||
lib_riplevel_spin->setGeometry(160,232,40,19);
|
lib_riplevel_spin->setGeometry(160,254,40,19);
|
||||||
lib_riplevel_spin->setMinValue(-99);
|
lib_riplevel_spin->setMinValue(-99);
|
||||||
lib_riplevel_spin->setMaxValue(0);
|
lib_riplevel_spin->setMaxValue(0);
|
||||||
QLabel *lib_riplevel_spin_label=
|
QLabel *lib_riplevel_spin_label=
|
||||||
new QLabel(lib_riplevel_spin,tr("Ripper Level:"),this);
|
new QLabel(lib_riplevel_spin,tr("Ripper Level:"),this);
|
||||||
lib_riplevel_spin_label->setGeometry(25,232,130,19);
|
lib_riplevel_spin_label->setGeometry(25,254,130,19);
|
||||||
lib_riplevel_spin_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
lib_riplevel_spin_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
||||||
QLabel *lib_riplevel_spin_unit=new QLabel(tr("dbFS"),this);
|
QLabel *lib_riplevel_spin_unit=new QLabel(tr("dbFS"),this);
|
||||||
lib_riplevel_spin_unit->setGeometry(205,232,120,19);
|
lib_riplevel_spin_unit->setGeometry(205,254,120,19);
|
||||||
lib_riplevel_spin_unit->setAlignment(AlignLeft|AlignVCenter|ShowPrefix);
|
lib_riplevel_spin_unit->setAlignment(AlignLeft|AlignVCenter|ShowPrefix);
|
||||||
|
|
||||||
//
|
//
|
||||||
// FreeDB Server
|
// FreeDB Server
|
||||||
//
|
//
|
||||||
lib_cddb_edit=new QLineEdit(this);
|
lib_cddb_edit=new QLineEdit(this);
|
||||||
lib_cddb_edit->setGeometry(160,256,160,19);
|
lib_cddb_edit->setGeometry(160,278,160,19);
|
||||||
lib_cddb_edit->setValidator(validator);
|
lib_cddb_edit->setValidator(validator);
|
||||||
QLabel *lib_cddb_label=new QLabel(lib_cddb_edit,tr("&FreeDB Server:"),this);
|
QLabel *lib_cddb_label=new QLabel(lib_cddb_edit,tr("&FreeDB Server:"),this);
|
||||||
lib_cddb_label->setGeometry(25,256,130,19);
|
lib_cddb_label->setGeometry(25,278,130,19);
|
||||||
lib_cddb_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
lib_cddb_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Format
|
// Format
|
||||||
//
|
//
|
||||||
lib_format_box=new QComboBox(this);
|
lib_format_box=new QComboBox(this);
|
||||||
lib_format_box->setGeometry(160,280,150,19);
|
lib_format_box->setGeometry(160,302,150,19);
|
||||||
connect(lib_format_box,SIGNAL(activated(int)),this,SLOT(formatData(int)));
|
connect(lib_format_box,SIGNAL(activated(int)),this,SLOT(formatData(int)));
|
||||||
QLabel *lib_format_label=new QLabel(lib_format_box,tr("&Format:"),this);
|
QLabel *lib_format_label=new QLabel(lib_format_box,tr("&Format:"),this);
|
||||||
lib_format_label->setGeometry(25,280,130,19);
|
|
||||||
|
lib_format_label->setGeometry(25,302,130,19);
|
||||||
lib_format_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
lib_format_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Bitrate
|
// Bitrate
|
||||||
//
|
//
|
||||||
lib_bitrate_box=new QComboBox(this);
|
lib_bitrate_box=new QComboBox(this);
|
||||||
lib_bitrate_box->setGeometry(160,304,130,19);
|
lib_bitrate_box->setGeometry(160,326,130,19);
|
||||||
QLabel *lib_bitrate_label=new QLabel(lib_bitrate_box,tr("&Bitrate:"),this);
|
QLabel *lib_bitrate_label=new QLabel(lib_bitrate_box,tr("&Bitrate:"),this);
|
||||||
lib_bitrate_label->setGeometry(25,304,130,19);
|
lib_bitrate_label->setGeometry(25,326,130,19);
|
||||||
lib_bitrate_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
lib_bitrate_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Enable Editor
|
// Enable Editor
|
||||||
//
|
//
|
||||||
lib_editor_box=new QComboBox(this);
|
lib_editor_box=new QComboBox(this);
|
||||||
lib_editor_box->setGeometry(160,328,60,19);
|
lib_editor_box->setGeometry(160,350,60,19);
|
||||||
lib_editor_box->insertItem(tr("No"));
|
lib_editor_box->insertItem(tr("No"));
|
||||||
lib_editor_box->insertItem(tr("Yes"));
|
lib_editor_box->insertItem(tr("Yes"));
|
||||||
QLabel *lib_editor_label=
|
QLabel *lib_editor_label=
|
||||||
new QLabel(lib_editor_box,tr("Allow E&xternal Editing:"),this);
|
new QLabel(lib_editor_box,tr("Allow E&xternal Editing:"),this);
|
||||||
lib_editor_label->setGeometry(25,328,130,19);
|
lib_editor_label->setGeometry(25,350,130,19);
|
||||||
lib_editor_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
lib_editor_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Sample Rate Converter
|
// Sample Rate Converter
|
||||||
//
|
//
|
||||||
lib_converter_box=new QComboBox(this);
|
lib_converter_box=new QComboBox(this);
|
||||||
lib_converter_box->setGeometry(160,352,sizeHint().width()-170,19);
|
lib_converter_box->setGeometry(160,374,sizeHint().width()-170,19);
|
||||||
int conv=0;
|
int conv=0;
|
||||||
while(src_get_name(conv)!=NULL) {
|
while(src_get_name(conv)!=NULL) {
|
||||||
lib_converter_box->insertItem(src_get_name(conv++));
|
lib_converter_box->insertItem(src_get_name(conv++));
|
||||||
}
|
}
|
||||||
QLabel *lib_converter_label=
|
QLabel *lib_converter_label=
|
||||||
new QLabel(lib_converter_box,tr("Sample Rate Converter:"),this);
|
new QLabel(lib_converter_box,tr("Sample Rate Converter:"),this);
|
||||||
lib_converter_label->setGeometry(10,352,145,19);
|
lib_converter_label->setGeometry(10,374,145,19);
|
||||||
lib_converter_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
lib_converter_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Limit Searches at Startup
|
// Limit Searches at Startup
|
||||||
//
|
//
|
||||||
lib_limit_search_box=new QComboBox(this);
|
lib_limit_search_box=new QComboBox(this);
|
||||||
lib_limit_search_box->setGeometry(160,376,80,19);
|
lib_limit_search_box->setGeometry(160,398,80,19);
|
||||||
lib_limit_search_box->insertItem(tr("No"));
|
lib_limit_search_box->insertItem(tr("No"));
|
||||||
lib_limit_search_box->insertItem(tr("Yes"));
|
lib_limit_search_box->insertItem(tr("Yes"));
|
||||||
lib_limit_search_box->insertItem(tr("Previous"));
|
lib_limit_search_box->insertItem(tr("Previous"));
|
||||||
QLabel *lib_limit_search_label=
|
QLabel *lib_limit_search_label=
|
||||||
new QLabel(lib_limit_search_box,tr("Limit Searches at Startup")+":",this);
|
new QLabel(lib_limit_search_box,tr("Limit Searches at Startup")+":",this);
|
||||||
lib_limit_search_label->setGeometry(10,376,145,19);
|
lib_limit_search_label->setGeometry(10,398,145,19);
|
||||||
lib_limit_search_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
lib_limit_search_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Defaults
|
// Defaults
|
||||||
//
|
//
|
||||||
QLabel *default_label=new QLabel(tr("Defaults"),this);
|
QLabel *default_label=new QLabel(tr("Defaults"),this);
|
||||||
default_label->setGeometry(25,415,120,19);
|
default_label->setGeometry(25,437,120,19);
|
||||||
default_label->setFont(big_font);
|
default_label->setFont(big_font);
|
||||||
default_label->setAlignment(AlignRight|ShowPrefix);
|
default_label->setAlignment(AlignRight|ShowPrefix);
|
||||||
|
|
||||||
@ -270,28 +281,28 @@ EditRDLibrary::EditRDLibrary(RDStation *station,RDStation *cae_station,
|
|||||||
// Default Channels
|
// Default Channels
|
||||||
//
|
//
|
||||||
lib_channels_box=new QComboBox(this);
|
lib_channels_box=new QComboBox(this);
|
||||||
lib_channels_box->setGeometry(160,434,60,19);
|
lib_channels_box->setGeometry(160,456,60,19);
|
||||||
QLabel *lib_channels_label=new QLabel(lib_channels_box,tr("&Channels:"),this);
|
QLabel *lib_channels_label=new QLabel(lib_channels_box,tr("&Channels:"),this);
|
||||||
lib_channels_label->setGeometry(25,434,130,19);
|
lib_channels_label->setGeometry(25,456,130,19);
|
||||||
lib_channels_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
lib_channels_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Default Record Mode
|
// Default Record Mode
|
||||||
//
|
//
|
||||||
lib_recmode_box=new QComboBox(this);
|
lib_recmode_box=new QComboBox(this);
|
||||||
lib_recmode_box->setGeometry(160,456,100,19);
|
lib_recmode_box->setGeometry(160,478,100,19);
|
||||||
QLabel *lib_recmode_label=new QLabel(lib_recmode_box,tr("Record Mode:"),this);
|
QLabel *lib_recmode_label=new QLabel(lib_recmode_box,tr("Record Mode:"),this);
|
||||||
lib_recmode_label->setGeometry(25,456,130,19);
|
lib_recmode_label->setGeometry(25,478,130,19);
|
||||||
lib_recmode_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
lib_recmode_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Default Trim State
|
// Default Trim State
|
||||||
//
|
//
|
||||||
lib_trimstate_box=new QComboBox(this);
|
lib_trimstate_box=new QComboBox(this);
|
||||||
lib_trimstate_box->setGeometry(160,480,100,19);
|
lib_trimstate_box->setGeometry(160,502,100,19);
|
||||||
QLabel *lib_trimstate_label=
|
QLabel *lib_trimstate_label=
|
||||||
new QLabel(lib_trimstate_box,tr("AutoTrim:"),this);
|
new QLabel(lib_trimstate_box,tr("AutoTrim:"),this);
|
||||||
lib_trimstate_label->setGeometry(25,480,130,19);
|
lib_trimstate_label->setGeometry(25,502,130,19);
|
||||||
lib_trimstate_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
lib_trimstate_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -344,6 +355,9 @@ EditRDLibrary::EditRDLibrary(RDStation *station,RDStation *cae_station,
|
|||||||
lib_paranoia_box->insertItem(tr("Low"));
|
lib_paranoia_box->insertItem(tr("Low"));
|
||||||
lib_paranoia_box->insertItem(tr("None"));
|
lib_paranoia_box->insertItem(tr("None"));
|
||||||
lib_paranoia_box->setCurrentItem(lib_lib->paranoiaLevel());
|
lib_paranoia_box->setCurrentItem(lib_lib->paranoiaLevel());
|
||||||
|
lib_isrc_box->insertItem(tr("No"));
|
||||||
|
lib_isrc_box->insertItem(tr("Yes"));
|
||||||
|
lib_isrc_box->setCurrentItem(lib_lib->readIsrc());
|
||||||
lib_riplevel_spin->setValue(lib_lib->ripperLevel()/100);
|
lib_riplevel_spin->setValue(lib_lib->ripperLevel()/100);
|
||||||
lib_channels_box->insertItem("1");
|
lib_channels_box->insertItem("1");
|
||||||
lib_channels_box->insertItem("2");
|
lib_channels_box->insertItem("2");
|
||||||
@ -406,7 +420,7 @@ EditRDLibrary::~EditRDLibrary()
|
|||||||
|
|
||||||
QSize EditRDLibrary::sizeHint() const
|
QSize EditRDLibrary::sizeHint() const
|
||||||
{
|
{
|
||||||
return QSize(375,584);
|
return QSize(375,606);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -436,6 +450,7 @@ void EditRDLibrary::okData()
|
|||||||
lib_lib->setTailPreroll(lib_preroll_spin->value());
|
lib_lib->setTailPreroll(lib_preroll_spin->value());
|
||||||
lib_lib->setRipperDevice(lib_ripdev_edit->text());
|
lib_lib->setRipperDevice(lib_ripdev_edit->text());
|
||||||
lib_lib->setParanoiaLevel(lib_paranoia_box->currentItem());
|
lib_lib->setParanoiaLevel(lib_paranoia_box->currentItem());
|
||||||
|
lib_lib->setReadIsrc(lib_isrc_box->currentItem());
|
||||||
lib_lib->setRipperLevel(lib_riplevel_spin->value()*100);
|
lib_lib->setRipperLevel(lib_riplevel_spin->value()*100);
|
||||||
switch(lib_format_box->currentItem()) {
|
switch(lib_format_box->currentItem()) {
|
||||||
case 0: // PCM16
|
case 0: // PCM16
|
||||||
|
@ -63,6 +63,7 @@ class EditRDLibrary : public QDialog
|
|||||||
QTimeEdit *lib_maxlength_time;
|
QTimeEdit *lib_maxlength_time;
|
||||||
QLineEdit *lib_ripdev_edit;
|
QLineEdit *lib_ripdev_edit;
|
||||||
QComboBox *lib_paranoia_box;
|
QComboBox *lib_paranoia_box;
|
||||||
|
QComboBox *lib_isrc_box;
|
||||||
QSpinBox *lib_riplevel_spin;
|
QSpinBox *lib_riplevel_spin;
|
||||||
QLineEdit *lib_cddb_edit;
|
QLineEdit *lib_cddb_edit;
|
||||||
QComboBox *lib_editor_box;
|
QComboBox *lib_editor_box;
|
||||||
|
@ -267,7 +267,7 @@ ListEndpoints::ListEndpoints(RDMatrix *matrix,RDMatrix::Endpoint endpoint,
|
|||||||
q->first();
|
q->first();
|
||||||
for(int i=0;i<list_size;i++) {
|
for(int i=0;i<list_size;i++) {
|
||||||
l=new QListViewItem(list_list_view);
|
l=new QListViewItem(list_list_view);
|
||||||
l->setText(0,QString().sprintf("%03d",i+1));
|
l->setText(0,QString().sprintf("%04d",i+1));
|
||||||
if(q->isValid()&&(q->value(0).toInt()==(i+1))){
|
if(q->isValid()&&(q->value(0).toInt()==(i+1))){
|
||||||
l->setText(1,q->value(1).toString());
|
l->setText(1,q->value(1).toString());
|
||||||
switch(list_matrix->type()) {
|
switch(list_matrix->type()) {
|
||||||
@ -539,7 +539,7 @@ void ListEndpoints::okData()
|
|||||||
modecol=4;
|
modecol=4;
|
||||||
}
|
}
|
||||||
for(int i=0;i<list_size;i++) {
|
for(int i=0;i<list_size;i++) {
|
||||||
item=list_list_view->findItem(QString().sprintf("%03d",i+1),0);
|
item=list_list_view->findItem(QString().sprintf("%04d",i+1),0);
|
||||||
if(item->text(modecol).lower()==QString(tr("stereo"))) {
|
if(item->text(modecol).lower()==QString(tr("stereo"))) {
|
||||||
mode=RDMatrix::Stereo;
|
mode=RDMatrix::Stereo;
|
||||||
}
|
}
|
||||||
|
@ -2822,6 +2822,10 @@ nastaveném pro běh služby CAE pro naplnění databáze se zdroji zvuku.</tran
|
|||||||
<source>PCM24</source>
|
<source>PCM24</source>
|
||||||
<translation type="unfinished">PCM24</translation>
|
<translation type="unfinished">PCM24</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Read ISRCs from CD:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>EditRDLogedit</name>
|
<name>EditRDLogedit</name>
|
||||||
@ -5914,5 +5918,10 @@ pro naplnění databáze zdroji zvuku.</translation>
|
|||||||
<source>&Close</source>
|
<source>&Close</source>
|
||||||
<translation>&Zavřít</translation>
|
<translation>&Zavřít</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> MP-4/AAC
|
||||||
|
</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
</TS>
|
</TS>
|
||||||
|
@ -2793,6 +2793,10 @@ configured to run the CAE service in order to populate the audio resources datab
|
|||||||
<source>PCM24</source>
|
<source>PCM24</source>
|
||||||
<translation type="unfinished">PCM24</translation>
|
<translation type="unfinished">PCM24</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Read ISRCs from CD:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>EditRDLogedit</name>
|
<name>EditRDLogedit</name>
|
||||||
@ -5864,5 +5868,10 @@ eingeben um die Audioressourcendatenbank zu füllen.</translation>
|
|||||||
<source>&Close</source>
|
<source>&Close</source>
|
||||||
<translation>&Schliessen</translation>
|
<translation>&Schliessen</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> MP-4/AAC
|
||||||
|
</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
</TS>
|
</TS>
|
||||||
|
@ -2802,6 +2802,10 @@ equipo configurado para ejecutar CAE para obtener la información de audio.</tra
|
|||||||
<source>PCM24</source>
|
<source>PCM24</source>
|
||||||
<translation type="unfinished">PCM24</translation>
|
<translation type="unfinished">PCM24</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Read ISRCs from CD:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>EditRDLogedit</name>
|
<name>EditRDLogedit</name>
|
||||||
@ -5866,5 +5870,10 @@ Revise los parámetros e intente de nuevo.</translation>
|
|||||||
<source>&Close</source>
|
<source>&Close</source>
|
||||||
<translation>&Cerrar</translation>
|
<translation>&Cerrar</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> MP-4/AAC
|
||||||
|
</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
</TS>
|
</TS>
|
||||||
|
@ -2501,6 +2501,10 @@ configured to run the CAE service in order to populate the audio resources datab
|
|||||||
<source>PCM24</source>
|
<source>PCM24</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Read ISRCs from CD:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>EditRDLogedit</name>
|
<name>EditRDLogedit</name>
|
||||||
@ -5360,5 +5364,10 @@ please check your settings and try again.</source>
|
|||||||
<source>&Close</source>
|
<source>&Close</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> MP-4/AAC
|
||||||
|
</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
</TS>
|
</TS>
|
||||||
|
@ -2789,6 +2789,10 @@ configured to run the CAE service in order to populate the audio resources datab
|
|||||||
<source>PCM24</source>
|
<source>PCM24</source>
|
||||||
<translation type="unfinished">PCM24</translation>
|
<translation type="unfinished">PCM24</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Read ISRCs from CD:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>EditRDLogedit</name>
|
<name>EditRDLogedit</name>
|
||||||
@ -5851,5 +5855,10 @@ Sjekk oppsettet ditt og prøv att.</translation>
|
|||||||
<source>&Close</source>
|
<source>&Close</source>
|
||||||
<translation>&Lukk</translation>
|
<translation>&Lukk</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> MP-4/AAC
|
||||||
|
</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
</TS>
|
</TS>
|
||||||
|
@ -2789,6 +2789,10 @@ configured to run the CAE service in order to populate the audio resources datab
|
|||||||
<source>PCM24</source>
|
<source>PCM24</source>
|
||||||
<translation type="unfinished">PCM24</translation>
|
<translation type="unfinished">PCM24</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Read ISRCs from CD:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>EditRDLogedit</name>
|
<name>EditRDLogedit</name>
|
||||||
@ -5851,5 +5855,10 @@ Sjekk oppsettet ditt og prøv att.</translation>
|
|||||||
<source>&Close</source>
|
<source>&Close</source>
|
||||||
<translation>&Lukk</translation>
|
<translation>&Lukk</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> MP-4/AAC
|
||||||
|
</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
</TS>
|
</TS>
|
||||||
|
@ -2781,6 +2781,10 @@ configured to run the CAE service in order to populate the audio resources datab
|
|||||||
<source>PCM24</source>
|
<source>PCM24</source>
|
||||||
<translation type="unfinished">PCM24</translation>
|
<translation type="unfinished">PCM24</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Read ISRCs from CD:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>EditRDLogedit</name>
|
<name>EditRDLogedit</name>
|
||||||
@ -5844,5 +5848,10 @@ por favor, cheque suas configurações e tente novamente</translation>
|
|||||||
<source>&Close</source>
|
<source>&Close</source>
|
||||||
<translation>&Fechar</translation>
|
<translation>&Fechar</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> MP-4/AAC
|
||||||
|
</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
</TS>
|
</TS>
|
||||||
|
@ -98,6 +98,9 @@ ViewAdapters::ViewAdapters(RDStation *rdstation,
|
|||||||
text+=tr(" MPEG Layer 2\n");
|
text+=tr(" MPEG Layer 2\n");
|
||||||
text+=tr(" MPEG Layer 3\n");
|
text+=tr(" MPEG Layer 3\n");
|
||||||
}
|
}
|
||||||
|
if(rdstation->haveCapability(RDStation::HaveMp4Decode)) {
|
||||||
|
text+=tr(" MP-4/AAC\n");
|
||||||
|
}
|
||||||
if(rdstation->haveCapability(RDStation::HaveOgg123)) {
|
if(rdstation->haveCapability(RDStation::HaveOgg123)) {
|
||||||
text+=tr(" OggVorbis\n");
|
text+=tr(" OggVorbis\n");
|
||||||
}
|
}
|
||||||
|
1
rdairplay/.gitignore
vendored
1
rdairplay/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdairplay
|
|
@ -1460,9 +1460,9 @@ void LogPlay::graceTimerData()
|
|||||||
|
|
||||||
void LogPlay::playStateChangedData(int id,RDPlayDeck::State state)
|
void LogPlay::playStateChangedData(int id,RDPlayDeck::State state)
|
||||||
{
|
{
|
||||||
//#ifdef SHOW_SLOTS
|
#ifdef SHOW_SLOTS
|
||||||
printf("playStateChangedData(%d,%d), log: %s\n",id,state,(const char *)logName());
|
printf("playStateChangedData(%d,%d), log: %s\n",id,state,(const char *)logName());
|
||||||
//#endif
|
#endif
|
||||||
switch(state) {
|
switch(state) {
|
||||||
case RDPlayDeck::Playing:
|
case RDPlayDeck::Playing:
|
||||||
Playing(id);
|
Playing(id);
|
||||||
@ -1857,11 +1857,11 @@ bool LogPlay::StartEvent(int line,RDLogLine::TransType trans_type,
|
|||||||
rdevent_player->
|
rdevent_player->
|
||||||
exec(logline->resolveWildcards(play_start_rml[aport]));
|
exec(logline->resolveWildcards(play_start_rml[aport]));
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
printf("channelStarted(%d,%d,%d,%d)\n",
|
printf("channelStarted(%d,%d,%d,%d)\n",
|
||||||
play_id,playdeck->channel(),
|
play_id,playdeck->channel(),
|
||||||
playdeck->card(),playdeck->port());
|
playdeck->card(),playdeck->port());
|
||||||
|
*/
|
||||||
emit channelStarted(play_id,playdeck->channel(),
|
emit channelStarted(play_id,playdeck->channel(),
|
||||||
playdeck->card(),playdeck->port());
|
playdeck->card(),playdeck->port());
|
||||||
LogLine(RDConfig::LogInfo,QString().sprintf(
|
LogLine(RDConfig::LogInfo,QString().sprintf(
|
||||||
@ -2772,12 +2772,12 @@ void LogPlay::ClearChannel(int deckid)
|
|||||||
|
|
||||||
if(play_deck[deckid]->channel()>=0) {
|
if(play_deck[deckid]->channel()>=0) {
|
||||||
rdevent_player->exec(play_stop_rml[play_deck[deckid]->channel()]);
|
rdevent_player->exec(play_stop_rml[play_deck[deckid]->channel()]);
|
||||||
|
/*
|
||||||
printf("Deck: %d channelStopped(%d,%d,%d,%d\n",deckid,
|
printf("Deck: %d channelStopped(%d,%d,%d,%d\n",deckid,
|
||||||
play_id,play_deck[deckid]->channel(),
|
play_id,play_deck[deckid]->channel(),
|
||||||
play_deck[deckid]->card(),
|
play_deck[deckid]->card(),
|
||||||
play_deck[deckid]->port());
|
play_deck[deckid]->port());
|
||||||
|
*/
|
||||||
emit channelStopped(play_id,play_deck[deckid]->channel(),
|
emit channelStopped(play_id,play_deck[deckid]->channel(),
|
||||||
play_deck[deckid]->card(),
|
play_deck[deckid]->card(),
|
||||||
play_deck[deckid]->port());
|
play_deck[deckid]->port());
|
||||||
|
1
rdcartslots/.gitignore
vendored
1
rdcartslots/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdcartslots
|
|
1
rdcastmanager/.gitignore
vendored
1
rdcastmanager/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdcastmanager
|
|
1
rdcatch/.gitignore
vendored
1
rdcatch/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdcatch
|
|
@ -481,7 +481,8 @@ void EditDownload::urlChangedData(const QString &str)
|
|||||||
{
|
{
|
||||||
QUrl url(str);
|
QUrl url(str);
|
||||||
QString protocol=url.protocol();
|
QString protocol=url.protocol();
|
||||||
if((protocol=="ftp")||(protocol=="http")||(protocol=="file")) {
|
if((protocol=="ftp")||(protocol=="http")||(protocol=="file")||
|
||||||
|
(protocol=="scp")||(protocol=="sftp")) {
|
||||||
edit_username_label->setEnabled(true);
|
edit_username_label->setEnabled(true);
|
||||||
edit_username_edit->setEnabled(true);
|
edit_username_edit->setEnabled(true);
|
||||||
edit_password_label->setEnabled(true);
|
edit_password_label->setEnabled(true);
|
||||||
@ -556,7 +557,7 @@ void EditDownload::okData()
|
|||||||
RDUrl url(edit_url_edit->text());
|
RDUrl url(edit_url_edit->text());
|
||||||
QString protocol=url.protocol();
|
QString protocol=url.protocol();
|
||||||
if((protocol!="ftp")&&(protocol!="http")&&(protocol!="https")&&
|
if((protocol!="ftp")&&(protocol!="http")&&(protocol!="https")&&
|
||||||
(protocol!="file")) {
|
(protocol!="file")&&(protocol!="scp")&&(protocol!="sftp")) {
|
||||||
QMessageBox::warning(this,
|
QMessageBox::warning(this,
|
||||||
tr("Invalid URL"),tr("Unsupported URL protocol!"));
|
tr("Invalid URL"),tr("Unsupported URL protocol!"));
|
||||||
return;
|
return;
|
||||||
|
@ -493,7 +493,8 @@ void EditUpload::urlChangedData(const QString &str)
|
|||||||
{
|
{
|
||||||
QUrl url(str);
|
QUrl url(str);
|
||||||
QString protocol=url.protocol().lower();
|
QString protocol=url.protocol().lower();
|
||||||
if((protocol=="ftp")||(protocol=="file")) {
|
if((protocol=="ftp")||(protocol=="file")||
|
||||||
|
(protocol=="scp")||(protocol=="sftp")) {
|
||||||
edit_username_label->setEnabled(true);
|
edit_username_label->setEnabled(true);
|
||||||
edit_username_edit->setEnabled(true);
|
edit_username_edit->setEnabled(true);
|
||||||
edit_password_label->setEnabled(true);
|
edit_password_label->setEnabled(true);
|
||||||
@ -575,7 +576,8 @@ void EditUpload::okData()
|
|||||||
}
|
}
|
||||||
RDUrl url(edit_url_edit->text());
|
RDUrl url(edit_url_edit->text());
|
||||||
QString protocol=url.protocol();
|
QString protocol=url.protocol();
|
||||||
if((protocol!="ftp")&&(protocol!="file")) {
|
if((protocol!="ftp")&&(protocol!="file")&&
|
||||||
|
(protocol!="scp")&&(protocol!="sftp")) {
|
||||||
QMessageBox::warning(this,
|
QMessageBox::warning(this,
|
||||||
tr("Invalid URL"),tr("Unsupported URL protocol!"));
|
tr("Invalid URL"),tr("Unsupported URL protocol!"));
|
||||||
return;
|
return;
|
||||||
|
1
rdcatchd/.gitignore
vendored
1
rdcatchd/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdcatchd
|
|
1
rdlibrary/.gitignore
vendored
1
rdlibrary/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdlibrary
|
|
@ -461,7 +461,9 @@ void CdRipper::ripTrackButtonData()
|
|||||||
// Read ISRCs
|
// Read ISRCs
|
||||||
//
|
//
|
||||||
if(!rip_isrc_read) {
|
if(!rip_isrc_read) {
|
||||||
rip_cddb_lookup->readIsrc(rip_cdda_dir.path(),rip_conf->ripperDevice());
|
if(rdlibrary_conf->readIsrc()) {
|
||||||
|
rip_cddb_lookup->readIsrc(rip_cdda_dir.path(),rip_conf->ripperDevice());
|
||||||
|
}
|
||||||
rip_isrc_read=true;
|
rip_isrc_read=true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -433,8 +433,10 @@ void DiskRipper::ripDiskButtonData()
|
|||||||
// Read ISRCs
|
// Read ISRCs
|
||||||
//
|
//
|
||||||
if(!rip_isrc_read) {
|
if(!rip_isrc_read) {
|
||||||
rip_cddb_lookup->
|
if(rdlibrary_conf->readIsrc()) {
|
||||||
readIsrc(rip_cdda_dir.path(),rdlibrary_conf->ripperDevice());
|
rip_cddb_lookup->
|
||||||
|
readIsrc(rip_cdda_dir.path(),rdlibrary_conf->ripperDevice());
|
||||||
|
}
|
||||||
rip_isrc_read=true;
|
rip_isrc_read=true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -792,7 +794,7 @@ void DiskRipper::mediaChangedData()
|
|||||||
rip_cutnames.push_back(QString());
|
rip_cutnames.push_back(QString());
|
||||||
rip_end_track.push_back(-1);
|
rip_end_track.push_back(-1);
|
||||||
rip_wave_datas.push_back(new RDWaveData());
|
rip_wave_datas.push_back(new RDWaveData());
|
||||||
rip_wave_datas.back()->setTitle(tr("Track")+QString().sprintf(" %d",i+1));
|
rip_wave_datas.back()->setTitle(tr("Track")+QString().sprintf(" %d",rip_cdrom->tracks()-i+1));
|
||||||
l=new RDListViewItem(rip_track_list);
|
l=new RDListViewItem(rip_track_list);
|
||||||
l->setText(0,QString().sprintf("%d",i));
|
l->setText(0,QString().sprintf("%d",i));
|
||||||
if(rip_cdrom->isAudio(i)) {
|
if(rip_cdrom->isAudio(i)) {
|
||||||
@ -1131,11 +1133,19 @@ QString DiskRipper::BuildTrackName(int start_track,int end_track) const
|
|||||||
while(item!=NULL) {
|
while(item!=NULL) {
|
||||||
if(item->text(0).toInt()==start_track) {
|
if(item->text(0).toInt()==start_track) {
|
||||||
ret=item->text(2);
|
ret=item->text(2);
|
||||||
|
if(ret.isEmpty()) {
|
||||||
|
ret=tr("Track")+" "+item->text(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if((item->text(0).toInt()>start_track)&&
|
if((item->text(0).toInt()>start_track)&&
|
||||||
(item->text(0).toInt()<=end_track)) {
|
(item->text(0).toInt()<=end_track)) {
|
||||||
ret+=" / "+item->text(2);
|
if(item->text(2).isEmpty()) {
|
||||||
|
ret+=" / "+tr("Track")+" "+item->text(0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret+=" / "+item->text(2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
item=(RDListViewItem *)item->nextSibling();
|
item=(RDListViewItem *)item->nextSibling();
|
||||||
|
@ -690,7 +690,7 @@ void ListReports::GenerateCartDumpCsv(QString *report,bool prepend_names)
|
|||||||
RDSqlQuery *q;
|
RDSqlQuery *q;
|
||||||
QString schedcode="";
|
QString schedcode="";
|
||||||
QStringList f0;
|
QStringList f0;
|
||||||
unsigned code_quan=0;
|
int code_quan=0;
|
||||||
|
|
||||||
if(list_schedcode!=tr("ALL")) {
|
if(list_schedcode!=tr("ALL")) {
|
||||||
schedcode=list_schedcode;
|
schedcode=list_schedcode;
|
||||||
@ -702,20 +702,27 @@ void ListReports::GenerateCartDumpCsv(QString *report,bool prepend_names)
|
|||||||
if(list_type_filter.isEmpty()) {
|
if(list_type_filter.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sql=QString("select CUTS.CUT_NAME,CART.GROUP_NAME,CART.TITLE,CART.ARTIST,")+
|
sql=QString("select CART.NUMBER,CART.TYPE,CUTS.CUT_NAME,CART.GROUP_NAME,CART.TITLE,CART.ARTIST,")+
|
||||||
"CART.ALBUM,CART.YEAR,CUTS.ISRC,CUTS.ISCI,CART.LABEL,CART.CLIENT,"+
|
"CART.ALBUM,CART.YEAR,CUTS.ISRC,CUTS.ISCI,CART.LABEL,CART.CLIENT,"+
|
||||||
"CART.AGENCY,CART.PUBLISHER,CART.COMPOSER,CART.CONDUCTOR,CART.SONG_ID,"+
|
"CART.AGENCY,CART.PUBLISHER,CART.COMPOSER,CART.CONDUCTOR,CART.SONG_ID,"+
|
||||||
"CART.USER_DEFINED,CUTS.LENGTH,SCHED_CODES from CART "+
|
"CART.USER_DEFINED,CUTS.DESCRIPTION,CUTS.OUTCUE,"+
|
||||||
"join CUTS on CART.NUMBER=CUTS.CART_NUMBER";
|
"CUTS.LENGTH,"+
|
||||||
|
"CUTS.START_POINT,CUTS.END_POINT,"+
|
||||||
|
"CUTS.SEGUE_START_POINT,CUTS.SEGUE_END_POINT,"+
|
||||||
|
"CUTS.HOOK_START_POINT,CUTS.HOOK_END_POINT,"+
|
||||||
|
"CUTS.TALK_START_POINT,CUTS.TALK_END_POINT,"+
|
||||||
|
"CUTS.FADEUP_POINT,CUTS.FADEDOWN_POINT,"+
|
||||||
|
"SCHED_CODES from CART "+
|
||||||
|
"left join CUTS on CART.NUMBER=CUTS.CART_NUMBER";
|
||||||
if(list_group==QString("ALL")) {
|
if(list_group==QString("ALL")) {
|
||||||
sql+=QString(" where ")+
|
sql+=QString(" where ")+
|
||||||
RDAllCartSearchText(list_filter,schedcode,lib_user->name(),true)+" && "+
|
RDAllCartSearchText(list_filter,schedcode,lib_user->name(),true)+" && "+
|
||||||
list_type_filter+" order by CUTS.CUT_NAME";
|
list_type_filter+" order by CART.NUMBER,CUTS.CUT_NAME";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sql+=QString(" where ")+
|
sql+=QString(" where ")+
|
||||||
RDCartSearchText(list_filter,list_group,schedcode,true)+" && "+
|
RDCartSearchText(list_filter,list_group,schedcode,true)+" && "+
|
||||||
list_type_filter+" order by CUTS.CUT_NAME";
|
list_type_filter+" order by CART.NUMBER,CUTS.CUT_NAME";
|
||||||
}
|
}
|
||||||
q=new RDSqlQuery(sql);
|
q=new RDSqlQuery(sql);
|
||||||
|
|
||||||
@ -724,7 +731,7 @@ void ListReports::GenerateCartDumpCsv(QString *report,bool prepend_names)
|
|||||||
//
|
//
|
||||||
while(q->next()) {
|
while(q->next()) {
|
||||||
f0=f0.split(" ",q->value(17).toString());
|
f0=f0.split(" ",q->value(17).toString());
|
||||||
if(f0.size()>code_quan) {
|
if((int)f0.size()>code_quan) {
|
||||||
code_quan=f0.size();
|
code_quan=f0.size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -734,10 +741,16 @@ void ListReports::GenerateCartDumpCsv(QString *report,bool prepend_names)
|
|||||||
// Prepend Field Names
|
// Prepend Field Names
|
||||||
//
|
//
|
||||||
if(prepend_names) {
|
if(prepend_names) {
|
||||||
*report="CART,CUT,GROUP_NAME,TITLE,ARTIST,ALBUM,YEAR,ISRC,ISCI,LABEL,";
|
*report="CART,CUT,TYPE,GROUP_NAME,TITLE,ARTIST,ALBUM,YEAR,ISRC,ISCI,LABEL,";
|
||||||
*report+="CLIENT,AGENCY,PUBLISHER,COMPOSER,CONDUCTOR,SONG_ID,USER_DEFINED,";
|
*report+="CLIENT,AGENCY,PUBLISHER,COMPOSER,CONDUCTOR,SONG_ID,USER_DEFINED,";
|
||||||
*report+="LENGTH,";
|
*report+="DESCRIPTION,OUTCUE,";
|
||||||
for(unsigned i=0;i<code_quan;i++) {
|
*report+="FILENAME,LENGTH,";
|
||||||
|
*report+="START_POINT,END_POINT,";
|
||||||
|
*report+="SEGUE_START_POINT,SEGUE_END_POINT,";
|
||||||
|
*report+="HOOK_START_POINT,HOOK_END_POINT,";
|
||||||
|
*report+="TALK_START_POINT,TALK_END_POINT,";
|
||||||
|
*report+="FADEUP_POINT,FADEDOWN_POINT,";
|
||||||
|
for(int i=0;i<code_quan;i++) {
|
||||||
*report+=QString().sprintf("SCHED_CODE%u,",i+1);
|
*report+=QString().sprintf("SCHED_CODE%u,",i+1);
|
||||||
}
|
}
|
||||||
*report=report->left(report->length()-1);
|
*report=report->left(report->length()-1);
|
||||||
@ -749,15 +762,20 @@ void ListReports::GenerateCartDumpCsv(QString *report,bool prepend_names)
|
|||||||
//
|
//
|
||||||
q->seek(-1);
|
q->seek(-1);
|
||||||
while(q->next()) {
|
while(q->next()) {
|
||||||
*report+=QString().sprintf("%u,",RDCut::cartNumber(q->value(0).toString()));
|
RDCart::Type type=(RDCart::Type)q->value(1).toInt();
|
||||||
*report+=QString().sprintf("%u,",RDCut::cutNumber(q->value(0).toString()));
|
*report+=QString().sprintf("%u,",q->value(0).toUInt());
|
||||||
*report+="\""+q->value(1).toString()+"\",";
|
if(type==RDCart::Macro) {
|
||||||
*report+="\""+q->value(2).toString()+"\",";
|
*report+="0,\"macro\",";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*report+=QString().sprintf("%u,",RDCut::cutNumber(q->value(2).toString()));
|
||||||
|
*report+="\"audio\",";
|
||||||
|
}
|
||||||
*report+="\""+q->value(3).toString()+"\",";
|
*report+="\""+q->value(3).toString()+"\",";
|
||||||
*report+="\""+q->value(4).toString()+"\",";
|
*report+="\""+q->value(4).toString()+"\",";
|
||||||
*report+="\""+q->value(5).toDate().toString("yyyy")+"\",";
|
*report+="\""+q->value(5).toString()+"\",";
|
||||||
*report+="\""+q->value(6).toString()+"\",";
|
*report+="\""+q->value(6).toString()+"\",";
|
||||||
*report+="\""+q->value(7).toString()+"\",";
|
*report+="\""+q->value(7).toDate().toString("yyyy")+"\",";
|
||||||
*report+="\""+q->value(8).toString()+"\",";
|
*report+="\""+q->value(8).toString()+"\",";
|
||||||
*report+="\""+q->value(9).toString()+"\",";
|
*report+="\""+q->value(9).toString()+"\",";
|
||||||
*report+="\""+q->value(10).toString()+"\",";
|
*report+="\""+q->value(10).toString()+"\",";
|
||||||
@ -766,11 +784,46 @@ void ListReports::GenerateCartDumpCsv(QString *report,bool prepend_names)
|
|||||||
*report+="\""+q->value(13).toString()+"\",";
|
*report+="\""+q->value(13).toString()+"\",";
|
||||||
*report+="\""+q->value(14).toString()+"\",";
|
*report+="\""+q->value(14).toString()+"\",";
|
||||||
*report+="\""+q->value(15).toString()+"\",";
|
*report+="\""+q->value(15).toString()+"\",";
|
||||||
|
*report+="\""+q->value(16).toString()+"\",";
|
||||||
|
*report+="\""+q->value(17).toString()+"\",";
|
||||||
|
*report+="\""+q->value(18).toString()+"\",";
|
||||||
|
*report+="\""+q->value(19).toString()+"\",";
|
||||||
|
if(type==RDCart::Macro) {
|
||||||
|
*report+="\"\",";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*report+="\""+q->value(2).toString()+".wav\",";
|
||||||
|
}
|
||||||
*report+="\""+
|
*report+="\""+
|
||||||
RDGetTimeLength(q->value(16).toInt(),false,false).stripWhiteSpace()+"\",";
|
RDGetTimeLength(q->value(20).toInt(),false,false).stripWhiteSpace()+"\",";
|
||||||
f0=f0.split(" ",q->value(17).toString());
|
if(type==RDCart::Macro) {
|
||||||
for(unsigned i=0;i<code_quan;i++) {
|
*report+="-1,";
|
||||||
if((f0.size()>i)&&(f0[i]!=".")) {
|
*report+="-1,";
|
||||||
|
*report+="-1,";
|
||||||
|
*report+="-1,";
|
||||||
|
*report+="-1,";
|
||||||
|
*report+="-1,";
|
||||||
|
*report+="-1,";
|
||||||
|
*report+="-1,";
|
||||||
|
*report+="-1,";
|
||||||
|
*report+="-1,";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*report+=QString().sprintf("%d,",q->value(21).toInt());
|
||||||
|
*report+=QString().sprintf("%d,",q->value(22).toInt());
|
||||||
|
*report+=QString().sprintf("%d,",q->value(23).toInt());
|
||||||
|
*report+=QString().sprintf("%d,",q->value(24).toInt());
|
||||||
|
*report+=QString().sprintf("%d,",q->value(25).toInt());
|
||||||
|
*report+=QString().sprintf("%d,",q->value(26).toInt());
|
||||||
|
*report+=QString().sprintf("%d,",q->value(27).toInt());
|
||||||
|
*report+=QString().sprintf("%d,",q->value(28).toInt());
|
||||||
|
*report+=QString().sprintf("%d,",q->value(29).toInt());
|
||||||
|
*report+=QString().sprintf("%d,",q->value(30).toInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
f0=f0.split(" ",q->value(31).toString());
|
||||||
|
for(int i=0;i<code_quan;i++) {
|
||||||
|
if(((int)f0.size()>i)&&(f0[i]!=".")) {
|
||||||
*report+="\""+f0[i].stripWhiteSpace()+"\",";
|
*report+="\""+f0[i].stripWhiteSpace()+"\",";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
1
rdlogedit/.gitignore
vendored
1
rdlogedit/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdlogedit
|
|
1
rdlogin/.gitignore
vendored
1
rdlogin/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdlogin
|
|
1
rdlogmanager/.gitignore
vendored
1
rdlogmanager/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdlogmanager
|
|
1
rdmonitor/.gitignore
vendored
1
rdmonitor/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdmonitor
|
|
1
rdpanel/.gitignore
vendored
1
rdpanel/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdpanel
|
|
1
rdrepld/.gitignore
vendored
1
rdrepld/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdrepld
|
|
1
rdselect/.gitignore
vendored
1
rdselect/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdselect
|
|
1
ripcd/.gitignore
vendored
1
ripcd/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
ripcd
|
|
@ -60,9 +60,11 @@ dist_ripcd_SOURCES = acu1p.cpp acu1p.h\
|
|||||||
ripcd.cpp ripcd.h globals.h\
|
ripcd.cpp ripcd.h globals.h\
|
||||||
ripcd_connection.cpp ripcd_connection.h\
|
ripcd_connection.cpp ripcd_connection.h\
|
||||||
ripcd_socket.cpp ripcd_socket.h\
|
ripcd_socket.cpp ripcd_socket.h\
|
||||||
|
rossnkscp.cpp rossnkscp.h\
|
||||||
sas32000.cpp sas32000.h\
|
sas32000.cpp sas32000.h\
|
||||||
sas64000.cpp sas64000.h\
|
sas64000.cpp sas64000.h\
|
||||||
sas64000gpi.cpp sas64000gpi.h\
|
sas64000gpi.cpp sas64000gpi.h\
|
||||||
|
sas16000.cpp sas16000.h\
|
||||||
sasusi.cpp sasusi.h\
|
sasusi.cpp sasusi.h\
|
||||||
starguide3.cpp starguide3.h\
|
starguide3.cpp starguide3.h\
|
||||||
starguide_feed.cpp starguide_feed.h\
|
starguide_feed.cpp starguide_feed.h\
|
||||||
@ -98,9 +100,11 @@ nodist_ripcd_SOURCES = moc_am16.cpp\
|
|||||||
moc_quartz1.cpp\
|
moc_quartz1.cpp\
|
||||||
moc_ripcd.cpp\
|
moc_ripcd.cpp\
|
||||||
moc_ripcd_socket.cpp\
|
moc_ripcd_socket.cpp\
|
||||||
|
moc_rossnkscp.cpp\
|
||||||
moc_sas32000.cpp\
|
moc_sas32000.cpp\
|
||||||
moc_sas64000.cpp\
|
moc_sas64000.cpp\
|
||||||
moc_sas64000gpi.cpp\
|
moc_sas64000gpi.cpp\
|
||||||
|
moc_sas16000.cpp\
|
||||||
moc_sasusi.cpp\
|
moc_sasusi.cpp\
|
||||||
moc_starguide3.cpp\
|
moc_starguide3.cpp\
|
||||||
moc_swauthority.cpp\
|
moc_swauthority.cpp\
|
||||||
|
@ -49,6 +49,8 @@
|
|||||||
#include <local_gpio.h>
|
#include <local_gpio.h>
|
||||||
#include <modemlines.h>
|
#include <modemlines.h>
|
||||||
#include <quartz1.h>
|
#include <quartz1.h>
|
||||||
|
#include <rossnkscp.h>
|
||||||
|
#include <sas16000.h>
|
||||||
#include <sas32000.h>
|
#include <sas32000.h>
|
||||||
#include <sas64000.h>
|
#include <sas64000.h>
|
||||||
#include <sas64000gpi.h>
|
#include <sas64000gpi.h>
|
||||||
@ -163,6 +165,14 @@ bool MainObject::LoadSwitchDriver(int matrix_num)
|
|||||||
ripcd_switcher[matrix_num]=new Quartz1(matrix,this);
|
ripcd_switcher[matrix_num]=new Quartz1(matrix,this);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RDMatrix::RossNkScp:
|
||||||
|
ripcd_switcher[matrix_num]=new RossNkScp(matrix,this);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RDMatrix::Sas16000:
|
||||||
|
ripcd_switcher[matrix_num]=new Sas16000(matrix,this);
|
||||||
|
break;
|
||||||
|
|
||||||
case RDMatrix::Sas32000:
|
case RDMatrix::Sas32000:
|
||||||
ripcd_switcher[matrix_num]=new Sas32000(matrix,this);
|
ripcd_switcher[matrix_num]=new Sas32000(matrix,this);
|
||||||
break;
|
break;
|
||||||
|
114
ripcd/rossnkscp.cpp
Normal file
114
ripcd/rossnkscp.cpp
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
// rossnkscp.cpp
|
||||||
|
//
|
||||||
|
// A Rivendell switcher driver for the Ross NK switchers via the SCP/A
|
||||||
|
//
|
||||||
|
// (C) Copyright 2002-2015 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License version 2 as
|
||||||
|
// published by the Free Software Foundation.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public
|
||||||
|
// License along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <globals.h>
|
||||||
|
#include <rossnkscp.h>
|
||||||
|
|
||||||
|
|
||||||
|
RossNkScp::RossNkScp(RDMatrix *matrix,QObject *parent,const char *name)
|
||||||
|
: Switcher(matrix,parent,name)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Get Matrix Parameters
|
||||||
|
//
|
||||||
|
ross_inputs=matrix->inputs();
|
||||||
|
ross_outputs=matrix->outputs();
|
||||||
|
ross_breakaway=matrix->card()+1;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialize the TTY Port
|
||||||
|
//
|
||||||
|
RDTty *tty=new RDTty(rdstation->name(),matrix->port(RDMatrix::Primary));
|
||||||
|
ross_device=new RDTTYDevice();
|
||||||
|
if(tty->active()) {
|
||||||
|
ross_device->setName(tty->port());
|
||||||
|
ross_device->setSpeed(tty->baudRate());
|
||||||
|
ross_device->setWordLength(tty->dataBits());
|
||||||
|
ross_device->setParity(tty->parity());
|
||||||
|
ross_device->open(IO_Raw|IO_ReadWrite);
|
||||||
|
}
|
||||||
|
delete tty;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RossNkScp::~RossNkScp()
|
||||||
|
{
|
||||||
|
delete ross_device;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RDMatrix::Type RossNkScp::type()
|
||||||
|
{
|
||||||
|
return RDMatrix::RossNkScp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned RossNkScp::gpiQuantity()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned RossNkScp::gpoQuantity()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool RossNkScp::primaryTtyActive()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool RossNkScp::secondaryTtyActive()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RossNkScp::processCommand(RDMacro *cmd)
|
||||||
|
{
|
||||||
|
char str[11];
|
||||||
|
|
||||||
|
switch(cmd->command()) {
|
||||||
|
case RDMacro::ST:
|
||||||
|
if((cmd->arg(1).toInt()<=0)||(cmd->arg(1).toInt()>ross_inputs)||
|
||||||
|
(cmd->arg(2).toInt()<1)||(cmd->arg(2).toInt()>ross_outputs)) {
|
||||||
|
cmd->acknowledge(false);
|
||||||
|
emit rmlEcho(cmd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sprintf(str,"X%03d,%03d,%d\x0d",cmd->arg(2).toInt()-1,
|
||||||
|
cmd->arg(1).toInt()-1,ross_breakaway);
|
||||||
|
syslog(LOG_WARNING,"sent: %s\n",str);
|
||||||
|
ross_device->writeBlock(str,11);
|
||||||
|
cmd->acknowledge(true);
|
||||||
|
emit rmlEcho(cmd);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
cmd->acknowledge(false);
|
||||||
|
emit rmlEcho(cmd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
55
ripcd/rossnkscp.h
Normal file
55
ripcd/rossnkscp.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
// rossnkscp.h
|
||||||
|
//
|
||||||
|
// A Rivendell switcher driver for the Ross NK switchers via the SCP/A
|
||||||
|
//
|
||||||
|
// (C) Copyright 2015 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License version 2 as
|
||||||
|
// published by the Free Software Foundation.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public
|
||||||
|
// License along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef ROSSNKSCP_H
|
||||||
|
#define ROSSNKSCP_H
|
||||||
|
|
||||||
|
#include <rd.h>
|
||||||
|
#include <rdmatrix.h>
|
||||||
|
#include <rdmacro.h>
|
||||||
|
#include <rdtty.h>
|
||||||
|
|
||||||
|
#include <switcher.h>
|
||||||
|
|
||||||
|
#define ROSSNKSCP_MIN_GAIN -99
|
||||||
|
#define ROSSNKSCP_MAX_GAIN 28
|
||||||
|
|
||||||
|
class RossNkScp : public Switcher
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
RossNkScp(RDMatrix *matrix,QObject *parent=0,const char *name=0);
|
||||||
|
~RossNkScp();
|
||||||
|
RDMatrix::Type type();
|
||||||
|
unsigned gpiQuantity();
|
||||||
|
unsigned gpoQuantity();
|
||||||
|
bool primaryTtyActive();
|
||||||
|
bool secondaryTtyActive();
|
||||||
|
void processCommand(RDMacro *cmd);
|
||||||
|
|
||||||
|
private:
|
||||||
|
RDTTYDevice *ross_device;
|
||||||
|
int ross_inputs;
|
||||||
|
int ross_outputs;
|
||||||
|
int ross_breakaway;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // ROSSNKSCP_H
|
132
ripcd/sas16000.cpp
Normal file
132
ripcd/sas16000.cpp
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
// sas16000.cpp
|
||||||
|
//
|
||||||
|
// A Rivendell switcher driver for the SAS USI Protocol (2 digit)
|
||||||
|
//
|
||||||
|
// (C) Copyright 2002-2015 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License version 2 as
|
||||||
|
// published by the Free Software Foundation.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public
|
||||||
|
// License along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <rddb.h>
|
||||||
|
#include <globals.h>
|
||||||
|
#include <sas16000.h>
|
||||||
|
|
||||||
|
Sas16000::Sas16000(RDMatrix *matrix,QObject *parent,const char *name)
|
||||||
|
: Switcher(matrix,parent,name)
|
||||||
|
{
|
||||||
|
RDTty *tty;
|
||||||
|
sas_matrix=matrix->matrix();
|
||||||
|
sas_ptr=0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get Matrix Parameters
|
||||||
|
//
|
||||||
|
sas_inputs=matrix->inputs();
|
||||||
|
sas_outputs=matrix->outputs();
|
||||||
|
sas_gpis=matrix->gpis();
|
||||||
|
sas_gpos=matrix->gpos();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialize the connection
|
||||||
|
//
|
||||||
|
tty=new RDTty(rdstation->name(),matrix->port(RDMatrix::Primary));
|
||||||
|
sas_device=new RDTTYDevice();
|
||||||
|
if(tty->active()) {
|
||||||
|
sas_device->setName(tty->port());
|
||||||
|
sas_device->setSpeed(tty->baudRate());
|
||||||
|
sas_device->setWordLength(tty->dataBits());
|
||||||
|
sas_device->setParity(tty->parity());
|
||||||
|
sas_device->open(IO_Raw|IO_ReadWrite);
|
||||||
|
}
|
||||||
|
delete tty;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RDMatrix::Type Sas16000::type()
|
||||||
|
{
|
||||||
|
return RDMatrix::Sas16000;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned Sas16000::gpiQuantity()
|
||||||
|
{
|
||||||
|
return sas_gpis;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned Sas16000::gpoQuantity()
|
||||||
|
{
|
||||||
|
return sas_gpos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Sas16000::primaryTtyActive()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Sas16000::secondaryTtyActive()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Sas16000::processCommand(RDMacro *cmd)
|
||||||
|
{
|
||||||
|
char str[256];
|
||||||
|
|
||||||
|
switch(cmd->command()) {
|
||||||
|
case RDMacro::ST:
|
||||||
|
if((cmd->arg(1).toInt()<0)||(cmd->arg(1).toInt()>sas_inputs)||
|
||||||
|
(cmd->arg(2).toInt()<1)||(cmd->arg(2).toInt()>sas_outputs)) {
|
||||||
|
cmd->acknowledge(false);
|
||||||
|
emit rmlEcho(cmd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
snprintf(str,256,"%c%02d%02d\x0D\x0A",20,
|
||||||
|
cmd->arg(1).toInt(),cmd->arg(2).toInt());
|
||||||
|
SendCommand(str);
|
||||||
|
cmd->acknowledge(true);
|
||||||
|
emit rmlEcho(cmd);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
cmd->acknowledge(false);
|
||||||
|
emit rmlEcho(cmd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Sas16000::SendCommand(char *str)
|
||||||
|
{
|
||||||
|
LogLine(RDConfig::LogDebug,QString().sprintf("sending USI cmd: %s",(const char *)PrettifyCommand(str)));
|
||||||
|
|
||||||
|
sas_device->writeBlock(str,strlen(str));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QString Sas16000::PrettifyCommand(const char *cmd) const
|
||||||
|
{
|
||||||
|
QString ret;
|
||||||
|
if(cmd[0]<26) {
|
||||||
|
ret=QString().sprintf("^%c%s",'@'+cmd[0],cmd+1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret=cmd;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
65
ripcd/sas16000.h
Normal file
65
ripcd/sas16000.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
// sas16000.h
|
||||||
|
//
|
||||||
|
// A Rivendell switcher driver for the SAS 16000(D) Audio Switcher
|
||||||
|
//
|
||||||
|
// (C) Copyright 2002-2015 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License version 2 as
|
||||||
|
// published by the Free Software Foundation.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public
|
||||||
|
// License along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SAS16000_H
|
||||||
|
#define SAS16000_H
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <qsocket.h>
|
||||||
|
#include <qhostaddress.h>
|
||||||
|
|
||||||
|
#include <rd.h>
|
||||||
|
#include <rdmatrix.h>
|
||||||
|
#include <rdmacro.h>
|
||||||
|
#include <rdtty.h>
|
||||||
|
|
||||||
|
#include <switcher.h>
|
||||||
|
|
||||||
|
#define SAS16000_MAX_LENGTH 256
|
||||||
|
|
||||||
|
class Sas16000 : public Switcher
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
Sas16000(RDMatrix *matrix,QObject *parent=0,const char *name=0);
|
||||||
|
RDMatrix::Type type();
|
||||||
|
unsigned gpiQuantity();
|
||||||
|
unsigned gpoQuantity();
|
||||||
|
bool primaryTtyActive();
|
||||||
|
bool secondaryTtyActive();
|
||||||
|
void processCommand(RDMacro *cmd);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void SendCommand(char *str);
|
||||||
|
QString PrettifyCommand(const char *cmd) const;
|
||||||
|
RDTTYDevice *sas_device;
|
||||||
|
char sas_buffer[SAS16000_MAX_LENGTH];
|
||||||
|
unsigned sas_ptr;
|
||||||
|
int sas_matrix;
|
||||||
|
int sas_ipport;
|
||||||
|
int sas_inputs;
|
||||||
|
int sas_outputs;
|
||||||
|
int sas_gpis;
|
||||||
|
int sas_gpos;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // SAS16000_H
|
@ -1,10 +1,8 @@
|
|||||||
// sasusi.cpp
|
// sasusi.cpp
|
||||||
//
|
//
|
||||||
// A Rivendell switcher driver for the SAS User Serial Interface Protocol
|
// A Rivendell switcher driver for the SAS USI Protocol
|
||||||
//
|
//
|
||||||
// (C) Copyright 2002-2004 Fred Gleason <fredg@paravelsystems.com>
|
// (C) Copyright 2002-2015 Fred Gleason <fredg@paravelsystems.com>
|
||||||
//
|
|
||||||
// $Id: sasusi.cpp,v 1.24 2011/12/28 18:59:19 cvs Exp $
|
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or modify
|
// This program is free software; you can redistribute it and/or modify
|
||||||
// it under the terms of the GNU General Public License version 2 as
|
// it under the terms of the GNU General Public License version 2 as
|
||||||
@ -260,7 +258,7 @@ void SasUsi::processCommand(RDMacro *cmd)
|
|||||||
emit rmlEcho(cmd);
|
emit rmlEcho(cmd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
snprintf(str,256,"%c%03d%03d\x0D\x0A",20,
|
snprintf(str,256,"%cT%04d%04d\x0D\x0A",5,
|
||||||
cmd->arg(1).toInt(),cmd->arg(2).toInt());
|
cmd->arg(1).toInt(),cmd->arg(2).toInt());
|
||||||
SendCommand(str);
|
SendCommand(str);
|
||||||
cmd->acknowledge(true);
|
cmd->acknowledge(true);
|
||||||
@ -290,10 +288,11 @@ void SasUsi::processCommand(RDMacro *cmd)
|
|||||||
}
|
}
|
||||||
cmd_byte=0x01;
|
cmd_byte=0x01;
|
||||||
}
|
}
|
||||||
if(cmd->arg(2).toUInt()<sas_relay_numbers.size()) {
|
if(cmd->arg(2).toUInt()<=sas_relay_numbers.size()) {
|
||||||
if(sas_relay_numbers[cmd->arg(2).toUInt()-1]>=0) {
|
if(sas_relay_numbers[cmd->arg(2).toUInt()-1]>=0) {
|
||||||
snprintf(str,256,"\x05R%d%04d\x0D\x0A",cmd_byte,
|
snprintf(str,256,"\x05R%d%04d\x0D\x0A",cmd_byte,
|
||||||
sas_relay_numbers[cmd->arg(2).toUInt()-1]);
|
sas_relay_numbers[cmd->arg(2).toUInt()-1]);
|
||||||
|
syslog(LOG_NOTICE,"USI: %s",(const char *)PrettifyCommand(str));
|
||||||
SendCommand(str);
|
SendCommand(str);
|
||||||
cmd->acknowledge(true);
|
cmd->acknowledge(true);
|
||||||
emit rmlEcho(cmd);
|
emit rmlEcho(cmd);
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
// sasusi.h
|
// sasusi.h
|
||||||
//
|
//
|
||||||
// A Rivendell switcher driver for the SAS User Serial Interface Protocol
|
// A Rivendell switcher driver for the SAS USI Protocol
|
||||||
//
|
//
|
||||||
// (C) Copyright 2002-2004 Fred Gleason <fredg@paravelsystems.com>
|
// (C) Copyright 2002-2015 Fred Gleason <fredg@paravelsystems.com>
|
||||||
//
|
|
||||||
// $Id: sasusi.h,v 1.16 2011/05/26 21:20:37 cvs Exp $
|
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or modify
|
// This program is free software; you can redistribute it and/or modify
|
||||||
// it under the terms of the GNU General Public License version 2 as
|
// it under the terms of the GNU General Public License version 2 as
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
|
|
||||||
function StartDaemons {
|
function StartDaemons {
|
||||||
|
rdcleandirs
|
||||||
if test $GPIO_START = yes ; then
|
if test $GPIO_START = yes ; then
|
||||||
if test -x /etc/init.d/gpio ; then
|
if test -x /etc/init.d/gpio ; then
|
||||||
/etc/init.d/gpio status > /dev/null
|
/etc/init.d/gpio status > /dev/null
|
||||||
@ -101,6 +102,7 @@ function StopDaemons {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
sleep 2
|
sleep 2
|
||||||
|
rdcleandirs
|
||||||
}
|
}
|
||||||
|
|
||||||
# Set path for script functions
|
# Set path for script functions
|
||||||
|
BIN
rivendell.ism
BIN
rivendell.ism
Binary file not shown.
@ -29,6 +29,15 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
#include <rlm/rlm.h>
|
#include <rlm/rlm.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define PADPOINT_DEFAULT_ADDRESS "127.0.0.1"
|
||||||
|
#define PADPOINT_DEFAULT_PORT 3355
|
||||||
|
#define PADPOINT_DEFAULT_MAINLOG 1
|
||||||
|
#define PADPOINT_DEFAULT_AUX1LOG 1
|
||||||
|
#define PADPOINT_DEFAULT_AUX2LOG 1
|
||||||
|
|
||||||
int rlm_padpoint_devs;
|
int rlm_padpoint_devs;
|
||||||
char *rlm_padpoint_addresses;
|
char *rlm_padpoint_addresses;
|
||||||
@ -71,6 +80,7 @@ void rlm_padpoint_RLMStart(void *ptr,const char *arg)
|
|||||||
char address[17];
|
char address[17];
|
||||||
char section[256];
|
char section[256];
|
||||||
char errtext[256];
|
char errtext[256];
|
||||||
|
struct stat info;
|
||||||
int i=1;
|
int i=1;
|
||||||
|
|
||||||
rlm_padpoint_devs=0;
|
rlm_padpoint_devs=0;
|
||||||
@ -80,37 +90,59 @@ void rlm_padpoint_RLMStart(void *ptr,const char *arg)
|
|||||||
rlm_padpoint_aux1s=NULL;
|
rlm_padpoint_aux1s=NULL;
|
||||||
rlm_padpoint_aux2s=NULL;
|
rlm_padpoint_aux2s=NULL;
|
||||||
|
|
||||||
sprintf(section,"PadPoint%d",i++);
|
if(stat(arg,&info)<0) {
|
||||||
strncpy(address,RLMGetStringValue(ptr,arg,section,"IpAddress",""),15);
|
/*
|
||||||
if(strlen(address)==0) {
|
* Use default settings
|
||||||
RLMLog(ptr,LOG_WARNING,"rlm_padpoint: no padpoint destinations specified");
|
*/
|
||||||
return;
|
rlm_padpoint_addresses=realloc(rlm_padpoint_addresses,16);
|
||||||
|
strcpy(rlm_padpoint_addresses,PADPOINT_DEFAULT_ADDRESS);
|
||||||
|
rlm_padpoint_ports=realloc(rlm_padpoint_ports,sizeof(uint16_t));
|
||||||
|
rlm_padpoint_ports[0]=PADPOINT_DEFAULT_PORT;
|
||||||
|
rlm_padpoint_masters=realloc(rlm_padpoint_masters,sizeof(int));
|
||||||
|
rlm_padpoint_masters[0]=PADPOINT_DEFAULT_MAINLOG;
|
||||||
|
rlm_padpoint_aux1s=realloc(rlm_padpoint_aux1s,sizeof(int));
|
||||||
|
rlm_padpoint_aux1s[0]=PADPOINT_DEFAULT_AUX1LOG;
|
||||||
|
rlm_padpoint_aux2s=realloc(rlm_padpoint_aux2s,sizeof(int));
|
||||||
|
rlm_padpoint_aux2s[0]=PADPOINT_DEFAULT_AUX2LOG;
|
||||||
|
rlm_padpoint_devs=1;
|
||||||
|
RLMLog(ptr,LOG_INFO,"loaded default settings");
|
||||||
}
|
}
|
||||||
while(strlen(address)>0) {
|
else {
|
||||||
rlm_padpoint_addresses=
|
/*
|
||||||
realloc(rlm_padpoint_addresses,(rlm_padpoint_devs+1)*(rlm_padpoint_devs+1)*16);
|
* Load settings from a configuration file
|
||||||
strcpy(rlm_padpoint_addresses+16*rlm_padpoint_devs,address);
|
*/
|
||||||
rlm_padpoint_ports=realloc(rlm_padpoint_ports,(rlm_padpoint_devs+1)*sizeof(uint16_t));
|
|
||||||
rlm_padpoint_ports[rlm_padpoint_devs]=
|
|
||||||
RLMGetIntegerValue(ptr,arg,section,"UdpPort",0);
|
|
||||||
rlm_padpoint_masters=realloc(rlm_padpoint_masters,
|
|
||||||
(rlm_padpoint_devs+1)*sizeof(int));
|
|
||||||
rlm_padpoint_masters[rlm_padpoint_devs]=
|
|
||||||
rlm_padpoint_GetLogStatus(ptr,arg,section,"MasterLog");
|
|
||||||
rlm_padpoint_aux1s=realloc(rlm_padpoint_aux1s,
|
|
||||||
(rlm_padpoint_devs+1)*sizeof(int));
|
|
||||||
rlm_padpoint_aux1s[rlm_padpoint_devs]=
|
|
||||||
rlm_padpoint_GetLogStatus(ptr,arg,section,"Aux1Log");
|
|
||||||
rlm_padpoint_aux2s=realloc(rlm_padpoint_aux2s,
|
|
||||||
(rlm_padpoint_devs+1)*sizeof(int));
|
|
||||||
rlm_padpoint_aux2s[rlm_padpoint_devs]=
|
|
||||||
rlm_padpoint_GetLogStatus(ptr,arg,section,"Aux2Log");
|
|
||||||
sprintf(errtext,"rlm_padpoint: configured destination \"%s:%d\"",address,
|
|
||||||
rlm_padpoint_ports[rlm_padpoint_devs]);
|
|
||||||
rlm_padpoint_devs++;
|
|
||||||
RLMLog(ptr,LOG_INFO,errtext);
|
|
||||||
sprintf(section,"PadPoint%d",i++);
|
sprintf(section,"PadPoint%d",i++);
|
||||||
strncpy(address,RLMGetStringValue(ptr,arg,section,"IpAddress",""),15);
|
strncpy(address,RLMGetStringValue(ptr,arg,section,"IpAddress",""),15);
|
||||||
|
if(strlen(address)==0) {
|
||||||
|
RLMLog(ptr,LOG_WARNING,"rlm_padpoint: no padpoint destinations specified");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while(strlen(address)>0) {
|
||||||
|
rlm_padpoint_addresses=
|
||||||
|
realloc(rlm_padpoint_addresses,(rlm_padpoint_devs+1)*(rlm_padpoint_devs+1)*16);
|
||||||
|
strcpy(rlm_padpoint_addresses+16*rlm_padpoint_devs,address);
|
||||||
|
rlm_padpoint_ports=realloc(rlm_padpoint_ports,(rlm_padpoint_devs+1)*sizeof(uint16_t));
|
||||||
|
rlm_padpoint_ports[rlm_padpoint_devs]=
|
||||||
|
RLMGetIntegerValue(ptr,arg,section,"UdpPort",0);
|
||||||
|
rlm_padpoint_masters=realloc(rlm_padpoint_masters,
|
||||||
|
(rlm_padpoint_devs+1)*sizeof(int));
|
||||||
|
rlm_padpoint_masters[rlm_padpoint_devs]=
|
||||||
|
rlm_padpoint_GetLogStatus(ptr,arg,section,"MasterLog");
|
||||||
|
rlm_padpoint_aux1s=realloc(rlm_padpoint_aux1s,
|
||||||
|
(rlm_padpoint_devs+1)*sizeof(int));
|
||||||
|
rlm_padpoint_aux1s[rlm_padpoint_devs]=
|
||||||
|
rlm_padpoint_GetLogStatus(ptr,arg,section,"Aux1Log");
|
||||||
|
rlm_padpoint_aux2s=realloc(rlm_padpoint_aux2s,
|
||||||
|
(rlm_padpoint_devs+1)*sizeof(int));
|
||||||
|
rlm_padpoint_aux2s[rlm_padpoint_devs]=
|
||||||
|
rlm_padpoint_GetLogStatus(ptr,arg,section,"Aux2Log");
|
||||||
|
sprintf(errtext,"rlm_padpoint: configured destination \"%s:%d\"",address,
|
||||||
|
rlm_padpoint_ports[rlm_padpoint_devs]);
|
||||||
|
rlm_padpoint_devs++;
|
||||||
|
RLMLog(ptr,LOG_INFO,errtext);
|
||||||
|
sprintf(section,"PadPoint%d",i++);
|
||||||
|
strncpy(address,RLMGetStringValue(ptr,arg,section,"IpAddress",""),15);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
11
tests/.gitignore
vendored
11
tests/.gitignore
vendored
@ -1,11 +0,0 @@
|
|||||||
audio_convert_test
|
|
||||||
audio_export_test
|
|
||||||
audio_import_test
|
|
||||||
datedecode_test
|
|
||||||
reserve_carts_test
|
|
||||||
sas_switch_torture
|
|
||||||
sas_torture
|
|
||||||
stringcode_test
|
|
||||||
test_pam
|
|
||||||
timer_test
|
|
||||||
upload_test
|
|
@ -34,6 +34,7 @@ SUBDIRS = $(ALSACONFIG_RD_OPT)\
|
|||||||
rddgimport\
|
rddgimport\
|
||||||
rdcheckcuts\
|
rdcheckcuts\
|
||||||
rdchunk\
|
rdchunk\
|
||||||
|
rdcleandirs\
|
||||||
rdcollect\
|
rdcollect\
|
||||||
rddelete\
|
rddelete\
|
||||||
rddiscimport\
|
rddiscimport\
|
||||||
|
1
utils/rdalsaconfig/.gitignore
vendored
1
utils/rdalsaconfig/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdalsaconfig
|
|
1
utils/rdcheckcuts/.gitignore
vendored
1
utils/rdcheckcuts/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdcheckcuts
|
|
1
utils/rdchunk/.gitignore
vendored
1
utils/rdchunk/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdchunk
|
|
50
utils/rdcleandirs/Makefile.am
Normal file
50
utils/rdcleandirs/Makefile.am
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
## automake.am
|
||||||
|
##
|
||||||
|
## Automake.am for rivendell/utils/rdcleandirs
|
||||||
|
##
|
||||||
|
## (C) Copyright 2015 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
##
|
||||||
|
## This program is free software; you can redistribute it and/or modify
|
||||||
|
## it under the terms of the GNU General Public License version 2 as
|
||||||
|
## published by the Free Software Foundation.
|
||||||
|
##
|
||||||
|
## 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.
|
||||||
|
##
|
||||||
|
## You should have received a copy of the GNU General Public
|
||||||
|
## License along with this program; if not, write to the Free Software
|
||||||
|
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
##
|
||||||
|
## Use automake to process this into a Makefile.in
|
||||||
|
|
||||||
|
AM_CPPFLAGS = -Wall -DPREFIX=\"$(prefix)\" -DQTDIR=\"@QT_DIR@\" @QT_CXXFLAGS@ -I$(top_srcdir)/lib
|
||||||
|
LIBS = @QT_LIBS@ -L$(top_srcdir)/lib
|
||||||
|
MOC = @QT_MOC@
|
||||||
|
|
||||||
|
# The dependency for qt's Meta Object Compiler (moc)
|
||||||
|
moc_%.cpp: %.h
|
||||||
|
$(MOC) $< -o $@
|
||||||
|
|
||||||
|
sbin_PROGRAMS = rdcleandirs
|
||||||
|
|
||||||
|
dist_rdcleandirs_SOURCES = rdcleandirs.cpp rdcleandirs.h
|
||||||
|
|
||||||
|
rdcleandirs_LDADD = @LIB_RDLIBS@ @LIBVORBIS@
|
||||||
|
|
||||||
|
CLEANFILES = *~\
|
||||||
|
*.exe\
|
||||||
|
*.idb\
|
||||||
|
*ilk\
|
||||||
|
*.obj\
|
||||||
|
*.pdb\
|
||||||
|
*.qm\
|
||||||
|
moc_*
|
||||||
|
|
||||||
|
MAINTAINERCLEANFILES = *~\
|
||||||
|
*.tar.gz\
|
||||||
|
aclocal.m4\
|
||||||
|
configure\
|
||||||
|
Makefile.in\
|
||||||
|
moc_*
|
89
utils/rdcleandirs/rdcleandirs.cpp
Normal file
89
utils/rdcleandirs/rdcleandirs.cpp
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
// rdcleandirs.cpp
|
||||||
|
//
|
||||||
|
// Remove stale lockfiles from user directories.
|
||||||
|
//
|
||||||
|
// (C) Copyright 2010 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License version 2 as
|
||||||
|
// published by the Free Software Foundation.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public
|
||||||
|
// License along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <qapplication.h>
|
||||||
|
#include <qdir.h>
|
||||||
|
#include <qfile.h>
|
||||||
|
|
||||||
|
#include <rdcmd_switch.h>
|
||||||
|
#include <rdconf.h>
|
||||||
|
|
||||||
|
#include <rdcleandirs.h>
|
||||||
|
|
||||||
|
MainObject::MainObject(QObject *parent,const char *name)
|
||||||
|
:QObject(parent,name)
|
||||||
|
{
|
||||||
|
struct passwd *pwd=NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Read Command Options
|
||||||
|
//
|
||||||
|
RDCmdSwitch *cmd=
|
||||||
|
new RDCmdSwitch(qApp->argc(),qApp->argv(),"rdcleandirs",RDCLEANDIRS_USAGE);
|
||||||
|
for(unsigned i=0;i<cmd->keys();i++) {
|
||||||
|
}
|
||||||
|
if(!cmd->allProcessed()) {
|
||||||
|
fprintf(stderr,"rdcleandirs: unknown option\n");
|
||||||
|
exit(256);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Verify that we have root permissions
|
||||||
|
//
|
||||||
|
if(getuid()!=0) {
|
||||||
|
fprintf(stderr,"rdcleandirs: this program requires root permissions\n");
|
||||||
|
exit(256);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Iterate through the user database
|
||||||
|
//
|
||||||
|
while((pwd=getpwent())!=NULL) {
|
||||||
|
QString user=QString(pwd->pw_name);
|
||||||
|
QString base=RDGetBasePart(pwd->pw_shell);
|
||||||
|
QString home=QString(pwd->pw_dir);
|
||||||
|
if((user!="mysql")&&
|
||||||
|
(base!="nologin")&&
|
||||||
|
(base!="null")&&
|
||||||
|
(base!="false")&&
|
||||||
|
(base!="sync")&&
|
||||||
|
(base!="shutdown")&&
|
||||||
|
(base!="halt")&&
|
||||||
|
(base!="reboot")) {
|
||||||
|
QFile::remove(home+"/.rdairplaylock");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
endpwent();
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc,char *argv[])
|
||||||
|
{
|
||||||
|
QApplication a(argc,argv,false);
|
||||||
|
new MainObject(NULL,"main");
|
||||||
|
return a.exec();
|
||||||
|
}
|
38
utils/rdcleandirs/rdcleandirs.h
Normal file
38
utils/rdcleandirs/rdcleandirs.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
// rdcleandirs.h
|
||||||
|
//
|
||||||
|
// Remove stale lockfiles from user directories.
|
||||||
|
//
|
||||||
|
// (C) Copyright 2015 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License version 2 as
|
||||||
|
// published by the Free Software Foundation.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public
|
||||||
|
// License along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RDCLEANDIRS_H
|
||||||
|
#define RDCLEANDIRS_H
|
||||||
|
|
||||||
|
#include <qobject.h>
|
||||||
|
|
||||||
|
#define RDCLEANDIRS_USAGE "\n"
|
||||||
|
|
||||||
|
class MainObject : public QObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MainObject(QObject *parent=0,const char *name=0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // RDCLEANDIRS_H
|
1
utils/rdcollect/.gitignore
vendored
1
utils/rdcollect/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdcollect
|
|
1
utils/rddbcheck/.gitignore
vendored
1
utils/rddbcheck/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rddbcheck
|
|
1
utils/rddelete/.gitignore
vendored
1
utils/rddelete/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rddelete
|
|
1
utils/rddgimport/.gitignore
vendored
1
utils/rddgimport/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rddgimport
|
|
1
utils/rddiscimport/.gitignore
vendored
1
utils/rddiscimport/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rddiscimport
|
|
1
utils/rdgen/.gitignore
vendored
1
utils/rdgen/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdgen
|
|
1
utils/rdgpimon/.gitignore
vendored
1
utils/rdgpimon/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdgpimon
|
|
1
utils/rdhpiinfo/.gitignore
vendored
1
utils/rdhpiinfo/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdhpiinfo
|
|
1
utils/rdimport/.gitignore
vendored
1
utils/rdimport/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdimport
|
|
1
utils/rdmaint/.gitignore
vendored
1
utils/rdmaint/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdmaint
|
|
1
utils/rdmarkerset/.gitignore
vendored
1
utils/rdmarkerset/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdmarkerset
|
|
1
utils/rdpopup/.gitignore
vendored
1
utils/rdpopup/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdpopup
|
|
1
utils/rdpurgecasts/.gitignore
vendored
1
utils/rdpurgecasts/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdpurgecasts
|
|
1
utils/rdsoftkeys/.gitignore
vendored
1
utils/rdsoftkeys/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
rdsoftkeys
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user