40 #define _WIN32_WINNT 0x0501
42 #include "snackamp_control.h"
55 winsockinit = WSAStartup(0x0101,&winsock);
58 struct addrinfo hints;
59 memset(&hints, 0,
sizeof(
struct addrinfo));
60 hints.ai_family = AF_UNSPEC;
61 hints.ai_socktype = SOCK_STREAM;
63 struct addrinfo *result;
65 char *port_as_string = alloca(16);
66 snprintf(port_as_string, 16,
"%d", port);
68 int return_code = getaddrinfo(
"localhost", port_as_string, &hints, &result);
69 if (return_code != 0) {
75 struct addrinfo *result_p;
76 for (result_p = result; result_p != NULL; result_p = result_p->ai_next)
80 ui->pi->socket_id = socket(result_p->ai_family, result_p->ai_socktype, result_p->ai_protocol);
81 if (ui->pi->socket_id == -1)
87 if (connect(ui->pi->socket_id, result_p->ai_addr, result_p->ai_addrlen) != -1)
93 close(ui->pi->socket_id);
103 if (NULL == (ui->pi->in = fdopen(ui->pi->socket_id,
"r")) ||
104 NULL == (ui->pi->out = fdopen(ui->pi->socket_id,
"w")))
113 setvbuf(ui->pi->out, NULL, _IOLBF, 0);
114 ui->pi->connected = TRUE;
179 static gchar *cut_begin_end(gchar *result)
181 if (strchr(result,
' ') != NULL)
183 gchar *test = strchr(result,
' ');
184 g_snprintf(result, strlen(result),
"%s",test+1);
188 gint result_str = strlen(result);
191 result[result_str - 2] =
'\0';
202 ui->pi->connected = FALSE;
204 gint result = closesocket(ui->pi->socket_id);
208 return close(ui->pi->socket_id);
217 static gchar *snackamp_socket_send_message(gchar *message,
ui_state *ui)
219 gchar *result = malloc(1024 *
sizeof(gchar *));
220 strcpy(result,
"disconnected");
225 gint err1 = send(ui->pi->socket_id, message, strlen(message), 0);
232 gint err = recv(ui->pi->socket_id, result, 1024, 0);
240 fputs(message, ui->pi->out);
241 fgets(result, 1024, ui->pi->in);
248 if (strchr(result,
'\n') != NULL)
251 line_end = strchr(result,
'\n') + 1;
261 static gint get_integer_from_string(gchar *result)
263 gint our_integer = 0;
265 gchar *number = NULL;
266 while ((isdigit(result[i])==0) && (result[i]!=
'\0') && (result[i]!=
'-'))
271 if (! (number == (result + strlen(result))))
273 our_integer = atoi (number);
280 static gboolean snackamp_is_connected(
ui_state *ui)
282 return ui->pi->connected;
288 gchar *result = snackamp_socket_send_message(
"xmms_remote_get_info\n", ui);
289 result = cut_begin_end(result);
292 char *a = strstr(result,
" ");
295 g_snprintf(total_infos, 512,
"disconnected");
300 gchar rate_str[32] = {
'\0' };
301 gchar freq_str[32] = {
'\0' };
302 gchar nch_str[32] = {
'\0' };
305 if (strstr(a+1,
" ") != NULL)
307 ptr = strstr(a+1,
" ") + 1;
312 while (result[i] !=
' ' && isdigit(result[i]) && i < 16)
314 g_sprintf(rate_str,
"%s%c",rate_str,result[i]);
319 if (strchr(result,
' ') != NULL)
321 gchar *test = strchr(result,
' ');
322 g_snprintf(result, strlen(result),
"%s",test+1);
327 while (result[i] !=
' ' && isdigit(result[i]) && i < 16)
329 g_sprintf(freq_str,
"%s%c",freq_str,result[i]);
334 gint nch = atoi(ptr);
337 snprintf(nch_str, 32,
"%s", _(
"stereo"));
341 snprintf(nch_str, 32,
"%s", _(
"mono"));
344 gchar *_Kbps = _(
"Kbps");
345 gchar *_Khz = _(
"Khz");
346 g_snprintf(total_infos, 512,
"%s %s %s %s %s", rate_str, _Kbps, freq_str, _Khz, nch_str);
352 static gint snackamp_get_playlist_pos(
ui_state *ui)
354 gchar *result = snackamp_socket_send_message(
"xmms_remote_get_playlist_pos\n", ui);
355 gint number = get_integer_from_string(result);
366 gint playlist_pos = snackamp_get_playlist_pos(ui);
370 g_snprintf(temp, 100,
"%s %d\n",
"xmms_remote_get_playlist_file", playlist_pos);
372 gchar *result = snackamp_socket_send_message(temp, ui);
373 result = cut_begin_end(result);
381 gchar *result = snackamp_socket_send_message(
"xmms_remote_stop\n", ui);
388 gchar *result = snackamp_socket_send_message(
"xmms_remote_get_playlist_length\n", ui);
389 gint number = get_integer_from_string(result);
406 gint playlist_pos = snackamp_get_playlist_pos(ui);
409 g_snprintf(temp, 100,
"%s %d\n",
"xmms_remote_get_playlist_title",playlist_pos);
411 gchar *result = snackamp_socket_send_message(temp, ui);
412 result = cut_begin_end(result);
420 gchar *result = snackamp_socket_send_message(
"xmms_remote_get_output_time\n", ui);
421 gint pos = get_integer_from_string(result);
430 static gchar *exec_command =
"snackAmp";
431 gchar *exec_this = g_strdup_printf(
"%s &", exec_command);
435 gint timer = time(<);
445 static void snackamp_set_playlist_pos(gint pos,
ui_state *ui)
448 g_snprintf(temp, 100,
"%s %d\n",
"xmms_remote_set_playlist_pos",pos);
449 gchar *result = snackamp_socket_send_message(temp, ui);
457 snackamp_set_playlist_pos(last_song - 1, ui);
463 gchar *result = snackamp_socket_send_message(
"xmms_remote_play\n", ui);
479 while ((song = g_list_nth_data(list, i)) != NULL)
481 gint malloc_int = strlen(song) + 30;
482 gchar *local = malloc(malloc_int *
sizeof(gchar *));
483 g_snprintf(local, malloc_int,
"%s {%s}\n",
"xmms_remote_playlist_add ", song);
485 gchar *result = snackamp_socket_send_message(local, ui);
497 g_snprintf(temp, 100,
"%s %d\n",
"xmms_remote_set_main_volume", volume);
498 gchar *result = snackamp_socket_send_message(temp, ui);
505 gchar *result = snackamp_socket_send_message(
"xmms_remote_get_main_volume\n", ui);
506 gint vol = get_integer_from_string(result);
522 if (ui->pi->connected)
538 gchar *result = snackamp_socket_send_message(
"xmms_remote_pause\n", ui);
545 gchar *result = snackamp_socket_send_message(
"xmms_remote_playlist_next\n", ui);
552 gint playlist_pos = snackamp_get_playlist_pos(ui);
554 if (playlist_pos > 0)
556 gchar *result = snackamp_socket_send_message(
"xmms_remote_playlist_prev\n", ui);
567 gint hundr_secs_pos = position / 10;
568 gint hundr_secs = hundr_secs_pos % 100;
574 gint secs = hundr_secs_pos / 100;
575 gfloat total_pos = hundr_secs + secs * 100;
579 g_snprintf(temp, 100,
"%s %f\n",
"xmms_remote_jump_to_time", total_pos);
581 gchar *result = snackamp_socket_send_message(temp, ui);
588 gchar *result = snackamp_socket_send_message(
"xmms_remote_get_playlist_time\n", ui);
589 gint hundr_secs = get_integer_from_string(result) * 1000;
598 if (!snackamp_is_connected(ui))
603 gchar *result = snackamp_socket_send_message(
"xmms_remote_is_playing\n", ui);
604 gint i = atoi(result);
621 if (!snackamp_is_connected(ui))
626 gchar *result = snackamp_socket_send_message(
"xmms_remote_is_paused\n", ui);
627 result = cut_begin_end(result);
629 gint i = atoi(result);
gchar * snackamp_get_title_song(ui_state *ui)
returns the title of the song
void snackamp_start(ui_state *ui)
starts snackamp
void snackamp_play(ui_state *ui)
plays a song
void snackamp_pause(ui_state *ui)
pause a song
void snackamp_prev(ui_state *ui)
changes to previous song
void snackamp_get_song_infos(gchar *total_infos, ui_state *ui)
gets informations about the song
gint snackamp_get_playlist_number(ui_state *ui)
returns the number of songs of the playlist
gint snackamp_get_total_time(ui_state *ui)
returns total time of the current song
void snackamp_select_last_file(ui_state *ui)
selects the last file in the playlist
void snackamp_stop(ui_state *ui)
stops playing a song
gint snackamp_get_volume(ui_state *ui)
returns volume
gint connect_snackamp(gint port, ui_state *ui)
connecting to the player to the port port
gint disconnect_snackamp(ui_state *ui)
disconnecting with the player possibly returns an error
gint snackamp_get_time_elapsed(ui_state *ui)
returns elapsed time
void snackamp_play_last_file(ui_state *ui)
plays the last file of the playlist
gint snackamp_is_running(ui_state *ui)
returns TRUE if snackamp is running; if not, FALSE
void snackamp_jump(gint position, ui_state *ui)
jump to time
gint snackamp_is_playing(ui_state *ui)
returns TRUE if snackamp is playing, else FALSE
void snackamp_add_files(GList *list, ui_state *ui)
add files to the snackamp playlist
gint snackamp_is_paused(ui_state *ui)
returns TRUE if snackamp is paused, else FALSE
void snackamp_start_with_songs(GList *list, ui_state *ui)
starts snackamp with songs
void snackamp_set_volume(gint volume, ui_state *ui)
sets volume
gchar * snackamp_get_filename(ui_state *ui)
returns the filename
void snackamp_next(ui_state *ui)
changes to next song