|  |  |  | @ -4,6 +4,7 @@ import ( | 
		
	
		
			
				|  |  |  |  | 	"encoding/binary" | 
		
	
		
			
				|  |  |  |  | 	"fmt" | 
		
	
		
			
				|  |  |  |  | 	"os" | 
		
	
		
			
				|  |  |  |  | 	"time" | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	"git.metznet.ca/MetzNet/pnyx" | 
		
	
		
			
				|  |  |  |  | 	"github.com/gen2brain/malgo" | 
		
	
	
		
			
				
					|  |  |  | @ -11,7 +12,7 @@ import ( | 
		
	
		
			
				|  |  |  |  | ) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | func main() { | 
		
	
		
			
				|  |  |  |  |   decoders := map[pnyx.PeerID]*opus.Decoder{} | 
		
	
		
			
				|  |  |  |  |   decoders := map[pnyx.PeerID]chan[]byte{} | 
		
	
		
			
				|  |  |  |  |   encoder, err := opus.NewEncoder(48000, 1, opus.AppVoIP) | 
		
	
		
			
				|  |  |  |  |   if err != nil { | 
		
	
		
			
				|  |  |  |  |     panic(err) | 
		
	
	
		
			
				
					|  |  |  | @ -179,23 +180,49 @@ func main() { | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |       peer := pnyx.PeerID(packet.Data[0:16]) | 
		
	
		
			
				|  |  |  |  |       if packet.Channel == pnyx.ChannelID(1) { | 
		
	
		
			
				|  |  |  |  |         decoder, exists := decoders[peer] | 
		
	
		
			
				|  |  |  |  |         decode_chan, exists := decoders[peer] | 
		
	
		
			
				|  |  |  |  |         if exists == false { | 
		
	
		
			
				|  |  |  |  |           decoder, err = opus.NewDecoder(48000, 1) | 
		
	
		
			
				|  |  |  |  |           decode_chan = make(chan[]byte, 1000) | 
		
	
		
			
				|  |  |  |  |           decoders[peer] = decode_chan | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |           go func(decode_chan chan[]byte){ | 
		
	
		
			
				|  |  |  |  |             decoder, err := opus.NewDecoder(48000, 1) | 
		
	
		
			
				|  |  |  |  |             if err != nil { | 
		
	
		
			
				|  |  |  |  |               panic(err) | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             for true { | 
		
	
		
			
				|  |  |  |  |               select { | 
		
	
		
			
				|  |  |  |  |               case <-time.After(20*time.Millisecond): | 
		
	
		
			
				|  |  |  |  |                 pcm := make([]int16, 960) | 
		
	
		
			
				|  |  |  |  |                 err := decoder.DecodePLC(pcm) | 
		
	
		
			
				|  |  |  |  |                 if err != nil { | 
		
	
		
			
				|  |  |  |  |                   panic(err) | 
		
	
		
			
				|  |  |  |  |                 } | 
		
	
		
			
				|  |  |  |  |         pcm := make([]int16, 1000) | 
		
	
		
			
				|  |  |  |  |         written, err := decoder.Decode(packet.Data[16:], pcm) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 pcm_bytes := make([]byte, 960*2) | 
		
	
		
			
				|  |  |  |  |                 for i := 0; i < 960; i++ { | 
		
	
		
			
				|  |  |  |  |                   binary.LittleEndian.PutUint16(pcm_bytes[i*2:], uint16(pcm[i])) | 
		
	
		
			
				|  |  |  |  |                 } | 
		
	
		
			
				|  |  |  |  |                 speaker <- pcm_bytes | 
		
	
		
			
				|  |  |  |  |               case data := <-decode_chan: | 
		
	
		
			
				|  |  |  |  |                 pcm := make([]int16, 960) | 
		
	
		
			
				|  |  |  |  |                 written, err := decoder.Decode(data, pcm) | 
		
	
		
			
				|  |  |  |  |                 if err != nil { | 
		
	
		
			
				|  |  |  |  |                   panic(err) | 
		
	
		
			
				|  |  |  |  |                 } | 
		
	
		
			
				|  |  |  |  |         data := make([]byte, written*2) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 pcm_bytes := make([]byte, written*2) | 
		
	
		
			
				|  |  |  |  |                 for i := 0; i < written; i++ { | 
		
	
		
			
				|  |  |  |  |           binary.LittleEndian.PutUint16(data[i*2:], uint16(pcm[i])) | 
		
	
		
			
				|  |  |  |  |                   binary.LittleEndian.PutUint16(pcm_bytes[i*2:], uint16(pcm[i])) | 
		
	
		
			
				|  |  |  |  |                 } | 
		
	
		
			
				|  |  |  |  |                 speaker <- pcm_bytes | 
		
	
		
			
				|  |  |  |  |               } | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |              | 
		
	
		
			
				|  |  |  |  |           }(decoders[peer]) | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         speaker <- data | 
		
	
		
			
				|  |  |  |  |         decode_chan <- packet.Data[16:] | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |   }() | 
		
	
	
		
			
				
					|  |  |  | 
 |