Distorsión en audio mp3 con flash

Hace un mes aproximadamente noté una distorsión terrible al ejecutar archivos mp3 con un cliente flash en la web, obviamente que lo asocié con el plugin para el navegador y probé forzando una versión anterior a la inestable, como no funcionó probé con las librerías de audio e incluso con pulse mismo. Lamentablemente no había podido encontrar el origen del problema hasta que hace unos días volví a buscar en Google harto de no poder sintonizar Grooveshark al estar compilando en Gentoo >.<

El problema se encuentra en una actualización de glibc, o libc6 en Debian, y sólo para 64 bits, que se origina en un cambio en la implementación de memcpy y que expone un bug en el plugin entregado por Adobe. La solución vino de las manos del mismo Torvalds y consiste en crear una librería que devuelva el funcionamiento original de memcpy.

Copiamos el siguiente código a un editor de texto y lo guardamos como mymemcpy.c

#include < sys/types.h >

    void *memcpy(void *dst, const void *src, size_t size)
    {
      void *orig = dst;
      asm volatile("rep ; movsq"
                   :"=D" (dst), "=S" (src)
                   :"0" (dst), "1" (src), "c" (size >> 3)
                   :"memory");
      asm volatile("rep ; movsb"
                   :"=D" (dst), "=S" (src)
                   :"0" (dst), "1" (src), "c" (size & 7)
                   :"memory");
      return orig;
    }

Ahora compilamos el código y creamos la librería

$ gcc -O2 -c mymemcpy.c
$ ld -G mymemcpy.o -o mymemcpy.so

Para probarlo ejecutamos lo siguiente (modifiquen la ruta conforme a su navegador)

$ LD_PRELOAD mymemcpy.so /opt/google/chrome/google-chrome &

Podríamos modificar la entrada en nuestro menú de aplicaciones para ejecutar el navegador O podríamos modificar el código que envuelve dicho llamado a la aplicación. En el caso de google-chrome se encuentra en /opt/google/chrome/
Copiamos la librería a dicha carpeta

cp mymemcpy.so /opt/google/chrome/

Ahora modificamos el wrapper con su editor de textos favorito, agregando la carga de la librería

emacs google-chrome

Aquí muestro mi código completo

#!/bin/bash
#
# Copyright (c) 2010 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.                                                                                         

# Let the wrapped binary know that it has been run through the wrapper.
export CHROME_WRAPPER="`readlink -f "$0"`"                                                                           

HERE="`dirname "$CHROME_WRAPPER"`"                                                                                   

# We include some xdg utilities next to the binary, and we want to prefer them
# over the system versions because we know they work correctly for us. But if
# our path already exists, we leave it where it is, to allow overriding this.
# (Once distributions have picked up the updated xdg-mime, we can go back to
# appending $HERE rather than prepending.)
case ":$PATH:" in
  *:$HERE:*)
    # $PATH already contains $HERE, leave it where it is.
    ;;
  *)
    # Prepend $HERE to $PATH.
    export PATH="$HERE:$PATH"
    ;;
esac                                                                                                                 

#Load Mymemcpy                                                                                                       

if [ -e $HERE/mymemcpy.so ]; then
  LD_PRELOAD=$HERE/mymemcpy.so
fi
export LD_PRELOAD
##                                                                                                                   

# Always use our versions of ffmpeg libs.
# This also makes RPMs find the compatibly-named NSS3/NSPR symlinks.
if [[ -n "$LD_LIBRARY_PATH" ]]; then
  LD_LIBRARY_PATH="$HERE:$HERE/lib:$LD_LIBRARY_PATH"
else
  LD_LIBRARY_PATH="$HERE:$HERE/lib"
fi
export LD_LIBRARY_PATH                                                                                               

export CHROME_VERSION_EXTRA="stable"                                                                                 

# We don't want bug-buddy intercepting our crashes. http://crbug.com/24120
export GNOME_DISABLE_CRASH_DIALOG=SET_BY_GOOGLE_CHROME                                                               

exec -a "$0" "$HERE/chrome" "$@"

[Actualización]
El comando 

update-flashplugin-nonfree --install

nos ahorrará todo el proceso descrito anteriormente.
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=628652
Fuente:

https://bugzilla.redhat.com/show_bug.cgi?id=638477#c38

 

 

3 thoughts on “Distorsión en audio mp3 con flash

  1. Pingback: Debian for Fedora, migrando ando ^^ « Matkiber blog

  2. Ber

    Con cd voy hasta donde está el fichero, ejecuto $ gcc -O2 -c mymemcpy.c y me sale esto: mymemcpy.c:1:25: fatal error: sys/types.h : No existe el fichero o el directorio

Comments are closed.