- memset( (void*) shm, 0, sizeof(*shm) );
- shm->format.channels = channels;
- shm->format.width = width;
- shm->format.speed = rate;
- shm->samplepos = 0;
- shm->sampleframes = buffer_size;
- shm->samples = shm->sampleframes * shm->format.channels;
- SNDDMA_GetDMAPos (); // sets shm->buffer
+ return false;
+ }
+
+ if (pcm_handle != NULL)
+ {
+ Con_Print ("SndSys_Init: WARNING: Init called before Shutdown!\n");
+ SndSys_Shutdown ();
+ }
+
+ // Determine the name of the PCM handle we'll use
+ switch (requested->channels)
+ {
+ case 4:
+ pcm_name = "surround40";
+ break;
+ case 6:
+ pcm_name = "surround51";
+ break;
+ case 8:
+ pcm_name = "surround71";
+ break;
+ default:
+ pcm_name = "default";
+ break;
+ }
+// COMMANDLINEOPTION: Linux ALSA Sound: -sndpcm <devicename> selects which pcm device to use, default is "default"
+ i = COM_CheckParm ("-sndpcm");
+ if (i != 0 && i < com_argc - 1)
+ pcm_name = com_argv[i + 1];
+
+ // Open the audio device
+ Con_Printf ("SndSys_Init: PCM device is \"%s\"\n", pcm_name);
+ err = snd_pcm_open (&pcm_handle, pcm_name, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK);
+ if (err < 0)
+ {
+ Con_Printf ("SndSys_Init: can't open audio device \"%s\" (%s)\n",
+ pcm_name, snd_strerror (err));
+ return false;
+ }
+
+ // Allocate the hardware parameters
+ err = snd_pcm_hw_params_malloc (&hw_params);
+ if (err < 0)
+ {
+ Con_Printf ("SndSys_Init: can't allocate hardware parameters (%s)\n",
+ snd_strerror (err));
+ goto init_error;
+ }
+ err = snd_pcm_hw_params_any (pcm_handle, hw_params);
+ if (err < 0)
+ {
+ Con_Printf ("SndSys_Init: can't initialize hardware parameters (%s)\n",
+ snd_strerror (err));
+ goto init_error;
+ }
+
+ // Set the access type
+ err = snd_pcm_hw_params_set_access (pcm_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED);
+ if (err < 0)
+ {
+ Con_Printf ("SndSys_Init: can't set access type (%s)\n",
+ snd_strerror (err));
+ goto init_error;
+ }
+
+ // Set the sound width
+ if (requested->width == 1)
+ snd_pcm_format = SND_PCM_FORMAT_U8;
+ else
+ snd_pcm_format = SND_PCM_FORMAT_S16;
+ err = snd_pcm_hw_params_set_format (pcm_handle, hw_params, snd_pcm_format);
+ if (err < 0)
+ {
+ Con_Printf ("SndSys_Init: can't set sound width to %hu (%s)\n",
+ requested->width, snd_strerror (err));
+ goto init_error;
+ }
+
+ // Set the sound channels
+ err = snd_pcm_hw_params_set_channels (pcm_handle, hw_params, requested->channels);
+ if (err < 0)
+ {
+ Con_Printf ("SndSys_Init: can't set sound channels to %hu (%s)\n",
+ requested->channels, snd_strerror (err));
+ goto init_error;
+ }