×
Create a new article
Write your page title here:
We currently have 3,189 articles on s23. Type your article name above or create one of the articles listed here!



    s23
    3,189Articles

    Blinken xmms: Difference between revisions

    Content added Content deleted
    imported>mutante
    m (wiki links)
    imported>Took
    mNo edit summary
     
    (28 intermediate revisions by 4 users not shown)
    Line 1: Line 1:
    ----
    <b>This page is obsolete. The new Version is here:</b> [[Blinken_XMMS]]
    ----

    == blinken_xmms ==
    == blinken_xmms ==


    Das blinken_xmms ist ein Spectrum-Analyser-Plugin für den Multimedia Player [[Xmms]]. Es sendet [[UDP]]-Pakete an 127.0.0.1:2323 im [http://wiki.blinkenarea.org/bin/view/Blinkenarea/BlinkenlightsProtocol BLP - Blinkenlights Protokoll] mit 8x18 Pixeln. Die Ausgabe kann z.B. mit [[lldrv]] auf ein [[BlinkenLEDsPro]] umgeleitet werden.
    Das blinken_xmms ist ein Spectrum-Analyser-Plugin für den Multimedia Player [[Xmms]]. Es sendet [[UDP]]-Pakete an eine konfigurierbare IP Adresse im [http://wiki.blinkenarea.org/bin/view/Blinkenarea/ExtendedBlinkenlightsProtocol EBLP - extended Blinkenlights protocol] mit 8x18 Pixeln. Die Ausgabe kann z.B. mit [[lldrv]] auf ein [[BlinkenLEDsPro]] umgeleitet werden.
    {| class="wikitable"
    |-
    ! Blinkt zu D&B Musik
    ! Konfigurations GUI
    |-
    | [[Image:BlinkenPlugin.gif]]
    | [[Image:Blinken_XMMS_GUI.png]]
    |-
    |Erstellt mit [http://blinkenlights.de/blinkentools.de.html blm2gif]
    |-
    | (Graustufen werden leider nicht konvertiert),
    |
    |}


    == Quellcode ==
    == Quellcode ==
    Den Quellcode für das XMMS-Plugin habe ich mit Hilfe von [http://dev.webreeze.de/portal/modules.php5?name=OnlineArticle&pid=5 Workshop: Vis-Plugins in XMMS] und [http://www.nobugs.org/developer/xmms/xmms-nobugs.html XMMS Plugin tutorial at nobugs.org] erstellen können. Desweiteren waren Informationen zum [http://wiki.blinkenarea.org/bin/view/Blinkenarea/BlinkenlightsProtocol BLP - Blinkenlights Protokoll] sehr nützlich. Der "Rechen-Kern" für die Visualisierung entspricht dem des [http://cvs.xmms.org/cvsweb.cgi/xmms/Visualization/sanalyzer/ spectrum] Plugins.
    Den Quellcode für das XMMS-Plugin habe ich mit Hilfe von [http://dev.webreeze.de/portal/modules.php5?name=OnlineArticle&pid=5 Workshop: Vis-Plugins in XMMS] und [http://www.nobugs.org/developer/xmms/xmms-nobugs.html XMMS Plugin tutorial at nobugs.org] erstellen können. Desweiteren waren Informationen zum [http://wiki.blinkenarea.org/bin/view/Blinkenarea/ExtendedBlinkenlightsProtocol EBLP - extended Blinkenlights protocol] sehr nützlich. Der "Rechen-Kern" für die Visualisierung entspricht dem des [http://cvs.xmms.org/cvsweb.cgi/xmms/Visualization/sanalyzer/ spectrum] Plugins.


    Jetzt mit Graustufen und Konfig-GUI!
    blinken_xmms.c


    [[:Image:Blinken_XMMS.c.txt‎ | Blinken_XMMS.c]] ! Beim Speichern --> Dateiname: Blinken_XMMS.c !


    [[:Image:blinken_xmms.h.txt‎ | blinken_xmms.h]] ! Beim Speichern --> Dateiname: blinken_xmms.h !
    <code>
    /* XMMS - Cross-platform multimedia player
    * Copyright (C) 1998-2000 Peter Alm, Mikael Alm, Olle Hallnas, Thomas Nilsson and 4Front Technologies
    *
    * This program is free software; you can redistribute it and/or modify
    * it under the terms of the GNU General Public License as published by
    * the Free Software Foundation; either version 2 of the License, or
    * (at your option) any later version.
    *
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    * GNU General Public License forore 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
    */
    // --> INSTALL:
    //gcc -Wall --shared `xmms-config --cflags` -o blinken_xmms.so blinken_xmms.c
    //install blinken_plugin.so `xmms-config --visualization-plugin-dir`
    #include <stdio.h>
    #include <xmms/plugin.h>
    #include <stdio.h>
    #include <math.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <stdlib.h> // für exit()
    #include <unistd.h> // für close()
    #include <string.h> // fürs memset()
    #include <arpa/inet.h> // fürs inet_addr()
    #define NUM_BANDS 18
    #define WIDTH 18
    #define HEIGHT 8
    #define MSG {0xDE,0xAD,0xBE,0xEF,0,0,0,0,0x00,0x012,0x00,0x08,\
    0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,\
    0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,\
    0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,\
    0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,\
    0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,\
    0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,\
    0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,\
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
    unsigned char msg[156]=MSG;
    int sock;
    static gint16 bar_heights[NUM_BANDS];
    static gdouble scale;
    void our_init();
    void our_cleanup();
    void our_playback_start();
    void our_playback_stop();
    void our_render_freq( gint16 data[1][256]);
    VisPlugin g_our_plugin =
    {
    NULL, /* handle */
    NULL, /* filename */
    0, /* session id */
    "Blinken-Plugin", /* description */
    1, /* PCM Channels */
    1, /* Freq. Channels */
    /* Callbacks ... */
    our_init, /* init */
    our_cleanup, /* cleanup */
    NULL, /* about-dialog */
    NULL, /* configure-dialog */
    NULL, /* disable-plugin */
    our_playback_start, /* playback-start */
    our_playback_stop, /* playback-top */
    NULL, /* render-pcm */
    our_render_freq /* render-freq */
    };
    VisPlugin *get_vplugin_info(void)
    {
    return( & g_our_plugin);
    }
    #define OUR_PREFIX "blinken-plugin:"
    void our_init()
    {
    if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
    {
    printf("couldn't create socket");
    our_cleanup(); // programm mit fehlercode 1 beenden
    exit(1);
    }
    // Struktur anlegen, mit Nullen initialisieren und füllen
    struct sockaddr_in dest_addr;
    memset(&dest_addr, 0, sizeof(dest_addr)); // alles mit Nullen füllen
    dest_addr.sin_family = AF_INET; // muss hier nochmal stehen
    dest_addr.sin_port = htons(2323); // auf dem Port läuft meistens HTTP
    dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP Adresse von www.example.net
    if (connect(sock, (struct sockaddr*) &dest_addr, sizeof(dest_addr)) == -1)
    {
    printf("couldn't connect to 127.0.0.1:2323");
    our_cleanup();
    exit(2); // mit fehlercode aussteigen
    }
    send(sock, msg, 156, 0);
    scale = HEIGHT / log(256);
    }
    void our_cleanup()
    {
    close(sock); // wir schließen den descriptor wieder
    }
    void our_playback_start()
    {
    //printf( OUR_PREFIX" playback_start\n");
    }
    void our_playback_stop()
    {
    unsigned char msg[156]=MSG;
    send(sock, msg, 156, 0);
    }
    void our_render_freq( gint16 data[1][256])
    {
    int result,zeile,spalte;
    int i,j,c;
    gint y;
    gint xscale[NUM_BANDS] = {0, 1, 2, 3, 5, 7, 10, 14, 20, 28, 40, 54, 74, 85, 101, 137, 140, 150};
    for(i = 0; i < NUM_BANDS; i++)
    {
    for(c = xscale[i], y = 0; c < xscale[i + 1]; c++)
    {
    if(data[0][c] > y)
    y = data[0][c];
    }
    y >>= 7;
    if(y != 0)
    {
    y = (gint)(log(y) * scale);
    if(y > HEIGHT)
    y = HEIGHT;
    }
    if(y > bar_heights[i])
    bar_heights[i] = y;
    else if(bar_heights[i] > 4)
    bar_heights[i] -= 4;
    else
    bar_heights[i] = 0;
    }
    spalte = 0;
    zeile = 0;
    for(i=12;i<=155;i++)
    {
    j = i-12;
    c = i-19;
    zeile = j/18;
    spalte = j%18;
    if((-bar_heights[spalte]+8)==8)
    {
    msg[i]=0x00;
    }
    else if((-bar_heights[spalte]+7)<=zeile)
    {
    //msg[i]=0x01;
    msg[i]=(unsigned short)(bar_heights[spalte]);
    }
    else
    {
    msg[i]=0x00;
    }
    }
    result = send(sock, msg, 156, 0);
    return;
    }


    [[:Image:configure.c.txt‎ | configure.h]] ! Beim Speichern --> Dateiname: configure.c !
    </code>


    === Blinken_XMMS.c ===

    <highlightSyntax language="c">

    /* Blinken_XMMS : for XMMS - Cross-platform multimedia player
    *
    * This program is free software; you can redistribute it and/or modify
    * it under the terms of the GNU General Public License as published by
    * the Free Software Foundation; either version 2 of the License, or
    * (at your option) any later version.
    *
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    * GNU General Public License forore details.
    *
    * You should have received a copy of the GNU General Public License
    * along with XMMS.
    */

    /* Compile:
    * gcc -Wall --shared `xmms-config --cflags` -o Blinken_XMMS.so Blinken_XMMS.c
    * Install:
    * install Blinken_XMMS.so `xmms-config --visualization-plugin-dir`
    */

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <math.h>
    #include <sys/time.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <xmms/plugin.h>
    #include <xmms/configfile.h>

    #include "./configure.c"

    #define NUM_BANDS 18
    #define WIDTH 18
    #define HEIGHT 8
    #define FRAMEDURATION 40000

    #define MSG {0xFE,0xED,0xBE,0xEF,0x00,0x00,0x00,0x00,0x00,0x012,0x00,0x08,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}

    static int sock;
    static unsigned char msg[156]=MSG;
    static unsigned char scalmsg[10] = {0x11, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0xAA, 0xCC, 0x00};

    BlinkenXmmsConfig blinken_cfg;

    static gdouble scale;
    static gint16 bar_heights[NUM_BANDS];

    void blinken_init();
    void blinken_playback_start();
    void blinken_playback_stop();
    void blinken_render_freq(gint16 data[1][256]);

    static long int timer;
    struct timeval tp;

    VisPlugin g_blinken_plugin =
    {
    NULL, /* handle */
    NULL, /* filename */
    0, /* session id */
    "Blinken_XMMS", /* description */
    0, /* PCM Channels */
    1, /* Freq. Channels */
    /* Callbacks ... */
    blinken_init, /* init */
    blinken_cleanup, /* cleanup */
    NULL, /* about-dialog */
    blinken_configure, /* configure-dialog */
    NULL, /* disable-plugin */
    blinken_playback_start, /* playback-start */
    blinken_playback_stop, /* playback-top */
    NULL, /* render-pcm */
    blinken_render_freq /* render-freq */
    };


    VisPlugin *get_vplugin_info(void)
    {
    return( & g_blinken_plugin);
    }

    /* Read current settings from the xmms config file */
    void blinken_read_config(void)
    {
    ConfigFile *cfg;
    gchar *filename;
    filename = g_strconcat(g_get_home_dir(), "/.xmms/config", NULL);
    cfg = xmms_cfg_open_file(filename);
    if (cfg)
    {
    xmms_cfg_read_string(cfg, "Blinken_XMMS", "blinkenip", &blinken_cfg.ip);
    xmms_cfg_read_int(cfg, "Blinken_XMMS", "blinkenport", &blinken_cfg.port);
    xmms_cfg_free(cfg);
    }
    g_free(filename);
    if (blinken_cfg.ip==NULL) {
    blinken_cfg.ip = g_strdup("127.0.0.1");
    blinken_cfg.port = 2323;
    }
    }

    /* Save current settings to the xmms config file */
    void blinken_save_config(void)
    {
    ConfigFile *cfgfile;
    gchar *filename;

    filename = g_strconcat(g_get_home_dir(), "/.xmms/config", NULL);
    cfgfile = xmms_cfg_open_file(filename);
    if (!cfgfile)
    cfgfile = xmms_cfg_new();
    xmms_cfg_write_string(cfgfile, "Blinken_XMMS", "blinkenip", blinken_cfg.ip);
    xmms_cfg_write_int(cfgfile, "Blinken_XMMS", "blinkenport", blinken_cfg.port);
    xmms_cfg_write_file(cfgfile, filename);
    xmms_cfg_free(cfgfile);
    g_free(filename);
    }

    void blinken_udp_init(void)
    {
    if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
    {
    printf("couldn't create socket");
    blinken_cleanup();
    exit(1);
    }
    struct sockaddr_in dest_addr;
    memset(&dest_addr, 0, sizeof(dest_addr));
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(blinken_cfg.port);
    dest_addr.sin_addr.s_addr = inet_addr(blinken_cfg.ip);

    if (connect(sock, (struct sockaddr*) &dest_addr, sizeof(dest_addr)) == -1)
    {
    printf("couldn't connect to %s:%d\n",blinken_cfg.ip,blinken_cfg.port);
    blinken_configure();
    blinken_cleanup();
    exit(2);
    }

    //printf("connected to %s:%d\n",blinken_cfg.ip,blinken_cfg.port);
    send(sock, msg, 156, 0);
    }

    void blinken_init()
    {
    if (blinken_cfg.ip==NULL)
    blinken_read_config();
    blinken_udp_init();
    scale = (HEIGHT + 1)/ log(256);
    }

    void blinken_cleanup()
    {
    close(sock);
    }


    void blinken_playback_start()
    {
    gettimeofday(&tp,NULL);
    timer=tp.tv_usec;
    //printf( "playback_start\n");
    }


    void blinken_playback_stop()
    {
    unsigned char msg[156]=MSG;
    send(sock, msg, 156, 0);
    }


    void blinken_render_freq( gint16 data[1][256])
    {
    gettimeofday(&tp,NULL);
    if ((tp.tv_usec-timer)<FRAMEDURATION && (tp.tv_usec-timer)>0)
    return;
    //printf( "playback_run %ld\n",tp.tv_usec-timer);
    timer=tp.tv_usec;
    int result,zeile,spalte;
    int i,j,c;
    gint y;
    gint xscale[NUM_BANDS] = {0, 1, 2, 3, 5, 7, 10, 14, 20, 28, 40, 54, 74, 85, 101, 137, 140, 150};

    for(i = 0; i < NUM_BANDS; i++)
    {
    for(c = xscale[i], y = 0; c < xscale[i + 1]; c++)
    {
    if(data[0][c] > y)
    {
    y = data[0][c];
    }

    }

    y >>= 7;
    if(y != 0)
    {
    y = (gint)(log(y) * scale);
    if(y > HEIGHT+1)
    {
    y = HEIGHT+1;
    }


    }

    bar_heights[i] = -y+9;

    }

    spalte = 0;
    zeile = 0;
    for(i=12;i<=155;i++)
    {
    j = i-12;
    zeile = j/18;
    spalte = j%18;

    if((bar_heights[spalte])==zeile+1)
    {
    msg[i]=0xFF;
    }
    else if((bar_heights[spalte])<zeile+1)
    {
    msg[i]=scalmsg[bar_heights[spalte]];
    }
    else
    {
    msg[i]=0x00;
    }

    }

    result = send(sock, msg, 156, 0);
    return;
    }

    </highlightSyntax>


    === blinken_xmms.h ===

    <highlightSyntax language="c">

    extern void blinken_udp_init();
    extern void blinken_cleanup();

    extern void blinken_configure(void);
    extern void blinken_read_config(void);
    extern void blinken_save_config(void);

    typedef struct
    {
    gchar *ip;
    gint port;
    } BlinkenXmmsConfig;

    extern BlinkenXmmsConfig blinken_cfg;

    </highlightSyntax>


    === configure.h ===

    <highlightSyntax language="c">

    #include <gtk/gtk.h>

    #include "blinken_xmms.h"

    static GtkWidget *configure_win = NULL;
    static GtkWidget *vbox, *options_frame, *options_vbox;
    static GtkWidget *bbox, *ok, *cancel;

    static GtkWidget *dev_ip, *dev_port;

    static void configure_ok(GtkWidget *w, gpointer data)
    {
    blinken_cfg.ip = g_strdup(gtk_entry_get_text(GTK_ENTRY(dev_ip)));
    blinken_cfg.port = atoi(gtk_entry_get_text(GTK_ENTRY(dev_port)));
    printf("ip: %s\nport: %d\n",blinken_cfg.ip,blinken_cfg.port);
    blinken_cleanup();
    blinken_udp_init();
    blinken_save_config();
    gtk_widget_destroy(configure_win);
    }

    void blinken_configure (void)
    {
    GtkWidget *frame, *table, *label, *label_port;
    if(configure_win)
    return;

    blinken_read_config();

    configure_win = gtk_window_new(GTK_WINDOW_DIALOG);
    gtk_container_set_border_width(GTK_CONTAINER(configure_win), 10);
    gtk_window_set_title(GTK_WINDOW(configure_win), ("Blinken XMMS configuration"));
    gtk_window_set_policy(GTK_WINDOW(configure_win), FALSE, FALSE, FALSE);
    gtk_window_set_position(GTK_WINDOW(configure_win), GTK_WIN_POS_MOUSE);
    gtk_signal_connect(GTK_OBJECT(configure_win), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed),
    &configure_win);

    vbox = gtk_vbox_new(FALSE, 5);

    options_frame = gtk_frame_new(("Options:"));
    gtk_container_set_border_width(GTK_CONTAINER(options_frame), 5);

    options_vbox = gtk_vbox_new(FALSE, 5);
    gtk_container_set_border_width(GTK_CONTAINER(options_vbox), 5);

    frame = gtk_frame_new(("Connection"));
    gtk_box_pack_start(GTK_BOX(options_vbox), frame, FALSE, FALSE, 0);

    table = gtk_table_new(2, 1, FALSE);
    gtk_container_set_border_width(GTK_CONTAINER(table), 5);
    gtk_container_add(GTK_CONTAINER(frame), table);
    gtk_table_set_row_spacings(GTK_TABLE(table), 5);
    gtk_table_set_col_spacings(GTK_TABLE(table), 5);

    label = gtk_label_new(("IP Adr.:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
    gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
    gtk_widget_show(label);

    dev_ip = gtk_entry_new();
    gtk_entry_set_text(GTK_ENTRY(dev_ip), blinken_cfg.ip);
    gtk_table_attach_defaults(GTK_TABLE(table), dev_ip, 1, 2, 0, 1);
    gtk_widget_show(dev_ip);

    label_port = gtk_label_new(("Port:"));
    gtk_misc_set_alignment(GTK_MISC(label_port), 1.0, 0.5);
    gtk_table_attach_defaults(GTK_TABLE(table), label_port, 0, 1, 1, 2);
    gtk_widget_show(label_port);

    dev_port = gtk_entry_new();
    gtk_entry_set_text(GTK_ENTRY(dev_port), g_strdup_printf("%d", blinken_cfg.port));
    gtk_table_attach_defaults(GTK_TABLE(table), dev_port, 1, 2, 1, 2);
    gtk_widget_show(dev_port);

    gtk_widget_show(table);
    gtk_widget_show(frame);

    gtk_container_add(GTK_CONTAINER(options_frame), options_vbox);
    gtk_widget_show(options_vbox);

    gtk_box_pack_start(GTK_BOX(vbox), options_frame, TRUE, TRUE, 0);
    gtk_widget_show(options_frame);

    bbox = gtk_hbutton_box_new();
    gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
    gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
    gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);

    ok = gtk_button_new_with_label(("OK"));
    gtk_signal_connect(GTK_OBJECT(ok), "clicked", GTK_SIGNAL_FUNC(configure_ok), NULL);
    GTK_WIDGET_SET_FLAGS(ok, GTK_CAN_DEFAULT);
    gtk_box_pack_start(GTK_BOX(bbox), ok, TRUE, TRUE, 0);
    gtk_widget_show(ok);

    cancel = gtk_button_new_with_label(("Cancel"));
    gtk_signal_connect_object(GTK_OBJECT(cancel), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy),
    GTK_OBJECT(configure_win));
    GTK_WIDGET_SET_FLAGS(cancel, GTK_CAN_DEFAULT);
    gtk_box_pack_start(GTK_BOX(bbox), cancel, TRUE, TRUE, 0);
    gtk_widget_show(cancel);
    gtk_widget_show(bbox);
    gtk_container_add(GTK_CONTAINER(configure_win), vbox);
    gtk_widget_show(vbox);
    gtk_widget_show(configure_win);
    gtk_widget_grab_default(ok);
    }


    </highlightSyntax>


    == Installation ==
    == Installation ==
    gcc -Wall --shared `xmms-config --cflags` -o blinken_xmms.so blinken_xmms.c
    [[gcc]] -Wall --shared `xmms-config --cflags` -o Blinken_XMMS.so Blinken_XMMS.c


    install blinken_plugin.so `xmms-config --visualization-plugin-dir`
    install Blinken_XMMS.so `xmms-config --visualization-plugin-dir`


    Evtl. ist das dev. Paket von xmms erforderlich.
    Evtl. ist das dev. Paket von xmms erforderlich.
    Line 219: Line 446:
    Nun kann man mit einem Rechtsklick auf das XMMS-Fenster im Menü: Visualisierung-->Visualisierungs-Plugins
    Nun kann man mit einem Rechtsklick auf das XMMS-Fenster im Menü: Visualisierung-->Visualisierungs-Plugins


    Blinken_XMMS
    Blinken-Plugin


    auswählen. Um den UDP-Stream umzuleiten kann z.B
    auswählen. Mit einem Klick auf den Konfigurationsknopf ist es möglich die Ziel- IP Adresse und Port einzutragen. Um den UDP-Stream umzuleiten kann z.B


    ./BlinkenOutput -l 2323 -d /dev/lldrv
    ./BlinkenOutput -l 2323 -d /dev/[[lldrv]]


    benutzt werden.
    benutzt werden.


    == Links ==

    [[Blinken_XMMS|download source]]

    [[Category:Blinkenlights]]

    ----

    [[Blinken_xmms]] has been viewed <counter>page=Blinken_xmms&namespace=0</counter> times.

    Latest revision as of 00:48, 29 February 2008


    This page is obsolete. The new Version is here: Blinken_XMMS


    blinken_xmms[edit]

    Das blinken_xmms ist ein Spectrum-Analyser-Plugin für den Multimedia Player Xmms. Es sendet UDP-Pakete an eine konfigurierbare IP Adresse im EBLP - extended Blinkenlights protocol mit 8x18 Pixeln. Die Ausgabe kann z.B. mit lldrv auf ein BlinkenLEDsPro umgeleitet werden.

    Blinkt zu D&B Musik Konfigurations GUI
    Erstellt mit blm2gif
    (Graustufen werden leider nicht konvertiert),

    Quellcode[edit]

    Den Quellcode für das XMMS-Plugin habe ich mit Hilfe von Workshop: Vis-Plugins in XMMS und XMMS Plugin tutorial at nobugs.org erstellen können. Desweiteren waren Informationen zum EBLP - extended Blinkenlights protocol sehr nützlich. Der "Rechen-Kern" für die Visualisierung entspricht dem des spectrum Plugins.

    Jetzt mit Graustufen und Konfig-GUI!

    Blinken_XMMS.c ! Beim Speichern --> Dateiname: Blinken_XMMS.c !

    blinken_xmms.h ! Beim Speichern --> Dateiname: blinken_xmms.h !

    configure.h ! Beim Speichern --> Dateiname: configure.c !


    Blinken_XMMS.c[edit]

    <highlightSyntax language="c">

    /* Blinken_XMMS : for XMMS - Cross-platform multimedia player

    • This program is free software; you can redistribute it and/or modify
    • it under the terms of the GNU General Public License as published by
    • the Free Software Foundation; either version 2 of the License, or
    • (at your option) any later version.
    • This program is distributed in the hope that it will be useful,
    • but WITHOUT ANY WARRANTY; without even the implied warranty of
    • MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    • GNU General Public License forore details.
    • You should have received a copy of the GNU General Public License
    • along with XMMS.
    • /

    /* Compile:

    • gcc -Wall --shared `xmms-config --cflags` -o Blinken_XMMS.so Blinken_XMMS.c
    • Install:
    • install Blinken_XMMS.so `xmms-config --visualization-plugin-dir`
    • /
    1. include <stdio.h>
    2. include <stdlib.h>
    3. include <unistd.h>
    4. include <string.h>
    5. include <math.h>
    6. include <sys/time.h>
    7. include <sys/types.h>
    8. include <sys/socket.h>
    9. include <netinet/in.h>
    10. include <arpa/inet.h>
    11. include <xmms/plugin.h>
    12. include <xmms/configfile.h>
    1. include "./configure.c"
    1. define NUM_BANDS 18
    2. define WIDTH 18
    3. define HEIGHT 8
    4. define FRAMEDURATION 40000
    1. define MSG {0xFE,0xED,0xBE,0xEF,0x00,0x00,0x00,0x00,0x00,0x012,0x00,0x08,\

    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,\ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,\ 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,\ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}

    static int sock; static unsigned char msg[156]=MSG; static unsigned char scalmsg[10] = {0x11, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0xAA, 0xCC, 0x00};

    BlinkenXmmsConfig blinken_cfg;

    static gdouble scale; static gint16 bar_heights[NUM_BANDS];

    void blinken_init(); void blinken_playback_start(); void blinken_playback_stop(); void blinken_render_freq(gint16 data[1][256]);

    static long int timer; struct timeval tp;

    VisPlugin g_blinken_plugin = {

           NULL,                   /* handle */
           NULL,                   /* filename */
           0,                      /* session id */
           "Blinken_XMMS",         /* description */
           0,                      /* PCM Channels */
           1,                      /* Freq. Channels */
           /* Callbacks ...    */
           blinken_init,           /* init */
           blinken_cleanup,        /* cleanup */
           NULL,                   /* about-dialog */
    

    blinken_configure, /* configure-dialog */

           NULL,                   /* disable-plugin */
           blinken_playback_start, /* playback-start */
           blinken_playback_stop,  /* playback-top */
           NULL,                   /* render-pcm */
           blinken_render_freq     /* render-freq */
    

    };


    VisPlugin *get_vplugin_info(void) {

           return( & g_blinken_plugin);
    

    }

    /* Read current settings from the xmms config file */ void blinken_read_config(void) { ConfigFile *cfg; gchar *filename;

    filename = g_strconcat(g_get_home_dir(), "/.xmms/config", NULL); cfg = xmms_cfg_open_file(filename);

    if (cfg) { xmms_cfg_read_string(cfg, "Blinken_XMMS", "blinkenip", &blinken_cfg.ip); xmms_cfg_read_int(cfg, "Blinken_XMMS", "blinkenport", &blinken_cfg.port);

    xmms_cfg_free(cfg); } g_free(filename);

    if (blinken_cfg.ip==NULL) { blinken_cfg.ip = g_strdup("127.0.0.1"); blinken_cfg.port = 2323; } }

    /* Save current settings to the xmms config file */ void blinken_save_config(void) { ConfigFile *cfgfile; gchar *filename;

    filename = g_strconcat(g_get_home_dir(), "/.xmms/config", NULL); cfgfile = xmms_cfg_open_file(filename); if (!cfgfile) cfgfile = xmms_cfg_new(); xmms_cfg_write_string(cfgfile, "Blinken_XMMS", "blinkenip", blinken_cfg.ip); xmms_cfg_write_int(cfgfile, "Blinken_XMMS", "blinkenport", blinken_cfg.port);

    xmms_cfg_write_file(cfgfile, filename); xmms_cfg_free(cfgfile); g_free(filename); }

    void blinken_udp_init(void) {

           if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
           {
                   printf("couldn't create socket");
                   blinken_cleanup();
                   exit(1);
           }
    
           struct sockaddr_in dest_addr;
           memset(&dest_addr, 0, sizeof(dest_addr));
           dest_addr.sin_family      = AF_INET;
    

    dest_addr.sin_port = htons(blinken_cfg.port); dest_addr.sin_addr.s_addr = inet_addr(blinken_cfg.ip);

           if (connect(sock, (struct sockaddr*) &dest_addr, sizeof(dest_addr)) == -1)
           {
    

    printf("couldn't connect to %s:%d\n",blinken_cfg.ip,blinken_cfg.port); blinken_configure();

                   blinken_cleanup();
                   exit(2);
           }
    

    //printf("connected to %s:%d\n",blinken_cfg.ip,blinken_cfg.port);

           send(sock, msg, 156, 0);
    

    }

    void blinken_init() {

    if (blinken_cfg.ip==NULL) blinken_read_config(); blinken_udp_init(); scale = (HEIGHT + 1)/ log(256); }

    void blinken_cleanup() {

           close(sock);
    

    }


    void blinken_playback_start() { gettimeofday(&tp,NULL); timer=tp.tv_usec; //printf( "playback_start\n"); }


    void blinken_playback_stop() {

           unsigned char msg[156]=MSG;
           send(sock, msg, 156, 0);
    

    }


    void blinken_render_freq( gint16 data[1][256]) { gettimeofday(&tp,NULL); if ((tp.tv_usec-timer)<FRAMEDURATION && (tp.tv_usec-timer)>0) return; //printf( "playback_run %ld\n",tp.tv_usec-timer); timer=tp.tv_usec;

           int result,zeile,spalte;
           int i,j,c;
           gint y;
           gint xscale[NUM_BANDS] = {0, 1, 2, 3, 5, 7, 10, 14, 20, 28, 40, 54, 74, 85, 101, 137, 140, 150};
    
           for(i = 0; i < NUM_BANDS; i++)
           {
                   for(c = xscale[i], y = 0; c < xscale[i + 1]; c++)
                   {
                           if(data[0][c] > y)
                           {
                                   y = data[0][c];
                           }
    
                   }
    
                   y >>= 7;
                   if(y != 0)
                   {
                           y = (gint)(log(y) * scale);
                           if(y > HEIGHT+1)
                           {
                                   y = HEIGHT+1;
                           }
    


                   }
    
                   bar_heights[i] = -y+9;
    
           }
    
           spalte = 0;
           zeile  = 0;
           for(i=12;i<=155;i++)
           {
                   j = i-12;
                   zeile  = j/18;
                   spalte = j%18;
    
                   if((bar_heights[spalte])==zeile+1)
                   {
                           msg[i]=0xFF;
                   }
                   else if((bar_heights[spalte])<zeile+1)
                   {
                           msg[i]=scalmsg[bar_heights[spalte]];
                   }
                   else
                   {
                           msg[i]=0x00;
                   }
    
           }
    
           result = send(sock, msg, 156, 0);
           return;
    

    }

    </highlightSyntax>


    blinken_xmms.h[edit]

    <highlightSyntax language="c">

    extern void blinken_udp_init(); extern void blinken_cleanup();

    extern void blinken_configure(void); extern void blinken_read_config(void); extern void blinken_save_config(void);

    typedef struct { gchar *ip; gint port; } BlinkenXmmsConfig;

    extern BlinkenXmmsConfig blinken_cfg;

    </highlightSyntax>


    configure.h[edit]

    <highlightSyntax language="c">

    1. include <gtk/gtk.h>
    1. include "blinken_xmms.h"

    static GtkWidget *configure_win = NULL; static GtkWidget *vbox, *options_frame, *options_vbox; static GtkWidget *bbox, *ok, *cancel;

    static GtkWidget *dev_ip, *dev_port;

    static void configure_ok(GtkWidget *w, gpointer data) { blinken_cfg.ip = g_strdup(gtk_entry_get_text(GTK_ENTRY(dev_ip))); blinken_cfg.port = atoi(gtk_entry_get_text(GTK_ENTRY(dev_port))); printf("ip: %s\nport: %d\n",blinken_cfg.ip,blinken_cfg.port); blinken_cleanup(); blinken_udp_init(); blinken_save_config(); gtk_widget_destroy(configure_win); }

    void blinken_configure (void) { GtkWidget *frame, *table, *label, *label_port; if(configure_win) return;

    blinken_read_config();

    configure_win = gtk_window_new(GTK_WINDOW_DIALOG); gtk_container_set_border_width(GTK_CONTAINER(configure_win), 10); gtk_window_set_title(GTK_WINDOW(configure_win), ("Blinken XMMS configuration")); gtk_window_set_policy(GTK_WINDOW(configure_win), FALSE, FALSE, FALSE); gtk_window_set_position(GTK_WINDOW(configure_win), GTK_WIN_POS_MOUSE); gtk_signal_connect(GTK_OBJECT(configure_win), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &configure_win);

    vbox = gtk_vbox_new(FALSE, 5);

    options_frame = gtk_frame_new(("Options:")); gtk_container_set_border_width(GTK_CONTAINER(options_frame), 5);

    options_vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(options_vbox), 5);

    frame = gtk_frame_new(("Connection")); gtk_box_pack_start(GTK_BOX(options_vbox), frame, FALSE, FALSE, 0);

    table = gtk_table_new(2, 1, FALSE); gtk_container_set_border_width(GTK_CONTAINER(table), 5); gtk_container_add(GTK_CONTAINER(frame), table); gtk_table_set_row_spacings(GTK_TABLE(table), 5); gtk_table_set_col_spacings(GTK_TABLE(table), 5);

    label = gtk_label_new(("IP Adr.:")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); gtk_widget_show(label);

    dev_ip = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(dev_ip), blinken_cfg.ip); gtk_table_attach_defaults(GTK_TABLE(table), dev_ip, 1, 2, 0, 1); gtk_widget_show(dev_ip);

    label_port = gtk_label_new(("Port:")); gtk_misc_set_alignment(GTK_MISC(label_port), 1.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label_port, 0, 1, 1, 2); gtk_widget_show(label_port);

    dev_port = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(dev_port), g_strdup_printf("%d", blinken_cfg.port)); gtk_table_attach_defaults(GTK_TABLE(table), dev_port, 1, 2, 1, 2); gtk_widget_show(dev_port);

    gtk_widget_show(table); gtk_widget_show(frame);

    gtk_container_add(GTK_CONTAINER(options_frame), options_vbox); gtk_widget_show(options_vbox);

    	gtk_box_pack_start(GTK_BOX(vbox), options_frame, TRUE, TRUE, 0);
    

    gtk_widget_show(options_frame);

    bbox = gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5); gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);

    ok = gtk_button_new_with_label(("OK")); gtk_signal_connect(GTK_OBJECT(ok), "clicked", GTK_SIGNAL_FUNC(configure_ok), NULL); GTK_WIDGET_SET_FLAGS(ok, GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(bbox), ok, TRUE, TRUE, 0); gtk_widget_show(ok);


    cancel = gtk_button_new_with_label(("Cancel")); gtk_signal_connect_object(GTK_OBJECT(cancel), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(configure_win)); GTK_WIDGET_SET_FLAGS(cancel, GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(bbox), cancel, TRUE, TRUE, 0); gtk_widget_show(cancel); gtk_widget_show(bbox);

    gtk_container_add(GTK_CONTAINER(configure_win), vbox); gtk_widget_show(vbox); gtk_widget_show(configure_win); gtk_widget_grab_default(ok); }


    </highlightSyntax>

    Installation[edit]

    gcc -Wall --shared `xmms-config --cflags` -o Blinken_XMMS.so Blinken_XMMS.c
    
    install Blinken_XMMS.so `xmms-config --visualization-plugin-dir`
    

    Evtl. ist das dev. Paket von xmms erforderlich.

    Nun kann man mit einem Rechtsklick auf das XMMS-Fenster im Menü: Visualisierung-->Visualisierungs-Plugins

    Blinken_XMMS

    auswählen. Mit einem Klick auf den Konfigurationsknopf ist es möglich die Ziel- IP Adresse und Port einzutragen. Um den UDP-Stream umzuleiten kann z.B

    ./BlinkenOutput -l 2323 -d /dev/lldrv
    

    benutzt werden.


    Links[edit]

    download source


    Blinken_xmms has been viewed <counter>page=Blinken_xmms&namespace=0</counter> times.

    Cookies help us deliver our services. By using our services, you agree to our use of cookies.
    Cookies help us deliver our services. By using our services, you agree to our use of cookies.