📄 interface.c
字号:
if( (p_main->p_aout != NULL) && (p_main->p_aout->vol)) { i_volbackup = p_main->p_aout->vol; p_main->p_aout->vol = 0; } else if( (p_main->p_aout != NULL) && (!p_main->p_aout->vol)) p_main->p_aout->vol = i_volbackup; break; case 'g': /* gamma - */ if( (p_intf->p_vout != NULL) && (p_intf->p_vout->f_gamma > -INTF_GAMMA_LIMIT) ) { vlc_mutex_lock( &p_intf->p_vout->change_lock ); p_intf->p_vout->f_gamma -= INTF_GAMMA_STEP; p_intf->p_vout->i_changes |= VOUT_GAMMA_CHANGE; vlc_mutex_unlock( &p_intf->p_vout->change_lock ); } break; case 'G': /* gamma + */ if( (p_intf->p_vout != NULL) && (p_intf->p_vout->f_gamma < INTF_GAMMA_LIMIT) ) { vlc_mutex_lock( &p_intf->p_vout->change_lock ); p_intf->p_vout->f_gamma += INTF_GAMMA_STEP; p_intf->p_vout->i_changes |= VOUT_GAMMA_CHANGE; vlc_mutex_unlock( &p_intf->p_vout->change_lock ); } break; case 'c': /* toggle grayscale */ if( p_intf->p_vout != NULL ) { vlc_mutex_lock( &p_intf->p_vout->change_lock ); p_intf->p_vout->b_grayscale = !p_intf->p_vout->b_grayscale; p_intf->p_vout->i_changes |= VOUT_GRAYSCALE_CHANGE; vlc_mutex_unlock( &p_intf->p_vout->change_lock ); } break; case ' ': /* toggle interface */ if( p_intf->p_vout != NULL ) { vlc_mutex_lock( &p_intf->p_vout->change_lock ); p_intf->p_vout->b_interface = !p_intf->p_vout->b_interface; p_intf->p_vout->i_changes |= VOUT_INTF_CHANGE; vlc_mutex_unlock( &p_intf->p_vout->change_lock ); } break; case 'i': /* toggle info */ if( p_intf->p_vout != NULL ) { vlc_mutex_lock( &p_intf->p_vout->change_lock ); p_intf->p_vout->b_info = !p_intf->p_vout->b_info; p_intf->p_vout->i_changes |= VOUT_INFO_CHANGE; vlc_mutex_unlock( &p_intf->p_vout->change_lock ); } break; case 's': /* toggle scaling */ if( p_intf->p_vout != NULL ) { vlc_mutex_lock( &p_intf->p_vout->change_lock ); p_intf->p_vout->b_scale = !p_intf->p_vout->b_scale; p_intf->p_vout->i_changes |= VOUT_SCALE_CHANGE; vlc_mutex_unlock( &p_intf->p_vout->change_lock ); } break; default: /* unknown key */ return( 1 ); } return( 0 );}/* following functions are local *//***************************************************************************** * LoadChannels: load channels description from a file ***************************************************************************** * This structe describes all interface-specific data of the main (interface) * thread. * Each line of the file is a semicolon separated list of the following * fields : * integer channel number * string channel description * integer input method (see input.h) * string input source * integer input port * integer input vlan * The last field must end with a semicolon. * Comments and empty lines are not explicitely allowed, but lines with parsing * errors are ignored without warning. *****************************************************************************/static int LoadChannels( intf_thread_t *p_intf, char *psz_filename ){ FILE * p_file; /* file */ intf_channel_t * p_channel; /* current channel */ char psz_line[INTF_MAX_CMD_SIZE]; /* line buffer */ int i_index; /* channel or field index */ /* Set default value */ p_intf->p_channel = NULL; /* Open file */ p_file = fopen( psz_filename, "r" ); if( p_file == NULL ) { intf_ErrMsg("error: can't open %s (%s)\n", psz_filename, strerror(errno)); return( 1 ); } /* First pass: count number of lines */ for( i_index = 0; fgets( psz_line, INTF_MAX_CMD_SIZE, p_file ) != NULL; i_index++ ) { ; } if( i_index != 0 ) { /* Allocate array and rewind - some of the lines may be invalid, and the * array will probably be larger than the actual number of channels, but * it has no consequence. */ p_intf->p_channel = malloc( sizeof( intf_channel_t ) * i_index ); if( p_intf->p_channel == NULL ) { intf_ErrMsg("error: %s\n", strerror(ENOMEM)); fclose( p_file ); return( 1 ); } p_channel = p_intf->p_channel; rewind( p_file ); /* Second pass: read channels descriptions */ while( fgets( psz_line, INTF_MAX_CMD_SIZE, p_file ) != NULL ) { if( !ParseChannel( p_channel, psz_line ) ) { intf_DbgMsg( "channel [%d] %s : method %d (%s:%d vlan %d)\n", p_channel->i_channel, p_channel->psz_description, p_channel->i_input_method, p_channel->psz_input_source, p_channel->i_input_port, p_channel->i_input_vlan ); p_channel++; } } /* Add marker at the end of the array */ p_channel->i_channel = -1; } /* Close file */ fclose( p_file ); return( 0 );}/***************************************************************************** * UnloadChannels: unload channels description ***************************************************************************** * This function free all resources allocated by LoadChannels, if any. *****************************************************************************/static void UnloadChannels( intf_thread_t *p_intf ){ int i_channel; /* channel index */ if( p_intf->p_channel != NULL ) { /* Free allocated strings */ for( i_channel = 0; p_intf->p_channel[ i_channel ].i_channel != -1; i_channel++ ) { if( p_intf->p_channel[ i_channel ].psz_description != NULL ) { free( p_intf->p_channel[ i_channel ].psz_description ); } if( p_intf->p_channel[ i_channel ].psz_input_source != NULL ) { free( p_intf->p_channel[ i_channel ].psz_input_source ); } } /* Free array */ free( p_intf->p_channel ); p_intf->p_channel = NULL; }}/***************************************************************************** * ParseChannel: parse a channel description line ***************************************************************************** * See LoadChannels. This function return non 0 on parsing error. *****************************************************************************/static int ParseChannel( intf_channel_t *p_channel, char *psz_str ){ char * psz_index; /* current character */ char * psz_end; /* end pointer for strtol */ int i_field; /* field number, -1 on error */ int i_field_length; /* field length, for text fields */ /* Set some default fields */ p_channel->i_channel = 0; p_channel->psz_description = NULL; p_channel->i_input_method = 0; p_channel->psz_input_source = NULL; p_channel->i_input_port = 0; p_channel->i_input_vlan = 0; /* Parse string */ i_field = 0; for( psz_index = psz_str; (i_field != -1) && (*psz_index != '\0'); psz_index++ ) { if( *psz_index == ';' ) { /* Mark end of field */ *psz_index = '\0'; /* Parse field */ switch( i_field++ ) { case 0: /* channel number */ p_channel->i_channel = strtol( psz_str, &psz_end, 0); if( (*psz_str == '\0') || (*psz_end != '\0') ) { i_field = -1; } break; case 1: /* channel description */ i_field_length = strlen( psz_str ); if( i_field_length != 0 ) { p_channel->psz_description = malloc( i_field_length + 1 ); if( p_channel->psz_description == NULL ) { intf_ErrMsg("error: %s\n", strerror( ENOMEM )); i_field = -1; } else { strcpy( p_channel->psz_description, psz_str ); } } break; case 2: /* input method */ p_channel->i_input_method = strtol( psz_str, &psz_end, 0); if( (*psz_str == '\0') || (*psz_end != '\0') ) { i_field = -1; } break; case 3: /* input source */ i_field_length = strlen( psz_str ); if( i_field_length != 0 ) { p_channel->psz_input_source = malloc( i_field_length + 1 ); if( p_channel->psz_input_source == NULL ) { intf_ErrMsg("error: %s\n", strerror( ENOMEM )); i_field = -1; } else { strcpy( p_channel->psz_input_source, psz_str ); } } break; case 4: /* input port */ p_channel->i_input_port = strtol( psz_str, &psz_end, 0); if( (*psz_str == '\0') || (*psz_end != '\0') ) { i_field = -1; } break; case 5: /* input vlan */ p_channel->i_channel = strtol( psz_str, &psz_end, 0); if( (*psz_str == '\0') || (*psz_end != '\0') ) { i_field = -1; } break; /* ... following fields are ignored */ } /* Set new beginning of field */ psz_str = psz_index + 1; } } /* At least the first three fields must be parsed sucessfully for function * success. Other parsing errors are returned using i_field = -1. */ if( i_field < 3 ) { /* Function fails. Free allocated strings */ if( p_channel->psz_description != NULL ) { free( p_channel->psz_description ); } if( p_channel->psz_input_source != NULL ) { free( p_channel->psz_input_source ); } return( 1 ); } /* Return success */ return( 0 );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -