| /* |
| * Initialization procedures for multimedia |
| * |
| * Copyright 1998 Luiz Otavio L. Zorzella |
| */ |
| |
| #include <unistd.h> |
| #include <fcntl.h> |
| #include <sys/ioctl.h> |
| #include "windows.h" |
| #include "multimedia.h" |
| #include "mmsystem.h" |
| #include "xmalloc.h" |
| #include "debug.h" |
| |
| #ifdef HAVE_OSS |
| |
| extern int MODM_NUMDEVS; |
| extern LPMIDIOUTCAPS16 midiDevices[MAX_MIDIOUTDRV]; |
| |
| #endif |
| |
| /************************************************************************** |
| * unixToWindowsDeviceType [internal] |
| * |
| * return the Windows equivalent to a Unix Device Type |
| * |
| */ |
| #ifdef HAVE_OSS |
| int unixToWindowsDeviceType(int type) |
| { |
| /* MOD_MIDIPORT output port |
| * MOD_SYNTH generic internal synth |
| * MOD_SQSYNTH square wave internal synth |
| * MOD_FMSYNTH FM internal synth |
| * MOD_MAPPER MIDI mapper |
| */ |
| |
| /* FIXME Is this really the correct equivalence from UNIX to Windows Sound type */ |
| |
| switch (type) { |
| case SYNTH_TYPE_FM: return MOD_FMSYNTH; |
| case SYNTH_TYPE_SAMPLE: return MOD_SYNTH; |
| case SYNTH_TYPE_MIDI: return MOD_MIDIPORT; |
| default: |
| ERR(midi, "Cannot determine the type of this midi device. Assuming FM Synth\n"); |
| return MOD_FMSYNTH; |
| } |
| } |
| #endif |
| |
| /************************************************************************** |
| * MultimediaInit [internal] |
| * |
| * Initializes the MIDI devices information variables |
| * |
| */ |
| BOOL32 MULTIMEDIA_Init (void) |
| { |
| #ifdef HAVE_OSS |
| int i, status, numsynthdevs=255, nummididevs=255; |
| struct synth_info sinfo; |
| struct midi_info minfo; |
| int fd; /* file descriptor for MIDI_DEV */ |
| |
| TRACE (midi, "Initializing the MIDI variables.\n"); |
| /* try to open device */ |
| fd = open(MIDI_DEV, O_WRONLY); |
| if (fd == -1) { |
| TRACE (midi, "No soundcards founds: unable to open `%s'.\n", MIDI_DEV); |
| return TRUE; |
| } |
| |
| /* find how many Synth devices are there in the system */ |
| status = ioctl(fd, SNDCTL_SEQ_NRSYNTHS, &numsynthdevs); |
| |
| if (numsynthdevs > MAX_MIDIOUTDRV) { |
| ERR (midi, "MAX_MIDIOUTDRV was enough for the number of devices. Some FM devices will not be available.\n"); |
| numsynthdevs = MAX_MIDIOUTDRV; |
| } |
| |
| if (status == -1) { |
| ERR (midi, "ioctl failed.\n"); |
| close(fd); |
| return TRUE; |
| } |
| |
| for (i = 0 ; i < numsynthdevs ; i++) { |
| LPMIDIOUTCAPS16 tmplpCaps; |
| |
| sinfo.device = i; |
| status = ioctl(fd, SNDCTL_SYNTH_INFO, &sinfo); |
| if (status == -1) { |
| ERR(midi, "ioctl failed.\n"); |
| close(fd); |
| return TRUE; |
| } |
| |
| tmplpCaps = xmalloc (sizeof (MIDIOUTCAPS16)); |
| /* We also have the information sinfo.synth_subtype, not used here |
| */ |
| |
| /* Manufac ID. We do not have access to this with soundcard.h |
| * Does not seem to be a problem, because in mmsystem.h only |
| * Microsoft's ID is listed. |
| */ |
| tmplpCaps->wMid = 0x00FF; |
| tmplpCaps->wPid = 0x0001; /* FIXME Product ID */ |
| tmplpCaps->vDriverVersion = 0x001; /* Product Version. We simply say "1" */ |
| strcpy(tmplpCaps->szPname, sinfo.name); |
| |
| tmplpCaps->wTechnology = unixToWindowsDeviceType (sinfo.synth_type); |
| tmplpCaps->wVoices = sinfo.nr_voices; |
| |
| /* FIXME Is it possible to know the maximum |
| * number of simultaneous notes of a soundcard ? |
| * I beleive we don't have this information, but |
| * it's probably equal or more than wVoices |
| */ |
| tmplpCaps->wNotes = sinfo.nr_voices; |
| |
| /* FIXME Do we have this information? |
| * Assuming the soundcards can handle |
| * MIDICAPS_VOLUME and MIDICAPS_LRVOLUME but |
| * not MIDICAPS_CACHE. |
| */ |
| tmplpCaps->dwSupport = MIDICAPS_VOLUME|MIDICAPS_LRVOLUME; |
| |
| midiDevices[i] = tmplpCaps; |
| |
| TRACE(midi,"techn = %d voices=%d notes = %d support = %ld\n",tmplpCaps->wTechnology,tmplpCaps->wVoices,tmplpCaps->wNotes,tmplpCaps->dwSupport); |
| } |
| |
| /* find how many MIDI devices are there in the system */ |
| status = ioctl(fd, SNDCTL_SEQ_NRMIDIS, &nummididevs); |
| if (status == -1) { |
| ERR(midi, "ioctl failed.\n"); |
| close(fd); |
| return TRUE; |
| } |
| |
| if (numsynthdevs + nummididevs > MAX_MIDIOUTDRV) { |
| ERR(midi, "MAX_MIDIOUTDRV was enough for the number of devices. Some MIDI devices will not be available.\n"); |
| nummididevs = MAX_MIDIOUTDRV - numsynthdevs; |
| } |
| |
| /* windows does not seem to diferentiate Synth from MIDI devices */ |
| MODM_NUMDEVS = numsynthdevs + nummididevs; |
| |
| for (i = 0 ; i < nummididevs ; i++) { |
| LPMIDIOUTCAPS16 tmplpCaps; |
| |
| minfo.device = i; |
| status = ioctl(fd, SNDCTL_MIDI_INFO, &minfo); |
| if (status == -1) { |
| ERR(midi, "ioctl failed.\n"); |
| close(fd); |
| return TRUE; |
| } |
| |
| tmplpCaps = xmalloc (sizeof (MIDIOUTCAPS16)); |
| /* This whole part is somewhat obscure to me. I'll keep trying to dig |
| info about it. If you happen to know, please tell us. The very descritive |
| minfo.dev_type was not used here. |
| */ |
| tmplpCaps->wMid = 0x00FF; /* Manufac ID. We do not have access to this with soundcard.h |
| Does not seem to be a problem, because in mmsystem.h only |
| Microsoft's ID is listed */ |
| tmplpCaps->wPid = 0x0001; /* FIXME Product ID */ |
| tmplpCaps->vDriverVersion = 0x001; /* Product Version. We simply say "1" */ |
| strcpy(tmplpCaps->szPname, minfo.name); |
| |
| tmplpCaps->wTechnology = MOD_MIDIPORT; /* FIXME Is this right? */ |
| tmplpCaps->wVoices = 16; /* Does it make any difference? */ |
| tmplpCaps->wNotes = 16; /* Does it make any difference? */ |
| tmplpCaps->dwSupport = MIDICAPS_VOLUME|MIDICAPS_LRVOLUME; /* FIXME Does it make any difference? */ |
| |
| midiDevices[numsynthdevs + i] = tmplpCaps; |
| |
| TRACE(midi,"techn = %d voices=%d notes = %d support = %ld\n",tmplpCaps->wTechnology,tmplpCaps->wVoices,tmplpCaps->wNotes,tmplpCaps->dwSupport); |
| } |
| |
| /* close file and exit */ |
| close(fd); |
| |
| #endif /* HAVE_OSS */ |
| |
| return TRUE; |
| } |