-
Notifications
You must be signed in to change notification settings - Fork 0
/
sampleformat.go
131 lines (120 loc) · 5.91 KB
/
sampleformat.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// This file is subject to a BSD license.
// Its contents can be found in the enclosed LICENSE file.
package ao
// #include <ao/ao.h>
import "C"
// SampleFormat defines the format of audio samples.
//
// The Matrix field specifies the mapping of input channels to intended
// speaker/ouput location (or empty to specify no mapping). The matrix is
// specified as a comma seperated list of channel locations equal to the
// number and in the order of the input channels.
//
// The channel mnemonics are as follows:
//
// L : Left speaker, located forward and to the left of the listener.
// R : Right speaker, located forward and to the right of the listener.
// C : Center speaker, located directly forward of the listener between
// the Left and Right speakers.
// M : Monophonic, a virtual speaker for single-channel output.
// CL : Left of Center speaker (used in some Widescreen formats),
// located forward of the listener between the Center and Left
// speakers. Alternatively referred to as 'Left Center'.
// CR : Right of Center speaker (used in some Widescreen formats),
// located forward of the listener between the Center and Right
// speakers. Alternatively referred to as 'Right Center'.
// BL : Back Left speaker, located behind and to the left of the
// listener. Alternatively called 'Left Surround' (primarily by
// Apple) or 'Surround Rear Left' (primarily by Dolby).
// BR : Back Right speaker, located behind and to the right of the
// listener. Alternatively called 'Right Surround' (primarily by
// Apple) or 'Surround Rear Right' (primarily by Dolby).
// BC : Back Center speaker, located directly behind the listener.
// Alternatively called 'Center Surround' (primarily by Apple) or
// 'Surround Rear Center' (primarily by Dolby).
// SL : Side Left speaker, located directly to the listener's left side.
// The Side Left speaker is also referred to as 'Left Surround
// Direct' (primarily by Apple) or 'Surround Left' (primarily by Dolby)
// SR : Side Right speaker, located directly to the listener's right
// side. The Side Right speaker is also referred to as 'Right
// Surround Direct' (primarily by Apple) or 'Surround Right'
// (primarily by Dolby)
// LFE : Low Frequency Effect (subwoofer) channel. This is channel is
// usually lowpassed and meant only for bass, though in some recent
// formats it is a discrete, full-range channel. Microsoft calls
// this the 'Low Frequency' channel.
// X : Unused/Invalid channel, to be dropped in the driver and not
// output to any speaker.
// A1 : 'auxiliary' channels, not mapped to a location. Intended for
// A2 driver-specific use.
// A3
// A4
//
// Note: the 'surround' speakers referred to in other systems can be either
// the side or back speakers depending on vendor. For example, Apple calls the
// back speakers 'surround' and the side speakers 'direct surround'.
//
// Dolby calls the back speakers 'surround rear' and the side speakers
// 'surround', resulting in a direct naming conflict. For this reason,
// libao explicitly refers to speakers as 'back' and 'side' rather than
// 'surround'.
//
// Refer to the Matrix*** constants for examples of common matrix
// configurations.
type SampleFormat struct {
Matrix string // String defining the channel input matrix.
Bits int // Bits per sample.
Rate int // Samples per second per channel.
Channels int // Number of audio channels.
ByteOrder ByteOrder // Byte ordering of the sample data. Defaults to EndianNative
}
// Bitrate computes the bitrate in bits per second, given the current
// sample format settings.
func (sf *SampleFormat) Bitrate() int {
return sf.Rate * sf.Bits * sf.Channels
}
// toC converts the sample format to its C equivalent.
func (sf *SampleFormat) toC() *C.ao_sample_format {
csf := &C.ao_sample_format{
bits: C.int(sf.Bits),
rate: C.int(sf.Rate),
channels: C.int(sf.Channels),
byte_format: C.int(sf.ByteOrder),
matrix: C.CString(sf.Matrix),
}
// Matrix should be explicitely set to NULL if the string is empty.
// A zero-length string is not considered valid.
if len(sf.Matrix) == 0 {
csf.matrix = nil
}
if csf.byte_format == 0 {
csf.byte_format = C.AO_FMT_NATIVE
}
return csf
}
// Common examples of channel orderings.
// These can be assigned as-is to the SampleFormat.Matrix field.
//
// Channel mappings for most formats are usually not tied to a single
// channel matrix (there are a few exceptions like Vorbis I, where the number
// of channels always maps to a specific order); these examples cannot
// be blindly applied to a given file type and number of channels.
//
// The mapping must usually be read or intuited from the input.
const (
MatrixDefault = "L,R" // Stereo ordering in virtually all file formats
MatrixQuadraphonic = "L,R,BL,BR" // Quadraphonic ordering for most file formats
Matrix51 = "L,R,C,LFE,BR,BL" // Channel order of a 5.1 WAV or FLAC file
Matrix71 = "L,R,C,LFE,BR,BL,SL,SR" // Channel order of a 7.1 WAV or FLAC file
Matrix51Vorbis = "L,C,R,BR,BL,LFE" // Channel order of a six channel (5.1) Vorbis I file
Matrix71Vorbis = "L,C,R,BR,BL,SL,SR,LFE" // Channel order of an eight channel (7.1) Vorbis file
MatrixAIFF = "L,CL,C,R,RC,BC" // Channel order of a six channel AIFF[-C] file
)
// ByteOrder defines endianess for sample data.
type ByteOrder int
// Known byte orders.
const (
EndianLittle ByteOrder = C.AO_FMT_LITTLE // Samples are in little-endian order.
EndianBig ByteOrder = C.AO_FMT_BIG // Samples are in big-endian order
EndianNative ByteOrder = C.AO_FMT_NATIVE // Samples are in the native ordering of the computer.
)