+#if defined(PLATFORM_UNIX)
+int OpenAudioDevice(char *audio_device_name)
+{
+ int audio_fd;
+
+ /* check if desired audio device is accessible */
+ if (access(sound_device_name, W_OK) != 0)
+ return -1;
+
+ /* try to open audio device in non-blocking mode */
+ if ((audio_fd = open(audio_device_name, O_WRONLY | O_NONBLOCK)) < 0)
+ return audio_fd;
+
+ /* re-open audio device in blocking mode */
+ close(audio_fd);
+ audio_fd = open(audio_device_name, O_WRONLY);
+
+ return audio_fd;
+}
+
+void UnixOpenAudio(struct AudioSystemInfo *audio)
+{
+ static char *audio_device_name[] =
+ {
+ DEVICENAME_DSP,
+ DEVICENAME_AUDIO
+ };
+ int audio_fd;
+ int i;
+
+ /* look for available audio devices, starting with preferred ones */
+ for (i=0; i<sizeof(audio_device_name)/sizeof(char *); i++)
+ if ((audio_fd = OpenAudioDevice(sound_device_name)) >= 0)
+ break;
+
+ if (audio_fd < 0)
+ {
+ Error(ERR_WARN, "cannot open audio device - no sound");
+ return;
+ }
+
+ close(audio_fd);
+
+ audio->sound_available = TRUE;
+
+#if defined(AUDIO_STREAMING_DSP)
+ audio->loops_available = TRUE;
+#endif
+}
+
+void UnixCloseAudio(struct AudioSystemInfo *audio)
+{
+ if (audio->device_fd)
+ close(audio->device_fd);
+}
+
+#endif /* PLATFORM_UNIX */
+