From 99f5afa3fe81db0a79dbe1dcd0506d907cd2536c Mon Sep 17 00:00:00 2001 From: yomguy Date: Fri, 17 Feb 2012 11:47:59 +0100 Subject: [PATCH] merge cgi changes bugfix --- .../apache2/sites-available/telecaster.conf | 4 +- conf/etc/default/jackd | 2 +- conf/etc/default/stream-m | 9 + conf/etc/icecast2/icecast.xml | 174 +++++++++ conf/etc/init.d/jackd | 2 +- conf/etc/init.d/stream-m | 83 +++++ conf/etc/init.d/vncserver | 6 +- conf/etc/pm/sleep.d/telecaster_suspend | 25 ++ conf/etc/stream-m/server.conf | 22 ++ conf/etc/telecaster/deefuzzer.xml | 56 +-- conf/etc/telecaster/deefuzzer_audio_safe.xml | 62 ++++ conf/etc/telecaster/deefuzzer_mp3.xml | 4 +- conf/etc/telecaster/deefuzzer_ogg.xml | 4 +- conf/etc/telecaster/deefuzzer_video.xml | 329 ++++++++++++++++++ conf/etc/telecaster/deefuzzer_video_local.xml | 113 ++++++ conf/etc/telecaster/deefuzzer_video_safe.xml | 62 ++++ conf/etc/telecaster/edcast_jack_local.cfg | 8 +- conf/etc/telecaster/telecaster.xml | 6 +- conf/etc/telecaster/telecaster_pb.xml | 20 +- conf/home/fluxbox/autostart.sh | 34 +- conf/home/fluxbox/init | 36 +- conf/home/fluxbox/startup.ubuntu | 27 +- conf/home/fluxbox/tc_audio_start.sh | 36 ++ conf/home/fluxbox/tc_video_start.sh | 12 + .../telecaster/ffmpeg_dv_jack_fifo_shout | 37 ++ .../telecaster/ffmpeg_usb_jack_fifo_shout | 37 ++ .../home/fluxbox/telecaster/gst_dv_jack_shout | 7 + .../fluxbox/telecaster/gst_video_double_shout | 3 + .../telecaster/gst_video_double_shout2.sh | 23 ++ .../telecaster/gst_video_jack_fifo_shout | 24 ++ .../fluxbox/telecaster/gst_video_jack_shout | 24 ++ .../fluxbox/telecaster/gst_video_simple_ogg | 11 + .../telecaster/gst_video_simple_ogg_jack | 9 + .../fluxbox/telecaster/gst_video_triple_shout | 11 + .../fluxbox/telecaster/tc_flu_simple_webm.sh | 22 ++ .../telecaster/tc_video_simple_file.sh | 20 ++ .../telecaster/tc_video_simple_file_webm.sh | 23 ++ .../telecaster/tc_video_simple_start.sh | 20 ++ .../telecaster/tc_video_simple_webm_stream.sh | 18 + .../tc_video_simple_webm_stream_hd.sh | 18 + ...c_video_simple_webm_stream_hd_alsa_test.sh | 17 + ...c_video_simple_webm_stream_hd_jack_test.sh | 17 + .../tc_video_simple_webm_stream_hd_test.sh | 13 + .../tc_video_simple_webm_stream_m.sh | 25 ++ .../tc_video_simple_webm_stream_sd_test.sh | 13 + .../telecaster/tc_video_simple_webm_tee.sh | 25 ++ conf/home/fluxbox/telecaster/x_jack_webm.sh | 13 + conf/home/telecaster/media/mp3/silence.mp3 | Bin 0 -> 40660 bytes conf/home/telecaster/media/ogg/silence.ogg | Bin 0 -> 4488 bytes conf/usr/local/bin/rotate_desktop | 12 + .../share/applications/rotate_desktop.desktop | 10 + .../apps/preferences-desktop-rotate.png | Bin 0 -> 10467 bytes .../16x16/apps/preferences-desktop-rotate.png | Bin 0 -> 1035 bytes .../22x22/apps/preferences-desktop-rotate.png | Bin 0 -> 1508 bytes .../32x32/apps/preferences-desktop-rotate.png | Bin 0 -> 2231 bytes .../48x48/apps/preferences-desktop-rotate.png | Bin 0 -> 3506 bytes .../64x64/apps/preferences-desktop-rotate.png | Bin 0 -> 5181 bytes .../8x8/apps/preferences-desktop-rotate.png | Bin 0 -> 545 bytes telecaster/templates/telecaster/base.html | 4 +- telecaster/tools/acpi.py | 78 +++-- 60 files changed, 1485 insertions(+), 185 deletions(-) create mode 100644 conf/etc/default/stream-m create mode 100644 conf/etc/icecast2/icecast.xml create mode 100755 conf/etc/init.d/stream-m create mode 100755 conf/etc/pm/sleep.d/telecaster_suspend create mode 100644 conf/etc/stream-m/server.conf create mode 100644 conf/etc/telecaster/deefuzzer_audio_safe.xml create mode 100644 conf/etc/telecaster/deefuzzer_video.xml create mode 100644 conf/etc/telecaster/deefuzzer_video_local.xml create mode 100644 conf/etc/telecaster/deefuzzer_video_safe.xml create mode 100755 conf/home/fluxbox/tc_audio_start.sh create mode 100755 conf/home/fluxbox/tc_video_start.sh create mode 100755 conf/home/fluxbox/telecaster/ffmpeg_dv_jack_fifo_shout create mode 100755 conf/home/fluxbox/telecaster/ffmpeg_usb_jack_fifo_shout create mode 100755 conf/home/fluxbox/telecaster/gst_dv_jack_shout create mode 100755 conf/home/fluxbox/telecaster/gst_video_double_shout create mode 100755 conf/home/fluxbox/telecaster/gst_video_double_shout2.sh create mode 100755 conf/home/fluxbox/telecaster/gst_video_jack_fifo_shout create mode 100755 conf/home/fluxbox/telecaster/gst_video_jack_shout create mode 100755 conf/home/fluxbox/telecaster/gst_video_simple_ogg create mode 100755 conf/home/fluxbox/telecaster/gst_video_simple_ogg_jack create mode 100755 conf/home/fluxbox/telecaster/gst_video_triple_shout create mode 100755 conf/home/fluxbox/telecaster/tc_flu_simple_webm.sh create mode 100755 conf/home/fluxbox/telecaster/tc_video_simple_file.sh create mode 100755 conf/home/fluxbox/telecaster/tc_video_simple_file_webm.sh create mode 100755 conf/home/fluxbox/telecaster/tc_video_simple_start.sh create mode 100755 conf/home/fluxbox/telecaster/tc_video_simple_webm_stream.sh create mode 100755 conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_hd.sh create mode 100755 conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_hd_alsa_test.sh create mode 100755 conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_hd_jack_test.sh create mode 100755 conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_hd_test.sh create mode 100755 conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_m.sh create mode 100755 conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_sd_test.sh create mode 100755 conf/home/fluxbox/telecaster/tc_video_simple_webm_tee.sh create mode 100755 conf/home/fluxbox/telecaster/x_jack_webm.sh create mode 100644 conf/home/telecaster/media/mp3/silence.mp3 create mode 100644 conf/home/telecaster/media/ogg/silence.ogg create mode 100755 conf/usr/local/bin/rotate_desktop create mode 100644 conf/usr/share/applications/rotate_desktop.desktop create mode 100644 conf/usr/share/icons/oxygen/128x128/apps/preferences-desktop-rotate.png create mode 100644 conf/usr/share/icons/oxygen/16x16/apps/preferences-desktop-rotate.png create mode 100644 conf/usr/share/icons/oxygen/22x22/apps/preferences-desktop-rotate.png create mode 100644 conf/usr/share/icons/oxygen/32x32/apps/preferences-desktop-rotate.png create mode 100644 conf/usr/share/icons/oxygen/48x48/apps/preferences-desktop-rotate.png create mode 100644 conf/usr/share/icons/oxygen/64x64/apps/preferences-desktop-rotate.png create mode 100644 conf/usr/share/icons/oxygen/8x8/apps/preferences-desktop-rotate.png diff --git a/conf/etc/apache2/sites-available/telecaster.conf b/conf/etc/apache2/sites-available/telecaster.conf index 4859b3e..0a1c6fc 100644 --- a/conf/etc/apache2/sites-available/telecaster.conf +++ b/conf/etc/apache2/sites-available/telecaster.conf @@ -4,13 +4,13 @@ SuexecUserGroup telecaster telecaster - ErrorLog /var/log/apache2/error.log + ErrorLog /var/log/apache2/telecaster_error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn - CustomLog /var/log/apache2/access.log combined + CustomLog /var/log/apache2/telecaster_access.log combined ServerSignature On diff --git a/conf/etc/default/jackd b/conf/etc/default/jackd index 45509b2..3f50b45 100644 --- a/conf/etc/default/jackd +++ b/conf/etc/default/jackd @@ -5,5 +5,5 @@ START_DAEMON=yes USER=telecaster # Options to pass to jackd -OPTIONS="-dalsa -r44100 -p4096 -n3 -D -Chw:1,1 -Phw:1,0" +OPTIONS="-dalsa -r44100 -p1024 -n3 -Chw:3,1 -Phw:3,0" diff --git a/conf/etc/default/stream-m b/conf/etc/default/stream-m new file mode 100644 index 0000000..7b2c28a --- /dev/null +++ b/conf/etc/default/stream-m @@ -0,0 +1,9 @@ +# Set to "yes" to start stream-m at boot +START_DAEMON=yes + +# The jackd process will run under this user +USER=telecaster + +# Options to pass to jackd +OPTIONS="/etc/stream-m/server.conf" + diff --git a/conf/etc/icecast2/icecast.xml b/conf/etc/icecast2/icecast.xml new file mode 100644 index 0000000..7859b0f --- /dev/null +++ b/conf/etc/icecast2/icecast.xml @@ -0,0 +1,174 @@ + + + 100 + 20 + 16 + 524288 + 30 + 15 + 10 + + 1 + + 65536 + + + + + source2parisson + + hackme + + + admin + hackme + + + + + + + + + 127.0.0.1 + + + + 8000 + + + + + + + + + + + + + + + + + + 1 + + + + /usr/share/icecast2 + + + /var/log/icecast2 + /usr/share/icecast2/web + /usr/share/icecast2/admin + + + + + + + + + + access.log + error.log + + 3 + 10000 + + + + + + 0 + + + diff --git a/conf/etc/init.d/jackd b/conf/etc/init.d/jackd index 1c5f6f5..4c2aa07 100755 --- a/conf/etc/init.d/jackd +++ b/conf/etc/init.d/jackd @@ -10,7 +10,7 @@ DAEMON=/usr/bin/jackd -USER= +USER="" OPTIONS="" LOG=/var/log/jackd.log PIDFILE=/var/run/jackd.pid diff --git a/conf/etc/init.d/stream-m b/conf/etc/init.d/stream-m new file mode 100755 index 0000000..c693bd7 --- /dev/null +++ b/conf/etc/init.d/stream-m @@ -0,0 +1,83 @@ +#!/bin/sh +### BEGIN INIT INFO +# Provides: stream-m +# Required-Start: +# Required-Stop: +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: init-Script for system wide fetchmail daemon +### END INIT INFO + +DAEMON=/usr/local/bin/stream-m +USER="" +CONF="/etc/stream-m/server.conf" +LOG=/var/log/stream-m.log +PIDFILE=/var/run/stream-m.pid + +test -f /etc/default/stream-m || exit 0 +. /etc/default/stream-m + +STREAMMHOME=/home/$USER + +if [ ! "x$START_DAEMON" = "xyes" -a ! "$1" = "stop" ]; then + echo "Edit /etc/default/stream-m to start stream-m" + exit 0 +fi + +test -f $DAEMON || exit 0 + +. /lib/lsb/init-functions + +case "$1" in + start) + log_begin_msg "Starting stream-m video server:" "stream-m" + echo $DAEMON $CONF ' &' > $STREAMMHOME/.stream-m-init + chmod +x $STREAMMHOME/.stream-m-init + su -c $STREAMMHOME/.stream-m-init $USER > ${LOG} + sleep 2 + pid=`pgrep -u ${USER} stream-m` + if [ pid = '' ]; then + log_failure_msg "Stream-m daemon can't be started! Check logfile: ${LOG}" + else + echo $pid > $PIDFILE + fi + + ;; + stop) + log_begin_msg "Stopping stream-m video server:" "stream-m" + pid=`cat $PIDFILE | sed -e 's/\s.*//'|head -n1` + if [ ! pid = '' ]; then + kill -9 $pid + pkill -9 -f 'stream-m' + log_end_msg 0 + else + log_end_msg 1 + exit 1 + fi + rm $PIDFILE + ;; + try-restart) + if test -e $PIDFILE ; then + pid=`cat $PIDFILE | sed -e 's/\s.*//'|head -n1` + PIDDIR=/proc/$pid + if [ -d ${PIDDIR} -a "$(readlink -f ${PIDDIR}/exe)" = "${DAEMON}" ]; then + $0 restart + exit 0 + fi + fi + test -f /etc/rc`/sbin/runlevel | cut -d' ' -f2`.d/S*stream-m* && $0 start + ;; + + *) + log_warning_msg "Usage: /etc/init.d/stream-m {start|stop|restart|force-reload|awaken|debug-run}" + log_warning_msg " start - starts system-wide stream-m service" + log_warning_msg " stop - stops system-wide stream-m service" + log_warning_msg " restart, force-reload - starts a new system-wide stream-m service" + log_warning_msg " awaken - tell system-wide stream-m to start a poll cycle immediately" + log_warning_msg " debug-run [strace [strace options...]] - start a debug run of the" + log_warning_msg " system-wide stream-m service, optionally running it under strace" + exit 1 + ;; +esac + +exit 0 diff --git a/conf/etc/init.d/vncserver b/conf/etc/init.d/vncserver index 9411a01..f087c80 100755 --- a/conf/etc/init.d/vncserver +++ b/conf/etc/init.d/vncserver @@ -49,8 +49,10 @@ case "$1" in log_begin_msg "Stopping vncserver audio server:" "vncserver" pid=`cat $PIDFILE | sed -e 's/\s.*//'|head -n1` if [ ! pid = '' ]; then - su -c "pkill -9 -f \"deefuzzer /etc/telecaster/deefuzzer_safe.xml\" " - su -c "pkill -9 edcast_jack" $USER + su -c "pkill -9 -f \"deefuzzer /etc/telecaster/deefuzzer_audio_safe.xml\" " + su -c "pkill -9 -f \"deefuzzer /etc/telecaster/deefuzzer_video_safe.xml\" " + su -c "pkill -9 edcast_jack" $USER + su -c "pkill -9 gst-launch-0.10" $USER sleep 1 su -c "vncserver -kill :$PORT" $USER log_end_msg 0 diff --git a/conf/etc/pm/sleep.d/telecaster_suspend b/conf/etc/pm/sleep.d/telecaster_suspend new file mode 100755 index 0000000..8acdd6d --- /dev/null +++ b/conf/etc/pm/sleep.d/telecaster_suspend @@ -0,0 +1,25 @@ +#! /bin/sh + +# This script puts the TeleCaster services to +# suspend before going to sleep. Otherwise it may be in a weird state +# after wakeup, namely everything looks fine from various AT commands, +# the modem is registered to the cell network and reports a suitable +# signal strength, but attempting to dial out by atdt*99# or, it seems, +# any other number and the modem just responds instantly with NO CARRIER. + + +#if [ ! -x /sys/bus/usb/devices/${BUS}-${DEVICE}/power/level ]; then +# exit 0 +#fi + +case $1 in + suspend|suspend_hybrid|hibernate) + /etc/init.d/vncserver stop + sleep 1 + /etc/init.d/jackd stop + ;; + resume|thaw) + /etc/init.d/jackd start + /etc/init.d/vncserver start + ;; +esac diff --git a/conf/etc/stream-m/server.conf b/conf/etc/stream-m/server.conf new file mode 100644 index 0000000..94bdbce --- /dev/null +++ b/conf/etc/stream-m/server.conf @@ -0,0 +1,22 @@ +# +# Sample configuration file +# Empty lines and lines starting with # and ; are ignored. +# Format: = +# Syntactic elements (words) can be separated by linear whitepace. +# + +# server.port +# listening port +server.port = 8080 + +# stream. +# if defined then a stream can be started with this name +streams.safe = true + +# stream..password +# determines the password to accept the stream +streams.safe.password = source2parisson + +# stream..limit +# maximum number of clients for this stream +streams.safe.limit = 10 diff --git a/conf/etc/telecaster/deefuzzer.xml b/conf/etc/telecaster/deefuzzer.xml index 746f8dd..3df370d 100644 --- a/conf/etc/telecaster/deefuzzer.xml +++ b/conf/etc/telecaster/deefuzzer.xml @@ -1,29 +1,30 @@ - /var/log/deefuzzer/telecaster.log - /var/www/m3u/telecaster.m3u + /var/log/deefuzzer/telecaster_safe.log + /var/www/m3u/telecaster_safe.m3u - telecaster_local - TeleCaster Localhost - TeleCaster local audio streaming + telecaster_live_safe + TeleCaster Localhost Live Safe Recorder + TeleCaster safe local live audio record http://parisson.com Vocal + icecast 127.0.0.1 8000 source2parisson 0 - /path/to/ogg - ogg - 64 - 4 + /home/telecaster/media/mp3 + mp3 + 96 + 7 44100 - 1 - 0 + 2 + 1 /var/www/rss @@ -46,38 +47,38 @@ 1 - http://127.0.0.1:8000/telecaster_live.ogg + http://127.0.0.1:8000/telecaster_live.mp3 Parisson 1 - /path/to/archives + /home/telecaster/trash - - telecaster - TeleCaster Remote - TeleCaster Remote + telecaster_live_safe + TeleCaster Localhost Live Safe Recorder + TeleCaster safe local live audio record http://parisson.com - School + Vocal - stream.parisson.com + icecast + parisson.com 8000 source2parisson 0 - /path/to/ogg - ogg + /home/telecaster/media/mp3 + mp3 96 - 4 + 7 44100 - 1 - 0 + 2 + 1 /var/www/rss @@ -95,20 +96,21 @@ 1 - 0 + 1 1235 1 - http://127.0.0.1:8000/telecaster_live.ogg + http://127.0.0.1:8000/telecaster_live.mp3 Parisson 0 - /path/to/archives + /home/telecaster/trash + diff --git a/conf/etc/telecaster/deefuzzer_audio_safe.xml b/conf/etc/telecaster/deefuzzer_audio_safe.xml new file mode 100644 index 0000000..23c8e2e --- /dev/null +++ b/conf/etc/telecaster/deefuzzer_audio_safe.xml @@ -0,0 +1,62 @@ + + /var/log/deefuzzer/telecaster_audio_safe.log + /var/www/m3u/telecaster_audio_safe.m3u + + + + 0 + 1236 + + + http://127.0.0.1:8000/telecaster_live.mp3 + 1 + Inconnu + + + 0 + mp3 + 1 + 4 + 48000 + 64 + /home/telecaster/media/mp3 + + + 4egZs1dSM37XVY8zXa016Yueku2fleXF2bx8k25V4 + 0 + 76728330-OjKgbHtn4II86Ad7pNUGEzfNAkGTW5Wvw38qUmLE + bla bla + + + icecast + 127.0.0.1 + 8000 + source2parisson + 0 + + + 1 + /home/telecaster/trash/mp3 + + + 1 + 0 + /path/to/jingles + + + http://parisson.com.com + Vocal + telecaster_audio_safe + telecaster_audio_safe + TeleCaster safe audio stream + + + 0 + /var/www/rss + http://my.domain.com/rss/ + + + + + + diff --git a/conf/etc/telecaster/deefuzzer_mp3.xml b/conf/etc/telecaster/deefuzzer_mp3.xml index 26d02eb..8e2be66 100644 --- a/conf/etc/telecaster/deefuzzer_mp3.xml +++ b/conf/etc/telecaster/deefuzzer_mp3.xml @@ -85,8 +85,8 @@ 0 - my_twitter_user - my_twitter_password + my_twitter_user + my_twitter_password bla bla diff --git a/conf/etc/telecaster/deefuzzer_ogg.xml b/conf/etc/telecaster/deefuzzer_ogg.xml index 2a774fb..522cfc3 100644 --- a/conf/etc/telecaster/deefuzzer_ogg.xml +++ b/conf/etc/telecaster/deefuzzer_ogg.xml @@ -85,8 +85,8 @@ 0 - my_twitter_user - my_twitter_password + my_twitter_user + my_twitter_password bla bla diff --git a/conf/etc/telecaster/deefuzzer_video.xml b/conf/etc/telecaster/deefuzzer_video.xml new file mode 100644 index 0000000..bd0db95 --- /dev/null +++ b/conf/etc/telecaster/deefuzzer_video.xml @@ -0,0 +1,329 @@ + + /var/log/deefuzzer/telecaster.log + /var/www/m3u/telecaster.m3u + + + + telecaster_local + TeleCaster Localhost + TeleCaster local audio streaming + http://parisson.com + Vocal + + + 127.0.0.1 + 8000 + source2parisson + 0 + + + /path/to/ogg + ogg + 64 + 4 + 44100 + 1 + 0 + + + /var/www/rss + 0 + + + 0 + 76728330-OjKgbHtn4II86Ad7pNUGEzfNAkGTW5Wvw38qUmLE + 4egZs1dSM37XVY8zXa016Yueku2fleXF2bx8k25V4 + bla bla + + + 0 + /path/to/jingles + 1 + + + 1 + 1234 + + + 1 + http://127.0.0.1:8000/telecaster_live.ogg + Parisson + + + 1 + /path/to/archives + + + + + + + telecaster + TeleCaster Remote + TeleCaster Remote + http://parisson.com + School + + + stream.parisson.com + 8000 + source2parisson + 0 + + + /path/to/ogg + ogg + 96 + 4 + 44100 + 1 + 0 + + + /var/www/rss + 0 + + + 0 + 76728330-OjKgbHtn4II86Ad7pNUGEzfNAkGTW5Wvw38qUmLE + 4egZs1dSM37XVY8zXa016Yueku2fleXF2bx8k25V4 + bla bla + + + 0 + /path/to/jingles + 1 + + + 0 + 1235 + + + 1 + http://127.0.0.1:8000/telecaster_live.ogg + Parisson + + + 0 + /path/to/archives + + + + + + + telecaster + TeleCaster Remote + TeleCaster Remote + http://parisson.com + School + + + stream.parisson.com + 8000 + source2parisson + 0 + + + /path/to/ogg + ogg + 96 + 4 + 44100 + 1 + 0 + + + /var/www/rss + 0 + + + 0 + 76728330-OjKgbHtn4II86Ad7pNUGEzfNAkGTW5Wvw38qUmLE + 4egZs1dSM37XVY8zXa016Yueku2fleXF2bx8k25V4 + bla bla + + + 0 + /path/to/jingles + 1 + + + 0 + 1235 + + + 1 + http://127.0.0.1:8000/telecaster_live.ogg + Parisson + + + 0 + /path/to/archives + + + + + + telecaster_video + TeleCaster Video Localhost + TeleCaster local video streaming + http://parisson.com + Vocal + + + 127.0.0.1 + 8000 + source2parisson + 0 + + + /path/to/ogg + ogg + 64 + 4 + 44100 + 1 + 0 + + + /var/www/rss + 0 + + + 0 + 76728330-OjKgbHtn4II86Ad7pNUGEzfNAkGTW5Wvw38qUmLE + 4egZs1dSM37XVY8zXa016Yueku2fleXF2bx8k25V4 + bla bla + + + 0 + /path/to/jingles + 1 + + + 1 + 1235 + + + 1 + http://127.0.0.1:8000/telecaster_live_video.ogg + Parisson + + + 1 + /path/to/archives + + + + + + + telecaster_video + TeleCaster Video Remote + TeleCaster Video Remote + http://parisson.com + School + + + stream.parisson.com + 8000 + source2parisson + 0 + + + /path/to/ogg + ogg + 96 + 4 + 44100 + 1 + 0 + + + /var/www/rss + 0 + + + 0 + 76728330-OjKgbHtn4II86Ad7pNUGEzfNAkGTW5Wvw38qUmLE + 4egZs1dSM37XVY8zXa016Yueku2fleXF2bx8k25V4 + bla bla + + + 0 + /path/to/jingles + 1 + + + 0 + 1235 + + + 1 + http://127.0.0.1:8000/telecaster_live_video.ogg + Parisson + + + 0 + /path/to/archives + + + + + + + telecaster + TeleCaster Remote + TeleCaster Remote + http://parisson.com + School + + + stream.parisson.com + 8000 + source2parisson + 0 + + + /path/to/ogg + ogg + 96 + 4 + 44100 + 1 + 0 + + + /var/www/rss + 0 + + + 0 + 76728330-OjKgbHtn4II86Ad7pNUGEzfNAkGTW5Wvw38qUmLE + 4egZs1dSM37XVY8zXa016Yueku2fleXF2bx8k25V4 + bla bla + + + 0 + /path/to/jingles + 1 + + + 0 + 1235 + + + 1 + http://127.0.0.1:8000/telecaster_live_video.ogg + Parisson + + + 0 + /path/to/archives + + + + + + diff --git a/conf/etc/telecaster/deefuzzer_video_local.xml b/conf/etc/telecaster/deefuzzer_video_local.xml new file mode 100644 index 0000000..30bf444 --- /dev/null +++ b/conf/etc/telecaster/deefuzzer_video_local.xml @@ -0,0 +1,113 @@ + + /var/log/deefuzzer/telecaster.log + /var/www/m3u/telecaster.m3u + + + + telecaster_video + TeleCaster Video Localhost + TeleCaster local video streaming + http://parisson.com + Vocal + + + 127.0.0.1 + 8000 + source2parisson + 0 + + + /home/telecaster/media/ogg + ogg + 64 + 4 + 44100 + 1 + 0 + + + /var/www/rss + 0 + + + 0 + 76728330-OjKgbHtn4II86Ad7pNUGEzfNAkGTW5Wvw38qUmLE + 4egZs1dSM37XVY8zXa016Yueku2fleXF2bx8k25V4 + bla bla + + + 0 + /path/to/jingles + 1 + + + 1 + 1234 + + + 1 + http://127.0.0.1:8000/telecaster_live_video.ogg + Parisson + + + 1 + /path/to/archives + + + + + + telecaster_video + TeleCaster Video Localhost + TeleCaster local video streaming + http://parisson.com + Vocal + + + stream.parisson.com + 8000 + source2parisson + 0 + + + /home/telecaster/media/ogg + ogg + 64 + 4 + 44100 + 1 + 0 + + + /var/www/rss + 0 + + + 0 + 76728330-OjKgbHtn4II86Ad7pNUGEzfNAkGTW5Wvw38qUmLE + 4egZs1dSM37XVY8zXa016Yueku2fleXF2bx8k25V4 + bla bla + + + 0 + /path/to/jingles + 1 + + + 0 + 1234 + + + 1 + http://127.0.0.1:8000/telecaster_live_video.ogg + Parisson + + + 0 + /path/to/archives + + + + + + diff --git a/conf/etc/telecaster/deefuzzer_video_safe.xml b/conf/etc/telecaster/deefuzzer_video_safe.xml new file mode 100644 index 0000000..d1bc791 --- /dev/null +++ b/conf/etc/telecaster/deefuzzer_video_safe.xml @@ -0,0 +1,62 @@ + + /var/log/deefuzzer/telecaster_video_safe.log + /var/www/m3u/telecaster_video_safe.m3u + + + + 0 + 1235 + + + http://127.0.0.1:9000/ + 1 + TeleCaster + + + 0 + webm + 1 + 4 + 48000 + 64 + /home/telecaster/media/webm + + + 4egZs1dSM37XVY8zXa016Yueku2fleXF2bx8k25V4 + 0 + 76728330-OjKgbHtn4II86Ad7pNUGEzfNAkGTW5Wvw38qUmLE + bla bla + + + stream-m + 127.0.0.1 + 8080 + source2parisson + 0 + + + 1 + /home/telecaster/trash/webm + + + 1 + 0 + /path/to/jingles + + + http://parisson.com.com + Vocal + safe + safe + TeleCaster safe video stream + + + 0 + /var/www/rss + http://my.domain.com/rss/ + + + + + + diff --git a/conf/etc/telecaster/edcast_jack_local.cfg b/conf/etc/telecaster/edcast_jack_local.cfg index 0cfe09d..16db86a 100644 --- a/conf/etc/telecaster/edcast_jack_local.cfg +++ b/conf/etc/telecaster/edcast_jack_local.cfg @@ -3,7 +3,7 @@ ServerType=Icecast2 Server=localhost Port=8000 ServerPassword=source2parisson -ServerMountpoint=/telecaster_live.ogg +ServerMountpoint=/telecaster_live.mp3 # YP (Stream Directory) Settings ServerPublic=0 ServerIRC= @@ -16,10 +16,10 @@ ServerGenre=Vocal AutomaticReconnectSecs=10 AutoConnect=1 # Output codec selection (Valid selections : MP3, OggVorbis, Ogg FLAC, AAC, AAC Plus) -Encode=OggVorbis +Encode=MP3 # General settings (non-codec related). Note : NumberChannels = 1 for MONO, 2 for STEREO NumberChannels=1 -Samplerate=44100 +Samplerate=48000 BitrateNominal=64 BitrateMin=32 BitrateMax=96 @@ -30,7 +30,7 @@ SaveDirectory=/home/telecaster/trash SaveAsWAV=0 # # Ogg Vorbis specific settings. Note: Valid settings for BitrateQuality flag are (Quality, Bitrate Management) -OggQuality=4 +OggQuality=3 OggBitrateQualityFlag=Quality # LAME specific settings. Note: Setting the low/highpass freq to 0 will disable them. LameCBRFlag=0 diff --git a/conf/etc/telecaster/telecaster.xml b/conf/etc/telecaster/telecaster.xml index 456fcc7..b6061f1 100644 --- a/conf/etc/telecaster/telecaster.xml +++ b/conf/etc/telecaster/telecaster.xml @@ -12,13 +12,13 @@ true - /home/telecaster/media/ogg + /home/telecaster/media/mp3 /home/telecaster/archives - ogg + mp3 64 1 4 - 44100 + 48000 diff --git a/conf/etc/telecaster/telecaster_pb.xml b/conf/etc/telecaster/telecaster_pb.xml index 08c3712..f76043c 100644 --- a/conf/etc/telecaster/telecaster_pb.xml +++ b/conf/etc/telecaster/telecaster_pb.xml @@ -3,22 +3,22 @@ Pre-Barreau Pre-Barreau La preparation au Barreau de Paris - telecaster-04.parisson.com + augustins.pre-barreau.com Vocal - /tmp/telecaster.log + /var/log/telecaster/telecaster.log /etc/telecaster/deefuzzer.xml true - /home/prebarreau/media - /home/prebarreau/archives + /home/pre-barreau/media/mp3 + /home/pre-barreau/archives mp3 96 1 3 - 44100 + 48000 @@ -26,7 +26,7 @@ - + CRFPA @@ -128,7 +128,7 @@ Oral-Procedures_communautaires - + Oral-Voies_d_ex @@ -137,6 +137,9 @@ Oral-Finances_publiques + + Conference-actualisation-septembre + TEST @@ -327,6 +330,7 @@ 13e_sem 14e_sem 15e_sem - 16e_sem + 16e_sem + diff --git a/conf/home/fluxbox/autostart.sh b/conf/home/fluxbox/autostart.sh index e67f098..6965012 100755 --- a/conf/home/fluxbox/autostart.sh +++ b/conf/home/fluxbox/autostart.sh @@ -1,34 +1,4 @@ #!/bin/sh -pid=`pgrep jack-rack` - -if [ ! $pid = "" ]; then - sleep 1 -else - jack-rack -n /etc/telecaster/eq_comp_limit_02.rack > /dev/null & - sleep 10 - jack_connect system:capture_1 jack_rack:in_1 - jack_connect system:capture_2 jack_rack:in_2 -fi - -qjackctl & - -edcast_jack -c /etc/telecaster/edcast_jack_local.cfg -n LIVE -p jack_rack > /dev/null & -sleep 3 - -# MONO setup -jack_disconnect jack_rack:out_2 LIVE:in_2 -jack_connect jack_rack:out_1 LIVE:in_1 -jack_connect jack_rack:out_1 LIVE:in_2 -jack_connect jack_rack:out_1 system:playback_1 -jack_connect jack_rack:out_1 system:playback_2 - - -# STEREO setup -#jack_connect jack_rack:out_1 LIVE:in_1 -#jack_connect jack_rack:out_2 LIVE:in_2 -#jack_connect jack_rack:out_1 system:playback_1 -#jack_connect jack_rack:out_2 system:playback_2 - -# Start safe DeeFuzzer -deefuzzer /etc/telecaster/deefuzzer_safe.xml > /dev/null & +sh ~/.fluxbox/tc_audio_start.sh & +sh ~/.fluxbox/tc_video_start.sh & diff --git a/conf/home/fluxbox/init b/conf/home/fluxbox/init index 25769d1..a47c424 100644 --- a/conf/home/fluxbox/init +++ b/conf/home/fluxbox/init @@ -1,37 +1,3 @@ -session.screen0.iconbar.mode: {static groups} (workspace) -session.screen0.tab.placement: Top -session.screen0.tab.width: 64 -session.screen0.tab.height: 16 -session.screen0.tabs.usePixmap: false -session.screen0.toolbar.onTop: False -session.screen0.toolbar.autoHide: False -session.screen0.toolbar.placement: BottomCenter -session.screen0.toolbar.widthPercent: 66 -session.screen0.slit.placement: RightBottom -session.screen0.slit.direction: Vertical -session.screen0.slit.onTop: False -session.screen0.slit.autoHide: False -session.screen0.edgeSnapThreshold: 0 -session.screen0.strftimeFormat: %k:%M -session.screen0.colPlacementDirection: TopToBottom -session.screen0.showwindowposition: true -session.screen0.rowPlacementDirection: LeftToRight -session.screen0.focusNewWindows: True -session.screen0.windowPlacement: RowSmartPlacement -session.screen0.rootCommand: sh ~/.fluxbox/autostart.sh -session.screen0.workspaces: 4 -session.screen0.focusModel: ClickToFocus -session.screen0.focusLastWindow: True -session.screen0.workspaceNames: one,two,three,four -session.screen0.fullMaximization: False -session.colorsPerChannel: 4 session.menuFile: ~/.fluxbox/menu -session.configVersion: 10 -session.doubleClickInterval: 250 -session.cacheLife: 5 -session.cacheMax: 200 -session.opaqueMove: False -session.styleFile: /usr/share/fluxbox/styles/BlueNight session.keyFile: ~/.fluxbox/keys -session.autoRaiseDelay: 250 -session.imageDither: True +session.configVersion: 13 diff --git a/conf/home/fluxbox/startup.ubuntu b/conf/home/fluxbox/startup.ubuntu index bd1a913..af2145a 100644 --- a/conf/home/fluxbox/startup.ubuntu +++ b/conf/home/fluxbox/startup.ubuntu @@ -27,33 +27,8 @@ fbpid=$! sleep 1 { -pid=`pgrep jack-rack` -if [ ! $pid = "" ]; then - sleep 1 -else - jack-rack -n /etc/telecaster/eq_comp_limit_02.rack > /dev/null & - sleep 10 - jack_connect system:capture_1 jack_rack:in_1 - jack_connect system:capture_2 jack_rack:in_2 -fi - -qjackctl & - -edcast_jack -c /etc/telecaster/edcast_jack_local.cfg -n LIVE -p jack_rack > /dev/null & -sleep 3 - -# MONO setup -jack_disconnect jack_rack:out_2 LIVE:in_2 -jack_connect jack_rack:out_1 LIVE:in_1 -jack_connect jack_rack:out_1 LIVE:in_2 - -# STEREO setup -#jack_connect jack_rack:out_1 LIVE:in_1 -#jack_connect jack_rack:out_2 LIVE:in_2 - -# Start safe DeeFuzzer -deefuzzer /etc/telecaster/deefuzzer_safe.xml > /dev/null & +sh ~/.fluxbox/autostart.sh } & diff --git a/conf/home/fluxbox/tc_audio_start.sh b/conf/home/fluxbox/tc_audio_start.sh new file mode 100755 index 0000000..b1fde28 --- /dev/null +++ b/conf/home/fluxbox/tc_audio_start.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +pid=`pgrep jack-rack` + +# Audio channel + +if [ ! $pid = "" ]; then + sleep 1 +else + jack-rack -n /etc/telecaster/eq_comp_limit_02.rack > /dev/null & + sleep 6 + jack_connect system:capture_1 jack_rack:in_1 + jack_connect system:capture_2 jack_rack:in_2 +fi + +qjackctl & + +edcast_jack -c /etc/telecaster/edcast_jack_local.cfg -n LIVE -p jack_rack > /dev/null & + +sleep 3 + +# MONO setup +jack_disconnect jack_rack:out_2 LIVE:in_2 +jack_connect jack_rack:out_1 LIVE:in_1 +jack_connect jack_rack:out_1 LIVE:in_2 +#jack_connect jack_rack:out_1 system:playback_1 +#jack_connect jack_rack:out_1 system:playback_2 + +# STEREO setup +#jack_connect jack_rack:out_1 LIVE:in_1 +#jack_connect jack_rack:out_2 LIVE:in_2 +#jack_connect jack_rack:out_1 system:playback_1 +#jack_connect jack_rack:out_2 system:playback_2 + +# Start safe DeeFuzzer +deefuzzer /etc/telecaster/deefuzzer_audio_safe.xml > /dev/null & diff --git a/conf/home/fluxbox/tc_video_start.sh b/conf/home/fluxbox/tc_video_start.sh new file mode 100755 index 0000000..07783ee --- /dev/null +++ b/conf/home/fluxbox/tc_video_start.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +# Start TeleCaster video channel + +/home/telecaster/.fluxbox/telecaster/tc_video_simple_webm_stream.sh > /dev/null & + +sleep 3 + +jack_disconnect system:capture_1 gst-launch-0.10:in_jackaudiosrc0_1 +jack_connect jack_rack:out_1 gst-launch-0.10:in_jackaudiosrc0_1 + +deefuzzer /etc/telecaster/deefuzzer_video_safe.xml > /dev/null & diff --git a/conf/home/fluxbox/telecaster/ffmpeg_dv_jack_fifo_shout b/conf/home/fluxbox/telecaster/ffmpeg_dv_jack_fifo_shout new file mode 100755 index 0000000..07075a1 --- /dev/null +++ b/conf/home/fluxbox/telecaster/ffmpeg_dv_jack_fifo_shout @@ -0,0 +1,37 @@ +#!/bin/bash + +set -e + +case "$1" in + start) + fifo=/tmp/video_fifo + if [ ! -e $fifo ]; then + mkfifo $fifo + fi + + dir=/mnt/data1/video_tests + now=`date -R` + + dvgrab -buffers 1 - | ffmpeg -f dv -i - -f jack -i ffmpeg -vcodec libtheora -s 480x320 -aspect 16:9 -acodec libvorbis -b 300k -f ogg -y $fifo -map 0.0 -map 1.0 & + + sleep 5 + jack_connect jack_rack:out_1 ffmpeg:input_1 + jack_connect jack_rack:out_2 ffmpeg:input_2 + #jack_connect jack_rack:out_1 ffmpeg:input_1 + #jack_connect jack_rack:out_2 ffmpeg:input_2 + + sleep 1 + cat $fifo | tee "$dir/Pre-Barreau_-_Augustins_-_Video_Live_-_$now.ogg" | oggfwd -d "pb_video_live" -g "Teaching" -n "pb_video_live" localhost 8000 source2parisson /pb_video_live.ogg & + ;; + + stop) + jack_disconnect jack_rack:out_1 ffmpeg:input_1 + jack_disconnect jack_rack:out_2 ffmpeg:input_2 + pkill ffmpeg + ;; +esac + + + + + diff --git a/conf/home/fluxbox/telecaster/ffmpeg_usb_jack_fifo_shout b/conf/home/fluxbox/telecaster/ffmpeg_usb_jack_fifo_shout new file mode 100755 index 0000000..47fe2ed --- /dev/null +++ b/conf/home/fluxbox/telecaster/ffmpeg_usb_jack_fifo_shout @@ -0,0 +1,37 @@ +#!/bin/bash + + set -e + +case "$1" in + start) + fifo=/tmp/video_fifo2 + if [ ! -e $fifo ]; then + mkfifo $fifo + fi + + dir=$HOME/archives/2011 + now=`date -R` + file=$dir/video_test2.ogg + + ffmpeg -f video4linux2 -i /dev/video0 -f jack -i ffmpeg -itsoffset 00:00:00.8 -r 20 -f ogg -vcodec libtheora -s 320x240 -b 380k -acodec libvorbis -ab 64k -ar 44100 -ac 1 -y $file -map 0.0 -map 1.0 & + + sleep 3 + jack_connect jack_rack:out_1 ffmpeg:input_1 + #jack_connect jack_rack:out_1 ffmpeg:input_2 + + sleep 2 + cat $file | tee $file.ogg | oggfwd -d "TeleCaster Live Video Services" -g "Vocal" -n "TeleCaster Live Video" localhost 8000 source2parisson /telecaster_live_video.ogg & + ;; + + stop) + jack_disconnect jack_rack:out_1 ffmpeg:input_1 +# jack_disconnect jack_rack:out_1 ffmpeg:input_2 + pkill -9 ffmpeg + ;; +esac + + + + + +# http://www.kkoncepts.net/node/69 \ No newline at end of file diff --git a/conf/home/fluxbox/telecaster/gst_dv_jack_shout b/conf/home/fluxbox/telecaster/gst_dv_jack_shout new file mode 100755 index 0000000..ef59dfc --- /dev/null +++ b/conf/home/fluxbox/telecaster/gst_dv_jack_shout @@ -0,0 +1,7 @@ +#!/bin/bash + +gst-launch-0.10 dv1394src ! queue ! dvdemux name=d ! queue ! dvdec \ + ! queue ! videoscale ! video/x-raw-yuv, width=480, height=368 \ + ! queue ! ffmpegcolorspace ! theoraenc bitrate=500 ! muxout. \ + oggmux name=muxout \ + ! queue ! shout2send mount=/telecaster_live_video.ogg port=8000 password=source2parisson ip=127.0.0.1 \ diff --git a/conf/home/fluxbox/telecaster/gst_video_double_shout b/conf/home/fluxbox/telecaster/gst_video_double_shout new file mode 100755 index 0000000..246d01e --- /dev/null +++ b/conf/home/fluxbox/telecaster/gst_video_double_shout @@ -0,0 +1,3 @@ +#!/bin/bash + +gst-launch v4l2src device=/dev/video0 ! videoscale ! video/x-raw-yuv, width=160, height=120 ! videomixer name=mix sink_1::xpos=20 sink_1::ypos=20 sink_1::alpha=0.9 ! queue ! ffmpegcolorspace ! theoraenc quality=40 ! muxout. jackaudiosrc connect=1 ! audioconvert ! audio/x-raw-int,rate=44100,channels=1,width=16 ! queue ! audioconvert ! vorbisenc ! queue ! muxout. oggmux name=muxout ! tee name=t ! queue ! filesink location="video_test.ogg" t. ! queue ! shout2send mount=/telecaster_live_video.ogg port=8000 password=source2parisson ip=127.0.0.1 v4l2src device=/dev/video1 ! videoscale ! video/x-raw-yuv, width=480, height=270 ! mix. diff --git a/conf/home/fluxbox/telecaster/gst_video_double_shout2.sh b/conf/home/fluxbox/telecaster/gst_video_double_shout2.sh new file mode 100755 index 0000000..cd25b51 --- /dev/null +++ b/conf/home/fluxbox/telecaster/gst_video_double_shout2.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +# Start TeleCaster video channel + +WIDTH=480 +HEIGHT=270 + +gst-launch v4l2src device=/dev/video0 ! queue ! videoscale ! video/x-raw-yuv, width=160, height=120 \ + ! queue ! videorate ! video/x-raw-yuv,framerate=25/1 \ + ! queue ! videomixer name=mix sink_1::xpos=0 sink_1::ypos=0 sink_1::alpha=0.9 \ + ! queue ! ffmpegcolorspace ! queue ! theoraenc quality=25 ! muxout. \ + jackaudiosrc connect=1 ! audioconvert ! audio/x-raw-int,rate=44100,channels=1,width=16 \ + ! queue ! audioconvert ! vorbisenc ! queue ! muxout. \ + oggmux name=muxout ! queue ! shout2send mount=/telecaster_live_video.ogg port=8000 password=source2parisson ip=127.0.0.1 \ + v4l2src device=/dev/video1 ! queue ! videoscale ! video/x-raw-yuv, width=$WIDTH, height=$HEIGHT \ + ! queue ! videorate ! video/x-raw-yuv,framerate=25/1 ! mix. \ + > /dev/null & + +sleep 2 + +jack_disconnect system:capture_1 gst-launch-0.10:in_jackaudiosrc0_1 +jack_connect jack_rack:out_1 gst-launch-0.10:in_jackaudiosrc0_1 + diff --git a/conf/home/fluxbox/telecaster/gst_video_jack_fifo_shout b/conf/home/fluxbox/telecaster/gst_video_jack_fifo_shout new file mode 100755 index 0000000..1c19e27 --- /dev/null +++ b/conf/home/fluxbox/telecaster/gst_video_jack_fifo_shout @@ -0,0 +1,24 @@ +#!/bin/bash + +set -e + +case "$1" in + start) + dir=/home/$USER/trash + dat=`date '+%y-%m-%d-%H:%M:%S'` + file=$dir/video_test_$dat.ogg + + gst-launch-0.10 v4l2src device=/dev/video0 ! queue ! videorate ! video/x-raw-yuv,width=320 ! queue ! theoraenc quality=60 ! queue ! muxout. jackaudiosrc connect=1 ! audioconvert ! audio/x-raw-int,rate=44100,channels=1,width=16 ! queue ! audioconvert ! vorbisenc ! queue ! muxout. oggmux name=muxout ! filesink location=$file sync=true & + +# gst-launch v4l2src ! queue ! videorate ! video/x-raw-yuv,fps=30,width=320 ! queue ! theoraenc quality=60 ! queue ! muxout. jackaudiosrc connect=1 ! audioconvert ! audio/x-raw-int,rate=44100,channels=1,width=16 ! queue ! audioconvert ! vorbisenc ! queue ! muxout. oggmux name=muxout ! shout2send mount=/telecaster_live_video.ogg port=8000 password=source2parisson ip=127.0.0.1 & + +# + sleep 10 + cat $file | oggfwd -d "TeleCaster Live Video Services" -g "Vocal" -n "TeleCaster Live Video" localhost 8000 source2parisson /telecaster_live_video.ogg & + ;; + + stop) + pkill -9 oggfwd + pkill -9 gst-launch-0.10 + ;; +esac diff --git a/conf/home/fluxbox/telecaster/gst_video_jack_shout b/conf/home/fluxbox/telecaster/gst_video_jack_shout new file mode 100755 index 0000000..f5d25ba --- /dev/null +++ b/conf/home/fluxbox/telecaster/gst_video_jack_shout @@ -0,0 +1,24 @@ +#!/bin/bash + +set -e + +case "$1" in + start) + dir=/home/$USER/trash + dat=`date '+%y-%m-%d-%H:%M:%S'` + file=$dir/video_test_$dat.ogg + +# gst-launch-0.10 v4l2src device=/dev/video0 ! queue ! videorate ! video/x-raw-yuv,width=320 ! queue ! theoraenc quality=60 ! queue ! muxout. jackaudiosrc connect=1 ! audioconvert ! audio/x-raw-int,rate=44100,channels=1,width=16 ! queue ! audioconvert ! vorbisenc ! queue ! muxout. oggmux name=muxout ! filesink location=$file sync=true & + + gst-launch-0.10 v4l2src ! queue ! videorate ! video/x-raw-yuv,fps=30,width=320 ! queue ! theoraenc quality=60 ! queue ! muxout. jackaudiosrc connect=1 ! audioconvert ! audio/x-raw-int,rate=44100,channels=1,width=16 ! queue ! audioconvert ! vorbisenc ! queue ! muxout. oggmux name=muxout ! shout2send mount=/telecaster_live_video.ogg port=8000 password=source2parisson ip=127.0.0.1 & + +# +# sleep 10 +# cat $file | oggfwd -d "TeleCaster Live Video Services" -g "Vocal" -n "TeleCaster Live Video" localhost 8000 source2parisson /telecaster_live_video.ogg & + ;; + + stop) + pkill -9 oggfwd + pkill -9 gst-launch-0.10 + ;; +esac diff --git a/conf/home/fluxbox/telecaster/gst_video_simple_ogg b/conf/home/fluxbox/telecaster/gst_video_simple_ogg new file mode 100755 index 0000000..af63af4 --- /dev/null +++ b/conf/home/fluxbox/telecaster/gst_video_simple_ogg @@ -0,0 +1,11 @@ +#!/bin/bash + +gst-launch v4l2src device=/dev/video0 ! video/x-raw-yuv,width=640, height=480 \ + ! queue ! ffmpegcolorspace \ + ! queue ! theoraenc quality=20 ! mux. \ + alsasrc device=hw:0,0 ! audio/x-raw-int,rate=44100,channels=2,depth=16 \ + ! queue ! audioconvert ! audio/x-raw-float,rate=44100,channels=2,depth=16 ! queue ! vorbisenc ! mux. \ + oggmux name=mux ! filesink location=/var/www/test/test.ogg \ + +# ! queue ! videorate ! video/x-raw-yuv, framerate=25/1 \ +#jackaudiosrc connect=1 ! queue ! audioconvert ! audio/x-raw-int,rate=44100,channels=1,width=16 \ No newline at end of file diff --git a/conf/home/fluxbox/telecaster/gst_video_simple_ogg_jack b/conf/home/fluxbox/telecaster/gst_video_simple_ogg_jack new file mode 100755 index 0000000..69d2091 --- /dev/null +++ b/conf/home/fluxbox/telecaster/gst_video_simple_ogg_jack @@ -0,0 +1,9 @@ +#!/bin/bash + +gst-launch v4l2src device=/dev/video0 ! video/x-raw-yuv,width=640, height=480 \ + ! queue ! ffmpegcolorspace \ + ! queue ! theoraenc quality=25 ! mux. \ + jackaudiosrc connect=1 ! queue ! audioconvert ! queue ! vorbisenc ! mux. \ + oggmux name=mux ! filesink location=/var/www/test/test.ogg \ + +# ! queue ! videorate ! video/x-raw-yuv, framerate=25/1 \ diff --git a/conf/home/fluxbox/telecaster/gst_video_triple_shout b/conf/home/fluxbox/telecaster/gst_video_triple_shout new file mode 100755 index 0000000..d6aeec8 --- /dev/null +++ b/conf/home/fluxbox/telecaster/gst_video_triple_shout @@ -0,0 +1,11 @@ +#!/bin/bash + +gst-launch v4l2src device=/dev/video0 ! queue ! videoscale ! video/x-raw-yuv, width=160, height=120 \ + ! queue ! ffmpegcolorspace ! video/x-raw-rgb \ + ! queue ! videomixer name=mix \ + sink_1::xpos=40 sink_1::ypos=60 sink_1::alpha=0.9 sink_2::xpos=40 sink_2::ypos=180 sink_2::alpha=0.9 \ + ! queue ! videoscale ! video/x-raw-rgb, width=480, height=270 \ + ! queue ! ffmpegcolorspace ! theoraenc quality=10 ! oggmux name=muxout \ + ! queue ! shout2send mount=/telecaster_live_video.ogg port=8000 password=source2parisson ip=127.0.0.1 \ + ximagesrc ! queue ! videorate ! video/x-raw-rgb, framerate=30/1 ! videoscale ! video/x-raw-rgb, width=160, height=120 ! mix. \ + v4l2src device=/dev/video1 ! queue ! ffmpegcolorspace ! video/x-raw-rgb ! videoscale ! video/x-raw-rgb, width=640, height=360 ! mix. \ \ No newline at end of file diff --git a/conf/home/fluxbox/telecaster/tc_flu_simple_webm.sh b/conf/home/fluxbox/telecaster/tc_flu_simple_webm.sh new file mode 100755 index 0000000..e86ca98 --- /dev/null +++ b/conf/home/fluxbox/telecaster/tc_flu_simple_webm.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +# Start TeleCaster video channel + +WIDTH=640 +HEIGHT=360 +#WIDTH=1024 +#HEIGHT=576 + + +pipe="v4l2src device=/dev/video0 \ + ! vp8-encoder ! muxout. \ + jackaudiosrc ! vorbis-encoder ! muxout. \ + webmmux streamable=true name=muxout" + +flumotion-launch pipeline-producer pipeline=$pipe ! http-streamer port=8800 + +sleep 2 + +jack_disconnect system:capture_1 flumotion-launch:in_jackaudiosrc0_1 +jack_connect jack_rack:out_1 flumotion-launch:in_jackaudiosrc0_1 + diff --git a/conf/home/fluxbox/telecaster/tc_video_simple_file.sh b/conf/home/fluxbox/telecaster/tc_video_simple_file.sh new file mode 100755 index 0000000..181dd2f --- /dev/null +++ b/conf/home/fluxbox/telecaster/tc_video_simple_file.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +# Start TeleCaster video channel + +WIDTH=432 +HEIGHT=240 + +gst-launch v4l2src device=/dev/video0 ! video/x-raw-yuv, width=$WIDTH, height=$HEIGHT \ + ! queue ! ffmpegcolorspace \ + ! queue ! theoraenc bitrate=400 speed-level=0 ! queue ! muxout. \ + jackaudiosrc connect=1 \ + ! queue ! audioconvert ! queue ! vorbisenc ! queue ! muxout. \ + oggmux name=muxout ! filesink location=/home/telecaster/archives/test.ogg \ + > /dev/null & + +sleep 2 + +jack_disconnect system:capture_1 gst-launch-0.10:in_jackaudiosrc0_1 +jack_connect jack_rack:out_1 gst-launch-0.10:in_jackaudiosrc0_1 + diff --git a/conf/home/fluxbox/telecaster/tc_video_simple_file_webm.sh b/conf/home/fluxbox/telecaster/tc_video_simple_file_webm.sh new file mode 100755 index 0000000..d08dc06 --- /dev/null +++ b/conf/home/fluxbox/telecaster/tc_video_simple_file_webm.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +# Start TeleCaster video channel + +WIDTH=640 +HEIGHT=360 +#WIDTH=1024 +#HEIGHT=576 + +gst-launch v4l2src device=/dev/video1 ! video/x-raw-yuv, width=$WIDTH, height=$HEIGHT \ + ! queue ! videoflip method=rotate-180 \ + ! queue ! ffmpegcolorspace \ + ! queue ! vp8enc speed=2 threads=2 quality=5 ! queue ! muxout. \ + jackaudiosrc connect=1 \ + ! queue ! audioconvert ! queue ! vorbisenc quality=3 ! queue ! muxout. \ + webmmux streamable=true name=muxout ! filesink location=/home/telecaster/trash/test.webm \ + > /dev/null & + +sleep 2 + +jack_disconnect system:capture_1 gst-launch-0.10:in_jackaudiosrc0_1 +jack_connect jack_rack:out_1 gst-launch-0.10:in_jackaudiosrc0_1 + diff --git a/conf/home/fluxbox/telecaster/tc_video_simple_start.sh b/conf/home/fluxbox/telecaster/tc_video_simple_start.sh new file mode 100755 index 0000000..061e290 --- /dev/null +++ b/conf/home/fluxbox/telecaster/tc_video_simple_start.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +# Start TeleCaster video channel + +WIDTH=432 +HEIGHT=240 + +gst-launch v4l2src device=/dev/video0 ! video/x-raw-yuv, width=$WIDTH, height=$HEIGHT \ + ! queue ! ffmpegcolorspace \ + ! queue ! theoraenc quality=10 ! queue ! muxout. \ + jackaudiosrc connect=1 \ + ! queue ! audioconvert ! queue ! vorbisenc quality=3 ! queue ! muxout. \ + oggmux name=muxout ! shout2send mount=/telecaster_live_video.ogg port=8000 password=source2parisson ip=127.0.0.1 \ + > /dev/null & + +sleep 2 + +jack_disconnect system:capture_1 gst-launch-0.10:in_jackaudiosrc0_1 +jack_connect jack_rack:out_1 gst-launch-0.10:in_jackaudiosrc0_1 + diff --git a/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream.sh b/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream.sh new file mode 100755 index 0000000..17bb6ea --- /dev/null +++ b/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +# Start TeleCaster video channel + +WIDTH=320 +HEIGHT=240 +#WIDTH=1024 +#HEIGHT=576 + +gst-launch v4l2src device=/dev/video0 ! video/x-raw-yuv, width=$WIDTH, height=$HEIGHT \ + ! queue ! ffmpegcolorspace \ + ! queue ! vp8enc speed=2 threads=2 quality=9.0 ! queue ! muxout. \ + jackaudiosrc connect=1 \ + ! queue ! audioconvert ! queue ! vorbisenc quality=0.3 ! queue ! muxout. \ + webmmux streamable=true name=muxout \ + ! queue ! tcpserversink host=127.0.0.1 port=9000 protocol=none \ + > /dev/null + diff --git a/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_hd.sh b/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_hd.sh new file mode 100755 index 0000000..7afd26c --- /dev/null +++ b/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_hd.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +# Start TeleCaster video channel + +WIDTH=1024 +HEIGHT=576 + +gst-launch v4l2src device=/dev/video0 ! video/x-raw-yuv, width=$WIDTH, height=$HEIGHT \ + ! queue ! videoflip method=rotate-180 \ + ! queue ! ffmpegcolorspace \ + ! queue ! vp8enc speed=2 threads=2 quality=5 ! queue ! muxout. \ + jackaudiosrc connect=1 \ + ! queue ! audioconvert ! queue ! vorbisenc quality=3 ! queue ! muxout. \ + webmmux streamable=true name=muxout \ + ! tee name=t ! queue ! tcpserversink host=127.0.0.1 port=9000 \ + t. ! queue ! filesink location=/home/telecaster/trash/test.webm \ + > /dev/null & + diff --git a/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_hd_alsa_test.sh b/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_hd_alsa_test.sh new file mode 100755 index 0000000..3894ae2 --- /dev/null +++ b/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_hd_alsa_test.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +# Start TeleCaster video channel + +WIDTH=1280 +HEIGHT=720 + +gst-launch v4l2src device=/dev/video0 ! video/x-raw-yuv, width=$WIDTH, height=$HEIGHT \ + ! queue ! ffmpegcolorspace \ + ! queue ! vp8enc speed=2 threads=1 quality=9.0 ! queue ! muxout. \ + alsasrc \ + ! queue ! audioconvert ! queue ! vorbisenc quality=0.3 ! queue ! muxout. \ + webmmux streamable=true name=muxout \ + ! queue ! tcpserversink host=127.0.0.1 port=9000 protocol=none + + + diff --git a/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_hd_jack_test.sh b/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_hd_jack_test.sh new file mode 100755 index 0000000..0cfb252 --- /dev/null +++ b/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_hd_jack_test.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +# Start TeleCaster video channel + +WIDTH=1280 +HEIGHT=720 + +gst-launch v4l2src device=/dev/video0 ! video/x-raw-yuv, width=$WIDTH, height=$HEIGHT \ + ! queue ! ffmpegcolorspace \ + ! queue ! vp8enc speed=2 threads=4 quality=9.0 ! queue ! muxout. \ + jackaudiosrc connect=1 \ + ! queue ! audioconvert ! queue ! vorbisenc quality=0.3 ! queue ! muxout. \ + webmmux streamable=true name=muxout \ + ! queue ! tcpserversink host=127.0.0.1 port=9000 protocol=none + + + diff --git a/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_hd_test.sh b/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_hd_test.sh new file mode 100755 index 0000000..8522473 --- /dev/null +++ b/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_hd_test.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +# Start TeleCaster video channel + +WIDTH=1280 +HEIGHT=720 + +gst-launch v4l2src device=/dev/video0 ! video/x-raw-yuv, width=$WIDTH, height=$HEIGHT \ + ! queue ! ffmpegcolorspace \ + ! queue ! vp8enc speed=2 threads=4 quality=9.0 \ + ! queue ! webmmux streamable=true name=muxout \ + ! queue ! tcpserversink host=127.0.0.1 port=9000 protocol=none + diff --git a/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_m.sh b/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_m.sh new file mode 100755 index 0000000..b4d8403 --- /dev/null +++ b/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_m.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +# Start TeleCaster video channel + +WIDTH=640 +HEIGHT=360 +#WIDTH=1024 +#HEIGHT=576 + +gst-launch v4l2src device=/dev/video0 ! video/x-raw-yuv, width=$WIDTH, height=$HEIGHT \ + ! queue ! videoflip method=rotate-180 \ + ! queue ! ffmpegcolorspace \ + ! queue ! vp8enc speed=2 threads=2 quality=5 ! queue ! muxout. \ + jackaudiosrc connect=1 \ + ! queue ! audioconvert ! queue ! vorbisenc quality=3 ! queue ! muxout. \ + webmmux streamable=true name=muxout \ + ! tee name=t ! queue ! multifdsink name=sink sync=false recover-policy=3 \ + t. ! queue ! filesink location=/home/telecaster/trash/test.webm \ + > /dev/null & + +sleep 2 + +jack_disconnect system:capture_1 gst-launch-0.10:in_jackaudiosrc0_1 +jack_connect jack_rack:out_1 gst-launch-0.10:in_jackaudiosrc0_1 + diff --git a/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_sd_test.sh b/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_sd_test.sh new file mode 100755 index 0000000..0fb2ce0 --- /dev/null +++ b/conf/home/fluxbox/telecaster/tc_video_simple_webm_stream_sd_test.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +# Start TeleCaster video channel + +WIDTH=800 +HEIGHT=600 + +gst-launch v4l2src device=/dev/video0 ! video/x-raw-yuv, width=$WIDTH, height=$HEIGHT \ + ! queue ! ffmpegcolorspace \ + ! queue ! vp8enc speed=2 threads=4 quality=9.0 \ + ! queue ! webmmux streamable=true name=muxout \ + ! queue ! tcpserversink host=127.0.0.1 port=9000 protocol=none + diff --git a/conf/home/fluxbox/telecaster/tc_video_simple_webm_tee.sh b/conf/home/fluxbox/telecaster/tc_video_simple_webm_tee.sh new file mode 100755 index 0000000..d006917 --- /dev/null +++ b/conf/home/fluxbox/telecaster/tc_video_simple_webm_tee.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +# Start TeleCaster video channel + +WIDTH=640 +HEIGHT=360 +#WIDTH=1024 +#HEIGHT=576 + +gst-launch v4l2src device=/dev/video0 ! video/x-raw-yuv, width=$WIDTH, height=$HEIGHT \ + ! queue ! videoflip method=rotate-180 \ + ! queue ! ffmpegcolorspace \ + ! queue ! vp8enc speed=2 threads=2 quality=9.0 ! queue ! muxout. \ + jackaudiosrc connect=1 \ + ! queue ! audioconvert ! queue ! vorbisenc quality=0.3 ! queue ! muxout. \ + webmmux streamable=true name=muxout \ + ! tee name=t ! queue ! tcpserversink host=127.0.0.1 port=9000 protocol=none \ + t. ! queue ! filesink location=/home/telecaster/trash/test.webm \ + > /dev/null & + +sleep 4 + +jack_disconnect system:capture_1 gst-launch-0.10:in_jackaudiosrc0_1 +jack_connect jack_rack:out_1 gst-launch-0.10:in_jackaudiosrc0_1 + diff --git a/conf/home/fluxbox/telecaster/x_jack_webm.sh b/conf/home/fluxbox/telecaster/x_jack_webm.sh new file mode 100755 index 0000000..8abeab6 --- /dev/null +++ b/conf/home/fluxbox/telecaster/x_jack_webm.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +# Start TeleCaster video channel + +gst-launch ximagesrc ! video/x-raw-rgb,framerate=30/1 \ + ! queue ! ffmpegcolorspace \ + ! queue ! vp8enc speed=2 threads=2 quality=9.0 ! queue ! muxout. \ + jackaudiosrc connect=1 \ + ! queue ! audioconvert ! queue ! vorbisenc quality=0.3 ! queue ! muxout. \ + webmmux streamable=true name=muxout \ + ! queue ! filesink location=/home/momo/tmp/desktop.webm + + diff --git a/conf/home/telecaster/media/mp3/silence.mp3 b/conf/home/telecaster/media/mp3/silence.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..17538c9cd3b73be1ce698666a7b0ffffe3f0479f GIT binary patch literal 40660 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 literal 0 HcmV?d00001 diff --git a/conf/usr/local/bin/rotate_desktop b/conf/usr/local/bin/rotate_desktop new file mode 100755 index 0000000..3e6abf8 --- /dev/null +++ b/conf/usr/local/bin/rotate_desktop @@ -0,0 +1,12 @@ +#!/bin/bash + +xrandrout="$(xrandr)" + +case $xrandrout in + *1024x600+0+0\ inverted\ \(* ) rotate=0; invert=0;; + *1024x600+0+0\ \(* ) rotate=2; invert=1;; +esac + +xrandr -o $rotate +xinput --set-prop 11 "Evdev Axis Inversion" $invert, $invert + diff --git a/conf/usr/share/applications/rotate_desktop.desktop b/conf/usr/share/applications/rotate_desktop.desktop new file mode 100644 index 0000000..aa85a41 --- /dev/null +++ b/conf/usr/share/applications/rotate_desktop.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=Rotate Desktop +Exec=/usr/local/bin/rotate_desktop +Icon=preferences-desktop-rotate +Type=Application +Comment=Rotate Desktop for 180 degrees with the touchscreen +GenericName=Rotate Desktop +Categories=Utility;Accessibility; +Terminal=false + diff --git a/conf/usr/share/icons/oxygen/128x128/apps/preferences-desktop-rotate.png b/conf/usr/share/icons/oxygen/128x128/apps/preferences-desktop-rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb895a03ca6e2977cd9a7ab5cd655e84904655d GIT binary patch literal 10467 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 We+&sv+V@ZlfZ_`^xk?$+kpBaO%~zTL literal 0 HcmV?d00001 diff --git a/conf/usr/share/icons/oxygen/16x16/apps/preferences-desktop-rotate.png b/conf/usr/share/icons/oxygen/16x16/apps/preferences-desktop-rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..9462513e60fc57ee531fbb5c4f61fd5b0438e09f GIT binary patch literal 1035 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ueoXKL{?^yL>WGgtNdSvY3HEdOZj;#z{?-0ST5BIHm(>utOMPj;%e+z`*p{)5S5w z;rV264R%pUJnnq+joUaBMC2fBy1!C3k)A zYOGY;xFo8#O+d@j*&|EA!ePdzuQC{ zxT1Rx_wMidY{AZu*0yTlvK3m(yfjrl9sBa7Ke4|4|L5iB|NW>+tZaSt!os3lblp11 z6_Q!sqL$3rerryi{ljyo+{JcfO5M8K^Xt>`p7Uo6=gAviu5a{WY&e|QAZVep|Ma|l zuK)M5J>S3nvhQU97Z$;#x5H1gM5mvh@y)XNVWp6?!L6G|vzN47da?aS`4eNdkE^=6 zgj~3|1TXnqoOjW_x^=#X#Jcmrn>-4Cso#44fM-+AtTjtcI0y=IX>zRUk}Ubb&HC{$pK_MES}i?-Nyy z^VYhaSf;tl_Ys4MR1k-2pg@w$gl|<_f)uArIjC@asr|&gKUE`tPVh?Y2>NMv@^pS+ zb$`u*43VUsC$5eLpxg6IC?H`*=T?=L*FnpE#FPkNfPQg}5- zmRlT$xU6f)kJ1mEZ=bupbnWx+E0DXuIw8Npu8QB#ptJ+1L}U8tAl?b@|Msl!DUQ&( z_~HG7y@xCN_uriA_*?Z|2LH)hAeg{hqwE z{C}q<3rcTRg*^Ev|9sAI%Y5NyhyLWQy!uRTf1GtrULMmFCl2{lujWcT{wwj=Yt}M` z{b$dev-6wu#4}K&o_W)jEi4W@#6q-0{rvoot9m*b|Tx{Hg8zrKC@ z_V2G%f2AHTV>yAsYHc_rC&aVDNPHb6Mw<&;$TZYrjJP literal 0 HcmV?d00001 diff --git a/conf/usr/share/icons/oxygen/22x22/apps/preferences-desktop-rotate.png b/conf/usr/share/icons/oxygen/22x22/apps/preferences-desktop-rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..5fe835eb23be5ccdb0992a4331d924318a927cc9 GIT binary patch literal 1508 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 DMAZch literal 0 HcmV?d00001 diff --git a/conf/usr/share/icons/oxygen/48x48/apps/preferences-desktop-rotate.png b/conf/usr/share/icons/oxygen/48x48/apps/preferences-desktop-rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..5e909be53ee77dd52ca1ebab79a64b1d73860c90 GIT binary patch literal 3506 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 t7+M(^JegFv2}MJ0eoAIqCAtO!D+6 and ## Rds and ## Guillaume Pellerin -## All rights reserved. +## All rights reserved. ## ## Redistribution and use in source and binary forms, with or without ## modification, are permitted provided that the following conditions @@ -18,7 +18,7 @@ ## notice, this list of conditions and the following disclaimer in the ## documentation and/or other materials provided with the distribution. ## 3. The name of the author may not be used to endorse or promote products -## derived from this software without specific prior written permission. +## derived from this software without specific prior written permission. ## ## THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR ## IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -86,7 +86,7 @@ class AcpiError(Exception): class Acpi: """Interface class for ACPI""" - + def __init__(self): res = sys.platform if res.find("freebsd4") > -1: @@ -96,28 +96,28 @@ class Acpi: elif res.find("netbsd1") > -1: self.acpi = None #throw exception raise AcpiError, ERR_NOT_IMPLEMENTED - + elif res.find("linux2") > -1: self.acpi = AcpiLinux() - + elif res.find("linux") > -1: #some systems return linux instead of linux2. We should #show a warning or check by ourselves for Linux2 self.acpi = AcpiLinux() - + else: self.acpi = None #throw exception (os unknown) raise AcpiError, ERR_NOT_IMPLEMENTED - + def identity(self): """Returns the identity of this module""" return "acpi.py" - + def version(self): """Returns the version of this module""" return VERSION - + def update(self): """Updates the ACPI state""" self.acpi.update() @@ -137,7 +137,7 @@ class Acpi: def charging_state(self): """Returns ac state (off-/online/charging)""" return self.acpi.charging_state() - + def estimated_lifetime(self): """Returns Estimated Lifetime as real number""" return self.acpi.estimated_lifetime() @@ -173,14 +173,17 @@ class AcpiLinux: """init ACPI class and check for any ACPI features in /proc/acpi/""" #we read all acpi stuff from here - self.proc_acpi_dir = "/proc/acpi" - #self.proc_acpi_dir = "/home/riemer/main/ACPI/proc/acpi" - + dirs = ['/proc/acpi/ibm'] + for dir in dirs: + if os.path.exists(dir): + self.proc_acpi_dir = dir + break + self.init_batteries() self.init_fans() #self.init_processors() self.init_temperatures() - + self.update() @@ -211,7 +214,7 @@ class AcpiLinux: except OSError: self.ac_line_state = ONLINE # no batteries: we assume that a cable is plugged in ;-) return #nothing more to do - + try: for i in battery_dir_entries: @@ -224,7 +227,7 @@ class AcpiLinux: # the batteries which we could stat # because the appended dirs should be okay we do not return here pass - + self.ac_line_state = OFFLINE #later: the newer acpi versions seems to generate always two BAT dirs... @@ -234,7 +237,7 @@ class AcpiLinux: #print self.proc_battery_dir + "/" + i + "/info" info_file = open(self.proc_battery_dir + "/" + i + "/info") line = info_file.readline() - + while len(line) != 0: if line.find("last full capacity:") == 0: cap = line.split(":")[1].strip() @@ -243,7 +246,7 @@ class AcpiLinux: except ValueError: #no value --> conversion to int failed self.design_capacity[i] = 0 - + line = info_file.readline() info_file.close() except IOError: @@ -291,21 +294,21 @@ class AcpiLinux: else: self.ac_line_state = ONLINE - # Read the present energy consumption to - # estimate life time + # Read the present energy consumption to + # estimate life time if line.find("present rate:") == 0: try: pr_rate = float(line.split(":")[1].strip().split("m")[0].strip()) except ValueError: pr_rate = 0 - + self.present_rate[i] = pr_rate line = state_file.readline() state_file.close() except IOError: - raise AcpiError, ERR_CONFIGURATION_CHANGED + raise AcpiError, ERR_CONFIGURATION_CHANGED # maybe we should restart init_batteries instead of generating an error ? # the user may have unplugged the battery. @@ -313,12 +316,12 @@ class AcpiLinux: # I prefer raising an exception because we would run into a recursion of # member funcs what is not a good idea. # the case that this error occurs should be very rare - + def init_temperatures(self): """Initializes temperature stuff""" - self.proc_thermal_dir = self.proc_acpi_dir + "/thermal_zone" + self.proc_thermal_dir = self.proc_acpi_dir # empty list implies no thermal feature supported self.temperatures = {} @@ -334,8 +337,7 @@ class AcpiLinux: try: for i in thermal_dir_entries: - mode = os.stat(self.proc_thermal_dir + "/" + i)[stat.ST_MODE] - if stat.S_ISDIR(mode): + if i == 'thermal': self.thermal_dir_entries.append(i) except OSError: # the thermal module is not correctly loaded, or is broken. @@ -348,17 +350,17 @@ class AcpiLinux: try: for i in self.thermal_dir_entries: - file = open(self.proc_thermal_dir + "/" + i + "/temperature") + file = open(self.proc_thermal_dir + "/" + i) line = file.readline() while len(line) != 0: if line.find("temperature") == 0: - self.temperatures[i] = line.split(":")[1].strip() + self.temperatures[i] = line.split(":")[1].strip().split(' ')[0] line = file.readline() file.close() except IOError: raise AcpiError,ERR_CONFIGURATION_CHANGED - + def init_fans(self): """Initialize fans""" @@ -383,11 +385,11 @@ class AcpiLinux: # the fan module is not correctly loaded, or is broken. # because the appended dirs should be okay we do not return here pass - + def update_fans(self): """Read current state of fans""" - + try: for i in self.fan_dir_entries: file = open(self.proc_fan_dir + "/" + i + "/state") @@ -445,7 +447,7 @@ class AcpiLinux: self.processor_dir_entries = [] self.perf_states = {} #reset list --> should we throw an exception? No! return - + def update_processors(self): """Read current state of processors""" @@ -475,7 +477,7 @@ class AcpiLinux: if design_capacity == 0: return 0 - + # should we use try catch instead of the check above? return (life_capacity * 100) / design_capacity @@ -490,11 +492,11 @@ class AcpiLinux: def nb_of_batteries(self): #returns the number of batteries - #if it returns 0, maybe ACPI is not available or + #if it returns 0, maybe ACPI is not available or #battery driver is not loaded return len(self.battery_dir_entries) - + def charging_state(self): return self.ac_line_state @@ -536,7 +538,7 @@ class AcpiLinux: # TODO: adapt it for multiple CPUs def set_frequency(self, f): #I think we should throw exceptions if someone goes wrong here - + if self.perf_states.has_key(f): state = self.perf_states[f] try: @@ -544,11 +546,11 @@ class AcpiLinux: except OSError: raise AcpiError, ERR_NOT_ALLOWED - try: + try: f = open("/proc/acpi/processor/"+pr+"/performance","w") except IOError: raise AcpiError, ERR_NOT_ALLOWED - + f.write(state) f.close() else: -- 2.39.5