void onForward(GtkButton *button, gpointer user_data) { intf_thread_t *p_intf = GtkGetIntf( button ); if (p_intf->p_sys->p_input != NULL) { var_SetVoid( p_intf->p_sys->p_input, "rate-faster" ); } }
/***************************************************************************** * Run: main loop *****************************************************************************/ static void Run( intf_thread_t *p_intf ) { char *code, *c; playlist_t *p_playlist; input_thread_t *p_input; vout_thread_t *p_vout = NULL; while( !p_intf->b_die ) { /* Sleep a bit */ msleep( INTF_IDLE_SLEEP ); /* Update the input */ if( p_intf->p_sys->p_input == NULL ) { p_intf->p_sys->p_input = vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE ); } else if( p_intf->p_sys->p_input->b_dead ) { vlc_object_release( p_intf->p_sys->p_input ); p_intf->p_sys->p_input = NULL; } p_input = p_intf->p_sys->p_input; /* Update the vout */ if( p_vout == NULL ) { p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); p_intf->p_sys->p_vout = p_vout; } else if( p_vout->b_die ) { vlc_object_release( p_vout ); p_vout = NULL; p_intf->p_sys->p_vout = NULL; } /* We poll the lircsocket */ if( lirc_nextcode(&code) != 0 ) { break; } if( code == NULL ) { continue; } while( !p_intf->b_die && lirc_code2char( p_intf->p_sys->config, code, &c ) == 0 && c != NULL ) { if( !strcmp( c, "QUIT" ) ) { p_intf->p_vlc->b_die = VLC_TRUE; vout_OSDMessage( p_intf, DEFAULT_CHAN, _("Quit" ) ); continue; } else if( !strcmp( c, "VOL_UP" ) ) { audio_volume_t i_newvol; aout_VolumeUp( p_intf, 1, &i_newvol ); vout_OSDMessage( p_intf, DEFAULT_CHAN, _("Vol %%%d"), i_newvol * 100 / AOUT_VOLUME_MAX ); } else if( !strcmp( c, "VOL_DOWN" ) ) { audio_volume_t i_newvol; aout_VolumeDown( p_intf, 1, &i_newvol ); vout_OSDMessage( p_intf, DEFAULT_CHAN, _("Vol %%%d"), i_newvol * 100 / AOUT_VOLUME_MAX ); } else if( !strcmp( c, "MUTE" ) ) { audio_volume_t i_newvol = -1; aout_VolumeMute( p_intf, &i_newvol ); if( i_newvol == 0 ) { vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Mute" ) ); } else { vout_OSDMessage( p_intf, DEFAULT_CHAN, _("Vol %d%%"), i_newvol * 100 / AOUT_VOLUME_MAX ); } } if( p_vout ) { if( !strcmp( c, "FULLSCREEN" ) ) { p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE; continue; } if( !strcmp( c, "ACTIVATE" ) ) { vlc_value_t val; val.psz_string = "ENTER"; if (var_Set( p_vout, "key-pressed", val ) != VLC_SUCCESS) { msg_Warn( p_intf, "key-press failed" ); } continue; } if( !strcmp( c, "LEFT" ) ) { vlc_value_t val; val.psz_string = "LEFT"; if (var_Set( p_vout, "key-pressed", val ) != VLC_SUCCESS) { msg_Warn( p_intf, "key-press failed" ); } continue; } if( !strcmp( c, "RIGHT" ) ) { vlc_value_t val; val.psz_string = "RIGHT"; if (var_Set( p_vout, "key-pressed", val ) != VLC_SUCCESS) { msg_Warn( p_intf, "key-press failed" ); } continue; } if( !strcmp( c, "UP" ) ) { vlc_value_t val; val.psz_string = "UP"; if (var_Set( p_vout, "key-pressed", val ) != VLC_SUCCESS) { msg_Warn( p_intf, "key-press failed" ); } continue; } if( !strcmp( c, "DOWN" ) ) { vlc_value_t val; val.psz_string = "DOWN"; if (var_Set( p_vout, "key-pressed", val ) != VLC_SUCCESS) { msg_Warn( p_intf, "key-press failed" ); } continue; } } if( !strcmp( c, "PLAY" ) ) { p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist ) { playlist_Play( p_playlist ); vlc_object_release( p_playlist ); } continue; } if( !strcmp( c, "PLAYPAUSE" ) ) { vlc_value_t val; val.i_int = PLAYING_S; if( p_input ) { var_Get( p_input, "state", &val ); } if( p_input && val.i_int != PAUSE_S ) { vout_OSDMessage( VLC_OBJECT(p_intf), DEFAULT_CHAN, _( "Pause" ) ); val.i_int = PAUSE_S; var_Set( p_input, "state", val ); } else { p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist ) { vlc_mutex_lock( &p_playlist->object_lock ); if( p_playlist->i_size ) { vlc_mutex_unlock( &p_playlist->object_lock ); vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Play" ) ); playlist_Play( p_playlist ); vlc_object_release( p_playlist ); } } } continue; } else if( p_input ) { if( !strcmp( c, "AUDIO_TRACK" ) ) { vlc_value_t val, list, list2; int i_count, i; var_Get( p_input, "audio-es", &val ); var_Change( p_input, "audio-es", VLC_VAR_GETCHOICES, &list, &list2 ); i_count = list.p_list->i_count; for( i = 0; i < i_count; i++ ) { if( val.i_int == list.p_list->p_values[i].i_int ) { break; } } /* value of audio-es was not in choices list */ if( i == i_count ) { msg_Warn( p_input, "invalid current audio track, selecting 0" ); var_Set( p_input, "audio-es", list.p_list->p_values[0] ); i = 0; } else if( i == i_count - 1 ) { var_Set( p_input, "audio-es", list.p_list->p_values[0] ); i = 0; } else { var_Set( p_input, "audio-es", list.p_list->p_values[i+1] ); i++; } vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Audio track: %s"), list2.p_list->p_values[i].psz_string ); } else if( !strcmp( c, "SUBTITLE_TRACK" ) ) { vlc_value_t val, list, list2; int i_count, i; var_Get( p_input, "spu-es", &val ); var_Change( p_input, "spu-es", VLC_VAR_GETCHOICES, &list, &list2 ); i_count = list.p_list->i_count; for( i = 0; i < i_count; i++ ) { if( val.i_int == list.p_list->p_values[i].i_int ) { break; } } /* value of audio-es was not in choices list */ if( i == i_count ) { msg_Warn( p_input, "invalid current subtitle track, selecting 0" ); var_Set( p_input, "spu-es", list.p_list->p_values[0] ); i = 0; } else if( i == i_count - 1 ) { var_Set( p_input, "spu-es", list.p_list->p_values[0] ); i = 0; } else { var_Set( p_input, "spu-es", list.p_list->p_values[i+1] ); i = i + 1; } vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Subtitle track: %s"), list2.p_list->p_values[i].psz_string ); } else if( !strcmp( c, "PAUSE" ) ) { vlc_value_t val; vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Pause" ) ); val.i_int = PAUSE_S; var_Set( p_input, "state", val ); } else if( !strcmp( c, "NEXT" ) ) { p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist ) { playlist_Next( p_playlist ); vlc_object_release( p_playlist ); } } else if( !strcmp( c, "PREV" ) ) { p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist ) { playlist_Prev( p_playlist ); vlc_object_release( p_playlist ); } } else if( !strcmp( c, "STOP" ) ) { p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist ) { playlist_Stop( p_playlist ); vlc_object_release( p_playlist ); } } else if( !strcmp( c, "FAST" ) ) { vlc_value_t val; val.b_bool = VLC_TRUE; var_Set( p_input, "rate-faster", val ); } else if( !strcmp( c, "SLOW" ) ) { vlc_value_t val; val.b_bool = VLC_TRUE; var_Set( p_input, "rate-slower", val ); } /* beginning of modifications by stephane Thu Jun 19 15:29:49 CEST 2003 */ else if ( !strcmp(c, "CHAPTER_N" ) || !strcmp( c, "CHAPTER_P" ) ) { unsigned int i_chapter = 0; if( !strcmp( c, "CHAPTER_N" ) ) { var_SetVoid( p_input, "next-chapter" ); } else if( !strcmp( c, "CHAPTER_P" ) ) { var_SetVoid( p_input, "prev-chapter" ); } } /* end of modification by stephane Thu Jun 19 15:29:49 CEST 2003 */ } } free( code ); } }
static int CropCallback( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { vout_thread_t *p_vout = (vout_thread_t *)p_this; int64_t i_aspect_num, i_aspect_den; unsigned int i_width, i_height; (void)oldval; (void)p_data; /* Restore defaults */ p_vout->fmt_in.i_x_offset = p_vout->fmt_render.i_x_offset; p_vout->fmt_in.i_visible_width = p_vout->fmt_render.i_visible_width; p_vout->fmt_in.i_y_offset = p_vout->fmt_render.i_y_offset; p_vout->fmt_in.i_visible_height = p_vout->fmt_render.i_visible_height; if( !strcmp( psz_cmd, "crop" ) ) { char *psz_end = NULL, *psz_parser = strchr( newval.psz_string, ':' ); if( psz_parser ) { /* We're using the 3:4 syntax */ i_aspect_num = strtol( newval.psz_string, &psz_end, 10 ); if( psz_end == newval.psz_string || !i_aspect_num ) goto crop_end; i_aspect_den = strtol( ++psz_parser, &psz_end, 10 ); if( psz_end == psz_parser || !i_aspect_den ) goto crop_end; i_width = p_vout->fmt_in.i_sar_den*p_vout->fmt_render.i_visible_height * i_aspect_num / i_aspect_den / p_vout->fmt_in.i_sar_num; i_height = p_vout->fmt_render.i_visible_width*p_vout->fmt_in.i_sar_num * i_aspect_den / i_aspect_num / p_vout->fmt_in.i_sar_den; if( i_width < p_vout->fmt_render.i_visible_width ) { p_vout->fmt_in.i_x_offset = p_vout->fmt_render.i_x_offset + (p_vout->fmt_render.i_visible_width - i_width) / 2; p_vout->fmt_in.i_visible_width = i_width; } else { p_vout->fmt_in.i_y_offset = p_vout->fmt_render.i_y_offset + (p_vout->fmt_render.i_visible_height - i_height) / 2; p_vout->fmt_in.i_visible_height = i_height; } } else { psz_parser = strchr( newval.psz_string, 'x' ); if( psz_parser ) { /* Maybe we're using the <width>x<height>+<left>+<top> syntax */ unsigned int i_crop_width, i_crop_height, i_crop_top, i_crop_left; i_crop_width = strtol( newval.psz_string, &psz_end, 10 ); if( psz_end != psz_parser ) goto crop_end; psz_parser = strchr( ++psz_end, '+' ); i_crop_height = strtol( psz_end, &psz_end, 10 ); if( psz_end != psz_parser ) goto crop_end; psz_parser = strchr( ++psz_end, '+' ); i_crop_left = strtol( psz_end, &psz_end, 10 ); if( psz_end != psz_parser ) goto crop_end; psz_end++; i_crop_top = strtol( psz_end, &psz_end, 10 ); if( *psz_end != '\0' ) goto crop_end; i_width = i_crop_width; p_vout->fmt_in.i_visible_width = i_width; i_height = i_crop_height; p_vout->fmt_in.i_visible_height = i_height; p_vout->fmt_in.i_x_offset = i_crop_left; p_vout->fmt_in.i_y_offset = i_crop_top; } else { /* Maybe we're using the <left>+<top>+<right>+<bottom> syntax */ unsigned int i_crop_top, i_crop_left, i_crop_bottom, i_crop_right; psz_parser = strchr( newval.psz_string, '+' ); i_crop_left = strtol( newval.psz_string, &psz_end, 10 ); if( psz_end != psz_parser ) goto crop_end; psz_parser = strchr( ++psz_end, '+' ); i_crop_top = strtol( psz_end, &psz_end, 10 ); if( psz_end != psz_parser ) goto crop_end; psz_parser = strchr( ++psz_end, '+' ); i_crop_right = strtol( psz_end, &psz_end, 10 ); if( psz_end != psz_parser ) goto crop_end; psz_end++; i_crop_bottom = strtol( psz_end, &psz_end, 10 ); if( *psz_end != '\0' ) goto crop_end; i_width = p_vout->fmt_render.i_visible_width - i_crop_left - i_crop_right; p_vout->fmt_in.i_visible_width = i_width; i_height = p_vout->fmt_render.i_visible_height - i_crop_top - i_crop_bottom; p_vout->fmt_in.i_visible_height = i_height; p_vout->fmt_in.i_x_offset = i_crop_left; p_vout->fmt_in.i_y_offset = i_crop_top; } } } else if( !strcmp( psz_cmd, "crop-top" ) || !strcmp( psz_cmd, "crop-left" ) || !strcmp( psz_cmd, "crop-bottom" ) || !strcmp( psz_cmd, "crop-right" ) ) { unsigned int i_crop_top, i_crop_left, i_crop_bottom, i_crop_right; i_crop_top = var_GetInteger( p_vout, "crop-top" ); i_crop_left = var_GetInteger( p_vout, "crop-left" ); i_crop_right = var_GetInteger( p_vout, "crop-right" ); i_crop_bottom = var_GetInteger( p_vout, "crop-bottom" ); i_width = p_vout->fmt_render.i_visible_width - i_crop_left - i_crop_right; p_vout->fmt_in.i_visible_width = i_width; i_height = p_vout->fmt_render.i_visible_height - i_crop_top - i_crop_bottom; p_vout->fmt_in.i_visible_height = i_height; p_vout->fmt_in.i_x_offset = i_crop_left; p_vout->fmt_in.i_y_offset = i_crop_top; } crop_end: InitWindowSize( p_vout, &p_vout->i_window_width, &p_vout->i_window_height ); p_vout->i_changes |= VOUT_CROP_CHANGE; msg_Dbg( p_vout, "cropping picture %ix%i to %i,%i,%ix%i", p_vout->fmt_in.i_width, p_vout->fmt_in.i_height, p_vout->fmt_in.i_x_offset, p_vout->fmt_in.i_y_offset, p_vout->fmt_in.i_visible_width, p_vout->fmt_in.i_visible_height ); var_SetVoid( p_vout, "crop-update" ); return VLC_SUCCESS; }
/***************************************************************************** * InterfaceWindow::MessageReceived *****************************************************************************/ void InterfaceWindow::MessageReceived( BMessage * p_message ) { switch( p_message->what ) { case B_ABOUT_REQUESTED: { BAlert * alert; alert = new BAlert( "VLC media player" VERSION, "VLC media player" VERSION " (BeOS interface)\n\n" "The VideoLAN team <*****@*****.**>\n" "http://www.videolan.org/", _("OK") ); alert->Go(); break; } case TOGGLE_ON_TOP: break; case OPEN_FILE: _ShowFilePanel( B_REFS_RECEIVED, _("VLC media player: Open Media Files") ); break; case LOAD_SUBFILE: _ShowFilePanel( SUBFILE_RECEIVED, _("VLC media player: Open Subtitle File") ); break; #if 0 case OPEN_PLAYLIST: if (fPlaylistWindow->Lock()) { if (fPlaylistWindow->IsHidden()) fPlaylistWindow->Show(); else fPlaylistWindow->Activate(); fPlaylistWindow->Unlock(); } break; #endif case OPEN_DVD: { const char * psz_device; if( p_playlist && p_message->FindString( "device", &psz_device ) == B_OK ) { char psz_uri[1024]; memset( psz_uri, 0, 1024 ); snprintf( psz_uri, 1024, "dvdnav:%s", psz_device ); playlist_Add( p_playlist, psz_uri, psz_device, PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END, true ); } UpdatePlaylist(); } break; case SUBFILE_RECEIVED: { entry_ref ref; if( p_message->FindRef( "refs", 0, &ref ) == B_OK ) { BPath path( &ref ); if ( path.InitCheck() == B_OK ) config_PutPsz( p_intf, "sub-file", path.Path() ); } break; } case STOP_PLAYBACK: if( p_playlist ) { playlist_Stop( p_playlist ); } p_mediaControl->SetStatus(-1, INPUT_RATE_DEFAULT); break; case START_PLAYBACK: case PAUSE_PLAYBACK: { vlc_value_t val; val.i_int = PLAYING_S; if( p_input ) { var_Get( p_input, "state", &val ); } if( p_input && val.i_int != PAUSE_S ) { val.i_int = PAUSE_S; var_Set( p_input, "state", val ); } else { playlist_Play( p_playlist ); } break; } case HEIGHTH_PLAY: if( p_input ) { var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT * 8 ); } break; case QUARTER_PLAY: if( p_input ) { var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT * 4 ); } break; case HALF_PLAY: if( p_input ) { var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT * 2 ); } break; case NORMAL_PLAY: if( p_input ) { var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT ); } break; case TWICE_PLAY: if( p_input ) { var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT / 2 ); } break; case FOUR_PLAY: if( p_input ) { var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT / 4 ); } break; case HEIGHT_PLAY: if( p_input ) { var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT / 8 ); } break; case SEEK_PLAYBACK: /* handled by semaphores */ break; case VOLUME_CHG: aout_VolumeSet( p_intf, p_mediaControl->GetVolume() ); break; case VOLUME_MUTE: aout_VolumeMute( p_intf, NULL ); break; case SELECT_CHANNEL: { int32 channel; if( p_input ) { if( p_message->FindInt32( "audio-es", &channel ) == B_OK ) { var_SetInteger( p_input, "audio-es", channel ); } else if( p_message->FindInt32( "spu-es", &channel ) == B_OK ) { var_SetInteger( p_input, "spu-es", channel ); } } break; } case PREV_TITLE: if( p_input ) { var_SetVoid( p_input, "prev-title" ); } break; case NEXT_TITLE: if( p_input ) { var_SetVoid( p_input, "next-title" ); } break; case TOGGLE_TITLE: { int32 index; if( p_input && p_message->FindInt32( "index", &index ) == B_OK ) { var_SetInteger( p_input, "title", index ); } break; } case PREV_CHAPTER: if( p_input ) { var_SetVoid( p_input, "prev-chapter" ); } break; case NEXT_CHAPTER: if( p_input ) { var_SetVoid( p_input, "next-chapter" ); } break; case TOGGLE_CHAPTER: { int32 index; if( p_input && p_message->FindInt32( "index", &index ) == B_OK ) { var_SetInteger( p_input, "chapter", index ); } break; } case PREV_FILE: if( p_playlist ) { playlist_Prev( p_playlist ); } break; case NEXT_FILE: if( p_playlist ) { playlist_Next( p_playlist ); } break; case NAVIGATE_PREV: if( p_input ) { vlc_value_t val; /* First try to go to previous chapter */ if( !var_Get( p_input, "chapter", &val ) ) { if( val.i_int > 1 ) { var_SetVoid( p_input, "prev-chapter" ); break; } } /* Try to go to previous title */ if( !var_Get( p_input, "title", &val ) ) { if( val.i_int > 1 ) { var_SetVoid( p_input, "prev-title" ); break; } } /* Try to go to previous file */ if( p_playlist ) { playlist_Prev( p_playlist ); } } break; case NAVIGATE_NEXT: if( p_input ) { /* First try to go to next chapter */ if( !var_Get( p_input, "chapter", &val ) ) { int i_chapter_count = var_CountChoices( p_input, "chapter" ); if( i_chapter_count > val.i_int ) { var_SetVoid( p_input, "next-chapter" ); break; } } /* Try to go to next title */ if( !var_Get( p_input, "title", &val ) ) { int i_title_count = var_CountChoices( p_input, "title" ); if( i_title_count > val.i_int ) { var_SetVoid( p_input, "next-title" ); break; } } /* Try to go to next file */ if( p_playlist ) { playlist_Next( p_playlist ); } } break; // drag'n'drop and system messages case MSG_SOUNDPLAY: // convert soundplay drag'n'drop message (containing paths) // to normal message (containing refs) { const char* path; for ( int32 i = 0; p_message->FindString( "path", i, &path ) == B_OK; i++ ) { entry_ref ref; if ( get_ref_for_path( path, &ref ) == B_OK ) p_message->AddRef( "refs", &ref ); } } // fall through case B_REFS_RECEIVED: case B_SIMPLE_DATA: { /* file(s) opened by the File menu -> append to the playlist; file(s) opened by drag & drop -> replace playlist; file(s) opened by 'shift' + drag & drop -> append */ int32 count; type_code dummy; if( p_message->GetInfo( "refs", &dummy, &count ) != B_OK || count < 1 ) { break; } bool b_remove = ( p_message->WasDropped() && !( modifiers() & B_SHIFT_KEY ) ); if( b_remove && p_playlist ) { playlist_Clear( p_playlist, true ); } entry_ref ref; for( int i = 0; p_message->FindRef( "refs", i, &ref ) == B_OK; i++ ) { BPath path( &ref ); /* TODO: find out if this is a DVD icon */ if( p_playlist ) { playlist_Add( p_playlist, path.Path(), NULL, PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END, true ); } } UpdatePlaylist(); break; } case OPEN_PREFERENCES: { if( fPreferencesWindow->Lock() ) { if (fPreferencesWindow->IsHidden()) fPreferencesWindow->Show(); else fPreferencesWindow->Activate(); fPreferencesWindow->Unlock(); } break; } case OPEN_MESSAGES: { if( fMessagesWindow->Lock() ) { if (fMessagesWindow->IsHidden()) fMessagesWindow->Show(); else fMessagesWindow->Activate(); fMessagesWindow->Unlock(); } break; } case MSG_UPDATE: UpdateInterface(); break; default: BWindow::MessageReceived( p_message ); break; } }