JNIEXPORT jint JNICALL Java_com_sun_media_sound_PortMixer_nGetPortCount (JNIEnv *env, jclass cls, jlong id) { jint ret = 0; #if USE_PORTS == TRUE if (id != 0) { ret = (jint) PORT_GetPortCount((void*) (INT_PTR) id); } #endif return ret; }
void* PORT_Open(INT32 mixerIndex) { char devname[16]; snd_mixer_t* mixer_handle; int err; PortMixer* handle; TRACE0("> PORT_Open\n"); sprintf(devname, ALSA_HARDWARE_CARD, (int) mixerIndex); if ((err = snd_mixer_open(&mixer_handle, 0)) < 0) { ERROR2("Mixer %s open error: %s", devname, snd_strerror(err)); return NULL; } if ((err = snd_mixer_attach(mixer_handle, devname)) < 0) { ERROR2("Mixer attach %s error: %s", devname, snd_strerror(err)); snd_mixer_close(mixer_handle); return NULL; } if ((err = snd_mixer_selem_register(mixer_handle, NULL, NULL)) < 0) { ERROR1("Mixer register error: %s", snd_strerror(err)); snd_mixer_close(mixer_handle); return NULL; } err = snd_mixer_load(mixer_handle); if (err < 0) { ERROR2("Mixer %s load error: %s", devname, snd_strerror(err)); snd_mixer_close(mixer_handle); return NULL; } handle = (PortMixer*) calloc(1, sizeof(PortMixer)); if (handle == NULL) { ERROR0("malloc() failed."); snd_mixer_close(mixer_handle); return NULL; } handle->numElems = 0; handle->elems = (snd_mixer_elem_t**) calloc(MAX_ELEMS, sizeof(snd_mixer_elem_t*)); if (handle->elems == NULL) { ERROR0("malloc() failed."); snd_mixer_close(mixer_handle); free(handle); return NULL; } handle->types = (INT32*) calloc(MAX_ELEMS, sizeof(INT32)); if (handle->types == NULL) { ERROR0("malloc() failed."); snd_mixer_close(mixer_handle); free(handle->elems); free(handle); return NULL; } handle->controls = (PortControl*) calloc(MAX_CONTROLS, sizeof(PortControl)); if (handle->controls == NULL) { ERROR0("malloc() failed."); snd_mixer_close(mixer_handle); free(handle->elems); free(handle->types); free(handle); return NULL; } handle->mixer_handle = mixer_handle; // necessary to initialize data structures PORT_GetPortCount(handle); TRACE0("< PORT_Open\n"); return handle; }