int main(void) { gfxInitDefault(); if(R_FAILED(ndspInit())) return 0; #ifdef DEBUG LightLock_Init(&debug_lock); consoleInit(GFX_BOTTOM, &bottomScreen); consoleDebugInit(debugDevice_CONSOLE); #endif consoleInit(GFX_TOP, &topScreen); //aptHook(&hookCookie, AptEventHook, NULL); svcCreateEvent(&bufferReadyConsumeRequest, RESET_STICKY); svcCreateEvent(&bufferReadyProduceRequest, RESET_STICKY); getFiles(); bool exit = false; while (!exit) { std::string filename = select_file(); exit = stream_file(filename); } ndspExit(); gfxExit(); return 0; }
int save_todolist(TODOLIST *todolist, char *filename) { STREAM *file = stream_file(filename, "w"); if (!file) { error("%s", strerror(errno)); return 0; } write_todolist(file, todolist); stream_close(file); return 1; }
TODOLIST *load_todolist(char *filename) { TODOLIST *list = NULL; STREAM *file = stream_file(filename, "r"); if (!file) { if (touch_file(filename)) { return load_todolist(filename); } else { error("%s", strerror(errno)); return NULL; } } list = read_todolist(file); stream_close(file); return list; }
/* * Nutella SERVER */ int main(int argc, char** argv) { port = PORT; request_address = M_REQ_ADDR; request_port = M_REQ_PORT; response_address = M_RES_ADDR; response_port = M_RES_PORT; int c; while((c = getopt(argc, argv, "d:q:s:p:h")) != EOF){ switch(c){ case 'd': movie_dir = optarg; break; case 'q': request_address = optarg; request_port = get_port(request_address); break; case 's': response_address = optarg; response_port = get_port(response_address); break; case 'p': port = atoi(optarg); break; case 'h': default: usage(argv); break; } } if(!movie_dir){ usage(argv); } //get hostname char hostname[256]; if((gethostname(hostname, 256)) < 0){ fprintf(stderr, "Unable to get hostname\n"); exit(1); } sprintf(connectAddr, "%s:%d", hostname, port); printf("connectTo: %s\n", connectAddr); int mdlen = strlen(movie_dir); if(movie_dir[mdlen-1] == '/'){ movie_dir[mdlen-1] = '\0'; } //create a thread to handle multicast request/response loop pthread_t query_thread; pthread_create(&query_thread, NULL, monitor_queries, NULL); int sock = socket_server(port); while(1){ int client = socket_accept(sock); if(client > 0){ int pid = fork(); if(pid == 0){ char* request = socket_read(client); printf("Streaming %s...\n", request); stream_file(client, request); socket_write(client, "end\n"); //end stream with blank frame close(client); printf("done streaming \"%s\"\n", request); exit(0); } } } return 0; }
static void process_strm(u8_t *pkt, int len) { struct strm_packet *strm = (struct strm_packet *)pkt; LOG_INFO("strm command %c", strm->command); switch(strm->command) { case 't': sendSTAT("STMt", strm->replay_gain); // STMt replay_gain is no longer used to track latency, but support it break; case 'q': output_flush(); status.frames_played = 0; stream_disconnect(); sendSTAT("STMf", 0); buf_flush(streambuf); break; case 'f': output_flush(); status.frames_played = 0; if (stream_disconnect()) { sendSTAT("STMf", 0); } buf_flush(streambuf); break; case 'p': { unsigned interval = unpackN(&strm->replay_gain); LOCK_O; output.pause_frames = interval * status.current_sample_rate / 1000; output.state = interval ? OUTPUT_PAUSE_FRAMES : OUTPUT_STOPPED; UNLOCK_O; if (!interval) sendSTAT("STMp", 0); LOG_INFO("pause interval: %u", interval); } break; case 'a': { unsigned interval = unpackN(&strm->replay_gain); LOCK_O; output.skip_frames = interval * status.current_sample_rate / 1000; output.state = OUTPUT_SKIP_FRAMES; UNLOCK_O; LOG_INFO("skip ahead interval: %u", interval); } break; case 'u': { unsigned jiffies = unpackN(&strm->replay_gain); LOCK_O; output.state = jiffies ? OUTPUT_START_AT : OUTPUT_RUNNING; output.start_at = jiffies; UNLOCK_O; LOCK_D; decode.state = DECODE_RUNNING; UNLOCK_D; LOG_INFO("unpause at: %u now: %u", jiffies, gettime_ms()); sendSTAT("STMr", 0); } break; case 's': { unsigned header_len = len - sizeof(struct strm_packet); char *header = (char *)(pkt + sizeof(struct strm_packet)); in_addr_t ip = (in_addr_t)strm->server_ip; // keep in network byte order u16_t port = strm->server_port; // keep in network byte order if (ip == 0) ip = slimproto_ip; LOG_INFO("strm s autostart: %c transition period: %u transition type: %u", strm->autostart, strm->transition_period, strm->transition_type - '0'); autostart = strm->autostart - '0'; sendSTAT("STMf", 0); if (header_len > MAX_HEADER -1) { LOG_WARN("header too long: %u", header_len); break; } codec_open(strm->format, strm->pcm_sample_size, strm->pcm_sample_rate, strm->pcm_channels, strm->pcm_endianness); if (ip == LOCAL_PLAYER_IP && port == LOCAL_PLAYER_PORT) { // extension to slimproto for LocalPlayer - header is filename not http header, don't expect cont stream_file(header, header_len, strm->threshold * 1024); autostart -= 2; } else { stream_sock(ip, port, header, header_len, strm->threshold * 1024, autostart >= 2); } sendSTAT("STMc", 0); sentSTMu = sentSTMo = sentSTMl = false; LOCK_O; output.threshold = strm->output_threshold; output.next_replay_gain = unpackN(&strm->replay_gain); output.fade_mode = strm->transition_type - '0'; output.fade_secs = strm->transition_period; LOG_INFO("set fade mode: %u", output.fade_mode); UNLOCK_O; } break; default: LOG_INFO("unhandled strm %c", strm->command); break; } }