Streaming audio to a channel asynchronously

Is it possible to stream audio to a channel while the channel is executing commands such as AMD or DIAL in the dial plan ?

Right, well I tried a few things (I mean, days of things) and this is what I came up with.

2 Questions:
1: Is there a simpler way?
2: Is there a trick to pass back a variable to the calling channel, rather than setting a global?

(This is for an agi process that can take up to ten seconds to query a web API and come back with a list of maybe ten items).

; starts a new channel on 3b and sets the variable it's going to need using "b" param
; starts music class using "m" param, and then makes the call

exten => s,1,Answer()
    same => n,Dial(Local/s@synctest3b,,gm(wait-long-process)b(synctest3b^setVar^1(from calling channel)))
    same => n,Verbose(1,${test}) ; set by the global in 3b
    same => n,Set(GLOBAL(test)="") ; stop it polluting other calls   
    same => n,Hangup()

; kicks into action with some long process (agi for example)
; when process is complete, it answers the call and sets global
; it then hangs up, music on hold stops, 3a resumes

exten => s,1,Wait(2)
    same => n,Verbose(1,${testVar})
    same => n,Set(GLOBAL(test)=true) ; 
    same => n,Answer() 
    same => n,Hangup()
exten => setVar,1,Set(testVar=${ARG1}) ; setter
    same => n,Return()