I'm trying to do a second att_xfer on a call so that if the first attended transfer fails (c-leg is busy, or presses do-not-answer, or is an extn that doesn't exist) then the call could be transferred to someone else.

On the first att_xfer the person on hold hears the hold_music correctly. Once that transfer is cancelled or fails:
-- On any subsequent att_xfer's the person on hold just hears silence.
-- If they are put on hold they just hear silence.

I tried setting hold_music again for each channel after the first att_xfer, but that didn't work, so it's probably not actually a problem with hold_music per se, but some other variable/setting that decides whether to use hold_music.

I also tried doing a uuid_dump before and after each attempt, but didn't notice anything too different - unless it's a matter of unsetting one of the couple of changed/new vars like:
variable_originate_disposition
variable_current_application
variable_playback_seconds

I get the feeling other variables are probably also lost by the first failed transfer as the second att_xfer has some odd things happen if the third party does answer. Haven't been able to narrow it down as closely as the hold_music, but two things I've seen happen are:
-- The party that initiated the transfer gets hung up automatically (after 30 sec)
-- When the party that initiated the transfer hangs up it should connect the other two parties, but instead it hung up all three

Cheers,
Fraser