Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset eaa1c28 in mainline


Ignore:
Timestamp:
2011-12-05T17:06:46Z (10 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master
Children:
2809563
Parents:
af05429
Message:

dplay: Add wav files playback.

Location:
uspace/app/dplay
Files:
2 deleted
2 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/dplay/Makefile

    raf05429 reaa1c28  
    3737
    3838SOURCES = \
    39         beep.c \
    4039        dplay.c \
    4140        wave.c
  • uspace/app/dplay/dplay.c

    raf05429 reaa1c28  
    4444#include <sys/time.h>
    4545
    46 #include "beep.h"
     46#include <stdio.h>
     47
     48#include "wave.h"
    4749
    4850#define DEFAULT_DEVICE "/hw/pci0/00:01.0/sb16/dsp"
    4951
    5052static 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,
    5254    unsigned sampling_rate, unsigned sample_size, unsigned channels, bool sign)
    5355{
    5456        assert(device);
    55         const void* data_end = data + data_size;
    5657        const size_t half_buf = size / 2;
    5758
     
    6162        printf("Time to play half buffer: %zu us.\n", interval);
    6263        /* 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;
    6567
    6668        struct timeval time;
     
    7476        }
    7577        void *buffer_place = buffer;
    76         while (data < data_end) {
     78        while (true) {
    7779                tv_add(&time, interval); /* Next update point */
    7880                struct timeval current;
     
    8284                if (delay > 0)
    8385                        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);
    9292                }
    9393                if (buffer_place == buffer) {
     
    108108{
    109109        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:
    111116                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        }
    113123
    114124        devman_handle_t pcm_handle;
     
    156166        printf("Buffer (%u): %p %zu.\n", id, buffer, size);
    157167
    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);
    160195
    161196        munmap(buffer, size);
Note: See TracChangeset for help on using the changeset viewer.