JNIEXPORT jstring JNICALL Java_com_ssb_droidsound_plugins_SC68Plugin_N_1getStringInfo(JNIEnv *env, jobject obj, jlong song, jint what) { PlayData *pd = (PlayData*) song; if (sc68_music_info(pd->sc68, &pd->info, pd->currentTrack, 0)) { return 0; } disk68_t *d; static char temp[16]; switch(what) { case INFO_RIPPER: for (int i=0; i<pd->info.trk.tags; i++) { d = (disk68_t*)pd->sc68->disk; int result = strcmp("ripper",d->mus[pd->currentTrack - 1].tags.array[i].key); if (result == 0) { return NewString(env, d->mus[pd->currentTrack - 1].tags.array[i].val); } } break; case INFO_CONVERTER: for (int i=0; i<pd->info.trk.tags; i++) { d = (disk68_t*)pd->sc68->disk; int result = strcmp("converter",d->mus[pd->currentTrack - 1].tags.array[i].key); if (result == 0) { return NewString(env, d->mus[pd->currentTrack - 1].tags.array[i].val); } } break; case INFO_AUTHOR: return NewString(env, pd->info.artist); case INFO_TITLE: return NewString(env, pd->info.title); case 51: return NewString(env, pd->info.trk.hw); case 52: return NewString(env, pd->info.replay); case INFO_FORMAT: return NewString(env, pd->info.format); case INFO_RATE: sprintf(temp, "%dhz", pd->info.rate); return NewString(env, temp); } return 0; }
JNIEXPORT jint JNICALL Java_com_ssb_droidsound_plugins_SC68Plugin_N_1getIntInfo(JNIEnv *env, jobject obj, jlong song, jint what) { PlayData *pd = (PlayData*) song; if (sc68_music_info(pd->sc68, &pd->info, pd->currentTrack, 0)) { return -1; } sc68_music_info_t &info = pd->info; switch(what) { case INFO_ASID: return info.trk.asid; case INFO_LENGTH: return info.trk.time_ms; case INFO_SUBTUNES: return info.tracks; case INFO_STARTTUNE: return pd->defaultTrack-1; case 50: return (pd->info.trk.amiga << 2) | (pd->info.trk.ste << 1) | (pd->info.trk.ym); } return -1; }
JNIEXPORT jint JNICALL Java_com_ssb_droidsound_plugins_SC68Plugin_N_1setOption(JNIEnv *env, jclass cl, jlong song, jint option, jint val) { PlayData *pd = (PlayData*) song; if (sc68_music_info(pd->sc68, &pd->info, pd->currentTrack, 0)) { return -1; } int result = -1; __android_log_print(ANDROID_LOG_VERBOSE, "SC68Plugin", "setOption"); switch(option) { case SC68_OPT_ASID: __android_log_print(ANDROID_LOG_VERBOSE, "SC68Plugin", "aSID SETTING"); if (val == 0) { result = sc68_cntl(pd->sc68, SC68_SET_ASID, SC68_ASID_OFF); __android_log_print(ANDROID_LOG_VERBOSE, "SC68Plugin", "DISABLED aSID"); break; } if (val == 1) { result = sc68_cntl(pd->sc68, SC68_CAN_ASID, SC68_DSK_TRACK); if (result != -1) { result = sc68_cntl(pd->sc68, SC68_SET_ASID, result); __android_log_print(ANDROID_LOG_VERBOSE, "SC68Plugin", "ENABLED aSID"); } break; } } return result; }
static int finf(void * data, const char * key, int op, sc68_dialval_t *val) { dial_t * const dial = data; int res; /* Sanity check */ if (!key || !ismagic(dial)) return -1; /* Run user control function */ res = dial->dial.cntl(dial->dial.data, key, op, val); TRACE68(dial_cat,P "user-cntl #%02d \"%s\" -> %d\n", op, key, res); /* Kill special case. */ if (op == SC68_DIAL_CALL && keyis(SC68_DIAL_KILL)) { del_dial(dial); res = 0; } /* User dealt with that message. */ if (res <= 0) goto exit; /* Assume no error */ res = 0; if (op == SC68_DIAL_CALL && keyis(SC68_DIAL_NEW)) { if (!dial->dial.cntl(dial->dial.data, "sc68", op, val)) dial->sc68 = (sc68_disk_t) val->s; if (!dial->dial.cntl(dial->dial.data, "disk", op, val)) dial->disk = (sc68_disk_t) val->s; TRACE68(dial_cat, P "\"%s\" sc68:%p disk:%p\n", key, dial->sc68, dial->disk); val->i = sc68_music_info(dial->sc68,&dial->info,1,dial->disk); if (!val->i) { TRACE68(dial_cat, P "Got info: %02d - %s - %s\n", dial->info.tracks, dial->info.album, dial->info.title); } } else if (keyis("track")) { int track; switch (op) { case SC68_DIAL_CNT: val->i = dial->info.tracks; /* get count current */ return 0; case SC68_DIAL_GETI: val->i = dial->info.trk.track - 1; /* get current */ return 0; case SC68_DIAL_SETI: track = (int) val->i + 1; if (track <= 0 || track > dial->info.tracks) track = dial->info.dsk.track; if (track != dial->info.trk.track) sc68_music_info(dial->sc68, &dial->info, track, dial->disk); val->i = dial->info.trk.track - 1; return 0; case SC68_DIAL_ENUM: track = val->i; if (track >= 0 && track < dial->info.tracks) { ++track; dial->tstr[0] = '0' + (track/10u); dial->tstr[1] = '0' + (track%10u); dial->tstr[2] = 0; val->s = dial->tstr; } else { TRACE68(dial_cat, P "invalid index \"%s[%d]\"", key,track); val->s = ""; res = -1; } break; default: res = -1; } } else { switch (op) { case SC68_DIAL_GETS: /* if (keyis("uri")) */ /* val->s = dial->uri; */ /* else */ if (keyis("format")) val->s = dial->info.format; else if (keyis("genre")) val->s = dial->info.genre; else if (keyis("title")) val->s = dial->info.title; else if (keyis("artist")) val->s = dial->info.artist; else if (keyis("album")) val->s = dial->info.album; else if (keyis("ripper")) val->s = dial->info.ripper; else if (keyis("converter")) val->s = dial->info.converter; else if (keyis("year")) val->s = dial->info.year; else res = -1; break; case SC68_DIAL_GETI: if (keyis("time")) val->i = (dial->info.trk.time_ms+500u)/1000u; else if (keyis("hw_ym")) val->i = dial->info.trk.ym; else if (keyis("hw_ste")) val->i = dial->info.trk.ste; else if (keyis("hw_asid")) val->i = dial->info.trk.asid; else if (keyis("tag-key")) val->i = 0; else res = -1; break; case SC68_DIAL_ENUM: if (keyis("tag-key") || keyis("tag-val")) { const int a = dial->info.dsk.tags; const int n = a + dial->info.trk.tags; if (val->i >= 0 && val->i<n) { val->s = val->i < a ? ( key[4] == 'k' ? dial->info.dsk.tag[val->i].key : dial->info.dsk.tag[val->i].val ) : ( key[4] == 'k' ? dial->info.trk.tag[val->i-a].key : dial->info.trk.tag[val->i-a].val ) ; break; } else { TRACE68(dial_cat, P "index out of range \"%s\"[%d] > %d\n", key,val->i,n); res = -1; } } break; default: res = -1; } } exit: if (op == SC68_DIAL_CNT) { TRACE68(dial_cat, P "%s() \"%s\"[#] -> %d (%d)\n", __FUNCTION__, key, val->i, res); } if (op == SC68_DIAL_GETI) { TRACE68(dial_cat, P "%s() \"%s\" -> %d (%d)\n", __FUNCTION__, key, val->i, res); } if (op == SC68_DIAL_GETS || op == SC68_DIAL_ENUM) { TRACE68(dial_cat, P "%s() \"%s\" -> \"%s\" (%d)\n", __FUNCTION__, key, !res?val->s:"<not-set>", res); } TRACE68(dial_cat, P "%s() #%02d \"%s\" -> %d\n", __FUNCTION__, op, key, res); return res; }