Changeset eaa1c28 in mainline
- Timestamp:
- 2011-12-05T17:06:46Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 2809563
- Parents:
- af05429
- Location:
- uspace/app/dplay
- Files:
-
- 2 deleted
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/dplay/Makefile
raf05429 reaa1c28 37 37 38 38 SOURCES = \ 39 beep.c \40 39 dplay.c \ 41 40 wave.c -
uspace/app/dplay/dplay.c
raf05429 reaa1c28 44 44 #include <sys/time.h> 45 45 46 #include "beep.h" 46 #include <stdio.h> 47 48 #include "wave.h" 47 49 48 50 #define DEFAULT_DEVICE "/hw/pci0/00:01.0/sb16/dsp" 49 51 50 52 static void play(async_exch_t *device, unsigned buffer_id, 51 void *buffer, size_t size, const void *data, size_t data_size,53 void *buffer, size_t size, FILE *source, 52 54 unsigned sampling_rate, unsigned sample_size, unsigned channels, bool sign) 53 55 { 54 56 assert(device); 55 const void* data_end = data + data_size;56 57 const size_t half_buf = size / 2; 57 58 … … 61 62 printf("Time to play half buffer: %zu us.\n", interval); 62 63 /* Initialize buffer. */ 63 memcpy(buffer, data, size); 64 data += size; 64 const size_t bytes = fread(buffer, sizeof(uint8_t), size, source); 65 if (bytes != size) 66 return; 65 67 66 68 struct timeval time; … … 74 76 } 75 77 void *buffer_place = buffer; 76 while ( data < data_end) {78 while (true) { 77 79 tv_add(&time, interval); /* Next update point */ 78 80 struct timeval current; … … 82 84 if (delay > 0) 83 85 usleep(delay); 84 const size_t remain = data_end - data; 85 if (remain < half_buf) { 86 memcpy(buffer_place, data, remain); 87 bzero(buffer_place + remain, half_buf - remain); 88 data += remain; 89 } else { 90 memcpy(buffer_place, data, half_buf); 91 data += half_buf; 86 const size_t bytes = 87 fread(buffer, sizeof(uint8_t), half_buf, source); 88 if (bytes == 0) 89 break; 90 if (bytes < half_buf) { 91 bzero(buffer_place + bytes, half_buf - bytes); 92 92 } 93 93 if (buffer_place == buffer) { … … 108 108 { 109 109 const char *device = DEFAULT_DEVICE; 110 if (argc == 2) 110 const char *file; 111 switch (argc) { 112 case 2: 113 file = argv[1]; 114 break; 115 case 3: 111 116 device = argv[1]; 112 117 file = argv[2]; 118 break; 119 default: 120 printf("Usage: %s [device] file.\n", argv[0]); 121 return 1; 122 } 113 123 114 124 devman_handle_t pcm_handle; … … 156 166 printf("Buffer (%u): %p %zu.\n", id, buffer, size); 157 167 158 play(exch, id, buffer, size, beep, beep_size, 159 rate, sample_size, channels, sign); 168 FILE *source = fopen(file, "rb"); 169 if (source == NULL) { 170 printf("Failed to open %s.\n", file); 171 munmap(buffer, size); 172 audio_pcm_buffer_release_buffer(exch, id); 173 async_exchange_end(exch); 174 async_hangup(session); 175 return 1; 176 } 177 wave_header_t header; 178 fread(&header, sizeof(header), 1, source); 179 unsigned rate, sample_size, channels; 180 bool sign; 181 const char *error; 182 ret = wav_parse_header(&header, NULL, NULL, &rate, &sample_size, 183 &channels, &sign, &error); 184 if (ret != EOK) { 185 printf("Error parsing wav header: %s.\n", error); 186 fclose(source); 187 munmap(buffer, size); 188 audio_pcm_buffer_release_buffer(exch, id); 189 async_exchange_end(exch); 190 async_hangup(session); 191 return 1; 192 } 193 194 play(exch, id, buffer, size, source, rate, sample_size, channels, sign); 160 195 161 196 munmap(buffer, size);
Note:
See TracChangeset
for help on using the changeset viewer.