×
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
    Revision as of 16:10, 23 January 2007 by 62.143.24.160 (talk)
    (diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

    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 BLP - Blinkenlights Protokoll mit 8x18 Pixeln. Die Ausgabe kann z.B. mit [lldrv] auf ein Blinken LEDsPro umgeleitet werden.

    Quellcode

    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 BLP - Blinkenlights Protokoll sehr nützlich. Der "Rechen-Kern" für die Visualisierung entspricht dem des spectrum Plugins.

    blinken_xmms.c


    /*  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;	
    }
    

    Installation

    gcc -Wall --shared `xmms-config --cflags` -o blinken_xmms.so blinken_xmms.c
    
    install blinken_plugin.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-Plugin

    auswählen. Um den UDP-Stream umzuleiten kann z.B

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

    benutzt werden.

    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.