Hola a todos, les comento que me ha dado por cambiar mi sistema operativo, y hoy por hoy ando trabajando con un Linux Elementary OS Freya. Les cuento que me parece muy bonito aunque he tenido un problema con el backlight que me ha llevado un rato solucionar. El problema es que aunque detectaba apropiadamente los hot-keys de backlight (Fn + F6 y Fn + F7 en mi latop toshiba) y el indicador de backlight se desplazaba, el brillo de la pantalla no cambiaba. Después de navegar un poco por la web encontré la solución.
Comienzo mostrándoles la versión de kernel que estoy usando.
$ uname -a
Linux yo 3.19.0-49-generic #55~14.04.1-Ubuntu SMP Fri Jan 22 11:24:31 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
Luego de eso les muestro que carpetas tengo bajo el backlight, ya que de estas tengo que elegir la que realmente trabaja con mi backlight. La que me ha funcionado es la intel_backlight
$ ls -la /sys/class/backlight/
total 0
drwxr-xr-x 2 root root 0 feb 8 21:46 .
drwxr-xr-x 59 root root 0 feb 8 21:24 ..
lrwxrwxrwx 1 root root 0 feb 8 21:24 intel_backlight -> ../../devices/pci0000:00/0000:00:02.0/drm/card0/card0-LVDS-1/intel_backlight
lrwxrwxrwx 1 root root 0 feb 8 21:24 toshiba -> ../../devices/LNXSYSTM:00/LNXSYBUS:00/TOS1900:00/backlight/toshiba
Ahora voy a buscar la carpeta xorg.conf.d
$ locate xorg.conf.d
/usr/share/X11/xorg.conf.d
Bajo esta carpeta creo-edito el archivo 20-intel-conf
$ sudo nano /usr/share/X11/xorg.conf.d/20-intel.conf
Y le incluyo este codigo:
Section "Device"
Identifier "card0"
Driver "intel"
Option "Backlight" "intel_backlight"
BusID "PCI:0:2:0"
EndSection
Fíjense que en la parte del Option uso la carpeta que controla el backlight y se encuentra bajo el /sys/class/backlight, ustedes prueben con la que vaya deacuerdo a su situación.
Reinicio y listo, ya funciona el backlight... Espero y les sirva.
ComplejaMente Yo...
lunes, 8 de febrero de 2016
lunes, 25 de enero de 2016
¿Cómo eliminar el último caracter de un string en Python?
Hola a todos, pues tuve esta necesidad en esta semana y me parecio buena idea apuntarla aquí, espero les sirva.
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> cadena = "Hola a todos, saludos cordiales..."
>>> temp = len(cadena)
>>> cadena1 = cadena[:temp - 1]
>>> cadena2 = cadena[:temp - 2]
>>> cadena3 = cadena[:temp - 3]
>>> print cadena1
Hola a todos, saludos cordiales..
>>> print cadena2
Hola a todos, saludos cordiales.
>>> print cadena3
Hola a todos, saludos cordiales
lunes, 18 de enero de 2016
Usando appsrc de Gstreamer-1.0 en python
Hola amigos, pues hace un par de días atrás estuve haciendo un proyecto donde necesitaba usar appsrc de gstreamer-1.0 en python y por más que busqué algún ejemplo para aprender como usarlo pues no lo encontré, así es que aquí lo publico por si alguien más lo necesita. Sin más que decir, pues aquí les escribo un pequeño ejemplo.
Les decribo el programa que está publicado. Como fuente vamos a utilizar un archivo wav, ya que su contenido es lo más parecido a un tipo raw, las características de archivo son 16LE, 2ch, 44.1 kHz. Lo que obtengamos de este archivo nos va a servir para alimentar nuetro pipeline de gstreamer. Después vamos ha convertir este archivo de 2 canales a 1 solo canal para posteriormente hacer un downsample y al final del proceso quede en un formato de 16LE, 1ch, 16 kHz y lo escucharemos por la salida de audio de nuestro PC.
Este es el archivo inicial:
$ soxi ~/Music/Toninho\ Horta\ _\ Jack\ Lee/Track\ 9.wav
Input File : '~/Music/Toninho Horta _ Jack Lee/Track 9.wav' Channels : 2 Sample Rate : 44100 Precision : 16-bit
Duration : 00:05:00.84 = 13267044
samples = 22563 CDDA sectors
File Size : 53.1M
Bit Rate : 1.41M
Sample Encoding: 16-bit Signed Integer PCM
Este es el archivo python que vamos a usar:
# -*- coding: utf-8 -*-
import Queue
import wave
import time
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GstApp
Gst.init(None)
class appSrcEjemplo2():
def __init__(self):
"""Creo una cola o buffer"""
self.q = Queue.Queue()
self.i = 0
self.playing = False # Me indica si el pipeline esta reproduciendo o no
"""Configurando Gstreamer"""
"""Creo un elemento tipo sample para alimentar al appsrc"""
self.audioSignal = Gst.Sample.new()
"""Creo el pipeline"""
self.play = Gst.Pipeline()
"""Creo el source"""
src = GstApp.AppSrc(format=Gst.Format.TIME, emit_signals=True)
src.connect('need-data', self.need_data, self.samples())
self.play.add(src)
"""adding capsfilter"""
capsFilterOne = Gst.ElementFactory.make("capsfilter", "capsFilterOne")
capsFilterOne.props.caps = Gst.Caps("audio/x-raw, format=(string)S16LE, rate=(int)44100, channels=(int)2")
self.play.add(capsFilterOne)
src.link(capsFilterOne)
"""Creo un audioconvert"""
audioConvert = Gst.ElementFactory.make("audioconvert")
self.play.add(audioConvert)
capsFilterOne.link(audioConvert)
"""adding capsfilter"""
capsFilterTwo = Gst.ElementFactory.make("capsfilter", "capsFilterTwo")
capsFilterTwo.props.caps = Gst.Caps("audio/x-raw, format=S16LE, rate=44100, channels=1")
self.play.add(capsFilterTwo)
audioConvert.link(capsFilterTwo)
"""Creo un audioresample"""
audioResample = Gst.ElementFactory.make("audioresample")
self.play.add(audioResample)
capsFilterTwo.link(audioResample)
"""adding capsfilter"""
capsFilterThree = Gst.ElementFactory.make("capsfilter", "capsFilterThree")
capsFilterThree.props.caps = Gst.Caps("audio/x-raw, format=S16LE, rate=16000, channels=1")
self.play.add(capsFilterThree)
audioResample.link(capsFilterThree)
"""Creo un objeto sink -> fakesink, autoaudiosink"""
sink = Gst.ElementFactory.make("autoaudiosink")
self.play.add(sink)
capsFilterThree.link(sink)
self.play.set_state(Gst.State.PAUSED)
"""Dequeue all samples"""
def samples(self):
sample = self.q.get()
if (self.q.qsize() < 2):
print "samples: Queue es pequeño"
while sample:
yield sample
sample = self.q.get()
"""write samples with Gst.AppSrc"""
def need_data(self, appsrc, length, samples):
sample = next(samples)
appsrc.set_caps(sample.get_caps())
appsrc.push_buffer(sample.get_buffer())
"""Interfaz entre la RAW_DATA y el pipeline"""
def write_raw(self,data):
self.audioBuffer = Gst.Buffer.new_wrapped(data)
self.caps = Gst.Caps.from_string("audio/x-raw, format=(string)S16LE, layout=(string)interleaved, channels=(int)2, channel-mask=(bitmask)0x0000000000000003, rate=(int)44100")
self.audioSignal=Gst.Sample.new(self.audioBuffer, self.caps, None, None)
self.q.put(self.audioSignal)
print "write_raw: El tamano de q es: ", self.q.qsize()
def set_pipeline_state(self,estado):
self.playing = False
if (estado == Gst.State.PLAYING):
self.playing = True
self.play.set_state(estado)
if __name__ == "__main__":
cliente = appSrcEjemplo2()
AUDIO_FILE = "/home/usuario/Music/Toninho Horta _ Jack Lee/Track 9.wav" #este es el path hacia el archivo wav
audio=wave.open(AUDIO_FILE)
frames = audio.readframes(882)
while frames:
cliente.write_raw(frames)
time.sleep(0.0097) # espero un momento para no saturar el buffer self.q
if (not cliente.playing):
cliente.set_pipeline_state(Gst.State.PLAYING)
frames = audio.readframes(441)
audio.close()
Como comentarios finales, les debo mencionar que sería mucho más eficiente haciéndolo en C/C++. También que lo importante es la clase appSrcEjemplo2, ya que el código del main es simplemente para generar la RAW_DATA.
Por último, no se olviden de comentar, por favor hagan sugerencias y/o correcciones (ya saben para mejorar) y no se olviden que no soy un experto, pero si en algo les puedo ayudar con gusto.
Slds
¿Quién soy yo?
Hola a todos, mi nombre es Daniel Morales y soy un curioso empedernido de todo lo relacionado con tecnología.
He abierto este blog para compartir con ustedes algunos proyectos que me han llamado la atención, así como unos pequeños "How to" de algunas cosas que si no las escribo aquí, es probable las olvide.
No me considero un experto en ninguno de los temas que se traten aquí, más bien por el contrario, si los escribo es para no olvidarlos (ya lo he dicho), para ahorrarle tiempo a alguien que se encuentre en la misma situación y para ver si a través de los comentarios alguien me sugiere nuevas entradas.
Sin más que decir me despido, gracias por visitar mi blog.
He abierto este blog para compartir con ustedes algunos proyectos que me han llamado la atención, así como unos pequeños "How to" de algunas cosas que si no las escribo aquí, es probable las olvide.
No me considero un experto en ninguno de los temas que se traten aquí, más bien por el contrario, si los escribo es para no olvidarlos (ya lo he dicho), para ahorrarle tiempo a alguien que se encuentre en la misma situación y para ver si a través de los comentarios alguien me sugiere nuevas entradas.
Sin más que decir me despido, gracias por visitar mi blog.
Suscribirse a:
Comentarios (Atom)