static void channel_manage_events (channel_t *c, uint32_t events) { DEBUG(" %s %x/%x/%x (%d) %s", c->which, c->status, c->flags, c->events, count_epoll, __FUNCTION__); ASSERT(!(c->flags & FLAG_LISTED)); if (events & EPOLLERR) return tunnel_abort(c->tunnel, "Channel error: %s", c->which); if (!c->status) // Deleted! return; if (events & EPOLLOUT) { if (c->status == CONNECTING) { c->status = CONNECTED; return channel_update(c); } } if (c->tosend) { ASSERT(c->status == CONNECTED); _pipe_resume(c); } if (events & EPOLLIN) channel_transfer(c); if (events & EPOLLHUP) c->flags |= FLAG_SHUT_RECV; return channel_update(c); }
static int _process_channel(const gchar *channel_directory, GKeyFile *kf, const char *identifier, enum op op, struct channel_configuration *defaults, enclosure_filter *filter) { channel *c; gchar *channel_filename, *channel_file; struct channel_configuration *channel_configuration; enclosure_filter *per_channel_filter = NULL; /* Check channel identifier and read channel configuration. */ if (!g_key_file_has_group(kf, identifier)) { fprintf(stderr, "Unknown channel identifier %s.\n", identifier); return -1; } /* Verify the keys in the channel configuration. */ if (channel_configuration_verify_keys(kf, identifier) < 0) return -1; channel_configuration = channel_configuration_new(kf, identifier, defaults); /* Check that mandatory keys were set. */ if (!channel_configuration->url) { fprintf(stderr, "No feed URL set for channel %s.\n", identifier); channel_configuration_free(channel_configuration); return -1; } if (!channel_configuration->spool_directory) { fprintf(stderr, "No spool directory set for channel %s.\n", identifier); channel_configuration_free(channel_configuration); return -1; } /* Construct channel file name. */ channel_filename = g_strjoin(".", identifier, "xml", NULL); channel_file = g_build_filename(channel_directory, channel_filename, NULL); g_free(channel_filename); if (new_only && access(channel_file, F_OK) == 0) { /* If we are only fetching new channels, skip the channel if there is already a channel file present. */ channel_configuration_free(channel_configuration); return 0; } c = channel_new(channel_configuration->url, channel_file, channel_configuration->spool_directory, resume); g_free(channel_file); if (!c) { fprintf(stderr, "Error parsing channel file for channel %s.\n", identifier); channel_configuration_free(channel_configuration); return -1; } /* Set up per-channel filter unless overridden on the command line. */ if (!filter && channel_configuration->regex_filter) { per_channel_filter = enclosure_filter_new(channel_configuration->regex_filter, FALSE); filter = per_channel_filter; } switch (op) { case OP_UPDATE: channel_update(c, channel_configuration, update_callback, 0, 0, first_only, resume, filter, debug, show_progress_bar); break; case OP_CATCHUP: channel_update(c, channel_configuration, catchup_callback, 1, 0, first_only, 0, filter, debug, show_progress_bar); break; case OP_LIST: channel_update(c, channel_configuration, list_callback, 1, 1, first_only, 0, filter, debug, show_progress_bar); break; } /* Clean-up. */ if (per_channel_filter) enclosure_filter_free(per_channel_filter); channel_free(c); channel_configuration_free(channel_configuration); return 0; }
void main(void) { uint16_t i; char usb_char, err; const char init_msg[] = {'I', 'N', 'I', 'T'}; //extern FILE *stdout = _H_USER; // redirect stdout to USB init(); storage_init(); display_cnt = 0; volume_tick = 0; chan_tick = 0; usb_tick = 0; ir_tick = 0; ir_speedup = 20; dac_lock_tick = 0; display_set_alt(0x00, 0x00, 0x00); display_set(0x00, 0x00, 1); ir_receiver_init(); err = relay_boards_init(); // as side-effect: determine board Type and Id amp_state_init(); set_relays(0x00, 0x00, 0x00, 0x00); display_oled_init(); if (has_oled_display) { display_oled_chars( 0, 0, 5, "hello"); display_set_alt(DIGIT_D, 0x00, 3); } else if (err) display_set_alt(DIGIT_E, 0x01, 3); // Globally enable interrupts #ifdef UseIPEN INTCONbits.GIEH = 1; INTCONbits.GIEL = 1; #else INTCONbits.PEIE = 1; INTCONbits.GIE = 1; #endif // (re-)launch USB activity prev_usb_bus_sense = 0; usb_write(init_msg, (uint8_t) 4); // The above 'set_relays' enabled the power relay for the analog supply. #ifdef __DEBUG power_tick = 0; #else power_tick = 120; #endif // Set a timer to later undo the mute and activate last volume setting. // wait some time for stabilization before enabling all other interrupts while (power_tick > 0) ; // gets decreased on timer interrupts, 183Hz // power==0 now, from amp_state_init(). // incr power now quickly to 1, and later to 2. power_incr = 1; INTCON3bits.INT1IF = 0; INTCON3bits.INT1IE = 1; INTCON3bits.INT2IF = 0; INTCON3bits.INT2IE = 1; INTCON3bits.INT3IF = 0; INTCON3bits.INT3IE = 1; // Check if a DAC is present in this Relaixed, if so initialize. // This check was delayed to allow DAC power-up, otherwise its i2c interface stays in reset dac_init(); while (1) { if (volume_incr) volume_update(); if (balance_incr > 1 || balance_incr < -1) // suppress a single tick, might have been by accident balance_update(); if (channel_incr) channel_update(); if (power_incr) { if (flash_tick != 0 && power_incr < 0) { // quickly save recent volume/balance update flash_tick = 0; flash_volume_channel(); } else if (power_incr > 0 && power_state() == 0) { // if we move power_state from 0 to 1, we surely want to go later to 2 // For RelaixedPassive: wait somewhat longer for its soft-switch main power power_tick = (isRelaixedXLR) ? 500 : 700; } if (power_incr > 0) dac_init(); // check (again) for presence of DAC: it needs time to get out of reset power_update(); } if (ir_received_ok) { ir_received_ok = 0; ir_handle_code(); if (volume_incr) { vol_usb_msg[0] = 'V'; // when 'volume' keeps pressed, the volume-tick-speed goes up if (ir_speedup <= 49) ir_speedup += 4; } else { vol_usb_msg[0] = 'v'; ir_speedup = 20; } byte2hex(vol_usb_msg + 1, ir_tick); byte2hex(vol_usb_msg + 3, ir_speedup); if (power_incr) ir_tick = 100; // increase the default 20 to 100 on power on/off else flash_tick = 400; usb_write(vol_usb_msg, 5); } if (flash_tick == 1) { flash_tick = 0; flash_volume_channel(); } if (dac_status() >= DAC_NOLOCK && dac_lock_tick == 0) { dac_check_lock(); dac_lock_tick = 45; // check lock 4x per secnd } /* some I/O to check repeatedly, for absence of interrupt-on-change */ check_usb_power(err); } }
void main(void) { unsigned int i; char usb_char, err; const char init_msg[] = {'I', 'N', 'I', 'T'}; extern FILE *stdout = _H_USER; // redirect stdout to USB init(); display_cnt = 0; volume_tick = 0; chan_tick = 0; usb_tick = 0; ir_tick = 0; display_set( 0x00, 0x00); display_set_alt( 0x00, 0x00, 0x00); ir_receiver_init(); storage_init(); err = relay_boards_init(); set_relays(0x00, 0x00, 0x00, 0x00, 0x00); amp_state_init(); if (err) display_set_alt( DIGIT_E, 0x01, 3); // Globally enable interrupts #ifdef UseIPEN INTCONbits.GIEH = 1; INTCONbits.GIEL = 1; #else INTCONbits.PEIE = 1; INTCONbits.GIE = 1; #endif // (re-)launch USB activity prev_usb_bus_sense = 0; usb_write( init_msg, (byte)4); // The above 'set_relays' enabled the power relay for the analog supply. power_tick = 150; // Set a timer to later undo the mute and activate last volume setting. // wait some time for stabilization before enabling all other interrupts while (power_tick > 0) ; // gets decreased on timer interrupts // power==0 now, from amp_state_init(). // incr power now quickly to 1, and later to 2. power_incr = 1; INTCON3bits.INT1IF = 0; INTCON3bits.INT1IE = 1; INTCON3bits.INT2IF = 0; INTCON3bits.INT2IE = 1; INTCON3bits.INT3IF = 0; INTCON3bits.INT3IE = 1; while (1) { if (volume_incr) volume_update(); if (balance_incr > 1 || balance_incr < -1) // suppress a single tick, might have been by accident balance_update(); if (channel_incr) channel_update(); if (power_incr) { if (flash_tick && power_incr < 0) { // quickly save recent volume/balance update flash_tick = 0; flash_volume_channel(); } else if (power_incr > 0 && power_state() == 0) { // if we move power_state from 0 to 1, we surely want to go later to 2 power_tick = 500; } power_update(); } if (ir_received_ok) { ir_received_ok = 0; ir_handle_code(); if (power_incr) ir_tick = 100; else flash_tick = 400; } if (flash_tick == 1) { flash_tick = 0; flash_volume_channel(); } /* some I/O to check repeatedly, for absence of interrupt-on-change */ check_usb_power(err); } }