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