I just wanted to post back on this topic so others finding this thread know the results: the suggestions to use USB-UIRT and EventGhost were good ones. Everything is working well, though I did have to do some Python scripting in EventGhost in order to overcome some fundamental differences in the way my AVR, Logitech G13 keyboard, and Windows handle volume levels. I'm thinking that this could be a common issue so I'm posting below the script I wrote. It has some detailed comments on why I wrote the script. Hopefully it helps someone, somewhere, someday.
Code:
#Listens for System.Volume events and compares the system volume received to
#50.00. If new volume is less than 50.00, it sends a volume down command to
#the AIWA AVR via the USB-UIRT device. If it's greater than 50.00, it sends
#volume up.
#
#Why 50.00? Because every time we get a systemvolume event, we reset the
#system volume to 50.00. First, note that this is okay to do because the
#AIWA is controlling the volume, not the PC (this is true only when using
#the sound blaster's DolbyDigital live - i.e. when the AVR is doing all
#of the audio decoding). But why set it to 50.00 at all? Because the
#roller on the logitech keyboard is infinite - i.e. it never stops, even
#when, for example, system volume gets to 100.00. Thus,
#you could be turning the wheel, and the system volume would be at 100
# and never going up, which meansEvent Ghost would not see the system
#volume chaning and not know to keep raising the volume on the AIWA. In
#short, this method lets us ignore the fact that the AIWA and PC system
#volumes will never be in sync and let's us always know that moving
#the volume control wheel up will let us (in this script) see an increasing
#volume value, and vice versa for down.
#This function handles the volume change.
def OnVolumeChange():
#Make sure we got a real System.Volume event. If not, don't do anything
#else
if eg.event.string != "System.Volume":
print "Error: Volume change action invoked for non-volume change event."
return
if float(eg.event.payload) < 50.00:
eg.plugins.USB_UIRT.TransmitIR(u'0000 006C 002C 0002 0156 00AC 0015 0016 0016 0016 0016 0016 0015 0041 0016 0040 0016 0041 0015 0041 0016 0016 0015 0016 0016 0016 0016 0016 0015 0016 0016 0016 0016 0040 0016 0041 0015 0041 0016 0016 0015 0016 0016 0016 0016 0016 0015 0041 0016 0040 0016 0041 0015 0041 0016 0040 0016 0041 0015 0016 0016 0041 0015 0016 0016 0016 0016 0040 0016 0016 0016 0016 0015 0016 0016 0041 0015 0016 0016 0041 0015 0041 0016 0016 0015 0041 0016 0040 0016 0041 0015 036F 0157 00AC 0015 0DFF', 4, 0)
elif float(eg.event.payload) > 50.00:
eg.plugins.USB_UIRT.TransmitIR(u'0000 006C 002C 0002 0157 00AD 0015 0016 0016 0016 0016 0016 0015 0041 0016 0040 0016 0041 0015 0041 0016 0016 0015 0016 0016 0016 0016 0016 0015 0016 0016 0016 0016 0040 0016 0041 0015 0041 0016 0016 0015 0016 0016 0016 0016 0016 0015 0041 0016 0040 0016 0041 0015 0041 0016 0040 0016 0041 0015 0041 0016 0016 0015 0016 0016 0016 0016 0040 0016 0016 0016 0016 0015 0016 0016 0016 0016 0040 0016 0041 0015 0041 0016 0016 0015 0041 0016 0040 0016 0041 0015 0370 0157 00AC 0015 0E03', 4, 0)
#Invoke the volume changing fucntion.
OnVolumeChange()
As mentioned in the comments, in EventGhost, not only does this script run every time a volume change event comes, but there is also an action that resets the system volume to 50%. Thus Event Ghost is only monitoring volume change direction (up or down) not absolute volume. This is needed to convert the Windows system volume from a scale of 0 - 100 to my AVR volume, which is a much smaller scale and also needed to handle the fact that the volume control on my keyboard has no knowledge of the current system volume. One final Note: anyone using this script would have to replace the USB_UIRT IR commands with the ones specific to their AVR, which is easily done using the EventGhost USB-UIRT plugin's learn IR feature.
I don't know if EventGhost has a simpler way to handle this sort of thing than a script, but this was the first idea that came to mind.