#ifndef __KRY_WAVEFORM_H__ #define __KRY_WAVEFORM_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define KRY_WAVEFORM(obj) GTK_CHECK_CAST (obj, kry_waveform_get_type (), KryWaveform) #define KRY_WAVEFORM_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, kry_waveform_get_type (), KryWaveformClass) #define KRY_IS_WAVEFORM(obj) GTK_CHECK_TYPE (obj, kry_waveform_get_type ()) typedef struct _KryWaveform KryWaveform; typedef struct _KryWaveformClass KryWaveformClass; /**** WARNING: IF THIS ENUM IS CHANGED, THE COLORS STRUCTURE IN THE CPP FILE MUST BE CHANGED AS WELL ****/ enum waveform_colors { WAVEFORM_COLOR_LINE, WAVEFORM_COLOR_MARKER_START, WAVEFORM_COLOR_MARKER_CURRENT, WAVEFORM_COLOR_MARKER_END, WAVEFORM_COLOR_MARKER_KEYFRAME, WAVEFORM_COLOR_MARKER_TIME, WAVEFORM_COLOR_BACKGROUND, WAVEFORM_COLOR_TEXT, WAVEFORM_COLOR_LINE_HIGHLIGHT, WAVEFORM_COLOR_MARKER_KARAOKE, WAVEFORM_COLOR_SELECTION_HIGHLIGHT, WAVEFORM_COLOR_SILENCE_HIGHLIGHT, WAVEFORM_COLOR_SCRUB_BAR_SLIDER, WAVEFORM_COLOR_SCRUB_BAR_EXTENSION, WAVEFORM_COLOR_SCRUB_BAR_SEPARATOR, WAVEFORM_COLOR_COUNT, }; enum KryWaveformMarkerCornerType { MARKER_CORNER_NONE, MARKER_CORNER_START, MARKER_CORNER_END }; struct KryWaveformMarkerInfo { KryMarker *marker; int pos_rel_pixel; int colorid; gboolean draw; KryWaveformMarkerCornerType corner_type; }; struct KryWaveformDataInfo { char *waveform_data; int length_seconds; unsigned char max_neg; unsigned char max_pos; int vals_per_sec; }; struct KryWaveformKeyframeList { long *list; int count; }; struct _KryWaveform { GtkWidget item; KryWaveformDataInfo *data_info; gboolean show_scrub_bar; gboolean show_time_bar; gboolean show_time_markers; gboolean show_keyframe; long left_previous; long left; //left offset of waveform, unit is 'values' KryWaveformKeyframeList *keyframe_list; long *keyframes_rel; int keyframes_rel_count; GtkAdjustment *adjustment; gboolean button_press; #ifdef _WINDOWS HDC dc; HDC backbuffer_waveonly; HDC backbuffer_final; HBITMAP bitmap_backbuffer_waveonly; HBITMAP bitmap_backbuffer_final; HCURSOR cursor_normal; HCURSOR cursor_drag; #else PangoLayout *layout; GdkPixmap *backbuffer_waveonly; GdkPixmap *backbuffer_final; GdkCursor *cursor_drag; #endif int marker_width; int corner_width; double min_zoom; double zoom; // how many data points are counted in one pixel double data_per_pixel; double scale; GThread *data_thread; GMutex *data_thread_mutex; GMutex *data_thread_mutex_global; gboolean data_thread_quit; char *data_pixel; int data_pixel_length; char *data_time; #ifdef _WINDOWS // HPEN colors[WAVEFORM_COLOR_COUNT]; HBRUSH black_brush; HFONT font; #else GdkColor colors[WAVEFORM_COLOR_COUNT]; GdkGC *gc; #endif GList *markers; KryRegionFixedList *region_fixed_list; pavl_traverser region_fixed_list_iter; GList *region_list; // marker affected by left/right click KryMarker *marker_active_start; KryMarker *marker_active_end; KryMarker *marker_autoscroll; // marker being dragged KryMarker *marker_dragging; gboolean drag_select; kryColorTable *color_table; int signal_color_change; gboolean draw_disabled; gboolean drag_selection_enabled; gboolean drag_markers_enabled; int scrub_bar_height; int scrub_bar_height_real; int scrub_bar_left_ext; int scrub_bar_right_ext; int scrub_bar_left; int scrub_bar_width; gboolean is_scrub_bar_dragging; int scrub_bar_drag_offset; int time_bar_height; int time_bar_height_real; int wave_height; GdkRectangle last_draw_rect; //GMutex *mutex_markers; }; struct _KryWaveformClass { GtkWidgetClass parent_class; void (*zoom_changed) (KryWaveform *waveform, double zoom); void (*min_zoom_changed) (KryWaveform *waveform, double zoom); void (*scale_changed) (KryWaveform *waveform, int scale); }; GtkWidget *kry_waveform_new(KryWaveformDataInfo *info, GtkAdjustment *adjustment, kryColorTable *color_table); GtkType kry_waveform_get_type(void); GtkAdjustment* kry_waveform_get_adjustment(KryWaveform *waveform); void kry_waveform_set_update_policy(KryWaveform *waveform, GtkUpdateType policy); int kry_waveform_rel_pixel_from_mili(KryWaveform *waveform, long time); int kry_waveform_mili_from_rel_pixel(KryWaveform *waveform, int pos); int kry_waveform_abs_pixel_from_rel(KryWaveform *waveform, int pixel); struct sound_info *kry_waveform_get_sound_info(KryWaveform *widget); void kry_waveform_set_current_marker(KryWaveform *widget, long value); double kry_waveform_get_zoom_min(KryWaveform *waveform); double kry_waveform_get_zoom_max(KryWaveform *waveform); double kry_waveform_get_zoom(KryWaveform *waveform); void kry_waveform_set_zoom(KryWaveform *waveform, double factor); void kry_waveform_focus_selected(KryWaveform *waveform); gboolean kry_waveform_get_show_time_bar(KryWaveform *waveform); gboolean kry_waveform_get_show_keyframes(KryWaveform *waveform); void kry_waveform_set_show_time_bar(KryWaveform *waveform, gboolean val); void kry_waveform_set_show_time_markers(KryWaveform *waveform, gboolean val); void kry_waveform_set_show_scrub_bar(KryWaveform *waveform, gboolean val); void kry_waveform_set_show_keyframes(KryWaveform *waveform, gboolean val); KryWaveformKeyframeList *kry_waveform_get_keyframe_list(KryWaveform *waveform); void kry_waveform_set_keyframe_list(KryWaveform *waveform, KryWaveformKeyframeList *list); void kry_waveform_setup_rel_keyframe_list(KryWaveform *waveform); void kry_waveform_marker_add(KryWaveform *waveform, KryMarker *marker); void kry_waveform_marker_set_active_start(KryWaveform *waveform, KryMarker *marker); void kry_waveform_marker_set_active_end(KryWaveform *waveform, KryMarker *marker); void kry_waveform_marker_set_autoscroll(KryWaveform *waveform, KryMarker *marker); void kry_waveform_marker_remove(KryWaveform *waveform, KryMarker *marker); void kry_waveform_marker_remove_by_type(KryWaveform *waveform, enum marker_type type); void kry_waveform_marker_remove_all(KryWaveform *waveform); void kry_waveform_marker_show(KryWaveform *waveform, KryMarker *marker); void kry_waveform_marker_hide(KryWaveform *waveform, KryMarker *marker); void kry_waveform_marker_draw_erase(GtkWidget *widget, int mili, int mili_prev); void kry_waveform_region_fixed_add(KryWaveform *waveform, int start, int end); void kry_waveform_region_add(KryWaveform *waveform, KryRegion *region); void kry_waveform_region_add_new(KryWaveform *waveform, KryMarker *marker_left, KryMarker *marker_right, int color_id = -1); void kry_waveform_region_remove_by_type(KryWaveform *waveform, int color_id); void kry_waveform_region_remove_all(KryWaveform *waveform); void kry_waveform_region_fixed_list_set(KryWaveform *waveform, KryRegionFixedList *list); void kry_waveform_set_scale(KryWaveform *waveform, int value); double kry_waveform_get_scale(KryWaveform *waveform); KryMarker *kry_waveform_get_marker(KryWaveform *waveform, enum marker_type type); kryColorTable *kry_waveform_get_color_table(KryWaveform *waveform); void kry_waveform_disable_draw(KryWaveform *widget); void kry_waveform_enable_draw(KryWaveform *widget); void kry_waveform_backbuffer_draw_time_bar(KryWaveform *waveform); void kry_waveform_update_front_buffer_rect(KryWaveform *waveform, GdkRectangle *rect); void kry_waveform_update_front_buffer(KryWaveform *waveform, int x, int width); void kry_waveform_update_front_buffer_fast(KryWaveform *waveform, int x, int width); void kry_waveform_fill_backbuffer(GtkWidget *widget); gboolean kry_waveform_expose( GtkWidget *widget, GdkEventExpose *event ); void kry_waveform_backbuffer_draw_wave(GtkWidget *widget, int start, int width); void kry_waveform_backbuffer_draw_final(GtkWidget *widget, int start, int width, gboolean force_draw_wave, gboolean draw_time_bar); void kry_waveform_backbuffer_draw_time_bar(KryWaveform *waveform); void kry_waveform_set_drag_selection(KryWaveform *waveform, gboolean drag); void kry_waveform_set_marker_dragging(KryWaveform *waveform, gboolean drag); int kry_waveform_get_index_at_rel_pixel(KryWaveform *waveform, int pixel); void kry_waveform_data_ensure_available(KryWaveform *waveform, int sec_start, int sec_end); int kry_waveform_get_index_at_abs_pixel(KryWaveform *waveform, int pixel); int kry_waveform_abs_pixel_from_mili(KryWaveform *waveform, long time); void kry_waveform_data_thread_end(KryWaveform *waveform); void kry_waveform_set_adjustment (KryWaveform *waveform, GtkAdjustment *adjustment); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __KRY_WAVEFORM_H__ */