void decode_initialize(t_uint32 p_subsong, unsigned p_flags, abort_callback &p_abort) { int duration = get_song_duration(p_subsong, true); if (!ASAP_PlaySong(asap, p_subsong, duration)) throw exception_io_unsupported_format(); ASAP_MutePokeyChannels(asap, mute_mask); }
int playSong(int song) { int duration = getSongDurationInternal(ASAP_GetInfo(asap), song, asap); ASAP_PlaySong(asap, song, duration); /* FIXME: check errors */ ASAP_MutePokeyChannels(asap, mute_mask); return duration; }
void decode_initialize(t_uint32 p_subsong, unsigned p_flags, abort_callback &p_abort) { int duration = module_info.durations[p_subsong]; if (duration < 0) { if (silence_seconds > 0) ASAP_DetectSilence(&asap, silence_seconds); duration = 1000 * song_length; } if (play_loops && module_info.loops[p_subsong]) duration = 1000 * song_length; ASAP_PlaySong(&asap, p_subsong, duration); ASAP_MutePokeyChannels(&asap, mute_mask); }
/* this is the codec entry point */ enum codec_status codec_main(void) { int n_bytes; int song; int duration; char* module; int bytesPerSample =2; next_track: if (codec_init()) { DEBUGF("codec init failed\n"); return CODEC_ERROR; } while (!*ci->taginfo_ready && !ci->stop_codec) ci->sleep(1); codec_set_replaygain(ci->id3); int bytes_done =0; size_t filesize; ci->seek_buffer(0); module = ci->request_buffer(&filesize, ci->filesize); if (!module || (size_t)filesize < (size_t)ci->filesize) { DEBUGF("loading error\n"); return CODEC_ERROR; } /*Init ASAP */ if (!ASAP_Load(&asap, ci->id3->path, module, filesize)) { DEBUGF("%s: format not supported",ci->id3->path); return CODEC_ERROR; } /* Make use of 44.1khz */ ci->configure(DSP_SET_FREQUENCY, 44100); /* Sample depth is 16 bit little endian */ ci->configure(DSP_SET_SAMPLE_DEPTH, 16); /* Stereo or Mono output ? */ if(asap.module_info.channels ==1) { ci->configure(DSP_SET_STEREO_MODE, STEREO_MONO); bytesPerSample = 2; } else { ci->configure(DSP_SET_STEREO_MODE, STEREO_INTERLEAVED); bytesPerSample = 4; } /* reset eleapsed */ ci->set_elapsed(0); song = asap.module_info.default_song; duration = asap.module_info.durations[song]; if (duration < 0) duration = 180 * 1000; /* set id3 length, because metadata parse might not have done it */ ci->id3->length = duration; ASAP_PlaySong(&asap, song, duration); ASAP_MutePokeyChannels(&asap, 0); /* The main decoder loop */ while (1) { ci->yield(); if (ci->stop_codec || ci->new_track) break; if (ci->seek_time) { /* New time is ready in ci->seek_time */ /* seek to pos */ ASAP_Seek(&asap,ci->seek_time); /* update elapsed */ ci->set_elapsed(ci->seek_time); /* update bytes_done */ bytes_done = ci->seek_time*44.1*2; /* seek ready */ ci->seek_complete(); } /* Generate a buffer full of Audio */ #ifdef ROCKBOX_LITTLE_ENDIAN n_bytes = ASAP_Generate(&asap, samples, sizeof(samples), ASAP_FORMAT_S16_LE); #else n_bytes = ASAP_Generate(&asap, samples, sizeof(samples), ASAP_FORMAT_S16_BE); #endif ci->pcmbuf_insert(samples, NULL, n_bytes /bytesPerSample); bytes_done += n_bytes; ci->set_elapsed((bytes_done / 2) / 44.1); if(n_bytes != sizeof(samples)) break; } if (ci->request_next_track()) goto next_track; return CODEC_OK; }
static void g_set_mute_mask(int mask) { input_asap *p; for (p = head; p != NULL; p = p->next) ASAP_MutePokeyChannels(p->asap, mask); }
static INT_PTR CALLBACK settingsDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: saved_mute_mask = mute_mask; settingsDialogSet(hDlg, song_length, silence_seconds, play_loops, mute_mask); return TRUE; case WM_COMMAND: if (HIWORD(wParam) == BN_CLICKED) { WORD wCtrl = LOWORD(wParam); BOOL enabled; switch (wCtrl) { case IDC_UNLIMITED: enableTimeInput(hDlg, FALSE); return TRUE; case IDC_LIMITED: enableTimeInput(hDlg, TRUE); setFocusAndSelect(hDlg, IDC_MINUTES); return TRUE; case IDC_SILENCE: enabled = (IsDlgButtonChecked(hDlg, IDC_SILENCE) == BST_CHECKED); EnableWindow(GetDlgItem(hDlg, IDC_SILSECONDS), enabled); if (enabled) setFocusAndSelect(hDlg, IDC_SILSECONDS); return TRUE; case IDC_LOOPS: case IDC_NOLOOPS: return TRUE; case IDC_MUTE1: case IDC_MUTE1 + 1: case IDC_MUTE1 + 2: case IDC_MUTE1 + 3: case IDC_MUTE1 + 4: case IDC_MUTE1 + 5: case IDC_MUTE1 + 6: case IDC_MUTE1 + 7: { int mask = 1 << (wCtrl - IDC_MUTE1); if (IsDlgButtonChecked(hDlg, wCtrl) == BST_CHECKED) mute_mask |= mask; else mute_mask &= ~mask; ASAP_MutePokeyChannels(asap, mute_mask); return TRUE; } case IDOK: { int new_song_length; if (IsDlgButtonChecked(hDlg, IDC_UNLIMITED) == BST_CHECKED) new_song_length = -1; else { int minutes; int seconds; if (!getDlgInt(hDlg, IDC_MINUTES, &minutes) || !getDlgInt(hDlg, IDC_SECONDS, &seconds)) return TRUE; new_song_length = 60 * minutes + seconds; } if (IsDlgButtonChecked(hDlg, IDC_SILENCE) != BST_CHECKED) silence_seconds = -1; else if (!getDlgInt(hDlg, IDC_SILSECONDS, &silence_seconds)) return TRUE; song_length = new_song_length; play_loops = (IsDlgButtonChecked(hDlg, IDC_LOOPS) == BST_CHECKED); EndDialog(hDlg, IDOK); return TRUE; } case IDCANCEL: mute_mask = saved_mute_mask; ASAP_MutePokeyChannels(asap, mute_mask); EndDialog(hDlg, IDCANCEL); return TRUE; } } break; default: break; } return FALSE; }