cannam@124
|
1 #include "portaudiocpp/DirectionSpecificStreamParameters.hxx"
|
cannam@124
|
2
|
cannam@124
|
3 #include "portaudiocpp/Device.hxx"
|
cannam@124
|
4
|
cannam@124
|
5 namespace portaudio
|
cannam@124
|
6 {
|
cannam@124
|
7
|
cannam@124
|
8 // -----------------------------------------------------------------------------------
|
cannam@124
|
9
|
cannam@124
|
10 //////
|
cannam@124
|
11 /// Returns a `nil' DirectionSpecificStreamParameters object. This can be used to
|
cannam@124
|
12 /// specify that one direction of a Stream is not required (i.e. when creating
|
cannam@124
|
13 /// a half-duplex Stream). All fields of the null DirectionSpecificStreamParameters
|
cannam@124
|
14 /// object are invalid except for the device and the number of channel, which are set
|
cannam@124
|
15 /// to paNoDevice and 0 respectively.
|
cannam@124
|
16 //////
|
cannam@124
|
17 DirectionSpecificStreamParameters DirectionSpecificStreamParameters::null()
|
cannam@124
|
18 {
|
cannam@124
|
19 DirectionSpecificStreamParameters tmp;
|
cannam@124
|
20 tmp.paStreamParameters_.device = paNoDevice;
|
cannam@124
|
21 tmp.paStreamParameters_.channelCount = 0;
|
cannam@124
|
22 return tmp;
|
cannam@124
|
23 }
|
cannam@124
|
24
|
cannam@124
|
25 // -----------------------------------------------------------------------------------
|
cannam@124
|
26
|
cannam@124
|
27 //////
|
cannam@124
|
28 /// Default constructor -- all parameters will be uninitialized.
|
cannam@124
|
29 //////
|
cannam@124
|
30 DirectionSpecificStreamParameters::DirectionSpecificStreamParameters()
|
cannam@124
|
31 {
|
cannam@124
|
32 }
|
cannam@124
|
33
|
cannam@124
|
34 //////
|
cannam@124
|
35 /// Constructor which sets all required fields.
|
cannam@124
|
36 //////
|
cannam@124
|
37 DirectionSpecificStreamParameters::DirectionSpecificStreamParameters(const Device &device, int numChannels,
|
cannam@124
|
38 SampleDataFormat format, bool interleaved, PaTime suggestedLatency, void *hostApiSpecificStreamInfo)
|
cannam@124
|
39 {
|
cannam@124
|
40 setDevice(device);
|
cannam@124
|
41 setNumChannels(numChannels);
|
cannam@124
|
42 setSampleFormat(format, interleaved);
|
cannam@124
|
43 setSuggestedLatency(suggestedLatency);
|
cannam@124
|
44 setHostApiSpecificStreamInfo(hostApiSpecificStreamInfo);
|
cannam@124
|
45 }
|
cannam@124
|
46
|
cannam@124
|
47 // -----------------------------------------------------------------------------------
|
cannam@124
|
48
|
cannam@124
|
49 void DirectionSpecificStreamParameters::setDevice(const Device &device)
|
cannam@124
|
50 {
|
cannam@124
|
51 paStreamParameters_.device = device.index();
|
cannam@124
|
52 }
|
cannam@124
|
53
|
cannam@124
|
54 void DirectionSpecificStreamParameters::setNumChannels(int numChannels)
|
cannam@124
|
55 {
|
cannam@124
|
56 paStreamParameters_.channelCount = numChannels;
|
cannam@124
|
57 }
|
cannam@124
|
58
|
cannam@124
|
59 void DirectionSpecificStreamParameters::setSampleFormat(SampleDataFormat format, bool interleaved)
|
cannam@124
|
60 {
|
cannam@124
|
61 paStreamParameters_.sampleFormat = static_cast<PaSampleFormat>(format);
|
cannam@124
|
62
|
cannam@124
|
63 if (!interleaved)
|
cannam@124
|
64 paStreamParameters_.sampleFormat |= paNonInterleaved;
|
cannam@124
|
65 }
|
cannam@124
|
66
|
cannam@124
|
67 void DirectionSpecificStreamParameters::setHostApiSpecificSampleFormat(PaSampleFormat format, bool interleaved)
|
cannam@124
|
68 {
|
cannam@124
|
69 paStreamParameters_.sampleFormat = format;
|
cannam@124
|
70
|
cannam@124
|
71 paStreamParameters_.sampleFormat |= paCustomFormat;
|
cannam@124
|
72
|
cannam@124
|
73 if (!interleaved)
|
cannam@124
|
74 paStreamParameters_.sampleFormat |= paNonInterleaved;
|
cannam@124
|
75 }
|
cannam@124
|
76
|
cannam@124
|
77 void DirectionSpecificStreamParameters::setSuggestedLatency(PaTime latency)
|
cannam@124
|
78 {
|
cannam@124
|
79 paStreamParameters_.suggestedLatency = latency;
|
cannam@124
|
80 }
|
cannam@124
|
81
|
cannam@124
|
82 void DirectionSpecificStreamParameters::setHostApiSpecificStreamInfo(void *streamInfo)
|
cannam@124
|
83 {
|
cannam@124
|
84 paStreamParameters_.hostApiSpecificStreamInfo = streamInfo;
|
cannam@124
|
85 }
|
cannam@124
|
86
|
cannam@124
|
87 // -----------------------------------------------------------------------------------
|
cannam@124
|
88
|
cannam@124
|
89 PaStreamParameters *DirectionSpecificStreamParameters::paStreamParameters()
|
cannam@124
|
90 {
|
cannam@124
|
91 if (paStreamParameters_.channelCount > 0 && paStreamParameters_.device != paNoDevice)
|
cannam@124
|
92 return &paStreamParameters_;
|
cannam@124
|
93 else
|
cannam@124
|
94 return NULL;
|
cannam@124
|
95 }
|
cannam@124
|
96
|
cannam@124
|
97 const PaStreamParameters *DirectionSpecificStreamParameters::paStreamParameters() const
|
cannam@124
|
98 {
|
cannam@124
|
99 if (paStreamParameters_.channelCount > 0 && paStreamParameters_.device != paNoDevice)
|
cannam@124
|
100 return &paStreamParameters_;
|
cannam@124
|
101 else
|
cannam@124
|
102 return NULL;
|
cannam@124
|
103 }
|
cannam@124
|
104
|
cannam@124
|
105 Device &DirectionSpecificStreamParameters::device() const
|
cannam@124
|
106 {
|
cannam@124
|
107 return System::instance().deviceByIndex(paStreamParameters_.device);
|
cannam@124
|
108 }
|
cannam@124
|
109
|
cannam@124
|
110 int DirectionSpecificStreamParameters::numChannels() const
|
cannam@124
|
111 {
|
cannam@124
|
112 return paStreamParameters_.channelCount;
|
cannam@124
|
113 }
|
cannam@124
|
114
|
cannam@124
|
115 //////
|
cannam@124
|
116 /// Returns the (non host api-specific) sample format, without including
|
cannam@124
|
117 /// the paNonInterleaved flag. If the sample format is host api-spefific,
|
cannam@124
|
118 /// INVALID_FORMAT (0) will be returned.
|
cannam@124
|
119 //////
|
cannam@124
|
120 SampleDataFormat DirectionSpecificStreamParameters::sampleFormat() const
|
cannam@124
|
121 {
|
cannam@124
|
122 if (isSampleFormatHostApiSpecific())
|
cannam@124
|
123 return INVALID_FORMAT;
|
cannam@124
|
124 else
|
cannam@124
|
125 return static_cast<SampleDataFormat>(paStreamParameters_.sampleFormat & ~paNonInterleaved);
|
cannam@124
|
126 }
|
cannam@124
|
127
|
cannam@124
|
128 bool DirectionSpecificStreamParameters::isSampleFormatInterleaved() const
|
cannam@124
|
129 {
|
cannam@124
|
130 return ((paStreamParameters_.sampleFormat & paNonInterleaved) == 0);
|
cannam@124
|
131 }
|
cannam@124
|
132
|
cannam@124
|
133 bool DirectionSpecificStreamParameters::isSampleFormatHostApiSpecific() const
|
cannam@124
|
134 {
|
cannam@124
|
135 return ((paStreamParameters_.sampleFormat & paCustomFormat) == 0);
|
cannam@124
|
136 }
|
cannam@124
|
137
|
cannam@124
|
138 //////
|
cannam@124
|
139 /// Returns the host api-specific sample format, without including any
|
cannam@124
|
140 /// paCustomFormat or paNonInterleaved flags. Will return 0 if the sample format is
|
cannam@124
|
141 /// not host api-specific.
|
cannam@124
|
142 //////
|
cannam@124
|
143 PaSampleFormat DirectionSpecificStreamParameters::hostApiSpecificSampleFormat() const
|
cannam@124
|
144 {
|
cannam@124
|
145 if (isSampleFormatHostApiSpecific())
|
cannam@124
|
146 return paStreamParameters_.sampleFormat & ~paCustomFormat & ~paNonInterleaved;
|
cannam@124
|
147 else
|
cannam@124
|
148 return 0;
|
cannam@124
|
149 }
|
cannam@124
|
150
|
cannam@124
|
151 PaTime DirectionSpecificStreamParameters::suggestedLatency() const
|
cannam@124
|
152 {
|
cannam@124
|
153 return paStreamParameters_.suggestedLatency;
|
cannam@124
|
154 }
|
cannam@124
|
155
|
cannam@124
|
156 void *DirectionSpecificStreamParameters::hostApiSpecificStreamInfo() const
|
cannam@124
|
157 {
|
cannam@124
|
158 return paStreamParameters_.hostApiSpecificStreamInfo;
|
cannam@124
|
159 }
|
cannam@124
|
160
|
cannam@124
|
161 // -----------------------------------------------------------------------------------
|
cannam@124
|
162
|
cannam@124
|
163 } // namespace portaudio
|