From 1c467b80a54081a974c6db0a33d5c7e822d44c59 Mon Sep 17 00:00:00 2001
From: Sam Hocevar <sam@videolan.org>
Date: Mon, 25 Feb 2002 04:30:03 +0000
Subject: [PATCH]   * ./plugins/gtk/gtk_menu.c: fixed a compile issue on IA64. 
  * ./plugins/fx/scope.c: new toy plugin, an audio scope module.

    Each time I fix a bug in vlc I feel urge to code something useless. This
    one is very, very rough for the moment, probably buggy, slow, will crash
    your blender and reboot your fridge. Screenshot can be found here:
      http://www.zoy.org/~sam/vlc/vlc-scope.jpeg
    Activate with `--aout scope' (yes, it currently disables the real
    audio output... I'll fix this as well).
---
 Makefile               |   2 +
 configure              |   2 +-
 configure.in           |   2 +-
 plugins/fx/.cvsignore  |   4 +
 plugins/fx/Makefile    |   1 +
 plugins/fx/scope.c     | 222 +++++++++++++++++++++++++++++++++++++++++
 plugins/gtk/gtk_menu.c |   6 +-
 7 files changed, 234 insertions(+), 5 deletions(-)
 create mode 100644 plugins/fx/.cvsignore
 create mode 100644 plugins/fx/Makefile
 create mode 100644 plugins/fx/scope.c

diff --git a/Makefile b/Makefile
index 561c0bcd32..de249c3808 100644
--- a/Makefile
+++ b/Makefile
@@ -28,6 +28,7 @@ PLUGINS_DIR :=	ac3_adec \
 		esd \
 		fb \
 		filter \
+		fx \
 		ggi \
 		glide \
 		gtk \
@@ -83,6 +84,7 @@ PLUGINS_TARGETS := ac3_adec/ac3_adec \
 		filter/filter_invert \
 		filter/filter_distort \
 		filter/filter_wall \
+		fx/fx_scope \
 		ggi/ggi \
 		glide/glide \
 		gtk/gnome \
diff --git a/configure b/configure
index 2a0bde9949..88b9338fb7 100755
--- a/configure
+++ b/configure
@@ -5438,7 +5438,7 @@ case x"${target_cpu}" in
 esac
 
 BUILTINS="${BUILTINS} mpeg_es mpeg_ps mpeg_ts memcpy idct idctclassic motion imdct downmix chroma_i420_rgb chroma_i420_yuy2 chroma_i422_yuy2 chroma_i420_ymga mpeg_adec ac3_adec mpeg_vdec"
-PLUGINS="${PLUGINS} lpcm_adec ac3_spdif spudec filter_deinterlace filter_invert filter_wall filter_transform filter_distort"
+PLUGINS="${PLUGINS} lpcm_adec ac3_spdif spudec filter_deinterlace filter_invert filter_wall filter_transform filter_distort fx_scope"
 
 MMX_MODULES="memcpymmx idctmmx motionmmx chroma_i420_rgb_mmx chroma_i420_yuy2_mmx chroma_i422_yuy2_mmx chroma_i420_ymga_mmx"
 MMXEXT_MODULES="memcpymmxext idctmmxext motionmmxext"
diff --git a/configure.in b/configure.in
index f82a66b778..863a9f025e 100644
--- a/configure.in
+++ b/configure.in
@@ -445,7 +445,7 @@ dnl
 dnl  default modules
 dnl
 BUILTINS="${BUILTINS} mpeg_es mpeg_ps mpeg_ts memcpy idct idctclassic motion imdct downmix chroma_i420_rgb chroma_i420_yuy2 chroma_i422_yuy2 chroma_i420_ymga mpeg_adec ac3_adec mpeg_vdec"
-PLUGINS="${PLUGINS} lpcm_adec ac3_spdif spudec filter_deinterlace filter_invert filter_wall filter_transform filter_distort"
+PLUGINS="${PLUGINS} lpcm_adec ac3_spdif spudec filter_deinterlace filter_invert filter_wall filter_transform filter_distort fx_scope"
 
 dnl
 dnl  Accelerated modules
diff --git a/plugins/fx/.cvsignore b/plugins/fx/.cvsignore
new file mode 100644
index 0000000000..435f39ed89
--- /dev/null
+++ b/plugins/fx/.cvsignore
@@ -0,0 +1,4 @@
+.dep
+*.lo
+*.o.*
+*.lo.*
diff --git a/plugins/fx/Makefile b/plugins/fx/Makefile
new file mode 100644
index 0000000000..1adfdd5aed
--- /dev/null
+++ b/plugins/fx/Makefile
@@ -0,0 +1 @@
+fx_scope_SOURCES = scope.c
diff --git a/plugins/fx/scope.c b/plugins/fx/scope.c
new file mode 100644
index 0000000000..3384dcb782
--- /dev/null
+++ b/plugins/fx/scope.c
@@ -0,0 +1,222 @@
+/*****************************************************************************
+ * scope.c : Scope effect module
+ *****************************************************************************
+ * Copyright (C) 2002 VideoLAN
+ * $Id: scope.c,v 1.1 2002/02/25 04:30:03 sam Exp $
+ *
+ * Authors: Samuel Hocevar <sam@zoy.org>
+ *
+ * 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 for more 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, USA.
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+#include <stdlib.h>                                      /* malloc(), free() */
+#include <string.h>                                              /* strdup() */
+#include <errno.h>
+
+#include <videolan/vlc.h>
+
+#include "video.h"
+#include "video_output.h"
+
+#include "audio_output.h"                                   /* aout_thread_t */
+
+#define SCOPE_WIDTH 640
+#define SCOPE_HEIGHT 200
+#define SCOPE_ASPECT (VOUT_ASPECT_FACTOR*SCOPE_WIDTH/SCOPE_HEIGHT)
+
+/*****************************************************************************
+ * Capabilities defined in the other files.
+ *****************************************************************************/
+static void aout_getfunctions( function_list_t * p_function_list );
+
+/*****************************************************************************
+ * aout_sys_t: scope audio output method descriptor
+ *****************************************************************************
+ * This structure is part of the audio output thread descriptor.
+ * It describes some scope specific variables.
+ *****************************************************************************/
+typedef struct aout_sys_s
+{
+    struct aout_fifo_s *p_aout_fifo; /* XXX: unused yet */
+    struct vout_thread_s *p_vout;
+
+} aout_sys_t;
+
+/*****************************************************************************
+ * Build configuration tree.
+ *****************************************************************************/
+MODULE_CONFIG_START
+MODULE_CONFIG_STOP
+
+MODULE_INIT_START
+    SET_DESCRIPTION( "scope effect module" )
+    ADD_CAPABILITY( AOUT, 0 )
+    ADD_SHORTCUT( "scope" )
+MODULE_INIT_STOP
+
+MODULE_ACTIVATE_START
+    aout_getfunctions( &p_module->p_functions->aout );
+MODULE_ACTIVATE_STOP
+
+MODULE_DEACTIVATE_START
+MODULE_DEACTIVATE_STOP
+
+/*****************************************************************************
+ * Local prototypes.
+ *****************************************************************************/
+static int     aout_Open        ( aout_thread_t *p_aout );
+static int     aout_SetFormat   ( aout_thread_t *p_aout );
+static int     aout_GetBufInfo  ( aout_thread_t *p_aout, int i_buffer_info );
+static void    aout_Play        ( aout_thread_t *p_aout,
+                                  byte_t *buffer, int i_size );
+static void    aout_Close       ( aout_thread_t *p_aout );
+
+/*****************************************************************************
+ * Functions exported as capabilities. They are declared as static so that
+ * we don't pollute the namespace too much.
+ *****************************************************************************/
+static void aout_getfunctions( function_list_t * p_function_list )
+{
+    p_function_list->functions.aout.pf_open = aout_Open;
+    p_function_list->functions.aout.pf_setformat = aout_SetFormat;
+    p_function_list->functions.aout.pf_getbufinfo = aout_GetBufInfo;
+    p_function_list->functions.aout.pf_play = aout_Play;
+    p_function_list->functions.aout.pf_close = aout_Close;
+}
+
+/*****************************************************************************
+ * aout_Open: open a scope effect plugin
+ *****************************************************************************/
+static int aout_Open( aout_thread_t *p_aout )
+{
+    /* Allocate structure */
+    p_aout->p_sys = malloc( sizeof( aout_sys_t ) );
+    if( p_aout->p_sys == NULL )
+    {
+        intf_ErrMsg("error: %s", strerror(ENOMEM) );
+        return( 1 );
+    }
+
+    p_aout->p_sys->p_vout =
+        vout_CreateThread( NULL, SCOPE_WIDTH, SCOPE_HEIGHT,
+                           FOURCC_I420, SCOPE_ASPECT );
+
+    return( 0 );
+}
+
+/*****************************************************************************
+ * aout_SetFormat: set the output format
+ *****************************************************************************/
+static int aout_SetFormat( aout_thread_t *p_aout )
+{
+    /* Force the output method */
+    p_aout->i_format = AOUT_FMT_U16_LE;
+    p_aout->i_channels = 2;
+
+    return( 0 );
+}
+
+/*****************************************************************************
+ * aout_GetBufInfo: buffer status query
+ *****************************************************************************/
+static int aout_GetBufInfo( aout_thread_t *p_aout, int i_buffer_limit )
+{
+    /* arbitrary value that should be changed */
+    return( i_buffer_limit );
+}
+
+/*****************************************************************************
+ * aout_Play: play a sound samples buffer
+ *****************************************************************************
+ * This function writes a buffer of i_length bytes in the socket
+ *****************************************************************************/
+static void aout_Play( aout_thread_t *p_aout, byte_t *p_buffer, int i_size )
+{
+    picture_t *p_outpic;
+    int i_index;
+    u8 *p_pixel;
+    u16 *p_sample;
+
+    /* This is a new frame. Get a structure from the video_output. */
+    while( ( p_outpic = vout_CreatePicture( p_aout->p_sys->p_vout, 0, 0, 0 ) )
+              == NULL )
+    {
+        if( p_aout->b_die )
+        {
+            return;
+        }
+        msleep( VOUT_OUTMEM_SLEEP );
+    }
+
+    /* Blank the picture */
+    for( i_index = 0 ; i_index < p_outpic->i_planes ; i_index++ )
+    {
+        memset( p_outpic->p[i_index].p_pixels, i_index ? 0x80 : 0x00,
+                p_outpic->p[i_index].i_lines * p_outpic->p[i_index].i_pitch );
+    }
+
+    /* Left channel */
+    for( i_index = 0, p_sample = (u16*)p_buffer;
+         i_index < SCOPE_WIDTH && i_index < i_size / 2;
+         i_index++ )
+    {
+        int i;
+        u8 i_value = *p_sample / 256;
+
+        for( i = 0 ; i < 8 ; i++ )
+        {
+            p_pixel = p_outpic->p[0].p_pixels + (p_outpic->p[0].i_pitch * i_index) / SCOPE_WIDTH + p_outpic->p[0].i_lines * (u8)(i_value+128) / 512 * p_outpic->p[0].i_pitch;
+            *p_pixel = 0x9f;
+            p_pixel = p_outpic->p[1].p_pixels + (p_outpic->p[1].i_pitch * i_index) / SCOPE_WIDTH + p_outpic->p[1].i_lines * (u8)(i_value+128) / 512 * p_outpic->p[1].i_pitch;
+            *p_pixel = 0x00;
+            p_sample += 2;
+        }
+    }
+
+    /* Right channel */
+    for( i_index = 0, p_sample = (u16*)p_buffer + 1;
+         i_index < SCOPE_WIDTH && i_index < i_size / 2;
+         i_index++ )
+    {
+        int i;
+        u8 i_value = *p_sample / 256;
+
+        for( i = 0 ; i < 8 ; i++ )
+        {
+            p_pixel = p_outpic->p[0].p_pixels + (p_outpic->p[0].i_pitch * i_index) / SCOPE_WIDTH + (p_outpic->p[0].i_lines * (u8)(i_value+128) / 512 + p_outpic->p[0].i_lines / 2) * p_outpic->p[0].i_pitch;
+            *p_pixel = 0x7f;
+            p_pixel = p_outpic->p[2].p_pixels + (p_outpic->p[2].i_pitch * i_index) / SCOPE_WIDTH + (p_outpic->p[2].i_lines * (u8)(i_value+128) / 512 + p_outpic->p[2].i_lines / 2) * p_outpic->p[2].i_pitch;
+            *p_pixel = 0xdd;
+            p_sample += 2;
+        }
+    }
+
+    /* Display the picture */
+    vout_DatePicture( p_aout->p_sys->p_vout, p_outpic, p_aout->date );
+    vout_DisplayPicture( p_aout->p_sys->p_vout, p_outpic );
+}
+
+/*****************************************************************************
+ * aout_Close: close the Esound socket
+ *****************************************************************************/
+static void aout_Close( aout_thread_t *p_aout )
+{
+    vout_DestroyThread( p_aout->p_sys->p_vout, NULL );
+    free( p_aout->p_sys );
+}
+
diff --git a/plugins/gtk/gtk_menu.c b/plugins/gtk/gtk_menu.c
index 04ba12298c..08b70e4c86 100644
--- a/plugins/gtk/gtk_menu.c
+++ b/plugins/gtk/gtk_menu.c
@@ -2,7 +2,7 @@
  * gtk_menu.c : functions to handle menu items.
  *****************************************************************************
  * Copyright (C) 2000, 2001 VideoLAN
- * $Id: gtk_menu.c,v 1.19 2002/02/24 21:36:20 jobi Exp $
+ * $Id: gtk_menu.c,v 1.20 2002/02/25 04:30:03 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *          St�phane Borel <stef@via.ecp.fr>
@@ -190,7 +190,7 @@ void GtkMenubarProgramToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
 
     if( menuitem->active && !p_intf->p_sys->b_program_update )
     {
-        u16 i_program_id = (u16)user_data;
+        u16 i_program_id = (ptrdiff_t)user_data;
         
         input_ChangeProgram( p_input_bank->pp_input[0], i_program_id );
         
@@ -506,7 +506,7 @@ static gint GtkProgramMenu( gpointer          p_data,
         /* setup signal hanling */
         gtk_signal_connect( GTK_OBJECT( p_item ), "toggled",
                         GTK_SIGNAL_FUNC( pf_toggle ),
-                        (gpointer)( p_input_bank->pp_input[0]->
+                        (gpointer)(ptrdiff_t)( p_input_bank->pp_input[0]->
                         stream.pp_programs[i]->i_number ) );
 
         gtk_menu_append( GTK_MENU( p_menu ), p_item );
-- 
2.25.4