forked from YongChingTee/spectrogram_gtk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgtk_final.c
130 lines (107 loc) · 3.07 KB
/
gtk_final.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>
#include <math.h>
#define AXIS_START 21
//#define SAMP_RATE 256
#define CAMERA_WIDTH 1024
#define CAMERA_HEIGHT (SAMP_RATE+AXIS_START)
struct pixel
{
unsigned char red, green, blue;
} rgbImage[CAMERA_WIDTH * CAMERA_HEIGHT];
GtkWidget *image;
FILE *file;
//int count = 0;
char buff[20];
float *buffer;
int SAMP_RATE;
float
int loadImage()
{
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_data((unsigned char*)rgbImage, GDK_COLORSPACE_RGB, FALSE, 8, CAMERA_WIDTH, CAMERA_HEIGHT, CAMERA_WIDTH * 3, NULL, NULL);
gtk_image_set_from_pixbuf((GtkImage*) image, pixbuf);
gtk_widget_queue_draw(image);
return 0;
}
int shift()
{
int i, j;
for(j=0; j<CAMERA_HEIGHT-AXIS_START; j++)
{
for(i = CAMERA_WIDTH-1; i >=AXIS_START+2; i--)
{
rgbImage[j*CAMERA_WIDTH+i] = rgbImage[j*CAMERA_WIDTH+i-1];
}
}
//read from socket
for(i = 0 ; i < SAMP_RATE; i++)
{
buffer[i] = fft_data[i];
}
//fclose(file);
for(i = CAMERA_HEIGHT-AXIS_START-1; i>=0 ; i--)
{
rgbImage[i*CAMERA_WIDTH+AXIS_START+1].blue = MIN((MAX((4*(0.75-buffer[i])), 0.)), 1.) * 255;
rgbImage[i*CAMERA_WIDTH+AXIS_START+1].red = MIN((MAX((4*(buffer[i]-0.25)), 0.)), 1.) * 255;
rgbImage[i*CAMERA_WIDTH+AXIS_START+1].green = MIN((MAX((4*fabs(buffer[i]-0.5)-1.), 0.)), 1.) * 255;
}
//count++;
loadImage();
return 1;
}
void start( int ptsperfft)
{
GtkWidget *window;
int i, j, k;
SAMP_RATE = ptsperfft;
buffer = malloc(sizeof(float) * ptsperfft);
/*
file = fopen("chirpFFT.txt", "r"); //open file
if(file == NULL)
{
printf("ERROR! no file");
system("pause");
}
*/
//gtk initialization
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Image2");
gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
gtk_container_set_border_width(GTK_CONTAINER(window), 2);
image = gtk_image_new();
gtk_container_add(GTK_CONTAINER(window), image);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
gtk_widget_show_all(window);
//AXIS
for(i = 0; i< CAMERA_HEIGHT; i++)
{
rgbImage[i*CAMERA_WIDTH + AXIS_START].red = 255;
rgbImage[i*CAMERA_WIDTH + AXIS_START].green = 255;
rgbImage[i*CAMERA_WIDTH + AXIS_START].blue = 255;
}
for(i = 0; i< CAMERA_WIDTH; i++)
{
rgbImage[i+(CAMERA_HEIGHT-AXIS_START)*CAMERA_WIDTH].red = 255;
rgbImage[i+(CAMERA_HEIGHT-AXIS_START)*CAMERA_WIDTH].green = 255;
rgbImage[i+(CAMERA_HEIGHT-AXIS_START)*CAMERA_WIDTH].blue = 255;
}
for(j = 0; j < CAMERA_WIDTH-AXIS_START; j++)
{
for(i = CAMERA_HEIGHT-AXIS_START-1; i>=0 ; i--)
{
rgbImage[j+i*CAMERA_WIDTH+AXIS_START+1].blue = MIN((MAX((4*(0.75-0)), 0.)), 1.) * 255;
rgbImage[j+i*CAMERA_WIDTH+AXIS_START+1].red = MIN((MAX((4*(0-0.25)), 0.)), 1.) * 255;
rgbImage[j+i*CAMERA_WIDTH+AXIS_START+1].green = MIN((MAX((4*fabs(0-0.5)-1.), 0.)), 1.) * 255;
}
}
//loadeImage function
loadImage();
//call shift every 10msec
gint func_ref = g_timeout_add(10, shift, NULL);
gtk_main();
g_source_remove (func_ref);
return 0;
}