Changeset 2cc5c835 in mainline for uspace/srv/audio/hound/audio_device.c
- Timestamp:
- 2012-07-15T15:14:10Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 57e8b3b
- Parents:
- b497018
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/audio/hound/audio_device.c
rb497018 r2cc5c835 42 42 #include <str_error.h> 43 43 44 #include <audio_pcm_iface.h>45 44 46 45 #include "audio_device.h" … … 54 53 static int get_buffer(audio_device_t *dev); 55 54 static int release_buffer(audio_device_t *dev); 56 static int start_playback(audio_device_t *dev);57 static int stop_playback(audio_device_t *dev);58 static int start_recording(audio_device_t *dev);59 static int stop_recording(audio_device_t *dev);60 55 61 56 … … 66 61 dev->id = id; 67 62 dev->name = str_dup(name); 68 dev->sess = loc_service_connect(EXCHANGE_SERIALIZE, id, 0);63 dev->sess = audio_pcm_open_service(id); 69 64 if (!dev->sess) { 70 65 log_debug("Failed to connect to device \"%s\"", name); … … 108 103 } 109 104 110 ret = start_playback(dev); 105 /* Fill the buffer first */ 106 audio_sink_mix_inputs(&dev->sink, 107 dev->buffer.base, dev->buffer.size); 108 109 ret = audio_pcm_start_playback(dev->sess, BUFFER_BLOCKS, 110 dev->sink.format.channels, dev->sink.format.sampling_rate, 111 dev->sink.format.sample_format); 111 112 if (ret != EOK) { 112 113 log_error("Failed to start playback: %s", … … 119 120 assert(!new); 120 121 log_verbose("No connections on device sink '%s'", sink->name); 121 int ret = stop_playback(dev);122 int ret = audio_pcm_stop_playback(dev->sess); 122 123 if (ret != EOK) { 123 124 log_error("Failed to start playback: %s", … … 147 148 return ret; 148 149 } 149 ret = start_recording(dev); 150 ret = audio_pcm_start_record(dev->sess, BUFFER_BLOCKS, 151 dev->sink.format.channels, dev->sink.format.sampling_rate, 152 dev->sink.format.sample_format); 150 153 if (ret != EOK) { 151 154 log_error("Failed to start recording: %s", … … 155 158 } 156 159 } else { /* Disconnected */ 157 int ret = stop_recording(dev);160 int ret = audio_pcm_stop_record(dev->sess); 158 161 if (ret != EOK) { 159 162 log_error("Failed to start recording: %s", … … 229 232 dev->buffer.size = 0; 230 233 231 async_exch_t *exch = async_exchange_begin(dev->sess); 232 const int ret = audio_pcm_get_buffer(exch, &dev->buffer.base, 234 return audio_pcm_get_buffer(dev->sess, &dev->buffer.base, 233 235 &dev->buffer.size, device_event_callback, dev); 234 async_exchange_end(exch); 235 return ret; 236 } 237 238 #define CHECK_BUFFER_AND_CONNECTION() \ 239 do { \ 240 assert(dev); \ 241 if (!dev->sess) { \ 242 log_debug("No connection to device"); \ 243 return EIO; \ 244 } \ 245 if (!dev->buffer.base) { \ 246 log_debug("We don't have a buffer"); \ 247 return ENOENT; \ 248 } \ 249 } while (0) 250 236 } 251 237 252 238 static int release_buffer(audio_device_t *dev) 253 239 { 254 CHECK_BUFFER_AND_CONNECTION(); 255 256 async_exch_t *exch = async_exchange_begin(dev->sess); 257 const int ret = audio_pcm_release_buffer(exch); 258 async_exchange_end(exch); 240 assert(dev); 241 assert(dev->buffer.base); 242 243 const int ret = audio_pcm_release_buffer(dev->sess); 259 244 if (ret == EOK) { 260 245 dev->buffer.base = NULL; 261 246 dev->buffer.size = 0; 262 247 dev->buffer.position = NULL; 248 } else { 249 log_debug("Failed to release buffer: %s", str_error(ret)); 263 250 } 264 251 return ret; 265 252 } 266 267 static int start_playback(audio_device_t *dev)268 {269 CHECK_BUFFER_AND_CONNECTION();270 271 /* Fill the buffer first */272 audio_sink_mix_inputs(&dev->sink, dev->buffer.base, dev->buffer.size);273 274 async_exch_t *exch = async_exchange_begin(dev->sess);275 const int ret = audio_pcm_start_playback(exch,276 BUFFER_BLOCKS, dev->sink.format.channels,277 dev->sink.format.sampling_rate, dev->sink.format.sample_format);278 async_exchange_end(exch);279 return ret;280 }281 282 static int stop_playback(audio_device_t *dev)283 {284 CHECK_BUFFER_AND_CONNECTION();285 286 async_exch_t *exch = async_exchange_begin(dev->sess);287 const int ret = audio_pcm_stop_playback(exch);288 async_exchange_end(exch);289 return ret;290 }291 292 static int start_recording(audio_device_t *dev)293 {294 CHECK_BUFFER_AND_CONNECTION();295 296 async_exch_t *exch = async_exchange_begin(dev->sess);297 const int ret = audio_pcm_start_record(exch,298 BUFFER_BLOCKS, dev->sink.format.channels,299 dev->sink.format.sampling_rate, dev->sink.format.sample_format);300 async_exchange_end(exch);301 return ret;302 }303 304 static int stop_recording(audio_device_t *dev)305 {306 CHECK_BUFFER_AND_CONNECTION();307 308 async_exch_t *exch = async_exchange_begin(dev->sess);309 const int ret = audio_pcm_stop_record(exch);310 async_exchange_end(exch);311 return ret;312 }313 314 253 /** 315 254 * @}
Note:
See TracChangeset
for help on using the changeset viewer.