One catch with creating a new channel is that you need to be sure everything works with restore and restart. The number returned by the glk_schannel_create() identifies the sound channel, but you have to remember that that only has meaning for the interpreter process that the game is currently running in, so you’ve got to watch out for what restore and restart will do with this number. I suspect that the above isn’t very clear, so I’ll try to be clearer with an example, based on what you’re trying to do.
So, imagine the player starts up the interpreter and starts your game. The game creates its sound channel by calling glk_schannel_create(), which returns some number to identify the sound channel, say (for example) 123. You store that in some variable and use it to start a sound playing, and its all fine. Later on the player saves the game, which generates a save file containing details of the values of all variables, including your variable for the sound channel, set to 123.
Okay, now the player closes the interpreter and then some time later starts it up again. Again the game creates its sound channel, but this time the Glk layer might give back a different number to identify the sound channel. Lets’ say it gives back 245 this time. The game stores this in its variable, and uses it to start a sound playing - all fine.
But now the player restores the previously saved game. The saved game state has the ‘old’ value for identifying the sound channel of 123. While restoring leaves the sound playing, any later attempts by the game to change the sound channel all fail - because the game is passing 123 as the number for the channel, while the Glk layer knows that the only sound channel its got has an identifying value of 245.
Just to make things even more difficult, some Glk layers might always return the same sequence of numbers for created channels (e.g. 1,2,3 …) while some might not.
To solve this, you’ve got to have a way to get the value of the sound channel right after restore. There is a mechanism to do this: see “IdentifyGlkObject” in Glulx Entry Points. Unfortunately it’s not particularly well documented or easy to use, as you end up switching between I6 and I7. Emily’s “Simple Graphical Window” extension uses this for the purpose of finding the number to refer to the extra graphics window it creates - have a look at Section 2 of it, particularly “A glulx zeroing-reference rule” and “A glulx resetting-windows rule”. (You would need to make the later “A glulx object-updating rule”.)