// RFC2833 RTP DTMF Telephone Events
|
|
|
|
package rtp
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
// Turns telephone event into ASCII character.
|
|
func DtmfToChar(event uint8) (byte, error) {
|
|
switch event {
|
|
case 0:
|
|
return '0', nil
|
|
case 1:
|
|
return '1', nil
|
|
case 2:
|
|
return '2', nil
|
|
case 3:
|
|
return '3', nil
|
|
case 4:
|
|
return '4', nil
|
|
case 5:
|
|
return '5', nil
|
|
case 6:
|
|
return '6', nil
|
|
case 7:
|
|
return '7', nil
|
|
case 8:
|
|
return '8', nil
|
|
case 9:
|
|
return '9', nil
|
|
case 10:
|
|
return '*', nil
|
|
case 11:
|
|
return '#', nil
|
|
case 12:
|
|
return 'A', nil
|
|
case 13:
|
|
return 'B', nil
|
|
case 14:
|
|
return 'C', nil
|
|
case 15:
|
|
return 'D', nil
|
|
case 16:
|
|
return '!', nil
|
|
default:
|
|
return '\x00', errors.New(fmt.Sprintf("bad tel event: %v", event))
|
|
}
|
|
}
|
|
|
|
// Turns ascii character into corresponding telephone event.
|
|
func CharToDtmf(ch byte) (event uint8, err error) {
|
|
switch ch {
|
|
case '0':
|
|
event = 0
|
|
case '1':
|
|
event = 1
|
|
case '2':
|
|
event = 2
|
|
case '3':
|
|
event = 3
|
|
case '4':
|
|
event = 4
|
|
case '5':
|
|
event = 5
|
|
case '6':
|
|
event = 6
|
|
case '7':
|
|
event = 7
|
|
case '8':
|
|
event = 8
|
|
case '9':
|
|
event = 9
|
|
case '*':
|
|
event = 10
|
|
case '#':
|
|
event = 11
|
|
case 'a', 'A':
|
|
event = 12
|
|
case 'b', 'B':
|
|
event = 13
|
|
case 'c', 'C':
|
|
event = 14
|
|
case 'd', 'D':
|
|
event = 15
|
|
case '!':
|
|
event = 16
|
|
default:
|
|
err = errors.New(fmt.Sprint("bad dtmf char:", string(ch)))
|
|
}
|
|
return
|
|
}
|