RFC: Reworking sound sub-system
Collapse
X
-
The first is only a declaration. I've compiled it without sound support and it works fine. Here is what I get:
Code:[gruss@ws1 ~]$ cd Angband_devel/angband/ [gruss@ws1 angband]$ make distclean Entering directory src. Deleted cave.o. Deleted cave-map.o. Deleted cave-square.o. Deleted cave-view.o. Deleted cmd-cave.o. Deleted cmd-core.o. Deleted cmd-misc.o. Deleted cmd-obj.o. Deleted cmd-pickup.o. Deleted debug.o. Deleted effects.o. Deleted game-event.o. Deleted game-input.o. Deleted game-world.o. Deleted generate.o. Deleted gen-cave.o. Deleted gen-chunk.o. Deleted gen-monster.o. Deleted gen-room.o. Deleted gen-util.o. Deleted grafmode.o. Deleted guid.o. Deleted init.o. Deleted load.o. Deleted message.o. Deleted mon-attack.o. Deleted mon-blow-effects.o. Deleted mon-blow-methods.o. Deleted mon-desc.o. Deleted mon-init.o. Deleted mon-list.o. Deleted mon-lore.o. Deleted mon-make.o. Deleted mon-move.o. Deleted mon-msg.o. Deleted mon-power.o. Deleted mon-spell.o. Deleted mon-summon.o. Deleted mon-timed.o. Deleted mon-util.o. Deleted obj-chest.o. Deleted obj-desc.o. Deleted obj-gear.o. Deleted obj-ignore.o. Deleted obj-info.o. Deleted obj-knowledge.o. Deleted obj-list.o. Deleted obj-make.o. Deleted obj-pile.o. Deleted obj-power.o. Deleted obj-properties.o. Deleted obj-randart.o. Deleted obj-slays.o. Deleted obj-tval.o. Deleted obj-util.o. Deleted option.o. Deleted parser.o. Deleted randname.o. Deleted player-attack.o. Deleted player-birth.o. Deleted player-calcs.o. Deleted player-class.o. Deleted player-history.o. Deleted player-path.o. Deleted player-quest.o. Deleted player-race.o. Deleted player-spell.o. Deleted player-timed.o. Deleted player-util.o. Deleted player.o. Deleted project.o. Deleted project-feat.o. Deleted project-mon.o. Deleted project-obj.o. Deleted project-player.o. Deleted score.o. Deleted save.o. Deleted savefile.o. Deleted store.o. Deleted target.o. Deleted trap.o. Deleted ui-birth.o. Deleted ui-command.o. Deleted ui-context.o. Deleted ui-death.o. Deleted ui-display.o. Deleted ui-event.o. Deleted ui-game.o. Deleted ui-help.o. Deleted ui-history.o. Deleted ui-init.o. Deleted ui-input.o. Deleted ui-keymap.o. Deleted ui-knowledge.o. Deleted ui-map.o. Deleted ui-menu.o. Deleted ui-mon-list.o. Deleted ui-mon-lore.o. Deleted ui-obj-list.o. Deleted ui-object.o. Deleted ui-options.o. Deleted ui-output.o. Deleted ui-player.o. Deleted ui-prefs.o. Deleted ui-score.o. Deleted ui-signals.o. Deleted ui-spell.o. Deleted ui-store.o. Deleted ui-target.o. Deleted ui-term.o. Deleted wiz-debug.o. Deleted wiz-spoil.o. Deleted wiz-stats.o. Deleted buildid.o. Deleted z-bitflag.o. Deleted z-color.o. Deleted z-dice.o. Deleted z-expression.o. Deleted z-file.o. Deleted z-form.o. Deleted z-quark.o. Deleted z-queue.o. Deleted z-rand.o. Deleted z-set.o. Deleted z-textblock.o. Deleted z-type.o. Deleted z-util.o. Deleted z-virt.o. Deleted main.o. Deleted main-gcu.o. Deleted main-x11.o. Deleted snd-sdl.o. Deleted sound-core.o. Deleted main-test.o. Deleted main-stats.o. Deleted stats/db.o. Deleted angband. Deleted angband.o. Leaving directory src. Entering directory lib. Entering directory gamedata. Leaving directory gamedata. Entering directory customize. Leaving directory customize. Entering directory help. Leaving directory help. Entering directory screens. Leaving directory screens. Entering directory fonts. Leaving directory fonts. Entering directory tiles. Entering directory adam-bolt. Leaving directory adam-bolt. Entering directory gervais. Leaving directory gervais. Entering directory nomad. Leaving directory nomad. Entering directory old. Leaving directory old. Entering directory shockbolt. Leaving directory shockbolt. Leaving directory tiles. Entering directory sounds. Leaving directory sounds. Entering directory icons. Leaving directory icons. Entering directory user. Entering directory save. Leaving directory save. Entering directory scores. Leaving directory scores. Entering directory info. Leaving directory info. Leaving directory user. Leaving directory lib. Entering directory doc. Leaving directory doc. Deleted config.status. Deleted config.log. Entering directory src. Deleted autoconf.h. Deleted .deps. Deleted autoconf.h.in~. Leaving directory src. Entering directory lib. Entering directory gamedata. Leaving directory gamedata. Entering directory customize. Leaving directory customize. Entering directory help. Leaving directory help. Entering directory screens. Leaving directory screens. Entering directory fonts. Leaving directory fonts. Entering directory tiles. Entering directory adam-bolt. Leaving directory adam-bolt. Entering directory gervais. Leaving directory gervais. Entering directory nomad. Leaving directory nomad. Entering directory old. Leaving directory old. Entering directory shockbolt. Leaving directory shockbolt. Leaving directory tiles. Entering directory sounds. Leaving directory sounds. Entering directory icons. Leaving directory icons. Entering directory user. Entering directory save. Leaving directory save. Entering directory scores. Leaving directory scores. Entering directory info. Leaving directory info. Leaving directory user. Entering directory gamedata. Deleted .deps. Leaving directory gamedata. Entering directory customize. Deleted .deps. Leaving directory customize. Entering directory help. Deleted .deps. Leaving directory help. Entering directory screens. Deleted .deps. Leaving directory screens. Entering directory fonts. Deleted .deps. Leaving directory fonts. Entering directory tiles. Entering directory adam-bolt. Leaving directory adam-bolt. Entering directory gervais. Leaving directory gervais. Entering directory nomad. Leaving directory nomad. Entering directory old. Leaving directory old. Entering directory shockbolt. Leaving directory shockbolt. Entering directory adam-bolt. Deleted .deps. Leaving directory adam-bolt. Entering directory gervais. Deleted .deps. Leaving directory gervais. Entering directory nomad. Deleted .deps. Leaving directory nomad. Entering directory old. Deleted .deps. Leaving directory old. Entering directory shockbolt. Deleted .deps. Leaving directory shockbolt. Deleted .deps. Leaving directory tiles. Entering directory sounds. Deleted .deps. Leaving directory sounds. Entering directory icons. Deleted .deps. Leaving directory icons. Entering directory user. Entering directory save. Leaving directory save. Entering directory scores. Leaving directory scores. Entering directory info. Leaving directory info. Entering directory save. Deleted .deps. Leaving directory save. Entering directory scores. Deleted .deps. Leaving directory scores. Entering directory info. Deleted .deps. Leaving directory info. Deleted .deps. Leaving directory user. Deleted .deps. Leaving directory lib. Entering directory doc. Deleted .deps. Leaving directory doc. Deleted .deps. [gruss@ws1 angband]$ ./autogen.sh *info* running aclocal (-I m4) *info* running autoheader *info* running autoconf [gruss@ws1 angband]$ ./configure checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking target system type... x86_64-unknown-linux-gnu checking for tput... /usr/bin/tput configure: touching .deps files Note: You have chosen to compile for installation, with data files in standard locations. For development, you may wish to consider using --with-no-install which will leave the game to run from the directory into which it was extracted and compiled. checking for gcc... gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ISO C89... none needed checking whether make sets $(MAKE)... yes checking whether ln -s works... yes checking for a BSD-compatible install... /usr/bin/install -c checking for a thread-safe mkdir -p... /usr/bin/mkdir -p checking for windres... no checking for rst2html.py... no checking for rst2html... no checking for rst2latex.py... no checking for rst2latex... no checking for pdflatex... pdflatex checking for rm... /usr/bin/rm checking for mv... /usr/bin/mv checking for cp... /usr/bin/cp checking for dirent.h that defines DIR... yes checking for library containing opendir... none required checking how to run the C preprocessor... gcc -E checking for grep that handles long lines and -e... /usr/bin/grep checking for egrep... /usr/bin/grep -E checking for ANSI C header files... yes checking for sys/types.h... yes checking for sys/stat.h... yes checking for stdlib.h... yes checking for string.h... yes checking for memory.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking fcntl.h usability... yes checking fcntl.h presence... yes checking for fcntl.h... yes checking for stdint.h... (cached) yes checking for stdbool.h that conforms to C99... yes checking for _Bool... yes checking for an ANSI C-conforming const... yes checking return type of signal handlers... void checking for mkdir... yes checking for setresgid... yes checking for setegid... yes checking for stat... yes checking if gcc supports -Wno-missing-field-initializers... yes checking if make supports SysV-style inclusion... yes checking for make silent include syntax... gnu checking for ncursesw5-config... /usr/bin/ncursesw5-config checking for ncurses - wide char support... yes checking for mvwaddnwstr... yes checking for use_default_colors... yes checking for can_change_color... yes checking for X... libraries , headers checking for gethostbyname... yes checking for connect... yes checking for remove... yes checking for shmat... yes checking for IceConnectionNumber in -lICE... yes configure: creating ./config.status config.status: creating mk/buildsys.mk config.status: creating mk/extra.mk config.status: creating mk/sinclude.mk config.status: creating src/autoconf.h Configuration: Install path: /usr/local binary path: /usr/local/games config path: /usr/local/etc/angband/ lib path: /usr/local/share/angband/ doc path: /usr/local/share/doc/angband/ var path: (not used) (with private save and score files in ~/.angband/Angband/) -- Frontends -- - Curses Yes - X11 Yes - SDL Disabled - Windows Disabled - Test No - Stats No - SDL sound Disabled [gruss@ws1 angband]$ make Entering directory src. Successfully generated dependencies. Successfully compiled cave.c. Successfully compiled cave-map.c. Successfully compiled cave-square.c. Successfully compiled cave-view.c. Successfully compiled cmd-cave.c. Successfully compiled cmd-core.c. Successfully compiled cmd-misc.c. Successfully compiled cmd-obj.c. Successfully compiled cmd-pickup.c. Successfully compiled debug.c. Successfully compiled effects.c. Successfully compiled game-event.c. Successfully compiled game-input.c. Successfully compiled game-world.c. Successfully compiled generate.c. Successfully compiled gen-cave.c. Successfully compiled gen-chunk.c. Successfully compiled gen-monster.c. Successfully compiled gen-room.c. Successfully compiled gen-util.c. Successfully compiled grafmode.c. Successfully compiled guid.c. Successfully compiled init.c. Successfully compiled load.c. Successfully compiled message.c. Successfully compiled mon-attack.c. Successfully compiled mon-blow-effects.c. Successfully compiled mon-blow-methods.c. Successfully compiled mon-desc.c. Successfully compiled mon-init.c. Successfully compiled mon-list.c. Successfully compiled mon-lore.c. Successfully compiled mon-make.c. Successfully compiled mon-move.c. Successfully compiled mon-msg.c. Successfully compiled mon-power.c. Successfully compiled mon-spell.c. Successfully compiled mon-summon.c. Successfully compiled mon-timed.c. Successfully compiled mon-util.c. Successfully compiled obj-chest.c. Successfully compiled obj-desc.c. Successfully compiled obj-gear.c. Successfully compiled obj-ignore.c. Successfully compiled obj-info.c. Successfully compiled obj-knowledge.c. Successfully compiled obj-list.c. Successfully compiled obj-make.c. Successfully compiled obj-pile.c. Successfully compiled obj-power.c. Successfully compiled obj-properties.c. Successfully compiled obj-randart.c. Successfully compiled obj-slays.c. Successfully compiled obj-tval.c. Successfully compiled obj-util.c. Successfully compiled option.c. Successfully compiled parser.c. Successfully compiled randname.c. Successfully compiled player-attack.c. Successfully compiled player-birth.c. Successfully compiled player-calcs.c. Successfully compiled player-class.c. Successfully compiled player-history.c. Successfully compiled player-path.c. Successfully compiled player-quest.c. Successfully compiled player-race.c. Successfully compiled player-spell.c. Successfully compiled player-timed.c. Successfully compiled player-util.c. Successfully compiled player.c. Successfully compiled project.c. Successfully compiled project-feat.c. Successfully compiled project-mon.c. Successfully compiled project-obj.c. Successfully compiled project-player.c. Successfully compiled score.c. Successfully compiled save.c. Successfully compiled savefile.c. Successfully compiled store.c. Successfully compiled target.c. Successfully compiled trap.c. Successfully compiled ui-birth.c. Successfully compiled ui-command.c. Successfully compiled ui-context.c. Successfully compiled ui-death.c. Successfully compiled ui-display.c. Successfully compiled ui-event.c. Successfully compiled ui-game.c. Successfully compiled ui-help.c. Successfully compiled ui-history.c. Successfully compiled ui-init.c. Successfully compiled ui-input.c. Successfully compiled ui-keymap.c. Successfully compiled ui-knowledge.c. Successfully compiled ui-map.c. Successfully compiled ui-menu.c. Successfully compiled ui-mon-list.c. Successfully compiled ui-mon-lore.c. Successfully compiled ui-obj-list.c. Successfully compiled ui-object.c. Successfully compiled ui-options.c. Successfully compiled ui-output.c. Successfully compiled ui-player.c. Successfully compiled ui-prefs.c. Successfully compiled ui-score.c. Successfully compiled ui-signals.c. Successfully compiled ui-spell.c. Successfully compiled ui-store.c. Successfully compiled ui-target.c. Successfully compiled ui-term.c. Successfully compiled wiz-debug.c. Successfully compiled wiz-spoil.c. Successfully compiled wiz-stats.c. Successfully compiled buildid.c. Successfully compiled z-bitflag.c. Successfully compiled z-color.c. Successfully compiled z-dice.c. Successfully compiled z-expression.c. Successfully compiled z-file.c. Successfully compiled z-form.c. Successfully compiled z-quark.c. Successfully compiled z-queue.c. Successfully compiled z-rand.c. Successfully compiled z-set.c. Successfully compiled z-textblock.c. Successfully compiled z-type.c. Successfully compiled z-util.c. Successfully compiled z-virt.c. LINK angband.o Successfully compiled main.c. Successfully compiled main-gcu.c. Successfully compiled main-x11.c. LINK angband Leaving directory src. Entering directory lib. Entering directory gamedata. Leaving directory gamedata. Entering directory customize. Leaving directory customize. Entering directory help. Leaving directory help. Entering directory screens. Leaving directory screens. Entering directory fonts. Leaving directory fonts. Entering directory tiles. Entering directory adam-bolt. Leaving directory adam-bolt. Entering directory gervais. Leaving directory gervais. Entering directory nomad. Leaving directory nomad. Entering directory old. Leaving directory old. Entering directory shockbolt. Leaving directory shockbolt. Leaving directory tiles. Entering directory sounds. Leaving directory sounds. Entering directory icons. Leaving directory icons. Entering directory user. Entering directory save. Leaving directory save. Entering directory scores. Leaving directory scores. Entering directory info. Leaving directory info. Leaving directory user. Leaving directory lib. Entering directory doc. Leaving directory doc. [gruss@ws1 angband]$
Comment
-
I'm not sure what I was doing before - probably just needed to make clean - but now it's compiling fine for me with or without sdl and/or sdl-mixer enabled. So it looks like we're all good to go, and I'll pull it in to master some time when it's convenient (no need to do a pull request, I'll do it directly).
I still need to get a better solution with the sound files - submodules or whatever - but that can wait.One for the Dark Lord on his dark throne
In the Land of Mordor where the Shadows lie.Comment
-
One for the Dark Lord on his dark throne
In the Land of Mordor where the Shadows lie.Comment
-
OK, I pulled that in (after plentiful Linux testing), and we still seem to have an error in ld when compiling for Windows:
Code:main-win.o:main-win.c:(.text+0x4870): multiple definition of `register_sound_pref_parser' ui-prefs.o:ui-prefs.c:(.text+0x1e90): first defined here main-win.o:main-win.c:(.text+0x618b): undefined reference to `init_sound'
EDIT: I'm also seeing problems in testing - the autobuilder is failing the birth tests again, and I'm getting a link error in make tests:
Code:../angband.o: In function `init_parse_prefs': /home/nick/angband/src/ui-prefs.c:1069: undefined reference to `register_sound_pref_parser'
One for the Dark Lord on his dark throne
In the Land of Mordor where the Shadows lie.Comment
-
OK, I pulled that in (after plentiful Linux testing), and we still seem to have an error in ld when compiling for Windows:
Code:main-win.o:main-win.c:(.text+0x4870): multiple definition of `register_sound_pref_parser' ui-prefs.o:ui-prefs.c:(.text+0x1e90): first defined here main-win.o:main-win.c:(.text+0x618b): undefined reference to `init_sound'
- sound.h as an inline which registers the dummy parser if SOUND is not defined
- sound-core.c which registers the real parser if SOUND is defined
There should be no way whatsoever for register_sound_pref_parser to get this function declared twice.
As for the init_sound reference - looks like sound-core.c is not getting compiled for the Windows build. Ah, I just noticed I forgot to put a #ifdef SOUND around that in the case that you compile for Windows without sound.
I have an idea - in sound.h, can you try changing:
Code:inline errr register_sound_pref_parser(struct parser *p)
Code:static inline errr register_sound_pref_parser(struct parser *p)
EDIT: I'm also seeing problems in testing - the autobuilder is failing the birth tests again, and I'm getting a link error in make tests:
Code:../angband.o: In function `init_parse_prefs': /home/nick/angband/src/ui-prefs.c:1069: undefined reference to `register_sound_pref_parser'
Comment
-
OK, I have fixed the Windows problems. The issue was that the Windows build doesn't use configure, it has its own handmade makefile, Makefile.win. So I had to make sure SOUND was defined and sound-core.c was being compiled, and it's all good.
The Linux situation is a bit more puzzling. Currently the autobuilder is fine with unit tests, but fails birth tests. My dev environment is the opposite - birth tests are fine, but for some reason I cannot fathom unit tests continue to complain that register_sound_pref_parser isn't defined.
I feel like there's some subtle dependency issue here, but it's relatively low priority.One for the Dark Lord on his dark throne
In the Land of Mordor where the Shadows lie.Comment
-
Glad you got the Windows build issue fixed - Does sound work properly in Windows using the new sound module? I can't test it at all, so if it works first go I'll be pretty stoked.
As for the Linux situation, can you tell me what the ./configure options are that result in register_sound_pref_parser not being defined?Comment
-
Currently the build system compiles most of the files, links them to form angband.o, then compiles the main files and links them to form the final binary angband. You have set it up so that sound-core is compiled and linked in that second step, but the unit testing suite only uses angband.o. So when the linker looks at angband.o preparatory to compiling the test suite and linking them, it can't find register_sound_parser_pref(), because it isn't in angband.o.
The obvious quick fix I attempted was to compile sound-core into angband.o, but that results in tests having problems with init_sound_sdl not being defined...
I'm not sure what the best solution is, but I'll give it some more thought - if you have a good answer, I'd be delighted to hear itOne for the Dark Lord on his dark throne
In the Land of Mordor where the Shadows lie.Comment
-
If SOUND is not defined and sound.h is included (which it is via ui-prefs.h), then the stub version of register_sound_pref_parser() will be included in angband.o
If SOUND is defined, then the platform specific code needs to define register_sound_pref_parser()
The obvious solution is to make sure SOUND is not defined when unit tests are build (since, as you say, no platform specific code is compiled for the unit tests)
I'm assuming the 'unit tests' define a special 'platform specific main' (the platform being the unit test suite). So of course, we could always define some kind of dummy sound module for the unit tests (which would be rather useful for testing the parsing of the sound preferences file)Comment
-
If SOUND is not defined and sound.h is included (which it is via ui-prefs.h), then the stub version of register_sound_pref_parser() will be included in angband.o
If SOUND is defined, then the platform specific code needs to define register_sound_pref_parser()
The obvious solution is to make sure SOUND is not defined when unit tests are build (since, as you say, no platform specific code is compiled for the unit tests)
I'm assuming the 'unit tests' define a special 'platform specific main' (the platform being the unit test suite). So of course, we could always define some kind of dummy sound module for the unit tests (which would be rather useful for testing the parsing of the sound preferences file)
There is a simple solution to this, which is to treat the sound config separately to pref files, and then you don't need all this conditional compilation and inline function stuff.takkaria whispers something about options. -more-Comment
-
Part of the reason I put register_sound_pref_parser() as an inline stub in sound.h was to prevent breakage of builds which haven't been converted to the new sound module. They can proceed to initialise sound and parse the old sound config file as they see fit (for the time being).
sound-core.c needs to be outside angband.o to avoid symbol clashes with init_sound() - Maybe I could just rename init_sound() to say init_sound_standard() and move the whole box and dice into angband.o and then all that needs to be worried about at the platform level is to add the platform's sound module to sound_modules[] in sound-core.c and the platform specific sound code (which is neatly outside angband.o)
This will mean that the code for parsing the sound config will be in the binary whether sound is enabled or not, but a) it's a fairly trivial amount of code; and b) it makes life easier for the automated building of the unit testsComment
-
sound-core.c needs to be outside angband.o to avoid symbol clashes with init_sound() - Maybe I could just rename init_sound() to say init_sound_standard() and move the whole box and dice into angband.o and then all that needs to be worried about at the platform level is to add the platform's sound module to sound_modules[] in sound-core.c and the platform specific sound code (which is neatly outside angband.o)
This will mean that the code for parsing the sound config will be in the binary whether sound is enabled or not, but a) it's a fairly trivial amount of code; and b) it makes life easier for the automated building of the unit teststakkaria whispers something about options. -more-Comment
Comment